Merge "Reset $mConvRuleTitle before every language conversion run"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 7 Dec 2012 16:16:40 +0000 (16:16 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 7 Dec 2012 16:16:40 +0000 (16:16 +0000)
1258 files changed:
.gitignore
.jshintignore
.jshintrc
CREDITS
HISTORY
INSTALL
README
README.mediawiki [new symlink]
RELEASE-NOTES-1.20 [deleted file]
RELEASE-NOTES-1.21 [new file with mode: 0644]
StartProfiler.sample
UPGRADE
bin/svnstat [deleted file]
bin/ulimit-tvf.sh [deleted file]
bin/ulimit.sh [deleted file]
docs/contenthandler.txt [new file with mode: 0644]
docs/export-0.8.xsd [new file with mode: 0644]
docs/export-demo.xml
docs/hooks.txt
docs/memcached.txt
img_auth.php
includes/Action.php
includes/AjaxResponse.php
includes/Article.php
includes/AutoLoader.php
includes/Autopromote.php
includes/BacklinkCache.php [deleted file]
includes/Block.php
includes/CacheHelper.php
includes/Category.php
includes/CategoryViewer.php
includes/Categoryfinder.php
includes/Cdb.php
includes/Cdb_PHP.php
includes/ChangeTags.php
includes/ChangesList.php
includes/Collation.php
includes/ConfEditor.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/ExternalStore.php
includes/ExternalStoreDB.php
includes/ExternalUser.php
includes/FeedUtils.php
includes/FileDeleteForm.php
includes/FormOptions.php
includes/GlobalFunctions.php
includes/HTMLForm.php
includes/HistoryBlob.php
includes/Hooks.php
includes/Html.php
includes/HttpFunctions.php
includes/IP.php
includes/ImagePage.php
includes/Import.php
includes/Licenses.php
includes/LinkFilter.php
includes/Linker.php
includes/LinksUpdate.php
includes/LocalisationCache.php
includes/MagicWord.php
includes/Message.php
includes/MessageBlobStore.php
includes/MimeMagic.php
includes/Namespace.php
includes/OutputHandler.php
includes/OutputPage.php
includes/PHPVersionError.php
includes/Pager.php
includes/Preferences.php
includes/ProtectionForm.php
includes/QueryPage.php
includes/RecentChange.php
includes/Revision.php
includes/Sanitizer.php
includes/SeleniumWebSettings.php
includes/Setup.php
includes/Skin.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/StubObject.php
includes/Timestamp.php
includes/Title.php
includes/User.php
includes/UserMailer.php
includes/WebRequest.php
includes/WebResponse.php
includes/WebStart.php
includes/Wiki.php
includes/WikiFilePage.php
includes/WikiPage.php
includes/Xml.php
includes/ZhConversion.php
includes/ZipDirectoryReader.php
includes/actions/CreditsAction.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/actions/RevertAction.php
includes/actions/RollbackAction.php
includes/api/ApiBase.php
includes/api/ApiComparePages.php
includes/api/ApiDelete.php
includes/api/ApiEditPage.php
includes/api/ApiFeedContributions.php
includes/api/ApiFileRevert.php
includes/api/ApiFormatNone.php [new file with mode: 0644]
includes/api/ApiFormatYaml.php
includes/api/ApiMain.php
includes/api/ApiOpenSearch.php
includes/api/ApiOptions.php
includes/api/ApiParse.php
includes/api/ApiPurge.php
includes/api/ApiQuery.php
includes/api/ApiQueryAllCategories.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllUsers.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryExtLinksUsage.php
includes/api/ApiQueryExternalLinks.php
includes/api/ApiQueryFilearchive.php
includes/api/ApiQueryImageInfo.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryORM.php [new file with mode: 0644]
includes/api/ApiQueryProtectedTitles.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryUsers.php
includes/api/ApiUndelete.php
includes/api/ApiUpload.php
includes/api/ApiWatch.php
includes/cache/BacklinkCache.php [new file with mode: 0644]
includes/cache/CacheDependency.php
includes/cache/FileCacheBase.php
includes/cache/HTMLCacheUpdate.php
includes/cache/HTMLFileCache.php
includes/cache/LinkCache.php
includes/cache/MessageCache.php
includes/cache/ProcessCacheLRU.php
includes/cache/SquidUpdate.php
includes/conf/Conf.php [deleted file]
includes/conf/DatabaseConf.php [deleted file]
includes/conf/DefaultSettings.php [deleted file]
includes/content/AbstractContent.php [new file with mode: 0644]
includes/content/Content.php [new file with mode: 0644]
includes/content/ContentHandler.php [new file with mode: 0644]
includes/content/CssContent.php [new file with mode: 0644]
includes/content/CssContentHandler.php [new file with mode: 0644]
includes/content/JavaScriptContent.php [new file with mode: 0644]
includes/content/JavaScriptContentHandler.php [new file with mode: 0644]
includes/content/MessageContent.php [new file with mode: 0644]
includes/content/TextContent.php [new file with mode: 0644]
includes/content/TextContentHandler.php [new file with mode: 0644]
includes/content/WikitextContent.php [new file with mode: 0644]
includes/content/WikitextContentHandler.php [new file with mode: 0644]
includes/context/ContextSource.php
includes/context/DerivativeContext.php
includes/context/RequestContext.php
includes/dao/DBAccessBase.php [new file with mode: 0644]
includes/dao/IDBAccessObject.php
includes/db/CloneDatabase.php
includes/db/Database.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/IORMRow.php
includes/db/IORMTable.php
includes/db/LBFactory_Multi.php
includes/db/LoadBalancer.php
includes/db/ORMIterator.php
includes/db/ORMResult.php
includes/db/ORMRow.php
includes/db/ORMTable.php
includes/debug/Debug.php
includes/diff/DairikiDiff.php
includes/diff/DifferenceEngine.php
includes/extauth/MediaWiki.php
includes/filebackend/FSFile.php
includes/filebackend/FSFileBackend.php
includes/filebackend/FileBackend.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/FileOp.php
includes/filebackend/FileOpBatch.php
includes/filebackend/README [new file with mode: 0644]
includes/filebackend/SwiftFileBackend.php
includes/filebackend/TempFSFile.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/filejournal/FileJournal.php
includes/filebackend/lockmanager/LSLockManager.php
includes/filebackend/lockmanager/MemcLockManager.php
includes/filerepo/FSRepo.php
includes/filerepo/FileRepo.php
includes/filerepo/ForeignAPIRepo.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/README
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/UnregisteredLocalFile.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Ibm_db2Updater.php
includes/installer/Installer.i18n.php
includes/installer/Installer.php
includes/installer/MysqlUpdater.php
includes/installer/OracleInstaller.php
includes/installer/OracleUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteInstaller.php
includes/installer/SqliteUpdater.php
includes/installer/WebInstaller.php
includes/job/DoubleRedirectJob.php [deleted file]
includes/job/EmaillingJob.php [deleted file]
includes/job/EnotifNotifyJob.php [deleted file]
includes/job/Job.php
includes/job/JobQueue.php [new file with mode: 0644]
includes/job/JobQueueDB.php [new file with mode: 0644]
includes/job/JobQueueGroup.php [new file with mode: 0644]
includes/job/README [new file with mode: 0644]
includes/job/RefreshLinksJob.php [deleted file]
includes/job/UploadFromUrlJob.php [deleted file]
includes/job/jobs/DoubleRedirectJob.php [new file with mode: 0644]
includes/job/jobs/DuplicateJob.php [new file with mode: 0644]
includes/job/jobs/EmaillingJob.php [new file with mode: 0644]
includes/job/jobs/EnotifNotifyJob.php [new file with mode: 0644]
includes/job/jobs/HTMLCacheUpdateJob.php [new file with mode: 0644]
includes/job/jobs/NullJob.php [new file with mode: 0644]
includes/job/jobs/RefreshLinksJob.php [new file with mode: 0644]
includes/job/jobs/UploadFromUrlJob.php [new file with mode: 0644]
includes/json/FormatJson.php
includes/json/Services_JSON.php
includes/libs/GenericArrayObject.php
includes/libs/JavaScriptMinifier.php
includes/logging/LogEntry.php
includes/logging/LogFormatter.php
includes/logging/LogPage.php
includes/media/Bitmap.php
includes/media/BitmapMetadataHandler.php
includes/media/DjVuImage.php
includes/media/Exif.php
includes/media/FormatMetadata.php
includes/media/GIF.php
includes/media/GIFMetadataExtractor.php
includes/media/JpegMetadataExtractor.php
includes/media/MediaHandler.php
includes/media/MediaTransformOutput.php
includes/media/PNG.php
includes/media/PNGMetadataExtractor.php
includes/media/SVG.php
includes/media/SVGMetadataExtractor.php
includes/media/Tiff.php
includes/media/XMP.php
includes/media/XMPInfo.php
includes/media/XMPValidate.php
includes/mobile/DeviceDetection.php [deleted file]
includes/normal/Utf8CaseGenerate.php
includes/normal/UtfNormal.php
includes/normal/UtfNormalBench.php
includes/normal/UtfNormalDefines.php
includes/normal/UtfNormalGenerate.php
includes/objectcache/EhcacheBagOStuff.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/RedisBagOStuff.php
includes/parser/CoreTagHooks.php
includes/parser/DateFormatter.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/parser/ParserOutput.php
includes/parser/Parser_LinkHooks.php
includes/parser/Preprocessor_DOM.php
includes/parser/Preprocessor_Hash.php
includes/parser/Preprocessor_HipHop.hphp
includes/parser/StripState.php
includes/parser/Tidy.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderNoscriptModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevisionDeleteAbstracts.php
includes/search/SearchEngine.php
includes/search/SearchIBM_DB2.php
includes/search/SearchMssql.php
includes/search/SearchOracle.php
includes/site/MediaWikiSite.php [new file with mode: 0644]
includes/site/Site.php [new file with mode: 0644]
includes/site/SiteArray.php [new file with mode: 0644]
includes/site/SiteList.php [new file with mode: 0644]
includes/site/SiteObject.php [new file with mode: 0644]
includes/site/Sites.php [new file with mode: 0644]
includes/site/SitesTable.php [new file with mode: 0644]
includes/specials/SpecialActiveusers.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialCachedPage.php
includes/specials/SpecialChangeEmail.php
includes/specials/SpecialChangePassword.php
includes/specials/SpecialComparePages.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialExport.php
includes/specials/SpecialJavaScriptTest.php
includes/specials/SpecialLinkSearch.php
includes/specials/SpecialListfiles.php
includes/specials/SpecialListusers.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialNewpages.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRecentchangeslinked.php
includes/specials/SpecialRevisiondelete.php
includes/specials/SpecialSearch.php
includes/specials/SpecialSpecialpages.php
includes/specials/SpecialUnblock.php
includes/specials/SpecialUncategorizedcategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUploadStash.php
includes/specials/SpecialUserlogin.php
includes/specials/SpecialUserlogout.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWantedfiles.php
includes/specials/SpecialWantedpages.php
includes/specials/SpecialWatchlist.php
includes/templates/Usercreate.php
includes/templates/Userlogin.php
includes/tidy.conf
includes/upload/AssembleUploadChunks.php [new file with mode: 0644]
includes/upload/UploadBase.php
includes/upload/UploadFromChunks.php
includes/upload/UploadFromFile.php
includes/upload/UploadFromStash.php
includes/upload/UploadFromUrl.php
includes/upload/UploadStash.php
includes/zhtable/Makefile.py
languages/Language.php
languages/LanguageConverter.php
languages/Names.php
languages/classes/LanguageEo.php
languages/classes/LanguageFi.php
languages/classes/LanguageGan.php
languages/classes/LanguageHe.php
languages/classes/LanguageIu.php
languages/classes/LanguageKk.php
languages/classes/LanguageKu.php
languages/classes/LanguageQqx.php
languages/classes/LanguageShi.php
languages/classes/LanguageSr.php
languages/classes/LanguageUz.php
languages/classes/LanguageZh.php
languages/data/plurals-mediawiki.xml
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/MessagesAnp.php
languages/messages/MessagesAr.php
languages/messages/MessagesArc.php
languages/messages/MessagesArn.php
languages/messages/MessagesAry.php
languages/messages/MessagesArz.php
languages/messages/MessagesAs.php
languages/messages/MessagesAst.php
languages/messages/MessagesAv.php
languages/messages/MessagesAvk.php
languages/messages/MessagesAy.php
languages/messages/MessagesAz.php
languages/messages/MessagesAzb.php [new file with mode: 0644]
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/MessagesBh.php
languages/messages/MessagesBho.php
languages/messages/MessagesBi.php
languages/messages/MessagesBjn.php
languages/messages/MessagesBm.php
languages/messages/MessagesBn.php
languages/messages/MessagesBo.php
languages/messages/MessagesBpy.php
languages/messages/MessagesBqi.php
languages/messages/MessagesBr.php
languages/messages/MessagesBrh.php
languages/messages/MessagesBs.php
languages/messages/MessagesBug.php
languages/messages/MessagesCa.php
languages/messages/MessagesCbk_zam.php
languages/messages/MessagesCdo.php
languages/messages/MessagesCe.php
languages/messages/MessagesCeb.php
languages/messages/MessagesCh.php
languages/messages/MessagesChr.php
languages/messages/MessagesCkb.php
languages/messages/MessagesCo.php
languages/messages/MessagesCps.php
languages/messages/MessagesCrh_cyrl.php
languages/messages/MessagesCrh_latn.php
languages/messages/MessagesCs.php
languages/messages/MessagesCsb.php
languages/messages/MessagesCu.php
languages/messages/MessagesCv.php
languages/messages/MessagesCy.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDe_ch.php
languages/messages/MessagesDe_formal.php
languages/messages/MessagesDiq.php
languages/messages/MessagesDsb.php
languages/messages/MessagesDtp.php
languages/messages/MessagesDv.php
languages/messages/MessagesDz.php
languages/messages/MessagesEe.php
languages/messages/MessagesEl.php
languages/messages/MessagesEml.php
languages/messages/MessagesEn.php
languages/messages/MessagesEn_gb.php
languages/messages/MessagesEo.php
languages/messages/MessagesEs.php
languages/messages/MessagesEt.php
languages/messages/MessagesEu.php
languages/messages/MessagesExt.php
languages/messages/MessagesFa.php
languages/messages/MessagesFf.php
languages/messages/MessagesFi.php
languages/messages/MessagesFit.php
languages/messages/MessagesFj.php
languages/messages/MessagesFo.php
languages/messages/MessagesFr.php
languages/messages/MessagesFrc.php
languages/messages/MessagesFrp.php
languages/messages/MessagesFrr.php
languages/messages/MessagesFur.php
languages/messages/MessagesFy.php
languages/messages/MessagesGa.php
languages/messages/MessagesGag.php
languages/messages/MessagesGan_hans.php
languages/messages/MessagesGan_hant.php
languages/messages/MessagesGd.php
languages/messages/MessagesGl.php
languages/messages/MessagesGlk.php
languages/messages/MessagesGn.php
languages/messages/MessagesGrc.php
languages/messages/MessagesGsw.php
languages/messages/MessagesGu.php
languages/messages/MessagesGv.php
languages/messages/MessagesHa.php
languages/messages/MessagesHak.php
languages/messages/MessagesHaw.php
languages/messages/MessagesHe.php
languages/messages/MessagesHi.php
languages/messages/MessagesHif_latn.php
languages/messages/MessagesHil.php
languages/messages/MessagesHr.php
languages/messages/MessagesHsb.php
languages/messages/MessagesHt.php
languages/messages/MessagesHu.php
languages/messages/MessagesHy.php
languages/messages/MessagesIa.php
languages/messages/MessagesId.php
languages/messages/MessagesIe.php
languages/messages/MessagesIg.php
languages/messages/MessagesIke_cans.php
languages/messages/MessagesIke_latn.php
languages/messages/MessagesIlo.php
languages/messages/MessagesInh.php
languages/messages/MessagesIo.php
languages/messages/MessagesIs.php
languages/messages/MessagesIt.php
languages/messages/MessagesJa.php
languages/messages/MessagesJam.php
languages/messages/MessagesJbo.php
languages/messages/MessagesJut.php
languages/messages/MessagesJv.php
languages/messages/MessagesKa.php
languages/messages/MessagesKaa.php
languages/messages/MessagesKab.php
languages/messages/MessagesKbd_cyrl.php
languages/messages/MessagesKg.php
languages/messages/MessagesKhw.php
languages/messages/MessagesKiu.php
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKk_cyrl.php
languages/messages/MessagesKk_latn.php
languages/messages/MessagesKl.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKo.php
languages/messages/MessagesKoi.php
languages/messages/MessagesKrc.php
languages/messages/MessagesKri.php
languages/messages/MessagesKrj.php
languages/messages/MessagesKs_arab.php
languages/messages/MessagesKsh.php
languages/messages/MessagesKu_arab.php
languages/messages/MessagesKu_latn.php
languages/messages/MessagesKv.php
languages/messages/MessagesKw.php
languages/messages/MessagesKy.php
languages/messages/MessagesLa.php
languages/messages/MessagesLad.php
languages/messages/MessagesLb.php
languages/messages/MessagesLbe.php
languages/messages/MessagesLez.php
languages/messages/MessagesLfn.php
languages/messages/MessagesLg.php
languages/messages/MessagesLi.php
languages/messages/MessagesLij.php
languages/messages/MessagesLiv.php
languages/messages/MessagesLmo.php
languages/messages/MessagesLn.php
languages/messages/MessagesLo.php
languages/messages/MessagesLoz.php
languages/messages/MessagesLt.php
languages/messages/MessagesLtg.php
languages/messages/MessagesLus.php
languages/messages/MessagesLv.php
languages/messages/MessagesLzh.php
languages/messages/MessagesLzz.php
languages/messages/MessagesMai.php
languages/messages/MessagesMap_bms.php
languages/messages/MessagesMdf.php
languages/messages/MessagesMg.php
languages/messages/MessagesMhr.php
languages/messages/MessagesMi.php
languages/messages/MessagesMin.php
languages/messages/MessagesMk.php
languages/messages/MessagesMl.php
languages/messages/MessagesMn.php
languages/messages/MessagesMo.php
languages/messages/MessagesMr.php
languages/messages/MessagesMrj.php
languages/messages/MessagesMs.php
languages/messages/MessagesMt.php
languages/messages/MessagesMwl.php
languages/messages/MessagesMy.php
languages/messages/MessagesMyv.php
languages/messages/MessagesMzn.php
languages/messages/MessagesNa.php
languages/messages/MessagesNah.php
languages/messages/MessagesNan.php
languages/messages/MessagesNap.php
languages/messages/MessagesNb.php
languages/messages/MessagesNds.php
languages/messages/MessagesNds_nl.php
languages/messages/MessagesNe.php
languages/messages/MessagesNew.php
languages/messages/MessagesNiu.php
languages/messages/MessagesNl.php
languages/messages/MessagesNl_informal.php
languages/messages/MessagesNn.php
languages/messages/MessagesNov.php
languages/messages/MessagesNso.php
languages/messages/MessagesNv.php
languages/messages/MessagesOc.php
languages/messages/MessagesOm.php
languages/messages/MessagesOr.php
languages/messages/MessagesOs.php
languages/messages/MessagesPa.php
languages/messages/MessagesPag.php
languages/messages/MessagesPam.php
languages/messages/MessagesPap.php
languages/messages/MessagesPcd.php
languages/messages/MessagesPdc.php
languages/messages/MessagesPdt.php
languages/messages/MessagesPfl.php
languages/messages/MessagesPih.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPnb.php
languages/messages/MessagesPnt.php
languages/messages/MessagesPrg.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesQu.php
languages/messages/MessagesQug.php
languages/messages/MessagesRgn.php
languages/messages/MessagesRif.php
languages/messages/MessagesRm.php
languages/messages/MessagesRmy.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesRue.php
languages/messages/MessagesRup.php
languages/messages/MessagesRuq_cyrl.php
languages/messages/MessagesRuq_latn.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/MessagesSg.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/MessagesSm.php
languages/messages/MessagesSma.php
languages/messages/MessagesSn.php
languages/messages/MessagesSo.php
languages/messages/MessagesSq.php
languages/messages/MessagesSr_ec.php
languages/messages/MessagesSr_el.php
languages/messages/MessagesSrn.php
languages/messages/MessagesSs.php
languages/messages/MessagesSt.php
languages/messages/MessagesStq.php
languages/messages/MessagesSu.php
languages/messages/MessagesSv.php
languages/messages/MessagesSw.php
languages/messages/MessagesSzl.php
languages/messages/MessagesTa.php
languages/messages/MessagesTcy.php
languages/messages/MessagesTe.php
languages/messages/MessagesTet.php
languages/messages/MessagesTg_cyrl.php
languages/messages/MessagesTg_latn.php
languages/messages/MessagesTh.php
languages/messages/MessagesTi.php
languages/messages/MessagesTk.php
languages/messages/MessagesTl.php
languages/messages/MessagesTly.php
languages/messages/MessagesTn.php
languages/messages/MessagesTo.php
languages/messages/MessagesTokipona.php
languages/messages/MessagesTpi.php
languages/messages/MessagesTr.php
languages/messages/MessagesTru.php
languages/messages/MessagesTs.php
languages/messages/MessagesTt_cyrl.php
languages/messages/MessagesTt_latn.php
languages/messages/MessagesTy.php
languages/messages/MessagesTyv.php
languages/messages/MessagesUdm.php
languages/messages/MessagesUg_arab.php
languages/messages/MessagesUg_latn.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/MessagesVls.php
languages/messages/MessagesVmf.php
languages/messages/MessagesVo.php
languages/messages/MessagesVot.php
languages/messages/MessagesVro.php
languages/messages/MessagesWa.php
languages/messages/MessagesWar.php
languages/messages/MessagesWo.php
languages/messages/MessagesWuu.php
languages/messages/MessagesXal.php
languages/messages/MessagesXh.php
languages/messages/MessagesXmf.php
languages/messages/MessagesYi.php
languages/messages/MessagesYo.php
languages/messages/MessagesYue.php
languages/messages/MessagesZa.php
languages/messages/MessagesZea.php
languages/messages/MessagesZh_hans.php
languages/messages/MessagesZh_hant.php
languages/messages/MessagesZh_hk.php
languages/messages/MessagesZh_tw.php
languages/messages/MessagesZu.php
languages/utils/CLDRPluralRuleEvaluator.php
maintenance/Doxyfile
maintenance/Maintenance.php
maintenance/README
maintenance/archives/patch-archive-ar_content_format.sql [new file with mode: 0644]
maintenance/archives/patch-archive-ar_content_model.sql [new file with mode: 0644]
maintenance/archives/patch-archive-user-index.sql
maintenance/archives/patch-backlinkindexes.sql
maintenance/archives/patch-category.sql
maintenance/archives/patch-categorylinks.sql
maintenance/archives/patch-categorylinksindex.sql
maintenance/archives/patch-config.sql [deleted file]
maintenance/archives/patch-drop-ss_admins.sql [new file with mode: 0644]
maintenance/archives/patch-externallinks.sql
maintenance/archives/patch-fa_deleted.sql
maintenance/archives/patch-fa_sha1.sql [new file with mode: 0644]
maintenance/archives/patch-filearchive-user-index.sql
maintenance/archives/patch-filearchive.sql
maintenance/archives/patch-hitcounter.sql
maintenance/archives/patch-image-user-index.sql
maintenance/archives/patch-img_media_type.sql
maintenance/archives/patch-img_sha1.sql
maintenance/archives/patch-indexes.sql
maintenance/archives/patch-interwiki.sql
maintenance/archives/patch-ipb_anon_only.sql
maintenance/archives/patch-ipb_by_text.sql
maintenance/archives/patch-ipb_deleted.sql
maintenance/archives/patch-ipb_range_start.sql
maintenance/archives/patch-iwlinks.sql
maintenance/archives/patch-job.sql
maintenance/archives/patch-job_attempts.sql [new file with mode: 0644]
maintenance/archives/patch-job_token.sql [new file with mode: 0644]
maintenance/archives/patch-langlinks.sql
maintenance/archives/patch-linktables.sql
maintenance/archives/patch-log_search-rename-index.sql
maintenance/archives/patch-log_user_text.sql
maintenance/archives/patch-logging-times-index.sql
maintenance/archives/patch-logging.sql
maintenance/archives/patch-mime_minor_length.sql
maintenance/archives/patch-msg_resource.sql
maintenance/archives/patch-oi_metadata.sql
maintenance/archives/patch-oldimage-user-index.sql
maintenance/archives/patch-page-page_content_model.sql [new file with mode: 0644]
maintenance/archives/patch-pagelinks.sql
maintenance/archives/patch-parsercache.sql
maintenance/archives/patch-pl-tl-il-unique.sql
maintenance/archives/patch-querycache.sql
maintenance/archives/patch-querycachetwo.sql
maintenance/archives/patch-rc_deleted.sql
maintenance/archives/patch-rc_id.sql
maintenance/archives/patch-rc_ip.sql
maintenance/archives/patch-rc_moved.sql [new file with mode: 0644]
maintenance/archives/patch-redirect.sql
maintenance/archives/patch-rename-iwl_prefix.sql
maintenance/archives/patch-restructure.sql
maintenance/archives/patch-revision-rev_content_format.sql [new file with mode: 0644]
maintenance/archives/patch-revision-rev_content_model.sql [new file with mode: 0644]
maintenance/archives/patch-searchindex.sql
maintenance/archives/patch-sites.sql [new file with mode: 0644]
maintenance/archives/patch-templatelinks.sql
maintenance/archives/patch-testrun.sql
maintenance/archives/patch-uploadstash-us_props.sql [new file with mode: 0644]
maintenance/archives/patch-uploadstash.sql
maintenance/archives/patch-user-realname.sql
maintenance/archives/patch-user_former_groups.sql
maintenance/archives/patch-user_groups.sql
maintenance/archives/patch-user_properties.sql
maintenance/archives/patch-user_rights.sql
maintenance/archives/upgradeLogging.php
maintenance/backupTextPass.inc
maintenance/checkAutoLoader.php [deleted file]
maintenance/checkBadRedirects.php
maintenance/cleanupPreferences.php [changed mode: 0755->0644]
maintenance/cleanupSpam.php
maintenance/cleanupUploadStash.php
maintenance/compareParsers.php
maintenance/convertUserOptions.php
maintenance/cssjanus/README
maintenance/cssjanus/cssjanus.py [changed mode: 0755->0644]
maintenance/cssjanus/csslex.py [changed mode: 0755->0644]
maintenance/deleteArchivedFiles.inc
maintenance/deleteOldRevisions.php
maintenance/deleteOrphanedRevisions.php
maintenance/dumpIterator.php
maintenance/edit.php
maintenance/eval.php
maintenance/findHooks.php
maintenance/fixDoubleRedirects.php
maintenance/generateSitemap.php
maintenance/getText.php
maintenance/hiphop/make [changed mode: 0755->0644]
maintenance/hiphop/run-server [changed mode: 0755->0644]
maintenance/ibm_db2/patch-categorylinks-better-collation.sql
maintenance/ibm_db2/patch-user_properties.sql
maintenance/ibm_db2/tables.sql
maintenance/importDump.php
maintenance/importImages.php
maintenance/importSiteScripts.php
maintenance/importTextFile.php
maintenance/install.php
maintenance/jsparse.php
maintenance/language/StatOutputs.php
maintenance/language/checkLanguage.inc
maintenance/language/generateCollationData.php
maintenance/language/generateNormalizerData.php
maintenance/language/messageTypes.inc
maintenance/language/messages.inc
maintenance/locking/LockServerDaemon.php
maintenance/minify.php
maintenance/mssql/tables.sql
maintenance/mwdocgen.php
maintenance/nextJobDB.php
maintenance/oracle/archives/patch-archive-ar_content_format.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-archive-ar_content_model.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-cat_hidden.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-config.sql [deleted file]
maintenance/oracle/archives/patch-page-page_content_model.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-rc_moved.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-revision-rev_content_format.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-revision-rev_content_model.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-ss_admins.sql [new file with mode: 0644]
maintenance/oracle/archives/patch-testrun.sql
maintenance/oracle/tables.sql
maintenance/populateFilearchiveSha1.php [new file with mode: 0644]
maintenance/populateRevisionLength.php
maintenance/populateRevisionSha1.php
maintenance/postgres/archives/patch-config.sql [deleted file]
maintenance/postgres/archives/patch-ipb_address_unique.sql [deleted file]
maintenance/postgres/archives/patch-testrun.sql
maintenance/postgres/tables.sql
maintenance/preprocessDump.php
maintenance/preprocessorFuzzTest.php
maintenance/protect.php
maintenance/purgeParserCache.php
maintenance/rebuildrecentchanges.php
maintenance/refreshFileHeaders.php [new file with mode: 0644]
maintenance/refreshLinks.php
maintenance/renderDump.php
maintenance/runJobs.php
maintenance/sql.php
maintenance/sqlite.inc
maintenance/sqlite/archives/patch-drop-ss_admins.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-job_token.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-profiling.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-rc_moved.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-rename-iwl_prefix.sql
maintenance/sqlite/archives/patch-sites.sql [new file with mode: 0644]
maintenance/sqlite/archives/searchindex-fts3.sql
maintenance/sqlite/archives/searchindex-no-fts.sql
maintenance/storage/checkStorage.php
maintenance/storage/drop_content_model_info.sql [new file with mode: 0644]
maintenance/storage/fixBug20757.php
maintenance/storage/make-blobs [changed mode: 0755->0644]
maintenance/storage/recompressTracked.php
maintenance/storage/testCompression.php
maintenance/storage/trackBlobs.php
maintenance/syncFileBackend.php
maintenance/tables.sql
maintenance/term/MWTerm.php
maintenance/update.php
maintenance/updateCollation.php
maintenance/updateSearchIndex.php
maintenance/updateSpecialPages.php
mw-config/index.php
mw-config/index.php5
mw-config/overrides.php
opensearch_desc.php5
profileinfo.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.ui/i18n/jquery.ui.datepicker-zh-CN.js
resources/jquery.ui/i18n/jquery.ui.datepicker-zh-HK.js
resources/jquery.ui/i18n/jquery.ui.datepicker-zh-TW.js
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/jquery.autoEllipsis.js
resources/jquery/jquery.badge.css
resources/jquery/jquery.badge.js
resources/jquery/jquery.byteLimit.js
resources/jquery/jquery.checkboxShiftClick.js
resources/jquery/jquery.client.js
resources/jquery/jquery.collapsibleTabs.js
resources/jquery/jquery.colorUtil.js
resources/jquery/jquery.expandableField.js
resources/jquery/jquery.hidpi.js [new file with mode: 0644]
resources/jquery/jquery.highlightText.js
resources/jquery/jquery.js
resources/jquery/jquery.makeCollapsible.js
resources/jquery/jquery.mw-jump.js
resources/jquery/jquery.mwExtension.js
resources/jquery/jquery.qunit.completenessTest.js
resources/jquery/jquery.suggestions.css
resources/jquery/jquery.suggestions.js
resources/jquery/jquery.tablesorter.js
resources/jquery/jquery.textSelection.js
resources/mediawiki.action/mediawiki.action.edit.js
resources/mediawiki.action/mediawiki.action.edit.preview.js [new file with mode: 0644]
resources/mediawiki.action/mediawiki.action.history.diff.css
resources/mediawiki.api/mediawiki.api.watch.js
resources/mediawiki.language/languages/bs.js
resources/mediawiki.language/languages/dsb.js
resources/mediawiki.language/languages/fi.js
resources/mediawiki.language/languages/ga.js
resources/mediawiki.language/languages/he.js
resources/mediawiki.language/languages/hsb.js
resources/mediawiki.language/languages/hu.js
resources/mediawiki.language/languages/hy.js
resources/mediawiki.language/languages/la.js
resources/mediawiki.language/languages/os.js
resources/mediawiki.language/languages/ru.js
resources/mediawiki.language/languages/sl.js
resources/mediawiki.language/languages/uk.js
resources/mediawiki.language/mediawiki.cldr.js
resources/mediawiki.language/mediawiki.language.init.js
resources/mediawiki.language/mediawiki.language.js
resources/mediawiki.page/mediawiki.page.patrol.ajax.js [new file with mode: 0644]
resources/mediawiki.page/mediawiki.page.ready.js
resources/mediawiki.page/mediawiki.page.watch.ajax.js
resources/mediawiki.special/mediawiki.special.block.js
resources/mediawiki.special/mediawiki.special.changeslist.css
resources/mediawiki.special/mediawiki.special.javaScriptTest.js
resources/mediawiki.special/mediawiki.special.js
resources/mediawiki.special/mediawiki.special.movePage.js
resources/mediawiki.special/mediawiki.special.preferences.js
resources/mediawiki.special/mediawiki.special.recentchanges.js
resources/mediawiki.special/mediawiki.special.search.js
resources/mediawiki.special/mediawiki.special.undelete.js
resources/mediawiki.special/mediawiki.special.upload.js
resources/mediawiki/mediawiki.Title.js
resources/mediawiki/mediawiki.Uri.js
resources/mediawiki/mediawiki.feedback.js
resources/mediawiki/mediawiki.hidpi.js [new file with mode: 0644]
resources/mediawiki/mediawiki.htmlform.js
resources/mediawiki/mediawiki.jqueryMsg.js
resources/mediawiki/mediawiki.js
resources/mediawiki/mediawiki.notification.js
resources/mediawiki/mediawiki.searchSuggest.js [new file with mode: 0644]
resources/mediawiki/mediawiki.util.js
resources/startup.js
serialized/serialize.php
skins/CologneBlue.php
skins/Modern.php
skins/MonoBook.php
skins/Standard.php
skins/Vector.php
skins/cologneblue/screen.css
skins/common/commonContent.css
skins/common/commonElements.css
skins/common/commonInterface.css
skins/common/config.css
skins/common/images/icons/fileicon-psd.png [new file with mode: 0644]
skins/common/mwsuggest.js [deleted file]
skins/common/preview.js [deleted file]
skins/common/shared.css
skins/common/wikibits.js
skins/modern/main.css
skins/monobook/main.css
skins/simple/main.css
skins/vector/screen.css
skins/vector/vector.js
tests/TestsAutoLoader.php
tests/jasmine/.htaccess [deleted file]
tests/jasmine/SpecRunner.html [deleted file]
tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE [deleted file]
tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js [deleted file]
tests/jasmine/lib/jasmine-1.0.1/jasmine.css [deleted file]
tests/jasmine/lib/jasmine-1.0.1/jasmine.js [deleted file]
tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js [deleted file]
tests/jasmine/spec/mediawiki.jqueryMsg.spec.js [deleted file]
tests/jasmine/spec_makers/makeJqueryMsgSpec.php [deleted file]
tests/parser/parserTest.inc
tests/parser/parserTests.txt
tests/parser/parserTestsParserHook.php
tests/parserTests.php
tests/phpunit/AutoLoaderTest.php [new file with mode: 0644]
tests/phpunit/MediaWikiLangTestCase.php
tests/phpunit/MediaWikiPHPUnitCommand.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/db/sqlite/tables-1.18.sql
tests/phpunit/docs/ExportDemoTest.php
tests/phpunit/includes/ArticleTablesTest.php
tests/phpunit/includes/ArticleTest.php
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CdbTest.php
tests/phpunit/includes/DiffHistoryBlobTest.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/ExternalStoreTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/FauxResponseTest.php
tests/phpunit/includes/FormOptionsInitializationTest.php
tests/phpunit/includes/FormOptionsTest.php
tests/phpunit/includes/GlobalFunctions/GlobalTest.php
tests/phpunit/includes/GlobalFunctions/wfAssembleUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
tests/phpunit/includes/GlobalFunctions/wfExpandUrlTest.php
tests/phpunit/includes/GlobalFunctions/wfRemoveDotSegmentsTest.php
tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
tests/phpunit/includes/HooksTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/HttpTest.php
tests/phpunit/includes/IPTest.php
tests/phpunit/includes/JsonTest.php
tests/phpunit/includes/LanguageConverterTest.php
tests/phpunit/includes/LinkerTest.php [new file with mode: 0644]
tests/phpunit/includes/LinksUpdateTest.php
tests/phpunit/includes/LocalFileTest.php
tests/phpunit/includes/MWFunctionTest.php
tests/phpunit/includes/MWNamespaceTest.php
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/ParserOptionsTest.php
tests/phpunit/includes/PathRouterTest.php
tests/phpunit/includes/PreferencesTest.php
tests/phpunit/includes/RecentChangeTest.php
tests/phpunit/includes/RequestContextTest.php [new file with mode: 0644]
tests/phpunit/includes/ResourceLoaderTest.php
tests/phpunit/includes/RevisionStorageTest.php
tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php [new file with mode: 0644]
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/SampleTest.php
tests/phpunit/includes/SanitizerTest.php
tests/phpunit/includes/SeleniumConfigurationTest.php
tests/phpunit/includes/SiteConfigurationTest.php
tests/phpunit/includes/TemplateCategoriesTest.php
tests/phpunit/includes/TimeAdjustTest.php
tests/phpunit/includes/TimestampTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/TitlePermissionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/UserTest.php
tests/phpunit/includes/WebRequestTest.php
tests/phpunit/includes/WikiPageTest.php
tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php [new file with mode: 0644]
tests/phpunit/includes/XmlSelectTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/ZipDirectoryReaderTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiGeneratorTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiPurgeTest.php
tests/phpunit/includes/api/ApiQueryRevisionsTest.php [new file with mode: 0644]
tests/phpunit/includes/api/ApiQueryTest.php
tests/phpunit/includes/api/ApiTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiTestCaseUpload.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/cache/ProcessCacheLRUTest.php
tests/phpunit/includes/content/ContentHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/content/CssContentTest.php [new file with mode: 0644]
tests/phpunit/includes/content/JavaScriptContentTest.php [new file with mode: 0644]
tests/phpunit/includes/content/TextContentTest.php [new file with mode: 0644]
tests/phpunit/includes/content/WikitextContentHandlerTest.php [new file with mode: 0644]
tests/phpunit/includes/content/WikitextContentTest.php [new file with mode: 0644]
tests/phpunit/includes/db/DatabaseSQLTest.php
tests/phpunit/includes/db/DatabaseSqliteTest.php
tests/phpunit/includes/db/DatabaseTest.php
tests/phpunit/includes/db/ORMRowTest.php
tests/phpunit/includes/db/ORMTableTest.php [new file with mode: 0644]
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/debug/MWDebugTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php [new file with mode: 0644]
tests/phpunit/includes/filerepo/FileBackendTest.php [deleted file]
tests/phpunit/includes/filerepo/StoreBatchTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/GenericArrayObjectTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/BitmapScalingTest.php
tests/phpunit/includes/media/ExifBitmapTest.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/media/XMPValidateTest.php
tests/phpunit/includes/mobile/DeviceDetectionTest.php [deleted file]
tests/phpunit/includes/parser/MagicVariableTest.php
tests/phpunit/includes/parser/NewParserTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/ParserOutputTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/ParserPreloadTest.php
tests/phpunit/includes/parser/PreprocessorTest.php
tests/phpunit/includes/parser/TagHooksTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/search/SearchUpdateTest.php
tests/phpunit/includes/site/MediaWikiSiteTest.php [new file with mode: 0644]
tests/phpunit/includes/site/SiteArrayTest.php [new file with mode: 0644]
tests/phpunit/includes/site/SiteListTest.php [new file with mode: 0644]
tests/phpunit/includes/site/SiteObjectTest.php [new file with mode: 0644]
tests/phpunit/includes/site/SitesTest.php [new file with mode: 0644]
tests/phpunit/includes/site/TestSites.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/upload/UploadFromUrlTest.php
tests/phpunit/includes/upload/UploadStashTest.php
tests/phpunit/includes/upload/UploadTest.php
tests/phpunit/languages/LanguageAmTest.php
tests/phpunit/languages/LanguageArTest.php
tests/phpunit/languages/LanguageBeTest.php
tests/phpunit/languages/LanguageBe_taraskTest.php
tests/phpunit/languages/LanguageBhTest.php
tests/phpunit/languages/LanguageBsTest.php
tests/phpunit/languages/LanguageClassesTestCase.php [new file with mode: 0644]
tests/phpunit/languages/LanguageCsTest.php
tests/phpunit/languages/LanguageCuTest.php
tests/phpunit/languages/LanguageCyTest.php
tests/phpunit/languages/LanguageDsbTest.php
tests/phpunit/languages/LanguageFrTest.php
tests/phpunit/languages/LanguageGaTest.php
tests/phpunit/languages/LanguageGdTest.php
tests/phpunit/languages/LanguageGvTest.php
tests/phpunit/languages/LanguageHeTest.php
tests/phpunit/languages/LanguageHiTest.php
tests/phpunit/languages/LanguageHrTest.php
tests/phpunit/languages/LanguageHsbTest.php
tests/phpunit/languages/LanguageHuTest.php
tests/phpunit/languages/LanguageHyTest.php
tests/phpunit/languages/LanguageKshTest.php
tests/phpunit/languages/LanguageLnTest.php
tests/phpunit/languages/LanguageLtTest.php
tests/phpunit/languages/LanguageLvTest.php
tests/phpunit/languages/LanguageMgTest.php
tests/phpunit/languages/LanguageMkTest.php
tests/phpunit/languages/LanguageMlTest.php
tests/phpunit/languages/LanguageMoTest.php
tests/phpunit/languages/LanguageMtTest.php
tests/phpunit/languages/LanguageNlTest.php
tests/phpunit/languages/LanguageNsoTest.php
tests/phpunit/languages/LanguagePlTest.php
tests/phpunit/languages/LanguageRoTest.php
tests/phpunit/languages/LanguageRuTest.php
tests/phpunit/languages/LanguageSeTest.php
tests/phpunit/languages/LanguageSgsTest.php
tests/phpunit/languages/LanguageShTest.php
tests/phpunit/languages/LanguageSkTest.php
tests/phpunit/languages/LanguageSlTest.php
tests/phpunit/languages/LanguageSmaTest.php
tests/phpunit/languages/LanguageSrTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/languages/LanguageTiTest.php
tests/phpunit/languages/LanguageTlTest.php
tests/phpunit/languages/LanguageTrTest.php
tests/phpunit/languages/LanguageUkTest.php
tests/phpunit/languages/LanguageUzTest.php
tests/phpunit/languages/LanguageWaTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/maintenance/backupPrefetchTest.php
tests/phpunit/maintenance/backupTextPassTest.php
tests/phpunit/maintenance/backup_PageTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/phpunit/resources/ResourcesTest.php [new file with mode: 0644]
tests/phpunit/skins/SideBarTest.php
tests/phpunit/suites/UploadFromUrlTestSuite.php
tests/qunit/QUnitTestResources.php
tests/qunit/data/callMwLoaderTestCallback.js
tests/qunit/data/generateJqueryMsgData.php [new file with mode: 0644]
tests/qunit/data/mediawiki.jqueryMsg.data.js [new file with mode: 0644]
tests/qunit/data/styleTest.css.php
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.hidpi.test.js [new file with mode: 0644]
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
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
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
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/testHelpers.inc
thumb.php
thumb.php5

index d3c56bc..a47a454 100644 (file)
@@ -11,12 +11,14 @@ cscope.out
 ## NetBeans
 nbproject*
 project.index
+sublime-*
 
 # MediaWiki install & usage
 cache
 images/[0-9a-f]
 images/archive
 images/deleted
+images/lockdir
 images/temp
 images/thumb
 ## Extension:EasyTimeline
@@ -29,11 +31,14 @@ AdminSettings.php
 LocalSettings.php
 StartProfiler.php
 
+# Building & testing
+node_modules/
+
 # Operating systems
 ## Mac OS X
 .DS_Store
 ## Windows
-thumbs.db
+Thumbs.db
 
 # Misc
 .buildpath
index 026eaaa..3869deb 100644 (file)
@@ -1,4 +1,6 @@
-# upstream libs
+# third-party libs
+extensions/
+node_modules/
 resources/jquery/jquery.appear.js
 resources/jquery/jquery.async.js
 resources/jquery/jquery.cycle.all.js
@@ -13,9 +15,13 @@ 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
-tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
-tests/jasmine/lib/jasmine-1.0.1/jasmine.js
+resources/jquery.effects/
+resources/jquery.tipsy/
+resources/jquery.ui/
+resources/mediawiki.libs/
+
+# legacy scripts
+skins/common/
+
+# github.com/jshint/jshint/issues/729
+tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
index b86ceb5..7fa138d 100644 (file)
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,20 +1,25 @@
 {
        "predef": [
                "mediaWiki",
+               "jQuery",
                "QUnit"
        ],
 
        "bitwise": true,
+       "camelcase": true,
        "curly": true,
        "eqeqeq": true,
+       "forin": false,
        "immed": true,
        "latedef": true,
        "newcap": true,
        "noarg": true,
        "noempty": true,
        "nonew": true,
+       "quotmark": "single",
        "regexp": false,
        "undef": true,
+       "unused": true,
        "strict": false,
        "trailing": true,
 
@@ -23,7 +28,6 @@
        "multistr": true,
 
        "browser": true,
-       "jquery": true,
 
        "nomen": true,
        "onevar": true
diff --git a/CREDITS b/CREDITS
index 5ceccc5..6555b07 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1,7 +1,8 @@
-MediaWiki 1.20 is a collaborative project released under the
+MediaWiki 1.21 is a collaborative project released under the
 GNU General Public License v2. We would like to recognize the
 following names for their contribution to the product.
 
+<!-- Please notice that the following can be found parsed under Special:Version/Credits -->
 == Developers ==
 * Aaron Schulz
 * Alex Z.
@@ -44,6 +45,7 @@ following names for their contribution to the product.
 * Leon Weber
 * Leslie Hoare
 * Marco Schuster
+* Marius Hoch
 * Matěj Grabovský
 * Matt Johnston
 * Max Semenik
@@ -206,4 +208,4 @@ following names for their contribution to the product.
 * Meno25
 * Rotem Liss
 * Shinjiman
-* Translatewiki.net Translators https://translatewiki.net/wiki/Special:ListUsers/translator
+* [https://translatewiki.net/wiki/Special:ListUsers/translator Translatewiki.net Translators]
diff --git a/HISTORY b/HISTORY
index 408ae38..8d232f3 100644 (file)
--- a/HISTORY
+++ b/HISTORY
-Change notes from older releases. For current info see RELEASE-NOTES-1.20.
+Change notes from older releases. For current info see RELEASE-NOTES-1.21.
+
+== MediaWiki 1.20 ==
+
+=== PHP 5.3 now required ===
+Since 1.20, the lowest supported version of PHP is now 5.3.2. Please
+upgrade PHP if you have not done so prior to upgrading MediaWiki.
+
+=== Configuration changes in 1.20 ===
+* $wgGitRepositoryViewers defines a mapping from Git remote repository to the
+  Gitweb instance URL used in Special:Version.
+* `$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.
+* $wgUseCombinedLoginLink now defaults to false, making MediaWiki output separate
+  login and create account links by default.
+
+=== 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.
+* (bug 27619) Remove preference option to display broken links as link?
+* (bug 34896) jQuery JSON plugin upgraded to v2.3 (2011-09-17).
+* (bug 34302) Add CSS classes to email fields in user preferences.
+* Introduced $wgDebugDBTransactions to trace transaction status (currently PostgreSQL only).
+* (bug 23795) Add parser itself to ParserMakeImageParams hook.
+* Introduce a cryptographic random number generator source api for use when
+  generating various tokens.
+* (bug 30963) Option on Special:Prefixindex and Special:Allpages to not show redirects.
+* (bug 18062) New message when edit or create the local page of a shared file.
+* (bug 22870) Separate interface message when creating a page.
+* (bug 17615) nosummary option should be reassigned on preview/captcha.
+* (bug 34355) Add a variable and parser function for the namespace number.
+* (bug 35649) Special:Version now shows hashes of extensions checked out from git.
+* (bug 35728) Git revisions are now linked on Special:Version.
+* "Show Changes" on default messages shows now diff against default message text
+* (bug 23006) create #speciale parser function.
+* generateSitemap can now optionally skip redirect pages.
+* (bug 27757) New API command just for retrieving tokens (not page-based).
+* Added GitViewers hook for extensions using external git repositories to have a web-based
+  repository viewer linked to from Special:Version.
+* Memcached debug logs can now be sent to their own file logs by setting
+  $wgDebugLogFile['memcached'] to some filepath.
+* (bug 35685) api.php URL and other entry point URLs are now listed on
+  Special:Version
+* Edit notices can now be translated.
+* jQuery upgraded to 1.8.2.
+* jQuery UI upgraded to 1.8.23.
+* QUnit upgraded from v1.2.0 to v1.10.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.
+* Added $wgLogExceptionBacktrace, on by default, to allow logging of exception
+  backtraces.
+* Added device detection for determining device capabilities.
+* QUnit.newMwEnvironment now supports passing a custom setup and/or teardown function.
+  Arguments signature has changed. First arguments is now an options object of which
+  'config' can be a property. Previously 'config' itself was the first and only argument.
+* 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.
+* 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.
+* Added new hook AfterFinalPageOutput to allow modifications to buffered page output before sent
+  to the client.
+* (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.
+* 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" (v0.3.0, http://jStorage.info/).
+* (bug 39273) Added AJAX support for "Show changes" (diff) in LivePreview.
+* Added ResourceLoader module "jquery.badge".
+* mw.util.$content now points to the overall content area in the skin rather than just
+  page text content area. If you need the old behaviour please use $( '#mw-content-text').
+* jsMessage has been replaced with a floating bubble notification system complete
+  with auto-hide, multi-message support, and message replacement tags.
+* jquery.messageBox which appears to be unused by both core and extensions has
+  been removed.
+* (bug 34939) Made link parsing insensitive ([HttP://]).
+* (bug 40072) Add CSS classes to items in output of ChangesList pages.
+* Added $wgCopyUploadProxy global to define which proxy to use for copy
+  uploads.
+* (bug 40448) mediawiki.legacy.mwsuggest has been replaced with a new module,
+  mediawiki.searchSuggest, based on SimpleSeach from Extension:Vector.
+
+=== Known issues in 1.20.0 ===
+These are issues that we're targeting to be fixed in a later release
+in the 1.20 series.  Issues may be added or removed from this list as
+we see fit.  For now, it is comprised of those bugs on the 1.20.0
+milestone in Bugzilla.
+
+* (bug 35894): Reports of secret key generation "hanging" on windows
+    This is probably a bug that has been fixed in PHP.  If you run
+    into this, try upgrading your PHP.
+* (bug 38334): PHP Notice:  Undefined index: href in /www/w/skins/Vector.php on line 416
+    We think this is a problem in some extension.  If you see this,
+    try disabling your extensions and check out the logging patch on
+    this bug.  Or try this patch:
+    <https://gerrit.wikimedia.org/r/#/c/27937/1/skins/Vector.php>
+* (bug 39268): [Regression] Toolbar inserts in main textarea only (instead of the focussed textarea)
+    This should only be an issue if you are using the ProofreadPage
+    extension.
+* (bug 40641): Clicking "others" in Special:Version asks to download a file
+    If you encounter this, you can tell your webserver to serve the
+    CREDITS file with text/plain MIME type to fix it.
+
+=== Bug fixes in 1.20 ===
+* (bug 40939): [Regression] InfoAction: Call to a member function getUserText() on a non-object
+* (bug 40780): searchsuggest-containing line ("containing...") doesn't include the entered text
+* (bug 37714): [Regression] Incomplete log entries
+* (bug 27202): API: Add timestamp sort to list=allimages
+* (bug 30245) Use the correct way to construct a log page title.
+* (bug 34237) Regenerate an empty user_token and save to the database
+  when we try to set the user's cookies for login.
+* (bug 32210) New edit emails for watched pages always provide a link to the
+  edit which triggered the mail.
+* (bug 12021) Added user talk link on Special:Listusers.
+* (bug 34445) section edit and TOC hide/show links are excluded from selection and
+  copy/paste on supporting browsers.
+* (bug 34428) Fixed incorrect hash mismatch errors in the DiffHistoryBlob
+  history compression method.
+* (bug 34702) Localised parentheses are now used in more special pages.
+* (bug 34723) When editing a script page on a RTL wiki the textbox should be LTR.
+* (bug 34762) Calling close() on a DatabaseBase object now clears the connection.
+* (bug 34863) Show deletion log extract on non-existent file pages if applicable.
+* (bug 28019) Let ?preloadtitle=foo be passed on to target of
+  Special:MyPage and Special:MyTalk.
+* (bug 34929) Show the correct diff when a section edit is rejected by the spam
+  filter.
+* (bug 15816) Add a switch for SETting the search_path (Postgres).
+* (bug 34521) Returning to the previous page after logging in loses any array-
+  valued parameters in the query string.
+* (bug 34735) Updated compressOld.php documentation to mention the different
+  usages of -s and -n parameters depending on compression type.
+* (bug 13896) Rendering of devanagari numbers in automatic '#' number lists.
+* (bug 33689) Upgrade to 1.19 on Postgres fails due to incomplete query when.
+  trying to defer foreign key for externallinks.
+* (bug 32748) Printer friendly version of article decode Unicode chars as a
+  pretty IRI in footer.
+* Removed white border around thumbnails in galleries.
+* (bug 31236) "Next" and "Previous" buttons are shown incorrectly in
+  an RTL environment.
+* (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
+  Subversion when invoked with the --modified option.
+* (bug 35069) On history pages, the " . . " separator after the number of
+  characters changed in a revision is now suppressed if no text would follow.
+* (bug 18704) Add a unique CSS class or ID to the tagfilter table row at RecentChanges
+* (bug 33564) transwiki import sometimes result in invalid title.
+* (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 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 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 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 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.
+* 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.
+* Made body-content lang attribute honor the variant language when it is set.
+* (bug 36761) "Mark pages as visited" now submits previously established filter options.
+* (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.
+* (bug 32552) Drop unused database field cat_hidden from table category.
+* (bug 24502) Do not allow multiple language links to the same language.
+* (bug 40214) Category pages no longer use deprecated "width" HTML attribute.
+* (bug 39941) Add missing stylesheets to the installer pages
+* In HTML5 mode, allow new input element types values (such as color, range..)
+* (bug 36151) mw.Title: Don't limit extension in title parsing.
+* (bug 38158) jquery.byteLimit sometimes causes an unexpected 0 maxLength being enforced.
+* (bug 38163) jquery.byteLimit incorrectly limits input when using methods other than
+  basic per-char typing.
+* (bug 34495) patrol log now credit the user patrolling (instead of patrolled
+  user).
+* (bug 31676) ResourceLoader should work around IE stylesheet limit.
+* (bug 40498) ResourceLoader should not output an empty "@media print { }" block.
+* (bug 40500) ResourceLoader should not ignore media-type for urls in debug mode.
+* (bug 40660) ResourceLoaderWikiModule should not convert "&nbsp;" to a space
+  for pages from the MediaWiki-namespace.
+* (bug 40329) (bug 40632) Removed CleanupPresentationalAttributes feature.
+
+=== 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 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 39665) List of query generators is now not built using reflection, instead it is
+  defined in code.
+
+=== Languages updated in 1.20 ===
+
+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.
+* (bug 34192) Namespace gender aliases for Albanian languages (sq & aln).
+* (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
+  cookies need to be set. It is also now possible to reset every user's
+  user_token simply by clearing the values in the user_token column.
+* Removed ./tests/qunit/index.html from core. It wasn't actively maintained and
+  has been made obsolete when [[Special:JavaScriptTest/qunit]] was introduced,
+  which actually uses ResourceLoader, LocalSettings and the Skin.
+* Removed $wgDBtransactions global. This was only checked in one class
+  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__ ).
+* OutputPage::wrapWikiMsg() no longer supports the 'options' parameter. It was
+  not used and complicated migration to Message class.
+* Live preview functionality has been improved and moved into the
+ 'mediawiki.action.edit.preview' module. The old 'mediawiki.legacy.preview' module
+  has been removed.
+* (bug 40448) Removed mediawiki.legacy.mwsuggest module, and removed the
+  following that has become obsolete:
+  - globals $wgEnableMWSuggest and $wgMWSuggestTemplate.
+  - mw.config.values wgMWSuggestTemplate and wgSearchNamespaces.
+  - method SearchEngine::getMWSuggestTemplate().
+
+== MediaWiki 1.19 ==
+
+== MediaWiki 1.19.2 ==
+
+This is a security release of the MediaWiki 1.19 branch
+
+=== Changes since 1.19.1 ===
+* (bug 39700) File: link to non-existing file can inject html
+* (bug 39823) Hidden block text leaking to admins
+* (bug 39184) LDAP password leakage
+* (bug 39180) Disallow framing of api results
+* (bug 37587) Enforce language codes to be html safe
+* (bug 39824) Check global blocks on account creation
+
+== MediaWiki 1.19 ==
+
+MediaWiki 1.19 is a large release that contains many new features and bug
+fixes. This is a summary of the major changes of interest to users.
+You can consult the RELEASE-NOTES-1.19 file for the full list of changes in
+this version.
+
+Our thanks go to everyone who helped to improve MediaWiki by testing the beta
+release and submitting bug reports.
+
+=== Changes since 1.19.1 ===
+* (bug 38406) Properly quote table names in DatabaseBase::tableName()
+* (bug 38249) Parser will throw an exception instead of outputting gibberish if
+  PCRE is compiled without support for unicode properties.
+
+=== Changes since 1.19.0 ===
+* (bug 36568) Fixed "Illegal string offset 'LIMIT'" warnings in updater
+* (bug 36938) Correctly escape uselang attribute to prevent xss
+* Expanded Blacklist for SVG Files
+
+=== Changes since 1.19 beta 2 ===
+* Special:Watchlist no longer sets links to feed when the user is anonymous.
+* (bug 35961) Hash comparison should always be strict.
+* Fix broken email confirmation expiration caused by MWCryptRand changes.
+* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
+  on line 598.
+* (bug 36042) 'show' causes a fatal in blocks API.
+
+=== Changes since 1.19 beta 1 ===
+* (bug 35014) Including a special page no longer sets the page's title to the
+  included page
+* (bug 35019) Edit summaries are no longer transformed in notification e-mails
+* (bug 35152) Help message for e-mail is shown again in user preferences
+* (bug 34887) $3 and $4 parameters are now substituted correctly in message
+  "movepage-moved"
+* (bug 34841) Edit links are no longer displayed when display old page versions
+* (bug 34889) User name should be normalized on Special:Contributions
+* (bug 35051) If heading has a trailing space after == then its name is not
+  preloaded into edit summary on section edit
+* (bug 31417) New ID mw-content-text around the actual page text, without categories,
+  contentSub, ... The same div often also contains the class mw-content-ltr/rtl.
+* (bug 35303) Proxy and DNS blacklist blocking works again
+* (bug 22555) Remove or skip strip markers from tag hooks like &lt;nowiki&gt; in
+  core parser functions which operate on strings, such as padleft.
+* (bug 18295) Don't expose strip markers when a tag appears inside a link
+  inside a heading.
+* (bug 34212) ApiBlock/ApiUnblock allow action to take place without a token
+  parameter present.
+* (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
+  CSRF attacks.
+* (bug 35317) CSRF in Special:Upload.
+
+=== Configuration changes in 1.19 ===
+* Removed SkinTemplateSetupPageCss hook; use BeforePageDisplay instead.
+* (bug 27132) movefile right granted by default to registered users.
+* Default cookie lifetime ($wgCookieExpiration) is increased to 180 days.
+* (bug 31204) Removed old user.user_options.
+* $wgMaxImageArea now applies to jpeg files if they are not scaled with
+  ImageMagick.
+* Introduced $wgQueryPageDefaultLimit (defaults to 50) for the number of
+  items to show by default on query pages (special pages such as Whatlinkshere).
+* (bug 32470) Increase the length of ug_group.
+* (bug 32239) Removed $wgEnableTooltipsAndAccesskeys.
+* Removed $wgVectorShowVariantName.
+* Removed $wgExtensionAliasesFiles. Use $wgExtensionMessagesFiles.
+* Removed $wgResourceLoaderInlinePrivateModules , now always enabled.
+
+=== New features in 1.19 ===
+* (bug 19838) Add ability to get all interwiki prefixes also if the interwiki
+  cache is used.
+* $wgDnsBlacklistUrls now accepts an array with url and key as the
+  elements to work with DNSBLs that require keys, such as
+  Project Honeypot.
+* (bug 30022) Add support for custom loadScript sources to ResourceLoader.
+* (bug 19052) Unicode space separator characters (Zs) now terminates external
+  links and images links.
+* (bug 30160) Add public method to mw.loader to get module names from registry.
+* (bug 15558) Parameters to special pages included in wikitext can now be passed
+  as with templates.
+* Installer now issues a warning if mod_security is present.
+* (bug 29455) Add support for a filter callback function in jQuery byteLimit
+  plugin.
+* Added two new GetLocalURL hooks to better serve extensions working on a
+  limited type of titles.
+* Added a --no-updates flag to importDump.php that skips updating the links
+  tables.
+* Most presentational html attributes like valign are now converted to inline
+  css style rules. These attributes were removed from html5 and so we clean
+  them up when $wgHtml5 is enabled. This can be disabled using
+  $wgCleanupPresentationalAttributes.
+* Magic words (time and number-formatting ones, plus DIRECTIONMARK, but not
+  NAMESPACE) now depend on the page content language instead of the site
+  language. In theory this sets the right magic words in system messages,
+  although they are not used there.
+* (bug 30451) Add page_props to RefreshLinks::deleteLinksFromNonexistent.
+* (bug 30450) Clear page_props table on page deletion.
+* Hook added to check for exempt from account creation throttle.
+* (bug 30344) Add configuration variable for setting custom priorities when
+  generating sitemaps.
+* (bug 96170) Add array support for space-separated list attributes (like
+  'class') in the Html helper class.
+* (bug 26470) Add checkered background image on hover on files pages.
+* (bug 30774) mediawiki.html: Add support for numbers and booleans in the
+  attribute values and element contents.
+* Conversion script between Tifinagh and Latin for the Tachelhit language.
+* (bug 16755) Add options 'noreplace' and 'noerror' to {{DEFAULTSORT:...}}
+  to stop it from replace an already existing default sort, and suppress error.
+* (bug 18578) Rewrote revision delete related messages to allow better
+  localisation.
+* (bug 30364) LanguageConverter now depends on the page content language
+  instead of the wiki content language.
+* Jump links will now be usable in CSS-capable browsers instead of only
+  in outdated text browsers.
+* New common*.css files usable by skins instead of having to copy piles
+  of generic styles from MonoBook or Vector's css.
+* Some deprecated presentational html attributes will now be automatically
+  converted to css.
+* (bug 31297) Add support for namespaces in Special:RecentChanges subpage filter
+  syntax.
+* The default user signature now contains a talk link in addition to the user link.
+* (bug 25306) Add link of old page title to MediaWiki:Delete_and_move_reason.
+* Added hook BitmapHandlerCheckImageArea.
+* (bug 30062) Add $wgDBprefix option to cli installer.
+* getUserPermissionsErrors and getUserPermissionsErrorsExpensive hooks are now
+  also called when checking for 'read' permission.
+* Introduce $wgEnableSearchContributorsByIP which controls whether searching
+  for an IP address redirects to the contributions list for that IP.
+* (bug 8859) Database::update should take array of tables too.
+* (bug 19698) Add "Inverse namespaces" option to Special:Contributions.
+* (bug 24037) Add byte length of revision to Special:Contributions.
+* (bug 1672) Added $wgDisableUploadScriptChecks to allow uploading of files
+  containing HTML or JS. DISABLING THESE CHECKS IS VERY DANGEROUS.
+* New path mappings can be added using the WebRequestPathInfoRouter hook
+  and adding paths to the PathRouter.
+* (bug 32666) Special:ActiveUsers now allows a subpage to be used as value for the
+  "target" query parameter (eg. Special:ActiveUsers/Username).
+* New JavaScript variable wgPageContentLanguage.
+* Added new debugging toolbar, enabled with $wgDebugToolbar.
+* Differences in the history page now uses slightly better colors for people
+  perceiving colors differently.
+* (bug 32879) Upgrade jQuery to 1.7.1.
+* jQuery UI upgraded to 1.8.17.
+* Extensions can use the 'Language::getMessagesFileName' hook to define new
+  languages using messages files outside of core.
+* (bug 32512) Add 'Associated namespace' checkbox to Special:Contributions.
+* Added $wgSend404Code, true by default, which can be set to false to send a
+  200 status code instead of 404 for nonexistent articles.
+* (bug 33447) Link to the broken image tracking category from Special:Wantedfiles.
+* (bug 27724) Add timestamp to job queue.
+* (bug 30339) Implement SpecialPage for running javascript tests. Disabled by default, due to
+  tests potentially being harmful, not to be run on a production wiki.
+  Enable by setting $wgEnableJavaScriptTest to true.
+* Extensions can use the RequestContextCreateSkin hook to override what skin is
+  loaded in some contexts.
+* (bug 33456) Show $wgQueryCacheLimit on cached query pages.
+* (bug 10574) Add an option to allow all pages to be exported by Special:Export.
+* mediawiki.js Message object constructor is now publicly available as mw.Message.
+* (bug 29309) Allow CSS class per tooltip (tipsy).
+* (bug 33565) Add accesskey/tooltip to submit buttons on Special:EditWatchlist.
+* (bug 17959) Inline rendering/thumbnailing for Gimp XCF images.
+* (bug 27775) Namespace has it's own XML tag in the XML dump file.
+* (bug 30513) Redirect tag is now resolved in XML dump file.
+* sha1 xml tag added to XML dump file.
+* (bug 33646) Badtitle error page now emits a 400 HTTP status.
+* Special:MovePage now has a dropdown menu for namespaces.
+* (bug 34420) Special:Version now shows git HEAD sha1 when available.
+* (bug 33952) Refactor mw.toolbar to allow dynamic additions at any time.
+
+=== Bug fixes in 1.19 ===
+* $wgUploadNavigationUrl should be used for file redlinks if.
+  $wgUploadMissingFileUrl is not set. The first was used for this
+  until the second was introduced in 1.17.
+* BREAKING CHANGE:  Style rules for wikitable are now more specific and prevent
+  inheritance to nested tables which caused various issues (bug 30485 and bug
+  33434). If your wiki has overriden rules for ".wikitable", please revise them and
+  adjust where neccecary. For comparison, use the "table.wikitable" section in
+  skins/common/shared.css as base.
+* $wgUploadNavigationUrl is now used for file redlinks if
+  $wgUploadMissingFileUrl is not set. The former was used for this until the
+  second was introduced in 1.17.
+* (bug 27894) Move 'editondblclick' event listener down from body to
+  div#bodyContent.
+* (bug 30172) The check for posix_isatty() in maintenance scripts did not detect
+  when the function exists but is disabled. Introduced
+  Maintenance::posix_isatty().
+* (bug 30264) Changed installer-generated LocalSettings.php to use
+  require_once() instead require() for included extensions.
+* Do not convert text in the user interface language to another script.
+* (bug 26283) Previewing user JS/CSS pages didn't load other user JS/CSS pages.
+* (bug 26486) ResourceLoader modules with paths to nonexistent files cause PHP
+  warnings/notices to be thrown.
+* (bug 30335) Fix for HTMLForms using GET that were breaking when non-friendly
+  URLs are used.
+* (bug 28649) Preventing half truncated multi-byte unicode characters when
+  truncating log comments.
+* Show --batch-size option in help of maintenance scripts that support it.
+* (bug 4381) Magic quotes cleaning was not comprehensive, key strings were not
+  unescaped.
+* (bug 23057) Importers no longer can 'edit' or 'create' a fully-protected page by
+  importing a new revision into it.
+* Allow moving the associated talk pages of subpages even if the base page
+  has no subpage.
+* Per page edit-notices now work in namespaces without subpages enabled.
+* (bug 31081) $wgEnotifUseJobQ is no longer unconditionally enqueueing jobs.
+* (bug 30202) File names are now restricted on upload to 240 bytes, because of
+  restrictions on some of the database fields.
+* Timezones are now recognised in user preferences when offset is different
+  due to DST.
+* (bug 31692) "summary" parameter now also works when undoing revisions.
+* (bug 18823) "move succeeded" text displayed bluelinks even when redirect was
+  suppressed.
+* (bug 19186) Special:UserLogin's title on Special:SpecialPages now says
+  "create account" when the user cannot create an account.
+* (bug 31818) 'usercreated' message now supports GENDER.
+* (bug 32022) Our phpunit.php script can now be executed from another directory.
+* (bug 26020) Setting $wgEmailConfirmToEdit to true no longer removes diffs.
+  from recent changes feeds.
+* (bug 30232) add current time to message wlnote on Special:Watchlist.
+* (bug 29110) $wgFeedDiffCutoff did not affect new pages.
+* (bug 32168) Add wfRemoveDotSegments for use in wfExpandUrl.
+* (bug 32358) Do not display "No higher resolution available" for dimensionless
+  files (like audio files).
+* (bug 32168) Add wfAssembleUrl for use in wfExpandUrl.
+* (bug 32168) fixed - wfExpandUrl expands dot segments now.
+* (bug 31535) Upload comments now truncated properly, and don't have brackets.
+* (bug 32086) Special:PermanentLink now show an error message when no subpage
+  was specified.
+* (bug 30368) Special:Newpages now shows the new page name for moved pages.
+* (bug 1697) The way to search blocked usernames in block log should be clearer.
+* (bug 29747) eAccelerator shared memory caching has been removed since it is
+  now disabled by default and is buggy. APC, XCache and WinCache are not affected.
+* Installer now refuses to install if php was not compiled with Ctype support.
+* (bug 29475) Remove "trackback" feature entirely from core.
+* (bug 32665) Special:BlockList prefills the username in the input field if
+  using the Special:BlockList/username URL.
+* (bug 27721) Make JavaScript variables wgSeparatorTransformTable and
+  wgDigitTransformTable depend on page content language so the sort script
+  sorts correctly more often.
+* (bug 32230) Expose wgRedirectedFrom in JavaScript.
+* (bug 31212) History tab not collapsed when the screen is narrow.
+* (bug 15521) Use new section summary when the action of adding a new section
+  also happens to create the page.
+* (bug 32960) Remove EmailAuthenticationTimestamp from database when a
+  email address is removed.
+* (bug 32414) Empty page get a empty bytes attribute in Export/Dump.
+* (bug 33101) Viewing a User or User talk of username resembling IP ending
+  with .xxx causes Internal error.
+* Warning about undefined index in certain situations when $wgLogRestrictions
+  causes the first log type requested to be removed but not the others.
+* Use separate message ('prefixindex-namespace') for title of
+  Special:PrefixIndex rather then re-using Special:AllPages's allinnamespace.
+* (bug 33156) Special:Block now allows you to confirm you want to block yourself
+  when using non-normalized username.
+* (bug 33246) News icon shown for news:// URLs but not for news: URLs.
+* (bug 33305) Make mw.util.addCSS resistant to IE's @font-face bug by setting
+  cssText after DOM insertion.
+* (bug 30711) When adding a new section to a page with section=new, the text is
+  now always added to the current version of the page.
+* (bug 31719) Fix uploads of SVGs exported by Adobe Illustrator by expanding
+  XML entities correctly.
+* (bug 30914) Embeddable ResourceLoader modules (user.options, user.tokens)
+  should be loaded in <head> for proper dependency resolution.
+* (bug 32702) Removed method Skin::makeGlobalVariablesScript() has been readded
+  for backward compatibility.
+* (bug 31469) Make sure tracking category messages expand variables like
+  {{NAMESPACE}} relative to correct title.
+* (bug 33454) ISO-8601 week-based year number (format character 'o') is now
+  calculated correctly with respect to timezone.
+* (bug 32219) InstantCommons now fetches content from Wikimedia Commons using
+  HTTPS when the local wiki is served over HTTPS.
+* (bug 33525) clearTagHooks doesn't clear function hooks.
+* (bug 33523) Function tag hooks don't appear on Special:Version.
+* Files with IPTC blocks we can't read no longer prevent extraction of exif
+  or other metadata.
+* (bug 33587) Remove action "historysubmit" from history pages.
+* (bug 25800) mw.config wgAction should contain the actually performed action instead
+  of whatever the query value contains.
+* (bug 4438) Add CSS hook for current WikiPage action.
+* (bug 33703) Common border-bottom color for <abbr> should inherit default (text) color.
+* (bug 33819) Display file sizes in appropriate units.
+* (bug 32948) {{REVISIONID}} and related variables are no longer blank after doing
+  a null edit.
+* (bug 33880) $wgUsersNotifiedOnAllChanges should not send e-mail to user who made
+  the edit.
+* (bug 33902) Decoding %2B with mw.Uri.decode results in ' ' instead of +.
+* (bug 33762) QueryPage-based special pages no longer misses *-summary message.
+* Other sizes links are no longer generated for wikis without a 404 thumbnail handler.
+* (bug 29454) Enforce byteLimit for page title input on Special:MovePage.
+* (bug 34114) CSSMin::remap() doesn't respect its $embed parameter.
+* Special:Contributions/newbies now shows the contributions for the user "newbies".
+  New user contributions are obtained using the form or using ?contribs=newbie in URL.
+* It is now possible to delete images that have no corresponding description pages.
+* (bug 33165) GlobalFunctions.php line 1312: Call to a member function
+  getText() on a non-object.
+* (bug 31676) Group dynamically inserted CSS into a single <style> tag, to work
+  around a bug where not all styles were applied in Internet Explorer.
+* (bug 28936, bug 5280) Broken or invalid titles can't be removed from watchlist.
+* (bug 34600) Older skins using useHeadElement=false were broken in 1.18.
+* (bug 34604) [mw.config] wgActionPaths should be an object instead of a numeral
+  array.* (bug 12262) Indents and lists are now aligned
+* (bug 29753) mw.util.tooltipAccessKeyPrefix should be alt-shift for Chrome
+   on Windows
+* (bug 25095) Special:Categories should also include the first relevant item
+   when "from" is filled.
+* (bug 34972) An error occurred while changing your watchlist settings for
+  [[Special:WhatLinksHere/Example]]
+
+=== API changes in 1.19 ===
+* Made action=edit less likely to return "unknownerror", by returning the actual error
+  message (which may have come from a hook call or similar).
+* (bug 19838) siprop=interwikimap can now use the interwiki cache.
+* (bug 29748) Add API search prefix support.
+* (bug 29684) Set forgotten parameter types in ApiQueryIWLinks.
+* (bug 29685) do not output NULL parentid with list=deletedrevs&drprop=parentid.
+* siprop=interwikimap and siprop=languages can use silanguagecode to have
+  a best effort language name translation. Use CLDR extension for best result.
+* (bug 30230) action=expandtemplates should not silently override invalid title
+  inputs.
+* (bug 18634) Create API to fetch MediaWiki's language fallback tree structure.
+* (bug 26885) Allow show/hide of account blocks, temporary blocks and single IP
+  address blocks for list=blocks.
+* (bug 30591) Add support to only return keys in ApiAllMessages.
+* The API now respects $wgShowHostnames and won't share the hostname in
+  severedby if it's set to false.
+* wlexcludeuser parameter added to ApiFeedWatchlist.
+* (bug 7304) Links on redirect pages no longer cause the redirect page to show
+  up as a redirect to the linked page on Special:Whatlinkshere.
+* (bug 32609) API: Move captchaid/captchaword of action=edit from core
+  to Captcha extension(s).
+* Added 'APIGetDescription' hook.
+* (bug 32688) Paraminfo for parameter "generator" of the query module shows too
+  many types.
+* (bug 32415) Empty page get no size attribute in API output.
+* (bug 31759) Undefined property notice in querypages API.
+* (bug 32495) API should allow purge by pageids.
+* (bug 33147) API examples should explain what they do.
+* (bug 33482) Api incorrectly calls ApiBase::parseMultiValue if allowed
+  values is given as an array.
+* (bug 32948) {{REVISIONID}} and related variables are no longer blank after
+  calling action=purge&forcelinkupdate.
+* (bug 34377) action=watch now parses messages using the correct title instead
+  of "API".
+* (bug 35036) WikiLove messages were not automatically updated in JavaScript
+  after having been changed on-wiki due to a bug in core
+
+=== Languages updated in 1.19 ===
+
+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.
+
+* Canadian English (en-ca) (new).
+* Norwegian (bokmål) (nb) (renamed from no).
+* Uighur (Latin) (ug-latn) was incorrectly marked as right-to-left language.
+* (bug 30217) Make pt-br a fallback of pt.
+* (bug 31193) Set fallback language of Assamese from Bengali to English.
+* Update date format for dsb and hsb: month names need the genitive.
+* (bug 28643) Serbian variant conversion improvements (Nikola Smolenski).
+* (bug 29405, bug 30809) Lower diacritics are invisible in titles in Indic
+  languages Assamese, Bengali, Hindi, Malyalam and Odiya.
+* (bug 32826) Titles in indic languages are partially cut.
+* (bug 33367) Gendered namespaces for Czech.
+* (bug 33014) Language::formatSize()/formatBitrate() should be able to deal
+  with larger numbers (tera-yotta).
+
+=== Other changes in 1.19 ===
+* BREAKING CHANGE: Legacy global array 'ta' and global function 'akeytt' have
+  been removed from wikibits.js.
+* jquery.mwPrototypes module was renamed to jquery.mwExtension.
+* The maintenance script populateSha1.php was renamed to the more concise
+  populateImageSha1.php.
+* The Client-IP header is no longer checked for when trying to resolve a client's
+  real IP address.
+* (bug 22096) Although IE5.x and below was already unsupported officially, stylesheets
+  existing exclusively for IE5.0 and IE5.5 have now been removed (which were in skins
+  'chick' and 'monobook').
+* The constructor for CategoryView has changed, the second parameter is now a
+  Context source and is required.
+* The Title::escape{Local,Full,Canonical}URL methods are deprecated, please use
+  proper html building methods to escape the normal get{...}URL methods instead.
+* The $variant arguments in the Title::get{Local,Full,Link,Canonical}URL methods
+  have been replaced with a secondary query argument.
+* The $variant argument in the hooks for the Title::get{Local,Full,Link,Canonical}URL
+  methods have been removed, the variant is now part of the $query argument.
+* Removed Title::isValidCssJsSubpage(), deprecated since 1.17 in favor of
+  using Title::isCssJsSubpage() or checking Title::isWrongCaseCssJsPage().
+* Support for the deprecated hook MagicWordMagicWords was removed.
+* The Xml::namespaceSelector method has been deprecated, please use
+  Html::namespaceSelector instead (note that the parameters have changed also).
+* (bug 33746) Preload popular ResourceLoader modules (mediawiki.util) as stop-gap
+  for scripts missing dependencies.
+  New configuration variable $wgPreloadJavaScriptMwUtil has been introduced for this
+  (set to false by default for new installations). Set to true if your wiki has a large
+  amount of user/site scripts that are lacking dependency information. In the short to
+  medium term these user/site scripts should be fixed by adding the used modules to the
+  dependencies in the module registry and/or wrapping them in a callback to mw.loader.using.
 
 == MediaWiki 1.18 ==
+
+== MediaWiki 1.18.5 ==
+2012-08-30
+
+This is a security release of the MediaWiki 1.18 branch
+
+=== Changes since 1.18.4 ===
+* (bug 39700) File: link to non-existing file can inject html
+* (bug 39823) Hidden block text leaking to admins
+* (bug 39184) LDAP password leakage
+* (bug 39180) Disallow framing of api results
+* (bug 37587) Enforce language codes to be html safe
+* (bug 39824) Check global blocks on account creation
+
+== MediaWiki 1.18.4 ==
+2012-06-12
+
+This is a security release of the MediaWiki 1.18 branch.
+
+=== Changes since 1.18.3 ===
+* (bug 36938) Correctly escape uselang attribute to prevent xss
+* Expanded Blacklist for SVG Files
+
+== MediaWiki 1.18.3 ==
+2012-04-25
+
+This is a maintenance release of the MediaWiki 1.18 branch.
+
 === Changes since 1.18.2 ===
 * (bug 35446) Using "{{nse:}}" with an invalid namespace name no longer throws
   a PHP warning.
 * (bug 35567) The whole password reminder e-mail is now sent in the same language.
+* (bug 35961) Hash comparison should always be strict.
+* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
+  on line 598.
+* Fix broken email confirmation expiration caused by MWCryptRand changes.
 
 == MediaWiki 1.18.2 ==
 2012-03-21
@@ -793,97 +1597,219 @@ changes to languages because of Bugzilla reports.
 
 == MediaWiki 1.17 ==
 
-=== PHP 5.2 now required ==
-Since 1.17, the lowest supported version of MediaWiki is now 5.2.3. Please
-upgrade PHP if you have not done so prior to upgrading MediaWiki.
+== MediaWiki 1.17.5 ==
+2012-06-12
 
-=== New installer in 1.17 ===
-MediaWiki 1.17 is shipping with a completely redesigned installer to fix
-a lot of outstanding bugs, cleanup the code quality, and make it easier to
-use. Notably, you can now run upgrades from the web without having to move
-LocalSettings.php. Also, configuration script directory has been renamed
-from config/ to mw-config/. The specific bugs are listed below in the
-general notes.
+This is a security release of the MediaWiki 1.17 branch.
 
-=== New ResourceLoader in 1.17 ===
-MediaWiki 1.17 ships with a ResourceLoader which combines and minifies css and
-javascript attached to the page. They are served from the new entry point load.php
-If the page is served with the &debug=true parameter, the non-minified files
-are used instead.
+=== Summary of selected changes in 1.17 ===
+
+Selected changes since MediaWiki 1.16 that may be of interest:
+
+* A new installer has been introduced. It has a wizard-style interface which is
+  translated into many languages. Many shortcomings in the old installer were
+  addressed with this rewrite. Note that it is no longer required for the config
+  directory to be made writable by the webserver. Instead the generated
+  LocalSettings.php file is offered as a download, which you must then upload
+  to the wiki's base directory.
+
+* ResourceLoader, a new framework for delivering client-side resources such as
+  JavaScript and CSS, has been introduced. These resources are now delivered
+  through the new entry point script "load.php", instead of as static files
+  served directly by the web server. This allows minification, compression and
+  client-side caching to be used more effectively, which should provide a net
+  performance improvement for most users.
+
+* Category sorting has been improved.
+** Sorting is now case insensitive.
+** Sub-categories, pages and files can now be paged separately.
+** When several pages are given the same sort key, they sort by their
+   names instead of randomly.
+
+* The lowest supported version of PHP is now 5.2.3. If necessary, please
+  upgrade PHP prior to upgrading MediaWiki.
+
+=== Changes since 1.17.4 ===
+
+* (bug 36938) Correctly escape uselang attribute to prevent xss
+* Expanded Blacklist for SVG Files
+
+=== Changes since 1.17.3 ===
+
+* (bug 35961) Hash comparison should always be strict.
+* Fix broken email confirmation expiration caused by MWCryptRand changes.
+* (bug 35671) PHP Notice: Undefined index: gettoken in includes/api/ApiMain.php
+  on line 598.
+
+=== Changes since 1.17.2 ===
+
+* (bug 22555) Remove or skip strip markers from tag hooks like &lt;nowiki&gt; in
+  core parser functions which operate on strings, such as padleft.
+* (bug 34212) ApiBlock/ApiUnblock allow action to take place without a token
+  parameter present.
+* (bug 34907) Fixed exposure of tokens through load.php that could have facilitated
+  CSRF attacks.
+* (bug 35317) CSRF in Special:Upload.
+
+=== Changes since 1.17.1 ===
+* (bug 33117) prop=revisions allows deleted text to be exposed through cache pollution.
+* (bug 32709) Private Wiki users were always taken to Special:Badtitle on login.
+
+=== Changes since 1.17.0 ===
+
+* (bug 29535) Added missing Creative Commons CC0 icon.
+* (bug 29726) Fixed failure to load internationalization messages in
+  client-side scripts on WebKit-based browsers.
+* Fixed a bug in message transformation where the previous language could leak
+  into later transformations in the UI language.
+* (bug 29091) Fixed form of native name for Ossetic language (Иронау -> Ирон)
+* Fixed maintenance scripts upgrade1_5.php and rebuildImages.php, they did not
+  work at all since 1.17 beta 1.
+* (bug 29531) Fixed img_auth.php for thumbnails and other filenames with
+  multiple dots, was broken by the fix for bug 28840.
+* In the maintenance script purgeList.php, fixed a fatal error when a page
+  title is given, instead of a URL.
+* (bug 19514) Unordered list list-style-image should be IE6-compatible (8-bit).
+* Installer checked for magic_quotes_runtime instead of register_globals.
+* $wgSVGMaxSize is now applied to the smaller of width or height, making very
+  wide pano/timeline/diagram SVGs renderable at saner sizes.
+* (bug 29959) Installer fatal when cURL and allow_url_fopen is disabled and user
+  tries to subsribe to mediawiki-announce.
+* Installer checked for magic_quotes_runtime instead of register_globals
+* (bug 30131) XCache with variable caching disabled no longer used for variable
+  caching (CACHE_ACCEL)
+* (bug 30264) Changed installer-generated LocalSettings.php to use require_once()
+  instead require() for included extensions.
+* (bug 26486) ResourceLoader modules with paths to nonexistent files cause PHP
+  warnings/notices to be thrown
+* (bug 30907) Special:Unusedcategories should sort ascendingly.
+* (bug 30219) The page shown when LocalSettings.php does not exist was broken on
+  Windows servers.
+* Hardcoded NLS_NUMERIC_CHARACTERS for Oracle DB to prevent type conversion errors.
+* Fixed recentchanges FK violation on page delete and cache purge error in updater
+  for Oracle DB.
+* (bug 32276) Skins were generating output using the internal page title which
+  would allow anonymous users to determine wheter a page exists, potentially
+  leaking private data. In fact, the curid and oldid request parameters would
+  allow page titles to be enumerated even when they are not guessable.
+* (bug 32616) action=ajax requests were dispatched to the relevant internal
+  functions without any read permission checks being done. This could lead to
+  data leakage on private wikis.
+
+=== Changes since 1.17.0rc1 ===
+
+* Fixed syntax error in generated LocalSettings.php when a non-default user
+  rights profile is chosen.
+* (bug 29399) Fixed PostgreSQL installation when the DB user for installation
+  is the same as the one for web access.
+* (bug 29233) Fixed failover for DB slave servers. When a DB slave went down,
+  an error was immediately shown to the user, instead of trying another slave.
+  Was broken since 1.17 beta 1.
+* (bug 29278) Fixed PHP fatal error when attempting to add text to a page via a
+  redirect.
+* (bug 29408) Fixed uploads of files with MIME types that aren't detected by
+  MediaWiki.
+* Removed DEFAULT '' NOT NULL field definitions from Oracle DB schema because
+  using the DEFAULT value ('') in DML broke Oracle backend as it treats an
+  empty VARCHAR2 value as NULL. Indexes on Oracle do not require NOT NULL
+  fields.
+
+=== Changes since 1.17 beta 1 ===
+
+* Fixed warning about missing file "password.js".
+* When installing on MySQL, don't attempt to create a new database user if the
+  same user is used for installation and web access.
+* Fixed SQL query errors in queries with table aliases.
+* (bug 27891) Fixed the "chronology protector", broken since 1.17beta1, which
+  ensures that when database replication is used, the new version is seen by
+  the user immediately after they create or edit an article.
+* (bug 28845) Allow PostgreSQL installation using a non-root user account which
+  has role creation abilities.
+* When installing on PostgreSQL and the install account is the same as the web
+  account, check to make sure that the account has suitable privileges in the
+  mediawiki schema.
+* (bug 28172) Fixed error in PostgreSQL installation when creating the wiki
+  sysop account.
+* Fixed an issue with the Oracle installer in cases where the user is different
+  to the database name.
+* Added "unblockself" to the list of available rights.
+* In the installer, fixed the "user rights profile" option, it never worked.
+* (bug 29117) Fixed Hebrew localisation of the installer.
+* (bug 28840) Reduce the collateral damage caused by the fix for bug 28235 (XSS
+  on Internet Explorer 6 due to a file extension in the query string) by
+  reducing the number of URLs that are blocked, and by redirecting the request
+  to a safer URL where possible instead of blocking it.
+* (bug 28812) Fixed documentation of API action=parse.
+* (bug 28979) Fixed styling of <abbr> and <acronym>.
+* Fixed the error message displayed when you try to create an account by email,
+  but an email address is not given.
+* Fixed JS error due to missing dependency for jquery.suggestions.
+* Exposed $wgExtensionAssetsPath in JavaScript.
+* (bug 28738) Made ResourceLoader support environments with small URL length
+  limits. The length limit can be configured via $wgResourceLoaderMaxQueryLength,
+  and this is set automatically in the generated LocalSettings.php when the
+  php.ini variable "suhosin.get.max_value_length" is set. When a URL exceeds
+  this limit, the request is split up. Also, reduced the average length of
+  load.php URLs by using a more compact parameter format.
+* (bug 25262) Fix for minification of hardcoded data: URIs in CSS.
+* (bug 25124) Respect $wgStyleDirectory in ResourceLoader.
+* Allow installation when no HTTP client is available, don't throw an exception.
+* (bug 27465) Fix metadata extraction for SVG files using unusual namespace
+  names.
+* (bug 29174) Fix regression in upload-by-URL: uploading files larger than the
+  PHP memory limit should work again.
+* Fixed the display of comments in the new user log.
+* (bug 28237) When installing extensions using the web-based installer, create
+  any necessary database tables.
+* (bug 28983) Fixed automated installation of extensions that overwrite $path.
+* Fixed error caused by missing magic words.
+* Fixed breakage of article editing in PostgreSQL due to text search
+  configuration errors.
+* Fixed the HTTPS client used when Curl is not available. This avoids an error
+  during install about failure of the mediawiki-announce subscription.
+* (bug 28162) When installing to PostgreSQL, respect the "database port" input,
+  it was ignored.
 
 === Configuration changes in 1.17 ===
-* DatabaseFunctions.php that was needed for compatibility with pre-1.3
-  extensions has been removed.
-* $wgAllowImageTag can be set to true to whitelist the <img> tag in wikitext.
-* (bug 12797) Add $wgGalleryOptions for adjusting of default gallery display
-  options.
-* $wgAllowUserCssPrefs option allows disabling CSS-based preferences; which can
-  improve page loading speed.
+
+* $wgLogAutocreatedAccounts controls whether autocreation of accounts is logged
+  to new users log.
 * (bug 22858) $wgLocalStylePath is by default set to the same value as
   $wgStylePath but should never point to a different domain than the site is
   on, allowing skins to use .htc files which are not cross-domain friendly.
-* (bug 20193) Added $wgVectorShowVariantName global configuration variable
-  which causes Vector to render the variants drop-down menu with a label
-  showing the current variant name. This is off by default, pending further
-  research into its user experience implications.
-* XmlFunctions.php has been removed. Use the Xml or Html classes as appropriate.
-* Added $wgSQLMode for setting database SQL modes - either performance (null)
-  or other reasons (such as enabling stricter checks)
 * $wgFileStore has been deprecated. The only usage $wgFileStore['deleted'] has
   been turned into $wgDeletedDirectory.
 * $wgDeletedDirectory has been added to specify what directory to place deleted
   uploads in.
 * IBM DB2 database no longer uses the db specific $wgDBport_db2 variable but the
   normal $wgDBport.
-* The upload link for missing files can now be set separately from the
-  navigation link with $wgUploadMissingFileUrl.
 * $wgCategoryPrefixedDefaultSortkey was removed and is now always false.  This
   provides more sensible sorting behavior for categories.
 * Removed unused globals: $wgEnableSerializedMessages, $wgCheckSerialized,
-  $wgUseMemCached, $wgDisableSearchContext, $wgColorErrors,
-  $wgUseZhdaemon, $wgZhdaemonHost and $wgZhdaemonPort.
+  $wgUseMemCached, $wgDisableSearchContext, $wgColorErrors, $wgUseZhdaemon,
+  $wgZhdaemonHost and $wgZhdaemonPort.
 * (bug 24408) The include_path is not modified in the default LocalSettings.php
 * $wgVectorExtraStyles was removed, and is no longer in use.
-* $wgLoadScript was added to specify alternative locations for ResourceLoader
-  requests.
-* $wgResourceLoaderMaxage was added to specify maxage and smaxage times for
-  responses from ResourceLoader based on whether the request's URL contained a
-  version parameter or not.
-* $wgResourceLoaderDebug was added to specify the default state of debug mode;
-  this will still be overridden with the debug URL parameter a la
-  $wgLanguageCode.
-* $wgResourceLoaderInlinePrivateModules was added to specify whether private
-  modules such as user.options should be embedded in the HTML output or
-  delivered through a resource loader request, which bypasses server cache (like
-  squid) and checks the user parameter against $wgUser. The former adds more
-  data to all pages, while the latter adds a request which cannot be cached
-  server side.
-* Removed $wgUpdates for database updates; extension should use
-  DatabaseUpdater::addExtensionUpdate().
+* Removed $wgUpdates for database updates; extensions should use
+  DatabaseUpdater::addExtensionUpdate() via the LoadExtensionSchemaUpdates hook.
 * Removed $wgServerName. It doesn't need to be set anymore and is no longer
   available as input for other configuration items, either.
-* Remove $wgRemoteUploads. It was not well supported and superseded by
-  $wgUploadNavigationUrl.
-* (bug 198) $wgUpgradeKey allows unlocking the web installer for upgrades
-  without having to move LocalSettings.php
-* The FailFunction "error handling" method has now been removed
-* $wgAdditionalMailParams added to allow setting extra options to mail() calls.
-* $wgSecureLogin to optionaly login using HTTPS
-* (bug 25728) Added $wgPasswordSenderName to allow customise the name associed
-  with $wgPasswordSender
-* Sysops now have the "suppressredirect" right by default
-* (bug 22463) $wgFooterIcons added to allow configuration of the icons shown in
-  the footers of skins.
-* $wgFileCacheDepth can be used to set the depth of the subdirectory hierarchy
-  used for the file cache. Default value is 2, which matches former behavior
 * It's no longer necessary for LocalSettings.php to include DefaultSettings.php.
 * It's no longer necessary to set $wgCacheEpoch to the file modification time
   of LocalSettings.php, in LocalSettings.php itself. Instead, this is done
   automatically if $wgInvalidateCacheOnLocalSettingsChange is true (which is
   the default).
-* (bug 26253) $wgPostCommitUpdateList has been removed
+* $wgCopyrightIcon is deprecated and $wgFooterIcons['copyright']['copyright']
+  should be used instead.
+* $wgSysopUserBans is deprecated, and will be made permanently true in 1.18.
+  If you need this functionality, you should use the BlockIp hook to filter and
+  reject such blocks.
+* $wgSysopRangeBans is deprecated, you should set $wgBlockCIDRLimit to maximum
+  (32 for IPv4, 128 for IPv6), equivalent to allowing rangeblocks of only 1
+  address at a time.
 
 === New features in 1.17 ===
+
 * (bug 10183) Users can now add personal styles and scripts to all skins via
   User:<name>/common.css and /common.js (if user css/js is enabled).
 * (bug 22748) Add anchors on Special:ListGroupRights.
@@ -898,7 +1824,7 @@ are used instead.
   changes list.
 * (bug 22925) "sp-contributions-blocked-notice-anon" message now displayed when
   viewing contributions of a blocked IP address.
-* (bug 22474) {{urlencode:}} now takes an optional second paramter for type of
+* (bug 22474) {{urlencode:}} now takes an optional second parameter for type of
   escaping.
 * Special:Listfiles now supports a username parameter.
 * Special:Random carries over query string parameters.
@@ -915,16 +1841,13 @@ are used instead.
 * (bug 20976) "searchmenu-new-nocreate" message now displayed when when there
   is no title match in search and the user has no rights to create pages.
 * (bug 23429) Added new hook WatchlistEditorBuildRemoveLine.
-* (bug 22844) Added support for WinCache object caching.
-* (bug 23580) Add two new events to LivePreview so that scripts can be
-  notified about the beginning and finishing of LivePreview actions.
+* (bug 22844) Added support for WinCache object caching (for IIS).
+* (bug 23580) Add two new events to LivePreview so that scripts can be notified
+  about the beginning and finishing of LivePreview actions.
 * (bug 21278) Now the sidebar allows inclusion of wiki markup.
-* (bug 23733) Add IDs to messages used on CSS/JS pages
-* (bug 21312) RevisionMove allows moving individual revisions of a page to
-  another page. Introducing 'revisionmove' user right; disabled by default;
-  experimental feature.
+* (bug 23733) Add IDs to messages used on CSS/JS pages.
 * Show validity period of the login cookie in Special:UserLogin and
-  Special:Preferences
+  Special:Preferences.
 * Interlanguage links display the page title in their tooltip.
 * (bug 23621) New Special:ComparePages to compare (diff) two articles.
 * (bug 4597) Provide support in Special:Contributions to show only "current"
@@ -935,12 +1858,12 @@ are used instead.
 * (bug 21475) \mathtt and \textsf can now be used in <math>
 * texvc is now run via ulimit4.sh, to limit execution time.
 * SQLite now supports $wgSharedDB.
-* (bug 8507) Group file links by namespace:title on image pages
+* (bug 8507) Group file links by namespace:title on image pages.
 * Stop emitting named entities, so we can use <!DOCTYPE html> while still being
-  well-formed XML
+  well-formed XML.
 * texvc now supports \bcancel and \xcancel in addition to \cancel and \cancelto
-* Added scriptExtension setting to $wgForeignFileRepos
-* ForeignApiRepo uses scriptDirUrl if apiBase not set
+* Added scriptExtension setting to $wgForeignFileRepos.
+* ForeignApiRepo uses scriptDirUrl if apiBase not set.
 * (bug 24212) Added MediaWiki:Filepage.css which is also included on foreign
   client wikis.
 * (bug 14685) Double underscore magic word usage is now tracked in the
@@ -950,71 +1873,100 @@ are used instead.
   "mw-ipb-needreblock"
 * Non-file pages can no longer be moved to the file namespace, nor vice versa.
 * (bug 671) The <dfn>, <kbd> and <samp> elements have been whitelisted in user
-  input
-* (bug 24563) Entries on Special:WhatLinksHere now have a link to their history
-* (bug 21503) There's now a "reason" field when creating account for other users
-* (bug 24418) action=markpatrolled now requires a token
+  input.
+* (bug 21503) There's now a "reason" field when creating account for other users.
+* (bug 24418) action=markpatrolled now requires a token.
 * A variety of category sort-related fixes, including:
 ** (bug 164) In English, lowercase and uppercase letters now sort the same.
-   (This should be expanded to proper sorting for other languages before the
-   1.17 release.)
 ** (bug 1211) Subcategories, ordinary pages, and files now page separately.
 ** When several pages are given the same sort key, they sort by their names
    instead of randomly.
 * (bug 23848) Add {{ARTICLEPATH}} Magic Word.
-* JavaScript-based password complexity checker on account creation and
-  password change.
-* (bug 8140) Add dedicated CSS classes to Special:Newpages elements
-* (bug 11005) Add CSS class to empty pages in Special:Newpages
+* (bug 8140) Add dedicated CSS classes to Special:Newpages elements.
+* (bug 11005) Add CSS class to empty pages in Special:Newpages.
 * The parser cache is now shared amongst users whose different settings aren't
   used in the page.
 * Any attribute beginning with "data-" can now be used in wikitext, per HTML5.
 * (bug 24007) Diff pages now mention the number of users having edited
-  intermediate revisions
-* Added new hook GetIP
+  intermediate revisions.
+* Added new hook GetIP.
 * Special:Version now displays whether a SQLite database supports full-text
   search.
 * TS_ISO_8691_BASIC was added as a time format, which is used by ResourceLoader
-  for versioning
+  for versioning.
 * Maintenance scripts get a --memory-limit option to override defaults (which
-  is usually to set it to -1 to disable the limit)
+  is usually to set it to -1 to disable the limit).
 * (bug 25397) Allow uploading (not displaying) of WebP images, disabled
-  by default
-* (bug 23194) Special:ListFiles now has thumbnails
+  by default.
+* (bug 23194) Special:ListFiles now has thumbnails.
 * Use hreflang to specify canonical and alternate links, search engine friendly
   when a wiki has multiple variant languages.
-* (bug 19593) Specifying --server in now works for all maintenance scripts
+* (bug 19593) Specifying --server in now works for all maintenance scripts.
 * Now rebuildtextindex.php warns if SQLite doesn't support full-text search.
-* (bug 10541) Front/backend separation of installation/upgrade code
-* (bug 10596) Allow installer to enable extensions already in extensions folder
-* (bug 17394) Make installer check for latest version against MediaWiki.org
-* (bug 20627) Installer should be in languages other than English
+* (bug 10541) Front/backend separation of installation/upgrade code.
+* (bug 10596) Allow installer to enable extensions already in extensions folder.
+* (bug 20627) Installer should be in languages other than English.
 * Support for metadata in SVG files (title, description).
-* Special:Search: Add CSS classes to 'none found' and 'create link' messages
+* Special:Search: Add CSS classes to 'none found' and 'create link' messages.
 * Add CSS classes (including namespace and pagename) to the enhanced recent
-  changes/watchlist entries
+  changes/watchlist entries.
 * (bug 22463) Add hook 'SkinGetPoweredBy' to make 'powered by' icon/text
-  customizable
-* Added CSS print pagination to the print stylesheets
+  customizable.
+* Added CSS print pagination to the print stylesheets.
 * (bug 25960) Add <link rel=canonical"> for File pages of shared/foreign
   file repositories.
 * When viewing a redirect, the redirect arrow and redirection target are both
   wrapped in a div that has the class "redirectMsg" so that the redirection
-  arrow can be customized with CSS
+  arrow can be customized with CSS.
 * (bug 21911) Hard coded limit for long page warning removed. New message
   [[MediaWiki:Longpage-hint]] (empty per default) can be used instead.
   Parameters: $1 shows the formatted textsize in Byte/KB/MB, $2 is the raw
-  number of the textsize in Byte
-* (bug 3276) Give image <gallery>s fluid width
-* Added uploads link to page subtitle in Special:Contributions
-* Added Special:Myuploads special page that redirects to Special:Listfiles
+  number of the textsize in Byte.
+* (bug 3276) Give image <gallery>s fluid width.
+* Added uploads link to page subtitle in Special:Contributions.
+* Added Special:Myuploads special page that redirects to Special:Listfiles.
 * The footerlinks used in Monobook/Vector/Modern are now part of common skin
   code, SkinTemplateOutputPageBeforeExec can be used to customize the list.
 * Special wrapping setups can now define MW_CONFIG_FILE to load a config file
   other than LocalSettings.php. This is like MW_CONFIG_CALLBACK but works in
   some cases where MW_CONFIG_CALLBACK will not work.
+* (bug 26574) Added 'upload' to $wgRestrictionTypes, allowing upload protected
+  pages to be queried via the API and Special:ProtectedPages, and allowing
+  disabling upload protection by removing it from $wgRestrictionTypes.
+* The name attribute of HTMLForm fields can now be overridden by passing a
+  'name' key in the descriptor array.  Hidden field names are now treated
+  consistently with other fields and, by default, prefixed with 'wp'.
+* (bug 27402) Add support for disabling MWSuggest.
+* (bug 26563) Add bytes changed per revision for stub and full article dumps.
+* (bug 27508) Add $wgSVGMetadataCutoff to limit the maximum amount of an svg we
+  look at when finding metadata to prevent excessive resource usage.
+* (bug 198) $wgUpgradeKey allows unlocking the web installer for upgrades
+  without having to move LocalSettings.php
+* Added $wgAllowImageTag, which can be set to true to whitelist the <img> tag
+  in wikitext.
+* (bug 12797) Add $wgGalleryOptions for adjusting of default gallery display
+  options.
+* Added the $wgAllowUserCssPrefs option which allows disabling CSS-based
+  preferences; which can improve page loading speed.
+* Added $wgSQLMode for setting database SQL modes - either performance (null)
+  or other reasons (such as enabling stricter checks).
+* (bug 20193) Added $wgVectorShowVariantName global configuration variable
+  which causes Vector to render the variants drop-down menu with a label
+  showing the current variant name. This is off by default, pending further
+  research into its user experience implications.
+* The upload link for missing files can now be set separately from the
+  navigation link with $wgUploadMissingFileUrl.
+* $wgAdditionalMailParams added to allow setting extra options to mail() calls.
+* Added $wgSecureLogin to optionally login using HTTPS.
+* (bug 25728) Added $wgPasswordSenderName to make the name associated
+  with $wgPasswordSender configurable.
+* (bug 22463) $wgFooterIcons added to allow configuration of the icons shown in
+  the footers of skins.
+* $wgFileCacheDepth can be used to set the depth of the subdirectory hierarchy.
+  used for the file cache. Default value is 2, which matches former behavior.
 
 === Bug fixes in 1.17 ===
+
 * (bug 17560) Half-broken deletion moved image files to deletion archive
   without updating database.
 * (bug 22666) Submitting user block form with an invalid user name no longer
@@ -1061,7 +2013,7 @@ are used instead.
 * (bug 20049) Fixed PHP notice in search highlighter that occurs in some cases.
 * (bug 23017) Special:Disambiguations now list pages in content namespaces
   rather than only main namespace.
-* (bug 23063) $wgMaxAnimatedGifArea is checked against the total size of all
+* (bug 23063) $wgMaxAnimatedGifArea is checked against the total size of all.
   frames, and $wgMaxImageArea against the size of the first frame, rather than
   the other way around.  Both now default to 12.5 megapixels.  Also, images
   exceeding $wgMaxImageArea can still be embedded at original size.
@@ -1091,12 +2043,12 @@ are used instead.
   correct link.
 * (bug 23284) Times are now rounded correctly.
 * (bug 23375) Added ogv, oga, spx as extensions for ogg files.
-* (bug 18408) All required permissions for uploading (upload, edit, create)
+* (bug 18408) All required permissions for uploading (upload, edit, create).
   are now checked when loading Special:Upload. Toolbar link for Special:Upload
   is no longer shown if the user does not have the required permissions.
-* (Bug 23397) texvc in html mode renders \sim as &tilde; not &sim;
-* (Bug 23241) Remove License selector, because it is not used when uploading a
-  new version.
+* (bug 23397) texvc in html mode renders \sim as &tilde; not &sim;
+* (bug 23241) License selector should be disabled during upload of a new
+  version.
 * (bug 23240) Add ID to namespace selector form on Special:Watchlist.
 * The pipe | character in urls is now escaped.
 * (bug 23422) mp3 files can now be moved.
@@ -1116,145 +2068,240 @@ are used instead.
 * (bug 16573) Render \epsilon in math using images, in order to create
   consistent and correct render results.
 * (bug 22541) Support image redirects when using ForeignAPIRepo.
-* (bug 22967) Make edit summary length cut-off behave correctly for
-  multibyte characters.
-* (bug 8689) Long numeric lines no longer  kill the parser.
+* (bug 22967) Make edit summary length cut-off behave correctly for multibyte
+  characters.
+* (bug 8689) Long numeric lines no longer kill the parser.
 * (bug 23740) Article::doRedirect() now use $extraQuery parameter correctly if
-  the $noRedir parameter is set to true
+  the $noRedir parameter is set to true.
 * (bug 23688) Correct mime types for Office 2007 OpenXML documents.
-* (bug 23787) Corrected $wgDefaultSkin's comment in DefaultSettings.php
-* (bug 23797) Xml::input() now allows '0' for the value parameter
+* (bug 23787) Corrected $wgDefaultSkin's comment in DefaultSettings.php.
+* (bug 23797) Xml::input() now allows '0' for the value parameter.
 * (bug 23747) Make sure that on History pages, the RevDel button is not
-  accidently activated when hitting enter.
-* (bug 23845) Special:ListFiles now uses correct file names without underscores
-* Ask for permanent login in Special:Preferences only if $wgCookieExpiration > 0
+  accidentally activated when hitting enter.
+* (bug 23845) Special:ListFiles now uses correct file names without underscores.
+* Ask for permanent login in Special:Preferences only if $wgCookieExpiration > 0.
 * (bug 16356) Repair dumpInterwiki.inc to use proper normalization.
 * (bug 24006) deleteArchivedRevisions.php maintenance script now longer throws
-  a fatal error
+  a fatal error.
 * (bug 23465) Don't ignore the predefined destination filename on
-  Special:Upload after following a red link
+  Special:Upload after following a red link.
 * (bug 23642) Recognize mime types of MS OpenXML documents.
 * (bug 22784) Normalise underscores and spaces in autocomments.
-* (bug 19910) Headings of the form ===+\s+ are now displayed as valid headings
+* (bug 19910) Headings of the form ===+\s+ are now displayed as valid headings.
 * (bug 24022) Only check file extensions on the uploadpage when needed.
-* (bug 24076) Recognize Office 2003 files with OpenXML trailers
-* (bug 24244) Updated comments in DefaultSettings.php to reflect
+* (bug 24076) Recognize Office 2003 files with OpenXML trailers.
+* (bug 24244) Updated comments in DefaultSettings.php to reflect.
   Image: --> File: namespace rename.
 * Make wfTimestamp recognize negative unix timestamp values.
 * (bug 24401) SimpleSearch: No button/text indicating 'Search' if image is
-  disabled
-* (bug 23293) Do not show change tags when special:recentchanges(linked)
-  or special:newpages is transcluded into another page as it messes up the
-  page.
+  disabled.
+* (bug 23293) Do not show change tags when Special:RecentChanges(linked) or
+  Special:Newpages is transcluded into another page as it messes up the page.
 * (bug 24517) LocalFile::newFromKey() and OldLocalFile::newFromKey() no longer
-  throw fatal errors
+  throw fatal errors.
 * (bug 23380) Uploaded files that are larger than allowed by PHP now show a
   useful error message.
 * Uploading to a protected title will allow the user to choose a new name
-  instead of showing an error page
+  instead of showing an error page.
 * (bug 24425) Use Database::replace instead of delete/insert in
   SqlBagOStuff::set to avoid query errors about duplicate keynames.
 * (bug 15470) First letters of filenames are always capitalized by upload JS.
-* (bug 21215) NoLocalSettings.php doesn't tolerate rewrite rules
-* (bug 21052) Fix link color for stubs in NewPages
+* (bug 21215) NoLocalSettings.php doesn't tolerate rewrite rules.
+* (bug 21052) Fix link color for stubs in NewPages.
 * (bug 24714) Usage of {{#dateformat: }} in wikis without $wgUseDynamicDates no
   longer pollutes the parser cache.
 * (bug 17031) Correct which characters the parser allows in tag attributes (a
   letter, colon or underscore followed by 0 or more letters, numbers, colons,
   underscores, hyphens, and/or periods).
-* Save 200 useless queries on each category page view
-* Shell commands will now work on Linux in filesystems mounted noexec
-* (bug 24804) Corrected commafying in Polish and Ukrainian
+* Save 200 useless queries on each category page view.
+* Shell commands will now work on Linux in filesystems mounted noexec.
+* (bug 24804) Corrected commafying in Polish and Ukrainian.
 * "Difference between pages" is now displayed instead of "Difference between
-   revisions" on diffs when appropriate.
+  revisions" on diffs when appropriate.
 * (bug 23703) ForeignAPIRepo fails on findBySha1() when using a 1.14 install as
-  a repository due to missing 'name' attribute from the API list=allimages
+  a repository due to missing 'name' attribute from the API list=allimages.
 * (bug 24898) MediaWiki uses /tmp even if a vHost-specific tempdir is set, also
-  make wfTempDir() return a sane value for Windows on worst-case
+  make wfTempDir() return a sane value for Windows on worst-case.
 * (bug 24824) Support ImageMagick 6.5.6-2+ JPEG decoder size hint, to reduce
   memory usage when such an ImageMagick is used for scaling.
 * Disable multithreaded behaviour in recent ImageMagick, to avoid a deadlock
   when a resource limit such as $wgMaxShellMemory is hit.
-* (bug 24981) Allow extensions to access SpecialUpload variables again
-* (bug 20744) Wiki forgets about an uploaded file
-* (bug 17913) Don't show "older edit" when no older edit available
-* (bug 6204) TOC not properly rendered when using $wgMaxTocLevel
-* (bug 24977) The accesskey in history page now lead directly to the diff
-  instead of alterning focus between the two buttons.
-* (bug 24987) Special:ListUsers does not take external groups into account
-* (bug 20633) update.php has mixed language output
+* (bug 24981) Allow extensions to access SpecialUpload variables again.
+* (bug 20744) Wiki forgets about an uploaded file.
+* (bug 17913) Don't show "older edit" when no older edit available.
+* (bug 6204) TOC not properly rendered when using $wgMaxTocLevel.
+* (bug 24977) The accesskey in history page now lead directly to the diff.
+  instead of alternating focus between the two buttons.
+* (bug 24987) Special:ListUsers does not take external groups into account.
+* (bug 20633) update.php has mixed language output.
 * SQLite system table names are now never prefixed.
 * (bug 25292) SkinSubPageSubtitle hook now passes the Skin object as second
-  parameter
-* (bug 25167) Correctly load JS fixes for IE6 (fixing a regression in 1.16)
+  parameter.
+* (bug 25167) Correctly load JS fixes for IE6 (fixing a regression in 1.16).
 * (bug 25367) wfShellExec() is more explicit when failing due to disabled
-  passthru()
-* (bug 25462) Fix double-escaping for section edit link tooltips
+  passthru().
+* (bug 25462) Fix double-escaping for section edit link tooltips.
 * action=raw was removed for Special:Statistics. This information is still
-  available via the API
+  available via the API.
 * (bug 23934) Groups defined in $wgRevokePermissions but not in
-  $wgGroupPermissions now appear on Special:ListGroupRights
+  $wgGroupPermissions now appear on Special:ListGroupRights.
 * (bug 23923) Special:Prefixindex no longer shows results if nothing was
   requested.
-* (bug 22308) Search now finds text in default main page immediately after setup
+* (bug 22308) Search now finds text in default main page immediately after setup.
 * (bug 25697) Make sure empty lines render in diff view.
 * Use an actual minus sign in diff views, instead of a hyphen.
-* (bug 23732) Clarified "n links" message on Special:MostLinkedFiles
-* (bug 23731) Clarified "n links" message on Special:MostLinkedTemplates
+* (bug 23732) Clarified "n links" message on Special:MostLinkedFiles.
+* (bug 23731) Clarified "n links" message on Special:MostLinkedTemplates.
 * (bug 25642) A exception is now thrown instead of a fatal error when using
-  $wgSMTP without PEAR mail package
+  $wgSMTP without PEAR mail package.
 * (bug 19633) When possible, Upscale small SVGs when creating thumbnails.
-* (bug 11013) Database driver detection needs rewriting for robustness
-* (bug 13409) Installer prompts could use clarification--now has help boxes
-* (bug 16902) Installer spews warnings when exec() and dl() are not available
-* (bug 19129) Only show MyISAM/InnoDB when supported
-* (bug 17762) Only show other e-mail options when e-mail is globally enabled
-* Cache multiple sizes of InstantCommons thumbnails
+* (bug 11013) Database driver detection needs rewriting for robustness.
+* (bug 13409) Installer prompts could use clarification--now has help boxes.
+* (bug 16902) Installer spews warnings when exec() and dl() are not available.
+* (bug 19129) Only show MyISAM/InnoDB when supported.
+* (bug 17762) Only show other e-mail options when e-mail is globally enabled.
+* Cache multiple sizes of InstantCommons thumbnails.
 * (bug 25488) Disallowing anonymous users to read pages no longer throws error
-  on discussion pages with vector as default skin
-* (bug 24833) Files name in includes/diff/ are now less confusing
-* (bug 25713) SpecialPage::resolveAlias() now normalise spaces to underscores
+  on discussion pages with vector as default skin.
+* (bug 24833) Files name in includes/diff/ are now less confusing.
+* (bug 25713) SpecialPage::resolveAlias() now normalise spaces to underscores.
 * (bug 25829) Special:Mypage and Special:Mytalk now forward oldid, diff and dir
-  parameters
+  parameters.
 * (bug 25175) HTML file cache now honor $wgCacheDirectory if
-  $wgFileCacheDirectory is not set
-* (bug 13353) Diff3 version checks were too strict, did not detect working diff3
-* (bug 25843) Links to special pages using link= attribute on images are now
-  normalised like normal links to special pages
+  $wgFileCacheDirectory is not set.
+* (bug 13353) Diff3 version checks were too strict, did not detect working diff3.
+* (bug 25843) Links to special pages using link= attribute on images are now.
+  normalised like normal links to special pages.
 * (bug 21364) External links using link= attribute on images now respect
-  $wgExternalLinkTarget
+  $wgExternalLinkTarget.
 * (bug 17789) Added a note to the total views on Special:Statistics saying that
-  is doesn't count non-existing pages and special pages
-* (bug 17996) HTTP redirects are now combined when requesting a special page
+  is doesn't count non-existing pages and special pages.
+* (bug 17996) HTTP redirects are now combined when requesting a special page.
 * (bug 19944) Link on image thumbnails no longer link to "Media:" namespace in
-  some cases
+  some cases.
 * (bug 25670) wfFindFile() now checks the namespace of the given title, only
-  "File" and "Media" are allowed now
+  "File" and "Media" are allowed now.
 * (bug 25872) Rename the HttpRequest class to MWHttpRequest to avoid conflict
   with php extension that defines same class.
 * (bug 20591) There's now a different message on Special:MovePage when
   $wgFixDoubleRedirects is set to false.
 * Fixed PHP warnings when updating a broken MySQL database.
-* (bug 26023) Corrected deleteBacth.php's documentation
+* (bug 26023) Corrected deleteBacth.php's documentation.
 * (bug 25451) Improved datetime representation in 32 bit php >= 5.2.
 * Show "skin does not exist error" only when the skin is inputted in the wrong
   case.
-* (bug 26164) Potential html injection when the database server isn't available
-* (bug 26160) Upload description set by extensions are not propagated
+* (bug 26164) Potential html injection when the database server isn't available.
+* (bug 26160) Upload description set by extensions are not propagated.
 * (bug 9675) generateSitemap.php now takes an --urlpath parameter to allow
-  absolute URLs in the sitemap index (as required e.g. by Google)
+  absolute URLs in the sitemap index (as required e.g. by Google).
 * Partial workaround for bug 6220: at least make files on shared repositories
-  show up as (struck-out) bluelinks instead of redlinks on Special:WantedFiles
-* rebuildFileCache.php no longer creates inappropriate cache files for redirects
-* (bug 18372) $wgFileExtensions will now override $wgFileBlacklist
+  show up as (struck-out) bluelinks instead of redlinks on Special:WantedFiles.
+* rebuildFileCache.php no longer creates inappropriate cache files for redirects.
 * (bug 25512) Subcategory list should not include category prefix for members.
-* (bug 20244) Installer does not validate SQLite database directory for stable path
+* (bug 10871) Javascript and CSS pages in MediaWiki namespace are no longer
+  treated as wikitext on preview.
+* Page existence is now not revealed (in the colour of the tabs) to users who
+  cannot read the page in question.
+* (bug 22753) Output from update.php is more clear when things changed, entries
+  indicating nothing changed are now all prefixed by "..."
+* (bug 16019) $wgArticlePath = "/$1" no longer breaks API edit/watch actions.
+* (bug 18372) File types blacklisted by $wgFileBlacklist will no longer be shown as
+  "Permitted file types" on the upload form.
+* (bug 26540) Fixed wrong call to applyPatch in MysqlUpdater.
+* (bug 26034) Make the "View / Read" tab in content_navigation style tabs remain
+  selected when the action is "purge".
+* (bug 26733) Wrap initial table creation in transaction.
+* (bug 26208) Mark directionality of some interlanguage links.
+* (bug 26716) Provide link to instructions for external editor related preferences.
+* (bug 26961) Hide anon edits in watchlist preference now actually works.
 * (bug 1379) Installer directory conflicts with some hosts' configuration panel.
-* (bug 12070) After Installation MySQL was blocked
-* Fix XML well-formedness on a few pages when $wgHtml5 is true (the default)
-* (bug 28568) Entries in the iwlinks table are now removed on page deletion
+* (bug 27781) Installer does not warn about 5.1.x. Added a compatibility function
+  for array_key_exists().
+* Fix XML well-formedness on a few pages when $wgHtml5 is true (the default).
+* (bug 28069) MediaWiki fails streaming files when mod_deflate and ob_gzhandler
+  are also set.
+* (bug 26223) Concurrently moving an article to different titles leaks a
+  redirect revision with no page.
+* (bug 15641) Fixed permissions checks in Special:Import which allowed users
+  without the 'import' permission to import pages from configured import sources.
+* (bug 26449) Keep underlines from headings outside of tables and thumbs by
+  adding overflow:hidden to h1,h2,h3,h4,h5,h6 (also fixes editsection bunching).
+* (bug 26708) Remove background-color:white from tables in Monobook and Vector.
+* (bug 26781) {{PAGENAME}} and related parser functions escape their output better.
+* (bug 26716) Provide link to instructions for external editor related preferences
+  and add a comment to the ini control file explaining what is going on.
+* (bug 28422) Remove color:black from tables in Monobook and Vector. And add it
+  to table.wikitable instead.
+* (bug 27560) Search queries no longer fail in walloon language.
+* (bug 27700) The upload protection can now also be set for files that do not
+  exist.
+* (bug 28034) uploading file to local wiki when file exists on shared repository
+  (commons) gives spurious info in the warning message.
+* Usernames get lost when selecting different sorts on Special:listfiles.
+* (bug 28166) UploadBase assumes that 'edit' and 'upload' rights are not per
+  page restrictions.
+* (bug 28242) Make redirects generated by urls containing a local interwiki
+  prefix be a 301 instead of a 302.
+* (bug 28568) Entries in the iwlinks table are now removed on page deletion.
+* (bug 28306) Fix exposure of suppressed usernames in ForeignDBRepo.
+* (bug 28444) Fix regression: edit-on-doubleclick retains revision id again.
+* UtfNormal::cleanUp on an invalid utf-8 sequence no longer returns false if
+  intl installed.
+* (bug 26729) Category pages should return 404 if they do not exist and have no
+  members.
+* (bug 28214) When page not found, sends malformed HTTP/1.x instead of HTTP/1.1
+  in header of response.
+* (bug 27634) TOC title appears in wrong language.
+* (bug 27761) Fix regression: pages with Esperanto titles containing convertible
+  character sequences became unreachable.
+* (bug 27508) SVGMetadataExtractor takes too much resources on huge svgs.
+* (bug 27465) SVG thumbnail generation.
+* (bug 27467) preload can leave UNIQ.
+* (bug 27539) Allow attributes beginning with a digit in wiktext tag parameters.
+* (bug 27328) using relative paths in CSS imports in MediaWiki:Common.css broken
+  in 1.17.
+* (bug 27333) Fix repetitive last-seen time queries on page history.
+* (bug 26250, bug 23817) Fix wfObjectToArray() to descend into arrays; fixes
+  processing of JSON return values for ForeignAPIRepo when native json module
+  not present.
+* (bug 25675) Fix search suggestions for Special: pages with spaces.
+* (bug 25571) Xml::encodeJsVar now passes floats natively instead of converting
+  to strings.
+* (bug 27338) Gallery in 1.17 breaks for audio/video + ogghandler.
+* (bug 27302) Don't append the current timestamp for user/site modules when no
+  user/site JS/CSS is present.
+* (bug 27016) dumpTextPass.php now consider the "output" parameter.
+* (bug 22606) don't send the "someone registred an account" message when setting
+  email address (i.e. old one empty) in user preferences.
+* (bug 26458) Section edit links appear on pages that user does not have right
+  to edit.
+* (bug 28611) Don't die in SqlBagOStuff::incr() if there's a race condition.
+* (bug 16886) Sister projects box moves down the extract of the first result
+  in IE 7.
+* (bug 17398) Fixed "link" parameter in image links with "thumb" or "frame"
+  parameter.
 
 === API changes in 1.17 ===
+
+* BREAKING CHANGE: action=patrol now requires POST.
+* BREAKING CHANGE: patrol token is no longer the same as edit token.
+* BREAKING CHANGE: Session keys returned by ApiUpload are now strings instead
+  of integers.
+* BREAKING CHANGE: (bug 25303) Fix API parameter integer validation to actually
+  enforce validation on the input values in addition to giving a warning.
+  Also add flag to enforce (die) if integer out of range.
+* (bug 24650) Fix API to work with categorylinks changes.
+* action=parse now correctly returns an error for nonexistent pages.
+* (bug 27201) Special:WhatLinksHere output no longer contains duplicate IDs.
+* (bug 26560) On allusers if limit < total number of users, last user gets
+  duplicated.
+* (bug 27715) imageinfo didn't respect revdelete.
+* (bug 27479) API error when using both prop=pageprops and
+  prop=info&inprop=displaytitle.
+* (bug 27862) Useremail module didn't properly return success on success.
+* (bug 27590) prop=imageinfo now allows querying the media type.
+* (bug 27587) list=filearchive now outputs full title info.
+* (bug 27897) list=allusers and list=users list hidden users.
 * (bug 22738) Allow filtering by action type on query=logevent.
 * (bug 22764) uselang parameter for action=parse.
 * (bug 22944) API: watchlist options are inconsistent.
@@ -1272,106 +2319,106 @@ are used instead.
 * (bug 23524) Api Modules as followup to bug 14473 (Add iwlinks table to
   track inline interwiki link usage).
 * Add pltitles and tltemplates to prop=links and prop=templates respectively,
-  similar to prop=categories's clcategorie
+  similar to prop=categories's clcategorie.
 * (bug 23834) Invalid "thumbwidth" and "thumbheight" in "imageinfo" query when
-  thumbnailing larger than original image
-* (bug 23835) Need "thumbmime" result in "imageinfo" query
-* (bug 23851) Repair diff for file redirect pages
-* (bug 24009) Include implicit groups in action=query&list=users&usprop=groups
+  thumbnailing larger than original image.
+* (bug 23835) Need "thumbmime" result in "imageinfo" query.
+* (bug 23851) Repair diff for file redirect pages.
+* (bug 24009) Include implicit groups in action=query&list=users&usprop=groups.
 * (bug 24016) API: Handle parameters specified in simple string syntax
-  ( 'paramname' => 'defaultval' ) correctly when outputting help
-* (bug 24089) Logevents causes PHP Notice if leprop=title isn't supplied
-* (bug 23473) Give description of properties on all modules
+  ( 'paramname' => 'defaultval' ) correctly when outputting help.
+* (bug 24089) Logevents causes PHP Notice if leprop=title isn't supplied.
+* (bug 23473) Give description of properties on all modules.
 * (bug 24136) unknownerror when adding new section without summary, but
-  forceditsummary
-* (bug 16886) Sister projects box moves down the extract of the first result
-  in IE 7.
-* (bug 22339) Added srwhat=nearmatch to list=search to get a "go" result
+  forceditsummary.
+* (bug 22339) Added srwhat=nearmatch to list=search to get a "go" result.
 * (bug 24303) Added new &servedby parameter to all actions which adds the
   hostname that served the request to the result. It is also added
-  unconditionally on error
+  unconditionally on error.
 * (bug 24185) Titles in the Media and Special namespace are now supported for
   title normalization in action=query. Special pages have their name resolved
   to the local alias.
 * (bug 24296) Added converttitles parameter to convert titles to their
   canonical language variant.
-* (bug 17398) Fixed "link" parameter in image links with "thumb" or "frame"
-  parameter.
-* (bug 23936) Add "displaytitle" to query/info API
+* (bug 23936) Add "displaytitle" to query/info API.
 * (bug 24485) Make iwbacklinks a generator, optionally display iwprefix and
-  iwtitle
+  iwtitle.
 * (bug 24564) Fix fatal errors when using list=deletedrevs, prop=revisions or
   one of the backlinks generators with limit=max.
-* (bug 24656) API's parse module needs option to disable PP report
+* (bug 24656) API's parse module needs option to disable PP report.
 * PARAM_REQUIRED parameter flag added. If this flag is set, and the end user
   does not set the parameter, the API will automatically throw an error.
 * (bug 24665) When starttimestamp is not specified, fake it by setting it to
-  NOW, not to the timestamp of the last edit
+  NOW, not to the timestamp of the last edit.
 * (bug 24677) axto= parameters added to allcategories, allimages, alllinks,
-  allmessages, allpages, and allusers
+  allmessages, allpages, and allusers.
 * (bug 24236) Add add, remove, add-self, remove-self tags to
-  meta=siteinfo&siprop=usergroups
-* (bug 24484) Add prop=pageprops module
-* (bug 24330) Add &redirect parameter to ?action=edit
+  meta=siteinfo&siprop=usergroups.
+* (bug 24484) Add prop=pageprops module.
+* (bug 24330) Add &redirect parameter to ?action=edit.
 * (bug 24722) For list=allusers&auprop=blockinfo, only show blockedby and
   blockreason if the user is actually blocked.
-* Add format=dump and format=dumpfm, outputs results in PHP's var_dump() format
+* Add format=dump and format=dumpfm, outputs results in PHP's var_dump() format.
 * For required string parameters, if '' is provided, this is now classed as
-  missing
-* (bug 24724) list=allusers is out by 1 (shows total users - 1)
-* (bug 24166) API error when using rvprop=tags
+  missing.
+* (bug 24724) list=allusers is out by 1 (shows total users - 1).
+* (bug 24166) API error when using rvprop=tags.
 * Introduced "asynchronous download" mode for upload-by-url. Requires
   $wgAllowAsyncCopyUploads to be true.
 * sinumberingroup correctly gives size of 'user' group, and omits size of
   implicit groups rather than showing 0.
-* (bug 25248) API: paraminfo errors with certain modules
-* (bug 25303) Fix API parameter integer validation to actually enforce
-  validation on the input values in addition to giving a warning. Also add flag
-  to enforce (die) if integer out of range (breaking change!)
+* (bug 25248) API: paraminfo errors with certain modules.
 * (bug 24792) API help for action=purge sometimes wrongly stated whether a
-  POST request was needed due to cache pollution
-* Added iiprop=parsedcomment to prop=imageinfo, similar to prop=revisions
+  POST request was needed due to cache pollution.
+* Added iiprop=parsedcomment to prop=imageinfo, similar to prop=revisions.
 * Added rvparse to parse revisions. For performance reasons if this option is
   used, rvlimit is enforced to 1.
 * (bug 25748) If a action=parse request provides an oldid that is actually the
-  current revision id, try the parser cache, and save it to it if necessary
+  current revision id, try the parser cache, and save it to it if necessary.
 * (bug 25463) Export header should not be shown if no pages were requested, to
-  reduce confusion
-* (bug 25648) API discovery information has been added as RSD link in page
+  reduce confusion.
+* (bug 25648) API discovery information has been added as RSD link in page.
   <head> and by providing an API module action=rsd. Added hook
   ApiRsdServiceApis for extensions to add their own service to the services
   list.
 * The HTML of diff output markers has changed. Hyphens are now minus signs,
-  empty markers are now filled with non-breaking-space characters
-* (bug 25741) Add more data to list=search's srprop
+  empty markers are now filled with non-breaking-space characters.
+* (bug 25741) Add more data to list=search's srprop.
 * (bug 25760) counter property still reported by the API when
-  $wgDisableCounters enabled
-* (bug 25987) prop=info&inprop=watched now also works for missing pages
-* (bug 26006) prop=langlinks now allows obtaining full URL
-* (bug 26075) ApiDelete.php now calls correctly ArticleDelete hook
-* (bug 26089) add block expiration to blockinfo
+  $wgDisableCounters enabled.
+* (bug 25987) prop=info&inprop=watched now also works for missing pages.
+* (bug 26006) prop=langlinks now allows obtaining full URL.
+* (bug 26075) ApiDelete.php now calls correctly ArticleDelete hook.
+* (bug 26089) add block expiration to blockinfo.
 * (bug 26125) prop=imageinfo&iiprop=size now returns the page count if the
-  file is a multi-page file
-* (bug 10268) Added linktodiffs parameter on action=feedwatchlist
-* (bug 26219) Show API limits for multi values in description
+  file is a multi-page file.
+* (bug 10268) Added linktodiffs parameter on action=feedwatchlist.
+* (bug 26219) Show API limits for multi values in description.
+* (bug 28070) Fix watchlist RSS for databases that store timestamps in a
+  real timestamp field.
+* (bug 27722) list=filearchive now supports revdel.
 
-=== Languages updated in 1.17 ===
+=== Language support changes in 1.17 ===
 
-MediaWiki supports over 330 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Bugzilla reports.
+MediaWiki supports over 330 languages. Many localizations are updated regularly.
+
+The following languages were added:
+
+* Moroccan Spoken Arabic (ary)
+* Banjar (bjn)
+* Kabardian (kdb)
+* Kabardian (Cyrillic) (kbd-cyrl)
+* Latgalian (ltg)
+* Minangkabau (min)
+* Dutch (informal) (nl-informal)
+* Rusyn (rue)
 
-* Moroccan Spoken Arabic (ary) (new)
-* Banjar (bjn) (new)
-* Danish (dk) (removed deprecated language code)
-* Fiji Hindi (Devangari script) (removed)
-* Kabardian (kdb) (new, dummy)
-* Kabardian (Cyrillic) (kbd-cyrl) (new)
-* Latgalian (ltg) (new)
-* Minangkabau (min) (new)
-* Dutch (informal) (nl-informal) (new)
-* Rusyn (rue) (new)
+Other significant changes to MediaWiki's language support:
 
+* Fiji Hindi (Devangari script) was removed.
+* Removed deprecated language code "dk" (Danish), use "da" instead.
+* Link trail added for sl and sh.
+* (bug 27633) Add characters to linkTrail for Portuguese (pt and pt-br).
 * (bug 23156) Commafy and search normalization updated for Belarusian
   (Taraškievica).
 * (bug 23283) Native name for Old English -> Ænglisc.
@@ -1381,6 +2428,27 @@ changes to languages because of Bugzilla reports.
 * (bug 24917) Polish as fallback for Kashubia.
 * (bug 24794) Tatar link trail updated.
 * Esperanto date format corrected.
+* (bug 28159) Change interwiki name of language kbd to Къэбэрдеибзэ /
+  Qabardjajəbza.
+* (bug 28184) Namespaces for the Latgalian Wikipedia.
+* (bug 25010) Bashkir-language interwikis: linktext change from Башҡорт
+  to Башҡортса.
+* (bug 26395) Change name of Cornish language to Kernowek.
+
+=== Other changes in 1.17 ===
+
+* DatabaseFunctions.php that was needed for compatibility with pre-1.3
+  extensions has been removed.
+* XmlFunctions.php has been removed. Use the Xml or Html classes as appropriate.
+* The FailFunction "error handling" method has now been removed
+* Sysops now have the "suppressredirect" right by default
+* Removed $wgRemoteUploads. It was not well supported and superseded by
+  $wgUploadNavigationUrl.
+* (bug 26253) $wgPostCommitUpdateList has been removed
+* The PHPUnit test suite has been removed from this release due to serious issues
+  which should be resolved by the 1.18 release.
+* Oracle DB now uses the __destruct fuction to commit/close connection as it
+  doesn't commit on close if transation is triggered in OCI.
 
 == MediaWiki 1.16 ==
 
diff --git a/INSTALL b/INSTALL
index c4bb8be..e393631 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -18,7 +18,7 @@ work on Windows as well.
 
 If your PHP is configured as a CGI plug-in rather than an Apache module you may
 experience problems, as this configuration is not well tested. safe_mode is also
-not tested and unlikely to work. 
+not tested and unlikely to work.
 
 If you want math support see the instructions in math/README
 
@@ -34,7 +34,7 @@ http://www.mediawiki.org/wiki/Manual:Installation_guide
 
 ******************* WARNING *******************
 
-REMEMBER: ALWAYS BACK UP YOUR DATABASE BEFORE 
+REMEMBER: ALWAYS BACK UP YOUR DATABASE BEFORE
 ATTEMPTING TO INSTALL OR UPGRADE!!!
 
 ******************* WARNING *******************
diff --git a/README b/README
index 805b8ee..c9ce5db 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-For system requirements, installation and upgrade details, see the files 
+For system requirements, installation and upgrade details, see the files
 RELEASE-NOTES, INSTALL, and UPGRADE.
 
 == MediaWiki ==
@@ -62,7 +62,7 @@ Sections of code written exclusively by Lee Crocker or Erik Moeller are also
 released into the public domain, which does not impair the obligations of users
 under the GPL for use of the whole code or other sections thereof.
 
-MediaWiki makes use of the Sajax Toolkit by modernmethod, 
+MediaWiki makes use of the Sajax Toolkit by modernmethod,
 http://www.modernmethod.com/sajax/ which has the following license:
 
        'This work is licensed under the Creative Commons Attribution
diff --git a/README.mediawiki b/README.mediawiki
new file mode 120000 (symlink)
index 0000000..100b938
--- /dev/null
@@ -0,0 +1 @@
+README
\ No newline at end of file
diff --git a/RELEASE-NOTES-1.20 b/RELEASE-NOTES-1.20
deleted file mode 100644 (file)
index fd5c5d7..0000000
+++ /dev/null
@@ -1,384 +0,0 @@
-= MediaWiki release notes =
-
-Security reminder: MediaWiki does not require PHP's register_globals
-setting since version 1.2.0. If you have it on, turn it '''off''' if you can.
-
-== MediaWiki 1.20 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.20 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== PHP 5.3 now required ===
-Since 1.20, the lowest supported version of PHP is now 5.3.2. Please
-upgrade PHP if you have not done so prior to upgrading MediaWiki.
-
-=== Configuration changes in 1.20 ===
-* $wgGitRepositoryViewers defines a mapping from Git remote repository to the
-  Gitweb instance URL used in Special:Version.
-* `$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.
-* $wgUseCombinedLoginLink now defaults to false, making MediaWiki output separate
-  login and create account links by default.
-* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
-
-=== 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.
-* (bug 27619) Remove preference option to display broken links as link?
-* (bug 34896) jQuery JSON plugin upgraded to v2.3 (2011-09-17).
-* (bug 34302) Add CSS classes to email fields in user preferences.
-* Introduced $wgDebugDBTransactions to trace transaction status (currently PostgreSQL only).
-* (bug 23795) Add parser itself to ParserMakeImageParams hook.
-* Introduce a cryptographic random number generator source api for use when
-  generating various tokens.
-* (bug 30963) Option on Special:Prefixindex and Special:Allpages to not show redirects.
-* (bug 18062) New message when edit or create the local page of a shared file.
-* (bug 22870) Separate interface message when creating a page.
-* (bug 17615) nosummary option should be reassigned on preview/captcha.
-* (bug 34355) Add a variable and parser function for the namespace number.
-* (bug 35649) Special:Version now shows hashes of extensions checked out from git.
-* (bug 35728) Git revisions are now linked on Special:Version.
-* "Show Changes" on default messages shows now diff against default message text
-* (bug 23006) create #speciale parser function.
-* generateSitemap can now optionally skip redirect pages.
-* (bug 27757) New API command just for retrieving tokens (not page-based).
-* Added GitViewers hook for extensions using external git repositories to have a web-based
-  repository viewer linked to from Special:Version.
-* Memcached debug logs can now be sent to their own file logs by setting
-  $wgDebugLogFile['memcached'] to some filepath.
-* (bug 35685) api.php URL and other entry point URLs are now listed on
-  Special:Version
-* Edit notices can now be translated.
-* jQuery upgraded to 1.8.1
-* jQuery UI upgraded to 1.8.23.
-* QUnit upgraded from v1.2.0 to v1.10.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.
-* Added $wgLogExceptionBacktrace, on by default, to allow logging of exception
-  backtraces.
-* Added device detection for determining device capabilities.
-* QUnit.newMwEnvironment now supports passing a custom setup and/or teardown function.
-  Arguments signature has changed. First arguments is now an options object of which
-  'config' can be a property. Previously 'config' itself was the first and only argument.
-* 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.
-* 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.
-* Added new hook AfterFinalPageOutput to allow modifications to buffered page output before sent
-  to the client.
-* (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.
-* 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" (v0.3.0, http://jStorage.info/).
-* (bug 39273) Added AJAX support for "Show changes" (diff) in LivePreview.
-* Added ResourceLoader module "jquery.badge".
-* mw.util.$content now points to the overall content area in the skin rather than just
-  page text content area. If you need the old behaviour please use $( '#mw-content-text').
-* jsMessage has been replaced with a floating bubble notification system complete
-  with auto-hide, multi-message support, and message replacement tags.
-* jquery.messageBox which appears to be unused by both core and extensions has
-  been removed.
-* (bug 34939) Made link parsing insensitive ([HttP://]).
-* (bug 40072) Add CSS classes to items in output of ChangesList pages.
-
-=== Bug fixes in 1.20 ===
-* (bug 30245) Use the correct way to construct a log page title.
-* (bug 34237) Regenerate an empty user_token and save to the database
-  when we try to set the user's cookies for login.
-* (bug 32210) New edit emails for watched pages always provide a link to the
-  edit which triggered the mail.
-* (bug 12021) Added user talk link on Special:Listusers.
-* (bug 34445) section edit and TOC hide/show links are excluded from selection and
-  copy/paste on supporting browsers.
-* (bug 34428) Fixed incorrect hash mismatch errors in the DiffHistoryBlob
-  history compression method.
-* (bug 34702) Localised parentheses are now used in more special pages.
-* (bug 34723) When editing a script page on a RTL wiki the textbox should be LTR.
-* (bug 34762) Calling close() on a DatabaseBase object now clears the connection.
-* (bug 34863) Show deletion log extract on non-existent file pages if applicable.
-* (bug 28019) Let ?preloadtitle=foo be passed on to target of
-  Special:MyPage and Special:MyTalk.
-* (bug 34929) Show the correct diff when a section edit is rejected by the spam
-  filter.
-* (bug 15816) Add a switch for SETting the search_path (Postgres).
-* (bug 34521) Returning to the previous page after logging in loses any array-
-  valued parameters in the query string.
-* (bug 34735) Updated compressOld.php documentation to mention the different
-  usages of -s and -n parameters depending on compression type.
-* (bug 13896) Rendering of devanagari numbers in automatic '#' number lists.
-* (bug 33689) Upgrade to 1.19 on Postgres fails due to incomplete query when.
-  trying to defer foreign key for externallinks.
-* (bug 32748) Printer friendly version of article decode Unicode chars as a
-  pretty IRI in footer.
-* Removed white border around thumbnails in galleries.
-* (bug 31236) "Next" and "Previous" buttons are shown incorrectly in
-  an RTL environment.
-* (bug 35749) Updated maintenance/checkSyntax.php to use Git instead of
-  Subversion when invoked with the --modified option.
-* (bug 35069) On history pages, the " . . " separator after the number of
-  characters changed in a revision is now suppressed if no text would follow.
-* (bug 18704) Add a unique CSS class or ID to the tagfilter table row at RecentChanges
-* (bug 33564) transwiki import sometimes result in invalid title.
-* (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 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 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 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.
-* 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.
-* Made body-content lang attribute honor the variant language when it is set.
-* (bug 36761) "Mark pages as visited" now submits previously established filter options.
-* (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.
-* (bug 32552) Drop unused database field cat_hidden from table category.
-* (bug 40214) Category pages no longer use deprecated "width" HTML attribute.
-* (bug 39941) Add missing stylesheets to the installer pages
-* In HTML5 mode, allow new input element types values (such as color, range..)
-
-=== 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 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 39665) Cache AllowedGenerator array so it doesn't autoload all query classes
-  on every request.
-* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata
-
-=== Languages updated in 1.20 ===
-
-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.
-* (bug 34192) Namespace gender aliases for Albanian languages (sq & aln).
-* (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
-  cookies need to be set. It is also now possible to reset every user's
-  user_token simply by clearing the values in the user_token column.
-* Removed ./tests/qunit/index.html from core. It wasn't actively maintained and
-  has been made obsolete when [[Special:JavaScriptTest/qunit]] was introduced,
-  which actually uses ResourceLoader, LocalSettings and the Skin.
-* Removed $wgDBtransactions global. This was only checked in one class
-  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__ ).
-* OutputPage::wrapWikiMsg() no longer supports the 'options' parameter. It was
-  not used and complicated migration to Message class.
-
-== Compatibility ==
-
-MediaWiki 1.20 requires PHP 5.3.2. PHP 4 is no longer supported.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for IBM
-DB2 and Oracle.
-
-The supported versions are:
-
-* MySQL 5.0.2 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-
-== Upgrading ==
-
-1.20 has several database changes since 1.19, and will not work without schema
-updates.
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, some major database
-changes are made, and there is a slightly higher chance that things could
-break. Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.19.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-       https://www.mediawiki.org/wiki/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
diff --git a/RELEASE-NOTES-1.21 b/RELEASE-NOTES-1.21
new file mode 100644 (file)
index 0000000..220089d
--- /dev/null
@@ -0,0 +1,198 @@
+
+Security reminder: MediaWiki does not require PHP's register_globals. If you
+have it on, turn it '''off''' if you can.
+
+== MediaWiki 1.21 ==
+
+THIS IS NOT A RELEASE YET
+
+MediaWiki 1.21 is an alpha-quality branch and is not recommended for use in
+production.
+
+=== Configuration changes in 1.21 ===
+* (bug 29374) $wgVectorUseSimpleSearch is now enabled by default.
+* Deprecated $wgAllowRealName is removed. Use $wgHiddenPrefs[] = 'realname'
+  instead.
+
+=== New features in 1.21 ===
+* (bug 38110) Schema changes (adding or dropping tables, indicies and
+  fields) can be now be done separately from from other changes that
+  update.php makes.  This is useful in environments that use database
+  permissions to restrict schema changes but allow the DB user that
+  MediaWiki normally runs as to perform other changes that update.php
+  makes.  Schema changes can be run seperately.  See the file UPGRADE
+  for more information.
+* (bug 34876) jquery.makeCollapsible has been improved in performance.
+* Added ContentHandler facility to allow extensions to support other content
+  than wikitext. See docs/contenthandler.txt for details.
+* New feature was developed for showing high-DPI thumbnails for high-DPI mobile
+  and desktop displays (configurable with $wgResponsiveImages).
+* Added new backend to represent and store information about sites and site
+  specific configuration.
+* jQuery upgraded from 1.8.2 to 1.8.3.
+* jQuery UI upgraded from 1.8.23 to 1.8.24.
+* Added separate fa_sha1 field to filearchive table. This allows sha1
+  searches with the api in miser mode for deleted files.
+* Add initial and programmatic sorting for tablesorter.
+* Add the event "sortEnd.tablesorter", triggered after sorting has completed.
+* The Job system was refactored to allow for different backing stores for
+  queues as well as cross-wiki access to queues, among other things. The schema
+  for the DB queue was changed to support better concurrency and reduce
+  deadlock errors.
+* Added ApiQueryORM class to facilitate creation of query API modules based on
+  tables that have a corresponding ORMTable class.
+* (bug 40876) Icon for PSD (Adobe Photoshop) file types.
+* (bug 40641) Implemented Special:Version/Credits with a list of contributors.
+* (bug 7851) Implemented one-click AJAX patrolling.
+* The <data>, <time>, <meta>, and <link> elements are allowed within WikiText
+  for use with Microdata.
+* The HTML5 <mark> tag has been whitelisted.
+* Added ParserCloned hook for when the Parser object is cloned.
+* Added AlternateEditPreview hook to allow extensions to replace the page
+  preview from the edit page.
+* Added EditPage::showStandardInputs:options hook to allow extensions to add
+  new fields to the "editOptions" area of the edit form.
+* Upload stash DB schema altered to improve upload performance.
+* The following global functions are now reporting deprecated warnings in
+  debug mode: wfMsg, wfMsgNoTrans, wfMsgForContent, wfMsgForContentNoTrans,
+  wfMsgReal, wfMsgGetKey, wfMsgHtml, wfMsgWikiHtml, wfMsgExt, wfEmptyMsg. Use
+  the Message class, or the global method wfMessage.
+
+=== Bug fixes in 1.21 ===
+* (bug 40353) SpecialDoubleRedirect should support interwiki redirects.
+* (bug 40352) fixDoubleRedirects.php should support interwiki redirects.
+* (bug 9237) SpecialBrokenRedirect should not list interwiki redirects.
+* (bug 34960) Drop unused fields rc_moved_to_ns and rc_moved_to_title from
+  recentchanges table.
+* (bug 32951) Do not register internal externals with absolute protocol,
+  when server has relative protocol.
+* (bug 39005) When purging proxies listed in $wgSquidServers using HTTP PURGE
+  method requests, we now send a Host header by default, for Varnish
+  compatibility. This also works with Squid in reverse-proxy mode. If you wish
+  to support Squid configured in forward-proxy mode, set
+  $wgSquidPurgeUseHostHeader to false.
+* (bug 37020) sql.php with readline eats semicolon.
+* (bug 11748) Properly handle optionally-closed HTML tags when Tidy is
+  disabled, and don't wrap HTML-syntax definition lists in paragraphs.
+* (bug 41409) Diffs while editing an old revision should again diff against the
+  current revision.
+* (bug 41494) Honor $wgLogExceptionBacktrace when logging non-API exceptions
+  caught during API execution.
+* (bug 37963) Fixed loading process for user options.
+* (bug 26995) Update filename field on Upload page after having sanitized it.
+* (bug 41793) Contribution links to users with 0 edits on Special:ListUsers
+  didn't show up red.
+* (bug 41899) A PHP notice no longer occurs when using the "rvcontinue" API
+  parameter.
+* (bug 42036) Account creation emails now contain canonical (not
+  protocol-relative) URLs.
+* (bug 41990) Fix regression: API edit with redirect=true and lacking
+  starttimestamp and basetimestamp should not cause an edit conflict.
+* (bug 41706) EditPage: Preloaded page should be converted if possible and
+  needed.
+* (bug 41886) Rowspans are no longer exploded by tablesorter until the table is
+  actually sorted.
+* (bug 2865)  User interface HTML elements don't use lang attribute
+  (completed the fix by adding the lang attribute to firstHeading).
+* (bug 42173) Removed namespace prefixes on Special:UncategorizedCategories.
+* (bug 36053) Log in "returnto" feature forgets query parameters if no
+  title parameter was specified.
+* (bug 42410) API action=edit now returns correct timestamp for the new edit.
+* (bug 14901) Email notification mistakes log action for new page creation.
+  Enotif no longer sends "page has been created" notifications for some log
+  actions. The following events now have a correct message: page creation,
+  deletion, move, restore (undeletion), change (edit).
+* (bug 457) In the sidebar of Vector, CologneBlue, Monobook, and Monobook-based
+  skins, the heading levels have been changed from (variously per skin)
+  <h4>, <h5> or <h6> to only <h3>s, with a <h2> hidden heading above them.
+  If you are styling or scripting the headings in a custom way, this change
+  will require updates to your site's CSS or JS.
+
+=== API changes in 1.21 ===
+* prop=revisions can now report the contentmodel and contentformat.
+  See docs/contenthandler.txt.
+* action=edit and action=parse now support contentmodel and contentformat
+  parameters to control the interpretation of page content.
+  See docs/contenthandler.txt for details.
+* (bug 35693) ApiQueryImageInfo now suppresses errors when unserializing metadata.
+* (bug 40111) Disable minor edit for page/section creation by API.
+* (bug 41042) Revert change to action=parse&page=... behavior when the page
+  does not exist.
+* (bug 27202) Add timestamp sort to list=allimages.
+
+=== Languages updated in 1.21 ===
+
+MediaWiki supports over 350 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Bugzilla reports.
+
+* South Azerbaijani (azb) added.
+* (bug 30040) Autonym for nds-nl is now 'Nedersaksies' (was 'Nedersaksisch').
+* (bug 34977) Now formatted numbers in Spanish use space as separator
+  for thousands, as mandated by the Real Academia Española.
+* (bug 35031) Kurdish formatted numbers now use period and comma
+  as separators for thousands and decimals respectively.
+
+=== Other changes in 1.21 ===
+
+== Compatibility ==
+
+MediaWiki 1.21 requires PHP 5.3.2 or later.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for IBM
+DB2 and Oracle.
+
+The supported versions are:
+
+* MySQL 5.0.2 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+
+== Upgrading ==
+
+1.21 has several database changes since 1.20, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, some major database
+changes are made, and there is a slightly higher chance that things could
+break. Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.19.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
index 6bce634..ba8fe8b 100644 (file)
@@ -12,7 +12,7 @@
  *   } else {
  *       $wgProfiler['class'] = 'ProfilerStub';
  *   }
- * 
+ *
  * Configuration of the profiler output can be done in LocalSettings.php
  */
 
diff --git a/UPGRADE b/UPGRADE
index cdaf4f9..3e3cb13 100644 (file)
--- a/UPGRADE
+++ b/UPGRADE
@@ -51,10 +51,15 @@ deleted file archives, and any custom skins.
 
 === Perform the database upgrade ===
 
+As of 1.21, it is possible to separate schema changes (i.e. adding,
+dropping, or changing tables, fields, or indices) from all other
+database changes (e.g. populating fields).  If you need this
+capability, see "From the command line" below.
+
 ==== From the web ====
 
-If you browse to the web-based installation script (usually at 
-/mw-config/index.php) from your wiki installation you can follow the script and 
+If you browse to the web-based installation script (usually at
+/mw-config/index.php) from your wiki installation you can follow the script and
 upgrade your database in place.
 
 ==== From the command line ====
@@ -64,6 +69,12 @@ update.php script to check and update the schema. This will insert missing
 tables, update existing tables, and move data around as needed. In most cases,
 this is successful and nothing further needs to be done.
 
+If you need to separate out the schema changes so they can be run
+by someone with more privileges, then you can use the --schema option
+to produce a text file with the necessary commands.  You can use
+--schema, --noschema, $wgAllowSchemaUpdates as well as proper database
+permissions to enforce this separation.
+
 === Check configuration settings ===
 
 The names of configuration variables, and their default values and purposes,
@@ -141,7 +152,7 @@ the web upgrader.
 
 If you absolutely cannot make the UTF-8 upgrade work, you can try
 doing it by hand: dump your old database, convert the dump file
-using iconv as described here: 
+using iconv as described here:
 http://portal.suse.com/sdb/en/2004/05/jbartsh_utf-8.html
 and then reimport it. You can also convert filenames using convmv,
 but note that the old directory hashes will no longer be valid,
diff --git a/bin/svnstat b/bin/svnstat
deleted file mode 100755 (executable)
index 5a2c940..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/sh
-svn stat -v $1 | sed -n 's/^[ A-Z?\*|!]\{1,15\}[0-9]\{1,10\} \{1,15\}/r/;s/ .*//p'
diff --git a/bin/ulimit-tvf.sh b/bin/ulimit-tvf.sh
deleted file mode 100755 (executable)
index 8a1eb81..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-ulimit -t $1 -v $2 -f $3
-shift 3
-"$@"
-
diff --git a/bin/ulimit.sh b/bin/ulimit.sh
deleted file mode 100644 (file)
index 7a1925c..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-ulimit -t $1
-ulimit -v $2
-shift 2
-"$@"
-
diff --git a/docs/contenthandler.txt b/docs/contenthandler.txt
new file mode 100644 (file)
index 0000000..899554a
--- /dev/null
@@ -0,0 +1,184 @@
+The ContentHandler facility adds support for arbitrary content types on wiki pages, instead of relying on wikitext
+for everything. It was introduced in MediaWiki 1.21.
+
+Each kind of content ("content model") supported by MediaWiki is identified by unique name. The content model determines
+how a page's content is rendered, compared, stored, edited, and so on.
+
+Built-in content types are:
+
+* wikitext - wikitext, as usual
+* javascript - user provided javascript code
+* css - user provided css code
+* text - plain text
+
+In PHP, use the corresponding CONTENT_MODEL_XXX constant.
+
+A page's content model is available using the Title::getContentModel() method. A page's default model is determined by
+ContentHandler::getDefaultModelFor($title) as follows:
+
+* The global setting $wgNamespaceContentModels specifies a content model for the given namespace.
+* The hook ContentHandlerDefaultModelFor may be used to override the page's default model.
+* Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript model if they end in .js or .css, respectively.
+  Pages in NS_MEDIAWIKI default to the wikitext model otherwise.
+* The hook TitleIsCssOrJsPage may be used to force a page to use the CSS or JavaScript model.
+  This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
+* The hook TitleIsWikitextPage may be used to force a page to use the wikitext model.
+  This is a compatibility feature. The ContentHandlerDefaultModelFor hook should be used instead if possible.
+* Otherwise, the wikitext model is used.
+
+Note that is currently no mechanism to convert a page from one content model to another, and there is no guarantee that
+revisions of a page will all have the same content model. Use Revision::getContentModel() to find it.
+
+
+== Architecture ==
+
+Two class hierarchies are used to provide the functionality associated with the different content models:
+
+* Content interface (and AbstractContent base class) define functionality that acts on the concrete content of a page, and
+* ContentHandler base class provides functionality specific to a content model, but not acting on concrete content.
+
+The most important function of ContentHandler is to act as a factory for the appropriate implementation of Content. These
+Content objects are to be used by MediaWiki everywhere, instead of passing page content around as text. All manipulation
+and analysis of page content must be done via the appropriate methods of the Content object.
+
+For each content model, a subclass of ContentHandler has to be registered with $wgContentHandlers. The ContentHandler
+object for a given content model can be obtained using ContentHandler::getForModelID( $id ). Also Title, WikiPage and
+Revision now have getContentHandler() methods for convenience.
+
+ContentHandler objects are singletons that provide functionality specific to the content type, but not directly acting
+on the content of some page. ContentHandler::makeEmptyContent() and ContentHandler::unserializeContent() can be used to
+create a Content object of the appropriate type. However, it is recommended to instead use WikiPage::getContent() resp.
+Revision::getContent() to get a page's content as a Content object. These two methods should be the ONLY way in which
+page content is accessed.
+
+Another important function of ContentHandler objects is to define custom action handlers for a content model, see
+ContentHandler::getActionOverrides(). This is similar to what WikiPage::getActionOverrides() was already doing.
+
+
+== Serialization ==
+
+With the ContentHandler facility, page content no longer has to be text based. Objects implementing the Content interface
+are used to represent and handle the content internally. For storage and data exchange, each content model supports
+at least one serialization format via ContentHandler::serializeContent( $content ). The list of supported formats for
+a given content model can be accessed using ContentHandler::getSupportedFormats().
+
+Content serialization formats are identified using MIME type like strings. The following formats are built in:
+
+* text/x-wiki - wikitext
+* text/javascript - for js pages
+* text/css - for css pages
+* text/plain - for future use, e.g. with plain text messages.
+* text/html - for future use, e.g. with plain html messages.
+* application/vnd.php.serialized - for future use with the api and for extensions
+* application/json - for future use with the api, and for use by extensions
+* application/xml - for future use with the api, and for use by extensions
+
+In PHP, use the corresponding CONTENT_FORMAT_XXX constant.
+
+Note that when using the API to access page content, especially action=edit, action=parse and action=query&prop=revisions,
+the model and format of the content should always be handled explicitly. Without that information, interpretation of
+the provided content is not reliable. The same applies to XML dumps generated via maintenance/dumpBackup.php or
+Special:Export.
+
+Also note that the API will provide encapsulated, serialized content - so if the API was called with format=json, and
+contentformat is also json (or rather, application/json), the page content is represented as a string containing an
+escaped json structure. Extensions that use JSON to serialize some types of page content may provide specialized API
+modules that allow access to that content in a more natural form.
+
+
+== Compatibility ==
+
+The ContentHandler facility is introduced in a way that should allow all existing code to keep functioning at least
+for pages that contain wikitext or other text based content. However, a number of functions and hooks have been
+deprecated in favor of new versions that are aware of the page's content model, and will now generate warnings when
+used.
+
+Most importantly, the following functions have been deprecated:
+
+* Revisions::getText() and Revisions::getRawText() is deprecated in favor Revisions::getContent()
+* WikiPage::getText() is deprecated in favor WikiPage::getContent()
+
+Also, the old Article::getContent() (which returns text) is superceded by Article::getContentObject(). However, both
+methods should be avoided since they do not provide clean access to the page's actual content. For instance, they may
+return a system message for non-existing pages. Use WikiPage::getContent() instead.
+
+Code that relies on a textual representation of the page content should eventually be rewritten. However,
+ContentHandler::getContentText() provides a stop-gap that can be used to get text for a page. Its behavior is controlled
+by $wgContentHandlerTextFallback; per default it will return the text for text based content, and null for any other
+content.
+
+For rendering page content, Content::getParserOutput() should be used instead of accessing the parser directly.
+ContentHandler::makeParserOptions() can be used to construct appropriate options.
+
+
+Besides some functions, some hooks have also been replaced by new versions (see hooks.txt for details).
+These hooks will now trigger a warning when used:
+
+* ArticleAfterFetchContent was replaced by ArticleAfterFetchContentObject
+* ArticleInsertComplete was replaced by PageContentInsertComplete
+* ArticleSave was replaced by PageContentSave
+* ArticleSaveComplete was replaced by PageContentSaveComplete
+* ArticleViewCustom was replaced by ArticleContentViewCustom (also consider a custom implementation of the view action)
+* EditFilterMerged was replaced by EditFilterMergedContent
+* EditPageGetDiffText was replaced by EditPageGetDiffContent
+* EditPageGetPreviewText was replaced by EditPageGetPreviewContent
+* ShowRawCssJs was deprecated in favor of custom rendering implemented in the respective ContentHandler object.
+
+
+== Database Storage ==
+
+Page content is stored in the database using the same mechanism as before. Non-text content is serialized first. The
+appropriate serialization and deserialization is handled by the Revision class.
+
+Each revision's content model and serialization format is stored in the revision table (resp. in the archive table, if
+the revision was deleted). The page's (current) content model (that is, the content model of the latest revision) is also
+stored in the page table.
+
+Note however that the content model and format is only stored if it differs from the page's default, as determined by
+ContentHandler::getDefaultModelFor( $title ). The default values are represented as NULL in the database, to preserve
+space.
+
+Storage of content model and format can be disabled altogether by setting $wgContentHandlerUseDB = false. In that case,
+the page's default model (and the model's default format) will be used everywhere. Attempts to store a revision of a page
+using a model or format different from the default will result in an error.
+
+
+== Globals ==
+
+There are some new globals that can be used to control the behavior of the ContentHandler facility:
+
+* $wgContentHandlers associates content model IDs with the names of the appropriate ContentHandler subclasses.
+
+* $wgNamespaceContentModels maps namespace IDs to a content model that should be the default for that namespace.
+
+* $wgContentHandlerUseDB determines whether each revision's content model should be stored in the database.
+  Defaults is true.
+
+* $wgContentHandlerTextFallback determines how the compatibility method ContentHandler::getContentText() will behave for
+  non-text content:
+    'ignore'     causes null to be returned for non-text content (default).
+    'serialize'  causes the serialized form of any non-text content to be returned (scary).
+    'fail'       causes an exception to be thrown for non-text content (strict).
+
+
+== Caveats ==
+
+There are some changes in behavior that might be surprising to users:
+
+* Javascript and CSS pages are no longer parsed as wikitext (though pre-save transform is still applied). Most
+importantly, this means that links, including categorization links, contained in the code will not work.
+
+* With $wgContentHandlerUseDB = false, pages can not be moved in a way that would change the
+default model. E.g. [[MediaWiki:foo.js]] can not be moved to [[MediaWiki:foo bar]], but can still be moved to
+[[User:John/foo.js]]. Also, in this mode, changing the default content model for a page (e.g. by changing
+$wgNamespaceContentModels) may cause it to become inaccessible.
+
+* action=edit will fail for pages with non-text content, unless the respective ContentHandler implementation has
+provided a specialized handler for the edit action. This is true for the API as well.
+
+* action=raw will fail for all non-text content. This seems better than serving content in other formats to an
+unsuspecting recipient. This will also cause client-side diffs to fail.
+
+* File pages provide their own action overrides that do not combine gracefully with any custom handlers defined by a
+ContentHandler. If for example a File page used a content model with a custom revert action, this would be overridden by
+WikiFilePage's handler for the revert action.
diff --git a/docs/export-0.8.xsd b/docs/export-0.8.xsd
new file mode 100644 (file)
index 0000000..07b432a
--- /dev/null
@@ -0,0 +1,289 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+       This is an XML Schema description of the format
+       output by MediaWiki's Special:Export system.
+
+       Version 0.2 adds optional basic file upload info support,
+       which is used by our OAI export/import submodule.
+
+       Version 0.3 adds some site configuration information such
+       as a list of defined namespaces.
+
+       Version 0.4 adds per-revision delete flags, log exports,
+       discussion threading data, a per-page redirect flag, and
+       per-namespace capitalization.
+
+       Version 0.5 adds byte count per revision.
+
+       Version 0.6 adds a separate namespace tag, and resolves the
+       redirect target and adds a separate sha1 tag for each revision.
+
+       Version 0.7 adds a unique identity constraint for both page and
+       revision identifiers. See also bug 4220.
+       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"
+
+       Version 0.8 adds support for a <model> and a <format> tag for
+       each revision. See contenthandler.txt.
+
+       The canonical URL to the schema document is:
+       http://www.mediawiki.org/xml/export-0.8.xsd
+
+       Use the namespace:
+       http://www.mediawiki.org/xml/export-0.8/
+-->
+<schema xmlns="http://www.w3.org/2001/XMLSchema"
+               xmlns:mw="http://www.mediawiki.org/xml/export-0.8/"
+               targetNamespace="http://www.mediawiki.org/xml/export-0.8/"
+               elementFormDefault="qualified">
+
+       <annotation>
+               <documentation xml:lang="en">
+                       MediaWiki's page export format
+               </documentation>
+       </annotation>
+
+       <!-- Need this to reference xml:lang -->
+       <import namespace="http://www.w3.org/XML/1998/namespace"
+                       schemaLocation="http://www.w3.org/2001/xml.xsd" />
+
+       <!-- Our root element -->
+       <element name="mediawiki" type="mw:MediaWikiType">
+               <!-- Page ID contraint, see bug 4220 -->
+               <unique name="PageIDConstraint">
+                       <selector xpath="mw:page" />
+                       <field xpath="mw:id" />
+               </unique>
+               <!-- Revision ID contraint, see bug 4220 -->
+               <unique name="RevIDConstraint">
+                       <selector xpath="mw:page/mw:revision" />
+                       <field xpath="mw:id" />
+               </unique>
+       </element>
+
+       <complexType name="MediaWikiType">
+               <sequence>
+                       <element name="siteinfo" type="mw:SiteInfoType"
+                                        minOccurs="0" maxOccurs="1" />
+                       <element name="page" type="mw:PageType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+                       <element name="logitem" type="mw:LogItemType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+               </sequence>
+               <attribute name="version" type="string" use="required" />
+               <attribute ref="xml:lang" use="required" />
+       </complexType>
+
+       <complexType name="SiteInfoType">
+               <sequence>
+                       <element name="sitename" type="string" minOccurs="0" />
+                       <element name="base" type="anyURI" minOccurs="0" />
+                       <element name="generator" type="string" minOccurs="0" />
+                       <element name="case" type="mw:CaseType" minOccurs="0" />
+                       <element name="namespaces" type="mw:NamespacesType" minOccurs="0" />
+               </sequence>
+       </complexType>
+
+       <simpleType name="CaseType">
+               <restriction base="NMTOKEN">
+                       <!-- Cannot have two titles differing only by case of first letter. -->
+                       <!-- Default behavior through 1.5, $wgCapitalLinks = true -->
+                       <enumeration value="first-letter" />
+
+                       <!-- Complete title is case-sensitive -->
+                       <!-- Behavior when $wgCapitalLinks = false -->
+                       <enumeration value="case-sensitive" />
+
+                       <!-- Cannot have non-case senstitive titles eg [[FOO]] == [[Foo]] -->
+                       <!-- Not yet implemented as of MediaWiki 1.18 -->
+                       <enumeration value="case-insensitive" />
+               </restriction>
+       </simpleType>
+
+       <simpleType name="DeletedFlagType">
+               <restriction base="NMTOKEN">
+                       <enumeration value="deleted" />
+               </restriction>
+       </simpleType>
+
+       <complexType name="NamespacesType">
+               <sequence>
+                       <element name="namespace" type="mw:NamespaceType"
+                                        minOccurs="0" maxOccurs="unbounded" />
+               </sequence>
+       </complexType>
+
+       <complexType name="NamespaceType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute name="key" type="integer" />
+                               <attribute name="case" type="mw:CaseType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="RedirectType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute name="title" type="string" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <simpleType name="ContentModelType">
+               <restriction base="string">
+                       <pattern value="[a-zA-Z][-+./a-zA-Z0-9]*" />
+               </restriction>
+       </simpleType>
+
+       <simpleType name="ContentFormatType">
+               <restriction base="string">
+                       <pattern value="[a-zA-Z][-+.a-zA-Z0-9]*/[a-zA-Z][-+.a-zA-Z0-9]*" />
+               </restriction>
+       </simpleType>
+
+       <complexType name="PageType">
+               <sequence>
+                       <!-- Title in text form. (Using spaces, not underscores; with namespace ) -->
+                       <element name="title" type="string" />
+
+                       <!-- Namespace in canonical form -->
+                       <element name="ns" type="nonNegativeInteger" />
+
+                       <!-- optional page ID number -->
+                       <element name="id" type="positiveInteger" />
+
+                       <!-- flag if the current revision is a redirect -->
+                       <element name="redirect" type="mw:RedirectType" minOccurs="0" maxOccurs="1" />
+
+                       <!-- comma-separated list of string tokens, if present -->
+                       <element name="restrictions" type="string" minOccurs="0" />
+
+                       <!-- Zero or more sets of revision or upload data -->
+                       <choice minOccurs="0" maxOccurs="unbounded">
+                               <element name="revision" type="mw:RevisionType" />
+                               <element name="upload" type="mw:UploadType" />
+                       </choice>
+
+                       <!-- Zero or One sets of discussion threading data -->
+                       <element name="discussionthreadinginfo" minOccurs="0" maxOccurs="1" type="mw:DiscussionThreadingInfo" />
+               </sequence>
+       </complexType>
+
+       <complexType name="RevisionType">
+               <sequence>
+                       <element name="id" type="positiveInteger" />
+                       <element name="parentid" type="positiveInteger" minOccurs="0" />
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="minor" minOccurs="0" maxOccurs="1" />
+                       <element name="comment" type="mw:CommentType" minOccurs="0" maxOccurs="1" />
+                       <element name="text" type="mw:TextType" />
+                       <element name="sha1" type="string" />
+                       <element name="model" type="mw:ContentModelType" />
+                       <element name="format" type="mw:ContentFormatType" />
+               </sequence>
+       </complexType>
+
+       <complexType name="LogItemType">
+               <sequence>
+                       <element name="id" type="positiveInteger" />
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="comment" type="mw:CommentType" minOccurs="0" />
+                       <element name="type" type="string" />
+                       <element name="action" type="string" />
+                       <element name="text" type="mw:LogTextType" minOccurs="0" maxOccurs="1" />
+                       <element name="logtitle" type="string" minOccurs="0" maxOccurs="1" />
+                       <element name="params" type="mw:LogParamsType" minOccurs="0" maxOccurs="1" />
+               </sequence>
+       </complexType>
+
+       <complexType name="CommentType">
+               <simpleContent>
+                       <extension base="string">
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="TextType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute ref="xml:space" use="optional" default="preserve" />
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                               <!-- This isn't a good idea; we should be using "ID" instead of "NMTOKEN" -->
+                               <!-- However, "NMTOKEN" is strictest definition that is both compatible with existing -->
+                               <!-- usage ([0-9]+) and with the "ID" type. -->
+                               <attribute name="id" type="NMTOKEN" />
+                               <attribute name="bytes" use="optional" type="nonNegativeInteger" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="LogTextType">
+               <simpleContent>
+                       <extension base="string">
+                               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+                               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="LogParamsType">
+               <simpleContent>
+                       <extension base="string">
+                               <attribute ref="xml:space" use="optional" default="preserve" />
+                       </extension>
+               </simpleContent>
+       </complexType>
+
+       <complexType name="ContributorType">
+               <sequence>
+                       <element name="username" type="string" minOccurs="0" />
+                       <element name="id" type="nonNegativeInteger" minOccurs="0" />
+
+                       <element name="ip" type="string" minOccurs="0" />
+               </sequence>
+               <!-- This allows deleted=deleted on non-empty elements, but XSD is not omnipotent -->
+               <attribute name="deleted" use="optional" type="mw:DeletedFlagType" />
+       </complexType>
+
+       <complexType name="UploadType">
+               <sequence>
+                       <!-- Revision-style data... -->
+                       <element name="timestamp" type="dateTime" />
+                       <element name="contributor" type="mw:ContributorType" />
+                       <element name="comment" type="string" minOccurs="0" />
+
+                       <!-- Filename. (Using underscores, not spaces. No 'File:' namespace marker.) -->
+                       <element name="filename" type="string" />
+
+                       <!-- URI at which this resource can be obtained -->
+                       <element name="src" type="anyURI" />
+
+                       <element name="size" type="positiveInteger" />
+
+                       <!-- TODO: add other metadata fields -->
+               </sequence>
+       </complexType>
+
+       <!-- Discussion threading data for LiquidThreads -->
+       <complexType name="DiscussionThreadingInfo">
+               <sequence>
+                       <element name="ThreadSubject" type="string" />
+                       <element name="ThreadParent" type="positiveInteger" />
+                       <element name="ThreadAncestor" type="positiveInteger" />
+                       <element name="ThreadPage" type="string" />
+                       <element name="ThreadID" type="positiveInteger" />
+                       <element name="ThreadAuthor" type="string" />
+                       <element name="ThreadEditStatus" type="string" />
+                       <element name="ThreadType" type="string" />
+               </sequence>
+       </complexType>
+
+</schema>
index d198b93..591f675 100644 (file)
@@ -1,4 +1,4 @@
-<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en">
+<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="en">
   
   <!-- Optional global configuration info -->
   <siteinfo>
       </contributor>
       <minor />
       <comment>I have just one thing to say!</comment>
-      <sha1>5x0ux8iwjrbmfzgv6pkketxgkcnpr7h</sha1>
       <text xml:space="preserve" bytes="25">A bunch of [[text]] here.</text>
+      <sha1>5x0ux8iwjrbmfzgv6pkketxgkcnpr7h</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
     </revision>
     
     <revision>
         <ip>10.0.0.2</ip>
       </contributor>
       <comment>new!</comment>
-      <sha1>etaxt3shcge6igz1biwy3d4um2pnle4</sha1>
       <text xml:space="preserve" bytes="24">An earlier [[revision]].</text>
+      <sha1>etaxt3shcge6igz1biwy3d4um2pnle4</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
     </revision>
   </page>
   
       <timestamp>2001-01-15T14:03:00Z</timestamp>
       <contributor><ip>10.0.0.2</ip></contributor>
       <comment>hey</comment>
-      <sha1>ml80vmyjlixdstnywwihx003exfzq9j</sha1>
       <text xml:space="preserve" bytes="47">WHYD YOU LOCK PAGE??!!! i was editing that jerk</text>
+      <sha1>ml80vmyjlixdstnywwihx003exfzq9j</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
     </revision>
   </page>
   
       <timestamp>2001-01-15T20:34:12Z</timestamp>
       <contributor><username>Foobar</username><id>42</id></contributor>
       <comment>My awesomeest image!</comment>
-      <sha1>mehom37npwkpzhaiwu3wyr0egalumki</sha1>
       <text xml:space="preserve" bytes="52">This is an awesome little imgae. I lurves it. {{PD}}</text>
+      <sha1>mehom37npwkpzhaiwu3wyr0egalumki</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
     </revision>
     <upload>
       <timestamp>2001-01-15T20:34:12Z</timestamp>
index 5207730..c53baef 100644 (file)
@@ -283,6 +283,11 @@ $article: Article object
 $user: the User object that was created. (Parameter added in 1.7)
 $byEmail: true when account was created "by email" (added in 1.12)
 
+'AfterFinalPageOutput': At the end of OutputPage::output() but before
+final ob_end_flush() which will send the buffered output to the client.
+This allows for last-minute modification of the output within the buffer
+by using ob_get_clean().
+
 'AfterImportPage': When a page import is completed
 $title: Title under which the revisions were imported
 $origTitle: Title provided by the XML file
@@ -305,6 +310,15 @@ before showing the edit form ( EditPage::edit() ). This is triggered
 on &action=edit.
 $EditPage: the EditPage object
 
+'AlternateEditPreview': before generating the preview of the page when editing
+( EditPage::getPreviewText() ).
+$EditPage: the EditPage object
+&$content: the Content object for the text field from the edit page
+&$previewHTML: Text to be placed into the page for the preview
+&$parserOutput: the ParserOutput object for the preview
+return false and set $previewHTML and $parserOutput to output custom page
+preview HTML.
+
 'AlternateUserMailer': Called before mail is sent so that mail could
 be logged (or something else) instead of using PEAR or PHP's mail().
 Return false to skip the regular method of sending mail.  Return a
@@ -429,9 +443,14 @@ token types.
 used to retrieve this type of tokens.
 
 'ArticleAfterFetchContent': after fetching content of an article from
+the database. DEPRECATED, use ArticleAfterFetchContentObject instead.
+$article: the article (object) being loaded from the database
+&$content: the content (string) of the article
+
+'ArticleAfterFetchContentObject': after fetching content of an article from
 the database
 $article: the article (object) being loaded from the database
-$content: the content (string) of the article
+&$content: the content of the article, as a Content object
 
 'ArticleConfirmDelete': before writing the confirmation form for article
        deletion
@@ -445,7 +464,7 @@ Use this to change the content in this area or how it is loaded.
  $output: the OutputPage object ($wgOut)
 
 'ArticleDelete': before an article is deleted
-$article: the WikiPage (object) being deleted
+$wikiPage: the WikiPage (object) being deleted
 $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
@@ -454,40 +473,42 @@ $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
+$wikiPage: the WikiPage that was deleted
 $user: the user that deleted the article
 $reason: the reason the article was deleted
 $id: id of the article that was deleted
+$content: the Content of the deleted page
+$logEntry: the ManualLogEntry used to record the deletion
 
 'ArticleEditUpdateNewTalk': before updating user_newtalk when a user talk page
 was changed
-$article: WikiPage (object) of the user talk page
+$wikiPage: WikiPage (object) of the user talk page
 
 'ArticleEditUpdates': when edit updates (mainly link tracking) are made when an
 article has been changed
-$article: the WikiPage (object)
+$wikiPage: the WikiPage (object)
 $editInfo: data holder that includes the parser output ($editInfo->output) for
 that page after the change
 $changed: bool for if the page was changed
 
 'ArticleEditUpdatesDeleteFromRecentchanges': before deleting old entries from
 recentchanges table, return false to not delete old entries
-$article: WikiPage (object) being modified
+$wikiPage: WikiPage (object) being modified
 
 'ArticleFromTitle': when creating an article object from a title object using
 Wiki::articleFromTitle()
 $title: title (object) used to create the article object
 $article: article (object) that will be returned
 
-'ArticleInsertComplete': After a new article is created
-$article: WikiPage created
+'ArticleInsertComplete': After a new article is created. DEPRECATED, use PageContentInsertComplete
+$wikiPage: WikiPage created
 $user: User creating the article
 $text: New content
 $summary: Edit summary/comment
 $isMinor: Whether or not the edit was marked as minor
 $isWatch: (No longer used)
 $section: (No longer used)
-$flags: Flags passed to Article::doEdit()
+$flags: Flags passed to WikiPage::doEditContent()
 $revision: New Revision of the article
 
 'ArticleMergeComplete': after merging to article using Special:Mergehistory
@@ -495,33 +516,33 @@ $targetTitle: target title (object)
 $destTitle: destination title (object)
 
 'ArticlePageDataAfter': after loading data of an article from the database
-$article: WikiPage (object) whose data were loaded
+$wikiPage: WikiPage (object) whose data were loaded
 $row: row (object) returned from the database server
 
 'ArticlePageDataBefore': before loading data of an article from the database
-$article: WikiPage (object) that data will be loaded
+$wikiPage: WikiPage (object) that data will be loaded
 $fields: fileds (array) to load from the database
 
 'ArticlePrepareTextForEdit': called when preparing text to be saved
-$article: the WikiPage being saved
+$wikiPage: the WikiPage being saved
 $popts: parser options to be used for pre-save transformation
 
 'ArticleProtect': before an article is protected
-$article: the WikiPage being protected
+$wikiPage: the WikiPage being protected
 $user: the user doing the protection
 $protect: boolean whether this is a protect or an unprotect
 $reason: Reason for protect
 $moveonly: boolean whether this is for move only or not
 
 'ArticleProtectComplete': after an article is protected
-$article: the WikiPage that was protected
+$wikiPage: the WikiPage that was protected
 $user: the user who did the protection
 $protect: boolean whether it was a protect or an unprotect
 $reason: Reason for protect
 $moveonly: boolean whether it was for move only or not
 
 'ArticlePurge': before executing "&action=purge"
-$article: WikiPage (object) to purge
+$wikiPage: WikiPage (object) to purge
 
 'ArticleRevisionVisibilitySet': called when changing visibility of one or more
 revision of an article
@@ -533,13 +554,13 @@ $revision: the revision
 $oldPageID: the page ID of the revision when archived (may be null)
 
 'ArticleRollbackComplete': after an article rollback is completed
-$article: the WikiPage that was edited
+$wikiPage: the WikiPage that was edited
 $user: the user who did the rollback
 $revision: the revision the page was reverted back to
 $current: the reverted revision
 
-'ArticleSave': before an article is saved
-$article: the WikiPage (object) being saved
+'ArticleSave': before an article is saved. DEPRECATED, use PageContentSave instead
+$wikiPage: the WikiPage (object) being saved
 $user: the user (object) saving the article
 $text: the new article text
 $summary: the article summary (comment)
@@ -547,17 +568,17 @@ $isminor: minor flag
 $iswatch: watch flag
 $section: section #
 
-'ArticleSaveComplete': After an article has been updated
-$article: WikiPage modified
+'ArticleSaveComplete': After an article has been updated. DEPRECATED, use PageContentSaveComplete instead.
+$wikiPage: WikiPage modified
 $user: User performing the modification
 $text: New content
 $summary: Edit summary/comment
 $isMinor: Whether or not the edit was marked as minor
 $isWatch: (No longer used)
 $section: (No longer used)
-$flags: Flags passed to Article::doEdit()
+$flags: Flags passed to WikiPage::doEditContent()
 $revision: New Revision of the article
-$status: Status object about to be returned by doEdit()
+$status: Status object about to be returned by doEditContent()
 $baseRevId: the rev ID (or false) this edit was based on
 
 'ArticleUndelete': When one or more revisions of an article are restored
@@ -566,6 +587,11 @@ $create: Whether or not the restoration caused the page to be created
 (i.e. it didn't exist before)
 $comment: The comment associated with the undeletion.
 
+'ArticleUndeleteLogEntry': When a log entry is generated but not yet saved.
+$pageArchive: the PageArchive object
+&$logEntry: ManualLogEntry object
+$user: User who is performing the log action
+
 'ArticleUpdateBeforeRedirect': After a page is updated (usually on save),
 before the user is redirected back to the page
 &$article: the article
@@ -586,11 +612,19 @@ object to both indicate that the output is done and what parser output was used.
 follwed an redirect
 $article: target article (object)
 
-'ArticleViewCustom': allows to output the text of the article in a different format than wikitext
+'ArticleViewCustom': allows to output the text of the article in a different format than wikitext.
+DEPRECATED, use ArticleContentViewCustom instead.
+Note that it is preferrable to implement proper handing for a custom data type using the ContentHandler facility.
 $text: text of the page
 $title: title of the page
 $output: reference to $wgOut
 
+'ArticleContentViewCustom': allows to output the text of the article in a different format than wikitext.
+Note that it is preferrable to implement proper handing for a custom data type using the ContentHandler facility.
+$content: content of the page, as a Content object
+$title: title of the page
+$output: reference to $wgOut
+
 'AuthPluginAutoCreate': Called when creating a local account for an user logged
 in from an external authentication method
 $user: User object created locally
@@ -722,6 +756,26 @@ the collation given in $collationName.
 'ConfirmEmailComplete': Called after a user's email has been confirmed successfully
 $user: user (object) whose email is being confirmed
 
+'ContentHandlerDefaultModelFor': Called when the default content model is determiend
+for a given title. May be used to assign a different model for that title.
+$title: the Title in question
+&$model: the model name. Use with CONTENT_MODEL_XXX constants.
+
+'ContentHandlerForModelID': Called when a ContentHandler is requested for a given
+content model name, but no entry for that model exists in $wgContentHandlers.
+$modeName: the requested content model name
+&$handler: set this to a ContentHandler object, if desired.
+
+'ConvertContent': Called by AbstractContent::convert when a conversion to another
+content model is requested.
+$content: The Content object to be converted.
+$toModel: The ID of the content model to convert to.
+$lossy:   boolean indicating whether lossy conversion is allowed.
+&$result: Output parameter, in case the handler function wants to provide a
+converted Content object. Note that $result->getContentModel() must return $toModel.
+Handler functions that modify $result should generally return false to further
+attempts at conversion.
+
 'ContribsPager::getQueryInfo': Before the contributions query is about to run
 &$pager: Pager object for contributions
 &$queryInfo: The query for the contribs Pager
@@ -789,18 +843,25 @@ $tooltip: The default tooltip.  Escape before using.
 $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)
+$editor: EditPage instance (object). The edit form (see includes/EditPage.php)
 $text: Contents of the edit box
 $section: Section being edited
 &$error: Error message to return
 $summary: Edit summary for page
 
-'EditFilterMerged': Post-section-merge edit filter
+'EditFilterMerged': Post-section-merge edit filter.
+DEPRECATED, use EditFilterMergedContent instead.
 $editor: EditPage instance (object)
 $text: content of the edit box
 &$error: error message to return
 $summary: Edit summary for page
 
+'EditFilterMergedContent': Post-section-merge edit filter
+$editor: EditPage instance (object)
+$content: content of the edit box, as a Content object
+&$error: error message to return
+$summary: Edit summary for page
+
 'EditFormPreloadText': Allows population of the edit form when creating
 new pages
 &$text: Text to preload with
@@ -811,7 +872,7 @@ pages
 $editPage: EditPage    object
 
 'EditPage::attemptSave': called before an article is
-saved, that is before Article::doEdit() is called
+saved, that is before WikiPage::doEditContent() is called
 $editpage_Obj: the current EditPage object
 
 'EditPage::importFormData': allow extensions to read additional data
@@ -834,6 +895,13 @@ yourself. Alternatively, modifying $error and returning true will cause the
 contents of $error to be echoed at the top of the edit form as wikitext.
 Return true without altering $error to allow the edit to proceed.
 
+'EditPage::showStandardInputs:options': allows injection of form fields into
+the editOptions area
+$editor: EditPage instance (object)
+$out: an OutputPage instance to write to
+&$tabindex: HTML tabindex of the last edit check/button
+return value is ignored (should always be true)
+
 'EditPageBeforeConflictDiff': allows modifying the EditPage object and output
 when there's an edit conflict.  Return false to halt normal diff output; in
 this case you're responsible for computing and outputting the entire "conflict"
@@ -863,14 +931,28 @@ $title: title of page being edited
 &$msg: localization message name, overridable. Default is either 'copyrightwarning' or 'copyrightwarning2'
 
 'EditPageGetDiffText': Allow modifying the wikitext that will be used in
-"Show changes"
+"Show changes". DEPRECATED. Use EditPageGetDiffContent instead.
+Note that it is preferrable to implement diff handling for different data types using the ContentHandler facility.
+$editPage: EditPage object
+&$newtext: wikitext that will be used as "your version"
+
+'EditPageGetDiffContent': Allow modifying the wikitext that will be used in
+"Show changes".
+Note that it is preferrable to implement diff handling for different data types using the ContentHandler facility.
 $editPage: EditPage object
 &$newtext: wikitext that will be used as "your version"
 
-'EditPageGetPreviewText': Allow modifying the wikitext that will be previewed
+'EditPageGetPreviewText': Allow modifying the wikitext that will be previewed.
+DEPRECATED. Use EditPageGetPreviewContent instead.
+Note that it is preferrable to implement previews for different data types using the COntentHandler facility.
 $editPage: EditPage object
 &$toparse: wikitext that will be parsed
 
+'EditPageGetPreviewContent': Allow modifying the wikitext that will be previewed.
+Note that it is preferrable to implement previews for different data types using the COntentHandler facility.
+$editPage: EditPage object
+&$content: Content object to be previewed (may be replaced by hook function)
+
 'EditPageNoSuchSection': When a section edit request is given for an non-existent section
 &$editpage: The current EditPage object
 &$res: the HTML of the error text
@@ -1139,6 +1221,10 @@ $reader: XMLReader object
 $revisionInfo: Array of information
 Return false to stop further processing of the tag
 
+'InfoAction': When building information to display on the action=info page
+$context: IContextSource object
+&$pageInfo: Array of information
+
 'InitializeArticleMaybeRedirect': MediaWiki check to see if title is a redirect
 $title: Title object ($wgTitle)
 $request: WebRequest
@@ -1416,7 +1502,7 @@ Hooks may change this value to override the return value of MWNamespace::isMovab
 
 'NewRevisionFromEditComplete': called when a revision was inserted
 due to an edit
-$article: the WikiPage edited
+$wikiPage: the WikiPage edited
 $rev: the new revision
 $baseID: the revision ID this was based off, if any
 $user: the editing user
@@ -1477,12 +1563,45 @@ $categories: associative array, keys are category names, values are category
 $links: array, intended to hold the result. Must be an associative array with
        category types as keys and arrays of HTML links as values.
 
+'PageContentInsertComplete': After a new article is created
+$wikiPage: WikiPage created
+$user: User creating the article
+$content: New content as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+
 'PageContentLanguage': allows changing the language in which the content of
 a page is written. Defaults to the wiki content language ($wgContLang).
 $title: Title object
 &$pageLang: the page content language (either an object or a language code)
 $wgLang: the user language
 
+'PageContentSave': before an article is saved.
+$wikiPage: the WikiPage (object) being saved
+$user: the user (object) saving the article
+$content: the new article content, as a Content object
+$summary: the article summary (comment)
+$isminor: minor flag
+$iswatch: watch flag
+$section: section #
+
+'PageContentSaveComplete': After an article has been updated
+$wikiPage: WikiPage modified
+$user: User performing the modification
+$content: New content, as a Content object
+$summary: Edit summary/comment
+$isMinor: Whether or not the edit was marked as minor
+$isWatch: (No longer used)
+$section: (No longer used)
+$flags: Flags passed to WikiPage::doEditContent()
+$revision: New Revision of the article
+$status: Status object about to be returned by doEditContent()
+$baseRevId: the rev ID (or false) this edit was based on
+
 'PageHistoryBeforeList': When a history page list is about to be constructed.
 $article: the article that the history is loading for
 
@@ -1531,6 +1650,9 @@ $text: actual text
 'ParserClearState': called at the end of Parser::clearState()
 $parser: Parser object being cleared
 
+'ParserCloned': called when the parser is cloned
+$parser: Newly-cloned Parser object
+
 'ParserFirstCallInit': called when the parser initialises for the first time
 &$parser: Parser object being cleared
 
@@ -1703,6 +1825,12 @@ $text : Current text being indexed
 $allSearchTerms : Array of the search terms in all content languages
 &$titleResult : Outparam; the value to return. A Title object or null.
 
+'SearchAfterNoDirectMatch': If there was no match for the exact result. This
+runs before lettercase variants are attempted, whereas 'SearchGetNearMatch'
+runs after.
+$term : Search term string
+&$title : Outparam; set to $title object and return false for a match
+
 'SearchGetNearMatch': An extra chance for exact-title-matches in "go" searches if nothing was found
 $term : Search term string
 &$title : Outparam; set to $title object and return false for a match
@@ -1730,7 +1858,8 @@ $title : Current Title object being displayed in search results.
 'ShowMissingArticle': Called when generating the output for a non-existent page
 $article: The article object corresponding to the page
 
-'ShowRawCssJs': Customise the output of raw CSS and JavaScript in page views
+'ShowRawCssJs': Customise the output of raw CSS and JavaScript in page views.
+DEPRECATED, use the ContentHandler facility to handle CSS and JavaScript!
 $text: Text being shown
 $title: Title of the custom script/stylesheet page
 $output: Current OutputPage object
@@ -1742,6 +1871,21 @@ $result: The search result
 $terms: The search terms entered
 $page: The SpecialSearch object.
 
+'ShowSearchHit': Customize display of search hit.
+$searchPage: The SpecialSearch instance.
+$result: The SearchResult to show
+$terms: Search terms, for highlighting
+&$link: HTML of link to the matching page. May be modified.
+&$redirect: HTML of redirect info. May be modified.
+&$section: HTML of matching section. May be modified.
+&$extract: HTML of content extract. May be modified.
+&$score: HTML of score. May be modified.
+&$size: HTML of page size. May be modified.
+&$date: HTML of of page modification date. May be modified.
+&$related: HTML of additional info for the matching page. May be modified.
+&$html: May be set to the full HTML that should be used to represent the search hit. Must include
+the <li> ... </li> tags. Will only be used if the hook function returned false.
+
 'SiteNoticeBefore': Before the sitenotice/anonnotice is composed
 &$siteNotice: HTML returned as the sitenotice
 $skin: Skin object
@@ -1987,6 +2131,10 @@ $form: The SpecialUpload object
 use this to change the tables headers
 $extTypes: associative array of extensions types
 
+'SpecialVersionVersionUrl': called when building the URL for Special:Version
+$wgVersion: Current $wgVersion for you to use
+&$versionUrl: Raw url to link to (eg: release notes)
+
 'SpecialWatchlistFilters': called after building form options at Watchlist
 $special: the special page object
 &$filters: associative array of filter definitions. The keys are the HTML name/URL parameters.
@@ -2021,7 +2169,7 @@ $result: Boolean; whether MediaWiki currently thinks this is a CSS/JS page. Hook
 Allows overriding default behaviour for determining if a page exists.
 If $isKnown is kept as null, regular checks happen. If it's a boolean, this value is returned by the isKnown method.
 $title: Title object that is being checked
-$result: Boolean|null; whether MediaWiki currently thinks this page is known
+&$isKnown: Boolean|null; whether MediaWiki currently thinks this page is known
 
 'TitleIsMovable': Called when determining if it is possible to move a page.
 Note that this hook is not called for interwiki pages or pages in immovable namespaces: for these, isMovable() always returns false.
@@ -2084,6 +2232,9 @@ $page: WikiPage object to be removed
 $user: user that watched
 $page: WikiPage object that was watched
 
+'UpdateUserMailerFormattedPageStatus': before notification email gets sent
+$formattedPageStatus: list of valid page states
+
 'UploadForm:initial': before the upload form is generated
 $form: UploadForm object
 You might set the member-variables $uploadFormTextTop and
@@ -2349,6 +2500,14 @@ One, and only one hook should set this, and return false.
 &$opts: Options to use for the query
 &$join: Join conditions
 
+'WikiPageDeletionUpdates': manipulate the list of DataUpdates to be applied when
+       a page is deleted. Called in WikiPage::getDeletionUpdates().
+       Note that updates specific to a content model should be provided by the
+       respective Content's getDeletionUpdates() method.
+$page: the WikiPage
+$content: the Content to generate updates for
+&$updates: the array of DataUpdate objects. Hook function may want to add to it.
+
 'wfShellWikiCmd': Called when generating a shell-escaped command line
        string to run a MediaWiki cli script.
 &$script: MediaWiki cli script path
index 3872edc..971a611 100644 (file)
@@ -198,7 +198,7 @@ Revision text:
        expriry: $wgRevisionCacheExpiry
 
 Sessions:
-       controlled by: $wgSessionsInMemcached
+       controlled by: $wgSessionsInObjectCache
        key: $wgBDname:session:$id
        ex: wikidb:session:38d7c5b8d3bfc51egf40c69bc40f8be3
        stores: $SESSION, useful when using a multi-sever wiki
index b3a3495..b04974b 100644 (file)
@@ -48,7 +48,7 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) {
 wfProfileIn( 'img_auth.php' );
 
 # Set action base paths so that WebRequest::getPathInfo()
-# recognizes the "X" as the 'title' in ../image_auth/X urls.
+# recognizes the "X" as the 'title' in ../img_auth.php/X urls.
 $wgArticlePath = false; # Don't let a "/*" article path clober our action path
 $wgActionPaths = array( "$wgUploadPath/" );
 
index 5192225..19552bc 100644 (file)
@@ -272,7 +272,7 @@ abstract class Action {
         * must throw subclasses of ErrorPageError
         *
         * @param $user User: the user to check, or null to use the context user
-        * @throws ErrorPageError
+        * @throws UserBlockedError|ReadOnlyError|PermissionsError
         * @return bool True on success
         */
        protected function checkCanExecute( User $user ) {
@@ -546,6 +546,7 @@ abstract class FormlessAction extends Action {
         * forms, they probably won't have any data, but some (eg rollback) may do
         * @param $data Array values that would normally be in the GET request
         * @param $captureErrors Bool whether to catch exceptions and just return false
+        * @throws ErrorPageError
         * @return Bool whether execution was successful
         */
        public function execute( array $data = null, $captureErrors = true ) {
index 6bf94cc..23c31bf 100644 (file)
@@ -204,7 +204,7 @@ class AjaxResponse {
 
        /**
         * checkLastModified tells the client to use the client-cached response if
-        * possible. If sucessful, the AjaxResponse is disabled so that
+        * possible. If successful, the AjaxResponse is disabled so that
         * any future call to AjaxResponse::printText() have no effect.
         *
         * @param $timestamp string
index 9ab4b6b..5a887b6 100644 (file)
@@ -57,10 +57,17 @@ class Article extends Page {
        public $mParserOptions;
 
        /**
-        * Content of the revision we are working on
+        * Text of the revision we are working on
         * @var string $mContent
         */
-       var $mContent;                    // !<
+       var $mContent;                    // !< #BC cruft
+
+       /**
+        * Content of the revision we are working on
+        * @var Content
+        * @since 1.21
+        */
+       var $mContentObject;              // !<
 
        /**
         * Is the content ($mContent) already loaded?
@@ -231,9 +238,32 @@ class Article extends Page {
         * This function has side effects! Do not use this function if you
         * only want the real revision text if any.
         *
+        * @deprecated in 1.21; use WikiPage::getContent() instead
+        *
         * @return string Return the text of this revision
         */
        public function getContent() {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+               $content = $this->getContentObject();
+               return ContentHandler::getContentText( $content );
+       }
+
+       /**
+        * Returns a Content object representing the pages effective display content,
+        * not necessarily the revision's content!
+        *
+        * Note that getContent/loadContent do not follow redirects anymore.
+        * If you need to fetch redirectable content easily, try
+        * the shortcut in WikiPage::getRedirectTarget()
+        *
+        * This function has side effects! Do not use this function if you
+        * only want the real revision text if any.
+        *
+        * @return Content Return the content of this revision
+        *
+        * @since 1.21
+        */
+       protected function getContentObject() {
                wfProfileIn( __METHOD__ );
 
                if ( $this->mPage->getID() === 0 ) {
@@ -244,18 +274,20 @@ class Article extends Page {
                                if ( $text === false ) {
                                        $text = '';
                                }
+
+                               $content = ContentHandler::makeContent( $text, $this->getTitle() );
                        } else {
                                $message = $this->getContext()->getUser()->isLoggedIn() ? 'noarticletext' : 'noarticletextanon';
-                               $text = wfMessage( $message )->text();
+                               $content = new MessageContent( $message, null, 'parsemag' );
                        }
                        wfProfileOut( __METHOD__ );
 
-                       return $text;
+                       return $content;
                } else {
-                       $this->fetchContent();
+                       $this->fetchContentObject();
                        wfProfileOut( __METHOD__ );
 
-                       return $this->mContent;
+                       return $this->mContentObject;
                }
        }
 
@@ -336,22 +368,61 @@ class Article extends Page {
         * Get text of an article from database
         * Does *NOT* follow redirects.
         *
+        * @protected
+        * @note this is really internal functionality that should really NOT be used by other functions. For accessing
+        *       article content, use the WikiPage class, especially WikiBase::getContent(). However, a lot of legacy code
+        *       uses this method to retrieve page text from the database, so the function has to remain public for now.
+        *
         * @return mixed string containing article contents, or false if null
+        * @deprecated in 1.21, use WikiPage::getContent() instead
         */
-       function fetchContent() {
-               if ( $this->mContentLoaded ) {
+       function fetchContent() { #BC cruft!
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               if ( $this->mContentLoaded && $this->mContent ) {
                        return $this->mContent;
                }
 
                wfProfileIn( __METHOD__ );
 
+               $content = $this->fetchContentObject();
+
+               $this->mContent = ContentHandler::getContentText( $content ); #@todo: get rid of mContent everywhere!
+               ContentHandler::runLegacyHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
+
+               wfProfileOut( __METHOD__ );
+
+               return $this->mContent;
+       }
+
+
+       /**
+        * Get text content object
+        * Does *NOT* follow redirects.
+        * TODO: when is this null?
+        *
+        * @note code that wants to retrieve page content from the database should use WikiPage::getContent().
+        *
+        * @return Content|null
+        *
+        * @since 1.21
+        */
+       protected function fetchContentObject() {
+               if ( $this->mContentLoaded ) {
+                       return $this->mContentObject;
+               }
+
+               wfProfileIn( __METHOD__ );
+
                $this->mContentLoaded = true;
+               $this->mContent = null;
 
                $oldid = $this->getOldID();
 
                # Pre-fill content with error message so that if something
                # fails we'll have something telling us what we intended.
-               $this->mContent = wfMessage( 'missing-revision', $oldid )->plain();
+               //XXX: this isn't page content but a UI message. horrible.
+               $this->mContentObject = new MessageContent( 'missing-revision', array( $oldid ), array() ) ;
 
                if ( $oldid ) {
                        # $this->mRevision might already be fetched by getOldIDFromRequest()
@@ -371,6 +442,7 @@ class Article extends Page {
                        }
 
                        $this->mRevision = $this->mPage->getRevision();
+
                        if ( !$this->mRevision ) {
                                wfDebug( __METHOD__ . " failed to retrieve current page, rev_id " . $this->mPage->getLatest() . "\n" );
                                wfProfileOut( __METHOD__ );
@@ -380,14 +452,14 @@ class Article extends Page {
 
                // @todo FIXME: Horrible, horrible! This content-loading interface just plain sucks.
                // We should instead work with the Revision object when we need it...
-               $this->mContent = $this->mRevision->getText( Revision::FOR_THIS_USER ); // Loads if user is allowed
+               $this->mContentObject = $this->mRevision->getContent( Revision::FOR_THIS_USER, $this->getContext()->getUser() ); // Loads if user is allowed
                $this->mRevIdFetched = $this->mRevision->getId();
 
-               wfRunHooks( 'ArticleAfterFetchContent', array( &$this, &$this->mContent ) );
+               wfRunHooks( 'ArticleAfterFetchContentObject', array( &$this, &$this->mContentObject ) );
 
                wfProfileOut( __METHOD__ );
 
-               return $this->mContent;
+               return $this->mContentObject;
        }
 
        /**
@@ -420,7 +492,7 @@ class Article extends Page {
         * @return Revision|null
         */
        public function getRevisionFetched() {
-               $this->fetchContent();
+               $this->fetchContentObject();
 
                return $this->mRevision;
        }
@@ -443,7 +515,7 @@ class Article extends Page {
         * page of the given title.
         */
        public function view() {
-               global $wgParser, $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
+               global $wgUseFileCache, $wgUseETag, $wgDebugToolbar;
 
                wfProfileIn( __METHOD__ );
 
@@ -580,7 +652,7 @@ class Article extends Page {
                                        break;
                                case 3:
                                        # This will set $this->mRevision if needed
-                                       $this->fetchContent();
+                                       $this->fetchContentObject();
 
                                        # Are we looking at an old revision
                                        if ( $oldid && $this->mRevision ) {
@@ -604,18 +676,25 @@ class Article extends Page {
                                                wfDebug( __METHOD__ . ": showing CSS/JS source\n" );
                                                $this->showCssOrJsPage();
                                                $outputDone = true;
-                                       } elseif( !wfRunHooks( 'ArticleViewCustom', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
+                                       } elseif( !wfRunHooks( 'ArticleContentViewCustom',
+                                                       array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+
+                                               # Allow extensions do their own custom view for certain pages
+                                               $outputDone = true;
+                                       } elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom',
+                                                       array( $this->fetchContentObject(), $this->getTitle(), $outputPage ) ) ) {
+
                                                # Allow extensions do their own custom view for certain pages
                                                $outputDone = true;
                                        } else {
-                                               $text = $this->getContent();
-                                               $rt = Title::newFromRedirectArray( $text );
+                                               $content = $this->getContentObject();
+                                               $rt = $content ? $content->getRedirectChain() : null;
                                                if ( $rt ) {
                                                        wfDebug( __METHOD__ . ": showing redirect=no page\n" );
                                                        # Viewing a redirect page (e.g. with parameter redirect=no)
                                                        $outputPage->addHTML( $this->viewRedirect( $rt ) );
                                                        # Parse just to get categories, displaytitle, etc.
-                                                       $this->mParserOutput = $wgParser->parse( $text, $this->getTitle(), $parserOptions );
+                                                       $this->mParserOutput = $content->getParserOutput( $this->getTitle(), $oldid, $parserOptions, false );
                                                        $outputPage->addParserOutputNoText( $this->mParserOutput );
                                                        $outputDone = true;
                                                }
@@ -625,8 +704,8 @@ class Article extends Page {
                                        # Run the parse, protected by a pool counter
                                        wfDebug( __METHOD__ . ": doing uncached parse\n" );
 
-                                       $poolArticleView = new PoolWorkArticleView( $this, $parserOptions,
-                                               $this->getRevIdFetched(), $useParserCache, $this->getContent() );
+                                       $poolArticleView = new PoolWorkArticleView( $this->getPage(), $parserOptions,
+                                               $this->getRevIdFetched(), $useParserCache, $this->getContentObject() );
 
                                        if ( !$poolArticleView->execute() ) {
                                                $error = $poolArticleView->getError();
@@ -708,6 +787,8 @@ class Article extends Page {
        /**
         * Show a diff page according to current request variables. For use within
         * Article::view() only, other callers should use the DifferenceEngine class.
+        *
+        * @todo: make protected
         */
        public function showDiffPage() {
                $request = $this->getContext()->getRequest();
@@ -719,7 +800,17 @@ class Article extends Page {
                $unhide = $request->getInt( 'unhide' ) == 1;
                $oldid = $this->getOldID();
 
-               $de = new DifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
+               $rev = $this->getRevisionFetched();
+
+               if ( !$rev ) {
+                       $this->getContext()->getOutput()->setPageTitle( wfMessage( 'errorpagetitle' ) );
+                       $this->getContext()->getOutput()->addWikiMsg( 'difference-missing-revision', $oldid, 1 );
+                       return;
+               }
+
+               $contentHandler = $rev->getContentHandler();
+               $de = $contentHandler->createDifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide );
+
                // DifferenceEngine directly fetched the revision:
                $this->mRevIdFetched = $de->mNewid;
                $de->showDiffPage( $diffOnly );
@@ -736,23 +827,28 @@ class Article extends Page {
         *
         * This is hooked by SyntaxHighlight_GeSHi to do syntax highlighting of these
         * page views.
+        *
+        * @param bool $showCacheHint whether to show a message telling the user to clear the browser cache (default: true).
         */
-       protected function showCssOrJsPage() {
-               $dir = $this->getContext()->getLanguage()->getDir();
-               $lang = $this->getContext()->getLanguage()->getCode();
-
+       protected function showCssOrJsPage( $showCacheHint = true ) {
                $outputPage = $this->getContext()->getOutput();
-               $outputPage->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
-                       'clearyourcache' );
 
-               // Give hooks a chance to customise the output
-               if ( wfRunHooks( 'ShowRawCssJs', array( $this->mContent, $this->getTitle(), $outputPage ) ) ) {
-                       // Wrap the whole lot in a <pre> and don't parse
-                       $m = array();
-                       preg_match( '!\.(css|js)$!u', $this->getTitle()->getText(), $m );
-                       $outputPage->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
-                       $outputPage->addHTML( htmlspecialchars( $this->mContent ) );
-                       $outputPage->addHTML( "\n</pre>\n" );
+               if ( $showCacheHint ) {
+                       $dir = $this->getContext()->getLanguage()->getDir();
+                       $lang = $this->getContext()->getLanguage()->getCode();
+
+                       $outputPage->wrapWikiMsg( "<div id='mw-clearyourcache' lang='$lang' dir='$dir' class='mw-content-$dir'>\n$1\n</div>",
+                               'clearyourcache' );
+               }
+
+               $this->fetchContentObject();
+
+               if ( $this->mContentObject ) {
+                       // Give hooks a chance to customise the output
+                       if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mContentObject, $this->getTitle(), $outputPage ) ) ) {
+                               $po = $this->mContentObject->getParserOutput( $this->getTitle() );
+                               $outputPage->addHTML( $po->getText() );
+                       }
                }
        }
 
@@ -948,6 +1044,8 @@ class Article extends Page {
         * If patrol is possible, output a patrol UI box. This is called from the
         * footer section of ordinary page views. If patrol is not possible or not
         * desired, does nothing.
+        * Side effect: When the patrol link is build, this method will call
+        * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
         */
        public function showPatrolFooter() {
                $request = $this->getContext()->getRequest();
@@ -960,7 +1058,9 @@ class Article extends Page {
                }
 
                $token = $user->getEditToken( $rcid );
+
                $outputPage->preventClickjacking();
+               $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
 
                $link = Linker::linkKnown(
                        $this->getTitle(),
@@ -1377,7 +1477,13 @@ class Article extends Page {
                // Generate deletion reason
                $hasHistory = false;
                if ( !$reason ) {
-                       $reason = $this->generateReason( $hasHistory );
+                       try {
+                               $reason = $this->generateReason( $hasHistory );
+                       } catch ( MWException $e ) {
+                               # if a page is horribly broken, we still want to be able to delete it. so be lenient about errors here.
+                               wfDebug("Error while building auto delete summary: $e");
+                               $reason = '';
+                       }
                }
 
                // If the page has a history, insert a warning
@@ -1617,6 +1723,8 @@ class Article extends Page {
         * @return ParserOutput or false if the given revsion ID is not found
         */
        public function getParserOutput( $oldid = null, User $user = null ) {
+               //XXX: bypasses mParserOptions and thus setParserOptions()
+
                if ( $user === null ) {
                        $parserOptions = $this->getParserOptions();
                } else {
@@ -1626,6 +1734,21 @@ class Article extends Page {
                return $this->mPage->getParserOutput( $parserOptions, $oldid );
        }
 
+       /**
+        * Override the ParserOptions used to render the primary article wikitext.
+        *
+        * @param ParserOptions $options
+        * @throws MWException if the parser options where already initialized.
+        */
+       public function setParserOptions( ParserOptions $options ) {
+               if ( $this->mParserOptions ) {
+                       throw new MWException( "can't change parser options after they have already been set" );
+               }
+
+               // clone, so if $options is modified later, it doesn't confuse the parser cache.
+               $this->mParserOptions = clone $options;
+       }
+
        /**
         * Get parser options suitable for rendering the primary article wikitext
         * @return ParserOptions
@@ -1764,8 +1887,9 @@ class Article extends Page {
                wfDeprecated( __METHOD__, '1.18' );
                if ( $noRedir ) {
                        $query = 'redirect=no';
-                       if ( $extraQuery )
+                       if ( $extraQuery ) {
                                $query .= "&$extraQuery";
+                       }
                } else {
                        $query = $extraQuery;
                }
@@ -1844,7 +1968,13 @@ class Article extends Page {
         * @return bool
         */
        public function updateRestrictions( $limit = array(), $reason = '', &$cascade = 0, $expiry = array() ) {
-               return $this->mPage->updateRestrictions( $limit, $reason, $cascade, $expiry );
+               return $this->mPage->doUpdateRestrictions(
+                       $limit,
+                       $expiry,
+                       $cascade,
+                       $reason,
+                       $this->getContext()->getUser()
+               );
        }
 
        /**
@@ -1891,7 +2021,9 @@ class Article extends Page {
         * @return mixed
         */
        public function generateReason( &$hasHistory ) {
-               return $this->mPage->getAutoDeleteReason( $hasHistory );
+               $title = $this->mPage->getTitle();
+               $handler = ContentHandler::getForTitle( $title );
+               return $handler->getAutoDeleteReason( $title, $hasHistory );
        }
 
        // ****** B/C functions for static methods ( __callStatic is PHP>=5.3 ) ****** //
@@ -1929,6 +2061,7 @@ class Article extends Page {
         * @param $newtext
         * @param $flags
         * @return string
+        * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
         */
        public static function getAutosummary( $oldtext, $newtext, $flags ) {
                return WikiPage::getAutosummary( $oldtext, $newtext, $flags );
index 706e1c8..3d0c27a 100644 (file)
@@ -38,7 +38,6 @@ $wgAutoloadLocalClasses = array(
        'AuthPlugin' => 'includes/AuthPlugin.php',
        'AuthPluginUser' => 'includes/AuthPlugin.php',
        'Autopromote' => 'includes/Autopromote.php',
-       'BacklinkCache' => 'includes/BacklinkCache.php',
        'BadTitleError' => 'includes/Exception.php',
        'BaseTemplate' => 'includes/SkinTemplate.php',
        'Block' => 'includes/Block.php',
@@ -71,8 +70,6 @@ $wgAutoloadLocalClasses = array(
        'DeferredUpdates' => 'includes/DeferredUpdates.php',
        'DeprecatedGlobal' => 'includes/DeprecatedGlobal.php',
        'DerivativeRequest' => 'includes/WebRequest.php',
-       'DeviceDetection' => 'includes/mobile/DeviceDetection.php',
-       'DeviceProperties' => 'includes/mobile/DeviceDetection.php',
        'DiffHistoryBlob' => 'includes/HistoryBlob.php',
        'DoubleReplacer' => 'includes/StringUtils.php',
        'DummyLinker' => 'includes/Linker.php',
@@ -138,8 +135,6 @@ $wgAutoloadLocalClasses = array(
        'HttpRequest' => 'includes/HttpFunctions.old.php',
        'ICacheHelper' => 'includes/CacheHelper.php',
        'IcuCollation' => 'includes/Collation.php',
-       'IDeviceProperties' => 'includes/mobile/DeviceDetection.php',
-       'IDeviceDetector' => 'includes/mobile/DeviceDetection.php',
        'IdentityCollation' => 'includes/Collation.php',
        'ImageGallery' => 'includes/ImageGallery.php',
        'ImageHistoryList' => 'includes/ImagePage.php',
@@ -152,6 +147,7 @@ $wgAutoloadLocalClasses = array(
        'IndexPager' => 'includes/Pager.php',
        'Interwiki' => 'includes/interwiki/Interwiki.php',
        'IP' => 'includes/IP.php',
+       'LCStore' => 'includes/LocalisationCache.php',
        'LCStore_Accel' => 'includes/LocalisationCache.php',
        'LCStore_CDB' => 'includes/LocalisationCache.php',
        'LCStore_DB' => 'includes/LocalisationCache.php',
@@ -204,6 +200,7 @@ $wgAutoloadLocalClasses = array(
        'RdfMetaData' => 'includes/Metadata.php',
        'ReadOnlyError' => 'includes/Exception.php',
        'RecentChange' => 'includes/RecentChange.php',
+       'RedirectSpecialArticle' => 'includes/SpecialPage.php',
        'RedirectSpecialPage' => 'includes/SpecialPage.php',
        'RegexlikeReplacer' => 'includes/StringUtils.php',
        'ReplacementArray' => 'includes/StringUtils.php',
@@ -246,6 +243,7 @@ $wgAutoloadLocalClasses = array(
        'StubUserLang' => 'includes/StubObject.php',
        'TablePager' => 'includes/Pager.php',
        'MWTimestamp' => 'includes/Timestamp.php',
+       'TimestampException' => 'includes/Timestamp.php',
        'Title' => 'includes/Title.php',
        'TitleArray' => 'includes/TitleArray.php',
        'TitleArrayFromResult' => 'includes/TitleArray.php',
@@ -288,6 +286,21 @@ $wgAutoloadLocalClasses = array(
        'ZipDirectoryReader' => 'includes/ZipDirectoryReader.php',
        'ZipDirectoryReaderError' => 'includes/ZipDirectoryReader.php',
 
+       # content handler
+       'AbstractContent' => 'includes/content/AbstractContent.php',
+       'ContentHandler' => 'includes/content/ContentHandler.php',
+       'Content' => 'includes/content/Content.php',
+       'CssContentHandler' => 'includes/content/CssContentHandler.php',
+       'CssContent' => 'includes/content/CssContent.php',
+       'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php',
+       'JavaScriptContent' => 'includes/content/JavaScriptContent.php',
+       'MessageContent' => 'includes/content/MessageContent.php',
+       'MWContentSerializationException' => 'includes/content/ContentHandler.php',
+       'TextContentHandler' => 'includes/content/TextContentHandler.php',
+       'TextContent' => 'includes/content/TextContent.php',
+       'WikitextContentHandler' => 'includes/content/WikitextContentHandler.php',
+       'WikitextContent' => 'includes/content/WikitextContent.php',
+
        # includes/actions
        'CachedAction' => 'includes/actions/CachedAction.php',
        'CreditsAction' => 'includes/actions/CreditsAction.php',
@@ -330,6 +343,7 @@ $wgAutoloadLocalClasses = array(
        'ApiFormatDump' => 'includes/api/ApiFormatDump.php',
        'ApiFormatFeedWrapper' => 'includes/api/ApiFormatBase.php',
        'ApiFormatJson' => 'includes/api/ApiFormatJson.php',
+       'ApiFormatNone' => 'includes/api/ApiFormatNone.php',
        'ApiFormatPhp' => 'includes/api/ApiFormatPhp.php',
        'ApiFormatRaw' => 'includes/api/ApiFormatRaw.php',
        'ApiFormatTxt' => 'includes/api/ApiFormatTxt.php',
@@ -382,6 +396,7 @@ $wgAutoloadLocalClasses = array(
        'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
        'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
        'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
+       'ApiQueryORM' => 'includes/api/ApiQueryORM.php',
        'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
        'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
        'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
@@ -409,6 +424,7 @@ $wgAutoloadLocalClasses = array(
        'UsageException' => 'includes/api/ApiMain.php',
 
        # includes/cache
+       'BacklinkCache' => 'includes/cache/BacklinkCache.php',
        'CacheDependency' => 'includes/cache/CacheDependency.php',
        'ConstantDependency' => 'includes/cache/CacheDependency.php',
        'DependencyWrapper' => 'includes/cache/CacheDependency.php',
@@ -417,7 +433,6 @@ $wgAutoloadLocalClasses = array(
        'GenderCache' => 'includes/cache/GenderCache.php',
        'GlobalDependency' => 'includes/cache/CacheDependency.php',
        'HTMLCacheUpdate' => 'includes/cache/HTMLCacheUpdate.php',
-       'HTMLCacheUpdateJob' => 'includes/cache/HTMLCacheUpdate.php',
        'HTMLFileCache' => 'includes/cache/HTMLFileCache.php',
        'LinkBatch' => 'includes/cache/LinkBatch.php',
        'LinkCache' => 'includes/cache/LinkCache.php',
@@ -429,11 +444,6 @@ $wgAutoloadLocalClasses = array(
        'TitleDependency' => 'includes/cache/CacheDependency.php',
        'TitleListDependency' => 'includes/cache/CacheDependency.php',
 
-       # includes/conf
-       'Conf' => 'includes/conf/Conf.php',
-       'DatabaseConf' => 'includes/conf/DatabaseConf.php',
-       'DefaultSettings' => 'includes/conf/DefaultSettings.php',
-
        # includes/context
        'ContextSource' => 'includes/context/ContextSource.php',
        'DerivativeContext' => 'includes/context/DerivativeContext.php',
@@ -442,12 +452,12 @@ $wgAutoloadLocalClasses = array(
 
        # includes/dao
        'IDBAccessObject' => 'includes/dao/IDBAccessObject.php',
+       'DBAccessBase' => 'includes/dao/DBAccessBase.php',
 
        # includes/db
        'Blob' => 'includes/db/DatabaseUtility.php',
        'ChronologyProtector' => 'includes/db/LBFactory.php',
        'CloneDatabase' => 'includes/db/CloneDatabase.php',
-       'Database' => 'includes/db/DatabaseMysql.php',
        'DatabaseBase' => 'includes/db/Database.php',
        'DatabaseIbm_db2' => 'includes/db/DatabaseIbm_db2.php',
        'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
@@ -566,8 +576,8 @@ $wgAutoloadLocalClasses = array(
        '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',
+       'DescribeFileOp' => 'includes/filebackend/FileOp.php',
        'NullFileOp' => 'includes/filebackend/FileOp.php',
 
        # includes/filerepo
@@ -602,7 +612,6 @@ $wgAutoloadLocalClasses = array(
        'Ibm_db2Updater' => 'includes/installer/Ibm_db2Updater.php',
        'InstallDocFormatter' => 'includes/installer/InstallDocFormatter.php',
        'Installer' => 'includes/installer/Installer.php',
-       'LBFactory_InstallerFake' => 'includes/installer/Installer.php',
        'LocalSettingsGenerator' => 'includes/installer/LocalSettingsGenerator.php',
        'MysqlInstaller' => 'includes/installer/MysqlInstaller.php',
        'MysqlUpdater' => 'includes/installer/MysqlUpdater.php',
@@ -635,13 +644,21 @@ $wgAutoloadLocalClasses = array(
        'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
 
        # includes/job
-       'DoubleRedirectJob' => 'includes/job/DoubleRedirectJob.php',
-       'EmaillingJob' => 'includes/job/EmaillingJob.php',
-       'EnotifNotifyJob' => 'includes/job/EnotifNotifyJob.php',
        'Job' => 'includes/job/Job.php',
-       'RefreshLinksJob' => 'includes/job/RefreshLinksJob.php',
-       'RefreshLinksJob2' => 'includes/job/RefreshLinksJob.php',
-       'UploadFromUrlJob' => 'includes/job/UploadFromUrlJob.php',
+       'JobQueue' => 'includes/job/JobQueue.php',
+       'JobQueueDB' => 'includes/job/JobQueueDB.php',
+       'JobQueueGroup' => 'includes/job/JobQueueGroup.php',
+
+       # includes/job/jobs
+       'DoubleRedirectJob' => 'includes/job/jobs/DoubleRedirectJob.php',
+       'DuplicateJob' => 'includes/job/jobs/DuplicateJob.php',
+       'EmaillingJob' => 'includes/job/jobs/EmaillingJob.php',
+       'EnotifNotifyJob' => 'includes/job/jobs/EnotifNotifyJob.php',
+       'HTMLCacheUpdateJob' => 'includes/job/jobs/HTMLCacheUpdateJob.php',
+       'NullJob' => 'includes/job/jobs/NullJob.php',
+       'RefreshLinksJob' => 'includes/job/jobs/RefreshLinksJob.php',
+       'RefreshLinksJob2' => 'includes/job/jobs/RefreshLinksJob.php',
+       'UploadFromUrlJob' => 'includes/job/jobs/UploadFromUrlJob.php',
 
        # includes/json
        'FormatJson' => 'includes/json/FormatJson.php',
@@ -680,6 +697,7 @@ $wgAutoloadLocalClasses = array(
        'PatrolLog' => 'includes/logging/PatrolLog.php',
        'PatrolLogFormatter' => 'includes/logging/LogFormatter.php',
        'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
+       'RightsLogFormatter' => 'includes/logging/LogFormatter.php',
 
        # includes/media
        'BitmapHandler' => 'includes/media/Bitmap.php',
@@ -831,7 +849,6 @@ $wgAutoloadLocalClasses = array(
        'RevDel_LogList' => 'includes/revisiondelete/RevisionDelete.php',
        'RevDel_RevisionItem' => 'includes/revisiondelete/RevisionDelete.php',
        'RevDel_RevisionList' => 'includes/revisiondelete/RevisionDelete.php',
-       'RevisionDelete' => 'includes/revisiondelete/RevisionDelete.php',
        'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php',
        'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php',
 
@@ -858,6 +875,15 @@ $wgAutoloadLocalClasses = array(
        'SqliteSearchResultSet' => 'includes/search/SearchSqlite.php',
        'SqlSearchResultSet' => 'includes/search/SearchEngine.php',
 
+       # includes/site
+       'MediaWikiSite' => 'includes/site/MediaWikiSite.php',
+       'Site' => 'includes/site/Site.php',
+       'SiteArray' => 'includes/site/SiteArray.php',
+       'SiteList' => 'includes/site/SiteList.php',
+       'SiteObject' => 'includes/site/SiteObject.php',
+       'Sites' => 'includes/site/Sites.php',
+       'SitesTable' => 'includes/site/SitesTable.php',
+
        # includes/specials
        'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
        'AllmessagesTablePager' => 'includes/specials/SpecialAllmessages.php',
@@ -866,8 +892,6 @@ $wgAutoloadLocalClasses = array(
        'BrokenRedirectsPage' => 'includes/specials/SpecialBrokenRedirects.php',
        'CategoryPager' => 'includes/specials/SpecialCategories.php',
        'ContribsPager' => 'includes/specials/SpecialContributions.php',
-       'DBLockForm' => 'includes/specials/SpecialLockdb.php',
-       'DBUnlockForm' => 'includes/specials/SpecialUnlockdb.php',
        'DeadendPagesPage' => 'includes/specials/SpecialDeadendpages.php',
        'DeletedContribsPager' => 'includes/specials/SpecialDeletedContributions.php',
        'DeletedContributionsPage' => 'includes/specials/SpecialDeletedContributions.php',
@@ -932,7 +956,6 @@ $wgAutoloadLocalClasses = array(
        'SpecialLockdb' => 'includes/specials/SpecialLockdb.php',
        'SpecialLog' => 'includes/specials/SpecialLog.php',
        'SpecialMergeHistory' => 'includes/specials/SpecialMergeHistory.php',
-       'SpecialMostlinkedtemplates' => 'includes/specials/SpecialMostlinkedtemplates.php',
        'SpecialNewFiles' => 'includes/specials/SpecialNewimages.php',
        'SpecialNewpages' => 'includes/specials/SpecialNewpages.php',
        'SpecialPasswordReset' => 'includes/specials/SpecialPasswordReset.php',
@@ -992,7 +1015,6 @@ $wgAutoloadLocalClasses = array(
        'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
        'UploadStash' => 'includes/upload/UploadStash.php',
        'UploadStashBadPathException' => 'includes/upload/UploadStash.php',
-       'UploadStashBadVersionException' => 'includes/upload/UploadStash.php',
        'UploadStashFile' => 'includes/upload/UploadStash.php',
        'UploadStashFileException' => 'includes/upload/UploadStash.php',
        'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
@@ -1007,20 +1029,29 @@ $wgAutoloadLocalClasses = array(
        'FakeConverter' => 'languages/Language.php',
        'Language' => 'languages/Language.php',
        'LanguageConverter' => 'languages/LanguageConverter.php',
+       'CLDRPluralRuleConverter' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleConverter_Expression' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleConverter_Fragment' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleConverter_Operator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
        'CLDRPluralRuleEvaluator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleEvaluator_Range' => 'languages/utils/CLDRPluralRuleEvaluator.php',
        'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleEvaluator.php',
 
        # maintenance
+       'BackupDumper' => 'maintenance/backup.inc',
        'ConvertLinks' => 'maintenance/convertLinks.php',
        'DeleteArchivedFilesImplementation' => 'maintenance/deleteArchivedFiles.inc',
        'DeleteArchivedRevisionsImplementation' => 'maintenance/deleteArchivedRevisions.inc',
        'DeleteDefaultMessages' => 'maintenance/deleteDefaultMessages.php',
+       'DumpDBZip2Output' => 'maintenance/backup.inc',
+       'ExportProgressFilter' => 'maintenance/backup.inc',
        'FakeMaintenance' => 'maintenance/Maintenance.php',
+       'FixExtLinksProtocolRelative' => 'maintenance/fixExtLinksProtocolRelative.php',
        'LoggedUpdateMaintenance' => 'maintenance/Maintenance.php',
        'Maintenance' => 'maintenance/Maintenance.php',
-       'FixExtLinksProtocolRelative' => 'maintenance/fixExtLinksProtocolRelative.php',
        'PopulateCategory' => 'maintenance/populateCategory.php',
        'PopulateImageSha1' => 'maintenance/populateImageSha1.php',
+       'PopulateFilearchiveSha1' => 'maintenance/populateFilearchiveSha1.php',
        'PopulateLogSearch' => 'maintenance/populateLogSearch.php',
        'PopulateLogUsertext' => 'maintenance/populateLogUsertext.php',
        'PopulateParentId' => 'maintenance/populateParentId.php',
@@ -1050,33 +1081,6 @@ $wgAutoloadLocalClasses = array(
        'InstallerOverrides' => 'mw-config/overrides.php',
        'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
 
-       # tests
-       'DbTestPreviewer' => 'tests/testHelpers.inc',
-       'DbTestRecorder' => 'tests/testHelpers.inc',
-       'DelayedParserTest' => 'tests/testHelpers.inc',
-       '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',
-
-       # tests/selenium
-       'Selenium' => 'tests/selenium/Selenium.php',
-       'SeleniumLoader' => 'tests/selenium/SeleniumLoader.php',
-       'SeleniumTestCase' => 'tests/selenium/SeleniumTestCase.php',
-       'SeleniumTestConsoleLogger' => 'tests/selenium/SeleniumTestConsoleLogger.php',
-       'SeleniumTestHTMLLogger' => 'tests/selenium/SeleniumTestHTMLLogger.php',
-       'SeleniumTestListener' => 'tests/selenium/SeleniumTestListener.php',
-       'SeleniumTestSuite' => 'tests/selenium/SeleniumTestSuite.php',
-       'SeleniumConfig' => 'tests/selenium/SeleniumConfig.php',
-
        # skins
        'CologneBlueTemplate' => 'skins/CologneBlue.php',
        'ModernTemplate' => 'skins/Modern.php',
index 9c77855..d7ed2f9 100644 (file)
@@ -157,6 +157,7 @@ class Autopromote {
         *
         * @param $cond Array: A condition, which must not contain other conditions
         * @param $user User The user to check the condition against
+        * @throws MWException
         * @return bool Whether the condition is true for the user
         */
        private static function checkCondition( $cond, User $user ) {
diff --git a/includes/BacklinkCache.php b/includes/BacklinkCache.php
deleted file mode 100644 (file)
index 05bf318..0000000
+++ /dev/null
@@ -1,419 +0,0 @@
-<?php
-/**
- * Class for fetching backlink lists, approximate backlink counts and
- * partitions.
- *
- * This program is free software; you can redistribute it and/or modify
- * 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 Tim Starling
- * @copyright © 2009, Tim Starling, Domas Mituzas
- * @copyright © 2010, Max Sem
- * @copyright © 2011, Antoine Musso
- */
-
-/**
- * Class for fetching backlink lists, approximate backlink counts and
- * partitions. This is a shared cache.
- *
- * Instances of this class should typically be fetched with the method
- * $title->getBacklinkCache().
- *
- * Ideally you should only get your backlinks from here when you think
- * there is some advantage in caching them. Otherwise it's just a waste
- * of memory.
- *
- * Introduced by r47317
- *
- * @internal documentation reviewed on 18 Mar 2011 by hashar
- */
-class BacklinkCache {
-       /** @var ProcessCacheLRU */
-       protected static $cache;
-
-       /**
-        * Multi dimensions array representing batches. Keys are:
-        *  > (string) links table name
-        *    > 'numRows' : Number of rows for this link table
-        *    > 'batches' : array( $start, $end )
-        *
-        * @see BacklinkCache::partitionResult()
-        *
-        * Cleared with BacklinkCache::clear()
-        */
-       protected $partitionCache = array();
-
-       /**
-        * Contains the whole links from a database result.
-        * This is raw data that will be partitioned in $partitionCache
-        *
-        * Initialized with BacklinkCache::getLinks()
-        * Cleared with BacklinkCache::clear()
-        */
-       protected $fullResultCache = array();
-
-       /**
-        * Local copy of a database object.
-        *
-        * Accessor: BacklinkCache::getDB()
-        * Mutator : BacklinkCache::setDB()
-        * Cleared with BacklinkCache::clear()
-        */
-       protected $db;
-
-       /**
-        * Local copy of a Title object
-        */
-       protected $title;
-
-       const CACHE_EXPIRY = 3600;
-
-       /**
-        * Create a new BacklinkCache
-        *
-        * @param Title $title : Title object to create a backlink cache for
-        */
-       public function __construct( Title $title ) {
-               $this->title = $title;
-       }
-
-       /**
-        * Create a new BacklinkCache or reuse any existing one.
-        * Currently, only one cache instance can exist; callers that
-        * need multiple backlink cache objects should keep them in scope.
-        *
-        * @param Title $title : Title object to get a backlink cache for
-        * @return BacklinkCache
-        */
-       public static function get( Title $title ) {
-               if ( !self::$cache ) { // init cache
-                       self::$cache = new ProcessCacheLRU( 1 );
-               }
-               $dbKey = $title->getPrefixedDBkey();
-               if ( !self::$cache->has( $dbKey, 'obj' ) ) {
-                       self::$cache->set( $dbKey, 'obj', new self( $title ) );
-               }
-               return self::$cache->get( $dbKey, 'obj' );
-       }
-
-       /**
-        * Serialization handler, diasallows to serialize the database to prevent
-        * failures after this class is deserialized from cache with dead DB
-        * connection.
-        *
-        * @return array
-        */
-       function __sleep() {
-               return array( 'partitionCache', 'fullResultCache', 'title' );
-       }
-
-       /**
-        * Clear locally stored data and database object.
-        */
-       public function clear() {
-               $this->partitionCache = array();
-               $this->fullResultCache = array();
-               unset( $this->db );
-       }
-
-       /**
-        * Set the Database object to use
-        *
-        * @param $db DatabaseBase
-        */
-       public function setDB( $db ) {
-               $this->db = $db;
-       }
-
-       /**
-        * Get the slave connection to the database
-        * When non existing, will initialize the connection.
-        * @return DatabaseBase object
-        */
-       protected function getDB() {
-               if ( !isset( $this->db ) ) {
-                       $this->db = wfGetDB( DB_SLAVE );
-               }
-
-               return $this->db;
-       }
-
-       /**
-        * Get the backlinks for a given table. Cached in process memory only.
-        * @param $table String
-        * @param $startId Integer or false
-        * @param $endId Integer or false
-        * @return TitleArrayFromResult
-        */
-       public function getLinks( $table, $startId = false, $endId = false ) {
-               wfProfileIn( __METHOD__ );
-
-               $fromField = $this->getPrefix( $table ) . '_from';
-
-               if ( $startId || $endId ) {
-                       // Partial range, not cached
-                       wfDebug( __METHOD__ . ": from DB (uncacheable range)\n" );
-                       $conds = $this->getConditions( $table );
-
-                       // Use the from field in the condition rather than the joined page_id,
-                       // because databases are stupid and don't necessarily propagate indexes.
-                       if ( $startId ) {
-                               $conds[] = "$fromField >= " . intval( $startId );
-                       }
-
-                       if ( $endId ) {
-                               $conds[] = "$fromField <= " . intval( $endId );
-                       }
-
-                       $res = $this->getDB()->select(
-                               array( $table, 'page' ),
-                               array( 'page_namespace', 'page_title', 'page_id' ),
-                               $conds,
-                               __METHOD__,
-                               array(
-                                       'STRAIGHT_JOIN',
-                                       'ORDER BY' => $fromField
-                               ) );
-                       $ta = TitleArray::newFromResult( $res );
-
-                       wfProfileOut( __METHOD__ );
-                       return $ta;
-               }
-
-               // @todo FIXME: Make this a function?
-               if ( !isset( $this->fullResultCache[$table] ) ) {
-                       wfDebug( __METHOD__ . ": from DB\n" );
-                       $res = $this->getDB()->select(
-                               array( $table, 'page' ),
-                               array( 'page_namespace', 'page_title', 'page_id' ),
-                               $this->getConditions( $table ),
-                               __METHOD__,
-                               array(
-                                       'STRAIGHT_JOIN',
-                                       'ORDER BY' => $fromField,
-                               ) );
-                       $this->fullResultCache[$table] = $res;
-               }
-
-               $ta = TitleArray::newFromResult( $this->fullResultCache[$table] );
-
-               wfProfileOut( __METHOD__ );
-               return $ta;
-       }
-
-       /**
-        * Get the field name prefix for a given table
-        * @param $table String
-        * @return null|string
-        */
-       protected function getPrefix( $table ) {
-               static $prefixes = array(
-                       'pagelinks'     => 'pl',
-                       'imagelinks'    => 'il',
-                       'categorylinks' => 'cl',
-                       'templatelinks' => 'tl',
-                       'redirect'      => 'rd',
-               );
-
-               if ( isset( $prefixes[$table] ) ) {
-                       return $prefixes[$table];
-               } else {
-                       $prefix = null;
-                       wfRunHooks( 'BacklinkCacheGetPrefix', array( $table, &$prefix ) );
-                       if( $prefix ) {
-                               return $prefix;
-                       } else {
-                               throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
-                       }
-               }
-       }
-
-       /**
-        * Get the SQL condition array for selecting backlinks, with a join
-        * on the page table.
-        * @param $table String
-        * @return array|null
-        */
-       protected function getConditions( $table ) {
-               $prefix = $this->getPrefix( $table );
-
-               // @todo FIXME: imagelinks and categorylinks do not rely on getNamespace,
-               // they could be moved up for nicer case statements
-               switch ( $table ) {
-                       case 'pagelinks':
-                       case 'templatelinks':
-                               $conds = array(
-                                       "{$prefix}_namespace" => $this->title->getNamespace(),
-                                       "{$prefix}_title"     => $this->title->getDBkey(),
-                                       "page_id={$prefix}_from"
-                               );
-                               break;
-                       case 'redirect':
-                               $conds = array(
-                                       "{$prefix}_namespace" => $this->title->getNamespace(),
-                                       "{$prefix}_title"     => $this->title->getDBkey(),
-                                       $this->getDb()->makeList( array(
-                                               "{$prefix}_interwiki = ''",
-                                               "{$prefix}_interwiki is null",
-                                       ), LIST_OR ),
-                                       "page_id={$prefix}_from"
-                               );
-                               break;
-                       case 'imagelinks':
-                               $conds = array(
-                                       'il_to' => $this->title->getDBkey(),
-                                       'page_id=il_from'
-                               );
-                               break;
-                       case 'categorylinks':
-                               $conds = array(
-                                       'cl_to' => $this->title->getDBkey(),
-                                       'page_id=cl_from',
-                               );
-                               break;
-                       default:
-                               $conds = null;
-                               wfRunHooks( 'BacklinkCacheGetConditions', array( $table, $this->title, &$conds ) );
-                               if( !$conds )
-                                       throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
-               }
-
-               return $conds;
-       }
-
-       /**
-        * Get the approximate number of backlinks
-        * @param $table String
-        * @return integer
-        */
-       public function getNumLinks( $table ) {
-               if ( isset( $this->fullResultCache[$table] ) ) {
-                       return $this->fullResultCache[$table]->numRows();
-               }
-
-               if ( isset( $this->partitionCache[$table] ) ) {
-                       $entry = reset( $this->partitionCache[$table] );
-                       return $entry['numRows'];
-               }
-
-               $titleArray = $this->getLinks( $table );
-
-               return $titleArray->count();
-       }
-
-       /**
-        * Partition the backlinks into batches.
-        * Returns an array giving the start and end of each range. The first
-        * batch has a start of false, and the last batch has an end of false.
-        *
-        * @param $table String: the links table name
-        * @param $batchSize Integer
-        * @return Array
-        */
-       public function partition( $table, $batchSize ) {
-
-               // 1) try partition cache ...
-
-               if ( isset( $this->partitionCache[$table][$batchSize] ) ) {
-                       wfDebug( __METHOD__ . ": got from partition cache\n" );
-                       return $this->partitionCache[$table][$batchSize]['batches'];
-               }
-
-               $this->partitionCache[$table][$batchSize] = false;
-               $cacheEntry =& $this->partitionCache[$table][$batchSize];
-
-               // 2) ... then try full result cache ...
-
-               if ( isset( $this->fullResultCache[$table] ) ) {
-                       $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
-                       wfDebug( __METHOD__ . ": got from full result cache\n" );
-
-                       return $cacheEntry['batches'];
-               }
-
-               // 3) ... fallback to memcached ...
-
-               global $wgMemc;
-
-               $memcKey = wfMemcKey(
-                       'backlinks',
-                       md5( $this->title->getPrefixedDBkey() ),
-                       $table,
-                       $batchSize
-               );
-
-               $memcValue = $wgMemc->get( $memcKey );
-
-               if ( is_array( $memcValue ) ) {
-                       $cacheEntry = $memcValue;
-                       wfDebug( __METHOD__ . ": got from memcached $memcKey\n" );
-
-                       return $cacheEntry['batches'];
-               }
-
-
-               // 4) ... finally fetch from the slow database :(
-
-               $this->getLinks( $table );
-               $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
-               // Save to memcached
-               $wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
-
-               wfDebug( __METHOD__ . ": got from database\n" );
-               return $cacheEntry['batches'];
-       }
-
-       /**
-        * Partition a DB result with backlinks in it into batches
-        * @param $res ResultWrapper database result
-        * @param $batchSize integer
-        * @return array @see
-        */
-       protected function partitionResult( $res, $batchSize ) {
-               $batches = array();
-               $numRows = $res->numRows();
-               $numBatches = ceil( $numRows / $batchSize );
-
-               for ( $i = 0; $i < $numBatches; $i++ ) {
-                       if ( $i == 0  ) {
-                               $start = false;
-                       } else {
-                               $rowNum = intval( $numRows * $i / $numBatches );
-                               $res->seek( $rowNum );
-                               $row = $res->fetchObject();
-                               $start = $row->page_id;
-                       }
-
-                       if ( $i == $numBatches - 1 ) {
-                               $end = false;
-                       } else {
-                               $rowNum = intval( $numRows * ( $i + 1 ) / $numBatches );
-                               $res->seek( $rowNum );
-                               $row = $res->fetchObject();
-                               $end = $row->page_id - 1;
-                       }
-
-                       # Sanity check order
-                       if ( $start && $end && $start > $end ) {
-                               throw new MWException( __METHOD__ . ': Internal error: query result out of order' );
-                       }
-
-                       $batches[] = array( $start, $end );
-               }
-
-               return array( 'numRows' => $numRows, 'batches' => $batches );
-       }
-}
index 732699d..e05b2ac 100644 (file)
@@ -164,7 +164,7 @@ class Block {
 
        /**
         * Check if two blocks are effectively equal.  Doesn't check irrelevant things like
-        * the blocking user or the block timestamp, only things which affect the blocked user   *
+        * the blocking user or the block timestamp, only things which affect the blocked user
         *
         * @param $block Block
         *
@@ -231,6 +231,7 @@ class Block {
         *     3) An autoblock on the given IP
         * @param $vagueTarget User|String also search for blocks affecting this target.  Doesn't
         *     make any sense to use TYPE_AUTO / TYPE_ID here. Leave blank to skip IP lookups.
+        * @throws MWException
         * @return Bool whether a relevant block was found
         */
        protected function newLoad( $vagueTarget = null ) {
@@ -426,6 +427,7 @@ class Block {
        /**
         * Delete the row from the IP blocks table.
         *
+        * @throws MWException
         * @return Boolean
         */
        public function delete() {
@@ -534,10 +536,10 @@ class Block {
                        'ipb_expiry'           => $expiry,
                        'ipb_range_start'      => $this->getRangeStart(),
                        'ipb_range_end'        => $this->getRangeEnd(),
-                       'ipb_deleted'          => intval( $this->mHideName ), // typecast required for SQLite
+                       'ipb_deleted'          => intval( $this->mHideName ), // typecast required for SQLite
                        'ipb_block_email'      => $this->prevents( 'sendemail' ),
                        'ipb_allow_usertalk'   => !$this->prevents( 'editownusertalk' ),
-                       'ipb_parent_block_id'            => $this->mParentBlockId
+                       'ipb_parent_block_id'  => $this->mParentBlockId
                );
 
                return $a;
@@ -780,6 +782,7 @@ class Block {
 
        /**
         * Get the IP address at the start of the range in Hex form
+        * @throws MWException
         * @return String IP in Hex form
         */
        public function getRangeStart() {
@@ -797,6 +800,7 @@ class Block {
 
        /**
         * Get the IP address at the start of the range in Hex form
+        * @throws MWException
         * @return String IP in Hex form
         */
        public function getRangeEnd() {
index ac46fc4..f0ae5a3 100644 (file)
@@ -18,7 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 
index b7b12e8..b9c9609 100644 (file)
@@ -44,6 +44,7 @@ class Category {
 
        /**
         * Set up all member variables using a database query.
+        * @throws MWException
         * @return bool True on success, false on failure.
         */
        protected function initialize() {
@@ -57,6 +58,9 @@ class Category {
                        # Already initialized
                        return true;
                }
+
+               wfProfileIn( __METHOD__ );
+
                $dbr = wfGetDB( DB_SLAVE );
                $row = $dbr->selectRow(
                        'category',
@@ -65,6 +69,8 @@ class Category {
                        __METHOD__
                );
 
+               wfProfileOut( __METHOD__ );
+
                if ( !$row ) {
                        # Okay, there were no contents.  Nothing to initialize.
                        if ( $this->mTitle ) {
@@ -189,25 +195,37 @@ class Category {
        }
 
        /** @return mixed DB key name, or false on failure */
-       public function getName() { return $this->getX( 'mName' ); }
+       public function getName() {
+               return $this->getX( 'mName' );
+       }
 
        /** @return mixed Category ID, or false on failure */
-       public function getID() { return $this->getX( 'mID' ); }
+       public function getID() {
+               return $this->getX( 'mID' );
+       }
 
        /** @return mixed Total number of member pages, or false on failure */
-       public function getPageCount() { return $this->getX( 'mPages' ); }
+       public function getPageCount() {
+               return $this->getX( 'mPages' );
+       }
 
        /** @return mixed Number of subcategories, or false on failure */
-       public function getSubcatCount() { return $this->getX( 'mSubcats' ); }
+       public function getSubcatCount() {
+               return $this->getX( 'mSubcats' );
+       }
 
        /** @return mixed Number of member files, or false on failure */
-       public function getFileCount() { return $this->getX( 'mFiles' ); }
+       public function getFileCount() {
+               return $this->getX( 'mFiles' );
+       }
 
        /**
         * @return Title|bool Title for this category, or false on failure.
         */
        public function getTitle() {
-               if ( $this->mTitle ) return $this->mTitle;
+               if ( $this->mTitle ) {
+                       return $this->mTitle;
+               }
 
                if ( !$this->initialize() ) {
                        return false;
@@ -225,20 +243,22 @@ class Category {
         * @return TitleArray object for category members.
         */
        public function getMembers( $limit = false, $offset = '' ) {
+               wfProfileIn( __METHOD__ );
+
                $dbr = wfGetDB( DB_SLAVE );
 
                $conds = array( 'cl_to' => $this->getName(), 'cl_from = page_id' );
                $options = array( 'ORDER BY' => 'cl_sortkey' );
 
                if ( $limit ) {
-                       $options[ 'LIMIT' ] = $limit;
+                       $options['LIMIT'] = $limit;
                }
 
                if ( $offset !== '' ) {
                        $conds[] = 'cl_sortkey > ' . $dbr->addQuotes( $offset );
                }
 
-               return TitleArray::newFromResult(
+               $result = TitleArray::newFromResult(
                        $dbr->select(
                                array( 'page', 'categorylinks' ),
                                array( 'page_id', 'page_namespace', 'page_title', 'page_len',
@@ -248,6 +268,10 @@ class Category {
                                $options
                        )
                );
+
+               wfProfileOut( __METHOD__ );
+
+               return $result;
        }
 
        /**
@@ -258,7 +282,7 @@ class Category {
                if ( !$this->initialize() ) {
                        return false;
                }
-               return $this-> { $key } ;
+               return $this->{$key};
        }
 
        /**
@@ -278,8 +302,10 @@ class Category {
                        }
                }
 
+               wfProfileIn( __METHOD__ );
+
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->begin( __METHOD__  );
+               $dbw->begin( __METHOD__ );
 
                # Insert the row if it doesn't exist yet (e.g., this is being run via
                # update.php from a pre-1.16 schema).  TODO: This will cause lots and
@@ -302,12 +328,12 @@ class Category {
                $result = $dbw->selectRow(
                        array( 'categorylinks', 'page' ),
                        array( 'pages' => 'COUNT(*)',
-                                  'subcats' => "COUNT($cond1)",
-                                  'files' => "COUNT($cond2)"
+                               'subcats' => "COUNT($cond1)",
+                               'files' => "COUNT($cond2)"
                        ),
                        array( 'cl_to' => $this->mName, 'page_id = cl_from' ),
                        __METHOD__,
-                       'LOCK IN SHARE MODE'
+                       array( 'LOCK IN SHARE MODE' )
                );
                $ret = $dbw->update(
                        'category',
@@ -321,6 +347,8 @@ class Category {
                );
                $dbw->commit( __METHOD__ );
 
+               wfProfileOut( __METHOD__ );
+
                # Now we should update our local counts.
                $this->mPages   = $result->pages;
                $this->mSubcats = $result->subcats;
index 3bb2bc9..b59b4e1 100644 (file)
@@ -173,7 +173,7 @@ class CategoryViewer extends ContextSource {
 
        /**
         * Add a subcategory to the internal lists, using a title object
-        * @deprecated since 1.17 kept for compatibility, please use addSubcategoryObject instead
+        * @deprecated since 1.17 kept for compatibility, use addSubcategoryObject instead
         */
        function addSubcategory( Title $title, $sortkey, $pageLength ) {
                wfDeprecated( __METHOD__, '1.17' );
@@ -181,14 +181,14 @@ class CategoryViewer extends ContextSource {
        }
 
        /**
-       * Get the character to be used for sorting subcategories.
-       * If there's a link from Category:A to Category:B, the sortkey of the resulting
-       * entry in the categorylinks table is Category:A, not A, which it SHOULD be.
-       * Workaround: If sortkey == "Category:".$title, than use $title for sorting,
-       * else use sortkey...
-       *
-       * @param Title $title
-       * @param string $sortkey The human-readable sortkey (before transforming to icu or whatever).
+        * Get the character to be used for sorting subcategories.
+        * If there's a link from Category:A to Category:B, the sortkey of the resulting
+        * entry in the categorylinks table is Category:A, not A, which it SHOULD be.
+        * Workaround: If sortkey == "Category:".$title, than use $title for sorting,
+        * else use sortkey...
+        *
+        * @param Title $title
+        * @param string $sortkey The human-readable sortkey (before transforming to icu or whatever).
         * @return string
         */
        function getSubcategorySortChar( $title, $sortkey ) {
@@ -259,15 +259,15 @@ class CategoryViewer extends ContextSource {
 
        function finaliseCategoryState() {
                if ( $this->flip['subcat'] ) {
-                       $this->children            = array_reverse( $this->children );
+                       $this->children = array_reverse( $this->children );
                        $this->children_start_char = array_reverse( $this->children_start_char );
                }
                if ( $this->flip['page'] ) {
-                       $this->articles            = array_reverse( $this->articles );
+                       $this->articles = array_reverse( $this->articles );
                        $this->articles_start_char = array_reverse( $this->articles_start_char );
                }
                if ( !$this->showGallery && $this->flip['file'] ) {
-                       $this->imgsNoGallery            = array_reverse( $this->imgsNoGallery );
+                       $this->imgsNoGallery = array_reverse( $this->imgsNoGallery );
                        $this->imgsNoGallery_start_char = array_reverse( $this->imgsNoGallery_start_char );
                }
        }
@@ -302,7 +302,7 @@ class CategoryViewer extends ContextSource {
                                        'page_is_redirect', 'cl_sortkey', 'cat_id', 'cat_title',
                                        'cat_subcats', 'cat_pages', 'cat_files',
                                        'cl_sortkey_prefix', 'cl_collation' ),
-                               array_merge( array( 'cl_to' => $this->title->getDBkey() ),  $extraConds ),
+                               array_merge( array( 'cl_to' => $this->title->getDBkey() ), $extraConds ),
                                __METHOD__,
                                array(
                                        'USE INDEX' => array( 'categorylinks' => 'cl_sortkey' ),
@@ -310,7 +310,7 @@ class CategoryViewer extends ContextSource {
                                        'ORDER BY' => $this->flip[$type] ? 'cl_sortkey DESC' : 'cl_sortkey',
                                ),
                                array(
-                                       'categorylinks'  => array( 'INNER JOIN', 'cl_from = page_id' ),
+                                       'categorylinks' => array( 'INNER JOIN', 'cl_from = page_id' ),
                                        'category' => array( 'LEFT JOIN', 'cat_title = page_title AND page_namespace = ' . NS_CATEGORY )
                                )
                        );
@@ -469,7 +469,7 @@ class CategoryViewer extends ContextSource {
         */
        function formatList( $articles, $articles_start_char, $cutoff = 6 ) {
                $list = '';
-               if ( count ( $articles ) > $cutoff ) {
+               if ( count( $articles ) > $cutoff ) {
                        $list = self::columnList( $articles, $articles_start_char );
                } elseif ( count( $articles ) > 0 ) {
                        // for short lists of articles in categories.
@@ -478,7 +478,7 @@ class CategoryViewer extends ContextSource {
 
                $pageLang = $this->title->getPageLanguage();
                $attribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(),
-                       'class' => 'mw-content-'.$pageLang->getDir() );
+                       'class' => 'mw-content-' . $pageLang->getDir() );
                $list = Html::rawElement( 'div', $attribs, $list );
 
                return $list;
@@ -604,7 +604,7 @@ class CategoryViewer extends ContextSource {
                        );
                }
 
-               return $this->msg('categoryviewer-pagedlinks')->rawParams($prevLink, $nextLink)->escaped();
+               return $this->msg( 'categoryviewer-pagedlinks' )->rawParams( $prevLink, $nextLink )->escaped();
        }
 
        /**
@@ -613,6 +613,7 @@ class CategoryViewer extends ContextSource {
         *
         * @param Title $title: The title (usually $this->title)
         * @param String $section: Which section
+        * @throws MWException
         * @return Title
         */
        private function addFragmentToTitle( $title, $section ) {
@@ -634,6 +635,7 @@ class CategoryViewer extends ContextSource {
                return Title::makeTitle( $title->getNamespace(),
                        $title->getDBkey(), $fragment );
        }
+
        /**
         * What to do if the category table conflicts with the number of results
         * returned?  This function says what. Each type is considered independently
@@ -675,8 +677,9 @@ class CategoryViewer extends ContextSource {
                        $fromOrUntil = true;
                }
 
-               if ( $dbcnt == $rescnt || ( ( $rescnt == $this->limit || $fromOrUntil )
-                       && $dbcnt > $rescnt ) ) {
+               if ( $dbcnt == $rescnt ||
+                       ( ( $rescnt == $this->limit || $fromOrUntil ) && $dbcnt > $rescnt )
+               ) {
                        # Case 1: seems sane.
                        $totalcnt = $dbcnt;
                } elseif ( $rescnt < $this->limit && !$fromOrUntil ) {
index e2b6a0c..589950f 100644 (file)
  *
  * Example use :
  * <code>
- *     # Determines whether the article with the page_id 12345 is in both
- *     # "Category 1" and "Category 2" or their subcategories, respectively
+ *     # Determines whether the article with the page_id 12345 is in both
+ *     # "Category 1" and "Category 2" or their subcategories, respectively
  *
- *     $cf = new Categoryfinder;
- *     $cf->seed(
- *             array( 12345 ),
- *             array( 'Category 1', 'Category 2' ),
- *             'AND'
- *     );
- *     $a = $cf->run();
- *     print implode( ',' , $a );
+ *     $cf = new Categoryfinder;
+ *     $cf->seed(
+ *         array( 12345 ),
+ *         array( 'Category 1', 'Category 2' ),
+ *         'AND'
+ *     );
+ *     $a = $cf->run();
+ *     print implode( ',' , $a );
  * </code>
  *
  */
@@ -135,7 +135,7 @@ class Categoryfinder {
 
                # iterate through the parents
                foreach ( $this->parents[$id] as $p ) {
-                       $pname = $p->cl_to ;
+                       $pname = $p->cl_to;
 
                        # Is this a condition?
                        if ( isset( $conds[$pname] ) ) {
@@ -172,6 +172,8 @@ class Categoryfinder {
         * Scans a "parent layer" of the articles/categories in $this->next
         */
        function scan_next_layer() {
+               wfProfileIn( __METHOD__ );
+
                # Find all parents of the article currently in $this->next
                $layer = array();
                $res = $this->dbr->select(
@@ -225,6 +227,7 @@ class Categoryfinder {
                foreach ( $layer as $v ) {
                        $this->deadend[$v] = $v;
                }
-       }
 
+               wfProfileOut( __METHOD__ );
+       }
 }
index ae2e5b1..2a6a3d2 100644 (file)
@@ -133,8 +133,9 @@ class CdbReader_DBA {
        }
 
        function close() {
-               if( isset($this->handle) )
+               if( isset($this->handle) ) {
                        dba_close( $this->handle );
+               }
                unset( $this->handle );
        }
 
@@ -164,8 +165,9 @@ class CdbWriter_DBA {
        }
 
        function close() {
-               if( isset($this->handle) )
+               if( isset($this->handle) ) {
                        dba_close( $this->handle );
+               }
                if ( wfIsWindows() ) {
                        unlink( $this->realFileName );
                }
index 02be65f..f58e07e 100644 (file)
@@ -126,6 +126,7 @@ class CdbReader_PHP extends CdbReader {
 
        /**
         * @param $fileName string
+        * @throws MWException
         */
        function __construct( $fileName ) {
                $this->fileName = $fileName;
@@ -179,7 +180,7 @@ class CdbReader_PHP extends CdbReader {
        protected function read( $length, $pos ) {
                if ( fseek( $this->handle, $pos ) == -1 ) {
                        // This can easily happen if the internal pointers are incorrect
-                       throw new MWException( 
+                       throw new MWException(
                                'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
                }
 
@@ -198,12 +199,13 @@ class CdbReader_PHP extends CdbReader {
        /**
         * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
         * @param $s
-        * @return
+        * @throws MWException
+        * @return mixed
         */
        protected function unpack31( $s ) {
                $data = unpack( 'V', $s );
                if ( $data[1] > 0x7fffffff ) {
-                       throw new MWException( 
+                       throw new MWException(
                                'Error in CDB file "' . $this->fileName . '", integer too big.' );
                }
                return $data[1];
@@ -475,7 +477,7 @@ class CdbWriter_PHP extends CdbWriter {
 
        /**
         * Clean up the temp file and throw an exception
-        * 
+        *
         * @param $msg string
         * @throws MWException
         */
index 0ebc926..18f425a 100644 (file)
@@ -81,6 +81,7 @@ class ChangeTags {
         * @param $log_id int: log_id of the change to add the tags to
         * @param $params String: params to put in the ct_params field of tabel 'change_tag'
         *
+        * @throws MWException
         * @return bool: false if no changes are made, otherwise true
         *
         * @exception MWException when $rc_id, $rev_id and $log_id are all null
@@ -164,10 +165,9 @@ class ChangeTags {
         * @param $conds String|Array: conditions used in query, see DatabaseBase::select
         * @param $join_conds Array: join conditions, see DatabaseBase::select
         * @param $options Array: options, see Database::select
-        * @param $filter_tag String: tag to select on
-        *
-        * @exception MWException when unable to determine appropriate JOIN condition for tagging
+        * @param bool|string $filter_tag Tag to select on
         *
+        * @throws MWException When unable to determine appropriate JOIN condition for tagging
         */
        static function modifyDisplayQuery( &$tables, &$fields,  &$conds,
                                                                                &$join_conds, &$options, $filter_tag = false ) {
@@ -224,8 +224,9 @@ class ChangeTags {
        public static function buildTagFilterSelector( $selected='', $fullForm = false, Title $title = null ) {
                global $wgUseTagFilter;
 
-               if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) )
+               if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) ) {
                        return $fullForm ? '' : array();
+               }
 
                $data = array( Html::rawElement( 'label', array( 'for' => 'tagfilter' ), wfMessage( 'tag-filter' )->parse() ),
                        Xml::input( 'tagfilter', 20, $selected, array( 'class' => 'mw-tagfilter-input' ) ) );
index 8467712..9ca64c5 100644 (file)
@@ -514,12 +514,12 @@ class ChangesList extends ContextSource {
                        if ( $this->getUser()->isAllowed('rollback') && $rc->mAttribs['page_latest'] == $rc->mAttribs['rc_this_oldid'] )
                        {
                                $rev = new Revision( array(
+                                       'title'     => $page,
                                        'id'        => $rc->mAttribs['rc_this_oldid'],
                                        'user'      => $rc->mAttribs['rc_user'],
                                        'user_text' => $rc->mAttribs['rc_user_text'],
                                        'deleted'   => $rc->mAttribs['rc_deleted']
                                ) );
-                               $rev->setTitle( $page );
                                $s .= ' '.Linker::generateRollback( $rev, $this->getContext() );
                        }
                }
@@ -862,6 +862,8 @@ class EnhancedChangesList extends ChangesList {
                # Other properties
                $unpatrolled = false;
                $isnew = false;
+               $allBots = true;
+               $allMinors = true;
                $curId = $currentRevision = 0;
                # Some catalyst variables...
                $namehidden = true;
@@ -895,7 +897,13 @@ class EnhancedChangesList extends ChangesList {
                                $currentRevision = $rcObj->mAttribs['rc_this_oldid'];
                        }
 
-                       $bot = $rcObj->mAttribs['rc_bot'];
+                       if( !$rcObj->mAttribs['rc_bot'] ) {
+                               $allBots = false;
+                       }
+                       if( !$rcObj->mAttribs['rc_minor'] ) {
+                               $allMinors = false;
+                       }
+
                        $userlinks[$u]++;
                }
 
@@ -922,10 +930,10 @@ class EnhancedChangesList extends ChangesList {
 
                # Main line
                $r .= '<td class="mw-enhanced-rc">' . $this->recentChangesFlags( array(
-                       'newpage' => $isnew,
-                       'minor' => false,
-                       'unpatrolled' => $unpatrolled,
-                       'bot' => $bot ,
+                       'newpage' => $isnew, # show, when one have this flag
+                       'minor' => $allMinors, # show only, when all have this flag
+                       'unpatrolled' => $unpatrolled, # show, when one have this flag
+                       'bot' => $allBots, # show only, when all have this flag
                ) );
 
                # Timestamp
@@ -1058,8 +1066,9 @@ class EnhancedChangesList extends ChangesList {
                                                array(),
                                                $params
                                        );
-                               if( $this->isDeleted($rcObj,Revision::DELETED_TEXT) )
+                               if( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
                                        $link = '<span class="history-deleted">'.$link.'</span> ';
+                               }
                        }
                        $r .= $link . '</span>';
 
index ad2b94b..3cc7902 100644 (file)
@@ -152,10 +152,10 @@ class IcuCollation extends Collation {
        /**
         * Unified CJK blocks.
         *
-        * The same definition of a CJK block must be used for both Collation and 
-        * generateCollationData.php. These blocks are omitted from the first 
-        * letter data, as an optimisation measure and because the default UCA table 
-        * is pretty useless for sorting Chinese text anyway. Japanese and Korean 
+        * The same definition of a CJK block must be used for both Collation and
+        * generateCollationData.php. These blocks are omitted from the first
+        * letter data, as an optimisation measure and because the default UCA table
+        * is pretty useless for sorting Chinese text anyway. Japanese and Korean
         * blocks are not included here, because they are smaller and more useful.
         */
        static $cjkBlocks = array(
@@ -180,7 +180,7 @@ class IcuCollation extends Collation {
 
        function __construct( $locale ) {
                if ( !extension_loaded( 'intl' ) ) {
-                       throw new MWException( 'An ICU collation was requested, ' . 
+                       throw new MWException( 'An ICU collation was requested, ' .
                                'but the intl extension is not available.' );
                }
                $this->locale = $locale;
@@ -218,8 +218,8 @@ class IcuCollation extends Collation {
 
                // Check for CJK
                $firstChar = mb_substr( $string, 0, 1, 'UTF-8' );
-               if ( ord( $firstChar ) > 0x7f 
-                       && self::isCjk( utf8ToCodepoint( $firstChar ) ) ) 
+               if ( ord( $firstChar ) > 0x7f
+                       && self::isCjk( utf8ToCodepoint( $firstChar ) ) )
                {
                        return $firstChar;
                }
@@ -265,9 +265,9 @@ class IcuCollation extends Collation {
                // Sort the letters.
                //
                // It's impossible to have the precompiled data file properly sorted,
-               // because the sort order changes depending on ICU version. If the 
-               // array is not properly sorted, the binary search will return random 
-               // results. 
+               // because the sort order changes depending on ICU version. If the
+               // array is not properly sorted, the binary search will return random
+               // results.
                //
                // We also take this opportunity to remove primary collisions.
                $letterMap = array();
@@ -320,7 +320,7 @@ class IcuCollation extends Collation {
        }
 
        /**
-        * Do a binary search, and return the index of the largest item that sorts 
+        * Do a binary search, and return the index of the largest item that sorts
         * less than or equal to the target value.
         *
         * @param $valueCallback array A function to call to get the value with
@@ -335,8 +335,12 @@ class IcuCollation extends Collation {
         *     sorts before all items.
         */
        function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
+               if ( $valueCount === 0 ) {
+                       return false;
+               }
+
                $min = 0;
-               $max = $valueCount - 1;
+               $max = $valueCount;
                do {
                        $mid = $min + ( ( $max - $min ) >> 1 );
                        $item = call_user_func( $valueCallback, $mid );
@@ -351,12 +355,15 @@ class IcuCollation extends Collation {
                        }
                } while ( $min < $max - 1 );
 
-               if ( $min == 0 && $max == 0 && $comparison > 0 ) {
-                       // Before the first item
-                       return false;
-               } else {
-                       return $min;
+               if ( $min == 0 ) {
+                       $item = call_user_func( $valueCallback, $min );
+                       $comparison = call_user_func( $comparisonCallback, $target, $item );
+                       if ( $comparison < 0 ) {
+                               // Before the first item
+                               return false;
+                       }
                }
+               return $min;
        }
 
        static function isCjk( $codepoint ) {
index b68fc76..d304e65 100644 (file)
@@ -159,6 +159,7 @@ class ConfEditor {
         * insert
         *    Insert a new element at the start of the array.
         *
+        * @throws MWException
         * @return string
         */
        public function edit( $ops ) {
@@ -392,6 +393,8 @@ class ConfEditor {
         * Finds the source byte region which you would want to delete, if $pathName
         * was to be deleted. Includes the leading spaces and tabs, the trailing line
         * break, and any comments in between.
+        * @param $pathName
+        * @throws MWException
         * @return array
         */
        function findDeletionRegion( $pathName ) {
@@ -450,6 +453,8 @@ class ConfEditor {
         * or semicolon.
         *
         * The end position is the past-the-end (end + 1) value as per convention.
+        * @param $pathName
+        * @throws MWException
         * @return array
         */
        function findValueRegion( $pathName ) {
index 7984d63..48216f0 100644 (file)
@@ -40,14 +40,15 @@ class Cookie {
 
        /**
         * Sets a cookie.  Used before a request to set up any individual
-        * cookies.      Used internally after a request to parse the
+        * cookies. Used internally after a request to parse the
         * Set-Cookie headers.
         *
         * @param $value String: the value of the cookie
         * @param $attr Array: possible key/values:
-        *              expires  A date string
-        *              path     The path this cookie is used on
-        *              domain   Domain this cookie is used on
+        *        expires A date string
+        *        path    The path this cookie is used on
+        *        domain  Domain this cookie is used on
+        * @throws MWException
         */
        public function set( $value, $attr ) {
                $this->value = $value;
@@ -193,7 +194,7 @@ class CookieJar {
        private $cookie = array();
 
        /**
-        * Set a cookie in the cookie jar.      Make sure only one cookie per-name exists.
+        * Set a cookie in the cookie jar. Make sure only one cookie per-name exists.
         * @see Cookie::set()
         */
        public function setCookie ( $name, $value, $attr ) {
index 858eebf..fcf6a39 100644 (file)
@@ -391,7 +391,7 @@ class MWCryptRand {
                // We hash the random state with more salt to avoid the state from leaking
                // out and being used to predict the /randomness/ that follows.
                if ( strlen( $buffer ) < $bytes ) {
-                       wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" ); 
+                       wfDebug( __METHOD__ . ": Falling back to using a pseudo random state to generate randomness.\n" );
                }
                while ( strlen( $buffer ) < $bytes ) {
                        wfProfileIn( __METHOD__ . '-fallback' );
index 377b64c..04029db 100644 (file)
@@ -74,8 +74,8 @@ abstract class DataUpdate implements DeferrableUpdate {
         * This allows for limited transactional logic across multiple backends for storing
         * secondary data.
         *
-        * @static
         * @param $updates array a list of DataUpdate instances
+        * @throws Exception|null
         */
        public static function runUpdates( $updates ) {
                if ( empty( $updates ) ) return; # nothing to do
index 19670bf..2073f16 100644 (file)
@@ -59,7 +59,7 @@ if( !defined( 'MEDIAWIKI' ) ) {
 $wgConf = new SiteConfiguration;
 
 /** MediaWiki version number */
-$wgVersion = '1.20alpha';
+$wgVersion = '1.21alpha';
 
 /** Name of the site. It must be changed in LocalSettings.php */
 $wgSitename = 'MediaWiki';
@@ -361,7 +361,9 @@ $wgImgAuthPublicTest = true;
  *                          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
+ *                          urlsByExt  : map of file extension types to base URLs
+ *                                       (useful for using a different cache for videos)
+ *                          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.
@@ -530,6 +532,19 @@ $wgAllowAsyncCopyUploads = false;
  */
 $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;
+
+/**
+ * Proxy to use for copy upload requests.
+ * @since 1.20
+ */
+$wgCopyUploadProxy = 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
@@ -732,6 +747,23 @@ $wgMediaHandlers = array(
        'image/x-djvu'   => 'DjVuHandler', // compat
 );
 
+/**
+ * Plugins for page content model handling.
+ * Each entry in the array maps a model id to a class name.
+ *
+ * @since 1.21
+ */
+$wgContentHandlers = array(
+       // the usual case
+       CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler',
+       // dumb version, no syntax highlighting
+       CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
+       // dumb version, no syntax highlighting
+       CONTENT_MODEL_CSS => 'CssContentHandler',
+       // plain text, for use by extensions etc
+       CONTENT_MODEL_TEXT => 'TextContentHandler',
+);
+
 /**
  * Resizing can be done using PHP's internal image libraries or using
  * ImageMagick or another third-party converter, e.g. GraphicMagick.
@@ -1070,6 +1102,16 @@ $wgThumbUpright = 0.75;
  */
 $wgDirectoryMode = 0777;
 
+/**
+ * Generate and use thumbnails suitable for screens with 1.5 and 2.0 pixel densities.
+ *
+ * This means a 320x240 use of an image on the wiki will also generate 480x360 and 640x480
+ * thumbnails, output via data-src-1-5 and data-src-2-0. Runtime JavaScript switches the
+ * images in after loading the original low-resolution versions depending on the reported
+ * window.devicePixelRatio.
+ */
+$wgResponsiveImages = true;
+
 /**
  * @name DJVU settings
  * @{
@@ -1371,10 +1413,14 @@ $wgAllDBsAreLocalhost = false;
  * $wgSharedTables may be customized with a list of tables to share in the shared
  * datbase. However it is advised to limit what tables you do share as many of
  * MediaWiki's tables may have side effects if you try to share them.
- * EXPERIMENTAL
  *
  * $wgSharedPrefix is the table prefix for the shared database. It defaults to
  * $wgDBprefix.
+ *
+ * @deprecated In new code, use the $wiki parameter to wfGetLB() to access
+ *   remote databases. Using wfGetLB() allows the shared database to reside on
+ *   separate servers to the wiki's own database, with suitable configuration
+ *   of $wgLBFactoryConf.
  */
 $wgSharedDB = null;
 
@@ -1752,7 +1798,7 @@ $wgDBAhandler = 'db3';
 /**
  * Deprecated alias for $wgSessionsInObjectCache.
  *
- * @deprecated Use $wgSessionsInObjectCache
+ * @deprecated since 1.20; Use $wgSessionsInObjectCache
  */
 $wgSessionsInMemcached = false;
 
@@ -1809,9 +1855,10 @@ $wgUseLocalMessageCache = false;
 $wgLocalMessageCacheSerialized = true;
 
 /**
- * Instead of caching everything, keep track which messages are requested and
- * load only most used messages. This only makes sense if there is lots of
- * interface messages customised in the wiki (like hundreds in many languages).
+ * Instead of caching everything, only cache those messages which have
+ * been customised in the site content language. This means that
+ * MediaWiki:Foo/ja is ignored if MediaWiki:Foo doesn't exist.
+ * This option is probably only useful for translatewiki.net.
  */
 $wgAdaptiveMessageCache = false;
 
@@ -2025,6 +2072,27 @@ $wgSquidServersNoPurge = array();
 /** Maximum number of titles to purge in any one client operation */
 $wgMaxSquidPurgeTitles = 400;
 
+/**
+ * Whether to use a Host header in purge requests sent to the proxy servers
+ * configured in $wgSquidServers. Set this to false to support Squid
+ * configured in forward-proxy mode.
+ *
+ * If this is set to true, a Host header will be sent, and only the path
+ * component of the URL will appear on the request line, as if the request
+ * were a non-proxy HTTP 1.1 request. Varnish only supports this style of
+ * request. Squid supports this style of request only if reverse-proxy mode
+ * (http_port ... accel) is enabled.
+ *
+ * If this is set to false, no Host header will be sent, and the absolute URL
+ * will be sent in the request line, as is the standard for an HTTP proxy
+ * request in both HTTP 1.0 and 1.1. This style of request is not supported
+ * by Varnish, but is supported by Squid in either configuration (forward or
+ * reverse).
+ *
+ * @since 1.21
+ */
+$wgSquidPurgeUseHostHeader = true;
+
 /**
  * Routing configuration for HTCP multicast purging. Add elements here to
  * enable HTCP and determine which purges are sent where. If set to an empty
@@ -2067,13 +2135,13 @@ $wgHTCPMulticastRouting = array();
  * setting is ignored. If $wgHTCPMulticastRouting is not set and this setting
  * is, it is used to populate $wgHTCPMulticastRouting.
  *
- * @deprecated in favor of $wgHTCPMulticastRouting
+ * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting
  */
 $wgHTCPMulticastAddress = false;
 
 /**
  * HTCP multicast port.
- * @deprecated in favor of $wgHTCPMulticastRouting
+ * @deprecated since 1.20 in favor of $wgHTCPMulticastRouting
  * @see $wgHTCPMulticastAddress
  */
 $wgHTCPPort = 4827;
@@ -2467,11 +2535,6 @@ $wgAllowRdfaAttributes = false;
  */
 $wgAllowMicrodataAttributes = false;
 
-/**
- * Cleanup as much presentational html like valign -> css vertical-align as we can
- */
-$wgCleanupPresentationalAttributes = true;
-
 /**
  * Should we try to make our HTML output well-formed XML?  If set to false,
  * output will be a few bytes shorter, and the HTML will arguably be more
@@ -2526,12 +2589,12 @@ $wgSiteNotice = '';
 /**
  * A subtitle to add to the tagline, for skins that have it/
  */
-$wgExtraSubtitle       = '';
+$wgExtraSubtitle = '';
 
 /**
  * If this is set, a "donate" link will appear in the sidebar. Set it to a URL.
  */
-$wgSiteSupportPage     = '';
+$wgSiteSupportPage = '';
 
 /**
  * Validate the overall output using tidy and refuse
@@ -2714,7 +2777,7 @@ $wgFooterIcons = array(
 $wgUseCombinedLoginLink = false;
 
 /**
- * Search form behavior for Vector skin only.
+ * Search form look for Vector skin only.
  *  - true = use an icon search button
  *  - false = use Go & Search buttons
  */
@@ -3588,13 +3651,6 @@ $wgDefaultUserOptions = array(
        'wllimit'                 => 250,
 );
 
-/**
- * Whether or not to allow and use real name fields.
- * @deprecated since 1.16, use $wgHiddenPrefs[] = 'realname' below to disable real
- * names
- */
-$wgAllowRealName = true;
-
 /** An array of preferences to not show for the user */
 $wgHiddenPrefs = array();
 
@@ -3676,7 +3732,7 @@ $wgAllowPrefChange = array();
 /**
  * This is to let user authenticate using https when they come from http.
  * Based on an idea by George Herbert on wikitech-l:
- * http://lists.wikimedia.org/pipermail/wikitech-l/2010-October/050065.html
+ * http://lists.wikimedia.org/pipermail/wikitech-l/2010-October/050039.html
  * @since 1.17
  */
 $wgSecureLogin = false;
@@ -4270,9 +4326,21 @@ $wgProxyScriptPath = "$IP/maintenance/proxy_check.php";
 $wgProxyMemcExpiry = 86400;
 /** This should always be customised in LocalSettings.php */
 $wgSecretKey = false;
-/** big list of banned IP addresses, in the keys not the values */
+
+/**
+ * Big list of banned IP addresses.
+ *
+ * This can have the following formats:
+ * - An array of addresses, either in the values
+ *   or the keys (for backward compatibility)
+ * - A string, in that case this is the path to a file
+ *   containing the list of IP addresses, one per line
+ */
 $wgProxyList = array();
-/** deprecated */
+
+/**
+ * @deprecated since 1.14
+ */
 $wgProxyKey = false;
 
 /** @} */ # end of proxy scanner settings
@@ -4511,7 +4579,9 @@ $wgProfileOnly = false;
  * Log sums from profiling into "profiling" table in db.
  *
  * You have to create a 'profiling' table in your database before using
- * this feature, see maintenance/archives/patch-profiling.sql
+ * this feature.  Run set $wgProfileToDatabase to true in
+ * LocalSettings.php and run maintenance/update.php or otherwise
+ * manually add patch-profiling.sql to your database.
  *
  * To enable profiling, edit StartProfiler.php
  */
@@ -4688,17 +4758,11 @@ $wgCountTotalSearchHits = false;
  */
 $wgOpenSearchTemplate = false;
 
-/**
- * Enable suggestions while typing in search boxes
- * (results are passed around in OpenSearch format)
- * Requires $wgEnableOpenSearchSuggest = true;
- */
-$wgEnableMWSuggest = false;
-
 /**
  * Enable OpenSearch suggestions requested by MediaWiki. Set this to
- * false if you've disabled MWSuggest or another suggestion script and
- * want reduce load caused by cached scripts pulling suggestions.
+ * false if you've disabled scripts that use api?action=opensearch and
+ * want reduce load caused by cached scripts still pulling suggestions.
+ * It will let the API fallback by responding with an empty array.
  */
 $wgEnableOpenSearchSuggest = true;
 
@@ -4707,14 +4771,6 @@ $wgEnableOpenSearchSuggest = true;
  */
 $wgSearchSuggestCacheExpiry = 1200;
 
-/**
- *  Template for internal MediaWiki suggestion engine, defaults to API action=opensearch
- *
- *  Placeholders: {searchTerms}, {namespaces}, {dbname}
- *
- */
-$wgMWSuggestTemplate = false;
-
 /**
  * If you've disabled search semi-permanently, this also disables updates to the
  * table. If you ever re-enable, be sure to rebuild the search table.
@@ -5357,14 +5413,15 @@ $wgHooks = array();
  * can add to this to provide custom jobs
  */
 $wgJobClasses = array(
-       'refreshLinks' => 'RefreshLinksJob',
-       'refreshLinks2' => 'RefreshLinksJob2',
-       'htmlCacheUpdate' => 'HTMLCacheUpdateJob',
+       'refreshLinks'      => 'RefreshLinksJob',
+       'refreshLinks2'     => 'RefreshLinksJob2',
+       'htmlCacheUpdate'   => 'HTMLCacheUpdateJob',
        'html_cache_update' => 'HTMLCacheUpdateJob', // backwards-compatible
-       'sendMail' => 'EmaillingJob',
-       'enotifNotify' => 'EnotifNotifyJob',
+       'sendMail'          => 'EmaillingJob',
+       'enotifNotify'      => 'EnotifNotifyJob',
        'fixDoubleRedirect' => 'DoubleRedirectJob',
-       'uploadFromUrl' => 'UploadFromUrlJob',
+       'uploadFromUrl'     => 'UploadFromUrlJob',
+       'null'              => 'NullJob'
 );
 
 /**
@@ -5379,6 +5436,14 @@ $wgJobClasses = array(
  */
 $wgJobTypesExcludedFromDefaultQueue = array();
 
+/**
+ * Map of job types to configuration arrays.
+ * These settings should be global to all wikis.
+ */
+$wgJobTypeConf = array(
+       'default' => array( 'class' => 'JobQueueDB', 'order' => 'random' ),
+);
+
 /**
  * Additional functions to be performed with updateSpecialPages.
  * Expensive Querypages are already updated.
@@ -5581,8 +5646,6 @@ $wgLogActions = array(
        'protect/modify'     => 'modifiedarticleprotection',
        'protect/unprotect'  => 'unprotectedarticle',
        'protect/move_prot'  => 'movedarticleprotection',
-       'rights/rights'      => 'rightslogentry',
-       'rights/autopromote' => 'rightslogentry-autopromote',
        'upload/upload'      => 'uploadedimage',
        'upload/overwrite'   => 'overwroteimage',
        'upload/revert'      => 'uploadedimage',
@@ -5600,16 +5663,18 @@ $wgLogActions = array(
  * @see LogFormatter
  */
 $wgLogActionsHandlers = array(
-       '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',
-       'patrol/patrol'     => 'PatrolLogFormatter',
+       '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',
+       'patrol/patrol'      => 'PatrolLogFormatter',
+       'rights/rights'      => 'RightsLogFormatter',
+       'rights/autopromote' => 'RightsLogFormatter',
 );
 
 /**
@@ -5909,6 +5974,7 @@ $wgAPIModules = array();
 $wgAPIMetaModules = array();
 $wgAPIPropModules = array();
 $wgAPIListModules = array();
+$wgAPIGeneratorModules = array();
 
 /**
  * Maximum amount of rows to scan in a DB query in the API
@@ -6131,20 +6197,6 @@ $wgCompiledFiles = array();
 
 /** @} */ # End of HipHop compilation }
 
-
-/************************************************************************//**
- * @name   Mobile support
- * @{
- */
-
-/**
- * Name of the class used for mobile device detection, must be inherited from
- * IDeviceDetector.
- */
-$wgDeviceDetectionClass = 'DeviceDetection';
-
-/** @} */ # End of Mobile support }
-
 /************************************************************************//**
  * @name   Miscellaneous
  * @{
@@ -6228,6 +6280,57 @@ $wgSeleniumConfigFile = null;
 $wgDBtestuser = ''; //db user that has permission to create and drop the test databases only
 $wgDBtestpassword = '';
 
+/**
+ * Associative array mapping namespace IDs to the name of the content model pages in that namespace should have by
+ * default (use the CONTENT_MODEL_XXX constants). If no special content type is defined for a given namespace,
+ * pages in that namespace will  use the CONTENT_MODEL_WIKITEXT (except for the special case of JS and CS pages).
+ *
+ * @since 1.21
+ */
+$wgNamespaceContentModels = array();
+
+/**
+ * How to react if a plain text version of a non-text Content object is requested using ContentHandler::getContentText():
+ *
+ * * 'ignore': return null
+ * * 'fail': throw an MWException
+ * * 'serialize': serialize to default format
+ *
+ * @since 1.21
+ */
+$wgContentHandlerTextFallback = 'ignore';
+
+/**
+ * Set to false to disable use of the database fields introduced by the ContentHandler facility.
+ * This way, the ContentHandler facility can be used without any additional information in the database.
+ * A page's content model is then derived solely from the page's title. This however means that changing
+ * a page's default model (e.g. using $wgNamespaceContentModels) will break the page and/or make the content
+ * inaccessible. This also means that pages can not be moved to a title that would default to a different
+ * content model.
+ *
+ * Overall, with $wgContentHandlerUseDB = false, no database updates are needed, but content handling
+ * is less robust and less flexible.
+ *
+ * @since 1.21
+ */
+$wgContentHandlerUseDB = false;
+
+/**
+ * Determines which types of text are parsed as wikitext. This does not imply that these kinds
+ * of texts are also rendered as wikitext, it only means that links, magic words, etc will have
+ * the effect on the database they would have on a wikitext page.
+ *
+ * @todo: On the long run, it would be nice to put categories etc into a separate structure,
+ * or at least parse only the contents of comments in the scripts.
+ *
+ * @since 1.21
+ */
+$wgTextModelsToParse = array(
+       CONTENT_MODEL_WIKITEXT,    // Just for completeness, wikitext will always be parsed.
+       CONTENT_MODEL_JAVASCRIPT,  // Make categories etc work, people put them into comments.
+       CONTENT_MODEL_CSS,         // Make categories etc work, people put them into comments.
+);
+
 /**
  * Whether the user must enter their password to change their e-mail address
  *
@@ -6235,6 +6338,14 @@ $wgDBtestpassword = '';
  */
 $wgRequirePasswordforEmailChange = true;
 
+/**
+ * Register handlers for specific types of sites.
+ *
+ * @since 1.20
+ */
+$wgSiteTypes = array();
+$wgSiteTypes['mediawiki'] = 'MediaWikiSite';
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index b4989a6..716e65c 100644 (file)
@@ -92,7 +92,7 @@ class DeferredUpdates {
                                $update->doUpdate();
 
                                if ( $doCommit && $dbw->trxLevel() ) {
-                                       $dbw->commit( __METHOD__ );
+                                       $dbw->commit( __METHOD__, 'flush' );
                                }
                        } catch ( MWException $e ) {
                                // We don't want exceptions thrown during deferred updates to
index be9f981..882f318 100644 (file)
@@ -39,7 +39,7 @@ define( 'MW_SPECIALPAGE_VERSION', 2 );
 define( 'DBO_DEBUG', 1 );
 define( 'DBO_NOBUFFER', 2 );
 define( 'DBO_IGNORE', 4 );
-define( 'DBO_TRX', 8 );
+define( 'DBO_TRX', 8 ); // automatically start transaction on first query
 define( 'DBO_DEFAULT', 16 );
 define( 'DBO_PERSISTENT', 32 );
 define( 'DBO_SYSDBA', 64 ); //for oracle maintenance
@@ -171,11 +171,12 @@ define( 'MW_DATE_ISO', 'ISO 8601' );
 /**@{
  * RecentChange type identifiers
  */
-define( 'RC_EDIT', 0);
-define( 'RC_NEW', 1);
-define( 'RC_MOVE', 2); // obsolete
-define( 'RC_LOG', 3);
-define( 'RC_MOVE_OVER_REDIRECT', 4); // obsolete
+define( 'RC_EDIT', 0 );
+define( 'RC_NEW', 1 );
+define( 'RC_MOVE', 2 ); // obsolete
+define( 'RC_LOG', 3 );
+define( 'RC_MOVE_OVER_REDIRECT', 4 ); // obsolete
+define( 'RC_EXTERNAL', 5 );
 /**@}*/
 
 /**@{
@@ -213,6 +214,7 @@ require_once __DIR__.'/normal/UtfNormalDefines.php';
 define( 'MW_SUPPORTS_EDITFILTERMERGED', 1 );
 define( 'MW_SUPPORTS_PARSERFIRSTCALLINIT', 1 );
 define( 'MW_SUPPORTS_LOCALISATIONCACHE', 1 );
+define( 'MW_SUPPORTS_CONTENTHANDLER', 1 );
 /**@}*/
 
 /** Support for $wgResourceModules */
@@ -261,7 +263,7 @@ define( 'APCOND_BLOCKED', 8 );
 define( 'APCOND_ISBOT', 9 );
 /**@}*/
 
-/**
+/** @{
  * Protocol constants for wfExpandUrl()
  */
 define( 'PROTO_HTTP', 'http://' );
@@ -270,3 +272,35 @@ define( 'PROTO_RELATIVE', '//' );
 define( 'PROTO_CURRENT', null );
 define( 'PROTO_CANONICAL', 1 );
 define( 'PROTO_INTERNAL', 2 );
+/**@}*/
+
+/**@{
+ * Content model ids, used by Content and ContentHandler.
+ * These IDs will be exposed in the API and XML dumps.
+ *
+ * Extensions that define their own content model IDs should take
+ * care to avoid conflicts. Using the extension name as a prefix is recommended,
+ * for example 'myextension-somecontent'.
+ */
+define( 'CONTENT_MODEL_WIKITEXT', 'wikitext' );
+define( 'CONTENT_MODEL_JAVASCRIPT', 'javascript' );
+define( 'CONTENT_MODEL_CSS', 'css' );
+define( 'CONTENT_MODEL_TEXT', 'text' );
+/**@}*/
+
+/**@{
+ * Content formats, used by Content and ContentHandler.
+ * These should be MIME types, and will be exposed in the API and XML dumps.
+ *
+ * Extensions are free to use the below formats, or define their own.
+ * It is recommended to stick with the conventions for MIME types.
+ */
+define( 'CONTENT_FORMAT_WIKITEXT', 'text/x-wiki' ); // wikitext
+define( 'CONTENT_FORMAT_JAVASCRIPT', 'text/javascript' ); // for js pages
+define( 'CONTENT_FORMAT_CSS', 'text/css' );  // for css pages
+define( 'CONTENT_FORMAT_TEXT', 'text/plain' ); // for future use, e.g. with some plain-html messages.
+define( 'CONTENT_FORMAT_HTML', 'text/html' ); // for future use, e.g. with some plain-html messages.
+define( 'CONTENT_FORMAT_SERIALIZED', 'application/vnd.php.serialized' ); // for future use with the api and for extensions
+define( 'CONTENT_FORMAT_JSON', 'application/json' ); // for future use with the api, and for use by extensions
+define( 'CONTENT_FORMAT_XML', 'application/xml' ); // for future use with the api, and for use by extensions
+/**@}*/
index d3b670d..292d2b7 100644 (file)
@@ -155,6 +155,11 @@ class EditPage {
         */
        const AS_IMAGE_REDIRECT_LOGGED     = 234;
 
+       /**
+        * Status: can't parse content
+        */
+       const AS_PARSE_ERROR                = 240;
+
        /**
         * HTML id and name for the beginning of the edit form.
         */
@@ -214,6 +219,7 @@ class EditPage {
        var $textbox1 = '', $textbox2 = '', $summary = '', $nosummary = false;
        var $edittime = '', $section = '', $sectiontitle = '', $starttime = '';
        var $oldid = 0, $editintro = '', $scrolltop = null, $bot = true;
+       var $contentModel = null, $contentFormat = null;
 
        # Placeholders for text injection by hooks (must be HTML)
        # extensions should take care to _append_ to the present value
@@ -225,7 +231,7 @@ class EditPage {
        public $editFormTextBottom = '';
        public $editFormTextAfterContent = '';
        public $previewTextAfterContent = '';
-       public $mPreloadText = '';
+       public $mPreloadContent = null;
 
        /* $didSave should be set to true whenever an article was succesfully altered. */
        public $didSave = false;
@@ -233,12 +239,24 @@ class EditPage {
 
        public $suppressIntro = false;
 
+       /**
+        * Set to true to allow editing of non-text content types.
+        *
+        * @var bool
+        */
+       public $allowNonTextContent = false;
+
        /**
         * @param $article Article
         */
        public function __construct( Article $article ) {
                $this->mArticle = $article;
                $this->mTitle = $article->getTitle();
+
+               $this->contentModel = $this->mTitle->getContentModel();
+
+               $handler = ContentHandler::getForModelID( $this->contentModel );
+               $this->contentFormat = $handler->getDefaultFormat();
        }
 
        /**
@@ -267,7 +285,7 @@ class EditPage {
 
        /**
         * Get the context title object.
-        * If not set, $wgTitle will be returned. This behavior might changed in
+        * If not set, $wgTitle will be returned. This behavior might change in
         * the future to return $this->mTitle instead.
         *
         * @return Title object
@@ -363,7 +381,6 @@ class EditPage {
                $this->isCssSubpage         = $this->mTitle->isCssSubpage();
                $this->isJsSubpage          = $this->mTitle->isJsSubpage();
                $this->isWrongCaseCssJsPage = $this->isWrongCaseCssJsPage();
-               $this->isNew                = !$this->mTitle->exists() || $this->section == 'new';
 
                # Show applicable editing introductions
                if ( $this->formtype == 'initial' || $this->firsttime ) {
@@ -392,10 +409,13 @@ class EditPage {
                                wfProfileOut( __METHOD__ );
                                return;
                        }
-                       if ( !$this->mTitle->getArticleID() )
+
+                       if ( !$this->mTitle->getArticleID() ) {
                                wfRunHooks( 'EditFormPreloadText', array( &$this->textbox1, &$this->mTitle ) );
-                       else
+                       } else {
                                wfRunHooks( 'EditFormInitialText', array( $this ) );
+                       }
+
                }
 
                $this->showEditForm();
@@ -438,6 +458,7 @@ class EditPage {
         * @since 1.19
         * @param $permErrors Array of permissions errors, as returned by
         *                    Title::getUserPermissionsErrors().
+        * @throws PermissionsError
         */
        protected function displayPermissionsError( array $permErrors ) {
                global $wgRequest, $wgOut;
@@ -450,15 +471,16 @@ class EditPage {
                        return;
                }
 
-               $content = $this->getContent();
+               $content = $this->getContentObject();
 
                # Use the normal message if there's nothing to display
-               if ( $this->firsttime && $content === '' ) {
+               if ( $this->firsttime && ( !$content || $content->isEmpty() ) ) {
                        $action = $this->mTitle->exists() ? 'edit' :
                                ( $this->mTitle->isTalkPage() ? 'createtalk' : 'createpage' );
                        throw new PermissionsError( $action, $permErrors );
                }
 
+               $wgOut->setRobotPolicy( 'noindex,nofollow' );
                $wgOut->setPageTitle( wfMessage( 'viewsource-title', $this->getContextTitle()->getPrefixedText() ) );
                $wgOut->addBacklinkSubtitle( $this->getContextTitle() );
                $wgOut->addWikiText( $wgOut->formatPermissionsErrorMessage( $permErrors, 'edit' ) );
@@ -467,13 +489,14 @@ class EditPage {
                # If the user made changes, preserve them when showing the markup
                # (This happens when a user is blocked during edit, for instance)
                if ( !$this->firsttime ) {
-                       $content = $this->textbox1;
+                       $text = $this->textbox1;
                        $wgOut->addWikiMsg( 'viewyourtext' );
                } else {
+                       $text = $this->toEditText( $content );
                        $wgOut->addWikiMsg( 'viewsourcetext' );
                }
 
-               $this->showTextbox( $content, 'wpTextbox1', array( 'readonly' ) );
+               $this->showTextbox( $text, 'wpTextbox1', array( 'readonly' ) );
 
                $wgOut->addHTML( Html::rawElement( 'div', array( 'class' => 'templatesUsed' ),
                        Linker::formatTemplates( $this->getTemplates() ) ) );
@@ -568,12 +591,13 @@ class EditPage {
         * @param $request WebRequest
         */
        function importFormData( &$request ) {
-               global $wgLang, $wgUser;
+               global $wgContLang, $wgUser;
 
                wfProfileIn( __METHOD__ );
 
                # Section edit can come from either the form or a link
                $this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
+               $this->isNew = !$this->mTitle->exists() || $this->section == 'new';
 
                if ( $request->wasPosted() ) {
                        # These fields need to be checked for encoding.
@@ -586,13 +610,15 @@ class EditPage {
                                // modified by subclasses
                                wfProfileIn( get_class( $this ) . "::importContentFormData" );
                                $textbox1 = $this->importContentFormData( $request );
-                               if ( isset( $textbox1 ) )
+                               if ( isset( $textbox1 ) ) {
                                        $this->textbox1 = $textbox1;
+                               }
+
                                wfProfileOut( get_class( $this ) . "::importContentFormData" );
                        }
 
                        # Truncate for whole multibyte characters
-                       $this->summary = $wgLang->truncate( $request->getText( 'wpSummary' ), 255 );
+                       $this->summary = $wgContLang->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 +630,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' ), 255 );
+                       $this->sectiontitle = $wgContLang->truncate( $request->getText( 'wpSectionTitle' ), 255 );
                        $this->sectiontitle = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->sectiontitle );
 
                        $this->edittime = $request->getVal( 'wpEdittime' );
@@ -711,10 +737,17 @@ class EditPage {
                        }
                }
 
+               $this->oldid = $request->getInt( 'oldid' );
+
                $this->bot = $request->getBool( 'bot', true );
                $this->nosummary = $request->getBool( 'nosummary' );
 
-               $this->oldid = $request->getInt( 'oldid' );
+               $content_handler = ContentHandler::getForTitle( $this->mTitle );
+               $this->contentModel = $request->getText( 'model', $content_handler->getModelID() ); #may be overridden by revision
+               $this->contentFormat = $request->getText( 'format', $content_handler->getDefaultFormat() ); #may be overridden by revision
+
+               #TODO: check if the desired model is allowed in this namespace, and if a transition from the page's current model to the new model is allowed
+               #TODO: check if the desired content model supports the given content format!
 
                $this->live = $request->getCheck( 'live' );
                $this->editintro = $request->getText( 'editintro',
@@ -747,7 +780,13 @@ class EditPage {
        function initialiseForm() {
                global $wgUser;
                $this->edittime = $this->mArticle->getTimestamp();
-               $this->textbox1 = $this->getContent( false );
+
+               $content = $this->getContentObject( false ); #TODO: track content object?!
+               if ( $content === false ) {
+                       return false;
+               }
+               $this->textbox1 = $this->toEditText( $content );
+
                // activate checkboxes if user wants them to be always active
                # Sort out the "watch" checkbox
                if ( $wgUser->getOption( 'watchdefault' ) ) {
@@ -773,36 +812,65 @@ class EditPage {
        /**
         * Fetch initial editing page content.
         *
-        * @param $def_text string
+        * @param $def_text string|bool
         * @return mixed string on success, $def_text for invalid sections
         * @private
+        * @deprecated since 1.21, get WikiPage::getContent() instead.
+        */
+       function getContent( $def_text = false ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               if ( $def_text !== null && $def_text !== false && $def_text !== '' ) {
+                       $def_content = $this->toEditContent( $def_text );
+               } else {
+                       $def_content = false;
+               }
+
+               $content = $this->getContentObject( $def_content );
+
+               // Note: EditPage should only be used with text based content anyway.
+               return $this->toEditText( $content );
+       }
+
+       /**
+        * @param Content|null $def_content The default value to return
+        *
+        * @return mixed Content on success, $def_content for invalid sections
+        *
+        * @since 1.21
         */
-       function getContent( $def_text = '' ) {
-               global $wgOut, $wgRequest, $wgParser;
+       protected function getContentObject( $def_content = null ) {
+               global $wgOut, $wgRequest;
 
                wfProfileIn( __METHOD__ );
 
-               $text = false;
+               $content = false;
 
                // For message page not locally set, use the i18n message.
                // For other non-existent articles, use preload text if any.
                if ( !$this->mTitle->exists() || $this->section == 'new' ) {
                        if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI && $this->section != 'new' ) {
                                # If this is a system message, get the default text.
-                               $text = $this->mTitle->getDefaultMessageText();
+                               $msg = $this->mTitle->getDefaultMessageText();
+
+                               $content = $this->toEditContent( $msg );
                        }
-                       if ( $text === false ) {
+                       if ( $content === false ) {
                                # If requested, preload some text.
                                $preload = $wgRequest->getVal( 'preload',
                                        // Custom preload text for new sections
                                        $this->section === 'new' ? 'MediaWiki:addsection-preload' : '' );
-                               $text = $this->getPreloadedText( $preload );
+
+                               $content = $this->getPreloadedContent( $preload );
                        }
                // For existing pages, get text based on "undo" or section parameters.
                } else {
                        if ( $this->section != '' ) {
                                // Get section edit text (returns $def_text for invalid sections)
-                               $text = $wgParser->getSection( $this->getOriginalContent(), $this->section, $def_text );
+                               $orig = $this->getOriginalContent();
+                               $content = $orig ? $orig->getSection( $this->section ) : null;
+
+                               if ( !$content ) $content = $def_content;
                        } else {
                                $undoafter = $wgRequest->getInt( 'undoafter' );
                                $undo = $wgRequest->getInt( 'undo' );
@@ -818,15 +886,16 @@ class EditPage {
 
                                        # Sanity check, make sure it's the right page,
                                        # the revisions exist and they were not deleted.
-                                       # Otherwise, $text will be left as-is.
+                                       # Otherwise, $content will be left as-is.
                                        if ( !is_null( $undorev ) && !is_null( $oldrev ) &&
                                                $undorev->getPage() == $oldrev->getPage() &&
                                                $undorev->getPage() == $this->mTitle->getArticleID() &&
                                                !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
                                                !$oldrev->isDeleted( Revision::DELETED_TEXT ) ) {
 
-                                               $text = $this->mArticle->getUndoText( $undorev, $oldrev );
-                                               if ( $text === false ) {
+                                               $content = $this->mArticle->getUndoContent( $undorev, $oldrev );
+
+                                               if ( $content === false ) {
                                                        # Warn the user that something went wrong
                                                        $undoMsg = 'failure';
                                                } else {
@@ -859,14 +928,14 @@ class EditPage {
                                                wfMessage( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
                                }
 
-                               if ( $text === false ) {
-                                       $text = $this->getOriginalContent();
+                               if ( $content === false ) {
+                                       $content = $this->getOriginalContent();
                                }
                        }
                }
 
                wfProfileOut( __METHOD__ );
-               return $text;
+               return $content;
        }
 
        /**
@@ -877,47 +946,77 @@ class EditPage {
         * to the original text of the edit.
         *
         * This difers from Article::getContent() that when a missing revision is
-        * encountered the result will be an empty string and not the
+        * encountered the result will be null and not the
         * 'missing-revision' message.
         *
         * @since 1.19
-        * @return string
+        * @return Content|null
         */
        private function getOriginalContent() {
                if ( $this->section == 'new' ) {
-                       return $this->getCurrentText();
+                       return $this->getCurrentContent();
                }
                $revision = $this->mArticle->getRevisionFetched();
                if ( $revision === null ) {
-                       return '';
+                       if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+                       $handler = ContentHandler::getForModelID( $this->contentModel );
+
+                       return $handler->makeEmptyContent();
                }
-               return $this->mArticle->getContent();
+               $content = $revision->getContent();
+               return $content;
        }
 
        /**
-        * Get the actual text of the page. This is basically similar to
-        * WikiPage::getRawText() except that when the page doesn't exist an empty
-        * string is returned instead of false.
+        * Get the current content of the page. This is basically similar to
+        * WikiPage::getContent( Revision::RAW ) except that when the page doesn't exist an empty
+        * content object is returned instead of null.
         *
-        * @since 1.19
-        * @return string
+        * @since 1.21
+        * @return Content
         */
-       private function getCurrentText() {
-               $text = $this->mArticle->getRawText();
-               if ( $text === false ) {
-                       return '';
+       protected function getCurrentContent() {
+               $rev = $this->mArticle->getRevision();
+               $content = $rev ? $rev->getContent( Revision::RAW ) : null;
+
+               if ( $content  === false || $content === null ) {
+                       if ( !$this->contentModel ) $this->contentModel = $this->getTitle()->getContentModel();
+                       $handler = ContentHandler::getForModelID( $this->contentModel );
+
+                       return $handler->makeEmptyContent();
                } else {
-                       return $text;
+                       # nasty side-effect, but needed for consistency
+                       $this->contentModel = $rev->getContentModel();
+                       $this->contentFormat = $rev->getContentFormat();
+
+                       return $content;
                }
        }
 
+
        /**
         * Use this method before edit() to preload some text into the edit box
         *
         * @param $text string
+        * @deprecated since 1.21, use setPreloadedContent() instead.
         */
        public function setPreloadedText( $text ) {
-               $this->mPreloadText = $text;
+               ContentHandler::deprecated( __METHOD__, "1.21" );
+
+               $content = $this->toEditContent( $text );
+
+               $this->setPreloadedContent( $content );
+       }
+
+       /**
+        * Use this method before edit() to preload some content into the edit box
+        *
+        * @param $content Content
+        *
+        * @since 1.21
+        */
+       public function setPreloadedContent( Content $content ) {
+               $this->mPreloadContent = $content;
        }
 
        /**
@@ -925,37 +1024,85 @@ class EditPage {
         * an earlier setPreloadText() or by loading the given page.
         *
         * @param $preload String: representing the title to preload from.
+        *
         * @return String
+        *
+        * @deprecated since 1.21, use getPreloadedContent() instead
         */
        protected function getPreloadedText( $preload ) {
-               global $wgUser, $wgParser;
+               ContentHandler::deprecated( __METHOD__, "1.21" );
+
+               $content = $this->getPreloadedContent( $preload );
+               $text = $this->toEditText( $content );
 
-               if ( !empty( $this->mPreloadText ) ) {
-                       return $this->mPreloadText;
+               return $text;
+       }
+
+       /**
+        * Get the contents to be preloaded into the box, either set by
+        * an earlier setPreloadText() or by loading the given page.
+        *
+        * @param $preload String: representing the title to preload from.
+        *
+        * @return Content
+        *
+        * @since 1.21
+        */
+       protected function getPreloadedContent( $preload ) {
+               global $wgUser;
+
+               if ( !empty( $this->mPreloadContent ) ) {
+                       return $this->mPreloadContent;
                }
 
+               $handler = ContentHandler::getForTitle( $this->getTitle() );
+
                if ( $preload === '' ) {
-                       return '';
+                       return $handler->makeEmptyContent();
                }
 
                $title = Title::newFromText( $preload );
                # Check for existence to avoid getting MediaWiki:Noarticletext
-               if ( $title === null || !$title->exists() || !$title->userCan( 'read' ) ) {
-                       return '';
+               if ( $title === null || !$title->exists() || !$title->userCan( 'read', $wgUser ) ) {
+                       //TODO: somehow show a warning to the user!
+                       return $handler->makeEmptyContent();
                }
 
                $page = WikiPage::factory( $title );
                if ( $page->isRedirect() ) {
                        $title = $page->getRedirectTarget();
                        # Same as before
-                       if ( $title === null || !$title->exists() || !$title->userCan( 'read' ) ) {
-                               return '';
+                       if ( $title === null || !$title->exists() || !$title->userCan( 'read', $wgUser ) ) {
+                               //TODO: somehow show a warning to the user!
+                               return $handler->makeEmptyContent();
                        }
                        $page = WikiPage::factory( $title );
                }
 
                $parserOptions = ParserOptions::newFromUser( $wgUser );
-               return $wgParser->getPreloadText( $page->getRawText(), $title, $parserOptions );
+               $content = $page->getContent( Revision::RAW );
+
+               if ( !$content ) {
+                       //TODO: somehow show a warning to the user!
+                       return $handler->makeEmptyContent();
+               }
+
+               if ( $content->getModel() !== $handler->getModelID() ) {
+                       $converted = $content->convert( $handler->getModelID() );
+
+                       if ( !$converted ) {
+                               //TODO: somehow show a warning to the user!
+                               wfDebug( "Attempt to preload incompatible content: "
+                                               . "can't convert " . $content->getModel()
+                                               . " to " . $handler->getModelID() );
+
+                               return $handler->makeEmptyContent();
+                       }
+
+                       $content = $converted;
+               }
+
+               return $content->preloadTransform( $title, $parserOptions );
        }
 
        /**
@@ -975,6 +1122,7 @@ class EditPage {
 
        /**
         * Attempt submission
+        * @throws UserBlockedError|ReadOnlyError|ThrottledError|PermissionsError
         * @return bool false if output is done, true if the rest of the form should be displayed
         */
        function attemptSave() {
@@ -1003,6 +1151,10 @@ class EditPage {
                        case self::AS_HOOK_ERROR:
                                return false;
 
+                       case self::AS_PARSE_ERROR:
+                               $wgOut->addWikiText( '<div class="error">' . $status->getWikiText() . '</div>');
+                               return true;
+
                        case self::AS_SUCCESS_NEW_ARTICLE:
                                $query = $resultDetails['redirect'] ? 'redirect=no' : '';
                                $anchor = isset ( $resultDetails['sectionanchor'] ) ? $resultDetails['sectionanchor'] : '';
@@ -1095,9 +1247,19 @@ class EditPage {
                        return $status;
                }
 
+               try {
+                       # Construct Content object
+                       $textbox_content = $this->toEditContent( $this->textbox1 );
+               } catch (MWContentSerializationException $ex) {
+                       $status->fatal( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+                       $status->value = self::AS_PARSE_ERROR;
+                       wfProfileOut( __METHOD__ );
+                       return $status;
+               }
+
                # Check image redirect
                if ( $this->mTitle->getNamespace() == NS_FILE &&
-                       Title::newFromRedirect( $this->textbox1 ) instanceof Title &&
+                       $textbox_content->isRedirect() &&
                        !$wgUser->isAllowed( 'upload' ) ) {
                                $code = $wgUser->isAnon() ? self::AS_IMAGE_REDIRECT_ANON : self::AS_IMAGE_REDIRECT_LOGGED;
                                $status->setResult( false, $code );
@@ -1209,7 +1371,7 @@ class EditPage {
 
                if ( $new ) {
                        // Late check for create permission, just in case *PARANOIA*
-                       if ( !$this->mTitle->userCan( 'create' ) ) {
+                       if ( !$this->mTitle->userCan( 'create', $wgUser ) ) {
                                $status->fatal( 'nocreatetext' );
                                $status->value = self::AS_NO_CREATE_PERMISSION;
                                wfDebug( __METHOD__ . ": no create permission\n" );
@@ -1239,13 +1401,13 @@ class EditPage {
                                return $status;
                        }
 
-                       $text = $this->textbox1;
+                       $content = $textbox_content;
+
                        $result['sectionanchor'] = '';
                        if ( $this->section == 'new' ) {
                                if ( $this->sectiontitle !== '' ) {
                                        // Insert the section title above the content.
-                                       $text = wfMessage( 'newsectionheaderdefaultlevel' )->rawParams( $this->sectiontitle )
-                                               ->inContentLanguage()->text() . "\n\n" . $text;
+                                       $content = $content->addSectionHeader( $this->sectiontitle );
 
                                        // Jump to the new section
                                        $result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->sectiontitle );
@@ -1260,8 +1422,7 @@ class EditPage {
                                        }
                                } elseif ( $this->summary !== '' ) {
                                        // Insert the section title above the content.
-                                       $text = wfMessage( 'newsectionheaderdefaultlevel' )->rawParams( $this->summary )
-                                               ->inContentLanguage()->text() . "\n\n" . $text;
+                                       $content = $content->addSectionHeader( $this->summary );
 
                                        // Jump to the new section
                                        $result['sectionanchor'] = $wgParser->guessLegacySectionNameFromWikiText( $this->summary );
@@ -1275,10 +1436,13 @@ class EditPage {
 
                        $status->value = self::AS_SUCCESS_NEW_ARTICLE;
 
-               } else {
+               } else { # not $new
 
                        # Article exists. Check for edit conflict.
+
+                       $this->mArticle->clear(); # Force reload of dates, etc.
                        $timestamp = $this->mArticle->getTimestamp();
+
                        wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" );
 
                        if ( $timestamp != $this->edittime ) {
@@ -1295,7 +1459,8 @@ class EditPage {
                                                $this->isConflict = false;
                                                wfDebug( __METHOD__ . ": conflict suppressed; new section\n" );
                                        }
-                               } elseif ( $this->section == '' && Revision::userWasLastToEdit( DB_MASTER,  $this->mTitle->getArticleID(), $wgUser->getId(), $this->edittime ) ) {
+                               } elseif ( $this->section == '' && Revision::userWasLastToEdit( DB_MASTER,  $this->mTitle->getArticleID(),
+                                                       $wgUser->getId(), $this->edittime ) ) {
                                        # Suppress edit conflict with self, except for section edits where merging is required.
                                        wfDebug( __METHOD__ . ": Suppressing edit conflict, same user.\n" );
                                        $this->isConflict = false;
@@ -1310,26 +1475,31 @@ class EditPage {
                                $sectionTitle = $this->summary;
                        }
 
+                       $content = null;
+
                        if ( $this->isConflict ) {
-                               wfDebug( __METHOD__ . ": conflict! getting section '$this->section' for time '$this->edittime' (article time '{$timestamp}')\n" );
-                               $text = $this->mArticle->replaceSection( $this->section, $this->textbox1, $sectionTitle, $this->edittime );
+                               wfDebug( __METHOD__ . ": conflict! getting section '{$this->section}' for time '{$this->edittime}'"
+                                               . " (article time '{$timestamp}')\n" );
+
+                               $content = $this->mArticle->replaceSectionContent( $this->section, $textbox_content, $sectionTitle, $this->edittime );
                        } else {
-                               wfDebug( __METHOD__ . ": getting section '$this->section'\n" );
-                               $text = $this->mArticle->replaceSection( $this->section, $this->textbox1, $sectionTitle );
+                               wfDebug( __METHOD__ . ": getting section '{$this->section}'\n" );
+                               $content = $this->mArticle->replaceSectionContent( $this->section, $textbox_content, $sectionTitle );
                        }
-                       if ( is_null( $text ) ) {
+
+                       if ( is_null( $content ) ) {
                                wfDebug( __METHOD__ . ": activating conflict; section replace failed.\n" );
                                $this->isConflict = true;
-                               $text = $this->textbox1; // do not try to merge here!
+                               $content = $textbox_content; // do not try to merge here!
                        } elseif ( $this->isConflict ) {
                                # Attempt merge
-                               if ( $this->mergeChangesInto( $text ) ) {
+                               if ( $this->mergeChangesIntoContent( $content ) ) {
                                        // Successful merge! Maybe we should tell the user the good news?
                                        $this->isConflict = false;
                                        wfDebug( __METHOD__ . ": Suppressing edit conflict, successful merge.\n" );
                                } else {
                                        $this->section = '';
-                                       $this->textbox1 = $text;
+                                       $this->textbox1 = ContentHandler::getContentText( $content );
                                        wfDebug( __METHOD__ . ": Keeping edit conflict, failed merge.\n" );
                                }
                        }
@@ -1341,7 +1511,10 @@ class EditPage {
                        }
 
                        // Run post-section-merge edit filter
-                       if ( !wfRunHooks( 'EditFilterMerged', array( $this, $text, &$this->hookError, $this->summary ) ) ) {
+                       $hook_args = array( $this, $content, &$this->hookError, $this->summary );
+
+                       if ( !ContentHandler::runLegacyHooks( 'EditFilterMerged', $hook_args )
+                               || !wfRunHooks( 'EditFilterMergedContent', $hook_args ) ) {
                                # Error messages etc. could be handled within the hook...
                                $status->fatal( 'hookaborted' );
                                $status->value = self::AS_HOOK_ERROR;
@@ -1357,8 +1530,8 @@ class EditPage {
 
                        # Handle the user preference to force summaries here, but not for null edits
                        if ( $this->section != 'new' && !$this->allowBlankSummary
-                               && $this->getOriginalContent() != $text
-                               && !Title::newFromRedirect( $text ) ) # check if it's not a redirect
+                               && !$content->equals( $this->getOriginalContent() )
+                               && !$content->isRedirect() ) # check if it's not a redirect
                        {
                                if ( md5( $this->summary ) == $this->autoSumm ) {
                                        $this->missingSummary = true;
@@ -1428,14 +1601,14 @@ class EditPage {
                        // merged the section into full text. Clear the section field
                        // so that later submission of conflict forms won't try to
                        // replace that into a duplicated mess.
-                       $this->textbox1 = $text;
+                       $this->textbox1 = $this->toEditText( $content );
                        $this->section = '';
 
                        $status->value = self::AS_SUCCESS_UPDATE;
                }
 
                // Check for length errors again now that the section is merged in
-               $this->kblength = (int)( strlen( $text ) / 1024 );
+                       $this->kblength = (int)( strlen( $this->toEditText( $content ) ) / 1024 );
                if ( $this->kblength > $wgMaxArticleSize ) {
                        $this->tooBig = true;
                        $status->setResult( false, self::AS_MAX_ARTICLE_SIZE_EXCEEDED );
@@ -1448,11 +1621,12 @@ class EditPage {
                        ( ( $this->minoredit && !$this->isNew ) ? EDIT_MINOR : 0 ) |
                        ( $bot ? EDIT_FORCE_BOT : 0 );
 
-               $doEditStatus = $this->mArticle->doEdit( $text, $this->summary, $flags );
+                       $doEditStatus = $this->mArticle->doEditContent( $content, $this->summary, $flags,
+                                                                                                                       false, null, $this->contentFormat );
 
                if ( $doEditStatus->isOK() ) {
-                       $result['redirect'] = Title::newFromRedirect( $text ) !== null;
-                       $this->commitWatch();
+                               $result['redirect'] = $content->isRedirect();
+                       $this->updateWatchlist();
                        wfProfileOut( __METHOD__ );
                        return $status;
                } else {
@@ -1473,19 +1647,27 @@ class EditPage {
        }
 
        /**
-        * Commit the change of watch status
+        * Register the change of watch status
         */
-       protected function commitWatch() {
+       protected function updateWatchlist() {
                global $wgUser;
+
                if ( $wgUser->isLoggedIn() && $this->watchthis != $wgUser->isWatched( $this->mTitle ) ) {
+                       $fname = __METHOD__;
+                       $title = $this->mTitle;
+                       $watch = $this->watchthis;
+
+                       // Do this in its own transaction to reduce contention...
                        $dbw = wfGetDB( DB_MASTER );
-                       $dbw->begin( __METHOD__ );
-                       if ( $this->watchthis ) {
-                               WatchAction::doWatch( $this->mTitle, $wgUser );
-                       } else {
-                               WatchAction::doUnwatch( $this->mTitle, $wgUser );
-                       }
-                       $dbw->commit( __METHOD__ );
+                       $dbw->onTransactionIdle( function() use ( $dbw, $title, $watch, $wgUser, $fname ) {
+                               $dbw->begin( $fname );
+                               if ( $watch ) {
+                                       WatchAction::doWatch( $title, $wgUser );
+                               } else {
+                                       WatchAction::doUnwatch( $title, $wgUser );
+                               }
+                               $dbw->commit( $fname );
+                       } );
                }
        }
 
@@ -1496,31 +1678,59 @@ class EditPage {
         * @param $editText string
         *
         * @return bool
+        * @deprecated since 1.21, use mergeChangesIntoContent() instead
+        */
+       function mergeChangesInto( &$editText ){
+               ContentHandler::deprecated( __METHOD__, "1.21" );
+
+               $editContent = $this->toEditContent( $editText );
+
+               $ok = $this->mergeChangesIntoContent( $editContent );
+
+               if ( $ok ) {
+                       $editText = $this->toEditText( $editContent );
+                       return true;
+               }
+               return false;
+       }
+
+       /**
+        * @private
+        * @todo document
+        *
+        * @param $editContent
+        * @return bool
+        * @since since 1.WD
         */
-       function mergeChangesInto( &$editText ) {
+       private function mergeChangesIntoContent( &$editContent ){
                wfProfileIn( __METHOD__ );
 
                $db = wfGetDB( DB_MASTER );
 
                // This is the revision the editor started from
                $baseRevision = $this->getBaseRevision();
-               if ( is_null( $baseRevision ) ) {
+               $baseContent = $baseRevision ? $baseRevision->getContent() : null;
+
+               if ( is_null( $baseContent ) ) {
                        wfProfileOut( __METHOD__ );
                        return false;
                }
-               $baseText = $baseRevision->getText();
 
                // The current state, we want to merge updates into it
                $currentRevision = Revision::loadFromTitle( $db, $this->mTitle );
-               if ( is_null( $currentRevision ) ) {
+               $currentContent = $currentRevision ? $currentRevision->getContent() : null;
+
+               if ( is_null( $currentContent ) ) {
                        wfProfileOut( __METHOD__ );
                        return false;
                }
-               $currentText = $currentRevision->getText();
 
-               $result = '';
-               if ( wfMerge( $baseText, $editText, $currentText, $result ) ) {
-                       $editText = $result;
+               $handler = ContentHandler::getForModelID( $baseContent->getModel() );
+
+               $result = $handler->merge3( $baseContent, $editContent, $currentContent );
+
+               if ( $result ) {
+                       $editContent = $result;
                        wfProfileOut( __METHOD__ );
                        return true;
                } else {
@@ -1591,7 +1801,7 @@ class EditPage {
                $wgOut->addModules( 'mediawiki.action.edit' );
 
                if ( $wgUser->getOption( 'uselivepreview', false ) ) {
-                       $wgOut->addModules( 'mediawiki.legacy.preview' );
+                       $wgOut->addModules( 'mediawiki.action.edit.preview' );
                }
                // Bug #19334: textarea jumps when editing articles in IE8
                $wgOut->addStyle( 'common/IE80Fixes.css', 'screen', 'IE 8' );
@@ -1690,10 +1900,13 @@ class EditPage {
                # Give a notice if the user is editing a deleted/moved page...
                if ( !$this->mTitle->exists() ) {
                        LogEventsList::showLogExtract( $wgOut, array( 'delete', 'move' ), $this->mTitle,
-                               '', array( 'lim' => 10,
-                                          'conds' => array( "log_action != 'revision'" ),
-                                          'showIfEmpty' => false,
-                                          'msgKey' => array( 'recreate-moveddeleted-warn' ) )
+                               '',
+                               array(
+                                       'lim' => 10,
+                                       'conds' => array( "log_action != 'revision'" ),
+                                       'showIfEmpty' => false,
+                                       'msgKey' => array( 'recreate-moveddeleted-warn' )
+                               )
                        );
                }
        }
@@ -1711,17 +1924,77 @@ class EditPage {
                                // Added using template syntax, to take <noinclude>'s into account.
                                $wgOut->addWikiTextTitleTidy( '{{:' . $title->getFullText() . '}}', $this->mTitle );
                                return true;
-                       } else {
-                               return false;
                        }
-               } else {
-                       return false;
                }
+               return false;
+       }
+
+       /**
+        * Gets an editable textual representation of $content.
+        * The textual representation can be turned by into a Content object by the
+        * toEditContent() method.
+        *
+        * If $content is null or false or a string, $content is returned unchanged.
+        *
+        * If the given Content object is not of a type that can be edited using the text base EditPage,
+        * an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
+        * content.
+        *
+        * @param Content|null|bool|string $content
+        * @return String the editable text form of the content.
+        *
+        * @throws MWException if $content is not an instance of TextContent and $this->allowNonTextContent is not true.
+        */
+       protected function toEditText( $content ) {
+               if ( $content === null || $content === false ) {
+                       return $content;
+               }
+
+               if ( is_string( $content ) ) {
+                       return $content;
+               }
+
+               if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
+                       throw new MWException( "This content model can not be edited as text: "
+                                                               . ContentHandler::getLocalizedName( $content->getModel() ) );
+               }
+
+               return $content->serialize( $this->contentFormat );
+       }
+
+       /**
+        * Turns the given text into a Content object by unserializing it.
+        *
+        * If the resulting Content object is not of a type that can be edited using the text base EditPage,
+        * an exception will be raised. Set $this->allowNonTextContent to true to allow editing of non-textual
+        * content.
+        *
+        * @param String|null|bool $text Text to unserialize
+        * @return Content The content object created from $text. If $text was false or null, false resp. null will be
+        *                 returned instead.
+        *
+        * @throws MWException if unserializing the text results in a Content object that is not an instance of TextContent
+        *          and $this->allowNonTextContent is not true.
+        */
+       protected function toEditContent( $text ) {
+               if ( $text === false || $text === null ) {
+                       return $text;
+               }
+
+               $content = ContentHandler::makeContent( $text, $this->getTitle(),
+                       $this->contentModel, $this->contentFormat );
+
+               if ( !$this->allowNonTextContent && !( $content instanceof TextContent ) ) {
+                       throw new MWException( "This content model can not be edited as text: "
+                               . ContentHandler::getLocalizedName( $content->getModel() ) );
+               }
+
+               return $content;
        }
 
        /**
         * Send the edit form and related headers to $wgOut
-        * @param $formCallback Callback that takes an OutputPage parameter; will be called
+        * @param $formCallback Callback|null that takes an OutputPage parameter; will be called
         *     during form output near the top, for captchas and the like.
         */
        function showEditForm( $formCallback = null ) {
@@ -1767,6 +2040,8 @@ class EditPage {
                        }
                }
 
+               //@todo: add EditForm plugin interface and use it here!
+               //       search for textarea1 and textares2, and allow EditForm to override all uses.
                $wgOut->addHTML( Html::openElement( 'form', array( 'id' => self::EDITFORM_ID, 'name' => self::EDITFORM_ID,
                        'method' => 'post', 'action' => $this->getActionURL( $this->getContextTitle() ),
                        'enctype' => 'multipart/form-data' ) ) );
@@ -1831,6 +2106,9 @@ class EditPage {
 
                $wgOut->addHTML( Html::hidden( 'oldid', $this->oldid ) );
 
+               $wgOut->addHTML( Html::hidden( 'format', $this->contentFormat ) );
+               $wgOut->addHTML( Html::hidden( 'model', $this->contentModel ) );
+
                if ( $this->section == 'new' ) {
                        $this->showSummaryInput( true, $this->summary );
                        $wgOut->addHTML( $this->getSummaryPreview( true, $this->summary ) );
@@ -1848,7 +2126,9 @@ class EditPage {
                        // resolved between page source edits and custom ui edits using the
                        // custom edit ui.
                        $this->textbox2 = $this->textbox1;
-                       $this->textbox1 = $this->getCurrentText();
+
+                       $content = $this->getCurrentContent();
+                       $this->textbox1 = $this->toEditText( $content );
 
                        $this->showTextbox1();
                } else {
@@ -1874,7 +2154,13 @@ class EditPage {
                        Linker::formatHiddenCategories( $this->mArticle->getHiddenCategories() ) ) );
 
                if ( $this->isConflict ) {
-                       $this->showConflict();
+                       try {
+                               $this->showConflict();
+                       } catch ( MWContentSerializationException $ex ) {
+                               // this can't really happen, but be nice if it does.
+                               $msg = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+                               $wgOut->addWikiText( '<div class="error">' . $msg->text() . '</div>');
+                       }
                }
 
                $wgOut->addHTML( $this->editFormTextBottom . "\n</form>\n" );
@@ -1909,30 +2195,8 @@ class EditPage {
                        $wgOut->addWikiMsg( 'talkpagetext' );
                }
 
-               # Optional notices on a per-namespace and per-page basis
-               $editnotice_ns = 'editnotice-' . $this->mTitle->getNamespace();
-               $editnotice_ns_message = wfMessage( $editnotice_ns );
-               if ( $editnotice_ns_message->exists() ) {
-                       $wgOut->addWikiText( $editnotice_ns_message->plain() );
-               }
-               if ( MWNamespace::hasSubpages( $this->mTitle->getNamespace() ) ) {
-                       $parts = explode( '/', $this->mTitle->getDBkey() );
-                       $editnotice_base = $editnotice_ns;
-                       while ( count( $parts ) > 0 ) {
-                               $editnotice_base .= '-' . array_shift( $parts );
-                               $editnotice_base_msg = wfMessage( $editnotice_base );
-                               if ( $editnotice_base_msg->exists() ) {
-                                       $wgOut->addWikiText( $editnotice_base_msg->plain() );
-                               }
-                       }
-               } else {
-                       # Even if there are no subpages in namespace, we still don't want / in MW ns.
-                       $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->mTitle->getDBkey() );
-                       $editnoticeMsg = wfMessage( $editnoticeText );
-                       if ( $editnoticeMsg->exists() ) {
-                               $wgOut->addWikiText( $editnoticeMsg->plain() );
-                       }
-               }
+               // Add edit notices
+               $wgOut->addHTML( implode( "\n", $this->mTitle->getEditNotices() ) );
 
                if ( $this->isConflict ) {
                        $wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
@@ -1948,7 +2212,7 @@ class EditPage {
 
                        if ( $this->section != '' && $this->section != 'new' ) {
                                if ( !$this->summary && !$this->preview && !$this->diff ) {
-                                       $sectionTitle = self::extractSectionTitle( $this->textbox1 );
+                                       $sectionTitle = self::extractSectionTitle( $this->textbox1 ); //FIXME: use Content object
                                        if ( $sectionTitle !== false ) {
                                                $this->summary = "/* $sectionTitle */ ";
                                        }
@@ -1980,7 +2244,7 @@ class EditPage {
                                if ( $revision ) {
                                        // Let sysop know that this will make private content public if saved
 
-                                       if ( !$revision->userCan( Revision::DELETED_TEXT ) ) {
+                                       if ( !$revision->userCan( Revision::DELETED_TEXT, $wgUser ) ) {
                                                $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-permission' );
                                        } elseif ( $revision->isDeleted( Revision::DELETED_TEXT ) ) {
                                                $wgOut->wrapWikiMsg( "<div class='mw-warning plainlinks'>\n$1\n</div>\n", 'rev-deleted-text-view' );
@@ -2014,10 +2278,13 @@ class EditPage {
                                        $wgOut->wrapWikiMsg( "<div class='error' id='mw-userinvalidcssjstitle'>\n$1\n</div>", array( 'userinvalidcssjstitle', $this->mTitle->getSkinFromCssJsSubpage() ) );
                                }
                                if ( $this->formtype !== 'preview' ) {
-                                       if ( $this->isCssSubpage )
+                                       if ( $this->isCssSubpage ) {
                                                $wgOut->wrapWikiMsg( "<div id='mw-usercssyoucanpreview'>\n$1\n</div>", array( 'usercssyoucanpreview' ) );
-                                       if ( $this->isJsSubpage )
+                                       }
+
+                                       if ( $this->isJsSubpage ) {
                                                $wgOut->wrapWikiMsg( "<div id='mw-userjsyoucanpreview'>\n$1\n</div>", array( 'userjsyoucanpreview' ) );
+                                       }
                                }
                        }
                }
@@ -2148,14 +2415,16 @@ class EditPage {
         * @return String
         */
        protected function getSummaryPreview( $isSubjectPreview, $summary = "" ) {
-               if ( !$summary || ( !$this->preview && !$this->diff ) )
+               if ( !$summary || ( !$this->preview && !$this->diff ) ) {
                        return "";
+               }
 
                global $wgParser;
 
-               if ( $isSubjectPreview )
+               if ( $isSubjectPreview ) {
                        $summary = wfMessage( 'newsectionsummary', $wgParser->stripSectionName( $summary ) )
                                ->inContentLanguage()->text();
+               }
 
                $message = $isSubjectPreview ? 'subject-preview' : 'summary-preview';
 
@@ -2174,8 +2443,9 @@ class EditPage {
 
 HTML
                );
-               if ( !$this->checkUnicodeCompliantBrowser() )
+               if ( !$this->checkUnicodeCompliantBrowser() ) {
                        $wgOut->addHTML( Html::hidden( 'safemode', '1' ) );
+               }
        }
 
        protected function showFormAfterText() {
@@ -2255,10 +2525,10 @@ HTML
                $this->showTextbox( $this->textbox2, 'wpTextbox2', array( 'tabindex' => 6, 'readonly' ) );
        }
 
-       protected function showTextbox( $content, $name, $customAttribs = array() ) {
+       protected function showTextbox( $text, $name, $customAttribs = array() ) {
                global $wgOut, $wgUser;
 
-               $wikitext = $this->safeUnicodeOutput( $content );
+               $wikitext = $this->safeUnicodeOutput( $text );
                if ( strval( $wikitext ) !== '' ) {
                        // Ensure there's a newline at the end, otherwise adding lines
                        // is awkward.
@@ -2285,13 +2555,15 @@ HTML
        protected function displayPreviewArea( $previewOutput, $isOnTop = false ) {
                global $wgOut;
                $classes = array();
-               if ( $isOnTop )
+               if ( $isOnTop ) {
                        $classes[] = 'ontop';
+               }
 
                $attribs = array( 'id' => 'wikiPreview', 'class' => implode( ' ', $classes ) );
 
-               if ( $this->formtype != 'preview' )
+               if ( $this->formtype != 'preview' ) {
                        $attribs['style'] = 'display: none;';
+               }
 
                $wgOut->addHTML( Xml::openElement( 'div', $attribs ) );
 
@@ -2302,7 +2574,12 @@ HTML
                $wgOut->addHTML( '</div>' );
 
                if ( $this->formtype == 'diff' ) {
-                       $this->showDiff();
+                       try {
+                               $this->showDiff();
+                       } catch ( MWContentSerializationException $ex ) {
+                               $msg = wfMessage( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+                               $wgOut->addWikiText( '<div class="error">' . $msg->text() . '</div>');
+                       }
                }
        }
 
@@ -2334,7 +2611,7 @@ HTML
         * save and then make a comparison.
         */
        function showDiff() {
-               global $wgUser, $wgContLang, $wgParser, $wgOut;
+               global $wgUser, $wgContLang, $wgOut;
 
                $oldtitlemsg = 'currentrev';
                # if message does not exist, show diff against the preloaded default
@@ -2342,24 +2619,43 @@ HTML
                        $oldtext = $this->mTitle->getDefaultMessageText();
                        if( $oldtext !== false ) {
                                $oldtitlemsg = 'defaultmessagetext';
+                               $oldContent = $this->toEditContent( $oldtext );
+                       } else {
+                               $oldContent = null;
                        }
                } else {
-                       $oldtext = $this->mArticle->getRawText();
+                       $oldContent = $this->getCurrentContent();
                }
-               $newtext = $this->mArticle->replaceSection(
-                       $this->section, $this->textbox1, $this->summary, $this->edittime );
 
-               wfRunHooks( 'EditPageGetDiffText', array( $this, &$newtext ) );
+               $textboxContent = $this->toEditContent( $this->textbox1 );
 
-               $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
-               $newtext = $wgParser->preSaveTransform( $newtext, $this->mTitle, $wgUser, $popts );
+               $newContent = $this->mArticle->replaceSectionContent(
+                                                       $this->section, $textboxContent,
+                                                       $this->summary, $this->edittime );
 
-               if ( $oldtext !== false  || $newtext != '' ) {
+               if ( $newContent ) {
+                       ContentHandler::runLegacyHooks( 'EditPageGetDiffText', array( $this, &$newContent ) );
+                       wfRunHooks( 'EditPageGetDiffContent', array( $this, &$newContent ) );
+
+                       $popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
+                       $newContent = $newContent->preSaveTransform( $this->mTitle, $wgUser, $popts );
+               }
+
+               if ( ( $oldContent && !$oldContent->isEmpty() ) || ( $newContent && !$newContent->isEmpty() ) ) {
                        $oldtitle = wfMessage( $oldtitlemsg )->parse();
                        $newtitle = wfMessage( 'yourtext' )->parse();
 
-                       $de = new DifferenceEngine( $this->mArticle->getContext() );
-                       $de->setText( $oldtext, $newtext );
+                       if ( !$oldContent ) {
+                               $oldContent = $newContent->getContentHandler()->makeEmptyContent();
+                       }
+
+                       if ( !$newContent ) {
+                               $newContent = $oldContent->getContentHandler()->makeEmptyContent();
+                       }
+
+                       $de = $oldContent->getContentHandler()->createDifferenceEngine( $this->mArticle->getContext() );
+                       $de->setContent( $oldContent, $newContent );
+
                        $difftext = $de->getDiff( $oldtitle, $newtitle );
                        $de->showDiffStyle();
                } else {
@@ -2463,7 +2759,9 @@ HTML
                        wfMessage( 'newwindow' )->parse();
                $wgOut->addHTML( "      <span class='cancelLink'>{$cancel}</span>\n" );
                $wgOut->addHTML( "      <span class='editHelp'>{$edithelp}</span>\n" );
-               $wgOut->addHTML( "</div><!-- editButtons -->\n</div><!-- editOptions -->\n" );
+               $wgOut->addHTML( "</div><!-- editButtons -->\n" );
+               wfRunHooks( 'EditPage::showStandardInputs:options', array( $this, $wgOut, &$tabindex ) );
+               $wgOut->addHTML( "</div><!-- editOptions -->\n" );
        }
 
        /**
@@ -2476,8 +2774,12 @@ HTML
                if ( wfRunHooks( 'EditPageBeforeConflictDiff', array( &$this, &$wgOut ) ) ) {
                        $wgOut->wrapWikiMsg( '<h2>$1</h2>', "yourdiff" );
 
-                       $de = new DifferenceEngine( $this->mArticle->getContext() );
-                       $de->setText( $this->textbox2, $this->textbox1 );
+                       $content1 = $this->toEditContent( $this->textbox1 );
+                       $content2 = $this->toEditContent( $this->textbox2 );
+
+                       $handler = ContentHandler::getForModelID( $this->contentModel );
+                       $de = $handler->createDifferenceEngine( $this->mArticle->getContext() );
+                       $de->setContent( $content2, $content1 );
                        $de->showDiff(
                                wfMessage( 'yourtext' )->parse(),
                                wfMessage( 'storedversion' )->text()
@@ -2568,20 +2870,24 @@ HTML
                );
                // Quick paranoid permission checks...
                if ( is_object( $data ) ) {
-                       if ( $data->log_deleted & LogPage::DELETED_USER )
+                       if ( $data->log_deleted & LogPage::DELETED_USER ) {
                                $data->user_name = wfMessage( 'rev-deleted-user' )->escaped();
-                       if ( $data->log_deleted & LogPage::DELETED_COMMENT )
+                       }
+
+                       if ( $data->log_deleted & LogPage::DELETED_COMMENT ) {
                                $data->log_comment = wfMessage( 'rev-deleted-comment' )->escaped();
+                       }
                }
                return $data;
        }
 
        /**
         * Get the rendered text for previewing.
+        * @throws MWException
         * @return string
         */
        function getPreviewText() {
-               global $wgOut, $wgUser, $wgParser, $wgRawHtml, $wgLang;
+               global $wgOut, $wgUser, $wgRawHtml, $wgLang;
 
                wfProfileIn( __METHOD__ );
 
@@ -2600,82 +2906,96 @@ HTML
                        return $parsedNote;
                }
 
-               if ( $this->mTriedSave && !$this->mTokenOk ) {
-                       if ( $this->mTokenOkExceptSuffix ) {
-                               $note = wfMessage( 'token_suffix_mismatch' )->plain();
-                       } else {
-                               $note = wfMessage( 'session_fail_preview' )->plain();
-                       }
-               } elseif ( $this->incompleteForm ) {
-                       $note = wfMessage( 'edit_form_incomplete' )->plain();
-               } else {
-                       $note = wfMessage( 'previewnote' )->plain() .
-                               ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMessage( 'continue-editing' )->text() . ']]';
-               }
+               $note = '';
 
-               $parserOptions = $this->mArticle->makeParserOptions( $this->mArticle->getContext() );
+               try {
+                       $content = $this->toEditContent( $this->textbox1 );
 
-               $parserOptions->setEditSection( false );
-               $parserOptions->setIsPreview( true );
-               $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' );
+                       $previewHTML = '';
+                       if ( !wfRunHooks( 'AlternateEditPreview', array( $this, &$content, &$previewHTML, &$this->mParserOutput ) ) ) {
+                               wfProfileOut( __METHOD__ );
+                               return $previewHTML;
+                       }
+
+                       if ( $this->mTriedSave && !$this->mTokenOk ) {
+                               if ( $this->mTokenOkExceptSuffix ) {
+                                       $note = wfMessage( 'token_suffix_mismatch' )->plain() ;
 
-               # don't parse non-wikitext pages, show message about preview
-               if ( $this->mTitle->isCssJsSubpage() || !$this->mTitle->isWikitextPage() ) {
-                       if ( $this->mTitle->isCssJsSubpage() ) {
-                               $level = 'user';
-                       } elseif ( $this->mTitle->isCssOrJsPage() ) {
-                               $level = 'site';
-                       } else {
-                               $level = false;
-                       }
-
-                       # Used messages to make sure grep find them:
-                       # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
-                       $class = 'mw-code';
-                       if ( $level ) {
-                               if ( preg_match( "/\\.css$/", $this->mTitle->getText() ) ) {
-                                       $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" . 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!' );
+                                       $note = wfMessage( 'session_fail_preview' )->plain() ;
                                }
-                               $parserOutput = $wgParser->parse( $previewtext, $this->mTitle, $parserOptions );
-                               $previewHTML = $parserOutput->getText();
+                       } elseif ( $this->incompleteForm ) {
+                               $note = wfMessage( 'edit_form_incomplete' )->plain() ;
                        } else {
-                               $previewHTML = '';
+                               $note = wfMessage( 'previewnote' )->plain() .
+                                       ' [[#' . self::EDITFORM_ID . '|' . $wgLang->getArrow() . ' ' . wfMessage( 'continue-editing' )->text() . ']]';
                        }
 
-                       $previewHTML .= "<pre class=\"$class\" dir=\"ltr\">\n" . htmlspecialchars( $this->textbox1 ) . "\n</pre>\n";
-               } else {
-                       $toparse = $this->textbox1;
+                       $parserOptions = $this->mArticle->makeParserOptions( $this->mArticle->getContext() );
+                       $parserOptions->setEditSection( false );
+                       $parserOptions->setIsPreview( true );
+                       $parserOptions->setIsSectionPreview( !is_null($this->section) && $this->section !== '' );
 
-                       # If we're adding a comment, we need to show the
-                       # summary as the headline
-                       if ( $this->section == "new" && $this->summary != "" ) {
-                               $toparse = wfMessage( 'newsectionheaderdefaultlevel', $this->summary )->inContentLanguage()->text() . "\n\n" . $toparse;
-                       }
+                       # don't parse non-wikitext pages, show message about preview
+                       if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) {
+                               if( $this->mTitle->isCssJsSubpage() ) {
+                                       $level = 'user';
+                               } elseif( $this->mTitle->isCssOrJsPage() ) {
+                                       $level = 'site';
+                               } else {
+                                       $level = false;
+                               }
 
-                       wfRunHooks( 'EditPageGetPreviewText', array( $this, &$toparse ) );
+                               if ( $content->getModel() == CONTENT_MODEL_CSS ) {
+                                       $format = 'css';
+                               } elseif ( $content->getModel() == CONTENT_MODEL_JAVASCRIPT ) {
+                                       $format = 'js';
+                               } else {
+                                       $format = false;
+                               }
 
-                       $toparse = $wgParser->preSaveTransform( $toparse, $this->mTitle, $wgUser, $parserOptions );
-                       $parserOutput = $wgParser->parse( $toparse, $this->mTitle, $parserOptions );
+                               # Used messages to make sure grep find them:
+                               # Messages: usercsspreview, userjspreview, sitecsspreview, sitejspreview
+                               if( $level && $format ) {
+                                       $note = "<div id='mw-{$level}{$format}preview'>" . wfMessage( "{$level}{$format}preview" )->text()  . "</div>";
+                               }
+                       }
 
-                       $rt = Title::newFromRedirectArray( $this->textbox1 );
+                       $rt = $content->getRedirectChain();
                        if ( $rt ) {
                                $previewHTML = $this->mArticle->viewRedirect( $rt, false );
                        } else {
-                               $previewHTML = $parserOutput->getText();
-                       }
 
-                       $this->mParserOutput = $parserOutput;
-                       $wgOut->addParserOutputNoText( $parserOutput );
+                               # If we're adding a comment, we need to show the
+                               # summary as the headline
+                               if ( $this->section === "new" && $this->summary !== "" ) {
+                                       $content = $content->addSectionHeader( $this->summary );
+                               }
+
+                               $hook_args = array( $this, &$content );
+                               ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args );
+                               wfRunHooks( 'EditPageGetPreviewContent', $hook_args );
 
-                       if ( count( $parserOutput->getWarnings() ) ) {
-                               $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+                               $parserOptions->enableLimitReport();
+
+                               # For CSS/JS pages, we should have called the ShowRawCssJs hook here.
+                               # But it's now deprecated, so never mind
+
+                               $content = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions );
+                               $parserOutput = $content->getParserOutput( $this->getArticle()->getTitle(), null, $parserOptions );
+
+                               $previewHTML = $parserOutput->getText();
+                               $this->mParserOutput = $parserOutput;
+                               $wgOut->addParserOutputNoText( $parserOutput );
+
+                               if ( count( $parserOutput->getWarnings() ) ) {
+                                       $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+                               }
                        }
+               } catch ( MWContentSerializationException $ex ) {
+                       $m = wfMessage('content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() );
+                       $note .= "\n\n" . $m->parse();
+                       $previewHTML = '';
                }
 
                if ( $this->isConflict ) {
@@ -3067,7 +3387,7 @@ HTML
        /**
         * Produce the stock "your edit contains spam" page
         *
-        * @param $match string Text which triggered one or more filters
+        * @param $match string|bool Text which triggered one or more filters
         * @deprecated since 1.17 Use method spamPageWithContent() instead
         */
        static function spamPage( $match = false ) {
index 714f73e..f09e8f8 100644 (file)
@@ -500,25 +500,24 @@ 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
+ * This is essentially an ErrorPageError exception which by default uses 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 ) {
+ * 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.
+ * Note the parameter order differs from ErrorPageError, this allows you to
+ * simply specify a reason without overriding the default title.
  *
  * @par Example:
  * @code
- * if( $user->isAnon ) {
+ * if( $user->isAnon() ) {
  *     throw new UserNotLoggedIn( 'action-require-loggedin' );
  * }
  * @endcode
@@ -533,7 +532,7 @@ class UserNotLoggedIn extends ErrorPageError {
         * @param $titleMsg A message key to set the page title.
         *        Optional, default: 'exception-nologin'
         * @param $params Parameters to wfMessage().
-        *        Optiona, default: null
+        *        Optional, default: null
         */
        public function __construct(
                $reasonMsg = 'exception-nologin-text',
index c2409de..45a5366 100644 (file)
@@ -63,7 +63,7 @@ class WikiExporter {
         * @return string
         */
        public static function schemaVersion() {
-               return "0.7";
+               return "0.8";
        }
 
        /**
@@ -498,7 +498,7 @@ class XmlDumpWriter {
                        'xmlns'              => "http://www.mediawiki.org/xml/export-$ver/",
                        'xmlns:xsi'          => "http://www.w3.org/2001/XMLSchema-instance",
                        'xsi:schemaLocation' => "http://www.mediawiki.org/xml/export-$ver/ " .
-                                               "http://www.mediawiki.org/xml/export-$ver.xsd",
+                                               "http://www.mediawiki.org/xml/export-$ver.xsd", #TODO: how do we get a new version up there?
                        'version'            => $ver,
                        'xml:lang'           => $wgLanguageCode ),
                        null ) .
@@ -636,35 +636,29 @@ class XmlDumpWriter {
 
                $out  = "    <revision>\n";
                $out .= "      " . Xml::element( 'id', null, strval( $row->rev_id ) ) . "\n";
-               if( $row->rev_parent_id ) {
+               if( isset( $row->rev_parent_id ) && $row->rev_parent_id ) {
                        $out .= "      " . Xml::element( 'parentid', null, strval( $row->rev_parent_id ) ) . "\n";
                }
 
                $out .= $this->writeTimestamp( $row->rev_timestamp );
 
-               if ( $row->rev_deleted & Revision::DELETED_USER ) {
+               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_USER ) ) {
                        $out .= "      " . Xml::element( 'contributor', array( 'deleted' => 'deleted' ) ) . "\n";
                } else {
                        $out .= $this->writeContributor( $row->rev_user, $row->rev_user_text );
                }
 
-               if ( $row->rev_minor_edit ) {
+               if ( isset( $row->rev_minor_edit ) && $row->rev_minor_edit ) {
                        $out .=  "      <minor/>\n";
                }
-               if ( $row->rev_deleted & Revision::DELETED_COMMENT ) {
+               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_COMMENT ) ) {
                        $out .= "      " . Xml::element( 'comment', array( 'deleted' => 'deleted' ) ) . "\n";
                } elseif ( $row->rev_comment != '' ) {
                        $out .= "      " . Xml::elementClean( 'comment', array(), strval( $row->rev_comment ) ) . "\n";
                }
 
-               if ( $row->rev_sha1 && !( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
-                       $out .= "      " . Xml::element('sha1', null, strval( $row->rev_sha1 ) ) . "\n";
-               } else {
-                       $out .= "      <sha1/>\n";
-               }
-
                $text = '';
-               if ( $row->rev_deleted & Revision::DELETED_TEXT ) {
+               if ( isset( $row->rev_deleted ) && ( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
                        $out .= "      " . Xml::element( 'text', array( 'deleted' => 'deleted' ) ) . "\n";
                } elseif ( isset( $row->old_text ) ) {
                        // Raw text from the database may have invalid chars
@@ -679,6 +673,34 @@ class XmlDumpWriter {
                                "" ) . "\n";
                }
 
+               if ( isset( $row->rev_sha1 ) && $row->rev_sha1 && !( $row->rev_deleted & Revision::DELETED_TEXT ) ) {
+                       $out .= "      " . Xml::element('sha1', null, strval( $row->rev_sha1 ) ) . "\n";
+               } else {
+                       $out .= "      <sha1/>\n";
+               }
+
+               if ( isset( $row->rev_content_model ) && !is_null( $row->rev_content_model )  ) {
+                       $content_model = strval( $row->rev_content_model );
+               } else {
+                       // probably using $wgContentHandlerUseDB = false;
+                       // @todo: test!
+                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       $content_model = ContentHandler::getDefaultModelFor( $title );
+               }
+
+               $out .= "      " . Xml::element('model', null, strval( $content_model ) ) . "\n";
+
+               if ( isset( $row->rev_content_format ) && !is_null( $row->rev_content_format ) ) {
+                       $content_format = strval( $row->rev_content_format );
+               } else {
+                       // probably using $wgContentHandlerUseDB = false;
+                       // @todo: test!
+                       $content_handler = ContentHandler::getForModelID( $content_model );
+                       $content_format = $content_handler->getDefaultFormat();
+               }
+
+               $out .= "      " . Xml::element('format', null, strval( $content_format ) ) . "\n";
+
                wfRunHooks( 'XmlDumpWriterWriteRevision', array( &$this, &$out, $row, $text ) );
 
                $out .= "    </revision>\n";
@@ -1325,6 +1347,7 @@ class DumpNamespaceFilter extends DumpFilter {
        /**
         * @param $sink DumpOutput
         * @param $param
+        * @throws MWException
         */
        function __construct( &$sink, $param ) {
                parent::__construct( $sink );
index 61d4ef7..1b7c29d 100644 (file)
  */
 class ExternalStore {
        var $mParams;
-       
+
+       /**
+        * @param $params array
+        */
        function __construct( $params = array() ) {
                $this->mParams = $params;
        }
-       
+
        /**
         * Fetch data from given URL
         *
@@ -50,8 +53,9 @@ class ExternalStore {
        static function fetchFromURL( $url, $params = array() ) {
                global $wgExternalStores;
 
-               if( !$wgExternalStores )
+               if( !$wgExternalStores ) {
                        return false;
+               }
 
                $parts = explode( '://', $url, 2 );
 
@@ -66,8 +70,10 @@ class ExternalStore {
                }
 
                $store = self::getStoreObject( $proto, $params );
-               if ( $store === false )
+               if ( $store === false ) {
                        return false;
+               }
+
                return $store->fetchFromURL( $url );
        }
 
@@ -76,15 +82,18 @@ class ExternalStore {
         *
         * @param $proto String: type of external storage, should be a value in $wgExternalStores
         * @param $params Array: associative array of parameters for the ExternalStore object.
-        * @return ExternalStore subclass or false on error
+        * @return ExternalStore|bool ExternalStore class or false on error
         */
        static function getStoreObject( $proto, $params = array() ) {
                global $wgExternalStores;
-               if( !$wgExternalStores )
+               if( !$wgExternalStores ) {
                        return false;
+               }
+
                /* Protocol not enabled */
-               if( !in_array( $proto, $wgExternalStores ) )
+               if( !in_array( $proto, $wgExternalStores ) ) {
                        return false;
+               }
 
                $class = 'ExternalStore' . ucfirst( $proto );
                /* Any custom modules should be added to $wgAutoLoadClasses for on-demand loading */
@@ -113,7 +122,7 @@ class ExternalStore {
                        return $store->store( $params, $data );
                }
        }
-       
+
        /**
         * Like insert() above, but does more of the work for us.
         * This function does not need a url param, it builds it by
@@ -121,7 +130,8 @@ class ExternalStore {
         *
         * @param $data String
         * @param $storageParams Array: associative array of parameters for the ExternalStore object.
-        * @return string The URL of the stored data item, or false on error
+        * @throws MWException|DBConnectionError|DBQueryError
+        * @return string|bool The URL of the stored data item, or false on error
         */
        public static function insertToDefault( $data, $storageParams = array() ) {
                global $wgDefaultExternalStore;
@@ -159,7 +169,7 @@ class ExternalStore {
                        throw new MWException( "Unable to store text to external storage" );
                }
        }
-       
+
        /**
         * @param $data
         * @param $wiki
index 6f2b33e..37b1b93 100644 (file)
@@ -26,6 +26,9 @@
  */
 class ExternalStoreDB {
 
+       /**
+        * @param $params array
+        */
        function __construct( $params = array() ) {
                $this->mParams = $params;
        }
@@ -97,8 +100,8 @@ class ExternalStoreDB {
         */
        function fetchFromURL( $url ) {
                $path = explode( '/', $url );
-               $cluster  = $path[2];
-               $id       = $path[3];
+               $cluster = $path[2];
+               $id = $path[3];
                if ( isset( $path[4] ) ) {
                        $itemID = $path[4];
                } else {
@@ -165,6 +168,7 @@ class ExternalStoreDB {
         *
         * @param $cluster String: the cluster name
         * @param $data String: the data item
+        * @throws MWException
         * @return string URL
         */
        function store( $cluster, $data ) {
index 9a01deb..23944a5 100644 (file)
@@ -288,7 +288,7 @@ abstract class ExternalUser {
                                   'eu_external_id' => $this->getId() ),
                        __METHOD__ );
        }
-       
+
        /**
         * Check whether this external user id is already linked with
         * a local user.
@@ -305,5 +305,5 @@ abstract class ExternalUser {
                        ? User::newFromId( $row->eu_local_id )
                        : null;
        }
-       
+
 }
index 11b2675..82c6e4a 100644 (file)
@@ -87,7 +87,7 @@ class FeedUtils {
                        ($row->rc_deleted & Revision::DELETED_COMMENT)
                                ? wfMessage('rev-deleted-comment')->escaped()
                                : $row->rc_comment,
-                       $actiontext 
+                       $actiontext
                );
        }
 
@@ -138,13 +138,23 @@ class FeedUtils {
                        $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(
-                                       wfMessage( 'previousrevision' )->text(), // hack
-                                       wfMessage( 'revisionasof',
-                                       $wgLang->timeanddate( $timestamp ),
-                                       $wgLang->date( $timestamp ),
-                                       $wgLang->time( $timestamp ) )->text() );
+                               $rev = Revision::newFromId( $oldid );
+
+                               if ( !$rev ) {
+                                       $diffText = false;
+                               } else {
+                                       $context = clone RequestContext::getMain();
+                                       $context->setTitle( $title );
+
+                                       $contentHandler = $rev->getContentHandler();
+                                       $de = $contentHandler->createDifferenceEngine( $context, $oldid, $newid );
+                                       $diffText = $de->getDiff(
+                                               wfMessage( 'previousrevision' )->text(), // hack
+                                               wfMessage( 'revisionasof',
+                                                       $wgLang->timeanddate( $timestamp ),
+                                                       $wgLang->date( $timestamp ),
+                                                       $wgLang->time( $timestamp ) )->text() );
+                               }
                        }
 
                        if ( $wgFeedDiffCutoff <= 0 || ( strlen( $diffText ) > $wgFeedDiffCutoff ) ) {
@@ -162,16 +172,36 @@ class FeedUtils {
                } else {
                        $rev = Revision::newFromId( $newid );
                        if( $wgFeedDiffCutoff <= 0 || is_null( $rev ) ) {
-                               $newtext = '';
+                               $newContent = ContentHandler::getForTitle( $title )->makeEmptyContent();
+                       } else {
+                               $newContent = $rev->getContent();
+                       }
+
+                       if ( $newContent instanceof TextContent ) {
+                               // only textual content has a "source view".
+                               $text = $newContent->getNativeData();
+
+                               if ( $wgFeedDiffCutoff <= 0 || strlen( $text ) > $wgFeedDiffCutoff ) {
+                                       $html = null;
+                               } else {
+                                       $html = nl2br( htmlspecialchars( $text ) );
+                               }
                        } else {
-                               $newtext = $rev->getText();
+                               //XXX: we could get an HTML representation of the content via getParserOutput, but that may
+                               //     contain JS magic and generally may not be suitable for inclusion in a feed.
+                               //     Perhaps Content should have a getDescriptiveHtml method and/or a getSourceText method.
+                               //Compare also ApiFeedContributions::feedItemDesc
+                               $html = null;
                        }
-                       if ( $wgFeedDiffCutoff <= 0 || strlen( $newtext ) > $wgFeedDiffCutoff ) {
+
+                       if ( $html === null ) {
+
                                // Omit large new page diffs, bug 29110
+                               // Also use diff link for non-textual content
                                $diffText = self::getDiffLink( $title, $newid );
                        } else {
                                $diffText = '<p><b>' . wfMessage( 'newpage' )->text() . '</b></p>' .
-                                       '<div>' . nl2br( htmlspecialchars( $newtext ) ) . '</div>';
+                                       '<div>' . $html . '</div>';
                        }
                }
                $completeText .= $diffText;
index e75ad72..e2fcd9c 100644 (file)
@@ -144,6 +144,7 @@ class FileDeleteForm {
         * @param $reason String: reason of the deletion
         * @param $suppress Boolean: whether to mark all deleted versions as restricted
         * @param $user User object performing the request
+        * @throws MWException
         * @return bool|Status
         */
        public static function doDelete( &$title, &$file, &$oldimage, $reason, $suppress, User $user = null ) {
@@ -374,8 +375,9 @@ class FileDeleteForm {
                $q = array();
                $q['action'] = 'delete';
 
-               if( $this->oldimage )
+               if( $this->oldimage ) {
                        $q['oldimage'] = $this->oldimage;
+               }
 
                return $this->title->getLocalUrl( $q );
        }
index 33bbd86..1cfe88e 100644 (file)
@@ -22,7 +22,7 @@
  *
  * @file
  * @author Niklas Laxström
- * @author Antoine Musso 
+ * @author Antoine Musso
  */
 
 /**
@@ -83,6 +83,7 @@ class FormOptions implements ArrayAccess {
         * which will be assumed as INT if the data is an integer.
         *
         * @param $data Mixed: value to guess type for
+        * @throws MWException
         * @exception MWException Unsupported datatype
         * @return int Type constant
         */
@@ -105,6 +106,7 @@ class FormOptions implements ArrayAccess {
         *
         * @param $name String: option name
         * @param $strict Boolean: throw an exception when the option does not exist (default false)
+        * @throws MWException
         * @return Boolean: true if option exist, false otherwise
         */
        public function validateName( $name, $strict = false ) {
@@ -205,11 +207,12 @@ class FormOptions implements ArrayAccess {
 
        /**
         * Validate and set an option integer value
-        * The value will be altered to fit in the range. 
+        * The value will be altered to fit in the range.
         *
         * @param $name String: option name
         * @param $min Int: minimum value
         * @param $max Int: maximum value
+        * @throws MWException
         * @exception MWException Option is not of type int
         * @return null
         */
index 17e3f4d..6d86a50 100644 (file)
@@ -169,6 +169,7 @@ function wfArrayLookup( $a, $b ) {
  * @param $value Mixed
  * @param $default Mixed
  * @param $changed Array to alter
+ * @throws MWException
  */
 function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
        if ( is_null( $changed ) ) {
@@ -1110,6 +1111,7 @@ function wfWarn( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
  *
  * @param $text String
  * @param $file String filename
+ * @throws MWException
  */
 function wfErrorLog( $text, $file ) {
        if ( substr( $file, 0, 4 ) == 'udp:' ) {
@@ -1212,9 +1214,18 @@ function wfLogProfilingData() {
        if ( $wgUser->isItemLoaded( 'id' ) && $wgUser->isAnon() ) {
                $forward .= ' anon';
        }
+
+       // Command line script uses a FauxRequest object which does not have
+       // any knowledge about an URL and throw an exception instead.
+       try {
+               $requestUrl = $wgRequest->getRequestURL();
+       } catch ( MWException $e ) {
+               $requestUrl = 'n/a';
+       }
+
        $log = sprintf( "%s\t%04.3f\t%s\n",
                gmdate( 'YmdHis' ), $elapsed,
-               urldecode( $wgRequest->getRequestURL() . $forward ) );
+               urldecode( $requestUrl . $forward ) );
 
        wfErrorLog( $log . $profiler->getOutput(), $wgDebugLogFile );
 }
@@ -1416,6 +1427,8 @@ function wfMessageFallback( /*...*/ ) {
  * @return String
  */
 function wfMsg( $key ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        $args = func_get_args();
        array_shift( $args );
        return wfMsgReal( $key, $args );
@@ -1430,6 +1443,8 @@ function wfMsg( $key ) {
  * @return String
  */
 function wfMsgNoTrans( $key ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        $args = func_get_args();
        array_shift( $args );
        return wfMsgReal( $key, $args, true, false, false );
@@ -1461,6 +1476,8 @@ function wfMsgNoTrans( $key ) {
  * @return String
  */
 function wfMsgForContent( $key ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        global $wgForceUIMsgAsContentMsg;
        $args = func_get_args();
        array_shift( $args );
@@ -1482,6 +1499,8 @@ function wfMsgForContent( $key ) {
  * @return String
  */
 function wfMsgForContentNoTrans( $key ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        global $wgForceUIMsgAsContentMsg;
        $args = func_get_args();
        array_shift( $args );
@@ -1507,6 +1526,8 @@ function wfMsgForContentNoTrans( $key ) {
  * @return String: the requested message.
  */
 function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform = true ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        wfProfileIn( __METHOD__ );
        $message = wfMsgGetKey( $key, $useDB, $forContent, $transform );
        $message = wfMsgReplaceArgs( $message, $args );
@@ -1527,6 +1548,8 @@ function wfMsgReal( $key, $args, $useDB = true, $forContent = false, $transform
  * @return string
  */
 function wfMsgGetKey( $key, $useDB = true, $langCode = false, $transform = true ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        wfRunHooks( 'NormalizeMessageKey', array( &$key, &$useDB, &$langCode, &$transform ) );
 
        $cache = MessageCache::singleton();
@@ -1581,6 +1604,8 @@ function wfMsgReplaceArgs( $message, $args ) {
  * @return string
  */
 function wfMsgHtml( $key ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        $args = func_get_args();
        array_shift( $args );
        return wfMsgReplaceArgs( htmlspecialchars( wfMsgGetKey( $key ) ), $args );
@@ -1600,6 +1625,8 @@ function wfMsgHtml( $key ) {
  * @return string
  */
 function wfMsgWikiHtml( $key ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        $args = func_get_args();
        array_shift( $args );
        return wfMsgReplaceArgs(
@@ -1631,6 +1658,8 @@ function wfMsgWikiHtml( $key ) {
  * @return String
  */
 function wfMsgExt( $key, $options ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        $args = func_get_args();
        array_shift( $args );
        array_shift( $args );
@@ -1711,6 +1740,8 @@ function wfMsgExt( $key, $options ) {
  * @return Boolean True if the message *doesn't* exist.
  */
 function wfEmptyMsg( $key ) {
+       wfDeprecated( __METHOD__, '1.21' );
+
        return MessageCache::singleton()->get( $key, /*useDB*/true, /*content*/false ) === false;
 }
 
@@ -1719,6 +1750,7 @@ function wfEmptyMsg( $key ) {
  * but now throws an exception instead, with similar results.
  *
  * @param $msg String: message shown when dying.
+ * @throws MWException
  */
 function wfDebugDieBacktrace( $msg = '' ) {
        throw new MWException( $msg );
@@ -2512,6 +2544,7 @@ function wfTempDir() {
  * @param $dir String: full path to directory to create
  * @param $mode Integer: chmod value to use, default is $wgDirectoryMode
  * @param $caller String: optional caller param for debugging.
+ * @throws MWException
  * @return bool
  */
 function wfMkdirParents( $dir, $mode = null, $caller = null ) {
@@ -2891,11 +2924,15 @@ function wfMerge( $old, $mine, $yours, &$result ) {
        $mytextFile = fopen( $mytextName = tempnam( $td, 'merge-mine-' ), 'w' );
        $yourtextFile = fopen( $yourtextName = tempnam( $td, 'merge-your-' ), 'w' );
 
-       fwrite( $oldtextFile, $old );
+       # NOTE: diff3 issues a warning to stderr if any of the files does not end with
+       #       a newline character. To avoid this, we normalize the trailing whitespace before
+       #       creating the diff.
+
+       fwrite( $oldtextFile, rtrim( $old ) . "\n" );
        fclose( $oldtextFile );
-       fwrite( $mytextFile, $mine );
+       fwrite( $mytextFile, rtrim( $mine ) . "\n" );
        fclose( $mytextFile );
-       fwrite( $yourtextFile, $yours );
+       fwrite( $yourtextFile, rtrim( $yours ) . "\n" );
        fclose( $yourtextFile );
 
        # Check for a conflict
@@ -3022,6 +3059,7 @@ function wfDiff( $before, $after, $params = '-u' ) {
  *
  * @param $req_ver Mixed: the version to check, can be a string, an integer, or
  *                 a float
+ * @throws MWException
  */
 function wfUsePHP( $req_ver ) {
        $php_ver = PHP_VERSION;
@@ -3043,6 +3081,7 @@ function wfUsePHP( $req_ver ) {
  *
  * @param $req_ver Mixed: the version to check, can be a string, an integer, or
  *                 a float
+ * @throws MWException
  */
 function wfUseMW( $req_ver ) {
        global $wgVersion;
@@ -3250,6 +3289,18 @@ function wfHttpOnlySafe() {
        return true;
 }
 
+/**
+ * Check if there is sufficent entropy in php's built-in session generation
+ * @return bool true = there is sufficient entropy
+ */
+function wfCheckEntropy() {
+       return (
+                       ( wfIsWindows() && version_compare( PHP_VERSION, '5.3.3', '>=' ) )
+                       || ini_get( 'session.entropy_file' )
+               )
+               && intval( ini_get( 'session.entropy_length' ) ) >= 32;
+}
+
 /**
  * Override session_id before session startup if php's built-in
  * session generation code is not secure.
@@ -3264,11 +3315,7 @@ function wfFixSessionID() {
        // - entropy_file is set or you're on Windows with php 5.3.3+
        // - AND entropy_length is > 0
        // We treat it as disabled if it doesn't have an entropy length of at least 32
-       $entropyEnabled = (
-                       ( wfIsWindows() && version_compare( PHP_VERSION, '5.3.3', '>=' ) )
-                       || ini_get( 'session.entropy_file' )
-               )
-               && intval( ini_get( 'session.entropy_length' ) ) >= 32;
+       $entropyEnabled = wfCheckEntropy();
 
        // If built-in entropy is not enabled or not sufficient override php's built in session id generation code
        if ( !$entropyEnabled ) {
@@ -3551,16 +3598,6 @@ function wfBoolToStr( $value ) {
        return $value ? 'true' : 'false';
 }
 
-/**
- * Load an extension messages file
- *
- * @deprecated since 1.16, warnings in 1.18, remove in 1.20
- * @codeCoverageIgnore
- */
-function wfLoadExtensionMessages() {
-       wfDeprecated( __FUNCTION__, '1.16' );
-}
-
 /**
  * Get a platform-independent path to the null file, e.g. /dev/null
  *
index 5c00b9f..ef24b62 100644 (file)
@@ -248,6 +248,7 @@ class HTMLForm extends ContextSource {
         * Set format in which to display the form
         * @param $format String the name of the format to use, must be one of
         *        $this->availableDisplayFormats
+        * @throws MWException
         * @since 1.20
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
@@ -279,6 +280,7 @@ class HTMLForm extends ContextSource {
         * Initialise a new Object for the field
         * @param $fieldname string
         * @param $descriptor string input Descriptor, as described above
+        * @throws MWException
         * @return HTMLFormField subclass
         */
        static function loadInputFromParameters( $fieldname, $descriptor ) {
@@ -312,6 +314,7 @@ class HTMLForm extends ContextSource {
         * @attention When doing method chaining, that should be the very last
         * method call before displayForm().
         *
+        * @throws MWException
         * @return HTMLForm $this for chaining calls (since 1.20)
         */
        function prepareForm() {
@@ -375,9 +378,10 @@ class HTMLForm extends ContextSource {
        /**
         * Validate all the fields, and call the submision callback
         * function if everything is kosher.
+        * @throws MWException
         * @return Mixed Bool true == Successful submission, Bool false
-        *       == No submission attempted, anything else == Error to
-        *       display.
+        *     == No submission attempted, anything else == Error to
+        *     display.
         */
        function trySubmit() {
                # Check for validation
@@ -1177,6 +1181,7 @@ abstract class HTMLFormField {
        /**
         * Initialise the object
         * @param $params array Associative Array. See HTMLForm doc for syntax.
+        * @throws MWException
         */
        function __construct( $params ) {
                $this->mParams = $params;
@@ -1321,7 +1326,6 @@ abstract class HTMLFormField {
        public function getRaw( $value ) {
                list( $errors, $errorClass ) = $this->getErrorsAndErrorClass( $value );
                $inputHtml = $this->getInputHTML( $value );
-               $fieldType = get_class( $this );
                $helptext = $this->getHelpTextHtmlRaw( $this->getHelpText() );
                $cellAttributes = array();
                $label = $this->getLabelHtml( $cellAttributes );
index bb8ec5e..05c27fe 100644 (file)
  *
  * @file
  */
+
 /**
- * Base class for general text storage via the "object" flag in old_flags, or 
- * two-part external storage URLs. Used for represent efficient concatenated 
+ * Base class for general text storage via the "object" flag in old_flags, or
+ * two-part external storage URLs. Used for represent efficient concatenated
  * storage, and migration-related pointer objects.
  */
 interface HistoryBlob
@@ -178,7 +178,7 @@ class ConcatenatedGzipHistoryBlob implements HistoryBlob
         * @return bool
         */
        public function isHappy() {
-               return $this->mSize < $this->mMaxSize 
+               return $this->mSize < $this->mMaxSize
                        && count( $this->mItems ) < $this->mMaxCount;
        }
 }
@@ -341,12 +341,12 @@ class DiffHistoryBlob implements HistoryBlob {
        /** Total uncompressed size */
        var $mSize = 0;
 
-       /** 
-        * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is 
+       /**
+        * Array of diffs. If a diff D from A to B is notated D = B - A, and Z is
         * an empty string:
         *
         *              { item[map[i]] - item[map[i-1]]   where i > 0
-        *    diff[i] = { 
+        *    diff[i] = {
         *              { item[map[i]] - Z                where i = 0
         */
        var $mDiffs;
@@ -379,7 +379,7 @@ class DiffHistoryBlob implements HistoryBlob {
         * The maximum number of text items before the object becomes sad
         */
        var $mMaxCount = 100;
-       
+
        /** Constants from xdiff.h */
        const XDL_BDOP_INS = 1;
        const XDL_BDOP_CPY = 2;
@@ -433,7 +433,7 @@ class DiffHistoryBlob implements HistoryBlob {
         * @throws MWException
         */
        function compress() {
-               if ( !function_exists( 'xdiff_string_rabdiff' ) ){ 
+               if ( !function_exists( 'xdiff_string_rabdiff' ) ){
                        throw new MWException( "Need xdiff 1.5+ support to write DiffHistoryBlob\n" );
                }
                if ( isset( $this->mDiffs ) ) {
@@ -534,7 +534,7 @@ class DiffHistoryBlob implements HistoryBlob {
                # Pure PHP implementation
 
                $header = unpack( 'Vofp/Vcsize', substr( $diff, 0, 8 ) );
-               
+
                # Check the checksum if hash/mhash is available
                $ofp = $this->xdiffAdler32( $base );
                if ( $ofp !== false && $ofp !== substr( $diff, 0, 4 ) ) {
@@ -545,7 +545,7 @@ class DiffHistoryBlob implements HistoryBlob {
                        wfDebug( __METHOD__. ": incorrect base length\n" );
                        return false;
                }
-               
+
                $p = 8;
                $out = '';
                while ( $p < strlen( $diff ) ) {
@@ -579,7 +579,7 @@ class DiffHistoryBlob implements HistoryBlob {
        }
 
        /**
-        * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with 
+        * Compute a binary "Adler-32" checksum as defined by LibXDiff, i.e. with
         * the bytes backwards and initialised with 0 instead of 1. See bug 34428.
         *
         * Returns false if no hashing library is available
@@ -589,8 +589,8 @@ class DiffHistoryBlob implements HistoryBlob {
                if ( $init === null ) {
                        $init = str_repeat( "\xf0", 205 ) . "\xee" . str_repeat( "\xf0", 67 ) . "\x02";
                }
-               // The real Adler-32 checksum of $init is zero, so it initialises the 
-               // state to zero, as it is at the start of LibXDiff's checksum 
+               // The real Adler-32 checksum of $init is zero, so it initialises the
+               // state to zero, as it is at the start of LibXDiff's checksum
                // algorithm. Appending the subject string then simulates LibXDiff.
                if ( function_exists( 'hash' ) ) {
                        $hash = hash( 'adler32', $init . $s, true );
@@ -664,7 +664,7 @@ class DiffHistoryBlob implements HistoryBlob {
                if ( isset( $info['base'] ) ) {
                        // Old format
                        $this->mDiffMap = range( 0, count( $this->mDiffs ) - 1 );
-                       array_unshift( $this->mDiffs, 
+                       array_unshift( $this->mDiffs,
                                pack( 'VVCV', 0, 0, self::XDL_BDOP_INSB, strlen( $info['base'] ) ) .
                                $info['base'] );
                } else {
@@ -687,7 +687,7 @@ class DiffHistoryBlob implements HistoryBlob {
         * @return bool
         */
        function isHappy() {
-               return $this->mSize < $this->mMaxSize 
+               return $this->mSize < $this->mMaxSize
                        && count( $this->mItems ) < $this->mMaxCount;
        }
 
index bc39f2f..c9c0679 100644 (file)
  * @file
  */
 
+/**
+ * @since 1.18
+ */
 class MWHookException extends MWException {}
 
 /**
  * Hooks class.
  *
  * Used to supersede $wgHooks, because globals are EVIL.
+ *
+ * @since 1.18
  */
 class Hooks {
 
        protected static $handlers = array();
 
+       /**
+        * Clears hooks registered via Hooks::register(). Does not touch $wgHooks.
+        * This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
+        *
+        * @since 1.21
+        *
+        * @param $name String: the name of the hook to clear.
+        *
+        * @throws MWException if not in testing mode.
+        */
+       public static function clear( $name ) {
+               if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
+                       throw new MWException( 'can not reset hooks in operation.' );
+               }
+
+               unset( self::$handlers[$name] );
+       }
+
+
        /**
         * Attach an event handler to a given hook
         *
-        * @param $name Mixed: name of hook
+        * @since 1.18
+        *
+        * @param $name String: name of hook
         * @param $callback Mixed: callback function to attach
-        * @return void
         */
        public static function register( $name, $callback ) {
                if( !isset( self::$handlers[$name] ) ) {
@@ -51,69 +76,81 @@ class Hooks {
 
        /**
         * Returns true if a hook has a function registered to it.
+        * The function may have been registered either via Hooks::register or in $wgHooks.
+        *
+        * @since 1.18
         *
-        * @param $name Mixed: name of hook
-        * @return Boolean: true if a hook has a function registered to it
+        * @param $name String: name of hook
+        * @return Boolean: true if the hook has a function registered to it
         */
        public static function isRegistered( $name ) {
-               if( !isset( self::$handlers[$name] ) ) {
-                       self::$handlers[$name] = array();
-               }
+               global $wgHooks;
 
-               return ( count( self::$handlers[$name] ) != 0 );
+               return !empty( $wgHooks[$name] ) || !empty( self::$handlers[$name] );
        }
 
        /**
         * Returns an array of all the event functions attached to a hook
+        * This combines functions registered via Hooks::register and with $wgHooks.
+        * @since 1.18
+        *
+        * @throws MWException
+        * @throws FatalError
+        * @param $name String: name of the hook
         *
-        * @param $name Mixed: name of the hook
         * @return array
         */
        public static function getHandlers( $name ) {
-               if( !isset( self::$handlers[$name] ) ) {
+               global $wgHooks;
+
+               // Return quickly in the most common case
+               if ( empty( self::$handlers[$name] ) && empty( $wgHooks[$name] ) ) {
                        return array();
                }
 
-               return self::$handlers[$name];
+               if ( !is_array( self::$handlers ) ) {
+                       throw new MWException( "Local hooks array is not an array!\n" );
+               }
+
+               if ( !is_array( $wgHooks ) ) {
+                       throw new MWException( "Global hooks array is not an array!\n" );
+               }
+
+               if ( empty( Hooks::$handlers[$name] ) ) {
+                       $hooks = $wgHooks[$name];
+               } elseif ( empty( $wgHooks[$name] ) ) {
+                       $hooks = Hooks::$handlers[$name];
+               } else {
+                       // so they are both not empty...
+                       $hooks = array_merge( Hooks::$handlers[$name], $wgHooks[$name] );
+               }
+
+               if ( !is_array( $hooks ) ) {
+                       throw new MWException( "Hooks array for event '$name' is not an array!\n" );
+               }
+
+               return $hooks;
        }
 
        /**
         * Call hook functions defined in Hooks::register
         *
-        * Because programmers assign to $wgHooks, we need to be very
-        * careful about its contents. So, there's a lot more error-checking
-        * in here than would normally be necessary.
-        *
         * @param $event String: event name
-        * @param $args Array: parameters passed to hook functions
+        * @param $args  Array: parameters passed to hook functions
+        *
         * @return Boolean True if no handler aborted the hook
         */
        public static function run( $event, $args = array() ) {
                global $wgHooks;
 
                // Return quickly in the most common case
-               if ( !isset( self::$handlers[$event] ) && !isset( $wgHooks[$event] ) ) {
+               if ( empty( self::$handlers[$event] ) && empty( $wgHooks[$event] ) ) {
                        return true;
                }
 
-               if ( !is_array( self::$handlers ) ) {
-                       throw new MWException( "Local hooks array is not an array!\n" );
-               }
-
-               if ( !is_array( $wgHooks ) ) {
-                       throw new MWException( "Global hooks array is not an array!\n" );
-               }
-
-               $new_handlers = (array) self::$handlers;
-               $old_handlers = (array) $wgHooks;
-
-               $hook_array = array_merge( $new_handlers, $old_handlers );
+               $hooks = self::getHandlers( $event );
 
-               if ( !is_array( $hook_array[$event] ) ) {
-                       throw new MWException( "Hooks array for event '$event' is not an array!\n" );
-               }
-
-               foreach ( $hook_array[$event] as $index => $hook ) {
+               foreach ( $hooks as $hook ) {
                        $object = null;
                        $method = null;
                        $func = null;
@@ -131,7 +168,7 @@ class Hooks {
                                if ( count( $hook ) < 1 ) {
                                        throw new MWException( 'Empty array in hooks for ' . $event . "\n" );
                                } elseif ( is_object( $hook[0] ) ) {
-                                       $object = $hook_array[$event][$index][0];
+                                       $object = $hook[0];
                                        if ( $object instanceof Closure ) {
                                                $closure = true;
                                                if ( count( $hook ) > 1 ) {
@@ -161,7 +198,7 @@ class Hooks {
                        } elseif ( is_string( $hook ) ) { # functions look like strings, too
                                $func = $hook;
                        } elseif ( is_object( $hook ) ) {
-                               $object = $hook_array[$event][$index];
+                               $object = $hook;
                                if ( $object instanceof Closure ) {
                                        $closure = true;
                                } else {
@@ -259,8 +296,11 @@ class Hooks {
        /**
         * This REALLY should be protected... but it's public for compatibility
         *
+        * @since 1.18
+        *
         * @param $errno int Unused
         * @param $errstr String: error message
+        * @throws MWHookException
         * @return Boolean: false
         */
        public static function hookErrorHandler( $errno, $errstr ) {
index dfd081f..2ab6069 100644 (file)
@@ -48,7 +48,7 @@
  * @since 1.16
  */
 class Html {
-       # List of void elements from HTML5, section 8.1.2 as of 2011-08-12
+       // List of void elements from HTML5, section 8.1.2 as of 2011-08-12
        private static $voidElements = array(
                'area',
                'base',
@@ -68,8 +68,8 @@ class Html {
                'wbr',
        );
 
-       # Boolean attributes, which may have the value omitted entirely.  Manually
-       # collected from the HTML5 spec as of 2011-08-12.
+       // Boolean attributes, which may have the value omitted entirely.  Manually
+       // collected from the HTML5 spec as of 2011-08-12.
        private static $boolAttribs = array(
                'async',
                'autofocus',
@@ -97,7 +97,7 @@ class Html {
                'selected',
                'truespeed',
                'typemustmatch',
-               # HTML5 Microdata
+               // HTML5 Microdata
                'itemscope',
        );
 
@@ -139,7 +139,7 @@ class Html {
                $start = self::openElement( $element, $attribs );
                if ( in_array( $element, self::$voidElements ) ) {
                        if ( $wgWellFormedXml ) {
-                               # Silly XML.
+                               // Silly XML.
                                return substr( $start, 0, -1 ) . ' />';
                        }
                        return $start;
@@ -160,8 +160,8 @@ class Html {
         */
        public static function element( $element, $attribs = array(), $contents = '' ) {
                return self::rawElement( $element, $attribs, strtr( $contents, array(
-                       # There's no point in escaping quotes, >, etc. in the contents of
-                       # elements.
+                       // There's no point in escaping quotes, >, etc. in the contents of
+                       // elements.
                        '&' => '&amp;',
                        '<' => '&lt;'
                ) ) );
@@ -179,19 +179,19 @@ class Html {
        public static function openElement( $element, $attribs = array() ) {
                global $wgHtml5, $wgWellFormedXml;
                $attribs = (array)$attribs;
-               # This is not required in HTML5, but let's do it anyway, for
-               # consistency and better compression.
+               // This is not required in HTML5, but let's do it anyway, for
+               // consistency and better compression.
                $element = strtolower( $element );
 
-               # In text/html, initial <html> and <head> tags can be omitted under
-               # pretty much any sane circumstances, if they have no attributes.  See:
-               # <http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags>
+               // In text/html, initial <html> and <head> tags can be omitted under
+               // pretty much any sane circumstances, if they have no attributes.  See:
+               // <http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags>
                if ( !$wgWellFormedXml && !$attribs
                && in_array( $element, array( 'html', 'head' ) ) ) {
                        return '';
                }
 
-               # Remove invalid input types
+               // Remove invalid input types
                if ( $element == 'input' ) {
                        $validTypes = array(
                                'hidden',
@@ -206,7 +206,7 @@ class Html {
                                'button',
                        );
 
-                       # Allow more input types in HTML5 mode
+                       // Allow more input types in HTML5 mode
                        if( $wgHtml5 ) {
                                $validTypes = array_merge( $validTypes, array(
                                        'datetime',
@@ -234,6 +234,13 @@ class Html {
                        unset( $attribs['maxlength'] );
                }
 
+               // According to standard the default type for <button> elements is "submit".
+               // Depending on compatibility mode IE might use "button", instead.
+               // We enforce the standard "submit".
+               if ( $element == 'button' && !isset( $attribs['type'] ) ) {
+                       $attribs['type'] = 'submit';
+               }
+
                return "<$element" . self::expandAttributes(
                        self::dropDefaults( $element, $attribs ) ) . '>';
        }
@@ -251,8 +258,8 @@ class Html {
 
                $element = strtolower( $element );
 
-               # Reference:
-               # http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
+               // Reference:
+               // http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#optional-tags
                if ( !$wgWellFormedXml && in_array( $element, array(
                        'html',
                        'head',
@@ -287,21 +294,20 @@ class Html {
         * @return array An array of attributes functionally identical to $attribs
         */
        private static function dropDefaults( $element, $attribs ) {
-               # Don't bother doing anything if we aren't outputting HTML5; it's too
-               # much of a pain to maintain two sets of defaults.
+               // Don't bother doing anything if we aren't outputting HTML5; it's too
+               // much of a pain to maintain two sets of defaults.
                global $wgHtml5;
                if ( !$wgHtml5 ) {
                        return $attribs;
                }
 
-               # Whenever altering this array, please provide a covering test case
-               # in HtmlTest::provideElementsWithAttributesHavingDefaultValues
+               // Whenever altering this array, please provide a covering test case
+               // in HtmlTest::provideElementsWithAttributesHavingDefaultValues
                static $attribDefaults = array(
                        'area' => array( 'shape' => 'rect' ),
                        'button' => array(
                                'formaction' => 'GET',
                                'formenctype' => 'application/x-www-form-urlencoded',
-                               'type' => 'submit',
                        ),
                        'canvas' => array(
                                'height' => '150',
@@ -320,8 +326,8 @@ class Html {
                        'keygen' => array( 'keytype' => 'rsa' ),
                        'link' => array( 'media' => 'all' ),
                        'menu' => array( 'type' => 'list' ),
-                       # Note: the use of text/javascript here instead of other JavaScript
-                       # MIME types follows the HTML5 spec.
+                       // Note: the use of text/javascript here instead of other JavaScript
+                       // MIME types follows the HTML5 spec.
                        'script' => array( 'type' => 'text/javascript' ),
                        'style' => array(
                                'media' => 'all',
@@ -340,7 +346,7 @@ class Html {
                                $value = strval( $value );
                        }
 
-                       # Simple checks using $attribDefaults
+                       // Simple checks using $attribDefaults
                        if ( isset( $attribDefaults[$element][$lcattrib] ) &&
                        $attribDefaults[$element][$lcattrib] == $value ) {
                                unset( $attribs[$attrib] );
@@ -351,7 +357,7 @@ class Html {
                        }
                }
 
-               # More subtle checks
+               // More subtle checks
                if ( $element === 'link' && isset( $attribs['type'] )
                && strval( $attribs['type'] ) == 'text/css' ) {
                        unset( $attribs['type'] );
@@ -383,12 +389,12 @@ class Html {
                        if ( in_array( 'multiple', $attribs )
                                || ( isset( $attribs['multiple'] ) && $attribs['multiple'] !== false )
                        ) {
-                               # A multi-select
+                               // A multi-select
                                if ( strval( $attribs['size'] ) == '4' ) {
                                        unset( $attribs['size'] );
                                }
                        } else {
-                               # Single select
+                               // Single select
                                if ( strval( $attribs['size'] ) == '1' ) {
                                        unset( $attribs['size'] );
                                }
@@ -447,29 +453,29 @@ class Html {
                                continue;
                        }
 
-                       # For boolean attributes, support array( 'foo' ) instead of
-                       # requiring array( 'foo' => 'meaningless' ).
+                       // For boolean attributes, support array( 'foo' ) instead of
+                       // requiring array( 'foo' => 'meaningless' ).
                        if ( is_int( $key )
                        && in_array( strtolower( $value ), self::$boolAttribs ) ) {
                                $key = $value;
                        }
 
-                       # Not technically required in HTML5, but required in XHTML 1.0,
-                       # and we'd like consistency and better compression anyway.
+                       // Not technically required in HTML5, but required in XHTML 1.0,
+                       // and we'd like consistency and better compression anyway.
                        $key = strtolower( $key );
 
-                       # Here we're blacklisting some HTML5-only attributes...
+                       // Here we're blacklisting some HTML5-only attributes...
                        if ( !$wgHtml5 && in_array( $key, self::$HTMLFiveOnlyAttribs )
                         ) {
                                continue;
                        }
 
-                       # Bug 23769: Blacklist all form validation attributes for now.  Current
-                       # (June 2010) WebKit has no UI, so the form just refuses to submit
-                       # without telling the user why, which is much worse than failing
-                       # server-side validation.  Opera is the only other implementation at
-                       # this time, and has ugly UI, so just kill the feature entirely until
-                       # we have at least one good implementation.
+                       // Bug 23769: Blacklist all form validation attributes for now.  Current
+                       // (June 2010) WebKit has no UI, so the form just refuses to submit
+                       // without telling the user why, which is much worse than failing
+                       // server-side validation.  Opera is the only other implementation at
+                       // this time, and has ugly UI, so just kill the feature entirely until
+                       // we have at least one good implementation.
                        if ( in_array( $key, array( 'max', 'min', 'pattern', 'required', 'step' ) ) ) {
                                continue;
                        }
@@ -480,12 +486,12 @@ class Html {
                                'class', // html4, html5
                                'accesskey', // as of html5, multiple space-separated values allowed
                                // html4-spec doesn't document rel= as space-separated
-                               // but has been used like that and is now documented as such 
+                               // but has been used like that and is now documented as such
                                // in the html5-spec.
                                'rel',
                        );
 
-                       # Specific features for attributes that allow a list of space-separated values
+                       // Specific features for attributes that allow a list of space-separated values
                        if ( in_array( $key, $spaceSeparatedListAttributes ) ) {
                                // Apply some normalization and remove duplicates
 
@@ -493,7 +499,6 @@ class Html {
                                // values. Implode/explode to get those into the main array as well.
                                if ( is_array( $value ) ) {
                                        // If input wasn't an array, we can skip this step
-                                       
                                        $newValue = array();
                                        foreach ( $value as $k => $v ) {
                                                if ( is_string( $v ) ) {
@@ -523,14 +528,14 @@ class Html {
                                $value = implode( ' ', array_unique( $value ) );
                        }
 
-                       # See the "Attributes" section in the HTML syntax part of HTML5,
-                       # 9.1.2.3 as of 2009-08-10.  Most attributes can have quotation
-                       # marks omitted, but not all.  (Although a literal " is not
-                       # permitted, we don't check for that, since it will be escaped
-                       # anyway.)
+                       // See the "Attributes" section in the HTML syntax part of HTML5,
+                       // 9.1.2.3 as of 2009-08-10.  Most attributes can have quotation
+                       // marks omitted, but not all.  (Although a literal " is not
+                       // permitted, we don't check for that, since it will be escaped
+                       // anyway.)
                        #
-                       # See also research done on further characters that need to be
-                       # escaped: http://code.google.com/p/html5lib/issues/detail?id=93
+                       // See also research done on further characters that need to be
+                       // escaped: http://code.google.com/p/html5lib/issues/detail?id=93
                        $badChars = "\\x00- '=<>`/\x{00a0}\x{1680}\x{180e}\x{180F}\x{2000}\x{2001}"
                                . "\x{2002}\x{2003}\x{2004}\x{2005}\x{2006}\x{2007}\x{2008}\x{2009}"
                                . "\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}";
@@ -542,9 +547,9 @@ class Html {
                        }
 
                        if ( in_array( $key, self::$boolAttribs ) ) {
-                               # In XHTML 1.0 Transitional, the value needs to be equal to the
-                               # key.  In HTML5, we can leave the value empty instead.  If we
-                               # don't need well-formed XML, we can omit the = entirely.
+                               // In XHTML 1.0 Transitional, the value needs to be equal to the
+                               // key.  In HTML5, we can leave the value empty instead.  If we
+                               // don't need well-formed XML, we can omit the = entirely.
                                if ( !$wgWellFormedXml ) {
                                        $ret .= " $key";
                                } elseif ( $wgHtml5 ) {
@@ -553,16 +558,16 @@ class Html {
                                        $ret .= " $key=\"$key\"";
                                }
                        } else {
-                               # Apparently we need to entity-encode \n, \r, \t, although the
-                               # spec doesn't mention that.  Since we're doing strtr() anyway,
-                               # and we don't need <> escaped here, we may as well not call
-                               # htmlspecialchars().
-                               # @todo FIXME: Verify that we actually need to
-                               # escape \n\r\t here, and explain why, exactly.
+                               // Apparently we need to entity-encode \n, \r, \t, although the
+                               // spec doesn't mention that.  Since we're doing strtr() anyway,
+                               // and we don't need <> escaped here, we may as well not call
+                               // htmlspecialchars().
+                               // @todo FIXME: Verify that we actually need to
+                               // escape \n\r\t here, and explain why, exactly.
                                #
-                               # We could call Sanitizer::encodeAttribute() for this, but we
-                               # don't because we're stubborn and like our marginal savings on
-                               # byte size from not having to encode unnecessary quotes.
+                               // We could call Sanitizer::encodeAttribute() for this, but we
+                               // don't because we're stubborn and like our marginal savings on
+                               // byte size from not having to encode unnecessary quotes.
                                $map = array(
                                        '&' => '&amp;',
                                        '"' => '&quot;',
@@ -571,12 +576,11 @@ class Html {
                                        "\t" => '&#9;'
                                );
                                if ( $wgWellFormedXml ) {
-                                       # This is allowed per spec: <http://www.w3.org/TR/xml/#NT-AttValue>
-                                       # But reportedly it breaks some XML tools?
-                                       # @todo FIXME: Is this really true?
+                                       // This is allowed per spec: <http://www.w3.org/TR/xml/#NT-AttValue>
+                                       // But reportedly it breaks some XML tools?
+                                       // @todo FIXME: Is this really true?
                                        $map['<'] = '&lt;';
                                }
-                               
                                $ret .= " $key=$quote" . strtr( $value, $map ) . $quote;
                        }
                }
@@ -753,7 +757,7 @@ class Html {
         * - name: [optional], default: 'namespace'
         * @return string HTML code to select a namespace.
         */
-       public static function namespaceSelector( Array $params = array(), Array $selectAttribs = array() ) {
+       public static function namespaceSelector( array $params = array(), array $selectAttribs = array() ) {
                global $wgContLang;
 
                ksort( $selectAttribs );
@@ -796,10 +800,12 @@ class Html {
                        if ( $nsId < NS_MAIN || in_array( $nsId, $params['exclude'] ) ) {
                                continue;
                        }
-                       if ( $nsId === 0 ) {
+                       if ( $nsId === NS_MAIN ) {
                                // 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 = wfMessage( 'blanknamespace' )->text();
+                       } elseif ( is_int( $nsId ) ) {
+                               $nsName = $wgContLang->convertNamespace( $nsId );
                        }
                        $optionsHtml[] = Html::element(
                                'option', array(
@@ -810,6 +816,14 @@ class Html {
                        );
                }
 
+               if ( !array_key_exists( 'id', $selectAttribs ) ) {
+                       $selectAttribs['id'] = 'namespace';
+               }
+
+               if ( !array_key_exists( 'name', $selectAttribs ) ) {
+                       $selectAttribs['name'] = 'namespace';
+               }
+
                $ret = '';
                if ( isset( $params['label'] ) ) {
                        $ret .= Html::element(
@@ -932,4 +946,22 @@ class Html {
 
                return $s;
        }
+
+       /**
+        * Generate a srcset attribute value from an array mapping pixel densities
+        * to URLs. Note that srcset supports width and height values as well, which
+        * are not used here.
+        *
+        * @param array $urls
+        * @return string
+        */
+       static function srcSet( $urls ) {
+               $candidates = array();
+               foreach( $urls as $density => $url ) {
+                       // Image candidate syntax per current whatwg live spec, 2012-09-23:
+                       // http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content-1.html#attr-img-srcset
+                       $candidates[] = "{$url} {$density}x";
+               }
+               return implode( ", ", $candidates );
+       }
 }
index 8453e62..ab27a74 100644 (file)
@@ -45,7 +45,9 @@ class Http {
         *                          Otherwise it will use $wgHTTPProxy (if set)
         *                          Otherwise it will use the environment variable "http_proxy" (if set)
         *    - noProxy             Don't use any proxy at all. Takes precedence over proxy value(s).
-        *    - sslVerifyHost       (curl only) Verify hostname against certificate
+        *    - sslVerifyHost       (curl only) Set to 2 to verify hostname against certificate
+        *                                  Setting to 1 (or true) will NOT verify the host name. It will
+        *                                  only check its existence. Setting to 0 (or false) disables entirely.
         *    - sslVerifyCert       (curl only) Verify SSL certificate
         *    - caInfo              (curl only) Provide CA information
         *    - maxRedirects        Maximum number of redirects to follow (defaults to 5)
@@ -185,7 +187,15 @@ class MWHttpRequest {
        protected $postData = null;
        protected $proxy = null;
        protected $noProxy = false;
-       protected $sslVerifyHost = true;
+       /**
+        * Parameter passed to Curl that specifies whether
+        * to validate SSL certificates.
+        *
+        * Setting to 0 disables entirely. Setting to 1 checks
+        * the existence of a CN, but doesn't verify it. Setting
+        * to 2 (the default) actually verifies the host.
+        */
+       protected $sslVerifyHost = 2;
        protected $sslVerifyCert = true;
        protected $caInfo = null;
        protected $method = "GET";
@@ -265,6 +275,7 @@ class MWHttpRequest {
         * Generate a new request object
         * @param $url String: url to use
         * @param $options Array: (optional) extra params to pass (see Http::request())
+        * @throws MWException
         * @return CurlHttpRequest|PhpHttpRequest
         * @see MWHttpRequest::__construct
         */
@@ -393,6 +404,7 @@ class MWHttpRequest {
         * will be aborted.
         *
         * @param $callback Callback
+        * @throws MWException
         */
        public function setCallback( $callback ) {
                if ( !is_callable( $callback ) ) {
@@ -579,8 +591,8 @@ class MWHttpRequest {
        }
 
        /**
-        * Sets a cookie.  Used before a request to set up any individual
-        * cookies.      Used internally after a request to parse the
+        * Sets a cookie. Used before a request to set up any individual
+        * cookies. Used internally after a request to parse the
         * Set-Cookie headers.
         * @see Cookie::set
         * @param $name
index 10c707e..1b40f4b 100644 (file)
@@ -18,7 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Antoine Musso <hashar at free dot fr>, Aaron Schulz
+ * @author Antoine Musso "<hashar at free dot fr>", Aaron Schulz
  */
 
 // Some regex definition to "play" with IP address and IP address blocks
index 6f1b1a1..316e1c9 100644 (file)
@@ -157,7 +157,9 @@ class ImagePage extends Article {
                        $out->addHTML( Xml::openElement( 'div', array( 'id' => 'mw-imagepage-content',
                                'lang' => $pageLang->getHtmlCode(), 'dir' => $pageLang->getDir(),
                                'class' => 'mw-content-'.$pageLang->getDir() ) ) );
+
                        parent::view();
+
                        $out->addHTML( Xml::closeElement( 'div' ) );
                } else {
                        # Just need to set the right headers
@@ -272,18 +274,18 @@ class ImagePage extends Article {
        }
 
        /**
-        * Overloading Article's getContent method.
+        * Overloading Article's getContentObject method.
         *
         * Omit noarticletext if sharedupload; text will be fetched from the
         * shared upload server if possible.
         * @return string
         */
-       public function getContent() {
+       public function getContentObject() {
                $this->loadFile();
                if ( $this->mPage->getFile() && !$this->mPage->getFile()->isLocal() && 0 == $this->getID() ) {
-                       return '';
+                       return null;
                }
-               return parent::getContent();
+               return parent::getContentObject();
        }
 
        protected function openShowImage() {
index 11f3795..2017466 100644 (file)
@@ -429,6 +429,7 @@ class WikiImporter {
 
        /**
         * Primary entry point
+        * @throws MWException
         * @return bool
         */
        public function doImport() {
@@ -611,7 +612,7 @@ class WikiImporter {
                $this->debug( "Enter revision handler" );
                $revisionInfo = array();
 
-               $normalFields = array( 'id', 'timestamp', 'comment', 'minor', 'text' );
+               $normalFields = array( 'id', 'timestamp', 'comment', 'minor', 'model', 'format', 'text' );
 
                $skip = false;
 
@@ -656,6 +657,12 @@ class WikiImporter {
                if ( isset( $revisionInfo['text'] ) ) {
                        $revision->setText( $revisionInfo['text'] );
                }
+               if ( isset( $revisionInfo['model'] ) ) {
+                       $revision->setModel( $revisionInfo['model'] );
+               }
+               if ( isset( $revisionInfo['format'] ) ) {
+                       $revision->setFormat( $revisionInfo['format'] );
+               }
                $revision->setTitle( $pageInfo['_title'] );
 
                if ( isset( $revisionInfo['timestamp'] ) ) {
@@ -1008,7 +1015,10 @@ class WikiRevision {
        var $timestamp = "20010115000000";
        var $user = 0;
        var $user_text = "";
+       var $model = null;
+       var $format = null;
        var $text = "";
+       var $content = null;
        var $comment = "";
        var $minor = false;
        var $type = "";
@@ -1064,6 +1074,20 @@ class WikiRevision {
                $this->user_text = $ip;
        }
 
+       /**
+        * @param $model
+        */
+       function setModel( $model ) {
+               $this->model = $model;
+       }
+
+       /**
+        * @param $format
+        */
+       function setFormat( $format ) {
+               $this->format = $format;
+       }
+
        /**
         * @param $text
         */
@@ -1187,11 +1211,54 @@ class WikiRevision {
 
        /**
         * @return string
+        *
+        * @deprecated Since 1.21, use getContent() instead.
         */
        function getText() {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
                return $this->text;
        }
 
+       /**
+        * @return Content
+        */
+       function getContent() {
+               if ( is_null( $this->content ) ) {
+                       $this->content =
+                               ContentHandler::makeContent(
+                                       $this->text,
+                                       $this->getTitle(),
+                                       $this->getModel(),
+                                       $this->getFormat()
+                               );
+               }
+
+               return $this->content;
+       }
+
+       /**
+        * @return String
+        */
+       function getModel() {
+               if ( is_null( $this->model ) ) {
+                       $this->model = $this->getTitle()->getContentModel();
+               }
+
+               return $this->model;
+       }
+
+       /**
+        * @return String
+        */
+       function getFormat() {
+               if ( is_null( $this->model ) ) {
+                       $this->format = ContentHandler::getForTitle( $this->getTitle() )->getDefaultFormat();
+               }
+
+               return $this->format;
+       }
+
        /**
         * @return string
         */
@@ -1330,8 +1397,11 @@ class WikiRevision {
                # @todo FIXME: Use original rev_id optionally (better for backups)
                # Insert the row
                $revision = new Revision( array(
+                       'title'      => $this->title,
                        'page'       => $pageId,
-                       'text'       => $this->getText(),
+                       'content_model'  => $this->getModel(),
+                       'content_format' => $this->getFormat(),
+                       'text'       => $this->getContent()->serialize( $this->getFormat() ), //XXX: just set 'content' => $this->getContent()?
                        'comment'    => $this->getComment(),
                        'user'       => $userId,
                        'user_text'  => $userText,
index ba504a9..4d2229f 100644 (file)
@@ -117,7 +117,7 @@ class Licenses extends HTMLFormField {
         * @param $depth int
         */
        protected function makeHtml( $tagset, $depth = 0 ) {
-               foreach ( $tagset as $key => $val )
+               foreach ( $tagset as $key => $val ) {
                        if ( is_array( $val ) ) {
                                $this->html .= $this->outputOption(
                                        $key, '',
@@ -135,6 +135,7 @@ class Licenses extends HTMLFormField {
                                        $depth
                                );
                        }
+               }
        }
 
        /**
@@ -148,8 +149,10 @@ class Licenses extends HTMLFormField {
                $msgObj = $this->msg( $message );
                $text = $msgObj->exists() ? $msgObj->text() : $message;
                $attribs['value'] = $value;
-               if ( $value === $this->selected )
+               if ( $value === $this->selected ) {
                        $attribs['selected'] = 'selected';
+               }
+
                $val = str_repeat( /* &nbsp */ "\xc2\xa0", $depth * 2 ) . $text;
                return str_repeat( "\t", $depth ) . Xml::element( 'option', $attribs, $val ) . "\n";
        }
index 214f495..c2f6b1e 100644 (file)
@@ -23,7 +23,7 @@
 
 /**
  * Some functions to help implement an external link filter for spam control.
- * 
+ *
  * @todo implement the filter. Currently these are just some functions to help
  * maintenance/cleanupSpam.php remove links to a single specified domain. The
  * next thing is to implement functions for checking a given page against a big
 class LinkFilter {
 
        /**
-        * Check whether $text contains a link to $filterEntry
+        * Check whether $content contains a link to $filterEntry
         *
-        * @param $text String: text to check
+        * @param $content Content: content to check
         * @param $filterEntry String: domainparts, see makeRegex() for more details
         * @return Integer: 0 if no match or 1 if there's at least one match
         */
-       static function matchEntry( $text, $filterEntry ) {
+       static function matchEntry( Content $content, $filterEntry ) {
+               if ( !( $content instanceof TextContent ) ) {
+                       //TODO: handle other types of content too.
+                       //      Maybe create ContentHandler::matchFilter( LinkFilter ).
+                       //      Think about a common base class for LinkFilter and MagicWord.
+                       return 0;
+               }
+
+               $text = $content->getNativeData();
+
                $regex = LinkFilter::makeRegex( $filterEntry );
                return preg_match( $regex, $text );
        }
@@ -110,17 +119,17 @@ class LinkFilter {
                // Reverse the labels in the hostname, convert to lower case
                // For emails reverse domainpart only
                if ( $prot == 'mailto:' && strpos($host, '@') ) {
-                       // complete email adress 
+                       // complete email adress
                        $mailparts = explode( '@', $host );
                        $domainpart = strtolower( implode( '.', array_reverse( explode( '.', $mailparts[1] ) ) ) );
                        $host = $domainpart . '@' . $mailparts[0];
                        $like = array( "$prot$host", $db->anyString() );
                } elseif ( $prot == 'mailto:' ) {
                        // domainpart of email adress only. do not add '.'
-                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );   
-                       $like = array( "$prot$host", $db->anyString() );                        
+                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
+                       $like = array( "$prot$host", $db->anyString() );
                } else {
-                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );   
+                       $host = strtolower( implode( '.', array_reverse( explode( '.', $host ) ) ) );
                        if ( substr( $host, -1, 1 ) !== '.' ) {
                                $host .= '.';
                        }
index 8e31a1c..408538b 100644 (file)
@@ -188,6 +188,8 @@ class Linker {
         *       cons.
         *     'forcearticlepath': Use the article path always, even with a querystring.
         *       Has compatibility issues on some setups, so avoid wherever possible.
+        *     'http': Force a full URL with http:// as the scheme.
+        *     'https': Force a full URL with https:// as the scheme.
         * @return string HTML <a> attribute
         */
        public static function link(
@@ -294,7 +296,16 @@ class Linker {
                        $query['action'] = 'edit';
                        $query['redlink'] = '1';
                }
-               $ret = $target->getLinkURL( $query );
+
+               if ( in_array( 'http', $options ) ) {
+                       $proto = PROTO_HTTP;
+               } elseif ( in_array( 'https', $options ) ) {
+                       $proto = PROTO_HTTPS;
+               } else {
+                       $proto = PROTO_RELATIVE;
+               }
+
+               $ret = $target->getLinkURL( $query, false, $proto );
                wfProfileOut( __METHOD__ );
                return $ret;
        }
@@ -437,6 +448,7 @@ class Linker {
         * @param $context IContextSource context to use to get the messages
         * @param $namespace int Namespace number
         * @param $title string Text of the title, without the namespace part
+        * @return string
         */
        public static function getInvalidTitleDescription( IContextSource $context, $namespace, $title ) {
                global $wgContLang;
@@ -664,6 +676,7 @@ class Linker {
                if ( !$thumb ) {
                        $s = self::makeBrokenImageLinkObj( $title, $fp['title'], '', '', '', $time == true );
                } else {
+                       self::processResponsiveImages( $file, $thumb, $hp );
                        $params = array(
                                'alt' => $fp['alt'],
                                'title' => $fp['title'],
@@ -784,6 +797,7 @@ class Linker {
                        $hp['width'] = isset( $fp['upright'] ) ? 130 : 180;
                }
                $thumb = false;
+               $noscale = false;
 
                if ( !$exists ) {
                        $outerWidth = $hp['width'] + 2;
@@ -802,6 +816,7 @@ class Linker {
                        } elseif ( isset( $fp['framed'] ) ) {
                                // Use image dimensions, don't scale
                                $thumb = $file->getUnscaledThumb( $hp );
+                               $noscale = true;
                        } else {
                                # Do not present an image bigger than the source, for bitmap-style images
                                # This is a hack to maintain compatibility with arbitrary pre-1.10 behaviour
@@ -835,6 +850,9 @@ class Linker {
                        $s .= wfMessage( 'thumbnail_error', '' )->escaped();
                        $zoomIcon = '';
                } else {
+                       if ( !$noscale ) {
+                               self::processResponsiveImages( $file, $thumb, $hp );
+                       }
                        $params = array(
                                'alt' => $fp['alt'],
                                'title' => $fp['title'],
@@ -861,6 +879,37 @@ class Linker {
                return str_replace( "\n", ' ', $s );
        }
 
+       /**
+        * Process responsive images: add 1.5x and 2x subimages to the thumbnail, where
+        * applicable.
+        *
+        * @param File $file
+        * @param MediaOutput $thumb
+        * @param array $hp image parameters
+        */
+       protected static function processResponsiveImages( $file, $thumb, $hp ) {
+               global $wgResponsiveImages;
+               if ( $wgResponsiveImages ) {
+                       $hp15 = $hp;
+                       $hp15['width'] = round( $hp['width'] * 1.5 );
+                       $hp20 = $hp;
+                       $hp20['width'] = $hp['width'] * 2;
+                       if ( isset( $hp['height'] ) ) {
+                               $hp15['height'] = round( $hp['height'] * 1.5 );
+                               $hp20['height'] = $hp['height'] * 2;
+                       }
+
+                       $thumb15 = $file->transform( $hp15 );
+                       $thumb20 = $file->transform( $hp20 );
+                       if ( $thumb15->url !== $thumb->url ) {
+                               $thumb->responsiveUrls['1.5'] = $thumb15->url;
+                       }
+                       if ( $thumb20->url !== $thumb->url ) {
+                               $thumb->responsiveUrls['2'] = $thumb20->url;
+                       }
+               }
+       }
+
        /**
         * Make a "broken" link to an image
         *
@@ -1026,6 +1075,9 @@ class Linker {
        public static function userLink( $userId, $userName, $altUserName = false ) {
                if ( $userId == 0 ) {
                        $page = SpecialPage::getTitleFor( 'Contributions', $userName );
+                       if ( $altUserName === false ) {
+                               $altUserName = IP::prettifyIP( $userName );
+                       }
                } else {
                        $page = Title::makeTitle( NS_USER, $userName );
                }
@@ -1064,8 +1116,11 @@ class Linker {
                        // check if the user has an edit
                        $attribs = array();
                        if ( $redContribsWhenNoEdits ) {
-                               $count = !is_null( $edits ) ? $edits : User::edits( $userId );
-                               if ( $count == 0 ) {
+                               if ( intval( $edits ) === 0 && $edits !== 0 ) {
+                                       $user = User::newFromId( $userId );
+                                       $edits = $user->getEditCount();
+                               }
+                               if ( $edits === 0 ) {
                                        $attribs['class'] = 'new';
                                }
                        }
@@ -1321,7 +1376,18 @@ class Linker {
                self::$commentContextTitle = $title;
                self::$commentLocal = $local;
                $html = preg_replace_callback(
-                       '/\[\[:?(.*?)(\|(.*?))*\]\]([^[]*)/',
+                       '/
+                               \[\[
+                               :? # ignore optional leading colon
+                               ([^\]|]+) # 1. link target; page names cannot include ] or |
+                               (?:\|
+                                       # 2. a pipe-separated substring; only the last is captured
+                                       # Stop matching at | and ]] without relying on backtracking.
+                                       ((?:]?[^\]|])*+)
+                               )*
+                               \]\]
+                               ([^[]*) # 3. link trail (the text up until the next link)
+                       /x',
                        array( 'Linker', 'formatLinksInCommentCallback' ),
                        $comment );
                self::$commentContextTitle = null;
@@ -1347,8 +1413,8 @@ class Linker {
                }
 
                # Handle link renaming [[foo|text]] will show link as "text"
-               if ( $match[3] != "" ) {
-                       $text = $match[3];
+               if ( $match[2] != "" ) {
+                       $text = $match[2];
                } else {
                        $text = $match[1];
                }
@@ -1363,7 +1429,7 @@ class Linker {
                        }
                } else {
                        # Other kind of link
-                       if ( preg_match( $wgContLang->linkTrail(), $match[4], $submatch ) ) {
+                       if ( preg_match( $wgContLang->linkTrail(), $match[3], $submatch ) ) {
                                $trail = $submatch[1];
                        } else {
                                $trail = "";
@@ -1712,7 +1778,7 @@ class Linker {
         */
        public static function buildRollbackLink( $rev, IContextSource $context = null ) {
                global $wgShowRollbackEditCount, $wgMiserMode;
-               
+
                // To config which pages are effected by miser mode
                $disableRollbackEditCountSpecialPage = array( 'Recentchanges', 'Watchlist' );
 
@@ -1847,7 +1913,11 @@ class Linker {
                                                array( 'action' => 'edit' )
                                        );
                                }
-                               $outText .= '<li>' . self::link( $titleObj ) . ' (' . $editLink . ') ' . $protected . '</li>';
+                               $outText .= '<li>' . self::link( $titleObj )
+                                       . wfMessage( 'word-separator' )->escaped()
+                                       . wfMessage( 'parentheses' )->rawParams( $editLink )->escaped()
+                                       . wfMessage( 'word-separator' )->escaped()
+                                       . $protected . '</li>';
                        }
                        $outText .= '</ul>';
                }
@@ -2069,7 +2139,7 @@ class Linker {
         */
        static function makeBrokenLink( $title, $text = '', $query = '', $trail = '' ) {
                wfDeprecated( __METHOD__, '1.16' );
-               
+
                $nt = Title::newFromText( $title );
                if ( $nt instanceof Title ) {
                        return self::makeBrokenLinkObj( $nt, $text, $query, $trail );
@@ -2080,7 +2150,7 @@ class Linker {
        }
 
        /**
-        * @deprecated since 1.16 Use link()
+        * @deprecated since 1.16 Use link(); warnings since 1.21
         *
         * Make a link for a title which may or may not be in the database. If you need to
         * call this lots of times, pre-fill the link cache with a LinkBatch, otherwise each
@@ -2097,8 +2167,8 @@ class Linker {
         * @return string
         */
        static function makeLinkObj( $nt, $text = '', $query = '', $trail = '', $prefix = '' ) {
-               # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
-               
+               wfDeprecated( __METHOD__, '1.21' );
+
                wfProfileIn( __METHOD__ );
                $query = wfCgiToArray( $query );
                list( $inside, $trail ) = self::splitTrail( $trail );
@@ -2113,7 +2183,7 @@ class Linker {
        }
 
        /**
-        * @deprecated since 1.16 Use link()
+        * @deprecated since 1.16 Use link(); warnings since 1.21
         *
         * Make a link for a title which definitely exists. This is faster than makeLinkObj because
         * it doesn't have to do a database query. It's also valid for interwiki titles and special
@@ -2131,8 +2201,8 @@ class Linker {
        static function makeKnownLinkObj(
                $title, $text = '', $query = '', $trail = '', $prefix = '' , $aprops = '', $style = ''
        ) {
-               # wfDeprecated( __METHOD__, '1.16' ); // See r105985 and it's revert. Somewhere still used.
-               
+               wfDeprecated( __METHOD__, '1.21' );
+
                wfProfileIn( __METHOD__ );
 
                if ( $text == '' ) {
@@ -2168,7 +2238,7 @@ class Linker {
         */
        static function makeBrokenLinkObj( $title, $text = '', $query = '', $trail = '', $prefix = '' ) {
                wfDeprecated( __METHOD__, '1.16' );
-               
+
                wfProfileIn( __METHOD__ );
 
                list( $inside, $trail ) = self::splitTrail( $trail );
@@ -2200,7 +2270,7 @@ class Linker {
         */
        static function makeColouredLinkObj( $nt, $colour, $text = '', $query = '', $trail = '', $prefix = '' ) {
                wfDeprecated( __METHOD__, '1.16' );
-               
+
                if ( $colour != '' ) {
                        $style = self::getInternalLinkAttributesObj( $nt, $text, $colour );
                } else {
index 87db4d6..a7a903e 100644 (file)
@@ -49,6 +49,7 @@ class LinksUpdate extends SqlDataUpdate {
         * @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?
+        * @throws MWException
         */
        function __construct( $title, $parserOutput, $recursive = true ) {
                parent::__construct( false ); // no implicit transaction
@@ -71,6 +72,7 @@ class LinksUpdate extends SqlDataUpdate {
                }
 
                $this->mParserOutput = $parserOutput;
+
                $this->mLinks = $parserOutput->getLinks();
                $this->mImages = $parserOutput->getImages();
                $this->mTemplates = $parserOutput->getTemplates();
@@ -236,26 +238,20 @@ class LinksUpdate extends SqlDataUpdate {
        }
 
        function queueRecursiveJobs() {
-               global $wgUpdateRowsPerJob;
                wfProfileIn( __METHOD__ );
 
-               $cache = $this->mTitle->getBacklinkCache();
-               $batches = $cache->partition( 'templatelinks', $wgUpdateRowsPerJob );
-               if ( !$batches ) {
-                       wfProfileOut( __METHOD__ );
-                       return;
-               }
-               $jobs = array();
-               foreach ( $batches as $batch ) {
-                       list( $start, $end ) = $batch;
-                       $params = array(
-                               'table' => 'templatelinks',
-                               'start' => $start,
-                               'end' => $end,
+               if ( $this->mTitle->getBacklinkCache()->hasLinks( 'templatelinks' ) ) {
+                       $job = new RefreshLinksJob2(
+                               $this->mTitle,
+                               array(
+                                       'table' => 'templatelinks',
+                               ) + Job::newRootJobParams( // "overall" refresh links job info
+                                       "refreshlinks:templatelinks:{$this->mTitle->getPrefixedText()}"
+                               )
                        );
-                       $jobs[] = new RefreshLinksJob2( $this->mTitle, $params );
+                       JobQueueGroup::singleton()->push( $job );
+                       JobQueueGroup::singleton()->deduplicateRootJob( $job );
                }
-               Job::batchInsert( $jobs );
 
                wfProfileOut( __METHOD__ );
        }
@@ -828,6 +824,10 @@ class LinksDeletionUpdate extends SqlDataUpdate {
                parent::__construct( false ); // no implicit transaction
 
                $this->mPage = $page;
+
+               if ( !$page->exists() ) {
+                       throw new MWException( "Page ID not known, perhaps the page doesn't exist?" );
+               }
        }
 
        /**
@@ -879,4 +879,16 @@ class LinksDeletionUpdate extends SqlDataUpdate {
                                __METHOD__ );
                }
        }
+
+       /**
+        * Update all the appropriate counts in the category table.
+        * @param $added array associative array of category name => sort key
+        * @param $deleted array associative array of category name => sort key
+        */
+       function updateCategoryCounts( $added, $deleted ) {
+               $a = WikiPage::factory( $this->mTitle );
+               $a->updateCategoryCounts(
+                       array_keys( $added ), array_keys( $deleted )
+               );
+       }
 }
index d8e5d3a..94e823e 100644 (file)
@@ -168,6 +168,7 @@ class LocalisationCache {
         * for $wgLocalisationCacheConf.
         *
         * @param $conf Array
+        * @throws MWException
         */
        function __construct( $conf ) {
                global $wgCacheDirectory;
@@ -378,7 +379,7 @@ class LocalisationCache {
                }
 
                $deps = $this->store->get( $code, 'deps' );
-               $keys = $this->store->get( $code, 'list', 'messages' );
+               $keys = $this->store->get( $code, 'list' );
                $preload = $this->store->get( $code, 'preload' );
                // Different keys may expire separately, at least in LCStore_Accel
                if ( $deps === null || $keys === null || $preload === null ) {
@@ -404,6 +405,7 @@ class LocalisationCache {
        /**
         * Initialise a language in this object. Rebuild the cache if necessary.
         * @param $code
+        * @throws MWException
         */
        protected function initLanguage( $code ) {
                if ( isset( $this->initialisedLangs[$code] ) ) {
@@ -474,6 +476,7 @@ class LocalisationCache {
         * Read a PHP file containing localisation data.
         * @param $_fileName
         * @param $_fileType
+        * @throws MWException
         * @return array
         */
        protected function readPHPFile( $_fileName, $_fileType ) {
@@ -659,6 +662,7 @@ class LocalisationCache {
         * Load localisation data for a given language for both core and extensions
         * and save it to the persistent cache store and the process cache
         * @param $code
+        * @throws MWException
         */
        public function recache( $code ) {
                global $wgExtensionMessagesFiles;
index 42791f5..6d2e1dc 100644 (file)
@@ -534,7 +534,7 @@ class MagicWord {
         *
         * @return string
         */
-       function getVariableRegex()     {
+       function getVariableRegex() {
                if ( $this->mVariableRegex == '' ) {
                        $this->initRegex();
                }
index 776a52f..abc7dc4 100644 (file)
@@ -202,6 +202,11 @@ class Message {
         */
        protected $title = null;
 
+       /**
+        * Content object representing the message
+        */
+       protected $content = null;
+
        /**
         * @var string
         */
@@ -332,6 +337,7 @@ class Message {
         * turned off.
         * @since 1.17
         * @param $lang Mixed: language code or Language object.
+        * @throws MWException
         * @return Message: $this
         */
        public function inLanguage( $lang ) {
@@ -404,6 +410,18 @@ class Message {
                return $this;
        }
 
+       /**
+        * Returns the message as a Content object.
+        * @return Content
+        */
+       public function content() {
+               if ( !$this->content ) {
+                       $this->content = new MessageContent( $this->key );
+               }
+
+               return $this->content;
+       }
+
        /**
         * Returns the message parsed from wikitext to HTML.
         * @since 1.17
@@ -420,6 +438,15 @@ class Message {
                        return '&lt;' . $key . '&gt;';
                }
 
+               # Replace $* with a list of parameters for &uselang=qqx.
+               if ( strpos( $string, '$*' ) !== false ) {
+                       $paramlist = '';
+                       if ( $this->parameters !== array() ) {
+                               $paramlist = ': $' . implode( ', $', range( 1, count( $this->parameters ) ) );
+                       }
+                       $string = str_replace( '$*', $paramlist, $string );
+               }
+
                # Replace parameters before text parsing
                $string = $this->replaceParameters( $string, 'before' );
 
@@ -530,7 +557,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
+        * @return Bool: true if it is and false if not
         */
        public function isDisabled() {
                $message = $this->fetchMessage();
@@ -579,7 +606,6 @@ class Message {
         * @since 1.18
         * @param $param String|Array: Parameter as defined in this class.
         * @return Tuple(type, value)
-        * @throws MWException
         */
        protected function extractParam( $param ) {
                if ( is_array( $param ) && isset( $param['raw'] ) ) {
@@ -591,7 +617,11 @@ class Message {
                } elseif ( !is_array( $param ) ) {
                        return array( 'before', $param );
                } else {
-                       throw new MWException( "Invalid message parameter" );
+                       trigger_error(
+                               "Invalid message parameter: " . htmlspecialchars( serialize( $param ) ),
+                               E_USER_WARNING
+                       );
+                       return array( 'before', '[INVALID]' );
                }
        }
 
@@ -602,7 +632,8 @@ class Message {
         * @return string Wikitext parsed into HTML
         */
        protected function parseText( $string ) {
-               return MessageCache::singleton()->parse( $string, $this->title, /*linestart*/true, $this->interface, $this->language )->getText();
+               $out = MessageCache::singleton()->parse( $string, $this->title, /*linestart*/true, $this->interface, $this->language );
+               return is_object( $out ) ? $out->getText() : $out;
        }
 
        /**
@@ -618,6 +649,7 @@ class Message {
        /**
         * Wrapper for what ever method we use to get message contents
         * @since 1.17
+        * @throws MWException
         * @return string
         */
        protected function fetchMessage() {
index 34014e1..09561bd 100644 (file)
@@ -140,7 +140,7 @@ class MessageBlobStore {
                // Save the old and new blobs for later
                $oldBlob = $row->mr_blob;
                $newBlob = self::generateMessageBlob( $module, $lang );
-               
+
                $newRow = array(
                        'mr_resource' => $name,
                        'mr_lang' => $lang,
@@ -311,6 +311,7 @@ class MessageBlobStore {
         * @param $resourceLoader ResourceLoader object
         * @param $modules Array of module names
         * @param $lang String: language code
+        * @throws MWException
         * @return array Array mapping module names to blobs
         */
        private static function getFromDB( ResourceLoader $resourceLoader, $modules, $lang ) {
index 1873e7b..65a2a6f 100644 (file)
  * This is used as a fallback to mime.types files.
  * An extensive list of well known mime types is provided by
  * the file mime.types in the includes directory.
- * 
+ *
  * This list concatenated with mime.types is used to create a mime <-> ext
  * map. Each line contains a mime type followed by a space separated list of
- * extensions. If multiple extensions for a single mime type exist or if 
+ * extensions. If multiple extensions for a single mime type exist or if
  * multiple mime types exist for a single extension then in most cases
  * MediaWiki assumes that the first extension following the mime type is the
  * canonical extension, and the first time a mime type appears for a certain
  * extension is considered the canonical mime type.
- * 
+ *
  * (Note that appending $wgMimeTypeFile to the end of MM_WELL_KNOWN_MIME_TYPES
- * sucks because you can't redefine canonical types. This could be fixed by 
+ * sucks because you can't redefine canonical types. This could be fixed by
  * appending MM_WELL_KNOWN_MIME_TYPES behind $wgMimeTypeFile, but who knows
  * what will break? In practice this probably isn't a problem anyway -- Bryan)
  */
@@ -70,7 +70,7 @@ image/x-bmp bmp
 image/gif gif
 image/jpeg jpeg jpg jpe
 image/png png
-image/svg+xml svg 
+image/svg+xml svg
 image/svg svg
 image/tiff tiff tif
 image/vnd.djvu djvu
@@ -352,11 +352,11 @@ class MimeMagic {
                return self::$instance;
        }
 
-       /** 
-        * Returns a list of file extensions for a given mime type as a space 
+       /**
+        * Returns a list of file extensions for a given mime type as a space
         * separated string or null if the mime type was unrecognized. Resolves
         * mime type aliases.
-        * 
+        *
         * @param $mime string
         * @return string|null
         */
@@ -379,10 +379,10 @@ class MimeMagic {
                return null;
        }
 
-       /** 
-        * Returns a list of mime types for a given file extension as a space 
+       /**
+        * Returns a list of mime types for a given file extension as a space
         * separated string or null if the extension was unrecognized.
-        * 
+        *
         * @param $ext string
         * @return string|null
         */
@@ -393,10 +393,10 @@ class MimeMagic {
                return $r;
        }
 
-       /** 
+       /**
         * Returns a single mime type for a given file extension or null if unknown.
         * This is always the first type from the list returned by getTypesForExtension($ext).
-        * 
+        *
         * @param $ext string
         * @return string|null
         */
@@ -414,11 +414,11 @@ class MimeMagic {
        }
 
 
-       /** 
-        * Tests if the extension matches the given mime type. Returns true if a 
-        * match was found, null if the mime type is unknown, and false if the 
+       /**
+        * Tests if the extension matches the given mime type. Returns true if a
+        * match was found, null if the mime type is unknown, and false if the
         * mime type is known but no matches where found.
-        * 
+        *
         * @param $extension string
         * @param $mime string
         * @return bool|null
@@ -433,15 +433,15 @@ class MimeMagic {
                $ext = explode( ' ', $ext );
 
                $extension = strtolower( $extension );
-               return  in_array( $extension, $ext );
+               return  in_array( $extension, $ext );
        }
 
-       /** 
-        * Returns true if the mime type is known to represent an image format 
+       /**
+        * Returns true if the mime type is known to represent an image format
         * supported by the PHP GD library.
         *
         * @param $mime string
-        * 
+        *
         * @return bool
         */
        public function isPHPImageType( $mime ) {
@@ -489,19 +489,19 @@ class MimeMagic {
                return in_array( strtolower( $extension ), $types );
        }
 
-       /** 
+       /**
         * Improves a mime type using the file extension. Some file formats are very generic,
-        * so their mime type is not very meaningful. A more useful mime type can be derived 
-        * by looking at the file extension. Typically, this method would be called on the 
+        * so their mime type is not very meaningful. A more useful mime type can be derived
+        * by looking at the file extension. Typically, this method would be called on the
         * result of guessMimeType().
-        * 
+        *
         * Currently, this method does the following:
         *
         * If $mime is "unknown/unknown" and isRecognizableExtension( $ext ) returns false,
-        * return the result of guessTypesForExtension($ext). 
+        * return the result of guessTypesForExtension($ext).
         *
         * If $mime is "application/x-opc+zip" and isMatchingExtension( $ext, $mime )
-        * gives true, return the result of guessTypesForExtension($ext). 
+        * gives true, return the result of guessTypesForExtension($ext).
         *
         * @param $mime String: the mime type, typically guessed from a file's content.
         * @param $ext String: the file extension, as taken from the file name
@@ -511,10 +511,10 @@ class MimeMagic {
        public function improveTypeFromExtension( $mime, $ext ) {
                if ( $mime === 'unknown/unknown' ) {
                        if ( $this->isRecognizableExtension( $ext ) ) {
-                               wfDebug( __METHOD__. ': refusing to guess mime type for .' . 
+                               wfDebug( __METHOD__. ': refusing to guess mime type for .' .
                                        "$ext file, we should have recognized it\n" );
                        } else {
-                               // Not something we can detect, so simply 
+                               // Not something we can detect, so simply
                                // trust the file extension
                                $mime = $this->guessTypesForExtension( $ext );
                        }
@@ -525,7 +525,7 @@ class MimeMagic {
                                // find the proper mime type for that file extension
                                $mime = $this->guessTypesForExtension( $ext );
                        } else {
-                               wfDebug( __METHOD__. ": refusing to guess better type for $mime file, " . 
+                               wfDebug( __METHOD__. ": refusing to guess better type for $mime file, " .
                                        ".$ext is not a known OPC extension.\n" );
                                $mime = 'application/zip';
                        }
@@ -539,16 +539,16 @@ class MimeMagic {
                return $mime;
        }
 
-       /** 
-        * Mime type detection. This uses detectMimeType to detect the mime type 
-        * of the file, but applies additional checks to determine some well known 
-        * file formats that may be missed or misinterpreter by the default mime 
-        * detection (namely XML based formats like XHTML or SVG, as well as ZIP 
+       /**
+        * Mime type detection. This uses detectMimeType to detect the mime type
+        * of the file, but applies additional checks to determine some well known
+        * file formats that may be missed or misinterpreter by the default mime
+        * detection (namely XML based formats like XHTML or SVG, as well as ZIP
         * based formats like OPC/ODF files).
         *
         * @param $file String: the file to check
         * @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
-        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use 
+        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use
         *             improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string the mime type of $file
@@ -587,7 +587,7 @@ class MimeMagic {
                // @todo FIXME: Shouldn't this be rb?
                $f = fopen( $file, 'rt' );
                wfRestoreWarnings();
-               
+
                if( !$f ) {
                        return 'unknown/unknown';
                }
@@ -750,7 +750,7 @@ class MimeMagic {
 
                return false;
        }
-       
+
        /**
         * Detect application-specific file type of a given ZIP file from its
         * header data.  Currently works for OpenDocument and OpenXML types...
@@ -759,7 +759,7 @@ class MimeMagic {
         * @param $header String: some reasonably-sized chunk of file header
         * @param $tail   String: the tail of the file
         * @param $ext Mixed: the file extension, or true to extract it from the filename.
-        *             Set it to false (default) to ignore the extension. DEPRECATED! Set to false, 
+        *             Set it to false (default) to ignore the extension. DEPRECATED! Set to false,
         *             use improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string
@@ -800,8 +800,8 @@ class MimeMagic {
                        wfDebug( __METHOD__.": detected $mime from ZIP archive\n" );
                } elseif ( preg_match( $openxmlRegex, substr( $header, 30 ) ) ) {
                        $mime = "application/x-opc+zip";
-                       # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere 
-                       if ( $ext !== true && $ext !== false ) { 
+                       # TODO: remove the block below, as soon as improveTypeFromExtension is used everywhere
+                       if ( $ext !== true && $ext !== false ) {
                                /** This is the mode used by getPropsFromPath
                                * These mime's are stored in the database, where we don't really want
                                * x-opc+zip, because we use it only for internal purposes
@@ -815,12 +815,12 @@ class MimeMagic {
                                }
                        }
                        wfDebug( __METHOD__.": detected an Open Packaging Conventions archive: $mime\n" );
-               } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" && 
+               } elseif ( substr( $header, 0, 8 ) == "\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1" &&
                                ($headerpos = strpos( $tail, "PK\x03\x04" ) ) !== false &&
                                preg_match( $openxmlRegex, substr( $tail, $headerpos + 30 ) ) ) {
                        if ( substr( $header, 512, 4) == "\xEC\xA5\xC1\x00" ) {
                                $mime = "application/msword";
-                       } 
+                       }
                        switch( substr( $header, 512, 6) ) {
                                case "\xEC\xA5\xC1\x00\x0E\x00":
                                case "\xEC\xA5\xC1\x00\x1C\x00":
@@ -850,20 +850,20 @@ class MimeMagic {
                return $mime;
        }
 
-       /** 
-        * Internal mime type detection. Detection is done using an external 
-        * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo 
-        * extension and mime_content_type are tried (in this order), if they 
-        * are available. If the dections fails and $ext is not false, the mime 
+       /**
+        * Internal mime type detection. Detection is done using an external
+        * program, if $wgMimeDetectorCommand is set. Otherwise, the fileinfo
+        * extension and mime_content_type are tried (in this order), if they
+        * are available. If the dections fails and $ext is not false, the mime
         * type is guessed from the file extension, using guessTypesForExtension.
-        * 
-        * If the mime type is still unknown, getimagesize is used to detect the 
-        * mime type if the file is an image. If no mime type can be determined, 
+        *
+        * If the mime type is still unknown, getimagesize is used to detect the
+        * mime type if the file is an image. If no mime type can be determined,
         * this function returns 'unknown/unknown'.
         *
         * @param $file String: the file to check
         * @param $ext Mixed: the file extension, or true (default) to extract it from the filename.
-        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use 
+        *             Set it to false to ignore the extension. DEPRECATED! Set to false, use
         *             improveTypeFromExtension($mime, $ext) later to improve mime type.
         *
         * @return string the mime type of $file
@@ -1037,7 +1037,7 @@ class MimeMagic {
                return $type;
        }
 
-       /** 
+       /**
         * Returns a media code matching the given mime type or file extension.
         * File extensions are represented by a string starting with a dot (.) to
         * distinguish them from mime types.
@@ -1047,7 +1047,7 @@ class MimeMagic {
         * @return int|string
         */
        function findMediaType( $extMime ) {
-               if ( strpos( $extMime, '.' ) === 0 ) { 
+               if ( strpos( $extMime, '.' ) === 0 ) {
                        // If it's an extension, look up the mime types
                        $m = $this->getTypesForExtension( substr( $extMime, 1 ) );
                        if ( !$m ) {
@@ -1076,7 +1076,7 @@ class MimeMagic {
        }
 
        /**
-        * Get the MIME types that various versions of Internet Explorer would 
+        * Get the MIME types that various versions of Internet Explorer would
         * detect from a chunk of the content.
         *
         * @param $fileName String: the file name (unused at present)
index 2e2b8d6..e8d5632 100644 (file)
@@ -48,6 +48,7 @@ class MWNamespace {
         * @param $index
         * @param $method
         *
+        * @throws MWException
         * @return bool
         */
        private static function isMethodValidFor( $index, $method ) {
@@ -209,12 +210,14 @@ class MWNamespace {
         * Returns array of all defined namespaces with their canonical
         * (English) names.
         *
+        * @param bool $rebuild rebuild namespace list (default = false). Used for testing.
+        *
         * @return array
         * @since 1.17
         */
-       public static function getCanonicalNamespaces() {
+       public static function getCanonicalNamespaces( $rebuild = false ) {
                static $namespaces = null;
-               if ( $namespaces === null ) {
+               if ( $namespaces === null || $rebuild ) {
                        global $wgExtraNamespaces, $wgCanonicalNamespaceNames;
                        $namespaces = array( NS_MAIN => '' ) + $wgCanonicalNamespaceNames;
                        if ( is_array( $wgExtraNamespaces ) ) {
index 46a43f6..78435e4 100644 (file)
@@ -22,9 +22,9 @@
 
 /**
  * Standard output handler for use with ob_start
- * 
+ *
  * @param $s string
- * 
+ *
  * @return string
  */
 function wfOutputHandler( $s ) {
@@ -85,7 +85,7 @@ function wfRequestExtension() {
 /**
  * Handler that compresses data with gzip if allowed by the Accept header.
  * Unlike ob_gzhandler, it works for HEAD requests too.
- * 
+ *
  * @param $s string
  *
  * @return string
index b69069b..7649b23 100644 (file)
@@ -255,7 +255,7 @@ class OutputPage extends ContextSource {
        function __construct( IContextSource $context = null ) {
                if ( $context === null ) {
                        # Extensions should use `new RequestContext` instead of `new OutputPage` now.
-                       wfDeprecated( __METHOD__ );
+                       wfDeprecated( __METHOD__, '1.18' );
                } else {
                        $this->setContext( $context );
                }
@@ -611,7 +611,7 @@ class OutputPage extends ContextSource {
 
        /**
         * checkLastModified tells the client to use the client-cached page if
-        * possible. If sucessful, the OutputPage is disabled so that
+        * possible. If successful, the OutputPage is disabled so that
         * any future call to OutputPage->output() have no effect.
         *
         * Side effect: sets mLastModified for Last-Modified header
@@ -1469,7 +1469,7 @@ class OutputPage extends ContextSource {
         * @param $interface Boolean: whether it is an interface message
         *                                                              (for example disables conversion)
         */
-       public function addWikiTextTitle( $text, &$title, $linestart, $tidy = false, $interface = false ) {
+       public function addWikiTextTitle( $text, Title $title, $linestart, $tidy = false, $interface = false ) {
                global $wgParser;
 
                wfProfileIn( __METHOD__ );
@@ -1570,9 +1570,10 @@ class OutputPage extends ContextSource {
         * @param $interface Boolean: use interface language ($wgLang instead of
         *                   $wgContLang) while parsing language sensitive magic
         *                   words like GRAMMAR and PLURAL. This also disables
-        *                                       LanguageConverter.
+        *                   LanguageConverter.
         * @param $language  Language object: target language object, will override
         *                   $interface
+        * @throws MWException
         * @return String: HTML
         */
        public function parse( $text, $linestart = true, $interface = false, $language = null ) {
@@ -1768,14 +1769,12 @@ class OutputPage extends ContextSource {
                                } else {
                                        $aloption[] = 'string-contains=' . $variant;
 
-                                       // IE and some other browsers use another form of language code
-                                       // in their Accept-Language header, like "zh-CN" or "zh-TW".
+                                       // IE and some other browsers use BCP 47 standards in
+                                       // their Accept-Language header, like "zh-CN" or "zh-Hant".
                                        // We should handle these too.
-                                       $ievariant = explode( '-', $variant );
-                                       if ( count( $ievariant ) == 2 ) {
-                                               $ievariant[1] = strtoupper( $ievariant[1] );
-                                               $ievariant = implode( '-', $ievariant );
-                                               $aloption[] = 'string-contains=' . $ievariant;
+                                       $variantBCP47 = wfBCP47( $variant );
+                                       if ( $variantBCP47 !== $variant ) {
+                                               $aloption[] = 'string-contains=' . $variantBCP47;
                                        }
                                }
                        }
@@ -1902,7 +1901,7 @@ class OutputPage extends ContextSource {
         * @deprecated since 1.18 Use HttpStatus::getMessage() instead.
         */
        public static function getStatusMessage( $code ) {
-               wfDeprecated( __METHOD__ );
+               wfDeprecated( __METHOD__, '1.18' );
                return HttpStatus::getMessage( $code );
        }
 
@@ -1993,7 +1992,9 @@ class OutputPage extends ContextSource {
                wfRunHooks( 'AfterFinalPageOutput', array( $this ) );
 
                $this->sendCacheControl();
+
                ob_end_flush();
+
                wfProfileOut( __METHOD__ );
        }
 
@@ -2056,7 +2057,7 @@ class OutputPage extends ContextSource {
                $this->prepareErrorPage( $title );
 
                if ( $msg instanceof Message ){
-                       $this->addHTML( $msg->parse() );
+                       $this->addHTML( $msg->parseAsBlock() );
                } else {
                        $this->addWikiMsgArray( $msg, $params );
                }
@@ -2071,8 +2072,6 @@ class OutputPage extends ContextSource {
         * @param $action String: action that was denied or null if unknown
         */
        public function showPermissionsErrorPage( $errors, $action = null ) {
-               global $wgGroupPermissions;
-
                // For some action (read, edit, create and upload), display a "login to do this action"
                // error if all of the following conditions are met:
                // 1. the user is not logged in
@@ -2081,8 +2080,8 @@ class OutputPage extends ContextSource {
                if ( in_array( $action, array( 'read', 'edit', 'createpage', 'createtalk', 'upload' ) )
                        && $this->getUser()->isAnon() && count( $errors ) == 1 && isset( $errors[0][0] )
                        && ( $errors[0][0] == 'badaccess-groups' || $errors[0][0] == 'badaccess-group0' )
-                       && ( ( isset( $wgGroupPermissions['user'][$action] ) && $wgGroupPermissions['user'][$action] )
-                       || ( isset( $wgGroupPermissions['autoconfirmed'][$action] ) && $wgGroupPermissions['autoconfirmed'][$action] ) )
+                       && ( User::groupHasPermission( 'user', $action )
+                       || User::groupHasPermission( 'autoconfirmed', $action ) )
                ) {
                        $displayReturnto = null;
 
@@ -2155,6 +2154,7 @@ class OutputPage extends ContextSource {
         * Display an error page noting that a given permission bit is required.
         * @deprecated since 1.18, just throw the exception directly
         * @param $permission String: key required
+        * @throws PermissionsError
         */
        public function permissionRequired( $permission ) {
                throw new PermissionsError( $permission );
@@ -2225,6 +2225,7 @@ class OutputPage extends ContextSource {
         * @param $protected Boolean: is this a permissions error?
         * @param $reasons   Array: list of reasons for this error, as returned by Title::getUserPermissionsErrors().
         * @param $action    String: action that was denied or null if unknown
+        * @throws ReadOnlyError
         */
        public function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
                $this->setRobotPolicy( 'noindex,nofollow' );
@@ -2342,11 +2343,20 @@ $templates
         * @param $title Title to link
         * @param $query Array query string parameters
         * @param $text String text of the link (input is not escaped)
+        * @param $options Options array to pass to Linker
         */
-       public function addReturnTo( $title, $query = array(), $text = null ) {
-               $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL() ) );
+       public function addReturnTo( $title, $query = array(), $text = null, $options = array() ) {
+               if( in_array( 'http', $options ) ) {
+                       $proto = PROTO_HTTP;
+               } elseif( in_array( 'https', $options ) ) {
+                       $proto = PROTO_HTTPS;
+               } else {
+                       $proto = PROTO_RELATIVE;
+               }
+
+               $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL( '', false, $proto ) ) );
                $link = $this->msg( 'returnto' )->rawParams(
-                       Linker::link( $title, $text, array(), $query ) )->escaped();
+                       Linker::link( $title, $text, array(), $query, $options ) )->escaped();
                $this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" );
        }
 
@@ -2450,7 +2460,7 @@ $templates
         */
        private function addDefaultModules() {
                global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax,
-                       $wgAjaxWatch, $wgEnableMWSuggest;
+                       $wgAjaxWatch, $wgResponsiveImages;
 
                // Add base resources
                $this->addModules( array(
@@ -2478,8 +2488,8 @@ $templates
                                $this->addModules( 'mediawiki.page.watch.ajax' );
                        }
 
-                       if ( $wgEnableMWSuggest && !$this->getUser()->getOption( 'disablesuggest', false ) ) {
-                               $this->addModules( 'mediawiki.legacy.mwsuggest' );
+                       if ( !$this->getUser()->getOption( 'disablesuggest', false ) ) {
+                               $this->addModules( 'mediawiki.searchSuggest' );
                        }
                }
 
@@ -2491,6 +2501,11 @@ $templates
                if ( $this->isArticle() && $this->getUser()->getOption( 'editondblclick' ) ) {
                        $this->addModules( 'mediawiki.action.view.dblClickEdit' );
                }
+
+               // Support for high-density display images
+               if ( $wgResponsiveImages ) {
+                       $this->addModules( 'mediawiki.hidpi' );
+               }
        }
 
        /**
@@ -2903,7 +2918,7 @@ $templates
         * @return array
         */
        public function getJSVars() {
-               global $wgUseAjax, $wgEnableMWSuggest, $wgContLang;
+               global $wgContLang;
 
                $latestRevID = 0;
                $pageID = 0;
@@ -2965,13 +2980,10 @@ $templates
                );
                if ( $wgContLang->hasVariants() ) {
                        $vars['wgUserVariant'] = $wgContLang->getPreferredVariant();
-               }
+               }
                foreach ( $title->getRestrictionTypes() as $type ) {
                        $vars['wgRestriction' . ucfirst( $type )] = $title->getRestrictions( $type );
                }
-               if ( $wgUseAjax && $wgEnableMWSuggest && !$this->getUser()->getOption( 'disablesuggest', false ) ) {
-                       $vars['wgSearchNamespaces'] = SearchEngine::userNamespaces( $this->getUser() );
-               }
                if ( $title->isMainPage() ) {
                        $vars['wgIsMainPage'] = true;
                }
@@ -3559,7 +3571,6 @@ $templates
                $msgSpecs = array_values( $msgSpecs );
                $s = $wrap;
                foreach ( $msgSpecs as $n => $spec ) {
-                       $options = array();
                        if ( is_array( $spec ) ) {
                                $args = $spec;
                                $name = array_shift( $args );
index dad71f8..2aed2af 100644 (file)
@@ -38,7 +38,7 @@
  * version are hardcoded here
  */
 function wfPHPVersionError( $type ){
-       $mwVersion = '1.20';
+       $mwVersion = '1.21';
        $phpVersion = PHP_VERSION;
        $message = "MediaWiki $mwVersion requires at least PHP version 5.3.2, you are using PHP $phpVersion.";
        if( $type == 'index.php' ) {
index 96ba446..077430d 100644 (file)
@@ -287,8 +287,7 @@ abstract class IndexPager extends ContextSource implements Pager {
                        if ( $numRows > $this->mLimit && $numRows > 1 ) {
                                $res->seek( $numRows - 1 );
                                $this->mPastTheEndRow = $res->fetchObject();
-                               $indexField = $this->mIndexField;
-                               $this->mPastTheEndIndex = $this->mPastTheEndRow->$indexField;
+                               $this->mPastTheEndIndex = $this->mPastTheEndRow->$indexColumn;
                                $res->seek( $numRows - 2 );
                                $row = $res->fetchRow();
                                $lastIndex = $row[$indexColumn];
index eaf781b..a3c684b 100644 (file)
@@ -879,7 +879,7 @@ class Preferences {
                global $wgUseRCPatrol, $wgEnableAPI, $wgRCMaxAge;
 
                $watchlistdaysMax = ceil( $wgRCMaxAge / ( 3600 * 24 ) );
-               
+
                ## Watchlist #####################################
                $defaultPreferences['watchlistdays'] = array(
                        'type' => 'float',
@@ -978,7 +978,7 @@ class Preferences {
         * @param $defaultPreferences Array
         */
        static function searchPreferences( $user, IContextSource $context, &$defaultPreferences ) {
-               global $wgContLang, $wgEnableMWSuggest, $wgVectorUseSimpleSearch;
+               global $wgContLang, $wgVectorUseSimpleSearch;
 
                ## Search #####################################
                $defaultPreferences['searchlimit'] = array(
@@ -988,22 +988,21 @@ class Preferences {
                        'min' => 0,
                );
 
-               if ( $wgEnableMWSuggest ) {
-                       $defaultPreferences['disablesuggest'] = array(
-                               'type' => 'toggle',
-                               'label-message' => 'mwsuggest-disable',
-                               'section' => 'searchoptions/displaysearchoptions',
-                       );
-               }
 
                if ( $wgVectorUseSimpleSearch ) {
                        $defaultPreferences['vector-simplesearch'] = array(
                                'type' => 'toggle',
                                'label-message' => 'vector-simplesearch-preference',
-                               'section' => 'searchoptions/displaysearchoptions'
+                               'section' => 'searchoptions/displaysearchoptions',
                        );
                }
 
+               $defaultPreferences['disablesuggest'] = array(
+                       'type' => 'toggle',
+                       'label-message' => 'mwsuggest-disable',
+                       'section' => 'searchoptions/displaysearchoptions',
+               );
+
                $defaultPreferences['searcheverything'] = array(
                        'type' => 'toggle',
                        'label-message' => 'searcheverything-enable',
@@ -1374,7 +1373,7 @@ class Preferences {
         * @return bool|Status|string
         */
        static function tryFormSubmit( $formData, $form, $entryPoint = 'internal' ) {
-               global $wgHiddenPrefs;
+               global $wgHiddenPrefs, $wgAuth;
 
                $user = $form->getModifiedUser();
                $result = true;
@@ -1423,6 +1422,8 @@ class Preferences {
 
                $user->saveSettings();
 
+               $wgAuth->updateExternalDB( $user );
+
                return $result;
        }
 
index ce0e36b..9643ba7 100644 (file)
@@ -63,7 +63,7 @@ class ProtectionForm {
                $this->mArticle = $article;
                $this->mTitle = $article->getTitle();
                $this->mApplicableTypes = $this->mTitle->getRestrictionTypes();
-               
+
                // Check if the form should be disabled.
                // If it is, the form will be available in read-only to show levels.
                $this->mPermErrors = $this->mTitle->getUserPermissionsErrors( 'protect', $wgUser );
@@ -286,12 +286,10 @@ class ProtectionForm {
 
                # They shouldn't be able to do this anyway, but just to make sure, ensure that cascading restrictions aren't being applied
                #  to a semi-protected page.
-               global $wgGroupPermissions;
-
                $edit_restriction = isset( $this->mRestrictions['edit'] ) ? $this->mRestrictions['edit'] : '';
                $this->mCascade = $wgRequest->getBool( 'mwProtect-cascade' );
                if ($this->mCascade && ($edit_restriction != 'protect') &&
-                       !(isset($wgGroupPermissions[$edit_restriction]['protect']) && $wgGroupPermissions[$edit_restriction]['protect'] ) )
+                       !User::groupHasPermission( $edit_restriction, 'protect' ) )
                        $this->mCascade = false;
 
                $status = $this->mArticle->doUpdateRestrictions( $this->mRestrictions, $expiry, $this->mCascade, $reasonstr, $wgUser );
@@ -600,11 +598,11 @@ class ProtectionForm {
        }
 
        function buildCleanupScript() {
-               global $wgRestrictionLevels, $wgGroupPermissions, $wgOut;
+               global $wgRestrictionLevels, $wgOut;
 
                $cascadeableLevels = array();
                foreach( $wgRestrictionLevels as $key ) {
-                       if ( ( isset( $wgGroupPermissions[$key]['protect'] ) && $wgGroupPermissions[$key]['protect'] )
+                       if ( User::groupHasPermission( $key, 'protect' )
                                || $key == 'protect'
                        ) {
                                $cascadeableLevels[] = $key;
index ac559dc..1f21584 100644 (file)
@@ -151,6 +151,7 @@ abstract class QueryPage extends SpecialPage {
        /**
         * For back-compat, subclasses may return a raw SQL query here, as a string.
         * This is stronly deprecated; getQueryInfo() should be overridden instead.
+        * @throws MWException
         * @return string
         */
        function getSQL() {
index 332d039..87fa428 100644 (file)
@@ -55,6 +55,7 @@
  *  lang            the interwiki prefix, automatically set in save()
  *  oldSize         text size before the change
  *  newSize         text size after the change
+ *  pageStatus      status of the page: created, deleted, moved, restored, changed
  *
  * temporary:       not stored in the database
  *      notificationtimestamp
@@ -125,7 +126,7 @@ class RecentChange {
         */
        public static function newFromConds( $conds, $fname = __METHOD__ ) {
                $dbr = wfGetDB( DB_SLAVE );
-               $row = $dbr->selectRow( 'recentchanges', '*', $conds, $fname );
+               $row = $dbr->selectRow( 'recentchanges', self::selectFields(), $conds, $fname );
                if ( $row !== false ) {
                        return self::newFromRow( $row );
                } else {
@@ -133,6 +134,40 @@ class RecentChange {
                }
        }
 
+       /**
+        * Return the list of recentchanges fields that should be selected to create
+        * a new recentchanges object.
+        * @return array
+        */
+       public static function selectFields() {
+               return array(
+                       'rc_id',
+                       'rc_timestamp',
+                       'rc_cur_time',
+                       'rc_user',
+                       'rc_user_text',
+                       'rc_namespace',
+                       'rc_title',
+                       'rc_comment',
+                       'rc_minor',
+                       'rc_bot',
+                       'rc_new',
+                       'rc_cur_id',
+                       'rc_this_oldid',
+                       'rc_last_oldid',
+                       'rc_type',
+                       'rc_patrolled',
+                       'rc_ip',
+                       'rc_old_len',
+                       'rc_new_len',
+                       'rc_deleted',
+                       'rc_logid',
+                       'rc_log_type',
+                       'rc_log_action',
+                       'rc_params',
+               );
+       }
+
        # Accessors
 
        /**
@@ -154,7 +189,7 @@ class RecentChange {
         * @return Title
         */
        public function &getTitle() {
-               if( $this->mTitle === false ) {
+               if ( $this->mTitle === false ) {
                        $this->mTitle = Title::makeTitle( $this->mAttribs['rc_namespace'], $this->mAttribs['rc_title'] );
                        # Make sure the correct page ID is process cached
                        $this->mTitle->resetArticleID( $this->mAttribs['rc_cur_id'] );
@@ -162,17 +197,6 @@ class RecentChange {
                return $this->mTitle;
        }
 
-       /**
-        * @return bool|Title
-        */
-       public function getMovedToTitle() {
-               if( $this->mMovedToTitle === false ) {
-                       $this->mMovedToTitle = Title::makeTitle( $this->mAttribs['rc_moved_to_ns'],
-                               $this->mAttribs['rc_moved_to_title'] );
-               }
-               return $this->mMovedToTitle;
-       }
-
        /**
         * Get the User object of the person who performed this change.
         *
@@ -197,17 +221,17 @@ class RecentChange {
                global $wgLocalInterwiki, $wgPutIPinRC, $wgUseEnotif, $wgShowUpdatedMarker, $wgContLang;
 
                $dbw = wfGetDB( DB_MASTER );
-               if( !is_array($this->mExtra) ) {
+               if ( !is_array( $this->mExtra ) ) {
                        $this->mExtra = array();
                }
                $this->mExtra['lang'] = $wgLocalInterwiki;
 
-               if( !$wgPutIPinRC ) {
+               if ( !$wgPutIPinRC ) {
                        $this->mAttribs['rc_ip'] = '';
                }
 
                # If our database is strict about IP addresses, use NULL instead of an empty string
-               if( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) {
+               if ( $dbw->strictIPs() and $this->mAttribs['rc_ip'] == '' ) {
                        unset( $this->mAttribs['rc_ip'] );
                }
 
@@ -215,12 +239,12 @@ class RecentChange {
                $this->mAttribs['rc_comment'] = $wgContLang->truncate( $this->mAttribs['rc_comment'], 255 );
 
                # Fixup database timestamps
-               $this->mAttribs['rc_timestamp'] = $dbw->timestamp($this->mAttribs['rc_timestamp']);
-               $this->mAttribs['rc_cur_time'] = $dbw->timestamp($this->mAttribs['rc_cur_time']);
+               $this->mAttribs['rc_timestamp'] = $dbw->timestamp( $this->mAttribs['rc_timestamp'] );
+               $this->mAttribs['rc_cur_time'] = $dbw->timestamp( $this->mAttribs['rc_cur_time'] );
                $this->mAttribs['rc_id'] = $dbw->nextSequenceValue( 'recentchanges_rc_id_seq' );
 
                ## If we are using foreign keys, an entry of 0 for the page_id will fail, so use NULL
-               if( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id']==0 ) {
+               if ( $dbw->cascadingDeletes() and $this->mAttribs['rc_cur_id'] == 0 ) {
                        unset( $this->mAttribs['rc_cur_id'] );
                }
 
@@ -239,18 +263,19 @@ class RecentChange {
                }
 
                # E-mail notifications
-               if( $wgUseEnotif || $wgShowUpdatedMarker ) {
+               if ( $wgUseEnotif || $wgShowUpdatedMarker ) {
                        $editor = $this->getPerformer();
                        $title = $this->getTitle();
 
-                       if ( wfRunHooks( 'AbortEmailNotification', array($editor, $title) ) ) {
+                       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'] );
+                                       $this->mAttribs['rc_last_oldid'],
+                                       $this->mExtra['pageStatus'] );
                        }
                }
        }
@@ -258,7 +283,7 @@ class RecentChange {
        public function notifyRC2UDP() {
                global $wgRC2UDPAddress, $wgRC2UDPOmitBots;
                # Notify external application via UDP
-               if( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
+               if ( $wgRC2UDPAddress && ( !$this->mAttribs['rc_bot'] || !$wgRC2UDPOmitBots ) ) {
                        self::sendToUDP( $this->getIRCLine() );
                }
        }
@@ -279,12 +304,12 @@ class RecentChange {
                $prefix = $prefix ? $prefix : $wgRC2UDPPrefix;
                $port = $port ? $port : $wgRC2UDPPort;
                # Notify external application via UDP
-               if( $address ) {
+               if ( $address ) {
                        $conn = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
-                       if( $conn ) {
+                       if ( $conn ) {
                                $line = $prefix . $line;
                                wfDebug( __METHOD__ . ": sending UDP line: $line\n" );
-                               socket_sendto( $conn, $line, strlen($line), 0, $address, $port );
+                               socket_sendto( $conn, $line, strlen( $line ), 0, $address, $port );
                                socket_close( $conn );
                                return true;
                        } else {
@@ -315,9 +340,9 @@ class RecentChange {
 
                $change = $change instanceof RecentChange
                        ? $change
-                       : RecentChange::newFromId($change);
+                       : RecentChange::newFromId( $change );
 
-               if( !$change instanceof RecentChange ) {
+               if ( !$change instanceof RecentChange ) {
                        return null;
                }
                return $change->doMarkPatrolled( $wgUser, $auto );
@@ -336,32 +361,32 @@ class RecentChange {
                $errors = array();
                // If recentchanges patrol is disabled, only new pages
                // can be patrolled
-               if( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute('rc_type') != RC_NEW ) ) {
-                       $errors[] = array('rcpatroldisabled');
+               if ( !$wgUseRCPatrol && ( !$wgUseNPPatrol || $this->getAttribute( 'rc_type' ) != RC_NEW ) ) {
+                       $errors[] = array( 'rcpatroldisabled' );
                }
                // Automatic patrol needs "autopatrol", ordinary patrol needs "patrol"
                $right = $auto ? 'autopatrol' : 'patrol';
                $errors = array_merge( $errors, $this->getTitle()->getUserPermissionsErrors( $right, $user ) );
-               if( !wfRunHooks('MarkPatrolled', array($this->getAttribute('rc_id'), &$user, false)) ) {
-                       $errors[] = array('hookaborted');
+               if ( !wfRunHooks( 'MarkPatrolled', array( $this->getAttribute( 'rc_id' ), &$user, false ) ) ) {
+                       $errors[] = array( 'hookaborted' );
                }
                // Users without the 'autopatrol' right can't patrol their
                // own revisions
-               if( $user->getName() == $this->getAttribute('rc_user_text') && !$user->isAllowed('autopatrol') ) {
-                       $errors[] = array('markedaspatrollederror-noautopatrol');
+               if ( $user->getName() == $this->getAttribute( 'rc_user_text' ) && !$user->isAllowed( 'autopatrol' ) ) {
+                       $errors[] = array( 'markedaspatrollederror-noautopatrol' );
                }
-               if( $errors ) {
+               if ( $errors ) {
                        return $errors;
                }
                // If the change was patrolled already, do nothing
-               if( $this->getAttribute('rc_patrolled') ) {
+               if ( $this->getAttribute( 'rc_patrolled' ) ) {
                        return array();
                }
                // Actually set the 'patrolled' flag in RC
                $this->reallyMarkPatrolled();
                // Log this patrol event
                PatrolLog::record( $this, $auto, $user );
-               wfRunHooks( 'MarkPatrolledComplete', array($this->getAttribute('rc_id'), &$user, false) );
+               wfRunHooks( 'MarkPatrolledComplete', array( $this->getAttribute( 'rc_id' ), &$user, false ) );
                return array();
        }
 
@@ -377,7 +402,7 @@ class RecentChange {
                                'rc_patrolled' => 1
                        ),
                        array(
-                               'rc_id' => $this->getAttribute('rc_id')
+                               'rc_id' => $this->getAttribute( 'rc_id' )
                        ),
                        __METHOD__
                );
@@ -403,7 +428,7 @@ class RecentChange {
         * @return RecentChange
         */
        public static function notifyEdit( $timestamp, &$title, $minor, &$user, $comment, $oldId,
-               $lastTimestamp, $bot, $ip='', $oldSize=0, $newSize=0, $newId=0, $patrol=0 ) {
+               $lastTimestamp, $bot, $ip = '', $oldSize = 0, $newSize = 0, $newId = 0, $patrol = 0 ) {
                $rc = new RecentChange;
                $rc->mTitle = $title;
                $rc->mPerformer = $user;
@@ -421,10 +446,8 @@ class RecentChange {
                        'rc_this_oldid' => $newId,
                        'rc_last_oldid' => $oldId,
                        'rc_bot'        => $bot ? 1 : 0,
-                       'rc_moved_to_ns' => 0,
-                       'rc_moved_to_title' => '',
                        'rc_ip'         => self::checkIPAddress( $ip ),
-                       'rc_patrolled'  => intval($patrol),
+                       'rc_patrolled'  => intval( $patrol ),
                        'rc_new'        => 0,  # obsolete
                        'rc_old_len'    => $oldSize,
                        'rc_new_len'    => $newSize,
@@ -440,6 +463,7 @@ class RecentChange {
                        'lastTimestamp' => $lastTimestamp,
                        'oldSize'       => $oldSize,
                        'newSize'       => $newSize,
+                       'pageStatus'   => 'changed'
                );
                $rc->save();
                return $rc;
@@ -463,7 +487,7 @@ class RecentChange {
         * @return RecentChange
         */
        public static function notifyNew( $timestamp, &$title, $minor, &$user, $comment, $bot,
-               $ip='', $size=0, $newId=0, $patrol=0 ) {
+               $ip = '', $size = 0, $newId = 0, $patrol = 0 ) {
                $rc = new RecentChange;
                $rc->mTitle = $title;
                $rc->mPerformer = $user;
@@ -481,10 +505,8 @@ class RecentChange {
                        'rc_this_oldid'     => $newId,
                        'rc_last_oldid'     => 0,
                        'rc_bot'            => $bot ? 1 : 0,
-                       'rc_moved_to_ns'    => 0,
-                       'rc_moved_to_title' => '',
                        'rc_ip'             => self::checkIPAddress( $ip ),
-                       'rc_patrolled'      => intval($patrol),
+                       'rc_patrolled'      => intval( $patrol ),
                        'rc_new'            => 1, # obsolete
                        'rc_old_len'        => 0,
                        'rc_new_len'        => $size,
@@ -499,7 +521,8 @@ class RecentChange {
                        'prefixedDBkey' => $title->getPrefixedDBkey(),
                        'lastTimestamp' => 0,
                        'oldSize' => 0,
-                       'newSize' => $size
+                       'newSize' => $size,
+                       'pageStatus' => 'created'
                );
                $rc->save();
                return $rc;
@@ -521,11 +544,11 @@ class RecentChange {
         * @return bool
         */
        public static function notifyLog( $timestamp, &$title, &$user, $actionComment, $ip, $type,
-               $action, $target, $logComment, $params, $newId=0, $actionCommentIRC='' )
+               $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' )
        {
                global $wgLogRestrictions;
                # Don't add private logs to RC!
-               if( isset($wgLogRestrictions[$type]) && $wgLogRestrictions[$type] != '*' ) {
+               if ( isset( $wgLogRestrictions[$type] ) && $wgLogRestrictions[$type] != '*' ) {
                        return false;
                }
                $rc = self::newLogEntry( $timestamp, $title, $user, $actionComment, $ip, $type, $action,
@@ -550,9 +573,30 @@ class RecentChange {
         * @return RecentChange
         */
        public static function newLogEntry( $timestamp, &$title, &$user, $actionComment, $ip,
-               $type, $action, $target, $logComment, $params, $newId=0, $actionCommentIRC='' ) {
+               $type, $action, $target, $logComment, $params, $newId = 0, $actionCommentIRC = '' ) {
                global $wgRequest;
 
+               ## Get pageStatus for email notification
+               switch ( $type . '-' . $action ) {
+                       case 'delete-delete':
+                               $pageStatus = 'deleted';
+                               break;
+                       case 'move-move':
+                       case 'move-move_redir':
+                               $pageStatus = 'moved';
+                               break;
+                       case 'delete-restore':
+                               $pageStatus = 'restored';
+                               break;
+                       case 'upload-upload':
+                               $pageStatus = 'created';
+                               break;
+                       case 'upload-overwrite':
+                       default:
+                               $pageStatus = 'changed';
+                               break;
+               }
+
                $rc = new RecentChange;
                $rc->mTitle = $target;
                $rc->mPerformer = $user;
@@ -570,8 +614,6 @@ class RecentChange {
                        'rc_this_oldid' => 0,
                        'rc_last_oldid' => 0,
                        'rc_bot'        => $user->isAllowed( 'bot' ) ? $wgRequest->getBool( 'bot', true ) : 0,
-                       'rc_moved_to_ns' => 0,
-                       'rc_moved_to_title' => '',
                        'rc_ip'         => self::checkIPAddress( $ip ),
                        'rc_patrolled'  => 1,
                        'rc_new'        => 0, # obsolete
@@ -588,6 +630,7 @@ class RecentChange {
                        'prefixedDBkey' => $title->getPrefixedDBkey(),
                        'lastTimestamp' => 0,
                        'actionComment' => $actionComment, // the comment appended to the action, passed from LogPage
+                       'pageStatus'    => $pageStatus,
                        'actionCommentIRC' => $actionCommentIRC
                );
                return $rc;
@@ -600,7 +643,7 @@ class RecentChange {
         */
        public function loadFromRow( $row ) {
                $this->mAttribs = get_object_vars( $row );
-               $this->mAttribs['rc_timestamp'] = wfTimestamp(TS_MW, $this->mAttribs['rc_timestamp']);
+               $this->mAttribs['rc_timestamp'] = wfTimestamp( TS_MW, $this->mAttribs['rc_timestamp'] );
                $this->mAttribs['rc_deleted'] = $row->rc_deleted; // MUST be set
        }
 
@@ -611,7 +654,7 @@ class RecentChange {
         */
        public function loadFromCurRow( $row ) {
                $this->mAttribs = array(
-                       'rc_timestamp' => wfTimestamp(TS_MW, $row->rev_timestamp),
+                       'rc_timestamp' => wfTimestamp( TS_MW, $row->rev_timestamp ),
                        'rc_cur_time' => $row->rev_timestamp,
                        'rc_user' => $row->rev_user,
                        'rc_user_text' => $row->rev_user_text,
@@ -621,21 +664,19 @@ class RecentChange {
                        'rc_minor' => $row->rev_minor_edit ? 1 : 0,
                        'rc_type' => $row->page_is_new ? RC_NEW : RC_EDIT,
                        'rc_cur_id' => $row->page_id,
-                       'rc_this_oldid' => $row->rev_id,
-                       'rc_last_oldid' => isset($row->rc_last_oldid) ? $row->rc_last_oldid : 0,
-                       'rc_bot'        => 0,
-                       'rc_moved_to_ns'        => 0,
-                       'rc_moved_to_title'     => '',
+                       'rc_this_oldid' => $row->rev_id,
+                       'rc_last_oldid' => isset( $row->rc_last_oldid ) ? $row->rc_last_oldid : 0,
+                       'rc_bot' => 0,
                        'rc_ip' => '',
                        'rc_id' => $row->rc_id,
                        'rc_patrolled' => $row->rc_patrolled,
                        'rc_new' => $row->page_is_new, # obsolete
                        'rc_old_len' => $row->rc_old_len,
                        'rc_new_len' => $row->rc_new_len,
-                       'rc_params' => isset($row->rc_params) ? $row->rc_params : '',
-                       'rc_log_type' => isset($row->rc_log_type) ? $row->rc_log_type : null,
-                       'rc_log_action' => isset($row->rc_log_action) ? $row->rc_log_action : null,
-                       'rc_log_id' => isset($row->rc_log_id) ? $row->rc_log_id: 0,
+                       'rc_params' => isset( $row->rc_params ) ? $row->rc_params : '',
+                       'rc_log_type' => isset( $row->rc_log_type ) ? $row->rc_log_type : null,
+                       'rc_log_action' => isset( $row->rc_log_action ) ? $row->rc_log_action : null,
+                       'rc_logid' => isset( $row->rc_logid ) ? $row->rc_logid : 0,
                        'rc_deleted' => $row->rc_deleted // MUST be set
                );
        }
@@ -664,13 +705,13 @@ class RecentChange {
         * @return string
         */
        public function diffLinkTrail( $forceCur ) {
-               if( $this->mAttribs['rc_type'] == RC_EDIT ) {
-                       $trail = "curid=" . (int)($this->mAttribs['rc_cur_id']) .
-                               "&oldid=" . (int)($this->mAttribs['rc_last_oldid']);
-                       if( $forceCur ) {
+               if ( $this->mAttribs['rc_type'] == RC_EDIT ) {
+                       $trail = "curid=" . (int)( $this->mAttribs['rc_cur_id'] ) .
+                               "&oldid=" . (int)( $this->mAttribs['rc_last_oldid'] );
+                       if ( $forceCur ) {
                                $trail .= '&diff=0' ;
                        } else {
-                               $trail .= '&diff=' . (int)($this->mAttribs['rc_this_oldid']);
+                               $trail .= '&diff=' . (int)( $this->mAttribs['rc_this_oldid'] );
                        }
                } else {
                        $trail = '';
@@ -685,7 +726,7 @@ class RecentChange {
                global $wgUseRCPatrol, $wgUseNPPatrol, $wgRC2UDPInterwikiPrefix, $wgLocalInterwiki,
                        $wgCanonicalServer, $wgScript;
 
-               if( $this->mAttribs['rc_type'] == RC_LOG ) {
+               if ( $this->mAttribs['rc_type'] == RC_LOG ) {
                        // Don't use SpecialPage::getTitleFor, backwards compatibility with
                        // IRC API which expects "Log".
                        $titleObj = Title::newFromText( 'Log/' . $this->mAttribs['rc_log_type'], NS_SPECIAL );
@@ -695,11 +736,11 @@ class RecentChange {
                $title = $titleObj->getPrefixedText();
                $title = self::cleanupForIRC( $title );
 
-               if( $this->mAttribs['rc_type'] == RC_LOG ) {
+               if ( $this->mAttribs['rc_type'] == RC_LOG ) {
                        $url = '';
                } else {
                        $url = $wgCanonicalServer . $wgScript;
-                       if( $this->mAttribs['rc_type'] == RC_NEW ) {
+                       if ( $this->mAttribs['rc_type'] == RC_NEW ) {
                                $query = '?oldid=' . $this->mAttribs['rc_this_oldid'];
                        } else {
                                $query = '?diff=' . $this->mAttribs['rc_this_oldid'] . '&oldid=' . $this->mAttribs['rc_last_oldid'];
@@ -712,11 +753,11 @@ class RecentChange {
                        $url .= $query;
                }
 
-               if( $this->mAttribs['rc_old_len'] !== null && $this->mAttribs['rc_new_len'] !== null ) {
+               if ( $this->mAttribs['rc_old_len'] !== null && $this->mAttribs['rc_new_len'] !== null ) {
                        $szdiff = $this->mAttribs['rc_new_len'] - $this->mAttribs['rc_old_len'];
-                       if($szdiff < -500) {
+                       if ( $szdiff < -500 ) {
                                $szdiff = "\002$szdiff\002";
-                       } elseif($szdiff >= 0) {
+                       } elseif ( $szdiff >= 0 ) {
                                $szdiff = '+' . $szdiff ;
                        }
                        // @todo i18n with parentheses in content language?
@@ -769,13 +810,13 @@ class RecentChange {
         * @return string
         */
        public function getCharacterDifference( $old = 0, $new = 0 ) {
-               if( $old === 0 ) {
+               if ( $old === 0 ) {
                        $old = $this->mAttribs['rc_old_len'];
                }
-               if( $new === 0 ) {
+               if ( $new === 0 ) {
                        $new = $this->mAttribs['rc_new_len'];
                }
-               if( $old === null || $new === null ) {
+               if ( $old === null || $new === null ) {
                        return '';
                }
                return ChangesList::showCharacterDifference( $old, $new );
@@ -789,8 +830,9 @@ class RecentChange {
                        }
                } else {
                        $ip = $wgRequest->getIP();
-                       if( !$ip )
+                       if ( !$ip ) {
                                $ip = '';
+                       }
                }
                return $ip;
        }
index 20cc8f5..5d6bcbd 100644 (file)
  */
 class Revision implements IDBAccessObject {
        protected $mId;
+
+       /**
+        * @var int|null
+        */
        protected $mPage;
        protected $mUserText;
        protected $mOrigUserText;
@@ -38,8 +42,24 @@ class Revision implements IDBAccessObject {
        protected $mComment;
        protected $mText;
        protected $mTextRow;
+
+       /**
+        * @var null|Title
+        */
        protected $mTitle;
        protected $mCurrent;
+       protected $mContentModel;
+       protected $mContentFormat;
+
+       /**
+        * @var Content|null|bool
+        */
+       protected $mContent;
+
+       /**
+        * @var null|ContentHandler
+        */
+       protected $mContentHandler;
 
        // Revision deletion constants
        const DELETED_TEXT = 1;
@@ -83,7 +103,7 @@ class Revision implements IDBAccessObject {
         * @param $flags Integer Bitfield (optional)
         * @return Revision or null
         */
-       public static function newFromTitle( $title, $id = 0, $flags = null ) {
+       public static function newFromTitle( $title, $id = 0, $flags = 0 ) {
                $conds = array(
                        'page_namespace' => $title->getNamespace(),
                        'page_title'     => $title->getDBkey()
@@ -94,8 +114,6 @@ class Revision implements IDBAccessObject {
                } 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 self::newFromConds( $conds, (int)$flags );
        }
@@ -106,7 +124,7 @@ class Revision implements IDBAccessObject {
         * Returns null if no such revision can be found.
         *
         * $flags include:
-        *      Revision::READ_LATEST  : Select the data from the master
+        *      Revision::READ_LATEST  : Select the data from the master (since 1.20)
         *      Revision::READ_LOCKING : Select & lock the data from the master
         *
         * @param $revId Integer
@@ -114,15 +132,13 @@ class Revision implements IDBAccessObject {
         * @param $flags Integer Bitfield (optional)
         * @return Revision or null
         */
-       public static function newFromPageId( $pageId, $revId = 0, $flags = null ) {
+       public static function newFromPageId( $pageId, $revId = 0, $flags = 0 ) {
                $conds = array( 'page_id' => $pageId );
                if ( $revId ) {
                        $conds['rev_id'] = $revId;
                } 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 self::newFromConds( $conds, (int)$flags );
        }
@@ -135,9 +151,12 @@ class Revision implements IDBAccessObject {
         * @param $row
         * @param $overrides array
         *
+        * @throws MWException
         * @return Revision
         */
        public static function newFromArchiveRow( $row, $overrides = array() ) {
+               global $wgContentHandlerUseDB;
+
                $attribs = $overrides + array(
                        'page'       => isset( $row->ar_page_id ) ? $row->ar_page_id : null,
                        'id'         => isset( $row->ar_rev_id ) ? $row->ar_rev_id : null,
@@ -150,7 +169,22 @@ class Revision implements IDBAccessObject {
                        'deleted'    => $row->ar_deleted,
                        'len'        => $row->ar_len,
                        'sha1'       => isset( $row->ar_sha1 ) ? $row->ar_sha1 : null,
+                       'content_model'   => isset( $row->ar_content_model ) ? $row->ar_content_model : null,
+                       'content_format'  => isset( $row->ar_content_format ) ? $row->ar_content_format : null,
                );
+
+               if ( !$wgContentHandlerUseDB ) {
+                       unset( $attribs['content_model'] );
+                       unset( $attribs['content_format'] );
+               }
+
+               if ( !isset( $attribs['title'] )
+                       && isset( $row->ar_namespace )
+                       && isset( $row->ar_title ) ) {
+
+                       $attribs['title'] = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+               }
+
                if ( isset( $row->ar_text ) && !$row->ar_text_id ) {
                        // Pre-1.5 ar_text row
                        $attribs['text'] = self::getRevisionText( $row, 'ar_' );
@@ -358,7 +392,9 @@ class Revision implements IDBAccessObject {
         * @return array
         */
        public static function selectFields() {
-               return array(
+               global $wgContentHandlerUseDB;
+
+               $fields = array(
                        'rev_id',
                        'rev_page',
                        'rev_text_id',
@@ -370,8 +406,15 @@ class Revision implements IDBAccessObject {
                        'rev_deleted',
                        'rev_len',
                        'rev_parent_id',
-                       'rev_sha1'
+                       'rev_sha1',
                );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'rev_content_format';
+                       $fields[] = 'rev_content_model';
+               }
+
+               return $fields;
        }
 
        /**
@@ -436,6 +479,7 @@ class Revision implements IDBAccessObject {
         * Constructor
         *
         * @param $row Mixed: either a database row or an array
+        * @throws MWException
         * @access private
         */
        function __construct( $row ) {
@@ -475,6 +519,18 @@ class Revision implements IDBAccessObject {
                                $this->mTitle = null;
                        }
 
+                       if( !isset( $row->rev_content_model ) || is_null( $row->rev_content_model ) ) {
+                               $this->mContentModel = null; # determine on demand if needed
+                       } else {
+                               $this->mContentModel = strval( $row->rev_content_model );
+                       }
+
+                       if( !isset( $row->rev_content_format ) || is_null( $row->rev_content_format ) ) {
+                               $this->mContentFormat = null; # determine on demand if needed
+                       } else {
+                               $this->mContentFormat = strval( $row->rev_content_format );
+                       }
+
                        // Lazy extraction...
                        $this->mText      = null;
                        if( isset( $row->old_text ) ) {
@@ -496,6 +552,21 @@ class Revision implements IDBAccessObject {
                        // Build a new revision to be saved...
                        global $wgUser; // ugh
 
+
+                       # if we have a content object, use it to set the model and type
+                       if ( !empty( $row['content'] ) ) {
+                               //@todo: when is that set? test with external store setup! check out insertOn() [dk]
+                               if ( !empty( $row['text_id'] ) ) {
+                                       throw new MWException( "Text already stored in external store (id {$row['text_id']}), "
+                                                                                       . "can't serialize content object" );
+                               }
+
+                               $row['content_model'] = $row['content']->getModel();
+                               # note: mContentFormat is initializes later accordingly
+                               # note: content is serialized later in this method!
+                               # also set text to null?
+                       }
+
                        $this->mId        = isset( $row['id']         ) ? intval( $row['id']         ) : null;
                        $this->mPage      = isset( $row['page']       ) ? intval( $row['page']       ) : null;
                        $this->mTextId    = isset( $row['text_id']    ) ? intval( $row['text_id']    ) : null;
@@ -508,21 +579,67 @@ class Revision implements IDBAccessObject {
                        $this->mParentId  = isset( $row['parent_id']  ) ? intval( $row['parent_id']  ) : null;
                        $this->mSha1      = isset( $row['sha1']  )      ? strval( $row['sha1']  )      : null;
 
+                       $this->mContentModel   = isset( $row['content_model']  )  ? strval( $row['content_model'] )  : null;
+                       $this->mContentFormat  = isset( $row['content_format']  ) ? strval( $row['content_format'] ) : null;
+
                        // Enforce spacing trimming on supplied text
                        $this->mComment   = isset( $row['comment']    ) ?  trim( strval( $row['comment'] ) ) : null;
                        $this->mText      = isset( $row['text']       ) ? rtrim( strval( $row['text']    ) ) : null;
                        $this->mTextRow   = null;
 
-                       $this->mTitle     = null; # Load on demand if needed
+                       $this->mTitle     = isset( $row['title']      ) ? $row['title'] : null;
+
+                       // if we have a Content object, override mText and mContentModel
+                       if ( !empty( $row['content'] ) ) {
+                               if ( !( $row['content'] instanceof Content ) ) {
+                                       throw new MWException( '`content` field must contain a Content object.' );
+                               }
+
+                               $handler = $this->getContentHandler();
+                               $this->mContent = $row['content'];
+
+                               $this->mContentModel = $this->mContent->getModel();
+                               $this->mContentHandler = null;
+
+                               $this->mText = $handler->serializeContent( $row['content'], $this->getContentFormat() );
+                       } elseif ( !is_null( $this->mText ) ) {
+                               $handler = $this->getContentHandler();
+                               $this->mContent = $handler->unserializeContent( $this->mText );
+                       }
+
+                       // If we have a Title object, make sure it is consistent with mPage.
+                       if ( $this->mTitle && $this->mTitle->exists() ) {
+                               if ( $this->mPage === null ) {
+                                       // if the page ID wasn't known, set it now
+                                       $this->mPage = $this->mTitle->getArticleID();
+                               } elseif ( $this->mTitle->getArticleID() !== $this->mPage ) {
+                                       // Got different page IDs. This may be legit (e.g. during undeletion),
+                                       // but it seems worth mentioning it in the log.
+                                       wfDebug( "Page ID " . $this->mPage . " mismatches the ID "
+                                                       . $this->mTitle->getArticleID() . " provided by the Title object." );
+                               }
+                       }
+
                        $this->mCurrent   = false;
-                       # If we still have no length, see it we have the text to figure it out
+
+                       // If we still have no length, see it we have the text to figure it out
                        if ( !$this->mSize ) {
-                               $this->mSize = is_null( $this->mText ) ? null : strlen( $this->mText );
+                               if ( !is_null( $this->mContent ) ) {
+                                       $this->mSize = $this->mContent->getSize();
+                               } else {
+                                       #NOTE: this should never happen if we have either text or content object!
+                                       $this->mSize = null;
+                               }
                        }
-                       # Same for sha1
+
+                       // Same for sha1
                        if ( $this->mSha1 === null ) {
                                $this->mSha1 = is_null( $this->mText ) ? null : self::base36Sha1( $this->mText );
                        }
+
+                       // force lazy init
+                       $this->getContentModel();
+                       $this->getContentFormat();
                } else {
                        throw new MWException( 'Revision constructor passed invalid row format.' );
                }
@@ -595,7 +712,7 @@ class Revision implements IDBAccessObject {
                if( isset( $this->mTitle ) ) {
                        return $this->mTitle;
                }
-               if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL
+               if( !is_null( $this->mId ) ) { //rev_id is defined as NOT NULL, but this revision may not yet have been inserted.
                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow(
                                array( 'page', 'revision' ),
@@ -607,6 +724,11 @@ class Revision implements IDBAccessObject {
                                $this->mTitle = Title::newFromRow( $row );
                        }
                }
+
+               if ( !$this->mTitle && !is_null( $this->mPage ) && $this->mPage > 0 ) {
+                       $this->mTitle = Title::newFromID( $this->mPage );
+               }
+
                return $this->mTitle;
        }
 
@@ -789,15 +911,39 @@ class Revision implements IDBAccessObject {
         *      Revision::RAW              get the text regardless of permissions
         * @param $user User object to check for, only if FOR_THIS_USER is passed
         *              to the $audience parameter
+        *
+        * @deprecated in 1.21, use getContent() instead
+        * @todo: replace usage in core
         * @return String
         */
        public function getText( $audience = self::FOR_PUBLIC, User $user = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $content = $this->getContent( $audience, $user );
+               return ContentHandler::getContentText( $content ); # returns the raw content text, if applicable
+       }
+
+       /**
+        * Fetch revision content if it's available to the specified audience.
+        * If the specified audience does not have the ability to view this
+        * revision, null will be returned.
+        *
+        * @param $audience Integer: one of:
+        *      Revision::FOR_PUBLIC       to be displayed to all users
+        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *      Revision::RAW              get the text regardless of permissions
+        * @param $user User object to check for, only if FOR_THIS_USER is passed
+        *              to the $audience parameter
+        * @since 1.21
+        * @return Content|null
+        */
+       public function getContent( $audience = self::FOR_PUBLIC, User $user = null ) {
                if( $audience == self::FOR_PUBLIC && $this->isDeleted( self::DELETED_TEXT ) ) {
-                       return '';
+                       return null;
                } elseif( $audience == self::FOR_THIS_USER && !$this->userCan( self::DELETED_TEXT, $user ) ) {
-                       return '';
+                       return null;
                } else {
-                       return $this->getRawText();
+                       return $this->getContentInternal();
                }
        }
 
@@ -816,15 +962,116 @@ class Revision implements IDBAccessObject {
         * Fetch revision text without regard for view restrictions
         *
         * @return String
+        *
+        * @deprecated since 1.21. Instead, use Revision::getContent( Revision::RAW )
+        *                         or Revision::getSerializedData() as appropriate.
         */
        public function getRawText() {
-               if( is_null( $this->mText ) ) {
-                       // Revision text is immutable. Load on demand:
-                       $this->mText = $this->loadText();
-               }
+               ContentHandler::deprecated( __METHOD__, "1.21" );
+               return $this->getText( self::RAW );
+       }
+
+       /**
+        * Fetch original serialized data without regard for view restrictions
+        *
+        * @since 1.21
+        * @return String
+        */
+       public function getSerializedData() {
                return $this->mText;
        }
 
+       /**
+        * Gets the content object for the revision (or null on failure).
+        *
+        * Note that for mutable Content objects, each call to this method will return a
+        * fresh clone.
+        *
+        * @since 1.21
+        * @return Content|null the Revision's content, or null on failure.
+        */
+       protected function getContentInternal() {
+               if( is_null( $this->mContent ) ) {
+                       // Revision is immutable. Load on demand:
+                       if( is_null( $this->mText ) ) {
+                               $this->mText = $this->loadText();
+                       }
+
+                       if ( $this->mText !== null && $this->mText !== false ) {
+                               // Unserialize content
+                               $handler = $this->getContentHandler();
+                               $format = $this->getContentFormat();
+
+                               $this->mContent = $handler->unserializeContent( $this->mText, $format );
+                       } else {
+                               $this->mContent = false; // negative caching!
+                       }
+               }
+
+               // NOTE: copy() will return $this for immutable content objects
+               return $this->mContent ? $this->mContent->copy() : null;
+       }
+
+       /**
+        * Returns the content model for this revision.
+        *
+        * If no content model was stored in the database, $this->getTitle()->getContentModel() is
+        * used to determine the content model to use. If no title is know, CONTENT_MODEL_WIKITEXT
+        * is used as a last resort.
+        *
+        * @return String the content model id associated with this revision, see the CONTENT_MODEL_XXX constants.
+        **/
+       public function getContentModel() {
+               if ( !$this->mContentModel ) {
+                       $title = $this->getTitle();
+                       $this->mContentModel = ( $title ? $title->getContentModel() : CONTENT_MODEL_WIKITEXT );
+
+                       assert( !empty( $this->mContentModel ) );
+               }
+
+               return $this->mContentModel;
+       }
+
+       /**
+        * Returns the content format for this revision.
+        *
+        * If no content format was stored in the database, the default format for this
+        * revision's content model is returned.
+        *
+        * @return String the content format id associated with this revision, see the CONTENT_FORMAT_XXX constants.
+        **/
+       public function getContentFormat() {
+               if ( !$this->mContentFormat ) {
+                       $handler = $this->getContentHandler();
+                       $this->mContentFormat = $handler->getDefaultFormat();
+
+                       assert( !empty( $this->mContentFormat ) );
+               }
+
+               return $this->mContentFormat;
+       }
+
+       /**
+        * Returns the content handler appropriate for this revision's content model.
+        *
+        * @throws MWException
+        * @return ContentHandler
+        */
+       public function getContentHandler() {
+               if ( !$this->mContentHandler ) {
+                       $model = $this->getContentModel();
+                       $this->mContentHandler = ContentHandler::getForModelID( $model );
+
+                       $format = $this->getContentFormat();
+
+                       if ( !$this->mContentHandler->isSupportedFormat( $format ) ) {
+                               throw new MWException( "Oops, the content format $format is not supported for this content model, $model" );
+                       }
+               }
+
+               return $this->mContentHandler;
+       }
+
        /**
         * @return String
         */
@@ -1004,13 +1251,16 @@ class Revision implements IDBAccessObject {
         * number on success and dies horribly on failure.
         *
         * @param $dbw DatabaseBase: (master connection)
+        * @throws MWException
         * @return Integer
         */
        public function insertOn( $dbw ) {
-               global $wgDefaultExternalStore;
+               global $wgDefaultExternalStore, $wgContentHandlerUseDB;
 
                wfProfileIn( __METHOD__ );
 
+               $this->checkContentModel();
+
                $data = $this->mText;
                $flags = self::compressRevisionText( $data );
 
@@ -1046,27 +1296,47 @@ class Revision implements IDBAccessObject {
                $rev_id = isset( $this->mId )
                        ? $this->mId
                        : $dbw->nextSequenceValue( 'revision_rev_id_seq' );
-               $dbw->insert( 'revision',
-                       array(
-                               'rev_id'         => $rev_id,
-                               'rev_page'       => $this->mPage,
-                               'rev_text_id'    => $this->mTextId,
-                               'rev_comment'    => $this->mComment,
-                               'rev_minor_edit' => $this->mMinorEdit ? 1 : 0,
-                               'rev_user'       => $this->mUser,
-                               'rev_user_text'  => $this->mUserText,
-                               'rev_timestamp'  => $dbw->timestamp( $this->mTimestamp ),
-                               'rev_deleted'    => $this->mDeleted,
-                               'rev_len'        => $this->mSize,
-                               'rev_parent_id'  => is_null( $this->mParentId )
-                                       ? $this->getPreviousRevisionId( $dbw )
-                                       : $this->mParentId,
-                               'rev_sha1'       => is_null( $this->mSha1 )
-                                       ? self::base36Sha1( $this->mText )
-                                       : $this->mSha1
-                       ), __METHOD__
+               $row = array(
+                       'rev_id'         => $rev_id,
+                       'rev_page'       => $this->mPage,
+                       'rev_text_id'    => $this->mTextId,
+                       'rev_comment'    => $this->mComment,
+                       'rev_minor_edit' => $this->mMinorEdit ? 1 : 0,
+                       'rev_user'       => $this->mUser,
+                       'rev_user_text'  => $this->mUserText,
+                       'rev_timestamp'  => $dbw->timestamp( $this->mTimestamp ),
+                       'rev_deleted'    => $this->mDeleted,
+                       'rev_len'        => $this->mSize,
+                       'rev_parent_id'  => is_null( $this->mParentId )
+                               ? $this->getPreviousRevisionId( $dbw )
+                               : $this->mParentId,
+                       'rev_sha1'       => is_null( $this->mSha1 )
+                               ? Revision::base36Sha1( $this->mText )
+                               : $this->mSha1,
                );
 
+               if ( $wgContentHandlerUseDB ) {
+                       //NOTE: Store null for the default model and format, to save space.
+                       //XXX: Makes the DB sensitive to changed defaults. Make this behaviour optional? Only in miser mode?
+
+                       $model = $this->getContentModel();
+                       $format = $this->getContentFormat();
+
+                       $title = $this->getTitle();
+
+                       if ( $title === null ) {
+                               throw new MWException( "Insufficient information to determine the title of the revision's page!" );
+                       }
+
+                       $defaultModel = ContentHandler::getDefaultModelFor( $title );
+                       $defaultFormat = ContentHandler::getForModelID( $defaultModel )->getDefaultFormat();
+
+                       $row[ 'rev_content_model' ] = ( $model === $defaultModel ) ? null : $model;
+                       $row[ 'rev_content_format' ] = ( $format === $defaultFormat ) ? null : $format;
+               }
+
+               $dbw->insert( 'revision', $row, __METHOD__ );
+
                $this->mId = !is_null( $rev_id ) ? $rev_id : $dbw->insertId();
 
                wfRunHooks( 'RevisionInsertComplete', array( &$this, $data, $flags ) );
@@ -1075,6 +1345,52 @@ class Revision implements IDBAccessObject {
                return $this->mId;
        }
 
+       protected function checkContentModel() {
+               global $wgContentHandlerUseDB;
+
+               $title = $this->getTitle(); //note: may return null for revisions that have not yet been inserted.
+
+               $model = $this->getContentModel();
+               $format = $this->getContentFormat();
+               $handler = $this->getContentHandler();
+
+               if ( !$handler->isSupportedFormat( $format ) ) {
+                       $t = $title->getPrefixedDBkey();
+
+                       throw new MWException( "Can't use format $format with content model $model on $t" );
+               }
+
+               if ( !$wgContentHandlerUseDB && $title ) {
+                       // if $wgContentHandlerUseDB is not set, all revisions must use the default content model and format.
+
+                       $defaultModel = ContentHandler::getDefaultModelFor( $title );
+                       $defaultHandler = ContentHandler::getForModelID( $defaultModel );
+                       $defaultFormat = $defaultHandler->getDefaultFormat();
+
+                       if ( $this->getContentModel() != $defaultModel ) {
+                               $t = $title->getPrefixedDBkey();
+
+                               throw new MWException( "Can't save non-default content model with \$wgContentHandlerUseDB disabled: "
+                                                                               . "model is $model , default for $t is $defaultModel" );
+                       }
+
+                       if ( $this->getContentFormat() != $defaultFormat ) {
+                               $t = $title->getPrefixedDBkey();
+
+                               throw new MWException( "Can't use non-default content format with \$wgContentHandlerUseDB disabled: "
+                                                                               . "format is $format, default for $t is $defaultFormat" );
+                       }
+               }
+
+               $content = $this->getContent( Revision::RAW );
+
+               if ( !$content || !$content->isValid() ) {
+                       $t = $title->getPrefixedDBkey();
+
+                       throw new MWException( "Content of $t is not valid! Content model is $model" );
+               }
+       }
+
        /**
         * Get the base 36 SHA-1 value for a string of text
         * @param $text String
@@ -1088,7 +1404,7 @@ class Revision implements IDBAccessObject {
         * Lazy-load the revision's text.
         * Currently hardcoded to the 'text' table storage engine.
         *
-        * @return String
+        * @return String|bool the revision's text, or false on failure
         */
        protected function loadText() {
                wfProfileIn( __METHOD__ );
@@ -1159,12 +1475,21 @@ class Revision implements IDBAccessObject {
         * @return Revision|null on error
         */
        public static function newNullRevision( $dbw, $pageId, $summary, $minor ) {
+               global $wgContentHandlerUseDB;
+
                wfProfileIn( __METHOD__ );
 
+               $fields = array( 'page_latest', 'page_namespace', 'page_title',
+                                               'rev_text_id', 'rev_len', 'rev_sha1' );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'rev_content_model';
+                       $fields[] = 'rev_content_format';
+               }
+
                $current = $dbw->selectRow(
                        array( 'page', 'revision' ),
-                       array( 'page_latest', 'page_namespace', 'page_title',
-                               'rev_text_id', 'rev_len', 'rev_sha1' ),
+                       $fields,
                        array(
                                'page_id' => $pageId,
                                'page_latest=rev_id',
@@ -1172,7 +1497,7 @@ class Revision implements IDBAccessObject {
                        __METHOD__ );
 
                if( $current ) {
-                       $revision = new Revision( array(
+                       $row = array(
                                'page'       => $pageId,
                                'comment'    => $summary,
                                'minor_edit' => $minor,
@@ -1180,7 +1505,14 @@ class Revision implements IDBAccessObject {
                                'parent_id'  => $current->page_latest,
                                'len'        => $current->rev_len,
                                'sha1'       => $current->rev_sha1
-                               ) );
+                       );
+
+                       if ( $wgContentHandlerUseDB ) {
+                               $row[ 'content_model' ] = $current->rev_content_model;
+                               $row[ 'content_format' ] = $current->rev_content_format;
+                       }
+
+                       $revision = new Revision( $row );
                        $revision->setTitle( Title::makeTitle( $current->page_namespace, $current->page_title ) );
                } else {
                        $revision = null;
@@ -1328,4 +1660,4 @@ class Revision implements IDBAccessObject {
                }
                return true;
        }
-}
\ No newline at end of file
+}
index 224b2d1..0034afe 100644 (file)
@@ -364,14 +364,17 @@ class Sanitizer {
         * @return string
         */
        static function removeHTMLtags( $text, $processCallback = null, $args = array(), $extratags = array(), $removetags = array() ) {
-               global $wgUseTidy;
+               global $wgUseTidy, $wgHtml5, $wgAllowMicrodataAttributes, $wgAllowImageTag;
 
                static $htmlpairsStatic, $htmlsingle, $htmlsingleonly, $htmlnest, $tabletags,
                        $htmllist, $listtags, $htmlsingleallowed, $htmlelementsStatic, $staticInitialised;
 
                wfProfileIn( __METHOD__ );
 
-               if ( !$staticInitialised ) {
+               // Base our staticInitialised variable off of the global config state so that if the globals
+               // are changed (like in the secrewed up test system) we will re-initialise the settings.
+               $globalContext = implode( '-', compact( 'wgHtml5', 'wgAllowMicrodataAttributes', 'wgAllowImageTag' ) );
+               if ( !$staticInitialised || $staticInitialised != $globalContext ) {
 
                        $htmlpairsStatic = array( # Tags that must be closed
                                'b', 'bdi', 'del', 'i', 'ins', 'u', 'font', 'big', 'small', 'sub', 'sup', 'h1',
@@ -381,15 +384,22 @@ class Sanitizer {
                                'ruby', 'rt' , 'rb' , 'rp', 'p', 'span', 'abbr', 'dfn',
                                'kbd', 'samp'
                        );
+                       if ( $wgHtml5 ) {
+                               $htmlpairsStatic = array_merge( $htmlpairsStatic, array( 'data', 'time', 'mark' ) );
+                       }
                        $htmlsingle = array(
                                'br', 'hr', 'li', 'dt', 'dd'
                        );
                        $htmlsingleonly = array( # Elements that cannot have close tags
                                'br', 'hr'
                        );
+                       if ( $wgHtml5 && $wgAllowMicrodataAttributes ) {
+                               $htmlsingle[] = $htmlsingleonly[] = 'meta';
+                               $htmlsingle[] = $htmlsingleonly[] = 'link';
+                       }
                        $htmlnest = array( # Tags that can be nested--??
                                'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul',
-                               'dl', 'font', 'big', 'small', 'sub', 'sup', 'span'
+                               'li', 'dl', 'dt', 'dd', 'font', 'big', 'small', 'sub', 'sup', 'span'
                        );
                        $tabletags = array( # Can only appear inside table, we will close them
                                'td', 'th', 'tr',
@@ -401,7 +411,6 @@ class Sanitizer {
                                'li',
                        );
 
-                       global $wgAllowImageTag;
                        if ( $wgAllowImageTag ) {
                                $htmlsingle[] = 'img';
                                $htmlsingleonly[] = 'img';
@@ -416,7 +425,7 @@ class Sanitizer {
                        foreach ( $vars as $var ) {
                                $$var = array_flip( $$var );
                        }
-                       $staticInitialised = true;
+                       $staticInitialised = $globalContext;
                }
                # Populate $htmlpairs and $htmlelements with the $extratags and $removetags arrays
                $extratags = array_flip( $extratags );
@@ -510,6 +519,10 @@ class Sanitizer {
                                                } elseif ( isset( $htmlsingle[$t] ) ) {
                                                        # Hack to not close $htmlsingle tags
                                                        $brace = null;
+                                                       # Still need to push this optionally-closed tag to
+                                                       # the tag stack so that we can match end tags
+                                                       # instead of marking them as bad.
+                                                       array_push( $tagstack, $t );
                                                } elseif ( isset( $tabletags[$t] )
                                                && in_array( $t, $tagstack ) ) {
                                                        // New table tag but forgot to close the previous one
@@ -528,6 +541,10 @@ class Sanitizer {
                                                        call_user_func_array( $processCallback, array( &$params, $args ) );
                                                }
 
+                                               if ( !Sanitizer::validateTag( $params, $t ) ) {
+                                                       $badtag = true;
+                                               }
+
                                                # Strip non-approved attributes from the tag
                                                $newparams = Sanitizer::fixTagAttributes( $params, $t );
                                        }
@@ -551,16 +568,24 @@ class Sanitizer {
                                preg_match( '/^(\\/?)(\\w+)([^>]*?)(\\/{0,1}>)([^<]*)$/',
                                $x, $regs );
                                @list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
+                               $badtag = false;
                                if ( isset( $htmlelements[$t = strtolower( $t )] ) ) {
                                        if( is_callable( $processCallback ) ) {
                                                call_user_func_array( $processCallback, array( &$params, $args ) );
                                        }
+
+                                       if ( !Sanitizer::validateTag( $params, $t ) ) {
+                                               $badtag = true;
+                                       }
+
                                        $newparams = Sanitizer::fixTagAttributes( $params, $t );
-                                       $rest = str_replace( '>', '&gt;', $rest );
-                                       $text .= "<$slash$t$newparams$brace$rest";
-                               } else {
-                                       $text .= '&lt;' . str_replace( '>', '&gt;', $x);
+                                       if ( !$badtag ) {
+                                               $rest = str_replace( '>', '&gt;', $rest );
+                                               $text .= "<$slash$t$newparams$brace$rest";
+                                               continue;
+                                       }
                                }
+                               $text .= '&lt;' . str_replace( '>', '&gt;', $x);
                        }
                }
                wfProfileOut( __METHOD__ );
@@ -613,111 +638,35 @@ class Sanitizer {
        }
 
        /**
-        * Take an array of attribute names and values and fix some deprecated values
-        * for the given element type.
-        * This does not validate properties, so you should ensure that you call
-        * validateTagAttributes AFTER this to ensure that the resulting style rule
-        * this may add is safe.
+        * Takes attribute names and values for a tag and the tag name and
+        * validates that the tag is allowed to be present.
+        * This DOES NOT validate the attributes, nor does it validate the
+        * tags themselves. This method only handles the special circumstances
+        * where we may want to allow a tag within content but ONLY when it has
+        * specific attributes set.
         *
-        * - Converts most presentational attributes like align into inline css
-        *
-        * @param $attribs Array
-        * @param $element String
-        * @return Array
+        * @param $params
+        * @param $element
         */
-       static function fixDeprecatedAttributes( $attribs, $element ) {
-               global $wgHtml5, $wgCleanupPresentationalAttributes;
+       static function validateTag( $params, $element ) {
+               $params = Sanitizer::decodeTagAttributes( $params );
 
-               // presentational attributes were removed from html5, we can leave them
-               // in when html5 is turned off
-               if ( !$wgHtml5 || !$wgCleanupPresentationalAttributes ) {
-                       return $attribs;
-               }
-
-               $table = array( 'table' );
-               $cells = array( 'td', 'th' );
-               $colls = array( 'col', 'colgroup' );
-               $tblocks = array( 'tbody', 'tfoot', 'thead' );
-               $h = array( 'h1', 'h2', 'h3', 'h4', 'h5', 'h6' );
-
-               $presentationalAttribs = array(
-                       'align' => array( 'text-align', array_merge( array( 'caption', 'hr', 'div', 'p', 'tr' ), $table, $cells, $colls, $tblocks, $h ) ),
-                       'clear' => array( 'clear', array( 'br' ) ),
-                       'height' => array( 'height', $cells ),
-                       'nowrap' => array( 'white-space', $cells ),
-                       'size' => array( 'height', array( 'hr' ) ),
-                       'type' => array( 'list-style-type', array( 'li', 'ol', 'ul' ) ),
-                       'valign' => array( 'vertical-align', array_merge( $cells, $colls, $tblocks ) ),
-                       'width' => array( 'width', array_merge( array( 'hr', 'pre' ), $table, $cells, $colls ) ),
-               );
-
-               // Ensure that any upper case or mixed case attributes are converted to lowercase
-               foreach ( $attribs as $attribute => $value ) {
-                       if ( $attribute !== strtolower( $attribute ) && array_key_exists( strtolower( $attribute ), $presentationalAttribs ) ) {
-                               $attribs[strtolower( $attribute )] = $value;
-                               unset( $attribs[$attribute] );
+               if ( $element == 'meta' || $element == 'link' ) {
+                       if ( !isset( $params['itemprop'] ) ) {
+                               // <meta> and <link> must have an itemprop="" otherwise they are not valid or safe in content
+                               return false;
                        }
-               }
-
-               $style = "";
-               foreach ( $presentationalAttribs as $attribute => $info ) {
-                       list( $property, $elements ) = $info;
-
-                       // Skip if this attribute is not relevant to this element
-                       if ( !in_array( $element, $elements ) ) {
-                               continue;
+                       if ( $element == 'meta' && !isset( $params['content'] ) ) {
+                               // <meta> must have a content="" for the itemprop
+                               return false;
                        }
-
-                       // Skip if the attribute is not used
-                       if ( !array_key_exists( $attribute, $attribs ) ) {
-                               continue;
-                       }
-
-                       $value = $attribs[$attribute];
-
-                       // For nowrap the value should be nowrap instead of whatever text is in the value
-                       if ( $attribute === 'nowrap' ) {
-                               $value = 'nowrap';
-                       }
-
-                       // clear="all" is clear: both; in css
-                       if ( $attribute === 'clear' && strtolower( $value ) === 'all' ) {
-                               $value = 'both';
+                       if ( $element == 'link' && !isset( $params['href'] ) ) {
+                               // <link> must have an associated href=""
+                               return false;
                        }
-
-                       // Size based properties should have px applied to them if they have no unit
-                       if ( in_array( $attribute, array( 'height', 'width', 'size' ) ) ) {
-                               if ( preg_match( '/^[\d.]+$/', $value ) ) {
-                                       $value = "{$value}px";
-                               }
-                       }
-
-                       // Table align is special, it's about block alignment instead of
-                       // content align (see also bug 40306)
-                       if ( $attribute === 'align' && in_array( $element, $table ) ) {
-                               if ( $value === 'center' ) {
-                                       $style .= ' margin-left: auto;';
-                                       $property = 'margin-right';
-                                       $value = 'auto';
-                               } else {
-                                       $property = 'float';
-                               }
-                       }
-
-                       $style .= " $property: $value;";
-
-                       unset( $attribs[$attribute] );
-               }
-
-               if ( $style ) {
-                       // Prepend our style rules so that they can be overridden by user css
-                       if ( isset($attribs['style']) ) {
-                               $style .= " " . $attribs['style'];
-                       }
-                       $attribs['style'] = trim($style);
                }
 
-               return $attribs;
+               return true;
        }
 
        /**
@@ -821,7 +770,7 @@ class Sanitizer {
                                unset( $out['itemid'] );
                                unset( $out['itemref'] );
                        }
-                       # TODO: Strip itemprop if we aren't descendants of an itemscope.
+                       # TODO: Strip itemprop if we aren't descendants of an itemscope or pointed to by an itemref.
                }
                return $out;
        }
@@ -912,7 +861,7 @@ class Sanitizer {
                // Reject problematic keywords and control characters
                if ( preg_match( '/[\000-\010\016-\037\177]/', $value ) ) {
                        return '/* invalid control char */';
-               } elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( !ix', $value ) ) {
+               } elseif ( preg_match( '! expression | filter\s*: | accelerator\s*: | url\s*\( | image\s*\( | image-set\s*\( !ix', $value ) ) {
                        return '/* insecure input */';
                }
                return $value;
@@ -968,7 +917,6 @@ class Sanitizer {
                }
 
                $decoded = Sanitizer::decodeTagAttributes( $text );
-               $decoded = Sanitizer::fixDeprecatedAttributes( $decoded, $element );
                $stripped = Sanitizer::validateTagAttributes( $decoded, $element );
 
                $attribs = array();
@@ -1183,6 +1131,7 @@ class Sanitizer {
         * attribs regex matches.
         *
         * @param $set Array
+        * @throws MWException
         * @return String
         */
        private static function getTagAttributeCallback( $set ) {
@@ -1446,10 +1395,7 @@ class Sanitizer {
         * @return Array
         */
        static function attributeWhitelist( $element ) {
-               static $list;
-               if( !isset( $list ) ) {
-                       $list = Sanitizer::setupAttributeWhitelist();
-               }
+               $list = Sanitizer::setupAttributeWhitelist();
                return isset( $list[$element] )
                        ? $list[$element]
                        : array();
@@ -1463,6 +1409,13 @@ class Sanitizer {
        static function setupAttributeWhitelist() {
                global $wgAllowRdfaAttributes, $wgHtml5, $wgAllowMicrodataAttributes;
 
+               static $whitelist, $staticInitialised;
+               $globalContext = implode( '-', compact( 'wgAllowRdfaAttributes', 'wgHtml5', 'wgAllowMicrodataAttributes' ) );
+
+               if ( isset( $whitelist ) && $staticInitialised == $globalContext ) {
+                       return $whitelist;
+               }
+
                $common = array( 'id', 'class', 'lang', 'dir', 'title', 'style' );
 
                if ( $wgAllowRdfaAttributes ) {
@@ -1495,7 +1448,7 @@ class Sanitizer {
 
                # Numbers refer to sections in HTML 4.01 standard describing the element.
                # See: http://www.w3.org/TR/html4/
-               $whitelist = array (
+               $whitelist = array(
                        # 7.5.4
                        'div'        => $block,
                        'center'     => $common, # deprecated
@@ -1627,7 +1580,28 @@ class Sanitizer {
                        # HTML 5 section 4.6
                        'bdi' => $common,
 
+               );
+
+               if ( $wgHtml5 ) {
+                       # HTML5 elements, defined by:
+                       # http://www.whatwg.org/specs/web-apps/current-work/multipage/
+                       $whitelist += array(
+                               'data' => array_merge( $common, array( 'value' ) ),
+                               'time' => array_merge( $common, array( 'datetime' ) ),
+                               'mark' => $common,
+
+                               // meta and link are only permitted by removeHTMLtags when Microdata
+                               // is enabled so we don't bother adding a conditional to hide these
+                               // Also meta and link are only valid in WikiText as Microdata elements
+                               // (ie: validateTag rejects tags missing the attributes needed for Microdata)
+                               // So we don't bother including $common attributes that have no purpose.
+                               'meta' => array( 'itemprop', 'content' ),
+                               'link' => array( 'itemprop', 'href' ),
                        );
+               }
+
+               $staticInitialised = $globalContext;
+
                return $whitelist;
        }
 
index 7b98568..0e4decf 100644 (file)
@@ -38,7 +38,7 @@ $cookieName = $cookiePrefix . 'Selenium';
 // this is a fallback SQL file
 $testSqlFile = false;
 $testImageZip = false;
-       
+
 // if we find a request parameter containing the test name, set a cookie with the test name
 if ( isset( $_GET['setupTestSuite'] ) ) {
        $setupTestSuiteName = $_GET['setupTestSuite'];
@@ -62,7 +62,7 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
                        true
                );
        }
-       
+
        $testIncludes = array(); // array containing all the includes needed for this test
        $testGlobalConfigs = array(); // an array containg all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
@@ -72,11 +72,11 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
        if ( isset( $testResourceFiles['images'] ) ) {
                $testImageZip = $testResourceFiles['images'];
        }
-       
+
        if ( isset( $testResourceFiles['db'] ) ) {
                $testSqlFile = $testResourceFiles['db'];
                $testResourceName = getTestResourceNameFromTestSuiteName( $setupTestSuiteName );
-       
+
                switchToTestResources( $testResourceName, false ); // false means do not switch database yet
                setupTestResources( $testResourceName, $testSqlFile, $testImageZip );
        }
@@ -86,7 +86,7 @@ if ( isset( $_GET['setupTestSuite'] ) ) {
 if ( isset( $_GET['clearTestSuite'] ) ) {
        $testSuiteName = getTestSuiteNameFromCookie( $cookieName );
 
-       $expire = time() - 600; 
+       $expire = time() - 600;
        setcookie(
                $cookieName,
                '',
@@ -96,22 +96,22 @@ if ( isset( $_GET['clearTestSuite'] ) ) {
                $wgCookieSecure,
                true
        );
-       
+
        $testResourceName = getTestResourceNameFromTestSuiteName( $testSuiteName );
        teardownTestResources( $testResourceName );
 }
 
 // if a cookie is found, run the appropriate callback to get the config params.
-if ( isset( $_COOKIE[$cookieName] ) ) {                
+if ( isset( $_COOKIE[$cookieName] ) ) {
        $testSuiteName = getTestSuiteNameFromCookie( $cookieName );
        if ( !isset( $wgSeleniumTestConfigs[$testSuiteName] ) ) {
                return;
        }
-       
+
        $testIncludes = array(); // array containing all the includes needed for this test
        $testGlobalConfigs = array(); // an array containg all the global configs needed for this test
        $testResourceFiles = array(); // an array containing all the resource files needed for this test
-       $callback = $wgSeleniumTestConfigs[$testSuiteName]; 
+       $callback = $wgSeleniumTestConfigs[$testSuiteName];
        call_user_func_array( $callback, array( &$testIncludes, &$testGlobalConfigs, &$testResourceFiles));
 
        if ( isset( $testResourceFiles['db'] ) ) {
@@ -123,9 +123,8 @@ if ( isset( $_COOKIE[$cookieName] ) ) {
                require_once( $file );
        }
        foreach ( $testGlobalConfigs as $key => $value ) {
-               if ( is_array( $value ) ) {             
+               if ( is_array( $value ) ) {
                        $GLOBALS[$key] = array_merge( $GLOBALS[$key], $value );
-                       
                } else {
                        $GLOBALS[$key] = $value;
                }
@@ -166,7 +165,7 @@ function setupTestResources( $testResourceName, $testSqlFile, $testImageZip ) {
        if ( $testResourceName == '' ) {
                die( 'Cannot identify a test the resources should be installed for.' );
        }
-       
+
        // create tables
        $dbw = wfGetDB( DB_MASTER );
        $dbw->query( 'DROP DATABASE IF EXISTS ' . $testResourceName );
index 924c3c0..83ca516 100644 (file)
@@ -317,12 +317,6 @@ if ( $wgUseFileCache || $wgUseSquid ) {
        $wgDebugToolbar = false;
 }
 
-# $wgAllowRealName and $wgAllowUserSkin were removed in 1.16
-# in favor of $wgHiddenPrefs, handle b/c here
-if ( !$wgAllowRealName ) {
-       $wgHiddenPrefs[] = 'realname';
-}
-
 # Doesn't make sense to have if disabled.
 if ( !$wgEnotifMinorEdits ) {
        $wgHiddenPrefs[] = 'enotifminoredits';
@@ -369,7 +363,7 @@ if ( $wgNewUserLog ) {
 }
 
 if ( $wgCookieSecure === 'detect' ) {
-       $wgCookieSecure = ( WebRequest::detectProtocol() === 'https:' );
+       $wgCookieSecure = ( WebRequest::detectProtocol() === 'https' );
 }
 
 // Disable MWDebug for command line mode, this prevents MWDebug from eating up
index 968f215..4889863 100644 (file)
@@ -73,7 +73,7 @@ abstract class Skin extends ContextSource {
                return $wgValidSkinNames;
        }
 
-       /**
+       /**
         * Fetch the skinname messages for available skins.
         * @return array of strings
         */
@@ -290,8 +290,8 @@ abstract class Skin extends ContextSource {
                        return $this->mRelevantUser;
                }
                $title = $this->getRelevantTitle();
-               if( $title->getNamespace() == NS_USER || $title->getNamespace() == NS_USER_TALK ) {
-                       $rootUser = strtok( $title->getText(), '/' );
+               if( $title->hasSubjectNamespace( NS_USER ) ) {
+                       $rootUser = $title->getRootText();
                        if ( User::isIP( $rootUser ) ) {
                                $this->mRelevantUser = User::newFromName( $rootUser, false );
                        } else {
@@ -1132,7 +1132,23 @@ abstract class Skin extends ContextSource {
        }
 
        /**
-        * Build an array that represents the sidebar(s), the navigation bar among them
+        * Build an array that represents the sidebar(s), the navigation bar among them.
+        *
+        * BaseTemplate::getSidebar can be used to simplify the format and id generation in new skins.
+        *
+        * The format of the returned array is array( heading => content, ... ), where:
+        * - heading is the heading of a navigation portlet. It is either:
+        *   - magic string to be handled by the skins ('SEARCH' / 'LANGUAGES' / 'TOOLBOX' / ...)
+        *   - a message name (e.g. 'navigation'), the message should be HTML-escaped by the skin
+        *   - plain text, which should be HTML-escaped by the skin
+        * - content is the contents of the portlet. It is either:
+        *   - HTML text (<ul><li>...</li>...</ul>)
+        *   - array of link data in a format accepted by BaseTemplate::makeListItem()
+        *   - (for a magic string as a key, any value)
+        *
+        * Note that extensions can control the sidebar contents using the SkinBuildSidebar hook
+        * and can technically insert anything in here; skin creators are expected to handle
+        * values described above.
         *
         * @return array
         */
@@ -1536,6 +1552,7 @@ abstract class Skin extends ContextSource {
         *
         * @param $fname String Name of called method
         * @param $args Array Arguments to the method
+        * @throws MWException
         * @return mixed
         */
        function __call( $fname, $args ) {
index bda4395..da4af61 100644 (file)
@@ -398,7 +398,7 @@ class SkinTemplate extends Skin {
                # not for special pages or file pages AND only when viewing AND if the page exists
                # (or is in MW namespace, because that has default content)
                if ( !in_array( $title->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) &&
-                       in_array( $request->getVal( 'action', 'view' ), array( 'view', 'historysubmit' ) ) &&
+                       Action::getActionName( $this ) === 'view' &&
                        ( $title->exists() || $title->getNamespace() == NS_MEDIAWIKI ) ) {
                        $pageLang = $title->getPageViewLanguage();
                        $realBodyAttribs['lang'] = $pageLang->getHtmlCode();
@@ -423,7 +423,7 @@ class SkinTemplate extends Skin {
                                        if ( strval( $ilLangName ) === '' ) {
                                                $ilLangName = $l;
                                        } else {
-                                               $ilLangName = $this->getLanguage()->ucfirst( $ilLangName );
+                                               $ilLangName = $this->formatLanguageName( $ilLangName );
                                        }
                                        $language_urls[] = array(
                                                'href' => $nt->getFullURL(),
@@ -498,6 +498,18 @@ class SkinTemplate extends Skin {
                wfProfileOut( __METHOD__ );
        }
 
+       /**
+        * Format language name for use in sidebar interlanguage links list.
+        * By default it is capitalized.
+        *
+        * @param $name string Language name, e.g. "English" or "español"
+        * @return string
+        * @private
+        */
+       function formatLanguageName( $name ) {
+               return $this->getLanguage()->ucfirst( $name );
+       }
+
        /**
         * Output the string, or print error message if it's
         * an error object of the appropriate type.
@@ -529,6 +541,8 @@ class SkinTemplate extends Skin {
         * @return array
         */
        protected function buildPersonalUrls() {
+               global $wgSecureLogin;
+
                $title = $this->getTitle();
                $request = $this->getRequest();
                $pageurl = $title->getLocalURL();
@@ -541,7 +555,11 @@ class SkinTemplate extends Skin {
                # $this->getTitle() will just give Special:Badtitle, which is
                # not especially useful as a returnto parameter. Use the title
                # from the request instead, if there was one.
-               $page = Title::newFromURL( $request->getVal( 'title', '' ) );
+               if ( $this->getUser()->isAllowed( 'read' ) ) {
+                       $page = $this->getTitle();
+               } else {
+                       $page = Title::newFromText( $request->getVal( 'title', '' ) );
+               }
                $page = $request->getVal( 'returnto', $page );
                $a = array();
                if ( strval( $page ) !== '' ) {
@@ -551,6 +569,11 @@ class SkinTemplate extends Skin {
                                $a['returntoquery'] = $query;
                        }
                }
+
+               if ( $wgSecureLogin && $request->detectProtocol() === 'https' ) {
+                       $a['wpStickHTTPS'] = true;
+               }
+
                $returnto = wfArrayToCGI( $a );
                if( $this->loggedin ) {
                        $personal_urls['userpage'] = array(
@@ -620,7 +643,6 @@ 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';
@@ -1130,6 +1152,7 @@ class SkinTemplate extends Skin {
 
                $nav_urls['print'] = false;
                $nav_urls['permalink'] = false;
+               $nav_urls['info'] = false;
                $nav_urls['whatlinkshere'] = false;
                $nav_urls['recentchangeslinked'] = false;
                $nav_urls['contributions'] = false;
@@ -1166,6 +1189,12 @@ class SkinTemplate extends Skin {
                        $nav_urls['whatlinkshere'] = array(
                                'href' => SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage )->getLocalUrl()
                        );
+
+                       $nav_urls['info'] = array(
+                               'text' => $this->msg( 'pageinfo-toolboxlink' )->text(),
+                               'href' => $this->getTitle()->getLocalURL( "action=info" )
+                       );
+
                        if ( $this->getTitle()->getArticleID() ) {
                                $nav_urls['recentchangeslinked'] = array(
                                        'href' => SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage )->getLocalUrl()
@@ -1178,6 +1207,7 @@ class SkinTemplate extends Skin {
                        $rootUser = $user->getName();
 
                        $nav_urls['contributions'] = array(
+                               'text' => $this->msg( 'contributions', $rootUser )->text(),
                                'href' => self::makeSpecialUrlSubpage( 'Contributions', $rootUser )
                        );
 
@@ -1225,7 +1255,7 @@ abstract class QuickTemplate {
        /**
         * Constructor
         */
-       public function QuickTemplate() {
+       function __construct() {
                $this->data = array();
                $this->translator = new MediaWiki_I18N();
        }
@@ -1417,6 +1447,11 @@ abstract class BaseTemplate extends QuickTemplate {
                                $toolbox['permalink']['id'] = 't-permalink';
                        }
                }
+               if ( isset( $this->data['nav_urls']['info'] ) && $this->data['nav_urls']['info'] ) {
+                       $toolbox['info'] = $this->data['nav_urls']['info'];
+                       $toolbox['info']['id'] = 't-info';
+               }
+
                wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) );
                wfProfileOut( __METHOD__ );
                return $toolbox;
@@ -1720,7 +1755,7 @@ abstract class BaseTemplate extends QuickTemplate {
                        foreach ( array( 'id', 'class', 'active', 'tag' ) as $k ) {
                                unset( $link[$k] );
                        }
-                       if ( isset( $item['id'] ) ) {
+                       if ( isset( $item['id'] ) && !isset( $item['single-id'] ) ) {
                                // The id goes on the <li> not on the <a> for single links
                                // but makeSidebarLink still needs to know what id to use when
                                // generating tooltips and accesskeys.
@@ -1783,11 +1818,15 @@ abstract class BaseTemplate extends QuickTemplate {
                                );
                                unset( $buttonAttrs['src'] );
                                unset( $buttonAttrs['alt'] );
+                               unset( $buttonAttrs['width'] );
+                               unset( $buttonAttrs['height'] );
                                $imgAttrs = array(
                                        'src' => $attrs['src'],
                                        'alt' => isset( $attrs['alt'] )
                                                ? $attrs['alt']
                                                : $this->translator->translate( 'searchbutton' ),
+                                       'width' => isset( $attrs['width'] ) ? $attrs['width'] : null,
+                                       'height' => isset( $attrs['height'] ) ? $attrs['height'] : null,
                                );
                                return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) );
                        default:
index 2e5e02b..67aa2b3 100644 (file)
@@ -105,19 +105,6 @@ class SpecialPage {
                return SpecialPageFactory::resolveAlias( $alias );
        }
 
-       /**
-        * Add a page to the list of valid special pages. This used to be the preferred
-        * method for adding special pages in extensions. It's now suggested that you add
-        * an associative record to $wgSpecialPages. This avoids autoloading SpecialPage.
-        *
-        * @param $page SpecialPage
-        * @deprecated since 1.7, warnings in 1.17, might be removed in 1.20
-        */
-       static function addPage( &$page ) {
-               wfDeprecated( __METHOD__, '1.7' );
-               SpecialPageFactory::getList()->{$page->mName} = $page;
-       }
-
        /**
         * Add a page to a certain display group for Special:SpecialPages
         *
@@ -267,6 +254,7 @@ class SpecialPage {
         *
         * @param $name String
         * @param $subpage String|Bool subpage string, or false to not use a subpage
+        * @throws MWException
         * @return Title object
         */
        public static function getTitleFor( $name, $subpage = false ) {
@@ -363,6 +351,7 @@ class SpecialPage {
         *
         * @param $fName String Name of called method
         * @param $a Array Arguments to the method
+        * @throws MWException
         * @deprecated since 1.17, call parent::__construct()
         */
        public function __call( $fName, $a ) {
@@ -524,6 +513,19 @@ class SpecialPage {
                return false;
        }
 
+       /**
+        * Is this page cached?
+        * Expensive pages are cached or disabled in miser mode.
+        * Used by QueryPage and subclasses, moved here so that
+        * Special:SpecialPages can safely call it for all special pages.
+        *
+        * @return Boolean
+        * @since 1.21
+        */
+       public function isCached() {
+               return false;
+       }
+
        /**
         * Can be overridden by subclasses with more complicated permissions
         * schemes.
@@ -532,9 +534,8 @@ class SpecialPage {
         *   pages?
         */
        public function isRestricted() {
-               global $wgGroupPermissions;
                // DWIM: If all anons can do something, then it is not restricted
-               return $this->mRestriction != '' && empty( $wgGroupPermissions['*'][$this->mRestriction] );
+               return $this->mRestriction != '' && !User::groupHasPermission( '*', $this->mRestriction );
        }
 
        /**
@@ -945,8 +946,8 @@ abstract class FormSpecialPage extends SpecialPage {
         * Called from execute() to check if the given user can perform this action.
         * Failures here must throw subclasses of ErrorPageError.
         * @param $user User
+        * @throws UserBlockedError
         * @return Bool true
-        * @throws ErrorPageError
         */
        protected function checkExecutePermissions( User $user ) {
                $this->checkPermissions();
@@ -1029,14 +1030,12 @@ abstract class RedirectSpecialPage extends UnlistedSpecialPage {
                if ( $redirect instanceof Title ) {
                        $url = $redirect->getFullUrl( $query );
                        $this->getOutput()->redirect( $url );
-                       wfProfileOut( __METHOD__ );
                        return $redirect;
                // Redirect to index.php with query parameters
                } elseif ( $redirect === true ) {
                        global $wgScript;
                        $url = $wgScript . '?' . wfArrayToCGI( $query );
                        $this->getOutput()->redirect( $url );
-                       wfProfileOut( __METHOD__ );
                        return $redirect;
                } else {
                        $class = __CLASS__;
@@ -1221,7 +1220,7 @@ abstract class RedirectSpecialArticle extends RedirectSpecialPage {
                        'ctype', 'maxage', 'smaxage',
                );
 
-               wfRunHooks( "RedirectSpecialArticleRedirectParams", array(&$redirectParams) );
+               wfRunHooks( "RedirectSpecialArticleRedirectParams", array( &$redirectParams ) );
                $this->mAllowedRedirectParams = $redirectParams;
        }
 }
index 95f75a8..fa1bca4 100644 (file)
@@ -155,7 +155,6 @@ class SpecialPageFactory {
                'Blankpage'                 => 'SpecialBlankpage',
                'Blockme'                   => 'SpecialBlockme',
                'Emailuser'                 => 'SpecialEmailUser',
-               'JavaScriptTest'            => 'SpecialJavaScriptTest',
                'Movepage'                  => 'MovePageForm',
                'Mycontributions'           => 'SpecialMycontributions',
                'Mypage'                    => 'SpecialMypage',
@@ -178,7 +177,7 @@ class SpecialPageFactory {
        static function getList() {
                global $wgSpecialPages;
                global $wgDisableCounters, $wgDisableInternalSearch, $wgEmailAuthentication;
-               global $wgEnableEmail;
+               global $wgEnableEmail, $wgEnableJavaScriptTest;
 
                if ( !is_object( self::$mList ) ) {
                        wfProfileIn( __METHOD__ );
@@ -200,6 +199,10 @@ class SpecialPageFactory {
                                self::$mList['ChangeEmail'] = 'SpecialChangeEmail';
                        }
 
+                       if( $wgEnableJavaScriptTest ) {
+                               self::$mList['JavaScriptTest'] = 'SpecialJavaScriptTest';
+                       }
+
                        // Add extension special pages
                        self::$mList = array_merge( self::$mList, $wgSpecialPages );
 
@@ -368,13 +371,17 @@ class SpecialPageFactory {
                        global $wgUser;
                        $user = $wgUser;
                }
+               $context = RequestContext::newExtraneousContext( Title::newMainPage() );
+               $context->setUser( $user );
                foreach ( self::getList() as $name => $rec ) {
                        $page = self::getPage( $name );
-                       if ( $page // not null
-                               && $page->isListed()
-                               && ( !$page->isRestricted() || $page->userCanExecute( $user ) )
-                       ) {
-                               $pages[$name] = $page;
+                       if ( $page ) { // not null
+                               $page->setContext( $context );
+                               if ( $page->isListed()
+                                       && ( !$page->isRestricted() || $page->userCanExecute( $user ) )
+                               ) {
+                                       $pages[$name] = $page;
+                               }
                        }
                }
                return $pages;
index 52c9be0..d0ead9a 100644 (file)
@@ -95,7 +95,7 @@ abstract class SqlDataUpdate extends DataUpdate {
         * Abort the database transaction started via beginTransaction (if any).
         */
        public function abortTransaction() {
-               if ( $this->mHasTransaction ) {
+               if ( $this->mHasTransaction ) { //XXX: actually... maybe always?
                        $this->mDb->rollback( get_class( $this ) . '::abortTransaction' );
                        $this->mHasTransaction = false;
                }
@@ -108,8 +108,8 @@ abstract class SqlDataUpdate extends DataUpdate {
         * @param $namespace Integer
         * @param $dbkeys Array
         */
-       protected function invalidatePages( $namespace, Array $dbkeys ) {
-               if ( !count( $dbkeys ) ) {
+       protected function invalidatePages( $namespace, array $dbkeys ) {
+               if ( $dbkeys === array() ) {
                        return;
                }
 
@@ -127,10 +127,12 @@ abstract class SqlDataUpdate extends DataUpdate {
                                'page_touched < ' . $this->mDb->addQuotes( $now )
                        ), __METHOD__
                );
+
                foreach ( $res as $row ) {
                        $ids[] = $row->page_id;
                }
-               if ( !count( $ids ) ) {
+
+               if ( $ids === array() ) {
                        return;
                }
 
index 8eb0f6b..7d75f2c 100644 (file)
@@ -21,9 +21,9 @@
  */
 
 /**
- * An HTTP 1.0 client built for the purposes of purging Squid and Varnish. 
- * Uses asynchronous I/O, allowing purges to be done in a highly parallel 
- * manner. 
+ * An HTTP 1.0 client built for the purposes of purging Squid and Varnish.
+ * Uses asynchronous I/O, allowing purges to be done in a highly parallel
+ * manner.
  *
  * Could be replaced by curl_multi_exec() or some such.
  */
@@ -123,7 +123,7 @@ class SquidPurgeClient {
                return array( $socket );
        }
 
-       /** 
+       /**
         * Get the host's IP address.
         * Does not support IPv6 at present due to the lack of a convenient interface in PHP.
         */
@@ -176,11 +176,32 @@ class SquidPurgeClient {
         * @param $url string
         */
        public function queuePurge( $url ) {
+               global $wgSquidPurgeUseHostHeader;
                $url = SquidUpdate::expand( str_replace( "\n", '', $url ) );
-               $this->requests[] = "PURGE $url HTTP/1.0\r\n" .
-                       "Connection: Keep-Alive\r\n" .
-                       "Proxy-Connection: Keep-Alive\r\n" .
-                       "User-Agent: " . Http::userAgent() . ' ' . __CLASS__ . "\r\n\r\n";
+               $request = array();
+               if ( $wgSquidPurgeUseHostHeader ) {
+                       $url = wfParseUrl( $url );
+                       $host = $url['host'];
+                       if ( isset( $url['port'] ) && strlen( $url['port'] ) > 0 ) {
+                               $host .= ":" . $url['port'];
+                       }
+                       $path = $url['path'];
+                       if ( isset( $url['query'] ) && is_string( $url['query'] ) ) {
+                               $path = wfAppendQuery( $path, $url['query'] );
+                       }
+                       $request[] = "PURGE $path HTTP/1.1";
+                       $request[] = "Host: $host";
+               } else {
+                       $request[] = "PURGE $url HTTP/1.0";
+               }
+               $request[] = "Connection: Keep-Alive";
+               $request[] = "Proxy-Connection: Keep-Alive";
+               $request[] = "User-Agent: " . Http::userAgent() . ' ' . __CLASS__;
+               // Two ''s to create \r\n\r\n
+               $request[] = '';
+               $request[] = '';
+
+               $this->requests[] = implode( "\r\n", $request );
                if ( $this->currentRequestIndex === null ) {
                        $this->nextRequest();
                }
@@ -408,7 +429,7 @@ class SquidPurgeClientPool {
                        $numReady = socket_select( $readSockets, $writeSockets, $exceptSockets, $timeout );
                        wfRestoreWarnings();
                        if ( $numReady === false ) {
-                               wfDebugLog( 'squid', __METHOD__.': Error in stream_select: ' . 
+                               wfDebugLog( 'squid', __METHOD__.': Error in stream_select: ' .
                                        socket_strerror( socket_last_error() ) . "\n" );
                                break;
                        }
index 10dfb51..2553f54 100644 (file)
@@ -47,7 +47,7 @@ class Status {
        /**
         * Factory function for fatal errors
         *
-        * @param $message String: message name
+        * @param $message String|Message: message name or object
         * @return Status
         */
        static function newFatal( $message /*, parameters...*/ ) {
@@ -103,7 +103,7 @@ class Status {
        /**
         * Add a new warning
         *
-        * @param $message String: message name
+        * @param $message String|Message: message name or object
         */
        function warning( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -117,7 +117,7 @@ class Status {
         * Add an error, do not set fatal flag
         * This can be used for non-fatal errors
         *
-        * @param $message String: message name
+        * @param $message String|Message: message name or object
         */
        function error( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -131,7 +131,7 @@ class Status {
         * Add an error and set OK to false, indicating that the operation
         * as a whole was fatal
         *
-        * @param $message String: message name
+        * @param $message String|Message: message name or object
         */
        function fatal( $message /*, parameters... */ ) {
                $params = array_slice( func_get_args(), 1 );
@@ -183,7 +183,7 @@ class Status {
                        }
                }
                if ( count( $this->errors ) == 1 ) {
-                       $s = $this->getWikiTextForError( $this->errors[0], $this->errors[0]  );
+                       $s = $this->getErrorMessage( $this->errors[0] );
                        if ( $shortContext ) {
                                $s = wfMessage( $shortContext, $s )->plain();
                        } elseif ( $longContext ) {
@@ -191,7 +191,7 @@ class Status {
                        }
                } else {
                        $s = '* '. implode("\n* ",
-                               $this->getWikiTextArray( $this->errors ) ) . "\n";
+                               $this->getErrorMessageArray( $this->errors ) ) . "\n";
                        if ( $longContext ) {
                                $s = wfMessage( $longContext, $s )->plain();
                        } elseif ( $shortContext ) {
@@ -202,7 +202,7 @@ class Status {
        }
 
        /**
-        * Return the wiki text for a single error.
+        * Return the message for a single error.
         * @param $error Mixed With an array & two values keyed by
         * 'message' and 'params', use those keys-value pairs.
         * Otherwise, if its an array, just use the first value as the
@@ -210,19 +210,31 @@ class Status {
         *
         * @return String
         */
-       protected function getWikiTextForError( $error ) {
+       protected function getErrorMessage( $error ) {
                if ( is_array( $error ) ) {
-                       if ( isset( $error['message'] ) && isset( $error['params'] ) ) {
-                               return wfMessage( $error['message'],
-                                       array_map( 'wfEscapeWikiText', $this->cleanParams( $error['params'] ) )  )->plain();
+                       if( isset( $error['message'] ) && $error['message'] instanceof Message ) {
+                               $msg = $error['message'];
+                       } elseif ( isset( $error['message'] ) && isset( $error['params'] ) ) {
+                               $msg = wfMessage( $error['message'],
+                                       array_map( 'wfEscapeWikiText', $this->cleanParams( $error['params'] ) )  );
                        } else {
-                               $message = array_shift($error);
-                               return wfMessage( $message,
-                                       array_map( 'wfEscapeWikiText', $this->cleanParams( $error ) ) )->plain();
+                               $msgName = array_shift( $error );
+                               $msg = wfMessage( $msgName,
+                                       array_map( 'wfEscapeWikiText', $this->cleanParams( $error ) ) );
                        }
                } else {
-                       return wfMessage( $error )->plain();
+                       $msg = wfMessage( $error );
                }
+               return $msg->plain();
+       }
+
+       /**
+        * Get the error message as HTML. This is done by parsing the wikitext error
+        * message.
+        */
+       public function getHTML( $shortContext = false, $longContext = false ) {
+               $text = $this->getWikiText( $shortContext, $longContext );
+               return MessageCache::singleton()->transform( $text, true );
        }
 
        /**
@@ -230,8 +242,8 @@ class Status {
         * @param $errors Array
         * @return Array
         */
-       function getWikiTextArray( $errors ) {
-               return array_map( array( $this, 'getWikiTextForError' ), $errors );
+       protected function getErrorMessageArray( $errors ) {
+               return array_map( array( $this, 'getErrorMessage' ), $errors );
        }
 
        /**
@@ -278,7 +290,9 @@ class Status {
                $result = array();
                foreach ( $this->errors as $error ) {
                        if ( $error['type'] === $type ) {
-                               if( $error['params'] ) {
+                               if( $error['message'] instanceof Message ) {
+                                       $result[] = $error['message'];
+                               } elseif( $error['params'] ) {
                                        $result[] = array_merge( array( $error['message'] ), $error['params'] );
                                } else {
                                        $result[] = array( $error['message'] );
@@ -309,6 +323,9 @@ class Status {
        /**
         * Returns true if the specified message is present as a warning or error
         *
+        * Note, due to the lack of tools for comparing Message objects, this
+        * function will not work when using a Message object as a parameter.
+        *
         * @param $msg String: message name
         * @return Boolean
         */
@@ -325,9 +342,12 @@ class Status {
         * If the specified source message exists, replace it with the specified
         * destination message, but keep the same parameters as in the original error.
         *
-        * Return true if the replacement was done, false otherwise.
+        * Note, due to the lack of tools for comparing Message objects, this
+        * function will not work when using a Message object as the search parameter.
         *
-        * @return bool
+        * @param $source Message|String: Message key or object to search for
+        * @param $dest Message|String: Replacement message key or object
+        * @return bool Return true if the replacement was done, false otherwise.
         */
        function replaceMessage( $source, $dest ) {
                $replaced = false;
index 95c69a2..b0e6c12 100644 (file)
@@ -35,6 +35,7 @@ class StreamFile {
         * @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)
+        * @throws MWException
         * @return bool Success
         */
        public static function stream( $fname, $headers = array(), $sendErrors = true ) {
index 43275a6..fba31ea 100644 (file)
@@ -424,7 +424,7 @@ class ReplacementArray {
 
 /**
  * An iterator which works exactly like:
- * 
+ *
  * foreach ( explode( $delim, $s ) as $element ) {
  *    ...
  * }
index 615bcb5..cc0adb7 100644 (file)
@@ -108,6 +108,7 @@ class StubObject {
         * @param $name String: name of the method called in this object.
         * @param $level Integer: level to go in the stact trace to get the function
         *               who called this function.
+        * @throws MWException
         */
        function _unstub( $name = '_unstub', $level = 2 ) {
                static $recursionLevel = 0;
index a5844b6..56ce46c 100644 (file)
@@ -196,7 +196,7 @@ class MWTimestamp {
         *
         * @since 1.20
         *
-        * @return string Formatted timestamp
+        * @return Message Formatted timestamp
         */
        public function getHumanTimestamp() {
                $then = $this->getTimestamp( TS_UNIX );
index 1b5e21d..6cd8ee5 100644 (file)
@@ -65,6 +65,7 @@ class Title {
        var $mFragment;                   // /< Title fragment (i.e. the bit after the #)
        var $mArticleID = -1;             // /< Article ID, fetched from the link cache on demand
        var $mLatestID = false;           // /< ID of most recent revision
+       var $mContentModel = false;       // /< ID of the page's content model, i.e. one of the CONTENT_MODEL_XXX constants
        private $mEstimateRevisions;      // /< Estimated number of revisions; null of not loaded
        var $mRestrictions = array();     // /< Array of groups allowed to edit this article
        var $mOldRestrictions = false;
@@ -199,6 +200,27 @@ class Title {
                }
        }
 
+       /**
+        * Returns a list of fields that are to be selected for initializing Title objects or LinkCache entries.
+        * Uses $wgContentHandlerUseDB to determine whether to include page_content_model.
+        *
+        * @return array
+        */
+       protected static function getSelectFields() {
+               global $wgContentHandlerUseDB;
+
+               $fields = array(
+                       'page_namespace', 'page_title', 'page_id',
+                       'page_len', 'page_is_redirect', 'page_latest',
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'page_content_model';
+               }
+
+               return $fields;
+       }
+
        /**
         * Create a new Title from an article ID
         *
@@ -210,10 +232,7 @@ class Title {
                $db = ( $flags & self::GAID_FOR_UPDATE ) ? wfGetDB( DB_MASTER ) : wfGetDB( DB_SLAVE );
                $row = $db->selectRow(
                        'page',
-                       array(
-                               'page_namespace', 'page_title', 'page_id',
-                               'page_len', 'page_is_redirect', 'page_latest',
-                       ),
+                       self::getSelectFields(),
                        array( 'page_id' => $id ),
                        __METHOD__
                );
@@ -239,10 +258,7 @@ class Title {
 
                $res = $dbr->select(
                        'page',
-                       array(
-                               'page_namespace', 'page_title', 'page_id',
-                               'page_len', 'page_is_redirect', 'page_latest',
-                       ),
+                       self::getSelectFields(),
                        array( 'page_id' => $ids ),
                        __METHOD__
                );
@@ -282,11 +298,16 @@ class Title {
                                $this->mRedirect = (bool)$row->page_is_redirect;
                        if ( isset( $row->page_latest ) )
                                $this->mLatestID = (int)$row->page_latest;
+                       if ( isset( $row->page_content_model ) )
+                               $this->mContentModel = strval( $row->page_content_model );
+                       else
+                               $this->mContentModel = false; # initialized lazily in getContentModel()
                } else { // page not found
                        $this->mArticleID = 0;
                        $this->mLength = 0;
                        $this->mRedirect = false;
                        $this->mLatestID = 0;
+                       $this->mContentModel = false; # initialized lazily in getContentModel()
                }
        }
 
@@ -312,6 +333,7 @@ class Title {
                $t->mArticleID = ( $ns >= 0 ) ? -1 : 0;
                $t->mUrlform = wfUrlencode( $t->mDbkeyform );
                $t->mTextform = str_replace( '_', ' ', $title );
+               $t->mContentModel = false; # initialized lazily in getContentModel()
                return $t;
        }
 
@@ -362,9 +384,13 @@ class Title {
         *
         * @param $text String: Text with possible redirect
         * @return Title: The corresponding Title
+        * @deprecated since 1.21, use Content::getRedirectTarget instead.
         */
        public static function newFromRedirect( $text ) {
-               return self::newFromRedirectInternal( $text );
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $content = ContentHandler::makeContent( $text, null, CONTENT_MODEL_WIKITEXT );
+               return $content->getRedirectTarget();
        }
 
        /**
@@ -375,10 +401,13 @@ class Title {
         *
         * @param $text String Text with possible redirect
         * @return Title
+        * @deprecated since 1.21, use Content::getUltimateRedirectTarget instead.
         */
        public static function newFromRedirectRecurse( $text ) {
-               $titles = self::newFromRedirectArray( $text );
-               return $titles ? array_pop( $titles ) : null;
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $content = ContentHandler::makeContent( $text, null, CONTENT_MODEL_WIKITEXT );
+               return $content->getUltimateRedirectTarget();
        }
 
        /**
@@ -389,71 +418,13 @@ class Title {
         *
         * @param $text String Text with possible redirect
         * @return Array of Titles, with the destination last
+        * @deprecated since 1.21, use Content::getRedirectChain instead.
         */
        public static function newFromRedirectArray( $text ) {
-               global $wgMaxRedirects;
-               $title = self::newFromRedirectInternal( $text );
-               if ( is_null( $title ) ) {
-                       return null;
-               }
-               // recursive check to follow double redirects
-               $recurse = $wgMaxRedirects;
-               $titles = array( $title );
-               while ( --$recurse > 0 ) {
-                       if ( $title->isRedirect() ) {
-                               $page = WikiPage::factory( $title );
-                               $newtitle = $page->getRedirectTarget();
-                       } else {
-                               break;
-                       }
-                       // Redirects to some special pages are not permitted
-                       if ( $newtitle instanceOf Title && $newtitle->isValidRedirectTarget() ) {
-                               // the new title passes the checks, so make that our current title so that further recursion can be checked
-                               $title = $newtitle;
-                               $titles[] = $newtitle;
-                       } else {
-                               break;
-                       }
-               }
-               return $titles;
-       }
+               ContentHandler::deprecated( __METHOD__, '1.21' );
 
-       /**
-        * Really extract the redirect destination
-        * Do not call this function directly, use one of the newFromRedirect* functions above
-        *
-        * @param $text String Text with possible redirect
-        * @return Title
-        */
-       protected static function newFromRedirectInternal( $text ) {
-               global $wgMaxRedirects;
-               if ( $wgMaxRedirects < 1 ) {
-                       //redirects are disabled, so quit early
-                       return null;
-               }
-               $redir = MagicWord::get( 'redirect' );
-               $text = trim( $text );
-               if ( $redir->matchStartAndRemove( $text ) ) {
-                       // Extract the first link and see if it's usable
-                       // Ensure that it really does come directly after #REDIRECT
-                       // Some older redirects included a colon, so don't freak about that!
-                       $m = array();
-                       if ( preg_match( '!^\s*:?\s*\[{2}(.*?)(?:\|.*?)?\]{2}!', $text, $m ) ) {
-                               // Strip preceding colon used to "escape" categories, etc.
-                               // and URL-decode links
-                               if ( strpos( $m[1], '%' ) !== false ) {
-                                       // Match behavior of inline link parsing here;
-                                       $m[1] = rawurldecode( ltrim( $m[1], ':' ) );
-                               }
-                               $title = Title::newFromText( $m[1] );
-                               // If the title is a redirect to bad special pages or is invalid, return null
-                               if ( !$title instanceof Title || !$title->isValidRedirectTarget() ) {
-                                       return null;
-                               }
-                               return $title;
-                       }
-               }
-               return null;
+               $content = ContentHandler::makeContent( $text, null, CONTENT_MODEL_WIKITEXT );
+               return $content->getRedirectChain();
        }
 
        /**
@@ -701,6 +672,38 @@ class Title {
                return $this->mNamespace;
        }
 
+       /**
+        * Get the page's content model id, see the CONTENT_MODEL_XXX constants.
+        *
+        * @return String: Content model id
+        */
+       public function getContentModel() {
+               if ( !$this->mContentModel ) {
+                       $linkCache = LinkCache::singleton();
+                       $this->mContentModel = $linkCache->getGoodLinkFieldObj( $this, 'model' );
+               }
+
+               if ( !$this->mContentModel ) {
+                       $this->mContentModel = ContentHandler::getDefaultModelFor( $this );
+               }
+
+               if( !$this->mContentModel ) {
+                       throw new MWException( "failed to determin content model!" );
+               }
+
+               return $this->mContentModel;
+       }
+
+       /**
+        * Convenience method for checking a title's content model name
+        *
+        * @param String $id The content model ID (use the CONTENT_MODEL_XXX constants).
+        * @return Boolean true if $this->getContentModel() == $id
+        */
+       public function hasContentModel( $id ) {
+               return $this->getContentModel() == $id;
+       }
+
        /**
         * Get the namespace text
         *
@@ -905,7 +908,7 @@ class Title {
 
        /**
         * Is this the mainpage?
-        * @note Title::newFromText seams to be sufficiently optimized by the title
+        * @note Title::newFromText seems to be sufficiently optimized by the title
         * cache that we don't need to over-optimize by doing direct comparisons and
         * acidentally creating new bugs where $title->equals( Title::newFromText() )
         * ends up reporting something differently than $title->isMainPage();
@@ -934,6 +937,8 @@ class Title {
         * @return Bool
         */
        public function isConversionTable() {
+               //@todo: ConversionTable should become a separate content model.
+
                return $this->getNamespace() == NS_MEDIAWIKI &&
                        strpos( $this->getText(), 'Conversiontable/' ) === 0;
        }
@@ -944,22 +949,31 @@ class Title {
         * @return Bool
         */
        public function isWikitextPage() {
-               $retval = !$this->isCssOrJsPage() && !$this->isCssJsSubpage();
-               wfRunHooks( 'TitleIsWikitextPage', array( $this, &$retval ) );
-               return $retval;
+               return $this->hasContentModel( CONTENT_MODEL_WIKITEXT );
        }
 
        /**
-        * Could this page contain custom CSS or JavaScript, based
-        * on the title?
+        * Could this page contain custom CSS or JavaScript for the global UI.
+        * This is generally true for pages in the MediaWiki namespace having CONTENT_MODEL_CSS
+        * or CONTENT_MODEL_JAVASCRIPT.
+        *
+        * This method does *not* return true for per-user JS/CSS. Use isCssJsSubpage() for that!
+        *
+        * Note that this method should not return true for pages that contain and show "inactive" CSS or JS.
         *
         * @return Bool
         */
        public function isCssOrJsPage() {
-               $retval = $this->mNamespace == NS_MEDIAWIKI
-                       && preg_match( '!\.(?:css|js)$!u', $this->mTextform ) > 0;
-               wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$retval ) );
-               return $retval;
+               $isCssOrJsPage = NS_MEDIAWIKI == $this->mNamespace
+                       && ( $this->hasContentModel( CONTENT_MODEL_CSS )
+                               || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
+
+               #NOTE: this hook is also called in ContentHandler::getDefaultModel. It's called here again to make sure
+               #      hook funktions can force this method to return true even outside the mediawiki namespace.
+
+               wfRunHooks( 'TitleIsCssOrJsPage', array( $this, &$isCssOrJsPage ) );
+
+               return $isCssOrJsPage;
        }
 
        /**
@@ -967,7 +981,9 @@ class Title {
         * @return Bool
         */
        public function isCssJsSubpage() {
-               return ( NS_USER == $this->mNamespace and preg_match( "/\\/.*\\.(?:css|js)$/", $this->mTextform ) );
+               return ( NS_USER == $this->mNamespace && $this->isSubpage()
+                               && ( $this->hasContentModel( CONTENT_MODEL_CSS )
+                                       || $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) ) );
        }
 
        /**
@@ -990,7 +1006,8 @@ class Title {
         * @return Bool
         */
        public function isCssSubpage() {
-               return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.css$/", $this->mTextform ) );
+               return ( NS_USER == $this->mNamespace && $this->isSubpage()
+                       && $this->hasContentModel( CONTENT_MODEL_CSS ) );
        }
 
        /**
@@ -999,7 +1016,8 @@ class Title {
         * @return Bool
         */
        public function isJsSubpage() {
-               return ( NS_USER == $this->mNamespace && preg_match( "/\\/.*\\.js$/", $this->mTextform ) );
+               return ( NS_USER == $this->mNamespace && $this->isSubpage()
+                       && $this->hasContentModel( CONTENT_MODEL_JAVASCRIPT ) );
        }
 
        /**
@@ -1161,7 +1179,49 @@ class Title {
        }
 
        /**
-        * Get the base page name, i.e. the leftmost part before any slashes
+        * Get the root page name text without a namespace, i.e. the leftmost part before any slashes
+        *
+        * @par Example:
+        * @code
+        * Title::newFromText('User:Foo/Bar/Baz')->getRootText();
+        * # returns: 'Foo'
+        * @endcode
+        *
+        * @return String Root name
+        * @since 1.20
+        */
+       public function getRootText() {
+               if ( !MWNamespace::hasSubpages( $this->mNamespace ) ) {
+                       return $this->getText();
+               }
+
+               return strtok( $this->getText(), '/' );
+       }
+
+       /**
+        * Get the root page name title, i.e. the leftmost part before any slashes
+        *
+        * @par Example:
+        * @code
+        * Title::newFromText('User:Foo/Bar/Baz')->getRootTitle();
+        * # returns: Title{User:Foo}
+        * @endcode
+        *
+        * @return Title Root title
+        * @since 1.20
+        */
+       public function getRootTitle() {
+               return Title::makeTitle( $this->getNamespace(), $this->getRootText() );
+       }
+
+       /**
+        * Get the base page name without a namespace, i.e. the part before the subpage name
+        *
+        * @par Example:
+        * @code
+        * Title::newFromText('User:Foo/Bar/Baz')->getBaseText();
+        * # returns: 'Foo/Bar'
+        * @endcode
         *
         * @return String Base name
         */
@@ -1178,9 +1238,31 @@ class Title {
                return implode( '/', $parts );
        }
 
+       /**
+        * Get the base page name title, i.e. the part before the subpage name
+        *
+        * @par Example:
+        * @code
+        * Title::newFromText('User:Foo/Bar/Baz')->getBaseTitle();
+        * # returns: Title{User:Foo/Bar}
+        * @endcode
+        *
+        * @return Title Base title
+        * @since 1.20
+        */
+       public function getBaseTitle() {
+               return Title::makeTitle( $this->getNamespace(), $this->getBaseText() );
+       }
+
        /**
         * Get the lowest-level subpage name, i.e. the rightmost part after any slashes
         *
+        * @par Example:
+        * @code
+        * Title::newFromText('User:Foo/Bar/Baz')->getSubpageText();
+        * # returns: "Baz"
+        * @endcode
+        *
         * @return String Subpage name
         */
        public function getSubpageText() {
@@ -1191,6 +1273,23 @@ class Title {
                return( $parts[count( $parts ) - 1] );
        }
 
+       /**
+        * Get the title for a subpage of the current page
+        *
+        * @par Example:
+        * @code
+        * Title::newFromText('User:Foo/Bar/Baz')->getSubpage("Asdf");
+        * # returns: Title{User:Foo/Bar/Baz/Asdf}
+        * @endcode
+        *
+        * @param $text String The subpage name to add to the title
+        * @return Title Subpage title
+        * @since 1.20
+        */
+       public function getSubpage( $text ) {
+               return Title::makeTitleSafe( $this->getNamespace(), $this->getText() . '/' . $text );
+       }
+
        /**
         * Get the HTML-escaped displayable text form.
         * Used for the title field in <a> tags.
@@ -1270,6 +1369,8 @@ class Title {
         *
         * @see self::getLocalURL
         * @see wfExpandUrl
+        * @param $query
+        * @param $query2 bool
         * @param $proto Protocol type to use in URL
         * @return String the URL
         */
@@ -1297,7 +1398,7 @@ class Title {
         *
 
         * @param $query string|array an optional query string,
-        *   not used for interwiki     links. Can be specified as an associative array as well,
+        *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., array( 'action' => 'edit' ) (keys and values will be URL-escaped).
         *   Some query patterns will trigger various shorturl path replacements.
         * @param $query2 Mixed: An optional secondary query array. This one MUST
@@ -1396,13 +1497,16 @@ class Title {
         *
         * See getLocalURL for the arguments.
         *
+        * @param $query
+        * @param $query2 bool
+        * @param $proto Protocol to use; setting this will cause a full URL to be used
         * @see self::getLocalURL
         * @return String the URL
         */
-       public function getLinkURL( $query = '', $query2 = false ) {
+       public function getLinkURL( $query = '', $query2 = false, $proto = PROTO_RELATIVE ) {
                wfProfileIn( __METHOD__ );
-               if ( $this->isExternal() ) {
-                       $ret = $this->getFullURL( $query, $query2 );
+               if ( $this->isExternal() || $proto !== PROTO_RELATIVE ) {
+                       $ret = $this->getFullURL( $query, $query2, $proto );
                } elseif ( $this->getPrefixedText() === '' && $this->getFragment() !== '' ) {
                        $ret = $this->getFragmentForURL();
                } else {
@@ -1641,15 +1745,8 @@ class Title {
 
                        if ( !$user->isAllowed( 'move' ) ) {
                                // User can't move anything
-                               global $wgGroupPermissions;
-                               $userCanMove = false;
-                               if ( isset( $wgGroupPermissions['user']['move'] ) ) {
-                                       $userCanMove = $wgGroupPermissions['user']['move'];
-                               }
-                               $autoconfirmedCanMove = false;
-                               if ( isset( $wgGroupPermissions['autoconfirmed']['move'] ) ) {
-                                       $autoconfirmedCanMove = $wgGroupPermissions['autoconfirmed']['move'];
-                               }
+                               $userCanMove = User::groupHasPermission( 'user', 'move' );
+                               $autoconfirmedCanMove = User::groupHasPermission( 'autoconfirmed', 'move' );
                                if ( $user->isAnon() && ( $userCanMove || $autoconfirmedCanMove ) ) {
                                        // custom message if logged-in users without any special rights can move
                                        $errors[] = array( 'movenologintext' );
@@ -1990,13 +2087,13 @@ class Title {
         * @return Array list of errors
         */
        private function checkReadPermissions( $action, $user, $errors, $doExpensiveQueries, $short ) {
-               global $wgWhitelistRead, $wgGroupPermissions, $wgRevokePermissions;
+               global $wgWhitelistRead, $wgRevokePermissions;
                static $useShortcut = null;
 
                # Initialize the $useShortcut boolean, to determine if we can skip quite a bit of code below
                if ( is_null( $useShortcut ) ) {
                        $useShortcut = true;
-                       if ( empty( $wgGroupPermissions['*']['read'] ) ) {
+                       if ( !User::groupHasPermission( '*', 'read' ) ) {
                                # Not a public wiki, so no shortcut
                                $useShortcut = false;
                        } elseif ( !empty( $wgRevokePermissions ) ) {
@@ -2826,8 +2923,18 @@ class Title {
                if ( !$this->getArticleID( $flags ) ) {
                        return $this->mRedirect = false;
                }
+
                $linkCache = LinkCache::singleton();
-               $this->mRedirect = (bool)$linkCache->getGoodLinkFieldObj( $this, 'redirect' );
+               $cached = $linkCache->getGoodLinkFieldObj( $this, 'redirect' );
+               if ( $cached === null ) {
+                       // TODO: check the assumption that the cache actually knows about this title
+                       // and handle this, such as get the title from the database.
+                       // See https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+                       wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+                       wfDebug( wfBacktrace() );
+               }
+
+               $this->mRedirect = (bool)$cached;
 
                return $this->mRedirect;
        }
@@ -2848,7 +2955,15 @@ class Title {
                        return $this->mLength = 0;
                }
                $linkCache = LinkCache::singleton();
-               $this->mLength = intval( $linkCache->getGoodLinkFieldObj( $this, 'length' ) );
+               $cached = $linkCache->getGoodLinkFieldObj( $this, 'length' );
+               if ( $cached === null ) { # check the assumption that the cache actually knows about this title
+                       # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+                       #      as a stop gap, perhaps log this, but don't throw an exception?
+                       wfDebug( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+                       wfDebug( wfBacktrace() );
+               }
+
+               $this->mLength = intval( $cached );
 
                return $this->mLength;
        }
@@ -2868,7 +2983,14 @@ class Title {
                        return $this->mLatestID = 0;
                }
                $linkCache = LinkCache::singleton();
-               $this->mLatestID = intval( $linkCache->getGoodLinkFieldObj( $this, 'revision' ) );
+               $cached = $linkCache->getGoodLinkFieldObj( $this, 'revision' );
+               if ( $cached === null ) { # check the assumption that the cache actually knows about this title
+                       # XXX: this does apparently happen, see https://bugzilla.wikimedia.org/show_bug.cgi?id=37209
+                       #      as a stop gap, perhaps log this, but don't throw an exception?
+                       throw new MWException( "LinkCache doesn't currently know about this title: " . $this->getPrefixedDBkey() );
+               }
+
+               $this->mLatestID = intval( $cached );
 
                return $this->mLatestID;
        }
@@ -2897,6 +3019,7 @@ class Title {
                $this->mRedirect = null;
                $this->mLength = -1;
                $this->mLatestID = false;
+               $this->mContentModel = false;
                $this->mEstimateRevisions = null;
        }
 
@@ -3135,7 +3258,7 @@ class Title {
 
                $res = $db->select(
                        array( 'page', $table ),
-                       array( 'page_namespace', 'page_title', 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+                       self::getSelectFields(),
                        array(
                                "{$prefix}_from=page_id",
                                "{$prefix}_namespace" => $this->getNamespace(),
@@ -3185,6 +3308,8 @@ class Title {
         * @return Array of Title objects linking here
         */
        public function getLinksFrom( $options = array(), $table = 'pagelinks', $prefix = 'pl' ) {
+               global $wgContentHandlerUseDB;
+
                $id = $this->getArticleID();
 
                # If the page doesn't exist; there can't be any link from this page
@@ -3201,9 +3326,12 @@ class Title {
                $namespaceFiled = "{$prefix}_namespace";
                $titleField = "{$prefix}_title";
 
+               $fields = array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
+               if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+
                $res = $db->select(
                        array( $table, 'page' ),
-                       array( $namespaceFiled, $titleField, 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+                       $fields,
                        array( "{$prefix}_from" => $id ),
                        __METHOD__,
                        $options,
@@ -3335,7 +3463,7 @@ class Title {
         * @return Mixed True on success, getUserPermissionsErrors()-like array on failure
         */
        public function isValidMoveOperation( &$nt, $auth = true, $reason = '' ) {
-               global $wgUser;
+               global $wgUser, $wgContentHandlerUseDB;
 
                $errors = array();
                if ( !$nt ) {
@@ -3368,6 +3496,15 @@ class Title {
                        $errors[] = array( 'badarticleerror' );
                }
 
+               // Content model checks
+               if ( !$wgContentHandlerUseDB &&
+                               $this->getContentModel() !== $nt->getContentModel() ) {
+                       // can't move a page if that would change the page's content model
+                       $errors[] = array( 'bad-target-model',
+                                                       ContentHandler::getLocalizedName( $this->getContentModel() ),
+                                                       ContentHandler::getLocalizedName( $nt->getContentModel() ) );
+               }
+
                // Image-specific checks
                if ( $this->getNamespace() == NS_FILE ) {
                        $errors = array_merge( $errors, $this->validateFileMoveOperation( $nt ) );
@@ -3594,7 +3731,14 @@ class Title {
                        $logType = 'move';
                }
 
-               $redirectSuppressed = !$createRedirect;
+               if ( $createRedirect ) {
+                       $contentHandler = ContentHandler::getForTitle( $this );
+                       $redirectContent = $contentHandler->makeRedirectContent( $nt );
+
+                       // NOTE: If this page's content model does not support redirects, $redirectContent will be null.
+               } else {
+                       $redirectContent = null;
+               }
 
                $logEntry = new ManualLogEntry( 'move', $logType );
                $logEntry->setPerformer( $wgUser );
@@ -3602,7 +3746,7 @@ class Title {
                $logEntry->setComment( $reason );
                $logEntry->setParameters( array(
                        '4::target' => $nt->getPrefixedText(),
-                       '5::noredir' => $redirectSuppressed ? '1': '0',
+                       '5::noredir' => $redirectContent ? '0': '1',
                ) );
 
                $formatter = LogFormatter::newFromEntry( $logEntry );
@@ -3637,7 +3781,8 @@ class Title {
                if ( !is_object( $nullRevision ) ) {
                        throw new MWException( 'No valid null revision produced in ' . __METHOD__ );
                }
-               $nullRevId = $nullRevision->insertOn( $dbw );
+
+               $nullRevision->insertOn( $dbw );
 
                # Change the name of the target page:
                $dbw->update( 'page',
@@ -3664,18 +3809,17 @@ class Title {
                }
 
                # Recreate the redirect, this time in the other direction.
-               if ( $redirectSuppressed ) {
+               if ( !$redirectContent ) {
                        WikiPage::onArticleDelete( $this );
                } else {
-                       $mwRedir = MagicWord::get( 'redirect' );
-                       $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $nt->getPrefixedText() . "]]\n";
                        $redirectArticle = WikiPage::factory( $this );
                        $newid = $redirectArticle->insertOn( $dbw );
                        if ( $newid ) { // sanity
                                $redirectRevision = new Revision( array(
+                                       'title'   => $this, // for determining the default content model
                                        'page'    => $newid,
                                        'comment' => $comment,
-                                       'text'    => $redirectText ) );
+                                       'content'    => $redirectContent ) );
                                $redirectRevision->insertOn( $dbw );
                                $redirectArticle->updateRevisionOn( $dbw, $redirectRevision, 0 );
 
@@ -3771,10 +3915,16 @@ class Title {
         * @return Bool
         */
        public function isSingleRevRedirect() {
+               global $wgContentHandlerUseDB;
+
                $dbw = wfGetDB( DB_MASTER );
+
                # Is it a redirect?
+               $fields = array( 'page_is_redirect', 'page_latest', 'page_id' );
+               if ( $wgContentHandlerUseDB ) $fields[] = 'page_content_model';
+
                $row = $dbw->selectRow( 'page',
-                       array( 'page_is_redirect', 'page_latest', 'page_id' ),
+                       $fields,
                        $this->pageCond(),
                        __METHOD__,
                        array( 'FOR UPDATE' )
@@ -3783,6 +3933,7 @@ class Title {
                $this->mArticleID = $row ? intval( $row->page_id ) : 0;
                $this->mRedirect = $row ? (bool)$row->page_is_redirect : false;
                $this->mLatestID = $row ? intval( $row->page_latest ) : false;
+               $this->mContentModel = $row && isset( $row->page_content_model ) ? strval( $row->page_content_model ) : false;
                if ( !$this->mRedirect ) {
                        return false;
                }
@@ -3827,24 +3978,25 @@ class Title {
                if( !is_object( $rev ) ){
                        return false;
                }
-               $text = $rev->getText();
+               $content = $rev->getContent();
                # Does the redirect point to the source?
                # Or is it a broken self-redirect, usually caused by namespace collisions?
-               $m = array();
-               if ( preg_match( "/\\[\\[\\s*([^\\]\\|]*)]]/", $text, $m ) ) {
-                       $redirTitle = Title::newFromText( $m[1] );
-                       if ( !is_object( $redirTitle ) ||
-                               ( $redirTitle->getPrefixedDBkey() != $this->getPrefixedDBkey() &&
-                               $redirTitle->getPrefixedDBkey() != $nt->getPrefixedDBkey() ) ) {
+               $redirTitle = $content ? $content->getRedirectTarget() : null;
+
+               if ( $redirTitle ) {
+                       if ( $redirTitle->getPrefixedDBkey() != $this->getPrefixedDBkey() &&
+                               $redirTitle->getPrefixedDBkey() != $nt->getPrefixedDBkey() ) {
                                wfDebug( __METHOD__ . ": redirect points to other page\n" );
                                return false;
+                       } else {
+                               return true;
                        }
                } else {
-                       # Fail safe
-                       wfDebug( __METHOD__ . ": failsafe\n" );
+                       # Fail safe (not a redirect after all. strange.)
+                       wfDebug( __METHOD__ . ": failsafe: database sais " . $nt->getPrefixedDBkey() .
+                                               " is a redirect, but it doesn't contain a valid redirect.\n" );
                        return false;
                }
-               return true;
        }
 
        /**
@@ -4323,7 +4475,7 @@ class Title {
 
        /**
         * Update page_touched timestamps and send squid purge messages for
-        * pages linking to this title. May be sent to the job queue depending
+        * pages linking to this title. May be sent to the job queue depending
         * on the number of links. Typically called on create and delete.
         */
        public function touchLinks() {
@@ -4543,19 +4695,13 @@ class Title {
                if ( $this->isSpecialPage() ) {
                        // special pages are in the user language
                        return $wgLang;
-               } elseif ( $this->isCssOrJsPage() || $this->isCssJsSubpage() ) {
-                       // css/js should always be LTR and is, in fact, English
-                       return wfGetLangObj( 'en' );
-               } elseif ( $this->getNamespace() == NS_MEDIAWIKI ) {
-                       // Parse mediawiki messages with correct target language
-                       list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $this->getText() );
-                       return wfGetLangObj( $lang );
                }
-               global $wgContLang;
-               // If nothing special, it should be in the wiki content language
-               $pageLang = $wgContLang;
-               // Hook at the end because we don't want to override the above stuff
-               wfRunHooks( 'PageContentLanguage', array( $this, &$pageLang, $wgLang ) );
+
+               //TODO: use the LinkCache to cache this! Note that this may depend on user settings, so the cache should be only per-request.
+               //NOTE: ContentHandler::getPageLanguage() may need to load the content to determine the page language!
+               $contentHandler = ContentHandler::getForTitle( $this );
+               $pageLang = $contentHandler->getPageLanguage( $this );
+
                return wfGetLangObj( $pageLang );
        }
 
@@ -4568,19 +4714,62 @@ class Title {
         * @return Language
         */
        public function getPageViewLanguage() {
-               $pageLang = $this->getPageLanguage();
-               // If this is nothing special (so the content is converted when viewed)
-               if ( !$this->isSpecialPage()
-                       && !$this->isCssOrJsPage() && !$this->isCssJsSubpage()
-                       && $this->getNamespace() !== NS_MEDIAWIKI
-               ) {
+               global $wgLang;
+
+               if ( $this->isSpecialPage() ) {
                        // If the user chooses a variant, the content is actually
                        // in a language whose code is the variant code.
-                       $variant = $pageLang->getPreferredVariant();
-                       if ( $pageLang->getCode() !== $variant ) {
-                               $pageLang = Language::factory( $variant );
+                       $variant = $wgLang->getPreferredVariant();
+                       if ( $wgLang->getCode() !== $variant ) {
+                               return Language::factory( $variant );
                        }
+
+                       return $wgLang;
                }
+
+               //NOTE: can't be cached persistently, depends on user settings
+               //NOTE: ContentHandler::getPageViewLanguage() may need to load the content to determine the page language!
+               $contentHandler = ContentHandler::getForTitle( $this );
+               $pageLang = $contentHandler->getPageViewLanguage( $this );
                return $pageLang;
        }
+
+       /**
+        * Get a list of rendered edit notices for this page.
+        *
+        * Array is keyed by the original message key, and values are rendered using parseAsBlock, so
+        * they will already be wrapped in paragraphs.
+        *
+        * @since 1.21
+        * @return Array
+        */
+       public function getEditNotices() {
+               $notices = array();
+
+               # Optional notices on a per-namespace and per-page basis
+               $editnotice_ns = 'editnotice-' . $this->getNamespace();
+               $editnotice_ns_message = wfMessage( $editnotice_ns );
+               if ( $editnotice_ns_message->exists() ) {
+                       $notices[$editnotice_ns] = $editnotice_ns_message->parseAsBlock();
+               }
+               if ( MWNamespace::hasSubpages( $this->getNamespace() ) ) {
+                       $parts = explode( '/', $this->getDBkey() );
+                       $editnotice_base = $editnotice_ns;
+                       while ( count( $parts ) > 0 ) {
+                               $editnotice_base .= '-' . array_shift( $parts );
+                               $editnotice_base_msg = wfMessage( $editnotice_base );
+                               if ( $editnotice_base_msg->exists() ) {
+                                       $notices[$editnotice_base] = $editnotice_base_msg->parseAsBlock();
+                               }
+                       }
+               } else {
+                       # Even if there are no subpages in namespace, we still don't want / in MW ns.
+                       $editnoticeText = $editnotice_ns . '-' . str_replace( '/', '-', $this->getDBkey() );
+                       $editnoticeMsg = wfMessage( $editnoticeText );
+                       if ( $editnoticeMsg->exists() ) {
+                               $notices[$editnoticeText] = $editnoticeMsg->parseAsBlock();
+                       }
+               }
+               return $notices;
+       }
 }
index 0a3db4c..507b254 100644 (file)
@@ -286,7 +286,10 @@ class User {
                                $this->loadFromId();
                                break;
                        case 'session':
-                               $this->loadFromSession();
+                               if( !$this->loadFromSession() ) {
+                                       // Loading from session failed. Load defaults.
+                                       $this->loadDefaults();
+                               }
                                wfRunHooks( 'UserLoadAfterLoadFromSession', array( $this ) );
                                break;
                        default:
@@ -367,7 +370,7 @@ class User {
         *    User::getCanonicalName(), except that true is accepted as an alias
         *    for 'valid', for BC.
         *
-        * @return User object, or false if the username is invalid
+        * @return User|bool User object, or false if the username is invalid
         *    (e.g. if it contains illegal characters or is an IP address). If the
         *    username is not present in the database, the result will be a user object
         *    with a name, zero user ID and default settings.
@@ -452,11 +455,12 @@ class User {
         * will be loaded once more from the database when accessing them.
         *
         * @param $row Array A row from the user table
+        * @param $data Array Further data to load into the object (see User::loadFromRow for valid keys)
         * @return User
         */
-       public static function newFromRow( $row ) {
+       public static function newFromRow( $row, $data = null ) {
                $user = new User;
-               $user->loadFromRow( $row );
+               $user->loadFromRow( $row, $data );
                return $user;
        }
 
@@ -762,6 +766,7 @@ class User {
         *                - 'usable'     Valid for batch processes and login
         *                - 'creatable'  Valid for batch processes, login and account creation
         *
+        * @throws MWException
         * @return bool|string
         */
        public static function getCanonicalName( $name, $validate = 'valid' ) {
@@ -813,39 +818,16 @@ class User {
 
        /**
         * Count the number of edits of a user
-        * @todo It should not be static and some day should be merged as proper member function / deprecated -- domas
         *
         * @param $uid Int User ID to check
         * @return Int the user's edit count
+        *
+        * @deprecated since 1.21 in favour of User::getEditCount
         */
        public static function edits( $uid ) {
-               wfProfileIn( __METHOD__ );
-               $dbr = wfGetDB( DB_SLAVE );
-               // check if the user_editcount field has been initialized
-               $field = $dbr->selectField(
-                       'user', 'user_editcount',
-                       array( 'user_id' => $uid ),
-                       __METHOD__
-               );
-
-               if( $field === null ) { // it has not been initialized. do so.
-                       $dbw = wfGetDB( DB_MASTER );
-                       $count = $dbr->selectField(
-                               'revision', 'count(*)',
-                               array( 'rev_user' => $uid ),
-                               __METHOD__
-                       );
-                       $dbw->update(
-                               'user',
-                               array( 'user_editcount' => $count ),
-                               array( 'user_id' => $uid ),
-                               __METHOD__
-                       );
-               } else {
-                       $count = $field;
-               }
-               wfProfileOut( __METHOD__ );
-               return $count;
+               wfDeprecated( __METHOD__, '1.21' );
+               $user = self::newFromId( $uid );
+               return $user->getEditCount();
        }
 
        /**
@@ -889,7 +871,7 @@ class User {
                if( $loggedOut !== null ) {
                        $this->mTouched = wfTimestamp( TS_MW, $loggedOut );
                } else {
-                       $this->mTouched = '0'; # Allow any pages to be cached
+                       $this->mTouched = '1'; # Allow any pages to be cached
                }
 
                $this->mToken = null; // Don't run cryptographic functions till we need a token
@@ -933,8 +915,7 @@ class User {
        }
 
        /**
-        * Load user data from the session or login cookie. If there are no valid
-        * credentials, initialises the user as an anonymous user.
+        * Load user data from the session or login cookie.
         * @return Bool True if the user is logged in, false otherwise.
         */
        private function loadFromSession() {
@@ -962,7 +943,6 @@ class User {
                if ( $cookieId !== null ) {
                        $sId = intval( $cookieId );
                        if( $sessId !== null && $cookieId != $sessId ) {
-                               $this->loadDefaults(); // Possible collision!
                                wfDebugLog( 'loginSessions', "Session user ID ($sessId) and
                                        cookie user ID ($sId) don't match!" );
                                return false;
@@ -971,7 +951,6 @@ class User {
                } elseif ( $sessId !== null && $sessId != 0 ) {
                        $sId = $sessId;
                } else {
-                       $this->loadDefaults();
                        return false;
                }
 
@@ -981,21 +960,18 @@ class User {
                        $sName = $request->getCookie( 'UserName' );
                        $request->setSessionData( 'wsUserName', $sName );
                } else {
-                       $this->loadDefaults();
                        return false;
                }
 
                $proposedUser = User::newFromId( $sId );
                if ( !$proposedUser->isLoggedIn() ) {
                        # Not a valid ID
-                       $this->loadDefaults();
                        return false;
                }
 
                global $wgBlockDisablesLogin;
                if( $wgBlockDisablesLogin && $proposedUser->isBlocked() ) {
                        # User blocked and we've disabled blocked user logins
-                       $this->loadDefaults();
                        return false;
                }
 
@@ -1007,7 +983,6 @@ class User {
                        $from = 'cookie';
                } else {
                        # No session or persistent login cookie
-                       $this->loadDefaults();
                        return false;
                }
 
@@ -1019,7 +994,6 @@ class User {
                } else {
                        # Invalid credentials
                        wfDebug( "User: can't log in from $from, invalid credentials\n" );
-                       $this->loadDefaults();
                        return false;
                }
        }
@@ -1063,8 +1037,12 @@ class User {
         * Initialize this object from a row from the user table.
         *
         * @param $row Array Row from the user table to load.
+        * @param $data Array Further user data to load into the object
+        *
+        *      user_groups             Array with groups out of the user_groups table
+        *      user_properties         Array with properties out of the user_properties table
         */
-       public function loadFromRow( $row ) {
+       public function loadFromRow( $row, $data = null ) {
                $all = true;
 
                $this->mGroups = null; // deferred
@@ -1122,6 +1100,15 @@ class User {
                if ( $all ) {
                        $this->mLoadedItems = true;
                }
+
+               if ( is_array( $data ) ) {
+                       if ( isset( $data['user_groups'] ) && is_array( $data['user_groups'] ) ) {
+                               $this->mGroups = $data['user_groups'];
+                       }
+                       if ( isset( $data['user_properties'] ) && is_array( $data['user_properties'] ) ) {
+                               $this->loadOptions( $data['user_properties'] );
+                       }
+               }
        }
 
        /**
@@ -1182,20 +1169,26 @@ class User {
                                }
                                $newGroups = array_merge( $oldGroups, $toPromote ); // all groups
 
-                               $log = new LogPage( 'rights', $wgAutopromoteOnceLogInRC /* in RC? */ );
-                               $log->addEntry( 'autopromote',
-                                       $this->getUserPage(),
-                                       '', // no comment
-                                       // These group names are "list to texted"-ed in class LogPage.
-                                       array( implode( ', ', $oldGroups ), implode( ', ', $newGroups ) )
-                               );
+                               $logEntry = new ManualLogEntry( 'rights', 'autopromote' );
+                               $logEntry->setPerformer( $this );
+                               $logEntry->setTarget( $this->getUserPage() );
+                               $logEntry->setParameters( array(
+                                       '4::oldgroups' => $oldGroups,
+                                       '5::newgroups' => $newGroups,
+                               ) );
+                               $logid = $logEntry->insert();
+                               if ( $wgAutopromoteOnceLogInRC ) {
+                                       $logEntry->publish( $logid );
+                               }
                        }
                }
                return $toPromote;
        }
 
        /**
-        * Clear various cached data stored in this object.
+        * Clear various cached data stored in this object. The cache of the user table
+        * data (i.e. self::$mCacheVars) is not cleared unless $reloadFrom is given.
+        *
         * @param $reloadFrom bool|String Reload user and user_groups table data from a
         *   given source. May be "name", "id", "defaults", "session", or false for
         *   no reload.
@@ -1209,6 +1202,8 @@ class User {
                $this->mEffectiveGroups = null;
                $this->mImplicitGroups = null;
                $this->mOptions = null;
+               $this->mOptionsLoaded = false;
+               $this->mEditCount = null;
 
                if ( $reloadFrom ) {
                        $this->mLoadedItems = array();
@@ -1225,22 +1220,23 @@ class User {
        public static function getDefaultOptions() {
                global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
 
+               static $defOpt = null;
+               if ( !defined( 'MW_PHPUNIT_TEST' ) && $defOpt !== null ) {
+                       // Disabling this for the unit tests, as they rely on being able to change $wgContLang
+                       // mid-request and see that change reflected in the return value of this function.
+                       // Which is insane and would never happen during normal MW operation
+                       return $defOpt;
+               }
+
                $defOpt = $wgDefaultUserOptions;
                # default language setting
-               $variant = $wgContLang->getDefaultVariant();
-               $defOpt['variant'] = $variant;
-               $defOpt['language'] = $variant;
+               $defOpt['variant'] = $wgContLang->getCode();
+               $defOpt['language'] = $wgContLang->getCode();
                foreach( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) {
                        $defOpt['searchNs'.$nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] );
                }
                $defOpt['skin'] = $wgDefaultSkin;
 
-               // FIXME: Ideally we'd cache the results of this function so the hook is only run once,
-               // but that breaks the parser tests because they rely on being able to change $wgContLang
-               // mid-request and see that change reflected in the return value of this function.
-               // Which is insane and would never happen during normal MW operation, but is also not
-               // likely to get fixed unless and until we context-ify everything.
-               // See also https://www.mediawiki.org/wiki/Special:Code/MediaWiki/101488#c25275
                wfRunHooks( 'UserGetDefaultOptions', array( &$defOpt ) );
 
                return $defOpt;
@@ -2223,13 +2219,6 @@ class User {
                global $wgHiddenPrefs;
                $this->loadOptions();
 
-               if ( is_null( $this->mOptions ) ) {
-                       if($defaultOverride != '') {
-                               return $defaultOverride;
-                       }
-                       $this->mOptions = User::getDefaultOptions();
-               }
-
                # We want 'disabled' preferences to always behave as the default value for
                # users, even if they have set the option explicitly in their settings (ie they
                # set it, and then it was disabled removing their ability to change it).  But
@@ -2305,15 +2294,11 @@ class User {
         * @param $val mixed New value to set
         */
        public function setOption( $oname, $val ) {
-               $this->load();
                $this->loadOptions();
 
                // Explicitly NULL values should refer to defaults
                if( is_null( $val ) ) {
-                       $defaultOption = self::getDefaultOption( $oname );
-                       if( !is_null( $defaultOption ) ) {
-                               $val = $defaultOption;
-                       }
+                       $val = self::getDefaultOption( $oname );
                }
 
                $this->mOptions[$oname] = $val;
@@ -2372,7 +2357,7 @@ class User {
                        $this->mRights = self::getGroupPermissions( $this->getEffectiveGroups() );
                        wfRunHooks( 'UserGetRights', array( $this, &$this->mRights ) );
                        // Force reindexation of rights when a hook has unset one of them
-                       $this->mRights = array_values( $this->mRights );
+                       $this->mRights = array_values( array_unique( $this->mRights ) );
                }
                return $this->mRights;
        }
@@ -2404,6 +2389,8 @@ class User {
                        ) );
                        # Hook for additional groups
                        wfRunHooks( 'UserEffectiveGroups', array( &$this, &$this->mEffectiveGroups ) );
+                       // Force reindexation of groups when a hook has unset one of them
+                       $this->mEffectiveGroups = array_values( array_unique( $this->mEffectiveGroups ) );
                        wfProfileOut( __METHOD__ );
                }
                return $this->mEffectiveGroups;
@@ -2467,16 +2454,29 @@ class User {
         * @return Int
         */
        public function getEditCount() {
-               if( $this->getId() ) {
-                       if ( !isset( $this->mEditCount ) ) {
-                               /* Populate the count, if it has not been populated yet */
-                               $this->mEditCount = User::edits( $this->mId );
-                       }
-                       return $this->mEditCount;
-               } else {
-                       /* nil */
+               if ( !$this->getId() ) {
                        return null;
                }
+
+               if ( !isset( $this->mEditCount ) ) {
+                       /* Populate the count, if it has not been populated yet */
+                       wfProfileIn( __METHOD__ );
+                       $dbr = wfGetDB( DB_SLAVE );
+                       // check if the user_editcount field has been initialized
+                       $count = $dbr->selectField(
+                               'user', 'user_editcount',
+                               array( 'user_id' => $this->mId ),
+                               __METHOD__
+                       );
+
+                       if( $count === null ) {
+                               // it has not been initialized. do so.
+                               $count = $this->initEditCount();
+                       }
+                       $this->mEditCount = intval( $count );
+                       wfProfileOut( __METHOD__ );
+               }
+               return $this->mEditCount;
        }
 
        /**
@@ -2798,9 +2798,13 @@ class User {
         * @param $value String Value to set
         * @param $exp Int Expiration time, as a UNIX time value;
         *                   if 0 or not specified, use the default $wgCookieExpiration
+        * @param $secure Bool
+        *  true: Force setting the secure attribute when setting the cookie
+        *  false: Force NOT setting the secure attribute when setting the cookie
+        *  null (default): Use the default ($wgCookieSecure) to set the secure attribute
         */
-       protected function setCookie( $name, $value, $exp = 0 ) {
-               $this->getRequest()->response()->setcookie( $name, $value, $exp );
+       protected function setCookie( $name, $value, $exp = 0, $secure = null ) {
+               $this->getRequest()->response()->setcookie( $name, $value, $exp, null, null, $secure );
        }
 
        /**
@@ -2816,8 +2820,9 @@ class User {
         *
         * @param $request WebRequest object to use; $wgRequest will be used if null
         *        is passed.
+        * @param $secure Whether to force secure/insecure cookies or use default
         */
-       public function setCookies( $request = null ) {
+       public function setCookies( $request = null, $secure = null ) {
                if ( $request === null ) {
                        $request = $this->getRequest();
                }
@@ -2856,9 +2861,18 @@ class User {
                        if ( $value === false ) {
                                $this->clearCookie( $name );
                        } else {
-                               $this->setCookie( $name, $value );
+                               $this->setCookie( $name, $value, 0, $secure );
                        }
                }
+
+               /**
+                * If wpStickHTTPS was selected, also set an insecure cookie that
+                * will cause the site to redirect the user to HTTPS, if they access
+                * it over HTTP. Bug 29898.
+                */
+               if ( $request->getCheck( 'wpStickHTTPS' ) ) {
+                       $this->setCookie( 'forceHTTPS', 'true', time() + 2592000, false ); //30 days
+               }
        }
 
        /**
@@ -2881,6 +2895,7 @@ class User {
 
                $this->clearCookie( 'UserID' );
                $this->clearCookie( 'Token' );
+               $this->clearCookie( 'forceHTTPS' );
 
                # Remember when user logged out, to prevent seeing cached pages
                $this->setCookie( 'LoggedOut', wfTimestampNow(), time() + 86400 );
@@ -2997,7 +3012,29 @@ class User {
        }
 
        /**
-        * Add this existing user object to the database
+        * Add this existing user object to the database. If the user already
+        * exists, a fatal status object is returned, and the user object is
+        * initialised with the data from the database.
+        *
+        * Previously, this function generated a DB error due to a key conflict
+        * if the user already existed. Many extension callers use this function
+        * in code along the lines of:
+        *
+        *   $user = User::newFromName( $name );
+        *   if ( !$user->isLoggedIn() ) {
+        *       $user->addToDatabase();
+        *   }
+        *   // do something with $user...
+        *
+        * However, this was vulnerable to a race condition (bug 16020). By
+        * initialising the user object if the user exists, we aim to support this
+        * calling sequence as far as possible.
+        *
+        * Note that if the user exists, this function will acquire a write lock,
+        * so it is still advisable to make the call conditional on isLoggedIn(),
+        * and to commit the transaction after calling.
+        *
+        * @return Status
         */
        public function addToDatabase() {
                $this->load();
@@ -3020,14 +3057,31 @@ class User {
                                'user_registration' => $dbw->timestamp( $this->mRegistration ),
                                'user_editcount' => 0,
                                'user_touched' => $dbw->timestamp( $this->mTouched ),
-                       ), __METHOD__
+                       ), __METHOD__,
+                       array( 'IGNORE' )
                );
+               if ( !$dbw->affectedRows() ) {
+                       $this->mId = $dbw->selectField( 'user', 'user_id',
+                               array( 'user_name' => $this->mName ), __METHOD__ );
+                       $loaded = false;
+                       if ( $this->mId ) {
+                               if ( $this->loadFromDatabase() ) {
+                                       $loaded = true;
+                               }
+                       }
+                       if ( !$loaded ) {
+                               throw new MWException( __METHOD__. ": hit a key conflict attempting " .
+                                       "to insert a user row, but then it doesn't exist when we select it!" );
+                       }
+                       return Status::newFatal( 'userexists' );
+               }
                $this->mId = $dbw->insertId();
 
                // Clear instance cache other than user table data, which is already accurate
                $this->clearInstanceCache();
 
                $this->saveOptions();
+               return Status::newGood();
        }
 
        /**
@@ -3629,14 +3683,27 @@ class User {
        public static function getGroupsWithPermission( $role ) {
                global $wgGroupPermissions;
                $allowedGroups = array();
-               foreach ( $wgGroupPermissions as $group => $rights ) {
-                       if ( isset( $rights[$role] ) && $rights[$role] ) {
+               foreach ( array_keys( $wgGroupPermissions ) as $group ) {
+                       if ( self::groupHasPermission( $group, $role ) ) {
                                $allowedGroups[] = $group;
                        }
                }
                return $allowedGroups;
        }
 
+       /**
+        * Check, if the given group has the given permission
+        *
+        * @param $group String Group to check
+        * @param $role String Role to check
+        * @return bool
+        */
+       public static function groupHasPermission( $group, $role ) {
+               global $wgGroupPermissions, $wgRevokePermissions;
+               return isset( $wgGroupPermissions[$group][$role] ) && $wgGroupPermissions[$group][$role]
+                       && !( isset( $wgRevokePermissions[$group][$role] ) && $wgRevokePermissions[$group][$role] );
+       }
+
        /**
         * Get the localized descriptive name for a group, if it exists
         *
@@ -3875,43 +3942,63 @@ class User {
        public function incEditCount() {
                if( !$this->isAnon() ) {
                        $dbw = wfGetDB( DB_MASTER );
-                       $dbw->update( 'user',
+                       $dbw->update(
+                               'user',
                                array( 'user_editcount=user_editcount+1' ),
                                array( 'user_id' => $this->getId() ),
-                               __METHOD__ );
+                               __METHOD__
+                       );
 
                        // Lazy initialization check...
                        if( $dbw->affectedRows() == 0 ) {
-                               // Pull from a slave to be less cruel to servers
-                               // Accuracy isn't the point anyway here
-                               $dbr = wfGetDB( DB_SLAVE );
-                               $count = $dbr->selectField( 'revision',
-                                       'COUNT(rev_user)',
-                                       array( 'rev_user' => $this->getId() ),
-                                       __METHOD__ );
-
                                // Now here's a goddamn hack...
+                               $dbr = wfGetDB( DB_SLAVE );
                                if( $dbr !== $dbw ) {
                                        // If we actually have a slave server, the count is
                                        // at least one behind because the current transaction
                                        // has not been committed and replicated.
-                                       $count++;
+                                       $this->initEditCount( 1 );
                                } else {
                                        // But if DB_SLAVE is selecting the master, then the
                                        // count we just read includes the revision that was
                                        // just added in the working transaction.
+                                       $this->initEditCount();
                                }
-
-                               $dbw->update( 'user',
-                                       array( 'user_editcount' => $count ),
-                                       array( 'user_id' => $this->getId() ),
-                                       __METHOD__ );
                        }
                }
                // edit count in user cache too
                $this->invalidateCache();
        }
 
+       /**
+        * Initialize user_editcount from data out of the revision table
+        *
+        * @param $add Integer Edits to add to the count from the revision table
+        * @return Integer Number of edits
+        */
+       protected function initEditCount( $add = 0 ) {
+               // Pull from a slave to be less cruel to servers
+               // Accuracy isn't the point anyway here
+               $dbr = wfGetDB( DB_SLAVE );
+               $count = (int) $dbr->selectField(
+                       'revision',
+                       'COUNT(rev_user)',
+                       array( 'rev_user' => $this->getId() ),
+                       __METHOD__
+               );
+               $count = $count + $add;
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->update(
+                       'user',
+                       array( 'user_editcount' => $count ),
+                       array( 'user_id' => $this->getId() ),
+                       __METHOD__
+               );
+
+               return $count;
+       }
+
        /**
         * Get the description of a given right
         *
@@ -4051,15 +4138,33 @@ class User {
        }
 
        /**
-        * @todo document
+        * Load the user options either from cache, the database or an array
+        *
+        * @param $data Rows for the current user out of the user_properties table
         */
-       protected function loadOptions() {
+       protected function loadOptions( $data = null ) {
+               global $wgContLang;
+
                $this->load();
-               if ( $this->mOptionsLoaded || !$this->getId() )
+
+               if ( $this->mOptionsLoaded ) {
                        return;
+               }
 
                $this->mOptions = self::getDefaultOptions();
 
+               if ( !$this->getId() ) {
+                       // For unlogged-in users, load language/variant options from request.
+                       // There's no need to do it for logged-in users: they can set preferences,
+                       // and handling of page content is done by $pageLang->getPreferredVariant() and such,
+                       // so don't override user's choice (especially when the user chooses site default).
+                       $variant = $wgContLang->getDefaultVariant();
+                       $this->mOptions['variant'] = $variant;
+                       $this->mOptions['language'] = $variant;
+                       $this->mOptionsLoaded = true;
+                       return;
+               }
+
                // Maybe load from the object
                if ( !is_null( $this->mOptionOverrides ) ) {
                        wfDebug( "User: loading options for user " . $this->getId() . " from override cache.\n" );
@@ -4067,21 +4172,27 @@ class User {
                                $this->mOptions[$key] = $value;
                        }
                } else {
-                       wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
-                       // Load from database
-                       $dbr = wfGetDB( DB_SLAVE );
+                       if( !is_array( $data ) ) {
+                               wfDebug( "User: loading options for user " . $this->getId() . " from database.\n" );
+                               // Load from database
+                               $dbr = wfGetDB( DB_SLAVE );
 
-                       $res = $dbr->select(
-                               'user_properties',
-                               array( 'up_property', 'up_value' ),
-                               array( 'up_user' => $this->getId() ),
-                               __METHOD__
-                       );
+                               $res = $dbr->select(
+                                       'user_properties',
+                                       array( 'up_property', 'up_value' ),
+                                       array( 'up_user' => $this->getId() ),
+                                       __METHOD__
+                               );
 
-                       $this->mOptionOverrides = array();
-                       foreach ( $res as $row ) {
-                               $this->mOptionOverrides[$row->up_property] = $row->up_value;
-                               $this->mOptions[$row->up_property] = $row->up_value;
+                               $this->mOptionOverrides = array();
+                               $data = array();
+                               foreach ( $res as $row ) {
+                                       $data[$row->up_property] = $row->up_value;
+                               }
+                       }
+                       foreach ( $data as $property => $value ) {
+                               $this->mOptionOverrides[$property] = $value;
+                               $this->mOptions[$property] = $value;
                        }
                }
 
index 01e7132..daf7435 100644 (file)
@@ -152,6 +152,7 @@ class UserMailer {
         * @param $body String: email's text.
         * @param $replyto MailAddress: optional reply-to email (default: null).
         * @param $contentType String: optional custom Content-Type (default: text/plain; charset=UTF-8)
+        * @throws MWException
         * @return Status object
         */
        public static function send( $to, $from, $subject, $body, $replyto = null, $contentType = 'text/plain; charset=UTF-8' ) {
@@ -194,7 +195,7 @@ class UserMailer {
                #  NOTE: To: is for presentation, the actual recipient is specified
                #  by the mailer using the Rcpt-To: header.
                #
-               # Subject: 
+               # Subject:
                #  PHP mail() second argument to pass the subject, passing a Subject
                #  as an additional header will result in a duplicate header.
                #
@@ -228,7 +229,7 @@ class UserMailer {
                if ( is_array( $wgSMTP ) ) {
                        #
                        # PEAR MAILER
-                       # 
+                       #
 
                        if ( function_exists( 'stream_resolve_include_path' ) ) {
                                $found = stream_resolve_include_path( 'Mail.php' );
@@ -260,7 +261,7 @@ class UserMailer {
                        }
 
                        # Split jobs since SMTP servers tends to limit the maximum
-                       # number of possible recipients.        
+                       # number of possible recipients.
                        $chunks = array_chunk( $to, $wgEnotifMaxRecips );
                        foreach ( $chunks as $chunk ) {
                                $status = self::sendWithPear( $mail_object, $chunk, $headers, $body );
@@ -272,8 +273,8 @@ class UserMailer {
                        }
                        wfRestoreWarnings();
                        return Status::newGood();
-               } else  {
-                       # 
+               } else {
+                       #
                        # PHP mail()
                        #
 
@@ -395,7 +396,7 @@ class UserMailer {
  */
 class EmailNotification {
        protected $subject, $body, $replyto, $from;
-       protected $timestamp, $summary, $minorEdit, $oldid, $composed_common;
+       protected $timestamp, $summary, $minorEdit, $oldid, $composed_common, $pageStatus;
        protected $mailTargets = array();
 
        /**
@@ -420,8 +421,9 @@ class EmailNotification {
         * @param $summary
         * @param $minorEdit
         * @param $oldid (default: false)
+        * @param $pageStatus (default: 'changed')
         */
-       public function notifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid = false ) {
+       public function notifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid = false, $pageStatus = 'changed' ) {
                global $wgEnotifUseJobQ, $wgEnotifWatchlist, $wgShowUpdatedMarker, $wgEnotifMinorEdits,
                        $wgUsersNotifiedOnAllChanges, $wgEnotifUserTalk;
 
@@ -446,19 +448,23 @@ class EmailNotification {
                                $watchers[] = intval( $row->wl_user );
                        }
                        if ( $watchers ) {
-                               // Update wl_notificationtimestamp for all watching users except
-                               // the editor
-                               $dbw->begin( __METHOD__ );
-                               $dbw->update( 'watchlist',
-                                       array( /* SET */
-                                               'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
-                                       ), array( /* WHERE */
-                                               'wl_user' => $watchers,
-                                               'wl_namespace' => $title->getNamespace(),
-                                               'wl_title' => $title->getDBkey(),
-                                       ), __METHOD__
+                               // Update wl_notificationtimestamp for all watching users except the editor
+                               $fname = __METHOD__;
+                               $dbw->onTransactionIdle(
+                                       function() use ( $dbw, $timestamp, $watchers, $title, $fname ) {
+                                               $dbw->begin( $fname );
+                                               $dbw->update( 'watchlist',
+                                                       array( /* SET */
+                                                               'wl_notificationtimestamp' => $dbw->timestamp( $timestamp )
+                                                       ), array( /* WHERE */
+                                                               'wl_user'      => $watchers,
+                                                               'wl_namespace' => $title->getNamespace(),
+                                                               'wl_title'     => $title->getDBkey(),
+                                                       ), $fname
+                                               );
+                                               $dbw->commit( $fname );
+                                       }
                                );
-                               $dbw->commit( __METHOD__ );
                        }
                }
 
@@ -488,12 +494,13 @@ class EmailNotification {
                                'summary' => $summary,
                                'minorEdit' => $minorEdit,
                                'oldid' => $oldid,
-                               'watchers' => $watchers
+                               'watchers' => $watchers,
+                               'pageStatus' => $pageStatus
                        );
                        $job = new EnotifNotifyJob( $title, $params );
                        $job->insert();
                } else {
-                       $this->actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers );
+                       $this->actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers, $pageStatus );
                }
        }
 
@@ -511,7 +518,8 @@ class EmailNotification {
         * @param $oldid int Revision ID
         * @param $watchers array of user IDs
         */
-       public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit, $oldid, $watchers ) {
+       public function actuallyNotifyOnPageChange( $editor, $title, $timestamp, $summary, $minorEdit,
+               $oldid, $watchers, $pageStatus = 'changed' ) {
                # we use $wgPasswordSender as sender's address
                global $wgEnotifWatchlist;
                global $wgEnotifMinorEdits, $wgEnotifUserTalk;
@@ -531,6 +539,14 @@ class EmailNotification {
                $this->oldid = $oldid;
                $this->editor = $editor;
                $this->composed_common = false;
+               $this->pageStatus = $pageStatus;
+
+               $formattedPageStatus = array( 'deleted', 'created', 'moved', 'restored', 'changed' );
+
+               wfRunHooks( 'UpdateUserMailerFormattedPageStatus', array( &$formattedPageStatus ) );
+               if ( !in_array( $this->pageStatus, $formattedPageStatus ) ) {
+                       throw new MWException( 'Not a valid page status!' );
+               }
 
                $userTalkId = false;
 
@@ -620,26 +636,27 @@ class EmailNotification {
 
                $keys = array();
                $postTransformKeys = array();
+               $pageTitleUrl = $this->title->getCanonicalUrl();
+               $pageTitle = $this->title->getPrefixedText();
 
                if ( $this->oldid ) {
                        // Always show a link to the diff which triggered the mail. See bug 32210.
-                       $keys['$NEWPAGE'] = wfMessage( 'enotif_lastdiff',
+                       $keys['$NEWPAGE'] = "\n\n" . wfMessage( 'enotif_lastdiff',
                                $this->title->getCanonicalUrl( 'diff=next&oldid=' . $this->oldid ) )
                                ->inContentLanguage()->text();
+
                        if ( !$wgEnotifImpersonal ) {
                                // For personal mail, also show a link to the diff of all changes
                                // since last visited.
-                               $keys['$NEWPAGE'] .= " \n" . wfMessage( 'enotif_lastvisited',
+                               $keys['$NEWPAGE'] .= "\n\n" .  wfMessage( 'enotif_lastvisited',
                                        $this->title->getCanonicalUrl( 'diff=0&oldid=' . $this->oldid ) )
                                        ->inContentLanguage()->text();
                        }
                        $keys['$OLDID']   = $this->oldid;
-                       $keys['$CHANGEDORCREATED'] = wfMessage( 'changed' )->inContentLanguage()->text();
                } else {
-                       $keys['$NEWPAGE'] = wfMessage( 'enotif_newpagetext' )->inContentLanguage()->text();
                        # clear $OLDID placeholder in the message template
                        $keys['$OLDID']   = '';
-                       $keys['$CHANGEDORCREATED'] = wfMessage( 'created' )->inContentLanguage()->text();
+                       $keys['$NEWPAGE'] = '';
                }
 
                $keys['$PAGETITLE'] = $this->title->getPrefixedText();
@@ -653,6 +670,7 @@ class EmailNotification {
                        $keys['$PAGEEDITOR'] = wfMessage( 'enotif_anon_editor', $this->editor->getName() )
                                ->inContentLanguage()->text();
                        $keys['$PAGEEDITOR_EMAIL'] = wfMessage( 'noemailtitle' )->inContentLanguage()->text();
+
                } else {
                        $keys['$PAGEEDITOR'] = $wgEnotifUseRealName ? $this->editor->getRealName() : $this->editor->getName();
                        $emailPage = SpecialPage::getSafeTitleFor( 'Emailuser', $this->editor->getName() );
@@ -665,11 +683,12 @@ class EmailNotification {
                $postTransformKeys['$PAGESUMMARY'] = $this->summary == '' ? ' - ' : $this->summary;
 
                # Now build message's subject and body
+               $this->subject = wfMessage( 'enotif_subject_' . $this->pageStatus )->inContentLanguage()
+                       ->params( $pageTitle, $keys['$PAGEEDITOR'] )->escaped();
 
-               $subject = wfMessage( 'enotif_subject' )->inContentLanguage()->plain();
-               $subject = strtr( $subject, $keys );
-               $subject = MessageCache::singleton()->transform( $subject, false, null, $this->title );
-               $this->subject = strtr( $subject, $postTransformKeys );
+               $keys['$PAGEINTRO'] = wfMessage( 'enotif_body_intro_' . $this->pageStatus )
+                       ->inContentLanguage()->params( $pageTitle, $keys['$PAGEEDITOR'], $pageTitleUrl )
+                       ->escaped();
 
                $body = wfMessage( 'enotif_body' )->inContentLanguage()->plain();
                $body = strtr( $body, $keys );
index 2cc6338..e251ac5 100644 (file)
@@ -380,10 +380,9 @@ class WebRequest {
                return $ret;
        }
 
-       
        /**
         * Unset an arbitrary value from our get/post data.
-        *
+        *
         * @param $key String: key name to use
         * @return Mixed: old value if one was present, null otherwise
         */
@@ -620,6 +619,7 @@ class WebRequest {
         * Return the path and query string portion of the request URI.
         * This will be suitable for use as a relative link in HTML output.
         *
+        * @throws MWException
         * @return String
         */
        public function getRequestURL() {
@@ -907,6 +907,7 @@ class WebRequest {
         * false if an error message has been shown and the request should be aborted.
         *
         * @param $extWhitelist array
+        * @throws HttpError
         * @return bool
         */
        public function checkUrlExtension( $extWhitelist = array() ) {
@@ -1046,19 +1047,26 @@ HTML;
         * @return String
         */
        protected function getRawIP() {
-               if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
-                       return IP::canonicalize( $_SERVER['REMOTE_ADDR'] );
-               } else {
+               if ( !isset( $_SERVER['REMOTE_ADDR'] ) ) {
                        return null;
                }
+
+               if ( is_array( $_SERVER['REMOTE_ADDR'] ) || strpos( $_SERVER['REMOTE_ADDR'], ',' ) !== false ) {
+                       throw new MWException( __METHOD__ . " : Could not determine the remote IP address due to multiple values." );
+               } else {
+                       $ipchain = $_SERVER['REMOTE_ADDR'];
+               }
+
+               return IP::canonicalize( $ipchain );
        }
 
        /**
         * Work out the IP address based on various globals
         * For trusted proxies, use the XFF client IP (first of the chain)
-        * 
+        *
         * @since 1.19
         *
+        * @throws MWException
         * @return string
         */
        public function getIP() {
@@ -1238,6 +1246,7 @@ class FauxRequest extends WebRequest {
         *   fake GET/POST values
         * @param $wasPosted Bool: whether to treat the data as POST
         * @param $session Mixed: session array or null
+        * @throws MWException
         */
        public function __construct( $data = array(), $wasPosted = false, $session = null ) {
                if( is_array( $data ) ) {
index 193101b..e467738 100644 (file)
@@ -44,9 +44,13 @@ class WebResponse {
         * @param $value String: value to give cookie
         * @param $expire Int: number of seconds til cookie expires
         * @param $prefix String: Prefix to use, if not $wgCookiePrefix (use '' for no prefix)
-        * @param @domain String: Cookie domain to use, if not $wgCookieDomain
+        * @param $domain String: Cookie domain to use, if not $wgCookieDomain
+        * @param $forceSecure Bool:
+        *   true: force the cookie to be set with the secure attribute
+        *   false: force the cookie to be set without the secure attribute
+        *   null: use the value from $wgCookieSecure
         */
-       public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null ) {
+       public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
                global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain;
                global $wgCookieSecure,$wgCookieExpiration, $wgCookieHttpOnly;
                if ( $expire == 0 ) {
@@ -58,6 +62,13 @@ class WebResponse {
                if( $domain === null ) {
                        $domain = $wgCookieDomain;
                }
+
+               if ( is_null( $forceSecure ) ) {
+                       $secureCookie = $wgCookieSecure;
+               } else {
+                       $secureCookie = $forceSecure;
+               }
+
                $httpOnlySafe = wfHttpOnlySafe() && $wgCookieHttpOnly;
                wfDebugLog( 'cookie',
                        'setcookie: "' . implode( '", "',
@@ -67,14 +78,14 @@ class WebResponse {
                                        $expire,
                                        $wgCookiePath,
                                        $domain,
-                                       $wgCookieSecure,
+                                       $secureCookie,
                                        $httpOnlySafe ) ) . '"' );
                setcookie( $prefix . $name,
                        $value,
                        $expire,
                        $wgCookiePath,
                        $domain,
-                       $wgCookieSecure,
+                       $secureCookie,
                        $httpOnlySafe );
        }
 }
@@ -138,9 +149,9 @@ class FauxResponse extends WebResponse {
         * @param $expire Int: number of seconds til cookie expires (Default: 0)
         * @param $prefix TODO DOCUMENT (Default: null)
         * @param $domain TODO DOCUMENT (Default: null)
-        *
+        * @param $forceSecure TODO DOCUMENT (Default: null)
         */
-       public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null ) {
+       public function setcookie( $name, $value, $expire = 0, $prefix = null, $domain = null, $forceSecure = null ) {
                $this->cookies[$name] = $value;
        }
 
index 01c5eea..247f810 100644 (file)
@@ -156,4 +156,3 @@ wfProfileOut( 'WebStart.php-ob_start' );
 if ( !defined( 'MW_NO_SETUP' ) ) {
        require_once( MWInit::compiledPath( "includes/Setup.php" ) );
 }
-
index a4a8903..d4840cc 100644 (file)
@@ -169,6 +169,7 @@ class MediaWiki {
         * - special pages
         * - normal pages
         *
+        * @throws MWException|PermissionsError|BadTitleError|HttpError
         * @return void
         */
        private function performRequest() {
@@ -177,7 +178,7 @@ class MediaWiki {
                wfProfileIn( __METHOD__ );
 
                $request = $this->context->getRequest();
-               $title = $this->context->getTitle();
+               $requestTitle = $title = $this->context->getTitle();
                $output = $this->context->getOutput();
                $user = $this->context->getUser();
 
@@ -301,7 +302,7 @@ class MediaWiki {
                                global $wgArticle;
                                $wgArticle = new DeprecatedGlobal( 'wgArticle', $article, '1.18' );
 
-                               $this->performAction( $article );
+                               $this->performAction( $article, $requestTitle );
                        } elseif ( is_string( $article ) ) {
                                $output->redirect( $article );
                        } else {
@@ -395,8 +396,9 @@ class MediaWiki {
         * Perform one of the "standard" actions
         *
         * @param $page Page
+        * @param $requestTitle The original title, before any redirects were applied
         */
-       private function performAction( Page $page ) {
+       private function performAction( Page $page, Title $requestTitle ) {
                global $wgUseSquid, $wgSquidMaxage;
 
                wfProfileIn( __METHOD__ );
@@ -419,7 +421,7 @@ class MediaWiki {
                if ( $action instanceof Action ) {
                        # Let Squid cache things if we can purge them.
                        if ( $wgUseSquid &&
-                               in_array( $request->getFullRequestURL(), $title->getSquidURLs() )
+                               in_array( $request->getFullRequestURL(), $requestTitle->getSquidURLs() )
                        ) {
                                $output->setSquidMaxage( $wgSquidMaxage );
                        }
@@ -490,6 +492,23 @@ class MediaWiki {
 
                $request = $this->context->getRequest();
 
+               if ( $request->getCookie( 'forceHTTPS' )
+                       && $request->detectProtocol() == 'http'
+                       && $request->getMethod() == 'GET'
+               ) {
+                       $redirUrl = $request->getFullRequestURL();
+                       $redirUrl = str_replace( 'http://' , 'https://' , $redirUrl );
+
+                       // Setup dummy Title, otherwise OutputPage::redirect will fail
+                       $title = Title::newFromText( NS_MAIN, 'REDIR' );
+                       $this->context->setTitle( $title );
+                       $output = $this->context->getOutput();
+                       $output->redirect( $redirUrl );
+                       $output->output();
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+
                // Send Ajax requests to the Ajax dispatcher.
                if ( $wgUseAjax && $request->getVal( 'action', 'view' ) == 'ajax' ) {
 
@@ -555,9 +574,6 @@ class MediaWiki {
                // 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();
 
@@ -578,28 +594,51 @@ class MediaWiki {
                if ( $wgJobRunRate <= 0 || wfReadOnly() ) {
                        return;
                }
+
                if ( $wgJobRunRate < 1 ) {
                        $max = mt_getrandmax();
                        if ( mt_rand( 0, $max ) > $max * $wgJobRunRate ) {
-                               return;
+                               return; // the higher $wgJobRunRate, the less likely we return here
                        }
                        $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";
+               $group = JobQueueGroup::singleton();
+               $types = $group->getDefaultQueueTypes();
+               shuffle( $types ); // avoid starvation
+
+               // Scan the queues for a job N times...
+               do {
+                       $jobFound = false; // found a job in any queue?
+                       // Find a queue with a job on it and run it...
+                       foreach ( $types as $i => $type ) {
+                               $queue = $group->get( $type );
+                               if ( $queue->isEmpty() ) {
+                                       unset( $types[$i] ); // don't keep checking this queue
+                                       continue;
+                               }
+                               $job = $queue->pop();
+                               if ( $job ) {
+                                       $jobFound = true;
+                                       $output = $job->toString() . "\n";
+                                       $t = - microtime( true );
+                                       $success = $job->run();
+                                       $queue->ack( $job ); // done
+                                       $t += microtime( true );
+                                       $t = round( $t * 1000 );
+                                       if ( !$success ) {
+                                               $output .= "Error: " . $job->getLastError() . ", Time: $t ms\n";
+                                       } else {
+                                               $output .= "Success, Time: $t ms\n";
+                                       }
+                                       wfDebugLog( 'jobqueue', $output );
+                                       break;
+                               } else {
+                                       unset( $types[$i] ); // don't keep checking this queue
+                               }
                        }
-                       wfDebugLog( 'jobqueue', $output );
-               }
+               } while ( --$n && $jobFound );
        }
 }
index 9fb1522..0114cce 100644 (file)
@@ -41,7 +41,9 @@ class WikiFilePage extends WikiPage {
        }
 
        public function getActionOverrides() {
-               return array( 'revert' => 'RevertFileAction' );
+               $overrides = parent::getActionOverrides();
+               $overrides[ 'revert' ] = 'RevertFileAction';
+               return $overrides;
        }
 
        /**
@@ -103,13 +105,12 @@ class WikiFilePage extends WikiPage {
        }
 
        /**
-        * @param bool $text
         * @return bool
         */
-       public function isRedirect( $text = false ) {
+       public function isRedirect( ) {
                $this->loadFile();
                if ( $this->mFile->isLocal() ) {
-                       return parent::isRedirect( $text );
+                       return parent::isRedirect();
                }
 
                return (bool)$this->mFile->getRedirected();
index 5a3a9e6..0b588cb 100644 (file)
@@ -187,7 +187,21 @@ class WikiPage extends Page implements IDBAccessObject {
         * @return Array
         */
        public function getActionOverrides() {
-               return array();
+               $content_handler = $this->getContentHandler();
+               return $content_handler->getActionOverrides();
+       }
+
+       /**
+        * Returns the ContentHandler instance to be used to deal with the content of this WikiPage.
+        *
+        * Shorthand for ContentHandler::getForModelID( $this->getContentModel() );
+        *
+        * @return ContentHandler
+        *
+        * @since 1.21
+        */
+       public function getContentHandler() {
+               return ContentHandler::getForModelID( $this->getContentModel() );
        }
 
        /**
@@ -231,7 +245,9 @@ class WikiPage extends Page implements IDBAccessObject {
         * @return array
         */
        public static function selectFields() {
-               return array(
+               global $wgContentHandlerUseDB;
+
+               $fields = array(
                        'page_id',
                        'page_namespace',
                        'page_title',
@@ -244,6 +260,12 @@ class WikiPage extends Page implements IDBAccessObject {
                        'page_latest',
                        'page_len',
                );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'page_content_model';
+               }
+
+               return $fields;
        }
 
        /**
@@ -418,21 +440,42 @@ class WikiPage extends Page implements IDBAccessObject {
        }
 
        /**
-        * Tests if the article text represents a redirect
+        * Tests if the article content represents a redirect
         *
-        * @param $text mixed string containing article contents, or boolean
         * @return bool
         */
-       public function isRedirect( $text = false ) {
-               if ( $text === false ) {
-                       if ( !$this->mDataLoaded ) {
-                               $this->loadPageData();
-                       }
+       public function isRedirect( ) {
+               $content = $this->getContent();
+               if ( !$content ) return false;
 
-                       return (bool)$this->mIsRedirect;
-               } else {
-                       return Title::newFromRedirect( $text ) !== null;
+               return $content->isRedirect();
+       }
+
+       /**
+        * Returns the page's content model id (see the CONTENT_MODEL_XXX constants).
+        *
+        * Will use the revisions actual content model if the page exists,
+        * and the page's default if the page doesn't exist yet.
+        *
+        * @return String
+        *
+        * @since 1.21
+        */
+       public function getContentModel() {
+               if ( $this->exists() ) {
+                       # look at the revision's actual content model
+                       $rev = $this->getRevision();
+
+                       if ( $rev !== null ) {
+                               return $rev->getContentModel();
+                       } else {
+                               $title = $this->mTitle->getPrefixedDBkey();
+                               wfWarn( "Page $title exists but has no (visible) revisions!" );
+                       }
                }
+
+               # use the default model for this page
+               return $this->mTitle->getContentModel();
        }
 
        /**
@@ -554,6 +597,27 @@ class WikiPage extends Page implements IDBAccessObject {
                return null;
        }
 
+       /**
+        * Get the content of the current revision. No side-effects...
+        *
+        * @param $audience Integer: one of:
+        *      Revision::FOR_PUBLIC       to be displayed to all users
+        *      Revision::FOR_THIS_USER    to be displayed to $wgUser
+        *      Revision::RAW              get the text regardless of permissions
+        * @param $user User object to check for, only if FOR_THIS_USER is passed
+        *              to the $audience parameter
+        * @return Content|null The content of the current revision
+        *
+        * @since 1.21
+        */
+       public function getContent( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+               $this->loadLastEdit();
+               if ( $this->mLastRevision ) {
+                       return $this->mLastRevision->getContent( $audience );
+               }
+               return null;
+       }
+
        /**
         * Get the text of the current revision. No side-effects...
         *
@@ -563,9 +627,12 @@ class WikiPage extends Page implements IDBAccessObject {
         *      Revision::RAW              get the text regardless of permissions
         * @param $user User object to check for, only if FOR_THIS_USER is passed
         *              to the $audience parameter
-        * @return String|bool The text of the current revision. False on failure
+        * @return String|false The text of the current revision
+        * @deprecated as of 1.21, getContent() should be used instead.
         */
-       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) {
+       public function getText( $audience = Revision::FOR_PUBLIC, User $user = null ) { #@todo: deprecated, replace usage!
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
                $this->loadLastEdit();
                if ( $this->mLastRevision ) {
                        return $this->mLastRevision->getText( $audience, $user );
@@ -577,13 +644,12 @@ class WikiPage extends Page implements IDBAccessObject {
         * Get the text of the current revision. No side-effects...
         *
         * @return String|bool The text of the current revision. False on failure
+        * @deprecated as of 1.21, getContent() should be used instead.
         */
        public function getRawText() {
-               $this->loadLastEdit();
-               if ( $this->mLastRevision ) {
-                       return $this->mLastRevision->getRawText();
-               }
-               return false;
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               return $this->getText( Revision::RAW );
        }
 
        /**
@@ -733,32 +799,34 @@ class WikiPage extends Page implements IDBAccessObject {
                        return false;
                }
 
-               $text = $editInfo ? $editInfo->pst : false;
+               if ( $editInfo ) {
+                       $content = $editInfo->pstContent;
+               } else {
+                       $content = $this->getContent();
+               }
 
-               if ( $this->isRedirect( $text ) ) {
+               if ( !$content || $content->isRedirect( ) ) {
                        return false;
                }
 
-               switch ( $wgArticleCountMethod ) {
-               case 'any':
-                       return true;
-               case 'comma':
-                       if ( $text === false ) {
-                               $text = $this->getRawText();
-                       }
-                       return strpos( $text,  ',' ) !== false;
-               case 'link':
+               $hasLinks = null;
+
+               if ( $wgArticleCountMethod === 'link' ) {
+                       # nasty special case to avoid re-parsing to detect links
+
                        if ( $editInfo ) {
                                // ParserOutput::getLinks() is a 2D array of page links, so
                                // to be really correct we would need to recurse in the array
                                // but the main array should only have items in it if there are
                                // links.
-                               return (bool)count( $editInfo->output->getLinks() );
+                               $hasLinks = (bool)count( $editInfo->output->getLinks() );
                        } else {
-                               return (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
+                               $hasLinks = (bool)wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
                                        array( 'pl_from' => $this->getId() ), __METHOD__ );
                        }
                }
+
+               return $content->isCountable( $hasLinks );
        }
 
        /**
@@ -804,7 +872,8 @@ class WikiPage extends Page implements IDBAccessObject {
         */
        public function insertRedirect() {
                // recurse through to only get the final target
-               $retval = Title::newFromRedirectRecurse( $this->getRawText() );
+               $content = $this->getContent();
+               $retval = $content ? $content->getUltimateRedirectTarget() : null;
                if ( !$retval ) {
                        return null;
                }
@@ -1000,7 +1069,7 @@ class WikiPage extends Page implements IDBAccessObject {
                        && $parserOptions->getStubThreshold() == 0
                        && $this->mTitle->exists()
                        && ( $oldid === null || $oldid === 0 || $oldid === $this->getLatest() )
-                       && $this->mTitle->isWikitextPage();
+                       && $this->getContentHandler()->isParserCacheSupported();
        }
 
        /**
@@ -1011,6 +1080,7 @@ class WikiPage extends Page implements IDBAccessObject {
         * @param $parserOptions ParserOptions to use for the parse operation
         * @param $oldid Revision ID to get the text from, passing null or 0 will
         *               get the current revision (default value)
+        *
         * @return ParserOutput or false if the revision was not found
         */
        public function getParserOutput( ParserOptions $parserOptions, $oldid = null ) {
@@ -1088,8 +1158,16 @@ class WikiPage extends Page implements IDBAccessObject {
                }
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
+                       //@todo: move this logic to MessageCache
+
                        if ( $this->mTitle->exists() ) {
-                               $text = $this->getRawText();
+                               // NOTE: use transclusion text for messages.
+                               //       This is consistent with  MessageCache::getMsgFromNamespace()
+
+                               $content = $this->getContent();
+                               $text = $content === null ? null : $content->getWikitextForTransclusion();
+
+                               if ( $text === null ) $text = false;
                        } else {
                                $text = false;
                        }
@@ -1154,11 +1232,13 @@ class WikiPage extends Page implements IDBAccessObject {
         * @private
         */
        public function updateRevisionOn( $dbw, $revision, $lastRevision = null, $lastRevIsRedirect = null ) {
+               global $wgContentHandlerUseDB;
+
                wfProfileIn( __METHOD__ );
 
-               $text = $revision->getText();
-               $len = strlen( $text );
-               $rt = Title::newFromRedirectRecurse( $text );
+               $content = $revision->getContent();
+               $len = $content ? $content->getSize() : 0;
+               $rt = $content ? $content->getUltimateRedirectTarget() : null;
 
                $conditions = array( 'page_id' => $this->getId() );
 
@@ -1168,14 +1248,20 @@ class WikiPage extends Page implements IDBAccessObject {
                }
 
                $now = wfTimestampNow();
+               $row = array( /* SET */
+                       'page_latest'      => $revision->getId(),
+                       'page_touched'     => $dbw->timestamp( $now ),
+                       'page_is_new'      => ( $lastRevision === 0 ) ? 1 : 0,
+                       'page_is_redirect' => $rt !== null ? 1 : 0,
+                       'page_len'         => $len,
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $row[ 'page_content_model' ] = $revision->getContentModel();
+               }
+
                $dbw->update( 'page',
-                       array( /* SET */
-                               'page_latest'      => $revision->getId(),
-                               'page_touched'     => $dbw->timestamp( $now ),
-                               'page_is_new'      => ( $lastRevision === 0 ) ? 1 : 0,
-                               'page_is_redirect' => $rt !== null ? 1 : 0,
-                               'page_len'         => $len,
-                       ),
+                       $row,
                        $conditions,
                        __METHOD__ );
 
@@ -1187,7 +1273,8 @@ class WikiPage extends Page implements IDBAccessObject {
                        $this->mLatest = $revision->getId();
                        $this->mIsRedirect = (bool)$rt;
                        # Update the LinkCache.
-                       LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect, $this->mLatest );
+                       LinkCache::singleton()->addGoodLinkObj( $this->getId(), $this->mTitle, $len, $this->mIsRedirect,
+                                                                                                       $this->mLatest, $revision->getContentModel() );
                }
 
                wfProfileOut( __METHOD__ );
@@ -1270,6 +1357,21 @@ class WikiPage extends Page implements IDBAccessObject {
                return $ret;
        }
 
+       /**
+        * Get the content that needs to be saved in order to undo all revisions
+        * between $undo and $undoafter. Revisions must belong to the same page,
+        * must exist and must not be deleted
+        * @param $undo Revision
+        * @param $undoafter Revision Must be an earlier revision than $undo
+        * @return mixed string on success, false on failure
+        * @since 1.21
+        * Before we had the Content object, this was done in getUndoText
+        */
+       public function getUndoContent( Revision $undo, Revision $undoafter = null ) {
+               $handler = $undo->getContentHandler();
+               return $handler->getUndoContent( $this->getRevision(), $undo, $undoafter );
+       }
+
        /**
         * Get the text that needs to be saved in order to undo all revisions
         * between $undo and $undoafter. Revisions must belong to the same page,
@@ -1277,27 +1379,29 @@ class WikiPage extends Page implements IDBAccessObject {
         * @param $undo Revision
         * @param $undoafter Revision Must be an earlier revision than $undo
         * @return mixed string on success, false on failure
+        * @deprecated since 1.21: use ContentHandler::getUndoContent() instead.
         */
        public function getUndoText( Revision $undo, Revision $undoafter = null ) {
-               $cur_text = $this->getRawText();
-               if ( $cur_text === false ) {
-                       return false; // no page
-               }
-               $undo_text = $undo->getText();
-               $undoafter_text = $undoafter->getText();
+               ContentHandler::deprecated( __METHOD__, '1.21' );
 
-               if ( $cur_text == $undo_text ) {
-                       # No use doing a merge if it's just a straight revert.
-                       return $undoafter_text;
-               }
+               $this->loadLastEdit();
 
-               $undone_text = '';
+               if ( $this->mLastRevision ) {
+                       if ( is_null( $undoafter ) ) {
+                               $undoafter = $undo->getPrevious();
+                       }
 
-               if ( !wfMerge( $undo_text, $undoafter_text, $cur_text, $undone_text ) ) {
-                       return false;
+                       $handler = $this->getContentHandler();
+                       $undone = $handler->getUndoContent( $this->mLastRevision, $undo, $undoafter );
+
+                       if ( !$undone ) {
+                               return false;
+                       } else {
+                               return ContentHandler::getContentText( $undone );
+                       }
                }
 
-               return $undone_text;
+               return false;
        }
 
        /**
@@ -1305,22 +1409,66 @@ class WikiPage extends Page implements IDBAccessObject {
         * @param $text String: new text of the section
         * @param $sectionTitle String: new section's subject, only if $section is 'new'
         * @param $edittime String: revision timestamp or null to use the current revision
-        * @return string Complete article text, or null if error
+        * @return String new complete article text, or null if error
+        *
+        * @deprecated since 1.21, use replaceSectionContent() instead
         */
        public function replaceSection( $section, $text, $sectionTitle = '', $edittime = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               if ( strval( $section ) == '' ) { //NOTE: keep condition in sync with condition in replaceSectionContent!
+                       // Whole-page edit; let the whole text through
+                       return $text;
+               }
+
+               if ( !$this->supportsSections() ) {
+                       throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
+               }
+
+               # could even make section title, but that's not required.
+               $sectionContent = ContentHandler::makeContent( $text, $this->getTitle() );
+
+               $newContent = $this->replaceSectionContent( $section, $sectionContent, $sectionTitle, $edittime );
+
+               return ContentHandler::getContentText( $newContent );
+       }
+
+       /**
+        * Returns true iff this page's content model supports sections.
+        *
+        * @return boolean whether sections are supported.
+        *
+        * @todo: the skin should check this and not offer section functionality if sections are not supported.
+        * @todo: the EditPage should check this and not offer section functionality if sections are not supported.
+        */
+       public function supportsSections() {
+               return $this->getContentHandler()->supportsSections();
+       }
+
+       /**
+        * @param $section null|bool|int or a section number (0, 1, 2, T1, T2...)
+        * @param $sectionContent Content: new content of the section
+        * @param $sectionTitle String: new section's subject, only if $section is 'new'
+        * @param $edittime String: revision timestamp or null to use the current revision
+        *
+        * @return Content new complete article content, or null if error
+        *
+        * @since 1.21
+        */
+       public function replaceSectionContent( $section, Content $sectionContent, $sectionTitle = '', $edittime = null ) {
                wfProfileIn( __METHOD__ );
 
                if ( strval( $section ) == '' ) {
                        // Whole-page edit; let the whole text through
+                       $newContent = $sectionContent;
                } else {
+                       if ( !$this->supportsSections() ) {
+                               throw new MWException( "sections not supported for content model " . $this->getContentHandler()->getModelID() );
+                       }
+
                        // Bug 30711: always use current version when adding a new section
                        if ( is_null( $edittime ) || $section == 'new' ) {
-                               $oldtext = $this->getRawText();
-                               if ( $oldtext === false ) {
-                                       wfDebug( __METHOD__ . ": no page text\n" );
-                                       wfProfileOut( __METHOD__ );
-                                       return null;
-                               }
+                               $oldContent = $this->getContent();
                        } else {
                                $dbw = wfGetDB( DB_MASTER );
                                $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime );
@@ -1332,28 +1480,21 @@ class WikiPage extends Page implements IDBAccessObject {
                                        return null;
                                }
 
-                               $oldtext = $rev->getText();
+                               $oldContent = $rev->getContent();
                        }
 
-                       if ( $section == 'new' ) {
-                               # Inserting a new section
-                               $subject = $sectionTitle ? wfMessage( 'newsectionheaderdefaultlevel' )
-                                       ->rawParams( $sectionTitle )->inContentLanguage()->text() . "\n\n" : '';
-                               if ( wfRunHooks( 'PlaceNewSection', array( $this, $oldtext, $subject, &$text ) ) ) {
-                                       $text = strlen( trim( $oldtext ) ) > 0
-                                               ? "{$oldtext}\n\n{$subject}{$text}"
-                                               : "{$subject}{$text}";
-                               }
-                       } else {
-                               # Replacing an existing section; roll out the big guns
-                               global $wgParser;
-
-                               $text = $wgParser->replaceSection( $oldtext, $section, $text );
+                       if ( ! $oldContent ) {
+                               wfDebug( __METHOD__ . ": no page text\n" );
+                               wfProfileOut( __METHOD__ );
+                               return null;
                        }
+
+                       //FIXME: $oldContent might be null?
+                       $newContent = $oldContent->replaceSection( $section, $sectionContent, $sectionTitle );
                }
 
                wfProfileOut( __METHOD__ );
-               return $text;
+               return $newContent;
        }
 
        /**
@@ -1419,8 +1560,66 @@ class WikiPage extends Page implements IDBAccessObject {
         *     revision:                The revision object for the inserted revision, or null
         *
         *  Compatibility note: this function previously returned a boolean value indicating success/failure
+        *
+        * @deprecated since 1.21: use doEditContent() instead.
         */
        public function doEdit( $text, $summary, $flags = 0, $baseRevId = false, $user = null ) {
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+
+               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+
+               return $this->doEditContent( $content, $summary, $flags, $baseRevId, $user );
+       }
+
+       /**
+        * Change an existing article or create a new article. Updates RC and all necessary caches,
+        * optionally via the deferred update array.
+        *
+        * @param $content Content: new content
+        * @param $summary String: edit summary
+        * @param $flags Integer bitfield:
+        *      EDIT_NEW
+        *          Article is known or assumed to be non-existent, create a new one
+        *      EDIT_UPDATE
+        *          Article is known or assumed to be pre-existing, update it
+        *      EDIT_MINOR
+        *          Mark this edit minor, if the user is allowed to do so
+        *      EDIT_SUPPRESS_RC
+        *          Do not log the change in recentchanges
+        *      EDIT_FORCE_BOT
+        *          Mark the edit a "bot" edit regardless of user rights
+        *      EDIT_DEFER_UPDATES
+        *          Defer some of the updates until the end of index.php
+        *      EDIT_AUTOSUMMARY
+        *          Fill in blank summaries with generated text where possible
+        *
+        * If neither EDIT_NEW nor EDIT_UPDATE is specified, the status of the article will be detected.
+        * If EDIT_UPDATE is specified and the article doesn't exist, the function will return an
+        * edit-gone-missing error. If EDIT_NEW is specified and the article does exist, an
+        * edit-already-exists error will be returned. These two conditions are also possible with
+        * auto-detection due to MediaWiki's performance-optimised locking strategy.
+        *
+        * @param $baseRevId the revision ID this edit was based off, if any
+        * @param $user User the user doing the edit
+        * @param $serialisation_format String: format for storing the content in the database
+        *
+        * @return Status object. Possible errors:
+        *     edit-hook-aborted:       The ArticleSave hook aborted the edit but didn't set the fatal flag of $status
+        *     edit-gone-missing:       In update mode, but the article didn't exist
+        *     edit-conflict:           In update mode, the article changed unexpectedly
+        *     edit-no-change:          Warning that the text was the same as before
+        *     edit-already-exists:     In creation mode, but the article already exists
+        *
+        *  Extensions may define additional errors.
+        *
+        *  $return->value will contain an associative array with members as follows:
+        *     new:                     Boolean indicating if the function attempted to create a new article
+        *     revision:                The revision object for the inserted revision, or null
+        *
+        * @since 1.21
+        */
+       public function doEditContent( Content $content, $summary, $flags = 0, $baseRevId = false,
+                                                                  User $user = null, $serialisation_format = null ) {
                global $wgUser, $wgUseAutomaticEditSummaries, $wgUseRCPatrol, $wgUseNPPatrol;
 
                # Low-level sanity check
@@ -1430,6 +1629,13 @@ class WikiPage extends Page implements IDBAccessObject {
 
                wfProfileIn( __METHOD__ );
 
+               if ( !$content->getContentHandler()->canBeUsedOn( $this->getTitle() ) ) {
+                       wfProfileOut( __METHOD__ );
+                       return Status::newFatal( 'content-not-allowed-here',
+                               ContentHandler::getLocalizedName( $content->getModel() ),
+                               $this->getTitle()->getPrefixedText() );
+               }
+
                $user = is_null( $user ) ? $wgUser : $user;
                $status = Status::newGood( array() );
 
@@ -1440,10 +1646,14 @@ class WikiPage extends Page implements IDBAccessObject {
 
                $flags = $this->checkFlags( $flags );
 
-               if ( !wfRunHooks( 'ArticleSave', array( &$this, &$user, &$text, &$summary,
-                       $flags & EDIT_MINOR, null, null, &$flags, &$status ) ) )
-               {
-                       wfDebug( __METHOD__ . ": ArticleSave hook aborted save!\n" );
+               # handle hook
+               $hook_args = array( &$this, &$user, &$content, &$summary,
+                                                       $flags & EDIT_MINOR, null, null, &$flags, &$status );
+
+               if ( !wfRunHooks( 'PageContentSave', $hook_args )
+                       || !ContentHandler::runLegacyHooks( 'ArticleSave', $hook_args ) ) {
+
+                       wfDebug( __METHOD__ . ": ArticleSave or ArticleSaveContent hook aborted save!\n" );
 
                        if ( $status->isOK() ) {
                                $status->fatal( 'edit-hook-aborted' );
@@ -1457,20 +1667,25 @@ class WikiPage extends Page implements IDBAccessObject {
                $isminor = ( $flags & EDIT_MINOR ) && $user->isAllowed( 'minoredit' );
                $bot = $flags & EDIT_FORCE_BOT;
 
-               $oldtext = $this->getRawText(); // current revision
-               $oldsize = strlen( $oldtext );
+               $old_content = $this->getContent( Revision::RAW ); // current revision's content
+
+               $oldsize = $old_content ? $old_content->getSize() : 0;
                $oldid = $this->getLatest();
                $oldIsRedirect = $this->isRedirect();
                $oldcountable = $this->isCountable();
 
+               $handler = $content->getContentHandler();
+
                # Provide autosummaries if one is not provided and autosummaries are enabled.
                if ( $wgUseAutomaticEditSummaries && $flags & EDIT_AUTOSUMMARY && $summary == '' ) {
-                       $summary = self::getAutosummary( $oldtext, $text, $flags );
+                       if ( !$old_content ) $old_content = null;
+                       $summary = $handler->getAutosummary( $old_content, $content, $flags );
                }
 
-               $editInfo = $this->prepareTextForEdit( $text, null, $user );
-               $text = $editInfo->pst;
-               $newsize = strlen( $text );
+               $editInfo = $this->prepareContentForEdit( $content, null, $user, $serialisation_format );
+               $serialized = $editInfo->pst;
+               $content = $editInfo->pstContent;
+               $newsize =  $content->getSize();
 
                $dbw = wfGetDB( DB_MASTER );
                $now = wfTimestampNow();
@@ -1487,7 +1702,7 @@ class WikiPage extends Page implements IDBAccessObject {
 
                                wfProfileOut( __METHOD__ );
                                return $status;
-                       } elseif ( $oldtext === false ) {
+                       } elseif ( !$old_content ) {
                                # Sanity check for bug 37225
                                wfProfileOut( __METHOD__ );
                                throw new MWException( "Could not find text for current revision {$oldid}." );
@@ -1495,22 +1710,38 @@ class WikiPage extends Page implements IDBAccessObject {
 
                        $revision = new Revision( array(
                                'page'       => $this->getId(),
+                               'title'      => $this->getTitle(), // for determining the default content model
                                'comment'    => $summary,
                                'minor_edit' => $isminor,
-                               'text'       => $text,
+                               'text'       => $serialized,
+                               'len'        => $newsize,
                                'parent_id'  => $oldid,
                                'user'       => $user->getId(),
                                '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
+                               'timestamp'  => $now,
+                               'content_model' => $content->getModel(),
+                               'content_format' => $serialisation_format,
+                       ) ); #XXX: pass content object?!
 
-                       $changed = ( strcmp( $text, $oldtext ) != 0 );
+                       $changed = !$content->equals( $old_content );
 
                        if ( $changed ) {
+                               if ( !$content->isValid() ) {
+                                       throw new MWException( "New content failed validity check!" );
+                               }
+
                                $dbw->begin( __METHOD__ );
+
+                               $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+                               $status->merge( $prepStatus );
+
+                               if ( !$status->isOK() ) {
+                                       $dbw->rollback( __METHOD__ );
+
+                                       wfProfileOut( __METHOD__ );
+                                       return $status;
+                               }
+
                                $revisionId = $revision->insertOn( $dbw );
 
                                # Update page
@@ -1558,8 +1789,14 @@ class WikiPage extends Page implements IDBAccessObject {
                        }
 
                        # Update links tables, site stats, etc.
-                       $this->doEditUpdates( $revision, $user, array( 'changed' => $changed,
-                               'oldcountable' => $oldcountable ) );
+                       $this->doEditUpdates(
+                               $revision,
+                               $user,
+                               array(
+                                       'changed' => $changed,
+                                       'oldcountable' => $oldcountable
+                               )
+                       );
 
                        if ( !$changed ) {
                                $status->warning( 'edit-no-change' );
@@ -1574,6 +1811,18 @@ class WikiPage extends Page implements IDBAccessObject {
 
                        $dbw->begin( __METHOD__ );
 
+                       $prepStatus = $content->prepareSave( $this, $flags, $baseRevId, $user );
+                       $status->merge( $prepStatus );
+
+                       if ( !$status->isOK() ) {
+                               $dbw->rollback( __METHOD__ );
+
+                               wfProfileOut( __METHOD__ );
+                               return $status;
+                       }
+
+                       $status->merge( $prepStatus );
+
                        # Add the page record; stake our claim on this title!
                        # This will return false if the article already exists
                        $newid = $this->insertOn( $dbw );
@@ -1589,17 +1838,25 @@ class WikiPage extends Page implements IDBAccessObject {
                        # Save the revision text...
                        $revision = new Revision( array(
                                'page'       => $newid,
+                               'title'      => $this->getTitle(), // for determining the default content model
                                'comment'    => $summary,
                                'minor_edit' => $isminor,
-                               'text'       => $text,
+                               'text'       => $serialized,
+                               'len'        => $newsize,
                                'user'       => $user->getId(),
                                'user_text'  => $user->getName(),
-                               'timestamp'  => $now
+                               'timestamp'  => $now,
+                               'content_model' => $content->getModel(),
+                               'content_format' => $serialisation_format,
                        ) );
                        $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
+                       $content = $revision->getContent(); // sanity; get normalized version
+
+                       if ( $content ) {
+                               $newsize = $content->getSize();
+                       }
 
                        # Update the page record with revision data
                        $this->updateRevisionOn( $dbw, $revision, 0 );
@@ -1613,7 +1870,7 @@ class WikiPage extends Page implements IDBAccessObject {
                                        $this->mTitle->getUserPermissionsErrors( 'autopatrol', $user ) );
                                # Add RC row to the DB
                                $rc = RecentChange::notifyNew( $now, $this->mTitle, $isminor, $user, $summary, $bot,
-                                       '', strlen( $text ), $revisionId, $patrolled );
+                                       '', $newsize, $revisionId, $patrolled );
 
                                # Log auto-patrolled edits
                                if ( $patrolled ) {
@@ -1626,8 +1883,11 @@ class WikiPage extends Page implements IDBAccessObject {
                        # Update links, etc.
                        $this->doEditUpdates( $revision, $user, array( 'created' => true ) );
 
-                       wfRunHooks( 'ArticleInsertComplete', array( &$this, &$user, $text, $summary,
-                               $flags & EDIT_MINOR, null, null, &$flags, $revision ) );
+                       $hook_args = array( &$this, &$user, $content, $summary,
+                                                               $flags & EDIT_MINOR, null, null, &$flags, $revision );
+
+                       ContentHandler::runLegacyHooks( 'ArticleInsertComplete', $hook_args );
+                       wfRunHooks( 'PageContentInsertComplete', $hook_args );
                }
 
                # Do updates right now unless deferral was requested
@@ -1638,8 +1898,11 @@ class WikiPage extends Page implements IDBAccessObject {
                // Return the new revision (or null) to the caller
                $status->value['revision'] = $revision;
 
-               wfRunHooks( 'ArticleSaveComplete', array( &$this, &$user, $text, $summary,
-                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId ) );
+               $hook_args = array( &$this, &$user, $content, $summary,
+                                                       $flags & EDIT_MINOR, null, null, &$flags, $revision, &$status, $baseRevId );
+
+               ContentHandler::runLegacyHooks( 'ArticleSaveComplete', $hook_args );
+               wfRunHooks( 'PageContentSaveComplete', $hook_args );
 
                # Promote user to any groups they meet the criteria for
                $user->addAutopromoteOnceGroups( 'onEdit' );
@@ -1651,6 +1914,8 @@ class WikiPage extends Page implements IDBAccessObject {
        /**
         * Get parser options suitable for rendering the primary article wikitext
         *
+        * @see ContentHandler::makeParserOptions
+        *
         * @param IContextSource|User|string $context One of the following:
         *        - IContextSource: Use the User and the Language of the provided
         *          context
@@ -1661,38 +1926,52 @@ class WikiPage extends Page implements IDBAccessObject {
         * @return ParserOptions
         */
        public function makeParserOptions( $context ) {
-               global $wgContLang;
-
-               if ( $context instanceof IContextSource ) {
-                       $options = ParserOptions::newFromContext( $context );
-               } elseif ( $context instanceof User ) { // settings per user (even anons)
-                       $options = ParserOptions::newFromUser( $context );
-               } else { // canonical settings
-                       $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
-               }
+               $options = $this->getContentHandler()->makeParserOptions( $context );
 
                if ( $this->getTitle()->isConversionTable() ) {
+                       //@todo: ConversionTable should become a separate content model, so we don't need special cases like this one.
                        $options->disableContentConversion();
                }
 
-               $options->enableLimitReport(); // show inclusion/loop reports
-               $options->setTidy( true ); // fix bad HTML
-
                return $options;
        }
 
        /**
         * Prepare text which is about to be saved.
         * Returns a stdclass with source, pst and output members
-        * @return bool|object
+        *
+        * @deprecated in 1.21: use prepareContentForEdit instead.
         */
        public function prepareTextForEdit( $text, $revid = null, User $user = null ) {
-               global $wgParser, $wgContLang, $wgUser;
+               ContentHandler::deprecated( __METHOD__, '1.21' );
+               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+               return $this->prepareContentForEdit( $content, $revid , $user );
+       }
+
+       /**
+        * Prepare content which is about to be saved.
+        * Returns a stdclass with source, pst and output members
+        *
+        * @param \Content $content
+        * @param null $revid
+        * @param null|\User $user
+        * @param null $serialization_format
+        *
+        * @return bool|object
+        *
+        * @since 1.21
+        */
+       public function prepareContentForEdit( Content $content, $revid = null, User $user = null, $serialization_format = null ) {
+               global $wgContLang, $wgUser;
                $user = is_null( $user ) ? $wgUser : $user;
-               // @TODO fixme: check $user->getId() here???
+               //XXX: check $user->getId() here???
+
                if ( $this->mPreparedEdit
-                       && $this->mPreparedEdit->newText == $text
+                       && $this->mPreparedEdit->newContent
+                       && $this->mPreparedEdit->newContent->equals( $content )
                        && $this->mPreparedEdit->revid == $revid
+                       && $this->mPreparedEdit->format == $serialization_format
+                       #XXX: also check $user here?
                ) {
                        // Already prepared
                        return $this->mPreparedEdit;
@@ -1703,14 +1982,22 @@ class WikiPage extends Page implements IDBAccessObject {
 
                $edit = (object)array();
                $edit->revid = $revid;
-               $edit->newText = $text;
-               $edit->pst = $wgParser->preSaveTransform( $text, $this->mTitle, $user, $popts );
+
+               $edit->pstContent = $content ? $content->preSaveTransform( $this->mTitle, $user, $popts ) : null;
+
+               $edit->format = $serialization_format;
                $edit->popts = $this->makeParserOptions( 'canonical' );
-               $edit->output = $wgParser->parse( $edit->pst, $this->mTitle, $edit->popts, true, true, $revid );
-               $edit->oldText = $this->getRawText();
+               $edit->output = $edit->pstContent ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts ) : null;
 
-               $this->mPreparedEdit = $edit;
+               $edit->newContent = $content;
+               $edit->oldContent = $this->getContent( Revision::RAW );
 
+               #NOTE: B/C for hooks! don't use these fields!
+               $edit->newText = $edit->newContent ? ContentHandler::getContentText( $edit->newContent ) : '';
+               $edit->oldText = $edit->oldContent ? ContentHandler::getContentText( $edit->oldContent ) : '';
+               $edit->pst = $edit->pstContent ? $edit->pstContent->serialize( $serialization_format ) : '';
+
+               $this->mPreparedEdit = $edit;
                return $edit;
        }
 
@@ -1720,7 +2007,6 @@ class WikiPage extends Page implements IDBAccessObject {
         * Purges pages that include this page if the text was changed here.
         * Every 100th edit, prune the recent changes table.
         *
-        * @private
         * @param $revision Revision object
         * @param $user User object that did the revision
         * @param $options Array of options, following indexes are used:
@@ -1737,13 +2023,13 @@ class WikiPage extends Page implements IDBAccessObject {
                wfProfileIn( __METHOD__ );
 
                $options += array( 'changed' => true, 'created' => false, 'oldcountable' => null );
-               $text = $revision->getText();
+               $content = $revision->getContent();
 
                # Parse the text
                # Be careful not to double-PST: $text is usually already PST-ed once
                if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) {
                        wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" );
-                       $editInfo = $this->prepareTextForEdit( $text, $revision->getId(), $user );
+                       $editInfo = $this->prepareContentForEdit( $content, $revision->getId(), $user );
                } else {
                        wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" );
                        $editInfo = $this->mPreparedEdit;
@@ -1756,8 +2042,10 @@ class WikiPage extends Page implements IDBAccessObject {
                }
 
                # Update the links tables and other secondary data
-               $updates = $editInfo->output->getSecondaryDataUpdates( $this->mTitle );
-               DataUpdate::runUpdates( $updates );
+               if ( $content ) {
+                       $updates = $content->getSecondaryDataUpdates( $this->getTitle(), null, true, $editInfo->output );
+                       DataUpdate::runUpdates( $updates );
+               }
 
                wfRunHooks( 'ArticleEditUpdates', array( &$this, &$editInfo, $options['changed'] ) );
 
@@ -1801,7 +2089,8 @@ class WikiPage extends Page implements IDBAccessObject {
                }
 
                DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, $good, $total ) );
-               DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $text ) );
+               DeferredUpdates::addUpdate( new SearchUpdate( $id, $title, $content->getTextForSearchIndex() ) );
+               #@TODO: let the search engine decide what to do with the content object
 
                # If this is another user's talk page, update newtalk.
                # Don't do this if $options['changed'] = false (null-edits) nor if
@@ -1827,7 +2116,11 @@ class WikiPage extends Page implements IDBAccessObject {
                }
 
                if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) {
-                       MessageCache::singleton()->replace( $shortTitle, $text );
+                       #XXX: could skip pseudo-messages like js/css here, based on content model.
+                       $msgtext = $content ? $content->getWikitextForTransclusion() : null;
+                       if ( $msgtext === false || $msgtext === null ) $msgtext = '';
+
+                       MessageCache::singleton()->replace( $shortTitle, $msgtext );
                }
 
                if( $options['created'] ) {
@@ -1848,17 +2141,41 @@ class WikiPage extends Page implements IDBAccessObject {
         * @param $user User The relevant user
         * @param $comment String: comment submitted
         * @param $minor Boolean: whereas it's a minor modification
+        *
+        * @deprecated since 1.21, use doEditContent() instead.
         */
        public function doQuickEdit( $text, User $user, $comment = '', $minor = 0 ) {
+               ContentHandler::deprecated( __METHOD__, "1.21" );
+
+               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+               return $this->doQuickEditContent( $content, $user, $comment , $minor );
+       }
+
+       /**
+        * Edit an article without doing all that other stuff
+        * The article must already exist; link tables etc
+        * are not updated, caches are not flushed.
+        *
+        * @param $content Content: content submitted
+        * @param $user User The relevant user
+        * @param $comment String: comment submitted
+        * @param $serialisation_format String: format for storing the content in the database
+        * @param $minor Boolean: whereas it's a minor modification
+        */
+       public function doQuickEditContent( Content $content, User $user, $comment = '', $minor = 0, $serialisation_format = null ) {
                wfProfileIn( __METHOD__ );
 
+               $serialized = $content->serialize( $serialisation_format );
+
                $dbw = wfGetDB( DB_MASTER );
                $revision = new Revision( array(
+                       'title'      => $this->getTitle(), // for determining the default content model
                        'page'       => $this->getId(),
-                       'text'       => $text,
+                       'text'       => $serialized,
+                       'length'     => $content->getSize(),
                        'comment'    => $comment,
                        'minor_edit' => $minor ? 1 : 0,
-               ) );
+               ) ); #XXX: set the content object?
                $revision->insertOn( $dbw );
                $this->updateRevisionOn( $dbw, $revision );
 
@@ -2142,6 +2459,7 @@ class WikiPage extends Page implements IDBAccessObject {
         * @param $reason string delete reason for deletion log
         * @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
         * @param $user User The deleting user
@@ -2152,7 +2470,7 @@ class WikiPage extends Page implements IDBAccessObject {
        public function doDeleteArticleReal(
                $reason, $suppress = false, $id = 0, $commit = true, &$error = '', User $user = null
        ) {
-               global $wgUser;
+               global $wgUser, $wgContentHandlerUseDB;
 
                wfDebug( __METHOD__ . "\n" );
 
@@ -2193,6 +2511,9 @@ class WikiPage extends Page implements IDBAccessObject {
                        $bitfield = 'rev_deleted';
                }
 
+               // we need to remember the old content so we can use it to generate all deletion updates.
+               $content = $this->getContent( Revision::RAW );
+
                $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
                // For now, shunt the revision data into the archive table.
@@ -2205,25 +2526,34 @@ class WikiPage extends Page implements IDBAccessObject {
                //
                // In the future, we may keep revisions and mark them with
                // the rev_deleted field, which is reserved for this purpose.
+
+               $row = array(
+                       'ar_namespace'  => 'page_namespace',
+                       'ar_title'      => 'page_title',
+                       'ar_comment'    => 'rev_comment',
+                       'ar_user'       => 'rev_user',
+                       'ar_user_text'  => 'rev_user_text',
+                       'ar_timestamp'  => 'rev_timestamp',
+                       'ar_minor_edit' => 'rev_minor_edit',
+                       'ar_rev_id'     => 'rev_id',
+                       'ar_parent_id'  => 'rev_parent_id',
+                       'ar_text_id'    => 'rev_text_id',
+                       'ar_text'       => '\'\'', // Be explicit to appease
+                       'ar_flags'      => '\'\'', // MySQL's "strict mode"...
+                       'ar_len'        => 'rev_len',
+                       'ar_page_id'    => 'page_id',
+                       'ar_deleted'    => $bitfield,
+                       'ar_sha1'       => 'rev_sha1',
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $row[ 'ar_content_model' ] = 'rev_content_model';
+                       $row[ 'ar_content_format' ] = 'rev_content_format';
+               }
+
                $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
+                       $row,
                        array(
-                               'ar_namespace'  => 'page_namespace',
-                               'ar_title'      => 'page_title',
-                               'ar_comment'    => 'rev_comment',
-                               'ar_user'       => 'rev_user',
-                               'ar_user_text'  => 'rev_user_text',
-                               'ar_timestamp'  => 'rev_timestamp',
-                               'ar_minor_edit' => 'rev_minor_edit',
-                               'ar_rev_id'     => 'rev_id',
-                               'ar_parent_id'  => 'rev_parent_id',
-                               'ar_text_id'    => 'rev_text_id',
-                               'ar_text'       => '\'\'', // Be explicit to appease
-                               'ar_flags'      => '\'\'', // MySQL's "strict mode"...
-                               'ar_len'        => 'rev_len',
-                               'ar_page_id'    => 'page_id',
-                               'ar_deleted'    => $bitfield,
-                               'ar_sha1'       => 'rev_sha1'
-                       ), array(
                                'page_id' => $id,
                                'page_id = rev_page'
                        ), __METHOD__
@@ -2239,7 +2569,7 @@ class WikiPage extends Page implements IDBAccessObject {
                        return $status;
                }
 
-               $this->doDeleteUpdates( $id );
+               $this->doDeleteUpdates( $id, $content );
 
                # Log the deletion, if the page was suppressed, log it at Oversight instead
                $logtype = $suppress ? 'suppress' : 'delete';
@@ -2255,7 +2585,7 @@ class WikiPage extends Page implements IDBAccessObject {
                        $dbw->commit( __METHOD__ );
                }
 
-               wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id ) );
+               wfRunHooks( 'ArticleDeleteComplete', array( &$this, &$user, $reason, $id, $content, $logEntry ) );
                $status->value = $logid;
                return $status;
        }
@@ -2264,13 +2594,15 @@ class WikiPage extends Page implements IDBAccessObject {
         * Do some database updates after deletion
         *
         * @param $id Int: page_id value of the page being deleted (B/C, currently unused)
+        * @param $content Content: optional page content to be used when determining the required updates.
+        *        This may be needed because $this->getContent() may already return null when the page proper was deleted.
         */
-       public function doDeleteUpdates( $id ) {
+       public function doDeleteUpdates( $id, Content $content = null ) {
                # update site status
                DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 1, - (int)$this->isCountable(), -1 ) );
 
                # remove secondary indexes, etc
-               $updates = $this->getDeletionUpdates( );
+               $updates = $this->getDeletionUpdates( $content );
                DataUpdate::runUpdates( $updates );
 
                # Clear caches
@@ -2283,16 +2615,6 @@ class WikiPage extends Page implements IDBAccessObject {
                $this->mTitle->resetArticleID( 0 );
        }
 
-       public function getDeletionUpdates() {
-               $updates = array(
-                       new LinksDeletionUpdate( $this ),
-               );
-
-               //@todo: make a hook to add update objects
-               //NOTE: deletion updates will be determined by the ContentHandler in the future
-               return $updates;
-       }
-
        /**
         * Roll back the most recent consecutive set of edits to a page
         * from the same user; fails if there are no eligible edits to
@@ -2465,7 +2787,12 @@ class WikiPage extends Page implements IDBAccessObject {
                }
 
                # Actually store the edit
-               $status = $this->doEdit( $target->getText(), $summary, $flags, $target->getId(), $guser );
+               $status = $this->doEditContent( $target->getContent(), $summary, $flags, $target->getId(), $guser );
+
+               if ( !$status->isOK() ) {
+                       return $status->getErrorsArray();
+               }
+
                if ( !empty( $status->value['revision'] ) ) {
                        $revId = $status->value['revision']->getId();
                } else {
@@ -2611,60 +2938,23 @@ class WikiPage extends Page implements IDBAccessObject {
 
        /**
        * Return an applicable autosummary if one exists for the given edit.
-       * @param $oldtext String: the previous text of the page.
-       * @param $newtext String: The submitted text of the page.
+       * @param $oldtext String|null: the previous text of the page.
+       * @param $newtext String|null: The submitted text of the page.
        * @param $flags Int bitmask: a bitmask of flags submitted for the edit.
        * @return string An appropriate autosummary, or an empty string.
+       *
+       * @deprecated since 1.21, use ContentHandler::getAutosummary() instead
        */
        public static function getAutosummary( $oldtext, $newtext, $flags ) {
-               global $wgContLang;
-
-               # Decide what kind of autosummary is needed.
+               # NOTE: stub for backwards-compatibility. assumes the given text is wikitext. will break horribly if it isn't.
 
-               # Redirect autosummaries
-               $ot = Title::newFromRedirect( $oldtext );
-               $rt = Title::newFromRedirect( $newtext );
+               ContentHandler::deprecated( __METHOD__, '1.21' );
 
-               if ( is_object( $rt ) && ( !is_object( $ot ) || !$rt->equals( $ot ) || $ot->getFragment() != $rt->getFragment() ) ) {
-                       $truncatedtext = $wgContLang->truncate(
-                               str_replace( "\n", ' ', $newtext ),
-                               max( 0, 255
-                                       - strlen( wfMessage( 'autoredircomment' )->inContentLanguage()->text() )
-                                       - strlen( $rt->getFullText() )
-                               ) );
-                       return wfMessage( 'autoredircomment', $rt->getFullText() )
-                               ->rawParams( $truncatedtext )->inContentLanguage()->text();
-               }
-
-               # New page autosummaries
-               if ( $flags & EDIT_NEW && strlen( $newtext ) ) {
-                       # If they're making a new article, give its text, truncated, in the summary.
-
-                       $truncatedtext = $wgContLang->truncate(
-                               str_replace( "\n", ' ', $newtext ),
-                               max( 0, 200 - strlen( wfMessage( 'autosumm-new' )->inContentLanguage()->text() ) ) );
-
-                       return wfMessage( 'autosumm-new' )->rawParams( $truncatedtext )
-                               ->inContentLanguage()->text();
-               }
+               $handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
+               $oldContent = is_null( $oldtext ) ? null : $handler->unserializeContent( $oldtext );
+               $newContent = is_null( $newtext ) ? null : $handler->unserializeContent( $newtext );
 
-               # Blanking autosummaries
-               if ( $oldtext != '' && $newtext == '' ) {
-                       return wfMessage( 'autosumm-blank' )->inContentLanguage()->text();
-               } elseif ( strlen( $oldtext ) > 10 * strlen( $newtext ) && strlen( $newtext ) < 500 ) {
-                       # Removing more than 90% of the article
-
-                       $truncatedtext = $wgContLang->truncate(
-                               $newtext,
-                               max( 0, 200 - strlen( wfMessage( 'autosumm-replace' )->inContentLanguage()->text() ) ) );
-
-                       return wfMessage( 'autosumm-replace' )->rawParams( $truncatedtext )
-                               ->inContentLanguage()->text();
-               }
-
-               # If we reach this point, there's no applicable autosummary for our case, so our
-               # autosummary is empty.
-               return '';
+               return $handler->getAutosummary( $oldContent, $newContent, $flags );
        }
 
        /**
@@ -2675,95 +2965,7 @@ class WikiPage extends Page implements IDBAccessObject {
         *    if no revision occurred
         */
        public function getAutoDeleteReason( &$hasHistory ) {
-               global $wgContLang;
-
-               // Get the last revision
-               $rev = $this->getRevision();
-
-               if ( is_null( $rev ) ) {
-                       return false;
-               }
-
-               // Get the article's contents
-               $contents = $rev->getText();
-               $blank = false;
-
-               // If the page is blank, use the text from the previous revision,
-               // which can only be blank if there's a move/import/protect dummy revision involved
-               if ( $contents == '' ) {
-                       $prev = $rev->getPrevious();
-
-                       if ( $prev )    {
-                               $contents = $prev->getText();
-                               $blank = true;
-                       }
-               }
-
-               $dbw = wfGetDB( DB_MASTER );
-
-               // Find out if there was only one contributor
-               // Only scan the last 20 revisions
-               $res = $dbw->select( 'revision', 'rev_user_text',
-                       array( 'rev_page' => $this->getID(), $dbw->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0' ),
-                       __METHOD__,
-                       array( 'LIMIT' => 20 )
-               );
-
-               if ( $res === false ) {
-                       // This page has no revisions, which is very weird
-                       return false;
-               }
-
-               $hasHistory = ( $res->numRows() > 1 );
-               $row = $dbw->fetchObject( $res );
-
-               if ( $row ) { // $row is false if the only contributor is hidden
-                       $onlyAuthor = $row->rev_user_text;
-                       // Try to find a second contributor
-                       foreach ( $res as $row ) {
-                               if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
-                                       $onlyAuthor = false;
-                                       break;
-                               }
-                       }
-               } else {
-                       $onlyAuthor = false;
-               }
-
-               // Generate the summary with a '$1' placeholder
-               if ( $blank ) {
-                       // The current revision is blank and the one before is also
-                       // blank. It's just not our lucky day
-                       $reason = wfMessage( 'exbeforeblank', '$1' )->inContentLanguage()->text();
-               } else {
-                       if ( $onlyAuthor ) {
-                               $reason = wfMessage(
-                                       'excontentauthor',
-                                       '$1',
-                                       $onlyAuthor
-                               )->inContentLanguage()->text();
-                       } else {
-                               $reason = wfMessage( 'excontent', '$1' )->inContentLanguage()->text();
-                       }
-               }
-
-               if ( $reason == '-' ) {
-                       // Allow these UI messages to be blanked out cleanly
-                       return '';
-               }
-
-               // Replace newlines with spaces to prevent uglyness
-               $contents = preg_replace( "/[\n\r]/", ' ', $contents );
-               // Calculate the maximum amount of chars to get
-               // Max content length = max comment length - length of the comment (excl. $1)
-               $maxLength = 255 - ( strlen( $reason ) - 2 );
-               $contents = $wgContLang->truncate( $contents, $maxLength );
-               // Remove possible unfinished links
-               $contents = preg_replace( '/\[\[([^\]]*)\]?$/', '$1', $contents );
-               // Now replace the '$1' placeholder
-               $reason = str_replace( '$1', $contents, $reason );
-
-               return $reason;
+               return $this->getContentHandler()->getAutoDeleteReason( $this->getTitle(), $hasHistory );
        }
 
        /**
@@ -3005,6 +3207,31 @@ class WikiPage extends Page implements IDBAccessObject {
                global $wgUser;
                return $this->isParserCacheUsed( ParserOptions::newFromUser( $wgUser ), $oldid );
        }
+
+       /**
+        * Returns a list of updates to be performed when this page is deleted. The updates should remove any information
+        * about this page from secondary data stores such as links tables.
+        *
+        * @param Content|null $content optional Content object for determining the necessary updates
+        * @return Array an array of DataUpdates objects
+        */
+       public function getDeletionUpdates( Content $content = null ) {
+               if ( !$content ) {
+                       // load content object, which may be used to determine the necessary updates
+                       // XXX: the content may not be needed to determine the updates, then this would be overhead.
+                       $content = $this->getContent( Revision::RAW );
+               }
+
+               if ( !$content ) {
+                       $updates = array();
+               } else {
+                       $updates = $content->getDeletionUpdates( $this );
+               }
+
+               wfRunHooks( 'WikiPageDeletionUpdates', array( $this, $content, &$updates ) );
+               return $updates;
+       }
+
 }
 
 class PoolWorkArticleView extends PoolCounterWork {
@@ -3030,9 +3257,9 @@ class PoolWorkArticleView extends PoolCounterWork {
        private $parserOptions;
 
        /**
-        * @var string|null
+        * @var Content|null
         */
-       private $text;
+       private $content = null;
 
        /**
         * @var ParserOutput|bool
@@ -3056,14 +3283,20 @@ class PoolWorkArticleView extends PoolCounterWork {
         * @param $revid Integer: ID of the revision being parsed
         * @param $useParserCache Boolean: whether to use the parser cache
         * @param $parserOptions parserOptions to use for the parse operation
-        * @param $text String: text to parse or null to load it
+        * @param $content Content|String: content to parse or null to load it; may also be given as a wikitext string, for BC
         */
-       function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $text = null ) {
+       function __construct( Page $page, ParserOptions $parserOptions, $revid, $useParserCache, $content = null ) {
+               if ( is_string($content) ) { #BC: old style call
+                       $modelId = $page->getRevision()->getContentModel();
+                       $format = $page->getRevision()->getContentFormat();
+                       $content = ContentHandler::makeContent( $content, $page->getTitle(), $modelId, $format );
+               }
+
                $this->page = $page;
                $this->revid = $revid;
                $this->cacheable = $useParserCache;
                $this->parserOptions = $parserOptions;
-               $this->text = $text;
+               $this->content = $content;
                $this->cacheKey = ParserCache::singleton()->getKey( $page, $parserOptions );
                parent::__construct( 'ArticleView', $this->cacheKey . ':revid:' . $revid );
        }
@@ -3099,25 +3332,35 @@ class PoolWorkArticleView extends PoolCounterWork {
         * @return bool
         */
        function doWork() {
-               global $wgParser, $wgUseFileCache;
+               global $wgUseFileCache;
+
+               // @todo: several of the methods called on $this->page are not declared in Page, but present
+               //        in WikiPage and delegated by Article.
 
                $isCurrent = $this->revid === $this->page->getLatest();
 
-               if ( $this->text !== null ) {
-                       $text = $this->text;
+               if ( $this->content !== null ) {
+                       $content = $this->content;
                } elseif ( $isCurrent ) {
-                       $text = $this->page->getRawText();
+                       #XXX: why use RAW audience here, and PUBLIC (default) below?
+                       $content = $this->page->getContent( Revision::RAW );
                } else {
                        $rev = Revision::newFromTitle( $this->page->getTitle(), $this->revid );
+
                        if ( $rev === null ) {
-                               return false;
+                               $content = null;
+                       } else {
+                               #XXX: why use PUBLIC audience here (default), and RAW above?
+                               $content = $rev->getContent();
                        }
-                       $text = $rev->getText();
+               }
+
+               if ( $content === null ) {
+                       return false;
                }
 
                $time = - microtime( true );
-               $this->parserOutput = $wgParser->parse( $text, $this->page->getTitle(),
-                       $this->parserOptions, true, true, $this->revid );
+               $this->parserOutput = $content->getParserOutput( $this->page->getTitle(), $this->revid, $this->parserOptions );
                $time += microtime( true );
 
                # Timing hack
@@ -3186,3 +3429,4 @@ class PoolWorkArticleView extends PoolCounterWork {
                return false;
        }
 }
+
index 4a55d5e..67f3658 100644 (file)
@@ -59,6 +59,7 @@ class Xml {
         * The values are passed to Sanitizer::encodeAttribute.
         * Return null if no attributes given.
         * @param $attribs Array of attributes for an XML element
+        * @throws MWException
         * @return null|string
         */
        public static function expandAttributes( $attribs ) {
@@ -207,7 +208,7 @@ class Xml {
 
        /**
         * Construct a language selector appropriate for use in a form or preferences
-        * 
+        *
         * @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)
@@ -575,7 +576,8 @@ class Xml {
         */
        public static function textarea( $name, $content, $cols = 40, $rows = 5, $attribs = array() ) {
                return self::element( 'textarea',
-                                       array(  'name' => $name,
+                                       array(
+                                               'name' => $name,
                                                'id' => $name,
                                                'cols' => $cols,
                                                'rows' => $rows
index 0cbbad9..b1ccbe6 100644 (file)
@@ -9,36 +9,66 @@
  */
 
 $zh2Hant = array(
+'㐽' => '偑',
+'㑇' => '㑳',
+'㑈' => '倲',
+'㑔' => '㑯',
 '㑩' => '儸',
 '㓥' => '劏',
 '㔉' => '劚',
 '㖊' => '噚',
 '㖞' => '喎',
+'㘎' => '㘚',
+'㚯' => '㜄',
+'㛀' => '媰',
 '㛟' => '𡞵',
 '㛠' => '𡢃',
+'㛣' => '㜏',
+'㛤' => '孋',
 '㛿' => '𡠹',
 '㟆' => '㠏',
+'㟜' => '𡾱',
+'㤘' => '㥮',
+'㧏' => '掆',
+'㧐' => '㩳',
 '㧑' => '撝',
 '㧟' => '擓',
+'㧰' => '擽',
 '㨫' => '㩜',
+'㭎' => '棡',
+'㭏' => '椲',
+'㭣' => '𣙎',
+'㭤' => '樢',
+'㭴' => '樫',
 '㱩' => '殰',
 '㱮' => '殨',
 '㲿' => '瀇',
+'㳔' => '濧',
+'㳕' => '灡',
 '㳠' => '澾',
+'㳡' => '濄',
+'㳢' => '𣾷',
+'㳽' => '瀰',
 '㶉' => '鸂',
 '㶶' => '燶',
 '㶽' => '煱',
 '㺍' => '獱',
+'㻅' => '璯',
 '㻏' => '𤫩',
 '㻘' => '𤪺',
+'䀥' => '䁻',
 '䁖' => '瞜',
+'䂵' => '碽',
 '䅉' => '稏',
+'䅪' => '𥢢',
 '䇲' => '筴',
+'䉤' => '籔',
 '䌶' => '䊷',
 '䌷' => '紬',
 '䌸' => '縳',
 '䌹' => '絅',
 '䌺' => '䋙',
+'䌻' => '䋚',
 '䌼' => '綐',
 '䌽' => '綵',
 '䌾' => '䋻',
@@ -48,24 +78,34 @@ $zh2Hant = array(
 '䓕' => '薳',
 '䗖' => '螮',
 '䘛' => '𧝞',
+'䘞' => '𧜗',
 '䙊' => '𧜵',
+'䙌' => '䙡',
 '䙓' => '襬',
 '䜣' => '訢',
 '䜥' => '𧩙',
-'䜧' => '譅',
+'䜧' => '䜀',
+'䜩' => '讌',
 '䝙' => '貙',
 '䞌' => '𧵳',
 '䞍' => '䝼',
+'䞎' => '𧶧',
 '䞐' => '賰',
+'䟢' => '躎',
+'䢀' => '𨊰',
+'䢁' => '𨊸',
 '䢂' => '𨋢',
 '䥺' => '釾',
 '䥽' => '鏺',
+'䥾' => '䥱',
 '䥿' => '𨯅',
 '䦀' => '𨦫',
 '䦁' => '𨧜',
+'䦂' => '䥇',
 '䦃' => '鐯',
 '䦅' => '鐥',
-'䩄' => '靦',
+'䦶' => '䦛',
+'䦷' => '䦟',
 '䭪' => '𩞯',
 '䯃' => '𩣑',
 '䯄' => '騧',
@@ -136,6 +176,7 @@ $zh2Hant = array(
 '伞' => '傘',
 '伟' => '偉',
 '传' => '傳',
+'伡' => '俥',
 '伣' => '俔',
 '伤' => '傷',
 '伥' => '倀',
@@ -217,6 +258,7 @@ $zh2Hant = array(
 '刭' => '剄',
 '刹' => '剎',
 '刽' => '劊',
+'刾' => '㓨',
 '刿' => '劌',
 '剀' => '剴',
 '剂' => '劑',
@@ -321,6 +363,8 @@ $zh2Hant = array(
 '啬' => '嗇',
 '啭' => '囀',
 '啮' => '嚙',
+'啯' => '嘓',
+'啰' => '囉',
 '啴' => '嘽',
 '啸' => '嘯',
 '喷' => '噴',
@@ -410,6 +454,7 @@ $zh2Hant = array(
 '婵' => '嬋',
 '婶' => '嬸',
 '媪' => '媼',
+'媭' => '嬃',
 '嫒' => '嬡',
 '嫔' => '嬪',
 '嫱' => '嬙',
@@ -513,7 +558,9 @@ $zh2Hant = array(
 '归' => '歸',
 '当' => '當',
 '录' => '錄',
+'彟' => '彠',
 '彦' => '彥',
+'彨' => '彲',
 '彻' => '徹',
 '径' => '徑',
 '徕' => '徠',
@@ -648,6 +695,7 @@ $zh2Hant = array(
 '攒' => '攢',
 '敌' => '敵',
 '敛' => '斂',
+'敩' => '斆',
 '数' => '數',
 '斋' => '齋',
 '斓' => '斕',
@@ -719,6 +767,7 @@ $zh2Hant = array(
 '桧' => '檜',
 '桨' => '槳',
 '桩' => '樁',
+'桪' => '樳',
 '梦' => '夢',
 '梼' => '檮',
 '梾' => '棶',
@@ -727,9 +776,12 @@ $zh2Hant = array(
 '棁' => '梲',
 '棂' => '欞',
 '椁' => '槨',
+'椝' => '槼',
 '椟' => '櫝',
 '椠' => '槧',
+'椢' => '槶',
 '椤' => '欏',
+'椫' => '樿',
 '椭' => '橢',
 '楼' => '樓',
 '榄' => '欖',
@@ -783,6 +835,7 @@ $zh2Hant = array(
 '沥' => '瀝',
 '沦' => '淪',
 '沧' => '滄',
+'沨' => '渢',
 '沩' => '溈',
 '沪' => '滬',
 '泞' => '濘',
@@ -813,6 +866,7 @@ $zh2Hant = array(
 '浒' => '滸',
 '浓' => '濃',
 '浔' => '潯',
+'浕' => '濜',
 '涂' => '塗',
 '涛' => '濤',
 '涝' => '澇',
@@ -820,6 +874,7 @@ $zh2Hant = array(
 '涟' => '漣',
 '涠' => '潿',
 '涡' => '渦',
+'涢' => '溳',
 '涣' => '渙',
 '涤' => '滌',
 '润' => '潤',
@@ -833,7 +888,6 @@ $zh2Hant = array(
 '渐' => '漸',
 '渑' => '澠',
 '渔' => '漁',
-'渖' => '瀋',
 '渗' => '滲',
 '温' => '溫',
 '湾' => '灣',
@@ -841,6 +895,7 @@ $zh2Hant = array(
 '溃' => '潰',
 '溅' => '濺',
 '溆' => '漵',
+'溇' => '漊',
 '滗' => '潷',
 '滚' => '滾',
 '滞' => '滯',
@@ -861,6 +916,7 @@ $zh2Hant = array(
 '潍' => '濰',
 '潜' => '潛',
 '潴' => '瀦',
+'澛' => '瀂',
 '澜' => '瀾',
 '濑' => '瀨',
 '濒' => '瀕',
@@ -872,7 +928,6 @@ $zh2Hant = array(
 '灿' => '燦',
 '炀' => '煬',
 '炉' => '爐',
-'炖' => '燉',
 '炜' => '煒',
 '炝' => '熗',
 '点' => '點',
@@ -1014,12 +1069,13 @@ $zh2Hant = array(
 '硖' => '硤',
 '硗' => '磽',
 '硙' => '磑',
+'硚' => '礄',
 '确' => '確',
+'硵' => '磠',
 '硷' => '礆',
 '碍' => '礙',
 '碛' => '磧',
 '碜' => '磣',
-'碱' => '鹼',
 '礼' => '禮',
 '祃' => '禡',
 '祎' => '禕',
@@ -1081,6 +1137,7 @@ $zh2Hant = array(
 '篑' => '簣',
 '篓' => '簍',
 '篮' => '籃',
+'篯' => '籛',
 '篱' => '籬',
 '簖' => '籪',
 '籁' => '籟',
@@ -1256,6 +1313,8 @@ $zh2Hant = array(
 '羟' => '羥',
 '羡' => '羨',
 '翘' => '翹',
+'翙' => '翽',
+'翚' => '翬',
 '耢' => '耮',
 '耧' => '耬',
 '耸' => '聳',
@@ -1295,6 +1354,7 @@ $zh2Hant = array(
 '脶' => '腡',
 '脸' => '臉',
 '腊' => '臘',
+'腘' => '膕',
 '腭' => '齶',
 '腻' => '膩',
 '腼' => '靦',
@@ -1337,6 +1397,7 @@ $zh2Hant = array(
 '荚' => '莢',
 '荛' => '蕘',
 '荜' => '蓽',
+'荝' => '萴',
 '荞' => '蕎',
 '荟' => '薈',
 '荠' => '薺',
@@ -1405,6 +1466,7 @@ $zh2Hant = array(
 '蚀' => '蝕',
 '蚁' => '蟻',
 '蚂' => '螞',
+'蚃' => '蠁',
 '蚕' => '蠶',
 '蚬' => '蜆',
 '蛊' => '蠱',
@@ -1445,9 +1507,10 @@ $zh2Hant = array(
 '裢' => '褳',
 '裣' => '襝',
 '裤' => '褲',
-'裥' => 'è¥\87',
+'裥' => 'è¥\89',
 '褛' => '褸',
 '褴' => '襤',
+'襕' => '襴',
 '见' => '見',
 '观' => '觀',
 '觃' => '覎',
@@ -1469,6 +1532,7 @@ $zh2Hant = array(
 '触' => '觸',
 '觯' => '觶',
 '訚' => '誾',
+'詟' => '讋',
 '誉' => '譽',
 '誊' => '謄',
 '讠' => '訁',
@@ -2209,6 +2273,7 @@ $zh2Hant = array(
 '颠' => '顛',
 '颡' => '顙',
 '颢' => '顥',
+'颣' => '纇',
 '颤' => '顫',
 '颥' => '顬',
 '颦' => '顰',
@@ -2344,6 +2409,7 @@ $zh2Hant = array(
 '髋' => '髖',
 '髌' => '髕',
 '鬓' => '鬢',
+'鬶' => '鬹',
 '魇' => '魘',
 '魉' => '魎',
 '鱼' => '魚',
@@ -2404,7 +2470,6 @@ $zh2Hant = array(
 '鲳' => '鯧',
 '鲴' => '鯝',
 '鲵' => '鯢',
-'鲶' => '鯰',
 '鲷' => '鯛',
 '鲸' => '鯨',
 '鲹' => '鰺',
@@ -2570,9 +2635,144 @@ $zh2Hant = array(
 '龚' => '龔',
 '龛' => '龕',
 '龟' => '龜',
+'𠆲' => '儣',
+'𠆿' => '𠌥',
+'𠉂' => '㒓',
+'𠉗' => '𠏢',
+'𠚳' => '𠠎',
+'𠛅' => '剾',
+'𠛆' => '𠞆',
 '𠮶' => '嗰',
+'𠯟' => '哯',
+'𠯠' => '噅',
+'𠲥' => '𡅏',
+'𠴢' => '𡄔',
+'𠵸' => '𡄣',
+'𠵾' => '㗲',
+'𡋀' => '𡓾',
+'𡋗' => '𡑭',
 '𡒄' => '壈',
+'𡝠' => '㜷',
+'𡞱' => '㜢',
+'𡭜' => '𡮉',
+'𡭬' => '𡮣',
+'𡶴' => '嵼',
+'𢋈' => '㢝',
+'𢘝' => '𢣚',
+'𢘞' => '𢣭',
+'𢙓' => '懀',
+'𢛯' => '㦎',
+'𢫊' => '𢷮',
+'𢫞' => '𢶫',
+'𢫬' => '摋',
+'𢬦' => '𢹿',
+'𢭏' => '擣',
+'𢽾' => '斅',
+'𣆐' => '曥',
+'𣍨' => '𦢈',
+'𣍯' => '腪',
+'𣍰' => '脥',
+'𣎑' => '臗',
+'𣐤' => '欍',
+'𣑶' => '𣠲',
+'𣗋' => '欓',
+'𣘓' => '𣞻',
+'𣘴' => '檭',
+'𣘷' => '𣝕',
+'𣭤' => '𣯴',
+'𣶩' => '澅',
+'𣶫' => '𣿉',
+'𣸣' => '濆',
+'𣺼' => '灙',
+'𣺽' => '𤁣',
+'𣽷' => '瀃',
+'𤆡' => '熓',
+'𤇃' => '爄',
+'𤇄' => '熌',
+'𤈶' => '熉',
+'𤈷' => '㷿',
+'𤊀' => '𤒎',
+'𤋏' => '熡',
+'𤞤' => '玁',
+'𤠋' => '㺏',
+'𤦀' => '瓕',
+'𤳄' => '𤳸',
+'𤶧' => '𤸫',
+'𤽯' => '㿧',
+'𤾀' => '皟',
+'𥅘' => '𥌃',
+'𥅴' => '䀹',
+'𥆧' => '瞤',
+'𥇢' => '䁪',
+'𥐟' => '礒',
+'𥐯' => '𥖅',
+'𥐰' => '𥕥',
+'𥐻' => '碙',
+'𥧂' => '𥨐',
+'𥬀' => '䉙',
+'𥬞' => '籋',
+'𥬠' => '篘',
+'𥭉' => '𥵊',
+'𥮋' => '𥸠',
+'𥮜' => '䉲',
+'𥱔' => '𥵃',
+'𥹥' => '𥼽',
+'𥺅' => '䊭',
+'𥺇' => '𥽖',
+'𦈈' => '𥿊',
+'𦈉' => '緷',
+'𦈋' => '綇',
+'𦈌' => '綀',
+'𦈎' => '繟',
+'𦈏' => '緍',
+'𦈐' => '縺',
+'𦈑' => '緸',
+'𦈒' => '𦂅',
+'𦈓' => '䋿',
+'𦈔' => '縎',
+'𦈕' => '緰',
 '𦈖' => '䌈',
+'𦈗' => '𦃄',
+'𦈘' => '䌋',
+'𦈙' => '䌰',
+'𦈚' => '縬',
+'𦈛' => '繓',
+'𦈜' => '䌖',
+'𦈝' => '繏',
+'𦈞' => '䌟',
+'𦈟' => '䌝',
+'𦈠' => '䌥',
+'𦈡' => '繻',
+'𦛨' => '朥',
+'𦝼' => '膢',
+'𦟗' => '𦣎',
+'𦨩' => '𦪽',
+'𦰴' => '䕳',
+'𧉞' => '䗿',
+'𧒭' => '𧔥',
+'𧮪' => '詀',
+'𧳕' => '𧳟',
+'𧹑' => '䞈',
+'𧹓' => '𧶔',
+'𧹕' => '䝻',
+'𧹖' => '賟',
+'𧹗' => '贃',
+'𧿈' => '𨇁',
+'𨀱' => '𨄣',
+'𨁴' => '𨅍',
+'𨂺' => '𨈊',
+'𨄄' => '𨈌',
+'𨅫' => '𨇞',
+'𨅬' => '躝',
+'𨉗' => '軉',
+'𨐅' => '軗',
+'𨐆' => '𨊻',
+'𨐇' => '𨏠',
+'𨐈' => '輄',
+'𨐉' => '𨎮',
+'𨐊' => '𨏥',
+'𨑹' => '䢨',
+'𨤰' => '𨤻',
 '𨰾' => '鎷',
 '𨰿' => '釳',
 '𨱀' => '𨥛',
@@ -2581,6 +2781,7 @@ $zh2Hant = array(
 '𨱃' => '鈲',
 '𨱄' => '鈯',
 '𨱅' => '鉁',
+'𨱆' => '龯',
 '𨱇' => '銶',
 '𨱈' => '鋉',
 '𨱉' => '鍄',
@@ -2591,12 +2792,28 @@ $zh2Hant = array(
 '𨱎' => '鍮',
 '𨱏' => '鎝',
 '𨱐' => '𨫒',
+'𨱑' => '鐄',
 '𨱒' => '鏉',
 '𨱓' => '鐎',
 '𨱔' => '鐏',
 '𨱕' => '𨮂',
+'𨱖' => '䥩',
+'𨷿' => '䦳',
+'𨸀' => '𨳕',
+'𨸁' => '𨳑',
 '𨸂' => '閍',
 '𨸃' => '閐',
+'𨸄' => '䦘',
+'𨸅' => '𨴗',
+'𨸆' => '𨵩',
+'𨸇' => '𨵸',
+'𨸉' => '𨶀',
+'𨸊' => '𨶏',
+'𨸋' => '𨶲',
+'𨸌' => '𨶮',
+'𨸎' => '𨷲',
+'𨸘' => '𨽏',
+'𨸟' => '䧢',
 '𩏼' => '䪏',
 '𩏽' => '𩏪',
 '𩏾' => '𩎢',
@@ -2617,12 +2834,22 @@ $zh2Hant = array(
 '𩙮' => '䬘',
 '𩙯' => '䬝',
 '𩙰' => '𩙈',
+'𩟿' => '𩚛',
+'𩠀' => '𩚥',
+'𩠁' => '𩚵',
+'𩠂' => '𩛆',
+'𩠃' => '𩛩',
 '𩠅' => '𩟐',
 '𩠆' => '𩜦',
 '𩠇' => '䭀',
 '𩠈' => '䭃',
+'𩠉' => '𩜇',
+'𩠊' => '𩜵',
 '𩠋' => '𩝔',
 '𩠌' => '餸',
+'𩠎' => '𩞄',
+'𩠏' => '𩞦',
+'𩠠' => '𩠴',
 '𩧦' => '𩡺',
 '𩧨' => '駎',
 '𩧩' => '𩤊',
@@ -2649,14 +2876,20 @@ $zh2Hant = array(
 '𩨄' => '騪',
 '𩨅' => '𩤸',
 '𩨆' => '𩤙',
+'𩨇' => '䮫',
 '𩨈' => '騟',
 '𩨉' => '𩤲',
 '𩨊' => '騚',
 '𩨋' => '𩥄',
 '𩨌' => '𩥑',
 '𩨍' => '𩥇',
+'𩨎' => '龭',
 '𩨏' => '䮳',
 '𩨐' => '𩧆',
+'𩬣' => '𩭙',
+'𩬤' => '𩰀',
+'𩯒' => '𩯳',
+'𩲒' => '𩳤',
 '𩽹' => '魥',
 '𩽺' => '𩵩',
 '𩽻' => '𩵹',
@@ -2666,6 +2899,7 @@ $zh2Hant = array(
 '𩽿' => '𩶰',
 '𩾀' => '鮕',
 '𩾁' => '鯄',
+'𩾂' => '䲖',
 '𩾃' => '鮸',
 '𩾄' => '𩷰',
 '𩾅' => '𩸃',
@@ -2699,6 +2933,8 @@ $zh2Hant = array(
 '𪎊' => '麨',
 '𪎋' => '䴴',
 '𪎌' => '麳',
+'𪎍' => '𪋿',
+'𪔭' => '𪔵',
 '𪚏' => '𪘀',
 '𪚐' => '𪘯',
 '𪞝' => '凙',
@@ -2715,7 +2951,7 @@ $zh2Hant = array(
 '𫌀' => '襀',
 '𫌨' => '覼',
 '𫍙' => '訑',
-'𫍟' => '𧦧',
+'𫍟' => '',
 '𫍢' => '譊',
 '𫍰' => '諰',
 '𫍲' => '謏',
@@ -2728,6 +2964,7 @@ $zh2Hant = array(
 '𫓧' => '鈇',
 '𫓩' => '鏦',
 '𫔎' => '鐍',
+'𫖸' => '願',
 '𫗠' => '餦',
 '𫗦' => '餔',
 '𫗧' => '餗',
@@ -3993,7 +4230,6 @@ $zh2Hant = array(
 '优游' => '優遊',
 '兀术' => '兀朮',
 '元凶' => '元兇',
-'充饥' => '充饑',
 '兆个' => '兆個',
 '兆余' => '兆餘',
 '凶刀' => '兇刀',
@@ -4144,7 +4380,6 @@ $zh2Hant = array(
 '出于' => '出於',
 '出游' => '出遊',
 '出丑' => '出醜',
-'出锤' => '出鎚',
 '分占' => '分佔',
 '分别致' => '分别致',
 '分半钟' => '分半鐘',
@@ -4393,6 +4628,7 @@ $zh2Hant = array(
 '古书云' => '古書云',
 '古書云' => '古書云',
 '古柯咸' => '古柯鹹',
+'古柯碱' => '古柯鹼',
 '古朴' => '古樸',
 '古语云' => '古語云',
 '古語云' => '古語云',
@@ -4534,7 +4770,7 @@ $zh2Hant = array(
 '吹干' => '吹乾',
 '吹发' => '吹髮',
 '吹胡' => '吹鬍',
-'吾之范我驰驱' => '吾爲之範我馳驅',
+'吾之范我驰驱' => '吾爲之範我馳驅',
 '吕后' => '呂后',
 '呂后' => '呂后',
 '呆呆傻傻' => '呆呆傻傻',
@@ -4617,8 +4853,8 @@ $zh2Hant = array(
 '严于' => '嚴於',
 '严丝合缝' => '嚴絲合縫',
 '嚼谷' => '嚼穀',
-'å\9b\89å\9b\89苏苏' => '囉囉囌囌',
-'å\9b\89苏' => '囉囌',
+'å\95°å\95°苏苏' => '囉囉囌囌',
+'å\95°苏' => '囉囌',
 '嘱托' => '囑託',
 '四个' => '四個',
 '四出刊' => '四出刊',
@@ -4711,7 +4947,7 @@ $zh2Hant = array(
 '城里' => '城裡',
 '埔裡社撫墾局' => '埔裏社撫墾局',
 '埔裏社撫墾局' => '埔裏社撫墾局',
-'埔社抚垦局' => '埔裏社撫墾局',
+'埔社抚垦局' => '埔裏社撫墾局',
 '基干' => '基幹',
 '基于' => '基於',
 '基准' => '基準',
@@ -4815,7 +5051,6 @@ $zh2Hant = array(
 '大赞' => '大讚',
 '大周折' => '大週摺',
 '大金发苔' => '大金髮苔',
-'大锤' => '大鎚',
 '大钟' => '大鐘',
 '大只' => '大隻',
 '大风后' => '大風後',
@@ -4836,6 +5071,7 @@ $zh2Hant = array(
 '天文钟' => '天文鐘',
 '天历' => '天曆',
 '天历史' => '天歷史',
+'天然碱' => '天然鹼',
 '天翻地覆' => '天翻地覆',
 '天覆地载' => '天覆地載',
 '太仆' => '太僕',
@@ -4885,7 +5121,6 @@ $zh2Hant = array(
 '好丑' => '好醜',
 '好斗' => '好鬥',
 '如果干' => '如果幹',
-'如饥似渴' => '如饑似渴',
 '妖后' => '妖后',
 '妙药' => '妙藥',
 '始于' => '始於',
@@ -5279,6 +5514,7 @@ $zh2Hant = array(
 '弘历史' => '弘歷史',
 '弱于' => '弱於',
 '弱水三千只取一瓢' => '弱水三千只取一瓢',
+'弱碱' => '弱鹼',
 '张三丰' => '張三丰',
 '張三丰' => '張三丰',
 '张勋' => '張勳',
@@ -5288,6 +5524,7 @@ $zh2Hant = array(
 '强奸' => '強姦',
 '强干' => '強幹',
 '强于' => '強於',
+'强碱' => '強鹼',
 '别口气' => '彆口氣',
 '别强' => '彆強',
 '别扭' => '彆扭',
@@ -5503,7 +5740,6 @@ $zh2Hant = array(
 '心脏' => '心臟',
 '心荡' => '心蕩',
 '心药' => '心藥',
-'心里面' => '心裏面',
 '心里' => '心裡',
 '心长发短' => '心長髮短',
 '心余' => '心餘',
@@ -5635,7 +5871,7 @@ $zh2Hant = array(
 '手表达' => '手表達',
 '手表露' => '手表露',
 '手表面' => '手表面',
-'手剑' => '手裏劍',
+'手剑' => '手裏劍',
 '手里' => '手裡',
 '手表' => '手錶',
 '手松' => '手鬆',
@@ -5686,6 +5922,7 @@ $zh2Hant = array(
 '抗癌药' => '抗癌藥',
 '抗御' => '抗禦',
 '抗药' => '抗藥',
+'抗碱' => '抗鹼',
 '折向往' => '折向往',
 '折子戏' => '折子戲',
 '折戟沈河' => '折戟沈河',
@@ -5824,7 +6061,7 @@ $zh2Hant = array(
 '挂名' => '掛名',
 '挂帘' => '掛帘',
 '挂历' => '掛曆',
-'æ\8c\82é\92©' => '掛鈎',
+'æ\8c\82é\88\8e' => '掛鈎',
 '挂钟' => '掛鐘',
 '采下' => '採下',
 '采伐' => '採伐',
@@ -6528,12 +6765,14 @@ $zh2Hant = array(
 '水里浊水溪' => '水里濁水溪',
 '水里鄉' => '水里鄉',
 '水里乡' => '水里鄉',
+'水碱' => '水鹼',
 '永历' => '永曆',
 '永历史' => '永歷史',
 '永志不忘' => '永誌不忘',
 '求知欲' => '求知慾',
 '求签' => '求籤',
 '求道于盲' => '求道於盲',
+'汗碱' => '汗鹼',
 '池里' => '池裡',
 '污蔑' => '污衊',
 '汲于' => '汲於',
@@ -6726,16 +6965,8 @@ $zh2Hant = array(
 '滃郁' => '滃鬱',
 '滑借' => '滑藉',
 '汇丰' => '滙豐',
-'卤味' => '滷味',
-'卤水' => '滷水',
-'卤汁' => '滷汁',
-'卤湖' => '滷湖',
-'卤肉' => '滷肉',
-'卤菜' => '滷菜',
-'卤蛋' => '滷蛋',
-'卤制' => '滷製',
-'卤鸡' => '滷雞',
-'卤面' => '滷麵',
+'滷制' => '滷製',
+'滷面' => '滷麵',
 '满拼自尽' => '滿拚自盡',
 '满满当当' => '滿滿當當',
 '满头洋发' => '滿頭洋髮',
@@ -6831,6 +7062,7 @@ $zh2Hant = array(
 '煎面' => '煎麵',
 '烟卷' => '煙捲',
 '烟斗丝' => '煙斗絲',
+'烟碱' => '煙鹼',
 '照占' => '照佔',
 '照入签' => '照入籤',
 '照准' => '照準',
@@ -6840,9 +7072,10 @@ $zh2Hant = array(
 '熊杰' => '熊杰',
 '荧郁' => '熒鬱',
 '熬药' => '熬藥',
-'ç\82\96药' => '燉藥',
+'ç\87\89药' => '燉藥',
 '燎发' => '燎髮',
 '烧干' => '燒乾',
+'烧碱' => '燒鹼',
 '燕几' => '燕几',
 '燕巢于幕' => '燕巢於幕',
 '燕燕于飞' => '燕燕于飛',
@@ -7015,7 +7248,7 @@ $zh2Hant = array(
 '发松' => '發鬆',
 '发面' => '發麵',
 '白干' => '白乾',
-'白兔药' => '白兔擣藥',
+'白兔𢭏药' => '白兔擣藥',
 '白干儿' => '白干兒',
 '白术' => '白朮',
 '白朴' => '白樸',
@@ -7149,6 +7382,7 @@ $zh2Hant = array(
 '石英钟表' => '石英鐘錶',
 '石莼' => '石蓴',
 '石钟乳' => '石鐘乳',
+'石碱' => '石鹼',
 '矽谷' => '矽谷',
 '研制' => '研製',
 '砰当' => '砰噹',
@@ -7159,6 +7393,7 @@ $zh2Hant = array(
 '朱红色' => '硃紅色',
 '朱色' => '硃色',
 '朱谕' => '硃諭',
+'硫化碱' => '硫化鹼',
 '硬干' => '硬幹',
 '确瘠' => '确瘠',
 '碑志' => '碑誌',
@@ -7267,7 +7502,6 @@ $zh2Hant = array(
 '积极参加' => '積极參加',
 '积淀' => '積澱',
 '积谷' => '積穀',
-'积谷防饥' => '積穀防饑',
 '积郁' => '積鬱',
 '稳占' => '穩佔',
 '稳扎' => '穩紮',
@@ -7404,6 +7638,7 @@ $zh2Hant = array(
 '纡郁' => '紆鬱',
 '纳征' => '納徵',
 '纯朴' => '純樸',
+'纯碱' => '純鹼',
 '纸扎' => '紙紮',
 '素朴' => '素樸',
 '素发' => '素髮',
@@ -7599,6 +7834,7 @@ $zh2Hant = array(
 '考试' => '考試',
 '而克制' => '而剋制',
 '耍斗' => '耍鬥',
+'耐碱' => '耐鹼',
 '耕佣' => '耕傭',
 '耕获' => '耕穫',
 '耳余' => '耳餘',
@@ -7732,6 +7968,7 @@ $zh2Hant = array(
 '花马吊嘴' => '花馬弔嘴',
 '花哄' => '花鬨',
 '苑里' => '苑裡',
+'苛性碱' => '苛性鹼',
 '若干' => '若干',
 '苦干' => '苦幹',
 '苦药' => '苦藥',
@@ -7762,7 +7999,7 @@ $zh2Hant = array(
 '草药' => '草藥',
 '荐居' => '荐居',
 '荐臻' => '荐臻',
-'è\8d\90饥' => '荐饑',
+'è\8d\90é¥\91' => '荐饑',
 '荷花淀' => '荷花澱',
 '庄上' => '莊上',
 '庄主' => '莊主',
@@ -7796,6 +8033,7 @@ $zh2Hant = array(
 '菠萝干' => '菠蘿乾',
 '华严钟' => '華嚴鐘',
 '华发' => '華髮',
+'菸碱' => '菸鹼',
 '萬一只' => '萬一只',
 '万一只' => '萬一只',
 '万个' => '萬個',
@@ -7875,7 +8113,7 @@ $zh2Hant = array(
 '姜饼' => '薑餅',
 '姜黄' => '薑黃',
 '薙发' => '薙髮',
-'薝' => '薝蔔',
+'薝' => '薝蔔',
 '苧悴' => '薴悴',
 '薴烯' => '薴烯',
 '苧烯' => '薴烯',
@@ -7962,8 +8200,7 @@ $zh2Hant = array(
 '蕴含着' => '蘊含著',
 '蕴涵着' => '蘊涵著',
 '苹果干' => '蘋果乾',
-'萝卜' => '蘿蔔',
-'萝卜干' => '蘿蔔乾',
+'萝蔔干' => '蘿蔔乾',
 '虎须' => '虎鬚',
 '虎斗' => '虎鬥',
 '号志' => '號誌',
@@ -7983,7 +8220,7 @@ $zh2Hant = array(
 '蛏干' => '蟶乾',
 '蚁后' => '蟻后',
 '蟻后' => '蟻后',
-'è \81干' => '蠁幹',
+'è\9a\83干' => '蠁幹',
 '蛮干' => '蠻幹',
 '血拼' => '血拚',
 '血余' => '血餘',
@@ -8061,8 +8298,9 @@ $zh2Hant = array(
 '被发阳狂' => '被髮陽狂',
 '裁并' => '裁併',
 '裁制' => '裁製',
-'里手' => '裏手',
-'里海' => '裏海',
+'裏勾外连' => '裏勾外連',
+'裏手' => '裏手',
+'裏海' => '裏海',
 '补于' => '補於',
 '补药' => '補藥',
 '补血药' => '補血藥',
@@ -8379,7 +8617,6 @@ $zh2Hant = array(
 '资金占用' => '資金占用',
 '贾后' => '賈后',
 '賈后' => '賈后',
-'赈饥' => '賑饑',
 '赏赞' => '賞讚',
 '贤后' => '賢后',
 '賢后' => '賢后',
@@ -8655,6 +8892,7 @@ $zh2Hant = array(
 '酒醴曲蘖' => '酒醴麴櫱',
 '酒曲' => '酒麴',
 '酥松' => '酥鬆',
+'酸碱' => '酸鹼',
 '醇朴' => '醇樸',
 '醉于' => '醉於',
 '醋坛' => '醋罈',
@@ -8729,7 +8967,6 @@ $zh2Hant = array(
 '重复' => '重複',
 '重托' => '重託',
 '重游' => '重遊',
-'重锤' => '重鎚',
 '野姜' => '野薑',
 '野游' => '野遊',
 '厘出' => '釐出',
@@ -8756,10 +8993,10 @@ $zh2Hant = array(
 '金装玉里' => '金裝玉裡',
 '金表' => '金錶',
 '金钟' => '金鐘',
+'金鸡纳碱' => '金雞納鹼',
 '金马仑道' => '金馬崙道',
 '金发' => '金髮',
-'钉锤' => '釘鎚',
-'钩心斗角' => '鈎心鬥角',
+'鈎心斗角' => '鈎心鬥角',
 '银朱' => '銀硃',
 '银发' => '銀髮',
 '铜范' => '銅範',
@@ -8777,7 +9014,7 @@ $zh2Hant = array(
 '钱谷' => '錢穀',
 '钱范' => '錢範',
 '钱庄' => '錢莊',
-'é\94¦ç»£花园' => '錦綉花園',
+'é\94¦ç\89花园' => '錦綉花園',
 '锦绣' => '錦繡',
 '表停' => '錶停',
 '表冠' => '錶冠',
@@ -8814,9 +9051,6 @@ $zh2Hant = array(
 '锻炼出' => '鍛鍊出',
 '锲而不舍' => '鍥而不捨',
 '镰仓' => '鎌倉',
-'锤儿' => '鎚兒',
-'锤子' => '鎚子',
-'锤头' => '鎚頭',
 '锈病' => '鏽病',
 '锈菌' => '鏽菌',
 '锈蚀' => '鏽蝕',
@@ -8896,7 +9130,6 @@ $zh2Hant = array(
 '钟鼓' => '鐘鼓',
 '铁杆' => '鐵杆',
 '铁栏杆' => '鐵欄杆',
-'铁锤' => '鐵鎚',
 '铁锈' => '鐵鏽',
 '铁钟' => '鐵鐘',
 '铸钟' => '鑄鐘',
@@ -9298,13 +9531,8 @@ $zh2Hant = array(
 '喂鱼' => '餵魚',
 '喂鸭' => '餵鴨',
 '喂鹅' => '餵鵝',
-'饥寒' => '饑寒',
-'饥民' => '饑民',
-'饥渴' => '饑渴',
-'饥溺' => '饑溺',
-'饥荒' => '饑荒',
-'饥饱' => '饑飽',
-'饥馑' => '饑饉',
+'饑荒' => '饑荒',
+'饑馑' => '饑饉',
 '首当其冲' => '首當其衝',
 '首发' => '首發',
 '首只' => '首隻',
@@ -9581,7 +9809,7 @@ $zh2Hant = array(
 '鱼干' => '魚乾',
 '鱼松' => '魚鬆',
 '鲸须' => '鯨鬚',
-'é²\87鱼' => '鯰魚',
+'鯰鱼' => '鯰魚',
 '鸠占鹊巢' => '鳩佔鵲巢',
 '凤凰于飞' => '鳳凰于飛',
 '凤梨干' => '鳳梨乾',
@@ -9624,9 +9852,22 @@ $zh2Hant = array(
 '咸鸭蛋' => '鹹鴨蛋',
 '咸卤' => '鹹鹵',
 '咸咸' => '鹹鹹',
+'碱化' => '鹼化',
+'碱土金属' => '鹼土金屬',
+'碱地' => '鹼地',
+'碱度' => '鹼度',
+'碱性' => '鹼性',
+'碱水' => '鹼水',
+'碱液' => '鹼液',
+'碱熔' => '鹼熔',
+'碱石灰' => '鹼石灰',
+'碱纤维素' => '鹼纖維素',
+'碱金属' => '鹼金屬',
+'碱类' => '鹼類',
 '盐打怎么咸' => '鹽打怎麼鹹',
-'盐卤' => '鹽滷',
 '盐余' => '鹽餘',
+'盐碱土' => '鹽鹼土',
+'盐碱滩' => '鹽鹼灘',
 '丽于' => '麗於',
 '曲尘' => '麴塵',
 '曲蘖' => '麴櫱',
@@ -9779,18 +10020,90 @@ $zh2Hant = array(
 );
 
 $zh2Hans = array(
+'㑯' => '㑔',
+'㑳' => '㑇',
+'㒓' => '𠉂',
+'㓨' => '刾',
+'㗲' => '𠵾',
+'㘚' => '㘎',
+'㜄' => '㚯',
+'㜏' => '㛣',
+'㜢' => '𡞱',
+'㜷' => '𡝠',
 '㞞' => '𪨊',
 '㠏' => '㟆',
+'㢝' => '𢋈',
+'㥮' => '㤘',
+'㦎' => '𢛯',
 '㩜' => '㨫',
+'㩳' => '㧐',
+'㷿' => '𤈷',
+'㺏' => '𤠋',
+'㿧' => '𤽯',
+'䀹' => '𥅴',
+'䁪' => '𥇢',
+'䁻' => '䀥',
+'䉙' => '𥬀',
 '䉬' => '𫂈',
+'䉲' => '𥮜',
+'䊭' => '𥺅',
 '䊷' => '䌶',
 '䋙' => '䌺',
+'䋚' => '䌻',
 '䋻' => '䌾',
+'䋿' => '𦈓',
+'䌈' => '𦈖',
+'䌋' => '𦈘',
+'䌖' => '𦈜',
+'䌝' => '𦈟',
+'䌟' => '𦈞',
+'䌥' => '𦈠',
+'䌰' => '𦈙',
+'䕳' => '𦰴',
+'䗿' => '𧉞',
+'䙡' => '䙌',
+'䜀' => '䜧',
+'䝻' => '𧹕',
 '䝼' => '䞍',
+'䞈' => '𧹑',
+'䢨' => '𨑹',
+'䥇' => '䦂',
+'䥩' => '𨱖',
+'䥱' => '䥾',
+'䦘' => '𨸄',
+'䦛' => '䦶',
+'䦟' => '䦷',
+'䦳' => '𨷿',
+'䧢' => '𨸟',
+'䪏' => '𩏼',
+'䪗' => '𩐀',
+'䪘' => '𩏿',
+'䫴' => '𩖗',
+'䬘' => '𩙮',
+'䬝' => '𩙯',
+'䬞' => '𩙧',
+'䭀' => '𩠇',
+'䭃' => '𩠈',
+'䭿' => '𩧭',
+'䮝' => '𩧰',
+'䮞' => '𩨁',
+'䮠' => '𩧿',
+'䮫' => '𩨇',
+'䮳' => '𩨏',
+'䮾' => '𩧪',
 '䯀' => '䯅',
 '䰾' => '鲃',
+'䱙' => '𩾈',
+'䱬' => '𩾊',
+'䱰' => '𩾋',
+'䱷' => '䲣',
 '䱽' => '䲝',
 '䲁' => '鳚',
+'䲖' => '𩾂',
+'䲰' => '𪉂',
+'䴉' => '鹮',
+'䴬' => '𪎈',
+'䴴' => '𪎋',
 '丟' => '丢',
 '並' => '并',
 '乾' => '干',
@@ -9808,6 +10121,7 @@ $zh2Hans = array(
 '係' => '系',
 '俔' => '伣',
 '俠' => '侠',
+'俥' => '伡',
 '倀' => '伥',
 '倆' => '俩',
 '倈' => '俫',
@@ -9816,7 +10130,9 @@ $zh2Hans = array(
 '們' => '们',
 '倖' => '幸',
 '倫' => '伦',
+'倲' => '㑈',
 '偉' => '伟',
+'偑' => '㐽',
 '側' => '侧',
 '偵' => '侦',
 '偽' => '伪',
@@ -9852,6 +10168,7 @@ $zh2Hans = array(
 '儕' => '侪',
 '儘' => '尽',
 '償' => '偿',
+'儣' => '𠆲',
 '優' => '优',
 '儲' => '储',
 '儷' => '俪',
@@ -9885,6 +10202,7 @@ $zh2Hans = array(
 '剴' => '剀',
 '創' => '创',
 '剷' => '铲',
+'剾' => '𠛅',
 '劃' => '划',
 '劇' => '剧',
 '劉' => '刘',
@@ -9915,7 +10233,6 @@ $zh2Hans = array(
 '卻' => '却',
 '卽' => '即',
 '厙' => '厍',
-'厠' => '厕',
 '厤' => '历',
 '厭' => '厌',
 '厲' => '厉',
@@ -9929,10 +10246,10 @@ $zh2Hans = array(
 '呂' => '吕',
 '咼' => '呙',
 '員' => '员',
+'哯' => '𠯟',
 '唄' => '呗',
 '唚' => '吣',
 '問' => '问',
-'啓' => '启',
 '啞' => '哑',
 '啟' => '启',
 '啢' => '唡',
@@ -9953,6 +10270,7 @@ $zh2Hans = array(
 '嗹' => '𪡏',
 '嘆' => '叹',
 '嘍' => '喽',
+'嘓' => '啯',
 '嘔' => '呕',
 '嘖' => '啧',
 '嘗' => '尝',
@@ -9965,6 +10283,7 @@ $zh2Hans = array(
 '嘸' => '呒',
 '嘽' => '啴',
 '噁' => '恶',
+'噅' => '𠯠',
 '噓' => '嘘',
 '噚' => '㖊',
 '噝' => '咝',
@@ -9995,6 +10314,7 @@ $zh2Hans = array(
 '囂' => '嚣',
 '囅' => '冁',
 '囈' => '呓',
+'囉' => '啰',
 '囌' => '苏',
 '囑' => '嘱',
 '囪' => '囱',
@@ -10032,7 +10352,6 @@ $zh2Hans = array(
 '墮' => '堕',
 '墰' => '坛',
 '墳' => '坟',
-'墻' => '墙',
 '墾' => '垦',
 '壇' => '坛',
 '壈' => '𡒄',
@@ -10059,7 +10378,6 @@ $zh2Hans = array(
 '奧' => '奥',
 '奩' => '奁',
 '奪' => '夺',
-'奬' => '奖',
 '奮' => '奋',
 '奼' => '姹',
 '妝' => '妆',
@@ -10071,13 +10389,14 @@ $zh2Hans = array(
 '婭' => '娅',
 '媧' => '娲',
 '媯' => '妫',
+'媰' => '㛀',
 '媼' => '媪',
 '媽' => '妈',
 '嫗' => '妪',
 '嫵' => '妩',
 '嫻' => '娴',
 '嫿' => '婳',
-'å¬\80' => '妫',
+'å¬\83' => '媭',
 '嬈' => '娆',
 '嬋' => '婵',
 '嬌' => '娇',
@@ -10087,6 +10406,7 @@ $zh2Hans = array(
 '嬪' => '嫔',
 '嬰' => '婴',
 '嬸' => '婶',
+'孋' => '㛤',
 '孌' => '娈',
 '孫' => '孙',
 '學' => '学',
@@ -10128,6 +10448,7 @@ $zh2Hans = array(
 '崬' => '岽',
 '嵐' => '岚',
 '嵗' => '岁',
+'嵼' => '𡶴',
 '嶁' => '嵝',
 '嶄' => '崭',
 '嶇' => '岖',
@@ -10189,7 +10510,9 @@ $zh2Hans = array(
 '彎' => '弯',
 '彙' => '汇',
 '彞' => '彝',
+'彠' => '彟',
 '彥' => '彦',
+'彲' => '彨',
 '後' => '后',
 '徑' => '径',
 '從' => '从',
@@ -10220,7 +10543,6 @@ $zh2Hans = array(
 '慚' => '惭',
 '慟' => '恸',
 '慣' => '惯',
-'慤' => '悫',
 '慪' => '怄',
 '慫' => '怂',
 '慮' => '虑',
@@ -10239,6 +10561,7 @@ $zh2Hans = array(
 '憮' => '怃',
 '憲' => '宪',
 '憶' => '忆',
+'懀' => '𢙓',
 '懇' => '恳',
 '應' => '应',
 '懌' => '怿',
@@ -10274,6 +10597,7 @@ $zh2Hans = array(
 '捲' => '卷',
 '掃' => '扫',
 '掄' => '抡',
+'掆' => '㧏',
 '掗' => '挜',
 '掙' => '挣',
 '掛' => '挂',
@@ -10287,6 +10611,7 @@ $zh2Hans = array(
 '搗' => '捣',
 '搵' => '揾',
 '搶' => '抢',
+'摋' => '𢫬',
 '摑' => '掴',
 '摜' => '掼',
 '摟' => '搂',
@@ -10318,6 +10643,7 @@ $zh2Hans = array(
 '擔' => '担',
 '據' => '据',
 '擠' => '挤',
+'擣' => '𢭏',
 '擬' => '拟',
 '擯' => '摈',
 '擰' => '拧',
@@ -10328,6 +10654,7 @@ $zh2Hans = array(
 '擺' => '摆',
 '擻' => '擞',
 '擼' => '撸',
+'擽' => '㧰',
 '擾' => '扰',
 '攄' => '摅',
 '攆' => '撵',
@@ -10349,6 +10676,8 @@ $zh2Hans = array(
 '數' => '数',
 '斂' => '敛',
 '斃' => '毙',
+'斅' => '𢽾',
+'斆' => '敩',
 '斕' => '斓',
 '斬' => '斩',
 '斷' => '断',
@@ -10371,10 +10700,12 @@ $zh2Hans = array(
 '曏' => '向',
 '曖' => '暧',
 '曠' => '旷',
+'曥' => '𣆐',
 '曨' => '昽',
 '曬' => '晒',
 '書' => '书',
 '會' => '会',
+'朥' => '𦛨',
 '朧' => '胧',
 '朮' => '术',
 '東' => '东',
@@ -10391,10 +10722,12 @@ $zh2Hans = array(
 '棖' => '枨',
 '棗' => '枣',
 '棟' => '栋',
+'棡' => '㭎',
 '棧' => '栈',
 '棲' => '栖',
 '棶' => '梾',
 '椏' => '桠',
+'椲' => '㭏',
 '楊' => '杨',
 '楓' => '枫',
 '楨' => '桢',
@@ -10412,6 +10745,8 @@ $zh2Hans = array(
 '槧' => '椠',
 '槨' => '椁',
 '槳' => '桨',
+'槶' => '椢',
+'槼' => '椝',
 '樁' => '桩',
 '樂' => '乐',
 '樅' => '枞',
@@ -10419,10 +10754,14 @@ $zh2Hans = array(
 '樓' => '楼',
 '標' => '标',
 '樞' => '枢',
+'樢' => '㭤',
 '樣' => '样',
+'樫' => '㭴',
+'樳' => '桪',
 '樸' => '朴',
 '樹' => '树',
 '樺' => '桦',
+'樿' => '椫',
 '橈' => '桡',
 '橋' => '桥',
 '機' => '机',
@@ -10435,6 +10774,7 @@ $zh2Hans = array(
 '檟' => '槚',
 '檢' => '检',
 '檣' => '樯',
+'檭' => '𣘴',
 '檮' => '梼',
 '檯' => '台',
 '檳' => '槟',
@@ -10460,8 +10800,10 @@ $zh2Hans = array(
 '欄' => '栏',
 '欅' => '榉',
 '權' => '权',
+'欍' => '𣐤',
 '欏' => '椤',
 '欒' => '栾',
+'欓' => '𣗋',
 '欖' => '榄',
 '欞' => '棂',
 '欽' => '钦',
@@ -10484,7 +10826,6 @@ $zh2Hans = array(
 '殰' => '㱩',
 '殲' => '歼',
 '殺' => '杀',
-'殻' => '壳',
 '殼' => '壳',
 '毀' => '毁',
 '毆' => '殴',
@@ -10518,6 +10859,7 @@ $zh2Hans = array(
 '淺' => '浅',
 '渙' => '涣',
 '減' => '减',
+'渢' => '沨',
 '渦' => '涡',
 '測' => '测',
 '渾' => '浑',
@@ -10529,6 +10871,7 @@ $zh2Hans = array(
 '準' => '准',
 '溝' => '沟',
 '溫' => '温',
+'溳' => '涢',
 '滄' => '沧',
 '滅' => '灭',
 '滌' => '涤',
@@ -10537,12 +10880,12 @@ $zh2Hans = array(
 '滬' => '沪',
 '滯' => '滞',
 '滲' => '渗',
-'滷' => '卤',
 '滸' => '浒',
 '滻' => '浐',
 '滾' => '滚',
 '滿' => '满',
 '漁' => '渔',
+'漊' => '溇',
 '漚' => '沤',
 '漢' => '汉',
 '漣' => '涟',
@@ -10554,7 +10897,6 @@ $zh2Hans = array(
 '潁' => '颍',
 '潑' => '泼',
 '潔' => '洁',
-'潙' => '沩',
 '潛' => '潜',
 '潤' => '润',
 '潯' => '浔',
@@ -10562,6 +10904,7 @@ $zh2Hans = array(
 '潷' => '滗',
 '潿' => '涠',
 '澀' => '涩',
+'澅' => '𣶩',
 '澆' => '浇',
 '澇' => '涝',
 '澐' => '沄',
@@ -10575,16 +10918,22 @@ $zh2Hans = array(
 '澾' => '㳠',
 '濁' => '浊',
 '濃' => '浓',
+'濄' => '㳡',
+'濆' => '𣸣',
 '濕' => '湿',
 '濘' => '泞',
+'濜' => '浕',
 '濟' => '济',
 '濤' => '涛',
+'濧' => '㳔',
 '濫' => '滥',
 '濰' => '潍',
 '濱' => '滨',
 '濺' => '溅',
 '濼' => '泺',
 '濾' => '滤',
+'瀂' => '澛',
+'瀃' => '𣽷',
 '瀅' => '滢',
 '瀆' => '渎',
 '瀇' => '㲿',
@@ -10607,8 +10956,10 @@ $zh2Hans = array(
 '灑' => '洒',
 '灕' => '漓',
 '灘' => '滩',
+'灙' => '𣺼',
 '灝' => '灏',
 '灠' => '漤',
+'灡' => '㳕',
 '灣' => '湾',
 '灤' => '滦',
 '灧' => '滟',
@@ -10626,14 +10977,17 @@ $zh2Hans = array(
 '煬' => '炀',
 '煱' => '㶽',
 '熅' => '煴',
+'熉' => '𤈶',
+'熌' => '𤇄',
 '熒' => '荧',
+'熓' => '𤆡',
 '熗' => '炝',
+'熡' => '𤋏',
 '熱' => '热',
 '熲' => '颎',
 '熾' => '炽',
 '燁' => '烨',
 '燈' => '灯',
-'燉' => '炖',
 '燒' => '烧',
 '燙' => '烫',
 '燜' => '焖',
@@ -10645,11 +10999,11 @@ $zh2Hans = array(
 '燶' => '㶶',
 '燼' => '烬',
 '燾' => '焘',
+'爄' => '𤇃',
 '爍' => '烁',
 '爐' => '炉',
 '爛' => '烂',
 '爭' => '争',
-'爲' => '为',
 '爺' => '爷',
 '爾' => '尔',
 '牆' => '墙',
@@ -10683,6 +11037,7 @@ $zh2Hans = array(
 '獻' => '献',
 '獼' => '猕',
 '玀' => '猡',
+'玁' => '𤞤',
 '現' => '现',
 '琺' => '珐',
 '琿' => '珲',
@@ -10698,16 +11053,17 @@ $zh2Hans = array(
 '璣' => '玑',
 '璦' => '瑷',
 '璫' => '珰',
+'璯' => '㻅',
 '環' => '环',
 '璽' => '玺',
 '瓊' => '琼',
 '瓏' => '珑',
 '瓔' => '璎',
+'瓕' => '𤦀',
 '瓚' => '瓒',
 '甌' => '瓯',
 '甕' => '瓮',
 '產' => '产',
-'産' => '产',
 '甦' => '苏',
 '甯' => '宁',
 '畝' => '亩',
@@ -10731,7 +11087,6 @@ $zh2Hans = array(
 '瘮' => '瘆',
 '瘲' => '疭',
 '瘺' => '瘘',
-'瘻' => '瘘',
 '療' => '疗',
 '癆' => '痨',
 '癇' => '痫',
@@ -10753,6 +11108,7 @@ $zh2Hans = array(
 '癲' => '癫',
 '發' => '发',
 '皚' => '皑',
+'皟' => '𤾀',
 '皰' => '疱',
 '皸' => '皲',
 '皺' => '皱',
@@ -10774,6 +11130,7 @@ $zh2Hans = array(
 '瞘' => '眍',
 '瞜' => '䁖',
 '瞞' => '瞒',
+'瞤' => '𥆧',
 '瞭' => '了',
 '瞶' => '瞆',
 '瞼' => '睑',
@@ -10787,19 +11144,24 @@ $zh2Hans = array(
 '硨' => '砗',
 '硯' => '砚',
 '碕' => '埼',
+'碙' => '𥐻',
 '碩' => '硕',
 '碭' => '砀',
 '碸' => '砜',
 '確' => '确',
 '碼' => '码',
+'碽' => '䂵',
 '磑' => '硙',
 '磚' => '砖',
+'磠' => '硵',
 '磣' => '碜',
 '磧' => '碛',
 '磯' => '矶',
 '磽' => '硗',
+'礄' => '硚',
 '礆' => '硷',
 '礎' => '础',
+'礒' => '𥐟',
 '礙' => '碍',
 '礦' => '矿',
 '礪' => '砺',
@@ -10846,9 +11208,7 @@ $zh2Hans = array(
 '竄' => '窜',
 '竅' => '窍',
 '竇' => '窦',
-'竈' => '灶',
 '竊' => '窃',
-'竪' => '竖',
 '競' => '竞',
 '筆' => '笔',
 '筍' => '笋',
@@ -10862,6 +11222,7 @@ $zh2Hans = array(
 '築' => '筑',
 '篋' => '箧',
 '篔' => '筼',
+'篘' => '𥬠',
 '篤' => '笃',
 '篩' => '筛',
 '篳' => '筚',
@@ -10876,8 +11237,11 @@ $zh2Hans = array(
 '簽' => '签',
 '簾' => '帘',
 '籃' => '篮',
+'籋' => '𥬞',
 '籌' => '筹',
+'籔' => '䉤',
 '籙' => '箓',
+'籛' => '篯',
 '籜' => '箨',
 '籟' => '籁',
 '籠' => '笼',
@@ -10950,14 +11314,14 @@ $zh2Hans = array(
 '統' => '统',
 '絲' => '丝',
 '絳' => '绛',
-'絶' => '绝',
 '絹' => '绢',
 '絺' => '𫄨',
+'綀' => '𦈌',
 '綁' => '绑',
 '綃' => '绡',
 '綆' => '绠',
+'綇' => '𦈋',
 '綈' => '绨',
-'綉' => '绣',
 '綌' => '绤',
 '綏' => '绥',
 '綐' => '䌼',
@@ -10967,14 +11331,12 @@ $zh2Hans = array(
 '綠' => '绿',
 '綢' => '绸',
 '綣' => '绻',
-'綫' => '线',
 '綬' => '绶',
 '維' => '维',
 '綯' => '绹',
 '綰' => '绾',
 '綱' => '纲',
 '網' => '网',
-'綳' => '绷',
 '綴' => '缀',
 '綵' => '彩',
 '綸' => '纶',
@@ -10988,10 +11350,9 @@ $zh2Hans = array(
 '緇' => '缁',
 '緊' => '紧',
 '緋' => '绯',
-'ç·\91' => '绿',
+'ç·\8d' => 'ð¦\88\8f',
 '緒' => '绪',
 '緓' => '绬',
-'緔' => '绱',
 '緗' => '缃',
 '緘' => '缄',
 '緙' => '缂',
@@ -11006,16 +11367,20 @@ $zh2Hans = array(
 '緩' => '缓',
 '緬' => '缅',
 '緯' => '纬',
+'緰' => '𦈕',
 '緱' => '缑',
 '緲' => '缈',
 '練' => '练',
 '緶' => '缏',
+'緷' => '𦈉',
+'緸' => '𦈑',
 '緹' => '缇',
 '緻' => '致',
 '縈' => '萦',
 '縉' => '缙',
 '縊' => '缢',
 '縋' => '缒',
+'縎' => '𦈔',
 '縐' => '绉',
 '縑' => '缣',
 '縕' => '缊',
@@ -11025,8 +11390,8 @@ $zh2Hans = array(
 '縞' => '缟',
 '縟' => '缛',
 '縣' => '县',
-'縧' => '绦',
 '縫' => '缝',
+'縬' => '𦈚',
 '縭' => '缡',
 '縮' => '缩',
 '縱' => '纵',
@@ -11037,34 +11402,39 @@ $zh2Hans = array(
 '縶' => '絷',
 '縷' => '缕',
 '縹' => '缥',
+'縺' => '𦈐',
 '總' => '总',
 '績' => '绩',
 '繃' => '绷',
 '繅' => '缫',
 '繆' => '缪',
+'繏' => '𦈝',
 '繐' => '穗',
 '繒' => '缯',
+'繓' => '𦈛',
 '織' => '织',
 '繕' => '缮',
 '繚' => '缭',
 '繞' => '绕',
+'繟' => '𦈎',
 '繡' => '绣',
 '繢' => '缋',
 '繩' => '绳',
 '繪' => '绘',
 '繫' => '系',
 '繭' => '茧',
-'繮' => '缰',
 '繯' => '缳',
 '繰' => '缲',
 '繳' => '缴',
 '繸' => '䍁',
 '繹' => '绎',
+'繻' => '𦈡',
 '繼' => '继',
 '繽' => '缤',
 '繾' => '缱',
 '繿' => '䍀',
 '纁' => '𫄸',
+'纇' => '颣',
 '纈' => '缬',
 '纊' => '纩',
 '續' => '续',
@@ -11090,7 +11460,9 @@ $zh2Hans = array(
 '羨' => '羡',
 '義' => '义',
 '習' => '习',
+'翬' => '翚',
 '翹' => '翘',
+'翽' => '翙',
 '耬' => '耧',
 '耮' => '耢',
 '聖' => '圣',
@@ -11110,18 +11482,22 @@ $zh2Hans = array(
 '脈' => '脉',
 '脛' => '胫',
 '脣' => '唇',
+'脥' => '𣍰',
 '脫' => '脱',
 '脹' => '胀',
 '腎' => '肾',
 '腖' => '胨',
 '腡' => '脶',
 '腦' => '脑',
+'腪' => '𣍯',
 '腫' => '肿',
 '腳' => '脚',
 '腸' => '肠',
 '膃' => '腽',
+'膕' => '腘',
 '膚' => '肤',
 '膠' => '胶',
+'膢' => '𦝼',
 '膩' => '腻',
 '膽' => '胆',
 '膾' => '脍',
@@ -11129,6 +11505,7 @@ $zh2Hans = array(
 '臉' => '脸',
 '臍' => '脐',
 '臏' => '膑',
+'臗' => '𣎑',
 '臘' => '腊',
 '臚' => '胪',
 '臟' => '脏',
@@ -11161,14 +11538,13 @@ $zh2Hans = array(
 '萇' => '苌',
 '萊' => '莱',
 '萬' => '万',
+'萴' => '荝',
 '萵' => '莴',
 '葉' => '叶',
 '葒' => '荭',
 '葤' => '荮',
 '葦' => '苇',
-'葯' => '药',
 '葷' => '荤',
-'蒓' => '莼',
 '蒔' => '莳',
 '蒞' => '莅',
 '蒼' => '苍',
@@ -11178,7 +11554,6 @@ $zh2Hans = array(
 '蓯' => '苁',
 '蓴' => '莼',
 '蓽' => '荜',
-'蔔' => '卜',
 '蔘' => '参',
 '蔞' => '蒌',
 '蔣' => '蒋',
@@ -11215,7 +11590,6 @@ $zh2Hans = array(
 '藝' => '艺',
 '藥' => '药',
 '藪' => '薮',
-'藴' => '蕴',
 '藶' => '苈',
 '藹' => '蔼',
 '藺' => '蔺',
@@ -11259,6 +11633,7 @@ $zh2Hans = array(
 '蟲' => '虫',
 '蟶' => '蛏',
 '蟻' => '蚁',
+'蠁' => '蚃',
 '蠅' => '蝇',
 '蠆' => '虿',
 '蠍' => '蝎',
@@ -11270,17 +11645,14 @@ $zh2Hans = array(
 '蠱' => '蛊',
 '蠶' => '蚕',
 '蠻' => '蛮',
-'衆' => '众',
 '衊' => '蔑',
 '術' => '术',
 '衕' => '同',
 '衚' => '胡',
 '衛' => '卫',
 '衝' => '冲',
-'衹' => '只',
 '袞' => '衮',
 '裊' => '袅',
-'裏' => '里',
 '補' => '补',
 '裝' => '装',
 '裡' => '里',
@@ -11294,7 +11666,7 @@ $zh2Hans = array(
 '褻' => '亵',
 '襀' => '𫌀',
 '襆' => '幞',
-'è¥\87' => '裥',
+'è¥\89' => '裥',
 '襏' => '袯',
 '襖' => '袄',
 '襝' => '裣',
@@ -11304,6 +11676,7 @@ $zh2Hans = array(
 '襬' => '䙓',
 '襯' => '衬',
 '襲' => '袭',
+'襴' => '襕',
 '見' => '见',
 '覎' => '觃',
 '規' => '规',
@@ -11355,10 +11728,12 @@ $zh2Hans = array(
 '訶' => '诃',
 '診' => '诊',
 '註' => '注',
+'詀' => '𧮪',
 '詁' => '诂',
 '詆' => '诋',
 '詎' => '讵',
 '詐' => '诈',
+'詑' => '𫍟',
 '詒' => '诒',
 '詔' => '诏',
 '評' => '评',
@@ -11404,7 +11779,6 @@ $zh2Hans = array(
 '誦' => '诵',
 '誨' => '诲',
 '說' => '说',
-'説' => '说',
 '誰' => '谁',
 '課' => '课',
 '誶' => '谇',
@@ -11460,15 +11834,12 @@ $zh2Hans = array(
 '講' => '讲',
 '謝' => '谢',
 '謠' => '谣',
-'謡' => '谣',
 '謨' => '谟',
 '謫' => '谪',
 '謬' => '谬',
-'謭' => '谫',
 '謳' => '讴',
 '謹' => '谨',
 '謾' => '谩',
-'譅' => '䜧',
 '證' => '证',
 '譊' => '𫍢',
 '譎' => '谲',
@@ -11489,6 +11860,8 @@ $zh2Hans = array(
 '譾' => '谫',
 '讀' => '读',
 '變' => '变',
+'讋' => '詟',
+'讌' => '䜩',
 '讎' => '仇',
 '讒' => '谗',
 '讓' => '让',
@@ -11547,6 +11920,7 @@ $zh2Hans = array(
 '賚' => '赉',
 '賜' => '赐',
 '賞' => '赏',
+'賟' => '𧹖',
 '賠' => '赔',
 '賡' => '赓',
 '賢' => '贤',
@@ -11555,7 +11929,6 @@ $zh2Hans = array(
 '賦' => '赋',
 '賧' => '赕',
 '質' => '质',
-'賫' => '赍',
 '賬' => '账',
 '賭' => '赌',
 '賰' => '䞐',
@@ -11566,12 +11939,12 @@ $zh2Hans = array(
 '購' => '购',
 '賽' => '赛',
 '賾' => '赜',
+'贃' => '𧹗',
 '贄' => '贽',
 '贅' => '赘',
 '贇' => '赟',
 '贈' => '赠',
 '贊' => '赞',
-'贋' => '赝',
 '贍' => '赡',
 '贏' => '赢',
 '贐' => '赆',
@@ -11580,7 +11953,6 @@ $zh2Hans = array(
 '贖' => '赎',
 '贗' => '赝',
 '贛' => '赣',
-'贜' => '赃',
 '赬' => '赪',
 '趕' => '赶',
 '趙' => '赵',
@@ -11600,16 +11972,19 @@ $zh2Hans = array(
 '躊' => '踌',
 '躋' => '跻',
 '躍' => '跃',
+'躎' => '䟢',
 '躑' => '踯',
 '躒' => '跞',
 '躓' => '踬',
 '躕' => '蹰',
 '躚' => '跹',
+'躝' => '𨅬',
 '躡' => '蹑',
 '躥' => '蹿',
 '躦' => '躜',
 '躪' => '躏',
 '軀' => '躯',
+'軉' => '𨉗',
 '車' => '车',
 '軋' => '轧',
 '軌' => '轨',
@@ -11618,6 +11993,7 @@ $zh2Hans = array(
 '軑' => '轪',
 '軒' => '轩',
 '軔' => '轫',
+'軗' => '𨐅',
 '軛' => '轭',
 '軟' => '软',
 '軤' => '轷',
@@ -11631,6 +12007,7 @@ $zh2Hans = array(
 '軼' => '轶',
 '軾' => '轼',
 '較' => '较',
+'輄' => '𨐈',
 '輅' => '辂',
 '輇' => '辁',
 '輈' => '辀',
@@ -11721,7 +12098,6 @@ $zh2Hans = array(
 '鄺' => '邝',
 '酇' => '酂',
 '酈' => '郦',
-'醖' => '酝',
 '醜' => '丑',
 '醞' => '酝',
 '醣' => '糖',
@@ -11747,10 +12123,12 @@ $zh2Hans = array(
 '釤' => '钐',
 '釧' => '钏',
 '釩' => '钒',
+'釳' => '𨰿',
 '釵' => '钗',
 '釷' => '钍',
 '釹' => '钕',
 '釺' => '钎',
+'釾' => '䥺',
 '鈀' => '钯',
 '鈁' => '钫',
 '鈃' => '钘',
@@ -11758,20 +12136,23 @@ $zh2Hans = array(
 '鈇' => '𫓧',
 '鈈' => '钚',
 '鈉' => '钠',
+'鈋' => '𨱂',
 '鈍' => '钝',
-'鈎' => '钩',
 '鈐' => '钤',
 '鈑' => '钣',
 '鈒' => '钑',
 '鈔' => '钞',
 '鈕' => '钮',
 '鈞' => '钧',
+'鈠' => '𨱁',
 '鈣' => '钙',
 '鈥' => '钬',
 '鈦' => '钛',
 '鈧' => '钪',
 '鈮' => '铌',
+'鈯' => '𨱄',
 '鈰' => '铈',
+'鈲' => '𨱃',
 '鈳' => '钶',
 '鈴' => '铃',
 '鈷' => '钴',
@@ -11782,6 +12163,7 @@ $zh2Hans = array(
 '鈾' => '铀',
 '鈿' => '钿',
 '鉀' => '钾',
+'鉁' => '𨱅',
 '鉅' => '钜',
 '鉈' => '铊',
 '鉉' => '铉',
@@ -11793,7 +12175,6 @@ $zh2Hans = array(
 '鉚' => '铆',
 '鉛' => '铅',
 '鉞' => '钺',
-'鉢' => '钵',
 '鉤' => '钩',
 '鉦' => '钲',
 '鉬' => '钼',
@@ -11825,14 +12206,15 @@ $zh2Hans = array(
 '銬' => '铐',
 '銱' => '铞',
 '銳' => '锐',
+'銶' => '𨱇',
 '銷' => '销',
-'銹' => '锈',
 '銻' => '锑',
 '銼' => '锉',
 '鋁' => '铝',
 '鋃' => '锒',
 '鋅' => '锌',
 '鋇' => '钡',
+'鋉' => '𨱈',
 '鋌' => '铤',
 '鋏' => '铗',
 '鋒' => '锋',
@@ -11846,7 +12228,6 @@ $zh2Hans = array(
 '鋨' => '锇',
 '鋩' => '铓',
 '鋪' => '铺',
-'鋭' => '锐',
 '鋮' => '铖',
 '鋯' => '锆',
 '鋰' => '锂',
@@ -11855,6 +12236,7 @@ $zh2Hans = array(
 '鋸' => '锯',
 '鋼' => '钢',
 '錁' => '锞',
+'錂' => '𨱋',
 '錄' => '录',
 '錆' => '锖',
 '錇' => '锫',
@@ -11877,13 +12259,12 @@ $zh2Hans = array(
 '錫' => '锡',
 '錮' => '锢',
 '錯' => '错',
-'録' => '录',
 '錳' => '锰',
 '錶' => '表',
 '錸' => '铼',
 '鍀' => '锝',
-'鍁' => '锨',
 '鍃' => '锪',
+'鍄' => '𨱉',
 '鍆' => '钔',
 '鍇' => '锴',
 '鍈' => '锳',
@@ -11899,6 +12280,7 @@ $zh2Hans = array(
 '鍥' => '锲',
 '鍩' => '锘',
 '鍬' => '锹',
+'鍮' => '𨱎',
 '鍰' => '锾',
 '鍵' => '键',
 '鍶' => '锶',
@@ -11912,7 +12294,6 @@ $zh2Hans = array(
 '鎔' => '镕',
 '鎖' => '锁',
 '鎘' => '镉',
-'鎚' => '锤',
 '鎛' => '镈',
 '鎝' => '𨱏',
 '鎡' => '镃',
@@ -11925,15 +12306,18 @@ $zh2Hans = array(
 '鎬' => '镐',
 '鎭' => '鎮',
 '鎮' => '镇',
+'鎯' => '𨱍',
 '鎰' => '镒',
 '鎲' => '镋',
 '鎳' => '镍',
 '鎵' => '镓',
-'é\8e¸' => 'é\95\8c',
+'é\8e·' => '𨰾',
 '鎿' => '镎',
 '鏃' => '镞',
+'鏆' => '𨱌',
 '鏇' => '镟',
 '鏈' => '链',
+'鏉' => '𨱒',
 '鏌' => '镆',
 '鏍' => '镙',
 '鏐' => '镠',
@@ -11954,23 +12338,28 @@ $zh2Hans = array(
 '鏵' => '铧',
 '鏷' => '镤',
 '鏹' => '镪',
+'鏺' => '䥽',
 '鏽' => '锈',
 '鐃' => '铙',
+'鐄' => '𨱑',
 '鐋' => '铴',
 '鐍' => '𫔎',
+'鐎' => '𨱓',
+'鐏' => '𨱔',
 '鐐' => '镣',
 '鐒' => '铹',
 '鐓' => '镦',
 '鐔' => '镡',
 '鐘' => '钟',
 '鐙' => '镫',
-'鐝' => '镢',
 '鐠' => '镨',
+'鐥' => '䦅',
 '鐦' => '锎',
 '鐧' => '锏',
 '鐨' => '镄',
 '鐫' => '镌',
 '鐮' => '镰',
+'鐯' => '䦃',
 '鐲' => '镯',
 '鐳' => '镭',
 '鐵' => '铁',
@@ -12010,8 +12399,10 @@ $zh2Hans = array(
 '閉' => '闭',
 '開' => '开',
 '閌' => '闶',
+'閍' => '𨸂',
 '閎' => '闳',
 '閏' => '闰',
+'閐' => '𨸃',
 '閑' => '闲',
 '閒' => '闲',
 '間' => '间',
@@ -12027,7 +12418,6 @@ $zh2Hans = array(
 '閬' => '阆',
 '閭' => '闾',
 '閱' => '阅',
-'閲' => '阅',
 '閶' => '阊',
 '閹' => '阉',
 '閻' => '阎',
@@ -12143,7 +12533,7 @@ $zh2Hans = array(
 '頸' => '颈',
 '頹' => '颓',
 '頻' => '频',
-'é ½' => 'é¢\93',
+'é¡\83' => 'ð©\96\96',
 '顆' => '颗',
 '題' => '题',
 '額' => '额',
@@ -12151,7 +12541,6 @@ $zh2Hans = array(
 '顏' => '颜',
 '顒' => '颙',
 '顓' => '颛',
-'顔' => '颜',
 '願' => '愿',
 '顙' => '颡',
 '顛' => '颠',
@@ -12170,13 +12559,16 @@ $zh2Hans = array(
 '颭' => '飐',
 '颮' => '飑',
 '颯' => '飒',
+'颰' => '𩙥',
 '颱' => '台',
 '颳' => '刮',
 '颶' => '飓',
+'颷' => '𩙪',
 '颸' => '飔',
 '颺' => '飏',
 '颻' => '飖',
 '颼' => '飕',
+'颾' => '𩙫',
 '飀' => '飗',
 '飄' => '飘',
 '飆' => '飙',
@@ -12227,6 +12619,7 @@ $zh2Hans = array(
 '餵' => '喂',
 '餶' => '馉',
 '餷' => '馇',
+'餸' => '𩠌',
 '餺' => '馎',
 '餼' => '饩',
 '餾' => '馏',
@@ -12239,7 +12632,6 @@ $zh2Hans = array(
 '饊' => '馓',
 '饋' => '馈',
 '饌' => '馔',
-'饑' => '饥',
 '饒' => '饶',
 '饗' => '飨',
 '饘' => '𫗴',
@@ -12255,6 +12647,7 @@ $zh2Hans = array(
 '馹' => '驲',
 '駁' => '驳',
 '駃' => '𫘝',
+'駎' => '𩧨',
 '駐' => '驻',
 '駑' => '驽',
 '駒' => '驹',
@@ -12262,14 +12655,17 @@ $zh2Hans = array(
 '駕' => '驾',
 '駘' => '骀',
 '駙' => '驸',
+'駚' => '𩧫',
 '駛' => '驶',
 '駝' => '驼',
 '駟' => '驷',
-'駡' => '骂',
 '駢' => '骈',
+'駧' => '𩧲',
+'駩' => '𩧴',
 '駭' => '骇',
 '駰' => '骃',
 '駱' => '骆',
+'駶' => '𩧺',
 '駸' => '骎',
 '駻' => '𫘣',
 '駿' => '骏',
@@ -12281,11 +12677,16 @@ $zh2Hans = array(
 '騍' => '骒',
 '騎' => '骑',
 '騏' => '骐',
+'騔' => '𩨀',
 '騖' => '骛',
 '騙' => '骗',
+'騚' => '𩨊',
+'騝' => '𩨃',
+'騟' => '𩨈',
 '騠' => '𫘨',
 '騤' => '骙',
 '騧' => '䯄',
+'騪' => '𩨄',
 '騫' => '骞',
 '騭' => '骘',
 '騮' => '骝',
@@ -12301,6 +12702,7 @@ $zh2Hans = array(
 '驄' => '骢',
 '驅' => '驱',
 '驊' => '骅',
+'驋' => '𩧯',
 '驌' => '骕',
 '驍' => '骁',
 '驏' => '骣',
@@ -12332,12 +12734,14 @@ $zh2Hans = array(
 '鬩' => '阋',
 '鬮' => '阄',
 '鬱' => '郁',
+'鬹' => '鬶',
 '魎' => '魉',
 '魘' => '魇',
 '魚' => '鱼',
 '魛' => '鱽',
 '魟' => '𫚉',
 '魢' => '鱾',
+'魥' => '𩽹',
 '魨' => '鲀',
 '魯' => '鲁',
 '魴' => '鲂',
@@ -12349,15 +12753,15 @@ $zh2Hans = array(
 '鮊' => '鲌',
 '鮋' => '鲉',
 '鮍' => '鲏',
-'鮎' => '鲇',
 '鮐' => '鲐',
 '鮑' => '鲍',
 '鮒' => '鲋',
 '鮓' => '鲊',
 '鮚' => '鲒',
 '鮜' => '鲘',
-'鮝' => '鲞',
 '鮞' => '鲕',
+'鮟' => '𩽾',
+'鮣' => '䲟',
 '鮦' => '鲖',
 '鮪' => '鲔',
 '鮫' => '鲛',
@@ -12366,9 +12770,11 @@ $zh2Hans = array(
 '鮰' => '𫚔',
 '鮳' => '鲓',
 '鮶' => '鲪',
+'鮸' => '𩾃',
 '鮺' => '鲝',
 '鯀' => '鲧',
 '鯁' => '鲠',
+'鯄' => '𩾁',
 '鯆' => '𫚙',
 '鯇' => '鲩',
 '鯉' => '鲤',
@@ -12387,19 +12793,21 @@ $zh2Hans = array(
 '鯨' => '鲸',
 '鯪' => '鲮',
 '鯫' => '鲰',
-'鯰' => 'é²\87',
+'鯱' => 'ð©¾\87',
 '鯴' => '鲺',
+'鯶' => '𩽼',
 '鯷' => '鳀',
 '鯽' => '鲫',
 '鯿' => '鳊',
 '鰁' => '鳈',
 '鰂' => '鲗',
 '鰃' => '鳂',
+'鰆' => '䲠',
 '鰈' => '鲽',
 '鰉' => '鳇',
+'鰌' => '䲡',
 '鰍' => '鳅',
 '鰏' => '鲾',
-'鰐' => '鳄',
 '鰒' => '鳆',
 '鰓' => '鳃',
 '鰜' => '鳒',
@@ -12408,6 +12816,7 @@ $zh2Hans = array(
 '鰣' => '鲥',
 '鰤' => '𫚕',
 '鰥' => '鳏',
+'鰧' => '䲢',
 '鰨' => '鳎',
 '鰩' => '鳐',
 '鰭' => '鳍',
@@ -12424,6 +12833,7 @@ $zh2Hans = array(
 '鰾' => '鳔',
 '鱂' => '鳉',
 '鱅' => '鳙',
+'鱇' => '𩾌',
 '鱈' => '鳕',
 '鱉' => '鳖',
 '鱒' => '鳟',
@@ -12447,12 +12857,12 @@ $zh2Hans = array(
 '鳥' => '鸟',
 '鳧' => '凫',
 '鳩' => '鸠',
-'鳬' => '凫',
 '鳲' => '鸤',
 '鳳' => '凤',
 '鳴' => '鸣',
 '鳶' => '鸢',
 '鳷' => '𫛛',
+'鳼' => '𪉃',
 '鳾' => '䴓',
 '鴃' => '𫛞',
 '鴆' => '鸩',
@@ -12462,6 +12872,7 @@ $zh2Hans = array(
 '鴕' => '鸵',
 '鴗' => '𫁡',
 '鴛' => '鸳',
+'鴜' => '𪉈',
 '鴝' => '鸲',
 '鴞' => '鸮',
 '鴟' => '鸱',
@@ -12470,6 +12881,7 @@ $zh2Hans = array(
 '鴨' => '鸭',
 '鴯' => '鸸',
 '鴰' => '鸹',
+'鴲' => '𪉆',
 '鴴' => '鸻',
 '鴷' => '䴕',
 '鴻' => '鸿',
@@ -12481,6 +12893,7 @@ $zh2Hans = array(
 '鵑' => '鹃',
 '鵒' => '鹆',
 '鵓' => '鹁',
+'鵚' => '𪉍',
 '鵜' => '鹈',
 '鵝' => '鹅',
 '鵠' => '鹄',
@@ -12516,19 +12929,19 @@ $zh2Hans = array(
 '鶻' => '鹘',
 '鶼' => '鹣',
 '鶿' => '鹚',
-'鷀' => '鹚',
 '鷁' => '鹢',
 '鷂' => '鹞',
-'鷄' => '鸡',
 '鷈' => '䴘',
 '鷊' => '鹝',
 '鷓' => '鹧',
+'鷔' => '𪉑',
 '鷖' => '鹥',
 '鷗' => '鸥',
 '鷙' => '鸷',
 '鷚' => '鹨',
 '鷥' => '鸶',
 '鷦' => '鹪',
+'鷨' => '𪉊',
 '鷫' => '鹔',
 '鷯' => '鹩',
 '鷲' => '鹫',
@@ -12556,10 +12969,12 @@ $zh2Hans = array(
 '鹽' => '盐',
 '麗' => '丽',
 '麥' => '麦',
+'麨' => '𪎊',
 '麩' => '麸',
 '麪' => '面',
 '麫' => '面',
 '麯' => '曲',
+'麲' => '𪎉',
 '麴' => '曲',
 '麵' => '面',
 '麼' => '么',
@@ -12605,25 +13020,167 @@ $zh2Hans = array(
 '龔' => '龚',
 '龕' => '龛',
 '龜' => '龟',
+'龭' => '𩨎',
+'龯' => '𨱆',
+'𠌥' => '𠆿',
+'𠏢' => '𠉗',
+'𠞆' => '𠛆',
+'𠠎' => '𠚳',
+'𡄔' => '𠴢',
+'𡄣' => '𠵸',
+'𡅏' => '𠲥',
+'𡑭' => '𡋗',
+'𡓾' => '𡋀',
 '𡞵' => '㛟',
 '𡠹' => '㛿',
 '𡢃' => '㛠',
+'𡮉' => '𡭜',
+'𡮣' => '𡭬',
 '𡻕' => '岁',
+'𡾱' => '㟜',
+'𢣚' => '𢘝',
+'𢣭' => '𢘞',
+'𢶫' => '𢫞',
+'𢷮' => '𢫊',
+'𢹿' => '𢬦',
+'𣙎' => '㭣',
+'𣝕' => '𣘷',
+'𣞻' => '𣘓',
+'𣠲' => '𣑶',
+'𣯴' => '𣭤',
+'𣾷' => '㳢',
+'𣿉' => '𣶫',
+'𤁣' => '𣺽',
+'𤒎' => '𤊀',
 '𤪺' => '㻘',
 '𤫩' => '㻏',
+'𤳸' => '𤳄',
+'𤸫' => '𤶧',
+'𥌃' => '𥅘',
+'𥕥' => '𥐰',
+'𥖅' => '𥐯',
+'𥢢' => '䅪',
+'𥨐' => '𥧂',
+'𥵃' => '𥱔',
+'𥵊' => '𥭉',
+'𥸠' => '𥮋',
+'𥼽' => '𥹥',
+'𥽖' => '𥺇',
+'𥿊' => '𦈈',
+'𦂅' => '𦈒',
+'𦃄' => '𦈗',
+'𦢈' => '𣍨',
+'𦣎' => '𦟗',
+'𦪽' => '𦨩',
+'𧔥' => '𧒭',
+'𧜗' => '䘞',
 '𧜵' => '䙊',
 '𧝞' => '䘛',
-'𧦧' => '𫍟',
 '𧩙' => '䜥',
+'𧳟' => '𧳕',
 '𧵳' => '䞌',
+'𧶔' => '𧹓',
+'𧶧' => '䞎',
+'𨄣' => '𨀱',
+'𨅍' => '𨁴',
+'𨇁' => '𧿈',
+'𨇞' => '𨅫',
+'𨈊' => '𨂺',
+'𨈌' => '𨄄',
+'𨊰' => '䢀',
+'𨊸' => '䢁',
+'𨊻' => '𨐆',
 '𨋢' => '䢂',
+'𨎮' => '𨐉',
+'𨏠' => '𨐇',
+'𨏥' => '𨐊',
+'𨤻' => '𨤰',
+'𨥛' => '𨱀',
 '𨦫' => '䦀',
 '𨧜' => '䦁',
+'𨧱' => '𨱊',
+'𨫒' => '𨱐',
+'𨮂' => '𨱕',
 '𨯅' => '䥿',
+'𨳑' => '𨸁',
+'𨳕' => '𨸀',
+'𨴗' => '𨸅',
+'𨵩' => '𨸆',
+'𨵸' => '𨸇',
+'𨶀' => '𨸉',
+'𨶏' => '𨸊',
+'𨶮' => '𨸌',
+'𨶲' => '𨸋',
+'𨷲' => '𨸎',
+'𨽏' => '𨸘',
+'𩎢' => '𩏾',
+'𩏪' => '𩏽',
+'𩓣' => '𩖕',
+'𩗀' => '𩙦',
+'𩘀' => '𩙩',
+'𩘝' => '𩙭',
+'𩘹' => '𩙨',
+'𩘺' => '𩙬',
+'𩙈' => '𩙰',
+'𩚛' => '𩟿',
+'𩚥' => '𩠀',
+'𩚵' => '𩠁',
+'𩛆' => '𩠂',
+'𩛩' => '𩠃',
+'𩜇' => '𩠉',
+'𩜦' => '𩠆',
+'𩜵' => '𩠊',
+'𩝔' => '𩠋',
+'𩞄' => '𩠎',
+'𩞦' => '𩠏',
+'𩞯' => '䭪',
+'𩟐' => '𩠅',
+'𩠴' => '𩠠',
+'𩡺' => '𩧦',
+'𩢡' => '𩧬',
+'𩢴' => '𩧵',
+'𩢸' => '𩧳',
+'𩢾' => '𩧮',
+'𩣏' => '𩧶',
 '𩣑' => '䯃',
 '𩣵' => '𩧻',
+'𩣺' => '𩧼',
+'𩤊' => '𩧩',
+'𩤙' => '𩨆',
+'𩤲' => '𩨉',
+'𩤸' => '𩨅',
+'𩥄' => '𩨋',
+'𩥇' => '𩨍',
+'𩥉' => '𩧱',
+'𩥑' => '𩨌',
+'𩧆' => '𩨐',
+'𩭙' => '𩬣',
+'𩯳' => '𩯒',
+'𩰀' => '𩬤',
+'𩳤' => '𩲒',
+'𩵩' => '𩽺',
+'𩵹' => '𩽻',
 '𩶘' => '䲞',
-'𫚒' => '軿',
+'𩶰' => '𩽿',
+'𩶱' => '𩽽',
+'𩷰' => '𩾄',
+'𩸃' => '𩾅',
+'𩸦' => '𩾆',
+'𩿪' => '𪉄',
+'𪀦' => '𪉅',
+'𪀾' => '𪉋',
+'𪁈' => '𪉉',
+'𪁖' => '𪉌',
+'𪂆' => '𪉎',
+'𪃍' => '𪉐',
+'𪃏' => '𪉏',
+'𪄆' => '𪉔',
+'𪄕' => '𪉒',
+'𪇳' => '𪉕',
+'𪋿' => '𪎍',
+'𪔵' => '𪔭',
+'𪘀' => '𪚏',
+'𪘯' => '𪚐',
 '《易乾' => '《易乾',
 '不著痕跡' => '不着痕迹',
 '不著邊際' => '不着边际',
@@ -12762,8 +13319,8 @@ $zh2Hans = array(
 '乾曜' => '乾曜',
 '乾构' => '乾构',
 '乾構' => '乾构',
-'乾枢' => '乾枢',
 '乾樞' => '乾枢',
+'乾枢' => '乾枢',
 '乾栋' => '乾栋',
 '乾棟' => '乾栋',
 '乾步' => '乾步',
@@ -13473,6 +14030,7 @@ $zh2Hans = array(
 '尋著稱' => '寻著称',
 '尋著者' => '寻著者',
 '尋著述' => '寻著述',
+'將軍抽俥' => '将军抽俥',
 '將軍抽車' => '将军抽車',
 '尼乾陀' => '尼乾陀',
 '展著' => '展着',
@@ -14790,6 +15348,8 @@ $zh2Hans = array(
 '繞著稱' => '绕著称',
 '繞著者' => '绕著者',
 '繞著述' => '绕著述',
+'綳著勁' => '绷着劲',
+'綳著臉' => '绷着脸',
 '編著' => '编著',
 '纏著' => '缠着',
 '纏著書' => '缠著书',
@@ -14918,7 +15478,9 @@ $zh2Hans = array(
 '著者' => '著者',
 '著身' => '著身',
 '著述' => '著述',
+'蒙汗葯' => '蒙汗药',
 '蒙著' => '蒙着',
+'蒙葯' => '蒙药',
 '蒙著書' => '蒙著书',
 '蒙著书' => '蒙著书',
 '蒙著作' => '蒙著作',
@@ -15512,7 +16074,6 @@ $zh2Hans = array(
 '鬱氏' => '鬱氏',
 '魏徵' => '魏徵',
 '魚乾乾' => '鱼干干',
-'鯰魚' => '鲶鱼',
 '麯崇裕' => '麯崇裕',
 '麴義' => '麴义',
 '麴义' => '麴义',
index 0e84583..ccdf2bb 100644 (file)
@@ -596,6 +596,7 @@ class ZipDirectoryReader {
         *
         * @param $offset int The offset into the string at which to start unpacking.
         *
+        * @throws MWException
         * @return array Unpacked associative array. Note that large integers in the input
         *    may be represented as floating point numbers in the return value, so
         *    the use of weak comparison is advised.
@@ -622,7 +623,6 @@ class ZipDirectoryReader {
                        } else {
                                // Unsigned little-endian integer
                                $length = intval( $type );
-                               $bytes = substr( $string, $pos, $length );
 
                                // Calculate the value. Use an algorithm which automatically
                                // upgrades the value to floating point if necessary.
index f715229..d0bc22c 100644 (file)
@@ -122,7 +122,7 @@ class CreditsAction extends FormlessAction {
 
                # Sift for real versus user names
                foreach ( $contributors as $user ) {
-                       $cnt--; 
+                       $cnt--;
                        if ( $user->isLoggedIn() ) {
                                $link = $this->link( $user );
                                if ( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() ) {
index dcd6fe5..61de3b6 100644 (file)
@@ -158,8 +158,12 @@ class HistoryAction extends FormlessAction {
                } else {
                        $conds = array();
                }
-               $checkDeleted = Xml::checkLabel( $this->msg( 'history-show-deleted' )->text(),
+               if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
+                       $checkDeleted = Xml::checkLabel( $this->msg( 'history-show-deleted' )->text(),
                        'deleted', 'mw-show-deleted-only', $request->getBool( 'deleted' ) ) . "\n";
+               } else {
+                       $checkDeleted = '';
+               }
 
                // Add the general form
                $action = htmlspecialchars( $wgScript );
@@ -572,7 +576,7 @@ class HistoryPager extends ReverseChronologicalPager {
                } elseif ( $rev->getVisibility() && $user->isAllowed( 'deletedhistory' ) ) {
                        // If revision was hidden from sysops, disable the link
                        if ( !$rev->userCan( Revision::DELETED_RESTRICTED, $user ) ) {
-                               $cdel = Linker::revDeleteLinkDisabled( false );
+                               $del = Linker::revDeleteLinkDisabled( false );
                        // Otherwise, show the link...
                        } else {
                                $query = array( 'type' => 'revision',
index e27e53e..29c3d7e 100644 (file)
@@ -56,7 +56,116 @@ class InfoAction extends FormlessAction {
         * @return string Page information that will be added to the output
         */
        public function onView() {
-               global $wgContLang, $wgDisableCounters, $wgRCMaxAge, $wgRestrictionTypes;
+               $content = '';
+
+               // Validate revision
+               $oldid = $this->page->getOldID();
+               if ( $oldid ) {
+                       $revision = $this->page->getRevisionFetched();
+
+                       // Revision is missing
+                       if ( $revision === null ) {
+                               return $this->msg( 'missing-revision', $oldid )->parse();
+                       }
+
+                       // Revision is not current
+                       if ( !$revision->isCurrent() ) {
+                               return $this->msg( 'pageinfo-not-current' )->plain();
+                       }
+               }
+
+               // Page header
+               if ( !$this->msg( 'pageinfo-header' )->isDisabled() ) {
+                       $content .= $this->msg( 'pageinfo-header' )->parse();
+               }
+
+               // Hide "This page is a member of # hidden categories" explanation
+               $content .= Html::element( 'style', array(),
+                       '.mw-hiddenCategoriesExplanation { display: none; }' );
+
+               // Hide "Templates used on this page" explanation
+               $content .= Html::element( 'style', array(),
+                       '.mw-templatesUsedExplanation { display: none; }' );
+
+               // Get page information
+               $pageInfo = $this->pageInfo();
+
+               // Allow extensions to add additional information
+               wfRunHooks( 'InfoAction', array( $this->getContext(), &$pageInfo ) );
+
+               // Render page information
+               foreach ( $pageInfo as $header => $infoTable ) {
+                       $content .= $this->makeHeader( $this->msg( "pageinfo-${header}" )->escaped() );
+                       $table = '';
+                       foreach ( $infoTable as $infoRow ) {
+                               $name = ( $infoRow[0] instanceof Message ) ? $infoRow[0]->escaped() : $infoRow[0];
+                               $value = ( $infoRow[1] instanceof Message ) ? $infoRow[1]->escaped() : $infoRow[1];
+                               $table = $this->addRow( $table, $name, $value );
+                       }
+                       $content = $this->addTable( $content, $table );
+               }
+
+               // Page footer
+               if ( !$this->msg( 'pageinfo-footer' )->isDisabled() ) {
+                       $content .= $this->msg( 'pageinfo-footer' )->parse();
+               }
+
+               // Page credits
+               /*if ( $this->page->exists() ) {
+                       $content .= Html::rawElement( 'div', array( 'id' => 'mw-credits' ), $this->getContributors() );
+               }*/
+
+               return $content;
+       }
+
+       /**
+        * Creates a header that can be added to the output.
+        *
+        * @param $header The header text.
+        * @return string The HTML.
+        */
+       protected function makeHeader( $header ) {
+               global $wgParser;
+               $spanAttribs = array( 'class' => 'mw-headline', 'id' => $wgParser->guessSectionNameFromWikiText( $header ) );
+               return Html::rawElement( 'h2', array(), Html::element( 'span', $spanAttribs, $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( 'style' => 'vertical-align: top;' ), $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 page information in an easily-manipulated format. Array keys are used so extensions
+        * may add additional information in arbitrary positions. Array values are arrays with one
+        * element to be rendered as a header, arrays with two elements to be rendered as a table row.
+        *
+        * @return array
+        */
+       protected function pageInfo() {
+               global $wgContLang, $wgRCMaxAge;
 
                $user = $this->getUser();
                $lang = $this->getLanguage();
@@ -64,8 +173,7 @@ class InfoAction extends FormlessAction {
                $id = $title->getArticleID();
 
                // Get page information that would be too "expensive" to retrieve by normal means
-               $userCanViewUnwatchedPages = $user->isAllowed( 'unwatchedpages' );
-               $pageInfo = self::pageCountInfo( $title, $userCanViewUnwatchedPages, $wgDisableCounters );
+               $pageCounts = self::pageCounts( $title, $user );
 
                // Get page properties
                $dbr = wfGetDB( DB_SLAVE );
@@ -81,16 +189,9 @@ class InfoAction extends FormlessAction {
                        $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() );
+               $pageInfo = array();
+               $pageInfo['header-basic'] = array();
 
                // Display title
                $displayTitle = $title->getPrefixedText();
@@ -98,8 +199,24 @@ class InfoAction extends FormlessAction {
                        $displayTitle = $pageProperties['displaytitle'];
                }
 
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-display-title' )->escaped(), $displayTitle );
+               $pageInfo['header-basic'][] = array(
+                       $this->msg( 'pageinfo-display-title' ), $displayTitle
+               );
+
+               // Is it a redirect? If so, where to?
+               if ( $title->isRedirect() ) {
+                       $pageInfo['header-basic'][] = array(
+                               $this->msg( 'pageinfo-redirectsto' ),
+                               Linker::link( $this->page->getRedirectTarget() ) .
+                               $this->msg( 'word-separator' )->text() .
+                               $this->msg( 'parentheses', Linker::link(
+                                       $this->page->getRedirectTarget(),
+                                       $this->msg( 'pageinfo-redirectsto-info' )->escaped(),
+                                       array(),
+                                       array( 'action' => 'info' )
+                               ) )->text()
+                       );
+               }
 
                // Default sort key
                $sortKey = $title->getCategorySortKey();
@@ -107,16 +224,21 @@ class InfoAction extends FormlessAction {
                        $sortKey = $pageProperties['defaultsort'];
                }
 
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-default-sort' )->escaped(), $sortKey );
+               $pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-default-sort' ), $sortKey );
 
                // Page length (in bytes)
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-length' )->escaped(), $lang->formatNum( $title->getLength() ) );
+               $pageInfo['header-basic'][] = array(
+                       $this->msg( 'pageinfo-length' ), $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 );
+               // Page ID (number not localised, as it's a database ID)
+               $pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-article-id' ), $id );
+
+               // Language in which the page content is (supposed to be) written
+               $pageLang = $title->getPageLanguage()->getCode();
+               $pageInfo['header-basic'][] = array( $this->msg( 'pageinfo-language' ),
+                       Language::fetchLanguageName( $pageLang, $lang->getCode() )
+                       . ' ' . $this->msg( 'parentheses', $pageLang ) );
 
                // Search engine status
                $pOutput = new ParserOutput();
@@ -126,27 +248,27 @@ class InfoAction extends FormlessAction {
 
                // 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()
+               $pageInfo['header-basic'][] = array(
+                       $this->msg( 'pageinfo-robot-policy' ), $this->msg( "pageinfo-robot-${policy['index']}" )
                );
 
-               if ( !$wgDisableCounters ) {
+               if ( isset( $pageCounts['views'] ) ) {
                        // Number of views
-                       $table = $this->addRow( $table,
-                               $this->msg( 'pageinfo-views' )->escaped(), $lang->formatNum( $pageInfo['views'] )
+                       $pageInfo['header-basic'][] = array(
+                               $this->msg( 'pageinfo-views' ), $lang->formatNum( $pageCounts['views'] )
                        );
                }
 
-               if ( $userCanViewUnwatchedPages ) {
+               if ( isset( $pageCounts['watchers'] ) ) {
                        // Number of page watchers
-                       $table = $this->addRow( $table,
-                               $this->msg( 'pageinfo-watchers' )->escaped(), $lang->formatNum( $pageInfo['watchers'] ) );
+                       $pageInfo['header-basic'][] = array(
+                               $this->msg( 'pageinfo-watchers' ), $lang->formatNum( $pageCounts['watchers'] )
+                       );
                }
 
                // Redirects to this page
                $whatLinksHere = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
-               $table = $this->addRow( $table,
+               $pageInfo['header-basic'][] = array(
                        Linker::link(
                                $whatLinksHere,
                                $this->msg( 'pageinfo-redirects-name' )->escaped(),
@@ -154,30 +276,61 @@ class InfoAction extends FormlessAction {
                                array( 'hidelinks' => 1, 'hidetrans' => 1 )
                        ),
                        $this->msg( 'pageinfo-redirects-value' )
-                               ->numParams( count( $title->getRedirectsHere() ) )->escaped()
+                               ->numParams( count( $title->getRedirectsHere() ) )
                );
 
+               // Is it counted as a content page?
+               if ( $this->page->isCountable() ) {
+                       $pageInfo['header-basic'][] = array(
+                               $this->msg( 'pageinfo-contentpage' ),
+                               $this->msg( 'pageinfo-contentpage-yes' )
+                       );
+               }
+
                // Subpages of this page, if subpages are enabled for the current NS
                if ( MWNamespace::hasSubpages( $title->getNamespace() ) ) {
                        $prefixIndex = SpecialPage::getTitleFor( 'Prefixindex', $title->getPrefixedText() . '/' );
-                       $table = $this->addRow( $table,
+                       $pageInfo['header-basic'][] = array(
                                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()
+                                               $pageCounts['subpages']['total'],
+                                               $pageCounts['subpages']['redirects'],
+                                               $pageCounts['subpages']['nonredirects'] )
                        );
                }
 
                // Page protection
-               $content = $this->addTable( $content, $table );
-               $content = $this->addHeader( $content, $this->msg( 'pageinfo-header-restrictions' )->text() );
-               $table = '';
+               $pageInfo['header-restrictions'] = array();
+
+               // Is this page effected by the cascading protection of something which includes it?
+               if ( $title->isCascadeProtected() ) {
+                       $cascadingFrom = '';
+                       $sources = $title->getCascadeProtectionSources(); // Array deferencing is in PHP 5.4 :(
+
+                       foreach ( $sources[0] as $sourceTitle ) {
+                               $cascadingFrom .= Html::rawElement( 'li', array(), Linker::linkKnown( $sourceTitle ) );
+                       }
+
+                       $cascadingFrom = Html::rawElement( 'ul', array(), $cascadingFrom );
+                       $pageInfo['header-restrictions'][] = array(
+                               $this->msg( 'pageinfo-protect-cascading-from' ),
+                               $cascadingFrom
+                       );
+               }
+
+               // Is out protection set to cascade to other pages?
+               if ( $title->areRestrictionsCascading() ) {
+                       $pageInfo['header-restrictions'][] = array(
+                               $this->msg( 'pageinfo-protect-cascading' ),
+                               $this->msg( 'pageinfo-protect-cascading-yes' )
+                       );
+               }
 
                // Page protection
-               foreach ( $wgRestrictionTypes as $restrictionType ) {
+               foreach ( $title->getRestrictionTypes() as $restrictionType ) {
                        $protectionLevel = implode( ', ', $title->getRestrictions( $restrictionType ) );
+
                        if ( $protectionLevel == '' ) {
                                // Allow all users
                                $message = $this->msg( 'protect-default' )->escaped();
@@ -192,29 +345,29 @@ class InfoAction extends FormlessAction {
                                }
                        }
 
-                       $table = $this->addRow( $table,
-                               $this->msg( 'pageinfo-restriction',
-                                       $this->msg( "restriction-$restrictionType" )->plain()
-                               )->parse(), $message
+                       $pageInfo['header-restrictions'][] = array(
+                               $this->msg( "restriction-$restrictionType" ), $message
                        );
                }
 
+               if ( !$this->page->exists() ) {
+                       return $pageInfo;
+               }
+
                // Edit history
-               $content = $this->addTable( $content, $table );
-               $content = $this->addHeader( $content, $this->msg( 'pageinfo-header-edits' )->text() );
-               $table = '';
+               $pageInfo['header-edits'] = array();
 
                $firstRev = $this->page->getOldestRevision();
 
                // Page creator
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-firstuser' )->escaped(),
-                       $firstRev->getUserText( Revision::FOR_THIS_USER, $user )
+               $pageInfo['header-edits'][] = array(
+                       $this->msg( 'pageinfo-firstuser' ),
+                       Linker::revUserTools( $firstRev )
                );
 
                // Date of page creation
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-firsttime' )->escaped(),
+               $pageInfo['header-edits'][] = array(
+                       $this->msg( 'pageinfo-firsttime' ),
                        Linker::linkKnown(
                                $title,
                                $lang->userTimeAndDate( $firstRev->getTimestamp(), $user ),
@@ -224,14 +377,14 @@ class InfoAction extends FormlessAction {
                );
 
                // Latest editor
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-lastuser' )->escaped(),
-                       $this->page->getUserText( Revision::FOR_THIS_USER, $user )
+               $pageInfo['header-edits'][] = array(
+                       $this->msg( 'pageinfo-lastuser' ),
+                       Linker::revUserTools( $this->page->getRevision() )
                );
 
                // Date of latest edit
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-lasttime' )->escaped(),
+               $pageInfo['header-edits'][] = array(
+                       $this->msg( 'pageinfo-lasttime' ),
                        Linker::linkKnown(
                                $title,
                                $lang->userTimeAndDate( $this->page->getTimestamp(), $user ),
@@ -241,28 +394,26 @@ class InfoAction extends FormlessAction {
                );
 
                // Total number of edits
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-edits' )->escaped(), $lang->formatNum( $pageInfo['edits'] )
+               $pageInfo['header-edits'][] = array(
+                       $this->msg( 'pageinfo-edits' ), $lang->formatNum( $pageCounts['edits'] )
                );
 
                // Total number of distinct authors
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-authors' )->escaped(), $lang->formatNum( $pageInfo['authors'] )
+               $pageInfo['header-edits'][] = array(
+                       $this->msg( 'pageinfo-authors' ), $lang->formatNum( $pageCounts['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'] )
+               $pageInfo['header-edits'][] = array(
+                       $this->msg( 'pageinfo-recent-edits', $lang->formatDuration( $wgRCMaxAge ) ),
+                       $lang->formatNum( $pageCounts['recent_edits'] )
                );
 
                // Recent number of distinct authors
-               $table = $this->addRow( $table,
-                       $this->msg( 'pageinfo-recent-authors' )->escaped(), $lang->formatNum( $pageInfo['recent_authors'] )
+               $pageInfo['header-edits'][] = array(
+                       $this->msg( 'pageinfo-recent-authors' ), $lang->formatNum( $pageCounts['recent_authors'] )
                );
 
-               $content = $this->addTable( $content, $table );
-
                // Array of MagicWord objects
                $magicWords = MagicWord::getDoubleUnderscoreArray();
 
@@ -287,64 +438,47 @@ class InfoAction extends FormlessAction {
                        || count( $hiddenCategories ) > 0
                        || count( $transcludedTemplates ) > 0 ) {
                        // Page properties
-                       $content = $this->addHeader( $content, $this->msg( 'pageinfo-header-properties' )->text() );
-                       $table = '';
+                       $pageInfo['header-properties'] = array();
 
                        // Magic words
                        if ( count( $listItems ) > 0 ) {
-                               $table = $this->addRow( $table,
-                                       $this->msg( 'pageinfo-magic-words' )->numParams( count( $listItems ) )->escaped(),
+                               $pageInfo['header-properties'][] = array(
+                                       $this->msg( 'pageinfo-magic-words' )->numParams( count( $listItems ) ),
                                        $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,
+                               $pageInfo['header-properties'][] = array(
                                        $this->msg( 'pageinfo-hidden-categories' )
-                                               ->numParams( count( $hiddenCategories ) )->escaped(),
+                                               ->numParams( count( $hiddenCategories ) ),
                                        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,
+                               $pageInfo['header-properties'][] = array(
                                        $this->msg( 'pageinfo-templates' )
-                                               ->numParams( count( $transcludedTemplates ) )->escaped(),
+                                               ->numParams( count( $transcludedTemplates ) ),
                                        Linker::formatTemplates( $transcludedTemplates )
                                );
                        }
-
-                       $content = $this->addTable( $content, $table );
                }
 
-               // Footer
-               if ( !$this->msg( 'pageinfo-footer' )->isDisabled() ) {
-                       $content .= $this->msg( 'pageinfo-footer' )->parse();
-               }
-
-               return $content;
+               return $pageInfo;
        }
 
        /**
-        * Returns page information that would be too "expensive" to retrieve by normal means.
+        * Returns page counts that would be too "expensive" to retrieve by normal means.
         *
         * @param $title Title object
-        * @param $canViewUnwatched bool
-        * @param $disableCounter bool
+        * @param $user User object
         * @return array
         */
-       public static function pageCountInfo( $title, $canViewUnwatched, $disableCounter ) {
-               global $wgRCMaxAge;
+       protected static function pageCounts( $title, $user ) {
+               global $wgRCMaxAge, $wgDisableCounters;
 
                wfProfileIn( __METHOD__ );
                $id = $title->getArticleID();
@@ -352,7 +486,7 @@ class InfoAction extends FormlessAction {
                $dbr = wfGetDB( DB_SLAVE );
                $result = array();
 
-               if ( !$disableCounter ) {
+               if ( !$wgDisableCounters ) {
                        // Number of views
                        $views = (int) $dbr->selectField(
                                'page',
@@ -363,7 +497,7 @@ class InfoAction extends FormlessAction {
                        $result['views'] = $views;
                }
 
-               if ( $canViewUnwatched ) {
+               if ( $user->isAllowed( 'unwatchedpages' ) ) {
                        // Number of page watchers
                        $watchers = (int) $dbr->selectField(
                                'watchlist',
@@ -454,58 +588,82 @@ class InfoAction extends FormlessAction {
        }
 
        /**
-        * Adds a header to the content that will be added to the output.
+        * Returns the name that goes in the "<h1>" page title.
         *
-        * @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
+        * @return string
         */
-       protected function addHeader( $content, $header ) {
-               return $content . Html::element( 'h2', array(), $header );
+       protected function getPageTitle() {
+               return $this->msg( 'pageinfo-title', $this->getTitle()->getPrefixedText() )->text();
        }
 
        /**
-        * 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
+        * Get a list of contributors of $article
+        * @return string: html
         */
-       protected function addRow( $table, $name, $value ) {
-               return $table . Html::rawElement( 'tr', array(),
-                       Html::rawElement( 'td', array( 'valign' => 'top' ), $name ) .
-                       Html::rawElement( 'td', array(), $value )
-               );
-       }
+       protected function getContributors() {
+               global $wgHiddenPrefs;
+
+               $contributors = $this->page->getContributors();
+               $real_names = array();
+               $user_names = array();
+               $anon_ips = array();
+
+               # Sift for real versus user names
+               foreach ( $contributors as $user ) {
+                       $page = $user->isAnon()
+                               ? SpecialPage::getTitleFor( 'Contributions', $user->getName() )
+                               : $user->getUserPage();
+
+                       if ( $user->getID() == 0 ) {
+                               $anon_ips[] = Linker::link( $page, htmlspecialchars( $user->getName() ) );
+                       } elseif ( !in_array( 'realname', $wgHiddenPrefs ) && $user->getRealName() ) {
+                               $real_names[] = Linker::link( $page, htmlspecialchars( $user->getRealName() ) );
+                       } else {
+                               $user_names[] = Linker::link( $page, htmlspecialchars( $user->getName() ) );
+                       }
+               }
 
-       /**
-        * 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 );
+               $lang = $this->getLanguage();
+
+               $real = $lang->listToText( $real_names );
+
+               # "ThisSite user(s) A, B and C"
+               if ( count( $user_names ) ) {
+                       $user = $this->msg( 'siteusers' )->rawParams( $lang->listToText( $user_names ) )->params(
+                               count( $user_names ) )->escaped();
+               } else {
+                       $user = false;
+               }
+
+               if ( count( $anon_ips ) ) {
+                       $anon = $this->msg( 'anonusers' )->rawParams( $lang->listToText( $anon_ips ) )->params(
+                               count( $anon_ips ) )->escaped();
+               } else {
+                       $anon = false;
+               }
+
+               # This is the big list, all mooshed together. We sift for blank strings
+               $fulllist = array();
+               foreach ( array( $real, $user, $anon ) as $s ) {
+                       if ( $s !== '' ) {
+                               array_push( $fulllist, $s );
+                       }
+               }
+
+               $count = count( $fulllist );
+               # "Based on work by ..."
+               return $count
+                       ? $this->msg( 'othercontribs' )->rawParams(
+                               $lang->listToText( $fulllist ) )->params( $count )->escaped()
+                       : '';
        }
 
        /**
-        * Returns the description that goes below the <h1> tag.
+        * 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 174ca3f..71cb397 100644 (file)
@@ -46,7 +46,7 @@ class RawAction extends FormlessAction {
        }
 
        function onView() {
-               global $wgGroupPermissions, $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
+               global $wgSquidMaxage, $wgForcedRawSMaxage, $wgJsMimeType;
 
                $this->getOutput()->disable();
                $request = $this->getRequest();
@@ -91,7 +91,7 @@ class RawAction extends FormlessAction {
                $response->header( 'Content-type: ' . $contentType . '; charset=UTF-8' );
                # Output may contain user-specific data;
                # vary generated content for open sessions on private wikis
-               $privateCache = !$wgGroupPermissions['*']['read'] && ( $smaxage == 0 || session_id() != '' );
+               $privateCache = !User::groupHasPermission( '*', 'read' ) && ( $smaxage == 0 || session_id() != '' );
                # allow the client to cache this for 24 hours
                $mode = $privateCache ? 'private' : 'public';
                $response->header( 'Cache-Control: ' . $mode . ', s-maxage=' . $smaxage . ', max-age=' . $maxage );
@@ -148,10 +148,29 @@ class RawAction extends FormlessAction {
                                $request->response()->header( "Last-modified: $lastmod" );
 
                                // Public-only due to cache headers
-                               $text = $rev->getText();
-                               $section = $request->getIntOrNull( 'section' );
-                               if ( $section !== null ) {
-                                       $text = $wgParser->getSection( $text, $section );
+                               $content = $rev->getContent();
+
+                               if ( $content === null ) {
+                                       // revision not found (or suppressed)
+                                       $text = false;
+                               } elseif ( !$content instanceof TextContent ) {
+                                       // non-text content
+                                       wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
+                                                                               . $content->getModel() . "` which is not supported via this interface." );
+                                       die();
+                               } else {
+                                       // want a section?
+                                       $section = $request->getIntOrNull( 'section' );
+                                       if ( $section !== null ) {
+                                               $content = $content->getSection( $section );
+                                       }
+
+                                       if ( $content === null || $content === false ) {
+                                               // section not found (or section not supported, e.g. for JS and CSS)
+                                               $text = false;
+                                       } else {
+                                               $text = $content->getNativeData();
+                                       }
                                }
                        }
                }
index 7743438..a5fc4e1 100644 (file)
@@ -115,7 +115,7 @@ class RevertFileAction extends FormAction {
                $source = $this->page->getFile()->getArchiveVirtualUrl( $this->getRequest()->getText( 'oldimage' ) );
                $comment = $data['comment'];
                // TODO: Preserve file properties from database instead of reloading from file
-               return $this->page->getFile()->upload( $source, $comment, $comment );
+               return $this->page->getFile()->upload( $source, $comment, $comment, 0, false, false, $this->getUser() );
        }
 
        public function onSuccess() {
@@ -124,7 +124,7 @@ class RevertFileAction extends FormAction {
                $lang = $this->getLanguage();
                $userDate = $lang->userDate( $timestamp, $user );
                $userTime = $lang->userTime( $timestamp, $user );
-       
+
                $this->getOutput()->addWikiMsg( 'filerevert-success', $this->getTitle()->getText(),
                        $userDate, $userTime,
                        wfExpandUrl( $this->page->getFile()->getArchiveUrl( $this->getRequest()->getText( 'oldimage' ) ),
@@ -136,7 +136,7 @@ class RevertFileAction extends FormAction {
        protected function getPageTitle() {
                return $this->msg( 'filerevert', $this->getTitle()->getText() );
        }
-       
+
        protected function getDescription() {
                $this->getOutput()->addBacklinkSubtitle( $this->getTitle() );
                return '';
index 0d9a902..81bad9d 100644 (file)
@@ -71,45 +71,32 @@ class RollbackAction extends FormlessAction {
                        return;
                }
 
-               # Display permissions errors before read-only message -- there's no
-               # point in misleading the user into thinking the inability to rollback
-               # is only temporary.
-               if ( !empty( $result ) && $result !== array( array( 'readonlytext' ) ) ) {
-                       # array_diff is completely broken for arrays of arrays, sigh.
-                       # Remove any 'readonlytext' error manually.
-                       $out = array();
-                       foreach ( $result as $error ) {
-                               if ( $error != array( 'readonlytext' ) ) {
-                                       $out [] = $error;
-                               }
-                       }
-                       throw new PermissionsError( 'rollback', $out );
-               }
+               #NOTE: Permission errors already handled by Action::checkExecute.
 
                if ( $result == array( array( 'readonlytext' ) ) ) {
                        throw new ReadOnlyError;
                }
 
+               #XXX: Would be nice if ErrorPageError could take multiple errors, and/or a status object.
+               #     Right now, we only show the first error
+               foreach ( $result as $error ) {
+                       throw new ErrorPageError( 'rollbackfailed', $error[0], array_slice( $error, 1 ) );
+               }
+
                $current = $details['current'];
                $target = $details['target'];
                $newId = $details['newid'];
                $this->getOutput()->setPageTitle( $this->msg( 'actioncomplete' ) );
                $this->getOutput()->setRobotPolicy( 'noindex,nofollow' );
 
-               if ( $current->getUserText() === '' ) {
-                       $old = $this->msg( 'rev-deleted-user' )->escaped();
-               } else {
-                       $old = Linker::userLink( $current->getUser(), $current->getUserText() )
-                               . Linker::userToolLinks( $current->getUser(), $current->getUserText() );
-               }
-
-               $new = Linker::userLink( $target->getUser(), $target->getUserText() )
-                       . Linker::userToolLinks( $target->getUser(), $target->getUserText() );
+               $old = Linker::revUserTools( $current );
+               $new = Linker::revUserTools( $target );
                $this->getOutput()->addHTML( $this->msg( 'rollback-success' )->rawParams( $old, $new )->parseAsBlock() );
                $this->getOutput()->returnToMain( false, $this->getTitle() );
 
                if ( !$request->getBool( 'hidediff', false ) && !$this->getUser()->getBoolOption( 'norollbackdiff', false ) ) {
-                       $de = new DifferenceEngine( $this->getContext(), $current->getId(), $newId, false, true );
+                       $contentHandler = $current->getContentHandler();
+                       $de = $contentHandler->createDifferenceEngine( $this->getContext(), $current->getId(), $newId, false, true );
                        $de->showDiff( '', '' );
                }
        }
index 1513e7d..1b176e7 100644 (file)
@@ -775,6 +775,9 @@ abstract class ApiBase extends ContextSource {
                        if ( !$titleObj ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $params['title'] ) );
                        }
+                       if ( !$titleObj->canExist() ) {
+                               $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
+                       }
                        $pageObj = WikiPage::factory( $titleObj );
                        if ( $load !== false ) {
                                $pageObj->loadPageData( $load );
index ed72b29..6741259 100644 (file)
@@ -35,7 +35,15 @@ class ApiComparePages extends ApiBase {
                $rev1 = $this->revisionOrTitleOrId( $params['fromrev'], $params['fromtitle'], $params['fromid'] );
                $rev2 = $this->revisionOrTitleOrId( $params['torev'], $params['totitle'], $params['toid'] );
 
-               $de = new DifferenceEngine( $this->getContext(),
+               $revision = Revision::newFromId( $rev1 );
+
+               if ( !$revision ) {
+                       $this->dieUsage( 'The diff cannot be retrieved, ' .
+                               'one revision does not exist or you do not have permission to view it.', 'baddiff' );
+               }
+
+               $contentHandler = $revision->getContentHandler();
+               $de = $contentHandler->createDifferenceEngine( $this->getContext(),
                        $rev1,
                        $rev2,
                        null, // rcid
index 2d36f19..964e0ae 100644 (file)
@@ -61,6 +61,9 @@ class ApiDelete extends ApiBase {
                        $status = self::delete( $pageObj, $user, $params['token'], $reason );
                }
 
+               if ( is_array( $status ) ) {
+                       $this->dieUsageMsg( $status[0] );
+               }
                if ( !$status->isGood() ) {
                        $errors = $status->getErrorsArray();
                        $this->dieUsageMsg( $errors[0] ); // We don't care about multiple errors, just report one of them
@@ -98,11 +101,11 @@ class ApiDelete extends ApiBase {
        /**
         * We have our own delete() function, since Article.php's implementation is split in two phases
         *
-        * @param $page WikiPage object to work on
+        * @param $page Page|WikiPage object to work on
         * @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 Status
+        * @param $token String delete token (same as edit token)
+        * @param $reason String|null reason for the deletion. Autogenerated if NULL
+        * @return Status|array
         */
        public static function delete( Page $page, User $user, $token, &$reason = null ) {
                $title = $page->getTitle();
@@ -128,13 +131,13 @@ class ApiDelete extends ApiBase {
        }
 
        /**
-        * @param $page WikiPage object to work on
+        * @param $page WikiPage|Page object to work on
         * @param $user User doing the action
         * @param $token
         * @param $oldimage
         * @param $reason
         * @param $suppress bool
-        * @return Status
+        * @return Status|array
         */
        public static function deleteFile( Page $page, User $user, $token, $oldimage, &$reason = null, $suppress = false ) {
                $title = $page->getTitle();
@@ -161,7 +164,7 @@ class ApiDelete extends ApiBase {
                if ( is_null( $reason ) ) { // Log and RC don't like null reasons
                        $reason = '';
                }
-               return FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress );
+               return FileDeleteForm::doDelete( $title, $file, $oldimage, $reason, $suppress, $user );
        }
 
        public function mustBePosted() {
index 0963fe7..cae4a21 100644 (file)
@@ -60,11 +60,9 @@ class ApiEditPage extends ApiBase {
                        if ( $titleObj->isRedirect() ) {
                                $oldTitle = $titleObj;
 
-                               $titles = Title::newFromRedirectArray(
-                                       Revision::newFromTitle(
-                                               $oldTitle, false, Revision::READ_LATEST
-                                       )->getText( Revision::FOR_THIS_USER )
-                               );
+                               $titles = Revision::newFromTitle( $oldTitle, false, Revision::READ_LATEST )
+                                                       ->getContent( Revision::FOR_THIS_USER, $user )
+                                                       ->getRedirectChain();
                                // array_shift( $titles );
 
                                $redirValues = array();
@@ -84,9 +82,34 @@ class ApiEditPage extends ApiBase {
 
                                $apiResult->setIndexedTagName( $redirValues, 'r' );
                                $apiResult->addValue( null, 'redirects', $redirValues );
+
+                               // Since the page changed, update $pageObj
+                               $pageObj = WikiPage::factory( $titleObj );
                        }
                }
 
+               if ( !isset( $params['contentmodel'] ) || $params['contentmodel'] == '' ) {
+                       $contentHandler = $pageObj->getContentHandler();
+               } else {
+                       $contentHandler = ContentHandler::getForModelID( $params['contentmodel'] );
+               }
+
+               // @todo ask handler whether direct editing is supported at all! make allowFlatEdit() method or some such
+
+               if ( !isset( $params['contentformat'] ) || $params['contentformat'] == '' ) {
+                       $params['contentformat'] = $contentHandler->getDefaultFormat();
+               }
+
+               $contentFormat = $params['contentformat'];
+
+               if ( !$contentHandler->isSupportedFormat( $contentFormat ) ) {
+                       $name = $titleObj->getPrefixedDBkey();
+                       $model = $contentHandler->getModelID();
+
+                       $this->dieUsage( "The requested format $contentFormat is not supported for content model ".
+                                                       " $model used by $name", 'badformat' );
+               }
+
                if ( $params['createonly'] && $titleObj->exists() ) {
                        $this->dieUsageMsg( 'createonly-exists' );
                }
@@ -103,31 +126,61 @@ class ApiEditPage extends ApiBase {
                        $this->dieUsageMsg( $errors[0] );
                }
 
-               $articleObj = Article::newFromTitle( $titleObj, $this->getContext() );
-
                $toMD5 = $params['text'];
                if ( !is_null( $params['appendtext'] ) || !is_null( $params['prependtext'] ) )
                {
-                       // For non-existent pages, Article::getContent()
-                       // returns an interface message rather than ''
-                       // We do want getContent()'s behavior for non-existent
-                       // MediaWiki: pages, though
-                       if ( $articleObj->getID() == 0 && $titleObj->getNamespace() != NS_MEDIAWIKI ) {
-                               $content = '';
-                       } else {
-                               $content = $articleObj->getContent();
+                       $content = $pageObj->getContent();
+
+                       if ( !$content ) {
+                               if ( $titleObj->getNamespace() == NS_MEDIAWIKI ) {
+                                       # If this is a MediaWiki:x message, then load the messages
+                                       # and return the message value for x.
+                                       $text = $titleObj->getDefaultMessageText();
+                                       if ( $text === false ) {
+                                               $text = '';
+                                       }
+
+                                       try {
+                                               $content = ContentHandler::makeContent( $text, $this->getTitle() );
+                                       } catch ( MWContentSerializationException $ex ) {
+                                               $this->dieUsage( $ex->getMessage(), 'parseerror' );
+                                               return;
+                                       }
+                               } else {
+                                       # Otherwise, make a new empty content.
+                                       $content = $contentHandler->makeEmptyContent();
+                               }
+                       }
+
+                       // @todo: Add support for appending/prepending to the Content interface
+
+                       if ( !( $content instanceof TextContent ) ) {
+                               $mode = $contentHandler->getModelID();
+                               $this->dieUsage( "Can't append to pages using content model $mode", 'appendnotsupported' );
                        }
 
                        if ( !is_null( $params['section'] ) ) {
+                               if ( !$contentHandler->supportsSections() ) {
+                                       $modelName = $contentHandler->getModelID();
+                                       $this->dieUsage( "Sections are not supported for this content model: $modelName.", 'sectionsnotsupported' );
+                               }
+
                                // Process the content for section edits
-                               global $wgParser;
                                $section = intval( $params['section'] );
-                               $content = $wgParser->getSection( $content, $section, false );
-                               if ( $content === false ) {
+                               $content = $content->getSection( $section );
+
+                               if ( !$content ) {
                                        $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
                                }
                        }
-                       $params['text'] = $params['prependtext'] . $content . $params['appendtext'];
+
+                       if ( !$content ) {
+                               $text = '';
+                       } else {
+                               $text = $content->serialize( $contentFormat );
+                       }
+
+                       $params['text'] = $params['prependtext'] . $text . $params['appendtext'];
                        $toMD5 = $params['prependtext'] . $params['appendtext'];
                }
 
@@ -151,18 +204,21 @@ class ApiEditPage extends ApiBase {
                                $this->dieUsageMsg( array( 'nosuchrevid', $params['undoafter'] ) );
                        }
 
-                       if ( $undoRev->getPage() != $articleObj->getID() ) {
+                       if ( $undoRev->getPage() != $pageObj->getID() ) {
                                $this->dieUsageMsg( array( 'revwrongpage', $undoRev->getID(), $titleObj->getPrefixedText() ) );
                        }
-                       if ( $undoafterRev->getPage() != $articleObj->getID() ) {
+                       if ( $undoafterRev->getPage() != $pageObj->getID() ) {
                                $this->dieUsageMsg( array( 'revwrongpage', $undoafterRev->getID(), $titleObj->getPrefixedText() ) );
                        }
 
-                       $newtext = $articleObj->getUndoText( $undoRev, $undoafterRev );
-                       if ( $newtext === false ) {
+                       $newContent = $contentHandler->getUndoContent( $pageObj->getRevision(), $undoRev, $undoafterRev );
+
+                       if ( !$newContent ) {
                                $this->dieUsageMsg( 'undo-failure' );
                        }
-                       $params['text'] = $newtext;
+
+                       $params['text'] = $newContent->serialize( $params['contentformat'] );
+
                        // 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'] ) {
@@ -179,6 +235,8 @@ class ApiEditPage extends ApiBase {
                // That interface kind of sucks, but it's workable
                $requestArray = array(
                        'wpTextbox1' => $params['text'],
+                       'format' => $contentFormat,
+                       'model' => $contentHandler->getModelID(),
                        'wpEditToken' => $params['token'],
                        'wpIgnoreBlankSummary' => ''
                );
@@ -191,12 +249,17 @@ class ApiEditPage extends ApiBase {
                        $requestArray['wpSectionTitle'] = $params['sectiontitle'];
                }
 
+               // TODO: Pass along information from 'undoafter' as well
+               if ( $params['undo'] > 0 ) {
+                       $requestArray['wpUndidRevision'] = $params['undo'];
+               }
+
                // Watch out for basetimestamp == ''
                // wfTimestamp() treats it as NOW, almost certainly causing an edit conflict
                if ( !is_null( $params['basetimestamp'] ) && $params['basetimestamp'] != '' ) {
                        $requestArray['wpEdittime'] = wfTimestamp( TS_MW, $params['basetimestamp'] );
                } else {
-                       $requestArray['wpEdittime'] = $articleObj->getTimestamp();
+                       $requestArray['wpEdittime'] = $pageObj->getTimestamp();
                }
 
                if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' ) {
@@ -244,7 +307,12 @@ class ApiEditPage extends ApiBase {
                // TODO: Make them not or check if they still do
                $wgTitle = $titleObj;
 
-               $ep = new EditPage( $articleObj );
+               $articleObject = new Article( $titleObj );
+               $ep = new EditPage( $articleObject );
+
+               // allow editing of non-textual content.
+               $ep->allowNonTextContent = true;
+
                $ep->setContextTitle( $titleObj );
                $ep->importFormData( $req );
 
@@ -262,7 +330,7 @@ class ApiEditPage extends ApiBase {
                }
 
                // Do the actual save
-               $oldRevId = $articleObj->getRevIdFetched();
+               $oldRevId = $articleObject->getRevIdFetched();
                $result = null;
                // Fake $wgRequest for some hooks inside EditPage
                // @todo FIXME: This interface SUCKS
@@ -278,6 +346,9 @@ class ApiEditPage extends ApiBase {
                        case EditPage::AS_HOOK_ERROR_EXPECTED:
                                $this->dieUsageMsg( 'hookaborted' );
 
+                       case EditPage::AS_PARSE_ERROR:
+                               $this->dieUsage( $status->getMessage(), 'parseerror' );
+
                        case EditPage::AS_IMAGE_REDIRECT_ANON:
                                $this->dieUsageMsg( 'noimageredirect-anon' );
 
@@ -329,14 +400,16 @@ class ApiEditPage extends ApiBase {
                                $r['result'] = 'Success';
                                $r['pageid'] = intval( $titleObj->getArticleID() );
                                $r['title'] = $titleObj->getPrefixedText();
-                               $newRevId = $articleObj->getLatest();
+                               $r['contentmodel'] = $titleObj->getContentModel();
+                               $newRevId = $articleObject->getLatest();
                                if ( $newRevId == $oldRevId ) {
                                        $r['nochange'] = '';
                                } else {
                                        $r['oldrevid'] = intval( $oldRevId );
                                        $r['newrevid'] = intval( $newRevId );
+                                       $pageObj->clear();
                                        $r['newtimestamp'] = wfTimestamp( TS_ISO_8601,
-                                               $articleObj->getTimestamp() );
+                                               $pageObj->getTimestamp() );
                                }
                                break;
 
@@ -380,6 +453,7 @@ class ApiEditPage extends ApiBase {
                                array( 'undo-failure' ),
                                array( 'hashcheckfailed' ),
                                array( 'hookaborted' ),
+                               array( 'code' => 'parseerror', 'info' => 'Failed to parse the given text.' ),
                                array( 'noimageredirect-anon' ),
                                array( 'noimageredirect-logged' ),
                                array( 'spamdetected', 'spam' ),
@@ -397,6 +471,13 @@ class ApiEditPage extends ApiBase {
                                array( 'unknownerror', 'retval' ),
                                array( 'code' => 'nosuchsection', 'info' => 'There is no section section.' ),
                                array( 'code' => 'invalidsection', 'info' => 'The section parameter must be set to an integer or \'new\'' ),
+                               array( 'code' => 'sectionsnotsupported', 'info' => 'Sections are not supported for this type of page.' ),
+                               array( 'code' => 'editnotsupported', 'info' => 'Editing of this type of page is not supported using '
+                                                                                                                               . 'the text based edit API.' ),
+                               array( 'code' => 'appendnotsupported', 'info' => 'This type of page can not be edited by appending '
+                                                                                                                               . 'or prepending text.' ),
+                               array( 'code' => 'badformat', 'info' => 'The requested serialization format can not be applied to '
+                                                                                                               . 'the page\'s content model' ),
                                array( 'customcssprotected' ),
                                array( 'customjsprotected' ),
                        )
@@ -460,6 +541,12 @@ class ApiEditPage extends ApiBase {
                                ApiBase::PARAM_TYPE => 'boolean',
                                ApiBase::PARAM_DFLT => false,
                        ),
+                       'contentformat' => array(
+                               ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
+                       ),
+                       'contentmodel' => array(
+                               ApiBase::PARAM_TYPE => ContentHandler::getContentModels(),
+                       )
                );
        }
 
@@ -490,7 +577,7 @@ class ApiEditPage extends ApiBase {
                        'watch' => 'Add the page to your watchlist',
                        'unwatch' => 'Remove the page from your watchlist',
                        'watchlist' => 'Unconditionally add or remove the page from your watchlist, use preferences or do not change watch',
-                       'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
+                       'md5' => array( "The MD5 hash of the {$p}text parameter, or the {$p}prependtext and {$p}appendtext parameters concatenated.",
                                        'If set, the edit won\'t be done unless the hash is correct' ),
                        'prependtext' => "Add this text to the beginning of the page. Overrides {$p}text",
                        'appendtext' => array( "Add this text to the end of the page. Overrides {$p}text.",
@@ -498,6 +585,8 @@ class ApiEditPage extends ApiBase {
                        'undo' => "Undo this revision. Overrides {$p}text, {$p}prependtext and {$p}appendtext",
                        'undoafter' => 'Undo all revisions from undo to this one. If not set, just undo one revision',
                        'redirect' => 'Automatically resolve redirects',
+                       'contentformat' => 'Content serialization format used for the input text',
+                       'contentmodel' => 'Content model of the new content',
                );
        }
 
index 1cf760a..fb6a06f 100644 (file)
@@ -130,10 +130,22 @@ class ApiFeedContributions extends ApiBase {
        protected function feedItemDesc( $revision ) {
                if( $revision ) {
                        $msg = wfMessage( 'colon-separator' )->inContentLanguage()->text();
+                       $content = $revision->getContent();
+
+                       if ( $content instanceof TextContent ) {
+                               // only textual content has a "source view".
+                               $html = nl2br( htmlspecialchars( $content->getNativeData() ) );
+                       } else {
+                               //XXX: we could get an HTML representation of the content via getParserOutput, but that may
+                               //     contain JS magic and generally may not be suitable for inclusion in a feed.
+                               //     Perhaps Content should have a getDescriptiveHtml method and/or a getSourceText method.
+                               //Compare also FeedUtils::formatDiffRow.
+                               $html = '';
+                       }
+
                        return '<p>' . htmlspecialchars( $revision->getUserText() ) . $msg .
                                htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
-                               "</p>\n<hr />\n<div>" .
-                               nl2br( htmlspecialchars( $revision->getText() ) ) . "</div>";
+                               "</p>\n<hr />\n<div>" . $html . "</div>";
                }
                return '';
        }
index 83d078d..092b003 100644 (file)
@@ -50,7 +50,7 @@ class ApiFileRevert extends ApiBase {
                $this->checkPermissions( $this->getUser() );
 
                $sourceUrl = $this->file->getArchiveVirtualUrl( $this->archiveName );
-               $status = $this->file->upload( $sourceUrl, $this->params['comment'], $this->params['comment'] );
+               $status = $this->file->upload( $sourceUrl, $this->params['comment'], $this->params['comment'], 0, false, false, $this->getUser() );
 
                if ( $status->isGood() ) {
                        $result = array( 'result' => 'Success' );
diff --git a/includes/api/ApiFormatNone.php b/includes/api/ApiFormatNone.php
new file mode 100644 (file)
index 0000000..b3bde37
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+/**
+ *
+ *
+ * Created on Oct 22, 2006
+ *
+ * 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
+ * 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 Serialized PHP output formatter
+ * @ingroup API
+ */
+class ApiFormatNone extends ApiFormatBase {
+
+       public function __construct( $main, $format ) {
+               parent::__construct( $main, $format );
+       }
+
+       public function getMimeType() {
+               return 'text/plain';
+       }
+
+       public function execute() {
+       }
+
+       public function getDescription() {
+               return 'Output nothing' . parent::getDescription();
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}
index 730ad8e..9a8e3bc 100644 (file)
@@ -35,7 +35,7 @@ class ApiFormatYaml extends ApiFormatJson {
        }
 
        public function getDescription() {
-               return 'Output data in YAML format' . parent::getDescription();
+               return 'Output data in YAML format' . ApiFormatBase::getDescription();
        }
 
        public function getVersion() {
index bfc4933..97f5ecd 100644 (file)
@@ -105,6 +105,7 @@ class ApiMain extends ApiBase {
                'dbgfm' => 'ApiFormatDbg',
                'dump' => 'ApiFormatDump',
                'dumpfm' => 'ApiFormatDump',
+               'none' => 'ApiFormatNone',
        );
 
        /**
@@ -118,7 +119,7 @@ class ApiMain extends ApiBase {
                        'msg' => 'Use of the write API',
                        'params' => array()
                ),
-               'apihighlimits' => array(
+               'apihighlimits' => array(
                        'msg' => 'Use higher limits in API queries (Slow queries: $1 results; Fast queries: $2 results). The limits for slow queries also apply to multivalue parameters.',
                        'params' => array( ApiBase::LIMIT_SML2, ApiBase::LIMIT_BIG2 )
                )
@@ -375,7 +376,12 @@ class ApiMain extends ApiBase {
 
                        // Log it
                        if ( !( $e instanceof UsageException ) ) {
-                               wfDebugLog( 'exception', $e->getLogMessage() );
+                               global $wgLogExceptionBacktrace;
+                               if ( $wgLogExceptionBacktrace ) {
+                                       wfDebugLog( 'exception', $e->getLogMessage() . "\n" . $e->getTraceAsString() . "\n" );
+                               } else {
+                                       wfDebugLog( 'exception', $e->getLogMessage() );
+                               }
                        }
 
                        // Handle any kind of exception by outputing properly formatted error message.
@@ -821,6 +827,8 @@ class ApiMain extends ApiBase {
                $module->profileOut();
 
                if ( !$this->mInternalMode ) {
+                       // Report unused params
+                       $this->reportUnusedParams();
 
                        //append Debug information
                        MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
@@ -837,7 +845,7 @@ class ApiMain extends ApiBase {
        protected function logRequest( $time ) {
                $request = $this->getRequest();
                $milliseconds = $time === null ? '?' : round( $time * 1000 );
-               $s = 'API' . 
+               $s = 'API' .
                        ' ' . $request->getMethod() .
                        ' ' . wfUrlencode( str_replace( ' ', '_', $this->getUser()->getName() ) ) .
                        ' ' . $request->getIP() .
@@ -894,7 +902,22 @@ class ApiMain extends ApiBase {
         */
        public function getCheck( $name ) {
                $this->mParamsUsed[$name] = true;
-               return $this->getRequest()->getCheck( $name );          
+               return $this->getRequest()->getCheck( $name );
+       }
+
+       /**
+        * Report unused parameters, so the client gets a hint in case it gave us parameters we don't know,
+        * for example in case of spelling mistakes or a missing 'g' prefix for generators.
+        */
+       protected function reportUnusedParams() {
+               $paramsUsed = $this->getParamsUsed();
+               $allParams = $this->getRequest()->getValueNames();
+
+               $unusedParams = array_diff( $allParams, $paramsUsed );
+               if( count( $unusedParams ) ) {
+                       $s = count( $unusedParams ) > 1 ? 's' : '';
+                       $this->setWarning( "Unrecognized parameter$s: '" . implode( $unusedParams, "', '" ) . "'" );
+               }
        }
 
        /**
@@ -976,7 +999,7 @@ class ApiMain extends ApiBase {
                                'Maximum lag can be used when MediaWiki is installed on a database replicated cluster.',
                                'To save actions causing any more site replication lag, this parameter can make the client',
                                'wait until the replication lag is less than the specified value.',
-                               'In case of a replag error, a HTTP 503 error is returned, with the message like',
+                               'In case of a replag error, error code "maxlag" is returned, with the message like',
                                '"Waiting for $host: $lag seconds lagged\n".',
                                'See https://www.mediawiki.org/wiki/Manual:Maxlag_parameter for more information',
                        ),
index 5a78354..ef56274 100644 (file)
@@ -45,7 +45,7 @@ class ApiOpenSearch extends ApiBase {
                $namespaces = $params['namespace'];
                $suggest = $params['suggest'];
 
-               // MWSuggest or similar hit
+               // Some script that was loaded regardless of wgEnableOpenSearchSuggest, likely cached.
                if ( $suggest && !$wgEnableOpenSearchSuggest ) {
                        $searches = array();
                } else {
index 4398eb0..265c2cc 100644 (file)
@@ -47,7 +47,7 @@ class ApiOptions extends ApiBase {
                }
 
                $params = $this->extractRequestParams();
-               $changes = 0;
+               $changed = false;
 
                if ( isset( $params['optionvalue'] ) && !isset( $params['optionname'] ) ) {
                        $this->dieUsageMsg( array( 'missingparam', 'optionname' ) );
@@ -55,26 +55,43 @@ class ApiOptions extends ApiBase {
 
                if ( $params['reset'] ) {
                        $user->resetOptions();
-                       $changes++;
+                       $changed = true;
                }
+
+               $changes = array();
                if ( count( $params['change'] ) ) {
                        foreach ( $params['change'] as $entry ) {
                                $array = explode( '=', $entry, 2 );
-                               $user->setOption( $array[0], isset( $array[1] ) ? $array[1] : null );
-                               $changes++;
+                               $changes[$array[0]] = isset( $array[1] ) ? $array[1] : null;
                        }
                }
                if ( isset( $params['optionname'] ) ) {
                        $newValue = isset( $params['optionvalue'] ) ? $params['optionvalue'] : null;
-                       $user->setOption( $params['optionname'], $newValue );
-                       $changes++;
+                       $changes[$params['optionname']] = $newValue;
+               }
+               if ( !$changed && !count( $changes ) ) {
+                       $this->dieUsage( 'No changes were requested', 'nochanges' );
+               }
+
+               $prefs = Preferences::getPreferences( $user, $this->getContext() );
+               foreach ( $changes as $key => $value ) {
+                       if ( !isset( $prefs[$key] ) ) {
+                               $this->setWarning( "Not a valid preference: $key" );
+                               continue;
+                       }
+                       $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key] );
+                       $validation = $field->validate( $value, $user->getOptions() );
+                       if ( $validation === true ) {
+                               $user->setOption( $key, $value );
+                               $changed = true;
+                       } else {
+                               $this->setWarning( "Validation error for '$key': $validation" );
+                       }
                }
 
-               if ( $changes ) {
+               if ( $changed ) {
                        // Commit changes
                        $user->saveSettings();
-               } else {
-                       $this->dieUsage( 'No changes were requested', 'nochanges' );
                }
 
                $this->getResult()->addValue( null, $this->getModuleName(), 'success' );
index 2fcdc38..08764a5 100644 (file)
  * @ingroup API
  */
 class ApiParse extends ApiBase {
-       private $section, $text, $pstText = null;
+
+       /** @var String $section */
+       private $section = null;
+
+       /** @var Content $content */
+       private $content = null;
+
+       /** @var Content $pstContent */
+       private $pstContent = null;
 
        public function __construct( $main, $action ) {
                parent::__construct( $main, $action );
@@ -44,6 +52,9 @@ class ApiParse extends ApiBase {
                $pageid = $params['pageid'];
                $oldid = $params['oldid'];
 
+               $model = $params['contentmodel'];
+               $format = $params['contentformat'];
+
                if ( !is_null( $page ) && ( !is_null( $text ) || $title != 'API' ) ) {
                        $this->dieUsage( 'The page parameter cannot be used together with the text and title parameters', 'params' );
                }
@@ -61,7 +72,7 @@ class ApiParse extends ApiBase {
                // TODO: Does this still need $wgTitle?
                global $wgParser, $wgTitle;
 
-               // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang breaks
+               // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang
                $oldLang = null;
                if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
                        $oldLang = $this->getContext()->getLanguage(); // Backup language
@@ -93,17 +104,17 @@ class ApiParse extends ApiBase {
                                // If for some reason the "oldid" is actually the current revision, it may be cached
                                if ( $rev->isCurrent() )  {
                                        // May get from/save to parser cache
-                                       $p_result = $this->getParsedSectionOrText( $pageObj, $popts, $pageid,
-                                                isset( $prop['wikitext'] ) ) ;
+                                       $p_result = $this->getParsedContent( $pageObj, $popts,
+                                               $pageid, isset( $prop['wikitext'] ) ) ;
                                } else { // This is an old revision, so get the text differently
-                                       $this->text = $rev->getText( Revision::FOR_THIS_USER, $this->getUser() );
+                                       $this->content = $rev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
 
                                        if ( $this->section !== false ) {
-                                               $this->text = $this->getSectionText( $this->text, 'r' . $rev->getId() );
+                                               $this->content = $this->getSectionContent( $this->content, 'r' . $rev->getId() );
                                        }
 
                                        // Should we save old revision parses to the parser cache?
-                                       $p_result = $wgParser->parse( $this->text, $titleObj, $popts );
+                                       $p_result = $this->content->getParserOutput( $titleObj, $rev->getId(), $popts );
                                }
                        } else { // Not $oldid, but $pageid or $page
                                if ( $params['redirects'] ) {
@@ -136,6 +147,9 @@ class ApiParse extends ApiBase {
 
                                $pageObj = $this->getTitleOrPageId( $pageParams, 'fromdb' );
                                $titleObj = $pageObj->getTitle();
+                               if ( !$titleObj || !$titleObj->exists() ) {
+                                       $this->dieUsage( "The page you specified doesn't exist", 'missingtitle' );
+                               }
                                $wgTitle = $titleObj;
 
                                if ( isset( $prop['revid'] ) ) {
@@ -146,46 +160,59 @@ class ApiParse extends ApiBase {
                                $popts->enableLimitReport( !$params['disablepp'] );
 
                                // Potentially cached
-                               $p_result = $this->getParsedSectionOrText( $pageObj, $popts, $pageid,
-                                        isset( $prop['wikitext'] ) ) ;
+                               $p_result = $this->getParsedContent( $pageObj, $popts, $pageid,
+                                       isset( $prop['wikitext'] ) ) ;
                        }
                } else { // Not $oldid, $pageid, $page. Hence based on $text
-
-                       if ( is_null( $text ) ) {
-                               $this->dieUsage( 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?', 'params' );
-                       }
-                       $this->text = $text;
                        $titleObj = Title::newFromText( $title );
                        if ( !$titleObj ) {
                                $this->dieUsageMsg( array( 'invalidtitle', $title ) );
                        }
+                       if ( !$titleObj->canExist() ) {
+                               $this->dieUsage( "Namespace doesn't allow actual pages", 'pagecannotexist' );
+                       }
                        $wgTitle = $titleObj;
                        $pageObj = WikiPage::factory( $titleObj );
 
                        $popts = $pageObj->makeParserOptions( $this->getContext() );
                        $popts->enableLimitReport( !$params['disablepp'] );
 
+                       if ( is_null( $text ) ) {
+                               $this->dieUsage( 'The text parameter should be passed with the title parameter. Should you be using the "page" parameter instead?', 'params' );
+                       }
+
+                       try {
+                               $this->content = ContentHandler::makeContent( $text, $titleObj, $model, $format );
+                       } catch ( MWContentSerializationException $ex ) {
+                               $this->dieUsage( $ex->getMessage(), 'parseerror' );
+                       }
+
                        if ( $this->section !== false ) {
-                               $this->text = $this->getSectionText( $this->text, $titleObj->getText() );
+                               $this->content = $this->getSectionContent( $this->content, $titleObj->getText() );
                        }
 
                        if ( $params['pst'] || $params['onlypst'] ) {
-                               $this->pstText = $wgParser->preSaveTransform( $this->text, $titleObj, $this->getUser(), $popts );
+                               $this->pstContent = $this->content->preSaveTransform( $titleObj, $this->getUser(), $popts );
                        }
                        if ( $params['onlypst'] ) {
                                // Build a result and bail out
                                $result_array = array();
                                $result_array['text'] = array();
-                               $result->setContent( $result_array['text'], $this->pstText );
+                               $result->setContent( $result_array['text'], $this->pstContent->serialize( $format ) );
                                if ( isset( $prop['wikitext'] ) ) {
                                        $result_array['wikitext'] = array();
-                                       $result->setContent( $result_array['wikitext'], $this->text );
+                                       $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
                                }
                                $result->addValue( null, $this->getModuleName(), $result_array );
                                return;
                        }
+
                        // Not cached (save or load)
-                       $p_result = $wgParser->parse( $params['pst'] ? $this->pstText : $this->text, $titleObj, $popts );
+                       if ( $params['pst'] ) {
+                               $p_result = $this->pstContent->getParserOutput( $titleObj, null, $popts );
+                       } else {
+                               $p_result = $this->content->getParserOutput( $titleObj, null, $popts );
+                       }
                }
 
                $result_array = array();
@@ -275,10 +302,10 @@ class ApiParse extends ApiBase {
 
                if ( isset( $prop['wikitext'] ) ) {
                        $result_array['wikitext'] = array();
-                       $result->setContent( $result_array['wikitext'], $this->text );
-                       if ( !is_null( $this->pstText ) ) {
+                       $result->setContent( $result_array['wikitext'], $this->content->serialize( $format ) );
+                       if ( !is_null( $this->pstContent ) ) {
                                $result_array['psttext'] = array();
-                               $result->setContent( $result_array['psttext'], $this->pstText );
+                               $result->setContent( $result_array['psttext'], $this->pstContent->serialize( $format ) );
                        }
                }
                if ( isset( $prop['properties'] ) ) {
@@ -286,8 +313,12 @@ class ApiParse extends ApiBase {
                }
 
                if ( $params['generatexml'] ) {
+                       if ( $this->content->getModel() != CONTENT_MODEL_WIKITEXT ) {
+                               $this->dieUsage( "generatexml is only supported for wikitext content", "notwikitext" );
+                       }
+
                        $wgParser->startExternalParse( $titleObj, $popts, OT_PREPROCESS );
-                       $dom = $wgParser->preprocessToDom( $this->text );
+                       $dom = $wgParser->preprocessToDom( $this->content->getNativeData() );
                        if ( is_callable( array( $dom, 'saveXML' ) ) ) {
                                $xml = $dom->saveXML();
                        } else {
@@ -325,15 +356,16 @@ class ApiParse extends ApiBase {
         * @param $getWikitext Bool
         * @return ParserOutput
         */
-       private function getParsedSectionOrText( $page, $popts, $pageId = null, $getWikitext = false ) {
-               global $wgParser;
+       private function getParsedContent( WikiPage $page, $popts, $pageId = null, $getWikitext = false ) {
+               $this->content = $page->getContent( Revision::RAW ); //XXX: really raw?
 
-               if ( $this->section !== false ) {
-                       $this->text = $this->getSectionText( $page->getRawText(), !is_null( $pageId )
-                                       ? 'page id ' . $pageId : $page->getTitle()->getPrefixedText() );
+               if ( $this->section !== false && $this->content !== null ) {
+                       $this->content = $this->getSectionContent(
+                               $this->content,
+                               !is_null( $pageId ) ? 'page id ' . $pageId : $page->getTitle()->getText() );
 
                        // Not cached (save or load)
-                       return $wgParser->parse( $this->text, $page->getTitle(), $popts );
+                       return $this->content->getParserOutput( $page->getTitle(), null, $popts );
                } else {
                        // Try the parser cache first
                        // getParserOutput will save to Parser cache if able
@@ -342,20 +374,23 @@ class ApiParse extends ApiBase {
                                $this->dieUsage( "There is no revision ID {$page->getLatest()}", 'missingrev' );
                        }
                        if ( $getWikitext ) {
-                               $this->text = $page->getRawText();
+                               $this->content = $page->getContent( Revision::RAW );
                        }
                        return $pout;
                }
        }
 
-       private function getSectionText( $text, $what ) {
-               global $wgParser;
+       private function getSectionContent( Content $content, $what ) {
                // Not cached (save or load)
-               $text = $wgParser->getSection( $text, $this->section, false );
-               if ( $text === false ) {
+               $section = $content->getSection( $this->section );
+               if ( $section === false ) {
                        $this->dieUsage( "There is no section {$this->section} in " . $what, 'nosuchsection' );
                }
-               return $text;
+               if ( $section === null ) {
+                       $this->dieUsage( "Sections are not supported by " . $what, 'nosuchsection' );
+                       $section = false;
+               }
+               return $section;
        }
 
        private function formatLangLinks( $links ) {
@@ -548,6 +583,12 @@ class ApiParse extends ApiBase {
                        'section' => null,
                        'disablepp' => false,
                        'generatexml' => false,
+                       'contentformat' => array(
+                               ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
+                       ),
+                       'contentmodel' => array(
+                               ApiBase::PARAM_TYPE => ContentHandler::getContentModels(),
+                       )
                );
        }
 
@@ -592,7 +633,9 @@ 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',
+                       'generatexml' => 'Generate XML parse tree (requires prop=wikitext)',
+                       'contentformat' => 'Content serialization format used for the input text',
+                       'contentmodel' => 'Content model of the new content',
                );
        }
 
@@ -613,6 +656,9 @@ class ApiParse extends ApiBase {
                        array( 'code' => 'nosuchsection', 'info' => 'There is no section sectionnumber in page' ),
                        array( 'nosuchpageid' ),
                        array( 'invalidtitle', 'title' ),
+                       array( 'code' => 'parseerror', 'info' => 'Failed to parse the given text.' ),
+                       array( 'code' => 'notwikitext', 'info' => 'The requested operation is only supported on wikitext content.' ),
+                       array( 'code' => 'pagecannotexist', 'info' => "Namespace doesn't allow actual pages" ),
                ) );
        }
 
index 9fedaf1..dbfa89c 100644 (file)
@@ -86,14 +86,16 @@ class ApiPurge extends ApiBase {
 
                        if( $forceLinkUpdate ) {
                                if ( !$user->pingLimiter() ) {
-                                       global $wgParser, $wgEnableParserCache;
+                                       global $wgEnableParserCache;
 
                                        $popts = $page->makeParserOptions( 'canonical' );
-                                       $p_result = $wgParser->parse( $page->getRawText(), $title, $popts,
-                                               true, true, $page->getLatest() );
+
+                                       # Parse content; note that HTML generation is only needed if we want to cache the result.
+                                       $content = $page->getContent( Revision::RAW );
+                                       $p_result = $content->getParserOutput( $title, $page->getLatest(), $popts, $wgEnableParserCache );
 
                                        # Update the links tables
-                                       $updates = $p_result->getSecondaryDataUpdates( $title );
+                                       $updates = $content->getSecondaryDataUpdates( $title, null, true, $p_result );
                                        DataUpdate::runUpdates( $updates );
 
                                        $r['linkupdate'] = '';
index 64399b2..d24745c 100644 (file)
@@ -46,6 +46,10 @@ class ApiQuery extends ApiBase {
 
        private $params, $redirects, $convertTitles, $iwUrl;
 
+       /**
+        * List of Api Query prop modules
+        * @var array
+        */
        private $mQueryPropModules = array(
                'categories' => 'ApiQueryCategories',
                'categoryinfo' => 'ApiQueryCategoryInfo',
@@ -63,6 +67,10 @@ class ApiQuery extends ApiBase {
                'templates' => 'ApiQueryLinks',
        );
 
+       /**
+        * List of Api Query list modules
+        * @var array
+        */
        private $mQueryListModules = array(
                'allcategories' => 'ApiQueryAllCategories',
                'allimages' => 'ApiQueryAllImages',
@@ -92,16 +100,52 @@ class ApiQuery extends ApiBase {
                'watchlistraw' => 'ApiQueryWatchlistRaw',
        );
 
+       /**
+        * List of Api Query meta modules
+        * @var array
+        */
        private $mQueryMetaModules = array(
                'allmessages' => 'ApiQueryAllMessages',
                'siteinfo' => 'ApiQuerySiteinfo',
                'userinfo' => 'ApiQueryUserInfo',
        );
 
+       /**
+        * List of Api Query generator modules
+        * Defined in code, rather than being derived at runtime,
+        * due to performance reasons
+        * @var array
+        */
+       private $mQueryGenerators = array(
+               'allcategories' => 'ApiQueryAllCategories',
+               'allimages' => 'ApiQueryAllImages',
+               'alllinks' => 'ApiQueryAllLinks',
+               'allpages' => 'ApiQueryAllPages',
+               'backlinks' => 'ApiQueryBacklinks',
+               'categories' => 'ApiQueryCategories',
+               'categorymembers' => 'ApiQueryCategoryMembers',
+               'duplicatefiles' => 'ApiQueryDuplicateFiles',
+               'embeddedin' => 'ApiQueryBacklinks',
+               'exturlusage' => 'ApiQueryExtLinksUsage',
+               'images' => 'ApiQueryImages',
+               'imageusage' => 'ApiQueryBacklinks',
+               'iwbacklinks' => 'ApiQueryIWBacklinks',
+               'langbacklinks' => 'ApiQueryLangBacklinks',
+               'links' => 'ApiQueryLinks',
+               'protectedtitles' => 'ApiQueryProtectedTitles',
+               'querypage' => 'ApiQueryQueryPage',
+               'random' => 'ApiQueryRandom',
+               'recentchanges' => 'ApiQueryRecentChanges',
+               'search' => 'ApiQuerySearch',
+               'templates' => 'ApiQueryLinks',
+               'watchlist' => 'ApiQueryWatchlist',
+               'watchlistraw' => 'ApiQueryWatchlistRaw',
+       );
+
        private $mSlaveDB = null;
        private $mNamedDB = array();
 
-       protected $mAllowedGenerators = array();
+       protected $mAllowedGenerators;
 
        /**
         * @param $main ApiMain
@@ -111,32 +155,16 @@ class ApiQuery extends ApiBase {
                parent::__construct( $main, $action );
 
                // Allow custom modules to be added in LocalSettings.php
-               global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules,
-                       $wgMemc, $wgAPICacheHelpTimeout;
+               global $wgAPIPropModules, $wgAPIListModules, $wgAPIMetaModules, $wgAPIGeneratorModules;
                self::appendUserModules( $this->mQueryPropModules, $wgAPIPropModules );
                self::appendUserModules( $this->mQueryListModules, $wgAPIListModules );
                self::appendUserModules( $this->mQueryMetaModules, $wgAPIMetaModules );
+               self::appendUserModules( $this->mQueryGenerators, $wgAPIGeneratorModules );
 
                $this->mPropModuleNames = array_keys( $this->mQueryPropModules );
                $this->mListModuleNames = array_keys( $this->mQueryListModules );
                $this->mMetaModuleNames = array_keys( $this->mQueryMetaModules );
-
-               // Get array of query generators from cache if present
-               $key = wfMemcKey( 'apiquerygenerators', SpecialVersion::getVersion( 'nodb' ) );
-
-               if ( $wgAPICacheHelpTimeout > 0 ) {
-                       $cached = $wgMemc->get( $key );
-                       if ( $cached ) {
-                               $this->mAllowedGenerators = $cached;
-                               return;
-                       }
-               }
-               $this->makeGeneratorList( $this->mQueryPropModules );
-               $this->makeGeneratorList( $this->mQueryListModules );
-
-               if ( $wgAPICacheHelpTimeout > 0 ) {
-                       $wgMemc->set( $key, $this->mAllowedGenerators, $wgAPICacheHelpTimeout );
-               }
+               $this->mAllowedGenerators = array_keys( $this->mQueryGenerators );
        }
 
        /**
@@ -196,10 +224,18 @@ class ApiQuery extends ApiBase {
         * Get the array mapping module names to class names
         * @return array array(modulename => classname)
         */
-       function getModules() {
+       public function getModules() {
                return array_merge( $this->mQueryPropModules, $this->mQueryListModules, $this->mQueryMetaModules );
        }
 
+       /**
+        * Get the generators array mapping module names to class names
+        * @return array array(modulename => classname)
+        */
+       public function getGenerators() {
+               return $this->mQueryGenerators;
+       }
+
        /**
         * Get whether the specified module is a prop, list or a meta query module
         * @param $moduleName string Name of the module to find type for
@@ -509,7 +545,7 @@ class ApiQuery extends ApiBase {
         * @param  $pageSet ApiPageSet Pages to be exported
         * @param  $result ApiResult Result to output to
         */
-       private function doExport( $pageSet, $result )  {
+       private function doExport( $pageSet, $result ) {
                $exportTitles = array();
                $titles = $pageSet->getGoodTitles();
                if ( count( $titles ) ) {
@@ -680,19 +716,6 @@ 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
index 4f4c77f..c2beaec 100644 (file)
@@ -81,7 +81,6 @@ class ApiQueryAllCategories extends ApiQueryGeneratorBase {
                } else {
                        $this->addWhereRange( 'cat_pages', 'older', $max, $min);
                }
-    
 
                if ( isset( $params['prefix'] ) ) {
                        $this->addWhere( 'cat_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
index 45cc404..e6a0194 100644 (file)
@@ -81,30 +81,90 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        $this->dieUsage( 'Local file repository does not support querying all images', 'unsupportedrepo' );
                }
 
+               $prefix = $this->getModulePrefix();
+
                $db = $this->getDB();
 
                $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" );
+               // Table and return fields
+               $this->addTables( 'image' );
+
+               $prop = array_flip( $params['prop'] );
+               $this->addFields( LocalFile::selectFields() );
+
+               $ascendingOrder = true;
+               if ( $params['dir'] == 'descending' || $params['dir'] == 'older') {
+                       $ascendingOrder = false;
                }
 
-               // Image filters
-               $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'] ) );
-               $this->addWhereRange( 'img_name', $dir, $from, $to );
+               if ( $params['sort'] == 'name' ) {
+                       // Check mutually exclusive params
+                       $disallowed = array( 'start', 'end', 'user' );
+                       foreach ( $disallowed as $pname ) {
+                               if ( isset( $params[$pname] ) ) {
+                                       $this->dieUsage( "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=timestamp", 'badparams' );
+                               }
+                       }
+                       if ( $params['filterbots'] != 'all' ) {
+                                       $this->dieUsage( "Parameter '{$prefix}filterbots' can only be used with {$prefix}sort=timestamp", 'badparams' );
+                       }
+
+                       // Pagination
+                       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 = ( $ascendingOrder ? '>' : '<' );
+                               $continueFrom = $db->addQuotes( $cont[0] );
+                               $this->addWhere( "img_name $op= $continueFrom" );
+                       }
+
+                       // Image filters
+                       $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) );
+                       $to = ( is_null( $params['to'] ) ? null : $this->titlePartToKey( $params['to'] ) );
+                       $this->addWhereRange( 'img_name', ( $ascendingOrder ? 'newer' : 'older' ), $from, $to );
+
+                       if ( isset( $params['prefix'] ) ) {
+                               $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                       }
+               } else {
+                       // Check mutually exclusive params
+                       $disallowed = array( 'from', 'to', 'prefix' );
+                       foreach ( $disallowed as $pname ) {
+                               if ( isset( $params[$pname] ) ) {
+                                       $this->dieUsage( "Parameter '{$prefix}{$pname}' can only be used with {$prefix}sort=name", 'badparams' );
+                               }
+                       }
+                       if ( !is_null( $params['user'] ) && $params['filterbots'] != 'all' ) {
+                               // Since filterbots checks if each user has the bot right, it doesn't make sense to use it with user
+                               $this->dieUsage( "Parameters '{$prefix}user' and '{$prefix}filterbots' cannot be used together", 'badparams' );
+                       }
+
+                       // Pagination
+                       $this->addTimestampWhereRange( 'img_timestamp', ( $ascendingOrder ? 'newer' : 'older' ), $params['start'], $params['end'] );
 
-               if ( isset( $params['prefix'] ) )
-                       $this->addWhere( 'img_name' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) );
+                       // Image filters
+                       if ( !is_null( $params['user'] ) ) {
+                               $this->addWhereFld( 'img_user_text', $params['user'] );
+                       }
+                       if ( $params['filterbots'] != 'all' ) {
+                               $this->addTables( 'user_groups' );
+                               $this->addJoinConds( array( 'user_groups' => array(
+                                       'LEFT JOIN',
+                                       array(
+                                               'ug_group' => User::getGroupsWithPermission( 'bot' ),
+                                               'ug_user = img_user'
+                                       )
+                               ) ) );
+                               $groupCond = ( $params['filterbots'] == 'nobots' ? 'NULL': 'NOT NULL' );
+                               $this->addWhere( "ug_group IS $groupCond" );
+                       }
+               }
 
+               // Filters not depending on sort
                if ( isset( $params['minsize'] ) ) {
                        $this->addWhere( 'img_size>=' . intval( $params['minsize'] ) );
                }
@@ -141,15 +201,22 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        $this->addWhereFld( 'img_minor_mime', $minor );
                }
 
-               $this->addTables( 'image' );
-
-               $prop = array_flip( $params['prop'] );
-               $this->addFields( LocalFile::selectFields() );
-
                $limit = $params['limit'];
                $this->addOption( 'LIMIT', $limit + 1 );
-               $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' );
-               $this->addOption( 'ORDER BY', 'img_name' . $sort );
+               $sortFlag = '';
+               if ( !$ascendingOrder ) {
+                       $sortFlag = ' DESC';
+               }
+               if ( $params['sort'] == 'timestamp' ) {
+                       $this->addOption( 'ORDER BY', 'img_timestamp' . $sortFlag );
+                       if ( !is_null( $params['user'] ) ) {
+                               $this->addOption( 'USE INDEX', array( 'image' => 'img_usertext_timestamp' ) );
+                       } else {
+                               $this->addOption( 'USE INDEX', array( 'image' => 'img_timestamp' ) );
+                       }
+               } else {
+                       $this->addOption( 'ORDER BY', 'img_name' . $sortFlag );
+               }
 
                $res = $this->select( __METHOD__ );
 
@@ -159,7 +226,11 @@ 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...
-                               $this->setContinueEnumParameter( 'continue', $row->img_name );
+                               if ( $params['sort'] == 'name' ) {
+                                       $this->setContinueEnumParameter( 'continue', $row->img_name );
+                               } else {
+                                       $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->img_timestamp ) );
+                               }
                                break;
                        }
 
@@ -171,7 +242,11 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $info );
                                if ( !$fit ) {
-                                       $this->setContinueEnumParameter( 'continue', $row->img_name );
+                                       if ( $params['sort'] == 'name' ) {
+                                               $this->setContinueEnumParameter( 'continue', $row->img_name );
+                                       } else {
+                                               $this->setContinueEnumParameter( 'start', wfTimestamp( TS_ISO_8601, $row->img_timestamp ) );
+                                       }
                                        break;
                                }
                        } else {
@@ -188,9 +263,38 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
 
        public function getAllowedParams() {
                return array (
+                       'sort' => array(
+                               ApiBase::PARAM_DFLT => 'name',
+                               ApiBase::PARAM_TYPE => array(
+                                       'name',
+                                       'timestamp'
+                               )
+                       ),
+                       'dir' => array(
+                               ApiBase::PARAM_DFLT => 'ascending',
+                               ApiBase::PARAM_TYPE => array(
+                                       // sort=name
+                                       'ascending',
+                                       'descending',
+                                       // sort=timestamp
+                                       'newer',
+                                       'older'
+                               )
+                       ),
                        'from' => null,
-                       'continue' => null,
                        'to' => null,
+                       'continue' => null,
+                       'start' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp'
+                       ),
+                       'end' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp'
+                       ),
+                       'prop' => array(
+                               ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
+                               ApiBase::PARAM_DFLT => 'timestamp|url',
+                               ApiBase::PARAM_ISMULTI => true
+                       ),
                        'prefix' => null,
                        'minsize' => array(
                                ApiBase::PARAM_TYPE => 'integer',
@@ -198,6 +302,20 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                        'maxsize' => array(
                                ApiBase::PARAM_TYPE => 'integer',
                        ),
+                       'sha1' => null,
+                       'sha1base36' => null,
+                       'user' => array(
+                               ApiBase::PARAM_TYPE => 'user'
+                       ),
+                       'filterbots' => array(
+                               ApiBase::PARAM_DFLT => 'all',
+                               ApiBase::PARAM_TYPE => array(
+                                       'all',
+                                       'bots',
+                                       'nobots'
+                               )
+                       ),
+                       'mime' => null,
                        'limit' => array(
                                ApiBase::PARAM_DFLT => 10,
                                ApiBase::PARAM_TYPE => 'limit',
@@ -205,38 +323,29 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
                                ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
                        ),
-                       'dir' => array(
-                               ApiBase::PARAM_DFLT => 'ascending',
-                               ApiBase::PARAM_TYPE => array(
-                                       'ascending',
-                                       'descending'
-                               )
-                       ),
-                       'sha1' => null,
-                       'sha1base36' => null,
-                       'prop' => array(
-                               ApiBase::PARAM_TYPE => ApiQueryImageInfo::getPropertyNames( $this->propertyFilter ),
-                               ApiBase::PARAM_DFLT => 'timestamp|url',
-                               ApiBase::PARAM_ISMULTI => true
-                       ),
-                       'mime' => null,
                );
        }
 
        public function getParamDescription() {
+               $p = $this->getModulePrefix();
                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',
+                       'sort' => 'Property to sort by',
                        'dir' => 'The direction in which to list',
+                       'from' => "The image title to start enumerating from. Can only be used with {$p}sort=name",
+                       'to' => "The image title to stop enumerating at. Can only be used with {$p}sort=name",
+                       'continue' => 'When more results are available, use this to continue',
+                       'start' => "The timestamp to start enumerating from. Can only be used with {$p}sort=timestamp",
+                       'end' => "The timestamp to end enumerating. Can only be used with {$p}sort=timestamp",
+                       'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
+                       'prefix' => "Search for all image titles that begin with this value. Can only be used with {$p}sort=name",
                        'minsize' => 'Limit to images with at least this many bytes',
                        'maxsize' => 'Limit to images with at most this many bytes',
-                       'limit' => 'How many images in total to return',
-                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
+                       'sha1' => "SHA1 hash of image. Overrides {$p}sha1base36",
                        'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
-                       'prop' => ApiQueryImageInfo::getPropertyDescriptions( $this->propertyFilter ),
+                       'user' => "Only return files uploaded by this user. Can only be used with {$p}sort=timestamp. Cannot be used together with {$p}filterbots",
+                       'filterbots' => "How to filter files uploaded by bots. Can only be used with {$p}sort=timestamp. Cannot be used together with {$p}user",
                        'mime' => 'What MIME type to search for. e.g. image/jpeg. Disabled in Miser Mode',
+                       'limit' => 'How many images in total to return',
                );
        }
 
@@ -260,8 +369,17 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
        }
 
        public function getPossibleErrors() {
+               $p = $this->getModulePrefix();
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'code' => 'params', 'info' => 'Use "gaifilterredir=nonredirects" option instead of "redirects" when using allimages as a generator' ),
+                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}start' can only be used with {$p}sort=timestamp" ),
+                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}end' can only be used with {$p}sort=timestamp" ),
+                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}user' can only be used with {$p}sort=timestamp" ),
+                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}filterbots' can only be used with {$p}sort=timestamp" ),
+                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}from' can only be used with {$p}sort=name" ),
+                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}to' can only be used with {$p}sort=name" ),
+                       array( 'code' => 'badparams', 'info' => "Parameter'{$p}prefix' can only be used with {$p}sort=name" ),
+                       array( 'code' => 'badparams', 'info' => "Parameters '{$p}user' and '{$p}filterbots' cannot be used together" ),
                        array( 'code' => 'unsupportedrepo', 'info' => 'Local file repository does not support querying all images' ),
                        array( 'code' => 'mimesearchdisabled', 'info' => 'MIME search disabled in Miser Mode' ),
                        array( 'code' => 'invalidsha1hash', 'info' => 'The SHA1 hash provided is not valid' ),
@@ -274,11 +392,15 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
                return array(
                        'api.php?action=query&list=allimages&aifrom=B' => array(
                                'Simple Use',
-                               'Show a list of images starting at the letter "B"',
+                               'Show a list of files starting at the letter "B"',
+                       ),
+                       'api.php?action=query&list=allimages&aiprop=user|timestamp|url&aisort=timestamp&aidir=older' => array(
+                               'Simple Use',
+                               'Show a list of recently uploaded files similar to Special:NewFiles',
                        ),
                        'api.php?action=query&generator=allimages&gailimit=4&gaifrom=T&prop=imageinfo' => array(
                                'Using as Generator',
-                               'Show info about 4 images starting at the letter "T"',
+                               'Show info about 4 files starting at the letter "T"',
                        ),
                );
        }
index 7f50cba..79f6469 100644 (file)
@@ -81,12 +81,18 @@ class ApiQueryAllUsers extends ApiQueryBase {
                                $db->buildLike( $this->getCanonicalUserName( $params['prefix'] ), $db->anyString() ) );
                }
 
-               if ( !is_null( $params['rights'] ) ) {
+               if ( !is_null( $params['rights'] ) && count( $params['rights'] ) ) {
                        $groups = array();
                        foreach( $params['rights'] as $r ) {
                                $groups = array_merge( $groups, User::getGroupsWithPermission( $r ) );
                        }
 
+                       // no group with the given right(s) exists, no need for a query
+                       if( !count( $groups ) ) {
+                               $this->getResult()->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), '' );
+                               return;
+                       }
+
                        $groups = array_unique( $groups );
 
                        if ( is_null( $params['group'] ) ) {
index 2c48aca..5f4d9f9 100644 (file)
@@ -534,7 +534,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return bool
         */
        public function validateSha1Hash( $hash ) {
-               return preg_match( '/[a-fA-F0-9]{40}/', $hash );
+               return preg_match( '/^[a-f0-9]{40}$/', $hash );
        }
 
        /**
@@ -542,7 +542,7 @@ abstract class ApiQueryBase extends ApiBase {
         * @return bool
         */
        public function validateSha1Base36Hash( $hash ) {
-               return preg_match( '/[a-zA-Z0-9]{31}/', $hash );
+               return preg_match( '/^[a-z0-9]{31}$/', $hash );
        }
 
        /**
index 96b8696..7cc1755 100644 (file)
@@ -182,8 +182,8 @@ class ApiQueryBlocks extends ApiQueryBase {
                                $block['reason'] = $row->ipb_reason;
                        }
                        if ( $fld_range && !$row->ipb_auto ) {
-                               $block['rangestart'] = IP::hexToQuad( $row->ipb_range_start );
-                               $block['rangeend'] = IP::hexToQuad( $row->ipb_range_end );
+                               $block['rangestart'] = IP::formatHex( $row->ipb_range_start );
+                               $block['rangeend'] = IP::formatHex( $row->ipb_range_end );
                        }
                        if ( $fld_flags ) {
                                // For clarity, these flags use the same names as their action=block counterparts
@@ -301,7 +301,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                        'dir' => $this->getDirectionDescription( $p ),
                        'ids' => 'List of block IDs to list (optional)',
                        'users' => 'List of users to search for (optional)',
-                       'ip' => array(  'Get all blocks applying to this IP or CIDR range, including range blocks.',
+                       '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',
                        'prop' => array(
index 42b398b..6081601 100644 (file)
@@ -121,8 +121,12 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                                        ApiQueryBase::addTitleInfo( $vals, $title );
                                }
                                if ( $fld_url ) {
-                                       // We *could* run this through wfExpandUrl() but I think it's better to output the link verbatim, even if it's protocol-relative --Roan
-                                       $vals['url'] = $row->el_to;
+                                       $to = $row->el_to;
+                                       // expand protocol-relative urls
+                                       if( $params['expandurl'] ) {
+                                               $to = wfExpandUrl( $to, PROTO_CANONICAL );
+                                       }
+                                       $vals['url'] = $to;
                                }
                                $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals );
                                if ( !$fit ) {
@@ -169,7 +173,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                                ApiBase::PARAM_MIN => 1,
                                ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
                                ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
-                       )
+                       ),
+                       'expandurl' => false,
                );
        }
 
@@ -218,7 +223,8 @@ class ApiQueryExtLinksUsage extends ApiQueryGeneratorBase {
                        ),
                        'query' => 'Search string without protocol. See [[Special:LinkSearch]]. Leave empty to list all external links',
                        'namespace' => 'The page namespace(s) to enumerate.',
-                       'limit' => 'How many pages to return.'
+                       'limit' => 'How many pages to return.',
+                       'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
                );
 
                if ( $wgMiserMode ) {
index 9365a9b..1449a96 100644 (file)
@@ -86,8 +86,12 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                                break;
                        }
                        $entry = array();
-                       // We *could* run this through wfExpandUrl() but I think it's better to output the link verbatim, even if it's protocol-relative --Roan
-                       ApiResult::setContent( $entry, $row->el_to );
+                       $to = $row->el_to;
+                       // expand protocol-relative urls
+                       if( $params['expandurl'] ) {
+                               $to = wfExpandUrl( $to, PROTO_CANONICAL );
+                       }
+                       ApiResult::setContent( $entry, $to );
                        $fit = $this->addPageSubItem( $row->el_from, $entry );
                        if ( !$fit ) {
                                $this->setContinueEnumParameter( 'offset', $offset + $count - 1 );
@@ -117,6 +121,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                                ApiBase::PARAM_DFLT => '',
                        ),
                        'query' => null,
+                       'expandurl' => false,
                );
        }
 
@@ -130,6 +135,7 @@ class ApiQueryExternalLinks extends ApiQueryBase {
                                "Leave both this and {$p}query empty to list all external links"
                        ),
                        'query' => 'Search string without protocol. Useful for checking whether a certain page contains a certain external url',
+                       'expandurl' => 'Expand protocol-relative urls with the canonical protocol',
                );
        }
 
index a5486ef..dbca1d9 100644 (file)
@@ -64,7 +64,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $this->addTables( 'filearchive' );
 
                $this->addFields( array( 'fa_name', 'fa_deleted' ) );
-               $this->addFieldsIf( 'fa_storage_key', $fld_sha1 );
+               $this->addFieldsIf( 'fa_sha1', $fld_sha1 );
                $this->addFieldsIf( 'fa_timestamp', $fld_timestamp );
                $this->addFieldsIf( array( 'fa_user', 'fa_user_text' ), $fld_user );
                $this->addFieldsIf( array( 'fa_height', 'fa_width', 'fa_size' ), $fld_dimensions || $fld_size );
@@ -101,11 +101,6 @@ class ApiQueryFilearchive extends ApiQueryBase {
                $sha1Set = isset( $params['sha1'] );
                $sha1base36Set = isset( $params['sha1base36'] );
                if ( $sha1Set || $sha1base36Set ) {
-                       global $wgMiserMode;
-                       if ( $wgMiserMode  ) {
-                               $this->dieUsage( 'Search by hash disabled in Miser Mode', 'hashsearchdisabled' );
-                       }
-
                        $sha1 = false;
                        if ( $sha1Set ) {
                                if ( !$this->validateSha1Hash( $params['sha1'] ) ) {
@@ -119,7 +114,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                                $sha1 = $params['sha1base36'];
                        }
                        if ( $sha1 ) {
-                               $this->addWhere( 'fa_storage_key ' . $db->buildLike( "{$sha1}.", $db->anyString() ) );
+                               $this->addWhereFld( 'fa_sha1', $sha1 );
                        }
                }
 
@@ -155,7 +150,7 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        self::addTitleInfo( $file, $title );
 
                        if ( $fld_sha1 ) {
-                               $file['sha1'] = wfBaseConvert( LocalRepo::getHashFromKey( $row->fa_storage_key ), 36, 16, 40 );
+                               $file['sha1'] = wfBaseConvert( $row->fa_sha1, 36, 16, 40 );
                        }
                        if ( $fld_timestamp ) {
                                $file['timestamp'] = wfTimestamp( TS_ISO_8601, $row->fa_timestamp );
@@ -276,8 +271,8 @@ class ApiQueryFilearchive extends ApiQueryBase {
                        'prefix' => 'Search for all image titles that begin with this value',
                        'dir' => 'The direction in which to list',
                        'limit' => 'How many images to return in total',
-                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36. Disabled in Miser Mode",
-                       'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki). Disabled in Miser Mode',
+                       'sha1' => "SHA1 hash of image. Overrides {$this->getModulePrefix()}sha1base36",
+                       'sha1base36' => 'SHA1 hash of image in base 36 (used in MediaWiki)',
                        'prop' => array(
                                'What image information to get:',
                                ' sha1              - Adds SHA-1 hash for the image',
index ee55fb5..1933c78 100644 (file)
@@ -172,7 +172,7 @@ class ApiQueryImageInfo extends ApiQueryBase {
 
                        $data = $this->getResultData();
                        foreach ( $data['query']['pages'] as $pageid => $arr ) {
-                               if ( !isset( $arr['imagerepository'] ) ) {
+                               if ( is_array( $arr ) && !isset( $arr['imagerepository'] ) ) {
                                        $result->addValue(
                                                array( 'query', 'pages', $pageid ),
                                                'imagerepository', ''
@@ -580,6 +580,15 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        ApiBase::PROP_NULLABLE => true
                                )
                        ),
+                       'dimensions' => array(
+                               'size' => 'integer',
+                               'width' => 'integer',
+                               'height' => 'integer',
+                               'pagecount' => array(
+                                       ApiBase::PROP_TYPE => 'integer',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
                        'comment' => array(
                                'commenthidden' => 'boolean',
                                'comment' => array(
@@ -635,6 +644,13 @@ class ApiQueryImageInfo extends ApiQueryBase {
                                        ApiBase::PROP_NULLABLE => true
                                )
                        ),
+                       'thumbmime' => array(
+                               'filehidden' => 'boolean',
+                               'thumbmime' => array(
+                                       ApiBase::PROP_TYPE => 'string',
+                                       ApiBase::PROP_NULLABLE => true
+                               )
+                       ),
                        'mediatype' => array(
                                'filehidden' => 'boolean',
                                'mediatype' => array(
index b617ed0..e5cea96 100644 (file)
@@ -394,7 +394,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        }
                }
 
-               if ( $this->fld_talkid && isset( $this->talkids[$ns][$dbkey] ) )        {
+               if ( $this->fld_talkid && isset( $this->talkids[$ns][$dbkey] ) ) {
                        $pageInfo['talkid'] = $this->talkids[$ns][$dbkey];
                }
 
index 5d85c22..e51b558 100644 (file)
@@ -241,7 +241,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                                break;
                        case 'rights':
                                $vals2 = array();
-                               list( $vals2['old'], $vals2['new'] ) = $params;
+                               if( $legacy ) {
+                                       list( $vals2['old'], $vals2['new'] ) = $params;
+                               } else {
+                                       $vals2['new'] = implode( ', ', $params['5::newgroups'] );
+                                       $vals2['old'] = implode( ', ', $params['4::oldgroups'] );
+                               }
                                $vals[$type] = $vals2;
                                $params = null;
                                break;
diff --git a/includes/api/ApiQueryORM.php b/includes/api/ApiQueryORM.php
new file mode 100644 (file)
index 0000000..f0c2b1b
--- /dev/null
@@ -0,0 +1,264 @@
+<?php
+
+/**
+ * Base query module for querying results from ORMTables.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup API
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class ApiQueryORM extends ApiQueryBase {
+
+       /**
+        * Returns an instance of the IORMTable table being queried.
+        *
+        * @since 1.21
+        *
+        * @return IORMTable
+        */
+       protected abstract function getTable();
+
+       /**
+        * Returns the name of the individual rows.
+        * For example: page, user, contest, campaign, etc.
+        * This is used to appropriately name elements in XML.
+        * Deriving classes typically override this method.
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       protected function getRowName() {
+               return 'item';
+       }
+
+       /**
+        * Returns the name of the list of rows.
+        * For example: pages, users, contests, campaigns, etc.
+        * This is used to appropriately name nodes in the output.
+        * Deriving classes typically override this method.
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       protected function getListName() {
+               return 'items';
+       }
+
+       /**
+        * Returns the path to where the items results should be added in the result.
+        *
+        * @since 1.21
+        *
+        * @return null|string|array
+        */
+       protected function getResultPath() {
+               return null;
+       }
+
+       /**
+        * Get the parameters, find out what the conditions for the query are,
+        * run it, and add the results.
+        *
+        * @since 1.21
+        */
+       public function execute() {
+               $params = $this->getParams();
+
+               if ( !in_array( 'id', $params['props'] ) ) {
+                       $params['props'][] = 'id';
+               }
+
+               $results = $this->getResults( $params, $this->getConditions( $params ) );
+               $this->addResults( $params, $results );
+       }
+
+       /**
+        * Get the request parameters and remove all params set
+        * to null (ie those that are not actually provided).
+        *
+        * @since 1.21
+        *
+        * @return array
+        */
+       protected function getParams() {
+               return array_filter(
+                       $this->extractRequestParams(),
+                       function( $prop ) {
+                               return isset( $prop );
+                       }
+               );
+       }
+
+       /**
+        * Get the conditions for the query. These will be provided as
+        * regular parameters, together with limit, props, continue,
+        * and possibly others which we need to get rid off.
+        *
+        * @since 1.21
+        *
+        * @param array $params
+        *
+        * @return array
+        */
+       protected function getConditions( array $params ) {
+               $conditions = array();
+               $fields = $this->getTable()->getFields();
+
+               foreach ( $params as $name => $value ) {
+                       if ( array_key_exists( $name, $fields ) ) {
+                               $conditions[$name] = $value;
+                       }
+               }
+
+               return $conditions;
+       }
+
+       /**
+        * Get the actual results.
+        *
+        * @since 1.21
+        *
+        * @param array $params
+        * @param array $conditions
+        *
+        * @return ORMResult
+        */
+       protected function getResults( array $params, array $conditions ) {
+               return $this->getTable()->select(
+                       $params['props'],
+                       $conditions,
+                       array(
+                               'LIMIT' => $params['limit'] + 1,
+                               'ORDER BY' => $this->getTable()->getPrefixedField( 'id' ) . ' ASC',
+                       ),
+                       __METHOD__
+               );
+       }
+
+       /**
+        * Serialize the results and add them to the result object.
+        *
+        * @since 1.21
+        *
+        * @param array $params
+        * @param ORMResult $results
+        */
+       protected function addResults( array $params, ORMResult $results ) {
+               $serializedResults = array();
+               $count = 0;
+
+               foreach ( $results as /* IORMRow */ $result ) {
+                       if ( ++$count > $params['limit'] ) {
+                               // We've reached the one extra which shows that
+                               // there are additional pages to be had. Stop here...
+                               $this->setContinueEnumParameter( 'continue', $result->getId() );
+                               break;
+                       }
+
+                       $serializedResults[] = $this->formatRow( $result, $params );
+               }
+
+               $this->setIndexedTagNames( $serializedResults );
+               $this->addSerializedResults( $serializedResults );
+       }
+
+       /**
+        * Formats a row to it's desired output format.
+        *
+        * @since 1.21
+        *
+        * @param IORMRow $result
+        * @param array $params
+        *
+        * @return mixed
+        */
+       protected function formatRow( IORMRow $result, array $params ) {
+               return $result->toArray( $params['props'] );
+       }
+
+       /**
+        * Set the tag names for formats such as XML.
+        *
+        * @since 1.21
+        *
+        * @param array $serializedResults
+        */
+       protected function setIndexedTagNames( array &$serializedResults ) {
+               $this->getResult()->setIndexedTagName( $serializedResults, $this->getRowName() );
+       }
+
+       /**
+        * Add the serialized results to the result object.
+        *
+        * @since 1.21
+        *
+        * @param array $serializedResults
+        */
+       protected function addSerializedResults( array $serializedResults ) {
+               $this->getResult()->addValue(
+                       $this->getResultPath(),
+                       $this->getListName(),
+                       $serializedResults
+               );
+       }
+
+       /**
+        * @see ApiBase::getAllowedParams()
+        * @return array
+        */
+       public function getAllowedParams() {
+               $params = array (
+                       'props' => array(
+                               ApiBase::PARAM_TYPE => $this->getTable()->getFieldNames(),
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'limit' => array(
+                               ApiBase::PARAM_DFLT => 20,
+                               ApiBase::PARAM_TYPE => 'limit',
+                               ApiBase::PARAM_MIN => 1,
+                               ApiBase::PARAM_MAX => ApiBase::LIMIT_BIG1,
+                               ApiBase::PARAM_MAX2 => ApiBase::LIMIT_BIG2
+                       ),
+                       'continue' => null,
+               );
+
+               return array_merge( $this->getTable()->getAPIParams(), $params );
+       }
+
+       /**
+        * @see ApiBase::getParamDescription()
+        * @return array
+        */
+       public function getParamDescription() {
+               $descriptions = array (
+                       'props' => 'Fields to query',
+                       'continue' => 'Offset number from where to continue the query',
+                       'limit' => 'Max amount of rows to return',
+               );
+
+               return array_merge( $this->getTable()->getFieldDescriptions(), $descriptions );
+       }
+
+}
index 14aed28..0205005 100644 (file)
@@ -98,7 +98,7 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                        $vals['user'] = $row->user_name;
                                }
 
-                               if ( isset( $prop['user'] ) ) {
+                               if ( isset( $prop['userid'] ) || /*B/C*/isset( $prop['user'] ) ) {
                                        $vals['userid'] = $row->pt_user;
                                }
 
@@ -231,6 +231,9 @@ class ApiQueryProtectedTitles extends ApiQueryGeneratorBase {
                                ),
                                'userid' => 'integer'
                        ),
+                       'userid' => array(
+                               'userid' => 'integer'
+                       ),
                        'comment' => array(
                                'comment' => 'string'
                        ),
index 7ae4f37..84c2332 100644 (file)
@@ -214,8 +214,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        'rc_title',
                        'rc_cur_id',
                        'rc_type',
-                       'rc_moved_to_ns',
-                       'rc_moved_to_title',
                        'rc_deleted'
                ) );
 
@@ -321,12 +319,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
         * @access public
         */
        public function extractRowInfo( $row ) {
-               /* If page was moved somewhere, get the title of the move target. */
-               $movedToTitle = false;
-               if ( isset( $row->rc_moved_to_title ) && $row->rc_moved_to_title !== '' ) {
-                       $movedToTitle = Title::makeTitle( $row->rc_moved_to_ns, $row->rc_moved_to_title );
-               }
-
                /* Determine the title of the page that has been changed. */
                $title = Title::makeTitle( $row->rc_namespace, $row->rc_title );
 
@@ -359,9 +351,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                /* Create a new entry in the result for the title. */
                if ( $this->fld_title ) {
                        ApiQueryBase::addTitleInfo( $vals, $title );
-                       if ( $movedToTitle ) {
-                               ApiQueryBase::addTitleInfo( $vals, $movedToTitle, 'new_' );
-                       }
                }
 
                /* Add ids, such as rcid, pageid, revid, and oldid to the change's info. */
index 41dfc33..66ff3f0 100644 (file)
 class ApiQueryRevisions extends ApiQueryBase {
 
        private $diffto, $difftotext, $expandTemplates, $generateXML, $section,
-               $token, $parseContent;
+               $token, $parseContent, $contentFormat;
 
        public function __construct( $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'rv' );
        }
 
-       private $fld_ids = false, $fld_flags = false, $fld_timestamp = false, $fld_size = false,
+       private $fld_ids = false, $fld_flags = false, $fld_timestamp = false, $fld_size = false, $fld_sha1 = false,
                        $fld_comment = false, $fld_parsedcomment = false, $fld_user = false, $fld_userid = false,
-                       $fld_content = false, $fld_tags = false;
+                       $fld_content = false, $fld_tags = false, $fld_contentmodel = false;
 
        private $tokenFunctions;
 
@@ -155,10 +155,15 @@ class ApiQueryRevisions extends ApiQueryBase {
                $this->fld_parsedcomment = isset ( $prop['parsedcomment'] );
                $this->fld_size = isset ( $prop['size'] );
                $this->fld_sha1 = isset ( $prop['sha1'] );
+               $this->fld_contentmodel = isset ( $prop['contentmodel'] );
                $this->fld_userid = isset( $prop['userid'] );
                $this->fld_user = isset ( $prop['user'] );
                $this->token = $params['token'];
 
+               if ( !empty( $params['contentformat'] ) ) {
+                       $this->contentFormat = $params['contentformat'];
+               }
+
                // Possible indexes used
                $index = array();
 
@@ -256,7 +261,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        // rvstart and rvstartid when that is supplied.
                        if ( !is_null( $params['continue'] ) ) {
                                $params['startid'] = $params['continue'];
-                               unset( $params['start'] );
+                               $params['start'] = null;
                        }
 
                        // This code makes an assumption that sorting by rev_id and rev_timestamp produces
@@ -442,6 +447,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                        }
                }
 
+               if ( $this->fld_contentmodel ) {
+                       $vals['contentmodel'] = $revision->getContentModel();
+               }
+
                if ( $this->fld_comment || $this->fld_parsedcomment ) {
                        if ( $revision->isDeleted( Revision::DELETED_COMMENT ) ) {
                                $vals['commenthidden'] = '';
@@ -480,39 +489,83 @@ class ApiQueryRevisions extends ApiQueryBase {
                        }
                }
 
-               $text = null;
+               $content = null;
                global $wgParser;
                if ( $this->fld_content || !is_null( $this->difftotext ) ) {
-                       $text = $revision->getText();
+                       $content = $revision->getContent();
                        // Expand templates after getting section content because
                        // template-added sections don't count and Parser::preprocess()
                        // will have less input
                        if ( $this->section !== false ) {
-                               $text = $wgParser->getSection( $text, $this->section, false );
-                               if ( $text === false ) {
+                               $content = $content->getSection( $this->section, false );
+                               if ( !$content ) {
                                        $this->dieUsage( "There is no section {$this->section} in r" . $revision->getId(), 'nosuchsection' );
                                }
                        }
                }
                if ( $this->fld_content && !$revision->isDeleted( Revision::DELETED_TEXT ) ) {
+                       $text = null;
+
                        if ( $this->generateXML ) {
-                               $wgParser->startExternalParse( $title, ParserOptions::newFromContext( $this->getContext() ), OT_PREPROCESS );
-                               $dom = $wgParser->preprocessToDom( $text );
-                               if ( is_callable( array( $dom, 'saveXML' ) ) ) {
-                                       $xml = $dom->saveXML();
+                               if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
+                                       $t = $content->getNativeData(); # note: don't set $text
+
+                                       $wgParser->startExternalParse( $title, ParserOptions::newFromContext( $this->getContext() ), OT_PREPROCESS );
+                                       $dom = $wgParser->preprocessToDom( $t );
+                                       if ( is_callable( array( $dom, 'saveXML' ) ) ) {
+                                               $xml = $dom->saveXML();
+                                       } else {
+                                               $xml = $dom->__toString();
+                                       }
+                                       $vals['parsetree'] = $xml;
                                } else {
-                                       $xml = $dom->__toString();
+                                       $this->setWarning( "Conversion to XML is supported for wikitext only, " .
+                                                                               $title->getPrefixedDBkey() .
+                                                                               " uses content model " . $content->getModel() . ")" );
                                }
-                               $vals['parsetree'] = $xml;
-
                        }
+
                        if ( $this->expandTemplates && !$this->parseContent ) {
-                               $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
+                               #XXX: implement template expansion for all content types in ContentHandler?
+                               if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
+                                       $text = $content->getNativeData();
+
+                                       $text = $wgParser->preprocess( $text, $title, ParserOptions::newFromContext( $this->getContext() ) );
+                               } else {
+                                       $this->setWarning( "Template expansion is supported for wikitext only, " .
+                                               $title->getPrefixedDBkey() .
+                                               " uses content model " . $content->getModel() . ")" );
+
+                                       $text = false;
+                               }
                        }
                        if ( $this->parseContent ) {
-                               $text = $wgParser->parse( $text, $title, ParserOptions::newFromContext( $this->getContext() ) )->getText();
+                               $po = $content->getParserOutput( $title, $revision->getId(), ParserOptions::newFromContext( $this->getContext() ) );
+                               $text = $po->getText();
+                       }
+
+                       if ( $text === null ) {
+                               $format = $this->contentFormat ? $this->contentFormat : $content->getDefaultFormat();
+                               $model = $content->getModel();
+
+                               if ( !$content->isSupportedFormat( $format ) ) {
+                                       $name = $title->getPrefixedDBkey();
+
+                                       $this->dieUsage( "The requested format {$this->contentFormat} is not supported ".
+                                                                       "for content model $model used by $name", 'badformat' );
+                               }
+
+                               $text = $content->serialize( $format );
+
+                               // always include format and model.
+                               // Format is needed to deserialize, model is needed to interpret.
+                               $vals['contentformat'] = $format;
+                               $vals['contentmodel'] = $model;
+                       }
+
+                       if ( $text !== false ) {
+                               ApiResult::setContent( $vals, $text );
                        }
-                       ApiResult::setContent( $vals, $text );
                } elseif ( $this->fld_content ) {
                        $vals['texthidden'] = '';
                }
@@ -524,11 +577,26 @@ class ApiQueryRevisions extends ApiQueryBase {
                                $vals['diff'] = array();
                                $context = new DerivativeContext( $this->getContext() );
                                $context->setTitle( $title );
+                               $handler = $revision->getContentHandler();
+
                                if ( !is_null( $this->difftotext ) ) {
-                                       $engine = new DifferenceEngine( $context );
-                                       $engine->setText( $text, $this->difftotext );
+                                       $model = $title->getContentModel();
+
+                                       if ( $this->contentFormat
+                                               && !ContentHandler::getForModelID( $model )->isSupportedFormat( $this->contentFormat ) ) {
+
+                                               $name = $title->getPrefixedDBkey();
+
+                                               $this->dieUsage( "The requested format {$this->contentFormat} is not supported for ".
+                                                                                       "content model $model used by $name", 'badformat' );
+                                       }
+
+                                       $difftocontent = ContentHandler::makeContent( $this->difftotext, $title, $model, $this->contentFormat );
+
+                                       $engine = $handler->createDifferenceEngine( $context );
+                                       $engine->setContent( $content, $difftocontent );
                                } else {
-                                       $engine = new DifferenceEngine( $context, $revision->getID(), $this->diffto );
+                                       $engine = $handler->createDifferenceEngine( $context, $revision->getID(), $this->diffto );
                                        $vals['diff']['from'] = $engine->getOldid();
                                        $vals['diff']['to'] = $engine->getNewid();
                                }
@@ -568,6 +636,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        'userid',
                                        'size',
                                        'sha1',
+                                       'contentmodel',
                                        'comment',
                                        'parsedcomment',
                                        'content',
@@ -617,6 +686,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                        'continue' => null,
                        'diffto' => null,
                        'difftotext' => null,
+                       'contentformat' => array(
+                               ApiBase::PARAM_TYPE => ContentHandler::getAllContentFormats(),
+                               ApiBase::PARAM_DFLT => null
+                       ),
                );
        }
 
@@ -632,6 +705,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                                ' userid         - User id of revision creator',
                                ' size           - Length (bytes) of the revision',
                                ' sha1           - SHA-1 (base 16) of the revision',
+                               ' contentmodel   - Content model id',
                                ' comment        - Comment by the user for revision',
                                ' parsedcomment  - Parsed comment by the user for the revision',
                                ' content        - Text of the revision',
@@ -645,9 +719,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                        'dir' => $this->getDirectionDescription( $p, ' (enum)' ),
                        'user' => 'Only include revisions made by user (enum)',
                        'excludeuser' => 'Exclude revisions made by user (enum)',
-                       'expandtemplates' => 'Expand templates in revision content',
-                       'generatexml' => 'Generate XML parse tree for revision content',
-                       'parse' => 'Parse revision content. For performance reasons if this option is used, rvlimit is enforced to 1.',
+                       'expandtemplates' => "Expand templates in revision content (requires {$p}prop=content)",
+                       'generatexml' => "Generate XML parse tree for revision content (requires {$p}prop=content)",
+                       'parse' => array( "Parse revision content (requires {$p}prop=content).",
+                               'For performance reasons if this option is used, rvlimit is enforced to 1.' ),
                        'section' => 'Only retrieve the content of this section number',
                        'token' => 'Which tokens to obtain for each revision',
                        'continue' => 'When more results are available, use this to continue',
@@ -656,6 +731,7 @@ class ApiQueryRevisions extends ApiQueryBase {
                        'difftotext' => array( 'Text to diff each revision to. Only diffs a limited number of revisions.',
                                "Overrides {$p}diffto. If {$p}section is set, only that section will be diffed against this text" ),
                        'tag' => 'Only list revisions tagged with this tag',
+                       'contentformat' => 'Serialization format used for difftotext and expected for output of content',
                );
        }
 
@@ -711,7 +787,10 @@ class ApiQueryRevisions extends ApiQueryBase {
                                        ApiBase::PROP_NULLABLE => true
                                ),
                                'texthidden' => 'boolean'
-                       )
+                       ),
+                       'contentmodel' => array(
+                               'contentmodel' => 'string'
+                       ),
                );
 
                self::addTokenProperties( $props, $this->getTokenFunctions() );
@@ -733,13 +812,18 @@ class ApiQueryRevisions extends ApiQueryBase {
        public function getPossibleErrors() {
                return array_merge( parent::getPossibleErrors(), array(
                        array( 'nosuchrevid', 'diffto' ),
-                       array( 'code' => 'revids', 'info' => 'The revids= parameter may not be used with the list options (limit, startid, endid, dirNewer, start, end).' ),
-                       array( 'code' => 'multpages', 'info' => 'titles, pageids or a generator was used to supply multiple pages, but the limit, startid, endid, dirNewer, user, excludeuser, start and end parameters may only be used on a single page.' ),
+                       array( 'code' => 'revids', 'info' => 'The revids= parameter may not be used with the list options '
+                                       . '(limit, startid, endid, dirNewer, start, end).' ),
+                       array( 'code' => 'multpages', 'info' => 'titles, pageids or a generator was used to supply multiple pages, '
+                                       . ' but the limit, startid, endid, dirNewer, user, excludeuser, '
+                                       . 'start and end parameters may only be used on a single page.' ),
                        array( 'code' => 'diffto', 'info' => 'rvdiffto must be set to a non-negative number, "prev", "next" or "cur"' ),
                        array( 'code' => 'badparams', 'info' => 'start and startid cannot be used together' ),
                        array( 'code' => 'badparams', 'info' => 'end and endid cannot be used together' ),
                        array( 'code' => 'badparams', 'info' => 'user and excludeuser cannot be used together' ),
                        array( 'code' => 'nosuchsection', 'info' => 'There is no section section in rID' ),
+                       array( 'code' => 'badformat', 'info' => 'The requested serialization format can not be applied '
+                                                                                                       . ' to the page\'s content model' ),
                ) );
        }
 
index bf438d1..591ace9 100644 (file)
@@ -110,19 +110,39 @@ class ApiQueryUsers extends ApiQueryBase {
                        $this->addFields( User::selectFields() );
                        $this->addWhereFld( 'user_name', $goodNames );
 
-                       if ( isset( $this->prop['groups'] ) || isset( $this->prop['rights'] ) ) {
-                               $this->addTables( 'user_groups' );
-                               $this->addJoinConds( array( 'user_groups' => array( 'LEFT JOIN', 'ug_user=user_id' ) ) );
-                               $this->addFields( 'ug_group' );
-                       }
-
                        $this->showHiddenUsersAddBlockInfo( isset( $this->prop['blockinfo'] ) );
 
                        $data = array();
                        $res = $this->select( __METHOD__ );
+                       $this->resetQueryParams();
+
+                       // get user groups if needed
+                       if ( isset( $this->prop['groups'] ) || isset( $this->prop['rights'] ) ) {
+                               $userGroups = array();
+
+                               $this->addTables( 'user' );
+                               $this->addWhereFld( 'user_name', $goodNames );
+                               $this->addTables( 'user_groups' );
+                               $this->addJoinConds( array( 'user_groups' => array( 'INNER JOIN', 'ug_user=user_id' ) ) );
+                               $this->addFields( array('user_name', 'ug_group') );
+                               $userGroupsRes = $this->select( __METHOD__ );
+
+                               foreach( $userGroupsRes as $row ) {
+                                       $userGroups[$row->user_name][] = $row->ug_group;
+                               }
+                       }
 
                        foreach ( $res as $row ) {
-                               $user = User::newFromRow( $row );
+                               // create user object and pass along $userGroups if set
+                               // that reduces the number of database queries needed in User dramatically
+                               if ( !isset( $userGroups ) ) {
+                                       $user = User::newFromRow( $row );
+                               } else {
+                                       if ( !isset( $userGroups[$row->user_name] ) || !is_array( $userGroups[$row->user_name] ) ) {
+                                               $userGroups[$row->user_name] = array();
+                                       }
+                                       $user = User::newFromRow( $row, array( 'user_groups' => $userGroups[$row->user_name] ) );
+                               }
                                $name = $user->getName();
 
                                $data[$name]['userid'] = $user->getId();
@@ -137,29 +157,15 @@ class ApiQueryUsers extends ApiQueryBase {
                                }
 
                                if ( isset( $this->prop['groups'] ) ) {
-                                       if ( !isset( $data[$name]['groups'] ) ) {
-                                               $data[$name]['groups'] = $user->getAutomaticGroups();
-                                       }
-
-                                       if ( !is_null( $row->ug_group ) ) {
-                                               // This row contains only one group, others will be added from other rows
-                                               $data[$name]['groups'][] = $row->ug_group;
-                                       }
+                                       $data[$name]['groups'] = $user->getEffectiveGroups();
                                }
 
-                               if ( isset( $this->prop['implicitgroups'] ) && !isset( $data[$name]['implicitgroups'] ) ) {
+                               if ( isset( $this->prop['implicitgroups'] ) ) {
                                        $data[$name]['implicitgroups'] =  $user->getAutomaticGroups();
                                }
 
                                if ( isset( $this->prop['rights'] ) ) {
-                                       if ( !isset( $data[$name]['rights'] ) ) {
-                                               $data[$name]['rights'] = User::getGroupPermissions( $user->getAutomaticGroups() );
-                                       }
-
-                                       if ( !is_null( $row->ug_group ) ) {
-                                               $data[$name]['rights'] = array_unique( array_merge( $data[$name]['rights'],
-                                                       User::getGroupPermissions( array( $row->ug_group ) ) ) );
-                                       }
+                                       $data[$name]['rights'] = $user->getRights();
                                }
                                if ( $row->ipb_deleted ) {
                                        $data[$name]['hidden'] = '';
index c996251..2ee8641 100644 (file)
@@ -61,7 +61,13 @@ class ApiUndelete extends ApiBase {
                }
 
                $pa = new PageArchive( $titleObj );
-               $retval = $pa->undelete( ( isset( $params['timestamps'] ) ? $params['timestamps'] : array() ), $params['reason'] );
+               $retval = $pa->undelete(
+                       ( isset( $params['timestamps'] ) ? $params['timestamps'] : array() ),
+                       $params['reason'],
+                       array(),
+                       false,
+                       $this->getUser()
+               );
                if ( !is_array( $retval ) ) {
                        $this->dieUsageMsg( 'cannotundelete' );
                }
index 3a9b5c5..f88332f 100644 (file)
@@ -86,10 +86,13 @@ class ApiUpload extends ApiBase {
                        if( $this->mParams['filesize'] > $maxSize ) {
                                $this->dieUsage( 'The file you submitted was too large', 'file-too-large' );
                        }
+                       if ( !$this->mUpload->getTitle() ) {
+                               $this->dieUsage( 'Invalid file title supplied', 'internal-error' );
+                       }
                } else {
                        $this->verifyUpload();
                }
+
                // Check if the user has the rights to modify or overwrite the requested title
                // (This check is irrelevant if stashing is already requested, since the errors
                //  can always be fixed by changing the title)
@@ -99,7 +102,7 @@ class ApiUpload extends ApiBase {
                                $this->dieRecoverableError( $permErrors[0], 'filename' );
                        }
                }
-               // Get the result based on the current upload context: 
+               // Get the result based on the current upload context:
                $result = $this->getContextResult();
 
                if ( $result['result'] === 'Success' ) {
@@ -111,6 +114,7 @@ class ApiUpload extends ApiBase {
                // Cleanup any temporary mess
                $this->mUpload->cleanupTempFile();
        }
+
        /**
         * Get an uplaod result based on upload context
         * @return array
@@ -176,7 +180,9 @@ class ApiUpload extends ApiBase {
         * @param $warnings array Array of Api upload warnings
         * @return array
         */
-       private function getChunkResult( $warnings ){
+       private function getChunkResult( $warnings ) {
+               global $IP;
+
                $result = array();
 
                $result['result'] = 'Continue';
@@ -189,32 +195,59 @@ class ApiUpload extends ApiBase {
                if ($this->mParams['offset'] == 0) {
                        $result['filekey'] = $this->performStash();
                } else {
-                       $status = $this->mUpload->addChunk($chunkPath, $chunkSize,
-                                                                               $this->mParams['offset']);
+                       $status = $this->mUpload->addChunk(
+                               $chunkPath, $chunkSize, $this->mParams['offset'] );
                        if ( !$status->isGood() ) {
                                $this->dieUsage( $status->getWikiText(), 'stashfailed' );
                                return array();
                        }
 
-                       // Check we added the last chunk: 
+                       // Check we added the last chunk:
                        if( $this->mParams['offset'] + $chunkSize == $this->mParams['filesize'] ) {
-                               $status = $this->mUpload->concatenateChunks();
-
-                               if ( !$status->isGood() ) {
-                                       $this->dieUsage( $status->getWikiText(), 'stashfailed' );
-                                       return array();
-                               }
-
-                               // We have a new filekey for the fully concatenated file.
-                               $result['filekey'] =  $this->mUpload->getLocalFile()->getFileKey();
+                               if ( $this->mParams['async'] && !wfIsWindows() ) {
+                                       $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+                                       if ( $progress && $progress['result'] !== 'Failed' ) {
+                                               $this->dieUsage( "Chunk assembly already in progress.", 'stashfailed' );
+                                       }
+                                       UploadBase::setSessionStatus(
+                                               $this->mParams['filekey'],
+                                               array( 'result' => 'Poll', 'status' => Status::newGood() )
+                                       );
+                                       $retVal = 1;
+                                       $cmd = wfShellWikiCmd(
+                                               "$IP/includes/upload/AssembleUploadChunks.php",
+                                               array(
+                                                       '--filename', $this->mParams['filename'],
+                                                       '--filekey', $this->mParams['filekey'],
+                                                       '--userid', $this->getUser()->getId(),
+                                                       '--sessionid', session_id(),
+                                                       '--quiet'
+                                               )
+                                       ) . " < " . wfGetNull() . " > " . wfGetNull() . " 2>&1 &";
+                                       wfShellExec( $cmd, $retVal ); // start a process in the background
+                                       if ( $retVal == 0 ) {
+                                               $result['result'] = 'Poll';
+                                       } else {
+                                               UploadBase::setSessionStatus( $this->mParams['filekey'], false );
+                                               $this->dieUsage(
+                                                       "Failed to start AssembleUploadChunks.php", 'stashfailed' );
+                                       }
+                               } else {
+                                       $status = $this->mUpload->concatenateChunks();
+                                       if ( !$status->isGood() ) {
+                                               $this->dieUsage( $status->getWikiText(), 'stashfailed' );
+                                               return array();
+                                       }
 
-                               // Remove chunk from stash. (Checks against user ownership of chunks.)
-                               $this->mUpload->stash->removeFile( $this->mParams['filekey'] );
+                                       // We have a new filekey for the fully concatenated file.
+                                       $result['filekey'] =  $this->mUpload->getLocalFile()->getFileKey();
 
-                               $result['result'] = 'Success';
+                                       // Remove chunk from stash. (Checks against user ownership of chunks.)
+                                       $this->mUpload->stash->removeFile( $this->mParams['filekey'] );
 
+                                       $result['result'] = 'Success';
+                               }
                        } else {
-
                                // Continue passing through the filekey for adding further chunks.
                                $result['filekey'] = $this->mParams['filekey'];
                        }
@@ -222,7 +255,7 @@ class ApiUpload extends ApiBase {
                $result['offset'] = $this->mParams['offset'] + $chunkSize;
                return $result;
        }
-       
+
        /**
         * Stash the file and return the file key
         * Also re-raises exceptions with slightly more informative message strings (useful for API)
@@ -278,11 +311,23 @@ class ApiUpload extends ApiBase {
                $request = $this->getMain()->getRequest();
 
                // chunk or one and only one of the following parameters is needed
-               if( !$this->mParams['chunk'] ) {
+               if ( !$this->mParams['chunk'] ) {
                        $this->requireOnlyOneParameter( $this->mParams,
                                'filekey', 'file', 'url', 'statuskey' );
                }
 
+               if ( $this->mParams['filekey'] && $this->mParams['checkstatus'] ) {
+                       $progress = UploadBase::getSessionStatus( $this->mParams['filekey'] );
+                       if ( !$progress ) {
+                               $this->dieUsage( 'No result in status data', 'missingresult' );
+                       } elseif ( !$progress['status']->isGood() ) {
+                               $this->dieUsage( $progress['status']->getWikiText(), 'stashfailed' );
+                       }
+                       unset( $progress['status'] ); // remove Status object
+                       $this->getResult()->addValue( null, $this->getModuleName(), $progress );
+                       return false;
+               }
+
                if ( $this->mParams['statuskey'] ) {
                        $this->checkAsyncDownloadEnabled();
 
@@ -297,7 +342,6 @@ class ApiUpload extends ApiBase {
                        }
                        $this->getResult()->addValue( null, $this->getModuleName(), $sessionData );
                        return false;
-
                }
 
                // The following modules all require the filename parameter to be set
@@ -609,9 +653,11 @@ class ApiUpload extends ApiBase {
                        'offset' => null,
                        'chunk' => null,
 
+                       'async' => false,
                        'asyncdownload' => false,
                        'leavemessage' => false,
                        'statuskey' => null,
+                       'checkstatus' => false,
                );
 
                return $params;
@@ -636,9 +682,11 @@ class ApiUpload extends ApiBase {
                        'offset' => 'Offset of chunk in bytes',
                        'filesize' => 'Filesize of entire upload',
 
+                       'async', 'Make potentially large file operations asynchronous when possible',
                        'asyncdownload' => 'Make fetching a URL asynchronous',
                        'leavemessage' => 'If asyncdownload is used, leave a message on the user talk page if finished',
-                       'statuskey' => 'Fetch the upload status for this file key',
+                       'statuskey' => 'Fetch the upload status for this file key (upload by URL)',
+                       'checkstatus' => 'Only fetch the upload status for the given file key',
                );
 
                return $params;
index 0509f1f..275275e 100644 (file)
@@ -50,6 +50,14 @@ class ApiWatch extends ApiBase {
 
                $res = array( 'title' => $title->getPrefixedText() );
 
+               // Currently unnecessary, code to act as a safeguard against any change in current behaviour of uselang
+               // Copy from ApiParse
+               $oldLang = null;
+               if ( isset( $params['uselang'] ) && $params['uselang'] != $this->getContext()->getLanguage()->getCode() ) {
+                       $oldLang = $this->getContext()->getLanguage(); // Backup language
+                       $this->getContext()->setLanguage( Language::factory( $params['uselang'] ) );
+               }
+
                if ( $params['unwatch'] ) {
                        $res['unwatched'] = '';
                        $res['message'] = $this->msg( 'removedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
@@ -59,6 +67,11 @@ class ApiWatch extends ApiBase {
                        $res['message'] = $this->msg( 'addedwatchtext', $title->getPrefixedText() )->title( $title )->parseAsBlock();
                        $success = WatchAction::doWatch( $title, $user );
                }
+
+               if ( !is_null( $oldLang ) ) {
+                       $this->getContext()->setLanguage( $oldLang ); // Reset language to $oldLang
+               }
+
                if ( !$success ) {
                        $this->dieUsageMsg( 'hookaborted' );
                }
@@ -88,6 +101,7 @@ class ApiWatch extends ApiBase {
                                ApiBase::PARAM_REQUIRED => true
                        ),
                        'unwatch' => false,
+                       'uselang' => null,
                        'token' => array(
                                ApiBase::PARAM_TYPE => 'string',
                                ApiBase::PARAM_REQUIRED => true
@@ -99,6 +113,7 @@ class ApiWatch extends ApiBase {
                return array(
                        'title' => 'The page to (un)watch',
                        'unwatch' => 'If set the page will be unwatched rather than watched',
+                       'uselang' => 'Language to show the message in',
                        'token' => 'A token previously acquired via prop=info',
                );
        }
diff --git a/includes/cache/BacklinkCache.php b/includes/cache/BacklinkCache.php
new file mode 100644 (file)
index 0000000..0710caa
--- /dev/null
@@ -0,0 +1,453 @@
+<?php
+/**
+ * Class for fetching backlink lists, approximate backlink counts and
+ * partitions.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * 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 Tim Starling
+ * @copyright © 2009, Tim Starling, Domas Mituzas
+ * @copyright © 2010, Max Sem
+ * @copyright © 2011, Antoine Musso
+ */
+
+/**
+ * Class for fetching backlink lists, approximate backlink counts and
+ * partitions. This is a shared cache.
+ *
+ * Instances of this class should typically be fetched with the method
+ * $title->getBacklinkCache().
+ *
+ * Ideally you should only get your backlinks from here when you think
+ * there is some advantage in caching them. Otherwise it's just a waste
+ * of memory.
+ *
+ * Introduced by r47317
+ *
+ * @internal documentation reviewed on 18 Mar 2011 by hashar
+ */
+class BacklinkCache {
+       /** @var ProcessCacheLRU */
+       protected static $cache;
+
+       /**
+        * Multi dimensions array representing batches. Keys are:
+        *  > (string) links table name
+        *    > 'numRows' : Number of rows for this link table
+        *    > 'batches' : array( $start, $end )
+        *
+        * @see BacklinkCache::partitionResult()
+        *
+        * Cleared with BacklinkCache::clear()
+        */
+       protected $partitionCache = array();
+
+       /**
+        * Contains the whole links from a database result.
+        * This is raw data that will be partitioned in $partitionCache
+        *
+        * Initialized with BacklinkCache::getLinks()
+        * Cleared with BacklinkCache::clear()
+        */
+       protected $fullResultCache = array();
+
+       /**
+        * Local copy of a database object.
+        *
+        * Accessor: BacklinkCache::getDB()
+        * Mutator : BacklinkCache::setDB()
+        * Cleared with BacklinkCache::clear()
+        */
+       protected $db;
+
+       /**
+        * Local copy of a Title object
+        */
+       protected $title;
+
+       const CACHE_EXPIRY = 3600;
+
+       /**
+        * Create a new BacklinkCache
+        *
+        * @param Title $title : Title object to create a backlink cache for
+        */
+       public function __construct( Title $title ) {
+               $this->title = $title;
+       }
+
+       /**
+        * Create a new BacklinkCache or reuse any existing one.
+        * Currently, only one cache instance can exist; callers that
+        * need multiple backlink cache objects should keep them in scope.
+        *
+        * @param Title $title : Title object to get a backlink cache for
+        * @return BacklinkCache
+        */
+       public static function get( Title $title ) {
+               if ( !self::$cache ) { // init cache
+                       self::$cache = new ProcessCacheLRU( 1 );
+               }
+               $dbKey = $title->getPrefixedDBkey();
+               if ( !self::$cache->has( $dbKey, 'obj' ) ) {
+                       self::$cache->set( $dbKey, 'obj', new self( $title ) );
+               }
+               return self::$cache->get( $dbKey, 'obj' );
+       }
+
+       /**
+        * Serialization handler, diasallows to serialize the database to prevent
+        * failures after this class is deserialized from cache with dead DB
+        * connection.
+        *
+        * @return array
+        */
+       function __sleep() {
+               return array( 'partitionCache', 'fullResultCache', 'title' );
+       }
+
+       /**
+        * Clear locally stored data and database object.
+        */
+       public function clear() {
+               $this->partitionCache = array();
+               $this->fullResultCache = array();
+               unset( $this->db );
+       }
+
+       /**
+        * Set the Database object to use
+        *
+        * @param $db DatabaseBase
+        */
+       public function setDB( $db ) {
+               $this->db = $db;
+       }
+
+       /**
+        * Get the slave connection to the database
+        * When non existing, will initialize the connection.
+        * @return DatabaseBase object
+        */
+       protected function getDB() {
+               if ( !isset( $this->db ) ) {
+                       $this->db = wfGetDB( DB_SLAVE );
+               }
+
+               return $this->db;
+       }
+
+       /**
+        * Get the backlinks for a given table. Cached in process memory only.
+        * @param $table String
+        * @param $startId Integer or false
+        * @param $endId Integer or false
+        * @return TitleArrayFromResult
+        */
+       public function getLinks( $table, $startId = false, $endId = false ) {
+               wfProfileIn( __METHOD__ );
+
+               $fromField = $this->getPrefix( $table ) . '_from';
+
+               if ( $startId || $endId ) {
+                       // Partial range, not cached
+                       wfDebug( __METHOD__ . ": from DB (uncacheable range)\n" );
+                       $conds = $this->getConditions( $table );
+
+                       // Use the from field in the condition rather than the joined page_id,
+                       // because databases are stupid and don't necessarily propagate indexes.
+                       if ( $startId ) {
+                               $conds[] = "$fromField >= " . intval( $startId );
+                       }
+
+                       if ( $endId ) {
+                               $conds[] = "$fromField <= " . intval( $endId );
+                       }
+
+                       $res = $this->getDB()->select(
+                               array( $table, 'page' ),
+                               array( 'page_namespace', 'page_title', 'page_id' ),
+                               $conds,
+                               __METHOD__,
+                               array(
+                                       'STRAIGHT_JOIN',
+                                       'ORDER BY' => $fromField
+                               ) );
+                       $ta = TitleArray::newFromResult( $res );
+
+                       wfProfileOut( __METHOD__ );
+                       return $ta;
+               }
+
+               // @todo FIXME: Make this a function?
+               if ( !isset( $this->fullResultCache[$table] ) ) {
+                       wfDebug( __METHOD__ . ": from DB\n" );
+                       $res = $this->getDB()->select(
+                               array( $table, 'page' ),
+                               array( 'page_namespace', 'page_title', 'page_id' ),
+                               $this->getConditions( $table ),
+                               __METHOD__,
+                               array(
+                                       'STRAIGHT_JOIN',
+                                       'ORDER BY' => $fromField,
+                               ) );
+                       $this->fullResultCache[$table] = $res;
+               }
+
+               $ta = TitleArray::newFromResult( $this->fullResultCache[$table] );
+
+               wfProfileOut( __METHOD__ );
+               return $ta;
+       }
+
+       /**
+        * Get the field name prefix for a given table
+        * @param $table String
+        * @throws MWException
+        * @return null|string
+        */
+       protected function getPrefix( $table ) {
+               static $prefixes = array(
+                       'pagelinks'     => 'pl',
+                       'imagelinks'    => 'il',
+                       'categorylinks' => 'cl',
+                       'templatelinks' => 'tl',
+                       'redirect'      => 'rd',
+               );
+
+               if ( isset( $prefixes[$table] ) ) {
+                       return $prefixes[$table];
+               } else {
+                       $prefix = null;
+                       wfRunHooks( 'BacklinkCacheGetPrefix', array( $table, &$prefix ) );
+                       if( $prefix ) {
+                               return $prefix;
+                       } else {
+                               throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
+                       }
+               }
+       }
+
+       /**
+        * Get the SQL condition array for selecting backlinks, with a join
+        * on the page table.
+        * @param $table String
+        * @throws MWException
+        * @return array|null
+        */
+       protected function getConditions( $table ) {
+               $prefix = $this->getPrefix( $table );
+
+               // @todo FIXME: imagelinks and categorylinks do not rely on getNamespace,
+               // they could be moved up for nicer case statements
+               switch ( $table ) {
+                       case 'pagelinks':
+                       case 'templatelinks':
+                               $conds = array(
+                                       "{$prefix}_namespace" => $this->title->getNamespace(),
+                                       "{$prefix}_title"     => $this->title->getDBkey(),
+                                       "page_id={$prefix}_from"
+                               );
+                               break;
+                       case 'redirect':
+                               $conds = array(
+                                       "{$prefix}_namespace" => $this->title->getNamespace(),
+                                       "{$prefix}_title"     => $this->title->getDBkey(),
+                                       $this->getDb()->makeList( array(
+                                               "{$prefix}_interwiki = ''",
+                                               "{$prefix}_interwiki is null",
+                                       ), LIST_OR ),
+                                       "page_id={$prefix}_from"
+                               );
+                               break;
+                       case 'imagelinks':
+                               $conds = array(
+                                       'il_to' => $this->title->getDBkey(),
+                                       'page_id=il_from'
+                               );
+                               break;
+                       case 'categorylinks':
+                               $conds = array(
+                                       'cl_to' => $this->title->getDBkey(),
+                                       'page_id=cl_from',
+                               );
+                               break;
+                       default:
+                               $conds = null;
+                               wfRunHooks( 'BacklinkCacheGetConditions', array( $table, $this->title, &$conds ) );
+                               if( !$conds ) {
+                                       throw new MWException( "Invalid table \"$table\" in " . __CLASS__ );
+                               }
+               }
+
+               return $conds;
+       }
+
+       /**
+        * Check if there are any backlinks
+        * @param $table String
+        * @return bool
+        */
+       public function hasLinks( $table ) {
+               return ( $this->getNumLinks( $table, 1 ) > 0 );
+       }
+
+       /**
+        * Get the approximate number of backlinks
+        * @param $table String
+        * @param $max integer Only count up to this many backlinks
+        * @return integer
+        */
+       public function getNumLinks( $table, $max = INF ) {
+               global $wgMemc;
+
+               // 1) try partition cache ...
+               if ( isset( $this->partitionCache[$table] ) ) {
+                       $entry = reset( $this->partitionCache[$table] );
+                       return min( $max, $entry['numRows'] );
+               }
+
+               // 2) ... then try full result cache ...
+               if ( isset( $this->fullResultCache[$table] ) ) {
+                       return min( $max, $this->fullResultCache[$table]->numRows() );
+               }
+
+               $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
+
+               // 3) ... fallback to memcached ...
+               $count = $wgMemc->get( $memcKey );
+               if ( $count ) {
+                       return min( $max, $count );
+               }
+
+               // 4) fetch from the database ...
+               if ( is_infinite( $max ) ) { // full count
+                       $count = $this->getLinks( $table )->count();
+                       $wgMemc->set( $memcKey, $count, self::CACHE_EXPIRY );
+               } else { // with limit
+                       $count = $this->getDB()->select(
+                               array( $table, 'page' ),
+                               '1',
+                               $this->getConditions( $table ),
+                               __METHOD__,
+                               array( 'LIMIT' => $max )
+                       )->numRows();
+               }
+
+               return $count;
+       }
+
+       /**
+        * Partition the backlinks into batches.
+        * Returns an array giving the start and end of each range. The first
+        * batch has a start of false, and the last batch has an end of false.
+        *
+        * @param $table String: the links table name
+        * @param $batchSize Integer
+        * @return Array
+        */
+       public function partition( $table, $batchSize ) {
+               global $wgMemc;
+
+               // 1) try partition cache ...
+               if ( isset( $this->partitionCache[$table][$batchSize] ) ) {
+                       wfDebug( __METHOD__ . ": got from partition cache\n" );
+                       return $this->partitionCache[$table][$batchSize]['batches'];
+               }
+
+               $this->partitionCache[$table][$batchSize] = false;
+               $cacheEntry =& $this->partitionCache[$table][$batchSize];
+
+               // 2) ... then try full result cache ...
+               if ( isset( $this->fullResultCache[$table] ) ) {
+                       $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
+                       wfDebug( __METHOD__ . ": got from full result cache\n" );
+                       return $cacheEntry['batches'];
+               }
+
+               $memcKey = wfMemcKey(
+                       'backlinks',
+                       md5( $this->title->getPrefixedDBkey() ),
+                       $table,
+                       $batchSize
+               );
+
+               // 3) ... fallback to memcached ...
+               $memcValue = $wgMemc->get( $memcKey );
+               if ( is_array( $memcValue ) ) {
+                       $cacheEntry = $memcValue;
+                       wfDebug( __METHOD__ . ": got from memcached $memcKey\n" );
+                       return $cacheEntry['batches'];
+               }
+
+
+               // 4) ... finally fetch from the slow database :(
+               $this->getLinks( $table );
+               $cacheEntry = $this->partitionResult( $this->fullResultCache[$table], $batchSize );
+               // Save partitions to memcached
+               $wgMemc->set( $memcKey, $cacheEntry, self::CACHE_EXPIRY );
+
+               // Save backlink count to memcached
+               $memcKey = wfMemcKey( 'numbacklinks', md5( $this->title->getPrefixedDBkey() ), $table );
+               $wgMemc->set( $memcKey, $cacheEntry['numRows'], self::CACHE_EXPIRY );
+
+               wfDebug( __METHOD__ . ": got from database\n" );
+               return $cacheEntry['batches'];
+       }
+
+       /**
+        * Partition a DB result with backlinks in it into batches
+        * @param $res ResultWrapper database result
+        * @param $batchSize integer
+        * @throws MWException
+        * @return array @see
+        */
+       protected function partitionResult( $res, $batchSize ) {
+               $batches = array();
+               $numRows = $res->numRows();
+               $numBatches = ceil( $numRows / $batchSize );
+
+               for ( $i = 0; $i < $numBatches; $i++ ) {
+                       if ( $i == 0  ) {
+                               $start = false;
+                       } else {
+                               $rowNum = intval( $numRows * $i / $numBatches );
+                               $res->seek( $rowNum );
+                               $row = $res->fetchObject();
+                               $start = $row->page_id;
+                       }
+
+                       if ( $i == $numBatches - 1 ) {
+                               $end = false;
+                       } else {
+                               $rowNum = intval( $numRows * ( $i + 1 ) / $numBatches );
+                               $res->seek( $rowNum );
+                               $row = $res->fetchObject();
+                               $end = $row->page_id - 1;
+                       }
+
+                       # Sanity check order
+                       if ( $start && $end && $start > $end ) {
+                               throw new MWException( __METHOD__ . ': Internal error: query result out of order' );
+                       }
+
+                       $batches[] = array( $start, $end );
+               }
+
+               return array( 'numRows' => $numRows, 'batches' => $batches );
+       }
+}
index a3c2b52..5cdc867 100644 (file)
@@ -74,7 +74,7 @@ class DependencyWrapper {
 
        /**
         * Get the user-defined value
-        * @return bool|\Mixed
+        * @return bool|Mixed
         */
        function getValue() {
                return $this->value;
index c0c5609..1a08d9f 100644 (file)
@@ -229,7 +229,7 @@ abstract class FileCacheBase {
        public function incrMissesRecent( WebRequest $request ) {
                global $wgMemc;
                if ( mt_rand( 0, self::MISS_FACTOR - 1 ) == 0 ) {
-                       # Get a large IP range that should include the user  even if that 
+                       # Get a large IP range that should include the user  even if that
                        # person's IP address changes
                        $ip = $request->getIP();
                        if ( !IP::isValid( $ip ) ) {
index 0a3c002..791ae3e 100644 (file)
 
 /**
  * Class to invalidate the HTML cache of all the pages linking to a given title.
- * Small numbers of links will be done immediately, large numbers are pushed onto
- * the job queue.
- *
- * This class is designed to work efficiently with small numbers of links, and
- * to work reasonably well with up to ~10^5 links. Above ~10^6 links, the memory
- * and time requirements of loading all backlinked IDs in doUpdate() might become
- * prohibitive. The requirements measured at Wikimedia are approximately:
- *
- *   memory: 48 bytes per row
- *   time: 16us per row for the query plus processing
- *
- * The reason this query is done is to support partitioning of the job
- * by backlinked ID. The memory issue could be allieviated by doing this query in
- * batches, but of course LIMIT with an offset is inefficient on the DB side.
- *
- * The class is nevertheless a vast improvement on the previous method of using
- * File::getLinksTo() and Title::touchArray(), which uses about 2KB of memory per
- * link.
  *
  * @ingroup Cache
  */
@@ -50,8 +32,7 @@ class HTMLCacheUpdate implements DeferrableUpdate {
         */
        public $mTitle;
 
-       public $mTable, $mPrefix, $mStart, $mEnd;
-       public $mRowsPerJob, $mRowsPerQuery;
+       public $mTable;
 
        /**
         * @param $titleTo
@@ -59,202 +40,31 @@ class HTMLCacheUpdate implements DeferrableUpdate {
         * @param $start bool
         * @param $end bool
         */
-       function __construct( $titleTo, $table, $start = false, $end = false ) {
-               global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery;
-
+       function __construct( Title $titleTo, $table ) {
                $this->mTitle = $titleTo;
                $this->mTable = $table;
-               $this->mStart = $start;
-               $this->mEnd = $end;
-               $this->mRowsPerJob = $wgUpdateRowsPerJob;
-               $this->mRowsPerQuery = $wgUpdateRowsPerQuery;
-               $this->mCache = $this->mTitle->getBacklinkCache();
        }
 
        public function doUpdate() {
-               if ( $this->mStart || $this->mEnd ) {
-                       $this->doPartialUpdate();
-                       return;
-               }
-
-               # Get an estimate of the number of rows from the BacklinkCache
-               $numRows = $this->mCache->getNumLinks( $this->mTable );
-               if ( $numRows > $this->mRowsPerJob * 2 ) {
-                       # Do fast cached partition
-                       $this->insertJobs();
-               } else {
-                       # Get the links from the DB
-                       $titleArray = $this->mCache->getLinks( $this->mTable );
-                       # Check if the row count estimate was correct
-                       if ( $titleArray->count() > $this->mRowsPerJob * 2 ) {
-                               # Not correct, do accurate partition
-                               wfDebug( __METHOD__.": row count estimate was incorrect, repartitioning\n" );
-                               $this->insertJobsFromTitles( $titleArray );
-                       } else {
-                               $this->invalidateTitles( $titleArray );
-                       }
-               }
-       }
-
-       /**
-        * Update some of the backlinks, defined by a page ID range
-        */
-       protected function doPartialUpdate() {
-               $titleArray = $this->mCache->getLinks( $this->mTable, $this->mStart, $this->mEnd );
-               if ( $titleArray->count() <= $this->mRowsPerJob * 2 ) {
-                       # This partition is small enough, do the update
-                       $this->invalidateTitles( $titleArray );
-               } else {
-                       # Partitioning was excessively inaccurate. Divide the job further.
-                       # This can occur when a large number of links are added in a short
-                       # period of time, say by updating a heavily-used template.
-                       $this->insertJobsFromTitles( $titleArray );
-               }
-       }
+               wfProfileIn( __METHOD__ );
 
-       /**
-        * Partition the current range given by $this->mStart and $this->mEnd,
-        * using a pre-calculated title array which gives the links in that range.
-        * Queue the resulting jobs.
-        *
-        * @param $titleArray array
-        */
-       protected function insertJobsFromTitles( $titleArray ) {
-               # We make subpartitions in the sense that the start of the first job
-               # will be the start of the parent partition, and the end of the last
-               # job will be the end of the parent partition.
-               $jobs = array();
-               $start = $this->mStart; # start of the current job
-               $numTitles = 0;
-               foreach ( $titleArray as $title ) {
-                       $id = $title->getArticleID();
-                       # $numTitles is now the number of titles in the current job not
-                       # including the current ID
-                       if ( $numTitles >= $this->mRowsPerJob ) {
-                               # Add a job up to but not including the current ID
-                               $params = array(
-                                       'table' => $this->mTable,
-                                       'start' => $start,
-                                       'end' => $id - 1
-                               );
-                               $jobs[] = new HTMLCacheUpdateJob( $this->mTitle, $params );
-                               $start = $id;
-                               $numTitles = 0;
-                       }
-                       $numTitles++;
-               }
-               # Last job
-               $params = array(
-                       'table' => $this->mTable,
-                       'start' => $start,
-                       'end' => $this->mEnd
-               );
-               $jobs[] = new HTMLCacheUpdateJob( $this->mTitle, $params );
-               wfDebug( __METHOD__.": repartitioning into " . count( $jobs ) . " jobs\n" );
-
-               if ( count( $jobs ) < 2 ) {
-                       # I don't think this is possible at present, but handling this case
-                       # makes the code a bit more robust against future code updates and
-                       # avoids a potential infinite loop of repartitioning
-                       wfDebug( __METHOD__.": repartitioning failed!\n" );
-                       $this->invalidateTitles( $titleArray );
-                       return;
-               }
-
-               Job::batchInsert( $jobs );
-       }
-
-       /**
-        * @return mixed
-        */
-       protected function insertJobs() {
-               $batches = $this->mCache->partition( $this->mTable, $this->mRowsPerJob );
-               if ( !$batches ) {
-                       return;
-               }
-               $jobs = array();
-               foreach ( $batches as $batch ) {
-                       $params = array(
+               $job = new HTMLCacheUpdateJob(
+                       $this->mTitle,
+                       array(
                                'table' => $this->mTable,
-                               'start' => $batch[0],
-                               'end' => $batch[1],
-                       );
-                       $jobs[] = new HTMLCacheUpdateJob( $this->mTitle, $params );
-               }
-               Job::batchInsert( $jobs );
-       }
-
-       /**
-        * Invalidate an array (or iterator) of Title objects, right now
-        * @param $titleArray array
-        */
-       protected function invalidateTitles( $titleArray ) {
-               global $wgUseFileCache, $wgUseSquid;
-
-               $dbw = wfGetDB( DB_MASTER );
-               $timestamp = $dbw->timestamp();
-
-               # Get all IDs in this query into an array
-               $ids = array();
-               foreach ( $titleArray as $title ) {
-                       $ids[] = $title->getArticleID();
-               }
-
-               if ( !$ids ) {
-                       return;
-               }
-
-               # Update page_touched
-               $batches = array_chunk( $ids, $this->mRowsPerQuery );
-               foreach ( $batches as $batch ) {
-                       $dbw->update( 'page',
-                               array( 'page_touched' => $timestamp ),
-                               array( 'page_id' => $batch ),
-                               __METHOD__
-                       );
-               }
-
-               # Update squid
-               if ( $wgUseSquid ) {
-                       $u = SquidUpdate::newFromTitles( $titleArray );
-                       $u->doUpdate();
-               }
+                       ) + Job::newRootJobParams( // "overall" refresh links job info
+                               "htmlCacheUpdate:{$this->mTable}:{$this->mTitle->getPrefixedText()}"
+                       )
+               );
 
-               # Update file cache
-               if  ( $wgUseFileCache ) {
-                       foreach ( $titleArray as $title ) {
-                               HTMLFileCache::clearFileCache( $title );
-                       }
+               $count = $this->mTitle->getBacklinkCache()->getNumLinks( $this->mTable, 200 );
+               if ( $count >= 200 ) { // many backlinks
+                       JobQueueGroup::singleton()->push( $job );
+                       JobQueueGroup::singleton()->deduplicateRootJob( $job );
+               } else { // few backlinks ($count might be off even if 0)
+                       $job->run(); // just do the purge query now
                }
-       }
-}
-
-
-/**
- * Job wrapper for HTMLCacheUpdate. Gets run whenever a related
- * job gets called from the queue.
- *
- * @ingroup JobQueue
- */
-class HTMLCacheUpdateJob extends Job {
-       var $table, $start, $end;
-
-       /**
-        * Construct a job
-        * @param $title Title: the title linked to
-        * @param $params Array: job parameters (table, start and end page_ids)
-        * @param $id Integer: job id
-        */
-       function __construct( $title, $params, $id = 0 ) {
-               parent::__construct( 'htmlCacheUpdate', $title, $params, $id );
-               $this->table = $params['table'];
-               $this->start = $params['start'];
-               $this->end = $params['end'];
-       }
 
-       public function run() {
-               $update = new HTMLCacheUpdate( $this->title, $this->table, $this->start, $this->end );
-               $update->doUpdate();
-               return true;
+               wfProfileOut( __METHOD__ );
        }
 }
index 6bfeed3..fca071a 100644 (file)
@@ -33,6 +33,7 @@ class HTMLFileCache extends FileCacheBase {
         * Construct an ObjectFileCache from a Title and an action
         * @param $title Title|string Title object or prefixed DB key string
         * @param $action string
+        * @throws MWException
         * @return HTMLFileCache
         */
        public static function newFromTitle( $title, $action ) {
index f759c02..623f545 100644 (file)
@@ -74,7 +74,7 @@ class LinkCache {
         * Get a field of a title object from cache.
         * If this link is not good, it will return NULL.
         * @param $title Title
-        * @param $field String: ('length','redirect','revision')
+        * @param $field String: ('length','redirect','revision','model')
         * @return mixed
         */
        public function getGoodLinkFieldObj( $title, $field ) {
@@ -102,14 +102,16 @@ class LinkCache {
         * @param $len Integer: text's length
         * @param $redir Integer: whether the page is a redirect
         * @param $revision Integer: latest revision's ID
+        * @param $model Integer: latest revision's content model ID
         */
-       public function addGoodLinkObj( $id, $title, $len = -1, $redir = null, $revision = false ) {
+       public function addGoodLinkObj( $id, $title, $len = -1, $redir = null, $revision = false, $model = false ) {
                $dbkey = $title->getPrefixedDbKey();
                $this->mGoodLinks[$dbkey] = intval( $id );
                $this->mGoodLinkFields[$dbkey] = array(
                        'length' => intval( $len ),
                        'redirect' => intval( $redir ),
-                       'revision' => intval( $revision ) );
+                       'revision' => intval( $revision ),
+                       'model' => intval( $model ) );
        }
 
        /**
@@ -117,7 +119,7 @@ class LinkCache {
         * @since 1.19
         * @param $title Title
         * @param $row object which has the fields page_id, page_is_redirect,
-        *  page_latest
+        *  page_latest and page_content_model
         */
        public function addGoodLinkObjFromRow( $title, $row ) {
                $dbkey = $title->getPrefixedDbKey();
@@ -126,6 +128,7 @@ class LinkCache {
                        'length' => intval( $row->page_len ),
                        'redirect' => intval( $row->page_is_redirect ),
                        'revision' => intval( $row->page_latest ),
+                       'model' => !empty( $row->page_content_model ) ? strval( $row->page_content_model ) : null,
                );
        }
 
@@ -178,7 +181,8 @@ class LinkCache {
         * @return Integer
         */
        public function addLinkObj( $nt ) {
-               global $wgAntiLockFlags;
+               global $wgAntiLockFlags, $wgContentHandlerUseDB;
+
                wfProfileIn( __METHOD__ );
 
                $key = $nt->getPrefixedDBkey();
@@ -210,8 +214,10 @@ class LinkCache {
                        $options = array();
                }
 
-               $s = $db->selectRow( 'page',
-                       array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' ),
+               $f = array( 'page_id', 'page_len', 'page_is_redirect', 'page_latest' );
+               if ( $wgContentHandlerUseDB ) $f[] = 'page_content_model';
+
+               $s = $db->selectRow( 'page', $f,
                        array( 'page_namespace' => $nt->getNamespace(), 'page_title' => $nt->getDBkey() ),
                        __METHOD__, $options );
                # Set fields...
index b854a2e..f5feaf9 100644 (file)
@@ -59,26 +59,6 @@ class MessageCache {
        /// Variable for tracking which variables are already loaded
        protected $mLoadedLanguages = array();
 
-       /**
-        * Used for automatic detection of most used messages.
-        */
-       protected $mRequestedMessages = array();
-
-       /**
-        * How long the message request counts are stored. Longer period gives
-        * better sample, but also takes longer to adapt changes. The counts
-        * are aggregrated per day, regardless of the value of this variable.
-        */
-       protected static $mAdaptiveDataAge = 604800; // Is 7*24*3600
-
-       /**
-        * Filter the tail of less used messages that are requested more seldom
-        * than this factor times the number of request of most requested message.
-        * These messages are not loaded in the default set, but are still cached
-        * individually on demand with the normal cache expiry time.
-        */
-       protected static $mAdaptiveInclusionThreshold = 0.05;
-
        /**
         * Singleton instance
         *
@@ -367,12 +347,12 @@ class MessageCache {
                }
 
                if ( !$success ) {
-                       # Bad luck... this should not happen
-                       $where[] = 'loading FAILED - cache is disabled';
-                       $info = implode( ', ', $where );
-                       wfDebug( __METHOD__ . ": Loading $code... $info\n" );
                        $this->mDisable = true;
                        $this->mCache = false;
+                       // This used to go on, but that led to lots of nasty side
+                       // effects like gadgets and sidebar getting cached with their
+                       // default content
+                       throw new MWException( "MessageCache failed to load messages" );
                } else {
                        # All good, just record the success
                        $info = implode( ', ', $where );
@@ -404,19 +384,20 @@ class MessageCache {
                );
 
                $mostused = array();
-               if ( $wgAdaptiveMessageCache ) {
-                       $mostused = $this->getMostUsedMessages();
-                       if ( $code !== $wgLanguageCode ) {
-                               foreach ( $mostused as $key => $value ) {
-                                       $mostused[$key] = "$value/$code";
-                               }
+               if ( $wgAdaptiveMessageCache && $code !== $wgLanguageCode ) {
+                       if ( !isset( $this->mCache[$wgLanguageCode] ) ) {
+                               $this->load( $wgLanguageCode );
+                       }
+                       $mostused = array_keys( $this->mCache[$wgLanguageCode] );
+                       foreach ( $mostused as $key => $value ) {
+                               $mostused[$key] = "$value/$code";
                        }
                }
 
                if ( count( $mostused ) ) {
                        $conds['page_title'] = $mostused;
                } elseif ( $code !== $wgLanguageCode ) {
-                       $conds[] = 'page_title' . $dbr->buildLike( $dbr->anyString(), "/$code" );
+                       $conds[] = 'page_title' . $dbr->buildLike( $dbr->anyString(), '/', $code );
                } else {
                        # Effectively disallows use of '/' character in NS_MEDIAWIKI for uses
                        # other than language code.
@@ -459,12 +440,6 @@ class MessageCache {
                        $cache[$row->page_title] = $entry;
                }
 
-               foreach ( $mostused as $key ) {
-                       if ( !isset( $cache[$key] ) ) {
-                               $cache[$key] = '!NONEXISTENT';
-                       }
-               }
-
                $cache['VERSION'] = MSG_CACHE_VERSION;
                wfProfileOut( __METHOD__ );
                return $cache;
@@ -596,7 +571,7 @@ class MessageCache {
         * @param $key String: the message cache key
         * @param $useDB Boolean: get the message from the DB, false to use only
         *               the localisation
-        * @param $langcode String: code of the language to get the message for, if
+        * @param bool|string $langcode Code of the language to get the message for, if
         *                  it is a valid code create a language for that language,
         *                  if it is a string but not a valid code then make a basic
         *                  language object, if it is a false boolean then use the
@@ -607,6 +582,7 @@ class MessageCache {
         * @param $isFullKey Boolean: specifies whether $key is a two part key
         *                   "msg/lang".
         *
+        * @throws MWException
         * @return string|bool
         */
        function get( $key, $useDB = true, $langcode = true, $isFullKey = false ) {
@@ -645,13 +621,6 @@ class MessageCache {
                        $uckey = $wgContLang->ucfirst( $lckey );
                }
 
-               /**
-                * Record each message request, but only once per request.
-                * This information is not used unless $wgAdaptiveMessageCache
-                * is enabled.
-                */
-               $this->mRequestedMessages[$uckey] = true;
-
                # Try the MediaWiki namespace
                if( !$this->mDisable && $useDB ) {
                        $title = $uckey;
@@ -718,8 +687,6 @@ class MessageCache {
         * @return string|bool False on failure
         */
        function getMsgFromNamespace( $title, $code ) {
-               global $wgAdaptiveMessageCache;
-
                $this->load( $code );
                if ( isset( $this->mCache[$code][$title] ) ) {
                        $entry = $this->mCache[$code][$title];
@@ -738,15 +705,7 @@ class MessageCache {
                                return $message;
                        }
 
-                       /**
-                        * If message cache is in normal mode, it is guaranteed
-                        * (except bugs) that there is always entry (or placeholder)
-                        * in the cache if message exists. Thus we can do minor
-                        * performance improvement and return false early.
-                        */
-                       if ( !$wgAdaptiveMessageCache ) {
-                               return false;
-                       }
+                       return false;
                }
 
                # Try the individual message cache
@@ -770,16 +729,32 @@ class MessageCache {
                        Title::makeTitle( NS_MEDIAWIKI, $title ), false, Revision::READ_LATEST
                );
                if ( $revision ) {
-                       $message = $revision->getText();
-                       if ($message === false) {
+                       $content = $revision->getContent();
+                       if ( !$content ) {
                                // A possibly temporary loading failure.
                                wfDebugLog( 'MessageCache', __METHOD__ . ": failed to load message page text for {$title} ($code)" );
+                               $message = null; // no negative caching
                        } else {
-                               $this->mCache[$code][$title] = ' ' . $message;
-                               $this->mMemc->set( $titleKey, ' ' . $message, $this->mExpiry );
+                               // XXX: Is this the right way to turn a Content object into a message?
+                               // NOTE: $content is typically either WikitextContent, JavaScriptContent or CssContent.
+                               //       MessageContent is *not* used for storing messages, it's only used for wrapping them when needed.
+                               $message = $content->getWikitextForTransclusion();
+
+                               if ( $message === false || $message === null ) {
+                                       wfDebugLog( 'MessageCache', __METHOD__ . ": message content doesn't provide wikitext "
+                                                               . "(content model: " . $content->getContentHandler() . ")" );
+
+                                       $message = false; // negative caching
+                               } else {
+                                       $this->mCache[$code][$title] = ' ' . $message;
+                                       $this->mMemc->set( $titleKey, ' ' . $message, $this->mExpiry );
+                               }
                        }
                } else {
-                       $message = false;
+                       $message = false; // negative caching
+               }
+
+               if ( $message === false ) { // negative caching
                        $this->mCache[$code][$title] = '!NONEXISTENT';
                        $this->mMemc->set( $titleKey, '!NONEXISTENT', $this->mExpiry );
                }
@@ -845,7 +820,7 @@ class MessageCache {
         * @param $linestart bool
         * @param $interface bool
         * @param $language
-        * @return ParserOutput
+        * @return ParserOutput|string
         */
        public function parse( $text, $title = null, $linestart = true, $interface = false, $language = null  ) {
                if ( $this->mInParser ) {
@@ -890,7 +865,7 @@ class MessageCache {
         */
        function clear() {
                $langs = Language::fetchLanguageNames( null, 'mw' );
-               foreach ( array_keys($langs) as $code ) {
+               foreach ( array_keys( $langs ) as $code ) {
                        # Global cache
                        $this->mMemc->delete( wfMemcKey( 'messages', $code ) );
                        # Invalidate all local caches
@@ -919,82 +894,6 @@ class MessageCache {
                return array( $message, $lang );
        }
 
-       public static function logMessages() {
-               wfProfileIn( __METHOD__ );
-               global $wgAdaptiveMessageCache;
-               if ( !$wgAdaptiveMessageCache || !self::$instance instanceof MessageCache ) {
-                       wfProfileOut( __METHOD__ );
-                       return;
-               }
-
-               $cachekey = wfMemckey( 'message-profiling' );
-               $cache = wfGetCache( CACHE_DB );
-               $data = $cache->get( $cachekey );
-
-               if ( !$data ) {
-                       $data = array();
-               }
-
-               $age = self::$mAdaptiveDataAge;
-               $filterDate = substr( wfTimestamp( TS_MW, time() - $age ), 0, 8 );
-               foreach ( array_keys( $data ) as $key ) {
-                       if ( $key < $filterDate ) {
-                               unset( $data[$key] );
-                       }
-               }
-
-               $index = substr( wfTimestampNow(), 0, 8 );
-               if ( !isset( $data[$index] ) ) {
-                       $data[$index] = array();
-               }
-
-               foreach ( self::$instance->mRequestedMessages as $message => $_ ) {
-                       if ( !isset( $data[$index][$message] ) ) {
-                               $data[$index][$message] = 0;
-                       }
-                       $data[$index][$message]++;
-               }
-
-               $cache->set( $cachekey, $data );
-               wfProfileOut( __METHOD__ );
-       }
-
-       /**
-        * @return array
-        */
-       public function getMostUsedMessages() {
-               wfProfileIn( __METHOD__ );
-               $cachekey = wfMemcKey( 'message-profiling' );
-               $cache = wfGetCache( CACHE_DB );
-               $data = $cache->get( $cachekey );
-               if ( !$data ) {
-                       wfProfileOut( __METHOD__ );
-                       return array();
-               }
-
-               $list = array();
-
-               foreach( $data as $messages ) {
-                       foreach( $messages as $message => $count ) {
-                               $key = $message;
-                               if ( !isset( $list[$key] ) ) {
-                                       $list[$key] = 0;
-                               }
-                               $list[$key] += $count;
-                       }
-               }
-
-               $max = max( $list );
-               foreach ( $list as $message => $count ) {
-                       if ( $count < intval( $max * self::$mAdaptiveInclusionThreshold ) ) {
-                               unset( $list[$message] );
-                       }
-               }
-
-               wfProfileOut( __METHOD__ );
-               return array_keys( $list );
-       }
-
        /**
         * Get all message keys stored in the message cache for a given language.
         * If $code is the content language code, this will return all message keys
index f215ebd..76c76f3 100644 (file)
@@ -28,6 +28,8 @@
 class ProcessCacheLRU {
        /** @var Array */
        protected $cache = array(); // (key => prop => value)
+       /** @var Array */
+       protected $cacheTimes = array(); // (key => prop => UNIX timestamp)
 
        protected $maxCacheKeys; // integer; max entries
 
@@ -44,7 +46,7 @@ class ProcessCacheLRU {
 
        /**
         * Set a property field for a cache entry.
-        * This will prune the cache if it gets too large.
+        * This will prune the cache if it gets too large based on LRU.
         * If the item is already set, it will be pushed to the top of the cache.
         *
         * @param $key string
@@ -57,9 +59,12 @@ class ProcessCacheLRU {
                        $this->ping( $key ); // push to top
                } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
                        reset( $this->cache );
-                       unset( $this->cache[key( $this->cache )] );
+                       $evictKey = key( $this->cache );
+                       unset( $this->cache[$evictKey] );
+                       unset( $this->cacheTimes[$evictKey] );
                }
                $this->cache[$key][$prop] = $value;
+               $this->cacheTimes[$key][$prop] = time();
        }
 
        /**
@@ -67,10 +72,14 @@ class ProcessCacheLRU {
         *
         * @param $key string
         * @param $prop string
+        * @param $maxAge integer Ignore items older than this many seconds (since 1.21)
         * @return bool
         */
-       public function has( $key, $prop ) {
-               return isset( $this->cache[$key][$prop] );
+       public function has( $key, $prop, $maxAge = 0 ) {
+               if ( isset( $this->cache[$key][$prop] ) ) {
+                       return ( $maxAge <= 0 || ( time() - $this->cacheTimes[$key][$prop] ) <= $maxAge );
+               }
+               return false;
        }
 
        /**
@@ -100,9 +109,11 @@ class ProcessCacheLRU {
        public function clear( $keys = null ) {
                if ( $keys === null ) {
                        $this->cache = array();
+                       $this->cacheTimes = array();
                } else {
                        foreach ( (array)$keys as $key ) {
                                unset( $this->cache[$key] );
+                               unset( $this->cacheTimes[$key] );
                        }
                }
        }
index 423e388..6b48fa4 100644 (file)
@@ -129,6 +129,8 @@ class SquidUpdate {
                        return;
                }
 
+               wfDebug( "Squid purge: " . implode( ' ', $urlArr ) . "\n" );
+
                if ( $wgHTCPMulticastRouting ) {
                        SquidUpdate::HTCPPurge( $urlArr );
                }
@@ -249,7 +251,7 @@ class SquidUpdate {
        static function expand( $url ) {
                return wfExpandUrl( $url, PROTO_INTERNAL );
        }
-       
+
        /**
         * Find the HTCP routing rule to use for a given URL.
         * @param $url string URL to match
@@ -264,5 +266,4 @@ class SquidUpdate {
                }
                return false;
        }
-       
 }
diff --git a/includes/conf/Conf.php b/includes/conf/Conf.php
deleted file mode 100644 (file)
index 93204ea..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-<?php
-/**
- * Base configuration class.
- *
- * Get some configuration variable:
- *   $mySetting = Conf::get( 'mySetting' );
- *
- * Copyright © 2011 Chad Horohoe <chadh@wikimedia.org>
- * 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
- * (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 Config Config
- */
-abstract class Conf {
-       /**
-        * A special value to return when default config items do not exist. Use
-        * this to differentiate from 'null' which may be a valid config value.
-        *
-        * Please don't ever make this a default (or accepted) value for your
-        * configuration. It's liable to Break Something.
-        */
-       const NO_SUCH_DEFAULT_CONFIG = 'mw-no-such-default-config';
-
-       /**
-        * The Wiki ID (usually $wgDBname)
-        * @var String
-        */
-       private $wikiId;
-
-       /**
-        * Singleton
-        * @var Conf
-        */
-       private static $__instance;
-
-       /**
-        * Stores of the core defaults, extension defaults and wiki overrides
-        *
-        * @var array
-        */
-       protected $defaults, $extensionDefaults, $values = array();
-
-       /**
-        * Constructor. Children should call this if implementing.
-        * @param $confConfig Array of config vars
-        */
-       protected function __construct( $confConfig ) {
-               $this->wikiId = $confConfig['wikiId'];
-               $this->defaults = (array)(new DefaultSettings);
-               // @todo implement this:
-               // $this->initExtensionDefaults();
-               $this->initChangedSettings();
-               if( isset( $confConfig['exposeGlobals'] ) ) {
-                       $this->exposeGlobals();
-               }
-       }
-
-       /**
-        * Expose all config variables as globals for back-compat. Ewwww.
-        */
-       private function exposeGlobals() {
-               $allVars = $this->defaults + $this->extensionDefaults + $this->values;
-               foreach( $allVars as $name => $value ) {
-                       $var = 'wg' . ucfirst( $name );
-                       $GLOBALS[$var] = $value;
-               }
-       }
-
-       /**
-        * Load customized settings from whatever the data store is
-        */
-       abstract protected function initChangedSettings();
-
-       /**
-        * Apply a setting to the backend store
-        * @param $name String Name of the setting
-        * @param $value mixed Value to store
-        */
-       abstract protected function writeSetting( $name, $value );
-
-       /**
-        * Initialize a new child class based on a configuration array
-        * @param $conf Array of configuration settings, see $wgConfiguration
-        *   for details
-        * @return Conf
-        */
-       private static function newFromSettings( $conf ) {
-               $class = ucfirst( $conf['type'] ) . 'Conf';
-               if( !class_exists( $class ) ) {
-                       throw new MWException( '$wgConfiguration misconfigured with invalid "type"' );
-               }
-               return new $class( $conf );
-       }
-
-       /**
-        * Get the singleton if we don't want a specific wiki
-        * @param $wiki String An id for a remote wiki
-        * @return Conf child
-        */
-       public static function load( $wiki = false ) {
-               throw new MWException( "Not working yet, don't attempt to use this" );
-               if( !self::$__instance ) {
-                       /**global $wgConfiguration;
-                       self::$__instance = self::newFromSettings( $wgConfiguration );*/
-               }
-               if( $wiki && $wiki != self::$__instance->getWikiId() ) {
-                       // Load configuration for a different wiki, not sure how
-                       // we're gonna do this yet
-                       return null;
-               }
-               return self::$__instance;
-       }
-
-       /**
-        * Get a property from the configuration database, falling back
-        * to DefaultSettings if undefined
-        * @param $name String Name of setting to retrieve.
-        * @param $wiki String An id for a remote wiki
-        * @return mixed
-        */
-       public static function get( $name, $wiki = false ) {
-               return self::load( $wiki )->retrieveSetting( $name );
-       }
-
-       /**
-        * Actually get the setting, checking overrides, extensions, then core.
-        *
-        * @param $name String Name of setting to get
-        * @return mixed
-        */
-       public function retrieveSetting( $name ) {
-               // isset() is ok here, because the default is to return null anyway.
-               if( isset( $this->values[$name] ) ) {
-                       return $this->values[$name];
-               } elseif( isset( $this->extensionDefaults[$name] ) ) {
-                       return $this->extensionDefaults[$name];
-               } elseif( isset( $this->defaults[$name] ) ) {
-                       return $this->defaults[$name];
-               } else {
-                       wfDebug( __METHOD__ . " called for unknown configuration item '$name'\n" );
-                       return null;
-               }
-       }
-
-       /**
-        * Apply a setting to the configuration object.
-        * @param $name String Name of the config item
-        * @param $value mixed Any value to use for the key
-        * @param $write bool Whether to write to the static copy (db, file, etc)
-        */
-       public function applySetting( $name, $value, $write = false ) {
-               $this->values[$name] = $value;
-               if( $write && ( $value !== $this->getDefaultSetting( $name ) ) ) {
-                       $this->writeSetting( $name, $value );
-               }
-       }
-
-       /**
-        * Get the default for a given setting name. Check core and then extensions.
-        * Will return NO_SUCH_DEFAULT_CONFIG if the config item does not exist.
-        *
-        * @param $name String Name of setting
-        * @return mixed
-        */
-       public function getDefaultSetting( $name ) {
-               // Use array_key_exists() here, to make sure we return a default
-               // that's really set to null.
-               if( array_key_exists( $name, $this->defaults ) ) {
-                       return $this->defaults[$name];
-               } elseif( array_key_exists( $name, $this->extensionDefaults ) ) {
-                       return $this->extensionDefaults[$name];
-               } else {
-                       wfDebug( __METHOD__ . " called for unknown configuration item '$name'\n" );
-                       return self::NO_SUCH_DEFAULT_CONFIG;
-               }
-       }
-
-       /**
-        * What is the wiki ID for this site?
-        * @return String
-        */
-       public function getWikiId() {
-               return $this->wikiId;
-       }
-}
diff --git a/includes/conf/DatabaseConf.php b/includes/conf/DatabaseConf.php
deleted file mode 100644 (file)
index e2e36ce..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-/**
- * Database configuration class
- *
- * Copyright © 2011 Chad Horohoe <chadh@wikimedia.org>
- * 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
- * (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 Config
- */
-class DatabaseConf extends Conf {
-       /**
-        * @see Conf::initChangedSettings()
-        */
-       protected function initChangedSettings() {
-               $res = wfGetDB( DB_MASTER )->select( 'config', '*', array(), __METHOD__ );
-               foreach( $res as $row ) {
-                       $this->values[$row->cf_name] = unserialize( $row->cf_value );
-               }
-       }
-
-       /**
-        * @see Conf::writeSetting()
-        *
-        * @param $name
-        * @param $value
-        * 
-        * @return bool
-        */
-       protected function writeSetting( $name, $value ) {
-               $dbw = wfGetDB( DB_MASTER );
-               $value = serialize( $value );
-               if( $dbw->selectRow( 'config', 'cf_name', array( 'cf_name' => $name ), __METHOD__ ) ) {
-                       $dbw->update( 'config', array( 'cf_value' => $value ),
-                               array( 'cf_name' => $name ), __METHOD__ );
-               } else {
-                       $dbw->insert( 'config',
-                               array( 'cf_name' => $name, 'cf_value' => $value ), __METHOD__ );
-               }
-               return (bool)$dbw->affectedRows();
-       }
-}
diff --git a/includes/conf/DefaultSettings.php b/includes/conf/DefaultSettings.php
deleted file mode 100644 (file)
index 4601f04..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-/**
- * Utility class for holding all of our default settings.
- *
- * Copyright © 2011 Chad Horohoe <chadh@wikimedia.org>
- * 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
- * (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 Config
- */
-final class DefaultSettings {
-       public $mySetting = 'defaultValue';
-}
diff --git a/includes/content/AbstractContent.php b/includes/content/AbstractContent.php
new file mode 100644 (file)
index 0000000..386f55a
--- /dev/null
@@ -0,0 +1,440 @@
+<?php
+/**
+ * A content object represents page content, e.g. the text to show on a page.
+ * Content objects have no knowledge about how they relate to Wiki pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+abstract class AbstractContent implements Content {
+
+       /**
+        * Name of the content model this Content object represents.
+        * Use with CONTENT_MODEL_XXX constants
+        *
+        * @since 1.21
+        *
+        * @var string $model_id
+        */
+       protected $model_id;
+
+       /**
+        * @param string|null $modelId
+        *
+        * @since 1.21
+        */
+       public function __construct( $modelId = null ) {
+               $this->model_id = $modelId;
+       }
+
+       /**
+        * @see Content::getModel
+        *
+        * @since 1.21
+        */
+       public function getModel() {
+               return $this->model_id;
+       }
+
+       /**
+        * Throws an MWException if $model_id is not the id of the content model
+        * supported by this Content object.
+        *
+        * @since 1.21
+        *
+        * @param string $modelId The model to check
+        *
+        * @throws MWException
+        */
+       protected function checkModelID( $modelId ) {
+               if ( $modelId !== $this->model_id ) {
+                       throw new MWException(
+                               "Bad content model: " .
+                               "expected {$this->model_id}  " .
+                               "but got $modelId."
+                       );
+               }
+       }
+
+       /**
+        * @see Content::getContentHandler
+        *
+        * @since 1.21
+        */
+       public function getContentHandler() {
+               return ContentHandler::getForContent( $this );
+       }
+
+       /**
+        * @see Content::getDefaultFormat
+        *
+        * @since 1.21
+        */
+       public function getDefaultFormat() {
+               return $this->getContentHandler()->getDefaultFormat();
+       }
+
+       /**
+        * @see Content::getSupportedFormats
+        *
+        * @since 1.21
+        */
+       public function getSupportedFormats() {
+               return $this->getContentHandler()->getSupportedFormats();
+       }
+
+       /**
+        * @see Content::isSupportedFormat
+        *
+        * @param string $format
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function isSupportedFormat( $format ) {
+               if ( !$format ) {
+                       return true; // this means "use the default"
+               }
+
+               return $this->getContentHandler()->isSupportedFormat( $format );
+       }
+
+       /**
+        * Throws an MWException if $this->isSupportedFormat( $format ) does not
+        * return true.
+        *
+        * @since 1.21
+        *
+        * @param string $format
+        * @throws MWException
+        */
+       protected function checkFormat( $format ) {
+               if ( !$this->isSupportedFormat( $format ) ) {
+                       throw new MWException(
+                               "Format $format is not supported for content model " .
+                               $this->getModel()
+                       );
+               }
+       }
+
+       /**
+        * @see Content::serialize
+        *
+        * @param string|null $format
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function serialize( $format = null ) {
+               return $this->getContentHandler()->serializeContent( $this, $format );
+       }
+
+       /**
+        * @see Content::isEmpty
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function isEmpty() {
+               return $this->getSize() === 0;
+       }
+
+       /**
+        * @see Content::isValid
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function isValid() {
+               return true;
+       }
+
+       /**
+        * @see Content::equals
+        *
+        * @since 1.21
+        *
+        * @param Content|null $that
+        *
+        * @return boolean
+        */
+       public function equals( Content $that = null ) {
+               if ( is_null( $that ) ) {
+                       return false;
+               }
+
+               if ( $that === $this ) {
+                       return true;
+               }
+
+               if ( $that->getModel() !== $this->getModel() ) {
+                       return false;
+               }
+
+               return $this->getNativeData() === $that->getNativeData();
+       }
+
+
+       /**
+        * Returns a list of DataUpdate objects for recording information about this
+        * Content in some secondary data store.
+        *
+        * This default implementation calls
+        * $this->getParserOutput( $content, $title, null, null, false ),
+        * and then calls getSecondaryDataUpdates( $title, $recursive ) on the
+        * resulting ParserOutput object.
+        *
+        * Subclasses may override this to determine the secondary data updates more
+        * efficiently, preferrably without the need to generate a parser output object.
+        *
+        * @see Content::getSecondaryDataUpdates()
+        *
+        * @param $title Title The context for determining the necessary updates
+        * @param $old Content|null An optional Content object representing the
+        *    previous content, i.e. the content being replaced by this Content
+        *    object.
+        * @param $recursive boolean Whether to include recursive updates (default:
+        *    false).
+        * @param $parserOutput ParserOutput|null Optional ParserOutput object.
+        *    Provide if you have one handy, to avoid re-parsing of the content.
+        *
+        * @return Array. A list of DataUpdate objects for putting information
+        *    about this content object somewhere.
+        *
+        * @since 1.21
+        */
+       public function getSecondaryDataUpdates( Title $title,
+               Content $old = null,
+               $recursive = true, ParserOutput $parserOutput = null
+       ) {
+               if ( !$parserOutput ) {
+                       $parserOutput = $this->getParserOutput( $title, null, null, false );
+               }
+
+               return $parserOutput->getSecondaryDataUpdates( $title, $recursive );
+       }
+
+
+       /**
+        * @see Content::getRedirectChain
+        *
+        * @since 1.21
+        */
+       public function getRedirectChain() {
+               global $wgMaxRedirects;
+               $title = $this->getRedirectTarget();
+               if ( is_null( $title ) ) {
+                       return null;
+               }
+               // recursive check to follow double redirects
+               $recurse = $wgMaxRedirects;
+               $titles = array( $title );
+               while ( --$recurse > 0 ) {
+                       if ( $title->isRedirect() ) {
+                               $page = WikiPage::factory( $title );
+                               $newtitle = $page->getRedirectTarget();
+                       } else {
+                               break;
+                       }
+                       // Redirects to some special pages are not permitted
+                       if ( $newtitle instanceOf Title && $newtitle->isValidRedirectTarget() ) {
+                               // The new title passes the checks, so make that our current
+                               // title so that further recursion can be checked
+                               $title = $newtitle;
+                               $titles[] = $newtitle;
+                       } else {
+                               break;
+                       }
+               }
+               return $titles;
+       }
+
+       /**
+        * @see Content::getRedirectTarget
+        *
+        * @since 1.21
+        */
+       public function getRedirectTarget() {
+               return null;
+       }
+
+       /**
+        * @see Content::getUltimateRedirectTarget
+        * @note: migrated here from Title::newFromRedirectRecurse
+        *
+        * @since 1.21
+        */
+       public function getUltimateRedirectTarget() {
+               $titles = $this->getRedirectChain();
+               return $titles ? array_pop( $titles ) : null;
+       }
+
+       /**
+        * @see Content::isRedirect
+        *
+        * @since 1.21
+        *
+        * @return bool
+        */
+       public function isRedirect() {
+               return $this->getRedirectTarget() !== null;
+       }
+
+       /**
+        * @see Content::updateRedirect
+        *
+        * This default implementation always returns $this.
+        *
+        * @param Title $target
+        *
+        * @since 1.21
+        *
+        * @return Content $this
+        */
+       public function updateRedirect( Title $target ) {
+               return $this;
+       }
+
+       /**
+        * @see Content::getSection
+        *
+        * @since 1.21
+        */
+       public function getSection( $sectionId ) {
+               return null;
+       }
+
+       /**
+        * @see Content::replaceSection
+        *
+        * @since 1.21
+        */
+       public function replaceSection( $section, Content $with, $sectionTitle = ''  ) {
+               return null;
+       }
+
+       /**
+        * @see Content::preSaveTransform
+        *
+        * @since 1.21
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               return $this;
+       }
+
+       /**
+        * @see Content::addSectionHeader
+        *
+        * @since 1.21
+        */
+       public function addSectionHeader( $header ) {
+               return $this;
+       }
+
+       /**
+        * @see Content::preloadTransform
+        *
+        * @since 1.21
+        */
+       public function preloadTransform( Title $title, ParserOptions $popts ) {
+               return $this;
+       }
+
+       /**
+        * @see Content::prepareSave
+        *
+        * @since 1.21
+        */
+       public function prepareSave( WikiPage $page, $flags, $baseRevId, User $user ) {
+               if ( $this->isValid() ) {
+                       return Status::newGood();
+               } else {
+                       return Status::newFatal( "invalid-content-data" );
+               }
+       }
+
+       /**
+        * @see Content::getDeletionUpdates
+        *
+        * @since 1.21
+        *
+        * @param $page WikiPage the deleted page
+        * @param $parserOutput null|ParserOutput optional parser output object
+        *    for efficient access to meta-information about the content object.
+        *    Provide if you have one handy.
+        *
+        * @return array A list of DataUpdate instances that will clean up the
+        *    database after deletion.
+        */
+       public function getDeletionUpdates( WikiPage $page,
+               ParserOutput $parserOutput = null )
+       {
+               return array(
+                       new LinksDeletionUpdate( $page ),
+               );
+       }
+
+       /**
+        * This default implementation always returns false. Subclasses may override this to supply matching logic.
+        *
+        * @see Content::matchMagicWord
+        *
+        * @since 1.21
+        *
+        * @param MagicWord $word
+        *
+        * @return bool
+        */
+       public function matchMagicWord( MagicWord $word ) {
+               return false;
+       }
+
+       /**
+        * @see Content::convert()
+        *
+        * This base implementation calls the hook ConvertContent to enable custom conversions.
+        * Subclasses may override this to implement conversion for "their" content model.
+        *
+        * @param String  $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
+        * @param String  $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
+        * not allowed, full round-trip conversion is expected to work without losing information.
+        *
+        * @return Content|bool A content object with the content model $toModel, or false if
+        * that conversion is not supported.
+        */
+       public function convert( $toModel, $lossy = '' ) {
+               if ( $this->getModel() === $toModel ) {
+                       //nothing to do, shorten out.
+                       return $this;
+               }
+
+               $lossy = ( $lossy === 'lossy' ); // string flag, convert to boolean for convenience
+               $result = false;
+
+               wfRunHooks( 'ConvertContent', array( $this, $toModel, $lossy, &$result ) );
+               return $result;
+       }
+}
diff --git a/includes/content/Content.php b/includes/content/Content.php
new file mode 100644 (file)
index 0000000..35b51c3
--- /dev/null
@@ -0,0 +1,502 @@
+<?php
+/**
+ * A content object represents page content, e.g. the text to show on a page.
+ * Content objects have no knowledge about how they relate to wiki pages.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+interface Content {
+
+       /**
+        * @since 1.21
+        *
+        * @return string A string representing the content in a way useful for
+        *   building a full text search index. If no useful representation exists,
+        *   this method returns an empty string.
+        *
+        * @todo: test that this actually works
+        * @todo: make sure this also works with LuceneSearch / WikiSearch
+        */
+       public function getTextForSearchIndex();
+
+       /**
+        * @since 1.21
+        *
+        * @return string|false The wikitext to include when another page includes this
+        * content, or false if the content is not includable in a wikitext page.
+        *
+        * @todo allow native handling, bypassing wikitext representation, like
+        *    for includable special pages.
+        * @todo allow transclusion into other content models than Wikitext!
+        * @todo used in WikiPage and MessageCache to get message text. Not so
+        *    nice. What should we use instead?!
+        */
+       public function getWikitextForTransclusion();
+
+       /**
+        * Returns a textual representation of the content suitable for use in edit
+        * summaries and log messages.
+        *
+        * @since 1.21
+        *
+        * @param $maxLength int Maximum length of the summary text
+        * @return string The summary text
+        */
+       public function getTextForSummary( $maxLength = 250 );
+
+       /**
+        * Returns native representation of the data. Interpretation depends on
+        * the data model used, as given by getDataModel().
+        *
+        * @since 1.21
+        *
+        * @return mixed The native representation of the content. Could be a
+        *    string, a nested array structure, an object, a binary blob...
+        *    anything, really.
+        *
+        * @note Caller must be aware of content model!
+        */
+       public function getNativeData();
+
+       /**
+        * Returns the content's nominal size in bogo-bytes.
+        *
+        * @return int
+        */
+       public function getSize();
+
+       /**
+        * Returns the ID of the content model used by this Content object.
+        * Corresponds to the CONTENT_MODEL_XXX constants.
+        *
+        * @since 1.21
+        *
+        * @return String The model id
+        */
+       public function getModel();
+
+       /**
+        * Convenience method that returns the ContentHandler singleton for handling
+        * the content model that this Content object uses.
+        *
+        * Shorthand for ContentHandler::getForContent( $this )
+        *
+        * @since 1.21
+        *
+        * @return ContentHandler
+        */
+       public function getContentHandler();
+
+       /**
+        * Convenience method that returns the default serialization format for the
+        * content model that this Content object uses.
+        *
+        * Shorthand for $this->getContentHandler()->getDefaultFormat()
+        *
+        * @since 1.21
+        *
+        * @return String
+        */
+       public function getDefaultFormat();
+
+       /**
+        * Convenience method that returns the list of serialization formats
+        * supported for the content model that this Content object uses.
+        *
+        * Shorthand for $this->getContentHandler()->getSupportedFormats()
+        *
+        * @since 1.21
+        *
+        * @return Array of supported serialization formats
+        */
+       public function getSupportedFormats();
+
+       /**
+        * Returns true if $format is a supported serialization format for this
+        * Content object, false if it isn't.
+        *
+        * Note that this should always return true if $format is null, because null
+        * stands for the default serialization.
+        *
+        * Shorthand for $this->getContentHandler()->isSupportedFormat( $format )
+        *
+        * @since 1.21
+        *
+        * @param $format string The format to check
+        * @return bool Whether the format is supported
+        */
+       public function isSupportedFormat( $format );
+
+       /**
+        * Convenience method for serializing this Content object.
+        *
+        * Shorthand for $this->getContentHandler()->serializeContent( $this, $format )
+        *
+        * @since 1.21
+        *
+        * @param $format null|string The desired serialization format (or null for
+        *    the default format).
+        * @return string Serialized form of this Content object
+        */
+       public function serialize( $format = null );
+
+       /**
+        * Returns true if this Content object represents empty content.
+        *
+        * @since 1.21
+        *
+        * @return bool Whether this Content object is empty
+        */
+       public function isEmpty();
+
+       /**
+        * Returns whether the content is valid. This is intended for local validity
+        * checks, not considering global consistency.
+        *
+        * Content needs to be valid before it can be saved.
+        *
+        * This default implementation always returns true.
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function isValid();
+
+       /**
+        * Returns true if this Content objects is conceptually equivalent to the
+        * given Content object.
+        *
+        * Contract:
+        *
+        * - Will return false if $that is null.
+        * - Will return true if $that === $this.
+        * - Will return false if $that->getModel() != $this->getModel().
+        * - Will return false if $that->getNativeData() is not equal to $this->getNativeData(),
+        *   where the meaning of "equal" depends on the actual data model.
+        *
+        * Implementations should be careful to make equals() transitive and reflexive:
+        *
+        * - $a->equals( $b ) <=> $b->equals( $a )
+        * - $a->equals( $b ) &&  $b->equals( $c ) ==> $a->equals( $c )
+        *
+        * @since 1.21
+        *
+        * @param $that Content The Content object to compare to
+        * @return bool True if this Content object is equal to $that, false otherwise.
+        */
+       public function equals( Content $that = null );
+
+       /**
+        * Return a copy of this Content object. The following must be true for the
+        * object returned:
+        *
+        * if $copy = $original->copy()
+        *
+        * - get_class($original) === get_class($copy)
+        * - $original->getModel() === $copy->getModel()
+        * - $original->equals( $copy )
+        *
+        * If and only if the Content object is immutable, the copy() method can and
+        * should return $this. That is, $copy === $original may be true, but only
+        * for immutable content objects.
+        *
+        * @since 1.21
+        *
+        * @return Content. A copy of this object
+        */
+       public function copy( );
+
+       /**
+        * Returns true if this content is countable as a "real" wiki page, provided
+        * that it's also in a countable location (e.g. a current revision in the
+        * main namespace).
+        *
+        * @since 1.21
+        *
+        * @param $hasLinks Bool: If it is known whether this content contains
+        *    links, provide this information here, to avoid redundant parsing to
+        *    find out.
+        * @return boolean
+        */
+       public function isCountable( $hasLinks = null );
+
+       /**
+        * Parse the Content object and generate a ParserOutput from the result.
+        * $result->getText() can be used to obtain the generated HTML. If no HTML
+        * is needed, $generateHtml can be set to false; in that case,
+        * $result->getText() may return null.
+        *
+        * @param $title Title The page title to use as a context for rendering
+        * @param $revId null|int The revision being rendered (optional)
+        * @param $options null|ParserOptions Any parser options
+        * @param $generateHtml Boolean Whether to generate HTML (default: true). If false,
+        *        the result of calling getText() on the ParserOutput object returned by
+        *        this method is undefined.
+        *
+        * @since 1.21
+        *
+        * @return ParserOutput
+        */
+       public function getParserOutput( Title $title,
+               $revId = null,
+               ParserOptions $options = null, $generateHtml = true );
+       // TODO: make RenderOutput and RenderOptions base classes
+
+       /**
+        * Returns a list of DataUpdate objects for recording information about this
+        * Content in some secondary data store. If the optional second argument,
+        * $old, is given, the updates may model only the changes that need to be
+        * made to replace information about the old content with information about
+        * the new content.
+        *
+        * This default implementation calls
+        * $this->getParserOutput( $content, $title, null, null, false ),
+        * and then calls getSecondaryDataUpdates( $title, $recursive ) on the
+        * resulting ParserOutput object.
+        *
+        * Subclasses may implement this to determine the necessary updates more
+        * efficiently, or make use of information about the old content.
+        *
+        * @param $title Title The context for determining the necessary updates
+        * @param $old Content|null An optional Content object representing the
+        *    previous content, i.e. the content being replaced by this Content
+        *    object.
+        * @param $recursive boolean Whether to include recursive updates (default:
+        *    false).
+        * @param $parserOutput ParserOutput|null Optional ParserOutput object.
+        *    Provide if you have one handy, to avoid re-parsing of the content.
+        *
+        * @return Array. A list of DataUpdate objects for putting information
+        *    about this content object somewhere.
+        *
+        * @since 1.21
+        */
+       public function getSecondaryDataUpdates( Title $title,
+               Content $old = null,
+               $recursive = true, ParserOutput $parserOutput = null
+       );
+
+       /**
+        * Construct the redirect destination from this content and return an
+        * array of Titles, or null if this content doesn't represent a redirect.
+        * The last element in the array is the final destination after all redirects
+        * have been resolved (up to $wgMaxRedirects times).
+        *
+        * @since 1.21
+        *
+        * @return Array of Titles, with the destination last
+        */
+       public function getRedirectChain();
+
+       /**
+        * Construct the redirect destination from this content and return a Title,
+        * or null if this content doesn't represent a redirect.
+        * This will only return the immediate redirect target, useful for
+        * the redirect table and other checks that don't need full recursion.
+        *
+        * @since 1.21
+        *
+        * @return Title: The corresponding Title
+        */
+       public function getRedirectTarget();
+
+       /**
+        * Construct the redirect destination from this content and return the
+        * Title, or null if this content doesn't represent a redirect.
+        *
+        * This will recurse down $wgMaxRedirects times or until a non-redirect
+        * target is hit in order to provide (hopefully) the Title of the final
+        * destination instead of another redirect.
+        *
+        * There is usually no need to override the default behaviour, subclasses that
+        * want to implement redirects should override getRedirectTarget().
+        *
+        * @since 1.21
+        *
+        * @return Title
+        */
+       public function getUltimateRedirectTarget();
+
+       /**
+        * Returns whether this Content represents a redirect.
+        * Shorthand for getRedirectTarget() !== null.
+        *
+        * @since 1.21
+        *
+        * @return bool
+        */
+       public function isRedirect();
+
+       /**
+        * If this Content object is a redirect, this method updates the redirect target.
+        * Otherwise, it does nothing.
+        *
+        * @since 1.21
+        *
+        * @param Title $target the new redirect target
+        *
+        * @return Content a new Content object with the updated redirect (or $this if this Content object isn't a redirect)
+        */
+       public function updateRedirect( Title $target );
+
+       /**
+        * Returns the section with the given ID.
+        *
+        * @since 1.21
+        *
+        * @param $sectionId string The section's ID, given as a numeric string.
+        *    The ID "0" retrieves the section before the first heading, "1" the
+        *    text between the first heading (included) and the second heading
+        *    (excluded), etc.
+        * @return Content|Boolean|null The section, or false if no such section
+        *    exist, or null if sections are not supported.
+        */
+       public function getSection( $sectionId );
+
+       /**
+        * Replaces a section of the content and returns a Content object with the
+        * section replaced.
+        *
+        * @since 1.21
+        *
+        * @param $section null/false or a section number (0, 1, 2, T1, T2...), or "new"
+        * @param $with Content: new content of the section
+        * @param $sectionTitle String: new section's subject, only if $section is 'new'
+        * @return string Complete article text, or null if error
+        */
+       public function replaceSection( $section, Content $with, $sectionTitle = ''  );
+
+       /**
+        * Returns a Content object with pre-save transformations applied (or this
+        * object if no transformations apply).
+        *
+        * @since 1.21
+        *
+        * @param $title Title
+        * @param $user User
+        * @param $parserOptions null|ParserOptions
+        * @return Content
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $parserOptions );
+
+       /**
+        * Returns a new WikitextContent object with the given section heading
+        * prepended, if supported. The default implementation just returns this
+        * Content object unmodified, ignoring the section header.
+        *
+        * @since 1.21
+        *
+        * @param $header string
+        * @return Content
+        */
+       public function addSectionHeader( $header );
+
+       /**
+        * Returns a Content object with preload transformations applied (or this
+        * object if no transformations apply).
+        *
+        * @since 1.21
+        *
+        * @param $title Title
+        * @param $parserOptions null|ParserOptions
+        * @return Content
+        */
+       public function preloadTransform( Title $title, ParserOptions $parserOptions );
+
+       /**
+        * Prepare Content for saving. Called before Content is saved by WikiPage::doEditContent() and in
+        * similar places.
+        *
+        * This may be used to check the content's consistency with global state. This function should
+        * NOT write any information to the database.
+        *
+        * Note that this method will usually be called inside the same transaction bracket that will be used
+        * to save the new revision.
+        *
+        * Note that this method is called before any update to the page table is performed. This means that
+        * $page may not yet know a page ID.
+        *
+        * @since 1.21
+        *
+        * @param WikiPage $page The page to be saved.
+        * @param int      $flags bitfield for use with EDIT_XXX constants, see WikiPage::doEditContent()
+        * @param int      $baseRevId the ID of the current revision
+        * @param User     $user
+        *
+        * @return Status A status object indicating whether the content was successfully prepared for saving.
+        *                If the returned status indicates an error, a rollback will be performed and the
+        *                transaction aborted.
+        *
+        * @see see WikiPage::doEditContent()
+        */
+       public function prepareSave( WikiPage $page, $flags, $baseRevId, User $user );
+
+       /**
+        * Returns a list of updates to perform when this content is deleted.
+        * The necessary updates may be taken from the Content object, or depend on
+        * the current state of the database.
+        *
+        * @since 1.21
+        *
+        * @param $page WikiPage the deleted page
+        * @param $parserOutput null|ParserOutput optional parser output object
+        *    for efficient access to meta-information about the content object.
+        *    Provide if you have one handy.
+        *
+        * @return array A list of DataUpdate instances that will clean up the
+        *    database after deletion.
+        */
+       public function getDeletionUpdates( WikiPage $page,
+               ParserOutput $parserOutput = null );
+
+       /**
+        * Returns true if this Content object matches the given magic word.
+        *
+        * @since 1.21
+        *
+        * @param MagicWord $word the magic word to match
+        *
+        * @return bool whether this Content object matches the given magic word.
+        */
+       public function matchMagicWord( MagicWord $word );
+
+       /**
+        * Converts this content object into another content object with the given content model,
+        * if that is possible.
+        *
+        * @param String  $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
+        * @param String  $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
+        * not allowed, full round-trip conversion is expected to work without losing information.
+        *
+        * @return Content|bool A content object with the content model $toModel, or false if
+        * that conversion is not supported.
+        */
+       public function convert( $toModel, $lossy = '' );
+
+               // TODO: ImagePage and CategoryPage interfere with per-content action handlers
+       // TODO: nice&sane integration of GeSHi syntax highlighting
+       //   [11:59] <vvv> Hooks are ugly; make CodeHighlighter interface and a
+       //   config to set the class which handles syntax highlighting
+       //   [12:00] <vvv> And default it to a DummyHighlighter
+}
diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php
new file mode 100644 (file)
index 0000000..7d1be2b
--- /dev/null
@@ -0,0 +1,1097 @@
+<?php
+
+/**
+ * Exception representing a failure to serialize or unserialize a content object.
+ */
+class MWContentSerializationException extends MWException {
+
+}
+
+/**
+ * A content handler knows how do deal with a specific type of content on a wiki
+ * page. Content is stored in the database in a serialized form (using a
+ * serialization format a.k.a. MIME type) and is unserialized into its native
+ * PHP representation (the content model), which is wrapped in an instance of
+ * the appropriate subclass of Content.
+ *
+ * ContentHandler instances are stateless singletons that serve, among other
+ * things, as a factory for Content objects. Generally, there is one subclass
+ * of ContentHandler and one subclass of Content for every type of content model.
+ *
+ * Some content types have a flat model, that is, their native representation
+ * is the same as their serialized form. Examples would be JavaScript and CSS
+ * code. As of now, this also applies to wikitext (MediaWiki's default content
+ * type), but wikitext content may be represented by a DOM or AST structure in
+ * the future.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+abstract class ContentHandler {
+
+       /**
+        * Switch for enabling deprecation warnings. Used by ContentHandler::deprecated()
+        * and ContentHandler::runLegacyHooks().
+        *
+        * Once the ContentHandler code has settled in a bit, this should be set to true to
+        * make extensions etc. show warnings when using deprecated functions and hooks.
+        */
+       protected static $enableDeprecationWarnings = false;
+
+       /**
+        * Convenience function for getting flat text from a Content object. This
+        * should only be used in the context of backwards compatibility with code
+        * that is not yet able to handle Content objects!
+        *
+        * If $content is null, this method returns the empty string.
+        *
+        * If $content is an instance of TextContent, this method returns the flat
+        * text as returned by $content->getNativeData().
+        *
+        * If $content is not a TextContent object, the behavior of this method
+        * depends on the global $wgContentHandlerTextFallback:
+        * - If $wgContentHandlerTextFallback is 'fail' and $content is not a
+        *   TextContent object, an MWException is thrown.
+        * - If $wgContentHandlerTextFallback is 'serialize' and $content is not a
+        *   TextContent object, $content->serialize() is called to get a string
+        *   form of the content.
+        * - If $wgContentHandlerTextFallback is 'ignore' and $content is not a
+        *   TextContent object, this method returns null.
+        * - otherwise, the behaviour is undefined.
+        *
+        * @since 1.21
+        *
+        * @param $content Content|null
+        * @return null|string the textual form of $content, if available
+        * @throws MWException if $content is not an instance of TextContent and
+        *   $wgContentHandlerTextFallback was set to 'fail'.
+        */
+       public static function getContentText( Content $content = null ) {
+               global $wgContentHandlerTextFallback;
+
+               if ( is_null( $content ) ) {
+                       return '';
+               }
+
+               if ( $content instanceof TextContent ) {
+                       return $content->getNativeData();
+               }
+
+               wfDebugLog( 'ContentHandler', 'Accessing ' . $content->getModel() . ' content as text!' );
+
+               if ( $wgContentHandlerTextFallback == 'fail' ) {
+                       throw new MWException(
+                               "Attempt to get text from Content with model " .
+                               $content->getModel()
+                       );
+               }
+
+               if ( $wgContentHandlerTextFallback == 'serialize' ) {
+                       return $content->serialize();
+               }
+
+               return null;
+       }
+
+       /**
+        * Convenience function for creating a Content object from a given textual
+        * representation.
+        *
+        * $text will be deserialized into a Content object of the model specified
+        * by $modelId (or, if that is not given, $title->getContentModel()) using
+        * the given format.
+        *
+        * @since 1.21
+        *
+        * @param $text string the textual representation, will be
+        *    unserialized to create the Content object
+        * @param $title null|Title the title of the page this text belongs to.
+        *    Required if $modelId is not provided.
+        * @param $modelId null|string the model to deserialize to. If not provided,
+        *    $title->getContentModel() is used.
+        * @param $format null|string the format to use for deserialization. If not
+        *    given, the model's default format is used.
+        *
+        * @return Content a Content object representing $text
+        *
+        * @throw MWException if $model or $format is not supported or if $text can
+        *    not be unserialized using $format.
+        */
+       public static function makeContent( $text, Title $title = null,
+               $modelId = null, $format = null )
+       {
+               if ( is_null( $modelId ) ) {
+                       if ( is_null( $title ) ) {
+                               throw new MWException( "Must provide a Title object or a content model ID." );
+                       }
+
+                       $modelId = $title->getContentModel();
+               }
+
+               $handler = ContentHandler::getForModelID( $modelId );
+               return $handler->unserializeContent( $text, $format );
+       }
+
+       /**
+        * Returns the name of the default content model to be used for the page
+        * with the given title.
+        *
+        * Note: There should rarely be need to call this method directly.
+        * To determine the actual content model for a given page, use
+        * Title::getContentModel().
+        *
+        * Which model is to be used by default for the page is determined based
+        * on several factors:
+        * - The global setting $wgNamespaceContentModels specifies a content model
+        *   per namespace.
+        * - The hook ContentHandlerDefaultModelFor may be used to override the page's default
+        *   model.
+        * - Pages in NS_MEDIAWIKI and NS_USER default to the CSS or JavaScript
+        *   model if they end in .js or .css, respectively.
+        * - Pages in NS_MEDIAWIKI default to the wikitext model otherwise.
+        * - The hook TitleIsCssOrJsPage may be used to force a page to use the CSS
+        *   or JavaScript model. This is a compatibility feature. The ContentHandlerDefaultModelFor
+        *   hook should be used instead if possible.
+        * - The hook TitleIsWikitextPage may be used to force a page to use the
+        *   wikitext model. This is a compatibility feature. The ContentHandlerDefaultModelFor
+        *   hook should be used instead if possible.
+        *
+        * If none of the above applies, the wikitext model is used.
+        *
+        * Note: this is used by, and may thus not use, Title::getContentModel()
+        *
+        * @since 1.21
+        *
+        * @param $title Title
+        * @return null|string default model name for the page given by $title
+        */
+       public static function getDefaultModelFor( Title $title ) {
+               global $wgNamespaceContentModels;
+
+               // NOTE: this method must not rely on $title->getContentModel() directly or indirectly,
+               //       because it is used to initialize the mContentModel member.
+
+               $ns = $title->getNamespace();
+
+               $ext = false;
+               $m = null;
+               $model = null;
+
+               if ( !empty( $wgNamespaceContentModels[ $ns ] ) ) {
+                       $model = $wgNamespaceContentModels[ $ns ];
+               }
+
+               // Hook can determine default model
+               if ( !wfRunHooks( 'ContentHandlerDefaultModelFor', array( $title, &$model ) ) ) {
+                       if ( !is_null( $model ) ) {
+                               return $model;
+                       }
+               }
+
+               // Could this page contain custom CSS or JavaScript, based on the title?
+               $isCssOrJsPage = NS_MEDIAWIKI == $ns && preg_match( '!\.(css|js)$!u', $title->getText(), $m );
+               if ( $isCssOrJsPage ) {
+                       $ext = $m[1];
+               }
+
+               // Hook can force JS/CSS
+               wfRunHooks( 'TitleIsCssOrJsPage', array( $title, &$isCssOrJsPage ) );
+
+               // Is this a .css subpage of a user page?
+               $isJsCssSubpage = NS_USER == $ns
+                       && !$isCssOrJsPage
+                       && preg_match( "/\\/.*\\.(js|css)$/", $title->getText(), $m );
+               if ( $isJsCssSubpage ) {
+                       $ext = $m[1];
+               }
+
+               // Is this wikitext, according to $wgNamespaceContentModels or the DefaultModelFor hook?
+               $isWikitext = is_null( $model ) || $model == CONTENT_MODEL_WIKITEXT;
+               $isWikitext = $isWikitext && !$isCssOrJsPage && !$isJsCssSubpage;
+
+               // Hook can override $isWikitext
+               wfRunHooks( 'TitleIsWikitextPage', array( $title, &$isWikitext ) );
+
+               if ( !$isWikitext ) {
+                       switch ( $ext ) {
+                               case 'js':
+                                       return CONTENT_MODEL_JAVASCRIPT;
+                               case 'css':
+                                       return CONTENT_MODEL_CSS;
+                               default:
+                                       return is_null( $model ) ? CONTENT_MODEL_TEXT : $model;
+                       }
+               }
+
+               // We established that it must be wikitext
+
+               return CONTENT_MODEL_WIKITEXT;
+       }
+
+       /**
+        * Returns the appropriate ContentHandler singleton for the given title.
+        *
+        * @since 1.21
+        *
+        * @param $title Title
+        * @return ContentHandler
+        */
+       public static function getForTitle( Title $title ) {
+               $modelId = $title->getContentModel();
+               return ContentHandler::getForModelID( $modelId );
+       }
+
+       /**
+        * Returns the appropriate ContentHandler singleton for the given Content
+        * object.
+        *
+        * @since 1.21
+        *
+        * @param $content Content
+        * @return ContentHandler
+        */
+       public static function getForContent( Content $content ) {
+               $modelId = $content->getModel();
+               return ContentHandler::getForModelID( $modelId );
+       }
+
+       /**
+        * @var Array A Cache of ContentHandler instances by model id
+        */
+       static $handlers;
+
+       /**
+        * Returns the ContentHandler singleton for the given model ID. Use the
+        * CONTENT_MODEL_XXX constants to identify the desired content model.
+        *
+        * ContentHandler singletons are taken from the global $wgContentHandlers
+        * array. Keys in that array are model names, the values are either
+        * ContentHandler singleton objects, or strings specifying the appropriate
+        * subclass of ContentHandler.
+        *
+        * If a class name is encountered when looking up the singleton for a given
+        * model name, the class is instantiated and the class name is replaced by
+        * the resulting singleton in $wgContentHandlers.
+        *
+        * If no ContentHandler is defined for the desired $modelId, the
+        * ContentHandler may be provided by the ContentHandlerForModelID hook.
+        * If no ContentHandler can be determined, an MWException is raised.
+        *
+        * @since 1.21
+        *
+        * @param $modelId String The ID of the content model for which to get a
+        *    handler. Use CONTENT_MODEL_XXX constants.
+        * @return ContentHandler The ContentHandler singleton for handling the
+        *    model given by $modelId
+        * @throws MWException if no handler is known for $modelId.
+        */
+       public static function getForModelID( $modelId ) {
+               global $wgContentHandlers;
+
+               if ( isset( ContentHandler::$handlers[$modelId] ) ) {
+                       return ContentHandler::$handlers[$modelId];
+               }
+
+               if ( empty( $wgContentHandlers[$modelId] ) ) {
+                       $handler = null;
+
+                       wfRunHooks( 'ContentHandlerForModelID', array( $modelId, &$handler ) );
+
+                       if ( $handler === null ) {
+                               throw new MWException( "No handler for model '$modelId'' registered in \$wgContentHandlers" );
+                       }
+
+                       if ( !( $handler instanceof ContentHandler ) ) {
+                               throw new MWException( "ContentHandlerForModelID must supply a ContentHandler instance" );
+                       }
+               } else {
+                       $class = $wgContentHandlers[$modelId];
+                       $handler = new $class( $modelId );
+
+                       if ( !( $handler instanceof ContentHandler ) ) {
+                               throw new MWException( "$class from \$wgContentHandlers is not compatible with ContentHandler" );
+                       }
+               }
+
+               wfDebugLog( 'ContentHandler', 'Created handler for ' . $modelId
+                                       . ': ' . get_class( $handler ) );
+
+               ContentHandler::$handlers[$modelId] = $handler;
+               return ContentHandler::$handlers[$modelId];
+       }
+
+       /**
+        * Returns the localized name for a given content model.
+        *
+        * Model names are localized using system messages. Message keys
+        * have the form content-model-$name, where $name is getContentModelName( $id ).
+        *
+        * @param $name String The content model ID, as given by a CONTENT_MODEL_XXX
+        *    constant or returned by Revision::getContentModel().
+        *
+        * @return string The content format's localized name.
+        * @throws MWException if the model id isn't known.
+        */
+       public static function getLocalizedName( $name ) {
+               $key = "content-model-$name";
+
+               $msg = wfMessage( $key );
+
+               return $msg->exists() ? $msg->plain() : $name;
+       }
+
+       public static function getContentModels() {
+               global $wgContentHandlers;
+
+               return array_keys( $wgContentHandlers );
+       }
+
+       public static function getAllContentFormats() {
+               global $wgContentHandlers;
+
+               $formats = array();
+
+               foreach ( $wgContentHandlers as $model => $class ) {
+                       $handler = ContentHandler::getForModelID( $model );
+                       $formats = array_merge( $formats, $handler->getSupportedFormats() );
+               }
+
+               $formats = array_unique( $formats );
+               return $formats;
+       }
+
+       // ------------------------------------------------------------------------
+
+       protected $mModelID;
+       protected $mSupportedFormats;
+
+       /**
+        * Constructor, initializing the ContentHandler instance with its model ID
+        * and a list of supported formats. Values for the parameters are typically
+        * provided as literals by subclass's constructors.
+        *
+        * @param $modelId String (use CONTENT_MODEL_XXX constants).
+        * @param $formats array List for supported serialization formats
+        *    (typically as MIME types)
+        */
+       public function __construct( $modelId, $formats ) {
+               $this->mModelID = $modelId;
+               $this->mSupportedFormats = $formats;
+
+               $this->mModelName = preg_replace( '/(Content)?Handler$/', '', get_class( $this ) );
+               $this->mModelName = preg_replace( '/[_\\\\]/', '', $this->mModelName );
+               $this->mModelName = strtolower( $this->mModelName );
+       }
+
+       /**
+        * Serializes a Content object of the type supported by this ContentHandler.
+        *
+        * @since 1.21
+        *
+        * @param $content Content The Content object to serialize
+        * @param $format null|String The desired serialization format
+        * @return string Serialized form of the content
+        */
+       public abstract function serializeContent( Content $content, $format = null );
+
+       /**
+        * Unserializes a Content object of the type supported by this ContentHandler.
+        *
+        * @since 1.21
+        *
+        * @param $blob string serialized form of the content
+        * @param $format null|String the format used for serialization
+        * @return Content the Content object created by deserializing $blob
+        */
+       public abstract function unserializeContent( $blob, $format = null );
+
+       /**
+        * Creates an empty Content object of the type supported by this
+        * ContentHandler.
+        *
+        * @since 1.21
+        *
+        * @return Content
+        */
+       public abstract function makeEmptyContent();
+
+       /**
+        * Creates a new Content object that acts as a redirect to the given page,
+        * or null of redirects are not supported by this content model.
+        *
+        * This default implementation always returns null. Subclasses supporting redirects
+        * must override this method.
+        *
+        * @since 1.21
+        *
+        * @param Title $destination the page to redirect to.
+        *
+        * @return Content
+        */
+       public function makeRedirectContent( Title $destination ) {
+               return null;
+       }
+
+       /**
+        * Returns the model id that identifies the content model this
+        * ContentHandler can handle. Use with the CONTENT_MODEL_XXX constants.
+        *
+        * @since 1.21
+        *
+        * @return String The model ID
+        */
+       public function getModelID() {
+               return $this->mModelID;
+       }
+
+       /**
+        * Throws an MWException if $model_id is not the ID of the content model
+        * supported by this ContentHandler.
+        *
+        * @since 1.21
+        *
+        * @param String $model_id The model to check
+        *
+        * @throws MWException
+        */
+       protected function checkModelID( $model_id ) {
+               if ( $model_id !== $this->mModelID ) {
+                       throw new MWException( "Bad content model: " .
+                               "expected {$this->mModelID} " .
+                               "but got $model_id." );
+               }
+       }
+
+       /**
+        * Returns a list of serialization formats supported by the
+        * serializeContent() and unserializeContent() methods of this
+        * ContentHandler.
+        *
+        * @since 1.21
+        *
+        * @return array of serialization formats as MIME type like strings
+        */
+       public function getSupportedFormats() {
+               return $this->mSupportedFormats;
+       }
+
+       /**
+        * The format used for serialization/deserialization by default by this
+        * ContentHandler.
+        *
+        * This default implementation will return the first element of the array
+        * of formats that was passed to the constructor.
+        *
+        * @since 1.21
+        *
+        * @return string the name of the default serialization format as a MIME type
+        */
+       public function getDefaultFormat() {
+               return $this->mSupportedFormats[0];
+       }
+
+       /**
+        * Returns true if $format is a serialization format supported by this
+        * ContentHandler, and false otherwise.
+        *
+        * Note that if $format is null, this method always returns true, because
+        * null means "use the default format".
+        *
+        * @since 1.21
+        *
+        * @param $format string the serialization format to check
+        * @return bool
+        */
+       public function isSupportedFormat( $format ) {
+
+               if ( !$format ) {
+                       return true; // this means "use the default"
+               }
+
+               return in_array( $format, $this->mSupportedFormats );
+       }
+
+       /**
+        * Throws an MWException if isSupportedFormat( $format ) is not true.
+        * Convenient for checking whether a format provided as a parameter is
+        * actually supported.
+        *
+        * @param $format string the serialization format to check
+        *
+        * @throws MWException
+        */
+       protected function checkFormat( $format ) {
+               if ( !$this->isSupportedFormat( $format ) ) {
+                       throw new MWException(
+                               "Format $format is not supported for content model "
+                               . $this->getModelID()
+                       );
+               }
+       }
+
+       /**
+        * Returns overrides for action handlers.
+        * Classes listed here will be used instead of the default one when
+        * (and only when) $wgActions[$action] === true. This allows subclasses
+        * to override the default action handlers.
+        *
+        * @since 1.21
+        *
+        * @return Array
+        */
+       public function getActionOverrides() {
+               return array();
+       }
+
+       /**
+        * Factory for creating an appropriate DifferenceEngine for this content model.
+        *
+        * @since 1.21
+        *
+        * @param $context IContextSource context to use, anything else will be
+        *    ignored
+        * @param $old Integer Old ID we want to show and diff with.
+        * @param $new int|string String either 'prev' or 'next'.
+        * @param $rcid Integer ??? FIXME (default 0)
+        * @param $refreshCache boolean If set, refreshes the diff cache
+        * @param $unhide boolean If set, allow viewing deleted revs
+        *
+        * @return DifferenceEngine
+        */
+       public function createDifferenceEngine( IContextSource $context,
+               $old = 0, $new = 0,
+               $rcid = 0, # FIXME: use everywhere!
+               $refreshCache = false, $unhide = false
+       ) {
+               $diffEngineClass = $this->getDiffEngineClass();
+
+               return new $diffEngineClass( $context, $old, $new, $rcid, $refreshCache, $unhide );
+       }
+
+       /**
+        * Get the language in which the content of the given page is written.
+        *
+        * This default implementation just returns $wgContLang (except for pages in the MediaWiki namespace)
+        *
+        * Note that the pages language is not cacheable, since it may in some cases depend on user settings.
+        *
+        * Also note that the page language may or may not depend on the actual content of the page,
+        * that is, this method may load the content in order to determine the language.
+        *
+        * @since 1.21
+        *
+        * @param Title        $title the page to determine the language for.
+        * @param Content|null $content the page's content, if you have it handy, to avoid reloading it.
+        *
+        * @return Language the page's language
+        */
+       public function getPageLanguage( Title $title, Content $content = null ) {
+               global $wgContLang, $wgLang;
+               $pageLang = $wgContLang;
+
+               if ( $title->getNamespace() == NS_MEDIAWIKI ) {
+                       // Parse mediawiki messages with correct target language
+                       list( /* $unused */, $lang ) = MessageCache::singleton()->figureMessage( $title->getText() );
+                       $pageLang = wfGetLangObj( $lang );
+               }
+
+               wfRunHooks( 'PageContentLanguage', array( $title, &$pageLang, $wgLang ) );
+               return wfGetLangObj( $pageLang );
+       }
+
+       /**
+        * Get the language in which the content of this page is written when
+        * viewed by user. Defaults to $this->getPageLanguage(), but if the user
+        * specified a preferred variant, the variant will be used.
+        *
+        * This default implementation just returns $this->getPageLanguage( $title, $content ) unless
+        * the user specified a preferred variant.
+        *
+        * Note that the pages view language is not cacheable, since it depends on user settings.
+        *
+        * Also note that the page language may or may not depend on the actual content of the page,
+        * that is, this method may load the content in order to determine the language.
+        *
+        * @since 1.21
+        *
+        * @param Title        $title the page to determine the language for.
+        * @param Content|null $content the page's content, if you have it handy, to avoid reloading it.
+        *
+        * @return Language the page's language for viewing
+        */
+       public function getPageViewLanguage( Title $title, Content $content = null ) {
+               $pageLang = $this->getPageLanguage( $title, $content );
+
+               if ( $title->getNamespace() !== NS_MEDIAWIKI ) {
+                       // If the user chooses a variant, the content is actually
+                       // in a language whose code is the variant code.
+                       $variant = $pageLang->getPreferredVariant();
+                       if ( $pageLang->getCode() !== $variant ) {
+                               $pageLang = Language::factory( $variant );
+                       }
+               }
+
+               return $pageLang;
+       }
+
+       /**
+        * Determines whether the content type handled by this ContentHandler
+        * can be used on the given page.
+        *
+        * This default implementation always returns true.
+        * Subclasses may override this to restrict the use of this content model to specific locations,
+        * typically based on the namespace or some other aspect of the title, such as a special suffix
+        * (e.g. ".svg" for SVG content).
+        *
+        * @param Title $title the page's title.
+        *
+        * @return bool true if content of this kind can be used on the given page, false otherwise.
+        */
+       public function canBeUsedOn( Title $title ) {
+               return true;
+       }
+
+       /**
+        * Returns the name of the diff engine to use.
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       protected function getDiffEngineClass() {
+               return 'DifferenceEngine';
+       }
+
+       /**
+        * Attempts to merge differences between three versions.
+        * Returns a new Content object for a clean merge and false for failure or
+        * a conflict.
+        *
+        * This default implementation always returns false.
+        *
+        * @since 1.21
+        *
+        * @param $oldContent Content|string  String
+        * @param $myContent Content|string   String
+        * @param $yourContent Content|string String
+        *
+        * @return Content|Bool
+        */
+       public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
+               return false;
+       }
+
+       /**
+        * Return an applicable auto-summary if one exists for the given edit.
+        *
+        * @since 1.21
+        *
+        * @param $oldContent Content|null: the previous text of the page.
+        * @param $newContent Content|null: The submitted text of the page.
+        * @param $flags int Bit mask: a bit mask of flags submitted for the edit.
+        *
+        * @return string An appropriate auto-summary, or an empty string.
+        */
+       public function getAutosummary( Content $oldContent = null, Content $newContent = null, $flags ) {
+               // Decide what kind of auto-summary is needed.
+
+               // Redirect auto-summaries
+
+               /**
+                * @var $ot Title
+                * @var $rt Title
+                */
+
+               $ot = !is_null( $oldContent ) ? $oldContent->getRedirectTarget() : null;
+               $rt = !is_null( $newContent ) ? $newContent->getRedirectTarget() : null;
+
+               if ( is_object( $rt ) ) {
+                       if ( !is_object( $ot )
+                               || !$rt->equals( $ot )
+                               || $ot->getFragment() != $rt->getFragment() )
+                       {
+                               $truncatedtext = $newContent->getTextForSummary(
+                                       250
+                                               - strlen( wfMessage( 'autoredircomment' )->inContentLanguage()->text() )
+                                               - strlen( $rt->getFullText() ) );
+
+                               return wfMessage( 'autoredircomment', $rt->getFullText() )
+                                               ->rawParams( $truncatedtext )->inContentLanguage()->text();
+                       }
+               }
+
+               // New page auto-summaries
+               if ( $flags & EDIT_NEW && $newContent->getSize() > 0 ) {
+                       // If they're making a new article, give its text, truncated, in
+                       // the summary.
+
+                       $truncatedtext = $newContent->getTextForSummary(
+                               200 - strlen( wfMessage( 'autosumm-new' )->inContentLanguage()->text() ) );
+
+                       return wfMessage( 'autosumm-new' )->rawParams( $truncatedtext )
+                                       ->inContentLanguage()->text();
+               }
+
+               // Blanking auto-summaries
+               if ( !empty( $oldContent ) && $oldContent->getSize() > 0 && $newContent->getSize() == 0 ) {
+                       return wfMessage( 'autosumm-blank' )->inContentLanguage()->text();
+               } elseif ( !empty( $oldContent )
+                       && $oldContent->getSize() > 10 * $newContent->getSize()
+                       && $newContent->getSize() < 500 )
+               {
+                       // Removing more than 90% of the article
+
+                       $truncatedtext = $newContent->getTextForSummary(
+                               200 - strlen( wfMessage( 'autosumm-replace' )->inContentLanguage()->text() ) );
+
+                       return wfMessage( 'autosumm-replace' )->rawParams( $truncatedtext )
+                                       ->inContentLanguage()->text();
+               }
+
+               // If we reach this point, there's no applicable auto-summary for our
+               // case, so our auto-summary is empty.
+               return '';
+       }
+
+       /**
+        * Auto-generates a deletion reason
+        *
+        * @since 1.21
+        *
+        * @param $title Title: the page's title
+        * @param &$hasHistory Boolean: whether the page has a history
+        * @return mixed String containing deletion reason or empty string, or
+        *    boolean false if no revision occurred
+        *
+        * @XXX &$hasHistory is extremely ugly, it's here because
+        * WikiPage::getAutoDeleteReason() and Article::getReason()
+        * have it / want it.
+        */
+       public function getAutoDeleteReason( Title $title, &$hasHistory ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               // Get the last revision
+               $rev = Revision::newFromTitle( $title );
+
+               if ( is_null( $rev ) ) {
+                       return false;
+               }
+
+               // Get the article's contents
+               $content = $rev->getContent();
+               $blank = false;
+
+               // If the page is blank, use the text from the previous revision,
+               // which can only be blank if there's a move/import/protect dummy
+               // revision involved
+               if ( !$content || $content->isEmpty() ) {
+                       $prev = $rev->getPrevious();
+
+                       if ( $prev ) {
+                               $rev = $prev;
+                               $content = $rev->getContent();
+                               $blank = true;
+                       }
+               }
+
+               $this->checkModelID( $rev->getContentModel() );
+
+               // Find out if there was only one contributor
+               // Only scan the last 20 revisions
+               $res = $dbw->select( 'revision', 'rev_user_text',
+                       array(
+                               'rev_page' => $title->getArticleID(),
+                               $dbw->bitAnd( 'rev_deleted', Revision::DELETED_USER ) . ' = 0'
+                       ),
+                       __METHOD__,
+                       array( 'LIMIT' => 20 )
+               );
+
+               if ( $res === false ) {
+                       // This page has no revisions, which is very weird
+                       return false;
+               }
+
+               $hasHistory = ( $res->numRows() > 1 );
+               $row = $dbw->fetchObject( $res );
+
+               if ( $row ) { // $row is false if the only contributor is hidden
+                       $onlyAuthor = $row->rev_user_text;
+                       // Try to find a second contributor
+                       foreach ( $res as $row ) {
+                               if ( $row->rev_user_text != $onlyAuthor ) { // Bug 22999
+                                       $onlyAuthor = false;
+                                       break;
+                               }
+                       }
+               } else {
+                       $onlyAuthor = false;
+               }
+
+               // Generate the summary with a '$1' placeholder
+               if ( $blank ) {
+                       // The current revision is blank and the one before is also
+                       // blank. It's just not our lucky day
+                       $reason = wfMessage( 'exbeforeblank', '$1' )->inContentLanguage()->text();
+               } else {
+                       if ( $onlyAuthor ) {
+                               $reason = wfMessage(
+                                       'excontentauthor',
+                                       '$1',
+                                       $onlyAuthor
+                               )->inContentLanguage()->text();
+                       } else {
+                               $reason = wfMessage( 'excontent', '$1' )->inContentLanguage()->text();
+                       }
+               }
+
+               if ( $reason == '-' ) {
+                       // Allow these UI messages to be blanked out cleanly
+                       return '';
+               }
+
+               // Max content length = max comment length - length of the comment (excl. $1)
+               $text = $content ? $content->getTextForSummary( 255 - ( strlen( $reason ) - 2 ) ) : '';
+
+               // Now replace the '$1' placeholder
+               $reason = str_replace( '$1', $text, $reason );
+
+               return $reason;
+       }
+
+       /**
+        * Get the Content object that needs to be saved in order to undo all revisions
+        * between $undo and $undoafter. Revisions must belong to the same page,
+        * must exist and must not be deleted.
+        *
+        * @since 1.21
+        *
+        * @param $current Revision The current text
+        * @param $undo Revision The revision to undo
+        * @param $undoafter Revision Must be an earlier revision than $undo
+        *
+        * @return mixed String on success, false on failure
+        */
+       public function getUndoContent( Revision $current, Revision $undo, Revision $undoafter ) {
+               $cur_content = $current->getContent();
+
+               if ( empty( $cur_content ) ) {
+                       return false; // no page
+               }
+
+               $undo_content = $undo->getContent();
+               $undoafter_content = $undoafter->getContent();
+
+               $this->checkModelID( $cur_content->getModel() );
+               $this->checkModelID( $undo_content->getModel() );
+               $this->checkModelID( $undoafter_content->getModel() );
+
+               if ( $cur_content->equals( $undo_content ) ) {
+                       // No use doing a merge if it's just a straight revert.
+                       return $undoafter_content;
+               }
+
+               $undone_content = $this->merge3( $undo_content, $undoafter_content, $cur_content );
+
+               return $undone_content;
+       }
+
+       /**
+        * Get parser options suitable for rendering the primary article wikitext
+        *
+        * @param IContextSource|User|string $context One of the following:
+        *        - IContextSource: Use the User and the Language of the provided
+        *                                            context
+        *        - User: Use the provided User object and $wgLang for the language,
+        *                                            so use an IContextSource object if possible.
+        *        - 'canonical': Canonical options (anonymous user with default
+        *                                            preferences and content language).
+        *
+        * @param IContextSource|User|string $context
+        *
+        * @throws MWException
+        * @return ParserOptions
+        */
+       public function makeParserOptions( $context ) {
+               global $wgContLang;
+
+               if ( $context instanceof IContextSource ) {
+                       $options = ParserOptions::newFromContext( $context );
+               } elseif ( $context instanceof User ) { // settings per user (even anons)
+                       $options = ParserOptions::newFromUser( $context );
+               } elseif ( $context === 'canonical' ) { // canonical settings
+                       $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
+               } else {
+                       throw new MWException( "Bad context for parser options: $context" );
+               }
+
+               $options->enableLimitReport(); // show inclusion/loop reports
+               $options->setTidy( true ); // fix bad HTML
+
+               return $options;
+       }
+
+       /**
+        * Returns true for content models that support caching using the
+        * ParserCache mechanism. See WikiPage::isParserCacheUsed().
+        *
+        * @since 1.21
+        *
+        * @return bool
+        */
+       public function isParserCacheSupported() {
+               return false;
+       }
+
+       /**
+        * Returns true if this content model supports sections.
+        *
+        * This default implementation returns false.
+        *
+        * @return boolean whether sections are supported.
+        */
+       public function supportsSections() {
+               return false;
+       }
+
+       /**
+        * Logs a deprecation warning, visible if $wgDevelopmentWarnings, but only if
+        * self::$enableDeprecationWarnings is set to true.
+        *
+        * @param String      $func The name of the deprecated function
+        * @param string      $version The version since the method is deprecated. Usually 1.21
+        *                    for ContentHandler related stuff.
+        * @param String|bool $component: Component to which the function belongs.
+        *                                If false, it is assumed the function is in MediaWiki core.
+        *
+        * @see ContentHandler::$enableDeprecationWarnings
+        * @see wfDeprecated
+        */
+       public static function deprecated( $func, $version, $component = false ) {
+               if ( self::$enableDeprecationWarnings ) {
+                       wfDeprecated( $func, $version, $component, 3 );
+               }
+       }
+
+       /**
+        * Call a legacy hook that uses text instead of Content objects.
+        * Will log a warning when a matching hook function is registered.
+        * If the textual representation of the content is changed by the
+        * hook function, a new Content object is constructed from the new
+        * text.
+        *
+        * @param $event String: event name
+        * @param $args Array: parameters passed to hook functions
+        * @param $warn bool: whether to log a warning.
+        *                    Default to self::$enableDeprecationWarnings.
+        *                    May be set to false for testing.
+        *
+        * @return Boolean True if no handler aborted the hook
+        *
+        * @see ContentHandler::$enableDeprecationWarnings
+        */
+       public static function runLegacyHooks( $event, $args = array(),
+                       $warn = null ) {
+
+               if ( $warn === null ) {
+                       $warn = self::$enableDeprecationWarnings;
+               }
+
+               if ( !Hooks::isRegistered( $event ) ) {
+                       return true; // nothing to do here
+               }
+
+               if ( $warn ) {
+                       // Log information about which handlers are registered for the legacy hook,
+                       // so we can find and fix them.
+
+                       $handlers = Hooks::getHandlers( $event );
+                       $handlerInfo = array();
+
+                       wfSuppressWarnings();
+
+                       foreach ( $handlers as $handler ) {
+                               $info = '';
+
+                               if ( is_array( $handler ) ) {
+                                       if ( is_object( $handler[0] ) ) {
+                                               $info = get_class( $handler[0] );
+                                       } else {
+                                               $info = $handler[0];
+                                       }
+
+                                       if ( isset( $handler[1] ) ) {
+                                               $info .= '::' . $handler[1];
+                                       }
+                               } else if ( is_object( $handler ) ) {
+                                       $info = get_class( $handler[0] );
+                                       $info .= '::on' . $event;
+                               } else {
+                                       $info = $handler;
+                               }
+
+                               $handlerInfo[] = $info;
+                       }
+
+                       wfRestoreWarnings();
+
+                       wfWarn( "Using obsolete hook $event via ContentHandler::runLegacyHooks()! Handlers: " . implode(', ', $handlerInfo), 2 );
+               }
+
+               // convert Content objects to text
+               $contentObjects = array();
+               $contentTexts = array();
+
+               foreach ( $args as $k => $v ) {
+                       if ( $v instanceof Content ) {
+                               /* @var Content $v */
+
+                               $contentObjects[$k] = $v;
+
+                               $v = $v->serialize();
+                               $contentTexts[ $k ] = $v;
+                               $args[ $k ] = $v;
+                       }
+               }
+
+               // call the hook functions
+               $ok = wfRunHooks( $event, $args );
+
+               // see if the hook changed the text
+               foreach ( $contentTexts as $k => $orig ) {
+                       /* @var Content $content */
+
+                       $modified = $args[ $k ];
+                       $content = $contentObjects[$k];
+
+                       if ( $modified !== $orig ) {
+                               // text was changed, create updated Content object
+                               $content = $content->getContentHandler()->unserializeContent( $modified );
+                       }
+
+                       $args[ $k ] = $content;
+               }
+
+               return $ok;
+       }
+}
+
diff --git a/includes/content/CssContent.php b/includes/content/CssContent.php
new file mode 100644 (file)
index 0000000..29527cf
--- /dev/null
@@ -0,0 +1,58 @@
+<?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.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+class CssContent extends TextContent {
+       public function __construct( $text ) {
+               parent::__construct( $text, CONTENT_MODEL_CSS );
+       }
+
+       /**
+        * Returns a Content object with pre-save transformations applied using
+        * Parser::preSaveTransform().
+        *
+        * @param $title Title
+        * @param $user User
+        * @param $popts ParserOptions
+        * @return Content
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               global $wgParser;
+               // @todo: make pre-save transformation optional for script pages
+
+               $text = $this->getNativeData();
+               $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+
+               return new CssContent( $pst );
+       }
+
+
+       protected function getHtml( ) {
+               $html = "";
+               $html .= "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n";
+               $html .= $this->getHighlightHtml( );
+               $html .= "\n</pre>\n";
+
+               return $html;
+       }
+}
diff --git a/includes/content/CssContentHandler.php b/includes/content/CssContentHandler.php
new file mode 100644 (file)
index 0000000..2c68d2f
--- /dev/null
@@ -0,0 +1,61 @@
+<?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
+ */
+
+/**
+ * @since 1.21
+ */
+class CssContentHandler extends TextContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_CSS ) {
+               parent::__construct( $modelId, array( CONTENT_FORMAT_CSS ) );
+       }
+
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new CssContent( $text );
+       }
+
+       public function makeEmptyContent() {
+               return new CssContent( '' );
+       }
+
+       /**
+        * Returns the english language, because CSS is english, and should be handled as such.
+        *
+        * @return Language wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageLanguage()
+        */
+       public function getPageLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+
+       /**
+        * Returns the english language, because CSS is english, and should be handled as such.
+        *
+        * @return Language wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageViewLanguage()
+        */
+       public function getPageViewLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+}
diff --git a/includes/content/JavaScriptContent.php b/includes/content/JavaScriptContent.php
new file mode 100644 (file)
index 0000000..770f233
--- /dev/null
@@ -0,0 +1,60 @@
+<?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.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+class JavaScriptContent extends TextContent {
+       public function __construct( $text ) {
+               parent::__construct( $text, CONTENT_MODEL_JAVASCRIPT );
+       }
+
+       /**
+        * Returns a Content object with pre-save transformations applied using
+        * Parser::preSaveTransform().
+        *
+        * @param Title $title
+        * @param User $user
+        * @param ParserOptions $popts
+        * @return Content
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               global $wgParser;
+               // @todo: make pre-save transformation optional for script pages
+               // See bug #32858
+
+               $text = $this->getNativeData();
+               $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+
+               return new JavaScriptContent( $pst );
+       }
+
+
+       protected function getHtml( ) {
+               $html = "";
+               $html .= "<pre class=\"mw-code mw-js\" dir=\"ltr\">\n";
+               $html .= $this->getHighlightHtml( );
+               $html .= "\n</pre>\n";
+
+               return $html;
+       }
+}
\ No newline at end of file
diff --git a/includes/content/JavaScriptContentHandler.php b/includes/content/JavaScriptContentHandler.php
new file mode 100644 (file)
index 0000000..b5b4ee2
--- /dev/null
@@ -0,0 +1,63 @@
+<?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
+ */
+
+# XXX: make ScriptContentHandler base class, do highlighting stuff there?
+
+/**
+ * @since 1.21
+ */
+class JavaScriptContentHandler extends TextContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_JAVASCRIPT ) {
+               parent::__construct( $modelId, array( CONTENT_FORMAT_JAVASCRIPT ) );
+       }
+
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new JavaScriptContent( $text );
+       }
+
+       public function makeEmptyContent() {
+               return new JavaScriptContent( '' );
+       }
+
+       /**
+        * Returns the english language, because JS is english, and should be handled as such.
+        *
+        * @return Language wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageLanguage()
+        */
+       public function getPageLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+
+       /**
+        * Returns the english language, because JS is english, and should be handled as such.
+        *
+        * @return Language wfGetLangObj( 'en' )
+        *
+        * @see ContentHandler::getPageViewLanguage()
+        */
+       public function getPageViewLanguage( Title $title, Content $content = null ) {
+               return wfGetLangObj( 'en' );
+       }
+}
diff --git a/includes/content/MessageContent.php b/includes/content/MessageContent.php
new file mode 100644 (file)
index 0000000..d38355d
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * Wrapper allowing us to handle a system message as a Content object. Note that this is generally *not* used
+ * to represent content from the MediaWiki namespace, and that there is no MessageContentHandler. MessageContent
+ * is just intended as glue for wrapping a message programatically.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+class MessageContent extends AbstractContent {
+
+       /**
+        * @var Message
+        */
+       protected $mMessage;
+
+       /**
+        * @param Message|String $msg    A Message object, or a message key
+        * @param array|null     $params An optional array of message parameters
+        */
+       public function __construct( $msg, $params = null ) {
+               # XXX: messages may be wikitext, html or plain text! and maybe even something else entirely.
+               parent::__construct( CONTENT_MODEL_WIKITEXT );
+
+               if ( is_string( $msg ) ) {
+                       $this->mMessage = wfMessage( $msg );
+               } else {
+                       $this->mMessage = clone $msg;
+               }
+
+               if ( $params ) {
+                       $this->mMessage = $this->mMessage->params( $params );
+               }
+       }
+
+       /**
+        * Returns the message as rendered HTML
+        *
+        * @return string The message text, parsed into html
+        */
+       public function getHtml() {
+               return $this->mMessage->parse();
+       }
+
+       /**
+        * Returns the message as rendered HTML
+        *
+        * @return string The message text, parsed into html
+        */
+       public function getWikitext() {
+               return $this->mMessage->text();
+       }
+
+       /**
+        * Returns the message object, with any parameters already substituted.
+        *
+        * @return Message The message object.
+        */
+       public function getNativeData() {
+               //NOTE: Message objects are mutable. Cloning here makes MessageContent immutable.
+               return clone $this->mMessage;
+       }
+
+       /**
+        * @see Content::getTextForSearchIndex
+        */
+       public function getTextForSearchIndex() {
+               return $this->mMessage->plain();
+       }
+
+       /**
+        * @see Content::getWikitextForTransclusion
+        */
+       public function getWikitextForTransclusion() {
+               return $this->getWikitext();
+       }
+
+       /**
+        * @see Content::getTextForSummary
+        */
+       public function getTextForSummary( $maxlength = 250 ) {
+               return substr( $this->mMessage->plain(), 0, $maxlength );
+       }
+
+       /**
+        * @see Content::getSize
+        *
+        * @return int
+        */
+       public function getSize() {
+               return strlen( $this->mMessage->plain() );
+       }
+
+       /**
+        * @see Content::copy
+        *
+        * @return Content. A copy of this object
+        */
+       public function copy() {
+               // MessageContent is immutable (because getNativeData() returns a clone of the Message object)
+               return $this;
+       }
+
+       /**
+        * @see Content::isCountable
+        *
+        * @return bool false
+        */
+       public function isCountable( $hasLinks = null ) {
+               return false;
+       }
+
+       /**
+        * @see Content::getParserOutput
+        *
+        * @return ParserOutput
+        */
+       public function getParserOutput(
+               Title $title, $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+
+               if ( $generateHtml ) {
+                       $html = $this->getHtml();
+               } else {
+                       $html = '';
+               }
+
+               $po = new ParserOutput( $html );
+               return $po;
+       }
+}
\ No newline at end of file
diff --git a/includes/content/TextContent.php b/includes/content/TextContent.php
new file mode 100644 (file)
index 0000000..872738b
--- /dev/null
@@ -0,0 +1,280 @@
+<?php
+
+/**
+ * Content object implementation for representing flat text.
+ *
+ * TextContent instances are immutable
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+class TextContent extends AbstractContent {
+
+       public function __construct( $text, $model_id = CONTENT_MODEL_TEXT ) {
+               parent::__construct( $model_id );
+
+               if ( $text === null || $text === false ) {
+                       wfWarn( "TextContent constructed with \$text = " . var_export( $text, true ) . "! "
+                                       . "This may indicate an error in the caller's scope." );
+
+                       $text = '';
+               }
+
+               if ( !is_string( $text ) ) {
+                       throw new MWException( "TextContent expects a string in the constructor." );
+               }
+
+               $this->mText = $text;
+       }
+
+       public function copy() {
+               return $this; # NOTE: this is ok since TextContent are immutable.
+       }
+
+       public function getTextForSummary( $maxlength = 250 ) {
+               global $wgContLang;
+
+               $text = $this->getNativeData();
+
+               $truncatedtext = $wgContLang->truncate(
+                       preg_replace( "/[\n\r]/", ' ', $text ),
+                       max( 0, $maxlength ) );
+
+               return $truncatedtext;
+       }
+
+       /**
+        * returns the text's size in bytes.
+        *
+        * @return int The size
+        */
+       public function getSize( ) {
+               $text = $this->getNativeData( );
+               return strlen( $text );
+       }
+
+       /**
+        * Returns true if this content is not a redirect, and $wgArticleCountMethod
+        * is "any".
+        *
+        * @param $hasLinks Bool: if it is known whether this content contains links,
+        * provide this information here, to avoid redundant parsing to find out.
+        *
+        * @return bool True if the content is countable
+        */
+       public function isCountable( $hasLinks = null ) {
+               global $wgArticleCountMethod;
+
+               if ( $this->isRedirect( ) ) {
+                       return false;
+               }
+
+               if ( $wgArticleCountMethod === 'any' ) {
+                       return true;
+               }
+
+               return false;
+       }
+
+       /**
+        * Returns the text represented by this Content object, as a string.
+        *
+        * @return string: the raw text
+        */
+       public function getNativeData( ) {
+               $text = $this->mText;
+               return $text;
+       }
+
+       /**
+        * Returns the text represented by this Content object, as a string.
+        *
+        * @return string: the raw text
+        */
+       public function getTextForSearchIndex( ) {
+               return $this->getNativeData();
+       }
+
+       /**
+        * Returns attempts to convert this content object to wikitext,
+        * and then returns the text string. The conversion may be lossy.
+        *
+        * @note: this allows any text-based content to be transcluded as if it was wikitext.
+        *
+        * @return string|false: the raw text, or null if the conversion failed
+        */
+       public function getWikitextForTransclusion( ) {
+               $wikitext = $this->convert( CONTENT_MODEL_WIKITEXT, 'lossy' );
+
+               if ( $wikitext ) {
+                       return $wikitext->getNativeData();
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * Returns a Content object with pre-save transformations applied.
+        * This implementation just trims trailing whitespace.
+        *
+        * @param $title Title
+        * @param $user User
+        * @param $popts ParserOptions
+        * @return Content
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               $text = $this->getNativeData();
+               $pst = rtrim( $text );
+
+               return ( $text === $pst ) ? $this : new WikitextContent( $pst );
+       }
+
+       /**
+        * Diff this content object with another content object.
+        *
+        * @since 1.21diff
+        *
+        * @param $that Content: The other content object to compare this content
+        * object to.
+        * @param $lang Language: The language object to use for text segmentation.
+        *    If not given, $wgContentLang is used.
+        *
+        * @return DiffResult: A diff representing the changes that would have to be
+        *    made to this content object to make it equal to $that.
+        */
+       public function diff( Content $that, Language $lang = null ) {
+               global $wgContLang;
+
+               $this->checkModelID( $that->getModel() );
+
+               # @todo: could implement this in DifferenceEngine and just delegate here?
+
+               if ( !$lang ) $lang = $wgContLang;
+
+               $otext = $this->getNativeData();
+               $ntext = $this->getNativeData();
+
+               # Note: Use native PHP diff, external engines don't give us abstract output
+               $ota = explode( "\n", $wgContLang->segmentForDiff( $otext ) );
+               $nta = explode( "\n", $wgContLang->segmentForDiff( $ntext ) );
+
+               $diff = new Diff( $ota, $nta );
+               return $diff;
+       }
+
+
+       /**
+        * Returns a generic ParserOutput object, wrapping the HTML returned by
+        * getHtml().
+        *
+        * @param $title Title Context title for parsing
+        * @param $revId int|null Revision ID (for {{REVISIONID}})
+        * @param $options ParserOptions|null Parser options
+        * @param $generateHtml bool Whether or not to generate HTML
+        *
+        * @return ParserOutput representing the HTML form of the text
+        */
+       public function getParserOutput( Title $title,
+               $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+               global $wgParser, $wgTextModelsToParse;
+
+               if ( !$options ) {
+                       //NOTE: use canonical options per default to produce cacheable output
+                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+               }
+
+               if ( in_array( $this->getModel(), $wgTextModelsToParse ) ) {
+                       // parse just to get links etc into the database
+                       $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
+               } else {
+                       $po = new ParserOutput();
+               }
+
+               if ( $generateHtml ) {
+                       $html = $this->getHtml();
+               } else {
+                       $html = '';
+               }
+
+               $po->setText( $html );
+               return $po;
+       }
+
+       /**
+        * Generates an HTML version of the content, for display. Used by
+        * getParserOutput() to construct a ParserOutput object.
+        *
+        * This default implementation just calls getHighlightHtml(). Content
+        * models that have another mapping to HTML (as is the case for markup
+        * languages like wikitext) should override this method to generate the
+        * appropriate HTML.
+        *
+        * @return string An HTML representation of the content
+        */
+       protected function getHtml() {
+               return $this->getHighlightHtml();
+       }
+
+       /**
+        * Generates a syntax-highlighted version of the content, as HTML.
+        * Used by the default implementation of getHtml().
+        *
+        * @return string an HTML representation of the content's markup
+        */
+       protected function getHighlightHtml( ) {
+               # TODO: make Highlighter interface, use highlighter here, if available
+               return htmlspecialchars( $this->getNativeData() );
+       }
+
+       /**
+        * @see Content::convert()
+        *
+        * This implementation provides lossless conversion between content models based
+        * on TextContent.
+        *
+        * @param String  $toModel the desired content model, use the CONTENT_MODEL_XXX flags.
+        * @param String  $lossy flag, set to "lossy" to allow lossy conversion. If lossy conversion is
+        * not allowed, full round-trip conversion is expected to work without losing information.
+        *
+        * @return Content|bool A content object with the content model $toModel, or false if
+        * that conversion is not supported.
+        */
+       public function convert( $toModel, $lossy = '' ) {
+               $converted = parent::convert( $toModel, $lossy );
+
+               if ( $converted !== false ) {
+                       return $converted;
+               }
+
+               $toHandler = ContentHandler::getForModelID( $toModel );
+
+               if ( $toHandler instanceof TextContentHandler ) {
+                       //NOTE: ignore content serialization format - it's just text anyway.
+                       $text = $this->getNativeData();
+                       $converted = $toHandler->unserializeContent( $text );
+               }
+
+               return $converted;
+       }
+}
diff --git a/includes/content/TextContentHandler.php b/includes/content/TextContentHandler.php
new file mode 100644 (file)
index 0000000..90802f6
--- /dev/null
@@ -0,0 +1,108 @@
+<?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
+ */
+
+/**
+ * @since 1.21
+ */
+class TextContentHandler extends ContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = array( CONTENT_FORMAT_TEXT ) ) {
+               parent::__construct( $modelId, $formats );
+       }
+
+       /**
+        * Returns the content's text as-is.
+        *
+        * @param $content Content
+        * @param $format string|null
+        * @return mixed
+        */
+       public function serializeContent( Content $content, $format = null ) {
+               $this->checkFormat( $format );
+               return $content->getNativeData();
+       }
+
+       /**
+        * Attempts to merge differences between three versions. Returns a new
+        * Content object for a clean merge and false for failure or a conflict.
+        *
+        * All three Content objects passed as parameters must have the same
+        * content model.
+        *
+        * This text-based implementation uses wfMerge().
+        *
+        * @param $oldContent Content|string  String
+        * @param $myContent Content|string   String
+        * @param $yourContent Content|string String
+        *
+        * @return Content|Bool
+        */
+       public function merge3( Content $oldContent, Content $myContent, Content $yourContent ) {
+               $this->checkModelID( $oldContent->getModel() );
+               $this->checkModelID( $myContent->getModel() );
+               $this->checkModelID( $yourContent->getModel() );
+
+               $format = $this->getDefaultFormat();
+
+               $old = $this->serializeContent( $oldContent, $format );
+               $mine = $this->serializeContent( $myContent, $format );
+               $yours = $this->serializeContent( $yourContent, $format );
+
+               $ok = wfMerge( $old, $mine, $yours, $result );
+
+               if ( !$ok ) {
+                       return false;
+               }
+
+               if ( !$result ) {
+                       return $this->makeEmptyContent();
+               }
+
+               $mergedContent = $this->unserializeContent( $result, $format );
+               return $mergedContent;
+       }
+
+       /**
+        * Unserializes a Content object of the type supported by this ContentHandler.
+        *
+        * @since 1.21
+        *
+        * @param $text   string serialized form of the content
+        * @param $format null|String the format used for serialization
+        *
+        * @return Content the TextContent object wrapping $text
+        */
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new TextContent( $text );
+       }
+
+       /**
+        * Creates an empty TextContent object.
+        *
+        * @since 1.21
+        *
+        * @return Content
+        */
+       public function makeEmptyContent() {
+               return new TextContent( '' );
+       }
+}
diff --git a/includes/content/WikitextContent.php b/includes/content/WikitextContent.php
new file mode 100644 (file)
index 0000000..dabb855
--- /dev/null
@@ -0,0 +1,314 @@
+<?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.21
+ *
+ * @file
+ * @ingroup Content
+ *
+ * @author Daniel Kinzler
+ */
+class WikitextContent extends TextContent {
+
+       public function __construct( $text ) {
+               parent::__construct( $text, CONTENT_MODEL_WIKITEXT );
+       }
+
+       /**
+        * @see Content::getSection()
+        */
+       public function getSection( $section ) {
+               global $wgParser;
+
+               $text = $this->getNativeData();
+               $sect = $wgParser->getSection( $text, $section, false );
+
+               if ( $sect === false ) {
+                       return false;
+               } else {
+                       return new WikitextContent( $sect );
+               }
+       }
+
+       /**
+        * @see Content::replaceSection()
+        */
+       public function replaceSection( $section, Content $with, $sectionTitle = '' ) {
+               wfProfileIn( __METHOD__ );
+
+               $myModelId = $this->getModel();
+               $sectionModelId = $with->getModel();
+
+               if ( $sectionModelId != $myModelId  ) {
+                       throw new MWException( "Incompatible content model for section: " .
+                               "document uses $myModelId but " .
+                               "section uses $sectionModelId." );
+               }
+
+               $oldtext = $this->getNativeData();
+               $text = $with->getNativeData();
+
+               if ( $section === '' ) {
+                       wfProfileOut( __METHOD__ );
+                       return $with; # XXX: copy first?
+               } if ( $section == 'new' ) {
+                       # Inserting a new section
+                       $subject = $sectionTitle ? wfMessage( 'newsectionheaderdefaultlevel' )
+                               ->rawParams( $sectionTitle )->inContentLanguage()->text() . "\n\n" : '';
+                       if ( wfRunHooks( 'PlaceNewSection', array( $this, $oldtext, $subject, &$text ) ) ) {
+                               $text = strlen( trim( $oldtext ) ) > 0
+                                       ? "{$oldtext}\n\n{$subject}{$text}"
+                                       : "{$subject}{$text}";
+                       }
+               } else {
+                       # Replacing an existing section; roll out the big guns
+                       global $wgParser;
+
+                       $text = $wgParser->replaceSection( $oldtext, $section, $text );
+               }
+
+               $newContent = new WikitextContent( $text );
+
+               wfProfileOut( __METHOD__ );
+               return $newContent;
+       }
+
+       /**
+        * Returns a new WikitextContent object with the given section heading
+        * prepended.
+        *
+        * @param $header string
+        * @return Content
+        */
+       public function addSectionHeader( $header ) {
+               $text = wfMessage( 'newsectionheaderdefaultlevel' )
+                       ->rawParams( $header )->inContentLanguage()->text();
+               $text .= "\n\n";
+               $text .= $this->getNativeData();
+
+               return new WikitextContent( $text );
+       }
+
+       /**
+        * Returns a Content object with pre-save transformations applied using
+        * Parser::preSaveTransform().
+        *
+        * @param $title Title
+        * @param $user User
+        * @param $popts ParserOptions
+        * @return Content
+        */
+       public function preSaveTransform( Title $title, User $user, ParserOptions $popts ) {
+               global $wgParser;
+
+               $text = $this->getNativeData();
+               $pst = $wgParser->preSaveTransform( $text, $title, $user, $popts );
+               rtrim( $pst );
+
+               return ( $text === $pst ) ? $this : new WikitextContent( $pst );
+       }
+
+       /**
+        * Returns a Content object with preload transformations applied (or this
+        * object if no transformations apply).
+        *
+        * @param $title Title
+        * @param $popts ParserOptions
+        * @return Content
+        */
+       public function preloadTransform( Title $title, ParserOptions $popts ) {
+               global $wgParser;
+
+               $text = $this->getNativeData();
+               $plt = $wgParser->getPreloadText( $text, $title, $popts );
+
+               return new WikitextContent( $plt );
+       }
+
+       /**
+        * Implement redirect extraction for wikitext.
+        *
+        * @return null|Title
+        *
+        * @note: migrated here from Title::newFromRedirectInternal()
+        *
+        * @see Content::getRedirectTarget
+        * @see AbstractContent::getRedirectTarget
+        */
+       public function getRedirectTarget() {
+               global $wgMaxRedirects;
+               if ( $wgMaxRedirects < 1 ) {
+                       // redirects are disabled, so quit early
+                       return null;
+               }
+               $redir = MagicWord::get( 'redirect' );
+               $text = trim( $this->getNativeData() );
+               if ( $redir->matchStartAndRemove( $text ) ) {
+                       // Extract the first link and see if it's usable
+                       // Ensure that it really does come directly after #REDIRECT
+                       // Some older redirects included a colon, so don't freak about that!
+                       $m = array();
+                       if ( preg_match( '!^\s*:?\s*\[{2}(.*?)(?:\|.*?)?\]{2}!', $text, $m ) ) {
+                               // Strip preceding colon used to "escape" categories, etc.
+                               // and URL-decode links
+                               if ( strpos( $m[1], '%' ) !== false ) {
+                                       // Match behavior of inline link parsing here;
+                                       $m[1] = rawurldecode( ltrim( $m[1], ':' ) );
+                               }
+                               $title = Title::newFromText( $m[1] );
+                               // If the title is a redirect to bad special pages or is invalid, return null
+                               if ( !$title instanceof Title || !$title->isValidRedirectTarget() ) {
+                                       return null;
+                               }
+                               return $title;
+                       }
+               }
+               return null;
+       }
+
+       /**
+        * @see   Content::updateRedirect()
+        *
+        * This implementation replaces the first link on the page with the given new target
+        * if this Content object is a redirect. Otherwise, this method returns $this.
+        *
+        * @since 1.21
+        *
+        * @param Title $target
+        *
+        * @return Content a new Content object with the updated redirect (or $this if this Content object isn't a redirect)
+        */
+       public function updateRedirect( Title $target ) {
+               if ( !$this->isRedirect() ) {
+                       return $this;
+               }
+
+               # Fix the text
+               # Remember that redirect pages can have categories, templates, etc.,
+               # so the regex has to be fairly general
+               $newText = preg_replace( '/ \[ \[  [^\]]*  \] \] /x',
+                       '[[' . $target->getFullText() . ']]',
+                       $this->getNativeData(), 1 );
+
+               return new WikitextContent( $newText );
+       }
+
+       /**
+        * Returns true if this content is not a redirect, and this content's text
+        * is countable according to the criteria defined by $wgArticleCountMethod.
+        *
+        * @param $hasLinks Bool  if it is known whether this content contains
+        *    links, provide this information here, to avoid redundant parsing to
+        *    find out (default: null).
+        * @param $title Title: (default: null)
+        *
+        * @internal param \IContextSource $context context for parsing if necessary
+        *
+        * @return bool True if the content is countable
+        */
+       public function isCountable( $hasLinks = null, Title $title = null ) {
+               global $wgArticleCountMethod;
+
+               if ( $this->isRedirect( ) ) {
+                       return false;
+               }
+
+               $text = $this->getNativeData();
+
+               switch ( $wgArticleCountMethod ) {
+                       case 'any':
+                               return true;
+                       case 'comma':
+                               return strpos( $text,  ',' ) !== false;
+                       case 'link':
+                               if ( $hasLinks === null ) { # not known, find out
+                                       if ( !$title ) {
+                                               $context = RequestContext::getMain();
+                                               $title = $context->getTitle();
+                                       }
+
+                                       $po = $this->getParserOutput( $title, null, null, false );
+                                       $links = $po->getLinks();
+                                       $hasLinks = !empty( $links );
+                               }
+
+                               return $hasLinks;
+               }
+
+               return false;
+       }
+
+       public function getTextForSummary( $maxlength = 250 ) {
+               $truncatedtext = parent::getTextForSummary( $maxlength );
+
+               # clean up unfinished links
+               # XXX: make this optional? wasn't there in autosummary, but required for
+               # deletion summary.
+               $truncatedtext = preg_replace( '/\[\[([^\]]*)\]?$/', '$1', $truncatedtext );
+
+               return $truncatedtext;
+       }
+
+       /**
+        * Returns a ParserOutput object resulting from parsing the content's text
+        * using $wgParser.
+        *
+        * @since    1.21
+        *
+        * @param $title Title
+        * @param $revId int Revision to pass to the parser (default: null)
+        * @param $options ParserOptions (default: null)
+        * @param $generateHtml bool (default: false)
+        *
+        * @internal param \IContextSource|null $context
+        * @return ParserOutput representing the HTML form of the text
+        */
+       public function getParserOutput( Title $title,
+               $revId = null,
+               ParserOptions $options = null, $generateHtml = true
+       ) {
+               global $wgParser;
+
+               if ( !$options ) {
+                       //NOTE: use canonical options per default to produce cacheable output
+                       $options = $this->getContentHandler()->makeParserOptions( 'canonical' );
+               }
+
+               $po = $wgParser->parse( $this->getNativeData(), $title, $options, true, true, $revId );
+               return $po;
+       }
+
+       protected function getHtml() {
+               throw new MWException(
+                       "getHtml() not implemented for wikitext. "
+                               . "Use getParserOutput()->getText()."
+               );
+       }
+
+       /**
+        * @see  Content::matchMagicWord()
+        *
+        * This implementation calls $word->match() on the this TextContent object's text.
+        *
+        * @param MagicWord $word
+        *
+        * @return bool whether this Content object matches the given magic word.
+        */
+       public function matchMagicWord( MagicWord $word ) {
+               return $word->match( $this->getNativeData() );
+       }
+}
diff --git a/includes/content/WikitextContentHandler.php b/includes/content/WikitextContentHandler.php
new file mode 100644 (file)
index 0000000..7e9e5e8
--- /dev/null
@@ -0,0 +1,81 @@
+<?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
+ */
+
+/**
+ * @since 1.21
+ */
+class WikitextContentHandler extends TextContentHandler {
+
+       public function __construct( $modelId = CONTENT_MODEL_WIKITEXT ) {
+               parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) );
+       }
+
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new WikitextContent( $text );
+       }
+
+       /**
+        * @see ContentHandler::makeEmptyContent
+        *
+        * @return Content
+        */
+       public function makeEmptyContent() {
+               return new WikitextContent( '' );
+       }
+
+
+       /**
+        * Returns a WikitextContent object representing a redirect to the given destination page.
+        *
+        * @see ContentHandler::makeRedirectContent
+        *
+        * @param Title $destination the page to redirect to.
+        *
+        * @return Content
+        */
+       public function makeRedirectContent( Title $destination ) {
+               $mwRedir = MagicWord::get( 'redirect' );
+               $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destination->getPrefixedText() . "]]\n";
+
+               return new WikitextContent( $redirectText );
+       }
+
+       /**
+        * Returns true because wikitext supports sections.
+        *
+        * @return boolean whether sections are supported.
+        */
+       public function supportsSections() {
+               return true;
+       }
+
+       /**
+        * Returns true, because wikitext supports caching using the
+        * ParserCache mechanism.
+        *
+        * @since 1.21
+        * @return bool
+        */
+       public function isParserCacheSupported() {
+               return true;
+       }
+}
index 45bd6ff..d5a6d15 100644 (file)
@@ -165,6 +165,4 @@ abstract class ContextSource implements IContextSource {
                $args = func_get_args();
                return call_user_func_array( array( $this->getContext(), 'msg' ), $args );
        }
-       
 }
-
index 5adf362..a4e3272 100644 (file)
@@ -222,6 +222,7 @@ class DerivativeContext extends ContextSource {
         * Set the Language object
         *
         * @param $l Mixed Language instance or language code
+        * @throws MWException
         * @since 1.19
         */
        public function setLanguage( $l ) {
index 1ffbc08..e4de030 100644 (file)
@@ -93,6 +93,8 @@ class RequestContext implements IContextSource {
         */
        public function setTitle( Title $t ) {
                $this->title = $t;
+               // Erase the WikiPage so a new one with the new title gets created.
+               $this->wikipage = null;
        }
 
        /**
@@ -138,6 +140,12 @@ class RequestContext implements IContextSource {
         * @param $p WikiPage object
         */
        public function setWikiPage( WikiPage $p ) {
+               $contextTitle = $this->getTitle();
+               $pageTitle = $p->getTitle();
+               if ( !$contextTitle || !$pageTitle->equals( $contextTitle ) ) {
+                       $this->setTitle( $pageTitle );
+               }
+               // Defer this to the end since setTitle sets it to null.
                $this->wikipage = $p;
        }
 
@@ -148,6 +156,7 @@ class RequestContext implements IContextSource {
         * canUseWikiPage() to check whether this method can be called safely.
         *
         * @since 1.19
+        * @throws MWException
         * @return WikiPage
         */
        public function getWikiPage() {
@@ -237,6 +246,7 @@ class RequestContext implements IContextSource {
         * Set the Language object
         *
         * @param $l Mixed Language instance or language code
+        * @throws MWException
         * @since 1.19
         */
        public function setLanguage( $l ) {
@@ -305,7 +315,7 @@ class RequestContext implements IContextSource {
        public function getSkin() {
                if ( $this->skin === null ) {
                        wfProfileIn( __METHOD__ . '-createskin' );
-                       
+
                        $skin = null;
                        wfRunHooks( 'RequestContextCreateSkin', array( $this, &$skin ) );
 
@@ -395,4 +405,3 @@ class RequestContext implements IContextSource {
        }
 
 }
-
diff --git a/includes/dao/DBAccessBase.php b/includes/dao/DBAccessBase.php
new file mode 100644 (file)
index 0000000..a27bef5
--- /dev/null
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * Base class for objects that allow access to other wiki's databases using
+ * the foreign database access mechanism implemented by LBFactory_multi.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Database
+ *
+ * @licence GNU GPL v2+
+ * @author Daniel Kinzler
+ */
+abstract class DBAccessBase implements IDBAccessObject {
+
+       /**
+        * @var String|bool $wiki The target wiki's name. This must be an ID
+        * that LBFactory can understand.
+        */
+       protected $wiki;
+
+       /**
+        * @param String|bool $wiki The target wiki's name. This must be an ID
+        * that LBFactory can understand.
+        */
+       public function __construct( $wiki = false ) {
+               $this->wiki = $wiki;
+       }
+
+       /**
+        * Returns a database connection.
+        *
+        * @see wfGetDB()
+        * @see LoadBalancer::getConnection()
+        *
+        * @since 1.21
+        *
+        * @param int $id Which connection to use
+        * @param array $groups Query groups
+        *
+        * @return DatabaseBase
+        */
+       protected function getConnection( $id, $groups = array() ) {
+               $loadBalancer = wfGetLB( $this->wiki );
+               return $loadBalancer->getConnection( $id, $groups, $this->wiki );
+       }
+
+       /**
+        * Releases a database connection and makes it available for recycling.
+        *
+        * @see LoadBalancer::reuseConnection()
+        *
+        * @since 1.21
+        *
+        * @param DatabaseBase  $db the database connection to release.
+        */
+       protected function releaseConnection( DatabaseBase $db ) {
+               if ( $this->wiki !== false ) {
+                       $loadBalancer = $this->getLoadBalancer();
+                       $loadBalancer->reuseConnection( $db );
+               }
+       }
+
+       /**
+        * Get the database type used for read operations.
+        *
+        * @see wfGetLB
+        *
+        * @since 1.21
+        *
+        * @return LoadBalancer The database load balancer object
+        */
+       public function getLoadBalancer() {
+               return wfGetLB( $this->wiki );
+       }
+}
index e30522a..f847b98 100644 (file)
@@ -41,6 +41,8 @@
  *   - 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
+ *
+ * @since 1.20
  */
 interface IDBAccessObject {
        // Constants for object loading bitfield flags (higher => higher QoS)
index 4e43642..4ff7913 100644 (file)
@@ -87,18 +87,17 @@ class CloneDatabase {
         * Clone the table structure
         */
        public function cloneTableStructure() {
-               
                foreach( $this->tablesToClone as $tbl ) {
                        # Clean up from previous aborted run.  So that table escaping
                        # works correctly across DB engines, we need to change the pre-
                        # fix back and forth so tableName() works right.
-                       
+
                        self::changePrefix( $this->oldTablePrefix );
                        $oldTableName = $this->db->tableName( $tbl, 'raw' );
-                       
+
                        self::changePrefix( $this->newTablePrefix );
                        $newTableName = $this->db->tableName( $tbl, 'raw' );
-                       
+
                        if( $this->dropCurrentTables && !in_array( $this->db->getType(), array( 'postgres', 'oracle' ) ) ) {
                                $this->db->dropTable( $tbl, __METHOD__ );
                                wfDebug( __METHOD__." dropping {$newTableName}\n", true);
@@ -108,9 +107,7 @@ class CloneDatabase {
                        # Create new table
                        wfDebug( __METHOD__." duplicating $oldTableName to $newTableName\n", true );
                        $this->db->duplicateTableStructure( $oldTableName, $newTableName, $this->useTemporaryTables );
-                       
                }
-               
        }
 
        /**
index b250fda..a638540 100644 (file)
@@ -228,8 +228,11 @@ abstract class DatabaseBase implements DatabaseType {
        protected $mConn = null;
        protected $mOpened = false;
 
-       /** @var Array */
-       protected $trxIdleCallbacks = array();
+       /**
+        * @since 1.20
+        * @var array of Closure
+        */
+       protected $mTrxIdleCallbacks = array();
 
        protected $mTablePrefix;
        protected $mFlags;
@@ -263,6 +266,21 @@ abstract class DatabaseBase implements DatabaseType {
         */
        private $mTrxDoneWrites = false;
 
+       /**
+        * Record if the current transaction was started implicitly due to DBO_TRX being set.
+        *
+        * @var Bool
+        * @see DatabaseBase::mTrxLevel
+        */
+       private $mTrxAutomatic = false;
+
+       /**
+        * @since 1.21
+        * @var file handle for upgrade
+        */
+       protected $fileHandle = null;
+
+
 # ------------------------------------------------------------------------------
 # Accessors
 # ------------------------------------------------------------------------------
@@ -279,6 +297,13 @@ abstract class DatabaseBase implements DatabaseType {
                return $this->getServerVersion();
        }
 
+       /**
+        * @return string: command delimiter used by this database engine
+        */
+       public function getDelimiter() {
+               return $this->delimiter;
+       }
+
        /**
         * Boolean, controls output of large amounts of debug information.
         * @param $debug bool|null
@@ -368,6 +393,15 @@ abstract class DatabaseBase implements DatabaseType {
                return wfSetVar( $this->mTablePrefix, $prefix );
        }
 
+       /**
+        * Set the filehandle to copy write statements to.
+        *
+        * @param $fh filehandle
+        */
+       public function setFileHandle( $fh ) {
+               $this->fileHandle = $fh;
+       }
+
        /**
         * Get properties passed down from the server info array of the load
         * balancer.
@@ -516,6 +550,16 @@ abstract class DatabaseBase implements DatabaseType {
                return $this->mDoneWrites;
        }
 
+       /**
+        * Returns true if there is a transaction open with possible write
+        * queries or transaction idle callbacks waiting on it to finish.
+        *
+        * @return bool
+        */
+       public function writesOrCallbacksPending() {
+               return $this->mTrxLevel && ( $this->mTrxDoneWrites || $this->mTrxIdleCallbacks );
+       }
+
        /**
         * Is a connection to the database open?
         * @return Boolean
@@ -739,11 +783,20 @@ abstract class DatabaseBase implements DatabaseType {
         * @return Bool operation success. true if already closed.
         */
        public function close() {
+               if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
+                       throw new MWException( "Transaction idle callbacks still pending." );
+               }
                $this->mOpened = false;
                if ( $this->mConn ) {
                        if ( $this->trxLevel() ) {
-                               $this->commit( __METHOD__ );
+                               if ( !$this->mTrxAutomatic ) {
+                                       wfWarn( "Transaction still in progress (from {$this->mTrxFname}), " .
+                                               " performing implicit commit before closing connection!" );
+                               }
+
+                               $this->commit( __METHOD__, 'flush' );
                        }
+
                        $ret = $this->closeConnection();
                        $this->mConn = false;
                        return $ret;
@@ -761,6 +814,7 @@ abstract class DatabaseBase implements DatabaseType {
 
        /**
         * @param $error String: fallback error message, used if none is given by DB
+        * @throws DBConnectionError
         */
        function reportConnectionError( $error = 'Unknown error' ) {
                $myError = $this->lastError();
@@ -810,9 +864,9 @@ abstract class DatabaseBase implements DatabaseType {
         *     comment (you can use __METHOD__ or add some extra info)
         * @param  $tempIgnore Boolean:   Whether to avoid throwing an exception on errors...
         *     maybe best to catch the exception instead?
+        * @throws MWException
         * @return boolean|ResultWrapper. true for a successful write query, ResultWrapper object
         *     for a successful read query, or false on failure if $tempIgnore set
-        * @throws DBQueryError Thrown when the database returns an error of any kind
         */
        public function query( $sql, $fname = '', $tempIgnore = false ) {
                $isMaster = !is_null( $this->getLBInfo( 'master' ) );
@@ -850,7 +904,10 @@ abstract class DatabaseBase implements DatabaseType {
                } else {
                        $userName = '';
                }
-               $commentedSql = preg_replace( '/\s/', " /* $fname $userName */ ", $sql, 1 );
+
+               // Add trace comment to the begin of the sql string, right after the operator.
+               // Or, for one-word queries (like "BEGIN" or COMMIT") add it to the end (bug 42598)
+               $commentedSql = preg_replace( '/\s|$/', " /* $fname $userName */ ", $sql, 1 );
 
                # If DBO_TRX is set, start a transaction
                if ( ( $this->mFlags & DBO_TRX ) && !$this->mTrxLevel &&
@@ -866,6 +923,7 @@ abstract class DatabaseBase implements DatabaseType {
                                        wfDebug("Implicit transaction start.\n");
                                }
                                $this->begin( __METHOD__ . " ($fname)" );
+                               $this->mTrxAutomatic = true;
                        }
                }
 
@@ -900,6 +958,7 @@ abstract class DatabaseBase implements DatabaseType {
                if ( false === $ret && $this->wasErrorReissuable() ) {
                        # Transaction is gone, like it or not
                        $this->mTrxLevel = 0;
+                       $this->mTrxIdleCallbacks = array(); // cancel
                        wfDebug( "Connection lost, reconnecting...\n" );
 
                        if ( $this->ping() ) {
@@ -939,6 +998,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $sql String
         * @param $fname String
         * @param $tempIgnore Boolean
+        * @throws DBQueryError
         */
        public function reportQueryError( $error, $errno, $sql, $fname, $tempIgnore = false ) {
                # Ignore errors during error handling to avoid infinite recursion
@@ -1025,6 +1085,7 @@ abstract class DatabaseBase implements DatabaseType {
         * while we're doing this.
         *
         * @param $matches Array
+        * @throws DBUnexpectedError
         * @return String
         */
        protected function fillPreparedArg( $matches ) {
@@ -1536,6 +1597,10 @@ abstract class DatabaseBase implements DatabaseType {
         * @return bool|null
         */
        public function indexExists( $table, $index, $fname = 'DatabaseBase::indexExists' ) {
+               if( !$this->tableExists( $table ) ) {
+                       return null;
+               }
+
                $info = $this->indexInfo( $table, $index, $fname );
                if ( is_null( $info ) ) {
                        return null;
@@ -1648,6 +1713,10 @@ abstract class DatabaseBase implements DatabaseType {
                        $options = array( $options );
                }
 
+               $fh = null;
+               if ( isset( $options['fileHandle'] ) ) {
+                       $fh = $options['fileHandle'];
+               }
                $options = $this->makeInsertOptions( $options );
 
                if ( isset( $a[0] ) && is_array( $a[0] ) ) {
@@ -1675,6 +1744,12 @@ abstract class DatabaseBase implements DatabaseType {
                        $sql .= '(' . $this->makeList( $a ) . ')';
                }
 
+               if ( $fh !== null && false === fwrite( $fh, $sql ) ) {
+                       return false;
+               } elseif ( $fh !== null ) {
+                       return true;
+               }
+
                return (bool)$this->query( $sql, $fname );
        }
 
@@ -1740,7 +1815,7 @@ abstract class DatabaseBase implements DatabaseType {
        /**
         * Makes an encoded list of strings from an array
         * @param $a Array containing the data
-        * @param $mode int Constant
+        * @param int $mode Constant
         *      - LIST_COMMA:          comma separated, no field names
         *      - LIST_AND:            ANDed WHERE clause (without the WHERE). See
         *        the documentation for $conds in DatabaseBase::select().
@@ -1748,6 +1823,7 @@ abstract class DatabaseBase implements DatabaseType {
         *      - LIST_SET:            comma separated with field names, like a SET clause
         *      - LIST_NAMES:          comma separated field names
         *
+        * @throws MWException|DBUnexpectedError
         * @return string
         */
        public function makeList( $a, $mode = LIST_COMMA ) {
@@ -1777,7 +1853,7 @@ abstract class DatabaseBase implements DatabaseType {
                                $list .= "$value";
                        } elseif ( ( $mode == LIST_AND || $mode == LIST_OR ) && is_array( $value ) ) {
                                if ( count( $value ) == 0 ) {
-                                       throw new MWException( __METHOD__ . ': empty input' );
+                                       throw new MWException( __METHOD__ . ": empty input for field $field" );
                                } elseif ( count( $value ) == 1 ) {
                                        // Special-case single values, as IN isn't terribly efficient
                                        // Don't necessarily assume the single key is 0; we don't
@@ -2449,6 +2525,7 @@ abstract class DatabaseBase implements DatabaseType {
         *                    ANDed together in the WHERE clause
         * @param $fname      String: Calling function name (use __METHOD__) for
         *                    logs/profiling
+        * @throws DBUnexpectedError
         */
        public function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds,
                $fname = 'DatabaseBase::deleteJoin' )
@@ -2514,6 +2591,7 @@ abstract class DatabaseBase implements DatabaseType {
         *               the format. Use $conds == "*" to delete all rows
         * @param $fname String name of the calling function
         *
+        * @throws DBUnexpectedError
         * @return bool
         */
        public function delete( $table, $conds, $fname = 'DatabaseBase::delete' ) {
@@ -2612,6 +2690,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $limit Integer the SQL limit
         * @param $offset Integer|bool the SQL offset (default false)
         *
+        * @throws DBUnexpectedError
         * @return string
         */
        public function limitResult( $sql, $limit, $offset = false ) {
@@ -2860,31 +2939,38 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * This is useful for updates to different systems or separate transactions are needed.
         *
+        * @since 1.20
+        *
         * @param Closure $callback
-        * @return void
         */
        final public function onTransactionIdle( Closure $callback ) {
                if ( $this->mTrxLevel ) {
-                       $this->trxIdleCallbacks[] = $callback;
+                       $this->mTrxIdleCallbacks[] = $callback;
                } else {
                        $callback();
                }
        }
 
        /**
-        * Actually run the "on transaction idle" callbacks
+        * Actually run the "on transaction idle" callbacks.
+        *
+        * @since 1.20
         */
        protected function runOnTransactionIdleCallbacks() {
+               $autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled?
+
                $e = null; // last exception
                do { // callbacks may add callbacks :)
-                       $callbacks = $this->trxIdleCallbacks;
-                       $this->trxIdleCallbacks = array(); // recursion guard
+                       $callbacks = $this->mTrxIdleCallbacks;
+                       $this->mTrxIdleCallbacks = array(); // recursion guard
                        foreach ( $callbacks as $callback ) {
                                try {
+                                       $this->clearFlag( DBO_TRX ); // make each query its own transaction
                                        $callback();
+                                       $this->setFlag( $autoTrx ? DBO_TRX : 0 ); // restore automatic begin()
                                } catch ( Exception $e ) {}
                        }
-               } while ( count( $this->trxIdleCallbacks ) );
+               } while ( count( $this->mTrxIdleCallbacks ) );
 
                if ( $e instanceof Exception ) {
                        throw $e; // re-throw any last exception
@@ -2892,28 +2978,50 @@ abstract class DatabaseBase implements DatabaseType {
        }
 
        /**
-        * Begin a transaction
+        * Begin a transaction. If a transaction is already in progress, that transaction will be committed before the
+        * new transaction is started.
+        *
+        * Note that when the DBO_TRX flag is set (which is usually the case for web requests, but not for maintenance scripts),
+        * any previous database query will have started a transaction automatically.
+        *
+        * Nesting of transactions is not supported. Attempts to nest transactions will cause a warning, unless the current
+        * transaction was started automatically because of the DBO_TRX flag.
         *
         * @param $fname string
         */
        final public function begin( $fname = 'DatabaseBase::begin' ) {
-               if ( $this->mTrxLevel && $this->mTrxDoneWrites ) { // implicit commit
-                       // In theory, we should always warn about nesting BEGIN statements.
-                       // However, it is sometimes hard to avoid so we simply warn about ones
-                       // that involve write queries. This gives warnings about bad transactions
-                       // that could cause partial writes but not about read queries seeing more
-                       // than one DB snapshot (when in REPEATABLE-READ) due to nested BEGINs.
-                       wfWarn( "$fname: Transaction already in progress (from {$this->mTrxFname}), " .
-                               " performing implicit commit!" );
+               global $wgDebugDBTransactions;
+
+               if ( $this->mTrxLevel ) { // implicit commit
+                       if ( !$this->mTrxAutomatic ) {
+                               // We want to warn about inadvertently nested begin/commit pairs, but not about auto-committing
+                               // implicit transactions that were started by query() because DBO_TRX was set.
+
+                               wfWarn( "$fname: Transaction already in progress (from {$this->mTrxFname}), " .
+                                       " performing implicit commit!" );
+                       } else {
+                               // if the transaction was automatic and has done write operations,
+                               // log it if $wgDebugDBTransactions is enabled.
+
+                               if ( $this->mTrxDoneWrites && $wgDebugDBTransactions ) {
+                                       wfDebug( "$fname: Automatic transaction with writes in progress (from {$this->mTrxFname}), " .
+                                               " performing implicit commit!\n" );
+                               }
+                       }
+
                        $this->doCommit( $fname );
                        $this->runOnTransactionIdleCallbacks();
                }
+
                $this->doBegin( $fname );
                $this->mTrxFname = $fname;
                $this->mTrxDoneWrites = false;
+               $this->mTrxAutomatic = false;
        }
 
        /**
+        * Issues the BEGIN command to the database server.
+        *
         * @see DatabaseBase::begin()
         * @param type $fname
         */
@@ -2923,19 +3031,39 @@ abstract class DatabaseBase implements DatabaseType {
        }
 
        /**
-        * End a transaction
+        * Commits a transaction previously started using begin().
+        * If no transaction is in progress, a warning is issued.
+        *
+        * Nesting of transactions is not supported.
         *
         * @param $fname string
-        */
-       final public function commit( $fname = 'DatabaseBase::commit' ) {
-               if ( !$this->mTrxLevel ) {
-                       wfWarn( "$fname: No transaction to commit, something got out of sync!" );
+        * @param $flush String Flush flag, set to 'flush' to disable warnings about explicitly committing implicit
+        *        transactions, or calling commit when no transaction is in progress.
+        *        This will silently break any ongoing explicit transaction. Only set the flush flag if you are sure
+        *        that it is safe to ignore these warnings in your context.
+        */
+       final public function commit( $fname = 'DatabaseBase::commit', $flush = '' ) {
+               if ( $flush != 'flush' ) {
+                       if ( !$this->mTrxLevel ) {
+                               wfWarn( "$fname: No transaction to commit, something got out of sync!" );
+                       } elseif( $this->mTrxAutomatic ) {
+                               wfWarn( "$fname: Explicit commit of implicit transaction. Something may be out of sync!" );
+                       }
+               } else {
+                       if ( !$this->mTrxLevel ) {
+                               return; // nothing to do
+                       } elseif( !$this->mTrxAutomatic ) {
+                               wfWarn( "$fname: Flushing an explicit transaction, getting out of sync!" );
+                       }
                }
+
                $this->doCommit( $fname );
                $this->runOnTransactionIdleCallbacks();
        }
 
        /**
+        * Issues the COMMIT command to the database server.
+        *
         * @see DatabaseBase::commit()
         * @param type $fname
         */
@@ -2947,7 +3075,9 @@ abstract class DatabaseBase implements DatabaseType {
        }
 
        /**
-        * Rollback a transaction.
+        * Rollback a transaction previously started using begin().
+        * If no transaction is in progress, a warning is issued.
+        *
         * No-op on non-transactional databases.
         *
         * @param $fname string
@@ -2957,10 +3087,12 @@ abstract class DatabaseBase implements DatabaseType {
                        wfWarn( "$fname: No transaction to rollback, something got out of sync!" );
                }
                $this->doRollback( $fname );
-               $this->trxIdleCallbacks = array(); // cancel
+               $this->mTrxIdleCallbacks = array(); // cancel
        }
 
        /**
+        * Issues the ROLLBACK command to the database server.
+        *
         * @see DatabaseBase::rollback()
         * @param type $fname
         */
@@ -2983,6 +3115,7 @@ abstract class DatabaseBase implements DatabaseType {
         * @param $newName String: name of table to be created
         * @param $temporary Boolean: whether the new table should be temporary
         * @param $fname String: calling function name
+        * @throws MWException
         * @return Boolean: true if operation was successful
         */
        public function duplicateTableStructure( $oldName, $newName, $temporary = false,
@@ -2997,6 +3130,7 @@ abstract class DatabaseBase implements DatabaseType {
         *
         * @param $prefix string Only show tables with this prefix, e.g. mw_
         * @param $fname String: calling function name
+        * @throws MWException
         */
        function listTables( $prefix = null, $fname = 'DatabaseBase::listTables' ) {
                throw new MWException( 'DatabaseBase::listTables is not implemented in descendant class' );
@@ -3140,14 +3274,16 @@ abstract class DatabaseBase implements DatabaseType {
         * on object's error ignore settings).
         *
         * @param $filename String: File name to open
-        * @param $lineCallback Callback: Optional function called before reading each line
-        * @param $resultCallback Callback: Optional function called for each MySQL result
-        * @param $fname String: Calling function name or false if name should be
+        * @param bool|callable $lineCallback Optional function called before reading each line
+        * @param bool|callable $resultCallback Optional function called for each MySQL result
+        * @param bool|string $fname Calling function name or false if name should be
         *      generated dynamically using $filename
+        * @param bool|callable $inputCallback Callback: Optional function called for each complete line sent
+        * @throws MWException
         * @return bool|string
         */
        public function sourceFile(
-               $filename, $lineCallback = false, $resultCallback = false, $fname = false
+               $filename, $lineCallback = false, $resultCallback = false, $fname = false, $inputCallback = false
        ) {
                wfSuppressWarnings();
                $fp = fopen( $filename, 'r' );
@@ -3162,7 +3298,7 @@ abstract class DatabaseBase implements DatabaseType {
                }
 
                try {
-                       $error = $this->sourceStream( $fp, $lineCallback, $resultCallback, $fname );
+                       $error = $this->sourceStream( $fp, $lineCallback, $resultCallback, $fname, $inputCallback );
                }
                catch ( MWException $e ) {
                        fclose( $fp );
@@ -3211,10 +3347,10 @@ abstract class DatabaseBase implements DatabaseType {
         * on object's error ignore settings).
         *
         * @param $fp Resource: File handle
-        * @param $lineCallback Callback: Optional function called before reading each line
+        * @param $lineCallback Callback: Optional function called before reading each query
         * @param $resultCallback Callback: Optional function called for each MySQL result
         * @param $fname String: Calling function name
-        * @param $inputCallback Callback: Optional function called for each complete line (ended with ;) sent
+        * @param $inputCallback Callback: Optional function called for each complete query sent
         * @return bool|string
         */
        public function sourceStream( $fp, $lineCallback = false, $resultCallback = false,
@@ -3247,20 +3383,19 @@ abstract class DatabaseBase implements DatabaseType {
 
                        if ( $done || feof( $fp ) ) {
                                $cmd = $this->replaceVars( $cmd );
-                               if ( $inputCallback ) {
-                                       call_user_func( $inputCallback, $cmd );
-                               }
-                               $res = $this->query( $cmd, $fname );
 
-                               if ( $resultCallback ) {
-                                       call_user_func( $resultCallback, $res, $this );
-                               }
+                               if ( ( $inputCallback && call_user_func( $inputCallback, $cmd ) ) || !$inputCallback ) {
+                                       $res = $this->query( $cmd, $fname );
 
-                               if ( false === $res ) {
-                                       $err = $this->lastError();
-                                       return "Query \"{$cmd}\" failed with error code \"$err\".\n";
-                               }
+                                       if ( $resultCallback ) {
+                                               call_user_func( $resultCallback, $res, $this );
+                                       }
 
+                                       if ( false === $res ) {
+                                               $err = $this->lastError();
+                                               return "Query \"{$cmd}\" failed with error code \"$err\".\n";
+                                       }
+                               }
                                $cmd = '';
                        }
                }
@@ -3534,4 +3669,10 @@ abstract class DatabaseBase implements DatabaseType {
        public function __toString() {
                return (string)$this->mConn;
        }
+
+       public function __destruct() {
+               if ( count( $this->mTrxIdleCallbacks ) ) { // sanity
+                       trigger_error( "Transaction idle callbacks still pending." );
+               }
+       }
 }
index f1f6dfc..880d702 100644 (file)
@@ -496,6 +496,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
         * @param $user String
         * @param $password String
         * @param $dbName String: database name
+        * @throws DBConnectionError
         * @return DatabaseBase a fresh connection
         */
        public function open( $server, $user, $password, $dbName ) {
@@ -622,6 +623,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
        /**
         * The DBMS-dependent part of query()
         * @param  $sql String: SQL query.
+        * @throws DBUnexpectedError
         * @return object Result object for fetch functions or false on failure
         */
        protected function doQuery( $sql ) {
@@ -854,6 +856,9 @@ class DatabaseIbm_db2 extends DatabaseBase {
         *   LIST_SET           - comma separated with field names, like a SET clause
         *   LIST_NAMES         - comma separated field names
         *   LIST_SET_PREPARED  - like LIST_SET, except with ? tokens as values
+        * @param array $a
+        * @param int $mode
+        * @throws DBUnexpectedError
         * @return string
         */
        function makeList( $a, $mode = LIST_COMMA ) {
@@ -891,7 +896,8 @@ class DatabaseIbm_db2 extends DatabaseBase {
         *
         * @param $sql string SQL query we will append the limit too
         * @param $limit integer the SQL limit
-        * @param $offset integer the SQL offset (default false)
+        * @param bool|int $offset SQL offset (default false)
+        * @throws DBUnexpectedError
         * @return string
         */
        public function limitResult( $sql, $limit, $offset=false ) {
@@ -1173,7 +1179,11 @@ class DatabaseIbm_db2 extends DatabaseBase {
         * DELETE query wrapper
         *
         * Use $conds == "*" to delete all rows
-        * @return bool|\ResultWrapper
+        * @param array $table
+        * @param array|string $conds
+        * @param string $fname
+        * @throws DBUnexpectedError
+        * @return bool|ResultWrapper
         */
        public function delete( $table, $conds, $fname = 'DatabaseIbm_db2::delete' ) {
                if ( !$conds ) {
@@ -1247,6 +1257,7 @@ class DatabaseIbm_db2 extends DatabaseBase {
        /**
         * Frees memory associated with a statement resource
         * @param $res Object: statement resource to free
+        * @throws DBUnexpectedError
         * @return Boolean success or failure
         */
        public function freeResult( $res ) {
index 914ab40..317ff09 100644 (file)
@@ -61,6 +61,11 @@ class DatabaseMssql extends DatabaseBase {
 
        /**
         * Usually aborts on failure
+        * @param String $server
+        * @param String $user
+        * @param String $password
+        * @param String $dbName
+        * @throws DBConnectionError
         * @return bool|DatabaseBase|null
         */
        function open( $server, $user, $password, $dbName ) {
@@ -380,6 +385,11 @@ class DatabaseMssql extends DatabaseBase {
         *
         * Usually aborts on failure
         * If errors are explicitly ignored, returns success
+        * @param String $table
+        * @param Array $arrToInsert
+        * @param string $fname
+        * @param array $options
+        * @throws DBQueryError
         * @return bool
         */
        function insert( $table, $arrToInsert, $fname = 'DatabaseMssql::insert', $options = array() ) {
@@ -510,7 +520,15 @@ class DatabaseMssql extends DatabaseBase {
         * Source items may be literals rather than field names, but strings should be quoted with Database::addQuotes()
         * $conds may be "*" to copy the whole table
         * srcTable may be an array of tables.
-        * @return null|\ResultWrapper
+        * @param string $destTable
+        * @param array|string $srcTable
+        * @param array $varMap
+        * @param array $conds
+        * @param string $fname
+        * @param array $insertOptions
+        * @param array $selectOptions
+        * @throws DBQueryError
+        * @return null|ResultWrapper
         */
        function insertSelect( $destTable, $srcTable, $varMap, $conds, $fname = 'DatabaseMssql::insertSelect',
                $insertOptions = array(), $selectOptions = array() ) {
@@ -720,6 +738,8 @@ class DatabaseMssql extends DatabaseBase {
         * Escapes a identifier for use inm SQL.
         * Throws an exception if it is invalid.
         * Reference: http://msdn.microsoft.com/en-us/library/aa224033%28v=SQL.80%29.aspx
+        * @param $identifier
+        * @throws MWException
         * @return string
         */
        private function escapeIdentifier( $identifier ) {
index 7f389da..36a1126 100644 (file)
@@ -414,6 +414,7 @@ class DatabaseMysql extends DatabaseBase {
                # http://dev.mysql.com/doc/mysql/en/SHOW_INDEX.html
                $table = $this->tableName( $table );
                $index = $this->indexName( $index );
+
                $sql = 'SHOW INDEX FROM ' . $table;
                $res = $this->query( $sql, $fname );
 
@@ -428,7 +429,6 @@ class DatabaseMysql extends DatabaseBase {
                                $result[] = $row;
                        }
                }
-
                return empty( $result ) ? false : $result;
        }
 
@@ -805,7 +805,8 @@ class DatabaseMysql extends DatabaseBase {
         * @param $delVar string
         * @param $joinVar string
         * @param $conds array|string
-        * @param $fname bool
+        * @param bool|string $fname bool
+        * @throws DBUnexpectedError
         * @return bool|ResultWrapper
         */
        function deleteJoin( $delTable, $joinTable, $delVar, $joinVar, $conds, $fname = 'DatabaseBase::deleteJoin' ) {
@@ -951,13 +952,6 @@ class DatabaseMysql extends DatabaseBase {
 
 }
 
-/**
- * Legacy support: Database == DatabaseMysql
- *
- * @deprecated in 1.16
- */
-class Database extends DatabaseMysql {}
-
 /**
  * Utility class.
  * @ingroup Database
index 7d8884f..aa4da0f 100644 (file)
@@ -241,6 +241,11 @@ class DatabaseOracle extends DatabaseBase {
 
        /**
         * Usually aborts on failure
+        * @param string $server
+        * @param string $user
+        * @param string $password
+        * @param string $dbName
+        * @throws DBConnectionError
         * @return DatabaseBase|null
         */
        function open( $server, $user, $password, $dbName ) {
index 457bf38..419488e 100644 (file)
@@ -325,6 +325,11 @@ class DatabasePostgres extends DatabaseBase {
 
        /**
         * Usually aborts on failure
+        * @param string $server
+        * @param string $user
+        * @param string $password
+        * @param string $dbName
+        * @throws DBConnectionError
         * @return DatabaseBase|null
         */
        function open( $server, $user, $password, $dbName ) {
index f1e553d..d30d984 100644 (file)
@@ -79,11 +79,12 @@ class DatabaseSqlite extends DatabaseBase {
        /** Open an SQLite database and return a resource handle to it
         *  NOTE: only $dbName is used, the other parameters are irrelevant for SQLite databases
         *
-        * @param $server
-        * @param $user
-        * @param $pass
-        * @param $dbName
+        * @param string $server
+        * @param string $user
+        * @param string $pass
+        * @param string $dbName
         *
+        * @throws DBConnectionError
         * @return PDO
         */
        function open( $server, $user, $pass, $dbName ) {
@@ -103,6 +104,7 @@ class DatabaseSqlite extends DatabaseBase {
         *
         * @param $fileName string
         *
+        * @throws DBConnectionError
         * @return PDO|bool SQL connection or false if failed
         */
        function openFile( $fileName ) {
@@ -703,6 +705,14 @@ class DatabaseSqlite extends DatabaseBase {
        function addQuotes( $s ) {
                if ( $s instanceof Blob ) {
                        return "x'" . bin2hex( $s->fetch() ) . "'";
+               } else if ( strpos( $s, "\0" ) !== false ) {
+                       // SQLite doesn't support \0 in strings, so use the hex representation as a workaround.
+                       // This is a known limitation of SQLite's mprintf function which PDO should work around,
+                       // but doesn't. I have reported this to php.net as bug #63419:
+                       // https://bugs.php.net/bug.php?id=63419
+                       // There was already a similar report for SQLite3::escapeString, bug #62361:
+                       // https://bugs.php.net/bug.php?id=62361
+                       return "x'" . bin2hex( $s ) . "'";
                } else {
                        return $this->mConn->quote( $s );
                }
index e99ba6c..1ea4b12 100644 (file)
@@ -27,7 +27,7 @@
  * @file
  * @ingroup ORM
  *
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 
index 99413f9..dfc5916 100644 (file)
@@ -23,7 +23,7 @@
  * @file
  * @ingroup ORM
  *
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 
@@ -229,6 +229,15 @@ interface IORMTable {
         */
        public function has( array $conditions = array() );
 
+       /**
+        * Checks if the table exists
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function exists();
+
        /**
         * Returns the amount of matching records.
         * Condition field names get prefixed.
@@ -298,6 +307,72 @@ interface IORMTable {
         */
        public function setReadDb( $db );
 
+
+       /**
+        * Get the ID of the any foreign wiki to use as a target for database operations
+        *
+        * @since 1.20
+        *
+        * @return String|bool The target wiki, in a form that  LBFactory understands (or false if the local wiki is used)
+        */
+       public function getTargetWiki();
+
+       /**
+        * Set the ID of the any foreign wiki to use as a target for database operations
+        *
+        * @param String|bool $wiki The target wiki, in a form that  LBFactory understands (or false if the local wiki shall be used)
+        *
+        * @since 1.20
+        */
+       public function setTargetWiki( $wiki );
+
+       /**
+        * Get the database type used for read operations.
+        * This is to be used instead of wfGetDB.
+        *
+        * @see LoadBalancer::getConnection
+        *
+        * @since 1.20
+        *
+        * @return DatabaseBase The database object
+        */
+       public function getReadDbConnection();
+
+       /**
+        * Get the database type used for read operations.
+        * This is to be used instead of wfGetDB.
+        *
+        * @see LoadBalancer::getConnection
+        *
+        * @since 1.20
+        *
+        * @return DatabaseBase The database object
+        */
+       public function getWriteDbConnection();
+
+       /**
+        * Get the database type used for read operations.
+        *
+        * @see wfGetLB
+        *
+        * @since 1.20
+        *
+        * @return LoadBalancer The database load balancer object
+        */
+       public function getLoadBalancer();
+
+       /**
+        * Releases the lease on the given database connection. This is useful mainly
+        * for connections to a foreign wiki. It does nothing for connections to the local wiki.
+        *
+        * @see LoadBalancer::reuseConnection
+        *
+        * @param DatabaseBase $db the database
+        *
+        * @since 1.20
+        */
+       public function releaseConnection( DatabaseBase $db );
+
        /**
         * Update the records matching the provided conditions by
         * setting the fields that are keys in the $values param to
index 6008813..9b468a7 100644 (file)
@@ -70,6 +70,7 @@ class LBFactory_Multi extends LBFactory {
 
        /**
         * @param $conf array
+        * @throws MWException
         */
        function __construct( $conf ) {
                $this->chronProt = new ChronologyProtector;
@@ -153,8 +154,9 @@ class LBFactory_Multi extends LBFactory {
        }
 
        /**
-        * @param $cluster
-        * @param $wiki
+        * @param String $cluster
+        * @param bool $wiki
+        * @throws MWException
         * @return LoadBalancer
         */
        function newExternalLB( $cluster, $wiki = false ) {
index d635645..7e5feea 100644 (file)
@@ -41,6 +41,7 @@ class LoadBalancer {
         *    servers           Required. Array of server info structures.
         *    masterWaitTimeout Replication lag wait timeout
         *    loadMonitor       Name of a class used to fetch server lag and load.
+        * @throws MWException
         */
        function __construct( $params ) {
                if ( !isset( $params['servers'] ) ) {
@@ -197,6 +198,7 @@ class LoadBalancer {
         * Side effect: opens connections to databases
         * @param $group bool
         * @param $wiki bool
+        * @throws MWException
         * @return bool|int|string
         */
        function getReaderIndex( $group = false, $wiki = false ) {
@@ -452,8 +454,9 @@ class LoadBalancer {
         *
         * @param $i Integer: server index
         * @param $groups Array: query groups
-        * @param $wiki String: wiki ID
+        * @param bool|string $wiki Wiki ID
         *
+        * @throws MWException
         * @return DatabaseBase
         */
        public function &getConnection( $i, $groups = array(), $wiki = false ) {
@@ -497,16 +500,16 @@ class LoadBalancer {
                        # Couldn't find a working server in getReaderIndex()?
                        if ( $i === false ) {
                                $this->mLastError = 'No working slave server: ' . $this->mLastError;
-                               $this->reportConnectionError( $this->mErrorConnection );
                                wfProfileOut( __METHOD__ );
-                               return false;
+                               return $this->reportConnectionError( $this->mErrorConnection );
                        }
                }
 
                # Now we have an explicit index into the servers array
                $conn = $this->openConnection( $i, $wiki );
                if ( !$conn ) {
-                       $this->reportConnectionError( $this->mErrorConnection );
+                       wfProfileOut( __METHOD__ );
+                       return $this->reportConnectionError( $this->mErrorConnection );
                }
 
                wfProfileOut( __METHOD__ );
@@ -519,6 +522,7 @@ class LoadBalancer {
         * the same number of times as getConnection() to work.
         *
         * @param DatabaseBase $conn
+        * @throws MWException
         */
        public function reuseConnection( $conn ) {
                $serverIndex = $conn->getLBInfo('serverIndex');
@@ -691,6 +695,7 @@ class LoadBalancer {
         *
         * @param $server
         * @param $dbNameOverride bool
+        * @throws MWException
         * @return DatabaseBase
         */
        function reallyOpenConnection( $server, $dbNameOverride = false ) {
@@ -730,8 +735,6 @@ class LoadBalancer {
         * @throws DBConnectionError
         */
        function reportConnectionError( &$conn ) {
-               wfProfileIn( __METHOD__ );
-
                if ( !is_object( $conn ) ) {
                        // No last connection, probably due to all servers being too busy
                        wfLogDBError( "LB failure with no last connection. Connection error: {$this->mLastError}\n" );
@@ -741,9 +744,9 @@ class LoadBalancer {
                } else {
                        $server = $conn->getProperty( 'mServer' );
                        wfLogDBError( "Connection error: {$this->mLastError} ({$server})\n" );
-                       $conn->reportConnectionError( "{$this->mLastError} ({$server})" );
+                       $conn->reportConnectionError( "{$this->mLastError} ({$server})" ); // throws DBConnectionError
                }
-               wfProfileOut( __METHOD__ );
+               return false; /* not reached */
        }
 
        /**
@@ -904,7 +907,9 @@ class LoadBalancer {
                foreach ( $this->mConns as $conns2 ) {
                        foreach ( $conns2 as $conns3 ) {
                                foreach ( $conns3 as $conn ) {
-                                       $conn->commit( __METHOD__ );
+                                       if ( $conn->trxLevel() ) {
+                                               $conn->commit( __METHOD__, 'flush' );
+                                       }
                                }
                        }
                }
@@ -921,8 +926,8 @@ class LoadBalancer {
                                continue;
                        }
                        foreach ( $conns2[$masterIndex] as $conn ) {
-                               if ( $conn->trxLevel() && $conn->doneWrites() ) {
-                                       $conn->commit( __METHOD__ );
+                               if ( $conn->trxLevel() && $conn->writesOrCallbacksPending() ) {
+                                       $conn->commit( __METHOD__, 'flush' );
                                }
                        }
                }
index 090b893..7542797 100644 (file)
@@ -23,7 +23,7 @@
  * @file
  * @ingroup ORM
  *
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 interface ORMIterator extends Iterator {
index 2a5837a..160033c 100644 (file)
@@ -25,7 +25,7 @@
  * @file ORMResult.php
  * @ingroup ORM
  *
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 
index 303f3a2..d64530f 100644 (file)
@@ -27,7 +27,7 @@
  * @file ORMRow.php
  * @ingroup ORM
  *
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 
@@ -138,8 +138,9 @@ abstract class ORMRow implements IORMRow {
         *
         * @since 1.20
         *
-        * @param string $name
-        * @param mixed $default
+        * @param $name string: Field name
+        * @param $default mixed: Default value to return when none is found
+        * (default: null)
         *
         * @throws MWException
         * @return mixed
@@ -159,7 +160,7 @@ abstract class ORMRow implements IORMRow {
         *
         * @since 1.20
         *
-        * @param string$name
+        * @param $name string
         *
         * @return mixed
         */
@@ -262,8 +263,10 @@ abstract class ORMRow implements IORMRow {
                                switch ( $type ) {
                                        case 'array':
                                                $value = (array)$value;
+                                               // fall-through!
                                        case 'blob':
                                                $value = serialize( $value );
+                                               // fall-through!
                                }
 
                                $values[$this->table->getPrefixedField( $name )] = $value;
@@ -346,7 +349,7 @@ abstract class ORMRow implements IORMRow {
         * @return boolean Success indicator
         */
        protected function saveExisting( $functionName = null ) {
-               $dbw = wfGetDB( DB_MASTER );
+               $dbw = $this->table->getWriteDbConnection();
 
                $success = $dbw->update(
                        $this->table->getName(),
@@ -355,6 +358,8 @@ abstract class ORMRow implements IORMRow {
                        is_null( $functionName ) ? __METHOD__ : $functionName
                );
 
+               $this->table->releaseConnection( $dbw );
+
                // DatabaseBase::update does not always return true for success as documented...
                return $success !== false;
        }
@@ -382,13 +387,13 @@ abstract class ORMRow implements IORMRow {
         * @return boolean Success indicator
         */
        protected function insert( $functionName = null, array $options = null ) {
-               $dbw = wfGetDB( DB_MASTER );
+               $dbw = $this->table->getWriteDbConnection();
 
                $success = $dbw->insert(
                        $this->table->getName(),
                        $this->getWriteValues(),
                        is_null( $functionName ) ? __METHOD__ : $functionName,
-                       is_null( $options ) ? array( 'IGNORE' ) : $options
+                       $options
                );
 
                // DatabaseBase::insert does not always return true for success as documented...
@@ -398,6 +403,8 @@ abstract class ORMRow implements IORMRow {
                        $this->setField( 'id', $dbw->insertId() );
                }
 
+               $this->table->releaseConnection( $dbw );
+
                return $success;
        }
 
@@ -446,8 +453,8 @@ abstract class ORMRow implements IORMRow {
        }
 
        /**
-        * Gets called after successfull removal.
-        * Can be overriden to get rid of linked data.
+        * Gets called after successful removal.
+        * Can be overridden to get rid of linked data.
         *
         * @since 1.20
         */
@@ -557,7 +564,7 @@ abstract class ORMRow implements IORMRow {
                $absoluteAmount = abs( $amount );
                $isNegative = $amount < 0;
 
-               $dbw = wfGetDB( DB_MASTER );
+               $dbw = $this->table->getWriteDbConnection();
 
                $fullField = $this->table->getPrefixedField( $field );
 
@@ -572,6 +579,8 @@ abstract class ORMRow implements IORMRow {
                        $this->setField( $field, $this->getField( $field ) + $amount );
                }
 
+               $this->table->releaseConnection( $dbw );
+
                return $success;
        }
 
index a77074f..e3c8aa7 100644 (file)
  * @file ORMTable.php
  * @ingroup ORM
  *
- * @licence GNU GPL v2 or later
+ * @license GNU GPL v2 or later
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 
-abstract class ORMTable implements IORMTable {
+abstract class ORMTable extends DBAccessBase implements IORMTable {
 
        /**
         * Gets the db field prefix.
@@ -47,7 +47,7 @@ abstract class ORMTable implements IORMTable {
        protected static $instanceCache = array();
 
        /**
-        * The database connection to use for read operations.
+        * ID of the database connection to use for read operations.
         * Can be changed via @see setReadDb.
         *
         * @since 1.20
@@ -145,13 +145,17 @@ abstract class ORMTable implements IORMTable {
                        $fields = (array)$fields;
                }
 
-               return wfGetDB( $this->getReadDb() )->select(
+               $dbr = $this->getReadDbConnection();
+               $result = $dbr->select(
                        $this->getName(),
                        $this->getPrefixedFields( $fields ),
                        $this->getPrefixedValues( $conditions ),
                        is_null( $functionName ) ? __METHOD__ : $functionName,
                        $options
                );
+
+               $this->releaseConnection( $dbr );
+               return $result;
        }
 
        /**
@@ -241,15 +245,18 @@ abstract class ORMTable implements IORMTable {
         */
        public function rawSelectRow( array $fields, array $conditions = array(),
                                                                  array $options = array(), $functionName = null ) {
-               $dbr = wfGetDB( $this->getReadDb() );
+               $dbr = $this->getReadDbConnection();
 
-               return $dbr->selectRow(
+               $result = $dbr->selectRow(
                        $this->getName(),
                        $fields,
                        $conditions,
                        is_null( $functionName ) ? __METHOD__ : $functionName,
                        $options
                );
+
+               $this->releaseConnection( $dbr );
+               return $result;
        }
 
        /**
@@ -292,6 +299,21 @@ abstract class ORMTable implements IORMTable {
                return $this->selectRow( array( 'id' ), $conditions ) !== false;
        }
 
+       /**
+        * Checks if the table exists
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function exists() {
+               $dbr = $this->getReadDbConnection();
+               $exists = $dbr->tableExists( $this->getName() );
+               $this->releaseConnection( $dbr );
+
+               return $exists;
+       }
+
        /**
         * Returns the amount of matching records.
         * Condition field names get prefixed.
@@ -327,13 +349,18 @@ abstract class ORMTable implements IORMTable {
         * @return boolean Success indicator
         */
        public function delete( array $conditions, $functionName = null ) {
-               return wfGetDB( DB_MASTER )->delete(
+               $dbw = $this->getWriteDbConnection();
+
+               $result = $dbw->delete(
                        $this->getName(),
                        $conditions === array() ? '*' : $this->getPrefixedValues( $conditions ),
                        $functionName
                ) !== false; // DatabaseBase::delete does not always return true for success as documented...
+
+               $this->releaseConnection( $dbw );
+               return $result;
        }
-       
+
        /**
         * Get API parameters for the fields supported by this object.
         *
@@ -397,7 +424,7 @@ abstract class ORMTable implements IORMTable {
        }
 
        /**
-        * Get the database type used for read operations.
+        * Get the database ID used for read operations.
         *
         * @since 1.20
         *
@@ -408,7 +435,7 @@ abstract class ORMTable implements IORMTable {
        }
 
        /**
-        * Set the database type to use for read operations.
+        * Set the database ID to use for read operations, use DB_XXX constants or an index to the load balancer setup.
         *
         * @param integer $db
         *
@@ -418,6 +445,70 @@ abstract class ORMTable implements IORMTable {
                $this->readDb = $db;
        }
 
+       /**
+        * Get the ID of the any foreign wiki to use as a target for database operations
+        *
+        * @since 1.20
+        *
+        * @return String|bool The target wiki, in a form that  LBFactory understands (or false if the local wiki is used)
+        */
+       public function getTargetWiki() {
+               return $this->wiki;
+       }
+
+       /**
+        * Set the ID of the any foreign wiki to use as a target for database operations
+        *
+        * @param String|bool $wiki The target wiki, in a form that  LBFactory understands (or false if the local wiki shall be used)
+        *
+        * @since 1.20
+        */
+       public function setTargetWiki( $wiki ) {
+               $this->wiki = $wiki;
+       }
+
+       /**
+        * Get the database type used for read operations.
+        * This is to be used instead of wfGetDB.
+        *
+        * @see LoadBalancer::getConnection
+        *
+        * @since 1.20
+        *
+        * @return DatabaseBase The database object
+        */
+       public function getReadDbConnection() {
+               return $this->getConnection( $this->getReadDb(), array() );
+       }
+
+       /**
+        * Get the database type used for read operations.
+        * This is to be used instead of wfGetDB.
+        *
+        * @see LoadBalancer::getConnection
+        *
+        * @since 1.20
+        *
+        * @return DatabaseBase The database object
+        */
+       public function getWriteDbConnection() {
+               return $this->getConnection( DB_MASTER, array() );
+       }
+
+       /**
+        * Releases the lease on the given database connection. This is useful mainly
+        * for connections to a foreign wiki. It does nothing for connections to the local wiki.
+        *
+        * @see LoadBalancer::reuseConnection
+        *
+        * @param DatabaseBase $db the database
+        *
+        * @since 1.20
+        */
+       public function releaseConnection( DatabaseBase $db ) {
+               parent::releaseConnection( $db ); // just make it public
+       }
+
        /**
         * Update the records matching the provided conditions by
         * setting the fields that are keys in the $values param to
@@ -431,14 +522,17 @@ abstract class ORMTable implements IORMTable {
         * @return boolean Success indicator
         */
        public function update( array $values, array $conditions = array() ) {
-               $dbw = wfGetDB( DB_MASTER );
+               $dbw = $this->getWriteDbConnection();
 
-               return $dbw->update(
+               $result = $dbw->update(
                        $this->getName(),
                        $this->getPrefixedValues( $values ),
                        $this->getPrefixedValues( $conditions ),
                        __METHOD__
                ) !== false; // DatabaseBase::update does not always return true for success as documented...
+
+               $this->releaseConnection( $dbw );
+               return $result;
        }
 
        /**
@@ -450,6 +544,7 @@ abstract class ORMTable implements IORMTable {
         * @param array $conditions
         */
        public function updateSummaryFields( $summaryFields = null, array $conditions = array() ) {
+               $slave = $this->getReadDb();
                $this->setReadDb( DB_MASTER );
 
                /**
@@ -461,7 +556,7 @@ abstract class ORMTable implements IORMTable {
                        $item->save();
                }
 
-               $this->setReadDb( DB_SLAVE );
+               $this->setReadDb( $slave );
        }
 
        /**
index d02bcf5..8c60eca 100644 (file)
@@ -135,6 +135,7 @@ class MWDebug {
         * @since 1.19
         * @param $msg string
         * @param $callerOffset int
+        * @param $level int A PHP error level. See sendWarning()
         * @return mixed
         */
        public static function warning( $msg, $callerOffset = 1, $level = E_USER_NOTICE ) {
index 72eb5d3..6a6f930 100644 (file)
@@ -5,6 +5,21 @@
  * Copyright © 2000, 2001 Geoffrey T. Dairiki <dairiki@dairiki.org>
  * You may copy this code freely under the conditions of the GPL.
  *
+ * This program is free software; you can redistribute it and/or modify
+ * 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 DifferenceEngine
  * @defgroup DifferenceEngine DifferenceEngine
@@ -311,7 +326,7 @@ class _DiffEngine {
         * [XOFF, XLIM) and [YOFF, YLIM) into NCHUNKS approximately equally
         * sized segments.
         *
-        * Returns (LCS, PTS).  LCS is the length of the LCS. PTS is an
+        * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an
         * array of NCHUNKS+1 (X, Y) indexes giving the diving points between
         * sub sequences.  The first sub-sequence is contained in [X0, X1),
         * [Y0, Y1), the second in [X1, X2), [Y1, Y2) and so on.  Note
index c7156fb..6fcf0e8 100644 (file)
@@ -38,7 +38,10 @@ class DifferenceEngine extends ContextSource {
         * @private
         */
        var $mOldid, $mNewid;
-       var $mOldtext, $mNewtext;
+       /**
+        * @var Content
+        */
+       var $mOldContent, $mNewContent;
        protected $mDiffLang;
 
        /**
@@ -224,6 +227,10 @@ class DifferenceEngine extends ContextSource {
                # we'll use the application/x-external-editor interface to call
                # an external diff tool like kompare, kdiff3, etc.
                if ( ExternalEdit::useExternalEngine( $this->getContext(), 'diff' ) ) {
+                       //TODO: come up with a good solution for non-text content here.
+                       //      at least, the content format needs to be passed to the client somehow.
+                       //      Currently, action=raw will just fail for non-text content.
+
                        $urls = array(
                                'File' => array( 'Extension' => 'wiki', 'URL' =>
                                        # This should be mOldPage, but it may not be set, see below.
@@ -417,8 +424,8 @@ class DifferenceEngine extends ContextSource {
        /**
         * Get a link to mark the change as patrolled, or '' if there's either no
         * revision to patrol or the user is not allowed to to it.
-        * Side effect: this method will call OutputPage::preventClickjacking()
-        * when a link is builded.
+        * Side effect: When the patrol link is build, this method will call
+        * OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
         *
         * @return String
         */
@@ -459,6 +466,8 @@ class DifferenceEngine extends ContextSource {
                                // Build the link
                                if ( $rcid ) {
                                        $this->getOutput()->preventClickjacking();
+                                       $this->getOutput()->addModules( 'mediawiki.page.patrol.ajax' );
+
                                        $token = $this->getUser()->getEditToken( $rcid );
                                        $this->mMarkPatrolledLink = ' <span class="patrollink">[' . Linker::linkKnown(
                                                $this->mNewPage,
@@ -510,19 +519,23 @@ class DifferenceEngine extends ContextSource {
                        $out->setRevisionTimestamp( $this->mNewRev->getTimestamp() );
                        $out->setArticleFlag( true );
 
+                       // NOTE: only needed for B/C: custom rendering of JS/CSS via hook
                        if ( $this->mNewPage->isCssJsSubpage() || $this->mNewPage->isCssOrJsPage() ) {
                                // Stolen from Article::view --AG 2007-10-11
                                // Give hooks a chance to customise the output
                                // @TODO: standardize this crap into one function
-                               if ( wfRunHooks( 'ShowRawCssJs', array( $this->mNewtext, $this->mNewPage, $out ) ) ) {
-                                       // Wrap the whole lot in a <pre> and don't parse
-                                       $m = array();
-                                       preg_match( '!\.(css|js)$!u', $this->mNewPage->getText(), $m );
-                                       $out->addHTML( "<pre class=\"mw-code mw-{$m[1]}\" dir=\"ltr\">\n" );
-                                       $out->addHTML( htmlspecialchars( $this->mNewtext ) );
-                                       $out->addHTML( "\n</pre>\n" );
+                               if ( ContentHandler::runLegacyHooks( 'ShowRawCssJs', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+                                       // NOTE: deprecated hook, B/C only
+                                       // use the content object's own rendering
+                                       $cnt = $this->mNewRev->getContent();
+                                       $po = $cnt ? $cnt->getParserOutput( $this->mNewRev->getTitle(), $this->mNewRev->getId() ) : null;
+                                       $txt = $po ? $po->getText() : '';
+                                       $out->addHTML( $txt );
                                }
-                       } elseif ( !wfRunHooks( 'ArticleViewCustom', array( $this->mNewtext, $this->mNewPage, $out ) ) ) {
+                       } elseif( !wfRunHooks( 'ArticleContentViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+                               // Handled by extension
+                       } elseif( !ContentHandler::runLegacyHooks( 'ArticleViewCustom', array( $this->mNewContent, $this->mNewPage, $out ) ) ) {
+                               // NOTE: deprecated hook, B/C only
                                // Handled by extension
                        } else {
                                // Normal page
@@ -536,16 +549,21 @@ class DifferenceEngine extends ContextSource {
                                        $wikiPage = WikiPage::factory( $this->mNewPage );
                                }
 
-                               $parserOptions = $wikiPage->makeParserOptions( $this->getContext() );
+                               $parserOutput = $this->getParserOutput( $wikiPage, $this->mNewRev );
 
-                               if ( !$this->mNewRev->isCurrent() ) {
-                                       $parserOptions->setEditSection( false );
-                               }
+                               # Also try to load it as a redirect
+                               $rt = $this->mNewContent ? $this->mNewContent->getRedirectTarget() : null;
 
-                               $parserOutput = $wikiPage->getParserOutput( $parserOptions, $this->mNewid );
+                               if ( $rt ) {
+                                       $article = Article::newFromTitle( $this->mNewPage, $this->getContext() );
+                                       $out->addHTML( $article->viewRedirect( $rt ) );
 
-                               # WikiPage::getParserOutput() should not return false, but just in case
-                               if( $parserOutput ) {
+                                       # WikiPage::getParserOutput() should not return false, but just in case
+                                       if ( $parserOutput ) {
+                                               # Show categories etc.
+                                               $out->addParserOutputNoText( $parserOutput );
+                                       }
+                               } else if ( $parserOutput ) {
                                        $out->addParserOutput( $parserOutput );
                                }
                        }
@@ -556,6 +574,17 @@ class DifferenceEngine extends ContextSource {
                wfProfileOut( __METHOD__ );
        }
 
+       protected function getParserOutput( WikiPage $page, Revision $rev ) {
+               $parserOptions = $page->makeParserOptions( $this->getContext() );
+
+               if ( !$rev->isCurrent() || !$rev->getTitle()->quickUserCan( "edit" ) ) {
+                       $parserOptions->setEditSection( false );
+               }
+
+               $parserOutput = $page->getParserOutput( $parserOptions, $rev->getId() );
+               return $parserOutput;
+       }
+
        /**
         * Get the diff text, send it to the OutputPage object
         * Returns false if the diff could not be generated, otherwise returns true
@@ -584,8 +613,8 @@ class DifferenceEngine extends ContextSource {
        /**
         * Get complete diff table, including header
         *
-        * @param $otitle Title: old title
-        * @param $ntitle Title: new title
+        * @param string|bool $otitle Header for old text or false
+        * @param string|bool $ntitle Header for new text or false
         * @param $notice String: HTML between diff header and body
         * @return mixed
         */
@@ -652,7 +681,7 @@ class DifferenceEngine extends ContextSource {
                        return false;
                }
 
-               $difftext = $this->generateDiffBody( $this->mOldtext, $this->mNewtext );
+               $difftext = $this->generateContentDiffBody( $this->mOldContent, $this->mNewContent );
 
                // Save to cache for 7 days
                if ( !wfRunHooks( 'AbortDiffCache', array( &$this ) ) ) {
@@ -689,14 +718,63 @@ class DifferenceEngine extends ContextSource {
                }
        }
 
+       /**
+        * Generate a diff, no caching.
+        *
+        * This implementation uses generateTextDiffBody() to generate a diff based on the default
+        * serialization of the given Content objects. This will fail if $old or $new are not
+        * instances of TextContent.
+        *
+        * Subclasses may override this to provide a different rendering for the diff,
+        * perhaps taking advantage of the content's native form. This is required for all content
+        * models that are not text based.
+        *
+        * @param $old Content: old content
+        * @param $new Content: new content
+        *
+        * @since 1.21
+        * @throws MWException if $old or $new are not instances of TextContent.
+        */
+       function generateContentDiffBody( Content $old, Content $new ) {
+               if ( !( $old instanceof TextContent ) ) {
+                       throw new MWException( "Diff not implemented for " . get_class( $old ) . "; "
+                                       . "override generateContentDiffBody to fix this." );
+               }
+
+               if ( !( $new instanceof TextContent ) ) {
+                       throw new MWException( "Diff not implemented for " . get_class( $new ) . "; "
+                               . "override generateContentDiffBody to fix this." );
+               }
+
+               $otext = $old->serialize();
+               $ntext = $new->serialize();
+
+               return $this->generateTextDiffBody( $otext, $ntext );
+       }
+
        /**
         * Generate a diff, no caching
         *
         * @param $otext String: old text, must be already segmented
         * @param $ntext String: new text, must be already segmented
-        * @return bool|string
+        * @deprecated since 1.21, use generateContentDiffBody() instead!
         */
        function generateDiffBody( $otext, $ntext ) {
+               ContentHandler::deprecated( __METHOD__, "1.21" );
+
+               return $this->generateTextDiffBody( $otext, $ntext );
+       }
+
+       /**
+        * Generate a diff, no caching
+        *
+        * @todo move this to TextDifferenceEngine, make DifferenceEngine abstract. At some point.
+        *
+        * @param $otext String: old text, must be already segmented
+        * @param $ntext String: new text, must be already segmented
+        * @return bool|string
+        */
+       function generateTextDiffBody( $otext, $ntext ) {
                global $wgExternalDiffEngine, $wgContLang;
 
                wfProfileIn( __METHOD__ );
@@ -859,7 +937,7 @@ class DifferenceEngine extends ContextSource {
         *        the visibility of the revision and a link to edit the page.
         * @return String HTML fragment
         */
-       private function getRevisionHeader( Revision $rev, $complete = '' ) {
+       protected function getRevisionHeader( Revision $rev, $complete = '' ) {
                $lang = $this->getLanguage();
                $user = $this->getUser();
                $revtimestamp = $rev->getTimestamp();
@@ -951,10 +1029,25 @@ class DifferenceEngine extends ContextSource {
 
        /**
         * Use specified text instead of loading from the database
+        * @deprecated since 1.21, use setContent() instead.
         */
        function setText( $oldText, $newText ) {
-               $this->mOldtext = $oldText;
-               $this->mNewtext = $newText;
+               ContentHandler::deprecated( __METHOD__, "1.21" );
+
+               $oldContent = ContentHandler::makeContent( $oldText, $this->getTitle() );
+               $newContent = ContentHandler::makeContent( $newText, $this->getTitle() );
+
+               $this->setContent( $oldContent, $newContent );
+       }
+
+       /**
+        * Use specified text instead of loading from the database
+        * @since 1.21
+        */
+       function setContent( Content $oldContent, Content $newContent ) {
+               $this->mOldContent = $oldContent;
+               $this->mNewContent = $newContent;
+
                $this->mTextLoaded = 2;
                $this->mRevisionsLoaded = true;
        }
@@ -1082,14 +1175,14 @@ class DifferenceEngine extends ContextSource {
                        return false;
                }
                if ( $this->mOldRev ) {
-                       $this->mOldtext = $this->mOldRev->getText( Revision::FOR_THIS_USER );
-                       if ( $this->mOldtext === false ) {
+                       $this->mOldContent = $this->mOldRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                       if ( $this->mOldContent === null ) {
                                return false;
                        }
                }
                if ( $this->mNewRev ) {
-                       $this->mNewtext = $this->mNewRev->getText( Revision::FOR_THIS_USER );
-                       if ( $this->mNewtext === false ) {
+                       $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
+                       if ( $this->mNewContent === null ) {
                                return false;
                        }
                }
@@ -1110,7 +1203,7 @@ class DifferenceEngine extends ContextSource {
                if ( !$this->loadRevisionData() ) {
                        return false;
                }
-               $this->mNewtext = $this->mNewRev->getText( Revision::FOR_THIS_USER );
+               $this->mNewContent = $this->mNewRev->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                return true;
        }
 }
index 0a5efae..c7f6a20 100644 (file)
  *       'DBprefix' => '',
  *   );
  *
- * All fields must be present.  These mean the same things as $wgDBtype, 
- * $wgDBserver, etc.  This implementation is quite crude; it could easily 
- * support multiple database servers, for instance, and memcached, and it 
- * probably has bugs.  Kind of hard to reuse code when things might rely on who 
+ * All fields must be present.  These mean the same things as $wgDBtype,
+ * $wgDBserver, etc.  This implementation is quite crude; it could easily
+ * support multiple database servers, for instance, and memcached, and it
+ * probably has bugs.  Kind of hard to reuse code when things might rely on who
  * knows what configuration globals.
  *
- * If either wiki uses the UserComparePasswords hook, password authentication 
- * might fail unexpectedly unless they both do the exact same validation.  
- * There may be other corner cases like this where this will fail, but it 
+ * If either wiki uses the UserComparePasswords hook, password authentication
+ * might fail unexpectedly unless they both do the exact same validation.
+ * There may be other corner cases like this where this will fail, but it
  * should be unlikely.
  *
  * @ingroup ExternalUser
@@ -62,8 +62,8 @@ class ExternalUser_MediaWiki extends ExternalUser {
         * @return bool
         */
        protected function initFromName( $name ) {
-               # We might not need the 'usable' bit, but let's be safe.  Theoretically 
-               # this might return wrong results for old versions, but it's probably 
+               # We might not need the 'usable' bit, but let's be safe.  Theoretically
+               # this might return wrong results for old versions, but it's probably
                # good enough.
                $name = User::getCanonicalName( $name, 'usable' );
 
@@ -130,14 +130,14 @@ class ExternalUser_MediaWiki extends ExternalUser {
        }
 
        public function authenticate( $password ) {
-               # This might be wrong if anyone actually uses the UserComparePasswords hook 
+               # This might be wrong if anyone actually uses the UserComparePasswords hook
                # (on either end), so don't use this if you those are incompatible.
                return User::comparePasswords( $this->mRow->user_password, $password,
-                       $this->mRow->user_id ); 
+                       $this->mRow->user_id );
        }
 
        public function getPref( $pref ) {
-               # @todo FIXME: Return other prefs too.  Lots of global-riddled code that does 
+               # @todo FIXME: Return other prefs too.  Lots of global-riddled code that does
                # this normally.
                if ( $pref === 'emailaddress'
                && $this->row->user_email_authenticated !== null ) {
index e07c99d..5141ec5 100644 (file)
@@ -86,8 +86,8 @@ class FSFile {
 
        /**
         * Guess the MIME type from the file contents alone
-        * 
-        * @return string 
+        *
+        * @return string
         */
        public function getMimeType() {
                return MimeMagic::singleton()->guessMimeType( $this->path, false );
@@ -131,7 +131,7 @@ class FSFile {
                        # Height, width and metadata
                        $handler = MediaHandler::getHandler( $info['mime'] );
                        if ( $handler ) {
-                               $tempImage = (object)array();
+                               $tempImage = (object)array(); // XXX (hack for File object)
                                $info['metadata'] = $handler->getMetadata( $tempImage, $this->path );
                                $gis = $handler->getImageSize( $tempImage, $this->path, $info['metadata'] );
                                if ( is_array( $gis ) ) {
@@ -211,7 +211,7 @@ class FSFile {
 
        /**
         * Get the final file extension from a file system path
-        * 
+        *
         * @param $path string
         * @return string
         */
index 9349534..3c23e4c 100644 (file)
@@ -178,10 +178,10 @@ class FSFileBackend extends FileBackendStore {
        }
 
        /**
-        * @see FileBackendStore::doStoreInternal()
+        * @see FileBackendStore::doCreateInternal()
         * @return Status
         */
-       protected function doStoreInternal( array $params ) {
+       protected function doCreateInternal( array $params ) {
                $status = Status::newGood();
 
                $dest = $this->resolveToFSPath( $params['dst'] );
@@ -190,21 +190,62 @@ class FSFileBackend extends FileBackendStore {
                        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'] );
+               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 /B /Y' : 'cp', // (binary, overwrite)
+                               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::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 ( !empty( $params['async'] ) ) { // deferred
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+                       $cmd = implode( ' ', array(
+                               wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
                                wfEscapeShellArg( $this->cleanPathSlashes( $params['src'] ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
@@ -255,21 +296,16 @@ class FSFileBackend extends FileBackendStore {
                        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 ( !is_file( $source ) ) {
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-copy', $params['src'] );
                        }
+                       return $status; // do nothing; either OK or bad status
                }
 
                if ( !empty( $params['async'] ) ) { // deferred
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'COPY' : 'cp',
+                       $cmd = implode( ' ', array(
+                               wfIsWindows() ? 'COPY /B /Y' : 'cp', // (binary, overwrite)
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
@@ -320,24 +356,16 @@ class FSFileBackend extends FileBackendStore {
                        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 ( !is_file( $source ) ) {
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-move', $params['src'] );
                        }
+                       return $status; // do nothing; either OK or bad status
                }
 
                if ( !empty( $params['async'] ) ) { // deferred
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'MOVE' : 'mv',
+                       $cmd = implode( ' ', array(
+                               wfIsWindows() ? 'MOVE /Y' : 'mv', // (overwrite)
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) ),
                                wfEscapeShellArg( $this->cleanPathSlashes( $dest ) )
                        ) );
@@ -385,7 +413,8 @@ class FSFileBackend extends FileBackendStore {
                }
 
                if ( !empty( $params['async'] ) ) { // deferred
-                       $cmd = implode( ' ', array( wfIsWindows() ? 'DEL' : 'unlink',
+                       $cmd = implode( ' ', array(
+                               wfIsWindows() ? 'DEL' : 'unlink',
                                wfEscapeShellArg( $this->cleanPathSlashes( $source ) )
                        ) );
                        $status->value = new FSFileOpHandle( $this, $params, 'Copy', $cmd );
@@ -410,71 +439,6 @@ class FSFileBackend extends FileBackendStore {
                }
        }
 
-       /**
-        * @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
@@ -644,7 +608,7 @@ class FSFileBackend extends FileBackendStore {
 
        /**
         * @see FileBackendStore::getFileListInternal()
-        * @return array|FSFileBackendFileList|null
+        * @return Array|FSFileBackendFileList|null
         */
        public function getFileListInternal( $fullCont, $dirRel, array $params ) {
                list( $b, $shortCont, $r ) = FileBackend::splitStoragePath( $params['dir'] );
@@ -662,44 +626,58 @@ class FSFileBackend extends FileBackendStore {
        }
 
        /**
-        * @see FileBackendStore::getLocalReference()
-        * @return FSFile|null
+        * @see FileBackendStore::doGetLocalReferenceMulti()
+        * @return Array
         */
-       public function getLocalReference( array $params ) {
-               $source = $this->resolveToFSPath( $params['src'] );
-               if ( $source === null ) {
-                       return null;
+       protected function doGetLocalReferenceMulti( array $params ) {
+               $fsFiles = array(); // (path => FSFile)
+
+               foreach ( $params['srcs'] as $src ) {
+                       $source = $this->resolveToFSPath( $src );
+                       if ( $source === null || !is_file( $source ) ) {
+                               $fsFiles[$src] = null; // invalid path or file does not exist
+                       } else {
+                               $fsFiles[$src] = new FSFile( $source );
+                       }
                }
-               return new FSFile( $source );
+
+               return $fsFiles;
        }
 
        /**
-        * @see FileBackendStore::getLocalCopy()
-        * @return null|TempFSFile
+        * @see FileBackendStore::doGetLocalCopyMulti()
+        * @return Array
         */
-       public function getLocalCopy( array $params ) {
-               $source = $this->resolveToFSPath( $params['src'] );
-               if ( $source === null ) {
-                       return null;
-               }
+       protected function doGetLocalCopyMulti( array $params ) {
+               $tmpFiles = array(); // (path => TempFSFile)
 
-               // 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;
+               foreach ( $params['srcs'] as $src ) {
+                       $source = $this->resolveToFSPath( $src );
+                       if ( $source === null ) {
+                               $tmpFiles[$src] = null; // invalid path
+                       } else {
+                               // Create a new temporary file with the same extension...
+                               $ext = FileBackend::extensionFromPath( $src );
+                               $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
+                               if ( !$tmpFile ) {
+                                       $tmpFiles[$src] = null;
+                               } else {
+                                       $tmpPath = $tmpFile->getPath();
+                                       // Copy the source file over the temp file
+                                       wfSuppressWarnings();
+                                       $ok = copy( $source, $tmpPath );
+                                       wfRestoreWarnings();
+                                       if ( !$ok ) {
+                                               $tmpFiles[$src] = null;
+                                       } else {
+                                               $this->chmod( $tmpPath );
+                                               $tmpFiles[$src] = $tmpFile;
+                                       }
+                               }
+                       }
                }
 
-               $this->chmod( $tmpPath );
-
-               return $tmpFile;
+               return $tmpFiles;
        }
 
        /**
index 306bf35..0b7c072 100644 (file)
@@ -129,7 +129,8 @@ abstract class FileBackend {
        }
 
        /**
-        * Get the wiki identifier used for this backend (possibly empty)
+        * Get the wiki identifier used for this backend (possibly empty).
+        * Note that this might *not* be in the same format as wfWikiID().
         *
         * @return string
         * @since 1.20
@@ -171,6 +172,7 @@ abstract class FileBackend {
         *  - copy
         *  - move
         *  - delete
+        *  - describe (since 1.21)
         *  - null
         *
         * a) Create a new file in storage with the contents of a string
@@ -181,7 +183,8 @@ abstract class FileBackend {
         *         'content'             => <string of new file contents>,
         *         'overwrite'           => <boolean>,
         *         'overwriteSame'       => <boolean>,
-        *         'disposition'         => <Content-Disposition header value>
+        *         'disposition'         => <Content-Disposition header value>,
+        *         'headers'             => <HTTP header name/value map> # since 1.21
         *     );
         * @endcode
         *
@@ -193,7 +196,8 @@ abstract class FileBackend {
         *         'dst'                 => <storage path>,
         *         'overwrite'           => <boolean>,
         *         'overwriteSame'       => <boolean>,
-        *         'disposition'         => <Content-Disposition header value>
+        *         'disposition'         => <Content-Disposition header value>,
+        *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
         *
@@ -205,6 +209,7 @@ abstract class FileBackend {
         *         'dst'                 => <storage path>,
         *         'overwrite'           => <boolean>,
         *         'overwriteSame'       => <boolean>,
+        *         'ignoreMissingSource' => <boolean>, # since 1.21
         *         'disposition'         => <Content-Disposition header value>
         *     )
         * @endcode
@@ -217,6 +222,7 @@ abstract class FileBackend {
         *         'dst'                 => <storage path>,
         *         'overwrite'           => <boolean>,
         *         'overwriteSame'       => <boolean>,
+        *         'ignoreMissingSource' => <boolean>, # since 1.21
         *         'disposition'         => <Content-Disposition header value>
         *     )
         * @endcode
@@ -230,7 +236,17 @@ abstract class FileBackend {
         *     )
         * @endcode
         *
-        * f) Do nothing (no-op)
+        * f) Update metadata for a file within storage
+        * @code
+        *     array(
+        *         'op'                  => 'describe',
+        *         'src'                 => <storage path>,
+        *         'disposition'         => <Content-Disposition header value>,
+        *         'headers'             => <HTTP header name/value map>
+        *     )
+        * @endcode
+        *
+        * g) Do nothing (no-op)
         * @code
         *     array(
         *         'op'                  => 'null',
@@ -244,10 +260,17 @@ abstract class FileBackend {
         *   - 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.
-        *   - disposition         : When supplied, the backend will add a Content-Disposition
+        *   - disposition         : If supplied, the backend will return a Content-Disposition
         *                           header when GETs/HEADs of the destination file are made.
-        *                           Backends that don't support file metadata will ignore this.
-        *                           See http://tools.ietf.org/html/rfc6266 (since 1.20).
+        *                           Backends that don't support metadata ignore this.
+        *                           See http://tools.ietf.org/html/rfc6266. (since 1.20)
+        *   - headers             : If supplied, the backend will return these headers when
+        *                           GETs/HEADs of the destination file are made. Header values
+        *                           should be smaller than 256 bytes, often options or numbers.
+        *                           Existing headers will remain, but these will replace any
+        *                           conflicting previous headers, and headers will be removed
+        *                           if they are set to an empty string.
+        *                           Backends that don't support metadata ignore this. (since 1.21)
         *
         * $opts is an associative of boolean flags, including:
         *   - force               : Operation precondition errors no longer trigger an abort.
@@ -256,16 +279,13 @@ abstract class FileBackend {
         *   - 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.
-        *   - bypassReadOnly      : Allow writes in read-only mode (since 1.20).
+        *   - bypassReadOnly      : Allow writes in read-only mode. (since 1.20)
         *   - 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 (since 1.20).
+        *                           cache were added after the files were already locked. (since 1.20)
         *
         * @remarks Remarks on locking:
         * File system paths given to operations should refer to files that are
@@ -292,7 +312,6 @@ abstract class FileBackend {
                }
                if ( empty( $opts['force'] ) ) { // sanity
                        unset( $opts['nonLocking'] );
-                       unset( $opts['allowStale'] );
                }
                return $this->doOperationsInternal( $ops, $opts );
        }
@@ -387,6 +406,21 @@ abstract class FileBackend {
                return $this->doOperation( array( 'op' => 'delete' ) + $params, $opts );
        }
 
+       /**
+        * Performs a single describe operation.
+        * This sets $params['op'] to 'describe' and passes it to doOperation().
+        *
+        * @see FileBackend::doOperation()
+        *
+        * @param $params Array Operation parameters
+        * @param $opts Array Operation options
+        * @return Status
+        * @since 1.21
+        */
+       final public function describe( array $params, array $opts = array() ) {
+               return $this->doOperation( array( 'op' => 'describe' ) + $params, $opts );
+       }
+
        /**
         * Perform a set of independent file operations on some files.
         *
@@ -400,6 +434,7 @@ abstract class FileBackend {
         *  - copy
         *  - move
         *  - delete
+        *  - describe (since 1.21)
         *  - null
         *
         * a) Create a new file in storage with the contents of a string
@@ -408,36 +443,44 @@ abstract class FileBackend {
         *         'op'                  => 'create',
         *         'dst'                 => <storage path>,
         *         'content'             => <string of new file contents>,
-        *         'disposition'         => <Content-Disposition header value>
+        *         'disposition'         => <Content-Disposition header value>,
+        *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
+        *
         * b) Copy a file system file into storage
         * @code
         *     array(
         *         'op'                  => 'store',
         *         'src'                 => <file system path>,
         *         'dst'                 => <storage path>,
-        *         'disposition'         => <Content-Disposition header value>
+        *         'disposition'         => <Content-Disposition header value>,
+        *         'headers'             => <HTTP header name/value map> # since 1.21
         *     )
         * @endcode
+        *
         * c) Copy a file within storage
         * @code
         *     array(
         *         'op'                  => 'copy',
         *         'src'                 => <storage path>,
         *         'dst'                 => <storage path>,
+        *         'ignoreMissingSource' => <boolean>, # since 1.21
         *         'disposition'         => <Content-Disposition header value>
         *     )
         * @endcode
+        *
         * d) Move a file within storage
         * @code
         *     array(
         *         'op'                  => 'move',
         *         'src'                 => <storage path>,
         *         'dst'                 => <storage path>,
+        *         'ignoreMissingSource' => <boolean>, # since 1.21
         *         'disposition'         => <Content-Disposition header value>
         *     )
         * @endcode
+        *
         * e) Delete a file within storage
         * @code
         *     array(
@@ -446,7 +489,18 @@ abstract class FileBackend {
         *         'ignoreMissingSource' => <boolean>
         *     )
         * @endcode
-        * f) Do nothing (no-op)
+        *
+        * f) Update metadata for a file within storage
+        * @code
+        *     array(
+        *         'op'                  => 'describe',
+        *         'src'                 => <storage path>,
+        *         'disposition'         => <Content-Disposition header value>,
+        *         'headers'             => <HTTP header name/value map>
+        *     )
+        * @endcode
+        *
+        * g) Do nothing (no-op)
         * @code
         *     array(
         *         'op'                  => 'null',
@@ -460,6 +514,13 @@ abstract class FileBackend {
         *                           header when GETs/HEADs of the destination file are made.
         *                           Backends that don't support file metadata will ignore this.
         *                           See http://tools.ietf.org/html/rfc6266 (since 1.20).
+        *   - headers             : If supplied, the backend will return these headers when
+        *                           GETs/HEADs of the destination file are made. Header values
+        *                           should be smaller than 256 bytes, often options or numbers.
+        *                           Existing headers will remain, but these will replace any
+        *                           conflicting previous headers, and headers will be removed
+        *                           if they are set to an empty string.
+        *                           Backends that don't support metadata ignore this. (since 1.21)
         *
         * $opts is an associative of boolean flags, including:
         *   - bypassReadOnly      : Allow writes in read-only mode (since 1.20)
@@ -575,6 +636,20 @@ abstract class FileBackend {
                return $this->doQuickOperation( array( 'op' => 'delete' ) + $params );
        }
 
+       /**
+        * Performs a single quick describe operation.
+        * This sets $params['op'] to 'describe' and passes it to doQuickOperation().
+        *
+        * @see FileBackend::doQuickOperation()
+        *
+        * @param $params Array Operation parameters
+        * @return Status
+        * @since 1.21
+        */
+       final public function quickDescribe( array $params ) {
+               return $this->doQuickOperation( array( 'op' => 'describe' ) + $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
@@ -583,8 +658,9 @@ abstract class FileBackend {
         *
         * @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
+        *   - srcs        : ordered source storage paths (e.g. chunk1, chunk2, ...)
+        *   - dst         : file system path to 0-byte temp file
+        *   - parallelize : try to do operations in parallel when possible
         * @return Status
         */
        abstract public function concatenate( array $params );
@@ -730,7 +806,29 @@ abstract class FileBackend {
         *   - latest : use the latest available data
         * @return string|bool Returns false on failure
         */
-       abstract public function getFileContents( array $params );
+       final public function getFileContents( array $params ) {
+               $contents = $this->getFileContentsMulti(
+                       array( 'srcs' => array( $params['src'] ) ) + $params );
+
+               return $contents[$params['src']];
+       }
+
+       /**
+        * Like getFileContents() except it takes an array of storage paths
+        * and returns a map of storage paths to strings (or null on failure).
+        * The map keys (paths) are in the same order as the provided list of paths.
+        *
+        * @see FileBackend::getFileContents()
+        *
+        * @param $params Array
+        * $params include:
+        *   - srcs        : list of source storage paths
+        *   - latest      : use the latest available data
+        *   - parallelize : try to do operations in parallel when possible
+        * @return Array Map of (path name => string or false on failure)
+        * @since 1.20
+        */
+       abstract public function getFileContentsMulti( array $params );
 
        /**
         * Get the size (bytes) of a file at a storage path in the backend.
@@ -772,13 +870,13 @@ abstract class FileBackend {
 
        /**
         * Get the properties of the file at a storage path in the backend.
-        * Returns FSFile::placeholderProps() on failure.
+        * This gives the result of FSFile::getProps() on a local copy of the file.
         *
         * @param $params Array
         * $params include:
         *   - src    : source storage path
         *   - latest : use the latest available data
-        * @return Array
+        * @return Array Returns FSFile::placeholderProps() on failure
         */
        abstract public function getFileProps( array $params );
 
@@ -817,7 +915,29 @@ abstract class FileBackend {
         *   - latest : use the latest available data
         * @return FSFile|null Returns null on failure
         */
-       abstract public function getLocalReference( array $params );
+       final public function getLocalReference( array $params ) {
+               $fsFiles = $this->getLocalReferenceMulti(
+                       array( 'srcs' => array( $params['src'] ) ) + $params );
+
+               return $fsFiles[$params['src']];
+       }
+
+       /**
+        * Like getLocalReference() except it takes an array of storage paths
+        * and returns a map of storage paths to FSFile objects (or null on failure).
+        * The map keys (paths) are in the same order as the provided list of paths.
+        *
+        * @see FileBackend::getLocalReference()
+        *
+        * @param $params Array
+        * $params include:
+        *   - srcs        : list of source storage paths
+        *   - latest      : use the latest available data
+        *   - parallelize : try to do operations in parallel when possible
+        * @return Array Map of (path name => FSFile or null on failure)
+        * @since 1.20
+        */
+       abstract public function getLocalReferenceMulti( array $params );
 
        /**
         * Get a local copy on disk of the file at a storage path in the backend.
@@ -830,7 +950,47 @@ abstract class FileBackend {
         *   - latest : use the latest available data
         * @return TempFSFile|null Returns null on failure
         */
-       abstract public function getLocalCopy( array $params );
+       final public function getLocalCopy( array $params ) {
+               $tmpFiles = $this->getLocalCopyMulti(
+                       array( 'srcs' => array( $params['src'] ) ) + $params );
+
+               return $tmpFiles[$params['src']];
+       }
+
+       /**
+        * Like getLocalCopy() except it takes an array of storage paths and
+        * returns a map of storage paths to TempFSFile objects (or null on failure).
+        * The map keys (paths) are in the same order as the provided list of paths.
+        *
+        * @see FileBackend::getLocalCopy()
+        *
+        * @param $params Array
+        * $params include:
+        *   - srcs        : list of source storage paths
+        *   - latest      : use the latest available data
+        *   - parallelize : try to do operations in parallel when possible
+        * @return Array Map of (path name => TempFSFile or null on failure)
+        * @since 1.20
+        */
+       abstract public function getLocalCopyMulti( array $params );
+
+       /**
+        * Return an HTTP URL to a given file that requires no authentication to use.
+        * The URL may be pre-authenticated (via some token in the URL) and temporary.
+        * This will return null if the backend cannot make an HTTP URL for the file.
+        *
+        * This is useful for key/value stores when using scripts that seek around
+        * large files and those scripts (and the backend) support HTTP Range headers.
+        * Otherwise, one would need to use getLocalReference(), which involves loading
+        * the entire file on to local disk.
+        *
+        * @param $params Array
+        * $params include:
+        *   - src : source storage path
+        * @return string|null
+        * @since 1.21
+        */
+       abstract public function getFileHttpUrl( array $params );
 
        /**
         * Check if a directory exists at a given storage path.
@@ -1005,6 +1165,17 @@ abstract class FileBackend {
                return "mwstore://{$this->name}";
        }
 
+       /**
+        * Get the storage path for the given container for this backend
+        *
+        * @param $container string Container name
+        * @return string Storage path
+        * @since 1.21
+        */
+       final public function getContainerStoragePath( $container ) {
+               return $this->getRootStoragePath() . "/{$container}";
+       }
+
        /**
         * Get the file journal object for this backend
         *
@@ -1109,6 +1280,7 @@ abstract class FileBackend {
         *
         * @param $type string One of (attachment, inline)
         * @param $filename string Suggested file name (should not contain slashes)
+        * @throws MWException
         * @return string
         * @since 1.20
         */
index 4be0323..a443a3a 100644 (file)
@@ -179,10 +179,11 @@ class FileBackendMultiWrite extends FileBackend {
                // 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.
-               // This also avoids inconsistency for expected errors (like "file already exists").
-               if ( !count( $masterStatus->getErrorsArray() ) ) {
+               // Propagate the operations to the clone backends if there were no unexpected errors
+               // and if there were either no expected errors or if the 'force' option was used.
+               // However, if nothing succeeded at all, then don't replicate any of the operations.
+               // If $ops only had one operation, this might avoid backend sync inconsistencies.
+               if ( $masterStatus->isOK() && $masterStatus->successCount > 0 ) {
                        foreach ( $this->backends as $index => $backend ) {
                                if ( $index !== $this->masterIndex ) { // not done already
                                        $realOps = $this->substOpBatchPaths( $ops, $backend );
@@ -351,7 +352,7 @@ class FileBackendMultiWrite extends FileBackend {
                                $paths[] = $op['dst'];
                        }
                }
-               return array_unique( array_filter( $paths, 'FileBackend::isStoragePath' ) );
+               return array_values( array_unique( array_filter( $paths, 'FileBackend::isStoragePath' ) ) );
        }
 
        /**
@@ -535,6 +536,7 @@ class FileBackendMultiWrite extends FileBackend {
        /**
         * @see FileBackend::fileExists()
         * @param $params array
+        * @return bool|null
         */
        public function fileExists( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
@@ -572,13 +574,19 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        /**
-        * @see FileBackend::getFileContents()
+        * @see FileBackend::getFileContentsMulti()
         * @param $params array
         * @return bool|string
         */
-       public function getFileContents( array $params ) {
+       public function getFileContentsMulti( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getFileContents( $realParams );
+               $contentsM = $this->backends[$this->masterIndex]->getFileContentsMulti( $realParams );
+
+               $contents = array(); // (path => FSFile) mapping using the proxy backend's name
+               foreach ( $contentsM as $path => $data ) {
+                       $contents[$this->unsubstPaths( $path )] = $data;
+               }
+               return $contents;
        }
 
        /**
@@ -612,23 +620,44 @@ class FileBackendMultiWrite extends FileBackend {
        }
 
        /**
-        * @see FileBackend::getLocalReference()
+        * @see FileBackend::getLocalReferenceMulti()
         * @param $params array
         * @return FSFile|null
         */
-       public function getLocalReference( array $params ) {
+       public function getLocalReferenceMulti( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getLocalReference( $realParams );
+               $fsFilesM = $this->backends[$this->masterIndex]->getLocalReferenceMulti( $realParams );
+
+               $fsFiles = array(); // (path => FSFile) mapping using the proxy backend's name
+               foreach ( $fsFilesM as $path => $fsFile ) {
+                       $fsFiles[$this->unsubstPaths( $path )] = $fsFile;
+               }
+               return $fsFiles;
        }
 
        /**
-        * @see FileBackend::getLocalCopy()
+        * @see FileBackend::getLocalCopyMulti()
         * @param $params array
         * @return null|TempFSFile
         */
-       public function getLocalCopy( array $params ) {
+       public function getLocalCopyMulti( array $params ) {
+               $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
+               $tempFilesM = $this->backends[$this->masterIndex]->getLocalCopyMulti( $realParams );
+
+               $tempFiles = array(); // (path => TempFSFile) mapping using the proxy backend's name
+               foreach ( $tempFilesM as $path => $tempFile ) {
+                       $tempFiles[$this->unsubstPaths( $path )] = $tempFile;
+               }
+               return $tempFiles;
+       }
+
+       /**
+        * @see FileBackend::getFileHttpUrl()
+        * @return string|null
+        */
+       public function getFileHttpUrl( array $params ) {
                $realParams = $this->substOpPaths( $params, $this->backends[$this->masterIndex] );
-               return $this->backends[$this->masterIndex]->getLocalCopy( $realParams );
+               return $this->backends[$this->masterIndex]->getFileHttpUrl( $realParams );
        }
 
        /**
index 5823326..b906af5 100644 (file)
@@ -48,6 +48,8 @@ abstract class FileBackendStore extends FileBackend {
 
        protected $maxFileSize = 4294967296; // integer bytes (4GiB)
 
+       const CACHE_TTL = 10; // integer; TTL in seconds for process cache entries
+
        /**
         * @see FileBackend::__construct()
         *
@@ -72,8 +74,9 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        /**
-        * 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.
+        * Check if a file can be created or changed at a given storage path.
+        * FS backends should check if the parent directory exists, files can be
+        * written under it, and that any file already there is writable.
         * Backends using key/value stores should check if the container exists.
         *
         * @param $storagePath string
@@ -83,16 +86,19 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * Create a file in the backend with the given contents.
+        * This will overwrite any file that exists at the destination.
         * 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
-        *   - disposition   : Content-Disposition header value for 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.
+        *   - content     : the raw file contents
+        *   - dst         : destination storage path
+        *   - disposition : Content-Disposition header value for the destination
+        *   - headers     : HTTP header name/value map
+        *   - async       : Status will be returned immediately if supported.
+        *                   If the status is OK, then its value field will be
+        *                   set to a FileBackendStoreOpHandle object.
+        *   - dstExists   : Whether a file exists at the destination (optimization).
+        *                   Callers can use "false" if no existing file is being changed.
         *
         * @param $params Array
         * @return Status
@@ -106,7 +112,7 @@ abstract class FileBackendStore extends FileBackend {
                } else {
                        $status = $this->doCreateInternal( $params );
                        $this->clearCache( array( $params['dst'] ) );
-                       if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
+                       if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
                                $this->deleteFileCache( $params['dst'] ); // persistent cache
                        }
                }
@@ -117,21 +123,25 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::createInternal()
+        * @return Status
         */
        abstract protected function doCreateInternal( array $params );
 
        /**
         * Store a file into the backend from a file on disk.
+        * This will overwrite any file that exists at the destination.
         * 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
-        *   - disposition   : Content-Disposition header value for 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.
+        *   - src         : source path on disk
+        *   - dst         : destination storage path
+        *   - disposition : Content-Disposition header value for the destination
+        *   - headers     : HTTP header name/value map
+        *   - async       : Status will be returned immediately if supported.
+        *                   If the status is OK, then its value field will be
+        *                   set to a FileBackendStoreOpHandle object.
+        *   - dstExists   : Whether a file exists at the destination (optimization).
+        *                   Callers can use "false" if no existing file is being changed.
         *
         * @param $params Array
         * @return Status
@@ -145,7 +155,7 @@ abstract class FileBackendStore extends FileBackend {
                } else {
                        $status = $this->doStoreInternal( $params );
                        $this->clearCache( array( $params['dst'] ) );
-                       if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
+                       if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
                                $this->deleteFileCache( $params['dst'] ); // persistent cache
                        }
                }
@@ -156,21 +166,25 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::storeInternal()
+        * @return Status
         */
        abstract protected function doStoreInternal( array $params );
 
        /**
         * Copy a file from one storage path to another in the backend.
+        * This will overwrite any file that exists at the destination.
         * 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
-        *   - disposition   : Content-Disposition header value for 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.
+        *   - src                 : source storage path
+        *   - dst                 : destination storage path
+        *   - ignoreMissingSource : do nothing if the source file does not exist
+        *   - disposition         : Content-Disposition header value for 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.
+        *   - dstExists           : Whether a file exists at the destination (optimization).
+        *                           Callers can use "false" if no existing file is being changed.
         *
         * @param $params Array
         * @return Status
@@ -180,7 +194,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = $this->doCopyInternal( $params );
                $this->clearCache( array( $params['dst'] ) );
-               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
+               if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
                        $this->deleteFileCache( $params['dst'] ); // persistent cache
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
@@ -190,6 +204,7 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::copyInternal()
+        * @return Status
         */
        abstract protected function doCopyInternal( array $params );
 
@@ -220,21 +235,25 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::deleteInternal()
+        * @return Status
         */
        abstract protected function doDeleteInternal( array $params );
 
        /**
         * Move a file from one storage path to another in the backend.
+        * This will overwrite any file that exists at the destination.
         * 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
-        *   - disposition   : Content-Disposition header value for 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.
+        *   - src                 : source storage path
+        *   - dst                 : destination storage path
+        *   - ignoreMissingSource : do nothing if the source file does not exist
+        *   - disposition         : Content-Disposition header value for 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.
+        *   - dstExists           : Whether a file exists at the destination (optimization).
+        *                           Callers can use "false" if no existing file is being changed.
         *
         * @param $params Array
         * @return Status
@@ -245,7 +264,7 @@ abstract class FileBackendStore extends FileBackend {
                $status = $this->doMoveInternal( $params );
                $this->clearCache( array( $params['src'], $params['dst'] ) );
                $this->deleteFileCache( $params['src'] ); // persistent cache
-               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
+               if ( !isset( $params['dstExists'] ) || $params['dstExists'] ) {
                        $this->deleteFileCache( $params['dst'] ); // persistent cache
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
@@ -269,6 +288,40 @@ abstract class FileBackendStore extends FileBackend {
                return $status;
        }
 
+       /**
+        * Alter metadata for a file at the storage path.
+        * Do not call this function from places outside FileBackend and FileOp.
+        *
+        * $params include:
+        *   - src           : source storage path
+        *   - disposition   : Content-Disposition header value for the destination
+        *   - headers       : HTTP header name/value map
+        *   - 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 describeInternal( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+               $status = $this->doDescribeInternal( $params );
+               $this->clearCache( array( $params['src'] ) );
+               $this->deleteFileCache( $params['src'] ); // persistent cache
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $status;
+       }
+
+       /**
+        * @see FileBackendStore::describeInternal()
+        * @return Status
+        */
+       protected function doDescribeInternal( array $params ) {
+               return Status::newGood();
+       }
+
        /**
         * No-op file operation that does nothing.
         * Do not call this function from places outside FileBackend and FileOp.
@@ -314,31 +367,41 @@ abstract class FileBackendStore extends FileBackend {
        protected function doConcatenate( array $params ) {
                $status = Status::newGood();
                $tmpPath = $params['dst']; // convenience
+               unset( $params['latest'] ); // sanity
 
                // Check that the specified temp file is valid...
                wfSuppressWarnings();
-               $ok = ( is_file( $tmpPath ) && !filesize( $tmpPath ) );
+               $ok = ( is_file( $tmpPath ) && filesize( $tmpPath ) == 0 );
                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)...
+               // Get local FS versions of the chunks needed for the concatenation...
+               $fsFiles = $this->getLocalReferenceMulti( $params );
+               foreach ( $fsFiles as $path => &$fsFile ) {
+                       if ( !$fsFile ) { // chunk failed to download?
+                               $fsFile = $this->getLocalReference( array( 'src' => $path ) );
+                               if ( !$fsFile ) { // retry failed?
+                                       $status->fatal( 'backend-fail-read', $path );
+                                       return $status;
+                               }
+                       }
+               }
+               unset( $fsFile ); // unset reference so we can reuse $fsFile
+
+               // Get a handle for the destination temp file
                $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;
-                       }
+
+               // Build up the temp file using the source chunks (in order)...
+               foreach ( $fsFiles as $virtualSource => $fsFile ) {
                        // Get a handle to the local FS version
-                       $sourceHandle = fopen( $tmpFile->getPath(), 'r' );
+                       $sourceHandle = fopen( $fsFile->getPath(), 'rb' );
                        if ( $sourceHandle === false ) {
                                fclose( $tmpHandle );
                                $status->fatal( 'backend-fail-read', $virtualSource );
@@ -500,6 +563,7 @@ abstract class FileBackendStore extends FileBackend {
                                        $subDir = $params['dir'] . "/{$subDirRel}"; // full path
                                        $status->merge( $this->doClean( array( 'dir' => $subDir ) + $params ) );
                                }
+                               unset( $subDirsRel ); // free directory for rmdir() on Windows (for FS backends)
                        }
                }
 
@@ -596,17 +660,25 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $latest = !empty( $params['latest'] ); // use latest data?
-               if ( !$this->cheapCache->has( $path, 'stat' ) ) {
+               if ( !$this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
                        $this->primeFileCache( array( $path ) ); // check persistent cache
                }
-               if ( $this->cheapCache->has( $path, 'stat' ) ) {
+               if ( $this->cheapCache->has( $path, 'stat', self::CACHE_TTL ) ) {
                        $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;
+                       if ( is_array( $stat ) ) {
+                               if ( !$latest || $stat['latest'] ) {
+                                       wfProfileOut( __METHOD__ . '-' . $this->name );
+                                       wfProfileOut( __METHOD__ );
+                                       return $stat;
+                               }
+                       } elseif ( in_array( $stat, array( 'NOT_EXIST', 'NOT_EXIST_LATEST' ) ) ) {
+                               if ( !$latest || $stat === 'NOT_EXIST_LATEST' ) {
+                                       wfProfileOut( __METHOD__ . '-' . $this->name );
+                                       wfProfileOut( __METHOD__ );
+                                       return false;
+                               }
                        }
                }
                wfProfileIn( __METHOD__ . '-miss' );
@@ -614,7 +686,7 @@ abstract class FileBackendStore extends FileBackend {
                $stat = $this->doGetFileStat( $params );
                wfProfileOut( __METHOD__ . '-miss-' . $this->name );
                wfProfileOut( __METHOD__ . '-miss' );
-               if ( is_array( $stat ) ) { // don't cache negatives
+               if ( is_array( $stat ) ) { // file exists
                        $stat['latest'] = $latest;
                        $this->cheapCache->set( $path, 'stat', $stat );
                        $this->setFileCache( $path, $stat ); // update persistent cache
@@ -622,8 +694,11 @@ abstract class FileBackendStore extends FileBackend {
                                $this->cheapCache->set( $path, 'sha1',
                                        array( 'hash' => $stat['sha1'], 'latest' => $latest ) );
                        }
-               } else {
+               } elseif ( $stat === false ) { // file does not exist
+                       $this->cheapCache->set( $path, 'stat', $latest ? 'NOT_EXIST_LATEST' : 'NOT_EXIST' );
                        wfDebug( __METHOD__ . ": File $path does not exist.\n" );
+               } else { // an error occurred
+                       wfDebug( __METHOD__ . ": Could not stat file $path.\n" );
                }
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
@@ -636,24 +711,33 @@ abstract class FileBackendStore extends FileBackend {
        abstract protected function doGetFileStat( array $params );
 
        /**
-        * @see FileBackend::getFileContents()
-        * @return bool|string
+        * @see FileBackend::getFileContentsMulti()
+        * @return Array
         */
-       public function getFileContents( array $params ) {
+       public function getFileContentsMulti( 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();
+
+               $params = $this->setConcurrencyFlags( $params );
+               $contents = $this->doGetFileContentsMulti( $params );
+
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
-               return $data;
+               return $contents;
+       }
+
+       /**
+        * @see FileBackendStore::getFileContentsMulti()
+        * @return Array
+        */
+       protected function doGetFileContentsMulti( array $params ) {
+               $contents = array();
+               foreach ( $this->doGetLocalReferenceMulti( $params ) as $path => $fsFile ) {
+                       wfSuppressWarnings();
+                       $contents[$path] = $fsFile ? file_get_contents( $fsFile->getPath() ) : false;
+                       wfRestoreWarnings();
+               }
+               return $contents;
        }
 
        /**
@@ -668,7 +752,7 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $latest = !empty( $params['latest'] ); // use latest data?
-               if ( $this->cheapCache->has( $path, 'sha1' ) ) {
+               if ( $this->cheapCache->has( $path, 'sha1', self::CACHE_TTL ) ) {
                        $stat = $this->cheapCache->get( $path, 'sha1' );
                        // If we want the latest data, check that this cached
                        // value was in fact fetched with the latest available data.
@@ -720,35 +804,82 @@ abstract class FileBackendStore extends FileBackend {
        }
 
        /**
-        * @see FileBackend::getLocalReference()
-        * @return TempFSFile|null
+        * @see FileBackend::getLocalReferenceMulti()
+        * @return Array
         */
-       public function getLocalReference( array $params ) {
-               $path = self::normalizeStoragePath( $params['src'] );
-               if ( $path === null ) {
-                       return null; // invalid storage path
-               }
+       final public function getLocalReferenceMulti( array $params ) {
                wfProfileIn( __METHOD__ );
                wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               $params = $this->setConcurrencyFlags( $params );
+
+               $fsFiles = array(); // (path => FSFile)
                $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'];
+               // Reuse any files already in process cache...
+               foreach ( $params['srcs'] as $src ) {
+                       $path = self::normalizeStoragePath( $src );
+                       if ( $path === null ) {
+                               $fsFiles[$src] = null; // invalid storage path
+                       } elseif ( $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'] ) {
+                                       $fsFiles[$src] = $val['object'];
+                               }
                        }
                }
-               $tmpFile = $this->getLocalCopy( $params );
-               if ( $tmpFile ) { // don't cache negatives
-                       $this->expensiveCache->set( $path, 'localRef',
-                               array( 'object' => $tmpFile, 'latest' => $latest ) );
+               // Fetch local references of any remaning files...
+               $params['srcs'] = array_diff( $params['srcs'], array_keys( $fsFiles ) );
+               foreach ( $this->doGetLocalReferenceMulti( $params ) as $path => $fsFile ) {
+                       $fsFiles[$path] = $fsFile;
+                       if ( $fsFile ) { // update the process cache...
+                               $this->expensiveCache->set( $path, 'localRef',
+                                       array( 'object' => $fsFile, 'latest' => $latest ) );
+                       }
                }
+
+               wfProfileOut( __METHOD__ . '-' . $this->name );
+               wfProfileOut( __METHOD__ );
+               return $fsFiles;
+       }
+
+       /**
+        * @see FileBackendStore::getLocalReferenceMulti()
+        * @return Array
+        */
+       protected function doGetLocalReferenceMulti( array $params ) {
+               return $this->doGetLocalCopyMulti( $params );
+       }
+
+       /**
+        * @see FileBackend::getLocalCopyMulti()
+        * @return Array
+        */
+       final public function getLocalCopyMulti( array $params ) {
+               wfProfileIn( __METHOD__ );
+               wfProfileIn( __METHOD__ . '-' . $this->name );
+
+               $params = $this->setConcurrencyFlags( $params );
+               $tmpFiles = $this->doGetLocalCopyMulti( $params );
+
                wfProfileOut( __METHOD__ . '-' . $this->name );
                wfProfileOut( __METHOD__ );
-               return $tmpFile;
+               return $tmpFiles;
+       }
+
+       /**
+        * @see FileBackendStore::getLocalCopyMulti()
+        * @return Array
+        */
+       abstract protected function doGetLocalCopyMulti( array $params );
+
+       /**
+        * @see FileBackend::getFileHttpUrl()
+        * @return string|null
+        */
+       public function getFileHttpUrl( array $params ) {
+               return null; // not supported
        }
 
        /**
@@ -776,6 +907,14 @@ abstract class FileBackendStore extends FileBackend {
                        $status = $this->doStreamFile( $params );
                        wfProfileOut( __METHOD__ . '-send-' . $this->name );
                        wfProfileOut( __METHOD__ . '-send' );
+                       if ( !$status->isOK() ) {
+                               // Per bug 41113, nasty things can happen if bad cache entries get
+                               // stuck in cache. It's also possible that this error can come up
+                               // with simple race conditions. Clear out the stat cache to be safe.
+                               $this->clearCache( array( $params['src'] ) );
+                               $this->deleteFileCache( $params['src'] );
+                               trigger_error( "Bad stat cache or race condition for file {$params['src']}." );
+                       }
                } else {
                        $status->fatal( 'backend-fail-stream', $params['src'] );
                }
@@ -919,12 +1058,13 @@ abstract class FileBackendStore extends FileBackend {
         */
        final public function getOperationsInternal( array $ops ) {
                $supportedOps = array(
-                       'store'       => 'StoreFileOp',
-                       'copy'        => 'CopyFileOp',
-                       'move'        => 'MoveFileOp',
-                       'delete'      => 'DeleteFileOp',
-                       'create'      => 'CreateFileOp',
-                       'null'        => 'NullFileOp'
+                       'store'    => 'StoreFileOp',
+                       'copy'     => 'CopyFileOp',
+                       'move'     => 'MoveFileOp',
+                       'delete'   => 'DeleteFileOp',
+                       'create'   => 'CreateFileOp',
+                       'describe' => 'DescribeFileOp',
+                       'null'     => 'NullFileOp'
                );
 
                $performOps = array(); // array of FileOp objects
@@ -949,6 +1089,7 @@ abstract class FileBackendStore extends FileBackend {
         * 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.
+        * All returned paths are normalized.
         *
         * @param $performOps Array List of FileOp objects
         * @return Array ('sh' => list of paths, 'ex' => list of paths)
@@ -989,6 +1130,9 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = Status::newGood();
 
+               // Fix up custom header name/value pairs...
+               $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+
                // Build up a list of FileOps...
                $performOps = $this->getOperationsInternal( $ops );
 
@@ -1038,6 +1182,12 @@ abstract class FileBackendStore extends FileBackend {
                wfProfileIn( __METHOD__ . '-' . $this->name );
                $status = Status::newGood();
 
+               // Fix up custom header name/value pairs...
+               $ops = array_map( array( $this, 'stripInvalidHeadersFromOp' ), $ops );
+
+               // Clear any file cache entries
+               $this->clearCache();
+
                $supportedOps = array( 'create', 'store', 'copy', 'move', 'delete', 'null' );
                $async = ( $this->parallelize === 'implicit' );
                $maxConcurrency = $this->concurrency; // throttle
@@ -1118,6 +1268,8 @@ abstract class FileBackendStore extends FileBackend {
 
        /**
         * @see FileBackendStore::executeOpHandlesInternal()
+        * @param array $fileOpHandles
+        * @throws MWException
         * @return Array List of corresponding Status objects
         */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
@@ -1127,6 +1279,26 @@ abstract class FileBackendStore extends FileBackend {
                return array();
        }
 
+       /**
+        * Strip long HTTP headers from a file operation
+        *
+        * @param $op array Same format as doOperation()
+        * @return Array
+        */
+       protected function stripInvalidHeadersFromOp( array $op ) {
+               if ( isset( $op['headers'] ) ) {
+                       foreach ( $op['headers'] as $name => $value ) {
+                               if ( strlen( $name ) > 255 || strlen( $value ) > 255 ) {
+                                       trigger_error( "Header '$name: $value' is too long." );
+                                       unset( $op['headers'][$name] );
+                               } elseif ( !strlen( $value ) ) {
+                                       $op['headers'][$name] = ''; // null/false => ""
+                               }
+                       }
+               }
+               return $op;
+       }
+
        /**
         * @see FileBackend::preloadCache()
         */
@@ -1415,6 +1587,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Do a batch lookup from cache for container stats for all containers
         * used in a list of container names, storage paths, or FileOp objects.
+        * This loads the persistent cache values into the process cache.
         *
         * @param $items Array
         * @return void
@@ -1471,7 +1644,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Get the cache key for a file path
         *
-        * @param $path string Storage path
+        * @param $path string Normalized storage path
         * @return string
         */
        private function fileCacheKey( $path ) {
@@ -1487,16 +1660,26 @@ abstract class FileBackendStore extends FileBackend {
         * @param $val mixed Information to cache
         */
        final protected function setFileCache( $path, $val ) {
+               $path = FileBackend::normalizeStoragePath( $path );
+               if ( $path === null ) {
+                       return; // invalid storage path
+               }
                $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.
+        * Since negatives (404s) are not cached, this does not need to be called when
+        * a file is created at a path were there was none before.
         *
         * @param $path string Storage path
         */
        final protected function deleteFileCache( $path ) {
+               $path = FileBackend::normalizeStoragePath( $path );
+               if ( $path === null ) {
+                       return; // invalid storage path
+               }
                if ( !$this->memCache->set( $this->fileCacheKey( $path ), 'PURGED', 300 ) ) {
                        trigger_error( "Unable to delete stat cache for file $path." );
                }
@@ -1505,6 +1688,7 @@ abstract class FileBackendStore extends FileBackend {
        /**
         * Do a batch lookup from cache for file stats for all paths
         * used in a list of storage paths or FileOp objects.
+        * This loads the persistent cache values into the process cache.
         *
         * @param $items Array List of storage paths or FileOps
         * @return void
@@ -1521,9 +1705,11 @@ abstract class FileBackendStore extends FileBackend {
                                $paths = array_merge( $paths, $item->storagePathsRead() );
                                $paths = array_merge( $paths, $item->storagePathsChanged() );
                        } elseif ( self::isStoragePath( $item ) ) {
-                               $paths[] = $item;
+                               $paths[] = FileBackend::normalizeStoragePath( $item );
                        }
                }
+               // Get rid of any paths that failed normalization...
+               $paths = array_filter( $paths, 'strlen' ); // remove nulls
                // Get all the corresponding cache keys for paths...
                foreach ( $paths as $path ) {
                        list( $cont, $rel, $s ) = $this->resolveStoragePath( $path );
index 7c43c48..7952bcb 100644 (file)
@@ -42,11 +42,12 @@ abstract class FileOp {
        protected $state = self::STATE_NEW; // integer
        protected $failed = false; // boolean
        protected $async = false; // boolean
-       protected $useLatest = true; // boolean
        protected $batchId; // string
 
+       protected $doOperation = true; // boolean; operation is not a no-op
        protected $sourceSha1; // string
        protected $destSameAsSource; // boolean
+       protected $destExists; // boolean
 
        /* Object life-cycle */
        const STATE_NEW = 1;
@@ -65,37 +66,61 @@ abstract class FileOp {
                list( $required, $optional ) = $this->allowedParams();
                foreach ( $required as $name ) {
                        if ( isset( $params[$name] ) ) {
-                               $this->params[$name] = $params[$name];
+                               $this->params[$name] = self::normalizeAnyStoragePaths( $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[$name] = self::normalizeAnyStoragePaths( $params[$name] );
                        }
                }
                $this->params = $params;
        }
 
        /**
-        * Set the batch UUID this operation belongs to
+        * Normalize $item or anything in $item that is a valid storage path
         *
-        * @param $batchId string
-        * @return void
+        * @param $item string|array
+        * @return string|Array
+        */
+       protected function normalizeAnyStoragePaths( $item ) {
+               if ( is_array( $item ) ) {
+                       $res = array();
+                       foreach ( $item as $k => $v ) {
+                               $k = self::normalizeIfValidStoragePath( $k );
+                               $v = self::normalizeIfValidStoragePath( $v );
+                               $res[$k] = $v;
+                       }
+                       return $res;
+               } else {
+                       return self::normalizeIfValidStoragePath( $item );
+               }
+       }
+
+       /**
+        * Normalize a string if it is a valid storage path
+        *
+        * @param $path string
+        * @return string
         */
-       final public function setBatchId( $batchId ) {
-               $this->batchId = $batchId;
+       protected static function normalizeIfValidStoragePath( $path ) {
+               if ( FileBackend::isStoragePath( $path ) ) {
+                       $res = FileBackend::normalizeStoragePath( $path );
+                       return ( $res !== null ) ? $res : $path;
+               }
+               return $path;
        }
 
        /**
-        * Whether to allow stale data for file reads and stat checks
+        * Set the batch UUID this operation belongs to
         *
-        * @param $allowStale bool
+        * @param $batchId string
         * @return void
         */
-       final public function allowStaleReads( $allowStale ) {
-               $this->useLatest = !$allowStale;
+       final public function setBatchId( $batchId ) {
+               $this->batchId = $batchId;
        }
 
        /**
@@ -175,11 +200,14 @@ abstract class FileOp {
         * @return Array
         */
        final public function getJournalEntries( array $oPredicates, array $nPredicates ) {
+               if ( !$this->doOperation ) {
+                       return array(); // this is a no-op
+               }
                $nullEntries = array();
                $updateEntries = array();
                $deleteEntries = array();
                $pathsUsed = array_merge( $this->storagePathsRead(), $this->storagePathsChanged() );
-               foreach ( $pathsUsed as $path ) {
+               foreach ( array_unique( $pathsUsed ) as $path ) {
                        $nullEntries[] = array( // assertion for recovery
                                'op'      => 'null',
                                'path'    => $path,
@@ -205,7 +233,9 @@ abstract class FileOp {
        }
 
        /**
-        * Check preconditions of the operation without writing anything
+        * Check preconditions of the operation without writing anything.
+        * This must update $predicates for each path that the op can change
+        * except when a failing status object is returned.
         *
         * @param $predicates Array
         * @return Status
@@ -241,10 +271,14 @@ abstract class FileOp {
                        return Status::newFatal( 'fileop-fail-attempt-precheck' );
                }
                $this->state = self::STATE_ATTEMPTED;
-               $status = $this->doAttempt();
-               if ( !$status->isOK() ) {
-                       $this->failed = true;
-                       $this->logFailure( 'attempt' );
+               if ( $this->doOperation ) {
+                       $status = $this->doAttempt();
+                       if ( !$status->isOK() ) {
+                               $this->failed = true;
+                               $this->logFailure( 'attempt' );
+                       }
+               } else { // no-op
+                       $status = Status::newGood();
                }
                return $status;
        }
@@ -292,15 +326,7 @@ abstract class FileOp {
         *
         * @return Array
         */
-       final public function storagePathsRead() {
-               return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsRead() );
-       }
-
-       /**
-        * @see FileOp::storagePathsRead()
-        * @return Array
-        */
-       protected function doStoragePathsRead() {
+       public function storagePathsRead() {
                return array();
        }
 
@@ -309,21 +335,13 @@ abstract class FileOp {
         *
         * @return Array
         */
-       final public function storagePathsChanged() {
-               return array_map( 'FileBackend::normalizeStoragePath', $this->doStoragePathsChanged() );
-       }
-
-       /**
-        * @see FileOp::storagePathsChanged()
-        * @return Array
-        */
-       protected function doStoragePathsChanged() {
+       public function storagePathsChanged() {
                return array();
        }
 
        /**
         * Check for errors with regards to the destination file already existing.
-        * This also updates the destSameAsSource and sourceSha1 member variables.
+        * Also set the destExists, destSameAsSource and sourceSha1 member variables.
         * A bad status will be returned if there is no chance it can be overwritten.
         *
         * @param $predicates Array
@@ -337,7 +355,8 @@ abstract class FileOp {
                        $this->sourceSha1 = $this->fileSha1( $this->params['src'], $predicates );
                }
                $this->destSameAsSource = false;
-               if ( $this->fileExists( $this->params['dst'], $predicates ) ) {
+               $this->destExists = $this->fileExists( $this->params['dst'], $predicates );
+               if ( $this->destExists ) {
                        if ( $this->getParam( 'overwrite' ) ) {
                                return $status; // OK
                        } elseif ( $this->getParam( 'overwriteSame' ) ) {
@@ -381,7 +400,7 @@ abstract class FileOp {
                if ( isset( $predicates['exists'][$source] ) ) {
                        return $predicates['exists'][$source]; // previous op assures this
                } else {
-                       $params = array( 'src' => $source, 'latest' => $this->useLatest );
+                       $params = array( 'src' => $source, 'latest' => true );
                        return $this->backend->fileExists( $params );
                }
        }
@@ -396,8 +415,10 @@ abstract class FileOp {
        final protected function fileSha1( $source, array $predicates ) {
                if ( isset( $predicates['sha1'][$source] ) ) {
                        return $predicates['sha1'][$source]; // previous op assures this
+               } elseif ( isset( $predicates['exists'][$source] ) && !$predicates['exists'][$source] ) {
+                       return false; // previous op assures this
                } else {
-                       $params = array( 'src' => $source, 'latest' => $this->useLatest );
+                       $params = array( 'src' => $source, 'latest' => true );
                        return $this->backend->getFileSha1Base36( $params );
                }
        }
@@ -430,42 +451,32 @@ abstract class FileOp {
 }
 
 /**
- * Store a file into the backend from a file on the file system.
+ * Create a file in the backend with the given content.
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
-class StoreFileOp extends FileOp {
-       /**
-        * @return array
-        */
+class CreateFileOp extends FileOp {
        protected function allowedParams() {
-               return array( array( 'src', 'dst' ),
-                       array( 'overwrite', 'overwriteSame', 'disposition' ) );
+               return array( array( 'content', 'dst' ),
+                       array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
        }
 
-       /**
-        * @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() ) {
+               // 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-store', $this->params['src'], $this->params['dst'] );
+                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
                        return $status;
-               // Check if a file can be placed at the destination
+               // Check if a file can be placed/changed 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'] );
+                       $status->fatal( 'backend-fail-create', $this->params['dst'] );
                        return $status;
                }
                // Check if destination file exists
                $status->merge( $this->precheckDestExistence( $predicates ) );
+               $this->params['dstExists'] = $this->destExists; // see FileBackendStore::setFileCache()
                if ( $status->isOK() ) {
                        // Update file existence predicates
                        $predicates['exists'][$this->params['dst']] = true;
@@ -478,57 +489,66 @@ class StoreFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               // Store the file at the destination
                if ( !$this->destSameAsSource ) {
-                       return $this->backend->storeInternal( $this->setFlags( $this->params ) );
+                       // Create the file at the destination
+                       return $this->backend->createInternal( $this->setFlags( $this->params ) );
                }
                return Status::newGood();
        }
 
        /**
-        * @return bool|string
+        * @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;
+               return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
        }
 
-       protected function doStoragePathsChanged() {
+       /**
+        * @return array
+        */
+       public function storagePathsChanged() {
                return array( $this->params['dst'] );
        }
 }
 
 /**
- * Create a file in the backend with the given content.
+ * Store a file into the backend from a file on the file system.
  * Parameters for this operation are outlined in FileBackend::doOperations().
  */
-class CreateFileOp extends FileOp {
+class StoreFileOp extends FileOp {
+       /**
+        * @return array
+        */
        protected function allowedParams() {
-               return array( array( 'content', 'dst' ),
-                       array( 'overwrite', 'overwriteSame', 'disposition' ) );
+               return array( array( 'src', 'dst' ),
+                       array( 'overwrite', 'overwriteSame', 'disposition', 'headers' ) );
        }
 
+       /**
+        * @param $predicates array
+        * @return Status
+        */
        protected function doPrecheck( array &$predicates ) {
                $status = Status::newGood();
-               // Check if the source data is too big
-               if ( strlen( $this->getParam( 'content' ) ) > $this->backend->maxFileSizeInternal() ) {
+               // 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-create', $this->params['dst'] );
+                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
                        return $status;
-               // Check if a file can be placed at the destination
+               // Check if a file can be placed/changed 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'] );
+                       $status->fatal( 'backend-fail-store', $this->params['src'], $this->params['dst'] );
                        return $status;
                }
                // Check if destination file exists
                $status->merge( $this->precheckDestExistence( $predicates ) );
+               $this->params['dstExists'] = $this->destExists; // see FileBackendStore::setFileCache()
                if ( $status->isOK() ) {
                        // Update file existence predicates
                        $predicates['exists'][$this->params['dst']] = true;
@@ -541,24 +561,27 @@ class CreateFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
+               // Store the file at the destination
                if ( !$this->destSameAsSource ) {
-                       // Create the file at the destination
-                       return $this->backend->createInternal( $this->setFlags( $this->params ) );
+                       return $this->backend->storeInternal( $this->setFlags( $this->params ) );
                }
                return Status::newGood();
        }
 
        /**
-        * @return bool|String
+        * @return bool|string
         */
        protected function getSourceSha1Base36() {
-               return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
+               wfSuppressWarnings();
+               $hash = sha1_file( $this->params['src'] );
+               wfRestoreWarnings();
+               if ( $hash !== false ) {
+                       $hash = wfBaseConvert( $hash, 16, 36, 31 );
+               }
+               return $hash;
        }
 
-       /**
-        * @return array
-        */
-       protected function doStoragePathsChanged() {
+       public function storagePathsChanged() {
                return array( $this->params['dst'] );
        }
 }
@@ -573,7 +596,7 @@ class CopyFileOp extends FileOp {
         */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ),
-                       array( 'overwrite', 'overwriteSame', 'disposition' ) );
+                       array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
        }
 
        /**
@@ -584,9 +607,17 @@ class CopyFileOp extends FileOp {
                $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
+                       if ( $this->getParam( 'ignoreMissingSource' ) ) {
+                               $this->doOperation = false; // no-op
+                               // Update file existence predicates (cache 404s)
+                               $predicates['exists'][$this->params['src']] = false;
+                               $predicates['sha1'][$this->params['src']] = false;
+                               return $status; // nothing to do
+                       } else {
+                               $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+                               return $status;
+                       }
+               // Check if a file can be placed/changed 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'] );
@@ -594,6 +625,7 @@ class CopyFileOp extends FileOp {
                }
                // Check if destination file exists
                $status->merge( $this->precheckDestExistence( $predicates ) );
+               $this->params['dstExists'] = $this->destExists; // see FileBackendStore::setFileCache()
                if ( $status->isOK() ) {
                        // Update file existence predicates
                        $predicates['exists'][$this->params['dst']] = true;
@@ -619,14 +651,14 @@ class CopyFileOp extends FileOp {
        /**
         * @return array
         */
-       protected function doStoragePathsRead() {
+       public function storagePathsRead() {
                return array( $this->params['src'] );
        }
 
        /**
         * @return array
         */
-       protected function doStoragePathsChanged() {
+       public function storagePathsChanged() {
                return array( $this->params['dst'] );
        }
 }
@@ -641,7 +673,7 @@ class MoveFileOp extends FileOp {
         */
        protected function allowedParams() {
                return array( array( 'src', 'dst' ),
-                       array( 'overwrite', 'overwriteSame', 'disposition' ) );
+                       array( 'overwrite', 'overwriteSame', 'ignoreMissingSource', 'disposition' ) );
        }
 
        /**
@@ -652,9 +684,17 @@ class MoveFileOp extends FileOp {
                $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
+                       if ( $this->getParam( 'ignoreMissingSource' ) ) {
+                               $this->doOperation = false; // no-op
+                               // Update file existence predicates (cache 404s)
+                               $predicates['exists'][$this->params['src']] = false;
+                               $predicates['sha1'][$this->params['src']] = false;
+                               return $status; // nothing to do
+                       } else {
+                               $status->fatal( 'backend-fail-notexists', $this->params['src'] );
+                               return $status;
+                       }
+               // Check if a file can be placed/changed 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'] );
@@ -662,6 +702,7 @@ class MoveFileOp extends FileOp {
                }
                // Check if destination file exists
                $status->merge( $this->precheckDestExistence( $predicates ) );
+               $this->params['dstExists'] = $this->destExists; // see FileBackendStore::setFileCache()
                if ( $status->isOK() ) {
                        // Update file existence predicates
                        $predicates['exists'][$this->params['src']] = false;
@@ -693,14 +734,14 @@ class MoveFileOp extends FileOp {
        /**
         * @return array
         */
-       protected function doStoragePathsRead() {
+       public function storagePathsRead() {
                return array( $this->params['src'] );
        }
 
        /**
         * @return array
         */
-       protected function doStoragePathsChanged() {
+       public function storagePathsChanged() {
                return array( $this->params['src'], $this->params['dst'] );
        }
 }
@@ -717,21 +758,29 @@ class DeleteFileOp extends FileOp {
                return array( array( 'src' ), array( 'ignoreMissingSource' ) );
        }
 
-       protected $needsDelete = true;
-
        /**
-        * @param array $predicates
+        * @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 ) ) {
-                       if ( !$this->getParam( 'ignoreMissingSource' ) ) {
+                       if ( $this->getParam( 'ignoreMissingSource' ) ) {
+                               $this->doOperation = false; // no-op
+                               // Update file existence predicates (cache 404s)
+                               $predicates['exists'][$this->params['src']] = false;
+                               $predicates['sha1'][$this->params['src']] = false;
+                               return $status; // nothing to do
+                       } else {
                                $status->fatal( 'backend-fail-notexists', $this->params['src'] );
                                return $status;
                        }
-                       $this->needsDelete = false;
+               // Check if a file can be placed/changed at the source
+               } elseif ( !$this->backend->isPathUsableInternal( $this->params['src'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['src'] );
+                       $status->fatal( 'backend-fail-delete', $this->params['src'] );
+                       return $status;
                }
                // Update file existence predicates
                $predicates['exists'][$this->params['src']] = false;
@@ -743,17 +792,66 @@ class DeleteFileOp extends FileOp {
         * @return Status
         */
        protected function doAttempt() {
-               if ( $this->needsDelete ) {
-                       // Delete the source file
-                       return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
+               // Delete the source file
+               return $this->backend->deleteInternal( $this->setFlags( $this->params ) );
+       }
+
+       /**
+        * @return array
+        */
+       public function storagePathsChanged() {
+               return array( $this->params['src'] );
+       }
+}
+
+/**
+ * Change metadata for a file at the given storage path in the backend.
+ * Parameters for this operation are outlined in FileBackend::doOperations().
+ */
+class DescribeFileOp extends FileOp {
+       /**
+        * @return array
+        */
+       protected function allowedParams() {
+               return array( array( 'src' ), array( 'disposition', 'headers' ) );
+       }
+
+       /**
+        * @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/changed at the source
+               } elseif ( !$this->backend->isPathUsableInternal( $this->params['src'] ) ) {
+                       $status->fatal( 'backend-fail-usable', $this->params['src'] );
+                       $status->fatal( 'backend-fail-describe', $this->params['src'] );
+                       return $status;
                }
-               return Status::newGood();
+               // Update file existence predicates
+               $predicates['exists'][$this->params['src']] =
+                       $this->fileExists( $this->params['src'], $predicates );
+               $predicates['sha1'][$this->params['src']] =
+                       $this->fileSha1( $this->params['src'], $predicates );
+               return $status; // safe to call attempt()
+       }
+
+       /**
+        * @return Status
+        */
+       protected function doAttempt() {
+               // Update the source file's metadata
+               return $this->backend->describeInternal( $this->setFlags( $this->params ) );
        }
 
        /**
         * @return array
         */
-       protected function doStoragePathsChanged() {
+       public function storagePathsChanged() {
                return array( $this->params['src'] );
        }
 }
index 3355872..6e103ec 100644 (file)
@@ -42,9 +42,6 @@ class FileOpBatch {
         * $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.
         *
@@ -69,7 +66,6 @@ class FileOpBatch {
                }
 
                $batchId = $journal->getTimestampedUUID();
-               $allowStale = !empty( $opts['allowStale'] );
                $ignoreErrors = !empty( $opts['force'] );
                $journaled = empty( $opts['nonJournaled'] );
                $maxConcurrency = isset( $opts['concurrency'] ) ? $opts['concurrency'] : 1;
@@ -84,7 +80,6 @@ class FileOpBatch {
                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 )
@@ -136,48 +131,12 @@ class FileOpBatch {
                }
 
                // Attempt each operation (in parallel if allowed and possible)...
-               if ( count( $pPerformOps ) < count( $performOps ) ) {
-                       self::runBatchParallel( $pPerformOps, $status );
-               } else {
-                       self::runBatchSeries( $performOps, $status );
-               }
+               self::runParallelBatches( $pPerformOps, $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.
         *
@@ -190,8 +149,8 @@ class FileOpBatch {
         * @param $status Status
         * @return bool Success
         */
-       protected static function runBatchParallel( array $pPerformOps, Status $status ) {
-               $aborted = false;
+       protected static function runParallelBatches( array $pPerformOps, Status $status ) {
+               $aborted = false; // set to true on unexpected errors
                foreach ( $pPerformOps as $performOpsBatch ) {
                        if ( $aborted ) { // check batch op abort flag...
                                // We can't continue (even with $ignoreErrors) as $predicates is wrong.
@@ -205,11 +164,16 @@ class FileOpBatch {
                        $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.
+                       // Get the operation handles or actually do it if there is just one.
+                       // If attemptAsync() returns a Status, it was either due to an error
+                       // or the backend does not support async ops and did it synchronously.
                        foreach ( $performOpsBatch as $i => $fileOp ) {
                                if ( !$fileOp->failed() ) { // failed => already has Status
-                                       $subStatus = $fileOp->attemptAsync();
+                                       // If the batch is just one operation, it's faster to avoid
+                                       // pipelining as that can involve creating new TCP connections.
+                                       $subStatus = ( count( $performOpsBatch ) > 1 )
+                                               ? $fileOp->attemptAsync()
+                                               : $fileOp->attempt();
                                        if ( $subStatus->value instanceof FileBackendStoreOpHandle ) {
                                                $opHandles[$i] = $subStatus->value; // deferred
                                        } else {
diff --git a/includes/filebackend/README b/includes/filebackend/README
new file mode 100644 (file)
index 0000000..6ab5481
--- /dev/null
@@ -0,0 +1,208 @@
+/*!
+\ingroup FileBackend
+\page file_backend_design File backend design
+
+Some notes on the FileBackend architecture.
+
+\section intro Introduction
+
+To abstract away the differences among different types of storage media,
+MediaWiki is providing an interface known as FileBackend. Any MediaWiki
+interaction with stored files should thus use a FileBackend object.
+
+Different types of backing storage media are supported (ranging from local
+file system to distributed object stores). The types include:
+
+* FSFileBackend (used for mounted file systems)
+* SwiftFileBackend (used for Swift or Ceph Rados+RGW object stores)
+* FileBackendMultiWrite (useful for transitioning from one backend to another)
+
+Configuration documentation for each type of backend is to be found in their
+__construct() inline documentation.
+
+
+\section setup Setup
+
+File backends are registered in LocalSettings.php via the global variable
+$wgFileBackends. To access one of those defined backends, one would use
+FileBackendStore::get( <name> ) which will bring back a FileBackend object
+handle. Such handles are reused for any subsequent get() call (via singleton).
+The FileBackends objects are caching request calls such as file stats,
+SHA1 requests or TCP connection handles.
+
+\par Note:
+Some backends may require additional PHP extensions to be enabled or can rely on a
+MediaWiki extension. This is often the case when a FileBackend subclass makes use of an
+upstream client API for communicating with the backing store.
+
+
+\section fileoperations File operations
+
+The MediaWiki FileBackend API supports various operations on either files or
+directories. See FileBackend.php for full documentation for each function.
+
+
+\subsection reading Reading
+
+The following basic operations are supported for reading from a backend:
+
+On files:
+* state a file for basic information (timestamp, size)
+* read a file into a string or  several files into a map of path names to strings
+* download a file or set of files to a temporary file (on a mounted file system)
+* get the SHA1 hash of a file
+* get various properties of a file (stat information, content time, mime information, ...)
+
+On directories:
+* get a list of files directly under a directory
+* get a recursive list of files under a directory
+* get a list of directories directly under a directory
+* get a recursive list of directories under a directory
+
+\par Note:
+Backend handles should return directory listings as iterators, all though in some cases
+they may just be simple arrays (which can still be iterated over). Iterators allow for
+callers to traverse a large number of file listings without consuming excessive RAM in
+the process. Either the memory consumed is flatly bounded (if the iterator does paging)
+or it is proportional to the depth of the portion of the directory tree being traversed
+(if the iterator works via recursion).
+
+
+\subsection writing Writing
+
+The following basic operations are supported for writing or changing in the backend:
+
+On files:
+* store (copying a mounted file system file into storage)
+* create (creating a file within storage from a string)
+* copy (within storage)
+* move (within storage)
+* delete (within storage)
+* lock/unlock (lock or unlock a file in storage)
+
+The following operations are supported for writing directories in the backend:
+* prepare (create parent container and directories for a path)
+* secure (try to lock-down access to a container)
+* publish (try to reverse the effects of secure)
+* clean (remove empty containers or directories)
+
+
+\subsection invokingoperation Invoking an operation
+
+Generally, callers should use doOperations() or doQuickOperations() when doing
+batches of changes, rather than making a suite of single operation calls. This
+makes the system tolerate high latency much better by pipelining operations
+when possible.
+
+doOperations() should be used for working on important original data, i.e. when
+consistency is important. The former will only pipeline operations that do not
+depend on each other. It is best if the operations that do not depend on each
+other occur in consecutive groups. This function can also log file changes to
+a journal (see FileJournal), which can be used to sync two backend instances.
+One might use this function for user uploads of file for example.
+
+doQuickOperations() is more geared toward ephemeral items that can be easily
+regenerated from original data. It will always pipeline without checking for
+dependencies within the operation batch. One might use this function for
+creating and purging generated thumbnails of original files for example.
+
+
+\section consistency Consistency
+
+Not all backing stores are sequentially consistent by default. Various FileBackend
+functions offer a "latest" option that can be passed in to assure (or try to assure)
+that the latest version of the file is read. Some backing stores are consistent by
+default, but callers should always assume that without this option, stale data may
+be read. This is actually true for stores that have eventual consistency.
+
+Note that file listing functions have no "latest" flag, and thus some systems may
+return stale data. Thus callers should avoid assuming that listings contain changes
+made my the current client or any other client from a very short time ago. For example,
+creating a file under a directory and then immediately doing a file listing operation
+on that directory may result in a listing that does not include that file.
+
+
+\section locking Locking
+
+Locking is effective if and only if a proper lock manager is registered and is
+actually being used by the backend. Lock managers can be registered in LocalSettings.php
+using the $wgLockManagers global configuration variable.
+
+For object stores, locking is not generally useful for avoiding partially
+written or read objects, since most stores use Multi Version Concurrency
+Control (MVCC) to avoid this. However, locking can be important when:
+* One or more operations must be done without objects changing in the meantime.
+* It can also be useful when a file read is used to determine a file write or DB change.
+  For example, doOperations() first checks that there will be no "file already exists"
+  or "file does not exist" type errors before attempting an operation batch. This works
+  by stating the files first, and is only safe if the files are locked in the meantime.
+
+When locking, callers should use the latest available file data for reads.
+Also, one should always lock the file *before* reading it, not after. If stale data is
+used to determine a write, there will be some data corruption, even when reads of the
+original file finally start returning the updated data without needing the "latest"
+option (eventual consistency). The "scoped" lock functions are preferable since
+there is not the problem of forgetting to unlock due to early returns or exceptions.
+
+Since acquiring locks can fail, and lock managers can be non-blocking, callers should:
+* Acquire all required locks up font
+* Be prepared for the case where locks fail to be acquired
+* Possible retry acquiring certain locks
+
+MVCC is also a useful pattern to use on top of the backend interface, because operations
+are not atomic, even with doOperations(), so doing complex batch file changes or changing
+files and updating a database row can result in partially written "transactions". Thus one
+should avoid changing files once they have been stored, except perhaps with ephemeral data
+that are tolerant of some degree of inconsistency.
+
+Callers can use their own locking (e.g. SELECT FOR UPDATE) if it is more convenient, but
+note that all callers that change any of the files should then go through functions that
+acquire these locks. For example, if a caller just directly uses the file backend store()
+function, it will ignore any custom "FOR UPDATE" locks, which can cause problems.
+
+\section objectstore Object stores
+
+Support for object stores (like Amazon S3/Swift) drive much of the API and design
+decisions of FileBackend, but using any POSIX compliant file systems works fine.
+The system essentially stores "files" in "containers". For a mounted file system
+as a backing store, "files" will just be files under directories. For an object store
+as a backing store, the "files" will be objects stored in actual containers.
+
+
+\section file_obj_diffs File system and Object store differences
+
+An advantage of object stores is the reduced Round-Trip Times. This is
+achieved by avoiding the need to create each parent directory before placing a
+file somewhere. It gets worse the deeper the directory hierarchy is. Another
+advantage of object stores is that object listings tend to use databases, which
+scale better than the linked list directories that file sytems sometimes use.
+File systems like btrfs and xfs use tree structures, which scale better.
+For both object stores and file systems, using "/" in filenames will allow for the
+intuitive use of directory functions. For example, creating a file in Swift
+called "container/a/b/file1" will mean that:
+- a "directory listing" of "container/a" will contain "b",
+- and a "file listing" of "b" will contain "file1"
+
+This means that switching from an object store to a file system and vise versa
+using the FileBackend interface will generally be harmless. However, one must be
+aware of some important differences:
+
+* In a file system, you cannot have a file and a directory within the same path
+  whereas it is possible in an object stores. Calling code should avoid any layouts
+  which allow files and directories at the same path.
+* Some file systems have file name length restrictions or overall path length
+  restrictions that others do not. The same goes with object stores which might
+  have a maximum object length or a limitation regarding the number of files
+  under a container or volume.
+* Latency varies among systems, certain access patterns may not be tolerable for
+  certain backends but may hold up for others. Some backend subclasses use
+  MediaWiki's object caching for serving stat requests, which can greatly
+  reduce latency. Making sure that the backend has pipelining (see the
+  "parallelize" and "concurrency" settings) enabled can also mask latency in
+  batch operation scenarios.
+* File systems may implement directories as linked-lists or other structures
+  with poor scalability, so calling code should use layouts that shard the data.
+  Instead of storing files like "container/file.txt", one can store files like
+  "container/<x>/<y>/file.txt". It is best if "sharding" optional or configurable.
+
+*/
index 185a557..e9d27f7 100644 (file)
@@ -40,6 +40,7 @@ class SwiftFileBackend extends FileBackendStore {
        /** @var CF_Authentication */
        protected $auth; // Swift authentication handler
        protected $authTTL; // integer seconds
+       protected $swiftTempUrlKey; // string; shared secret value for making temp urls
        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
@@ -66,6 +67,8 @@ class SwiftFileBackend extends FileBackendStore {
         *   - swiftUser          : Swift user used by MediaWiki (account:username)
         *   - swiftKey           : Swift authentication key for the above user
         *   - swiftAuthTTL       : Swift authentication TTL (seconds)
+        *   - swiftTempUrlKey    : Swift "X-Account-Meta-Temp-URL-Key" value on the account.
+        *                          Do not set this until it has been set in the backend.
         *   - 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
@@ -104,6 +107,9 @@ class SwiftFileBackend extends FileBackendStore {
                $this->swiftAnonUser = isset( $config['swiftAnonUser'] )
                        ? $config['swiftAnonUser']
                        : '';
+               $this->swiftTempUrlKey = isset( $config['swiftTempUrlKey'] )
+                       ? $config['swiftTempUrlKey']
+                       : '';
                $this->shardViaHashLevels = isset( $config['shardViaHashLevels'] )
                        ? $config['shardViaHashLevels']
                        : '';
@@ -201,12 +207,6 @@ class SwiftFileBackend extends FileBackendStore {
                // (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;
@@ -223,8 +223,7 @@ class SwiftFileBackend extends FileBackendStore {
                        // 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 );
+                       $obj->setMetadataValues( 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'] ) );
@@ -237,17 +236,17 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( isset( $params['disposition'] ) ) {
                                $obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
                        }
+                       // Set any other custom headers if requested
+                       if ( isset( $params['headers'] ) ) {
+                               $obj->headers += $params['headers'];
+                       }
                        if ( !empty( $params['async'] ) ) { // deferred
                                $op = $obj->write_async( $params['content'] );
                                $status->value = new SwiftFileOpHandle( $this, $params, 'Create', $op );
-                               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
-                                       $status->value->affectedObjects[] = $obj;
-                               }
+                               $status->value->affectedObjects[] = $obj;
                        } else { // actually write the object in Swift
                                $obj->write( $params['content'] );
-                               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
-                                       $this->purgeCDNCache( array( $obj ) );
-                               }
+                               $this->purgeCDNCache( array( $obj ) );
                        }
                } catch ( CDNNotEnabledException $e ) {
                        // CDN not enabled; nothing to see here
@@ -287,12 +286,6 @@ class SwiftFileBackend extends FileBackendStore {
                // (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;
@@ -314,8 +307,7 @@ class SwiftFileBackend extends FileBackendStore {
                        // 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 );
+                       $obj->setMetadataValues( 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
@@ -327,6 +319,10 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( isset( $params['disposition'] ) ) {
                                $obj->headers['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
                        }
+                       // Set any other custom headers if requested
+                       if ( isset( $params['headers'] ) ) {
+                               $obj->headers += $params['headers'];
+                       }
                        if ( !empty( $params['async'] ) ) { // deferred
                                wfSuppressWarnings();
                                $fp = fopen( $params['src'], 'rb' );
@@ -337,15 +333,11 @@ class SwiftFileBackend extends FileBackendStore {
                                        $op = $obj->write_async( $fp, filesize( $params['src'] ), true );
                                        $status->value = new SwiftFileOpHandle( $this, $params, 'Store', $op );
                                        $status->value->resourcesToClose[] = $fp;
-                                       if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
-                                               $status->value->affectedObjects[] = $obj;
-                                       }
+                                       $status->value->affectedObjects[] = $obj;
                                }
                        } else { // actually write the object in Swift
                                $obj->load_from_filename( $params['src'], true ); // calls $obj->write()
-                               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
-                                       $this->purgeCDNCache( array( $obj ) );
-                               }
+                               $this->purgeCDNCache( array( $obj ) );
                        }
                } catch ( CDNNotEnabledException $e ) {
                        // CDN not enabled; nothing to see here
@@ -396,12 +388,6 @@ class SwiftFileBackend extends FileBackendStore {
                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;
@@ -420,19 +406,17 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( !empty( $params['async'] ) ) { // deferred
                                $op = $sContObj->copy_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
                                $status->value = new SwiftFileOpHandle( $this, $params, 'Copy', $op );
-                               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
-                                       $status->value->affectedObjects[] = $dstObj;
-                               }
+                               $status->value->affectedObjects[] = $dstObj;
                        } else { // actually write the object in Swift
                                $sContObj->copy_object_to( $srcRel, $dContObj, $dstRel, null, $hdrs );
-                               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
-                                       $this->purgeCDNCache( array( $dstObj ) );
-                               }
+                               $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'] );
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                       }
                } catch ( CloudFilesException $e ) { // some other exception?
                        $this->handleException( $e, $status, __METHOD__, $params );
                }
@@ -474,12 +458,6 @@ class SwiftFileBackend extends FileBackendStore {
                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;
@@ -500,20 +478,18 @@ class SwiftFileBackend extends FileBackendStore {
                                $op = $sContObj->move_object_to_async( $srcRel, $dContObj, $dstRel, null, $hdrs );
                                $status->value = new SwiftFileOpHandle( $this, $params, 'Move', $op );
                                $status->value->affectedObjects[] = $srcObj;
-                               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
-                                       $status->value->affectedObjects[] = $dstObj;
-                               }
+                               $status->value->affectedObjects[] = $dstObj;
                        } else { // actually write the object in Swift
                                $sContObj->move_object_to( $srcRel, $dContObj, $dstRel, null, $hdrs );
                                $this->purgeCDNCache( array( $srcObj ) );
-                               if ( !empty( $params['overwrite'] ) ) { // file possibly mutated
-                                       $this->purgeCDNCache( array( $dstObj ) );
-                               }
+                               $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-move', $params['src'], $params['dst'] );
+                       if ( empty( $params['ignoreMissingSource'] ) ) {
+                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                       }
                } catch ( CloudFilesException $e ) { // some other exception?
                        $this->handleException( $e, $status, __METHOD__, $params );
                }
@@ -586,6 +562,47 @@ class SwiftFileBackend extends FileBackendStore {
                }
        }
 
+       /**
+        * @see FileBackendStore::doDescribeInternal()
+        * @return Status
+        */
+       protected function doDescribeInternal( array $params ) {
+               $status = Status::newGood();
+
+               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+               if ( $srcRel === null ) {
+                       $status->fatal( 'backend-fail-invalidpath', $params['src'] );
+                       return $status;
+               }
+
+               $hdrs = isset( $params['headers'] ) ? $params['headers'] : array();
+               // Set the Content-Disposition header if requested
+               if ( isset( $params['disposition'] ) ) {
+                       $hdrs['Content-Disposition'] = $this->truncDisp( $params['disposition'] );
+               }
+
+               try {
+                       $sContObj = $this->getContainer( $srcCont );
+                       // Get the latest version of the current metadata
+                       $srcObj = $sContObj->get_object( $srcRel,
+                               $this->headersFromParams( array( 'latest' => true ) ) );
+                       // Merge in the metadata updates...
+                       $srcObj->headers = $hdrs + $srcObj->headers;
+                       $srcObj->sync_metadata(); // save to Swift
+                       $this->purgeCDNCache( array( $srcObj ) );
+               } catch ( CDNNotEnabledException $e ) {
+                       // CDN not enabled; nothing to see here
+               } catch ( NoSuchContainerException $e ) {
+                       $status->fatal( 'backend-fail-describe', $params['src'] );
+               } catch ( NoSuchObjectException $e ) {
+                       $status->fatal( 'backend-fail-describe', $params['src'] );
+               } catch ( CloudFilesException $e ) { // some other exception?
+                       $this->handleException( $e, $status, __METHOD__, $params );
+               }
+
+               return $status;
+       }
+
        /**
         * @see FileBackendStore::doPrepareInternal()
         * @return Status
@@ -761,7 +778,7 @@ class SwiftFileBackend extends FileBackendStore {
                                // 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']
+                               'sha1'  => $srcObj->getMetadataValue( 'Sha1base36' )
                        );
                } catch ( NoSuchContainerException $e ) {
                } catch ( NoSuchObjectException $e ) {
@@ -782,10 +799,11 @@ class SwiftFileBackend extends FileBackendStore {
         * @throws Exception cloudfiles exceptions
         */
        protected function addMissingMetadata( CF_Object $obj, $path ) {
-               if ( isset( $obj->metadata['Sha1base36'] ) ) {
+               if ( $obj->getMetadataValue( 'Sha1base36' ) !== null ) {
                        return true; // nothing to do
                }
                wfProfileIn( __METHOD__ );
+               trigger_error( "$path was not stored with SHA-1 metadata.", E_USER_WARNING );
                $status = Status::newGood();
                $scopeLockS = $this->getScopedFileLocks( array( $path ), LockManager::LOCK_UW, $status );
                if ( $status->isOK() ) {
@@ -793,40 +811,91 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( $tmpFile ) {
                                $hash = $tmpFile->getSha1Base36();
                                if ( $hash !== false ) {
-                                       $obj->metadata['Sha1base36'] = $hash;
+                                       $obj->setMetadataValues( array( 'Sha1base36' => $hash ) );
                                        $obj->sync_metadata(); // save to Swift
                                        wfProfileOut( __METHOD__ );
                                        return true; // success
                                }
                        }
                }
-               $obj->metadata['Sha1base36'] = false;
+               trigger_error( "Unable to set SHA-1 metadata for $path", E_USER_WARNING );
+               $obj->setMetadataValues( array( 'Sha1base36' => false ) );
                wfProfileOut( __METHOD__ );
                return false; // failed
        }
 
        /**
-        * @see FileBackend::getFileContents()
-        * @return bool|string
+        * @see FileBackendStore::doGetFileContentsMulti()
+        * @return Array
         */
-       public function getFileContents( array $params ) {
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       return false; // invalid storage path
-               }
+       protected function doGetFileContentsMulti( array $params ) {
+               $contents = array();
+
+               $ep = array_diff_key( $params, array( 'srcs' => 1 ) ); // for error logging
+               // Blindly create tmp files and stream to them, catching any exception if the file does
+               // not exist. Doing stats here is useless and will loop infinitely in addMissingMetadata().
+               foreach ( array_chunk( $params['srcs'], $params['concurrency'] ) as $pathBatch ) {
+                       $cfOps = array(); // (path => CF_Async_Op)
+
+                       foreach ( $pathBatch as $path ) { // each path in this concurrent batch
+                               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
+                               if ( $srcRel === null ) {
+                                       $contents[$path] = false;
+                                       continue;
+                               }
+                               $data = false;
+                               try {
+                                       $sContObj = $this->getContainer( $srcCont );
+                                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                                       // Get source file extension
+                                       $ext = FileBackend::extensionFromPath( $path );
+                                       // Create a new temporary memory file...
+                                       $handle = fopen( 'php://temp', 'wb' );
+                                       if ( $handle ) {
+                                               $headers = $this->headersFromParams( $params );
+                                               if ( count( $pathBatch ) > 1 ) {
+                                                       $cfOps[$path] = $obj->stream_async( $handle, $headers );
+                                                       $cfOps[$path]->_file_handle = $handle; // close this later
+                                               } else {
+                                                       $obj->stream( $handle, $headers );
+                                                       rewind( $handle ); // start from the beginning
+                                                       $data = stream_get_contents( $handle );
+                                                       fclose( $handle );
+                                               }
+                                       } else {
+                                               $data = false;
+                                       }
+                               } catch ( NoSuchContainerException $e ) {
+                                       $data = false;
+                               } catch ( NoSuchObjectException $e ) {
+                                       $data = false;
+                               } catch ( CloudFilesException $e ) { // some other exception?
+                                       $data = false;
+                                       $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
+                               }
+                               $contents[$path] = $data;
+                       }
 
-               $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 ( NoSuchObjectException $e ) {
-               } catch ( CloudFilesException $e ) { // some other exception?
-                       $this->handleException( $e, null, __METHOD__, $params );
+                       $batch = new CF_Async_Op_Batch( $cfOps );
+                       $cfOps = $batch->execute();
+                       foreach ( $cfOps as $path => $cfOp ) {
+                               try {
+                                       $cfOp->getLastResponse();
+                                       rewind( $cfOp->_file_handle ); // start from the beginning
+                                       $contents[$path] = stream_get_contents( $cfOp->_file_handle );
+                               } catch ( NoSuchContainerException $e ) {
+                                       $contents[$path] = false;
+                               } catch ( NoSuchObjectException $e ) {
+                                       $contents[$path] = false;
+                               } catch ( CloudFilesException $e ) { // some other exception?
+                                       $contents[$path] = false;
+                                       $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
+                               }
+                               fclose( $cfOp->_file_handle ); // close open handle
+                       }
                }
 
-               return $data;
+               return $contents;
        }
 
        /**
@@ -1034,44 +1103,98 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * @see FileBackendStore::getLocalCopy()
+        * @see FileBackendStore::doGetLocalCopyMulti()
         * @return null|TempFSFile
         */
-       public function getLocalCopy( array $params ) {
-               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
-               if ( $srcRel === null ) {
-                       return null;
-               }
+       protected function doGetLocalCopyMulti( array $params ) {
+               $tmpFiles = array();
+
+               $ep = array_diff_key( $params, array( 'srcs' => 1 ) ); // for error logging
+               // Blindly create tmp files and stream to them, catching any exception if the file does
+               // not exist. Doing a stat here is useless causes infinite loops in addMissingMetadata().
+               foreach ( array_chunk( $params['srcs'], $params['concurrency'] ) as $pathBatch ) {
+                       $cfOps = array(); // (path => CF_Async_Op)
+
+                       foreach ( $pathBatch as $path ) { // each path in this concurrent batch
+                               list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $path );
+                               if ( $srcRel === null ) {
+                                       $tmpFiles[$path] = null;
+                                       continue;
+                               }
+                               $tmpFile = null;
+                               try {
+                                       $sContObj = $this->getContainer( $srcCont );
+                                       $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                                       // Get source file extension
+                                       $ext = FileBackend::extensionFromPath( $path );
+                                       // Create a new temporary file...
+                                       $tmpFile = TempFSFile::factory( 'localcopy_', $ext );
+                                       if ( $tmpFile ) {
+                                               $handle = fopen( $tmpFile->getPath(), 'wb' );
+                                               if ( $handle ) {
+                                                       $headers = $this->headersFromParams( $params );
+                                                       if ( count( $pathBatch ) > 1 ) {
+                                                               $cfOps[$path] = $obj->stream_async( $handle, $headers );
+                                                               $cfOps[$path]->_file_handle = $handle; // close this later
+                                                       } else {
+                                                               $obj->stream( $handle, $headers );
+                                                               fclose( $handle );
+                                                       }
+                                               } else {
+                                                       $tmpFile = null;
+                                               }
+                                       }
+                               } catch ( NoSuchContainerException $e ) {
+                                       $tmpFile = null;
+                               } catch ( NoSuchObjectException $e ) {
+                                       $tmpFile = null;
+                               } catch ( CloudFilesException $e ) { // some other exception?
+                                       $tmpFile = null;
+                                       $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
+                               }
+                               $tmpFiles[$path] = $tmpFile;
+                       }
 
-               // 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 in addMissingMetadata().
-               $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
+                       $batch = new CF_Async_Op_Batch( $cfOps );
+                       $cfOps = $batch->execute();
+                       foreach ( $cfOps as $path => $cfOp ) {
+                               try {
+                                       $cfOp->getLastResponse();
+                               } catch ( NoSuchContainerException $e ) {
+                                       $tmpFiles[$path] = null;
+                               } catch ( NoSuchObjectException $e ) {
+                                       $tmpFiles[$path] = null;
+                               } catch ( CloudFilesException $e ) { // some other exception?
+                                       $tmpFiles[$path] = null;
+                                       $this->handleException( $e, null, __METHOD__, array( 'src' => $path ) + $ep );
                                }
+                               fclose( $cfOp->_file_handle ); // close open handle
                        }
-               } 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;
+               return $tmpFiles;
+       }
+
+       /**
+        * @see FileBackendStore::getFileHttpUrl()
+        * @return string|null
+        */
+       public function getFileHttpUrl( array $params ) {
+               if ( $this->swiftTempUrlKey != '' ) { // temp urls enabled
+                       list( $srcCont, $srcRel ) = $this->resolveStoragePathReal( $params['src'] );
+                       if ( $srcRel === null ) {
+                               return null; // invalid path
+                       }
+                       try {
+                               $sContObj = $this->getContainer( $srcCont );
+                               $obj = new CF_Object( $sContObj, $srcRel, false, false ); // skip HEAD
+                               return $obj->get_temp_url( $this->swiftTempUrlKey, 86400, "GET" );
+                       } catch ( NoSuchContainerException $e ) {
+                       } catch ( CloudFilesException $e ) { // some other exception?
+                               $this->handleException( $e, null, __METHOD__, $params );
+                       }
+               }
+               return null;
        }
 
        /**
@@ -1134,10 +1257,10 @@ class SwiftFileBackend extends FileBackendStore {
         * $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
+        *   - ".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
+        *   -".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
@@ -1247,6 +1370,7 @@ class SwiftFileBackend extends FileBackendStore {
        protected function closeConnection() {
                if ( $this->conn ) {
                        $this->conn->close(); // close active cURL handles in CF_Http object
+                       $this->conn = null;
                        $this->sessionStarted = 0;
                        $this->connContainerCache->clear();
                }
@@ -1262,13 +1386,6 @@ class SwiftFileBackend extends FileBackendStore {
                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.
index 5032bf6..11e125c 100644 (file)
@@ -82,30 +82,37 @@ class TempFSFile extends FSFile {
         * Clean up the temporary file only after an object goes out of scope
         *
         * @param $object Object
-        * @return void
+        * @return TempFSFile This object
         */
        public function bind( $object ) {
                if ( is_object( $object ) ) {
+                       if ( !isset( $object->tempFSFileReferences ) ) {
+                               // Init first since $object might use __get() and return only a copy variable
+                               $object->tempFSFileReferences = array();
+                       }
                        $object->tempFSFileReferences[] = $this;
                }
+               return $this;
        }
 
        /**
         * Set flag to not clean up after the temporary file
         *
-        * @return void
+        * @return TempFSFile This object
         */
        public function preserve() {
                $this->canDelete = false;
+               return $this;
        }
 
        /**
         * Set flag clean up after the temporary file
         *
-        * @return void
+        * @return TempFSFile This object
         */
        public function autocollect() {
                $this->canDelete = true;
+               return $this;
        }
 
        /**
index f6268c2..44c6567 100644 (file)
@@ -75,6 +75,9 @@ class DBFileJournal extends FileJournal {
 
                try {
                        $dbw->insert( 'filejournal', $data, __METHOD__ );
+                       if ( mt_rand( 0, 99 ) == 0 ) {
+                               $this->purgeOldLogs(); // occasionally delete old logs
+                       }
                } catch ( DBError $e ) {
                        $status->fatal( 'filejournal-fail-dbquery', $this->backend );
                        return $status;
@@ -83,6 +86,19 @@ class DBFileJournal extends FileJournal {
                return $status;
        }
 
+       /**
+        * @see FileJournal::doGetCurrentPosition()
+        * @return integer|false
+        */
+       protected function doGetCurrentPosition() {
+               $dbw = $this->getMasterDB();
+
+               return $dbw->selectField( 'filejournal', 'MAX(fj_id)',
+                       array( 'fj_backend' => $this->backend ),
+                       __METHOD__
+               );
+       }
+
        /**
         * @see FileJournal::doGetChangeEntries()
         * @return Array
index ce029bb..d99384d 100644 (file)
@@ -85,7 +85,7 @@ abstract class FileJournal {
        /**
         * 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)
+        *     op      : Basic operation name (create, update, 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.
@@ -110,6 +110,21 @@ abstract class FileJournal {
         */
        abstract protected function doLogChangeBatch( array $entries, $batchId );
 
+       /**
+        * Get the position ID of the latest journal entry
+        *
+        * @return integer|false
+        */
+       final public function getCurrentPosition() {
+               return $this->doGetCurrentPosition();
+       }
+
+       /**
+        * @see FileJournal::getCurrentPosition()
+        * @return integer|false
+        */
+       abstract protected function doGetCurrentPosition();
+
        /**
         * Get an array of file change log entries.
         * A starting change ID and/or limit can be specified.
@@ -169,7 +184,7 @@ abstract class FileJournal {
  */
 class NullFileJournal extends FileJournal {
        /**
-        * @see FileJournal::logChangeBatch()
+        * @see FileJournal::doLogChangeBatch()
         * @param $entries array
         * @param $batchId string
         * @return Status
@@ -178,6 +193,14 @@ class NullFileJournal extends FileJournal {
                return Status::newGood();
        }
 
+       /**
+        * @see FileJournal::doGetCurrentPosition()
+        * @return integer|false
+        */
+       protected function doGetCurrentPosition() {
+               return false;
+       }
+
        /**
         * @see FileJournal::doGetChangeEntries()
         * @return Array
@@ -187,7 +210,7 @@ class NullFileJournal extends FileJournal {
        }
 
        /**
-        * @see FileJournal::purgeOldLogs()
+        * @see FileJournal::doPurgeOldLogs()
         * @return Status
         */
        protected function doPurgeOldLogs() {
index 8942818..3de6183 100644 (file)
@@ -169,7 +169,7 @@ class LSLockManager extends QuorumLockManager {
                $authKey = $this->lockServers[$lockSrv]['authKey'];
                // Build of the command as a flat string...
                $values = implode( '|', $values );
-               $key = sha1( $this->session . $action . $type . $values . $authKey );
+               $key = hash_hmac( 'sha1', "{$this->session}\n{$action}\n{$type}\n{$values}", $authKey );
                // Send out the command...
                if ( fwrite( $conn, "{$this->session}:$key:$action:$type:$values\n" ) === false ) {
                        return false;
index 57c0463..26a5e2d 100644 (file)
@@ -64,6 +64,7 @@ class MemcLockManager extends QuorumLockManager {
         *   - wikiId       : Wiki ID string that all resources are relative to. [optional]
         *
         * @param Array $config
+        * @throws MWException
         */
        public function __construct( array $config ) {
                parent::__construct( $config );
index 9c8d85d..635cb95 100644 (file)
@@ -24,9 +24,9 @@
 /**
  * A repository for files accessible via the local filesystem.
  * Does not support database access or registration.
- * 
+ *
  * This is a mostly a legacy class. New uses should not be added.
- * 
+ *
  * @ingroup FileRepo
  * @deprecated since 1.19
  */
index 5f24fed..82f7b49 100644 (file)
@@ -127,6 +127,9 @@ class FileRepo {
                        if ( !isset( $this->zones[$zone]['directory'] ) ) {
                                $this->zones[$zone]['directory'] = '';
                        }
+                       if ( !isset( $this->zones[$zone]['urlsByExt'] ) ) {
+                               $this->zones[$zone]['urlsByExt'] = array();
+                       }
                }
        }
 
@@ -196,14 +199,17 @@ class FileRepo {
        /**
         * Get the URL corresponding to one of the four basic zones
         *
-        * @param $zone String: one of: public, deleted, temp, thumb
+        * @param $zone String One of: public, deleted, temp, thumb
+        * @param $ext String|null Optional file extension
         * @return String or false
         */
-       public function getZoneUrl( $zone ) {
-               if ( isset( $this->zones[$zone]['url'] )
-                       && in_array( $zone, array( 'public', 'temp', 'thumb' ) ) )
-               {
-                       return $this->zones[$zone]['url']; // custom URL
+       public function getZoneUrl( $zone, $ext = null ) {
+               if ( in_array( $zone, array( 'public', 'temp', 'thumb' ) ) ) { // standard public zones
+                       if ( $ext !== null && isset( $this->zones[$zone]['urlsByExt'][$ext] ) ) {
+                               return $this->zones[$zone]['urlsByExt'][$ext]; // custom URL for extension/zone
+                       } elseif ( isset( $this->zones[$zone]['url'] ) ) {
+                               return $this->zones[$zone]['url']; // custom URL for zone
+                       }
                }
                switch ( $zone ) {
                        case 'public':
@@ -1021,18 +1027,25 @@ class FileRepo {
         * Returns a FileRepoStatus object. On success, the value contains "new" or
         * "archived", to indicate whether the file was new with that name.
         *
+        * Options to $options include:
+        *   - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
+        *
         * @param $srcPath String: the source file system path, storage path, or URL
         * @param $dstRel String: the destination relative path
         * @param $archiveRel String: the relative path where the existing file is to
         *        be archived, if there is one. Relative to the public zone root.
         * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
         *        that the source file should be deleted if possible
+        * @param $options Array Optional additional parameters
         * @return FileRepoStatus
         */
-       public function publish( $srcPath, $dstRel, $archiveRel, $flags = 0 ) {
+       public function publish(
+               $srcPath, $dstRel, $archiveRel, $flags = 0, array $options = array()
+       ) {
                $this->assertWritableRepo(); // fail out if read-only
 
-               $status = $this->publishBatch( array( array( $srcPath, $dstRel, $archiveRel ) ), $flags );
+               $status = $this->publishBatch(
+                       array( array( $srcPath, $dstRel, $archiveRel, $options ) ), $flags );
                if ( $status->successCount == 0 ) {
                        $status->ok = false;
                }
@@ -1048,13 +1061,14 @@ class FileRepo {
        /**
         * Publish a batch of files
         *
-        * @param $triplets Array: (source, dest, archive) triplets as per publish()
+        * @param $ntuples Array: (source, dest, archive) triplets or
+        *        (source, dest, archive, options) 4-tuples as per publish().
         * @param $flags Integer: bitfield, may be FileRepo::DELETE_SOURCE to indicate
         *        that the source files should be deleted if possible
         * @throws MWException
         * @return FileRepoStatus
         */
-       public function publishBatch( array $triplets, $flags = 0 ) {
+       public function publishBatch( array $ntuples, $flags = 0 ) {
                $this->assertWritableRepo(); // fail out if read-only
 
                $backend = $this->backend; // convenience
@@ -1069,8 +1083,9 @@ class FileRepo {
                $operations = array();
                $sourceFSFilesToDelete = array(); // cleanup for disk source files
                // Validate each triplet and get the store operation...
-               foreach ( $triplets as $i => $triplet ) {
-                       list( $srcPath, $dstRel, $archiveRel ) = $triplet;
+               foreach ( $ntuples as $i => $ntuple ) {
+                       list( $srcPath, $dstRel, $archiveRel ) = $ntuple;
+                       $options = isset( $ntuple[3] ) ? $ntuple[3] : array();
                        // Resolve source to a storage path if virtual
                        $srcPath = $this->resolveToStoragePath( $srcPath );
                        if ( !$this->validateFilename( $dstRel ) ) {
@@ -1094,47 +1109,48 @@ class FileRepo {
                                return $this->newFatal( 'directorycreateerror', $archiveDir );
                        }
 
-                       // Archive destination file if it exists
-                       if ( $backend->fileExists( array( 'src' => $dstPath ) ) ) {
-                               // Check if the archive file exists
-                               // This is a sanity check to avoid data loss. In UNIX, the rename primitive
-                               // unlinks the destination file if it exists. DB-based synchronisation in
-                               // publishBatch's caller should prevent races. In Windows there's no
-                               // problem because the rename primitive fails if the destination exists.
-                               if ( $backend->fileExists( array( 'src' => $archivePath ) ) ) {
-                                       $operations[] = array( 'op' => 'null' );
-                                       continue;
-                               } else {
-                                       $operations[] = array(
-                                               'op'           => 'move',
-                                               'src'          => $dstPath,
-                                               'dst'          => $archivePath
-                                       );
-                               }
-                               $status->value[$i] = 'archived';
-                       } else {
-                               $status->value[$i] = 'new';
-                       }
+                       // Set any desired headers to be use in GET/HEAD responses
+                       $headers = isset( $options['headers'] ) ? $options['headers'] : array();
+
+                       // Archive destination file if it exists.
+                       // This will check if the archive file also exists and fail if does.
+                       // This is a sanity check to avoid data loss. On Windows and Linux,
+                       // copy() will overwrite, so the existence check is vulnerable to
+                       // race conditions unless an functioning LockManager is used.
+                       // LocalFile also uses SELECT FOR UPDATE for synchronization.
+                       $operations[] = array(
+                               'op'                  => 'copy',
+                               'src'                 => $dstPath,
+                               'dst'                 => $archivePath,
+                               'ignoreMissingSource' => true
+                       );
+
                        // Copy (or move) the source file to the destination
                        if ( FileBackend::isStoragePath( $srcPath ) ) {
                                if ( $flags & self::DELETE_SOURCE ) {
                                        $operations[] = array(
-                                               'op'           => 'move',
-                                               'src'          => $srcPath,
-                                               'dst'          => $dstPath
+                                               'op'        => 'move',
+                                               'src'       => $srcPath,
+                                               'dst'       => $dstPath,
+                                               'overwrite' => true, // replace current
+                                               'headers'   => $headers
                                        );
                                } else {
                                        $operations[] = array(
-                                               'op'           => 'copy',
-                                               'src'          => $srcPath,
-                                               'dst'          => $dstPath
+                                               'op'        => 'copy',
+                                               'src'       => $srcPath,
+                                               'dst'       => $dstPath,
+                                               'overwrite' => true, // replace current
+                                               'headers'   => $headers
                                        );
                                }
                        } else { // FS source path
                                $operations[] = array(
-                                       'op'           => 'store',
-                                       'src'          => $srcPath,
-                                       'dst'          => $dstPath
+                                       'op'        => 'store',
+                                       'src'       => $srcPath,
+                                       'dst'       => $dstPath,
+                                       'overwrite' => true, // replace current
+                                       'headers'   => $headers
                                );
                                if ( $flags & self::DELETE_SOURCE ) {
                                        $sourceFSFilesToDelete[] = $srcPath;
@@ -1143,8 +1159,17 @@ class FileRepo {
                }
 
                // Execute the operations for each triplet
-               $opts = array( 'force' => true );
-               $status->merge( $backend->doOperations( $operations, $opts ) );
+               $status->merge( $backend->doOperations( $operations ) );
+               // Find out which files were archived...
+               foreach ( $ntuples as $i => $ntuple ) {
+                       list( $srcPath, $dstRel, $archiveRel ) = $ntuple;
+                       $archivePath = $this->getZonePath( 'public' ) . "/$archiveRel";
+                       if ( $this->fileExists( $archivePath ) ) {
+                               $status->value[$i] = 'archived';
+                       } else {
+                               $status->value[$i] = 'new';
+                       }
+               }
                // Cleanup for disk source files...
                foreach ( $sourceFSFilesToDelete as $file ) {
                        wfSuppressWarnings();
@@ -1318,6 +1343,7 @@ class FileRepo {
         * e.g. s/z/a/ for sza251lrxrc1jad41h5mgilp8nysje52.jpg
         *
         * @param $key string
+        * @throws MWException
         * @return string
         */
        public function getDeletedHashPath( $key ) {
@@ -1394,6 +1420,17 @@ class FileRepo {
                return $this->backend->getFileTimestamp( array( 'src' => $path ) );
        }
 
+       /**
+        * Get the size of a file with a given virtual URL/storage path
+        *
+        * @param $virtualUrl string
+        * @return integer|bool False on failure
+        */
+       public function getFileSize( $virtualUrl ) {
+               $path = $this->resolveToStoragePath( $virtualUrl );
+               return $this->backend->getFileSize( array( 'src' => $path ) );
+       }
+
        /**
         * Get the sha1 (base 36) of a file with a given virtual URL/storage path
         *
@@ -1644,10 +1681,11 @@ class FileRepo {
        /**
         * Get an UploadStash associated with this repo.
         *
+        * @param $user User
         * @return UploadStash
         */
-       public function getUploadStash() {
-               return new UploadStash( $this );
+       public function getUploadStash( User $user = null ) {
+               return new UploadStash( $this, $user );
        }
 
        /**
index 13de9e6..7697e4e 100644 (file)
@@ -337,16 +337,17 @@ class ForeignAPIRepo extends FileRepo {
        /**
         * @see FileRepo::getZoneUrl()
         * @param $zone String
+        * @param $ext String|null Optional file extension
         * @return String
         */
-       function getZoneUrl( $zone ) {
+       function getZoneUrl( $zone, $ext = null ) {
                switch ( $zone ) {
                        case 'public':
                                return $this->url;
                        case 'thumb':
                                return $this->thumbUrl;
                        default:
-                               return parent::getZoneUrl( $zone );
+                               return parent::getZoneUrl( $zone, $ext );
                }
        }
 
index 4b206c3..1865985 100644 (file)
@@ -86,7 +86,7 @@ class ForeignDBRepo extends LocalRepo {
 
        /**
         * Get a key on the primary cache for this repository.
-        * Returns false if the repository's cache is not accessible at this site. 
+        * Returns false if the repository's cache is not accessible at this site.
         * The parameters are the parts of the key, as for wfMemcKey().
         * @return bool|mixed
         */
index bd76fce..7951fb1 100644 (file)
@@ -61,7 +61,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
 
        /**
         * Get a key on the primary cache for this repository.
-        * Returns false if the repository's cache is not accessible at this site. 
+        * Returns false if the repository's cache is not accessible at this site.
         * The parameters are the parts of the key, as for wfMemcKey().
         * @return bool|string
         */
index 0954422..118e981 100644 (file)
@@ -238,7 +238,7 @@ class LocalRepo extends FileRepo {
                        __METHOD__,
                        array( 'ORDER BY' => 'img_name' )
                );
-               
+
                $result = array();
                foreach ( $res as $row ) {
                        $result[] = $this->newFileFromRow( $row );
@@ -299,7 +299,7 @@ class LocalRepo extends FileRepo {
 
        /**
         * Get a key on the primary cache for this repository.
-        * Returns false if the repository's cache is not accessible at this site. 
+        * Returns false if the repository's cache is not accessible at this site.
         * The parameters are the parts of the key, as for wfMemcKey().
         *
         * @return string
index 885a1de..d3aea9f 100644 (file)
@@ -39,22 +39,3 @@ LocalRepo.php. LocalRepo provides only file access, and LocalFile provides
 database access and higher-level functions such as cache management.
 
 Tim Starling, June 2007
-
-Structure:
-
-File defines an abstract class File.
-    ForeignAPIFile extends File.
-    LocalFile extends File.
-        ForeignDBFile extends LocalFile
-        Image extends LocalFile
-    UnregisteredLocalFile extends File.
-        UploadStashFile extends UnregisteredLocalFile.
-FileRepo defines an abstract class FileRepo.
-    ForeignAPIRepo extends FileRepo
-    FSRepo extends FileRepo
-        LocalRepo extends FSRepo
-            ForeignDBRepo extends LocalRepo
-            ForeignDBViaLBRepo extends LocalRepo
-    NullRepo extends FileRepo
-
-Russ Nelson, March 2011
index c5a0bd1..e1a8547 100644 (file)
@@ -47,6 +47,7 @@ class ArchivedFile {
                $timestamp, # time of upload
                $dataLoaded, # Whether or not all this has been loaded from the database (loadFromXxx)
                $deleted, # Bitfield akin to rev_deleted
+               $sha1, # sha1 hash of file content
                $pageCount,
                $archive_name;
 
@@ -87,6 +88,7 @@ class ArchivedFile {
                $this->deleted = 0;
                $this->dataLoaded = false;
                $this->exists = false;
+               $this->sha1 = '';
 
                if( $title instanceof Title ) {
                        $this->title = File::normalizeTitle( $title, 'exception' );
@@ -108,6 +110,7 @@ class ArchivedFile {
 
        /**
         * Loads a file object from the filearchive table
+        * @throws MWException
         * @return bool|null True on success or null
         */
        public function load() {
@@ -132,8 +135,9 @@ class ArchivedFile {
                }
 
                if( !$this->title || $this->title->getNamespace() == NS_FILE ) {
+                       $this->dataLoaded = true; // set it here, to have also true on miss
                        $dbr = wfGetDB( DB_SLAVE );
-                       $res = $dbr->select( 'filearchive',
+                       $row = $dbr->selectRow( 'filearchive',
                                array(
                                        'fa_id',
                                        'fa_name',
@@ -152,39 +156,22 @@ class ArchivedFile {
                                        'fa_user',
                                        'fa_user_text',
                                        'fa_timestamp',
-                                       'fa_deleted' ),
+                                       'fa_deleted',
+                                       'fa_sha1' ),
                                $conds,
                                __METHOD__,
-                               array( 'ORDER BY' => 'fa_timestamp DESC' ) );
-                       if ( $res == false || $dbr->numRows( $res ) == 0 ) {
-                       // this revision does not exist?
+                               array( 'ORDER BY' => 'fa_timestamp DESC')
+                       );
+                       if ( !$row ) {
+                               // this revision does not exist?
                                return null;
                        }
-                       $ret = $dbr->resultObject( $res );
-                       $row = $ret->fetchObject();
 
                        // initialize fields for filestore image object
-                       $this->id = intval($row->fa_id);
-                       $this->name = $row->fa_name;
-                       $this->archive_name = $row->fa_archive_name;
-                       $this->group = $row->fa_storage_group;
-                       $this->key = $row->fa_storage_key;
-                       $this->size = $row->fa_size;
-                       $this->bits = $row->fa_bits;
-                       $this->width = $row->fa_width;
-                       $this->height = $row->fa_height;
-                       $this->metadata = $row->fa_metadata;
-                       $this->mime = "$row->fa_major_mime/$row->fa_minor_mime";
-                       $this->media_type = $row->fa_media_type;
-                       $this->description = $row->fa_description;
-                       $this->user = $row->fa_user;
-                       $this->user_text = $row->fa_user_text;
-                       $this->timestamp = $row->fa_timestamp;
-                       $this->deleted = $row->fa_deleted;
+                       $this->loadFromRow( $row );
                } else {
                        throw new MWException( 'This title does not correspond to an image page.' );
                }
-               $this->dataLoaded = true;
                $this->exists = true;
 
                return true;
@@ -199,28 +186,42 @@ class ArchivedFile {
         */
        public static function newFromRow( $row ) {
                $file = new ArchivedFile( Title::makeTitle( NS_FILE, $row->fa_name ) );
-
-               $file->id = intval($row->fa_id);
-               $file->name = $row->fa_name;
-               $file->archive_name = $row->fa_archive_name;
-               $file->group = $row->fa_storage_group;
-               $file->key = $row->fa_storage_key;
-               $file->size = $row->fa_size;
-               $file->bits = $row->fa_bits;
-               $file->width = $row->fa_width;
-               $file->height = $row->fa_height;
-               $file->metadata = $row->fa_metadata;
-               $file->mime = "$row->fa_major_mime/$row->fa_minor_mime";
-               $file->media_type = $row->fa_media_type;
-               $file->description = $row->fa_description;
-               $file->user = $row->fa_user;
-               $file->user_text = $row->fa_user_text;
-               $file->timestamp = $row->fa_timestamp;
-               $file->deleted = $row->fa_deleted;
-
+               $file->loadFromRow( $row );
                return $file;
        }
 
+       /**
+        * Load ArchivedFile object fields from a DB row.
+        *
+        * @param $row Object database row
+        * @since 1.21
+        */
+       public function loadFromRow( $row ) {
+               $this->id = intval($row->fa_id);
+               $this->name = $row->fa_name;
+               $this->archive_name = $row->fa_archive_name;
+               $this->group = $row->fa_storage_group;
+               $this->key = $row->fa_storage_key;
+               $this->size = $row->fa_size;
+               $this->bits = $row->fa_bits;
+               $this->width = $row->fa_width;
+               $this->height = $row->fa_height;
+               $this->metadata = $row->fa_metadata;
+               $this->mime = "$row->fa_major_mime/$row->fa_minor_mime";
+               $this->media_type = $row->fa_media_type;
+               $this->description = $row->fa_description;
+               $this->user = $row->fa_user;
+               $this->user_text = $row->fa_user_text;
+               $this->timestamp = $row->fa_timestamp;
+               $this->deleted = $row->fa_deleted;
+               if( isset( $row->fa_sha1 ) ) {
+                       $this->sha1 = $row->fa_sha1;
+               } else {
+                       // old row, populate from key
+                       $this->sha1 = LocalRepo::getHashFromKey( $this->key );
+               }
+       }
+
        /**
         * Return the associated title object
         *
@@ -380,6 +381,17 @@ class ArchivedFile {
                return wfTimestamp( TS_MW, $this->timestamp );
        }
 
+       /**
+        * Get the SHA-1 base 36 hash of the file
+        *
+        * @return string
+        * @since 1.21
+        */
+       function getSha1() {
+               $this->load();
+               return $this->sha1;
+       }
+
        /**
         * Return the user ID of the uploader.
         *
index 557609d..c1abe61 100644 (file)
@@ -316,7 +316,8 @@ abstract class File {
        public function getUrl() {
                if ( !isset( $this->url ) ) {
                        $this->assertRepoDefined();
-                       $this->url = $this->repo->getZoneUrl( 'public' ) . '/' . $this->getUrlRel();
+                       $ext = $this->getExtension();
+                       $this->url = $this->repo->getZoneUrl( 'public', $ext ) . '/' . $this->getUrlRel();
                }
                return $this->url;
        }
@@ -1253,7 +1254,8 @@ abstract class File {
         */
        function getArchiveUrl( $suffix = false ) {
                $this->assertRepoDefined();
-               $path = $this->repo->getZoneUrl( 'public' ) . '/archive/' . $this->getHashPath();
+               $ext = $this->getExtension();
+               $path = $this->repo->getZoneUrl( 'public', $ext ) . '/archive/' . $this->getHashPath();
                if ( $suffix === false ) {
                        $path = substr( $path, 0, -1 );
                } else {
@@ -1272,7 +1274,8 @@ abstract class File {
         */
        function getArchiveThumbUrl( $archiveName, $suffix = false ) {
                $this->assertRepoDefined();
-               $path = $this->repo->getZoneUrl( 'thumb' ) . '/archive/' .
+               $ext = $this->getExtension();
+               $path = $this->repo->getZoneUrl( 'thumb', $ext ) . '/archive/' .
                        $this->getHashPath() . rawurlencode( $archiveName ) . "/";
                if ( $suffix === false ) {
                        $path = substr( $path, 0, -1 );
@@ -1291,7 +1294,8 @@ abstract class File {
         */
        function getThumbUrl( $suffix = false ) {
                $this->assertRepoDefined();
-               $path = $this->repo->getZoneUrl( 'thumb' ) . '/' . $this->getUrlRel();
+               $ext = $this->getExtension();
+               $path = $this->repo->getZoneUrl( 'thumb', $ext ) . '/' . $this->getUrlRel();
                if ( $suffix !== false ) {
                        $path .= '/' . rawurlencode( $suffix );
                }
@@ -1386,17 +1390,21 @@ abstract class File {
         * The archive name should be passed through to recordUpload for database
         * registration.
         *
+        * Options to $options include:
+        *   - headers : name/value map of HTTP headers to use in response to GET/HEAD requests
+        *
         * @param $srcPath String: local filesystem path to the source image
         * @param $flags Integer: a bitwise combination of:
         *     File::DELETE_SOURCE    Delete the source file, i.e. move
         *         rather than copy
+        * @param $options Array Optional additional parameters
         * @return FileRepoStatus object. On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         *
         * STUB
         * Overridden by LocalFile
         */
-       function publish( $srcPath, $flags = 0 ) {
+       function publish( $srcPath, $flags = 0, array $options = array() ) {
                $this->readOnlyError();
        }
 
@@ -1736,6 +1744,18 @@ abstract class File {
                return $fsFile->getSha1Base36();
        }
 
+       /**
+        * @return Array HTTP header name/value map to use for HEAD/GET request responses
+        */
+       function getStreamHeaders() {
+               $handler = $this->getHandler();
+               if ( $handler ) {
+                       return $handler->getStreamHeaders( $this->getMetadata() );
+               } else {
+                       return array();
+               }
+       }
+
        /**
         * @return string
         */
index 91f6cb6..a03df85 100644 (file)
@@ -57,9 +57,10 @@ class ForeignDBFile extends LocalFile {
        /**
         * @param $srcPath String
         * @param $flags int
+        * @param $options Array
         * @throws MWException
         */
-       function publish( $srcPath, $flags = 0 ) {
+       function publish( $srcPath, $flags = 0, array $options = array() ) {
                $this->readOnlyError();
        }
 
index 695c4e9..a9678b7 100644 (file)
@@ -771,8 +771,16 @@ class LocalFile extends File {
 
                // Delete thumbnails
                $files = $this->getThumbnails();
+               // Always purge all files from squid regardless of handler filters
+               if ( $wgUseSquid ) {
+                       $urls = array();
+                       foreach( $files as $file ) {
+                               $urls[] = $this->getThumbUrl( $file );
+                       }
+                       array_shift( $urls ); // don't purge directory
+               }
 
-               // Give media handler a chance to filter the purge list
+               // Give media handler a chance to filter the file purge list
                if ( !empty( $options['forThumbRefresh'] ) ) {
                        $handler = $this->getHandler();
                        if ( $handler ) {
@@ -788,10 +796,6 @@ class LocalFile extends File {
 
                // Purge the squid
                if ( $wgUseSquid ) {
-                       $urls = array();
-                       foreach( $files as $file ) {
-                               $urls[] = $this->getThumbUrl( $file );
-                       }
                        SquidUpdate::purge( $urls );
                }
 
@@ -814,7 +818,9 @@ class LocalFile extends File {
                foreach ( $files as $file ) {
                        # Check that the base file name is part of the thumb name
                        # This is a basic sanity check to avoid erasing unrelated directories
-                       if ( strpos( $file, $this->getName() ) !== false ) {
+                       if ( strpos( $file, $this->getName() ) !== false
+                               || strpos( $file, "-thumbnail" ) !== false // "short" thumb name
+                       ) {
                                $purgeList[] = "{$dir}/{$file}";
                        }
                }
@@ -949,7 +955,7 @@ class LocalFile extends File {
 
        /**
         * Upload a file and record it in the DB
-        * @param $srcPath String: source storage path or virtual URL
+        * @param $srcPath String: source storage path, virtual URL, or filesystem path
         * @param $comment String: upload description
         * @param $pageText String: text to use for the new description page,
         *                  if a new description page is created
@@ -970,11 +976,31 @@ class LocalFile extends File {
                        return $this->readOnlyFatalStatus();
                }
 
+               if ( !$props ) {
+                       wfProfileIn( __METHOD__ . '-getProps' );
+                       if ( $this->repo->isVirtualUrl( $srcPath )
+                               || FileBackend::isStoragePath( $srcPath ) )
+                       {
+                               $props = $this->repo->getFileProps( $srcPath );
+                       } else {
+                               $props = FSFile::getPropsFromPath( $srcPath );
+                       }
+                       wfProfileOut( __METHOD__ . '-getProps' );
+               }
+
+               $options = array();
+               $handler = MediaHandler::getHandler( $props['mime'] );
+               if ( $handler ) {
+                       $options['headers'] = $handler->getStreamHeaders( $props['metadata'] );
+               } else {
+                       $options['headers'] = array();
+               }
+
                // truncate nicely or the DB will do it for us
                // non-nicely (dangling multi-byte chars, non-truncated version in cache).
                $comment = $wgContLang->truncate( $comment, 255 );
                $this->lock(); // begin
-               $status = $this->publish( $srcPath, $flags );
+               $status = $this->publish( $srcPath, $flags, $options );
 
                if ( $status->successCount > 0 ) {
                        # Essentially we are displacing any existing current file and saving
@@ -1006,7 +1032,7 @@ class LocalFile extends File {
        {
                $pageText = SpecialUpload::getInitialPageText( $desc, $license, $copyStatus, $source );
 
-               if ( !$this->recordUpload2( $oldver, $desc, $pageText ) ) {
+               if ( !$this->recordUpload2( $oldver, $desc, $pageText, false, $timestamp ) ) {
                        return false;
                }
 
@@ -1186,17 +1212,18 @@ class LocalFile extends File {
                } else {
                        # 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.
-                       $status = $wikiPage->doEdit( $pageText, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
+                       # Squid and file cache for the description page are purged by doEditContent.
+                       $content = ContentHandler::makeContent( $pageText, $descTitle );
+                       $status = $wikiPage->doEditContent( $content, $comment, EDIT_NEW | EDIT_SUPPRESS_RC, false, $user );
 
                        if ( isset( $status->value['revision'] ) ) { // XXX; doEdit() uses a transaction
-                               $dbw->begin();
+                               $dbw->begin( __METHOD__ );
                                $dbw->update( 'logging',
                                        array( 'log_page' => $status->value['revision']->getPage() ),
                                        array( 'log_id' => $logId ),
                                        __METHOD__
                                );
-                               $dbw->commit(); // commit before anything bad can happen
+                               $dbw->commit( __METHOD__ ); // commit before anything bad can happen
                        }
                }
                wfProfileOut( __METHOD__ . '-edit' );
@@ -1249,11 +1276,12 @@ class LocalFile extends File {
         * @param $srcPath String: local filesystem path to the source image
         * @param $flags Integer: a bitwise combination of:
         *     File::DELETE_SOURCE      Delete the source file, i.e. move rather than copy
+        * @param $options Array Optional additional parameters
         * @return FileRepoStatus object. On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         */
-       function publish( $srcPath, $flags = 0 ) {
-               return $this->publishTo( $srcPath, $this->getRel(), $flags );
+       function publish( $srcPath, $flags = 0, array $options = array() ) {
+               return $this->publishTo( $srcPath, $this->getRel(), $flags, $options );
        }
 
        /**
@@ -1267,10 +1295,11 @@ class LocalFile extends File {
         * @param $dstRel String: target relative path
         * @param $flags Integer: a bitwise combination of:
         *     File::DELETE_SOURCE      Delete the source file, i.e. move rather than copy
+        * @param $options Array Optional additional parameters
         * @return FileRepoStatus object. On success, the value member contains the
         *     archive name, or an empty string if it was a new file.
         */
-       function publishTo( $srcPath, $dstRel, $flags = 0 ) {
+       function publishTo( $srcPath, $dstRel, $flags = 0, array $options = array() ) {
                if ( $this->getRepo()->getReadOnlyReason() !== false ) {
                        return $this->readOnlyFatalStatus();
                }
@@ -1280,7 +1309,7 @@ class LocalFile extends File {
                $archiveName = wfTimestamp( TS_MW ) . '!'. $this->getName();
                $archiveRel = 'archive/' . $this->getHashPath() . $archiveName;
                $flags = $flags & File::DELETE_SOURCE ? LocalRepo::DELETE_SOURCE : 0;
-               $status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags );
+               $status = $this->repo->publish( $srcPath, $dstRel, $archiveRel, $flags, $options );
 
                if ( $status->value == 'new' ) {
                        $status->value = '';
@@ -1472,12 +1501,11 @@ class LocalFile extends File {
         * @return bool|mixed
         */
        function getDescriptionText() {
-               global $wgParser;
                $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
                if ( !$revision ) return false;
-               $text = $revision->getText();
-               if ( !$text ) return false;
-               $pout = $wgParser->parse( $text, $this->title, new ParserOptions() );
+               $content = $revision->getContent();
+               if ( !$content ) return false;
+               $pout = $content->getParserOutput( $this->title, null, new ParserOptions() );
                return $pout->getText();
        }
 
@@ -1758,7 +1786,7 @@ class LocalFileDeleteBatch {
                                        'fa_deleted_user'      => $encUserId,
                                        'fa_deleted_timestamp' => $encTimestamp,
                                        'fa_deleted_reason'    => $encReason,
-                                       'fa_deleted'               => $this->suppress ? $bitfield : 0,
+                                       'fa_deleted'           => $this->suppress ? $bitfield : 0,
 
                                        'fa_name'         => 'img_name',
                                        'fa_archive_name' => 'NULL',
@@ -1773,7 +1801,8 @@ class LocalFileDeleteBatch {
                                        'fa_description'  => 'img_description',
                                        'fa_user'         => 'img_user',
                                        'fa_user_text'    => 'img_user_text',
-                                       'fa_timestamp'    => 'img_timestamp'
+                                       'fa_timestamp'    => 'img_timestamp',
+                                       'fa_sha1'         => 'img_sha1',
                                ), $where, __METHOD__ );
                }
 
@@ -1805,6 +1834,7 @@ class LocalFileDeleteBatch {
                                        'fa_user'         => 'oi_user',
                                        'fa_user_text'    => 'oi_user_text',
                                        'fa_timestamp'    => 'oi_timestamp',
+                                       'fa_sha1'         => 'oi_sha1',
                                ), $where, __METHOD__ );
                }
        }
@@ -2037,7 +2067,12 @@ class LocalFileRestoreBatch {
                        $deletedRel = $this->file->repo->getDeletedHashPath( $row->fa_storage_key ) . $row->fa_storage_key;
                        $deletedUrl = $this->file->repo->getVirtualUrl() . '/deleted/' . $deletedRel;
 
-                       $sha1 = substr( $row->fa_storage_key, 0, strcspn( $row->fa_storage_key, '.' ) );
+                       if( isset( $row->fa_sha1 ) ) {
+                               $sha1 = $row->fa_sha1;
+                       } else {
+                               // old row, populate from key
+                               $sha1 = LocalRepo::getHashFromKey( $row->fa_storage_key );
+                       }
 
                        # Fix leading zero
                        if ( strlen( $sha1 ) == 32 && $sha1[0] == '0' ) {
index 8d4a3f8..698d1eb 100644 (file)
@@ -179,10 +179,18 @@ class UnregisteredLocalFile extends File {
         */
        function getSize() {
                $this->assertRepoDefined();
-               $props = $this->repo->getFileProps( $this->path );
-               if ( isset( $props['size'] ) ) {
-                       return $props['size'];
-               }
-               return false; // doesn't exist
+               return $this->repo->getFileSize( $this->path );
+       }
+
+       /**
+        * Optimize getLocalRefPath() by using an existing local reference.
+        * The file at the path of $fsFile should not be deleted (or at least
+        * not until the end of the request). This is mostly a performance hack.
+        *
+        * @param $fsFile FSFile
+        * @return void
+        */
+       public function setLocalReference( FSFile $fsFile ) {
+               $this->fsFile = $fsFile;
        }
 }
index de59b2d..75ede23 100644 (file)
@@ -269,14 +269,15 @@ abstract class DatabaseInstaller {
 
                $ret = true;
                ob_start( array( $this, 'outputHandler' ) );
+               $up = DatabaseUpdater::newForDB( $this->db );
                try {
-                       $up = DatabaseUpdater::newForDB( $this->db );
                        $up->doUpdates();
                } catch ( MWException $e ) {
                        echo "\nAn error occurred:\n";
                        echo $e->getText();
                        $ret = false;
                }
+               $up->purgeCache();
                ob_end_flush();
                return $ret;
        }
index ff0a99e..b200dcf 100644 (file)
@@ -39,6 +39,13 @@ abstract class DatabaseUpdater {
         */
        protected $updates = array();
 
+       /**
+        * Array of updates that were skipped
+        *
+        * @var array
+        */
+       protected $updatesSkipped = array();
+
        /**
         * List of extension-provided database updates
         * @var array
@@ -54,14 +61,33 @@ abstract class DatabaseUpdater {
 
        protected $shared = false;
 
+       /**
+        * Scripts to run after database update
+        * Should be a subclass of LoggedUpdateMaintenance
+        */
        protected $postDatabaseUpdateMaintenance = array(
                'DeleteDefaultMessages',
                'PopulateRevisionLength',
                'PopulateRevisionSha1',
                'PopulateImageSha1',
                'FixExtLinksProtocolRelative',
+               'PopulateFilearchiveSha1',
        );
 
+       /**
+        * File handle for SQL output.
+        *
+        * @var Filehandle
+        */
+       protected $fileHandle = null;
+
+       /**
+        * Flag specifying whether or not to skip schema (e.g. SQL-only) updates.
+        *
+        * @var bool
+        */
+       protected $skipSchema = false;
+
        /**
         * Constructor
         *
@@ -75,6 +101,7 @@ abstract class DatabaseUpdater {
                $this->shared = $shared;
                if ( $maintenance ) {
                        $this->maintenance = $maintenance;
+                       $this->fileHandle = $maintenance->fileHandle;
                } else {
                        $this->maintenance = new FakeMaintenance;
                }
@@ -177,7 +204,7 @@ abstract class DatabaseUpdater {
         *                Note that callback functions will receive this object as
         *                first parameter.
         */
-       public function addExtensionUpdate( Array $update ) {
+       public function addExtensionUpdate( array $update ) {
                $this->extensionUpdates[] = $update;
        }
 
@@ -254,6 +281,8 @@ abstract class DatabaseUpdater {
        /**
         * Add a maintenance script to be run after the database updates are complete.
         *
+        * Script should subclass LoggedUpdateMaintenance
+        *
         * @since 1.19
         *
         * @param $class string Name of a Maintenance subclass
@@ -280,16 +309,36 @@ abstract class DatabaseUpdater {
                return $this->postDatabaseUpdateMaintenance;
        }
 
+       /**
+        * @since 1.21
+        *
+        * Writes the schema updates desired to a file for the DB Admin to run.
+        */
+       private function writeSchemaUpdateFile( $schemaUpdate = array() ) {
+               $updates = $this->updatesSkipped;
+               $this->updatesSkipped = array();
+
+               foreach( $updates as $funcList ) {
+                       $func = $funcList[0];
+                       $arg = $funcList[1];
+                       $origParams = $funcList[2];
+                       $ret = call_user_func_array( $func, $arg );
+                       flush();
+                       $this->updatesSkipped[] = $origParams;
+               }
+       }
+
        /**
         * Do all the updates
         *
         * @param $what Array: what updates to perform
         */
-       public function doUpdates( $what = array( 'core', 'extensions', 'purge', 'stats' ) ) {
-               global $wgLocalisationCacheConf, $wgVersion;
+       public function doUpdates( $what = array( 'core', 'extensions', 'stats' ) ) {
+               global $wgVersion, $wgLocalisationCacheConf;
 
                $this->db->begin( __METHOD__ );
                $what = array_flip( $what );
+               $this->skipSchema = isset( $what['noschema'] ) || $this->fileHandle !== null;
                if ( isset( $what['core'] ) ) {
                        $this->runUpdates( $this->getCoreUpdateList(), false );
                }
@@ -298,8 +347,6 @@ abstract class DatabaseUpdater {
                        $this->runUpdates( $this->getExtensionUpdates(), true );
                }
 
-               $this->setAppliedUpdates( $wgVersion, $this->updates );
-
                if ( isset( $what['stats'] ) ) {
                        $this->checkStats();
                }
@@ -311,6 +358,15 @@ abstract class DatabaseUpdater {
                                $this->rebuildLocalisationCache();
                        }
                }
+
+               $this->setAppliedUpdates( $wgVersion, $this->updates );
+
+               if( $this->fileHandle ) {
+                       $this->skipSchema = false;
+                       $this->writeSchemaUpdateFile( );
+                       $this->setAppliedUpdates( "$wgVersion-schema", $this->updatesSkipped );
+               }
+
                $this->db->commit( __METHOD__ );
        }
 
@@ -322,17 +378,26 @@ abstract class DatabaseUpdater {
         *                  functions
         */
        private function runUpdates( array $updates, $passSelf ) {
+               $updatesDone = array();
+               $updatesSkipped = array();
                foreach ( $updates as $params ) {
+                       $origParams = $params;
                        $func = array_shift( $params );
                        if( !is_array( $func ) && method_exists( $this, $func ) ) {
                                $func = array( $this, $func );
                        } elseif ( $passSelf ) {
                                array_unshift( $params, $this );
                        }
-                       call_user_func_array( $func, $params );
+                       $ret = call_user_func_array( $func, $params );
                        flush();
+                       if( $ret !== false ) {
+                               $updatesDone[] = $origParams;
+                       } else {
+                               $updatesSkipped[] = array( $func, $params, $origParams );
+                       }
                }
-               $this->updates = array_merge( $this->updates, $updates );
+               $this->updatesSkipped = array_merge( $this->updatesSkipped, $updatesSkipped );
+               $this->updates = array_merge( $this->updates, $updatesDone );
        }
 
        /**
@@ -459,24 +524,63 @@ abstract class DatabaseUpdater {
         */
        protected abstract function getCoreUpdateList();
 
+       /**
+        * Append an SQL fragment to the open file handle.
+        *
+        * @param $filename String: File name to open
+        */
+       public function copyFile( $filename ) {
+               $this->db->sourceFile( $filename, false, false, false,
+                       array( $this, 'appendLine' )
+               );
+       }
+
+       /**
+        * Append a line to the open filehandle.  The line is assumed to
+        * be a complete SQL statement.
+        *
+        * This is used as a callback for for sourceLine().
+        *
+        * @param $line String text to append to the file
+        * @return Boolean false to skip actually executing the file
+        * @throws MWException
+        */
+       public function appendLine( $line ) {
+               $line = rtrim( $line ) . ";\n";
+               if( fwrite( $this->fileHandle, $line ) === false ) {
+                       throw new MWException( "trouble writing file" );
+               }
+               return false;
+       }
+
        /**
         * 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
+        * @return boolean false if patch is skipped.
         */
        protected function applyPatch( $path, $isFullPath = false, $msg = null ) {
                if ( $msg === null ) {
                        $msg = "Applying $path patch";
                }
+               if ( $this->skipSchema ) {
+                       $this->output( "...skipping schema change ($msg).\n" );
+                       return false;
+               }
+
+               $this->output( "$msg ..." );
 
                if ( !$isFullPath ) {
                        $path = $this->db->patchPath( $path );
                }
-
-               $this->output( "$msg ..." );
-               $this->db->sourceFile( $path );
-               $this->output( "done.\n" );
+               if( $this->fileHandle !== null ) {
+                       $this->copyFile( $path );
+               } else {
+                       $this->db->sourceFile( $path );
+               }
+               $this->output( "done.\n" );
+               return true;
        }
 
        /**
@@ -484,13 +588,15 @@ abstract class DatabaseUpdater {
         * @param $name String Name of the new table
         * @param $patch String Path to the patch file
         * @param $fullpath Boolean Whether to treat $patch path as a relative or not
+        * @return Boolean false if this was skipped because schema changes are skipped
         */
        protected function addTable( $name, $patch, $fullpath = false ) {
                if ( $this->db->tableExists( $name, __METHOD__ ) ) {
                        $this->output( "...$name table already exists.\n" );
                } else {
-                       $this->applyPatch( $patch, $fullpath, "Creating $name table" );
+                       return $this->applyPatch( $patch, $fullpath, "Creating $name table" );
                }
+               return true;
        }
 
        /**
@@ -499,6 +605,7 @@ abstract class DatabaseUpdater {
         * @param $field String Name of the new field
         * @param $patch String Path to the patch file
         * @param $fullpath Boolean Whether to treat $patch path as a relative or not
+        * @return Boolean false if this was skipped because schema changes are skipped
         */
        protected function addField( $table, $field, $patch, $fullpath = false ) {
                if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
@@ -506,8 +613,9 @@ abstract class DatabaseUpdater {
                } elseif ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
                        $this->output( "...have $field field in $table table.\n" );
                } else {
-                       $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
+                       return $this->applyPatch( $patch, $fullpath, "Adding $field field to table $table" );
                }
+               return true;
        }
 
        /**
@@ -516,13 +624,18 @@ abstract class DatabaseUpdater {
         * @param $index String Name of the new index
         * @param $patch String Path to the patch file
         * @param $fullpath Boolean Whether to treat $patch path as a relative or not
+        * @return Boolean false if this was skipped because schema changes are skipped
         */
        protected function addIndex( $table, $index, $patch, $fullpath = false ) {
-               if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
+               if ( !$this->db->tableExists( $table, __METHOD__ ) ) {
+                       $this->output( "...skipping: '$table' table doesn't exist yet.\n" );
+                       return false;
+               } else if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
                        $this->output( "...index $index already set on $table table.\n" );
                } else {
-                       $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
+                       return $this->applyPatch( $patch, $fullpath, "Adding index $index to table $table" );
                }
+               return true;
        }
 
        /**
@@ -532,13 +645,15 @@ abstract class DatabaseUpdater {
         * @param $field String Name of the old field
         * @param $patch String Path to the patch file
         * @param $fullpath Boolean Whether to treat $patch path as a relative or not
+        * @return Boolean false if this was skipped because schema changes are skipped
         */
        protected function dropField( $table, $field, $patch, $fullpath = false ) {
                if ( $this->db->fieldExists( $table, $field, __METHOD__ ) ) {
-                       $this->applyPatch( $patch, $fullpath, "Table $table contains $field field. Dropping" );
+                       return $this->applyPatch( $patch, $fullpath, "Table $table contains $field field. Dropping" );
                } else {
                        $this->output( "...$table table does not contain $field field.\n" );
                }
+               return true;
        }
 
        /**
@@ -548,13 +663,15 @@ abstract class DatabaseUpdater {
         * @param $index String: Name of the old index
         * @param $patch String: Path to the patch file
         * @param $fullpath Boolean: Whether to treat $patch path as a relative or not
+        * @return Boolean false if this was skipped because schema changes are skipped
         */
        protected function dropIndex( $table, $index, $patch, $fullpath = false ) {
                if ( $this->db->indexExists( $table, $index, __METHOD__ ) ) {
-                       $this->applyPatch( $patch, $fullpath, "Dropping $index index from table $table" );
+                       return $this->applyPatch( $patch, $fullpath, "Dropping $index index from table $table" );
                } else {
                        $this->output( "...$index key doesn't exist.\n" );
                }
+               return true;
        }
 
        /**
@@ -566,6 +683,7 @@ abstract class DatabaseUpdater {
         * @param $table string
         * @param $patch string|false
         * @param $fullpath bool
+        * @return Boolean false if this was skipped because schema changes are skipped
         */
        public function dropTable( $table, $patch = false, $fullpath = false ) {
                if ( $this->db->tableExists( $table, __METHOD__ ) ) {
@@ -577,12 +695,12 @@ abstract class DatabaseUpdater {
                                $this->output( "done.\n" );
                        }
                        else {
-                               $this->applyPatch( $patch, $fullpath, $msg );
+                               return $this->applyPatch( $patch, $fullpath, $msg );
                        }
-
                } else {
                        $this->output( "...$table doesn't exist.\n" );
                }
+               return true;
        }
 
        /**
@@ -592,6 +710,7 @@ abstract class DatabaseUpdater {
         * @param $field String: name of the field to modify
         * @param $patch String: path to the patch file
         * @param $fullpath Boolean: whether to treat $patch path as a relative or not
+        * @return Boolean false if this was skipped because schema changes are skipped
         */
        public function modifyField( $table, $field, $patch, $fullpath = false ) {
                $updateKey = "$table-$field-$patch";
@@ -602,19 +721,24 @@ abstract class DatabaseUpdater {
                } elseif( $this->updateRowExists( $updateKey ) ) {
                        $this->output( "...$field in table $table already modified by patch $patch.\n" );
                } else {
-                       $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
+                       return $this->applyPatch( $patch, $fullpath, "Modifying $field field of table $table" );
                        $this->insertUpdateRow( $updateKey );
                }
+               return true;
        }
 
        /**
         * Purge the objectcache table
         */
-       protected function purgeCache() {
+       public function purgeCache() {
+               global $wgLocalisationCacheConf;
                # We can't guarantee that the user will be able to use TRUNCATE,
                # but we know that DELETE is available to us
                $this->output( "Purging caches..." );
                $this->db->delete( 'objectcache', '*', __METHOD__ );
+               if ( $wgLocalisationCacheConf['manualRecache'] ) {
+                       $this->rebuildLocalisationCache();
+               }
                $this->output( "done.\n" );
        }
 
@@ -696,7 +820,8 @@ abstract class DatabaseUpdater {
                        return;
                }
 
-               $this->applyPatch( 'patch-tc-timestamp.sql', false, "Converting tc_time from UNIX epoch to MediaWiki timestamp" );
+               return $this->applyPatch( 'patch-tc-timestamp.sql', false,
+                       "Converting tc_time from UNIX epoch to MediaWiki timestamp" );
        }
 
        /**
@@ -704,29 +829,33 @@ abstract class DatabaseUpdater {
         */
        protected function doCollationUpdate() {
                global $wgCategoryCollation;
-               if ( $this->db->selectField(
-                       'categorylinks',
-                       'COUNT(*)',
-                       'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
-                       __METHOD__
-               ) == 0 ) {
-                       $this->output( "...collations up-to-date.\n" );
-                       return;
-               }
+               if ( $this->db->fieldExists( 'categorylinks', 'cl_collation', __METHOD__ ) ) {
+                       if ( $this->db->selectField(
+                               'categorylinks',
+                               'COUNT(*)',
+                               'cl_collation != ' . $this->db->addQuotes( $wgCategoryCollation ),
+                               __METHOD__
+                               ) == 0 ) {
+                                       $this->output( "...collations up-to-date.\n" );
+                                       return;
+                       }
 
-               $this->output( "Updating category collations..." );
-               $task = $this->maintenance->runChild( 'UpdateCollation' );
-               $task->execute();
-               $this->output( "...done.\n" );
+                       $this->output( "Updating category collations..." );
+                       $task = $this->maintenance->runChild( 'UpdateCollation' );
+                       $task->execute();
+                       $this->output( "...done.\n" );
+               }
        }
 
        /**
         * Migrates user options from the user table blob to user_properties
         */
        protected function doMigrateUserOptions() {
-               $cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
-               $cl->execute();
-               $this->output( "done.\n" );
+               if( $this->db->tableExists( 'user_properties' ) ) {
+                       $cl = $this->maintenance->runChild( 'ConvertUserOptions', 'convertUserOptions.php' );
+                       $cl->execute();
+                       $this->output( "done.\n" );
+               }
        }
 
        /**
index f812ac2..33bf69c 100644 (file)
@@ -77,7 +77,7 @@ class Ibm_db2Updater extends DatabaseUpdater {
                        array( 'modifyField', 'user_properties', 'up_property', 'patch-up_property.sql' ),
                        array( 'addTable', 'uploadstash',                       'patch-uploadstash.sql' ),
                        array( 'addTable', 'user_former_groups',                'patch-user_former_groups.sql'),
-                       array( 'doRebuildLocalisationCache' ), 
+                       array( 'doRebuildLocalisationCache' ),
 
                        // 1.19
                        array( 'addIndex', 'logging',       'type_action',      'patch-logging-type-action-index.sql'),
@@ -85,8 +85,12 @@ class Ibm_db2Updater extends DatabaseUpdater {
                        array( 'addField', 'revision',      'rev_sha1',         'patch-rev_sha1.sql' ),
                        array( 'addField', 'archive',       'ar_sha1',          'patch-ar_sha1.sql' ),
 
-                       // 1.20
-                       array( 'addTable', 'config',                            'patch-config.sql' ),
+                       // 1.21
+                       array( 'addField',      'revision',     'rev_content_format',           'patch-revision-rev_content_format.sql' ),
+                       array( 'addField',      'revision',     'rev_content_model',            'patch-revision-rev_content_model.sql' ),
+                       array( 'addField',      'archive',      'ar_content_format',            'patch-archive-ar_content_format.sql' ),
+                       array( 'addField',      'archive',      'ar_content_model',                 'patch-archive-ar_content_model.sql' ),
+                       array( 'addField',      'page',     'page_content_model',               'patch-page-page_content_model.sql' ),
                );
        }
 }
index 8849ac0..ea31b0a 100644 (file)
@@ -567,11 +567,13 @@ When that has been done, you can '''[$2 enter your wiki]'''.",
  * @author Kghbln
  * @author McDutchie
  * @author Mormegil
+ * @author Nemo bis
  * @author Nike
  * @author Platonides
  * @author Purodha
  * @author Raymond
  * @author SPQRobin
+ * @author Shirayuki
  * @author Siebrand
  * @author Umherirrender
  */
@@ -596,6 +598,8 @@ $messages['qqq'] = array(
        'config-sidebar' => 'Maximum width for words is 24 characters. Only visible part of the translation counts to this limit.',
        'config-env-php' => 'Parameters:
 * $1 is the version of PHP that has been installed.',
+       'config-unicode-pure-php-warning' => 'PECL is the name of a group producing standard pieces of software for PHP, and intl is the name of their library handling some aspects of internationalization.',
+       'config-unicode-update-warning' => "ICU is a body producing standard software tools for support of Unicode and other internationalization aspects. This message warns the system administrator installing MediaWiki that the server's software is not up-to-date and MediaWiki will have problems handling some characters.",
        'config-no-db' => 'Do not translate: <code>./configure --with-mysql</code>.
 <br />
 Do not translate: <code>php5-mysql</code>.
@@ -603,6 +607,8 @@ 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-pcre' => 'PCRE is an initialism for "Perl-compatible regular expression". Perl is programming language whose [[:w:regular expression|regular expression]] syntax is popular and used in other languages using a library called PCRE.',
+       'config-pcre-no-utf8' => "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.",
        'config-memory-raised' => 'Parameters:
 * $1 is the configured <code>memory_limit</code>.
 * $2 is the value to which <code>memory_limit</code> was raised.',
@@ -640,10 +646,13 @@ Add dir="ltr" to the <nowiki><code></nowiki> for right-to-left languages.',
        'config-connection-error' => '$1 is the external error from the database, such as "DB connection error: Access denied for user \'dba\'@\'localhost\' (using password: YES) (localhost)."
 
 If you\'re translating this message to a right-to-left language, consider writing <nowiki><div dir="ltr">$1.</div></nowiki>. (When the bidi features for HTML5 will be implemented in the browsers, it will probably be a good idea to write it as <nowiki><div dir="auto">$1.</div></nowiki>.)',
+       'config-invalid-schema' => '*$1 - schema name',
        'config-sqlite-dir-unwritable' => 'webserver refers to a software like Apache or Lighttpd.',
        'config-can-upgrade' => 'Parameters:
 * $1 - Version or Revision indicator.',
        'config-show-table-status' => '{{doc-important|"SHOW TABLE STATUS" is a MySQL command. Do not translate this.}}',
+       'config-db-web-account-same' => 'checkbox label',
+       'config-db-web-create' => 'checkbox label',
        'config-ns-generic' => '{{Identical|Project}}',
        'config-admin-name' => '{{Identical|Your name}}',
        'config-admin-password' => '{{Identical|Password}}',
@@ -660,20 +669,109 @@ If you\'re translating this message to a right-to-left language, consider writin
 This message refers to a block of HTML being embedded into the installer page. It comes from the Creative Commons Web site. The block is in the English language. It is a scripted license chooser. When an individual license has been selected, it asks you to klick "proceed" so as to return to the MediaWiki installer page.',
        'config-extensions' => '{{Identical|Extension}}',
        'config-install-step-done' => '{{Identical|Done}}',
+       'config-install-database' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+       'config-install-schema' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-install-pg-schema-failed' => 'Parameters:
 * $1 = database user name (usernames in the database are unrelated to wiki user names)
 * $2 =',
-       'config-install-user' => 'Message indicates that the user is being created',
+       'config-install-user' => 'Message indicates that the user is being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-install-user-grant-failed' => 'Parameters:
 * $1 is the database username for which granting rights failed
 * $2 is the error message',
-       'config-install-tables' => 'Message indicates that the tables are being created',
-       'config-install-interwiki' => 'Message indicates that the interwikitables are being populated',
+       'config-install-tables' => 'Message indicates that the tables are being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+       'config-install-interwiki' => 'Message indicates that the interwikitables are being populated
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+       'config-install-stats' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
+       'config-install-keys' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-insecure-keys' => 'Parameters:
 * $1 - A list of names of the secret keys that were generated.
 * $2 - the number of items in the list $1, to be used with PLURAL.',
-       'config-install-sysop' => 'Message indicates that the administrator user account is being created',
+       'config-install-sysop' => 'Message indicates that the administrator user account is being created
+
+See also:
+*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-install-subscribe-fail' => '{{doc-important|"mediawiki-announce" is the name of a mailing list and should not be translated.}}',
+       'config-install-mainpage' => '*{{msg-mw|Config-install-database}}
+*{{msg-mw|Config-install-tables}}
+*{{msg-mw|Config-install-schema}}
+*{{msg-mw|Config-install-user}}
+*{{msg-mw|Config-install-interwiki}}
+*{{msg-mw|Config-install-stats}}
+*{{msg-mw|Config-install-keys}}
+*{{msg-mw|Config-install-sysop}}
+*{{msg-mw|Config-install-mainpage}}',
        'config-install-done' => 'Parameters:
 * $1 is the URL to LocalSettings download
 * $2 is a link to the wiki.
@@ -686,104 +784,6 @@ This message refers to a block of HTML being embedded into the installer page. I
 This might be a good place to put information about <nowiki>{{GRAMMAR:}}</nowiki>. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/fi]] for an example. For languages having grammatical distinctions and not having an appropriate <nowiki>{{GRAMMAR:}}</nowiki> software available, a suggestion to check and possibly amend the messages having <nowiki>{{SITENAME}}</nowiki> may be valuable. See [[{{NAMESPACE}}:{{BASEPAGENAME}}/ksh]] for an example.',
 );
 
-/** Goan Konkani (Latin script) (Konknni)
- * @author The Discoverer
- */
-$messages['gom-latn'] = array(
-       'config-page-language' => 'Bhas',
-);
-
-/** Magyar (magázó) (Magyar (magázó))
- * @author Dani
- * @author Glanthor Reviol
- */
-$messages['hu-formal'] = array(
-       'config-localsettings-upgrade' => "'''Figyelmeztetés''': már létezik a <code>LocalSettings.php</code> fájl.
-A szoftver frissíthető.
-Adja meg a <code>\$wgUpgradeKey</code>-ben található kulcsot a beviteli mezőben",
-       'config-session-expired' => 'Úgy tűnik, hogy a munkamenetadatok lejártak.
-A munkamenetek élettartama a következőre van beállítva: $1.
-Az érték növelhető a php.ini <code>session.gc_maxlifetime</code> beállításának módosításával.
-Indítsa újra a telepítési folyamatot.',
-       'config-no-session' => 'Elvesztek a munkamenetadatok!
-Ellenőrizze, hogy a php.ini-ben a <code>session.save_path</code> beállítás a megfelelő könyvtárra mutat-e.',
-       'config-your-language-help' => 'Válassza ki a telepítési folyamat során használandó nyelvet.',
-       'config-wiki-language-help' => 'Az a nyelv, amin a wiki tartalmának legnagyobb része íródik.',
-       'config-page-welcome' => 'Üdvözli a MediaWiki!',
-       'config-help-restart' => 'Szeretné törölni az eddig megadott összes adatot és újraindítani a telepítési folyamatot?',
-       'config-welcome' => '=== Környezet ellenőrzése ===
-Alapvető ellenőrzés, ami megmondja, hogy a környezet alkalmas-e a MediaWiki számára.
-Ha probléma merülne fel a telepítés során, meg kell adnia mások számára az alább megjelenő információkat.',
-       'config-unicode-pure-php-warning' => "'''Figyelmeztetés''': Az [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el Unicode normalizáláshoz.
-Ha nagy látogatottságú oldalt üzemeltet, itt találhat információkat [//www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].",
-       'config-register-globals' => "'''Figyelmeztetés: A PHP <code>[http://php.net/register_globals register_globals]</code> beállítása engedélyezve van.'''
-'''Tiltsa le, ha van rá lehetősége.'''
-A MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.",
-       'config-imagemagick' => 'Az ImageMagick megtalálható a rendszeren: <code>$1</code>.
-A bélyegképek készítése engedélyezve lesz, ha engedélyezi a feltöltéseket.',
-       'config-db-name-help' => 'Válassza ki a wikije azonosítására használt nevet.
-Nem tartalmazhat szóközt vagy kötőjelet.
-
-Ha megosztott webtárhelyet használ, a szolgáltatója vagy egy konkrét adatbázisnevet ad önnek használatra, vagy létrehozhat egyet a vezérlőpulton keresztül.',
-       'config-db-install-help' => 'Adja meg a felhasználónevet és jelszót, amivel a telepítő csatlakozhat az adatbázishoz.',
-       'config-db-wiki-help' => 'Adja meg azt a felhasználónevet és jelszót, amivel a wiki fog csatlakozni az adatbázishoz működés közben.
-Ha a fiók nem létezik és a telepítést végző fiók rendelkezik megfelelő jogosultsággal, egy új fiók készül a megadott a névvel, azon minimális jogosultságkörrel, ami a wiki működéséhez szükséges.',
-       'config-charset-help' => "'''Figyelmezetés:''' Ha a '''visszafelé kompatibilis UTF-8''' beállítást használja MySQL 4.1 vagy újabb verziók esetén, és utána a <code>mysqldump</code> programmal készít róla biztonsági másolatot, az tönkreteheti az összes nem ASCII-karaktert, visszafordíthatatlanul károsítva a másolatokban tárolt adatokat!
-
-'''Bináris''' módban a MediaWiki az UTF-8-ban kódolt szöveget bináris mezőkben tárolja az adatbázisban.
-Ez sokkal hatékonyabb a MySQL UTF-8-módjától, és lehetővé teszi, hogy a teljes Unicode-karakterkészletet használja.
-'''UTF-8-módban''' MySQL tudja, hogy milyen karakterkészlettel van kódolva az adat, megfelelően van megjelenítve és konvertálva, de
-nem használhatja a [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] feletti karaktereket.",
-       'config-db-schema-help' => 'A fenti sémák általában megfelelőek.
-Csak akkor módosítson rajta, ha szükség van rá.',
-       'config-sqlite-parent-unwritable-nogroup' => 'Nem lehet létrehozni az adatok tárolásához szükséges <code><nowiki>$1</nowiki></code> könyvtárat, mert a webszerver nem írhat a szülőkönyvtárba (<code><nowiki>$2</nowiki></code>).
-
-A telepítő nem tudta megállapíteni, hogy melyik felhasználói fiókon fut a webszerver.
-A folytatáshoz tegye írhatóvá ezen fiók (és más fiókok!) számára a következő könyvtárat: <code><nowiki>$3</nowiki></code>.
-Unix/Linux rendszereken tedd a következőt:
-
-<pre>cd $2
-mkdir $3
-chmod a+w $3</pre>',
-       'config-ns-other' => 'Más (adja meg)',
-       'config-admin-name-blank' => 'Adja meg az adminisztrátor felhasználónevét!',
-       'config-admin-name-invalid' => 'A megadott felhasználónév (<nowiki>$1</nowiki>) érvénytelen.
-Adjon meg egy másik felhasználónevet.',
-       'config-admin-password-blank' => 'Adja meg az adminisztrátori fiók jelszavát!',
-       'config-instantcommons-help' => 'Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.
-A használatához a MediaWikinek internethozzáférésre van szüksége.
-
-A funkcióról és hogy hogyan állítható be más wikik esetén [//mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhat további információkat.',
-       'config-install-done' => "'''Gratulálunk!'''
-Sikeresen telepítette a MediaWikit.
-
-A telepítő készített egy <code>LocalSettings.php</code> fájlt.
-Ez tartalmazza az összes beállítást.
-
-[$1 Le kell töltenie], és el kell helyeznie a MediaWiki telepítési könyvtárába (az a könyvtár, ahol az index.php van).
-'''Megjegyzés''': Ha ezt most nem teszi meg, és kilép, a generált fájl nem lesz elérhető a későbbiekben.
-
-Ha ezzel készen van, '''[$2 beléphet a wikibe]'''.",
-       'mainpagedocfooter' => "Ha segítségre van szüksége a wikiszoftver használatához, akkor keresse fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.
-
-== Alapok (angol nyelven) ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]",
-);
-
-/** Español (formal) (Español (formal))
- * @author Dferg
- */
-$messages['es-formal'] = array(
-       'mainpagedocfooter' => 'Consulte usted la [//meta.wikimedia.org/wiki/Ayuda:Contenido Guía de usuario] para obtener información sobre el uso del software wiki.
-
-== Empezando ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]
-* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]',
-);
-
 /** Afrikaans (Afrikaans)
  * @author Naudefj
  */
@@ -832,7 +832,7 @@ U kan MediaWiki installeer.',
        'config-env-bad' => 'Die omgewing is gekontroleer.
 U kan nie MediaWiki installeer nie.</span>',
        'config-env-php' => 'PHP $1 is tans geïnstalleer.',
-       'config-no-db' => "Kon nie 'n geskikte databasisdrywer vind nie!",
+       'config-no-db' => "Kon nie 'n geskikte databasisdrywer vind nie!", # Fuzzy
        'config-memory-raised' => 'PHP se <code>memory_limit</code> is $1, en is verhoog tot $2.',
        'config-memory-bad' => "'''Waarskuwing:''' PHP se <code>memory_limit</code> is $1.
 Dit is waarskynlik te laag.
@@ -941,7 +941,7 @@ Die skep van tabelle word oorgeslaan.",
        'config-install-interwiki-exists' => "'''Waarskuwing''': Die interwiki-tabel bevat reeds inskrywings.
 Die standaardlys word oorgeslaan.",
        'config-install-stats' => 'Inisialiseer statistieke',
-       'config-install-keys' => 'Genereer geheime sleutel',
+       'config-install-keys' => 'Genereer geheime sleutel', # Fuzzy
        'config-install-sysop' => "Skep 'n gebruiker vir die administrateur",
        'config-install-subscribe-fail' => 'Kon nie vir MediaWiki-announce inskryf nie: $1',
        'config-install-mainpage' => 'Skep die hoofblad met standaard inhoud',
@@ -956,7 +956,7 @@ Dit bevat al u instellings.
 U sal dit moet [$1 aflaai] en dit in die hoofgids van u wiki-installasie plaas; in dieselfde gids as index.php.
 '''Let wel''': As u dit nie nou doen nie, sal die gegenereerde konfigurasielêer nie later meer beskikbaar wees nadat u die installasie afgesluit het nie.
 
-As dit gedoen is, kan u '''[u $2 wiki besoek]'''.",
+As dit gedoen is, kan u '''[u $2 wiki besoek]'''.", # Fuzzy
        'config-download-localsettings' => 'Laai LocalSettings.php af',
        'config-help' => 'hulp',
        'mainpagetext' => "'''MediaWiki is suksesvol geïnstalleer.'''",
@@ -983,7 +983,8 @@ $messages['aln'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWikit]',
 );
 
-/** Amharic (አማርኛ) */
+/** Amharic (አማርኛ)
+ */
 $messages['am'] = array(
        'mainpagetext' => "'''MediaWiki በትክክል ማስገባቱ ተከናወነ።'''",
        'mainpagedocfooter' => "ስለ ዊኪ ሶፍትዌር ጥቅም ለመረዳት፣ [//meta.wikimedia.org/wiki/Help:Contents User's Guide] ያንብቡ።
@@ -1029,7 +1030,7 @@ $messages['ang'] = array(
  */
 $messages['ar'] = array(
        'config-desc' => 'مثبت لميدياويكي',
-       'config-title' => 'ميدياويكي 1$ التثبيت',
+       'config-title' => 'ميدياويكي 1$ التثبيت', # Fuzzy
        'config-information' => 'معلومات',
        'config-back' => '→ ارجع',
        'config-continue' => 'استمر ←',
@@ -1087,7 +1088,8 @@ $messages['ary'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista dyal l-modakaraṫ ĝla versyonaṫ jdad dyal MediaWiki]',
 );
 
-/** Egyptian Spoken Arabic (مصرى) */
+/** Egyptian Spoken Arabic (مصرى)
+ */
 $messages['arz'] = array(
        'mainpagetext' => "''' ميدياويكى اتنزلت بنجاح.'''",
        'mainpagedocfooter' => 'اسال [//meta.wikimedia.org/wiki/Help:Contents دليل اليوزر] للمعلومات حوالين استخدام برنامج الويكى.
@@ -1113,7 +1115,8 @@ $messages['as'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Asturian (asturianu) */
+/** Asturian (asturianu)
+ */
 $messages['ast'] = array(
        'mainpagetext' => "'''MediaWiki instalóse correchamente.'''",
        'mainpagedocfooter' => "Visita la [//meta.wikimedia.org/wiki/Help:Contents Guía d'usuariu] pa saber cómo usar esti software wiki.
@@ -1125,7 +1128,8 @@ $messages['ast'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de les ediciones de MediaWiki]",
 );
 
-/** Kotava (Kotava) */
+/** Kotava (Kotava)
+ */
 $messages['avk'] = array(
        'mainpagetext' => "'''MediaWiki inkeyen talpeyot.'''",
 );
@@ -1164,7 +1168,7 @@ $messages['az'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-poçt siyahısı]',
 );
 
-/** Bashkir (Ð\91ашҡортса)
+/** Bashkir (башҡортса)
  * @author Haqmar
  */
 $messages['ba'] = array(
@@ -1191,7 +1195,8 @@ $messages['bar'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglisten voh de neichen MediaWiki-Versionen]',
 );
 
-/** Southern Balochi (بلوچی مکرانی) */
+/** Southern Balochi (بلوچی مکرانی)
+ */
 $messages['bcc'] = array(
        'mainpagetext' => "'''مدیا وی کی گون موفقیت نصب بوت.'''",
        'mainpagedocfooter' => "مشورت کنیت گون  [//meta.wikimedia.org/wiki/Help:Contents User's Guide] په گشیترین اطلاعات په استفاده چه برنامه ویکی.
@@ -1202,7 +1207,8 @@ $messages['bcc'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Bikol Central (Bikol Central) */
+/** Bikol Central (Bikol Central)
+ */
 $messages['bcl'] = array(
        'mainpagetext' => "'''Instalado na an MediaWiki.'''",
        'mainpagedocfooter' => "Konsultarón tabì an [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para sa impormasyon sa paggamit nin progama kaining wiki.
@@ -1214,7 +1220,8 @@ $messages['bcl'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Belarusian (беларуская) */
+/** Belarusian (беларуская)
+ */
 $messages['be'] = array(
        'mainpagetext' => "'''MediaWiki паспяхова ўсталяваная.'''",
        'mainpagedocfooter' => 'Гл. [//meta.wikimedia.org/wiki/Help:Contents Дапаможнік карыстальніка (англ.)] па далейшыя звесткі аб карыстанні вікі-праграмамі.
@@ -1226,7 +1233,7 @@ $messages['be'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]',
 );
 
-/** Belarusian (Taraškievica orthography) (‪беларуская (тарашкевіца)‬)
+/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  * @author EugeneZelenko
  * @author Jim-by
  * @author Wizardist
@@ -2289,6 +2296,7 @@ $3
 Когато файлът вече е в основната директория, '''[$2 уикито ще е достъпно на този адрес]'''.",
        'config-download-localsettings' => 'Изтегляне на LocalSettings.php',
        'config-help' => 'помощ',
+       'config-nofile' => 'Файлът „$1“ не може да бъде открит. Да не е бил изтрит?',
        'mainpagetext' => "'''Уикито беше успешно инсталирано.'''",
        'mainpagedocfooter' => 'Разгледайте [//meta.wikimedia.org/wiki/Help:Contents ръководството] за подробна информация относно използването на софтуера.
 
@@ -2398,7 +2406,7 @@ $messages['bn'] = array(
        'config-license-none' => 'কোনো লাইসেন্স ফুটার নেই',
        'config-license-cc-by-sa' => 'ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন শেয়ার অ্যালাইক',
        'config-license-cc-by-nc-sa' => 'ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন নন-কমার্শিয়াল শেয়ার অ্যালাইক',
-       'config-license-cc-0' => 'ক্রিয়েটিভ কমন্স জিরো',
+       'config-license-cc-0' => 'ক্রিয়েটিভ কমন্স জিরো', # Fuzzy
        'config-license-pd' => 'পাবলিক ডোমেইন',
        'config-license-cc-choose' => 'একটি স্বনির্ধারিত ক্রিয়েটিভ কমন্স লাইসেন্ট নির্বাচন করুন',
        'config-email-settings' => 'ই-মেইল সেটিংস',
@@ -2427,7 +2435,8 @@ $messages['bn'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce মিডিয়াউইকি রিলিজের মেইলিং লিস্ট]',
 );
 
-/** Bishnupria Manipuri (বিষ্ণুপ্রিয়া মণিপুরী) */
+/** Bishnupria Manipuri (বিষ্ণুপ্রিয়া মণিপুরী)
+ */
 $messages['bpy'] = array(
        'mainpagetext' => "'''মিডিয়াউইকি হবাবালা ইয়া ইন্সটল ইল.'''",
        'mainpagedocfooter' => 'উইকি সফটৱ্যার এহান আতানির বারে দরকার ইলে [//meta.wikimedia.org/wiki/Help:Contents আতাকুরার গাইড]হানর পাঙলাক নেগা।
@@ -2593,7 +2602,7 @@ Staliadur paouezet.",
 
 Ma rit gant un herberc'hiañ kenrannet, e tlefe ho herberc'hier bezañ pourchaset deoc'h un anv ostiz reizh en teulioù titouriñ.
 
-M'emaoc'h o staliañ ur servijer Windows ha ma rit gant MySQL, marteze ne'z aio ket en-dro \"localhost\" evel anv servijer. Ma ne dro ket, klaskit ober gant \"127.0.0.1\" da chomlec'h IP lechel.",
+M'emaoc'h o staliañ ur servijer Windows ha ma rit gant MySQL, marteze ne'z aio ket en-dro \"localhost\" evel anv servijer. Ma ne dro ket, klaskit ober gant \"127.0.0.1\" da chomlec'h IP lechel.", # Fuzzy
        'config-db-host-oracle' => 'TNS an diaz roadennoù :',
        'config-db-wiki-settings' => 'Anavezout ar wiki-mañ',
        'config-db-name' => 'Anv an diaz roadennoù :',
@@ -2930,7 +2939,7 @@ $messages['ca'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de correu (''listserv'') per a anuncis del MediaWiki]",
 );
 
-/** Chechen (Ð\9dохчийн)
+/** Chechen (нохчийн)
  * @author Sasan700
  */
 $messages['ce'] = array(
@@ -2944,7 +2953,8 @@ $messages['ce'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Хаам бохьуьйту араяларца башхонца керла MediaWiki].',
 );
 
-/** Cebuano (Cebuano) */
+/** Cebuano (Cebuano)
+ */
 $messages['ceb'] = array(
        'mainpagetext' => "'''Malamposon ang pag-instalar sa MediaWiki.'''",
        'mainpagedocfooter' => 'Konsultaha ang [//meta.wikimedia.org/wiki/Help:Contents Giya sa mga gumagamit] alang sa impormasyon unsaon paggamit niining wiki nga software.
@@ -2982,18 +2992,8 @@ $messages['cps'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat sang MediaWiki]',
 );
 
-/** Crimean Turkish (Latin script) (‪Qırımtatarca (Latin)‬) */
-$messages['crh-latn'] = array(
-       'mainpagetext' => "'''MediaWiki muvafaqiyetnen quruldı.'''",
-       'mainpagedocfooter' => "Bu vikiniñ yol-yoruğını [//meta.wikimedia.org/wiki/Help:Contents User's Guide qullanıcı qılavuzından] ögrenip olasıñız.
-
-== Bazı faydalı saytlar ==
-* [//www.mediawiki.org/wiki/Manual:Configuration_settings Olucı sazlamalar cedveli];
-* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki boyunca sıq berilgen suallernen cevaplar];
-* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv].",
-);
-
-/** Crimean Turkish (Cyrillic script) (‪Къырымтатарджа (Кирилл)‬) */
+/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
+ */
 $messages['crh-cyrl'] = array(
        'mainpagetext' => "'''MediaWiki мувафакъиетнен къурулды.'''",
        'mainpagedocfooter' => "Бу викининъ ёл-ёругъыны [//meta.wikimedia.org/wiki/Help:Contents User's Guide къулланыджы къылавузындан] огренип оласынъыз.
@@ -3004,6 +3004,18 @@ $messages['crh-cyrl'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-нинъ янъы версияларынынъ чыкъувындан хабер йиберюв].",
 );
 
+/** Crimean Turkish (Latin script) (qırımtatarca (Latin)‎)
+ */
+$messages['crh-latn'] = array(
+       'mainpagetext' => "'''MediaWiki muvafaqiyetnen quruldı.'''",
+       'mainpagedocfooter' => "Bu vikiniñ yol-yoruğını [//meta.wikimedia.org/wiki/Help:Contents User's Guide qullanıcı qılavuzından] ögrenip olasıñız.
+
+== Bazı faydalı saytlar ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Olucı sazlamalar cedveli];
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki boyunca sıq berilgen suallernen cevaplar];
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-niñ yañı versiyalarınıñ çıquvından haber yiberüv].",
+);
+
 /** Czech (česky)
  * @author Danny B.
  * @author Mormegil
@@ -3542,6 +3554,7 @@ $3
 Až to dokončíte, můžete '''[$2 vstoupit do své wiki]'''.",
        'config-download-localsettings' => 'Stáhnout LocalSettings.php',
        'config-help' => 'nápověda',
+       'config-nofile' => 'Soubor „$1“ nelze nalézt. Byl smazán?',
        'mainpagetext' => "'''MediaWiki byla úspěšně nainstalována.'''",
        'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents Uživatelská příručka] vám napoví, jak MediaWiki používat.
 
@@ -3552,12 +3565,14 @@ 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ô.'''",
 );
 
-/** Chuvash (Чӑвашла) */
+/** Chuvash (Чӑвашла)
+ */
 $messages['cv'] = array(
        'mainpagetext' => "'''«MediaWiki» вики-движока лартасси ăнăçлă вĕçленчĕ.'''",
        'mainpagedocfooter' => 'Ку википе ĕçлеме пулăшакан информацине [//meta.wikimedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%BE%D1%89%D1%8C:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5 усăç руководствинче] тупма пултаратăр.
@@ -4078,7 +4093,7 @@ Es muss daher mit den nächsten Seite weitergemacht werden.",
 Sofern Änderungen vorgenommen werden sollen, kann man auf „← Zurück“ klicken.',
        'config-install-step-done' => 'erledigt',
        'config-install-step-failed' => 'gescheitert',
-       'config-install-extensions' => 'Softwareerweiterungen',
+       'config-install-extensions' => 'Programmerweiterungen',
        'config-install-database' => 'Datenbank wird eingerichtet',
        'config-install-schema' => 'Datenschema wird erstellt',
        'config-install-pg-schema-not-exist' => 'Das PostgesSQL-Datenschema ist nicht vorhanden',
@@ -4144,7 +4159,7 @@ Sobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wi
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
 );
 
-/** German (formal address) (‪Deutsch (Sie-Form)‬)
+/** German (formal address) (Deutsch (Sie-Form)‎)
  * @author MichaelFrey
  */
 $messages['de-formal'] = array(
@@ -4161,9 +4176,11 @@ $messages['de-formal'] = array(
  * @author Mirzali
  */
 $messages['diq'] = array(
+       'config-title' => 'MediaWiki $1 sazkerdış',
+       'config-information' => 'Melumat',
        'config-your-language' => 'Zıwanê şıma:',
        'config-wiki-language' => 'Wiki zıwan:',
-       'config-back' => '← Peyd',
+       'config-back' => '← Peyser',
        'config-continue' => 'Dewam ke',
        'config-page-language' => 'Zıwan',
        'config-page-welcome' => 'Şıma xeyr ameyê MediaWiki!',
@@ -4171,7 +4188,10 @@ $messages['diq'] = array(
        'config-page-name' => 'Name',
        'config-page-options' => 'Weçinegi',
        'config-page-install' => 'Barine',
+       'config-page-complete' => 'Temamyayo',
        'config-page-readme' => 'Mı bıwane',
+       'config-page-copying' => 'Kopyayeno',
+       'config-page-upgradedoc' => 'Berzkerdış',
        'config-restart' => 'E, fına dest pekê',
        'config-sidebar' => "* [//www.mediawiki.org MediaWiki keye]
 * [//www.mediawiki.org/wiki/Help:Contents User's Şınasiye]
@@ -4200,10 +4220,14 @@ $messages['diq'] = array(
        'config-admin-name' => 'Namey şıma:',
        'config-admin-password' => 'Parola:',
        'config-admin-password-confirm' => 'Fına parola:',
+       'config-admin-email' => 'Adresa e-postey:',
+       'config-profile-private' => 'Bexse wiki',
        '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',
+       'config-extensions' => 'Olekeni',
+       'config-help' => 'peşti',
        '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.
 
@@ -4214,7 +4238,8 @@ $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].
@@ -4239,7 +4264,8 @@ $messages['dtp'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lis pininsuratan pinolabus do ModiaWiki]',
 );
 
-/** Greek (Ελληνικά) */
+/** Greek (Ελληνικά)
+ */
 $messages['el'] = array(
        'mainpagetext' => "'''To λογισμικό MediaWiki εγκαταστάθηκε με επιτυχία.'''",
        'mainpagedocfooter' => 'Περισσότερες πληροφορίες σχετικά με τη χρήση και με τη ρύθμιση παραμέτρων θα βρείτε στους συνδέσμους: [//meta.wikimedia.org/wiki/MediaWiki_localisation Οδηγίες για τροποποίηση του περιβάλλοντος εργασίας] και [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Εγχειρίδιο χρήστη].',
@@ -4821,6 +4847,18 @@ 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]',
 );
 
+/** español (formal) (español (formal))
+ * @author Dferg
+ */
+$messages['es-formal'] = array(
+       'mainpagedocfooter' => 'Consulte usted la [//meta.wikimedia.org/wiki/Ayuda:Contenido Guía de usuario] para obtener información sobre el uso del software wiki.
+
+== Empezando ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Lista de ajustes de configuración]
+* [//www.mediawiki.org/wiki/Manual:FAQ/es FAQ de MediaWiki]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo de anuncios de distribución de MediaWiki]',
+);
+
 /** Estonian (eesti)
  * @author Avjoska
  */
@@ -4934,7 +4972,8 @@ $messages['eu'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWikiren argitalpenen posta zerrenda]',
 );
 
-/** Extremaduran (estremeñu) */
+/** Extremaduran (estremeñu)
+ */
 $messages['ext'] = array(
        'mainpagetext' => "'''MeyaGüiqui s'á istalau satihatoriamenti.'''",
        'mainpagedocfooter' => "Consurta la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] pa sabel mas al tentu el huncionamientu el software güiqui.
@@ -4966,10 +5005,27 @@ $messages['fa'] = array(
        'config-page-readme' => 'مرا بخوان',
        'config-page-releasenotes' => 'یادداشت‌های انتشار',
        '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-env-php' => 'پی‌اچ‌پی $1 نصب شده است.',
+       'config-env-php-toolow' => 'پی‌اچ‌پی $1 نصب شده است.
+در هر صورت، مدیاویکی نیاز به پی‌اچ‌پی نسخهٔ $2 یا بالاتر دارد.',
        'config-db-type' => 'نوع پایگاه اطلاعات:',
        'config-db-host' => 'میزبان پایگاه اطلاعات:',
        'config-db-username' => 'نام کاربری پایگاه اطلاعات:',
        'config-db-password' => 'کلمه عبور پایگاه اطلاعات:',
+       'config-header-mysql' => 'تنظیمات مای‌اس‌کیو‌ال',
+       'config-connection-error' => '$1.
+
+میزبان، نام کاربری و گذرواژه را بررسی کنید و دوباره امتحان کنید.',
        'config-site-name' => 'نام ویکی:',
        'config-site-name-blank' => 'نام تارنما را وارد کنید.',
        'config-project-namespace' => 'فضای نام پروژه:',
@@ -4979,9 +5035,12 @@ $messages['fa'] = array(
        'config-admin-email' => 'پست الکترونیکی شما:',
        'config-profile-private' => 'ویکی خصوصی',
        'config-license' => 'حق تکثیر و مجوز:',
+       'config-license-none' => 'بدون پاورقی مجوز',
+       'config-license-pd' => 'دامنه عمومی',
        'config-license-cc-choose' => 'انتخاب یک مجوز سفارشی عوام خلاق',
        'config-email-settings' => 'تنظیمات پست الکترونیکی',
        'config-upload-enable' => 'فعال سازی بارگذاری پرونده',
+       'config-logo' => 'نشانی نامواره:',
        'config-install-step-done' => 'انجام شد',
        'config-install-step-failed' => 'ناموفق بود',
        'config-help' => 'راهنما',
@@ -5066,7 +5125,7 @@ Et voi asentaa MediaWikiä.',
        'config-env-php-toolow' => 'PHP $1 on asennettu.
 MediaWiki vaatii PHP:n version $2 tai uudemman.',
        'config-no-db' => 'Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajurit PHP:lle.
-Seuraavat tietokantatyypit ovat tuettuja: $1.',
+Seuraavat tietokantatyypit ovat tuettuja: $1.', # Fuzzy
        'config-safe-mode' => "'''Varoitus:''' PHP:n [http://www.php.net/features.safe-mode safe mode] -tila on aktiivinen.
 Se voi aiheuttaa ongelmia erityisesti tiedostojen tallentamisen ja matemaattisten kaavojen kanssa.",
        'config-pcre' => 'PCRE-tukimoduuli puuttuu.
@@ -5180,7 +5239,8 @@ Tarkista, että alla olevat taivutusmuodot ovat oikein. Jos eivät, tee tarvitta
 Taivutusmuodot: {{GRAMMAR:genitive|{{SITENAME}}}} (yön) – {{GRAMMAR:partitive|{{SITENAME}}}} (yötä) – {{GRAMMAR:elative|{{SITENAME}}}} (yöstä) – {{GRAMMAR:inessive|{{SITENAME}}}} (yössä) – {{GRAMMAR:illative|{{SITENAME}}}} (yöhön).",
 );
 
-/** Faroese (føroyskt) */
+/** Faroese (føroyskt)
+ */
 $messages['fo'] = array(
        'mainpagetext' => "'''Innlegging av Wiki-ritbúnaði væleydnað.'''",
 );
@@ -5190,6 +5250,7 @@ $messages['fo'] = array(
  * @author Crochet.david
  * @author Gomoko
  * @author Grondin
+ * @author Guillom
  * @author Hashar
  * @author IAlex
  * @author Jean-Frédéric
@@ -5434,7 +5495,7 @@ Si vous ne voyez pas le système de base de données que vous essayez d'utiliser
        'config-support-mysql' => '* $1 est le premier choix pour MediaWiki et est mieux pris en charge ([http://www.php.net/manual/en/mysql.installation.php how to compile PHP with MySQL support])',
        'config-support-postgres' => "* $1 est un système de base de données populaire et ''open source'' qui peut être une alternative à MySQL ([http://www.php.net/manual/en/pgsql.installation.php how to compile PHP with PostgreSQL support]). Il peut contenir quelques bogues mineurs et n'est pas recommandé dans un environnement de production.",
        'config-support-sqlite' => '* $1 est un système de base de données léger qui est bien supporté. ([http://www.php.net/manual/en/pdo.installation.php How to compile PHP with SQLite support], utilise PDO)',
-       'config-support-oracle' => '* $1 est un système commercial de gestion de base de données d’entreprise. ([Http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])',
+       'config-support-oracle' => '* $1 est un système commercial de gestion de base de données d’entreprise. ([http://www.php.net/manual/en/oci8.installation.php Comment compiler PHP avec le support OCI8])',
        'config-support-ibm_db2' => "* $1 est une base de données d'entreprise commerciale.",
        'config-header-mysql' => 'Paramètres de MySQL',
        'config-header-postgres' => 'Paramètres de PostgreSQL',
@@ -5736,7 +5797,8 @@ Lorsque c'est fait, vous pouvez '''[$2 accéder à votre wiki]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Liste de discussion sur les distributions de MediaWiki]',
 );
 
-/** Cajun French (français cadien) */
+/** Cajun French (français cadien)
+ */
 $messages['frc'] = array(
        'mainpagetext' => "'''Vous avez bien installé MediaWiki.'''",
        'mainpagedocfooter' => 'Lisez la [//meta.wikimedia.org/wiki/Help:Contents Guide des Useurs] pour apprendre à user le wiki software.
@@ -5923,12 +5985,14 @@ $messages['frr'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]',
 );
 
-/** Friulian (furlan) */
+/** Friulian (furlan)
+ */
 $messages['fur'] = array(
        'mainpagetext' => "'''MediaWiki e je stade instalade cun sucès.'''",
 );
 
-/** Western Frisian (Frysk) */
+/** Western Frisian (Frysk)
+ */
 $messages['fy'] = array(
        'mainpagetext' => "'''MediaWiki-program goed ynstallearre.'''",
        'mainpagedocfooter' => "Rieplachtsje de [//meta.wikimedia.org/wiki/Help:Ynhâldsopjefte hantlieding] foar ynformaasje oer it gebrûk fan 'e wikisoftware.
@@ -5953,7 +6017,8 @@ $messages['ga'] = array(
 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.',
 );
 
-/** Gagauz (Gagauz) */
+/** Gagauz (Gagauz)
+ */
 $messages['gag'] = array(
        'mainpagetext' => "'''MediaWiki başarılan kuruldu.'''",
        'mainpagedocfooter' => "Vikilän iş uurunda bilgi almaa için [//meta.wikimedia.org/wiki/Help:Contents User's Guide] sayfasına bakınız
@@ -5965,7 +6030,8 @@ $messages['gag'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Simplified Gan script (‪赣语(简体)‬) */
+/** Simplified Gan script (赣语(简体)‎)
+ */
 $messages['gan-hans'] = array(
        'mainpagetext' => "'''安装正MediaWiki喽。'''",
        'mainpagedocfooter' => '参看[//meta.wikimedia.org/wiki/Help:Contents 用户指南]里头会话到啷用wiki软件
@@ -5977,7 +6043,8 @@ $messages['gan-hans'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布email清单]',
 );
 
-/** Traditional Gan script (‪贛語(繁體)‬) */
+/** Traditional Gan script (贛語(繁體)‎)
+ */
 $messages['gan-hant'] = array(
        'mainpagetext' => "'''安裝正MediaWiki嘍。'''",
        'mainpagedocfooter' => '參看[//meta.wikimedia.org/wiki/Help:Contents 用戶指南]裡頭會話到啷用wiki軟件
@@ -6550,6 +6617,13 @@ Cando faga todo isto, xa poderá '''[$2 entrar no seu wiki]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de correo dos lanzamentos de MediaWiki]',
 );
 
+/** Goan Konkani (Latin script) (Konknni)
+ * @author The Discoverer
+ */
+$messages['gom-latn'] = array(
+       'config-page-language' => 'Bhas',
+);
+
 /** Ancient Greek (Ἀρχαία ἑλληνικὴ)
  * @author Crazymadlover
  * @author Omnipaedista
@@ -6621,7 +6695,7 @@ E <doclink href=Copying>Kopi vu dr GNU General Public-Lizänz</doclink> sott zä
        'config-sidebar' => '* [//www.mediawiki.org MediaWiki Websyte vu MediaWiki]
 * [//www.mediawiki.org/wiki/Help:Contents Nutzeraaleitig zue MediaWiki]
 * [//www.mediawiki.org/wiki/Manual:Contents Adminischtratoreaaleitig zue MediaWiki]
-* [//www.mediawiki.org/wiki/Manual:FAQ Vilmol gstellti Froge zue MediaWiki]',
+* [//www.mediawiki.org/wiki/Manual:FAQ Vilmol gstellti Froge zue MediaWiki]', # Fuzzy
        'config-env-good' => 'D Inschtallationsumgäbig isch prieft wore.
 Du chasch MediaWiki inschtalliere.',
        'config-env-bad' => 'D Inschtallationsumgäbigisch prieft wore.
@@ -6633,7 +6707,7 @@ Du chasch MediaWiki nit inschtalliere.',
 Wänn Du ne Websyte mit ere große Bsuechrzahl bedrybsch, sottsch e weng ebis läse iber [//www.mediawiki.org/wiki/Unicode_normalization_considerations Unicode-Normalisierig (en)].",
        'config-unicode-update-warning' => "'''Warnig:''' Di inschtalliert Version vum Unicode-Normalisierigswrapper verwändet e elteri Version vu dr Bibliothek vum [http://site.icu-project.org/ ICU-Projäkt].
 Du sottsch si [//www.mediawiki.org/wiki/Unicode_normalization_considerations aktualisiere], wänn Dor d Verwändig vu Unicode wichtig isch.",
-       'config-no-db' => 'S isch kei adäquate Datebanktryyber gfunde wore!',
+       'config-no-db' => 'S isch kei adäquate Datebanktryyber gfunde wore!', # Fuzzy
        'config-no-fts3' => "'''Warnig:''' SQLite isch ohni s [//sqlite.org/fts3.html FTS3-Modul] kumpiliert wore, s stehn kei Suechfunktione z Verfiegig.",
        'config-register-globals' => "'''Warnig: Dr Parameter <code>[http://php.net/register_globals register_globals]</code> vu PHP isch aktiviert.'''
 '''Är sott deaktiviert wäre, wänn des megli isch.'''
@@ -6689,12 +6763,14 @@ $messages['gu'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce મિડીયાવિકિ રીલીઝ મેઇલીંગ લીસ્ટ]',
 );
 
-/** Manx (Gaelg) */
+/** Manx (Gaelg)
+ */
 $messages['gv'] = array(
        'mainpagetext' => "'''Ta MediaWiki currit stiagh nish.'''",
 );
 
-/** Hakka (Hak-kâ-fa) */
+/** Hakka (Hak-kâ-fa)
+ */
 $messages['hak'] = array(
        'mainpagetext' => "'''Yí-kîn sṳ̀n-kûng ôn-chông MediaWiki.'''",
        'mainpagedocfooter' => 'chhiáng fóng-mun [//meta.wikimedia.org/wiki/Help:Contents Yung-fu sú-chhak] yî-khi̍p sṳ́-yung chhṳ́ wiki ngiôn-khien ke sin-sit!
@@ -6706,7 +6782,8 @@ $messages['hak'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki fat-phu email chhîn-tân]',
 );
 
-/** Hawaiian (Hawai`i) */
+/** Hawaiian (Hawai`i)
+ */
 $messages['haw'] = array(
        'mainpagetext' => "'''Ua pono ka ho‘ouka ‘ana o MediaWiki.'''",
 );
@@ -6831,7 +6908,7 @@ $1
 אם מערכת ההפעלה שלהם היא Mandrake, התקינו את החבילה php-xml.',
        'config-pcre' => 'נראה שחסרה תמיכה במודול PCRE.
 כדי שמדיה־ויקי תעבוד, נדרשת תמיכה בביטויים רגולריים תואמי Perl.',
-       'config-pcre-no-utf8' => "'''שגיאה סופנית:''': נראה שמודול PCRE של PHP מקומפל ללא תמיכה ב־PCRE_UTF8.
+       'config-pcre-no-utf8' => "'''שגיאה סופנית''': נראה שמודול PCRE של PHP מקומפל ללא תמיכה ב־PCRE_UTF8.
 מדיה־ויקי דורשת תמיכה ב־UTF-8 לפעילות נכונה.",
        'config-memory-raised' => 'ערך האפשרות <code>memory_limit</code> של PHP הוא $1, הועלה ל־$2.',
        'config-memory-bad' => "'''אזהרה:''' ערך האפשרות <code>memory_limit</code> של PHP הוא $1.
@@ -7052,7 +7129,7 @@ chmod a+w $3</pre></div>',
        'config-ns-generic' => 'מיזם',
        'config-ns-site-name' => 'זהה לשם הוויקי: $1',
        'config-ns-other' => 'אחר (לציין)',
-       'config-ns-other-default' => 'הוויקי־שלי',
+       'config-ns-other-default' => 'הוויקי שלי',
        'config-project-namespace-help' => "בהתאם לדוגמה של ויקיפדיה, אתרי ויקי רבים שומרים על דפי המדיניות שלהם בנפרד מדפי התוכן שלהם ב\"'''מרחב השמות של המיזם'''\" (\"'''project namespace'''\").
 כל שמות הדפים במרחב השמות הזה מתחילים בתחילית מסוימת שאתם יכולים להגדיר כאן.
 באופן מסורתי התחילית הזאת מבוססת על שם הוויקי, והיא אינה יכולה להכיל תווי פיסוק כגון \"#\" או \":\".",
@@ -7125,9 +7202,9 @@ chmod a+w $3</pre></div>',
        'config-enable-email' => 'להפעיל דוא״ל יוצא',
        'config-enable-email-help' => 'אם אתם רוצים שדוא״ל יעבוד, [http://www.php.net/manual/en/mail.configuration.php אפשרויות הדוא״ל של PHP] צריכות להיות מוגדרות נכון.
 אם אינכם רוצים להפעיל שום אפשרויות דוא״ל, כבו אותן כאן ועכשיו.',
-       'config-email-user' => '×\9c×\90פשר שליחת דוא״ל ממשתמש למשתמש',
+       'config-email-user' => '×\9c×\94פע×\99×\9c שליחת דוא״ל ממשתמש למשתמש',
        'config-email-user-help' => 'לאפשר לכל המשתמשים לשלוח אחד לשני דוא״ל אם הם הפעילו את זה בהעדפות שלהם.',
-       'config-email-usertalk' => '×\9c×\90פשר הודעות על דף שיחת משתמש',
+       'config-email-usertalk' => '×\9c×\94פע×\99×\9c הודעות על דף שיחת משתמש',
        'config-email-usertalk-help' => 'לאפשר למשתמשים לקבל הודעות על שינויים בדפי המשתמש שלהם, אם הם הפעילו את זה בהעדפות שלהם.',
        'config-email-watchlist' => 'הפעלת התרעה על רשימת המעקב',
        'config-email-watchlist-help' => 'לאפשר למשתמשים לקבל הודעות על הדפים ברשימת המעקב שלהם אם הם הפעילו את זה בהעדפות שלהם.',
@@ -7140,7 +7217,7 @@ chmod a+w $3</pre></div>',
 לשם יישלחו תגובות שגיאה (bounce).
 שרתי דוא״ל רבים דורשים שלפחות החלק של המתחם יהיה תקין.',
        'config-upload-settings' => 'העלאת קבצים ותמונות',
-       'config-upload-enable' => '×\9c×\90פשר העלאת קבצים',
+       'config-upload-enable' => '×\9c×\94פע×\99×\9c העלאת קבצים',
        'config-upload-help' => 'העלאות קבצים חושפות את השרת שלכם לסיכוני אבטחה.
 למידע נוסף, קִראו את [//www.mediawiki.org/wiki/Manual:Security חלק האבטחה] בספר ההדרכה.
 
@@ -7255,7 +7332,8 @@ $3
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce רשימת התפוצה על השקת גרסאות]',
 );
 
-/** Hindi (हिन्दी) */
+/** Hindi (हिन्दी)
+ */
 $messages['hi'] = array(
        'mainpagetext' => "'''मीडियाविकिका इन्स्टॉलेशन पूरा हो गया हैं ।'''",
        'mainpagedocfooter' => 'विकि सॉफ्टवेयरके इस्तेमाल के लिये [//meta.wikimedia.org/wiki/Help:Contents उपयोगकर्ता गाईड] देखें ।
@@ -7292,7 +7370,8 @@ $messages['hil'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista sang mga ginapadal-an sang sulat kon may paguha-on nga MediaWiki]",
 );
 
-/** Croatian (hrvatski) */
+/** Croatian (hrvatski)
+ */
 $messages['hr'] = array(
        'mainpagetext' => "'''Softver MediaWiki je uspješno instaliran.'''",
        'mainpagedocfooter' => 'Pogledajte [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentaciju o prilagodbi sučelja]
@@ -7377,6 +7456,7 @@ Slědowace typy datoweje banki so podpěruja: $1.
 Jeli wužiwaš zhromadnje wužiwany serwer, proš swojeho poskićowarja, zo by přihódny ćěrjak datoweje banki instalował.
 Jeli sy PHP sam kompilował, konfiguruj jón znowa z aktiwizowanym programom datoweje banki, na přikład z pomocu <code>./configure --with-mysql</code>.
 Jeli sy PHP z Debianoweho abo Ubuntuoweho paketa instalował, dyrbiš tež modul php5-mysql instalować.',
+       'config-outdated-sqlite' => "'''Warnowanje''': maš SQLite $1, kotryž je starši hač minimalna trěbna wersija $2. SQLite njebudźe k dispoziciji stać.",
        'config-no-fts3' => "'''Warnowanje''': SQLite je so bjez [//sqlite.org/fts3.html FTS3-modula] kompilował, pytanske funkcije njebudu k dispoziciji stać.",
        'config-register-globals' => "'''Warnowanje: Funkcija <code>[http://php.net/register_globals register_globals]</code> PHP je zmóžnjena.'''
 '''Znjemóžń ju, jeli móžeš.'''
@@ -7389,10 +7469,15 @@ To móže problemy zawinować, předewšěm, jeli so datajowe nahraća a podpěr
        'config-xml-bad' => 'XML-modul za PHP faluje.
 MediaWiki trjeba funkcije w tutym modulu a njebudźe w tutej konfiguraciji fungować.
 Jeli wužiwaš Mandrake, instaluj paket php-xml.',
+       'config-pcre' => 'Zda so, zo modul za PCRE-podpěru faluje.
+MediaWiki trjeba z Perl kompatibelne funkcije za regularne wurazy, zo by fungował.',
+       'config-pcre-no-utf8' => "'''Ćežki zmylk''': Zda so, zo PCRE-modul za PHP ma so bjez PCRE_UTF8-podpěry kompilować.
+MediaWiki trjeba UTF-8-podpěru, zo by korektnje fungował.",
        'config-memory-raised' => 'PHP-parameter <code>memory_limit</code> je $1, je so na hódnotu $2 zwyšił.',
        'config-memory-bad' => "'''Warnowanje:''' PHP-parameter <code>memory_limit</code> ma hódnotu $1,
 To je najskerje přeniske.
 Instalacija móhła so njeporadźić!",
+       'config-ctype' => "'''Ćežki zmylk''': PHP dyrbi so z podpěru za [http://www.php.net/manual/en/ctype.installation.php rozšěrjenje Ctype] kompilować.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] je instalowany',
        'config-apc' => '[http://www.php.net/apc APC] je instalowany',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] je instalowany',
@@ -7441,6 +7526,7 @@ Změń ju jenož, jeli su přeswědčiwe přičiny za to.',
        'config-type-ibm_db2' => 'IBM DB2',
        'config-support-mysql' => '* $1 je primarny cil za MediaWiki a podpěruje so najlěpje ([http://www.php.net/manual/en/mysql.installation.php Nawod ke kompilowanju  PHP z  MySQL-podpěru])',
        'config-support-postgres' => '* $1 je popularny system datoweje banki zjawneho žórła jako alternatiwa k MySQL ([http://www.php.net/manual/en/pgsql.installation.php nawod za kompilowanje PHP z podpěru PostgreSQL]). Móhło hišće někotre zmylki eksistować, a njeporuča so jón w produktiwnej wokolinje wužiwać.',
+       'config-support-oracle' => '* $1 je komercielna předewzaćelska datowa banka. ([http://www.php.net/manual/en/oci8.installation.php Nawod za kompilowanje PHP z OCI8-podpěru])',
        'config-support-ibm_db2' => '* $1 je komercielna předewzaćelska datowa banka.',
        'config-header-mysql' => 'Nastajenja MySQL',
        'config-header-postgres' => 'Nastajenja PostgreSQL',
@@ -7807,7 +7893,7 @@ Telepítés megszakítva.',
 
 Ha megosztott webtárhelyet használsz, a szolgáltató dokumentációjában megtalálható a helyes hosztnév.
 
-Ha Windows-alapú szerverre telepítesz, és MySQL-t használsz, a „localhost” nem biztos, hogy működni fog. Ha így van, próbáld meg a „127.0.0.1” helyi IP-cím használatát.',
+Ha Windows-alapú szerverre telepítesz, és MySQL-t használsz, a „localhost” nem biztos, hogy működni fog. Ha így van, próbáld meg a „127.0.0.1” helyi IP-cím használatát.', # Fuzzy
        'config-db-host-oracle' => 'Adatbázis TNS:',
        'config-db-wiki-settings' => 'A wiki azonosítása',
        'config-db-name' => 'Adatbázisnév:',
@@ -8177,7 +8263,87 @@ Ha végeztél a fájl elhelyezésével, '''[$2 beléphetsz a wikibe]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]",
 );
 
-/** Armenian (Հայերեն) */
+/** Magyar (magázó) (Magyar (magázó))
+ * @author Dani
+ * @author Glanthor Reviol
+ */
+$messages['hu-formal'] = array(
+       'config-localsettings-upgrade' => "'''Figyelmeztetés''': már létezik a <code>LocalSettings.php</code> fájl.
+A szoftver frissíthető.
+Adja meg a <code>\$wgUpgradeKey</code>-ben található kulcsot a beviteli mezőben", # Fuzzy
+       'config-session-expired' => 'Úgy tűnik, hogy a munkamenetadatok lejártak.
+A munkamenetek élettartama a következőre van beállítva: $1.
+Az érték növelhető a php.ini <code>session.gc_maxlifetime</code> beállításának módosításával.
+Indítsa újra a telepítési folyamatot.',
+       'config-no-session' => 'Elvesztek a munkamenetadatok!
+Ellenőrizze, hogy a php.ini-ben a <code>session.save_path</code> beállítás a megfelelő könyvtárra mutat-e.',
+       'config-your-language-help' => 'Válassza ki a telepítési folyamat során használandó nyelvet.',
+       'config-wiki-language-help' => 'Az a nyelv, amin a wiki tartalmának legnagyobb része íródik.',
+       'config-page-welcome' => 'Üdvözli a MediaWiki!',
+       'config-help-restart' => 'Szeretné törölni az eddig megadott összes adatot és újraindítani a telepítési folyamatot?',
+       'config-welcome' => '=== Környezet ellenőrzése ===
+Alapvető ellenőrzés, ami megmondja, hogy a környezet alkalmas-e a MediaWiki számára.
+Ha probléma merülne fel a telepítés során, meg kell adnia mások számára az alább megjelenő információkat.',
+       'config-unicode-pure-php-warning' => "'''Figyelmeztetés''': Az [http://pecl.php.net/intl intl PECL kiterjesztés] nem érhető el Unicode normalizáláshoz.
+Ha nagy látogatottságú oldalt üzemeltet, itt találhat információkat [//www.mediawiki.org/wiki/Unicode_normalization_considerations a témáról].", # Fuzzy
+       'config-register-globals' => "'''Figyelmeztetés: A PHP <code>[http://php.net/register_globals register_globals]</code> beállítása engedélyezve van.'''
+'''Tiltsa le, ha van rá lehetősége.'''
+A MediaWiki működőképes a beállítás használata mellett, de a szerver biztonsági kockázatnak lesz kitéve.",
+       'config-imagemagick' => 'Az ImageMagick megtalálható a rendszeren: <code>$1</code>.
+A bélyegképek készítése engedélyezve lesz, ha engedélyezi a feltöltéseket.',
+       'config-db-name-help' => 'Válassza ki a wikije azonosítására használt nevet.
+Nem tartalmazhat szóközt vagy kötőjelet.
+
+Ha megosztott webtárhelyet használ, a szolgáltatója vagy egy konkrét adatbázisnevet ad önnek használatra, vagy létrehozhat egyet a vezérlőpulton keresztül.', # Fuzzy
+       'config-db-install-help' => 'Adja meg a felhasználónevet és jelszót, amivel a telepítő csatlakozhat az adatbázishoz.',
+       'config-db-wiki-help' => 'Adja meg azt a felhasználónevet és jelszót, amivel a wiki fog csatlakozni az adatbázishoz működés közben.
+Ha a fiók nem létezik és a telepítést végző fiók rendelkezik megfelelő jogosultsággal, egy új fiók készül a megadott a névvel, azon minimális jogosultságkörrel, ami a wiki működéséhez szükséges.',
+       'config-charset-help' => "'''Figyelmezetés:''' Ha a '''visszafelé kompatibilis UTF-8''' beállítást használja MySQL 4.1 vagy újabb verziók esetén, és utána a <code>mysqldump</code> programmal készít róla biztonsági másolatot, az tönkreteheti az összes nem ASCII-karaktert, visszafordíthatatlanul károsítva a másolatokban tárolt adatokat!
+
+'''Bináris''' módban a MediaWiki az UTF-8-ban kódolt szöveget bináris mezőkben tárolja az adatbázisban.
+Ez sokkal hatékonyabb a MySQL UTF-8-módjától, és lehetővé teszi, hogy a teljes Unicode-karakterkészletet használja.
+'''UTF-8-módban''' MySQL tudja, hogy milyen karakterkészlettel van kódolva az adat, megfelelően van megjelenítve és konvertálva, de
+nem használhatja a [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] feletti karaktereket.",
+       'config-db-schema-help' => 'A fenti sémák általában megfelelőek.
+Csak akkor módosítson rajta, ha szükség van rá.', # Fuzzy
+       'config-sqlite-parent-unwritable-nogroup' => 'Nem lehet létrehozni az adatok tárolásához szükséges <code><nowiki>$1</nowiki></code> könyvtárat, mert a webszerver nem írhat a szülőkönyvtárba (<code><nowiki>$2</nowiki></code>).
+
+A telepítő nem tudta megállapíteni, hogy melyik felhasználói fiókon fut a webszerver.
+A folytatáshoz tegye írhatóvá ezen fiók (és más fiókok!) számára a következő könyvtárat: <code><nowiki>$3</nowiki></code>.
+Unix/Linux rendszereken tedd a következőt:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
+       'config-ns-other' => 'Más (adja meg)',
+       'config-admin-name-blank' => 'Adja meg az adminisztrátor felhasználónevét!',
+       'config-admin-name-invalid' => 'A megadott felhasználónév (<nowiki>$1</nowiki>) érvénytelen.
+Adjon meg egy másik felhasználónevet.',
+       'config-admin-password-blank' => 'Adja meg az adminisztrátori fiók jelszavát!',
+       'config-instantcommons-help' => 'Az [//www.mediawiki.org/wiki/InstantCommons Instant Commons] lehetővé teszi, hogy a wikin használhassák a [//commons.wikimedia.org/ Wikimedia Commons] oldalon található képeket, hangokat és más médiafájlokat.
+A használatához a MediaWikinek internethozzáférésre van szüksége.
+
+A funkcióról és hogy hogyan állítható be más wikik esetén [//mediawiki.org/wiki/Manual:$wgForeignFileRepos a kézikönyvben] találhat további információkat.',
+       'config-install-done' => "'''Gratulálunk!'''
+Sikeresen telepítette a MediaWikit.
+
+A telepítő készített egy <code>LocalSettings.php</code> fájlt.
+Ez tartalmazza az összes beállítást.
+
+[$1 Le kell töltenie], és el kell helyeznie a MediaWiki telepítési könyvtárába (az a könyvtár, ahol az index.php van).
+'''Megjegyzés''': Ha ezt most nem teszi meg, és kilép, a generált fájl nem lesz elérhető a későbbiekben.
+
+Ha ezzel készen van, '''[$2 beléphet a wikibe]'''.", # Fuzzy
+       'mainpagedocfooter' => "Ha segítségre van szüksége a wikiszoftver használatához, akkor keresse fel a [//meta.wikimedia.org/wiki/Help:Contents User's Guide] oldalt.
+
+== Alapok (angol nyelven) ==
+* [//www.mediawiki.org/wiki/Manual:Configuration_settings Beállítások listája]
+* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki GyIK]
+* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki-kiadások levelezőlistája]",
+);
+
+/** Armenian (Հայերեն)
+ */
 $messages['hy'] = array(
        'mainpagetext' => "'''«MediaWiki» ծրագիրը հաջողությամբ տեղադրվեց։'''",
        'mainpagedocfooter' => "Այցելեք [//meta.wikimedia.org/wiki/Help:Contents User's Guide]՝ վիքի ծրագրային ապահովման օգտագործման մասին տեղեկությունների համար։
@@ -8893,7 +9059,7 @@ Instalasi dibatalkan.',
 
 Jika Anda menggunakan inang web bersama, penyedia inang Anda harus memberikan nama inang yang benar di dokumentasi mereka.
 
-Jika Anda menginstal pada server Windows dan menggunakan MySQL, "localhost" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba "127.0.0.1" untuk alamat IP lokal.',
+Jika Anda menginstal pada server Windows dan menggunakan MySQL, "localhost" mungkin tidak dapat digunakan sebagai nama server. Jika demikian, coba "127.0.0.1" untuk alamat IP lokal.', # Fuzzy
        'config-db-host-oracle' => 'TNS basis data:',
        'config-db-host-oracle-help' => 'Masukkan [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name] yang sah; berkas tnsnames.ora harus dapat diakses oleh instalasi ini.<br />Jika Anda menggunakan pustaka klien 10g atau lebih baru, Anda juga dapat menggunakan metode penamaan [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].',
        'config-db-wiki-settings' => 'Identifikasi wiki ini',
@@ -9226,7 +9392,7 @@ Mengabaikan daftar bawaan.",
        'config-install-keys' => 'Membuat kunci rahasia',
        'config-insecure-keys' => "'''Peringatan:''' {{PLURAL:$2|Suatu|Beberapa}} kunci aman ($1) yang dibuat selama instalasi {{PLURAL:$2|tidak|tidak}} benar-benar aman. Pertimbangkan untuk mengubah {{PLURAL:$2|kunci|kunci-kunci}} tersebut secara manual.",
        'config-install-sysop' => 'Membuat akun pengguna pengurus',
-       'config-install-subscribe-fail' => 'Tidak dapat berlangganan mediawiki-announce',
+       'config-install-subscribe-fail' => 'Tidak dapat berlangganan mediawiki-announce', # Fuzzy
        'config-install-mainpage' => 'Membuat halaman utama dengan konten bawaan',
        'config-install-extension-tables' => 'Pembuatan tabel untuk ekstensi yang diaktifkan',
        'config-install-mainpage-failed' => 'Tidak dapat membuat halaman utama: $1',
@@ -9257,7 +9423,8 @@ Setelah melakukannya, Anda dapat '''[$2 memasuki wiki Anda]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]',
 );
 
-/** Interlingue (Interlingue) */
+/** Interlingue (Interlingue)
+ */
 $messages['ie'] = array(
        'mainpagetext' => "'''Software del wiki installat con successe.'''",
 );
@@ -9277,7 +9444,8 @@ $messages['ig'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce wéfù ndétu nke ozi MediaWiki]",
 );
 
-/** Iloko (Ilokano) */
+/** Iloko (Ilokano)
+ */
 $messages['ilo'] = array(
        'mainpagetext' => "'''Sibaballigi a nainstolar ti MediaWiki.'''",
 );
@@ -9295,7 +9463,8 @@ $messages['io'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki nova versioni posto-listo]",
 );
 
-/** Icelandic (íslenska) */
+/** Icelandic (íslenska)
+ */
 $messages['is'] = array(
        'mainpagetext' => "'''Uppsetning á MediaWiki heppnaðist.'''",
        'mainpagedocfooter' => 'Ráðfærðu þig við [//meta.wikimedia.org/wiki/Help:Contents Notandahandbókina] fyrir frekari upplýsingar um notkun wiki-hugbúnaðarins.
@@ -9311,6 +9480,7 @@ $messages['is'] = array(
  * @author Beta16
  * @author Darth Kule
  * @author F. Cosoleto
+ * @author Gianfranco
  * @author Karika
  */
 $messages['it'] = array(
@@ -9385,7 +9555,7 @@ MediaWiki necessita di questo modulo per funzinare, che fornisce funzioni per le
        '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-ctype' => "'''Errore''': PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/it/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',
@@ -9396,7 +9566,7 @@ La caching degli oggetti non è attivata.",
 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.
+       'config-no-scaling' => 'Impossibile trovare GD library o ImageMagick.
 Le miniature delle immagini saranno disabilitate.',
        'config-no-uri' => "'''Errore:''' Impossibile determinare l'URI attuale.
 Installazione interrotta.",
@@ -9404,10 +9574,14 @@ Installazione interrotta.",
        'config-using-server' => 'Nome server in uso "<nowiki>$1</nowiki>".',
        'config-using-uri' => 'URL del server in uso "<nowiki>$1$2</nowiki>".',
        'config-db-type' => 'Tipo di database:',
+       'config-db-wiki-settings' => 'Identifica questo wiki',
        'config-db-name' => 'Nome del database:',
+       'config-db-name-oracle' => 'Schema del database:',
+       'config-db-username' => 'Nome utente 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-prefix' => 'Prefisso tabella del database:',
        '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',
@@ -9425,15 +9599,18 @@ Da cambiare solamente se si è sicuri di averne bisogno.',
        'config-header-oracle' => 'Impostazioni Oracle',
        'config-header-ibm_db2' => 'Impostazioni IBM DB2',
        'config-invalid-db-type' => 'Tipo di database non valido',
+       'config-db-web-account' => "Account del database per l'accesso web",
        '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-binary' => 'Binario',
        'config-mysql-utf8' => 'UTF-8',
        'config-ibm_db2-low-db-pagesize' => "Il database DB2 in uso ha una tablespace predefinita con un insufficiente pagesize, che dovrebbe essere '''32K''' o maggiore.",
        'config-ns-generic' => 'Progetto',
        'config-ns-site-name' => 'Stesso nome wiki: $1',
+       'config-ns-other-default' => 'MyWiki',
        'config-admin-box' => 'Account amministratore',
        'config-admin-name' => 'Tuo nome:',
        'config-admin-password' => 'Password:',
@@ -9454,26 +9631,47 @@ Specificare un nome utente diverso.',
 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-optional-continue' => 'Fammi altre domande.',
+       'config-profile-wiki' => 'Wiki tradizionale',
+       'config-profile-no-anon' => 'Creazione utenza obbligatoria',
+       'config-profile-fishbowl' => 'Solo editori autorizzati',
+       'config-profile-private' => 'Wiki privata',
        'config-license' => 'Copyright e licenza:',
+       'config-license-none' => 'Nessun piè di pagina per la 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',
        'config-license-cc-0' => 'Creative Commons Zero (pubblico dominio)',
        'config-license-gfdl' => 'GNU Free Documentation License 1.3 o versioni successive',
        'config-license-pd' => 'Pubblico dominio',
+       'config-license-cc-choose' => 'Seleziona una delle licenze Creative Commons',
+       'config-license-help' => "Molti wiki pubblici rilasciano i loro contributi con una [http://freedomdefined.org/Definition licenza libera]. Questo aiuta a creare un senso di proprietà condivisa nella comunità e incoraggia a contribuire a lungo termine. Non è generalmente necessario per un wiki privato o aziendale.
+
+Se vuoi usare testi da Wikipedia, o desideri che Wikipedia possa essere in grado di accettare testi copiati dal tuo wiki, dovresti scegliere '''Creative Commons Attribution Share Alike'''.
+
+In precedenza Wikipedia ha utilizzato la GNU Free Documentation License. La GFDL è una licenza valida, ma è di difficile comprensione e complica il riutilizzo dei contenuti.",
        'config-email-settings' => 'Impostazioni email',
+       'config-email-user' => 'Abilita invio email fra utenti',
        'config-email-auth' => 'Abilita autenticazione via email',
+       'config-upload-enable' => 'Consentire il caricamento di file',
        'config-upload-deleted' => 'Directory per i file cancellati:',
        'config-logo' => 'URL del logo:',
+       'config-instantcommons' => 'Abilita Instant Commons',
        '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-needservers' => 'È stato selezionato il tipo di caching Memcached, ma non è stato impostato alcun server.',
        'config-memcache-badip' => 'È stato inserito un indirizzo IP non valido per Memcached: $1.',
        'config-extensions' => 'Estensioni',
+       'config-install-step-done' => 'fatto',
+       'config-install-step-failed' => 'non riuscito',
+       'config-install-schema' => 'Creazione dello schema',
+       'config-install-user' => 'Creazione di utente del database',
        'config-install-user-alreadyexists' => 'L\'utente "$1" è già presente',
        'config-install-user-create-failed' => 'Creazione dell\'utente "$1" non riuscita: $2',
        'config-install-user-missing' => 'L\'utente indicato "$1" non esiste.',
        'config-install-tables-failed' => "'''Errore''': La creazione della tabella non è riuscita: $1",
+       'config-install-interwiki' => 'Riempimento della tabella interwiki predefinita',
        'config-install-interwiki-list' => 'Impossibile leggere il file <code>interwiki.list</code>.',
        'config-install-stats' => 'Inizializzazione delle statistiche',
        'config-install-keys' => 'Generazione delle chiavi segrete',
@@ -9508,43 +9706,45 @@ I seguenti collegamenti sono in lingua inglese:
  * @author 青子守歌
  */
 $messages['ja'] = array(
-       'config-desc' => 'MediaWikiのインストーラー',
-       'config-title' => 'MediaWiki $1のインストール',
+       'config-desc' => 'MediaWiki のインストーラー',
+       'config-title' => 'MediaWiki $1 のインストール',
        'config-information' => '情報',
-       'config-localsettings-upgrade' => '<code>LocalSettings.php</code>ファイルが検出されました。
-アップグレードするため、ボックス中の<code>$wgUpgradeKey</code>の値を入力してください。
-LocalSettings.phpの中にそれはあるでしょう。',
-       'config-localsettings-key' => 'アップグレードキー:',
+       'config-localsettings-upgrade' => 'ファイル <code>LocalSettings.php</code> を検出しました。
+インストールされているものをアップグレードするには、<code>$wgUpgradeKey</code> の値を以下の欄に入力してください。
+この値は LocalSettings.php 内にあります。',
+       'config-localsettings-cli-upgrade' => 'ファイル LocalSettings.php を検出しました。
+インストールされているものをアップグレードするには、update.php を実行してください',
+       'config-localsettings-key' => 'アップグレード キー:',
        'config-localsettings-badkey' => '与えられたキーが間違っています',
-       'config-upgrade-key-missing' => 'MediaWikiの既存インストールを検出しました。
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\92ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81次ã\81®è¡\8cã\82\92LocalSettings.phpの末尾に挿入してください:
+       'config-upgrade-key-missing' => 'MediaWiki が既にインストールされていることを検出しました。
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\82\82ã\81®ã\82\92ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\99ã\82\8bã\81\9fã\82\81ã\81«ã\80\81以ä¸\8bã\81®è¡\8cã\82\92 LocalSettings.php の末尾に挿入してください:
 
 $1',
-       'config-localsettings-incomplete' => '現在のLocalSettings.phpは不完全であるようです。
-変数$1が設定されていません。
-LocalSettings.phpを変更してこの変数を設定して、『{{int:Config-continue}}』を押してください。',
-       'config-session-error' => 'セッションの開始エラー$1',
+       'config-localsettings-incomplete' => '既存の LocalSettings.php の内容は不完全のようです。
+変数 $1 が設定されていません。
+LocalSettings.php 内でこの変数を設定して、「{{int:Config-continue}}」をクリックしてください。',
+       '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' => 'あなたの言語:',
        'config-your-language-help' => 'インストール作業に使用する言語を選択してください。',
-       'config-wiki-language' => 'ウィキの言語',
+       'config-wiki-language' => 'ウィキの言語:',
        'config-wiki-language-help' => 'ウィキで主に書き込まれる言語を選択してください。',
-       'config-back' => '←戻る',
+       'config-back' => '← 戻る',
        'config-continue' => '続行 →',
        'config-page-language' => '言語',
-       'config-page-welcome' => 'MediaWikiへようこそ!',
+       'config-page-welcome' => 'MediaWiki へようこそ!',
        'config-page-dbconnect' => 'データベースに接続',
        'config-page-upgrade' => '既存のインストールを更新',
        'config-page-dbsettings' => 'データベースの設定',
        'config-page-name' => '名前',
        'config-page-options' => 'オプション',
        'config-page-install' => 'インストール',
-       'config-page-complete' => '完了',
+       'config-page-complete' => '完了!',
        'config-page-restart' => 'インストールを再起動',
        'config-page-readme' => 'お読みください',
        'config-page-releasenotes' => 'リリースノート',
@@ -9583,16 +9783,16 @@ MediaWikiのインストールはできません。',
 しかし、MediaWikiには PHP $2 以上が必要です。',
        '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正規化に関するページ]をお読みください。",
+       'config-unicode-pure-php-warning' => "'''警告''': Unicode 正規化の処理に [http://pecl.php.net/intl intl PECL 拡張機能]を利用できないため、処理が遅いピュア PHP の実装を代わりに使用しています。
+高トラフィックのサイトを運営する場合は、[//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にデータベースドライバをインストールする必要があります。
-次の種類のデータベースが使用できます: $1
+       'config-no-db' => '適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。
+以下の種類のデータベースに対応しています: $1
 
\85±æ\9c\89ã\82µã\83¼ã\83\90ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81ã\82µã\83¼ã\83\90ã\81®ç®¡ç\90\86è\80\85ã\81«é\81©å\88\87ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\83\89ã\83©ã\82¤ã\83\90ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\92依頼してください。
-PHPを自分でコンパイルした場合は、たとえば<code>./configure --with-mysql</code>を実行して、データベースクライアントを使用可能に再設定してください。
-DebianまたはUbuntuのパッケージからPHPをインストールした場合は、php5-mysqlモジュールもインストールする必要があります。',
\85±æ\9c\89ã\82µã\83¼ã\83\90ã\83¼ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81é\81©å\88\87ã\81ªã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ ã\83\89ã\83©ã\82¤ã\83\90ã\83¼ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\82\92ã\80\81ã\82µã\83¼ã\83\90ã\83¼ã\81®ç®¡ç\90\86è\80\85ã\81«依頼してください。
+PHP を自分でコンパイルした場合は、例えば <code>./configure --with-mysql</code> を実行して、データベース クライアントを使用できるように再設定してください。
+Debian または Ubuntu のパッケージから PHP をインストールした場合は、php5-mysql モジュールもインストールする必要があります。',
        'config-no-fts3' => "'''警告''':SQLiteは[//sqlite.org/fts3.html FTS3]モジュールなしでコンパイルされており、検索機能はこのバックエンドで利用不可能になります。",
        'config-register-globals' => "'''警告:PHPの<code>[http://php.net/register_globals register_globals]</code>オプションが有効になっています。'''
 '''可能なら無効化してください。'''
@@ -9616,18 +9816,18 @@ MediaWikiは、このモジュールの関数を必要としているため、
 Mandrakeを実行している場合、php-xmlパッケージをインストールしてください。',
        'config-pcre' => 'PCREをサポートしているモジュールが不足しているようです。
 MediaWikiは、Perl互換の正規表現関数の動作が必要です。',
-       'config-pcre-no-utf8' => "'''致命的エラー''': PHPのPCREがPCRE_UTF8サポート無しでコンパイルされています。
-MediaWikiにはUTF-8サポートの関数が必要です。",
+       'config-pcre-no-utf8' => "'''致命的エラー''': PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。
+MediaWiki を正しく動作させるには、UTF-8 対応が必要です。",
        'config-memory-raised' => 'PHPの<code>memory_limit</code>は$1で、$2に引き上げられました。',
        'config-memory-bad' => "'''警告:'''PHPの<code>memory_limit</code>は$1です。
 これは、非常に遅い可能性があります。
 インストールが失敗するかもしれません!",
-       'config-xcache' => '[http://xcache.lighttpd.net/ XCache]がインストール済み',
-       'config-apc' => '[http://www.php.net/apc APC]がインストール済み',
-       'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache]がインストール済み',
-       'config-no-cache' => "'''è­¦å\91\8aï¼\9a'''[http://www.php.net/apc APC]ã\80\81[http://xcache.lighttpd.net/ XCache]ã\81\82ã\82\8bã\81\84ã\81¯[http://www.iis.net/download/WinCacheForPhp WinCache]のいずれも見つかりませんでした。
+       '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' => "'''è­¦å\91\8aï¼\9a'''[http://www.php.net/apc APC]ã\80\81[http://xcache.lighttpd.net/ XCache]ã\80\81[http://www.iis.net/download/WinCacheForPhp WinCache] のいずれも見つかりませんでした。
 オブジェクトのキャッシュは有効化されません。",
-       'config-diff3-bad' => 'GNU diff3が見つかりません。',
+       'config-diff3-bad' => 'GNU diff3 が見つかりません。',
        'config-imagemagick' => 'ImageMagickが見つかりました:<code>$1</code>。
 アップロードが有効なら、画像のサムネイルが利用できます。',
        'config-gd' => 'GD画像ライブラリが内蔵されていることが確認されました。
@@ -9637,9 +9837,9 @@ 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-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データが破損する可能性があります。
 PHPを5.2.9かそれ以降のバージョンに、libxml2を2.7.3かそれ以降のバージョンにアップグレードしてください([//bugs.php.net/bug.php?id=45996 PHPでのバグ情報])。
 インストールを終了します。',
@@ -9647,8 +9847,8 @@ PHPを5.2.9かそれ以降のバージョンに、libxml2を2.7.3かそれ以降
 PHP5.3.2以降に更新するか、この([//bugs.php.net/bug.php?id=50394 PHPに提出されたバグ])を修正するためにPHP5.3.0へ戻してください。
 インストールは中止されました。',
        '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-type' => 'データベースの種類:',
+       'config-db-host' => 'データベースのホスト:',
        'config-db-host-help' => '異なるサーバー上にデータベースサーバーがある場合、ホスト名またはIPアドレスをここに入力してください。
 
 もし、共有されたウェブホスティングを使用している場合、ホスティングプロバイダーは正確なホスト名を解説しているはずです。
@@ -9656,18 +9856,18 @@ PHP5.3.2以降に更新するか、この([//bugs.php.net/bug.php?id=50394 PHP
 WindowsでMySQLを使用している場合に、「localhost」は、サーバー名としてはうまく働かないでしょう。もしそのような場合は、ローカルIPアドレスとして「127.0.0.1」を試してみてください。
 
 PostgreSQLを使用している場合、UNIXソケットで接続するにはこの欄を空欄のままにしてください。',
-       'config-db-host-oracle' => 'データベースTNS:',
+       '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' => 'ã\81\93ã\81®ã\82¦ã\82£ã\82­ã\82\92è­\98å\88¥',
-       'config-db-name' => 'データベース名',
+       'config-db-wiki-settings' => 'ã\81\93ã\81®ã\82¦ã\82£ã\82­ã\81®è­\98å\88¥æ\83\85å ±',
+       'config-db-name' => 'データベース名:',
        'config-db-name-help' => 'このウィキを識別する名前を入力してください。
 空白を含めることはできません。
 
 共有ウェブホストを利用している場合、ホスティングプロバイダーが特定の使用可能なデータベース名を提供するか、あるいは管理パネルからデータベースを作成できるようにしているでしょう。',
-       'config-db-name-oracle' => 'データベースのスキーマ',
-       'config-db-install-account' => 'ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81®ã\81\9fã\82\81ã\81®利用者アカウント',
-       'config-db-username' => 'データベースの利用者名:',
-       'config-db-password' => 'データベースのパスワード',
+       'config-db-name-oracle' => 'データベースのスキーマ:',
+       'config-db-install-account' => 'ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81§ä½¿ç\94¨ã\81\99ã\82\8b利用者アカウント',
+       'config-db-username' => 'データベースのユーザー名:',
+       'config-db-password' => 'データベースのパスワード:',
        'config-db-password-empty' => '新しいデータベースの利用者名 $1 のパスワードを入力してください。
 パスワードを設定しないでユーザを作ることもできるかもしれませんが、安全ではありません。',
        'config-db-install-username' => 'インストール中にデータベースに接続するために使うユーザ名を入力してください。これは MediaWiki アカウントのユーザ名 (利用者名) のことではありません。あなたのデータベースでのユーザ名です。',
@@ -9677,62 +9877,63 @@ PostgreSQLを使用している場合、UNIXソケットで接続するにはこ
        'config-db-wiki-account' => 'インストール作業終了後の利用者アカウント',
        'config-db-wiki-help' => '通常のウィキ操作中にデータベースへの接続する時に利用する利用者名とパスワードを入力してください。
 アカウントが存在せず、インストールのアカウントに十分な権限がある場合は、この利用者アカウントは、ウィキを操作する上で最小限の権限を持った状態で作成されます。',
-       'config-db-prefix' => 'データベーステーブルの接頭辞:',
+       'config-db-prefix' => 'データベース テーブルの接頭辞:',
        'config-db-prefix-help' => 'データベースを複数のウィキ間、あるいはMediaWikiと他のウェブアプリケーションで共有する必要がある場合、衝突を避けるために、すべてのテーブル名に接頭辞を付ける必要があります。
 空白は使用できません。
 
 このフィールドは、通常は空のままです。',
        'config-db-charset' => 'データベースの文字セット',
-       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0バイナリ',
+       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 バイナリ',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
-       '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形式より効率的で、Unicode文字の全範囲を利用できるようになります。
-'''UTF-8形式'''では、MySQLは、データ内でどの文字集合を使用しているかを知っていて、それに対して適切な提示と変換をするでしょうが、
-[//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' => 'データベースポート:',
-       'config-db-schema' => 'メディアウィキの図式',
-       'config-db-schema-help' => '上の図式は常に正確です。
-必要である場合のみ、変更してください。',
-       'config-sqlite-dir' => 'SQLiteのデータディレクトリ:',
-       'config-sqlite-dir-help' => "SQLiteは単一のファイル内にすべてのデータを保持しています。
-
-指定したディレクトリは、インストール時にウェブサーバーが書き込める必要があります。
-
-このディレクトリはウェブからアクセス'''不可能'''である必要があります。これがPHPファイルがある場所に配置できない理由です。
-
-インストーラーは同時に<code>.htaccess</code>ファイルに書き込みます。しかし、これが失敗しても誰かがあなたの生のデータベースにアクセスすることが可能となるでしょう。データベースは生のデータ(メールアドレス、パスワードのハッシュ値)の他、削除された版、その他、ウィキ上の制限されているデータを含んでいます。
-
-例えば<code>/var/lib/mediawiki/yourwiki</code>のように、別の場所にデータベースを配置することを検討してください。",
-       'config-oracle-def-ts' => '既定のテーブル領域:',
-       'config-oracle-temp-ts' => '一時的なテーブル領域:',
+       '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 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。
+'''UTF-8 モード'''では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、
+[//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 以降が必要です。ご使用中の MySQL は $2 です。',
+       'config-db-port' => 'データベースのポート:',
+       'config-db-schema' => 'MediaWiki のスキーマ:',
+       'config-db-schema-help' => '通常はこのスキーマで問題ありません。
+必要な場合のみ変更してください。',
+       'config-sqlite-dir' => 'SQLite データ ディレクトリ:',
+       'config-sqlite-dir-help' => "SQLite は単一のファイル内にすべてのデータを格納しています。
+
+指定したディレクトリは、インストール時にウェブ サーバーが書き込めるようにしておく必要があります。
+
+このディレクトリはウェブからアクセス'''不可能'''である必要があります。PHP ファイルがある場所には配置できないのはこのためです。
+
+インストーラーは <code>.htaccess</code> ファイルにも書き込みます。しかし、これが失敗した場合は、誰かが生のデータベースにアクセスできてしまいます。
+データベースは、生のデータ (メールアドレス、パスワードのハッシュ値) の他、削除された版、その他ウィキ上の制限されているデータを含んでいます。
+
+例えば <code>/var/lib/mediawiki/yourwiki</code> のように、別の場所にデータベースを配置することを検討してください。",
+       'config-oracle-def-ts' => '既定のテーブル領域:',
+       'config-oracle-temp-ts' => '一時的なテーブル領域:',
        'config-type-mysql' => 'MySQL',
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
        'config-type-oracle' => 'Oracle',
        'config-type-ibm_db2' => 'IBM DB2',
-       'config-support-info' => 'メディアウィキは次のようなデータベースシステムをサポートする:
+       'config-support-info' => 'MediaWiki は以下のデータベース システムに対応しています:
 
 $1
 
-もし、データベースシステムが不可視であるならば、以下のようにリスト化されたものを使用してみてください。可能なサポートの指示に従ってください。',
+使用しようとしているデータベース システムが下記の一覧にない場合は、上記リンク先の手順に従ってインストールしてください。',
        'config-support-mysql' => '* $1はMediaWikiの主要な対象で、もっともサポートされています([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' => 'Oracleの設定',
-       'config-header-ibm_db2' => 'IBM DB2の設定',
+       'config-header-mysql' => 'MySQL の設定',
+       'config-header-postgres' => 'PostgreSQL の設定',
+       'config-header-sqlite' => 'SQLite の設定',
+       'config-header-oracle' => 'Oracle の設定',
+       'config-header-ibm_db2' => 'IBM DB2 の設定',
        'config-invalid-db-type' => '無効なデータベースの種類',
-       'config-missing-db-name' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8dã\80\8dã\82\92å\85¥å\8a\9bã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99',
-       'config-missing-db-host' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83\9bã\82¹ã\83\88ã\80\8dã\82\92å\85¥å\8a\9bã\81\99ã\82\8bå¿\85è¦\81ã\81\8cã\81\82ã\82\8aã\81¾ã\81\99',
-       'config-missing-db-server-oracle' => '「データベースTNS」に値を入力する必要があります',
+       'config-missing-db-name' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹å\90\8dã\80\8dã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84',
+       'config-missing-db-host' => 'ã\80\8cã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81®ã\83\9bã\82¹ã\83\88ã\80\8dã\82\92å\85¥å\8a\9bã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84',
+       'config-missing-db-server-oracle' => '「データベース TNS」の値を入力してください',
        'config-invalid-db-server-oracle' => '「$1」は無効なデータベース TNS です。
 アスキー英字(a-z、A-Z)、数字(0-9)、アンダーバー(_)、ドット(.)のみを使用してください。',
        'config-invalid-db-name' => '「$1」は無効なデータベース名です。
@@ -9742,43 +9943,43 @@ $1
        'config-connection-error' => '$1。
 
 以下のホスト名、ユーザ名、パスワードをチェックして、再度試してみてください。',
-       'config-invalid-schema' => 'ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\80\8c$1ã\80\8dã\81«ã\81\8aã\81\91ã\82\8bç\84¡å\8a¹ã\81ªå\9b³å¼\8fです。
-アスキー英字(a-z、A-Z)、数字(0-9)、下線(_)のみを使用してください。',
-       'config-postgres-old' => 'PostgreSQLの$1あるいはそれ以降が必要で、いまのバージョンは$2です。',
+       'config-invalid-schema' => 'ã\80\8c$1ã\80\8dã\81¯ MediaWiki ã\81®ã\82¹ã\82­ã\83¼ã\83\9eã\81¨ã\81\97ã\81¦ç\84¡å\8a¹です。
+ASCII の英数字 (a-z、A-Z、0-9)、下線 (_) のみを使用してください。',
+       'config-postgres-old' => 'PostgreSQL $1 以降が必要です。ご使用中の PostgreSQL は $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' => 'データ ディレクトリ <code><nowiki>$1</nowiki></code> を作成できません。ウェブ サーバーは親ディレクトリ <code><nowiki>$2</nowiki></code> に書き込めませんでした。
 
\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®ユーザーを特定しました。
-続行するには、<code><nowiki>$3</nowiki></code>ディレクトリを書き込み可能にしてください。
-UnixあるいはLinux上では、以下を実行してください:
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81¯ã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81®å®\9fè¡\8cユーザーを特定しました。
+続行するには、ディレクトリ <code><nowiki>$3</nowiki></code> に書き込めるようにしてください。
+Unix または Linux であれば、以下を実行してください:
 
 <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>は、ウェブサーバから書き込みできませんでした。
+       'config-sqlite-parent-unwritable-nogroup' => 'データ ディレクトリ <code><nowiki>$1</nowiki></code> を作成できません。ウェブ サーバーは、親ディレクトリ <code><nowiki>$2</nowiki></code> に書き込めませんでした。
 
\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ã\81®ユーザーを特定できませんでした。
-続行するには、<code><nowiki>$3</nowiki></code>ディレクトリを、ウェブサーバ(と他のユーザ!)からグローバルに書き込めるようにしてください。
-UnixあるいはLinux上では、以下を実行してください:
\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\83¼ã\81¯ã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81®å®\9fè¡\8cユーザーを特定できませんでした。
+続行するには、ディレクトリ <code><nowiki>$3</nowiki></code> に、ウェブ サーバー (と、あらゆる人々!) がグローバルに書き込めるようにしてください。
+Unix または Linux では、以下を実行してください:
 
 <pre>cd $2
 mkdir $3
 chmod a+w $3</pre>',
-       'config-sqlite-mkdir-error' => 'データディレクトリ「$1」の作成中にエラーが発生しました。
+       'config-sqlite-mkdir-error' => 'データ ディレクトリ「$1」を作成する際にエラーが発生しました。
 場所を確認してから、再度試してください。',
        'config-sqlite-dir-unwritable' => 'ディレクトリ「$1」に書き込めません。
-ウェブサーバーが書き込めるようにパーミッションを変更してから、度試してください。',
+ウェブ サーバーが書き込めるようにパーミッションを変更してから、再度試してください。',
        'config-sqlite-connection-error' => '$1。
 
-下記のデータディレクトリとデータベース名を確認してから、再度試してみてください。',
-       'config-sqlite-readonly' => 'ファイル<code>$1</code>は書き込み不能です。',
-       'config-sqlite-cant-create-db' => 'データベースファイル<code>$1</code>を作成できませんでした。',
-       'config-sqlite-fts3-downgrade' => 'PHPはFTS3のサポート、テーブルのダウングレードが無効です。',
-       'config-can-upgrade' => 'ã\81\93ã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\81¯ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\83\86ã\83¼ã\83\96ã\83«ã\81\8cå­\98å\9c¨ã\81\97ます。
\81\9dã\82\8cã\82\89ã\82\92ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­$1ã\81«ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\99ã\82\8bã\81\9fã\82\81ã\81«「続行」をクリックしてください。',
+データ ディレクトリおよびデータベース名を確認してから、再度試してください。',
+       'config-sqlite-readonly' => 'ファイル <code>$1</code> に書き込めません。',
+       'config-sqlite-cant-create-db' => 'データベース ファイル <code>$1</code> を作成できませんでした。',
+       'config-sqlite-fts3-downgrade' => 'PHP が FTS3 に対応していないため、テーブルをダウングレードしています',
+       'config-can-upgrade' => 'ã\81\93ã\81®ã\83\87ã\83¼ã\82¿ã\83\99ã\83¼ã\82¹ã\81«ã\81¯ã\80\80MediaWiki ã\83\86ã\83¼ã\83\96ã\83«ã\81\8cã\81\82ã\82\8aます。
\81\93ã\82\8cã\82\89ã\81®ã\83\86ã\83¼ã\83\96ã\83«ã\82\92 MediaWiki $1 ã\81«ã\82¢ã\83\83ã\83\97ã\82°ã\83¬ã\83¼ã\83\89ã\81\99ã\82\8bã\81«ã\81¯ã\80\81「続行」をクリックしてください。',
        'config-upgrade-done' => "更新は完了しました。
 
 [$1 ウィキを使い始める]ことができます。
@@ -9792,12 +9993,12 @@ chmod a+w $3</pre>',
        '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-help' => 'ウィキの通常の操作の際に、ウェブ サーバーがデータベース サーバーに接続できるように、ユーザー名とパスワードを指定してください。',
+       'config-db-web-account-same' => 'インストール作業と同じアカウントを使用する',
+       'config-db-web-create' => 'アカウントが存在しない場合は作成する',
        'config-db-web-no-create-privs' => 'あなたがインストールのために定義したアカウントは、アカウント作成のための特権としては不充分です。
 あなたがここで指定したアカウントは既に存在している必要があります。',
-       'config-mysql-engine' => 'ストレージエンジン:',
+       'config-mysql-engine' => 'ストレージ エンジン:',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
        'config-mysql-engine-help' => "'''InnoDB'''は、並行処理のサポートに優れているので、ほとんどの場合において最良の選択肢です。
@@ -9807,29 +10008,29 @@ chmod a+w $3</pre>',
        'config-mysql-charset' => 'データベースの文字セット:',
        'config-mysql-binary' => 'バイナリ',
        'config-mysql-utf8' => 'UTF-8',
-       'config-mysql-charset-help' => "'''バイナリー形式'''では、MediaWikiは、UTF-8テキストを、データベースのバイナリーフィールドに格納します。
-これは、MySQLのUTF-8形式より効率的で、Unicode文字の全範囲を利用できるようになります。
+       'config-mysql-charset-help' => "'''バイナリ モード'''では、MediaWiki は、UTF-8 テキストをデータベースのバイナリ フィールドに格納します。
+これは、MySQL の UTF-8 モードより効率的で、Unicode 文字の全範囲を利用できるようになります。
 
-'''UTF-8形式'''では、MySQLは、データ内でどの文字集合を使用しているかを知っていて、それに対して適切な提示と変換をするでしょうが、
-[//ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E5%A4%9A%E8%A8%80%E8%AA%9E%E9%9D%A2 å\9fºæ\9c¬å¤\9aè¨\80èª\9eé\9d¢]ã\81®å¤\96ã\81«ã\81\82ã\82\8bæ\96\87å­\97ã\82\92æ ¼ç´\8dã\81§ã\81\8dã\82\8bã\82\88ã\81\86ã\81«ã\81¯ã\81ªã\82\8aã\81¾ã\81\9bã\82\93ã\80\82",
-       'config-site-name' => 'ウィキの名前:',
+'''UTF-8 モード'''では、MySQL は、データ内で使用している文字集合を知っているため、適切に表現や変換ができますが、
+[//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' => 'この事象はブラウザーのタイトルバーと他のさまざまな場所に現れる。',
        'config-site-name-blank' => 'サイト名を入力してください。',
-       'config-project-namespace' => 'プロジェクト名前空間',
+       'config-project-namespace' => 'プロジェクト名前空間:',
        'config-ns-generic' => 'プロジェクト',
-       'config-ns-site-name' => 'ウィキ名と同じ$1',
-       'config-ns-other' => 'その他(指定してください)',
+       'config-ns-site-name' => 'ウィキ名と同じ$1',
+       'config-ns-other' => 'その他 (指定してください)',
        'config-ns-other-default' => 'マイウィキ',
        'config-project-namespace-help' => "ウィキペディアの例に従い、多くのウィキは、コンテンツのページとは分離したポリシーページを「'''プロジェクトの名前空間'''」に持っています。
 この名前空間のページのタイトルはすべて、ある接頭辞で始まります。それをここで指定することができます。
-この接頭辞はウィキの名前に由来するのが伝統的ですが、「#」や「:」のような区切り記号を含めることはできません。",
+この接頭辞はウィキの名前に由来するのが伝統的ですが、「#」や「:」のような区切り文字を含めることはできません。",
        'config-ns-invalid' => '"<nowiki>$1</nowiki>"のように指定された名前空間は無効です。
 違うプロジェクト名前空間を指定してください。',
        'config-admin-box' => '管理アカウント',
-       'config-admin-name' => '名前',
-       'config-admin-password' => 'パスワード',
-       'config-admin-password-confirm' => 'パスワードの再入力',
-       'config-admin-help' => 'ここにあなたの希望するユーザ名を入力してください(例えば"Joe Bloggs"など)
+       'config-admin-name' => '名前:',
+       'config-admin-password' => 'パスワード:',
+       'config-admin-password-confirm' => 'パスワードの再入力:',
+       'config-admin-help' => '希望するユーザー名をここに入力してください (例: "Joe Bloggs")
 この名前でこのウィキにログインすることになります。',
        'config-admin-name-blank' => '管理者のユーザ名を入力してください。',
        'config-admin-name-invalid' => '指定されたユーザ名 "<nowiki>$1</nowiki>" は無効です。
@@ -9837,7 +10038,7 @@ chmod a+w $3</pre>',
        'config-admin-password-blank' => '管理者アカウントのパスワードを入力してください。',
        'config-admin-password-same' => 'ユーザ名と同じパスワードは使えません。',
        'config-admin-password-mismatch' => '入力された2つのパスワードが一致しません。',
-       'config-admin-email' => 'メールアドレス',
+       'config-admin-email' => 'メールアドレス:',
        'config-admin-email-help' => 'メールアドレスを入力してください。他の利用者からのメールの受け取り、パスワードのリセット、ウォッチリストに登録したページの更新通知に使用します。空欄のままにすることもできます。',
        'config-admin-error-user' => '"<nowiki>$1</nowiki>"という名前の管理者を作成する際に内部エラーが発生しました。',
        'config-admin-error-password' => '管理者"<nowiki>$1</nowiki>"のパスワードを設定する際に内部エラーが発生しました: <pre>$2</pre>',
@@ -9848,7 +10049,7 @@ chmod a+w $3</pre>',
 残りの設定を飛ばして、今すぐにウィキをインストールできます。',
        'config-optional-continue' => '私にもっと質問してください。',
        'config-optional-skip' => 'もう飽きてしまったので、とにかくウィキをインストールしてください。',
-       'config-profile' => '正しいプロフィールのユーザ:',
+       'config-profile' => '利用者権限のプロファイル:',
        'config-profile-wiki' => '伝統的なウィキ',
        'config-profile-no-anon' => 'アカウントの作成が必要',
        'config-profile-fishbowl' => '承認された編集者のみ',
@@ -9871,7 +10072,7 @@ MediaWikiでは、最近の更新を確認し、神経質な、もしくは悪
        'config-license-cc-by-sa' => 'クリエイティブ・コモンズ 表示-継承',
        'config-license-cc-by' => 'クリエイティブ・コモンズ 表示',
        'config-license-cc-by-nc-sa' => 'クリエイティブ・コモンズ 表示-非営利-継承',
-       'config-license-gfdl' => 'GNUフリー文書利用許諾契約書1.3以降',
+       'config-license-gfdl' => 'GNU フリー文書利用許諾契約書 1.3 以降',
        'config-license-pd' => 'パブリック・ドメイン',
        'config-license-cc-choose' => 'その他のクリエイティブ・コモンズ・ライセンスを選択する',
        'config-license-help' => "多くの公開ウィキでは、すべての寄稿物が[http://freedomdefined.org/Definition フリーライセンス]の元に置かれています。
@@ -9897,40 +10098,40 @@ GFDL は有効なライセンスですが、内容を理解するのは困難で
        'config-email-auth-help' => "この選択肢を有効にすると、利用者がメールアドレスを設定あるいは変更したときに送信されるリンクにより、そのアドレスを確認しなければならなくなります。
 認証済みのアドレスだけが、他の利用者からのメールや、変更通知のメールを受け取ることができます。
 公開ウィキでは、メール機能による潜在的な不正利用の防止のため、この選択肢を設定することが'''推奨'''されます。",
-       'config-email-sender' => '返信メールアドレス:',
+       'config-email-sender' => '返信先メールアドレス:',
        'config-email-sender-help' => '送信メールで返信先として使用するメールアドレスを入力してください。
 このアドレスは、宛先不明の場合の通知の宛先になります。
 多くのメールサーバーでは、少なくともドメイン名部分は有効である必要があります。',
        'config-upload-settings' => '画像およびファイルのアップロード',
        'config-upload-enable' => 'ファイルのアップロードを有効にする',
-       'config-upload-help' => 'ファイルのアップロードは潜在的にあなたのサーバにセキュリティ上の危険をさらします。
-更なる情報のために、マニュアルの[//www.mediawiki.org/wiki/Manual:Security security section] を読むことをすすめます
+       'config-upload-help' => 'ファイルのアップロードは、あなたのサーバーをセキュリティ上の潜在的な危険に晒します。
+この詳細は、マニュアルの [//www.mediawiki.org/wiki/Manual:Security security section] をお読みください
 
\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¯そこに書き込めるようになります。
\83\95ã\82¡ã\82¤ã\83«ã\81®ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\82\92æ\9c\89å\8a¹ã\81«ã\81\99ã\82\8bã\81«ã\81¯ã\80\81MediaWiki ã\81®ã\83«ã\83¼ã\83\88 ã\83\87ã\82£ã\83¬ã\82¯ã\83\88ã\83ªå\86\85ã\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\93ã\82\8cã\81«ã\82\88ã\82\8aã\80\81ã\82¦ã\82§ã\83\96 ã\82µã\83¼ã\83\90ã\83¼ã\81\8cそこに書き込めるようになります。
 そして、このオプションを有効にしてください。',
        'config-upload-deleted' => '削除されたファイルのためのディレクトリ:',
        'config-upload-deleted-help' => '削除されるファイルを保存するためのディレクトリを選択してください。
 これがウェブからアクセスできないことが理想です。',
-       'config-logo' => 'ロゴのURL:',
+       'config-logo' => 'ロゴ のURL:',
        'config-logo-help' => 'MediaWikiの既定の外装では、サイドバー上部に135x160ピクセルのロゴ用の余白があります。
 適切なサイズの画像をアップロードして、そのURLをここに入力してください。
 
 ロゴが不要の場合は、このボックスを空白のままにしてください。',
-       'config-instantcommons' => 'InstantCommons機能を有効にする',
+       'config-instantcommons' => 'Instant Commons 機能を有効にする',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons InstantCommons]は、[//commons.wikimedia.org/ ウィキメディア・コモンズ]のサイトで見つかった画像や音声、その他のメディアをウィキ上で利用することができるようになる機能です。
 これを有効化するには、MediaWikiはインターネットに接続できなければなりません。
 
-ウィキメディアコモンズ以外のウィキを同じように設定する方法など、この機能に関する詳細な情報は、[//mediawiki.org/wiki/Manual:$wgForeignFileRepos マニュアル]をご覧ください。',
\82¦ã\82£ã\82­ã\83¡ã\83\87ã\82£ã\82¢ã\83»ã\82³ã\83¢ã\83³ã\82ºä»¥å¤\96ã\81®ã\82¦ã\82£ã\82­ã\82\92å\90\8cã\81\98ã\82\88ã\81\86ã\81«è¨­å®\9aã\81\99ã\82\8bæ\96¹æ³\95ã\81ªã\81©ã\80\81ã\81\93ã\81®æ©\9fè\83½ã\81«é\96¢ã\81\99ã\82\8b詳細ã\81ªæ\83\85å ±ã\81¯ã\80\81[//mediawiki.org/wiki/Manual:$wgForeignFileRepos ã\83\9eã\83\8bã\83¥ã\82¢ã\83«]ã\82\92ã\81\94覧ã\81\8fã\81 ã\81\95ã\81\84ã\80\82',
        'config-cc-error' => 'クリエイティブ・コモンズ・ライセンスの選択器から結果が得られませんでした。
 ライセンスの名前を手動で入力してください。',
        'config-cc-again' => 'もう一度選択してください...',
-       'config-cc-not-chosen' => 'あなたの求めるクリエイティブコモンズのライセンスを選んで、"続行"をクリックしてください。',
+       'config-cc-not-chosen' => '希望するクリエイティブ・コモンズのライセンスを選択して、「続行」をクリックしてください。',
        'config-advanced-settings' => '高度な設定',
        'config-cache-options' => 'オブジェクトのキャッシュの設定:',
-       'config-cache-help' => 'ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81¯ã\80\81使ç\94¨ã\81\97ã\81\9fã\83\87ã\83¼ã\82¿ã\82\92é »ç¹\81ã\81«ã\82­ã\83£ã\83\83ã\82·ã\83³ã\82°ã\81\99ã\82\8bã\81\93ã\81¨ã\81«ã\82\88ã\81£ã\81¦ã\80\81ã\83¡ã\83\87ã\82£ã\82¢ã\82¦ã\82£ã\82­ã\81®ã\82¹ã\83\94ã\83¼ã\83\89æ\94¹å\96\84ã\81«ä½¿ç\94¨ã\81\95ã\82\8cます。
-中〜大サイトにおいては、これを有効にするために大変望ましいことです。また小さなサイトにおいても同様な利点をもたらすと考えられます。',
+       'config-cache-help' => 'ã\82ªã\83\96ã\82¸ã\82§ã\82¯ã\83\88ã\81®ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\82\92使ç\94¨ã\81\99ã\82\8bã\81¨ã\80\81é »ç¹\81ã\81«ä½¿ç\94¨ã\81\99ã\82\8bã\83\87ã\83¼ã\82¿ã\82\92ã\82­ã\83£ã\83\83ã\82·ã\83¥ã\81\99ã\82\8bã\81\9fã\82\81 MediaWiki ã\81®å\8b\95ä½\9cé\80\9f度ã\82\92æ\94¹å\96\84ã\81§ã\81\8dます。
+中〜大規模サイトではこれを有効にすることを強くお勧めします。小規模サイトでも同様に効果があります。',
        'config-cache-none' => 'キャッシングしない(機能は取り払われます、しかもより大きなウィキサイト上でスピードの問題が発生します)',
-       'config-cache-accel' => 'PHPオブジェクトキャッシング(APC、XCacheあるいはWinCache)',
+       'config-cache-accel' => 'PHP オブジェクト キャッシュ (APC、XCache、WinCache のいずれか)',
        'config-cache-memcached' => 'Memcachedを使用(追加の設定が必要です)',
        'config-memcached-servers' => 'メモリをキャッシュされたサーバ:',
        'config-memcached-help' => 'Memcachedを使用するIPアドレスの一覧。
@@ -9943,31 +10144,37 @@ GFDL は有効なライセンスですが、内容を理解するのは困難で
 これらは更に多くの設定を要求するかもしれませんが、今これらを有効にすることができます。',
        'config-install-alreadydone' => "'''警告:''' 既にMediaWikiがインストール済みで、再びインストールし直そうとしています。
 次のページへ進んでください。",
-       'config-install-begin' => '「{{int:config-continue}}」を押すと、MediaWikiのインストールを開始することができます。
-å¤\89æ\9b´ã\81\97ã\81\9fã\81\84設å®\9aã\81\8cã\81\82ã\82\8cã\81°、「{{int:Config-back}}」を押してください。',
+       'config-install-begin' => '「{{int:config-continue}}」を押すと、MediaWiki のインストールを開始できます。
+å¤\89æ\9b´ã\81\97ã\81\9fã\81\84設å®\9aã\81\8cã\81\82ã\82\8bå ´å\90\88ã\81¯、「{{int:Config-back}}」を押してください。',
        'config-install-step-done' => '実行',
        '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-schema-failed' => 'ã\83\86ã\83¼ã\83\96ã\83«ã\81®ä½\9cæ\88\90ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
+利用者「$1」がスキーマ「$2」に書き込めるようにしてください。',
        'config-install-pg-commit' => '変更を送信',
-       'config-install-user' => 'データベースユーザを作成する',
-       'config-install-user-grant-failed' => 'ユーザー「$1」に許可を与えることに失敗しました。:$2',
+       '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' => "'''警告''':MediaWikiテーブルは既に存在するようです。
 作成を飛ばします。",
-       'config-install-tables-failed' => "'''エラー''':テーブルの作成が、次のエラーにより失敗しました:$1",
-       'config-install-interwiki' => 'æ\97¢å®\9aã\81®ã\82¦ã\82£ã\82­é\96\93ã\83\86ã\83¼ã\83\96ã\83«ã\82\92å°\8eå\85¥ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99',
-       'config-install-interwiki-list' => 'ファイル<code>interwiki.list</code>を見つけることができませんでした。',
+       'config-install-tables-failed' => "'''エラー''': テーブルの作成が、以下のエラーにより失敗しました: $1",
+       'config-install-interwiki' => 'æ\97¢å®\9aã\81®ã\82¦ã\82£ã\82­é\96\93ã\83\86ã\83¼ã\83\96ã\83«ã\81®å°\8eå\85¥',
+       'config-install-interwiki-list' => 'ファイル <code>interwiki.list</code> から読み取れませんでした。',
        'config-install-interwiki-exists' => "'''警告''':ウィキ間テーブルは既に登録されているようです。
 既定のテーブルを無視します。",
-       'config-install-keys' => '秘密鍵を生成する',
-       'config-install-sysop' => '管理者のユーザーアカウントを作成する',
-       'config-install-mainpage' => '既定の接続でメインページを作成',
-       'config-install-mainpage-failed' => 'メインページを挿入できませんでした:$1',
+       'config-install-stats' => '統計情報の初期化',
+       'config-install-keys' => '秘密鍵の生成',
+       'config-install-sysop' => '管理者のアカウントの作成',
+       'config-install-mainpage' => 'メインページを既定の内容で作成',
+       'config-install-mainpage-failed' => 'メインページを挿入できませんでした: $1',
        'config-install-done' => "'''おめでとうございます!'''
 MediaWikiのインストールに成功しました。
 
@@ -9983,7 +10190,7 @@ $3
 '''注意''': もし、これを今しなければ、つまり、このファイルをダウンロードせずインストールを終了した場合、この生成された設定ファイルは利用されません。
 
 それを完了すれば、'''[$2 ウィキに入る]'''ことができます。",
-       'config-download-localsettings' => 'LocalSettings.phpをダウンロード',
+       'config-download-localsettings' => 'LocalSettings.php をダウンロード',
        'config-help' => 'ヘルプ',
        'mainpagetext' => "'''MediaWiki のインストールに成功しました。'''",
        'mainpagedocfooter' => 'ウィキソフトウェアの使い方に関する情報は[//meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。
@@ -10015,7 +10222,8 @@ $messages['jut'] = array(
        'mainpagedocfooter' => "Se vores engelskspråĝede [//meta.wikimedia.org/wiki/MediaWiki_localisation dokumentåsje tilpasnenge'm åf æ brugergrænseflade] og [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide æ brugervejlednenge] før åplysnenger åpsætnenge'm og anvendelse.",
 );
 
-/** Javanese (Basa Jawa) */
+/** Javanese (Basa Jawa)
+ */
 $messages['jv'] = array(
        'mainpagetext' => "'''Prangkat empuk wiki wis suksès dipasang.'''",
        'mainpagedocfooter' => "Mangga maca [//meta.wikimedia.org/wiki/Help:Contents User's Guide] kanggo katrangan luwih langkung prakara panggunan prangkat empuk wiki
@@ -10025,8 +10233,90 @@ $messages['jv'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Milis rilis MediaWiki]",
 );
 
-/** Georgian (ქართული) */
+/** Georgian (ქართული)
+ * @author David1010
+ */
 $messages['ka'] = array(
+       'config-information' => 'ინფორმაცია',
+       'config-your-language' => 'თქვენი ენა:',
+       '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-copying' => 'ლიცენზია',
+       'config-page-upgradedoc' => 'განახლება',
+       'config-restart' => 'დიახ, თავიდან დაიწყეთ',
+       'config-sidebar' => '* [//www.mediawiki.org მედიავიკის ვებ-გვერდი]
+* [//www.mediawiki.org/wiki/Help:Contents/ka მომხმარებლების დახმარება]
+* [//www.mediawiki.org/wiki/Manual:Contents/ka ადმინისტრატორების დახმარება]
+* [//www.mediawiki.org/wiki/Manual:FAQ/ka FAQ]
+----
+* <doclink href=Readme>წამიკითხე</doclink>
+* <doclink href=ReleaseNotes>ინფორმაცია გამოშვებაზე</doclink>
+* <doclink href=Copying>ლიცენზია</doclink>
+* <doclink href=UpgradeDoc>განახლება</doclink>',
+       'config-db-type' => 'მონაცემთა ბაზის ტიპი:',
+       'config-db-host-oracle' => 'მონაცემთა ბაზის TNS:',
+       'config-db-name' => 'მონაცემთა ბაზის სახელი:',
+       'config-db-name-oracle' => 'მონაცემთა ბაზის სქემა:',
+       'config-db-username' => 'მონაცემთა ბაზის მომხმარებლის სახელი:',
+       'config-db-password' => 'მონაცემთა ბაზის პაროლი:',
+       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 ორობითი',
+       'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
+       'config-db-port' => 'მონაცემთა ბაზის პორტი:',
+       'config-db-schema' => 'მედიავიკის სქემა:',
+       'config-header-mysql' => 'MySQL-ის პარამეტრები',
+       'config-header-postgres' => 'PostgreSQL-ის პარამეტრები',
+       'config-header-sqlite' => 'SQLite-ის პარამეტრები',
+       'config-header-oracle' => 'Oracle-ის პარამეტრები',
+       'config-header-ibm_db2' => 'IBM DB2-ის პარამეტრები',
+       'config-invalid-db-type' => 'არასწორი მონაცემთა ბაზის ტიპი',
+       'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
+       'config-mysql-binary' => 'ორობითი',
+       'config-mysql-utf8' => 'UTF-8',
+       'config-site-name' => 'ვიკის სახელი:',
+       '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-name-blank' => 'შეიყვანეთ ადმინისტრატორის მომხმარებლის სახელი.',
+       'config-admin-email' => 'ელ. ფოსტის მისამართი:',
+       'config-profile-wiki' => 'ტრადიციული ვიკი',
+       'config-profile-private' => 'დახურული ვიკი',
+       'config-license' => 'საავტორო უფლები და ლიცენზია:',
+       '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-cc-0' => 'Creative Commons Zero (საზოგადოებრივი საკუთრება)',
+       'config-license-gfdl' => 'GNU Free Documentation License 1.3 ან უფრო გვიანი',
+       'config-license-pd' => 'საზოგადოებრივი საკუთრება',
+       'config-license-cc-choose' => 'აირჩიეთ Creative Commons-ის ლიცენზიიდან ერთ-ერთი',
+       'config-email-settings' => 'ელ. ფოსტის პარამეტრები',
+       'config-upload-settings' => 'სურათებისა და ფაილების ატვირთვა',
+       'config-upload-enable' => 'ფაილების ატვირთვის ჩართვა',
+       'config-logo' => 'ლოგოს URL:',
+       'config-cc-again' => 'აირჩიეთ კიდევ ერთხელ...',
+       'config-extensions' => 'გაფართოებები',
+       'config-install-step-done' => 'შესრულდა',
+       'config-install-step-failed' => 'ვერ მოხერხდა',
+       'config-install-tables' => 'ცხრილების შექმნა',
+       'config-download-localsettings' => 'LocalSettings.php-ის გადმოწერა',
+       'config-help' => 'დახმარება',
        'mainpagetext' => "'''მედიავიკი წარმატებით ჩაიტვირთა.'''",
        'mainpagedocfooter' => 'ვიკი პროგრამის გამოყენების ინფორმაციისთვის იხილეთ [//meta.wikimedia.org/wiki/Help:Contents მომხმარებლის მეგზური].
 
@@ -10037,7 +10327,8 @@ $messages['ka'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce მედიავიკის გამოცემის დაგზავნის სია]',
 );
 
-/** Kara-Kalpak (Qaraqalpaqsha) */
+/** Kara-Kalpak (Qaraqalpaqsha)
+ */
 $messages['kaa'] = array(
        'mainpagetext' => "'''MediaWiki tabıslı ornatıldı.'''",
        'mainpagedocfooter' => "Wiki bag'darlamasın qollanıw haqqındag'i mag'lıwmat usın [//meta.wikimedia.org/wiki/Help:Contents Paydalanıwshılar qollanbasınan] ken'es alın'.
@@ -10082,7 +10373,8 @@ $messages['kiu'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-daena postey]",
 );
 
-/** Kazakh (Arabic script) (‫قازاقشا (تٴوتە)‬) */
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏)
+ */
 $messages['kk-arab'] = array(
        'mainpagetext' => "'''مەدىياۋىيكىي بۋماسى ٴساتتى ورناتىلدى.'''",
        'mainpagedocfooter' => 'ۋىيكىي باعدارلامالىق جاساقتاماسىن قالاي قولداناتىن اقپاراتى ٴۇشىن [//meta.wikimedia.org/wiki/Help:Contents پايدالانۋشىلىق نۇسقاۋلارىنان] كەڭەس الىڭىز.
@@ -10093,7 +10385,8 @@ $messages['kk-arab'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce مەدىياۋىيكىي شىعۋ تۋرالى حات تاراتۋ ٴتىزىمى]',
 );
 
-/** Kazakh (Cyrillic script) (‪Қазақша (кирил)‬) */
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
+ */
 $messages['kk-cyrl'] = array(
        'mainpagetext' => "'''МедиаУики бумасы сәтті орнатылды.'''",
        'mainpagedocfooter' => 'Уики бағдарламалық жасақтамасын қалай қолданатын ақпараты үшін [//meta.wikimedia.org/wiki/Help:Contents Пайдаланушылық нұсқауларынан] кеңес алыңыз.
@@ -10104,7 +10397,8 @@ $messages['kk-cyrl'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаУики шығу туралы хат тарату тізімі]',
 );
 
-/** Kazakh (Latin script) (‪Qazaqşa (latın)‬) */
+/** Kazakh (Latin script) (qazaqşa (latın)‎)
+ */
 $messages['kk-latn'] = array(
        'mainpagetext' => "'''MedïaWïkï bwması sätti ornatıldı.'''",
        'mainpagedocfooter' => 'Wïkï bağdarlamalıq jasaqtamasın qalaý qoldanatın aqparatı üşin [//meta.wikimedia.org/wiki/Help:Contents Paýdalanwşılıq nusqawlarınan] keñes alıñız.
@@ -10145,7 +10439,8 @@ $messages['km'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce បញ្ជី​ពិភាក្សា​ការផ្សព្វផ្សាយ​របស់​មេឌាវិគី]',
 );
 
-/** Kannada (ಕನ್ನಡ) */
+/** Kannada (ಕನ್ನಡ)
+ */
 $messages['kn'] = array(
        'mainpagetext' => "'''ವಿಕಿ ತಂತ್ರಾಂಶವನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಅನುಸ್ಥಾಪಿಸಲಾಯಿತು.'''",
        'mainpagedocfooter' => 'ವಿಕಿ ತಂತ್ರಾಂಶವನ್ನು ಬಳಸುವ ಬಗ್ಗೆ ಮಾಹಿತಿಗೆ [//meta.wikimedia.org/wiki/Help:Contents ಬಳಕೆದಾರರಿಗೆ ನಿರ್ದೇಶನ ಪುಟ] ನೋಡಿ.
@@ -10166,7 +10461,7 @@ $messages['ko'] = array(
        'config-title' => 'MediaWiki $1 설치',
        'config-information' => '정보',
        'config-localsettings-upgrade' => '<code>LocalSettings.php</code> 파일이 감지되었습니다.
\9d´ ì\84¤ì¹\98를 ì\97\85ê·¸ë \88ì\9d´ë\93\9cí\95\98려면 ì\95\84ë\9e\98 ì\83\81ì\9e\90ì\97\90 <code>$wgUpgradeKey</code>ì\9d\98 ê°\92ì\9d\84 ì\9e\85ë ¥í\95´ì£¼세요.
\9d´ ì\84¤ì¹\98를 ì\97\85ê·¸ë \88ì\9d´ë\93\9cí\95\98려면 ì\95\84ë\9e\98 ì\83\81ì\9e\90ì\97\90 <code>$wgUpgradeKey</code>ì\9d\98 ê°\92ì\9d\84 ì\9e\85ë ¥í\95\98세요.
 LocalSettings.php에 찾으세요.',
        'config-localsettings-cli-upgrade' => 'LocalSettings.php 파일이 감지되었습니다.
 이 설치를 업그레이드하려면 update.php를 대신 실행하세요',
@@ -10178,7 +10473,7 @@ LocalSettings.php에 찾으세요.',
 $1',
        'config-localsettings-incomplete' => '기존 LocalSettings.php가 완전하지 않은 것 같습니다.
 $1 변수가 설정되어 있지 않습니다.
\9d´ ë³\80ì\88\98ê°\80 ì\84¤ì \95ë\90\98ë\8f\84ë¡\9d LocalSettings.php를 ë³\80ê²½í\95\98고 "계속"을 클릭하세요.',
\9d´ ë³\80ì\88\98ê°\80 ì\84¤ì \95ë\90\98ë\8f\84ë¡\9d LocalSettings.php를 ë°\94꾸고 "계속"을 클릭하세요.',
        'config-localsettings-connection-error' => 'LocalSettings.php 또는 AdminSettings.php에 지정한 설정을 사용하여 데이터베이스에 연결할 때 오류가 발생했습니다. 이러한 설정을 수정하고 다시 시도하세요.
 
 $1',
@@ -10196,12 +10491,12 @@ php.ini를 확인하고 <code>session.save_path</code>가 적절한 디렉토리
        'config-back' => '← 뒤로',
        'config-continue' => '계속 →',
        'config-page-language' => '언어',
-       'config-page-welcome' => '미ë\94\94ì\96´ì\9c\84í\82¤ì\97\90 ì\98¨ 것을 환영합니다!',
+       'config-page-welcome' => '미ë\94\94ì\96´ì\9c\84í\82¤ì\97\90 ì\98¤ì\8b  것을 환영합니다!',
        'config-page-dbconnect' => '데이터베이스에 연결',
        'config-page-upgrade' => '기존 설치 업그레이드',
        'config-page-dbsettings' => '데이터베이스 설정',
        'config-page-name' => '이름',
-       'config-page-options' => 'ì\98µì\85\98',
+       'config-page-options' => 'ì\84¤ì \95',
        'config-page-install' => '설치',
        'config-page-complete' => '완료!',
        'config-page-restart' => '설치 다시 시작',
@@ -10210,10 +10505,10 @@ php.ini를 확인하고 <code>session.save_path</code>가 적절한 디렉토리
        'config-page-copying' => '전문',
        'config-page-upgradedoc' => '업그레이드하기',
        'config-page-existingwiki' => '기존 위키',
-       'config-help-restart' => '당신이 입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?',
-       'config-restart' => '예, 다시 시작합니다.',
+       'config-help-restart' => '입력한 모든 저장된 데이터를 지우고 설치 과정을 다시 시작하겠습니까?',
+       'config-restart' => '예, 다시 시작합니다',
        'config-welcome' => '=== 사용 환경 검사 ===
\9d´ í\99\98ê²½ì\9d´ ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ ì\84¤ì¹\98ì\97\90 ì \81í\95©í\95  지 기본 검사를 실행합니다.
\9d´ í\99\98ê²½ì\9d´ ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ ì\84¤ì¹\98ì\97\90 ì \81í\95©í\95\9c지 기본 검사를 실행합니다.
 설치 중 도움이 필요하다면 이 검사 결과를 함께 제공해주어야 합니다.',
        'config-copyright' => "=== 저작권 및 이용 약관 ===
 
@@ -10251,7 +10546,7 @@ $1
 다음 데이터베이스 유형을 지원합니다 : $1.
 
 호스팅을 공유하고 있다면 적절한 데이터베이스 드라이버를 설치하도록 호스팅 제공 업체에 문의하세요.
-PHP를 ì§\81ì \91 ì»´í\8c\8cì\9d¼í\95  ê²½ì\9a° ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ í\81´ë\9d¼ì\9d´ì\96¸í\8a¸ë¥¼ ì\82¬ì\9a©í\95\98ì\97¬ í\99\9cì\84±í\99\94í\95\98ë\8f\84ë¡\9d ë\8b¤ì\8b\9c ì\84¤ì \95í\95\98ì\84¸ì\9a\94. ì\98\88ë\93¤ ë\93¤ì\96´ <code>./configure --with-mysql</code>ì\9d\84 ì\82¬ì\9a©í\95©ë\8b\88ë\8b¤.
+PHP를 ì§\81ì \91 ì»´í\8c\8cì\9d¼í\95  ê²½ì\9a° ë\8d°ì\9d´í\84°ë² ì\9d´ì\8a¤ í\81´ë\9d¼ì\9d´ì\96¸í\8a¸ë¥¼ ì\82¬ì\9a©í\95\98ì\97¬ í\99\9cì\84±í\99\94í\95\98ë\8f\84ë¡\9d ë\8b¤ì\8b\9c ì\84¤ì \95í\95\98ì\84¸ì\9a\94. ì\98\88ë\93¤ ë\93¤ì\96´ <code>./configure --with-mysql</code>ì\9d\84 ì\82¬ì\9a©í\95\98ì\84¸ì\9a\94.
 데비안이나 우분트 패키지에서 PHP를 설치했다면 php-mysql 모듈도 설치해야 합니다.',
        'config-outdated-sqlite' => "'''경고''': SQLite 필요한 최소 $2 버전보다 낮은 $1(이)가 있습니다. SQLite는 사용할 수 없습니다.",
        'config-no-fts3' => "'''경고''': SQLite는 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일되어, 검색 기능은 백엔드에 사용할 수 없습니다.",
@@ -10271,7 +10566,7 @@ PHP를 직접 컴파일할 경우 데이터베이스 클라이언트를 사용
 이 옵션은 미디어위키에 끔찍한 버그를 일으킵니다.
 설치할 수 없습니다. 또는 미디어위키가 사용하지 않는 이 옵션을 비활성화하십시오.",
        'config-safe-mode' => "'''경고:''' [http://www.php.net/features.safe-mode 안전 모드]이 활성합니다!
-이는 특히 파일을 올리거나 <code>math</code>를 지원하는 데 문제가 발생할 수 있습니다.",
+특히 파일을 올리거나 <code>math</code>를 지원하는 데 문제가 발생할 수 있습니다.",
        'config-xml-bad' => 'PHP의 XML 모듈이 없습니다.
 미디어위키는 이 모듈의 기능이 필요하며 이 설정에서는 작동하지 않습니다.
 Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
@@ -10281,7 +10576,7 @@ Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
 미디어위키가 제대로 작동하려면 UTF-8 지원이 필요합니다.",
        'config-memory-raised' => 'PHP의 <code>memory_limit</code>는 $1이며 $2(으)로 늘리세요.',
        'config-memory-bad' => "'''경고:''' PHP의 <code>memory_limit</code>는 $1입니다.
\9d´ë\8a\94 ì\95\84ë§\88ë\8f\84 ë\84\88무 ë\82®ì\9d\80 ê²\83 ê°\99ì\8aµë\8b\88ë\8b¤.
+아마도 너무 낮은 것 같습니다.
 설치가 실패할 수 있습니다!",
        'config-ctype' => "'''치명''': PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]에 대해 지원하여 컴파일해야 합니다.",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache]가 설치되었습니다',
@@ -10304,7 +10599,7 @@ Mandrake를 실행하고 있다면 php-xml 패키지를 설치하세요.',
        'config-using-server' => '"<nowiki>$1</nowiki>"(을)를 서버 이름으로 사용합니다.',
        'config-using-uri' => '"<nowiki>$1$2</nowiki>"(을)를 서버 URL로 사용합니다.',
        'config-uploads-not-safe' => "'''경고:''' 올리기에 대한 기본 디렉토리(<code>$1</code>)는 임의의 스크립트 실행에 취약합니다.
-미ë\94\94ì\96´ì\9c\84í\82¤ë\8a\94 ë³´ì\95\88 ì\9c\84í\98\91ì\97\90 ë\8c\80í\95\9c ëª¨ë\93  ì\98¬ë¦° í\8c\8cì\9d¼ì\9d\84 ê²\80ì\82¬í\95\98ì§\80ë§\8c, ì\9d´ë\8a\94 ì\98¬ë¦¬ê¸°ë¥¼ í\99\9cì\84±í\99\94í\95\98기 ì \84ì\97\90 [//www.mediawiki.org/wiki/Manual:Security#Upload_security ì\9d´ ë³´ì\95\88 ì·¨ì\95½ì \90ì\9d\84 í\95´ê²°í\95  ê²\83\9d\84 ë§¤ì\9a° ê¶\8cì\9e¥í\95©ë\8b\88ë\8b¤.",
+미디어위키는 보안 위협에 대한 모든 올린 파일을 검사하지만, 올리기를 활성화하기 전에 [//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에 제기한 버그]).
@@ -10317,7 +10612,7 @@ PHP 5.2.9 이후와 libxml2 2.7.3 이후로 업그레이드하세요 ([//bugs.ph
        'config-db-host' => '데이터베이스 호스트:',
        'config-db-host-help' => '데이터베이스 서버가 다른 서버에 있을 경우 여기에 호스트 이름이나 IP 주소를 입력하세요.
 
-웹 호스팅을 공유하여 사용하는 경우 호스팅 공급자는 당신에게 이들 설명서의 올바른 호스트 이름을 표기해야 합니다.
+공유된 웹 호스팅을 사용하는 경우 호스팅 공급자는 올바른 호스트 이름을 설명해야 합니다.
 
 윈도 서버에 설치하고 MySQL을 사용할 경우 "localhost"는 서버 이름으로 작동하지 않을 수 있습니다. 그렇지 않으면 로컬 IP 주소로 "127.0.0.1"를 시도하세요.
 
@@ -10327,9 +10622,9 @@ PostgreSQL을 사용할 경우 유닉스 소켓을 통해 연결되도록 입력
        'config-db-wiki-settings' => '이 위키 식별',
        'config-db-name' => '데이터베이스 이름:',
        'config-db-name-help' => '위키를 식별하기 위한 이름을 선택하세요.
-이는 공백이 없어야 합니다.
+공백이 없어야 합니다.
 
-웹 호스팅을 공유해 사용하는 경우 호스팅 제공 업체도 당신에게 제어판을 통해 데이터베이스를 사용하거나 만들 수 있도록 특정 데이터베이스 이름을 제공합니다.',
+공유된 웹 호스팅 사용하는 경우 호스팅 제공 업체가 특정 데이터베이스 이름을 제공하거나 제어판에서 데이터베이스를 만들 수 있도록 합니다.',
        'config-db-name-oracle' => '데이터베이스 스키마:',
        'config-db-account-oracle-warn' => '데이터베이스 백엔드로 오라클을 설치하기 위해 지원하는 세 가지 시나리오가 있습니다:
 
@@ -10340,10 +10635,11 @@ PostgreSQL을 사용할 경우 유닉스 소켓을 통해 연결되도록 입력
        'config-db-username' => '데이터베이스 사용자 이름:',
        'config-db-password' => '데이터베이스 비밀번호:',
        'config-db-password-empty' => '새 데이터베이스 사용자의 비밀번호를 입력하세요: $1.
-ë¹\84ë°\80ë²\88í\98¸ ì\97\86ì\9d´ ì\82¬ì\9a©ì\9e\90를 ë§\8cë\93¤ ì\88\98ë\8f\84 ì\9e\88ì§\80ë§\8c ì\9d´ë\8a\94 ì\95\88ì \84í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.',
+비밀번호 없이 사용자를 만들 수도 있지만 안전하지 않습니다.',
        'config-db-install-username' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름을 입력하세요.
-이는 미디어위키 계정의 사용자 이름이 아닌 데이터베이스에 대한 사용자 이름입니다.',
-       'config-db-install-password' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요. 이는 미디어위키 계정의 비밀번호가 아닌 데이터베이스에 대한 비밀번호입니다.',
+미디어위키 계정의 사용자 이름이 아닌 데이터베이스에 대한 사용자 이름입니다.',
+       'config-db-install-password' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 비밀번호을 입력하세요.
+미디어위키 계정의 비밀번호가 아닌 데이터베이스에 대한 비밀번호입니다.',
        'config-db-install-help' => '설치 과정 중에 데이터베이스에 연결할 때 사용할 사용자 이름과 비밀번호를 입력하세요.',
        'config-db-account-lock' => '정상적으로 작동하는 동안 같은 사용자 이름과 비밀번호를 사용함',
        'config-db-wiki-account' => '정상적인 작동을 위한 사용자 계정',
@@ -10358,10 +10654,10 @@ PostgreSQL을 사용할 경우 유닉스 소켓을 통해 연결되도록 입력
        'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 바이너리',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
        'config-charset-mysql4' => 'MySQL 4.0 UTF-8 하위 호환성',
-       'config-charset-help' => "'''경고:''' MySQL 4.1에서 '''UTF-8 하위 호환성'''을 사용하고 나서 <code>mysqldump</code>로 데이터베이스에 백업한다면 이는 모든 ASCII가 아닌 문자를 파괴하고 손상한 백업을 되돌릴 수 없습니다!
+       'config-charset-help' => "'''경고:''' MySQL 4.1에서 '''UTF-8 하위 호환성'''을 사용하고 나서 <code>mysqldump</code>로 데이터베이스에 백업한다면 모든 ASCII가 아닌 문자를 파괴하고 손상한 백업을 되돌릴 수 없습니다!
 
 '''바이너리 모드'''에서는 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.
-이는 MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.
+MySQL의 UTF-8 모드를 보다 더 효율적이고 유니코드 문자의 전체 범위를 사용할 수 있습니다.
 '''UTF-8 모드'''에서는 MySQL은 데이터를 설정하는 어떤 문자열인지를 알 것이며, 표현하고 적절하게 그것을 변환할 수 있지만
 [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes 기본 다국어 범위] 상의 문자를 저장하지 못하게 될 수 있습니다.",
        'config-mysql-old' => 'MySQL $1 이상이 필요하나 $2(이)가 있습니다.',
@@ -10377,8 +10673,8 @@ PostgreSQL을 사용할 경우 유닉스 소켓을 통해 연결되도록 입력
 
 PHP 파일이 있는 곳을 우리가 이를 맡길 수 없는 이유는 웹을 통해 접근할 수 없다는 것입니다.
 
-설치 마법사가 이과 함께 .htaccess 파일을 만들지만 거기서 실패하면 누군가는 원 데이터베이스에 접근하는 데 실패합니다.
\9d´ë\8a\94 ì\9b\90ì\8b\9c ì\82¬ì\9a©ì\9e\90 ë\8d°ì\9d´í\84°(ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c, ì\95\94í\98¸ í\95´ì\8b\9c) ë¿\90ë§\8c ì\95\84ë\8b\88ë\9d¼ ì\82­ì \9cë\90\9c ê°\9cì \95í\8c\90ê³¼ ì\9c\84í\82¤ì\9d\98 ë\8b¤ë¥¸ ì \9cí\95\9cë\90\9c ë\8d°ì\9d´í\84°ë¥¼ í\8f¬í\95¨í\95©ë\8b\88ë\8b¤.
+설치 마법사가 이과 함께 .htaccess 파일을 만들지만 거기서 실패하면 누군가는 원 데이터베이스에 접근하는 데 실패합니다.
+원시 사용자 데이터(이메일 주소, 암호 해시) 뿐만 아니라 삭제된 개정판과 위키의 다른 제한된 데이터를 포함합니다.
 
 <code>/var/lib/mediawiki/yourwiki</code>와 같이 모두 다른 곳에서 데이터베이스를 넣어보도록 하세요.',
        'config-oracle-def-ts' => '기본 테이블공간:',
@@ -10389,7 +10685,7 @@ PHP 파일이 있는 곳을 우리가 이를 맡길 수 없는 이유는 웹을
 
 $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 사용)',
@@ -10420,7 +10716,7 @@ ASCII 글자 (a-z, A-Z), 숫자 (0-9), 밑줄 (_)과 하이픈 (-)만 사용하
        'config-postgres-old' => 'PostgreSQL $1 이상이 필요하나 $2(이)가 있습니다.',
        'config-sqlite-name-help' => '위키를 식별하기 위한 이름을 선택하세요.
 공백이나 하이픈을 사용하지 마십시오.
-이는 SQLite 데이터 파일 이름에 사용됩니다.',
+SQLite 데이터 파일 이름에 사용됩니다.',
        'config-sqlite-parent-unwritable-group' => '<code><nowiki>$1</nowiki></code> 데이터 디렉토리를 만들 수 없으며 <code><nowiki>$2</nowiki></code> 상위 디렉토리에 웹 서버에 의해 쓸 수 없기 때문입니다.
 
 설치 마법사는 웹 서버로 실행중인 사용자를 결정할 수 없습니다.
@@ -10447,7 +10743,7 @@ chmod a+w $3</pre>',
        'config-sqlite-connection-error' => '$1.
 
 호스트, 계정 이름과 비밀번호를 확인하고 다시 시도하세요.',
-       'config-sqlite-readonly' => '파일 <code>$1</code>은 쓰기가 불가능합니다.',
+       'config-sqlite-readonly' => '<code>$1</code> 파일은 쓰기가 불가능합니다.',
        'config-sqlite-cant-create-db' => '<code>$1</code> 데이터베이스 파일을 만들 수 없습니다.',
        'config-sqlite-fts3-downgrade' => 'PHP가 FTS3 지원이 없어졌습니다. 테이블을 다운그레이드하세요.',
        'config-can-upgrade' => "이 데이터베이스에 미디어위키 테이블이 있습니다.
@@ -10474,9 +10770,9 @@ chmod a+w $3</pre>',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
        'config-mysql-myisam-dep' => "'''경고''': 미디어위키와 함께 사용하도록 권장하지 않는 MySQL에 대한 스토리지 엔진으로 MyISAM을 선택하였습니다. 이유는:
-* 이는 테이블이 잠겨있어 동시성을 거의 지원하지 않습니다
-* 이는 다른 엔진보다 손상이 더 자주 발생합니다.
-* 미디어위키 바탕 코드가 항상 정상적으로 MyISAM을 처리하지 않습니다.
+* 테이블이 잠겨있어 동시성을 거의 지원하지 않습니다
+* 다른 엔진보다 손상이 더 자주 발생합니다
+* 미디어위키 바탕 코드가 항상 정상적으로 MyISAM을 처리하지 않습니다
 
 MySQL 설치가 InnoDB를 지원한다면 그 선택 대신에 InnoDB를 선택할 것을 매우 권장합니다.
 MySQL 설치가 InnoDB를 지원하지 않는다면 아마도 업그레이드를 해야 할 수도 있습니다.",
@@ -10488,21 +10784,21 @@ MyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실
        'config-mysql-binary' => '바이너리',
        'config-mysql-utf8' => 'UTF-8',
        'config-mysql-charset-help' => "'''바이너리 모드'''에서는 미디어위키는 바이너리 필드의 데이터베이스에 UTF-8 텍스트를 저장합니다.
-이는 MySQL의 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-ibm_db2-low-db-pagesize' => "DB2 데이터베이스에 부족한 페이지 크기가 기본 테이블 공간에 있습니다. 페이지 크기는 '''32K''' 이상이어야 합니다.",
        'config-site-name' => '위키 이름:',
-       'config-site-name-help' => '이는 브라우저 제목 표시줄과 다른 여러 곳에 나타날 것입니다.',
+       '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-project-namespace-help' => '위키백과의 예를 따라서, 많은 위키는 "\'\'\'프로젝트 이름공간\'\'\'"에 그들의 콘텐츠 페이지에서 그들의 정책 페이지는 별도로 보관합니다.
 이 이름공간에 있는 모든 페이지의 제목은 여기서 지정할 수 있는 특정 접두어로 시작합니다.
-보통 이 접두어는 위키의 이름에서 파생되지만, 이는 "#" 또는 ":"와 같은 특수 문자를 포함할 수 없습니다.',
+보통 이 접두어는 위키의 이름에서 파생되지만, "#" 또는 ":"와 같은 특수 문자를 포함할 수 없습니다.',
        'config-ns-invalid' => '특정 "<nowiki>$1</nowiki>" 이름공간이 잘못되었습니다.
 다른 프로젝트 이름공간을 지정하세요.',
        'config-ns-conflict' => '특정 "<nowiki>$1</nowiki>" 이름공간이 기본 미디어위키 이름공간과 충돌합니다.
@@ -10512,7 +10808,7 @@ MyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실
        'config-admin-password' => '비밀번호:',
        'config-admin-password-confirm' => '비밀번호 확인:',
        'config-admin-help' => '"홍길동"과 같이 여기에 원하는 사용자 이름을 입력하세요.
\9d´ë\8a\94 ì\9c\84í\82¤ì\97\90 ë¡\9cê·¸ì\9d¸í\95\98ë\8a\94 ë\8d° ì\82¬ì\9a©ë\90\98ë\8a\94 ì\9d´ë¦\84ì\9e\85ë\8b\88ë\8b¤.',
+위키에 로그인하는 데 사용되는 이름입니다.',
        'config-admin-name-blank' => '관리자의 사용자 이름을 입력하세요.',
        'config-admin-name-invalid' => '특정 "<nowiki>$1</nowiki>" 사용자 이름이 잘못되었습니다.
 다른 사용자 이름을 지정하세요.',
@@ -10520,33 +10816,35 @@ MyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실
        'config-admin-password-same' => '비밀번호는 사용자 이름과 같아서는 안 됩니다.',
        'config-admin-password-mismatch' => '입력한 비밀번호 두 개가 일치하지 않습니다.',
        'config-admin-email' => '이메일 주소:',
-       'config-admin-email-help' => 'ì\9c\84í\82¤ì\9d\98 ë\8b¤ë¥¸ ì\82¬ì\9a©ì\9e\90ë¡\9cë¶\80í\84° ì\9d´ë©\94ì\9d¼ì\9d\84 ì \84ë\8b¬ë°\9bê±°ë\82\98 ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\9e¬ì\84¤ì \95í\95\98ê³  ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90 ë\8c\80í\95\9c ë³\80ê²½ 알림을 받기 위해 여기에 이메일 주소를 입력하세요. 이 필드를 비워 둘 수 있습니다.',
+       'config-admin-email-help' => 'ì\9c\84í\82¤ì\9d\98 ë\8b¤ë¥¸ ì\82¬ì\9a©ì\9e\90ë¡\9cë¶\80í\84° ì\9d´ë©\94ì\9d¼ì\9d\84 ì \84ë\8b¬ë°\9bê±°ë\82\98 ë¹\84ë°\80ë²\88í\98¸ë¥¼ ì\9e¬ì\84¤ì \95í\95\98ê³  ì£¼ì\8b\9c문ì\84\9c ëª©ë¡\9dì\97\90 ë\8c\80í\95\9c ë°\94ë\80\9c 알림을 받기 위해 여기에 이메일 주소를 입력하세요. 이 필드를 비워 둘 수 있습니다.',
        'config-admin-error-user' => '"<nowiki>$1</nowiki>" 이름의 관리자를 만드는 중 내부 오류가 발생했습니다.',
        'config-admin-error-password' => '"<nowiki>$1</nowiki>" 관리자의 비밀번호를 설정하는 중 내부 오류가 발생했습니다: <pre>$2</pre>',
        'config-admin-error-bademail' => '이메일 주소를 잘못 입력하였습니다.',
        'config-subscribe' => '[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 배포 발표 메일링 리스트]에 가입합니다.',
-       'config-subscribe-help' => 'ì\9d´ë\8a\94 ì¤\91ì\9a\94í\95\9c ë³´ì\95\88 ì\95\8c림ì\9d\84 í\8f¬í\95¨í\95\9c ë°°í\8f¬ ì\95\8c림ì\97\90 ë\8c\80í\95´ ì\82¬ì\9a©ë\90\98ë\8a\94 ë¡\9cì\9a° ë³¼ë¥¨ ë©\94ì\9d¼ë§\81 ë¦¬ì\8a¤í\8a¸ì\9e\85ë\8b\88ë\8b¤.
-ë\8b¹ì\8b ì\9d´ ì\9d´ë¥¼ êµ¬ë\8f\85í\95\98ê³  ë\82\98ì\84\9c ì\83\88 ë²\84ì \84ì\9d´ ë\82\98ì\98¬ ë\95\8c ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ ì\84¤ì¹\98를 ì\97\85ë\8d°ì\9d´í\8a¸í\95´ì\95¼í\95©ë\8b\88ë\8b¤.',
+       'config-subscribe-help' => '중요한 보안 알림을 포함한 배포 알림에 대해 사용되는 로우 볼륨 메일링 리스트입니다.
+ì\9d´ ë¦¬ì\8a¤í\8a¸ë¥¼ êµ¬ë\8f\85í\95\98ê³  ë\82\98ì\84\9c ì\83\88 ë²\84ì \84ì\9d´ ë\82\98ì\98¬ ë\95\8c ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ ì\84¤ì¹\98를 ì\97\85ë\8d°ì\9d´í\8a¸í\95\98ì\8b­ì\8b\9cì\98¤.',
        'config-subscribe-noemail' => '이메일 주소를 제공하지 않고 배포 발표 메일링 리스트에 가입하려 합니다.
 메일링 리스트에 가입하고자 할 경우 이메일 주소를 제공하세요.',
-       'config-almost-done' => '거의 다 완료했습니다! 이제 남은 설정을 생략하고 지금 바로 위키를 설치할 수 있습니다.',
+       'config-almost-done' => '거의 다 완료했습니다!
+이제 남은 설정을 생략하고 지금 바로 위키를 설치할 수 있습니다.',
        'config-optional-continue' => '더 많은 질문을 물어보세요.',
        'config-optional-skip' => '지겨워요, 그냥 위키를 설치할래요.',
        'config-profile' => '사용자 권한 프로필:',
        'config-profile-wiki' => '평범한 위키',
-       'config-profile-no-anon' => '계정 생성 필요',
+       'config-profile-no-anon' => '계정 만들기 필요',
        'config-profile-fishbowl' => '승인된 편집자만 이용 가능',
        'config-profile-private' => '비공개 위키',
-       'config-profile-help' => "ì\9c\84í\82¤ë\8a\94 ë\8b¹ì\8b ì\9d´ ê°\80ë\8a¥í\95\9c í\95\9c ë§\8eì\9d\80 ì\82¬ë\9e\8cë\93¤ì\9d´ í\8e¸ì§\91í\95\98ë\8f\84ë¡\9d í\95  ë\95\8c ìµ\9cê³ ë¡\9c ì \81í\95©합니다.
-미ë\94\94ì\96´ì\9c\84í\82¤ì\97\90ì\84\9cë\8a\94 ìµ\9cê·¼ ë°\94ë\80\9cì\9d\84 ê²\80í\86 í\95\98ê³ , ì\84 í\95\98ê±°ë\82\98 ì\95\85ì\9d\98ì \81ì\9d¸ ì\82¬ì\9a©ì\9e\90ì\97\90 ì\9d\98í\95´ ì\88\98í\96\89ë\90\98ë\8a\94 모든 손실을 되돌리는 것이 쉽습니다.
+       'config-profile-help' => "ì\9c\84í\82¤ë\8a\94 ë§\8eì\9d\80 ì\82¬ë\9e\8cë\93¤ì\9d´ ê°\80ë\8a¥í\95\9c í\95\9c í\95´ë\8b¹ ì\9c\84í\82¤ë¥¼ í\8e¸ì§\91í\95  ë\95\8c ê°\80ì\9e¥ ë\9b°ì\96´ë\82\9c ì\97­í\95 ì\9d\84 합니다.
+미ë\94\94ì\96´ì\9c\84í\82¤ì\97\90ì\84\9cë\8a\94 ìµ\9cê·¼ ë°\94ë\80\9cì\9d\84 ê²\80í\86 í\95\98ê³ , ì\84 í\95\98ê±°ë\82\98 ì\95\85ì\9d\98ì \81ì\9d¸ ì\82¬ì\9a©ì\9e\90ì\9d\98 모든 손실을 되돌리는 것이 쉽습니다.
 
-그러나 많은 사람들이 미디어위키가 다양한 역할의 유용하지만, 때로는 그것이 위키 방식의 장점을 모두 설득하기 쉽지 않음을 발견했습니다.
+그러나 많은 사람들이 미디어위키가 다양한 역할로 유용하지만, 때로는 모든 사람에게 위키 방식의 장점을 모두 설득하기 쉽지 않을 지도 모릅니다.
 그래서 선택할 수 있습니다.
 
 '''{{int:config-profile-wiki}}'''는 로그인하지 않고도 누구나 편집할 수 있습니다.
-'''{{int:config-profile-no-anon}}'''는 ì¶\94ê°\80ì \81ì\9c¼ë¡\9c í\95\84ì\9a\94í\95\9c ì±\85ì\9e\84ì\9d\84 ì \9cê³µí\95\98ì§\80ë§\8c, ê¸°ì¡´ì\9d\98 ê¸°ì\97¬ì\9e\90를 ë§\9dì¹  ì\88\98ë\8f\84 ì\9e\88ì\8aµë\8b\88ë\8b¤.
+'''{{int:config-profile-no-anon}}'''는 ê°\81 í\8e¸ì§\91ì\97\90 ì¶\94ê°\80ì \81ì\9c¼ë¡\9c ê°\95í\95\9c ì±\85ì\9e\84ì\84±ì\9d\84 ì \9cê³µí\95\98ì§\80ë§\8c, ë¶\80ë\8b´ ì\97\86ë\8a\94 ê¸°ì\97¬ë¥¼ ì \80í\95´í\95  ì\88\98ë\8f\84 ì\9e\88ì\8aµë\8b\88ë\8b¤.
 
-'''{{int:config-profile-fishbowl}}''' 같은 경우는 승인된 사용자만 편집할 수 있지만, 대중은 역사를 포함하여 페이지를 볼 수 있습니다. '''{{int:config-profile-private}}'''는 승인된 사용자만 같은 그룹에서 편집할 수 있고 볼 수 있습니다.
+'''{{int:config-profile-fishbowl}}''' 같은 경우는 승인된 사용자만 편집할 수 있지만, 대중은 역사를 포함하여 페이지를 볼 수 있습니다.
+'''{{int:config-profile-private}}'''는 승인된 사용자만 같은 그룹에서 편집할 수 있고 볼 수 있습니다.
 
 더 복잡한 사용자 권한을 설정하여 설치한 후 사용할 수 있도록 하려면 [//www.mediawiki.org/wiki/Manual:User_rights 관련 매뉴얼 항목]을 참고하세요.",
        'config-license' => '저작권 및 라이선스:',
@@ -10560,13 +10858,13 @@ MyISAM 데이터베이스는 InnoDB 데이터베이스보다 더 자주 손실
        'config-license-cc-choose' => '다른 크리에이티브 커먼즈 라이선스 선택',
        'config-license-help' => '많은 공개 위키는 모든 기여를 [http://freedomdefined.org/Definition 자유 라이선스] 하에 넣습니다.
 이럴 경우 커뮤니티 소유권의 이해를 할 수 있도록 하고 장기적인 기여를 장려합니다.
\9d´ë\8a\94 ì\9d¼ë°\98ì \81ì\9c¼ë¡\9c ê°\9cì\9d¸ ë\98\90ë\8a\94 í\9a\8cì\82¬ ì\9c\84í\82¤ì\97\90 ë\8c\80í\95´ì\84\9cë\8a\94 í\95\84ì\9a\94í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.
+일반적으로 개인 또는 회사 위키에 대해서는 필요하지 않습니다.
 
 위키백과의 텍스트를 사용할 수 있도록 하고 위키백과가 위키에서 복사한 텍스트를 사용할 수 있도록 원한다면 크리에이티브 커먼즈 저작자표시-동일조건변경허락으로 선택해야 합니다.
 
 위키백과는 이전에 GNU 자유 문서 사용 허가서를 사용했습니다.
-GFDL은 유효한 라이선스이지만 이는 이해하기 어렵습니다.
-이는 GFDL 하에 라이선스 내용을 재사용하는 것도 어렵습니다.',
+GFDL은 유효한 라이선스이지만 이해하기 어렵습니다.
+GFDL 하에 라이선스 내용을 재사용하는 것도 어렵습니다.',
        'config-email-settings' => '이메일 설정',
        'config-enable-email' => '발신 이메일 활성화',
        'config-enable-email-help' => '이메일을 작동하려면 [http://www.php.net/manual/en/mail.configuration.php PHP의 메일 설정]을 올바르게 설정해야 합니다.
@@ -10574,23 +10872,23 @@ GFDL은 유효한 라이선스이지만 이는 이해하기 어렵습니다.
        'config-email-user' => '사용자와 사용자 간 이메일 활성화',
        'config-email-user-help' => '환경 설정에서 활성화한 경우 모든 사용자가 이메일을 서로 보내도록 활성화합니다.',
        'config-email-usertalk' => '사용자 토론 문서 알림 활성화',
-       '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ê²½ 알림을 받도록 활성화합니다.',
+       '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 ë°\94ë\80\9c 알림을 받도록 활성화합니다.',
        'config-email-watchlist' => '주시문서 목록 알림 활성화',
        'config-email-watchlist-help' => '환경 설정에서 활성화한 경우 사용자가 주시한 문서에 대한 알림을 받도록 활성화합니다.',
        'config-email-auth' => '이메일 인증 활성화',
-       'config-email-auth-help' => "ì\9d´ ì\84¤ì \95ì\9d´ í\99\9cì\84±í\99\94ë\90\98ì\96´ ì\9e\88ì\9c¼ë©´ ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\84¤ì \95í\95\98ê±°ë\82\98 ë³\80ê²½í\95  때마다 그들에게 보낸 링크를 사용하여 이메일 주소를 확인해야 합니다.
\9d¸ì¦\9dë\90\9c ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8cë§\8c ë\8b¤ë¥¸ ì\82¬ì\9a©ì\9e\90ë¡\9cë¶\80í\84°ì\9d\98 ì\9d´ë©\94ì\9d¼ì\9d´ë\82\98 ë³\80ê²½ 알림 이메일을 받을 수 있습니다.
+       'config-email-auth-help' => "ì\9d´ ì\84¤ì \95ì\9d´ í\99\9cì\84±í\99\94ë\90\98ì\96´ ì\9e\88ì\9c¼ë©´ ì\82¬ì\9a©ì\9e\90ë\8a\94 ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8c를 ì\84¤ì \95í\95\98ê±°ë\82\98 ë°\94ê¿\80 때마다 그들에게 보낸 링크를 사용하여 이메일 주소를 확인해야 합니다.
\9d¸ì¦\9dë\90\9c ì\9d´ë©\94ì\9d¼ ì£¼ì\86\8cë§\8c ë\8b¤ë¥¸ ì\82¬ì\9a©ì\9e\90ë¡\9cë¶\80í\84°ì\9d\98 ì\9d´ë©\94ì\9d¼ì\9d´ë\82\98 ë°\94ë\80\9c 알림 이메일을 받을 수 있습니다.
 이메일 기능의 남용 가능성이 있기 때문에 이 옵션을 설정하는 것은 공개 위키에서 '''권장'''합니다.",
        'config-email-sender' => '반송 이메일 주소',
        'config-email-sender-help' => '발신한 이메일에 대한 반송 주소로 사용할 이메일 주소를 입력하세요.
-이는 반송할 때 보내는 주소입니다.
+반송할 때 보내는 주소입니다.
 대부분의 메일 서버는 적어도 도메인 이름 부분은 유효합니다.',
        'config-upload-settings' => '그림과 파일 올리기',
        'config-upload-enable' => '파일 올리기 활성화',
        'config-upload-help' => '파일 올리기는 서버에 잠재적인 보안 위험에 쉽게 노출될 수 있습니다.
 자세한 내용은 매뉴얼의 [//www.mediawiki.org/wiki/Manual:Security 보안 문단]을 읽어보세요.
 
\8c\8cì\9d¼ ì\98¬ë¦¬ê¸°ë¥¼ í\99\9cì\84±í\99\94í\95\98려면 ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ì\9d\98 ë£¨í\8a¸ ë\94\94ë \89í\86 ë¦¬ì\97\90 ì\9e\88ë\8a\94 <code>images</code> í\95\98ì\9c\84 ë\94\94ë \89í\86 ë¦¬ì\97\90ì\84\9c ì\9b¹ ì\84\9cë²\84ê°\80 ê¸°ë¡\9dí\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d ëª¨ë\93\9c를 ë³\80ê²½í\95©니다.
\8c\8cì\9d¼ ì\98¬ë¦¬ê¸°ë¥¼ í\99\9cì\84±í\99\94í\95\98려면 ë¯¸ë\94\94ì\96´ì\9c\84í\82¤ì\9d\98 ë£¨í\8a¸ ë\94\94ë \89í\86 ë¦¬ì\97\90 ì\9e\88ë\8a\94 <code>images</code> í\95\98ì\9c\84 ë\94\94ë \89í\86 ë¦¬ì\97\90ì\84\9c ì\9b¹ ì\84\9cë²\84ê°\80 ê¸°ë¡\9dí\95  ì\88\98 ì\9e\88ë\8f\84ë¡\9d ëª¨ë\93\9c를 ë°\94ê¿\89니다.
 그 다음 이 옵션을 활성화합니다.',
        'config-upload-deleted' => '삭제된 파일에 대한 디렉토리:',
        'config-upload-deleted-help' => '삭제된 파일을 보관할 디렉토리를 선택하세요.
@@ -10629,11 +10927,11 @@ GFDL은 유효한 라이선스이지만 이는 이해하기 어렵습니다.
        'config-extensions' => '확장 기능',
        'config-extensions-help' => '위에 나열된 확장 기능이 <code>./extensions</code>에서 발견되었습니다.
 
\9d´ë\93¤ì\9d\80 ì\94ê°\80ì \81ì\9d¸ ì\84¤ì \95ì\9d´ í\95\84ì\9a\94í\95  ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤ë§\8c ì§\80ê¸\88 í\99\9cì\84±í\99\94ì\8b\9cí\82¬ ì\88\98 ì\9e\88ì\8aµë\8b\88ë\8b¤.',
-       'config-install-alreadydone' => "'''경고:''' 당신은 이미 미디어위키를 설치하였고 다시 설치하려고 합니다.
+추가적인 설정이 필요할 수 있습니다만 지금 활성화시킬 수 있습니다.',
+       'config-install-alreadydone' => "'''경고:''' 이미 미디어위키를 설치했고 다시 설치하려고 합니다.
 다음 페이지에서 진행하세요.",
        'config-install-begin' => '"{{int:config-continue}}"을 누르면 미디어위키의 설치를 시작합니다.
-ê·¸ë\9e\98ë\8f\84 ë³\80ê²½í\95\98는 것을 원한다면 뒤로를 누릅니다.',
+ê·¸ë\9e\98ë\8f\84 ë°\94꾸는 것을 원한다면 뒤로를 누릅니다.',
        'config-install-step-done' => '완료',
        'config-install-step-failed' => '실패',
        'config-install-extensions' => '확장 기능을 포함하는 중',
@@ -10659,15 +10957,15 @@ GFDL은 유효한 라이선스이지만 이는 이해하기 어렵습니다.
 이를 만드는 것을 원하면 아래의 "계정 만들기" 확인 상자를 클릭하세요.',
        'config-install-tables' => '테이블을 만드는 중',
        'config-install-tables-exist' => "'''경고''': 미디어위키 테이블이 이미 있는 것 같습니다.
-테이블 생성을 생략합니다.",
-       'config-install-tables-failed' => "'''오류''': 다음 오류와 함께 테이블 생성에 실패했습니다: $1",
+테이블 만들기를 생략합니다.",
+       'config-install-tables-failed' => "'''오류''': 다음 오류와 함께 테이블 만들기에 실패했습니다: $1",
        'config-install-interwiki' => '기본 인터위키 테이블을 채우는 중',
        'config-install-interwiki-list' => '<code>interwiki.list</code> 파일을 불러올 수 없습니다.',
        'config-install-interwiki-exists' => "'''경고''': 인터위키 테이블이 이미 항목을 갖고 있는 것 같습니다.
 기본 목록으로 넘어갑니다.",
        'config-install-stats' => '통계를 초기화하는 중',
        'config-install-keys' => '보안 키를 만드는 중',
-       'config-insecure-keys' => "'''경고:''' ì\84¤ì¹\98 ì¤\91ì\97\90 ì\83\9dì\84±í\95\9c {{PLURAL:$2|ë³´ì\95\88 í\82¤}} ($1)를 ì\84¤ì¹\98í\95\98ë\8a\94 ë\8f\99ì\95\88 ì\99\84ì \84í\9e\88 ì\95\88ì \84í\95\98ì§\80 {{PLURAL:$2|ì\95\8aì\8aµë\8b\88ë\8b¤}}. ì§\81ì \91 ë³\80ê²½ì\9d\84 고려하세요.",
+       'config-insecure-keys' => "'''경고:''' ì\84¤ì¹\98 ì¤\91ì\97\90 ì\83\9dì\84±í\95\9c {{PLURAL:$2|ë³´ì\95\88 í\82¤}} ($1)를 ì\84¤ì¹\98í\95\98ë\8a\94 ë\8f\99ì\95\88 ì\99\84ì \84í\9e\88 ì\95\88ì \84í\95\98ì§\80 {{PLURAL:$2|ì\95\8aì\8aµë\8b\88ë\8b¤}}. ì§\81ì \91 ë°\94꾸기를 고려하세요.",
        'config-install-sysop' => '관리자 사용자 계정을 만드는 중',
        'config-install-subscribe-fail' => '미디어위키 발표를 구독할 수 없습니다: $1',
        'config-install-subscribe-notpossible' => 'cURL이 설치되지 않았고 allow_url_fopen를 사용할 수 없습니다.',
@@ -10678,9 +10976,9 @@ GFDL은 유효한 라이선스이지만 이는 이해하기 어렵습니다.
 미디어위키가 성공적으로 설치되었습니다.
 
 설치 마법사가 <code>LocalSettings.php</code> 파일을 만들었습니다.
-이는 모든 설정이 포함되어 있습니다.
+모든 설정이 포함되어 있습니다.
 
-이를 다운로드하여 위키 설치의 거점에 넣어야 합니다 (index.php와 같은 디렉토리). 다운로드가 자동으로 시작됩니다.
+파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉토리) 다운로드가 자동으로 시작됩니다.
 
 다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:
 
@@ -10691,7 +10989,7 @@ $3
 완료되었으면 '''[$2 위키에 들어갈 수 있습니다]'''.",
        'config-download-localsettings' => 'LocalSettings.php 다운로드',
        'config-help' => '도움말',
-       'config-nofile' => '파일 "$1"(을)를 찾을 수 없습니다. 이미 삭제되었나요?',
+       'config-nofile' => '"$1" 파일을 찾을 수 없습니다. 이미 삭제되었나요?',
        'mainpagetext' => "'''미디어위키가 성공적으로 설치되었습니다.'''",
        'mainpagedocfooter' => '[//meta.wikimedia.org/wiki/Help:Contents 이곳]에서 위키 프로그램에 대한 정보를 얻을 수 있습니다.
 
@@ -10702,7 +11000,7 @@ $3
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce 미디어위키 발표 메일링 리스트]',
 );
 
-/** Karachay-Balkar (Ð\9aÑ\8aаÑ\80аÑ\87ай-Ð\9cалкъар)
+/** Karachay-Balkar (кÑ\8aаÑ\80аÑ\87ай-малкъар)
  * @author Iltever
  */
 $messages['krc'] = array(
@@ -10751,13 +11049,13 @@ Dat kanns De verlängere, endämm dat De de <code lang="en">session.gc_maxlifeti
 Don dat Projramm för et Opsäze norr_ens aanschmiiße.',
        'config-no-session' => 'De Daate för Ding Setzung sinn verschött jejange.
 Donn en dä Dattei <code>php.ini</code> nohloore, ov dä <code lang="en">session.save_path</code> op e zopaß Verzeijschneß zeisch.',
-       'config-your-language' => 'Ding Shprooch:',
+       'config-your-language' => 'Ding Schprooch:',
        'config-your-language-help' => 'Donn heh di Shprooch ußsöhke, di dat Enshtallzjuhnsprojramm kalle sull.',
        'config-wiki-language' => 'Dem Wiki sing Shprooch:',
        'config-wiki-language-help' => 'Donn heh di Shprooch ußsöhke, di et Wiki shtandattmääßesch kalle sull.',
        'config-back' => '← Retuur',
        'config-continue' => 'Wigger →',
-       'config-page-language' => 'Shprooch',
+       'config-page-language' => 'Schprooch',
        'config-page-welcome' => 'Wellkumme beim MediaWiki!',
        'config-page-dbconnect' => 'Met dä Daatebangk Verbenge',
        'config-page-upgrade' => 'En Inshtallzjuhn op der neuste Shtand bränge',
@@ -11276,7 +11574,7 @@ Dat es och all op Änglesch:
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]',
 );
 
-/** Kurdish (Latin script) (‪Kurdî (latînî)‬)
+/** Kurdish (Latin script) (Kurdî (latînî)‎)
  * @author George Animal
  */
 $messages['ku-latn'] = array(
@@ -11287,6 +11585,7 @@ $messages['ku-latn'] = array(
        'config-page-options' => 'Vebijêrk',
        'config-ns-generic' => 'Proje',
        'config-install-step-done' => 'çêbû',
+       'config-help' => 'alîkarî',
        '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ê.
 
@@ -11322,6 +11621,9 @@ $messages['lb'] = array(
 Dir fannt en am LocalSettings.php.",
        'config-localsettings-key' => 'Aktualisatiounsschlëssel:',
        'config-localsettings-badkey' => 'De Schlëssel deen Dir aginn hutt ass net korrekt',
+       'config-localsettings-incomplete' => 'De Fichier LocalSettings.php schéngt net komplett ze sinn.
+D\'Variabel $1 ass net definéiert.
+Ännert w.e.g. de Fichier LocalSettings.php esou datt déi Variabel definéiert ass a klickt op "Virufueren".',
        'config-session-error' => 'Feeler beim Starte vun der Sessioun: $1',
        'config-no-session' => "D'Donnéeë vun ärer Sessioun si verluergaangen!
 Kuckt Är php.ini no a vergewëssert Iech datt <code>session.save_path</code>  op adequate REpertoire agestallt ass.",
@@ -11422,6 +11724,7 @@ Wann et de Kont net gëtt, a wann den Installatiouns-Kont genuch Rechter huet, g
        'config-header-ibm_db2' => 'IBM DB2-Astellungen',
        'config-invalid-db-type' => 'Net valabelen Datebank-Typ',
        'config-missing-db-name' => 'Dir musst en Numm fir de Wäert "Numm vun der Datebank" uginn',
+       'config-missing-db-host' => 'Dir musst e Wäert fir "Database host" uginn',
        'config-missing-db-server-oracle' => 'Dir musst e Wäert fir "Datebank-TNS" uginn',
        'config-db-sys-user-exists-oracle' => 'De Benotzerkont "$1" gëtt et schonn. SYSDBA kann nëmme benotzt gi fir en neie Benotzerkont opzemaachen.',
        'config-postgres-old' => 'PostgreSQL $1 oder eng méi nei Versioun gëtt gebraucht, Dir hutt $2.',
@@ -11508,6 +11811,7 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
        'config-install-stats' => 'Initialisatioun vun de Statistiken',
        'config-install-keys' => 'Generéiere vum Geheimschlëssel',
        'config-install-sysop' => 'Administrateur Benotzerkont gëtt ugeluecht',
+       'config-install-extension-tables' => "D'Tabelle fir déi aktivéiert Erweiderunge ginn ugeluecht",
        'config-install-mainpage-failed' => "D'Haaptsäit konnt net dragesat ginn: $1",
        'config-download-localsettings' => 'LocalSettings.php eroflueden',
        'config-help' => 'Hëllef',
@@ -11521,7 +11825,8 @@ Dir kënnt elo déi Astellungen déi nach iwwreg sinn iwwersprangen an d'Wiki el
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglëscht vun neie MediaWiki-Versiounen]",
 );
 
-/** Lingua Franca Nova (Lingua Franca Nova) */
+/** Lingua Franca Nova (Lingua Franca Nova)
+ */
 $messages['lfn'] = array(
        'mainpagetext' => "'''MediaWiki es aora instalada.'''",
        'mainpagedocfooter' => 'Atenda la [//meta.wikimedia.org/wiki/Help:Contents Gida per Usores] per informa supra la usa de la programa de vici.
@@ -11546,7 +11851,8 @@ $messages['lg'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Wewandise ofunenga amawulire aga email ag'ebifa ku MediaWiki]",
 );
 
-/** Limburgish (Limburgs) */
+/** Limburgish (Limburgs)
+ */
 $messages['li'] = array(
        'mainpagetext' => "'''MediaWiki software succesvol geïnsjtalleerd.'''",
        'mainpagedocfooter' => "Raodpleeg de [//meta.wikimedia.org/wiki/NL_Help:Inhoudsopgave handjleiding] veur informatie euver 't gebroek van de wikisoftware.
@@ -11558,12 +11864,14 @@ $messages['li'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki mailinglies veur nuuj versies]",
 );
 
-/** Lao (ລາວ) */
+/** Lao (ລາວ)
+ */
 $messages['lo'] = array(
        'mainpagetext' => "'''ຕິດຕັ້ງມີເດຍວິກິນີ້ສຳເລັດແລ້ວ.'''",
 );
 
-/** Lithuanian (lietuvių) */
+/** Lithuanian (lietuvių)
+ */
 $messages['lt'] = array(
        'mainpagetext' => "'''MediaWiki sėkmingai įdiegta.'''",
        'mainpagedocfooter' => 'Informacijos apie wiki programinės įrangos naudojimą, ieškokite [//meta.wikimedia.org/wiki/Help:Contents žinyne].
@@ -11602,7 +11910,8 @@ $messages['lv'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Parakstīties uz paziņojumiem par jaunām MediaWiki versijām]',
 );
 
-/** Literary Chinese (文言) */
+/** Literary Chinese (文言)
+ */
 $messages['lzh'] = array(
        'mainpagetext' => "'''共筆臺已立'''",
        'mainpagedocfooter' => "欲識維基,見[//meta.wikimedia.org/wiki/Help:Contents User's Guide]
@@ -11640,7 +11949,8 @@ $messages['mai'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Moksha (Мокшень) */
+/** Moksha (мокшень)
+ */
 $messages['mdf'] = array(
        'mainpagetext' => "'''МедиаВикить арафтозь лац.'''",
        'mainpagedocfooter' => 'Ванк [//meta.wikimedia.org/wiki/Help:Contents Ветямовал Тиинди] тяса ули кода содамс Вики програпнень эрявикснень колга.
@@ -11710,7 +12020,8 @@ $messages['mg'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Resaka momba ny fizaràn'ny MediaWiki]",
 );
 
-/** Eastern Mari (Олык Марий) */
+/** Eastern Mari (олык марий)
+ */
 $messages['mhr'] = array(
        'mainpagetext' => "'''MediaWiki сай шындыме.'''",
 );
@@ -12126,13 +12437,13 @@ chmod a+w $3</pre>',
 По инсталацијата имате на избор и посложени кориснички права и поставки. Погледајте во [//www.mediawiki.org/wiki/Manual:User_rights прирачникот].",
        'config-license' => 'Авторски права и лиценца:',
        'config-license-none' => 'Без подножје за лиценца',
-       'config-license-cc-by-sa' => 'Creative Commons НаведиИзвор СподелиПодИстиУслови',
+       'config-license-cc-by-sa' => 'Криејтив комонс НаведиИзвор СподелиПодИстиУслови',
        'config-license-cc-by' => 'Криејтив комонс НаведиИзвор',
-       'config-license-cc-by-nc-sa' => 'Creative Commons НаведиИзвор-Некомерцијално-СподелиПодИстиУслови',
+       'config-license-cc-by-nc-sa' => 'Криејтив комонс НаведиИзвор-Некомерцијално-СподелиПодИстиУслови',
        'config-license-cc-0' => 'Криејтив комонс Нула (јавна сопственост)',
        'config-license-gfdl' => 'ГНУ-ова лиценца за слободна документација 1.3 или понова',
        'config-license-pd' => 'Јавна сопственост',
-       'config-license-cc-choose' => 'Одберете друга Creative Commons лиценца по ваш избор',
+       'config-license-cc-choose' => 'Одберете друга лиценца на Криејтив комонс по ваш избор',
        'config-license-help' => "Многу јавни викија ги ставаат сите придонеси под [http://freedomdefined.org/Definition слободна лиценца].
 Со ова се создава атмосфера на општа сопственост и поттикнува долгорочно учество.
 Ова не е неопходно за викија на поединечни физички или правни лица.
@@ -12180,10 +12491,10 @@ chmod a+w $3</pre>',
 За да може ова да работи, МедијаВики бара пристап до интернет.
 
 За повеќе информации за оваа функција и напатствија за нејзино поставување на вики (сите други освен Ризницата), коносултирајте го [//mediawiki.org/wiki/Manual:$wgForeignFileRepos прирачникот].',
-       'config-cc-error' => 'Изборникот на Creative Commons лиценца не даде резултати.
+       'config-cc-error' => 'Изборникот на лиценци од Криејтив комонс не даде резултати.
 Внесете го името на лиценцата рачно.',
        'config-cc-again' => 'Одберете повторно...',
-       'config-cc-not-chosen' => 'Одберете ја саканата Creative Commons лиценца и кликнете на „продолжи“.',
+       'config-cc-not-chosen' => 'Одберете ја саканата лиценца од Криејтив комонс и стиснете на „продолжи“.',
        'config-advanced-settings' => 'Напредни нагодувања',
        'config-cache-options' => 'Нагодувања за кеширање на објекти:',
        'config-cache-help' => 'Кеширањето на објекти се користи за зголемување на брзината на МедијаВики со кеширање на често употребуваните податоци.
@@ -12286,7 +12597,7 @@ $messages['ml'] = array(
        'config-information' => 'വിവരങ്ങൾ',
        'config-localsettings-upgrade' => "'''അറിയിപ്പ്''': ഒരു <code>LocalSettings.php</code> ഫയൽ കാണുന്നു.
 സോഫ്റ്റ്‌വേർ അപ്‌ഗ്രേഡ് ചെയ്യുക സാദ്ധ്യമാണ്.
-ദയവായി പെട്ടിയിൽ <code>\$wgUpgradeKey</code> എന്നതിന്റെ വില നൽകുക.",
+ദയവായി പെട്ടിയിൽ <code>\$wgUpgradeKey</code> എന്നതിന്റെ വില നൽകുക.", # Fuzzy
        'config-localsettings-key' => 'അപ്‌ഗ്രേഡ് ചാവി:',
        'config-localsettings-badkey' => 'താങ്കൾ നൽകിയ ചാവി തെറ്റാണ്',
        'config-session-error' => 'സെഷൻ തുടങ്ങുന്നതിൽ പിഴവ്: $1',
@@ -12315,9 +12626,9 @@ $messages['ml'] = array(
        'config-sidebar' => '* [//www.mediawiki.org മീഡിയവിക്കി പ്രധാനതാൾ]
 * [//www.mediawiki.org/wiki/Help:Contents ഉപയോക്തൃസഹായി]
 * [//www.mediawiki.org/wiki/Manual:Contents കാര്യനിർവഹണസഹായി]
-* [//www.mediawiki.org/wiki/Manual:FAQ പതിവുചോദ്യങ്ങൾ]',
+* [//www.mediawiki.org/wiki/Manual:FAQ പതിവുചോദ്യങ്ങൾ]', # Fuzzy
        'config-env-php' => 'പി.എച്ച്.പി. $1 ഇൻസ്റ്റോൾ ചെയ്തിട്ടുണ്ട്.',
-       'config-no-db' => 'അനുയോജ്യമായ ഡേറ്റാബേസ് ഡ്രൈവർ കണ്ടെത്താനായില്ല!',
+       'config-no-db' => 'അനുയോജ്യമായ ഡേറ്റാബേസ് ഡ്രൈവർ കണ്ടെത്താനായില്ല!', # Fuzzy
        'config-memory-raised' => 'പി.എച്ച്.പി.യുടെ <code>memory_limit</code> $1 ആണ്, $2 ആയി ഉയർത്തിയിരിക്കുന്നു.',
        'config-memory-bad' => "'''മുന്നറിയിപ്പ്:''' പി.എച്ച്.പി.യുടെ <code>memory_limit</code> $1 ആണ്.
 ഇത് മിക്കവാറും വളരെ കുറവാണ്.
@@ -12399,7 +12710,7 @@ $1
        'config-logo-help' => 'മീഡിയവിക്കിയിൽ സ്വതേയുള്ള ദൃശ്യരൂപത്തിൽ 135x160 പിക്സലുള്ള ലോഗോ മുകളിൽ ഇടത് മൂലയിൽ കാണാം.
 അനുയോജ്യമായ വലിപ്പമുള്ള ഒരു ചിത്രം അപ്‌ലോഡ് ചെയ്തിട്ട്, അതിന്റെ യൂ.ആർ.എൽ. ഇവിടെ നൽകുക.
 
-താങ്കൾക്ക് ലോഗോ ആവശ്യമില്ലെങ്കിൽ, ഈ പെട്ടി ശൂന്യമായിടുക.',
+താങ്കൾക്ക് ലോഗോ ആവശ്യമില്ലെങ്കിൽ, ഈ പെട്ടി ശൂന്യമായിടുക.', # Fuzzy
        'config-cc-again' => 'ഒന്നുകൂടി എടുക്കൂ...',
        'config-advanced-settings' => 'വിപുലീകൃത ക്രമീകരണങ്ങൾ',
        'config-extensions' => 'അനുബന്ധങ്ങൾ',
@@ -12446,7 +12757,8 @@ $messages['mn'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce МедиаВикигийн мэдээний мэйл явуулах жагсаалт]',
 );
 
-/** Marathi (मराठी) */
+/** Marathi (मराठी)
+ */
 $messages['mr'] = array(
        'mainpagetext' => "'''मीडियाविकीचे इन्स्टॉलेशन पूर्ण.'''",
        'mainpagedocfooter' => 'विकी सॉफ्टवेअर वापरण्याकरिता [//meta.wikimedia.org/wiki/Help:Contents यूजर गाईड] पहा.
@@ -12549,7 +12861,7 @@ $messages['my'] = array(
        'mainpagetext' => "'''မီဒီယာဝီကီကို အောင်မြင်စွာ သွင်းပြီးပါပြီ။'''",
 );
 
-/** Erzya (Эрзянь)
+/** Erzya (эрзянь)
  * @author Botuzhaleny-sodamo
  */
 $messages['myv'] = array(
@@ -12571,7 +12883,8 @@ $messages['mzn'] = array(
        'config-help' => 'راهنما',
 );
 
-/** Nahuatl (Nāhuatl) */
+/** Nahuatl (Nāhuatl)
+ */
 $messages['nah'] = array(
        'mainpagetext' => "'''MediaHuiqui cualli ōmotlahtlāli.'''",
 );
@@ -12589,7 +12902,7 @@ $messages['nan'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki的公布列單]',
 );
 
-/** Norwegian Bokmål (‪norsk (bokmål)‬)
+/** Norwegian Bokmål (norsk (bokmål)‎)
  * @author Event
  * @author Nghtwlkr
  */
@@ -12634,7 +12947,7 @@ Sjekk din php.ini og sørg for at <code>session.save_path</code> er satt til en
        'config-page-dbsettings' => 'Databaseinnstillinger',
        'config-page-name' => 'Navn',
        'config-page-options' => 'Valg',
-       'config-page-install' => 'Innstaller',
+       'config-page-install' => 'Installer',
        'config-page-complete' => 'Ferdig!',
        'config-page-restart' => 'Start installasjonen på nytt',
        'config-page-readme' => 'Les meg',
@@ -12983,7 +13296,7 @@ Mer komplekse konfigurasjoner av brukerrettigheter er tilgjengelig etter install
        'config-license-cc-by-sa' => 'Creative Commons Navngivelse Del på samme vilkår',
        'config-license-cc-by' => 'Creative Commons Attribution',
        'config-license-cc-by-nc-sa' => 'Creative Commons Navngivelse Ikke-kommersiell Del på samme vilkår',
-       'config-license-cc-0' => 'Creative Commons Zero',
+       'config-license-cc-0' => 'Creative Commons Zero', # Fuzzy
        'config-license-pd' => 'Offentlig rom',
        'config-license-cc-choose' => 'Velg en egendefinert Creative Commons-lisens',
        'config-email-settings' => 'E-postinnstillinger',
@@ -13018,7 +13331,7 @@ Ideelt burde ikke denne være tilgjengelig for nettet.',
        'config-logo-help' => 'MediaWikis standarddrakt inkluderer plass til en 135x160 pikslers logo i øvre venstre hjørne.
 Last opp et bilde i passende størrelse og skriv inn nettadressen her.
 
-Hvis du ikke ønsker en logo, la denne boksen være tom.',
+Hvis du ikke ønsker en logo, la denne boksen være tom.', # Fuzzy
        'config-instantcommons' => 'Aktiver Instant Commons',
        'config-instantcommons-help' => '[//www.mediawiki.org/wiki/InstantCommons Instant Commons] er en funksjon som gjør det mulig for wikier å bruke bilder, lyder og andre media funnet på nettstedet [//commons.wikimedia.org/ Wikimedia Commons].
 For å gjøre dette krever MediaWiki tilgang til internett.
@@ -13050,7 +13363,8 @@ For mer informasjon om denne funksjonen, inklusive instruksjoner om hvordan man
 *[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]',
 );
 
-/** Low German (Plattdüütsch) */
+/** Low German (Plattdüütsch)
+ */
 $messages['nds'] = array(
        'mainpagetext' => "'''De MediaWiki-Software is mit Spood installeert worrn.'''",
        'mainpagedocfooter' => 'Kiek de [//meta.wikimedia.org/wiki/MediaWiki_localisation Dokumentatschoon för dat Anpassen vun de Brukerböversiet]
@@ -13645,7 +13959,7 @@ Na het plaatsen van het bestand met instellingen kunt u '''[$2 uw wiki betreden]
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailinglijst voor aankondigingen van nieuwe versies]',
 );
 
-/** Norwegian Nynorsk (‪norsk (nynorsk)‬)
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
  * @author Harald Khan
  * @author Nghtwlkr
  */
@@ -13678,9 +13992,9 @@ Installasjonen kan mislukkast!",
        'config-header-oracle' => 'Oracle-innstillingar',
        'config-invalid-db-type' => 'Ugyldig databasetype',
        'config-invalid-db-name' => 'Ugyldig databasenamn «$1».
-Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
+Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).', # Fuzzy
        'config-invalid-db-prefix' => 'Ugyldig databaseprefiks «$1».
-Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
+Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).', # Fuzzy
        'config-invalid-schema' => 'Ugyldig skjema for MediaWiki «$1».
 Berre bruk ASCII-bokstavar (a-z, A-Z), tal (0-9) og undestrekar (_).',
        'config-postgres-old' => 'PostgreSQL $1 eller seinare krevst, du har $2.',
@@ -13700,7 +14014,8 @@ $messages['no'] = array(
        'mainpagetext' => "'''MediaWiki-programvaren er nå installert.'''",
 );
 
-/** Occitan (occitan) */
+/** Occitan (occitan)
+ */
 $messages['oc'] = array(
        'mainpagetext' => "'''MediaWiki es estat installat amb succès.'''",
        'mainpagedocfooter' => "Consultatz lo [//meta.wikimedia.org/wiki/Ajuda:Contengut Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial.
@@ -13732,12 +14047,14 @@ $messages['os'] = array(
        'mainpagetext' => "'''Вики-скрипт «MediaWiki» æнтыстджынæй æвæрд æрцыд.'''",
 );
 
-/** Punjabi (ਪੰਜਾਬੀ) */
+/** Punjabi (ਪੰਜਾਬੀ)
+ */
 $messages['pa'] = array(
        'mainpagetext' => "'''ਮੀਡਿਆਵਿਕਿ ਠੀਕ ਤਰ੍ਹਾਂ ਇੰਸਟਾਲ ਹੋ ਗਿਆ ਹੈ।'''",
 );
 
-/** Pampanga (Kapampangan) */
+/** Pampanga (Kapampangan)
+ */
 $messages['pam'] = array(
        'mainpagetext' => "'''Melaus ing pamipalyari ning MediaWiki.'''",
        'mainpagedocfooter' => "Basan me ing [//meta.wikimedia.org/wiki/Help:Contents User's Guide] para king impormasiun keng pamangamit ning wiki software.
@@ -13748,7 +14065,8 @@ $messages['pam'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Picard (Picard) */
+/** Picard (Picard)
+ */
 $messages['pcd'] = array(
        'mainpagetext' => "'''MediaWiki o té instalé aveuc victoère.'''",
 );
@@ -14394,7 +14712,7 @@ It peule pa instalé MediaWiki.",
 S'a gestiss un sit a àut tràfich, a dovrìa lese cheicòs an sla [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalisassion Unicode].",
        'config-unicode-update-warning' => "'''Avis:''' La version instalà dlë spassiador ëd normalisassion Unicode a deuvra na version veja ëd la librarìa dël [http://site.icu-project.org/ proget ICU].
 A dovrìa fé n'[//www.mediawiki.org/wiki/Unicode_normalization_considerations agiornament] s'a l'é anteressà a dovré Unicode.",
-       'config-no-db' => 'Impossìbil tové un pilòta ëd base ëd dàit bon!',
+       'config-no-db' => 'Impossìbil tové un pilòta ëd base ëd dàit bon!', # Fuzzy
        'config-no-fts3' => "'''Avis''': SQLite a l'é compilà sensa ël mòdul [//sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.",
        'config-register-globals' => "'''Avis: L'opsion <code>[http://php.net/register_globals register_globals]</code> ëd PHP a l'é abilità.'''
 '''Ch'a la disabìlita s'a peul.'''
@@ -14443,7 +14761,7 @@ Bele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià
 
 S'a deuvra n'ospitalità partagià, sò fornidor d'ospitalità a dovrìa deje ël nòm dl'ospitant giust ant soa documentassion.
 
-Se a anstala su un servent Windows e a deuvra MySQL, dovré \"localhost\" a podrìa funsioné nen com nòm dël servent. S'a marcia nen, ch'a preuva \"127.0.0.1\" com adrëssa IP local.",
+Se a anstala su un servent Windows e a deuvra MySQL, dovré \"localhost\" a podrìa funsioné nen com nòm dël servent. S'a marcia nen, ch'a preuva \"127.0.0.1\" com adrëssa IP local.", # Fuzzy
        'config-db-host-oracle' => 'TNS dla base ëd dàit:',
        'config-db-host-oracle-help' => "Anserì un [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm nòm ëd conession local] bon; n'archivi tnsnames.ora a dev esse visìbil da costa anstalassion..<br />S'a deuvra le librarìe cliente 10g o pi neuve a peul ëdcò dovré ël métod ëd nominassion [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        'config-db-wiki-settings' => 'Identìfica sta wiki',
@@ -14451,7 +14769,7 @@ Se a anstala su un servent Windows e a deuvra MySQL, dovré \"localhost\" a podr
        'config-db-name-help' => "Ch'a serna un nòm ch'a identìfica soa wiki.
 A dovrìa conten-e gnun ëspassi o tratin.
 
-S'a deuvra n'ospitalità partagià, sò fornidor ëd l'ospitalità a-j darà un nòm ëd base ëd dàit specìfich da dovré, o a lassrà ch'a lo crea via un panel ëd contròl.",
+S'a deuvra n'ospitalità partagià, sò fornidor ëd l'ospitalità a-j darà un nòm ëd base ëd dàit specìfich da dovré, o a lassrà ch'a lo crea via un panel ëd contròl.", # Fuzzy
        'config-db-name-oracle' => 'Schema dla base ëd dàit:',
        'config-db-install-account' => "Cont d'utent për l'instalassion.",
        'config-db-username' => "Nòm d'utent dla base ëd dàit:",
@@ -14465,7 +14783,7 @@ S'ël cont a esist pa, e ël cont d'instalassion a l'ha ij privilegi ch'a-i van,
        'config-db-prefix-help' => "S'a l'ha dabzògn ëd partagé na base ëd dàit an tra vàire wiki, o tra MediaWiki e n'àutra aplicassion dl'aragnà, a peul serne ëd gionté un prefiss a tùit ij nòm ëd le tàule për evité ëd conflit.
 Ch'a deuvra ni dë spassi ni ëd tratin.
 
-Cost camp a l'é lassà normalment veuid.",
+Cost camp a l'é lassà normalment veuid.", # Fuzzy
        'config-db-charset' => 'Ansema dij caràter dla base ëd dàit',
        'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binari',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
@@ -14479,7 +14797,7 @@ An '''manera UTF-8''', MySQL a arconòss an che ansema ëd caràter a son ij sò
        'config-db-port' => 'Porta dla base ëd dàit:',
        'config-db-schema' => 'Schema për MediaWiki',
        'config-db-schema-help' => "Jë schema sì-dzora a son normalment giust.
-Ch'a-j cangia mach s'a sa ch'a n'ha da manca.",
+Ch'a-j cangia mach s'a sa ch'a n'ha da manca.", # Fuzzy
        'config-sqlite-dir' => 'Dossié dij dat SQLite:',
        'config-sqlite-dir-help' => "SQLite a memorisa tùit ij dat ant n'archivi ùnich.
 
@@ -14499,7 +14817,7 @@ $1
 
 S'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré, antlora va andaré a j'istrussion dl'anliura sì-dzora për abilité ël manteniment.",
        'config-support-mysql' => "* $1 e l'é l'obietiv primari për MediaWiki e a l'é mej mantnù ([http://www.php.net/manual/en/mysql.installation.php com compilé PHP con ël manteniment MySQL])",
-       'config-support-postgres' => "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL])",
+       'config-support-postgres' => "* $1 e l'é un sistema ëd base ëd dàit popolar a sorgiss duverta com alternativa a MySQL ([http://www.php.net/manual/en/pgsql.installation.php com compilé PHP con ël manteniment ëd PostgreSQL])", # Fuzzy
        'config-support-sqlite' => "* $1 e l'é un sistema ëd base ëd dàit leger che a l'é motobin bin mantnù ([http://www.php.net/manual/en/pdo.installation.php com compilé PHP con ël manteniment ëd SQLite], a deuvra PDO)",
        'config-support-oracle' => "* $1 a l'é na base ëd dàit comersial për j'amprèise. ([http://www.php.net/manual/en/oci8.installation.php Com compilé PHP con ël manteniment OCI8])",
        'config-header-mysql' => 'Ampostassion MySQL',
@@ -14512,9 +14830,9 @@ S'a vëd pa listà sì-sota ël sistema ëd base ëd dàit ch'a preuva a dovré,
        'config-invalid-db-server-oracle' => 'TNS ëd la base ëd dat pa bon "$1".
 Dovré mach dle litre ASCII (a-z, A-Z), nùmer (0-9), sotlignadure (_) e pontin (.).',
        'config-invalid-db-name' => 'Nòm ëd la base ëd dàit pa bon "$1".
-Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).',
+Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).', # Fuzzy
        'config-invalid-db-prefix' => 'Prefiss dla base ëd dàit pa bon "$1".
-Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).',
+Dovré mach litre ASCII (a-z, A-Z), nùmer (0-9) e sotlignadure (_).', # Fuzzy
        'config-connection-error' => "$1.
 
 Controla l'ospitant, lë stranòm d'utent e la ciav sì-sota e prové torna.",
@@ -14608,7 +14926,7 @@ Specìfica un nòm utent diferent.',
        'config-admin-password-same' => "La ciav a dev nen esse l'istessa ëd lë stranòm d'utent.",
        'config-admin-password-mismatch' => "Le doe ciav che a l'ha scrivù a son diferente antra 'd lor.",
        'config-admin-email' => 'Adrëssa ëd pòsta eletrònica:',
-       'config-admin-email-help' => "Ch'a anserissa ambelessì n'adrëssa ëd pòsta eletrònica për përmëtt-je d'arsèive ëd mëssagi da d'àutri utent an sla wiki, riamposté soa ciav, e esse anformà ëd camgiament a le pàgine ch'a ten sot-euj.",
+       'config-admin-email-help' => "Ch'a anserissa ambelessì n'adrëssa ëd pòsta eletrònica për përmëtt-je d'arsèive ëd mëssagi da d'àutri utent an sla wiki, riamposté soa ciav, e esse anformà ëd camgiament a le pàgine ch'a ten sot-euj.", # Fuzzy
        'config-admin-error-user' => 'Eror antern an creand n\'aministrator con lë stranòm "<nowiki>$1</nowiki>".',
        'config-admin-error-password' => 'Eror antern an ampostand na ciav për l\'admin "<nowiki>$1</nowiki>": <pre>$2</pre>',
        'config-subscribe' => "Ch'a sot-scriva la [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista ëd discussion ëd j'anonsi ëd publicassion].",
@@ -14648,7 +14966,7 @@ A l'é generalment nen necessari për na wiki privà o d'asienda.
 S'a veul podèj dovré dij test da Wikipedia, e a veul che Wikipedia a aceta dij test copià da soa wiki, a dovrìa serne '''Creative Commons Attribution Share Alike'''.
 
 La GNU Free Documentation License a l'era la veja licensa dont sota a-i era Wikipedia.
-A l'é anco' na licensa bon-a, an tùit ij cas, sta licensa a l'ha chèich funsion ch'a rendo difìcij l'utilisassion e l'antërpretassion.",
+A l'é anco' na licensa bon-a, an tùit ij cas, sta licensa a l'ha chèich funsion ch'a rendo difìcij l'utilisassion e l'antërpretassion.", # Fuzzy
        'config-email-settings' => 'Ampostassion ëd pòsta eletrònica',
        'config-enable-email' => 'Abilité ij mëssagi ëd pòsta eletrònica an surtìa',
        'config-enable-email-help' => "S'a veul che la pòsta eletrònica a marcia, j'[http://www.php.net/manual/en/mail.configuration.php ampostassion ëd pòsta eletrònica PHP] a devo esse configurà për da bin.
@@ -14681,7 +14999,7 @@ Idealment, sòn a dovrìa pa esse acessìbil an sl'aragnà.",
        'config-logo-help' => "La pel dë stàndard ëd MediaWiki a comprend lë spassi për na marca ëd 135x160 pontin ant ël canton an àut a snista.
 Ch'a dëscaria na figura ëd la dimension aproprià, e ch'a anserissa l'anliura ambelessì.
 
-S'a veul gnun-e marche, ch'a lassa ës camp bianch.",
+S'a veul gnun-e marche, ch'a lassa ës camp bianch.", # Fuzzy
        'config-instantcommons' => 'Abìlita Instant Commons',
        'config-instantcommons-help' => "[//www.mediawiki.org/wiki/InstantCommons Instant Commons] a l'é na funsion ch'a përmët a le wiki ëd dovré dle figure, dij son e d'àutri mojen trovà an sël sit [//commons.wikimedia.org/ Wikimedia Commons].
 Për dovré sossì, MediaWiki a l'ha da manca dl'acess a la ragnà.
@@ -14700,7 +15018,7 @@ Ij sit da mesan a gròss a son motobin ancoragià a abilité sòn, e ij sit cit
        'config-cache-memcached' => "Dovré Memcached (a ciama n'ampostassion e na configurassion adissionaj)",
        'config-memcached-servers' => 'Servent Memcached:',
        'config-memcached-help' => "Lista d'adrësse IP da dovré për Memcached.
-A dovrìa esse separà con dle vìrgole e specifiché la pòrta da dovré (për esempi: 127.0.0.1:11211, 192.168.1.25:11211).",
+A dovrìa esse separà con dle vìrgole e specifiché la pòrta da dovré (për esempi: 127.0.0.1:11211, 192.168.1.25:11211).", # Fuzzy
        'config-extensions' => 'Estension',
        'config-extensions-help' => "J'estension listà dì-sota a son ëstàite trovà ant sò dossié <code>./extensions</code>.
 
@@ -14723,7 +15041,7 @@ Sauté la creassion.",
        'config-install-interwiki-list' => "As peul pa trovesse l'archivi <code>interwiki.list</code>.",
        'config-install-interwiki-exists' => "'''Avis''': La tàula interwiki a smija ch'a l'abia già dj'element.
 Për stàndard, la lista a sarà sautà.",
-       'config-install-keys' => 'Generassion ëd la ciav segreta',
+       'config-install-keys' => 'Generassion ëd la ciav segreta', # Fuzzy
        'config-install-sysop' => "Creassion dël cont ëd l'utent aministrator",
        'config-install-done' => "'''Congratulassion!'''
 A l'ha instalà për da bin mediaWiki.
@@ -14734,7 +15052,7 @@ A conten tuta soa configurassion.
 A dovrà [$1 dëscarielo] e butelo ant la bas ëd l'instalassion ëd soa wiki (ël midem dossié d'index.php).
 '''Nòta''': S'a lo fa nen adess, cost archivi ëd configurassion generà a sarà pa disponìbil për chiel pi tard s'a chita l'instalassion sensa dëscarielo.
 
-Quand che a l'é stàit fàit, a peul '''[$2 intré an soa wiki]'''.",
+Quand che a l'é stàit fàit, a peul '''[$2 intré an soa wiki]'''.", # Fuzzy
        'config-help' => 'agiut',
        'mainpagetext' => "'''MediaWiki a l'é staita anstalà a la përfession.'''",
        'mainpagedocfooter' => "Che a varda la [//meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.
@@ -14802,8 +15120,11 @@ $messages['ps'] = array(
        'config-admin-password-confirm' => 'پټنوم يو ځل بيا:',
        'config-admin-email' => 'برېښليک پته:',
        'config-profile-wiki' => 'دوديزه ويکي',
+       'config-license-pd' => 'ټولګړی شپول',
        'config-email-settings' => 'د برېښليک امستنې',
        'config-install-step-done' => 'ترسره شو',
+       'config-install-tables' => 'لښتيالونه جوړول',
+       'config-help' => 'لارښود',
        'mainpagetext' => "'''MediaWiki په برياليتوب سره نصب شو.'''",
        'mainpagedocfooter' => 'د ويکي ساوترې د کارولو د  مالوماتو په اړه [//meta.wikimedia.org/wiki/Help:Contents د کارن لارښود] سره سلا وکړۍ.
 
@@ -14912,6 +15233,7 @@ Devia [//www.mediawiki.org/wiki/Unicode_normalization_considerations actualizá-
 Se usa alojamento partilhado, peça ao fornecedor do alojamento para instalar um controlador apropriado.
 Se foi você quem compilou o PHP, reconfigure-o com um cliente de base de dados activado; por exemplo, usando <code>./configure --with-mysql</code>.
 Se instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também o módulo php5-mysql.",
+       'config-outdated-sqlite' => "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.",
        'config-no-fts3' => "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        'config-register-globals' => "'''Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está activada.'''
 '''Desactive-a, se puder.'''
@@ -14941,11 +15263,14 @@ O MediaWiki necessita do suporte UTF-8 para funcionar correctamente.",
        'config-memory-bad' => "'''Aviso:''' A configuração <code>memory_limit</code> do PHP é $1.
 Isto é provavelmente demasiado baixo.
 A instalação poderá falhar!",
+       'config-ctype' => "'''Fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].",
        'config-xcache' => '[http://xcache.lighttpd.net/ XCache] instalada',
        'config-apc' => '[http://www.php.net/apc APC] instalada',
        'config-wincache' => '[http://www.iis.net/download/WinCacheForPhp WinCache] instalada',
-       'config-no-cache' => "'''Aviso:''' Não foram encontrados [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] nem [http://www.iis.net/download/WinCacheForPhp WinCache].
+       'config-no-cache' => "'''Aviso:''' Não foi possível encontrar: [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache], nem [http://www.iis.net/download/WinCacheForPhp WinCache].
 A cache de objectos não será activada.",
+       'config-mod-security' => "'''Aviso''': O seu servidor de internet tem o [http://modsecurity.org/ mod_security] ativado. Se este estiver mal configurado, pode causar problemas ao MediaWiki ou a outros programas, permitindo que os utilizadores publiquem conteúdos arbitrários.
+Consulte a [http://modsecurity.org/documentation/ mod_security documentação] ou peça apoio ao fornecedor do alojamento do seu servidor se encontrar erros aleatórios.",
        'config-diff3-bad' => 'O GNU diff3 não foi encontrado.',
        'config-imagemagick' => 'Foi encontrado o ImageMagick: <code>$1</code>.
 Se possibilitar uploads, a miniaturização de imagens será activada.',
@@ -14960,7 +15285,7 @@ A instalação foi abortada.",
        'config-using-uri' => 'Será usada a URL do servidor "<nowiki>$1$2</nowiki>".',
        'config-uploads-not-safe' => "'''Aviso:''' O directório por omissão para uploads <code>$1</code>, está vulnerável à execução arbitrária de scripts.
 Embora o MediaWiki verifique a existência de ameaças de segurança em todos os ficheiros enviados, é altamente recomendado que [//www.mediawiki.org/wiki/Manual:Security#Upload_security vede esta vulnerabilidade de segurança] antes de possibilitar uploads.",
-       'config-no-cli-uploads-check' => "'''Aviso:''' Durante a instalação da CLI (\"Call Level Interface\", a Interface ao Nível da Chamada de Execução), o directório por omissão para uploads, <code>\$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário.",
+       'config-no-cli-uploads-check' => "'''Aviso:''' O directório por omissão para uploads, <code>\$1</code>, não é verificado para determinar se é vulnerável à execução de código arbitrário durante a instalação por CLI (\"Command-line Interface\").",
        'config-brokenlibxml' => 'O seu sistema tem uma combinação de versões de PHP e libxml2 conhecida por ser problemática, podendo causar corrupção de dados no MediaWiki e outras aplicações da internet.
 Actualize para o PHP versão 5.2.9 ou posterior e libxml2 versão 2.7.3 ou posterior ([//bugs.php.net/bug.php?id=45996 incidência reportada no PHP]).
 Instalação interrompida.',
@@ -14972,9 +15297,11 @@ Instalação interrompida.',
        'config-db-host' => 'Servidor da base de dados:',
        'config-db-host-help' => 'Se a base de dados estiver num servidor separado, introduza aqui o nome ou o endereço IP desse servidor.
 
-Se estiver a usar um servidor partilhado, o fornecedor do alojamento deve ter-lhe fornecido o nome do servidor na documentação.
+Se estiver a usar um servidor partilhado, o fornecedor do alojamento deve fornecer o nome do servidor na documentação.
+
+Se está a fazer a instalação num servidor Windows com MySQL, usar como nome do servidor "localhost" poderá não funcionar. Se não funcionar, tente usar "127.0.0.1" como endereço IP local.
 
-Se está a fazer a instalação num servidor Windows com MySQL, usar como nome do servidor "localhost" poderá não funcionar. Se não funcionar, tente usar "127.0.0.1" como endereço IP local.',
+Se estiver a usar PostgreSQL, deixe este campo em branco para fazer a ligação através de um socket Unix.',
        'config-db-host-oracle' => 'TNS (Transparent Network Substrate) da base de dados:',
        'config-db-host-oracle-help' => 'Introduza um [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Nome Local de Ligação] válido; tem de estar visível para esta instalação um ficheiro tnsnames.ora.<br />Se está a usar bibliotecas cliente versão 10g ou posterior, também pode usar o método [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Ligação Fácil] de atribuição do nome.',
        'config-db-wiki-settings' => 'Identifique esta wiki',
@@ -15349,6 +15676,7 @@ $3
 Depois de terminar o passo anterior, pode '''[$2 entrar na wiki]'''.",
        'config-download-localsettings' => 'Download do LocalSettings.php',
        'config-help' => 'ajuda',
+       'config-nofile' => 'Não foi possível encontrar o ficheiro "$1". Terá sido apagado?',
        'mainpagetext' => "'''MediaWiki instalado com sucesso.'''",
        'mainpagedocfooter' => 'Consulte o [//meta.wikimedia.org/wiki/Help:Contents Guia de Utilizadores] para informações sobre o uso do software wiki.
 
@@ -15379,7 +15707,7 @@ Esta instalação deverá ser atualizada através do <code>update.php</code>',
        '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:
 
-$ 1',
+$ 1', # Fuzzy
        'config-session-error' => 'Erro ao iniciar a sessão: $1',
        'config-session-expired' => 'Os seus dados de sessão parecem ter expirado.
 As sessões estão configuradas para uma duração de $1.
@@ -15425,7 +15753,7 @@ Em conjunto com este programa você deve ter recebido <doclink href=Copying>uma
        'config-sidebar' => '* [//www.mediawiki.org/wiki/MediaWiki/pt Página principal do MediaWiki]
 * [//www.mediawiki.org/wiki/Help:Contents/pt Ajuda]
 * [//www.mediawiki.org/wiki/Manual:Contents/pt Manual técnico]
-* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]',
+* [//www.mediawiki.org/wiki/Manual:FAQ FAQ]', # Fuzzy
        'config-env-good' => 'O ambiente foi verificado.
 Você pode instalar o MediaWiki.',
        'config-env-bad' => 'O ambiente foi verificado.
@@ -15434,8 +15762,8 @@ Você não pode instalar o MediaWiki.',
        'config-unicode-using-utf8' => 'A usar o utf8_normalize.so, de Brian Viper, para a normalização Unicode.',
        'config-unicode-using-intl' => 'Usando a [http://pecl.php.net/intl extensão intl PECL] para a normalização Unicode.',
        'config-unicode-pure-php-warning' => "'''Aviso''': A [http://pecl.php.net/intl extensão intl PECL] não está disponível para efetuar a normalização Unicode.
-Se o seu site tem um alto volume de tráfego, devia informar-se um pouco sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalização Unicode].",
-       'config-no-db' => 'Não foi possível encontrar um driver de banco de dados adequado!',
+Se o seu site tem um alto volume de tráfego, devia informar-se um pouco sobre a [//www.mediawiki.org/wiki/Unicode_normalization_considerations normalização Unicode].", # Fuzzy
+       'config-no-db' => 'Não foi possível encontrar um driver de banco de dados adequado!', # Fuzzy
        'config-no-fts3' => "' ' 'Aviso' ' ': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.",
        'config-register-globals' => "' ' 'Aviso: A opção <code>[http://php.net/register_globals register_globals]</code> do PHP está ativada.'''
 ' ' 'Desative-a, se puder.'''
@@ -15443,7 +15771,7 @@ O MediaWiki funcionará mesmo assim, mas o seu servidor ficará exposto a potenc
        'config-logo-help' => 'O tema padrão do MediaWiki inclui espaço para um logotipo de 135x160 pixels no canto superior esquerdo.
 Faça o upload de uma imagem com estas dimensões e introduza aqui a URL dessa imagem.
 
-Se você não pretende usar um logotipo, deixe este campo em branco.',
+Se você não pretende usar um logotipo, deixe este campo em branco.', # Fuzzy
        'mainpagetext' => "'''MediaWiki instalado com sucesso.'''",
        'mainpagedocfooter' => 'Consulte o [//meta.wikimedia.org/wiki/Help:Contents Manual de Usuário] para informações de como usar o software wiki.
 
@@ -15454,7 +15782,8 @@ Se você não pretende usar um logotipo, deixe este campo em branco.',
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussão com avisos de novas versões do MediaWiki]',
 );
 
-/** Quechua (Runa Simi) */
+/** Quechua (Runa Simi)
+ */
 $messages['qu'] = array(
        'mainpagetext' => "'''MediaWiki nisqa llamp'u kaqqa aypaylla takyachisqañam.'''",
        'mainpagedocfooter' => "Wiki llamp'u kaqmanta willasunaykipaqqa [//meta.wikimedia.org/wiki/Help:Contents Ruraqpaq yanapana] ''(User's Guide)'' sutiyuq p'anqata qhaway.
@@ -15466,7 +15795,8 @@ $messages['qu'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Romagnol (Rumagnôl) */
+/** Romagnol (Rumagnôl)
+ */
 $messages['rgn'] = array(
        'mainpagetext' => "'''L'instalaziòn d'MediaWiki l'è andêda ben'''",
 );
@@ -15513,8 +15843,18 @@ $messages['ro'] = array(
        'config-header-sqlite' => 'Setări SQLite',
        'config-header-oracle' => 'Setări Oracle',
        'config-missing-db-name' => 'Trebuie să introduci o valoare pentru „Numele bazei de date”',
+       'config-mysql-engine' => 'Motor de stocare:',
+       'config-mysql-innodb' => 'InnoDB',
+       'config-mysql-myisam' => 'MyISAM',
+       'config-site-name-blank' => 'Introduceți un nume pentru sit.',
        'config-ns-generic' => 'Proiect',
        'config-admin-password' => 'Parolă:',
+       'config-optional-continue' => 'Adresează-mi mai multe întrebări.',
+       'config-optional-skip' => 'Sunt deja plictisit, doar instalează wikiul.',
+       'config-profile-wiki' => 'Wiki tradițional',
+       'config-profile-private' => 'Wiki privat',
+       'config-email-settings' => 'Setări pentru e-mail',
+       'config-install-step-done' => 'realizat',
        'mainpagetext' => "'''Programul Wiki a fost instalat cu succes.'''",
        'mainpagedocfooter' => 'Consultați [//meta.wikimedia.org/wiki/Help:Contents Ghidul utilizatorului (en)] pentru informații despre utilizarea software-ului wiki.
 
@@ -16118,7 +16458,8 @@ $messages['sa'] = array(
        'mainpagetext' => 'मीडियाविकि तु सफलतया अन्तःस्थापितमस्ति',
 );
 
-/** Sakha (саха тыла) */
+/** Sakha (саха тыла)
+ */
 $messages['sah'] = array(
        'mainpagetext' => "'''«MediaWiki» сөпкө туруорулунна.'''",
        'mainpagedocfooter' => 'Биики программатын туһунан [//meta.wikimedia.org/wiki/Help:Contents справочникка] көрүөххүн сөп.
@@ -16137,7 +16478,8 @@ $messages['sc'] = array(
        'mainpagetext' => "'''MediaWiki est stadu installadu in modu currègidu.'''",
 );
 
-/** Sicilian (sicilianu) */
+/** Sicilian (sicilianu)
+ */
 $messages['scn'] = array(
        'mainpagetext' => "'''Nstallazzioni di MediaWiki cumplitata currettamenti.'''",
        'mainpagedocfooter' => "Pi favuri taliari [//meta.wikimedia.org/wiki/Help:Contents Guida utenti] pi aiutu supra l'usu e la cunfigurazzioni di stu software wiki.
@@ -16148,7 +16490,8 @@ $messages['scn'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list dî rilassi di MediaWiki]",
 );
 
-/** Scots (Scots) */
+/** Scots (Scots)
+ */
 $messages['sco'] = array(
        'mainpagetext' => "'''MediaWiki haes been installit wi speed.'''",
        'mainpagedocfooter' => "Aks the [//meta.wikimedia.org/wiki/Help:Contents Uiser's Manual] for speirins aboot using the wiki saftware.
@@ -16160,7 +16503,8 @@ $messages['sco'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki releese mailin leet]",
 );
 
-/** Sassaresu (Sassaresu) */
+/** Sassaresu (Sassaresu)
+ */
 $messages['sdc'] = array(
        'mainpagetext' => "'''Isthallazioni di MediaWiki accabadda currentementi.'''",
        'mainpagedocfooter' => "Cunsultha la [//meta.wikimedia.org/wiki/Aggiuddu:Summàriu Ghia utenti] pa maggiori infuimmazioni i l'usu di chisthu software wiki.
@@ -16173,7 +16517,8 @@ Li sighenti cullegamenti so in linga ingrese:
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annùnzii MediaWiki]",
 );
 
-/** Cmique Itom (Cmique Itom) */
+/** Cmique Itom (Cmique Itom)
+ */
 $messages['sei'] = array(
        'mainpagetext' => "'''MediaWiki coccebj installöx successua zo mii.'''",
 );
@@ -16267,8 +16612,17 @@ $messages['si'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce මීඩියාවිකි නිකුතුව තැපැල් ලැයිස්තුව]',
 );
 
-/** Slovak (slovenčina) */
+/** Slovak (slovenčina)
+ * @author Kusavica
+ */
 $messages['sk'] = array(
+       'config-your-language' => 'Váš jazyk:',
+       'config-wiki-language' => 'Wiki jazyk:',
+       'config-back' => '← Späť',
+       'config-continue' => 'Pokračovať →',
+       'config-page-language' => 'Jazyk',
+       'config-download-localsettings' => 'Stiahnuť LocalSettings.php',
+       'config-nofile' => 'Súbor "$1" sa nenašiel. Bol zmazaný?',
        'mainpagetext' => "'''Softvér MediaWiki bol úspešne nainštalovaný.'''",
        'mainpagedocfooter' => 'Informácie ako používať wiki softvér nájdete v [//meta.wikimedia.org/wiki/Help:Contents Používateľskej príručke].
 
@@ -16281,6 +16635,7 @@ $messages['sk'] = array(
 
 /** Slovenian (slovenščina)
  * @author Dbc334
+ * @author Eleassar
  */
 $messages['sl'] = array(
        'config-desc' => 'Namestitveni program za MediaWiki',
@@ -16452,7 +16807,7 @@ Sedaj lahko preskočite preostalo konfiguriranje in zdaj namestite wiki.',
        'config-profile-no-anon' => 'Zahtevano je ustvarjanje računa',
        'config-profile-fishbowl' => 'Samo pooblaščeni urejevalci',
        'config-profile-private' => 'Zasebni wiki',
-       'config-license' => 'Avtorske pravice in dovoljenje:',
+       'config-license' => 'Avtorske pravice in licenca:',
        'config-license-none' => 'Brez noge dovoljenja',
        'config-license-cc-by-sa' => 'Creative Commons Priznanje avtorstva-Deljenje pod enakimi pogoji',
        'config-license-cc-by' => 'Creative Commons Priznanje avtorstva',
@@ -16474,7 +16829,7 @@ Najbolje je, da mapa ni dostopna preko spleta.',
        'config-cc-error' => 'Izbirnik dovoljenja Creative Commons ni vrnil nobenih rezultatov.
 Vnesite ime dovoljenja ročno.',
        'config-cc-again' => 'Izberi ponovno ...',
-       'config-cc-not-chosen' => 'Izberite dovoljenje Creative Commons, ki ga želite dodati, in kliknite »proceed«.',
+       'config-cc-not-chosen' => 'Izberite licenco Creative Commons, ki jo želite uporabiti, in kliknite »proceed«.',
        'config-advanced-settings' => 'Napredna konfiguracija',
        'config-cache-accel' => 'Predpomnjenje predmetov PHP (APC, XCache ali WinCache)',
        'config-cache-memcached' => 'Uporabi Memcached (zahteva dodatno namestitev in konfiguracijo)',
@@ -16520,7 +16875,8 @@ $messages['so'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Albanian (shqip) */
+/** Albanian (shqip)
+ */
 $messages['sq'] = array(
        'mainpagetext' => "'''MediaWiki software u instalua me sukses.'''",
        'mainpagedocfooter' => 'Për më shumë informata rreth përdorimit të softwerit wiki , ju lutem shikoni [//meta.wikimedia.org/wiki/Help:Contents dokumentacionin përkatës].
@@ -16531,12 +16887,39 @@ $messages['sq'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Njoftime rreth MediaWiki-t]',
 );
 
-/** Serbian (Cyrillic script) (‪српски (ћирилица)‬)
+/** Serbian (Cyrillic script) (српски (ћирилица)‎)
  * @author Rancher
+ * @author Михајло Анђелковић
  */
 $messages['sr-ec'] = array(
+       'config-session-error' => 'Грешка при започињању сесије: $1',
+       'config-session-expired' => 'Ваши подаци о сесији су истекли.
+Сесије су подешене да трају $1.
+Њихов рок можете повећати постављањем <code>session.gc_maxlifetime</code> у php.ini.
+Поново покрените инсталацију.',
+       '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-copying' => 'Умножавање',
+       'config-page-upgradedoc' => 'Надоградња',
+       'config-page-existingwiki' => 'Постојећи вики',
+       'config-help-restart' => 'Желите ли да обришете све сачуване податке које сте унели и поново покренете инсталацију?',
+       'config-restart' => 'Да, покрени поново',
        'config-type-mysql' => 'MySQL',
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
@@ -16550,10 +16933,37 @@ $messages['sr-ec'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Дописна листа о издањима Медијавикија]',
 );
 
-/** Serbian (Latin script) (‪srpski (latinica)‬) */
+/** Serbian (Latin script) (srpski (latinica)‎)
+ */
 $messages['sr-el'] = array(
+       'config-session-error' => 'Greška pri započinjanju sesije: $1',
+       'config-session-expired' => 'Vaši podaci o sesiji su istekli.
+Sesije su podešene da traju $1.
+Njihov rok možete povećati postavljanjem <code>session.gc_maxlifetime</code> u php.ini.
+Ponovo pokrenite instalaciju.',
+       'config-no-session' => 'Vaši podaci o sesiji su izgubljeni!
+Proverite Vaš php.ini i obezbedite da je <code>session.save_path</code> postavljen na odgovarajući direktorijum.',
+       'config-your-language' => 'Vaš jezik:',
+       'config-your-language-help' => 'Izaberite jezik koji želite da koristite tokom instalacije.',
+       'config-wiki-language' => 'Jezik vikija:',
+       'config-wiki-language-help' => 'Izaberite jezik na kom će biti sadržaj vikija.',
+       'config-back' => '← Nazad',
        'config-continue' => 'Nastavi →',
        'config-page-language' => 'Jezik',
+       'config-page-welcome' => 'Dobro došli na MedijaViki!',
+       'config-page-dbconnect' => 'Povezivanje sa bazom podataka',
+       'config-page-upgrade' => 'Nadogradnja postojeće instalacije',
+       'config-page-dbsettings' => 'Podešavanja baze podataka',
+       'config-page-name' => 'Naziv',
+       'config-page-options' => 'Postavke',
+       'config-page-install' => 'Instaliraj',
+       'config-page-complete' => 'Završeno!',
+       'config-page-restart' => 'Ponovno pokretanje instalacije',
+       'config-page-copying' => 'Umnožavanje',
+       'config-page-upgradedoc' => 'Nadogradnja',
+       'config-page-existingwiki' => 'Postojeći viki',
+       'config-help-restart' => 'Želite li da obrišete sve sačuvane podatke koje ste uneli i ponovo pokrenete instalaciju?',
+       'config-restart' => 'Da, pokreni ponovo',
        'config-type-mysql' => 'MySQL',
        'config-type-postgres' => 'PostgreSQL',
        'config-type-sqlite' => 'SQLite',
@@ -16567,7 +16977,8 @@ $messages['sr-el'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mejling lista o izdanjima MedijaVikija]',
 );
 
-/** Sranan Tongo (Sranantongo) */
+/** Sranan Tongo (Sranantongo)
+ */
 $messages['srn'] = array(
        'mainpagetext' => "'''MediaWiki seti kon bun.'''",
        'mainpagedocfooter' => 'Luku na ini a [//meta.wikimedia.org/wiki/Help:Yepi yepibuku] fu si fa fu kebrouki a wikisoftware.
@@ -16579,7 +16990,8 @@ $messages['srn'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Boskopu grupu gi nyun meki]',
 );
 
-/** Swati (SiSwati) */
+/** Swati (SiSwati)
+ */
 $messages['ss'] = array(
        'mainpagetext' => "'''i-MediaWiki seyifakeke ngalokuphelele.'''",
 );
@@ -16592,7 +17004,8 @@ $messages['stq'] = array(
        'mainpagedocfooter' => 'Sjuch ju [//meta.wikimedia.org/wiki/MediaWiki_localization Dokumentation tou de Anpaasenge fon dän Benutseruurfläche] un dät [//meta.wikimedia.org/wiki/Help:Contents Benutserhondbouk] foar Hälpe tou ju Benutsenge un Konfiguration.',
 );
 
-/** Sundanese (Basa Sunda) */
+/** Sundanese (Basa Sunda)
+ */
 $messages['su'] = array(
        'mainpagetext' => "'''''Software'' MediaWiki geus diinstal.'''",
        'mainpagedocfooter' => "Mangga tingal ''[//meta.wikimedia.org/wiki/MediaWiki_localisation documentation on customizing the interface]'' jeung [//meta.wikimedia.org/wiki/MediaWiki_User%27s_Guide Tungtunan Pamaké] pikeun pitulung maké jeung konfigurasi.",
@@ -16853,7 +17266,8 @@ $messages['ta'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce மீடியாவிக்கி வெளியீடு மின்னஞ்சல் பட்டியல்]',
 );
 
-/** Tulu (ತುಳು) */
+/** Tulu (ತುಳು)
+ */
 $messages['tcy'] = array(
        'mainpagetext' => "'''ಮೀಡಿಯವಿಕಿ ಯಶಸ್ವಿಯಾದ್ ಇನ್’ಸ್ಟಾಲ್ ಆಂಡ್.'''",
        'mainpagedocfooter' => 'ವಿಕಿ ತಂತ್ರಾಂಶನ್ ಉಪಗೋಗ ಮನ್ಪುನ ಬಗ್ಗೆ ಮಾಹಿತಿಗ್ [//meta.wikimedia.org/wiki/Help:Contents ಸದಸ್ಯೆರ್ನ ನಿರ್ದೇಶನ ಪುಟ] ತೂಲೆ.
@@ -16902,6 +17316,7 @@ $messages['te'] = array(
        'config-mysql-utf8' => 'UTF-8',
        'config-site-name' => 'వికీ యొక్క పేరు:',
        'config-ns-other' => 'ఇతర (ఇవ్వండి)',
+       'config-ns-other-default' => 'నావికీ',
        'config-admin-name' => 'మీ పేరు:',
        'config-admin-password' => 'సంకేతపదం:',
        'config-admin-password-confirm' => 'సంకేతపదం మళ్ళీ:',
@@ -16914,6 +17329,7 @@ $messages['te'] = array(
        'config-license-pd' => 'సార్వజనీనం',
        'config-email-settings' => 'ఈ-మెయిల్ అమరికలు',
        'config-upload-deleted' => 'తొలగించిన దస్త్రాల కొరకు సంచయం:',
+       'config-advanced-settings' => 'ఉన్నత స్వరూపణం',
        'config-install-step-done' => 'పూర్తయింది',
        'config-install-step-failed' => 'విఫలమైంది',
        'config-help' => 'సహాయం',
@@ -16935,7 +17351,8 @@ $messages['tet'] = array(
        'config-page-name' => 'Naran',
 );
 
-/** Tajik (Cyrillic script) (тоҷикӣ) */
+/** Tajik (Cyrillic script) (тоҷикӣ)
+ */
 $messages['tg-cyrl'] = array(
        'mainpagetext' => "'''Нармафзори МедиаВики бо муваффақият насб шуд.'''",
        'mainpagedocfooter' => 'Аз [//meta.wikimedia.org/wiki/Help:Contents Роҳнамои Корбарон] барои истифодаи нармафзори вики кӯмак бигиред.
@@ -16993,9 +17410,12 @@ $messages['tk'] = array(
  * @author Sky Harbor
  */
 $messages['tl'] = array(
-       'config-desc' => 'Ang instalador para sa MediaWiki',
+       'config-desc' => 'Ang tagapagluklok para sa MediaWiki',
        'config-title' => 'Instalasyong $1 ng MediaWiki',
        'config-information' => 'Kabatiran',
+       'config-localsettings-upgrade' => 'Napansin ang isang talaksang <code>LocalSettings.php</code>.
+Upang maitaas ang uri ng pagluluklok na ito, paki ipasok ang halaga ng <code>$wgUpgradeKey</code> sa loob ng kahong nasa ibaba.
+Matatagpuan mo ito sa loob ng LocalSettings.php.',
        'config-localsettings-cli-upgrade' => 'Napansin ang isang talaksan ng LocalSettings.php.
 Upang isapanahon ang pagtatalagang ito, mangyaring patakbuhin sa halip ang update.php',
        'config-localsettings-key' => 'Susi ng pagsasapanahon:',
@@ -17007,7 +17427,15 @@ $1',
        'config-localsettings-incomplete' => 'Lumilitaw na hindi pa buo ang umiiral na LocalSettings.php.
 Ang pabagu-bagong $1 ay hindi nakatakda.
 Mangyaring baguhin ang  LocalSettings.php upang ang maitakda ang pagpapabagu-bagong ito, at pindutin ang "Magpatuloy".',
+       'config-localsettings-connection-error' => 'Isang kamalian ang nakatagpo noong kumakabit sa kalipunan ng dato na ginagamit ang tinukoy na mga katakdaan sa loob ng LocalSettings.php o
+AdminSettings.php. Paki kumpunihin ang mga katakdaang ito at subukang muli.
+
+$1',
        'config-session-error' => 'Kamalian sa pagsisimula ng sesyon: $1',
+       'config-session-expired' => 'Tila nagwakas na ang inilaan sa iyong panahon ng dato.
+Ang inilaang mga panahon ay iniayos para sa isang panahon ng buhay na $1.
+Mapapataas mo ito sa pamamagitan ng pagtatakda ng <code>session.gc_maxlifetime</code> sa loob ng php.ini.
+Muling simulan ang proseso ng pagluluklok.',
        'config-no-session' => 'Nawala ang iyong datos ng sesyon!
 Suriin ang iyong php.ini at tiyakin na ang <code>session.save_path</code> ay nakatakda sa angkop na direktoryo.',
        'config-your-language' => 'Ang wika mo:',
@@ -17064,54 +17492,157 @@ Hindi mo mailuklok ang MediaWiki.',
 Subalit, nangangailangan ang MediaWiki ng PHP $2 o mas mataas pa.',
        'config-unicode-using-utf8' => 'Ginagamit ang utf8_normalize.so ni Brion Vibber para sa pagpapanormal ng Unikodigo.',
        'config-unicode-using-intl' => 'Ginagamit ang [http://pecl.php.net/intl intl dugtong na PECL] para sa pagsasanormal ng Unikodigo.',
+       'config-unicode-pure-php-warning' => "'''Babala''': Ang [http://pecl.php.net/intl dugtong ng internasyunal na PECL] ay hindi makukuha upang makapanghawak ng pagpapanormal ng Unikodigo, na babagsak na pabalik sa mabagal na pagsasakatuparan ng dalisay na PHP.
+Kapag nagpapatakbo ka ng isang pook na mataas ang trapiko, dapat kang bumasa ng kaunti hinggil sa [//www.mediawiki.org/wiki/Unicode_normalization_considerations pagpapanormal ng Unikodigo].",
+       'config-unicode-update-warning' => "'''Babala''': Ang nakaluklok na bersiyon ng pambalot ng pagpapanormal ng Unikodigo ay gumagamit ng isang mas matandang bersiyon ng aklatan ng [http://site.icu-project.org/ proyekto ng ICU].
+Dapat kang [//www.mediawiki.org/wiki/Unicode_normalization_considerations magtaas ng uri] kung may pag-aalala ka hinggil sa paggamit ng Unikodigo.",
        'config-no-db' => 'Hindi matagpuan ang isang angkop na tagapagmaneho ng kalipunan ng datos! Kailangan mong magluklok ng isang tagapagmaneho ng kalipunan ng dato para sa PHP.
 Tinatangkilik ang sumusunod na mga uri ng kalipunan ng dato: $1.
 
 Kung ikaw ay nasa isang pinagsasaluhang pagpapasinaya, hilingin sa iyong tagapagbigay ng pagpapasinaya na iluklok ang isang angkop na tagapagmaneho ng kalipunan ng dato.
 Kung ikaw mismo ang nangalap ng PHP, muling isaayos ito na pinagagana ang isang kliyente ng kalipunan ng dato, halimbawa na ang paggamit ng <code>./configure --with-mysql</code>.
 Kung iniluklok mo ang PHP mula sa isang pakete ng Debian o Ubuntu, kung gayon kailangan mo ring magluklok ng modyul na php5-mysql.',
+       'config-outdated-sqlite' => "'''Babala''': mayroong kang $1 ng SQLite, na mas mababa kaysa sa pinaka mababang kailangang bersiyon na $2. Magiging hindi makukuha ang SQLite.",
+       'config-no-fts3' => "'''Warning''': Ang SQLite ay hindi itinala at tinipon na wala ang [//sqlite.org/fts3.html modulong FTS3], ang mga tampok na panghanap ay magiging hindi makukuha sa ibabaw ng panlikod na dulong ito.",
+       'config-register-globals' => "'''Babala: Ang mapipili na <code>[http://php.net/register_globals register_globals]</code> ng PHP ay pinagagana.'''
+'''Huwag paganahin kung kaya mo.'''
+Aandar ang MediaWiki, subalit ang tagapaghain mo ay nakalantad sa maaaring maganap na mga kahinaang pangkatiwasayan.",
+       'config-magic-quotes-runtime' => "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]!'''
+Ang piniling ito ay hindi mahuhulaan na pipinsala sa lahok na dato.
+Hindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na gumagana ang pinili na ito.",
+       'config-magic-quotes-sybase' => "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-sybase magic_quotes_sybase]!'''
+Hindi mahuhulaan na sinisira ng napiling ito ang lahok na dato.
+Hindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
+       'config-mbstring' => "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''
+Ang napiling ito ay nagdurulot ng mga kamalian at maaaring sumira nang hindi nahuhulaan ang dato.
+Hindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
+       'config-ze1' => "'''Malubha: Masigla ang [http://www.php.net/manual/en/ini.core.php zend.ze1_compatibility_mode]!'''
+Ang napiling ito ay nagsasanhi ng karima-rimarim na mga sira sa MediaWiki.
+Hindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.",
+       'config-safe-mode' => "'''Babala:''' Masigla ang [http://www.php.net/features.safe-mode safe mode] ng PHP.
+Maaari itong magdulot ng mga suliranin, partikular na kung gumagamit ng mga ikinargang paitaas na talaksan at ng suporta sa <code>math</code>.",
+       'config-xml-bad' => 'Nawawala ang modulong XML ng PHP.
+Nangangailangan ang MediaWiki ng mga tungkulin sa loob ng modulong ito at hindi aandar sa loob ng ganitong pagkakaayos.
+Kung pinapatakbo mo ang Mandrake, iluklok ang pakete ng php-xml.',
+       'config-pcre' => 'Tila nawawala ang modyul na pangsuporta ng PCRE.
+Nangangailangan ang MediaWiki ng nakaukol sa Perl na mga tungkulin ng karaniwang pagsasaad upang gumana.',
+       'config-pcre-no-utf8' => "'''Malubha''': Tila tinipon ang modyul na PCRE ng PHP na wala ang suporta ng PCRE_UTF8.
+Nangangailangan ang MediaWiki ng suporta ng UTF-8 upang maging tama ang pag-andar.",
        'config-memory-raised' => 'Ang <code>hangganan_ng_alaala</code> ng PHP ay $1, itinaas sa $2.',
        'config-memory-bad' => "'''Babala:''' Ang <code>hangganan_ng_alaala</code> ng PHP ay $1.
 Ito ay maaaring napakababa.
 Maaaring mabigo ang pagluluklok!",
+       'config-ctype' => "'''Maluba''': Dapat na tipunin ang PHP na mayroong suporta para sa [http://www.php.net/manual/en/ctype.installation.php dugtong Ctype].",
        'config-xcache' => 'Ininstala na ang [http://xcache.lighttpd.net/ XCache]',
        'config-apc' => 'Ininstala na ang [http://www.php.net/apc APC]',
        'config-wincache' => 'Ininstala na ang [http://www.iis.net/download/WinCacheForPhp WinCache]',
        'config-no-cache' => "'''Babala:''' Hindi mahanap ang [http://www.php.net/apc APC], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].
 Hindi pinapagana ang pagbabaon ng mga bagay.",
+       'config-mod-security' => "'''Babala''': Ang tagapaghain mo ng sangkasaputan ay pinagana na mayroong [http://modsecurity.org/ mod_security]. Kung mali ang kaayusan, makapagdurulot ito ng mga suliranin para sa MediaWiki o ibang mga sopwer na nagpapahintulot sa mga tagagamit na magpaskil ng hindi makatwirang nilalaman.
+Sumangguni sa [http://modsecurity.org/documentation/ mod_security kasulatan] o makipag-ugnayan sa suporta ng iyong tagapagpasinaya kapag nakatagpo ng alin mang mga kamalian.",
        'config-diff3-bad' => 'Hindi natagpuan ang GNU diff3.',
        'config-imagemagick' => 'Natagpuan ang ImageMagick: <code>$1</code>.
+Papaganahin ang pagkakagyat ng larawan kapag pinagana mo ang mga pagkakargang paitaas.',
+       'config-gd' => 'Natagpuan ang pinasadyang nakapaloob na grapiks ng GD.
 Papaganahin ang pagkakagyat ng larawan kapag pinagana mo ang mga pagkakargang paitaas.',
        'config-no-scaling' => 'Hindi matagpuan ang aklatang GD o ImageMagick.
 Hindi papaganahin ang pagkakagyat ng larawan.',
        'config-no-uri' => "'''Kamalian:''' Hindi matukoy ang kasalukuyang URI.
 Pinigilan ang pag-iinstala.",
+       'config-no-cli-uri' => "'''Babala''': Walang tinukoy na --landas ng panitik, ginagamit ang likas na katakdaan: <code>$1</code>.",
+       'config-using-server' => 'Ginagamit ang pangalan ng tagapaghain na "<nowiki>$1</nowiki>".',
+       'config-using-uri' => 'Ginagamit ang URL ng tagapaghain na "<nowiki>$1$2</nowiki>".',
+       'config-uploads-not-safe' => "'''Babala:''' Ang iyong likas na nakatakdang direktoryo para sa paitaas na mga pagkakarga na <code>$1</code> ay may kahinaan laban sa pagsasagawa ng mga panitiki na hindi makatwiran. Bagaman sinisiyasat ng MediaWiki ang lahat ng paitaas na naikargang mga talaksan para sa mga panganib na pangkatiwasayan, mataas na iminumungkahi na [//www.mediawiki.org/wiki/Manual:Security#Upload_security isara ang kahinaang ito na pangkatiwasayan] bago paganahin ang paitaas na mga pagkakarga.",
+       'config-no-cli-uploads-check' => "'''Babala:''' Ang iyong likas na nakatakdang direktoryo para sa paitaas na mga pagkakarga (<code>$1</code>) ay hindi nasuri para sa kahinaan laban sa pagsasagawa ng panitik na hindi makatwiran habang iniluluklok ang Ugnayang Mukha ng Guhit ng Kaataasan o Command-Line Interface (CLI).",
+       'config-brokenlibxml' => "Ang sistema mo ay mayroong isang pagsasama ng mga bersiyon ng PHP at libxml2 na maaaring masurot at maaaring makapagsanhi ng pagkasira ng datong nakakubli sa loob ng MediaWiki at iba pang mga aplikasyon ng sangkasaputan.
+Magtaas ng uri upang maging PHP 5.2.9 o mas lalong huli at libxml2 2.7.3 o mas lalong huli ([//bugs.php.net/bug.php?id=45996 isinalansan ang surot o ''bug'' na mayroong PHP]). Binigo ang pagluluklok.",
+       'config-using531' => 'Hindi maaaring gamitin ang MediaWiki na kapiling ang PHP na $1 dahil sa isang surot na kinasasangkutan ng mga parametrong pangsangguni sa <code>__call()</code>. Magtaas ng uri upang maging PHP 5.3.2 o mas mataas, o magbaba ng uri upang maging PHP 5.3.0 upang malutas ito. Binigo ang pagluluklok.',
+       'config-suhosin-max-value-length' => 'Nakaluklok ang Suhosin at hinahanggahan ang haba ng parametro ng GET sa $1 mga byte. Ang sangkap na ResourceLoader ng MediaWiki ay gagana sa paligid ng hangganang ito, subalit pasasamain nito ang pagganap. Kung talagang maaari, dapat mong itakda ang suhosin.get.max_value_length upang maging 1024 o mas mataas sa loob ng php.ini, at itakda ang $wgResourceLoaderMaxQueryLength sa katulad na halaga sa loob ng LocalSettings.php.',
        'config-db-type' => 'Uri ng kalipunan ng datos:',
        'config-db-host' => 'Tagapagpasinaya ng kalipunan ng datos:',
+       'config-db-host-help' => 'Kung ang iyong tagapaghain ng kalipunan ng dato ay nasa ibabaw ng isang ibang tagapaghain, ipasok ang pangalan ng tagapagpasinaya o tirahan ng IP dito.
+
+Kung gumagamit ka ng pinagsasaluhang pagpapasinaya ng sangkasaputan, dapat ibigay sa iyo ng iyong tagapagbigay ng pagpapasinaya ang tamang pangalan ng tagapagpasinaya sa loob ng kanilang kasulatan.
+
+Kapag nagluluklok ka sa ibabaw ng isang tagapaghain ng Windows at gumagamit ng MySQL, maaaring hindi gumana ang paggamit ng "localhost" para sa pangalan ng tagapaghain. Kung hindi, subukan ang "127.0.0.1" para sa katutubong tirahan ng IP.
+
+Kapag gumagamit ka ng PostgreSQL, iwanang walang laman ang hanay na ito upang kumabit sa pamamagitan ng bokilya ng Unix.',
        'config-db-host-oracle' => 'TNS ng kalipunan ng dato:',
+       'config-db-host-oracle-help' => 'Magpasok ng isang katanggap-tanggap na [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Katutubong Pangalan ng Pagkabit]; dapat na nakikita ang isang talaksan ng tnsnames.ora sa pagluluklok na ito.<br />Kung gumagamit ka ng mga aklatan ng kliyente na 10g o mas bago, maaari mo ring gamitin ang pamamaraan ng pagpapangalan ng [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Maginhawang Pagkabit].',
        'config-db-wiki-settings' => 'Kilalanin ang wiking ito',
        'config-db-name' => 'Pangalan ng kalipunan ng dato:',
+       'config-db-name-help' => 'Pumili ng isang pangalan na pangkilala sa wiki mo.
+Hindi ito dapat maglaman ng mga patlang.
+
+Kung gumagamit ka ng pinagsasaluhang pagpapasinaya ng sangkasaputan, ang iyong tagapagbigay ng pagpapasinaya ay maaaring bigyan ka ng isang tiyak na pangalan ng kalipunan ng datong gagamitin o papayagan kang lumikha ng mga kalipunan ng dato sa pamamagitan ng isang entrepanyong pantaban.',
        'config-db-name-oracle' => 'Balangkas ng kalipunan ng dato:',
+       'config-db-account-oracle-warn' => 'Mayroong tatlong tinatangkilik na tagpo para sa pagluluklok ng Oracle bilang panlikurang hulihan ng kalipunan ng dato:
+
+Kung nais mong lumikha ng akawnt ng kalipunan ng dato bilang bahagi ng proseso ng pagluluklok, paki magbigay ng isang akawnt na mayroong gampanin ng SYSDBA bilang akawnt ng kalipunan ng dato para sa pagluluklok at tukuyin ang ninanais na mga kredensiyal para sa akawnt ng pagpunta sa sangkasaputan, o di kaya ay maaaring kinakamay na lumikha ng akawnt ng pagpunta sa sangkasaputan at ibigay lamang ang akawnt na iyan (kung mayroong ito ng kinakailangang mga pahintulot upang malikha ang mga bagay na pampagpapanukala) o magbigay ng dalawang magkaibang mga akawnt, isang mayroong pribilehiyo ng paglikha at isang may pagbabawal para sa pagpunta sa sangkasaputan.
+
+Ang panitik sa paglikha ng isang akawnt na mayroon ng kinakailangang mga pribilehiyo ay matatagpuan sa loob ng direktoryong "maintenance/oracle/" ng pagluluklok na ito. Pakatandaan na ang paggamit ng isang akawnt na may pagbabawal ay hindi magpapagana isa lahat ng mga kakayahang pampananatili sa piling ng likas na nakatakdang akawnt.',
        'config-db-install-account' => 'Akawnt ng tagagamit para sa pagluluklok',
        'config-db-username' => 'Pangalang pangtagagamit ng kalipunan ng dato:',
        'config-db-password' => 'Hudyat sa kalipunan ng dato:',
+       'config-db-password-empty' => 'Paki magpasok ng isang hudyat para sa bagong tagagamit ng kalipunan ng dato: $1.
+Habang maging maaari na makalikha ng mga tagagamit na walang mga hudyat, hindi ito ligtas.',
+       'config-db-install-username' => 'Ipasok ang pangalan ng tagagamit na gagamitin upang kumabit sa kalipunan ng dato habang isinasagawa ang pagluluklok.
+Hindi ito ang pangalan ng tagagamit ng akawnt ng MediaWiki; ito ang pangalan ng tagagamit para sa iyong kalipunan ng dato.',
+       'config-db-install-password' => 'Ipasok ang hudyat na gagamitin upang kumabit sa kalipunan ng dato habang isinasagawa ang pagluluklok.
+Hindi ito ang hudyat para sa akawnt ng MediaWiki; ito ang hudyat para sa iyong kalipunan ng dato.',
        'config-db-install-help' => 'Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang umugnay sa kalipunan ng dato habang isinasagawa ang pagluluklok.',
        'config-db-account-lock' => 'Gamitin ang gayun ding pangalan ng tagagamit at hudyat habang nasa normal na operasyon',
        'config-db-wiki-account' => 'Akawnt ng tagagamit para sa pangkaraniwang pagpapaandar',
+       'config-db-wiki-help' => 'Ipasok ang pangalan ng tagagamit at hudyat na gagamitin upang kumabit sa kalipunan ng dato habang nasa karaniwang pagtakbo ng wiki.
+Kung hindi umiiral ang akawnt, at ang akawnt ng pagluluklok ay mayroong sapat na mga pribilehiyo, ang akawnt na ito ng tagagamit ay lilikhain na mayroong pinaka mababang mga pribilehiyo na kailangan upang mapatakbo ang wiki.',
        'config-db-prefix' => 'Unlapi ng talahanayan ng kalipunan ng dato:',
+       'config-db-prefix-help' => 'Kung kailangan mong ibahagi ang isang kalipunan ng dato sa pagitan ng maramihang mga wiki, o sa pagitan ng MediaWiki at ibang aplikasyon ng kasaputan, maaaring piliin mo na magdagdag ng isang unlapi sa lahat ng mga pangalan ng talahanayan upang maiwasan ang mga salungatan.
+Huwag gumamit ng mga patlang.
+
+Ang hanay na ito ay karaniwang iniiwanang walang laman.',
        'config-db-charset' => 'Pangkat ng panitik ng kalipunan ng dato',
        'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binaryo',
        'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
        'config-charset-mysql4' => 'MySQL 4.0 paurong-kabagay UTF-8',
+       'config-charset-help' => "'''Babala:''' Kapag ginamit mo ang '''backwards-compatible UTF-8''' o \"nauukol na pabalik na UTF-8\" sa MySQL 4.1+, at may kasunod na pagtatabi ng pansalong kopya ng kalipunan ng dato na mayroong <code>mysqldump</code>, maaaring wasakin nito ang lahat ng mga panitik na hindi ASCII, na hindi na mababawi pa ang mga pansalong kopya.
+
+Sa '''gawi na nakahalo sa dalawa (binaryo)''', itinatabi ng MediaWiki ang tekstong UTF-8 sa kalipunan ng dato sa loob ng mga kahanayang binaryo.
+Mas kapaki-pakinabang ito kaysa sa gawi na UTF-8 ng MySQL, at nagpapahintulot sa iyo na gamitin ang buong kasaklawan ng mga panitik na Unikodigo.
+Sa '''gawi ng UTF-8''', malalaman ng MySQL kung anong pangkat ng panitik ang kinapapalooban ng iyong dato, at may kaangkupang maihaharap at mapapalitan ito, ngunit hindi ka nito papayagan na mag-imbak ng mga panitik sa ibabaw ng [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] o Saligang Patag na Kayas na Pangmaramihang Wika.",
        'config-mysql-old' => 'Hindi kailangan ang MySQL na $1 o mas bago, mayroon kang $2.',
        'config-db-port' => 'Daungan ng kalipunan ng dato:',
        'config-db-schema' => 'Panukala para sa MediaWiki',
        'config-db-schema-help' => 'Ang nasa itaas na panukala ay pangkaraniwang magiging maayos.
 Baguhin lamang ito kung alam mong kinakailangan.',
+       'config-pg-test-error' => "Hindi makakabit sa kalipunan ng dato na '''$1''': $2",
        'config-sqlite-dir' => 'Direktoryo ng dato ng SQLite:',
+       'config-sqlite-dir-help' => "Iniimbak ng SQLite ang lahat ng dato sa loob ng isang nag-iisang talaksan.
+
+Ang ibibigay mong direktoryo ay dapat na maging masusulatan ng tagapaghain ng kasaputan habang nagluluklok.
+
+'''Hindi''' ito dapat na mapuntahan sa pamamagitan ng kasaputan, ito ang dahilan kung bakit hindi namin ito inilalagay sa kung nasaan ang iyong mga talaksan ng PHP.
+
+Ang tagapagluklok ay magsusulat ng isang talaksang <code>.htaccess</code> na kasama ito, subalit kapag nabigo iyon mayroong isang tao na maaaring makakuha ng pagka nakakapunta sa iyong hilaw na kalipunan ng dato.
+Kasama riyan ang hilaw na dato ng tagagamit (mga tirahan ng e-liham, pinaghalong mga hudyat) pati na ang nabura nang mga pagbabago at iba pang may pagbabawal na dato sa ibabaw ng wiki.
+
+Isaalang-alang ang paglalagay na magkakasama ang kalipunan ng dato sa ibang lugar, halimbawa na ang sa loob ng <code>/var/lib/mediawiki/yourwiki</code>.",
        'config-oracle-def-ts' => 'Likas na nakatakdang puwang ng talahanayan:',
        'config-oracle-temp-ts' => 'Pansamantalang puwang ng talahanayan:',
+       'config-type-mysql' => 'MySQL',
+       'config-type-postgres' => 'PostgreSQL',
+       'config-type-sqlite' => 'SQLite',
+       'config-type-oracle' => 'Oracle',
        'config-type-ibm_db2' => 'DB2 ng IBM',
+       'config-support-info' => 'Sinusuportahan ng MediaWiki ang sumusunod na mga sistema ng kalipunan ng dato:
+
+$1
+
+Kung hindi mo makita ang sistema ng kalipunan ng dato na sinusubukan mong gamitin na nakatala sa ibaba, kung gayon ay sundi ang mga tagubilin na nakakawing sa itaas upang mapagana ang suporta,',
+       'config-support-mysql' => '* Ang $1 ay ang pangunahing puntirya para sa MediaWiki at ang pinaka sinusuportahan ([http://www.php.net/manual/en/mysql.installation.php paano magtipon ng PHP na mayroong suporta ng MySQL])',
+       'config-support-postgres' => '* Ang $1 ay isang bantog na sistema ng kalipunan ng dato na bukas ang pinagmulan na panghalili sa MySQL ([http://www.php.net/manual/en/pgsql.installation.php paano magtipon ng PHP na mayroong suporta ng PostgreSQL]). Maaaring mayroong ilang hindi pangunahing mga surot na natitira pa, at hindi iminumungkahi para gamitin sa loob ng isang kapaligiran ng produksiyon.',
+       'config-support-sqlite' => 'Ang $1 ay isang magaan ang timbang na sistema ng kalipunan ng dato na sinusuportahan nang napaka mainam. ([http://www.php.net/manual/en/pdo.installation.php Paano magtipon ng PHP na mayroong suporta ng SQLite], gumagamit ng PDO)',
+       'config-support-oracle' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal. ([http://www.php.net/manual/en/oci8.installation.php Paano magtipunan ng PHP na mayroong suporta ng OCI8])',
+       'config-support-ibm_db2' => '* Ang $1 ay isang kalipunan ng dato ng kasigasigang pangkalakal.',
        'config-header-mysql' => 'Mga katakdaan ng MySQL',
        'config-header-postgres' => 'Mga katakdaan ng PostgreSQL',
        'config-header-sqlite' => 'Mga katakdaan ng SQLite',
@@ -17121,14 +17652,42 @@ Baguhin lamang ito kung alam mong kinakailangan.',
        'config-missing-db-name' => 'Dapat kang magpasok ng isang halaga para sa "Pangalan ng kalipunan ng dato"',
        'config-missing-db-host' => 'Dapat kang magpasok ng isang halaga para sa "Tagapagpasinaya ng kalipunan ng dato"',
        'config-missing-db-server-oracle' => 'Dapat kang magpasok ng isang halaga para sa "TNS ng kalipunan ng dato"',
+       'config-invalid-db-server-oracle' => 'Hindi katanggap-tanggap na pangalan ng TNSng kalipunan ng dato na "$1".
+Gumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), mga salungguhit (_) at mga tuldok (.).',
        'config-invalid-db-name' => 'Hindi tanggap na pangalan ng kalipunan ng dato na "$1".
-Gumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), mga salangguhit (_) at mga gitling (-).',
+Gumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), mga salungguhit (_) at mga gitling (-).',
        'config-invalid-db-prefix' => 'Hindi tanggap na unlapi ng kalipunan ng dato na "$1".
-Gamitin lamang ang mga titik na ASCII (a-z, A-Z), mga bilang (0-9), mga salangguhit (_) at mga gitling (-).',
+Gamitin lamang ang mga titik na ASCII (a-z, A-Z), mga bilang (0-9), mga salungguhit (_) at mga gitling (-).',
        'config-connection-error' => '$1.
 
 Suriin ang punong-abala, pangalan ng tagagamit at hudyat na nasa ibaba at subukan ulit.',
+       'config-invalid-schema' => 'Hindi katanggap-tanggap na panukala para sa "$1" ng MediaWiki.
+Gumamit lamang ng mga titik ng ASCII (a-z, A-Z), mga bilang (0-9), at mga salungguhit (_).',
+       'config-db-sys-create-oracle' => 'Ang panluklok ay tumatangkilik lamang sa paggamit ng isang akawnt ng SYSDBA para sa paglikha ng isang bagong akawnt.',
+       'config-db-sys-user-exists-oracle' => 'Umiiral na ang akawnt ng tagagamit na "$1". Magagamit lamang ang SYSDBA para sa paglikha ng isang bagong akawnt!',
        'config-postgres-old' => 'Kailangan ang PostgreSQL $1 o mas bago, mayroon kang $2.',
+       'config-sqlite-name-help' => 'Pumili ng isang pangalan na pangkilala na wiki mo.
+Huwag gumamit ng mga puwang o mga gitling.
+Gagamitin ito para sa pangalan ng talaksan ng dato ng SQLite.',
+       'config-sqlite-parent-unwritable-group' => 'Hindi malikha ang direktoryo ng dato na <code><nowiki>$1</nowiki></code>, sapagkat ang magulang na direktoryong <code><nowiki>$2</nowiki></code> ay hindi masulatan ng tagapaghain ng kasaputan.
+
+Napag-alaman ng tagapagluklok kung sinong tagagamit ang kinatatakbuhan ng iyong tagapaghain ng kasaputan.
+Gawing nasusulatan nito ang <code><nowiki>$3</nowiki></code> ng direktoryo upang makapagpatuloy.
+Ito ang gawin sa ibabaw ng isang sistema ng Unix/Linux:
+
+<pre>cd $2
+mkdir $3
+chgrp $4 $3
+chmod g+w $3</pre>',
+       'config-sqlite-parent-unwritable-nogroup' => 'Hindi malikha ang direktoryo ng dato na <code><nowiki>$1</nowiki></code>, sapagkat ang magulang na direktoryong <code><nowiki>$2</nowiki></code> ay hindi masulatan ng tagapaghain ng kasaputan.
+
+Hindi malaman ng tagapagluklok kung sinong tagagamit ang kinatatakbuhan ng iyong tagapaghain ng kasaputan.
+Gawing nasusulatan nito (at ng mga iba pa) ang <code><nowiki>$3</nowiki></code> ng direktoryo upang makapagpatuloy.
+Ito ang gawin sa ibabaw ng isang sistema ng Unix/Linux:
+
+<pre>cd $2
+mkdir $3
+chmod a+w $3</pre>',
        'config-sqlite-mkdir-error' => 'Kamalian sa paglikha ng direktoryo ng datong "$1".
 Suriin ang kinalalagyan at subukang muli.',
        'config-sqlite-dir-unwritable' => 'Hindi nagawang magsulat sa direktoryong "$1".
@@ -17139,6 +17698,14 @@ Surrin ang direktoryo ng dato at pangalan ng kalipunan ng datong nasa ibaba at s
        'config-sqlite-readonly' => 'Ang talaksang <code>$1</code> ay hindi maisusulat.',
        'config-sqlite-cant-create-db' => 'Hindi malikha ang talaksang <code>$1</code> ng kalipunan ng dato.',
        'config-sqlite-fts3-downgrade' => 'Nawawala ang suportang FTS3 ng PHP, ibinababa ang uri ng mga talahanayan',
+       'config-can-upgrade' => "Mayroong mga talahanayan ng MediaWiki sa loob ng kalipunan ng datong ito.
+Upang maitaas ang uri ng mga ito upang maging MediaWiki na $1, pindutin ang '''Magpatuloy'''.",
+       'config-upgrade-done' => "Buo na ang pagtataas ng uri.
+
+Maaari mo na ngayong [$1 gamitin ang iyong wiki].
+
+Kung nais mong muling likhain ang iyong talaksang <code>LocalSettings.php</code>, lagitikin ang pindutang nasa ibaba.
+'''Hindi minumungkahi''' ito maliban na lamang kung nagkakaroon ka ng mga suliranin sa piling ng wiki mo.",
        'config-upgrade-done-no-regenerate' => 'Buo na ang pagsasapanahon.
 
 Maaari ka na ngayong [$1 magsimula sa paggamit ng wiki mo].',
@@ -17149,12 +17716,30 @@ Maaari ka na ngayong [$1 magsimula sa paggamit ng wiki mo].',
        'config-db-web-help' => 'Piliin ang pangalan ng tagagamit at hudyat na gagamitin ng tagapaghain ng web upang umugnay sa tagapaghain ng kalipunan ng dato, habang nasa pangkaraniwang pagtakbo ng wiki.',
        'config-db-web-account-same' => 'Gamitin ang gayun din akawnt katulad ng sa pagluluklok',
        'config-db-web-create' => 'Likhain ang akawnt kung hindi pa ito umiiral',
+       'config-db-web-no-create-privs' => 'Ang tinukoy mong akawnt na iluluklok ay walang sapat na mga pribilehiyo upang makalikha ng isang akawnt.
+Ang akawnt na tutukuyin mo rito ay umiiral na dapat.',
        'config-mysql-engine' => 'Makinang imbakan:',
        'config-mysql-innodb' => 'InnoDB',
        'config-mysql-myisam' => 'MyISAM',
+       'config-mysql-myisam-dep' => "'''Babala''': Pinili mo ang MyISAM bilang makinang imbakan para sa MySQL, na hindi iminumungkahi para gamitin sa MediaWiki, sapagkat:
+* bahagya lamang itong sumusuporta ng pagkakasundu-sundo dahil sa pagkakandado ng talahanayan
+* mas malaki ang pagkakataon na kapitan ng sira kaysa sa ibang mga makina
+* ang himpilang kodigo ng MediaWiki ay hindi palaging humahawak ng MyISAM ayon sa nararapat
+
+Kung ang iyong nakaluklok na MySQL ay sumusuporta ng InnoDB, higit na iminumungkahi na piliin mo iyon sa halip.
+Kung ang iyong nakaluklok na MySQL ay hindi sumusuporta ng InnoDB, marahil ay panahon na para sa isang pagtataas ng uri.",
+       'config-mysql-engine-help' => "Ang '''InnoDB''' ay ang halos palaging pinaka mainam na mapipili, dahil mayroon itong mabuting suporta ng pagkakasundu-sundo.
+
+Maaaring mas mabilis ang '''MyISAM''' sa mga pagluluklok na pang-isahang tagagamit o mababasa lamang.
+May gawi ang mga kalipunan ng dato ng MyISAM na masira nang mas madalas kaysa sa mga kalipunan ng dato ng InnoDB.",
        'config-mysql-charset' => 'Pangkat ng panitik ng kalipunan ng dato:',
        'config-mysql-binary' => 'Binaryo',
        'config-mysql-utf8' => 'UTF-8',
+       'config-mysql-charset-help' => "Sa '''gawi na binaryo''', iniimbak ng MediaWiki ang tekstong UTF-8 sa kalipunan ng dato sa loob ng mga hanay na binaryo.
+Mas kapaki-pakinabang ito kaysa sa gawi na UTF-8 ng MySQL, at nagpapahintulot sa iyo upang magamit ang buong kasaklawan ng mga panitik ng Unikodigo.
+
+Sa ''gawi na UTF-8''', malalaman ng MySQL kung sa anong pangkat ng panitik nakapaloob ang iyong dato, at angkop na makakapagharap at makapapagpalit nito, subalit hindi ka nito papayagan na mag-imbak ng mga panitik na nasa itaas ng [//en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane] o Saligang Tapyas na Pangmaramihang Wika.",
+       'config-ibm_db2-low-db-pagesize' => "Ang kalipunan mo ng dato na DB2 ay mayroong isang likas na nakatakdang puwang ng talahanayan na mayroong hindi sapat na sukat ng pahina. Ang sukat ng pahina ay dapat na maging '''32K''' o mas mataas.",
        'config-site-name' => 'Pangalan ng wiki:',
        'config-site-name-help' => "Lilitaw ito sa bareta ng pamagat ng pantingin-tingin at sa samu't saring ibang mga lugar.",
        'config-site-name-blank' => 'Magpasok ng isang pangalan ng sityo.',
@@ -17163,10 +17748,19 @@ Maaari ka na ngayong [$1 magsimula sa paggamit ng wiki mo].',
        'config-ns-site-name' => 'Katulad ng sa pangalan ng wiki: $1',
        'config-ns-other' => 'Iba pa (tukuyin)',
        'config-ns-other-default' => 'Wiki Ko',
+       'config-project-namespace-help' => 'Bilang pagsunod sa halimbawa ng Wikipedia, maraming mga wiki ang nagpapanatili ng kanilang mga pahina ng patakaran na nakahiwalay magmula sa kanilang mga pahina ng nilalaman, na nasa loob ng isang "\'\'\'puwang na pampangalan ng proyekto\'\'\'".
+Ang lahat ng mga pamagat ng pahina na nasa loob ng puwang ng pangalang ito ay nagsisimula na mayroong isang partikular na unlapi, na maaari mong tukuyin dito.
+Sa nakaugalian, ang unlaping ito ay hinango mula sa pangalan ng wiki, subalit hindi ito maaaring maglaman ng mga panitik ng palabantasan na katulad ng "#" o ":".',
+       'config-ns-invalid' => 'Ang tinukoy na puwang ng pangalan na "<nowiki>$1</nowiki>" ay hindi katanggap-tanggap.
+Tumukoy ng isang ibang puwang ng pangalan ng proyekto.',
+       'config-ns-conflict' => 'Ang tinukoy na puwang ng pangalan na "<nowiki>$1</nowiki>" ay sumasalungat sa isang likas na nakatakdang puwang ng pangalan ng MediaWiki.
+Tumukoy ng isang ibang puwang ng pangalan ng proyekto.',
        'config-admin-box' => 'Akawnt ng tagapangasiwa',
        'config-admin-name' => 'Pangalan mo:',
        'config-admin-password' => 'Hudyat:',
        'config-admin-password-confirm' => 'Hudyat uli:',
+       'config-admin-help' => 'Ipasok dito ang mas ninanais mong pangalan ng tagagamit, bilang halimbawa na ang "Joe Bloggs".
+Ito ang pangalang gagamitin mo upang lumagdang papasok sa wiki.',
        'config-admin-name-blank' => 'Magpasok ng isang pangalan ng tagagamit na tagapangasiwa.',
        'config-admin-name-invalid' => 'Ang tinukoy na pangalan ng tagagamit na "<nowiki>$1</nowiki>" ay hindi tanggap.
 Tumukoy ng ibang pangalan ng tagagamit.',
@@ -17174,10 +17768,13 @@ Tumukoy ng ibang pangalan ng tagagamit.',
        'config-admin-password-same' => 'Ang hudyat ay hindi dapat na katulad ng pangalan ng tagagamit.',
        'config-admin-password-mismatch' => 'Hindi magkatugma ang ipinasok mong dalawang mga hudyat.',
        'config-admin-email' => 'Tirahan ng e-liham:',
+       'config-admin-email-help' => 'Magpasok dito ng isang tirahan ng e-liham upang mapahintulutan kang makatanggap ng e-liham mula sa iba pang mga tagagamit sa ibabaw ng wiki, itakdang muli ang hudyat mo, at mapabatiran ng mga pagbabago sa mga pahinang nasa ibabaw ng iyong tala ng mga binabantayan. Maiiwanan mo na walang laman ang hanay na ito.',
        'config-admin-error-user' => 'Panloob na kamalian kapag nililikha ang isang tagapangasiwa na may pangalang "<nowiki>$1</nowiki>".',
        'config-admin-error-password' => 'Panloob na kamalian kapag nagtatakda ng isang hudyat na para sa tagapangasiwang "<nowiki>$1</nowiki>": <pre>$2</pre>',
        'config-admin-error-bademail' => 'Nagpasok ka ng isang hindi katanggap-tanggap na tirahan ng e-liham.',
        'config-subscribe' => 'Tumanggap mula sa [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce talaan ng mga pinadadalhan ng mga nilalabas na mga pabatid].',
+       'config-subscribe-help' => 'Isang itong tala ng pagliliham na mababa ang dami na ginagamit para sa pagpapakawala ng mga pahayag, kabilang na ang mahahalagang mga pahayag na pangkatiwasayan. Dapat kang magpasipi nito at isapanahon ang iyong nakaluklok na MediaWiki kapag lumalabas ang bagong mga bersiyon.',
+       'config-subscribe-noemail' => 'Sinubukan mong magpasipi sa tala ng nililihaman ng pagpapakawala ng mga pahayag na hindi nagbibigay ng isang tirahan ng -eliham. Paki magbigay ng isang tirahan ng e-liham kung nais mong magpasipi sa listahan ng pagliliham.',
        'config-almost-done' => 'Halos tapos ka na!
 Maaari mo ngayong laktawan ang natitira pang pag-aayos at iluklok na ang wiki ngayon.',
        'config-optional-continue' => 'Magtanong sa akin ng marami pang mga tanong.',
@@ -17187,14 +17784,41 @@ Maaari mo ngayong laktawan ang natitira pang pag-aayos at iluklok na ang wiki ng
        'config-profile-no-anon' => 'Kailangan ang paglikha ng akawnt',
        'config-profile-fishbowl' => 'Pinahintulutang mga patnugot lamang',
        'config-profile-private' => 'Pribadong wiki',
+       'config-profile-help' => "Pinaka mahusay ang pagtakbo ng mga Wiki kapag pinapahintulutan mo ang pinaka maraming mga tao na makapamatnugot ng mga ito hanggang sa maaari.
+Sa loob ng MediaWiki, maginhawang masusuring muli ang kamakailang mga pagbabago, at mapanauli sa dati ang anumang nasira na nagawa ng isang walang muwang o may masamang hangarin na mga tagagamit.
+
+Subalit, marami ang nakatagpo na nagagamit ang MediaWiki sa loob ng malawak na sari-saring mga gampanin, at kung minsan ay hindi madaling makumbinsi ang lahat ng mga tao hinggil sa kapakinabangan ng kaparaanan ng wiki.
+Kung kaya't nasa iyo ang pagpili.
+
+Ang isang '''{{int:config-profile-wiki}}''' ay nagpapahintulot sa sinuman upang makapagbago, na hindi kailangan ang paglagdang papasok.
+Ang isang wiki na mayroong '''{{int:config-profile-no-anon}}''' ay nagbibigay ng karagdagang pananagutan, subalit maaaring pumigil sa nagkataon lamang na mga tagapag-ambag.
+
+Ang tagpo na '''{{int:config-profile-fishbowl}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang  makapamatnugot.
+Ang isang '''{{int:config-profile-private}}''' ay nagpapahintulot lamang sa pinayagang mga tagagamit na makatingin ng mga pahina, na kapiling ang pangkat na pinayagang makapamatnugot.
+
+Ang mas masasalimuot na mga kaayusan ng mga karapatan ng tagagamit ay makukuha pagkaraan ng pagluluklok, tingnan ang [//www.mediawiki.org/wiki/Manual:User_rights may kaugnayang kinamay na lahok].",
        'config-license' => 'Karapatang-ari at lisensiya:',
        'config-license-none' => 'Walang talababa ng lisensiya',
        'config-license-cc-by-sa' => 'Malikhaing Pangkaraniwang Pagtukoy Pamamahaging Magkatulad',
+       'config-license-cc-by' => 'Atribusyon ng Creative Commons',
        'config-license-cc-by-nc-sa' => 'Malikhaing Pangkaraniwang Pagtukoy Hindi-Pangkalakal Pamamahaging Magkatulad',
+       'config-license-cc-0' => 'Sero na Creative Commons (Nasasakop ng Madla)',
+       'config-license-gfdl' => 'Lisensiyang 1.3 ng Malayang Dokumentasyon ng GNU o mas lalong huli',
        'config-license-pd' => 'Nasasakupan ng Madla',
        'config-license-cc-choose' => 'Pumili ng isang pasadyang Lisensiya ng Malikhaing mga Pangkaraniwan',
+       'config-license-help' => "Maraming mga pangmadlang wiki ang naglalagay ng lahat ng mga ambag sa ilalim ng [http://freedomdefined.org/Definition lisensiyang malaya]. 
+Nakakatulong ito sa paglikha ng isang diwa ng pagmamay-ari ng pamayanan at nakapanghihikayat ng ambag na pangmahabang panahon.
+Sa pangkalahatan, hindi kailangan ang isang wiking pribado o pangsamahan.
+
+Kung nais mong magamit ang teksto magmula sa Wikipedia, at nais mong makatanggap ang Wikipedia ng tekstong kinopya magmula sa wiki mo, dapat mong piliin ang '''Creative Commons Attribution Share Alike''' (Pagbanggit na Pinagsasaluhang Magkatulad ng Malikhaing Pangkaraniwan).
+
+Dating ginamit ng Wikipedia ang Lisensiya ng Kasulatang Malaya ng GNU (GNU Free Documentation License o GFDL).
+Isang katanggap-tanggap na lisensiya ang GFDL, subalit mahirap itong maunawaan.
+Mahirap din ang paggamit na muli ng nilalaman na nasa ilalim ng GFDL.",
        'config-email-settings' => 'Mga katakdaan ng e-liham',
        'config-enable-email' => 'Paganahin ang palabas na e-liham',
+       'config-enable-email-help' => 'Kung nais mong gumana ang e-liham, ang mga katakdaan ng liham ng [http://www.php.net/manual/en/mail.configuration.php PHP] ay kailangang maging wasto ang pagkakaayos.
+Kung ayaw mo nang anumang mga katampukan ng e-liham, maaari mong huwag paganahin ang mga ito rito.',
        'config-email-user' => 'Paganahin ang tagagamit-sa-tagagamit na e-liham',
        'config-email-user-help' => 'Payagan ang lahat ng mga tagagamit na magpadala ng e-liham sa bawat isa kapag pinagana nila ito sa kanilang mga nais.',
        'config-email-usertalk' => 'Paganahin ang pabatid na pampahina ng usapan ng tagagamit',
@@ -17202,31 +17826,67 @@ Maaari mo ngayong laktawan ang natitira pang pag-aayos at iluklok na ang wiki ng
        'config-email-watchlist' => 'Paganahin ang pabatid ng talaan ng bantayan',
        'config-email-watchlist-help' => 'Payagan ang mga tagagamit na tumanggap ng mga pabatid tungkol sa kanilang binabantayang mga pahina kapag pinagana nila ito sa kanilang mga nais.',
        'config-email-auth' => 'Paganahin ang pagpapatunay ng e-liham',
+       'config-email-auth-help' => "Kapag pinagagana ang mapipiling ito, dapat tiyakin ng mga tagagamit ang kanilang tirahan ng e-liham na ginagamit ang isang kawing na ipinadala sa kanila tuwing itinatakda o binabago nila ito.
+Tanging napatunayang mga tirahan ng e-liham lamang ang makakatanggap ng mga e-liham magmula sa ibang mga tagagamit o makakapagbago ng mga e-liham ng pagpapabatid.
+'''Iminumungkahi''' ang mapipiling katakdaan na ito para sa mga wiking pangmadla dahil sa maaaring mangyaring pagmamalabis ng mga katampukan ng e-liham.",
        'config-email-sender' => 'Pabalik na tirahan ng e-liham:',
+       'config-email-sender-help' => 'Ipasok ang tirahan ng e-liham na gagamitin bilang tirahang pagsasaulian ng e-liham na papalabas.
+Dito ang kung saan ipapadala ang mga pagtalbog.
+Maraming mga tagapaghain ng liham ang nangangailangan ng kahit na bahagi lamang ng pangalan ng nasasakupan upang maging katanggap-tanggap.',
        'config-upload-settings' => 'Mga pagkakarga ng mga larawan at talaksan',
        'config-upload-enable' => 'Paganahin ang pagkakarga ng talaksan',
+       'config-upload-help' => 'Ang paitaas na mga pagkakarga ng mga talaksan ay maaaring makapaglantad ng iyong tagapaghain sa mga panganib na pangkatiwasayan.
+Para sa mas marami pang kabatiran, basahin ang [//www.mediawiki.org/wiki/Manual:Security seksiyon ng katiwasayan] sa loob ng gabay.
+
+Upang mapagana ang paitaas na mga pagkakarga ng talaksan, baguhin ang gawi roon sa subdirektoryo ng <code>mga imahe</code> sa ilalim ng ugat na direktoryo ng MediaWiki upang ang tagapaghain ng kasaputan ay makapagsulat dito.
+Pagkaraan ay paganahin ang pipiliing ito.',
        'config-upload-deleted' => 'Direktoryo para sa binurang mga talaksan:',
        'config-upload-deleted-help' => 'Pumili ng isang direktoryong pagsusupnayan ng naburang mga talaksan.
 Ideyal na dapat itong  hindi mapupuntahan mula sa web.',
        'config-logo' => 'URL ng logo:',
+       'config-logo-help' => 'Ang likas na nakatakdang pabalat ng MediaWiki ay nagsasama ng puwang para sa isang logong 135x160 ang piksel na nasa itaas ng menu ng panggilid na bareta.
+Magkargang papaitaas ng isang imahe na mayroong naaangkop na sukat, at ipasok dito ang URL.
+
+Kung ayaw mo ng isang logo, iwanang walang laman ang kahong ito.',
        'config-instantcommons' => 'Paganahin ang Mga Pangkaraniwang Biglaan',
+       'config-instantcommons-help' => 'Ang [//www.mediawiki.org/wiki/InstantCommons Instant Commons] ay isang tampok na nagpapahintulot sa mga wiki upang gumamit ng mga imahe, mga tunog at iba pang mga midyang matatagpuan sa pook ng [//commons.wikimedia.org/ Wikimedia Commons].
+Upang magawa ito, nangangailangan ang MediaWiki ng pagka nakakapunta sa Internet.
+
+Para sa mas marami pang kabatiran hinggil sa tampok na ito, kabilang na ang mga tagubilin sa kung paano ito itakda para sa mga wiki na bukod pa kaysa sa Wikimedia Commons, sumangguni sa [//mediawiki.org/wiki/Manual:$wgForeignFileRepos gabay].',
        'config-cc-error' => 'Hindi nagbigay ng resulta ang pampili ng lisensiya ng Malikhaing Pangkaraniwan.
 Ipasok na kinakamay ang pangalan ng lisensiya.',
        'config-cc-again' => 'Pumili uli...',
        'config-cc-not-chosen' => 'Piliin kung anong lisensiya ng Malikhaing mga Pangkaraniwan ang nais mo at pindutin ang "magpatuloy".',
        'config-advanced-settings' => 'Mas masulong na pagkakaayos',
        'config-cache-options' => 'Mga katakdaan para sa pagtatago ng bagay:',
+       'config-cache-help' => 'Ang pagtatago ng bagay ay ginagamit upang mapainam ang tulin ng MediaWiki sa pamamagitan ng pagtatago ng madalas gamiting dato.
+Ang mga pook na bahagya hanggang malalaki ang sukat ay labis na hinihikayat na paganahin ito, at ang mga pook na maliliit ay makakakita rin ng mga kapakinabangan.',
+       'config-cache-none' => 'Walang pagtatago (tinanggal ang katungkulan, subalit maaaring maapektuhan ang tulin sa mas malalaking mga pook ng wiki)',
+       'config-cache-accel' => 'Pagtatago ng bagay ng PHP (APC, XCache o WinCache)',
+       'config-cache-memcached' => 'Gamitin ang Pagtatago sa Alaala (Memcached) (nangangailangan ng karagdagang kaayusan ng pagkakahanda at pagsasaayos)',
        'config-memcached-servers' => 'Mga tagapaghaing itinago sa alaala:',
+       'config-memcached-help' => 'Listahan ng mga tirahan ng IP na gagamitin para sa Memcached o Itinagong Alaala.
+Dapat na tukuyin na isa sa bawat guhit at tukuyin ang daungang gagamitin. Bilang halimbawa:
+ 127.0.0.1:11211
+ 192.168.1.25:1234',
        'config-memcache-needservers' => 'Pinili mo ang Memcached bilang uri mo ng taguan ngunit hindi tumukoy ng anumang mga tagapaghain.',
        'config-memcache-badip' => 'Nagpasok ka ng isang hindi tanggap na tirahan ng IP para sa Memcached: $1.',
        'config-memcache-noport' => 'Hindi ka tumukoy ng isang daungan na gagamitin para sa tagapaghain ng Memcached: $1.
 Kung hindi mo alam ang daungan, ang likas na nakatakda ay 11211.',
        'config-memcache-badport' => 'Ang bilang ng daungan ng Memcached ay dapat na nasa pagitan ng $1 at $2.',
        'config-extensions' => 'Mga dugtong',
+       'config-extensions-help' => 'Ang mga dugtong na nakalista sa ibabaw ay napansin sa loob ng iyong direktoryo ng <code>./extensions</code>.
+
+Maaaring mangailangan ang mga ito ng karagdagang kaayusan, subalit mapapagana mo ngayon ang mga ito',
+       'config-install-alreadydone' => "'''Babala:''' Tila nailuklok mo na ang MediaWiki at tinatangka mong iluklok ito ulit.
+Paki magpatuloy sa susunod na pahina.",
+       'config-install-begin' => 'Sa pamamagitan ng pagpindot sa "{{int:config-continue}}", sisimulan mo ang pagluluklok ng MediaWiki.
+Kung nais mo paring gumawa ng mga pagbabago, paki pindutin ang bumalik.',
        'config-install-step-done' => 'nagawa na',
        'config-install-step-failed' => 'nabigo',
        'config-install-extensions' => 'Isinasama ang mga karugtong',
        'config-install-database' => 'Inihahanda ang kalipunan ng dato',
+       'config-install-schema' => 'Nililikha ang panukala',
        'config-install-pg-schema-not-exist' => 'Hindi umiiral ang panukala ng PostgreSQL.',
        'config-install-pg-schema-failed' => 'Nabigo ang paglikha ng mga talahanayan.
 Tiyakin na ang tagagamit na "$1" ay maaaring makasulat sa balangkas na "$2".',
@@ -17234,11 +17894,17 @@ Tiyakin na ang tagagamit na "$1" ay maaaring makasulat sa balangkas na "$2".',
        'config-install-pg-plpgsql' => 'Sumusuri ng wikang PL/pgSQL',
        'config-pg-no-plpgsql' => 'Kailangan mong magtalaga ng wikang PL/pgSQL sa loob ng kalipunan ng datong $1',
        'config-pg-no-create-privs' => 'Ang tinukoy mong akawnt para sa pagtatalaga ay walang sapat na mga pribilehiyo upang makalikha ng isang akawnt.',
+       'config-pg-not-in-role' => 'Umiiral na ang akawnt na tinukoy mo para sa tagagamit ng sangkasaputan.
+Ang tinukoy mong akawnt para sa pagluluklok ay hindi isang tagagamit na super at hindi isang kasapi sa gampanin ng tagagamit ng sangkasaputan, kung kaya\'t hindi nito nagawang makalikha ng mga bagay na pag-aari ng tagagamit ng sangkasaputan.
+
+Sa kasalukuyan, nangangailangan ang MediaWiki na ang mga talahanayan ay maging pag-aari ng tagagamit ng sangkasaputan. Paki tumukoy ng isa pang pangalan ng akawnt na pangsangkasaputan, o pindutin ang "bumalik" at tumukoy ng isang tagagamit na may kaangkupang pribilehiyo ng pagluluklok.',
        'config-install-user' => 'Nililikha ang tagagamit ng kalipunan ng dato',
        '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-user-missing-create' => 'Hindi umiiral ang tinukoy na tagagamit na si "$1".
+Paki lagitikin ang nasa ibabang kahong natsetsekan na "likhain ang akawnt" kung nais mong likhain ito.',
        'config-install-tables' => 'Nililikha ang mga talahanayan',
        'config-install-tables-exist' => "'''Babala''': Tila umiiral na ang mga talahanayan ng MediaWiki.
 Nilalaktawan ang paglikha.",
@@ -17249,6 +17915,7 @@ Nilalaktawan ang paglikha.",
 Nilalaktawan ang likas na nakatakdang talaan.",
        'config-install-stats' => 'Sinisimulan ang estadistika',
        'config-install-keys' => 'Ginagawa ang lihim na mga susi',
+       'config-insecure-keys' => "'''Babala:''' Nalikha ang {{PLURAL:$2|A secure key|ligtas na mga susi}} ($1) habang ang pagluluklok {{PLURAL:$2|ay|ay}} hindi pa lubos na ligtas. Isaalang-alang ang kinakamay na pagbago {{PLURAL:$2|nito|ng mga ito}}.",
        'config-install-sysop' => 'Nililikha ang akawnt ng tagagamit na tagapangasiwa',
        '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',
@@ -17272,6 +17939,7 @@ $3
 Kapag nagawa na iyan, maaari ka nang '''[$2 pumasok sa wiki mo]'''.",
        'config-download-localsettings' => 'Ikargang paibaba ang LocalSettings.php',
        'config-help' => 'saklolo',
+       'config-nofile' => 'Hindi matagpuan ang talaksang "$1". Binura na ba ito?',
        'mainpagetext' => "'''Matagumpay na ininstala ang MediaWiki.'''",
        'mainpagedocfooter' => "Silipin ang [//meta.wikimedia.org/wiki/Help:Contents Patnubay sa Tagagamit] (''\"User's Guide\"'') para sa kaalaman sa paggamit ng wiking ''software''.
 
@@ -17282,7 +17950,15 @@ Kapag nagawa na iyan, maaari ka nang '''[$2 pumasok sa wiki mo]'''.",
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Tala ng mga pinadadalhan ng liham ng MediaWiki]",
 );
 
-/** Turkish (Türkçe) */
+/** толышә зывон (толышә зывон)
+ * @author Erdemaslancan
+ */
+$messages['tly'] = array(
+       'config-page-options' => 'Кукон',
+);
+
+/** Turkish (Türkçe)
+ */
 $messages['tr'] = array(
        'mainpagetext' => "'''MediaWiki başarı ile kuruldu.'''",
        'mainpagedocfooter' => 'Viki yazılımının kullanımı hakkında bilgi almak için [//meta.wikimedia.org/wiki/Help:Contents kullanıcı rehberine] bakınız.
@@ -17319,7 +17995,7 @@ $messages['tt-latn'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki'nıñ yaña versiäläre turında xäbärlär yazdırıp alu].",
 );
 
-/** Udmurt (Удмурт)
+/** Udmurt (удмурт)
  * @author Andrewboltachev
  */
 $messages['udm'] = array(
@@ -17343,6 +18019,7 @@ $messages['ug-arab'] = array(
  * @author AS
  * @author Ahonc
  * @author Alex Khimich
+ * @author Base
  * @author Diemon.ukr
  * @author Тест
  */
@@ -17389,7 +18066,7 @@ $1',
        'config-sidebar' => '* [//www.mediawiki.org Сайт MediaWiki]
 * [//www.mediawiki.org/wiki/Help:Contents/uk Керівництво користувача]
 * [//www.mediawiki.org/wiki/Manual:Contents/uk Керівництво адміністратора]
-* [//www.mediawiki.org/wiki/Manual:FAQ/uk FAQ]',
+* [//www.mediawiki.org/wiki/Manual:FAQ/uk FAQ]', # Fuzzy
        'config-env-good' => 'Перевірку середовища успішно завершено.
 Ви можете встановити MediaWiki.',
        'config-env-bad' => 'Було проведено перевірку середовища. Ви не можете встановити MediaWiki.',
@@ -17411,12 +18088,23 @@ $1',
        'config-db-name' => 'Назва бази даних:',
        'config-db-password' => 'Пароль бази даних:',
        'config-db-charset' => 'Кодування бази даних',
+       'config-charset-mysql5-binary' => 'MySQL 4.1/5.0 binary',
+       'config-charset-mysql5' => 'MySQL 4.1/5.0 UTF-8',
        'config-db-port' => 'Порт бази даних:',
+       'config-header-mysql' => 'Налаштування MySQL',
+       'config-header-postgres' => 'Налаштування PostgreSQL',
+       'config-header-sqlite' => 'Налаштування SQLite',
+       'config-header-oracle' => 'Налаштування Oracle',
+       'config-header-ibm_db2' => 'Налаштування IBM DB2',
        'config-invalid-db-type' => 'Невірний тип бази даних',
+       'config-missing-db-name' => "Ви повинні ввести значення параметру «Ім'я бази даних»",
+       'config-missing-db-host' => 'Ви повинні ввести значення параметру «Хост бази даних»',
+       'config-missing-db-server-oracle' => 'Ви повинні ввести значення параметру «TNS бази даних»',
        '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-sqlite-readonly' => 'Файл <code>$1</code> недоступний для запису.',
        'config-sqlite-cant-create-db' => 'Не вдалося створити файл бази даних <code>$1</code>.',
        'config-db-web-create' => 'Створити обліковий запис, якщо його ще не існує',
        'config-mysql-charset' => 'Кодування бази даних:',
@@ -17479,7 +18167,8 @@ $messages['ur'] = array(
        'mainpagetext' => "'''میڈیاوکی کو کامیابی سے چالو کردیا گیا ہے۔.'''",
 );
 
-/** Uzbek (Oʻzbekcha) */
+/** 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.
@@ -17507,7 +18196,7 @@ I seguenti cołegamenti i xé en łengua inglese:
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list anunsi MediaWiki]",
 );
 
-/** Veps (Vepsän kel’)
+/** Veps (vepsän kel’)
  * @author Игорь Бродский
  */
 $messages['vep'] = array(
@@ -17542,7 +18231,8 @@ $messages['vi'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Danh sách gửi thư về việc phát hành MediaWiki]',
 );
 
-/** Volapük (Volapük) */
+/** Volapük (Volapük)
+ */
 $messages['vo'] = array(
        'mainpagetext' => "'''El MediaWiki pestiton benosekiko.'''",
        'mainpagedocfooter' => 'Konsultolös [//meta.wikimedia.org/wiki/Help:Contents Gebanageidian] ad tuvön nünis dö geb programema vükik.
@@ -17554,7 +18244,8 @@ $messages['vo'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Potalised tefü fomams nulik ela MediaWiki]',
 );
 
-/** Võro (Võro) */
+/** Võro (Võro)
+ */
 $messages['vro'] = array(
        'mainpagetext' => "'''MediaWiki tarkvara paika säet.'''",
        'mainpagedocfooter' => 'Vikitarkvara pruukmisõ kotsilõ loeq mano:
@@ -17584,7 +18275,8 @@ $messages['war'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Wolof (Wolof) */
+/** Wolof (Wolof)
+ */
 $messages['wo'] = array(
        'mainpagetext' => "'''Campug MediaWiki gi sotti na . '''",
        'mainpagedocfooter' => 'Saytul [//meta.wikimedia.org/wiki/Ndimbal:Ndefu Gindikaayu jëfandikukat bi] ngir yeneeni xibaar ci jëfandiku gu tëriin gi.
@@ -17609,7 +18301,7 @@ $messages['wuu'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]',
 );
 
-/** Kalmyk (Хальмг)
+/** Kalmyk (хальмг)
  * @author Huuchin
  */
 $messages['xal'] = array(
@@ -17631,6 +18323,7 @@ $messages['yi'] = array(
        'config-page-language' => 'שפראַך',
        'config-page-name' => 'נאָמען',
        'config-page-options' => 'ברירות',
+       'config-ns-generic' => 'פראיעקט',
        'config-admin-name' => 'אײַער נאָמען:',
        'config-admin-password' => 'פאַסווארט:',
        'config-admin-email' => 'בליצפּאָסט אַדרעס:',
@@ -17657,7 +18350,8 @@ $messages['yo'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]",
 );
 
-/** Cantonese (粵語) */
+/** Cantonese (粵語)
+ */
 $messages['yue'] = array(
        'mainpagetext' => "'''MediaWiki已經裝好。'''",
        'mainpagedocfooter' => '參閱[//meta.wikimedia.org/wiki/Help:Contents 用戶指引](英),裏面有資料講點用wiki軟件。
@@ -17668,7 +18362,8 @@ $messages['yue'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單](英)',
 );
 
-/** Zeeuws (Zeêuws) */
+/** Zeeuws (Zeêuws)
+ */
 $messages['zea'] = array(
        'mainpagetext' => "'''De installaotie van MediaWiki is geslaegd.'''",
        'mainpagedocfooter' => "Raedpleeg de [//meta.wikimedia.org/wiki/ZEA_Ulpe:Inhoudsopgaeve andleidieng] voe informatie over 't gebruuk van de wikisoftware.
@@ -17680,12 +18375,13 @@ $messages['zea'] = array(
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailienglieste voe ankondigiengen van nieuwe versies]",
 );
 
-/** Simplified Chinese (‪中文(简体)‬)
+/** Simplified Chinese (中文(简体)‎)
  * @author Hydra
  * @author Hzy980512
  * @author Liangent
  * @author PhiLiP
  * @author Xiaomingyan
+ * @author Yfdyh000
  * @author 阿pp
  */
 $messages['zh-hans'] = array(
@@ -18113,6 +18809,7 @@ $3
 当本步骤完成后,您可以 '''[$2 进入您的wiki]'''。",
        'config-download-localsettings' => '下载LocalSettings.php',
        'config-help' => '帮助',
+       'config-nofile' => '找不到文件“$1”。它是否已被删除?',
        'mainpagetext' => "'''已成功安装MediaWiki。'''",
        'mainpagedocfooter' => '请查阅[//meta.wikimedia.org/wiki/Help:Contents 用户指南]以获取使用本wiki软件的信息!
 
@@ -18122,7 +18819,7 @@ $3
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki发布邮件列表]',
 );
 
-/** Traditional Chinese (‪中文(繁體)‬)
+/** Traditional Chinese (中文(繁體)‎)
  * @author Hzy980512
  * @author Liangent
  * @author Mark85296341
@@ -18199,6 +18896,7 @@ $1',
        'config-no-db' => '找不到合適的數據庫驅動!您需要為PHP安裝數據庫驅動。目前支持以下數據庫:$1。
 
 如果您正在使用共享主機,請向您的主機提供商申請安裝合適的數據庫驅動。如果您通過自行編譯安裝的PHP,請對其進行重新配置以啟用數據庫客戶端,例如使用<code>./configure --with-mysql</code>。如果您通過Debian或Ubuntu包安裝的PHP,您還需要安裝php5-mysql模塊。',
+       'config-outdated-sqlite' => "'''警告''':您已安裝SQLite $1,但是它的版本低於最低要求版本$2。因此您無法選擇SQLite。",
        'config-no-fts3' => "'''警告''':已編譯的SQLite不包含[//sqlite.org/fts3.html FTS3模塊],後台搜索功能將不可用。",
        'config-register-globals' => "'''警告:PHP的<code>[http://php.net/register_globals register_globals]</code>選項被啟用。請盡量禁用該功能,'''雖然不會影響MediaWiki的運行,但您的服務器會被暴露給潛在的安全漏洞。",
        'config-magic-quotes-runtime' => "'''致命錯誤:[http://www.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime magic_quotes_runtime]被啟用!'''
@@ -18215,11 +18913,13 @@ $1',
        'config-pcre-no-utf8' => "'''致命錯誤''':PHP的PCRE模塊在編譯時可能沒有包含PCRE_UTF8支持。MediaWiki需要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],無法啟用對象緩存。
 Object caching is not enabled.",
+       'config-mod-security' => "'''警告''':您的服務器已啟動[http://modsecurity.org/ mod_security]。若其配置錯誤, 會導致MediaWiki和其他軟件的錯誤並允許用戶任意發布內容。如果您遇到任何錯誤,請查閱[http://modsecurity.org/documentation/ mod_security文檔]或聯繫您的客服。",
        'config-diff3-bad' => '找不到GNU diff3。',
        'config-imagemagick' => '已找到ImageMagick:<code>$1</code>。如果你啟用了上傳功能,縮略圖功能也將被啟用。',
        'config-gd' => '已找到內建的GD圖形庫。如果你啟用了上傳功能,縮略圖功能也將被啟用。',
@@ -18235,6 +18935,13 @@ Object caching is not enabled.",
        '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地址。
+
+如果您在使用共享網站套餐,您的網站商應該已在他們的控制面板中給您數據庫信息了。
+
+如果您在Windows中安裝並且使用MySQL,“localhost”可能無效。如果確實無效,請輸入“127.0.0.1”作為IP地址。
+
+如果您在使用PostgreSQL,並且要用Unix socket來連接,請留空。',
        '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 簡單連接名方法](easy connect naming method)。',
        'config-db-wiki-settings' => '識別這個 Wiki',
@@ -18573,4 +19280,3 @@ $messages['zh-tw'] = array(
 * [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki 常見問題解答]
 * [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件清單]',
 );
-
index ac5dbd7..c673f6f 100644 (file)
@@ -1594,13 +1594,16 @@ abstract class Installer {
                $status = Status::newGood();
                try {
                        $page = WikiPage::factory( Title::newMainPage() );
-                       $page->doEdit( wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
-                                       wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text(),
+                       $content = new WikitextContent (
+                               wfMessage( 'mainpagetext' )->inContentLanguage()->text() . "\n\n" .
+                               wfMessage( 'mainpagedocfooter' )->inContentLanguage()->text()
+                       );
+
+                       $page->doEditContent( $content,
                                        '',
                                        EDIT_NEW,
                                        false,
-                                       User::newFromName( 'MediaWiki default' )
-                       );
+                                       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 bd55cb4..06ec158 100644 (file)
@@ -155,8 +155,8 @@ class MysqlUpdater extends DatabaseUpdater {
                        // 1.15
                        array( 'doUniquePlTlIl' ),
                        array( 'addTable', 'change_tag',                        'patch-change_tag.sql' ),
-                       array( 'addTable', 'tag_summary',                       'patch-change_tag.sql' ),
-                       array( 'addTable', 'valid_tag',                         'patch-change_tag.sql' ),
+                       /* array( 'addTable', 'tag_summary',                       'patch-change_tag.sql' ), */
+                       /* array( 'addTable', 'valid_tag',                         'patch-change_tag.sql' ), */
 
                        // 1.16
                        array( 'addTable', 'user_properties',                   'patch-user_properties.sql' ),
@@ -209,11 +209,25 @@ class MysqlUpdater extends DatabaseUpdater {
                        array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ufg_group-length-increase.sql' ),
 
                        // 1.20
-                       array( 'addTable', 'config',                            'patch-config.sql' ),
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
                        array( 'addField', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id.sql' ),
                        array( 'addIndex', 'ipblocks',      'ipb_parent_block_id',           'patch-ipb-parent-block-id-index.sql' ),
                        array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
+
+                       // 1.21
+                       array( 'addField',      'revision',     'rev_content_format',           'patch-revision-rev_content_format.sql' ),
+                       array( 'addField',      'revision',     'rev_content_model',            'patch-revision-rev_content_model.sql' ),
+                       array( 'addField',      'archive',      'ar_content_format',            'patch-archive-ar_content_format.sql' ),
+                       array( 'addField',      'archive',      'ar_content_model',                 'patch-archive-ar_content_model.sql' ),
+                       array( 'addField',      'page',     'page_content_model',               'patch-page-page_content_model.sql' ),
+                       array( 'dropField', 'site_stats',   'ss_admins',        'patch-drop-ss_admins.sql' ),
+                       array( 'dropField', 'recentchanges', 'rc_moved_to_title',            'patch-rc_moved.sql' ),
+                       array( 'addTable', 'sites',                            'patch-sites.sql' ),
+                       array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
+                       array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
+                       array( 'addField', 'job',           'job_attempts',       'patch-job_attempts.sql' ),
+                       array( 'doEnableProfiling' ),
+                       array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
                );
        }
 
@@ -628,6 +642,9 @@ class MysqlUpdater extends DatabaseUpdater {
         */
        protected function doWatchlistNull() {
                $info = $this->db->fieldInfo( 'watchlist', 'wl_notificationtimestamp' );
+               if ( !$info ) {
+                       return;
+               }
                if ( $info->isNullable() ) {
                        $this->output( "...wl_notificationtimestamp is already nullable.\n" );
                        return;
@@ -760,11 +777,19 @@ class MysqlUpdater extends DatabaseUpdater {
                }
        }
 
+       protected function doEnableProfiling() {
+               global $wgProfileToDatabase;
+               if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+                       $this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
+               }
+       }
+
        protected function doMaybeProfilingMemoryUpdate() {
                if ( !$this->db->tableExists( 'profiling', __METHOD__ ) ) {
-                       // Simply ignore
+                       return true;
                } elseif ( $this->db->fieldExists( 'profiling', 'pf_memory', __METHOD__ ) ) {
                        $this->output( "...profiling table has pf_memory field.\n" );
+                       return true;
                } else {
                        $this->applyPatch( 'patch-profiling-memory.sql', false, "Adding pf_memory field to table profiling" );
                }
@@ -775,16 +800,21 @@ class MysqlUpdater extends DatabaseUpdater {
                if ( !$info ) {
                        $this->applyPatch( 'patch-filearchive-user-index.sql', false, "Updating filearchive indices" );
                }
+               return true;
        }
 
        protected function doUniquePlTlIl() {
                $info = $this->db->indexInfo( 'pagelinks', 'pl_namespace' );
                if ( is_array( $info ) && !$info[0]->Non_unique ) {
                        $this->output( "...pl_namespace, tl_namespace, il_to indices are already UNIQUE.\n" );
-                       return;
+                       return true;
+               }
+               if ( $this->skipSchema ) {
+                       $this->output( "...skipping schema change (making pl_namespace, tl_namespace and il_to indices UNIQUE).\n" );
+                       return false;
                }
 
-               $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
+               return $this->applyPatch( 'patch-pl-tl-il-unique.sql', false, "Making pl_namespace, tl_namespace and il_to indices UNIQUE" );
        }
 
        protected function renameEuWikiId() {
@@ -828,6 +858,9 @@ class MysqlUpdater extends DatabaseUpdater {
 
        protected function doUserNewTalkTimestampNotNull() {
                $info = $this->db->fieldInfo( 'user_newtalk', 'user_last_timestamp' );
+               if ( $info === false ) {
+                       return;
+               }
                if ( $info->isNullable() ) {
                        $this->output( "...user_last_timestamp is already nullable.\n" );
                        return;
index 72ec800..845816e 100644 (file)
@@ -40,7 +40,7 @@ class OracleInstaller extends DatabaseInstaller {
        protected $internalDefaults = array(
                '_OracleDefTS' => 'USERS',
                '_OracleTempTS' => 'TEMP',
-               '_InstallUser' => 'SYSDBA',
+               '_InstallUser' => 'SYSTEM',
        );
 
        public $minimumVersion = '9.0.1'; // 9iR1
index a741f26..5523470 100644 (file)
@@ -67,9 +67,18 @@ class OracleUpdater extends DatabaseUpdater {
                        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' ),
+                       array( 'dropField', 'category', 'cat_hidden', 'patch-cat_hidden.sql' ),
+
+                       //1.21
+                       array( 'addField',      'revision',     'rev_content_format',           'patch-revision-rev_content_format.sql' ),
+                       array( 'addField',      'revision',     'rev_content_model',            'patch-revision-rev_content_model.sql' ),
+                       array( 'addField',      'archive',      'ar_content_format',            'patch-archive-ar_content_format.sql' ),
+                       array( 'addField',      'archive',      'ar_content_model',                 'patch-archive-ar_content_model.sql' ),
+                       array( 'addField',      'page',     'page_content_model',               'patch-page-page_content_model.sql' ),
+                       array( 'dropField', 'site_stats', 'ss_admins',  'patch-ss_admins.sql' ),
+                       array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
 
                        // KEEP THIS AT THE BOTTOM!!
                        array( 'doRebuildDuplicateFunction' ),
index 3ac2b3a..882ec53 100644 (file)
@@ -190,6 +190,7 @@ class PostgresInstaller extends DatabaseInstaller {
         *                     other similar objects in the new DB.
         *    - create-tables: A connection with a role suitable for creating tables.
         *
+        * @throws MWException
         * @return Status object. On success, a connection object will be in the
         *   value member.
         */
index 499a2d6..5a13d42 100644 (file)
@@ -89,7 +89,6 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addTable', 'module_deps',       'patch-module_deps.sql' ),
                        array( 'addTable', 'uploadstash',       'patch-uploadstash.sql' ),
                        array( 'addTable', 'user_former_groups','patch-user_former_groups.sql' ),
-                       array( 'addTable', 'config',            'patch-config.sql' ),
                        array( 'addTable', 'external_user',     'patch-external_user.sql' ),
 
                        # Needed before new field
@@ -101,6 +100,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'archive',       'ar_len',               'INTEGER' ),
                        array( 'addPgField', 'archive',       'ar_page_id',           'INTEGER' ),
                        array( 'addPgField', 'archive',       'ar_parent_id',         'INTEGER' ),
+                       array( 'addPgField', 'archive',       'ar_content_model',     'TEXT' ),
+                       array( 'addPgField', 'archive',       'ar_content_format',    'TEXT' ),
                        array( 'addPgField', 'categorylinks', 'cl_sortkey_prefix',    "TEXT NOT NULL DEFAULT ''"),
                        array( 'addPgField', 'categorylinks', 'cl_collation',         "TEXT NOT NULL DEFAULT 0"),
                        array( 'addPgField', 'categorylinks', 'cl_type',              "TEXT NOT NULL DEFAULT 'page'"),
@@ -114,6 +115,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'ipblocks',      'ipb_enable_autoblock', 'SMALLINT NOT NULL DEFAULT 1' ),
                        array( 'addPgField', 'ipblocks',      'ipb_parent_block_id',            'INTEGER DEFAULT NULL REFERENCES ipblocks(ipb_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED' ),
                        array( 'addPgField', 'filearchive',   'fa_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
+                       array( 'addPgField', 'filearchive',   'fa_sha1',              "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'logging',       'log_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'logging',       'log_id',               "INTEGER NOT NULL PRIMARY KEY DEFAULT nextval('logging_log_id_seq')" ),
                        array( 'addPgField', 'logging',       'log_params',           'TEXT' ),
@@ -125,6 +127,7 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'oldimage',      'oi_metadata',          "BYTEA NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'oldimage',      'oi_minor_mime',        "TEXT NOT NULL DEFAULT 'unknown'" ),
                        array( 'addPgField', 'oldimage',      'oi_sha1',              "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'page',          'page_content_model',   'TEXT' ),
                        array( 'addPgField', 'page_restrictions', 'pr_id',            "INTEGER NOT NULL UNIQUE DEFAULT nextval('page_restrictions_pr_id_seq')" ),
                        array( 'addPgField', 'profiling',     'pf_memory',            'NUMERIC(18,10) NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'recentchanges', 'rc_deleted',           'SMALLINT NOT NULL DEFAULT 0' ),
@@ -139,6 +142,8 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'revision',      'rev_deleted',          'SMALLINT NOT NULL DEFAULT 0' ),
                        array( 'addPgField', 'revision',      'rev_len',              'INTEGER' ),
                        array( 'addPgField', 'revision',      'rev_parent_id',        'INTEGER DEFAULT NULL' ),
+                       array( 'addPgField', 'revision',      'rev_content_model',    'TEXT' ),
+                       array( 'addPgField', 'revision',      'rev_content_format',   'TEXT' ),
                        array( 'addPgField', 'site_stats',    'ss_active_users',      "INTEGER DEFAULT '-1'" ),
                        array( 'addPgField', 'user_newtalk',  'user_last_timestamp',  'TIMESTAMPTZ' ),
                        array( 'addPgField', 'logging',       'log_user_text',        "TEXT NOT NULL DEFAULT ''" ),
@@ -149,6 +154,10 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgField', 'archive',       'ar_sha1',              "TEXT NOT NULL DEFAULT ''" ),
                        array( 'addPgField', 'uploadstash',   'us_chunk_inx',         "INTEGER NULL" ),
                        array( 'addPgField', 'job',           'job_timestamp',        "TIMESTAMPTZ" ),
+                       array( 'addPgField', 'job',           'job_random',           "INTEGER NOT NULL DEFAULT 0" ),
+                       array( 'addPgField', 'job',           'job_token',            "TEXT NOT NULL DEFAULT ''" ),
+                       array( 'addPgField', 'job',           'job_token_timestamp',  "TIMESTAMPTZ" ),
+                       array( 'addPgField', 'job',           'job_sha1',             "TEXT NOT NULL DEFAULT ''" ),
 
                        # type changes
                        array( 'changeField', 'archive',       'ar_deleted',      'smallint', '' ),
@@ -222,6 +231,9 @@ class PostgresUpdater extends DatabaseUpdater {
                        array( 'addPgIndex', 'logging',       'logging_page_id_time',   '(log_page,log_timestamp)' ),
                        array( 'addPgIndex', 'iwlinks',       'iwl_prefix_title_from',  '(iwl_prefix, iwl_title, iwl_from)' ),
                        array( 'addPgIndex', 'job',           'job_timestamp_idx',      '(job_timestamp)' ),
+                       array( 'addPgIndex', 'job',           'job_sha1',               '(job_sha1)' ),
+                       array( 'addPgIndex', 'job',           'job_cmd_token',          '(job_cmd, job_token, job_random)' ),
+                       array( 'addPgIndex', 'filearchive',   'fa_sha1',                '(fa_sha1)' ),
 
                        array( 'checkIndex', 'pagelink_unique', array(
                                array('pl_from', 'int4_ops', 'btree', 0),
index 6e1a74f..d8fa724 100644 (file)
@@ -113,6 +113,8 @@ class SqliteInstaller extends DatabaseInstaller {
                        $dir = self::realpath( $dir );
                        $this->setVar( 'wgSQLiteDataDir', $dir );
                }
+               # Table prefix is not used on SQLite, keep it empty
+               $this->setVar( 'wgDBprefix', '' );
                return $result;
        }
 
index bc5fcac..1d6bca0 100644 (file)
@@ -88,11 +88,26 @@ class SqliteUpdater extends DatabaseUpdater {
                        array( 'modifyField', 'user_former_groups', 'ufg_group', 'patch-ug_group-length-increase.sql' ),
 
                        // 1.20
-                       array( 'addTable', 'config',                            'patch-config.sql' ),
                        array( 'addIndex', 'revision', 'page_user_timestamp', 'patch-revision-user-page-index.sql' ),
                        array( 'addField', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id.sql' ),
                        array( 'addIndex', 'ipblocks', 'ipb_parent_block_id', 'patch-ipb-parent-block-id-index.sql' ),
                        array( 'dropField', 'category',     'cat_hidden',       'patch-cat_hidden.sql' ),
+
+                       // 1.21
+                       array( 'addField', 'revision', 'rev_content_format', 'patch-revision-rev_content_format.sql' ),
+                       array( 'addField', 'revision', 'rev_content_model',  'patch-revision-rev_content_model.sql' ),
+                       array( 'addField', 'archive',  'ar_content_format',  'patch-archive-ar_content_format.sql' ),
+                       array( 'addField', 'archive',  'ar_content_model',   'patch-archive-ar_content_model.sql' ),
+                       array( 'addField', 'page',     'page_content_model', 'patch-page-page_content_model.sql' ),
+
+                       array( 'dropField', 'site_stats',    'ss_admins',         'patch-drop-ss_admins.sql' ),
+                       array( 'dropField', 'recentchanges', 'rc_moved_to_title', 'patch-rc_moved.sql' ),
+                       array( 'addTable', 'sites',                            'patch-sites.sql' ),
+                       array( 'addField', 'filearchive',   'fa_sha1',          'patch-fa_sha1.sql' ),
+                       array( 'addField', 'job',           'job_token',         'patch-job_token.sql' ),
+                       array( 'addField', 'job',           'job_attempts',      'patch-job_attempts.sql' ),
+                       array( 'doEnableProfiling' ),
+                       array( 'addField', 'uploadstash',      'us_props',      'patch-uploadstash-us_props.sql' ),
                );
        }
 
@@ -116,4 +131,11 @@ class SqliteUpdater extends DatabaseUpdater {
                        $this->output( "...fulltext search table appears to be in order.\n" );
                }
        }
+
+       protected function doEnableProfiling() {
+               global $wgProfileToDatabase;
+               if ( $wgProfileToDatabase === true && ! $this->db->tableExists( 'profiling', __METHOD__ ) ) {
+                       $this->applyPatch( 'patch-profiling.sql', false, 'Add profiling table' );
+               }
+       }
 }
index 2f46ff0..4892770 100644 (file)
@@ -56,10 +56,11 @@ class WebInstaller extends Installer {
 
        /**
         * The main sequence of page names. These will be displayed in turn.
-        * To add one:
-        *    * Add it here
-        *    * Add a config-page-<name> message
-        *    * Add a WebInstaller_<name> class
+        *
+        * To add a new installer page:
+        *    * Add it to this WebInstaller::$pageSequence property
+        *    * Add a "config-page-<name>" message
+        *    * Add a "WebInstaller_<name>" class
         * @var array
         */
        public $pageSequence = array(
diff --git a/includes/job/DoubleRedirectJob.php b/includes/job/DoubleRedirectJob.php
deleted file mode 100644 (file)
index 08af997..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-<?php
-/**
- * Job to fix double redirects after moving 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
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job to fix double redirects after moving a page
- *
- * @ingroup JobQueue
- */
-class DoubleRedirectJob extends Job {
-       var $reason, $redirTitle, $destTitleText;
-
-       /**
-        * @var User
-        */
-       static $user;
-
-       /**
-        * 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 $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
-        * @param $destTitle bool Not used
-        */
-       public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
-               # Need to use the master to get the redirect table updated in the same transaction
-               $dbw = wfGetDB( DB_MASTER );
-               $res = $dbw->select(
-                       array( 'redirect', 'page' ),
-                       array( 'page_namespace', 'page_title' ),
-                       array(
-                               'page_id = rd_from',
-                               'rd_namespace' => $redirTitle->getNamespace(),
-                               'rd_title' => $redirTitle->getDBkey()
-                       ), __METHOD__ );
-               if ( !$res->numRows() ) {
-                       return;
-               }
-               $jobs = array();
-               foreach ( $res as $row ) {
-                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
-                       if ( !$title ) {
-                               continue;
-                       }
-
-                       $jobs[] = new self( $title, array(
-                               'reason' => $reason,
-                               'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
-                       # Avoid excessive memory usage
-                       if ( count( $jobs ) > 10000 ) {
-                               Job::batchInsert( $jobs );
-                               $jobs = array();
-                       }
-               }
-               Job::batchInsert( $jobs );
-       }
-
-       function __construct( $title, $params = false, $id = 0 ) {
-               parent::__construct( 'fixDoubleRedirect', $title, $params, $id );
-               $this->reason = $params['reason'];
-               $this->redirTitle = Title::newFromText( $params['redirTitle'] );
-               $this->destTitleText = !empty( $params['destTitle'] ) ? $params['destTitle'] : '';
-       }
-
-       /**
-        * @return bool
-        */
-       function run() {
-               if ( !$this->redirTitle ) {
-                       $this->setLastError( 'Invalid title' );
-                       return false;
-               }
-
-               $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
-               if ( !$targetRev ) {
-                       wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
-                       return true;
-               }
-               $text = $targetRev->getText();
-               $currentDest = Title::newFromRedirect( $text );
-               if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
-                       wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
-                       return true;
-               }
-
-               # Check for a suppression tag (used e.g. in periodically archived discussions)
-               $mw = MagicWord::get( 'staticredirect' );
-               if ( $mw->match( $text ) ) {
-                       wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
-                       return true;
-               }
-
-               # Find the current final destination
-               $newTitle = self::getFinalDestination( $this->redirTitle );
-               if ( !$newTitle ) {
-                       wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
-                       return true;
-               }
-               if ( $newTitle->equals( $this->redirTitle ) ) {
-                       # The redirect is already right, no need to change it
-                       # This can happen if the page was moved back (say after vandalism)
-                       wfDebug( __METHOD__.": skipping, already good\n" );
-               }
-
-               # Preserve fragment (bug 14904)
-               $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
-                       $currentDest->getFragment() );
-
-               # Fix the text
-               # Remember that redirect pages can have categories, templates, etc.,
-               # so the regex has to be fairly general
-               $newText = preg_replace( '/ \[ \[  [^\]]*  \] \] /x',
-                       '[[' . $newTitle->getFullText() . ']]',
-                       $text, 1 );
-
-               if ( $newText === $text ) {
-                       $this->setLastError( 'Text unchanged???' );
-                       return false;
-               }
-
-               # Save it
-               global $wgUser;
-               $oldUser = $wgUser;
-               $wgUser = $this->getUser();
-               $article = WikiPage::factory( $this->title );
-               $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;
-
-               return true;
-       }
-
-       /**
-        * Get the final destination of a redirect
-        *
-        * @param $title Title
-        *
-        * @return bool if the specified title is not a redirect, or if it is a circular redirect
-        */
-       public static function getFinalDestination( $title ) {
-               $dbw = wfGetDB( DB_MASTER );
-
-               $seenTitles = array(); # Circular redirect check
-               $dest = false;
-
-               while ( true ) {
-                       $titleText = $title->getPrefixedDBkey();
-                       if ( isset( $seenTitles[$titleText] ) ) {
-                               wfDebug( __METHOD__, "Circular redirect detected, aborting\n" );
-                               return false;
-                       }
-                       $seenTitles[$titleText] = true;
-
-                       $row = $dbw->selectRow(
-                               array( 'redirect', 'page' ),
-                               array( 'rd_namespace', 'rd_title' ),
-                               array(
-                                       'rd_from=page_id',
-                                       'page_namespace' => $title->getNamespace(),
-                                       'page_title' => $title->getDBkey()
-                               ), __METHOD__ );
-                       if ( !$row ) {
-                               # No redirect from here, chain terminates
-                               break;
-                       } else {
-                               $dest = $title = Title::makeTitle( $row->rd_namespace, $row->rd_title );
-                       }
-               }
-               return $dest;
-       }
-
-       /**
-        * Get a user object for doing edits, from a request-lifetime cache
-        * @return User
-        */
-       function getUser() {
-               if ( !self::$user ) {
-                       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();
-                       }
-               }
-               return self::$user;
-       }
-}
-
diff --git a/includes/job/EmaillingJob.php b/includes/job/EmaillingJob.php
deleted file mode 100644 (file)
index d359988..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-/**
- * Old job for notification emails.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Old job used for sending single notification emails;
- * kept for backwards-compatibility
- *
- * @ingroup JobQueue
- */
-class EmaillingJob extends Job {
-       function __construct( $title, $params, $id = 0 ) {
-               parent::__construct( 'sendMail', Title::newMainPage(), $params, $id );
-       }
-
-       function run() {
-               UserMailer::send(
-                       $this->params['to'],
-                       $this->params['from'],
-                       $this->params['subj'],
-                       $this->params['body'],
-                       $this->params['replyto']
-               );
-               return true;
-       }
-
-}
diff --git a/includes/job/EnotifNotifyJob.php b/includes/job/EnotifNotifyJob.php
deleted file mode 100644 (file)
index b4c925e..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-/**
- * Job for notification emails.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job for email notification mails
- *
- * @ingroup JobQueue
- */
-class EnotifNotifyJob extends Job {
-
-       function __construct( $title, $params, $id = 0 ) {
-               parent::__construct( 'enotifNotify', $title, $params, $id );
-       }
-
-       function run() {
-               $enotif = new EmailNotification();
-               // Get the user from ID (rename safe). Anons are 0, so defer to name.
-               if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
-                       $editor = User::newFromId( $this->params['editorID'] );
-               // B/C, only the name might be given.
-               } else {
-                       # FIXME: newFromName could return false on a badly configured wiki.
-                       $editor = User::newFromName( $this->params['editor'], false );
-               }
-               $enotif->actuallyNotifyOnPageChange(
-                       $editor,
-                       $this->title,
-                       $this->params['timestamp'],
-                       $this->params['summary'],
-                       $this->params['minorEdit'],
-                       $this->params['oldid'],
-                       $this->params['watchers']
-               );
-               return true;
-       }
-
-}
index 45f0570..927ca4e 100644 (file)
 
 /**
  * Class to both describe a background job and handle jobs.
+ * The queue aspects of this class are now deprecated.
  *
  * @ingroup JobQueue
  */
 abstract class Job {
-
        /**
         * @var Title
         */
@@ -47,165 +47,12 @@ abstract class Job {
         * Run the job
         * @return boolean success
         */
-       abstract function run();
+       abstract public 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
         *
@@ -216,7 +63,7 @@ abstract class Job {
         * @throws MWException
         * @return Job
         */
-       static function factory( $command, Title $title, $params = false, $id = 0 ) {
+       public static function factory( $command, Title $title, $params = false, $id = 0 ) {
                global $wgJobClasses;
                if( isset( $wgJobClasses[$command] ) ) {
                        $class = $wgJobClasses[$command];
@@ -225,30 +72,6 @@ abstract class Job {
                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.
@@ -257,33 +80,10 @@ abstract class Job {
         * removed later on, when the first one is popped.
         *
         * @param $jobs array of Job objects
+        * @deprecated 1.21
         */
-       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 ) );
+       public static function batchInsert( $jobs ) {
+               return JobQueueGroup::singleton()->push( $jobs );
        }
 
        /**
@@ -294,45 +94,34 @@ abstract class Job {
         * large batches of jobs can cause slave lag.
         *
         * @param $jobs array of Job objects
+        * @deprecated 1.21
         */
-       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 ) );
+       public static function safeBatchInsert( $jobs ) {
+               return JobQueueGroup::singleton()->push( $jobs, JobQueue::QoS_Atomic );
        }
 
-
        /**
-        * SQL conditions to apply on most JobQueue queries
+        * 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.
         *
-        * Whenever we exclude jobs types from the default queue, we want to make
-        * sure that queries to the job queue actually ignore them.
+        * @param $type string
+        * @return Job
+        * @deprecated 1.21
+        */
+       public static function pop_type( $type ) {
+               return JobQueueGroup::singleton()->get( $type )->pop();
+       }
+
+       /**
+        * Pop a job off the front of the queue.
+        * This is subject to $wgJobTypesExcludedFromDefaultQueue.
         *
-        * @return array SQL conditions suitable for Database:: methods
+        * @return Job or false if there's no jobs
+        * @deprecated 1.21
         */
-       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;
+       public static function pop() {
+               return JobQueueGroup::singleton()->pop();
        }
 
        /*-------------------------------------------------------------------------
@@ -345,76 +134,108 @@ abstract class Job {
         * @param $params array|bool
         * @param $id int
         */
-       function __construct( $command, $title, $params = false, $id = 0 ) {
+       public 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;
+               $this->removeDuplicates = false; // expensive jobs may set this to true
        }
 
        /**
-        * Insert a single job into the queue.
-        * @return bool true on success
+        * @return integer May be 0 for jobs stored outside the DB
+        */
+       public function getId() {
+               return $this->id;
+       }
+
+       /**
+        * @return string
         */
-       function insert() {
-               $fields = $this->insertFields();
+       public function getType() {
+               return $this->command;
+       }
 
-               $dbw = wfGetDB( DB_MASTER );
+       /**
+        * @return Title
+        */
+       public function getTitle() {
+               return $this->title;
+       }
 
-               if ( $this->removeDuplicates ) {
-                       $res = $dbw->select( 'job', array( '1' ), $fields, __METHOD__ );
-                       if ( $dbw->numRows( $res ) ) {
-                               return true;
-                       }
+       /**
+        * @return array
+        */
+       public function getParams() {
+               return $this->params;
+       }
+
+       /**
+        * @return bool
+        */
+       public function ignoreDuplicates() {
+               return $this->removeDuplicates;
+       }
+
+       /**
+        * Subclasses may need to override this to make duplication detection work
+        *
+        * @return Array Map of key/values
+        */
+       public function getDeduplicationInfo() {
+               $info = array(
+                       'type'      => $this->getType(),
+                       'namespace' => $this->getTitle()->getNamespace(),
+                       'title'     => $this->getTitle()->getDBkey(),
+                       'params'    => $this->getParams()
+               );
+               // Identical jobs with different "root" jobs should count as duplicates
+               if ( is_array( $info['params'] ) ) {
+                       unset( $info['params']['rootJobSignature'] );
+                       unset( $info['params']['rootJobTimestamp'] );
                }
-               wfIncrStats( 'job-insert' );
-               return $dbw->insert( 'job', $fields, __METHOD__ );
+               return $info;
        }
 
        /**
-        * @return array
+        * @param $key string A key that identifies the task
+        * @return Array
         */
-       protected function insertFields() {
-               $dbw = wfGetDB( DB_MASTER );
+       public static function newRootJobParams( $key ) {
                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 )
+                       'rootJobSignature' => sha1( $key ),
+                       'rootJobTimestamp' => wfTimestampNow()
                );
        }
 
        /**
-        * Remove jobs in the job queue which are duplicates of this job.
-        * This is deadlock-prone and so starts its own transaction.
+        * @return Array
         */
-       function removeDuplicates() {
-               if ( !$this->removeDuplicates ) {
-                       return;
-               }
+       public function getRootJobParams() {
+               return array(
+                       'rootJobSignature' => isset( $this->params['rootJobSignature'] )
+                               ? $this->params['rootJobSignature']
+                               : null,
+                       'rootJobTimestamp' => isset( $this->params['rootJobTimestamp'] )
+                               ? $this->params['rootJobTimestamp']
+                               : null
+               );
+       }
 
-               $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 );
-               }
+       /**
+        * Insert a single job into the queue.
+        * @return bool true on success
+        * @deprecated 1.21
+        */
+       public function insert() {
+               return JobQueueGroup::singleton()->push( $this );
        }
 
        /**
         * @return string
         */
-       function toString() {
+       public function toString() {
                $paramString = '';
                if ( $this->params ) {
                        foreach ( $this->params as $key => $value ) {
@@ -440,7 +261,7 @@ abstract class Job {
                $this->error = $error;
        }
 
-       function getLastError() {
+       public function getLastError() {
                return $this->error;
        }
 }
diff --git a/includes/job/JobQueue.php b/includes/job/JobQueue.php
new file mode 100644 (file)
index 0000000..e88441d
--- /dev/null
@@ -0,0 +1,249 @@
+<?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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing and running of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+abstract class JobQueue {
+       protected $wiki; // string; wiki ID
+       protected $type; // string; job type
+       protected $order; // string; job priority for pop()
+       protected $claimTTL; // integer; seconds
+
+       const QoS_Atomic = 1; // integer; "all-or-nothing" job insertions
+
+       /**
+        * @param $params array
+        */
+       protected function __construct( array $params ) {
+               $this->wiki     = $params['wiki'];
+               $this->type     = $params['type'];
+               $this->order    = isset( $params['order'] ) ? $params['order'] : 'random';
+               $this->claimTTL = isset( $params['claimTTL'] ) ? $params['claimTTL'] : 0;
+       }
+
+       /**
+        * Get a job queue object of the specified type.
+        * $params includes:
+        *   class    : What job class to use (determines job type)
+        *   wiki     : wiki ID of the wiki the jobs are for (defaults to current wiki)
+        *   type     : The name of the job types this queue handles
+        *   order    : Order that pop() selects jobs, one of "fifo", "timestamp" or "random".
+        *              If "fifo" is used, the queue will effectively be FIFO. Note that
+        *              job completion will not appear to be exactly FIFO if there are multiple
+        *              job runners since jobs can take different times to finish once popped.
+        *              If "timestamp" is used, the queue will at least be loosely ordered
+        *              by timestamp, allowing for some jobs to be popped off out of order.
+        *              If "random" is used, pop() will pick jobs in random order. This might be
+        *              useful for improving concurrency depending on the queue storage medium.
+        *   claimTTL : If supported, the queue will recycle jobs that have been popped
+        *              but not acknowledged as completed after this many seconds.
+        *
+        * @param $params array
+        * @return JobQueue
+        * @throws MWException
+        */
+       final public static function factory( array $params ) {
+               $class = $params['class'];
+               if ( !MWInit::classExists( $class ) ) {
+                       throw new MWException( "Invalid job queue class '$class'." );
+               }
+               $obj = new $class( $params );
+               if ( !( $obj instanceof self ) ) {
+                       throw new MWException( "Class '$class' is not a " . __CLASS__ . " class." );
+               }
+               return $obj;
+       }
+
+       /**
+        * @return string Wiki ID
+        */
+       final public function getWiki() {
+               return $this->wiki;
+       }
+
+       /**
+        * @return string Job type that this queue handles
+        */
+       final public function getType() {
+               return $this->type;
+       }
+
+       /**
+        * Quickly check if the queue is empty.
+        * Queue classes should use caching if they are any slower without memcached.
+        *
+        * @return bool
+        */
+       final public function isEmpty() {
+               wfProfileIn( __METHOD__ );
+               $res = $this->doIsEmpty();
+               wfProfileOut( __METHOD__ );
+               return $res;
+       }
+
+       /**
+        * @see JobQueue::isEmpty()
+        * @return bool
+        */
+       abstract protected function doIsEmpty();
+
+       /**
+        * Push a batch of jobs into the queue
+        *
+        * @param $jobs array List of Jobs
+        * @param $flags integer Bitfield (supports JobQueue::QoS_Atomic)
+        * @return bool
+        */
+       final public function batchPush( array $jobs, $flags = 0 ) {
+               foreach ( $jobs as $job ) {
+                       if ( $job->getType() !== $this->type ) {
+                               throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+                       }
+               }
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doBatchPush( $jobs, $flags );
+               if ( $ok ) {
+                       wfIncrStats( 'job-insert', count( $jobs ) );
+               }
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueue::batchPush()
+        * @return bool
+        */
+       abstract protected function doBatchPush( array $jobs, $flags );
+
+       /**
+        * Pop a job off of the queue
+        *
+        * @return Job|bool Returns false on failure
+        */
+       final public function pop() {
+               wfProfileIn( __METHOD__ );
+               $job = $this->doPop();
+               if ( $job ) {
+                       wfIncrStats( 'job-pop' );
+               }
+               wfProfileOut( __METHOD__ );
+               return $job;
+       }
+
+       /**
+        * @see JobQueue::pop()
+        * @return Job
+        */
+       abstract protected function doPop();
+
+       /**
+        * Acknowledge that a job was completed
+        *
+        * @param $job Job
+        * @return bool
+        */
+       final public function ack( Job $job ) {
+               if ( $job->getType() !== $this->type ) {
+                       throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+               }
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doAck( $job );
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueue::ack()
+        * @return bool
+        */
+       abstract protected function doAck( Job $job );
+
+       /**
+        * Register the "root job" of a given job into the queue for de-duplication.
+        * This should only be called right *after* all the new jobs have been inserted.
+        * This is used to turn older, duplicate, job entries into no-ops. The root job
+        * information will remain in the registry until it simply falls out of cache.
+        *
+        * This requires that $job has two special fields in the "params" array:
+        *   - rootJobSignature : hash (e.g. SHA1) that identifies the task
+        *   - rootJobTimestamp : TS_MW timestamp of this instance of the task
+        *
+        * A "root job" is a conceptual job that consist of potentially many smaller jobs
+        * that are actually inserted into the queue. For example, "refreshLinks" jobs are
+        * spawned when a template is edited. One can think of the task as "update links
+        * of pages that use template X" and an instance of that task as a "root job".
+        * However, what actually goes into the queue are potentially many refreshLinks2 jobs.
+        * Since these jobs include things like page ID ranges and DB master positions, and morph
+        * into smaller refreshLinks2 jobs recursively, simple duplicate detection (like job_sha1)
+        * for individual jobs being identical is not useful.
+        *
+        * In the case of "refreshLinks", if these jobs are still in the queue when the template
+        * is edited again, we want all of these old refreshLinks jobs for that template to become
+        * no-ops. This can greatly reduce server load, since refreshLinks jobs involves parsing.
+        * Essentially, the new batch of jobs belong to a new "root job" and the older ones to a
+        * previous "root job" for the same task of "update links of pages that use template X".
+        *
+        * @param $job Job
+        * @return bool
+        */
+       final public function deduplicateRootJob( Job $job ) {
+               if ( $job->getType() !== $this->type ) {
+                       throw new MWException( "Got '{$job->getType()}' job; expected '{$this->type}'." );
+               }
+               wfProfileIn( __METHOD__ );
+               $ok = $this->doDeduplicateRootJob( $job );
+               wfProfileOut( __METHOD__ );
+               return $ok;
+       }
+
+       /**
+        * @see JobQueue::deduplicateRootJob()
+        * @param $job Job
+        * @return bool
+        */
+       protected function doDeduplicateRootJob( Job $job ) {
+               return true;
+       }
+
+       /**
+        * Wait for any slaves or backup servers to catch up
+        *
+        * @return void
+        */
+       final public function waitForBackups() {
+               wfProfileIn( __METHOD__ );
+               $this->doWaitForBackups();
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * @see JobQueue::waitForBackups()
+        * @return void
+        */
+       protected function doWaitForBackups() {}
+}
diff --git a/includes/job/JobQueueDB.php b/includes/job/JobQueueDB.php
new file mode 100644 (file)
index 0000000..e23ff0d
--- /dev/null
@@ -0,0 +1,527 @@
+<?php
+/**
+ * Database-backed job queue code.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle job queues stored in the DB
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueDB extends JobQueue {
+       const CACHE_TTL      = 300; // integer; seconds to cache queue information
+       const MAX_AGE_PRUNE  = 604800; // integer; seconds a job can live once claimed
+       const MAX_ATTEMPTS   = 3; // integer; number of times to try a job
+       const MAX_JOB_RANDOM = 2147483647; // integer; 2^31 - 1, used for job_random
+
+       /**
+        * @see JobQueue::doIsEmpty()
+        * @return bool
+        */
+       protected function doIsEmpty() {
+               global $wgMemc;
+
+               $key = $this->getEmptinessCacheKey();
+
+               $isEmpty = $wgMemc->get( $key );
+               if ( $isEmpty === 'true' ) {
+                       return true;
+               } elseif ( $isEmpty === 'false' ) {
+                       return false;
+               }
+
+               $found = $this->getSlaveDB()->selectField(
+                       'job', '1', array( 'job_cmd' => $this->type ), __METHOD__
+               );
+
+               $wgMemc->add( $key, $found ? 'false' : 'true', self::CACHE_TTL );
+       }
+
+       /**
+        * @see JobQueue::doBatchPush()
+        * @return bool
+        */
+       protected function doBatchPush( array $jobs, $flags ) {
+               if ( count( $jobs ) ) {
+                       $dbw = $this->getMasterDB();
+
+                       $rowSet = array(); // (sha1 => job) map for jobs that are de-duplicated
+                       $rowList = array(); // list of jobs for jobs that are are not de-duplicated
+
+                       foreach ( $jobs as $job ) {
+                               $row = $this->insertFields( $job );
+                               if ( $job->ignoreDuplicates() ) {
+                                       $rowSet[$row['job_sha1']] = $row;
+                               } else {
+                                       $rowList[] = $row;
+                               }
+                       }
+
+                       $atomic = ( $flags & self::QoS_Atomic );
+                       $key    = $this->getEmptinessCacheKey();
+                       $ttl    = self::CACHE_TTL;
+
+                       $dbw->onTransactionIdle(
+                               function() use ( $dbw, $rowSet, $rowList, $atomic, $key, $ttl
+                       ) {
+                               global $wgMemc;
+
+                               if ( $atomic ) {
+                                       $dbw->begin( __METHOD__ ); // wrap all the job additions in one transaction
+                               }
+                               try {
+                                       // Strip out any duplicate jobs that are already in the queue...
+                                       if ( count( $rowSet ) ) {
+                                               $res = $dbw->select( 'job', 'job_sha1',
+                                                       array(
+                                                               // No job_type condition since it's part of the job_sha1 hash
+                                                               'job_sha1'  => array_keys( $rowSet ),
+                                                               'job_token' => '' // unclaimed
+                                                       ),
+                                                       __METHOD__
+                                               );
+                                               foreach ( $res as $row ) {
+                                                       wfDebug( "Job with hash '{$row->job_sha1}' is a duplicate." );
+                                                       unset( $rowSet[$row->job_sha1] ); // already enqueued
+                                               }
+                                       }
+                                       // Build the full list of job rows to insert
+                                       $rows = array_merge( $rowList, array_values( $rowSet ) );
+                                       // Insert the job rows in chunks to avoid slave lag...
+                                       foreach ( array_chunk( $rows, 50 ) as $rowBatch ) {
+                                               $dbw->insert( 'job', $rowBatch, __METHOD__ );
+                                       }
+                               } catch ( DBError $e ) {
+                                       if ( $atomic ) {
+                                               $dbw->rollback( __METHOD__ );
+                                       }
+                                       throw $e;
+                               }
+                               if ( $atomic ) {
+                                       $dbw->commit( __METHOD__ );
+                               }
+
+                               $wgMemc->set( $key, 'false', $ttl ); // queue is not empty
+                       } );
+               }
+
+               return true;
+       }
+
+       /**
+        * @see JobQueue::doPop()
+        * @return Job|bool
+        */
+       protected function doPop() {
+               global $wgMemc;
+
+               if ( $wgMemc->get( $this->getEmptinessCacheKey() ) === 'true' ) {
+                       return false; // queue is empty
+               }
+
+               $dbw = $this->getMasterDB();
+               $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+
+               $uuid = wfRandomString( 32 ); // pop attempt
+               $job = false; // job popped off
+               // Occasionally recycle jobs back into the queue that have been claimed too long
+               if ( mt_rand( 0, 99 ) == 0 ) {
+                       $this->recycleStaleJobs();
+               }
+               do { // retry when our row is invalid or deleted as a duplicate
+                       // Try to reserve a row in the DB...
+                       if ( in_array( $this->order, array( 'fifo', 'timestamp' ) ) ) {
+                               $row = $this->claimOldest( $uuid );
+                       } else { // random first
+                               $rand = mt_rand( 0, self::MAX_JOB_RANDOM ); // encourage concurrent UPDATEs
+                               $gte  = (bool)mt_rand( 0, 1 ); // find rows with rand before/after $rand
+                               $row  = $this->claimRandom( $uuid, $rand, $gte );
+                               if ( !$row ) { // need to try the other direction
+                                       $row = $this->claimRandom( $uuid, $rand, !$gte );
+                               }
+                       }
+                       // Check if we found a row to reserve...
+                       if ( !$row ) {
+                               $wgMemc->set( $this->getEmptinessCacheKey(), 'true', self::CACHE_TTL );
+                               break; // nothing to do
+                       }
+                       // Get the job object from the row...
+                       $title = Title::makeTitleSafe( $row->job_namespace, $row->job_title );
+                       if ( !$title ) {
+                               $dbw->delete( 'job', array( 'job_id' => $row->job_id ), __METHOD__ );
+                               wfIncrStats( 'job-pop' );
+                               wfDebugLog( 'JobQueueDB', "Row has invalid title '{$row->job_title}'." );
+                               continue; // try again
+                       }
+                       $job = Job::factory( $row->job_cmd, $title,
+                               self::extractBlob( $row->job_params ), $row->job_id );
+                       $job->id = $row->job_id; // XXX: work around broken subclasses
+                       // Flag this job as an old duplicate based on its "root" job...
+                       if ( $this->isRootJobOldDuplicate( $job ) ) {
+                               $job = DuplicateJob::newFromJob( $job ); // convert to a no-op
+                       }
+                       break; // done
+               } while( true );
+
+               return $job;
+       }
+
+       /**
+        * Reserve a row with a single UPDATE without holding row locks over RTTs...
+        *
+        * @param $uuid string 32 char hex string
+        * @param $rand integer Random unsigned integer (31 bits)
+        * @param $gte bool Search for job_random >= $random (otherwise job_random <= $random)
+        * @return Row|false
+        */
+       protected function claimRandom( $uuid, $rand, $gte ) {
+               $dbw  = $this->getMasterDB();
+               $dir  = $gte ? 'ASC' : 'DESC';
+               $ineq = $gte ? '>=' : '<=';
+
+               $row = false; // the row acquired
+               // This uses a replication safe method for acquiring jobs. One could use UPDATE+LIMIT
+               // instead, but that either uses ORDER BY (in which case it deadlocks in MySQL) or is
+               // not replication safe. Due to http://bugs.mysql.com/bug.php?id=6980, subqueries cannot
+               // be used here with MySQL.
+               do {
+                       $row = $dbw->selectRow( 'job', '*', // find a random job
+                               array(
+                                       'job_cmd'   => $this->type,
+                                       'job_token' => '',
+                                       "job_random {$ineq} {$dbw->addQuotes( $rand )}" ),
+                               __METHOD__,
+                               array( 'ORDER BY' => "job_random {$dir}" )
+                       );
+                       if ( $row ) { // claim the job
+                               $dbw->update( 'job', // update by PK
+                                       array(
+                                               'job_token'           => $uuid,
+                                               'job_token_timestamp' => $dbw->timestamp(),
+                                               'job_attempts = job_attempts+1' ),
+                                       array( 'job_cmd' => $this->type, 'job_id' => $row->job_id, 'job_token' => '' ),
+                                       __METHOD__
+                               );
+                               // This might get raced out by another runner when claiming the previously
+                               // selected row. The use of job_random should minimize this problem, however.
+                               if ( !$dbw->affectedRows() ) {
+                                       $row = false; // raced out
+                               }
+                       } else {
+                               break; // nothing to do
+                       }
+               } while ( !$row );
+
+               return $row;
+       }
+
+       /**
+        * Reserve a row with a single UPDATE without holding row locks over RTTs...
+        *
+        * @param $uuid string 32 char hex string
+        * @return Row|false
+        */
+       protected function claimOldest( $uuid ) {
+               $dbw  = $this->getMasterDB();
+
+               $row = false; // the row acquired
+               do {
+                       if ( $dbw->getType() === 'mysql' ) {
+                               // Per http://bugs.mysql.com/bug.php?id=6980, we can't use subqueries on the
+                               // same table being changed in an UPDATE query in MySQL (gives Error: 1093).
+                               // Oracle and Postgre have no such limitation. However, MySQL offers an
+                               // alternative here by supporting ORDER BY + LIMIT for UPDATE queries.
+                               $dbw->query( "UPDATE {$dbw->tableName( 'job' )} " .
+                                       "SET " .
+                                               "job_token = {$dbw->addQuotes( $uuid ) }, " .
+                                               "job_token_timestamp = {$dbw->addQuotes( $dbw->timestamp() )}, " .
+                                               "job_attempts = job_attempts+1 " .
+                                       "WHERE ( " .
+                                               "job_cmd = {$dbw->addQuotes( $this->type )} " .
+                                               "AND job_token = {$dbw->addQuotes( '' )} " .
+                                       ") ORDER BY job_id ASC LIMIT 1",
+                                       __METHOD__
+                               );
+                       } else {
+                               // Use a subquery to find the job, within an UPDATE to claim it.
+                               // This uses as much of the DB wrapper functions as possible.
+                               $dbw->update( 'job',
+                                       array(
+                                               'job_token'           => $uuid,
+                                               'job_token_timestamp' => $dbw->timestamp(),
+                                               'job_attempts = job_attempts+1' ),
+                                       array( 'job_id = (' .
+                                               $dbw->selectSQLText( 'job', 'job_id',
+                                                       array( 'job_cmd' => $this->type, 'job_token' => '' ),
+                                                       __METHOD__,
+                                                       array( 'ORDER BY' => 'job_id ASC', 'LIMIT' => 1 ) ) .
+                                               ')'
+                                       ),
+                                       __METHOD__
+                               );
+                       }
+                       // Fetch any row that we just reserved...
+                       if ( $dbw->affectedRows() ) {
+                               $row = $dbw->selectRow( 'job', '*',
+                                       array( 'job_cmd' => $this->type, 'job_token' => $uuid ), __METHOD__
+                               );
+                               if ( !$row ) { // raced out by duplicate job removal
+                                       wfDebugLog( 'JobQueueDB', "Row deleted as duplicate by another process." );
+                               }
+                       } else {
+                               break; // nothing to do
+                       }
+               } while ( !$row );
+
+               return $row;
+       }
+
+       /**
+        * Recycle or destroy any jobs that have been claimed for too long
+        *
+        * @return integer Number of jobs recycled/deleted
+        */
+       protected function recycleStaleJobs() {
+               $now   = time();
+               $dbw   = $this->getMasterDB();
+               $count = 0; // affected rows
+
+               if ( !$dbw->lock( "jobqueue-recycle-{$this->type}", __METHOD__, 1 ) ) {
+                       return $count; // already in progress
+               }
+
+               // Remove claims on jobs acquired for too long if enabled...
+               if ( $this->claimTTL > 0 ) {
+                       $claimCutoff = $dbw->timestamp( $now - $this->claimTTL );
+                       // Get the IDs of jobs that have be claimed but not finished after too long.
+                       // These jobs can be recycled into the queue by expiring the claim. Selecting
+                       // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+                       $res = $dbw->select( 'job', 'job_id',
+                               array(
+                                       'job_cmd' => $this->type,
+                                       "job_token != {$dbw->addQuotes( '' )}", // was acquired
+                                       "job_token_timestamp < {$dbw->addQuotes( $claimCutoff )}", // stale
+                                       "job_attempts < {$dbw->addQuotes( self::MAX_ATTEMPTS )}" ), // retries left
+                               __METHOD__
+                       );
+                       $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
+                       if ( count( $ids ) ) {
+                               // Reset job_token for these jobs so that other runners will pick them up.
+                               // Set the timestamp to the current time, as it is useful to now that the job
+                               // was already tried before (the timestamp becomes the "released" time).
+                               $dbw->update( 'job',
+                                       array(
+                                               'job_token' => '',
+                                               'job_token_timestamp' => $dbw->timestamp( $now ) ), // time of release
+                                       array(
+                                               'job_id' => $ids ),
+                                       __METHOD__
+                               );
+                               $count += $dbw->affectedRows();
+                       }
+               }
+
+               // Just destroy any stale jobs...
+               $pruneCutoff = $dbw->timestamp( $now - self::MAX_AGE_PRUNE );
+               $conds = array(
+                       'job_cmd' => $this->type,
+                       "job_token != {$dbw->addQuotes( '' )}", // was acquired
+                       "job_token_timestamp < {$dbw->addQuotes( $pruneCutoff )}" // stale
+               );
+               if ( $this->claimTTL > 0 ) { // only prune jobs attempted too many times...
+                       $conds[] = "job_attempts >= {$dbw->addQuotes( self::MAX_ATTEMPTS )}";
+               }
+               // Get the IDs of jobs that are considered stale and should be removed. Selecting
+               // the IDs first means that the UPDATE can be done by primary key (less deadlocks).
+               $res = $dbw->select( 'job', 'job_id', $conds, __METHOD__ );
+               $ids = array_map( function( $o ) { return $o->job_id; }, iterator_to_array( $res ) );
+               if ( count( $ids ) ) {
+                       $dbw->delete( 'job', array( 'job_id' => $ids ), __METHOD__ );
+                       $count += $dbw->affectedRows();
+               }
+
+               $dbw->unlock( "jobqueue-recycle-{$this->type}", __METHOD__ );
+
+               return $count;
+       }
+
+       /**
+        * @see JobQueue::doAck()
+        * @return Job|bool
+        */
+       protected function doAck( Job $job ) {
+               if ( !$job->getId() ) {
+                       throw new MWException( "Job of type '{$job->getType()}' has no ID." );
+               }
+
+               $dbw = $this->getMasterDB();
+               $dbw->commit( __METHOD__, 'flush' ); // flush existing transaction
+
+               // Delete a row with a single DELETE without holding row locks over RTTs...
+               $dbw->delete( 'job',
+                       array( 'job_cmd' => $this->type, 'job_id' => $job->getId() ), __METHOD__ );
+
+               return true;
+       }
+
+       /**
+        * @see JobQueue::doDeduplicateRootJob()
+        * @return bool
+        */
+       protected function doDeduplicateRootJob( Job $job ) {
+               $params = $job->getParams();
+               if ( !isset( $params['rootJobSignature'] ) ) {
+                       throw new MWException( "Cannot register root job; missing 'rootJobSignature'." );
+               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
+                       throw new MWException( "Cannot register root job; missing 'rootJobTimestamp'." );
+               }
+               $key = $this->getRootJobCacheKey( $params['rootJobSignature'] );
+               // Callers should call batchInsert() and then this function so that if the insert
+               // fails, the de-duplication registration will be aborted. Since the insert is
+               // deferred till "transaction idle", do that same here, so that the ordering is
+               // maintained. Having only the de-duplication registration succeed would cause
+               // jobs to become no-ops without any actual jobs that made them redundant.
+               $this->getMasterDB()->onTransactionIdle( function() use ( $params, $key ) {
+                       global $wgMemc;
+
+                       $timestamp = $wgMemc->get( $key ); // current last timestamp of this job
+                       if ( $timestamp && $timestamp >= $params['rootJobTimestamp'] ) {
+                               return true; // a newer version of this root job was enqueued
+                       }
+
+                       // Update the timestamp of the last root job started at the location...
+                       return $wgMemc->set( $key, $params['rootJobTimestamp'], 14*86400 ); // 2 weeks
+               } );
+
+               return true;
+       }
+
+       /**
+        * Check if the "root" job of a given job has been superseded by a newer one
+        *
+        * @param $job Job
+        * @return bool
+        */
+       protected function isRootJobOldDuplicate( Job $job ) {
+               global $wgMemc;
+
+               $params = $job->getParams();
+               if ( !isset( $params['rootJobSignature'] ) ) {
+                       return false; // job has no de-deplication info
+               } elseif ( !isset( $params['rootJobTimestamp'] ) ) {
+                       trigger_error( "Cannot check root job; missing 'rootJobTimestamp'." );
+                       return false;
+               }
+
+               // Get the last time this root job was enqueued
+               $timestamp = $wgMemc->get( $this->getRootJobCacheKey( $params['rootJobSignature'] ) );
+
+               // Check if a new root job was started at the location after this one's...
+               return ( $timestamp && $timestamp > $params['rootJobTimestamp'] );
+       }
+
+       /**
+        * @see JobQueue::doWaitForBackups()
+        * @return void
+        */
+       protected function doWaitForBackups() {
+               wfWaitForSlaves();
+       }
+
+       /**
+        * @return DatabaseBase
+        */
+       protected function getSlaveDB() {
+               return wfGetDB( DB_SLAVE, array(), $this->wiki );
+       }
+
+       /**
+        * @return DatabaseBase
+        */
+       protected function getMasterDB() {
+               return wfGetDB( DB_MASTER, array(), $this->wiki );
+       }
+
+       /**
+        * @param $job Job
+        * @return array
+        */
+       protected function insertFields( Job $job ) {
+               $dbw = $this->getMasterDB();
+               return array(
+                       // Fields that describe the nature of the job
+                       'job_cmd'       => $job->getType(),
+                       'job_namespace' => $job->getTitle()->getNamespace(),
+                       'job_title'     => $job->getTitle()->getDBkey(),
+                       'job_params'    => self::makeBlob( $job->getParams() ),
+                       // Additional job metadata
+                       'job_id'        => $dbw->nextSequenceValue( 'job_job_id_seq' ),
+                       'job_timestamp' => $dbw->timestamp(),
+                       'job_sha1'      => wfBaseConvert(
+                               sha1( serialize( $job->getDeduplicationInfo() ) ),
+                               16, 36, 31
+                       ),
+                       'job_random'    => mt_rand( 0, self::MAX_JOB_RANDOM )
+               );
+       }
+
+       /**
+        * @return string
+        */
+       private function getEmptinessCacheKey() {
+               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'isempty' );
+       }
+
+       /**
+        * @param string $signature Hash identifier of the root job
+        * @return string
+        */
+       private function getRootJobCacheKey( $signature ) {
+               list( $db, $prefix ) = wfSplitWikiID( $this->wiki );
+               return wfForeignMemcKey( $db, $prefix, 'jobqueue', $this->type, 'rootjob', $signature );
+       }
+
+       /**
+        * @param $params
+        * @return string
+        */
+       protected static function makeBlob( $params ) {
+               if ( $params !== false ) {
+                       return serialize( $params );
+               } else {
+                       return '';
+               }
+       }
+
+       /**
+        * @param $blob
+        * @return bool|mixed
+        */
+       protected static function extractBlob( $blob ) {
+               if ( (string)$blob !== '' ) {
+                       return unserialize( $blob );
+               } else {
+                       return false;
+               }
+       }
+}
diff --git a/includes/job/JobQueueGroup.php b/includes/job/JobQueueGroup.php
new file mode 100644 (file)
index 0000000..97e0598
--- /dev/null
@@ -0,0 +1,180 @@
+<?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
+ * @author Aaron Schulz
+ */
+
+/**
+ * Class to handle enqueueing of background jobs
+ *
+ * @ingroup JobQueue
+ * @since 1.21
+ */
+class JobQueueGroup {
+       /** @var Array */
+       protected static $instances = array();
+
+       protected $wiki; // string; wiki ID
+
+       const TYPE_DEFAULT = 1; // integer; job not in $wgJobTypesExcludedFromDefaultQueue
+       const TYPE_ANY     = 2; // integer; any job
+
+       /**
+        * @param $wiki string Wiki ID
+        */
+       protected function __construct( $wiki ) {
+               $this->wiki = $wiki;
+       }
+
+       /**
+        * @param $wiki string Wiki ID
+        * @return JobQueueGroup
+        */
+       public static function singleton( $wiki = false ) {
+               $wiki = ( $wiki === false ) ? wfWikiID() : $wiki;
+               if ( !isset( self::$instances[$wiki] ) ) {
+                       self::$instances[$wiki] = new self( $wiki );
+               }
+               return self::$instances[$wiki];
+       }
+
+       /**
+        * @param $type string
+        * @return JobQueue Job queue object for a given queue type
+        */
+       public function get( $type ) {
+               global $wgJobTypeConf;
+
+               $conf = array( 'wiki' => $this->wiki, 'type' => $type );
+               if ( isset( $wgJobTypeConf[$type] ) ) {
+                       $conf = $conf + $wgJobTypeConf[$type];
+               } else {
+                       $conf = $conf + $wgJobTypeConf['default'];
+               }
+
+               return JobQueue::factory( $conf );
+       }
+
+       /**
+        * Insert jobs into the respective queues of with the belong
+        *
+        * @param $jobs Job|array A single Job or a list of Jobs
+        * @return bool
+        */
+       public function push( $jobs ) {
+               $jobs = is_array( $jobs ) ? $jobs : array( $jobs );
+
+               $jobsByType = array(); // (job type => list of jobs)
+               foreach ( $jobs as $job ) {
+                       if ( $job instanceof Job ) {
+                               $jobsByType[$job->getType()][] = $job;
+                       } else {
+                               throw new MWException( "Attempted to push a non-Job object into a queue." );
+                       }
+               }
+
+               $ok = true;
+               foreach ( $jobsByType as $type => $jobs ) {
+                       if ( !$this->get( $type )->batchPush( $jobs ) ) {
+                               $ok = false;
+                       }
+               }
+
+               return $ok;
+       }
+
+       /**
+        * Pop a job off one of the job queues
+        *
+        * @param $type integer JobQueueGroup::TYPE_* constant
+        * @return Job|bool Returns false on failure
+        */
+       public function pop( $type = self::TYPE_DEFAULT ) {
+               $types = ( $type == self::TYPE_DEFAULT )
+                       ? $this->getDefaultQueueTypes()
+                       : $this->getQueueTypes();
+               shuffle( $types ); // avoid starvation
+
+               foreach ( $types as $type ) { // for each queue...
+                       $job = $this->get( $type )->pop();
+                       if ( $job ) {
+                               return $job; // found
+                       }
+               }
+
+               return false; // no jobs found
+       }
+
+       /**
+        * Acknowledge that a job was completed
+        *
+        * @param $job Job
+        * @return bool
+        */
+       public function ack( Job $job ) {
+               return $this->get( $job->getType() )->ack( $job );
+       }
+
+       /**
+        * Register the "root job" of a given job into the queue for de-duplication.
+        * This should only be called right *after* all the new jobs have been inserted.
+        *
+        * @param $job Job
+        * @return bool
+        */
+       public function deduplicateRootJob( Job $job ) {
+               return $this->get( $job->getType() )->deduplicateRootJob( $job );
+       }
+
+       /**
+        * Get the list of queue types
+        *
+        * @return array List of strings
+        */
+       public function getQueueTypes() {
+               global $wgJobClasses;
+
+               return array_keys( $wgJobClasses );
+       }
+
+       /**
+        * Get the list of default queue types
+        *
+        * @return array List of strings
+        */
+       public function getDefaultQueueTypes() {
+               global $wgJobTypesExcludedFromDefaultQueue;
+
+               return array_diff( $this->getQueueTypes(), $wgJobTypesExcludedFromDefaultQueue );
+       }
+
+       /**
+        * @return Array List of job types that have non-empty queues
+        */
+       public function getQueuesWithJobs() {
+               $types = array();
+               foreach ( $this->getQueueTypes() as $type ) {
+                       if ( !$this->get( $type )->isEmpty() ) {
+                               $types[] = $type;
+                       }
+               }
+               return $types;
+       }
+}
diff --git a/includes/job/README b/includes/job/README
new file mode 100644 (file)
index 0000000..57c92e9
--- /dev/null
@@ -0,0 +1,58 @@
+/*!
+\ingroup JobQueue
+\page jobqueue_design Job queue design
+
+Notes on the Job queuing system architecture.
+
+\section intro Introduction
+
+The data model consist of the following main components:
+
+* The Job object represents a particular deferred task that happens in the
+  background. All jobs subclass the Job object and put the main logic in the
+  function called run().
+* The JobQueue object represents a particular queue of jobs of a certain type.
+  For example there may be a queue for email jobs and a queue for squid purge
+  jobs.
+
+Each job type has its own queue and is associated to a storage medium. One
+queue might save its jobs in redis while another one uses would use a database.
+
+Storage medium are defined in a queue class. Before using it, you must
+define in $wgJobTypeConf a mapping of the job type to a queue class.
+
+The factory class JobQueueGroup provides helper functions:
+- getting the queue for a given job
+- route new job insertions to the proper queue
+
+The following queue classes are available:
+* JobQueueDB (stores jobs in the `job` table in a database)
+
+All queue classes support some basic operations (though some may be no-ops):
+* enqueueing a batch of jobs
+* dequeueing a single job
+* acknowledging a job is completed
+* checking if the queue is empty
+
+Some queue classes (like JobQueueDB) may dequeue jobs in random order while other
+queues might dequeue jobs in exact FIFO order. Callers should thus not assume jobs
+are executed in FIFO order.
+
+Also note that not all queue classes will have the same reliability guarantees.
+In-memory queues may lose data when restarted depending on snapshot and journal
+settings (including journal fsync() frequency).  Some queue types may totally remove
+jobs when dequeued while leaving the ack() function as a no-op; if a job is
+dequeued by a job runner, which crashes before completion, the job will be
+lost. Some jobs, like purging squid caches after a template change, may not
+require durable queues, whereas other jobs might be more important.
+
+Callers should also try to make jobs maintain correctness when executed twice.
+This is useful for queues that actually implement ack(), since they may recycle
+dequeued but un-acknowledged jobs back into the queue to be attempted again. If
+a runner dequeues a job, runs it, but then crashes before calling ack(), the
+job may be returned to the queue and run a second time. Jobs like cache purging can
+happen several times without any correctness problems. However, a pathological case
+would be if a bug causes the problem to systematically keep repeating. For example,
+a job may always throw a DB error at the end of run(). This problem is trickier to
+solve and more obnoxious for things like email jobs, for example. For such jobs,
+it might be useful to use a queue that does not retry jobs.
diff --git a/includes/job/RefreshLinksJob.php b/includes/job/RefreshLinksJob.php
deleted file mode 100644 (file)
index b23951c..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-<?php
-/**
- * Job to update links for a given title.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Background job to update links for a given title.
- *
- * @ingroup JobQueue
- */
-class RefreshLinksJob extends Job {
-
-       function __construct( $title, $params = '', $id = 0 ) {
-               parent::__construct( 'refreshLinks', $title, $params, $id );
-       }
-
-       /**
-        * Run a refreshLinks job
-        * @return boolean success
-        */
-       function run() {
-               wfProfileIn( __METHOD__ );
-
-               $linkCache = LinkCache::singleton();
-               $linkCache->clear();
-
-               if ( is_null( $this->title ) ) {
-                       $this->error = "refreshLinks: Invalid title";
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               }
-
-               # 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() . '"';
-                       wfProfileOut( __METHOD__ );
-                       return false; // XXX: what if it was just deleted?
-               }
-
-               self::runForTitleInternal( $this->title, $revision, __METHOD__ );
-
-               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' );
-       }
-}
-
-/**
- * Background job to update links for a given title.
- * Newer version for high use templates.
- *
- * @ingroup JobQueue
- */
-class RefreshLinksJob2 extends Job {
-       const MAX_TITLES_RUN = 10;
-
-       function __construct( $title, $params, $id = 0 ) {
-               parent::__construct( 'refreshLinks2', $title, $params, $id );
-       }
-
-       /**
-        * Run a refreshLinks2 job
-        * @return boolean success
-        */
-       function run() {
-               wfProfileIn( __METHOD__ );
-
-               $linkCache = LinkCache::singleton();
-               $linkCache->clear();
-
-               if ( is_null( $this->title ) ) {
-                       $this->error = "refreshLinks2: Invalid title";
-                       wfProfileOut( __METHOD__ );
-                       return false;
-               } 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';
-
-               // 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, array( 'masterPos' => $masterPos ) );
-                       }
-                       Job::batchInsert( $jobs );
-               } 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();
-                       }
-               }
-
-               wfProfileOut( __METHOD__ );
-               return true;
-       }
-}
diff --git a/includes/job/UploadFromUrlJob.php b/includes/job/UploadFromUrlJob.php
deleted file mode 100644 (file)
index e06f68e..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-<?php
-/**
- * Job for asynchronous upload-by-url.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup JobQueue
- */
-
-/**
- * Job for asynchronous upload-by-url.
- *
- * This job is in fact an interface to UploadFromUrl, which is designed such
- * that it does not require any globals. If it does, fix it elsewhere, do not
- * add globals in here.
- *
- * @ingroup JobQueue
- */
-class UploadFromUrlJob extends Job {
-       const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
-
-       /**
-        * @var UploadFromUrl
-        */
-       public $upload;
-
-       /**
-        * @var User
-        */
-       protected $user;
-
-       public function __construct( $title, $params, $id = 0 ) {
-               parent::__construct( 'uploadFromUrl', $title, $params, $id );
-       }
-
-       public function run() {
-               # Initialize this object and the upload object
-               $this->upload = new UploadFromUrl();
-               $this->upload->initialize(
-                       $this->title->getText(),
-                       $this->params['url'],
-                       false
-               );
-               $this->user = User::newFromName( $this->params['userName'] );
-
-               # Fetch the file
-               $status = $this->upload->fetchFile();
-               if ( !$status->isOk() ) {
-                       $this->leaveMessage( $status );
-                       return true;
-               }
-
-               # Verify upload
-               $result = $this->upload->verifyUpload();
-               if ( $result['status'] != UploadBase::OK ) {
-                       $status = $this->upload->convertVerifyErrorToStatus( $result );
-                       $this->leaveMessage( $status );
-                       return true;
-               }
-
-               # Check warnings
-               if ( !$this->params['ignoreWarnings'] ) {
-                       $warnings = $this->upload->checkWarnings();
-                       if ( $warnings ) {
-
-                               # Stash the upload
-                               $key = $this->upload->stashFile();
-
-                               if ( $this->params['leaveMessage'] ) {
-                                       $this->user->leaveUserMessage(
-                                               wfMessage( 'upload-warning-subj' )->text(),
-                                               wfMessage( 'upload-warning-msg',
-                                                       $key,
-                                                       $this->params['url'] )->text()
-                                       );
-                               } else {
-                                       wfSetupSession( $this->params['sessionId'] );
-                                       $this->storeResultInSession( 'Warning',
-                                               'warnings', $warnings );
-                                       session_write_close();
-                               }
-
-                               return true;
-                       }
-               }
-
-               # Perform the upload
-               $status = $this->upload->performUpload(
-                       $this->params['comment'],
-                       $this->params['pageText'],
-                       $this->params['watch'],
-                       $this->user
-               );
-               $this->leaveMessage( $status );
-               return true;
-
-       }
-
-       /**
-        * Leave a message on the user talk page or in the session according to
-        * $params['leaveMessage'].
-        *
-        * @param $status Status
-        */
-       protected function leaveMessage( $status ) {
-               if ( $this->params['leaveMessage'] ) {
-                       if ( $status->isGood() ) {
-                               $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
-                                       wfMessage( 'upload-success-msg',
-                                               $this->upload->getTitle()->getText(),
-                                               $this->params['url']
-                                       )->text() );
-                       } else {
-                               $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
-                                       wfMessage( 'upload-failure-msg',
-                                               $status->getWikiText(),
-                                               $this->params['url']
-                                       )->text() );
-                       }
-               } else {
-                       wfSetupSession( $this->params['sessionId'] );
-                       if ( $status->isOk() ) {
-                               $this->storeResultInSession( 'Success',
-                                       'filename', $this->upload->getLocalFile()->getName() );
-                       } else {
-                               $this->storeResultInSession( 'Failure',
-                                       'errors', $status->getErrorsArray() );
-                       }
-                       session_write_close();
-               }
-       }
-
-       /**
-        * Store a result in the session data. Note that the caller is responsible
-        * for appropriate session_start and session_write_close calls.
-        *
-        * @param $result String: the result (Success|Warning|Failure)
-        * @param $dataKey String: the key of the extra data
-        * @param $dataValue Mixed: the extra data itself
-        */
-       protected function storeResultInSession( $result, $dataKey, $dataValue ) {
-               $session =& self::getSessionData( $this->params['sessionKey'] );
-               $session['result'] = $result;
-               $session[$dataKey] = $dataValue;
-       }
-
-       /**
-        * Initialize the session data. Sets the intial result to queued.
-        */
-       public function initializeSessionData() {
-               $session =& self::getSessionData( $this->params['sessionKey'] );
-               $$session['result'] = 'Queued';
-       }
-
-       /**
-        * @param $key
-        * @return mixed
-        */
-       public static function &getSessionData( $key ) {
-               if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
-                       $_SESSION[self::SESSION_KEYNAME][$key] = array();
-               }
-               return $_SESSION[self::SESSION_KEYNAME][$key];
-       }
-}
diff --git a/includes/job/jobs/DoubleRedirectJob.php b/includes/job/jobs/DoubleRedirectJob.php
new file mode 100644 (file)
index 0000000..ddd4fcc
--- /dev/null
@@ -0,0 +1,210 @@
+<?php
+/**
+ * Job to fix double redirects after moving 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job to fix double redirects after moving a page
+ *
+ * @ingroup JobQueue
+ */
+class DoubleRedirectJob extends Job {
+       var $reason, $redirTitle;
+
+       /**
+        * @var User
+        */
+       static $user;
+
+       /**
+        * 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 $redirTitle Title: the title which has changed, redirects pointing to this title are fixed
+        * @param $destTitle bool Not used
+        */
+       public static function fixRedirects( $reason, $redirTitle, $destTitle = false ) {
+               # Need to use the master to get the redirect table updated in the same transaction
+               $dbw = wfGetDB( DB_MASTER );
+               $res = $dbw->select(
+                       array( 'redirect', 'page' ),
+                       array( 'page_namespace', 'page_title' ),
+                       array(
+                               'page_id = rd_from',
+                               'rd_namespace' => $redirTitle->getNamespace(),
+                               'rd_title' => $redirTitle->getDBkey()
+                       ), __METHOD__ );
+               if ( !$res->numRows() ) {
+                       return;
+               }
+               $jobs = array();
+               foreach ( $res as $row ) {
+                       $title = Title::makeTitle( $row->page_namespace, $row->page_title );
+                       if ( !$title ) {
+                               continue;
+                       }
+
+                       $jobs[] = new self( $title, array(
+                               'reason' => $reason,
+                               'redirTitle' => $redirTitle->getPrefixedDBkey() ) );
+                       # Avoid excessive memory usage
+                       if ( count( $jobs ) > 10000 ) {
+                               Job::batchInsert( $jobs );
+                               $jobs = array();
+                       }
+               }
+               Job::batchInsert( $jobs );
+       }
+
+       function __construct( $title, $params = false, $id = 0 ) {
+               parent::__construct( 'fixDoubleRedirect', $title, $params, $id );
+               $this->reason = $params['reason'];
+               $this->redirTitle = Title::newFromText( $params['redirTitle'] );
+       }
+
+       /**
+        * @return bool
+        */
+       function run() {
+               if ( !$this->redirTitle ) {
+                       $this->setLastError( 'Invalid title' );
+                       return false;
+               }
+
+               $targetRev = Revision::newFromTitle( $this->title, false, Revision::READ_LATEST );
+               if ( !$targetRev ) {
+                       wfDebug( __METHOD__.": target redirect already deleted, ignoring\n" );
+                       return true;
+               }
+               $content = $targetRev->getContent();
+               $currentDest = $content ? $content->getRedirectTarget() : null;
+               if ( !$currentDest || !$currentDest->equals( $this->redirTitle ) ) {
+                       wfDebug( __METHOD__.": Redirect has changed since the job was queued\n" );
+                       return true;
+               }
+
+               # Check for a suppression tag (used e.g. in periodically archived discussions)
+               $mw = MagicWord::get( 'staticredirect' );
+               if ( $content->matchMagicWord( $mw ) ) {
+                       wfDebug( __METHOD__.": skipping: suppressed with __STATICREDIRECT__\n" );
+                       return true;
+               }
+
+               # Find the current final destination
+               $newTitle = self::getFinalDestination( $this->redirTitle );
+               if ( !$newTitle ) {
+                       wfDebug( __METHOD__.": skipping: single redirect, circular redirect or invalid redirect destination\n" );
+                       return true;
+               }
+               if ( $newTitle->equals( $this->redirTitle ) ) {
+                       # The redirect is already right, no need to change it
+                       # This can happen if the page was moved back (say after vandalism)
+                       wfDebug( __METHOD__.": skipping, already good\n" );
+               }
+
+               # Preserve fragment (bug 14904)
+               $newTitle = Title::makeTitle( $newTitle->getNamespace(), $newTitle->getDBkey(),
+                       $currentDest->getFragment(), $newTitle->getInterwiki() );
+
+               # Fix the text
+               $newContent = $content->updateRedirect( $newTitle );
+
+               if ( $newContent->equals( $content ) ) {
+                       $this->setLastError( 'Content unchanged???' );
+                       return false;
+               }
+
+               # Save it
+               global $wgUser;
+               $oldUser = $wgUser;
+               $wgUser = $this->getUser();
+               $article = WikiPage::factory( $this->title );
+               $reason = wfMessage( 'double-redirect-fixed-' . $this->reason,
+                       $this->redirTitle->getPrefixedText(), $newTitle->getPrefixedText()
+               )->inContentLanguage()->text();
+               $article->doEditContent( $newContent, $reason, EDIT_UPDATE | EDIT_SUPPRESS_RC, false, $this->getUser() );
+               $wgUser = $oldUser;
+
+               return true;
+       }
+
+       /**
+        * Get the final destination of a redirect
+        *
+        * @param $title Title
+        *
+        * @return bool if the specified title is not a redirect, or if it is a circular redirect
+        */
+       public static function getFinalDestination( $title ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $seenTitles = array(); # Circular redirect check
+               $dest = false;
+
+               while ( true ) {
+                       $titleText = $title->getPrefixedDBkey();
+                       if ( isset( $seenTitles[$titleText] ) ) {
+                               wfDebug( __METHOD__, "Circular redirect detected, aborting\n" );
+                               return false;
+                       }
+                       $seenTitles[$titleText] = true;
+
+                       if ( $title->getInterwiki() ) {
+                               // If the target is interwiki, we have to break early (bug 40352).
+                               // Otherwise it will look up a row in the local page table
+                               // with the namespace/page of the interwiki target which can cause
+                               // unexpected results (e.g. X -> foo:Bar -> Bar -> .. )
+                               break;
+                       }
+
+                       $row = $dbw->selectRow(
+                               array( 'redirect', 'page' ),
+                               array( 'rd_namespace', 'rd_title', 'rd_interwiki' ),
+                               array(
+                                       'rd_from=page_id',
+                                       'page_namespace' => $title->getNamespace(),
+                                       'page_title' => $title->getDBkey()
+                               ), __METHOD__ );
+                       if ( !$row ) {
+                               # No redirect from here, chain terminates
+                               break;
+                       } else {
+                               $dest = $title = Title::makeTitle( $row->rd_namespace, $row->rd_title, '', $row->rd_interwiki );
+                       }
+               }
+               return $dest;
+       }
+
+       /**
+        * Get a user object for doing edits, from a request-lifetime cache
+        * @return User
+        */
+       function getUser() {
+               if ( !self::$user ) {
+                       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();
+                       }
+               }
+               return self::$user;
+       }
+}
+
diff --git a/includes/job/jobs/DuplicateJob.php b/includes/job/jobs/DuplicateJob.php
new file mode 100644 (file)
index 0000000..6e056de
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * No-op job that does nothing.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * 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
+ */
+
+/**
+ * No-op job that does nothing. Used to represent duplicates.
+ *
+ * @ingroup JobQueue
+ */
+final class DuplicateJob extends Job {
+       /**
+        * Callers should use DuplicateJob::newFromJob() instead
+        *
+        * @param $title Title
+        * @param $params Array: job parameters
+        * @param $id Integer: job id
+        */
+       function __construct( $title, $params, $id = 0 ) {
+               parent::__construct( 'duplicate', $title, $params, $id );
+       }
+
+       /**
+        * Get a duplicate no-op version of a job
+        *
+        * @param Job $job
+        * @return Job
+        */
+       public static function newFromJob( Job $job ) {
+               $job = new self( $job->getTitle(), $job->getParams(), $job->getId() );
+               $job->command = $job->getType();
+               $job->params  = is_array( $job->params ) ? $job->params : array();
+               $job->params  = array( 'isDuplicate' => true ) + $job->params;
+               return $job;
+       }
+
+       public function run() {
+               return true;
+       }
+}
diff --git a/includes/job/jobs/EmaillingJob.php b/includes/job/jobs/EmaillingJob.php
new file mode 100644 (file)
index 0000000..d359988
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+/**
+ * Old job for notification emails.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Old job used for sending single notification emails;
+ * kept for backwards-compatibility
+ *
+ * @ingroup JobQueue
+ */
+class EmaillingJob extends Job {
+       function __construct( $title, $params, $id = 0 ) {
+               parent::__construct( 'sendMail', Title::newMainPage(), $params, $id );
+       }
+
+       function run() {
+               UserMailer::send(
+                       $this->params['to'],
+                       $this->params['from'],
+                       $this->params['subj'],
+                       $this->params['body'],
+                       $this->params['replyto']
+               );
+               return true;
+       }
+
+}
diff --git a/includes/job/jobs/EnotifNotifyJob.php b/includes/job/jobs/EnotifNotifyJob.php
new file mode 100644 (file)
index 0000000..2be05b6
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * Job for notification emails.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job for email notification mails
+ *
+ * @ingroup JobQueue
+ */
+class EnotifNotifyJob extends Job {
+
+       function __construct( $title, $params, $id = 0 ) {
+               parent::__construct( 'enotifNotify', $title, $params, $id );
+       }
+
+       function run() {
+               $enotif = new EmailNotification();
+               // Get the user from ID (rename safe). Anons are 0, so defer to name.
+               if( isset( $this->params['editorID'] ) && $this->params['editorID'] ) {
+                       $editor = User::newFromId( $this->params['editorID'] );
+               // B/C, only the name might be given.
+               } else {
+                       # FIXME: newFromName could return false on a badly configured wiki.
+                       $editor = User::newFromName( $this->params['editor'], false );
+               }
+               $enotif->actuallyNotifyOnPageChange(
+                       $editor,
+                       $this->title,
+                       $this->params['timestamp'],
+                       $this->params['summary'],
+                       $this->params['minorEdit'],
+                       $this->params['oldid'],
+                       $this->params['watchers'],
+                       $this->params['pageStatus']
+               );
+               return true;
+       }
+
+}
diff --git a/includes/job/jobs/HTMLCacheUpdateJob.php b/includes/job/jobs/HTMLCacheUpdateJob.php
new file mode 100644 (file)
index 0000000..20245b3
--- /dev/null
@@ -0,0 +1,254 @@
+<?php
+/**
+ * HTML cache invalidation of all pages linking to a given title.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * 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
+ */
+
+/**
+ * Job wrapper for HTMLCacheUpdate. Gets run whenever a related
+ * job gets called from the queue.
+ *
+ * This class is designed to work efficiently with small numbers of links, and
+ * to work reasonably well with up to ~10^5 links. Above ~10^6 links, the memory
+ * and time requirements of loading all backlinked IDs in doUpdate() might become
+ * prohibitive. The requirements measured at Wikimedia are approximately:
+ *
+ *   memory: 48 bytes per row
+ *   time: 16us per row for the query plus processing
+ *
+ * The reason this query is done is to support partitioning of the job
+ * by backlinked ID. The memory issue could be allieviated by doing this query in
+ * batches, but of course LIMIT with an offset is inefficient on the DB side.
+ *
+ * The class is nevertheless a vast improvement on the previous method of using
+ * File::getLinksTo() and Title::touchArray(), which uses about 2KB of memory per
+ * link.
+ *
+ * @ingroup JobQueue
+ */
+class HTMLCacheUpdateJob extends Job {
+       /** @var BacklinkCache */
+       protected $blCache;
+
+       protected $rowsPerJob, $rowsPerQuery;
+
+       /**
+        * Construct a job
+        * @param $title Title: the title linked to
+        * @param $params Array: job parameters (table, start and end page_ids)
+        * @param $id Integer: job id
+        */
+       function __construct( $title, $params, $id = 0 ) {
+               global $wgUpdateRowsPerJob, $wgUpdateRowsPerQuery;
+
+               parent::__construct( 'htmlCacheUpdate', $title, $params, $id );
+
+               $this->rowsPerJob   = $wgUpdateRowsPerJob;
+               $this->rowsPerQuery = $wgUpdateRowsPerQuery;
+               $this->blCache      = $title->getBacklinkCache();
+       }
+
+       public function run() {
+               if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
+                       # This is hit when a job is actually performed
+                       return $this->doPartialUpdate();
+               } else {
+                       # This is hit when the jobs have to be inserted
+                       return $this->doFullUpdate();
+               }
+       }
+
+       /**
+        * Update all of the backlinks
+        */
+       protected function doFullUpdate() {
+               # Get an estimate of the number of rows from the BacklinkCache
+               $numRows = $this->blCache->getNumLinks( $this->params['table'] );
+               if ( $numRows > $this->rowsPerJob * 2 ) {
+                       # Do fast cached partition
+                       $this->insertPartitionJobs();
+               } else {
+                       # Get the links from the DB
+                       $titleArray = $this->blCache->getLinks( $this->params['table'] );
+                       # Check if the row count estimate was correct
+                       if ( $titleArray->count() > $this->rowsPerJob * 2 ) {
+                               # Not correct, do accurate partition
+                               wfDebug( __METHOD__.": row count estimate was incorrect, repartitioning\n" );
+                               $this->insertJobsFromTitles( $titleArray );
+                       } else {
+                               $this->invalidateTitles( $titleArray ); // just do the query
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * Update some of the backlinks, defined by a page ID range
+        */
+       protected function doPartialUpdate() {
+               $titleArray = $this->blCache->getLinks(
+                       $this->params['table'], $this->params['start'], $this->params['end'] );
+               if ( $titleArray->count() <= $this->rowsPerJob * 2 ) {
+                       # This partition is small enough, do the update
+                       $this->invalidateTitles( $titleArray );
+               } else {
+                       # Partitioning was excessively inaccurate. Divide the job further.
+                       # This can occur when a large number of links are added in a short
+                       # period of time, say by updating a heavily-used template.
+                       $this->insertJobsFromTitles( $titleArray );
+               }
+               return true;
+       }
+
+       /**
+        * Partition the current range given by $this->params['start'] and $this->params['end'],
+        * using a pre-calculated title array which gives the links in that range.
+        * Queue the resulting jobs.
+        *
+        * @param $titleArray array
+        * @param $rootJobParams array
+        * @rerturn void
+        */
+       protected function insertJobsFromTitles( $titleArray, $rootJobParams = array() ) {
+               // Carry over any "root job" information
+               $rootJobParams = $this->getRootJobParams();
+               # We make subpartitions in the sense that the start of the first job
+               # will be the start of the parent partition, and the end of the last
+               # job will be the end of the parent partition.
+               $jobs = array();
+               $start = $this->params['start']; # start of the current job
+               $numTitles = 0;
+               foreach ( $titleArray as $title ) {
+                       $id = $title->getArticleID();
+                       # $numTitles is now the number of titles in the current job not
+                       # including the current ID
+                       if ( $numTitles >= $this->rowsPerJob ) {
+                               # Add a job up to but not including the current ID
+                               $jobs[] = new HTMLCacheUpdateJob( $this->title,
+                                       array(
+                                               'table' => $this->params['table'],
+                                               'start' => $start,
+                                               'end'   => $id - 1
+                                       ) + $rootJobParams // carry over information for de-duplication
+                               );
+                               $start = $id;
+                               $numTitles = 0;
+                       }
+                       $numTitles++;
+               }
+               # Last job
+               $jobs[] = new HTMLCacheUpdateJob( $this->title,
+                       array(
+                               'table' => $this->params['table'],
+                               'start' => $start,
+                               'end'   => $this->params['end']
+                       ) + $rootJobParams // carry over information for de-duplication
+               );
+               wfDebug( __METHOD__.": repartitioning into " . count( $jobs ) . " jobs\n" );
+
+               if ( count( $jobs ) < 2 ) {
+                       # I don't think this is possible at present, but handling this case
+                       # makes the code a bit more robust against future code updates and
+                       # avoids a potential infinite loop of repartitioning
+                       wfDebug( __METHOD__.": repartitioning failed!\n" );
+                       $this->invalidateTitles( $titleArray );
+               } else {
+                       JobQueueGroup::singleton()->push( $jobs );
+               }
+       }
+
+       /**
+        * @param $rootJobParams array
+        * @return void
+        */
+       protected function insertPartitionJobs( $rootJobParams = array() ) {
+               // Carry over any "root job" information
+               $rootJobParams = $this->getRootJobParams();
+
+               $batches = $this->blCache->partition( $this->params['table'], $this->rowsPerJob );
+               if ( !count( $batches ) ) {
+                       return; // no jobs to insert
+               }
+
+               $jobs = array();
+               foreach ( $batches as $batch ) {
+                       list( $start, $end ) = $batch;
+                       $jobs[] = new HTMLCacheUpdateJob( $this->title,
+                               array(
+                                       'table' => $this->params['table'],
+                                       'start' => $start,
+                                       'end'   => $end,
+                               ) + $rootJobParams // carry over information for de-duplication
+                       );
+               }
+
+               JobQueueGroup::singleton()->push( $jobs );
+       }
+
+       /**
+        * Invalidate an array (or iterator) of Title objects, right now
+        * @param $titleArray array
+        */
+       protected function invalidateTitles( $titleArray ) {
+               global $wgUseFileCache, $wgUseSquid;
+
+               $dbw = wfGetDB( DB_MASTER );
+               $timestamp = $dbw->timestamp();
+
+               # Get all IDs in this query into an array
+               $ids = array();
+               foreach ( $titleArray as $title ) {
+                       $ids[] = $title->getArticleID();
+               }
+
+               if ( !$ids ) {
+                       return;
+               }
+
+               # Don't invalidated pages that were already invalidated
+               $touchedCond = isset( $this->params['rootJobTimestamp'] )
+                       ? array( "page_touched < " .
+                               $dbw->addQuotes( $dbw->timestamp( $this->params['rootJobTimestamp'] ) ) )
+                       : array();
+
+               # Update page_touched
+               $batches = array_chunk( $ids, $this->rowsPerQuery );
+               foreach ( $batches as $batch ) {
+                       $dbw->update( 'page',
+                               array( 'page_touched' => $timestamp ),
+                               array( 'page_id' => $batch ) + $touchedCond,
+                               __METHOD__
+                       );
+               }
+
+               # Update squid
+               if ( $wgUseSquid ) {
+                       $u = SquidUpdate::newFromTitles( $titleArray );
+                       $u->doUpdate();
+               }
+
+               # Update file cache
+               if  ( $wgUseFileCache ) {
+                       foreach ( $titleArray as $title ) {
+                               HTMLFileCache::clearFileCache( $title );
+                       }
+               }
+       }
+}
diff --git a/includes/job/jobs/NullJob.php b/includes/job/jobs/NullJob.php
new file mode 100644 (file)
index 0000000..99a8429
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+/**
+ * Degenerate job that does nothing.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * 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
+ */
+
+/**
+ * Degenerate job that does nothing, but can optionally replace itself
+ * in the queue and/or sleep for a brief time period. These can be used
+ * to represent "no-op" jobs or test lock contention and performance.
+ *
+ * @ingroup JobQueue
+ */
+class NullJob extends Job {
+       /**
+        * @param $title Title (can be anything)
+        * @param $params Array: job parameters (lives, usleep)
+        * @param $id Integer: job id
+        */
+       function __construct( $title, $params, $id = 0 ) {
+               parent::__construct( 'null', $title, $params, $id );
+               if ( !isset( $this->params['lives'] ) ) {
+                       $this->params['lives'] = 1;
+               }
+               if ( !isset( $this->params['usleep'] ) ) {
+                       $this->params['usleep'] = 0;
+               }
+       }
+
+       public function run() {
+               if ( $this->params['usleep'] > 0 ) {
+                       usleep( $this->params['usleep'] );
+               }
+               if ( $this->params['lives'] > 1 ) {
+                       $params = $this->params;
+                       $params['lives']--;
+                       $job = new self( $this->title, $params );
+                       $job->insert();
+               }
+               return true;
+       }
+}
diff --git a/includes/job/jobs/RefreshLinksJob.php b/includes/job/jobs/RefreshLinksJob.php
new file mode 100644 (file)
index 0000000..20e4f16
--- /dev/null
@@ -0,0 +1,226 @@
+<?php
+/**
+ * Job to update links for a given title.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Background job to update links for a given title.
+ *
+ * @ingroup JobQueue
+ */
+class RefreshLinksJob extends Job {
+       function __construct( $title, $params = '', $id = 0 ) {
+               parent::__construct( 'refreshLinks', $title, $params, $id );
+               $this->removeDuplicates = true; // job is expensive
+       }
+
+       /**
+        * Run a refreshLinks job
+        * @return boolean success
+        */
+       function run() {
+               wfProfileIn( __METHOD__ );
+
+               $linkCache = LinkCache::singleton();
+               $linkCache->clear();
+
+               if ( is_null( $this->title ) ) {
+                       $this->error = "refreshLinks: Invalid title";
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               # 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() . '"';
+                       wfProfileOut( __METHOD__ );
+                       return false; // XXX: what if it was just deleted?
+               }
+
+               self::runForTitleInternal( $this->title, $revision, __METHOD__ );
+
+               wfProfileOut( __METHOD__ );
+               return true;
+       }
+
+       /**
+        * @return Array
+        */
+       public function getDeduplicationInfo() {
+               $info = parent::getDeduplicationInfo();
+               // Don't let highly unique "masterPos" values ruin duplicate detection
+               if ( is_array( $info['params'] ) ) {
+                       unset( $info['params']['masterPos'] );
+               }
+               return $info;
+       }
+
+       /**
+        * @param $title Title
+        * @param $revision Revision
+        * @param $fname string
+        * @return void
+        */
+       public static function runForTitleInternal( Title $title, Revision $revision, $fname ) {
+               wfProfileIn( $fname );
+               $content = $revision->getContent( Revision::RAW );
+
+               if ( !$content ) {
+                       // if there is no content, pretend the content is empty
+                       $content = $revision->getContentHandler()->makeEmptyContent();
+               }
+
+               // Revision ID must be passed to the parser output to get revision variables correct
+               $parserOutput = $content->getParserOutput( $title, $revision->getId(), null, false );
+
+               $updates = $content->getSecondaryDataUpdates( $title, null, false, $parserOutput );
+               DataUpdate::runUpdates( $updates );
+               wfProfileOut( $fname );
+       }
+}
+
+/**
+ * Background job to update links for a given title.
+ * Newer version for high use templates.
+ *
+ * @ingroup JobQueue
+ */
+class RefreshLinksJob2 extends Job {
+       function __construct( $title, $params, $id = 0 ) {
+               parent::__construct( 'refreshLinks2', $title, $params, $id );
+       }
+
+       /**
+        * Run a refreshLinks2 job
+        * @return boolean success
+        */
+       function run() {
+               global $wgUpdateRowsPerJob;
+
+               wfProfileIn( __METHOD__ );
+
+               $linkCache = LinkCache::singleton();
+               $linkCache->clear();
+
+               if ( is_null( $this->title ) ) {
+                       $this->error = "refreshLinks2: Invalid title";
+                       wfProfileOut( __METHOD__ );
+                       return false;
+               }
+
+               // Back compat for pre-r94435 jobs
+               $table = isset( $this->params['table'] ) ? $this->params['table'] : 'templatelinks';
+
+               // Avoid slave lag when fetching templates.
+               // When the outermost job is run, we know that the caller that enqueued it must have
+               // committed the relevant changes to the DB by now. At that point, record the master
+               // position and pass it along as the job recursively breaks into smaller range jobs.
+               // Hopefully, when leaf jobs are popped, the slaves will have reached that position.
+               if ( isset( $this->params['masterPos'] ) ) {
+                       $masterPos = $this->params['masterPos'];
+               } elseif ( wfGetLB()->getServerCount() > 1  ) {
+                       $masterPos = wfGetLB()->getMasterPos();
+               } else {
+                       $masterPos = false;
+               }
+
+               $tbc  = $this->title->getBacklinkCache();
+
+               $jobs = array(); // jobs to insert
+               if ( isset( $this->params['start'] ) && isset( $this->params['end'] ) ) {
+                       # This is a partition job to trigger the insertion of leaf jobs...
+                       $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
+               } else {
+                       # This is a base job to trigger the insertion of partitioned jobs...
+                       if ( $tbc->getNumLinks( $table ) <= $wgUpdateRowsPerJob ) {
+                               # Just directly insert the single per-title jobs
+                               $jobs = array_merge( $jobs, $this->getSingleTitleJobs( $table, $masterPos ) );
+                       } else {
+                               # Insert the partition jobs to make per-title jobs
+                               foreach ( $tbc->partition( $table, $wgUpdateRowsPerJob ) as $batch ) {
+                                       list( $start, $end ) = $batch;
+                                       $jobs[] = new RefreshLinksJob2( $this->title,
+                                               array(
+                                                       'table'            => $table,
+                                                       'start'            => $start,
+                                                       'end'              => $end,
+                                                       'masterPos'        => $masterPos,
+                                               ) + $this->getRootJobParams() // carry over information for de-duplication
+                                       );
+                               }
+                       }
+               }
+
+               if ( count( $jobs ) ) {
+                       JobQueueGroup::singleton()->push( $jobs );
+               }
+
+               wfProfileOut( __METHOD__ );
+               return true;
+       }
+
+       /**
+        * @param $table string
+        * @param $masterPos mixed
+        * @return Array
+        */
+       protected function getSingleTitleJobs( $table, $masterPos ) {
+               # The "start"/"end" fields are not set for the base jobs
+               $start  = isset( $this->params['start'] ) ? $this->params['start'] : false;
+               $end    = isset( $this->params['end'] ) ? $this->params['end'] : false;
+               $titles = $this->title->getBacklinkCache()->getLinks( $table, $start, $end );
+               # Convert into single page refresh links jobs.
+               # This handles well when in sapi mode and is useful in any case for job
+               # de-duplication. If many pages use template A, and that template itself
+               # uses template B, then an edit to both will create many duplicate jobs.
+               # Roughly speaking, for each page, one of the "RefreshLinksJob" jobs will
+               # get run first, and when it does, it will remove the duplicates. Of course,
+               # one page could have its job popped when the other page's job is still
+               # buried within the logic of a refreshLinks2 job.
+               $jobs = array();
+               foreach ( $titles as $title ) {
+                       $jobs[] = new RefreshLinksJob( $title,
+                               array( 'masterPos' => $masterPos ) + $this->getRootJobParams()
+                       ); // carry over information for de-duplication
+               }
+               return $jobs;
+       }
+
+       /**
+        * @return Array
+        */
+       public function getDeduplicationInfo() {
+               $info = parent::getDeduplicationInfo();
+               // Don't let highly unique "masterPos" values ruin duplicate detection
+               if ( is_array( $info['params'] ) ) {
+                       unset( $info['params']['masterPos'] );
+               }
+               return $info;
+       }
+}
diff --git a/includes/job/jobs/UploadFromUrlJob.php b/includes/job/jobs/UploadFromUrlJob.php
new file mode 100644 (file)
index 0000000..e06f68e
--- /dev/null
@@ -0,0 +1,179 @@
+<?php
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup JobQueue
+ */
+
+/**
+ * Job for asynchronous upload-by-url.
+ *
+ * This job is in fact an interface to UploadFromUrl, which is designed such
+ * that it does not require any globals. If it does, fix it elsewhere, do not
+ * add globals in here.
+ *
+ * @ingroup JobQueue
+ */
+class UploadFromUrlJob extends Job {
+       const SESSION_KEYNAME = 'wsUploadFromUrlJobData';
+
+       /**
+        * @var UploadFromUrl
+        */
+       public $upload;
+
+       /**
+        * @var User
+        */
+       protected $user;
+
+       public function __construct( $title, $params, $id = 0 ) {
+               parent::__construct( 'uploadFromUrl', $title, $params, $id );
+       }
+
+       public function run() {
+               # Initialize this object and the upload object
+               $this->upload = new UploadFromUrl();
+               $this->upload->initialize(
+                       $this->title->getText(),
+                       $this->params['url'],
+                       false
+               );
+               $this->user = User::newFromName( $this->params['userName'] );
+
+               # Fetch the file
+               $status = $this->upload->fetchFile();
+               if ( !$status->isOk() ) {
+                       $this->leaveMessage( $status );
+                       return true;
+               }
+
+               # Verify upload
+               $result = $this->upload->verifyUpload();
+               if ( $result['status'] != UploadBase::OK ) {
+                       $status = $this->upload->convertVerifyErrorToStatus( $result );
+                       $this->leaveMessage( $status );
+                       return true;
+               }
+
+               # Check warnings
+               if ( !$this->params['ignoreWarnings'] ) {
+                       $warnings = $this->upload->checkWarnings();
+                       if ( $warnings ) {
+
+                               # Stash the upload
+                               $key = $this->upload->stashFile();
+
+                               if ( $this->params['leaveMessage'] ) {
+                                       $this->user->leaveUserMessage(
+                                               wfMessage( 'upload-warning-subj' )->text(),
+                                               wfMessage( 'upload-warning-msg',
+                                                       $key,
+                                                       $this->params['url'] )->text()
+                                       );
+                               } else {
+                                       wfSetupSession( $this->params['sessionId'] );
+                                       $this->storeResultInSession( 'Warning',
+                                               'warnings', $warnings );
+                                       session_write_close();
+                               }
+
+                               return true;
+                       }
+               }
+
+               # Perform the upload
+               $status = $this->upload->performUpload(
+                       $this->params['comment'],
+                       $this->params['pageText'],
+                       $this->params['watch'],
+                       $this->user
+               );
+               $this->leaveMessage( $status );
+               return true;
+
+       }
+
+       /**
+        * Leave a message on the user talk page or in the session according to
+        * $params['leaveMessage'].
+        *
+        * @param $status Status
+        */
+       protected function leaveMessage( $status ) {
+               if ( $this->params['leaveMessage'] ) {
+                       if ( $status->isGood() ) {
+                               $this->user->leaveUserMessage( wfMessage( 'upload-success-subj' )->text(),
+                                       wfMessage( 'upload-success-msg',
+                                               $this->upload->getTitle()->getText(),
+                                               $this->params['url']
+                                       )->text() );
+                       } else {
+                               $this->user->leaveUserMessage( wfMessage( 'upload-failure-subj' )->text(),
+                                       wfMessage( 'upload-failure-msg',
+                                               $status->getWikiText(),
+                                               $this->params['url']
+                                       )->text() );
+                       }
+               } else {
+                       wfSetupSession( $this->params['sessionId'] );
+                       if ( $status->isOk() ) {
+                               $this->storeResultInSession( 'Success',
+                                       'filename', $this->upload->getLocalFile()->getName() );
+                       } else {
+                               $this->storeResultInSession( 'Failure',
+                                       'errors', $status->getErrorsArray() );
+                       }
+                       session_write_close();
+               }
+       }
+
+       /**
+        * Store a result in the session data. Note that the caller is responsible
+        * for appropriate session_start and session_write_close calls.
+        *
+        * @param $result String: the result (Success|Warning|Failure)
+        * @param $dataKey String: the key of the extra data
+        * @param $dataValue Mixed: the extra data itself
+        */
+       protected function storeResultInSession( $result, $dataKey, $dataValue ) {
+               $session =& self::getSessionData( $this->params['sessionKey'] );
+               $session['result'] = $result;
+               $session[$dataKey] = $dataValue;
+       }
+
+       /**
+        * Initialize the session data. Sets the intial result to queued.
+        */
+       public function initializeSessionData() {
+               $session =& self::getSessionData( $this->params['sessionKey'] );
+               $$session['result'] = 'Queued';
+       }
+
+       /**
+        * @param $key
+        * @return mixed
+        */
+       public static function &getSessionData( $key ) {
+               if ( !isset( $_SESSION[self::SESSION_KEYNAME][$key] ) ) {
+                       $_SESSION[self::SESSION_KEYNAME][$key] = array();
+               }
+               return $_SESSION[self::SESSION_KEYNAME][$key];
+       }
+}
index f67700c..75da5c7 100644 (file)
@@ -31,21 +31,16 @@ class FormatJson {
         * Returns the JSON representation of a value.
         *
         * @param $value Mixed: the value being encoded. Can be any type except a resource.
-        * @param $isHtml Boolean
-        *
-        * @todo FIXME: "$isHtml" parameter's purpose is not documented. It appears to
-        *        map to a parameter labeled "pretty-print output with indents and
-        *        newlines" in Services_JSON::encode(), which has no string relation
-        *        to HTML output.
+        * @param $pretty Boolean: If true, adds non-significant whitespace to improve readability.
         *
         * @return string
         */
-       public static function encode( $value, $isHtml = false ) {
-               if ( !function_exists( 'json_encode' ) || ( $isHtml && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
+       public static function encode( $value, $pretty = false ) {
+               if ( !function_exists( 'json_encode' ) || ( $pretty && version_compare( PHP_VERSION, '5.4.0', '<' ) ) ) {
                        $json = new Services_JSON();
-                       return $json->encode( $value, $isHtml );
+                       return $json->encode( $value, $pretty );
                } else {
-                       return json_encode( $value, $isHtml ? JSON_PRETTY_PRINT : 0 );
+                       return json_encode( $value, $pretty ? JSON_PRETTY_PRINT : 0 );
                }
        }
 
index 398ed6a..2566072 100644 (file)
@@ -283,7 +283,7 @@ class Services_JSON
                return $this->encode2($var);
        }
 
-       /**
+       /**
         * encodes an arbitrary variable into JSON format
         *
         * @param $var Mixed: any number, boolean, string, array, or object to be encoded.
index b4b9d61..9b3e796 100644 (file)
@@ -28,9 +28,8 @@
  * @since 1.20
  *
  * @file
- * @ingroup Diff
  *
- * @licence GNU GPL v2+
+ * @license GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
 abstract class GenericArrayObject extends ArrayObject {
@@ -61,13 +60,11 @@ abstract class GenericArrayObject extends ArrayObject {
         * @return integer
         */
        protected function getNewOffset() {
-               while ( true ) {
-                       if ( !$this->offsetExists( $this->indexOffset ) ) {
-                               return $this->indexOffset;
-                       }
-
+               while ( $this->offsetExists( $this->indexOffset ) ) {
                        $this->indexOffset++;
                }
+
+               return $this->indexOffset;
        }
 
        /**
index 0b4be9a..db5326c 100644 (file)
@@ -59,7 +59,7 @@ class JavaScriptMinifier {
        const TYPE_DO          = 15; // keywords: case, var, finally, else, do, try
        const TYPE_FUNC        = 16; // keywords: function
        const TYPE_LITERAL     = 17; // all literals, identifiers and unrecognised tokens
-       
+
        // Sanity limit to avoid excessive memory usage
        const STACK_LIMIT = 1000;
 
@@ -385,7 +385,7 @@ class JavaScriptMinifier {
                                self::TYPE_LITERAL    => true
                        )
                );
-               
+
                // Rules for when newlines should be inserted if
                // $statementsOnOwnLine is enabled.
                // $newlineBefore is checked before switching state,
@@ -514,7 +514,7 @@ class JavaScriptMinifier {
                                                return self::parseError($s, $end, 'Number with several E' );
                                        }
                                        $end++;
-                                       
+
                                        // + sign is optional; - sign is required.
                                        $end += strspn( $s, '-+', $end );
                                        $len = strspn( $s, '0123456789', $end );
@@ -564,13 +564,13 @@ class JavaScriptMinifier {
                                $out .= ' ';
                                $lineLength++;
                        }
-                       
+
                        $out .= $token;
                        $lineLength += $end - $pos; // += strlen( $token )
                        $last = $s[$end - 1];
                        $pos = $end;
                        $newlineFound = false;
-                       
+
                        // Output a newline after the token if required
                        // This is checked before AND after switching state
                        $newlineAdded = false;
@@ -589,7 +589,7 @@ class JavaScriptMinifier {
                        } elseif( isset( $goto[$state][$type] ) ) {
                                $state = $goto[$state][$type];
                        }
-                       
+
                        // Check for newline insertion again
                        if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineAfter[$state][$type] ) ) {
                                $out .= "\n";
@@ -598,7 +598,7 @@ class JavaScriptMinifier {
                }
                return $out;
        }
-       
+
        static function parseError($fullJavascript, $position, $errorMsg) {
                // TODO: Handle the error: trigger_error, throw exception, return false...
                return false;
index 37560d8..1f94b43 100644 (file)
@@ -175,6 +175,7 @@ class DatabaseLogEntry extends LogEntryBase {
 
        /// Database result row.
        protected $row;
+       protected $performer;
 
        protected function __construct( $row ) {
                $this->row = $row;
@@ -232,17 +233,20 @@ class DatabaseLogEntry extends LogEntryBase {
        }
 
        public function getPerformer() {
-               $userId = (int) $this->row->log_user;
-               if ( $userId !== 0 ) { // logged-in users
-                       if ( isset( $this->row->user_name ) ) {
-                               return User::newFromRow( $this->row );
-                       } else {
-                               return User::newFromId( $userId );
+               if( !$this->performer ) {
+                       $userId = (int) $this->row->log_user;
+                       if ( $userId !== 0 ) { // logged-in users
+                               if ( isset( $this->row->user_name ) ) {
+                                       $this->performer = User::newFromRow( $this->row );
+                               } else {
+                                       $this->performer = User::newFromId( $userId );
+                               }
+                       } else { // IP users
+                               $userText = $this->row->log_user_text;
+                               $this->performer = User::newFromName( $userText, false );
                        }
-               } else { // IP users
-                       $userText = $this->row->log_user_text;
-                       return User::newFromName( $userText, false );
                }
+               return $this->performer;
        }
 
        public function getTarget() {
@@ -287,14 +291,17 @@ class RCDatabaseLogEntry extends DatabaseLogEntry {
        }
 
        public function getPerformer() {
-               $userId = (int) $this->row->rc_user;
-               if ( $userId !== 0 ) {
-                       return User::newFromId( $userId );
-               } else {
-                       $userText = $this->row->rc_user_text;
-                       // Might be an IP, don't validate the username
-                       return User::newFromName( $userText, false );
+               if( !$this->performer ) {
+                       $userId = (int) $this->row->rc_user;
+                       if ( $userId !== 0 ) {
+                               $this->performer = User::newFromId( $userId );
+                       } else {
+                               $userText = $this->row->rc_user_text;
+                               // Might be an IP, don't validate the username
+                               $this->performer = User::newFromName( $userText, false );
+                       }
                }
+               return $this->performer;
        }
 
        public function getTarget() {
@@ -335,9 +342,9 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Constructor.
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param string $type
         * @param string $subtype
         */
@@ -357,9 +364,9 @@ class ManualLogEntry extends LogEntryBase {
         *   '4:color' => 'blue',
         *   'animal' => 'dog'
         * );
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param $parameters array Associative array
         */
        public function setParameters( $parameters ) {
@@ -368,9 +375,9 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Set the user that performed the action being logged.
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param User $performer
         */
        public function setPerformer( User $performer ) {
@@ -379,9 +386,9 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Set the title of the object changed.
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param Title $target
         */
        public function setTarget( Title $target ) {
@@ -390,9 +397,9 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Set the timestamp of when the logged action took place.
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param string $timestamp
         */
        public function setTimestamp( $timestamp ) {
@@ -401,9 +408,9 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * Set a comment associated with the action being logged.
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param string $comment
         */
        public function setComment( $comment ) {
@@ -412,9 +419,9 @@ class ManualLogEntry extends LogEntryBase {
 
        /**
         * TODO: document
-        * 
+        *
         * @since 1.19
-        * 
+        *
         * @param integer $deleted
         */
        public function setDeleted( $deleted ) {
index 7586bb6..8c1e294 100644 (file)
@@ -293,6 +293,28 @@ class LogFormatter {
                                }
                                break;
 
+                       case 'rights':
+                               if ( count( $parameters['4::oldgroups'] ) ) {
+                                       $oldgroups = implode( ', ', $parameters['4::oldgroups'] );
+                               } else {
+                                       $oldgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
+                               }
+                               if ( count( $parameters['5::newgroups'] ) ) {
+                                       $newgroups = implode( ', ', $parameters['5::newgroups'] );
+                               } else {
+                                       $newgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
+                               }
+                               switch( $entry->getSubtype() ) {
+                                       case 'rights':
+                                               $text = wfMessage( 'rightslogentry' )
+                                                       ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
+                                               break;
+                                       case 'autopromote':
+                                               $text = wfMessage( 'rightslogentry-autopromote' )
+                                                       ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
+                                               break;
+                               }
+                               break;
 
                        // case 'suppress' --private log -- aaron  (sign your messages so we know who to blame in a few years :-D)
                        // default:
@@ -429,6 +451,7 @@ class LogFormatter {
         * value in consideration.
         * @param $title Title the page
         * @param $parameters array query parameters
+        * @throws MWException
         * @return String
         */
        protected function makePageLink( Title $title = null, $parameters = array() ) {
@@ -1008,3 +1031,88 @@ class NewUsersLogFormatter extends LogFormatter {
                return array();
        }
 }
+
+/**
+ * This class formats rights log entries.
+ * @since 1.21
+ */
+class RightsLogFormatter extends LogFormatter {
+       protected function makePageLink( Title $title = null, $parameters = array() ) {
+               global $wgContLang, $wgUserrightsInterwikiDelimiter;
+
+               if ( !$this->plaintext ) {
+                       $text = $wgContLang->ucfirst( $title->getText() );
+                       $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
+
+                       if ( count( $parts ) === 2 ) {
+                               $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
+                                       htmlspecialchars( $title->getPrefixedText() ) );
+
+                               if ( $titleLink !== false ) {
+                                       return $titleLink;
+                               }
+                       }
+               }
+
+               return parent::makePageLink( $title, $parameters );
+       }
+
+       protected function getMessageKey() {
+               $key = parent::getMessageKey();
+               $params = $this->getMessageParameters();
+               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+                       $key .= '-legacy';
+               }
+               return $key;
+       }
+
+       protected function getMessageParameters() {
+               $params = parent::getMessageParameters();
+
+               // Really old entries
+               if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
+                       return $params;
+               }
+
+               $oldGroups = $params[3];
+               $newGroups = $params[4];
+
+               // Less old entries
+               if ( $oldGroups === '' ) {
+                       $oldGroups = array();
+               } elseif ( is_string( $oldGroups ) ) {
+                       $oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
+               }
+               if ( $newGroups === '' ) {
+                       $newGroups = array();
+               } elseif ( is_string( $newGroups ) ) {
+                       $newGroups = array_map( 'trim', explode( ',', $newGroups ) );
+               }
+
+               $userName = $this->entry->getTarget()->getText();
+               if ( !$this->plaintext && count( $oldGroups ) ) {
+                       foreach ( $oldGroups as &$group ) {
+                               $group = User::getGroupMember( $group, $userName );
+                       }
+               }
+               if ( !$this->plaintext && count( $newGroups ) ) {
+                       foreach ( $newGroups as &$group ) {
+                               $group = User::getGroupMember( $group, $userName );
+                       }
+               }
+
+               $lang = $this->context->getLanguage();
+               if ( count( $oldGroups ) ) {
+                       $params[3] = $lang->listToText( $oldGroups );
+               } else {
+                       $params[3] = $this->msg( 'rightsnone' )->text();
+               }
+               if ( count( $newGroups ) ) {
+                       $params[4] = $lang->listToText( $newGroups );
+               } else {
+                       $params[4] = $this->msg( 'rightsnone' )->text();
+               }
+
+               return $params;
+       }
+}
index d96a5ea..07238a0 100644 (file)
@@ -220,7 +220,7 @@ class LogPage {
        }
 
        /**
-        * Generate text for a log entry. 
+        * Generate text for a log entry.
         * Only LogFormatter should call this function.
         *
         * @param $type String: log type
@@ -253,29 +253,6 @@ class LogPage {
                        } else {
                                $titleLink = self::getTitleLink( $type, $langObjOrNull, $title, $params );
 
-                               if( preg_match( '/^rights\/(rights|autopromote)/', $key ) ) {
-                                       $rightsnone = wfMessage( 'rightsnone' )->inLanguage( $langObj )->text();
-
-                                       if( $skin ) {
-                                               $username = $title->getText();
-                                               foreach ( $params as &$param ) {
-                                                       $groupArray = array_map( 'trim', explode( ',', $param ) );
-                                                       foreach( $groupArray as &$group ) {
-                                                               $group = User::getGroupMember( $group, $username );
-                                                       }
-                                                       $param = $wgLang->listToText( $groupArray );
-                                               }
-                                       }
-
-                                       if( !isset( $params[0] ) || trim( $params[0] ) == '' ) {
-                                               $params[0] = $rightsnone;
-                                       }
-
-                                       if( !isset( $params[1] ) || trim( $params[1] ) == '' ) {
-                                               $params[1] = $rightsnone;
-                                       }
-                               }
-
                                if( count( $params ) == 0 ) {
                                        $rv = wfMessage( $wgLogActions[$key] )->rawParams( $titleLink )->inLanguage( $langObj )->escaped();
                                } else {
@@ -350,8 +327,6 @@ class LogPage {
         * @return String
         */
        protected static function getTitleLink( $type, $lang, $title, &$params ) {
-               global $wgContLang, $wgUserrightsInterwikiDelimiter;
-
                if( !$lang ) {
                        return $title->getPrefixedText();
                }
@@ -388,20 +363,6 @@ class LogPage {
                                                . Linker::userToolLinks( $id, $title->getText(), false, Linker::TOOL_LINKS_NOBLOCK );
                                }
                                break;
-                       case 'rights':
-                               $text = $wgContLang->ucfirst( $title->getText() );
-                               $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
-
-                               if ( count( $parts ) == 2 ) {
-                                       $titleLink = WikiMap::foreignUserLink( $parts[1], $parts[0],
-                                               htmlspecialchars( $title->getPrefixedText() ) );
-
-                                       if ( $titleLink !== false ) {
-                                               break;
-                                       }
-                               }
-                               $titleLink = Linker::link( Title::makeTitle( NS_USER, $text ) );
-                               break;
                        case 'merge':
                                $titleLink = Linker::link(
                                        $title,
index 99ac854..ca9b636 100644 (file)
@@ -623,7 +623,8 @@ class BitmapHandler extends ImageHandler {
         * to filter down to users.
         *
         * @param $path string The file path
-        * @param $scene string The scene specification, or false if there is none
+        * @param bool|string $scene The scene specification, or false if there is none
+        * @throws MWException
         * @return string
         */
        function escapeMagickInput( $path, $scene = false ) {
@@ -654,7 +655,8 @@ class BitmapHandler extends ImageHandler {
         * helper function for escapeMagickInput() and escapeMagickOutput().
         *
         * @param $path string The file path
-        * @param $scene string The scene specification, or false if there is none
+        * @param bool|string $scene The scene specification, or false if there is none
+        * @throws MWException
         * @return string
         */
        protected function escapeMagickPath( $path, $scene = false ) {
index 0a19554..2b04f78 100644 (file)
@@ -240,7 +240,7 @@ class BitmapMetadataHandler {
 
                unset( $baseArray['comment'] );
                unset( $baseArray['xmp'] );
-       
+
                $baseArray['metadata'] = $meta->getMetadataArray();
                $baseArray['metadata']['_MW_GIF_VERSION'] = GIFMetadataExtractor::VERSION;
                return $baseArray;
@@ -257,6 +257,7 @@ class BitmapMetadataHandler {
         *
         * The various exceptions this throws are caught later.
         * @param $filename String
+        * @throws MWException
         * @return Array The metadata.
         */
        static public function Tiff ( $filename ) {
index 6aef562..bdedbd1 100644 (file)
@@ -228,7 +228,7 @@ class DjVuImage {
        function retrieveMetaData() {
                global $wgDjvuToXML, $wgDjvuDump, $wgDjvuTxt;
                wfProfileIn( __METHOD__ );
-               
+
                if ( isset( $wgDjvuDump ) ) {
                        # djvudump is faster as of version 3.5
                        # http://sourceforge.net/tracker/index.php?func=detail&aid=1704049&group_id=32953&atid=406583
@@ -247,12 +247,12 @@ class DjVuImage {
                        $xml = null;
                }
                # Text layer
-               if ( isset( $wgDjvuTxt ) ) { 
+               if ( isset( $wgDjvuTxt ) ) {
                        wfProfileIn( 'djvutxt' );
                        $cmd = wfEscapeShellArg( $wgDjvuTxt ) . ' --detail=page ' . wfEscapeShellArg( $this->mFilename ) ;
                        wfDebug( __METHOD__.": $cmd\n" );
                        $retval = '';
-                       $txt = wfShellExec( $cmd, $retval );
+                       $txt = wfShellExec( $cmd, $retval, array(), array( 'memory' => 300000 ) );
                        wfProfileOut( 'djvutxt' );
                        if( $retval == 0) {
                                # Strip some control characters
@@ -260,7 +260,7 @@ class DjVuImage {
                                $reg = <<<EOR
                                        /\(page\s[\d-]*\s[\d-]*\s[\d-]*\s[\d-]*\s*"
                                        ((?>    # Text to match is composed of atoms of either:
-                                         \\\\. # - any escaped character 
+                                         \\\\. # - any escaped character
                                          |     # - any character different from " and \
                                          [^"\\\\]+
                                        )*?)
index 784a601..bdacbc8 100644 (file)
@@ -104,6 +104,7 @@ class Exif {
         *
         * @param $file String: filename.
         * @param $byteOrder String Type of byte ordering either 'BE' (Big Endian) or 'LE' (Little Endian). Default ''.
+        * @throws MWException
         * @todo FIXME: The following are broke:
         * SubjectArea. Need to test the more obscure tags.
         *
@@ -388,7 +389,7 @@ class Exif {
                $this->charCodeString( 'UserComment' );
                $this->charCodeString( 'GPSProcessingMethod');
                $this->charCodeString( 'GPSAreaInformation' );
-               
+
                //ComponentsConfiguration should really be an array instead of a string...
                //This turns a string of binary numbers into an array of numbers.
 
@@ -401,7 +402,7 @@ class Exif {
                        $ccVals['_type'] = 'ol'; //this is for formatting later.
                        $this->mFilteredExifData['ComponentsConfiguration'] = $ccVals;
                }
-       
+
                //GPSVersion(ID) is treated as the wrong type by php exif support.
                //Go through each byte turning it into a version string.
                //For example: "\x02\x02\x00\x00" -> "2.2.0.0"
@@ -450,8 +451,7 @@ class Exif {
                        }
                        $charCode = substr( $this->mFilteredExifData[$prop], 0, 8);
                        $val = substr( $this->mFilteredExifData[$prop], 8);
-                       
-                       
+
                        switch ($charCode) {
                                case "\x4A\x49\x53\x00\x00\x00\x00\x00":
                                        //JIS
@@ -480,7 +480,7 @@ class Exif {
                                        wfRestoreWarnings();
                                }
                        }
-                       
+
                        //trim and check to make sure not only whitespace.
                        $val = trim($val);
                        if ( strlen( $val ) === 0 ) {
@@ -748,10 +748,10 @@ class Exif {
                        return false;
                }
                if( $count > 1 ) {
-                       foreach( $val as $v ) { 
+                       foreach( $val as $v ) {
                                if( !$this->validate( $section, $tag, $v, true ) ) {
-                                       return false; 
-                               } 
+                                       return false;
+                               }
                        }
                        return true;
                }
index 843c1fa..f2710f7 100644 (file)
@@ -1361,7 +1361,7 @@ class FormatExif {
         * @param $meta array
         */
        function FormatExif( $meta ) {
-               wfDeprecated(__METHOD__);
+               wfDeprecated( __METHOD__, '1.18' );
                $this->meta = $meta;
        }
 
index 84b9b8c..da8fc6f 100644 (file)
@@ -29,7 +29,7 @@
 class GIFHandler extends BitmapHandler {
 
        const BROKEN_FILE = '0'; // value to store in img_metadata if error extracting metadata.
-       
+
        function getMetadata( $image, $filename ) {
                try {
                        $parsedGIFMetadata = BitmapMetadataHandler::GIF( $filename );
@@ -143,7 +143,7 @@ class GIFHandler extends BitmapHandler {
                wfSuppressWarnings();
                $metadata = unserialize($image->getMetadata());
                wfRestoreWarnings();
-               
+
                if (!$metadata || $metadata['frameCount'] <=  1) {
                        return $original;
                }
@@ -151,19 +151,19 @@ class GIFHandler extends BitmapHandler {
                /* Preserve original image info string, but strip the last char ')' so we can add even more */
                $info = array();
                $info[] = $original;
-               
+
                if ( $metadata['looped'] ) {
                        $info[] = wfMessage( 'file-info-gif-looped' )->parse();
                }
-               
+
                if ( $metadata['frameCount'] > 1 ) {
                        $info[] = wfMessage( 'file-info-gif-frames' )->numParams( $metadata['frameCount'] )->parse();
                }
-               
+
                if ( $metadata['duration'] ) {
                        $info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
                }
-               
+
                return $wgLang->commaList( $info );
        }
 }
index 5fc5c1a..7a162c3 100644 (file)
@@ -58,7 +58,7 @@ class GIFMetadataExtractor {
                $isLooped = false;
                $xmp = "";
                $comment = array();
-               
+
                if ( !$filename ) {
                        throw new Exception( "No file name specified" );
                } elseif ( !file_exists( $filename ) || is_dir( $filename ) ) {
@@ -107,7 +107,7 @@ class GIFMetadataExtractor {
                                ## Read GCT
                                self::readGCT( $fh, $bpp );
                                fread( $fh, 1 );
-                               self::skipBlock( $fh ); 
+                               self::skipBlock( $fh );
                        } elseif ( $buf == self::$gif_extension_sep ) {
                                $buf = fread( $fh, 1 );
                                if ( strlen( $buf ) < 1 ) throw new Exception( "Ran out of input" );
@@ -182,23 +182,22 @@ class GIFMetadataExtractor {
 
                                        // NETSCAPE2.0 (application name for animated gif)
                                        if ( $data == 'NETSCAPE2.0' ) {
-                                       
                                                $data = fread( $fh, 2 ); // Block length and introduction, should be 03 01
 
                                                if ($data != "\x03\x01") {
                                                        throw new Exception( "Expected \x03\x01, got $data" );
                                                }
-                                               
+
                                                // Unsigned little-endian integer, loop count or zero for "forever"
                                                $loopData = fread( $fh, 2 );
                                                if ( strlen( $loopData ) < 2 ) throw new Exception( "Ran out of input" );
                                                $loopData = unpack( 'v', $loopData );
                                                $loopCount = $loopData[1];
-                                               
+
                                                if ($loopCount != 1) {
                                                        $isLooped = true;
                                                }
-                                               
+
                                                // Read out terminator byte
                                                fread( $fh, 1 );
                                        } elseif ( $data == 'XMP DataXMP' ) {
@@ -260,6 +259,7 @@ class GIFMetadataExtractor {
 
        /**
         * @param $data
+        * @throws Exception
         * @return int
         */
        static function decodeBPP( $data ) {
@@ -276,7 +276,7 @@ class GIFMetadataExtractor {
 
        /**
         * @param $fh
-        * @return
+        * @throws Exception
         */
        static function skipBlock( $fh ) {
                while ( !feof( $fh ) ) {
@@ -290,6 +290,7 @@ class GIFMetadataExtractor {
                        fread( $fh, $block_len );
                }
        }
+
        /**
         * Read a block. In the GIF format, a block is made up of
         * several sub-blocks. Each sub block starts with one byte
@@ -301,6 +302,7 @@ class GIFMetadataExtractor {
         *  sub-blocks in the returned value. Normally this is false,
         *  except XMP is weird and does a hack where you need to keep
         *  these length bytes.
+        * @throws Exception
         * @return string The data.
         */
        static function readBlock( $fh, $includeLengths = false ) {
index 8d7e43b..60fd2a0 100644 (file)
@@ -129,7 +129,7 @@ class JpegMetadataExtractor {
                                        // whatever...
                                        $segments["XMP"] = substr( $temp, 29 );
                                        wfDebug( __METHOD__ . ' Found XMP section with wrong app identifier '
-                                               . "Using anyways.\n" ); 
+                                               . "Using anyways.\n" );
                                } elseif ( substr( $temp, 0, 6 ) === "Exif\0\0" ) {
                                        // Just need to find out what the byte order is.
                                        // because php's exif plugin sucks...
@@ -165,10 +165,11 @@ class JpegMetadataExtractor {
        }
 
        /**
-       * Helper function for jpegSegmentSplitter
-       * @param &$fh FileHandle for jpeg file
-       * @return string data content of segment.
-       */
+        * Helper function for jpegSegmentSplitter
+        * @param &$fh FileHandle for jpeg file
+        * @throws MWException
+        * @return string data content of segment.
+        */
        private static function jpegExtractMarker( &$fh ) {
                $size = wfUnpack( "nint", fread( $fh, 2 ), 2 );
                if ( $size['int'] <= 2 ) {
index 965099f..dd764e9 100644 (file)
@@ -243,6 +243,15 @@ abstract class MediaHandler {
                return array( $ext, $mime );
        }
 
+       /**
+        * Get useful response headers for GET/HEAD requests for a file with the given metadata
+        * @param $metadata mixed Result of the getMetadata() function of this handler for a file
+        * @return Array
+        */
+       public function getStreamHeaders( $metadata ) {
+               return array();
+       }
+
        /**
         * True if the handled types can be transformed
         * @return bool
index 773824c..97a2d1d 100644 (file)
@@ -33,6 +33,13 @@ abstract class MediaTransformOutput {
        var $file;
 
        var $width, $height, $url, $page, $path;
+
+       /**
+        * @var array Associative array mapping optional supplementary image files
+        * from pixel density (eg 1.5 or 2) to additional URLs.
+        */
+       public $responsiveUrls = array();
+
        protected $storagePath = false;
 
        /**
@@ -189,7 +196,10 @@ abstract class MediaTransformOutput {
         * @return array
         */
        public function getDescLinkAttribs( $title = null, $params = '' ) {
-               $query = $this->page ? ( 'page=' . urlencode( $this->page ) ) : '';
+               $query = '';
+               if ( $this->page && $this->page !== 1 ) {
+                         $query = 'page=' . urlencode( $this->page );
+               }
                if( $params ) {
                        $query .= $query ? '&'.$params : $params;
                }
@@ -281,6 +291,7 @@ class ThumbnailImage extends MediaTransformOutput {
         * For images, desc-link and file-link are implemented as a click-through. For
         * sounds and videos, they may be displayed in other ways.
         *
+        * @throws MWException
         * @return string
         */
        function toHtml( $options = array() ) {
@@ -323,7 +334,7 @@ class ThumbnailImage extends MediaTransformOutput {
                        'alt' => $alt,
                        'src' => $this->url,
                        'width' => $this->width,
-                       'height' => $this->height,
+                       'height' => $this->height
                );
                if ( !empty( $options['valign'] ) ) {
                        $attribs['style'] = "vertical-align: {$options['valign']}";
@@ -331,6 +342,11 @@ class ThumbnailImage extends MediaTransformOutput {
                if ( !empty( $options['img-class'] ) ) {
                        $attribs['class'] = $options['img-class'];
                }
+
+               // Additional densities for responsive images, if specified.
+               if ( !empty( $this->responsiveUrls ) ) {
+                       $attribs['srcset'] = Html::srcSet( $this->responsiveUrls );
+               }
                return $this->linkWrap( $linkAttribs, Xml::element( 'img', $attribs ) );
        }
 
index 1b329e5..a23821f 100644 (file)
@@ -88,11 +88,11 @@ class PNGHandler extends BitmapHandler {
        function canAnimateThumbnail( $image ) {
                return false;
        }
-       
+
        function getMetadataType( $image ) {
                return 'parsed-png';
        }
-       
+
        function isMetadataValid( $image, $metadata ) {
 
                if ( $metadata === self::BROKEN_FILE ) {
@@ -134,21 +134,21 @@ class PNGHandler extends BitmapHandler {
 
                $info = array();
                $info[] = $original;
-               
+
                if ( $metadata['loopCount'] == 0 ) {
                        $info[] = wfMessage( 'file-info-png-looped' )->parse();
                } elseif ( $metadata['loopCount'] > 1 ) {
                        $info[] = wfMessage( 'file-info-png-repeat' )->numParams( $metadata['loopCount'] )->parse();
                }
-               
+
                if ( $metadata['frameCount'] > 0 ) {
                        $info[] = wfMessage( 'file-info-png-frames' )->numParams( $metadata['frameCount'] )->parse();
                }
-               
+
                if ( $metadata['duration'] ) {
                        $info[] = $wgLang->formatTimePeriod( $metadata['duration'] );
                }
-               
+
                return $wgLang->commaList( $info );
        }
 
index 9dcde40..55f087a 100644 (file)
@@ -124,7 +124,7 @@ class PNGMetadataExtractor {
                                        case 0:
                                                $colorType = 'greyscale';
                                                break;
-                                       case 2: 
+                                       case 2:
                                                $colorType = 'truecolour';
                                                break;
                                        case 3:
index 55fa554..f7e988f 100644 (file)
@@ -120,6 +120,12 @@ class SvgHandler extends ImageHandler {
                        return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                }
 
+               $metadata = $this->unpackMetadata( $image->getMetadata() );
+               if ( isset( $metadata['error'] ) ) { // sanity check
+                       $err = wfMessage( 'svg-long-error', $metadata['error']['message'] )->text();
+                       return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight, $err );
+               }
+
                if ( !wfMkdirParents( dirname( $dstPath ), null, __METHOD__ ) ) {
                        return new MediaTransformError( 'thumbnail_error', $clientWidth, $clientHeight,
                                wfMessage( 'thumbnail_dest_directory' )->text() );
@@ -127,7 +133,7 @@ class SvgHandler extends ImageHandler {
 
                $srcPath = $image->getLocalRefPath();
                $status = $this->rasterize( $srcPath, $dstPath, $physicalWidth, $physicalHeight );
-               if( $status === true ) {
+               if ( $status === true ) {
                        return new ThumbnailImage( $image, $dstUrl, $dstPath, $params );
                } else {
                        return $status; // MediaTransformError
@@ -135,14 +141,15 @@ class SvgHandler extends ImageHandler {
        }
 
        /**
-       * Transform an SVG file to PNG
-       * This function can be called outside of thumbnail contexts
-       * @param string $srcPath
-       * @param string $dstPath
-       * @param string $width
-       * @param string $height
-       * @return bool|MediaTransformError
-       */
+        * Transform an SVG file to PNG
+        * This function can be called outside of thumbnail contexts
+        * @param string $srcPath
+        * @param string $dstPath
+        * @param string $width
+        * @param string $height
+        * @throws MWException
+        * @return bool|MediaTransformError
+        */
        public function rasterize( $srcPath, $dstPath, $width, $height ) {
                global $wgSVGConverters, $wgSVGConverter, $wgSVGConverterPath;
                $err = false;
@@ -213,6 +220,8 @@ class SvgHandler extends ImageHandler {
                if ( isset( $metadata['width'] ) && isset( $metadata['height'] ) ) {
                        return array( $metadata['width'], $metadata['height'], 'SVG',
                                        "width=\"{$metadata['width']}\" height=\"{$metadata['height']}\"" );
+               } else { // error
+                       return array( 0, 0, 'SVG', "width=\"0\" height=\"0\"" );
                }
        }
 
@@ -231,6 +240,12 @@ class SvgHandler extends ImageHandler {
         */
        function getLongDesc( $file ) {
                global $wgLang;
+
+               $metadata = $this->unpackMetadata( $file->getMetadata() );
+               if ( isset( $metadata['error'] ) ) {
+                       return wfMessage( 'svg-long-error', $metadata['error']['message'] )->text();
+               }
+
                $size = $wgLang->formatSize( $file->getSize() );
 
                if ( $this->isAnimatedImage( $file ) ) {
@@ -239,23 +254,23 @@ class SvgHandler extends ImageHandler {
                        $msg = wfMessage( 'svg-long-desc' );
                }
 
-               $msg->numParams(
-                       $file->getWidth(),
-                       $file->getHeight()
-               );
-               $msg->Params( $size );
+               $msg->numParams( $file->getWidth(), $file->getHeight() )->params( $size );
+
                return $msg->parse();
        }
 
        function getMetadata( $file, $filename ) {
+               $metadata = array( 'version' => self::SVG_METADATA_VERSION );
                try {
-                       $metadata = SVGMetadataExtractor::getMetadata( $filename );
-               } catch( Exception $e ) {
-                       // Broken file?
+                       $metadata += SVGMetadataExtractor::getMetadata( $filename );
+               } catch( MWException $e ) { // @TODO: SVG specific exceptions
+                       // File not found, broken, etc.
+                       $metadata['error'] = array(
+                               'message' => $e->getMessage(),
+                               'code'    => $e->getCode()
+                       );
                        wfDebug( __METHOD__ . ': ' . $e->getMessage() . "\n" );
-                       return '0';
                }
-               $metadata['version'] = self::SVG_METADATA_VERSION;
                return serialize( $metadata );
        }
 
@@ -305,7 +320,7 @@ class SvgHandler extends ImageHandler {
                        return false;
                }
                $metadata = $this->unpackMetadata( $metadata );
-               if ( !$metadata ) {
+               if ( !$metadata || isset( $metadata['error'] ) ) {
                        return false;
                }
 
index 851fe42..456c016 100644 (file)
@@ -52,6 +52,7 @@ class SVGReader {
         *
         * Creates an SVGReader drawing from the source provided
         * @param $source String: URI from which to read
+        * @throws MWException|Exception
         */
        function __construct( $source ) {
                global $wgSVGMetadataCutoff;
@@ -74,9 +75,9 @@ class SVGReader {
                        $this->reader->open( $source, null, LIBXML_NOERROR | LIBXML_NOWARNING );
                }
 
-               // Expand entities, since Adobe Illustrator uses them for xmlns 
-               // attributes (bug 31719). Note that libxml2 has some protection 
-               // against large recursive entity expansions so this is not as 
+               // Expand entities, since Adobe Illustrator uses them for xmlns
+               // attributes (bug 31719). Note that libxml2 has some protection
+               // against large recursive entity expansions so this is not as
                // insecure as it might appear to be.
                $this->reader->setParserProperty( XMLReader::SUBST_ENTITIES, true );
 
@@ -113,6 +114,7 @@ class SVGReader {
 
        /**
         * Read the SVG
+        * @throws MWException
         * @return bool
         */
        public function read() {
@@ -196,6 +198,7 @@ class SVGReader {
         * Read an XML snippet from an element
         *
         * @param String $metafield that we will fill with the result
+        * @throws MWException
         */
        private function readXml( $metafield=null ) {
                $this->debug ( "Read top level metadata" );
index d95c907..55dff77 100644 (file)
@@ -70,8 +70,9 @@ class TiffHandler extends ExifBitmapHandler {
        }
 
        /**
-        * @param $image
-        * @param $filename
+        * @param File $image
+        * @param string $filename
+        * @throws MWException
         * @return string
         */
        function getMetadata( $image, $filename ) {
index 36660b3..c5743d7 100644 (file)
@@ -232,17 +232,18 @@ class XMPReader {
        }
 
        /**
-       * Main function to call to parse XMP. Use getResults to
-       * get results.
-       *
-       * Also catches any errors during processing, writes them to
-       * debug log, blanks result array and returns false.
-       *
-       * @param $content String: XMP data
-       * @param $allOfIt Boolean: If this is all the data (true) or if its split up (false). Default true
-       * @param $reset Boolean: does xml parser need to be reset. Default false
-       * @return Boolean success.
-       */
+        * Main function to call to parse XMP. Use getResults to
+        * get results.
+        *
+        * Also catches any errors during processing, writes them to
+        * debug log, blanks result array and returns false.
+        *
+        * @param $content String: XMP data
+        * @param $allOfIt Boolean: If this is all the data (true) or if its split up (false). Default true
+        * @param $reset Boolean: does xml parser need to be reset. Default false
+        * @throws MWException
+        * @return Boolean success.
+        */
        public function parse( $content, $allOfIt = true, $reset = false ) {
                if ( $reset ) {
                        $this->resetXMLParser();
@@ -463,22 +464,23 @@ class XMPReader {
        }
 
        /**
-       * Hit a closing element in MODE_STRUCT, MODE_SEQ, MODE_BAG
-       * 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>".
-       *
-       * @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.
-       *
-       * @param $elm String namespace . space . tag name.
-       */
+        * Hit a closing element in MODE_STRUCT, MODE_SEQ, MODE_BAG
+        * 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>".
+        *
+        * @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.
+        *
+        * @param $elm String namespace . space . tag name.
+        * @throws MWException
+        */
        private function endElementNested( $elm ) {
 
                /* cur item must be the same as $elm, unless if in MODE_STRUCT
@@ -528,23 +530,24 @@ 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>"
-       *
-       * @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>".
-       * (For comparison, we call endElementModeSimple when we
-       * hit the "</rdf:li>")
-       *
-       * @param $elm String namespace . ' ' . element name
-       */
+        * 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>"
+        *
+        * @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>".
+        * (For comparison, we call endElementModeSimple when we
+        * hit the "</rdf:li>")
+        *
+        * @param $elm String namespace . ' ' . element name
+        * @throws MWException
+        */
        private function endElementModeLi( $elm ) {
 
                list( $ns, $tag ) = explode( ' ', $this->curItem[0], 2 );
@@ -599,17 +602,18 @@ class XMPReader {
        }
 
        /**
-       * Handler for hitting a closing element.
-       *
-       * generally just calls a helper function depending on what
-       * mode we're in.
-       *
-       * Ignores the outer wrapping elements that are optional in
-       * xmp and have no meaning.
-       *
-       * @param $parser XMLParser
-       * @param $elm String namespace . ' ' . element name
-       */
+        * Handler for hitting a closing element.
+        *
+        * generally just calls a helper function depending on what
+        * mode we're in.
+        *
+        * Ignores the outer wrapping elements that are optional in
+        * xmp and have no meaning.
+        *
+        * @param $parser XMLParser
+        * @param $elm String namespace . ' ' . element name
+        * @throws MWException
+        */
        function endElement( $parser, $elm ) {
                if ( $elm === ( self::NS_RDF . ' RDF' )
                        || $elm === 'adobe:ns:meta/ xmpmeta'
@@ -759,22 +763,23 @@ class XMPReader {
        }
 
        /**
-       * Handle an opening element when in MODE_SIMPLE
-       *
-       * This should not happen often. This is for if a simple element
-       * already opened has a child element. Could happen for a
-       * qualified element.
-       *
-       * For example:
-       * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
-       *   <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
-       *   </exif:DigitalZoomRatio>
-       *
-       * This method is called when processing the <rdf:Description> element
-       *
-       * @param $elm String namespace and tag names separated by space.
-       * @param $attribs Array Attributes of the element.
-       */
+        * Handle an opening element when in MODE_SIMPLE
+        *
+        * This should not happen often. This is for if a simple element
+        * already opened has a child element. Could happen for a
+        * qualified element.
+        *
+        * For example:
+        * <exif:DigitalZoomRatio><rdf:Description><rdf:value>0/10</rdf:value>
+        *   <foo:someQualifier>Bar</foo:someQualifier> </rdf:Description>
+        *   </exif:DigitalZoomRatio>
+        *
+        * This method is called when processing the <rdf:Description> element
+        *
+        * @param $elm String namespace and tag names separated by space.
+        * @param $attribs Array Attributes of the element.
+        * @throws MWException
+        */
        private function startElementModeSimple( $elm, $attribs ) {
                if ( $elm === self::NS_RDF . ' Description' ) {
                        // If this value has qualifiers
@@ -824,16 +829,17 @@ class XMPReader {
        }
 
        /**
-       * Starting an element when in MODE_INITIAL
-       * This usually happens when we hit an element inside
-       * the outer rdf:Description
-       *
-       * This is generally where most properties start.
-       *
-       * @param $ns String Namespace
-       * @param $tag String tag name (without namespace prefix)
-       * @param $attribs Array array of attributes
-       */
+        * Starting an element when in MODE_INITIAL
+        * This usually happens when we hit an element inside
+        * the outer rdf:Description
+        *
+        * This is generally where most properties start.
+        *
+        * @param $ns String Namespace
+        * @param $tag String tag name (without namespace prefix)
+        * @param $attribs Array array of attributes
+        * @throws MWException
+        */
        private function startElementModeInitial( $ns, $tag, $attribs ) {
                if ( $ns !== self::NS_RDF ) {
 
@@ -877,23 +883,24 @@ class XMPReader {
        }
 
        /**
-       * Hit an opening element when in a Struct (MODE_STRUCT)
-       * This is generally for fields of a compound property.
-       *
-       * Example of a struct (abbreviated; flash has more properties):
-       *
-       * <exif:Flash> <rdf:Description> <exif:Fired>True</exif:Fired>
-       *  <exif:Mode>1</exif:Mode></rdf:Description></exif:Flash>
-       *
-       * or:
-       *
-       * <exif:Flash rdf:parseType='Resource'> <exif:Fired>True</exif:Fired>
-       *  <exif:Mode>1</exif:Mode></exif:Flash>
-       *
-       * @param $ns String namespace
-       * @param $tag String tag name (no ns)
-       * @param $attribs Array array of attribs w/ values.
-       */
+        * Hit an opening element when in a Struct (MODE_STRUCT)
+        * This is generally for fields of a compound property.
+        *
+        * Example of a struct (abbreviated; flash has more properties):
+        *
+        * <exif:Flash> <rdf:Description> <exif:Fired>True</exif:Fired>
+        *  <exif:Mode>1</exif:Mode></rdf:Description></exif:Flash>
+        *
+        * or:
+        *
+        * <exif:Flash rdf:parseType='Resource'> <exif:Fired>True</exif:Fired>
+        *  <exif:Mode>1</exif:Mode></exif:Flash>
+        *
+        * @param $ns String namespace
+        * @param $tag String tag name (no ns)
+        * @param $attribs Array array of attribs w/ values.
+        * @throws MWException
+        */
        private function startElementModeStruct( $ns, $tag, $attribs ) {
                if ( $ns !== self::NS_RDF ) {
 
@@ -1015,14 +1022,15 @@ class XMPReader {
        }
 
        /**
-       * Hits an opening element.
-       * Generally just calls a helper based on what MODE we're in.
-       * Also does some initial set up for the wrapper element
-       *
-       * @param $parser XMLParser
-       * @param $elm String namespace "<space>" element
-       * @param $attribs Array attribute name => value
-       */
+        * Hits an opening element.
+        * Generally just calls a helper based on what MODE we're in.
+        * Also does some initial set up for the wrapper element
+        *
+        * @param $parser XMLParser
+        * @param $elm String namespace "<space>" element
+        * @param $attribs Array attribute name => value
+        * @throws MWException
+        */
        function startElement( $parser, $elm, $attribs ) {
 
                if ( $elm === self::NS_RDF . ' RDF'
@@ -1100,19 +1108,20 @@ 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
-       * properties as attributes.
-       *
-       * @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.
-       */
+        * Process attributes.
+        * Simple values can be stored as either a tag or attribute
+        *
+        * Often the initial "<rdf:Description>" tag just has all the simple
+        * properties as attributes.
+        *
+        * @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.
+        * @throws MWException
+        */
        private function doAttribs( $attribs ) {
 
                // first check for rdf:parseType attribute, as that can change
index 83b8a10..aa411df 100644 (file)
@@ -669,7 +669,7 @@ class XMPInfo {
                         *      'validate'  => 'validateClosed',
                         *      'choices'   => array( '1' => true, '2' => true ),
                         * ),
-                        */ 
+                        */
                ),
                'http://ns.adobe.com/exif/1.0/aux/' => array(
                        'Lens'              => array(
index 5ce3c00..e3fd59f 100644 (file)
@@ -153,7 +153,7 @@ class XMPValidate {
 
                //check if its in a numeric range
                $inRange = false;
-               if ( isset( $info['rangeLow'] ) 
+               if ( isset( $info['rangeLow'] )
                        && isset( $info['rangeHigh'] )
                        && is_numeric( $val )
                        && ( intval( $val ) <= $info['rangeHigh'] )
@@ -342,7 +342,7 @@ class XMPValidate {
                }
 
                $m = array();
-               if ( preg_match( 
+               if ( preg_match(
                        '/(\d{1,3}),(\d{1,2}),(\d{1,2})([NWSE])/D',
                        $val, $m )
                ) {
@@ -354,7 +354,7 @@ class XMPValidate {
                        }
                        $val = $coord;
                        return;
-               } elseif ( preg_match( 
+               } elseif ( preg_match(
                        '/(\d{1,3}),(\d{1,2}(?:.\d*)?)([NWSE])/D',
                        $val, $m )
                ) {
@@ -367,7 +367,7 @@ class XMPValidate {
                        return;
 
                } else {
-                       wfDebugLog( 'XMP', __METHOD__ 
+                       wfDebugLog( 'XMP', __METHOD__
                                . " Expected GPSCoordinate, but got $val." );
                        $val = null;
                        return;
diff --git a/includes/mobile/DeviceDetection.php b/includes/mobile/DeviceDetection.php
deleted file mode 100644 (file)
index 262665b..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-<?php
-/**
- * Mobile device detection code
- *
- * Copyright © 2011 Patrick Reilly
- * 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
- * (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
- */
-
-/**
- * Base for classes describing devices and their capabilities
- * @since 1.20
- */
-interface IDeviceProperties {
-       /**
-        * @return string: 'html' or 'wml'
-        */
-       function format();
-
-       /**
-        * @return bool
-        */
-       function supportsJavaScript();
-
-       /**
-        * @return bool
-        */
-       function supportsJQuery();
-
-       /**
-        * @return bool
-        */
-       function disableZoom();
-}
-
-/**
- * @since 1.20
- */
-interface IDeviceDetector {
-       /**
-        * @param $userAgent
-        * @param string $acceptHeader
-        * @return IDeviceProperties
-        */
-       function detectDeviceProperties( $userAgent, $acceptHeader = '' );
-
-       /**
-        * @param $deviceName
-        * @return IDeviceProperties
-        */
-       function getDeviceProperties( $deviceName );
-
-       /**
-        * @param $userAgent string
-        * @param $acceptHeader string
-        * @return string
-        */
-       function detectDeviceName( $userAgent, $acceptHeader = '' );
-}
-
-/**
- * MediaWiki's default IDeviceProperties implementation
- */
-final class DeviceProperties implements IDeviceProperties {
-       private $device;
-
-       public function __construct( array $deviceCapabilities ) {
-               $this->device = $deviceCapabilities;
-       }
-
-       /**
-        * @return string
-        */
-       function format() {
-               return $this->device['view_format'];
-       }
-
-       /**
-        * @return bool
-        */
-       function supportsJavaScript() {
-               return $this->device['supports_javascript'];
-       }
-
-       /**
-        * @return bool
-        */
-       function supportsJQuery() {
-               return $this->device['supports_jquery'];
-       }
-
-       /**
-        * @return bool
-        */
-       function disableZoom() {
-               return $this->device['disable_zoom'];
-       }
-}
-
-/**
- * Provides abstraction for a device.
- * A device can select which format a request should receive and
- * may be extended to provide access to particular device functionality.
- * @since 1.20
- */
-class DeviceDetection implements IDeviceDetector {
-
-       private static $formats = array (
-                       'html' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'default',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'capable' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'default',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => true,
-                       ),
-                       'webkit' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'webkit',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => false,
-                       ),
-                       'ie' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'default',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => false,
-                       ),
-                       'android' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'android',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => false,
-                       ),
-                       'iphone' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'iphone',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => false,
-                       ),
-                       'iphone2' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'iphone2',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => true,
-                       ),
-                       'native_iphone' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'default',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => false,
-                       ),
-                       'palm_pre' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'palm_pre',
-                               'supports_javascript' => true,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'kindle' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'kindle',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'kindle2' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'kindle',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'blackberry' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'blackberry',
-                               'supports_javascript' => true,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'blackberry-lt5' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'blackberry',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'netfront' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'simple',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'wap2' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'simple',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'psp' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'psp',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'ps3' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'simple',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'wii' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'wii',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => true,
-                       ),
-                       'operamini' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'operamini',
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'operamobile' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'operamobile',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => true,
-                       ),
-                       'nokia' => array (
-                               'view_format' => 'html',
-                               'css_file_name' => 'nokia',
-                               'supports_javascript' => true,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-                       'wml' => array (
-                               'view_format' => 'wml',
-                               'css_file_name' => null,
-                               'supports_javascript' => false,
-                               'supports_jquery' => false,
-                               'disable_zoom' => true,
-                       ),
-               );
-
-       /**
-        * Returns an instance of detection class, overridable by extensions
-        * @return IDeviceDetector
-        */
-       public static function factory() {
-               global $wgDeviceDetectionClass;
-
-               static $instance = null;
-               if ( !$instance ) {
-                       $instance = new $wgDeviceDetectionClass();
-               }
-               return $instance;
-       }
-
-       /**
-        * @deprecated: Deprecated, will be removed once detectDeviceProperties() will be deployed everywhere on WMF
-        * @param $userAgent
-        * @param string $acceptHeader
-        * @return array
-        */
-       public function detectDevice( $userAgent, $acceptHeader = '' ) {
-               $formatName = $this->detectFormatName( $userAgent, $acceptHeader );
-               return $this->getDevice( $formatName );
-       }
-
-       /**
-        * @param $userAgent
-        * @param string $acceptHeader
-        * @return IDeviceProperties
-        */
-       public function detectDeviceProperties( $userAgent, $acceptHeader = '' ) {
-               $deviceName = $this->detectDeviceName( $userAgent, $acceptHeader );
-               return $this->getDeviceProperties( $deviceName );
-       }
-
-       /**
-        * @deprecated: Deprecated, will be removed once detectDeviceProperties() will be deployed everywhere on WMF
-        * @param $formatName
-        * @return array
-        */
-       public function getDevice( $formatName ) {
-               return ( isset( self::$formats[$formatName] ) ) ? self::$formats[$formatName] : array();
-       }
-
-       /**
-        * @param $deviceName
-        * @return IDeviceProperties
-        */
-       public function getDeviceProperties( $deviceName ) {
-               if ( isset( self::$formats[$deviceName] ) ) {
-                       return new DeviceProperties( self::$formats[$deviceName] );
-               } else {
-                       return new DeviceProperties( array(
-                               'view_format' => 'html',
-                               'css_file_name' => 'default',
-                               'supports_javascript' => true,
-                               'supports_jquery' => true,
-                               'disable_zoom' => true,
-                       ) );
-               }
-       }
-
-       /**
-        * @deprecated: Renamed to detectDeviceName()
-        * @param $userAgent string
-        * @param $acceptHeader string
-        * @return string
-        */
-       public function detectFormatName( $userAgent, $acceptHeader = '' ) {
-               return $this->detectDeviceName( $userAgent, $acceptHeader );
-       }
-
-       /**
-        * @param $userAgent string
-        * @param $acceptHeader string
-        * @return string
-        */
-       public function detectDeviceName( $userAgent, $acceptHeader = '' ) {
-               wfProfileIn( __METHOD__ );
-
-               $deviceName = '';
-               if ( preg_match( '/Android/', $userAgent ) ) {
-                       $deviceName = 'android';
-                       if ( strpos( $userAgent, 'Opera Mini' ) !== false ) {
-                               $deviceName = 'operamini';
-                       } elseif ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
-                               $deviceName = 'operamobile';
-                       }
-               } elseif ( preg_match( '/MSIE 9.0/', $userAgent ) ||
-                               preg_match( '/MSIE 8.0/', $userAgent ) ) {
-                       $deviceName = 'ie';
-               } elseif( preg_match( '/MSIE/', $userAgent ) ) {
-                       $deviceName = 'html';
-               } elseif ( strpos( $userAgent, 'Opera Mobi' ) !== false ) {
-                       $deviceName = 'operamobile';
-               } elseif ( preg_match( '/iPad.* Safari/', $userAgent ) ) {
-                       $deviceName = 'iphone';
-               } elseif ( preg_match( '/iPhone.* Safari/', $userAgent ) ) {
-                       if ( strpos( $userAgent, 'iPhone OS 2' ) !== false ) {
-                               $deviceName = 'iphone2';
-                       } else {
-                               $deviceName = 'iphone';
-                       }
-               } elseif ( preg_match( '/iPhone/', $userAgent ) ) {
-                       if ( strpos( $userAgent, 'Opera' ) !== false ) {
-                               $deviceName = 'operamini';
-                       } else {
-                               $deviceName = 'native_iphone';
-                       }
-               } elseif ( preg_match( '/WebKit/', $userAgent ) ) {
-                       if ( preg_match( '/Series60/', $userAgent ) ) {
-                               $deviceName = 'nokia';
-                       } elseif ( preg_match( '/webOS/', $userAgent ) ) {
-                               $deviceName = 'palm_pre';
-                       } else {
-                               $deviceName = 'webkit';
-                       }
-               } elseif ( preg_match( '/Opera/', $userAgent ) ) {
-                       if ( strpos( $userAgent, 'Nintendo Wii' ) !== false ) {
-                               $deviceName = 'wii';
-                       } elseif ( strpos( $userAgent, 'Opera Mini' ) !== false ) {
-                               $deviceName = 'operamini';
-                       } else {
-                               $deviceName = 'operamobile';
-                       }
-               } elseif ( preg_match( '/Kindle\/1.0/', $userAgent ) ) {
-                       $deviceName = 'kindle';
-               } elseif ( preg_match( '/Kindle\/2.0/', $userAgent ) ) {
-                       $deviceName = 'kindle2';
-               } elseif ( preg_match( '/Firefox/', $userAgent ) ) {
-                       $deviceName = 'capable';
-               } elseif ( preg_match( '/NetFront/', $userAgent ) ) {
-                       $deviceName = 'netfront';
-               } elseif ( preg_match( '/SEMC-Browser/', $userAgent ) ) {
-                       $deviceName = 'wap2';
-               } elseif ( preg_match( '/Series60/', $userAgent ) ) {
-                       $deviceName = 'wap2';
-               } elseif ( preg_match( '/PlayStation Portable/', $userAgent ) ) {
-                       $deviceName = 'psp';
-               } elseif ( preg_match( '/PLAYSTATION 3/', $userAgent ) ) {
-                       $deviceName = 'ps3';
-               } elseif ( preg_match( '/SAMSUNG/', $userAgent ) ) {
-                       $deviceName = 'capable';
-               } elseif ( preg_match( '/BlackBerry/', $userAgent ) ) {
-                       if( preg_match( '/BlackBerry[^\/]*\/[1-4]\./', $userAgent ) ) {
-                               $deviceName = 'blackberry-lt5';
-                       } else {
-                               $deviceName = 'blackberry';
-                       }
-               }
-
-               if ( $deviceName === '' ) {
-                       if ( strpos( $acceptHeader, 'application/vnd.wap.xhtml+xml' ) !== false ) {
-                               // Should be wap2
-                               $deviceName = 'html';
-                       } elseif ( strpos( $acceptHeader, 'vnd.wap.wml' ) !== false ) {
-                               $deviceName = 'wml';
-                       } else {
-                               $deviceName = 'html';
-                       }
-               }
-               wfProfileOut( __METHOD__ );
-               return $deviceName;
-       }
-
-       /**
-        * @return array: List of all device-specific stylesheets
-        */
-       public function getCssFiles() {
-               $files = array();
-
-               foreach ( self::$formats as $dev ) {
-                       if ( isset( $dev['css_file_name'] ) ) {
-                               $files[] = $dev['css_file_name'];
-                       }
-               }
-               return array_unique( $files );
-       }
-}
index 368d0bc..d9deb3c 100644 (file)
@@ -49,7 +49,7 @@ while( false !== ($line = fgets( $in ) ) ) {
        $name = $columns[1];
        $simpleUpper = $columns[12];
        $simpleLower = $columns[13];
-       
+
        $source = codepointToUtf8( hexdec( $codepoint ) );
        if( $simpleUpper ) {
                $wikiUpperChars[$source] = codepointToUtf8( hexdec( $simpleUpper ) );
index 08f85bd..64d9618 100644 (file)
@@ -765,7 +765,7 @@ class UtfNormal {
         * @param $string String The string
         * @return String String with the character codes replaced.
         */
-       private static function replaceForNativeNormalize( $string ) { 
+       private static function replaceForNativeNormalize( $string ) {
                $string = preg_replace(
                        '/[\x00-\x08\x0b\x0c\x0e-\x1f]/',
                        UTF8_REPLACEMENT,
index 944c443..6642844 100644 (file)
@@ -19,7 +19,7 @@
  * 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 UtfNormal
  */
index 5142a41..64624b8 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Some constant definitions for the unicode normalization module.
  *
- * Note: these constants must all be resolvable at compile time by HipHop, 
+ * Note: these constants must all be resolvable at compile time by HipHop,
  * since this file will not be executed during request startup for a compiled
  * MediaWiki.
  *
index e4c1138..11d06d4 100644 (file)
@@ -177,7 +177,7 @@ if( $out ) {
  *
  * @file
  */
+
 UtfNormal::\$utfCombiningClass = unserialize( '$serCombining' );
 UtfNormal::\$utfCanonicalComp = unserialize( '$serComp' );
 UtfNormal::\$utfCanonicalDecomp = unserialize( '$serCanon' );
index f86cf15..60d0645 100644 (file)
  * @ingroup Cache
  */
 class EhcacheBagOStuff extends BagOStuff {
-       var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions, 
+       var $servers, $cacheName, $connectTimeout, $timeout, $curlOptions,
                $requestData, $requestDataPos;
-       
+
        var $curls = array();
 
        /**
         * @param $params array
+        * @throws MWException
         */
        function __construct( $params ) {
                if ( !defined( 'CURLOPT_TIMEOUT_MS' ) ) {
@@ -48,7 +49,7 @@ class EhcacheBagOStuff extends BagOStuff {
                }
                $this->servers = $params['servers'];
                $this->cacheName = isset( $params['cache'] ) ? $params['cache'] : 'mw';
-               $this->connectTimeout = isset( $params['connectTimeout'] ) 
+               $this->connectTimeout = isset( $params['connectTimeout'] )
                        ? $params['connectTimeout'] : 1;
                $this->timeout = isset( $params['timeout'] ) ? $params['timeout'] : 1;
                $this->curlOptions = array(
@@ -76,7 +77,7 @@ class EhcacheBagOStuff extends BagOStuff {
                if ( $response['http_code'] >= 300 ) {
                        wfDebug( __METHOD__.": GET failure, got HTTP {$response['http_code']}\n" );
                        wfProfileOut( __METHOD__ );
-                       return false;                   
+                       return false;
                }
                $body = $response['body'];
                $type = $response['content_type'];
@@ -202,9 +203,9 @@ class EhcacheBagOStuff extends BagOStuff {
         * @return int
         */
        protected function attemptPut( $key, $data, $type, $ttl ) {
-               // In initial benchmarking, it was 30 times faster to use CURLOPT_POST 
+               // In initial benchmarking, it was 30 times faster to use CURLOPT_POST
                // than CURLOPT_UPLOAD with CURLOPT_READFUNCTION. This was because
-               // CURLOPT_UPLOAD was pushing the request headers first, then waiting 
+               // CURLOPT_UPLOAD was pushing the request headers first, then waiting
                // for an ACK packet, then sending the data, whereas CURLOPT_POST just
                // sends the headers and the data in a single send().
                $response = $this->doItemRequest( $key,
@@ -231,7 +232,7 @@ class EhcacheBagOStuff extends BagOStuff {
         */
        protected function createCache( $key ) {
                wfDebug( __METHOD__.": creating cache for $key\n" );
-               $response = $this->doCacheRequest( $key, 
+               $response = $this->doCacheRequest( $key,
                        array(
                                CURLOPT_POST => 1,
                                CURLOPT_CUSTOMREQUEST => 'PUT',
@@ -279,7 +280,7 @@ class EhcacheBagOStuff extends BagOStuff {
                if ( array_diff_key( $curlOptions, $this->curlOptions ) ) {
                        // var_dump( array_diff_key( $curlOptions, $this->curlOptions ) );
                        throw new MWException( __METHOD__.": to prevent options set in one doRequest() " .
-                               "call from affecting subsequent doRequest() calls, only options listed " . 
+                               "call from affecting subsequent doRequest() calls, only options listed " .
                                "in \$this->curlOptions may be specified in the \$curlOptions parameter." );
                }
                $curlOptions += $this->curlOptions;
index 813c272..643d2e9 100644 (file)
@@ -101,7 +101,7 @@ class MemcachedBagOStuff extends BagOStuff {
         * @return Mixed
         */
        public function replace( $key, $value, $exptime = 0 ) {
-               return $this->client->replace( $this->encodeKey( $key ), $value, 
+               return $this->client->replace( $this->encodeKey( $key ), $value,
                        $this->fixExpiry( $exptime ) );
        }
 
index 536ba6e..787a168 100644 (file)
@@ -277,7 +277,7 @@ class MWMemcached {
         * @param $exp Integer: (optional) Expiration time. This can be a number of seconds
         * to cache for (up to 30 days inclusive).  Any timespans of 30 days + 1 second or
         * longer must be the timestamp of the time at which the mapping should expire. It
-        * is safe to use timestamps in all cases, regardless of exipration
+        * is safe to use timestamps in all cases, regardless of expiration
         * eg: strtotime("+3 hour")
         *
         * @return Boolean
@@ -897,7 +897,7 @@ class MWMemcached {
                                        return false;
                                }
                                if ( substr( $data, -2 ) !== "\r\n" ) {
-                                       $this->_handle_error( $sock, 
+                                       $this->_handle_error( $sock,
                                                'line ending missing from data block from $1' );
                                        return false;
                                }
@@ -1096,7 +1096,7 @@ class MWMemcached {
        }
 
        /**
-        * Read the specified number of bytes from a stream. If there is an error, 
+        * Read the specified number of bytes from a stream. If there is an error,
         * mark the socket dead.
         *
         * @param $sock The socket
@@ -1137,7 +1137,7 @@ class MWMemcached {
        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 
+               // 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'] ) {
@@ -1167,10 +1167,16 @@ class MWMemcached {
                if ( !is_resource( $f ) ) {
                        return;
                }
-               $n = stream_select( $r = array( $f ), $w = null, $e = null, 0, 0 );
+               $r = array( $f );
+               $w = null;
+               $e = null;
+               $n = stream_select( $r, $w, $e, 0, 0 );
                while ( $n == 1 && !feof( $f ) ) {
                        fread( $f, 1024 );
-                       $n = stream_select( $r = array( $f ), $w = null, $e = null, 0, 0 );
+                       $r = array( $f );
+                       $w = null;
+                       $e = null;
+                       $n = stream_select( $r, $w, $e, 0, 0 );
                }
        }
 
index 76886eb..7793710 100644 (file)
@@ -107,8 +107,11 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @return Mixed
         */
        public function get( $key ) {
+               wfProfileIn( __METHOD__ );
                $this->debugLog( "get($key)" );
-               return $this->checkResult( $key, parent::get( $key ) );
+               $value = $this->checkResult( $key, parent::get( $key ) );
+               wfProfileOut( __METHOD__ );
+               return $value;
        }
 
        /**
@@ -224,9 +227,11 @@ class MemcachedPeclBagOStuff extends MemcachedBagOStuff {
         * @return Array
         */
        public function getMulti( array $keys ) {
+               wfProfileIn( __METHOD__ );
                $this->debugLog( 'getMulti(' . implode( ', ', $keys ) . ')' );
                $callback = array( $this, 'encodeKey' );
                $result = $this->client->getMulti( array_map( $callback, $keys ) );
+               wfProfileOut( __METHOD__ );
                return $this->checkResult( false, $result );
        }
 
index a46dc71..5a9ee50 100644 (file)
@@ -81,7 +81,7 @@ class MemcachedPhpBagOStuff extends MemcachedBagOStuff {
        public function unlock( $key ) {
                return $this->client->unlock( $this->encodeKey( $key ) );
        }
-       
+
        /**
         * @param $key string
         * @param $value int
index e496ddd..2f37c23 100644 (file)
@@ -22,8 +22,8 @@
  */
 
 /**
- * A cache class that replicates all writes to multiple child caches. Reads 
- * are implemented by reading from the caches in the order they are given in 
+ * A cache class that replicates all writes to multiple child caches. Reads
+ * are implemented by reading from the caches in the order they are given in
  * the configuration until a cache gives a positive result.
  *
  * @ingroup Cache
index 9b360f3..e4af262 100644 (file)
@@ -139,9 +139,9 @@ class ObjectCache {
        /**
         * Factory function that creates a memcached client object.
         *
-        * This always uses the PHP client, since the PECL client has a different 
-        * hashing scheme and a different interpretation of the flags bitfield, so 
-        * switching between the two clients randomly would be disasterous.
+        * This always uses the PHP client, since the PECL client has a different
+        * hashing scheme and a different interpretation of the flags bitfield, so
+        * switching between the two clients randomly would be disastrous.
         *
         * @param $params array
         *
index d5de044..40784f5 100644 (file)
@@ -321,6 +321,8 @@ class RedisBagOStuff extends BagOStuff {
         * Get a connection to the server with the specified name. Connections
         * are cached, and failures are persistent to avoid multiple timeouts.
         *
+        * @param $server
+        * @throws MWException
         * @return Redis object, or false on failure
         */
        protected function getConnectionToServer( $server ) {
index 296be66..6505183 100644 (file)
@@ -72,6 +72,7 @@ class CoreTagHooks {
         * @param $content string
         * @param $attributes array
         * @param $parser Parser
+        * @throws MWException
         * @return array
         */
        static function html( $content, $attributes, $parser ) {
index 2917b4a..0f22675 100644 (file)
@@ -200,7 +200,7 @@ class DateFormatter {
                $linked = true;
                if ( isset( $this->mLinked ) )
                        $linked = $this->mLinked;
-               
+
                $bits = array();
                $key = $this->keys[$this->mSource];
                for ( $p=0; $p < strlen($key); $p++ ) {
@@ -219,7 +219,7 @@ class DateFormatter {
         */
        function formatDate( $bits, $link = true ) {
                $format = $this->targets[$this->mTarget];
-               
+
                if (!$link) {
                        // strip piped links
                        $format = preg_replace( '/\[\[[^|]+\|([^\]]+)\]\]/', '$1', $format );
index d9356b4..9f1fff2 100644 (file)
@@ -43,9 +43,9 @@ class LinkHolderArray {
                }
        }
 
-       /**
+       /**
         * Don't serialize the parent object, it is big, and not needed when it is
-        * a parameter to mergeForeign(), which is the only application of 
+        * a parameter to mergeForeign(), which is the only application of
         * serializing at present.
         *
         * Compact the titles, only serialize the text form.
@@ -103,9 +103,9 @@ class LinkHolderArray {
        }
 
        /**
-        * Merge a LinkHolderArray from another parser instance into this one. The 
-        * keys will not be preserved. Any text which went with the old 
-        * LinkHolderArray and needs to work with the new one should be passed in 
+        * Merge a LinkHolderArray from another parser instance into this one. The
+        * keys will not be preserved. Any text which went with the old
+        * LinkHolderArray and needs to work with the new one should be passed in
         * the $texts array. The strings in this array will have their link holders
         * converted for use in the destination link holder. The resulting array of
         * strings will be returned.
@@ -126,7 +126,7 @@ class LinkHolderArray {
                                $maxId = $newKey > $maxId ? $newKey : $maxId;
                        }
                }
-               $texts = preg_replace_callback( '/(<!--LINK \d+:)(\d+)(-->)/', 
+               $texts = preg_replace_callback( '/(<!--LINK \d+:)(\d+)(-->)/',
                        array( $this, 'mergeForeignCallback' ), $texts );
 
                # Renumber interwiki links
@@ -135,7 +135,7 @@ class LinkHolderArray {
                        $this->interwikis[$newKey] = $entry;
                        $maxId = $newKey > $maxId ? $newKey : $maxId;
                }
-               $texts = preg_replace_callback( '/(<!--IWLINK )(\d+)(-->)/', 
+               $texts = preg_replace_callback( '/(<!--IWLINK )(\d+)(-->)/',
                        array( $this, 'mergeForeignCallback' ), $texts );
 
                # Set the parent link ID to be beyond the highest used ID
@@ -159,8 +159,8 @@ class LinkHolderArray {
                # Internal links
                $pos = 0;
                while ( $pos < strlen( $text ) ) {
-                       if ( !preg_match( '/<!--LINK (\d+):(\d+)-->/', 
-                               $text, $m, PREG_OFFSET_CAPTURE, $pos ) ) 
+                       if ( !preg_match( '/<!--LINK (\d+):(\d+)-->/',
+                               $text, $m, PREG_OFFSET_CAPTURE, $pos ) )
                        {
                                break;
                        }
index 59d379a..0f22755 100644 (file)
@@ -200,6 +200,13 @@ class Parser {
         */
        var $mUniqPrefix;
 
+       /**
+        * @var Array with the language name of each language link (i.e. the
+        * interwiki prefix) in the key, value arbitrary. Used to avoid sending
+        * duplicate language links to the ParserOutput.
+        */
+       var $mLangLinkLanguages;
+
        /**
         * Constructor
         *
@@ -239,6 +246,13 @@ class Parser {
                }
        }
 
+       /**
+        * Allow extensions to clean up when the parser is cloned
+        */
+       function __clone() {
+               wfRunHooks( 'ParserCloned', array( $this ) );
+       }
+
        /**
         * Do various kinds of initialisation on the first call of the parser
         */
@@ -282,6 +296,7 @@ class Parser {
                        $this->mRevisionId = $this->mRevisionUser = null;
                $this->mVarCache = array();
                $this->mUser = null;
+               $this->mLangLinkLanguages = array();
 
                /**
                 * Prefix for temporary replacement strings for the multipass parser.
@@ -534,7 +549,7 @@ class Parser {
         * Also removes comments.
         * @return mixed|string
         */
-       function preprocess( $text, Title $title, ParserOptions $options, $revid = null ) {
+       function preprocess( $text, Title $title = null, ParserOptions $options, $revid = null ) {
                wfProfileIn( __METHOD__ );
                $this->startParse( $title, $options, self::OT_PREPROCESS, true );
                if ( $revid !== null ) {
@@ -745,6 +760,7 @@ class Parser {
         *
         * @since 1.19
         *
+        * @throws MWException
         * @return Language|null
         */
        public function getTargetLanguage() {
@@ -1298,7 +1314,8 @@ class Parser {
                if ( $text === false ) {
                        # Not an image, make a link
                        $text = Linker::makeExternalLink( $url,
-                               $this->getConverterLanguage()->markNoConversion($url), true, 'free',
+                               $this->getConverterLanguage()->markNoConversion( $url, true ),
+                               true, 'free',
                                $this->getExternalLinkAttribs( $url ) );
                        # Register it in the output object...
                        # Replace unnecessary URL escape codes with their equivalent characters
@@ -1523,6 +1540,7 @@ class Parser {
         *
         * @param $text string
         *
+        * @throws MWException
         * @return string
         */
        function replaceExternalLinks( $text ) {
@@ -1537,6 +1555,7 @@ class Parser {
                $i = 0;
                while ( $i<count( $bits ) ) {
                        $url = $bits[$i++];
+                       // @todo FIXME: Unused variable.
                        $protocol = $bits[$i++];
                        $text = $bits[$i++];
                        $trail = $bits[$i++];
@@ -1595,7 +1614,25 @@ class Parser {
                wfProfileOut( __METHOD__ );
                return $s;
        }
-
+       /**
+        * Get the rel attribute for a particular external link.
+        *
+        * @since 1.21
+        * @param $url String|bool optional URL, to extract the domain from for rel =>
+        *   nofollow if appropriate
+        * @param $title Title optional Title, for wgNoFollowNsExceptions lookups
+        * @return string|null rel attribute for $url
+        */
+       public static function getExternalLinkRel( $url = false, $title = null ) {
+               global $wgNoFollowLinks, $wgNoFollowNsExceptions, $wgNoFollowDomainExceptions;
+               $ns = $title ? $title->getNamespace() : false;
+               if ( $wgNoFollowLinks && !in_array( $ns, $wgNoFollowNsExceptions ) &&
+                               !wfMatchesDomainList( $url, $wgNoFollowDomainExceptions ) )
+               {
+                       return 'nofollow';
+               }
+               return null;
+       }
        /**
         * Get an associative array of additional HTML attributes appropriate for a
         * particular external link.  This currently may include rel => nofollow
@@ -1608,13 +1645,8 @@ class Parser {
         */
        function getExternalLinkAttribs( $url = false ) {
                $attribs = array();
-               global $wgNoFollowLinks, $wgNoFollowNsExceptions, $wgNoFollowDomainExceptions;
-               $ns = $this->mTitle->getNamespace();
-               if ( $wgNoFollowLinks && !in_array( $ns, $wgNoFollowNsExceptions ) &&
-                               !wfMatchesDomainList( $url, $wgNoFollowDomainExceptions ) )
-               {
-                       $attribs['rel'] = 'nofollow';
-               }
+               $attribs['rel'] = self::getExternalLinkRel( $url, $this->mTitle );
+
                if ( $this->mOptions->getExternalLinkTarget() ) {
                        $attribs['target'] = $this->mOptions->getExternalLinkTarget();
                }
@@ -1726,6 +1758,8 @@ class Parser {
 
        /**
         * Process [[ ]] wikilinks (RIL)
+        * @param $s
+        * @throws MWException
         * @return LinkHolderArray
         *
         * @private
@@ -1953,7 +1987,14 @@ class Parser {
                                # Interwikis
                                wfProfileIn( __METHOD__."-interwiki" );
                                if ( $iw && $this->mOptions->getInterwikiMagic() && $nottalk && Language::fetchLanguageName( $iw, null, 'mw' ) ) {
-                                       $this->mOutput->addLanguageLink( $nt->getFullText() );
+                                       // XXX: the above check prevents links to sites with identifiers that are not language codes
+
+                                       # Bug 24502: filter duplicates
+                                       if ( !isset( $this->mLangLinkLanguages[$iw] ) ) {
+                                               $this->mLangLinkLanguages[$iw] = true;
+                                               $this->mOutput->addLanguageLink( $nt->getFullText() );
+                                       }
+
                                        $s = rtrim( $s . $prefix );
                                        $s .= trim( $trail, "\n" ) == '' ? '': $prefix . $trail;
                                        wfProfileOut( __METHOD__."-interwiki" );
@@ -2357,10 +2398,10 @@ class Parser {
                                wfProfileIn( __METHOD__."-paragraph" );
                                # No prefix (not in list)--go to paragraph mode
                                # XXX: use a stack for nestable elements like span, table and div
-                               $openmatch = preg_match('/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
+                               $openmatch = preg_match('/(?:<table|<blockquote|<h1|<h2|<h3|<h4|<h5|<h6|<pre|<tr|<p|<ul|<ol|<dl|<li|<\\/tr|<\\/td|<\\/th)/iS', $t );
                                $closematch = preg_match(
                                        '/(?:<\\/table|<\\/blockquote|<\\/h1|<\\/h2|<\\/h3|<\\/h4|<\\/h5|<\\/h6|'.
-                                       '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix.'-pre|<\\/li|<\\/ul|<\\/ol|<\\/?center)/iS', $t );
+                                       '<td|<th|<\\/?div|<hr|<\\/pre|<\\/p|'.$this->mUniqPrefix.'-pre|<\\/li|<\\/ul|<\\/ol|<\\/dl|<\\/?center)/iS', $t );
                                if ( $openmatch or $closematch ) {
                                        $paragraphStack = false;
                                        # TODO bug 5718: paragraph closed
@@ -2436,6 +2477,7 @@ class Parser {
         * @param $str String the string to split
         * @param &$before String set to everything before the ':'
         * @param &$after String set to everything after the ':'
+        * @throws MWException
         * @return String the position of the ':', or false if none found
         */
        function findColonNoLinks( $str, &$before, &$after ) {
@@ -2600,8 +2642,9 @@ class Parser {
         * @private
         *
         * @param $index integer
-        * @param $frame PPFrame
+        * @param bool|\PPFrame $frame
         *
+        * @throws MWException
         * @return string
         */
        function getVariableValue( $index, $frame = false ) {
@@ -3110,6 +3153,7 @@ class Parser {
         *  $piece['parts']: the parameter array
         *  $piece['lineStart']: whether the brace was at the start of a line
         * @param $frame PPFrame The current frame, contains template arguments
+        * @throws MWException
         * @return String: the text of the template
         * @private
         */
@@ -3593,7 +3637,13 @@ class Parser {
                        }
 
                        if ( $rev ) {
-                               $text = $rev->getText();
+                               $content = $rev->getContent();
+                               $text = $content ? $content->getWikitextForTransclusion() : null;
+
+                               if ( $text === false || $text === null ) {
+                                       $text = false;
+                                       break;
+                               }
                        } elseif ( $title->getNamespace() == NS_MEDIAWIKI ) {
                                global $wgContLang;
                                $message = wfMessage( $wgContLang->lcfirst( $title->getText() ) )->inContentLanguage();
@@ -3601,16 +3651,17 @@ class Parser {
                                        $text = false;
                                        break;
                                }
+                               $content = $message->content();
                                $text = $message->plain();
                        } else {
                                break;
                        }
-                       if ( $text === false ) {
+                       if ( !$content ) {
                                break;
                        }
                        # Redirect?
                        $finalTitle = $title;
-                       $title = Title::newFromRedirect( $text );
+                       $title = $content->getRedirectTarget();
                }
                return array(
                        'text' => $text,
@@ -3699,8 +3750,13 @@ class Parser {
                        return $obj->tc_contents;
                }
 
-               $text = Http::get( $url );
-               if ( !$text ) {
+               $req = MWHttpRequest::factory( $url );
+               $status = $req->execute(); // Status object
+               if ( $status->isOK() ) {
+                       $text = $req->getContent();
+               } elseif ( $req->getStatus() != 200 ) { // Though we failed to fetch the content, this status is useless.
+                       return wfMessage( 'scarytranscludefailed-httpstatus', $url, $req->getStatus() /* HTTP status */ )->inContentLanguage()->text();
+               } else {
                        return wfMessage( 'scarytranscludefailed', $url )->inContentLanguage()->text();
                }
 
@@ -3775,6 +3831,7 @@ class Parser {
         *     noClose    Original text did not have a close tag
         * @param $frame PPFrame
         *
+        * @throws MWException
         * @return string
         */
        function extensionSubstitution( $params, $frame ) {
@@ -4144,10 +4201,16 @@ class Parser {
                        $safeHeadline = $this->mStripState->unstripBoth( $safeHeadline );
 
                        # Strip out HTML (first regex removes any tag not allowed)
-                       # Allowed tags are <sup> and <sub> (bug 8393), <i> (bug 26375) and <b> (r105284)
-                       # We strip any parameter from accepted tags (second regex)
+                       # Allowed tags are:
+                       # * <sup> and <sub> (bug 8393)
+                       # * <i> (bug 26375)
+                       # * <b> (r105284)
+                       # * <span dir="rtl"> and <span dir="ltr"> (bug 35167)
+                       #
+                       # We strip any parameter from accepted tags (second regex), except dir="rtl|ltr" from <span>,
+                       # to allow setting directionality in toc items.
                        $tocline = preg_replace(
-                               array( '#<(?!/?(sup|sub|i|b)(?: [^>]*)?>).*?'.'>#', '#<(/?(sup|sub|i|b))(?: .*?)?'.'>#' ),
+                               array( '#<(?!/?(span|sup|sub|i|b)(?: [^>]*)?>).*?'.'>#', '#<(/?(?:span(?: dir="(?:rtl|ltr)")?|sup|sub|i|b))(?: .*?)?'.'>#' ),
                                array( '',                          '<$1>' ),
                                $safeHeadline
                        );
@@ -4436,14 +4499,14 @@ class Parser {
                        '~~~' => $sigText
                ) );
 
-               # Context links: [[|name]] and [[name (context)|]]
+               # Context links ("pipe trick"): [[|name]] and [[name (context)|]]
                $tc = '[' . Title::legalChars() . ']';
                $nc = '[ _0-9A-Za-z\x80-\xff-]'; # Namespaces can use non-ascii!
 
-               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";           # [[ns:page (context)|]]
-               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";           # [[ns:page(context)|]]
-               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/"; # [[ns:page (context), context|]]
-               $p2 = "/\[\[\\|($tc+)]]/";                                      # [[|page]]
+               $p1 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\))\\|]]/";                  # [[ns:page (context)|]]
+               $p4 = "/\[\[(:?$nc+:|:|)($tc+?)( ?($tc+))\\|]]/";                    # [[ns:page(context)|]] (double-width brackets, added in r40257)
+               $p3 = "/\[\[(:?$nc+:|:|)($tc+?)( ?\\($tc+\\)|)((?:, |,)$tc+|)\\|]]/"; # [[ns:page (context), context|]]
+               $p2 = "/\[\[\\|($tc+)]]/";                                             # [[|page]]
 
                # try $p1 first, to turn "[[A, B (C)|]]" into "[[A, B (C)|A, B]]"
                $text = preg_replace( $p1, '[[\\1\\2\\3|\\2]]', $text );
@@ -4633,11 +4696,7 @@ class Parser {
                        global $wgTitle;
                        $title = $wgTitle;
                }
-               if ( !$title ) {
-                       # It's not uncommon having a null $wgTitle in scripts. See r80898
-                       # Create a ghost title in such case
-                       $title = Title::newFromText( 'Dwimmerlaik' );
-               }
+
                $text = $this->preprocess( $text, $title, $options );
 
                $executing = false;
@@ -4666,6 +4725,7 @@ class Parser {
         *
         * @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
+        * @throws MWException
         * @return Mixed|null The old value of the mTagHooks array associated with the hook
         */
        public function setHook( $tag, $callback ) {
@@ -4696,6 +4756,7 @@ class Parser {
         *
         * @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
+        * @throws MWException
         * @return Mixed|null The old value of the mTagHooks array associated with the hook
         */
        function setTransparentTagHook( $tag, $callback ) {
@@ -4758,6 +4819,7 @@ class Parser {
         *     Please read the documentation in includes/parser/Preprocessor.php for more information
         *     about the methods available in PPFrame and PPNode.
         *
+        * @throws MWException
         * @return string|callback The old callback function for this name, if any
         */
        public function setFunctionHook( $id, $callback, $flags = 0 ) {
@@ -4805,6 +4867,10 @@ class Parser {
         * 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.
+        * @param $tag
+        * @param $callback
+        * @param $flags
+        * @throws MWException
         * @return null
         */
        function setFunctionTagHook( $tag, $callback, $flags ) {
@@ -5768,6 +5834,7 @@ class Parser {
         * check whether it is still valid, by calling isValidHalfParsedText().
         *
         * @param $data array Serialized data
+        * @throws MWException
         * @return String
         */
        function unserializeHalfParsedText( $data ) {
index 6a4ef0c..d419621 100644 (file)
@@ -48,6 +48,7 @@ class ParserCache {
         * May be a memcached client or a BagOStuff derivative.
         *
         * @param $memCached Object
+        * @throws MWException
         */
        protected function __construct( $memCached ) {
                if ( !$memCached ) {
@@ -200,8 +201,8 @@ class ParserCache {
 
                wfDebug( "ParserOutput cache found.\n" );
 
-               // The edit section preference may not be the appropiate one in 
-               // the ParserOutput, as we are not storing it in the parsercache 
+               // The edit section preference may not be the appropiate one in
+               // the ParserOutput, as we are not storing it in the parsercache
                // key. Force it here. See bug 31445.
                $value->setEditSectionTokens( $popts->getEditSection() );
 
index 009b18a..064182e 100644 (file)
  * @ingroup Parser
  */
 class ParserOptions {
-       
+
        /**
         * Use DateFormatter to format dates
         */
        var $mUseDynamicDates;
-       
+
        /**
         * Interlanguage links are removed and returned in an array
         */
        var $mInterwikiMagic;
-       
+
        /**
         * Allow external images inline?
         */
        var $mAllowExternalImages;
-       
+
        /**
         * If not, any exception?
         */
        var $mAllowExternalImagesFrom;
-       
+
        /**
         * If not or it doesn't match, should we check an on-wiki whitelist?
         */
        var $mEnableImageWhitelist;
-       
+
        /**
         * Date format index
         */
        var $mDateFormat = null;
-       
+
        /**
         * Create "edit section" links?
         */
        var $mEditSection = true;
-       
+
        /**
         * Allow inclusion of special pages?
         */
        var $mAllowSpecialInclusion;
-       
+
        /**
         * Use tidy to cleanup output HTML?
         */
        var $mTidy = false;
-       
+
        /**
         * Which lang to call for PLURAL and GRAMMAR
         */
        var $mInterfaceMessage = false;
-       
+
        /**
         * Overrides $mInterfaceMessage with arbitrary language
         */
        var $mTargetLanguage = null;
-       
+
        /**
         * Maximum size of template expansions, in bytes
         */
        var $mMaxIncludeSize;
-       
+
        /**
         * Maximum number of nodes touched by PPFrame::expand()
         */
@@ -99,56 +99,56 @@ class ParserOptions {
         * Maximum number of nodes generated by Preprocessor::preprocessToObj()
         */
        var $mMaxGeneratedPPNodeCount;
-       
+
        /**
         * Maximum recursion depth in PPFrame::expand()
         */
        var $mMaxPPExpandDepth;
-       
+
        /**
         * Maximum recursion depth for templates within templates
         */
        var $mMaxTemplateDepth;
-       
+
        /**
         * Maximum number of calls per parse to expensive parser functions
         */
        var $mExpensiveParserFunctionLimit;
-       
+
        /**
         * Remove HTML comments. ONLY APPLIES TO PREPROCESS OPERATIONS
         */
        var $mRemoveComments = true;
-       
+
        /**
         * Callback for template fetching. Used as first argument to call_user_func().
         */
        var $mTemplateCallback =
                array( 'Parser', 'statelessFetchTemplate' );
-               
+
        /**
         * Enable limit report in an HTML comment on output
         */
        var $mEnableLimitReport = false;
-       
+
        /**
         * Timestamp used for {{CURRENTDAY}} etc.
         */
        var $mTimestamp;
-       
+
        /**
         * Target attribute for external links
         */
        var $mExternalLinkTarget;
-       
+
        /**
-        * Clean up signature texts? 
+        * Clean up signature texts?
         *
         * 1) Strip ~~~, ~~~~ and ~~~~~ out of signatures
         * 2) Substitute all transclusions
         */
        var $mCleanSignatures;
-       
+
        /**
         * Transform wiki markup when saving the page?
         */
@@ -168,43 +168,43 @@ class ParserOptions {
         * Automatically number headings?
         */
        var $mNumberHeadings;
-       
+
        /**
         * User math preference (as integer). Not used (1.19)
         */
        var $mMath;
-       
+
        /**
         * Thumb size preferred by the user.
         */
        var $mThumbSize;
-       
+
        /**
         * Maximum article size of an article to be marked as "stub"
         */
        private $mStubThreshold;
-       
+
        /**
         * Language object of the User language.
         */
        var $mUserLang;
 
        /**
-        * @var User 
+        * @var User
         * Stored user object
         */
        var $mUser;
-       
+
        /**
         * Parsing the page for a "preview" operation?
         */
        var $mIsPreview = false;
-       
+
        /**
         * Parsing the page for a "preview" operation on a single section?
         */
        var $mIsSectionPreview = false;
-       
+
        /**
         * Parsing the printable version of the page?
         */
@@ -415,8 +415,8 @@ class ParserOptions {
                return new ParserOptions( $context->getUser(), $context->getLanguage() );
        }
 
-       /** 
-        * Get user options 
+       /**
+        * Get user options
         *
         * @param $user User object
         * @param $lang Language object
index 41b4a38..28d07f1 100644 (file)
@@ -50,7 +50,7 @@ class ParserOutput extends CacheTime {
                $mTimestamp;                  # Timestamp of the revision
                private $mIndexPolicy = '';       # 'index' or 'noindex'?  Any other value will result in no change.
                private $mAccessedOptions = array(); # List of ParserOptions (stored in the keys)
-               private $mSecondaryDataUpdates = array(); # List of instances of SecondaryDataObject(), used to cause some information extracted from the page in a custom place.
+               private $mSecondaryDataUpdates = array(); # List of DataUpdate, used to save info from the page somewhere else.
 
        const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)(</(?:mw:)?editsection>))#';
 
@@ -75,6 +75,8 @@ class ParserOutput extends CacheTime {
        /**
         * callback used by getText to replace editsection tokens
         * @private
+        * @param $m
+        * @throws MWException
         * @return mixed
         */
        function replaceEditSectionLinksCallback( $m ) {
@@ -150,11 +152,35 @@ class ParserOutput extends CacheTime {
                return (bool)$this->mNewSection;
        }
 
+       /**
+        * Checks, if a url is pointing to the own server
+        *
+        * @param $internal String the server to check against
+        * @param $url String the url to check
+        * @return bool
+        */
+       static function isLinkInternal( $internal, $url ) {
+               return (bool)preg_match( '/^' .
+                       # If server is proto relative, check also for http/https links
+                       ( substr( $internal, 0, 2 ) === '//' ? '(?:https?:)?' : '' ) .
+                       preg_quote( $internal, '/' ) .
+                       # check for query/path/anchor or end of link in each case
+                       '(?:[\?\/\#]|$)/i',
+                       $url
+               );
+       }
+
        function addExternalLink( $url ) {
                # We don't register links pointing to our own server, unless... :-)
                global $wgServer, $wgRegisterInternalExternals;
-               if( $wgRegisterInternalExternals or stripos($url,$wgServer.'/')!==0)
+
+               $registerExternalLink = true;
+               if( !$wgRegisterInternalExternals ) {
+                       $registerExternalLink = !self::isLinkInternal( $wgServer, $url );
+               }
+               if( $registerExternalLink ) {
                        $this->mExternalLinks[$url] = 1;
+               }
        }
 
        /**
@@ -320,7 +346,45 @@ class ParserOutput extends CacheTime {
        }
 
        /**
-        * Set a property to be cached in the DB
+        * Set a property to be stored in the page_props database table.
+        *
+        * page_props is a key value store indexed by the page ID. This allows
+        * the parser to set a property on a page which can then be quickly
+        * retrieved given the page ID or via a DB join when given the page
+        * title.
+        *
+        * setProperty() is thus used to propagate properties from the parsed
+        * page to request contexts other than a page view of the currently parsed
+        * article.
+        *
+        * Some applications examples:
+        *
+        *   * To implement hidden categories, hiding pages from category listings
+        *     by storing a property.
+        *
+        *   * Overriding the displayed article title.
+        *   @see ParserOutput::setDisplayTitle()
+        *
+        *   * To implement image tagging, for example displaying an icon on an
+        *     image thumbnail to indicate that it is listed for deletion on
+        *     Wikimedia Commons.
+        *     This is not actually implemented, yet but would be pretty cool.
+        *
+        * Do not use setProperty() to set a property which is only used in a
+        * context where the ParserOutput object itself is already available, for
+        * example a normal page view. There is no need to save such a property
+        * in the database since it the text is already parsed. You can just hook
+        * OutputPageParserOutput and get your data out of the ParserOutput object.
+        *
+        * If you are writing an extension where you want to set
+        * a property in the parser which is used by an OutputPageParserOutput hook,
+        * just use a custom variable within the ParserOutput object:
+        *
+        * @par Example:
+        * @code
+        *    $parser->getOutput()->my_ext_foo = '...';
+        * @endcode
+        *
         */
        public function setProperty( $name, $value ) {
                $this->mProperties[$name] = $value;
@@ -375,9 +439,13 @@ class ParserOutput extends CacheTime {
         * extracted from the page's content, including a LinksUpdate object for all links stored in
         * this ParserOutput object.
         *
+        * @note: Avoid using this method directly, use ContentHandler::getSecondaryDataUpdates() instead! The content
+        *        handler may provide additional update objects.
+        *
         * @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 $title Title The 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
index 6bcc324..e4f5d12 100644 (file)
@@ -32,7 +32,7 @@ class Parser_LinkHooks extends Parser {
         * can automatically discard old data.
         */
        const VERSION = '1.6.4';
-       
+
        # Flags for Parser::setLinkHook
        # Also available as global constants from Defines.php
        const SLH_PATTERN = 1;
@@ -84,11 +84,11 @@ class Parser_LinkHooks extends Parser {
         * Create a link hook, e.g. [[Namepsace:...|display}}
         * The callback function should have the form:
         *    function myLinkCallback( $parser, $holders, $markers,
-        *      Title $title, $titleText, &$sortText = null, &$leadingColon = false ) { ... }
+        *      Title $title, $titleText, &$sortText = null, &$leadingColon = false ) { ... }
         *
         * Or with SLH_PATTERN:
         *    function myLinkCallback( $parser, $holders, $markers, )
-        *      &$titleText, &$sortText = null, &$leadingColon = false ) { ... }
+        *      &$titleText, &$sortText = null, &$leadingColon = false ) { ... }
         *
         * The callback may either return a number of different possible values:
         * String) Text result of the link
@@ -100,6 +100,7 @@ class Parser_LinkHooks extends Parser {
         * @param $flags Integer: a combination of the following flags:
         *     SLH_PATTERN   Use a regex link pattern rather than a namespace
         *
+        * @throws MWException
         * @return callback|null The old callback function for this name, if any
         */
        public function setLinkHook( $ns, $callback, $flags = 0 ) {
@@ -111,7 +112,7 @@ class Parser_LinkHooks extends Parser {
                $this->mLinkHooks[$ns] = array( $callback, $flags );
                return $oldVal;
        }
-       
+
        /**
         * Get all registered link hook identifiers
         *
@@ -120,9 +121,11 @@ class Parser_LinkHooks extends Parser {
        function getLinkHooks() {
                return array_keys( $this->mLinkHooks );
        }
-       
+
        /**
         * Process [[ ]] wikilinks
+        * @param $s
+        * @throws MWException
         * @return LinkHolderArray
         *
         * @private
@@ -144,7 +147,7 @@ class Parser_LinkHooks extends Parser {
                }
 
                $holders = new LinkHolderArray( $this );
-               
+
                if( is_null( $this->mTitle ) ) {
                        wfProfileOut( __METHOD__ );
                        wfProfileOut( __METHOD__.'-setup' );
@@ -152,7 +155,7 @@ class Parser_LinkHooks extends Parser {
                }
 
                wfProfileOut( __METHOD__.'-setup' );
-               
+
                $offset = 0;
                $offsetStack = array();
                $markers = new LinkMarkerReplacer( $this, $holders, array( &$this, 'replaceInternalLinksCallback' ) );
@@ -178,7 +181,7 @@ class Parser_LinkHooks extends Parser {
                                $startBracketOffset = array_pop($offsetStack);
                                # Just to clean up the code, lets place offsets on the outer ends
                                $endBracketOffset += 2;
-                               
+
                                # Only do logic if we actually have a opening bracket for this
                                if( isset($startBracketOffset) ) {
                                        # Extract text inside the link
@@ -203,22 +206,20 @@ class Parser_LinkHooks extends Parser {
                                        # ToDO: Some LinkHooks use patterns rather than namespaces
                                        # these need to be tested at this point here
                                }
-                               
                        }
                        # Bump our offset to after our current bracket
                        $offset = $bracketOffset+2;
                }
-               
-               
+
                # Now expand our tree
                wfProfileIn( __METHOD__.'-expand' );
                $s = $markers->expand( $s );
                wfProfileOut( __METHOD__.'-expand' );
-               
+
                wfProfileOut( __METHOD__ );
                return $holders;
        }
-       
+
        function replaceInternalLinksCallback( $parser, $holders, $markers, $titleText, $paramText ) {
                wfProfileIn( __METHOD__ );
                $wt = isset($paramText) ? "[[$titleText|$paramText]]" : "[[$titleText]]";
@@ -230,16 +231,16 @@ class Parser_LinkHooks extends Parser {
                        wfProfileOut( __METHOD__ );
                        return $wt;
                }
-               
+
                # Make subpage if necessary
                if( $this->areSubpagesAllowed() ) {
                        $titleText = $this->maybeDoSubpageLink( $titleText, $paramText );
                }
-               
+
                # Check for a leading colon and strip it if it is there
                $leadingColon = $titleText[0] == ':';
                if( $leadingColon ) $titleText = substr( $titleText, 1 );
-               
+
                wfProfileOut( __METHOD__."-misc" );
                # Make title object
                wfProfileIn( __METHOD__."-title" );
@@ -251,7 +252,7 @@ class Parser_LinkHooks extends Parser {
                }
                $ns = $title->getNamespace();
                wfProfileOut( __METHOD__."-title" );
-               
+
                # Default for Namespaces is a default link
                # ToDo: Default for patterns is plain wikitext
                $return = true;
@@ -270,7 +271,7 @@ class Parser_LinkHooks extends Parser {
                }
                if( $return === true ) {
                        # True (treat as plain link) was returned, call the defaultLinkHook
-                       $return = CoreLinkFunctions::defaultLinkHook( $parser, $holders, $markers, $title, 
+                       $return = CoreLinkFunctions::defaultLinkHook( $parser, $holders, $markers, $title,
                                $titleText, $paramText, $leadingColon );
                }
                if( $return === false ) {
@@ -282,13 +283,13 @@ class Parser_LinkHooks extends Parser {
                wfProfileOut( __METHOD__ );
                return $return;
        }
-       
+
 }
 
 class LinkMarkerReplacer {
-       
+
        protected $markers, $nextId, $parser, $holders, $callback;
-       
+
        function __construct( $parser, $holders, $callback ) {
                $this->nextId   = 0;
                $this->markers  = array();
@@ -296,21 +297,21 @@ class LinkMarkerReplacer {
                $this->holders  = $holders;
                $this->callback = $callback;
        }
-       
+
        function addMarker($titleText, $paramText) {
                $id = $this->nextId++;
                $this->markers[$id] = array( $titleText, $paramText );
                return "<!-- LINKMARKER $id -->";
        }
-       
+
        function findMarker( $string ) {
                return (bool) preg_match('/<!-- LINKMARKER [0-9]+ -->/', $string );
        }
-       
+
        function expand( $string ) {
                return StringUtils::delimiterReplaceCallback( "<!-- LINKMARKER ", " -->", array( &$this, 'callback' ), $string );
        }
-       
+
        function callback( $m ) {
                $id = intval($m[1]);
                if( !array_key_exists($id, $this->markers) ) return $m[0];
@@ -320,5 +321,4 @@ class LinkMarkerReplacer {
                array_unshift( $args, $this->parser );
                return call_user_func_array( $this->callback, $args );
        }
-       
 }
index 34de0ba..53f3feb 100644 (file)
@@ -126,6 +126,7 @@ class Preprocessor_DOM implements Preprocessor {
         * cache may be implemented at a later date which takes further advantage of these strict
         * dependency requirements.
         *
+        * @throws MWException
         * @return PPNode_DOM
         */
        function preprocessToObj( $text, $flags = 0 ) {
@@ -164,7 +165,7 @@ class Preprocessor_DOM implements Preprocessor {
                }
 
                // Fail if the number of elements exceeds acceptable limits
-               // Do not attempt to generate the DOM 
+               // Do not attempt to generate the DOM
                $this->parser->mGeneratedPPNodeCount += substr_count( $xml, '<' );
                $max = $this->parser->mOptions->getMaxGeneratedPPNodeCount();
                if ( $this->parser->mGeneratedPPNodeCount > $max ) {
@@ -796,8 +797,8 @@ class PPDStack {
  * @ingroup Parser
  */
 class PPDStackElement {
-       var $open,                      // Opening character (\n for heading)
-               $close,             // Matching closing character
+       var     $open,              // Opening character (\n for heading)
+               $close,             // Matching closing character
                $count,             // Number of opening characters found (number of "=" for heading)
                $parts,             // Array of PPDPart objects describing pipe-separated parts.
                $lineStart;         // True if the open char appeared at the start of the input line. Not set for headings.
@@ -1673,6 +1674,7 @@ class PPNode_DOM implements PPNode {
         *  - index         String index
         *  - value         PPNode value
         *
+        * @throws MWException
         * @return array
         */
        function splitArg() {
@@ -1694,6 +1696,7 @@ class PPNode_DOM implements PPNode {
         * 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.
         *
+        * @throws MWException
         * @return array
         */
        function splitExt() {
@@ -1719,6 +1722,7 @@ class PPNode_DOM implements PPNode {
 
        /**
         * Split a "<h>" node
+        * @throws MWException
         * @return array
         */
        function splitHeading() {
index 4f04c86..a4e408e 100644 (file)
@@ -105,6 +105,7 @@ class Preprocessor_Hash implements Preprocessor {
         * cache may be implemented at a later date which takes further advantage of these strict
         * dependency requirements.
         *
+        * @throws MWException
         * @return PPNode_Hash_Tree
         */
        function preprocessToObj( $text, $flags = 0 ) {
@@ -884,9 +885,11 @@ class PPFrame_Hash implements PPFrame {
         * Create a new child frame
         * $args is optionally a multi-root PPNode or array containing the template arguments
         *
-        * @param $args PPNode_Hash_Array|array
+        * @param array|bool|\PPNode_Hash_Array $args PPNode_Hash_Array|array
         * @param $title Title|bool
         *
+        * @param int $indexOffset
+        * @throws MWException
         * @return PPTemplateFrame_Hash
         */
        function newChild( $args = false, $title = false, $indexOffset = 0 ) {
@@ -1609,6 +1612,7 @@ class PPNode_Hash_Tree implements PPNode {
         *  - index         String index
         *  - value         PPNode value
         *
+        * @throws MWException
         * @return array
         */
        function splitArg() {
@@ -1642,6 +1646,7 @@ class PPNode_Hash_Tree implements PPNode {
         * 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.
         *
+        * @throws MWException
         * @return array
         */
        function splitExt() {
@@ -1669,6 +1674,7 @@ class PPNode_Hash_Tree implements PPNode {
        /**
         * Split an "<h>" node
         *
+        * @throws MWException
         * @return array
         */
        function splitHeading() {
@@ -1695,6 +1701,7 @@ class PPNode_Hash_Tree implements PPNode {
        /**
         * Split a "<template>" or "<tplarg>" node
         *
+        * @throws MWException
         * @return array
         */
        function splitTemplate() {
index 8b71a1b..8059e35 100644 (file)
@@ -1884,6 +1884,7 @@ class PPNode_HipHop_Tree implements PPNode {
        /**
         * Split a <template> or <tplarg> node
         *
+        * @throws MWException
         * @return array
         */
        function splitTemplate() {
index ad95d5f..57f623d 100644 (file)
@@ -112,7 +112,7 @@ class StripState {
         * @return mixed
         */
        protected function unstripType( $type, $text ) {
-               // Shortcut 
+               // Shortcut
                if ( !count( $this->data[$type] ) ) {
                        return $text;
                }
@@ -139,7 +139,7 @@ class StripState {
                                        . '</span>';
                        }
                        if ( $this->recursionLevel >= self::UNSTRIP_RECURSION_LIMIT ) {
-                               return '<span class="error">' . 
+                               return '<span class="error">' .
                                        wfMessage( 'parser-unstrip-recursion-limit' )
                                                ->numParams( self::UNSTRIP_RECURSION_LIMIT )->inContentLanguage()->text() .
                                        '</span>';
@@ -156,7 +156,7 @@ class StripState {
        }
 
        /**
-        * Get a StripState object which is sufficient to unstrip the given text. 
+        * Get a StripState object which is sufficient to unstrip the given text.
         * It will contain the minimum subset of strip items necessary.
         *
         * @param $text string
index ed2d436..5cc1b0f 100644 (file)
@@ -59,9 +59,15 @@ class MWTidyWrapper {
                        dechex( mt_rand( 0, 0x7fffffff ) ) . dechex( mt_rand( 0, 0x7fffffff ) );
                $this->mMarkerIndex = 0;
 
+               // Replace <mw:editsection> elements with placeholders
                $wrappedtext = preg_replace_callback( ParserOutput::EDITSECTION_REGEX,
                        array( &$this, 'replaceEditSectionLinksCallback' ), $text );
 
+               // Modify inline Microdata <link> and <meta> elements so they say <html-link> and <html-meta> so
+               // we can trick Tidy into not stripping them out by including them in tidy's new-empty-tags config
+               $wrappedtext = preg_replace( '!<(link|meta)([^>]*?)(/{0,1}>)!', '<html-$1$2$3', $wrappedtext );
+
+               // Wrap the whole thing in a doctype and body for Tidy.
                $wrappedtext = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"'.
                        ' "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html>'.
                        '<head><title>test</title></head><body>'.$wrappedtext.'</body></html>';
@@ -86,7 +92,13 @@ class MWTidyWrapper {
         * @return string
         */
        public function postprocess( $text ) {
-               return $this->mTokens->replace( $text );
+               // Revert <html-{link,meta}> back to <{link,meta}>
+               $text = preg_replace( '!<html-(link|meta)([^>]*?)(/{0,1}>)!', '<$1$2$3', $text );
+
+               // Restore the contents of placeholder tokens
+               $text = $this->mTokens->replace( $text );
+
+               return $text;
        }
 
 }
index 99fe7ed..b4bd98c 100644 (file)
@@ -39,7 +39,7 @@ class ResourceLoader {
 
        /** Associative array mapping module name to info associative array */
        protected $moduleInfos = array();
+
        /** Associative array mapping framework ids to a list of names of test suite modules */
        /** like array( 'qunit' => array( 'mediawiki.tests.qunit.suites', 'ext.foo.tests', .. ), .. ) */
        protected $testModuleNames = array();
@@ -163,11 +163,11 @@ class ResourceLoader {
                                                $wgResourceLoaderMinifierStatementsOnOwnLine,
                                                $wgResourceLoaderMinifierMaxLineLength
                                        );
-                                       $result .= "\n\n/* cache key: $key */\n";
+                                       $result .= "\n/* cache key: $key */";
                                        break;
                                case 'minify-css':
                                        $result = CSSMin::minify( $data );
-                                       $result .= "\n\n/* cache key: $key */\n";
+                                       $result .= "\n/* cache key: $key */";
                                        break;
                        }
 
@@ -309,6 +309,7 @@ class ResourceLoader {
         *
         * @param $id Mixed: source ID (string), or array( id1 => props1, id2 => props2, ... )
         * @param $properties Array: source properties
+        * @throws MWException
         */
        public function addSource( $id, $properties = null) {
                // Allow multiple sources to be registered in one call
@@ -345,8 +346,8 @@ class ResourceLoader {
        public function getModuleNames() {
                return array_keys( $this->moduleInfos );
        }
-       /**
+
+       /**
         * Get a list of test module names for one (or all) frameworks.
         * If the given framework id is unknkown, or if the in-object variable is not an array,
         * then it will return an empty array.
@@ -703,7 +704,7 @@ class ResourceLoader {
                                                $scripts = $module->getScriptURLsForDebug( $context );
                                        } else {
                                                $scripts = $module->getScript( $context );
-                                               if ( is_string( $scripts ) ) {
+                                               if ( is_string( $scripts ) && strlen( $scripts ) && substr( $scripts, -1 ) !== ';' ) {
                                                        // bug 27054: Append semicolon to prevent weird bugs
                                                        // caused by files not terminating their statements right
                                                        $scripts .= ";\n";
@@ -720,19 +721,31 @@ class ResourceLoader {
                                                // 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 );
+                                                       $styles = array(
+                                                               'url' => $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 ) ) {
+                                                                       // Can be either a string or an array of strings.
+                                                                       if ( is_array( $style ) ) {
+                                                                               $stylePairs[$media] = array();
+                                                                               foreach ( $style as $cssText ) {
+                                                                                       if ( is_string( $cssText ) ) {
+                                                                                               $stylePairs[$media][] = $this->filter( 'minify-css', $cssText );
+                                                                                       }
+                                                                               }
+                                                                       } elseif ( is_string( $style ) ) {
                                                                                $stylePairs[$media] = $this->filter( 'minify-css', $style );
                                                                        }
                                                                }
                                                        }
-                                                       // Combine styles into @media groups as one big string
-                                                       $styles = array( '' => self::makeCombinedStyles( $stylePairs ) );
+                                                       // Wrap styles into @media groups as needed and flatten into a numerical array
+                                                       $styles = array(
+                                                               'css' => self::makeCombinedStyles( $stylePairs )
+                                                       );
                                                }
                                        }
                                }
@@ -752,11 +765,10 @@ class ResourceLoader {
                                                }
                                                break;
                                        case '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[''] : '';
+                                               // We no longer seperate into media, they are all combined now with
+                                               // custom media type groups into @media .. {} sections as part of the css string.
+                                               // Module returns either an empty array or a numerical array with css strings.
+                                               $out .= isset( $styles['css'] ) ? implode( '', $styles['css'] ) : '';
                                                break;
                                        case 'messages':
                                                $out .= self::makeMessageSetScript( new XmlJsCode( $messagesBlob ) );
@@ -821,6 +833,7 @@ class ResourceLoader {
         *     associative array mapping message key to value, or a JSON-encoded message blob containing
         *     the same data, wrapped in an XmlJsCode object.
         *
+        * @throws MWException
         * @return string
         */
        public static function makeLoaderImplementScript( $name, $scripts, $styles, $messages ) {
@@ -860,24 +873,32 @@ class ResourceLoader {
         * Combines an associative array mapping media type to CSS into a
         * single stylesheet with "@media" blocks.
         *
-        * @param $styles Array: List of CSS strings keyed by media type
+        * @param $stylePairs Array: Array keyed by media type containing (arrays of) CSS strings.
         *
-        * @return string
+        * @return Array
         */
-       public static function makeCombinedStyles( array $styles ) {
-               $out = '';
-               foreach ( $styles as $media => $style ) {
-                       // Transform the media type based on request params and config
-                       // The way that this relies on $wgRequest to propagate request params is slightly evil
-                       $media = OutputPage::transformCssMedia( $media );
-
-                       if ( $media === null ) {
-                               // Skip
-                       } elseif ( $media === '' || $media == 'all' ) {
-                               // Don't output invalid or frivolous @media statements
-                               $out .= "$style\n";
-                       } else {
-                               $out .= "@media $media {\n" . str_replace( "\n", "\n\t", "\t" . $style ) . "\n}\n";
+       private static function makeCombinedStyles( array $stylePairs ) {
+               $out = array();
+               foreach ( $stylePairs as $media => $styles ) {
+                       // ResourceLoaderFileModule::getStyle can return the styles
+                       // as a string or an array of strings. This is to allow separation in
+                       // the front-end.
+                       $styles = (array) $styles;
+                       foreach ( $styles as $style ) {
+                               $style = trim( $style );
+                               // Don't output an empty "@media print { }" block (bug 40498)
+                               if ( $style !== '' ) {
+                                       // Transform the media type based on request params and config
+                                       // The way that this relies on $wgRequest to propagate request params is slightly evil
+                                       $media = OutputPage::transformCssMedia( $media );
+
+                                       if ( $media === '' || $media == 'all' ) {
+                                               $out[] = $style;
+                                       } else if ( is_string( $media ) ) {
+                                               $out[] = "@media $media {\n" . str_replace( "\n", "\n\t", "\t" . $style ) . "}";
+                                       }
+                                       // else: skip
+                               }
                        }
                }
                return $out;
index f0892ec..ffa3046 100644 (file)
@@ -113,6 +113,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected $debugRaw = true;
        /** Boolean: Whether mw.loader.state() call should be omitted */
        protected $raw = false;
+       protected $targets = array( 'desktop' );
+
        /**
         * Array: Cache for mtime
         * @par Usage:
@@ -143,44 +145,45 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *     to $wgScriptPath
         *
         * Below is a description for the $options array:
+        * @throws MWException
         * @par Construction options:
         * @code
-        *      array(
-        *              // Base path to prepend to all local paths in $options. Defaults to $IP
-        *              'localBasePath' => [base path],
-        *              // Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath
-        *              'remoteBasePath' => [base path],
-        *              // Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath
-        *              'remoteExtPath' => [base path],
-        *              // Scripts to always include
-        *              'scripts' => [file path string or array of file path strings],
-        *              // Scripts to include in specific language contexts
-        *              'languageScripts' => array(
-        *                      [language code] => [file path string or array of file path strings],
-        *              ),
-        *              // Scripts to include in specific skin contexts
-        *              'skinScripts' => array(
-        *                      [skin name] => [file path string or array of file path strings],
-        *              ),
-        *              // Scripts to include in debug contexts
-        *              'debugScripts' => [file path string or array of file path strings],
-        *              // Scripts to include in the startup module
-        *              'loaderScripts' => [file path string or array of file path strings],
-        *              // Modules which must be loaded before this module
-        *              'dependencies' => [modile name string or array of module name strings],
-        *              // Styles to always load
-        *              'styles' => [file path string or array of file path strings],
-        *              // Styles to include in specific skin contexts
-        *              'skinStyles' => array(
-        *                      [skin name] => [file path string or array of file path strings],
-        *              ),
-        *              // Messages to always load
-        *              'messages' => [array of message key strings],
-        *              // Group which this module should be loaded together with
-        *              'group' => [group name string],
-        *              // Position on the page to load this module at
-        *              'position' => ['bottom' (default) or 'top']
-        *      )
+        *     array(
+        *         // Base path to prepend to all local paths in $options. Defaults to $IP
+        *         'localBasePath' => [base path],
+        *         // Base path to prepend to all remote paths in $options. Defaults to $wgScriptPath
+        *         'remoteBasePath' => [base path],
+        *         // Equivalent of remoteBasePath, but relative to $wgExtensionAssetsPath
+        *         'remoteExtPath' => [base path],
+        *         // Scripts to always include
+        *         'scripts' => [file path string or array of file path strings],
+        *         // Scripts to include in specific language contexts
+        *         'languageScripts' => array(
+        *             [language code] => [file path string or array of file path strings],
+        *         ),
+        *         // Scripts to include in specific skin contexts
+        *         'skinScripts' => array(
+        *             [skin name] => [file path string or array of file path strings],
+        *         ),
+        *         // Scripts to include in debug contexts
+        *         'debugScripts' => [file path string or array of file path strings],
+        *         // Scripts to include in the startup module
+        *         'loaderScripts' => [file path string or array of file path strings],
+        *         // Modules which must be loaded before this module
+        *         'dependencies' => [modile name string or array of module name strings],
+        *         // Styles to always load
+        *         'styles' => [file path string or array of file path strings],
+        *         // Styles to include in specific skin contexts
+        *         'skinStyles' => array(
+        *             [skin name] => [file path string or array of file path strings],
+        *         ),
+        *         // Messages to always load
+        *         'messages' => [array of message key strings],
+        *         // Group which this module should be loaded together with
+        *         'group' => [group name string],
+        *         // Position on the page to load this module at
+        *         'position' => ['bottom' (default) or 'top']
+        *     )
         * @endcode
         */
        public function __construct( $options = array(), $localBasePath = null,
@@ -231,6 +234,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                // Lists of strings
                                case 'dependencies':
                                case 'messages':
+                               case 'targets':
                                        $this->{$member} = (array) $option;
                                        break;
                                // Single strings
@@ -528,7 +532,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                if ( $context->getDebug() ) {
                        $files = array_merge( $files, $this->debugScripts );
                }
-               return $files;
+
+               return array_unique( $files );
        }
 
        /**
@@ -550,6 +555,7 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         * Gets the contents of a list of JavaScript files.
         *
         * @param $scripts Array: List of file paths to scripts to read, remap and concetenate
+        * @throws MWException
         * @return String: Concatenated and remapped JavaScript data from $scripts
         */
        protected function readScriptFiles( array $scripts ) {
@@ -618,7 +624,9 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        protected function readStyleFile( $path, $flip ) {
                $localPath = $this->getLocalPath( $path );
                if ( !file_exists( $localPath ) ) {
-                       throw new MWException( __METHOD__.": style file not found: \"$localPath\"" );
+                       $msg = __METHOD__.": style file not found: \"$localPath\"";
+                       wfDebugLog( 'resourceloader', $msg );
+                       throw new MWException( $msg );
                }
                $style = file_get_contents( $localPath );
                if ( $flip ) {
@@ -634,7 +642,8 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                // Get and register local file references
                $this->localFileRefs = array_merge(
                        $this->localFileRefs,
-                       CSSMin::getLocalFileReferences( $style, $dir ) );
+                       CSSMin::getLocalFileReferences( $style, $dir )
+               );
                return CSSMin::remap(
                        $style, $dir, $remoteDir, true
                );
@@ -665,4 +674,14 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        public function getFlip( $context ) {
                return $context->getDirection() === 'rtl';
        }
+
+       /**
+        * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+        *
+        * @return array of strings
+        */
+       public function getTargets() {
+               return $this->targets;
+       }
+
 }
index 1e19d0f..0e170fb 100644 (file)
@@ -77,7 +77,7 @@ abstract class ResourceLoaderModule {
        }
 
        /**
-        * Set this module's name. This is called by ResourceLodaer::register()
+        * Set this module's name. This is called by ResourceLoader::register()
         * when registering the module. Other code should not call this.
         *
         * @param $name String: Name
@@ -91,7 +91,7 @@ abstract class ResourceLoaderModule {
         * with ResourceLoader::register()
         *
         * @return Int ResourceLoaderModule class constant, the subclass default
-        *     if not set manuall
+        *     if not set manually
         */
        public function getOrigin() {
                return $this->origin;
@@ -172,7 +172,9 @@ abstract class ResourceLoaderModule {
         * Get all CSS for this module for a given skin.
         *
         * @param $context ResourceLoaderContext: Context object
-        * @return Array: List of CSS strings keyed by media type
+        * @return Array: List of CSS strings or array of CSS strings keyed by media type.
+        *  like array( 'screen' => '.foo { width: 0 }' );
+        *  or array( 'screen' => array( '.foo { width: 0 }' ) );
         */
        public function getStyles( ResourceLoaderContext $context ) {
                // Stub, override expected
@@ -332,8 +334,9 @@ abstract class ResourceLoaderModule {
         */
        public function getMsgBlobMtime( $lang ) {
                if ( !isset( $this->msgBlobMtime[$lang] ) ) {
-                       if ( !count( $this->getMessages() ) )
+                       if ( !count( $this->getMessages() ) ) {
                                return 0;
+                       }
 
                        $dbr = wfGetDB( DB_SLAVE );
                        $msgBlobMtime = $dbr->selectField( 'msg_resource', 'mr_timestamp', array(
@@ -373,7 +376,7 @@ abstract class ResourceLoaderModule {
         * NOTE: The mtime of the module's messages is NOT automatically included.
         * If you want this to happen, you'll need to call getMsgBlobMtime()
         * yourself and take its result into consideration.
-        * 
+        *
         * @param $context ResourceLoaderContext: Context object
         * @return Integer: UNIX timestamp
         */
@@ -424,10 +427,10 @@ abstract class ResourceLoaderModule {
                        try {
                                $parser->parse( $contents, $fileName, 1 );
                                $result = $contents;
-                       } catch (Exception $e) {
+                       } catch ( Exception $e ) {
                                // We'll save this to cache to avoid having to validate broken JS over and over...
                                $err = $e->getMessage();
-                               $result = "throw new Error(" . Xml::encodeJsVar("JavaScript parse error: $err") . ");";
+                               $result = "throw new Error(" . Xml::encodeJsVar( "JavaScript parse error: $err" ) . ");";
                        }
 
                        $cache->set( $key, $result );
@@ -447,4 +450,13 @@ abstract class ResourceLoaderModule {
                return self::$jsParser;
        }
 
+       /**
+        * Get target(s) for the module, eg ['desktop'] or ['desktop', 'mobile']
+        * Default implementation hardcodes 'desktop'.
+        *
+        * @return array of strings
+        */
+       public function getTargets() {
+               return array( 'desktop' );
+       }
 }
index 8e81c8d..bd026f3 100644 (file)
@@ -45,7 +45,7 @@ class ResourceLoaderNoscriptModule extends ResourceLoaderWikiModule {
 
        /**
         * Gets group name
-        * 
+        *
         * @return String: Name of group
         */
        public function getGroup() {
index 03fe1fe..1cc5c1a 100644 (file)
@@ -47,8 +47,8 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
                        'MediaWiki:Print.css' => array( 'type' => 'style', 'media' => 'print' ),
                );
                if ( $wgHandheldStyle ) {
-                       $pages['MediaWiki:Handheld.css'] = array( 
-                               'type' => 'style', 
+                       $pages['MediaWiki:Handheld.css'] = array(
+                               'type' => 'style',
                                'media' => 'handheld' );
                }
                return $pages;
@@ -58,7 +58,7 @@ class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
 
        /**
         * Gets group name
-        * 
+        *
         * @return String: Name of group
         */
        public function getGroup() {
index c86ed1d..1d36911 100644 (file)
@@ -37,8 +37,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        protected function getConfig( $context ) {
                global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension,
                        $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang,
-                       $wgVariantArticlePath, $wgActionPaths, $wgUseAjax, $wgVersion,
-                       $wgEnableAPI, $wgEnableWriteAPI, $wgDBname, $wgEnableMWSuggest,
+                       $wgVariantArticlePath, $wgActionPaths, $wgVersion,
+                       $wgEnableAPI, $wgEnableWriteAPI, $wgDBname,
                        $wgSitename, $wgFileExtensions, $wgExtensionAssetsPath,
                        $wgCookiePrefix, $wgResourceLoaderMaxQueryLength;
 
@@ -95,9 +95,6 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        'wgResourceLoaderMaxQueryLength' => $wgResourceLoaderMaxQueryLength,
                        'wgCaseSensitiveNamespaces' => $caseSensitiveNamespaces,
                );
-               if ( $wgUseAjax && $wgEnableMWSuggest ) {
-                       $vars['wgMWSuggestTemplate'] = SearchEngine::getMWSuggestTemplate();
-               }
 
                wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) );
 
@@ -117,6 +114,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                $out = '';
                $registrations = array();
                $resourceLoader = $context->getResourceLoader();
+               $target = $context->getRequest()->getVal( 'target', 'desktop' );
 
                // Register sources
                $out .= ResourceLoader::makeLoaderSourcesScript( $resourceLoader->getSources() );
@@ -124,6 +122,10 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                // Register modules
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
+                       $moduleTargets = $module->getTargets();
+                       if ( !in_array( $target, $moduleTargets ) ) {
+                               continue;
+                       }
                        $deps = $module->getDependencies();
                        $group = $module->getGroup();
                        $source = $module->getSource();
@@ -133,33 +135,33 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                                $version = wfTimestamp( TS_ISO_8601_BASIC,
                                        $module->getModifiedTime( $context ) );
                                $out .= ResourceLoader::makeCustomLoaderScript( $name, $version, $deps, $group, $source, $loader );
+                               continue;
                        }
+
                        // Automatically register module
+                       // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
+                       // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
+                       $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
+                       $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
+                       // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
+                       // mw.loader.register()
+                       if ( !count( $deps ) && $group === null && $source === 'local' ) {
+                               $registrations[] = array( $name, $mtime );
+                       }
+                       // Modules with dependencies but no group or foreign source pass three arguments
+                       // (name, timestamp, dependencies) to mw.loader.register()
+                       elseif ( $group === null && $source === 'local' ) {
+                               $registrations[] = array( $name, $mtime, $deps );
+                       }
+                       // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
+                       // to mw.loader.register()
+                       elseif ( $source === 'local' ) {
+                               $registrations[] = array( $name, $mtime, $deps, $group );
+                       }
+                       // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
+                       // to mw.loader.register()
                        else {
-                               // getModifiedTime() is supposed to return a UNIX timestamp, but it doesn't always
-                               // seem to do that, and custom implementations might forget. Coerce it to TS_UNIX
-                               $moduleMtime = wfTimestamp( TS_UNIX, $module->getModifiedTime( $context ) );
-                               $mtime = max( $moduleMtime, wfTimestamp( TS_UNIX, $wgCacheEpoch ) );
-                               // Modules without dependencies, a group or a foreign source pass two arguments (name, timestamp) to
-                               // mw.loader.register()
-                               if ( !count( $deps ) && $group === null && $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime );
-                               }
-                               // Modules with dependencies but no group or foreign source pass three arguments
-                               // (name, timestamp, dependencies) to mw.loader.register()
-                               elseif ( $group === null && $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime, $deps );
-                               }
-                               // Modules with a group but no foreign source pass four arguments (name, timestamp, dependencies, group)
-                               // to mw.loader.register()
-                               elseif ( $source === 'local' ) {
-                                       $registrations[] = array( $name, $mtime, $deps, $group );
-                               }
-                               // Modules with a foreign source pass five arguments (name, timestamp, dependencies, group, source)
-                               // to mw.loader.register()
-                               else {
-                                       $registrations[] = array( $name, $mtime, $deps, $group, $source );
-                               }
+                               $registrations[] = array( $name, $mtime, $deps, $group, $source );
                        }
                }
                $out .= ResourceLoader::makeLoaderRegisterScript( $registrations );
index 139048c..bdb240e 100644 (file)
@@ -48,7 +48,7 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
                global $wgUser;
                return $this->modifiedTime[$hash] = wfTimestamp( TS_UNIX, $wgUser->getTouched() );
        }
-       
+
        /**
         * @param $context ResourceLoaderContext
         * @return array
@@ -81,7 +81,10 @@ class ResourceLoaderUserCSSPrefsModule extends ResourceLoaderModule {
                                $rules[] = ".editsection { display: none; }\n";
                        }
                        if ( $options['editfont'] !== 'default' ) {
-                               $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
+                               // Double-check that $options['editfont'] consists of safe characters only
+                               if ( preg_match( '/^[a-zA-Z0-9_, -]+$/', $options['editfont'] ) ) {
+                                       $rules[] = "textarea { font-family: {$options['editfont']}; }\n";
+                               }
                        }
                        $style = implode( "\n", $rules );
                        if ( $this->getFlip( $context ) ) {
index 62d096a..6d787c5 100644 (file)
@@ -43,7 +43,8 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
 
                return array(
                        'editToken' => $wgUser->getEditToken(),
-                       'watchToken' => ApiQueryInfo::getWatchToken(null, null),
+                       'patrolToken' => ApiQueryRecentChanges::getPatrolToken( null, null ),
+                       'watchToken' => ApiQueryInfo::getWatchToken( null, null ),
                );
        }
 
index 623a269..1e61a3e 100644 (file)
@@ -68,12 +68,6 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
         * @return null|string
         */
        protected function getContent( $title ) {
-               if ( $title->getNamespace() === NS_MEDIAWIKI ) {
-                       // The first "true" is to use the database, the second is to use the content langue
-                       // and the last one is to specify the message key already contains the language in it ("/de", etc.)
-                       $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
-                       return $text === false ? '' : $text;
-               }
                if ( !$title->isCssJsSubpage() && !$title->isCssOrJsPage() ) {
                        return null;
                }
@@ -81,7 +75,22 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                if ( !$revision ) {
                        return null;
                }
-               return $revision->getRawText();
+
+               $content = $revision->getContent( Revision::RAW );
+
+               if ( !$content ) {
+                       wfDebug( __METHOD__ . "failed to load content of JS/CSS page!\n" );
+                       return null;
+               }
+
+               $model = $content->getModel();
+
+               if ( $model !== CONTENT_MODEL_CSS && $model !== CONTENT_MODEL_JAVASCRIPT ) {
+                       wfDebug( __METHOD__ . "bad content model $model for JS/CSS page!\n" );
+                       return null;
+               }
+
+               return $content->getNativeData(); //NOTE: this is safe, we know it's JS or CSS
        }
 
        /* Methods */
@@ -138,12 +147,12 @@ abstract class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        }
                        $style = CSSMin::remap( $style, false, $wgScriptPath, true );
                        if ( !isset( $styles[$media] ) ) {
-                               $styles[$media] = '';
+                               $styles[$media] = array();
                        }
                        if ( strpos( $titleText, '*/' ) === false ) {
-                               $styles[$media] .=  "/* $titleText */\n";
+                               $style =  "/* $titleText */\n" . $style;
                        }
-                       $styles[$media] .= $style . "\n";
+                       $styles[$media][] = $style;
                }
                return $styles;
        }
index 4f58099..8b8a3a3 100644 (file)
@@ -184,6 +184,7 @@ abstract class RevDel_List extends RevisionListBase {
         *     comment:         The log comment
         *     authorsIds:      The array of the user IDs of the offenders
         *     authorsIPs:      The array of the IP/anon user offenders
+        * @throws MWException
         */
        protected function updateLog( $params ) {
                // Get the URL param's corresponding DB field
index 2ccb6d3..0199edb 100644 (file)
@@ -163,7 +163,7 @@ class SearchEngine {
 
        /**
         * Really find the title match.
-        * @return null|\Title
+        * @return null|Title
         */
        private static function getNearMatchInternal( $searchterm ) {
                global $wgContLang, $wgEnableSearchContributorsByIP;
@@ -187,6 +187,11 @@ class SearchEngine {
                                return null;
                        }
 
+                       # Try files if searching in the Media: namespace
+                       if ( $title->getNamespace() == NS_MEDIA ) {
+                               $title = Title::makeTitle( NS_FILE, $title->getText() );
+                       }
+
                        if ( $title->isSpecialPage() || $title->isExternal() || $title->exists() ) {
                                return $title;
                        }
@@ -197,22 +202,23 @@ class SearchEngine {
                                return $title;
                        }
 
+                       if ( !wfRunHooks( 'SearchAfterNoDirectMatch', array( $term, &$title ) ) ) {
+                               return $title;
+                       }
+
                        # Now try all lower case (i.e. first letter capitalized)
-                       #
                        $title = Title::newFromText( $wgContLang->lc( $term ) );
                        if ( $title && $title->exists() ) {
                                return $title;
                        }
 
                        # Now try capitalized string
-                       #
                        $title = Title::newFromText( $wgContLang->ucwords( $term ) );
                        if ( $title && $title->exists() ) {
                                return $title;
                        }
 
                        # Now try all upper case
-                       #
                        $title = Title::newFromText( $wgContLang->uc( $term ) );
                        if ( $title && $title->exists() ) {
                                return $title;
@@ -505,19 +511,6 @@ class SearchEngine {
                        return $wgCanonicalServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace=' . $ns;
                }
        }
-
-       /**
-        * Get internal MediaWiki Suggest template
-        *
-        * @return String
-        */
-       public static function getMWSuggestTemplate() {
-               global $wgMWSuggestTemplate, $wgServer;
-               if ( $wgMWSuggestTemplate )
-                       return $wgMWSuggestTemplate;
-               else
-                       return $wgServer . wfScript( 'api' ) . '?action=opensearch&search={searchTerms}&namespace={namespaces}&suggest';
-       }
 }
 
 /**
@@ -804,11 +797,14 @@ class SearchResult {
         */
        protected function initText() {
                if ( !isset( $this->mText ) ) {
-                       if ( $this->mRevision != null )
-                               $this->mText = $this->mRevision->getText();
-                       else // TODO: can we fetch raw wikitext for commons images?
+                       if ( $this->mRevision != null ) {
+                               //TODO: if we could plug in some code that knows about special content models *and* about
+                               //      special features of the search engine, the search could benefit.
+                               $content = $this->mRevision->getContent();
+                               $this->mText = $content ? $content->getTextForSearchIndex() : '';
+                       } else { // TODO: can we fetch raw wikitext for commons images?
                                $this->mText = '';
-
+                       }
                }
        }
 
@@ -819,6 +815,8 @@ class SearchResult {
        function getTextSnippet( $terms ) {
                global $wgUser, $wgAdvancedSearchHighlighting;
                $this->initText();
+
+               // TODO: make highliter take a content object. Make ContentHandler a factory for SearchHighliter.
                list( $contextlines, $contextchars ) = SearchEngine::userHighlightPrefs( $wgUser );
                $h = new SearchHighlighter();
                if ( $wgAdvancedSearchHighlighting )
index 51ed000..368d900 100644 (file)
@@ -186,10 +186,10 @@ class SearchIBM_DB2 extends SearchEngine {
 
                $searchon = $this->db->strencode(join(',', $q));
                $field = $this->getIndexField($fulltext);
-               
+
                // requires Net Search Extender or equivalent
                //return " CONTAINS($field, '$searchon') > 0 ";
-               
+
                return " lcase($field) LIKE lcase('%$searchon%')";
        }
 
index 69c92ba..23dd479 100644 (file)
@@ -78,7 +78,7 @@ class SearchMssql extends SearchEngine {
         * Return a partial WHERE clause to limit the search to the given namespaces
         *
         * @return String
-        * @private                           
+        * @private
         */
        function queryNamespaces() {
                $namespaces = implode( ',', $this->namespaces );
@@ -146,7 +146,7 @@ class SearchMssql extends SearchEngine {
                $match = $this->parseQuery( $filteredTerm, $fulltext );
                $page        = $this->db->tableName( 'page' );
                $searchindex = $this->db->tableName( 'searchindex' );
-               
+
                return 'SELECT page_id, page_namespace, page_title, ftindex.[RANK]' .
                        "FROM $page,FREETEXTTABLE($searchindex , $match, LANGUAGE 'English') as ftindex " .
                        'WHERE page_id=ftindex.[KEY] ';
@@ -192,11 +192,11 @@ class SearchMssql extends SearchEngine {
         * @param $id Integer
         * @param $title String
         * @param $text String
-        * @return bool|\ResultWrapper
+        * @return bool|ResultWrapper
         */
        function update( $id, $title, $text ) {
                // We store the column data as UTF-8 byte order marked binary stream
-               // because we are invoking the plain text IFilter on it so that, and we want it 
+               // because we are invoking the plain text IFilter on it so that, and we want it
                // to properly decode the stream as UTF-8.  SQL doesn't support UTF8 as a data type
                // but the indexer will correctly handle it by this method.  Since all we are doing
                // is passing this data to the indexer and never retrieving it via PHP, this will save space
@@ -215,7 +215,7 @@ class SearchMssql extends SearchEngine {
         *
         * @param $id Integer
         * @param $title String
-        * @return bool|\ResultWrapper
+        * @return bool|ResultWrapper
         */
        function updateTitle( $id, $title ) {
                $table = $this->db->tableName( 'searchindex' );
index a2db52f..29070e1 100644 (file)
  * @ingroup Search
  */
 class SearchOracle extends SearchEngine {
-       
-       private $reservedWords = array ('ABOUT' => 1, 
-                                                                       'ACCUM' => 1, 
-                                                                       'AND' => 1, 
-                                                                       'BT' => 1, 
-                                                                       'BTG' => 1, 
-                                                                       'BTI' => 1, 
+
+       private $reservedWords = array ('ABOUT' => 1,
+                                                                       'ACCUM' => 1,
+                                                                       'AND' => 1,
+                                                                       'BT' => 1,
+                                                                       'BTG' => 1,
+                                                                       'BTI' => 1,
                                                                        'BTP' => 1,
-                                                                       'FUZZY' => 1, 
-                                                                       'HASPATH' => 1, 
-                                                                       'INPATH' => 1, 
-                                                                       'MINUS' => 1, 
-                                                                       'NEAR' => 1, 
+                                                                       'FUZZY' => 1,
+                                                                       'HASPATH' => 1,
+                                                                       'INPATH' => 1,
+                                                                       'MINUS' => 1,
+                                                                       'NEAR' => 1,
                                                                        'NOT' => 1,
-                                                                       'NT' => 1, 
-                                                                       'NTG' => 1, 
-                                                                       'NTI' => 1, 
-                                                                       'NTP' => 1, 
-                                                                       'OR' => 1, 
-                                                                       'PT' => 1, 
-                                                                       'RT' => 1, 
+                                                                       'NT' => 1,
+                                                                       'NTG' => 1,
+                                                                       'NTI' => 1,
+                                                                       'NTP' => 1,
+                                                                       'OR' => 1,
+                                                                       'PT' => 1,
+                                                                       'RT' => 1,
                                                                        'SQE' => 1,
-                                                                       'SYN' => 1, 
-                                                                       'TR' => 1, 
-                                                                       'TRSYN' => 1, 
-                                                                       'TT' => 1, 
+                                                                       'SYN' => 1,
+                                                                       'TR' => 1,
+                                                                       'TRSYN' => 1,
+                                                                       'TT' => 1,
                                                                        'WITHIN' => 1);
 
        /**
@@ -254,13 +254,13 @@ class SearchOracle extends SearchEngine {
                        ), 'SearchOracle::update' );
 
                // Sync the index
-               // We need to specify the DB name (i.e. user/schema) here so that 
+               // We need to specify the DB name (i.e. user/schema) here so that
                // it can work from the installer, where
                //     ALTER SESSION SET CURRENT_SCHEMA = ...
                // was used.
-               $dbw->query( "CALL ctx_ddl.sync_index(" . 
+               $dbw->query( "CALL ctx_ddl.sync_index(" .
                        $dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_text_idx', 'raw' ) ) . ")" );
-               $dbw->query( "CALL ctx_ddl.sync_index(" . 
+               $dbw->query( "CALL ctx_ddl.sync_index(" .
                        $dbw->addQuotes( $dbw->getDBname() . '.' . $dbw->tableName( 'si_title_idx', 'raw' ) ) . ")" );
        }
 
diff --git a/includes/site/MediaWikiSite.php b/includes/site/MediaWikiSite.php
new file mode 100644 (file)
index 0000000..b2e2e71
--- /dev/null
@@ -0,0 +1,342 @@
+<?php
+/**
+ * Class representing a MediaWiki 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
+ * 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 Site
+ * @license GNU GPL v2+
+ * @author John Erling Blad < jeblad@gmail.com >
+ * @author Daniel Kinzler
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+
+/**
+ * Class representing a MediaWiki site.
+ *
+ * @since 1.21
+ *
+ * @ingroup Site
+ */
+class MediaWikiSite extends SiteObject {
+
+       const PATH_FILE = 'file_path';
+       const PATH_PAGE = 'page_path';
+
+       /**
+        * @since 1.21
+        *
+        * @param integer $globalId
+        *
+        * @return MediaWikiSite
+        */
+       public static function newFromGlobalId( $globalId ) {
+               return SitesTable::singleton()->newRow( array(
+                       'type' => Site::TYPE_MEDIAWIKI,
+                       'global_key' => $globalId,
+               ), true );
+       }
+
+       /**
+        * Returns the database form of the given title.
+        *
+        * @since 1.21
+        *
+        * @param String $title the target page's title, in normalized form.
+        *
+        * @return String
+        */
+       public function toDBKey( $title ) {
+               return str_replace( ' ', '_', $title );
+       }
+
+       /**
+        * Returns the normalized form of the given page title, using the normalization rules of the given site.
+        * If the given title is a redirect, the redirect weill be resolved and the redirect target is returned.
+        *
+        * @note  : This actually makes an API request to the remote site, so beware that this function is slow and depends
+        *          on an external service.
+        *
+        * @note  : If MW_PHPUNIT_TEST is defined, the call to the external site is skipped, and the title
+        *          is normalized using the local normalization rules as implemented by the Title class.
+        *
+        * @see Site::normalizePageName
+        *
+        * @since 1.21
+        *
+        * @param string $pageName
+        *
+        * @return string
+        * @throws MWException
+        */
+       public function normalizePageName( $pageName ) {
+
+               // Check if we have strings as arguments.
+               if ( !is_string( $pageName ) ) {
+                       throw new MWException( '$pageName must be a string' );
+               }
+
+               // Go on call the external site
+               if ( defined( 'MW_PHPUNIT_TEST' ) ) {
+                       // If the code is under test, don't call out to other sites, just normalize locally.
+                       // Note: this may cause results to be inconsistent with the actual normalization used by the respective remote site!
+
+                       $t = Title::newFromText( $pageName );
+                       return $t->getPrefixedText();
+               } else {
+
+                       // Make sure the string is normalized into NFC (due to the bug 40017)
+                       // but do nothing to the whitespaces, that should work appropriately.
+                       // @see https://bugzilla.wikimedia.org/show_bug.cgi?id=40017
+                       $pageName = UtfNormal::cleanUp( $pageName );
+
+                       // Build the args for the specific call
+                       $args = array(
+                               'action' => 'query',
+                               'prop' => 'info',
+                               'redirects' => true,
+                               'converttitles' => true,
+                               'format' => 'json',
+                               'titles' => $pageName,
+                               //@todo: options for maxlag and maxage
+                               // Note that maxlag will lead to a long delay before a reply is made,
+                               // but that maxage can avoid the extreme delay. On the other hand
+                               // maxage could be nice to use anyhow as it stops unnecessary requests.
+                               // Also consider smaxage if maxage is used.
+                       );
+
+                       $url = $this->getFileUrl( 'api.php' ) . '?' . wfArrayToCgi( $args );
+
+                       // Go on call the external site
+                       //@todo: we need a good way to specify a timeout here.
+                       $ret = Http::get( $url );
+               }
+
+               if ( $ret === false ) {
+                       wfDebugLog( "MediaWikiSite", "call to external site failed: $url" );
+                       return false;
+               }
+
+               $data = FormatJson::decode( $ret, true );
+
+               if ( !is_array( $data ) ) {
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned bad json: " . $ret );
+                       return false;
+               }
+
+               $page = static::extractPageRecord( $data, $pageName );
+
+               if ( isset( $page['missing'] ) ) {
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for a missing page title! " . $ret );
+                       return false;
+               }
+
+               if ( isset( $page['invalid'] ) ) {
+                       wfDebugLog( "MediaWikiSite", "call to <$url> returned a marker for an invalid page title! " . $ret );
+                       return false;
+               }
+
+               if ( !isset( $page['title'] ) ) {
+                       wfDebugLog( "MediaWikiSite", "call to <$url> did not return a page title! " . $ret );
+                       return false;
+               }
+
+               return $page['title'];
+       }
+
+
+       /**
+        * Get normalization record for a given page title from an API response.
+        *
+        * @since 1.21
+        *
+        * @param array $externalData A reply from the API on a external server.
+        * @param string $pageTitle Identifies the page at the external site, needing normalization.
+        *
+        * @return array|false a 'page' structure representing the page identified by $pageTitle.
+        */
+       private static function extractPageRecord( $externalData, $pageTitle ) {
+               // If there is a special case with only one returned page
+               // we can cheat, and only return
+               // the single page in the "pages" substructure.
+               if ( isset( $externalData['query']['pages'] ) ) {
+                       $pages = array_values( $externalData['query']['pages'] );
+                       if ( count( $pages) === 1 ) {
+                               return $pages[0];
+                       }
+               }
+               // This is only used during internal testing, as it is assumed
+               // a more optimal (and lossfree) storage.
+               // Make initial checks and return if prerequisites are not meet.
+               if ( !is_array( $externalData ) || !isset( $externalData['query'] ) ) {
+                       return false;
+               }
+               // Loop over the tree different named structures, that otherwise are similar
+               $structs = array(
+                       'normalized' => 'from',
+                       'converted' => 'from',
+                       'redirects' => 'from',
+                       'pages' => 'title'
+               );
+               foreach ( $structs as $listId => $fieldId ) {
+                       // Check if the substructure exist at all.
+                       if ( !isset( $externalData['query'][$listId] ) ) {
+                               continue;
+                       }
+                       // Filter the substructure down to what we actually are using.
+                       $collectedHits = array_filter(
+                               array_values( $externalData['query'][$listId] ),
+                               function( $a ) use ( $fieldId, $pageTitle ) {
+                                       return $a[$fieldId] === $pageTitle;
+                               }
+                       );
+                       // If still looping over normalization, conversion or redirects,
+                       // then we need to keep the new page title for later rounds.
+                       if ( $fieldId === 'from' && is_array( $collectedHits ) ) {
+                               switch ( count( $collectedHits ) ) {
+                                       case 0:
+                                               break;
+                                       case 1:
+                                               $pageTitle = $collectedHits[0]['to'];
+                                               break;
+                                       default:
+                                               return false;
+                               }
+                       }
+                       // If on the pages structure we should prepare for returning.
+                       elseif ( $fieldId === 'title' && is_array( $collectedHits ) ) {
+                               switch ( count( $collectedHits ) ) {
+                                       case 0:
+                                               return false;
+                                       case 1:
+                                               return array_shift( $collectedHits );
+                                       default:
+                                               return false;
+                               }
+                       }
+               }
+               // should never be here
+               return false;
+       }
+
+       /**
+        * @see Site::getLinkPathType
+        * Returns Site::PATH_PAGE
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getLinkPathType() {
+               return self::PATH_PAGE;
+       }
+
+       /**
+        * Returns the relative page path.
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getRelativePagePath() {
+               return parse_url( $this->getPath( self::PATH_PAGE ), PHP_URL_PATH );
+       }
+
+       /**
+        * Returns the relative file path.
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getRelativeFilePath() {
+               return parse_url( $this->getPath( self::PATH_FILE ), PHP_URL_PATH );
+       }
+
+       /**
+        * Sets the relative page path.
+        *
+        * @since 1.21
+        *
+        * @param string $path
+        */
+       public function setPagePath( $path ) {
+               $this->setPath( self::PATH_PAGE, $path );
+       }
+
+       /**
+        * Sets the relative file path.
+        *
+        * @since 1.21
+        *
+        * @param string $path
+        */
+       public function setFilePath( $path ) {
+               $this->setPath( self::PATH_FILE, $path );
+       }
+
+       /**
+        * @see Site::getPagePath
+        *
+        * This implementation returns a URL constructed using the path returned by getLinkPath().
+        * In addition to the default behaviour implemented by SiteObject::getPageUrl(), this
+        * method converts the $pageName to DBKey-format by replacing spaces with underscores
+        * before using it in the URL.
+        *
+        * @since 1.21
+        *
+        * @param $pagename string: Page name (default: false)
+        *
+        * @return string
+        */
+       public function getPageUrl( $pageName = false ) {
+               $url = $this->getLinkPath();
+
+               if ( $url === false ) {
+                       return false;
+               }
+
+               if ( $pageName !== false ) {
+                       $pageName = $this->toDBKey( trim( $pageName ) );
+                       $url = str_replace( '$1', wfUrlencode( $pageName ), $url ) ;
+               }
+
+               return $url;
+       }
+
+       /**
+        * Returns the full file path (ie site url + relative file path).
+        * The path should go at the $1 marker. If the $path
+        * argument is provided, the marker will be replaced by it's value.
+        *
+        * @since 1.21
+        *
+        * @param string|false $path
+        *
+        * @return string
+        */
+       public function getFileUrl( $path = false ) {
+               $filePath = $this->getPath( self::PATH_FILE );
+
+               if ( $filePath !== false ) {
+                       $filePath = str_replace( '$1', $path, $filePath );
+               }
+
+               return $filePath;
+       }
+
+}
diff --git a/includes/site/Site.php b/includes/site/Site.php
new file mode 100644 (file)
index 0000000..200a006
--- /dev/null
@@ -0,0 +1,316 @@
+<?php
+
+/**
+ * Interface for site objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+interface Site {
+
+       const TYPE_UNKNOWN = 'unknown';
+       const TYPE_MEDIAWIKI = 'mediawiki';
+
+       const GROUP_NONE = 'none';
+
+       const ID_INTERWIKI = 'interwiki';
+       const ID_EQUIVALENT = 'equivalent';
+
+       const SOURCE_LOCAL = 'local';
+
+       /**
+        * Returns the global site identifier (ie enwiktionary).
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getGlobalId();
+
+       /**
+        * Sets the global site identifier (ie enwiktionary).
+        *
+        * @since 1.21
+        *
+        * @param string $globalId
+        */
+       public function setGlobalId( $globalId );
+
+       /**
+        * Returns the type of the site (ie mediawiki).
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getType();
+
+       /**
+        * Sets the type of the site (ie mediawiki).
+        * TODO: remove, we cannot change this after instantiation
+        *
+        * @since 1.21
+        *
+        * @param string $type
+        */
+       public function setType( $type );
+
+       /**
+        * Gets the type of the site (ie wikipedia).
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getGroup();
+
+       /**
+        * Sets the type of the site (ie wikipedia).
+        *
+        * @since 1.21
+        *
+        * @param string $group
+        */
+       public function setGroup( $group );
+
+       /**
+        * Returns the source of the site data (ie 'local', 'wikidata', 'my-magical-repo').
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getSource();
+
+       /**
+        * Sets the source of the site data (ie 'local', 'wikidata', 'my-magical-repo').
+        *
+        * @since 1.21
+        *
+        * @param string $source
+        */
+       public function setSource( $source );
+
+       /**
+        * Returns the protocol of the site, ie 'http://', 'irc://', '//'
+        * Or false if it's not known.
+        *
+        * @since 1.21
+        *
+        * @return string|false
+        */
+       public function getProtocol();
+
+       /**
+        * Returns the domain of the site, ie en.wikipedia.org
+        * Or false if it's not known.
+        *
+        * @since 1.21
+        *
+        * @return string|false
+        */
+       public function getDomain();
+
+       /**
+        * Returns the full URL for the given page on the site.
+        * Or false if the needed information is not known.
+        *
+        * This generated URL is usually based upon the path returned by getLinkPath(),
+        * but this is not a requirement.
+        *
+        * @since 1.21
+        * @see Site::getLinkPath()
+        *
+        * @param bool|String $page
+        *
+        * @return string|false
+        */
+       public function getPageUrl( $page = false );
+
+       /**
+        * Returns language code of the sites primary language.
+        * Or false if it's not known.
+        *
+        * @since 1.21
+        *
+        * @return string|false
+        */
+       public function getLanguageCode();
+
+       /**
+        * Sets language code of the sites primary language.
+        *
+        * @since 1.21
+        *
+        * @param string $languageCode
+        */
+       public function setLanguageCode( $languageCode );
+
+       /**
+        * Returns the normalized, canonical form of the given page name.
+        * How normalization is performed or what the properties of a normalized name are depends on the site.
+        * The general contract of this method is that the normalized form shall refer to the same content
+        * as the original form, and any other page name referring to the same content will have the same normalized form.
+        *
+        * Note that this method may call out to the target site to perform the normalization, so it may be slow
+        * and fail due to IO errors.
+        *
+        * @since 1.21
+        *
+        * @param string $pageName
+        *
+        * @return string the normalized page name
+        */
+       public function normalizePageName( $pageName );
+
+       /**
+        * Returns the interwiki link identifiers that can be used for this site.
+        *
+        * @since 1.21
+        *
+        * @return array of string
+        */
+       public function getInterwikiIds();
+
+       /**
+        * Returns the equivalent link identifiers that can be used to make
+        * the site show up in interfaces such as the "language links" section.
+        *
+        * @since 1.21
+        *
+        * @return array of string
+        */
+       public function getNavigationIds();
+
+       /**
+        * Adds an local identifier to the site.
+        *
+        * @since 1.21
+        *
+        * @param string $type The type of the identifier, element of the Site::ID_ enum
+        * @param string $identifier
+        */
+       public function addLocalId( $type, $identifier );
+
+       /**
+        * Adds an interwiki id to the site.
+        *
+        * @since 1.21
+        *
+        * @param string $identifier
+        */
+       public function addInterwikiId( $identifier );
+
+       /**
+        * Adds a navigation id to the site.
+        *
+        * @since 1.21
+        *
+        * @param string $identifier
+        */
+       public function addNavigationId( $identifier );
+
+       /**
+        * Saves the site.
+        *
+        * @since 1.21
+        *
+        * @param string|null $functionName
+        */
+       public function save( $functionName = null );
+
+       /**
+        * Returns the internal ID of the site.
+        *
+        * @since 1.21
+        *
+        * @return integer
+        */
+       public function getInternalId();
+
+       /**
+        * Sets the provided url as path of the specified type.
+        *
+        * @since 1.21
+        *
+        * @param string $pathType
+        * @param string $fullUrl
+        */
+       public function setPath( $pathType, $fullUrl );
+
+       /**
+        * Returns the path of the provided type or false if there is no such path.
+        *
+        * @since 1.21
+        *
+        * @param string $pathType
+        *
+        * @return string|false
+        */
+       public function getPath( $pathType );
+
+       /**
+        * Sets the path used to construct links with.
+        * Shall be equivalent to setPath( getLinkPathType(), $fullUrl ).
+        *
+        * @param string $fullUrl
+        *
+        * @since 1.21
+        */
+       public function setLinkPath( $fullUrl );
+
+       /**
+        * Returns the path used to construct links with or false if there is no such path.
+        * Shall be equivalent to getPath( getLinkPathType() ).
+        *
+        * @return string|false
+        */
+       public function getLinkPath();
+
+       /**
+        * Returns the path type used to construct links with.
+        *
+        * @return string|false
+        */
+       public function getLinkPathType();
+
+       /**
+        * Returns the paths as associative array.
+        * The keys are path types, the values are the path urls.
+        *
+        * @since 1.21
+        *
+        * @return array of string
+        */
+       public function getAllPaths();
+
+       /**
+        * Removes the path of the provided type if it's set.
+        *
+        * @since 1.21
+        *
+        * @param string $pathType
+        */
+       public function removePath( $pathType );
+
+}
\ No newline at end of file
diff --git a/includes/site/SiteArray.php b/includes/site/SiteArray.php
new file mode 100644 (file)
index 0000000..141629e
--- /dev/null
@@ -0,0 +1,205 @@
+<?php
+
+/**
+ * Implementation of SiteList using GenericArrayObject.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteArray extends GenericArrayObject implements SiteList {
+
+       /**
+        * Internal site identifiers pointing to their sites offset value.
+        *
+        * @since 1.21
+        *
+        * @var array of integer
+        */
+       protected $byInternalId = array();
+
+       /**
+        * Global site identifiers pointing to their sites offset value.
+        *
+        * @since 1.21
+        *
+        * @var array of string
+        */
+       protected $byGlobalId = array();
+
+       /**
+        * @see GenericArrayObject::getObjectType
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getObjectType() {
+               return 'Site';
+       }
+
+       /**
+        * @see GenericArrayObject::preSetElement
+        *
+        * @since 1.21
+        *
+        * @param int|string $index
+        * @param Site $site
+        *
+        * @return boolean
+        */
+       protected function preSetElement( $index, $site ) {
+               if ( $this->hasSite( $site->getGlobalId() ) ) {
+                       $this->removeSite( $site->getGlobalId() );
+               }
+
+               $this->byGlobalId[$site->getGlobalId()] = $index;
+               $this->byInternalId[$site->getInternalId()] = $index;
+
+               return true;
+       }
+
+       /**
+        * @see ArrayObject::offsetUnset()
+        *
+        * @since 1.21
+        *
+        * @param mixed $index
+        */
+       public function offsetUnset( $index ) {
+               /**
+                * @var Site $site
+                */
+               $site = $this->offsetGet( $index );
+
+               if ( $site !== false ) {
+                       unset( $this->byGlobalId[$site->getGlobalId()] );
+                       unset( $this->byInternalId[$site->getInternalId()] );
+               }
+
+               parent::offsetUnset( $index );
+       }
+
+       /**
+        * @see SiteList::getGlobalIdentifiers
+        *
+        * @since 1.21
+        *
+        * @return array
+        */
+       public function getGlobalIdentifiers() {
+               return array_keys( $this->byGlobalId );
+       }
+
+       /**
+        * @see SiteList::hasSite
+        *
+        * @param string $globalSiteId
+        *
+        * @return boolean
+        */
+       public function hasSite( $globalSiteId ) {
+               return array_key_exists( $globalSiteId, $this->byGlobalId );
+       }
+
+       /**
+        * @see SiteList::getSite
+        *
+        * @since 1.21
+        *
+        * @param string $globalSiteId
+        *
+        * @return Site
+        */
+       public function getSite( $globalSiteId ) {
+               return $this->offsetGet( $this->byGlobalId[$globalSiteId] );
+       }
+
+       /**
+        * @see SiteList::removeSite
+        *
+        * @since 1.21
+        *
+        * @param string $globalSiteId
+        */
+       public function removeSite( $globalSiteId ) {
+               $this->offsetUnset( $this->byGlobalId[$globalSiteId] );
+       }
+
+       /**
+        * @see SiteList::isEmpty
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function isEmpty() {
+               return $this->byGlobalId === array();
+       }
+
+       /**
+        * @see SiteList::hasInternalId
+        *
+        * @param integer $id
+        *
+        * @return boolean
+        */
+       public function hasInternalId( $id ) {
+               return array_key_exists( $id, $this->byInternalId );
+       }
+
+       /**
+        * @see SiteList::getSiteByInternalId
+        *
+        * @since 1.21
+        *
+        * @param integer $id
+        *
+        * @return Site
+        */
+       public function getSiteByInternalId( $id ) {
+               return $this->offsetGet( $this->byInternalId[$id] );
+       }
+
+       /**
+        * @see SiteList::removeSiteByInternalId
+        *
+        * @since 1.21
+        *
+        * @param integer $id
+        */
+       public function removeSiteByInternalId( $id ) {
+               $this->offsetUnset( $this->byInternalId[$id] );
+       }
+
+       /**
+        * @see SiteList::setSite
+        *
+        * @since 1.21
+        *
+        * @param Site $site
+        */
+       public function setSite( Site $site ) {
+               $this[] = $site;
+       }
+
+}
diff --git a/includes/site/SiteList.php b/includes/site/SiteList.php
new file mode 100644 (file)
index 0000000..6273364
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+
+/**
+ * Interface for lists of Site objects.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+interface SiteList extends Countable, Traversable, Serializable, ArrayAccess {
+
+       /**
+        * Returns all the global site identifiers.
+        * Optionally only those belonging to the specified group.
+        *
+        * @since 1.21
+        *
+        * @return array
+        */
+       public function getGlobalIdentifiers();
+
+       /**
+        * Returns if the list contains the site with the provided global site identifier.
+        *
+        * @param string $globalSiteId
+        *
+        * @return boolean
+        */
+       public function hasSite( $globalSiteId );
+
+       /**
+        * Returns the Site with the provided global site identifier.
+        * The site needs to exist, so if not sure, call hasGlobalId first.
+        *
+        * @since 1.21
+        *
+        * @param string $globalSiteId
+        *
+        * @return Site
+        */
+       public function getSite( $globalSiteId );
+
+       /**
+        * Removes the site with the specified global site identifier.
+        * The site needs to exist, so if not sure, call hasGlobalId first.
+        *
+        * @since 1.21
+        *
+        * @param string $globalSiteId
+        */
+       public function removeSite( $globalSiteId );
+
+       /**
+        * Returns if the list contains the site with the provided site id.
+        *
+        * @param integer $id
+        *
+        * @return boolean
+        */
+       public function hasInternalId( $id );
+
+       /**
+        * Returns the Site with the provided site id.
+        * The site needs to exist, so if not sure, call has first.
+        *
+        * @since 1.21
+        *
+        * @param integer $id
+        *
+        * @return Site
+        */
+       public function getSiteByInternalId( $id );
+
+       /**
+        * Removes the site with the specified site id.
+        * The site needs to exist, so if not sure, call has first.
+        *
+        * @since 1.21
+        *
+        * @param integer $id
+        */
+       public function removeSiteByInternalId( $id );
+
+       /**
+        * Sets a site in the list. If the site was not there,
+        * it will be added. If it was, it will be updated.
+        *
+        * @since 1.21
+        *
+        * @param Site $site
+        */
+       public function setSite( Site $site );
+
+       /**
+        * Returns if the site list contains no sites.
+        *
+        * @since 1.21
+        *
+        * @return boolean
+        */
+       public function isEmpty();
+
+}
\ No newline at end of file
diff --git a/includes/site/SiteObject.php b/includes/site/SiteObject.php
new file mode 100644 (file)
index 0000000..78c942b
--- /dev/null
@@ -0,0 +1,569 @@
+<?php
+
+/**
+ * Class representing a single 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ * @author Daniel Werner
+ */
+class SiteObject extends ORMRow implements Site {
+
+       const PATH_LINK = 'link';
+
+       /**
+        * Holds the local ids for this site.
+        * You can obtain them via @see getLocalIds
+        *
+        * @since 1.21
+        *
+        * @var array|false
+        */
+       protected $localIds = false;
+
+       /**
+        * @see Site::getGlobalId
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getGlobalId() {
+               return $this->getField( 'global_key' );
+       }
+
+       /**
+        * @see Site::setGlobalId
+        *
+        * @since 1.21
+        *
+        * @param string $globalId
+        */
+       public function setGlobalId( $globalId ) {
+               $this->setField( 'global_key', $globalId );
+       }
+
+       /**
+        * @see Site::getType
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getType() {
+               return $this->getField( 'type' );
+       }
+
+       /**
+        * @see Site::setType
+        *
+        * @since 1.21
+        *
+        * @param string $type
+        */
+       public function setType( $type ) {
+               $this->setField( 'type', $type );
+       }
+
+       /**
+        * @see Site::getGroup
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getGroup() {
+               return $this->getField( 'group' );
+       }
+
+       /**
+        * @see Site::setGroup
+        *
+        * @since 1.21
+        *
+        * @param string $group
+        */
+       public function setGroup( $group ) {
+               $this->setField( 'group', $group );
+       }
+
+       /**
+        * @see Site::getSource
+        *
+        * @since 1.21
+        *
+        * @return string
+        */
+       public function getSource() {
+               return $this->getField( 'source' );
+       }
+
+       /**
+        * @see Site::setSource
+        *
+        * @since 1.21
+        *
+        * @param string $source
+        */
+       public function setSource( $source ) {
+               $this->setField( 'source', $source );
+       }
+
+       /**
+        * @see Site::getDomain
+        *
+        * @since 1.21
+        *
+        * @return string|false
+        */
+       public function getDomain() {
+               $path = $this->getLinkPath();
+
+               if ( $path === false ) {
+                       return false;
+               }
+
+               return parse_url( $path, PHP_URL_HOST );
+       }
+
+       /**
+        * @see Site::getProtocol
+        *
+        * @since 1.21
+        *
+        * @return string|false
+        */
+       public function getProtocol() {
+               $path = $this->getLinkPath();
+
+               if ( $path === false ) {
+                       return '';
+               }
+
+               $protocol = parse_url( $path, PHP_URL_SCHEME );
+
+               // Malformed URL
+               if ( $protocol === false ) {
+                       throw new MWException( "failed to parse URL $path" );
+               }
+
+               // No schema
+               if ( $protocol === null ) {
+                       // Used for protocol relative URLs
+                       $protocol = '';
+               }
+
+               return $protocol;
+       }
+
+       /**
+        * Sets the path used to construct links with.
+        * @see Site::setLinkPath
+        *
+        * @param string $fullUrl
+        *
+        * @since 1.21
+        *
+        * @throws MWException
+        */
+       public function setLinkPath( $fullUrl ) {
+               $type = $this->getLinkPathType();
+
+               if ( $type === false ) {
+                       throw new MWException( "This SiteObject does not support link paths." );
+               }
+
+               $this->setPath( $type, $fullUrl );
+       }
+
+       /**
+        * Returns the path path used to construct links with or false if there is no such path.
+        *
+        * @see Site::getLinkPath
+        *
+        * @return string|false
+        */
+       public function getLinkPath() {
+               $type = $this->getLinkPathType();
+               return $type === false ? false : $this->getPath( $type );
+       }
+
+       /**
+        * @see Site::getLinkPathType
+        *
+        * Returns the main path type, that is the type of the path that should generally be used to construct links
+        * to the target site.
+        *
+        * This default implementation returns SiteObject::PATH_LINK as the default path type. Subclasses can override this
+        * to define a different default path type, or return false to disable site links.
+        *
+        * @since 1.21
+        *
+        * @return string|false
+        */
+       public function getLinkPathType() {
+               return self::PATH_LINK;
+       }
+
+       /**
+        * @see Site::getPageUrl
+        *
+        * This implementation returns a URL constructed using the path returned by getLinkPath().
+        *
+        * @since 1.21
+        *
+        * @param bool|String $pageName
+        *
+        * @return string|false
+        */
+       public function getPageUrl( $pageName = false ) {
+               $url = $this->getLinkPath();
+
+               if ( $url === false ) {
+                       return false;
+               }
+
+               if ( $pageName !== false ) {
+                       $url = str_replace( '$1', rawurlencode( $pageName ), $url ) ;
+               }
+
+               return $url;
+       }
+
+       /**
+        * Returns $pageName without changes.
+        * Subclasses may override this to apply some kind of normalization.
+        *
+        * @see Site::normalizePageName
+        *
+        * @since 1.21
+        *
+        * @param string $pageName
+        *
+        * @return string
+        */
+       public function normalizePageName( $pageName ) {
+               return $pageName;
+       }
+
+       /**
+        * Returns the value of a type specific field, or the value
+        * of the $default parameter in case it's not set.
+        *
+        * @since 1.21
+        *
+        * @param string $fieldName
+        * @param mixed $default
+        *
+        * @return array
+        */
+       protected function getExtraData( $fieldName, $default = null ) {
+               $data = $this->getField( 'data', array() );
+               return array_key_exists( $fieldName,$data ) ? $data[$fieldName] : $default;
+       }
+
+       /**
+        * Sets the value of a type specific field.
+        * @since 1.21
+        *
+        * @param string $fieldName
+        * @param mixed $value
+        */
+       protected function setExtraData( $fieldName, $value = null ) {
+               $data = $this->getField( 'data', array() );
+               $data[$fieldName] = $value;
+               $this->setField( 'data', $data );
+       }
+
+       /**
+        * @see Site::getLanguageCode
+        *
+        * @since 1.21
+        *
+        * @return string|false
+        */
+       public function getLanguageCode() {
+               return $this->getField( 'language', false );
+       }
+
+       /**
+        * @see Site::setLanguageCode
+        *
+        * @since 1.21
+        *
+        * @param string $languageCode
+        */
+       public function setLanguageCode( $languageCode ) {
+               $this->setField( 'language', $languageCode );
+       }
+
+       /**
+        * Returns the local identifiers of this site.
+        *
+        * @since 1.21
+        *
+        * @param string $type
+        *
+        * @return array
+        */
+       protected function getLocalIds( $type ) {
+               if ( $this->localIds === false ) {
+                       $this->loadLocalIds();
+               }
+
+               return array_key_exists( $type, $this->localIds ) ? $this->localIds[$type] : array();
+       }
+
+       /**
+        * Loads the local ids for the site.
+        *
+        * @since 1.21
+        */
+       protected function loadLocalIds() {
+               $dbr = wfGetDB( $this->getTable()->getReadDb() );
+
+               $ids = $dbr->select(
+                       'site_identifiers',
+                       array(
+                               'si_type',
+                               'si_key',
+                       ),
+                       array(
+                               'si_site' => $this->getId(),
+                       ),
+                       __METHOD__
+               );
+
+               $this->localIds = array();
+
+               foreach ( $ids as $id ) {
+                       $this->addLocalId( $id->si_type, $id->si_key );
+               }
+       }
+
+       /**
+        * Adds a local identifier.
+        *
+        * @since 1.21
+        *
+        * @param string $type
+        * @param string $identifier
+        */
+       public function addLocalId( $type, $identifier ) {
+               if ( $this->localIds === false ) {
+                       $this->localIds = array();
+               }
+
+               if ( !array_key_exists( $type, $this->localIds ) ) {
+                       $this->localIds[$type] = array();
+               }
+
+               if ( !in_array( $identifier, $this->localIds[$type] ) ) {
+                       $this->localIds[$type][] = $identifier;
+               }
+       }
+
+       /**
+        * @see Site::addInterwikiId
+        *
+        * @since 1.21
+        *
+        * @param string $identifier
+        */
+       public function addInterwikiId( $identifier ) {
+               $this->addLocalId( 'interwiki', $identifier );
+       }
+
+       /**
+        * @see Site::addNavigationId
+        *
+        * @since 1.21
+        *
+        * @param string $identifier
+        */
+       public function addNavigationId( $identifier ) {
+               $this->addLocalId( 'equivalent', $identifier );
+       }
+
+       /**
+        * @see Site::getInterwikiIds
+        *
+        * @since 1.21
+        *
+        * @return array of string
+        */
+       public function getInterwikiIds() {
+               return $this->getLocalIds( 'interwiki' );
+       }
+
+       /**
+        * @see Site::getNavigationIds
+        *
+        * @since 1.21
+        *
+        * @return array of string
+        */
+       public function getNavigationIds() {
+               return $this->getLocalIds( 'equivalent' );
+       }
+
+       /**
+        * @see Site::getInternalId
+        *
+        * @since 1.21
+        *
+        * @return integer
+        */
+       public function getInternalId() {
+               return $this->getId();
+       }
+
+       /**
+        * @see IORMRow::save
+        * @see Site::save
+        *
+        * @since 1.21
+        *
+        * @param string|null $functionName
+        *
+        * @return boolean Success indicator
+        */
+       public function save( $functionName = null ) {
+               $dbw = $this->table->getWriteDbConnection();
+
+               $trx = $dbw->trxLevel();
+
+               if ( $trx == 0 ) {
+                       $dbw->begin( __METHOD__ );
+               }
+
+               $this->setField( 'protocol', $this->getProtocol() );
+               $this->setField( 'domain', strrev( $this->getDomain() ) . '.' );
+
+               $existedAlready = $this->hasIdField();
+
+               $success = parent::save( $functionName );
+
+               if ( $success && $existedAlready ) {
+                       $dbw->delete(
+                               'site_identifiers',
+                               array( 'si_site' => $this->getId() ),
+                               __METHOD__
+                       );
+               }
+
+               if ( $success && $this->localIds !== false ) {
+                       foreach ( $this->localIds as $type => $ids ) {
+                               foreach ( $ids as $id ) {
+                                       $dbw->insert(
+                                               'site_identifiers',
+                                               array(
+                                                       'si_site' => $this->getId(),
+                                                       'si_type' => $type,
+                                                       'si_key' => $id,
+                                               ),
+                                               __METHOD__
+                                       );
+                               }
+                       }
+               }
+
+               if ( $trx == 0 ) {
+                       $dbw->commit( __METHOD__ );
+               }
+
+               return $success;
+       }
+
+       /**
+        * @since 1.21
+        *
+        * @see ORMRow::onRemoved
+        */
+       protected function onRemoved() {
+               $dbw = $this->table->getWriteDbConnection();
+
+               $dbw->delete(
+                       'site_identifiers',
+                       array(
+                               'si_site' => $this->getId()
+                       ),
+                       __METHOD__
+               );
+
+               parent::onRemoved();
+       }
+
+       /**
+        * @see Site::setPath
+        *
+        * @since 1.21
+        *
+        * @param string $pathType
+        * @param string $fullUrl
+        */
+       public function setPath( $pathType, $fullUrl ) {
+               $paths = $this->getExtraData( 'paths', array() );
+               $paths[$pathType] = $fullUrl;
+               $this->setExtraData( 'paths', $paths );
+       }
+
+       /**
+        * @see Sitres::getPath
+        *
+        * @since 1.21
+        *
+        * @param string $pathType
+        *
+        * @return string|false
+        */
+       public function getPath( $pathType ) {
+               $paths = $this->getExtraData( 'paths', array() );
+               return array_key_exists( $pathType, $paths ) ? $paths[$pathType] : false;
+       }
+
+       /**
+        * @see Sitres::getAll
+        *
+        * @since 1.21
+        *
+        * @return array of string
+        */
+       public function getAllPaths() {
+               return $this->getExtraData( 'paths', array() );
+       }
+
+       /**
+        * @see Sitres::removePath
+        *
+        * @since 1.21
+        *
+        * @param string $pathType
+        */
+       public function removePath( $pathType ) {
+               $paths = $this->getExtraData( 'paths', array() );
+               unset( $paths[$pathType] );
+               $this->setExtraData( 'paths', $paths );
+       }
+
+}
diff --git a/includes/site/Sites.php b/includes/site/Sites.php
new file mode 100644 (file)
index 0000000..56d567e
--- /dev/null
@@ -0,0 +1,194 @@
+<?php
+
+/**
+ * Represents the site configuration of a wiki.
+ * Holds a list of sites (ie SiteList) and takes care
+ * of retrieving and caching site information when appropriate.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class Sites {
+
+       /**
+        * @since 1.21
+        * @var SiteList|false
+        */
+       protected $sites = false;
+
+       /**
+        * Constructor.
+        *
+        * @since 1.21
+        */
+       protected function __construct() {}
+
+       /**
+        * Returns an instance of Sites.
+        *
+        * @since 1.21
+        *
+        * @return Sites
+        */
+       public static function singleton() {
+               static $instance = false;
+
+               if ( $instance === false ) {
+                       $instance = new static();
+               }
+
+               return $instance;
+       }
+
+       /**
+        * Factory for creating new site objects.
+        *
+        * @since 1.21
+        *
+        * @param string|false $globalId
+        *
+        * @return Site
+        */
+       public static function newSite( $globalId = false ) {
+               /**
+                * @var Site $site
+                */
+               $site = SitesTable::singleton()->newRow( array(), true );
+
+               if ( $globalId !== false ) {
+                       $site->setGlobalId( $globalId );
+               }
+
+               return $site;
+       }
+
+       /**
+        * Returns a list of all sites. By default this site is
+        * fetched from the cache, which can be changed to loading
+        * the list from the database using the $useCache parameter.
+        *
+        * @since 1.21
+        *
+        * @param string $source either 'cache' or 'recache'
+        *
+        * @return SiteList
+        */
+       public function getSites( $source = 'cache' ) {
+               if ( $source === 'cache' ) {
+                       if ( $this->sites === false ) {
+                               $cache = wfGetMainCache();
+                               $sites = $cache->get( 'sites-cache' );
+
+                               if ( is_object( $sites ) ) {
+                                       $this->sites = $sites;
+                               }
+                               else {
+                                       $this->loadSites();
+                               }
+                       }
+               }
+               else {
+                       $this->loadSites();
+               }
+
+               return $this->sites;
+       }
+
+       /**
+        * Returns a list of sites in the given group. Calling getGroup() on any of
+        * the sites in the resulting SiteList shall return $group.
+        *
+        * @since 1.21
+        *
+        * @param string $group th group to get.
+        *
+        * @return SiteList
+        */
+       public function getSiteGroup( $group ) {
+               $sites = self::getSites();
+
+               $siteGroup = new SiteArray();
+
+               /* @var Site $site */
+               foreach ( $sites as $site ) {
+                       if ( $site->getGroup() == $group ) {
+                               $siteGroup->append( $site );
+                       }
+               }
+
+               return $siteGroup;
+       }
+
+       /**
+        * Fetches the site from the database and loads them into the sites field.
+        *
+        * @since 1.21
+        */
+       protected function loadSites() {
+               $this->sites = new SiteArray( SitesTable::singleton()->select() );
+
+               // Batch load the local site identifiers.
+               $dbr = wfGetDB( SitesTable::singleton()->getReadDb() );
+
+               $ids = $dbr->select(
+                       'site_identifiers',
+                       array(
+                               'si_site',
+                               'si_type',
+                               'si_key',
+                       ),
+                       array(),
+                       __METHOD__
+               );
+
+               foreach ( $ids as $id ) {
+                       if ( $this->sites->hasInternalId( $id->si_site ) ) {
+                               $site = $this->sites->getSiteByInternalId( $id->si_site );
+                               $site->addLocalId( $id->si_type, $id->si_key );
+                               $this->sites->setSite( $site );
+                       }
+               }
+
+               $cache = wfGetMainCache();
+               $cache->set( 'sites-cache', $this->sites );
+       }
+
+       /**
+        * Returns the site with provided global id, or false if there is no such site.
+        *
+        * @since 1.21
+        *
+        * @param string $globalId
+        * @param string $source
+        *
+        * @return Site|false
+        */
+       public function getSite( $globalId, $source = 'cache' ) {
+               if ( $source === 'cache' && $this->sites !== false ) {
+                       return $this->sites->hasSite( $globalId ) ? $this->sites->getSite( $globalId ) : false;
+               }
+
+               return SitesTable::singleton()->selectRow( null, array( 'global_key' => $globalId ) );
+       }
+
+}
diff --git a/includes/site/SitesTable.php b/includes/site/SitesTable.php
new file mode 100644 (file)
index 0000000..bb12740
--- /dev/null
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * Represents the sites database table.
+ * All access to this table should be done through this class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @since 1.21
+ *
+ * @file
+ * @ingroup Site
+ *
+ * @license GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SitesTable extends ORMTable {
+
+       /**
+        * @see IORMTable::getName()
+        * @since 1.21
+        * @return string
+        */
+       public function getName() {
+               return 'sites';
+       }
+
+       /**
+        * @see IORMTable::getFieldPrefix()
+        * @since 1.21
+        * @return string
+        */
+       public function getFieldPrefix() {
+               return 'site_';
+       }
+
+       /**
+        * @see IORMTable::getRowClass()
+        * @since 1.21
+        * @return string
+        */
+       public function getRowClass() {
+               return 'SiteObject';
+       }
+
+       /**
+        * @see IORMTable::getFields()
+        * @since 1.21
+        * @return array
+        */
+       public function getFields() {
+               return array(
+                       'id' => 'id',
+
+                       // Site data
+                       'global_key' => 'str',
+                       'type' => 'str',
+                       'group' => 'str',
+                       'source' => 'str',
+                       'language' => 'str',
+                       'protocol' => 'str',
+                       'domain' => 'str',
+                       'data' => 'array',
+
+                       // Site config
+                       'forward' => 'bool',
+                       'config' => 'array',
+               );
+       }
+
+       /**
+        * @see IORMTable::getDefaults()
+        * @since 1.21
+        * @return array
+        */
+       public function getDefaults() {
+               return array(
+                       'type' => Site::TYPE_UNKNOWN,
+                       'group' => Site::GROUP_NONE,
+                       'source' => Site::SOURCE_LOCAL,
+                       'data' => array(),
+
+                       'forward' => false,
+                       'config' => array(),
+                       'language' => 'en', // XXX: can we default to '' instead?
+               );
+       }
+
+       /**
+        * Returns the class name for the provided site type.
+        *
+        * @since 1.21
+        *
+        * @param integer $siteType
+        *
+        * @return string
+        */
+       protected static function getClassForType( $siteType ) {
+               global $wgSiteTypes;
+               return array_key_exists( $siteType, $wgSiteTypes ) ? $wgSiteTypes[$siteType] : 'SiteObject';
+       }
+
+       /**
+        * Factory method to construct a new Site instance.
+        *
+        * @since 1.21
+        *
+        * @param array $data
+        * @param boolean $loadDefaults
+        *
+        * @return Site
+        */
+       public function newRow( array $data, $loadDefaults = false ) {
+               if ( !array_key_exists( 'type', $data ) ) {
+                       $data['type'] = Site::TYPE_UNKNOWN;
+               }
+
+               $class = static::getClassForType( $data['type'] );
+
+               return new $class( $this, $data, $loadDefaults );
+       }
+
+}
\ No newline at end of file
index c5aa238..994365e 100644 (file)
@@ -93,7 +93,9 @@ class ActiveUsersPager extends UsersPager {
        function getQueryInfo() {
                $dbr = wfGetDB( DB_SLAVE );
                $conds = array( 'rc_user > 0' ); // Users - no anons
-               $conds[] = 'ipb_deleted IS NULL'; // don't show hidden names
+               if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
+                       $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0'; // don't show hidden names
+               }
                $conds[] = 'rc_log_type IS NULL OR rc_log_type != ' . $dbr->addQuotes( 'newusers' );
                $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes( $dbr->timestamp( wfTimestamp( TS_UNIX ) - $this->RCMaxAge*24*3600 ) );
 
@@ -107,7 +109,7 @@ class ActiveUsersPager extends UsersPager {
                                'rc_user_text', // for Pager
                                'user_id',
                                'recentedits' => 'COUNT(*)',
-                               'blocked' => 'MAX(ipb_user)'
+                               'ipb_deleted' => 'MAX(ipb_deleted)'
                        ),
                        'options' => array(
                                'GROUP BY' => array( 'rc_user_text', 'user_id' ),
@@ -117,8 +119,7 @@ class ActiveUsersPager extends UsersPager {
                                'user' => array( 'INNER JOIN', 'rc_user_text=user_name' ),
                                'ipblocks' => array( 'LEFT JOIN', array(
                                        'user_id=ipb_user',
-                                       'ipb_auto' => 0,
-                                       'ipb_deleted' => 1
+                                       'ipb_auto' => 0
                                )),
                        ),
                        'conds' => $conds
@@ -162,9 +163,12 @@ class ActiveUsersPager extends UsersPager {
                $groups = $lang->commaList( $list );
 
                $item = $lang->specialList( $ulinks, $groups );
+               if( $row->ipb_deleted ) {
+                       $item = "<span class=\"deleted\">$item</span>";
+               }
                $count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
                        ->params( $userName )->numParams( $this->RCMaxAge )->escaped();
-               $blocked = $row->blocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
+               $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
 
                return Html::rawElement( 'li', array(), "{$item} [{$count}]{$blocked}" );
        }
index 1d6656a..aae1b34 100644 (file)
@@ -507,53 +507,74 @@ class SpecialBlock extends FormSpecialPage {
         * @return Message
         */
        public static function validateTargetField( $value, $alldata, $form ) {
+               $status = self::validateTarget( $value, $form->getUser() );
+               if ( !$status->isOK() ) {
+                       $errors = $status->getErrorsArray();
+                       return call_user_func_array( array( $form, 'msg' ), $errors[0] );
+               } else {
+                       return true;
+               }
+       }
+
+       /**
+        * Validate a block target.
+        *
+        * @since 1.21
+        * @param String $value Block target to check
+        * @param User $user Performer of the block
+        * @return Status
+        */
+       public static function validateTarget( $value, User $user ) {
                global $wgBlockCIDRLimit;
 
                list( $target, $type ) = self::getTargetAndType( $value );
+               $status = Status::newGood( $target );
 
                if ( $type == Block::TYPE_USER ) {
-                       # TODO: why do we not have a User->exists() method?
-                       if ( !$target->getId() ) {
-                               return $form->msg( 'nosuchusershort',
-                                       wfEscapeWikiText( $target->getName() ) );
+                       if ( $target->isAnon() ) {
+                               $status->fatal(
+                                       'nosuchusershort',
+                                       wfEscapeWikiText( $target->getName() )
+                               );
                        }
 
-                       $status = self::checkUnblockSelf( $target, $form->getUser() );
-                       if ( $status !== true ) {
-                               return $form->msg( 'badaccess', $status );
+                       $unblockStatus = self::checkUnblockSelf( $target, $user );
+                       if ( $unblockStatus !== true ) {
+                               $status->fatal( 'badaccess', $unblockStatus );
                        }
-
                } elseif ( $type == Block::TYPE_RANGE ) {
                        list( $ip, $range ) = explode( '/', $target, 2 );
 
-                       if ( ( IP::isIPv4( $ip ) && $wgBlockCIDRLimit['IPv4'] == 32 )
-                               || ( IP::isIPv6( $ip ) && $wgBlockCIDRLimit['IPv6'] == 128 ) )
-                       {
-                               # Range block effectively disabled
-                               return $form->msg( 'range_block_disabled' );
+                       if (
+                               ( IP::isIPv4( $ip ) && $wgBlockCIDRLimit['IPv4'] == 32 ) ||
+                               ( IP::isIPv6( $ip ) && $wgBlockCIDRLimit['IPv6'] == 128 )
+                       ) {
+                               // Range block effectively disabled
+                               $status->fatal( 'range_block_disabled' );
                        }
 
-                       if ( ( IP::isIPv4( $ip ) && $range > 32 )
-                               || ( IP::isIPv6( $ip ) && $range > 128 ) )
-                       {
-                               # Dodgy range
-                               return $form->msg( 'ip_range_invalid' );
+                       if (
+                               ( IP::isIPv4( $ip ) && $range > 32 ) ||
+                               ( IP::isIPv6( $ip ) && $range > 128 )
+                       ) {
+                               // Dodgy range
+                               $status->fatal( 'ip_range_invalid' );
                        }
 
                        if ( IP::isIPv4( $ip ) && $range < $wgBlockCIDRLimit['IPv4'] ) {
-                               return $form->msg( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv4'] );
+                               $status->fatal( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv4'] );
                        }
 
                        if ( IP::isIPv6( $ip ) && $range < $wgBlockCIDRLimit['IPv6'] ) {
-                               return $form->msg( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv6'] );
+                               $status->fatal( 'ip_range_toolarge', $wgBlockCIDRLimit['IPv6'] );
                        }
                } elseif ( $type == Block::TYPE_IP ) {
                        # All is well
                } else {
-                       return $form->msg( 'badipaddress' );
+                       $status->fatal( 'badipaddress' );
                }
 
-               return true;
+               return $status;
        }
 
        /**
index 7143d5b..d740082 100644 (file)
@@ -329,7 +329,7 @@ class BlockListPager extends TablePager {
                                break;
 
                        case 'ipb_reason':
-                               $formatted = Linker::commentBlock( $value );
+                               $formatted = Linker::formatComment( $value );
                                break;
 
                        case 'ipb_params':
@@ -441,7 +441,7 @@ class BlockListPager extends TablePager {
                        $name = str_replace( ' ', '_', $user->getName() );
                        $lb->add( NS_USER, $name );
                        $lb->add( NS_USER_TALK, $name );
-               } 
+               }
 
                $lb->execute();
                wfProfileOut( __METHOD__ );
index bf7de3f..8e528dc 100644 (file)
@@ -63,7 +63,7 @@ class SpecialBookSources extends SpecialPage {
 
        /**
         * Returns whether a given ISBN (10 or 13) is valid.  True indicates validity.
-        * @param isbn string ISBN passed for check
+        * @param $isbn string ISBN passed for check
         * @return bool
         */
        public static function isValidISBN( $isbn ) {
@@ -144,8 +144,17 @@ class SpecialBookSources extends SpecialPage {
                $title = Title::makeTitleSafe( NS_PROJECT, $page ); # Show list in content language
                if( is_object( $title ) && $title->exists() ) {
                        $rev = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
-                       $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $rev->getText() ) );
-                       return true;
+                       $content = $rev->getContent();
+
+                       if ( $content instanceof TextContent ) {
+                               //XXX: in the future, this could be stored as structured data, defining a list of book sources
+
+                               $text = $content->getNativeData();
+                               $this->getOutput()->addWikiText( str_replace( 'MAGICNUMBER', $this->isbn, $text ) );
+                               return true;
+                       } else {
+                               throw new MWException( "Unexpected content type for book sources: " . $content->getModel() );
+                       }
                }
 
                # Fall back to the defaults given in the language file
index 9fa499c..97de72a 100644 (file)
@@ -51,25 +51,35 @@ class BrokenRedirectsPage extends QueryPage {
 
        function getQueryInfo() {
                return array(
-                       'tables' => array( 'redirect', 'p1' => 'page',
-                                       'p2' => 'page' ),
-                       'fields' => array( 'namespace' => 'p1.page_namespace',
-                                       'title' => 'p1.page_title',
-                                       'value' => 'p1.page_title',
-                                       'rd_namespace',
-                                       'rd_title'
+                       'tables' => array(
+                               'redirect',
+                               'p1' => 'page',
+                               'p2' => 'page',
                        ),
-                       'conds' => array( 'rd_namespace >= 0',
-                                       'p2.page_namespace IS NULL'
+                       'fields' => array(
+                               'namespace' => 'p1.page_namespace',
+                               'title' => 'p1.page_title',
+                               'value' => 'p1.page_title',
+                               'rd_namespace',
+                               'rd_title',
+                       ),
+                       'conds' => array(
+                               // Exclude pages that don't exist locally as wiki pages,
+                               // but aren't "broken" either.
+                               // Special pages and interwiki links
+                               'rd_namespace >= 0',
+                               '(rd_interwiki IS NULL OR rd_interwiki = "")',
+                               'p2.page_namespace IS NULL',
+                       ),
+                       'join_conds' => array(
+                               'p1' => array( 'JOIN', array(
+                                       'rd_from=p1.page_id',
+                               ) ),
+                               'p2' => array( 'LEFT JOIN', array(
+                                       'rd_namespace=p2.page_namespace',
+                                       'rd_title=p2.page_title'
+                               ) ),
                        ),
-                       'join_conds' => array( 'p1' => array( 'JOIN', array(
-                                               'rd_from=p1.page_id',
-                                       ) ),
-                                       'p2' => array( 'LEFT JOIN', array(
-                                               'rd_namespace=p2.page_namespace',
-                                               'rd_title=p2.page_title'
-                                       ) )
-                       )
                );
        }
 
index b3f6c72..ddd11ad 100644 (file)
@@ -119,7 +119,7 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param {function} $computeFunction
+        * @param callable $computeFunction
         * @param array|mixed $args
         * @param string|null $key
         *
@@ -137,7 +137,7 @@ abstract class SpecialCachedPage extends SpecialPage implements ICacheHelper {
         *
         * @since 1.20
         *
-        * @param {function} $computeFunction
+        * @param callable $computeFunction
         * @param array $args
         * @param string|null $key
         */
index 0996de3..99d2ebf 100644 (file)
@@ -213,6 +213,8 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
         * @return bool|string true or string on success, false on failure
         */
        protected function attemptChange( User $user, $pass, $newaddr ) {
+               global $wgAuth;
+
                if ( $newaddr != '' && !Sanitizer::validateEmail( $newaddr ) ) {
                        $this->error( 'invalidemailaddress' );
                        return false;
@@ -248,6 +250,8 @@ class SpecialChangeEmail extends UnlistedSpecialPage {
 
                $user->saveSettings();
 
+               $wgAuth->updateExternalDB( $user );
+
                return $status->value;
        }
 }
index 41b3b25..54a2771 100644 (file)
@@ -27,6 +27,9 @@
  * @ingroup SpecialPage
  */
 class SpecialChangePassword extends UnlistedSpecialPage {
+
+       protected $mUserName, $mOldpass, $mNewpass, $mRetype, $mDomain;
+
        public function __construct() {
                parent::__construct( 'ChangePassword' );
        }
@@ -105,6 +108,9 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                $this->getOutput()->redirect( $titleObj->getFullURL() );
        }
 
+       /**
+        * @param $msg string
+        */
        function error( $msg ) {
                $this->getOutput()->addHTML( Xml::element('p', array( 'class' => 'error' ), $msg ) );
        }
@@ -170,6 +176,10 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                );
        }
 
+       /**
+        * @param $fields array
+        * @return string
+        */
        function pretty( $fields ) {
                $out = '';
                foreach ( $fields as $list ) {
@@ -234,7 +244,7 @@ class SpecialChangePassword extends UnlistedSpecialPage {
                try {
                        $user->setPassword( $this->mNewpass );
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'success' ) );
-                       $this->mNewpass = $this->mOldpass = $this->mRetypePass = '';
+                       $this->mNewpass = $this->mOldpass = $this->mRetype = '';
                } catch( PasswordError $e ) {
                        wfRunHooks( 'PrefsPasswordAudit', array( $user, $newpass, 'error' ) );
                        throw new PasswordError( $e->getMessage() );
index 9e3c52b..2b7036c 100644 (file)
@@ -111,14 +111,19 @@ class SpecialComparePages extends SpecialPage {
                $rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] );
 
                if( $rev1 && $rev2 ) {
-                       $de = new DifferenceEngine( $form->getContext(),
-                               $rev1,
-                               $rev2,
-                               null, // rcid
-                               ( $data['Action'] == 'purge' ),
-                               ( $data['Unhide'] == '1' )
-                       );
-                       $de->showDiffPage( true );
+                       $revision = Revision::newFromId( $rev1 );
+
+                       if ( $revision ) { // NOTE: $rev1 was already checked, should exist.
+                               $contentHandler = $revision->getContentHandler();
+                               $de = $contentHandler->createDifferenceEngine( $form->getContext(),
+                                       $rev1,
+                                       $rev2,
+                                       null, // rcid
+                                       ( $data['Action'] == 'purge' ),
+                                       ( $data['Unhide'] == '1' )
+                               );
+                               $de->showDiffPage( true );
+                       }
                }
        }
 
index 54f8e26..c58d4da 100644 (file)
@@ -399,7 +399,7 @@ class SpecialContributions extends SpecialPage {
                        $this->opts['topOnly'] = false;
                }
 
-               $form = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
+               $form = Html::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript, 'class' => 'mw-contributions-form' ) );
 
                # Add hidden params for tracking except for parameters in $skipParameters
                $skipParameters = array( 'namespace', 'nsInvert', 'deletedOnly', 'target', 'contribs', 'year', 'month', 'topOnly', 'associated' );
@@ -414,13 +414,13 @@ class SpecialContributions extends SpecialPage {
 
                if ( $tagFilter ) {
                        $filterSelection =
-                               Xml::tags( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
-                               Xml::tags( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
+                               Html::rawElement( 'td', array( 'class' => 'mw-label' ), array_shift( $tagFilter ) ) .
+                               Html::rawElement( 'td', array( 'class' => 'mw-input' ), implode( '&#160', $tagFilter ) );
                } else {
-                       $filterSelection = Xml::tags( 'td', array( 'colspan' => 2 ), '' );
+                       $filterSelection = Html::rawElement( 'td', array( 'colspan' => 2 ), '' );
                }
 
-               $targetSelection = Xml::tags( 'td', array( 'colspan' => 2 ),
+               $targetSelection = Html::rawElement( 'td', array( 'colspan' => 2 ),
                        Xml::radioLabel(
                                $this->msg( 'sp-contributions-newbies' )->text(),
                                'contribs',
@@ -455,7 +455,7 @@ class SpecialContributions extends SpecialPage {
                                        ''
                                )
                        ) .
-                       Xml::tags( 'td', null,
+                       Html::rawElement( 'td', null,
                                Html::namespaceSelector( array(
                                        'selected' => $this->opts['namespace'],
                                        'all'      => '',
@@ -485,8 +485,8 @@ class SpecialContributions extends SpecialPage {
                                )
                        ) ;
 
-               $extraOptions = Xml::tags( 'td', array( 'colspan' => 2 ),
-                       Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
+               if ( $this->getUser()->isAllowed( 'deletedhistory' ) ) {
+                       $deletedOnlyCheck = Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
                                Xml::checkLabel(
                                        $this->msg( 'history-show-deleted' )->text(),
                                        'deletedOnly',
@@ -494,7 +494,13 @@ class SpecialContributions extends SpecialPage {
                                        $this->opts['deletedOnly'],
                                        array( 'class' => 'mw-input' )
                                )
-                       ) .
+                       );
+               } else {
+                       $deletedOnlyCheck = '';
+               }
+
+               $extraOptions = Html::rawElement( 'td', array( 'colspan' => 2 ),
+                       $deletedOnlyCheck .
                        Html::rawElement( 'span', array( 'style' => 'white-space: nowrap' ),
                                Xml::checkLabel(
                                        $this->msg( 'sp-contributions-toponly' )->text(),
@@ -504,7 +510,7 @@ class SpecialContributions extends SpecialPage {
                                        array( 'class' => 'mw-input' )
                                )
                        )
-               ) ;
+               );
 
                $dateSelectionAndSubmit = Xml::tags( 'td', array( 'colspan' => 2 ),
                        Xml::dateMenu(
@@ -519,27 +525,17 @@ class SpecialContributions extends SpecialPage {
 
                $form .=
                        Xml::fieldset( $this->msg( 'sp-contributions-search' )->text() ) .
-                       Xml::openElement( 'table', array( 'class' => 'mw-contributions-table' ) ) .
-                               Xml::openElement( 'tr' ) .
-                                       $targetSelection .
-                               Xml::closeElement( 'tr' ) .
-                               Xml::openElement( 'tr' ) .
-                                       $namespaceSelection .
-                               Xml::closeElement( 'tr' ) .
-                               Xml::openElement( 'tr' ) .
-                                       $filterSelection .
-                               Xml::closeElement( 'tr' ) .
-                               Xml::openElement( 'tr' ) .
-                                       $extraOptions .
-                               Xml::closeElement( 'tr' ) .
-                               Xml::openElement( 'tr' ) .
-                                       $dateSelectionAndSubmit .
-                               Xml::closeElement( 'tr' ) .
-                       Xml::closeElement( 'table' );
+                       Html::rawElement( 'table', array( 'class' => 'mw-contributions-table' ), "\n" .
+                               Html::rawElement( 'tr', array(), $targetSelection ) . "\n" .
+                               Html::rawElement( 'tr', array(), $namespaceSelection ) . "\n" .
+                               Html::rawElement( 'tr', array(), $filterSelection ) . "\n" .
+                               Html::rawElement( 'tr', array(), $extraOptions ) . "\n" .
+                               Html::rawElement( 'tr', array(), $dateSelectionAndSubmit ) . "\n"
+                       );
 
                $explain = $this->msg( 'sp-contributions-explain' );
-               if ( $explain->exists() ) {
-                       $form .= "<p id='mw-sp-contributions-explain'>{$explain}</p>";
+               if ( !$explain->isBlank() ) {
+                       $form .= "<p id='mw-sp-contributions-explain'>{$explain->parse()}</p>";
                }
                $form .= Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' );
index c880b61..bdeb7fe 100644 (file)
@@ -135,7 +135,10 @@ class DeletedContribsPager extends IndexPager {
        function formatRow( $row ) {
                wfProfileIn( __METHOD__ );
 
+               $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
+
                $rev = new Revision( array(
+                               'title'      => $page,
                                'id'         => $row->ar_rev_id,
                                'comment'    => $row->ar_comment,
                                'user'       => $row->ar_user,
@@ -145,8 +148,6 @@ class DeletedContribsPager extends IndexPager {
                                'deleted'    => $row->ar_deleted,
                                ) );
 
-               $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
-
                $undelete = SpecialPage::getTitleFor( 'Undelete' );
 
                $logs = SpecialPage::getTitleFor( 'Log' );
@@ -260,7 +261,7 @@ class DeletedContributionsPage extends SpecialPage {
         * Special page "deleted user contributions".
         * Shows a list of the deleted contributions of a user.
         *
-        * @param       $par    String: (optional) user name of the user for which to show the contributions
+        * @param $par String: (optional) user name of the user for which to show the contributions
         */
        function execute( $par ) {
                global $wgQueryPageDefaultLimit;
index 8ecc871..ee07323 100644 (file)
@@ -52,22 +52,43 @@ class DoubleRedirectsPage extends QueryPage {
        function reallyGetQueryInfo( $namespace = null, $title = null ) {
                $limitToTitle = !( $namespace === null && $title === null );
                $retval = array (
-                       'tables' => array ( 'ra' => 'redirect',
-                                       'rb' => 'redirect', 'pa' => 'page',
-                                       'pb' => 'page', 'pc' => 'page' ),
-                       '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',
-                                       'rb.rd_from = pb.page_id',
-                                       'pc.page_namespace = rb.rd_namespace',
-                                       'pc.page_title = rb.rd_title' )
+                       'tables' => array (
+                               'ra' => 'redirect',
+                               'rb' => 'redirect',
+                               'pa' => 'page',
+                               'pb' => 'page'
+                       ),
+                       'fields' => array(
+                               'namespace' => 'pa.page_namespace',
+                               'title' => 'pa.page_title',
+                               'value' => 'pa.page_title',
+
+                               'nsb' => 'pb.page_namespace',
+                               'tb' => 'pb.page_title',
+
+                               // Select fields from redirect instead of page. Because there may
+                               // not actually be a page table row for this target (e.g. for interwiki redirects)
+                               'nsc' => 'rb.rd_namespace',
+                               'tc' => 'rb.rd_title',
+                               'iwc' => 'rb.rd_interwiki',
+                       ),
+                       'conds' => array(
+                               'ra.rd_from = pa.page_id',
+
+                               // Filter out redirects where the target goes interwiki (bug 40353).
+                               // This isn't an optimization, it is required for correct results,
+                               // otherwise a non-double redirect like Bar -> w:Foo will show up
+                               // like "Bar -> Foo -> w:Foo".
+
+                               // Need to check both NULL and "" for some reason,
+                               // apparently either can be stored for non-iw entries.
+                               '(ra.rd_interwiki IS NULL OR ra.rd_interwiki = "")',
+
+                               'pb.page_namespace = ra.rd_namespace',
+                               'pb.page_title = ra.rd_title',
+
+                               'rb.rd_from = pb.page_id',
+                       )
                );
                if ( $limitToTitle ) {
                        $retval['conds']['pa.page_namespace'] = $namespace;
@@ -87,6 +108,11 @@ class DoubleRedirectsPage extends QueryPage {
        function formatResult( $skin, $result ) {
                $titleA = Title::makeTitle( $result->namespace, $result->title );
 
+               // If only titleA is in the query, it means this came from
+               // querycache (which only saves 3 columns).
+               // That does save the bulk of the query cost, but now we need to
+               // get a little more detail about each individual entry quickly
+               // using the filter of reallyGetQueryInfo.
                if ( $result && !isset( $result->nsb ) ) {
                        $dbr = wfGetDB( DB_SLAVE );
                        $qi = $this->reallyGetQueryInfo( $result->namespace,
@@ -102,7 +128,7 @@ class DoubleRedirectsPage extends QueryPage {
                }
 
                $titleB = Title::makeTitle( $result->nsb, $result->tb );
-               $titleC = Title::makeTitle( $result->nsc, $result->tc );
+               $titleC = Title::makeTitle( $result->nsc, $result->tc, '',  $result->iwc );
 
                $linkA = Linker::linkKnown(
                        $titleA,
index 4d875e6..9a42c09 100644 (file)
@@ -139,7 +139,8 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                $this->mTargetObj = $ret;
 
                $form = new HTMLForm( $this->getFormFields(), $this->getContext() );
-               $form->addPreText( $this->msg( 'emailpagetext' )->parse() );
+               // By now we are supposed to be sure that $this->mTarget is a user name
+               $form->addPreText( $this->msg( 'emailpagetext', $this->mTarget )->parse() );
                $form->setSubmitTextMsg( 'emailsend' );
                $form->setTitle( $this->getTitle() );
                $form->setSubmitCallback( array( __CLASS__, 'uiSubmit' ) );
index b4294b3..18dde20 100644 (file)
@@ -286,7 +286,7 @@ class SpecialExport extends SpecialPage {
                } else {
 
                        $pageSet = array(); // Inverted index of all pages to look up
-               
+
                        // Split up and normalize input
                        foreach( explode( "\n", $page ) as $pageName ) {
                                $pageName = trim( $pageName );
index c217ecc..84e3cb7 100644 (file)
@@ -40,19 +40,11 @@ class SpecialJavaScriptTest extends SpecialPage {
        }
 
        public function execute( $par ) {
-               global $wgEnableJavaScriptTest;
-
                $out = $this->getOutput();
 
                $this->setHeaders();
                $out->disallowUserJs();
 
-               // Abort early if we're disabled
-               if ( $wgEnableJavaScriptTest !== true ) {
-                       $out->addWikiMsg( 'javascripttest-disabled' );
-                       return;
-               }
-
                $out->addModules( 'mediawiki.special.javaScriptTest' );
 
                // Determine framework
@@ -112,6 +104,7 @@ class SpecialJavaScriptTest extends SpecialPage {
         * be thrown.
         * @param $html String: The raw HTML.
         * @param $state String: State, one of 'noframework', 'unknownframework' or 'frameworkfound'
+        * @throws MWException
         * @return string
         */
        private function wrapSummaryHtml( $html, $state ) {
@@ -164,10 +157,4 @@ HTML;
                // $wgJavaScriptTestConfig in DefaultSettings.php
                $out->addJsConfigVars( 'QUnitTestSwarmInjectJSPath', $wgJavaScriptTestConfig['qunit']['testswarm-injectjs'] );
        }
-
-       public function isListed(){
-               global $wgEnableJavaScriptTest;
-               return $wgEnableJavaScriptTest === true;
-       }
-
 }
index 0810ee7..5de6076 100644 (file)
@@ -103,7 +103,7 @@ class LinkSearchPage extends QueryPage {
                                )
                        );
                }
-               $s .=   Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) .
+               $s .= Xml::submitButton( $this->msg( 'linksearch-ok' )->text() ) .
                        '</fieldset>' .
                        Xml::closeElement( 'form' );
                $out->addHTML( $s );
index cc05522..d459ac6 100644 (file)
@@ -223,7 +223,7 @@ class ImageListPager extends TablePager {
                        case 'img_size':
                                return htmlspecialchars( $this->getLanguage()->formatSize( $value ) );
                        case 'img_description':
-                               return Linker::commentBlock( $value );
+                               return Linker::formatComment( $value );
                        case 'count':
                                return intval( $value ) + 1;
                }
index 331a0e0..ea598c3 100644 (file)
@@ -36,7 +36,9 @@ class UsersPager extends AlphabeticPager {
 
        /**
         * @param $context IContextSource
-        * @param $par null|array
+        * @param $par array (Default null)
+        * @param $including boolean Whether this page is being transcluded in
+        * another page
         */
        function __construct( IContextSource $context = null, $par = null, $including = null ) {
                if ( $context ) {
@@ -89,7 +91,7 @@ class UsersPager extends AlphabeticPager {
                $conds = array();
                // Don't show hidden names
                if( !$this->getUser()->isAllowed( 'hideuser' ) ) {
-                       $conds[] = 'ipb_deleted IS NULL';
+                       $conds[] = 'ipb_deleted IS NULL OR ipb_deleted = 0';
                }
 
                $options = array();
@@ -129,7 +131,6 @@ class UsersPager extends AlphabeticPager {
                                'user_groups' => array( 'LEFT JOIN', 'user_id=ug_user' ),
                                'ipblocks' => array( 'LEFT JOIN', array(
                                        'user_id=ipb_user',
-                                       'ipb_deleted' => 1,
                                        'ipb_auto' => 0
                                )),
                        ),
@@ -152,7 +153,7 @@ class UsersPager extends AlphabeticPager {
                $userName = $row->user_name;
 
                $ulinks = Linker::userLink( $row->user_id, $userName );
-               $ulinks .= Linker::userToolLinks( $row->user_id, $userName );
+               $ulinks .= Linker::userToolLinksRedContribs( $row->user_id, $userName, intval( $row->edits ) );
 
                $lang = $this->getLanguage();
 
@@ -185,9 +186,10 @@ class UsersPager extends AlphabeticPager {
                        $created = $this->msg( 'usercreated', $d, $t, $row->user_name )->escaped();
                        $created = ' ' . $this->msg( 'parentheses' )->rawParams( $created )->escaped();
                }
+               $blocked = !is_null( $row->ipb_deleted ) ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
 
                wfRunHooks( 'SpecialListusersFormatRow', array( &$item, $row ) );
-               return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}" );
+               return Html::rawElement( 'li', array(), "{$item}{$edits}{$created}{$blocked}" );
        }
 
        function doBatchLookups() {
index 1f05749..85e1d65 100644 (file)
@@ -373,26 +373,33 @@ class SpecialMergeHistory extends SpecialPage {
                                        $destTitle->getPrefixedText()
                                )->inContentLanguage()->text();
                        }
-                       $mwRedir = MagicWord::get( 'redirect' );
-                       $redirectText = $mwRedir->getSynonym( 0 ) . ' [[' . $destTitle->getPrefixedText() . "]]\n";
-                       $redirectPage = WikiPage::factory( $targetTitle );
-                       $redirectRevision = new Revision( array(
-                               'page'    => $this->mTargetID,
-                               'comment' => $comment,
-                               'text'    => $redirectText ) );
-                       $redirectRevision->insertOn( $dbw );
-                       $redirectPage->updateRevisionOn( $dbw, $redirectRevision );
-
-                       # Now, we record the link from the redirect to the new title.
-                       # It should have no other outgoing links...
-                       $dbw->delete( 'pagelinks', array( 'pl_from' => $this->mDestID ), __METHOD__ );
-                       $dbw->insert( 'pagelinks',
-                               array(
-                                       'pl_from'      => $this->mDestID,
-                                       'pl_namespace' => $destTitle->getNamespace(),
-                                       'pl_title'     => $destTitle->getDBkey() ),
-                               __METHOD__
-                       );
+
+                       $contentHandler = ContentHandler::getForTitle( $targetTitle );
+                       $redirectContent = $contentHandler->makeRedirectContent( $destTitle );
+
+                       if ( $redirectContent ) {
+                               $redirectPage = WikiPage::factory( $targetTitle );
+                               $redirectRevision = new Revision( array(
+                                       'title'   => $targetTitle,
+                                       'page'    => $this->mTargetID,
+                                       'comment' => $comment,
+                                       'content' => $redirectContent ) );
+                               $redirectRevision->insertOn( $dbw );
+                               $redirectPage->updateRevisionOn( $dbw, $redirectRevision );
+
+                               # Now, we record the link from the redirect to the new title.
+                               # It should have no other outgoing links...
+                               $dbw->delete( 'pagelinks', array( 'pl_from' => $this->mDestID ), __METHOD__ );
+                               $dbw->insert( 'pagelinks',
+                                       array(
+                                               'pl_from'      => $this->mDestID,
+                                               'pl_namespace' => $destTitle->getNamespace(),
+                                               'pl_title'     => $destTitle->getDBkey() ),
+                                       __METHOD__
+                               );
+                       } else {
+                               // would be nice to show a warning if we couldn't create a redirect
+                       }
                } else {
                        $targetTitle->invalidateCache(); // update histories
                }
index af3dbf3..ce2633f 100644 (file)
@@ -464,8 +464,6 @@ class MovePageForm extends UnlistedSpecialPage {
                        DoubleRedirectJob::fixRedirects( 'move', $ot, $nt );
                }
 
-               wfRunHooks( 'SpecialMovepageAfterMove', array( &$this, &$ot, &$nt ) );
-
                $out = $this->getOutput();
                $out->setPageTitle( $this->msg( 'pagemovedsub' ) );
 
@@ -484,6 +482,8 @@ class MovePageForm extends UnlistedSpecialPage {
                        $newLink )->params( $oldText, $newText )->parseAsBlock() );
                $out->addWikiMsg( $msgName );
 
+               wfRunHooks( 'SpecialMovepageAfterMove', array( &$this, &$ot, &$nt ) );
+
                # Now we move extra pages we've been asked to move: subpages and talk
                # pages.  First, if the old page or the new page is a talk page, we
                # can't move any talk pages: cancel that.
index 8e15d55..08d1517 100644 (file)
@@ -164,8 +164,6 @@ class SpecialNewpages extends IncludableSpecialPage {
        }
 
        protected function filterLinks() {
-               global $wgGroupPermissions;
-
                // show/hide links
                $showhide = array( $this->msg( 'show' )->escaped(), $this->msg( 'hide' )->escaped() );
 
@@ -181,8 +179,7 @@ class SpecialNewpages extends IncludableSpecialPage {
                }
 
                // Disable some if needed
-               # @todo FIXME: Throws E_NOTICEs if not set; and doesn't obey hooks etc.
-               if ( $wgGroupPermissions['*']['createpage'] !== true ) {
+               if ( !User::groupHasPermission( '*', 'createpage' ) ) {
                        unset( $filters['hideliu'] );
                }
                if ( !$this->getUser()->useNPPatrol() ) {
@@ -328,12 +325,13 @@ class SpecialNewpages extends IncludableSpecialPage {
                        $query['rcid'] = $result->rc_id;
                }
 
-               $plink = Linker::linkKnown(
+               // Linker::linkKnown() uses 'known' and 'noclasses' options. This breaks the colouration for stubs.
+               $plink = Linker::link(
                        $title,
                        null,
                        array( 'class' => 'mw-newpages-pagename' ),
                        $query,
-                       array( 'known' ) // Set explicitly to avoid the default of 'known','noclasses'. This breaks the colouration for stubs
+                       array( 'known' )
                );
                $histLink = Linker::linkKnown(
                        $title,
@@ -459,11 +457,12 @@ class SpecialNewpages extends IncludableSpecialPage {
        protected function feedItemDesc( $row ) {
                $revision = Revision::newFromId( $row->rev_id );
                if( $revision ) {
+                       //XXX: include content model/type in feed item?
                        return '<p>' . htmlspecialchars( $revision->getUserText() ) .
                                $this->msg( 'colon-separator' )->inContentLanguage()->escaped() .
                                htmlspecialchars( FeedItem::stripComment( $revision->getComment() ) ) .
                                "</p>\n<hr />\n<div>" .
-                               nl2br( htmlspecialchars( $revision->getText() ) ) . "</div>";
+                               nl2br( htmlspecialchars( $revision->getContent()->serialize() ) ) . "</div>";
                }
                return '';
        }
@@ -488,7 +487,7 @@ class NewPagesPager extends ReverseChronologicalPager {
        }
 
        function getQueryInfo() {
-               global $wgEnableNewpagesUserFilter, $wgGroupPermissions;
+               global $wgEnableNewpagesUserFilter;
                $conds = array();
                $conds['rc_new'] = 1;
 
@@ -510,7 +509,7 @@ class NewPagesPager extends ReverseChronologicalPager {
                        $conds['rc_user_text'] = $user->getText();
                        $rcIndexes = 'rc_user_text';
                # If anons cannot make new pages, don't "exclude logged in users"!
-               } elseif( $wgGroupPermissions['*']['createpage'] && $this->opts->getValue( 'hideliu' ) ) {
+               } elseif( User::groupHasPermission( '*', 'createpage' ) && $this->opts->getValue( 'hideliu' ) ) {
                        $conds['rc_user'] = 0;
                }
                # If this user cannot see patrolled edits or they are off, don't do dumb queries!
index c09da4e..d7cf693 100644 (file)
@@ -121,6 +121,8 @@ class SpecialPasswordReset extends FormSpecialPage {
         * userCanExecute(), and if the data array contains 'Username', etc, then Username
         * resets are allowed.
         * @param $data array
+        * @throws MWException
+        * @throws ThrottledError|PermissionsError
         * @return Bool|Array
         */
        public function onSubmit( array $data ) {
@@ -253,7 +255,7 @@ class SpecialPasswordReset extends FormSpecialPage {
 
                $title = $this->msg( 'passwordreset-emailtitle' );
 
-               $this->result = $firstUser->sendMail( $title->escaped(), $this->email->escaped() );
+               $this->result = $firstUser->sendMail( $title->escaped(), $this->email->text() );
 
                // Blank the email if the user is not supposed to see it
                if( !isset( $data['Capture'] ) || !$data['Capture'] ) {
index 2bd8b0a..14f9c8d 100644 (file)
@@ -109,8 +109,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
        public function feedSetup() {
                global $wgFeedLimit;
                $opts = $this->getDefaultOptions();
-               # Feed is cached on limit,hideminor,namespace; other params would randomly not work
-               $opts->fetchValuesFromRequest( $this->getRequest(), array( 'limit', 'hideminor', 'namespace' ) );
+               $opts->fetchValuesFromRequest( $this->getRequest() );
                $opts->validateIntBounds( 'limit', 0, $wgFeedLimit );
                return $opts;
        }
@@ -382,7 +381,7 @@ class SpecialRecentChanges extends IncludableSpecialPage {
                $invert = $opts['invert'];
                $associated = $opts['associated'];
 
-               $fields = array( $dbr->tableName( 'recentchanges' ) . '.*' ); // all rc columns
+               $fields = RecentChange::selectFields();
                // JOIN on watchlist for users
                if ( $uid ) {
                        $tables[] = 'watchlist';
index 862736d..4db8958 100644 (file)
@@ -37,7 +37,6 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                $opts = parent::getDefaultOptions();
                $opts->add( 'target', '' );
                $opts->add( 'showlinkedto', false );
-               $opts->add( 'tagfilter', '' );
                return $opts;
        }
 
@@ -94,7 +93,7 @@ class SpecialRecentchangeslinked extends SpecialRecentChanges {
                $dbkey = $title->getDBkey();
 
                $tables = array( 'recentchanges' );
-               $select = array( $dbr->tableName( 'recentchanges' ) . '.*' );
+               $select = RecentChange::selectFields();
                $join_conds = array();
                $query_options = array();
 
index 089f967..7856e54 100644 (file)
@@ -504,6 +504,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
 
        /**
         * UI entry point for form submission.
+        * @throws PermissionsError
         * @return bool
         */
        protected function submit() {
index d2add62..7c8ff84 100644 (file)
@@ -423,7 +423,7 @@ class SpecialSearch extends SpecialPage {
 
                if( $t->isKnown() ) {
                        $messageName = 'searchmenu-exists';
-               } elseif( $t->userCan( 'create' ) ) {
+               } elseif( $t->userCan( 'create', $this->getUser() ) ) {
                        $messageName = 'searchmenu-new';
                } else {
                        $messageName = 'searchmenu-new-nocreate';
@@ -449,7 +449,9 @@ class SpecialSearch extends SpecialPage {
                $out = $this->getOutput();
                if( strval( $term ) !== ''  ) {
                        $out->setPageTitle( $this->msg( 'searchresults' ) );
-                       $out->setHTMLTitle( $this->msg( 'pagetitle', $this->msg( 'searchresults-title', $term )->plain() ) );
+                       $out->setHTMLTitle( $this->msg( 'pagetitle' )->rawParams(
+                               $this->msg( 'searchresults-title' )->rawParams( $term )->text()
+                       ) );
                }
                // add javascript specific to special:search
                $out->addModules( 'mediawiki.special.search' );
@@ -559,7 +561,7 @@ class SpecialSearch extends SpecialPage {
                //If page content is not readable, just return the title.
                //This is not quite safe, but better than showing excerpts from non-readable pages
                //Note that hiding the entry entirely would screw up paging.
-               if( !$t->userCan( 'read' ) ) {
+               if( !$t->userCan( 'read', $this->getUser() ) ) {
                        wfProfileOut( __METHOD__ );
                        return "<li>{$link}</li>\n";
                }
@@ -682,11 +684,21 @@ class SpecialSearch extends SpecialPage {
                        }
                }
 
-               wfProfileOut( __METHOD__ );
-               return "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section}</div> {$extract}\n" .
-                       "<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" .
-                       "</li>\n";
+               $html = null;
+
+               if ( wfRunHooks( 'ShowSearchHit', array (
+                       $this, $result, $terms,
+                       &$link, &$redirect, &$section, &$extract,
+                       &$score, &$size, &$date, &$related,
+                       &$html
+               ) ) ) {
+                       $html = "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section}</div> {$extract}\n" .
+                               "<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" .
+                               "</li>\n";
+               }
 
+               wfProfileOut( __METHOD__ );
+               return $html;
        }
 
        /**
index e973ddc..1e7c8bb 100644 (file)
@@ -66,7 +66,11 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                                if( !isset( $groups[$group] ) ) {
                                        $groups[$group] = array();
                                }
-                               $groups[$group][$page->getDescription()] = array( $page->getTitle(), $page->isRestricted(), $page->isExpensive() );
+                               $groups[$group][$page->getDescription()] = array(
+                                       $page->getTitle(),
+                                       $page->isRestricted(),
+                                       $page->isCached()
+                               );
                        }
                }
 
@@ -88,15 +92,14 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
        }
 
        private function outputPageList( $groups ) {
-               global $wgMiserMode;
                $out = $this->getOutput();
 
                $includesRestrictedPages = false;
                $includesCachedPages = false;
 
                foreach ( $groups as $group => $sortedPages ) {
-                       $middle = ceil( count( $sortedPages )/2 );
                        $total = count( $sortedPages );
+                       $middle = ceil( $total / 2 );
                        $count = 0;
 
                        $out->wrapWikiMsg( "<h2 class=\"mw-specialpagesgroup\" id=\"mw-specialpagesgroup-$group\">$1</h2>\n", "specialpages-group-$group" );
@@ -107,10 +110,10 @@ class SpecialSpecialpages extends UnlistedSpecialPage {
                                Html::openElement( 'ul' ) . "\n"
                        );
                        foreach( $sortedPages as $desc => $specialpage ) {
-                               list( $title, $restricted, $expensive) = $specialpage;
+                               list( $title, $restricted, $cached ) = $specialpage;
 
                                $pageClasses = array();
-                               if ( $expensive && $wgMiserMode ){
+                               if ( $cached ) {
                                        $includesCachedPages = true;
                                        $pageClasses[] = 'mw-specialpagecached';
                                }
index fb2005b..853a805 100644 (file)
@@ -149,6 +149,7 @@ class SpecialUnblock extends SpecialPage {
         *
         * @param $data Array
         * @param $context IContextSource
+        * @throws ErrorPageError
         * @return Array( Array(message key, parameters) ) on failure, True on success
         */
        public static function processUnblock( array $data, IContextSource $context ){
index 70d98df..d2d91bd 100644 (file)
@@ -31,4 +31,17 @@ class UncategorizedCategoriesPage extends UncategorizedPagesPage {
                parent::__construct( $name );
                $this->requestedNamespace = NS_CATEGORY;
        }
+
+       /**
+        * Formats the result
+        * @param $skin The current skin
+        * @param $result The query result
+        * @return string The category link
+        */
+       function formatResult ( $skin, $result ) {
+               $title = Title::makeTitle( NS_CATEGORY, $result->title );
+               $text = $title->getText();
+
+               return Linker::linkKnown( $title, htmlspecialchars( $text ) );
+        }
 }
index 6ebaed5..0d2ac7e 100644 (file)
@@ -32,7 +32,16 @@ class PageArchive {
         * @var Title
         */
        protected $title;
-       var $fileStatus;
+
+       /**
+        * @var Status
+        */
+       protected $fileStatus;
+
+       /**
+        * @var Status
+        */
+       protected $revisionStatus;
 
        function __construct( $title ) {
                if( is_null( $title ) ) {
@@ -112,12 +121,22 @@ class PageArchive {
         * @return ResultWrapper
         */
        function listRevisions() {
+               global $wgContentHandlerUseDB;
+
                $dbr = wfGetDB( DB_SLAVE );
+
+               $fields = array(
+                       'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
+                       'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1',
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
                $res = $dbr->select( 'archive',
-                       array(
-                               'ar_minor_edit', 'ar_timestamp', 'ar_user', 'ar_user_text',
-                               'ar_comment', 'ar_len', 'ar_deleted', 'ar_rev_id', 'ar_sha1'
-                       ),
+                       $fields,
                        array( 'ar_namespace' => $this->title->getNamespace(),
                                   'ar_title' => $this->title->getDBkey() ),
                        __METHOD__,
@@ -156,7 +175,8 @@ class PageArchive {
                                        'fa_user',
                                        'fa_user_text',
                                        'fa_timestamp',
-                                       'fa_deleted' ),
+                                       'fa_deleted',
+                                       'fa_sha1' ),
                                array( 'fa_name' => $this->title->getDBkey() ),
                                __METHOD__,
                                array( 'ORDER BY' => 'fa_timestamp DESC' ) );
@@ -174,28 +194,38 @@ class PageArchive {
         * @return Revision
         */
        function getRevision( $timestamp ) {
+               global $wgContentHandlerUseDB;
+
                $dbr = wfGetDB( DB_SLAVE );
+
+               $fields = array(
+                       'ar_rev_id',
+                       'ar_text',
+                       'ar_comment',
+                       'ar_user',
+                       'ar_user_text',
+                       'ar_timestamp',
+                       'ar_minor_edit',
+                       'ar_flags',
+                       'ar_text_id',
+                       'ar_deleted',
+                       'ar_len',
+                       'ar_sha1',
+               );
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
                $row = $dbr->selectRow( 'archive',
-                       array(
-                               'ar_rev_id',
-                               'ar_text',
-                               'ar_comment',
-                               'ar_user',
-                               'ar_user_text',
-                               'ar_timestamp',
-                               'ar_minor_edit',
-                               'ar_flags',
-                               'ar_text_id',
-                               'ar_deleted',
-                               'ar_len',
-                               'ar_sha1',
-                       ),
+                       $fields,
                        array( 'ar_namespace' => $this->title->getNamespace(),
                                        'ar_title' => $this->title->getDBkey(),
                                        'ar_timestamp' => $dbr->timestamp( $timestamp ) ),
                        __METHOD__ );
                if( $row ) {
-                       return Revision::newFromArchiveRow( $row, array( 'page' => $this->title->getArticleID() ) );
+                       return Revision::newFromArchiveRow( $row, array( 'title' => $this->title ) );
                } else {
                        return null;
                }
@@ -329,8 +359,6 @@ class PageArchive {
         * on success, false on failure
         */
        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 );
@@ -341,7 +369,7 @@ class PageArchive {
                if( $restoreFiles && $this->title->getNamespace() == NS_FILE ) {
                        $img = wfLocalFile( $this->title );
                        $this->fileStatus = $img->restore( $fileVersions, $unsuppress );
-                       if ( !$this->fileStatus->isOk() ) {
+                       if ( !$this->fileStatus->isOK() ) {
                                return false;
                        }
                        $filesRestored = $this->fileStatus->successCount;
@@ -350,10 +378,12 @@ class PageArchive {
                }
 
                if( $restoreText ) {
-                       $textRestored = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
-                       if( $textRestored === false ) { // It must be one of UNDELETE_*
+                       $this->revisionStatus = $this->undeleteRevisions( $timestamps, $unsuppress, $comment );
+                       if( !$this->revisionStatus->isOK() ) {
                                return false;
                        }
+
+                       $textRestored = $this->revisionStatus->getValue();
                } else {
                        $textRestored = 0;
                }
@@ -379,6 +409,7 @@ class PageArchive {
                }
 
                if ( $user === null ) {
+                       global $wgUser;
                        $user = $wgUser;
                }
 
@@ -386,6 +417,9 @@ class PageArchive {
                $logEntry->setPerformer( $user );
                $logEntry->setTarget( $this->title );
                $logEntry->setComment( $reason );
+
+               wfRunHooks( 'ArticleUndeleteLogEntry', array( $this, &$logEntry, $user ) );
+
                $logid = $logEntry->insert();
                $logEntry->publish( $logid );
 
@@ -401,11 +435,13 @@ class PageArchive {
         * @param $comment String
         * @param $unsuppress Boolean: remove all ar_deleted/fa_deleted restrictions of seletected revs
         *
-        * @return Mixed: number of revisions restored or false on failure
+        * @return Status, containing the number of revisions restored on success
         */
        private function undeleteRevisions( $timestamps, $unsuppress = false, $comment = '' ) {
+               global $wgContentHandlerUseDB;
+
                if ( wfReadOnly() ) {
-                       return false;
+                       throw new ReadOnlyError();
                }
                $restoreAll = empty( $timestamps );
 
@@ -435,9 +471,14 @@ class PageArchive {
                        $previousTimestamp = $dbw->selectField( 'revision', 'rev_timestamp',
                                array( 'rev_id' => $previousRevId ),
                                __METHOD__ );
+
                        if( $previousTimestamp === false ) {
                                wfDebug( __METHOD__.": existing page refers to a page_latest that does not exist\n" );
-                               return 0;
+
+                               $status = Status::newGood( 0 );
+                               $status->warning( 'undeleterevision-missing' );
+
+                               return $status;
                        }
                } else {
                        # Have to create a new article...
@@ -457,24 +498,31 @@ class PageArchive {
                        $oldones = "ar_timestamp IN ( {$oldts} )";
                }
 
+               $fields = array(
+                       'ar_rev_id',
+                       'ar_text',
+                       'ar_comment',
+                       'ar_user',
+                       'ar_user_text',
+                       'ar_timestamp',
+                       'ar_minor_edit',
+                       'ar_flags',
+                       'ar_text_id',
+                       'ar_deleted',
+                       'ar_page_id',
+                       'ar_len',
+                       'ar_sha1');
+
+               if ( $wgContentHandlerUseDB ) {
+                       $fields[] = 'ar_content_format';
+                       $fields[] = 'ar_content_model';
+               }
+
                /**
                 * Select each archived revision...
                 */
                $result = $dbw->select( 'archive',
-                       /* fields */ array(
-                               'ar_rev_id',
-                               'ar_text',
-                               'ar_comment',
-                               'ar_user',
-                               'ar_user_text',
-                               'ar_timestamp',
-                               'ar_minor_edit',
-                               'ar_flags',
-                               'ar_text_id',
-                               'ar_deleted',
-                               'ar_page_id',
-                               'ar_len',
-                               'ar_sha1' ),
+                       $fields,
                        /* WHERE */ array(
                                'ar_namespace' => $this->title->getNamespace(),
                                'ar_title'     => $this->title->getDBkey(),
@@ -486,17 +534,38 @@ class PageArchive {
                $rev_count = $dbw->numRows( $result );
                if( !$rev_count ) {
                        wfDebug( __METHOD__ . ": no revisions to restore\n" );
-                       return false; // ???
+
+                       $status = Status::newGood( 0 );
+                       $status->warning( "undelete-no-results" );
+                       return $status;
                }
 
                $ret->seek( $rev_count - 1 ); // move to last
                $row = $ret->fetchObject(); // get newest archived rev
                $ret->seek( 0 ); // move back
 
+               // grab the content to check consistency with global state before restoring the page.
+               $revision = Revision::newFromArchiveRow( $row,
+                       array(
+                               'title' => $article->getTitle(), // used to derive default content model
+                       ) );
+
+               $m = $revision->getContentModel();
+
+               $user = User::newFromName( $revision->getRawUserText(), false );
+               $content = $revision->getContent( Revision::RAW );
+
+               //NOTE: article ID may not be known yet. prepareSave() should not modify the database.
+               $status = $content->prepareSave( $article, 0, -1, $user );
+
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
+
                if( $makepage ) {
                        // Check the state of the newest to-be version...
                        if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
-                               return false; // we can't leave the current revision like this!
+                               return Status::newFatal( "undeleterevdel" );
                        }
                        // Safe to insert now...
                        $newid  = $article->insertOn( $dbw );
@@ -506,9 +575,12 @@ class PageArchive {
                        if( $row->ar_timestamp > $previousTimestamp ) {
                                // Check the state of the newest to-be version...
                                if( !$unsuppress && ( $row->ar_deleted & Revision::DELETED_TEXT ) ) {
-                                       return false; // we can't leave the current revision like this!
+                                       return Status::newFatal( "undeleterevdel" );
                                }
                        }
+
+                       $newid  = false;
+                       $pageId = $article->getId();
                }
 
                $revision = null;
@@ -528,6 +600,7 @@ class PageArchive {
                        $revision = Revision::newFromArchiveRow( $row,
                                array(
                                        'page' => $pageId,
+                                       'title' => $this->title,
                                        'deleted' => $unsuppress ? 0 : $row->ar_deleted
                                ) );
 
@@ -546,7 +619,7 @@ class PageArchive {
 
                // Was anything restored at all?
                if ( $restored == 0 ) {
-                       return 0;
+                       return Status::newGood( 0 );
                }
 
                $created = (bool)$newid;
@@ -566,13 +639,18 @@ class PageArchive {
                        $update->doUpdate();
                }
 
-               return $restored;
+               return Status::newGood( $restored );
        }
 
        /**
         * @return Status
         */
        function getFileStatus() { return $this->fileStatus; }
+
+       /**
+        * @return Status
+        */
+       function getRevisionStatus() { return $this->revisionStatus; }
 }
 
 /**
@@ -780,11 +858,13 @@ class SpecialUndelete extends SpecialPage {
 
        private function showRevision( $timestamp ) {
                if( !preg_match( '/[0-9]{14}/', $timestamp ) ) {
-                       return 0;
+                       return;
                }
 
                $archive = new PageArchive( $this->mTargetObj );
-               wfRunHooks( 'UndeleteForm::showRevision', array( &$archive, $this->mTargetObj ) );
+               if ( !wfRunHooks( 'UndeleteForm::showRevision', array( &$archive, $this->mTargetObj ) ) ) {
+                       return;
+               }
                $rev = $archive->getRevision( $timestamp );
 
                $out = $this->getOutput();
@@ -834,7 +914,11 @@ class SpecialUndelete extends SpecialPage {
                $t = $lang->userTime( $timestamp, $user );
                $userLink = Linker::revUserTools( $rev );
 
-               if( $this->mPreview ) {
+               $content = $rev->getContent( Revision::FOR_THIS_USER, $user );
+
+               $isText = ( $content instanceof TextContent );
+
+               if( $this->mPreview || $isText ) {
                        $openDiv = '<div id="mw-undelete-revision" class="mw-warning">';
                } else {
                        $openDiv = '<div id="mw-undelete-revision">';
@@ -851,23 +935,48 @@ class SpecialUndelete extends SpecialPage {
 
                $out->addHTML( $this->msg( 'undelete-revision' )->rawParams( $link )->params(
                        $time )->rawParams( $userLink )->params( $d, $t )->parse() . '</div>' );
-               wfRunHooks( 'UndeleteShowRevision', array( $this->mTargetObj, $rev ) );
 
-               if( $this->mPreview ) {
+               if ( !wfRunHooks( 'UndeleteShowRevision', array( $this->mTargetObj, $rev ) ) ) {
+                       return;
+               }
+
+               if( $this->mPreview || !$isText ) {
+                       // NOTE: non-text content has no source view, so always use rendered preview
+
                        // Hide [edit]s
                        $popts = $out->parserOptions();
                        $popts->setEditSection( false );
-                       $out->parserOptions( $popts );
-                       $out->addWikiTextTitleTidy( $rev->getText( Revision::FOR_THIS_USER, $user ), $this->mTargetObj, true );
+
+                       $pout = $content->getParserOutput( $this->mTargetObj, $rev->getId(), $popts, true );
+                       $out->addParserOutput( $pout );
                }
 
+               if ( $isText ) {
+                       // source view for textual content
+                       $sourceView = Xml::element( 'textarea', array(
+                               'readonly' => 'readonly',
+                               'cols' => intval( $user->getOption( 'cols' ) ),
+                               'rows' => intval( $user->getOption( 'rows' ) ) ),
+                               $content->getNativeData() . "\n" );
+
+                       $previewButton = Xml::element( 'input', array(
+                               'type' => 'submit',
+                               'name' => 'preview',
+                               'value' => $this->msg( 'showpreview' )->text() ) );
+               } else {
+                       $sourceView = '';
+                       $previewButton = '';
+               }
+
+               $diffButton = Xml::element( 'input', array(
+                       'name' => 'diff',
+                       'type' => 'submit',
+                       'value' => $this->msg( 'showdiff' )->text() ) );
+
                $out->addHTML(
-                       Xml::element( 'textarea', array(
-                                       'readonly' => 'readonly',
-                                       'cols' => intval( $user->getOption( 'cols' ) ),
-                                       'rows' => intval( $user->getOption( 'rows' ) ) ),
-                               $rev->getText( Revision::FOR_THIS_USER, $user ) . "\n" ) .
-                       Xml::openElement( 'div' ) .
+                       $sourceView .
+                       Xml::openElement( 'div', array(
+                               'style' => 'clear: both' ) ) .
                        Xml::openElement( 'form', array(
                                'method' => 'post',
                                'action' => $this->getTitle()->getLocalURL( array( 'action' => 'submit' ) ) ) ) .
@@ -883,14 +992,8 @@ class SpecialUndelete extends SpecialPage {
                                'type' => 'hidden',
                                'name' => 'wpEditToken',
                                'value' => $user->getEditToken() ) ) .
-                       Xml::element( 'input', array(
-                               'type' => 'submit',
-                               'name' => 'preview',
-                               'value' => $this->msg( 'showpreview' )->text() ) ) .
-                       Xml::element( 'input', array(
-                               'name' => 'diff',
-                               'type' => 'submit',
-                               'value' => $this->msg( 'showdiff' )->text() ) ) .
+                       $previewButton .
+                       $diffButton .
                        Xml::closeElement( 'form' ) .
                        Xml::closeElement( 'div' ) );
        }
@@ -904,7 +1007,11 @@ class SpecialUndelete extends SpecialPage {
         * @return String: HTML
         */
        function showDiff( $previousRev, $currentRev ) {
-               $diffEngine = new DifferenceEngine( $this->getContext() );
+               $diffContext = clone $this->getContext();
+               $diffContext->setTitle( $currentRev->getTitle() );
+               $diffContext->setWikiPage( WikiPage::factory( $currentRev->getTitle() ) );
+
+               $diffEngine = $currentRev->getContentHandler()->createDifferenceEngine( $diffContext );
                $diffEngine->showDiffStyle();
                $this->getOutput()->addHTML(
                        "<div>" .
@@ -921,9 +1028,9 @@ class SpecialUndelete extends SpecialPage {
                                $this->diffHeader( $currentRev, 'n' ) .
                                "</td>\n" .
                        "</tr>" .
-                       $diffEngine->generateDiffBody(
-                               $previousRev->getText( Revision::FOR_THIS_USER, $this->getUser() ),
-                               $currentRev->getText( Revision::FOR_THIS_USER, $this->getUser() ) ) .
+                       $diffEngine->generateContentDiffBody(
+                               $previousRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ),
+                               $currentRev->getContent( Revision::FOR_THIS_USER, $this->getUser() ) ) .
                        "</table>" .
                        "</div>\n"
                );
@@ -1180,7 +1287,10 @@ class SpecialUndelete extends SpecialPage {
 
        private function formatRevisionRow( $row, $earliestLiveTime, $remaining ) {
                $rev = Revision::newFromArchiveRow( $row,
-                       array( 'page' => $this->mTargetObj->getArticleID() ) );
+                       array(
+                               'title' => $this->mTargetObj
+                       ) );
+
                $revTextSize = '';
                $ts = wfTimestamp( TS_MW, $row->ar_timestamp );
                // Build checkboxen...
@@ -1417,11 +1527,15 @@ class SpecialUndelete extends SpecialPage {
                        $out->addHTML( $this->msg( 'undeletedpage' )->rawParams( $link )->parse() );
                } else {
                        $out->setPageTitle( $this->msg( 'undelete-error' ) );
-                       $out->addWikiMsg( 'cannotundelete' );
-                       $out->addWikiMsg( 'undeleterevdel' );
                }
 
-               // Show file deletion warnings and errors
+               // Show revision undeletion warnings and errors
+               $status = $archive->getRevisionStatus();
+               if( $status && !$status->isGood() ) {
+                       $out->addWikiText( '<div class="error">' . $status->getWikiText( 'cannotundelete', 'cannotundelete' ) . '</div>' );
+               }
+
+               // Show file undeletion warnings and errors
                $status = $archive->getFileStatus();
                if( $status && !$status->isGood() ) {
                        $out->addWikiText( '<div class="error">' . $status->getWikiText( 'undelete-error-short', 'undelete-error-long' ) . '</div>' );
index 43ea345..73c7e2a 100644 (file)
@@ -312,12 +312,12 @@ class SpecialUpload extends SpecialPage {
                $this->showUploadForm( $form );
        }
        /**
-        * Stashes the upload, shows the main form, but adds an "continue anyway button".
+        * Stashes the upload, shows the main form, but adds a "continue anyway button".
         * Also checks whether there are actually warnings to display.
         *
         * @param $warnings Array
         * @return boolean true if warnings were displayed, false if there are no
-        *      warnings and the should continue processing like there was no warning
+        *         warnings and it should continue processing
         */
        protected function showUploadWarning( $warnings ) {
                # If there are no warnings, or warnings we can ignore, return early.
@@ -336,6 +336,9 @@ class SpecialUpload extends SpecialPage {
                $warningHtml = '<h2>' . $this->msg( 'uploadwarning' )->escaped() . "</h2>\n"
                        . '<ul class="warning">';
                foreach( $warnings as $warning => $args ) {
+                       if( $warning == 'badfilename' ) {
+                               $this->mDesiredDestName = Title::makeTitle( NS_FILE, $args )->getText();
+                       }
                        if( $warning == 'exists' ) {
                                $msg = "\t<li>" . self::getExistsWarning( $args ) . "</li>\n";
                        } elseif( $warning == 'duplicate' ) {
@@ -525,6 +528,7 @@ class SpecialUpload extends SpecialPage {
         * Provides output to the user for a result of UploadBase::verifyUpload
         *
         * @param $details Array: result of UploadBase::verifyUpload
+        * @throws MWException
         */
        protected function processVerificationError( $details ) {
                global $wgFileExtensions;
@@ -645,7 +649,7 @@ class SpecialUpload extends SpecialPage {
                                $exists['normalizedFile']->getTitle()->getPrefixedText() )->parse();
                } elseif ( $exists['warning'] == 'thumb' ) {
                        // Swapped argument order compared with other messages for backwards compatibility
-                       $warning = wfMessage( 'fileexists-thumbnail-yes', 
+                       $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
@@ -789,6 +793,8 @@ class UploadForm extends HTMLForm {
         * @return Array: descriptor array
         */
        protected function getSourceSection() {
+               global $wgCopyUploadsFromSpecialUpload;
+
                if ( $this->mSessionKey ) {
                        return array(
                                'SessionKey' => array(
@@ -802,7 +808,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' ) );
 
@@ -1106,7 +1114,7 @@ class UploadSourceField extends HTMLTextField {
         * @return string
         */
        function getLabelHtml( $cellAttributes = array() ) {
-               $id = "wpSourceType{$this->mParams['upload-type']}";
+               $id = $this->mParams['id'];
                $label = Html::rawElement( 'label', array( 'for' => $id ), $this->mLabel );
 
                if ( !empty( $this->mParams['radio'] ) ) {
index 1a00d73..3f9851e 100644 (file)
@@ -74,6 +74,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * n.b. Most sanity checking done in UploadStashLocalFile, so this is straightforward.
         *
         * @param $key String: the key of a particular requested file
+        * @throws HttpError
         * @return bool
         */
        public function showUpload( $key ) {
@@ -113,6 +114,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * application the transform parameters
         *
         * @param string $key
+        * @throws UploadStashBadPathException
         * @return array
         */
        private function parseKey( $key ) {
@@ -164,10 +166,11 @@ class SpecialUploadStash extends UnlistedSpecialPage {
 
        /**
         * Scale a file (probably with a locally installed imagemagick, or similar) and output it to STDOUT.
-        * @param $file: File object
-        * @param $params: scaling parameters ( e.g. array( width => '50' ) );
-        * @param $flags: scaling flags ( see File:: constants )
+        * @param $file File
+        * @param $params array Scaling parameters ( e.g. array( width => '50' ) );
+        * @param $flags int Scaling flags ( see File:: constants )
         * @throws MWException
+        * @throws UploadStashFileNotFoundException
         * @return boolean success
         */
        private function outputLocallyScaledThumb( $file, $params, $flags ) {
@@ -189,7 +192,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
 
                // now we should construct a File, so we can get mime and other such info in a standard way
                // n.b. mimetype may be different from original (ogx original -> jpeg thumb)
-               $thumbFile = new UnregisteredLocalFile( false, 
+               $thumbFile = new UnregisteredLocalFile( false,
                        $this->stash->repo, $thumbnailImage->getStoragePath(), false );
                if ( !$thumbFile ) {
                        throw new UploadStashFileNotFoundException( "couldn't create local file object for thumbnail" );
@@ -258,6 +261,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * Side effect: writes HTTP response to STDOUT.
         *
         * @param $file File object with a local path (e.g. UnregisteredLocalFile, LocalFile. Oddly these don't share an ancestor!)
+        * @throws SpecialUploadStashTooLargeException
         * @return bool
         */
        private function outputLocalFile( File $file ) {
@@ -275,6 +279,7 @@ class SpecialUploadStash extends UnlistedSpecialPage {
         * Side effect: writes HTTP response to STDOUT.
         * @param $content String content
         * @param $contentType String mime type
+        * @throws SpecialUploadStashTooLargeException
         * @return bool
         */
        private function outputContents( $content, $contentType ) {
index ef6af80..4980ffb 100644 (file)
@@ -149,6 +149,23 @@ class LoginForm extends SpecialPage {
                $this->load();
                $this->setHeaders();
 
+               global $wgSecureLogin;
+               if (
+                       $this->mType !== 'signup' &&
+                       $wgSecureLogin &&
+                       WebRequest::detectProtocol() !== 'https'
+               ) {
+                       $title = $this->getFullTitle();
+                       $query = array(
+                               'returnto' => $this->mReturnTo,
+                               'returntoquery' => $this->mReturnToQuery,
+                               'wpStickHTTPS' => $this->mStickHTTPS
+                       );
+                       $url = $title->getFullURL( $query, false, PROTO_HTTPS );
+                       $this->getOutput()->redirect( $url );
+                       return;
+               }
+
                if ( $par == 'signup' ) { # Check for [[Special:Userlogin/signup]]
                        $this->mType = 'signup';
                }
@@ -269,6 +286,7 @@ class LoginForm extends SpecialPage {
 
        /**
         * @private
+        * @throws PermissionsError|ReadOnlyError
         * @return bool|User
         */
        function addNewAccountInternal() {
@@ -425,7 +443,13 @@ class LoginForm extends SpecialPage {
                }
 
                self::clearCreateaccountToken();
-               return $this->initUser( $u, false );
+
+               $status = $this->initUser( $u, false );
+               if ( !$status->isOK() ) {
+                       $this->mainLoginForm( $status->getHTML() );
+                       return false;
+               }
+               return $status->value;
        }
 
        /**
@@ -434,13 +458,16 @@ class LoginForm extends SpecialPage {
         *
         * @param $u User object.
         * @param $autocreate boolean -- true if this is an autocreation via auth plugin
-        * @return User object.
+        * @return Status object, with the User object in the value member on success
         * @private
         */
        function initUser( $u, $autocreate ) {
                global $wgAuth;
 
-               $u->addToDatabase();
+               $status = $u->addToDatabase();
+               if ( !$status->isOK() ) {
+                       return $status;
+               }
 
                if ( $wgAuth->allowPasswordChange() ) {
                        $u->setPassword( $this->mPassword );
@@ -466,7 +493,7 @@ class LoginForm extends SpecialPage {
                # Update user count
                DeferredUpdates::addUpdate( new SiteStatsUpdate( 0, 0, 0, 0, 1 ) );
 
-               return $u;
+               return Status::newGood( $u );
        }
 
        /**
@@ -532,7 +559,7 @@ class LoginForm extends SpecialPage {
                }
 
                $isAutoCreated = false;
-               if ( 0 == $u->getID() ) {
+               if ( $u->getID() == 0 ) {
                        $status = $this->attemptAutoCreate( $u );
                        if ( $status !== self::SUCCESS ) {
                                return $status;
@@ -542,8 +569,9 @@ class LoginForm extends SpecialPage {
                } else {
                        global $wgExternalAuthType, $wgAutocreatePolicy;
                        if ( $wgExternalAuthType && $wgAutocreatePolicy != 'never'
-                       && is_object( $this->mExtUser )
-                       && $this->mExtUser->authenticate( $this->mPassword ) ) {
+                               && is_object( $this->mExtUser )
+                               && $this->mExtUser->authenticate( $this->mPassword )
+                       ) {
                                # The external user and local user have the same name and
                                # password, so we assume they're the same.
                                $this->mExtUser->linkToLocal( $u->getID() );
@@ -712,12 +740,19 @@ class LoginForm extends SpecialPage {
                }
 
                wfDebug( __METHOD__ . ": creating account\n" );
-               $this->initUser( $user, true );
+               $status = $this->initUser( $user, true );
+
+               if ( !$status->isOK() ) {
+                       $errors = $status->getErrorsByType( 'error' );
+                       $this->mAbortLoginErrorMsg = $errors[0]['message'];
+                       return self::ABORTED;
+               }
+
                return self::SUCCESS;
        }
 
        function processLogin() {
-               global $wgMemc, $wgLang;
+               global $wgMemc, $wgLang, $wgSecureLogin;
 
                switch ( $this->authenticateUserData() ) {
                        case self::SUCCESS:
@@ -729,7 +764,12 @@ class LoginForm extends SpecialPage {
                                } else {
                                        $user->invalidateCache();
                                }
-                               $user->setCookies();
+
+                               if( $wgSecureLogin && !$this->mStickHTTPS ) {
+                                       $user->setCookies( null, false );
+                               } else {
+                                       $user->setCookies();
+                               }
                                self::clearLoginToken();
 
                                // Reset the throttle
@@ -745,6 +785,8 @@ class LoginForm extends SpecialPage {
                                        $userLang = Language::factory( $code );
                                        $wgLang = $userLang;
                                        $this->getContext()->setLanguage( $userLang );
+                                       // Reset SessionID on Successful login (bug 40995)
+                                       $this->renewSessionId();
                                        $this->successfulLogin();
                                } else {
                                        $this->cookieRedirectCheck( 'login' );
@@ -815,7 +857,7 @@ class LoginForm extends SpecialPage {
         * @return Status object
         */
        function mailPasswordInternal( $u, $throttle = true, $emailTitle = 'passwordremindertitle', $emailText = 'passwordremindertext' ) {
-               global $wgServer, $wgScript, $wgNewPasswordExpiry;
+               global $wgCanonicalServer, $wgScript, $wgNewPasswordExpiry;
 
                if ( $u->getEmail() == '' ) {
                        return Status::newFatal( 'noemail', $u->getName() );
@@ -832,7 +874,7 @@ class LoginForm extends SpecialPage {
                $u->setNewpassword( $np, $throttle );
                $u->saveSettings();
                $userLanguage = $u->getOption( 'language' );
-               $m = $this->msg( $emailText, $ip, $u->getName(), $np, '<' . $wgServer . $wgScript . '>',
+               $m = $this->msg( $emailText, $ip, $u->getName(), $np, '<' . $wgCanonicalServer . $wgScript . '>',
                        round( $wgNewPasswordExpiry / 86400 ) )->inLanguage( $userLanguage )->text();
                $result = $u->sendMail( $this->msg( $emailTitle )->inLanguage( $userLanguage )->text(), $m );
 
@@ -857,7 +899,8 @@ class LoginForm extends SpecialPage {
                wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
 
                if( $injected_html !== '' ) {
-                       $this->displaySuccessfulLogin( 'loginsuccess', $injected_html );
+                       $this->displaySuccessfulAction( $this->msg( 'loginsuccesstitle' ),
+                               'loginsuccess', $injected_html );
                } else {
                        $this->executeReturnTo( 'successredirect' );
                }
@@ -873,7 +916,7 @@ class LoginForm extends SpecialPage {
                # Run any hooks; display injected HTML
                $currentUser = $this->getUser();
                $injected_html = '';
-               $welcome_creation_msg = 'welcomecreation';
+               $welcome_creation_msg = 'welcomecreation-msg';
 
                wfRunHooks( 'UserLoginComplete', array( &$currentUser, &$injected_html ) );
 
@@ -884,18 +927,21 @@ class LoginForm extends SpecialPage {
                 */
                wfRunHooks( 'BeforeWelcomeCreation', array( &$welcome_creation_msg, &$injected_html ) );
 
-               $this->displaySuccessfulLogin( $welcome_creation_msg, $injected_html );
+               $this->displaySuccessfulAction( $this->msg( 'welcomeuser', $this->getUser()->getName() ),
+                       $welcome_creation_msg, $injected_html );
        }
 
        /**
-        * Display a "login successful" page.
+        * Display an "successful action" page.
+        *
+        * @param $title string|Message page's title
         * @param $msgname string
         * @param $injected_html string
         */
-       private function displaySuccessfulLogin( $msgname, $injected_html ) {
+       private function displaySuccessfulAction( $title, $msgname, $injected_html ) {
                $out = $this->getOutput();
-               $out->setPageTitle( $this->msg( 'loginsuccesstitle' ) );
-               if( $msgname ){
+               $out->setPageTitle( $title );
+               if ( $msgname ) {
                        $out->addWikiMsg( $msgname, wfEscapeWikiText( $this->getUser()->getName() ) );
                }
 
@@ -962,14 +1008,22 @@ class LoginForm extends SpecialPage {
                        $returnToTitle = Title::newMainPage();
                }
 
+               if ( $wgSecureLogin && !$this->mStickHTTPS ) {
+                       $options = array( 'http' );
+                       $proto = PROTO_HTTP;
+               } elseif( $wgSecureLogin ) {
+                       $options = array( 'https' );
+                       $proto = PROTO_HTTPS;
+               } else {
+                       $options = array();
+                       $proto = PROTO_RELATIVE;
+               }
+
                if ( $type == 'successredirect' ) {
-                       $redirectUrl = $returnToTitle->getFullURL( $returnToQuery );
-                       if( $wgSecureLogin && !$this->mStickHTTPS ) {
-                               $redirectUrl = preg_replace( '/^https:/', 'http:', $redirectUrl );
-                       }
+                       $redirectUrl = $returnToTitle->getFullURL( $returnToQuery, false, $proto );
                        $this->getOutput()->redirect( $redirectUrl );
                } else {
-                       $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery );
+                       $this->getOutput()->addReturnTo( $returnToTitle, $returnToQuery, null, $options );
                }
        }
 
@@ -1206,6 +1260,23 @@ class LoginForm extends SpecialPage {
                $wgRequest->setSessionData( 'wsCreateaccountToken', null );
        }
 
+       /**
+        * Renew the user's session id, using strong entropy
+        */
+       private function renewSessionId() {
+               if ( wfCheckEntropy() ) {
+                       session_regenerate_id( false );
+               } else {
+                       //If we don't trust PHP's entropy, we have to replace the session manually
+                       $tmp = $_SESSION;
+                       session_unset();
+                       session_write_close();
+                       session_id( MWCryptRand::generateHex( 32 ) );
+                       session_start();
+                       $_SESSION = $tmp;
+               }
+       }
+
        /**
         * @private
         */
index ab2bf0a..4be36c6 100644 (file)
@@ -49,8 +49,11 @@ class SpecialUserlogout extends UnlistedSpecialPage {
                $oldName = $user->getName();
                $user->logout();
 
+               $loginURL = SpecialPage::getTitleFor( 'Userlogin' )->getFullURL(
+                       $this->getRequest()->getValues( 'returnto', 'returntoquery' ) );
+
                $out = $this->getOutput();
-               $out->addWikiMsg( 'logouttext' );
+               $out->addWikiMsg( 'logouttext', $loginURL );
 
                // Hook.
                $injected_html = '';
index 9f5a48a..121cc22 100644 (file)
@@ -62,6 +62,7 @@ class UserrightsPage extends SpecialPage {
         * Depending on the submit button used, call a form or a save function.
         *
         * @param $par Mixed: string if any subpage provided, else null
+        * @throws UserBlockedError|PermissionsError
         */
        public function execute( $par ) {
                // If the visitor doesn't have permissions to assign or remove
@@ -244,16 +245,16 @@ class UserrightsPage extends SpecialPage {
         * Add a rights log entry for an action.
         */
        function addLogEntry( $user, $oldGroups, $newGroups, $reason ) {
-               $log = new LogPage( 'rights' );
-
-               $log->addEntry( 'rights',
-                       $user->getUserPage(),
-                       $reason,
-                       array(
-                               $this->makeGroupNameListForLog( $oldGroups ),
-                               $this->makeGroupNameListForLog( $newGroups )
-                       )
-               );
+               $logEntry = new ManualLogEntry( 'rights', 'rights' );
+               $logEntry->setPerformer( $this->getUser() );
+               $logEntry->setTarget( $user->getUserPage() );
+               $logEntry->setComment( $reason );
+               $logEntry->setParameters( array(
+                       '4::oldgroups' => $oldGroups,
+                       '5::newgroups' => $newGroups,
+               ) );
+               $logid = $logEntry->insert();
+               $logEntry->publish( $logid );
        }
 
        /**
@@ -354,7 +355,16 @@ class UserrightsPage extends SpecialPage {
                }
        }
 
+       /**
+        * Make a list of group names to be stored as parameter for log entries
+        *
+        * @deprecated in 1.21; use LogFormatter instead.
+        * @param $ids array
+        * @return string
+        */
        function makeGroupNameListForLog( $ids ) {
+               wfDeprecated( __METHOD__, '1.21' );
+
                if( empty( $ids ) ) {
                        return '';
                } else {
@@ -409,27 +419,41 @@ class UserrightsPage extends SpecialPage {
         */
        protected function showEditUserGroupsForm( $user, $groups ) {
                $list = array();
+               $membersList = array();
                foreach( $groups as $group ) {
                        $list[] = self::buildGroupLink( $group );
+                       $membersList[] = self::buildGroupMemberLink( $group );
                }
 
-               $autolist = array();
+               $autoList = array();
+               $autoMembersList = array();
                if ( $user instanceof User ) {
                        foreach( Autopromote::getAutopromoteGroups( $user ) as $group ) {
-                               $autolist[] = self::buildGroupLink( $group );
+                               $autoList[] = self::buildGroupLink( $group );
+                               $autoMembersList[] = self::buildGroupMemberLink( $group );
                        }
                }
 
+               $language = $this->getLanguage();
+               $displayedList = $this->msg( 'userrights-groupsmember-type',
+                       $language->listToText( $list ),
+                       $language->listToText( $membersList )
+               )->plain();
+               $displayedAutolist = $this->msg( 'userrights-groupsmember-type',
+                       $language->listToText( $autoList ),
+                       $language->listToText( $autoMembersList )
+               )->plain();
+
                $grouplist = '';
                $count = count( $list );
-               if( $count > 0 ) {
+               if ( $count > 0 ) {
                        $grouplist = $this->msg( 'userrights-groupsmember', $count, $user->getName() )->parse();
-                       $grouplist = '<p>' . $grouplist  . ' ' . $this->getLanguage()->listToText( $list ) . "</p>\n";
+                       $grouplist = '<p>' . $grouplist  . ' ' . $displayedList . "</p>\n";
                }
-               $count = count( $autolist );
-               if( $count > 0 ) {
+               $count = count( $autoList );
+               if ( $count > 0 ) {
                        $autogrouplistintro = $this->msg( 'userrights-groupsmember-auto', $count, $user->getName() )->parse();
-                       $grouplist .= '<p>' . $autogrouplistintro  . ' ' . $this->getLanguage()->listToText( $autolist ) . "</p>\n";
+                       $grouplist .= '<p>' . $autogrouplistintro  . ' ' . $displayedAutolist . "</p>\n";
                }
 
                $userToolLinks = Linker::userToolLinks(
@@ -479,10 +503,17 @@ class UserrightsPage extends SpecialPage {
         * @return string
         */
        private static function buildGroupLink( $group ) {
-               static $cache = array();
-               if( !isset( $cache[$group] ) )
-                       $cache[$group] = User::makeGroupLinkHtml( $group, htmlspecialchars( User::getGroupName( $group ) ) );
-               return $cache[$group];
+               return User::makeGroupLinkHtml( $group, User::getGroupName( $group ) );
+       }
+
+       /**
+        * Format a link to a group member description page
+        *
+        * @param $group string
+        * @return string
+        */
+       private static function buildGroupMemberLink( $group ) {
+               return User::makeGroupLinkHtml( $group, User::getGroupMember( $group ) );
        }
 
        /**
@@ -534,7 +565,7 @@ class UserrightsPage extends SpecialPage {
                }
 
                # Build the HTML table
-               $ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
+               $ret .= Xml::openElement( 'table', array( 'class' => 'mw-userrights-groups' ) ) .
                        "<tr>\n";
                foreach( $columns as $name => $column ) {
                        if( $column === array() )
index fbc2c93..0ff5fc9 100644 (file)
@@ -48,29 +48,43 @@ class SpecialVersion extends SpecialPage {
         * main()
         */
        public function execute( $par ) {
-               global $wgSpecialVersionShowHooks;
+               global $wgSpecialVersionShowHooks, $IP;
 
                $this->setHeaders();
                $this->outputHeader();
                $out = $this->getOutput();
                $out->allowClickjacking();
 
-               $text =
-                       $this->getMediaWikiCredits() .
-                       $this->softwareInformation() .
-                       $this->getEntryPointInfo() .
-                       $this->getExtensionCredits();
-               if ( $wgSpecialVersionShowHooks ) {
-                       $text .= $this->getWgHooks();
-               }
+               if( $par !== 'Credits' ) {
+                       $text =
+                               $this->getMediaWikiCredits() .
+                               $this->softwareInformation() .
+                               $this->getEntryPointInfo() .
+                               $this->getExtensionCredits();
+                       if ( $wgSpecialVersionShowHooks ) {
+                               $text .= $this->getWgHooks();
+                       }
 
-               $out->addWikiText( $text );
-               $out->addHTML( $this->IPInfo() );
+                       $out->addWikiText( $text );
+                       $out->addHTML( $this->IPInfo() );
 
-               if ( $this->getRequest()->getVal( 'easteregg' ) ) {
-                       if ( $this->showEasterEgg() ) {
-                               // TODO: put something interesting here
+                       if ( $this->getRequest()->getVal( 'easteregg' ) ) {
+                               if ( $this->showEasterEgg() ) {
+                                       // TODO: put something interesting here
+                               }
                        }
+               } else {
+                       // Credits sub page
+
+                       // Header
+                       $out->addHTML( wfMessage( 'version-credits-summary' )->parseAsBlock() );
+
+                       $wikiText = file_get_contents( $IP . '/CREDITS' );
+
+                       // Take everything from the first section onwards, to remove the (not localized) header
+                       $wikiText = substr( $wikiText, strpos( $wikiText, '==' ) );
+
+                       $out->addWikiText( $wikiText );
                }
        }
 
@@ -83,7 +97,7 @@ class SpecialVersion extends SpecialPage {
                $ret = Xml::element( 'h2', array( 'id' => 'mw-version-license' ), wfMessage( 'version-license' )->text() );
 
                // This text is always left-to-right.
-               $ret .= '<div>';
+               $ret .= '<div class="plainlinks">';
                $ret .= "__NOTOC__
                " . self::getCopyrightAndAuthorList() . "\n
                " . wfMessage( 'version-license-info' )->text();
@@ -108,8 +122,10 @@ 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',
-                       'Timo Tijhof',
-                       wfMessage( 'version-poweredby-others' )->text()
+                       'Timo Tijhof', 'Daniel Kinzler', 'Jeroen De Dauw',
+                       '[[Special:Version/Credits|' .
+                       wfMessage( 'version-poweredby-others' )->text() .
+                       ']]'
                );
 
                return wfMessage( 'version-poweredby-credits', date( 'Y' ),
@@ -136,7 +152,7 @@ class SpecialVersion extends SpecialPage {
                wfRunHooks( 'SoftwareInfo', array( &$software ) );
 
                $out = Xml::element( 'h2', array( 'id' => 'mw-version-software' ), wfMessage( 'version-software' )->text() ) .
-                          Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-software' ) ) .
+                          Xml::openElement( 'table', array( 'class' => 'wikitable plainlinks', 'id' => 'sv-software' ) ) .
                                "<tr>
                                        <th>" . wfMessage( 'version-software-product' )->text() . "</th>
                                        <th>" . wfMessage( 'version-software-version' )->text() . "</th>
@@ -220,7 +236,7 @@ class SpecialVersion extends SpecialPage {
         * @return string wgVersion + a link to subversion revision of svn BASE
         */
        private static function getVersionLinkedSvn() {
-               global $wgVersion, $IP;
+               global $IP;
 
                $info = self::getSvnInfo( $IP );
                if( !isset( $info['checkout-rev'] ) ) {
@@ -234,19 +250,33 @@ class SpecialVersion extends SpecialPage {
                )->text();
 
                if ( isset( $info['viewvc-url'] ) ) {
-                       $version = "$wgVersion [{$info['viewvc-url']} $linkText]";
+                       $version = "[{$info['viewvc-url']} $linkText]";
                } else {
-                       $version = "$wgVersion $linkText";
+                       $version = $linkText;
                }
 
-               return $version;
+               return self::getwgVersionLinked() . " $version";
+       }
+
+       /**
+        * @return string
+        */
+       private static function getwgVersionLinked() {
+               global $wgVersion;
+               $versionUrl = "";
+               if( wfRunHooks( 'SpecialVersionVersionUrl', array( $wgVersion, &$versionUrl ) ) ) {
+                       $versionParts = array();
+                       preg_match( "/^(\d+\.\d+)/", $wgVersion, $versionParts );
+                       $versionUrl = "https://www.mediawiki.org/wiki/MediaWiki_{$versionParts[1]}";
+               }
+               return "[$versionUrl $wgVersion]";
        }
 
        /**
         * @return bool|string wgVersion + HEAD sha1 stripped to the first 7 chars. False on failure
         */
        private static function getVersionLinkedGit() {
-               global $wgVersion, $IP;
+               global $IP;
 
                $gitInfo = new GitInfo( $IP );
                $headSHA1 = $gitInfo->getHeadSHA1();
@@ -259,7 +289,7 @@ class SpecialVersion extends SpecialPage {
                if ( $viewerUrl !== false ) {
                        $shortSHA1 = "[$viewerUrl $shortSHA1]";
                }
-               return "$wgVersion $shortSHA1";
+               return self::getwgVersionLinked() . " $shortSHA1";
        }
 
        /**
@@ -327,7 +357,7 @@ class SpecialVersion extends SpecialPage {
                wfRunHooks( 'SpecialVersionExtensionTypes', array( &$this, &$extensionTypes ) );
 
                $out = Xml::element( 'h2', array( 'id' => 'mw-version-ext' ), $this->msg( 'version-extensions' )->text() ) .
-                       Xml::openElement( 'table', array( 'class' => 'wikitable', 'id' => 'sv-ext' ) );
+                       Xml::openElement( 'table', array( 'class' => 'wikitable plainlinks', 'id' => 'sv-ext' ) );
 
                // Make sure the 'other' type is set to an array.
                if ( !array_key_exists( 'other', $wgExtensionCredits ) ) {
@@ -759,11 +789,23 @@ class SpecialVersion extends SpecialPage {
                        'version-entrypoints-load-php' => wfScript( 'load' ),
                );
 
+               $language = $this->getLanguage();
+               $thAttribures = array(
+                       'dir' => $language->getDir(),
+                       'lang' => $language->getCode()
+               );
                $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( 'table',
+                               array(
+                                       'class' => 'wikitable plainlinks',
+                                       'id' => 'mw-version-entrypoints-table',
+                                       'dir' => 'ltr',
+                                       'lang' => 'en'
+                               )
+                       ) .
                        Html::openElement( 'tr' ) .
-                       Html::element( 'th', array(), $this->msg( 'version-entrypoints-header-entrypoint' )->text() ) .
-                       Html::element( 'th', array(), $this->msg( 'version-entrypoints-header-url' )->text() ) .
+                       Html::element( 'th', $thAttribures, $this->msg( 'version-entrypoints-header-entrypoint' )->text() ) .
+                       Html::element( 'th', $thAttribures, $this->msg( 'version-entrypoints-header-url' )->text() ) .
                        Html::closeElement( 'tr' );
 
                foreach ( $entryPoints as $message => $value ) {
index f52f7bb..ddeb4a1 100644 (file)
@@ -42,7 +42,7 @@ class WantedFilesPage extends WantedQueryPage {
                $catMessage = $this->msg( 'broken-file-category' )
                        ->title( Title::newFromText( "Wanted Files", NS_MAIN ) )
                        ->inContentLanguage();
-               
+
                if ( !$catMessage->isDisabled() ) {
                        $category = Title::makeTitleSafe( NS_CATEGORY, $catMessage->text() );
                } else {
index dec123d..05df400 100644 (file)
@@ -27,7 +27,7 @@
  * @ingroup SpecialPage
  */
 class WantedPagesPage extends WantedQueryPage {
-       
+
        function __construct( $name = 'Wantedpages' ) {
                parent::__construct( $name );
        }
index 5dfc113..688e0a5 100644 (file)
@@ -272,7 +272,7 @@ class SpecialWatchlist extends SpecialPage {
                $form .= '<hr />';
 
                $tables = array( 'recentchanges', 'watchlist' );
-               $fields = array( $dbr->tableName( 'recentchanges' ) . '.*' );
+               $fields = RecentChange::selectFields();
                $join_conds = array(
                        'watchlist' => array(
                                'INNER JOIN',
index 98727f1..6e1094f 100644 (file)
@@ -40,7 +40,7 @@ class UsercreateTemplate extends QuickTemplate {
                        'helptext' => $helptext,
                );
        }
-       
+
        function execute() {
                if( $this->data['message'] ) {
 ?>
@@ -187,9 +187,9 @@ class UsercreateTemplate extends QuickTemplate {
                if ( isset( $this->data['extraInput'] ) && is_array( $this->data['extraInput'] ) ) {
                        foreach ( $this->data['extraInput'] as $inputItem ) { ?>
                <tr>
-                       <?php 
+                       <?php
                                if ( !empty( $inputItem['msg'] ) && $inputItem['type'] != 'checkbox' ) {
-                                       ?><td class="mw-label"><label for="<?php 
+                                       ?><td class="mw-label"><label for="<?php
                                        echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
                                        $this->msgWiki( $inputItem['msg'] ) ?></label><?php
                                } else {
@@ -200,17 +200,17 @@ class UsercreateTemplate extends QuickTemplate {
                                <input type="<?php echo htmlspecialchars( $inputItem['type'] ) ?>" name="<?php
                                echo htmlspecialchars( $inputItem['name'] ); ?>"
                                        tabindex="<?php echo $tabIndex++; ?>"
-                                       value="<?php 
+                                       value="<?php
                                if ( $inputItem['type'] != 'checkbox' ) {
                                        echo htmlspecialchars( $inputItem['value'] );
                                } else {
                                        echo '1';
-                               }                                       
+                               }
                                        ?>" id="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"
-                                       <?php 
+                                       <?php
                                if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['value'] ) )
-                                       echo 'checked="checked"'; 
-                                       ?> /> <?php 
+                                       echo 'checked="checked"';
+                                       ?> /> <?php
                                        if ( $inputItem['type'] == 'checkbox' && !empty( $inputItem['msg'] ) ) {
                                                ?>
                                <label for="<?php echo htmlspecialchars( $inputItem['name'] ); ?>"><?php
@@ -224,8 +224,7 @@ class UsercreateTemplate extends QuickTemplate {
                                <?php } ?>
                        </td>
                </tr>
-<?php                          
-                               
+<?php
                        }
                }
 ?>
index a3f6a38..182992a 100644 (file)
@@ -25,8 +25,6 @@
  * @defgroup Templates Templates
  */
 
-if( !defined( 'MEDIAWIKI' ) ) die( -1 );
-
 /**
  * HTML template for Special:Userlogin form
  * @ingroup Templates
index aa333fc..6c94729 100644 (file)
@@ -16,4 +16,7 @@ quiet: yes
 quote-nbsp: yes
 fix-backslash: no
 fix-uri: no
-new-inline-tags: video,audio,source,track,bdi
+# Don't strip html5 elements we support
+# html-{meta,link} is a hack we use to prevent Tidy from stripping <meta> and <link> used in the body for Microdata
+new-empty-tags: html-meta, html-link
+new-inline-tags: video, audio, source, track, bdi, data, time, mark
diff --git a/includes/upload/AssembleUploadChunks.php b/includes/upload/AssembleUploadChunks.php
new file mode 100644 (file)
index 0000000..d5ce78d
--- /dev/null
@@ -0,0 +1,103 @@
+<?php
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+require_once( __DIR__ . '/../../maintenance/Maintenance.php' );
+
+/**
+ * Assemble the segments of a chunked upload.
+ *
+ * @ingroup Maintenance
+ */
+class AssembleUploadChunks extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Re-assemble the segments of a chunked upload into a single file";
+               $this->addOption( 'filename', "Desired file name", true, true );
+               $this->addOption( 'filekey', "Upload stash file key", true, true );
+               $this->addOption( 'userid', "Upload owner user ID", true, true );
+               $this->addOption( 'sessionid', "Upload owner session ID", true, true );
+       }
+
+       public function execute() {
+               wfSetupSession( $this->getOption( 'sessionid' ) );
+               try {
+                       $user = User::newFromId( $this->getOption( 'userid' ) );
+                       if ( !$user ) {
+                               throw new MWException( "No user with ID " . $this->getOption( 'userid' ) . "." );
+                       }
+
+                       $upload = new UploadFromChunks( $user );
+                       $upload->continueChunks(
+                               $this->getOption( 'filename' ),
+                               $this->getOption( 'filekey' ),
+                               RequestContext::getMain()->getRequest() // dummy request
+                       );
+
+                       // Combine all of the chunks into a local file and upload that to a new stash file
+                       $status = $upload->concatenateChunks();
+                       if ( !$status->isGood() ) {
+                               UploadBase::setSessionStatus(
+                                       $this->getOption( 'filekey' ),
+                                       array( 'result' => 'Failure', 'status' => $status )
+                               );
+                               $this->error( $status->getWikiText() . "\n", 1 ); // die
+                       }
+
+                       // We have a new filekey for the fully concatenated file
+                       $newFileKey = $upload->getLocalFile()->getFileKey();
+
+                       // Remove the old stash file row and first chunk file
+                       $upload->stash->removeFileNoAuth( $this->getOption( 'filekey' ) );
+
+                       // Build the image info array while we have the local reference handy
+                       $apiMain = new ApiMain(); // dummy object (XXX)
+                       $imageInfo = $upload->getImageInfo( $apiMain->getResult() );
+
+                       // Cleanup any temporary local file
+                       $upload->cleanupTempFile();
+
+                       // Cache the info so the user doesn't have to wait forever to get the final info
+                       UploadBase::setSessionStatus(
+                               $this->getOption( 'filekey' ),
+                               array(
+                                       'result'    => 'Success',
+                                       'filekey'   => $newFileKey,
+                                       'imageinfo' => $imageInfo,
+                                       'status'    => Status::newGood()
+                               )
+                       );
+               } catch ( MWException $e ) {
+                       UploadBase::setSessionStatus(
+                               $this->getOption( 'filekey' ),
+                               array(
+                                       'result' => 'Failure',
+                                       'status' => Status::newFatal( 'api-error-stashfailed' )
+                               )
+                       );
+                       throw $e;
+               }
+               session_write_close();
+       }
+}
+
+$maintClass = "AssembleUploadChunks";
+require_once( RUN_MAINTENANCE_IF_MAIN );
index d40b53d..02cf8fd 100644 (file)
@@ -63,6 +63,8 @@ abstract class UploadBase {
        const WINDOWS_NONASCII_FILENAME = 13;
        const FILENAME_TOO_LONG = 14;
 
+       const SESSION_STATUS_KEY = 'wsUploadStatusData';
+
        /**
         * @param $error int
         * @return string
@@ -244,7 +246,7 @@ abstract class UploadBase {
                        // @TODO: just make uploads work with storage paths
                        // UploadFromStash loads files via virtuals URLs
                        $tmpFile = $repo->getLocalCopy( $srcPath );
-                       $tmpFile->bind( $this ); // keep alive with $thumb
+                       $tmpFile->bind( $this ); // keep alive with $this
                        wfProfileOut( __METHOD__ );
                        return $tmpFile->getPath();
                }
@@ -785,13 +787,14 @@ abstract class UploadBase {
         * This method returns the file object, which also has a 'fileKey' property which can be passed through a form or
         * API request to find this stashed file again.
         *
+        * @param $user User
         * @return UploadStashFile stashed file
         */
-       public function stashFile() {
+       public function stashFile( User $user = null ) {
                // was stashSessionFile
                wfProfileIn( __METHOD__ );
 
-               $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash();
+               $stash = RepoGroup::singleton()->getLocalRepo()->getUploadStash( $user );
                $file = $stash->stashFile( $this->mTempPath, $this->getSourceType() );
                $this->mLocalFile = $file;
 
@@ -1494,6 +1497,28 @@ abstract class UploadBase {
                } else {
                        return intval( $wgMaxUploadSize );
                }
+       }
 
+       /**
+        * Get the current status of a chunked upload (used for polling).
+        * The status will be read from the *current* user session.
+        * @param $statusKey string
+        * @return Array|bool
+        */
+       public static function getSessionStatus( $statusKey ) {
+               return isset( $_SESSION[self::SESSION_STATUS_KEY][$statusKey] )
+                       ? $_SESSION[self::SESSION_STATUS_KEY][$statusKey]
+                       : false;
+       }
+
+       /**
+        * Set the current status of a chunked upload (used for polling).
+        * The status will be stored in the *current* user session.
+        * @param $statusKey string
+        * @param $value array|false
+        * @return void
+        */
+       public static function setSessionStatus( $statusKey, $value ) {
+               $_SESSION[self::SESSION_STATUS_KEY][$statusKey] = $value;
        }
 }
index 0542bba..2b0128b 100644 (file)
@@ -37,7 +37,7 @@ class UploadFromChunks extends UploadFromFile {
         * @param $stash UploadStash
         * @param $repo FileRepo
         */
-       public function __construct( $user = false, $stash = false, $repo = false ) {
+       public function __construct( $user = null, $stash = false, $repo = false ) {
                // user object. sometimes this won't exist, as when running from cron.
                $this->user = $user;
 
@@ -60,6 +60,7 @@ class UploadFromChunks extends UploadFromFile {
 
                return true;
        }
+
        /**
         * Calls the parent stashFile and updates the uploadsession table to handle "chunks"
         *
@@ -76,7 +77,7 @@ class UploadFromChunks extends UploadFromFile {
                $this->mFileKey = $this->mLocalFile->getFileKey();
 
                // Output a copy of this first to chunk 0 location:
-               $status = $this->outputChunk( $this->mLocalFile->getPath() );
+               $this->outputChunk( $this->mLocalFile->getPath() );
 
                // Update db table to reflect initial "chunk" state
                $this->updateChunkStatus();
@@ -120,17 +121,24 @@ class UploadFromChunks extends UploadFromFile {
                // Get a 0-byte temp file to perform the concatenation at
                $tmpFile = TempFSFile::factory( 'chunkedupload_', $ext );
                $tmpPath = $tmpFile
-                       ? $tmpFile->getPath()
+                       ? $tmpFile->bind( $this )->getPath() // keep alive with $this
                        : false; // fail in concatenate()
                // Concatenate the chunks at the temp file
+               $tStart = microtime( true );
                $status = $this->repo->concatenate( $fileList, $tmpPath, FileRepo::DELETE_SOURCE );
+               $tAmount = microtime( true ) - $tStart;
                if( !$status->isOk() ){
                        return $status;
                }
+               wfDebugLog( 'fileconcatenate', "Combined $i chunks in $tAmount seconds.\n" );
                // Update the mTempPath and mLocalFile
                // ( for FileUpload or normal Stash to take over )
                $this->mTempPath = $tmpPath; // file system path
-               $this->mLocalFile = parent::stashFile();
+               $tStart = microtime( true );
+               $this->mLocalFile = parent::stashFile( $this->user );
+               $tAmount = microtime( true ) - $tStart;
+               $this->mLocalFile->setLocalReference( $tmpFile ); // reuse (e.g. for getImageInfo())
+               wfDebugLog( 'fileconcatenate', "Stashed combined file ($i chunks) in $tAmount seconds.\n" );
 
                return $status;
        }
@@ -203,6 +211,9 @@ class UploadFromChunks extends UploadFromFile {
                                        $this->getOffset() . ' inx:' . $this->getChunkIndex() . "\n" );
 
                $dbw = $this->repo->getMasterDb();
+               // Use a quick transaction since we will upload the full temp file into shared
+               // storage, which takes time for large files. We don't want to hold locks then.
+               $dbw->begin( __METHOD__ );
                $dbw->update(
                        'uploadstash',
                        array(
@@ -213,6 +224,7 @@ class UploadFromChunks extends UploadFromFile {
                        array( 'us_key' => $this->mFileKey ),
                        __METHOD__
                );
+               $dbw->commit( __METHOD__ );
        }
 
        /**
index aa0cc77..ab2a7a3 100644 (file)
@@ -79,21 +79,21 @@ class UploadFromFile extends UploadBase {
         * @return array
         */
        public function verifyUpload() {
-               # Check for a post_max_size or upload_max_size overflow, so that a 
+               # Check for a post_max_size or upload_max_size overflow, so that a
                # proper error can be shown to the user
                if ( is_null( $this->mTempPath ) || $this->isEmptyFile() ) {
                        if ( $this->mUpload->isIniSizeOverflow() ) {
-                               return array( 
+                               return array(
                                        'status' => UploadBase::FILE_TOO_LARGE,
-                                       'max' => min( 
-                                               self::getMaxUploadSize( $this->getSourceType() ), 
-                                               wfShorthandToInteger( ini_get( 'upload_max_filesize' ) ), 
+                                       'max' => min(
+                                               self::getMaxUploadSize( $this->getSourceType() ),
+                                               wfShorthandToInteger( ini_get( 'upload_max_filesize' ) ),
                                                wfShorthandToInteger( ini_get( 'post_max_size' ) )
                                        ),
                                );
                        }
                }
-               
+
                return parent::verifyUpload();
        }
 }
index 607965f..55209d4 100644 (file)
@@ -98,7 +98,7 @@ class UploadFromStash extends UploadBase {
                 */
                $metadata = $this->stash->getMetadata( $key );
                $this->initializePathInfo( $name,
-                       $this->getRealPath ( $metadata['us_path'] ),
+                       $this->getRealPath( $metadata['us_path'] ),
                        $metadata['us_size'],
                        false
                );
index c11d719..7f430c5 100644 (file)
@@ -61,6 +61,8 @@ class UploadFromUrl extends UploadBase {
 
        /**
         * Checks whether the URL is for an allowed host
+        * The domains in the whitelist can include wildcard characters (*) in place
+        * of any of the domain levels, e.g. '*.flickr.com' or 'upload.*.gov.uk'.
         *
         * @param $url string
         * @return bool
@@ -76,10 +78,28 @@ class UploadFromUrl extends UploadBase {
                }
                $valid = false;
                foreach( $wgCopyUploadsDomains as $domain ) {
+                       // See if the domain for the upload matches this whitelisted domain
+                       $whitelistedDomainPieces = explode( '.', $domain );
+                       $uploadDomainPieces = explode( '.', $parsedUrl['host'] );
+                       if ( count( $whitelistedDomainPieces ) === count( $uploadDomainPieces ) ) {
+                               $valid = true;
+                               // See if all the pieces match or not (excluding wildcards)
+                               foreach ( $whitelistedDomainPieces as $index => $piece ) {
+                                       if ( $piece !== '*' && $piece !== $uploadDomainPieces[$index] ) {
+                                               $valid = false;
+                                       }
+                               }
+                               if ( $valid ) {
+                                       // We found a match, so quit comparing against the list
+                                       break;
+                               }
+                       }
+                       /* Non-wildcard test
                        if ( $parsedUrl['host'] === $domain ) {
                                $valid = true;
                                break;
                        }
+                       */
                }
                return $valid;
        }
@@ -207,9 +227,14 @@ class UploadFromUrl extends UploadBase {
                $this->mRemoveTempFile = true;
                $this->mFileSize = 0;
 
-               $req = MWHttpRequest::factory( $this->mUrl, array(
+               $options = array(
                        'followRedirects' => true
-               ) );
+               );
+               global $wgCopyUploadProxy;
+               if ( $wgCopyUploadProxy !== false ) {
+                       $options['proxy'] = $wgCopyUploadProxy;
+               }
+               $req = MWHttpRequest::factory( $this->mUrl, $options );
                $req->setCallback( array( $this, 'saveTempFileChunk' ) );
                $status = $req->execute();
 
index c7fd23a..d91649c 100644 (file)
@@ -106,15 +106,13 @@ class UploadStash {
         * @return UploadStashFile
         */
        public function getFile( $key, $noAuth = false ) {
-
                if ( ! preg_match( self::KEY_FORMAT_REGEX, $key ) ) {
                        throw new UploadStashBadPathException( "key '$key' is not in a proper format" );
                }
 
-               if ( !$noAuth ) {
-                       if ( !$this->isLoggedIn ) {
-                               throw new UploadStashNotLoggedInException( __METHOD__ . ' No user is logged in, files must belong to users' );
-                       }
+               if ( !$noAuth && !$this->isLoggedIn ) {
+                       throw new UploadStashNotLoggedInException( __METHOD__ .
+                               ' No user is logged in, files must belong to users' );
                }
 
                if ( !isset( $this->fileMetadata[$key] ) ) {
@@ -131,8 +129,13 @@ class UploadStash {
                        $this->initFile( $key );
 
                        // fetch fileprops
-                       $path = $this->fileMetadata[$key]['us_path'];
-                       $this->fileProps[$key] = $this->repo->getFileProps( $path );
+                       if ( strlen( $this->fileMetadata[$key]['us_props'] ) ) {
+                               $this->fileProps[$key] = unserialize( $this->fileMetadata[$key]['us_props'] );
+                       } else { // b/c for rows with no us_props
+                               wfDebug( __METHOD__ . " fetched props for $key from file\n" );
+                               $path = $this->fileMetadata[$key]['us_path'];
+                               $this->fileProps[$key] = $this->repo->getFileProps( $path );
+                       }
                }
 
                if ( ! $this->files[$key]->exists() ) {
@@ -152,7 +155,7 @@ class UploadStash {
        /**
         * Getter for file metadata.
         *
-        * @param key String: key under which file information is stored
+        * @param $key String: key under which file information is stored
         * @return Array
         */
        public function getMetadata ( $key ) {
@@ -163,7 +166,7 @@ class UploadStash {
        /**
         * Getter for fileProps
         *
-        * @param key String: key under which file information is stored
+        * @param $key String: key under which file information is stored
         * @return Array
         */
        public function getFileProps ( $key ) {
@@ -182,7 +185,7 @@ class UploadStash {
         * @return UploadStashFile: file, or null on failure
         */
        public function stashFile( $path, $sourceType = null ) {
-               if ( ! file_exists( $path ) ) {
+               if ( !is_file( $path ) ) {
                        wfDebug( __METHOD__ . " tried to stash file at '$path', but it doesn't exist\n" );
                        throw new UploadStashBadPathException( "path doesn't exist" );
                }
@@ -192,12 +195,10 @@ class UploadStash {
                // we will be initializing from some tmpnam files that don't have extensions.
                // most of MediaWiki assumes all uploaded files have good extensions. So, we fix this.
                $extension = self::getExtensionForPath( $path );
-               if ( ! preg_match( "/\\.\\Q$extension\\E$/", $path ) ) {
+               if ( !preg_match( "/\\.\\Q$extension\\E$/", $path ) ) {
                        $pathWithGoodExtension = "$path.$extension";
-                       if ( ! rename( $path, $pathWithGoodExtension ) ) {
-                               throw new UploadStashFileException( "couldn't rename $path to have a better extension at $pathWithGoodExtension" );
-                       }
-                       $path = $pathWithGoodExtension;
+               } else {
+                       $pathWithGoodExtension = $path;
                }
 
                // If no key was supplied, make one.  a mysql insertid would be totally reasonable here, except
@@ -221,7 +222,7 @@ class UploadStash {
                wfDebug( __METHOD__ . " key for '$path': $key\n" );
 
                // if not already in a temporary area, put it there
-               $storeStatus = $this->repo->storeTemp( basename( $path ), $path );
+               $storeStatus = $this->repo->storeTemp( basename( $pathWithGoodExtension ), $path );
 
                if ( ! $storeStatus->isOK() ) {
                        // It is a convention in MediaWiki to only return one error per API exception, even if multiple errors
@@ -244,9 +245,6 @@ class UploadStash {
                }
                $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' );
@@ -262,6 +260,7 @@ class UploadStash {
                        'us_key' => $key,
                        'us_orig_path' => $path,
                        'us_path' => $stashPath, // virtual URL
+                       'us_props' => serialize( $fileProps ),
                        'us_size' => $fileProps['size'],
                        'us_sha1' => $fileProps['sha1'],
                        'us_mime' => $fileProps['mime'],
@@ -319,8 +318,8 @@ class UploadStash {
        /**
         * Remove a particular file from the stash.  Also removes it from the repo.
         *
-        * @throws UploadStashNotLoggedInException
-        * @throws UploadStashWrongOwnerException
+        * @param $key
+        * @throws UploadStashNoSuchKeyException|UploadStashNotLoggedInException|UploadStashWrongOwnerException
         * @return boolean: success
         */
        public function removeFile( $key ) {
@@ -361,14 +360,11 @@ class UploadStash {
 
                $dbw = $this->repo->getMasterDb();
 
-               // this gets its own transaction since it's called serially by the cleanupUploadStash maintenance script
-               $dbw->begin( __METHOD__ );
                $dbw->delete(
                        'uploadstash',
                        array( 'us_key' => $key ),
                        __METHOD__
                );
-               $dbw->commit( __METHOD__ );
 
                // TODO: look into UnregisteredLocalFile and find out why the rv here is sometimes wrong (false when file was removed)
                // for now, ignore.
@@ -419,6 +415,8 @@ class UploadStash {
         * with an extension.
         * XXX this is somewhat redundant with the checks that ApiUpload.php does with incoming
         * uploads versus the desired filename. Maybe we can get that passed to us...
+        * @param $path
+        * @throws UploadStashFileException
         * @return string
         */
        public static function getExtensionForPath( $path ) {
index fd603ce..1342066 100755 (executable)
@@ -30,10 +30,10 @@ def unichr3( *args ):
     return [unichr( int( i[2:7], 16 ) ) for i in args if i[2:7]]
 
 # DEFINE
-UNIHAN_VER = '5.2.0'
+UNIHAN_VER = '6.2.0'
 SF_MIRROR = 'dfn'
-SCIM_TABLES_VER = '0.5.10'
-SCIM_PINYIN_VER = '0.5.91'
+SCIM_TABLES_VER = '0.5.11'
+SCIM_PINYIN_VER = '0.5.92'
 LIBTABE_VER = '0.2.3'
 # END OF DEFINE
 
index 40d1f36..a72f98f 100644 (file)
@@ -48,12 +48,13 @@ class FakeConverter {
        /**
         * @var Language
         */
-       var $mLang;
+       public $mLang;
        function __construct( $langobj ) { $this->mLang = $langobj; }
        function autoConvertToAllVariants( $text ) { return array( $this->mLang->getCode() => $text ); }
        function convert( $t ) { return $t; }
        function convertTo( $text, $variant ) { return $text; }
        function convertTitle( $t ) { return $t->getPrefixedText(); }
+       function convertNamespace( $ns ) { return $this->mLang->getFormattedNsText( $ns ); }
        function getVariants() { return array( $this->mLang->getCode() ); }
        function getPreferredVariant() { return $this->mLang->getCode(); }
        function getDefaultVariant() { return $this->mLang->getCode(); }
@@ -77,21 +78,21 @@ class Language {
        /**
         * @var LanguageConverter
         */
-       var $mConverter;
+       public $mConverter;
 
-       var $mVariants, $mCode, $mLoaded = false;
-       var $mMagicExtensions = array(), $mMagicHookDone = false;
+       public $mVariants, $mCode, $mLoaded = false;
+       public $mMagicExtensions = array(), $mMagicHookDone = false;
        private $mHtmlCode = null;
 
-       var $dateFormatStrings = array();
-       var $mExtendedSpecialPageAliases;
+       public $dateFormatStrings = array();
+       public $mExtendedSpecialPageAliases;
 
        protected $namespaceNames, $mNamespaceIds, $namespaceAliases;
 
        /**
         * ReplacementArray object caches
         */
-       var $transformData = array();
+       public $transformData = array();
 
        /**
         * @var LocalisationCache
@@ -276,7 +277,7 @@ class Language {
                        throw new MWException( __METHOD__ . " must be passed a string, $type given$addmsg" );
                }
 
-               return preg_match( '/^[a-z0-9-]+$/i', $code );
+               return (bool)preg_match( '/^[a-z0-9-]+$/i', $code );
        }
 
        /**
@@ -356,7 +357,7 @@ class Language {
         * @deprecated in 1.19
         */
        function getFallbackLanguageCode() {
-               wfDeprecated( __METHOD__ );
+               wfDeprecated( __METHOD__, '1.19' );
                return self::getFallbackFor( $this->mCode );
        }
 
@@ -419,6 +420,16 @@ class Language {
         */
        public function setNamespaces( array $namespaces ) {
                $this->namespaceNames = $namespaces;
+               $this->mNamespaceIds = null;
+       }
+
+       /**
+        * Resets all of the namespace caches. Mainly used for testing
+        */
+       public function resetNamespaces( ) {
+               $this->namespaceNames = null;
+               $this->mNamespaceIds = null;
+               $this->namespaceAliases = null;
        }
 
        /**
@@ -3409,6 +3420,18 @@ class Language {
                if ( !count( $forms ) ) {
                        return '';
                }
+
+               // Handle explicit 0= and 1= forms
+               foreach ( $forms as $index => $form ) {
+                       if ( isset( $form[1] ) && $form[1] === '=' ) {
+                               if ( $form[0] === (string) $count ) {
+                                       return substr( $form, 2 );
+                               }
+                               unset( $forms[$index] );
+                       }
+               }
+               $forms = array_values( $forms );
+
                $pluralForm = $this->getPluralForm( $count );
                $pluralForm = min( $pluralForm, count( $forms ) - 1 );
                return $forms[$pluralForm];
@@ -3459,8 +3482,22 @@ class Language {
                                }
                        }
                }
-               // If all else fails, return the original string.
-               return $str;
+
+               // If all else fails, return a standard duration or timestamp description.
+               $time = strtotime( $str, 0 );
+               if ( $time === false ) { // Unknown format. Return it as-is in case.
+                       return $str;
+               } elseif ( $time !== strtotime( $str, 1 ) ) { // It's a relative timestamp.
+                       // $time is relative to 0 so it's a duration length.
+                       return $this->formatDuration( $time );
+               } else { // It's an absolute timestamp.
+                       if ( $time === 0 ) {
+                               // wfTimestamp() handles 0 as current time instead of epoch.
+                               return $this->timeanddate( '19700101000000' );
+                       } else {
+                               return $this->timeanddate( $time );
+                       }
+               }
        }
 
        /**
@@ -3524,6 +3561,16 @@ class Language {
                return $this->mConverter->convertTitle( $title );
        }
 
+       /**
+        * Convert a namespace index to a string in the preferred variant
+        *
+        * @param $ns int
+        * @return string
+        */
+       public function convertNamespace( $ns ) {
+               return $this->mConverter->convertNamespace( $ns );
+       }
+
        /**
         * Check if this is a language with variants
         *
@@ -3657,15 +3704,24 @@ class Language {
        }
 
        /**
-        * Enclose a string with the "no conversion" tag. This is used by
-        * various functions in the Parser
+        * Prepare external link text for conversion. When the text is
+        * a URL, it shouldn't be converted, and it'll be wrapped in
+        * the "raw" tag (-{R| }-) to prevent conversion.
         *
-        * @param $text String: text to be tagged for no conversion
-        * @param $noParse bool
+        * This function is called "markNoConversion" for historical
+        * reasons.
+        *
+        * @param $text String: text to be used for external link
+        * @param $noParse bool: wrap it without confirming it's a real URL first
         * @return string the tagged text
         */
        public function markNoConversion( $text, $noParse = false ) {
-               return $this->mConverter->markNoConversion( $text, $noParse );
+               // Excluding protocal-relative URLs may avoid many false positives.
+               if ( $noParse || preg_match( '/^(?:' . wfUrlProtocolsWithoutProtRel() . ')/', $text ) ) {
+                       return $this->mConverter->markNoConversion( $text );
+               } else {
+                       return $text;
+               }
        }
 
        /**
index 0db00f8..fed8835 100644 (file)
@@ -47,28 +47,28 @@ class LanguageConverter {
                'zh',
        );
 
-       var $mMainLanguageCode;
-       var $mVariants, $mVariantFallbacks, $mVariantNames;
-       var $mTablesLoaded = false;
-       var $mTables;
+       public $mMainLanguageCode;
+       public $mVariants, $mVariantFallbacks, $mVariantNames;
+       public $mTablesLoaded = false;
+       public $mTables;
        // 'bidirectional' 'unidirectional' 'disable' for each variant
-       var $mManualLevel;
+       public $mManualLevel;
 
        /**
         * @var String: memcached key name
         */
-       var $mCacheKey;
-
-       var $mLangObj;
-       var $mFlags;
-       var $mDescCodeSep = ':', $mDescVarSep = ';';
-       var $mUcfirst = false;
-       var $mConvRuleTitle = false;
-       var $mURLVariant;
-       var $mUserVariant;
-       var $mHeaderVariant;
-       var $mMaxDepth = 10;
-       var $mVarSeparatorPattern;
+       public $mCacheKey;
+
+       public $mLangObj;
+       public $mFlags;
+       public $mDescCodeSep = ':', $mDescVarSep = ';';
+       public $mUcfirst = false;
+       public $mConvRuleTitle = false;
+       public $mURLVariant;
+       public $mUserVariant;
+       public $mHeaderVariant;
+       public $mMaxDepth = 10;
+       public $mVarSeparatorPattern;
 
        const CACHE_VERSION_KEY = 'VERSION 6';
 
@@ -184,7 +184,7 @@ class LanguageConverter {
 
        /**
         * Get default variant.
-        * This function would not be affected by user's settings or headers
+        * This function would not be affected by user's settings
         * @return String: the default variant code
         */
        public function getDefaultVariant() {
@@ -192,6 +192,10 @@ class LanguageConverter {
 
                $req = $this->getURLVariant();
 
+               if ( !$req ) {
+                       $req = $this->getHeaderVariant();
+               }
+
                if ( $wgDefaultLanguageVariant && !$req ) {
                        $req = $this->validateVariant( $wgDefaultLanguageVariant );
                }
@@ -406,7 +410,7 @@ class LanguageConverter {
                                        $attr = $attrs[$attrName];
                                        // Don't convert URLs
                                        if ( !strpos( $attr, '://' ) ) {
-                                               $attr = $this->translate( $attr, $toVariant );
+                                               $attr = $this->convertTo( $attr, $toVariant );
                                        }
 
                                        // Remove HTML tags to avoid disrupting the layout
@@ -546,24 +550,41 @@ class LanguageConverter {
        public function convertTitle( $title ) {
                $variant = $this->getPreferredVariant();
                $index = $title->getNamespace();
-               if ( $index === NS_MAIN ) {
+               if ( $index !== NS_MAIN ) {
+                       $text = $this->convertNamespace( $index ) . ':';
+               } else {
                        $text = '';
+               }
+               $text .= $this->translate( $title->getText(), $variant );
+               return $text;
+       }
+
+       /**
+        * Get the namespace display name in the preferred variant.
+        *
+        * @param $index int namespace id
+        * @return String: namespace name for display
+        */
+       public function convertNamespace( $index ) {
+               $variant = $this->getPreferredVariant();
+               if ( $index === NS_MAIN ) {
+                       return '';
                } else {
-                       // first let's check if a message has given us a converted name
+                       // First check if a message gives a converted name in the target variant.
+                       $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inLanguage( $variant );
+                       if ( $nsConvMsg->exists() ) {
+                               return $nsConvMsg->plain();
+                       }
+                       // Then check if a message gives a converted name in content language
+                       // which needs extra translation to the target variant.
                        $nsConvMsg = wfMessage( 'conversion-ns' . $index )->inContentLanguage();
                        if ( $nsConvMsg->exists() ) {
-                               $text = $nsConvMsg->plain();
-                       } else {
-                               // the message does not exist, try retrieve it from the current
-                               // variant's namespace names.
-                               $langObj = $this->mLangObj->factory( $variant );
-                               $text = $langObj->getFormattedNsText( $index );
+                               return $this->translate( $nsConvMsg->plain(), $variant );
                        }
-                       $text .= ':';
+                       // No message exists, retrieve it from the target variant's namespace names.
+                       $langObj = $this->mLangObj->factory( $variant );
+                       return $langObj->getFormattedNsText( $index );
                }
-               $text .= $title->getText();
-               $text = $this->translate( $text, $variant );
-               return $text;
        }
 
        /**
@@ -805,9 +826,9 @@ class LanguageConverter {
        /**
         * Guess if a text is written in a variant. This should be implemented in subclasses.
         *
-        * @param string        $text the text to be checked
-        * @param string        $variant language code of the variant to be checked for
-        * @return bool true if $text appears to be written in $variant, false if not
+        * @param string $text the text to be checked
+        * @param string $variant language code of the variant to be checked for
+        * @return bool true if $text appears to be written in $variant, false if not
         *
         * @author Nikola Smolenski <smolensk@eunet.rs>
         * @since 1.19
@@ -927,7 +948,11 @@ class LanguageConverter {
                        if ( $title && $title->exists() ) {
                                $revision = Revision::newFromTitle( $title );
                                if ( $revision ) {
-                                       $txt = $revision->getRawText();
+                                       if ( $revision->getContentModel() == CONTENT_MODEL_WIKITEXT ) {
+                                               $txt = $revision->getContent( Revision::RAW )->getNativeData();
+                                       }
+
+                                       //@todo: in the future, use a specialized content model, perhaps based on json!
                                }
                        }
                }
@@ -1037,9 +1062,9 @@ class LanguageConverter {
         * MediaWiki:Conversiontable* is updated.
         * @private
         *
-        * @param $article Article object
+        * @param $page WikiPage object
         * @param $user Object: User object for the current user
-        * @param $text String: article text (?)
+        * @param $content Content: new page content
         * @param $summary String: edit summary of the edit
         * @param $isMinor Boolean: was the edit marked as minor?
         * @param $isWatch Boolean: did the user watch this page or not?
@@ -1048,9 +1073,9 @@ class LanguageConverter {
         * @param $revision Object: new Revision object or null
         * @return Boolean: true
         */
-       function OnArticleSaveComplete( $article, $user, $text, $summary, $isMinor,
+       function OnPageContentSaveComplete( $page, $user, $content, $summary, $isMinor,
                        $isWatch, $section, $flags, $revision ) {
-               $titleobj = $article->getTitle();
+               $titleobj = $page->getTitle();
                if ( $titleobj->getNamespace() == NS_MEDIAWIKI ) {
                        $title = $titleobj->getDBkey();
                        $t = explode( '/', $title, 3 );
@@ -1115,17 +1140,17 @@ class LanguageConverter {
  * @author fdcn <fdcn64@gmail.com>, PhiLiP <philip.npc@gmail.com>
  */
 class ConverterRule {
-       var $mText; // original text in -{text}-
-       var $mConverter; // LanguageConverter object
-       var $mRuleDisplay = '';
-       var $mRuleTitle = false;
-       var $mRules = '';// string : the text of the rules
-       var $mRulesAction = 'none';
-       var $mFlags = array();
-       var $mVariantFlags = array();
-       var $mConvTable = array();
-       var $mBidtable = array();// array of the translation in each variant
-       var $mUnidtable = array();// array of the translation in each variant
+       public $mText; // original text in -{text}-
+       public $mConverter; // LanguageConverter object
+       public $mRuleDisplay = '';
+       public $mRuleTitle = false;
+       public $mRules = '';// string : the text of the rules
+       public $mRulesAction = 'none';
+       public $mFlags = array();
+       public $mVariantFlags = array();
+       public $mConvTable = array();
+       public $mBidtable = array();// array of the translation in each variant
+       public $mUnidtable = array();// array of the translation in each variant
 
        /**
         * Constructor
@@ -1247,7 +1272,7 @@ class ConverterRule {
                                $bidtable[$v] = $to;
                        } elseif ( count( $u ) == 2 ) {
                                $from = trim( $u[0] );
-                               $v      = trim( $u[1] );
+                               $v = trim( $u[1] );
                                if ( array_key_exists( $v, $unidtable )
                                         && !is_array( $unidtable[$v] )
                                         && $to
index da55c82..9944ef0 100644 (file)
@@ -55,6 +55,7 @@
        'avk' => 'Kotava', # Kotava
        'ay' => 'Aymar aru',    # Aymara
        'az' => 'azərbaycanca',        # Azerbaijani
+       'azb' => 'تورکجه',        # South Azerbaijani
        '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 )
        'nap' => 'Nnapulitano', # Neapolitan
        'nb' => "norsk (bokmål)\xE2\x80\x8E",          # Norwegian (Bokmal)
        'nds' => 'Plattdüütsch',      # Low German ''or'' Low Saxon
-       'nds-nl' => 'Nedersaksisch',    # Dutch Low Saxon
+       'nds-nl' => 'Nedersaksies',     # aka Nedersaksisch: Dutch Low Saxon
        'ne' => 'नेपाली',   # Nepali
        'new' => 'नेपाल भाषा',                # Newar / Nepal Bhasha
        'ng' => 'Oshiwambo',            # Ndonga
index 3c16248..8f84322 100644 (file)
@@ -63,7 +63,7 @@ class LanguageEo extends Language {
                if ( strcasecmp( $in, 'x' ) == 0 && strcasecmp( $out, 'utf-8' ) == 0 ) {
                        return preg_replace_callback (
                                '/([cghjsu]x?)((?:xx)*)(?!x)/i',
-                               array( $this, 'strrtxuCallback' ), $string      );
+                               array( $this, 'strrtxuCallback' ), $string );
                } elseif ( strcasecmp( $in, 'UTF-8' ) == 0 && strcasecmp( $out, 'x' ) == 0 ) {
                        # Double Xs only if they follow cxapelutaj literoj.
                        return preg_replace_callback(
index 1865cc5..6a2820d 100644 (file)
@@ -102,7 +102,7 @@ class LanguageFi extends Language {
                        'monday' => 'maanantai',
                        'tuesday' => 'tiistai',
                        'wednesday' => 'keskiviikko',
-                       'thursay' => 'torstai',
+                       'thursday' => 'torstai',
                        'friday' => 'perjantai',
                        'saturday' => 'lauantai',
                        'sunday' => 'sunnuntai',
index 14fe928..0d652d4 100644 (file)
@@ -66,20 +66,6 @@ class GanConverter extends LanguageConverter {
                );
        }
 
-       /**
-        * there shouldn't be any latin text in Chinese conversion, so no need
-        * to mark anything.
-        * $noParse is there for compatibility with LanguageConvert::markNoConversion
-        *
-        * @param $text string
-        * @param $noParse bool
-        *
-        * @return string
-        */
-       function markNoConversion( $text, $noParse = false ) {
-               return $text;
-       }
-
        /**
         * @param $key string
         * @return String
@@ -116,7 +102,7 @@ class LanguageGan extends LanguageZh {
                                                                array(),
                                                                $ml );
 
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index 48c0c05..0391988 100644 (file)
@@ -49,17 +49,17 @@ class LanguageHe extends Language {
                switch ( $case ) {
                        case 'prefixed':
                        case 'תחילית':
-                               # Duplicate the "Waw" if prefixed
-                               if ( substr( $word, 0, 2 ) == "ו" && substr( $word, 0, 4 ) != "וו" ) {
+                               # Duplicate the "Waw" if prefixed, but not if it is already double.
+                               if ( substr( $word, 0, 2 ) === "ו" && substr( $word, 0, 4 ) !== "וו" ) {
                                        $word = "ו" . $word;
                                }
 
-                               # Remove the "He" if prefixed
-                               if ( substr( $word, 0, 2 ) == "ה" ) {
+                               # Remove the "He" article if prefixed.
+                               if ( substr( $word, 0, 2 ) === "ה" ) {
                                        $word = substr( $word, 2 );
                                }
 
-                               # Add a hyphen (maqaf) if non-Hebrew letters
+                               # Add a hyphen (maqaf) before non-Hebrew letters.
                                if ( substr( $word, 0, 2 ) < "א" || substr( $word, 0, 2 ) > "ת" ) {
                                        $word = "־" . $word;
                                }
@@ -67,5 +67,4 @@ class LanguageHe extends Language {
 
                return $word;
        }
-
 }
index 9bac5d7..fe5cdf8 100644 (file)
@@ -38,7 +38,7 @@ require_once( __DIR__ . '/../LanguageConverter.php' );
 class IuConverter extends LanguageConverter {
 
        protected $mDoContentConvert;
-       var $mToLatin = array(
+       public $mToLatin = array(
                'ᐦ' => 'h',   'ᐃ' => 'i',    'ᐄ' => 'ii',    'ᐅ' => 'u',    'ᐆ' => 'uu',    'ᐊ' => 'a',    'ᐋ' => 'aa',
                'ᑉ' => 'p',   'ᐱ' => 'pi',   'ᐲ' => 'pii',   'ᐳ' => 'pu',   'ᐴ' => 'puu',   'ᐸ' => 'pa',   'ᐹ' => 'paa',
                'ᑦ' => 't',   'ᑎ' => 'ti',   'ᑏ' => 'tii',   'ᑐ' => 'tu',   'ᑑ' => 'tuu',   'ᑕ' => 'ta',   'ᑖ' => 'taa',
@@ -58,7 +58,7 @@ class IuConverter extends LanguageConverter {
                'ᖦ' => 'ɫ',   'ᖠ' => 'ɫi',    'ᖡ' => 'ɫii',   'ᖢ' => 'ɫu',    'ᖣ' => 'ɫuu',   'ᖤ' => 'ɫa',    'ᖥ' => 'ɫaa',
        );
 
-       var $mUpperToLowerCaseLatin = array(
+       public $mUpperToLowerCaseLatin = array(
                'A' => 'a',     'B' => 'b',     'C' => 'c',     'D' => 'd',     'E' => 'e',
                'F' => 'f',     'G' => 'g',     'H' => 'h',     'I' => 'i',     'J' => 'j',
                'K' => 'k',     'L' => 'l',     'M' => 'm',     'N' => 'n',     'O' => 'o',
@@ -67,7 +67,7 @@ class IuConverter extends LanguageConverter {
                'Z' => 'z',
        );
 
-       var $mToSyllabics = array(
+       public $mToSyllabics = array(
                'h' => 'ᐦ',   'i' => 'ᐃ',    'ii' => 'ᐄ',    'u' => 'ᐅ',    'uu' => 'ᐆ',    'a' => 'ᐊ',    'aa' => 'ᐋ',
                'p' => 'ᑉ',   'pi' => 'ᐱ',   'pii' => 'ᐲ',   'pu' => 'ᐳ',   'puu' => 'ᐴ',   'pa' => 'ᐸ',   'paa' => 'ᐹ',
                't' => 'ᑦ',   'ti' => 'ᑎ',   'tii' => 'ᑏ',   'tu' => 'ᑐ',   'tuu' => 'ᑑ',   'ta' => 'ᑕ',   'taa' => 'ᑖ',
@@ -157,21 +157,6 @@ class IuConverter extends LanguageConverter {
                        $link = $oldlink;
        }
 
-       /**
-        * We want our external link captions to be converted in variants,
-        * so we return the original text instead -{$text}-, except for URLs
-        *
-        * @param $text string
-        * @param $noParse bool
-        *
-        * @return string
-        */
-       function markNoConversion( $text, $noParse = false ) {
-               if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
-                       return parent::markNoConversion( $text );
-               return $text;
-       }
-
        /**
         * An ugly function wrapper for parsing Image titles
         * (to prevent image name conversion)
@@ -233,6 +218,6 @@ class LanguageIu extends Language {
 
                $flags = array();
                $this->mConverter = new IuConverter( $this, 'iu', $variants, $variantfallbacks, $flags );
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index d3d487f..6dd6959 100644 (file)
@@ -390,21 +390,6 @@ class KkConverter extends LanguageConverter {
                }
        }
 
-       /**
-        * We want our external link captions to be converted in variants,
-        * so we return the original text instead -{$text}-, except for URLs
-        *
-        * @param $text string
-        * @param $noParse string|bool
-        *
-        * @return string
-        */
-       function markNoConversion( $text, $noParse = false ) {
-               if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
-                       return parent::markNoConversion( $text );
-               return $text;
-       }
-
        /**
         * @param $key string
         * @return String
@@ -440,7 +425,7 @@ class LanguageKk extends LanguageKk_cyrl {
 
                $this->mConverter = new KkConverter( $this, 'kk', $variants, $variantfallbacks );
 
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index 02ec648..30d98ba 100644 (file)
@@ -30,7 +30,7 @@ require_once( __DIR__ . '/LanguageKu_ku.php' );
  * @ingroup Language
  */
 class KuConverter extends LanguageConverter {
-       var $mArabicToLatin = array(
+       public $mArabicToLatin = array(
                'ب' => 'b', 'ج' => 'c', 'چ' => 'ç', 'د' => 'd', 'ف' => 'f', 'گ' => 'g', 'ھ' => 'h',
                'ہ' => 'h', 'ه' => 'h', 'ح' => 'h', 'ژ' => 'j', 'ك' => 'k', 'ک' => 'k', 'ل' => 'l',
                'م' => 'm', 'ن' => 'n', 'پ' => 'p', 'ق' => 'q', 'ر' => 'r', 'س' => 's', 'ش' => 'ş',
@@ -72,7 +72,7 @@ class KuConverter extends LanguageConverter {
                '٩' => '9', # &#x0669;
        );
 
-       var $mLatinToArabic = array(
+       public $mLatinToArabic = array(
                'b' => 'ب', 'c' => 'ج', 'ç' => 'چ', 'd' => 'د', 'f' => 'ف', 'g' => 'گ',
                'h' => 'ه', 'j' => 'ژ', 'k' => 'ک', 'l' => 'ل',
                'm' => 'م', 'n' => 'ن', 'p' => 'پ', 'q' => 'ق', 'r' => 'ر', 's' => 'س', 'ş' => 'ش',
@@ -177,21 +177,6 @@ class KuConverter extends LanguageConverter {
                        $link = $oldlink;
        }
 
-       /**
-        * We want our external link captions to be converted in variants,
-        * so we return the original text instead -{$text}-, except for URLs
-        *
-        * @param $text string
-        * @param $noParse bool
-        *
-        * @return string
-        */
-       function markNoConversion( $text, $noParse = false ) {
-               if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
-                   return parent::markNoConversion( $text );
-               return $text;
-       }
-
        /**
         * An ugly function wrapper for parsing Image titles
         * (to prevent image name conversion)
@@ -273,6 +258,6 @@ class LanguageKu extends LanguageKu_ku {
                );
 
                $this->mConverter = new KuConverter( $this, 'ku', $variants, $variantfallbacks );
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 8e2115c..9d92834 100644 (file)
@@ -36,6 +36,6 @@ class LanguageQqx extends Language {
         * @return string
         */
        function getMessage( $key ) {
-               return "($key)";
+               return "($key$*)";
        }
 }
index 27c5d64..5ddcfde 100644 (file)
@@ -39,7 +39,7 @@ class ShiConverter extends LanguageConverter {
 
        protected $mDoContentConvert;
 
-       var $mToLatin = array(
+       public $mToLatin = array(
                'ⴰ' => 'a', 'ⴱ' => 'b', 'ⴳ' => 'g', 'ⴷ' => 'd', 'ⴹ' => 'ḍ', 'ⴻ' => 'e',
                'ⴼ' => 'f', 'ⴽ' => 'k', 'ⵀ' => 'h', 'ⵃ' => 'ḥ', 'ⵄ' => 'ε', 'ⵅ' => 'x',
                'ⵇ' => 'q', 'ⵉ' => 'i', 'ⵊ' => 'j',  'ⵍ' => 'l', 'ⵎ' => 'm', 'ⵏ' => 'n',
@@ -48,7 +48,7 @@ class ShiConverter extends LanguageConverter {
                'ⵥ' => 'ẓ', 'ⵯ' => 'ʷ', 'ⵖ' => 'ɣ', 'ⵠ' => 'v', 'ⵒ' => 'p',
        );
 
-       var $mUpperToLowerCaseLatin = array(
+       public $mUpperToLowerCaseLatin = array(
                'A' => 'a',     'B' => 'b',     'C' => 'c',     'D' => 'd',     'E' => 'e',
                'F' => 'f',     'G' => 'g',     'H' => 'h',     'I' => 'i',     'J' => 'j',
                'K' => 'k',     'L' => 'l',     'M' => 'm',     'N' => 'n',     'O' => 'o',
@@ -57,7 +57,7 @@ class ShiConverter extends LanguageConverter {
                'Z' => 'z', 'Ɣ' => 'ɣ',
        );
 
-       var $mToTifinagh = array(
+       public $mToTifinagh = array(
                'a' => 'ⴰ', 'b' => 'ⴱ', 'g' => 'ⴳ', 'd' => 'ⴷ', 'ḍ' => 'ⴹ', 'e' => 'ⴻ',
                'f' => 'ⴼ', 'k' => 'ⴽ', 'h' => 'ⵀ', 'ḥ' => 'ⵃ', 'ε' => 'ⵄ', 'x' => 'ⵅ',
                'q' => 'ⵇ', 'i' => 'ⵉ', 'j' => 'ⵊ',  'l' => 'ⵍ', 'm' => 'ⵎ', 'n' => 'ⵏ',
@@ -136,21 +136,6 @@ class ShiConverter extends LanguageConverter {
                        $link = $oldlink;
        }
 
-       /**
-        * We want our external link captions to be converted in variants,
-        * so we return the original text instead -{$text}-, except for URLs
-        *
-        * @param $text string
-        * @param $noParse bool
-        *
-        * @return string
-        */
-       function markNoConversion( $text, $noParse = false ) {
-               if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
-                       return parent::markNoConversion( $text );
-               return $text;
-       }
-
        /**
         * An ugly function wrapper for parsing Image titles
         * (to prevent image name conversion)
@@ -212,6 +197,6 @@ class LanguageShi extends Language {
 
                $flags = array();
                $this->mConverter = new ShiConverter( $this, 'shi', $variants, $variantfallbacks, $flags );
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 4b799f2..3610c1e 100644 (file)
@@ -35,7 +35,7 @@ require_once( __DIR__ . '/LanguageSr_el.php' );
  * @ingroup Language
  */
 class SrConverter extends LanguageConverter {
-       var $mToLatin = array(
+       public $mToLatin = array(
                'а' => 'a', 'б' => 'b',  'в' => 'v', 'г' => 'g',  'д' => 'd',
                'ђ' => 'đ', 'е' => 'e',  'ж' => 'ž', 'з' => 'z',  'и' => 'i',
                'ј' => 'j', 'к' => 'k',  'л' => 'l', 'љ' => 'lj', 'м' => 'm',
@@ -51,7 +51,7 @@ class SrConverter extends LanguageConverter {
                'Х' => 'H', 'Ц' => 'C',  'Ч' => 'Č', 'Џ' => 'Dž', 'Ш' => 'Š',
        );
 
-       var $mToCyrillics = array(
+       public $mToCyrillics = array(
                'a' => 'а', 'b'  => 'б', 'c' => 'ц', 'č' => 'ч', 'ć'  => 'ћ',
                'd' => 'д', 'dž' => 'џ', 'đ' => 'ђ', 'e' => 'е', 'f'  => 'ф',
                'g' => 'г', 'h'  => 'х', 'i' => 'и', 'j' => 'ј', 'k'  => 'к',
@@ -128,21 +128,6 @@ class SrConverter extends LanguageConverter {
                        $link = $oldlink;
        }
 
-       /**
-        * We want our external link captions to be converted in variants,
-        * so we return the original text instead -{$text}-, except for URLs
-        *
-        * @param $text string
-        * @param $noParse bool
-        *
-        * @return string
-        */
-       function markNoConversion( $text, $noParse = false ) {
-               if ( $noParse || preg_match( "/^https?:\/\/|ftp:\/\/|irc:\/\//", $text ) )
-                       return parent::markNoConversion( $text );
-               return $text;
-       }
-
        /**
         * An ugly function wrapper for parsing Image titles
         * (to prevent image name conversion)
@@ -246,7 +231,7 @@ class LanguageSr extends LanguageSr_ec {
                        'W' => 'W', 'реч'   => 'W', 'reč'   => 'W', 'ријеч' => 'W', 'riječ' => 'W'
                );
                $this->mConverter = new SrConverter( $this, 'sr', $variants, $variantfallbacks, $flags );
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index bd69e30..a2c917c 100644 (file)
@@ -27,7 +27,7 @@ require_once( __DIR__ . '/../LanguageConverter.php' );
  * @ingroup Language
  */
 class UzConverter extends LanguageConverter {
-       var $toLatin = array(
+       public $toLatin = array(
                'а' => 'a', 'А' => 'A',
                'б' => 'b', 'Б' => 'B',
                'д' => 'd', 'Д' => 'D',
@@ -65,7 +65,7 @@ class UzConverter extends LanguageConverter {
                'ъ' => 'ʼ',
        );
 
-       var $toCyrillic = array(
+       public $toCyrillic = array(
                'a' => 'а', 'A' => 'А',
                'b' => 'б', 'B' => 'Б',
                'd' => 'д', 'D' => 'Д',
@@ -132,6 +132,6 @@ class LanguageUz extends Language {
                );
 
                $this->mConverter = new UzConverter( $this, 'uz', $variants, $variantfallbacks );
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 }
index 63f90fd..04767f2 100644 (file)
@@ -87,20 +87,6 @@ class ZhConverter extends LanguageConverter {
                $this->mTables['zh-tw']->merge( $this->mTables['zh-hant'] );
        }
 
-       /**
-        * there shouldn't be any latin text in Chinese conversion, so no need
-        * to mark anything.
-        * $noParse is there for compatibility with LanguageConvert::markNoConversion
-        *
-        * @param $text string
-        * @param $noParse bool
-        *
-        * @return string
-        */
-       function markNoConversion( $text, $noParse = false ) {
-               return $text;
-       }
-
        /**
         * @param $key string
         * @return String
@@ -146,7 +132,7 @@ class LanguageZh extends LanguageZh_hans {
                                                                array(),
                                                                $ml );
 
-               $wgHooks['ArticleSaveComplete'][] = $this->mConverter;
+               $wgHooks['PageContentSaveComplete'][] = $this->mConverter;
        }
 
        /**
index 65e27ca..0a5f059 100644 (file)
                        <pluralRule count="two">n mod 100 is 2</pluralRule>
                        <pluralRule count="few">n mod 100 in 3..4</pluralRule>
                </pluralRules>
+               <!-- Copied from "be" -->
+               <pluralRules locales="be-tarask">
+                       <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="cu">
                        <pluralRule count="one">n mod 10 is 1</pluralRule>
                        <pluralRule count="two">n mod 10 is 2</pluralRule>
index c6be096..cb6269f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Abkhazian (Ð\90Ò§Ñ\81Ñ\83а)
+/** Abkhazian (Ð\90Ò§Ñ\81Ñ\88Ó\99а)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -81,142 +81,142 @@ $magicWords = array(
 
 $messages = array(
 # Dates
-'sunday'        => 'амҽыш',
-'monday'        => 'ашәахь',
-'tuesday'       => 'аҩаш',
-'wednesday'     => 'ахаш',
-'thursday'      => 'аҧшьаш',
-'friday'        => 'ахәуаш',
-'saturday'      => 'асабш',
-'january'       => 'ажьырныҳәа',
-'february'      => 'жәабран',
-'march'         => 'хәажәкыр',
-'april'         => 'мшаҧы',
-'may_long'      => 'лаҵара',
-'june'          => 'рашәара',
-'july'          => 'ҧхынгәы',
-'august'        => 'нанҳәа',
-'september'     => 'цәыббра',
-'october'       => 'жьҭаара',
-'november'      => 'абҵара',
-'december'      => 'ҧхынҷкәын',
-'january-gen'   => 'ажьырныҳәа',
-'february-gen'  => 'жәабран',
-'march-gen'     => 'хәажәкыра',
-'april-gen'     => 'мшаҧы',
-'may-gen'       => 'лаҵара',
-'june-gen'      => 'рашәара',
-'july-gen'      => 'ҧхынгәы',
-'august-gen'    => 'нанҳәа',
+'sunday' => 'амҽыш',
+'monday' => 'ашәахь',
+'tuesday' => 'аҩаш',
+'wednesday' => 'ахаш',
+'thursday' => 'аҧшьаш',
+'friday' => 'ахәуаш',
+'saturday' => 'асабш',
+'january' => 'ажьырныҳәа',
+'february' => 'жәабран',
+'march' => 'хәажәкыр',
+'april' => 'мшаҧы',
+'may_long' => 'лаҵара',
+'june' => 'рашәара',
+'july' => 'ҧхынгәы',
+'august' => 'нанҳәа',
+'september' => 'цәыббра',
+'october' => 'жьҭаара',
+'november' => 'абҵара',
+'december' => 'ҧхынҷкәын',
+'january-gen' => 'ажьырныҳәа',
+'february-gen' => 'жәабран',
+'march-gen' => 'хәажәкыра',
+'april-gen' => 'мшаҧы',
+'may-gen' => 'лаҵара',
+'june-gen' => 'рашәара',
+'july-gen' => 'ҧхынгәы',
+'august-gen' => 'нанҳәа',
 'september-gen' => 'цәыббра',
-'october-gen'   => 'жьҭаара',
-'november-gen'  => 'абҵара',
-'december-gen'  => 'ҧхынҷкәын',
-'jan'           => 'ажь',
-'feb'           => 'жәа',
-'mar'           => 'хәа',
-'apr'           => 'мша',
-'may'           => 'лаҵ',
-'jun'           => 'раш',
-'jul'           => 'ҧхг',
-'aug'           => 'нан',
-'sep'           => 'цәы',
-'oct'           => 'жьҭ',
-'nov'           => 'абҵ',
-'dec'           => 'ҧхҷ',
+'october-gen' => 'жьҭаара',
+'november-gen' => 'абҵара',
+'december-gen' => 'ҧхынҷкәын',
+'jan' => 'ажь',
+'feb' => 'жәа',
+'mar' => 'хәа',
+'apr' => 'мша',
+'may' => 'лаҵ',
+'jun' => 'раш',
+'jul' => 'ҧхг',
+'aug' => 'нан',
+'sep' => 'цәы',
+'oct' => 'жьҭ',
+'nov' => 'абҵ',
+'dec' => 'ҧхҷ',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Акатегориа|Акатегориақәа}}',
 
-'article'    => 'Адаҟьа',
-'mytalk'     => 'Сахцәажәара',
+'article' => 'Адаҟьа',
+'mytalk' => 'Сахцәажәара',
 'navigation' => 'Анавигациа',
 
 # Cologne Blue skin
-'qbfind'         => 'Аҧшаара',
-'qbedit'         => 'Ариашара',
-'qbpageoptions'  => 'Ари адаҟьа',
+'qbfind' => 'Аҧшаара',
+'qbedit' => 'Ариашара',
+'qbpageoptions' => 'Ари адаҟьа',
 'qbspecialpages' => 'Цастәи адаҟьақәа',
 
 # Vector skin
-'vector-action-move'     => 'Ахьӡ аҧсахра',
-'vector-view-create'     => 'Арҿиара',
-'vector-view-edit'       => 'Ариашамҭа',
-'vector-view-history'    => 'Аҭоурых',
-'vector-view-view'       => 'Аҧхьара',
+'vector-action-move' => 'Ахьӡ аҧсахра',
+'vector-view-create' => 'Арҿиара',
+'vector-view-edit' => 'Ариашамҭа',
+'vector-view-history' => 'Аҭоурых',
+'vector-view-view' => 'Аҧхьара',
 'vector-view-viewsource' => 'Ахәаҧшра',
 
-'help'             => 'Ацхыраара',
-'search'           => 'Аҧшаара',
-'searchbutton'     => 'Аҧшаара',
-'searcharticle'    => 'Адаҟьа',
-'history'          => 'Аҭоурых',
-'history_short'    => 'Аҭоурых',
+'help' => 'Ацхыраара',
+'search' => 'Аҧшаара',
+'searchbutton' => 'Аҧшаара',
+'searcharticle' => 'Адаҟьа',
+'history' => 'Аҭоурых',
+'history_short' => 'Аҭоурых',
 'printableversion' => 'Акьыҧхьразы аверсиа',
-'permalink'        => 'Еисымшатәи ахьарҧш',
-'edit'             => 'Ариашамҭа',
-'create'           => 'Арҿиара',
+'permalink' => 'Еисымшатәи ахьарҧш',
+'edit' => 'Ариашамҭа',
+'create' => 'Арҿиара',
 'create-this-page' => 'Ариашара ари адаҟьа',
-'newpage'          => 'Адаҟьа Ҿыц',
+'newpage' => 'Адаҟьа Ҿыц',
 'talkpagelinktext' => 'Ахцәажәара',
-'specialpage'      => 'Цастәи адаҟьа',
-'talk'             => 'Ахцәажәара',
-'toolbox'          => 'Амаҵыругақәа',
-'otherlanguages'   => 'Абызшәақәа',
-'lastmodifiedat'   => 'Ацыхәтәантәи аҧсахрақәа абри адаҟьа аҟны: $2, $1.',
+'specialpage' => 'Цастәи адаҟьа',
+'talk' => 'Ахцәажәара',
+'toolbox' => 'Амаҵыругақәа',
+'otherlanguages' => 'Абызшәақәа',
+'lastmodifiedat' => 'Ацыхәтәантәи аҧсахрақәа абри адаҟьа аҟны: $2, $1.',
 'jumptonavigation' => 'Анавигациа',
-'jumptosearch'     => 'Аҧшаара',
+'jumptosearch' => 'Аҧшаара',
 
 # 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}} иазкны',
-'currentevents'        => 'Ииасуа ахҭысқәа',
-'mainpage'             => 'Ихадоу Адаҟьа',
+'aboutsite' => '{{SITENAME}} иазкны',
+'currentevents' => 'Ииасуа ахҭысқәа',
+'mainpage' => 'Ихадоу Адаҟьа',
 'mainpage-description' => 'Ихадоу адаҟьа',
-'privacy'              => 'Аконфиденциалтә аполитика',
-'privacypage'          => 'Project: Аконфиденциалтә аполитика',
+'privacy' => 'Аконфиденциалтә аполитика',
+'privacypage' => 'Project: Аконфиденциалтә аполитика',
 
-'youhavenewmessages'  => 'Уара $1 уауит ($2).',
-'newmessageslink'     => 'адырра ҿыцқәа',
+'youhavenewmessages' => 'Уара $1 уауит ($2).',
+'newmessageslink' => 'адырра ҿыцқәа',
 'newmessagesdifflink' => 'аҵыхәтәатәи аҽеиҭакра',
-'editsection'         => 'ариашамҭа',
-'editold'             => 'ариашара',
-'editlink'            => 'ариашара',
+'editsection' => 'ариашамҭа',
+'editold' => 'ариашара',
+'editlink' => 'ариашара',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Адаҟьа',
-'nstab-user'     => 'Алахәыла',
-'nstab-special'  => 'Цастәи адаҟьа',
-'nstab-image'    => 'Афаил',
+'nstab-main' => 'Адаҟьа',
+'nstab-user' => 'Алахәыла',
+'nstab-special' => 'Цастәи адаҟьа',
+'nstab-image' => 'Афаил',
 'nstab-template' => 'Ашаблон',
-'nstab-help'     => 'Ацхыраара',
+'nstab-help' => 'Ацхыраара',
 'nstab-category' => 'Акатегориа',
 
 # General errors
 'viewsource' => 'Ахәаҧшра',
 
 # Login and logout pages
-'login'                   => 'Урдырра',
+'login' => 'Урдырра',
 'nav-login-createaccount' => 'Урдырра / Арегистрациара',
-'userlogin'               => 'Урдырра/Арегистрациара',
-'logout'                  => 'Асеанс дәылҵра',
-'userlogout'              => 'Асеанс дәылҵра',
-'loginlanguagelabel'      => 'Абызшәа: $1',
+'userlogin' => 'Урдырра/Арегистрациара',
+'logout' => 'Асеанс дәылҵра',
+'userlogout' => 'Асеанс дәылҵра',
+'loginlanguagelabel' => 'Абызшәа: $1',
 
 # Edit pages
-'summary'     => 'Описание изменений:',
+'summary' => 'Описание изменений:',
 'savearticle' => 'Адаҟьа ахьчара',
-'editing'     => 'Ариашамҭа: $1',
+'editing' => 'Ариашамҭа: $1',
 
 # Search results
 'searchresults-title' => 'Аҧшаара «$1»',
 
 # Preferences page
-'preferences'       => 'Архиарақәа',
-'mypreferences'     => 'Архиарақәа',
+'preferences' => 'Архиарақәа',
+'mypreferences' => 'Архиарақәа',
 'searchresultshead' => 'Аҧшаара',
-'uid'               => 'Алахәыла ID:',
-'yourlanguage'      => 'Абызшәа:',
-'prefs-signature'   => 'Анапынҵамҭа',
+'uid' => 'Алахәыла ID:',
+'yourlanguage' => 'Абызшәа:',
+'prefs-signature' => 'Анапынҵамҭа',
 
 # Groups
 'group-user' => 'Алахәылацәа',
@@ -230,8 +230,8 @@ $messages = array(
 'newpageletter' => 'Ҿ',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Еимадоу ариашарақәа',
-'recentchangeslinked-feed'    => 'Еимадоу ариашарақәа',
+'recentchangeslinked' => 'Еимадоу ариашарақәа',
+'recentchangeslinked-feed' => 'Еимадоу ариашарақәа',
 'recentchangeslinked-toolbox' => 'Еимадоу ариашарақәа',
 
 # Upload
@@ -247,8 +247,8 @@ $messages = array(
 
 # Miscellaneous special pages
 'newpages-username' => 'Алахәыла:',
-'move'              => 'Ахьӡ аҧсахра',
-'movethispage'      => 'Ахьӡ аҧсахра ари адаҟьа',
+'move' => 'Ахьӡ аҧсахра',
+'movethispage' => 'Ахьӡ аҧсахра ари адаҟьа',
 
 # Special:Log
 'specialloguserlabel' => 'Алахәыла:',
@@ -260,21 +260,21 @@ $messages = array(
 'linksearch-ok' => 'Аҧшаара',
 
 # Watchlist
-'watchlist'   => 'Ашклаҧшра асна',
+'watchlist' => 'Ашклаҧшра асна',
 'mywatchlist' => 'Ашклаҧшра асна',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Ариашамҭа',
 
 # Contributions
-'mycontris'   => 'Салагала',
+'mycontris' => 'Салагала',
 'contribsub2' => 'Алагала $1 ($2)',
 
-'sp-contributions-talk'   => 'ахцәажәара',
+'sp-contributions-talk' => 'ахцәажәара',
 'sp-contributions-submit' => 'Аҧшаара',
 
 # What links here
-'whatlinkshere'      => 'Арахьтәи ахьарҧшқәа',
+'whatlinkshere' => 'Арахьтәи ахьарҧшқәа',
 'whatlinkshere-page' => 'Адаҟьа:',
 
 # Block/unblock
@@ -292,13 +292,13 @@ $messages = array(
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'зегьы',
 'namespacesall' => 'зегьы',
-'monthsall'     => 'зегьы',
+'monthsall' => 'зегьы',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-submit' => 'Аҧшаара',
 
 # Special:SpecialPages
-'specialpages'             => 'Цастәи адаҟьақәа',
+'specialpages' => 'Цастәи адаҟьақәа',
 'specialpages-group-login' => 'Урдырра / Арегистрациара',
 
 );
index e763f58..799710a 100644 (file)
@@ -301,7 +301,6 @@ $messages = array(
 'qbbrowse' => 'Lop',
 'qbedit' => 'Andam',
 'qbpageoptions' => 'Ôn nyoe',
-'qbpageinfo' => 'Asoe ôn',
 'qbmyoptions' => 'Ôn lôn',
 'qbspecialpages' => 'Ôn kusuih',
 'faq' => 'FAQ',
@@ -497,9 +496,6 @@ Meunyo kön nyoë sababjih, Droëneuh kadang ka neuteumèë saboh bug lam softwa
 'viewsourcetext' => 'Droëneuh  jeuët neu’eu',
 
 # Login and logout pages
-'welcomecreation' => '== Seulamat trok teuka, $1! ==
-
-Nan Droeneuh ka teupeugot. Neuato laju [[Special:Preferences|peue nyang neugalak {{SITENAME}}]].',
 'yourname' => 'Ureuëng nguy:',
 'yourpassword' => 'Lageuëm:',
 'yourpasswordagain' => 'Pasoë lom lageuëm:',
@@ -693,8 +689,6 @@ Alasan-alasan nyan hana geupeureumeuen.",
 'search-interwiki-caption' => 'Buët la’én',
 'search-interwiki-default' => 'Hasé $1:',
 'search-interwiki-more' => '(lom)',
-'search-mwsuggest-enabled' => 'ngon saran',
-'search-mwsuggest-disabled' => 'hana saran',
 'searchrelated' => 'meusambat',
 'searchall' => 'ban dum',
 'showingresultsheader' => "{{PLURAL:$5|Hase '''$1''' nibak '''$3'''|Hase '''$1 - $2''' nibak '''$3'''}} keu '''$4'''",
@@ -1208,4 +1202,7 @@ Data nyang la'én eunteuk teupeusom keudroë.
 # Special:Tags
 'tag-filter' => 'Filter [[Special:Tags|tag]]:',
 
+# Search suggestions
+'searchsuggest-search' => 'Mita',
+
 );
index 2e2ed5e..8f83464 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/**    زَوُن (   زَوُن)
+/** Tunisian Spoken Arabic (   زَوُن)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  * @author Csisc
  */
 
+$fallback = 'ar';
+
+$rtl = true;
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ضع خطا تحت الوصلات:',
@@ -156,7 +160,6 @@ $messages = array(
 'qbbrowse' => 'ara',
 'qbedit' => 'modifi el page (baddelha)',
 'qbpageoptions' => 'هذه الصفحة',
-'qbpageinfo' => 'سياق النص',
 'qbmyoptions' => 'صفحاتي',
 'qbspecialpages' => 'الصفحات الخاصة',
 'faq' => 'الأسئلة الأكثر تكرارا',
@@ -417,11 +420,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''أنت الآن غير مسجل الدخول.'''
 
-تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو [[Special:UserLogin|الدخول مرة أخرى]] بنفس الاسم أو باسم آخر.
+تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.
 من الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
-'welcomecreation' => '== مرحبا، $1! ==
-تم إنشاء حسابك.
-لا تنس أن تغير [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].',
 'yourname' => 'اسم المستخدم:',
 'yourpassword' => 'كلمة السر:',
 'yourpasswordagain' => 'أعد كتابة كلمة السر:',
index 3756dfd..4ac06ab 100644 (file)
@@ -54,7 +54,6 @@ $magicWords = array(
        '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' ),
@@ -341,8 +340,8 @@ $messages = array(
 'newwindow' => '(verskyn in nuwe venster)',
 'cancel' => 'Kanselleer',
 'moredotdotdot' => 'Meer…',
-'mypage' => 'My bladsy',
-'mytalk' => 'My besprekings',
+'mypage' => 'Gebruikersblad',
+'mytalk' => 'Bespreking',
 'anontalk' => 'Besprekingsblad vir hierdie IP',
 'navigation' => 'Navigasie',
 'and' => '&#32;en',
@@ -352,7 +351,6 @@ $messages = array(
 'qbbrowse' => 'Snuffel',
 'qbedit' => 'Wysig',
 'qbpageoptions' => 'Bladsyopsies',
-'qbpageinfo' => 'Bladsyinligting',
 'qbmyoptions' => 'My bladsye',
 'qbspecialpages' => 'Spesiale bladsye',
 'faq' => 'Gewilde vrae',
@@ -375,6 +373,7 @@ $messages = array(
 'namespaces' => 'Naamruimtes',
 'variants' => 'Variante',
 
+'navigation-heading' => 'Navigasie-keuseskerm',
 'errorpagetitle' => 'Fout',
 'returnto' => 'Keer terug na $1.',
 'tagline' => 'Vanuit {{SITENAME}}',
@@ -616,11 +615,11 @@ Die rede hiervoor is "\'\'$3\'\'".',
 # Login and logout pages
 'logouttext' => "'''U is nou uitgeteken'''
 
-U kan aanhou om {{SITENAME}} anoniem te gebruik; of u kan weer [[Special:UserLogin|inteken]] as dieselfde of 'n ander gebruiker.
+U kan aanhou om {{SITENAME}} anoniem te gebruik; of u kan weer <span class='plainlinks'>[$1 inteken]</span> as dieselfde of 'n ander gebruiker.
 Dit is moontlik dat sommige bladsye nog sal aandui dat u aangeteken is totdat u u webblaaier se kas skoonmaak.",
-'welcomecreation' => '== Welkom, $1! ==
-U rekening is geskep;
-moenie vergeet om u [[Special:Preferences|persoonlike voorkeure vir {{SITENAME}}]] te stel nie.',
+'welcomeuser' => 'Welkom, $1!',
+'welcomecreation-msg' => 'U gebruiker is geskep.
+Moenie vergeet om u [[Special:Preferences|voorkeure vir {{SITENAME}}]] te stel nie.',
 'yourname' => 'Gebruikersnaam:',
 'yourpassword' => 'Wagwoord:',
 'yourpasswordagain' => 'Herhaal wagwoord',
@@ -976,6 +975,12 @@ Dit lyk of dit verwyder is.',
 Dit bestaan alreeds.',
 'defaultmessagetext' => 'Verstekteks',
 
+# Content models
+'content-model-wikitext' => 'Wikiteks',
+'content-model-text' => 'eenvoudige teks',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Waarskuwing: Die bladsy gebruik te veel duur ontlederfunksies.
 
@@ -1229,8 +1234,6 @@ Details kan in die [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} s
 'search-interwiki-caption' => 'Suster projekte',
 'search-interwiki-default' => '$1 resultate:',
 'search-interwiki-more' => '(meer)',
-'search-mwsuggest-enabled' => 'met voorstelle',
-'search-mwsuggest-disabled' => 'geen voorstelle',
 'search-relatedarticle' => 'Verwante',
 'mwsuggest-disable' => 'Deaktiveer AJAX-voorstelle',
 'searcheverything-enable' => 'Soek in alle naamruimtes',
@@ -1265,7 +1268,7 @@ U kan ook 'n naamruimte as voorvoegsel gebruik.",
 
 # Preferences page
 'preferences' => 'Voorkeure',
-'mypreferences' => 'My voorkeure',
+'mypreferences' => 'Voorkeure',
 'prefs-edits' => 'Aantal wysigings:',
 'prefsnologin' => 'Nie ingeteken nie',
 'prefsnologintext' => 'U moet <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aanteken]</span> om voorkeure te kan verander.',
@@ -1328,7 +1331,7 @@ Hier volg 'n lukraak gegenereerde waarde wat u kan gebruik: $1",
 'timezoneregion-indian' => 'Indiese Oseaan',
 'timezoneregion-pacific' => 'Stille Oseaan',
 'allowemail' => 'Laat e-pos van ander toe',
-'prefs-searchoptions' => 'Soekopsies',
+'prefs-searchoptions' => 'Soek',
 'prefs-namespaces' => 'Naamruimtes',
 'defaultns' => 'Anders soek in hierdie naamruimtes:',
 'default' => 'verstek',
@@ -1894,6 +1897,7 @@ Miskien wil u eerder die beskrywing daar op die [$2 lêerbeskrywing] bywerk.',
 'uploadnewversion-linktext' => "Laai 'n nuwe weergawe van hierdie lêer",
 'shared-repo-from' => 'vanaf $1',
 'shared-repo' => "'n gedeelde lêerbank",
+'upload-disallowed-here' => 'U kan nie die lêer oorskryf nie.',
 
 # File reversion
 'filerevert' => 'Maak $1 ongedaan',
@@ -2245,11 +2249,7 @@ As u die bladsy later van u dophoulys wil verwyder, kliek \"verwyder van dophoul
 
 'enotif_mailer' => '{{SITENAME}} E-pos kennisgewings',
 'enotif_reset' => 'Merk alle bladsye as besoek',
-'enotif_newpagetext' => "Dis 'n nuwe bladsy.",
 'enotif_impersonal_salutation' => '{{SITENAME}} gebruiker',
-'changed' => 'verander',
-'created' => 'geskep',
-'enotif_subject' => 'Bladsy $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED deur $PAGEEDITOR',
 'enotif_lastvisited' => 'Sien $1 vir alle wysigings sedert u laaste besoek.',
 'enotif_lastdiff' => 'Sien $1 om hierdie wysiging te bekyk.',
 'enotif_anon_editor' => 'anonieme gebruiker $1',
@@ -2866,7 +2866,6 @@ Die lêer is slegs gedeeltelik opgelaai.',
 
 # JavaScriptTest
 '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".',
@@ -2976,10 +2975,17 @@ Hierdie situasie was waarskynlik deur 'n skakel na 'n eksterne webtuiste op ons
 # Info page
 'pageinfo-title' => 'Inligting oor "$1"',
 'pageinfo-header-edits' => 'Wysigingsgeskiedenis',
+'pageinfo-article-id' => 'Bladsy-ID',
+'pageinfo-robot-index' => 'Indekseerbaar',
+'pageinfo-robot-noindex' => 'Nie indekseerbaar nie',
 'pageinfo-views' => 'Aantal kere gewys',
 'pageinfo-watchers' => 'Aantal dophouers',
 'pageinfo-edits' => 'Totale aantal wysigings',
 'pageinfo-authors' => 'Totale aantal verskillende outeurs',
+'pageinfo-redirectsto' => 'Stuur aan na',
+'pageinfo-redirectsto-info' => 'Inligting',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading-yes' => 'Ja',
 
 # Skin names
 'skinname-standard' => 'Standaard',
@@ -3055,6 +3061,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 uur|$1 ure}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dae}}',
 'ago' => '$1 gelede',
+'just-now' => 'Nou net',
 
 # Bad image list
 'bad_image_list' => "Die formaat is as volg:
@@ -3802,9 +3809,9 @@ Beelde word in hulle volle resolusie gewys. Ander lêertipes word direk met hull
 'logentry-move-move_redir-noredirect' => "$1 het bladsy $3 na $4 oor 'n bestaande aanstuur geskuif sonder om 'n aanstuur agter te laat",
 'logentry-patrol-patrol' => '$1 het weergawe $4 van bladsy $3 as gekontroleerd gemerk',
 'logentry-patrol-patrol-auto' => '$1 het weergawe $4 van bladsy $3 outomaties as gekontroleerd gemerk',
-'logentry-newusers-newusers' => "$1 het 'n gebruiker geskep",
-'logentry-newusers-create' => "$1 het 'n gebruiker geskep",
-'logentry-newusers-create2' => "$1 het 'n gebruiker $3 geskep",
+'logentry-newusers-newusers' => 'Gebruiker $1 is geskep',
+'logentry-newusers-create' => 'Gebruiker $1 is geskep',
+'logentry-newusers-create2' => 'Gebruiker $3 is deur $1 geskep',
 'logentry-newusers-autocreate' => 'Die gebruiker $1 is outomaties geskep',
 'newuserlog-byemail' => 'wagwoord is per e-pos versend',
 
@@ -3824,6 +3831,10 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
 'feedback-bugcheck' => 'Gaaf! Kontroleer of dit nie dalk een van die [$1 bekende foute] is nie.',
 'feedback-bugnew' => "Ek het gekontroleer. Rapporteer 'n nuwe fout.",
 
+# Search suggestions
+'searchsuggest-search' => 'Soek',
+'searchsuggest-containing' => 'bevat...',
+
 # API errors
 'api-error-badaccess-groups' => 'U word nie toegelaat om lêers te laai op hierdie wiki.',
 'api-error-badtoken' => 'Interne fout: slegte teken.',
@@ -3876,4 +3887,6 @@ Anders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die blad
 'duration-centuries' => '$1 {{PLURAL:$1|eeu|eeue}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
+# Unknown messages
+'svg-long-error' => 'Ongeldige SVG-lêer: $1',
 );
index f59821a..bb3265b 100644 (file)
@@ -33,67 +33,67 @@ $namespaceNames = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline'             => 'Twa lenk nyina ase:',
-'tog-justify'               => 'Gyastefae mparagraf',
-'tog-hideminor'             => 'Suma nsesae a wɔakɔ so a wɔnnkyɛree koraa',
-'tog-hidepatrolled'         => 'Suma nsesae a wɔapatrole wɔn ndansa yi ara',
+'tog-underline' => 'Twa lenk nyina ase:',
+'tog-justify' => 'Gyastefae mparagraf',
+'tog-hideminor' => 'Suma nsesae a wɔakɔ so a wɔnnkyɛree koraa',
+'tog-hidepatrolled' => 'Suma nsesae a wɔapatrole wɔn ndansa yi ara',
 'tog-newpageshidepatrolled' => 'Suma nkrataafa a wɔapatrole wɔn fi krataafa-foforo lest no so',
-'tog-extendwatchlist'       => 'San list-nhwɛso no mu ama wo ehu nsesae nyinara a wɔakɔ so',
-'tog-usenewrc'              => 'Fa ndansa nsesae a woetu mpon fa di dwuma (wo hia JavaScript)',
-'tog-numberheadings'        => 'Ma ti-nsɛm no ara ankasa mma wɔn ho nɔmba',
-'tog-showtoolbar'           => 'Kyerɛ tulbaa a wɔde yɛ nsesa (wo hia JavaScript)',
-'tog-editondblclick'        => 'Sesa nkrataafa sɛ womia klik mpɛn mienu a (wo hia JavaScript)',
+'tog-extendwatchlist' => 'San list-nhwɛso no mu ama wo ehu nsesae nyinara a wɔakɔ so',
+'tog-usenewrc' => 'Fa ndansa nsesae a woetu mpon fa di dwuma (wo hia JavaScript)',
+'tog-numberheadings' => 'Ma ti-nsɛm no ara ankasa mma wɔn ho nɔmba',
+'tog-showtoolbar' => 'Kyerɛ tulbaa a wɔde yɛ nsesa (wo hia JavaScript)',
+'tog-editondblclick' => 'Sesa nkrataafa sɛ womia klik mpɛn mienu a (wo hia JavaScript)',
 
 # Dates
-'sunday'    => 'Kwasiada',
-'monday'    => 'Ɛdwoada',
-'tuesday'   => 'Ɛbenada',
+'sunday' => 'Kwasiada',
+'monday' => 'Ɛdwoada',
+'tuesday' => 'Ɛbenada',
 'wednesday' => 'Wukuada',
-'thursday'  => 'Yawoada',
-'friday'    => 'Efiada',
-'saturday'  => 'Memeneda',
-'january'   => 'Ɔpɛpɔn',
-'february'  => 'Ɔgyefuo',
-'march'     => 'Ɔbenem',
-'april'     => 'Oforisuo',
-'may_long'  => 'Kɔtonimma',
-'june'      => 'Ayɛwohomumu',
-'july'      => 'Kutawonsa',
-'august'    => 'Ɔsannaa',
+'thursday' => 'Yawoada',
+'friday' => 'Efiada',
+'saturday' => 'Memeneda',
+'january' => 'Ɔpɛpɔn',
+'february' => 'Ɔgyefuo',
+'march' => 'Ɔbenem',
+'april' => 'Oforisuo',
+'may_long' => 'Kɔtonimma',
+'june' => 'Ayɛwohomumu',
+'july' => 'Kutawonsa',
+'august' => 'Ɔsannaa',
 'september' => 'Ɛbɔ',
-'october'   => 'Ahinime',
-'november'  => 'Obubuo',
-'december'  => 'Ɔpenimma',
+'october' => 'Ahinime',
+'november' => 'Obubuo',
+'december' => 'Ɔpenimma',
 
 # Categories related messages
 'listingcontinuesabbrev' => 'toa so',
 
-'search'           => 'Hwehwɛ',
-'searchbutton'     => 'Hwehwɛ',
-'go'               => 'Kɔ',
-'searcharticle'    => 'Kɔ',
-'history'          => 'Krataafa abakɔsɛm',
-'history_short'    => 'Abakɔsɛm',
+'search' => 'Hwehwɛ',
+'searchbutton' => 'Hwehwɛ',
+'go' => 'Kɔ',
+'searcharticle' => 'Kɔ',
+'history' => 'Krataafa abakɔsɛm',
+'history_short' => 'Abakɔsɛm',
 'talkpagelinktext' => 'Kasa',
-'talk'             => 'Nkɔmbɔ',
-'jumptosearch'     => 'hwehwɛ',
+'talk' => 'Nkɔmbɔ',
+'jumptosearch' => 'hwehwɛ',
 
 # 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' => 'Fa {{SITENAME}} ho',
-'mainpage'  => 'Krataafa Titiriw',
+'mainpage' => 'Krataafa Titiriw',
 
-'editsection'     => 'sesa',
+'editsection' => 'sesa',
 'editsectionhint' => 'Sesa sɛkhyɛn: $1',
-'red-link-title'  => '$1 (krataafa nni hɔ)',
+'red-link-title' => '$1 (krataafa nni hɔ)',
 
 # Login and logout pages
-'login'                   => 'Bra mu',
+'login' => 'Bra mu',
 'nav-login-createaccount' => 'Bra mu / yɛ akawnt',
-'userlogin'               => 'Bra mu / yɛ akawnt',
-'logout'                  => 'Pue',
-'userlogout'              => 'Pue',
-'notloggedin'             => 'Mmbaa mu',
-'nologin'                 => 'Wo nni akawnt anaa? $1.',
+'userlogin' => 'Bra mu / yɛ akawnt',
+'logout' => 'Pue',
+'userlogout' => 'Pue',
+'notloggedin' => 'Mmbaa mu',
+'nologin' => 'Wo nni akawnt anaa? $1.',
 
 # Search results
 'powersearch' => 'Hwehwɛ',
index 9a1f89d..ac98994 100644 (file)
@@ -211,7 +211,6 @@ $messages = array(
 'qbbrowse' => 'Shfleto',
 'qbedit' => 'Redakto',
 'qbpageoptions' => 'Kjo faqe',
-'qbpageinfo' => 'Konteksti',
 'qbmyoptions' => 'Faqet e mija',
 'qbspecialpages' => 'Faqet speciale',
 'faq' => 'Pyetjet e shpeshta',
@@ -451,12 +450,8 @@ Arsyeja e dhânë âsht "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Jeni çlajmërue.'''
 
-Mundeni me vazhdue me shfrytëzue {{SITENAME}} në mënyrë anonime, apo mundeni [[Special:UserLogin|me u kyçë]] si përdoruesi i njêjtë apo si nji tjetër.
+Mundeni me vazhdue me shfrytëzue {{SITENAME}} në mënyrë anonime, apo mundeni <span class='plainlinks'>[$1 me u kyçë]</span> si përdoruesi i njêjtë apo si nji tjetër.
 Disa faqe mujnë me u paraqitë prap si t'kishit qenë t'kyçun, derisa ta pastroni memorizimin e shfletuesit.",
-'welcomecreation' => '== Mirësevini, $1! ==
-
-Llogaria juej âsht krijue.
-Mos harroni me i ndryshue [[Special:Preferences|parapëlqimet për {{SITENAME}}]].',
 'yourname' => 'Nofka:',
 'yourpassword' => 'Fjalëkalimi:',
 'yourpasswordagain' => 'Fjalëkalimi përsëdyti:',
@@ -929,8 +924,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'search-interwiki-caption' => 'Projektet simotra',
 'search-interwiki-default' => '$1 rezultate:',
 'search-interwiki-more' => '(mâ shumë)',
-'search-mwsuggest-enabled' => 'me parahedhje',
-'search-mwsuggest-disabled' => "s'ka parahedhje",
 'search-relatedarticle' => 'Të ngjajshme',
 'mwsuggest-disable' => 'Deaktivizo sygjerimet me AJAX',
 'searcheverything-enable' => 'Kërko në tâna hapësinat',
@@ -1621,4 +1614,8 @@ Tjerat kanë me mbetë të mshefuna.
 'revdelete-restricted' => 'u vendosën kufizime për administruesit',
 'revdelete-unrestricted' => 'u hoqën kufizimet për administruesit',
 
+# Search suggestions
+'searchsuggest-search' => 'Kërkim',
+'searchsuggest-containing' => 'përmban ...',
+
 );
index 22468f8..5aa7ce6 100644 (file)
@@ -182,7 +182,6 @@ $messages = array(
 'qbbrowse' => 'ቃኝ',
 'qbedit' => 'አርም',
 'qbpageoptions' => 'ይህ ገጽ',
-'qbpageinfo' => 'አግባብ',
 'qbmyoptions' => 'የኔ ገጾች',
 'qbspecialpages' => 'ልዩ ገጾች',
 'faq' => 'ብጊየጥ (ብዙ ጊዜ የሚጠየቁ ጥያቀዎች)',
@@ -197,7 +196,7 @@ $messages = array(
 'vector-action-unprotect' => 'አለመቆለፍ',
 'vector-view-create' => 'አዲስ ፍጠር',
 'vector-view-edit' => 'አርም',
-'vector-view-history' => ' ታሪኩን አሳይ',
+'vector-view-history' => 'ታሪኩን አሳይ',
 'vector-view-view' => 'ለማንበብ',
 'vector-view-viewsource' => 'ጥሬ ኮድ ለመመልከት',
 
@@ -389,9 +388,6 @@ $2",
 
 አሁንም በቁጥር መታወቂያዎ ማዘጋጀት ይቻላል። ወይም ደግሞ እንደገና በብዕር ስምዎ መግባት ይችላሉ።
 በጥቂት ሴኮንድ ውስጥ ወደሚከተለው ገጽ በቀጥታ ይመለሳል፦",
-'welcomecreation' => '== ሰላምታ፣ $1! ==
-
-የብዕር ስምዎ ተፈጥሯል። ምርጫዎችዎን ለማስተካከል ይችላሉ።',
 'yourname' => 'Username / የብዕር ስም:',
 'yourpassword' => 'Password / መግቢያ ቃል',
 'yourpasswordagain' => 'መግቢያ ቃልዎን ዳግመኛ ይስጡ',
@@ -736,8 +732,6 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'search-interwiki-caption' => 'ተዛማጅ ስራዎች',
 'search-interwiki-default' => '$1 ውጤቶች፦',
 'search-interwiki-more' => '(ተጨማሪ)',
-'search-mwsuggest-enabled' => 'ከ አማራጮች ጋር',
-'search-mwsuggest-disabled' => 'አማራጭ አልተገኘለትም',
 'search-relatedarticle' => 'የተዛመደ',
 'searchrelated' => 'የተዛመደ',
 'searchall' => 'ሁሉ',
@@ -946,6 +940,7 @@ $1ን ወይም ማንም ሌላ [[{{MediaWiki:Grouppage-sysop}}|መጋቢ]] ስ
 'recentchanges-legend' => 'የቅርብ ለውጥ አማራጮች፦',
 'recentchanges-summary' => 'በዚሁ ገጽ ላይ በቅርብ ጊዜ የወጡ አዳዲስ ለውጦች ለመከታተል ይችላሉ።',
 'recentchanges-feed-description' => 'በዚህ ዊኪ ላይ በቅርብ ግዜ የተለወጠውን በዚሁ feed መከታተል ይችላሉ',
+'recentchanges-label-minor' => 'ይህ ለውጥ ጥቃቅን ነው።',
 'rcnote' => "ከ$5 $4 እ.ኤ.አ. {{PLURAL:$2|ባለፈው 1 ቀን|ባለፉት '''$2''' ቀኖች}} {{PLURAL:$1|የተደረገው '''1''' ለውጥ እታች ይገኛል|የተደረጉት '''$1''' መጨረሻ ለውጦች እታች ይገኛሉ}}።",
 'rcnotefrom' => "ከ'''$2''' ጀምሮ የተቀየሩት ገጾች (እስከ '''$1''' ድረስ) ክዚህ በታች ይታያሉ።",
 'rclistfrom' => '(ከ $1 ጀምሮ አዲስ ለውጦቹን ለማየት)',
@@ -1363,11 +1358,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => 'የ{{SITENAME}} ኢሜል-ማስታወቂያ',
 'enotif_reset' => 'ገጾች ሁሉ የተጎበኙ ሆነው ለማመልከት',
-'enotif_newpagetext' => 'ይህ አዲስ ገጽ ነው።',
 'enotif_impersonal_salutation' => '{{SITENAME}} ተጠቃሚ',
-'changed' => 'ተለወጠ',
-'created' => 'ተፈጠረ',
-'enotif_subject' => 'የ{{SITENAME}} ገጽ $PAGETITLE  በ$PAGEEDITOR $CHANGEDORCREATED',
 'enotif_lastvisited' => 'መጨረሻ ከጎበኙ ጀምሮ ለውጦችን ሁሉ ለመመልከት $1 ይዩ።',
 'enotif_lastdiff' => 'ይህን ለውጥ ለማመልከት $1 ይዩ።',
 'enotif_anon_editor' => 'ቁጥር አድራሻ $1',
@@ -1837,6 +1828,16 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'spambot_username' => 'MediaWiki የስፓም ማፅዳት',
 'spam_reverting' => 'ወደ $1 የሚወስድ መያያዣ ወደሌለበት መጨረሻ ዕትም መለሰው',
 
+# Info page
+'pageinfo-firstuser' => 'የገጹ ፈጣሪ',
+'pageinfo-firsttime' => 'የተፈጠረበት ቀን',
+'pageinfo-lastuser' => 'የመጨረሻው አራሚ',
+'pageinfo-lasttime' => 'የመጨረሻው ዕትም ቀን',
+'pageinfo-edits' => 'ጠቅላላ የእርማት ቁጥር',
+'pageinfo-toolboxlink' => 'የዚህ ገጽ መረጃ',
+'pageinfo-contentpage-yes' => 'አዎ',
+'pageinfo-protect-cascading-yes' => 'አዎ',
+
 # Patrolling
 'markaspatrolleddiff' => 'የተሳለፈ ሆኖ ማመልከት',
 'markaspatrolledtext' => 'ይህን ገጽ የተመለከተ ሆኖ ለማሳለፍ',
@@ -2267,6 +2268,10 @@ $3
 # New logging system
 'newuserlog-byemail' => 'ማለፊያ-ቃል በኤ-መልዕክት ተልኳል',
 
+# Search suggestions
+'searchsuggest-search' => 'ፈልግ',
+'searchsuggest-containing' => 'በመጣጥፎች ይዘት ለመፈልግ...',
+
 # API errors
 'api-error-badaccess-groups' => 'እርስዎ በዚህ ውኪ ላይ ፋይል እንድሊኩ አልተፈቀደም።',
 'api-error-badtoken' => 'የውስጥ ስህተት: መጥፎ ጥቅል።',
index 293616c..d932ad9 100644 (file)
@@ -276,7 +276,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Ista pachina',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Pachinas propias',
 'qbspecialpages' => 'Pachinas especials',
 'faq' => 'Preguntas freqüents (FAQ)',
@@ -522,10 +521,7 @@ A razón data ye ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Ha rematato a sesión.'''
 
-Puede continar navegando por {{SITENAME}} anonimament, u puede [[Special:UserLogin|encetar]] una nueva sesión con o mesmo nombre d'usuario u bell atro diferent. Pare cuenta que, entre que se limpia a caché d'o navegador, puet estar que bellas pachinas s'amuestren como si encara continase en a sesión anterior.",
-'welcomecreation' => "== ¡Bienveniu(da), $1! ==
-S'ha creyato a suya cuenta.
-No xublide de presonalizar [[Special:Preferences|as suyas preferencias en {{SITENAME}}]].",
+Puede continar navegando por {{SITENAME}} anonimament, u puede <span class='plainlinks'>[$1 encetar]</span> una nueva sesión con o mesmo nombre d'usuario u bell atro diferent. Pare cuenta que, entre que se limpia a caché d'o navegador, puet estar que bellas pachinas s'amuestren como si encara continase en a sesión anterior.",
 'yourname' => "Nombre d'usuario:",
 'yourpassword' => "Clau d'acceso:",
 'yourpasswordagain' => 'Torne a escribir a clau:',
@@ -1085,8 +1081,6 @@ Asegure-se que iste cambio no trencará a continidat de l'historial d'a pachina.
 'search-interwiki-caption' => 'Prochectos chermans',
 'search-interwiki-default' => '$1 resultaus:',
 'search-interwiki-more' => '(más)',
-'search-mwsuggest-enabled' => 'con socherencias',
-'search-mwsuggest-disabled' => 'garra socherencia',
 'search-relatedarticle' => 'Relacionato',
 'mwsuggest-disable' => "Desactivar as socherencias d'AJAX",
 'searcheverything-enable' => 'Mirar en totz os espacios de nombres',
@@ -2057,11 +2051,7 @@ L\'adreza de correu-e que endicó en as suyas [[Special:Preferences|preferencias
 
 'enotif_mailer' => 'Sistema de notificación por correu de {{SITENAME}}',
 'enotif_reset' => 'Marcar todas as pachinas como vesitatas',
-'enotif_newpagetext' => 'Ista ye una nueva pachina.',
 'enotif_impersonal_salutation' => 'usuario de {{SITENAME}}',
-'changed' => 'editata',
-'created' => 'creyata',
-'enotif_subject' => 'A pachina $PAGETITLE de {{SITENAME}} ha estato $CHANGEDORCREATED por $PAGEEDITOR',
 'enotif_lastvisited' => 'Vaiga ta $1 ta veyer totz os cambeos dende a suya zaguer vesita.',
 'enotif_lastdiff' => 'Vaiga ta $1 ta veyer iste cambeo.',
 'enotif_anon_editor' => 'usuario anonimo $1',
@@ -2651,7 +2641,6 @@ Alce-lo en o suyo ordenador y cargue-lo aquí.",
 
 # JavaScriptTest
 'javascripttest' => 'Prebatinas de JavaScript',
-'javascripttest-disabled' => 'Ista función ye desactivata.',
 'javascripttest-title' => 'Fendo as prebas de $1',
 'javascripttest-pagetext-noframework' => 'Ista pachina ye reservada ta fer as prebas de JavaScrip.',
 'javascripttest-pagetext-unknownframework' => 'Bastida de prebas "$1" desconoixida.',
@@ -3633,6 +3622,10 @@ Si no, puet usar o siguient formulario. O suyo comentario será adhibiu a la pac
 'feedback-bugcheck' => 'Perfecto! Comprebe nomás que no sía un [$1 fallo conoixiu].',
 'feedback-bugnew' => "L'he comprebau. Informar d'un nuevo fallo.",
 
+# Search suggestions
+'searchsuggest-search' => 'Mirar',
+'searchsuggest-containing' => 'que contién...',
+
 # API errors
 'api-error-badaccess-groups' => 'No puetz cargar fichers en iste wiki.',
 'api-error-badtoken' => 'Error interna: Simbolo incorrecto.',
index 6c4919e..25040a2 100644 (file)
@@ -173,7 +173,6 @@ $messages = array(
 'qbbrowse' => 'Onbirȝe',
 'qbedit' => 'Ādihte',
 'qbpageoptions' => 'Þēos sīde',
-'qbpageinfo' => 'Ȝeƿef',
 'qbmyoptions' => 'Mīna sīdan',
 'qbspecialpages' => 'Syndriȝa sīdan',
 'faq' => 'Oftost ascoda ascunȝa',
@@ -359,11 +358,8 @@ Cȳþþuhord edƿende ƿōh "<tt>$3: $4</tt>"',
 # Login and logout pages
 'logouttext' => "'''Þū eart nū ūtmeldod.'''
 
-Þū canst ætfeolan tō brūcenne {{SITENAME}} ungecūðe, oþþe þū canst [[Special:UserLogin|inmeldian eft]] tō ylcan oþþe ōðrum brūcende.
+Þū canst ætfeolan tō brūcenne {{SITENAME}} ungecūðe, oþþe þū canst <span class='plainlinks'>[$1 inmeldian eft]</span> tō ylcan oþþe ōðrum brūcende.
 Cnāw þæt sume sīdan cunnon gelǣstende ēowod wesan swā þū wǣre gīet inmeldod, oþ þæt þū clǣnsie þīnes sēcendtōles gemynd.",
-'welcomecreation' => '== Ƿilcumen, $1! ==
-
-Þīn hordcleofa ƿearþ ȝescapen.  Ne forȝiet tō hƿierfenne þīna [[Special:Preferences|{{SITENAME}} foreberunga]].',
 'yourname' => 'Þīn brūcendnama',
 'yourpassword' => 'Þafungƿord:',
 'yourpasswordagain' => 'Þafungƿord edƿrītan:',
@@ -568,8 +564,6 @@ folcliċum āgnunge oþþe ȝelīċum frēom horde (sēo $1 for āscungum).
 'search-interwiki-caption' => 'Sƿeostorƿeorc',
 'search-interwiki-default' => '$1 becymas:',
 'search-interwiki-more' => '(mā)',
-'search-mwsuggest-enabled' => 'mid teohhungum',
-'search-mwsuggest-disabled' => 'nān teohhunga',
 'searchrelated' => 'ȝesibbed',
 'searchall' => 'eall',
 'showingresults' => 'Īewan under oþ <b>$1</b> tōhīgunga onginnenda mid #<b>$2</b>.',
@@ -880,10 +874,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watching' => 'Ƿæccende...',
 'unwatching' => 'Unƿæccende...',
 
-'enotif_newpagetext' => 'Þēos is nīƿu sīde.',
 'enotif_impersonal_salutation' => '{{SITENAME}} brūcend',
-'changed' => 'hƿorfen',
-'created' => 'ȝescapen',
 'enotif_lastvisited' => 'Sēo $1 for eall hƿearfas siþþan þīn læst cyme.',
 'enotif_lastdiff' => 'Sēo $1 to sēonne þisne hƿearf.',
 'enotif_anon_editor' => 'uncūþ brūcend $1',
index 0a34a77..8d82e18 100644 (file)
@@ -300,8 +300,6 @@ Hindi (hi)फ़िलहाल इस पन्ने पर कोई सा
 'search-interwiki-caption' => 'अन्य प्रकल्प',
 'search-interwiki-default' => '$1 के रिज़ल्ट:',
 'search-interwiki-more' => '(आरू)',
-'search-mwsuggest-enabled' => 'सुझाव सहित',
-'search-mwsuggest-disabled' => 'कोनो सुझाव नै',
 'nonefound' => "'''सूचना''': मूलतः कुछ ही नामस्थानॊ मॆं खोजलॊ जाय छै. अगर आपने कॆ सब नामस्थानॊ मॆं खोजना छै तॆ खोजशब्दॊ के पहले ''all:'' लगायकॆ खोजै के कोशिश करॊ या फिर कोनो नामस्थान के नाम लिखॊ.",
 'powersearch' => 'उन्नत खोज',
 'powersearch-legend' => 'उन्नत खोज',
index 322ebc4..0d50758 100644 (file)
  * @author Riadismet
  * @author Samer
  * @author Sami Lab
+ * @author TTMTT
  * @author Tarawneh
  * @author TheEgyptian
+ * @author Tux-tn
  * @author Uwe a
  * @author Zack wadghiri
  * @author Zanatos
@@ -193,7 +195,6 @@ $magicWords = array(
        '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' ),
@@ -420,7 +421,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'أحدث_التغييرات' ),
        'Recentchangeslinked'       => array( 'أحدث_التغييرات_الموصولة', 'تغييرات_مرتبطة' ),
        'Revisiondelete'            => array( 'حذف_مراجعة' ),
-       'RevisionMove'              => array( 'نقل_مراجعة' ),
        'Search'                    => array( 'بحث' ),
        'Shortpages'                => array( 'صفحات_قصيرة' ),
        'Specialpages'              => array( 'صفحات_خاصة' ),
@@ -613,7 +613,6 @@ $messages = array(
 'qbbrowse' => 'تصفح',
 'qbedit' => 'تعديل',
 'qbpageoptions' => 'هذه الصفحة',
-'qbpageinfo' => 'سياق النص',
 'qbmyoptions' => 'صفحاتي',
 'qbspecialpages' => 'الصفحات الخاصة',
 'faq' => 'الأسئلة المتكررة',
@@ -626,7 +625,7 @@ $messages = array(
 'vector-action-protect' => 'احم',
 'vector-action-undelete' => 'استرجع الحذف',
 'vector-action-unprotect' => 'غير الحماية',
-'vector-simplesearch-preference' => 'مكّن مقترحات البحث المُحسّنة (لواجهة فكتور فقط)',
+'vector-simplesearch-preference' => 'مكّن شريط البحث المبسط (لواجهة فكتور فقط)',
 'vector-view-create' => 'أنشئ',
 'vector-view-edit' => 'تعديل',
 'vector-view-history' => 'اعرض التاريخ',
@@ -732,7 +731,7 @@ $1',
 'youhavenewmessages' => 'توجد لديك $1 ($2).',
 'newmessageslink' => 'رسائل جديدة',
 'newmessagesdifflink' => 'آخر تغيير',
-'youhavenewmessagesfromusers' => 'لديك $1 من {{PLURAL:$3|مستخدم آخر|$3 مستخدمين}} ($2).',
+'youhavenewmessagesfromusers' => 'لديك $1 من {{PLURAL:$3||مستخدم واحد|مستخدمين اثنين|$3 مستخدمين|$3 مستخدماً|$3 مستخدم}} ($2).',
 'youhavenewmessagesmanyusers' => 'لديك $1 من مستخدمين كثر ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|رسالة جديدة|رسائل جديدة}}',
 'newmessagesdifflinkplural' => 'آخر {{PLURAL:$1|تغيير|تغييرات}}',
@@ -851,10 +850,11 @@ $1',
 'protectedpagetext' => 'هذه الصفحة تمت حمايتها لمنع التعديل.',
 'viewsourcetext' => 'يمكنك رؤية ونسخ مصدر هذه الصفحة:',
 'viewyourtext' => "يمكنك رؤية ونسخ مصدر ''' تعديلاتك ''' في هذه الصفحة:",
-'protectedinterface' => 'هذه الصفحة توفر نص الواجهة للبرنامج، وهي مقفلة لمنع التخريب.',
+'protectedinterface' => 'توفر هذه الصفحة نص الواجهة للبرنامج على هذا الويكي، وهي محمية لمنع سوء أستخدامها.
+لإضافة أو تغيير الترجمات لجميع مشاريع الويكي، رجاءً أستخدم [//translatewiki.net/ translatewiki.net]، مشروع الترجمة الخاص بميدياويكي.',
 'editinginterface' => "'''تحذير:''' أنت تقوم بتحرير صفحة تستخدم في الواجهة النصية للبرنامج.
-سوف تؤثر التغييرات على هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين.
لترجمات، من فضلك استخدم مشروع ترجمة ميدياويكي [//translatewiki.net/wiki/Main_Page?setlang=ar translatewiki.net].",
+سوف تؤثر التغييرات في هذه الصفحة على مظهر واجهة المستخدم للمستخدمين الآخرين على هذا الويكي.
إضافة أو تغيير الترجمات في جميع مشاريع الويكي، رجاءً استخدم [//translatewiki.net/ translatewiki.net]، مشروع الترجمة الخاص بميدياويكي.",
 'sqlhidden' => '(استعلام SQL مخفي)',
 'cascadeprotected' => 'تمت حماية هذه الصفحة من التعديل لأنها مدمجة في {{PLURAL:$1||الصفحة التالية، والتي|الصفحتين التاليتين، واللتين|الصفحات التالية، والتي}} تم استعمال خاصية "حماية الصفحات المدمجة" {{PLURAL:$1||بها|بهما|بها}}:
 $2',
@@ -880,11 +880,11 @@ $2',
 # Login and logout pages
 'logouttext' => "'''أنت الآن غير مسجل الدخول.'''
 
-تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو [[Special:UserLogin|الدخول مرة أخرى]] بنفس الاسم أو باسم آخر.
+تستطيع المتابعة باستعمال {{SITENAME}} كمجهول، أو <span class='plainlinks'>[$1 الدخول مرة أخرى]</span> بنفس الاسم أو باسم آخر.
 من الممكن أن ترى بعض الصفحات كما لو أنك مسجل الدخول، وذلك حتى تقوم بإفراغ الصفحات المختزنة في المتصفح لديك.",
-'welcomecreation' => '== مرحبا، $1! ==
-تم إنشاء حسابك.
\84ا ØªÙ\86س Ø£Ù\86 ØªØºÙ\8aر [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].',
+'welcomeuser' => 'أهلاً بك يا $1!',
+'welcomecreation-msg' => 'تم إنشاء حسابك.
\84ا ØªÙ\86س ØªØ¹Ø¯Ù\8aÙ\84 [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].',
 'yourname' => 'اسم المستخدم:',
 'yourpassword' => 'كلمة السر:',
 'yourpasswordagain' => 'أعد كتابة كلمة السر:',
@@ -963,7 +963,7 @@ $2',
 'emailauthenticated' => 'تم تأكيد بريدك الإلكتروني في $2 الساعة $3.',
 'emailnotauthenticated' => 'لم يتم التحقق من بريدك الإلكتروني.
 لن يتم إرسال رسائل لأي من الميزات التالية.',
-'noemailprefs' => 'حدد عنوان بريد إلكتروني في تفضيلاتك لهذه الخصائص لتعمل.',
+'noemailprefs' => 'حدد عنوان بريد إلكتروني في تفضيلاتك لتفعيل هذه الخصائص.',
 'emailconfirmlink' => 'أكد عنوان بريدك الإلكتروني',
 'invalidemailaddress' => 'لا يمكن قبول عنوان البريد الإلكتروني حيث تبدو صيغته خاطئة.
 ضع عنوانا مضبوطا أو أفرغ هذا الحقل.',
@@ -1142,7 +1142,8 @@ $2
 يمكنك [[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-nopermission' => 'لا يوجد حاليا أي نص في هذه الصفحة.
+يمكنك [[Special:Search/{{PAGENAME}}|البحث عن عنوان هذه الصفحة]] في الصفحات الأخرى، أو <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} البحث في السجلات المتعلقة بها]</span>، لكنك لست مخولاً لإنشاء هذه الصفحة.',
 'missing-revision' => 'المراجعة #$1 من الصفحة المسماة "{{PAGENAME}}" غير موجودة.
 
 هذا يحدث عادة عن طريق اتباع وصلة تاريخ قديمة لصفحة تم حذفها.
@@ -1259,6 +1260,15 @@ $2
 'edit-already-exists' => 'لم يمكن إنشاء صفحة جديدة.
 هي موجودة بالفعل.',
 'defaultmessagetext' => 'نص الرسالة الافتراضي',
+'content-failed-to-parse' => 'فشل في تحليل $2 محتوى لـ $1 نموذج: $3',
+'invalid-content-data' => 'بيانات المحتوى غير صالحة',
+'content-not-allowed-here' => '"$1" المحتوى غير مسموح على صفحة [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'نص ويكي',
+'content-model-text' => 'نص عادي',
+'content-model-javascript' => 'جافاسكربت',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''تحذير:''' هذه الصفحة تحتوي على استدعاءات دالة محلل كثيرة مكلفة.
@@ -1518,8 +1528,6 @@ $1",
 'search-interwiki-caption' => 'المشاريع الشقيقة',
 'search-interwiki-default' => '$1 نتيجة:',
 'search-interwiki-more' => '(المزيد)',
-'search-mwsuggest-enabled' => 'مع اقتراحات',
-'search-mwsuggest-disabled' => 'لا اقتراحات',
 'search-relatedarticle' => 'مرتبطة',
 'mwsuggest-disable' => 'عطل اقتراحات أجاكس',
 'searcheverything-enable' => 'ابحث في جميع النطاقات',
@@ -1618,7 +1626,7 @@ $1",
 'timezoneregion-indian' => 'المحيط الهندي',
 'timezoneregion-pacific' => 'المحيط الهادي',
 'allowemail' => 'مكن تلقي البريد الإلكتروني من المستخدمين الآخرين',
-'prefs-searchoptions' => 'Ø®Ù\8aارات Ø§Ù\84بحث',
+'prefs-searchoptions' => 'البحث',
 'prefs-namespaces' => 'أسماء النطاقات',
 'defaultns' => 'أو ابحث في هذه النطاقات:',
 'default' => 'افتراضي',
@@ -1652,8 +1660,8 @@ $1",
 'email' => 'البريد الإلكتروني',
 'prefs-help-realname' => 'الاسم الحقيقي اختياري.
 لو اخترت أن توفره، فسيستخدم في الإشارة إلى عملك.',
-'prefs-help-email' => 'عÙ\86Ù\88اÙ\86 Ø§Ù\84برÙ\8aد Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a Ù\87Ù\88 Ø£Ù\85ر Ø§Ø®ØªÙ\8aارÙ\8aØ\8c Ù\88Ù\84Ù\83Ù\86 Ø³ØªØ­ØªØ§Ø¬ Ù\84إعادة ØªØ¹Ù\8aÙ\8aÙ\86 Ù\83Ù\84Ù\85Ø© Ø§Ù\84Ù\85رÙ\88رØ\8c Ø¥Ù\86 نسيت كلمة المرور الخاصة بك.',
-'prefs-help-email-others' => 'Ù\8aÙ\85Ù\83Ù\86Ù\83 Ø£Ù\8aضا Ø§Ø®ØªÙ\8aار Ù\84Ù\84سÙ\85اح Ù\84Ù\84آخرÙ\8aÙ\86 Ø§Ù\84اتصاÙ\84 Ø¨Ù\83 Ø¹Ù\86 Ø·Ø±Ù\8aÙ\82 ØµÙ\81حة Ø§Ù\84Ù\85ستخدÙ\85 Ø£Ù\88 Ù\86Ù\82اش Ø§Ù\84Ù\85ستخدÙ\85 Ø§Ù\84خاص Ø¨Ù\83 Ø¯Ù\88Ù\86 Ø§Ù\84حاجة Ø¥Ù\84Ù\89 Ø§Ù\84Ù\83Ø´Ù\81 Ø¹Ù\86 Ø§Ù\84Ù\87Ù\88Ù\8aØ© Ø§Ù\84خاصة Ø¨Ù\83.',
+'prefs-help-email' => 'تحدÙ\8aد Ø¹Ù\86Ù\88اÙ\86 Ø§Ù\84برÙ\8aد Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a Ø§Ø®ØªÙ\8aارÙ\8aØ\8c Ù\88Ù\84Ù\83Ù\86Ù\87 Ù\8aÙ\84زÙ\85 Ù\84إعادة ØªØ¹Ù\8aÙ\8aÙ\86 Ù\83Ù\84Ù\85Ø© Ø§Ù\84Ù\85رÙ\88ر Ù\81Ù\8a Ø­Ø§Ù\84 نسيت كلمة المرور الخاصة بك.',
+'prefs-help-email-others' => 'Ù\8aÙ\85Ù\83Ù\86Ù\83 Ø£Ù\8aضا Ø£Ù\86 {{GENDER:$1|تسÙ\85Ø­|تسÙ\85Ø­Ù\8a}} Ù\84Ù\84آخرÙ\8aÙ\86 Ø§Ù\84اتصاÙ\84 Ø¨Ù\83 Ø¹Ù\86 Ø·Ø±Ù\8aÙ\82 Ù\88صÙ\84Ø© Ù\81Ù\8a ØµÙ\81حة Ø§Ù\84Ù\85ستخدÙ\85 Ø£Ù\88 Ù\86Ù\82اش Ø§Ù\84Ù\85ستخدÙ\85 Ø§Ù\84خاصة Ø¨Ù\83. Ù\84ا Ù\8aÙ\83Ø´Ù\81 Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a Ø¹Ù\86دÙ\85ا Ù\8aراسÙ\84Ù\83 Ø£Ø­Ø¯ Ø¨Ù\87Ø°Ù\87 Ø§Ù\84طرÙ\8aÙ\82Ø©Ø\8c Ù\88Ù\84Ù\83Ù\86 Ø¥Ø°Ø§ Ø±Ø§Ø³Ù\84ت Ø£Ø­Ø¯Ø§Ù\8b Ø³Ù\8aرÙ\89 Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a.',
 'prefs-help-email-required' => 'عنوان البريد الإلكتروني مطلوب.',
 'prefs-info' => 'المعلومات الأساسية',
 'prefs-i18n' => 'الترجمة',
@@ -2187,7 +2195,7 @@ $1',
 'shared-repo' => 'مستودع مشترك',
 'shared-repo-name-wikimediacommons' => 'ويكيميديا كومنز',
 'filepage.css' => '/* CSS المعروض هنا سيضمن في صفحات وصف الملفات، أيضا على الويكيات الأجنبية */',
-'upload-disallowed-here' => 'لأسف لا يمكنك تعديل هذه الصورة.',
+'upload-disallowed-here' => 'للأسف لا يمكنك تعديل هذه الصورة.',
 
 # File reversion
 'filerevert' => 'استرجع $1',
@@ -2544,11 +2552,7 @@ $1',
 
 'enotif_mailer' => 'نظام {{SITENAME}} البريدي للإخطارات',
 'enotif_reset' => 'علم على كل الصفحات كمزارة',
-'enotif_newpagetext' => 'هذه صفحة جديدة.',
 'enotif_impersonal_salutation' => 'مستخدم {{SITENAME}}',
-'changed' => 'غيرت',
-'created' => 'أنشئت',
-'enotif_subject' => 'صفحة {{SITENAME}} $PAGETITLE $CHANGEDORCREATED بواسطة $PAGEEDITOR',
 'enotif_lastvisited' => 'انظر $1 لكل التغييرات منذ زيارتك الأخيرة.',
 'enotif_lastdiff' => 'انظر $1 لرؤية هذا التغيير.',
 'enotif_anon_editor' => 'مستخدم مجهول $1',
@@ -2737,7 +2741,7 @@ $UNWATCHURL
 'undeletedrevisions-files' => 'أسترجعت {{PLURAL:$1||مراجعة واحدة|مراجعتان|$1 مراجعات|$1 مراجعة}}  و{{PLURAL:$2||ملف واحد|ملفان|$2 ملفات|$2 ملفًا|$2 ملف}}',
 'undeletedfiles' => 'أسترجع {{PLURAL:$1||ملف واحد|ملفان|$1 ملفات|$1 ملفًا|$1 ملف}}',
 'cannotundelete' => 'فشل الاسترجاع؛
-ربما قام شخص آخر باسترجاع الصفحة بالفعل.',
+$1',
 'undeletedpage' => "'''تم استرجاع $1'''
 
 راجع [[Special:Log/delete|سجل الحدف]] لمعاينة عمليات الحذف والاسترجاعات الحديثة.",
@@ -3047,6 +3051,7 @@ $1',
 'immobile-target-namespace-iw' => 'وصلة الإنترويكي ليست هدفاً صالحاً لنقل صفحة.',
 'immobile-source-page' => 'هذه الصفحة غير قابلة للنقل.',
 'immobile-target-page' => 'غير قادر على النقل إلى العنوان الوجهة هذا.',
+'bad-target-model' => 'الوجهة المطلوبة تستخدم نموذج محتوى مختلف. لا يمكن تحويل من $1 إلى $2.',
 'imagenocrossnamespace' => 'لا يمكن نقل الملف إلى نطاق غير نطاق الملفات',
 'nonfile-cannot-move-to-file' => 'لا يمكن نقل غير الملفات إلى نطاق الملفات',
 'imagetypemismatch' => 'امتداد الملف الجديد لا يطابق نوعه',
@@ -3175,7 +3180,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'اختبار جافاسكربت',
-'javascripttest-disabled' => 'هذه الخاصية معطلة.',
 'javascripttest-title' => 'تشغيل أختبارات $1',
 'javascripttest-pagetext-noframework' => 'هذه الصفحة محجوزة لإجراء أختبارات الجافا سكريبت.',
 'javascripttest-pagetext-unknownframework' => 'إطار اختبار غير معروف "$1".',
@@ -3316,7 +3320,8 @@ $1',
 'spam_deleting' => 'جميع النسخ تحوي رابطا إلى $1، يتم الحذف',
 
 # Info page
-'pageinfo-title' => 'المعلومات ل"$1"',
+'pageinfo-title' => 'المعلومات عن «$1»',
+'pageinfo-not-current' => 'لا يمكن إظهار المعلومات إلا عن المراجعة الأخيرة للصفحة',
 'pageinfo-header-basic' => 'المعلومات الأساسية',
 'pageinfo-header-edits' => 'التعديلات',
 'pageinfo-header-restrictions' => 'حماية الصفحة',
@@ -3325,26 +3330,34 @@ $1',
 'pageinfo-default-sort' => 'مفتاح الترتيب الافتراضي',
 'pageinfo-length' => 'حجم الصفحة (بالبايت)',
 'pageinfo-article-id' => 'معرف الصفحة (ID)',
+'pageinfo-language' => 'لغة محتوى الصفحة',
 'pageinfo-robot-policy' => 'الصفة في محرك البحث',
 'pageinfo-robot-index' => 'قابلة للفهرسة',
 'pageinfo-robot-noindex' => 'غير قابلة للفهرسة',
 'pageinfo-views' => 'عدد المشاهدات',
 'pageinfo-watchers' => 'عدد المراقبين',
-'pageinfo-redirects-name' => 'التوجيهات نحو هذه الصفحة',
+'pageinfo-redirects-name' => 'التحويلات إلى هذه الصفحة',
 'pageinfo-subpages-name' => 'الصفحات الفرعية لهذه الصفحة',
-'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|إعادة توجيه|إعادة توجيهات}}; $3 {{PLURAL:$3|غير إعادة توجيه|غير إعادة التوجيهات}})',
+'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|لا تحويلات|تحويلة واحدة|تحويلتان|$2 تحويلات|$2 تحويلة}}؛ $3 {{PLURAL:$3|من غير  التحويلات}})',
 'pageinfo-firstuser' => 'منشئ الصفحة',
 'pageinfo-firsttime' => 'تاريخ إنشاء الصفحة',
 'pageinfo-lastuser' => 'آخر محرر',
 'pageinfo-lasttime' => 'تاريخ آخر تعديل',
 'pageinfo-edits' => 'عدد التعديلات',
 'pageinfo-authors' => 'عدد المؤلفين المختلفين',
-'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال  $1 يوم/أيام)',
+'pageinfo-recent-edits' => 'عدد التعديلات الأخيرة (خلال {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يوماً|$1 يوم}})',
 'pageinfo-recent-authors' => 'عدد المؤلفين المختلفين الأخيرين',
-'pageinfo-restriction' => 'حماية الصفحة ($1)',
-'pageinfo-magic-words' => 'السحرية {{PLURAL:$1|الكلمة|الكلمات}} ($1)',
-'pageinfo-hidden-categories' => 'مخفية {{PLURAL:$1|فئة|فئات}} ($1)',
-'pageinfo-templates' => 'متضمنة {{PLURAL:$1|قالب|قوالب}} ($1)',
+'pageinfo-magic-words' => '{{PLURAL:$1|لا كلمات سحرية|الكلمة|الكلمات}} السحرية ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|لا تصنيفات مخفية|التصنيف المخفي|التصنيفان المخفيان|التصنيفات المخفية ($1)}}',
+'pageinfo-templates' => '{{PLURAL:$1|لا قوالب مضمنة|القالب المضمن|القالبان المضمنان|القوالب المضمنة ($1)}}',
+'pageinfo-toolboxlink' => 'معلومات عن هذه الصفحة',
+'pageinfo-redirectsto' => 'تحويلة إلى',
+'pageinfo-redirectsto-info' => 'معلومات',
+'pageinfo-contentpage' => 'محسوبة كصفحة محتوى',
+'pageinfo-contentpage-yes' => 'نعم',
+'pageinfo-protect-cascading' => 'مصدر توريث  الحماية للصفحات المدمجة',
+'pageinfo-protect-cascading-yes' => 'نعم',
+'pageinfo-protect-cascading-from' => 'حماية الصفحات المدمجة موروثة من',
 
 # Skin names
 'skinname-standard' => 'كلاسيك',
@@ -3966,6 +3979,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[التضمين بالإنترويكي معطل]',
 'scarytranscludefailed' => '[البحث عن القالب فشل ل$1]',
+'scarytranscludefailed-httpstatus' => '[فشل جلب القالب لـ $1: HTTP $2]',
 'scarytranscludetoolong' => '[المسار طويل للغاية]',
 
 # Delete conflict
@@ -4328,6 +4342,10 @@ $5
 'feedback-bugcheck' => 'رائع! تحقق من أن هذه ليست إحدى [$1 العلل المعروفة].',
 'feedback-bugnew' => 'لقد تحققت. بلّغ عن علة جديدة.',
 
+# Search suggestions
+'searchsuggest-search' => 'بحث',
+'searchsuggest-containing' => 'يحتوي...',
+
 # API errors
 'api-error-badaccess-groups' => 'لا يسمح لك بتحميل الملفات إلى هذه الويكي.',
 'api-error-badtoken' => 'خطأ داخلي: رمز مميز غير صحيح.',
@@ -4372,7 +4390,7 @@ $5
 # Durations
 'duration-seconds' => '{{PLURAL:$1|أقل من ثانية|ثانية واحدة|ثانيتان|$1 ثوانٍ|$1 ثانية}}',
 'duration-minutes' => '{{PLURAL:$1|أقل من دقيقة|دقيقة واحدة|دقيقتان|$1 دقائق|$1 دقيقة}}',
-'duration-hours' => '({{PLURAL:$1||ساعة واحد|ساعتان|$1 ساعات|$1 ساعة}})',
+'duration-hours' => '({{PLURAL:$1||ساعة واحدة|ساعتان|$1 ساعات|$1 ساعة}})',
 'duration-days' => '{{PLURAL:$1||يوم واحد|يومان|$1 أيام|$1 يومًا|$1 يوم}}',
 'duration-weeks' => '{{PLURAL:$1||أسبوع واحد|أسبوعان|$1 أسابيع|$1 أسبوعًا|$1 أسبوع}}',
 'duration-years' => '{{PLURAL: $1||سنة واحدة|سنتان|$1 سنين|$1 سنة}}',
index e26e5ae..29bc99d 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author 334a
  * @author A2raya07
+ * @author Amire80
  * @author Basharh
  * @author Man2fly2002
  * @author Michaelovic
@@ -46,16 +47,30 @@ $specialPageAliases = array(
        'Activeusers'               => array( 'ܡܦܠܚܢ̈ܐ_ܙܪ̄ܝܙܐ' ),
        'Allmessages'               => array( 'ܟܠ_ܐܓܪ̈ܬܐ' ),
        'Allpages'                  => array( 'ܟܠ_ܦܐܬܬ̈ܐ' ),
+       'Ancientpages'              => array( 'ܦܐܬܬ̈ܐ_ܥܬܝܩܬ̈ܐ' ),
        'Badtitle'                  => array( 'ܟܘܢܝܐ_ܠܐ_ܛܒܐ' ),
        'Blankpage'                 => array( 'ܦܐܬܐ_ܣܦܝܩܬܐ' ),
+       'BrokenRedirects'           => array( 'ܨܘܝܒ̈ܐ_ܬܒܝܪ̈ܐ' ),
        'Categories'                => array( 'ܣܕܪ̈ܐ' ),
+       'ChangeEmail'               => array( 'ܫܚܠܦ_ܒܝܠܕܪܐ_ܐܠܩܛܪܘܢܝܐ' ),
+       'ComparePages'              => array( 'ܦܚܘܡ_ܒܝܢܬ_ܦܐܬܬ̈ܐ' ),
+       'Confirmemail'              => array( 'ܫܪܪ_ܒܝܠܕܪܐ_ܐܠܩܛܪܘܢܝܐ' ),
        'Contributions'             => array( 'ܫܘܬܦܘܝܬ̈ܐ' ),
        'CreateAccount'             => array( 'ܒܪܝ_ܚܘܫܒܢܐ' ),
+       'Deadendpages'              => array( 'ܦܐܬܬ̈ܐ_ܥܡ_ܚܪܬܐ_ܡܝܬܬܐ' ),
        'DeletedContributions'      => array( 'ܫܘܬܦܘܝܬ̈ܐ_ܫܝܦܬ̈ܐ' ),
+       'Disambiguations'           => array( 'ܬܘܚܡ̈ܐ_ܐܚܪ̈ܢܐ' ),
+       'DoubleRedirects'           => array( 'ܨܘܝܒ̈ܐ_ܥܦܝܦ̈ܐ' ),
+       'EditWatchlist'             => array( 'ܫܚܠܦ_ܪ̈ܗܝܬܐ' ),
+       'Emailuser'                 => array( 'ܫܕܪ_ܒܝܠܕܪܐ_ܐܠܩܛܪܘܢܝܐ_ܠܡܦܠܚܢܐ' ),
+       'Fewestrevisions'           => array( 'ܬܢܝܬ̈ܐ_ܒܨܝܪ_ܡܢ_ܟܠ' ),
        'Filepath'                  => array( 'ܫܒܝܠܐ_ܕܦܐܬܐ' ),
        'Log'                       => array( 'ܣܓܠܐ', 'ܣܓܠ̈ܐ' ),
        'Lonelypages'               => array( 'ܦܐܬܬ̈ܐ_ܝܬܡܬ̈ܐ' ),
        'Longpages'                 => array( 'ܦܐܬܬ̈ܐ_ܐܪ̈ܝܟܬܐ' ),
+       'Mostlinkedcategories'      => array( 'ܣܕܪ̈ܐ_ܐܣܝܪ̈ܐ_ܝܬܝܪ_ܡܢ_ܟܠ', 'ܣܕܪ̈ܐ_ܦܠܝܚ̈ܐ_ܝܬܝܪ_ܡܢ_ܟܠ' ),
+       'Mostlinkedtemplates'       => array( 'ܩܠܒ̈ܐ_ܐܣܝܪ̈ܐ_ܝܬܝܪ_ܡܢ_ܟܠ', 'ܩܠܒ̈ܐ_ܦܠܝܚ̈ܐ_ܝܬܝܪ_ܡܢ_ܟܠ' ),
+       'Mostrevisions'             => array( 'ܬܢܝܬ̈ܐ_ܝܬܝܪ_ܡܢ_ܟܠ' ),
        'Movepage'                  => array( 'ܫܢܝ_ܦܐܬܐ' ),
        'Mycontributions'           => array( 'ܫܘܬܦܘܝܬ̈ܝ' ),
        'Mypage'                    => array( 'ܦܐܬܐ_ܕܝܠܝ' ),
@@ -64,6 +79,7 @@ $specialPageAliases = array(
        'Newimages'                 => array( 'ܠܦܦ̈ܐ_ܚܕ̈ܬܐ', 'ܨܘܪ̈ܬܐ_ܚܕ̈ܬܬܐ' ),
        'Newpages'                  => array( 'ܦܐܬܬ̈ܐ_ܚܕ̈ܬܬܐ' ),
        'PermanentLink'             => array( 'ܐܣܘܪܐ_ܦܝܘܫܐ' ),
+       'Popularpages'              => array( 'ܦܐܬܬ̈ܐ_ܡܫܡܗ̈ܐ' ),
        'Preferences'               => array( 'ܨܒܝܢܝܘܬ̈ܐ' ),
        'Protectedpages'            => array( 'ܦܐܬܬ̈ܐ_ܢܛܝܪ̈ܬܐ' ),
        'Protectedtitles'           => array( 'ܟܘܢܝ̈ܐ_ܢܛܝܪ̈ܐ' ),
@@ -71,8 +87,23 @@ $specialPageAliases = array(
        'Search'                    => array( 'ܒܨܝܐ' ),
        'Shortpages'                => array( 'ܦܐܬܬ̈ܐ_ܟܪ̈ܝܬܐ' ),
        'Specialpages'              => array( 'ܦܐܬܬ̈ܐ_ܕ̈ܝܠܢܝܬܐ' ),
+       'Uncategorizedcategories'   => array( 'ܣܕܪ̈ܐ_ܠܐ_ܣܕܝܪ̈ܐ' ),
+       'Uncategorizedimages'       => array( 'ܠܦܦ̈ܐ_ܠܐ_ܣܕܝܪ̈ܐ', 'ܨܘܪ̈ܬܐ_ܠܐ_ܣܕܝܪ̈ܬܐ' ),
+       'Uncategorizedpages'        => array( 'ܦܐܬܬ̈ܐ_ܠܐ_ܣܕܝܪ̈ܬܐ' ),
+       'Uncategorizedtemplates'    => array( 'ܩܠܒ̈ܐ_ܠܐ_ܣܕܝܪ̈ܐ' ),
+       'Unusedcategories'          => array( 'ܣܕܪ̈ܐ_ܠܐ_ܦܠܝܚ̈ܐ' ),
+       'Unusedimages'              => array( 'ܠܦܦ̈ܐ_ܠܐ_ܦܠܝܚ̈ܐ', 'ܨܘܪ̈ܬܐ_ܠܐ_ܦܠܝܚܬ̈ܐ' ),
+       'Unusedtemplates'           => array( 'ܩܠܒ̈ܐ_ܠܐ_ܦܠܝܚ̈ܐ' ),
+       'Unwatchedpages'            => array( 'ܦܐܬܬ̈ܐ_ܠܐ_ܣܢܝܩܬ̈ܐ' ),
        'Upload'                    => array( 'ܐܣܩ' ),
+       'Userlogin'                 => array( 'ܥܠܠܐ_ܕܡܦܠܚܢܐ' ),
+       'Userlogout'                => array( 'ܦܠܛܐ_ܕܡܦܠܚܢܐ' ),
+       'Userrights'                => array( 'ܙܕ̈ܩܐ_ܕܡܦܠܚܢܐ', 'ܥܒܘܕ_ܡܕܒܪܢܐ_ܕܛܟܣܐ', 'ܥܒܘܕ_ܒܘܛ' ),
        'Version'                   => array( 'ܨܚܚܐ' ),
+       'Wantedcategories'          => array( 'ܣܕܪ̈ܐ_ܣܢܝܩ̈ܐ' ),
+       'Wantedfiles'               => array( 'ܠܦܦ̈ܐ_ܣܢܝܩ̈ܐ' ),
+       'Wantedpages'               => array( 'ܦܐܬܬ̈ܐ_ܣܢܝܩܬ̈ܐ', 'ܐܣܘܪ̈ܐ_ܬܒܝܪ̈ܐ' ),
+       'Wantedtemplates'           => array( 'ܩܠܒ̈ܐ_ܣܢܝܩ̈ܐ' ),
        'Watchlist'                 => array( 'ܪ̈ܗܝܬܐ' ),
        'Whatlinkshere'             => array( 'ܡܐ_ܐܣܪ_ܠܗܪܟܐ' ),
 );
@@ -116,6 +147,7 @@ $messages = array(
 'tog-watchdefault' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܚܠܦ ܐܢܐ ܠܪ̈ܗܝܬܝ',
 'tog-watchmoves' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܢܐ ܐܢܐ ܠܪ̈ܗܝܬܝ',
 'tog-watchdeletion' => 'ܐܘܣܦ ܦܐܬܬ̈ܐ ܘܠܦܦ̈ܐ ܕܫܐܦ ܐܢܐ ܠܪ̈ܗܝܬܝ',
+'tog-oldsig' => 'ܪܡܝ ܐܝܕܐ ܗܫܝܐ:',
 'tog-watchlisthideown' => 'ܛܫܝ ܫܘܚܠܦ̈ܝ ܡܢ ܪ̈ܗܝܬܐ',
 'tog-watchlisthidebots' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܕܒܘܬ ܡܢ ܪ̈ܗܝܬܐ',
 'tog-watchlisthideminor' => 'ܛܫܝ ܫܘܚܠܦ̈ܐ ܙܥܘܪ̈ܐ ܡܢ ܪ̈ܗܝܬܐ',
@@ -184,14 +216,14 @@ $messages = array(
 'category_header' => 'ܦܐܬܬ̈ܐ ܒܣܕܪܐ ܕ "$1"',
 'subcategories' => 'ܣܕܪ̈ܐ ܦܪ̈ܥܝܐ',
 'category-media-header' => 'ܡܝܕܝܐ ܒܣܕܪܐ ܕ "$1"',
-'category-empty' => "''ܗܢܐ ܣܕܪܐ ܗܫܐ ܠܝܬ ܒܗ ܦܐܬܬ̈ܐ ܐܘ ܡܝܕܝܐ.''",
+'category-empty' => "''ܗܢܐ ܣܕܪܐ ܗܫܐܝܬ ܠܝܬ ܒܗ ܦܐܬܬ̈ܐ ܐܘ ܡܝܕܝܐ.''",
 'hidden-categories' => '{{PLURAL:$1|ܣܕܪܐ ܛܘܫܝܐ|ܣܕܪ̈ܐ ܛܘܫܝܐ}}',
 'hidden-category-category' => 'ܣܕܪ̈ܐ ܛܘܫܝ̈ܐ',
 'category-subcat-count' => '{{PLURAL:$2|ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ ܗܢܐ ܣܕܪܐ ܦܪܥܝܐ ܕܐܬܐ ܒܠܚܘܕ.|ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ {{PLURAL:$1|ܣܕܪܐ ܦܪܥܝܐ ܕܐܬܐ|$1 ܣܕܪ̈ܐ ܦܪ̈ܥܝܐ ܕܐܬܝܢ}}، ܡܢ ܣܘܝܟܐ ܕ $2.}}',
 'category-subcat-count-limited' => 'ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ {{PLURAL:$1|ܣܕܪܐ ܦܪܥܝܐ ܗܢܐ|$1 ܣܕܪ̈ܐ ܦܪ̈ܥܝܐ ܗܠܝܢ}}.',
-'category-article-count' => '{{PLURAL:$2|ܣܕܪܐ ܗܢܐ ܐܝܬ ܒܗ ܦܐܬܐ ܗܕܐ ܒܠܚܘܕ.|ܐܝܬ {{PLURAL:$1|ܦܐܬܐ|$1 ܦܐܬܬ̈ܐ}} ܒܣܕܪܐ ܗܢܐ، ܡܢ ܣܘܝܟܐ ܕ$2.}}',
+'category-article-count' => '{{PLURAL:$2|ܣܕܪܐ ܗܢܐ {{PLURAL:$1|ܠܝܬ ܒܗ ܦܐܬܐ|ܐܝܬ ܒܗ ܦܐܬܐ ܗܕܐ|ܐܝܬ ܒܗ ܗܠܝܢ $1 ܦܐܬܬ̈ܐ}} ܡܢ ܣܘܝܟܐ ܕ$2.}}',
 'category-article-count-limited' => '{{PLURAL:$1|ܦܐܬܐ ܗܕܐ|$1 ܦܐܬܬ̈ܐ ܗܠܝܢ}} ܒܣܕܪܐ ܗܢܐ.',
-'category-file-count' => '{{PLURAL:$2|Ü£Ü\95ܪÜ\90 Ü\97Ü¢Ü\90 Ü\90Ü\9dܬ Ü\92Ü\97 Ü Ü¦Ü¦Ü\90 Ü\97Ü¢Ü\90 Ü\92Ü Ü\9aÜ\98Ü\95.|{{PLURAL:$1|ܠܦܦÜ\90 Ü\95Ü\90ܬÜ\90 Ü\90Ü\9dܬÜ\98Ü\97Ü\9d|$1 Ü Ü¦Ü¦Ì\88Ü\90 Ü\95Ü\90ܬÜ\9dÜ¢ Ü\90Ü\9dܬÜ\9dÜ\97Ü\98Ü¢}} Ü\92Ü£Ü\95ܪÜ\90 Ü\97Ü¢Ü\90Ø\8c Ü¡Ü¢ Ü£Ü\98Ü\9dÜ\9fÜ\90 Ü\95$2.}}',
+'category-file-count' => '{{PLURAL:$2|Ü£Ü\95ܪÜ\90 Ü\97Ü¢Ü\90 Ü\90Ü\9dܬ Ü\92Ü\97 Ü Ü¦Ü¦Ü\90 Ü\95Ü\90ܬÜ\90 Ü\92Ü Ü\9aÜ\98Ü\95.|{{PLURAL:$1|ܠܦܦÜ\90 Ü\95Ü\90ܬÜ\90 Ü\90Ü\9dܬÜ\98Ü\97Ü\9d|$1 Ü Ü¦Ü¦Ì\88Ü\90 Ü\95Ü\90ܬÜ\9dÜ¢ Ü\90Ü\9dܬÜ\9dÜ\97Ü\98Ü¢}} Ü\92Ü£Ü\95ܪÜ\90 Ü\97Ü¢Ü\90Ø\8c Ü¡Ü¢ Ü£Ü\98Ü\9dÜ\9fÜ\90 Ü\95 $2.}}',
 'category-file-count-limited' => 'ܐܝܬ {{PLURAL:$1|ܠܦܦܐ ܕܐܬܐ|$1 ܠܦܦ̈ܐ ܕܐܬܝܢ}} ܒܣܕܪܐ ܗܫܝܐ.',
 'listingcontinuesabbrev' => '(ܫܘܠܡܐ)',
 
@@ -199,9 +231,9 @@ $messages = array(
 'article' => 'ܡܓܠܬܐ',
 'newwindow' => '(ܦܬܚ ܒܟܘܬܐ ܚܕܬܐ)',
 'cancel' => 'ܒܛܘܠ',
-'moredotdotdot' => '...ܝܬܝܪ',
-'mypage' => 'ܦÜ\90ܬÜ\9d',
-'mytalk' => 'Ü¡Ü¡Ü Ü Ü\9d',
+'moredotdotdot' => 'ܝܬܝܪ...',
+'mypage' => 'ܦÜ\90ܬÜ\90',
+'mytalk' => 'Ü¡Ü¡Ü Ü Ü\90',
 'anontalk' => 'ܡܡܠܠܐ ܕܗܢܐ ܐܝ ܦܝ (IP)',
 'navigation' => 'ܐܠܦܪܘܬܐ',
 'and' => '&#32;ܘ',
@@ -232,6 +264,7 @@ $messages = array(
 'namespaces' => 'ܚܩܠܬ̈ܐ',
 'variants' => 'ܡܫܬܚܠܦܢܘ̈ܬܐ',
 
+'navigation-heading' => 'ܡܟܬܒܘܬܐ ܕܐܠܦܪܘܬܐ',
 'errorpagetitle' => 'ܦܘܕܐ',
 'returnto' => 'ܕܥܘܪ ܠ$1.',
 'tagline' => 'ܡܢ {{SITENAME}}',
@@ -387,12 +420,9 @@ $1',
 # Login and logout pages
 'logouttext' => "'''ܗܫܐ ܦܠܛܠܟ ܡܢ ܚܘܫܒܢܟ.'''
 
-ܡܨܐ ܐܢܬ ܐܦܠܚܬ {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܐ ܐܢܬ ܕ[[Special:UserLogin|ܬܥܘܠ]] ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
+ܡܨܐ ܐܢܬ ܐܦܠܚܬ {{SITENAME}} ܐܝܟ ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ ܐܘ ܡܨܐ ܐܢܬ ܕ<span class='plainlinks'>[$1 ܬܥܘܠ]</span> ܒܚܘܫܒܢܐ ܥܝܢܗ ܐܘ ܐܝܟ ܡܦܠܚܢܐ ܐܚܪܢܐ.
 
 ܚܕ ܟܡܐ ܡܢ ܦܐܬܬ̈ܐ ܡܬܚܙܝܢ ܐܝܟ ܕܗܘ ܐܢܬ ܥܠܝܠܐ ܥܕܡܐ ܕܐܣܦܩܬ ܠܦܐܬܬ̈ܐ ܠܒܝܟܬ̈ܐ ܕܡܦܐܬܢܐ ܕܝܠܟ",
-'welcomecreation' => '== ܒܫܝܢܐ, $1! ==
-ܐܬܒܪܝ ܚܘܫܒܢܟ.
-ܠܐ ܢܫܐ ܐܢܬ ܠܫܚܠܦܬܐ ܕ[[Special:Preferences|ܨܒܝܢܝܘܬ̈ܐ ܒ {{SITENAME}}]].',
 'yourname' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'yourpassword' => 'ܡܠܬܐ ܕܥܠܠܐ:',
 'yourpasswordagain' => 'ܟܬܘܒ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:',
@@ -422,11 +452,15 @@ $1',
 'loginsuccesstitle' => 'ܥܠܠܐ ܓܡܪ',
 'loginsuccess' => "'''ܗܫܐ ܥܠܝܠܐ ܐܢܬ ܒ{{SITENAME}} ܒܫܡ \"\$1\".'''",
 'nouserspecified' => 'ܘܠܐ ܠܟ ܕܬܚܡ ܫܡܐ ܕܡܦܠܚܢܐ',
+'wrongpassword' => 'ܡܠܬܐ ܕܥܠܠܐ ܠܐ ܬܪܝܨܬܐ ܐܥܠܬ.
+ܒܒܥܘ ܡܢܟ ܕܬܢܣܐ ܙܒܢ ܐܚܪܝܢ.',
+'wrongpasswordempty' => 'ܡܠܬܐ ܕܥܠܠܐ ܕܐܥܠܬ ܣܦܝܩܬܐ ܐܝܬܝܗ.
+ܒܒܥܘ ܡܢܟ ܕܬܢܣܐ ܙܒܢ ܐܚܪܝܢ.',
 'mailmypassword' => 'ܫܕܪ ܠܝ ܡܠܬܐ ܚܕܬܐ ܕܥܠܠܐ',
 'passwordremindertitle' => 'ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܢܝܬܐ ܚܕܬܐ ܠ{{SITENAME}}',
 'noemail' => 'ܠܝܬ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܠܡܦܠܚܢܐ "$1".',
 'mailerror' => 'ܦܘܕܐ ܒܫܘܕܪܐ ܕܒܝܠܕܪܐ: $1',
-'emailconfirmlink' => 'Ü\9aܬܬ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܕܝܠܟ',
+'emailconfirmlink' => 'ܫܪܪ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܕܝܠܟ',
 'accountcreated' => 'ܚܘܫܒܢܐ ܒܪܐ',
 'accountcreatedtext' => 'ܐܬܒܪܝ ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ ܠ $1.',
 'createaccount-title' => 'ܒܪܝܐ ܕܚܘܫܒܢܐ ܒ {{SITENAME}}',
@@ -477,7 +511,7 @@ $1',
 'showdiff' => 'ܚܘܝ ܫܘܚܠܦ̈ܐ',
 'anoneditwarning' => "'''ܙܘܗܪܐ:''' ܠܐ ܐܝܬܝܟ ܥܠܝܠܐ.
 ܐܝ ܦܝ (IP) ܕܝܠܟ ܢܬܟܬܒ ܒܬܫܥܝܬܐ ܕܦܐܬܐ.",
-'anonpreviewwarning' => '"Ü Ü\90 Ü\90Ü\9dܬÜ\9dÜ\9f Ü¥Ü Ü\9dÜ Ü\90. Ü\90Ü¢ Ü Ü\92Ü\9f Ü¦Ü\90ܬÜ\90 Ü\90ܢܬ Ü\90Ü\9d Ü¦Ü\9d (IP) Ü\95Ü\9dÜ Ü\9f Ü¢Ü¬Ü\9fܬÜ\92 ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ."',
+'anonpreviewwarning' => '"Ü Ü\90 Ü\90Ü\9dܬÜ\9dÜ\9f Ü¥Ü Ü\9dÜ Ü\90. Ü Ü\92Ü\9fܬÜ\90 Ü\95ܦÜ\90ܬÜ\90 Ü¢Ü¬Ü\9fܬÜ\92 Ü\90Ü\9d Ü¦Ü\9d (IP) Ü\95Ü\9dÜ Ü\9f ܒܬܫܥܝܬܐ ܕܫܘܚܠܦܐ ܕܦܐܬܐ."',
 'summary-preview' => 'ܚܝܪܐ ܩܕܡܝܐ ܕܦܣܝܩܬ̈ܐ :',
 'blockedtitle' => 'ܡܦܠܚܢܐ ܗܘ ܡܚܪܡܐ',
 'blockednoreason' => 'ܠܝܬ ܥܠܬܐ ܝܗܝܒܬܐ',
@@ -492,7 +526,7 @@ $1',
 'note' => "'''ܡܥܝܪܢܘܬܐ:'''",
 'previewnote' => "'''ܕܟܪ ܕܗܢܘ ܚܝܪܐ ܩܕܡܝܐ ܒܠܚܘܕ'''.
 ܫܘܚܠܦ̈ܐ ܕܝܠܟ ܠܐ ܐܬܠܒܟܘ ܥܕܡܐ ܠܗܫܐ!",
-'continue-editing' => 'Ü\90Ü\93ܡܪ Ü ܫܘܚܠܦܐ',
+'continue-editing' => 'Ü\99Ü  Ü Ü\9dܬÜ\92Ü\90 Ü\95ܫܘܚܠܦܐ',
 'editing' => 'ܫܚܠܦܬܐ ܕ $1',
 'creating' => 'ܣܘܝܡܐ ܕ $1',
 'editingsection' => 'ܫܚܠܦܬܐ ܕ $1 (ܡܢܬܐ)',
@@ -596,7 +630,7 @@ $1',
 'showhideselectedversions' => 'ܚܘܝ/ܛܫܝ ܬܢܝܬ̈ܐ ܓܒܝܬ̈ܐ',
 'editundo' => 'ܠܐ ܬܥܒܕ',
 'diff-multi' => '({{PLURAL:$1|ܚܕܐ ܬܢܝܬܐ ܡܨܥܝܬܐ|$1 ܬܢܝܬ̈ܐ ܡܨܥܝܬ̈ܐ}} ܒܝܕ {{PLURAL:$2|ܚܕ ܡܦܠܚܢܐ ܠܐ ܓܠܝܚܬܐ|$2 ܡܦܠܚܢ̈ܐ ܠܐ ܓܠܝܚܬ̈ܐ}})',
-'diff-multi-manyusers' => '({{PLURAL:$1|One ܚܕܐ ܬܢܝܬܐ ܡܨܥܝܬܐ|$1 ܬܢܝܬ̈ܐ ܡܨܥܝܬ̈ܐ}} ܒܝܕ ܝܬܝܪ ܡܢ $2 {{PLURAL:$2|ܚܕ ܡܦܠܚܢܐ ܠܐ ܓܠܝܚܬܐ|ܡܦܠܚܢ̈ܐ ܠܐ ܓܠܝܚܬ̈ܐ}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|ܚܕܐ ܬܢܝܬܐ ܡܨܥܝܬܐ ܠܐ ܓܠܝܚܬܐ|$1 ܬܢܝܬ̈ܐ ܡܨܥܝܬ̈ܐ ܠܐ ܓܠܝܚܬ̈ܐ}} ܒܝܕ ܝܬܝܪ ܡܢ $2 {{PLURAL:$2|ܚܕ ܡܦܠܚܢܐ|ܡܦܠܚܢ̈ܐ}})',
 
 # Search results
 'searchresults' => 'ܦܠܛ̈ܐ ܕܒܨܝܐ',
@@ -623,23 +657,22 @@ $1',
 'searchprofile-images' => 'ܡܝܕ̈ܝܐ ܣܓܝܐ̈ܐ (Multimedia)',
 'searchprofile-everything' => 'ܟܠ ܡܕܡ',
 'searchprofile-advanced' => 'ܡܬܩܕܡܢܐ',
-'searchprofile-articles-tooltip' => 'ܒܨܝ ܒ $1',
+'searchprofile-articles-tooltip' => 'ܒܨܝ ܒܓܘ $1',
 'searchprofile-project-tooltip' => 'ܒܨܝ ܒ $1',
 'searchprofile-images-tooltip' => 'ܒܨܝ ܥܠ ܠܦܦ̈ܐ',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ܡܠܬܐ|$2 ܡܠ̈ܐ}})',
 'search-redirect' => '(ܨܝܒ $1)',
 'search-section' => '(ܡܢܬܐ $1)',
-'search-suggest' => 'Ü£Ü\9fÜ  ܐܢܬ: $1',
+'search-suggest' => 'Ü\90ܪÜ\90 Ü£Ü\9fÜ  Ü\97Ü\98Ü\90 ܐܢܬ: $1',
 'search-interwiki-caption' => 'ܬܪ̈ܡܝܬܐ ܐܚܘܬ̈ܐ',
 'search-interwiki-default' => 'ܦܠܛ̈ܐ ܕ $1:',
 'search-interwiki-more' => '(ܝܬܝܪ)',
-'search-mwsuggest-enabled' => 'ܥܡ ܡܚܫܚܬ̈ܐ',
-'search-mwsuggest-disabled' => 'ܠܐ ܡܚܫܚܬ̈ܐ',
 'search-relatedarticle' => 'ܐܚܝܢܝ̈ܐ',
 'searcheverything-enable' => 'ܒܨܝ ܒܟܠ ܚܩܠܬ̈ܐ',
 'searchrelated' => 'ܐܚܝܢܝ̈ܐ',
 'searchall' => 'ܟܠ',
 'showingresults' => "ܚܘܘܝܐ ܠܬܚܬ {{PLURAL:$1|'''1''' ܦܠܛܐ|'''$1''' ܦܠܛ̈ܐ}} ܫܪܐ ܡܢ ܡܢܝܢܐ '''$2'''.",
+'showingresultsnum' => "ܚܘܘܝܐ ܠܬܚܬ {{PLURAL:$3|'''ܚܕ ܦܠܛܐ'''|'''$3''' ܦܠܛ̈ܐ}} ܫܪܐ ܡܢ ܡܢܝܢܐ '''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|ܦܠܛܐ '''$1''' ܡܢ '''$3'''|ܦܠܛ̈ܐ '''$1 - $2''' ܡܢ '''$3'''}} ܠ'''$4'''",
 'search-nonefound' => 'ܠܝܬ ܦܠܛ̈ܐ ܐܘܝܢ̈ܐ ܠܗܢܐ ܒܨܝܐ.',
 'powersearch' => 'ܒܨܝܐ ܡܬܩܕܡܢܐ',
@@ -657,7 +690,7 @@ $1',
 
 # Preferences page
 'preferences' => 'ܨܒܝܢܝܘܬ̈ܐ',
-'mypreferences' => 'ܨÜ\92Ü\9dÜ¢Ü\9dÜ\98ܬÌ\88Ü\9d',
+'mypreferences' => 'ܨÜ\92Ü\9dÜ¢Ü\9dÜ\98ܬÌ\88Ü\90',
 'prefs-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ:',
 'prefsnologin' => 'ܠܝܬܝܟ ܥܠܝܠܐ',
 'changepassword' => 'ܫܚܠܦ ܡܠܬܐ ܕܥܠܠܐ',
@@ -681,7 +714,7 @@ $1',
 'rows' => 'ܨ̈ܦܐ',
 'columns' => 'ܥܡܘܕ̈ܐ:',
 'searchresultshead' => 'ܒܨܝ',
-'resultsperpage' => 'Ü¡Ü¢Ü\9dÜ¢Ü\90 Ü\95ܦܠÜ\9bÌ\88Ü\90 Ü\92Ü\95ܦܐ:',
+'resultsperpage' => 'Ü¡Ü¢Ü\9dÜ¢Ü\90 Ü\95ܦܠÜ\9bÌ\88Ü\90 Ü\92ܦÜ\90ܬܐ:',
 'recentchangesdays' => 'ܝܘܡܬ̈ܐ ܠܚܙܝܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ:',
 'recentchangescount' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܠܚܙܝܐ ܪܫܐܝܬ:',
 'savedprefs' => 'ܨܒܝܢܝܘܬ̈ܟ ܐܬܠܒܟܘ.',
@@ -700,7 +733,7 @@ $1',
 'prefs-namespaces' => 'ܚܩܠܬ̈ܐ',
 'defaultns' => 'ܐܘ ܒܨܝ ܒܚܩܠܬ̈ܐ ܗܢܝܢ',
 'prefs-files' => 'ܠܦܦ̈ܐ',
-'prefs-emailconfirm-label' => 'Ü\9aÜ\98ܬܬܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
+'prefs-emailconfirm-label' => 'Ü«Ü\98ܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
 'youremail' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ:',
 'username' => 'ܫܡܐ ܕܡܦܠܚܢܐ:',
 'uid' => 'ܗܝܝܘܬܐ ܕܡܦܠܚܢܐ:',
@@ -715,6 +748,8 @@ $1',
 'gender-unknown' => 'ܠܐ ܦܣܝܩܐ',
 'gender-male' => 'ܕܟܪܐ',
 'gender-female' => 'ܢܩܒܐ',
+'prefs-help-gender' => 'ܨܒܝܢܝܐ: ܐܬܦܠܚ ܠܡܬܡܠܠ ܒܓܢܣܐ ܬܪܝܨܐ ܒܝܕ ܬܚܪܙܬܐ.
+ܝܕܥܬܐ ܗܕܐ ܬܗܘܐ ܓܠܝܬܐ ܠܥܠܡܐ.',
 'email' => 'ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'prefs-info' => 'ܝܕ̈ܥܬܐ ܪ̈ܫܝܬܐ',
 'prefs-i18n' => 'ܬܘܪܓܡܐ',
@@ -743,6 +778,7 @@ $1',
 # Groups
 'group' => 'ܟܢܘܫܬܐ:',
 'group-user' => 'ܡܦܠܚܢ̈ܐ',
+'group-autoconfirmed' => 'ܡܦܠܚܢ̈ܐ ܡܫܪܪ̈ܐ ܝܬܐܝܬ',
 'group-bot' => 'ܒܘܬ̈ܐ',
 'group-sysop' => 'ܡܕܒܪ̈ܢܐ',
 'group-bureaucrat' => 'ܒܝܪܘܩܪ̈ܛܐ',
@@ -750,14 +786,14 @@ $1',
 'group-all' => '(ܟܠ)',
 
 'group-user-member' => '{{GENDER:$1|ܡܦܠܚܢܐ|ܡܦܠܚܢܬܐ}}',
-'group-autoconfirmed-member' => '{{GENDER:$1|ܡܦܠÜ\9aÜ¢Ü\90 Ü\9aܬÜ\9dܬÜ\90 Ü\9dܬÜ\90Ü\9dܬ|ܡܦܠÜ\9aܢܬÜ\90 Ü\9aܬÜ\9dܬܐ ܝܬܐܝܬ}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|ܡܦܠÜ\9aÜ¢Ü\90 Ü¡Ü«ÜªÜªÜ\90 Ü\9dܬÜ\90Ü\9dܬ|ܡܦܠÜ\9aܢܬÜ\90 Ü¡Ü«ÜªÜªܬܐ ܝܬܐܝܬ}}',
 'group-bot-member' => '{{GENDER:$1|ܒܘܬ (Bot)}}',
 'group-sysop-member' => '{{GENDER:$1|ܡܕܒܪܢܐ|ܡܕܒܪܢܬܐ}}',
 'group-bureaucrat-member' => '{{GENDER:$1|ܒܝܪܘܩܪܛܐ}}',
 'group-suppress-member' => '{{GENDER:$1|ܚܝܘܪܐ|ܚܝܘܪܬܐ}}',
 
 'grouppage-user' => '{{ns:project}}:ܡܦܠܚܢ̈ܐ',
-'grouppage-autoconfirmed' => '{{ns:project}}:ܡܦܠÜ\9aÜ¢Ì\88Ü\90 Ü\9aܬÜ\9dܬ̈ܐ ܝܬܐܝܬ',
+'grouppage-autoconfirmed' => '{{ns:project}}:ܡܦܠÜ\9aÜ¢Ì\88Ü\90 Ü¡Ü«ÜªÜª̈ܐ ܝܬܐܝܬ',
 'grouppage-bot' => '{{ns:project}}:ܒܘܬ̈ܐ',
 'grouppage-sysop' => '{{ns:project}}:ܡܕܒܪ̈ܢܐ',
 'grouppage-bureaucrat' => '{{ns:project}}:ܒܝܪܘܩܪ̈ܛܐ',
@@ -794,7 +830,7 @@ $1',
 'action-createaccount' => 'ܒܪܝܬܐ ܕܚܘܫܒܢܐ ܕܗܢܐ ܡܦܠܚܢܐ',
 'action-minoredit' => 'ܫܘܕܥܬܐ ܥܠ ܫܘܚܠܦܐ ܗܢܐ ܐܝܟ ܙܥܘܪܐ',
 'action-move' => 'ܫܢܝܬܐ ܕܦܐܬܐ ܗܕܐ',
-'action-move-rootuserpages' => 'Ü«Ü¢Ü\9dܬÜ\90 Ü\95Ü\95Ì\88ܦÜ\90 Ü«ÜªÌ\88Ü«Ü\9dܐ ܕܡܦܠܚܢܐ',
+'action-move-rootuserpages' => 'Ü«Ü¢Ü\9dܬÜ\90 Ü\95ܦÜ\90ܬܬÌ\88Ü\90 Ü«ÜªÌ\88Ü«Ü\9dܬܐ ܕܡܦܠܚܢܐ',
 'action-movefile' => 'ܫܢܝܬܐ ܕܗܢܐ ܠܦܦܐ',
 'action-upload' => 'ܐܣܩܬܐ ܕܗܢܐ ܠܦܦܐ',
 'action-delete' => 'ܫܝܦܬܐ ܕܦܐܬܐ ܗܕܐ',
@@ -859,7 +895,7 @@ $1',
 'minlength1' => 'ܫܡܗ̈ܐ ܕܠܦܦܐ ܘܠܐ ܕܢܗܘܐ ܒܪܝܐ ܡܢ ܐܬܘܬܐ ܚܕܐ ܟܕ ܙܥܘܪ',
 'uploadwarning' => 'ܐܣܩ ܙܘܗܪܐ',
 'savefile' => 'ܠܒܘܟ ܠܦܦܐ',
-'uploadedimage' => '',
+'uploadedimage' => 'ܐܣܩ "[[$1]]"',
 'uploadvirus' => 'ܠܦܦܐ ܐܝܬ ܒܗ ܒܝܪܘܣ!
 ܐܪ̈ܝܟܬܐ: $1',
 'upload-source' => 'ܡܒܘܥܐ ܕܠܦܦܐ',
@@ -918,7 +954,7 @@ $1',
 'filehist-dimensions' => 'ܩܝܡ̈ܐ',
 'filehist-filesize' => 'ܥܓܪܐ ܕܠܦܦܐ',
 'filehist-comment' => 'ܥܘܩܒܐ',
-'imagelinks' => 'Ü\9aÜ«ܚܬܐ ܕܠܦܦܐ',
+'imagelinks' => 'ܡܦܠܚܬܐ ܕܠܦܦܐ',
 'linkstoimage' => '{{PLURAL:$1|ܦܐܬܐ ܗܕܐ ܐܣܪ|$1 ܦܐܬܬ̈ܐ ܗܠܝܢ ܐܣܪܝܢ}} ܥܡ ܗܢܐ ܠܦܦܐ:',
 'nolinkstoimage' => 'ܠܝܬ ܦܐܬܐ ܕܐܣܪ ܠܗܢܐ ܠܦܦܐ.',
 'uploadnewversion-linktext' => 'ܐܣܩ ܨܚܚܐ ܚܕܬܐ ܡܢ ܗܢܐ ܠܦܦܐ',
@@ -962,7 +998,8 @@ $1',
 'randomredirect-nopages' => 'ܠܝܬ ܨܘܝܒ̈ܐ ܒܚܩܠܐ ܕ"$1".',
 
 # Statistics
-'statistics' => 'ܡܢܝܢܘܬ',
+'statistics' => 'ܚܒܝܫܘܬ ܡܢܝܢܐ',
+'statistics-header-hooks' => 'ܚܒܝܫܘܬ ܡܢܝܢܐ ܐܚܪܢܐ',
 'statistics-pages' => 'ܦܐܬܬ̈ܐ',
 'statistics-views-peredit' => 'ܚܘܘܝ̈ܐ ܠܟܠ ܫܘܚܠܦܐ',
 'statistics-users' => '[[Special:ListUsers|ܡܦܠܚܢ̈ܐ]] ܡܣܓܠ̈ܐ',
@@ -976,7 +1013,7 @@ $1',
 ܗܫܐ ܐܝܬܝܗܝ  ܨܘܝܒܐ ܠ [[$2]].',
 
 'brokenredirects' => 'ܨܘܝܒ̈ܐ ܬܒܝܪ̈ܐ',
-'brokenredirectstext' => 'ܨÜ\98Ì\88Ü\9dÜ\92Ü\90 Ü\97Ü Ü\9dÜ¢ Ü¡Ü\9bÜ\9dÜ¢ Ü Ü\95Ì\88ܦÜ\90 Ü\95Ü Ü\9dܬܠÜ\97Ü\98ܢ ܐܝܬܘܬܐ:',
+'brokenredirectstext' => 'ܨÜ\98Ì\88Ü\9dÜ\92Ü\90 Ü\97Ü Ü\9dÜ¢ Ü¡Ü\9bÜ\9dÜ¢ Ü Ü¦Ü\90ܬܬÌ\88Ü\90 Ü\95Ü Ü\9dܬܠÜ\97Ü\9dܢ ܐܝܬܘܬܐ:',
 'brokenredirects-edit' => 'ܫܚܠܦ',
 'brokenredirects-delete' => 'ܫܘܦ',
 
@@ -1012,6 +1049,7 @@ $1',
 'mostlinkedtemplates' => 'ܩܠܒ̈ܐ ܐܣܝܪ̈ܐ ܝܬܝܪ ܡܢ ܟܠ',
 'mostcategories' => 'ܦܐܬܬ̈ܐ ܣܕܝܪܐ ܝܬܝܪ ܡܢ ܟܠ',
 'mostimages' => 'ܠܦܦ̈ܐ ܐܣܝܪ̈ܐ ܝܬܝܪ ܡܢ ܟܠ',
+'mostinterwikis' => 'ܦܐܬܬ̈ܐ ܕܐܝܬܠܗܘܢ ܐܣܘܪ̈ܐ ܕܐܢܛܪܘܝܩܝ ܝܬܝܪ ܡܢ ܟܠ',
 'mostrevisions' => 'ܦܐܬܬ̈ܐ ܥܡ ܫܘܚܠܦ̈ܐ ܝܬܝܪ ܡܢ ܟܠ',
 'prefixindex' => 'ܟܠ ܦܐܬܬ̈ܐ ܥܡ ܫܪܘܝܐ',
 'prefixindex-namespace' => 'ܟܠ ܦܐܬܬ̈ܐ ܥܡ ܫܪܘܝܐ ($1 ܚܩܠܐ)',
@@ -1032,7 +1070,7 @@ $1',
 'ancientpages' => 'ܦܐܬܬ̈ܐ ܥܬܝܩ ܡܢ ܟܠ',
 'move' => 'ܫܢܝ',
 'movethispage' => 'ܫܢܝ ܦܐܬܐ ܗܕܐ',
-'notargettitle' => 'ܠܐ ܢܘܦܐ',
+'notargettitle' => 'Ü\95Ü Ü\90 Ü¢Ü\98ܦÜ\90',
 'nopagetitle' => 'ܠܝܬ ܗܟܘܬ ܦܐܬܐ ܕܢܘܦܐ',
 'pager-newer-n' => '{{PLURAL:$1|1 1 ܚܕܬܐ|$1 ܚܕ̈ܬܐ}}',
 'pager-older-n' => '{{PLURAL:$1|ܥܬܝܩܐ 1|ܥܬܝܩ̈ܐ $1}}',
@@ -1060,7 +1098,7 @@ $1',
 'allpagesto' => 'ܚܘܝ ܦܐܬܬ̈ܐ ܕܫܠܡ ܥܡ:',
 'allarticles' => 'ܟܠ ܡܓܠ̈ܐ',
 'allinnamespace' => 'ܟܠ ܦܐܬܬ̈ܐ (ܚܩܠܐ ܕ $1)',
-'allnotinnamespace' => 'Ü\9fÜ  Ü¦Ü\90ܬܬÌ\88Ü\90 (Ü Ü\90 ܒܚܩܠܐ ܕ $1)',
+'allnotinnamespace' => 'Ü\9fÜ  Ü¦Ü\90ܬܬÌ\88Ü\90 (Ü\95Ü Ü\9dܬ ܒܚܩܠܐ ܕ $1)',
 'allpagesprev' => 'ܕܩܕܡ',
 'allpagesnext' => 'ܕܒܬܪ',
 'allpagessubmit' => 'ܙܠ',
@@ -1092,7 +1130,7 @@ $1',
 # Special:ListUsers
 'listusersfrom' => 'ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܝܢ ܒ:',
 'listusers-submit' => 'ܚܘܝ',
-'listusers-noresult' => 'Ü Ü\90 Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 Ü\90ܫܬÜ\9fÜ\9a',
+'listusers-noresult' => 'Ü Ü\90 Ü\90ܫܬÜ\9fÜ\9a Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 Ü\9aÜ\95.',
 'listusers-blocked' => '(ܚܪܝܡܐ)',
 
 # Special:ActiveUsers
@@ -1101,7 +1139,7 @@ $1',
 'activeusers-from' => 'ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܐ ܥܡ:',
 'activeusers-hidebots' => 'ܛܫܝ ܒܘܬ̈ܐ (bots)',
 'activeusers-hidesysops' => 'ܛܫܝ ܡܕܒܪ̈ܢܐ',
-'activeusers-noresult' => 'Ü Ü\90 Ü¡Ü¦Ü Ü\9aÜ¢Ü\90 Ü\90ܫܬÜ\9fÜ\9a.',
+'activeusers-noresult' => 'Ü Ü\90 Ü\90ܫܬÜ\9fÜ\9a Ü¡Ü¦Ü Ü\9aÜ¢Ì\88Ü\90 Ü\90ܢܫÌ\88Ü\9dÜ¢.',
 
 # Special:Log/newusers
 'newuserlogpage' => 'ܣܓܠܐ ܕܒܪܝܬܐ ܕܡܦܠܚܢܐ',
@@ -1144,7 +1182,7 @@ $1',
 
 # Watchlist
 'watchlist' => 'ܪ̈ܗܝܬܝ',
-'mywatchlist' => 'ܪÌ\88Ü\97Ü\9dܬÜ\9d',
+'mywatchlist' => 'ܪÌ\88Ü\97Ü\9dܬÜ\90',
 'watchlistfor2' => 'ܕ $1 $2',
 'nowatchlist' => 'ܠܝܬ ܠܟ ܡܕܡ ܒܪ̈ܗܝܬܐ ܕܝܠܟ',
 'watchlistanontext' => '$1 ܠܚܙܝܐ ܐܘ ܫܚܠܦܬܐ ܕܦܐܬܬ̈ܐ ܒܪ̈ܗܝܬܟ.',
@@ -1168,20 +1206,17 @@ $1',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'ܪܗܝܐ...',
-'unwatching' => 'Ü Ü\90 ܪܗܝܐ...',
+'unwatching' => 'Ü Ü\9aÜ\9d ܪܗܝܐ...',
 
-'enotif_reset' => 'ܫܘܕܥ ܟܠ ܦܐܬܬ̈ܐ ܐܝܟ ܣܥܝܪ̈ܐ',
-'enotif_newpagetext' => 'ܗܕܐ ܗܝ ܦܐܬܐ ܚܕܬܐ',
+'enotif_reset' => 'ܫܘܕܥ ܟܠ ܦܐܬܬ̈ܐ ܐܝܟ ܣܥܝܪ̈ܬܐ',
 'enotif_impersonal_salutation' => 'ܡܦܠܚܢܐ {{SITENAME}}',
-'changed' => 'ܐܫܬܚܠܦܬ',
-'created' => 'ܒܪܐ',
 'enotif_lastvisited' => 'ܚܙܝ $1 ܠܟܠ ܫܘܚܠܦ̈ܐ ܡܢ ܐܡܬܝ ܕܣܘܥܪܢܐ ܐܚܪܝܐ ܕܝܠܟ.',
 'enotif_lastdiff' => 'ܚܙܝ $1 ܠܚܙܝܐ ܕܫܘܚܠܦܐ ܗܢܐ.',
 'enotif_anon_editor' => 'ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ $1',
 
 # Delete
 'deletepage' => 'ܫܘܦ ܦܐܬܐ',
-'confirm' => 'Ü\9aܬܬ',
+'confirm' => 'ܫܪܪ',
 'excontent' => "ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1'",
 'excontentauthor' => "ܚܒܝܫܬ̈ܐ ܗܘ̈ܝ: '$1' (ܘܫܘܬܦܢܐ ܝܚܝܕܝܐ ܗܘܐ '[[Special:Contributions/$2|$2]]')",
 'exblank' => 'ܦܐܬܐ ܣܦܝܩܬܐ ܗܘܐ',
@@ -1210,7 +1245,7 @@ $1',
 'unprotectedarticle' => 'ܫܩܘܠ ܢܛܝܪܘܬܐ ܡܢ "[[$1]]"',
 'movedarticleprotection' => 'ܫܢܐ ܛܘܝܒ̈ܐ ܕܢܛܪܐ ܡܢ "[[$2]]" ܠ "[[$1]]"',
 'prot_1movedto2' => '[[$1]] ܐܬܫܢܝܬ ܠ [[$2]]',
-'protect-legend' => 'Ü\9aܬܬ ܢܘܛܪܐ',
+'protect-legend' => 'ܫܪܪ ܢܘܛܪܐ',
 'protectcomment' => 'ܥܠܬܐ:',
 'protect-default' => 'ܦܣܣܐ ܠܟܠ ܡܦܠܚܢ̈ܐ',
 'protect-fallback' => 'ܒܥܝ "$1" ܦܣܣܐ',
@@ -1272,7 +1307,7 @@ $1',
 # Contributions
 'contributions' => 'ܫܘܬܦܘܝܬ̈ܐ ܕܡܦܠܚܢܐ',
 'contributions-title' => 'ܫܘܬܦܘܝܬ̈ܐ ܕܡܦܠܚܢܐ ܠ$1',
-'mycontris' => 'Ü«Ü\98ܬܦÜ\98Ü\9dܬÌ\88Ü\9d',
+'mycontris' => 'Ü«Ü\98ܬܦÜ\98Ü\9dܬÌ\88Ü\90',
 'contribsub2' => 'ܕ $1 ($2)',
 'uctop' => '(ܥܠܝܐ)',
 'month' => 'ܡܢ ܝܪܚܐ ܕ (ܘܡܢ ܩܕܡ ܗܝܕܝܢ):',
@@ -1308,7 +1343,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 ܨܘܝܒ̈ܐ',
 'whatlinkshere-hidetrans' => '$1 ܡܬܚܪ̈ܙܢܘܬܐ',
 'whatlinkshere-hidelinks' => '$1 ܐܣܘܪ̈ܐ',
-'whatlinkshere-hideimages' => '$1 Ü\90Ü£Ü\98ܪÜ\90 Ü\95ܨÜ\98ܪܬܐ',
+'whatlinkshere-hideimages' => '$1 Ü\90Ü£Ü\98ܪÜ\90 Ü\95ܠܦܦܐ',
 'whatlinkshere-filters' => 'ܡܨܦܝܢܝܬ̈ܐ',
 
 # Block/unblock
@@ -1353,7 +1388,7 @@ $1',
 'blocklogentry' => 'ܚܪܡ [[$1]] ܠܡܬܚܐ ܕ $2 $3',
 'unblocklogentry' => 'ܫܩܠ ܚܪܡܐ ܡܢ $1',
 'block-log-flags-anononly' => 'ܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ ܒܠܚܘܕ',
-'block-log-flags-nocreate' => 'ܒܪܝܬܐ ܕܚܘܫܒ̈ܢܐ ܠܐ ܗܝ ܡܬܩܒܠܢܬܐ',
+'block-log-flags-nocreate' => 'ܒܪܝܬܐ ܕܚܘ̈ܫܒܢܐ ܠܐ ܐܝܬܝܗ ܡܬܩܒܠܢܐ',
 'block-log-flags-hiddenname' => 'ܫܡܐ ܕܡܦܠܚܢܐ ܛܘܫܝܐ',
 'ipb_already_blocked' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ',
 'ipb-needreblock' => '"$1" ܡܚܪܡܐ ܗܘ ܡܢ ܟܕܘ
@@ -1423,39 +1458,39 @@ Do you want to change the settings?',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'ܦܐܬܐ ܕܡܦܠܚܢܐ ܕܝܠܟ',
-'tooltip-pt-mytalk' => 'ܦÜ\90ܬÜ\90 Ü\95Ü¡Ü¡Ü Ü\98ܟ',
+'tooltip-pt-mytalk' => 'ܦÜ\90ܬÜ\90 Ü\95Ü¡Ü¡Ü Ü Ü\90 Ü\95Ü\9dÜ ܟ',
 'tooltip-pt-preferences' => 'Your preferences',
-'tooltip-pt-watchlist' => 'Ü¡Ü\9fܬÜ\92Ü¢Ü\98ܬÜ\90 Ü\95ܦÜ\90ܬܬÌ\88Ü\90 Ü\95Ü\92ܪÜ\97Ü\9dܬ ܐܢܬ ܫܘܚܠܦ̈ܐ ܕܬܗܘܐ ܒܗܘܢ',
-'tooltip-pt-mycontris' => 'ܡܟܬܒܢܘܬܐ ܕܫܘܬܦܘܝܬܘ̈ܟ',
+'tooltip-pt-watchlist' => 'Ü¡Ü\9fܬÜ\92Ü¢Ü\98ܬÜ\90 Ü\95ܦÜ\90ܬܬÌ\88Ü\90 Ü\95ܬܪÜ\97Ü\9d ܐܢܬ ܫܘܚܠܦ̈ܐ ܕܬܗܘܐ ܒܗܘܢ',
+'tooltip-pt-mycontris' => 'ܡܟܬܒܢܘܬܐ ܕܫܘܬܦܘܝܬ̈ܟ',
 'tooltip-pt-login' => 'ܢܠܒܒ ܠܟ ܕܣܓܠ ܐܢܬ ܥܠܠܐ ܕܝܠܟ، ܐܠܐ ܗܢܐ ܠܐ ܐܝܬܝܗܝ ܐܠܨܝܐ',
 'tooltip-pt-logout' => 'ܦܠܛܐ',
 'tooltip-ca-talk' => 'ܡܡܠܠܐ ܥܠ ܚܒܝܫܬܐ ܕܦܐܬܐ',
-'tooltip-ca-addsection' => 'ܫܪÜ\9d Ü¦Ü£Ü\98Ü©ܐ ܚܕܬܐ',
-'tooltip-ca-viewsource' => 'Ü\97Ü¢Ü\90 Ü¦Ü\90ܬÜ\90 Ü¢Ü\9bܪܬÜ\90 Ü\9dÜ Ü\97.
\90Ü\9dܬ Ü\92Ü\9f Ü¬Ü\9aÜ\99Ü\9d ܡܒܘܥܐ ܕܝܠܗ',
+'tooltip-ca-addsection' => 'ܫܪÜ\9d Ü¡Ü¢Ü¬ܐ ܚܕܬܐ',
+'tooltip-ca-viewsource' => 'Ü\97Ü¢Ü\90 Ü¦Ü\90ܬÜ\90 Ü¢Ü\9bܪܬÜ\90 Ü\90Ü\9dܬÜ\9dÜ\97Ü\9d.
¡Ü¨Ü\90 Ü\90ܢܬ Ü\95ܬÜ\9aÜ\99Ü\90 ܡܒܘܥܐ ܕܝܠܗ',
 'tooltip-ca-protect' => 'ܢܛܘܪ ܗܕܐ ܦܐܬܐ',
 'tooltip-ca-delete' => 'ܫܘܦ ܦܐܬܐ ܗܕܐ',
 'tooltip-ca-move' => 'ܫܢܝ ܦܐܬܐ ܗܕܐ',
 'tooltip-search' => 'ܒܨܝ ܒܓܘ {{SITENAME}}',
 'tooltip-search-fulltext' => 'ܒܨܝ ܒܓܘ ܦܐܬܬ̈ܐ ܥܠ ܗܢܐ ܟܬܝܒܬܐ',
 'tooltip-p-logo' => 'ܦܐܬܐ ܪܝܫܝܬܐ',
-'tooltip-n-mainpage' => 'ܬܪÜ\98ܩܬÜ\90 Ü\95ܦܐܬܐ ܪܝܫܝܬܐ',
+'tooltip-n-mainpage' => 'ܣܥܪ ܦܐܬܐ ܪܝܫܝܬܐ',
 'tooltip-n-mainpage-description' => 'ܬܪܘܩܬܐ ܕܦܐܬܐ ܪܝܫܝܬܐ',
 'tooltip-n-portal' => 'ܚܕܪ ܬܪܡܝܬܐ، ܡܢܐ ܡܫܟܚ ܐܢܬ ܠܥܒܕܐ، ܐܝܟܐ ܬܚܙܝ ܟܠ ܡܐ ܕܣܢܝܩ ܐܢܬ ܠܗ',
 'tooltip-n-recentchanges' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܒܓܘ ܘܝܩܝ.',
-'tooltip-n-randompage' => 'ܦܬÜ\98Ü\9f Ü¡Ü\93ܠܬÜ\90 ܚܘܝܚܬܐ',
+'tooltip-n-randompage' => 'Ü\90Ü\9bܥܢ Ü¡Ü\93ܠܬÜ\90 Ü\9aÜ\95 ܚܘܝܚܬܐ',
 'tooltip-n-help' => 'ܕܘܟܐ ܠܥܘܕܪܢܐ',
-'tooltip-feed-atom' => 'ܬܪܣÜ\9dܬÜ\90 Ü\95Atom Ü Ü\97Ü¢Ü\90 Ü¦Ü\90ܬܬܐ',
+'tooltip-feed-atom' => 'Ü\9bÜ¥Ü\9dÜ¡Ü\98ܬÜ\90 Ü\95Ü\90Ü\9bÜ\98Ü¡ Ü Ü¦Ü\90ܬܬÜ\90 Ü\97Ü\95ܐ',
 'tooltip-t-contributions' => 'ܡܟܬܒܢܘܬܐ ܒܫܘܬܦ̈ܐ ܕܗܢܐ ܡܦܠܚܢܐ',
 'tooltip-t-emailuser' => 'ܫܕܪ ܐܓܪܬܐ ܠܗܢܐ ܡܦܠܚܢܐ',
 'tooltip-t-upload' => 'ܐܣܩ ܠܦܦ̈ܐ',
 'tooltip-t-specialpages' => 'ܡܟܬܒܢܘܬܐ ܒܟܠ ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ',
-'tooltip-ca-nstab-main' => 'Ü\9aÜ\98Ü\9d Ü¦Ü\90ܬܬÜ\90 Ü\95Ü\9aÜ\92Ì\88Ü\9dܫܬÜ\90',
+'tooltip-ca-nstab-main' => 'ܚܘܝ ܦܐܬܐ ܕܚܒ̈ܝܫܬܐ',
 'tooltip-ca-nstab-user' => 'ܚܘܝ ܦܐܬܐ ܕܡܦܠܚܢܐ',
 'tooltip-ca-nstab-image' => 'ܚܘܝ ܦܐܬܐ ܕܠܦܦܐ',
-'tooltip-ca-nstab-category' => 'ܚܘܝ ܦܐܬܐ ܕܣܕܪ̈ܐ',
+'tooltip-ca-nstab-category' => 'ܚܘܝ ܦܐܬܐ ܕܣܕܪܐ',
 'tooltip-save' => 'ܠܒܘܟ ܫܘܚܠܦܟ',
-'tooltip-watch' => 'Ü\90Ü\98ܣܦ Ü\97Ü¢Ü\90 Ü¦Ü\90ܬÜ\90 Ü Ü¡Ü\9fܬÜ\92Ü¢Ü\98ܬÜ\90 Ü\95ܪÜ\97Ü\9dܬÜ\98ܟ',
+'tooltip-watch' => 'Ü\90Ü\98ܣܦ Ü¦Ü\90ܬÜ\90 Ü\97Ü\95Ü\90 Ü Ü¡Ü\9fܬÜ\92Ü¢Ü\98ܬÜ\90 Ü\95ܪÌ\88Ü\97Ü\9dܬܟ',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ|ܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ}} ܕ {{SITENAME}}',
@@ -1465,6 +1500,33 @@ Do you want to change the settings?',
 'anonusers' => '{{SITENAME}} {{PLURAL:$2|ܡܦܠܚܢܐ ܠܐ ܝܕܝܥܐ|ܡܦܠܚܢ̈ܐ ܠܐ ܝܕ̈ܝܥܐ}} $1',
 'creditspage' => 'ܙܕ̈ܩܐ ܕܦܐܬܐ',
 
+# Info page
+'pageinfo-title' => 'ܝܕ̈ܥܬܐ ܥܠ "$1"',
+'pageinfo-header-basic' => 'ܝܕ̈ܥܬܐ ܪ̈ܫܝܬܐ',
+'pageinfo-header-edits' => 'ܬܫܥܝܬܐ ܕܫܘܚܠܦ̈ܐ',
+'pageinfo-header-restrictions' => 'ܢܘܛܪܐ ܕܦܐܬܐ',
+'pageinfo-header-properties' => 'ܕ̈ܝܠܝܬܐ ܕܦܐܬܐ',
+'pageinfo-display-title' => 'ܚܘܘܝܐ ܕܟܘܢܝܐ',
+'pageinfo-default-sort' => 'ܩܠܝܕܐ ܕܛܘܟܣܐ ܡܬܚܫܒܢܝܐ',
+'pageinfo-length' => 'ܥܓܪܐ ܕܦܐܬܐ (ܒܒܐܝܛ)',
+'pageinfo-article-id' => 'ܗܝܝܘܬܐ ܕܦܐܬܐ',
+'pageinfo-robot-policy' => 'ܐܝܟܢܝܘܬܐ ܕܡܙܝܥܢܐ ܕܒܨܝܐ',
+'pageinfo-robot-index' => 'ܡܬܚܘܝܢܐ',
+'pageinfo-robot-noindex' => 'ܠܐ ܡܬܚܘܝܢܐ',
+'pageinfo-views' => 'ܡܢܝܢܐ ܕܚܙܝܬ̈ܐ',
+'pageinfo-watchers' => 'ܡܢܝܢܐ ܕܪ̈ܗܝܐ',
+'pageinfo-redirects-name' => 'ܨܘܝܒ̈ܐ ܠܦܐܬܐ ܗܕܐ',
+'pageinfo-subpages-name' => 'ܦܐܬܬ̈ܐ ܦܪ̈ܥܝܐ ܕܦܐܬܐ ܗܕܐ',
+'pageinfo-firstuser' => 'ܒܪܝܢܐ ܕܦܐܬܐ',
+'pageinfo-firsttime' => 'ܣܝܩܘܡܐ ܕܒܪܝܬܐ ܕܦܐܬܐ',
+'pageinfo-lastuser' => 'ܫܚܠܦܢܐ ܐܚܪܝܐ',
+'pageinfo-lasttime' => 'ܣܝܩܘܡܐ ܕܫܘܚܠܦܐ ܐܚܪܝܐ',
+'pageinfo-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ',
+'pageinfo-authors' => 'ܡܢܝܢܐ ܕܡܫܚܠܦܢ̈ܐ ܡܫܚܠܦ̈ܐ',
+'pageinfo-recent-edits' => 'ܡܢܝܢܐ ܕܫܘܚܠܦ̈ܐ ܐܚܪ̈ܝܐ (ܒ {{PLURAL:$1||ܚܕ ܝܘܡܐ|$1 ܝܘܡܬ̈ܐ}})',
+'pageinfo-recent-authors' => 'ܡܢܝܢܐ ܕܡܫܚܠܦܢ̈ܐ ܡܫܚܠܦ̈ܐ ܐܚܪ̈ܝܐ',
+'pageinfo-toolboxlink' => 'ܝܕ̈ܥܬܐ ܥܠ ܦܐܬܐ',
+
 # Image deletion
 'filedeleteerror-short' => 'ܦܘܕܐ ܒܫܝܦܐ ܕܠܦܦܐ: $1',
 'filedeleteerror-long' => 'ܦܘܕ̈ܐ ܐܫܟܚܬ ܟܕ ܫܝܦܐ ܠܦܦܐ:
@@ -1562,10 +1624,10 @@ $1',
 'limitall' => 'ܟܠ',
 
 # E-mail address confirmation
-'confirmemail' => 'Ü\9aܬܬ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
-'confirmemail_subject' => 'Ü\9aÜ\98ܬܬܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܡܢ {{SITENAME}}',
-'confirmemail_invalidated' => 'Ü\9aÜ\98ܬܬÜ\90 Ü\95Ü\92Ü\9dÜ Ü\95ܪÜ\90 Ü\90Ü Ü©Ü\9bܪÜ\98Ü¢Ü\9dÜ\90 ܒܛܠ',
-'invalidateemail' => 'Ü\92Ü\9bÜ\98Ü  Ü\9aÜ\98ܬܬܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
+'confirmemail' => 'ܫܪܪ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
+'confirmemail_subject' => 'Ü«Ü\98ܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ ܡܢ {{SITENAME}}',
+'confirmemail_invalidated' => 'Ü«Ü\98ܪܪÜ\90 Ü\95Ü\92Ü\9dÜ Ü\95ܪÜ\90 Ü\90Ü Ü©Ü\9bܪÜ\98Ü¢Ü\9dÜ\90 Ü\90ܬܒܛܠ',
+'invalidateemail' => 'Ü\92Ü\9bÜ\98Ü  Ü«Ü\98ܪܪܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 
 # Delete conflict
 'recreate' => 'ܒܪܝ ܙܒܢܬܐ ܐܚܪܬܐ',
@@ -1637,7 +1699,7 @@ $1',
 'specialpages-note' => '----
 * ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܥܝܕ̈ܝܬܐ.
 * <span class="mw-specialpagerestricted">ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܕܩܝܘܡ̈ܐ ܒܠܚܘܕ.</span>',
-'specialpages-group-maintenance' => 'ܬܫܪܪܐ ܕܚܕܬܘܬܐ',
+'specialpages-group-maintenance' => 'ܬܫܪܪ̈ܐ ܕܚܕܬܘܬܐ',
 'specialpages-group-other' => 'ܦܐܬܬ̈ܐ ܕ̈ܝܠܢܝܬܐ ܐܚܪ̈ܢܝܬܐ',
 'specialpages-group-login' => 'ܥܘܠ / ܒܪܝ ܚܘܫܒܢܐ',
 'specialpages-group-changes' => 'ܫܘܚܠܦ̈ܐ ܚܕ̈ܬܐ ܘܣܓܠ̈ܐ',
@@ -1652,6 +1714,7 @@ $1',
 'blankpage' => 'ܦܐܬܐ ܣܦܝܩܬܐ',
 
 # Special:Tags
+'tags' => 'ܚܬ̈ܡܐ ܕܫܘܚܠܦܐ ܬܪܝܨܐ',
 'tag-filter-submit' => 'ܡܨܦܝܢܝܬܐ',
 'tags-edit' => 'ܫܚܠܦ',
 'tags-hitcount' => '$1 {{PLURAL:$1|ܫܘܚܠܦܐ|ܫܘܚܠܦ̈ܐ}}',
@@ -1676,9 +1739,9 @@ $1',
 '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-newusers' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 ܐܬܒܪܐ',
+'logentry-newusers-create' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $1 ܐܬܒܪܐ',
+'logentry-newusers-create2' => 'ܚܘܫܒܢܐ ܕܡܦܠܚܢܐ $3 ܐܬܒܪܐ ܒܝܕ $1',
 'logentry-newusers-autocreate' => 'ܚܘܫܒܢܐ $1 ܐܬܒܪܝ ܝܬܐܝܬ',
 'newuserlog-byemail' => 'ܡܠܬܐ ܕܥܠܠܐ ܐܫܬܕܪܬ ܒܝܕ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 
@@ -1687,4 +1750,8 @@ $1',
 'feedback-message' => 'ܐܓܪܬܐ:',
 'feedback-cancel' => 'ܒܛܘܠ',
 
+# Search suggestions
+'searchsuggest-search' => 'ܒܨܝ',
+'searchsuggest-containing' => 'ܬܚܒܘܫ...',
+
 );
index fe36fae..a1ea447 100644 (file)
@@ -110,7 +110,6 @@ $messages = array(
 'qbbrowse' => 'Kintun',
 'qbedit' => 'Pepikape',
 'qbpageoptions' => 'Tüfachi wülngiñ',
-'qbpageinfo' => 'Trokiñdungu',
 'qbmyoptions' => 'tañi nütramkawe',
 'qbspecialpages' => 'Kangelu',
 'faq' => 'Rumelfemkelu ramtun',
@@ -664,9 +663,7 @@ Fey ñi chumngen mülelu ($2 fey ñi chumngen wülngiñ) pengeli tüfa mew.',
 'watching' => 'Llaytumekey...',
 'unwatching' => 'Llaytumekewelay...',
 
-'enotif_newpagetext' => 'Tüfachi ta we pakina',
 'enotif_impersonal_salutation' => '{{SITENAME}} kellufe',
-'created' => 'Llituy',
 
 # Delete
 'deletepage' => 'Ñamümün tüfachi pakina',
index e5397fa..824b227 100644 (file)
@@ -163,7 +163,6 @@ $messages = array(
 'qbbrowse' => 'ṫsffeh',
 'qbedit' => 'Ĝedel',
 'qbpageoptions' => "Had 'ṣ-ṣefḫa",
-'qbpageinfo' => 'L-Meḍmon',
 'qbmyoptions' => "'Ṣ-Ṣefḫaṫ dyawli",
 'qbspecialpages' => 'Ṣefḫaṫ ĥaṣṣin',
 'faq' => 'asaila kaytaawdo bzaf',
@@ -418,12 +417,9 @@ ossabab lli ĝtah hwwa "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "''' nta daba kharj.'''
 
-ila bghiti tqdr tstamr tstaml {{SITENAME}}  kamjhol , olla ila bghiti [[Special:UserLogin|tdkhl aawtani]] bnafs smiya ola bsmiya khra.
+ila bghiti tqdr tstamr tstaml {{SITENAME}}  kamjhol , olla ila bghiti <span class='plainlinks'>[$1 tdkhl aawtani]</span> bnafs smiya ola bsmiya khra.
 
 tqdr tchof baad sfahi bhal ila msjl hta tfrgh lcache dyalk",
-'welcomecreation' => '== mrhba bik, $1! ==
-lcont dyalk raha mojoda
-matnsach tbddl[[Special:Preferences|{{SITENAME}} tfdilat dyal]].',
 'yourname' => 'smiṫ l-mosṫĥdim:',
 'yourpassword' => 'Saroṫ:',
 'yourpasswordagain' => 'aaawd ktb lmot de passe dyalk',
@@ -957,8 +953,6 @@ $1",
 'search-interwiki-caption' => 'Maċariĝ ĥĥoṫ',
 'search-interwiki-default' => 'N-Naṫija dyal $1:',
 'search-interwiki-more' => '(z-zyada)',
-'search-mwsuggest-enabled' => 'be qṫiraḫaṫ',
-'search-mwsuggest-disabled' => 'bla qṫiraḫaṫ',
 'search-relatedarticle' => 'mortabita',
 'mwsuggest-disable' => 'attl liqtirahat dyal AJAX',
 'searcheverything-enable' => 'qlleb f-gaĝ n-nitaqaṫ',
@@ -1697,11 +1691,7 @@ L-Kṫaba dyal had ṣ-ṣefḫa ġaṫban '''ġliḍa''' fe [[Special:RecentCha
 
 'enotif_mailer' => '{{SITENAME}} nidam lbaridi',
 'enotif_reset' => 'Qiyyed ṣ-ṣefḫaṫ bḫal la zerṫihom kamlin',
-'enotif_newpagetext' => 'ṣfḫa jdida di.',
 'enotif_impersonal_salutation' => 'Mosṫeḫdim {{SITENAME}}',
-'changed' => 'Beddel',
-'created' => "tnch'at",
-'enotif_subject' => 'Ṣ-Ṣefḫa $PAGETITLE dyal {{SITENAME}} $CHANGEDORCREATEDha $PAGEEDITOR',
 'enotif_lastvisited' => 'Sir ċof $1 baċ ṫċof ṫ-ṫeġyiraṫ kamlin men ziyarṫek l-leĥĥraniya.',
 'enotif_lastdiff' => 'Ċof $1 baċ ṫċof had ṫ-ṫeġyiraṫ.',
 'enotif_anon_editor' => 'mosṫeĥdim ma mċejjelċ $1',
index aac01e1..ad4f067 100644 (file)
 
 $fallback = 'ar';
 
-// (bug 16469) Override Eastern Arabic numberals, use Western
-$digitTransformTable = array(
-       '0' => '0',
-       '1' => '1',
-       '2' => '2',
-       '3' => '3',
-       '4' => '4',
-       '5' => '5',
-       '6' => '6',
-       '7' => '7',
-       '8' => '8',
-       '9' => '9',
-       '.' => '.',
-       ',' => ',',
-);
+$rtl = true;
 
 $namespaceNames = array(
        NS_MEDIA            => 'ميديا',
@@ -58,6 +44,98 @@ $namespaceAliases = array(
        'نقاش_الصورة' => NS_FILE_TALK,
 );
 
+$specialPageAliases = array(
+       'Activeusers'               => array( 'يوزرات_نشطا' ),
+       'Allmessages'               => array( 'كل_الرسايل' ),
+       'Allpages'                  => array( 'كل_الصفح' ),
+       'Ancientpages'              => array( 'صفح_قديمه' ),
+       'Blankpage'                 => array( 'صفحه_فارضيه' ),
+       'Block'                     => array( 'بلوك', 'بلوك_IP', 'بلوك_يوزر' ),
+       'Blockme'                   => array( 'بلوك_لنفسى' ),
+       'Booksources'               => array( 'مصادر_كتاب' ),
+       'BrokenRedirects'           => array( 'تحويلات_مكسوره' ),
+       'Categories'                => array( 'تصانيف' ),
+       'ChangePassword'            => array( 'تغيير_الپاسوورد', 'ظبط_الپاسوورد' ),
+       'Confirmemail'              => array( 'تأكيد_الايميل' ),
+       'Contributions'             => array( 'مساهمات' ),
+       'CreateAccount'             => array( 'ابتدى_حساب' ),
+       'Deadendpages'              => array( 'صفح_نهايه_مسدوده' ),
+       'DeletedContributions'      => array( 'مساهمات_ممسوحه' ),
+       'Disambiguations'           => array( 'توضيحات' ),
+       'DoubleRedirects'           => array( 'تحويلات_دوبل' ),
+       'Emailuser'                 => array( 'ابعت_ايميل_لليوزر' ),
+       'Export'                    => array( 'تصدير' ),
+       'Fewestrevisions'           => array( 'اقل_مراجعات' ),
+       'FileDuplicateSearch'       => array( 'تدوير_فايل_متكرر' ),
+       'Filepath'                  => array( 'مسار_ملف' ),
+       'Import'                    => array( 'استوراد' ),
+       'Invalidateemail'           => array( 'تعطيل_الايميل' ),
+       'BlockList'                 => array( 'ليستة_البلوك', 'بيّن_البلوك', 'ليستة_بلوك_IP' ),
+       '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( 'اكتر_فايلات_معمول_ليها_لينك', 'اكتر_فايلات', 'اكتر_صور' ),
+       'Mostlinked'                => array( 'اكتر_صفح_معمول_ليها_لينك' ),
+       'Mostlinkedcategories'      => array( 'اكتر_تصانيف_معمول_ليها_لينك', 'اكتر_تصانيف_مستعمله' ),
+       'Mostlinkedtemplates'       => array( 'اكتر_قوالب_معمول_ليها_لينك', 'اكتر_قوالب_مستعمله' ),
+       'Mostrevisions'             => array( 'اكتر_مراجعات' ),
+       'Movepage'                  => array( 'نقل_صفحه' ),
+       'Mycontributions'           => array( 'مساهماتى' ),
+       'Mypage'                    => array( 'صفحتى' ),
+       'Mytalk'                    => array( 'مناقشتى' ),
+       'Newimages'                 => array( 'فايلات_جديده', 'صور_جديده' ),
+       'Newpages'                  => array( 'صفح_جديده' ),
+       'Popularpages'              => array( 'صفح_مشهوره' ),
+       'Preferences'               => array( 'تفضيلات' ),
+       'Prefixindex'               => array( 'فهرس_بدايه' ),
+       'Protectedpages'            => array( 'صفح_محميه' ),
+       'Protectedtitles'           => array( 'عناوين_محميه' ),
+       'Randompage'                => array( 'عشوائى', 'صفحه_عشوائيه' ),
+       'Randomredirect'            => array( 'تحويله_عشوائيه' ),
+       'Recentchanges'             => array( 'اخر_تعديلات' ),
+       'Recentchangeslinked'       => array( 'اجدد_التغييرات_اللى_معمول_ليها_لينك', 'تغييرات_مرتبطه' ),
+       'Revisiondelete'            => array( 'مسح_نسخه' ),
+       'Search'                    => array( 'تدوير' ),
+       'Shortpages'                => array( 'صفح_قصيره' ),
+       'Specialpages'              => array( 'صفح_مخصوصه' ),
+       'Statistics'                => array( 'احصائيات' ),
+       'Tags'                      => array( 'وسوم' ),
+       'Unblock'                   => array( 'رفع_منع' ),
+       'Uncategorizedcategories'   => array( 'تصانيف_مش_متصنفه' ),
+       'Uncategorizedimages'       => array( 'فايلات_مش_متصنفه', 'صور_مش_متصنفه' ),
+       'Uncategorizedpages'        => array( 'صفح_مش_متصنفه' ),
+       'Uncategorizedtemplates'    => array( 'قوالب_مش_متصنفه' ),
+       'Undelete'                  => array( 'استرجاع' ),
+       'Unlockdb'                  => array( 'فتح_قب' ),
+       'Unusedcategories'          => array( 'تصانيف_مش_مستعمله' ),
+       'Unusedimages'              => array( 'فايلات_مش_مستعمله', 'صور_مش_مستعمله' ),
+       'Unusedtemplates'           => array( 'قوالب_مش_مستعمله' ),
+       'Unwatchedpages'            => array( 'صفح_مش_متراقبه' ),
+       'Upload'                    => array( 'رفع' ),
+       'Userlogin'                 => array( 'دخول_اليوزر' ),
+       'Userlogout'                => array( 'خروج_اليوزر' ),
+       'Userrights'                => array( 'حقوق_اليوزر', 'ترقية_سيسوپ', 'ترقية_بوت' ),
+       'Version'                   => array( 'نسخه' ),
+       'Wantedcategories'          => array( 'تصانيف_مطلوبه' ),
+       'Wantedfiles'               => array( 'فايلات_مطلوبه' ),
+       'Wantedpages'               => array( 'صفح_مطلوبه', 'لينكات_مكسوره' ),
+       'Wantedtemplates'           => array( 'قوالب_مطلوبه' ),
+       'Watchlist'                 => array( 'ليستة_المراقبه' ),
+       'Whatlinkshere'             => array( 'ايه_بيوصل_هنا' ),
+       'Withoutinterwiki'          => array( 'من-غير_interwiki' ),
+);
+
 $magicWords = array(
        'redirect'                  => array( '0', '#تحويل', '#REDIRECT' ),
        'notoc'                     => array( '0', '__لافهرس__', '__NOTOC__' ),
@@ -65,7 +143,6 @@ $magicWords = array(
        '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' ),
@@ -208,96 +285,20 @@ $magicWords = array(
        'url_query'                 => array( '0', 'استعلام', 'QUERY' ),
 );
 
-$specialPageAliases = array(
-       'Activeusers'               => array( 'يوزرات_نشطا' ),
-       'Allmessages'               => array( 'كل_الرسايل' ),
-       'Allpages'                  => array( 'كل_الصفح' ),
-       'Ancientpages'              => array( 'صفح_قديمه' ),
-       'Blankpage'                 => array( 'صفحه_فارضيه' ),
-       'Block'                     => array( 'بلوك', 'بلوك_IP', 'بلوك_يوزر' ),
-       'Blockme'                   => array( 'بلوك_لنفسى' ),
-       'Booksources'               => array( 'مصادر_كتاب' ),
-       'BrokenRedirects'           => array( 'تحويلات_مكسوره' ),
-       'Categories'                => array( 'تصانيف' ),
-       'ChangePassword'            => array( 'تغيير_الپاسوورد', 'ظبط_الپاسوورد' ),
-       'Confirmemail'              => array( 'تأكيد_الايميل' ),
-       'Contributions'             => array( 'مساهمات' ),
-       'CreateAccount'             => array( 'ابتدى_حساب' ),
-       'Deadendpages'              => array( 'صفح_نهايه_مسدوده' ),
-       'DeletedContributions'      => array( 'مساهمات_ممسوحه' ),
-       'Disambiguations'           => array( 'توضيحات' ),
-       'DoubleRedirects'           => array( 'تحويلات_دوبل' ),
-       'Emailuser'                 => array( 'ابعت_ايميل_لليوزر' ),
-       'Export'                    => array( 'تصدير' ),
-       'Fewestrevisions'           => array( 'اقل_مراجعات' ),
-       'FileDuplicateSearch'       => array( 'تدوير_فايل_متكرر' ),
-       'Filepath'                  => array( 'مسار_ملف' ),
-       'Import'                    => array( 'استوراد' ),
-       'Invalidateemail'           => array( 'تعطيل_الايميل' ),
-       'BlockList'                 => array( 'ليستة_البلوك', 'بيّن_البلوك', 'ليستة_بلوك_IP' ),
-       '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( 'اكتر_فايلات_معمول_ليها_لينك', 'اكتر_فايلات', 'اكتر_صور' ),
-       'Mostlinked'                => array( 'اكتر_صفح_معمول_ليها_لينك' ),
-       'Mostlinkedcategories'      => array( 'اكتر_تصانيف_معمول_ليها_لينك', 'اكتر_تصانيف_مستعمله' ),
-       'Mostlinkedtemplates'       => array( 'اكتر_قوالب_معمول_ليها_لينك', 'اكتر_قوالب_مستعمله' ),
-       'Mostrevisions'             => array( 'اكتر_مراجعات' ),
-       'Movepage'                  => array( 'نقل_صفحه' ),
-       'Mycontributions'           => array( 'مساهماتى' ),
-       'Mypage'                    => array( 'صفحتى' ),
-       'Mytalk'                    => array( 'مناقشتى' ),
-       'Newimages'                 => array( 'فايلات_جديده', 'صور_جديده' ),
-       'Newpages'                  => array( 'صفح_جديده' ),
-       'Popularpages'              => array( 'صفح_مشهوره' ),
-       'Preferences'               => array( 'تفضيلات' ),
-       'Prefixindex'               => array( 'فهرس_بدايه' ),
-       'Protectedpages'            => array( 'صفح_محميه' ),
-       'Protectedtitles'           => array( 'عناوين_محميه' ),
-       'Randompage'                => array( 'عشوائى', 'صفحه_عشوائيه' ),
-       'Randomredirect'            => array( 'تحويله_عشوائيه' ),
-       'Recentchanges'             => array( 'اخر_تعديلات' ),
-       'Recentchangeslinked'       => array( 'اجدد_التغييرات_اللى_معمول_ليها_لينك', 'تغييرات_مرتبطه' ),
-       'Revisiondelete'            => array( 'مسح_نسخه' ),
-       'Search'                    => array( 'تدوير' ),
-       'Shortpages'                => array( 'صفح_قصيره' ),
-       'Specialpages'              => array( 'صفح_مخصوصه' ),
-       'Statistics'                => array( 'احصائيات' ),
-       'Tags'                      => array( 'وسوم' ),
-       'Unblock'                   => array( 'رفع_منع' ),
-       'Uncategorizedcategories'   => array( 'تصانيف_مش_متصنفه' ),
-       'Uncategorizedimages'       => array( 'فايلات_مش_متصنفه', 'صور_مش_متصنفه' ),
-       'Uncategorizedpages'        => array( 'صفح_مش_متصنفه' ),
-       'Uncategorizedtemplates'    => array( 'قوالب_مش_متصنفه' ),
-       'Undelete'                  => array( 'استرجاع' ),
-       'Unlockdb'                  => array( 'فتح_قب' ),
-       'Unusedcategories'          => array( 'تصانيف_مش_مستعمله' ),
-       'Unusedimages'              => array( 'فايلات_مش_مستعمله', 'صور_مش_مستعمله' ),
-       'Unusedtemplates'           => array( 'قوالب_مش_مستعمله' ),
-       'Unwatchedpages'            => array( 'صفح_مش_متراقبه' ),
-       'Upload'                    => array( 'رفع' ),
-       'Userlogin'                 => array( 'دخول_اليوزر' ),
-       'Userlogout'                => array( 'خروج_اليوزر' ),
-       'Userrights'                => array( 'حقوق_اليوزر', 'ترقية_سيسوپ', 'ترقية_بوت' ),
-       'Version'                   => array( 'نسخه' ),
-       'Wantedcategories'          => array( 'تصانيف_مطلوبه' ),
-       'Wantedfiles'               => array( 'فايلات_مطلوبه' ),
-       'Wantedpages'               => array( 'صفح_مطلوبه', 'لينكات_مكسوره' ),
-       'Wantedtemplates'           => array( 'قوالب_مطلوبه' ),
-       'Watchlist'                 => array( 'ليستة_المراقبه' ),
-       'Whatlinkshere'             => array( 'ايه_بيوصل_هنا' ),
-       'Withoutinterwiki'          => array( 'من-غير_interwiki' ),
+// (bug 16469) Override Eastern Arabic numberals, use Western
+$digitTransformTable = array(
+       '0' => '0',
+       '1' => '1',
+       '2' => '2',
+       '3' => '3',
+       '4' => '4',
+       '5' => '5',
+       '6' => '6',
+       '7' => '7',
+       '8' => '8',
+       '9' => '9',
+       '.' => '.',
+       ',' => ',',
 );
 
 $messages = array(
@@ -316,7 +317,7 @@ $messages = array(
 'tog-editsectiononrightclick' => 'اسمح بـ تعديل الاجزاء لما تعمل right-click بـ الماوس على عناوين الاجزاء (بيحتاج JavaScript)',
 'tog-showtoc' => 'بين جدول المحتويات (بتاع الصفح اللى فيها اكتر من 3 عناوين)',
 'tog-rememberpassword' => ' (لمدة   $1 {{PLURAL:$1|يوم|يوم}})خليك فاكر دخولى على الكمبيوتر دا',
-'tog-watchcreations' => 'زوّد الصفح اللى ابتديتها على ليستة الصفح اللى باراقبها',
+'tog-watchcreations' => 'زوّد الصفح اللى ابتديتها على ليستة الصفح اللى باراقبها.',
 'tog-watchdefault' => 'زوّد الصفح اللى باعدلها على ليستة الصفح اللى باراقبها',
 'tog-watchmoves' => 'زوّد الصفح اللى بانقلها على ليستة الصفح اللى باراقبها',
 'tog-watchdeletion' => 'زوّد الصفح اللى بامسحها على ليستة الصفح اللى باراقبها',
@@ -324,15 +325,16 @@ $messages = array(
 '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' => 'استعÙ\85Ù\84 Ù\85حرر Ø®Ø§Ø±Ø¬Ù\89 Ø§Ù\81تراضÙ\8aا',
-'tog-externaldiff' => 'استعÙ\85Ù\84 Ù\81رÙ\82 Ø®Ø§Ø±Ø¬Ù\89 Ø§Ù\81تراضÙ\8aا',
+'tog-externaleditor' => 'استخدÙ\85 Ù\85حرر Ø®Ø§Ø±Ø¬Ù\89 Ø¨Ø´Ù\83Ù\84 Ø§Ù\81تراضÙ\89 (Ù\84Ù\84خبرا Ø¨Ø³Ø\8c Ù\8aحتاج Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø®Ø§ØµØ© Ø¹Ù\84Ù\89 Ù\83Ù\88Ù\85بÙ\8aÙ\88ترÙ\83) ([//www.mediawiki.org/wiki/Manual:External_editors Ù\84Ù\85زÙ\8aد Ù\85Ù\86 Ø§Ù\84Ù\85عÙ\84Ù\88Ù\85ات].)',
+'tog-externaldiff' => 'استخدÙ\85 Ù\81رÙ\82 Ø®Ø§Ø±Ø¬Ù\89 Ø¨Ø´Ù\83Ù\84 Ø§Ù\81تراضÙ\89 (Ù\84Ù\84خبرا Ø¨Ø³Ø\8c Ù\8aحتاج Ø¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø®Ø§ØµØ© Ø¹Ù\84Ù\89 Ù\83Ù\88Ù\85بÙ\8aÙ\88ترÙ\83) ([//www.mediawiki.org/wiki/Manual:External_editors Ù\84Ù\85عÙ\84Ù\88Ù\85ات Ø§Ù\83تر].)',
 'tog-showjumplinks' => 'خلى وصلات "روح لـ" تكون شغالة.',
 'tog-uselivepreview' => 'استخدم البروفة السريعة (جافاسكريبت) (تجريبي)',
 'tog-forceeditsummary' => 'نبهنى عند تدخيل ملخص للتعديل  فاضي',
@@ -434,8 +436,8 @@ $messages = array(
 'newwindow' => '(بتفتح ويندو جديده)',
 'cancel' => 'كانسل',
 'moredotdotdot' => 'اكتر...',
-'mypage' => 'صفحتى',
-'mytalk' => 'Ù\85Ù\86اÙ\82شاتÙ\89',
+'mypage' => 'صفحه',
+'mytalk' => 'Ù\83Ù\84اÙ\85',
 'anontalk' => 'المناقشة مع عنوان الأيبى دا',
 'navigation' => 'استكشاف',
 'and' => '&#32;و',
@@ -445,7 +447,6 @@ $messages = array(
 'qbbrowse' => 'تصفح',
 'qbedit' => 'عدل',
 'qbpageoptions' => ' الصفحه دى',
-'qbpageinfo' => 'السياق',
 'qbmyoptions' => 'صفحاتى',
 'qbspecialpages' => 'الصفحات الخاصة',
 'faq' => 'اسئله بتتسئل كتير',
@@ -682,11 +683,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''أنت دلوقتى مش مسجل دخولك.'''
 
-تقدر تكمل استعمال {{SITENAME}} على انك مجهول، أو [[Special:UserLogin|الدخول مرة تانيه]] بنفس الاسم أو باسم تاني.
+تقدر تكمل استعمال {{SITENAME}} على انك مجهول، أو <span class='plainlinks'>[$1 الدخول مرة تانيه]</span> بنفس الاسم أو باسم تاني.
 ممكن تشوف بعض الصفحات  كأنك متسجل ، و دا علشان استعمال الصفحات المتخبية فى المتصفح بتاعك.",
-'welcomecreation' => '== اهلاً و سهلا يا $1! ==
-اتفتحلك حساب.
-ما تنساش تغير [[Special:Preferences|تفضيلاتك في {{SITENAME}}]].',
 'yourname' => 'اليوزرنيم:',
 'yourpassword' => 'الباسوورد:',
 'yourpasswordagain' => 'اكتب الباسورد تاني:',
@@ -1224,8 +1222,6 @@ $1",
 'search-interwiki-caption' => 'المشاريع الشقيقة',
 'search-interwiki-default' => '$1 نتيجة:',
 'search-interwiki-more' => '(اأكتر)',
-'search-mwsuggest-enabled' => 'مع اقتراحات',
-'search-mwsuggest-disabled' => 'مافيش اقتراحات',
 'search-relatedarticle' => 'مرتبطه',
 'mwsuggest-disable' => 'تعطيل اقتراحات أجاكس',
 'searcheverything-enable' => 'دور فى النطاقات كلها.',
@@ -2111,11 +2107,7 @@ PICT # misc.
 
 'enotif_mailer' => 'نظام {{SITENAME}} البريدى للإخطارات',
 'enotif_reset' => 'علم على كل الصفحات كأنك خلاص زرتها',
-'enotif_newpagetext' => 'دى صفحه جديده.',
 'enotif_impersonal_salutation' => 'يوزر {{SITENAME}}',
-'changed' => 'اتغيرت',
-'created' => 'إتنشأت',
-'enotif_subject' => 'صفحة {{SITENAME}} $PAGETITLE تم $CHANGEDORCREATED بواسطة $PAGEEDITOR',
 'enotif_lastvisited' => 'شوف $1 لمراجعة كل التغييرات اللى حصلت من أخر زيارة ليك.',
 'enotif_lastdiff' => 'شوف $1 علشان تبص على التغيير دا.',
 'enotif_anon_editor' => 'يوزر مش معروف $1',
@@ -3486,4 +3478,8 @@ $5
 'revdelete-unrestricted' => 'شيل الضوابط من على السيسوبات',
 'newuserlog-byemail' => 'الباسورد اتبعتت بالايميل',
 
+# Search suggestions
+'searchsuggest-search' => 'تدوير',
+'searchsuggest-containing' => 'جوّاه...',
+
 );
index 2e86ea2..cd09835 100644 (file)
@@ -86,7 +86,7 @@ $specialPageAliases = array(
        'CreateAccount'             => array( 'সদস্যভুক্তি' ),
        'DeletedContributions'      => array( 'বিলোপ_কৰা_বৰঙনিসমূহ' ),
        'Disambiguations'           => array( 'দ্ব্যৰ্থতা_দূৰীকৰণসমূহ' ),
-       'DoubleRedirects'           => array( 'দà§\8dবি_পà§\81ণà¦\83নিৰ্দেশনাসমূহ' ),
+       'DoubleRedirects'           => array( 'দà§\8dবি_পà§\81নৰà§\8dনিৰ্দেশনাসমূহ' ),
        'EditWatchlist'             => array( 'লক্ষ্যতালিকা_সম্পাদনা_কৰক' ),
        'Emailuser'                 => array( 'সদস্যলৈ_ই-মেইল_পঠিয়াওক' ),
        'Export'                    => array( 'ৰপ্তানি' ),
@@ -102,14 +102,14 @@ $specialPageAliases = array(
        'Listbots'                  => array( 'বটৰ_তালিকা' ),
        'Listfiles'                 => array( 'চিত্ৰ-তালিকা' ),
        'Listgrouprights'           => array( 'গোটৰ_অধিকাৰসমূহ' ),
-       'Listredirects'             => array( 'পà§\81ণà¦\83নিৰ্দেশনাসমূহৰ_তালিকা' ),
+       'Listredirects'             => array( 'পà§\81নৰà§\8dনিৰ্দেশনাসমূহৰ_তালিকা' ),
        'Listusers'                 => array( 'সদস্য-তালিকা' ),
        'Lockdb'                    => array( 'তথ্যকোষ_বন্ধ_কৰক' ),
        'Log'                       => array( 'অভিলেখ', 'অভিলেখসমূহ' ),
        'Lonelypages'               => array( 'অকলশৰীয়া_পৃষ্ঠা' ),
        'Longpages'                 => array( 'দীঘলীয়া_পৃষ্ঠাসমূহ' ),
        'MergeHistory'              => array( 'একত্ৰীকৰণ_ইতিহাস' ),
-       'MIMEsearch'                => array( 'MIME_অনুসন্ধান' ),
+       'MIMEsearch'                => array( 'MIMEMIMEmmmgM_অনুসন্ধান' ),
        'Movepage'                  => array( 'পৃষ্ঠা_স্থানান্তৰ' ),
        'Mycontributions'           => array( 'মোৰ_বৰঙনি' ),
        'Mypage'                    => array( 'মোৰ_পৃষ্ঠা' ),
@@ -124,11 +124,10 @@ $specialPageAliases = array(
        'Protectedpages'            => array( 'সুৰক্ষিত_পৃষ্ঠাসমূহ' ),
        'Protectedtitles'           => array( 'সুৰক্ষিত_শিৰোনামসমূহ' ),
        'Randompage'                => array( 'আকস্মিক' ),
-       'Randomredirect'            => array( 'à¦\86à¦\95সà§\8dমিà¦\95_পà§\81ণà¦\83নিৰ্দেশনা' ),
+       'Randomredirect'            => array( 'à¦\86à¦\95সà§\8dমিà¦\95_পà§\81নৰà§\8dনিৰ্দেশনা' ),
        'Recentchanges'             => array( 'শেহতীয়া_সালসলনি' ),
        'Recentchangeslinked'       => array( 'সম্পৰ্কিত_সালসলনিসমূহ' ),
        'Revisiondelete'            => array( 'সংস্কৰণ_বিলোপ' ),
-       'RevisionMove'              => array( 'সংস্কৰণ_স্থানান্তৰ' ),
        'Search'                    => array( 'সন্ধান' ),
        'Shortpages'                => array( 'চমু_পৃষ্ঠা' ),
        'Specialpages'              => array( 'বিশেষ_পৃষ্ঠাসমূহ' ),
@@ -327,7 +326,6 @@ $messages = array(
 'qbbrowse' => 'ব্ৰাওজ',
 'qbedit' => 'সম্পাদনা',
 'qbpageoptions' => 'এই পৃষ্ঠা',
-'qbpageinfo' => 'প্ৰসংগ',
 'qbmyoptions' => 'মোৰ পৃষ্ঠাসমূহ',
 'qbspecialpages' => 'বিশেষ পৃষ্ঠাসমূহ',
 'faq' => 'সততে উদিত প্ৰশ্নসমূহ (FAQ)',
@@ -340,7 +338,7 @@ $messages = array(
 'vector-action-protect' => 'সুৰক্ষিত কৰক',
 'vector-action-undelete' => 'পুনৰুদ্ধাৰ কৰক',
 'vector-action-unprotect' => 'সুৰক্ষা সলনি কৰক',
-'vector-simplesearch-preference' => 'à¦\89à§\8eà¦\95à§\83ষà§\8dà¦\9f à¦¸à¦¨à§\8dধানৰ à¦ªà§°à¦¾à¦®à§°à§\8dশ সক্ৰিয় কৰক (ভেক্টৰ স্কিনৰ বাবেহে)',
+'vector-simplesearch-preference' => 'সৰল à¦¸à¦¨à§\8dধান à¦¦à¦£à§\8dডিà¦\95া সক্ৰিয় কৰক (ভেক্টৰ স্কিনৰ বাবেহে)',
 'vector-view-create' => 'সৃষ্টি কৰক',
 'vector-view-edit' => 'সম্পাদনা',
 'vector-view-history' => 'ইতিহাস চাওক',
@@ -446,6 +444,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' => 'সম্পাদনা',
@@ -497,12 +499,12 @@ $1',
 # General errors
 'error' => 'ভুল',
 'databaseerror' => 'তথ্যকোষৰ ভুল',
-'dberrortext' => 'Database query’ত ত্ৰুটি আছে।
+'dberrortext' => 'Database query syntaxত ত্ৰুটি হৈছে।
 ছফ্টৱেৰত থকা কোনো বাগৰ বাবে এনে হব পাৰে।
 অন্তিমবাৰ চেষ্টা কৰা ডাটাবেচ কুৱেৰীটো আছিল এনেধৰণৰ:
-<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"
@@ -556,8 +558,11 @@ $1',
 'protectedpagetext' => 'এই পৃষ্ঠাটোৰ সম্পাদনা ৰোধ কৰিবলৈ সুৰক্ষিত কৰা হৈছে।',
 'viewsourcetext' => 'আপুনি এই পৃষ্ঠাটোৰ উৎস চাব আৰু নকল কৰিব পাৰে',
 'viewyourtext' => "আপুনি '''আপোনাৰ সম্পাদনাসমূহ'''ৰ উৎস চাব আৰু এই পৃষ্ঠালৈ নকল কৰিব পাৰে:",
-'protectedinterface' => 'এই পৃষ্ঠাই ৱিকি ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা প্ৰদান কৰে, আৰু ইয়াক সুৰক্ষিত কৰি ৰখা হৈছে ।',
-'editinginterface' => "'''সাৱধানবাণী:''' আপুনি যিখন পৃষ্ঠা সম্পাদনা কৰিছে সেইখন ৱিকি ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা দিবলৈ ব্যৱহাৰ হয় । এই পৃষ্ঠাৰ সাল-সলনিয়ে আন ব্যৱহাৰকাৰীৰ বাবে ইণ্টাৰফে’চত প্ৰভাৱ পেলাব । অনুবাদৰ বাবে অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প [//translatewiki.net/wiki/Main_Page?setlang=bn translatewiki.net] ব্যৱহাৰ কৰক ।",
+'protectedinterface' => 'এই পৃষ্ঠাই ৱিকি ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা প্ৰদান কৰে আৰু ইয়াক সুৰক্ষিত কৰি ৰখা হৈছে।
+সকলো ৱিকিৰ বাবে অনুবাদ যোগ কৰিবলৈ বা সলাবলৈ অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প [//translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক।',
+'editinginterface' => "'''সাৱধানবাণী:''' আপুনি যিখন পৃষ্ঠা সম্পাদনা কৰিছে সেইখন এই ছফ্টৱেৰৰ ইণ্টাৰফে’চ বাৰ্তা দিবলৈ ব্যৱহাৰ হয়।
+এই পৃষ্ঠাৰ সাল-সলনিয়ে আন ব্যৱহাৰকাৰীৰ বাবে ইণ্টাৰফে’চত প্ৰভাৱ পেলাব।
+সকলো ৱিকিৰ বাবে অনুবাদৰ বাবে অনুগ্ৰহ কৰি মিডিয়াৱিকি স্থানীয়কৰণ প্ৰকল্প [//translatewiki.net/ translatewiki.net] ব্যৱহাৰ কৰক ।",
 'sqlhidden' => '(নিহিত SQL query)',
 'cascadeprotected' => 'এই পৃষ্ঠাখন সম্পাদনাৰ পৰা সুৰক্ষিত কাৰণ এই {{PLURAL:$1|পৃষ্ঠা, যিখন|পৃষ্ঠা, যিবোৰ}} "প্ৰপাতাকাৰ" (cascading) বিকল্পৰ সহযোগত সুৰক্ষিত কৰা হৈছে: 
 $2',
@@ -582,9 +587,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''আপুনি প্ৰস্থান কৰিলে ।'''
 
-আপুনি বেনামী ভাবেও {{SITENAME}} ব্যৱহাৰ কৰিব পাৰে, অথবা আকৌ সেই একে বা বেলেগ নামেৰে [[Special:UserLogin|প্ৰৱেশ]] কৰিব পাৰে।
+আপুনি বেনামী ভাবেও {{SITENAME}} ব্যৱহাৰ কৰিব পাৰে, অথবা আকৌ সেই একে বা বেলেগ নামেৰে <span class='plainlinks'>[$1 প্ৰৱেশ]</span> কৰিব পাৰে।
 মন কৰিব যে যেতিয়ালৈকে আপোনাৰ ব্ৰাউজাৰৰ অস্থায়ী-স্মৃতি (cache memory) খালী নকৰে, তেতিয়ালৈকে কিছুমান পৃষ্ঠাত আপুনি প্ৰৱেশ কৰা বুলি দেখুৱাই থাকিব পাৰে।",
-'welcomecreation' => '== আদৰিছোঁ, $1! ==
+'welcomeuser' => 'আদৰিছোঁ, $1!',
+'welcomecreation-msg' => '== আদৰিছোঁ, $1! ==
 আপোনাৰ সদস্যভুক্তি হৈ গ’ল ।
 [[Special:Preferences|{{SITENAME}}ৰ পছন্দসমূহ]]ত আপোনাৰ পছন্দমতে ব্যক্তিগতকৰণ কৰি ল’বলৈ নাপাহৰে যেন ।',
 'yourname' => 'সদস্যনাম:',
@@ -593,6 +599,7 @@ $2',
 'remembermypassword' => 'মোৰ প্ৰৱেশ এই কম্পিউটাৰত মনত ৰাখিব (সৰ্বাধিক $1 {{PLURAL:$1|দিনলৈ|দিনলৈ}})',
 'securelogin-stick-https' => 'প্ৰৱেশ কৰা পাছত HTTPS-ৰ দ্বাৰা সংযোগ ৰাখক',
 'yourdomainname' => 'আপোনাৰ ডমেইন:',
+'password-change-forbidden' => 'আপুনি এই ৱিকিত গুপ্তশব্দ সলাব নোৱাৰে।',
 'externaldberror' => 'কোনো প্ৰামাণ্যকৰণ তথ্যকোষৰ ত্ৰুটি ঘটিছে নতুবা আপোনাৰ বৰ্হি-একাউণ্ট নৱীকৰণ কৰাৰ অনুমতি নাই ।',
 'login' => 'প্ৰৱেশ',
 'nav-login-createaccount' => 'প্ৰৱেশ/সদস্যভুক্তি',
@@ -835,9 +842,13 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 আপুনি আন পৃষ্ঠাত [[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-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'' পঞ্জীভূত নহয়",
@@ -847,7 +858,6 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 * '''Firefox / Safari: ''' ''Shift'' ধৰি ৰাখি ''Reload'' ক্লিক কৰক, নাইবা ''Ctrl-F5'' বা ''Ctrl-R'' টিপক (এপল মেকৰ বাবে ''⌘-R'')
 * '''Google Chrome:''' ''Ctrl-Shift-R'' টিপক (এপল মেকৰ বাবে ''⌘-Shift-R'' )
 * '''Internet Explorer:''' ''Ctrl'' ধৰি ৰাখি ''Refresh'' ক্লিক কৰক, অথবা ''Ctrl-F5'' টিপক
-* '''Konqueror: ''' ''Reload'' ক্লিক কৰক বা ''F5'' টিপক
 * '''Opera:''' ''Tools→Preferences'' ত গৈ কেচ্‌ মচি পেলাওক",
 'usercssyoucanpreview' => "'''পৰামৰ্শ:''' \"{{int:showpreview}}\" বুটাম ব্যৱহাৰ কৰি সাঁচি ৰখাৰ আগতে আপোনাৰ নতুন CSS পৰীক্ষা কৰক ।",
 'userjsyoucanpreview' => "'''পৰামৰ্শ:''' \"{{int:showpreview}}\" বুটাম ব্যৱহাৰ কৰি সাঁচি ৰখাৰ আগতে আপোনাৰ নতুন জাভালিপি পৰীক্ষা কৰক ।",
@@ -864,7 +874,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'note' => "'''টোকা:'''",
 'previewnote' => "'''মনত ৰাখিব এয়া মাথোন প্ৰাক্‌দৰ্শনহে।'''
 আপোনাৰ সালসলনিসমূহ এতিয়াও সংৰক্ষণ কৰা হোৱা নাই!",
-'continue-editing' => 'সমà§\8dপাদনা à¦\9cাৰà§\80 à§°à¦¾à¦\96ক',
+'continue-editing' => 'সমà§\8dপাদনা à¦\95à§\8dষà§\87তà§\8dৰলà§\88 à¦¯à¦¾à¦\93ক',
 'previewconflict' => 'এই প্ৰাকদৰ্শনে ওপৰৰ সম্পাদনা ক্ষেত্ৰৰ লেখা সাঁচি ৰাখিলে যেনেকুৱা দেখা যাব তেনেকুৱা দেখাইছে ।',
 'session_fail_preview' => "'''দুঃখিত! চেচন ডাটা হেৰাই যোৱাৰ কাৰণে আপোনাৰ সম্পাদনা কৃতকাৰ্য্য নহ'ল ।'''
 অনুগ্ৰহ কৰি পুনৰ চেষ্টা কৰক ।
@@ -950,6 +960,14 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'edit-already-exists' => "নতুন পৃষ্ঠা সৃষ্টি কৰা নহ'ল ।
 পৃষ্ঠাখন ইতিমধ্যে আছেই ।",
 'defaultmessagetext' => 'সাধাৰণ বাৰ্তা পাঠ্য',
+'invalid-content-data' => 'অবৈধ সমল তথ্য',
+'content-not-allowed-here' => '[[$2]] পৃষ্ঠাত "$1" সমল অনুমোদিত নহয়',
+
+# Content models
+'content-model-wikitext' => 'ৱিকিপাঠ্য',
+'content-model-text' => 'সাধাৰণ পাঠ্য',
+'content-model-javascript' => 'জাভাস্ক্ৰীপ্ট',
+'content-model-css' => 'চি.এচ.এচ.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''সতৰ্কবাণী:''' এই পৃষ্ঠাখনত অধিক এক্সপেনচিভ পাৰ্চাৰ ফাংচন কল আছে ।
@@ -971,6 +989,7 @@ $1ৰ দ্বাৰা এই অৱৰোধ কৰা হৈছে ।
 'expansion-depth-exceeded-warning' => 'পৃষ্ঠাখনৰ বিস্তৃতি গভীৰতা বেছি হৈছে',
 'parser-unstrip-loop-warning' => 'আন্‌ষ্ট্ৰীপ লুপ চিনাক্ত কৰা হৈছে',
 'parser-unstrip-recursion-limit' => 'আন্‌ষ্ট্ৰিপ ৰিকাৰ্ছন সীমা অতিক্ৰম হৈছে ($1)',
+'converter-manual-rule-error' => 'মেনুৱেল ভাষা পৰিৱৰ্তন নিয়মত ত্ৰুটি পোৱা গৈছে',
 
 # "Undo" feature
 'undo-success' => 'এই সম্পাদনা পূৰ্ববৎ কৰিব পাৰি ।
@@ -1092,7 +1111,7 @@ $1",
 'revdel-restore' => 'দৃষ্টিপাত সালসলনি কৰক',
 'revdel-restore-deleted' => 'বাতিল কৰা সংশোধনসমূহ',
 'revdel-restore-visible' => 'দৃশ্যমান সংশোধনসমূহ',
-'pagehist' => 'পৃষ্ঠা ইতিহাস',
+'pagehist' => 'পৃষ্ঠা ইতিহাস',
 'deletedhist' => 'বিলোপ কৰাৰ ইতিহাস',
 'revdelete-hide-current' => ' $2, $1 তাৰিখৰ এই আইটেমটো গোপন কৰাত সমস্যা হৈছে: এইটো বৰ্তমানৰ সংশোধনী ।
 এইটোক গোপন কৰিব পৰা নাযাব ।',
@@ -1106,8 +1125,9 @@ $1",
 অনুগ্ৰহ কৰি ল’গ পৰীক্ষা কৰক ।',
 'revdelete-only-restricted' => '$2, $1 তৰিখৰ আইটেমটো গোপন কৰাত সমস্যা হৈছে: আন প্ৰত্যক্ষতা বিকল্প বাছনি নকৰাকৈ আপুনি প্ৰশাসকৰ দৃষ্টিৰ পৰা আইটেমসমূহ নিবাৰণ কৰিব নোৱাৰে ।',
 'revdelete-reason-dropdown' => '*বিলোপৰ সাধাৰণ কাৰণসমূহ 
-** স্বত্বাধিকাৰ উলংঘন 
-** অনুপযুক্ত ব্যক্তিগত তথ্য 
+** কপিৰাইট উলংঘন 
+** অনুপযুক্ত মন্তব্য বা ব্যক্তিগত তথ্য 
+** অনুপযুক্ত সদস্যনাম
 ** সম্ভাব্য ক্ষতিকাৰক তথ্য',
 'revdelete-otherreason' => 'অন্য/অতিৰিক্ত কাৰণ:',
 'revdelete-reasonotherlist' => 'অন্য কাৰণ',
@@ -1197,14 +1217,12 @@ $1",
 '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)',
+'search-redirect' => '(পà§\81নৰà§\8dনিৰà§\8dদà§\87শনা $1)',
 'search-section' => '(অনুচ্ছেদ $1)',
 'search-suggest' => 'আপুনি $1 বুজাব খুজিছে নেকি?',
 'search-interwiki-caption' => 'সহপ্ৰকল্পসমূহ',
 'search-interwiki-default' => '$1 ফলাফলসমূহ:',
 'search-interwiki-more' => '(আৰু)',
-'search-mwsuggest-enabled' => 'উপদেশ সহ',
-'search-mwsuggest-disabled' => 'উপদেশ নাই',
 'search-relatedarticle' => 'সম্পৰ্কিত',
 'mwsuggest-disable' => 'AJAX পৰামৰ্শ নিষ্ক্ৰিয় কৰক',
 'searcheverything-enable' => 'সকলো নামস্থানত অনুসন্ধান কৰক',
@@ -1216,10 +1234,10 @@ $1",
 'nonefound' => "'''টোকা:''' ডিফ’ল্ট অনুযায়ী মাথোঁ কেইটামানহে নামস্থান অনুসন্ধান কৰা হয় ।
 আপোনাৰ অনুসন্ধানত ''all:'' ব্যবহাৰ কৰি সকলো সমল (কথা-বতৰা, শ্ৰেনী ইত্যদি) অনুসন্ধান কৰিব পাৰে, নতুবা আকাংক্ষিত নামস্থান প্ৰিফিক্স হিছাপে ব্যবহাৰ কৰিব পাৰে ।",
 'search-nonefound' => 'এই অনুসন্ধানৰ কোনো ফলাফল নাই ।',
-'powersearch' => 'à¦\85তিসন্ধান',
+'powersearch' => 'শà¦\95à§\8dতিশালà§\80 সন্ধান',
 'powersearch-legend' => 'শক্তিশালী সন্ধান',
 'powersearch-ns' => 'নামস্থানবোৰত সন্ধান:',
-'powersearch-redir' => 'পà§\81ননিৰà§\8dদà§\87শà¦\95ৰ তালিকা',
+'powersearch-redir' => 'পà§\81নৰà§\8dনিৰà§\8dদà§\87শনাৰ তালিকা',
 'powersearch-field' => 'ৰ কাৰণে সন্ধান কৰক',
 'powersearch-togglelabel' => 'পৰীক্ষা কৰক:',
 'powersearch-toggleall' => 'সকলো',
@@ -1302,7 +1320,7 @@ $1",
 'timezoneregion-indian' => 'ভাৰত মহাসাগৰ',
 'timezoneregion-pacific' => 'প্ৰশান্ত মহাসাগৰ',
 'allowemail' => 'অন্য সদস্যৰ পৰা ই-মেইল সমৰ্থ কৰক',
-'prefs-searchoptions' => 'সনà§\8dধান à¦¬à¦¿à¦\95লà§\8dপসমà§\82হ',
+'prefs-searchoptions' => 'সনà§\8dধান à¦\95ৰà¦\95',
 'prefs-namespaces' => 'নামস্থান',
 'defaultns' => 'অন্যথা এই নামস্থান সমূহত অনুসন্ধান কৰিব:',
 'default' => 'অবিচল',
@@ -1323,7 +1341,7 @@ $1",
 'yourlanguage' => 'ভাষা:',
 'yourvariant' => 'বিষয়-বস্তুৰ ভাষা বিকল্প',
 'prefs-help-variant' => 'এই ৱিকিৰ সমল পৃষ্ঠাসমূহ প্ৰদৰ্শন কৰিবলে আপোনাৰ পছন্দৰ অপৰ অথবা বৰ্ণবিন্যাস।',
-'yournick' => 'নতà§\81ন à¦¸à§\8dবাà¦\95à§\8dষà§\8dযৰ:',
+'yournick' => 'নতুন স্বাক্ষৰ:',
 'prefs-help-signature' => 'কথা-বতৰা পৃষ্ঠাত মন্তব্যসমূহৰ তলত "<nowiki>~~~~</nowiki>" লিখিলে ই স্বয়ংক্ৰিয়ভাৱে আপোনাৰ নাম আৰু সময় সংযুক্ত কৰিব ।',
 'badsig' => 'অনুপযোগী স্বাক্ষ্যৰ, HTML টেগ পৰীক্ষা কৰি লওক।',
 'badsiglength' => 'আপোনাৰ স্বাক্ষৰ অত্যাধিক দীঘলীয়া ।
@@ -1725,7 +1743,7 @@ URL টোৰ বৈধতা বিচাৰ কৰি পুনৰ চেষ
 'backend-fail-internal' => 'ষ্ট\'ৰেজ বেক্‌এণ্ড "$1"ত এক অজ্ঞাত ত্ৰুটী ঘটিছে।',
 'backend-fail-contenttype' => '"$1"ত সাঁচি থ\'বলৈ ফাইলটোৰ সমল প্ৰকাৰ স্থিৰ কৰিব পৰা নগ\'ল।',
 'backend-fail-batchsize' => "$1টা ফাইল {{PLURAL:$1|কাৰ্যৰ|কাৰ্যৰ}} ষ্ট'ৰেজ বেকএ'ণ্ড দিয়া হৈছে; সীমা হৈছে $2টা {{PLURAL:$2|কাৰ্য|কাৰ্য}}।",
-'backend-fail-usable' => "অপৰ্যাপ্ত অনুমতি বা হেৰোৱা নিৰ্দেশিকা/সমলৰ বাবে $1 ফাইলটো লিখিব পৰা নগ'ল।",
+'backend-fail-usable' => 'অপৰ্যাপ্ত অনুমতি বা হেৰোৱা নিৰ্দেশিকা/সমলৰ বাবে "$1" ফাইলটো পঢ়িব বা লিখিব পৰা নগ\'ল।',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'ষ্ট\'ৰেজ বেকএ\'ণ্ড "$1"ৰ বাবে জাৰ্ণাল তথ্যকোষৰ লগত সংযোগ স্থাপন নহ\'ল।',
@@ -1861,6 +1879,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'uploadnewversion-linktext' => "এই ফাইলতোৰ নতুন সংশোধন এটা আপল'ড কৰক",
 'shared-repo-from' => '$1 পৰা',
 'shared-repo' => 'এটা উমৈহতীয়া ভঁৰাল',
+'upload-disallowed-here' => 'আপুনি এই ফাইলটো  প্ৰতিস্থাপন কৰিব নোৱাৰে।',
 
 # File reversion
 'filerevert' => '$1 ক আগৰ অৱস্থালৈ ঘূৰাই আনক',
@@ -1942,9 +1961,9 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 
 'disambiguations' => 'দ্ব্যৰ্থতা-দূৰীকৰণ পৃষ্ঠাসমূহলৈ সংযোগ থকা পৃষ্ঠাসমূহ',
 'disambiguationspage' => 'সাঁচ:দ্ব্যৰ্থতা-দূৰীকৰণ',
-'disambiguations-text' => "তলৰ পৃষ্ঠাখনসমূহত '''দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা'''ৰ লগত সংযোগ আছে 
-à¦\87য়à§\87 à¦\89পযà§\81à¦\95à§\8dত à¦ªà§\83ষà§\8dঠাৰ à¦²à¦\97ত à¦¸à¦\82যà§\8bà¦\97 à¦\95ৰিব à¦ªà¦¾à§°à§\87 
-[[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাঁচ ব্যৱহাৰ কৰিলে এখন পৃষ্ঠাক দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা হিছাপে গণ্য কৰা হ’ব ।",
+'disambiguations-text' => "তলৰ পৃষ্ঠাখনসমূহত অন্ততঃ এটা হ'লেই '''দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা'''ৰ সংযোগ আছে
+তাৰ à¦¸à¦²à¦¨à¦¿ à¦¸à§\87à¦\87বà§\8bৰত à¦\89পযà§\81à¦\95à§\8dত à¦ªà§\83ষà§\8dঠাৰ à¦²à¦\97ত à¦¸à¦\82যà§\8bà¦\97 à¦¥à¦¾à¦\95িব à¦ªà¦¾à§°à§\87
+[[MediaWiki:Disambiguationspage]]ৰ পৰা সংযোগ থকা কোনো সাঁচ ব্যৱহাৰ কৰিলে এখন পৃষ্ঠাক দ্ব্যৰ্থতা দূৰীকৰণ পৃষ্ঠা হিছাপে গণ্য কৰা হয়।",
 
 'doubleredirects' => 'দ্বি-পুনঃনিৰ্দেশিত',
 'doubleredirectstext' => 'আন পুনৰ্নিদেশনা পৃষ্ঠালৈ পুনৰ্নিৰ্দেশিত পৃষ্ঠাসমূহ এই তালিকাত দিয়া হৈছে ।
@@ -1970,6 +1989,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|বাইট|বাইট}}',
 'ncategories' => '$1টা {{PLURAL:$1|শ্ৰেণী|শ্ৰেণী}}',
+'ninterwikis' => '$1 {{PLURAL:$1|ইণ্টাৰৱিকি|ইণ্টাৰৱিকিসমূহ}}',
 'nlinks' => '$1 {{PLURAL:$1|সংযোগ|সংযোগ}}',
 'nmembers' => '{{PLURAL:$1|সদস্য|$1 সদস্যবৃন্দ}}',
 'nrevisions' => '$1টা {{PLURAL:$1|সংশোধন|সংশোধন}}',
@@ -1998,6 +2018,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'mostlinkedtemplates' => 'সৰ্বোচ্চ সংযোজিত সাঁচসমূহ',
 'mostcategories' => 'সৰ্বোচ্চ শ্ৰেণীসমৃদ্ধ প্ৰবন্ধসমূহ',
 'mostimages' => 'সৰ্বোচ্চ সংযোজিত ফাইলসমূহ',
+'mostinterwikis' => 'সৰ্বোচ্চ আন্তঃৱিকিসমৃদ্ধ পৃষ্ঠাসমূহ',
 'mostrevisions' => 'অধিকবাৰ সম্পাদনা কৰা পৃষ্ঠাসমূহ',
 'prefixindex' => 'উপসৰ্গসহ সকলো পৃষ্ঠা',
 'prefixindex-namespace' => 'উপসৰ্গ ($1 namespace) -ৰ সৈতে সকলো পৃষ্ঠা',
@@ -2018,7 +2039,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 'listusers-creationsort' => 'সৃষ্টিৰ তাৰিখমতে সজাওক',
 'usereditcount' => '$1 {{PLURAL:$1|টা সম্পাদনা|টা সম্পাদনা}}',
 'usercreated' => '$1 তাৰিখে $2 সময়ত {{GENDER:$3|য়ে সৃষ্টি কৰিছে}}',
-'newpages' => 'নতুন পৃষ্ঠা',
+'newpages' => 'নতুন পৃষ্ঠাসমূহ',
 'newpages-username' => 'সদস্যনাম:',
 'ancientpages' => 'আটাইতকৈ পুৰণি পৃষ্ঠাসমূহ',
 'move' => 'স্থানান্তৰ কৰক',
@@ -2143,6 +2164,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|আপোনাৰ সদস্য পছন্দসমূহ]]ত প্ৰৱেশ কৰা ই-মেইল ঠিকনাটো প্ৰেৰকৰ ঠিকনা হিছাপে দেখা যাব, যাতে মেইলৰ প্ৰাপকে আপোনাক উত্তৰ দিব পাৰে ।',
@@ -2212,11 +2235,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization চাওক।",
 
 'enotif_mailer' => '{{SITENAME}} জাননী ই-পত্ৰ প্ৰেৰক',
 'enotif_reset' => 'সকলো পৃষ্ঠা পৰিদৰ্শিত বুলি চিহ্নিত কৰক',
-'enotif_newpagetext' => 'এইখন এখন নতুন পৃষ্ঠা।',
 'enotif_impersonal_salutation' => '{{SITENAME}} সদস্য',
-'changed' => 'সলোৱা হৈছে',
-'created' => 'সৃষ্টি কৰা হ’ল',
-'enotif_subject' => '{{SITENAME}}ৰ $PAGETITLE পৃষ্ঠাখন $PAGEEDITORৰ দ্বাৰা $CHANGEDORCREATED',
 'enotif_lastvisited' => 'আপোনাৰ শেষ পৰিদৰ্শনৰ পিছত হোৱা সকলো সালসলনিৰ বাবে $1 চাওক ।',
 'enotif_lastdiff' => 'এই পৰিৱৰ্তনটো চাবৰ বাবে $1 চাওক ।',
 'enotif_anon_editor' => 'বেনামী সদস্য $1',
@@ -2289,6 +2308,8 @@ $UNWATCHURL
 'rollback' => 'সম্পাদনা পূৰ্ববৎ কৰক',
 'rollback_short' => 'পূৰ্ববৎ কৰক',
 'rollbacklink' => 'পূৰ্ববৎ কৰক',
+'rollbacklinkcount' => '$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনাসমূহ}} পূৰ্বৱত কৰক',
+'rollbacklinkcount-morethan' => '$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনাসমূহ}} পূৰ্বৱত কৰক',
 'rollbackfailed' => 'পূৰ্ববৎ ব্যৰ্থ',
 'cantrollback' => 'পূৰ্বৰ অৱস্থালৈ ঘূৰাই নিব নোৱাৰি;
 শেষৰ সম্পাদকজন এই পৃষ্ঠাৰ একমাত্ৰ লেখক ।',
@@ -2335,9 +2356,9 @@ $UNWATCHURL
 '''$1''' পৃষ্ঠাখনৰ সুৰক্ষা-স্তৰৰ গাঁথনি ইয়াত আছে:",
 'protect-cascadeon' => 'এই পৃষ্ঠাখন বৰ্তমান সুৰক্ষিত কাৰণ ই {{PLURAL:$1|খন পৃষ্ঠাৰ|খন পৃষ্ঠাৰ}} অন্তৰ্গত য’ত প্ৰপাতাকাৰ সুৰক্ষা সক্ৰিয় ।
 আপুনি এই পৃষ্ঠাৰ সুৰক্ষা স্তৰ সলাব পাৰে কিন্তু সি প্ৰপাতাকাৰ সুৰক্ষাত কোনো প্ৰভাৱ নেপেলায ।',
-'protect-default' => 'সà¦\95লà§\8b à¦¬à§\8dযবহাৰà¦\95াৰà§\80à¦\95 à¦\85নà§\81মতি à¦¦à¦¿à¦¯à¦¼à¦\95',
+'protect-default' => 'সà¦\95লà§\8b à¦¬à§\8dযৱহাৰà¦\95াৰà§\80ৰ à¦¬à¦¾à¦¬à§\87',
 'protect-fallback' => '"$1" অনুমতি লাগিব',
-'protect-level-autoconfirmed' => 'নতà§\81ন à¦¬à¦¾ à¦¨à¦¥à¦¿à¦­à§\81à¦\95à§\8dত à¦¨à§\8bহà§\8bৱা à¦¸à¦¦à¦¸à§\8dযà¦\95 à¦¬à¦¾à§°à¦£ à¦\95ৰà¦\95',
+'protect-level-autoconfirmed' => 'নতà§\81ন à¦¬à¦¾ à¦\85পà¦\9eà§\8dà¦\9cà§\80ভà§\81à¦\95à§\8dত à¦¸à¦¦à¦¸à§\8dযà¦\95 à¦\85ৱৰà§\8bধ',
 'protect-level-sysop' => 'কেৱল প্ৰশাসকবৃন্দৰ বাবে',
 'protect-summary-cascade' => 'প্ৰপাতাকাৰ/কেচ্‌কেডিং',
 'protect-expiring' => ' $1 (UTC) ত সময় শেষ হব',
@@ -2405,8 +2426,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|১টা সংশোধন|$1টা সংশোধন}} পুনৰুদ্ধাৰ কৰা হৈছে',
 'undeletedrevisions-files' => '{{PLURAL:$1|১টা সংশোধন|$1 টা সংশোধন}} আৰু {{PLURAL:$2|১ খন নথি|$2 খন নথি}} পুনৰুদ্ধাৰ কৰা হ’ল',
 'undeletedfiles' => '{{PLURAL:$1|১খন নথি|$1 খন নথি}} পুনৰুদ্ধাৰ কৰা হ’ল',
-'cannotundelete' => 'à¦\85ৱলà§\81পà§\8dতি বিফল হৈছে;
-আন কোনোবাই আগতেই ইয়াক বিলোপ কৰিছে ।',
+'cannotundelete' => 'বিলà§\8bপ à¦¬à¦¾à¦¤à¦¿à¦²à¦\95ৰণ বিফল হৈছে;
+$1',
 'undeletedpage' => "'''$1ক পুনৰুদ্ধাৰ কৰা হৈছে'''
 অনুগ্ৰহ কৰি শেহতীয়া অৱলুপ্তি আৰু পুনৰুদ্ধাৰৰ বাবে [[Special:Log/delete|অৱলুপ্তি অভিলেখ]] চাওক ।",
 'undelete-header' => 'শেহতীয়াকৈ বিলোপ কৰা পৃষ্ঠাসমূহৰ বাবে [[Special:Log/delete|অৱলুপ্তি ল’গ]] চাওক ।',
@@ -2795,6 +2816,7 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'import-interwiki-templates' => 'সকলো সাঁচ অন্তৰ্ভুক্ত কৰক',
 'import-interwiki-submit' => 'আমদানি',
 'import-interwiki-namespace' => 'গন্তব্য নামস্থান:',
+'import-interwiki-rootpage' => 'গন্তব্য মূল পৃষ্ঠা (বৈকল্পিক):',
 'import-upload-filename' => 'নথিৰ নাম:',
 'import-comment' => 'মন্তব্য:',
 'importtext' => "অনুগ্ৰহ কৰি [[Special:Export|ৰপ্তানি সুবিধা]] ব্যৱহাৰ কৰি উৎস ৱিকিৰ পৰা ফাইলটো ৰপ্তানি কৰক।
@@ -2831,6 +2853,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' => 'আমদানিৰ অভিলেখ',
@@ -2842,7 +2867,6 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 
 # JavaScriptTest
 'javascripttest' => 'জাভাস্ক্ৰিপ্ট পৰীক্ষা।',
-'javascripttest-disabled' => 'এই ৱিকিত এই কাৰ্যটো সক্ৰিয় কৰা হোৱা নাই।',
 'javascripttest-title' => '$1 পৰীক্ষাসমূহ চলোৱা হৈছে',
 'javascripttest-pagetext-noframework' => 'এই পৃষ্ঠাখন জাভালিপি পৰীক্ষা চলোৱাৰ বাবে সংৰক্ষিত।',
 'javascripttest-pagetext-unknownframework' => 'অজ্ঞাত সম্পৰীক্ষা ফ্ৰেমৱৰ্ক "$1"।',
@@ -2880,9 +2904,9 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 'tooltip-p-logo' => 'বেটুপাত খুলিবৰ কাৰণে',
 'tooltip-n-mainpage' => 'বেটুপাত খুলিবৰ কাৰণে',
 'tooltip-n-mainpage-description' => 'প্ৰথম পৃষ্ঠা পৰিদৰ্শন কৰক',
-'tooltip-n-portal' => 'ৱিà¦\95িপিডিয়া à¦¬à§\8dৰাà¦\93à¦\9c à¦\95ৰিবলà§\88',
+'tooltip-n-portal' => 'ৱিà¦\95িপিডিয়া à¦¸à¦\82à¦\95à§\8dৰানà§\8dতà§\80য় à¦\97à§\81ৰà§\81তà§\8dবপà§\82ৰà§\8dণ à¦\86লà§\8bà¦\9aনা à¦\95à¦\95à§\8dষ',
 'tooltip-n-currentevents' => 'সাম্প্ৰতিক ঘটনাৱলীৰ পটভূমি',
-'tooltip-n-recentchanges' => 'শà§\87হতà§\80য়া à¦¸à¦¾à¦²à¦¸à¦²à¦¨à¦¿à¦¸à¦®à§\82হৰ à¦¸à§\82à¦\9aà§\80',
+'tooltip-n-recentchanges' => 'à¦\85সমà§\80য়া à§±à¦¿à¦\95িপিডিয়াত à¦¹à§\8bৱা à¦¶à§\87হতà§\80য়া à¦¸à¦¾à¦²à¦¸à¦²à¦¨à¦¿à¦¸à¦®à§\82হ à¦\9aাà¦\93à¦\95',
 'tooltip-n-randompage' => 'অ-পূৰ্বনিৰ্ধাৰিতভাবে যিকোনো এটা পৃষ্ঠা দেখুৱাবৰ কাৰণে',
 'tooltip-n-help' => 'সহায়ৰ বাবে ইয়াত ক্লিক কৰক',
 'tooltip-t-whatlinkshere' => 'ইয়ালৈ সংযোজিত সকলো পৃষ্ঠাৰ সুচী',
@@ -2947,11 +2971,42 @@ $1ৰ অৱৰোধৰ কাৰণ: "$2"',
 
 # Info page
 'pageinfo-title' => '"$1" ৰ তথ্য',
-'pageinfo-header-edits' => 'সম্পাদনাসমূহ',
+'pageinfo-not-current' => "কেৱল সাম্প্ৰতিক সংশোধনৰ বাবে তথ্য দৃশ্যমান হ'ব পাৰে।",
+'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-watchers' => 'নিৰীক্ষকৰ সংখ্যা',
-'pageinfo-edits' => 'সম্পাদনাৰ সংখ্যা',
-'pageinfo-authors' => 'মুখ্য লেখকৰ সংখ্যা',
+'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-magic-words' => 'যাদুকৰী {{PLURAL:$1|শব্দ|শব্দবোৰ}} ($1)',
+'pageinfo-hidden-categories' => 'অদৃশ্য {{PLURAL:$1|শ্ৰেণী|শ্ৰেণীসমূহ}} ($1)',
+'pageinfo-templates' => 'সংযুক্ত {{PLURAL:$1|সাঁচ|সাঁচসমূহ}} ($1)',
+'pageinfo-toolboxlink' => 'পৃষ্ঠাখনৰ বিষয়ে তথ্য',
+'pageinfo-redirectsto' => 'পুনৰ্নিৰ্দেশ কৰা হৈছে',
+'pageinfo-redirectsto-info' => 'তথ্য',
+'pageinfo-contentpage' => 'সমল পৃষ্ঠাৰূপে গণনা কৰা হৈছে',
+'pageinfo-contentpage-yes' => 'হয়',
+'pageinfo-protect-cascading' => 'সুৰক্ষাসমূহ ইয়াৰ পৰা প্ৰপাতাকাৰ হৈছে',
+'pageinfo-protect-cascading-yes' => 'হয়',
+'pageinfo-protect-cascading-from' => 'সুৰক্ষাসমূহ প্ৰপাতাকাৰ হৈছে',
 
 # Patrolling
 'markaspatrolleddiff' => 'নিৰীক্ষিত বুলি চিহ্নিত কৰক',
@@ -2995,6 +3050,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 পিক্সেলসমূহ, নথিপত্ৰৰ আকাৰ: $3, MIME ধৰণ: $4, $5 {{PLURAL:$5|page|pages}}',
 '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।",
@@ -3004,6 +3060,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' => 'নতুন ফাইলৰ বিথীকা',
@@ -3023,6 +3081,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 ঘন্টা|$1 ঘন্টা}}',
 'days' => '{{PLURAL:$1|$1 দিন|$1 দিন}}',
 'ago' => '$1 আগেয়ে',
+'just-now' => 'এইমাত্ৰ',
 
 # Bad image list
 'bad_image_list' => 'The format is as follows:
@@ -3524,6 +3583,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[আন্তঃৱিকি আন্তঃভুক্তি নিষ্ক্ৰিয় কৰা আছে]',
 'scarytranscludefailed' => '[$1ৰ বাবে সাঁচ অনা অসফল হৈছে]',
+'scarytranscludefailed-httpstatus' => '[$1ৰ বাবে সাঁচ অনা অসফল হৈছে: HTTP $2]',
 'scarytranscludetoolong' => '[URL অত্যাধিক দীঘল]',
 
 # Delete conflict
@@ -3675,7 +3735,7 @@ $5
 * <span class="mw-specialpagecached">কেশ্ব কৰা বিশেষ পৃষ্ঠাসমূহ (অপ্ৰচলিতও হ\'ব পাৰে)।</span>',
 'specialpages-group-maintenance' => 'তত্বাৱধানৰ কাৰ্যবিৱৰণীসমূহ',
 'specialpages-group-other' => 'অন্যান্য বিশেষ পৃষ্ঠাসমূহ',
-'specialpages-group-login' => 'পà§\8dৰৱà§\87শ/সদসà§\8dযভà§\81à¦\95à§\8dতি',
+'specialpages-group-login' => 'পà§\8dৰৱà§\87শ/à¦\8fà¦\95াà¦\89ণà§\8dà¦\9f à¦¸à§\83ষà§\8dà¦\9fি à¦\95ৰà¦\95',
 'specialpages-group-changes' => 'সাম্প্ৰতিক সালসলনি আৰু অভিলেখসমূহ',
 'specialpages-group-media' => "মিডিয়া বিৱৰণী আৰু আপল'ডসমূহ",
 'specialpages-group-users' => 'সদস্যবৃন্দ আৰু অধিকাৰসমূহ',
@@ -3799,6 +3859,10 @@ $5
 'feedback-bugcheck' => 'অতি উত্তম! কেৱল পৰীক্ষা কৰক যে ই ইতিমধ্যে [$1 জ্ঞাত বাগসমূহ]ৰ এটা নহয়।',
 'feedback-bugnew' => 'মই পৰীক্ষা কৰিলো। এটা নতুন বাগ সংবাদন কৰক',
 
+# Search suggestions
+'searchsuggest-search' => 'সন্ধান কৰক',
+'searchsuggest-containing' => 'যি আছে...',
+
 # API errors
 'api-error-badaccess-groups' => "এই ৱিকিত ফাইল আপল'ড কৰিবলৈ আপোনাৰ অনুমতি নাই।",
 'api-error-badtoken' => 'আভ্যন্তৰীণ ত্ৰুটি: ভুল টোকেন।',
@@ -3815,7 +3879,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-banned-type' => '$1 {{PLURAL:$4|অনুমোদিত ফাইল প্ৰকাৰ নহয়|সমূহ অনুমোদিত ফাইল প্ৰকাৰ নহয়}}। অনুমোদিত {{PLURAL:$3|ফাইল প্ৰকাৰ হ’ল|ফাইল প্ৰকাৰসমূহ হ’ল}} $2।',
 'api-error-filetype-missing' => 'ফাইল নামটোত এক্সটেন্‌ছন নাই।',
 'api-error-hookaborted' => 'আপুনি কৰিব বিচৰা সালসলনি এটা এক্সটেনচনৰ দ্বাৰা বাতিল কৰা হৈছে।',
 'api-error-http' => "আভ্যন্তৰীণ ত্ৰুটি: চাৰ্ভাৰৰ লগত সংযোগ স্থাপন নহ'ল।",
index c0e7226..e856159 100644 (file)
@@ -107,7 +107,7 @@ $messages = array(
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
-'underline-default' => 'Restolador por defeutu',
+'underline-default' => 'Predeterminao del aspeutu o del restolador',
 
 # Font style option in Special:Preferences
 'editfont-style' => "Estilu de fonte de l'área d'edición:",
@@ -192,8 +192,8 @@ $messages = array(
 'newwindow' => '(ábrese nuna ventana nueva)',
 'cancel' => 'Encaboxar',
 'moredotdotdot' => 'Más...',
-'mypage' => 'La mio páxina',
-'mytalk' => 'El mio alderique',
+'mypage' => 'Páxina',
+'mytalk' => 'Alderique',
 'anontalk' => 'Alderique pa esta IP',
 'navigation' => 'Navegación',
 'and' => '&#32;y',
@@ -203,7 +203,6 @@ $messages = array(
 'qbbrowse' => 'Restolar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta páxina',
-'qbpageinfo' => 'Contestu',
 'qbmyoptions' => 'Les mios páxines',
 'qbspecialpages' => 'Páxines especiales',
 'faq' => 'EMF (entrugues más frecuentes)',
@@ -216,7 +215,7 @@ $messages = array(
 'vector-action-protect' => 'Protexer',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Camudar la proteición',
-'vector-simplesearch-preference' => 'Activar suxerencies meyoraes de gueta (namái apariencia Vector)',
+'vector-simplesearch-preference' => 'Activar la barra de gueta simplificada (namái apariencia Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver historial',
@@ -226,6 +225,7 @@ $messages = array(
 'namespaces' => 'Espacios de nome',
 'variants' => 'Variantes',
 
+'navigation-heading' => 'Menú de navegación',
 'errorpagetitle' => 'Error',
 'returnto' => 'Tornar a $1.',
 'tagline' => 'De {{SITENAME}}',
@@ -436,13 +436,14 @@ Consulta: $2',
 'actionthrottled' => 'Aición llendada',
 'actionthrottledtext' => 'Como midida anti-spam, nun se pue repetir esta aición munches vegaes en pocu tiempu, y trespasasti esi llímite.
 Por favor vuelvi intentalo nunos minutos.',
-'protectedpagetext' => 'Esta páxina ta candada pa torgar la so edición.',
+'protectedpagetext' => 'Esta páxina ta candada pa torgar ediciones y otres aiciones.',
 'viewsourcetext' => "Pues ver y copiar la fonte d'esta páxina:",
 'viewyourtext' => "Pues ver y copiar la fonte de '''les tos ediciones''' d'esta páxina:",
-'protectedinterface' => "Esta páxina proporciona testu d'interfaz de l'aplicación, y ta candada pa torgar abusos.",
-'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu d'interfaz de l'aplicación.
-Los cambeos nesta páxina van afeutar l'apariencia de la interfaz pa otros usuarios.
-Si quies facer traducciones, por favor usa [//translatewiki.net/wiki/Main_Page?setlang=ast translatewiki.net], el proyeutu de traducción de MediaWiki.",
+'protectedinterface' => "Esta páxina proporciona'l testu de la interfaz del software d'esta wiki, y ta candada pa torgar abusos.
+P'amestar o cambiar les traducciones de toles wikis, por favor usa [//translatewiki.net/translatewiki.net], el proyeutu de llocalización de MediaWiki.",
+'editinginterface' => "'''Avisu:''' Tas editando una páxina que s'usa pa proporcionar el testu d'interfaz del programa.
+Los cambeos nesta páxina van afeutar l'apariencia de la interfaz pa otros usuarios d'esta wiki.
+P'amestar o camudar traducciones pa toles wikis, por favor, usa [//translatewiki.net/ translatewiki.net], el proyeutu de traducción de MediaWiki.",
 'sqlhidden' => '(consulta SQL anubrida)',
 'cascadeprotected' => "Esta páxina ta protexida d'ediciones porque ta enxerta {{PLURAL:$1|na siguiente páxina|nes siguientes páxines}}, que {{PLURAL:$1|ta protexida|tán protexíes}} cola opción «en cascada» activada:
 $2",
@@ -468,10 +469,10 @@ L'alministrador que lu bloquió dio esti motivu: «$3».",
 # Login and logout pages
 'logouttext' => "'''Agora tas desconeutáu.'''
 
-Pues siguir usando {{SITENAME}} de forma anónima, o pues [[Special:UserLogin|volver entrar]] como'l mesmu o como otru usuariu.
+Pues siguir usando {{SITENAME}} de forma anónima, o pues <span class='plainlinks'>[$1 volver entrar]</span> como'l mesmu o como otru usuariu.
 Ten en cuenta que dalgunes páxines puen siguir apaeciendo como si tovía tuvieres coneutáu, hasta que llimpies la caché del restolador.",
-'welcomecreation' => "== ¡Bienllegáu, $1! ==
-Creóse la to cuenta.
+'welcomeuser' => '¡Afayati, $1!',
+'welcomecreation-msg' => "Creóse la to cuenta.
 Nun t'escaezas d'escoyer les tos [[Special:Preferences|preferencies de {{SITENAME}}]].",
 'yourname' => "Nome d'usuariu:",
 'yourpassword' => 'Clave:',
@@ -747,8 +748,7 @@ Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres pá
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos],
 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>.',
+Pues [[Special:Search/{{PAGENAME}}|guetar esti títulu de páxina]] n\'otres páxines o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} guetar los rexistros rellacionaos]</span>, pero nun tienes permisu pa crear esta páxina.',
 '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ó.
@@ -779,7 +779,7 @@ Les páxines personalizaes .css y .js usen un títulu en minúscules, p. ex. {{n
 'note' => "'''Nota:'''",
 'previewnote' => "'''Alcuerdate de qu'esto ye sólo una vista previa.'''
 ¡Los cambios entá nun se guardaron!",
-'continue-editing' => 'Siguir editando',
+'continue-editing' => "Dir al área d'edición",
 'previewconflict' => "Esta vista previa amuesa'l testu del área d'edición d'arriba tal como apaecerá si escueyes guardar.",
 'session_fail_preview' => "'''¡Sentímoslo muncho! Nun se pudo procesar la to edición porque hebo una perda de datos de la sesión.
 Inténtalo otra vuelta. Si nun se t'arregla, intenta salir y volver a rexistrate.'''",
@@ -858,6 +858,15 @@ Paez que se desanició.',
 'edit-already-exists' => 'Nun se pudo crear una páxina nueva.
 Yá esiste.',
 'defaultmessagetext' => 'Testu predetermináu',
+'content-failed-to-parse' => 'Fallu al analizar el conteníu $2 pal modelu $1: $3',
+'invalid-content-data' => 'Datos del conteníu inválidos',
+'content-not-allowed-here' => 'El conteníu «$1» nun se permite na páxina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'testu wiki',
+'content-model-text' => 'testu simple',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Avisu:''' Esta páxina contién demasiaes llamaes costoses a funciones d'análisis sintáuticu.
@@ -1114,8 +1123,6 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 'search-interwiki-caption' => 'Proyeutos hermanos',
 'search-interwiki-default' => '$1 resultaos:',
 'search-interwiki-more' => '(más)',
-'search-mwsuggest-enabled' => 'con suxerencies',
-'search-mwsuggest-disabled' => 'ensin suxerencies',
 'search-relatedarticle' => 'Rellacionáu',
 'mwsuggest-disable' => 'Desactivar les suxerencies AJAX',
 'searcheverything-enable' => 'Buscar en tolos espacios de nome',
@@ -1148,7 +1155,7 @@ Se puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FU
 
 # Preferences page
 'preferences' => 'Preferencies',
-'mypreferences' => 'Les mios preferencies',
+'mypreferences' => 'Preferencies',
 'prefs-edits' => "Númberu d'ediciones:",
 'prefsnologin' => 'Non identificáu',
 'prefsnologintext' => 'Necesites tar <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} identificáu]</span> pa camudar les preferencies d\'usuariu.',
@@ -1211,7 +1218,7 @@ Equí tienes un valor al debalu que pues usar: $1",
 'timezoneregion-indian' => 'Océanu Índicu',
 'timezoneregion-pacific' => 'Océanu Pacíficu',
 'allowemail' => 'Dexar a los otros usuarios mandate correos',
-'prefs-searchoptions' => 'Opciones de busca',
+'prefs-searchoptions' => 'Guetar',
 'prefs-namespaces' => 'Espacios de nome',
 'defaultns' => "D'otra miente, guetar nestos espacios de nome:",
 'default' => 'predetermináu',
@@ -1380,6 +1387,9 @@ Esta información sedrá pública.",
 'rightslogtext' => "Esti ye un rexistru de los cambeos de los perfiles d'usuariu.",
 'rightslogentry' => 'camudó la pertenencia de grupu del usuariu $1 dende $2 a $3',
 'rightslogentry-autopromote' => 'promocionó automáticamente de $2 a $3',
+'logentry-rights-rights' => '$1 camudó la pertenencia a grupos de $3 dende $4 a $5',
+'logentry-rights-rights-legacy' => '$1 camudó la pertenencia a grupos de $3',
+'logentry-rights-autopromote' => '$1 promocionó automáticamente de $4 a $5',
 'rightsnone' => '(nengún)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1630,6 +1640,7 @@ Si'l problema persiste, contauta con un [[Special:ListUsers/sysop|alministrador]
 'backend-fail-notsame' => 'Yá esiste un ficheru non idénticu en $1.',
 'backend-fail-invalidpath' => "$1 nun ye una ruta d'almacenamientu válida.",
 'backend-fail-delete' => 'Nun se pudo desaniciar el ficheru $1.',
+'backend-fail-describe' => 'Nun se pudieron camudar los metadatos del ficheru "$1".',
 'backend-fail-alreadyexists' => 'El ficheru $1 yá esiste.',
 'backend-fail-store' => 'Nun se pudo guardar el ficheru $1 en $2.',
 'backend-fail-copy' => 'Nun se pudo copiar el ficheru $1 como $2.',
@@ -1646,7 +1657,7 @@ Si'l problema persiste, contauta con un [[Special:ListUsers/sysop|alministrador]
 'backend-fail-internal' => 'Hebo un fallu desconocíu nel motor d\'almacenamientu "$1".',
 'backend-fail-contenttype' => 'Non se pudo determinar la triba de conteníu de ficheru a guardar en "$1".',
 'backend-fail-batchsize' => "El motor d'almacenamientu dio un llote de $1 {{PLURAL:$1|operación|operaciones}} en ficheros; el llímite ye de $2 {{PLURAL:$2|operación|operaciones}}.",
-'backend-fail-usable' => 'Nun se pudo escribir el ficheru $1 porque nun hai permisos bastantes o falten los direutorios/contenedores.',
+'backend-fail-usable' => 'Nun se pudo llee o escribir el ficheru «$1» porque nun hai permisos bastantes o falten los direutorios/contenedores.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Nun se pudo coneutar cola base de datos del diariu pal sofitu d\'almacenamientu "$1".',
@@ -1779,7 +1790,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.',
+'upload-disallowed-here' => 'Nun pues sobrescribir esti ficheru.',
 
 # File reversion
 'filerevert' => 'Revertir $1',
@@ -2015,7 +2026,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: <code>$1</code> (nun amiestes dengún d\'estos na to gueta).',
+Protocolos almitíos: <code>$1</code> (el predetermináu ye http:// si nun se conseña dengún protocolu).',
 'linksearch-line' => '$1 enllaciáu dende $2',
 'linksearch-error' => 'Los comodinos namái puen apaecer al entamu del nome del güéspede.',
 
@@ -2066,8 +2077,8 @@ pa poder unviar correos a otros usuarios.',
 '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.",
+'emailpagetext' => 'Pues usar el formulariu de más abaxo pa unviar un corréu electrónicu a {{GENDER:$1|esti usuariu|esta usuaria}}.
+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:",
 'defemailsubject' => 'Corréu electrónicu del usuariu «$1» de {{SITENAME}}',
 'usermaildisabled' => 'Corréu del usuariu desactiváu',
@@ -2098,7 +2109,7 @@ La direición de corréu electrónicu qu'especificasti nes [[Special:Preferences
 
 # Watchlist
 'watchlist' => 'La mio páxina de vixilancia',
-'mywatchlist' => 'La mio llista de vixilancia',
+'mywatchlist' => 'Llista de vixilancia',
 'watchlistfor2' => 'Pa $1 $2',
 'nowatchlist' => 'La to llista de vixilancia ta vacia.',
 'watchlistanontext' => 'Por favor $1 pa ver o editar entraes na to llista de vixilancia.',
@@ -2135,24 +2146,27 @@ Si más tarde quies quitala de la llista de vixilancia calca en "Dexar de vixila
 
 'enotif_mailer' => 'Notificación de corréu de {{SITENAME}}',
 'enotif_reset' => 'Marcar toles páxines visitaes',
-'enotif_newpagetext' => 'Esta ye una páxina nueva.',
 'enotif_impersonal_salutation' => 'Usuariu de {{SITENAME}}',
-'changed' => 'camudada',
-'created' => 'creada',
-'enotif_subject' => 'La páxina de {{SITENAME}} $PAGETITLE foi $CHANGEDORCREATED por $PAGEEDITOR',
+'enotif_subject_deleted' => '{{GENDER:$2|$2}} desanició la páxina «$1» de {{SITENAME}}',
+'enotif_subject_created' => '{{GENDER:$2|$2}} creó la páxina «$1» de {{SITENAME}}',
+'enotif_subject_moved' => '{{GENDER:$2|$2}} treslladó la páxina «$1» de {{SITENAME}}',
+'enotif_subject_restored' => '{{GENDER:$2|$2}} restauró la páxina «$1» de {{SITENAME}}',
+'enotif_subject_changed' => '{{GENDER:$2|$2}} camudó la páxina «$1» de {{SITENAME}}',
+'enotif_body_intro_deleted' => '{{GENDER:$2|$2}} desanició la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
+'enotif_body_intro_created' => '{{GENDER:$2|$2}} creó la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
+'enotif_body_intro_moved' => '{{GENDER:$2|$2}} treslladó la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
+'enotif_body_intro_restored' => '{{GENDER:$2|$2}} restauró la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
+'enotif_body_intro_changed' => '{{GENDER:$2|$2}} camudó la páxina «$1» de {{SITENAME}} el $PAGEEDITDATE, consulta $3 pa ver la revisión actual.',
 'enotif_lastvisited' => 'Mira en $1 pa ver tolos cambios dende la cabera visita.',
 'enotif_lastdiff' => 'Mira en $1 pa ver esti cambéu.',
 'enotif_anon_editor' => 'usuariu anónimu $1',
 'enotif_body' => 'Estimáu $WATCHINGUSERNAME,
 
-
-La páxina de {{SITENAME}} $PAGETITLE foi $CHANGEDORCREATED el $PAGEEDITDATE por $PAGEEDITOR, mira $PAGETITLE_URL pa ver la versión actual.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Resume del editor: $PAGESUMMARY $PAGEMINOREDIT
 
-Ponte\'n contautu col editor:
+Ponte en contautu col editor:
 corréu: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
@@ -2326,7 +2340,8 @@ revisión fuera restaurada o eliminada del archivu.",
 'undeletedrevisions' => '{{PLURAL:$1|1 revisión restaurada|$1 revisiones restauraes}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 revisión|$1 revisiones}} y {{PLURAL:$2|1 archivu|$2 archivos}} restauraos',
 'undeletedfiles' => '{{PLURAL:$1|1 archivu restauráu|$1 archivos restauraos}}',
-'cannotundelete' => 'Falló la restauración; seique daquién yá restaurara la páxina enantes.',
+'cannotundelete' => 'Falló la restauración:
+$1',
 'undeletedpage' => "'''Restauróse $1'''
 
 Consulta'l [[Special:Log/delete|rexistru d'esborraos]] pa ver los esborraos y restauraciones de recién.",
@@ -2359,7 +2374,7 @@ $1",
 # Contributions
 'contributions' => 'Collaboraciones del usuariu',
 'contributions-title' => "Contribuciones d'usuariu pa $1",
-'mycontris' => 'Les mios collaboraciones',
+'mycontris' => 'Collaboraciones',
 'contribsub2' => 'De $1 ($2)',
 'nocontribs' => "Nun s'atoparon cambeos que coincidan con esi criteriu.",
 'uctop' => '(actual)',
@@ -2400,7 +2415,7 @@ La cabera entrada del rexistru de bloqueos s'ufre darréu pa referencia:",
 'whatlinkshere-hideredirs' => '$1 redireiciones',
 'whatlinkshere-hidetrans' => '$1 tresclusiones',
 'whatlinkshere-hidelinks' => '$1 enllaces',
-'whatlinkshere-hideimages' => "$1 enllaces d'imaxe",
+'whatlinkshere-hideimages' => '$1 los enllaces al ficheru',
 'whatlinkshere-filters' => 'Peñeres',
 
 # Block/unblock
@@ -2624,6 +2639,7 @@ La páxina de destín "[[:$1]]" yá esiste. ¿Quies esborrala pa dexar sitiu pal
 'immobile-target-namespace-iw' => "Nun puedes mover una páxina a un enllaz d'Interwiki.",
 'immobile-source-page' => 'Esta páxina nun ye treslladable.',
 'immobile-target-page' => 'Nun se pue treslladar a esi títulu de destín.',
+'bad-target-model' => 'El destín deseáu utiliza un modelu de conteníu diferente. Nun se pue convertir de $1 a $2.',
 'imagenocrossnamespace' => "Nun se pue treslladar una imaxe a nun espaciu de nomes que nun ye d'imáxenes",
 'nonfile-cannot-move-to-file' => 'Nun se pue treslladar más que ficheros al espaciu de nomes de ficheros',
 'imagetypemismatch' => 'La estensión nueva del archivu nun concueya cola so mena',
@@ -2753,7 +2769,6 @@ Guárdalu nel ordenador y xúbilu equí.",
 
 # JavaScriptTest
 'javascripttest' => 'Prueba de JavaScript',
-'javascripttest-disabled' => 'Esta función ta desactivada.',
 'javascripttest-title' => 'Executando pruebes de $1',
 'javascripttest-pagetext-noframework' => 'Esta páxina ta acutada pa executar pruebes de javascript.',
 'javascripttest-pagetext-unknownframework' => "L'entornu de pruebes «$1» ye desconocíu.",
@@ -2894,6 +2909,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 
 # Info page
 'pageinfo-title' => 'Información sobro "$1"',
+'pageinfo-not-current' => 'Sentimoslo, ye imposible dar esta información de les revisiones antigües.',
 'pageinfo-header-basic' => 'Información básica',
 'pageinfo-header-edits' => "Historial d'ediciones",
 'pageinfo-header-restrictions' => 'Proteición de páxina',
@@ -2902,6 +2918,7 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 '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-language' => 'Llingua del conteníu 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',
@@ -2918,10 +2935,17 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Información de la páxina',
+'pageinfo-redirectsto' => 'Redirixe a',
+'pageinfo-redirectsto-info' => 'información',
+'pageinfo-contentpage' => 'Contada como páxina de conteníu',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => "Les proteiciones s'activen en serie dende equí",
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => "Les proteiciones s'activen en serie dende",
 
 # Skin names
 'skinname-standard' => 'Clásicu',
@@ -2940,6 +2964,8 @@ Probablemente tea causao por un enllaz a un sitiu esternu de la llista prieta.',
 'markedaspatrollederror' => 'Nun se pue marcar como supervisada',
 'markedaspatrollederrortext' => 'Necesites conseñar una revisión pa marcala como supervisada.',
 'markedaspatrollederror-noautopatrol' => 'Nun tienes permisu pa marcar los cambios propios como supervisaos.',
+'markedaspatrollednotify' => 'Esti cambiu en $1 marcóse como revisáu.',
+'markedaspatrollederrornotify' => "Falló l'aición de marcar como revisáu.",
 
 # Patrol log
 'patrol-log-page' => 'Rexistru de supervisión',
@@ -3003,6 +3029,7 @@ Al executalu pues comprometer el to sistema.",
 'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
 'days' => '{{PLURAL:$1|$1 día|$1 díes}}',
 'ago' => 'hai $1',
+'just-now' => 'agora mesmo',
 
 # Bad image list
 'bad_image_list' => "El formatu ye'l que sigue:
@@ -3507,7 +3534,8 @@ Esti códigu de confirmación caduca\'l $4.',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[La tresclusión interwiki ta desactivada]',
-'scarytranscludefailed' => '[La obtención de la plantía falló pa $1]',
+'scarytranscludefailed' => '[Falló la recuperación de la plantía pa $1]',
+'scarytranscludefailed-httpstatus' => '[Falló la recuperación de la plantía pa $1: HTTP $2]',
 'scarytranscludetoolong' => '[La URL ye demasiao llarga]',
 
 # Delete conflict
@@ -3619,6 +3647,7 @@ Tamién pues [[Special:EditWatchlist|usar l'editor estándar]].",
 'version-license' => 'Llicencia',
 'version-poweredby-credits' => "Esta wiki funciona con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otros',
+'version-credits-summary' => 'Nos prestaría dar reconocimientu a les siguientes persones pola so contribución a [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki ye software llibre; pues redistribuilu y/o camudalu baxo los términos de la Llicencia Pública Xeneral GNU tal como ta asoleyada pola Free Software Foundation; o la versión 2 de la Llicencia, o (como prefieras) cualesquier versión posterior.
 
 MediaWiki se distribúi col envís de que seya afayadiza, pero ENSIN GARANTÍA DALA; ensin siquiera garantía implícita de COMERCIALIDÁ o ADAUTACIÓN A UN DETERMINÁU PROPÓSITU. Llee la Llicencia Pública Xeneral GNU pa más detalles.
@@ -3758,9 +3787,9 @@ Les imáxenes amuésense a resolución completa; les demás tribes d'archivu exe
 'logentry-move-move_redir-noredirect' => '$1 treslladó la páxina "$3" a "$4" sobre una redireición ensin dexar una redireición',
 'logentry-patrol-patrol' => '$1 marcó la revisión $4 de la páxina "$3" como patrullada',
 'logentry-patrol-patrol-auto' => '$1 marcó automaticamente la revisión $4 de la páxina "$3" como patrullada',
-'logentry-newusers-newusers' => "$1 creó una cuenta d'usuariu",
-'logentry-newusers-create' => "$1 creó una cuenta d'usuariu",
-'logentry-newusers-create2' => "$1 creó una cuenta d'usuariu $3",
+'logentry-newusers-newusers' => "Se creó la cuenta d'usuariu $1",
+'logentry-newusers-create' => "Se creó la cuenta d'usuariu $1",
+'logentry-newusers-create2' => "$1 creó la cuenta d'usuariu $3",
 'logentry-newusers-autocreate' => 'La cuenta $1 se creó automáticamente',
 'newuserlog-byemail' => 'conseña unviada per corréu electrónicu',
 
@@ -3780,6 +3809,10 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 'feedback-bugcheck' => '¡Perfeuto! Comprueba que nun tea yá ente los [$1 fallos conocíos].',
 'feedback-bugnew' => "Yá lo comprobé. Informar d'esti fallu nuevu",
 
+# Search suggestions
+'searchsuggest-search' => 'Guetar',
+'searchsuggest-containing' => 'que contién...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nun tienes permisu pa xubir ficheros a esta wiki.',
 'api-error-badtoken' => 'Fallu internu: token incorreutu.',
@@ -3832,4 +3865,6 @@ D\'otra miente, pues usar el formulariu cenciellu d\'abaxo. El to comentariu apa
 'duration-centuries' => '$1 {{PLURAL:$1|sieglu|sieglos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenios}}',
 
+# Unknown messages
+'svg-long-error' => 'Ficheru SVG inválidu: $1',
 );
index 5aa62c2..a75a86f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Avaric (Ð\90вар)
+/** Avaric (авар)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -18,35 +18,35 @@ $fallback = 'ru';
 
 $messages = array(
 # Dates
-'sunday'    => 'ГьатӀан',
-'monday'    => 'Итни',
-'tuesday'   => 'Талат',
+'sunday' => 'ГьатӀан',
+'monday' => 'Итни',
+'tuesday' => 'Талат',
 'wednesday' => 'АрбагӀ',
-'thursday'  => 'Хамиз',
-'friday'    => 'Рузман',
-'saturday'  => 'Шаммат',
+'thursday' => 'Хамиз',
+'friday' => 'Рузман',
+'saturday' => 'Шаммат',
 
 'mytalk' => 'Дур бахlс',
-'and'    => '&#32;ва',
+'and' => '&#32;ва',
 
-'errorpagetitle'   => 'Гъалатl',
-'help'             => 'Кумек',
-'history'          => 'Хиса-басазул тарих',
+'errorpagetitle' => 'Гъалатl',
+'help' => 'Кумек',
+'history' => 'Хиса-басазул тарих',
 'printableversion' => 'КутӀизе версия',
-'permalink'        => 'Кидаго букӀунеб рехсей',
-'edit'             => 'Хисизабе',
-'talkpage'         => 'Гьумералда тlасан бахlс',
-'talk'             => 'Бахlс',
-'toolbox'          => 'Алатал',
-'userpage'         => 'ГӀахьалчиясул гьумер',
-'otherlanguages'   => 'Цойги мацӀазда',
+'permalink' => 'Кидаго букӀунеб рехсей',
+'edit' => 'Хисизабе',
+'talkpage' => 'Гьумералда тlасан бахlс',
+'talk' => 'Бахlс',
+'toolbox' => 'Алатал',
+'userpage' => 'ГӀахьалчиясул гьумер',
+'otherlanguages' => 'Цойги мацӀазда',
 
 # 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).
-'currentevents'        => 'Жакъасел лъугьа-бахъинал',
-'mainpage'             => 'БетӀераб гьумер',
+'currentevents' => 'Жакъасел лъугьа-бахъинал',
+'mainpage' => 'БетӀераб гьумер',
 'mainpage-description' => 'БетӀераб гьумер',
-'portal'               => 'Майдан',
-'portal-url'           => 'Project:Майдан',
+'portal' => 'Майдан',
+'portal-url' => 'Project:Майдан',
 
 'editsection' => 'хисизабизе',
 
@@ -54,12 +54,12 @@ $messages = array(
 'nstab-help' => 'Кумек',
 
 # General errors
-'error'         => 'Гъалатl',
+'error' => 'Гъалатl',
 'internalerror' => 'Жанисеб гъалатl',
-'viewsource'    => 'Код бихьи',
+'viewsource' => 'Код бихьи',
 
 # Login and logout pages
-'userlogin'  => 'ЦIар бице',
+'userlogin' => 'ЦIар бице',
 'userlogout' => 'Къватlиве лъугьине',
 
 # Edit pages
@@ -67,27 +67,27 @@ $messages = array(
 
 # Preferences page
 'preferences' => 'Рекъезаби',
-'localtime'   => 'Бакlалъул заман',
+'localtime' => 'Бакlалъул заман',
 
 # User rights
 'userrights-user-editname' => 'ГӀахьалчиясул цӀар хъвай:',
 
 # Recent changes
-'recentchanges'   => 'ЦӀиял хиса-басал',
+'recentchanges' => 'ЦӀиял хиса-басал',
 'rcshowhideminor' => '$1 гӀиси-микъинал хиса-басал',
-'rcshowhidebots'  => '$1 бот',
-'rcshowhideliu'   => '$1 цӀар рагьарал гӀахьалчагӀи',
+'rcshowhidebots' => '$1 бот',
+'rcshowhideliu' => '$1 цӀар рагьарал гӀахьалчагӀи',
 'rcshowhideanons' => '$1 цӀаргьечӀ',
-'rcshowhidemine'  => '$1 дир хиса-басал',
-'diff'            => 'батӀалъи',
-'hide'            => 'Бахчизе',
-'show'            => 'Бихьизабизе',
+'rcshowhidemine' => '$1 дир хиса-басал',
+'diff' => 'батӀалъи',
+'hide' => 'Бахчизе',
+'show' => 'Бихьизабизе',
 'minoreditletter' => 'гӀ.-м.',
-'newpageletter'   => 'ЦӀ',
+'newpageletter' => 'ЦӀ',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Рухьарал хиса-басиял',
-'recentchangeslinked-feed'    => 'Рухьарал хиса-басиял',
+'recentchangeslinked' => 'Рухьарал хиса-басиял',
+'recentchangeslinked-feed' => 'Рухьарал хиса-басиял',
 'recentchangeslinked-toolbox' => 'Рухьарал хиса-басиял',
 
 # Upload
@@ -98,8 +98,8 @@ $messages = array(
 
 # Miscellaneous special pages
 'shortpages' => 'Къокъал макъалаби',
-'longpages'  => 'Кlудиял гьумерал',
-'listusers'  => 'Гlахьалчагlазул сияхl',
+'longpages' => 'Кlудиял гьумерал',
+'listusers' => 'Гlахьалчагlазул сияхl',
 
 # Special:Log
 'specialloguserlabel' => 'ГӀахьалчи:',
@@ -109,19 +109,19 @@ $messages = array(
 
 # Watchlist
 'watchlist' => 'Дур халгьабиялъул сияхl',
-'watch'     => 'хал гьабизе',
+'watch' => 'хал гьабизе',
 
 # Contributions
 'contributions' => 'ГӀахьалчиясул хӀалтӀи',
-'mycontris'     => 'Дур гlахьаллъи',
+'mycontris' => 'Дур гlахьаллъи',
 
 # What links here
 'whatlinkshere' => 'Рехсей гьанибе',
 
 # Move page
 'move-page-legend' => 'Гьумералъул цlар хисизе',
-'movearticle'      => 'Гьумералъул цӀар хисизе',
-'movepagebtn'      => 'Гьумералъул цlар хисизе',
+'movearticle' => 'Гьумералъул цӀар хисизе',
+'movepagebtn' => 'Гьумералъул цlар хисизе',
 
 # Special:SpecialPages
 'specialpages' => 'Хассал гьумерал',
index 15cdabe..e8c1654 100644 (file)
@@ -230,7 +230,6 @@ $messages = array(
 'qbbrowse' => 'Farura',
 'qbedit' => 'Betara',
 'qbpageoptions' => 'Ikatcuksbu',
-'qbpageinfo' => 'Givabu',
 'qbmyoptions' => 'Jinaf ikatcukseem',
 'qbspecialpages' => 'Aptaf bueem',
 'faq' => 'NEB',
@@ -445,8 +444,6 @@ Batdume : ''$2''.",
 # Login and logout pages
 'logouttext' => 'Rin daletoe til solgluyanaf.
 Rin va {{SITENAME}} yoltiskon ware rofavel oke, bifoton kan ar yolt, va int toldogluyal.',
-'welcomecreation' => '<h2>Til drumbaf, $1!</h2><p>Rinaf favesikpata su zo redur.
-Me vulkul da rupeson va "Lodamaceem" bu va intaf {{SITENAME}} rotuilkal.',
 'yourname' => 'Rinaf favesikyolt',
 'yourpassword' => 'Rinaf remravlem',
 'yourpasswordagain' => 'Va rinaf remravlem tolon bazel',
@@ -847,8 +844,6 @@ Ta ropasusu warzafu bu yo va [[Special:Search|aneyara ko wiki]] yawal.',
 'search-interwiki-caption' => 'Beraf abdumimakseem',
 'search-interwiki-default' => '$1 trasiks :',
 'search-interwiki-more' => '(loon)',
-'search-mwsuggest-enabled' => 'do tiavera',
-'search-mwsuggest-disabled' => 'meka tiavera',
 'search-relatedarticle' => 'Skedaf',
 'mwsuggest-disable' => 'Gritegirara va AJAX tiavera',
 'searcheverything-enable' => 'Aneyara ko koto yoltxo',
@@ -1495,11 +1490,7 @@ Ta sulara va batu bu div rinafi suzdasiki, koe grablexo va « Mea suzdá » vule
 
 'enotif_mailer' => '{{SITENAME}} Kowalzesi Staksasiki',
 'enotif_reset' => 'Va kotu woranu bu tcalar',
-'enotif_newpagetext' => 'Batcoba tir warzafu bu',
 'enotif_impersonal_salutation' => '{{SITENAME}} favesik',
-'changed' => 'betayan',
-'created' => 'reduyun',
-'enotif_subject' => '{{SITENAME}} bu $PAGETITLE su zo $CHANGEDORCREATED gan $PAGEEDITOR',
 'enotif_lastvisited' => 'Va $1 disukel ta da va kot betaks mali ironokafa worara wil.',
 'enotif_lastdiff' => 'Ta wira va bat betaks va $1 disukel.',
 'enotif_anon_editor' => '$1 yoltiskaf favesik',
index a5c3679..119c65b 100644 (file)
@@ -17,216 +17,215 @@ $fallback = 'es';
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'Sipita siqiraña',
-'tog-justify'                 => "Tanta amuyanak purapt'ayaña",
-'tog-hideminor'               => 'Jichha jaqukipawina sullka askiptawix imantaña',
-'tog-hidepatrolled'           => "Jichhnaki jaqukipawina askiptawix unch'ukita imantaña",
-'tog-newpageshidepatrolled'   => "Machaqa uñstawix waruchatat uñstawix unch'ukita imantaña",
-'tog-extendwatchlist'         => "Sarayawi jaqukipaw uñachayasuñatakiw unch'ukit waruch aqatatayaña",
-'tog-usenewrc'                => 'Jichhnaki jaqukipawi waliptäta (JavaScript munawiwa)',
-'tog-numberheadings'          => 'Titulun chinu achuraña',
-'tog-showtoolbar'             => 'Turkawit irnaqañ täta tisi uñachayaña (JavaScript munawiwa)',
-'tog-editondblclick'          => 'Uñstawi turkayaña päsuxuqiña (JavaScript munawiwa)',
-'tog-editsection'             => '[Turkaña] sipitampi tuqitaki turkawi luräña',
+'tog-underline' => 'Sipita siqiraña',
+'tog-justify' => "Tanta amuyanak purapt'ayaña",
+'tog-hideminor' => 'Jichha jaqukipawina sullka askiptawix imantaña',
+'tog-hidepatrolled' => "Jichhnaki jaqukipawina askiptawix unch'ukita imantaña",
+'tog-newpageshidepatrolled' => "Machaqa uñstawix waruchatat uñstawix unch'ukita imantaña",
+'tog-extendwatchlist' => "Sarayawi jaqukipaw uñachayasuñatakiw unch'ukit waruch aqatatayaña",
+'tog-usenewrc' => 'Jichhnaki jaqukipawi waliptäta (JavaScript munawiwa)',
+'tog-numberheadings' => 'Titulun chinu achuraña',
+'tog-showtoolbar' => 'Turkawit irnaqañ täta tisi uñachayaña (JavaScript munawiwa)',
+'tog-editondblclick' => 'Uñstawi turkayaña päsuxuqiña (JavaScript munawiwa)',
+'tog-editsection' => '[Turkaña] sipitampi tuqitaki turkawi luräña',
 'tog-editsectiononrightclick' => '(JavaScript munawiwa) titulxat tuqina kupi suxuqiñampi tuqitaki turkawi luräña',
-'tog-showtoc'                 => 'Waruchataw uñachayaña (kimsa tituljampi uñstawitaki)',
-'tog-rememberpassword'        => "Akax jasanchirin imt'awija amtaña (for a maximum of $1 {{PLURAL:$1|day|days}})",
-'tog-watchcreations'          => "Unch'ukit waruchatajana nayaxa uñstawix uñstayawajata yapxataña",
-'tog-watchdefault'            => "Unch'ukit waruchatajana nayaxa uñstawix turkajata yapxataña",
-'tog-watchmoves'              => "Unch'ukit waruchatajana nayaxa uñstawix sutiyarajata yapxataña",
-'tog-watchdeletion'           => "Unch'ukit waruchatajana nayaxa uñstawix phiskhurajata yapxataña",
-'tog-minordefault'            => 'Sullka askiptawpacha chimpuriña',
-'tog-previewontop'            => 'Askiptawit llataxa nayraxa uñtawikar uñachayaña',
-'tog-previewonfirst'          => 'Mayïri askiptawina uñtawikar uñachayaña',
-'tog-nocache'                 => "Uñstawita kachiñar jark'aña",
-'tog-enotifwatchlistpages'    => "Nayaru chaski jalayiriña ukja unch'ukit waruchatana mäuñstawi turkañäna",
-'tog-enotifusertalkpages'     => 'Nayaru chaski jalayiriña ukja tuqisiwit uñstawija turkañäna',
-'tog-enotifminoredits'        => 'Nayaru chaski jalayiriña uñstawina sullka askiptawimpiraki',
-'tog-enotifrevealaddr'        => 'Yatiyawita chaski jalayirinakana chaski jalayirit untjäwija uñachayaña',
-'tog-shownumberswatching'     => "Qawqha apnaqirinaka uñch'ukiskar uñacht'ayaña",
-'tog-fancysig'                => "Mayaxta rixt'a (sipitarachayatawisa)",
-'tog-externaleditor'          => "Anqa askiptiri mirq'iriña (yatxiritakiwa, jasanchirina ajalla jamuqawi wakiskiriwa)",
-'tog-externaldiff'            => "Anqa diff-iri mirq'iriña (yatxiritakiwa, jasanchirina ajalla jamuqawi wakiskiriwa)",
-'tog-showjumplinks'           => 'Usutataki sipitata "khänaru thuqtaña" uñachayaña',
-'tog-uselivepreview'          => "Uñtawikach'ukix mirq'iña (JavaScript munawiwa) (yant'awiwaki)",
-'tog-forceeditsummary'        => "Nayaru yatiyaña ukja ch'usa askiptawit juk'aptayawi apantaskaña",
-'tog-watchlisthideown'        => "Unch'ukit waruchatana askiptawijax imantaña",
-'tog-watchlisthidebots'       => "Unch'ukit waruchatana bot-ta askiptawipax imantaña",
-'tog-watchlisthideminor'      => "Unch'ukit waruchatana sullka askiptawix imantaña",
-'tog-watchlisthideliu'        => "Unch'ukit waruchatana qillqt'ayasita apnaqirina askiptawipax imantaña",
-'tog-watchlisthideanons'      => "Unch'ukit waruchatana sutiwisa apnaqirina askiptawipax imantaña",
-'tog-watchlisthidepatrolled'  => "Unch'ukit waruchatana unch'ukit askiptawix imantaña",
-'tog-nolangconversion'        => "Yaqha aruptaxa jark'aña",
-'tog-ccmeonemails'            => 'Chaski jalayirija nayax yaqhar apayayäta qillqaqawix nayaru apayaña',
-'tog-diffonly'                => 'Manqha diff-nakax uñstawit yati utjawi janiw uñachayaña',
-'tog-showhiddencats'          => 'Imantata patawix uñachayaña',
+'tog-showtoc' => 'Waruchataw uñachayaña (kimsa tituljampi uñstawitaki)',
+'tog-rememberpassword' => "Akax jasanchirin imt'awija amtaña (for a maximum of $1 {{PLURAL:$1|day|days}})",
+'tog-watchcreations' => "Unch'ukit waruchatajana nayaxa uñstawix uñstayawajata yapxataña",
+'tog-watchdefault' => "Unch'ukit waruchatajana nayaxa uñstawix turkajata yapxataña",
+'tog-watchmoves' => "Unch'ukit waruchatajana nayaxa uñstawix sutiyarajata yapxataña",
+'tog-watchdeletion' => "Unch'ukit waruchatajana nayaxa uñstawix phiskhurajata yapxataña",
+'tog-minordefault' => 'Sullka askiptawpacha chimpuriña',
+'tog-previewontop' => 'Askiptawit llataxa nayraxa uñtawikar uñachayaña',
+'tog-previewonfirst' => 'Mayïri askiptawina uñtawikar uñachayaña',
+'tog-nocache' => "Uñstawita kachiñar jark'aña",
+'tog-enotifwatchlistpages' => "Nayaru chaski jalayiriña ukja unch'ukit waruchatana mäuñstawi turkañäna",
+'tog-enotifusertalkpages' => 'Nayaru chaski jalayiriña ukja tuqisiwit uñstawija turkañäna',
+'tog-enotifminoredits' => 'Nayaru chaski jalayiriña uñstawina sullka askiptawimpiraki',
+'tog-enotifrevealaddr' => 'Yatiyawita chaski jalayirinakana chaski jalayirit untjäwija uñachayaña',
+'tog-shownumberswatching' => "Qawqha apnaqirinaka uñch'ukiskar uñacht'ayaña",
+'tog-fancysig' => "Mayaxta rixt'a (sipitarachayatawisa)",
+'tog-externaleditor' => "Anqa askiptiri mirq'iriña (yatxiritakiwa, jasanchirina ajalla jamuqawi wakiskiriwa)",
+'tog-externaldiff' => "Anqa diff-iri mirq'iriña (yatxiritakiwa, jasanchirina ajalla jamuqawi wakiskiriwa)",
+'tog-showjumplinks' => 'Usutataki sipitata "khänaru thuqtaña" uñachayaña',
+'tog-uselivepreview' => "Uñtawikach'ukix mirq'iña (JavaScript munawiwa) (yant'awiwaki)",
+'tog-forceeditsummary' => "Nayaru yatiyaña ukja ch'usa askiptawit juk'aptayawi apantaskaña",
+'tog-watchlisthideown' => "Unch'ukit waruchatana askiptawijax imantaña",
+'tog-watchlisthidebots' => "Unch'ukit waruchatana bot-ta askiptawipax imantaña",
+'tog-watchlisthideminor' => "Unch'ukit waruchatana sullka askiptawix imantaña",
+'tog-watchlisthideliu' => "Unch'ukit waruchatana qillqt'ayasita apnaqirina askiptawipax imantaña",
+'tog-watchlisthideanons' => "Unch'ukit waruchatana sutiwisa apnaqirina askiptawipax imantaña",
+'tog-watchlisthidepatrolled' => "Unch'ukit waruchatana unch'ukit askiptawix imantaña",
+'tog-ccmeonemails' => 'Chaski jalayirija nayax yaqhar apayayäta qillqaqawix nayaru apayaña',
+'tog-diffonly' => 'Manqha diff-nakax uñstawit yati utjawi janiw uñachayaña',
+'tog-showhiddencats' => 'Imantata patawix uñachayaña',
 
 'underline-always' => 'Wiñaya',
-'underline-never'  => 'Janipini',
+'underline-never' => 'Janipini',
 
 # Dates
-'sunday'        => 'tuminku',
-'monday'        => 'lunisa',
-'tuesday'       => 'martisa',
-'wednesday'     => 'mirkulisa',
-'thursday'      => 'juywisa',
-'friday'        => 'wirnisa',
-'saturday'      => 'sawaru',
-'sun'           => 'tum',
-'mon'           => 'lun',
-'tue'           => 'mar',
-'wed'           => 'mir',
-'thu'           => 'juy',
-'fri'           => 'wir',
-'sat'           => 'saw',
-'january'       => 'chichu phaxsi',
-'february'      => 'anata phaxsi',
-'march'         => 'achuqa phaxsi',
-'april'         => 'yapu apthapi phaxsi',
-'may_long'      => 'llamayu phaxsi',
-'june'          => 'juyphi phaxsi',
-'july'          => 'huillka kuti phaxsi',
-'august'        => 'thaya phaxsi',
-'september'     => "llamp'u phaxsi",
-'october'       => 'taypi sata phaxsi',
-'november'      => 'awti phaxsi',
-'december'      => 'jallu qallta phaxsi',
-'january-gen'   => 'chichu phaxsi',
-'february-gen'  => 'anata phaxsi',
-'march-gen'     => 'achuqa phaxsi',
-'april-gen'     => 'yapu apthapi phaxsi',
-'may-gen'       => 'llamayu phaxsi',
-'june-gen'      => 'juyphi phaxsi',
-'july-gen'      => 'huillka kuti phaxsi',
-'august-gen'    => 'thaya phaxsi',
+'sunday' => 'tuminku',
+'monday' => 'lunisa',
+'tuesday' => 'martisa',
+'wednesday' => 'mirkulisa',
+'thursday' => 'juywisa',
+'friday' => 'wirnisa',
+'saturday' => 'sawaru',
+'sun' => 'tum',
+'mon' => 'lun',
+'tue' => 'mar',
+'wed' => 'mir',
+'thu' => 'juy',
+'fri' => 'wir',
+'sat' => 'saw',
+'january' => 'chichu phaxsi',
+'february' => 'anata phaxsi',
+'march' => 'achuqa phaxsi',
+'april' => 'yapu apthapi phaxsi',
+'may_long' => 'llamayu phaxsi',
+'june' => 'juyphi phaxsi',
+'july' => 'huillka kuti phaxsi',
+'august' => 'thaya phaxsi',
+'september' => "llamp'u phaxsi",
+'october' => 'taypi sata phaxsi',
+'november' => 'awti phaxsi',
+'december' => 'jallu qallta phaxsi',
+'january-gen' => 'chichu phaxsi',
+'february-gen' => 'anata phaxsi',
+'march-gen' => 'achuqa phaxsi',
+'april-gen' => 'yapu apthapi phaxsi',
+'may-gen' => 'llamayu phaxsi',
+'june-gen' => 'juyphi phaxsi',
+'july-gen' => 'huillka kuti phaxsi',
+'august-gen' => 'thaya phaxsi',
 'september-gen' => "llamp'u phaxsi",
-'october-gen'   => 'taypi sata phaxsi',
-'november-gen'  => 'awti phaxsi',
-'december-gen'  => 'jallu qallta phaxsi',
-'jan'           => 'chi',
-'feb'           => 'ana',
-'mar'           => 'ach',
-'apr'           => 'yap',
-'may'           => 'llam',
-'jun'           => 'juy',
-'jul'           => 'hui',
-'aug'           => 'tha',
-'sep'           => 'llmp',
-'oct'           => 'tay',
-'nov'           => 'awt',
-'dec'           => 'jall',
-
-'article'       => 'Amtachinu',
-'cancel'        => 'Jan saña',
+'october-gen' => 'taypi sata phaxsi',
+'november-gen' => 'awti phaxsi',
+'december-gen' => 'jallu qallta phaxsi',
+'jan' => 'chi',
+'feb' => 'ana',
+'mar' => 'ach',
+'apr' => 'yap',
+'may' => 'llam',
+'jun' => 'juy',
+'jul' => 'hui',
+'aug' => 'tha',
+'sep' => 'llmp',
+'oct' => 'tay',
+'nov' => 'awt',
+'dec' => 'jall',
+
+'article' => 'Amtachinu',
+'cancel' => 'Jan saña',
 'moredotdotdot' => 'Yapa...',
-'mypage'        => 'Uñstawija',
-'navigation'    => 'Wampuña',
-'and'           => '&#32;-mpi',
+'mypage' => 'Uñstawija',
+'navigation' => 'Wampuña',
+'and' => '&#32;-mpi',
 
 # Cologne Blue skin
-'qbfind'        => 'Thaqaña',
-'qbbrowse'      => 'Wampuña',
-'qbedit'        => 'Turkaña',
+'qbfind' => 'Thaqaña',
+'qbbrowse' => 'Wampuña',
+'qbedit' => 'Turkaña',
 'qbpageoptions' => 'Uñstawitaki ajllita',
-'qbpageinfo'    => "Uñstawxat uñt'ayawi",
-'qbmyoptions'   => 'Ajllitanakaja',
-
-'errorpagetitle'    => 'Pantja',
-'help'              => 'Yanapaña',
-'search'            => 'Thaqaña',
-'searchbutton'      => 'Thaqaña',
-'go'                => 'Saraña',
-'searcharticle'     => 'Saraña',
-'history'           => 'Nayra qillqata',
-'history_short'     => 'Nayra qillqata',
-'edit'              => 'Turkaña',
-'create'            => 'Uñstayaña',
-'editthispage'      => 'Aka uñstawi turkaña',
-'create-this-page'  => 'Aka uñstawi uñstayaña',
-'delete'            => 'Pichaña',
-'deletethispage'    => 'Aka uñstawi phiskhuraña',
-'undelete_short'    => "{{PLURAL:$1|mayaskiptawi|$1 askiptanakawi}} kutt'ayxaña",
-'protect'           => "Jark'aña",
-'protect_change'    => 'turkaña',
-'protectthispage'   => "Aka uñstawi jark'aña",
-'unprotect'         => "Jark'ch'ukiña",
+'qbpageinfo' => "Uñstawxat uñt'ayawi",
+'qbmyoptions' => 'Ajllitanakaja',
+
+'errorpagetitle' => 'Pantja',
+'help' => 'Yanapaña',
+'search' => 'Thaqaña',
+'searchbutton' => 'Thaqaña',
+'go' => 'Saraña',
+'searcharticle' => 'Saraña',
+'history' => 'Nayra qillqata',
+'history_short' => 'Nayra qillqata',
+'edit' => 'Turkaña',
+'create' => 'Uñstayaña',
+'editthispage' => 'Aka uñstawi turkaña',
+'create-this-page' => 'Aka uñstawi uñstayaña',
+'delete' => 'Pichaña',
+'deletethispage' => 'Aka uñstawi phiskhuraña',
+'undelete_short' => "{{PLURAL:$1|mayaskiptawi|$1 askiptanakawi}} kutt'ayxaña",
+'protect' => "Jark'aña",
+'protect_change' => 'turkaña',
+'protectthispage' => "Aka uñstawi jark'aña",
+'unprotect' => "Jark'ch'ukiña",
 'unprotectthispage' => "Aka uñstawi jark'ch'ukiña",
-'newpage'           => 'Machaqa uñstawi',
-'talkpage'          => 'Aka uñstawxat tuqisiña',
-'talkpagelinktext'  => 'Kutkatasiña',
-'specialpage'       => 'Ajalla Uñstawi',
-'talk'              => 'Tuqisiwi',
-'otherlanguages'    => 'Yaqha arunaka',
-'protectedpage'     => "Uñstawi jark'ata",
-'jumptonavigation'  => 'wampuña',
-'jumptosearch'      => 'thaqaña',
+'newpage' => 'Machaqa uñstawi',
+'talkpage' => 'Aka uñstawxat tuqisiña',
+'talkpagelinktext' => 'Kutkatasiña',
+'specialpage' => 'Ajalla Uñstawi',
+'talk' => 'Tuqisiwi',
+'otherlanguages' => 'Yaqha arunaka',
+'protectedpage' => "Uñstawi jark'ata",
+'jumptonavigation' => 'wampuña',
+'jumptosearch' => 'thaqaña',
 
 # 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).
-'currentevents'        => 'Jichha pacha',
-'currentevents-url'    => 'Project:Jichha pacha',
-'mainpage'             => 'Nayriri Uñstawi',
+'currentevents' => 'Jichha pacha',
+'currentevents-url' => 'Project:Jichha pacha',
+'mainpage' => 'Nayriri Uñstawi',
 'mainpage-description' => 'Nayriri Uñstawi',
-'portal'               => 'Jayma punku',
-'portal-url'           => 'Project:Jayma punku',
-
-'editsection'    => 'turkaña',
-'editold'        => 'turkaña',
-'editlink'       => 'trukaña',
-'toc'            => 'Utjirinaka',
-'showtoc'        => 'uñachayaña',
-'site-rss-feed'  => '$1 RSS jalsuri',
+'portal' => 'Jayma punku',
+'portal-url' => 'Project:Jayma punku',
+
+'editsection' => 'turkaña',
+'editold' => 'turkaña',
+'editlink' => 'trukaña',
+'toc' => 'Utjirinaka',
+'showtoc' => 'uñachayaña',
+'site-rss-feed' => '$1 RSS jalsuri',
 'site-atom-feed' => '$1 Atom jalsuri',
-'page-rss-feed'  => '"$1" RSS jalsuri',
+'page-rss-feed' => '"$1" RSS jalsuri',
 'page-atom-feed' => '"$1" Atom jalsuri',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Amtachinu',
-'nstab-user'     => 'Apnaqiri',
-'nstab-image'    => "Q'ipi",
-'nstab-help'     => 'Yanapaña',
+'nstab-main' => 'Amtachinu',
+'nstab-user' => 'Apnaqiri',
+'nstab-image' => "Q'ipi",
+'nstab-help' => 'Yanapaña',
 'nstab-category' => 'Patawi',
 
 # General errors
 'error' => 'Pantja',
 
 # Login and logout pages
-'login'              => "Qillqt'ayasiña",
-'userlogin'          => "Qillqt'ayasiña",
-'logout'             => 'Mistuña',
-'userlogout'         => 'Mistuña',
+'login' => "Qillqt'ayasiña",
+'userlogin' => "Qillqt'ayasiña",
+'logout' => 'Mistuña',
+'userlogout' => 'Mistuña',
 'loginlanguagelabel' => 'Aru: $1',
 
 # Edit pages
-'summary'   => 'Juk’aptayäwi:',
-'subject'   => 'Yatsuwi/titulu:',
+'summary' => 'Juk’aptayäwi:',
+'subject' => 'Yatsuwi/titulu:',
 'minoredit' => 'Akax janiw taqpachäkiti',
-'yourdiff'  => 'Jalaqtatanaka',
+'yourdiff' => 'Jalaqtatanaka',
 
 # Preferences page
-'preferences'    => 'Amtajarjama',
-'prefs-rc'       => 'Jichha kutikiptatanaka',
+'preferences' => 'Amtajarjama',
+'prefs-rc' => 'Jichha kutikiptatanaka',
 'timezoneoffset' => 'Jalaqtata',
-'yourlanguage'   => 'Aru:',
-'email'          => 'Chaski jalayiri',
+'yourlanguage' => 'Aru:',
+'email' => 'Chaski jalayiri',
 
 # Recent changes
 'recentchanges' => 'Jichha kutikiptatanaka',
-'show'          => 'uñachayaña',
+'show' => 'uñachayaña',
 
 # Upload
 'fileuploadsummary' => 'Uñt’ayawi:',
 
-'license'        => 'Iyawsawi:',
+'license' => 'Iyawsawi:',
 'license-header' => 'Iyawsawi:',
 
 # Special:ListFiles
-'listfiles_date'        => 'Uru jakhu',
-'listfiles_user'        => 'Apnaqiri',
+'listfiles_date' => 'Uru jakhu',
+'listfiles_user' => 'Apnaqiri',
 'listfiles_description' => 'Uñt’ayawi',
 
 # File description page
 'file-anchor-link' => "Q'ipi",
-'filehist-user'    => 'Apnaqiri',
+'filehist-user' => 'Apnaqiri',
 
 # Miscellaneous special pages
 'move' => 'Qillqaraña',
@@ -235,7 +234,7 @@ $messages = array(
 'booksources-go' => 'Saraña',
 
 # Special:Log
-'specialloguserlabel'  => 'Apnaqiri:',
+'specialloguserlabel' => 'Apnaqiri:',
 'speciallogtitlelabel' => 'Titulu:',
 
 # Special:ListUsers
@@ -250,12 +249,12 @@ $messages = array(
 # Undelete
 'undelete-search-submit' => 'Thaqaña',
 
-'sp-contributions-talk'   => 'Kutkatasiña',
+'sp-contributions-talk' => 'Kutkatasiña',
 'sp-contributions-submit' => 'Thaqaña',
 
 # Block/unblock
 'ipblocklist-submit' => 'Thaqaña',
-'proxyblocksuccess'  => 'Kamachawi',
+'proxyblocksuccess' => 'Kamachawi',
 
 # Tooltip help for the actions
 'tooltip-p-logo' => 'Nayriri Uñstawi',
index 0ff447d..1fbf8f1 100644 (file)
@@ -9,7 +9,10 @@
  *
  * @author Cekli829
  * @author Don Alessandro
+ * @author E THP
+ * @author Ebrahimi-amir
  * @author Emperyan
+ * @author Erdemaslancan
  * @author Gulmammad
  * @author Kaganer
  * @author PPerviz
@@ -222,7 +225,6 @@ $messages = array(
 'qbbrowse' => 'Gözdən keçir',
 'qbedit' => 'Redaktə',
 'qbpageoptions' => 'Bu səhifə',
-'qbpageinfo' => 'Məzmun',
 'qbmyoptions' => 'Mənim səhifələrim',
 'qbspecialpages' => 'Xüsusi səhifələr',
 'faq' => 'TSS',
@@ -473,10 +475,7 @@ Göstərilən səbəb: "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Sistemdən çıxdınız.'''
 
-Siz {{SITENAME}} saytını anonim olaraq istifadə etməyə davam edə bilər və ya eyni, yaxud başqa istifadəçi adı ilə [[Special:UserLogin|yenidən daxil ola]] bilərsiniz. Veb-brauzerin keş yaddaşını təmizləyənədək bəzi səhifələr hələ də sistemdə imişsiniz kimi görünə bilər.",
-'welcomecreation' => '== $1, xoş gəlmişsiniz! ==
-Hesabınız yaradıldı.
-[[Special:Preferences|{{SITENAME}} nizamlamalarınızı]] dəyişdirməyi unutmayın.',
+Siz {{SITENAME}} saytını anonim olaraq istifadə etməyə davam edə bilər və ya eyni, yaxud başqa istifadəçi adı ilə <span class='plainlinks'>[$1 yenidən daxil ola]</span> bilərsiniz. Veb-brauzerin keş yaddaşını təmizləyənədək bəzi səhifələr hələ də sistemdə imişsiniz kimi görünə bilər.",
 'yourname' => 'İstifadəçi adı',
 'yourpassword' => 'Parol:',
 'yourpasswordagain' => 'Parolu təkrar yazın:',
@@ -730,6 +729,9 @@ Məlumat üçün aşağıda bu səhifənin tarixçəsindən müvafiq silmə qeyd
 'edit-already-exists' => 'Yeni səhifəni yaratmaq mümkün deyil.
 Belə ki, bu adda səhifə artıq mövcuddur.',
 
+# Content models
+'content-model-javascript' => 'JavaScript',
+
 # Parser/template warnings
 'expensive-parserfunction-category' => 'Kifayət qədər böyük sayda genişresurslu funksiyaların müraciət olunduğu səhifələr',
 'post-expand-template-inclusion-warning' => "'''DİQQƏT!''' Daxil edilən şablonların həcmi həddindən artıq böyükdür.
@@ -923,8 +925,6 @@ $1",
 'search-interwiki-caption' => 'Qardaş layihələr',
 'search-interwiki-default' => '$1 nəticə:',
 'search-interwiki-more' => '(yenə)',
-'search-mwsuggest-enabled' => 'təkliflərlə',
-'search-mwsuggest-disabled' => 'təklif yoxdur',
 'search-relatedarticle' => 'əlaqədar',
 'mwsuggest-disable' => 'AJAX təkliflərini rədd et',
 'searcheverything-enable' => 'Ad aralığında axtar:',
@@ -955,7 +955,7 @@ $1",
 
 # Preferences page
 'preferences' => 'Nizamlamalar',
-'mypreferences' => 'Nizamlamalarım',
+'mypreferences' => 'Nizamlamalar',
 'prefs-edits' => 'Redaktələrin sayı:',
 'prefsnologin' => 'Daxil olmamısınız',
 'prefsnologintext' => 'Nizamlamaları dəyişmək üçün <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} daxil olmaq]</span> zəruridir.',
@@ -1739,11 +1739,7 @@ Fərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-help
 
 'enotif_mailer' => '{{SITENAME}} Bildiriş Xidməti',
 'enotif_reset' => 'Baxılmış bütün səhifələri işarələ.',
-'enotif_newpagetext' => 'Bu səhifə yeni səhifədir.',
 'enotif_impersonal_salutation' => '{{SITENAME}} istifadəçisi',
-'changed' => 'dəyişdi',
-'created' => 'yaradıldı',
-'enotif_subject' => '{{SITENAME}} saytındakı $PAGETITLE səhifəsi $PAGEEDITOR tərəfindən $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Sonuncu ziyarətinizdən indiyədək olan bütün dəyişiklikləri görmək üçün baxın: $1.',
 'enotif_lastdiff' => 'Bu dəyişikliyi görmək üçün $1 səhifəsinə baxın.',
 'enotif_anon_editor' => 'qeydiyyatsız istifadəçi $1',
@@ -2327,9 +2323,16 @@ Zəhmət olmasa başqa ad seçin.',
 
 # Info page
 'pageinfo-title' => '"$1" üçün məlumat',
+'pageinfo-header-basic' => 'Əsas məlumatlar',
 'pageinfo-header-edits' => 'Redaktələr',
+'pageinfo-header-restrictions' => 'Səhifə mühafizəsi',
+'pageinfo-header-properties' => 'Səhifə xüsusiyyətləri',
 'pageinfo-views' => 'Göstərmə səhifəsi',
 'pageinfo-watchers' => 'Baxış sayı',
+'pageinfo-firstuser' => 'Səhifəni yaradan',
+'pageinfo-firsttime' => 'Səhifənin yaranma tarixi',
+'pageinfo-lastuser' => 'Sonuncu redaktor',
+'pageinfo-lasttime' => 'Sonuncu redaktənin tarixi',
 'pageinfo-edits' => 'Redaktələrin sayı',
 'pageinfo-authors' => 'Fərqli müəlliflərin sayı',
 
@@ -2551,7 +2554,7 @@ Variants for Chinese language
 'exif-objectname' => 'Qısa başlıq',
 'exif-specialinstructions' => 'Xüsusi instruksiyalar',
 'exif-headline' => 'Başlıq',
-'exif-credit' => 'Credit/Provider',
+'exif-credit' => 'Təmin edici',
 'exif-source' => 'Mənbə',
 'exif-editstatus' => 'Şəklin redaktə statusu',
 'exif-urgency' => 'Zərurilik',
@@ -2992,6 +2995,9 @@ Bu saytda texniki problemlər var.',
 'feedback-close' => 'Oldu',
 'feedback-bugnew' => 'Mən yoxladım. Yeni xəta barədə xəbər ver',
 
+# Search suggestions
+'searchsuggest-search' => 'Axtar',
+
 # API errors
 'api-error-filename-tooshort' => 'Fayl adı qısadır.',
 'api-error-filetype-banned' => 'Bu tip fayllar qadağandır.',
diff --git a/languages/messages/MessagesAzb.php b/languages/messages/MessagesAzb.php
new file mode 100644 (file)
index 0000000..b720c81
--- /dev/null
@@ -0,0 +1,3369 @@
+<?php
+/** South Azerbaijani (تورکجه)
+ *
+ * See MessagesQqq.php for message documentation incl. usage of parameters
+ * To improve a translation please visit http://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ * @author Amir a57
+ * @author Arjanizary
+ * @author Calak
+ * @author E THP
+ * @author Ebrahimi-amir
+ * @author Erdemaslancan
+ * @author Mousa
+ */
+
+$fallback = 'fa';
+$rtl = true;
+
+$messages = array(
+# User preference toggles
+'tog-underline' => 'باغلانتی‌لارین آلتینی خطله:',
+'tog-justify' => 'متنی صحیفه بویو پایلا',
+'tog-hideminor' => 'سون دییشیکلیکلرده کیچیک‌لری گیزلت',
+'tog-hidepatrolled' => 'نظارتلنمیش دَییشیکلیکلری سون دییشیکلیکلرده گیزلت',
+'tog-newpageshidepatrolled' => 'نظارتلنمیش صحیفه‌لری یئنی صحیفه‌لر سیاهی‌سیندان گیزلت',
+'tog-extendwatchlist' => 'ایزله‌دیکلری، بوتون دیشیکلیکلری گؤسترمک اوچون گئنیشلندیر',
+'tog-usenewrc' => 'دَییشیکلیکلری سون دَییشیکلیکلر صحیفه‌سینده ایزله‌دیکلر صحیفه‌سینده گروپ‌لا (جاوااسکریپت لازیم‌دیر)',
+'tog-numberheadings' => 'باشلیق‌لاری اوتوماتیک نومره‌له',
+'tog-showtoolbar' => 'دَییشدیرمه آراج چوبوغونو گؤستر (جاوااسکریپت لازیم‌دیر)',
+'tog-editondblclick' => 'صحیفه‌‌لری ایکی کلیکله دَییشدیر (جاوااسکریپت لازیم‌دیر)',
+'tog-editsection' => '[دَییشدیر] باغلانتی‌سیلا بؤلوم دَییشدیرمه‌سینه ایجازه وئر',
+'tog-editsectiononrightclick' => 'بؤلوم‌لرین دیشدیرمه‌سینی، باشلیقلارین اوزرینده ساغ‌کلیک ائتمک‌له ایجازه وئر (جاوااسکریپت لازیم‌دیر)',
+'tog-showtoc' => 'ایچینده‌کیلر جدولینی گؤستر (۳-دن آرتیق باشلیقلاری اولان صحیفه‌‌لرده)',
+'tog-rememberpassword' => 'منیم گیریشیمی بو بیلگی‌سایاردا یاددا ساخلا (چوخو {{PLURAL:$1|بیر گونه|$1 گونه}} کیمی)',
+'tog-watchcreations' => 'ياراتدیغیم صحیفه‌‌لری و يوکله‌دیگیم فايل‌لاری ایزله‌مه‌لریمه آرتیر',
+'tog-watchdefault' => 'دَییشدیردیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر',
+'tog-watchmoves' => 'داشیدیغیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر',
+'tog-watchdeletion' => 'سیلدیگیم صحیفه‌‌لری و فايل‌لاری ایزله‌دیکلریمه آرتیر',
+'tog-minordefault' => 'دیفالت اولاراق بوتون دَییشدیر‌مه‌لریمی کیچیک دَییشدیر کیمی نیشانلا',
+'tog-previewontop' => 'اؤن‌گؤستریشی يازماق قوتوسوندان قاباق گؤستر',
+'tog-previewonfirst' => 'ایلک دَییشدیرمه‌ده اؤن‌گؤستریشی گؤستر',
+'tog-nocache' => 'براوزرین کَش ائتمگینی ایشلدن سال',
+'tog-enotifwatchlistpages' => 'ایزله‌دیکلریم‌ده اولان صحیفه یوخسا فایل دَییشدیریلنده، منه ایمیل گؤندر',
+'tog-enotifusertalkpages' => 'دانیشیق صحیفه‌‌م دَییشدیریلنده منه ایمیل گؤندر',
+'tog-enotifminoredits' => 'صحیفه‌لرده و فایل‌لاردا کیچیک دَییشیکلیکلر اولسا دا منه ایمیل گؤندر',
+'tog-enotifrevealaddr' => 'منیم ایمیل آدرسیمی خبر وئرمه ایمیل‌لرینده گؤستر',
+'tog-shownumberswatching' => 'ایزله‌ين ایستیفاده‌چیلرین سایینی گؤستر',
+'tog-oldsig' => 'ایندی‌کی ایمضا:',
+'tog-fancysig' => 'ویکی متن کیمی ایمضا (اوتوماتیک باغلانتی‌سیز)',
+'tog-externaleditor' => 'دَییشدیرمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
+'tog-externaldiff' => 'موقاییسه ائتمک اوچون ائشیک یازیلیم ایشلد (یالنیز چوخ باشارانلار اوچون، بیلگی‌سایارینیزدا مخصوص تنظیملر لازیم‌دیر. [//www.mediawiki.org/wiki/Manual:External_editors آرتیق بیلگیلر])',
+'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' => 'بوجاق‌سیز فونت',
+'editfont-serif' => 'بوجاق‌لی فونت',
+
+# Dates
+'sunday' => 'سود گونو',
+'monday' => 'دوزگونو',
+'tuesday' => 'آرا گون',
+'wednesday' => 'اوْدگونو',
+'thursday' => 'سوگونو',
+'friday' => 'آینی‌گون',
+'saturday' => 'يئل‌گونو',
+'sun' => 'یکشنبه',
+'mon' => 'دوشنبه',
+'tue' => 'سه‌شنبه',
+'wed' => 'چهارشنبه',
+'thu' => 'پنج‌شنبه',
+'fri' => 'جوما',
+'sat' => 'شنبه',
+'january' => 'ژانویه',
+'february' => 'فئوریه',
+'march' => 'مارس',
+'april' => 'آوریل',
+'may_long' => 'مئی',
+'june' => 'ژوئن',
+'july' => 'ژولای',
+'august' => 'آقوست',
+'september' => 'سئپتامبر',
+'october' => 'اوکتوبر',
+'november' => 'نووامبر',
+'december' => 'دئسامبر',
+'january-gen' => 'ژانویه',
+'february-gen' => 'فوریه',
+'march-gen' => 'مارس',
+'april-gen' => 'آوریل',
+'may-gen' => 'مِی',
+'june-gen' => 'ژوئن',
+'july-gen' => 'جولای',
+'august-gen' => 'آقوست',
+'september-gen' => 'سئپتامبر',
+'october-gen' => 'اوکتوبر',
+'november-gen' => 'نووامبر',
+'december-gen' => 'دئسامبر',
+'jan' => 'ژانویه',
+'feb' => 'فئوریه',
+'mar' => 'مارس',
+'apr' => 'آوریل',
+'may' => 'مئی',
+'jun' => 'ژوئن',
+'jul' => 'ژولای',
+'aug' => 'آقوست',
+'sep' => 'سئپتامبر',
+'oct' => 'اوکتوبر',
+'nov' => 'نووامبر',
+'dec' => 'دئسامبر',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}',
+'category_header' => '«$1» بؤلمه‌سین‌ده‌کی مقاله‌لر',
+'subcategories' => 'آلت بؤلمه‌لر',
+'category-media-header' => '«$1» بؤلمه‌سینده مئدیا',
+'category-empty' => "''بو بؤلمه‌نین ایندی فایل یوخسا مئدیاسی یوخدور.''",
+'hidden-categories' => '{{PLURAL:$1|گیزلی بؤلمه|گیزلی بؤلمه‌لر}}',
+'hidden-category-category' => 'گیزلی بؤلمه‌لر',
+'category-subcat-count' => 'بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} آلت‌بؤلمه وار؛ بو بؤلمه‌نین جمعاً $2 آلت‌بؤلمه‌سی وار.',
+'category-subcat-count-limited' => 'بو بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.',
+'category-article-count' => 'بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} صحیفه وار؛ بو بؤلمه‌نین جمعاً $2 صحیفه‌سی وار.',
+'category-article-count-limited' => 'بو بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|یارپاق|$1 یارپاق}} واردیر.',
+'category-file-count' => 'بو بؤلمه‌ده {{PLURAL:$2|یالنیز|}} آشاغیداکی {{PLURAL:$1|بیر|$1}} فایل وار؛ بو بؤلمه‌نین جمعاً $2 فایلی وار.',
+'category-file-count-limited' => 'بؤلمه‌ده، بو {{PLURAL:$1|فایل|$1 فایل}} واردیر.',
+'listingcontinuesabbrev' => '(داوام)',
+'index-category' => 'ایندئکس‌لشدیریلمیش یارپاقلار',
+'noindex-category' => 'ایندئکس‌لشدیریلمه‌ین یارپاقلار',
+'broken-file-category' => 'فایل‌لارا قیریلمیش باغلانتیلاری اولان یارپاقلار',
+
+'about' => 'گؤره',
+'article' => 'ایچری‌لی یارپاق',
+'newwindow' => '(یئنی پنجره‌ده آچیلیر)',
+'cancel' => 'لغو ائت',
+'moredotdotdot' => 'داها...',
+'mypage' => 'مقاله',
+'mytalk' => 'دانیشیق',
+'anontalk' => 'بو آی‌پی آدرسینه دانیشیق',
+'navigation' => 'دولانماق',
+'and' => '&#32;و',
+
+# Cologne Blue skin
+'qbfind' => 'تاپ',
+'qbbrowse' => 'گؤزدن گئچید',
+'qbedit' => 'دَيیشدیر',
+'qbpageoptions' => 'بو صحیفه‌‌',
+'qbmyoptions' => 'منیم صحیفه‌‌لریم',
+'qbspecialpages' => 'اؤزل صحیفه‌لر',
+'faq' => 'چوخ سوروشولان سواللار',
+'faqpage' => 'Project:چوخلو سوروشولان سورغولار',
+
+# Vector skin
+'vector-action-addsection' => 'قونو آرتیر',
+'vector-action-delete' => 'سیل',
+'vector-action-move' => 'آدینی ديَیشدیر',
+'vector-action-protect' => 'قورو',
+'vector-action-undelete' => 'سیلمگی قایتار',
+'vector-action-unprotect' => 'قوروماغی دَییشدیر',
+'vector-simplesearch-preference' => 'ساده‌لشدیریلمیش آختاریش چوبوغو (یالنیز Vector دَری‌سینده)',
+'vector-view-create' => 'یارات',
+'vector-view-edit' => 'دَییشدیر',
+'vector-view-history' => 'گئچمیشه باخ',
+'vector-view-view' => 'اوخو',
+'vector-view-viewsource' => 'قایناغا باخ',
+'actions' => 'چالیشمالار',
+'namespaces' => 'آدلار فضاسی',
+'variants' => 'واریانتلار',
+
+'navigation-heading' => 'ناویگاسيون مئنوسو',
+'errorpagetitle' => 'خطا',
+'returnto' => '$1-ه/ا قاییت',
+'tagline' => '{{SITENAME}} سایتیندان',
+'help' => 'یاردیم',
+'search' => 'آختار',
+'searchbutton' => 'آختار',
+'go' => 'گئت',
+'searcharticle' => 'گئت',
+'history' => 'صحیفه‌‌نین گئچمیشی',
+'history_short' => 'گئچمیش',
+'updatedmarker' => 'سون باخیشیمدان بویانا، یئنی‌لشیب‌دیر',
+'printableversion' => 'چاپ ائتمه‌لی نوسخه',
+'permalink' => 'قالان باغلانتی',
+'print' => 'یازدیر',
+'view' => 'باخ',
+'edit' => 'دَییشدیر',
+'create' => 'یارات',
+'editthispage' => 'بو صحیفه‌‌نی دَییش',
+'create-this-page' => 'بو صحیفه‌‌نی يارات',
+'delete' => 'سیل',
+'deletethispage' => 'بو صحیفه‌‌نی سیل',
+'undelete_short' => '{{PLURAL:$1|بیر دَییشیکلیگی|$1 دَییشیکلیگی}} برپا ائت',
+'viewdeleted_short' => '{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیگی گؤستر',
+'protect' => 'موحافظه‌‌ ائت',
+'protect_change' => 'ديَیش',
+'protectthispage' => 'بو صحیفه‌‌نی موحافظه‌‌ ائت',
+'unprotect' => 'موحافظه‌‌نی کنارلاشدیر',
+'unprotectthispage' => 'بو یارپاغین قوروماسینی دَییشدیر',
+'newpage' => 'يئنی صحیفه‌‌',
+'talkpage' => 'بو یارپاغا گؤره دانیشیق آپارین',
+'talkpagelinktext' => 'دانیشیق',
+'specialpage' => 'اؤزل صحیفه',
+'personaltools' => 'شخصی آراجلار',
+'postcomment' => 'يئنی بؤلوم',
+'articlepage' => 'مقاله یه باخین',
+'talk' => 'دانیشیق',
+'views' => 'گؤرونوشلر',
+'toolbox' => 'آراجلار قوتوسو',
+'userpage' => 'ایستیفاده‌چی صحیفه‌‌سینی گؤستر',
+'projectpage' => 'پروژه صحیفه‌سینه باخین',
+'imagepage' => 'فایل صحیفه‌سینه باخین',
+'mediawikipage' => 'مئساژ صحیفه‌سینه باخین',
+'templatepage' => 'شابلون صحیفه‌سینه  باخین',
+'viewhelppage' => 'یاردیم صحیفه‌سینه باخین',
+'categorypage' => 'بؤلمه صحیفه‌‌سینی گؤستر',
+'viewtalkpage' => 'دانیشیغا باخین',
+'otherlanguages' => 'آیری دیللرده',
+'redirectedfrom' => '($1 صحیفه‌‌سیندن يؤنلن‌دیریلمیش‌دیر)',
+'redirectpagesub' => 'یوللاندیرما صحیفه‌سی',
+'lastmodifiedat' => 'بۇ صحیفه‌‌ سوْنونجو دفعه‌‌ $1، $2 تاریخینده دَییشیلیب.',
+'viewcount' => 'بو یارپاق {{PLURAL:$1|بیر|$1}} دفعه گؤرونوب‌دور.',
+'protectedpage' => 'قورونموش یارپاق',
+'jumpto' => 'آتلان:',
+'jumptonavigation' => 'دولانماق',
+'jumptosearch' => 'آختار',
+'view-pool-error' => 'باغیشلایین، ایندی خیدمت‌چیلر آرتیق یوک آلتیندادیلار.
+چوخلو ایشلدنلر بو یارپاغی گؤرمک ایسته‌ییرلر.
+لوطفاً یئنی‌دن بو یارپاغا ال تاپماغا چالیشماقدان اؤنجه، بیر آز دؤزون.
+
+$1',
+'pool-timeout' => 'قیفیلا دؤزمک واختی قورتاردی',
+'pool-queuefull' => 'چیخاریش صحیفه‌‌سی دولودور',
+'pool-errorunknown' => 'تانینمامیش خطا',
+
+# All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
+'aboutsite' => '{{SITENAME}}-ا گؤره',
+'aboutpage' => 'Project:حاقیندا',
+'copyright' => 'ایچینده‌کیلر $1 لیسانسی احاطه‌سینده‌دیلر.',
+'copyrightpage' => '{{ns:project}}:کوپی حاقی',
+'currentevents' => 'ایندیکی اولایلار',
+'currentevents-url' => 'Project:ایندیکی اولایلار',
+'disclaimers' => 'مسئولیتدن ایمتیناع',
+'disclaimerpage' => 'Project:مسولیتدن ایمتیناع',
+'edithelp' => 'ديَیشیکلیک‌لر اوچون یاردیم',
+'edithelppage' => 'Help:دَییشدیرمه',
+'helppage' => 'Help:ایچینده‌کیلر',
+'mainpage' => 'آنا صحیفه',
+'mainpage-description' => 'آنا صحیفه',
+'policy-url' => 'Project:قایدالار',
+'portal' => 'کند مئيدانی',
+'portal-url' => 'Project: توپلوم پورتالی',
+'privacy' => 'گیزلیلیک سیاستی',
+'privacypage' => 'Project:گیزلیلیک سیاستی',
+
+'badaccess' => 'یول وئرمه خطاسی',
+'badaccess-group0' => 'ایسته‌دیگینیز ایشه ایجازه‌نیز یوخدور.',
+'badaccess-groups' => 'ایسته‌دیگینیز ایشین ایجازه‌سی، تکجه بو {{PLURAL:$2|گروپ|گروپلار}}داکی ایشلدنلره وئریلیب‌دیر: $1.',
+
+'versionrequired' => 'مدئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر',
+'versionrequiredtext' => 'بو یارپاغی ایشلتدماغا، مئدیاویکی یازیلیمینین $1 نوسخه‌سی لازیم‌دیر.
+[[Special:Version|نوسخه یارپاغینا]] باخین.',
+
+'ok' => 'تامام',
+'retrievedfrom' => '«$1»-دن آلینمیشدیر',
+'youhavenewmessages' => 'سیزین $1 ($2) وارینیز.',
+'newmessageslink' => 'بیلدیرنیز',
+'newmessagesdifflink' => 'سون دَییشیکلیک',
+'youhavenewmessagesfromusers' => 'سیزین {{PLURAL:$3|بیر باشقا ایشلدن‌دن|$3 ایشلدن‌دن}} $1 وارینیزدیر ($2).',
+'youhavenewmessagesmanyusers' => 'سیزین چوخلو ایشلدنلردن $1 وارینیزدیر ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|بیر یئنی مئساژ|یئنی مئساژلار}}',
+'newmessagesdifflinkplural' => 'سون {{PLURAL:$1|دَییشیکلیک|دَییشیکلیکلر}}',
+'youhavenewmessagesmulti' => '$1-دا یئنی بیلدیرینیز وار.',
+'editsection' => 'دَییشدیر',
+'editold' => 'دَییش',
+'viewsourceold' => 'قایناقا باخ',
+'editlink' => 'دَییشدیر',
+'viewsourcelink' => 'قایناغا باخ',
+'editsectionhint' => 'بؤلومو دَییشدیر: $1',
+'toc' => 'ایچینده‌کی‌لر',
+'showtoc' => 'گؤستر',
+'hidetoc' => 'گیزلت',
+'collapsible-collapse' => 'گیزلت',
+'collapsible-expand' => 'گئنشتیرمه',
+'thisisdeleted' => '$1-نا باخ یا اونو قایتار؟',
+'viewdeleted' => '$1 گؤستریلسین؟',
+'restorelink' => '{{PLURAL:$1|بیر سیلینمیش دَییشیکلیک|$1 سیلینمیش دَییشیکلیکلر}}',
+'feedlinks' => 'بسلمه',
+'feed-invalid' => 'گئچرسیز آبونه کانال جورو.',
+'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' => 'مقاله',
+'nstab-user' => 'ایستیفاده‌چی صحیفه‌سی',
+'nstab-media' => 'مئدیا یارپاقی',
+'nstab-special' => 'اؤزل صحیفه',
+'nstab-project' => 'پروژه صحیفه‌سی',
+'nstab-image' => 'فایل',
+'nstab-mediawiki' => 'مئساژ',
+'nstab-template' => 'شابلون',
+'nstab-help' => 'یاردیم صحیفه‌سی',
+'nstab-category' => 'بؤلمه',
+
+# Main script and global functions
+'nosuchaction' => 'بو جور چالیشم مؤوجود دئيیل.',
+'nosuchactiontext' => 'URL-ده گؤستریلن ایش گئچرسیزدیر.
+اولا بیلر کی URL-ی یانلیش یازیب یوخسا یانلیش باغلانتی‌لا گلمیشسینیز.
+همده بو، {{SITENAME}} سایتی ایشلدن یازیلیمین خطاسینی گؤستره بیلر.',
+'nosuchspecialpage' => 'بئله اؤزل یارپاق یوخدور',
+'nospecialpagetext' => '<strong>سیز بیر یانلیش اؤزل یارپاغینی ایسته‌میسینیز.</strong>
+دوزگون اؤزل یارپاق‌لارین سیاهی‌سینی [[Special:SpecialPages|{{int:specialpages}}]]-ده گؤره بیلرسینیز.',
+
+# General errors
+'error' => 'خطا',
+'databaseerror' => 'دیتابیس خطاسی',
+'dberrortext' => 'بیر دیتابیس سورغو سینتکس خطاسی قاباغا گلدی.
+بو، یازیلیم‌دا بیر خطانی گؤستره بیلر.
+سون قصد ائدیلن دیتابیس سورغوسو بو ایدی:
+<blockquote><code>$1</code></blockquote>
+"<code>$2</code>" فونکسیاسی ایچیندن.
+دیتابیس بو خطانی قایتاردی: "<samp>$3: $4</samp>".',
+'dberrortextcl' => 'بیر دیتابیس سورغو سینتکس خطاسی قاباغا گلدی.
+سون قصد ائدیلن دیتابیس سورغوسو بو ایدی:
+"$1"
+"$2" فونکسیاسی ایچیندن.
+دیتابیس بو خطانی قایتاردی: "$3: $4"',
+'laggedslavemode' => "'''دیقت:''' یارپاق‌دا، سون دَییشیکلیکلرین اولماماسی ایمکانی وار.",
+'readonly' => 'دیتابیس باغلانیب',
+'enterlockreason' => 'باغلاما نَدَن‌لیگی و آچیلماغین تخمینی واختینی یازین',
+'readonlytext' => 'ایندی دیتابیس یئنی گیرمه‌لره و باشقا دَییشیکلیکلره باغلی‌دیر، اولا بیلر بو روتین دیتابیس باخیمی اوچون‌دور، قورتاران‌دان سونرا، عادی دورومونا قاییتاجاق.
+
+اونو باغلایان ایداره‌چی بو ایضاحی وئریب‌دیر: $1',
+'missing-article' => 'معلومات بازاسی، تاپیلماسی ایستنن "$1" $2 آدلی صحیفه‌‌يه عاید متنی تاپا بیلمه‌دی. 
+
+بۇ وضعیت صحیفه‌‌نین، سیلینمیش بیر صحیفه‌‌نین کئچمیش وئرسیياسی اوْلماسیندان قايناقلانا بیلر. 
+
+اگر نیيه بۇ دئيیلسه، پروْقرامدا بیر سهو ایله قارشیلاشمیش اوْلا بیلرسینیز. 
+خاهیش ائدیریک بۇنو بیر [[Special:ListUsers/sysop|administrator]]، URL نوْت ائده‌رک گؤندرین.',
+'missingarticle-rev' => '(تفتیش#: $1)',
+'missingarticle-diff' => '(فرق: $1, $2)',
+'readonly_lag' => 'ایکینجی درجه‌لی دیتابیس خیدمت‌چیلری، آنا دیتابیسه یئتیشماغا گؤره، بو دیتابیس اوتوماتیک باغلانیب‌دیر',
+'internalerror' => 'ایچ خطاسی',
+'internalerror_info' => 'ایچ خطاسی: $1',
+'fileappenderrorread' => 'اکلَنَنده، «$1»-نو اوخوماق مومکون دئییل‌دیر.',
+'fileappenderror' => '«$1»-نو «$2»-نا اکله‌مک اولانمادی.',
+'filecopyerror' => '«$1» فایلینی، «$2»-نا کوپی اولانمادی.',
+'filerenameerror' => '«$1» فایلین آدی «$2»-نا دَییشدیریلنمه‌دی.',
+'filedeleteerror' => '«$1» فایلی سیلیننمه‌دی.',
+'directorycreateerror' => '«$1» دایرکتوری‌سی سیلیننمه‌دی.',
+'filenotfound' => '«$1» فایلی تاپیلانمادی.',
+'fileexistserror' => '«$1» فایلینا یازیلانمادی: فایل اؤنجه‌دن واردیر.',
+'unexpected' => 'گؤزلنیمله‌ین دَیَر: «$1»=«$2»',
+'formerror' => 'خطا: فورم یوللانانمادی.',
+'badarticleerror' => 'بو ایشی بو یارپاق اوستون‌ده ائتمک اولماز.',
+'cannotdelete' => '«$1» فایل یا یارپاغی سیلیننمه‌دی.
+اولا بیلر اونو اؤنجه‌دن باشقا بیر اشلدن سیلمیش اولا.',
+'cannotdelete-title' => '«$1» یارپاغی سیلیننمیر',
+'delete-hook-aborted' => 'سیمک، چنگل‌له یاری‌دا قالدی.
+او هئچ بیر ایضاح وئرمه‌دی.',
+'badtitle' => 'پیس باشلیق',
+'badtitletext' => 'آختاریلان صحیفه‌‌ آدی سهودیر و يا بوْشدور، يا دا دۆزگون اوْلمايان دیللر‌آراسی، ياخود ویکیلرآراسی کئچید ایستیفاده ائدیلیب. 
+باشلیقلاردا ایستیفاده ائدیلمه‌سی قاداغان اوْلونان بیر و يا داها چوْخ سیمووْل ایستیفاده ائدیلمیش اوْلا بیلر.',
+'perfcached' => 'بو بیلگی، کَش اولوب‌دور و اولا بیلر گونجل اولماسین. چوخو {{PLURAL:$1|بیر نتیجه|$1 نتیجه}} کَش‌ده‌دیر.',
+'perfcachedts' => 'بو بیلگی کَش اولوب‌دور، سون دفعه $1 واختیندا گونجلیب‌دیر. چوخو {{PLURAL:$4|بیر نتیجه|$4 نتیجه}} کَش‌ده‌دیر.',
+'querypage-no-updates' => 'بو یارپاق‌دا گونجل‌له‌مک ایندی باغلانیب‌دیر.
+بورداکی بیلگیلر یئنی‌لشمیه‌جکلر.',
+'wrong_wfQuery_params' => 'wfQuery() اوچون یانلیش پارامئترلر وئریلیب‌دیر<br />
+فونکسیا: $1<br />
+سورغو: $2',
+'viewsource' => 'قایناغا باخ',
+'viewsource-title' => '$1 اوچون قایناغا باخین',
+'actionthrottled' => 'سیزین چالیشمانیزین قاباغی آلیندی',
+'actionthrottledtext' => 'آنتی-ایسپام حرکت‌لری گؤره، بیر حرکتی قیسا بیر زامان آرالیغیندا چوخئتمه‌نیز انگللندی، و سیز حدی آشمیسینیز. لطفاً بیر نئچه دقیقه سونرا یئنی‌دن یوخلایین.',
+'protectedpagetext' => 'بو صحیفه دیَیشدیرمک و باشقا ایشلر اوچون باغلی‌دیر.',
+'viewsourcetext' => 'سیز بو صحیفه‌نین مزمونونو گؤره و کؤچوره بیلرسینیز:',
+'viewyourtext' => "'''اؤز دَییشیکلیکلرینیز''' ین کودونو گؤروب و بو صحیفه‌یه کوپی ائده بیلرسینیز:",
+'protectedinterface' => 'بو صحیفه‌ده پروقرام تأمیناتی اوچون سیستئم بیلگی‌لری وار و سوی-ایستیفاده‌نین قارشی‌سینی آلماق اوچون محافظه اولونما‌لی‌دیر.',
+'editinginterface' => "'''دیقت:''' سیز بیر یازیلیم آرا-اوزونه یازی تعمین ائدن صحیفه‌نی دَییشدیرمک‌ده‌سینیز.
+بو صحیفه‌نی دَییشدیرمک، بو ویکی‌نی ایستیفاده ائدن باشقا ایستیفاده‌چیلرین گؤرونوشونو دَییشه‌جک‌دیر.
+چئویرمه‌لری بوتون ویکی‌لره آرتیریب یوخسا دَییشدیرمک اوچون لوطفاً [//translatewiki.net/ translatewiki.net]، مئدیاویکی‌نین یئرلیلشدیرمه پروژه‌سیندن ایستیفاده ائدین.",
+'sqlhidden' => '(اس‌کیوال سورغوسو گیزلی)',
+'cascadeprotected' => 'بو صحیفه دَییشیکلیکلر قاباغیندا قورونوب‌دور، چونکو بو آشاغیداکی، آبشاری {{PLURAL:$1|سئچمه‌سی|سئچمه‌لری}} سئچیلن، قورونان {{PLURAL:$1|صحیفه|صحیفه‌لر}} ایچینده‌دیر:
+$2',
+'namespaceprotected' => "سیز '''$1''' آدآلانینداکی یارپاقلارین دَییشمه‌سینه ایجازه‌نیز یوخدور.",
+'customcssprotected' => 'سیز بو CSS صفحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور نییه کی اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.',
+'customjsprotected' => 'سیز بو جاوااسکریپت صفحه‌سینین دَییشمه‌سینه ایجازه‌نیز یوخدور، نییه کی اون‌دا باشقا ایشلدنین شخصی تنظیملری واردیر.',
+'ns-specialprotected' => 'اؤزل یارپاقلاری دَییشمک اولماز.',
+'titleprotected' => 'بو آددا یارپاغین یارادیلماسی [[User:$1|$1]] ایشلدن طرفیندن باغلانیب‌دیر.
+اونون نَدَن‌لیگی بودور: "\'\'$2\'\'"',
+'filereadonlyerror' => '«$2» آنباری‌نین تکجه-اوخومالی دوروموندا اولدوغونا گؤره، «$1»-ی دَییشمک اولماز.
+
+اونو باغلایان ایداره‌چی بو ایضاحی وئریب‌دیر: $3',
+'invalidtitle-knownnamespace' => '«$2» آدآلان‌لی و «$3» یازی‌لی یانلیش باشلیق',
+'invalidtitle-unknownnamespace' => 'تانینمامیش $1 نومره‌لی آدآلان و «$2» یازی‌لی یانلیش باشلیق',
+'exception-nologin' => 'گیریش ائتمه‌میسینیز',
+'exception-nologin-text' => 'بو یارپاق یا ایشی گؤرمگه، بو ویکی‌یه گیرمه‌لیسینیز.',
+
+# Virus scanner
+'virus-badscanner' => "پیس تنظیملر: تانینمامیش ویروس یوخلایان: ''$1''",
+'virus-scanfailed' => 'یوخلاماق باشا چاتمادی (کود $1)',
+'virus-unknownscanner' => 'تانینمامیش آنتی‌ویروس:',
+
+# Login and logout pages
+'logouttext' => "'سیستئم‌دن چیخدینیز.'
+
+سیز {{SITENAME}} سایتینی آنونیم اولا‌راق ایستیفاده ائتمه‌یه داوام ائده بیلر و یا عینی، یاخود باشقا ایستیفاده‌چی آدی ایله <span class='plainlinks'>[$1 یئنی دن داخیل اولا]</span> بیلرسینیز. وئب-براوزئرین کئش یادداشینی تمیزلیندک بعضی صحیفه‌لر هله ده سیستئمده ایمیشسینیز کیمی گؤرونه بیلر.",
+'welcomeuser' => 'خوش گلمیسینیز, $1!',
+'welcomecreation-msg' => 'حسابینیز آچیلدی.
+[[Special:Preferences|{{SITENAME}}ترجیحلر]] دییشدیرمیی اونوتمایین.',
+'yourname' => 'ایستیفاده‌چی آدی:',
+'yourpassword' => 'رمز',
+'yourpasswordagain' => 'پسووردو یئنی‌دن یاز',
+'remembermypassword' => 'بو بیلگی‌سایاردا منیم گیریشیمی (چوخو $1 {{PLURAL:$1|گون}}ه قدر) یاددا ساخلا',
+'securelogin-stick-https' => 'گیرندن سونرا، HTTPS-ه باغلی قال',
+'yourdomainname' => 'سیزین دامنه:',
+'password-change-forbidden' => 'بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.',
+'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}} کاراکتئر اولمالی‌دیر.',
+'password-name-match' => 'رمزینیز ایستیفاده‌چی آدینیزلا فرق‌لی اولمالی‌دیر.',
+'password-login-forbidden' => 'بو ایستیفاده‌چی آدی و رمزی ایشلدمک، قاداغان اولوب‌دور.',
+'mailmypassword' => 'یئنی رمزی ایمیل ایله گؤندر',
+'passwordremindertitle' => '{{SITENAME}} سایتینا یئنی گئچیجی رمز',
+'passwordremindertext' => 'بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له) {{SITENAME}} ($4) اوچون یئنی رمز ایستگی وئریب‌دیر. «$2» ایستیفاده‌چیسی اوچون یئنی بیر رمز دوزلیب و «$3»-ه تنظیم اولوب‌دور. بو سیزین ایسته‌دیگینیز اولسا، گیریب و بیر یئنی رمز وئرمک لازیم‌دیر.
+بو گئچیجی رمز، {{PLURAL:$5|بیر|$5}} گون‌ده واختی گئچه‌جک‌دیر.
+
+بو ایستگی باشقا بیر کس وئریب‌سه، یوخسا سیز رمزینیزی یادا گئتیرمیسیزسه، و داها اونو دَییشمک ایسته‌میرسینیزسه، بو مئساژی نظره توتماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
+'noemail' => '«$1» ایستیفاده‌چی‌یه ایمیل آدرسی قئید اولماییب‌دیر.',
+'noemailcreate' => 'دوزگون بیر ایمیل آدرسی وئرمه‌لیسینیز',
+'passwordsent' => '«$1»-نا قئید اولونان ایمیل آدرسینه، یئنی بیر رمز گؤندریلدی.
+اونا آلان‌دان سونرا یئنی‌دن گیرین.',
+'blocked-mailpassword' => 'سیزین آی‌پی آدرسینیز دَییشیک وئرمه‌یه باغلانیب و سوءاستفاده قاباغی آلماق اوچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوخدور.',
+'eauthentsent' => 'سیزین سئچیلمیش ایمیل آدرسینه، دوغرولاماق اوچون بیر ایمیل گؤندریلدی.
+هر یئنی بیر ایمیل گؤندرمک‌دن اؤنجه، بو حسابین دوغرودان سیزین اولدوغونو گؤسترمک اوچون، او ایمیل‌ده‌کی ایشلری گؤرمه‌لیسینیز.',
+'throttled-mailpassword' => 'سون {{PLURAL:$1|ساعات|$1 ساعات}}‌دا سیزه بیر رمز یادا سالما گؤندریلیب‌دیر.
+سوءاستفاده قاباغین آلماق اوچون، هر {{PLURAL:$1|ساعات|$1 ساعات}}‌دا یالنیز بیر رمز یادا سالما گؤندریلر.',
+'mailerror' => 'ایمیل گؤندرمه خطاسی: $1',
+'acct_creation_throttle_hit' => 'سیزین آی‌پی آدرسینیزی ایشلدن زیارتچیلر، سون گون‌ده {{PLURAL:$1|بیر حساب|$1 حساب}} یارادیبلار کی ان چون ایجازه وئریلن‌دیر.
+اونا باخاراق، بو آی‌پی آدرسی ایشلدن زیارتچیلر، بو زامان‌دا، داها آرتیق حساب یارادابیلمزلر.',
+'emailauthenticated' => 'ایمیل آدرسینیز $3 تاریخینده ساعات $2-ده دوغرولانیب‌دیر.',
+'emailnotauthenticated' => 'سیزین ایمیل آدرسینیز هله دوغرولانماییب‌دیر.
+آشاغیداکی اؤزل‌لیکلر اوچون هئچ بیر ایمیل گؤندریلمه‌یه‌جک‌دیر.',
+'noemailprefs' => 'بو خیدمتلردن يارارلانماق اوچون ترجیح لریندا ائ-مکتوب اونوانینی گؤستر.',
+'emailconfirmlink' => 'ایمیل-پوست اونوانینی تصدیق ائت',
+'invalidemailaddress' => 'بو ایمیل آدرس، یانلیش فورمتی اولدوغو اوچون، قبول اولماز.
+لوطفاً دوزگون فورمت‌لی آدرس وئرین، یوخسا اونو بوش بوراخین.',
+'cannotchangeemail' => 'حساب ایمیل آدرسلری بو ویکی‌ده دَییشیلنمزلر.',
+'emaildisabled' => 'بو سایت ایمیل گؤندرنمز.',
+'accountcreated' => 'حساب یارادیلدی',
+'accountcreatedtext' => '$1 ایستیفاده‌چی حسابی یارادیلیب‌دیر.',
+'createaccount-title' => '{{SITENAME}} اوچون حساب یارادیلماسی',
+'createaccount-text' => 'بیر کس، سیزین ایمیل آدرسینیزه {{SITENAME}} ($4) سایتیندا «$2» آدی و «$3» رمزی ایله بیر حساب آچیب‌دیر. سیز گرک گیریش ائدیب و رمزینیزی ایندی دَییشدیره‌سیز.
+
+بو حساب یانلیش دوزلیب‌سه، بو مئساژا محل قویمایابیلرسیز.',
+'usernamehasherror' => 'ایستیفاده‌چی آدیندا hash حرفلری اولا بیلمز',
+'login-throttled' => 'سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.
+لوطفاً یئنی‌دن چالیشماق‌دان اؤنجه بیر آز دؤزون.',
+'login-abort-generic' => 'سیزین گیریشینیز باشاری‌سیز اولدو - دایاندیریلدی',
+'loginlanguagelabel' => 'دیل: $1',
+'suspicious-userlogout' => 'سیزین چیخیش ایستگینیز رد اولوندو. بو، براوزرین یا پروکسی-کَشلمه‌سینین دوزگون ایشله‌مه‌مه‌سین‌دن قایناق‌لانیر.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'پی‌اچ‌پی‌نین 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' => 'لغو ائت',
+'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 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.
+سیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.',
+'passwordreset-emailtext-user' => '{{SITENAME}} سایتیندا، $1 ایستیفاده‌چی، سیزین اوردا ($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
+'bold_sample' => 'قالین یازی',
+'bold_tip' => 'قالین یازی',
+'italic_sample' => 'اَیری یازی',
+'italic_tip' => 'اَیری یازی',
+'link_sample' => 'باغلانتی باشلیغی',
+'link_tip' => 'ایچری باغلانتی‌سی',
+'extlink_sample' => 'http://www.example.com باغلانتی باشلیغی',
+'extlink_tip' => 'خاریجی باغلانتی (http:// اؤن‌اکی‌نی اونوتمایین)',
+'headline_sample' => 'باشلیق متنی',
+'headline_tip' => '۲ یوکسک باشلیق',
+'nowiki_sample' => 'فورمت‌لشدیریلمه‌میش یازی‌نی بورا داخیل ائدین',
+'nowiki_tip' => 'ویکی فورمت‌لندیرمه‌سینی سایما',
+'image_tip' => 'یئرلشدیریلمیش فایل',
+'media_tip' => 'فایل باغلانتی‌سی',
+'sig_tip' => 'سیزین ایمضانیز واخت ایله',
+'hr_tip' => 'دوزئی خط (آز ایشلدین)',
+
+# Edit pages
+'summary' => 'قیساسی:',
+'subject' => 'قونو/باشلیق:',
+'minoredit' => 'بو بیر کیچیک دَییشدیرمه‌دیر',
+'watchthis' => 'بو صفحه‌نی ایزله',
+'savearticle' => 'صحیفه‌نی قئید ائت',
+'preview' => 'اؤن‌گؤستریش',
+'showpreview' => 'اؤن‌گؤستریش',
+'showlivepreview' => 'دیری اؤن‌گؤستریش',
+'showdiff' => 'دَییشیکلیکلری گؤستر',
+'anoneditwarning' => "'''دیقت:''' سیز سیستئمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بو صفحه‌نین دییشیک تاریخچه‌سین‌ده یازیلاجاق‌دیر.",
+'anonpreviewwarning' => "''سیستمه گیرمه‌میسینیز. قئید ائتمک‌له، سیزین آی‌پی آدرسینیز بو صحیفه‌نین گئچمیشین‌ده ثبت اولوناجاقدیر.''",
+'missingsummary' => "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «{{int:savearticle}}» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
+'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}}}} باخا],
+و يا صحیفه‌‌نی  [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> ائده بیلرسینیز.',
+'missing-revision' => '«{{PAGENAME}}» صحیفه‌سی اوچون $1 نومره‌لی نوسخه یوخدور.
+
+عموماُ بو ایشکال، واختی گئچمیش بیر باغلانتی ایله سیلینمیش بیر صحیفه‌یه گلنده، قاباغا گلر.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیلمک سیاهی]‌سینده باشقا بیلگیلر اولا بیلر.',
+'userpage-userdoesnotexist' => '«$1» ایستیفاده‌چی حسابی یارانماییب‌دیر.
+بو صحیفه‌نی یارادماق یوخسا دَییشدیرمگینه بیر ده باخین.',
+'userpage-userdoesnotexist-view' => '«$1» ایستیفاده‌چی حسابی یارانماییب‌دیر.',
+'blocked-notice-logextract' => 'بو ایستیفاده‌چی ایندی باغلانیب‌دیر.
+باغلاماق سیاهی‌سینده‌کی سون یازی آشاغیدا قایناق اوچون گلیب‌دیر:',
+'clearyourcache' => "' 'قئید:' یازدیق‌دان سونرا دییشیک‌لیک‌لری گؤرمک اوچون براوزئرینیزین کئش یادداشیندا تمیزلمه‌نیز لازیم اولا بیلر.
+* 'فایرفاکس / سافاری:''Shift'' دویمه‌سینه باسین \"یئنی‌دن یوکله\"-ا داخیل اولون یا دا ''Ctrl-F5'' یا ''Ctrl-R'' ائدین (ماج اوچون ''⌘-R'').
+* 'گووگل کروم:'''Ctrl+Shift+R'' باسین. (ماج اوچون ''⌘-Shift-R'')
+* 'اینترنت ایکسپئلور:''' کلید ''Ctrl'' باسین یئنی‌لئ 'یئ داخیل اولون یا دا ''Ctrl-F5'' ائدین.
+* 'اوپئرا:' آلت‌لری → سئچیملر 'دن اؤنبئللیغی ''Tools &rarr; Preferences'' تمیزلیین.",
+'usercssyoucanpreview' => "'''اؤنری:''' یئنی سی‌اس‌اس-ی قئید ائتمک‌دن اؤنجه، یوخلاماق اوچون، «{{int:showpreview}}» دویمه‌سینی ایشلدین.",
+'userjsyoucanpreview' => "'''اؤنری:''' یئنی جاوااسکریپتی قئید ائتمک‌دن اؤنجه، یوخلاماق اوچون، «{{int:showpreview}}» دویمه‌سینی ایشلدین.",
+'usercsspreview' => "'''خاتیرلادیریق کی، سیز یالنیز سی‌اس‌اس-ده سیناق گؤستریشی ائتمیسینیز.'''
+''''بو هله یادداشدا ساخلانیلماییب!'''",
+'userjspreview' => "'خاتیرلادیریق کی، سیز یالنیز سی اس اس -ده تئست/سیناق گؤستریشی ائتمیسینیز.'
+'بو هله یادداشدا ساخلانیلماییب!'",
+'sitecsspreview' => "'''خاتیرلادیریق کی، سیز یالنیز سی‌اس‌اس-ده سیناق گؤستریشی ائتمیسینیز.'''
+'''بو هله یادداشدا ساخلانیلماییب!'''",
+'sitejspreview' => "'خاتیرلادیریق کی، سیز یالنیز ژاواسجریپت کودوندا سیناق گؤستریشی ائتمیسینیز.'
+'بو هله یادداشدا ساخلانیلماییب!'",
+'userinvalidcssjstitle' => 'خاتیرلادیرق:\' \'"$1" آدییلا بیر پوشه یوخ‌دور. پوشه-آدی.css و. js فایل‌لارینین آدلاری کیچیک حرف ایله یازماسی لازیم‌دیر، یعنی {{ns:user}}: تمل / vector.css دئییل، {{ns:user}}: تمل / Vector.css.',
+'updated' => '(گونجل‌لندی)',
+'note' => "'''دیقت:'''",
+'previewnote' => "'''بونون ساده‌جه بیر سیناق گؤستریشی اولدوغونو نظرده آلین.'''
+سیزین دییشیکلرینیز هله قئید اولونماییب!",
+'continue-editing' => 'دَییشدیرمه یئرینه گئت',
+'previewconflict' => 'بو سیناق گؤستریشی‌دیر و یادداشدا ساخلایاجاغینیز تق‌دیرده متنین دییشدیر صحیفه‌سی‌نین یوخاری حیسه‌سینده نتیجه‌نین نئجه اولاجاغینی گؤستریر.',
+'session_fail_preview' => "'''اوزر ایستییریک! سیزین دییشتیرینیز‌ ساخلانیلمادی. لطفاً بیر داها تکرار ائدین. پروبلئم حل اولونماسا حسابینیزدان [[Special:UserLogout|چیخین]]  و یئنی‌دن داخیل اولون.'''",
+'session_fail_preview_html' => "'''اوزر ایستییریک! داخیل وئری‌سی‌نین ایتمه‌سین‌دن گؤره تنظیملمه‌نیزی اعمال کئچیره بیلمیجیی.' '
+
+' چونکی {{SITENAME}} سایتیندا raw هتمل تأثیرین‌دیر،تا جاوااسکریپت هوجوم‌لارینا تدبیر اولا‌راق گیزلنمیش‌دیر.'
+
+' 'گر بو حاق‌لی بیر تنظیملمه گیریش میسئ، لطفاً یئنی‌دن جهد ائدین. اگر هله چالیشمازسا، [[Special:UserLogout|خارج شوید]] یئنی‌دن ایجلاس آچماغی یوخلایین.' '",
+'token_suffix_mismatch' => "'' ' ديَیشیکلیگی‌نین گئری چئوریلدی، چونکی آلیجی‌نین تنزیمله‌مه کوتوجوغونداکی دورغو ایشاره‌لرینی پوزدو. 
+ديَیشیکلیگی‌نین، صحیفه‌‌ متنینده پوزولماغی اؤنله‌مک اوچون گئری چئوریلدی. 
+اگر پروبلئملی بیر wئب-باسئد آنونیم پروکسی خیدمتی ایستیفاده بو حادثه‌‌ بضا رئاللاشا بیلر.'' '",
+'edit_form_incomplete' => "'''دییشیک‌لیک فورماسی اوچون بعضی سئروئرلره ایشلمه‌دی؛ ائتدیگینیز دییشیک‌لیک‌لر بوزولمامیشتیر، نظردن کئچیریب یئنی‌دن سینایین.'",
+'editing' => '<font style="color:red">$1</font> دییشدیریلیر',
+'creating' => '$1 یارادیلیر',
+'editingsection' => '$1 دَییشدیریلیر (بؤلوم)',
+'editingcomment' => '$1 دَییشدیریلیر (یئنی بؤلوم)',
+'editconflict' => 'عینی واختدا دییشدیرمک: $1',
+'explainconflict' => "سیز صحیفه‌‌نی رئداکته باشقا بیری ده ديَیشیکلیک ائتدی. 
+يوخاریداکی يازی صحیفه‌‌نین بو آنکی حالینی گؤستریر. 
+سیزین ديَیشیکلیکلری‌نین آلتا گؤستریلمیشدیر. سون دئغیشیکلئرینیزی يازی‌نین ایچینه داخیل ائتمه‌يینیز لازیم اولاجاق. 
+«{{int:savearticle}}» ائ باسدیغینیزداع' ' يالنیزعع' يوخاریداکی يازی يازیلاجاق.",
+'yourtext' => 'یازینیز',
+'storedversion' => 'قئید ائدیلمیش نوسخه',
+'nonunicodebrowser' => "' 'دیققت: آختاریش برنامه نیز اویغون دئییل.
+صحیفه‌لری اعتبارلا دییشدیرمیینیزه ایجازه وئرمک اوچون: آسجیی اولمایان کاراکتئرلر دییشدیرمه قوتوسوندا اونالتیلیک کودلار اولا‌راق گؤرونه‌جک.' '",
+'editingold' => "'دیققت! سیز بو صحیفه‌نین کؤهنه نوسخه سین دییشدیر ائدیرسینیز. مقالنی یادداشدا ساخلایاجاغینیز حالدا بو نوسخه سونرا ائدیلمیش هر بیر دییشیک‌لیک ایتیریله‌جک.'",
+'yourdiff' => 'فرقلر',
+'copyrightwarning' => 'خاهیش اولونور دقته آلاسینیز کی، {{SITENAME}}داکی بوتون فالیت‌لرینیز $2 لیسئنزیاسینا تابع اولدوغو حساب ائدیلیر (تفرروات اوچون باخ: $1). اگر یازدیق‌لارینیزین اساس‌لی شکیلده رئداکته ائدیلمه‌سینی و ایستنیلدیگی واخت باشقا یئره اؤتورولمه‌سینی ایستمیرسینیزسه، یازی‌لارینیزی بورادا درج ائتمیین.
+<br />
+سیز عینی زاماندا سؤز وئریرسینیز کی، بو یازی‌لاری سیز اؤزونوز یازمیسینیز و یا اونلاری هامییا آچیق موهیت‌دن یا دا بونا بنزر منبع‌دن کؤچورموسونوز.
+
+----
+
+</div> ایستیلئ="فونت-weight: بولد؛ فونت-سیزئ: 110%؛ جولور:رئد؛">موللیف حقوق‌لاری ایله قورونموش هئچ بیر ایشی ایجازه‌سیز درج ائتمیین!</div>',
+'copyrightwarning2' => 'خاهیش ائدیریک، {{SITENAME}} سایتینا ائده‌جه‌یم بوتون روسوم دیگر عضو‌لر طرفین‌دن دوزئنلئنئبیلئجئغینی، دییش‌دیریله و یا سیلینئبیلئجئغینی خاتیرلایین. یازی‌لارینین مئرهامئتسیزجئ دئغیشتیریلی بیلمسینه راضی‌لیق گؤسترمیرسه بورا ایشتیراک ائتمیین. <br />
+آیریجا بو علاوه یازینی سیزین یازدیغینیزدان یا دا سربست کوپیالاما ایجازه‌سی وئرن بیر قایناق‌دان کوپیالادیغینیزی بیزه اؤهده‌لرینه ائتمکدسینیز (دئتال‌لار اوچون ایستیناد: $1).',
+'longpageerror' => "خطا: داخیل متنین اوزون‌لوغو قبول ائدیله بیلر ان چوخ اوزونلوق اولان {{PLURAL: $2 | بیر کیلوبایت | $2 کیلوبایت}} دان چوخ‌دور و {{PLURAL: $1 | بیر کیلوبایت | $1 کیلوبایت}} بؤیوکلوگونده‌دیر.'
+دییشیک‌لیگی‌نین کایدئدیلئمئز.",
+'readonlywarning' => "'''دیققت: باخیم سببی ایله وئریلن‌لر بازاسی بو آندا کیلیدلی‌دیر. بو سببله دییشیک‌لیک‌لری‌نین بو آندا قئیدئدیل میجاغدیر. یازدیق‌لارینیزی باشقا بیر پرونده ده آلیب ساخلایا و داها سونرا تکرار بورا گتیریب یازا بیلرسینیز '
+
+کیلیدله‌ین خیدمتله بو شرحی علاوه ائتمیش‌دیر: $1",
+'protectedpagewarning' => "' 'خاطیرلیریق: بو ​​صحیفه باغلانیب دیر و یالنیز مودیر اولان‌لار طرفین‌دن دییش‌دیریله بیلر.'
+سون گونده‌لیک گیردی‌سی ایستیناد مقصدلی آشاغیدا وئریلمیش‌دیر:",
+'semiprotectedpagewarning' => "'قئید:' بو صحیفه محافظه‌لی اولدوغو اوچون یالنیز قئیدیات‌دان کئچمیش ایستیفاده‌چی‌لر دییشدیر ائده بیلرلر.",
+'cascadeprotectedwarning' => "'''خاطیرلایریق:''' بو صحیفه بو یئرده {{PLURAL:$1|صحیفهٔ|صحیفه‌لر}} یئرلشمیه یه گوره آبشاری- حفظ اولونوب آلتیندا باغلانیب بونجه مودیر فقط ائلیه بیله لر دییشدیر ائده بیلسین لر",
+'titleprotectedwarning' => "'دیققت! بو صحیفه محافظه‌لی‌دیر، یالنیز [[Special:ListGroupRights|ایجازه سی اولان]] ایستیفاده‌چی‌لر اونو دییشدیر ائده بیلرلر.'",
+'templatesused' => '{{PLURAL:$1|شابلون}} بو صفحه‌ده ایشلنیب‌دیر:',
+'templatesusedpreview' => '{{PLURAL:$1|بیر|$1}} شابلون بو اؤن‌گؤستریش‌ده ایشلنیب‌دیر:',
+'templatesusedsection' => '{{PLURAL:$1|شابلون}} بو بؤلمه‌ده ایشلنیب‌دیر:',
+'template-protected' => '(قورونوب)',
+'template-semiprotected' => '(یاریم‌قورونموش)',
+'hiddencategories' => 'بو صحیفه {{PLURAL:$1|بیر گیزلی دسته‌یه|$1 گیزلی دسته‌لره}} عایددیر:',
+'nocreatetitle' => 'صحیفه یاراتما محدودلاشدیریلیب.',
+'nocreatetext' => '{{SITENAME}} یئنی صحیفه یارادماق ایمکانی‌نی محدودلاشدیریب‌دیر.
+سیز دالی دؤنوب و اؤنجه‌دن اولان بیر صحیفه‌نی دَییشدیره بیلرسینیز، یا دا [[Special:UserLogin|گیریب یوخسا یئنی حساب آچین]].',
+'nocreate-loggedin' => 'سیزین یئنی صحیفه‌لر یاراتماغا ایجازه‌نیز یوخدور.',
+'sectioneditnotsupported-title' => 'بؤلوم دییشدیرمه‌سی دستک‌لنمیر',
+'sectioneditnotsupported-text' => 'بو صحیفه‌ده بؤلوم دَییشدیرمه‌سی دستکلنمیر.',
+'permissionserrors' => 'ایزین خطاسی',
+'permissionserrorstext' => 'سیز آشاغیداکی {{PLURAL:$1|دلیل|دلیل‌لر}}ه گؤره، او ایشه ایجازه‌نیز یوخدور.',
+'permissionserrorstext-withaction' => 'سیز آشاغیداکی {{PLURAL:$1|دلیل|دلیل‌لر}}اوچون، $2 ایشینه ایجازه‌نیز یوخدور.:',
+'recreate-moveddeleted-warn' => "'''دیقت: سیز اؤنجه‌ده سیلینمیش بیر صفحه‌نی یئنی‌دن یارادیرسینیز.'''
+
+بو صفحه‌نین یئنی‌دن یارادماغی‌نین نه‌قدر اویغون اولدوغونو گرک نظرده آلاسینیز.
+بو صفحه‌نین سیلمک و آپارماق گئچمیشی بوردا گؤستریلیب‌دیر:",
+'moveddeleted-notice' => 'بو یارپاق سیلین‌میش‌دیر
+معلومات اوچون آشاغیدا بو یارپاق‌ین تاریخچه‌سیندن مووافیق سیلمه قئيدلری گؤستریلمیش‌دیر.',
+'log-fulllog' => 'بوتون بیلگی‌لری گؤستر',
+'edit-hook-aborted' => 'دوزلیش‌لر قارماق-پروسئ‌دور طرفین‌دن گئری قایتاریلیب.
+علاوه ایزاهات وئریلمه‌ییب.',
+'edit-gone-missing' => 'صحیفنی یئنی لمک مومکون دئییل.
+چوخ گومان کی، صحیفه سیلینمیش‌دیر.',
+'edit-conflict' => 'سیزله برابر دییشدیرمه',
+'edit-no-change' => 'سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.',
+'edit-already-exists' => 'یئنی صحیفنی یاراتماق مومکون دئییل.
+بئله کی، بو آددا صحیفه آرتیق مؤوجوددور.',
+'defaultmessagetext' => 'دفالت دانیشیق متنی',
+'invalid-content-data' => 'اعتبارسیز مضمون معلوماتی',
+'content-not-allowed-here' => '"$1" مقاله‌سینه، [[$2]] صحیفه‌سینده ایجازه وئریلممیش دیر.',
+
+# Content models
+'content-model-wikitext' => 'ویکی متن',
+'content-model-text' => 'ساده متن',
+'content-model-javascript' => 'جاوااسکریپت',
+'content-model-css' => 'سی‌اس‌اس',
+
+# Parser/template warnings
+'expensive-parserfunction-warning' => 'خبردارلیق: بو ​​صحیفه چوخ چوخ زنگین ییغیجی تجزیه ائدن چاغیریشی دستورلار ائدیر.
+
+بو $2 مراجعت آز اولما‌لی، بو آندا {{PLURAL:$2|چاغیرش وار|چاغریش وار}} و اینک {{PLURAL:$1|چاغیرش وار|$1چاغریش وار}} .',
+'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' => 'تکرارلاما دونمه سی قبول ائدیلدی',
+
+# "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' => 'وئرسیياسی',
+'revision-info' => '$2 طرفیندن يارادیلمیش $1 تاریخلی ديَیشیکلیک',
+'previousrevision' => 'اونجه‌کی وئرسیيا',
+'nextrevision' => 'سونراکی حالی',
+'currentrevisionlink' => 'سون نوسخه',
+'cur' => 'ایندی',
+'next' => 'سونراکی',
+'last' => 'اؤنجه',
+'page_first' => 'ایلک',
+'page_last' => 'سون',
+'histlegend' => "فرقلری سئچمه: موقاییسه ائتمک ایسته‌دیگینیز دییشیک‌لیکلرین یانینداکی گیرده دویمه‌لره علامت قویون و سونرا Enter-ی ووروب یوخسا آشاغیداکی اویمه‌نی وورون.<br />
+آچیقلاما:'''({{int:cur}})''' =سون نوسخه ایله فرقلر ، '''({{int:last}})''' = اؤنجه‌کی نوسخه ایله فرقلر، '''{{int:minoreditletter}}''' = کیچیک دییشیک‌لیک.",
+'history-fieldset-title' => 'کئچمیشی آختار',
+'history-show-deleted' => 'یانلیز سیلینن‌لر',
+'histfirst' => 'ان یئنی',
+'histlast' => 'ان اسکی',
+'historysize' => '({{PLURAL:$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' => "بو ديَیشیکلیک بو صحیفه‌دن '''سیلینیب دیر.'''",
+'rev-deleted-text-unhide' => "بو صحیفه رئویزیونو 'سیلینمیش.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاهه سیلینمش] دئتال‌لاری بیلر.
+بیر خیدمتله اولا‌راق اگر داوام ائتسه‌نیز [$1 بو رئویزیونو هله گؤره بیلرسینیز].",
+'rev-suppressed-text-unhide' => 'صحیفه‌نین بو نوسخه سی سیلینیب.
+مومکون‌دور کی، بونون سببی [{{fullurl:{{#Special:Log}}/delete|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}}/delete|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' => "[[:$1]] صحیفه‌سی‌نین {{PLURAL:$2|سئچیلمیش نوسخه لری|سئچیلمیش نوسخه لری }}:'",
+'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-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' => '[[:$1]]-ین {{PLURAL:$3|بیر|$3}} نوسخه‌سی باشاری‌لا [[:$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" صحیفه‌سی‌نین کئچمیشی',
+'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' => 'بو فرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخه‌سی تاپیلانمادی.
+
+عموماً بو خطا، سیلینن بیر صحیفه‌یه واختی گئچمیش بیر فرق باغلانتی‌سیلا گلمک ایله آرا گلر.
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}سیلمک سیاهی‌سی]ندا باشقا بیلگیلر اولا بیلر.',
+
+# Search results
+'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'''-ی آختاردینیز",
+'toomanymatches' => 'چوخلو سونوچلار تاپیلدی، لوطفاً باشقا بیر سورغویلا چالیشین.',
+'titlematches' => 'صحیفه‌‌ آدی عینیدیر',
+'notitlematches' => 'عینی صحیفه باشلیغی تاپیلمادی',
+'textmatches' => 'یازی عینی‌دیر',
+'notextmatches' => 'هئچ بیر بنزر صحیفه یازی‌سی تاپیلمادی',
+'prevn' => 'اولکی{{PLURAL:$1|$1}}',
+'nextn' => 'سونراکی{{PLURAL:$1|$1}}',
+'prevn-title' => 'اولکی بیر $1 {{PLURAL:$1|نتیجه}}',
+'nextn-title' => 'سونراکی $1 {{PLURAL:$1|سونوج|سونوجلار}}',
+'shown-title' => 'هر صحیفه‌ده {{PLURAL:$1|بیر|$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' => 'مولتی‌مئدیا',
+'searchprofile-everything' => 'هرشئی',
+'searchprofile-advanced' => 'گلیشمیش',
+'searchprofile-articles-tooltip' => '$1 ده / دا آختار',
+'searchprofile-project-tooltip' => '$1 ده / دا آختار',
+'searchprofile-images-tooltip' => 'فایل اوچون آختار',
+'searchprofile-everything-tooltip' => 'بوتون متنلری آختار (دانیشیق صحیفه‌لری اولماقلا)',
+'searchprofile-advanced-tooltip' => 'تاپشیریلان صحیفه فضالاریندا آختار',
+'search-result-size' => '$1 ({{PLURAL:$2|۱ سؤزجوک|$2 سؤزجوک}})',
+'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-interwiki-caption' => 'قارداش پروژه‌لر',
+'search-interwiki-default' => '$1 سونوج:',
+'search-interwiki-more' => '(داها)',
+'search-relatedarticle' => 'ایلگیلی',
+'mwsuggest-disable' => 'AJAX اؤنرلرینی باغلا',
+'searcheverything-enable' => 'بوتون آدفضالاریندا آختار',
+'searchrelated' => 'ایلگیلی',
+'searchall' => 'بوتون',
+'showingresults' => "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$1|'''بیر'''|'''$1'''}} سونوجا قدر گؤستریلیر.",
+'showingresultsnum' => "آشاغیدا نومره '''$2'''-دن باشلایان {{PLURAL:$3|'''بیر'''|'''$3'''}} سونوج گؤستریلیر.",
+'showingresultsheader' => "'''$4''' اوچون {{PLURAL:$5|'''$3'''-دن '''$1''' نتیجه|'''$3'''-دن '''$1-$2''' نتیجه}}",
+'nonefound' => "'''دیقت:''' یالنیز بعضی آدفضالاری آختاریلیر. سورغونوزو ''all:'' اؤن‌اکی‌نی آرتیرماقلا بوتون یئرلرده (او جومله‌دن دانیشیق صحیفه‌لری، شابلونلار و سونرا) آختارین، یوخسا ایسته‌دیگینیز آدفضاسینین آدینی اؤن‌اک کیمی آرتیرین و یالنیز اوردا آختارین.",
+'search-nonefound' => 'سیزین سورونوزا اویغون نتیجه تاپیلمادی.',
+'powersearch' => 'اؤزل آختاریش',
+'powersearch-legend' => 'گلیشمیش آختاریش',
+'powersearch-ns' => 'آدفضالاریندا آختار',
+'powersearch-redir' => 'یوللاندیرمالاری لیست ائت',
+'powersearch-field' => 'آختار:',
+'powersearch-togglelabel' => 'یوخلا:',
+'powersearch-toggleall' => 'بوتون',
+'powersearch-togglenone' => 'هئچ بیری',
+'search-external' => 'ائشیک آختاریش',
+'searchdisabled' => '{{SITENAME}} آختاریشی باغلانیب‌دیر.
+ایندی گوگل ایله آختارا بیلرسینیز.
+دیقت ائدین کی اونون {{SITENAME}} ایندئکسی، کؤهنه اولا بیلر.',
+
+# Quickbar
+'qbsettings' => 'سورعت پانئلی',
+'qbsettings-none' => 'هئچ بیری',
+'qbsettings-fixedleft' => 'سولا ثابیت',
+'qbsettings-fixedright' => 'ساغا ثابیت',
+'qbsettings-floatingleft' => 'سولا اوزن',
+'qbsettings-floatingright' => 'ساغا اوزن',
+'qbsettings-directionality' => 'ثابیت، سیزین دیل یازینیزین یولویلا',
+
+# Preferences page
+'preferences' => 'ترجیحلر',
+'mypreferences' => 'ترجیحلر',
+'prefs-edits' => 'دَییشمه‌لرین سایی:',
+'prefsnologin' => 'گیرمه‌میسینیز',
+'prefsnologintext' => 'ایستیفاده‌چی تنظیملرینی دَییشمک اوچون، <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} گیرمه‌لیسینیز]</span>.',
+'changepassword' => 'رمزی دَییشدیر',
+'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' => 'چوخو {{PLURAL:$1|بیر|$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' => 'بو ساحنی گیزلی پاروللا دولدورماغینیز سیزین ایزلمه سیاهینیز اوچون آراس‌اس یاییم کانا‌لی یارادا‌جاق‌دیر.
+بو پارولو بیلن هر کس ایزلمه سیاهینیزی اوخویا بیلر، بو سبب‌دن اعتبارلی پارول سئچین.
+تصادفی یوللا سئچیلمیش بو پارول‌دان ایستیفاده ائده بیلرسینیز: $1',
+'savedprefs' => 'سئچیمینیز قئيد ائدیلدی.',
+'timezonelegend' => 'چاغ بؤلگه‌سی:',
+'localtime' => 'یئرلی چاغ:',
+'timezoneuseserverdefault' => 'ویکی اؤن‌فرضینی ایشلد ($1)',
+'timezoneuseoffset' => 'باشقا (چاغ فرقینی بیلدیر)',
+'timezoneoffset' => 'واقت فرقی¹:',
+'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' => 'فایل‌لار',
+'prefs-custom-css' => 'شخصی سی‌اس‌اس',
+'prefs-custom-js' => 'شخصی جاوااسکریپت',
+'prefs-common-css-js' => 'بوتون قابیقلار اوچون پایلاشمیش سی‌اس‌اس/جاوااسکریپت:',
+'prefs-reset-intro' => 'ترجیحلرینیزی سایتین ایلک فرض ائدیلنلرینه دؤندرمک اوچون، بو صحیفه‌دن ایستیفاده ائده بیلرسینیز.
+بو ایش قایتاریلا بیلمز.',
+'prefs-emailconfirm-label' => 'ایمیل دوغرولاماسی:',
+'prefs-textboxsize' => 'دَییشدیرمه قوتوسونون اؤلچو',
+'youremail' => 'ایمیل:',
+'username' => 'ایستیفاده‌چی آدی:',
+'uid' => 'ایستیفاده‌چی ID:',
+'prefs-memberingroups' => '{{PLURAL:$1|گروپ|گروپلار}} عوضوو:',
+'prefs-registration' => 'یازیلماق واختی:',
+'yourrealname' => 'دوغرو آد',
+'yourlanguage' => 'دیل:',
+'yourvariant' => 'دیل واریانتی:',
+'prefs-help-variant' => 'بو ویکی‌نین ایچینده‌کیلری‌نین گؤستریلدیگی اوچون سئچدیگینیز واریانت یوخسا اورتوقرافی.',
+'yournick' => 'یئنی ایمضا:',
+'prefs-help-signature' => 'دانیشیق صحیفه‌لرینده یاخیشلار گرک «<nowiki>~~~~</nowiki>» ایله ایمضالانالار. بو نیشان اوتوماتیک‌جه سیزین آدینیز و تاریخه دؤنه‌جک‌دیر.',
+'badsig' => 'یانلیش خام ایمضا.
+اچ‌تی‌ام‌ال تگ‌لرینی یوخلایین.',
+'badsiglength' => 'ایمضانیز چوخ اوزون‌دور.
+او گرک {{PLURAL:$1|بیر|$1}} حرف‌دن اوزون اولمایا.',
+'yourgender' => 'جینس:',
+'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|daxil olmalısınız]].',
+'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' => 'آی‌پی باغلاماقلاری، اوتوماتیک باغلاماقلاری و سیرا باغلاماقلاریندان گئچ',
+'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' => '$1-ین گروپ عوضولوغو، $2-دن $3-ه دَییشدیریلدی',
+'rightslogentry-autopromote' => 'اوتوماتیک اولاراق $2-دن $3-ه مقامی آرتیریلدی',
+'logentry-rights-rights' => '$1 $3-ین گروپ عوضولوگونو $4-دن $5-ه دَییشدیردی',
+'logentry-rights-rights-legacy' => '$1، $3-ین گروپ عوضولوگونو دَییشدیردی',
+'logentry-rights-autopromote' => '$1-ین مقامی اوتوماتیک $4-دن $5-ه آرتیریلدی',
+'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|دَییشیکلیک}}',
+'recentchanges' => 'سون دَییشیکلر',
+'recentchanges-legend' => 'سون دییشیکلر سئچمه‌لری',
+'recentchanges-summary' => 'بو صحیفه‌ده، ویکی‌یه ان سون وئریلن دَییشیکلیکلری ایزله.',
+'recentchanges-feed-description' => 'ویکی‌ده‌کی ان سون ديَیشیکلیک‌لری بو يايیم کانالیندان ایزله‌يین.',
+'recentchanges-label-newpage' => 'بو دییشیک یئنی بیر صحیفه یاراتدی',
+'recentchanges-label-minor' => 'بو بیر کیچیک دَییشدیرمه‌دیر',
+'recentchanges-label-bot' => 'بو دییشیک بیر بوت طرفین‌دن ائدیلیب‌دیر',
+'recentchanges-label-unpatrolled' => 'بو دییشیک هله گؤزدن کئچیریلمه‌ییب‌دیر',
+'rcnote' => "آشاغیداکی {{PLURAL:$1|'''1''' ديَیشیکلیک|'''$1''' ديَیشیکلیک}} ساعت$5, $4 تاریخینه قدر سون {{PLURAL:$2|گون|'''$2''' گون}} عرضینده ائدیلمیشدیر.",
+'rcnotefrom' => "آشاغیدا '''$2'''-دن ('''$1'''-ه قدر) ديَیشیکلیکلر سادالانمیشدیر.",
+'rclistfrom' => '$1 واختیندان باشلایاراق یئنی دییشیکلری گؤستر',
+'rcshowhideminor' => 'کیچیک دییشیکلری $1',
+'rcshowhidebots' => 'بوتلاری $1',
+'rcshowhideliu' => 'ایچری گیرمیش ایستیفاده‌چیلری $1',
+'rcshowhideanons' => 'تانینمامیش ایستیفاده‌چیلری $1',
+'rcshowhidepatr' => 'نظارت ائدیلن دَییشیکلری $1',
+'rcshowhidemine' => 'منیم دییشیکلریمی $1',
+'rclinks' => 'سون $2 گون عرضینده‌کی سون  $1 ديَیشیکلیگی گؤستر <br />$3',
+'diff' => 'فرق',
+'hist' => 'گئچمیش',
+'hide' => 'گیزلت',
+'show' => 'گؤستر',
+'minoreditletter' => 'ک',
+'newpageletter' => 'ی',
+'boteditletter' => 'ب',
+'number_of_watching_users_pageview' => '[{{PLURAL:$1|بیر|$1}} ایزله‌ین ایستیفاده‌چی]',
+'rc_categories' => 'بؤلمه‌لره محدودلاشدیر («|» ایله آییر)',
+'rc_categories_any' => 'هر',
+'rc-change-size-new' => 'دَییشیکلیک‌دن سونرا {{PLURAL:|بیر|$1}} بایت',
+'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|ایزله‌مه سیياهینیزداکی]] صحیفه‌‌لر '''قالین''' شریفتله گؤستریلمیشدیر.",
+'recentchangeslinked-page' => 'صحیفه آدی:',
+'recentchangeslinked-to' => 'قئيد اوْلونان صحیفه‌‌ده‌کی دئيیل، اوْنا داخیلی کئچید وئرن صحیفه‌‌لرده‌کی ديَیشیکلیکلری گؤستر',
+
+# Upload
+'upload' => 'فایل یوکله‌',
+'uploadbtn' => 'فایل یوکله‌یین',
+'reuploaddesc' => 'يوکلئمئ فورمونا گئری دؤن.',
+'upload-tryagain' => 'ديَشدیریلمیش فايل ایضاهینی گؤندر',
+'uploadnologin' => 'گیریش ائتمه‌میسینیز',
+'uploadnologintext' => 'فايل يوکله‌مک اوچون [[Special:UserLogin|گیریش ائتمه‌میسینیز]].',
+'upload_directory_missing' => '($1) یوکلمه قایداسی آختاریلیر و وئبسئروئرده یارادیلماسی قئیری-مومکون‌دور.',
+'upload_directory_read_only' => '"$1" کاتالوقونون آرشیوی وئب-سئروئر یازی‌لاری اوچون باغلی‌دیر.',
+'uploaderror' => 'یوکلمه خطاسی',
+'upload-recreate-warning' => "'دیققت: بو آددا فایل سیلینیب، یاخود آدی دییشدیریلیب.'
+
+بو صحیفه‌نین سیلینمه و آددییشمه ژورنا‌لی آشاغیدا گؤستریلمیش‌دیر:",
+'uploadtext' => "فایل یوکلمک اوچون آشاغی‌داکی فورما‌دان ایستیفاده ائدین.
+اول‌لر یوکلنمیش فایل‌لارا باخماق اوچون [[Special:FileList|یوکلنمیش فایل‌لار سیاهی‌سینا]] کئچین، هم‌چی‌نین (تکرار) یوکلنمیش فایل‌لارا [[Special:Log/upload|یوکلمه ژورنالیندا]]، سیلینمیش فایل‌لارا [[Special:Log/delete|سیلینمه ژورنالیندا]] باخا بیلرسینیز.
+
+مقاله‌یه فایل یئرلش‌دیرمک اوچون آشاغیداکی فورما‌لاردان بیرینی ایستیفاده ائدین:
+* فایلین تام نوسخه لری یئرلش‌دیرمک اوچون: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>''';
+* فایلین 200 پیکسئلدک کیچیلدیلمیش وئرسیاسینی متن‌دن سولدا، آلتیندا ایزاهلا یئرلش‌دیرمک اوچون: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|təsvir]]</nowiki></code>''';
+* صحیفه‌ده فایلین اؤزونو گؤسترمه‌دن اونا بیرباشا کئچید یئرلش‌دیرمک اوچون: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code>'''.",
+'upload-permitted' => 'ایجازه وئریلن فايل تیپلری: $1.',
+'upload-preferred' => 'ایجازه وئریلن فايل تیپلری: $1.',
+'upload-prohibited' => 'ایجازه وئریلمه‌ين فايل تیپلری: $1.',
+'uploadlog' => 'يوکله‌مه قئيدی',
+'uploadlogpage' => 'یوکلمه قئیدلری',
+'uploadlogpagetext' => 'آشاغیدا ان سون یوکله‌نیلن فایل‌لارین لیستی گؤستریلیر.
+داها گؤرونوش‌لو گؤسترمک اوچون، [[Special:NewFiles|یئنی فایل‌لار گالئری‌سینه]] باخین.',
+'filename' => 'فایل آدی',
+'filedesc' => 'قیساسی',
+'fileuploadsummary' => 'قیساسی:',
+'filereuploadsummary' => 'فایل دَییشیکلری:',
+'filestatus' => 'مؤلف حوقوقلاری:',
+'filesource' => 'قایناق:',
+'uploadedfiles' => 'یوکلنمیش فایللار‌',
+'ignorewarning' => 'خبردارلیقلارا اهمیت وئرمه و فايلی ساخلا',
+'ignorewarnings' => 'بوتون خبردارلیقلارا محل قويماماق',
+'minlength1' => 'فايل آدی ان آزی بیر حرفدن عبارت اولمالیدیر.',
+'illegalfilename' => '"$1" فایل آدیندا صحیفه آدلاریندا ایستیفاده‌سینه یول وئریلمه‌ین سیمبول‌لار وار. لطفاً فایلین آدینی دییشین و یئنی‌دن یوکلمه‌یه جهد ائدین.',
+'filename-toolong' => 'فایل آدی 240 بایت‌دان اوزون اولا بیلمز.',
+'badfilename' => 'فایلین آدی دییشیلدی. یئنی آدی: "$1".',
+'filetype-mime-mismatch' => '".$1" فایل اوزانتی‌سی فایلین میمئ تیپینه ($2) اویغون گلمیر.',
+'filetype-badmime' => '"$1" MIME تیپین‌دکی فایل‌لارین یوکلنمه‌سینه ایجازه وئریلمیر.',
+'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' => 'بو wiki فایل آدلاریندا خصوصی کاراکتئر ایستیفاده‌سینی دستکلمیر',
+'fileexists' => 'یوکلمک ایستدیگینیز آددا فایل مؤوجوددور.
+لطفاً <strong>[[:$1]]</strong> کئچیدینی یوخلایین و بو فای‌لی یوکلمک ایستدیگینیزدن عمین اولون.
+[[$1|thumb]]',
+'filepageexists' => 'بو فایل اوچون شرح صحیفه‌سی <strong>[[:$1]]</strong> عنوانیندا اونسوز دا یارادیلمیش، لاکین بو آددا بیر فایل بو آندا مؤوجود دئییل.
+گیرجیینیز خلاصه شرح صحیفه‌سینده گؤرونمه‌یه‌جک.
+اؤزئتینیزین اورادا گؤرونمه‌سی اوچون، بونو الله دییشدیرملیسینیز.
+[[$1|کیچیک شکیل]]',
+'fileexists-extension' => 'بئنزئر آدلا باشقا بیر فایل مؤوجود: [[$2|thumb]]
+* چکیلمیش فایلین آدی: <strong>[[:$1]]</strong>
+* مؤوجود فایلین آدی: <strong>[[:$2]]</strong>
+خاهیش ائدیریک باشقا بیر آد سئچین',
+'fileexists-thumbnail-yes' => "بو فایل، بیر رسمی فور وئرسیاسی کیمی گؤرونور (تهومبنایل)'. [[$1|thumb]]
+خاهیش ائدیریک <سترونگ> [[:$1]] </strong> فایلینی نظارت ائدین.
+اگر نظارت ائدیلن فایل ایله خصوصی اؤلچوسون‌دکی عینی دوسیایسا آرتیق کیچیک شکیل یوکلمه‌یه احتیاج یوخ‌دور.",
+'file-thumbnail-no' => "بو فایلین آدی <strong>$1</strong> ایله باشلاییر.
+بو باشقا بیر شکیل فور نوسخه سینه بنزییر (thumbnail)'
+اگر سیزده بو شکیلین تام نظر گلیر نسخه سی وارسا اونو یوکلیین، عکس حالدا خاهیش ائدیریک فایل آدینی دییش‌دیرین.",
+'fileexists-forbidden' => 'بو آددا بیر فايل وار، و اوزرینه يازیلما اولماز. 
+فايلینیزی يئنه ده يوکله‌مک ایسته‌يیرسینیزسه، خاهیش ائدیریک گئری دؤنوب يئنی بیر آد ایستیفاده ائدین.
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'بو آددا بیر فايل اورتاق آمباردا مؤوجود دیر. 
+فايلینیزی يئنه ده يوکله‌مک ایسته‌يیرسینیزسه، خاهیش ائدیریک گئری گئدیب يئنی بیر آد ایستیفاده ائدین. 
+[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => 'بو فایل آشاغی‌داکی {{PLURAL: $1 | فایلین | فایل‌لارین}} تکراری سی‌دیر:',
+'uploadwarning' => 'يوکله‌مه خبردارلیغی',
+'savefile' => 'فايلی قئيد ائت',
+'uploadedimage' => '"[[$1]]" یوکلندی',
+'uploaddisabled' => 'يوکله‌مه باش توتمادی',
+'uploadfromurl-queued' => 'يوکله‌مه‌نیز نؤوبه گؤزله‌يیر',
+'uploaddisabledtext' => 'فايل يوکلنمه‌سی باش توتمادی.',
+'uploadvirus' => 'فايلدا ویروس وار!  
+دئتاللار: $1',
+'upload-source' => 'قایناق فايلی',
+'sourcefilename' => 'فايل آدی منبع‌لری',
+'sourceurl' => 'قایناق آدرسی',
+'destfilename' => 'فايل آدی',
+'upload-maxfilesize' => 'فايلین بویوک هجمی: $1',
+'upload-description' => 'فایل ایضاهی',
+'upload-options' => 'یوکلمه سئچینیکلر',
+'watchthisupload' => 'بو فايلی ایزله',
+'upload-success-subj' => 'یوکلمه گوتولدو',
+'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> یوخسا <code>ftp://</code> ایله باشلانان آدرس ایسته‌ییر.',
+'upload-file-error' => 'ایچ خطاسی',
+'upload-misc-error' => 'بیلین‌مه‌ین یوکلمه خطاسی',
+'upload-too-many-redirects' => 'آدرس ده چوخ یؤنلندیرمه وار',
+'upload-unknown-size' => 'بیلین‌مه‌ين هجم',
+
+# File backend
+'backend-fail-stream' => '$1 فای‌لی یولانمامادی.',
+'backend-fail-notexists' => '"$1" فای‌لی مؤوجود دئییل',
+'backend-fail-invalidpath' => '"$1" اعتبارلی بیر ییغما یولو دئییل.',
+'backend-fail-delete' => '"$1" فایلن سیله بیلمه سینیز.',
+'backend-fail-alreadyexists' => '"$1" فای‌لی اونسوز دا مؤوجوددور.',
+'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" فایلی یارانمادی.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'فايل زیپ يوخلامالاری اوچون آچیلارکن بیر خطاایله قارشیلاشیلدی.',
+'zip-wrong-format' => 'گؤستریلن فايل زیپ فايلی دئيیل.',
+'zip-bad' => 'فایل خاراب یا دا باشقا بیر سبب‌دن اؤتری اوخونمایان بیر زیپ فایلی.
+تهلوکه‌سیزلیک نظارتی اویغون شکیلده گئرچکلشدیریلمیر.',
+'zip-unsupported' => 'فايل، مئدیياویکی طرفیندن دستکلنمه‌ين زیپ خصوصیتلرینه صاحب بیر زیپ فايلی. 
+تهلوکه‌‌سیزلیک نظارتی اويغون بیر شکیلده گئرچئکلئشتیریلئمیيور.',
+
+# 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' => 'PATH_INFO یوخدور.
+سئروئرینیز بو معلوماتی کئچیرمک اوچون نیزاملانمامیش. 
+سی‌جی‌آی اولا بیلر و img_auth دستکله‌نیلمیر اولا بیلر. 
+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 'نین فونکسیاسی خصوصی بیر ویکی فایل‌لاری چیخارماق‌دیر.
+بو wiki اومومی بیر wiki اولا‌راق قورولوب.
+ان اویغون تهلوکه‌سیزلیک اوچون، img_auth.php دؤوره خاریجی بوراخیلدی.",
+'img-auth-noread' => 'ایستیفاده‌چی‌نین «$1»بیر  اوخوماق حقوقو يوخدور.',
+'img-auth-bad-query-string' => 'آدرس اونواندا يانلیش آختاریش ستری وار.',
+
+# HTTP errors
+'http-invalid-url' => 'سهو اورل: $1',
+'http-invalid-scheme' => '"$1" سماسینا صاحب اورللئر دستک‌لنمیر',
+'http-request-error' => 'هتتپ ایستیی بیلینمه‌ین بیر سببله موفقیت‌سیز اولدو.',
+'http-read-error' => 'اچ‌تی‌تی‌پی اوخوما ختاسی',
+'http-timed-out' => 'اچ‌تی‌تی‌پی ایستیی‌نین واختی بیتدی.',
+'http-curl-error' => 'مراجعت نشانی ده یانلیش : $1',
+'http-host-unreachable' => 'آدرسه چاتماق اولمادی (خطا).',
+'http-bad-status' => 'اچ‌تی‌تی‌پی مراجعتین یوخلانماسی زامانی پروبلئم آشکارلانمیش‌دیر: $1 $2',
+
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'اینترنتی آدرسه چاتماق اولمادی.',
+'upload-curl-error6-text' => 'گؤستریلن اورل ائریشیلمیر.
+خاهیش ائدیریک اورل دوغرو و سایتین آچیق اولدوغونو نظارت ائدین.',
+'upload-curl-error28' => 'يوکله‌مه واختی بیتدی',
+'upload-curl-error28-text' => 'بو سایتین جاواب وئرمه‌سی چوخ اوزون سورور.
+خاهیش ائدیریک سایتین آچیق اولدوغونو نظارت ائدین، قیسا بیر مدت گؤزلیین و یئنی‌دن جهد ائدین.
+سایتین داها آز مشغول اولدوغو بیر زاماندا سیناماق داها یاخشی اولا بیلر.',
+
+'license' => 'لیسانس:',
+'license-header' => 'لیسانس',
+'nolicense' => 'هئچ‌بیری سئچیلمه‌ییب',
+'license-nopreview' => '(اؤن‌گؤستریش یوخدور)',
+'upload_source_url' => '(بیر گئچرلی و عموم گؤره بیلن اینترنت آدرسی)',
+'upload_source_file' => '(بیلگی‌سایارینیزدا بیر فایل)',
+
+# Special:ListFiles
+'listfiles-summary' => 'بو اؤزل صحیفه، بوتون یوکله‌نیلن فایل‌لاری گؤستریر.
+ایستیفاده‌چیه فیلتر اولوناندا، یالنیز او ایستیفاده‌چی سون نوسخه‌لرینی یوکله‌ین فایل‌لار گؤستریلیر.',
+'listfiles_search_for' => 'مئدیا آدی اوچون آختار:',
+'imgfile' => 'فایل',
+'listfiles' => 'فایل لیستی',
+'listfiles_thumb' => 'کیچیک شکیل',
+'listfiles_date' => 'تاریخ',
+'listfiles_name' => 'آد',
+'listfiles_user' => 'ایستیفاده‌چی',
+'listfiles_size' => 'اؤلچو',
+'listfiles_description' => 'شرح',
+'listfiles_count' => 'نوسخه‌لر',
+
+# File description page
+'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}}-دن چوخ صحیفه باغلانتی‌سی واردیر.
+آشاغیداکی لیست بو فایلا یالنیز ایلک $1 صحیفه باغلانتیسینی گؤستریر.
+بیر [[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 آنبارین‌دان و دیگر پروژئجتس. داها چوخ معلومات اوچون لطفاً [$2 فایل شرح صحیفه‌سینه] باخین.',
+'sharedupload-desc-here' => 'بو فایل $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 $3، $2 ایل تاریخ‌لی سورومئ] گئری قایتاریلدی.",
+'filerevert-badversion' => 'بو فایلین وئریلن زامان معلوماتینا صاحب اوولکی بیر یئرلی نوسخه سی یوخ‌دور.',
+
+# File deletion
+'filedelete' => 'سیل $1',
+'filedelete-legend' => 'فایلی سیل',
+'filedelete-intro' => "سیز '''[[Media:$1|$1]]''' فایلینی بوتون گئچمیشی‌له بیرلیکده سیلمک‌ده‌سینیز.",
+'filedelete-intro-old' => "سیز '''[[Media:$1|$1]]''' فایلینین [$4 $3، $2]-ده‌کی نوسخه‌سینی سیلمک‌ده‌سینیز.",
+'filedelete-comment' => 'نَدَن‌لیک:',
+'filedelete-submit' => 'سیل',
+'filedelete-success' => "'$1 سیلینمیش‌دیر.",
+'filedelete-success-old' => '<span class="plainlinks">\'\'\'[[Media:$1|$1]]\'\'\'-nin  $3 və $2 نوسخه لری سیلینمیش‌دیر.</span>',
+'filedelete-nofile' => "'$1 مؤوجود دئییل.",
+'filedelete-otherreason' => 'باشقا/آرتیق دلیل:',
+'filedelete-reason-otherlist' => 'باشقا سبب',
+'filedelete-reason-dropdown' => '*اساس سیلمه سببی
+** یازانلار حقوقون پوزونتوسو
+** دوبلیکات فایل
+** کئیفیت‌سیز شکیل
+** ایستیفاده‌سیز فایل
+** قئیری-ائنسیکلوپئدیک شخص
+** لیسئنزیا‌سیز فایل
+** آزاد شکیلله اوز اولوندو
+** مؤلف ایستیی',
+'filedelete-edit-reasonlist' => 'سیلمک دلیل‌لرینی دَییشدیر',
+'filedelete-maintenance' => 'ساخلاماق سیراسیندا، فایل‌لاری سیلمک و قایتارماق، گئچرلی اولاراق باغلی‌دیر.',
+'filedelete-maintenance-title' => 'فایل سیلیننمه‌دی',
+
+# MIME search
+'mimesearch' => 'MIME آختار',
+'mimesearch-summary' => 'بو صحیفه، فایل‌لارین MIME-لارینا گؤره فیلترله‌مگی آچار.
+وئرمک: contenttype/subtype، میثال: <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|بیر|$1}} گون‌ده بیر ایش گؤرن ایستیفاده‌چیلر',
+'statistics-mostpopular' => 'ان چوخ گؤرونموش صحیفه‌لر',
+
+'disambiguations' => 'آیدین‌لاشدیرما صحیفه‌لرینه باغلانتیلاری اولان صحیفه‌لر',
+'disambiguationspage' => 'Template:دقیقلش‌دیرمه',
+'disambiguations-text' => "آشاغیداکی صحیفه‌لرده آزی بیر باغلانتی، '''بلیرلیندیمه صحیفه‌لری'''نه واردیر.
+اولا بیلر اونلاری داها اویغون صحیفه‌یه باغلاماق لازیم اولا.<br />
+بیر صحیفه، بلیرلندیرمه صحیفه‌سی کیمی اولار، اگر [[MediaWiki:Disambiguationspage]] صحیفه‌سینه باغلانمیش بیر شابلون‌دان ایستیفاده ائتسه.",
+
+'doubleredirects' => 'ایکی‌قات یول‌لاندیرمالار',
+'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' => '{{PLURAL:$1|بیر|$1}} بایت',
+'ncategories' => '{{PLURAL:$1|بیر|$1}} بؤلمه',
+'ninterwikis' => '{{PLURAL:$1|بیر|$1}} ویکی‌آراسی',
+'nlinks' => '{{PLURAL:$1|بیر|$1}} باغلانتی',
+'nmembers' => '$1 {{PLURAL:$1|اویه|اویه‌لر}}',
+'nrevisions' => '{{PLURAL:$1|بیر|$1}} نوسخه',
+'nviews' => '{{PLURAL:$1|بیر|$1}} گؤرونوش',
+'nimagelinks' => '$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونمور',
+'ntransclusions' => '$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونور',
+'specialpage-empty' => 'بو صحیفه بوشدور',
+'lonelypages' => 'يئتیم صحیفه‌‌لر',
+'uncategorizedpages' => 'بؤلمه‌سیز صحیفه‌لر',
+'uncategorizedcategories' => 'بؤلمه‌سیز بؤلمه‌لر',
+'uncategorizedimages' => 'بؤلمه‌سیز شکیل‌لر',
+'uncategorizedtemplates' => 'بؤلمه‌سیز شابلون‌لار',
+'unusedcategories' => 'ایستیفاده ائدیلمه‌میش بؤلمه‌لر',
+'unusedimages' => 'ایشلنمه‌میش فایل‌لار',
+'popularpages' => 'سئویلن صحیفه‌لر',
+'wantedcategories' => 'یسته نن بؤلمه‌لر',
+'wantedpages' => 'ایسته نن صحیفه‌لر',
+'wantedpages-badtitle' => 'مراجعت زامانتی يانلیش باشلیق: $1',
+'wantedfiles' => 'ایسته نن فایللار',
+'wantedtemplates' => 'ایسته نن شابلونلار',
+'mostlinked' => 'ان چوخ کئچیدلنن صحیفه‌‌لر',
+'mostlinkedcategories' => 'ان چوخ مقاله‌سی اولان بولمه لر',
+'mostlinkedtemplates' => 'ان چوخ ایستیفاده اولونان شابلون‌لار',
+'mostcategories' => 'بؤلمه‌سی ان چوخ اولان صحیفه‌لر',
+'mostimages' => 'ان چوخ ایستیفاده ائدیلمیش شکیللر',
+'mostinterwikis' => 'اینتر ویکی‌سی ان چوخ اولان صحیفه‌لر',
+'mostrevisions' => 'ان چوخ نظردن کئچیریلمیش (وئرسیا‌لی) مقاله‌لر',
+'prefixindex' => 'پرئفیکس ایندئکسلی بوتون یارپاقلار',
+'shortpages' => 'قیسا صحیفه‌‌لر',
+'longpages' => 'اوزون صحیفه‌‌لر',
+'deadendpages' => 'کئچید وئرمه‌ين صحیفه‌‌لر',
+'deadendpagestext' => 'آشاغیداکی صحیفه‌‌لردن بو ویکیپئدیياداکی دیگر صحیفه‌‌لره هئچ بیر کئچید يوخدور.',
+'protectedpages' => 'محافظه‌‌لی صحیفه‌‌لر',
+'protectedpages-indef' => 'يالنیز مدتسیز محافظه‌‌لر',
+'protectedpages-cascade' => 'یالنیز کاسکاد محافظه‌لر',
+'protectedpagestext' => 'آشاغی‌داکی صحیفه‌لر آد دییشیمینه و دَییشدیرمه‌یه باغلی‌دیر',
+'protectedpagesempty' => 'حال-حاضردا بو پارامئتره اویغون هئچ بیر محافظه‌لی صحیفه یوخ‌دور',
+'protectedtitles' => 'محافظه‌لی باش‌لیق‌لار',
+'listusers' => 'ایستیفاده‌چی سیياهیسی',
+'listusers-editsonly' => 'يالنیز دَییشدیرمه ائدن ایستیفاده‌چیلری گؤستر',
+'listusers-creationsort' => 'يارانما تاریخینه گؤره سیرالا',
+'usereditcount' => '$1 {{PLURAL:$1|دَییشدیرمه}}',
+'usercreated' => 'ساعت  $2, $1 تاریخ‌ده {{GENDER:$3|قئيدیاتدان کئچیب}}',
+'newpages' => 'يئنی صحیفه‌‌‌لر',
+'newpages-username' => 'ایستیفاده‌چی آدی:',
+'ancientpages' => 'ان اسکی صحیفه‌لر',
+'move' => 'آدینی دَییشدیر',
+'movethispage' => 'بو صحیفه‌‌نین آدینی ديَیشدیر',
+'notargettitle' => 'وئریلمه‌يیب',
+'nopagetitle' => 'بئله هدف صحیفه‌سی یوخ‌دور',
+'pager-newer-n' => '{{PLURAL:$1|بیر داها یئنی|$1 داها یئنی}}',
+'pager-older-n' => '{{PLURAL:$1|بیر داها کؤهنه|$1 داها کؤهنه}}',
+'suppress' => 'باخان',
+'querypage-disabled' => 'پِرفورمانس اوچون بو اؤزل صحیفه باغلانیب‌دیر.',
+
+# Book sources
+'booksources' => 'کیتاب قایناقلاری',
+'booksources-search-legend' => 'کیتاب قایناقلارین آختار',
+'booksources-go' => 'گئت',
+'booksources-text' => 'آشاغیدا یئنی و ایشلنمیش کیتاب‌لار ساتان خاریجی کئچیدلرده سیز آختاردیغینیز کیتاب حاقیندا علاوه معلومات آلا بیلرسیز:',
+
+# Special:Log
+'specialloguserlabel' => 'ایجراچی',
+'speciallogtitlelabel' => 'مقصد (باش‌لیق و یا ایستیفاده‌چی):',
+'log' => 'سیاهه‌لر',
+'all-logs-page' => 'بوتون اجتماعی قئيدلر',
+'alllogstext' => '{{SITENAME}} اوچون بوتون مؤوجود قئیدلرین بیرگه گؤستریشی.
+قئید نؤوو، ایستیفاده‌چی آدی و یا تأثیر ائدیلمیش صحیفنی سئچمکله داها ایسپئسیفیک اولا بیلرسینیز.',
+'logempty' => 'ژورنالدا اويغون قئيد تاپیلمادی.',
+'log-title-wildcard' => 'بو متنله باشلایان باش‌لیق‌لاری آختار',
+
+# Special:AllPages
+'allpages' => 'بوتون صحیفه‌لر',
+'alphaindexline' => '$1 مقاله‌سیندن $2 مقاله‌سینه کیمی',
+'nextpage' => 'سونراکی صحیفه‌‌ ($1)',
+'prevpage' => 'اولکی صحیفه ($1)',
+'allpagesfrom' => 'بو حرفله باشلایان صحیفه‌لری گؤستر:',
+'allpagesto' => 'بو حرفله باشلایان صحیفه لری گؤستر:',
+'allarticles' => 'بوتون یارپاقلار',
+'allinnamespace' => 'بوتون صحیفه‌لر ($1 صحیفه‌لری)',
+'allnotinnamespace' => 'بوتون صحیفه‌لر ( $1 ساحه‌سینده اولمایان‌لار)',
+'allpagesprev' => 'اونجه‌کی',
+'allpagesnext' => 'سونراکی',
+'allpagessubmit' => 'گئت',
+'allpagesprefix' => 'بورا یازدیغینیز حرف‌لرله باشلایان صحیفه‌لری سیاهی‌سینی:',
+'allpages-hide-redirects' => 'یؤنلندیرمه‌لری گیزلت',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'ان سونراکی گورونوش',
+
+# Special:Categories
+'categories' => 'بؤلمه‌لر',
+'categoriespagetext' => 'آشاغی‌داکی {{PLURAL:$1|بولمه لردهٔ|بولمه لرده}}  صحیفه‌لر، یاخود مئدیا-فایل‌لار وار.
+[[Special:UnusedCategories|ایستفاده اولمایان بولمه لر]] بورادا گؤستریلمه‌ییب.
+هم‌چی‌نین، [[Special:WantedCategories|لازیم اولان بولمه لره]] باخین.',
+'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> (بوش بیراخیلسا، http:// نظرده آلیناجاقدیر).',
+'linksearch-line' => '$2-دن $1 کئچید وئریلیب',
+'linksearch-error' => 'نیشانلار یالنیز آدی اولینده گله بیلرلر.',
+
+# Special:ListUsers
+'listusersfrom' => 'بوندان باشلایاراق ایستیفاده‌چیلری گؤستر:',
+'listusers-submit' => 'گؤستر',
+'listusers-noresult' => 'هئچ ایستیفاده‌چی تاپیلمادی.',
+'listusers-blocked' => '(باغلانیب)',
+
+# Special:ActiveUsers
+'activeusers' => 'چالیشان ایستیفاده‌چیلرین لیستی',
+'activeusers-intro' => 'بوردا سون {{PLURAL:$1|بیر|$1}} گون‌ده بیر ایشلر گؤرن ایستیفاده‌چیلرین لیستی گؤستریلیر.',
+'activeusers-count' => 'سون {{PLURAL:$3|بیر|$3}} گون‌ده، {{PLURAL:$1|بیر|$1}} دَییشیکلیک.',
+'activeusers-from' => 'بوندان باشلایاراق ایستیفاده‌چیلری گؤستر:',
+'activeusers-hidebots' => 'بوتلاری گیزلت',
+'activeusers-hidesysops' => 'ایداره‌چیلری گیزلت',
+'activeusers-noresult' => 'هئچ ایستیفاده‌چی تاپیلمادی.',
+
+# Special:Log/newusers
+'newuserlogpage' => 'يئنی ایستیفاده‌چی‌لرین یارادیلماسی',
+'newuserlogpagetext' => 'بو ایستیفاده‌چی یارادماق سیاهیسیدیر.',
+
+# Special:ListGroupRights
+'listgrouprights' => 'ایستیفاده‌چی گروپ حاقلاری',
+'listgrouprights-summary' => 'آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.
+تک حاقلار اوچون ده، [[{{MediaWiki:Listgrouprights-helppage}}|آرتیق بیلگیلر]] اولا بیلر.',
+'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' => 'بو ایستیفاده‌چی یه ایمیل گؤندر',
+'emailuser-title-target' => 'بو {{GENDER:$1|ایستیفاده‌چی}}‌یه ایمیل گؤندر',
+'emailuser-title-notarget' => 'ایستیفاده‌چی‌یه ایمیل گؤندر',
+'emailpage' => 'ایستیفاده‌چی‌یه ایمیل گؤندر',
+'emailpagetext' => 'آشغیداکی فورم‌دان، بو {{GENDER:$1|ایستیفاده‌چی}}‌یه ایمیل گؤندرمک اوچون ایستیفاده ائده بیلرسینیز.
+[[Special:Preferences|اؤز ترجیحلرینیز]]ده وئرن ایمیل آدرسی، بو ایمیلین "From" یئرینده گؤستریله‌جک‌دیر و بونا گؤره ایمیلی آلان سیزه موستقیم جاواب گؤندره بیلر.',
+'usermailererror' => 'ایمیل‌دن بو خطا قایتاریلدی:',
+'defemailsubject' => '«$1» آدلی ایستیفاده‌چی‌دن، {{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' => 'بو ایمیل، {{SITENAME}}-ده «ایستیفاده‌چی‌یه ایمیل گؤندر» ایمکانی ایله، $1-دن $2-ه گؤنده‌ریلیب‌دیر.',
+
+# User Messenger
+'usermessage-summary' => 'مئساژ گئنده‌ریلدی.',
+'usermessage-editor' => 'سیستِم مئساژ گؤندَرَنی',
+
+# Watchlist
+'watchlist' => 'ایزله‌دیگیم صحیفه‌‌لر',
+'mywatchlist' => 'ایزله‌دیکلر',
+'watchlistfor2' => '$1 اوچون $2',
+'nowatchlist' => 'ایزلمه سیاهینیز بؤش‌دور.',
+'watchlistanontext' => 'لطفاً، ایزلدیگینیز صحیفه‌لری گؤرمک و یا رئداکته ائتمک اوچون $1.',
+'watchnologin' => 'داخیل اولمامیسینیز',
+'watchnologintext' => 'ایزلمه سیاهینیزدا دییشیک‌لیک آپارماق اوچون [[Special:UserLogin|داخیل اولمالیسینیز]].',
+'addwatch' => 'ایزلمه سیاهی‌سینا علاوه ائت',
+'addedwatchtext' => '"[[:$1]]" صحیفه‌سی [[Special:Watchlist|ایزلدینز صحیفه‌لر]] سیاهی‌سینا علاوه ائدیلدی. بو صحیفه‌ده و علاقه‌لی موزاکیره صحیفه‌سین‌دکی بوتون دییشیک‌لیک‌لر اورادا گؤستریله‌جک و صحیفه آسان‌لیقلا سئچیلبیلمک اوچون [[Special:RecentChanges|سون دییشیک‌لیک‌لرده]] قالین شریفت‌لرله گؤرونه‌جک‌دیر. <پ> صحیفنی ایزلمه سیاهینیزدان چیخارماق اوچون یان لؤوهه‌دکی "ایزلمه" دویمه‌سینه وورون.',
+'removewatch' => 'بو صحیفنی ایزلدیگیم صحیفه‌لر سیاهی‌سین‌دان چیخار',
+'removedwatchtext' => '"[[:$1]]" صحیفه‌سی [[Special:Watchlist|ایزلمه سیاهینیزدان]] چیخاریلدی.',
+'watch' => 'ایزله',
+'watchthispage' => 'بو صفحه‌نی ایزله',
+'unwatch' => 'ایزله‌مه',
+'unwatchthispage' => 'صحیفه ایزلمیی دایان‌دیر',
+'notanarticle' => 'مضمون صحیفه‌سی دئییل',
+'notvisiblerev' => 'باشقا ایستیفادی‌چی‌نین سون دییشیک‌لیگی سیلینیب',
+'watchnochange' => 'وئریلن واخت عرضینده هئچ بیر ایزلدیگینیز صحیفه رئداکته ائدیلممیش‌دیر.',
+'watchlist-details' => 'دانیشیق صفحه‌لرینی سایمایاراق، {{PLURAL:$1|$1 صفحه‌نی}} ایزله‌ییرسینیز.',
+'wlheader-enotif' => '* ایمیل مکتوبلا بیلدیریش اولا بیلر.',
+'wlheader-showupdated' => "* سون زیارتینیزدن سونرا ائدیلن دییشیک‌لیک‌لر 'قالین شریفتلرل گؤستریلمیش‌دیر.",
+'watchmethod-recent' => 'یئنی دییشیک‌لیک‌لر ایزلنیلن صحیفه‌لر اوچون یوخلانیلیر',
+'watchmethod-list' => 'ایزلنیلن صحیفه‌لر یئنی دییشیک‌لیک‌لر اوچون یوخلانیلیر',
+'watchlistcontains' => 'ایزلمه سیاهینیزدا $1 {{PLURAL:$11|صحیفه}} وار.',
+'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' => 'ایزله‌مه...',
+
+'enotif_mailer' => '{{SITENAME}} بیلدیریش خیدمتی',
+'enotif_reset' => 'باخیلمیش بوتون صحیفه‌لری ایشاره‌له.',
+'enotif_impersonal_salutation' => '{{SITENAME}} ایستیفاده‌چی‌سی',
+'enotif_lastvisited' => 'سونونجو زیارتینیزدن ایندیدک اولان بوتون دییشیک‌لیک‌لری گؤرمک اوچون باخین: $1.',
+'enotif_lastdiff' => 'بو دییشیک‌لیگی گؤرمک اوچون $1 صحیفه‌سینه باخین.',
+'enotif_anon_editor' => 'قئیدیات‌سیز ایستیفاده‌چی $1',
+'enotif_body' => 'حؤرمتلی $WATCHINGUSERNAME,
+
+{{SITENAME}} وئب-سايتینداکی $PAGETITLE آدلی صحیفه‌‌ $PAGETITLE تاریخینده $PAGEEDITOR طرفیندن $CHANGEDORCREATED. صحیفه‌‌نین سونونجو وئرسیياسینا باخماق اوچون $PAGETITLE_URL کئچیدیندن ایستیفاده ائدین. 
+
+$نئwپاگئ 
+
+ديَیشیکلیگی ائدن ایستیفاده‌چی‌نین ایضاهی: $PAGESUMMARY $PAGEMINOREDIT
+
+صحیفه‌‌نی ديَیشدیرن ایستیفاده‌چی‌نین علاقه‌‌ معلوماتلاری: 
+ائ-پوچت:$PAGEEDITOR_EMAIL
+ویکی:$PAGEEDITOR_WIKI
+
+سیز حاقیندا صؤحبت گئدن صحیفه‌‌يه باخانادک صحیفه‌‌دکی دیگر ديَیشیکلیکلرله باغلی باشقا بیلدیریش مکتوبو آلماياجاقسینیز. سیز همچی‌نین، ایزله‌مه سیياهینیزداکی بوتون صحیفه‌‌لرله باغلی بیلدیریش معلوماتلارینی سیله بیلرسینیز. 
+
+               {{SITENAME}} سايتی‌نین خبردارلیق سیستمی. 
+
+-- 
+ایزله‌مه سیياهیسی‌نین تنزیمله‌مه‌لرینی ديَیشمک اوچون: 
+{{canonicalurl:Special:Watchlist/edit}}
+
+ياردیم و تکلیفلرینیز اوچون: 
+{{canonicalurl:{{MediaWiki:Helppage}}}}',
+
+# Delete
+'deletepage' => 'صحیفه‌‌نی سیل',
+'confirm' => 'تصدیق ائت',
+'excontent' => "کؤهنه مظمون: '$1'",
+'excontentauthor' => "ترکیب: '$1 (و'[[Special:Contributions/$2|$2]]' تاریخچه‌ده فالیتی قئید ائدیلن یئگانه ایستیفاده‌چی‌دیر)",
+'exbeforeblank' => "سیلینمه‌دن اوولکی مزمون: '$1",
+'exblank' => 'صحیفه بوش',
+'delete-confirm' => 'سیل $1',
+'delete-legend' => 'سیل',
+'historywarning' => "'خبردارلیق:' سیلینه‌جک صحیفه‌نین تاریخچه‌سینده قئید اولونموش $1 {{PLURAL::$1|دییشدیر|دییشدیرمه}} وار:",
+'confirmdeletetext' => 'بو صحیفه و یا فایل بوتون تاریخچه‌سی ایله بیرلیکده بیردفه‌لیک سیلینه‌جک. بونو [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون ائتدیگینیزی و عملیاتین نتیجه‌لرینی باشا دوشدوگونوزو تسدیق ائدین.',
+'actioncomplete' => 'چالیشما سوناچاتدی',
+'actionfailed' => 'فعالیت اوغورسوزاولدو',
+'deletedtext' => '"$1" سیلیندی.
+سونونجو سیلینمه‌لره باخ: $2.',
+'dellogpage' => 'سیلمه سییاهسی',
+'dellogpagetext' => 'ان سون سیلینمیش صحیفه‌لرین سیاهی‌سی.',
+'deletionlog' => 'سیلمه سییاهه‌سی',
+'reverted' => 'داها اوولکی وئرسیا برپا ائدیلدی',
+'deletecomment' => 'ندن:',
+'deleteotherreason' => 'باشقا/آرتیق دلیل:',
+'deletereasonotherlist' => 'باشقا سبب',
+'deletereason-dropdown' => '*ساس سیلمه سببی
+** یازان ایستیی
+** یازانلار حقوق پوزونتوسو
+** واندالیزم',
+'delete-edit-reasonlist' => 'سیلمک دلیل‌لرینی دَییشدیر',
+
+# Rollback
+'rollback' => 'اوولکی نوسخه لر',
+'rollback_short' => 'اوولکی حالینا قایتار',
+'rollbacklink' => 'گئری‌دؤندر',
+'rollbackfailed' => 'گئری قایتارما اوغورسوزدور',
+'cantrollback' => 'دییشدیر گئری قایتاریلا بیلمز؛ آخیرینجی دییشدیر صحیفه‌ده اولان یئگانه فالیت‌دیر.',
+'editcomment' => "دییشیک‌لیک خلاصه‌سی: ''\" \$1''\" ایدی.",
+'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|دانیشیق]]) طرفین‌دن ائدیلمیش دییشیک‌لیک‌لر [[User:$1|$1]] طرفین‌دن ائدیلمیش دییشیک‌لیک‌لره قایتاریلدی.',
+'revertpage-nouser' => '(ایستیفاده‌چی آدی چیخاریلمیش) طرفین‌دن ائدیلن دییشیک‌لیک‌لر [[User:$1|$1]] طرفین‌دن ائدیلن سون دییشیک‌لییه گئری آلیندی',
+'rollback-success' => '$1 طرفین‌دن ائدیلمیش دییشدیر‌لر گئری قایتاریلدی؛ $2 طرفین‌دن یارادیلمیش سون وئرسیا برپا اولوندو.',
+
+# Edit tokens
+'sessionfailure-title' => 'گیریش خطاسی',
+'sessionfailure' => 'گیریش اوتورومونوزلا ایلگی‌لی بیر سورون وار گیبی گؤرونویور؛
+بو ائیلئم، اوتوروم گاسپینا کارشی اؤنلئم اولاراک ایپتال ائدیلدی.
+لوتفن "گئری" گیدین و گئلدیغینیز سایفایی یئنی‌دئن یوکلئیین، سونرا تئکرار دئنئیین.',
+
+# Protect
+'protectlogpage' => 'قوروما قئیدلری',
+'protectedarticle' => '"[[$1]]" قورولدو',
+'modifiedarticleprotection' => '"[[$1]]" صحیفه‌سی اوچون محافظه سویه‌سی دییشیلدی',
+'unprotectedarticle' => 'محافظه کنارلاشدیریلدی "[[$1]]"',
+'protect-title' => '"$1" اوچون محافظه سویه‌سی‌نین دییشدیریلمه‌سی',
+'protect-title-notallowed' => '"$1"اوچون محافظه سویه‌سی‌نین گؤسترین',
+'prot_1movedto2' => '[[$1]] آدی دییشیلدی. یئنی آدی: [[$2]]',
+'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|باشقا بیر}} صحیفه‌دن کاسکاد محافظه ائدیلمیش‌دیر. سیز بو صحیفه‌نین محافظه سویه‌سینی دییش‌دیره بیلرسینیز، بو کاسکاد محافظه‌یه تأثیر ائتمه‌یه‌جک.',
+'protect-default' => 'بوتون ایستیفاده‌چی‌لره ایجازه وئر',
+'protect-fallback' => '"$1" ایجازه‌سی طلب اولونور',
+'protect-level-autoconfirmed' => 'یئنی و آنونیم ایستیفاده‌چی‌لری باغلا',
+'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 ساهات:1 hour,1 گون:1 day,1 هفته:1 week,2 هفته:2 weeks,1 آی:1 month,3 آی:3 months,6 آی:6 months,1 ایل:1 year,سون سوز:infinite',
+'restriction-type' => 'حقوقلار',
+'restriction-level' => 'محدودیت درجه‌‌سی:',
+'minimum-size' => 'ان کوچیک بویوت',
+'maximum-size' => 'ان بویوک بویوت',
+'pagesize' => '(بایت)',
+
+# Restrictions (nouns)
+'restriction-edit' => 'دَییش',
+'restriction-move' => 'آدینی دَییشدیر',
+'restriction-create' => 'یارات',
+'restriction-upload' => 'یوکله',
+
+# Restriction levels
+'restriction-level-sysop' => 'تام محافظه',
+'restriction-level-autoconfirmed' => '(ياریم-محافظه‌‌)',
+'restriction-level-all' => 'ایستنیلن سویه',
+
+# Undelete
+'undelete' => 'سیلینمیش صحیفه‌‌لری گؤستر',
+'undeletepage' => 'سیلینمیش صحیفه‌لری گؤستر و یا برپا ائت',
+'undeletepagetitle' => "'اشاغی‌داکی، [[:$1|$1]] صحیفه‌سی‌نین سیلینمیش دییشیک‌لیک‌لرین‌دن ایبارتدیر.",
+'viewdeletedpage' => 'سیلینمیش صحیفه‌لری گؤستر',
+'undelete-fieldset-title' => 'دییشیک‌لیک‌لری گئری یوکله',
+'undeletehistory' => 'اگر صحیفه‌‌نی گئری گتیرسه‌نیز، بوتون رئویزيونلار کئچمیشه گئری گتیریله‌جک. 
+سیلیندیکدن سونرا عینی آدلا يئنی بیر صحیفه‌‌ يارانمیشسا، گئری گلن رئویزيونلار مؤوجود اولان صحیفه‌‌نین کئچمیشینده گؤرونه‌جک.',
+'undelete-revision' => '$3 طرفین‌دن $1 صحیفه‌سی‌نین سیلینمیش دییشدیر ‌سین ($4 تاریخیندئن بری، $5 ساعتدا):',
+'undelete-nodiff' => 'اولکی دَییشمه تاپیلمادی.',
+'undeletebtn' => 'برپا ائت',
+'undeletelink' => 'باخ/قایتار',
+'undeleteviewlink' => 'باخ',
+'undeletereset' => 'قور',
+'undeleteinvert' => 'سئچیلن خاریجین‌دکی‌لری',
+'undeletecomment' => 'ندن:',
+'undeletedrevisions' => 'جمعی {{PLURAL:$11|1 دییش|$1 دییشدیر}} گئری قایتاریلدی.',
+'undeletedrevisions-files' => '{{PLURAL:$1|1 نوسخه|$1 نوسخه}} و {{PLURAL:$2|1 فایل|$2 فایل}} برپا ائدیلدی',
+'undeletedfiles' => '{{PLURAL:$1|1 فایل|$1 فایل}} برپا اولوندو',
+'cannotundelete' => 'برپا ائدیلمه اولمادی
+
+$1',
+'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' => '"<nowiki>$1</nowiki>" فایلینین $2 $3 تاریخ‌لی سیلینمیش بیر دییشدیر ‌سینی گؤرمک ایستدیگینیزدن اطمیناننیز وار می؟',
+'undelete-show-file-submit' => 'بلی',
+
+# Namespace form on various pages
+'namespace' => 'آد فضاسی:',
+'invert' => 'سئچیلنی دؤندر',
+'namespace_association' => 'علاقه‌لی آد ساحه‌سی',
+'blanknamespace' => '(آنا)',
+
+# Contributions
+'contributions' => '{{GENDER:$1|ایستیفاده‌چی}} چالیشمالاری',
+'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' => 'تکجه سون نوسخه اولان دییشیکلری گؤستر',
+'sp-contributions-submit' => 'آختار',
+
+# What links here
+'whatlinkshere' => 'بو صحیفه‌یه باغلانتیلار',
+'whatlinkshere-title' => '"$1" -ه/ا باغلانان صحیفه‌لر',
+'whatlinkshere-page' => 'صحیفه:',
+'linkshere' => "آشاغیداکی صحیفه‌لر '''[[:$1]]'''-ه باغلانیب:",
+'nolinkshere' => "یارپاغینا هئچ آیری  یارپاق باغلانماییب'''[[:$1]]'''.",
+'nolinkshere-ns' => "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''[[:$1]]'''-ه باغلانتی‌سی یوخدور.",
+'isredirect' => 'یوللاندیرما صحیفه‌سی',
+'istemplate' => 'داخیل اولموش',
+'isimage' => 'شکیل اوچون کئچید',
+'whatlinkshere-prev' => '{{PLURAL:$1|اؤنجه‌کی|اؤنجه‌کی $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|سونراکی|سونراکی $1}}',
+'whatlinkshere-links' => '← باغلانتیلار',
+'whatlinkshere-hideredirs' => '$1 ایستیقامتلندیرمه‌لر',
+'whatlinkshere-hidetrans' => 'علاوه‌لری $1',
+'whatlinkshere-hidelinks' => 'باغلانتیلاری $1',
+'whatlinkshere-hideimages' => '$1 شکیل اوچون کئچیدلر',
+'whatlinkshere-filters' => 'سوزگجلر',
+
+# Block/unblock
+'autoblockid' => 'اوتوماتیک باغلانما #$1',
+'block' => 'ایستیفادچینی باغلاما',
+'unblock' => 'ایستیفاده‌چی‌نین باغلانماسین گؤتور',
+'blockip' => 'ایستیفاده چی نی باغلا',
+'blockip-title' => 'ایستیفادچی نی باغلا',
+'blockip-legend' => 'ایستیفادچی نی باغلا',
+'blockiptext' => 'آشاغی‌داکی فورمو ایستیفاده ائده‌رک مویین بیر ایپنین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بو یالنیز واندالیزمی قارشی‌سینی آلماق اوچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون اولا‌راق ائدیلمه‌لی. آشاغییا موتلق قاداغا ایله علاقه‌دار بیر شرح یازین. (نومونه:-بو-صحیفه‌لرده واندالیزم ائتمیش‌دیر).',
+'ipadressorusername' => 'آی-پی عونوانی و یا ایستیفاده‌چی آدی',
+'ipbexpiry' => 'بیتمه مدتی:',
+'ipbreason' => 'ندن:',
+'ipbreasonotherlist' => 'باشقا سبب',
+'ipbreason-dropdown' => '*باغلانما سبب‌لری:
+** یالان معلومات‌لارین علاوه ائدیلمه‌سی
+** صحیفه‌نین مزمونونون سیلینمه‌سی
+** خاریجی سایت‌لارا ایسپام-کئچیدلر
+** صحیفه‌یه معنا‌سیز و یارارسیز علاوه‌لره گؤره
+** حده و تعقیب‌لره گؤره
+** تحقیره گؤره
+** چوخسای‌لی حساب‌دان سوی ایستیفاده‌یه گؤره
+** قاداغان اولونموش ایستیفاده‌چی آدینا گؤره',
+'ipb-hardblock' => 'بو ای پی-ده ایجلاس آچمیش ایستیفاده‌چی‌لرین دییشیک‌لیک ائتمه‌سینی تدبیر',
+'ipbcreateaccount' => 'حساب آچمانی محدودلاش‌دیر',
+'ipbemailban' => 'ایستیفاده‌چی‌نین ایمیل گؤندرمه‌سینه مانع اول',
+'ipbenableautoblock' => 'مؤوجود اولان مانعه تؤرتمه‌لری گؤستر...',
+'ipbsubmit' => 'بو ایستیفاده چی نی باغلا',
+'ipbother' => 'باشقا واخت',
+'ipboptions' => '2 ساعت:2 hours,1 گون:1 day,3 گونلر:3 days,1 هفته:1 week,2 هفته‌لر:2 weeks,1 آی:1 month,3 آیلار:3 months,6 آیلار:6 months,1 ایل:1 year,مدتسیز:infinite',
+'ipbotheroption' => 'آیری',
+'ipbotherreason' => 'آیری سبب/آرتیق:',
+'ipbhidename' => 'ایستیفاده‌چی آدینی دییشدیر‌لرده و سیاهی‌لاردا گیزلت',
+'ipbwatchuser' => 'بو ایستیفاده‌چی‌نین دانیشیق و ایستیفاده‌چی صحیفه‌سینی ایزله',
+'ipb-disableusertalk' => 'بو ایستیفاده‌چی باغلی اولارکن اؤز دانیشیق صحیفه‌سینده دییشدیر ائتمه‌سینی اوز الیله قاباقین آلما',
+'ipb-change-block' => 'بو سبب‌لرله ایستیفادچینی یئنی‌دن باغلا',
+'ipb-confirm' => 'بلوکو تصدیقله',
+'badipaddress' => 'سهو آی پی',
+'blockipsuccesssub' => 'باغلاندی',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] باغلاندی.<br />
+باخ [[Special:BlockList|آی پی باغلانماق سیاهی‌سی]] باغلانمیش آی پ-لر.',
+'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|قاداغا‌لارین و بلوکلاما‌لارین سیاهی‌سی]]نا باخ.',
+'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 تاپیلمادی. باغلامانین گؤتورولمه‌سی مومکون‌دور.',
+'ip_range_invalid' => 'یانلیش ای پی',
+'blockme' => 'منی باغلا',
+'proxyblocker' => 'پروکسی باغلییان',
+'proxyblocker-disabled' => 'بو ایش باغلانیب دیر.',
+'proxyblocksuccess' => 'اولدو.',
+'cant-block-while-blocked' => 'سیز ائنگئللیيکئن باشقا ایستیفاده‌چیلری مانعه تؤره‌ده بیلمزسینیز.',
+'cant-see-hidden-user' => 'قارشیسینی آلماق ایسته‌دیگینیز ایستیفاده‌چی اونسوز دا مانعه تؤره‌دیلمیش و گیزلنمیش. کوللانیجیگیزلئ ایجازه‌نیز اولمادیغی اوچون، ایستیفاده‌چی‌نین قارشیسی‌نین آلینماسینی گؤره بیلمز يا دا ديَیشدیره.',
+'ipbblocked' => 'دیگر ایستیفاده‌چیلری مانعه تؤره‌ده بیلمز يا دا مانعه تؤرتمه‌سینی قالدیرا بیلمز، چونکی اؤزونوز ائنگئللئنمیشسیز',
+'ipbnounblockself' => 'اؤز بوولوکلانمانیزی کالدیرمانیزا ایجازه وئریلمیر',
+
+# Developer tools
+'lockdb' => 'وئریلن‌لر بازاسینی باغلا',
+'unlockdb' => 'وئریلن‌لر بازاسین‌دان باغلانتی سین گؤتور',
+'lockdbtext' => 'وئریلنلر بازاسینی کیلیدله‌مک؛ بوتون ایستیفاده‌چیلرین صحیفه‌‌لری، سئچیملرینی و ایزلئمئ سیياهیلارینی ديَیشدیرمه‌لرینی و وئریلنلر بازاسیندا ديَیشیکلیک طلب ائدن دیگر شئيلری تخیره آلیر. 
+خاهیش ائدیریک ائتمک ایسته‌دیگینیزین بو اولدوغونو و باخیم ایشلرینیز بیتدیگینده وئریلنلر بازاسینی ایشه سالماغی تسدیق ائدین.',
+'unlockdbtext' => 'وئریلنلر بازاسی‌نین کیلیدینی آچماق؛ بوتون ایستیفاده‌چیلره صحیفه‌‌لری، سئچیملرینی و ایزلئمئ سیياهیلارینی ديَیشدیرمه‌لرینی و وئریلنلر بازاسیندا ديَیشیکلیک طلب ائدن دیگر شئيلری ائده بیلمه قابیلیتینی گئری وئرر. 
+خاهیش ائدیریک ائتمک ایسته‌دیگینیزین بو اولدوغونو تسدیق ائدین.',
+'lockconfirm' => 'بلی، من حقیقتن وئریلن‌لر بازاسینین باغلاماق ایستییرم.',
+'unlockconfirm' => 'بلی، من حقیقتن وئریلن‌لر بازاسینین باغلانمانی آچماق ایستییرم.',
+'lockbtn' => 'وئریلن‌لر بازاسینی باغلا',
+'unlockbtn' => 'وئریلن‌لر بازاسین‌دان باغلانتی سین گؤتور',
+'lockdbsuccesssub' => 'وئریلن‌لر بازاسی باغلانیب',
+'unlockdbsuccesssub' => 'باغلانما وئریلن‌لر بازاسی گوتورلنیب',
+'unlockdbsuccesstext' => 'وئریلن‌لر بازاسی باغلانمیش آولا بیلر.',
+'databasenotlocked' => 'وئریلن‌لر بازاسی باغلانماییب.',
+'lockedbyandtime' => '({{Gender: $1 | $1}} طرفین‌دن  $2 $3 اعتبار ایله)',
+
+# Move page
+'move-page' => '$1داشینیر',
+'move-page-legend' => 'صحیفه‌نین آدینی دییش',
+'movepagetext' => "آشاغی‌داکی فورما‌دان ایستیفه‌ده ائتمه صحیفه‌نین آدینی، بوتون تاریخچه‌سینی ده کؤچورمکله یئنی باشلیغا دییشه‌جک.
+اوولکی باش‌لیق یئنی باشلیغا ایستیقامتلندیرمه صحیفه‌سینه چئوریله‌جک.
+کؤهنه صحیفه‌یه کئچیدلری آوتوماتیک اولا‌راق دییشه بیلرسینیز.
+بو سئچیمی ائتمدیگینیز حالدا، [[Special:DoubleRedirects|تکرارلانان]] و یا [[Special:BrokenRedirects|قیریق ایستیقامتلندیرمه‌لری]] یوخلاماغی یاددان چیخارمایین.
+کئچیدلرین لازیمی یئره ایستیقامتلندیریلمه‌سینی تعمین ائتمک سیزین مسولیتینیزده‌دیر.
+
+نظره آلین کی، هدف باش‌لیغی آلتیندا بیر صحیفه مؤوجوددورسا یئردییشمه 'باش توتمایاجاق. بونا همین صحیفه‌نین بوش اولماسی و یا ایستیقامتلندیرمه صحیفه‌سی اولماسی و کئچمیشده رئداکته ائدیلممه‌سی حال‌لاری استثنا‌دیر. بو او دئمک‌دیر کی، سهون آدینی دییشدیگینیز صحیفه‌لری گئری قایتارا بیلر، بونونلا یاناشی آرتیق مؤوجود اولان صحیفه‌نین اوزرینه باشقا صحیفه یازا بیلمزسینیز.
+
+'خبردارلیق!'
+بو یئردییشمه پوپولیار صحیفه اوچون اساس‌لی و گؤزلنیلمز اولا بیلر، اونا گؤره ده بو دییشیک‌لیگی یئرینه یئتیرمزدن اول، بونون مومکون نتیجه‌لرینی باشا دوشدوگونوزدن عمین اولون.",
+'movepagetalktext' => "اویغون دانیشیق صحیفه‌سی آوتوماتیک حرکت ائده‌جک 'گر:'
+* بوش اولمایان دانیشیق صحیفه‌سی یئنی آدلا آرتیق مؤوجوددورسا، و یا
+* سیز بایراغی آشاغی‌دان گؤتورسه‌نیز.
+
+همین حال‌لاردا ، احتیاج یارانارسا سیز صحیفه‌لری الله بیرلش‌دیرمک مجبوریتینده قالاجاقسینیز",
+'movearticle' => 'صحیفه‌نین آدینی دییش‌دیر',
+'movenologin' => 'سیستئمده دئییلسینیز',
+'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' => 'بو آددا صحیفه آرتیق مؤوجوددور و یا سیزین سئچدیگینیز آد اویغون دئییل.
+زحمت اولماسا باشقا آد سئچین.',
+'talkexists' => "'صحیفه‌نین آدی دییشدی، لاکین دانیشیق صحیفه‌سی یئنی آدلا اولدوغو اوچون دییشه بیلمیر. زحمت اولماسا، اونون آدینی اؤزونوز دییشین.'",
+'movedto' => 'داشیندی :',
+'movetalk' => 'بو صحیفه‌نین دانیشیق صحیفه‌سی‌نین ده آدینی دییش‌دیر.',
+'move-subpages' => 'یاریم صحیفه‌لری کؤچور ($1-ا قدر)',
+'move-talk-subpages' => 'دانیشیق صحیفه‌لری‌نین آلت صحیفه‌لرینی کؤچور ($1-ا قدر)',
+'movepage-page-moved' => '$1 صحیفه‌سی $2 صحیفه‌سینه کؤچورولوب.',
+'movepage-page-unmoved' => '$1 صحیفه‌سی $2 صحیفه‌سینه کؤچوروله بیلینمیر.',
+'movelogpage' => 'يئرديیشمه سییاهه',
+'movesubpage' => '{{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' => 'بو هدف باش‌لیغینا داشینمیر.',
+'imageinvalidfilename' => 'سئچیلمیش فایل آدی کئچرسیزدیر.',
+'protectedpagemovewarning' => "'''خبردارلیق:''' بو صحیفه محافظه ائدیلدیگی اوچون اونون آدینی یالنیز ایداره‌چی‌لر دییشه بیلرلر.",
+
+# Export
+'export' => 'صحیفه‌‌لری ایخراج ائت',
+'exportall' => 'بوتون صحیفه‌لری خاریجه کؤچور',
+'exportcuronly' => 'بوتون تاریخچنی دئییل، یالنیز حال-هازیرکی نوسخه نی داخیل ائت',
+'exportnohistory' => 'هدف‌لنن قایناق صحیفه‌سی (ایسته‌یه باغ‌لی):',
+'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 MediaWiki Localisation] و [//translatewiki.net translatewiki.net]-ا باش چکین.',
+'allmessages-filter-legend' => 'فیلتر',
+'allmessages-filter-unmodified' => 'دییشدیریلممیش',
+'allmessages-filter-all' => 'هامیسی',
+'allmessages-filter-modified' => 'دییشدیریلمیش',
+'allmessages-language' => 'دیل',
+'allmessages-filter-submit' => 'گئت',
+
+# Thumbnails
+'thumbnail-more' => 'بؤیوت',
+'filemissing' => 'فایل تاپیلمادی',
+'thumbnail_error' => 'کیچیک شکیل یاراتما خطاسی: $1',
+'djvu_page_error' => 'DjVu صحیفه‌سی الچاتمازدیر',
+'djvu_no_xml' => 'DjVu اوچون XML فایلی آلماق مومکون دئییل.',
+'thumbnail_image-type' => 'گؤرونوش نؤع دستکله‌نیلمیر',
+'thumbnail_gd-library' => "' 'قئید:' صحیفه‌لرین بوتون کئچمیشینی بو فورملا خاریجه اؤتورولمه‌سی، پئرفورمانس سبب‌لرین‌دن اؤتری دؤوره خاریجی بوراخیلمیش‌دیر.$1",
+'thumbnail_image-missing' => 'بئله گؤرونور کی، $1 فایلی یوخ‌دور',
+
+# Special:Import
+'import' => 'صحیفه‌لری ایدخال ائت',
+'importinterwiki' => 'ویکیلر اراسی چیخارما',
+'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| خاریجه کؤچورمه کؤمک پروقرامییلا]] قایناق ویکی خاریجه کؤچورون.
+کومپوتئرینیزه یازین و بورا یوکلیین.',
+'importstart' => 'صحیفه‌لری ایچری توکمه حالیندا...',
+'import-revision-count' => '$1 {{PLURAL:$1|دییشدیر|دییشدیرین}}',
+'importnopages' => 'ایچری توکمه صحیفه یوخ‌دور.',
+'importfailed' => 'اوغورسوز چیخاریش: <nowiki>$1</nowiki>',
+'importunknownsource' => 'بیلینمه‌ین ایچری کؤچورمه قایناق نؤوو',
+'importcantopen' => 'ایچری توکمه فایل پرونده لری آچیلمادی',
+'importbadinterwiki' => 'یانلیش اینتئرویکی کئچیدی',
+'importnotext' => 'بوش و یا متن یوخ‌دور',
+'importsuccess' => 'ایچری توکمه باشا چاتدی!',
+'importhistoryconflict' => 'اوست-اوسته دوشمه‌ین کئچمیش رئویزیونو مؤوجود (بو صحیفه داها اول‌دن ایچه کؤچورولموش اولا بیلر)',
+'importnosources' => 'هئچ ویکیلئراراسی ایچه کؤچورمه قایناغی تعیین و بیرباشا کئچمیش یوکلملری دؤوره خاریجی.',
+'import-noarticle' => 'یوکلمگه صحیفه یوخدور!',
+'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 log
+'importlogpage' => 'چیخاریلما گونده‌لیگی',
+'importlogpagetext' => 'باشقا ویکیلردن، دَییشیکلیک گئچمیشلریله بیرلیک‌ده گتیریلمیش صحیفه‌لر.',
+'import-logentry-upload' => '[[$1]]-ی فایل یوکله‌مکله گتیردی',
+'import-logentry-upload-detail' => '{{PLURAL:$1|بیر|$1}} نوسخه',
+'import-logentry-interwiki' => '$1-ی ویکی‌آراسی ائتدی',
+'import-logentry-interwiki-detail' => '$2-دن {{PLURAL:$1|بیر|$1}} نوسخه',
+
+# JavaScriptTest
+'javascripttest' => 'جاوااسکریپت تِستی',
+'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' => 'مئدیاویکی جاوااسکریپت QUnit تِست مجموعه‌سی',
+
+# 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' => 'سیز بو صحیفه‌نی دَییشدیره بیلرسینیز. لوطفاً قئید ائتمه‌دن اونجه اؤن‌گؤستریش دویگه‌سینی ایشلدین',
+'tooltip-ca-addsection' => 'یئنی بؤلوم یارات',
+'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' => 'بو صفحه‌نی ایزله‌دیگینیز صفحه‌لردن قالدیرین',
+'tooltip-search' => '{{SITENAME}}-دا آختار',
+'tooltip-search-go' => 'اولورسا بو آددا بیر صحیفه‌یه گئت',
+'tooltip-search-fulltext' => 'بو یازی اولان صحیفه‌لری آختار',
+'tooltip-p-logo' => 'آنا صحیفه‌یه باخ',
+'tooltip-n-mainpage' => 'آنا صحیفه‌ یه باخین',
+'tooltip-n-mainpage-description' => 'آنا صحیفه‌یه باخین',
+'tooltip-n-portal' => 'پروژه‌ یه گؤره، سیز نه ایش گوره بیلرسیز، هاردا نه‌لری تاپا بیلرسیز',
+'tooltip-n-currentevents' => 'گونجل اولایلارلا ایلگیلی بیلگیلر تاپ',
+'tooltip-n-recentchanges' => 'بو ویکی‌ده سون دَییشیکلرین لیستی',
+'tooltip-n-randompage' => 'بیرصحیفه صحیفه‌لردن گتیر',
+'tooltip-n-help' => 'آنلاماق یئری',
+'tooltip-t-whatlinkshere' => 'بورایا لینک اولان بوتون صحیفه‌لرین لیستی',
+'tooltip-t-recentchangeslinked' => 'بۇ مقاله‌يه عاید باشقا صحیفه‌‌لرده يئنی ديَیشیکلیکلر',
+'tooltip-feed-rss' => 'بو صحیفه‌‌ اوچون آراس‌اس يايیمی',
+'tooltip-feed-atom' => 'بو صحیفه‌‌ اوچون آتوم يايیمی',
+'tooltip-t-contributions' => 'بو ایستیفاده‌چی‌نین وئردیگی دییشیکلر سیاهی‌سی',
+'tooltip-t-emailuser' => 'بو ایستیفاده‌چی یه بیر ایمیل گؤندر',
+'tooltip-t-upload' => 'يئنی شکیل و يا مولتی‌مئدیا فايلی يوکله',
+'tooltip-t-specialpages' => 'بوتون اؤزل صحیفه‌لرین لیستی',
+'tooltip-t-print' => 'بو صحیفه‌‌نین چاپ ائدیلن نوسخه‌سی',
+'tooltip-t-permalink' => 'یارپاغا بو وئرسیياسینا دایمی کئچید',
+'tooltip-ca-nstab-main' => 'مقاله‌یه باخین',
+'tooltip-ca-nstab-user' => 'ایستیفاده‌چی صفحه‌سینه باخ',
+'tooltip-ca-nstab-media' => 'مئدیا-فايل',
+'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' => 'ديَیشیکلیکلرینیزی قئيد ائدین',
+'tooltip-preview' => 'لوطفاً صحیفه‌نی قئید ائتمک‌دن اؤنجه، دییشیکلرینیزی سیناق گؤستریش ایله باخین!',
+'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-not-current' => 'تأسفله بو بیلگیلری اسکی نوسخه‌لره وئرمک اولانماز بیر ایش‌دیر.',
+'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-magic-words' => 'سیحیرلی {{PLURAL:$1|بیر|$1}} سؤزجوک ($1)',
+'pageinfo-hidden-categories' => 'گیزلی {{PLURAL:$1|بؤلمه|بؤلمه‌لر}} ($1)',
+'pageinfo-templates' => 'ایشله‌دیلمیش {{PLURAL:$1|بیر|$1}} شابلون ($1)',
+'pageinfo-redirectsto-info' => 'بیلگی',
+'pageinfo-contentpage-yes' => 'بلی',
+'pageinfo-protect-cascading-yes' => 'بلی',
+
+# Patrolling
+'markaspatrolleddiff' => 'ایداره ائدیلمیش اولا‌راق ایشاره‌له',
+'markaspatrolledtext' => 'صحیفنی پاتروللانمیش کیمی ایشاره‌له',
+'markedaspatrolled' => 'یوخلانیلدی',
+'markedaspatrolledtext' => '[[:$1]] اوچون سئچیلمیش نوسخه گؤزدن کئچیریله‌رک ایشاره‌لندی.',
+'rcpatroldisabled' => 'سون دییشیک‌لیک‌لرین پاتروللانماسی قاداغان‌دیر',
+'rcpatroldisabledtext' => 'سون دییشیک‌لیک‌لرین یوخلانیلماسی حال-حاضردا مومکون دئییل.',
+'markedaspatrollederror' => 'یوخلانمادی',
+'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-current-unregistered' => 'گؤستریلن "$1" فایلی وئریلن‌لر بازاسیندا یوخ‌دور.',
+'filedelete-archive-read-only' => '"$1" کاتالوقونون آرشیوی وئب-سئروئر یازی‌لاری اوچون باغلی‌دیر.',
+
+# Browsing diffs
+'previousdiff' => 'اسکی دَییشدیرمه',
+'nextdiff' => 'یئنی دَییشدیرمه',
+
+# Media information
+'imagemaxsize' => "شکیلین ماکسیمال توتومو:<br />(فایلین تصویری صحیفه‌لری اوچون)'",
+'thumbsize' => 'کیچیک اؤلچو:',
+'widthheightpage' => '$1 × $2، $3 {{PLURAL:$3|صحیف|صحیفه‌لر}}',
+'file-info' => 'فایلین اؤلچوسو: $1، MIME تیپی: $2',
+'file-info-size' => '$1 × $2 پیکسل, فایل اؤلچوسو: $3, MIME نوعو: $4',
+'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-frames' => '$1 {{PLURAL:$1|فرامئ|چرچیوه}}',
+
+# Special:NewFiles
+'newimages' => 'یئنی فایل‌لارین سیاهی‌سی',
+'newimages-legend' => 'فیلتر',
+'newimages-label' => 'فایلین (و یا اونون بیر حیسه‌سی‌نین) آدی:',
+'showhidebots' => '($1 روبات دییشدیر)',
+'noimages' => 'هئچ نیی گؤرممک.',
+'ilsubmit' => 'آختار',
+'bydate' => 'تاریخین اوستوندن',
+
+# 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 اؤنجه',
+'just-now' => 'ایندی',
+
+# Bad image list
+'bad_image_list' => 'فوْرمات بۇ شکیلده اوْلمالیدیر: 
+
+يالنیز سیياهی بندلری (* ایشاره‌سی ایله باشلايان سطرلر) نظره آلینیر. 
+سطرده‌کی ایلک کئچید، علاوه‌‌ اوْلونماسی قاداغان اوْلونموش شکیله کئچید اوْلمالیدیر. 
+همین سطرده‌کی نؤوبتی کئچیدلر استثنا حساب اوْلونور. مثلا، فايل مقاله‌ده سطرین ایچینده گؤرونه بیلر.',
+
+# Metadata
+'metadata' => 'بیگیلر',
+'metadata-help' => 'بۇ فايلدا فوْتوْاپارات و يا سکانئرله علاوه‌‌ اوْلونموش معلوماتلار وار. اگر فايل سوْنرادان دَییشدیریلیبسه، بعضی پارامئترلر بۇ شکیلده گؤستریلنلردن فرقلی اوْلا بیلر.',
+'metadata-expand' => 'جزئیات معلومات‌لاری گؤستر',
+'metadata-collapse' => 'جزئیات معلومات‌لاری گیزلت',
+'metadata-fields' => 'بو صحیفه‌‌ده سیرالانان ائخیف مئتاداتا ساحه‌‌لری شکیل گؤرونوش صحیفه‌‌لرینده مئتاداتا جدوه‌لی چؤکدويونده ایستیفاده ائدیلیر. دیگرلری وارسايیلان اولاراق گیزلنه‌جکدیر. 
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# 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' => 'جابه‌جایی نسبت به JPEG SOI',
+'exif-jpeginterchangeformatlength' => 'JPEG معلومات بازاسینین بایت‌لاری',
+'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-colorspace' => 'رنگ ساحه‌سی',
+'exif-pixelydimension' => 'شکیلین انی',
+'exif-pixelxdimension' => 'شکیلین اوزوناسی',
+'exif-usercomment' => 'استفادچی شرحی',
+'exif-datetimeoriginal' => 'اورژینال یاراتما زامانی',
+'exif-datetimedigitized' => 'دیجیتالی‌ اولان تاریخ و زمانی',
+'exif-subsectime' => 'آلت-ایکینجی واخت',
+'exif-subsectimeoriginal' => 'اورژینال آلت-ایکینجی واخت',
+'exif-subsectimedigitized' => 'دیژیتالیز آلت-ایکینجی واخت',
+'exif-exposuretime' => 'چکیلیش مدتی',
+'exif-exposuretime-format' => '$1 سانییه ($2)',
+'exif-fnumber' => 'ف نؤمره‌سی',
+'exif-exposureprogram' => 'پوزا برنامه سی',
+'exif-spectralsensitivity' => 'طیفی حساس‌لیق',
+'exif-isospeedratings' => 'ایزو سرعت درجه سی',
+'exif-shutterspeedvalue' => 'آپکس شاتر سرعتی',
+'exif-aperturevalue' => 'آپکس دیافراگم اندازه سی',
+'exif-brightnessvalue' => 'آپکس پارلاقی',
+'exif-exposurebiasvalue' => 'ایشیق وئرمه خطاسی',
+'exif-maxaperturevalue' => 'یئرین ان چوخ آچیقلیغی',
+'exif-subjectdistance' => 'سوژهه قدر مسافه',
+'exif-meteringmode' => 'اؤلچمک دورومو',
+'exif-lightsource' => 'ایشیق قایناقی',
+'exif-flash' => 'فلاش',
+'exif-focallength' => 'فوکوس مسافه‌سی',
+'exif-subjectarea' => 'جسمین مساحتی',
+'exif-flashenergy' => 'فلاش ائنئرژی‌سی',
+'exif-focalplanexresolution' => 'صفحهٔ کانونی سویه X هللولما دقیق‌لیگی',
+'exif-focalplaneyresolution' => 'صفحهٔ کانونی ده تفکیک‌پذیری Y',
+'exif-gpsaltitude' => 'يوکسکلیک',
+'exif-gpsdop' => 'اؤلچونون دقیقلیگی',
+'exif-gpsspeedref' => 'سرعت اونیتی',
+'exif-gpstrack' => 'ایدارئتمه مئخانیزمی',
+'exif-gpsimgdirection' => 'شکلین ایستیقامتی',
+'exif-gpsdestlatitude' => 'ائن دایره‌سی‌نین تعیین اولونماسی',
+'exif-gpsdestlongitude' => 'اوزونلوق دایره‌سی‌نین تعیین اولونماسی',
+'exif-gpsdestbearing' => 'اوبيئکتین پئلئنقی',
+'exif-gpsdestdistance' => 'مسافه',
+'exif-keywords' => 'آچار سؤزلر',
+'exif-worldregioncreated' => 'شکلین چکیلدیگی دونيا یئرلری',
+'exif-countrycreated' => 'شکلین چکیلدیگی اؤلکه',
+'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-identifier' => 'تانیملاییجی',
+'exif-lens' => 'ایستیفاده اولونموش لنز',
+'exif-serialnumber' => 'کامئرانین سئریال نؤمره‌سی',
+'exif-cameraownername' => 'کامئرانین صاحبی',
+'exif-label' => 'نیشان',
+'exif-nickname' => 'شکلین قئيری-رسمی آدی',
+'exif-rating' => 'قیيمت (5 اوزرینده)',
+'exif-copyrighted' => 'ستاتوسون یازانلار حقوقو',
+'exif-copyrightowner' => 'یازانلار حقوقو صاحبی',
+'exif-usageterms' => 'ایستیفاده قايداسی',
+'exif-webstatement' => 'اینتئرنئتده مؤلف‌لیک حقوق‌لاری قایدا‌لاری',
+'exif-morepermissionsurl' => 'آلتئرناتیو لیسئنزیيا بیلگی‌لری',
+'exif-pngfilecomment' => 'PNG شکیل شرحی',
+'exif-disclaimer' => 'مسئولیتدن ایمتیناع',
+'exif-contentwarning' => 'متن خبردارلیغی',
+'exif-giffilecomment' => 'GIF شکیل شرحی',
+'exif-intellectualgenre' => 'اوبیئکتین تیپی',
+'exif-subjectnewscode' => 'مؤوضونون کودو',
+'exif-scenecode' => 'IPTC صحنه‌‌ کودو',
+'exif-event' => 'تصویر ائدیلمیش حادثه‌‌',
+'exif-organisationinimage' => 'تصویر ائدیلمیش قوروملار',
+'exif-personinimage' => 'تصویر ائدیلمیش شخص',
+
+# EXIF attributes
+'exif-compression-1' => 'سیخیلمامیش',
+
+'exif-copyrighted-true' => 'مؤلف‌لیک حقوقو ایله قورونور',
+'exif-copyrighted-false' => 'عمومی دامنه',
+
+'exif-unknowndate' => 'تانینمامیش تاریخ',
+
+'exif-orientation-1' => 'نورمال',
+'exif-orientation-2' => 'یاتای چئویریلیب',
+'exif-orientation-3' => '۱۸۰ درجه دؤنده‌ریلیب',
+'exif-orientation-4' => 'دیکَی چئویریلیب',
+'exif-orientation-5' => '۹۰ درجه ساعات عکسی دؤنده‌ریلیب و دیکَی چئویریلیب',
+'exif-orientation-6' => '۹۰ درجه ساعات عکسی دؤنده‌ریلیب',
+'exif-orientation-7' => '۹۰ درجه ساعات یولوندا دؤنده‌ریلیب و دیکَی چئویریلیب',
+'exif-orientation-8' => '۹۰ درجه ساعات یولوندا دؤنده‌ریلیب',
+
+'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' => '{{PLURAL:$1|بیر|$1}} متر دنیز سویه‌سیندن یوخاری',
+'exif-gpsaltitude-below-sealevel' => '{{PLURAL:$1|بیر|$1}} متر نیز سویه‌سیندن آشاغی',
+
+'exif-gpsstatus-a' => 'اؤلچمه یئکونلاشماییب',
+'exif-gpsstatus-v' => 'وئریلن‌لری اؤتورمک اوچون حاضردیر',
+
+'exif-gpsmeasuremode-2' => '2-اؤلچولو اولچو',
+'exif-gpsmeasuremode-3' => '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' => '65535-دن بؤیوک‌دور',
+
+'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] -ه باخ)',
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => 'بوتون',
+'namespacesall' => 'بوتون',
+'monthsall' => 'بوتون',
+'limitall' => 'بوتون',
+
+# E-mail address confirmation
+'confirmemail' => 'ایمیل-پوست اونوانینی تصدیق ائت',
+'confirmemail_send' => 'تسدیق کودو گؤندر',
+'confirmemail_invalidated' => 'ایمیل تصدیقلنمه‌سی دایاندیریلدی',
+'invalidateemail' => 'ایمیل تصدیقلنمه‌سین‌دن ایمتینا',
+
+# Scary transclusion
+'scarytranscludedisabled' => '[«Interwiki transcluding»دن چیخیلمیش‌دیر]',
+'scarytranscludefailed' => '[$1اوچون شابلون آلیشی موفقیت‌سیز اولدو]',
+
+# Delete conflict
+'recreate' => 'يئنیله‌مک',
+
+# action=purge
+'confirm_purge_button' => 'اولدو',
+'confirm-purge-top' => 'بو صحیفه‌‌ کئشدن (cache) سیلینسین؟',
+'confirm-purge-bottom' => 'بیر صحیفه‌‌نی لغو ائتمک کئشی تمیزله‌ير و ان آکتوال دیستریبوتیوین گؤرونمه‌سینه مجبور ائدر.',
+
+# action=watch/unwatch
+'confirm-watch-button' => 'اولدو',
+'confirm-watch-top' => 'بو صفحه‌نی ایزله‌دیکلرینیزه آرتیریلدی',
+'confirm-unwatch-button' => 'اولدو',
+'confirm-unwatch-top' => 'بو صفحه‌نی ایزله‌دیگینیز صفحه‌لردن قالدیریلدی',
+
+# Multipage image navigation
+'imgmultipageprev' => '&larr; اولکی صحیفه‌‌',
+'imgmultipagenext' => 'سونراکی صحیفه‌‌ &rarr;',
+'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' => 'گؤزله... حاضردیر!',
+
+# Watchlist editor
+'watchlistedit-noitems' => 'ایزله‌مه سیياهینیز بوشدور.',
+'watchlistedit-normal-title' => 'ایزله‌دیگیم صحیفه‌‌لری دَییشدیر',
+'watchlistedit-normal-legend' => 'ایزله‌مه سیياهیسیندان باشلیقلارین سیلینمه‌سی',
+'watchlistedit-normal-submit' => 'باشلیقین سیلینمه‌سی',
+'watchlistedit-normal-done' => '{{PLURAL:$1|$1 صحیفه‌‌}} ایزله‌مه صحیفه‌‌لرینیزدن سیلیندی:',
+'watchlistedit-raw-title' => 'چی متن کیمی دییشدیر',
+'watchlistedit-raw-legend' => 'چی متن کیمی دییشدیر',
+'watchlistedit-raw-titles' => 'باشلیقلار:',
+'watchlistedit-raw-submit' => 'ایزلدیگیم صحیفه‌لرین سیاهی‌سینین یئنی‌لنمه‌سی',
+'watchlistedit-raw-done' => 'ایزله‌دیکلرینیز گونجل‌لندی.',
+'watchlistedit-raw-added' => '{{PLURAL:$1|بیر|$1}} باشلیق آرلیریلدی:',
+'watchlistedit-raw-removed' => '{{PLURAL:$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' => '\'\'\'دیققت:\'\'\' احتیمال ائدیلن "$2" دفالت آچاری اول‌کی "$1" دفالت آچارینی کئچرسیز ائدیر.',
+
+# 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' => "بو wیکی ' ''[//www.mediawiki.org/ مئدیاwیکی]'ع' پروقرامی ایستیفاده ائدیله‌رک يارادیلمیشدیر، یاازارلار © 2001-$1 $2.",
+'version-poweredby-others' => 'آیریلار',
+'version-license-info' => 'مئدیاویکی بیر اؤزگور یازیلیم‌دیر؛ سیز اونو، اؤزگور یازیلیم قورولوشو یایان GNU گنل عمومی لیسانسی اساسی‌له یئنی‌دن داغیدیب یوخسا دَییشه بیلرسینیز؛ یا لیسانسین ۲-نجی نوسخه‌سی، یا دا (اؤز سئچدیگینیزله) هر هانکی سونراکی نوسخه‌سی.
+
+مئدیاویکی، فایدالی اولماق اومودویله داغینیب‌دیر، اما هئچ قارانتی‌سی یوخدور؛ حتی تیجارت یا بیر ایشه اویغون اولماق قارانتی‌سی ده یوخدور.باشقا بیلگیلر اوچون GNU گنل عمومی لیسانسینا باخین.
+
+سیز گرک بو یازیلیم‌لا، [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU گنل عمومی لیسانسی]نین بیر نوسخه‌نی‌ده آلمیش اولاسینیز؛ ائله اولماسا، [//www.gnu.org/licenses/old-licenses/gpl-2.0.html اونو آنلاین اوخویون]، یوخسا اؤزگور یازیلیم قورولوشونا بو آدرس‌ده یازین: 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301',
+'version-software' => 'يوکلو پروقرام',
+'version-software-product' => 'محصول',
+'version-software-version' => 'نوسخه‌',
+'version-entrypoints' => 'گیریش نقطه‌‌سی‌نین آدرسی',
+'version-entrypoints-header-entrypoint' => 'گیریش نقطه‌‌سی',
+'version-entrypoints-header-url' => 'اینترنت آدرسی',
+
+# Special:FilePath
+'filepath' => 'فايل يولو',
+'filepath-page' => 'فایل:',
+'filepath-submit' => 'گئت',
+'filepath-summary' => 'بو اؤزل صحیفه‌‌ بیر فايل اوچون تام يولو گتیرر. 
+شکیللر تام تصویرین گؤستریلیر، دیگر فايل نؤولری ایله باغلی پروقراملاری بیرباشا ایشه باشلايیر.',
+
+# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'دوبلیکات فايل آختاریشی',
+'fileduplicatesearch-summary' => 'تعمین ائتمک ديَری دؤشه‌مه‌سینده بنزر فايللاری آختار.',
+'fileduplicatesearch-legend' => 'Dublikatı axtar',
+'fileduplicatesearch-filename' => 'فايل آدی:',
+'fileduplicatesearch-submit' => 'آختار',
+'fileduplicatesearch-info' => '$1 × $2 پیکسِل<br />فایل اؤلچوسو: $3<br />MIME نوعو: $4',
+'fileduplicatesearch-result-1' => '«$1» فایلینین هئچ بیر عینی کوپیسی یوخدور.',
+'fileduplicatesearch-result-n' => '«$1» فایلینین، {{PLURAL:$2|بیر|$2}} عینی کوپیسی واردیر.',
+'fileduplicatesearch-noresults' => '"$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-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' => 'بوش صحیفه',
+'intentionallyblankpage' => 'بو صحیفه خصوصیله بوش‌دور.',
+
+# External image whitelist
+'external_image_whitelist' => ' #بو ساتیری اولدوغو گیبی بیراکین <pre>
+#دوزئنلی ایفادئ پارچالارینی (سادئجئ // آراسیندا کالان کیسمی) آشاغیيا ائکلئيین 
+#Bunlar harici (hotlink) resimlerin URLleri ile eşlenecektir
+#ائشلئشئنلئر رئسیم اولاراک گؤرونئجئک، آکسی تاکدیردئ سادئجئ رئسمئ بیر باغلانتی گؤرونئجئکتیر 
+# # ile başlayan satırlar yorum olarak muamele görecektir
+#Büyük-küçük harf duyarsızdır
+
+#Bütün düzenli ifade parçalarını bu satırın üstüne ekleyin. Bu satırı olduğu gibi bırakın</pre>',
+
+# Special:Tags
+'tags' => 'مومکون دییشیک‌لیک ائتیکئت‌لری',
+'tag-filter' => '[[Special:Tags|ائتیکئت ]] سوزگجی:',
+'tag-filter-submit' => 'فیلتر',
+'tags-title' => 'یاپیشقان',
+'tags-intro' => 'بو صحیفه، یازیلیم دَییشدیرمه‌لری نیشانلایان اِتیکِتلری و اونلارین آنلاملارینی گؤستریر.',
+'tags-tag' => 'یاپیشقان آدی',
+'tags-display-header' => 'ديَیشیکلیک لیستئلئریندئکی گؤرونوش',
+'tags-description-header' => 'آنلامینین تام آچیقلاماسی',
+'tags-hitcount-header' => 'یاپیشقانلی دییشیک‌لیک‌لر',
+'tags-edit' => 'دَییشدیر',
+'tags-hitcount' => '$1 {{PLURAL:$1|دییشیکلیک|دییشیک‌لیک}}',
+
+# Special:ComparePages
+'comparepages' => 'صحیفه‌لری قارشی‌لاش‌دیر',
+'compare-selector' => 'صحیفه دییشدیر‌لرینی قارشی‌لاش‌دیر',
+'compare-page1' => 'صحیفه 1',
+'compare-page2' => 'صحیفه 2',
+'compare-rev1' => 'نسخهٔ ۱',
+'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، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} دَییشدیردی: $4',
+'logentry-delete-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} دَییشدیردی: $4',
+'logentry-delete-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی دَییشدیردی',
+'logentry-delete-revision-legacy' => '$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی دَییشدیردی',
+'logentry-suppress-delete' => '$1، $3 صحیفه‌سینی یاتیردی',
+'logentry-suppress-event' => '$1، $3-ده $5 سیاهی اولایینین {{PLURAL:$5|گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه دَییشدیردی: $4',
+'logentry-suppress-revision' => '$1، $3 صحیفه‌سینده $5 نوسخه‌نین {{PLURAL:گؤرونوشونو|گؤرونوشلرینی}} گیزلینجه دَییشدیردی: $4',
+'logentry-suppress-event-legacy' => '$1، $3-ده سیاهی اولایلارینین گؤرونوشلرینی گیزلینجه دَییشدیردی',
+'logentry-suppress-revision-legacy' => '$1، $3 صحیفه‌سینده نوسخه‌لرین گؤرونوشلرینی گیزلینجه دَییشدیردی',
+'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، $3 صحیفه‌سینین $4 نوسخه‌سینی، نظارتلنمیش نیشانلادی',
+'logentry-patrol-patrol-auto' => '$1، $3 صحیفه‌سینین $4 نوسخه‌سینی، اوتوماتیک اولاراق نظارتلنمیش نیشانلادی',
+'logentry-newusers-newusers' => ' بیر ایستیفاده‌چی حسابی $1 یاراتدی',
+'logentry-newusers-create' => 'بیر ایستیفاده‌چی حسابی $1 یاراتدی',
+'logentry-newusers-create2' => 'بیر ایستیفاده‌چی $1 حسابی $3 یاراتدی',
+'logentry-newusers-autocreate' => '$1 حسابی اوتوماتیک یارادیلدی',
+'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' => 'خطا: API-دان جاواب گلمه‌دی',
+'feedback-thanks' => 'تشکورلر! سیزین گئری-بیلدیریمینیز «[$2 $1]» صحیفه‌سینه گؤندریلدی.',
+'feedback-close' => 'اولدو',
+'feedback-bugcheck' => 'گؤزل! فقط لوطفاً باخین او [$1 تانینمیش خطالار]دان اولماسین.',
+'feedback-bugnew' => 'یوخلادیم. یئنی بیر خطا گؤندر',
+
+# Search suggestions
+'searchsuggest-search' => 'آختار',
+'searchsuggest-containing' => 'ساخلانیلیر...',
+
+# API errors
+'api-error-badaccess-groups' => 'سیزین بو ویکی‌یه فایل یوکله‌مک ایجازه‌نیز یوخدور.',
+'api-error-badtoken' => 'ایچری خطاسی: پیس کود.',
+'api-error-copyuploaddisabled' => 'بو خیدمتچی‌ده، اینترنت آدرسی‌له فایل یوکله‌مک یاساقلانیب‌دیر.',
+'api-error-duplicate' => 'بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|[$2 فایل]|[$2 فایل‌لار]}} واردیر.',
+'api-error-duplicate-archive' => 'بو یاست‌دا، همن بیلگیلرله، باشقا {{PLURAL:$1|[$2 فایل]|[$2 فایل‌لار]}} وار ایدی، اما {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.',
+'api-error-duplicate-archive-popup-title' => 'تیکرارلانمیش {{PLURAL:$1|فایل|فایل‌لار}}، اؤنجه‌دن {{PLURAL:$1|سیلینیب‌دیر|سیلینیبلر}}.',
+'api-error-duplicate-popup-title' => 'تیکرارلانمیش {{PLURAL:$1|فایل|فایل‌لار}}.',
+'api-error-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' => 'سیز وئردیگینیز دَییشیکلیکلرین قاباغی، بیر extension ایله قاباغی آلیندی.',
+'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 POST لازیم‌دیر.',
+'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' => '{{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 097eb64..eaf2af2 100644 (file)
@@ -24,7 +24,7 @@ $fallback = 'ru';
 
 $namespaceNames = array(
        NS_MEDIA            => 'Медиа',
-       NS_SPECIAL          => 'ЯÑ\80Ò\99амÑ\81Ñ\8b',
+       NS_SPECIAL          => 'Ð\9cаÑ\85Ñ\81Ñ\83Ñ\81',
        NS_TALK             => 'Фекерләшеү',
        NS_USER             => 'Ҡатнашыусы',
        NS_USER_TALK        => 'Ҡатнашыусы_менән_һөйләшеү',
@@ -42,6 +42,7 @@ $namespaceNames = array(
 );
 
 $namespaceAliases = array(
+       'Ярҙамсы'                     => NS_SPECIAL,
        'Фекер_алышыу'                => NS_TALK,
        'Ҡатнашыусы_м-н_фекер_алышыу' => NS_USER_TALK,
        '$1_б-са_фекер_алышыу'        => NS_PROJECT_TALK,
@@ -56,6 +57,85 @@ $namespaceAliases = array(
 
 $specialPageAliases = 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( 'Иҫәп_яҙыуы_яһау' ),
+       'Deadendpages'              => array( 'Көрсөк_биттәр' ),
+       'DeletedContributions'      => array( 'Юйылған_өлөш' ),
+       'Disambiguations'           => array( 'Күп_мәғәнәлелек' ),
+       'DoubleRedirects'           => array( 'Икеле_йүнәлтеүҙәр' ),
+       'EditWatchlist'             => array( 'Күҙәтеү_исемлеген_мөхәррирләү' ),
+       'Emailuser'                 => array( 'Ҡатнашыусыға_хат' ),
+       'Export'                    => array( 'Экспорт' ),
+       'FileDuplicateSearch'       => array( 'Файлдың_дубликаттарын_эҙләү' ),
+       'Filepath'                  => array( 'Файл_юлы' ),
+       'Import'                    => array( 'Импорт' ),
+       'BlockList'                 => array( 'Блоклауҙар_исемлеге' ),
+       'LinkSearch'                => array( 'Һылтанмалар_эҙләү' ),
+       'Listadmins'                => array( 'Хакимдар_исемлеге' ),
+       'Listbots'                  => array( 'Боттар_исемлеге' ),
+       'Listfiles'                 => array( 'Файлдар_исемлеге' ),
+       'Listgrouprights'           => array( 'Ҡатнашыусы_төркөмдәре_хоҡуҡтары' ),
+       'Listredirects'             => array( 'Йүнәлтеүҙәр_исемлеге' ),
+       'Listusers'                 => array( 'Ҡатнашыусылар_исемлеге' ),
+       'Log'                       => array( 'Журналдар' ),
+       'Lonelypages'               => array( 'Етем_биттәр' ),
+       'Longpages'                 => array( 'Оҙон_биттәр' ),
+       'MergeHistory'              => array( 'Тарихтарҙы_берләштереү' ),
+       'Mostimages'                => array( 'Йыш_ҡулланылған_файлдар' ),
+       'Movepage'                  => array( 'Бит_исемен_үҙгәртеү' ),
+       'Mycontributions'           => array( 'Өлөшөм' ),
+       'Mypage'                    => array( 'Битем' ),
+       'Mytalk'                    => array( 'Әңгәмә_битем' ),
+       'Myuploads'                 => array( 'Тейәүҙәрем' ),
+       'Newimages'                 => array( 'Яңы_файлдар' ),
+       'Newpages'                  => array( 'Яңы_биттәр' ),
+       'PasswordReset'             => array( 'Паролде_яңыртыу' ),
+       'PermanentLink'             => array( 'Даими_һылтанма' ),
+       'Popularpages'              => array( 'Популяр_биттәр' ),
+       'Preferences'               => array( 'Көйләүҙәр' ),
+       'Protectedpages'            => array( 'Һаҡланған_биттәр' ),
+       'Protectedtitles'           => array( 'Һаҡланған_исемдәр' ),
+       'Randompage'                => array( 'Осраҡлы_мәҡәлә' ),
+       'Recentchanges'             => array( 'Һуңғы_үҙгәртеүҙәр' ),
+       'Recentchangeslinked'       => array( 'Бәйле_үҙгәртеүҙәр' ),
+       'Revisiondelete'            => array( 'Төҙәтеүҙе_юйыу' ),
+       'Search'                    => array( 'Эҙләү' ),
+       'Shortpages'                => array( 'Ҡыҫҡа_биттәр' ),
+       'Specialpages'              => array( 'Махсус_биттәр' ),
+       'Tags'                      => array( 'Билдәләр' ),
+       'Unblock'                   => array( 'Блокты_сисеү' ),
+       'Uncategorizedcategories'   => array( 'Категорияланмаған_категориялар' ),
+       'Uncategorizedimages'       => array( 'Категорияланмаған_файлдар' ),
+       'Uncategorizedpages'        => array( 'Категорияланмаған_биттәр' ),
+       'Uncategorizedtemplates'    => array( 'Категорияланмаған_ҡалыптар' ),
+       'Undelete'                  => array( 'Тергеҙеү' ),
+       'Unusedcategories'          => array( 'Ҡулланылмаған_категориялар' ),
+       'Unusedimages'              => array( 'Ҡулланылмаған_файлдар' ),
+       'Unusedtemplates'           => array( 'Ҡулланылмаған_ҡалыптар' ),
+       'Upload'                    => array( 'Тейәү' ),
+       'UploadStash'               => array( 'Йәшерен_тейәү' ),
+       'Userlogin'                 => array( 'Танылыу' ),
+       'Userlogout'                => array( 'Ултырышты_тамамлау' ),
+       'Userrights'                => array( 'Хоҡуҡтарҙы_идаралау' ),
+       'Wantedcategories'          => array( 'Кәрәкле_категориялар' ),
+       'Wantedfiles'               => array( 'Кәрәкле_файлдар' ),
+       'Wantedpages'               => array( 'Кәрәкле_биттәр' ),
+       'Wantedtemplates'           => array( 'Кәрәкле_ҡалыптар' ),
+       'Watchlist'                 => array( 'Күҙәтеү_исемлеге' ),
+       'Whatlinkshere'             => array( 'Бында_һылтанмалар' ),
+       'Withoutinterwiki'          => array( 'Интервикиһыҙ' ),
 );
 
 // Remove Russian aliases
@@ -136,20 +216,20 @@ $messages = array(
 'thu' => 'Кс',
 'fri' => 'Йм',
 'sat' => 'Шб',
-'january' => 'ғинуар (һыуығай)',
-'february' => 'февраль (шаҡай)',
-'march' => 'март (буранай)',
-'april' => 'апрель (алағарай)',
+'january' => 'ғинуар',
+'february' => 'февраль',
+'march' => 'март',
+'april' => 'апрель',
 'may_long' => 'май (һабанай)',
-'june' => 'июнь (һөтай)',
-'july' => 'июль (майай)',
-'august' => 'август (урағай)',
-'september' => 'сентябрь (һарысай)',
-'october' => 'октябрь (ҡарасай)',
-'november' => 'ноябрь (ҡырпағай)',
-'december' => 'декабрь (аҡъюлай)',
-'january-gen' => 'ғинуар (һыуығай)',
-'february-gen' => 'февраль (шаҡай)',
+'june' => 'июнь',
+'july' => 'июль',
+'august' => 'август',
+'september' => 'сентябрь',
+'october' => 'октябрь',
+'november' => 'ноябрь',
+'december' => 'декабрь',
+'january-gen' => 'ғинуар',
+'february-gen' => 'февраль',
 'march-gen' => 'март',
 'april-gen' => 'апрель',
 'may-gen' => 'май',
@@ -158,8 +238,8 @@ $messages = array(
 'august-gen' => 'август',
 'september-gen' => 'сентябрь',
 'october-gen' => 'октябрь',
-'november-gen' => 'ноябрь (ҡырпағай)',
-'december-gen' => 'декабрь (аҡъюлай)',
+'november-gen' => 'ноябрь',
+'december-gen' => 'декабрь',
 'jan' => 'ғин',
 'feb' => 'фев',
 'mar' => 'мар',
@@ -198,7 +278,7 @@ $messages = array(
 'cancel' => 'Бөтөрөргә',
 'moredotdotdot' => 'Дауамы...',
 'mypage' => 'Шәхси бит',
-'mytalk' => 'Минең менән әңгәмә',
+'mytalk' => 'Әңгәмә',
 'anontalk' => 'Был IP-адресының фекер алышыу бите',
 'navigation' => 'Төп йүнәлештәр',
 'and' => '&#32;һәм',
@@ -208,7 +288,6 @@ $messages = array(
 'qbbrowse' => 'Байҡарға',
 'qbedit' => 'Үҙгәртергә',
 'qbpageoptions' => 'Был бит',
-'qbpageinfo' => 'Бит тураһында мәғлүмәттәр',
 'qbmyoptions' => 'Биттәрем',
 'qbspecialpages' => 'Махсус биттәр',
 'faq' => 'ЙБҺ',
@@ -242,7 +321,7 @@ $messages = array(
 'history' => 'Тарих',
 'history_short' => 'Тарих',
 'updatedmarker' => 'һуңғы кереүемдән һуң яңыртылған',
-'printableversion' => 'Ҡағыҙға баҫыу өлгөһө',
+'printableversion' => 'Баҫтырыу өлгөһө',
 'permalink' => 'Даими һылтанма',
 'print' => 'Баҫыу',
 'view' => 'Ҡарау',
@@ -323,6 +402,7 @@ $1',
 'versionrequiredtext' => 'Был бит менән эшләү өсөн MediaWiki-ның $1 версияһы кәрәк. [[Special:Version|Ҡулланылған версия тураһында мәғлүмәт битен]] ҡара.',
 
 'ok' => 'Тамам',
+'pagetitle' => '{{SITENAME}} проектынан',
 'retrievedfrom' => 'Сығанағы — «$1»',
 'youhavenewmessages' => 'Яңы $1 бар ($2).',
 'newmessageslink' => 'яңы хәбәр',
@@ -472,11 +552,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Һеҙ иҫәп яҙыуығыҙҙан сыҡтығыҙ.'''
 
-Һеҙ {{SITENAME}} проектында аноним рәүештә дауам итә йәки [[Special:UserLogin|яңынан таныла]] алаһығыҙ (үҙ йәки башҡа исем менән).
+Һеҙ {{SITENAME}} проектында аноним рәүештә дауам итә йәки <span class='plainlinks'>[$1 яңынан таныла]</span> алаһығыҙ (үҙ йәки башҡа исем менән).
 Ҡайһы бер биттәр һеҙ системала танылған һымаҡ күренергә мөмкин, уны бөтөрөү өсөн браузер кэшын таҙартығыҙ.",
-'welcomecreation' => '== Рәхим итегеҙ, $1! ==
-Иҫәп яҙыуығыҙ яһалды.
-Шәхси [[Special:Preferences|көйләүҙәрегеҙҙе]] үҙегеҙгә уңайлы итеп үҙгәртергә онотмағыҙ.',
 'yourname' => 'Ҡатнашыусы исеме',
 'yourpassword' => 'Һеҙҙең пароль',
 'yourpasswordagain' => 'Паролде ҡабаттан яҙыу',
@@ -717,8 +794,8 @@ $2
 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тап килгән журнал яҙмаларын таба]
 йәки '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} бындай исемле яңы бит яһай]'''</span> алаһығыҙ.",
 'noarticletext-nopermission' => 'Хәҙерге ваҡытта был биттә текст юҡ.
-ҺеÒ\99 Ð±Ð°Ñ\88ҡа Ð¼Ó\99Ò¡Ó\99лÓ\99ләрҙә [[Special:Search/{{PAGENAME}}|был исемде]] йәки
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдағы яҙмаларҙы] эҙләй алаһығыҙ.</span>',
+ҺеÒ\99 Ð±Ð°Ñ\88ҡа Ð±Ð¸Ñ\82Ñ\82әрҙә [[Special:Search/{{PAGENAME}}|был исемде]] йәки
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналдағы яҙмаларҙы] эҙләй алаһығыҙ, тик һеҙҙең бит яһау хоҡуғығыҙ юҡ.</span>',
 'missing-revision' => '"{{PAGENAME}}" исемле биттең $1 номерлы өлгөһө юҡ.
 
 Был хәл, ғәҙәттә, юйылған биткә яһалған һылтанманын ваҡыты үтеүенән барлыҡҡа килә.
@@ -866,7 +943,7 @@ $3 белдергән сәбәп: ''$2''",
 'currentrev' => 'Ағымдағы версия',
 'currentrev-asof' => '$1, ағымдағы версия',
 'revisionasof' => '$1 версияһы',
-'revision-info' => 'Версия: $1; $2',
+'revision-info' => '<div id="viewingold-warning" style="background: #FFBDBD; border: 1px solid #BB7979; color: #000000; margin: 1em 0 .5em; padding: .5em 1em; vertical-align: middle; font-weight: bold; font-family: Palatino Linotype, Microsoft Sans Serif, Arial Unicode MS, Droid Sans; clear: both;">Хәҙер һеҙ был биттең иҫке, <span id="mw-revision-name">$2</span> тарафынан <span id="mw-revision-date">$1</span> һаҡланған версияһын ҡарайһығыҙ. Уның <span class="plainlinks">[{{fullurl:{{FULLPAGENAME}}}} ағымдағы версиянан] айырмаһы булыуы мөмкин</span>.</div>',
 'previousrevision' => '← Алдағы',
 'nextrevision' => 'Киләһе →',
 'currentrevisionlink' => 'Ағымдағы версия',
@@ -1078,8 +1155,6 @@ $1",
 'search-interwiki-caption' => 'Туғандаш проекттар',
 'search-interwiki-default' => '$1 һөҙөмтә:',
 'search-interwiki-more' => '(тағы)',
-'search-mwsuggest-enabled' => 'кәңәштәр менән',
-'search-mwsuggest-disabled' => 'кәңәшһеҙ',
 'search-relatedarticle' => 'Ҡағылышлы',
 'mwsuggest-disable' => 'AJAX-тәҡдимдәрен ябырға',
 'searcheverything-enable' => 'Бар исем арауыҡтарында эҙләргә',
@@ -1114,7 +1189,7 @@ $1",
 
 # Preferences page
 'preferences' => 'Көйләүҙәр',
-'mypreferences' => 'Көйләүҙәрем',
+'mypreferences' => 'Көйләүҙәр',
 'prefs-edits' => 'Төҙәтеүҙәр һаны:',
 'prefsnologin' => 'Танылмағанһығыҙ',
 'prefsnologintext' => 'Ҡатнашыусы көйләүҙәрен үҙгәртеү өсөн, һеҙ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}}танылырға]</span> тейешһегеҙ.',
@@ -2083,11 +2158,7 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} проектының белдереү хеҙмәте',
 'enotif_reset' => 'Бөтә биттәрҙе ҡаралған тип билдәләргә',
-'enotif_newpagetext' => 'Был яңы бит.',
 'enotif_impersonal_salutation' => '{{SITENAME}} проектының ҡатнашыусыһы',
-'changed' => 'үҙгәртелгән',
-'created' => 'булдырылды',
-'enotif_subject' => '{{SITENAME}} проектының $PAGETITLE бите $PAGEEDITOR тарафынан $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Һеҙҙең аҙаҡҡы кереүегеҙҙән һуңғы үҙгәртеүҙәрҙе ҡарау өсөн, $1 ҡарағыҙ.',
 'enotif_lastdiff' => 'Был үҙгәртеүҙе ҡарау өсөн, $1 ҡарағыҙ.',
 'enotif_anon_editor' => 'танылмаған ҡатнашыусы $1',
@@ -2308,7 +2379,7 @@ $1',
 # Contributions
 'contributions' => 'Ҡатнашыусы өлөшө',
 'contributions-title' => '$1 исемле ҡулланыусының кереткән өлөшө',
-'mycontris' => 'Башҡарған эштәр',
+'mycontris' => 'Өлөш',
 'contribsub2' => '$1 ($2) өсөн',
 'nocontribs' => 'Күрһәтелгән шарттарға яуап биргән үҙгәртеүҙәр табылманы.',
 'uctop' => '(аҙаҡҡы)',
@@ -2349,7 +2420,7 @@ $1',
 'whatlinkshere-hideredirs' => 'Йүнәлтеүҙәрҙе $1',
 'whatlinkshere-hidetrans' => 'Ҡушылғандарҙы $1',
 'whatlinkshere-hidelinks' => 'Һылтанмаларҙы $1',
-'whatlinkshere-hideimages' => 'Рәсем өсөн һылтанматарҙы $1',
+'whatlinkshere-hideimages' => 'файл һылтанмаларын $1',
 'whatlinkshere-filters' => 'Һайлау',
 
 # Block/unblock
@@ -2707,7 +2778,6 @@ $1 ҡатнашыусыһын бикләү сәбәбе: "$2"',
 # JavaScriptTest
 'javascripttest' => '
 JavaScript тикшереү',
-'javascripttest-disabled' => 'Был мөмкинлек был Википроектта ғәмәлгә индерелмәгән.',
 'javascripttest-title' => '$1 тикшеренеү үткәрелә',
 'javascripttest-pagetext-noframework' => 'Был бит JavaScript тикшеренеүҙәре үткәреү өсөн  резервланған.',
 'javascripttest-pagetext-unknownframework' => 'Билдәһеҙ тикшеренеүҙәр мөхитнамәһе "$1".',
@@ -2815,10 +2885,27 @@ The wiki server cannot provide data in a format your client can read.',
 # Info page
 'pageinfo-title' => '«$1» буйынса мәғлүмәт',
 'pageinfo-header-edits' => 'Үҙгәртеүҙәр',
+'pageinfo-display-title' => 'Күренгән исем',
+'pageinfo-default-sort' => 'Ғәҙәттәге сортлау асҡысы',
+'pageinfo-length' => 'Бит оҙонлоғо (байттарҙа)',
+'pageinfo-article-id' => 'Бит идентификаторы',
+'pageinfo-language' => 'Бит эстәлегенең теле',
+'pageinfo-robot-policy' => 'Эҙләү хеҙмәттәре статусы',
+'pageinfo-robot-index' => 'Индекслана',
+'pageinfo-robot-noindex' => 'Индексланмай',
 'pageinfo-views' => 'Ҡарау һаны',
-'pageinfo-watchers' => 'Күҙәтеүселәр һаны',
-'pageinfo-edits' => 'Төҙәтеү һаны',
+'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-toolboxlink' => 'Бит мәғлүмәттәре',
 
 # Skin names
 'skinname-standard' => 'Классик',
@@ -3348,16 +3435,16 @@ $1',
 'confirmemail_loggedin' => 'Һеҙҙең электрон почта адресығыҙ раҫланды.',
 'confirmemail_error' => 'Электрон почта адресын раҫлаған ваҡытта хата килеп сыҡты.',
 'confirmemail_subject' => '{{SITENAME}} электрон почта адресын раҫлау',
-'confirmemail_body' => 'Кемдер, бәлки һеҙҙер, $1 IP адресынан 
-{{SITENAME}}  проектында ошо электрон почта адресы менән "$2" иҫәп яҙмаһын теркәгән.
+'confirmemail_body' => 'Кемдер, бәлки һеҙҙер, $1 IP адресынан {{SITENAME}} проектында 
+ошо электрон почта адресы менән "$2" иҫәп яҙмаһын теркәгән.
 
-Был иҫәп яҙмаһы ысынлап та һеҙҙеке икәнен раҫлау өсөн һәм
-{{SITENAME}} проектында элетрон почта мөмкинлектәрен тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ:
+Был иҫәп яҙмаһы ысынлап та һеҙҙеке икәнен раҫлау өсөн һәм {{SITENAME}} проектында электрон почта 
+мөмкинлектәрен тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ:
 
 $3
 
-Әгәр һеҙ иҫәп яҙмаһын *булдырмағанһығыҙ* икән,
-электрон почта адресын раҫлауҙы үтҡәрмәү өсөн т үбәндәге һылтанманы асығыҙ:
+Әгәр һеҙ иҫәп яҙмаһын *булдырмағанһығыҙ* икән, электрон почта 
+адресын раҫлауҙы үткәрмәү өсөн түбәндәге һылтанманы асығыҙ:
 
 $5
 
@@ -3366,12 +3453,12 @@ $5
 {{SITENAME}}  проектында "$2" иҫәп яҙмаһының электрон почта адресын ошо адресҡа үҙгәрткән.
 
 Был иҫәп яҙмаһы ысынлап та һеҙҙеке икәнен раҫлау өсөн һәм
-{{SITENAME}} проектында элетрон почта мөмкинлектәрен яңынан тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ:
+{{SITENAME}} проектында электрон почта мөмкинлектәрен яңынан тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ:
 
 $3
 
 Әгәр һеҙ иҫәп яҙмаһын *булдырмағанһығыҙ* икән,
-электрон почта адресын раҫлауҙы үтҡәрмәү өсөн т үбәндәге һылтанманы асығыҙ:
+электрон почта адресын раҫлауҙы үткәрмәү өсөн түбәндәге һылтанманы асығыҙ:
 
 $5
 
@@ -3380,12 +3467,12 @@ $5
 {{SITENAME}}  проектында "$2" иҫәп яҙмаһының электрон почта адресын ошо адрес итеп билдәләгән.
 
 Был иҫәп яҙмаһы ысынлап та һеҙҙеке икәнен раҫлау өсөн һәм
-{{SITENAME}} проектында элетрон почта мөмкинлектәрен яңынан тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ:
+{{SITENAME}} проектында электрон почта мөмкинлектәрен яңынан тоҡандырыу өсөн, браузерығыҙҙа түбәндәге һылтанманы асығыҙ:
 
 $3
 
 Әгәр иҫәп яҙмаһы һеҙҙеке *түгел* икән,
-электрон почта адресын раҫлауҙы үтҡәрмәү өсөн т үбәндәге һылтанманы асығыҙ:
+электрон почта адресын раҫлауҙы үткәрмәү өсөн түбәндәге һылтанманы асығыҙ:
 
 $5
 
@@ -3480,7 +3567,7 @@ $5
 'watchlisttools-raw' => 'Текст һымаҡ үҙгәртеү',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|фекер алышыу]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|әңгәмә]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'Билдәһеҙ "$1" киңәйтеү тегы',
@@ -3668,6 +3755,10 @@ MediaWiki файҙалы булыр, тигән өмөттә, ләкин БЕР
 'feedback-bugcheck' => 'Шәп! Тик [$1 билдәле хаталар] исемлегендә оҡшаш белдереүҙең булмауына иғтибар итегеҙ.',
 'feedback-bugnew' => 'Тикшерҙем. Яңы хата тураһында белдерергә',
 
+# Search suggestions
+'searchsuggest-search' => 'Эҙләү',
+'searchsuggest-containing' => 'эстәлегендә...',
+
 # API errors
 'api-error-badaccess-groups' => 'Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй',
 'api-error-badtoken' => 'Эске хата: дөрөҫ булмаған токен',
index 431332b..d78fbee 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Als-Holder
+ * @author Bua333
  * @author Malafaya
  * @author Man77
  * @author Merlissimo
@@ -93,72 +94,72 @@ $messages = array(
 'wed' => 'Mi',
 'thu' => 'Du',
 'fri' => 'Fr',
-'sat' => 'Så',
-'january' => 'Jänner',
-'february' => 'Feewer',
-'march' => 'März',
-'april' => 'Aprü',
+'sat' => 'Sa',
+'january' => 'Jenna',
+'february' => 'Feba',
+'march' => 'Meaz',
+'april' => 'Aprui',
 'may_long' => 'Mai',
 'june' => 'Juni',
 'july' => 'Juli',
 'august' => 'August',
-'september' => 'September',
-'october' => 'Óktówer',
-'november' => 'Nóvember',
-'december' => 'Dezember',
-'january-gen' => 'Jänner',
-'february-gen' => 'Feewer',
-'march-gen' => 'März',
-'april-gen' => 'Aprü',
+'september' => 'Septemba',
+'october' => 'Oktoba',
+'november' => 'Novemba',
+'december' => 'Dezemba',
+'january-gen' => 'Jenna',
+'february-gen' => 'Feba',
+'march-gen' => 'Meaz',
+'april-gen' => 'Aprui',
 'may-gen' => 'Mai',
 'june-gen' => 'Juni',
 'july-gen' => 'Juli',
 'august-gen' => 'August',
-'september-gen' => 'September',
-'october-gen' => 'Oktower',
-'november-gen' => 'November',
-'december-gen' => 'Dezember',
-'jan' => 'Jän.',
-'feb' => 'Few.',
-'mar' => 'Mär.',
+'september-gen' => 'Septemba',
+'october-gen' => 'Oktoba',
+'november-gen' => 'Novemba',
+'december-gen' => 'Dezemba',
+'jan' => 'Jen.',
+'feb' => 'Feb.',
+'mar' => 'Mea.',
 'apr' => 'Apr.',
 'may' => 'Mai',
 'jun' => 'Jun.',
 'jul' => 'Jul.',
 'aug' => 'Aug.',
 'sep' => 'Sep.',
-'oct' => 'Ókt.',
-'nov' => 'Nóv.',
+'oct' => 'Okt.',
+'nov' => 'Nov.',
 'dec' => 'Dez.',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
-'category_header' => 'Seiten in da Kategorie „$1“',
-'subcategories' => 'Unterkategorien',
+'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorina}}',
+'category_header' => 'Seitn in da Kategorie „$1“',
+'subcategories' => 'Untakategorina',
 'category-media-header' => 'Medien in da Kategorie „$1“',
-'category-empty' => "''De Kategorie enthoit im Moment koane Seiten und koane Medien ned.''",
-'hidden-categories' => '{{PLURAL:$1|Vasteckte Kategorie|Vasteckte Kategorien}}',
+'category-empty' => "''De Kategorie enthoit im Moment koane Seitn und koane Medien ned.''",
+'hidden-categories' => '{{PLURAL:$1|Vasteckte Kategorie|Vasteckte Kategorina}}',
 'hidden-category-category' => 'Vasteckte Kategorie',
 'category-subcat-count' => '{{PLURAL:$2|De Kategorie enthoit netter de foigande Unterkategorie:|{{PLURAL:$1|De foigande Unterkategorie is oane voh insgsåmt $2 Unterkategorien in derer Kategorie:|Voh insgsåmt $2 Unterkategorien in derer Kategorie wern $1 åzoagt:}}}}',
 'category-subcat-count-limited' => 'In de Kategorie {{PLURAL:$1|is de foigande Unterkategorie|san de foiganden Unterkategorien}} eihsortird:',
 'category-article-count' => '{{PLURAL:$2|De Kategorie enthoit foigernde Seiten:|{{PLURAL:$1|Foigernde Seiten is aane voh insgsåmt $2 Seiten in derer Kategorie:|Es wern $1 voh insgsåmt $2 Seiten in derer Kategorie åzaagt:}}}}',
 'category-article-count-limited' => 'De {{PLURAL:$1|foigande Seiten is|foiganden $1 Seiten san}} in derer Kategorie enthoiden:',
-'category-file-count' => '{{PLURAL:$2|Dé Kategorie enthoit fóigernde Daatei:|{{PLURAL:$1|Fóigernde Daatei is oane voh insgsåmmt $2 Daatein in derer Kategorie:|Es wern $1 voh insgsåmt $2 Daatein in derer Kategorie åzoagt:}}}}',
+'category-file-count' => '{{PLURAL:$2|De Kategorie enthoid foigende Datei:|{{PLURAL:$1|Foigende Datei is oane vo insgsamt $2 Datein in dera Kategorie:|Es wean $1 von insgsamt $2 Datein in dera Kategorie ozoagt:}}}}',
 'category-file-count-limited' => "{{PLURAL:$1|D' foingde Datei is|De foingden $1 Datein san}} in de Kategorie eisortird:",
-'listingcontinuesabbrev' => '(Furtsétzung)',
+'listingcontinuesabbrev' => '(Fortsetzung)',
 'index-category' => 'Indizirde Seiten',
-'noindex-category' => 'Néd-indizirde Seiten',
+'noindex-category' => 'Ned-indiziade Seitn',
 'broken-file-category' => 'Seiten mid kaputte Daateilinks',
 
-'about' => 'Ywer',
+'about' => 'Iba',
 'article' => 'Artike',
 'newwindow' => '(werd in am neichen Fenster aufgmocht)',
-'cancel' => 'Obbrecher',
+'cancel' => 'Obbrecha',
 'moredotdotdot' => 'Merer',
 'mypage' => 'Eigerne Seiten',
-'mytalk' => 'Eigerne Diskussión',
+'mytalk' => 'Mei Dischkurs',
 'anontalk' => 'Dischkrirseiten voh derer IP-Adress',
-'navigation' => 'Navigazión',
+'navigation' => 'Navigation',
 'and' => '&#32;und',
 
 # Cologne Blue skin
@@ -166,66 +167,65 @@ $messages = array(
 'qbbrowse' => 'Blaadeln',
 'qbedit' => 'werkeln',
 'qbpageoptions' => 'Seitenopzionen',
-'qbpageinfo' => 'Seitendaaten',
 'qbmyoptions' => 'Meine Seiten',
 'qbspecialpages' => 'Speziaalseiten',
-'faq' => 'Heiffige Frong',
+'faq' => 'Oft gstejte Frong',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
 'vector-action-addsection' => 'Obschnit dazuafyng',
-'vector-action-delete' => 'Leschen',
+'vector-action-delete' => 'Leschn',
 'vector-action-move' => 'Vaschiam',
-'vector-action-protect' => 'Schytzen',
+'vector-action-protect' => 'Schitzn',
 'vector-action-undelete' => 'Wiederherstön',
 'vector-action-unprotect' => 'freigeem',
 'vector-simplesearch-preference' => 'Daweiterte Suachvurschläg aktivirn (netter Vector)',
-'vector-view-create' => 'Erstön',
-'vector-view-edit' => 'Werkeln',
-'vector-view-history' => 'Versiónsgschicht',
-'vector-view-view' => 'Leesen',
-'vector-view-viewsource' => 'Quötext åzong',
-'actions' => 'Akziónen',
-'namespaces' => 'Nåmensraim',
-'variants' => 'Varianten',
-
-'errorpagetitle' => 'Feeler',
-'returnto' => 'Zruck zua da Seiten $1.',
+'vector-view-create' => 'Aufbaun',
+'vector-view-edit' => 'Werkln',
+'vector-view-history' => 'Gschicht oschaugn',
+'vector-view-view' => 'Lesn',
+'vector-view-viewsource' => 'Quejtext ozoagn',
+'actions' => 'Aktiona',
+'namespaces' => 'Namasramm',
+'variants' => 'Variantn',
+
+'errorpagetitle' => 'Fehla',
+'returnto' => 'Zruck za da Seitn $1.',
 'tagline' => 'Aus {{SITENAME}}',
-'help' => 'Hüf und Frong?',
+'help' => 'Huif',
 'search' => 'Suach',
-'searchbutton' => 'Suachen',
+'searchbutton' => 'Suacha',
 'go' => 'Ausfyrn',
-'searcharticle' => 'Artiké',
+'searcharticle' => 'Artikl',
 'history' => 'Versiónen',
-'history_short' => 'Versionen/Autorn',
+'history_short' => 'Gschicht oschaugn',
 'updatedmarker' => '(gänderd)',
-'printableversion' => 'Versión zum Ausdrucken',
-'permalink' => 'Permanenter Link',
+'printableversion' => 'Druckversion',
+'permalink' => 'Permanenta Link',
 'print' => 'Drucken',
 'view' => 'Leesen',
-'edit' => 'werkeln',
-'create' => 'Erstön',
+'edit' => 'Werkln',
+'create' => 'Aufbaun',
 'editthispage' => 'Seiten beorweiten',
 'create-this-page' => 'Seiten erstön',
-'delete' => 'léschen',
+'delete' => 'Leschn',
 'deletethispage' => 'De Seiten leschen',
 'undelete_short' => '{{PLURAL:$1|1 Version|$1 Versionen}} wiederherstön',
 'viewdeleted_short' => '{{PLURAL:$1|Oah geléschde Versión|$1 geléschde Versiónen}} åschauh',
-'protect' => 'Schytzen',
-'protect_change' => 'ändern',
+'protect' => 'Schitzn',
+'protect_change' => 'endan',
 'protectthispage' => 'Seiten schytzen',
 'unprotect' => 'freigeem',
 'unprotectthispage' => 'Seitenschutz ändern',
-'newpage' => 'Neiche Seiten',
+'newpage' => 'Neiche Seitn',
 'talkpage' => 'De Seiten bsprecher',
-'talkpagelinktext' => 'Diskussión',
+'talkpagelinktext' => 'Dischkrian',
 'specialpage' => 'Speziaalseiten',
-'personaltools' => 'Persénlichs Werkzeig',
+'personaltools' => 'Mei Werkzeig',
 'postcomment' => 'Neicher Obschnit',
 'articlepage' => 'Seiteninhoid åzoang',
-'talk' => 'Diskussión',
-'views' => 'Åsichten',
+'talk' => 'Dischkrian',
+'views' => 'Osichtn',
 'toolbox' => 'Werkzeigkisten',
 'userpage' => 'Benutzerseiten',
 'projectpage' => 'Projektseiten åzoang',
@@ -235,14 +235,14 @@ $messages = array(
 'viewhelppage' => 'Hüfeseiten åzoang',
 'categorypage' => 'Kategorieseiten åzoang',
 'viewtalkpage' => 'Diskussion',
-'otherlanguages' => 'Ånderne Sproochen',
-'redirectedfrom' => '(Weidergloatt voh $1)',
+'otherlanguages' => 'Andane Sprochn',
+'redirectedfrom' => '(Weidagloadt vo $1)',
 'redirectpagesub' => 'Weiderloatung',
-'lastmodifiedat' => 'Dé Seiten is zlétzd am $1 um $2 gänderd worn.',
+'lastmodifiedat' => 'De Seitn is zletzt am $1 um $2 gendad worn.',
 'viewcount' => 'Dé Seiten do is bis iatz {{PLURAL:$1|oahmoi|$1-moi}} obgruaffm worn.',
 'protectedpage' => 'Gschytzde Seiten',
-'jumpto' => 'Wexeln zua:',
-'jumptonavigation' => 'Navigazión',
+'jumpto' => 'Wexln za:',
+'jumptonavigation' => 'Navigation',
 'jumptosearch' => 'Suach',
 'view-pool-error' => "Tschuidige, dé Server san im Moment ywerlostt.
 Zvü Leid vasuachen, dé Seiten do z' bsuachen.
@@ -254,24 +254,24 @@ $1",
 'pool-errorunknown' => 'Unbekånnter Feeler',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => 'Ywer {{SITENAME}}',
-'aboutpage' => 'Project:Ywer',
+'aboutsite' => 'Iba {{SITENAME}}',
+'aboutpage' => 'Project:Iba',
 'copyright' => 'Da Inhoid is unter da $1 vafiagbor.',
 'copyrightpage' => '{{ns:project}}:Urheewerrechte',
 'currentevents' => 'Aktuelle Ereigniss',
 'currentevents-url' => 'Project:Aktuelle Ereigniss',
 'disclaimers' => 'Impressum',
 'disclaimerpage' => 'Project:Impressum',
-'edithelp' => 'Beorweitungshüfm',
-'edithelppage' => 'Help:Beorweitungshüfm',
+'edithelp' => 'Huif fias Werkln',
+'edithelppage' => 'Help:Werkln',
 'helppage' => 'Help:Inhoidsvazeichnis',
-'mainpage' => 'Hauptseiten',
-'mainpage-description' => 'Hauptseiten',
+'mainpage' => 'Hoamseitn',
+'mainpage-description' => 'Hoamseitn',
 'policy-url' => 'Project:Richtlinien',
 'portal' => 'Autornportal',
 'portal-url' => 'Project:Autornportal',
-'privacy' => 'Daatenschutz',
-'privacypage' => 'Project:Daatenschutz',
+'privacy' => 'Datnschutz',
+'privacypage' => 'Project:Datnschutz',
 
 'badaccess' => 'Koane ausreichenden Rechtt',
 'badaccess-group0' => "Du host néd d' daforderliche Berechtigung fyr dé Akzión do.",
@@ -282,17 +282,17 @@ $1",
 Schaug auf [[Special:Version|Versiónsseiten]]",
 
 'ok' => 'Passt',
-'retrievedfrom' => 'Voh „$1“',
+'retrievedfrom' => 'Vh „$1“',
 'youhavenewmessages' => 'Du host $1 ($2).',
-'newmessageslink' => 'neiche Noochrichten',
-'newmessagesdifflink' => 'neiche Noochrichten',
-'youhavenewmessagesmulti' => 'Du host neiche Noochrichten: $1',
-'editsection' => 'werkeln',
-'editold' => 'werkeln',
-'viewsourceold' => 'Quötext åzoang',
-'editlink' => 'werkeln',
-'viewsourcelink' => 'an Quötext åschauh',
-'editsectionhint' => 'Obschnit beorweiden: $1',
+'newmessageslink' => 'neiche Nochrichtn',
+'newmessagesdifflink' => 'Letzte Endarung',
+'youhavenewmessagesmulti' => 'Du host neiche Nochrichtn: $1',
+'editsection' => 'Werkln',
+'editold' => 'Werkln',
+'viewsourceold' => 'Quejtext ozoagn',
+'editlink' => 'werkln',
+'viewsourcelink' => 'In Quejtext ozoagn',
+'editsectionhint' => 'Obschnitt beorbatn: $1',
 'toc' => 'Inhoidsvazeichnis',
 'showtoc' => 'Åzoang',
 'hidetoc' => 'vastecken',
@@ -305,22 +305,22 @@ Schaug auf [[Special:Version|Versiónsseiten]]",
 'feed-invalid' => 'Néd gütiger Feed-Abonnement-Typ.',
 'feed-unavailable' => 'Es steengern koane Feeds zur Vafiagung.',
 'site-rss-feed' => 'RSS-Feed fyr $1',
-'site-atom-feed' => 'Atom-Feed fyr $1',
+'site-atom-feed' => 'Atom-Feed fia $1',
 'page-rss-feed' => 'RSS-Feed fyr „$1“',
-'page-atom-feed' => 'Atom-Feed fyr „$1“',
-'red-link-title' => '$1 (dé Seiten gibts néd)',
+'page-atom-feed' => 'Atom-Feed fia „$1“',
+'red-link-title' => '$1 (de Seitn gibts ned)',
 'sort-descending' => 'Obsteigend sortiern',
 'sort-ascending' => 'Aufsteigend sortiern',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Seiten',
-'nstab-user' => 'Benutzerseiten',
+'nstab-main' => 'Seitn',
+'nstab-user' => 'Nutzaseitn',
 'nstab-media' => 'Meedienseiten',
-'nstab-special' => 'Speziaalseiten',
+'nstab-special' => 'Spezialseitn',
 'nstab-project' => 'Projektseiten',
-'nstab-image' => 'Daatei',
+'nstab-image' => 'Datei',
 'nstab-mediawiki' => 'Systémnoochricht',
-'nstab-template' => 'Vurlog',
+'nstab-template' => 'Vorlog',
 'nstab-help' => 'Hüfeseiten',
 'nstab-category' => 'Kategorie',
 
@@ -352,12 +352,12 @@ De Daatenbånk möidt 'n Feeler: „<tt>$3: $4</tt>“.",
 'readonlytext' => 'De Daatenbånk is vurywergeehend fyr Neieihtreeg und Änderrungen gsperrd. Bittschee vasuchs spaader nuamoi.
 
 Grund voh da Sperrung: $1',
-'missing-article' => 'Der Text voh „$1“ $2 is néd in da Daatenbånk gfunden worn.
+'missing-article' => 'Da Text vo „$1“ $2 is in da Daatenbank ned gfundn worn.
 
-Dé Seiten is méglicherweis gléschd óder vaschóm worn.
+De Seitn is meglicherwei gleschd oda vaschobm worn.
 
-Fois dés néd zuadrifft, host eventuö an Feeler in da Software gfunden. Bittscheh möd dés am [[Special:ListUsers/sysop|Administraator]] unter da Nennung voh da URL.',
-'missingarticle-rev' => '(Versiónsnummer: $1)',
+Fois des ned zuatrifft, hosd eventuell an Fehla im Programm gfundn. Bittschee informia an [[Special:ListUsers/sysop|Administrator]] und nenn eam de URL.',
+'missingarticle-rev' => '(Versionsnumma: $1)',
 'missingarticle-diff' => '(Unterschiad zwischen Versionen: $1, $2)',
 'readonly_lag' => "De Daatenbånk is automaatisch fyr Schraibzuagriff gsperrt, damid se d' vatailten Daatenbånkserver (slaves) mim Hauptdaatenbånkserver (master) obglaichen kennan.",
 'internalerror' => 'Interner Feeler',
@@ -376,15 +376,15 @@ Fois dés néd zuadrifft, host eventuö an Feeler in da Software gfunden. Bittsc
 'cannotdelete' => 'Dé Seiten óder Daatei "$1" kå néd gléschd wern.
 Méglicherweis iss schoh vohram åndern gléschd worn.',
 'cannotdelete-title' => 'Seiten „$1“ kå néd gléschd wern',
-'badtitle' => 'néd gütiger Titel',
-'badtitletext' => 'Da Titel voh da ågforderden Seiten is néd gütig, laar óder a ungütiger Sproochlink vohram åndern Wiki.',
+'badtitle' => 'koa gitiga Titl',
+'badtitletext' => 'Da Titl voh da ogfordatn Seitn is ned gitig, laar oda a ungitiga Sprochlink vonam andan Wiki.',
 'perfcached' => "Dé fóigernden Daaten staummern aus'm Cache und san méglicherweis nimmer aktuö. Maximoi {{PLURAL:$1|oah Ergebnis is|$1 Ergebniss san}} im Cache vafiagbor.",
 'perfcachedts' => "Dé Daaten staummern aus 'm Cache. Da Zeidbunkt voh da létzden Aktualisiarung: $1. Maximoi {{PLURAL:$4|oah Ergebnis is|$4 Ergebniss san}} im Cache vafiagbor.",
 'querypage-no-updates' => "'''Dé Aktualisiarungsfunkzión voh derer Seiten is derzeid deaktivird. Dé Daaten wern bis auf Weiders néd daneiert.'''",
 'wrong_wfQuery_params' => 'Foische Parameeter fyr wfQuery()<br />
 Funkzión: $1<br />
 Obfrog: $2',
-'viewsource' => 'an Quötext åschauh',
+'viewsource' => 'Quejtext ozoagn',
 'viewsource-title' => 'Quöntext voh da Seiten $1 auhschauh',
 'actionthrottled' => 'Akziónszoi limitird',
 'actionthrottledtext' => 'Im Råmen voh ner Anti-Spam-Moossnåm kå dé Akzión do in am kurzen Zeidobstånd netter begrenzd ausgfyrd wern. Dé Grenzen host ywerschritten.
@@ -413,33 +413,29 @@ $2",
 # Login and logout pages
 'logouttext' => "'''Iatzerd bist obgmödt.'''
 
-Du kåst {{SITENAME}} iatzerd anónym weiderdoah, óder di danaid unterm söwing óder am åndern Benutzernåm [[Special:UserLogin|åmöden]].
+Du kåst {{SITENAME}} iatzerd anónym weiderdoah, óder di danaid unterm söwing óder am åndern Benutzernåm <span class='plainlinks'>[$1 åmöden]</span>.
 Beochtt ower, daas oanige Seiten noh åzoang kennern, daas du ågmödt bist, sólång du néd deih Browsercache glaard host.",
-'welcomecreation' => '== Servas, $1! ==
-
-Deih Benutzerkontó is grood eihgrichtt worn.
-Vagiss bittscheh néd, deine [[Special:Preferences|{{SITENAME}}-Eishtellungen]] åzpassen',
-'yourname' => 'Benutzernåm:',
-'yourpassword' => 'Posswort:',
-'yourpasswordagain' => 'Posswort nóamoi',
-'remembermypassword' => 'Mid dém Browser dauerhoft ågmödt bleim (maximoi $1 {{PLURAL:$1|Dog|Dog}})',
+'yourname' => 'Nutzanama:',
+'yourpassword' => 'Passwort:',
+'yourpasswordagain' => 'Es Passwort no amoi eigebm',
+'remembermypassword' => 'Mitm Brausa dauahoft ogmejd bleibm (maximoi $1 {{PLURAL:$1|Dog|Dog}})',
 'securelogin-stick-https' => "Noch'm Auhmöden mid HTTPS vabunden bleim",
 'yourdomainname' => 'Eanerne Domain:',
 'externaldberror' => 'Entweder es ligt a Feeler bai da externen Authentifiziarung vur oder du derfst dai externs Benytzerkonto ned aktualisirn.',
-'login' => 'Åmöden',
-'nav-login-createaccount' => 'Åmöden / Kóntó erstön',
-'loginprompt' => 'Zur Åmödung miassen Cookies aktivird seih.',
-'userlogin' => 'Åmöden / Kontó erstön',
+'login' => 'Eilogga',
+'nav-login-createaccount' => 'Eilogga / Konto olegn',
+'loginprompt' => 'Zua Omejdung miassen Cookies aktiviat sei.',
+'userlogin' => 'Eilogga / Konto olegn',
 'userloginnocreate' => 'Åmöden',
 'logout' => 'Obmöden',
-'userlogout' => 'Obmöden',
+'userlogout' => 'Auslogga',
 'notloggedin' => 'Ned ågmödt',
-'nologin' => "Du host koah Benutzerkóntó? '''$1'''.",
-'nologinlink' => 'A neichs Benutzerkontó erstön',
-'createaccount' => 'Benutzerkóntó åléng',
-'gotaccount' => "Du host schoh a Benutzerkonto? '''$1'''.",
-'gotaccountlink' => 'Åmöden',
-'userlogin-resetlink' => "Host d' Åmödedaaten vagessen?",
+'nologin' => "Du host koa Nutzakonto? '''$1'''.",
+'nologinlink' => 'A neichs Nutzakonto olegn',
+'createaccount' => 'Nutzakonto olegn',
+'gotaccount' => "Hosd scho a Nutzakonto? '''$1'''.",
+'gotaccountlink' => 'Omejdn',
+'userlogin-resetlink' => 'Hosd de Datn zan Eilogga vagessn?',
 'createaccountmail' => 'per E-Mail',
 'createaccountreason' => 'Grund',
 'badretype' => 'De zwoa Posswerter stimmer ned ywereih.',
@@ -455,13 +451,13 @@ Es muass sichergstöd seih, daas Cookies aktivierd san. Danoch bittscheh d' Seit
 'loginsuccess' => 'Du bist jetzad ois „$1“ bai {{SITENAME}} ågmöidt.',
 'wrongpassword' => 'Des Posswort is foisch! Bitschee prowirs nuamoi.',
 'wrongpasswordempty' => 'Es is koa Posswort ned aigeem worn. Bittschee prowirs nuamoi.',
-'mailmypassword' => 'Neichs Posswort zuaschicken',
+'mailmypassword' => 'Neichs Passwort zuaschicka',
 'passwordremindertitle' => 'Naichs Posswort fyra {{SITENAME}}-Benytzerkonto',
 'acct_creation_throttle_hit' => 'Du host scho $1 {{PLURAL:$1|Benytzerkonto|Benytzerkonten}} und kååst jetzad koane mer åleeng.',
 'emailconfirmlink' => 'E-Póst-Adressen bstäting (Authentifiziarung)',
 'accountcreated' => 'Benytzerkonto is erstöid worn',
 'accountcreatedtext' => "'s Benytzerkonto $1 is aigrichtt worn.",
-'loginlanguagelabel' => 'Sprooch: $1',
+'loginlanguagelabel' => 'Sproch: $1',
 
 # Change password dialog
 'resetpass' => 'Posswort ändern',
@@ -479,7 +475,7 @@ Es muass sichergstöd seih, daas Cookies aktivierd san. Danoch bittscheh d' Seit
 # Edit page toolbar
 'bold_sample' => 'Fetter Text',
 'bold_tip' => 'Fetter Text',
-'italic_sample' => 'Kursiaver Text',
+'italic_sample' => 'Kursiva Text',
 'italic_tip' => 'Kursiaver Text',
 'link_sample' => 'Link-Text',
 'link_tip' => 'Interner Link',
@@ -491,18 +487,18 @@ Es muass sichergstöd seih, daas Cookies aktivierd san. Danoch bittscheh d' Seit
 'nowiki_tip' => 'Ned-formatirder Text',
 'image_tip' => 'Daateilink',
 'media_tip' => 'Meediendaatei-Link',
-'sig_tip' => 'Deih Unterschrift mid Zeidstempe',
+'sig_tip' => 'Dei Untaschrift mit Zeitstempe',
 'hr_tip' => 'Woogrechte Linie (sporsåm vawenden)',
 
 # Edit pages
 'summary' => 'Zåmmfossung:',
 'subject' => 'Bedreff',
-'minoredit' => 'Netter Kloanigkeiten san vaänderd worn',
+'minoredit' => 'Nua Kloanigkeidn san vaendat worn',
 'watchthis' => "D' Seiten beówochten",
-'savearticle' => 'Seiten speichern',
-'preview' => 'Vurschau',
-'showpreview' => 'Vurschau zoang',
-'showdiff' => 'Änderrungen zoang',
+'savearticle' => 'Seitn speichan',
+'preview' => 'Vorschau',
+'showpreview' => 'Vorschau zoagn',
+'showdiff' => 'Endarunga zoagn',
 'anoneditwarning' => "Du beorweitsd dé Seiten ois néd-ågmöidt. Wånn du dé speichertsd, werd deih aktuelle IP-Adress in da Versiónsgschichd aufzeichnet und is dodamid unwiaderruafflich '''éffmtléch''' zum åschauh.",
 'missingsummary' => "'''Hiwais:''' du host koa Zåmmfossung ågeem. Wånn du ernait auf „{{int:savearticle}}“ druckst, werd dai Enderung one a Zåmmfossung ywernumma.",
 'missingcommenttext' => 'Bittschee gib a Zåmmfossung ai.',
@@ -518,31 +514,31 @@ Es muass sichergstöd seih, daas Cookies aktivierd san. Danoch bittscheh d' Seit
 
 Des Posswort fyr des naiche Benutzerkonto kå auf da Speziaalseiten  „[[Special:ChangePassword|Posswort ändern]]“ gändert wern.',
 'newarticle' => '(Neich)',
-'newarticletext' => "Du bist am Link zua ner Seiten gfóigt, dé néd vurhånden is.
-Daas d' dé Seiten åléng kåst, trog dein Text in dé untensteeherde Boxen eih (schaug unter da [[{{MediaWiki:Helppage}}|Hüfeseiten]] fyr merer Informaziónen).
-Bist du föschlicherweis dodan, dånn druck dé '''Zruck'''-Schoitflächen voh deim Browser.",
+'newarticletext' => 'Du bist am Link gfoigt, wos no koa Seitn gibt.
+Um de Seitn ozlegn, trog dein Text im untan Kostn ei (schaug af da [[{{MediaWiki:Helppage}}|Huifeseitn]] fia mea Infos).
+Wens a Irrtum is, dassd do bist, nach druck in Zruck-Knopf vom Brausa.',
 'anontalkpagetext' => "---- ''De Seiten werd dodazua hergnumma, am ned-ågmöiderten Benutzer Nochrichten z' hinterlossen.
 Wånnst mid de Kommentare auf derer Seiten nix åfanga kåst, is vamuatlich da friarerne Inhower vo derer IP-Adress gmoat und du kåstas ignorirn.
 Wånnst a anonymer Benutzer bist und denkst, das irrelevante Kommentare ån di grichtt worn san, [[Special:UserLogin|möid de bittschee å]], um zuakynfteg Vawirrung z' vamein.''",
-'noarticletext' => 'De Saiten enthoit zua Zaid koan Text ned.
-Du kååst an Titl vo derer Saiten auf de åndern Saiten [[Special:Search/{{PAGENAME}}|suacha]],
-<span class="plainlinks"> in de dazuagheraden [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} Logbiache suacha] oder de Saiten [{{fullurl:{{FULLPAGENAME}}|action=edit}} beorwaiten]</span>.',
-'noarticletext-nopermission' => 'Dé Seiten enthoit im Moment nó koan Text néd.
-Du derfst an Titel auf åndre Seiten [[Special:Search/{{PAGENAME}}|suachen]]
-óder dé zuaghering <span class="plainlinks">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbiachén åschaung].</span>',
+'noarticletext' => 'De Seitn enthoid momentan koan Text ned.
+Du konst [[Special:Search/{{PAGENAME}}|nochm Titl]] in andan Seitn suacha,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de Logbiacha duachsuacha],
+oda [{{fullurl:{{FULLPAGENAME}}|action=edit}} de Seitn beorbatn]</span>.',
+'noarticletext-nopermission' => 'There is currently no text in this page.
+Du konst [[Special:Search/{{PAGENAME}}|in Seitntitl]] in andan Seitn suacha, oda <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} dia de Logbiachln dazua oschaugn]</span>, oba du hosd koa Berechtigung de Seitn ozlegn.',
 'userpage-userdoesnotexist' => 'Des Benutzerkonto „<nowiki>$1</nowiki>“ is ned vurhånden. Bittschee priaf, ob du de Seiten wirkle erstöin/beorweiten wüist.',
 'userpage-userdoesnotexist-view' => 'Benutzerkonto „$1“ existiard ned.',
 'blocked-notice-logextract' => "{{GENDER:$1|Der Benutzer|De Benutzarin|Der Benutzer do}} is zurzeid gesperrd.
 Zua da Informazion foigt a aktueller Auszug aus 'm Benutzersperr-Logbiache:",
 'updated' => '(Gänderd)',
 'note' => "'''Hihweis:'''",
-'previewnote' => "'''Dés is netter a Vurschau, d' Seiten is nuh néd gspeicherd worn!'''",
+'previewnote' => "'''Des is nua a Vorschau, de Seitn is no ned gspeichad worn!'''",
 'previewconflict' => "Dé Vurschau gibt 'n Inhoid vom ówern Textföd wieder. Só werd d' Seiten ausschaung, wånnst iatz speichern duast.",
 'session_fail_preview' => "'''Daine Beorwaitungen håm ned gspaichert wern kenna, wail Sitzungsdaaten valurn gånga san.'''
 Bittschee vasuachs nuamoi, indem du unter da foiganden Textvurschau noamoi auf „Saiten spaichern“ druckst.
 Soidad des Probleem bestee blaim, [[Special:UserLogout|möid de ob]] und danoch wider å.",
 'editing' => 'Beorwaiten vo $1',
-'editingsection' => 'Werkeln bei $1 (Obschnit)',
+'editingsection' => 'Werkln ba $1 (Obschnitt)',
 'editingcomment' => 'Werkeln voh $1 (Neicher Obschnit)',
 'editconflict' => 'Konflikt baim Beorwaiten: $1',
 'explainconflict' => "Eppern ånderer hod de Saitn gendert, nochdem du ågfånga host de zum beorwaiten.
@@ -565,29 +561,31 @@ Du bstätigst dodamid aa, daas du dé Textt söwer gschriem host óder dé voh n
 'semiprotectedpagewarning' => "'''Hoibsperrung:''' De Saiten is aso gsperrt worn, das netter registriarde Benytzer de endern kenna.",
 'titleprotectedwarning' => "'''Ochtung: De Saitenerstöiung is aso gschytzt worn, das netter Benytzer mid [[Special:ListGroupRights|speziöie Rechte]] de Saiten erstöin kennan.'''
 Zur Informazion foigt da aktuöie Logbuachaitrog:",
-'templatesused' => "{{PLURAL:$1|Dé fóigernde Vurlog|D' fóigernden Vurlong wern}} auf derer Seiten vawendt:",
+'templatesused' => '{{PLURAL:$1|De foigande Vorlog wead|De foigandn Vorlogn wean}} af dera Seitn vawendt:',
 'templatesusedpreview' => "{{PLURAL:$1|De foigande Vurlog werd|D' foiganden Vurlong wern}} in derer Saiten-Vurschau vawendt:",
 'templatesusedsection' => '{{PLURAL:$1|Dé fóigende Vurlog werd|Fóigende Vurlong wern}} voh dém Obschnit vawendt:',
-'template-protected' => '(schreibgschytzd)',
-'template-semiprotected' => '(schreibgschytzd fyr néd-ågmödte Benützer)',
-'hiddencategories' => 'Dé Seiten is in {{PLURAL:$1|a vasteckde Kategorie|$1 vasteckde Kategorien}} eihsortird:',
+'template-protected' => '(schreibgschitzt)',
+'template-semiprotected' => '(schreibgschitzt fia ned-ogmejdte Nutza)',
+'hiddencategories' => 'De Seitn is in {{PLURAL:$1|a vasteckde Kategorie|$1 vasteckde Kategorina}} eisortiad:',
 'nocreatetitle' => 'De Erstöiung vo naiche Saiten is aigschränkt.',
 'nocreate-loggedin' => "Du host koah Berechtigung, neiche Seiten z' erstön.",
 'permissionserrors' => 'Berechtigungsfeeler',
 'permissionserrorstext' => 'Du bist néd berechtigt, dé Akzión auszfyrn.  {{PLURAL:$1|Grund|Grynd}}:',
-'permissionserrorstext-withaction' => "Du host de Berechtigung ned, dass d' $2.
-{{PLURAL:$1|Grund|Grynd}}:",
-'recreate-moveddeleted-warn' => "'''Ówocht: Du dastöst a Seiten dé schoh friarer gléschd worn is.'''
+'permissionserrorstext-withaction' => 'Du host koa Berechtigung ned, dass de $2.
+{{PLURAL:$1|Grund|Grind}}:',
+'recreate-moveddeleted-warn' => "'''Obocht: Du legst a Seitn o, wo scho friaa glescht worn is.'''
 
-Bittscheh priaff genau, ób dé erneite Seitendastöung dé Richtlinien entsprichd.
-Zua deiner Informazión fóigts Lésch- und Vaschiawungs-Logbiaché mid da Begryndung fyr d' vurhergeherde Léschung:",
-'moveddeleted-notice' => "Dé Seiten do is gschléschd worn. Es fóigt a Auszug aus'm Lésch- und Vaschiawungs-Logbiaché voh derer Seiten.",
+Bittschee ibaleg da genau, obs sinnvoi is de Seitn ozlegn.
+Des Lesch- und Vaschiab-Logbuach dazua findsd do:",
+'moveddeleted-notice' => 'De Seitn do is glescht worn. Es foigt a Auszug ausm Lesch- und Vaschiabungs-Logbuch vo dea Seitn.',
 'edit-conflict' => 'Konflikt ban Beorwaten.',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "Owocht: D' Gréss vo eihbundne Vurlong is z' gróss, étlé Vurlong kennern néd eihbunden wern.",
-'post-expand-template-inclusion-category' => "Seiten, in dé d' maximoie Gréss eihbundner Vurlong ywerschritten is",
-'post-expand-template-argument-warning' => "'''Ówocht:''' Dé Seiten enthoit minderstens oah Argument in ner Vurlog, dés expandird z' gróss is. Dé Argumentt wern ignorird.",
+'post-expand-template-inclusion-warning' => 'Obocht: De Gress vo eibundne Vorlong is z gross.
+A poar Vorlogn wean ned eibundn.',
+'post-expand-template-inclusion-category' => 'Seitn, wo d Gress vo de eibundnan Vorlogn ibaschrittn is',
+'post-expand-template-argument-warning' => "'''Obocht:''' De Seitn enthoit mindastns oa Argument in da Vorlog, wo expandiat z grouss is. 
+De Parameta wean ignoriad.",
 'post-expand-template-argument-category' => 'Seiten, dé ignorirde Vurlongargumentt enthoiden',
 
 # "Undo" feature
@@ -597,31 +595,31 @@ Zua deiner Informazión fóigts Lésch- und Vaschiawungs-Logbiaché mid da Begry
 'cantcreateaccounttitle' => 'Benutzerkonto kå ned erstöd wern',
 
 # History pages
-'viewpagelogs' => 'Logbiacher fyr dé Seiten åzoang',
+'viewpagelogs' => 'Logbiacha fia de Datei ozoagn',
 'currentrev' => 'Aktuelle Versión',
-'currentrev-asof' => 'Aktuelle Versión vom $2, $3 Uar.',
-'revisionasof' => 'Versión vom $2, $3 Uar.',
-'revision-info' => 'Version vom $2 um $5 Uar am $4.',
-'previousrevision' => '← Nextöderne Versión',
-'nextrevision' => 'Nextjyngerne Version →',
-'currentrevisionlink' => 'Aktuelle Versión',
-'cur' => 'Aktuö',
+'currentrev-asof' => 'Letzte Version vo $1',
+'revisionasof' => 'Version vom $1',
+'revision-info' => 'Version vom $1 vo $2.',
+'previousrevision' => '← Nextejtane Version',
+'nextrevision' => 'Neiare Version →',
+'currentrevisionlink' => 'Aktuelle Version',
+'cur' => 'Aktuell',
 'next' => 'Naxte',
-'last' => 'Vurherige',
+'last' => 'Friaare',
 'page_first' => 'Auhfaung',
 'page_last' => 'End',
-'histlegend' => "Zur da Auhzoag voh dé Änderrungen oahfoch dé z' vagleichenden Versiónen auswön und d' Schoitflächen „{{int:compareselectedversions}}“ drucken.<br />
-* ({{int:cur}}) = Unterschiad zua da aktuön Versión, ({{int:last}}) = Unterschiad zua da vurhering Versión
-* Uarzeid/Daatum = Versión zua derer Zeid, Benutzernaum/IP-Adress vom Beorweiter, {{int:minoreditletter}} = Kloane Änderrung",
-'history-fieldset-title' => 'Suach in da Versiónsgschicht',
-'history-show-deleted' => 'netter gléschde Versiónen',
-'histfirst' => 'Öderste',
-'histlast' => 'Neicherste',
+'histlegend' => 'Zua Ozoag vo de Endarunga oafoch de z vagleichandn Versiona und Schoitflechn „{{int:compareselectedversions}}“ druckn.<br />
+* ({{int:cur}}) = Unterschied zua aktuelln Version, ({{int:last}}) = Unterschied zua vorherign Version
+* Uhrzeid/Datum = Version za dera Zeid, Nutzanama/IP-Adress vom Beorbata, {{int:minoreditletter}} = Kloane Endarung',
+'history-fieldset-title' => 'Suach in da Versionsgschicht',
+'history-show-deleted' => 'Nua gleschte Versiona',
+'histfirst' => 'Ejtaste',
+'histlast' => 'Neiaste',
 'historyempty' => '(laar)',
 
 # Revision feed
 'history-feed-title' => 'Versiónsgschicht',
-'history-feed-item-nocomment' => '$1 am $3 um $4 Uar',
+'history-feed-item-nocomment' => '$1 am $2',
 'history-feed-empty' => "Die angeforderte Seitn gibt's net.
 Vielleicht is sie gelöscht oda verschom worn.
 [[Special:Search|Durchsuachan]] S' {{SITENAME}} für passende neie Seitn.",
@@ -637,64 +635,62 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'revdelete-nooldid-title' => 'Koa Version ogem',
 'revdelete-text' => "'''Der Inhalt oder andere Bestandteile gelöschter Versionen sind nicht mehr öffentlich einsehbar, erscheinen jedoch weiterhin als Einträge in der Versionsgeschichte.'''
 {{SITENAME}}-Administratoren können den entfernten Inhalt oder andere entfernte Bestandteile weiterhin einsehen und wiederherstellen, es sei denn, es wurde festgelegt, dass die Zugangsbeschränkungen auch für Administratoren gelten.",
-'revdel-restore' => 'Siagborkeid ändern',
-'revdel-restore-deleted' => 'gschléschde Versión',
-'revdel-restore-visible' => 'siagbore Versión',
+'revdel-restore' => 'Siachtborkeit endan',
+'revdel-restore-deleted' => 'gleschte Versiona',
+'revdel-restore-visible' => 'sichtbore Versiona',
 'pagehist' => 'Versiónsgschicht',
 'deletedhist' => 'Gléschde Versiónen',
 
 # Merge log
-'revertmerge' => 'Vaoanigung zruckénemmer',
+'revertmerge' => 'Vaoanigung zruckdoa',
 'mergelogpagetext' => "Des is s'Logbuach vu de vareinigtn Versionsgschichtn.",
 
 # Diffs
-'history-title' => 'Versiónsgschicht voh „$1“',
-'lineno' => 'Zeiln $1:',
+'history-title' => 'Gschicht vo „$1“ oschaugn',
+'lineno' => 'Zein $1:',
 'compareselectedversions' => 'Gwöde Versionen vagleichen',
-'editundo' => 'ryckgängig',
-'diff-multi' => '({{PLURAL:$1|A dazwischenliegerte Versión|$1 dazwischenliegende Versiónen}} {{PLURAL:$2|vohram Benutzer|vo $2 Benutzern}} {{PLURAL:$1|werd|wern}} néd åzoagt)',
+'editundo' => 'zruck doa',
+'diff-multi' => '({{PLURAL:$1|A dazwischnliegade Version|$1 dazwiscenliegade Versiona}} {{PLURAL:$2|vonam Nutza|vo $2 Nutzan}} {{PLURAL:$1|wead|wean}} ned ozoagt)',
 
 # Search results
 'searchresults' => 'Suachergebniss',
-'searchresults-title' => 'Ergebniss voh da Suach noch „$1“',
+'searchresults-title' => 'Suacheagebniss fia „$1“',
 'searchresulttext' => "Fia weidare Infos üwa's Suacha schau auf'd [[{{MediaWiki:Helppage}}|Hüifeseitn]].",
 'searchsubtitle' => 'Dei Suachãnfråg: „[[:$1|$1]]“ ([[Special:Prefixindex/$1|ålle Seitn, de mid „$1“ ãnfãngan]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|ålle Seitn, de wås nåch „$1“ valinkn]])',
 'searchsubtitleinvalid' => 'Dei Suachãnfråg: „$1“.',
 'notitlematches' => 'Koane Üwareinstimmungen mid de Seitntitl',
 'notextmatches' => 'Ka Üwareinstimmung mid dem Inhåit gfundn',
-'prevn' => '{{PLURAL:$1|vurheriger|vurherige $1}}',
-'nextn' => '{{PLURAL:$1|naxter|naxte $1}}',
-'prevn-title' => '{{PLURAL:$1|Vurherigs Ergebnis|Vurherige $1 Ergebniss}}',
+'prevn' => '{{PLURAL:$1|vorheriga|vorherige $1}}',
+'nextn' => '{{PLURAL:$1|naxta|naxte $1}}',
+'prevn-title' => '{{PLURAL:$1|Vorherigs Ergebnis|Vorherige $1 Ergebniss}}',
 'nextn-title' => '{{PLURAL:$1|Foilgends Ergebnis|Foigende $1 Ergebniss}}',
-'shown-title' => 'Zoag $1 {{PLURAL:$1|Ergebnis|Ergebniss}} pró Seiten',
+'shown-title' => 'Zoag $1 {{PLURAL:$1|Ergebnis|Ergebniss}} pro Seitn',
 'viewprevnext' => 'Zoag ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists' => "'''Es gibt a Seiten, dé'n Nåmen „[[:$1]]“ hod.'''",
-'searchmenu-new' => "'''Erstö d' Seiten „[[:$1]]“ in dém Wiki.'''",
-'searchprofile-articles' => 'Inhoidsseiten',
-'searchprofile-project' => 'Hüfe und Prójektseiten',
-'searchprofile-images' => 'Muitimeedia',
-'searchprofile-everything' => 'Oiss',
-'searchprofile-advanced' => 'Daweiterd',
-'searchprofile-articles-tooltip' => 'Suachen auf $1',
-'searchprofile-project-tooltip' => 'Suachen in $1',
-'searchprofile-images-tooltip' => 'Noch Büder suachen',
-'searchprofile-everything-tooltip' => 'Gsåmmten Inhoid durchsuachen (inkl. Dischkrirseiten)',
-'searchprofile-advanced-tooltip' => 'Suach in weiderne Nåmensraim',
-'search-result-size' => '$1 ({{PLURAL:$2|1 Wort|$2 Werter}})',
-'search-result-category-size' => '{{PLURAL:$1|1 Seiten|$1 Seiten}} ({{PLURAL:$2|1 Unterkategorie|$2 Unterkategorien}}, {{PLURAL:$3|1 Daatei|$3 Daatein}})',
-'search-redirect' => '(Weiderloattung voh „$1“)',
-'search-section' => '(Åbschnitt $1)',
-'search-suggest' => 'Häderst „$1“ gmoahd?',
+'searchmenu-exists' => "'''Es gibt a Seiten, wo „[[:$1]]“ hoasst.'''",
+'searchmenu-new' => "'''De Seitn „[[:$1]]“ in em Wiki eastejn.'''",
+'searchprofile-articles' => 'Inhoidsseitn',
+'searchprofile-project' => 'Huif- und Projektseitn',
+'searchprofile-images' => 'Muitimedia',
+'searchprofile-everything' => 'Ollas',
+'searchprofile-advanced' => 'Daweitad',
+'searchprofile-articles-tooltip' => 'Suacha in $1',
+'searchprofile-project-tooltip' => 'Suacha in $1',
+'searchprofile-images-tooltip' => 'Noch Datein suacha',
+'searchprofile-everything-tooltip' => 'In gsamtn Inhoid duachsuacha (inkl. Dischkriaseitn)',
+'searchprofile-advanced-tooltip' => 'Suach in weidna Namasramm',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Wort|$2 Weata}})',
+'search-result-category-size' => '{{PLURAL:$1|1 Seitn|$1 Seitn}} ({{PLURAL:$2|1 Untakategorie|$2 Untakategorina}}, {{PLURAL:$3|1 Datei|$3 Datein}})',
+'search-redirect' => '(Weidaloatung vo „$1“)',
+'search-section' => '(Obschnitt $1)',
+'search-suggest' => 'Hädast „$1“ gmoand?',
 'search-interwiki-caption' => 'Schwesterprojekte',
 'search-interwiki-default' => '$1 Eagebnisse:',
 'search-interwiki-more' => '(mea)',
-'search-mwsuggest-enabled' => 'mid Vurschleg',
-'search-mwsuggest-disabled' => 'koane Vurschleg',
-'searchrelated' => 'vawåndt',
+'searchrelated' => 'vawandt',
 'searchall' => 'olle',
-'showingresultsheader' => "{{PLURAL:$5|Ergebnis '''$1''' voh '''$3'''|Ergebniss '''$1–$2''' voh '''$3'''}} fyr '''$4'''",
+'showingresultsheader' => "{{PLURAL:$5|Ergebnis '''$1''' vo '''$3'''|Ergebniss '''$1–$2''' vo '''$3'''}} fia '''$4'''",
 'nonefound' => "'''Hiwais:''' Es wern standardmässig nur oanige Nåmensraim durchsuacht. Setz ''all:'' vur dain Suachbegrif, um olle Saiten (inkl. Dischkrirsaiten, Vurlong usw.) z' durchsuacha oder züid 'n Nåmen vom z' durchsuachanden Nåmensraum.",
-'search-nonefound' => 'Fyr deih Suachåfrog san koane Ergebniss gfunden worn',
+'search-nonefound' => 'Fia dei Suachofrog gibts koa Ergebnis',
 'powersearch' => 'Suach',
 'powersearch-legend' => 'Daweiterde Suach',
 'powersearch-ns' => 'Suach in Nåmensraim:',
@@ -704,7 +700,7 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 
 # Preferences page
 'preferences' => 'Eihstellungen',
-'mypreferences' => 'Eigerne Eihstellungen',
+'mypreferences' => 'Mei Preferenz',
 'changepassword' => 'Posswort ändern',
 'prefs-editing' => 'Beorweiten',
 'prefs-edit-boxsize' => 'Gress vom Beorweitungsfenster',
@@ -722,11 +718,12 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'prefs-namespaces' => 'Nåmensraim',
 'youremail' => 'E-Mail-Adress:',
 'username' => 'Benutzernåm:',
-'yourrealname' => 'Da echte Nåm:',
+'yourrealname' => 'Biagalicha Nama:',
 'yourlanguage' => 'Sprooch vo da Benutzerowerflächen',
 'prefs-help-realname' => 'Opzionoi. Dodamid kå dai byrgerlicher Nåm daine Baiträg zuagordnet wern.',
-'prefs-help-email' => "Dé Ågob voh ner E-Mail-Adressen is ópziónoi, daméglicht ower d' Zuasendung vohram Ersotzposswort, sófern du deih Posswort vagessen host.",
-'prefs-help-email-others' => "Mid åndre Benutzer kåst aa ywer d' Benutzerdischkrirseiten an Kontakt aufnemmer, one daas du deih Identität óffmléng muasst.",
+'prefs-help-email' => 'De Mail-Adress is optional; es is oba sinnvoi, wensd es Passwort amoi vagessn hosd.',
+'prefs-help-email-others' => 'Andane Nutza kenan so aa mit dia Kontakt afnehma, duach an E-Mail-Link auf da Navi vo da Nutzaseitn.
+Dei Mail-Adress wead dabei ned ozoagt.',
 'prefs-help-email-required' => 'Es werd a güitige E-Mäil-Adress braucht.',
 'prefs-info' => 'Baasisinformazionen',
 
@@ -763,34 +760,35 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'rightslog' => 'Rechte-Logbiache',
 
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'an derer Seiten duast werkeln',
+'action-edit' => 'beorbadd de Seitn',
 'action-createpage' => "Seiten z' dastön",
 'action-autopatrol' => 'eigerne Beorweitungen ois kontroilird markirn',
 
 # Recent changes
-'nchanges' => '$1 {{PLURAL:$1|Änderrung|Änderrungen}}',
-'recentchanges' => 'Létzde Änderrungen',
+'nchanges' => '$1 {{PLURAL:$1|Endarung|Endarunga}}',
+'recentchanges' => 'Letzte Endarunga',
 'recentchanges-legend' => 'Åzoagopziónen',
 'recentchanges-summary' => "Auf derer Seiten kåst d' létzden Änderrungen auf '''{{SITENAME}}''' nochévavóing.",
-'recentchanges-feed-description' => 'Vafóig mid dém Feed dé létzden Änderrungen in {{SITENAME}}.',
+'recentchanges-feed-description' => 'Vafoig mid em Feed de letztn Endarunga in {{SITENAME}}.',
 'recentchanges-label-newpage' => 'Neiche Seiten',
 'recentchanges-label-minor' => 'Kloane Änderrungen',
 'recentchanges-label-bot' => 'Änderrung durch an Bot',
 'recentchanges-label-unpatrolled' => 'Néd-kontróilirde Änderrung',
-'rcnote' => "Untn {{PLURAL:$1|is de letzte Ändarung|san de letztn '''$1''' Ändarungen}} {{PLURAL:$2|vum letztn|vu de letztn '''$2'''}} Tåg aufglist. Stãnd vum $4 um $5.",
-'rcnotefrom' => "Åzoagt wern d' Änderrungen seid  '''$2''' (max. '''$1''' Eihtrég).",
+'rcnote' => "{{PLURAL:$1|'''1''' Endarung|'''$1''' Endarunga}} in dn {{PLURAL:$2|letztn 24 Stundn|letztn '''$2'''Dog}}.
+Stand: $4, $5 Uhr.",
+'rcnotefrom' => "Untn san de Endarunga seit  '''$2''' (bis za '''$1''' Ozoagn).",
 'rclistfrom' => 'Netter Änderrungen seid $1 åzoang.',
 'rcshowhideminor' => 'kloane Änderrungen $1',
 'rcshowhidebots' => 'Bots $1',
 'rcshowhideliu' => 'Ågmödte Benutzer $1',
 'rcshowhideanons' => 'Anónyme Benutzer $1',
-'rcshowhidepatr' => 'Kontróilirde Änderrungen $1',
+'rcshowhidepatr' => 'Kontrolliade Endarunga $1',
 'rcshowhidemine' => 'Eigerne Beiträg $1',
 'rclinks' => "D' létzden $1 Änderrungen voh dé létzden $2 Dog åzoang<br />$3",
-'diff' => 'Unterschiad',
-'hist' => 'Versiónen',
-'hide' => 'ausblenden',
-'show' => 'eihblenden',
+'diff' => 'Untaschied',
+'hist' => 'Versiona',
+'hide' => 'Ausblendn',
+'show' => 'Zoag',
 'minoreditletter' => 'K',
 'newpageletter' => 'Neich',
 'boteditletter' => 'B',
@@ -804,20 +802,21 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 # Recent changes linked
 'recentchangeslinked' => 'Änderrungen ån valinkte Seiten',
 'recentchangeslinked-feed' => 'Valinkts priaffm',
-'recentchangeslinked-toolbox' => 'Valinkts priaffm',
+'recentchangeslinked-toolbox' => 'Endarunga af valinktn Seitn',
 'recentchangeslinked-title' => 'Änderrungen ån Seiten, dé voh „$1“ valinkt san',
-'recentchangeslinked-noresult' => 'Im ausgwöden Zeidraum san an dé valinkden Seiten koane Änderrungen vurgnummer worn.',
-'recentchangeslinked-summary' => "Dé Speziaalseiten zoagd d' létzden Änderrungen bei dé Seiten, zua dé voh ner gwissen Seiten valinkd werd (bzw. dé wos in ner gwissen Kategorie eihsortird san). Seiten voh deiner [[Special:Watchlist|Beówochtungslisten]] wern '''fett''' åzoagd.",
+'recentchangeslinked-noresult' => 'Im ausgwejtn Zeidraum san an dena valinkdn Seitn koane Endarunga vorgnumma worn.',
+'recentchangeslinked-summary' => "Des is a Listn vo de letztn Endarunga af Seitn, de wo vo ana bstimmtn Seitn valinkt san (bzw. za ana bstimmtn Kategorie ghean).
+Seitn af [[Special:Watchlist|deina Beobochtungslistn]] san '''fett'''.",
 'recentchangeslinked-page' => 'Seiten:',
 'recentchangeslinked-to' => 'Zoagt Änderrungen auf Seiten, dé do her valinken',
 
 # Upload
-'upload' => 'Aufféloon',
+'upload' => 'Affelodn',
 'uploadbtn' => 'Daatei aufféloon',
 'uploadnologin' => 'Néd ågmödt',
 'uploadnologintext' => 'Du muasst [[Special:UserLogin|ågmödt]] seih, wånn Du Daatein auffeloon wüst.',
 'uploadlog' => 'Daatei-Logbiache',
-'uploadlogpage' => 'Daatei-Logbiache',
+'uploadlogpage' => 'Logbuach fias Affelodn',
 'uploadlogpagetext' => 'Des is des Logbuach voh de auffegloodanen Daatein, schaug aa unter [[Special:NewFiles|neiche Daatein]].',
 'filename' => 'Daateinåm',
 'filedesc' => 'Bschreiwung',
@@ -835,7 +834,7 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'emptyfile' => 'Dé aufféglooderne Daatei is laar. Da Grund kauh a Tippfeeler im Daateinaum seih. Bittscheh kóntróllier, ób du dé Daatei wirklé aufféloon wüst.',
 'uploadwarning' => 'Ówocht',
 'savefile' => 'Daatei speichern',
-'uploadedimage' => 'hod „[[$1]]“ auffégloon',
+'uploadedimage' => 'hod „[[$1]]“ affeglodn',
 'uploaddisabled' => "'s aufféloon is deaktivierd",
 'uploadscripted' => 'Dé Datei enthoit HTML- óder Scriptcode, der wos irrtymlicherweis voram Webbrowser ausgfyrd wern kunnterd.',
 'uploadvirus' => 'Dé Daatei do enthoitt a Virus! Details: $1',
@@ -880,29 +879,29 @@ Details stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}
 'listfiles_count' => 'Versiónen',
 
 # File description page
-'file-anchor-link' => 'Daatei',
-'filehist' => 'Daateiversiónen',
-'filehist-help' => "Klick auf an Zeidbunkt, um dé Versión z' loon.",
-'filehist-revert' => 'zrucksétzen',
-'filehist-current' => 'aktuö',
-'filehist-datetime' => 'Versión vom',
-'filehist-thumb' => 'Vurschaubüdel',
-'filehist-thumbtext' => "Vurschaubüdel fyr d' Versión vom $1, $3 Uar",
-'filehist-user' => 'Benutzer',
-'filehist-dimensions' => 'Moosse',
+'file-anchor-link' => 'Datei',
+'filehist' => 'Dateiversiona',
+'filehist-help' => 'Klick auf an Zeitpunkt, um de Version ozschaugn.',
+'filehist-revert' => 'zrucksetzn',
+'filehist-current' => 'aktuell',
+'filehist-datetime' => 'Version vom',
+'filehist-thumb' => 'Vorschaubuidl',
+'filehist-thumbtext' => 'Vorschaubuidl fia d Version vo $1',
+'filehist-user' => 'Nutza',
+'filehist-dimensions' => 'Dimensiona',
 'filehist-filesize' => 'Dateigreess',
 'filehist-comment' => 'Kommentar',
-'imagelinks' => 'Daateivawendung',
-'linkstoimage' => "{{PLURAL:$1|D'foignde Seitn vawendt|De foigndn $1 Seitn vawendn}} de Datei:",
+'imagelinks' => 'Dateivawendung',
+'linkstoimage' => '{{PLURAL:$1|De foigende Seitn vawendt|De foigendn $1 Seitn vawendn}} de Datei:',
 'linkstoimage-more' => "Es {{PLURAL:$1|valinkt|valinkn}} mea wia {{PLURAL:$1|oa Seitn |$1 Seitn}} auf de Datei.
 De foignde Listn zaagt netta {{PLURAL:$1|in easten Link|de easten $1 Links}} auf de Datei.
 A [[Special:WhatLinksHere/$2|voiständige Listn]] gibt's aa.",
-'nolinkstoimage' => 'Koah Seiten bnutzd dé Daatei.',
+'nolinkstoimage' => 'De Datei wead vo koana Seitn gnutzt.',
 'morelinkstoimage' => '[[Special:WhatLinksHere/$1|Weidare Links]] fia de Datei.',
 'duplicatesoffile' => "{{PLURAL:$1|D'foignde Datei is a Duplikat|De foigndn $1 Datein han Duplikate}} vu dea Datei ([[Special:FileDuplicateSearch/$2|weidare Deteus]]):",
 'sharedupload' => 'De Datei stãmmt aus $1 und deaf bei ãndare Projekte vawendt wean.',
 'sharedupload-desc-there' => "De Datei stãmmt aus $1 und deaf bei ãndera Projekte vawendt wean. Schau auf'd [$2 Dateibeschreibungsseitn] fia weidare Infoamazionen.",
-'sharedupload-desc-here' => "Dé Daatei ståmmt aus $1 und derf voh åndre Prójektt vawendt wern. D' Bschreiwung voh da [$2 Daateibschreiwungsseiten] werd unten åzoagt.",
+'sharedupload-desc-here' => 'De Datei stammt aus $1 und deaf vo andan Projektn vawendt wean. De Bschreibung vo da [$2 Dateibschreibungsseitn] wead unen ozoagt.',
 'uploadnewversion-linktext' => 'A neiche Versión voh derer Daatei aufféloon',
 
 # File reversion
@@ -922,10 +921,10 @@ A [[Special:WhatLinksHere/$2|voiständige Listn]] gibt's aa.",
 'unusedtemplateswlh' => 'Aundre Links',
 
 # Random page
-'randompage' => 'Zuafällige Seiten',
+'randompage' => 'Zuafoisseitn',
 
 # Statistics
-'statistics' => 'Staatistik',
+'statistics' => 'Statistik',
 'statistics-articles' => 'Inhoidsseiten',
 'statistics-pages' => 'Seiten',
 'statistics-pages-desc' => 'Olle Seiten in dém Wiki, inklusiav da Dischkrirseiten, Weiderloatungen usw.',
@@ -935,7 +934,7 @@ A [[Special:WhatLinksHere/$2|voiständige Listn]] gibt's aa.",
 'statistics-views-total' => 'Seitenaufruaff gsåmmt',
 'statistics-mostpopular' => 'Dé am moastbsuachten Seiten',
 
-'disambiguationspage' => 'Template:Begriffsklärung',
+'disambiguationspage' => 'Template:Begriffsklearung',
 'disambiguations-text' => "D' fóigernden Seiten valinken af a Seiten za ner Begiefsklärung. Du sóiderst stott dém af d' oagerntlich gmoahde Seiten valinken.
 
 A Seiten gijt ois Begriefsklärungsseiten, waunns oane vah dé af [[MediaWiki:Disambiguationspage]] afgfyrde Vurloog(ng) eihbindt.</br>
@@ -954,7 +953,7 @@ Links as Naumensraim wern do néd afglistt.",
 'fewestrevisions' => "Seiten mid d' weenigsten Versiónen",
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'nbytes' => '$1 {{PLURAL:$1|Byte}}',
 'ncategories' => '$1 {{PLURAL:$1|Kategorie|Kategorien}}',
 'nlinks' => '{{PLURAL:$1|a Link|$1 Links}}',
 'nmembers' => '{{PLURAL:$1|1 Eithråg|$1 Eihtreeg}}',
@@ -978,7 +977,7 @@ Links as Naumensraim wern do néd afglistt.",
 'mostcategories' => 'Seiten mid dé haiffigsten Kategorien',
 'mostimages' => 'Haiffig brauchde Daatein',
 'mostrevisions' => "Seiten mid d' haiffigsten Versiónen",
-'prefixindex' => 'Olle Seiten (mid Präfix)',
+'prefixindex' => 'Olle Seien (mit Präfix)',
 'shortpages' => 'Kurze Seiten',
 'longpages' => 'Långe Seiten',
 'deadendpages' => 'Néd valinkende Seiten',
@@ -987,41 +986,41 @@ Links as Naumensraim wern do néd afglistt.",
 'protectedpages-indef' => 'Netter néd bschränkde gschytzde Seiten zoang',
 'protectedpages-cascade' => 'Netter Seiten mid Kaskadenschutz',
 'protectedtitles' => 'Gschytzde Seitennaumen',
-'usercreated' => '{{GENDER:$3|Erstöd}} am $1 um $2 Uar',
-'newpages' => 'Neiche Seiten',
+'usercreated' => '{{GENDER:$3|Oglegt}} am $1 um $2',
+'newpages' => 'Neiche Seitn',
 'newpages-username' => 'Benutzernåm:',
 'ancientpages' => 'Schoh länger nimmer beorweitade Seiten',
 'move' => 'vaschiam',
 'movethispage' => 'de Seiten vaschiam',
 'notargettitle' => 'Koa Seiten ågeem',
-'pager-newer-n' => '{{PLURAL:$1|nexder|nexde $1}}',
-'pager-older-n' => '{{PLURAL:$1|vurheriger|vurhering $1}}',
+'pager-newer-n' => '{{PLURAL:$1|naxta|naxte $1}}',
+'pager-older-n' => '{{PLURAL:$1|vorheriga|vorherign $1}}',
 
 # Book sources
 'booksources' => 'ISBN-Suach',
-'booksources-search-legend' => 'Suach noch Benutzerquön fyr Biacher',
+'booksources-search-legend' => 'Suach noch Bezugsquejn fia Biacha',
 'booksources-go' => 'Suach',
 
 # Special:Log
-'log' => 'Logbiacher',
+'log' => 'Logbiacha',
 'all-logs-page' => 'Olle effmtlichen Logbiacher',
 'alllogstext' => 'Des is de kombinierte Anzeige vo alle in {{SITENAME}} gführten Logbiacha. Die Ausgabe ko durch de Auswahl vom Logbuchtyp, vom Benutzer oder vom Seitntitel eigschränkt wern.',
 'logempty' => 'Koane passenden Einträg.',
 'log-title-wildcard' => 'Da Titel faungt auh mid ....',
 
 # Special:AllPages
-'allpages' => 'Olle Seiten',
+'allpages' => 'Olle Seitn',
 'alphaindexline' => '$1 bis $2',
 'nextpage' => 'Naxde Seiten ($1)',
 'prevpage' => 'Vurherige Seiten ($1)',
 'allpagesfrom' => 'Seiten auhzoang ob:',
 'allpagesto' => 'Seiten auhzoang bis:',
-'allarticles' => 'Olle Seiten',
+'allarticles' => 'Olle Seitn',
 'allinnamespace' => 'Olle Seiten (Naumensraum: $1)',
 'allnotinnamespace' => 'Ollte Seiten  (néd im $1 Naumensraum)',
 'allpagesprev' => 'Vurige',
 'allpagesnext' => 'Naxde',
-'allpagessubmit' => 'Auhwenden',
+'allpagessubmit' => 'Owendn',
 'allpagesprefix' => 'Seiten zoang mid Präfix:',
 'allpagesbadtitle' => "Da eihgeewerne Seitennaum is néd gütig: Er hod éntwéder a vurauhgstöds Sprooch-, a Interwiki-Kyrzel óder enthoitt oah óder mererne Zeichen, dé in d' Seitennaumen néd vawendt wern derffm.",
 'allpages-bad-ns' => 'Dén Naumensraum „$1“ gibts in {{SITENAME}} néd.',
@@ -1040,14 +1039,14 @@ Links as Naumensraim wern do néd afglistt.",
 '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  <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',
+'linksearch-line' => '$1 is valinkt vo $2',
 
 # Special:ListUsers
 'listusers-submit' => 'Zoag',
 'listusers-noresult' => 'Koane Benutzer gfunden.',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Neiåmödungs-Logbiaché',
+'newuserlogpage' => 'Neiomejdungs-Logbuach',
 
 # Special:ListGroupRights
 'listgrouprights' => 'Benutzergruppmrechtt',
@@ -1058,7 +1057,7 @@ Zuasätzlige Informaziónen ywer dé oahzelnen Rechtt kennan [[{{MediaWiki:Listg
 'listgrouprights-group' => 'Gruppm',
 'listgrouprights-rights' => 'Rechte',
 'listgrouprights-helppage' => 'Help:Gruppmrechte',
-'listgrouprights-members' => '(Mitgliaderlisten)',
+'listgrouprights-members' => '(Mitgliedalistn)',
 'listgrouprights-addgroup' => 'Benutzer zua {{PLURAL:$2|derer Gruppm|dé Gruppm}} dazuadoah: $1',
 'listgrouprights-removegroup' => 'Benutzer aus {{PLURAL:$2|derer Gruppm|dé Gruppm}} entferner: $1',
 'listgrouprights-addgroup-all' => 'Benutzer zua olle Gruppm dazuadoah',
@@ -1069,7 +1068,7 @@ Zuasätzlige Informaziónen ywer dé oahzelnen Rechtt kennan [[{{MediaWiki:Listg
 
 # E-mail user
 'mailnologin' => 'Du bist néd auhgmödt',
-'emailuser' => 'E-Póst an dén Benutzer',
+'emailuser' => 'Mail an den Nutza',
 'emailpage' => 'E-Mail aun Benutzer',
 'noemailtitle' => 'Koah E-Mail-Adress',
 'emailfrom' => 'Voh:',
@@ -1088,9 +1087,9 @@ Zuasätzlige Informaziónen ywer dé oahzelnen Rechtt kennan [[{{MediaWiki:Listg
 'usermessage-editor' => 'Systém-Messenger',
 
 # Watchlist
-'watchlist' => 'Beówochtungslisten',
-'mywatchlist' => 'Beówochtungslisten',
-'watchlistfor2' => 'Voh $1 $2',
+'watchlist' => 'Beobochtungslistn',
+'mywatchlist' => 'Mei Beobochta',
+'watchlistfor2' => 'Vo $1 $2',
 'nowatchlist' => 'Es gibt koane Eihträg auf deiner Beówochtungslisten.',
 'watchlistanontext' => "Du muasst dé $1, um deih Beówchtungslisten z' seeng óder Eihträg borweiten z' kenner.",
 'watchnologin' => 'Du bist néd auhgmödt',
@@ -1102,14 +1101,14 @@ Zuasätzlige Informaziónen ywer dé oahzelnen Rechtt kennan [[{{MediaWiki:Listg
 Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, druck oafoch auf da jeeweiling Seiten auf „nimmer beówochten“.',
 'removewatch' => 'Voh da Beówochtungslisten wegdoah',
 'removedwatchtext' => "D' Seiten „[[:$1]]“ is voh deiner [[Special:Watchlist|Beówochtungslisten]] wegdauh worn.",
-'watch' => 'Beówochten',
+'watch' => 'Beobochtn',
 'watchthispage' => "D' Seiten beówochten",
-'unwatch' => 'nimmer beówochten',
+'unwatch' => 'nimma beobochtn',
 'unwatchthispage' => 'Nimmer beówochten',
 'notanarticle' => 'Koah Seiten',
 'notvisiblerev' => 'Versión is gléschd worn',
 'watchnochange' => 'Koahne dé voh dir beówochterden Seiten san wärnd dém auhzoagten Zeidraum beorwatt worn.',
-'watchlist-details' => 'Du bówochst {{PLURAL:$1|$1 Seiten}}, Diskussiónsseiten néd midzöd',
+'watchlist-details' => 'Du beoochst {{PLURAL:$1|$1 Seitn}}, Dischkriaseitn ned mitgrechnad',
 'wlheader-enotif' => '* Da E-Mail-Benoochrichtigungsdeanst is aktivierd.',
 'wlheader-showupdated' => "* Seiten mid noh néd gseengne Änderrungen wern '''fett''' dorgstöd.",
 'watchmethod-recent' => "Ywerpriaff d' létzden Beorwatungen fyr d' Beówochtungslisten",
@@ -1118,7 +1117,7 @@ Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, dru
 'iteminvalidname' => 'Próblém mim Eihtrog „$1“, néd gütiger Naum.',
 'wlnote' => "Es {{PLURAL:$1|fóigt d' létzde Änderrung|fóing d' létzden '''$1''' Änderrungen}} voh da/dé {{PLURAL:$2|Stund| '''$2''' Stunden}}. Staund: $3, $4 Uar.",
 'wlshowlast' => 'Zoag dé Änderrungen voh dé létzden $1 Stunden, $2 Dog óder $3 (in dé létzden 30 Dog).',
-'watchlist-options' => 'Åzoagópziónen',
+'watchlist-options' => 'Mei Beobochta: Optiona',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Beówochten ...',
@@ -1127,11 +1126,7 @@ Waunnst dé Seiten wieder voh deiner Beówochtungslisten weggerddoah mechst, dru
 
 'enotif_mailer' => '{{SITENAME}}-E-Mail-Benoochrichtigungsdeanst',
 'enotif_reset' => 'Olle Seiten ois bsuacht markiern',
-'enotif_newpagetext' => 'Dés is a neiche Seiten.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-Benutzer',
-'changed' => 'gänderd',
-'created' => 'erstöd',
-'enotif_subject' => '[{{SITENAME}}] Dé Seiten „$PAGETITLE“ is voh $PAGEEDITOR $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Olle Änderrungen auf oan Blick: $1',
 'enotif_lastdiff' => 'Schaug auf $1 noch derer Änderrung.',
 'enotif_anon_editor' => 'Anonymer Benutzer $1',
@@ -1172,10 +1167,10 @@ Ryckmödungen und a weidre Hüf: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'delete-legend' => 'Léschen',
 'historywarning' => "'''Ochtung:''' Dé Seiten, dé du léschen mecherst, hod a Versiónsgschicht mid epper $1 {{PLURAL:$1|Versión|Versiónen}}:",
 'confirmdeletetext' => "Du bist dabei, a Seiten mid olle zuaghering ödern Versiónen z' léschen. Bittscheh bstätig dodazua, daas da d' Kónsequenzen bewusst san und daas du in Ywereihstimmung mid d' [[{{MediaWiki:Policy-url}}|Richtlinien]] haundelst.",
-'actioncomplete' => 'Akzión beéndt',
-'actionfailed' => 'Akzión föögschlong',
+'actioncomplete' => 'Aktion beendt',
+'actionfailed' => 'Akzion fejgschlogn',
 'deletedtext' => '„$1“ is glöscht worn. Im $2 findn Sie a Listn vo de letzten Löschungen.',
-'dellogpage' => 'Lésch-Logbiache',
+'dellogpage' => 'Lesch-Logbuach',
 'deletionlog' => 'Lösch-Logbuach',
 'reverted' => 'Auf a oide Version zruckgesetzt',
 'deletecomment' => 'Grund:',
@@ -1188,13 +1183,13 @@ Ryckmödungen und a weidre Hüf: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 'delete-edit-reasonlist' => 'Léschgrynd beorwaten',
 
 # Rollback
-'rollbacklink' => 'Zrucksétzen',
+'rollbacklink' => 'Zrucksetzn',
 'rollbackfailed' => 'Zruckésétzen gscheiterd',
 'cantrollback' => "D' Änderrung kauh néd zruckégsétzd wern, weis koane friarern Autorn gibt.",
 
 # Protect
-'protectlogpage' => 'Seitenschutz-Logbuach',
-'protectedarticle' => 'hod „[[$1]]“ gschytzd',
+'protectlogpage' => 'Seitnschutz-Logbuach',
+'protectedarticle' => 'hod „[[$1]]“ gschitzt',
 'modifiedarticleprotection' => 'hod an Schutz voh „[[$1]]“ gänderd',
 'unprotectedarticle' => 'Schutz voh „[[$1]]“ aufghóm',
 'prot_1movedto2' => 'hod [[$1]] noch [[$2]] vaschóm',
@@ -1230,8 +1225,8 @@ genauasó wia Details zum létzden Benutzer, der dé Seiten vur da Léschung bor
 Da aktuöje Text voh da gléschden Seiten is netter fyr Administraatorn zuagänglich.',
 'undelete-revision' => 'Geléschde Versión voh $1 (vom $4 um $5 Uar), $3:',
 'undeletebtn' => 'Wiederherstön',
-'undeletelink' => 'åschauh / wiaderherstön',
-'undeleteviewlink' => 'åschaung',
+'undeletelink' => 'oschaugn / wiadaheastejn',
+'undeleteviewlink' => 'oschaugn',
 'undeletereset' => 'Zrucksétzen',
 'undeletedfiles' => '$1 {{plural:$1|Datei|Dateien}} san wieda hergstellt worn',
 'undelete-search-box' => 'Suach noch gléschde Seiten',
@@ -1239,48 +1234,48 @@ Da aktuöje Text voh da gléschden Seiten is netter fyr Administraatorn zuagäng
 'undelete-show-file-submit' => 'Jo',
 
 # Namespace form on various pages
-'namespace' => 'Nåmensraum:',
+'namespace' => 'Namasramm:',
 'invert' => 'Auswoi umdraan',
 'namespace_association' => 'Zuagordnéter Nåmensraum',
-'blanknamespace' => '(Seiten)',
+'blanknamespace' => '(Seitn)',
 
 # Contributions
-'contributions' => 'Benutzerbeiträg',
-'contributions-title' => 'Benutzerbeiträg voh „$1“',
-'mycontris' => 'Eigerne Beitrég',
-'contribsub2' => 'Fyr $1 ($2)',
-'uctop' => '(aktuö)',
-'month' => 'und Monad',
-'year' => 'bis zum Jor:',
-
-'sp-contributions-newbies' => "Netter dé Beitrég voh d' neichen Benutzer åzoang",
+'contributions' => '{{GENDER:$1|Nutza}}beidreg',
+'contributions-title' => 'Nutzabeidräg vo „$1“',
+'mycontris' => 'Meine Beidreg',
+'contribsub2' => 'Vo $1 ($2)',
+'uctop' => '(aktuell)',
+'month' => 'und Monad:',
+'year' => 'Bis zan Joar:',
+
+'sp-contributions-newbies' => 'Nua Beidräg vo de neichn Nutza ozoagn',
 'sp-contributions-newbies-sub' => 'Fyr Neiling',
-'sp-contributions-blocklog' => 'Sperrlogbiaché',
+'sp-contributions-blocklog' => 'Sperrlogbuach',
 'sp-contributions-deleted' => 'Gléschde Beitrég',
-'sp-contributions-uploads' => 'Aufféglooderne Daatein',
-'sp-contributions-logs' => 'Logbiacher',
-'sp-contributions-talk' => 'Diskussión',
-'sp-contributions-search' => 'Suach noch Benutzerbeitrég',
-'sp-contributions-username' => 'IP-Adress óder Benutzernåm:',
-'sp-contributions-toponly' => 'Netter aktuelle Versiónen zoang',
-'sp-contributions-submit' => 'Suachen',
+'sp-contributions-uploads' => 'Affeglodane Datein',
+'sp-contributions-logs' => 'Logbiacha',
+'sp-contributions-talk' => 'Dischkrian',
+'sp-contributions-search' => 'Suach noch Nutzabeidräg',
+'sp-contributions-username' => 'IP-Adress oda Nutzanama:',
+'sp-contributions-toponly' => 'Nua aktuelle Versiona ozoagn',
+'sp-contributions-submit' => 'Suachn',
 
 # What links here
-'whatlinkshere' => 'Links auf dé Seiten',
+'whatlinkshere' => 'Links af de Seitn',
 'whatlinkshere-title' => 'Seiten, dé noch „$1“ valinken',
 'whatlinkshere-page' => 'Seiten:',
-'linkshere' => "D' vóigernden Seiten valinken noch '''„[[:$1]]“''':",
-'nolinkshere' => "Koane Seiten valinkt zua '''„[[:$1]]“'''.",
-'isredirect' => 'Weiderloatungsseiten',
-'istemplate' => 'Vurlongeihbindung',
-'isimage' => 'Daateilink',
-'whatlinkshere-prev' => "{{PLURAL:$1|vorige|d'voring $1}}",
-'whatlinkshere-next' => "{{PLURAL:$1|nexde|d'nexdn $1}}",
+'linkshere' => "De foigandn Seitn valinka af '''„[[:$1]]“''':",
+'nolinkshere' => "Koa Seitn valinkt af '''„[[:$1]]“'''.",
+'isredirect' => 'Weidaloatungsseitn',
+'istemplate' => 'Vorlogneinbindung',
+'isimage' => 'Dateilink',
+'whatlinkshere-prev' => '{{PLURAL:$1|vorige|vorign $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|naxde|naxdn $1}}',
 'whatlinkshere-links' => '← Vaweise',
 'whatlinkshere-hideredirs' => 'Weidaleitungen $1',
 'whatlinkshere-hidetrans' => 'Vurlongeihbindung $1',
 'whatlinkshere-hidelinks' => 'Links $1',
-'whatlinkshere-hideimages' => 'Daateilinks $1',
+'whatlinkshere-hideimages' => '$1 Dateilinks',
 'whatlinkshere-filters' => 'Füter',
 
 # Block/unblock
@@ -1311,7 +1306,7 @@ Gib bittschee an Grund fyr d' Sperrn å.",
 'ipbenableautoblock' => "Sperr dé aktuö voh dém Benutzer gnutzde IP-Adress sówia autómaatisch olle fóiganden, voh dénen aus er Beorweitungen óder 's Auhléng voh Benutzerkóntós vasuacht.",
 'ipbsubmit' => 'IP-Adress/Benutzer sperrn',
 'ipbother' => 'Åndre Dauer (auf englisch):',
-'ipboptions' => '2 Stund:2 hours,1 Dog:1 day,3 Dog:3 days,1 Woch:1 week,2 Wochen:2 weeks,1 Monad:1 month,3 Monad:3 months,6 Monad:6 months,1 Jor:1 year, Leemslång:infinite',
+'ipboptions' => '2 Stund:2 hours,1 Dog:1 day,3 Dog:3 days,1 Woch:1 week,2 Wocha:2 weeks,1 Monat:1 month,3 Monat:3 months,6 Monat:6 months,1 Joar:1 year, Infinit:infinite',
 'ipbotheroption' => 'Åndre Dauer:',
 'ipbotherreason' => 'Ånderner/ergenznder Grund:',
 'ipbhidename' => 'An Benytzernåmen in Beorwaitungen und Linsten vastecken',
@@ -1331,24 +1326,24 @@ Zur da Aufheewung vo da Sperrn schau unter da [[Special:BlockList|Listen vo olle
 'ipusubmit' => 'Freigem',
 'unblocked' => '[[User:$1|$1]] is freigem worn',
 'unblocked-id' => 'Sperr-ID $1 is fraigeem worn',
-'ipblocklist' => 'Gsperrde Benutzer',
+'ipblocklist' => 'Gsperrte Nutza',
 'ipblocklist-legend' => 'Suach noch am gsperrden Benytzer',
 'createaccountblock' => "'s erstön voh Benutzerkóntós is gsperrd",
 'emailblock' => 'E-Póst vaschicker is gsperrd',
-'blocklink' => 'sperrn',
-'unblocklink' => 'Freigeem',
-'change-blocklink' => 'Sperr ändern',
-'contribslink' => 'Beitrég',
+'blocklink' => 'Sperrn',
+'unblocklink' => 'Freigebm',
+'change-blocklink' => 'Sperr endan',
+'contribslink' => 'Beidräg',
 'emaillink' => 'E-Póst schicker',
 'autoblocker' => 'Autómaatische Sperr, wei du a gmoahsaume IP-Adress mim [[User:$1|$1]] bnutzd. Grund voh da Benutzersperrn: „$2“.',
-'blocklogpage' => 'Benutzersperrlogbiaché',
+'blocklogpage' => 'Sperrlogbuach',
 'blocklog-showlog' => "{{GENDER:$1|Der Benutzer|Dé Benutzerrin|Der Benutzer}} do is schoh friarer gsperrd worn. Es fóigt a Eihtrog aus'm Benutzersperrlogbiaché:",
 'blocklog-showsuppresslog' => "{{GENDER:$1|Der Benutzer|Dé Benutzerrin|Der Benutzer}} do is schoh friarer gsperrd und vastéckt worn. Es fóigt a Eihtrog aus'm Benutzersperrlogbiaché:",
-'blocklogentry' => 'hod „[[$1]]“ fyrn fóigenden Zeidraum gsperrd: $2; $3',
+'blocklogentry' => 'hod „[[$1]]“ gsperrt bis: $2; $3',
 'reblock-logentry' => "hod d' Sperrn voh „[[$1]]“ fyrn Zeidraum: $2 $3 gänderd.",
 'unblocklogentry' => "hod d' Sperr voh „$1“ aufghóm",
 'block-log-flags-anononly' => 'netter Anónyme',
-'block-log-flags-nocreate' => "'s erstön voh Benutzerkontós is gsperrd",
+'block-log-flags-nocreate' => 'Es Olegn vo Nutzakontn is gsperrt',
 'block-log-flags-noautoblock' => 'Autóblóck deaktivierd',
 'block-log-flags-noemail' => 'E-Post vaschicka gspead',
 
@@ -1398,18 +1393,18 @@ Bittschee gib außadem druntn in '''neichn''' Nãm vu da Seitn ei und schreib ku
 'talkexists' => "D' Seiten söwer is erfóigreich vaschóm worn, ower d' zuagherige Dischkrierseiten néd, weis mid dém Titel schoh oane gibt. Bittscheh kymmerd dé händisch ums zaummfyrn.",
 'movedto' => 'vaschóm auf',
 'movetalk' => "Waunns geet, d' Dischkrierseiten aa midvaschiam",
-'movelogpage' => 'Vaschiawungs-Logbiaché',
+'movelogpage' => 'Vaschiabungs-Logbuach',
 'movereason' => 'Grund:',
-'revertmove' => 'zruck vaschiam',
+'revertmove' => 'zruck vaschiabm',
 'delete_and_move' => 'Löschn und vaschiam',
 'delete_and_move_reason' => 'glöscht, um Plåtz fia Vaschiam zum macha',
 'selfmove' => 'Ursprungs- und Zielname sand gleich; a Seitn kann net auf sich selber verschom wern.',
 
 # Export
-'export' => 'Seiten exportirn',
+'export' => 'Seitn exportian',
 
 # Namespace 8 related
-'allmessagesname' => 'Nåm:',
+'allmessagesname' => 'Nama:',
 'allmessagesdefault' => 'Standardtext',
 'allmessagescurrent' => 'Aktuella Text',
 'allmessagestext' => 'Des is a Listen vo de MediaWiki-Systemtextt.
@@ -1417,8 +1412,8 @@ Bsuach bittschee de Saiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Loka
 'allmessagesnotsupportedDB' => "'''Special:Allmessages''' is im Moment net möglich, wei de Datenbank offline is.",
 
 # Thumbnails
-'thumbnail-more' => 'vagreessern',
-'thumbnail_error' => 'Feeler beim Erstön vom Vurschaubüd: $1',
+'thumbnail-more' => 'vagressan',
+'thumbnail_error' => 'Fehla ban Estejn vom Vorschaubuidl: $1',
 
 # Special:Import
 'importnotext' => 'Laar oder koa Text',
@@ -1427,67 +1422,69 @@ Bsuach bittschee de Saiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Loka
 'importlogpage' => 'Import-Logbuach',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Deih Benutzerseiten',
-'tooltip-pt-mytalk' => 'Deih Diskussiónsseiten',
-'tooltip-pt-preferences' => 'Eigerne Eihstellungen',
-'tooltip-pt-watchlist' => "Listen voh d' Seiten, dést beówochst",
-'tooltip-pt-mycontris' => 'Listen voh dé eigernen Beiträg',
-'tooltip-pt-login' => 'Das ma sé ånmödt, werd zwor gern gseeng, is ower koah Pflicht néd.',
-'tooltip-pt-logout' => 'Obmöden',
-'tooltip-ca-talk' => 'Diskussión zum Seiteninhoid',
-'tooltip-ca-edit' => "Seiten beorweiden. Bittscheh vurm Speichern d' Vurschaufunkzión brauchen",
-'tooltip-ca-addsection' => 'Neichen Obschnit åfånger',
-'tooltip-ca-viewsource' => 'Dé Seiten is gschytzd. Da Quötext kå ower ågschaud wern.',
-'tooltip-ca-history' => 'Friarerne Versiónen voh derer Seiten',
-'tooltip-ca-protect' => 'Seiten schytzen',
+'tooltip-pt-userpage' => 'Dei Nutzaseitn',
+'tooltip-pt-mytalk' => 'Dei Dischkriaseitn',
+'tooltip-pt-preferences' => 'Deine Preferenzn',
+'tooltip-pt-watchlist' => 'A Listn vo Seitn, wos du beobochtest',
+'tooltip-pt-mycontris' => 'A Listn vo de oagna Beidreg',
+'tooltip-pt-login' => 'Warad schee, wensd di omejdn dadast, es is oba ned zwingend nedig.',
+'tooltip-pt-logout' => 'Auslogga',
+'tooltip-ca-talk' => 'Dischkrian iban Seitninhoid',
+'tooltip-ca-edit' => 'Du konsd de Seitn beorbatn. Bittschee vawendt in Vorschau-Knopf bevorsd speichasd.',
+'tooltip-ca-addsection' => 'Neichn Obschnitt ofanga',
+'tooltip-ca-viewsource' => 'De Seitn is gschitzd. In Quejtext konsda oschaugn.',
+'tooltip-ca-history' => 'Friaare Versiona vo dera Seitn',
+'tooltip-ca-protect' => 'Seitn schitzn',
 'tooltip-ca-unprotect' => 'Seitenschutz ändern',
-'tooltip-ca-delete' => 'De Seitn löschen',
+'tooltip-ca-delete' => 'De Seitn leschn',
 'tooltip-ca-undelete' => 'Eihträg wiederherstön, bevur dé Seiten gléscht worn is.',
-'tooltip-ca-move' => 'Dé Seiten vaschiam',
-'tooltip-ca-watch' => 'Dé Seiten zua persénlichen Beówochtungslisten dazua doah',
+'tooltip-ca-move' => 'De Seitn vaschiabm',
+'tooltip-ca-watch' => 'De Seitn zua Beobochtungslistn dazua doa',
 'tooltip-ca-unwatch' => 'Dé Seiten voh da persénlichen Beówochtungslisten entferner',
-'tooltip-search' => '{{SITENAME}} durchsuachen',
+'tooltip-search' => '{{SITENAME}} duachsuacha',
 'tooltip-search-go' => 'Gee direkt zua derer Seiten, dé exakd am eihgeewernen Nåm entspricht.',
-'tooltip-search-fulltext' => 'Suach noch Seiten, dé dén Text enthoiden',
-'tooltip-p-logo' => 'Hauptseiten',
-'tooltip-n-mainpage' => 'Hauptseiten åzoang',
-'tooltip-n-mainpage-description' => 'Hauptseiten bsuachen',
-'tooltip-n-portal' => "Ywers Portoi, wos d' mochen kåst, wó eppers z' finden is",
-'tooltip-n-currentevents' => 'Hintergrundinformaziónen ywer akutelle Ereigniss',
-'tooltip-n-recentchanges' => 'Listen voh dé létzden Änderrungen auf {{SITENAME}}',
-'tooltip-n-randompage' => 'Zuaföige Seiten',
-'tooltip-n-help' => 'Hüfeseiten åzoang',
-'tooltip-t-whatlinkshere' => 'Listen voh olle Seiten, dé do her zoang',
-'tooltip-t-recentchangeslinked' => "D' létzden Änderrungen auf dé Seiten, dé voh do valinkt san",
+'tooltip-search-fulltext' => 'Suach noch Seitn, wo den Text enthoiden',
+'tooltip-p-logo' => 'Schau da de Hoamseitn o',
+'tooltip-n-mainpage' => 'Schau da de Hoamseitn o',
+'tooltip-n-mainpage-description' => 'De Hoamseitn bsuacha',
+'tooltip-n-portal' => 'Ibas Projekt, wos d mocha konst, wo wos z findn is',
+'tooltip-n-currentevents' => 'Hintergrundinformaziónen ywer akutelle Ereigniss
+
+Hintagrundinfo za Neiigkeidn',
+'tooltip-n-recentchanges' => 'A Listn vo de letztn Endarunga in da {{SITENAME}}',
+'tooltip-n-randompage' => 'A Zuafoisseitn afruafa',
+'tooltip-n-help' => 'Huifseitn ozoagn',
+'tooltip-t-whatlinkshere' => 'A Listn vo oin Seitn, wo do hea zoagn',
+'tooltip-t-recentchangeslinked' => 'De letztn Endarunga af Seitn, de wo do hea valinka',
 'tooltip-feed-rss' => 'RSS-Feed vo derer Saiten',
-'tooltip-feed-atom' => 'Atom-Feed vo derer Saiten',
+'tooltip-feed-atom' => 'Atom-Feed vo dera Seitn',
 'tooltip-t-contributions' => "D' Listen voh d' Beiträg voh dém Benutzer åschauh",
-'tooltip-t-emailuser' => 'Dém Benutzer a E-Post schicken',
-'tooltip-t-upload' => 'Daatein aufféloon',
-'tooltip-t-specialpages' => 'Listen voh olle Speziaalseiten',
-'tooltip-t-print' => 'Druckåsicht voh derer Seiten',
-'tooltip-t-permalink' => 'Dauerhofter Link zua derer Seitenversión',
-'tooltip-ca-nstab-main' => 'Seiteninhoid åzoang',
+'tooltip-t-emailuser' => 'Em Nutza a Mail schicka',
+'tooltip-t-upload' => 'Datein affelodn',
+'tooltip-t-specialpages' => 'A Listn vo olle Spezialseitn',
+'tooltip-t-print' => 'Druckosicht za dea Seitn',
+'tooltip-t-permalink' => 'Dauerhofta Link za dea Seitnversion',
+'tooltip-ca-nstab-main' => 'Seitninhoid ozoagn',
 'tooltip-ca-nstab-user' => 'Benutzerseiten åzoang',
 'tooltip-ca-nstab-media' => 'Meediendaateiseiten åzoang',
-'tooltip-ca-nstab-special' => 'Dés is a Speziaalseiten dést néd beorweiden kåst.',
-'tooltip-ca-nstab-project' => 'Portoiseiten åzoang',
-'tooltip-ca-nstab-image' => 'Daateiseiten åzoang',
+'tooltip-ca-nstab-special' => 'Des is a Spezialseitn, wosd ned beorbatn konst.',
+'tooltip-ca-nstab-project' => 'Projektseitn ozoagn',
+'tooltip-ca-nstab-image' => 'Dateiseiten ozoagn',
 'tooltip-ca-nstab-mediawiki' => 'MediaWiki-Systémtext åzoang',
-'tooltip-ca-nstab-template' => 'Vurlog åzoang',
+'tooltip-ca-nstab-template' => 'Vorlog ozoagn',
 'tooltip-ca-nstab-help' => 'Huifseitn oozoang',
-'tooltip-ca-nstab-category' => 'Kategorieseiten åzoang',
-'tooltip-minoredit' => 'Dé Änderrung ois a kloane markirn.',
-'tooltip-save' => 'Änderrungen speichern',
+'tooltip-ca-nstab-category' => 'Kategorieseitn ozoagn',
+'tooltip-minoredit' => 'Ois kloane Endarung markian.',
+'tooltip-save' => 'Endarunga speichan',
 'tooltip-preview' => 'A Vurschau voh dé Änderrungen an derer Seiten. Bittscheh vurm Speichern bnutzen!',
 'tooltip-diff' => 'Änderrungen am Text zoang',
 'tooltip-compareselectedversions' => 'Unterschiade zwischen zwoa ausgwöde Versiónen voh derer  Seiten vagleichen.',
-'tooltip-watch' => 'Dé Seiten zua persénlichen Beówochtungslisten dazua doah',
+'tooltip-watch' => 'De Seitn zua Beobochtungslistn gebm',
 'tooltip-recreate' => 'Seitn nei erstelln, obwoi sie glöscht worn is.',
 'tooltip-upload' => 'Start as Aufféloon',
-'tooltip-rollback' => 'Sétzd olle Beiträg, dé vom gleichen Benutzer gmocht worn san, mid am oanzing Klick auf dé Versión zruck, dé aktuö gwén is, bevur der oane zum werkeln ågfånger hod.',
-'tooltip-undo' => 'Mocht netter dé oane Änderrung ryckgängég und zoagts Resuitot in da Vurschau å, damid in da Zåmmfossungszeiln a Begryndung ågeem wern kå.',
-'tooltip-summary' => 'Gib a kurze Zåmmfossung eih',
+'tooltip-rollback' => 'Setzt olle Endarunga zruck, de wo vom gleichn Nutza gmocht worn san.',
+'tooltip-undo' => 'Nimmt nua de oane Endarung zruck und eameglicht an Grund ozgebm (Zammfossungszein).',
+'tooltip-summary' => 'Gib a kuaze Zammfossung ein',
 
 # Attribution
 'lastmodifiedatby' => 'Dé Seiten is zletzt am $1 um $2 voh $3 gänderd worn.',
@@ -1502,13 +1499,13 @@ Bsuach bittschee de Saiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Loka
 'filedelete-missing' => 'De Datei „$1“ ko net glöscht wern, weils es net gibt.',
 
 # Browsing diffs
-'previousdiff' => '← Zum vorigen Versionsunterschied',
-'nextdiff' => 'zum nextn Untaschied in de Veasionen →',
+'previousdiff' => '← Zan vorign Versionsuntaschied',
+'nextdiff' => 'Zan naxtn Versionsuntaschied →',
 
 # Media information
-'file-info-size' => '$1 × $2 Pixel, Daateigreess: $3, MIME-Typ: $4',
-'file-nohires' => 'Es gibt koah heecherne Auflésung.',
-'svg-long-desc' => 'SVG-Datei, Basisgreß: $1 × $2 Pixl, Dateigreß: $3',
+'file-info-size' => '$1 × $2 Pixel, Dateigress: $3, MIME-Typ: $4',
+'file-nohires' => 'Es gibt koa hehare Aflesung.',
+'svg-long-desc' => 'SVG-Datei, Basisgress: $1 × $2 Pixl, Dateigress: $3',
 'show-big-image' => 'Versión in heecherner Auflésung',
 
 # Special:NewFiles
@@ -1518,18 +1515,19 @@ Bsuach bittschee de Saiten [//www.mediawiki.org/wiki/Localisation MediaWiki-Loka
 'ilsubmit' => 'Suach',
 
 # Bad image list
-'bad_image_list' => "Formaat:
+'bad_image_list' => 'Format wia foigt:
 
-Netter Zeun, dé mid am * åfångern, wern ausgwertt. Ois ersters noch 'm * muass a Link auf a unerwynschde Daatei steh.
-Dodrauf fóigende Links auf Seiten in da söm Zeun definirn Ausnåmen, in dénen eanern Zåmmenhång dé Daatei trótzdém vawendt wern derf.",
+Nua Zein, de wo mit am * ofanga, wean ausgweatet. 
+Da easchte Link in da Zein, muass a Link af a schlechte Datei sei.
+Irgendwejche foigandn Links in da sejm Zein definian Ausnahma, z. B. Seitn wo de Datei trotzdem vawendt wean deaf.',
 
 # Metadata
-'metadata' => 'Metadaaten',
+'metadata' => 'Metadatn',
 'metadata-help' => 'Dé Daatei enthoit weiderne Informaziónen, dé in da Reegel voh da Digitoikammera óder am vawenderden Scanner ståmmern. Durch a noochträgliche Beorweidung voh da Originoidaatei kennern oanige Deteils vaänderd worn seih.',
 'metadata-expand' => 'Erweitate Deteus eiblendn',
 'metadata-collapse' => "D' erweiterden Details eihblenden",
-'metadata-fields' => "D' fóigernden Föder voh dé EXIF-Metadaaten, dé in dém MediaWiki-Systémtext ågeem san, wern auf Büdelbschreiwungsseiten mid eihkloppter Metadaatentabön åzoagt.
-Weiderne wern standardmässig néd åzoagt.
+'metadata-fields' => 'De foigandn Fejda vo de EXIF-Metadaten, wo im MediaWiki-Systemtext ogebm san, wean auf Buidbschriebseitn mid eikloppta Metadatentabejn ozoagt.
+Weidane wean standardmassi ned ozoagt.
 * make
 * model
 * datetimeoriginal
@@ -1542,7 +1540,7 @@ Weiderne wern standardmässig néd åzoagt.
 * imagedescription
 * gpslatitude
 * gpslongitude
-* gpsaltitude",
+* gpsaltitude',
 
 # EXIF tags
 'exif-gpsspeed' => 'Gschwindigkeid vom GPS-Empfänger',
@@ -1550,8 +1548,8 @@ Weiderne wern standardmässig néd åzoagt.
 'exif-componentsconfiguration-0' => 'Gibts néd',
 
 # External editor support
-'edit-externally' => 'Dé Daatei mid am externen Prógramm beorweiden',
-'edit-externally-help' => '(Schaug unter [//www.mediawiki.org/wiki/Manual:External_editors Installaziónsåweisungen] fyr weiderne Informaziónen)',
+'edit-externally' => 'De Datei mid am externa Programm beorbatn',
+'edit-externally-help' => '(Schaug unter [//www.mediawiki.org/wiki/Manual:External_editors Installationsoweisunga] fia weidane Infos)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'olle',
@@ -1609,16 +1607,16 @@ Bittscheh d' noraale Vurschau bnutzen.",
 'watchlistedit-raw-submit' => 'Beówochtungslisten aktualisirn',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'Änderrungen vafóing',
-'watchlisttools-edit' => 'normaal beorwaten',
-'watchlisttools-raw' => 'Im Listenformaat beorwaten',
+'watchlisttools-view' => 'Mei Beobochta: Endarunga',
+'watchlisttools-edit' => 'normal beorbatn',
+'watchlisttools-raw' => 'Im Roh-Listnformat beorbatn',
 
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|Diskussión]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'Unbekaunnter Extension-Tag „$1“',
-'duplicate-defaultsort' => 'Ówocht: Da Sortiarungsschlyssel "$2" ywerschreibt dén vurher vawendten Schlyssel "$1".',
+'duplicate-defaultsort' => 'Obocht: Da Sortiasschlossl "$2" ibaschreibt in friaan Schlissl "$1".',
 
 # Special:Version
 'version' => 'Versión',
@@ -1651,7 +1649,7 @@ Bittscheh d' noraale Vurschau bnutzen.",
 'fileduplicatesearch-result-1' => 'Dé Daatei „$1“ hod koane identischen Duplikaate.',
 
 # Special:SpecialPages
-'specialpages' => 'Speziaalseiten',
+'specialpages' => 'Spezialseitn',
 'specialpages-note' => '----
 * Reguläre Speziaalseiten
 * <span class="mw-specialpagerestricted">Zuagrifsbschränkde Speziaalseiten</span>
@@ -1674,14 +1672,14 @@ Bittscheh d' noraale Vurschau bnutzen.",
 'intentionallyblankpage' => 'Dé Seiten is obsichtlich óne an Inhoid. Sie werd fyr Benchmarks vawendt',
 
 # External image whitelist
-'external_image_whitelist' => "#Dé Zeiln néd vaändern<pre>
-#Unterhoib kennern Fragmentt voh reeguläre Ausdryck (da Teil zwischen de //) eihgeem wern.
-#Dé wern mid d' URL voh Büder aus externe Quön vaglichen
-#A pósitiaver Vagleich fyrd zur da Åzoag vom Büd, sunst werds Büdel netter ois Link åzoagt
-#Zeiln, dé mid am # åfångern, wern ois Kommentar bhåndelt
-#Es werd néd zwischen da Gróss- und Kloahschreiwung unterschian
+'external_image_whitelist' => '#De Zein ned vaendan<pre>
+#Untahoib kennan Fragment vo reguleare Ausdrick (da Tei zwischn de //) eigebm wean.
+#De wean mid de URL vo externa Buidl vaglicha (Hotlinks)
+#A positiva Vagleich fiat zua Buidozoag, sonst wead nua a Link zan Buid ozoagt
+#Zein, wo mit # ofanga, wean ois Kommentar bhandlt
+#Grouss-/Kloaschreibung is irrelevant
 
-#Fragmentt vo reeguläre Ausdryck noch derer Zeiln eihtrong. Dé Zeiln néd vaändern</pre>",
+#Fragment vo reguleare Ausdrick noch dera Zein eitrong. De Zein ned vaendan</pre>',
 
 # Special:Tags
 'tags' => 'Gütige Änderrungsmarkiarunen',
@@ -1722,4 +1720,8 @@ Bittscheh d' noraale Vurschau bnutzen.",
 'htmlform-reset' => 'Änderrungen ryckgängég mochen',
 'htmlform-selectorother-other' => 'Åndre',
 
+# Search suggestions
+'searchsuggest-search' => 'Suach',
+'searchsuggest-containing' => 'Voitextsuach noch ...',
+
 );
index 1fd41c0..bfc8df8 100644 (file)
@@ -16,6 +16,7 @@
 
 $fallback = 'fa';
 
+$rtl = true;
 
 $namespaceNames = array(
        NS_MEDIA            => 'مدیا',
@@ -274,7 +275,6 @@ $messages = array(
 'qbbrowse' => 'بروز',
 'qbedit' => 'اصلاح',
 'qbpageoptions' => 'صفحه',
-'qbpageinfo' => 'متن',
 'qbmyoptions' => 'منی صفحات',
 'qbspecialpages' => 'حاصین صفحات',
 'faq' => 'ب.ج.س',
@@ -511,9 +511,6 @@ $2',
 
 شما تونیت چه {{SITENAME}} ناشناس استفاده کنیت یا شما تونیت دگه وراد بیت گون دگه یا هما کاربر.
 توجه بیت که لهتی صفحات شاید په داب هما وهدی که شما وراد بوتتیت پیش درگ بند تا وهدی که ذخیره بروزر وتی پاک کنیت.",
-'welcomecreation' => '== وش آتکی،$1! ==
-شمی حساب شر بیت.
- مه شموشیت وتی [[Special:Preferences|{{SITENAME}} ترجیحات]] ترجیحات عوض کنیت',
 'yourname' => 'نام کاربری',
 'yourpassword' => 'کلمه رمز',
 'yourpasswordagain' => 'کلمه رمز دگه نویس',
@@ -982,8 +979,6 @@ $1",
 'search-interwiki-caption' => 'پروژه آن گوهار',
 'search-interwiki-default' => '$1 نتایج:',
 'search-interwiki-more' => '(گیشتر)',
-'search-mwsuggest-enabled' => 'گون پیشنهاد',
-'search-mwsuggest-disabled' => 'هچ پیشنهاد',
 'search-relatedarticle' => 'مربوطین',
 'mwsuggest-disable' => 'پیشنهادات آژاکسیء غیر فعال کن',
 'searcheverything-enable' => 'گردگ ته کل فضانامان',
@@ -1791,11 +1786,7 @@ PICT # misc.
 
 'enotif_mailer' => '{{SITENAME}} ایمیل دیم دهوک اخطاری',
 'enotif_reset' => 'نشان کن کل صفحات په داب چارتگین',
-'enotif_newpagetext' => 'شی یک نوکین صفحه ایت.',
 'enotif_impersonal_salutation' => '{{SITENAME}} کاربر',
-'changed' => 'عوض بوت.',
-'created' => 'شربوتت',
-'enotif_subject' => '{{SITENAME}} صفحه $PAGETITLE بوتت $CHANGEDORCREATED گون $PAGEEDITOR',
 'enotif_lastvisited' => 'بچار  $1 په کلین تغییرات چه شمی آهری چارگ.',
 'enotif_lastdiff' => 'بچار $1 په گندگ ای تغییر.',
 'enotif_anon_editor' => 'ناشناس کاربر $1',
index f106772..71be8f1 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Filipinayzd
  * @author Geopoet
+ * @author Hoo
  * @author Kaganer
  * @author Steven*fung
  * @author Urhixidur
@@ -33,6 +34,11 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Olay_sa_kategorya',
 );
 
+$specialPageAliases = array(
+       'Search'                    => array( 'Hanapon' ),
+       'Upload'                    => array( 'Ikarga' ),
+);
+
 $magicWords = array(
        'currentmonth'              => array( '1', 'BULANNGONYAN', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonthname'          => array( '1', 'NGARANBULANNGONYAN', 'CURRENTMONTHNAME' ),
@@ -89,11 +95,6 @@ $magicWords = array(
        'pagesize'                  => array( '1', 'PAHINASOKOL', 'PAGESIZE' ),
 );
 
-$specialPageAliases = array(
-       'Search'                    => array( 'Hanapon' ),
-       'Upload'                    => array( 'Ikarga' ),
-);
-
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Linyahan an kilyawan:',
@@ -145,7 +146,7 @@ $messages = array(
 
 'underline-always' => 'Pirmi',
 'underline-never' => 'Nungka',
-'underline-default' => 'Kilyaw na panugmad',
+'underline-default' => 'Kublit o kilyaw na panugmad',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Baguhon an estilo nin kalwig sa sinasakupan',
@@ -230,8 +231,8 @@ $messages = array(
 'newwindow' => '(minabukas sa bàgong bintanà)',
 'cancel' => 'Kanselaron',
 'moredotdotdot' => 'Kadagdagan...',
-'mypage' => 'An sakóng pahina',
-'mytalk' => 'An sakóng olay',
+'mypage' => 'An Pahina',
+'mytalk' => 'Orolayan',
 'anontalk' => 'Olay para kaining IP address',
 'navigation' => 'Nabigasyon',
 'and' => '&#32;asin',
@@ -241,7 +242,6 @@ $messages = array(
 'qbbrowse' => 'Halungkáta',
 'qbedit' => 'Liwata',
 'qbpageoptions' => 'Ining pahina',
-'qbpageinfo' => 'Konteksto',
 'qbmyoptions' => 'Sakong mga pahina',
 'qbspecialpages' => 'Espesyal na mga pahina',
 'faq' => 'PPK (Pirmihang Pighahapot na mga kahaputan)',
@@ -254,7 +254,7 @@ $messages = array(
 '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-simplesearch-preference' => 'Paganahon an pinagyanong panukod sa paghahanap (Pansolong kublit sana)',
 'vector-view-create' => 'Magmukna',
 'vector-view-edit' => 'Liwatón',
 'vector-view-history' => 'Tanawon sa historiya',
@@ -264,6 +264,7 @@ $messages = array(
 'namespaces' => 'Mga espasyong ngaran',
 'variants' => 'Mga pinalaen',
 
+'navigation-heading' => 'Listahan sa Nabigasyon',
 'errorpagetitle' => 'Salâ',
 'returnto' => 'Magbalik sa $1.',
 'tagline' => 'Gikan sa {{SITENAME}}',
@@ -473,11 +474,12 @@ Hapót: $2',
 '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á.',
+'protectedpagetext' => 'Ining pahina protektado tanganing malikayan an pagliliwat o ibang aksyon.',
 '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:''' Ika nagliliwat kan pahina na ginagamit sa pagtao nin pantahaw-olay na teksto para sa software.
+'protectedinterface' => 'An pahinang ini nagtatao nin panlaog-olay para sa software, asin protektado tangaring malikayan an abuso.
+Sa pagdagdag or pagliwat nin mga dakit-taramon para sa bilog na wiki, gamita tabi an [//translatewiki.net/translatewiki.net], an MediaWiki sa proyektong lokalisasyon.',
+'editinginterface' => "'''Patanid:''' 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)',
@@ -505,11 +507,11 @@ An administrador na iyo an nagkandado kaini nagpahayag kaining kapaliwanagan: "$
 # Login and logout pages
 'logouttext' => "'''Ika po sa ngunyan nakaluwas na.'''
 
-Ika makakadagos pa sa paggamit kan {{SITENAME}} na dai nagpapabisto, o ika [[Special:UserLogin|Maglaog giraray]] bilang pareho o bilang ibang paragamit.
+Ika makakadagos pa sa paggamit kan {{SITENAME}} na dai nagpapabisto, o ika <span class='plainlinks'>[$1 Maglaog giraray]</span> 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]].',
+'welcomeuser' => 'Marhayong pag-abot, $1!',
+'welcomecreation-msg' => 'An saimong panindog pinagmukna na.
+Dae malingaw na liwaton an saimong [[Special:Preferences|{{SITENAME}} mga kamuyahan]].',
 'yourname' => 'Pangaran kan paragamit:',
 'yourpassword' => 'Pasa-taramon:',
 'yourpasswordagain' => 'Pakilaog giraray kan sekretong panlaog:',
@@ -761,8 +763,8 @@ Kun ika sarong dae pa bistadong paragamit asin mati mo na igwang irelebanteng sa
 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,
+'noarticletext-nopermission' => 'Mayong sa presente nin teksto an pahinang ini.
+Ika mapuwedeng [[Special:Search/{{PAGENAME}}|hanapa para kaining titulo kan pahina]] 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.
 
@@ -792,7 +794,7 @@ An pinakahuring entrada kan pagkubkob nakahaya sa ibaba bilang reperensiya:',
 'note' => "'''Paisi:'''",
 'previewnote' => "'''Giromdoma na ini sarong patanaw pa sana.'''
 An saimong mga pinagriliwat dae pa tabi naitatagama!",
-'continue-editing' => 'Ipagpadagos an pagliliwat',
+'continue-editing' => 'Magduman sa lugar nin 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.'''",
@@ -872,6 +874,15 @@ Ini minapahiwatig tabi na pinagpura na.',
 'edit-already-exists' => 'Dai maggibo an bàgong pahina.
 Igwa na kaini.',
 'defaultmessagetext' => 'Tugmadong mensahe sa teksto',
+'content-failed-to-parse' => 'Nagpalya sa paglunhay an $2 na laman para sa $1 na modelo: $3',
+'invalid-content-data' => 'Imbalidong datos nin laman',
+'content-not-allowed-here' => '"$1" na laman dae pinagtutugutan sa pahina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wiki-teksto',
+'content-model-text' => 'yanong-teksto',
+'content-model-javascript' => 'Java-Kurit',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Patanid tabi:''' Ining pahina naglalaman nin grabe kadakulon na ekspensibong programang pambaranga sa punksyon nin mga pag-aapod.
@@ -1027,9 +1038,10 @@ Ika mayo tabing pangaputan kaini.',
 '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
+'revdelete-reason-dropdown' => '*Komon na mga rason sa pagpura
 **Paglapas kan Copyright
 **Bakong angay na personal na impormasyon
+**Bakong angay na pangaran nin paragamit
 **Potensiyal na libelosong impormasyon',
 'revdelete-otherreason' => 'Iba pa/kadagdagang rason:',
 'revdelete-reasonotherlist' => 'Ibang rason',
@@ -1129,8 +1141,6 @@ An mga detalye mapuwedeng matatagboan sa [{{fullurl:{{#Special:Log}}/delete|page
 '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',
@@ -1164,7 +1174,7 @@ Prubaran na panigmitan an saimong kahaputan nin ''all:'' sa paghanap kan gabos n
 
 # Preferences page
 'preferences' => 'Mga kabòtan',
-'mypreferences' => 'Mga kabòtan ko',
+'mypreferences' => 'Mga Kamuyahan ko',
 'prefs-edits' => 'Bilang kan mga hirá:',
 'prefsnologin' => 'Dai nakalaog',
 'prefsnologintext' => 'Ika dapat na magin <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nakalaog na]</span> tanganing tuytuyon an mga kabotan nin paragamit.',
@@ -1227,7 +1237,7 @@ Uya an halaga sa random na pagbuswang na puwede mong magamit: $1',
 'timezoneregion-indian' => 'Indiyang Kadagatan',
 'timezoneregion-pacific' => 'Pasipikong Kadagatan',
 'allowemail' => "Togotan an mga ''e''-surat halî sa ibang mga parágamit",
-'prefs-searchoptions' => 'Pagpipilian sa Paghahanap',
+'prefs-searchoptions' => 'Hanapa',
 'prefs-namespaces' => 'Pangarang mga espasyo',
 'defaultns' => 'Kun laen maghanap sa laog kaining pangarang mga espasyo:',
 'default' => 'pwestong normal',
@@ -1270,6 +1280,7 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 'prefs-signature' => 'Pirma',
 'prefs-dateformat' => 'Pampetsang pormat',
 'prefs-timeoffset' => 'Pan-oras na tapal',
+'prefs-advancedediting' => 'Pinag-abanteng mga Pagpipilian',
 'prefs-advancedrc' => 'Pangenot na mga pagpipilian',
 'prefs-advancedrendering' => 'Abantidong mga pagpipilian',
 'prefs-advancedsearchoptions' => 'Abantidong mga pagpipilian',
@@ -1396,6 +1407,9 @@ An saimong e-surat na adres dae ipagbuyagyag kunsoarin na an ibang paragamit mak
 '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',
+'logentry-rights-rights' => '$1 nagliwat kan pangrupong pagkamiyembro para sa $3 gikan sa $4 pasiring sa $5',
+'logentry-rights-rights-legacy' => '$1 nagliwat kan pangrupong pagkamiyembro para sa $3',
+'logentry-rights-autopromote' => '$1 awtomatikong pinagpalangkaw gikan sa $4 pasiring sa $5',
 'rightsnone' => '(mayô)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1626,6 +1640,7 @@ Kun an problema yaon pa, pakikontak tabi nin sarong [[Special:ListUsers/sysop|ad
 '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-describe' => 'Dae makakaliwat nin meta-datos para sa sagunson na #$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.',
@@ -1642,7 +1657,7 @@ Kun an problema yaon pa, pakikontak tabi nin sarong [[Special:ListUsers/sysop|ad
 '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.',
+'backend-fail-usable' => 'Dae makakapagbasa o makakapagsurat nin sagunson sa "$1" nin hulita ta kulang an mga 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".',
@@ -1774,6 +1789,7 @@ Mapuwede gayod na ika magustong liwatong an deskripsyon na yaon sa [$2 sagunsong
 'uploadnewversion-linktext' => 'Magkarga nin bàgong bersyon kaining file',
 'shared-repo-from' => 'gikan sa $1',
 'shared-repo' => 'sarong pinagheras na repositoryo',
+'upload-disallowed-here' => 'Ika dae makakapagpatong sa pagsurat kaining sagunson.',
 
 # File reversion
 'filerevert' => 'Ibalik an $1',
@@ -1882,6 +1898,7 @@ Ini ngunyan minatukdo-liwat pasiring sa [[$2]].',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|mga byte}}',
 'ncategories' => '$1 {{PLURAL:$1|kategorya|mga kategorya}}',
+'ninterwikis' => '$1 {{PLURAL:$1|an interwiki|mga interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|takod|mga takod}}',
 'nmembers' => '$1 {{PLURAL:$1|myembro|mga myembro}}',
 'nrevisions' => '$1 {{PLURAL:$1|pagpakarhay|mga pagpakarhay}}',
@@ -1910,6 +1927,7 @@ Ini ngunyan minatukdo-liwat pasiring sa [[$2]].',
 'mostlinkedtemplates' => 'An mga pinakanatakodan na templato',
 'mostcategories' => 'Mga artikulong may pinaka dakol na kategorya',
 'mostimages' => 'An pinakapakisugpunan na mga sagunson',
+'mostinterwikis' => 'Mga pahina na igwang mas kadakol na interwiki',
 'mostrevisions' => 'Mga artikulong may pinakadakol na pagpakarháy',
 'prefixindex' => 'Gabos na mga pahina na igwa nin enotang panigmit',
 'prefixindex-namespace' => 'Gabos na mga pahina na igwa nin enotang panigmit ($1 espasyong ngaran)',
@@ -2007,9 +2025,9 @@ Asin man hilnga an [[Special:WantedCategories|kinakaipong mga kategorya]].',
 '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-text' => 'Mga tsambang baraha arog baka kan "*.wikipedia.org" puwedeng paggamiton.
+Minakaipo kisera halangkaw na kamugtakan nin kinasakupan, halimbawa "*.org".<br />
+Suportadong mga panundan: <code>$1</code> (defaults to http:// kun mayo nin panundan na pinagkaag).',
 'linksearch-line' => '$1 an nakatakod sa $2',
 'linksearch-error' => 'Mga pantsambang baraha mapuwedeng magluwas sana sa poon kan hostname.',
 
@@ -2057,9 +2075,11 @@ Puwedeng magkakaigwa nin [[{{MediaWiki:Listgrouprights-helppage}}|kadagdagang im
 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',
+'emailuser-title-target' => 'E-surat kaining {{GENDER:$1|paragamit}}',
+'emailuser-title-notarget' => 'E-surat na paragamit',
 'emailpage' => 'E-suratan an parágamit',
-'emailpagetext' => 'Ika makakagamit kan porma na yaon sa ibaba 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.',
+'emailpagetext' => 'Ika makakagamit kan porma na yaon sa ibaba sa pagpadara nin mensahe na e-surat sa {{GENDER:$1|paragamit}}.
+An e-surat na estada sa saimong pinaglaog sa [[Special:Preferences|saimong paragamit na mga kamuyahan]] ipapahiling bilang iyo an "Gikan sa" estada kan e-surat, kaya an resipiyente makakapagsimbag direkta mismo saimo.',
 'usermailererror' => 'Error manonongod sa korreong binalik:',
 'defemailsubject' => '{{SITENAME}} e-surat gikan sa paragamit "$1"',
 'usermaildisabled' => 'Paragamit na e-surat pinagpundo',
@@ -2090,7 +2110,7 @@ An e-surat na adres na saimong ilalaog sa [[Special:Preferences|saimong paragami
 
 # Watchlist
 'watchlist' => 'Pigbabantayan ko',
-'mywatchlist' => 'Babantáyan ko',
+'mywatchlist' => 'Bantay-listahan',
 '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.',
@@ -2129,19 +2149,23 @@ Kun boot mong halîon an páhina sa pigbabantayan mo sa maabot na panahon, pindo
 
 'enotif_mailer' => '{{SITENAME}} Kartero nin isi',
 'enotif_reset' => 'Markahan an gabos na mga binisitang pahina',
-'enotif_newpagetext' => 'Bâgo ining pahina.',
 'enotif_impersonal_salutation' => '{{SITENAME}} parágamit',
-'changed' => 'pigbâgo',
-'created' => 'piggibo',
-'enotif_subject' => 'An pahinang {{SITENAME}} na $PAGETITLE binago $CHANGEDORCREATED ni $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} pahina $1 pinagpura ni {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}} pahina $1 pinagmukna ni {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}} pahina $1 pinagbalyo ni {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}} pahina $1 pinagbalik-liwat ni {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}} pahina $1 pinagliwat ni {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'An {{SITENAME}} pahina $1 pinagpura sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
+'enotif_body_intro_created' => 'An {{SITENAME}} pahina $1 pinagmukna sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
+'enotif_body_intro_moved' => 'An {{SITENAME}} pahina $1 pinagbalyo sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
+'enotif_body_intro_restored' => 'An {{SITENAME}} pahina $1 pinagbalik-liwat sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
+'enotif_body_intro_changed' => 'An {{SITENAME}} pahina $1 pinagliwat sa $PAGEEDITDATE ni {{gender:$2|$2}}, hilngon $3 para sa pinakahuring rebisyon.',
 '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' => 'Namomotang $WATCHINGUSERNAME,
-
-An {{SITENAME}} pahina $PAGETITLE pinagmukna $CHANGEDORCREATED kan $PAGEEDITDATE ni $PAGEEDITOR, hilngon sa $PAGETITLE_URL para sa presenteng rebisyon.
+'enotif_body' => 'Namumutan na $WATCHINGUSERNAME,
 
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Sumaryo kan paraliwat: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2318,7 +2342,8 @@ binalik an na pagribay o hinalî sa archibo.',
 '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.',
+'cannotundelete' => 'An dae pagpura nagpalya:
+$1',
 'undeletedpage' => "'''binalik na an $1 '''
 
 Ikonsultar an [[Special:Log/delete|historial nin pagparâ]] para mahiling an lista nin mga kaaaging pagparâ asin pagbalik.",
@@ -2349,9 +2374,9 @@ $1",
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Mga kontribusyon kan parágamit',
+'contributions' => '{{GENDER:$1|Paragamit}} na mga kaambagan',
 'contributions-title' => 'Mga kontribusyon kan paragamit para sa $1',
-'mycontris' => 'Mga ambág ko',
+'mycontris' => 'Mga Kaarambagan',
 'contribsub2' => 'Para sa $1 ($2)',
 'nocontribs' => 'Mayong mga pagbabago na nahanap na kapadis sa ining mga criteria.',
 'uctop' => '(alituktok)',
@@ -2392,7 +2417,7 @@ An pinakahuring entrada sa talaan nin pagbara nakahaya sa ibaba bilang reperensi
 'whatlinkshere-hideredirs' => '$1 mga panukdong otro',
 'whatlinkshere-hidetrans' => '$1 kabaling-binalyuhan',
 'whatlinkshere-hidelinks' => '$1 mga kasugpon',
-'whatlinkshere-hideimages' => '$1 mga kasugpon kan imahe',
+'whatlinkshere-hideimages' => '$1 mga kasugpon nin mga sagunson',
 'whatlinkshere-filters' => 'Mga pansarà',
 
 # Block/unblock
@@ -2482,28 +2507,52 @@ Hilngon an [[Special:BlockList|listahan kan binarahan]] tanganing repasohon an m
 'blocklogpage' => 'Usip nin pagbagat',
 'blocklog-showlog' => 'Ining paragamit dati nang pinagbarahan.
 An talaan nin pagbara nakahaya sa ibaba bilang reperensiya:',
+'blocklog-showsuppresslog' => 'Ining paragamit pinagkubkob asin dati nang ipinagtago.
+An talaan nin pagpaunlok ipinagtao sa ibaba para hilingan.',
 '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.',
+'reblock-logentry' => 'pinagliwat an mga panuytoy nin pagkubkob para sa [[$1]] na igwang oras nin pagpaso kan $2 $3',
+'blocklogtext' => 'Ini sarong talaan kan paragamit na nagkukubkob asin dae nagkukubkob na mga aksyon.
+An awtomatikong pinagkubkob na IP na mga estada dae pinaglista.
+Hilngon sa [[Special:BlockList|listahan nin kubkob]] para sa listahan kan presenteng operasyonal na mga pagbabara asin mga pagkukubkob.',
 'unblocklogentry' => 'binawi an pagbagat $1',
 'block-log-flags-anononly' => 'Mga paragamit na anónimo sana',
 'block-log-flags-nocreate' => "pigpopondohán an paggibo nin ''account'",
 'block-log-flags-noautoblock' => 'pigpopondo an enseguidang pagbagat',
 'block-log-flags-noemail' => 'binagát an e-surat',
+'block-log-flags-nousertalk' => 'dae makakaliwat nin sadireng pahina nin olay',
+'block-log-flags-angry-autoblock' => 'pinakusog na awto-kubkob pinaandar',
+'block-log-flags-hiddenname' => 'pangaran nin paragamit itinago',
 'range_block_disabled' => 'Pigpopondo an abilidad kan sysop na maggibo nin bagat na hilera.',
 'ipb_expiry_invalid' => 'Dai pwede ini bilang oras kan pagpasó.',
-'ipb_already_blocked' => 'Dating binagat na si "$1"',
+'ipb_expiry_temp' => 'Itinagong pangaran nin paragamit na nagkukubkob dapat na magin permanente.',
+'ipb_hide_invalid' => 'Dae nakayanan na untukon ining panindog; ini gayod nagkaigwa nin kadakulon na mga pagliliwat.',
+'ipb_already_blocked' => 'An "$1" pinagkubkob na',
+'ipb-needreblock' => 'An $1 pinagkubkob na. Gusto mong liwaton an mga panuytoy?',
+'ipb-otherblocks-header' => 'An ibang {{PLURAL:$1|kubkob|mga kubkob}}',
+'unblock-hideuser' => 'Ika dae makakakubkog kaining paragamit, siring na an saindang paragamit na ngaran itinatago.',
 'ipb_cant_unblock' => 'Error: Dai nahanap an ID nin binagat na $1. Puede ser na dati nang binawi an pagbagat kaini.',
+'ipb_blocked_as_range' => 'Kasalaan: An IP na estada $1 dae direktang pinagkubkob asin dae puwedeng dae makukubkob.
+Ini, baya, pinagkubkob bilang parte kan hidwas $2, na mapuwedeng daemakukubkob.',
 'ip_range_invalid' => 'Dai pwede ining serye nin IP.',
+'ip_range_toolarge' => 'An hidwas kan mga kubkob dakulaon kesa /$1 dae pinagtutugutan.',
+'blockme' => 'Kubkuba ako',
 'proxyblocker' => 'Parabagát na karibay',
+'proxyblocker-disabled' => 'Ining punksyon pinag-untok.',
 'proxyblockreason' => 'Binagat an saimong direccion nin IP ta ini sarong bukas na proxy. Apodon tabi an saimong Internet service provider o tech support asin ipaaram sainda ining seriosong problema nin seguridad.',
 'proxyblocksuccess' => 'Tapos.',
-'sorbsreason' => 'An saimong direccion in IP nakalista na bukas na proxy sa DNSBL na piggagamit kaining sitio.',
-'sorbs_create_account_reason' => "An IP mo nakalista bilang bukás ''proxy'' sa DNSBL na piggagamit kaining ''site''. Dai ka pwedeng maggibo ''account''",
+'sorbsreason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa lang kan DNSBL na ginagamit kan {{SITENAME}}.',
+'sorbs_create_account_reason' => 'An saimong IP na estada pinaglista bilang sarong bukas na proksi sa laog kan DNSBL na ginagamit kan {{SITENAME}}.
+Ika dae makakamukna nin sarong panindog.',
+'cant-block-while-blocked' => 'Ika dae makakakubkob kan ibang mga paragamit mantang ika nakukubkob pa.',
+'cant-see-hidden-user' => 'An paragamit na pinagpubaran mong kubkubon pinagkubkob asin pinagtago na. Mala ta ika mayo nin karapatan na magtago nin paragamit, ika dae makakahiling or makakaliwat kan kinubkob na paragamit.',
+'ipbblocked' => 'Ika da makakakubkob or maghale nin kubkob sa ibang mga paragamit, nin huli ta ika mismo sa sadiri mo pinagkubkob na',
+'ipbnounblockself' => 'Ika dae pinagtutugutan na magkubkob kan sadiri mo',
 
 # Developer tools
 'lockdb' => 'Ikandado an base nin datos',
 'unlockdb' => 'Ibukás an base nin datos',
+'lockdbtext' => 'An pagkakandado kan datos-sarayan mag-uuntok sa abilidad kan gabos na mga paragamit na pagliwat nin mga pahina, pagsasangli kan saindang mga kamuyahan, pagliliwat kan saindang mga bantay-listahan, asin iba pang mga bagay na nagkakaipo nin mga pagsasangli sa laog kan datos-sarayan. Pakikumpirma lang tabi kun iyo ini an boot mong gibohon, asin na saimong bukasan an datos-saray kun an saimong pagpapakarhay tapos na.',
+'unlockdbtext' => 'An pagbubukas kan datos-sarayan magbabalik-liwat kan abilidad nin gabos na mga paragamit na makapagliwat nin mga pahina, pagsasangli kan saindang mga kamuyahan, pagliliwat kan saindang mga bantay-listahan, asin iba pang mga bagay na nagkakaipo nin mga pagsasangli sa laog kan datos-sarayan. Pakikumpirma lang tabi kun iyo ini an boot mong gibohon.',
 'lockconfirm' => 'Iyo, boot kong ikandado an base kan datos.',
 'unlockconfirm' => 'Iyo, boot kong bukasan an base kan datos.',
 'lockbtn' => 'Isará an base nin datos',
@@ -2516,40 +2565,70 @@ IP dai nakalista digdi. Hilingon an [[Special:BlockList|IP lista nin mga binagat
 'unlockdbsuccesstext' => 'Pigbukasan na an base nin datos.',
 'lockfilenotwritable' => "An ''file'' na kandado kan base nin datos dai nasusuratan. Para makandado o mabukasan an bse nin datos, kaipuhan na nasusuratan ini kan web server.",
 'databasenotlocked' => 'Dai nakakandado an base nin datos.',
+'lockedbyandtime' => '(sa paagi ni {{GENDER:$1|$1}} kan $2 sa ika-$3)',
 
 # Move page
+'move-page' => 'Ibalyo an $1',
 'move-page-legend' => 'Ibalyó an páhina',
-'movepagetext' => "Matatàwan nin bàgong pangaran an sarong pahina na pigbabalyo an gabos na uusipón kaini gamit an pormularyo sa babâ.
-An dating titulo magigin redirektang pahina sa bàgong titulo.
-Dai babàgohon an mga takod sa dating titulo kan pahina;
-seguradohon tabì na mayong doble o raot na mga redirekta.
-Ika an responsable sa pagpaseguro na an mga takod nakatokdô kun sain dapat.
-
-Giromdomon tabì na an pahina '''dai''' ibabalyó kun igwa nang pahina sa bàgong titulo, apwera kun mayò ining laog o sarong redirekta asin uusipón nin mga dating pagliwat. An boot sabihon kaini, pwede mong ibalik an dating pangaran kan pahina kun sain ini pigribayan nin pangaran kun napasalà ka, asin dai mo man sosoknongan an presenteng pahina.
-
-'''PATANID!'''
-Pwede na dakulà asin dai seguradong pagbàgo ini kan sarong popular na pahina; seguradohon tabì na aram mo an konsekwensya kaini bago magdagos.",
+'movepagetext' => "Sa paggagamit kan porma na yaon sa ibaba mariribayan nin pangaran an sarong pahina, maibabalyo an gabos kaining historiya pasiring baguhon na pangaran.
+An lumang titulo magigin sarong panlikwat na pahina pasiring sa baguhong titulo.
+Ika makakapagsumpay kan mga panlikwat na magtutukdo awtomatiko pasiring sa orihinal na titulo.
+Kun saimong pinili na dae, seguraduhon na ma-tsek kun [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|parasa an mga panlikwat]].
+Ika an responsable para himoong segurado na an mga kilyaw padagos na minatukdo kun saen sinda dapat na magduman.
+
+Giromdoma na an pahina '''dae''' maibabalyo kun igwa na nin sarong pahina sa baguhon na titulo, laen lang kun ini daeng laman o sarong panlikwat asin mayo nin nakaaging historiya nin pagliwat.
+Ini minapasabot na ika makakapagliwat nin pangaran nin sarong pahina pabalik sa kun saen ini pinagliwatan nin pangaran kun ika nakahimo nin kasalaan, asin ika dae makakasalambaw nin sarong eksistido nang pahina.
+
+'''Patanid!'''
+Ini magigin sarong biglaan asin dae inaasahan na kaliwatan para sa sarong bantugan na pahina; pakiseguro sana na saimong nasabutan an mga konsekuwensiya kaini bago ipagpadagos.",
+'movepagetext-noredirectfixer' => "An paggamit kan porma na yaon sa ibaba magliliwat sa pangaran kan pahina, magbabalyo kan gabos kaining historiya paduman sa baguhon na pangaran.
+An lumang titulo magigin sarong panlikwat na pahina paduman sa baguhon na titulo.
+Magin paseguro na magmansay nin [[Special:DoubleRedirects|doble]] o [[Special:BrokenRedirects|baraak na panlikwat]].
+Ika an responsable para himoon na segurado na an mga kilyaw padagos na magtutukdo kun saen sinda dapat na magduman.
+
+Tandaan na an pahina '''dae''' maibabalyo kun igwa na nin sarong pahina sa baguhon na titulo, lean lang kun ini mayong laog o sarong panlikwat asin mayo nin nakaaging historiya nin pagliwat.
+Ini minapasabot na ika makakapagliwat nin pangaran kan saron gpahina pabalik sa kun saen ini pinagliwat an pangaran sa piggikanan kun ika makahimo nin sarong kasalaan, asin ika dae makakasalambaw kan sarong eksistido nang pahina.
+
+'''Patanid!'''
+Ini mapuwedeng sarong hidalion asin dae inaasahan na kaliwatan para sa sarong bantugan na pahina;
+pakipaseguro baya na ika nakakasabot sa mga konsekuwensiya kaini bago magpapadagos.",
 'movepagetalktext' => "An kapadis na olay na páhina enseguidang ibabalyo kasabay kaini '''kun:'''
 *Igwa nang may laog na olay na páhina na may parehong pangaran, o
 *Halîon mo an marka sa kahon sa babâ.
 
 Sa mga kasong iyan, kaipuhan mong ibalyo o isalak an páhina nin mano-mano kun boot mo.",
 'movearticle' => 'Ibalyó an pahina:',
+'moveuserpage-warning' => "'''Patanid:''' Ika magpopoon na magbalyo in sarong pahina nin paragamit. Pakitandaan tabi na an pahina sana na ipagbabalyo asin an paragamit '''dae''' maipagliliwat an pangaran.",
 'movenologin' => 'Mayô sa laog',
 'movenologintext' => 'Kaipuhan na rehistradong parágamit ka asin si [[Special:UserLogin|nakalaog]] tangarig makabalyó ka nin páhina.',
 'movenotallowed' => 'Mayô kang permiso na ibalyó an mga pahina sa wiki na ini.',
+'movenotallowedfile' => 'Ika mayo nin permiso na magbabalyo nin mga sagunson.',
+'cant-move-user-page' => 'Ika mayo nin permiso na magbabalyo nin mga pahina nin paragamit (laen pa sa mga sub-pahina).',
+'cant-move-to-user-page' => 'Ika mayo nin permiso na magbabalyo nin pahina paduman sa sa sarong pahina nin paragamit (laen pa sa sub-pahina nin paragamit).',
 'newtitle' => 'Sa bàgong titulong:',
 'move-watch' => 'Bantayán ining pahina',
 'movepagebtn' => 'Ibalyó an pahina',
 'pagemovedsub' => 'Naibalyó na',
 'movepage-moved' => '\'\'\'Naihubò na an "$1" sa "$2"\'\'\'',
+'movepage-moved-redirect' => 'An panlikwat pinagmukna na.',
+'movepage-moved-noredirect' => 'An pagmumukna kan sarong panlikwat pinagtago na.',
 'articleexists' => 'Igwa nang pahina sa parehong pangaran, o dai pwede an pangaran na pigpilì mo.
 Magpilì tabì nin ibang pangaran.',
+'cantmove-titleprotected' => 'Ika dae makakapagbalyo nin pahina sa lokasyon na ini, nin huli ta an baguhon na titulo protektado na gikan sa pagmumukna',
 'talkexists' => "'''Ibinalyo na an mismong pahina, alagad dai naibalyo an pahina nin orolay ta igwa na kaini sa bàgong titulo. Pagsaroon tabì ining duwa nin mano-mano.'''",
 'movedto' => 'piglipat sa',
 'movetalk' => 'Ibalyo an pahinang orolayan na nakaasociar',
+'move-subpages' => 'Ibalyo an mga sub-pahina (sagkod sa $1)',
+'move-talk-subpages' => 'Ibalyo an mga sub-pahina kan pahina nin olay (sagkod sa $1)',
+'movepage-page-exists' => 'An pahina sa $1 eksistido na asin bako tabi awtomatikong masasalambawan.',
+'movepage-page-moved' => 'An pahina $1 pinagbalyo na paduman sa $2.',
+'movepage-page-unmoved' => 'An pahina $1 dae maipagbabalyo paduman sa $2.',
+'movepage-max-pages' => 'An pinakahalangkawon na $1 {{PLURAL:S1|pahina|mga pahina}} pinagbalyo na asin mayo tabi na awtomatikong maipagbabalyo.',
 'movelogpage' => 'Ibalyó an usip',
 'movelogpagetext' => 'Nasa ibaba an lista kan pahinang pigbalyó.',
+'movesubpage' => '{{PLURAL:$1|Sub-pahina|Mga Sub-pahina}}',
+'movesubpagetext' => 'Ining pahina igwa nin $1 {{PLURAL:$1|sub-pahina|mga sub-pahina}} na ipinapahiling sa ibaba.',
+'movenosubpage' => 'Ining pahina mayo nin mga sub-pahina.',
 'movereason' => 'Rason:',
 'revertmove' => 'ibalík',
 'delete_and_move' => 'Parâon asin ibalyó',
@@ -2557,8 +2636,28 @@ Magpilì tabì nin ibang pangaran.',
 
 Igwa nang páhina na "[[:$1]]". Gusto mong parâon ini tangarig maibalyó?',
 'delete_and_move_confirm' => 'Iyo, parâon an pahina',
-'delete_and_move_reason' => 'Pinarâ tangarig maibalyó',
+'delete_and_move_reason' => 'Pinagpura sa paghimo nin dalan para maibalyo gikan sa "[[$1]]"',
 'selfmove' => 'Pareho an páhinang ginikanan asin destinasyon; dai pwedeng ibalyó an sarong páhina sa sadiri.',
+'immobile-source-namespace' => 'Dae makakapagbalyo nin mga pahina sa espasyong-pangaran na "$1"',
+'immobile-target-namespace' => 'Dae makakapagbalyo nin mga pahina pasiring sa espasyong-pangaran na "$1"',
+'immobile-target-namespace-iw' => 'An Interwiki na kilyaw bakong balido puntirya para sa pagbalyo nin pahina.',
+'immobile-source-page' => 'Ining pahina bakong mabalyuhon.',
+'immobile-target-page' => 'Dae makakabalyo paduman sa titulong destinasyon.',
+'bad-target-model' => 'An pinagmamawot na destinasyon naggagamit kan nalalaeng modelo nin laog. Dae maipagkonberte gikan sa $1 pasiring sa $.',
+'imagenocrossnamespace' => 'Dae makakapagbalyo nin sagunson paduman sa bakong sagunson na espasyong pangaran.',
+'nonfile-cannot-move-to-file' => 'Dae makakapagbalyo nin bakong-sagunson pasiring sa sagunson kan espasyong-pangaran',
+'imagetypemismatch' => 'An baguhon na ekstensyon nin sagunson dae mai-aampad sa tipong ini',
+'imageinvalidfilename' => 'An puntiryang nin pangaran-sagunson imbalido',
+'fix-double-redirects' => 'An panumpay sa arinman na mga panlikwat na nagtutukdo paduman sa orihinal na titulo',
+'move-leave-redirect' => 'Walaton an sarong panlikwat sa likod',
+'protectedpagemovewarning' => "'''Patanid:''' Ining pahina protektado tangani na an mga paragamit sana na igwang administrador na mga pribilihiyo an makakapagbalyo kaini.
+An pinakahuring entrada sa talaan pinagtao sa ibaba para sa reperensiya:",
+'semiprotectedpagemovewarning' => "'''Giromdomon:''' Ining pahina protektado tanganing an mga rehistradong paragamit sana an makakabalyo kaini. 
+An pinakahuring entrada sa talaan pinagtao sa ibaba para sa reperensiya:",
+'move-over-sharedrepo' => '== Yaon nang Sagunson ==
+[[:$1]] yaon na sa pinagheras na repositoryo. An pagbabalyo nin sagunson paduman kaining titulo masalambaw sa pinagheras na sagunson.',
+'file-exists-sharedrepo' => 'An pangaran nin saguson na pinili ginagamit na sa pinagheras na repositoryo.
+Pakipili kan ibang pangaran.',
 
 # Export
 'export' => 'Iluwas an mga pahina',
@@ -2567,22 +2666,36 @@ Igwa nang páhina na "[[:$1]]". Gusto mong parâon ini tangarig maibalyó?',
 Para makapadara nin mga páhina, ilaag an mga titulo sa kahon para sa teksto sa babâ, sarong titulo kada linya, dangan pilîon kun boot mo presenteng bersyón asin dating bersyón, na may mga linya kan historya, o an presenteng bersyón sana na may impormasyon manonongod sa huring hirá.
 
 Sa kaso kan huri, pwede ka man na maggamit nin takod, arog kan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para sa páhinang "[[{{MediaWiki:Mainpage}}]]".',
+'exportall' => 'Isalimbago an gabos na mga pahina',
 'exportcuronly' => 'Mga presenteng pagpakarhay sana an ibali, bakong an enterong historya',
 'exportnohistory' => "----
 '''Paisi:''' Dai pigpatogotan an pagpadara kan enterong historya kan mga páhina sa paagi kaining forma huli sa mga rasón dapit sa pagsagibo kaini.",
+'exportlistauthors' => 'Ibali an sarong bilog na listahan kan mga paraambag para sa lambang pahina',
 'export-submit' => 'Ipaluwás',
 'export-addcattext' => 'Magdugang nin mga pahina sa kategoryang ini:',
 'export-addcat' => 'Magdugang',
+'export-addnstext' => 'Idugang an mga pahina gikan sa espasyong-pangaran:',
+'export-addns' => 'Magdagdag',
 'export-download' => "Hapotón ku gustong itagama bilang sarong ''file''",
+'export-templates' => 'Ibali an mga templato',
+'export-pagelinks' => 'Inbai an pinagkilyaw na mga pahina pasiring sa sarong kairaroman na:',
 
 # Namespace 8 related
 'allmessages' => 'Mga mensahe sa sistema',
 'allmessagesname' => 'Pangaran',
 'allmessagesdefault' => 'Tekstong normal',
 'allmessagescurrent' => 'Presenteng teksto',
-'allmessagestext' => 'Ini an lista kan mga mensahe sa sistema sa ngaran-espacio na MediaWiki.
-Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
+'allmessagestext' => 'Ini sarong listahan nin pansistemang mga mensahe na mananagboan sa espasyong-pangaran kan MediaWiki.
+Pakibisita an [//www.mediawiki.org/wiki/Localisation Mediawiki Lokalisasyon] asin [//translatewiki.net translatewiki.net] kun boot mong mag-ambag sa henerikong lokalisasyon kan MediaWiki.',
 'allmessagesnotsupportedDB' => "Dai pwedeng gamiton an '''{{ns:special}}:Allmessages''' ta sarado an '''\$wgUseDatabaseMessages'''.",
+'allmessages-filter-legend' => 'An Pansara',
+'allmessages-filter' => 'Pansara sa paagi kan estado nin kustomisasyon:',
+'allmessages-filter-unmodified' => 'Bakong modipikado',
+'allmessages-filter-all' => 'Gabos',
+'allmessages-filter-modified' => 'Modipikado',
+'allmessages-prefix' => 'Pansara sa paagi kan enot-panigmit:',
+'allmessages-language' => 'Lengguwahe:',
+'allmessages-filter-submit' => 'Dumuman',
 
 # Thumbnails
 'thumbnail-more' => 'Padakuláon',
@@ -2590,31 +2703,60 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'thumbnail_error' => 'Error sa paggigibo kan retratito: $1',
 'djvu_page_error' => 'luwas sa serye an páhina kan DjVu',
 'djvu_no_xml' => 'Dai makua an XML para sa DjVu file',
+'thumbnail-temp-create' => 'Dae nakamukna nin temporaryong sagunson kan retrato',
+'thumbnail-dest-create' => 'Dae nakatagama kan retrato sa destinasyon',
 'thumbnail_invalid_params' => 'Dai pwede an mga parámetro kaining retratito',
 'thumbnail_dest_directory' => 'Dai makagibo kan destinasyon kan direktoryo',
+'thumbnail_image-type' => 'An tipo kan imahe bakong suportado',
+'thumbnail_gd-library' => 'Bakong kumpleto an kasalansanan kan kalibrohang GD: Nawawara an trabaho kan $1',
+'thumbnail_image-missing' => 'An sagunson garo baga nawawara: $1',
 
 # Special:Import
 'import' => 'Ilaog an mga páhina',
 'importinterwiki' => 'Ipadara an Transwiki',
+'import-interwiki-text' => 'Pumili nin sarong wiki asin titulo kan pahina na importaron.
+Mga petsa nin kaliwatan asin pangaran kan mga paraliwat pagpepreserbaron.
+Gabos na aksyon nin importa sa transwiki nakatala sa [[Special:Log/import|talaan nin importa]].',
+'import-interwiki-source' => 'Ginikanang wiki/pahina:',
 'import-interwiki-history' => 'Kopyahon an gabos na mga bersyón para sa páhinang ini',
+'import-interwiki-templates' => 'Ibali an gabos na mga panguyog',
 'import-interwiki-submit' => 'Ipalaog',
-'import-interwiki-namespace' => 'Ibalyó an mga pahina sa ngaran-espacio:',
+'import-interwiki-namespace' => 'Destinasyon kan espasyong-pangaran:',
+'import-interwiki-rootpage' => 'Destinasyon kan ugat pahina (opsyonal):',
+'import-upload-filename' => 'Sagunsong Pangaran:',
 'import-comment' => 'Komento:',
-'importtext' => "Ipadara tabì an ''file'' hali sa ginikanan na wiki gamit an Special:Export utility, itagama ini sa saimong disk dangan ikarga iyan digdi.",
+'importtext' => 'Paki-eksporta an sagunson gikan sa ginikanang wiki na gamit an [[Special:Export|gamiton pan-eksporta]].
+Itagama ini sa saimong kompyuter asin ikarga ini digde.',
 'importstart' => 'Piglalaog an mga páhina...',
 'import-revision-count' => '$1 {{PLURAL:$1|pagpakarhay|mga pagpakarhay}}',
 'importnopages' => 'Mayong mga páhinang ipapadara.',
+'imported-log-entries' => 'Importado $1 {{PLURAL:$1|talaan na entrada|talaan na mga entrada}}.',
 'importfailed' => 'Bakong matriumpo an pagpadara: $1',
 'importunknownsource' => 'Dai aram an tipo kan gigikanan kan ipapadara',
 'importcantopen' => "Dai mabukasan an pigpadarang ''file''",
 'importbadinterwiki' => 'Salâ an takod na interwiki',
 'importnotext' => 'Mayong laog o mayong teksto',
-'importsuccess' => 'Matriumpo an pagpadara!',
+'importsuccess' => 'Tapos na an importa!',
+'importhistoryconflict' => 'Igwang nagsalimbayan sa historiya kan rebisyon (puwedeng importado na ining pahina kaidto)',
+'importnosources' => 'Mayong transwiki na mga ginikanan sa importa an pinagpasabot asin direktang historiya nin mga pagkakarga pinag-untok.',
 'importnofile' => "Mayong ipinadarang ''file'' an naikarga.",
+'importuploaderrorsize' => 'Pagkarga kan ini-importang sagunson nagpalya.
+An sagunson dakulaon kesa sa itinutugot na kadakulaan nin pagkarga.',
+'importuploaderrorpartial' => 'Pagkarga kan ini-importang sagunson nagpalya.
+An sagunson igwang parte sana an naikarga.',
+'importuploaderrortemp' => 'Pagkarga kan ini-importang sagunson nagpalya.
+An temporaryong polder nawawara.',
+'import-parse-failure' => 'XML importang panabot puminalya',
+'import-noarticle' => 'Mayong pahina na maiimporta!',
+'import-nonewrevisions' => 'An gabos na mga rebisyon dati nang importado.',
+'xml-error-string' => '$1 sa linya $2, kol $3 (bayta $4): $5',
+'import-upload' => 'Ikarga an XML na datos',
+'import-token-mismatch' => 'Nawara an datos kan sesyon.
+Paki-otro giraray.',
 '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-interwiki' => 'An pahina "$1" bakong importado nin huli ta an pangaran kaini reserbado na para sa panluwas na kasugpunan (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>',
@@ -2631,7 +2773,6 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 
 # 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".',
@@ -2744,14 +2885,43 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
 
 # Info page
 'pageinfo-title' => 'Impormasyon para sa "$1"',
+'pageinfo-not-current' => 'Sori, imposible baya na maitao ining impormasyon para sa lumaon nang mga rebisyon.',
 'pageinfo-header-basic' => 'Panuntungang impormasyon',
 'pageinfo-header-edits' => 'Pagliwat na historiya',
 'pageinfo-header-restrictions' => 'Pampahinang proteksyon',
 'pageinfo-header-properties' => 'Pampahinang propriyedades',
+'pageinfo-display-title' => 'Titulo nin patanaw',
+'pageinfo-default-sort' => 'Panugmad na susi nin salansan',
+'pageinfo-length' => 'Kalabaan kan pahina (yaon sa mga bayta)',
+'pageinfo-article-id' => 'ID kan pahina',
+'pageinfo-language' => 'Lengguwahe kan laog sa pahina',
+'pageinfo-robot-policy' => 'Estado kan makinang parahanap',
+'pageinfo-robot-index' => 'Maihuhukdo',
+'pageinfo-robot-noindex' => 'Dae maihuhukdo',
 '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',
+'pageinfo-watchers' => 'Numero kan parabantay nin pahina',
+'pageinfo-redirects-name' => 'Maipalikwat pasiring sa pahina ini',
+'pageinfo-subpages-name' => 'Mga sub-pahina kaining pahina',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|panlikwat|mga panlikwat}}; $3 {{PLURAL:$3|bakong panlikwat|bakong mga panlikwat}})',
+'pageinfo-firstuser' => 'Paramukna nin pahina',
+'pageinfo-firsttime' => 'Petsa kan pagmukna nin pahina',
+'pageinfo-lastuser' => 'Pinakahuring paraliwat',
+'pageinfo-lasttime' => 'Petsa kan pinakahuring pagliwat',
+'pageinfo-edits' => 'Kabilogan na bilang kan mga pagliwat',
+'pageinfo-authors' => 'Kabilogan na bilang kan pinagpalaen na mga awtor',
+'pageinfo-recent-edits' => 'Bilang kan dae pa sana nahahaloy na mga pagliliwat (sa laog kan nakaaging $1)',
+'pageinfo-recent-authors' => 'Bilang kan dae pa sana nahahaloy na pinagpalaen na mga awtor',
+'pageinfo-magic-words' => 'Mahiko {{PLURAL:$1|taramon|mga taramon}} ($1)',
+'pageinfo-hidden-categories' => 'Itinago na {{PLURAL:$1|kategorya|mga kategorya}} ($1)',
+'pageinfo-templates' => 'Kabaling pinagbalyo na {{PLURAL:$1|panguyog|mga panguyog}} ($1)',
+'pageinfo-toolboxlink' => 'Pahina kan impormasyon',
+'pageinfo-redirectsto' => 'Mga panlikwat paduman sa',
+'pageinfo-redirectsto-info' => 'impo',
+'pageinfo-contentpage' => 'Pinagbilang siring sa sarong pahina nin laog',
+'pageinfo-contentpage-yes' => 'Iyo',
+'pageinfo-protect-cascading' => 'An mga proteksyon pasurunod gikan digde',
+'pageinfo-protect-cascading-yes' => 'Iyo',
+'pageinfo-protect-cascading-from' => 'An mga proteksyon pasurunod gikan sa',
 
 # Skin names
 'skinname-standard' => 'Klasiko',
@@ -2768,6 +2938,8 @@ Ini hurot na pinagkausa nin sarong sugpunan pasiring sa sarong pinagbawal na pan
 'markedaspatrollederror' => 'Dai mamamarkahan bilang pigpapatrolya',
 'markedaspatrollederrortext' => 'Kaipúhan mong magpilì nin pagpakarháy na mamarkahan bilang pigpapatrolya.',
 'markedaspatrollederror-noautopatrol' => 'Daí ka pigtotogótan na markahan an sadíri mong pababàgo bilang pigpapatrolya.',
+'markedaspatrollednotify' => 'Ining kaliwatan sa $1 pinagmarkahang patrolyado na.',
+'markedaspatrollederrornotify' => 'Pagmamarka bilang patrolyado na nagpalya.',
 
 # Patrol log
 'patrol-log-page' => 'Laóg kan Pigpapatrolya',
@@ -2800,6 +2972,7 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
 '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',
+'svg-long-desc-animated' => 'Animatadong SVG na sagunson, nangangaranang $1 x $2 piksel, kadakulaan nin sagunson: $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.',
@@ -2809,6 +2982,8 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
 '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}}',
+'file-no-thumb-animation' => "'''Giromdomon: Nin huli sa teknikal na mga limitasyon, an mga retrato kaining sagunson bakong animatado.'''",
+'file-no-thumb-animation-gif' => "'''Giromdomon: Nin huli sa teknikal na mga limitasyon, an mga retrato na GIF na mga imahe na igwang halangkawon na resolusyon na siring kaini dae animatado.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeria nin mga bàgong file',
@@ -2828,6 +3003,7 @@ Sa pagpapa-andar kaini, an saimong sistema mapupuwedeng makompromiso.",
 'hours' => '{{PLURAL:$1|$1 oras|$1 oras}}',
 'days' => '{{PLURAL:$1|$1 aldaw|$1 mga aldaw}}',
 'ago' => '$1 nakaagi',
+'just-now' => 'ngunyan sana',
 
 # Bad image list
 'bad_image_list' => 'An pormat iyo ining minasunod:
@@ -2884,16 +3060,77 @@ An mga iba pagtatagoon sa paagi nin pirmehan.
 'exif-imagedescription' => 'Titulo kan retrato',
 'exif-make' => 'Tagagibo nin kamera',
 'exif-model' => 'Modelo nin kamera',
+'exif-software' => 'Panuklob na ginamit',
 'exif-artist' => 'Kagsúrat',
+'exif-copyright' => 'Kagkapot nin karapatan sa panurat',
+'exif-exifversion' => 'Exif bersyon',
+'exif-flashpixversion' => 'Suportadong Flashpix na bersyon',
+'exif-colorspace' => 'Espasyong kulay',
+'exif-componentsconfiguration' => 'Panabot kan lambang komponente',
+'exif-compressedbitsperpixel' => 'Moda nin kompresyon sa imahe',
+'exif-pixelydimension' => 'Lakbang kan imahe',
+'exif-pixelxdimension' => 'Langkaw kan imahe',
 'exif-usercomment' => 'Mga komento kan paragamít',
-'exif-aperturevalue' => 'Pagkabukás',
-'exif-brightnessvalue' => 'Kaliwanagan',
+'exif-relatedsoundfile' => 'Kaakibay kan sagunson na pandangog',
+'exif-datetimeoriginal' => 'Petsa asin oras kan henerasyon nin datos',
+'exif-datetimedigitized' => 'Petsa asin oras kan paghimong dihital',
+'exif-subsectime' => 'PetsaOras na mga subsegundo',
+'exif-subsectimeoriginal' => 'PetsaOrasOrihinal na mga subsegundo',
+'exif-subsectimedigitized' => 'PetaOrasDihitalisadong mga subsegundo',
+'exif-exposuretime' => 'Kahuyangang oras',
+'exif-exposuretime-format' => '$1 seg ($2)',
+'exif-fnumber' => 'F numero',
+'exif-exposureprogram' => 'Kahuyangang Programa',
+'exif-spectralsensitivity' => 'Espektral na sensitibidad',
+'exif-isospeedratings' => 'ISO grado nin rikas',
+'exif-shutterspeedvalue' => 'APEX rikas kan kimlat',
+'exif-aperturevalue' => 'APEX na Kamuklatan',
+'exif-brightnessvalue' => 'APEX na kaliwanagan',
+'exif-exposurebiasvalue' => 'APEX na kahuyangan nin kalaenan',
+'exif-maxaperturevalue' => 'Pinakahalangkaw na kamuklatang pandaga',
+'exif-subjectdistance' => 'Subhetong distansiya',
+'exif-meteringmode' => 'Moda nin pagmemetro',
 'exif-lightsource' => 'Ginikánan nin liwánag',
 'exif-flash' => 'Kikilát',
+'exif-focallength' => 'Laba sa turuhok kan lente',
+'exif-subjectarea' => 'Lugar kan subheto',
 'exif-flashenergy' => 'Kakusogan nin kikilát',
+'exif-focalplanexresolution' => 'Sayon nin turuhok kan X na resolusyon',
+'exif-focalplaneyresolution' => 'Sayon nin turuhok kan Y na resolusyon',
+'exif-focalplaneresolutionunit' => 'Sayon nin turuhok sa resolusyon kan yunit',
+'exif-subjectlocation' => 'Lokasyon kan subheto',
+'exif-exposureindex' => 'Hukdo nin kahuyangan',
+'exif-sensingmethod' => 'Metodo nin paghihimate',
 'exif-filesource' => 'Ginikánan nin dokumento',
+'exif-scenetype' => 'Tipo nin eksena',
+'exif-customrendered' => 'Kapakarahayang proseso kan imahe',
+'exif-exposuremode' => 'Moda nin Kahuyangan',
+'exif-whitebalance' => 'Kapantayan nin kaputian',
+'exif-digitalzoomratio' => 'Dihital na rata nin karanihan',
+'exif-focallengthin35mmfilm' => 'Sayon nin kalabaan sa 35 mm na pelikula',
+'exif-scenecapturetype' => 'Tipo kan pagdakop nin eksena',
+'exif-gaincontrol' => 'Kontrol na pan-eksena',
 'exif-contrast' => 'Kontraste',
+'exif-saturation' => 'Kababadan',
+'exif-sharpness' => 'Kahaisan',
+'exif-devicesettingdescription' => 'Mga deskripsyon kan panuytoy nin aparato',
+'exif-subjectdistancerange' => 'Hikwas kan distansiya nin subheto',
 'exif-imageuniqueid' => 'Unikong ID kan ladawan',
+'exif-gpsversionid' => 'Bersyon kan GPS tag',
+'exif-gpslatituderef' => 'Hiraga o Timog na kahalaghagan',
+'exif-gpslatitude' => 'Halaghag',
+'exif-gpslongituderef' => 'Sirangan o Sulnupan na kalabaghan',
+'exif-gpslongitude' => 'Kalabaghan',
+'exif-gpsaltituderef' => 'Reperensiya nin kalangkawan',
+'exif-gpsaltitude' => 'Kahalaghagan',
+'exif-gpstimestamp' => 'GPS na oras (atomikong orasan)',
+'exif-gpssatellites' => 'Mga satelayt na pinaggagamit para sa kasukolan',
+'exif-gpsstatus' => 'Estado kan resibidor',
+'exif-gpsmeasuremode' => 'Moda nin kasukolan',
+'exif-gpsdop' => 'Katusayang kasukolan',
+'exif-gpsspeedref' => 'Yunit nin karikasan',
+'exif-gpsspeed' => 'Karikasan kan GPS na resibidor',
+'exif-gpstrackref' => 'Reperensiya para sa direksyon nin kahiroan',
 'exif-gpstrack' => 'Direksyon kan paghirô',
 'exif-gpsimgdirectionref' => 'Reperensiya para sa direksyon kan imahe',
 'exif-gpsimgdirection' => 'Direksyon kan ladáwan',
@@ -3173,6 +3410,7 @@ Sublokas kan siyudad na ipinahiling',
 'exif-iimcategory-hth' => 'Salud',
 'exif-iimcategory-hum' => 'Pantawong interes',
 'exif-iimcategory-lab' => 'Trabaho',
+'exif-iimcategory-lif' => 'Estilo nin buhay asin libangan',
 'exif-iimcategory-pol' => 'Mga Pulitika',
 'exif-iimcategory-rel' => 'Relihiyon asin paniniwala',
 'exif-iimcategory-sci' => 'Siyensiya asin teknolohiya',
@@ -3265,6 +3503,7 @@ Ining pankumpirmang koda mapalso sa $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Pigpopogolan an transcluding na Interwiki]',
 'scarytranscludefailed' => '[Templatong panakdo nagpalya para sa $1]',
+'scarytranscludefailed-httpstatus' => '[An paghigkos kan panguyog nagpalya para sa $1: HTTP $2]',
 'scarytranscludetoolong' => '[An kilyawan grabe kahalaba]',
 
 # Delete conflict
@@ -3348,7 +3587,7 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
 'watchlisttools-raw' => 'Hirahón an bàgong pigbabantayan',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|olay]])',
+'signature' => '[[{{ns:paragamit}}:$1|$2]] ([[{{ns:olay_nin_paragamit}}:$1|olay]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'Bakong bistadong ekstensyon nin pagmarka "$1"',
@@ -3373,7 +3612,8 @@ Pwede mo man [[Special:EditWatchlist|gamiton an standard editor]].',
 '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-poweredby-others' => 'mga iba pa',
+'version-credits-summary' => 'Kami gustong rekonosiron an minasunod na mga persona para sa saindang ambag sa [[Espesyal:Bersyon|Mediawiki]].',
 '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.
@@ -3481,5 +3721,108 @@ Ining sityo igwang naeksperiyensiyahan na mga kakundian sa teknikal.',
 'htmlform-required' => 'Ining halaga pinaghahagad',
 'htmlform-submit' => 'Sumitiron',
 'htmlform-reset' => 'Dae idagos an mga kaliwatan',
-
+'htmlform-selectorother-other' => 'An iba',
+
+# SQLite database support
+'sqlite-has-fts' => '$1 na igwang suporta sa kabilogang-teksto nin paghahanap',
+'sqlite-no-fts' => '$1 na mayong suporta sa kabilogang-teksto nin paghahanap',
+
+# New logging system
+'logentry-delete-delete' => '$1 pinagpurang pahina $3',
+'logentry-delete-restore' => '$1 pinagbalik na pahina $3',
+'logentry-delete-event' => '$1 pinagliwat an bisibilidad kan {{PLURAL:$5|sarong talaan nin pangyayari|%5 talaan nin mga pangyayari}} kan $3: $4',
+'logentry-delete-revision' => '$1 pinagliwat an bisibilidad kan {{PLURAL:$5|sarong rebisyon|$5 na mga rebisyon}} na yaon sa pahina $3: $4',
+'logentry-delete-event-legacy' => '$1 pinagliwat an bisibilidad kan talaan nin mga pangyayari sa $3',
+'logentry-delete-revision-legacy' => '$1 pinagliwat an bisibilidad kan mga rebisyon sa pahina $3',
+'logentry-suppress-delete' => '$1 pinaglubog na pahina $3',
+'logentry-suppress-event' => '$1 pasikretong pinagliwat an bisibilidad kan {{PLURAL:$5|talaan nin pangyayari|$5 mga talaan nin pangyayari}} sa $3: $4',
+'logentry-suppress-revision' => '$1 pasikretong pinagliwat an bisibilidad kan {{PLURAL:$5|rebisyon|$5 mga rebisyon}} sa pahina $3: $4',
+'logentry-suppress-event-legacy' => '$1 pasikretong pinagliwat an bisibilidad kan talaan nin mga pangyayari sa $3',
+'logentry-suppress-revision-legacy' => '$1 pasikretong pinagliwat an bisibilidad kan mga rebisyon sa pahina $3',
+'revdelete-content-hid' => 'an laog pinagtago',
+'revdelete-summary-hid' => 'Sumaryo nin pagliwat itinago',
+'revdelete-uname-hid' => 'pangaran nin paragamit itinago',
+'revdelete-content-unhid' => 'an laog pinaghaya',
+'revdelete-summary-unhid' => 'Sumaryo nin pagliwat ipinaghaya',
+'revdelete-uname-unhid' => 'pangaran nin paragamit ipinaghaya',
+'revdelete-restricted' => 'Pinag-aplikar an mga restriksyon sa mga administrador',
+'revdelete-unrestricted' => 'Pinaghale an mga restriksyon para sa mga administrador',
+'logentry-move-move' => '$1 pinagbalyo an pahina $3 paduman sa $4',
+'logentry-move-move-noredirect' => 'S1 pinagbalyo an pahina $3 paduman sa $4 na mayong iwinalat na panlikwat',
+'logentry-move-move_redir' => '$1 pinagbalyo an pahina $3 paduman sa $4 sa paagi kan panlikwat',
+'logentry-move-move_redir-noredirect' => '$1 pinagbalyo an pahina $3 paduman sa $4 sa paagi kan panlikwat na mayong iwinawalat na sarong panlikwat',
+'logentry-patrol-patrol' => '$1 pinagmarkahan an rebisyon $4 kan pahina $3 na patrolyado',
+'logentry-patrol-patrol-auto' => '$1 awtomatikong pinagmarkahan an rebisyonn $4 kan pahina $3 na patrolyado',
+'logentry-newusers-newusers' => 'An paragamit na panindog $1 pinagmukna na',
+'logentry-newusers-create' => 'An paragamit na panindog $1 pinagmukna na',
+'logentry-newusers-create2' => 'An paragamit na panindog $3 pinagmukna na ni $1',
+'logentry-newusers-autocreate' => 'An paragamit na panindog $1 awtomatikong pinagmukna na',
+'newuserlog-byemail' => 'an pasa-taramon ipinadara na sa paagi kan e-surat',
+
+# Feedback
+'feedback-bugornote' => 'Kun ika andam na iladawan an sarong teknikal na problema na igwang detalye tabi [$1 ipaaram an kuto].
+Kun bako man, ika makakagamit nin sayon na porma sa ibaba. An saimong komento idudugang sa pahina "[$3 $2]", kaiba an saimong paragamit na ngaran.',
+'feedback-subject' => 'Subheto',
+'feedback-message' => 'An Mensahe:',
+'feedback-cancel' => 'Kanselaron',
+'feedback-submit' => 'Isumite an balik-simbag',
+'feedback-adding' => 'Idugang an balik-simbag sa pahina...',
+'feedback-error1' => 'Kasalaan: Bakong bistadong resulta gikan sa API',
+'feedback-error2' => 'Kasalaan: An pagliwat nagpalya',
+'feedback-error3' => 'Kasalaan: Mayong kasimbagan gikan sa API',
+'feedback-thanks' => 'Salamat! An saimong balik-simbag pinagposte sa pahina "[$2 $1]".',
+'feedback-close' => 'Nagibo na',
+'feedback-bugcheck' => 'Marhay! I-tsek sana baya na ini bakong saro sa mga [$1 bistadong kuto].',
+'feedback-bugnew' => 'Pig-tsek ko. Pakireport kan sarong baguhong kuto',
+
+# Search suggestions
+'searchsuggest-search' => 'Hanapa baya',
+'searchsuggest-containing' => 'may laog na...',
+
+# API errors
+'api-error-badaccess-groups' => 'Ika daeng permiso na magkarga nin mga sagunson sa wiking ini.',
+'api-error-badtoken' => 'Panlaog na kasalaan: Raot na pangilip',
+'api-error-copyuploaddisabled' => 'An pagkakarga sa paagi kan URL pinag-untok sa serbidor na ini.',
+'api-error-duplicate' => 'Igwa {{PLURAL:$1|nin [$2 ibang sagunson]|mga [$2 iba pang mga sagunson]}} na yaon sa sityo na igwa nin kaparehong laog.',
+'api-error-duplicate-archive' => 'Igwa {{PLURAL:$1|kaidto nin {$2 ibang sagunson]|kaidto nin {$2 ibang mga sagunson]}} na yaon sa sityo na igwa nin kaparehong laog, alagad {{PLURAL:$1|ini kaidto|sinda kaidto}} pinagpura na.',
+'api-error-duplicate-archive-popup-title' => 'Kambal na {{PLURAL:$1|sagunson na|mga sagunson na}} pinagpura na.',
+'api-error-duplicate-popup-title' => 'Kambal na {{PLURAL:$1|sagunson|mga sagunson}}.',
+'api-error-empty-file' => 'An sagunson na saimong pinagsumite daeng laog.',
+'api-error-emptypage' => 'Nagmumukna nin bago, mayong laog na mga pahina dae pinagtutugutan.',
+'api-error-fetchfileerror' => 'Panlaog na kasalaan: May bagay na naging sala habang hinahakot an sagunson.',
+'api-error-fileexists-forbidden' => 'Sarong sagunson na igwang ngaran na "$1" an yaon na, asin dae puwedeng masalambawan.',
+'api-error-fileexists-shared-forbidden' => 'Sarong sagunson na igwang ngaran na "$1" an yaon na sa pinagheras na repositoryo nin sagunson, asin dae puwedeng masalambawan.',
+'api-error-file-too-large' => 'An sagunson na saimong pinagsumite dakulaon na maray.',
+'api-error-filename-tooshort' => 'An pangaran nin sagunson halipoton na maray.',
+'api-error-filetype-banned' => 'An tipong ini nin sagunson pinagpangalad na.',
+'api-error-filetype-banned-type' => '$1 {{PLURAL:$4|dae itinutugot na tipo nin sagunson|dae itinutugot na mga tipo nin mga sagunson}}. An pinagtutugutan na {{PLURAL:$3|sagunson iyo an tipo na|mga sagunson iyo an mga tipo na}} $2.',
+'api-error-filetype-missing' => 'An pangaran nin sagunson nawawaraan nin ekstensyon.',
+'api-error-hookaborted' => 'An modipikasyon na saimong pinagprubaran na hihimoon ipinag-untok nin sarong ekstensyon.',
+'api-error-http' => 'Panlaog na kasalaan: Dae nakakakonekta sa serbidor.',
+'api-error-illegal-filename' => 'An pangaran nin sagunson dae pinagtutugutan.',
+'api-error-internal-error' => 'Panlaog na kasalaan: May bagay na napasala sa pagproseso kan saimong pagkakarga sa wiki.',
+'api-error-invalid-file-key' => 'Panlaog na kasalaan: An sagunson dae natagboan sa temporaryong sarayan.',
+'api-error-missingparam' => 'Panlaog na kasalaan: Nawawara an mga parametro sa kahagadan.',
+'api-error-missingresult' => 'Panlaog na kasalaan: Dae madeterminaran kun an kopya naipadagos.',
+'api-error-mustbeloggedin' => 'Ika dapat na nakalaog tanganing makapagkarga nin mga sagunson.',
+'api-error-mustbeposted' => 'Panlaog na kasalaan: An kahagadan minakaipo nin HTTP POST.',
+'api-error-noimageinfo' => 'An pagkarga nagdagos, alagad an serbidor dae nakapagtao samuya nin anuman na impormasyon manunungod sa sagunson.',
+'api-error-nomodule' => 'Panlaog na kasalaan: Mayong pankargang modyul an naikaag.',
+'api-error-ok-but-empty' => 'Panlaog na kasalaan: Mayong simbag gikan sa serbidor.',
+'api-error-overwrite' => 'An salambawan na sarong eksistido nang sagunson dae pinagtutugutan.',
+'api-error-stashfailed' => 'Panlaog na kasalaan: An serbidor nagpalya sa pagsaray kan temporaryong sagunson.',
+'api-error-timeout' => 'An serbidor dae nakapagsimbag sa laog kan pinaghunang panahon.',
+'api-error-unclassified' => 'May dae midbid na kasalaan an nangyari.',
+'api-error-unknown-code' => 'Dae midbid na kasalaan: "$1".',
+'api-error-unknown-error' => 'Panlaog na kasalaan: May sarong bagay na napasala kan prubaran na ikarga an saimong sagunson.',
+'api-error-unknown-warning' => 'Dae midbid na patanid: "$1".',
+'api-error-unknownerror' => 'Dae midbidon na kasalaan: "$1".',
+'api-error-uploaddisabled' => 'An pagkakarga pinag-untok nguna kaining wiki.',
+'api-error-verification-error' => 'Ining sagunson baka koraptu, o igwa nin salang ekstensyon.',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|mga segundo}}',
+
+# Unknown messages
+'svg-long-error' => 'Imbalidong SVG na sagunson: $1',
 );
index 69f2853..4c1ae0b 100644 (file)
  * @author לערי ריינהארט
  */
 
-$bookstoreList = array(
-       'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
-);
-
-$datePreferences = array(
-       'default',
-       'dmy',
-       'ISO 8601',
-);
-
-$defaultDateFormat = 'dmy';
-
-$dateFormats = array(
-       'dmy time' => 'H:i',
-       'dmy date' => 'j xg Y',
-       'dmy both' => 'H:i, j xg Y',
-);
-
 $namespaceNames = array(
        NS_MEDIA            => 'Мультымедыя',
        NS_SPECIAL          => 'Адмысловае',
@@ -78,6 +59,25 @@ $magicWords = array(
        'img_framed'                => array( '1', 'безрамкі', 'framed', 'enframed', 'frame' ),
 );
 
+$bookstoreList = array(
+       'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
+       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+);
+
+$datePreferences = array(
+       'default',
+       'dmy',
+       'ISO 8601',
+);
+
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+       'dmy time' => 'H:i',
+       'dmy date' => 'j xg Y',
+       'dmy both' => 'H:i, j xg Y',
+);
+
 # Per discussion on http://translatewiki.net/wiki/Thread:Support/Customization_of number format
 $separatorTransformTable = array(
        ',' => "\xc2\xa0", # nbsp
@@ -94,7 +94,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Без паказу ўхваленых правак у нядаўніх змяненнях',
 'tog-newpageshidepatrolled' => 'Без паказу ўхваленых правак у пераліку новых старонак',
 'tog-extendwatchlist' => 'Паказваць усе змяненні, а не толькі апошнія',
-'tog-usenewrc' => 'УдаÑ\81каналенÑ\8b Ð²Ñ\8bглÑ\8fд (паÑ\82Ñ\80абÑ\83е Ð¯Ð²Ð°Ñ\81кÑ\80Ñ\8bпÑ\82)',
+'tog-usenewrc' => 'Ð\93Ñ\80Ñ\83паваÑ\86Ñ\8c Ð·Ð¼ÐµÐ½Ñ\8b Ñ\81Ñ\82аÑ\80онкÑ\96 Ñ\9e Ñ\81пÑ\96Ñ\81аÑ\85 Ð°Ð¿Ð¾Ñ\88нÑ\96Ñ\85 Ð·Ð¼ÐµÐ½Ð°Ñ\9e Ñ\96 Ð½Ð°Ð·Ñ\96Ñ\80аннÑ\8fÑ\9e (паÑ\82Ñ\80абÑ\83е JavaScript)',
 'tog-numberheadings' => 'Аўта-нумараваць падзагалоўкі',
 'tog-showtoolbar' => 'Паказваць рэдактарскую стужку (Яваскрыпт)',
 'tog-editondblclick' => 'Праўка старонак па падвойным пстрыку (Яваскрыпт)',
@@ -102,10 +102,10 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Праўка падраздзелаў па правым пстрыку на загалоўку (Яваскрыпт)',
 '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' => 'Папярэдні паказ пры першай праўцы',
@@ -231,7 +231,6 @@ $messages = array(
 'qbbrowse' => 'Выбраць',
 'qbedit' => 'Правіць',
 'qbpageoptions' => 'Гэтая старонка',
-'qbpageinfo' => 'Кантэкст',
 'qbmyoptions' => 'Свае старонкі',
 'qbspecialpages' => 'Адмысловыя старонкі',
 'faq' => 'ЧАПЫ',
@@ -481,8 +480,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Вы выйшлі з сістэмы.'''
 
-Можна працягваць працу на {{SITENAME}} ананімна, або можна [[Special:UserLogin|ўвайсці ў сістэму ізноў]], пад тым самым або пад іншым удзельніцкім імем. Заўважце, што некаторыя старонкі могуць паказвацца так, быццам вы яшчэ не выйшлі; у такім разе трэба ачысціць кэш вашага браўзера.",
-'welcomecreation' => '== Вітаем, $1! == Ваш  рахунак быў створаны. Не забудзьцеся дапасаваць свае [[Special:Preferences|{{SITENAME}} настáўленні]].',
+Можна працягваць працу на {{SITENAME}} ананімна, або можна <span class='plainlinks'>[$1 ўвайсці ў сістэму ізноў]</span>, пад тым самым або пад іншым удзельніцкім імем. Заўважце, што некаторыя старонкі могуць паказвацца так, быццам вы яшчэ не выйшлі; у такім разе трэба ачысціць кэш вашага браўзера.",
+'welcomeuser' => 'Вітаем, $1!',
+'welcomecreation-msg' => 'Ваш рахунак быў створаны.
+Не забудзьцеся дапасаваць [[Special:Preferences|персанальныя настаўленні]] для {{SITENAME}}.',
 'yourname' => 'Імя ўдзельніка',
 'yourpassword' => 'Пароль',
 'yourpasswordagain' => 'Паўтарыце пароль',
@@ -718,7 +719,7 @@ $2
 або [{{fullurl:{{FULLPAGENAME}}|action=edit}} папрацаваць з гэтай старонкай]</span>.',
 'noarticletext-nopermission' => 'Старонка не ўтрымлівае тэксту.
 Вы можаце [[Special:Search/{{PAGENAME}}|пашукаць гэткую назву]] ў іншых старонках,
-ці <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах]</span>.',
+ці <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ў журналах]</span>, але вы не маеце дазволу на стварэнне гэтай старонкі.',
 'userpage-userdoesnotexist' => 'Рахунак удзельніка "<nowiki>$1</nowiki>" не зарэгістраваны. Праверце, ці вы жадаеце стварыць або паправіць гэтую старонку.',
 'userpage-userdoesnotexist-view' => 'Уліковы запіс удзельніка " $1 "не зарэгістраваны.',
 'blocked-notice-logextract' => 'Гэты карыстальнік у дадзены момант заблакаваны. 
@@ -739,7 +740,7 @@ $2
 'userinvalidcssjstitle' => "'''Увага:''' Няма вокладкі з назвай \"\$1\". Памятайце, што свае старонкі .css і .js называюцца толькі малымі літарамі, такім чынам, напр., {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
 'updated' => '(абноўлена)',
 'note' => "'''Заўвага:'''",
-'previewnote' => "'''Ð\93эта папярэдні паказ; праўкі яшчэ не замацаваныя!'''",
+'previewnote' => "'''Ð\9fамÑ\8fÑ\82айÑ\86е, Ð³эта папярэдні паказ; праўкі яшчэ не замацаваныя!'''",
 'previewconflict' => 'Гэта папярэдні паказ магчымага выніку замацоўвання актуальнага стану крынічнага тэксту ў верхнім тэкставым полі.',
 'session_fail_preview' => "'''Не ўдалося апрацаваць вашую праўку, таму што сервер згубіў звесткі аб вашым сеансе.
 Паспрабуйце, калі ласка, ізноў. Калі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў.'''",
@@ -1052,8 +1053,6 @@ $1",
 'search-interwiki-caption' => 'Сумежныя праекты',
 'search-interwiki-default' => 'вынікі з $1:',
 'search-interwiki-more' => '(яшчэ)',
-'search-mwsuggest-enabled' => 'з прапановамі',
-'search-mwsuggest-disabled' => 'без прапановаў',
 'search-relatedarticle' => 'Дачыняюцца*',
 'mwsuggest-disable' => 'Не паказваць прапановаў AJAX',
 'searcheverything-enable' => 'Пошук ва ўсіх прасторах назваў',
@@ -1969,7 +1968,7 @@ $1',
 
 # Watchlist
 'watchlist' => 'Мой спіс назіранага',
-'mywatchlist' => 'Ð\9dазÑ\96Ñ\80анае',
+'mywatchlist' => 'СпÑ\96Ñ\81 Ð½Ð°Ð·Ñ\96Ñ\80анага',
 'watchlistfor2' => 'Для $1 $2',
 'nowatchlist' => 'Ваш спіс назіранага зараз пусты.',
 'watchlistanontext' => 'Каб бачыць або правіць складнікі назіранага, трэба $1.',
@@ -2007,11 +2006,7 @@ $1',
 
 'enotif_mailer' => 'Апавяшчальнік {{SITENAME}}',
 'enotif_reset' => 'Пазначыць усе старонкі як наведаныя',
-'enotif_newpagetext' => 'Гэта новая старонка.',
 'enotif_impersonal_salutation' => 'Шаноўны ўдзельнік {{SITENAME}}',
-'changed' => 'зменена',
-'created' => 'створана',
-'enotif_subject' => 'Старонка {{SITENAME}} з назвай $PAGETITLE была $CHANGEDORCREATED удзельнікам $PAGEEDITOR',
 'enotif_lastvisited' => 'Гл. $1 каб бачыць усе мены пасля вашага апошняга наведвання.',
 'enotif_lastdiff' => 'Гл. $1 каб бачыць гэтую мену.',
 'enotif_anon_editor' => 'ананімны ўдзельнік $1',
@@ -2605,7 +2600,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-тэсты',
-'javascripttest-disabled' => 'Гэта функцыя выключаная.',
 'javascripttest-title' => 'Праводзіцца тэставанне $1',
 'javascripttest-pagetext-noframework' => 'Гэта старонка зарэзервавана для запуску тэстаў JavaScript',
 'javascripttest-pagetext-unknownframework' => 'Невядомая бібліятэка тэставання «$1».',
@@ -3551,6 +3545,10 @@ MediaWiki распаўсюджваецца, спадзеючыся на прыд
 'feedback-bugcheck' => 'Выдатна! Толькі праверце, што ў спісе [$1 вядомых памылак] яе няма падобнага запісу.',
 'feedback-bugnew' => 'Я праверыў. Паведаміць пра новую памылку',
 
+# Search suggestions
+'searchsuggest-search' => 'Знайсці',
+'searchsuggest-containing' => 'змяшчае...',
+
 # API errors
 'api-error-badaccess-groups' => 'У Вас няма дазволу загружаць файлы ў гэтую вікі.',
 'api-error-badtoken' => 'Унутраная памылка: няслушны ключ.',
index 28ec4b3..5a9b652 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Belarusian (Taraškievica orthography) (‪беларуская (тарашкевіца)‬)
+/** Belarusian (Taraškievica orthography) (беларуская (тарашкевіца)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
  * @author Тест
  */
 
-$bookstoreList = array(
-       'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
-       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+$fallback = 'be';
+
+$namespaceNames = array(
+       NS_MEDIA            => 'Мэдыя',
+       NS_SPECIAL          => 'Спэцыяльныя',
+       NS_TALK             => 'Абмеркаваньне',
+       NS_USER             => 'Удзельнік',
+       NS_USER_TALK        => 'Гутаркі_ўдзельніка',
+       NS_PROJECT_TALK     => 'Абмеркаваньне_{{GRAMMAR:родны|$1}}',
+       NS_FILE             => 'Файл',
+       NS_FILE_TALK        => 'Абмеркаваньне_файла',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'Абмеркаваньне_MediaWiki',
+       NS_TEMPLATE         => 'Шаблён',
+       NS_TEMPLATE_TALK    => 'Абмеркаваньне_шаблёну',
+       NS_HELP             => 'Дапамога',
+       NS_HELP_TALK        => 'Абмеркаваньне_дапамогі',
+       NS_CATEGORY         => 'Катэгорыя',
+       NS_CATEGORY_TALK    => 'Абмеркаваньне_катэгорыі',
 );
 
-$datePreferences = array(
-       'default',
-       'dmy',
-       'ISO 8601',
+$namespaceAliases = array(
+       'Абмеркаваньне_$1' => NS_PROJECT_TALK, // legacy support for old non-inflected links
+       'Выява' => NS_FILE,
+       'Абмеркаваньне_выявы' => NS_FILE_TALK,
 );
 
-$defaultDateFormat = 'dmy';
+$namespaceGenderAliases = array(
+       NS_USER      => array( 'male' => 'Удзельнік', 'female' => 'Удзельніца' ),
+       NS_USER_TALK => array( 'male' => 'Гутаркі_ўдзельніка', 'female' => 'Гутаркі_ўдзельніцы' ),
+);
 
-$dateFormats = array(
-       'dmy time' => 'H:i',
-       'dmy date' => 'j xg Y',
-       'dmy both' => 'H:i, j xg Y',
+$specialPageAliases = array(
+       'Allmessages'               => array( 'Сыстэмныя_паведамленьні' ),
+       'Allpages'                  => array( 'Усе_старонкі' ),
+       'Ancientpages'              => array( 'Найстарэйшыя_старонкі' ),
+       'Block'                     => array( 'Блякаваньне' ),
+       'BrokenRedirects'           => array( 'Некарэктныя_перанакіраваньні' ),
+       'Categories'                => array( 'Катэгорыі' ),
+       'ChangePassword'            => array( 'Зьмяніць_пароль', 'Ачысьціць_пароль' ),
+       'Contributions'             => array( 'Унёсак' ),
+       'CreateAccount'             => array( 'Стварыць_рахунак' ),
+       'Deadendpages'              => array( 'Тупіковыя_старонкі' ),
+       'DeletedContributions'      => array( 'Выдалены_ўнёсак' ),
+       'Disambiguations'           => array( 'Неадназначнасьці' ),
+       'DoubleRedirects'           => array( 'Двайныя_перанакіраваньні' ),
+       'Emailuser'                 => array( 'Даслаць_ліст' ),
+       'Export'                    => array( 'Экспарт' ),
+       'Filepath'                  => array( 'Шлях_да_файла' ),
+       'Import'                    => array( 'Імпарт' ),
+       'LinkSearch'                => array( 'Пошук_вонкавых_спасылак' ),
+       'Listadmins'                => array( 'Сьпіс_адміністратараў' ),
+       'Listbots'                  => array( 'Сьпіс_робатаў' ),
+       'Listfiles'                 => array( 'Сьпіс_файлаў' ),
+       'Listredirects'             => array( 'Сьпіс_перанакіраваньняў' ),
+       'Listusers'                 => array( 'Сьпіс_удзельнікаў' ),
+       'Log'                       => array( 'Журналы_падзеяў' ),
+       'Lonelypages'               => array( 'Старонкі-сіраціны' ),
+       'Longpages'                 => array( 'Доўгія_старонкі' ),
+       'MergeHistory'              => array( 'Гісторыя_аб\'яднаньняў' ),
+       'Mycontributions'           => array( 'Мой_унёсак' ),
+       'Mypage'                    => array( 'Мая_старонка' ),
+       'Mytalk'                    => array( 'Мае_размовы' ),
+       'Newimages'                 => array( 'Новыя_файлы' ),
+       'Newpages'                  => array( 'Новыя_старонкі' ),
+       'Popularpages'              => array( 'Папулярныя_старонкі' ),
+       'Protectedpages'            => array( 'Абароненыя_старонкі' ),
+       'Protectedtitles'           => array( 'Забароненыя_старонкі' ),
+       'Randompage'                => array( 'Выпадковая_старонка' ),
+       'Randomredirect'            => array( 'Выпадковае_перанакіраваньне' ),
+       'Recentchanges'             => array( 'Апошнія_зьмены' ),
+       'Search'                    => array( 'Пошук' ),
+       'Shortpages'                => array( 'Кароткія_старонкі' ),
+       'Specialpages'              => array( 'Спэцыяльныя_старонкі' ),
+       'Statistics'                => array( 'Статыстыка' ),
+       'Uncategorizedcategories'   => array( 'Некатэгарызаваныя_катэгорыі' ),
+       'Uncategorizedimages'       => array( 'Некатэгарызаваныя_файлы' ),
+       'Uncategorizedpages'        => array( 'Некатэгарызаваныя_старонкі' ),
+       'Uncategorizedtemplates'    => array( 'Некатэгарызаваныя_шаблёны' ),
+       'Upload'                    => array( 'Загрузка' ),
+       'Version'                   => array( 'Вэрсія' ),
+       'Wantedcategories'          => array( 'Запатрабаваныя_катэгорыі' ),
+       'Wantedfiles'               => array( 'Запатрабаваныя_файлы' ),
+       'Wantedpages'               => array( 'Запатрабаваныя_старонкі', 'Некарэктныя_спасылкі' ),
+       'Wantedtemplates'           => array( 'Запатрабаваныя_шаблёны' ),
+       'Watchlist'                 => array( 'Сьпіс_назіраньня' ),
+       'Whatlinkshere'             => array( 'Спасылкі_на_старонку' ),
 );
 
 $magicWords = array(
@@ -93,14 +163,14 @@ $magicWords = array(
        '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_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_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_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' ),
@@ -156,88 +226,23 @@ $magicWords = array(
        'staticredirect'            => array( '1', '__СТАТЫЧНАЕ_ПЕРАНАКІРАВАНЬНЕ__', '__STATICREDIRECT__' ),
 );
 
-$namespaceNames = array(
-       NS_MEDIA            => 'Мэдыя',
-       NS_SPECIAL          => 'Спэцыяльныя',
-       NS_TALK             => 'Абмеркаваньне',
-       NS_USER             => 'Удзельнік',
-       NS_USER_TALK        => 'Гутаркі_ўдзельніка',
-       NS_PROJECT_TALK     => 'Абмеркаваньне_{{GRAMMAR:родны|$1}}',
-       NS_FILE             => 'Файл',
-       NS_FILE_TALK        => 'Абмеркаваньне_файла',
-       NS_MEDIAWIKI        => 'MediaWiki',
-       NS_MEDIAWIKI_TALK   => 'Абмеркаваньне_MediaWiki',
-       NS_TEMPLATE         => 'Шаблён',
-       NS_TEMPLATE_TALK    => 'Абмеркаваньне_шаблёну',
-       NS_HELP             => 'Дапамога',
-       NS_HELP_TALK        => 'Абмеркаваньне_дапамогі',
-       NS_CATEGORY         => 'Катэгорыя',
-       NS_CATEGORY_TALK    => 'Абмеркаваньне_катэгорыі',
+$bookstoreList = array(
+       'OZ.by' => 'http://oz.by/search.phtml?what=books&isbn=$1',
+       'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
 );
 
-$namespaceAliases = array(
-       'Удзельніца' => NS_USER,
-       'Гутаркі ўдзельніцы' => NS_USER_TALK,
-       'Абмеркаваньне_$1' => NS_PROJECT_TALK,
-       'Выява' => NS_FILE,
-       'Абмеркаваньне выявы' => NS_FILE_TALK,
+$datePreferences = array(
+       'default',
+       'dmy',
+       'ISO 8601',
 );
 
-$specialPageAliases = array(
-       'Allmessages'               => array( 'Сыстэмныя_паведамленьні' ),
-       'Allpages'                  => array( 'Усе_старонкі' ),
-       'Ancientpages'              => array( 'Найстарэйшыя_старонкі' ),
-       'Block'                     => array( 'Блякаваньне' ),
-       'BrokenRedirects'           => array( 'Некарэктныя_перанакіраваньні' ),
-       'Categories'                => array( 'Катэгорыі' ),
-       'ChangePassword'            => array( 'Зьмяніць_пароль', 'Ачысьціць_пароль' ),
-       'Contributions'             => array( 'Унёсак' ),
-       'CreateAccount'             => array( 'Стварыць_рахунак' ),
-       'Deadendpages'              => array( 'Тупіковыя_старонкі' ),
-       'DeletedContributions'      => array( 'Выдалены_ўнёсак' ),
-       'Disambiguations'           => array( 'Неадназначнасьці' ),
-       'DoubleRedirects'           => array( 'Двайныя_перанакіраваньні' ),
-       'Emailuser'                 => array( 'Даслаць_ліст' ),
-       'Export'                    => array( 'Экспарт' ),
-       'Filepath'                  => array( 'Шлях_да_файла' ),
-       'Import'                    => array( 'Імпарт' ),
-       'LinkSearch'                => array( 'Пошук_вонкавых_спасылак' ),
-       'Listadmins'                => array( 'Сьпіс_адміністратараў' ),
-       'Listbots'                  => array( 'Сьпіс_робатаў' ),
-       'Listfiles'                 => array( 'Сьпіс_файлаў' ),
-       'Listredirects'             => array( 'Сьпіс_перанакіраваньняў' ),
-       'Listusers'                 => array( 'Сьпіс_удзельнікаў' ),
-       'Log'                       => array( 'Журналы_падзеяў' ),
-       'Lonelypages'               => array( 'Старонкі-сіраціны' ),
-       'Longpages'                 => array( 'Доўгія_старонкі' ),
-       'MergeHistory'              => array( 'Гісторыя_аб\'яднаньняў' ),
-       'Mycontributions'           => array( 'Мой_унёсак' ),
-       'Mypage'                    => array( 'Мая_старонка' ),
-       'Mytalk'                    => array( 'Мае_размовы' ),
-       'Newimages'                 => array( 'Новыя_файлы' ),
-       'Newpages'                  => array( 'Новыя_старонкі' ),
-       'Popularpages'              => array( 'Папулярныя_старонкі' ),
-       'Protectedpages'            => array( 'Абароненыя_старонкі' ),
-       'Protectedtitles'           => array( 'Забароненыя_старонкі' ),
-       'Randompage'                => array( 'Выпадковая_старонка' ),
-       'Randomredirect'            => array( 'Выпадковае_перанакіраваньне' ),
-       'Recentchanges'             => array( 'Апошнія_зьмены' ),
-       'Search'                    => array( 'Пошук' ),
-       'Shortpages'                => array( 'Кароткія_старонкі' ),
-       'Specialpages'              => array( 'Спэцыяльныя_старонкі' ),
-       'Statistics'                => array( 'Статыстыка' ),
-       'Uncategorizedcategories'   => array( 'Некатэгарызаваныя_катэгорыі' ),
-       'Uncategorizedimages'       => array( 'Некатэгарызаваныя_файлы' ),
-       'Uncategorizedpages'        => array( 'Некатэгарызаваныя_старонкі' ),
-       'Uncategorizedtemplates'    => array( 'Некатэгарызаваныя_шаблёны' ),
-       'Upload'                    => array( 'Загрузка' ),
-       'Version'                   => array( 'Вэрсія' ),
-       'Wantedcategories'          => array( 'Запатрабаваныя_катэгорыі' ),
-       'Wantedfiles'               => array( 'Запатрабаваныя_файлы' ),
-       'Wantedpages'               => array( 'Запатрабаваныя_старонкі', 'Некарэктныя_спасылкі' ),
-       'Wantedtemplates'           => array( 'Запатрабаваныя_шаблёны' ),
-       'Watchlist'                 => array( 'Сьпіс_назіраньня' ),
-       'Whatlinkshere'             => array( 'Спасылкі_на_старонку' ),
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+       'dmy time' => 'H:i',
+       'dmy date' => 'j xg Y',
+       'dmy both' => 'H:i, j xg Y',
 );
 
 $separatorTransformTable = array(
@@ -259,7 +264,7 @@ $messages = array(
 'tog-justify' => 'Выраўноўваць тэкст па шырыні старонкі',
 'tog-hideminor' => 'Хаваць дробныя зьмены ў сьпісе апошніх зьменаў',
 'tog-hidepatrolled' => 'Хаваць патруляваныя зьмены ў сьпісе апошніх зьменаў',
-'tog-newpageshidepatrolled' => 'Хаваць правераныя старонкі ў сьпісе новых старонак',
+'tog-newpageshidepatrolled' => 'Хаваць патруляваныя старонкі ў сьпісе новых старонак',
 'tog-extendwatchlist' => 'Пашырыць сьпіс назіраньня, каб ён паказваў усе зьмены, а ня толькі апошнія',
 'tog-usenewrc' => 'Групаваць зьмены старонкі ў сьпісах апошніх зьменаў і назіраньняў (патрабуе JavaScript)',
 'tog-numberheadings' => 'Аўтаматычная нумарацыя загалоўкаў',
@@ -267,11 +272,11 @@ $messages = array(
 'tog-editondblclick' => 'Рэдагаваць старонкі па падвойным пстрыку (JavaScript)',
 'tog-editsection' => 'Дазволіць рэдагаваньне асобных сэкцыяў па спасылках [рэдагаваць]',
 'tog-editsectiononrightclick' => 'Рэдагаваць сэкцыі па правым пстрыку на загалоўку (патрабуе JavaScript)',
-'tog-showtoc' => 'Ð\9fаказваÑ\86Ñ\8c Ð·Ñ\8cмеÑ\81Ñ\82 (длÑ\8f Ñ\81Ñ\82аÑ\80онак Ð· ÐºÐ¾Ð»Ñ\8cкаÑ\81Ñ\8cÑ\86Ñ\8e Ñ\81Ñ\8dкÑ\86Ñ\8bй Ð±Ð¾Ð»ÐµÐ¹ Ð·Ð° 3)',
+'tog-showtoc' => 'Ð\9fаказваÑ\86Ñ\8c Ð·Ñ\8cмеÑ\81Ñ\82 (длÑ\8f Ñ\81Ñ\82аÑ\80онак Ð· Ð±Ð¾Ð»Ñ\8cÑ\88 Ñ\8fк 3 Ñ\80азÑ\8cдзеламÑ\96)',
 'tog-rememberpassword' => 'Запомніць мяне ў гэтым браўзэры (ня больш за $1 {{PLURAL:$1|дзень|дні|дзён}})',
-'tog-watchcreations' => 'Дадаваць у мой сьпіс назіраньня створаныя мной старонкі і загружаныя мной файлы',
-'tog-watchdefault' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы якія я рэдагаваў',
-'tog-watchmoves' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы якія я пераносіў',
+'tog-watchcreations' => 'Дадаваць у мой сьпіс назіраньня створаныя мной старонкі і загружаныя файлы',
+'tog-watchdefault' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я рэдагаваў',
+'tog-watchmoves' => 'Дадаваць у мой сьпіс назіраньня перанесеныя мною старонкі і файлы',
 'tog-watchdeletion' => 'Дадаваць у мой сьпіс назіраньня старонкі і файлы, якія я выдаляю',
 'tog-minordefault' => 'Па змоўчаньні пазначаць усе зьмены дробнымі',
 'tog-previewontop' => 'Паказваць папярэдні прагляд старонкі над полем рэдагаваньня',
@@ -284,18 +289,18 @@ $messages = array(
 'tog-shownumberswatching' => 'Паказваць колькасьць назіральнікаў',
 'tog-oldsig' => 'Цяперашні подпіс:',
 'tog-fancysig' => 'Апрацоўваць подпіс як вікі-тэкст (без аўтаматычнай спасылкі)',
-'tog-externaleditor' => 'Выкарыстоўваць вонкавы рэдактар па змоўчваньні (толькі для адмыслоўцаў, патрэбуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
-'tog-externaldiff' => 'Выкарыстоўваць вонкавую праграму параўнаньня вэрсіяў па змоўчваньні (толькі для адмыслоўцаў, патрэбуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
+'tog-externaleditor' => 'Выкарыстоўваць вонкавы рэдактар па змоўчваньні (толькі для адмыслоўцаў, патрабуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
+'tog-externaldiff' => 'Выкарыстоўваць вонкавую праграму параўнаньня вэрсіяў па змоўчваньні (толькі для адмыслоўцаў, патрабуе спэцыяльных наладак на вашым кампутары. [//www.mediawiki.org/wiki/Manual:External_editors Падрабязнасьці.])',
 'tog-showjumplinks' => 'Актываваць дапаможныя спасылкі «перайсьці да»',
 'tog-uselivepreview' => 'Выкарыстоўваць хуткі папярэдні прагляд (патрабуе JavaScript) (экспэрымэнтальна)',
 'tog-forceeditsummary' => 'Папярэджваць пра адсутнасьць кароткага апісаньня зьменаў',
 'tog-watchlisthideown' => 'Хаваць мае праўкі ў сьпісе назіраньня',
 'tog-watchlisthidebots' => 'Хаваць праўкі робатаў у сьпісе назіраньня',
 'tog-watchlisthideminor' => 'Хаваць дробныя праўкі ў сьпісе назіраньня',
-'tog-watchlisthideliu' => 'ХаваÑ\86Ñ\8c Ð¿Ñ\80аÑ\9eкÑ\96 Ð·Ð°Ñ\80Ñ\8dгÑ\96Ñ\81Ñ\82Ñ\80аванÑ\8bÑ\85 Ñ\83дзелÑ\8cнÑ\96каÑ\9e Ñ\96 Ñ\9eдзелÑ\8cнÑ\96Ñ\86 Ñ\83 Ñ\81Ñ\8cпÑ\96Ñ\81е Ð½Ð°Ð·Ñ\96Ñ\80анÑ\8cнÑ\8f',
+'tog-watchlisthideliu' => 'Хаваць праўкі зарэгістраваных удзельнікаў у сьпісе назіраньня',
 'tog-watchlisthideanons' => 'Хаваць праўкі ананімаў у сьпісе назіраньня',
 'tog-watchlisthidepatrolled' => 'Хаваць патруляваныя праўкі ў сьпісе назіраньня',
-'tog-ccmeonemails' => 'Дасылаць мне копіі лістоў, якія я дасылаю іншым удзельнікам і ўдзельніцам',
+'tog-ccmeonemails' => 'Дасылаць мне копіі лістоў, якія я дасылаю іншым удзельнікам',
 'tog-diffonly' => 'Не паказваць зьмест старонкі пад параўнаньнем зьменаў',
 'tog-showhiddencats' => 'Паказваць схаваныя катэгорыі',
 'tog-noconvertlink' => 'Забараніць канвэртацыю назваў спасылак',
@@ -303,12 +308,12 @@ $messages = array(
 
 'underline-always' => 'Заўсёды',
 'underline-never' => 'Ніколі',
-'underline-default' => 'Як Ñ\83 Ð±Ñ\80аÑ\9eзÑ\8dÑ\80Ñ\8b',
+'underline-default' => 'Ð\9fаводле Ð±Ñ\80аÑ\9eзÑ\8dÑ\80а Ð°Ð±Ð¾ Ð°Ñ\84аÑ\80мленÑ\8cнÑ\8f',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Стыль шрыфту ў полі рэдагаваньня:',
-'editfont-default' => 'ШÑ\80Ñ\8bÑ\84Ñ\82 Ð±Ñ\80аÑ\9eзÑ\8dÑ\80а Ð¿Ð° Ð·Ð¼Ð¾Ñ\9eÑ\87ванÑ\8cнÑ\96',
-'editfont-monospace' => 'ШÑ\80Ñ\8bÑ\84Ñ\82 Ð· Ð°Ð´Ð½Ð¾Ð»Ñ\8cкавай Ñ\88Ñ\8bÑ\80Ñ\8bнÑ\91й Ñ\81Ñ\8bмбалÑ\8fÑ\9e',
+'editfont-default' => 'Ð\9fаводле Ð±Ñ\80аÑ\9eзÑ\8dÑ\80а',
+'editfont-monospace' => 'РоÑ\9eнаÑ\88Ñ\8bÑ\80окÑ\96 Ñ\88Ñ\80Ñ\8bÑ\84Ñ\82',
 'editfont-sansserif' => 'Шрыфт без засечак',
 'editfont-serif' => 'Шрыфт з засечкамі',
 
@@ -351,18 +356,18 @@ $messages = array(
 'october-gen' => 'кастрычніка',
 'november-gen' => 'лістапада',
 'december-gen' => 'сьнежня',
-'jan' => '01',
-'feb' => '02',
-'mar' => '03',
-'apr' => '04',
-'may' => '05',
-'jun' => '06',
-'jul' => '07',
-'aug' => '08',
-'sep' => '09',
-'oct' => '10',
-'nov' => '11',
-'dec' => '12',
+'jan' => 'сту',
+'feb' => 'лют',
+'mar' => 'сак',
+'apr' => 'кра',
+'may' => 'тра',
+'jun' => 'чэр',
+'jul' => 'ліп',
+'aug' => 'жні',
+'sep' => 'вер',
+'oct' => 'кас',
+'nov' => 'ліс',
+'dec' => 'сьн',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Катэгорыя|Катэгорыі|Катэгорыі}}',
@@ -388,8 +393,8 @@ $messages = array(
 'newwindow' => '(адкрываецца ў новым акне)',
 'cancel' => 'Скасаваць',
 'moredotdotdot' => 'Далей…',
-'mypage' => 'Ð\9cаÑ\8f Ñ\81таронка',
-'mytalk' => 'Ð\9cае Ð³утаркі',
+'mypage' => 'Старонка',
+'mytalk' => 'Ð\93утаркі',
 'anontalk' => 'Гутаркі для гэтага IP-адрасу',
 'navigation' => 'Навігацыя',
 'and' => '&#32;і',
@@ -399,7 +404,6 @@ $messages = array(
 'qbbrowse' => 'Праглядзець',
 'qbedit' => 'Рэдагаваць',
 'qbpageoptions' => 'Гэтая старонка',
-'qbpageinfo' => 'Інфармацыя пра старонку',
 'qbmyoptions' => 'Мае старонкі',
 'qbspecialpages' => 'Спэцыяльныя старонкі',
 'faq' => 'Частыя пытаньні',
@@ -412,7 +416,7 @@ $messages = array(
 'vector-action-protect' => 'Абараніць',
 'vector-action-undelete' => 'Аднавіць',
 'vector-action-unprotect' => 'Зьмяніць абарону',
-'vector-simplesearch-preference' => 'Уключыць палепшаныя пошукавыя падказкі (толькі для афармленьня «Вэктар»)',
+'vector-simplesearch-preference' => 'Уключыць спрошчанае поле пошуку (толькі для афармленьня «Вэктар»)',
 'vector-view-create' => 'Стварыць',
 'vector-view-edit' => 'Рэдагаваць',
 'vector-view-history' => 'Паказаць гісторыю',
@@ -422,8 +426,9 @@ $messages = array(
 'namespaces' => 'Прасторы назваў',
 'variants' => 'Варыянты',
 
+'navigation-heading' => 'Навігацыйнае мэню',
 'errorpagetitle' => 'Памылка',
-'returnto' => 'Вярнуцца да старонкі $1.',
+'returnto' => 'Вярнуцца да старонкі «$1».',
 'tagline' => 'Зьвесткі з {{GRAMMAR:родны|{{SITENAME}}}}',
 'help' => 'Дапамога',
 'search' => 'Пошук',
@@ -511,7 +516,8 @@ $1',
 'badaccess-groups' => 'Запытанае Вамі дзеяньне дазволенае толькі ўдзельнікам {{PLURAL:$2|з групы|адной з групаў:}} $1.',
 
 'versionrequired' => 'Патрабуецца MediaWiki вэрсіі $1',
-'versionrequiredtext' => 'Для карыстаньня гэтай старонкай патрабуецца MediaWiki вэрсіі $1. Глядзіце [[Special:Version|інфармацыю пра вэрсію]].',
+'versionrequiredtext' => 'Для карыстаньня гэтай старонкай патрабуецца MediaWiki вэрсіі $1.
+Глядзіце [[Special:Version|інфармацыю пра вэрсію]].',
 
 'ok' => 'Добра',
 'pagetitle' => '$1 — {{SITENAME}}',
@@ -629,7 +635,7 @@ $1',
 'viewsource-title' => 'Прагляд крыніцы для $1',
 'actionthrottled' => 'Дзеяньне прытрыманае',
 'actionthrottledtext' => 'У межах барацьбы са спамам Вы абмежаваныя ў надта частым выкананьні гэтага дзеяньня за кароткі прамежак часу, і Вы перавысілі гэтае абмежаваньне. Калі ласка, паспрабуйце яшчэ раз празь некалькі хвілінаў.',
-'protectedpagetext' => 'РÑ\8dдагаванÑ\8cне Ð³Ñ\8dÑ\82ай Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ð°Ð±Ð°Ñ\80оненае.',
+'protectedpagetext' => 'Ð\93Ñ\8dÑ\82аÑ\8f Ñ\81Ñ\82аÑ\80онка Ð±Ñ\8bла Ð°Ð±Ð°Ñ\80оненаÑ\8f Ð´Ð»Ñ\8f Ð¿ÐµÑ\80адÑ\83Ñ\85Ñ\96ленÑ\8cнÑ\8f Ð·Ñ\8cменаÑ\9e Ñ\86Ñ\96 Ñ\96нÑ\88Ñ\8bÑ\85 Ð´Ð·ÐµÑ\8fнÑ\8cнÑ\8fÑ\9e.',
 'viewsourcetext' => 'Вы можаце праглядаць і капіяваць крынічны тэкст гэтай старонкі:',
 'viewyourtext' => "Вы можаце праглядзець і скапіяваць крынічны тэкст '''вашых рэдагаваньняў''' на гэтую старонку:",
 'protectedinterface' => 'Гэтая старонка ўтрымлівае інтэрфэйснае паведамленьне праграмнага забесьпячэньня, і яе зьмена забаронена. Каб дадаць ці зьмяніць пераклад ва ўсіх праектах, зьвярніцеся на [//translatewiki.net/ translatewiki.net], праект для перакладу MediaWiki.',
@@ -661,10 +667,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Вы выйшлі з сыстэмы.'''
 
-Вы можаце працягваць працу ў {{GRAMMAR:месны|{{SITENAME}}}} ананімна, альбо можаце [[Special:UserLogin|ўвайсьці ў сыстэму]] як той жа альбо іншы ўдзельнік.
+Вы можаце працягваць працу ў {{GRAMMAR:месны|{{SITENAME}}}} ананімна, альбо можаце <span class='plainlinks'>[$1 ўвайсьці ў сыстэму]</span> як той жа альбо іншы ўдзельнік.
 Некаторыя старонкі могуць паказвацца, быццам Вы ўсё яшчэ ў сыстэме. Каб гэтага пазьбегнуць, трэба ачысьціць кэш браўзэра.",
-'welcomecreation' => '== Вітаем, $1! ==
-Ваш рахунак быў створаны.
+'welcomeuser' => 'Вітаем, $1!',
+'welcomecreation-msg' => 'Ваш рахунак быў створаны.
 Не забудзьцеся зьмяніць Вашыя [[Special:Preferences|налады ў {{GRAMMAR:месны|{{SITENAME}}}}]].',
 'yourname' => 'Імя ўдзельніка:',
 'yourpassword' => 'Пароль:',
@@ -941,7 +947,7 @@ $2
 'note' => "'''Заўвага: '''",
 'previewnote' => "'''Гэта толькі папярэдні прагляд.'''
 Вашыя зьмены яшчэ не былі захаваныя!",
-'continue-editing' => 'Працягнуць рэдагаваньне',
+'continue-editing' => 'Перайсьці да рэдагаваньня',
 'previewconflict' => 'Гэта папярэдні прагляд тэксту зь верхняга вакна рэдагаваньня, так ён будзе выглядаць, калі Вы вырашыце яго захаваць.',
 'session_fail_preview' => "'''Не атрымалася захаваць Вашую праўку праз тое, што былі страчаныя зьвесткі пра сэсію.
 Калі ласка, паспрабуйце яшчэ раз. Калі памылка ня зьнікне, паспрабуйце [[Special:UserLogout|выйсьці з сыстэмы]] і ўвайсьці ізноў.'''",
@@ -1022,6 +1028,15 @@ $2
 'edit-already-exists' => 'Немагчыма стварыць новую старонку.
 Яна ўжо існуе.',
 'defaultmessagetext' => 'Перадвызначаны тэкст паведамленьня',
+'content-failed-to-parse' => 'Зьмест «$2» не адпавядае тыпу $1: $3.',
+'invalid-content-data' => 'Няслушныя зьвесткі',
+'content-not-allowed-here' => 'Зьмест тыпу «$1» на старонцы [[$2]] не дазволены',
+
+# Content models
+'content-model-wikitext' => 'вікі-тэкст',
+'content-model-text' => 'просты тэкст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Папярэджаньне: гэтая старонка ўтрымлівае зашмат працаёмістых зваротаў да функцыяў парсэра.
@@ -1278,8 +1293,6 @@ $1",
 'search-interwiki-caption' => 'Сумежныя праекты',
 'search-interwiki-default' => 'вынікі з $1:',
 'search-interwiki-more' => '(яшчэ)',
-'search-mwsuggest-enabled' => 'з парадамі',
-'search-mwsuggest-disabled' => 'без парад',
 'search-relatedarticle' => 'Зьвязаны',
 'mwsuggest-disable' => 'Адключыць AJAX-падказкі',
 'searcheverything-enable' => 'Шукаць ва ўсіх прасторах назваў',
@@ -1545,6 +1558,9 @@ $1",
 'rightslogtext' => 'Гэта журнал зьменаў правоў удзельнікаў.',
 'rightslogentry' => 'зьменена прыналежнасьць $1 з групы $2 да $3',
 'rightslogentry-autopromote' => 'быў аўтаматычна падвышаны з $2 да $3',
+'logentry-rights-rights' => '$1 {{GENDER:$1|зьмяніў|зьмяніла}} прыналежнасьць $3 да групы з $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|зьмяніў|зьмяніла}} прыналежнасьць $3 да групаў',
+'logentry-rights-autopromote' => '$1 {{GENDER:$1|быў аўтаматычна пераведзены|была аўтаматычна пераведзеная}} з групы $4 ў $5',
 'rightsnone' => '(няма)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1774,6 +1790,7 @@ $1',
 'backend-fail-notsame' => 'Неідэнтыфікаваны файл ужо існуе $1.',
 'backend-fail-invalidpath' => '$1 не зьяўляецца слушным шляхам да сховішча.',
 'backend-fail-delete' => 'Немагчыма выдаліць файл $1.',
+'backend-fail-describe' => 'Не атрымалася зьмяніць мэтазьвесткі для файла «$1».',
 'backend-fail-alreadyexists' => 'Файл $1 ужо існуе.',
 'backend-fail-store' => 'Немагчыма захаваць файл $1 у $2.',
 'backend-fail-copy' => 'Немагчыма скапіяваць файл $1 у $2.',
@@ -1926,7 +1943,7 @@ $1',
 'shared-repo-from' => '$1',
 'shared-repo' => 'агульнага сховішча',
 'shared-repo-name-wikimediacommons' => 'Вікісховішча',
-'upload-disallowed-here' => 'Ð\9dа Ð¶Ð°Ð»Ñ\8c Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿ÐµÑ\80азапÑ\96Ñ\81аÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\83Ñ\8e Ð²Ñ\8bÑ\8fвÑ\83.',
+'upload-disallowed-here' => 'Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð¿ÐµÑ\80азапÑ\96Ñ\81аÑ\86Ñ\8c Ð³Ñ\8dÑ\82Ñ\8b Ñ\84айл.',
 
 # File reversion
 'filerevert' => 'Вярнуць $1',
@@ -2164,7 +2181,7 @@ $1',
 'linksearch-ok' => 'Шукаць',
 'linksearch-text' => 'Можна ўжываць сымбалі падстаноўкі, напрыклад, «*.wikipedia.org».<br />
 Неабходны дамэн першага ўзроўню, напрыклад, «*.org».<br />
\9fÑ\80аÑ\82аколÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð¿Ð°Ð´Ñ\82Ñ\80Ñ\8bмлÑ\96ваÑ\8eÑ\86Ñ\86а: <code>$1</code> (не Ð´Ð°Ð´Ð°Ð²Ð°Ð¹Ñ\86е Ñ\96Ñ\85 Ñ\83 Ð\92аÑ\88 Ð¿Ð¾Ñ\88Ñ\83к).',
\9fÑ\80аÑ\82аколÑ\8b, Ñ\8fкÑ\96Ñ\8f Ð¿Ð°Ð´Ñ\82Ñ\80Ñ\8bмлÑ\96ваÑ\8eÑ\86Ñ\86а: <code>$1</code> (дапомна http://, ÐºÐ°Ð»Ñ\96 Ð¿Ñ\80аÑ\82акол Ð½Ðµ Ð¿Ð°Ð·Ð½Ð°Ñ\87анÑ\8b).',
 'linksearch-line' => 'Спасылка на $1 з $2',
 'linksearch-error' => 'Сымбалі падстаноўкі могуць ужывацца толькі ў пачатку адрасоў.',
 
@@ -2210,13 +2227,13 @@ $1',
 'mailnologin' => 'Няма адрасу атрымальніка',
 'mailnologintext' => 'Вам неабходна [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў Вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.',
 'emailuser' => 'Даслаць ліст',
-'emailuser-title-target' => 'Адправіць гэта па электроннай пошце  {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}}',
+'emailuser-title-target' => 'Адправіць гэта па электроннай пошце {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}}',
 'emailuser-title-notarget' => 'Даслаць ліст ўдзельніку ці ўдзельніцы па электроннай пошце',
 'emailpage' => 'Даслаць ліст ўдзельніку ці ўдзельніцы па электроннай пошце',
-'emailpagetext' => 'Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82оÑ\9eваÑ\86Ñ\8c Ñ\84оÑ\80мÑ\83 Ð½Ñ\96жÑ\8dй, ÐºÐ°Ð± Ð´Ð°Ñ\81лаÑ\86Ñ\8c Ð³Ñ\8dÑ\82амÑ\83 Ñ\9eдзелÑ\8cнÑ\96кÑ\83 ліст па электроннай пошце.
-Адрас электроннай пошты, які Вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе пазначаны ў полі ліста «Ад», і ўдзельнік зможа даслаць на гэты адрас адказ.',
+'emailpagetext' => 'Ð\92Ñ\8b Ð¼Ð¾Ð¶Ð°Ñ\86е Ð²Ñ\8bкаÑ\80Ñ\8bÑ\81Ñ\82аÑ\86Ñ\8c Ñ\84оÑ\80мÑ\83 Ð½Ñ\96жÑ\8dй, ÐºÐ°Ð± Ð´Ð°Ñ\81лаÑ\86Ñ\8c {{GENDER:$1|гÑ\8dÑ\82амÑ\83 Ñ\9eдзелÑ\8cнÑ\96кÑ\83|гÑ\8dÑ\82ай Ñ\83дзелÑ\8cнÑ\96Ñ\86Ñ\8b}} ліст па электроннай пошце.
+Адрас электроннай пошты, які Вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе пазначаны ў полі ліста «Ад», і {{GENDER:$1|ўдзельнік|ўдзельніца}} зможа даслаць на гэты адрас адказ.',
 'usermailererror' => 'Пры адсыланьні пошты адбылася памылка:',
-'defemailsubject' => 'ЭлекÑ\82Ñ\80оннаÑ\8f Ð¿Ð¾Ñ\88Ñ\82а {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»',
+'defemailsubject' => 'Ð\9bÑ\96Ñ\81Ñ\82 Ð· {{GRAMMAR:родны|{{SITENAME}}}} ад {{GENDER:$1|удзельніка|удзельніцы}} «$1»',
 'usermaildisabled' => 'Электронная пошта ўдзельніка адключаная',
 'usermaildisabledtext' => 'Вы ня можаце дасылаць электронныя лісты іншым удзельнікам {{GRAMMAR:родны|{{SITENAME}}}}',
 'noemailtitle' => 'Адрас электроннай пошты адсутнічае',
@@ -2265,7 +2282,7 @@ $1',
 'watchnochange' => 'Нічога з Вашага сьпісу назіраньня не зьмянілася за паказаны пэрыяд.',
 'watchlist-details' => 'У Вашым сьпісе назіраньня $1 {{PLURAL:$1|старонка|старонкі|старонак}} за выключэньнем старонак абмеркаваньня.',
 'wlheader-enotif' => '* Дасылка паведамленьняў па электроннай пошце ўключаная.',
-'wlheader-showupdated' => "* Ð¡Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð±Ñ\8bлÑ\96 Ð·Ñ\8cмененÑ\8bÑ\8f Ð¿Ð°Ñ\81Ñ\8cлÑ\8f Ð\92аÑ\88ага Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ð²Ñ\96зÑ\8bÑ\82Ñ\83, Ð²Ñ\8bлÑ\83Ñ\87анÑ\8bÑ\8f '''Ñ\82лÑ\83стым''' шрыфтам",
+'wlheader-showupdated' => "* Ð¡Ñ\82аÑ\80онкÑ\96, Ñ\8fкÑ\96Ñ\8f Ð±Ñ\8bлÑ\96 Ð·Ñ\8cмененÑ\8bÑ\8f Ð¿Ð°Ñ\81Ñ\8cлÑ\8f Ð\92аÑ\88ага Ð°Ð¿Ð¾Ñ\88нÑ\8fга Ð²Ñ\96зÑ\8bÑ\82Ñ\83, Ð²Ñ\8bлÑ\83Ñ\87анÑ\8bÑ\8f '''Ñ\82оÑ\9eстым''' шрыфтам",
 'watchmethod-recent' => 'прагляд апошніх зьменаў у старонках са сьпісу назіраньня',
 'watchmethod-list' => 'прагляд старонак са сьпісу назіраньня дзеля апошніх зьменах',
 'watchlistcontains' => 'Ваш сьпіс назіраньня зьмяшчае $1 {{PLURAL:$1|старонка|старонкі|старонак}}.',
@@ -2281,29 +2298,31 @@ $1',
 
 'enotif_mailer' => 'Служба паштовага апавяшчэньня {{GRAMMAR:родны|{{SITENAME}}}}',
 'enotif_reset' => 'Пазначыць усе старонкі як прагледжаныя',
-'enotif_newpagetext' => 'Гэта новая старонка.',
 'enotif_impersonal_salutation' => 'Удзельнік {{GRAMMAR:родны|{{SITENAME}}}}',
-'changed' => 'зьмененая',
-'created' => 'створаная',
-'enotif_subject' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} $PAGETITLE была $CHANGEDORCREATED ўдзельнікам $PAGEEDITOR',
+'enotif_subject_deleted' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была выдаленая {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_subject_created' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была створаная {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_subject_moved' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была перанесеная {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_subject_restored' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была адноўленая {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_subject_changed' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была зьмененая {{GENDER:$2|удзельнікам|удзельніцай}} $2',
+'enotif_body_intro_deleted' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была выдаленая $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цяперашнюю вэрсію глядзіце $3.',
+'enotif_body_intro_created' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была створаная $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цяперашнюю вэрсію глядзіце $3.',
+'enotif_body_intro_moved' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была перанесеная $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цяперашнюю вэрсію глядзіце $3.',
+'enotif_body_intro_restored' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была адноўленая $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цяперашнюю вэрсію глядзіце $3.',
+'enotif_body_intro_changed' => 'Старонка {{GRAMMAR:родны|{{SITENAME}}}} «$1» была зьмененая $PAGEEDITDATE {{GENDER:$2|удзельнікам|удзельніцай}} $2, па цяперашнюю вэрсію глядзіце $3.',
 'enotif_lastvisited' => 'Глядзіце на $1 усе апошнія зьмены, якія адбыліся пасьля Вашага апошняга наведваньня.',
 'enotif_lastdiff' => 'Глядзіце $1, каб пабачыць гэтую зьмену.',
 'enotif_anon_editor' => 'ананімны ўдзельнік $1',
-'enotif_body' => 'Шаноўны $WATCHINGUSERNAME,
-
-
-Старонка $PAGETITLE {{GRAMMAR:родны|{{SITENAME}}}} была $CHANGEDORCREATED $PAGEEDITDATE $PAGEEDITOR, глядзіце цяперашнюю вэрсію на $PAGETITLE_URL.
+'enotif_body' => 'Вітаем, $WATCHINGUSERNAME.
 
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
\9aаÑ\80оÑ\82кае Ð°пісаньне зьменаў: $PAGESUMMARY $PAGEMINOREDIT
\90пісаньне зьменаў: $PAGESUMMARY $PAGEMINOREDIT
 
-Зьвязацца з аўтарам:
-электронная пошта: $PAGEEDITOR_EMAIL
²Ñ\96кÑ\96\81Ñ\82аÑ\80онка: $PAGEEDITOR_WIKI
+Зьвязацца з рэдактарам:
+па электроннай пошце: $PAGEEDITOR_EMAIL
¿Ñ\80азÑ\8c Ð²Ñ\96кÑ\96\81Ñ\82аÑ\80онкÑ\83: $PAGEEDITOR_WIKI
 
-Паведамленьні ня будуць дасылацца ў выпадку паўторных рэдагаваньняў, пакуль Вы не наведаеце гэтую старонку.
-Вы можаце пазначыць сьцяжкі дасылкі паведамленьняў для ўсіх старонках назіраньня Вашага сьпісу назіраньня.
+Паведамленьні ня будуць дасылацца ў выпадку паўторных рэдагаваньняў, пакуль Вы не наведаеце гэтую старонку. Вы можаце пазначыць сьцяжкі дасылкі паведамленьняў для ўсіх старонках назіраньня Вашага сьпісу назіраньня.
 
              Сыстэма паведамленьняў {{GRAMMAR:родны|{{SITENAME}}}}
 
@@ -2335,7 +2354,7 @@ $UNWATCHURL
 'actioncomplete' => 'Дзеяньне выкананае',
 'actionfailed' => 'Дзеяньне ня выкананае',
 'deletedtext' => '«$1» была выдаленая.
\93лÑ\8fдзÑ\96Ñ\86е Ð¶Ñ\83Ñ\80нал Ð²Ñ\8bдаленÑ\8cнÑ\8fÑ\9e Ñ\83 $2.',
\97апÑ\96Ñ\81Ñ\8b Ð¿Ñ\80а Ð²Ñ\8bдаленÑ\8bÑ\8f Ñ\81Ñ\82аÑ\80онкÑ\96 Ð·Ñ\8cмÑ\8fÑ\88Ñ\87аÑ\8eÑ\86Ñ\86а Ñ\9e $2.',
 'dellogpage' => 'Журнал выдаленьняў',
 'dellogpagetext' => 'Сьпіс апошніх выдаленьняў.',
 'deletionlog' => 'журнал выдаленьняў',
@@ -2474,7 +2493,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|адноўленая $1 вэрсія|адноўленыя $1 вэрсіі|адноўленыя $1 вэрсіяў}}',
 'undeletedrevisions-files' => 'адноўленыя $1 {{PLURAL:$1|вэрсія|вэрсіі|вэрсіяў}} і $2 {{PLURAL:$2|файл|файлы|файлаў}}',
 'undeletedfiles' => '{{PLURAL:$1|адноўлены $1 файл|адноўленыя $1 файлы|адноўленыя $1 файлаў}}',
-'cannotundelete' => 'Аднаўленьне не адбылося; нехта іншы мог пасьпець аднавіць старонку раней.',
+'cannotundelete' => 'Памылка аднаўленьня:
+$1',
 'undeletedpage' => "'''Старонка $1 была адноўленая'''
 
 Глядзіце [[Special:Log/delete|журнал выдаленьняў]] для прагляду апошніх выдаленьняў і аднаўненьняў.",
@@ -2506,9 +2526,9 @@ $1',
 'blanknamespace' => '(Асноўная)',
 
 # Contributions
-'contributions' => 'Унёсак',
+'contributions' => 'Унёсак {{GENDER:$1|удзельніка|удзельніцы}}',
 'contributions-title' => 'Унёсак {{GENDER:$1|удзельніка|удзельніцы}} $1',
-'mycontris' => 'Ð\9cой Ñ\83нёсак',
+'mycontris' => 'Унёсак',
 'contribsub2' => 'Для $1 ($2)',
 'nocontribs' => 'Ня знойдзена зьменаў, якія адпавядаюць гэтым крытэрыям.',
 'uctop' => ' (апошняя)',
@@ -2555,7 +2575,7 @@ $1',
 'autoblockid' => 'Аўтаматычнае блякаваньне №$1',
 'block' => 'Заблякаваць удзельніка',
 'unblock' => 'Разблякаваць удзельніка',
-'blockip' => 'Ð\91лÑ\8fкаванÑ\8cне Ñ\9eдзелÑ\8cнÑ\96ка Ñ\86Ñ\96 Ñ\9eдзелÑ\8cнÑ\96Ñ\86Ñ\8b',
+'blockip' => 'Ð\97аблÑ\8fкаваÑ\86Ñ\8c',
 'blockip-title' => 'Блякаваньне ўдзельніка ці ўдзельніцы',
 'blockip-legend' => 'Заблякаваць удзельніка',
 'blockiptext' => 'Наступная форма дазваляе заблякаваць магчымасьць рэдагаваньня з пэўнага IP-адрасу альбо імя ўдзельніка. Гэта трэба рабіць толькі дзеля прадухіленьня вандалізму і згодна з [[{{MediaWiki:Policy-url}}|правіламі]]. Пазначце ніжэй дакладную прычыну (напрыклад, пералічыце асобныя старонкі, на якіх былі парушэньні).',
@@ -2774,6 +2794,7 @@ $1',
 'immobile-target-namespace-iw' => 'Інтэрвікі-спасылка — няслушная назва для пераносу старонкі.',
 'immobile-source-page' => 'Гэтую старонку нельга пераносіць.',
 'immobile-target-page' => 'Немагчыма перанесьці старонку пад гэтую назву.',
+'bad-target-model' => 'Выніковая старонка выкарыстоўвае іншы тып зьместу. Немагчыма пераўтварыць $1 у $2.',
 'imagenocrossnamespace' => 'Нельга перанесьці файл у ня-файлавую прастору назваў',
 'nonfile-cannot-move-to-file' => 'Нельга перанесьці ня файл у прастору назваў файлаў',
 'imagetypemismatch' => 'Новае пашырэньне файла не адпавядае яго тыпу',
@@ -2904,7 +2925,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Тэставаньне JavaScript',
-'javascripttest-disabled' => 'Гэтая функцыя не была ўключаная ў гэтай вікі.',
 'javascripttest-title' => 'Праводзіцца тэставаньне $1',
 'javascripttest-pagetext-noframework' => 'Гэтая старонка трымаецца для правядзеньня тэстаў JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Невядомая бібліятэка тэставаньня «$1».',
@@ -2914,7 +2934,7 @@ $1',
 'javascripttest-qunit-heading' => 'Набор QUnit-тэстаў для MediaWiki JavaScript',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ваша старонка ўдзельніка',
+'tooltip-pt-userpage' => 'Вашая ўласная старонка',
 'tooltip-pt-anonuserpage' => 'Старонка ўдзельніка для IP-адрасу, зь якога Вы рэдагуеце',
 'tooltip-pt-mytalk' => 'Ваша старонка гутарак',
 'tooltip-pt-anontalk' => 'Старонка гутарак пра рэдагаваньні, зробленыя з гэтага IP-адрасу',
@@ -2947,7 +2967,7 @@ $1',
 'tooltip-n-currentevents' => 'Атрымаць інфармацыю пра актуальныя падзеі',
 'tooltip-n-recentchanges' => 'Сьпіс апошніх зьменаў у {{GRAMMAR:месны|{{SITENAME}}}}.',
 'tooltip-n-randompage' => 'Паказаць выпадковую старонку',
-'tooltip-n-help' => 'Месца, каб пра ўсё даведацца.',
+'tooltip-n-help' => 'Месца, каб пра ўсё даведацца',
 'tooltip-t-whatlinkshere' => 'Сьпіс усіх старонак, якія спасылаюцца на гэтую',
 'tooltip-t-recentchangeslinked' => 'Апошнія зьмены ў старонках, на якія спасылаецца гэтая старонка',
 'tooltip-feed-rss' => 'RSS-стужка для гэтай старонкі',
@@ -3011,6 +3031,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Інфармацыя пра «$1»',
+'pageinfo-not-current' => 'Даруйце, мы ня можам падаць гэтыя зьвесткі для старых вэрсіяў.',
 'pageinfo-header-basic' => 'Асноўныя зьвесткі',
 'pageinfo-header-edits' => 'Рэдагаваньні',
 'pageinfo-header-restrictions' => 'Абарона старонкі',
@@ -3019,6 +3040,7 @@ $1',
 'pageinfo-default-sort' => 'Перадвызначаны ключ сартаваньня',
 'pageinfo-length' => 'Памер старонкі (у байтах)',
 'pageinfo-article-id' => 'Ідэнтыфікатар старонкі',
+'pageinfo-language' => 'Мова зьместу старонкі',
 'pageinfo-robot-policy' => 'Індэксацыя пашукавікамі',
 'pageinfo-robot-index' => 'Індэксуецца',
 'pageinfo-robot-noindex' => 'Не індэксуецца',
@@ -3035,10 +3057,17 @@ $1',
 'pageinfo-authors' => 'Колькасьць аўтараў',
 'pageinfo-recent-edits' => 'Колькасьць апошніх рэдагаваньняў (за $1)',
 'pageinfo-recent-authors' => 'Колькасьць апошніх аўтараў',
-'pageinfo-restriction' => 'Стан аховы ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Магічнае слова|Магічныя словы}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Схаваная катэгорыя|Схаваныя катэгорыі}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Шаблён|Шаблёны}} ($1)',
+'pageinfo-toolboxlink' => 'Зьвесткі пра старонку',
+'pageinfo-redirectsto' => 'Перанакіроўвае на',
+'pageinfo-redirectsto-info' => 'інфармацыя',
+'pageinfo-contentpage' => 'Лічыцца артыкулам',
+'pageinfo-contentpage-yes' => 'Так',
+'pageinfo-protect-cascading' => 'Адсюль пачынаецца каскадная абарона',
+'pageinfo-protect-cascading-yes' => 'Так',
+'pageinfo-protect-cascading-from' => 'Каскадная абароная пачынаецца з',
 
 # Skin names
 'skinname-standard' => 'Клясычнае',
@@ -3061,6 +3090,8 @@ $1',
 'markedaspatrollederror' => 'Немагчыма пазначыць як «патруляваную»',
 'markedaspatrollederrortext' => 'Вы мусіце абраць вэрсію, каб пазначыць яе «патруляванай».',
 'markedaspatrollederror-noautopatrol' => 'Вам не дазволена пазначаць Вашыя ўласныя зьмены як «патруляваныя».',
+'markedaspatrollednotify' => 'Гэтая зьмена ў «$1» была пазначаная як патруляваная.',
+'markedaspatrollederrornotify' => 'Не атрымалася адпатруляваць старонку.',
 
 # Patrol log
 'patrol-log-page' => 'Журнал патруляваньняў',
@@ -3127,11 +3158,14 @@ $1',
 'hours' => '$1 {{PLURAL:$1|гадзіна|гадзіны|гадзінаў}}',
 'days' => '$1 {{PLURAL:$1|дзень|дні|дзён}}',
 'ago' => '$1 таму',
+'just-now' => 'толькі што',
 
 # Bad image list
 'bad_image_list' => 'Фармат наступны:
 
-Разглядаюцца толькі элемэнты сьпісу (радкі, якія пачынаюцца з *). Першая спасылка ў радку мусіць быць спасылкай на кепскую выяву. Усе наступныя спасылкі ў тым жа радку будуць разглядацца як выключэньні, напрыклад, старонкі, дзе можа зьяўляцца выява.',
+Разглядаюцца толькі элемэнты сьпісу (радкі, якія пачынаюцца з *).
+Першая спасылка ў радку мусіць быць спасылкай на кепскую выяву.
+Усе наступныя спасылкі ў тым жа радку будуць разглядацца як выключэньні, напрыклад, старонкі, дзе можа зьяўляцца выява.',
 
 # Metadata
 'metadata' => 'Мэтазьвесткі',
@@ -3615,6 +3649,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Улучэньне інтэрвікі было адключанае]',
 'scarytranscludefailed' => '[Памылка атрыманьня шаблёну $1]',
+'scarytranscludefailed-httpstatus' => '[Памылка атрыманьня шаблёну $1: HTTP $2]',
 'scarytranscludetoolong' => '[Занадта даўгі URL-адрас]',
 
 # Delete conflict
@@ -3667,6 +3702,11 @@ $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 ЁБ',
 
 # Live preview
 'livepreview-loading' => 'Загрузка…',
@@ -3737,6 +3777,7 @@ $5
 'version-license' => 'Ліцэнзія',
 'version-poweredby-credits' => "{{SITENAME}} працуе на праграмным забесьпячэньні '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'іншыя',
+'version-credits-summary' => 'Нам вельмі хацелася б адзначыць наступных асобаў, што зрабілі ўнёсак у [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki зьяўляецца вольным праграмным забесьпячэньнем, якое Вы можаце распаўсюджваць і/ці зьмяняць на ўмовах ліцэнзіі GNU General Public License вэрсіі 2 ці болей позьняй, апублікаванай Фундацыяй вольнага праграмнага забесьпячэньня (Free Software Foundation).
 
 MediaWiki распаўсюджваецца з надзеяй, што будзе карысным, але БЕЗ АНІЯКІХ ГАРАНТЫЯЎ, нават без меркаваных гарантыяў КАМЭРЦЫЙНАЙ КАШТОЎНАСЬЦІ ці ПРЫДАТНАСЬЦІ ДА ПЭЎНАЙ МЭТЫ. Глядзіце ліцэнзію GNU General Public License для болей падрабязных зьвестак.
@@ -3748,6 +3789,8 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'version-entrypoints' => 'Уваходныя адрасы',
 'version-entrypoints-header-entrypoint' => 'Пункт уваходу',
 'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Шлях да артыкула]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Пуць да скрыпту]',
 
 # Special:FilePath
 'filepath' => 'Шлях да файла',
@@ -3876,8 +3919,8 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 '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-newusers' => 'Быў створаны рахунак $1',
+'logentry-newusers-create' => 'Быў створаны рахунак $1',
 'logentry-newusers-create2' => '$1 стварыў рахунак $3',
 'logentry-newusers-autocreate' => 'Рахунак $1 быў створаны аўтаматычна',
 'newuserlog-byemail' => 'Пароль адасланы па электроннай пошце',
@@ -3898,6 +3941,10 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'feedback-bugcheck' => 'Выдатна! Толькі праверце, магчыма гэтыя памылкі ўжо [$1 вядомыя].',
 'feedback-bugnew' => 'Я праверыў. Гэта новая памылка',
 
+# Search suggestions
+'searchsuggest-search' => 'Пошук',
+'searchsuggest-containing' => 'утрымлівае...',
+
 # API errors
 'api-error-badaccess-groups' => 'У Вас няма дазволу загружаць файлы ў гэтую вікі.',
 'api-error-badtoken' => 'Унутраная памылка: няслушны ключ.',
@@ -3950,4 +3997,6 @@ MediaWiki распаўсюджваецца з надзеяй, што будзе
 'duration-centuries' => '$1 {{PLURAL:$1|стагодзьдзе|стагодзьдзі|стагодзьдзяў}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тысячагодзьдзе|тысячагодзьдзі|тысячагодзьдзяў}}',
 
+# Unknown messages
+'svg-long-error' => 'Няслушны SVG-файл: $1',
 );
index e8aec2e..40260ac 100644 (file)
@@ -48,98 +48,6 @@ $namespaceAliases = array(
        'Картинка беседа' => NS_FILE_TALK,
 );
 
-
-$datePreferences = false;
-
-$bookstoreList = array(
-       'books.bg'   => 'http://www.books.bg/ISBN/$1',
-       'Пингвините' => 'http://www.pe-bg.com/?cid=3&search_q=$1&where=ISBN&x=0&y=0**',
-       'Бард'       => 'http://www.bard.bg/search/?q=$1'
-);
-
-$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__' ),
-);
-
 $specialPageAliases = array(
        'Activeusers'               => array( 'Активни_потребители' ),
        'Allmessages'               => array( 'Системни_съобщения' ),
@@ -232,6 +140,97 @@ $specialPageAliases = array(
        'Withoutinterwiki'          => 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__' ),
+);
+
+$datePreferences = false;
+
+$bookstoreList = array(
+       'books.bg'   => 'http://www.books.bg/ISBN/$1',
+       'Пингвините' => 'http://www.pe-bg.com/?cid=3&search_q=$1&where=ISBN&x=0&y=0**',
+       'Бард'       => 'http://www.bard.bg/search/?q=$1'
+);
+
 $linkTrail = '/^([a-zабвгдежзийклмнопрстуфхцчшщъыьэюя]+)(.*)$/sDu';
 
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -372,8 +371,8 @@ $messages = array(
 'newwindow' => '(отваря се в нов прозорец)',
 'cancel' => 'Отказ',
 'moredotdotdot' => 'Още…',
-'mypage' => 'Ð\9cоÑ\8fÑ\82а Ñ\81траница',
-'mytalk' => 'Ð\9cоÑ\8fÑ\82а Ð±еседа',
+'mypage' => 'Страница',
+'mytalk' => 'Ð\91еседа',
 'anontalk' => 'Беседа за адреса',
 'navigation' => 'Навигация',
 'and' => '&#32;и',
@@ -383,7 +382,6 @@ $messages = array(
 'qbbrowse' => 'Избор',
 'qbedit' => 'Редактиране',
 'qbpageoptions' => 'Тази страница',
-'qbpageinfo' => 'Информация за страницата',
 'qbmyoptions' => 'Моите страници',
 'qbspecialpages' => 'Специални страници',
 'faq' => 'ЧЗВ',
@@ -396,7 +394,7 @@ $messages = array(
 'vector-action-protect' => 'Защита',
 'vector-action-undelete' => 'Възстановяване',
 'vector-action-unprotect' => 'Промяна на защитата',
-'vector-simplesearch-preference' => 'Ð\92клÑ\8eÑ\87ване Ð½Ð° Ð¿Ñ\80едложенииÑ\8f Ð¿Ñ\80и Ñ\82Ñ\8aÑ\80Ñ\81ене (Ñ\81амо Ð·Ð° Ð¸Ð·Ð³Ð»ÐµÐ´а Vector)',
+'vector-simplesearch-preference' => 'Ð\92клÑ\8eÑ\87ване Ð½Ð° Ð¾Ð¿Ñ\80оÑ\81Ñ\82ена Ð»ÐµÐ½Ñ\82а Ð·Ð° Ñ\82Ñ\8aÑ\80Ñ\81ене (Ñ\81амо Ð·Ð° Ð¾Ð±Ð»Ð¸Ðºа Vector)',
 'vector-view-create' => 'Създаване',
 'vector-view-edit' => 'Редактиране',
 'vector-view-history' => 'История',
@@ -406,6 +404,7 @@ $messages = array(
 'namespaces' => 'Именни пространства',
 'variants' => 'Варианти',
 
+'navigation-heading' => 'Навигация',
 'errorpagetitle' => 'Грешка',
 'returnto' => 'Обратно към $1.',
 'tagline' => 'от {{SITENAME}}',
@@ -503,6 +502,8 @@ $1',
 'youhavenewmessages' => 'Имате $1 ($2).',
 'newmessageslink' => 'нови съобщения',
 'newmessagesdifflink' => 'разлика с предишната версия',
+'youhavenewmessagesfromusers' => 'Имате $1 от {{PLURAL:$3|друг потребител|$3 потребители}} ($2).',
+'youhavenewmessagesmanyusers' => 'Имате $1 от много потребители ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|ново съобщение|нови съобщения}}',
 'youhavenewmessagesmulti' => 'Имате нови съобщения в $1',
 'editsection' => 'редактиране',
@@ -635,11 +636,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Излязохте от системата.'''
 
-Можете да продължите да използвате {{SITENAME}} анонимно или да [[Special:UserLogin|влезете отново]] като друг потребител.
+Можете да продължите да използвате {{SITENAME}} анонимно или да <span class='plainlinks'>[$1 влезете отново]</span> като друг потребител.
 Обърнете внимание, че някои страници все още ще се показват така, сякаш сте влезли, докато не изтриете кеш-паметта на браузъра.",
-'welcomecreation' => '== Добре дошли, $1! ==
-
-Вашата сметка беше създадена.
+'welcomeuser' => 'Здравейте, $1!',
+'welcomecreation-msg' => 'Вашата сметка беше създадена.
 Можете да промените [[Special:Preferences|настройките на {{SITENAME}}]] според предпочитанията си.',
 'yourname' => 'Потребителско име:',
 'yourpassword' => 'Парола:',
@@ -886,9 +886,12 @@ $2
 
 ''Ако сте анонимен потребител и мислите, че тези неуместни коментари са отправени към вас, [[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-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' => 'В момента този потребител е блокиран.
@@ -989,6 +992,16 @@ $2
 'edit-already-exists' => 'Не можа да се създаде нова страница.
 Такава вече съществува.',
 'defaultmessagetext' => 'Текст на съобщението по подразбиране',
+'content-failed-to-parse' => 'Неуспех при анализиране на съдържанието от тип $2 за модела $1: $3',
+'invalid-content-data' => 'Невалидни данни за съдържание',
+'content-not-allowed-here' => '
+На страницата [[$2]] не е позволено използването на $1',
+
+# Content models
+'content-model-wikitext' => 'уикитекст',
+'content-model-text' => 'обикновен текст',
+'content-model-javascript' => 'Джаваскрипт',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Внимание: Тази страница прекалено много пъти използва ресурсоемки парсерни функции.
@@ -1003,6 +1016,8 @@ $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' => 'Страница превишава възел-брой',
 
 # "Undo" feature
 'undo-success' => 'Редакцията може да бъде върната. Прегледайте долното сравнение и се уверете, че наистина искате да го направите. След това съхранете страницата, за да извършите връщането.',
@@ -1229,8 +1244,6 @@ $1",
 'search-interwiki-caption' => 'Сродни проекти',
 'search-interwiki-default' => '$1 резултата:',
 'search-interwiki-more' => '(още)',
-'search-mwsuggest-enabled' => 'с предположения',
-'search-mwsuggest-disabled' => 'без предположения',
 'search-relatedarticle' => 'Свързани',
 'mwsuggest-disable' => 'Изключване на AJAX предположенията',
 'searcheverything-enable' => 'Търсене във всички именни пространства',
@@ -1493,6 +1506,9 @@ $1",
 'rightslog' => 'Дневник на потребителските права',
 'rightslogtext' => 'Това е дневник на промените на потребителски права.',
 'rightslogentry' => 'промени потребителската група на $1 от $2 в $3',
+'rightslogentry-autopromote' => 'автоматично е повишен от $2 до$3',
+'logentry-rights-autopromote' => '
+$1 е автоматично повишен от $4 до $5',
 'rightsnone' => '(никакви)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1564,9 +1580,11 @@ $1",
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|наблюдаващ потребител|наблюдаващи потребители}}]',
 'rc_categories' => 'Само от категории (разделител „|“)',
 'rc_categories_any' => 'Която и да е',
+'rc-change-size-new' => '$1 {{PLURAL:$1|байт|байта}} след редакцията',
 'newsectionsummary' => 'Нова тема /* $1 */',
 'rc-enhanced-expand' => 'Показване на детайли (изисква JavaScript)',
 'rc-enhanced-hide' => 'Скриване на детайли',
+'rc-old-title' => 'първоначално създадена като „$1“',
 
 # Recent changes linked
 'recentchangeslinked' => 'Свързани промени',
@@ -2160,11 +2178,7 @@ $1',
 
 'enotif_mailer' => 'Известяване по пощата на {{SITENAME}}',
 'enotif_reset' => 'Отбелязване на всички страници като посетени',
-'enotif_newpagetext' => 'Това е нова страница.',
 'enotif_impersonal_salutation' => 'Потребител на {{SITENAME}}',
-'changed' => 'променена',
-'created' => 'създадена',
-'enotif_subject' => 'Страницата $PAGETITLE в {{SITENAME}} е била $CHANGEDORCREATED от $PAGEEDITOR',
 'enotif_lastvisited' => 'Преглед на всички промени след последното ви посещение: $1.',
 'enotif_lastdiff' => 'Преглед на тази промяна: $1.',
 'enotif_anon_editor' => 'анонимен потребител $1',
@@ -2232,6 +2246,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}}]]), не може да бъде отменена. Някой друг вече е редактирал страницата или е отменил промените.
@@ -2335,7 +2351,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|Една версия беше възстановена|$1 версии бяха възстановени}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|Една версия|$1 версии}} и {{PLURAL:$1|един файл|$2 файла}} бяха възстановени',
 'undeletedfiles' => '{{PLURAL:$1|Един файл беше възстановен|$1 файла бяха възстановени}}',
-'cannotundelete' => 'Грешка при възстановяването. Възможно е някой друг вече да е възстановил страницата.',
+'cannotundelete' => 'Възстановяването беше неуспешно:
+$1',
 'undeletedpage' => "'''Страницата „$1“ беше възстановена.'''
 
 Можете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
@@ -2368,7 +2385,7 @@ $1',
 # Contributions
 'contributions' => 'Приноси',
 'contributions-title' => 'Потребителски приноси за $1',
-'mycontris' => 'Ð\9cоиÑ\82е Ð¿риноси',
+'mycontris' => 'Ð\9fриноси',
 'contribsub2' => 'За $1 ($2)',
 'nocontribs' => 'Не са намерени промени, отговарящи на критерия.',
 'uctop' => ' (последна)',
@@ -2750,7 +2767,6 @@ $1',
 'import-logentry-interwiki-detail' => '{{PLURAL:$1|една версия|$1 версии}} на $2 бяха внесени',
 
 # JavaScriptTest
-'javascripttest-disabled' => 'Тази функционалност не е активирана в това уики.',
 'javascripttest-pagetext-noframework' => 'Тази страница е запазена за изпълнение на Джаваскрипт тестове.',
 'javascripttest-qunit-intro' => 'Вижте [$1 тестовата документация] на mediawiki.org.',
 
@@ -2869,6 +2885,8 @@ $1',
 'pageinfo-edits' => 'Общ брой редакции',
 'pageinfo-authors' => 'Общ брой на отделните автори',
 'pageinfo-magic-words' => '{{PLURAL:$1|Вълшебна думичка|Вълшебни думички}} ($1)',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading-yes' => 'Да',
 
 # Skin names
 'skinname-standard' => 'Класика',
@@ -3625,8 +3643,8 @@ MediaWiki се разпространява с надеждата, че ще б
 '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-newusers' => 'Потребителската сметка $1 беше създадена',
+'logentry-newusers-create' => 'Потребителската сметка $1 беше създадена',
 'logentry-newusers-create2' => '$1 създаде потребителска сметка $3',
 'logentry-newusers-autocreate' => 'Сметката $1 беше създадена автоматично',
 'newuserlog-byemail' => 'паролата е изпратена по е-поща',
@@ -3643,6 +3661,9 @@ MediaWiki се разпространява с надеждата, че ще б
 'feedback-thanks' => 'Благодарности! Вашата обратна информация е публикувана на страницата „[$2  $1]“.',
 'feedback-close' => 'Готово',
 
+# Search suggestions
+'searchsuggest-search' => 'Търсене',
+
 # API errors
 'api-error-badaccess-groups' => 'Нямате необходимите права, за да качвате файлове в това уики.',
 'api-error-badtoken' => 'Вътрешна грешка: неправилен маркер.',
index 577d2e2..e005efe 100644 (file)
@@ -91,7 +91,6 @@ $messages = array(
 'qbbrowse' => 'ब्राउज',
 'qbedit' => 'सम्पादन',
 'qbpageoptions' => 'ई पन्ना',
-'qbpageinfo' => 'प्रसंग',
 'qbmyoptions' => 'हमार पन्ना',
 'qbspecialpages' => 'विशेष पन्ना',
 'faq' => 'साधारण सवाल',
@@ -422,8 +421,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'search-interwiki-caption' => 'बहिन परियोजना',
 'search-interwiki-default' => '$1 के परिणाम:',
 'search-interwiki-more' => '(अउर)',
-'search-mwsuggest-enabled' => 'सुझाव के साथ',
-'search-mwsuggest-disabled' => 'कौनो सुझाव ना',
 'search-relatedarticle' => 'संबंधित',
 'mwsuggest-disable' => 'AJAX सुझाव असक्षम',
 'searcheverything-enable' => 'सभन सन्दर्भ में खोजीं',
@@ -540,9 +537,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'watching' => 'ध्यानसूची में जाते हुए',
 'unwatching' => 'ध्यानसूची से हटते हुए',
 
-'enotif_newpagetext' => 'इ एगो नया पन्ना ह',
-'created' => 'बनावल गईल',
-
 # Undelete
 'undeletelink' => 'देखीं/बहाल करीं',
 
index 1e02306..014a8ec 100644 (file)
@@ -126,7 +126,6 @@ $messages = array(
 'qbbrowse' => 'ब्राउज',
 'qbedit' => 'सम्पादन',
 'qbpageoptions' => 'ई पन्ना',
-'qbpageinfo' => 'प्रसंग',
 'qbmyoptions' => 'हमार पन्ना',
 'qbspecialpages' => 'विशेष पन्ना',
 'faq' => 'साधारण सवाल',
@@ -459,8 +458,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'search-interwiki-caption' => 'बहिन परियोजना',
 'search-interwiki-default' => '$1 के परिणाम:',
 'search-interwiki-more' => '(अउर)',
-'search-mwsuggest-enabled' => 'सुझाव के साथ',
-'search-mwsuggest-disabled' => 'कौनो सुझाव ना',
 'search-relatedarticle' => 'संबंधित',
 'mwsuggest-disable' => 'AJAX सुझाव असक्षम',
 'searcheverything-enable' => 'सभन सन्दर्भ में खोजीं',
@@ -577,9 +574,6 @@ Legend: '''({{int:cur}})''' = हाल के संशोधन के सा
 'watching' => 'ध्यानसूची में जाते हुए',
 'unwatching' => 'ध्यानसूची से हटते हुए',
 
-'enotif_newpagetext' => 'इ एगो नया पन्ना ह',
-'created' => 'बनावल गईल',
-
 # Undelete
 'undeletelink' => 'देखीं/बहाल करीं',
 
index a254380..4b28f49 100644 (file)
 
 $messages = array(
 'underline-always' => 'Oltaem',
-'underline-never'  => 'Neva',
+'underline-never' => 'Neva',
 
 # Dates
-'sunday'        => 'Sande',
-'monday'        => 'Mande',
-'tuesday'       => 'Tusde',
-'wednesday'     => 'Wenesde',
-'thursday'      => 'Tosde',
-'friday'        => 'Fraede',
-'saturday'      => 'Sarede',
-'sun'           => 'San',
-'mon'           => 'Man',
-'tue'           => 'Tu',
-'wed'           => 'Wen',
-'thu'           => 'To',
-'fri'           => 'Frae',
-'sat'           => 'Sar',
-'january'       => 'Januware',
-'february'      => 'Februari',
-'march'         => 'Maj',
-'april'         => 'Epril',
-'may_long'      => 'Mei',
-'june'          => 'Jun',
-'july'          => 'Julae',
-'august'        => 'Ogis',
-'september'     => 'Septemba',
-'october'       => 'Oktoba',
-'november'      => 'Novemba',
-'december'      => 'Desemba',
-'january-gen'   => 'Januware',
-'february-gen'  => 'Februari',
-'march-gen'     => 'Maj',
-'april-gen'     => 'Epril',
-'may-gen'       => 'Mei',
-'june-gen'      => 'Jun',
-'july-gen'      => 'Julae',
-'august-gen'    => 'Ogis',
+'sunday' => 'Sande',
+'monday' => 'Mande',
+'tuesday' => 'Tusde',
+'wednesday' => 'Wenesde',
+'thursday' => 'Tosde',
+'friday' => 'Fraede',
+'saturday' => 'Sarede',
+'sun' => 'San',
+'mon' => 'Man',
+'tue' => 'Tu',
+'wed' => 'Wen',
+'thu' => 'To',
+'fri' => 'Frae',
+'sat' => 'Sar',
+'january' => 'Januware',
+'february' => 'Februari',
+'march' => 'Maj',
+'april' => 'Epril',
+'may_long' => 'Mei',
+'june' => 'Jun',
+'july' => 'Julae',
+'august' => 'Ogis',
+'september' => 'Septemba',
+'october' => 'Oktoba',
+'november' => 'Novemba',
+'december' => 'Desemba',
+'january-gen' => 'Januware',
+'february-gen' => 'Februari',
+'march-gen' => 'Maj',
+'april-gen' => 'Epril',
+'may-gen' => 'Mei',
+'june-gen' => 'Jun',
+'july-gen' => 'Julae',
+'august-gen' => 'Ogis',
 'september-gen' => 'Septemba',
-'october-gen'   => 'Oktoba',
-'november-gen'  => 'Novemba',
-'december-gen'  => 'Desemba',
-'mar'           => 'Maj',
-'apr'           => 'Epr',
-'may'           => 'Mei',
-'aug'           => 'Ogis',
-'oct'           => 'Okt',
-'dec'           => 'Des',
+'october-gen' => 'Oktoba',
+'november-gen' => 'Novemba',
+'december-gen' => 'Desemba',
+'mar' => 'Maj',
+'apr' => 'Epr',
+'may' => 'Mei',
+'aug' => 'Ogis',
+'oct' => 'Okt',
+'dec' => 'Des',
 
 'mypage' => 'Pej blong mi',
 'mytalk' => 'Tingting blong mi',
-'and'    => '&#32;mo',
+'and' => '&#32;mo',
 
 # Cologne Blue skin
-'qbedit'         => 'Jenisim hem',
-'qbpageoptions'  => 'Pej ia',
-'qbmyoptions'    => 'Ol pej blong mi',
+'qbedit' => 'Jenisim hem',
+'qbpageoptions' => 'Pej ia',
+'qbmyoptions' => 'Ol pej blong mi',
 'qbspecialpages' => 'Ol spesel pej',
 
-'edit'             => 'Jenisim hem',
-'newpage'          => 'Mekem niu pej',
+'edit' => 'Jenisim hem',
+'newpage' => 'Mekem niu pej',
 'talkpagelinktext' => 'Toktok',
-'specialpage'      => 'Spesel Pej',
-'talk'             => 'Tingting',
+'specialpage' => 'Spesel Pej',
+'talk' => 'Tingting',
 
 # 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).
-'mainpage'             => 'Nambawan Pej',
+'mainpage' => 'Nambawan Pej',
 'mainpage-description' => 'Nambawan Pej',
 
 'retrievedfrom' => 'Kam long "$1"',
-'editsection'   => 'jenisim hem',
-'editold'       => 'jenisim hem',
+'editsection' => 'jenisim hem',
+'editold' => 'jenisim hem',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'    => 'Atikel',
+'nstab-main' => 'Atikel',
 'nstab-special' => 'Spesel',
 
 # Edit pages
@@ -100,15 +100,15 @@ $messages = array(
 
 # Miscellaneous special pages
 'shortpages' => 'Ol smol pej',
-'longpages'  => 'Ol big pej',
-'newpages'   => 'Ol niu pej',
+'longpages' => 'Ol big pej',
+'newpages' => 'Ol niu pej',
 
 # Special:AllPages
 'allarticles' => 'Olgeta atikel',
 
 # E-mail user
 'emailfrom' => 'Kam long',
-'emailto'   => 'Go long:',
+'emailto' => 'Go long:',
 
 # Contributions
 'year' => 'Yia:',
@@ -120,28 +120,28 @@ $messages = array(
 
 # Move page
 'move-page-legend' => 'Muvum pej',
-'movearticle'      => 'Muvum pej:',
+'movearticle' => 'Muvum pej:',
 
 # Namespace 8 related
 'allmessagesname' => 'Nem',
 
 # Tooltip help for the actions
-'tooltip-pt-mytalk'  => 'Pej blong tingting blong mi',
-'tooltip-p-logo'     => 'Nambawan Pej',
+'tooltip-pt-mytalk' => 'Pej blong tingting blong mi',
+'tooltip-p-logo' => 'Nambawan Pej',
 'tooltip-n-mainpage' => 'Go long Nambawan Pej',
-'tooltip-minoredit'  => 'Em i stap wan smol jenis',
+'tooltip-minoredit' => 'Em i stap wan smol jenis',
 
 # Special:NewFiles
 'showhidebots' => '($1 bot)',
 
 # EXIF tags
-'exif-imagedescription'    => 'Nem blong pikta',
+'exif-imagedescription' => 'Nem blong pikta',
 'exif-exposuretime-format' => '$1 sek. ($2)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'olgeta',
 'namespacesall' => 'olgeta',
-'monthsall'     => 'olgeta',
+'monthsall' => 'olgeta',
 
 # Table pager
 'table_pager_first' => 'Nambawan pej',
index ef3492e..9542b65 100644 (file)
@@ -114,7 +114,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Paubahan_pahanyarnya' ),
        'Recentchangeslinked'       => array( 'Paubahan_tarait' ),
        'Revisiondelete'            => array( 'Hapus_ralatan' ),
-       'RevisionMove'              => array( 'Ralatan_pamindahan' ),
        'Search'                    => array( 'Panggagaian' ),
        'Shortpages'                => array( 'Tungkaran_handap' ),
        'Specialpages'              => array( 'Tungkaran_istimiwa' ),
@@ -288,7 +287,6 @@ $messages = array(
 'qbbrowse' => 'Tangadahi',
 'qbedit' => 'Babak',
 'qbpageoptions' => 'Tungkaran ini',
-'qbpageinfo' => 'Naskah aluran',
 'qbmyoptions' => 'Tungkaran ulun',
 'qbspecialpages' => 'Tungkaran istimiwa',
 'faq' => 'FAQ',
@@ -540,11 +538,8 @@ Administrator nang takunci nintu manawarakan panjalasan: "$3".',
 # Login and logout pages
 'logouttext' => "'''Pian parhatan ni sudah kaluar log.'''
 
-Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa [[Special:UserLogin|babuat log pulang]] sawagai pamakai nang sama atawa sawagai pamakai balain.
+Pian kawa manyambung hagan mangguna'akan {{SITENAME}} kada bangaran, atawa Pian kawa <span class='plainlinks'>[$1 babuat log pulang]</span> sawagai pamakai nang sama atawa sawagai pamakai balain.
 Catatan bahwasa babarapa tungkaran pinanya masih ha tarus manampaiakan Pian masih babuat log, sampai Pian mahabisakan timbuluk panjalajah web Pian.",
-'welcomecreation' => '==Salamat datang, $1!==
-Akun Pian sudah diulah.
-Jangan kada ingat hagan maubah [[Special:Preferences|kakatujuan {{SITENAME}}]] Pian.',
 'yourname' => 'Ngaran pamakai:',
 'yourpassword' => 'Katasunduk:',
 'yourpasswordagain' => 'Katik pulang katasunduk:',
@@ -1148,8 +1143,6 @@ Catatan bahwasa mamuruk tautan napigasi akan mambulikakan setelan kolum ngini.',
 'search-interwiki-caption' => 'Dingsanak rangka gawian',
 'search-interwiki-default' => 'Kulihan $1',
 'search-interwiki-more' => '(lagi)',
-'search-mwsuggest-enabled' => 'awan saran',
-'search-mwsuggest-disabled' => 'kadada saran',
 'search-relatedarticle' => 'Bakulaan',
 'mwsuggest-disable' => "Kada kawa'akan sasaran AJAX",
 'searcheverything-enable' => 'Panggagaian pada samunyaan ngaran kakamar',
@@ -2135,11 +2128,7 @@ Parubahan-parubahan salanjutnya pada tungkaran ini dan tungkaran pamandiran tara
 
 'enotif_mailer' => 'Panyurili pamadahan {{SITENAME}}',
 'enotif_reset' => 'Tandai samunyaan tutungkaran sudah diilangi',
-'enotif_newpagetext' => 'Ngini adalah sabuah tungkaran hanyar.',
 'enotif_impersonal_salutation' => 'Pamuruk {{SITENAME}}',
-'changed' => "ta'ubah",
-'created' => "ta'ulah",
-'enotif_subject' => 'Tungkaran $PAGETITLE pintang {{SITENAME}} sudah $CHANGEDORCREATED ulih $PAGEEDITOR',
 'enotif_lastvisited' => 'Janaki $1 gasan samunyaan parubahan mula Pian pauncitan tadi bailang.',
 'enotif_lastdiff' => 'Janaki $1 hagaan maniringi parubahan ngini.',
 'enotif_anon_editor' => 'pamuruk kada-bangaran $1',
@@ -3690,6 +3679,10 @@ Salain ngitu, Pian kawa mamuruk prmulir nyaman di bawah ngini. Kumintar Pian aka
 'feedback-bugcheck' => 'Harat! hanyar dipariksa bahwasa ngini lainan salah asa [$1 bug nang dipinandui].',
 'feedback-bugnew' => 'Ulun mamariksa. Malapurakan sabuah bug hanyar',
 
+# Search suggestions
+'searchsuggest-search' => 'Gagai',
+'searchsuggest-containing' => 'isian ...',
+
 # API errors
 'api-error-missingresult' => 'Kasalahan intarnal: kada kawa manantuakan napakah panyalinan tuntung.',
 'api-error-mustbeloggedin' => 'Pian harus babuat ka log gasan maunggah barakas.',
index 58fe47f..95a0246 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Bambara (Bamanankan)
+/** Bambara (bamanankan)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -18,70 +18,70 @@ $messages = array(
 'tog-hideminor' => 'Yɛlɛmaliw kura fitini dogo',
 
 # Dates
-'sunday'    => 'karidon',
-'monday'    => 'ntɛnɛdon',
-'tuesday'   => 'taratadon',
+'sunday' => 'karidon',
+'monday' => 'ntɛnɛdon',
+'tuesday' => 'taratadon',
 'wednesday' => 'arabadon',
-'thursday'  => 'alamisadon',
-'friday'    => 'jumadon',
-'saturday'  => 'sibiridon',
-'august'    => 'uti',
-'aug'       => 'uti',
+'thursday' => 'alamisadon',
+'friday' => 'jumadon',
+'saturday' => 'sibiridon',
+'august' => 'uti',
+'aug' => 'uti',
 
 # Categories related messages
 'category_header' => 'Nyɛw cogoya kɔnɔ: "$1"',
 
 'article' => 'Nyɛ',
-'mypage'  => "N'ka nyɛ",
-'mytalk'  => "N'ka baronyɛ",
-'and'     => '&#32;ani',
+'mypage' => "N'ka nyɛ",
+'mytalk' => "N'ka baronyɛ",
+'and' => '&#32;ani',
 
 # Cologne Blue skin
-'qbfind'         => 'Nyini',
-'qbedit'         => 'Yɛlɛma',
+'qbfind' => 'Nyini',
+'qbedit' => 'Yɛlɛma',
 'qbspecialpages' => 'Nyɛw kɛrɛnkɛrɛnnen',
 
-'help'           => 'Dɛmɛ',
-'search'         => 'Nyini',
-'searchbutton'   => 'Nyini',
-'go'             => 'Taa',
-'searcharticle'  => 'Taa',
-'history'        => 'Nyɛka tariku',
-'history_short'  => 'Tariku',
-'edit'           => 'yɛlɛma',
-'editthispage'   => 'Nyɛ nin yɛlɛma',
-'newpage'        => 'Nyɛ kura',
-'specialpage'    => 'Nyɛ kɛrɛnkɛrɛnnen',
-'talk'           => 'Sɔsɔli',
-'toolbox'        => 'Minanw',
-'userpage'       => 'Utilisateur ka nyɛ',
-'imagepage'      => 'Janin ka nyɛ',
+'help' => 'Dɛmɛ',
+'search' => 'Nyini',
+'searchbutton' => 'Nyini',
+'go' => 'Taa',
+'searcharticle' => 'Taa',
+'history' => 'Nyɛka tariku',
+'history_short' => 'Tariku',
+'edit' => 'yɛlɛma',
+'editthispage' => 'Nyɛ nin yɛlɛma',
+'newpage' => 'Nyɛ kura',
+'specialpage' => 'Nyɛ kɛrɛnkɛrɛnnen',
+'talk' => 'Sɔsɔli',
+'toolbox' => 'Minanw',
+'userpage' => 'Utilisateur ka nyɛ',
+'imagepage' => 'Janin ka nyɛ',
 'otherlanguages' => 'Kanw wɛrɛ',
-'jumptosearch'   => 'Nyini',
+'jumptosearch' => 'Nyini',
 
 # 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).
-'currentevents'        => 'Kunnafoni',
-'currentevents-url'    => 'Project:Kunnafoni',
-'disclaimers'          => 'Kangari',
-'edithelp'             => 'Dɛmɛ',
-'mainpage'             => 'Nyɛ fɔlɔ',
+'currentevents' => 'Kunnafoni',
+'currentevents-url' => 'Project:Kunnafoni',
+'disclaimers' => 'Kangari',
+'edithelp' => 'Dɛmɛ',
+'mainpage' => 'Nyɛ fɔlɔ',
 'mainpage-description' => 'Nyɛ fɔlɔ',
-'portal'               => 'Jamaje',
+'portal' => 'Jamaje',
 
 'editsection' => 'yɛlɛma',
-'hidetoc'     => 'dogo',
+'hidetoc' => 'dogo',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Nyɛ',
-'nstab-image'    => 'Janin',
-'nstab-help'     => 'Dɛmɛ',
+'nstab-main' => 'Nyɛ',
+'nstab-image' => 'Janin',
+'nstab-help' => 'Dɛmɛ',
 'nstab-category' => 'Cogoya',
 
 # Edit pages
-'minoredit'      => 'Yɛlɛma fitini.',
-'watchthis'      => 'Nyɛ tulomajɔ',
-'newarticle'     => '(Kura)',
-'editing'        => '$1 ka yɛlɛmali',
+'minoredit' => 'Yɛlɛma fitini.',
+'watchthis' => 'Nyɛ tulomajɔ',
+'newarticle' => '(Kura)',
+'editing' => '$1 ka yɛlɛmali',
 'editingsection' => '$1 ka yɛlɛmali (section)',
 'editingcomment' => '$1 ka yɛlɛmali (baro)',
 
@@ -90,7 +90,7 @@ $messages = array(
 
 # Preferences page
 'preferences' => 'Fisayali',
-'prefs-skin'  => 'Apparence',
+'prefs-skin' => 'Apparence',
 
 # Recent changes
 'hide' => 'dogo',
@@ -103,9 +103,9 @@ $messages = array(
 
 # Miscellaneous special pages
 'popularpages' => 'Nyɛw les plus consultées',
-'newpages'     => 'Nyɛw kura',
+'newpages' => 'Nyɛw kura',
 'ancientpages' => 'Nyɛw les plus anciens',
-'move'         => 'telun',
+'move' => 'telun',
 'movethispage' => 'Nyɛ telun',
 
 # Special:AllPages
@@ -118,7 +118,7 @@ $messages = array(
 'linksearch-ok' => 'Nyini',
 
 # Watchlist
-'watch'         => 'Tulomajɔ',
+'watch' => 'Tulomajɔ',
 'watchthispage' => 'Nyɛ tulomajɔ',
 
 # Contributions
@@ -129,8 +129,8 @@ $messages = array(
 
 # Move page
 'move-page-legend' => 'Nyɛ telun',
-'movearticle'      => 'Nyɛ telun',
-'movepagebtn'      => 'Nyɛ telun',
+'movearticle' => 'Nyɛ telun',
+'movepagebtn' => 'Nyɛ telun',
 
 # Attribution
 'others' => 'wɛrɛ',
index 527957e..28fe789 100644 (file)
@@ -116,7 +116,7 @@ $messages = array(
 
 'underline-always' => 'সব সময়',
 'underline-never' => 'কখনো নয়',
-'underline-default' => 'ব্রাউজারে যেমনভাবে নির্দিষ্ট করা আছে',
+'underline-default' => 'সà§\8dà¦\95িন à¦\85থবা à¦¬à§\8dরাà¦\89à¦\9cারà§\87 à¦¯à§\87মনভাবà§\87 à¦¨à¦¿à¦°à§\8dদিষà§\8dà¦\9f à¦\95রা à¦\86à¦\9bà§\87',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'সম্পাদনা এলাকার ফন্ট স্টাইল:',
@@ -202,7 +202,7 @@ $messages = array(
 'cancel' => 'বাতিল',
 'moredotdotdot' => 'আরও...',
 'mypage' => 'আমার পাতা',
-'mytalk' => 'à¦\86মার à¦\86লাপ',
+'mytalk' => 'à¦\86লà§\8bà¦\9aনা',
 'anontalk' => 'এই বেনামী ব্যবহারকারীর আলাপের পাতা',
 'navigation' => 'পরিভ্রমণ',
 'and' => '&#32;এবং',
@@ -212,7 +212,6 @@ $messages = array(
 'qbbrowse' => 'ব্রাউজ',
 'qbedit' => 'সম্পাদনা',
 'qbpageoptions' => 'এ পাতার বিকল্পসমূহ',
-'qbpageinfo' => 'পাতা-সংক্রান্ত তথ্য',
 'qbmyoptions' => 'আমার পছন্দ',
 'qbspecialpages' => 'বিশেষ পাতাসমূহ',
 'faq' => 'সম্ভাব্য প্রশ্নসমূহ',
@@ -225,7 +224,7 @@ $messages = array(
 'vector-action-protect' => 'সুরক্ষা',
 'vector-action-undelete' => 'পুনরুদ্ধার',
 'vector-action-unprotect' => 'সুরক্ষা পরিবর্তন',
-'vector-simplesearch-preference' => 'à¦\86রà¦\93 à¦¸à¦®à§\83দà§\8dধ à¦\85নà§\81সনà§\8dধান à¦ªà¦°à¦¾à¦®à¦°à§\8dশ সক্রিয় করুন (শুধুমাত্র ভেক্টর স্কিনের জন্য)',
+'vector-simplesearch-preference' => 'সরল à¦\85নà§\81সনà§\8dধান সক্রিয় করুন (শুধুমাত্র ভেক্টর স্কিনের জন্য)',
 'vector-view-create' => 'তৈরি করুন',
 'vector-view-edit' => 'সম্পাদনা',
 'vector-view-history' => 'ইতিহাস',
@@ -337,7 +336,7 @@ $1',
 'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|পরিবর্তন|পরিবর্তনসমূহ}}',
 'youhavenewmessagesmulti' => 'আপনার $1টি নতুন বার্তা এসেছে',
 'editsection' => 'সম্পাদনা',
-'editold' => 'সম্পাদনা করুন',
+'editold' => 'সম্পাদনা',
 'viewsourceold' => 'উৎস দেখাও',
 'editlink' => 'সম্পাদনা',
 'viewsourcelink' => 'উৎস দেখুন',
@@ -475,11 +474,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''আপনি এইমাত্র আপনার একাউন্ট থেকে প্রস্থান করেছেন।'''
 
-এ পরিস্থিতিতে আপনি বেনামে {{SITENAME}} ব্যবহার করতে পারেন, কিংবা একই বা পৃথক নামে [[Special:UserLogin|আবার প্রবেশ করতে]] পারেন।
+এ পরিস্থিতিতে আপনি বেনামে {{SITENAME}} ব্যবহার করতে পারেন, কিংবা একই বা পৃথক নামে <span class='plainlinks'>[$1 আবার প্রবেশ করতে]</span> পারেন।
 লক্ষ্য করুন যে, এর কোন কোন পাতা এখনও এমনভাবে দেখাতে পারে যাতে মনে হবে আপনি আগের অবস্থাতেই আছেন। এক্ষেত্রে আপনাকে আপনার ব্রাওজারের ক্যাশ পরিষ্কার (clear browser cache) করে নিতে হবে।",
-'welcomecreation' => '== স্বাগতম $1! ==
-আপনার অ্যাকাউন্ট তৈরী হয়েছে।
-আপনার [[Special:Preferences|{{SITENAME}} পছন্দসমূহ]]  স্থির করে নিতে ভুলবেন না কিন্তু।',
 'yourname' => 'ব্যবহারকারী নাম:',
 'yourpassword' => 'শব্দচাবি:',
 'yourpasswordagain' => 'শব্দচাবিটি (password) আবার লিখুন',
@@ -488,7 +484,7 @@ $2',
 'yourdomainname' => 'আপনার ডোমেইন',
 'password-change-forbidden' => 'আপনি এই উইকিতে পাসওয়ার্ড পরিবর্তন করতে পারবেন না।',
 'externaldberror' => 'হয় কোন বহিঃস্থ যাচাইকরণ ডাটাবেজ ত্রুটি ঘটেছে অথবা আপনার বহিঃস্থ অ্যাকাউন্ট হালনাগাদ করার অনুমতি নেই।',
-'login' => 'প্রবেশ করুন',
+'login' => 'প্রবেশ',
 'nav-login-createaccount' => 'প্রবেশ/নতুন অ্যাকাউন্ট',
 'loginprompt' => '{{SITENAME}}-তে প্রবেশ করতে হলে আপনার ব্রাউজারের কুকি অবশ্যই সক্রিয় করতে হবে।',
 'userlogin' => 'প্রবেশ/নতুন অ্যাকাউন্ট',
@@ -497,7 +493,7 @@ $2',
 'userlogout' => 'প্রস্থান',
 'notloggedin' => 'আপনি সংযুক্ত নন',
 'nologin' => "আপনার কি উইকিপিডিয়াতে অ্যাকাউন্ট নেই? তাহলে '''$1'''।",
-'nologinlink' => 'নতà§\81ন à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦\96à§\81লুন',
+'nologinlink' => 'à¦\85à§\8dযাà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রি à¦\95রুন',
 'createaccount' => 'নতুন অ্যাকাউন্ট খুলুন',
 'gotaccount' => "আপনার কি ইতিমধ্যে একটি অ্যাকাউন্ট তৈরি করা আছে? '''$1''' করুন।",
 'gotaccountlink' => 'প্রবেশ',
@@ -654,7 +650,7 @@ $2
 'hr_tip' => 'অনুভূমিক রেখা (সংযতভাবে ব্যবহার করুন)',
 
 # Edit pages
-'summary' => 'সমà§\8dপাদনা à¦¸à¦¾à¦°à¦¾à¦\82শ:',
+'summary' => 'সারাংশ:',
 'subject' => 'বিষয়/শিরোনাম:',
 'minoredit' => 'অনুল্লেখ্য',
 'watchthis' => 'এই পাতাটি নজরে রাখুন',
@@ -752,7 +748,7 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'note' => "'''নোট:'''",
 'previewnote' => "'''খেয়াল করুন, এটি একটি প্রাকদর্শন মাত্র।'''
 আপনার পরিবর্তন এখনও সংরক্ষণ করা হয়নি!",
-'continue-editing' => 'সমà§\8dপাদনা à¦\9aালিয়à§\87 à¦¯à¦¾ন',
+'continue-editing' => 'সমà§\8dপাদনা à¦\95রà§\81ন',
 'previewconflict' => 'এই প্রাকদর্শনটি সম্পাদনা ক্ষেত্রের উপরের অংশটির টেক্সট সংরক্ষণ করলে যেরকম দেখাবে, তা দেখাচ্ছে।',
 'session_fail_preview' => "'''দুঃখিত! সেশন ডাটা হারিয়ে যাওয়ার কারণে আপনার সম্পাদনাটি সংরক্ষণ করা সম্ভব হয়নি। দয়া করে লেখাটি আবার জমা দেয়ার চেষ্টা করুন। যদি এতেও কাজ না হয়, তবে অ্যাকাউন্ট থেকে বেরিয়ে গিয়ে আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন।'''",
 'session_fail_preview_html' => "'''দুঃখিত! সেশন উপাত্ত হারিয়ে যাওয়ার কারণে আমরা আপনার সম্পাদনাটি প্রক্রিয়া করতে পারিনি।'''
@@ -826,6 +822,15 @@ $1 নিষেধাজ্ঞা আরোপ করেছেন। নিষ
 'edit-already-exists' => 'নতুন পাতা সৃষ্টি করা যায়নি।
 পাতাটি ইতিমধ্যেই বিদ্যমান।',
 'defaultmessagetext' => 'আদি টেক্সট',
+'content-failed-to-parse' => '$1 মডেলের জন্য $2 কন্টেন্ট পার্স করা যাচ্ছে না: $3',
+'invalid-content-data' => 'ভুল কন্টেন্ট ডাটা',
+'content-not-allowed-here' => '"$1" কন্টেন্টটি [[$2]] পাতায় অনুমোদিত নয়',
+
+# Content models
+'content-model-wikitext' => 'উইকিটেক্সট',
+'content-model-text' => 'সাধারণ লেখা',
+'content-model-javascript' => 'জাভাস্ক্রিপ্ট',
+'content-model-css' => 'সিএসএস',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''সতর্ক হোন:''' এই পাতাটি অনেক বেশি পরিমাণে এক্সপেনসিভ পার্সার ফাংশন কল রয়েছে।
@@ -970,6 +975,17 @@ $1",
 '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' => '*সাধারণ অপসারণের কারণসমূহ
 ** কপিরাইট লঙ্ঘন
 ** অনুপযুক্ত ব্যক্তিগত তথ্য
@@ -982,6 +998,8 @@ $1",
 
 # Suppression log
 'suppressionlog' => 'দমন লগ',
+'suppressionlogtext' => 'নিচের তালিকায় প্রশাসকদের থেকে লুকানো রয়েছে এমন তথ্যসহ অন্যন্য অপসারণ এবং বাধাদানের লগ রয়েছে।
+অনুগ্রহ করে অস্থায়ী ব্যান এবং বাধাদানের লগ সম্পর্কে বিস্তারিত জানতে [[Special:BlockList|বাধাদানের লগ দেখুন]]।',
 
 # History merging
 'mergehistory' => 'পাতার ইতিহাসগুলি একত্র করা হোক',
@@ -1022,6 +1040,11 @@ $1",
 'showhideselectedversions' => 'নির্বাচিত সংশোধনগুলো দেখাও/লুকাও',
 'editundo' => 'বাতিল',
 'diff-multi' => '({{PLURAL:$2|একজন ব্যবহারকারী |$2 জন ব্যবহারকারী}} সম্পাদিত {{PLURAL:$1|একটি অন্তর্বর্তীকালীন সংশোধন|$1টি অন্তর্বর্তীকালীন সংশোধন}} দেখানো হয়নি।)',
+'diff-multi-manyusers' => '($2 জন {{PLURAL:$2|ব্যবহারাকারীর}} সম্পাদিত {{PLURAL:$1|একটি সাম্প্রতিক সংস্করণ|$1 টি সাম্প্রতিক সংস্করণ}} প্রদর্শিত হচ্ছে না)',
+'difference-missing-revision' => '$1 পার্থক্যের {{PLURAL:$2|একটি সংস্করণ|$2টি সংস্করণসমূহ}} খুজে পাওয়া যাচ্ছে না।
+
+সাধারণত মুছে ফেলা হয়েছে এমন পাতার মেয়াদ উত্তীর্ণ ইতিহাস পাতার লিংক ওপেন করার কারণে এটি হতে পারে। 
+[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} অপসারণ লগে] বিস্তারিত তথ্য জানা যাবে।',
 
 # Search results
 'searchresults' => 'অনুসন্ধানের ফলাফল',
@@ -1044,6 +1067,7 @@ $1",
 'searchmenu-exists' => "'''এই উইকিতে \"[[:\$1]]\" নামে একটি পাতা রয়েছে'''",
 'searchmenu-new' => "'''\"[[:\$1]]\" পাতাটি এই উইকিতে তৈরি করুন!'''",
 'searchhelp-url' => 'Help:সহায়িকা',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|এই প্রিফিক্স রয়েছে এমন পাতা দেখুন]]',
 'searchprofile-articles' => 'বিষয়বস্তুর পাতা',
 'searchprofile-project' => 'সহায়িকা এবং প্রকল্প পাতা',
 'searchprofile-images' => 'মাল্টিমিডিয়া',
@@ -1063,8 +1087,6 @@ $1",
 'search-interwiki-caption' => 'সহপ্রকল্পসমূহ',
 'search-interwiki-default' => '$1 ফলাফলসমূহ:',
 'search-interwiki-more' => '(আরও)',
-'search-mwsuggest-enabled' => 'পরামর্শসহ',
-'search-mwsuggest-disabled' => 'পরামর্শ নেই',
 'search-relatedarticle' => 'সম্পর্কিত',
 'mwsuggest-disable' => 'AJAX পরামর্শ নিষ্ক্রিয় করা হোক',
 'searcheverything-enable' => 'সকল নামস্থানে অনুসন্ধান করো',
@@ -1094,10 +1116,11 @@ $1",
 'qbsettings-fixedright' => 'স্থায়ী ডান',
 'qbsettings-floatingleft' => 'ভাসমান বাম',
 'qbsettings-floatingright' => 'ভাসমান ডান',
+'qbsettings-directionality' => 'ফিক্সড, আপনার ভাষার লেখা শুরুর দিকের উপর ভিত্তি করে',
 
 # Preferences page
 'preferences' => 'আমার পছন্দ',
-'mypreferences' => 'à¦\86মার à¦ªà¦\9bনà§\8dদ',
+'mypreferences' => 'পà¦\9bনà§\8dদসমà§\82হ',
 'prefs-edits' => 'সম্পাদনা সংখ্যা:',
 'prefsnologin' => 'আপনি লগ-ইন করেননি',
 'prefsnologintext' => 'ব্যবহারকারীর পছন্দ ঠিক করতে হলে আপনাকে অবশ্যই <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} লগইন]</span> করা অবস্থায় থাকতে হবে।',
@@ -1140,7 +1163,7 @@ $1",
 'prefs-help-recentchangescount' => 'এতে সাম্প্রতিক পরিবর্তনসমূহ, পাতার ইতিহাস এবং লগ অন্তর্ভুক্ত।',
 'prefs-help-watchlist-token' => 'এই ঘরটি একটি গোপন শব্দ চাবি দ্বারা পূরণ করলে আপনার নজর তালিকার জন্য একটি আরএসএস ফিড তৈরী হবে। যারা এই ঘরের চাবি জানবে তারা আপনার নজর তালিকা দেখতে পারবে, তাই একটি গোপন মান ব্যবহার করুন। এখানে এলোমেলোভাবে তৈরী একটি মান দেখানো হয়েছে যা আপনি ব্যবহার করতে পারেন: $1',
 'savedprefs' => 'আপনার পছন্দগুলো সংরক্ষণ করা হয়েছে।',
-'timezonelegend' => 'সময় বলয়:',
+'timezonelegend' => 'সময়স্থান:',
 'localtime' => 'স্থানীয় সময়:',
 'timezoneuseserverdefault' => 'উইকির পূর্বনির্ধারিত সময় ব্যবহার করো ($1)',
 'timezoneuseoffset' => 'অন্য (অফসেট নির্দিষ্ট করুন)',
@@ -1187,6 +1210,8 @@ $1",
 'gender-unknown' => 'অনুল্লেখিত',
 'gender-male' => 'পুরুষ',
 'gender-female' => 'মহিলা',
+'prefs-help-gender' => 'ঐচ্ছিক: সফটওয়্যারে মাধ্যমে লিঙ্গ অনুযায়ী সম্বধনের ক্ষেত্রে ব্যবহৃত হয়।
+এই তথ্য সকলের জন্য উন্মুক্ত থাকেবে।',
 'email' => 'ই-মেইল',
 'prefs-help-realname' => 'আসল নাম দেওয়া অনাবশ্যক। যদি আসল নাম দেন, তবে আপনার কাজের স্বীকৃতি দানে তা ব্যবহার করা হবে।',
 'prefs-help-email' => 'ই-মেইল ঠিকানা ঐচ্ছিক, তবে শব্দচাবি ভুলে গেলে নতুন করে শব্দচাবি নিতে এটির প্রয়োজন হবে।',
@@ -1303,6 +1328,7 @@ $1",
 'right-edituserjs' => 'অন্য ব্যবহারকারীগণের JS ফাইল সম্পাদনা',
 'right-rollback' => 'একটি নির্দিষ্ট পাতার সর্বশেষ ব্যবহারকারীর সম্পদনা পূর্বাবস্থায় ফিরিয়ে আনুন',
 'right-markbotedits' => 'রোলড-ব্যাক সম্পাদনাসমূহকে বট সম্পাদনা হিসেবে চিহ্নিত করো',
+'right-noratelimit' => 'রেট লিমিটের ভিত্তিতে পরিবর্তন হবে না',
 'right-import' => 'অন্য উইকি থেকে পাতা আমদানী করো',
 'right-importupload' => 'ফাইল আপলোড থেকে এই পাতাগুলো আমদানী করো',
 'right-patrol' => 'অন্যের সম্পাদনা পরীক্ষিত বলে চিহ্নিত করো',
@@ -1461,6 +1487,7 @@ $1",
 'filename-tooshort' => 'ফাইল নামটি খুব ছোট।',
 'filetype-banned' => 'এই ধরনের ফাইল নিষিদ্ধ।',
 'verification-error' => 'এই ফাইলের ফাইল ভ্যালিডেশন উত্তীর্ণ হয়নি।',
+'hookaborted' => 'যে পরিবর্তনটি আপনি করার চেষ্টা করেছিলেন তা এক্সটেনশন দ্বারা বাতিল করা হয়েছে।',
 'illegal-filename' => 'ফাইলের এই নামটি গ্রহণযোগ্য নয়।',
 'overwrite' => 'বিদ্যমান কোনো ফাইল প্রতিস্থাপন গ্রহণযোগ্য নয়।',
 'unknown-error' => 'একটি অজানা ত্রুটি দেখা দিয়েছে।',
@@ -1471,6 +1498,10 @@ $1",
 '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>
@@ -1487,6 +1518,8 @@ $1",
 'fileexists-shared-forbidden' => 'অংশীদারী ফাইল ভাণ্ডারে এই নামের একটি ফাইল ইতিমধ্যেই বিদ্যমান।
 আপনি যদি এখনো ফাইলটি আপলোড করতে চান, তবে অনুগ্রহপূর্বক পেছনে গিয়ে একটি নতুন নামে ফাইলটি আপলোড করুন।[[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'এই ফাইলটি নিচের {{PLURAL:$1|ফাইল|ফাইলগুলির}} অনুলিপি:',
+'file-deleted-duplicate' => 'এই ফাইলটির মত একটি ফাইল ([[:$1]]) পূর্বে অপসারণ করা হয়েছে।
+পুনরায় আপলোড করার পূর্বে আপনার উচিত আগের ফাইলটির অপসারণের কারণ জানা।',
 'uploadwarning' => 'আপলোড সতর্কবাণী',
 'uploadwarning-text' => 'অনুগ্রহ করে নিচে ফাইলের বর্ণনা পরিবর্তন করে আবার চেষ্টা করুন।',
 'savefile' => 'সংরক্ষণ',
@@ -1500,6 +1533,8 @@ $1",
 অনুগ্রহ করে file_uploads সেটিং পরীক্ষা করুন।',
 'uploadscripted' => 'এই ফাইলে এমন HTML বা স্ক্রিপ্ট কোড আছে যা একটি ওয়েব ব্রাউজার ভুল বুঝতে পারে।',
 'uploadvirus' => 'এই ফাইলটিতে ভাইরাস আছে! ব্যাখ্যা: $1',
+'uploadjava' => 'এটি একটি ZIP ফরম্যাটের ফাইল, যেখানে একটি জাভা .class ফরম্যাটের ফাইল রয়েছে।
+জাভা ফাইল আপলোডের কোনো অনুমতি নেই, কারণ এই ধরনের ফাইল সিস্টেমে নিরাপত্তা ত্রুটি তৈরী করতে পারে।',
 'upload-source' => 'উৎস ফাইল',
 'sourcefilename' => 'উৎস ফাইলের নাম:',
 'sourceurl' => 'উৎস ইউআরএল:',
@@ -1552,6 +1587,16 @@ $1',
 'backend-fail-create' => '$1 ফাইলটি তৈরী করা যাচ্ছে না।',
 'backend-fail-maxsize' => '"$1" ফাইলে লেখা যাচ্ছে না কারণ এটি {{PLURAL:$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" স্টোরেজ ব্যাকেন্ডের জার্নাল ডাটাবেজের সাথে যুক্ত হওয়া যাচ্ছে না।',
+'filejournal-fail-dbquery' => '"$1" স্টোরেজ ব্যাকেন্ডের জার্নাল ডাটাবেজ আপডেট করা যাচ্ছে না।',
 
 # Lock manager
 'lockmanager-notlocked' => '"$1" আনলক করা যাচ্ছে না; এটি লক করা রয়েছে।',
@@ -1560,6 +1605,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-acquire' => '$1 সার্ভারের লক পাওয়া যাচ্ছে না।',
+'lockmanager-fail-svr-release' => '$1 ডাটাবেজের লক খোলা যাচ্ছে না।',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'ফাইলটির জিপ পরীক্ষা করার সময় একটি ত্রুটি দেখা দিয়েছে।',
@@ -1571,18 +1620,38 @@ $1',
 
 # 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' => 'PATH_INFO পাওয়া যাচ্ছে না।
+আপনার সার্ভার থেকে এই তথ্য পাঠানোর জন্য কনফিগার করা হয়নি।
+এটি হয়তো CGI ভিত্তিক এবং img_auth সমর্থন করে না।
+বিস্তারিত দেখুন 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' => 'ইউআরএল এর কোয়েরি স্ট্রিংটি সঠিক নয়।',
 
 # HTTP errors
 'http-invalid-url' => 'ভুল ইউআরএল: $1',
+'http-invalid-scheme' => '"$1" যুক্ত ইউআরএল ব্যবহার অনুমদিন নয়।',
+'http-request-error' => 'অজানা কারণে HTTP রিকোয়েস্টটি ব্যার্থ হয়েছে।',
 'http-read-error' => 'HTTP পঠন ত্রুটি।',
 'http-timed-out' => 'HTTP অনুরোধের সময় পার হয়েছে।',
 'http-curl-error' => 'ইউআরএল নিয়ে আসার ক্ষেত্রে ত্রুটি: $1',
@@ -1603,6 +1672,8 @@ $1',
 'upload_source_file' => ' (আপনার কম্পিউটারের একটি ফাইল)',
 
 # Special:ListFiles
+'listfiles-summary' => 'এই বিশেষ পাতাটি আপলোড করা সকল ফাইল প্রদর্শন করে।
+ব্যবহারকারীর মাধ্যমে ফিল্টার করা হলে, ঐ নির্দিষ্ট ব্যবহারকারীর আপলোডকৃত ফাইলগুলোর সাম্প্রতিকতম সংস্করণগুলো দেখা যাবে।',
 'listfiles_search_for' => 'ছবির নাম অনুসন্ধান:',
 'imgfile' => 'ফাইল',
 'listfiles' => 'ছবির তালিকা',
@@ -1633,16 +1704,28 @@ $1',
 'filehist-missing' => 'ফাইল পাওয়া যায়নি',
 'imagelinks' => 'ফাইলের ব্যবহার',
 'linkstoimage' => 'নিচের {{PLURAL:$1|টি পাতা|$1টি পাতা}} থেকে এই ফাইলে সংযোগ আছে:',
+'linkstoimage-more' => 'এই ফাইলের সাথে $1টির বেশি {{PLURAL:$1|পাতার লিংক}} রয়েছে।
+নিচের তালিকায় ফাইলের সাথে যুক্ত {{PLURAL:$1|প্রথম পাতাটির লিংক|প্রথম $1টি পাতার লিংক}} দেখানো হচ্চে।
+এছাড়া একটি [[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 থেকে দেখানো হচ্ছে এবং হয়তো এটি অন্যান্য প্রকল্পতেও ব্যবহৃত হয়েছে।
+অনুগ্রহ করে বিস্তারিত জানার জন্য [$2 ফাইলটির বর্ণনা পাতা] দেখুন।',
 'sharedupload-desc-here' => 'এই ফাইলটি $1 থেকে এবং অন্যান্য প্রকল্পে ব্যবহৃত হতে পারে।
 এর [$2 ফাইল বিবরণ পৃষ্ঠা] উপর বর্ণনা নিম্নে দেখানো হলো।',
+'sharedupload-desc-edit' => 'এই ফাইলটি $1 থেকে এবং অন্যান্য প্রকল্পে ব্যবহৃত হতে পারে।
+[$2 ফাইলটির বর্ণনা পাতা] থেকে আপনি ফাইলটি বর্ণনা সম্পাদনা করতে পারেন।',
+'sharedupload-desc-create' => 'This file is from $1 and may be used by other projects.
+Maybe you want to edit the description on its [$2 file description page] there.',
 'filepage-nofile' => 'এই নামের কোন ফাইল নেই।',
+'filepage-nofile-link' => 'এই নামে কোনো ফাইল নেই, কিন্তু আপনি এটি [$1 আপলোড করতে পারেন]।',
 'uploadnewversion-linktext' => 'এই ফাইলটির একটি নতুন সংস্করণ আপলোড করুন',
 'shared-repo-from' => '$1 থেকে',
 'shared-repo' => 'শেয়ার্ড রিপোজিটরী',
+'upload-disallowed-here' => 'আপনি এই ফাইলটি প্রতিস্থাপন করতে পারবেন না।',
 
 # File reversion
 'filerevert' => '$1 পূর্বাবস্থায় ফেরত নিন',
@@ -1713,6 +1796,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' => 'সক্রিয় ব্যবহারকারী',
@@ -1767,7 +1851,10 @@ $1',
 'popularpages' => 'জনপ্রিয় পাতাসমূহ',
 'wantedcategories' => 'বাঞ্ছনীয় বিষয়শ্রেণীগুলি',
 'wantedpages' => 'বাঞ্ছনীয় পাতাগুলি',
+'wantedpages-badtitle' => 'ফলাফলে ভুল শিরনাম: $1',
 'wantedfiles' => 'আবশ্যিক ফাইলগুলো',
+'wantedfiletext-cat' => 'নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের কোন ফাইল খুজে পেলে <del>অপসারণ করুন</del>। এছাড়া অপসারিত হয়েছে এমন ছবির সংযোগ রয়েছে এমন পাতাসমূহের লিংক পাওয়া যাবে এখানে [[:$1]]।',
+'wantedfiletext-nocat' => 'নিচের ফাইলগুলো ব্যবহৃত হচ্ছে কিন্তু এগুলো অপসারিত হয়েছে। অন্যান্য রিপোজিটরী থেকে ব্যবহৃত ফাইলগুলো এভাবে প্রদর্শিত হতে পারে। এই ধরনের ভূলগুলো শিঘ্রই <del>অপসারিত হবে</del>।',
 'wantedtemplates' => 'আবশ্যিক টেম্পলেটগুলো',
 'mostlinked' => 'যেসব পাতার প্রতি সবচেয়ে বেশি সংযোগ আছে',
 'mostlinkedcategories' => 'যেসব বিষয়শ্রেণীর প্রতি সবচেয়ে বেশি সংযোগ আছে',
@@ -1794,7 +1881,7 @@ $1',
 'listusers-editsonly' => 'শুধুমাত্র এমন ব্যবহারকারীদের দেখাও যাদের অবদান আছে',
 'listusers-creationsort' => 'তৈরির তারিখ অনুসারে সাজাও',
 'usereditcount' => '$1 {{PLURAL:$1|সম্পাদনা|সম্পাদনা}}',
-'usercreated' => 'লিঙ্গ: $3 তৈরি হয়েছে $1 তারিখে, সময়: $2',
+'usercreated' => '{{GENDER:$3|তৈরি হয়েছে}} $1 তারিখ, সময়: $2',
 'newpages' => 'নতুন পাতাসমূহ',
 'newpages-username' => 'ব্যবহারকারী নাম:',
 'ancientpages' => 'পুরানো নিবন্ধ',
@@ -1874,13 +1961,13 @@ $1',
 'linksearch-ok' => 'অনুসন্ধান',
 'linksearch-text' => '"*.wikipedia.org" এর মত ওয়াইল্ড কার্ড ব্যবহার করা যেতে পারে।
 নূন্যতম একটি টপ লেভেল ডোমেইন প্রয়োজন, যেমন "*.org".<br />
-যà§\87 à¦¸à¦\95ল à¦ªà§\8dরà§\8bà¦\9fà§\8bà¦\95ল à¦¸à¦®à¦°à§\8dথন à¦\95রà§\87: <code>$1</code> (à¦\85নà§\81সনà§\8dধান à¦¬à¦\95à§\8dসà§\87 à¦\8fà¦\97à§\81লà§\8b à¦¬à§\8dযবহার à¦\95রবà§\87ন à¦¨à¦¾)।',
+যà§\87 à¦¸à¦\95ল à¦ªà§\8dরà§\8bà¦\9fà§\8bà¦\95ল à¦¸à¦®à¦°à§\8dথন à¦\95রà§\87: <code>$1</code> (পà§\8dরà§\8bà¦\9fà¦\95ল à¦\89লà§\8dলà§\87à¦\96 à¦\95রা à¦¨à¦¾ à¦¹à¦²à§\87 http:// à¦¡à¦¿à¦«à¦²à§\8dà¦\9f à¦¹à¦¿à¦¸à¦¾à¦¬à§\87 à¦¬à§\8dযবহà§\83ত à¦¹à¦¬à§\87)।',
 'linksearch-line' => '$2 থেকে $1 এ লিংক করা হয়েছে',
 'linksearch-error' => 'হোস্ট নামের শুরুতে কেবলমাত্র ওয়াইল্ডকার্ড ব্যবহার করা যায়।',
 
 # Special:ListUsers
 'listusersfrom' => 'সেই সব ব্যবহারকারী দেখাও যাদের নাম এই অক্ষর দিয়ে শুরু:',
-'listusers-submit' => 'দà§\87à¦\96ানà§\8b à¦¹à§\8bà¦\95',
+'listusers-submit' => 'দà§\87à¦\96াà¦\93',
 'listusers-noresult' => 'কোন ব্যবহারকারী খুঁজে পাওয়া যায়নি।',
 'listusers-blocked' => '(ব্লককৃত)',
 
@@ -1899,6 +1986,8 @@ $1',
 
 # Special:ListGroupRights
 'listgrouprights' => 'দলগত ব্যবহারকারী অধিকার',
+'listgrouprights-summary' => 'এই উইকির ব্যবহারকারীদের একটি গ্রুপগুলোর তালিকা দেখানো হচ্ছে, সাথে গ্রুপের কার্যপরিধিও উল্লেখ করা হয়েছে।
+নির্দিষ্ট গ্রুপের কার্যপরিধি সম্পর্কে জানতে দেখুন [[{{MediaWiki:Listgrouprights-helppage}}|additional information]]।',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">অনুমোদিত অধিকার</span>
 * <span class="listgrouprights-revoked">বাধাপ্রাপ্ত অধিকার</span>',
 'listgrouprights-group' => 'দল',
@@ -1921,8 +2010,8 @@ $1',
 'emailuser-title-target' => '{{GENDER:$1|ব্যবহারকারীকে}} ইমেইল পাঠান',
 'emailuser-title-notarget' => 'ব্যবহারকারীকে ই-মেইল করুন',
 'emailpage' => 'ব্যবহারকারীকে ই-মেইল করুন',
-'emailpagetext' => 'আপনি নিচের ফর্মটি ব্যবহার করে এই ব্যবহারকারীকে একটি ই-মেইল পাঠাতে পারেন।
-আপনি [[Special:Preferences|আপনার ব্যবহারকারী পছন্দে]] যে ই-মেইল ঠিকানাটি প্রবেশ করিয়েছেন সেটিকে ই-মেইলের প্রেরক হিসেবে দেখানো হবে, যেনো মেইলের প্রাপক আপনাকে উত্তর দিতে পারেন।',
+'emailpagetext' => "আপনি নিচের ফর্মটি ব্যবহার করে এই {{GENDER:$1|ব্যবহারকারীকে}} একটি ই-মেইল পাঠাতে পারেন।
+আপনি [[Special:Preferences|আপনার ব্যবহারকারী পছন্দে]] যে ই-মেইল ঠিকানাটি প্রবেশ করিয়েছেন সেটিকে ই-মেইলের ''প্রেরক'' হিসেবে দেখানো হবে, যেনো মেইলের প্রাপক আপনাকে উত্তর দিতে পারেন।",
 'usermailererror' => 'মেইল অবজেক্ট ত্রুটি পাঠিয়েছে:',
 'defemailsubject' => '{{SITENAME}} ব্যবহারকারী "$1" প্রেরিত ইমেইল',
 'usermaildisabled' => 'ব্যবহারকারী ই-মেইল নিস্ক্রিয়',
@@ -1953,7 +2042,7 @@ $1',
 
 # Watchlist
 'watchlist' => 'আমার নজর তালিকা',
-'mywatchlist' => 'à¦\86মার à¦¨à¦\9cর à¦¤à¦¾à¦²à¦¿à¦\95া',
+'mywatchlist' => 'নজর তালিকা',
 'watchlistfor2' => '$1 ($2)-এর জন্য',
 'nowatchlist' => 'আপনার নজরতালিকা খালি।',
 'watchlistanontext' => 'আপনার নজরতালিকার আইটেমগুলি দেখতে বা সম্পাদনা করতে অনুগ্রহ করে $1।',
@@ -1993,11 +2082,7 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} বিজ্ঞপ্তি ই-মেইল প্রেরক',
 'enotif_reset' => 'সমস্ত পাতা দেখা হয়েছে হিসেবে চিহ্নিত করুন',
-'enotif_newpagetext' => 'এটি একটি নতুন পাতা।',
 'enotif_impersonal_salutation' => '{{SITENAME}} ব্যবহারকারী',
-'changed' => 'পরিবর্তিত',
-'created' => 'তৈরী হয়েছিল',
-'enotif_subject' => '{{SITENAME}}-এর $PAGETITLE শিরোনামের পাতাটি $PAGEEDITOR কর্তৃক $CHANGEDORCREATED হয়েছে',
 'enotif_lastvisited' => 'আপনার শেষ আগমনের পরে সংঘটিত সমস্ত পরিবর্তনের জন্য $1 দেখুন।',
 'enotif_lastdiff' => 'এই পরিবর্তনটি দেখার জন্য $1 দেখুন।',
 'enotif_anon_editor' => 'বেনামী ব্যবহারকারী $1',
@@ -2157,6 +2242,7 @@ $UNWATCHURL
 # Undelete
 'undelete' => 'মুছে ফেলা পাতাগুলি দেখুন',
 'undeletepage' => 'মুছে ফেলা পাতাগুলি দেখুন ও ফিরিয়ে আনুন',
+'undeletepagetitle' => "'''[[:$1|$1]] এর অপসারিত সংস্করণগুলোর সমন্বয়ে দেখানো হচ্ছে'''।",
 'viewdeletedpage' => 'মুছে ফেলা হয়েছে, এমন পাতাগুলো দেখুন',
 'undeletepagetext' => 'নিচের {{PLURAL:$1|পাতা মুছে ফেলা হয়েছে কিন্তু|$1 পাতাগুলি মুছে ফেলা হয়েছে কিন্তু}} এগুলি এখনও আর্কাইভে আছে ও পুনরুদ্ধার করা সম্ভব। আর্কাইভ পর্যায়ক্রমিকভাবে পরিস্কার করা হতে পারে।',
 'undelete-fieldset-title' => 'সংশোধন পুনরুদ্ধার',
@@ -2180,7 +2266,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} পুনরুদ্ধার করা হয়েছে',
 'undeletedrevisions-files' => '{{PLURAL:$1|১টি সংশোধন|$1টি সংশোধন}} এবং {{PLURAL:$2|১টি ফাইল|$2টি ফাইল}} পুনরুদ্ধার করা হয়েছে',
 'undeletedfiles' => '{{PLURAL:$1|১টি ফাইল|$1টি ফাইল}} পুনরুদ্ধার করা হয়েছে',
-'cannotundelete' => 'মুছে ফেলা বাতিল করা যায়নি; অন্য কেউ হয়ত আগেই পাতাটি মুছে ফেলা বাতিল করেছেন।',
+'cannotundelete' => 'মুছে ফেলা বাতিল করা যায়নি:
+$1',
 'undeletedpage' => "'''$1 পুনরুদ্ধার করা হয়েছে'''
 
 সাম্প্রতিক মুছে ফেলা ও পুনরুদ্ধারের ঘটনাগুলির জন্য [[Special:Log/delete|অবলুপ্তি লগ]] দেখুন।",
@@ -2205,13 +2292,15 @@ $1',
 # Namespace form on various pages
 'namespace' => 'নামস্থান:',
 'invert' => 'ব্যুত্ক্রমে নির্বাচন',
+'tooltip-invert' => 'যে সকল নামস্থানের পাতাগুলোর পরিবর্তনসমূহর দেখতে চাচ্ছেন না সেগুলোর নামের পাশে টিক দিন',
 'namespace_association' => 'সংশ্লিষ্ট নামস্থান',
+'tooltip-namespace_association' => 'এখানে টিক দেয়ার মাধ্যমে সংশ্লিষ্ট নামস্থান এবং আলাপপাতাসমূহ অন্তর্ভুক্ত করছেন',
 'blanknamespace' => '(প্রধান)',
 
 # Contributions
 'contributions' => 'ব্যবহারকারীর অবদান',
 'contributions-title' => '$1 ব্যবহারকারীর অবদানসমূহ',
-'mycontris' => 'à¦\86মার à¦\85বদান',
+'mycontris' => 'অবদান',
 'contribsub2' => '$1 ($2)-এর জন্য',
 'nocontribs' => 'এই শর্তগুলির সাথে মিলে যায়, এমন কোন পরিবর্তন খুঁজে পাওয়া যায়নি।',
 'uctop' => '(শীর্ষ)',
@@ -2233,7 +2322,7 @@ $1',
 তথ্যসূত্র হিসেবে সাম্প্রতিক বাধাদান লগের ভুক্তিটি নিচে দেওয়া হলো:',
 'sp-contributions-search' => 'অবদানসমূহের জন্য অনুসন্ধান',
 'sp-contributions-username' => 'আইপি (IP) ঠিকানা অথবা ব্যবহারকারীর নাম:',
-'sp-contributions-toponly' => 'শà§\81ধà§\81মাতà§\8dর à¦¸à§\87à¦\87 à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¦à§\87à¦\96à§\87ও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত।',
+'sp-contributions-toponly' => 'শà§\81ধà§\81মাতà§\8dর à¦¸à§\87à¦\87 à¦¸à¦®à§\8dপাদনাà¦\97à§\81লি à¦¦à§\87à¦\96াও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত।',
 'sp-contributions-submit' => 'অনুসন্ধান',
 
 # What links here
@@ -2252,7 +2341,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 টি পুননির্দেশনা',
 'whatlinkshere-hidetrans' => '$1 ট্রান্সক্লুশন',
 'whatlinkshere-hidelinks' => '$1 টি সংযোগ',
-'whatlinkshere-hideimages' => '$1 à¦\9aিতà§\8dর সংযোগ',
+'whatlinkshere-hideimages' => '$1 à¦«à¦¾à¦\87ল সংযোগ',
 'whatlinkshere-filters' => 'ছাকনী',
 
 # Block/unblock
@@ -2296,6 +2385,7 @@ $1',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] কে বাধা দেয়া হয়েছে।<br />
 বাধা দেয়া পুনর্বিবেচনা করতে হলে [[Special:BlockList|বাধা দেয়া তালিকা]] দেখুন।',
 'ipb-blockingself' => 'আপনি নিজেকেই বাধাপ্রদান করতে যাচ্ছেন! আপনি কী নিশ্চিত যে আপনি এটি-ই করতে চান?',
+'ipb-confirmhideuser' => '"hide user" ক্ষমতার মাধ্যমে আপনি একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল লিস্ট এবং লগএন্ট্রি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?',
 'ipb-edit-dropdown' => 'বাধাদানের কারণ সম্পাদনা করুন',
 'ipb-unblock-addr' => '$1-এর উপর থেকে বাধা তুলে নেওয়া হোক',
 'ipb-unblock' => 'ব্যবহারকারী বা আইপি ঠিকানার উপর থেকে বাধা তুলে নেওয়া হোক',
@@ -2344,6 +2434,7 @@ $1',
 'blocklog-showsuppresslog' => 'এই ব্যবহারকারীকে পূর্বেও বাধা প্রদান ও লুকানো হয়েছিলো।
 তথ্যসূত্র হিসেবে তাই পূর্বের অপসারণ লগটি নিচে প্রদর্শন করা হচ্ছে:',
 'blocklogentry' => '[[$1]]এর উপর $2 $3 মেয়াদের জন্য নিষেধাজ্ঞা আরোপিত হয়েছে।',
+'reblock-logentry' => '[[$1]] এর ব্লক সেটিং পরিবর্তন করা হয়েছে যেটি শেষ হবে $2 $3 সময়ে',
 'blocklogtext' => 'এটি ব্যবহারকারীদেরকে বাধা দানের বা বাধা তুলে নেওয়ার লগ।
 স্বয়ংক্রিয়ভাবে বাধাদানকৃত আইপি ঠিকানাগুলি এখানে তালিকাবদ্ধ করা হয়নি।
 বর্তমানে সক্রিয় নিষিদ্ধকরণ ও বাধাদানের তালিকার জন্য [[Special:BlockList| বাধাদান তালিকা]] দেখুন।',
@@ -2353,9 +2444,12 @@ $1',
 '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|বাধাঁ|বাধাঁসমূহ}}',
@@ -2416,17 +2510,20 @@ $1',
 
 এসব ক্ষেত্রে আপনি চাইলে নিজের হাতে পাতাটিকে সরাতে বা একত্রীকরণ করতে পারেন।",
 'movearticle' => 'যে পাতা সরিয়ে ফেলা হবে',
+'moveuserpage-warning' => "'''সতর্কতা:''' আপনি একটি ব্যবহারকারী পাতা স্থানান্তর করছেন। অনুগ্রহ করে লক্ষ্য করুন যে এর মাধ্যমে কেবলমাত্র পাতাটি স্থানান্তর হবে, কিন্তু পাতার নাম পরিবর্তন হবে ''না''।",
 'movenologin' => 'অ্যাকাউন্টে প্রবেশ করা হয়নি',
 'movenologintext' => 'কোন পাতা সরিয়ে ফেলতে চাইলে আপনাকে অবশ্যই একজন নিবন্ধিত ব্যবহারকারী হতে হবে ও অ্যাকাউন্টে [[Special:UserLogin|প্রবেশ]] করতে হবে।',
 'movenotallowed' => 'আপনার {{SITENAME}}-তে পাতা স্থানান্তরের অনুমতি নেই।',
 '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' => "'''পাতাটি সফলভাবে সরানো গেলেও আলোচনা পাতাটিকে সরানো যায়নি, কারণ নতুন শিরোনামের অধীনে ইতিমধ্যেই একটি আলোচনা পাতা বিদ্যমান। অনুগ্রহ নিজের হাতে এগুলিকে একত্র করুন।'''",
@@ -2454,11 +2551,23 @@ $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' => 'পাতা রপ্তানি',
@@ -2471,7 +2580,8 @@ $1',
 'exportcuronly' => 'সম্পূর্ণ ইতিহাস নয়, কেবল বর্তমান সংশোধনটি অন্তর্ভুক্ত করা হোক',
 'exportnohistory' => "----
 '''লক্ষ্য করুন:''' কর্মদক্ষতা-সম্পর্কিত কারণের জন্য এই ফর্মের মাধ্যমে কোন পাতার সমগ্র ইতিহাস রপ্তানি করা নিষ্ক্রিয় করা হয়েছে।",
-'export-submit' => 'রপ্তানি করা হোক',
+'exportlistauthors' => 'প্রতি পাতার অবদানকারীর একটি পূর্ণাঙ্গ তালিকা যুক্ত হবে',
+'export-submit' => 'রপ্তানি',
 'export-addcattext' => 'এই বিষয়শ্রেণী থেকে পাতা যোগ করা হোক:',
 'export-addcat' => 'যোগ',
 'export-addnstext' => 'নামস্থান থেকে পাতা যুক্ত করুন:',
@@ -2526,6 +2636,7 @@ $1',
 'importstart' => 'পাতা আমদানি করা হচ্ছে...',
 'import-revision-count' => '$1 {{PLURAL:$1|টি সংশোধন|টি সংশোধন}}',
 'importnopages' => 'আমদানি করার মত কোন পাতা নেই।',
+'imported-log-entries' => '$1টি {{PLURAL:$1|লগ এন্ট্রি|লগ এন্ট্রিসমূহ}} আমদানি করা হয়েছে।',
 'importfailed' => 'আমদানি ব্যর্থ: $1',
 'importunknownsource' => 'আমদানি উৎসের ধরন অজানা',
 'importcantopen' => 'আমদানি ফাইল খোলা যায়নি',
@@ -2538,7 +2649,9 @@ $1',
 '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' => 'সেশন ডাটা হারিয়ে গিয়েছে।
@@ -2563,12 +2676,12 @@ $1',
 
 # 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' => 'মিডিয়াউইকি জাভাস্ক্রিপ্ট কিউইউনিট টেস্ট স্যুট',
 
 # Tooltip help for the actions
@@ -2674,6 +2787,7 @@ $1',
 'pageinfo-default-sort' => 'ডিফল্ট সর্ট কি',
 'pageinfo-length' => 'পাতার দৈর্ঘ্য (বাইটে)',
 'pageinfo-article-id' => 'পাতার আইডি',
+'pageinfo-language' => 'পাতার তথ্যের ভাষা',
 'pageinfo-robot-policy' => 'সার্চ ইঞ্জিনের অবস্থা',
 'pageinfo-robot-index' => 'ইনডেক্স উপযোগী',
 'pageinfo-robot-noindex' => 'ইনডেক্সের অনুপযোগী',
@@ -2690,10 +2804,15 @@ $1',
 'pageinfo-authors' => 'সর্বমোট সতন্ত্র সম্পাদকের সংখ্যা',
 'pageinfo-recent-edits' => 'সর্বশেষ সম্পাদনা করা হয়েছে (শেষ $1 দিনে)',
 'pageinfo-recent-authors' => 'সাম্প্রতিক সতন্ত্র সম্পাদকের সংখ্যা',
-'pageinfo-restriction' => 'পাতার সুরক্ষা ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'ম্যাজিক {{PLURAL:$1|শব্দ|শব্দসমূহ}} ($1)',
 'pageinfo-hidden-categories' => 'লুকানো {{PLURAL:$1|বিষয়শ্রেণী|বিষয়শ্রেণীসমূহ}} ($1)',
 'pageinfo-templates' => 'সংযুক্ত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}} ($1)',
+'pageinfo-toolboxlink' => 'পাতার তথ্য',
+'pageinfo-redirectsto' => 'পুননির্দেশিত হয়েছে',
+'pageinfo-redirectsto-info' => 'তথ্য',
+'pageinfo-contentpage' => 'তথ্য পাতা হিসাবে বিবেচিত হয়েছে',
+'pageinfo-contentpage-yes' => 'হ্যাঁ',
+'pageinfo-protect-cascading-yes' => 'হ্যাঁ',
 
 # Patrolling
 'markaspatrolleddiff' => 'পরীক্ষিত বলে চিহ্নিত করুন',
@@ -3276,7 +3395,7 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'size-gigabytes' => '$1 গিগাবাইট',
 
 # Live preview
-'livepreview-loading' => 'লোডিং',
+'livepreview-loading' => 'লোডিং...',
 'livepreview-ready' => 'লোডিং… প্রস্তুত!',
 'livepreview-failed' => 'তাৎক্ষণিক প্রাকদর্শন কাজ করছে না! সাধারণ প্রাকদর্শন চেষ্টা করুন।',
 'livepreview-error' => 'সংযোগ প্রদানে সম্ভব নয়: $1 "$2"। সাধারণ প্রাকদর্শন চেষ্টা করুণ।',
@@ -3490,6 +3609,10 @@ $4-এ নিশ্চিতকরণ কোডটি মেয়াদোত
 'feedback-bugcheck' => 'উত্তম! যাচাই করুন যে এই [$1  জানা বাগের] কোন একটি কিনা।',
 'feedback-bugnew' => 'আমি যাচাই করেছি। নতুন বাগ নিবন্ধন করুন।',
 
+# Search suggestions
+'searchsuggest-search' => 'অনুসন্ধান',
+'searchsuggest-containing' => 'যা আছে...',
+
 # API errors
 'api-error-badaccess-groups' => 'আপনার এই উইকিতে ফাইল আপলোডের অনুমতি নেই।',
 'api-error-badtoken' => 'অভ্যন্তরীণ ত্রুটি: খারাপ টোকেন।',
index 281dbdd..cdd68b8 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Freeyak
  * @author Jason (on bo.wikipedia.org)
+ * @author YeshiTuhden
  */
 
 $digitTransformTable = array(
@@ -143,7 +144,6 @@ $messages = array(
 'qbfind' => 'འཚོལ་བ།',
 'qbedit' => 'རྩོམ་སྒྲིག',
 'qbpageoptions' => 'ཤོག་ངོས་འདི།',
-'qbpageinfo' => 'འབྲེལ་ཆགས།',
 'qbmyoptions' => 'ངའི་ཤོག་ངོས།',
 'qbspecialpages' => 'དམིཊ་བསལ་གྱི་བཟོ་བཅོས།',
 'faq' => 'རྒྱུན་ལྡན་དྲི་བ།',
@@ -231,6 +231,7 @@ $messages = array(
 'disclaimerpage' => 'Project:སྤྱིའི་དགག་བྱ།',
 'edithelp' => 'རྩོམ་སྒྲིག་རོགས་རམ།',
 'edithelppage' => 'Help:རྩོམ་སྒྲིག',
+'helppage' => 'Help:ནང་དོན་',
 'mainpage' => 'གཙོ་ངོས།',
 'mainpage-description' => 'གཙོ་ངོས།',
 'policy-url' => 'Project: སྒྲིག་གཞི།',
@@ -396,6 +397,8 @@ $messages = array(
 'templatesused' => 'ཤོག་ངོས་འདིར་སྤྱད་པའི་ {{PLURAL:$1|དཔེ་པང་།|དཔེ་པང་།}}',
 'template-protected' => 'སྲུང་སྐྱོབ་འོག་ཡོད་པ།',
 'nocreate-loggedin' => 'ཤོག་ངོས་གསར་བཟོའི་ཆོག་མཆན་མི་འདུག',
+'recreate-moveddeleted-warn' => "'''ཉེན་བརྡ་:རང་གིས་སུབ་ཚར་བའི་ཤོག་ལེ་ཞིག་བསྐྱར་བཟོ་བྱེད་ཀྱི་འདུག་ '''
+ཁྱེད་རང་གལ་སྲིད་མུ་མཐུད་ཤོག་ལེ་འདི་བཟོ་ཅོས་བྱེད་འདོད་ན་སྟབས་བདེ་ཞིག་ལ་ང་ཚོས་སུབ་བཟིན་པའི་ཤོག་ལེ་འདིར་ཉར་ཡོད།",
 
 # History pages
 'viewpagelogs' => 'ཤོག་ངོས་འདིའི་ཉིན་ཐོ་ལ་ལྟ་བ།',
@@ -446,9 +449,14 @@ $messages = array(
 'nextn' => 'རྗེས་མ་{{PLURAL:$1|$1}}',
 'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)ལ་ལྟ་བ།',
 'searchmenu-legend' => 'འཚོལ་ཞིབ་འདེམས་ཚན།',
+'searchmenu-new' => 'ལྦེ་ཁེ་སྟེང་ལ་ཤོག་ལེ་ [[:$1]]བཟོས།',
+'searchprofile-project' => 'རོགས་རམ་དང་འཆར་གཞིའི་ཤོག་ངོས་',
+'searchprofile-everything' => 'ཚང་མ་',
+'searchprofile-advanced' => 'མཐོ་རིམ་',
 'searchprofile-articles-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
 'searchprofile-project-tooltip' => '$1ནང་དུ་འཚོལ་བ།',
 'searchprofile-images-tooltip' => 'ཡིག་ཆ་འཚོལ་བ།',
+'searchprofile-everything-tooltip' => 'བརྗོད་དོན་ཚང་མ་འཚོལ་གཞིབ་བྱེད་(གྲོས་མེས་ཤོག་ངོས་ཡང་འཚུད་པ་)',
 'search-result-size' => '$1({{PLURAL:$2|1 word|$2 words}})',
 'search-redirect' => '($1རིམ་འགྲེམ།)',
 'search-section' => '(ཚན་པ $1)',
@@ -456,10 +464,9 @@ $messages = array(
 'search-interwiki-caption' => 'སྲིང་མོའི་ལས་འཆར།',
 'search-interwiki-default' => '$1ལས་རྙེད་པ།',
 'search-interwiki-more' => '(དེ་ལས་མང་བ།)',
-'search-mwsuggest-enabled' => 'གྲོས་འཆར་དང་བཅས།',
-'search-mwsuggest-disabled' => 'གྲོས་འཆར་མི་དགོས།',
 'search-relatedarticle' => 'འབྲེལ་ཡོད།',
 'searchall' => 'ཚང་མ།',
+'search-nonefound' => 'ཁྱེད་ཀྱི་འདྲི་ཞིབ་དང་མཐུན་པའི་ལན་མི་འདུག་',
 'powersearch' => 'ཞིབ་ཏུ་འཚོལ་བ།',
 'powersearch-legend' => 'ཞིབ་ཏུ་འཚོལ་བ།',
 'powersearch-ns' => 'མིང་གནས་ནང་འཚོལ་བ།',
@@ -694,9 +701,6 @@ $messages = array(
 'unwatching' => 'ལྟ་ཐོ་ལས་འདོར་བཞིན་པ་་་',
 
 'enotif_reset' => 'ཤོག་ངོས་ཚང་མ་བལྟས་ཟིན་དུ་རྟགས་རྒྱོབ།',
-'enotif_newpagetext' => 'ཤོག་ངོས་འདི་གསར་བ་རེད།',
-'changed' => 'བསྒྱུར་ཟིན།',
-'created' => 'བཟོས་ཟིན།',
 
 # Delete
 'deletepage' => 'ཤོག་ངོས་འདོར་བ།',
@@ -734,6 +738,7 @@ $messages = array(
 
 # Undelete
 'undeletelink' => 'ལྟ་བ། / བསྐྱར་འདྲེན།',
+'undeleteviewlink' => 'ལྟ་བ་',
 'undelete-search-submit' => 'འཚོལ།',
 
 # Namespace form on various pages
@@ -787,6 +792,7 @@ $messages = array(
 
 # Namespace 8 related
 'allmessages' => 'མ་ལག་གི་སྐད་ཆ།',
+'allmessagesname' => 'མིང་',
 
 # Thumbnails
 'thumbnail-more' => 'ཆེ་རུ་གཏོང་བ།',
@@ -841,6 +847,7 @@ $messages = array(
 'tooltip-save' => 'བཟོ་བཅོས་ཉར་ཚགས་བྱོས།',
 'tooltip-preview' => 'ཉར་ཚགས་ཀྱི་སྔོན་དུ་བཟོ་བཅོས་ལ་བསྐྱར་ཞིབ་གནང་རོགས།',
 'tooltip-diff' => 'གང་ལ་བཟོ་བཅོས་བྱས་པའི་ཡིག་འབྲུ་སྟོན་པ།',
+'tooltip-summary' => 'ཕྱོགས་བསྡོམས་ཐུང་ངུ་ཞིག་འབྲིས་',
 
 # Browsing diffs
 'previousdiff' => '← རྩོམ་སྒྲིག་རྙིང་བ།',
index 65e0217..0cee18a 100644 (file)
 
 $fallback = 'bn';
 
-$digitTransformTable = array(
-       '0' => '০',
-       '1' => '১',
-       '2' => '২',
-       '3' => '৩',
-       '4' => '৪',
-       '5' => '৫',
-       '6' => '৬',
-       '7' => '৭',
-       '8' => '৮',
-       '9' => '৯'
-);
-
 $namespaceNames = array(
        NS_MEDIA            => 'মিডিয়া',
        NS_SPECIAL          => 'বিশেষ',
@@ -45,6 +32,19 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'থাকর_য়্যারী',
 );
 
+$digitTransformTable = array(
+       '0' => '০',
+       '1' => '১',
+       '2' => '২',
+       '3' => '৩',
+       '4' => '৪',
+       '5' => '৫',
+       '6' => '৬',
+       '7' => '৭',
+       '8' => '৮',
+       '9' => '৯'
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'লিঙ্কর তলে দুরগ দিক:',
@@ -190,7 +190,6 @@ $messages = array(
 'qbbrowse' => 'বুলিয়া চা',
 'qbedit' => 'পতানি',
 'qbpageoptions' => 'পাতা এহানর সারুক',
-'qbpageinfo' => 'পাতা এহানর পৌ',
 'qbmyoptions' => 'মর পছন',
 'qbspecialpages' => 'বিশেষ পাতাহানি',
 'faq' => 'আঙলাক',
@@ -434,10 +433,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''তি খানি আগে তর একাউন্টহাত্ত নিকুরিসত।'''
 
-এ পরিস্থিতিত তি বেনাঙল {{SITENAME}} ব্যবহার করানি পারর, নাইলে আরাক নাঙল [[Special:UserLogin|বারো হমানি]] পারর।
+এ পরিস্থিতিত তি বেনাঙল {{SITENAME}} ব্যবহার করানি পারর, নাইলে আরাক নাঙল <span class='plainlinks'>[$1 বারো হমানি]</span> পারর।
 খিয়াল থ, কোন কোন পাতা তি আগর অংতাত আসত বুলিয়া দেখা দিতে পারে। অসারে ইলে তি ব্রাওজারর ক্যাশ সেঙকরে বেলা (clear browser cache)।",
-'welcomecreation' => '==সম্ভাষা, $1! ==
-তর একাউন্টহান হঙিল। তর [[Special:Preferences|{{SITENAME}} পছনহান]] সিলানি না পাহুরিস।',
 'yourname' => 'আতাকুরার নাংহান (Username)',
 'yourpassword' => 'খন্তাচাবিগ (password)',
 'yourpasswordagain' => 'খন্তাচাবিগ (password) আরাকমু ইকর',
@@ -865,8 +862,6 @@ $2',
 'search-interwiki-caption' => 'বনক প্রকল্পহানি',
 'search-interwiki-default' => '$1 ফলাফলহানি:',
 'search-interwiki-more' => '(আরাকউ)',
-'search-mwsuggest-enabled' => 'পরামর্শল',
-'search-mwsuggest-disabled' => 'পরামর্শ নেই',
 'search-relatedarticle' => 'সাকেই আসে',
 'mwsuggest-disable' => 'AJAXরে থা নাদি',
 'searcheverything-enable' => 'হাব্বি নাঙথাকে বিসারা',
@@ -1282,8 +1277,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watching' => 'চা...',
 'unwatching' => 'নাউচা...',
 
-'changed' => 'পতেসে',
-
 # Delete
 'deletepage' => 'পাতাহান পুস',
 'confirm' => 'লেপকরানি',
@@ -1737,4 +1730,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'revdelete-unrestricted' => 'ডান্ডিকরেকুরাগরাঙ সীমাবদ্ধতাহানি নেইকর',
 'newuserlog-byemail' => 'ই-মেইলর মা পেঠাদিয়াসি পাসৱার্ডগ',
 
+# Search suggestions
+'searchsuggest-search' => 'বিসারা',
+'searchsuggest-containing' => 'আসেতা...',
+
 );
index 12ff736..b0f1d7e 100644 (file)
@@ -15,6 +15,8 @@
 
 $fallback = 'fa';
 
+$rtl = true;
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'لینکهای خط به زیر',
index 6a47be7..7493550 100644 (file)
@@ -227,7 +227,7 @@ $messages = array(
 
 'underline-always' => 'Atav',
 'underline-never' => 'Morse',
-'underline-default' => 'Diouzh ar merdeer',
+'underline-default' => 'Merdeer dre ziouer',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stil font an takad skridaozañ :',
@@ -323,7 +323,6 @@ $messages = array(
 'qbbrowse' => 'Furchal',
 'qbedit' => 'Kemmañ',
 'qbpageoptions' => 'Pajenn an dibaboù',
-'qbpageinfo' => 'Pajenn gelaouiñ',
 'qbmyoptions' => 'Ma dibaboù',
 'qbspecialpages' => 'Pajennoù dibar',
 'faq' => 'FAG',
@@ -556,7 +555,7 @@ Goulenn : $2",
 'protectedpagetext' => "Prennet eo bet ar bajenn-mañ. N'haller ket kemmañ anezhi ken.",
 'viewsourcetext' => 'Gallout a rit gwelet hag eilañ danvez ar bajenn-mañ',
 'viewyourtext' => "Gallout a rit gwelet hag eilañ mammenn ho '''kemmoù''' d'ar bajenn-mañ :",
-'protectedinterface' => 'Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant. Setu perak eo bet gwarezet ar bajenn.',
+'protectedinterface' => 'Testenn ar bajenn-mañ a dalvez evit etrefas ar meziant er wiki-mañ. Setu perak eo bet gwarezet ar bajenn.',
 'editinginterface' => "'''Diwallit :''' Emaoc'h o kempenn ur bajenn a dalvez da sevel skridoù evit etrefas ar meziant. Ar c'hemmoù graet d'ar bajenn-mañ a cheñcho etrefas an holl implijerien. Mar fell deoc'h skoazellañ evit treiñ traoù, soñjit kentoc'h implijout [//translatewiki.net/wiki/Main_Page?setlang=br translatewiki.net], ar raktres evit lec'helaat MediaWiki.",
 'sqlhidden' => '(Reked SQL kuzhet)',
 'cascadeprotected' => 'Gwarezet eo ar bajenn-mañ; n\'haller ket kemmañ anezhi ken p\'he c\'haver {{PLURAL:$1|er bajenn|e-mesk ar pajennoù}} da-heul zo bet gwarezet en ur zibab an dibarzh "skalierad" :
@@ -583,12 +582,8 @@ Setu amañ perak ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Digevreet oc'h bremañ.'''
 
-Gallout a rit kenderc'hel da implijout {{SITENAME}} en un doare dizanv, pe [[Special:UserLogin|kevreañ en-dro]] gant an hevelep anv pe un anv all mar fell deoc'h.
+Gallout a rit kenderc'hel da implijout {{SITENAME}} en un doare dizanv, pe <span class='plainlinks'>[$1 kevreañ en-dro]</span> gant an hevelep anv pe un anv all mar fell deoc'h.
 Notit mat e c'hallo pajennoù zo kenderc'hel da vezañ diskwelet evel pa vefec'h kevreet c'hoazh, betek ma vo riñset krubuilh ho merdeer ganeoc'h.",
-'welcomecreation' => '== Degemer mat, $1! ==
-
-Krouet eo bet ho kont implijer.
-Na zisoñjit ket resisaat ho [[Special:Preferences|penndibaboù evit {{SITENAME}}]].',
 'yourname' => 'Anv implijer :',
 'yourpassword' => 'Ger-tremen :',
 'yourpasswordagain' => 'Skrivit ho ker-tremen en-dro',
@@ -834,9 +829,9 @@ Ma'z oc'h un implijer(ez) dizanv ha ma stadit ez eus bet kaset deoc'h kemennaden
 'noarticletext' => 'N\'eus tamm skrid ebet war ar bajenn-mañ evit poent.
 Gallout a rit [[Special:Search/{{PAGENAME}}|klask an titl anezhi]] e pajennoù all,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask en oberiadennoù liammet], pe [{{fullurl:{{FULLPAGENAME}}|action=edit}} krouiñ ar bajenn]</span>.',
-'noarticletext-nopermission' => 'N\'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.
+'noarticletext-nopermission' => "N'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.
 Gallout a rit [[Special:Search/{{PAGENAME}}|klask titl ar bajenn-mañ]] war pajennoù all,
-pe <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>.',
+pe <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>, met n'oc'h ket aotreet da grouiñ ar bajenn-mañ.",
 'missing-revision' => "N'eus ket eus adwel niv. $1 eus ar bajenn anvet « {{PAGENAME}} ».
 
 C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.
@@ -865,7 +860,7 @@ Dindan emañ merket moned diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
 'note' => "'''Notenn :'''",
 'previewnote' => "'''Diwallit mat, n'eus ken ur rakweled eus an destenn-mañ.'''
 N'eo ket bet enrollet ho kemmoù evit c'hoazh !",
-'continue-editing' => "Kenderc'hel da gemmañ",
+'continue-editing' => "Mont d'an takad kemmañ",
 'previewconflict' => 'Gant ar rakweled e teu testenn ar bajenn war wel evel ma vo pa vo bet enrollet.',
 'session_fail_preview' => "'''Ho tigarez! N'eus ket bet tu da enrollañ ho kemmoù rak kollet eo bet roadennoù an dalc'h.'''
 Klaskit en-dro mar plij.
@@ -940,6 +935,15 @@ Diverket eo bet evit doare.',
 'edit-already-exists' => "N'eus ket bet gallet krouiñ ur bajenn nevez.
 Krouet e oa bet c'hoazh.",
 'defaultmessagetext' => 'Testenn dre ziouer',
+'content-failed-to-parse' => "C'hwitet eo dielfennadur endalc'had $2 evit ar patrom $1: $3",
+'invalid-content-data' => "n'eo ket mat roadennoù an endalc'had",
+'content-not-allowed-here' => 'N\'eo ket aotreet an endalc\'had "$1" er bajenn [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitestenn',
+'content-model-text' => 'testenn blaen',
+'content-model-javascript' => 'Javascript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Diwallit : Re a c'halvoù koustus e-keñver an arc'hwelioù parser zo gant ar bajenn-mañ.
@@ -1193,8 +1197,6 @@ Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-interwiki-caption' => 'Raktresoù kar',
 'search-interwiki-default' => "$1 disoc'h :",
 'search-interwiki-more' => "(muioc'h)",
-'search-mwsuggest-enabled' => 'gant kinnigoù',
-'search-mwsuggest-disabled' => 'hep kinnigoù',
 'search-relatedarticle' => "Disoc'hoù kar",
 'mwsuggest-disable' => 'Diweredekaat kinnigoù AJAX',
 'searcheverything-enable' => 'Klask en holl esaouennoù anv',
@@ -1290,7 +1292,7 @@ Setu aze un dalvoudenn ganet dre zegouezh hag a c'hallfec'h implijout : $1",
 'timezoneregion-indian' => 'Meurvor Indez',
 'timezoneregion-pacific' => 'Meurvor Habask',
 'allowemail' => 'Aotren ar posteloù a-berzh implijerien all',
-'prefs-searchoptions' => 'Dibarzhioù klask',
+'prefs-searchoptions' => '!Dibarzhioù klask',
 'prefs-namespaces' => 'Esaouennoù',
 'defaultns' => 'Klask en esaouennoù-anv a-hend-all :',
 'default' => 'dre ziouer',
@@ -1715,7 +1717,7 @@ Ma talc'h ar gudenn, kit e darempred gant [[Special:ListUsers/sysop|merourien ar
 'backend-fail-internal' => 'C\'hoarvezet ez eus ur fazi dianav e termenell stokañ ar restr "$1".',
 'backend-fail-contenttype' => 'Dibosupl termeniñ ar seurt danvez da enrollañ e "$1".',
 'backend-fail-batchsize' => 'Pourvezet he deus an dermenell stokañ ur pakad a $1 {{PLURAL:$1|oberiadenn|oberiadenn}}; sevel a ra ar vevenn da $2 {{PLURAL:$2|oberiadenn|oberiadenn}}.',
-'backend-fail-usable' => "Dibosupl skrivañ ar restr $1 rak re skort eo an aotreoù pe mankout a ra kavlec'hioù/endalc'herioù.",
+'backend-fail-usable' => 'Dibosupl skrivañ ar restr "$1" rak re skort eo an aotreoù pe mankout a ra kavlec\'hioù/endalc\'herioù.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'N\'eus ket bet gallet kevreañ ouzh diaz roadennoù ar marilh evit an dermenell stokañ "$1".',
@@ -1847,7 +1849,7 @@ Marteze a-walc'h e fell deoc'h kemmañ an deskrivadur anezhi war ar [$2 bajenn d
 'uploadnewversion-linktext' => 'Kargañ ur stumm nevez eus ar restr-mañ',
 'shared-repo-from' => 'eus $1',
 'shared-repo' => 'ur sanailh rannet',
-'upload-disallowed-here' => "Siwazh, ne c'hallit ket erlec'hiañ ar skeudenn-mañ",
+'upload-disallowed-here' => "Ne c'hallit ket erlec'hiañ ar restr-mañ",
 
 # File reversion
 'filerevert' => 'Disteuler $1',
@@ -2085,7 +2087,7 @@ Gwelet ivez ar [[Special:WantedCategories|rummadoù goulennet 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 : <code>$1</code> (na lakait hini ebet eus ar re-se en ho klask)',
+Protokoloù skoret : <code>$1</code> (defaults to http:// 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.",
 
@@ -2136,7 +2138,7 @@ evit gallout kas ur postel d'un implijer all.",
 'emailuser-title-target' => "Kas ur postel d'an {{PLURAL:$1|an implijer-mañ|an implijerez-mañ}}",
 'emailuser-title-notarget' => "Kas ur postel d'un implijer",
 'emailpage' => 'Postel implijer',
-'emailpagetext' => "Gallout a rit ober gant ar furmskrid a-is a-benn kas ur postel d'an implijer-mañ.
+'emailpagetext' => "Gallout a rit ober gant ar furmskrid a-is a-benn kas ur postel d'an {{GENDER:\$1|implijer|implijerez}}-mañ.
 E maezienn \"Kaser\" ho postel e vo merket ar chomlec'h postel resisaet ganeoc'h-c'hwi en ho [[Special:Preferences|Penndibaboù]], d'ar resever da c'hallout respont deoc'h war-eeun ma kar.",
 'usermailererror' => 'Fazi postel :',
 'defemailsubject' => 'Postel kaset eus {{SITENAME}} gant an implijer "$1"',
@@ -2207,11 +2209,7 @@ Evit tennañ ar bajenn-mañ a-ziwar ho rollad evezhiañ, klikit war "Paouez da e
 
 'enotif_mailer' => 'Posteler Kemenn {{SITENAME}}',
 'enotif_reset' => 'Merkañ an holl bajennoù evel gwelet',
-'enotif_newpagetext' => 'Ur bajenn nevez eo homañ.',
 'enotif_impersonal_salutation' => 'implijer {{SITENAME}}',
-'changed' => 'kemmet',
-'created' => 'Krouet',
-'enotif_subject' => '$CHANGEDORCREATED eo bet pajenn $PAGETITLE {{SITENAME}} gant $PAGEEDITOR',
 'enotif_lastvisited' => 'Sellet ouzh $1 evit gwelet an holl gemmoù abaoe ho selladenn ziwezhañ.',
 'enotif_lastdiff' => "Gwelet $1 evit sellet ouzh ar c'hemm-mañ.",
 'enotif_anon_editor' => 'implijer dizanv $1',
@@ -2394,7 +2392,8 @@ Ma'z eus bet krouet ur bajenn nevez dezhi an hevelep anv abaoe an diverkadenn, e
 'undeletedrevisions' => 'Adsavet {{PLURAL:$1|1 stumm|$1 stumm}}',
 'undeletedrevisions-files' => 'Adsavet ez ez eus bet {{PLURAL:$1|1 stumm|$1 stumm}} ha {{PLURAL:$2|1 restr|$2 restr}}',
 'undeletedfiles' => '{{PLURAL:$1|1 restr|$1 restr}} adsavet',
-'cannotundelete' => "Dibosupl eo diziverkañ; moarvat eo bet diziverket gant unan bennak all araozoc'h.",
+'cannotundelete' => 'Dibosupl eo diziverkañ:
+$1',
 'undeletedpage' => "'''Diziverket eo bet $1'''
 
 Sellit ouzh [[Special:Log/delete|marilh an diverkadennoù]] evit teuler ur sell ouzh an diverkadennoù diwezhañ.",
@@ -2467,7 +2466,7 @@ Dindan emañ merket enmont diwezhañ marilh ar stankadennoù, d'ho kelaouiñ :",
 'whatlinkshere-hideredirs' => '$1 adkas',
 'whatlinkshere-hidetrans' => '$1 treuzkluzadur',
 'whatlinkshere-hidelinks' => '$1 liamm',
-'whatlinkshere-hideimages' => '$1 liamm skeudennoù',
+'whatlinkshere-hideimages' => '$1 ar restroù liammet',
 'whatlinkshere-filters' => 'Siloù',
 
 # Block/unblock
@@ -2811,7 +2810,6 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
 
 # JavaScriptTest
 'javascripttest' => 'Amprouadenn JavaScript',
-'javascripttest-disabled' => "N'eo ket bet gweredekaet an arc'hwel-mañ war ar wiki.",
 'javascripttest-title' => 'Emeur o seveniñ $1 amprouadenn',
 'javascripttest-pagetext-noframework' => 'Miret eo ar bajenn-mañ evit amprouiñ JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Framm amprouiñ "$1" dianav.',
@@ -2948,6 +2946,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 
 # Info page
 'pageinfo-title' => 'Titouroù evit "$1"',
+'pageinfo-not-current' => "Hon digarezit, ne c'haller ket reiñ an titouroù-mañ evit an adweloù kozh.",
 'pageinfo-header-basic' => 'Titouroù diazez',
 'pageinfo-header-edits' => 'Kemmoù',
 'pageinfo-header-restrictions' => 'Gwarez ar bajenn',
@@ -2956,6 +2955,7 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-default-sort' => "Alc'hwez rummañ dre ziouer",
 'pageinfo-length' => 'Ment ar bajenn (en oktedoù)',
 'pageinfo-article-id' => 'Niverenn ar bajenn',
+'pageinfo-language' => 'Yezh ar bajenn',
 'pageinfo-robot-policy' => 'Statud al lusker klask',
 'pageinfo-robot-index' => "A c'haller menegeriñ",
 'pageinfo-robot-noindex' => "Ne c'haller ket menegeriñ",
@@ -2972,10 +2972,14 @@ Sur a-walc'h abalamour d'ul liamm enni a gas d'ul lec'hienn ziavaez berzet.",
 'pageinfo-authors' => 'Niver a aozerien disheñvel',
 'pageinfo-recent-edits' => 'Niver a gemmoù nevez (er $1 diwezhañ)',
 'pageinfo-recent-authors' => "Niver a aozerien nevez a-ziforc'h",
-'pageinfo-restriction' => 'Gwareziñ ar bajenn ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Ger hud |Gerioù hud}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Rumm kuzh|Rummoù kuzh}} ($1)',
 'pageinfo-templates' => "{{PLURAL:$1|Patrom endalc'het|Patromoù endalc'het}} ($1)",
+'pageinfo-toolboxlink' => 'Titouroù ar bajenn',
+'pageinfo-redirectsto' => 'Adkas a ra da',
+'pageinfo-redirectsto-info' => 'Titouroù',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading-yes' => 'Ya',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3846,6 +3850,10 @@ A-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc
 'feedback-bugcheck' => "Eus ar c'hentañ ! Gwiriit mat n'emañ ket e-touez an [$1 draen diskoachet c'hoazh].",
 'feedback-bugnew' => 'Gwiriet em eus. Kemenn un draen nevez',
 
+# Search suggestions
+'searchsuggest-search' => 'Klask',
+'searchsuggest-containing' => 'ennañ...',
+
 # API errors
 'api-error-badaccess-groups' => "N'oc'h ket aotreet da enporzhiañ restroù war ar wiki-mañ.",
 'api-error-badtoken' => 'Fazi diabarzh : "jedouer" fall.',
index 0caaa7f..d3a942e 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'Yakşambe',
-'monday'        => 'Duşambe',
-'tuesday'       => 'Sişambe',
-'wednesday'     => 'Cárşambe',
-'thursday'      => 'Pancşambe',
-'friday'        => 'Jummá',
-'saturday'      => 'Afta',
-'sun'           => 'Yakşambe',
-'mon'           => 'Duşambe',
-'tue'           => 'Sişambe',
-'wed'           => 'Cárşambe',
-'thu'           => 'Pancşambe',
-'fri'           => 'Jummá',
-'sat'           => 'Afta',
-'january'       => 'Janvarí',
-'february'      => 'Farvarí',
-'march'         => 'Márc',
-'april'         => 'Aprel',
-'may_long'      => 'Maí',
-'june'          => 'Jún',
-'july'          => 'Jaoláí',
-'august'        => 'Agast',
-'september'     => 'Satumbar',
-'october'       => 'Aktúbar',
-'november'      => 'Naombar',
-'december'      => 'Dasumbar',
-'january-gen'   => 'Janvarí',
-'february-gen'  => 'Farvarí',
-'march-gen'     => 'Márc',
-'april-gen'     => 'Aprel',
-'may-gen'       => 'Maí',
-'june-gen'      => 'Jún',
-'july-gen'      => 'Jaoláí',
-'august-gen'    => 'Agast',
+'sunday' => 'Yakşambe',
+'monday' => 'Duşambe',
+'tuesday' => 'Sişambe',
+'wednesday' => 'Cárşambe',
+'thursday' => 'Pancşambe',
+'friday' => 'Jummá',
+'saturday' => 'Afta',
+'sun' => 'Yakşambe',
+'mon' => 'Duşambe',
+'tue' => 'Sişambe',
+'wed' => 'Cárşambe',
+'thu' => 'Pancşambe',
+'fri' => 'Jummá',
+'sat' => 'Afta',
+'january' => 'Janvarí',
+'february' => 'Farvarí',
+'march' => 'Márc',
+'april' => 'Aprel',
+'may_long' => 'Maí',
+'june' => 'Jún',
+'july' => 'Jaoláí',
+'august' => 'Agast',
+'september' => 'Satumbar',
+'october' => 'Aktúbar',
+'november' => 'Naombar',
+'december' => 'Dasumbar',
+'january-gen' => 'Janvarí',
+'february-gen' => 'Farvarí',
+'march-gen' => 'Márc',
+'april-gen' => 'Aprel',
+'may-gen' => 'Maí',
+'june-gen' => 'Jún',
+'july-gen' => 'Jaoláí',
+'august-gen' => 'Agast',
 'september-gen' => 'Satumbar',
-'october-gen'   => 'Aktúbar',
-'november-gen'  => 'Naombar',
-'december-gen'  => 'Dasumbar',
-'jan'           => 'Janvarí',
-'feb'           => 'Farvarí',
-'mar'           => 'Márc',
-'apr'           => 'Aprel',
-'may'           => 'Maí',
-'jun'           => 'Jún',
-'jul'           => 'Jaoláí',
-'aug'           => 'Agast',
-'sep'           => 'Satumbar',
-'oct'           => 'Aktúbar',
-'nov'           => 'Naombar',
-'dec'           => 'Dasumbar',
+'october-gen' => 'Aktúbar',
+'november-gen' => 'Naombar',
+'december-gen' => 'Dasumbar',
+'jan' => 'Janvarí',
+'feb' => 'Farvarí',
+'mar' => 'Márc',
+'apr' => 'Aprel',
+'may' => 'Maí',
+'jun' => 'Jún',
+'jul' => 'Jaoláí',
+'aug' => 'Agast',
+'sep' => 'Satumbar',
+'oct' => 'Aktúbar',
+'nov' => 'Naombar',
+'dec' => 'Dasumbar',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Xáot|Xáot ák}}',
-'category_header'        => 'Xáot "$1" ŧí panna ģák',
-'subcategories'          => 'Şefko Xáot ák',
-'hidden-categories'      => '{{PLURAL:$1|Aodem á xáot|Aodem á xáot ák}}',
-'category-subcat-count'  => '{{PLURAL:$2|Dá xáot aŧí bíra dá şefko-xáot e.|Dá xáot aŧí, kulloí $2 án, đá {{PLURAL:$1|şefko-xáot e|$1 şefko-xáot arer}}.}}',
+'pagecategories' => '{{PLURAL:$1|Xáot|Xáot ák}}',
+'category_header' => 'Xáot "$1" ŧí panna ģák',
+'subcategories' => 'Şefko Xáot ák',
+'hidden-categories' => '{{PLURAL:$1|Aodem á xáot|Aodem á xáot ák}}',
+'category-subcat-count' => '{{PLURAL:$2|Dá xáot aŧí bíra dá şefko-xáot e.|Dá xáot aŧí, kulloí $2 án, đá {{PLURAL:$1|şefko-xáot e|$1 şefko-xáot arer}}.}}',
 'category-article-count' => '{{PLURAL:$2|Dá xáot aŧí bíra şefko panna ģák o.|Dá xáot aŧí şefko {{PLURAL:$1|panna|$1 panna}}, kulloí $2 án.}}',
 'listingcontinuesabbrev' => 'barjá.',
 
-'about'      => 'Bárav aŧ',
-'newwindow'  => '(púskuno darí seŧí malingik)',
-'cancel'     => 'Paşomán',
-'mytalk'     => 'Kaná ítgap',
+'about' => 'Bárav aŧ',
+'newwindow' => '(púskuno darí seŧí malingik)',
+'cancel' => 'Paşomán',
+'mytalk' => 'Kaná ítgap',
 'navigation' => 'Kasarşoní',
 
 # Cologne Blue skin
@@ -83,102 +83,102 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'Púskun sarhál',
-'vector-action-delete'     => 'Mesa',
-'vector-action-move'       => 'Surif',
-'vector-action-protect'    => 'Rakk',
-'vector-view-create'       => 'Biná',
-'vector-view-edit'         => 'Radbadal',
-'vector-view-history'      => 'Lekav e ur',
-'vector-view-view'         => 'Xuán',
-'vector-view-viewsource'   => 'Bumpad e ur',
-'actions'                  => 'Amal ák',
-'namespaces'               => 'Pin-jága ģák',
-'variants'                 => 'Badaldroşumk',
-
-'errorpagetitle'   => 'Radí',
-'returnto'         => '$1 á aŕseng.',
-'tagline'          => '{{SITENAME}} án',
-'help'             => 'Ráhşon',
-'search'           => 'Paŧŧopol',
-'searchbutton'     => 'Paŧŧopol',
-'searcharticle'    => 'Ráím',
-'history'          => 'Panna ná lekav',
-'history_short'    => 'Lekav',
+'vector-action-delete' => 'Mesa',
+'vector-action-move' => 'Surif',
+'vector-action-protect' => 'Rakk',
+'vector-view-create' => 'Biná',
+'vector-view-edit' => 'Radbadal',
+'vector-view-history' => 'Lekav e ur',
+'vector-view-view' => 'Xuán',
+'vector-view-viewsource' => 'Bumpad e ur',
+'actions' => 'Amal ák',
+'namespaces' => 'Pin-jága ģák',
+'variants' => 'Badaldroşumk',
+
+'errorpagetitle' => 'Radí',
+'returnto' => '$1 á aŕseng.',
+'tagline' => '{{SITENAME}} án',
+'help' => 'Ráhşon',
+'search' => 'Paŧŧopol',
+'searchbutton' => 'Paŧŧopol',
+'searcharticle' => 'Ráím',
+'history' => 'Panna ná lekav',
+'history_short' => 'Lekav',
 'printableversion' => 'Chapáí droşum',
-'permalink'        => 'Pakká gańđ',
-'edit'             => 'Radbadal',
-'create'           => 'Biná',
-'editthispage'     => 'Dá panna ŧí radbadal kar',
+'permalink' => 'Pakká gańđ',
+'edit' => 'Radbadal',
+'create' => 'Biná',
+'editthispage' => 'Dá panna ŧí radbadal kar',
 'create-this-page' => 'Dá panna e ađđ et',
-'delete'           => 'Mesa',
-'protect'          => 'Rakk',
-'protect_change'   => 'badal kar',
-'newpage'          => 'Púskuno panna',
-'talkpage'         => 'Dá panna ná bárav aŧ ítgap kabo',
+'delete' => 'Mesa',
+'protect' => 'Rakk',
+'protect_change' => 'badal kar',
+'newpage' => 'Púskuno panna',
+'talkpage' => 'Dá panna ná bárav aŧ ítgap kabo',
 'talkpagelinktext' => 'Ítgap',
-'personaltools'    => 'Tená aozár ák',
-'talk'             => 'Ítgap',
-'views'            => 'Nadára',
-'toolbox'          => 'Aozárxána',
-'otherlanguages'   => 'Elo bolí teŧí',
-'redirectedfrom'   => '($1 án aŕsok)',
-'redirectpagesub'  => 'Aŕsengoká panna',
-'lastmodifiedat'   => 'Dá panna ŧí guđđíko radbadal $1 ($2) á massus us.',
-'jumpto'           => 'Dáng drikka:',
+'personaltools' => 'Tená aozár ák',
+'talk' => 'Ítgap',
+'views' => 'Nadára',
+'toolbox' => 'Aozárxána',
+'otherlanguages' => 'Elo bolí teŧí',
+'redirectedfrom' => '($1 án aŕsok)',
+'redirectpagesub' => 'Aŕsengoká panna',
+'lastmodifiedat' => 'Dá panna ŧí guđđíko radbadal $1 ($2) á massus us.',
+'jumpto' => 'Dáng drikka:',
 'jumptonavigation' => 'kasarşoní',
-'jumptosearch'     => 'paŧŧopol',
+'jumptosearch' => 'paŧŧopol',
 
 # 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}} ná bárav aŧ',
-'aboutpage'            => 'Project:Bárav',
-'copyright'            => 'Mađđí $1 aná rid aŧ rasenging e.',
-'copyrightpage'        => '{{ns:project}}:Hakkxuájaí',
-'currentevents'        => 'Sáŕí hál',
-'currentevents-url'    => 'Project:Sáŕí hál',
-'disclaimers'          => 'Dazkaşşík',
-'disclaimerpage'       => 'Project:Las dazkaşşí',
-'edithelp'             => 'Radbadal ráhşoní',
-'edithelppage'         => 'Help:Radbadal',
-'helppage'             => 'Help:Ridoband',
-'mainpage'             => 'Monpanna',
+'aboutsite' => '{{SITENAME}} ná bárav aŧ',
+'aboutpage' => 'Project:Bárav',
+'copyright' => 'Mađđí $1 aná rid aŧ rasenging e.',
+'copyrightpage' => '{{ns:project}}:Hakkxuájaí',
+'currentevents' => 'Sáŕí hál',
+'currentevents-url' => 'Project:Sáŕí hál',
+'disclaimers' => 'Dazkaşşík',
+'disclaimerpage' => 'Project:Las dazkaşşí',
+'edithelp' => 'Radbadal ráhşoní',
+'edithelppage' => 'Help:Radbadal',
+'helppage' => 'Help:Ridoband',
+'mainpage' => 'Monpanna',
 'mainpage-description' => 'Monpanna',
-'portal'               => 'Cágiŕd bundar',
-'portal-url'           => 'Project: Cágiŕd bundar',
-'privacy'              => 'Rázdárí ráhband',
-'privacypage'          => 'Project:Rázdárí ráhband',
+'portal' => 'Cágiŕd bundar',
+'portal-url' => 'Project: Cágiŕd bundar',
+'privacy' => 'Rázdárí ráhband',
+'privacypage' => 'Project:Rázdárí ráhband',
 
 'badaccess' => 'Mokal radí',
 
-'retrievedfrom'       => '"$1" án alok',
-'youhavenewmessages'  => 'Nekin $1 ($2) are.',
-'newmessageslink'     => 'púskuno kulav',
+'retrievedfrom' => '"$1" án alok',
+'youhavenewmessages' => 'Nekin $1 ($2) are.',
+'newmessageslink' => 'púskuno kulav',
 'newmessagesdifflink' => 'guđđíko radbadal',
-'editsection'         => 'radbadal',
-'editold'             => 'radbadal',
-'viewsourceold'       => 'bumpad e ur',
-'editlink'            => 'radbadal',
-'viewsourcelink'      => 'bumpad e ur',
-'editsectionhint'     => 'Vanđ aŧí radbadal: $1',
-'toc'                 => 'Ridoband',
-'showtoc'             => 'páş',
-'hidetoc'             => 'aodem',
-'site-rss-feed'       => '$1 RSS serí',
-'site-atom-feed'      => '$1 Atom serí',
-'page-rss-feed'       => '"$1" RSS serí',
-'page-atom-feed'      => '"$1" Atom serí',
-'red-link-title'      => '$1 (panna káŧum án aff)',
+'editsection' => 'radbadal',
+'editold' => 'radbadal',
+'viewsourceold' => 'bumpad e ur',
+'editlink' => 'radbadal',
+'viewsourcelink' => 'bumpad e ur',
+'editsectionhint' => 'Vanđ aŧí radbadal: $1',
+'toc' => 'Ridoband',
+'showtoc' => 'páş',
+'hidetoc' => 'aodem',
+'site-rss-feed' => '$1 RSS serí',
+'site-atom-feed' => '$1 Atom serí',
+'page-rss-feed' => '"$1" RSS serí',
+'page-atom-feed' => '"$1" Atom serí',
+'red-link-title' => '$1 (panna káŧum án aff)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Panna',
-'nstab-user'     => 'Kárband ná panna',
-'nstab-special'  => 'Xás á panna',
-'nstab-project'  => 'Bunkárem panna',
-'nstab-image'    => 'Fáil',
+'nstab-main' => 'Panna',
+'nstab-user' => 'Kárband ná panna',
+'nstab-special' => 'Xás á panna',
+'nstab-project' => 'Bunkárem panna',
+'nstab-image' => 'Fáil',
 'nstab-template' => 'Kálib',
 'nstab-category' => 'Xáot',
 
 # General errors
-'missing-article'    => 'Cáindárí ambár aŧí panna sená nivişt xanningtav arásiŧ ki xaningosus, "$1" $2 piní á.
+'missing-article' => 'Cáindárí ambár aŧí panna sená nivişt xanningtav arásiŧ ki xaningosus, "$1" $2 piní á.
 
 Dá geştirí mesingoko panna sená nákára o fark yá lekav ná gańđ aseá ining án marek.
 
@@ -186,89 +186,89 @@ Aga dun aff, to ní software aŧí aeb as xanánus.
 
 Ná minnatvár maron ki dáná itlá e [[Special:ListUsers/sysop|amaldár]] as e kes, o URL e nişán kes.',
 'missingarticle-rev' => '(radbadal droşum#: $1)',
-'viewsource'         => 'Bumpad e ur',
+'viewsource' => 'Bumpad e ur',
 
 # Login and logout pages
-'yourname'                => 'Kárband pin:',
-'yourpassword'            => 'Kilítlaoz:',
-'remembermypassword'      => 'Dá darí ŧí kaná pinváxubí e ust á ates (ziát án ziát $1 {{PLURAL:$1|de|de}} akin)',
-'login'                   => 'Drustírástí',
+'yourname' => 'Kárband pin:',
+'yourpassword' => 'Kilítlaoz:',
+'remembermypassword' => 'Dá darí ŧí kaná pinváxubí e ust á ates (ziát án ziát $1 {{PLURAL:$1|de|de}} akin)',
+'login' => 'Drustírástí',
 'nav-login-createaccount' => 'Drustírástí / pinváxubí',
-'userlogin'               => 'Drustírástí / pinváxubí',
-'logout'                  => 'Bidar mar',
-'userlogout'              => 'Bidar mar',
-'nologinlink'             => 'Púskun pinváxubí kar',
-'mailmypassword'          => 'Púskuná kilítlaoz e girok ŧapál aŧ mon et',
-'loginlanguagelabel'      => 'Bolí: $1',
+'userlogin' => 'Drustírástí / pinváxubí',
+'logout' => 'Bidar mar',
+'userlogout' => 'Bidar mar',
+'nologinlink' => 'Púskun pinváxubí kar',
+'mailmypassword' => 'Púskuná kilítlaoz e girok ŧapál aŧ mon et',
+'loginlanguagelabel' => 'Bolí: $1',
 
 # Edit page toolbar
-'bold_sample'     => 'Zanđ nivişt',
-'bold_tip'        => 'Zanđ nivişt',
-'italic_sample'   => 'Coŧ nivişt',
-'italic_tip'      => 'Coŧ nivişt',
-'link_sample'     => 'Gańđ aná sarhál',
-'link_tip'        => 'Handí gańđ',
-'extlink_sample'  => 'http://www.example.com gańđ aná sarhál',
-'extlink_tip'     => 'Darí gańđ (sarlaoz http:// e ust á ates)',
+'bold_sample' => 'Zanđ nivişt',
+'bold_tip' => 'Zanđ nivişt',
+'italic_sample' => 'Coŧ nivişt',
+'italic_tip' => 'Coŧ nivişt',
+'link_sample' => 'Gańđ aná sarhál',
+'link_tip' => 'Handí gańđ',
+'extlink_sample' => 'http://www.example.com gańđ aná sarhál',
+'extlink_tip' => 'Darí gańđ (sarlaoz http:// e ust á ates)',
 'headline_sample' => 'Sarhál',
-'headline_tip'    => 'Şefko sarhál',
-'nowiki_sample'   => 'Be-berifok á nivişt áte dáŕe şá',
-'nowiki_tip'      => 'Vikí berifing e gírám kar',
-'image_tip'       => 'Liccok fáil',
-'media_tip'       => 'Fáil ná gańđ',
-'sig_tip'         => 'Ná dazrand vaxtŧappo ton avár',
-'hr_tip'          => 'Pánádí lík (kazání aŧ kárem aļ)',
+'headline_tip' => 'Şefko sarhál',
+'nowiki_sample' => 'Be-berifok á nivişt áte dáŕe şá',
+'nowiki_tip' => 'Vikí berifing e gírám kar',
+'image_tip' => 'Liccok fáil',
+'media_tip' => 'Fáil ná gańđ',
+'sig_tip' => 'Ná dazrand vaxtŧappo ton avár',
+'hr_tip' => 'Pánádí lík (kazání aŧ kárem aļ)',
 
 # Edit pages
-'summary'                          => 'Bungapp:',
-'subject'                          => 'Sarhál:',
-'minoredit'                        => 'Dá cunko radbadal as e',
-'watchthis'                        => 'Dá panna ná xiálí mar',
-'savearticle'                      => 'Panna e atíko kar',
-'preview'                          => 'Sarí Jác',
-'showpreview'                      => 'Sarí jác nişán et',
-'showdiff'                         => 'Fark nişán et',
-'anoneditwarning'                  => "'''Xiál kes:''' Ní pinváxubí kattanus.
+'summary' => 'Bungapp:',
+'subject' => 'Sarhál:',
+'minoredit' => 'Dá cunko radbadal as e',
+'watchthis' => 'Dá panna ná xiálí mar',
+'savearticle' => 'Panna e atíko kar',
+'preview' => 'Sarí Jác',
+'showpreview' => 'Sarí jác nişán et',
+'showdiff' => 'Fark nişán et',
+'anoneditwarning' => "'''Xiál kes:''' Ní pinváxubí kattanus.
 Panna ná radbadal lekav aŧí ná IP pajjár atíko kanningik.",
-'summary-preview'                  => 'Bungapp ná sarí jác:',
-'newarticle'                       => '(Púskun)',
-'newarticletext'                   => "Ní anduno panna sená rand e alkunus ki káŧum án joŕ aff.
+'summary-preview' => 'Bungapp ná sarí jác:',
+'newarticle' => '(Púskun)',
+'newarticletext' => "Ní anduno panna sená rand e alkunus ki káŧum án joŕ aff.
 Panna ná biná e kanning kin şefko đabbá ŧí likking şurú kar (Pen cáindárí kin [[{{MediaWiki:Helppage}}|ráhşoní panna]] e ur).
 Aga dáŕe radínk aŧ bassunus, to ''browser'' ná '''padí''' baŧŧańŕ e xaļ.",
-'noarticletext'                    => "Dáiskán dá panna ŧí icc nivişta aff.
+'noarticletext' => "Dáiskán dá panna ŧí icc nivişta aff.
 Elo panna ģáteŧí [[Special:Search/{{PAGENAME}}|dá sarhál e paŧŧa]],
 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} đek kunoká ''log'' áte paŧŧa],
 yá [{{fullurl:{{FULLPAGENAME}}|action=edit}} dá panna ŧí radbadal kar]</span>.",
-'noarticletext-nopermission'       => "Dáiskán dá panna ŧí icc nivişta aff.
+'noarticletext-nopermission' => "Dáiskán dá panna ŧí icc nivişta aff.
 Elo panna ģáteŧí [[Special:Search/{{PAGENAME}}|dá sarhál e paŧŧa]],
 yá <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} đek kunoká ''log'' áte paŧŧa].",
-'previewnote'                      => "'''Yát kes ki dá bíra sarí jác ase.'''
+'previewnote' => "'''Yát kes ki dá bíra sarí jác ase.'''
 Ná radbadal ák deskáne atíko matano.",
-'editing'                          => '$1 aŧí radbadal kanning us',
-'editingsection'                   => '$1 (vanđ) aŧí radbadal',
-'templatesused'                    => 'Dá panna ŧí aloká {{PLURAL:$1|Kálib|Kálib ák}}:',
-'templatesusedpreview'             => 'Dá sarí jác aŧí aloká {{PLURAL:$1|Kálib|Kálib ák}}:',
-'template-protected'               => '(rakk karok)',
-'template-semiprotected'           => '(nem-rakk)',
-'hiddencategories'                 => 'Dá panna {{PLURAL:$1|1 aodemo xáot|$1 aodemo xáot}} ná básk ase:',
+'editing' => '$1 aŧí radbadal kanning us',
+'editingsection' => '$1 (vanđ) aŧí radbadal',
+'templatesused' => 'Dá panna ŧí aloká {{PLURAL:$1|Kálib|Kálib ák}}:',
+'templatesusedpreview' => 'Dá sarí jác aŧí aloká {{PLURAL:$1|Kálib|Kálib ák}}:',
+'template-protected' => '(rakk karok)',
+'template-semiprotected' => '(nem-rakk)',
+'hiddencategories' => 'Dá panna {{PLURAL:$1|1 aodemo xáot|$1 aodemo xáot}} ná básk ase:',
 'permissionserrorstext-withaction' => 'Ne $2 ná mokal aff, oná {{PLURAL:$1|dalíl dáde|dalíl ák dádo}}:',
 
 # History pages
-'viewpagelogs'         => 'Dá panna ná hisáb áte ur',
-'currentrev-asof'      => '$1 iskán caŧŧ púskuná radbadal droşum',
-'revisionasof'         => '$1 á sáŕí badaldroşum',
-'previousrevision'     => '← Mutkuná badaldroşum',
-'nextrevision'         => 'Púskuná badal droşum →',
-'currentrevisionlink'  => 'Caŧŧ púskuná badal droşum',
-'cur'                  => 'sáŕí',
-'last'                 => 'must',
+'viewpagelogs' => 'Dá panna ná hisáb áte ur',
+'currentrev-asof' => '$1 iskán caŧŧ púskuná radbadal droşum',
+'revisionasof' => '$1 á sáŕí badaldroşum',
+'previousrevision' => '← Mutkuná badaldroşum',
+'nextrevision' => 'Púskuná badal droşum →',
+'currentrevisionlink' => 'Caŧŧ púskuná badal droşum',
+'cur' => 'sáŕí',
+'last' => 'must',
 'history-show-deleted' => 'Bíra mesok',
-'histfirst'            => 'Vaxtí á',
-'histlast'             => 'Caŧŧ púskuná',
+'histfirst' => 'Vaxtí á',
+'histlast' => 'Caŧŧ púskuná',
 
 # Revision deletion
-'rev-delundel'           => 'páş/aodem',
-'revdel-restore'         => 'páşí e badal kar',
+'rev-delundel' => 'páş/aodem',
+'revdel-restore' => 'páşí e badal kar',
 'revdel-restore-deleted' => 'mesok badaldroşumk',
 'revdel-restore-visible' => 'páş badaldroşumk',
 
@@ -277,57 +277,54 @@ Ná radbadal ák deskáne atíko matano.",
 
 # Diffs
 'history-title' => '$1 aŧí radbadal ná lekav',
-'difference'    => '(Badal droşum teŧí fark)',
-'lineno'        => 'Lík $1:',
-'editundo'      => 'ságí',
+'lineno' => 'Lík $1:',
+'editundo' => 'ságí',
 
 # Search results
-'searchresults'                    => 'Paŧŧopol ná kaŧŧiá',
-'searchresults-title'              => '$1 kin paŧŧopol ná kaŧŧiá',
-'searchresulttext'                 => '{{SITENAME}} ŧí paŧŧopol ná bábat cáindárí kin [[{{MediaWiki:Helppage}}|{{int:help}}]] e ur.',
-'searchsubtitle'                   => 'Ní \'\'\'[[:$1]]\'\'\' kin paŧpol kares ([[Special:Prefixindex/$1|"$1" án biná maroká ģuŧ panna ģák]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" ton gańđok ģuŧ panna ģák]])',
-'searchsubtitleinvalid'            => "Ní '''$1''' akin paŧŧopol kares",
-'notitlematches'                   => 'Dá pin aná icco panna ná sarhál allav',
-'notextmatches'                    => 'Icco panna nivişt dá vaŕ aná allav',
-'prevn'                            => 'gidrengoká {{PLURAL:$1|$1}}',
-'nextn'                            => 'mon aná {{PLURAL:$1|$1}}',
-'shown-title'                      => 'Ar panna ģá $1 {{PLURAL:$1|kaŧŧiá|kaŧŧiá}} nişán et',
-'viewprevnext'                     => '($1 {{int:pipe-separator}} $2) ($3) e ur',
-'searchmenu-new'                   => "'''Dá Vikí ŧí \"[[:\$1]]\" panna ná biná kar!'''",
-'searchprofile-articles'           => 'Nivişt panna ģák',
-'searchprofile-project'            => 'Ráhşon o bunkárem panna ģák',
-'searchprofile-images'             => 'Multimedia',
-'searchprofile-everything'         => 'Ar giŕá',
-'searchprofile-advanced'           => 'Xúŕt',
-'searchprofile-articles-tooltip'   => '$1 ŧí paŧŧa',
-'searchprofile-project-tooltip'    => '$1 ŧí paŧŧa',
-'searchprofile-images-tooltip'     => 'Fáil átekin paŧŧpol',
+'searchresults' => 'Paŧŧopol ná kaŧŧiá',
+'searchresults-title' => '$1 kin paŧŧopol ná kaŧŧiá',
+'searchresulttext' => '{{SITENAME}} ŧí paŧŧopol ná bábat cáindárí kin [[{{MediaWiki:Helppage}}|{{int:help}}]] e ur.',
+'searchsubtitle' => 'Ní \'\'\'[[:$1]]\'\'\' kin paŧpol kares ([[Special:Prefixindex/$1|"$1" án biná maroká ģuŧ panna ģák]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" ton gańđok ģuŧ panna ģák]])',
+'searchsubtitleinvalid' => "Ní '''$1''' akin paŧŧopol kares",
+'notitlematches' => 'Dá pin aná icco panna ná sarhál allav',
+'notextmatches' => 'Icco panna nivişt dá vaŕ aná allav',
+'prevn' => 'gidrengoká {{PLURAL:$1|$1}}',
+'nextn' => 'mon aná {{PLURAL:$1|$1}}',
+'shown-title' => 'Ar panna ģá $1 {{PLURAL:$1|kaŧŧiá|kaŧŧiá}} nişán et',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) e ur',
+'searchmenu-new' => "'''Dá Vikí ŧí \"[[:\$1]]\" panna ná biná kar!'''",
+'searchprofile-articles' => 'Nivişt panna ģák',
+'searchprofile-project' => 'Ráhşon o bunkárem panna ģák',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Ar giŕá',
+'searchprofile-advanced' => 'Xúŕt',
+'searchprofile-articles-tooltip' => '$1 ŧí paŧŧa',
+'searchprofile-project-tooltip' => '$1 ŧí paŧŧa',
+'searchprofile-images-tooltip' => 'Fáil átekin paŧŧpol',
 'searchprofile-everything-tooltip' => 'Ģuŧŧ nivişt áteŧí paŧŧpol (ítgap ná panna ģáteton avár)',
-'search-result-size'               => '$1 ({{PLURAL:$2|1 laoz|$2 laoz}})',
-'search-redirect'                  => '(aŕsa $1)',
-'search-section'                   => '($1 vanđ)',
-'search-suggest'                   => 'Maga dád xuáhása: $1',
-'search-interwiki-caption'         => 'Amkár bunkáremk',
-'search-interwiki-default'         => '$1 kaŧŧiá:',
-'search-interwiki-more'            => '(pen)',
-'search-mwsuggest-enabled'         => 'saláh ton',
-'search-mwsuggest-disabled'        => 'be saláh',
-'searchrelated'                    => 'amrang',
-'searchall'                        => 'ģuŧŧ',
-'nonefound'                        => "'''Xiáldárí''': Bunyádí vaŕ aŧ bíra giŕás pinjága áteŧí paŧpol marek.
+'search-result-size' => '$1 ({{PLURAL:$2|1 laoz|$2 laoz}})',
+'search-redirect' => '(aŕsa $1)',
+'search-section' => '($1 vanđ)',
+'search-suggest' => 'Maga dád xuáhása: $1',
+'search-interwiki-caption' => 'Amkár bunkáremk',
+'search-interwiki-default' => '$1 kaŧŧiá:',
+'search-interwiki-more' => '(pen)',
+'searchrelated' => 'amrang',
+'searchall' => 'ģuŧŧ',
+'nonefound' => "'''Xiáldárí''': Bunyádí vaŕ aŧ bíra giŕás pinjága áteŧí paŧpol marek.
 
 Ģuŧŧ mađđí ŧí paŧpol kin (ítgap panna, kálib, dá-e teton aviŕda) tená just átá avalsar aŧí sarlaoz ''all:'' xaļ, yá bakár pinjága e sarlaoz ná jága ģá xaļ.",
-'search-nonefound'                 => 'Just aná icc kaŧŧiá allav',
-'powersearch'                      => 'Xúŕt paŧŧopol',
-'powersearch-legend'               => 'Xúŕt paŧŧopol',
-'powersearch-ns'                   => 'Pin-jága ģáteŧí paŧŧopol:',
-'powersearch-redir'                => 'Aŕsoká panna ģátá cirr e nişán et',
-'powersearch-field'                => 'Dáŕkin paŧŧopol',
+'search-nonefound' => 'Just aná icc kaŧŧiá allav',
+'powersearch' => 'Xúŕt paŧŧopol',
+'powersearch-legend' => 'Xúŕt paŧŧopol',
+'powersearch-ns' => 'Pin-jága ģáteŧí paŧŧopol:',
+'powersearch-redir' => 'Aŕsoká panna ģátá cirr e nişán et',
+'powersearch-field' => 'Dáŕkin paŧŧopol',
 
 # Preferences page
-'preferences'   => 'Gicenk',
+'preferences' => 'Gicenk',
 'mypreferences' => 'Kaná gicenk',
-'yourrealname'  => 'Aslí pin',
+'yourrealname' => 'Aslí pin',
 
 # Groups
 'group-sysop' => 'Amaldár ák',
@@ -341,61 +338,61 @@ Ná radbadal ák deskáne atíko matano.",
 'action-edit' => 'dá panna ŧí radbadal kar',
 
 # Recent changes
-'nchanges'                    => '$1 {{PLURAL:$1|radbadal|radbadal}}',
-'recentchanges'               => 'Zút áteaŧ maroká radbadal ák',
-'recentchanges-legend'        => 'Zút áteaŧ marok radbadal tekin gicenk',
+'nchanges' => '$1 {{PLURAL:$1|radbadal|radbadal}}',
+'recentchanges' => 'Zút áteaŧ maroká radbadal ák',
+'recentchanges-legend' => 'Zút áteaŧ marok radbadal tekin gicenk',
 'recentchanges-label-newpage' => 'Dá radbadal aŧ panna sená biná mass',
-'recentchanges-label-minor'   => 'Dá cunko radbadal as e',
-'recentchanges-label-bot'     => 'Dá xudkár asená dú án maroko radbadal as e',
-'rcnote'                      => "Şefko {{PLURAL:$1|'''1''' radbadal e|guđđíko '''$1''' radbadal áko}}, gidrengoká {{PLURAL:$2|de aŧí|'''$2''' de teŧí}}, $5, $4 ná hisáb aŧ.",
-'rcnotefrom'                  => "Şefko raddobadal ák '''$2''' án maroko ('''$1''' iskán páş o)",
-'rclistfrom'                  => '$1 án púskuná radbadal áke nişán et',
-'rcshowhideminor'             => 'Cunká radbadal áte $1',
-'rcshowhidebots'              => 'Boŧ áte $1',
-'rcshowhideliu'               => 'Drustírástí kárband áte $1',
-'rcshowhideanons'             => 'Bidar kárband áte $1',
-'rcshowhidemine'              => 'Kaná radbadal áte $1',
-'rclinks'                     => 'Guđđíko $2 de teŧí maroká guđđíko $1 radbadal e nişán et<br />$3',
-'diff'                        => 'fark',
-'hist'                        => 'lekav',
-'hide'                        => 'aodem kar',
-'show'                        => 'níşán et',
-'minoreditletter'             => 'C',
-'newpageletter'               => 'P',
-'boteditletter'               => 'x',
-'rc-enhanced-expand'          => 'Vaddíko hál e nişán et (JavaScript xuáik)',
-'rc-enhanced-hide'            => 'Vaddíko hál e đakka',
+'recentchanges-label-minor' => 'Dá cunko radbadal as e',
+'recentchanges-label-bot' => 'Dá xudkár asená dú án maroko radbadal as e',
+'rcnote' => "Şefko {{PLURAL:$1|'''1''' radbadal e|guđđíko '''$1''' radbadal áko}}, gidrengoká {{PLURAL:$2|de aŧí|'''$2''' de teŧí}}, $5, $4 ná hisáb aŧ.",
+'rcnotefrom' => "Şefko raddobadal ák '''$2''' án maroko ('''$1''' iskán páş o)",
+'rclistfrom' => '$1 án púskuná radbadal áke nişán et',
+'rcshowhideminor' => 'Cunká radbadal áte $1',
+'rcshowhidebots' => 'Boŧ áte $1',
+'rcshowhideliu' => 'Drustírástí kárband áte $1',
+'rcshowhideanons' => 'Bidar kárband áte $1',
+'rcshowhidemine' => 'Kaná radbadal áte $1',
+'rclinks' => 'Guđđíko $2 de teŧí maroká guđđíko $1 radbadal e nişán et<br />$3',
+'diff' => 'fark',
+'hist' => 'lekav',
+'hide' => 'aodem kar',
+'show' => 'níşán et',
+'minoreditletter' => 'C',
+'newpageletter' => 'P',
+'boteditletter' => 'x',
+'rc-enhanced-expand' => 'Vaddíko hál e nişán et (JavaScript xuáik)',
+'rc-enhanced-hide' => 'Vaddíko hál e đakka',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Amrang á radbadal ák',
+'recentchangeslinked' => 'Amrang á radbadal ák',
 'recentchangeslinked-toolbox' => 'Amrang á radbadal ák',
-'recentchangeslinked-title'   => '"$1" ná bábat radbadal ák',
+'recentchangeslinked-title' => '"$1" ná bábat radbadal ák',
 'recentchangeslinked-summary' => "Dá amo radbadal átá rid e aráfk ki zút áteaŧ amo panna ģáteŧí massuno aráfk ki xáso panna se án gańđok o (yá xáso xáot asená básk áteton). [[Special:Watchlist|Ná xiálí rid]] aŧí sáŕí panna ģáte '''zanđ nivişt''' aŧ nişán kanningáne.",
-'recentchangeslinked-page'    => 'Panna ná pin:',
+'recentchangeslinked-page' => 'Panna ná pin:',
 
 # Upload
-'upload'        => 'Fáil laggif',
+'upload' => 'Fáil laggif',
 'uploadlogpage' => 'Laggifing ná hisáb',
-'filedesc'      => 'Bungapp',
+'filedesc' => 'Bungapp',
 'uploadedimage' => '"[[$1]]" laggifingá',
 
-'license'        => 'Muxtárnáma',
+'license' => 'Muxtárnáma',
 'license-header' => 'Muxtárnáma',
 
 # File description page
-'file-anchor-link'          => 'Fáil',
-'filehist'                  => 'Fáil ná lekav',
-'filehist-help'             => 'Táríx/vaxt e xaļ o fáil e amo droşum aŧí ur ki amo vaxt á ass.',
-'filehist-revert'           => 'ságí',
-'filehist-current'          => 'sáŕí',
-'filehist-datetime'         => 'De/Vaxt',
-'filehist-thumb'            => 'Cunikfoŧú',
-'filehist-thumbtext'        => '$1 íá badal droşum kin cunikfoŧú',
-'filehist-user'             => 'Kárband',
-'filehist-dimensions'       => 'Bálád',
-'filehist-comment'          => 'Darşánxiál',
-'imagelinks'                => 'Fáil ná gańđ ák',
-'linkstoimage'              => 'Şefko {{PLURAL:$1|panna fáil ton gańđok e|$1 panna ģák fáil ton gańđok o}}:',
+'file-anchor-link' => 'Fáil',
+'filehist' => 'Fáil ná lekav',
+'filehist-help' => 'Táríx/vaxt e xaļ o fáil e amo droşum aŧí ur ki amo vaxt á ass.',
+'filehist-revert' => 'ságí',
+'filehist-current' => 'sáŕí',
+'filehist-datetime' => 'De/Vaxt',
+'filehist-thumb' => 'Cunikfoŧú',
+'filehist-thumbtext' => '$1 íá badal droşum kin cunikfoŧú',
+'filehist-user' => 'Kárband',
+'filehist-dimensions' => 'Bálád',
+'filehist-comment' => 'Darşánxiál',
+'imagelinks' => 'Fáil ná gańđ ák',
+'linkstoimage' => 'Şefko {{PLURAL:$1|panna fáil ton gańđok e|$1 panna ģák fáil ton gańđok o}}:',
 'uploadnewversion-linktext' => 'Dá fáil ná púskuno badal droşum as laggif',
 
 # Random page
@@ -405,30 +402,30 @@ Ná radbadal ák deskáne atíko matano.",
 'statistics' => 'Hisábkitáb',
 
 # Miscellaneous special pages
-'nbytes'        => '$1 {{PLURAL:$1|báiŧ|báiŧ}}',
-'nmembers'      => '$1 {{PLURAL:$1|básk|básk}}',
-'prefixindex'   => 'Ģuŧŧ panna ģák sarloaz ton',
-'newpages'      => 'Púskuná panna ģák',
-'move'          => 'Surif',
-'movethispage'  => 'Dá panna e surif',
+'nbytes' => '$1 {{PLURAL:$1|báiŧ|báiŧ}}',
+'nmembers' => '$1 {{PLURAL:$1|básk|básk}}',
+'prefixindex' => 'Ģuŧŧ panna ģák sarloaz ton',
+'newpages' => 'Púskuná panna ģák',
+'move' => 'Surif',
+'movethispage' => 'Dá panna e surif',
 'pager-newer-n' => '{{PLURAL:$1|púskuná 1|púskuná $1}}',
 'pager-older-n' => '{{PLURAL:$1|mutkuná 1|mutkuná $1}}',
 
 # Book sources
-'booksources'               => 'Kitábí bumpad',
+'booksources' => 'Kitábí bumpad',
 'booksources-search-legend' => 'Kitábí bumpad átekin paŧŧpol',
-'booksources-go'            => 'Ráím',
+'booksources-go' => 'Ráím',
 
 # Special:Log
 'log' => 'Lekav',
 
 # Special:AllPages
-'allpages'       => 'Ģuŧŧ panna ģák',
+'allpages' => 'Ģuŧŧ panna ģák',
 'alphaindexline' => '$1 án $2 iskán',
-'prevpage'       => 'Mustko panna ($1)',
-'allpagesfrom'   => 'Dáŕaŧ biná maroká panna ģáte nişán et:',
-'allpagesto'     => 'Dáŕaŧ esar maroká panna ģáte nişán et:',
-'allarticles'    => 'Ģuŧŧ panna ģák',
+'prevpage' => 'Mustko panna ($1)',
+'allpagesfrom' => 'Dáŕaŧ biná maroká panna ģáte nişán et:',
+'allpagesto' => 'Dáŕaŧ esar maroká panna ģáte nişán et:',
+'allarticles' => 'Ģuŧŧ panna ģák',
 'allpagessubmit' => 'Ráím',
 
 # Special:Categories
@@ -447,112 +444,112 @@ Ná radbadal ák deskáne atíko matano.",
 'emailuser' => 'Dá kárband e girokŧapál as mon et',
 
 # Watchlist
-'watchlist'         => 'Kaná xiálí rid',
-'mywatchlist'       => 'Kaná xiálí rid',
-'removedwatchtext'  => 'Panna "[[:$1]]" e [[Special:Watchlist|ná xiálírid]] án kaşşingáne.',
-'watch'             => 'Xiálí mar',
-'watchthispage'     => 'Dá panna ná xiálí mar',
-'unwatch'           => 'Bexiál mar',
+'watchlist' => 'Kaná xiálí rid',
+'mywatchlist' => 'Kaná xiálí rid',
+'removedwatchtext' => 'Panna "[[:$1]]" e [[Special:Watchlist|ná xiálírid]] án kaşşingáne.',
+'watch' => 'Xiálí mar',
+'watchthispage' => 'Dá panna ná xiálí mar',
+'unwatch' => 'Bexiál mar',
 'watchlist-details' => 'Ná xiálí rid aŧí {{PLURAL:$1|$1 panna se|$1 panna o}}, ítgap panna ģák hisáb aŧí affas.',
-'wlshowlast'        => 'Guđđíko $1 ganŧa $2 de $3 e nişán et',
+'wlshowlast' => 'Guđđíko $1 ganŧa $2 de $3 e nişán et',
 'watchlist-options' => 'Xiálírid gicenk',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Xiálí manning...',
+'watching' => 'Xiálí manning...',
 'unwatching' => 'Bexiál manning...',
 
 # Delete
-'deletepage'            => 'Panna e mesa',
-'confirmdeletetext'     => 'Ní panna as e oná lekav ton avár mesing aŧí us.
+'deletepage' => 'Panna e mesa',
+'confirmdeletetext' => 'Ní panna as e oná lekav ton avár mesing aŧí us.
 Dá pakk kar ki ní dun kanning xuáisa, dáná pad án poh us, o ní dád [[{{MediaWiki:Policy-url}}|ráhband]] ná vaŕ aŧ kanning us.',
-'actioncomplete'        => 'Amal sarjam',
-'actionfailed'          => 'Amal besob mass',
-'deletedtext'           => '"$1" mesingáne.
+'actioncomplete' => 'Amal sarjam',
+'actionfailed' => 'Amal besob mass',
+'deletedtext' => '"$1" mesingáne.
 Zút áteaŧ mesing átá lekav kin $2 e ur.',
-'dellogpage'            => 'Mesing ná hisáb',
-'deletecomment'         => 'Dalíl:',
-'deleteotherreason'     => 'Elo/pen dalíl:',
+'dellogpage' => 'Mesing ná hisáb',
+'deletecomment' => 'Dalíl:',
+'deleteotherreason' => 'Elo/pen dalíl:',
 'deletereasonotherlist' => 'Elo dalíl',
 
 # Rollback
 'rollbacklink' => 'ģuŧŧ e aŕsa',
 
 # Protect
-'protectlogpage'              => 'Rakk hisáb',
-'protectedarticle'            => '"[[$1]]" rakk mass',
-'protectcomment'              => 'Dalíl',
-'protect-default'             => 'Ģuŧŧ kárband áte mokal et',
-'protect-fallback'            => '"$1" mokal xuáik',
+'protectlogpage' => 'Rakk hisáb',
+'protectedarticle' => '"[[$1]]" rakk mass',
+'protectcomment' => 'Dalíl',
+'protect-default' => 'Ģuŧŧ kárband áte mokal et',
+'protect-fallback' => '"$1" mokal xuáik',
 'protect-level-autoconfirmed' => 'Púskuná o bepin á kárband átiá rok xaļ',
-'protect-level-sysop'         => 'Bíra Amaldár ák',
-'restriction-type'            => 'Mokal:',
+'protect-level-sysop' => 'Bíra Amaldár ák',
+'restriction-type' => 'Mokal:',
 
 # Undelete
-'undeletelink'     => 'ur/aŕsa',
+'undeletelink' => 'ur/aŕsa',
 'undeleteviewlink' => 'ur',
 
 # Namespace form on various pages
-'namespace'      => 'Pin-jága:',
-'invert'         => 'Gicen e elo mon kar',
+'namespace' => 'Pin-jága:',
+'invert' => 'Gicen e elo mon kar',
 'blanknamespace' => '(Bundar)',
 
 # Contributions
-'contributions'       => 'Kárband ná baŕáhík',
+'contributions' => 'Kárband ná baŕáhík',
 'contributions-title' => '$1 kin kárband ná baŕáhík',
-'mycontris'           => 'Kaná baŕáhík',
-'contribsub2'         => '$1 ($2) kin',
-'uctop'               => '(buŕz buŕzko)',
-'month'               => 'Dá tú (o must) án:',
-'year'                => 'Dá sál (o must) án:',
+'mycontris' => 'Kaná baŕáhík',
+'contribsub2' => '$1 ($2) kin',
+'uctop' => '(buŕz buŕzko)',
+'month' => 'Dá tú (o must) án:',
+'year' => 'Dá sál (o must) án:',
 
-'sp-contributions-newbies'  => 'Bíra púskuná pinváxub átá baŕáhí te nişán et',
+'sp-contributions-newbies' => 'Bíra púskuná pinváxub átá baŕáhí te nişán et',
 'sp-contributions-blocklog' => 'rok aná hisáb',
-'sp-contributions-talk'     => 'ítgap',
-'sp-contributions-search'   => 'Baŕáhí kin paŧŧopol',
+'sp-contributions-talk' => 'ítgap',
+'sp-contributions-search' => 'Baŕáhí kin paŧŧopol',
 'sp-contributions-username' => 'IP pajjár yá kárband pin:',
-'sp-contributions-submit'   => 'Paŧŧopol',
+'sp-contributions-submit' => 'Paŧŧopol',
 
 # What links here
-'whatlinkshere'            => 'Dáŕe ant gańđoke',
-'whatlinkshere-title'      => '$1 aton gańđok á panna ģák',
-'whatlinkshere-page'       => 'Panna:',
-'linkshere'                => "Şefko panna ģák '''[[:$1]]''' ton gańđok o:",
-'isredirect'               => 'aŕsengoká panna',
-'istemplate'               => 'aviŕdaí',
-'isimage'                  => 'fáil gańđ',
-'whatlinkshere-prev'       => '{{PLURAL:$1|mustko|mustko $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|randíko|randíko $1}}',
-'whatlinkshere-links'      => '← gańđ ák',
+'whatlinkshere' => 'Dáŕe ant gańđoke',
+'whatlinkshere-title' => '$1 aton gańđok á panna ģák',
+'whatlinkshere-page' => 'Panna:',
+'linkshere' => "Şefko panna ģák '''[[:$1]]''' ton gańđok o:",
+'isredirect' => 'aŕsengoká panna',
+'istemplate' => 'aviŕdaí',
+'isimage' => 'fáil gańđ',
+'whatlinkshere-prev' => '{{PLURAL:$1|mustko|mustko $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|randíko|randíko $1}}',
+'whatlinkshere-links' => '← gańđ ák',
 'whatlinkshere-hideredirs' => '$1 aŕsik',
-'whatlinkshere-hidetrans'  => 'aviŕdaí te $1',
-'whatlinkshere-hidelinks'  => 'gańđ áte $1',
-'whatlinkshere-filters'    => 'Birvek',
+'whatlinkshere-hidetrans' => 'aviŕdaí te $1',
+'whatlinkshere-hidelinks' => 'gańđ áte $1',
+'whatlinkshere-filters' => 'Birvek',
 
 # Block/unblock
-'blockip'                  => 'Kárband á rok xaļ',
-'ipboptions'               => '2 ganŧa:2 hours,1 de:1 day,3 de:3 days,1 afta:1 week,2 afta:2 weeks,1 tú:1 month,3 tú:3 months,6 tú:6 months,1 sál:1 year,be kacc:infinite',
-'ipblocklist'              => 'IP pajjár o kárbandpin ák ki rok laggok e iyá tá',
-'blocklink'                => 'rok xaļ',
-'unblocklink'              => 'rok xalás',
-'change-blocklink'         => 'rok aŧí radbadal',
-'contribslink'             => 'baŕáhík',
-'blocklogpage'             => 'Rok hisáb',
-'unblocklogentry'          => '$1 án rok mur kanningá',
+'blockip' => 'Kárband á rok xaļ',
+'ipboptions' => '2 ganŧa:2 hours,1 de:1 day,3 de:3 days,1 afta:1 week,2 afta:2 weeks,1 tú:1 month,3 tú:3 months,6 tú:6 months,1 sál:1 year,be kacc:infinite',
+'ipblocklist' => 'IP pajjár o kárbandpin ák ki rok laggok e iyá tá',
+'blocklink' => 'rok xaļ',
+'unblocklink' => 'rok xalás',
+'change-blocklink' => 'rok aŧí radbadal',
+'contribslink' => 'baŕáhík',
+'blocklogpage' => 'Rok hisáb',
+'unblocklogentry' => '$1 án rok mur kanningá',
 'block-log-flags-nocreate' => 'pinváxubí á rok xallingá',
 
 # Move page
-'movearticle'    => 'Panna e surif:',
-'newtitle'       => 'Púskuná sarhál á:',
-'movepagebtn'    => 'Panna e surif',
-'pagemovedsub'   => 'Surifing sarsob mass',
+'movearticle' => 'Panna e surif:',
+'newtitle' => 'Púskuná sarhál á:',
+'movepagebtn' => 'Panna e surif',
+'pagemovedsub' => 'Surifing sarsob mass',
 'movepage-moved' => '\'\'\'"$1" e "$2"\'\'\' á surifingáne',
-'articleexists'  => 'Anná pin aná panna málav án sáŕí e, yá ná tiroká pin ravá aff.
+'articleexists' => 'Anná pin aná panna málav án sáŕí e, yá ná tiroká pin ravá aff.
 Pen pin as gicen kar.',
-'movedto'        => 'dáng surifingá',
-'movetalk'       => 'Aviŕda ģá ítgap panna e surif',
-'movelogpage'    => 'Surifing ná hisáb',
-'movereason'     => 'Dalíl:',
-'revertmove'     => 'málav ná',
+'movedto' => 'dáng surifingá',
+'movetalk' => 'Aviŕda ģá ítgap panna e surif',
+'movelogpage' => 'Surifing ná hisáb',
+'movereason' => 'Dalíl:',
+'revertmove' => 'málav ná',
 
 # Namespace 8 related
 'allmessagesname' => 'Pin',
@@ -561,68 +558,68 @@ Pen pin as gicen kar.',
 'thumbnail-more' => 'Bhallun kar',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Ná kárbandí panna',
-'tooltip-pt-mytalk'               => 'Ná ítgap panna',
-'tooltip-pt-preferences'          => 'Ná gicenk',
-'tooltip-pt-watchlist'            => 'Amo panna ģátá rid aráfteŧí radbadal ná xiálí us',
-'tooltip-pt-mycontris'            => 'Ná baŕáhí tá rid',
-'tooltip-pt-login'                => 'Drustírástí kes to bház juán e, vale, lázum aff',
-'tooltip-pt-logout'               => 'Bidar mar',
-'tooltip-ca-talk'                 => 'Niviştánk ná bárav aŧ ítgap',
-'tooltip-ca-edit'                 => 'Num dá panna ŧí radbadal kanning kere. Radbadal áte aŧíko kanning án must sarí jác e ta zarúr albo.',
-'tooltip-ca-addsection'           => 'Púskuno vanđ asená biná kar',
-'tooltip-ca-viewsource'           => 'Dá panna rakk karok e.
+'tooltip-pt-userpage' => 'Ná kárbandí panna',
+'tooltip-pt-mytalk' => 'Ná ítgap panna',
+'tooltip-pt-preferences' => 'Ná gicenk',
+'tooltip-pt-watchlist' => 'Amo panna ģátá rid aráfteŧí radbadal ná xiálí us',
+'tooltip-pt-mycontris' => 'Ná baŕáhí tá rid',
+'tooltip-pt-login' => 'Drustírástí kes to bház juán e, vale, lázum aff',
+'tooltip-pt-logout' => 'Bidar mar',
+'tooltip-ca-talk' => 'Niviştánk ná bárav aŧ ítgap',
+'tooltip-ca-edit' => 'Num dá panna ŧí radbadal kanning kere. Radbadal áte aŧíko kanning án must sarí jác e ta zarúr albo.',
+'tooltip-ca-addsection' => 'Púskuno vanđ asená biná kar',
+'tooltip-ca-viewsource' => 'Dá panna rakk karok e.
 Dáná bumpad e unning kesa',
-'tooltip-ca-history'              => 'Dá panna ná málav ná şefbuŕz ák',
-'tooltip-ca-protect'              => 'Dá panna e rakk kar',
-'tooltip-ca-delete'               => 'Dá panna e mesa',
-'tooltip-ca-move'                 => 'Dá panna e surif',
-'tooltip-ca-watch'                => 'Dá panna e tená xiálí rid aŧí avár kar',
-'tooltip-ca-unwatch'              => 'Dá panna e tená xiálí rid án kaşşa',
-'tooltip-search'                  => '{{SITENAME}} aŧí paŧŧa',
-'tooltip-search-go'               => 'Aga caŧŧ andá pin aná panna are to in iyá ta',
-'tooltip-search-fulltext'         => 'Panna ģáteŧí dá laoz áte paŧŧa',
-'tooltip-p-logo'                  => 'Monpanna ģá in',
-'tooltip-n-mainpage'              => 'Monpanna ģá in',
-'tooltip-n-mainpage-description'  => 'Monpanna ģá in',
-'tooltip-n-portal'                => 'Kárem ná bábat, ní ant kanning kesa, giŕá te aráŕe paŧŧoí e',
-'tooltip-n-currentevents'         => 'Sáŕí sefbuŕz átá bumpadí cáindárí',
-'tooltip-n-recentchanges'         => 'Vikí ŧí zút áteaŧ maroká radbadal ák',
-'tooltip-n-randompage'            => 'Saŧŧí panna as mal',
-'tooltip-n-help'                  => 'Paŧŧing xaning ná jága',
-'tooltip-t-whatlinkshere'         => 'Ģuŧ amo vikí panna ģátá rid arfák dáŕe gańđoko',
-'tooltip-t-recentchangeslinked'   => 'Dá panna ton gańđoká panna ģáteŧí zút áteaŧ maroká radbadal ák',
-'tooltip-feed-rss'                => 'Dá panna kin RSS serí',
-'tooltip-feed-atom'               => 'Dá panna kin Atom serí',
-'tooltip-t-contributions'         => 'Dá kárband ná baŕáhí tá rid e ur',
-'tooltip-t-emailuser'             => 'Dá kárband e girokŧapál as mon et',
-'tooltip-t-upload'                => 'Fáil laggif',
-'tooltip-t-specialpages'          => 'Ģuŧŧ xás á panna ģátá ridband',
-'tooltip-t-print'                 => 'Dá panna ná chapáí droşum',
-'tooltip-t-permalink'             => 'Panna ná dá badaldroşum ná pakká gańđ',
-'tooltip-ca-nstab-main'           => 'Niviştánk ná panna e ur',
-'tooltip-ca-nstab-user'           => 'Kárband ná panna e ur',
-'tooltip-ca-nstab-special'        => 'Dá xáso panna as e. Ní dáŧí radbadal kanning kappesa.',
-'tooltip-ca-nstab-project'        => 'Bunkárem ná panna e ur',
-'tooltip-ca-nstab-image'          => 'Fáil ná panna e ur',
-'tooltip-ca-nstab-template'       => 'Kálib e ur',
-'tooltip-ca-nstab-category'       => 'Xáot panna e ur',
-'tooltip-minoredit'               => 'Dád cunko radbadal as leka',
-'tooltip-save'                    => 'Tená radbadal áte atíko kar',
-'tooltip-preview'                 => 'Tená radbadal átá sarí jác e aļ. Minnatvár!',
-'tooltip-diff'                    => 'Nivişt aŧí tená radbadal áte nişán et',
+'tooltip-ca-history' => 'Dá panna ná málav ná şefbuŕz ák',
+'tooltip-ca-protect' => 'Dá panna e rakk kar',
+'tooltip-ca-delete' => 'Dá panna e mesa',
+'tooltip-ca-move' => 'Dá panna e surif',
+'tooltip-ca-watch' => 'Dá panna e tená xiálí rid aŧí avár kar',
+'tooltip-ca-unwatch' => 'Dá panna e tená xiálí rid án kaşşa',
+'tooltip-search' => '{{SITENAME}} aŧí paŧŧa',
+'tooltip-search-go' => 'Aga caŧŧ andá pin aná panna are to in iyá ta',
+'tooltip-search-fulltext' => 'Panna ģáteŧí dá laoz áte paŧŧa',
+'tooltip-p-logo' => 'Monpanna ģá in',
+'tooltip-n-mainpage' => 'Monpanna ģá in',
+'tooltip-n-mainpage-description' => 'Monpanna ģá in',
+'tooltip-n-portal' => 'Kárem ná bábat, ní ant kanning kesa, giŕá te aráŕe paŧŧoí e',
+'tooltip-n-currentevents' => 'Sáŕí sefbuŕz átá bumpadí cáindárí',
+'tooltip-n-recentchanges' => 'Vikí ŧí zút áteaŧ maroká radbadal ák',
+'tooltip-n-randompage' => 'Saŧŧí panna as mal',
+'tooltip-n-help' => 'Paŧŧing xaning ná jága',
+'tooltip-t-whatlinkshere' => 'Ģuŧ amo vikí panna ģátá rid arfák dáŕe gańđoko',
+'tooltip-t-recentchangeslinked' => 'Dá panna ton gańđoká panna ģáteŧí zút áteaŧ maroká radbadal ák',
+'tooltip-feed-rss' => 'Dá panna kin RSS serí',
+'tooltip-feed-atom' => 'Dá panna kin Atom serí',
+'tooltip-t-contributions' => 'Dá kárband ná baŕáhí tá rid e ur',
+'tooltip-t-emailuser' => 'Dá kárband e girokŧapál as mon et',
+'tooltip-t-upload' => 'Fáil laggif',
+'tooltip-t-specialpages' => 'Ģuŧŧ xás á panna ģátá ridband',
+'tooltip-t-print' => 'Dá panna ná chapáí droşum',
+'tooltip-t-permalink' => 'Panna ná dá badaldroşum ná pakká gańđ',
+'tooltip-ca-nstab-main' => 'Niviştánk ná panna e ur',
+'tooltip-ca-nstab-user' => 'Kárband ná panna e ur',
+'tooltip-ca-nstab-special' => 'Dá xáso panna as e. Ní dáŧí radbadal kanning kappesa.',
+'tooltip-ca-nstab-project' => 'Bunkárem ná panna e ur',
+'tooltip-ca-nstab-image' => 'Fáil ná panna e ur',
+'tooltip-ca-nstab-template' => 'Kálib e ur',
+'tooltip-ca-nstab-category' => 'Xáot panna e ur',
+'tooltip-minoredit' => 'Dád cunko radbadal as leka',
+'tooltip-save' => 'Tená radbadal áte atíko kar',
+'tooltip-preview' => 'Tená radbadal átá sarí jác e aļ. Minnatvár!',
+'tooltip-diff' => 'Nivişt aŧí tená radbadal áte nişán et',
 'tooltip-compareselectedversions' => 'Dá panna ná irá gicen karok radbadal droşum tá niám aŧí fark e ur',
-'tooltip-watch'                   => 'Dá panna e tená xiálí rid aŧí avár kar',
-'tooltip-rollback'                => '"Ģuŧŧ e aŕsa" án dá panna ŧí guđđíko baŕáhí tirok ná ģuŧŧ radbadal ák asi dakk aŧí aŕsengira.',
-'tooltip-undo'                    => '"Aŕsa" e xalling án dá radbadal aŕsengik o sarí jác droşum aŧí radbadal ná darí malingik. Dáŕán bungap aŧí dalíl likking ná vár rasengik.',
-'tooltip-summary'                 => 'Guańđo bungapp as aviŕda kar',
+'tooltip-watch' => 'Dá panna e tená xiálí rid aŧí avár kar',
+'tooltip-rollback' => '"Ģuŧŧ e aŕsa" án dá panna ŧí guđđíko baŕáhí tirok ná ģuŧŧ radbadal ák asi dakk aŧí aŕsengira.',
+'tooltip-undo' => '"Aŕsa" e xalling án dá radbadal aŕsengik o sarí jác droşum aŧí radbadal ná darí malingik. Dáŕán bungap aŧí dalíl likking ná vár rasengik.',
+'tooltip-summary' => 'Guańđo bungapp as aviŕda kar',
 
 # Browsing diffs
 'previousdiff' => '← Mutkuná radbadal',
-'nextdiff'     => 'Púskuná radbadal',
+'nextdiff' => 'Púskuná radbadal',
 
 # Metadata
-'metadata-expand'   => 'Vaddíko hál e nişán et',
+'metadata-expand' => 'Vaddíko hál e nişán et',
 'metadata-collapse' => 'Vaddíko hál e đakka',
 
 # External editor support
@@ -631,12 +628,12 @@ Dáná bumpad e unning kesa',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'ģuŧŧ',
 'namespacesall' => 'ģuŧŧ',
-'monthsall'     => 'ģuŧŧ',
+'monthsall' => 'ģuŧŧ',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Đek kunoká radbadal áke ur',
 'watchlisttools-edit' => 'Xiálí rid e ur o badal kar',
-'watchlisttools-raw'  => 'Bekacc á xiálírid aŧí radbadal kar',
+'watchlisttools-raw' => 'Bekacc á xiálírid aŧí radbadal kar',
 
 # Special:SpecialPages
 'specialpages' => 'Xás á panna ģák',
index 263acb9..d371f4a 100644 (file)
@@ -115,7 +115,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'NedavneIzmjene' ),
        'Recentchangeslinked'       => array( 'PovezaneNedavneIzmjene' ),
        'Revisiondelete'            => array( 'VratiBrisanje' ),
-       'RevisionMove'              => array( 'PremjestanjeRevizije' ),
        'Search'                    => array( 'Pretraga' ),
        'Shortpages'                => array( 'KratkeStranice' ),
        'Specialpages'              => array( 'SpecijalneStranice' ),
@@ -153,7 +152,6 @@ $magicWords = array(
        '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' ),
@@ -287,7 +285,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Sakrij patrolirane izmjene u nedavnim promjenama',
 'tog-newpageshidepatrolled' => 'Sakrij patrolirane stranice sa spiska novih stranica',
 'tog-extendwatchlist' => 'Proširi spisak praćenja za pogled svih izmjena, ne samo nedavnih',
-'tog-usenewrc' => 'Korištenje poboljšanog spiska nedavnih izmjena (zahtijeva JavaScript)',
+'tog-usenewrc' => 'Grupiraj izmjene po stranicama sa nedavnih izmjena i praćenih članaka (zahtijeva JavaScript)',
 'tog-numberheadings' => 'Automatski numeriši podnaslove',
 'tog-showtoolbar' => 'Prikaži dugmiće za izmjene (JavaScript)',
 'tog-editondblclick' => 'Izmijeni stranice dvostrukim klikom (JavaScript)',
@@ -295,17 +293,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Uključite uređivanje odjeljka sa pritiskom na desno dugme miša u naslovu odjeljka (JavaScript)',
 'tog-showtoc' => 'Prikaži sadržaj (u svim stranicama sa više od tri podnaslova)',
 'tog-rememberpassword' => 'Zapamti moju šifru u ovom pregledniku (najviše $1 {{PLURAL:$1|dan|dana}})',
-'tog-watchcreations' => 'Dodaj stranice koje ja napravim u moj spisak praćenih članaka',
-'tog-watchdefault' => 'Dodaj stranice koje uređujem u moj spisak praćenih članaka',
-'tog-watchmoves' => 'Stranice koje pomjerim dodaj na spisak praćenja',
-'tog-watchdeletion' => 'Stranice koje obrišem dodaj na spisak praćenja',
+'tog-watchcreations' => 'Dodaj stranice i datoteke koje napravim na moj spisak praćenih članaka',
+'tog-watchdefault' => 'Dodaj stranice i datoteke koje uređujem na moj spisak praćenih članaka',
+'tog-watchmoves' => 'Dodaj stranice i datoteke koje pomjerim na moj spisak praćenih članaka',
+'tog-watchdeletion' => 'Dodaj stranice i datoteke koje izbrišem na moj spisak praćenih članaka',
 'tog-minordefault' => 'Označi sve izmjene malim isprva',
 'tog-previewontop' => 'Prikaži pretpregled prije polja za izmjenu a ne poslije',
 'tog-previewonfirst' => 'Prikaži izgled pri prvoj izmjeni',
 'tog-nocache' => 'Onemogući keširanje stranica u pregledniku',
-'tog-enotifwatchlistpages' => 'Pošalji mi e-poštu kad se promijene stranice',
+'tog-enotifwatchlistpages' => 'Pošalji mi e-mail kada se promijeni stranica ili datoteka sa mog spiska praćenih članaka',
 'tog-enotifusertalkpages' => 'Pošalji mi e-poštu kad se promijeni moja korisnička stranica za razgovor',
-'tog-enotifminoredits' => 'Pošalji mi e-poštu takođe za male izmjene stranica',
+'tog-enotifminoredits' => 'Pošalji mi e-poštu također za male izmjene u stranicama i datotekama',
 'tog-enotifrevealaddr' => 'Otkrij adresu moje e-pošte u porukama obaviještenja',
 'tog-shownumberswatching' => 'Prikaži broj korisnika koji prate',
 'tog-oldsig' => 'Postojeći potpis:',
@@ -329,7 +327,7 @@ $messages = array(
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
-'underline-default' => 'Po podešavanjima preglednika',
+'underline-default' => 'Po standardu izgleda ili preglednika',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stil slova područja uređivanja:',
@@ -414,8 +412,8 @@ $messages = array(
 'newwindow' => '(otvara se u novom prozoru)',
 'cancel' => 'Poništite',
 'moredotdotdot' => 'Još...',
-'mypage' => 'Moja stranica',
-'mytalk' => 'Moj razgovor',
+'mypage' => 'Korisnička stranica',
+'mytalk' => 'Razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
 'navigation' => 'Navigacija',
 'and' => '&#32;i',
@@ -425,7 +423,6 @@ $messages = array(
 'qbbrowse' => 'Prelistajte',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
 'qbmyoptions' => 'Moje opcije',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'ČPP',
@@ -438,7 +435,7 @@ $messages = array(
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati obrisano',
 'vector-action-unprotect' => 'Promijeni zaštitu',
-'vector-simplesearch-preference' => 'Omogući napredne sugestije pretrage (samo vector koža)',
+'vector-simplesearch-preference' => 'Omogući pojednostavljenu traku pretrage (samo vektorski izgled)',
 'vector-view-create' => 'Napravi',
 'vector-view-edit' => 'Uređivanje',
 'vector-view-history' => 'Pregled historije',
@@ -448,6 +445,7 @@ $messages = array(
 'namespaces' => 'Imenski prostori',
 'variants' => 'Varijante',
 
+'navigation-heading' => 'Navigacija',
 'errorpagetitle' => 'Greška',
 'returnto' => 'Povratak na $1.',
 'tagline' => 'Izvor: {{SITENAME}}',
@@ -544,6 +542,10 @@ $1',
 'youhavenewmessages' => 'Imate $1 ($2).',
 'newmessageslink' => 'novih poruka',
 'newmessagesdifflink' => 'posljednja promjena',
+'youhavenewmessagesfromusers' => 'Imate $1 od {{PLURAL:$3|drugog korisnika|$3 korisnika}} ($2).',
+'youhavenewmessagesmanyusers' => 'Imate $1 od mnogo korisnika ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|novu poruku|nove poruke}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|zadnja izmjena|zadnje izmjene}}',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
 'editsection-brackets' => '[$1]',
@@ -596,10 +598,10 @@ Spisak valjanih posebnih stranica se može naći na [[Special:SpecialPages|{{int
 # General errors
 'error' => 'Greška',
 'databaseerror' => 'Greška u bazi',
-'dberrortext' => 'Desila se sintaksna greška upita baze.
-Ovo se desilo zbog moguće greške u softveru.
-Posljednji pokušani upit je bio: <blockquote><tt>$1</tt></blockquote> iz funkcije "<tt>$2</tt>".
-Baza podataka je vratila grešku "<tt>$3: $4</tt>".',
+'dberrortext' => 'Desila je se sintaksna greška kod upita prema bazi podataka.
+Ovo je se desilo zbog moguće greške u softveru.
+Posljednji pokušani upit je bio: <blockquote><code>$1</code></blockquote> iz funkcije "<code>$2</code>".
+Baza podataka je vratila grešku "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Desila se sintaksna greška upita baze.
 Posljednji pokušani upit je bio:
 "$1"
@@ -637,6 +639,8 @@ Molimo Vas da ovo prijavite [[Special:ListUsers/sysop|administratoru]] sa navođ
 'cannotdelete' => 'Ne može se obrisati stranica ili datoteka "$1".
 Moguće je da ju je neko drugi već obrisao.',
 'cannotdelete-title' => 'Ne mogu izbrisati stranicu "$1"',
+'delete-hook-aborted' => 'Brisanje je prekinuo softverski priključak.
+Nije ponuđeno nikakvo objašnjenje.',
 'badtitle' => 'Loš naslov',
 'badtitletext' => 'Zahtjevani naslov stranice je bio neispravan, prazan ili neispravno povezan međujezički ili interviki naslov.',
 'perfcached' => 'Slijedeći podaci su keširani i možda neće biti u potpunosti ažurirani. Keš sadrži najviše {{PLURAL:$1|jedan rezultat|$1 rezultata}}.',
@@ -653,10 +657,11 @@ Pretraga: $2',
 'protectedpagetext' => 'Ova stranica je zaključana da bi se spriječile izmjene.',
 'viewsourcetext' => 'Možete vidjeti i kopirati izvorni tekst ove stranice:',
 'viewyourtext' => "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
-'protectedinterface' => 'Ova stranica je zaštićena jer sadrži tekst MediaWiki programa.',
+'protectedinterface' => 'Ova stranica sadrži tekst korisničkog okruženja za softver na ovom wikiju i zaštićena je radi sprečavanja zloupotrebe.
+Da biste dodali ili izmjenili prijevode svih wikija, posjetite [//translatewiki.net/  translatewiki.net], projekat za lokalizaciju Mediawikija.',
 'editinginterface' => "'''Upozorenje:''' Mijenjate stranicu koja sadrži aktivan tekst programa.
-Promjene na ovoj stranici dovode i do promjena za druge korisnike.
-Za prijevode, molimo Vas koristite [//translatewiki.net/wiki/Main_Page?setlang=bs translatewiki.net], projekt prijevoda za MediaWiki.",
+Promjene na ovoj stranici dovode i do promjena za druge korisnike ovog wikija.
+Za dodavanje ili promjene prijevoda svih wikija, molimo Vas koristite [//translatewiki.net/ translatewiki.net], projekt prijevoda za MediaWiki.",
 'sqlhidden' => '(SQL pretraga sakrivena)',
 'cascadeprotected' => 'Uređivanje ove stranice je zabranjeno jer sadrži {{PLURAL:$1|stranicu zaštićenu|stranice zaštićene}} od uređivanja iz razloga:
 $2',
@@ -667,6 +672,7 @@ $2',
 'titleprotected' => 'Naslov stranice je zaštićen od postavljanja od strane korisnika [[User:$1|$1]].
 Iz razloga "\'\'$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 anti-virus program: ''$1''",
@@ -676,10 +682,10 @@ Iz razloga "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Sad ste odjavljeni.'''
 
-Možete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo [[Special:UserLogin|prijaviti]] kao isti ili kao drugi korisnik.
+Možete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo <span class='plainlinks'>[$1 prijaviti]</span> kao isti ili kao drugi korisnik.
 Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
-'welcomecreation' => '== Dobro došli, $1 ==
-Vaš nalog je napravljen.
+'welcomeuser' => 'Dobro došli, $1',
+'welcomecreation-msg' => 'Vaš nalog je napravljen.
 Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} podešavanja]].',
 'yourname' => 'Korisničko ime:',
 'yourpassword' => 'Šifra:',
@@ -687,6 +693,7 @@ Ne zaboravite da prilagodite sebi svoja [[Special:Preferences|{{SITENAME}} pode
 'remembermypassword' => 'Zapamti moju šifru na ovom računaru (najviše $1 {{PLURAL:$1|dan|dana|dana}})',
 'securelogin-stick-https' => 'Ostani povezan na HTTPS nakon prijave',
 'yourdomainname' => 'Vaš domen:',
+'password-change-forbidden' => 'Ne možete da promjenite lozinku na ovom wikiju.',
 'externaldberror' => 'Došlo je do greške pri vanjskoj autorizaciji baze podataka ili vam nije dopušteno osvježavanje Vašeg vanjskog korisničkog računa.',
 'login' => 'Prijavi se',
 'nav-login-createaccount' => 'Prijavi se / Registruj se',
@@ -938,7 +945,7 @@ Ako ste anonimni korisnik i mislite da su vam upućene nebitne primjedbe, molimo
 Možete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] na drugim stranicama.
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tražiti u povezanim zapisima] ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.',
 'noarticletext-nopermission' => 'Trenutno nema teksta na ovoj stranici.
-Možete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>.',
+Možete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane zapisnike]</span>, ali nemate dozvolu da napravite ovu stranicu.',
 'userpage-userdoesnotexist' => 'Korisnički račun "<nowiki>$1</nowiki>" nije registrovan.
 Molimo provjerite da li želite napraviti/izmijeniti ovu stranicu.',
 'userpage-userdoesnotexist-view' => 'Korisnički račun "$1" nije registrovan.',
@@ -948,7 +955,6 @@ Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
 *'''Firefox / Safari:''' držite ''Shift'' tipku i kliknite na ''Reload'' dugme ili pritisnite ''Ctrl-F5'' ili ''Ctrl-R'' (''⌘-R'' na Macu)
 *'''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''⌘-Shift-R'' na Macu)
 *'''Internet Explorer:''' držite tipku ''Ctrl'' i kliknite na ''Refresh'' ili pritisnite ''Ctrl-F5''
-*'''Konqueror:''' klikni na ''Reload'' ili pritisnite dugme ''F5''
 *'''Opera:''' očistite \"keš\" preko izbornika ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi CSS prije nego što sačuvate.",
 'userjsyoucanpreview' => "'''Pažnja:''' Koristite dugme \"{{int:showpreview}}\" da testirate svoj novi JavaScript prije nego što sačuvate.",
@@ -1051,6 +1057,11 @@ Izgleda da je obrisana.',
 Izgleda da već postoji.',
 'defaultmessagetext' => 'Uobičajeni tekst poruke',
 
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.
 
@@ -1300,8 +1311,6 @@ Korištenje navigacionih linkova će resetovati ovaj stupac.',
 'search-interwiki-caption' => 'Srodni projekti',
 'search-interwiki-default' => '$1 rezultati:',
 'search-interwiki-more' => '(više)',
-'search-mwsuggest-enabled' => 'sa sugestijama',
-'search-mwsuggest-disabled' => 'bez sugestija',
 'search-relatedarticle' => 'Povezano',
 'mwsuggest-disable' => 'Onemogući AJAX prijedloge',
 'searcheverything-enable' => 'Traži u svim imenskim prostorima',
@@ -1335,7 +1344,7 @@ Pokušajte u Vaš upit uključiti prefiks ''all:'' da bi ste pretražili sav sad
 
 # Preferences page
 'preferences' => 'Podešavanja',
-'mypreferences' => 'Moje postavke',
+'mypreferences' => 'Postavke',
 'prefs-edits' => 'Broj izmjena:',
 'prefsnologin' => 'Niste prijavljeni',
 'prefsnologintext' => 'Da biste mogli podešavati korisnička podešavanja, morate <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} biti prijavljeni]</span>.',
@@ -1398,7 +1407,7 @@ Ovdje su navedene neke nasumično odabrane vrijednosti koje možete koristiti: $
 'timezoneregion-indian' => 'Indijski okean',
 'timezoneregion-pacific' => 'Tihi okean',
 'allowemail' => 'Dozvoli e-poštu od ostalih korisnika',
-'prefs-searchoptions' => 'Opcije pretrage',
+'prefs-searchoptions' => 'Traži',
 'prefs-namespaces' => 'Imenski prostori',
 'defaultns' => 'Inače tražite u ovim imenskim prostorima:',
 'default' => 'standardno',
@@ -1567,6 +1576,7 @@ Ako izaberete da date ime, biće korišteno za pripisivanje za vaš rad.',
 'rightslogtext' => 'Ovo je zapis promjena korisničkih prava.',
 'rightslogentry' => 'promjena članstva u grupi za $1 sa $2 na $3',
 'rightslogentry-autopromote' => 'je automatski unaprijeđen iz $2 u $3',
+'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3 iz $4 u $5',
 'rightsnone' => '(nema)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -2137,6 +2147,9 @@ Možda sadrži jedan ili više znakova koji se ne mogu koristiti u naslovima.',
 'allpages-bad-ns' => '{{SITENAME}} nema imenski prostor "$1".',
 'allpages-hide-redirects' => 'Sakrij preusmjerenja',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Pogledaj najnoviju.',
+
 # Special:Categories
 'categories' => 'Kategorije',
 'categoriespagetext' => '{{PLURAL:$1|Slijedeća kategorija sadrži|Slijedeće kategorije sadrže}} stranice ili multimedijalne datoteke.
@@ -2206,6 +2219,8 @@ O svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
 i imati ispravnu adresu e-pošte u vašim [[Special:Preferences|podešavanjima]]
 da biste slali e-poštu drugim korisnicima.',
 'emailuser' => 'Pošalji e-poštu ovom korisniku',
+'emailuser-title-target' => 'Pošalji e-poruku {{GENDER:$1|korisniku|korisnici|korisniku}}',
+'emailuser-title-notarget' => 'Pošalji e-mail korisniku',
 'emailpage' => 'Pošalji e-mail korisniku',
 'emailpagetext' => 'Možete korisiti formu ispod za slanje e-mail poruka ovom korisniku.
 E-mail adresa koju ste unijeli u [[Special:Preferences|Vašim korisničkim postavkama]] će biti prikazana kao adresa pošiljaoca, tako da će primaoc poruke moći da Vam odgovori.',
@@ -2239,7 +2254,7 @@ E-mail adresa koju ste unijeli u [[Special:Preferences|Vašim korisničkim posta
 
 # Watchlist
 'watchlist' => 'Moji praćeni članci',
-'mywatchlist' => 'Moji praćeni članci',
+'mywatchlist' => 'Praćeni članci',
 'watchlistfor2' => 'Za $1 $2',
 'nowatchlist' => 'Nemate ništa na svom spisku praćenih članaka.',
 'watchlistanontext' => 'Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.',
@@ -2276,11 +2291,7 @@ Ako kasnije želite da uklonite stranicu sa vašeg spiska praćenih članaka, kl
 
 'enotif_mailer' => '{{SITENAME}} obaviještenje o pošti',
 'enotif_reset' => 'Označi sve strane kao posjećene',
-'enotif_newpagetext' => 'Ovo je novi članak.',
 'enotif_impersonal_salutation' => '{{SITENAME}} korisnik',
-'changed' => 'promijenjena',
-'created' => 'napravljena',
-'enotif_subject' => '{{SITENAME}} strana $PAGETITLE je bila $CHANGEDORCREATED od strane $PAGEEDITOR',
 'enotif_lastvisited' => 'Pogledajte $1 za sve izmjene od vaše posljednje posjete.',
 'enotif_lastdiff' => 'Vidi $1 da pregledate ovu promjenu.',
 'enotif_anon_editor' => 'anonimni korisnik $1',
@@ -2353,6 +2364,8 @@ nastavite s oprezom.',
 'rollback' => 'Vrati izmjene',
 'rollback_short' => 'Vrati',
 'rollbacklink' => 'vrati',
+'rollbacklinkcount' => 'vrati $1 {{PLURAL:$1|izmjenu|izmjene|izmjena}}',
+'rollbacklinkcount-morethan' => 'vrati više od $1 {{PLURAL:$1|izmjene|izmjene|izmjena}}',
 'rollbackfailed' => 'Vraćanje nije uspjelo',
 'cantrollback' => 'Ne može se vratiti izmjena; posljednji autor je ujedno i jedini.',
 'alreadyrolled' => 'Ne može se vratiti posljednja izmjena [[:$1]] od korisnika [[User:$2|$2]] ([[User talk:$2|razgovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); neko drugi je već izmjenio ili vratio članak.
@@ -2495,9 +2508,9 @@ $1',
 'blanknamespace' => '(Glavno)',
 
 # Contributions
-'contributions' => 'Doprinosi korisnika',
+'contributions' => 'Doprinosi {{GENDER:$1|korisnika|korisnice|korisnika}}',
 'contributions-title' => 'Doprinosi korisnika $1',
-'mycontris' => 'Moj doprinos',
+'mycontris' => 'Doprinos',
 'contribsub2' => 'Za $1 ($2)',
 'nocontribs' => 'Nisu nađene promjene koje zadovoljavaju ove uslove.',
 'uctop' => ' (vrh)',
@@ -2537,7 +2550,7 @@ Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
 'whatlinkshere-hideredirs' => '$1 preusmjerenja',
 'whatlinkshere-hidetrans' => '$1 uključenja',
 'whatlinkshere-hidelinks' => '$1 linkove',
-'whatlinkshere-hideimages' => '$1 linkove slika',
+'whatlinkshere-hideimages' => 'Veze do datoteke $1',
 'whatlinkshere-filters' => 'Filteri',
 
 # Block/unblock
@@ -2884,6 +2897,7 @@ Nedostaje privremeni folder.',
 'import-upload' => 'Postavljanje XML podataka',
 'import-token-mismatch' => 'Izgubljeni podaci sesije. Molimo pokušajte ponovno.',
 'import-invalid-interwiki' => 'Ne može se uvesti iz navedenog wikija.',
+'import-options-wrong' => '{{PLURAL:$2|Pogrešna opcija|Pogrešne opcije}}: <nowiki>$1</nowiki>',
 
 # Import log
 'importlogpage' => 'Zapisnik uvoza',
@@ -2895,7 +2909,6 @@ Nedostaje privremeni folder.',
 
 # JavaScriptTest
 'javascripttest' => 'Testiranje JavaScript-e',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
 'javascripttest-title' => 'Pokretanje $1 testova',
 'javascripttest-pagetext-noframework' => 'Ova stranica je određena za pokretanje JavaScript testova.',
 'javascripttest-pagetext-unknownframework' => 'Nepoznat radni okvir testiranja"$1".',
@@ -3022,13 +3035,29 @@ Ovo je vjerovatno izazvao vezom ka vanjskoj nepoželjnoj stranici.',
 
 # Info page
 'pageinfo-title' => 'Informacije za "$1"',
-'pageinfo-header-edits' => 'Izmjene',
+'pageinfo-header-basic' => 'Osnovne informacije',
+'pageinfo-header-edits' => 'Historija izmjena',
 'pageinfo-header-restrictions' => 'Zaštita stranice',
+'pageinfo-header-properties' => 'Svojstva stranice',
+'pageinfo-display-title' => 'Naslov stranice',
+'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
+'pageinfo-language' => 'Jezik sadržaja stranice',
 'pageinfo-views' => 'Broj pogleda',
 'pageinfo-watchers' => 'Broj onih koji pregledaju',
-'pageinfo-edits' => 'Broj izmjena',
-'pageinfo-authors' => 'Broj različitih autora',
+'pageinfo-subpages-name' => 'Podstranice ove stranice',
+'pageinfo-firstuser' => 'Korisnik koji je napravio stranicu',
+'pageinfo-firsttime' => 'Datum stvaranja stranice',
+'pageinfo-lastuser' => 'Posljednji urednik stranice',
+'pageinfo-edits' => 'Ukupan broj izmjena',
+'pageinfo-authors' => 'Ukupan broj različitih autora',
+'pageinfo-recent-edits' => 'Broj nedavnih izmjena (u poslednjih $1)',
+'pageinfo-toolboxlink' => 'Informacije o stranici',
+'pageinfo-redirectsto' => 'Preusmjerava na',
+'pageinfo-redirectsto-info' => 'Informacije',
+'pageinfo-contentpage' => 'Broji se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading-yes' => 'Da',
 
 # Skin names
 'skinname-standard' => 'Klasično',
@@ -3903,8 +3932,8 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'logentry-move-move_redir-noredirect' => '$1 je premjestio stranicu $3 na $4 preko preusmjeravanja bez ostavljanja preusmjeravanja',
 'logentry-patrol-patrol' => '$1 je označio izmjenu $4 stranice $3 pregledanim',
 'logentry-patrol-patrol-auto' => '$1 je automatski označio izmjenu $4 stranice $3 pregledanim',
-'logentry-newusers-newusers' => '$1 je napravio korisnički račun',
-'logentry-newusers-create' => '$1 je napravio korisnički račun',
+'logentry-newusers-newusers' => 'Korisnički račun $1 je napravljen',
+'logentry-newusers-create' => 'Korisnički račun $1 je napravljen',
 'logentry-newusers-create2' => '$1 je napravio korisnički račun $3',
 'logentry-newusers-autocreate' => 'Korisnički račun $1 je automatski napravljen',
 'newuserlog-byemail' => 'šifra je poslana putem e-maila',
@@ -3925,6 +3954,10 @@ Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan
 'feedback-bugcheck' => 'Odlično! Molimo provjerite da se ne radi o nekom [$1 poznatom "bugu"].',
 'feedback-bugnew' => 'Provjereno. Prijavi novu grešku',
 
+# Search suggestions
+'searchsuggest-search' => 'Traži',
+'searchsuggest-containing' => 'sadrži...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nemate ovlasti da postavljate datoteke na ovoj wiki.',
 'api-error-badtoken' => 'Unutrašnja greška: token nije ispravan.',
@@ -3936,6 +3969,7 @@ Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan
 'api-error-empty-file' => 'Datoteka koju ste poslali je bila prazna.',
 'api-error-emptypage' => 'Stvaranje novih praznih stranica nije dozvoljeno.',
 'api-error-fetchfileerror' => 'Unutrašnja greška: pojavio se neki problem pri dobijanju podataka o datoteci.',
+'api-error-fileexists-forbidden' => 'Datoteka s imenom "$1" već postoji, i ne može biti zamijenjena.',
 '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.',
@@ -3966,6 +4000,12 @@ Inače, možete ispuniti jednostavan obrazac ispod. Vaš komentar biti će dodan
 
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunde}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minut|minuta|minuta}}',
+'duration-hours' => '$1 {{PLURAL:$1|sat|sata|sati}}',
 'duration-days' => '$1 {{PLURAL:$1|dan|dana}}',
+'duration-weeks' => '$1 {{PLURAL:$1|sedmica|sedmice|sedmica}}',
+'duration-years' => '$1 {{PLURAL:$1|godina|godine|godina}}',
+'duration-decades' => '$1 {{PLURAL:$1|decenija|decenije|decenija}}',
+'duration-centuries' => '$1 {{PLURAL:$1|vijek|vijeka|vijekova}}',
 
 );
index 662d45e..8a797d3 100644 (file)
  * @author Zaidpjd (on bug.wikipedia.org)
  */
 
-$fallback = "id";
+$fallback = 'id';
 
 $messages = array(
 # Dates
-'sunday'        => "Āha'",
-'monday'        => 'Asenéŋ',
-'tuesday'       => 'Salasa',
-'wednesday'     => 'Araba',
-'thursday'      => "Kamisi'",
-'friday'        => 'Jumā',
-'saturday'      => 'Sattu',
-'sun'           => 'Āha',
-'mon'           => 'Ase',
-'tue'           => 'Sal',
-'wed'           => 'Ara',
-'thu'           => 'Kam',
-'fri'           => 'Jum',
-'sat'           => 'Sat',
-'january'       => 'Januari',
-'february'      => 'Fébruari',
-'march'         => "Maré'",
-'april'         => 'April',
-'may_long'      => 'Méi',
-'june'          => 'Juni',
-'july'          => 'Juli',
-'august'        => "Ogoso'",
-'september'     => 'September',
-'october'       => 'Oktober',
-'november'      => 'November',
-'december'      => 'Désémber',
-'january-gen'   => 'Januari',
-'february-gen'  => 'Fébruari',
-'march-gen'     => "Maré'",
-'april-gen'     => 'April',
-'may-gen'       => 'Méi',
-'june-gen'      => 'Juni',
-'july-gen'      => 'Juli',
-'august-gen'    => "Ogoso'",
+'sunday' => "Āha'",
+'monday' => 'Asenéŋ',
+'tuesday' => 'Salasa',
+'wednesday' => 'Araba',
+'thursday' => "Kamisi'",
+'friday' => 'Jumā',
+'saturday' => 'Sattu',
+'sun' => 'Āha',
+'mon' => 'Ase',
+'tue' => 'Sal',
+'wed' => 'Ara',
+'thu' => 'Kam',
+'fri' => 'Jum',
+'sat' => 'Sat',
+'january' => 'Januari',
+'february' => 'Fébruari',
+'march' => "Maré'",
+'april' => 'April',
+'may_long' => 'Méi',
+'june' => 'Juni',
+'july' => 'Juli',
+'august' => "Ogoso'",
+'september' => 'September',
+'october' => 'Oktober',
+'november' => 'November',
+'december' => 'Désémber',
+'january-gen' => 'Januari',
+'february-gen' => 'Fébruari',
+'march-gen' => "Maré'",
+'april-gen' => 'April',
+'may-gen' => 'Méi',
+'june-gen' => 'Juni',
+'july-gen' => 'Juli',
+'august-gen' => "Ogoso'",
 'september-gen' => 'September',
-'october-gen'   => 'Oktober',
-'november-gen'  => 'November',
-'december-gen'  => 'Désémber',
+'october-gen' => 'Oktober',
+'november-gen' => 'November',
+'december-gen' => 'Désémber',
 
 # Categories related messages
 'category_header' => 'Leppa rilaleŋ kategori "$1"',
-'subcategories'   => 'Subkategori',
-
-'about'      => 'Atajangeng',
-'article'    => 'Lontara',
-'cancel'     => 'Rusa',
-'mypage'     => "Leppana iya'",
-'mytalk'     => 'Bicarana iyya',
-'anontalk'   => 'Bicarana IP édé',
+'subcategories' => 'Subkategori',
+
+'about' => 'Atajangeng',
+'article' => 'Lontara',
+'cancel' => 'Rusa',
+'mypage' => "Leppana iya'",
+'mytalk' => 'Bicarana iyya',
+'anontalk' => 'Bicarana IP édé',
 'navigation' => 'Navigasi',
-'and'        => '&#32;na',
+'and' => '&#32;na',
 
 # Cologne Blue skin
-'qbfind'         => 'Assapparang',
-'qbbrowse'       => 'Berowoso',
-'qbedit'         => 'Padécéŋ',
-'qbpageoptions'  => 'Édé leppa',
-'qbpageinfo'     => 'Konteks',
-'qbmyoptions'    => "Leppana iya'",
+'qbfind' => 'Assapparang',
+'qbbrowse' => 'Berowoso',
+'qbedit' => 'Padécéŋ',
+'qbpageoptions' => 'Édé leppa',
+'qbpageinfo' => 'Konteks',
+'qbmyoptions' => "Leppana iya'",
 'qbspecialpages' => 'Leppa spésiala',
-'faq'            => 'FAQ',
-'faqpage'        => 'Project:FAQ',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-move'     => "Paléccé'",
-'vector-view-create'     => 'Ebbu',
-'vector-view-edit'       => 'Padéccéng',
-'vector-view-view'       => 'Baca',
+'vector-action-move' => "Paléccé'",
+'vector-view-create' => 'Ebbu',
+'vector-view-edit' => 'Padéccéng',
+'vector-view-view' => 'Baca',
 'vector-view-viewsource' => 'Ita sumber',
 
-'errorpagetitle'   => 'Asalaŋ',
-'returnto'         => 'Lisu ri $1.',
-'tagline'          => 'Polé {{SITENAME}}',
-'help'             => 'Paŋinriŋ',
-'search'           => 'Assapparaŋ',
-'searchbutton'     => 'Sappa',
-'go'               => 'Lao',
-'searcharticle'    => 'Lao',
-'history'          => 'Versi riolo leppaë',
-'history_short'    => 'versi riolo',
-'permalink'        => 'Pranala permanen',
-'edit'             => 'Padécéŋ',
-'create'           => 'Ebbu',
-'editthispage'     => 'Padécéŋiki iyé leppa',
+'errorpagetitle' => 'Asalaŋ',
+'returnto' => 'Lisu ri $1.',
+'tagline' => 'Polé {{SITENAME}}',
+'help' => 'Paŋinriŋ',
+'search' => 'Assapparaŋ',
+'searchbutton' => 'Sappa',
+'go' => 'Lao',
+'searcharticle' => 'Lao',
+'history' => 'Versi riolo leppaë',
+'history_short' => 'versi riolo',
+'permalink' => 'Pranala permanen',
+'edit' => 'Padécéŋ',
+'create' => 'Ebbu',
+'editthispage' => 'Padécéŋiki iyé leppa',
 'create-this-page' => 'Ebbuiki leppa iyé',
-'delete'           => 'Peddé',
-'deletethispage'   => 'Peddé iyé leppa',
-'protect'          => 'Accalinruŋi',
-'protect_change'   => 'pinra',
-'protectthispage'  => 'Accalinruŋi leppa iyyé',
-'unprotect'        => 'Téccalinruŋi',
-'newpage'          => 'Leppa baru',
-'talkpage'         => 'Bicara iyé leppa',
+'delete' => 'Peddé',
+'deletethispage' => 'Peddé iyé leppa',
+'protect' => 'Accalinruŋi',
+'protect_change' => 'pinra',
+'protectthispage' => 'Accalinruŋi leppa iyyé',
+'unprotect' => 'Téccalinruŋi',
+'newpage' => 'Leppa baru',
+'talkpage' => 'Bicara iyé leppa',
 'talkpagelinktext' => 'Bicara',
-'specialpage'      => 'Leppa spésiala',
-'personaltools'    => 'Tool sialé-alé',
-'articlepage'      => 'Ita lontara',
-'talk'             => 'Bicara',
-'toolbox'          => 'Toolbox',
-'userpage'         => 'Ita leppa papaké',
-'projectpage'      => 'Ita leppa proyék',
-'imagepage'        => 'Ita leppa rapaŋ',
-'mediawikipage'    => 'Ita leppa méséje',
-'templatepage'     => 'Ita leppa templata',
-'viewhelppage'     => 'Ita leppa panginriŋ',
-'categorypage'     => 'Ita leppa kategori',
-'viewtalkpage'     => 'Ita leppa bicara',
-'redirectedfrom'   => '(Riredirect polé $1)',
-'redirectpagesub'  => 'Leppa redirect',
-'jumpto'           => 'Luppe lao:',
-'jumptosearch'     => 'sappa',
+'specialpage' => 'Leppa spésiala',
+'personaltools' => 'Tool sialé-alé',
+'articlepage' => 'Ita lontara',
+'talk' => 'Bicara',
+'toolbox' => 'Toolbox',
+'userpage' => 'Ita leppa papaké',
+'projectpage' => 'Ita leppa proyék',
+'imagepage' => 'Ita leppa rapaŋ',
+'mediawikipage' => 'Ita leppa méséje',
+'templatepage' => 'Ita leppa templata',
+'viewhelppage' => 'Ita leppa panginriŋ',
+'categorypage' => 'Ita leppa kategori',
+'viewtalkpage' => 'Ita leppa bicara',
+'redirectedfrom' => '(Riredirect polé $1)',
+'redirectpagesub' => 'Leppa redirect',
+'jumpto' => 'Luppe lao:',
+'jumptosearch' => 'sappa',
 
 # 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'            => 'Tentang {{SITENAME}}',
-'currentevents'        => 'Accanjingeŋ kokkoro',
-'currentevents-url'    => 'Project:Accanjingeŋ kokkoro',
-'disclaimers'          => 'Diseklaima',
-'edithelp'             => 'Paŋinriŋ mapadécéŋ',
-'edithelppage'         => 'Help:Mapadécéŋ',
-'helppage'             => 'Help:Lise',
-'mainpage'             => 'Leppa Indoë',
+'aboutsite' => 'Tentang {{SITENAME}}',
+'currentevents' => 'Accanjingeŋ kokkoro',
+'currentevents-url' => 'Project:Accanjingeŋ kokkoro',
+'disclaimers' => 'Diseklaima',
+'edithelp' => 'Paŋinriŋ mapadécéŋ',
+'edithelppage' => 'Help:Mapadécéŋ',
+'helppage' => 'Help:Lise',
+'mainpage' => 'Leppa Indoë',
 'mainpage-description' => 'Leppa Indoë',
-'portal'               => 'Portal komunitas',
+'portal' => 'Portal komunitas',
 
 'newmessageslink' => 'pappaseŋ baru',
-'editsection'     => 'padécéŋ',
-'editold'         => 'padécéŋ',
-'viewsourceold'   => 'ita sumber',
-'editlink'        => 'padécéŋ',
-'viewsourcelink'  => 'ita sumber',
+'editsection' => 'padécéŋ',
+'editold' => 'padécéŋ',
+'viewsourceold' => 'ita sumber',
+'editlink' => 'padécéŋ',
+'viewsourcelink' => 'ita sumber',
 'editsectionhint' => 'Padécéŋ kajuru: $1',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Leppa',
-'nstab-user'      => 'Leppa papaké',
-'nstab-media'     => 'Leppa média',
-'nstab-special'   => 'Leppa spésiala',
-'nstab-project'   => 'Proyek',
-'nstab-image'     => 'Rapang',
+'nstab-main' => 'Leppa',
+'nstab-user' => 'Leppa papaké',
+'nstab-media' => 'Leppa média',
+'nstab-special' => 'Leppa spésiala',
+'nstab-project' => 'Proyek',
+'nstab-image' => 'Rapang',
 'nstab-mediawiki' => 'Pappaseŋ',
-'nstab-template'  => 'Templata',
-'nstab-help'      => 'Paŋinriŋ',
-'nstab-category'  => 'Kategori',
+'nstab-template' => 'Templata',
+'nstab-help' => 'Paŋinriŋ',
+'nstab-category' => 'Kategori',
 
 # Main script and global functions
 'nosuchspecialpage' => "Iyaro leppa spésiala dé'na eŋka",
 
 # General errors
-'error'               => 'Éro',
-'databaseerror'       => 'Éro databése',
-'readonly'            => 'Databése rikonci',
+'error' => 'Éro',
+'databaseerror' => 'Éro databése',
+'readonly' => 'Databése rikonci',
 'missingarticle-diff' => '(Beda: $1, $2)',
-'internalerror'       => 'Éro internal',
-'internalerror_info'  => 'Éro internal: $1',
-'badtitle'            => 'Judul dek essa',
-'viewsource'          => 'Ita sumber',
+'internalerror' => 'Éro internal',
+'internalerror_info' => 'Éro internal: $1',
+'badtitle' => 'Judul dek essa',
+'viewsource' => 'Ita sumber',
 
 # Virus scanner
 'virus-unknownscanner' => "Antivirus dé' riisseŋ:",
 
 # Login and logout pages
-'yourname'                => 'Aseŋ papaké:',
-'yourpassword'            => 'Adacili:',
-'login'                   => 'log attama',
+'yourname' => 'Aseŋ papaké:',
+'yourpassword' => 'Adacili:',
+'login' => 'log attama',
 'nav-login-createaccount' => 'Log attama / ebbu akun',
-'userlogin'               => 'Log attama / ebbu akun',
-'logout'                  => 'Log essu',
-'userlogout'              => 'Log essu',
-'notloggedin'             => 'Déppa log attama',
-'nologin'                 => "Dé' gaga akaun? '''$1'''.",
-'nologinlink'             => 'Ebbu akun',
-'createaccount'           => 'Ebbu akun',
-'gotaccount'              => "Purani eŋka akun? '''$1'''.",
-'gotaccountlink'          => 'Log attama',
-'loginerror'              => 'Éro log attama',
-'mailmypassword'          => 'E-mail adacili baru',
+'userlogin' => 'Log attama / ebbu akun',
+'logout' => 'Log essu',
+'userlogout' => 'Log essu',
+'notloggedin' => 'Déppa log attama',
+'nologin' => "Dé' gaga akaun? '''$1'''.",
+'nologinlink' => 'Ebbu akun',
+'createaccount' => 'Ebbu akun',
+'gotaccount' => "Purani eŋka akun? '''$1'''.",
+'gotaccountlink' => 'Log attama',
+'loginerror' => 'Éro log attama',
+'mailmypassword' => 'E-mail adacili baru',
 
 # Change password dialog
 'oldpassword' => 'Pasewodo matoa:',
 
 # Edit page toolbar
-'bold_tip'    => 'Teks maumpek',
-'italic_tip'  => 'Teks Italik',
+'bold_tip' => 'Teks maumpek',
+'italic_tip' => 'Teks Italik',
 'extlink_tip' => 'Link risaliweŋ (jangan lupa awalan http:// )',
 
 # Edit pages
-'savearticle'      => 'Taro leppa',
-'preview'          => 'Pribiu',
-'showpreview'      => 'Ita pribiu',
-'showlivepreview'  => 'Pribiu live',
-'showdiff'         => 'Mita perubahan',
-'summary-preview'  => 'Pribiu summary:',
-'blockedtitle'     => 'Papaké riblok',
-'accmailtitle'     => 'Ada sandi ni riantarak.',
-'accmailtext'      => 'Ada sandi "$1" riantarak ri $2.',
+'savearticle' => 'Taro leppa',
+'preview' => 'Pribiu',
+'showpreview' => 'Ita pribiu',
+'showlivepreview' => 'Pribiu live',
+'showdiff' => 'Mita perubahan',
+'summary-preview' => 'Pribiu summary:',
+'blockedtitle' => 'Papaké riblok',
+'accmailtitle' => 'Ada sandi ni riantarak.',
+'accmailtext' => 'Ada sandi "$1" riantarak ri $2.',
 'anontalkpagetext' => "----''Ini adalah halaman diskusi untuk pengguna anonim yang belum membuat rekening atau tidak menggunakannya. Karena tidak membuat rekening, kami terpaksa memakai alamat IP untuk mengenalinya. Alamat IP seperti ini dapat dipakai oleh beberapa pengguna yang berbeda. Jika Anda adalah pengguna anonim dan merasa mendapatkan komentar-komentar yang tidak berkaitan dengan anda, kami anjurkan untuk [[Special:UserLogin|membuat rekening atau masuk log]] untuk menghindari kerancuan dengan pengguna anonim lain.''",
-'editing'          => 'Mapadécéŋ $1',
+'editing' => 'Mapadécéŋ $1',
 
 # History pages
-'previousrevision'    => '←Revisi riolo',
+'previousrevision' => '←Revisi riolo',
 'currentrevisionlink' => 'Revisi tannapa',
-'page_first'          => 'séuwani',
-'histfirst'           => 'Poŋ loa',
-'histlast'            => 'Poŋ nappa',
-'historysize'         => '($1 {{PLURAL:$1|bita|bita}})',
-'historyempty'        => '(kapa)',
+'page_first' => 'séuwani',
+'histfirst' => 'Poŋ loa',
+'histlast' => 'Poŋ nappa',
+'historysize' => '($1 {{PLURAL:$1|bita|bita}})',
+'historyempty' => '(kapa)',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1 ri $2',
 
 # Revision deletion
-'rev-deleted-comment'    => '(komentar ripeddé)',
-'rev-deleted-user'       => '(ripeddéni aseŋna papakeë)',
-'rev-deleted-event'      => '(log gau ripeddéni)',
-'rev-delundel'           => "pakitaï/tapo'",
-'revdelete-selected'     => "'''{{PLURAL:$2|Revisi|Revisi-revisi}} ripiléna [[$1]]ë:'''",
-'logdelete-selected'     => "'''{{PLURAL:$1|Log|Log-log}} ripilé:'''",
-'revdelete-hide-text'    => 'Tapoïki text revisië',
+'rev-deleted-comment' => '(komentar ripeddé)',
+'rev-deleted-user' => '(ripeddéni aseŋna papakeë)',
+'rev-deleted-event' => '(log gau ripeddéni)',
+'rev-delundel' => "pakitaï/tapo'",
+'revdelete-selected' => "'''{{PLURAL:$2|Revisi|Revisi-revisi}} ripiléna [[$1]]ë:'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Log|Log-log}} ripilé:'''",
+'revdelete-hide-text' => 'Tapoïki text revisië',
 'revdelete-hide-comment' => 'Tapo komentar mapadecéŋ',
-'revdelete-hide-user'    => 'Tapo aseŋ papakéna/IPna papadéceŋë',
-'revdelete-log'          => 'Saba:',
+'revdelete-hide-user' => 'Tapo aseŋ papakéna/IPna papadéceŋë',
+'revdelete-log' => 'Saba:',
 
 # Diffs
 'editundo' => 'undo',
 
 # Search results
-'searchsubtitle'        => "Masappa iko '''[[:$1]]'''",
+'searchsubtitle' => "Masappa iko '''[[:$1]]'''",
 'searchsubtitleinvalid' => "Massappa iko '''$1'''",
-'viewprevnext'          => 'Ita ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url'        => 'Help:Lise',
-'search-result-size'    => '$1 ({{PLURAL:$2|1 ada|$2 ada}})',
-'search-redirect'       => '(redirect $1)',
+'viewprevnext' => 'Ita ($1 {{int:pipe-separator}} $2) ($3)',
+'searchhelp-url' => 'Help:Lise',
+'search-result-size' => '$1 ({{PLURAL:$2|1 ada|$2 ada}})',
+'search-redirect' => '(redirect $1)',
 
 # Quickbar
 'qbsettings-none' => 'Dégaga',
 
 # Preferences page
-'mypreferences'     => 'Bérékkeŋeŋna iyya',
-'prefsnologin'      => "Déppa ma'log attama'",
-'prefs-watchlist'   => 'Watchlist',
-'prefs-misc'        => 'Misc',
-'saveprefs'         => 'Taro',
-'prefs-editing'     => 'Mapadécéŋ',
+'mypreferences' => 'Bérékkeŋeŋna iyya',
+'prefsnologin' => "Déppa ma'log attama'",
+'prefs-watchlist' => 'Watchlist',
+'prefs-misc' => 'Misc',
+'saveprefs' => 'Taro',
+'prefs-editing' => 'Mapadécéŋ',
 'searchresultshead' => 'Masappa',
-'youremail'         => 'E-mail:',
-'username'          => 'Aseŋ papaké:',
-'uid'               => 'ID papaké:',
-'email'             => 'E-mail',
+'youremail' => 'E-mail:',
+'username' => 'Aseŋ papaké:',
+'uid' => 'ID papaké:',
+'email' => 'E-mail',
 
 # Groups
 'group-sysop' => 'Puŋgawa',
-'group-all'   => '(sininna)',
+'group-all' => '(sininna)',
 
-'group-user-member'  => '{{GENDER:$1|Pappaké}}',
+'group-user-member' => '{{GENDER:$1|Pappaké}}',
 'group-sysop-member' => 'Puŋgawa',
 
-'grouppage-user'  => '{{ns:project}}:Pappaké',
+'grouppage-user' => '{{ns:project}}:Pappaké',
 'grouppage-sysop' => '{{ns:project}}:Puŋgawa',
 
 # Rights
@@ -280,77 +280,77 @@ $messages = array(
 'right-edit' => 'Mappadécéŋi leppa',
 
 # Recent changes
-'recentchanges'   => 'Pappakinra tanappa',
-'rcshowhidebots'  => '$1 bot',
-'rcshowhideliu'   => "$1 papaké mattama' log",
+'recentchanges' => 'Pappakinra tanappa',
+'rcshowhidebots' => '$1 bot',
+'rcshowhideliu' => "$1 papaké mattama' log",
 'rcshowhideanons' => '$1 papaké anon',
-'diff'            => 'beda',
-'hide'            => 'Tapok',
+'diff' => 'beda',
+'hide' => 'Tapok',
 'minoreditletter' => 'k',
-'newpageletter'   => 'B',
-'boteditletter'   => 'b',
+'newpageletter' => 'B',
+'boteditletter' => 'b',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Pappakapinra terkait',
-'recentchangeslinked-feed'    => 'Pappakapinra terkait',
+'recentchangeslinked' => 'Pappakapinra terkait',
+'recentchangeslinked-feed' => 'Pappakapinra terkait',
 'recentchangeslinked-toolbox' => 'Pappakapinra terkait',
 
 # Upload
-'upload'    => 'Lureng berkas',
+'upload' => 'Lureng berkas',
 'uploadbtn' => 'Lureng berkas',
 
 # Special:ListFiles
 'listfiles_name' => 'Aseŋ',
 
 # File description page
-'file-anchor-link'    => 'Rapang',
-'filehist-user'       => 'Papaké',
+'file-anchor-link' => 'Rapang',
+'filehist-user' => 'Papaké',
 'filehist-dimensions' => 'Dimensi',
-'imagelinks'          => 'Liŋke',
+'imagelinks' => 'Liŋke',
 
 # File deletion
-'filedelete'             => 'Mapeddé $1',
-'filedelete-legend'      => 'Mapeddé berkas',
-'filedelete-intro'       => "Iko purani mapeddé '''[[Media:$1|$1]]'''.",
-'filedelete-submit'      => 'Peddé',
-'filedelete-success'     => "'''$1''' purani ripeddé.",
+'filedelete' => 'Mapeddé $1',
+'filedelete-legend' => 'Mapeddé berkas',
+'filedelete-intro' => "Iko purani mapeddé '''[[Media:$1|$1]]'''.",
+'filedelete-submit' => 'Peddé',
+'filedelete-success' => "'''$1''' purani ripeddé.",
 'filedelete-success-old' => "Berkas '''[[Media:$1|$1]]''' versi $3, $2 purani ripeddé.",
-'filedelete-nofile'      => "'''$1''' dé'na eŋka.",
+'filedelete-nofile' => "'''$1''' dé'na eŋka.",
 
 # MIME search
 'mimesearch' => 'Assapparaŋ MIME',
-'mimetype'   => 'Tipe MIME:',
-'download'   => 'unduh',
+'mimetype' => 'Tipe MIME:',
+'download' => 'unduh',
 
 # Random page
-'randompage'         => 'Leppa random',
+'randompage' => 'Leppa random',
 'randompage-nopages' => 'Degaga leppa rilaleŋ iyyé namespaceë.',
 
 # Statistics
 'statistics-articles' => 'Leppa liseë',
-'statistics-pages'    => 'Leppaë',
-'statistics-files'    => 'File-file nalise menré',
+'statistics-pages' => 'Leppaë',
+'statistics-files' => 'File-file nalise menré',
 
 # Miscellaneous special pages
 'ancientpages' => 'Leppa talloa',
-'move'         => 'Paleccé',
+'move' => 'Paleccé',
 'movethispage' => 'Paleccé leppa iyyé',
 
 # Special:Log
 'specialloguserlabel' => 'Papaké:',
-'log'                 => 'Log',
-'all-logs-page'       => 'Maneŋ log',
+'log' => 'Log',
+'all-logs-page' => 'Maneŋ log',
 
 # Special:AllPages
-'allpages'          => 'Maneng halamang',
-'alphaindexline'    => '$1 ri $2',
-'allpagesfrom'      => 'Mappaitang halamang-halamang rimulai:',
-'allarticles'       => 'Sininna leppa',
-'allinnamespace'    => 'Maneŋ leppa (namespace $1)',
+'allpages' => 'Maneng halamang',
+'alphaindexline' => '$1 ri $2',
+'allpagesfrom' => 'Mappaitang halamang-halamang rimulai:',
+'allarticles' => 'Sininna leppa',
+'allinnamespace' => 'Maneŋ leppa (namespace $1)',
 'allnotinnamespace' => 'Maneŋ leppa (tania rilaleŋ namespace $1)',
-'allpagesnext'      => 'Selanjutnya',
-'allpagessubmit'    => 'Lanre',
-'allpagesprefix'    => 'Mappaitang halamang-halamang éngkalinga awang:',
+'allpagesnext' => 'Selanjutnya',
+'allpagessubmit' => 'Lanre',
+'allpagesprefix' => 'Mappaitang halamang-halamang éngkalinga awang:',
 
 # Special:Categories
 'categories' => 'Maneŋ kategori',
@@ -361,12 +361,12 @@ Halamang bicara éréngé gabungan halamang bicara pada wettu depan didaftarkan
 éréngé halamang akan wessi '''umpek''' ri [[Special:RecentChanges|daftar pinra tanappa]] barak lebih lemmak ita.
 
 Apak ida ronnak mappedde halamang édé ri daftar jagaan, klik \"Mangedda jaga\" pada kolom ri sedde.",
-'watch'          => 'Ampi',
-'unwatch'        => 'Tenriampi',
+'watch' => 'Ampi',
+'unwatch' => 'Tenriampi',
 
 # Delete
 'actioncomplete' => 'Proses makkapo',
-'dellogpage'     => 'Log peddé-peddé',
+'dellogpage' => 'Log peddé-peddé',
 
 # Protect
 'prot_1movedto2' => '[[$1]] ésuk ri [[$2]]',
@@ -377,45 +377,45 @@ Apak ida ronnak mappedde halamang édé ri daftar jagaan, klik \"Mangedda jaga\"
 'sp-contributions-talk' => 'Bicara',
 
 # What links here
-'whatlinkshere'       => 'Pranala ri leppa iyéwé',
-'whatlinkshere-page'  => 'Leppa:',
+'whatlinkshere' => 'Pranala ri leppa iyéwé',
+'whatlinkshere-page' => 'Leppa:',
 'whatlinkshere-links' => '← liŋke',
 
 # Block/unblock
 'ipblocklist-submit' => 'Sappa',
-'blocklink'          => 'blok',
-'contribslink'       => 'kontrib',
+'blocklink' => 'blok',
+'contribslink' => 'kontrib',
 
 # Move page
-'articleexists'             => 'Leppa béla ida pile ni ujuk, a dek essa.
+'articleexists' => 'Leppa béla ida pile ni ujuk, a dek essa.
 Silakan pile aseng laing.',
-'movelogpage'               => 'Log leccé',
-'movereason'                => 'Saba:',
-'delete_and_move'           => 'Peddé nappa paleccé',
-'delete_and_move_text'      => '==Mapeddé riperelu==
+'movelogpage' => 'Log leccé',
+'movereason' => 'Saba:',
+'delete_and_move' => 'Peddé nappa paleccé',
+'delete_and_move_text' => '==Mapeddé riperelu==
 Leppa destinasi "[[:$1]]" purani eŋka.
 Eloko peddéï supaya weddiŋi mapalecé?',
-'delete_and_move_confirm'   => "Iyé', peddé iyaro leppa",
-'delete_and_move_reason'    => 'Ripeddé supaya weddiŋi mapalecé',
+'delete_and_move_confirm' => "Iyé', peddé iyaro leppa",
+'delete_and_move_reason' => 'Ripeddé supaya weddiŋi mapalecé',
 'immobile-source-namespace' => 'Leppa-leppa rilaleŋna namespace "$1"ë de\'na ullé ripaleccé',
-'immobile-source-page'      => "Iyyedé leppaë de'na ullé ripaleccé.",
+'immobile-source-page' => "Iyyedé leppaë de'na ullé ripaleccé.",
 
 # Namespace 8 related
-'allmessages'        => 'Maneng pappaseng',
-'allmessagesname'    => 'Aseng',
+'allmessages' => 'Maneng pappaseng',
+'allmessagesname' => 'Aseng',
 'allmessagesdefault' => 'Teks totok',
 'allmessagescurrent' => 'Teks kokkoro',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'      => "Leppa papaké iya'",
-'tooltip-pt-mytalk'        => "Leppa bicara iya'",
-'tooltip-pt-preferences'   => "Preferencena iya'",
-'tooltip-pt-logout'        => 'Log maessu',
-'tooltip-ca-talk'          => 'Pabicarana iyé leppa',
-'tooltip-ca-move'          => 'Paléccé leppa édé',
-'tooltip-search'           => 'Sappa ri {{SITENAME}}',
-'tooltip-search-go'        => 'Lao ri leppa aseŋna pappada iyyé rekko eŋkaï',
-'tooltip-n-mainpage'       => 'Lao ri Leppa Indoë',
+'tooltip-pt-userpage' => "Leppa papaké iya'",
+'tooltip-pt-mytalk' => "Leppa bicara iya'",
+'tooltip-pt-preferences' => "Preferencena iya'",
+'tooltip-pt-logout' => 'Log maessu',
+'tooltip-ca-talk' => 'Pabicarana iyé leppa',
+'tooltip-ca-move' => 'Paléccé leppa édé',
+'tooltip-search' => 'Sappa ri {{SITENAME}}',
+'tooltip-search-go' => 'Lao ri leppa aseŋna pappada iyyé rekko eŋkaï',
+'tooltip-n-mainpage' => 'Lao ri Leppa Indoë',
 'tooltip-ca-nstab-special' => "Iyanaéwé séuwa leppa spésiala', dé'na idi' ullé padécéŋiki",
 
 # Attribution
@@ -430,48 +430,48 @@ Eloko peddéï supaya weddiŋi mapalecé?',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'maneŋ',
 'namespacesall' => 'maneŋ',
-'monthsall'     => 'maneŋ',
+'monthsall' => 'maneŋ',
 
 # Multipage image navigation
-'imgmultigo'   => 'Lao!',
+'imgmultigo' => 'Lao!',
 'imgmultigoto' => 'Lao ri leppa $1',
 
 # Table pager
-'ascending_abbrev'         => 'énré',
-'descending_abbrev'        => 'no',
-'table_pager_first'        => 'Leppa séuwani',
+'ascending_abbrev' => 'énré',
+'descending_abbrev' => 'no',
+'table_pager_first' => 'Leppa séuwani',
 'table_pager_limit_submit' => 'Lao',
 
 # Auto-summaries
 'autosumm-replace' => "Masullé leppaë lao '$1'",
-'autosumm-new'     => "Leppa baru: '$1'",
+'autosumm-new' => "Leppa baru: '$1'",
 
 # Size units
-'size-bytes'     => '$1 B',
+'size-bytes' => '$1 B',
 'size-kilobytes' => '$1 KB',
 'size-megabytes' => '$1 MB',
 'size-gigabytes' => '$1 GB',
 
 # Live preview
 'livepreview-loading' => 'Mallise…',
-'livepreview-ready'   => 'Mallise… Sokkuni!',
+'livepreview-ready' => 'Mallise… Sokkuni!',
 
 # Special:Version
 'version-specialpages' => 'Leppa spésiala',
 
 # Special:SpecialPages
-'specialpages'                 => 'Leppa spésiala',
-'specialpages-note'            => '----
+'specialpages' => 'Leppa spésiala',
+'specialpages-note' => '----
 * Leppa spésiala normal
 * <strong class="mw-specialpagerestricted">Leppa spésiala terbatas</strong>',
-'specialpages-group-other'     => 'Leppa spésiala laiŋë',
-'specialpages-group-login'     => 'Log attama / mendaftar',
-'specialpages-group-changes'   => 'Pinrana tanappaë sibawa logeë',
-'specialpages-group-users'     => 'Papaké sibawa hak-hak',
-'specialpages-group-pages'     => 'Sininna leppaë',
+'specialpages-group-other' => 'Leppa spésiala laiŋë',
+'specialpages-group-login' => 'Log attama / mendaftar',
+'specialpages-group-changes' => 'Pinrana tanappaë sibawa logeë',
+'specialpages-group-users' => 'Papaké sibawa hak-hak',
+'specialpages-group-pages' => 'Sininna leppaë',
 'specialpages-group-pagetools' => 'Tool leppaë',
-'specialpages-group-wiki'      => 'Data sibawa tool wiki',
-'specialpages-group-spam'      => 'Tool spam',
+'specialpages-group-wiki' => 'Data sibawa tool wiki',
+'specialpages-group-spam' => 'Tool spam',
 
 # Special:BlankPage
 'blankpage' => 'Leppa kosoŋë',
index 97ed470..ea2ec4d 100644 (file)
@@ -25,6 +25,7 @@
  * @author Pasqual (ca)
  * @author Paucabot
  * @author PerroVerd
+ * @author Pitort
  * @author Pérez
  * @author Qllach
  * @author SMP
  * @author Ssola
  * @author Toniher
  * @author Vriullop
+ * @author Àlex
  * @author לערי ריינהארט
  */
 
-$bookstoreList = array(
-       'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.es/cgi-bin/vtls.web.gateway?searchtype=control+numcard&searcharg=$1',
-       'Totselsllibres.com' => 'http://www.totselsllibres.com/tel/publi/busquedaAvanzadaLibros.do?ISBN=$1',
-       'inherit' => true,
-);
-
 $namespaceNames = array(
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Especial',
@@ -67,39 +63,6 @@ $namespaceAliases = array(
        'Imatge_Discussió' => NS_FILE_TALK,
 );
 
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-
-$dateFormats = array(
-       'mdy time' => 'H:i',
-       'mdy date' => 'M j, Y',
-       'mdy both' => 'H:i, M j, Y',
-
-       'dmy time' => 'H:i',
-       'dmy date' => 'j M Y',
-       'dmy both' => 'H:i, j M Y',
-
-       'ymd time' => 'H:i',
-       'ymd date' => 'Y M j',
-       'ymd both' => 'H:i, Y M j',
-);
-
-$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' ),
-);
-
 $specialPageAliases = array(
        'Activeusers'               => array( 'Usuaris_actius' ),
        'Allmessages'               => array( 'Missatges', 'MediaWiki' ),
@@ -161,7 +124,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Canvis_recents' ),
        'Recentchangeslinked'       => array( 'Seguiment' ),
        'Revisiondelete'            => array( 'Esborra_versió' ),
-       'RevisionMove'              => array( 'Mou_versió' ),
        'Search'                    => array( 'Cerca' ),
        'Shortpages'                => array( 'Pàgines_curtes' ),
        'Specialpages'              => array( 'Pàgines_especials' ),
@@ -191,6 +153,45 @@ $specialPageAliases = array(
        'Withoutinterwiki'          => array( 'Sense_interwiki' ),
 );
 
+$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' ),
+);
+
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+
+$dateFormats = array(
+       'mdy time' => 'H:i',
+       'mdy date' => 'M j, Y',
+       'mdy both' => 'H:i, M j, Y',
+
+       'dmy time' => 'H:i',
+       'dmy date' => 'j M Y',
+       'dmy both' => 'H:i, j M Y',
+
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y M j',
+       'ymd both' => 'H:i, Y M j',
+);
+
+$bookstoreList = array(
+       'Catàleg Col·lectiu de les Universitats de Catalunya' => 'http://ccuc.cbuc.es/cgi-bin/vtls.web.gateway?searchtype=control+numcard&searcharg=$1',
+       'Totselsllibres.com' => 'http://www.totselsllibres.com/tel/publi/busquedaAvanzadaLibros.do?ISBN=$1',
+       'inherit' => true,
+);
+
 $linkTrail = "/^((?:[a-zàèéíòóúç·ïü]|'(?!'))+)(.*)$/sDu";
 
 $messages = array(
@@ -209,8 +210,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' => '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-watchcreations' => 'Afegeix les pàgines que vagi creant i fitxers que carregui a la llista de seguiment',
+'tog-watchdefault' => 'Afegeix les pàgines que vagi editant 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',
@@ -243,7 +244,7 @@ $messages = array(
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
-'underline-default' => 'Configuració per defecte del navegador',
+'underline-default' => 'Per defecte del navegador',
 
 # Font style option in Special:Preferences
 'editfont-style' => "Editeu l'estil de la lletra:",
@@ -329,7 +330,7 @@ $messages = array(
 'newwindow' => '(obre en una nova finestra)',
 'cancel' => 'Anuŀla',
 'moredotdotdot' => 'Més...',
-'mypage' => 'Pàgina personal',
+'mypage' => 'Pàgina',
 'mytalk' => 'Discussió',
 'anontalk' => "Discussió d'aquesta IP",
 'navigation' => 'Navegació',
@@ -340,7 +341,6 @@ $messages = array(
 'qbbrowse' => 'Navega',
 'qbedit' => 'Modifica',
 'qbpageoptions' => 'Opcions de pàgina',
-'qbpageinfo' => 'Informació de pàgina',
 'qbmyoptions' => 'Pàgines pròpies',
 'qbspecialpages' => 'Pàgines especials',
 'faq' => 'PMF',
@@ -353,7 +353,7 @@ $messages = array(
 'vector-action-protect' => 'Protegeix',
 'vector-action-undelete' => 'Restaura',
 'vector-action-unprotect' => 'Desprotegeix',
-'vector-simplesearch-preference' => 'Habilitar suggeriments de recerca millorats (només aparença Vector)',
+'vector-simplesearch-preference' => 'Activar la barra de cerca simplificada (només aparença Vector)',
 'vector-view-create' => 'Inicia',
 'vector-view-edit' => 'Modifica',
 'vector-view-history' => "Mostra l'historial",
@@ -363,6 +363,7 @@ $messages = array(
 'namespaces' => 'Espais de noms',
 'variants' => 'Variants',
 
+'navigation-heading' => 'Menú de navegació',
 'errorpagetitle' => 'Error',
 'returnto' => 'Torna cap a $1.',
 'tagline' => 'De {{SITENAME}}',
@@ -376,7 +377,7 @@ $messages = array(
 'updatedmarker' => 'actualitzat des de la darrera visita',
 'printableversion' => 'Versió per a impressora',
 'permalink' => 'Enllaç permanent',
-'print' => "Envia aquesta pàgina a la cua d'impressió",
+'print' => 'Imprimir',
 'view' => 'Mostra',
 'edit' => 'Modifica',
 'create' => 'Crea',
@@ -430,7 +431,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' => 'Quant al projecte {{SITENAME}}',
 'aboutpage' => 'Project:Quant a',
-'copyright' => "El contingut és disponible sota els termes d'una llicència $1",
+'copyright' => 'El contingut està disponible sota els termes de la $1.',
 'copyrightpage' => "{{ns:project}}:Drets d'autor",
 'currentevents' => 'Actualitat',
 'currentevents-url' => 'Project:Actualitat',
@@ -478,7 +479,7 @@ $1",
 'thisisdeleted' => 'Voleu mostrar o restaurar $1?',
 'viewdeleted' => 'Voleu mostrar $1?',
 'restorelink' => '{{PLURAL:$1|una versió esborrada|$1 versions esborrades}}',
-'feedlinks' => 'Sindicament:',
+'feedlinks' => 'Sindicació:',
 'feed-invalid' => 'La subscripció no és vàlida pel tipus de sindicament.',
 'feed-unavailable' => 'Els canals de sindicació no estan disponibles',
 'site-rss-feed' => 'Canal RSS $1',
@@ -570,11 +571,12 @@ Consulta: $2',
 'viewsource-title' => 'Mostra la font per a $1',
 'actionthrottled' => 'Acció limitada',
 'actionthrottledtext' => "Com a mesura per a prevenir la propaganda indiscriminada (spam), no podeu fer aquesta acció tantes vegades en un període de temps tan curt. Torneu-ho a intentar d'ací uns minuts.",
-'protectedpagetext' => 'Aquesta pàgina està protegida per evitar modificacions.',
+'protectedpagetext' => "S'ha protegit la pàgina per evitar-hi modificacions.",
 'viewsourcetext' => "Podeu visualitzar i copiar la font d'aquesta pàgina:",
 'viewyourtext' => "Vostè pot veure i copiar la font de ' ' les modificacions ' ' d'aquesta pàgina:",
-'protectedinterface' => "Aquesta pàgina conté cadenes de text per a la interfície del programari, i és protegida per a previndre'n abusos.",
-'editinginterface' => "'''Avís:''' Esteu editant una pàgina que conté cadenes de text per a la interfície d'aquest programari. Tingueu en compte que els canvis que es fan a aquesta pàgina afecten a l'aparença de la interfície d'altres usuaris. Pel que fa a les traduccions, plantegeu-vos utilitzar la [//translatewiki.net/wiki/Main_Page?setlang=ca translatewiki.net], el projecte de traducció de MediaWiki.",
+'protectedinterface' => "Aquesta pàgina proporciona el text de la interfície del software d'aquest wiki i està protegida per evitar els abusos.
+Per agregar o canviar les traduccions per a tots els wikis, si us plau fes servir [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
+'editinginterface' => "'''Avís:''' Esteu editant una pàgina que conté cadenes de text per a la interfície d'aquest programari. Tingueu en compte que els canvis que es fan a aquesta pàgina afecten a l'aparença de la interfície d'altres usuaris. Per afegir o modificar traduccions a totes les wikis, plantegeu-vos utilitzar la [//translatewiki.net/ translatewiki.net], el projecte de localització de MediaWiki.",
 'sqlhidden' => '(consulta SQL oculta)',
 'cascadeprotected' => "Aquesta pàgina està protegida i no es pot modificar perquè està inclosa en {{PLURAL:$1|la següent pàgina, que té|les següents pàgines, que tenen}} activada l'opció de «protecció en cascada»:
 $2",
@@ -599,12 +601,11 @@ L\'administrador que l\'ha bloquejat ha donat aquesta explicació: "$3".',
 # Login and logout pages
 'logouttext' => "'''Heu finalitzat la vostra sessió.'''
 
-Podeu continuar utilitzant {{SITENAME}} de forma anònima, o podeu [[Special:UserLogin|iniciar una sessió una altra vegada]] amb el mateix o un altre usuari.
+Podeu continuar utilitzant {{SITENAME}} de forma anònima, o podeu <span class='plainlinks'>[$1 iniciar una sessió una altra vegada]</span> amb el mateix o un altre usuari.
 Tingueu en compte que algunes pàgines poden continuar mostrant-se com si encara estiguéssiu en una sessió, fins que buideu la memòria cau del vostre navegador.",
-'welcomecreation' => "== Us donem la benvinguda, $1! ==
-
-S'ha creat el vostre compte.
-No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITENAME}}]].",
+'welcomeuser' => 'Benvingut, $1!',
+'welcomecreation-msg' => 'El vostre compte ha estat creat.
+No oblideu de canviar les vostres [[Special:Preferences|preferències de {{SITENAME}}]].',
 'yourname' => "Nom d'usuari",
 'yourpassword' => 'Contrasenya',
 'yourpasswordagain' => 'Escriviu una altra vegada la contrasenya',
@@ -725,12 +726,12 @@ Deveu haver canviat la vostra contrasenya o demanat una nova contrasenya tempora
 'passwordreset-capture-help' => "Si marqueu aquesta casella, el missatge de correu electrònic (amb la contrasenya temporal) es mostrarà al mateix moment que sigui enviat a l'usuari.",
 'passwordreset-email' => 'Adreça de correu electrònic:',
 'passwordreset-emailtitle' => 'Detalls del compte a {{SITENAME}}',
-'passwordreset-emailtext-ip' => "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} <$4>. {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
+'passwordreset-emailtext-ip' => "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
 
 $2
 
 {{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.
-Hauríeu d'entrar {{PLURAL:$3|al compte per a fixar-hi una nova contrasenya|als comptes per a fixar-hi noves contrasenyes}} al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
+Hauríeu d'entrar al compte per a fixar-hi una nova contrasenya al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
 'passwordreset-emailtext-user' => "L'usuari $1 de {{SITENAME}} ha demanat un recordatori dels detalls dels vostres comptes al projecte {{SITENAME}} <$4>. {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:
 
 $2
@@ -844,7 +845,7 @@ Podeu [[Special:Search/{{PAGENAME}}|cercar aquest títol]] en altres pàgines,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar en els registres]
 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>.',
+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>, però no teniu permisos per crear la pàgina.',
 '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.
@@ -853,12 +854,11 @@ Detalls es poden trobar en el [{{fullurl: {{# especial: registre}} / delete|page
 'userpage-userdoesnotexist-view' => 'El compte d\'usuari "$1" no està registrat.',
 'blocked-notice-logextract' => "En aquests moments aquest compte d'usuari es troba blocat.
 Per més detalls, la darrera entrada del registre es mostra a continuació:",
-'clearyourcache' => "'''Nota:''' Després de desar, podeu haver d'ometre la memòria cau del vostre navegador per a veure'n els canvis.
-* '''Firefox / Safari:''' Premeu ''Maj'' mentre cliqueu a ''Actualitza'' (Reload), o premeu ''Ctrl+F5'' o ''Ctrl+R'' (''⌘+R'' en un Mac)
-* '''Google Chrome:''' Premeu ''Ctrl+Maj+R'' (''⌘+Maj+R'' en un Mac)
-* '''Internet Explorer:''' Premeu ''Ctrl'' mentre cliqueu a ''Actualitza'' (Refresh), o premeu ''Ctrl+F5''
-* '''Konqueror:''' Cliqueu al botó ''Recarrega'' (Reload), o premeu ''F5''
-* '''Opera:''' Netegeu la vostra memòria cau a ''Tools → Preferences''",
+'clearyourcache' => "'''Nota:''' Després de desar, possiblement necessiteu refrescar la memòria cau del vostre navegador per a veure'n els canvis.
+* '''Firefox / Safari:''' Premeu ''Shift'' mentre cliqueu el botó ''Actualitzar'', o pressioneu ''Ctrl+F5'' o ''Ctrl+R'' (''⌘+R'' a Mac)
+* '''Google Chrome:''' Premeu ''Ctrl+Shift+R'' (''⌘+Shift+R'' a Mac)
+* '''Internet Explorer:''' Premeu la tecla ''Ctrl'' mentre cliqueu a ''Actualitzar'' o pressioneu ''Ctrl+F5''
+* '''Opera:''' Netegeu la memòria cau ''Eines → Preferències''",
 'usercssyoucanpreview' => "'''Consell:''' Utilitzeu el botó \"{{int:showpreview}}\" per provar el vostre nou CSS abans de desar-lo.",
 'userjsyoucanpreview' => "'''Consell:''' Utilitzeu el botó \"{{int:showpreview}}\" per provar el vostre nou JavaScript abans de desar-lo.",
 'usercsspreview' => "'''Recordeu que esteu previsualitzant el vostre CSS d'usuari.'''
@@ -873,7 +873,7 @@ Per més detalls, la darrera entrada del registre es mostra a continuació:",
 'note' => "'''Nota:'''",
 'previewnote' => "'''Recorda que això és només una previsualització.'''
 Els vostres canvis encara no s'han desat!",
-'continue-editing' => "Continua l'edició",
+'continue-editing' => "Aneu a l'àrea d'edició",
 'previewconflict' => "Aquesta previsualització reflecteix, a l'àrea
 d'edició superior, el text tal i com apareixerà si trieu desar-lo.",
 'session_fail_preview' => "'''No s'ha pogut processar la vostra modificació a causa d'una pèrdua de dades de la sessió.
@@ -954,6 +954,15 @@ Sembla haver estat esborrada.",
 'edit-already-exists' => "No s'ha pogut crear una pàgina.
 Ja existeix.",
 'defaultmessagetext' => 'Missatge per defecte',
+'content-failed-to-parse' => "Ha fallat l'anàlisi del contingut de $2 per al model $1: $3",
+'invalid-content-data' => 'Dades de contingut no vàlides',
+'content-not-allowed-here' => 'No és permés el contingut "$1" a la pàgina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'text net',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Atenció: Aquesta pàgina conté massa crides a funcions parserfunction complexes.
@@ -1008,8 +1017,8 @@ El motiu donat per $3 és ''$2''",
 (prev) = diferència amb la versió anterior, m = modificació menor',
 'history-fieldset-title' => "Cerca a l'historial",
 'history-show-deleted' => 'Només esborrats',
-'histfirst' => 'El primer',
-'histlast' => 'El darrer',
+'histfirst' => 'Primeres',
+'histlast' => 'Últimes',
 'historysize' => '({{PLURAL:$1|1 octet|$1 octets}})',
 'historyempty' => '(buit)',
 
@@ -1110,9 +1119,10 @@ Si us plau, verifica els registres.",
 'revdelete-only-restricted' => 'Error amagant els ítems $2, $1: no pots suprimir elements a la vista dels administradors sense seleccionar alhora una de les altres opcions de supressió.',
 'revdelete-reason-dropdown' => "*Raons d'esborrament comunes
 ** Violació del copyright
-** Informació personal inapropiada
+** Comentari o informació personal inapropiada
+** Nom d'usuari inapropiat
 ** Informació potencialment calumniosa",
-'revdelete-otherreason' => 'Altre motiu / motiu suplementari:',
+'revdelete-otherreason' => 'Motiu diferent o addicional:',
 'revdelete-reasonotherlist' => 'Altres raons',
 'revdelete-edit-reasonlist' => "Editar el motiu d'esborrament",
 'revdelete-offender' => 'Autor de la revisió:',
@@ -1208,8 +1218,6 @@ Es pot trobar més informació en el [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-caption' => 'Projectes germans',
 'search-interwiki-default' => '$1 resultats:',
 'search-interwiki-more' => '(més)',
-'search-mwsuggest-enabled' => 'amb suggeriments',
-'search-mwsuggest-disabled' => 'cap suggeriment',
 'search-relatedarticle' => 'Relacionat',
 'mwsuggest-disable' => 'Inhabilita els suggeriments en AJAX',
 'searcheverything-enable' => 'Cerca a tots els espais de noms',
@@ -1305,7 +1313,7 @@ A continuació es mostra un valor generat de forma aleatòria que podeu fer serv
 'timezoneregion-indian' => 'Oceà Índic',
 'timezoneregion-pacific' => 'Oceà Pacífic',
 'allowemail' => 'Permet que altres usuaris puguin enviar-me correus electrònics',
-'prefs-searchoptions' => 'Preferències de la cerca',
+'prefs-searchoptions' => 'Cerca',
 'prefs-namespaces' => 'Espais de noms',
 'defaultns' => 'Cerca per defecte en els següents espais de noms:',
 'default' => 'per defecte',
@@ -1473,6 +1481,9 @@ Ha de tenir com a molt {{PLURAL:$1|un caràcter|$1 caràcters}}.',
 'rightslogtext' => "Aquest és un registre de canvis dels permisos d'usuari.",
 'rightslogentry' => 'ha modificat els drets de $1 del grup $2 a $3',
 'rightslogentry-autopromote' => 'ha estat promogut automàticament de $2 a $3',
+'logentry-rights-rights' => '$1 ha canviat la pertinença de grups per $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 ha canviat la pertinença de grups per $3',
+'logentry-rights-autopromote' => '$1 ha estat promogut automàticament de $4 a $5',
 'rightsnone' => '(cap)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1694,6 +1705,7 @@ $1',
 'backend-fail-notsame' => 'Ja existeix un fitxer no idèntic a $1.',
 'backend-fail-invalidpath' => "$1 no és un camí d'emmagatzemament vàlid.",
 'backend-fail-delete' => "No s'ha pogut suprimir el fitxer $1.",
+'backend-fail-describe' => 'La modificació de les metadades del fitxer "$1" no és possible.',
 'backend-fail-alreadyexists' => 'El fitxer $1 ja existeix.',
 'backend-fail-store' => "No s'ha pogut emmagatzemar el fitxer $1 a $2.",
 'backend-fail-copy' => "No s'ha pogut copiar el fitxer $1 a $2.",
@@ -1710,7 +1722,7 @@ $1',
 'backend-fail-internal' => "S'ha produït un error desconegut en el fitxer de rerefons d'emmagatzemament «$1».",
 'backend-fail-contenttype' => 'No es pot determinar el tipus de contingut del fitxer per emmagatzemar a «$1».',
 'backend-fail-batchsize' => "El rerefons d'emmagatzemament ha rebut un lot {{PLURAL:$1|d'$1 operació|de $1 operacions}} de fitxer; el límit és $2 {{PLURAL:$2|operació|operacions}}.",
-'backend-fail-usable' => "No s'ha pogut escriure el fitxer $1 a causa de permisos insuficients o perquè hi manquen directoris/contenidors.",
+'backend-fail-usable' => 'No s\'ha pogut llegir ni escriure el fitxer "$1" a causa de permisos insuficients o perquè hi manquen directoris/contenidors.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'No es pot connectar amb la base de dades per emmagatzemar el backend "$1".',
@@ -1841,6 +1853,7 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 'uploadnewversion-linktext' => "Carrega una nova versió d'aquest fitxer",
 'shared-repo-from' => 'des de $1',
 'shared-repo' => 'un repositori compartit',
+'upload-disallowed-here' => 'No pot sobreescriure aquest fitxer.',
 
 # File reversion
 'filerevert' => 'Reverteix $1',
@@ -1863,7 +1876,7 @@ Potser voleu modificar-ne la descripció en la seva [$2 pàgina de descripció].
 'filedelete-success-old' => "<span class=\"plainlinks\">La versió de '''[[Media:\$1|\$1]]''' s'ha eliminat el \$2 a les \$3.</span>",
 'filedelete-nofile' => "'''$1''' no existeix.",
 'filedelete-nofile-old' => "No hi ha cap versió arxivada de '''$1''' amb els atributs especificats.",
-'filedelete-otherreason' => 'Motius alternatius/addicionals:',
+'filedelete-otherreason' => 'Motiu diferent o addicional:',
 'filedelete-reason-otherlist' => 'Altres motius',
 'filedelete-reason-dropdown' => "*Motius d'eliminació comuns
 ** Violació dels drets d'autor / copyright
@@ -1947,6 +1960,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|octet|octets}}',
 'ncategories' => '$1 {{PLURAL:$1|categoria|categories}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|enllaç|enllaços}}',
 'nmembers' => '$1 {{PLURAL:$1|membre|membres}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisió|revisions}}',
@@ -1975,6 +1989,7 @@ Les entrades <del>ratllades</del> s\'han resolt.',
 'mostlinkedtemplates' => 'Plantilles més usades',
 'mostcategories' => 'Pàgines amb més categories',
 'mostimages' => 'Fitxers més enllaçats',
+'mostinterwikis' => 'Pàgines amb més interwikis',
 'mostrevisions' => 'Pàgines més modificades',
 'prefixindex' => 'Totes les pàgines per prefix',
 'prefixindex-namespace' => 'Totes les pàgines amb prefix (espai de noms $1)',
@@ -2072,9 +2087,9 @@ Vegeu també [[Special:WantedCategories|les categories soŀlicitades]].",
 'linksearch-pat' => 'Patró de cerca:',
 'linksearch-ns' => 'Espai de noms:',
 'linksearch-ok' => 'Cerca',
-'linksearch-text' => 'Podeu fer servir caràcters comodí com "*.wikipedia.org".
+'linksearch-text' => 'Es poden utilitzar caràcters comodí com "*.wikipedia.org".
 Necessita com a mínim un domini de primer nivell, per exemple "*.org".<br />
-Protocols admesos: <code> $1 </code> (no els afegiu en la vostra recerca).',
+Protocols admesos: <code>$1</code> (http:// per defecte si no se n\'especifica cap).',
 'linksearch-line' => '$1 enllaçat a $2',
 'linksearch-error' => "Els caràcters comodí només poden aparèixer a l'inici de l'url.",
 
@@ -2122,9 +2137,11 @@ Pot ser que hi hagi més informació sobre drets individuals [[{{MediaWiki:Listg
 i tenir una direcció electrònica vàlida en les vostres [[Special:Preferences|preferències]]
 per enviar un correu electrònic a altres usuaris.",
 'emailuser' => 'Envia un missatge de correu electrònic a aquest usuari',
+'emailuser-title-target' => 'Enviar un correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}',
+'emailuser-title-notarget' => "Enviar un correu electrònic a l'usuari",
 'emailpage' => 'Correu electrònic a usuari',
-'emailpagetext' => "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a aquest usuari.
-L'adreça electrònica que heu entrat en [[Special:Preferences|les vostres preferències d'usuari]] apareixerà com a remitent del correu electrònic, de manera que el destinatari us podrà respondre directament.",
+'emailpagetext' => "Podeu usar el següent formulari per a enviar un missatge de correu electrònic a {{GENDER:$1|aquest usuari|aquesta usuària}}.
+L'adreça electrònica que vau indicar a [[Special:Preferences|les vostres preferències d'usuari]] apareixerà com a remitent del correu electrònic, de manera que el destinatari us podrà respondre directament.",
 'usermailererror' => "L'objecte de correu ha retornat un error:",
 'defemailsubject' => 'Correu electrònic de l\'usuari "$1" de {{SITENAME}}',
 'usermaildisabled' => "Correu electrònic d'usuaris deshabilitat",
@@ -2192,11 +2209,7 @@ S'hi mostraran els canvis futurs que tinguin lloc en aquesta pàgina i la corres
 
 'enotif_mailer' => 'Sistema de notificació per correl de {{SITENAME}}',
 'enotif_reset' => 'Marca totes les pàgines com a visitades',
-'enotif_newpagetext' => 'Aquesta és una nova pàgina.',
 'enotif_impersonal_salutation' => 'usuari de la {{SITENAME}}',
-'changed' => 'modificada',
-'created' => 'creada',
-'enotif_subject' => 'La pàgina $PAGETITLE a {{SITENAME}} ha estat $CHANGEDORCREATED per $PAGEEDITOR',
 'enotif_lastvisited' => "Vegeu $1 per a tots els canvis que s'han fet d'ença de la vostra darrera visita.",
 'enotif_lastdiff' => 'Consulteu $1 per a visualitzar aquest canvi.',
 'enotif_anon_editor' => 'usuari anònim $1',
@@ -2252,7 +2265,7 @@ Vegeu $2 per a un registre dels esborrats més recents.',
 'deletionlog' => "Registre d'esborrats",
 'reverted' => 'Invertit amb una revisió anterior',
 'deletecomment' => 'Motiu:',
-'deleteotherreason' => 'Motius diferents o addicionals:',
+'deleteotherreason' => 'Motiu diferent o addicional:',
 'deletereasonotherlist' => 'Altres motius',
 'deletereason-dropdown' => "*Motius freqüents d'esborrat
 ** Demanada per l'autor
@@ -2323,7 +2336,7 @@ Ací es troben els paràmetres actuals de la pàgina '''$1''':",
 'protect-othertime' => 'Un altre termini:',
 'protect-othertime-op' => 'un altre termini',
 'protect-existing-expiry' => "Data d'expiració existent: $2 a les $3",
-'protect-otherreason' => 'Altres motius:',
+'protect-otherreason' => 'Motiu diferent o addicional:',
 'protect-otherreason-op' => 'Altres motius',
 'protect-dropdown' => "*Motius comuns de protecció
 ** Vandalisme excessiu
@@ -2379,12 +2392,13 @@ al resum a continuació, juntament amb detalls dels usuaris que l'havien editat
 'undeletedrevisions' => '{{PLURAL:$1|Una revisió restaurada|$1 revisions restaurades}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|Una revisió|$1 revisions}} i {{PLURAL:$2|un fitxer|$2 fitxers}} restaurats',
 'undeletedfiles' => '$1 {{PLURAL:$1|fitxer restaurat|fitxers restaurats}}',
-'cannotundelete' => "No s'ha pogut restaurar; algú altre pot estar restaurant la mateixa pàgina.",
+'cannotundelete' => 'Hi ha hagut un error en el procés de restauració:
+$1',
 'undeletedpage' => "'''S'ha restaurat «$1»'''
 
 Consulteu el [[Special:Log/delete|registre d'esborraments]] per a veure els esborraments i els restauraments més recents.",
 'undelete-header' => "Vegeu [[Special:Log/delete|el registre d'eliminació]] per a veure les pàgines eliminades recentment.",
-'undelete-search-title' => 'Pàgines de cerca suprimit',
+'undelete-search-title' => 'Cerca de pàgines esborrades',
 'undelete-search-box' => 'Cerca pàgines esborrades',
 'undelete-search-prefix' => 'Mostra pàgines que comencin:',
 'undelete-search-submit' => 'Cerca',
@@ -2410,7 +2424,7 @@ $1",
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => "Contribucions de l'usuari",
+'contributions' => "{{GENDER:$1|Contribucions de l'usuari}}",
 'contributions-title' => "Contribucions de l'usuari $1",
 'mycontris' => 'Contribucions',
 'contribsub2' => 'Per $1 ($2)',
@@ -2453,7 +2467,7 @@ Per més detalls, la última entrada del registre es mostra a continuació:',
 'whatlinkshere-hideredirs' => '$1 redireccions',
 'whatlinkshere-hidetrans' => '$1 inclusions',
 'whatlinkshere-hidelinks' => '$1 enllaços',
-'whatlinkshere-hideimages' => '$1 enllaços a imatge',
+'whatlinkshere-hideimages' => '$1 enllaços de fitxers',
 'whatlinkshere-filters' => 'Filtres',
 
 # Block/unblock
@@ -2489,7 +2503,7 @@ quines pàgines en concret estan sent vandalitzades).",
 'ipbother' => 'Un altre termini',
 'ipboptions' => '2 hores:2 hours,1 dia:1 day,3 dies:3 days,1 setmana:1 week,2 setmanes:2 weeks,1 mes:1 month,3 mesos:3 months,6 mesos:6 months,1 any:1 year,infinit:infinite',
 'ipbotheroption' => 'un altre',
-'ipbotherreason' => 'Altres motius o addicionals:',
+'ipbotherreason' => 'Motiu diferent o addicional:',
 'ipbhidename' => "Amaga el nom d'usuari de les edicions i llistes",
 'ipbwatchuser' => "Vigila les pàgines d'usuari i de discussió de l'usuari",
 'ipb-disableusertalk' => 'Impedeix que aquest usuari pugui modificar la seva pàgina de discussió mentre dura el blocatge',
@@ -2497,8 +2511,8 @@ quines pàgines en concret estan sent vandalitzades).",
 'ipb-confirm' => 'Confirma el blocatge',
 'badipaddress' => "L'adreça IP no té el format correcte.",
 'blockipsuccesssub' => "S'ha blocat amb èxit",
-'blockipsuccesstext' => "[[Special:Contributions/$1|$1]] ha estat {{GENDER:$1|bloquejat|bloquejada|bloquejat/da}}.<br />
-Vegeu la [[Special:BlockList|llista d'IP blocades]] per revisar els bloqueigs.",
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] ha estat {{GENDER:$1|blocat|blocada}}.<br />
+Vegeu la [[Special:BlockList|llista de bloqueigs]] per revisar-los.',
 'ipb-blockingself' => 'Esteu a punt de blocar-vos a vós mateix! Esteu segurs de voler-ho fer?',
 'ipb-confirmhideuser' => "Esteu a punt de bloquejar un usuari que està marcat amb l'opció «amaga l'usuari». Això suprimirà el seu nom a totes les llistes i registres. Esteu segurs de voler-ho fer?",
 'ipb-edit-dropdown' => 'Edita les raons per a blocar',
@@ -2680,13 +2694,14 @@ Incorporeu-les manualment, si us plau.",
 
 La pàgina de destinació, «[[:$1]]», ja existeix. Voleu eliminar-la per a fer lloc al trasllat?",
 'delete_and_move_confirm' => 'Sí, esborra la pàgina',
-'delete_and_move_reason' => 'Suprimit per donar pas a pas de " [[$1]] "',
+'delete_and_move_reason' => 'S\'ha eliminat per a permetre el reanomenament de " [[$1]] "',
 'selfmove' => "Els títols d'origen i de destinació coincideixen: no és possible de reanomenar una pàgina a si mateixa.",
 'immobile-source-namespace' => 'No es poden moure pàgines de l\'espai de noms "$1"',
 'immobile-target-namespace' => 'No es poden moure pàgines cap a l\'espai de noms "$1"',
 'immobile-target-namespace-iw' => "No es poden moure pàgines a l'enllaç interwiki",
 'immobile-source-page' => 'Aquesta pàgina no es pot moure.',
 'immobile-target-page' => 'No es pot moure cap a una destinació amb aquest títol.',
+'bad-target-model' => 'El destí desitjat utilitza un model de contingut diferent. No es pot convertir de $1 a $2.',
 'imagenocrossnamespace' => 'No es pot moure la imatge a un espai de noms on no li correspon',
 'nonfile-cannot-move-to-file' => 'No es pot moure la imatge a un espai de noms on no li correspon',
 'imagetypemismatch' => 'La nova extensió de fitxer no coincideix amb el seu tipus',
@@ -2702,16 +2717,16 @@ A continuació es mostra la darrera entrada del registre com a referència:",
 'file-exists-sharedrepo' => "El nom de fitxer escollit ja s'utilitza al dipòsit compartit. Escolliu un altre nom.",
 
 # Export
-'export' => 'Exporta les pàgines',
+'export' => 'Exportació de pàgines',
 'exporttext' => "Podeu exportar a XML el text i l'historial d'una pàgina en concret o d'un conjunt de pàgines; aleshores el resultat pot importar-se en un altre lloc web basat en wiki amb programari de MediaWiki mitjançant la [[Special:Import|pàgina d'importació]].
 
 Per a exportar pàgines, escriviu els títols que desitgeu al quadre de text de sota, un títol per línia, i seleccioneu si desitgeu o no la versió actual juntament amb totes les versions antigues, amb la pàgina d'historial, o només la pàgina actual amb la informació de la darrera modificació.
 
 En el darrer cas, podeu fer servir un enllaç com ara [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] per a la pàgina «[[{{MediaWiki:Mainpage}}]]».",
 'exportall' => 'Exporta totes les pàgines',
-'exportcuronly' => "Exporta únicament la versió actual en voltes de l'historial sencer",
+'exportcuronly' => "Inclou només la versió actual, sense l'historial complet",
 'exportnohistory' => "----
-'''Nota:''' s'ha inhabilitat l'exportació sencera d'historial de pàgines mitjançant aquest formulari a causa de problemes de rendiment del servidor.",
+'''Nota:''' s'ha inhabilitat l'exportació sencera d'historial de pàgines mitjançant aquest formulari a causa de problemes de rendiment.",
 'exportlistauthors' => 'Inclouen una llista completa dels contribuents per a cada pàgina',
 'export-submit' => 'Exporta',
 'export-addcattext' => 'Afegeix pàgines de la categoria:',
@@ -2810,7 +2825,6 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 
 # JavaScriptTest
 'javascripttest' => 'Proves de JavaScript',
-'javascripttest-disabled' => "No s'ha inhabilitat la funció en el wiki.",
 'javascripttest-title' => "S'estan executant $1 proves",
 'javascripttest-pagetext-noframework' => "Es reserva la pàgina per a l'execució de tests amb JavaScript.",
 'javascripttest-pagetext-unknownframework' => "L'entorn de proves «$1» és desconegut.",
@@ -2842,7 +2856,7 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 'tooltip-ca-move' => 'Reanomena aquesta pàgina',
 'tooltip-ca-watch' => 'Afegiu aquesta pàgina a la vostra llista de seguiment.',
 'tooltip-ca-unwatch' => 'Suprimiu aquesta pàgina de la vostra llista de seguiment',
-'tooltip-search' => 'Cerca en el projecte {{SITENAME}}',
+'tooltip-search' => 'Cerca a {{SITENAME}}',
 'tooltip-search-go' => 'Vés a una pàgina amb aquest nom exacte si existeix',
 'tooltip-search-fulltext' => 'Cerca a les pàgines aquest text',
 'tooltip-p-logo' => 'Pàgina principal',
@@ -2883,7 +2897,7 @@ Deseu-lo al vostre ordinador i carregueu-ne una còpia ací.",
 'tooltip-watchlistedit-raw-submit' => 'Actualitza la llista de seguiment',
 'tooltip-recreate' => 'Recrea la pàgina malgrat hagi estat suprimida',
 'tooltip-upload' => 'Inicia la càrrega',
-'tooltip-rollback' => "«Rollback» reverteix les edicions del darrer contribuïdor d'aquesta pàgina en un clic.",
+'tooltip-rollback' => "«Revertir» reverteix totes les edicions de l'últim usuari en un clic.",
 'tooltip-undo' => '«Desfés» reverteix aquesta modificació i obre un formulari de previsualització.
 Permet afegir un motiu al resum.',
 'tooltip-preferences-save' => 'Desa preferències',
@@ -2923,11 +2937,43 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 
 # Info page
 'pageinfo-title' => 'Informació de «$1»',
-'pageinfo-header-edits' => 'Modificacions',
+'pageinfo-not-current' => 'Només es pot visualitzar la informació de la revisió actual.',
+'pageinfo-header-basic' => 'Informació bàsica',
+'pageinfo-header-edits' => 'Historial d’edicions',
+'pageinfo-header-restrictions' => 'Protecció de pàgina',
+'pageinfo-header-properties' => 'Propietats de la pàgina',
+'pageinfo-display-title' => 'Títol mostrat',
+'pageinfo-default-sort' => "Clau d'ordenació predeterminada",
+'pageinfo-length' => 'Mida de la pàgina (en bytes)',
+'pageinfo-article-id' => 'ID de la pàgina',
+'pageinfo-language' => 'Llengua del contingut de la pàgina',
+'pageinfo-robot-policy' => 'Estat del motor de cerca',
+'pageinfo-robot-index' => 'Indexable',
+'pageinfo-robot-noindex' => 'No indexable',
 '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-watchers' => "Número d'usuaris que vigilen la pàgina",
+'pageinfo-redirects-name' => 'Redireccions a aquesta pàgina',
+'pageinfo-subpages-name' => "Subpàgines d'aquesta pàgina",
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecció|redireccions}}; $3 {{PLURAL:$3|no redireció|no redireccions}})',
+'pageinfo-firstuser' => 'Creador de la pàgina',
+'pageinfo-firsttime' => 'Data de la creació de la pàgina',
+'pageinfo-lastuser' => 'Últim editor',
+'pageinfo-lasttime' => "Data de l'última edició",
+'pageinfo-edits' => "Número total d'edicions",
+'pageinfo-authors' => "Número total d'autors diferents",
+'pageinfo-recent-edits' => "Número d'edicions recents (en els darrers $1)",
+'pageinfo-recent-authors' => "Número recent d'autors diferents",
+'pageinfo-magic-words' => '{{PLURAL:$1|Paraula clau|Paraules clau}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categories ocultes}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|plantilla inclosa|plantilles incloses}} ($1)',
+'pageinfo-toolboxlink' => 'Informació de la pàgina',
+'pageinfo-redirectsto' => 'Redirigeix a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Comptat com una pàgina de contingut',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => "Proteccions en cascada des d'aquí",
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => 'Proteccions en cascada des de',
 
 # Skin names
 'skinname-standard' => 'Clàssic',
@@ -2944,6 +2990,8 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 'markedaspatrollederror' => 'No es pot marcar com a supervisat',
 'markedaspatrollederrortext' => 'Cal que especifiqueu una versió per a marcar-la com a supervisada.',
 'markedaspatrollederror-noautopatrol' => 'No podeu marcar les vostres pròpies modificacions com a supervisades.',
+'markedaspatrollednotify' => 'Aquesta modificació a $1 ha estat marcada com a patrullada.',
+'markedaspatrollederrornotify' => 'Ha fallat la marca com a patrullat.',
 
 # Patrol log
 'patrol-log-page' => 'Registre de supervisió',
@@ -2952,7 +3000,7 @@ Això deu ser degut per un enllaç a un lloc extern inclòs a la llista negra.',
 
 # Image deletion
 'deletedrevision' => "S'ha eliminat la revisió antiga $1.",
-'filedeleteerror-short' => "S'ha produït un error en suprimir el fitxer: $1",
+'filedeleteerror-short' => 'Error en suprimir el fitxer: $1',
 'filedeleteerror-long' => "S'han produït errors en suprimir el fitxer:
 
 $1",
@@ -2976,6 +3024,7 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
 'file-info-size-pages' => '$1 × $2 píxels, mida del fitxer: $3, tipus MIME: $4, $5 {{PLURAL:$5|pàgina|pàgines}}',
 'file-nohires' => 'No hi ha cap versió amb una resolució més gran.',
 'svg-long-desc' => 'fitxer SVG, nominalment $1 × $2 píxels, mida del fitxer: $3',
+'svg-long-desc-animated' => 'Fitxer SVG animat, nominalment $1 × $2 píxels, mida del fitxer: $3',
 'show-big-image' => 'Imatge en màxima resolució',
 'show-big-image-preview' => "Mida d'aquesta previsualització: $1.",
 'show-big-image-other' => '{{PLURAL:$2|Altra resolució|Altres resolucions}}: $1.',
@@ -2985,6 +3034,8 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
 'file-info-png-looped' => 'embuclat',
 'file-info-png-repeat' => "s'ha reproduït $1 {{PLURAL:$1|vegada|vegades}}",
 'file-info-png-frames' => '$1 {{PLURAL:$1|fotograma|fotogrames}}',
+'file-no-thumb-animation' => "'''Nota: degut a limitacions tècniques no s'animaran les miniatures per aquest fitxer.'''",
+'file-no-thumb-animation-gif' => "''' Nota: degut a limitacions tècniques no s'animaran les miniatures d'alta resolució d'imatges GIF com aquesta.'''",
 
 # Special:NewFiles
 'newimages' => 'Galeria de nous fitxers',
@@ -3005,6 +3056,7 @@ Si l'executeu, podeu comprometre la seguretat del vostre sistema.",
 'hours' => '{{PLURAL:$1|$1 hora|$1 hores}}',
 'days' => '{{PLURAL:$1|$1 dia|$1 dies}}',
 'ago' => 'fa $1',
+'just-now' => 'ara mateix',
 
 # Bad image list
 'bad_image_list' => "El format ha de ser el següent:
@@ -3126,7 +3178,7 @@ La resta d'enllaços de la línia són les excepcions, és a dir, les pàgines o
 'exif-gpsstatus' => 'Estat del receptor',
 'exif-gpsmeasuremode' => 'Mode de mesura',
 'exif-gpsdop' => 'Precisió de la mesura',
-'exif-gpsspeedref' => 'Unitats de velocitat',
+'exif-gpsspeedref' => 'Unitat de velocitat',
 'exif-gpsspeed' => 'Velocitat del receptor GPS',
 'exif-gpstrackref' => 'Referència per la direcció del moviment',
 'exif-gpstrack' => 'Direcció del moviment',
@@ -3506,6 +3558,7 @@ Aquest codi de confirmació caducarà el $4.",
 # Scary transclusion
 'scarytranscludedisabled' => "[S'ha inhabilitat la transclusió interwiki]",
 'scarytranscludefailed' => '[Ha fallat la recuperació de la plantilla per a $1]',
+'scarytranscludefailed-httpstatus' => '[Ha fallat la recuperació de la plantilla per a $1: HTTP $2]',
 'scarytranscludetoolong' => "[L'URL és massa llarg]",
 
 # Delete conflict
@@ -3616,6 +3669,7 @@ També podeu [[Special:EditWatchlist|utilitzar l'editor estàndard]].",
 'version-license' => 'Llicència',
 'version-poweredby-credits' => "El wiki funciona gràcies a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altres',
+'version-credits-summary' => 'El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]',
 'version-license-info' => "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, ja sigui de la seva versió 2 o (a elecció vostra) qualsevol versió posterior. 
 
 MediaWiki es distribueix en l'esperança de ser d'utilitat, però SENSE CAP GARANTIA; ni tan sols la garantia implícita de COMERCIALITZACIÓ o ADEQUACIÓ A UNA FINALITAT DETERMINADA. En trobareu més detalls a  la Llicència Pública General GNU.
@@ -3755,8 +3809,8 @@ Les imatges es mostren en plena resolució; altres tipus de fitxer s'inicien dir
 'logentry-move-move_redir-noredirect' => '$1 ha desplaçat la pàgina $3 a $4 on hi havia una redirecció i sense crear una nova redirecció',
 'logentry-patrol-patrol' => '$1 ha marcat la versió $4 de la pàgina $3 com a patrullada',
 'logentry-patrol-patrol-auto' => '$1 ha marcat automàticament la versió $4 de la pàgina $3 com a patrullada',
-'logentry-newusers-newusers' => "$1 ha creat un compte d'usuari",
-'logentry-newusers-create' => "$1 ha creat un compte d'usuari",
+'logentry-newusers-newusers' => "S'ha creat el compte d'usuari $1",
+'logentry-newusers-create' => "S'ha creat el compte d'usuari $1",
 'logentry-newusers-create2' => "$1 ha creat el compte d'usuari $3",
 'logentry-newusers-autocreate' => "El compte d'usuari $1 ha estat creat de manera automàtica",
 'newuserlog-byemail' => 'contrasenya enviada per correu electrònic',
@@ -3777,6 +3831,10 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'feedback-bugcheck' => 'Fantàstic! Comproveu que no sigui un dels [$1 problemes ja coneguts].',
 'feedback-bugnew' => "Ja ho he comprovat. Informeu d'un nou problema",
 
+# Search suggestions
+'searchsuggest-search' => 'Cerca',
+'searchsuggest-containing' => 'que conté ...',
+
 # API errors
 'api-error-badaccess-groups' => 'No teniu permís per a carregar fitxers en aquest wiki.',
 'api-error-badtoken' => 'Error intern: argument incorrecte.',
@@ -3829,4 +3887,6 @@ Altrament, podeu fer servir un senzill formulari a continuació. El vostre comen
 'duration-centuries' => '$1 {{PLURAL:$1|segle|segles}}',
 'duration-millennia' => '$1 {{PLURAL:$1|mil·leni|mil·lenis}}',
 
+# Unknown messages
+'svg-long-error' => 'El fitxer SVG no és vàlid: $1',
 );
index 5e6e2f9..b58427e 100644 (file)
@@ -14,85 +14,83 @@ $fallback = "es";
 
 $messages = array(
 # Dates
-'january'      => 'Enero',
-'february'     => 'Febrero',
-'march'        => 'Marzo',
-'april'        => 'Abril',
-'may_long'     => 'Mayo',
-'june'         => 'Junio',
-'july'         => 'Julio',
-'august'       => 'Agosto',
-'september'    => 'Septiembre',
-'october'      => 'Octubre',
-'november'     => 'Noviembre',
-'december'     => 'Diciembre',
-'april-gen'    => 'Abril',
-'august-gen'   => 'Agosto',
+'january' => 'Enero',
+'february' => 'Febrero',
+'march' => 'Marzo',
+'april' => 'Abril',
+'may_long' => 'Mayo',
+'june' => 'Junio',
+'july' => 'Julio',
+'august' => 'Agosto',
+'september' => 'Septiembre',
+'october' => 'Octubre',
+'november' => 'Noviembre',
+'december' => 'Diciembre',
+'april-gen' => 'Abril',
+'august-gen' => 'Agosto',
 'december-gen' => 'Diciembre',
-'apr'          => 'Abr',
-'aug'          => 'Ago',
-'dec'          => 'Dic',
+'apr' => 'Abr',
+'aug' => 'Ago',
+'dec' => 'Dic',
 
 # Categories related messages
 'category_header' => 'Maga articulo na categoria "$1"',
 
-'about'   => 'Acerca de',
+'about' => 'Acerca de',
 'article' => 'El laman del pagina',
 
-'tagline'          => 'Estava na {{SITENAME}}',
-'help'             => 'Ayuda',
-'search'           => 'Busqueda',
-'searchbutton'     => 'Busca',
-'searcharticle'    => 'Anda',
-'history_short'    => 'Historia',
+'tagline' => 'Estava na {{SITENAME}}',
+'help' => 'Ayuda',
+'search' => 'Busqueda',
+'searchbutton' => 'Busca',
+'searcharticle' => 'Anda',
+'history_short' => 'Historia',
 'printableversion' => 'El version que puede imprenta',
-'edit'             => 'Revisa',
-'delete'           => 'Bora',
+'edit' => 'Revisa',
+'delete' => 'Bora',
 'talkpagelinktext' => 'Cuento',
-'personaltools'    => 'Maga herramientas personal',
-'articlepage'      => 'Mira con el laman del pagina',
-'views'            => 'Maga vista',
-'categorypage'     => 'Mira con el pagina de categoria',
-'otherlanguages'   => 'na otro maga lenguaje',
-'lastmodifiedat'   => 'Ya modifica con este pagina por ultimo vez en hora $2 del $1.',
+'personaltools' => 'Maga herramientas personal',
+'articlepage' => 'Mira con el laman del pagina',
+'views' => 'Maga vista',
+'categorypage' => 'Mira con el pagina de categoria',
+'otherlanguages' => 'na otro maga lenguaje',
+'lastmodifiedat' => 'Ya modifica con este pagina por ultimo vez en hora $2 del $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'            => 'Acerca de {{SITENAME}}',
-'aboutpage'            => 'Project:Acerca de',
-'copyright'            => 'Obtenible el maga texto de este Wikipedia bajo los terminos y maga condicion del <i>$1</i>.',
-'copyrightpage'        => '{{ns:project}}:Maga derecho del autor',
-'currentevents'        => 'Maga sucesos actual',
-'currentevents-url'    => 'Project:Maga sucesos actual',
-'disclaimers'          => 'Maga aviso legal',
-'disclaimerpage'       => 'Project:El maga limitacion general de maga responsabilidad',
-'mainpage'             => 'El Primero Pagina',
+'aboutsite' => 'Acerca de {{SITENAME}}',
+'aboutpage' => 'Project:Acerca de',
+'copyright' => 'Obtenible el maga texto de este Wikipedia bajo los terminos y maga condicion del <i>$1</i>.',
+'copyrightpage' => '{{ns:project}}:Maga derecho del autor',
+'currentevents' => 'Maga sucesos actual',
+'currentevents-url' => 'Project:Maga sucesos actual',
+'disclaimers' => 'Maga aviso legal',
+'disclaimerpage' => 'Project:El maga limitacion general de maga responsabilidad',
+'mainpage' => 'El Primero Pagina',
 'mainpage-description' => 'El Primero Pagina',
-'portal'               => 'Portal del Comunidad',
-'privacy'              => 'Policia na proteccion del maga informacion',
-'privacypage'          => 'Project:Policia na proteccion del maga informacion',
+'portal' => 'Portal del Comunidad',
+'privacy' => 'Policia na proteccion del maga informacion',
+'privacypage' => 'Project:Policia na proteccion del maga informacion',
 
-'retrievedfrom'   => 'Obtenido de "$1"',
+'retrievedfrom' => 'Obtenido de "$1"',
 'editsectionhint' => 'Revisa el seccion: $1',
-'site-rss-feed'   => '$1 Informacion de RSS',
-'site-atom-feed'  => '$1 Informacion de Atom',
-'red-link-title'  => '$1 (jendeh ta existi el pagina)',
+'site-rss-feed' => '$1 Informacion de RSS',
+'site-atom-feed' => '$1 Informacion de Atom',
+'red-link-title' => '$1 (jendeh ta existi el pagina)',
 
 # Login and logout pages
 'acct_creation_throttle_hit' => 'Ya crea ya {{PLURAL:$1|un cuenta registro|$1 maga cuenta registro}} el maga visita de este wiki usando el de uste direccion de IP  en el ultimo dia. Entonces, ya sobra ya na maximo numero que ta puede permiti el sistema para crea cuenta. Por causa de este razon, no puede mas crea nuevo cuenta usando el de uste direccion de IP este maga tiempo.',
-'accountcreated'             => 'El cuenta registro del usuario es creando',
-'accountcreatedtext'         => 'Creao ya el cuenta registro por usuario $1.',
+'accountcreated' => 'El cuenta registro del usuario es creando',
+'accountcreatedtext' => 'Creao ya el cuenta registro por usuario $1.',
 
 # Edit pages
 'blockedtitle' => 'El usuario es prohibido o bloqueado',
 'accmailtitle' => 'Enviao ya el contraseña.',
-'accmailtext'  => "El contraseña que el sistema ya escogi automatico por usuario [[User talk:$1|$1]] enviado ya a $2.
+'accmailtext' => "El contraseña que el sistema ya escogi automatico por usuario [[User talk:$1|$1]] enviado ya a $2.
 
 El contraseña de este nuevo cuenta puede cambia na pagina ''[[Special:ChangePassword|cambia el contraseña]]'' despues el autenticacion.",
 
 # Search results
-'search-result-size'        => '$1 ({{PLURAL:$2|1 palabra|$2 maga palabra}})',
-'search-mwsuggest-enabled'  => 'con sugestiones',
-'search-mwsuggest-disabled' => 'sin sugestion',
+'search-result-size' => '$1 ({{PLURAL:$2|1 palabra|$2 maga palabra}})',
 
 # Preferences page
 'changepassword' => 'Cambia con el contraseña',
@@ -107,7 +105,7 @@ El contraseña de este nuevo cuenta puede cambia na pagina ''[[Special:ChangePas
 'allarticles' => 'Todo maga articulo',
 
 # Special:Categories
-'categories'         => 'Maga categoria',
+'categories' => 'Maga categoria',
 'categoriespagetext' => 'El maga siguiente {{PLURAL:$1|categoria tiene|categoria tiene}} maga pagina o medio de comunicacion.
 
 El maga [[Special:UnusedCategories|categoria sin usando]] jendeh ta abuya aqui.
@@ -127,12 +125,12 @@ Por favor mira tambien el maga [[Special:WantedCategories|categoria requeridas]]
 'contributions' => 'Maga contribuciones del usuario',
 
 # Block/unblock
-'blockip'           => 'Usuario prohibido',
+'blockip' => 'Usuario prohibido',
 'blockipsuccesssub' => 'El prohibicion es confirmado con exito',
-'contribslink'      => 'Maga contribuciones',
+'contribslink' => 'Maga contribuciones',
 
 # Tooltip help for the actions
-'tooltip-search'     => 'Busca na {{SITENAME}}',
+'tooltip-search' => 'Busca na {{SITENAME}}',
 'tooltip-n-mainpage' => 'Visita na Primero Pagina',
 
 );
index 4f15b3f..d47e804 100644 (file)
@@ -215,9 +215,6 @@ For translations, please consider using [//translatewiki.net/wiki/Main_Page?setl
 # Login and logout pages
 'logouttext' => "'''Nṳ̄ hiêng-câi láuk-chók lāu.'''
 Nṳ̄ â̤-sāi sāi mò̤-miàng huŏng-sék gié-sṳ̆k găk {{SITENAME}} gè̤-dēng láuk, nṳ̄ iâ â̤-sāi sāi dè̤ng-iông gì dióng-hô̤ hĕ̤k-ciā bĕk-nó̤h bĭk dióng-hô̤ gái láuk-diē. Diŏh gé lā̤, nṳ̄ báuk-lāng-ké ká̤-chṳ̄ (''browser cache'') nâ mò̤ tĕ̤ng táh gó̤ uâ, ô gì hiĕk giăng â̤ hiēng-sê nṳ̄ gó muôi láuk-chók.",
-'welcomecreation' => '== Huăng-ngìng guŏng-lìng, $1! ==
-
-Nṳ̄ gì dióng-hô̤ ī-gĭng kŭi hō̤ lāu. Dāng nṳ̄ â̤-sāi siŭ-gāi nṳ̄ găk {{SITENAME}} gì siék-diâng.',
 'yourname' => 'Ê̤ṳng-hô-miàng',
 'yourpassword' => 'Mĭk-mā',
 'yourpasswordagain' => 'Dṳ̀ng-sĭng páh diē mĭk-mā',
@@ -605,8 +602,6 @@ Iŏk-sṳ̄ nṳ̄ buóh-siōng téng nṳ̄ gáng-sê-dăng gà̤-dēng dṳ̀
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Gáng-sê...',
 
-'enotif_newpagetext' => 'Cuòi sê sĭng hiĕk.',
-
 # Delete
 'deletepage' => 'Chēng hiĕk',
 'confirm' => 'Káuk-nêng',
index 17545b0..4b2eebe 100644 (file)
@@ -68,7 +68,6 @@ $magicWords = array(
        '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' ),
@@ -165,7 +164,7 @@ $magicWords = array(
        'revisionmonth'             => array( '1', 'БЕТТА_БАШХО', 'МЕСЯЦ_ВЕРСИИ', 'REVISIONMONTH' ),
        'revisionyear'              => array( '1', 'ШО_БАШХО', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
        'revisiontimestamp'         => array( '1', 'КЪАСТАМ_ХЕНА_БАШХО', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'              => array( '1', 'ДЕКЪАШХОН_БАШХО', 'ВЕРСИЯ_УЧАСНИКА', 'REVISIONUSER' ),
+       'revisionuser'              => array( '1', 'ДЕКЪАШХОН_БАШХО', 'ВЕРСИЯ_УЧАСНИКА', 'ВЕРСИЯ_УЧАСТНИКА', 'REVISIONUSER' ),
        'plural'                    => array( '0', 'ДУКХАЛЛИН_ТЕРАХЬ:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'МАЙАРРА_МЕТТИГ:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'МАЙАРРА_МЕТТИГ_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
@@ -355,7 +354,6 @@ $messages = array(
 'qbbrowse' => 'Хьажар',
 'qbedit' => 'Нисйé',
 'qbpageoptions' => 'Агlо нисйар',
-'qbpageinfo' => 'Агlонах болу бовзам',
 'qbmyoptions' => 'Хьан нисдарш',
 'qbspecialpages' => 'Леррина агlонаш',
 'faq' => 'СиХХ',
@@ -756,8 +754,6 @@ $1',
 'search-interwiki-caption' => 'Гергара кхолламаш',
 'search-interwiki-default' => '$1 хилам.:',
 'search-interwiki-more' => '(кхин)',
-'search-mwsuggest-enabled' => 'хьехаршца',
-'search-mwsuggest-disabled' => 'хьехар доцуш',
 'searcheverything-enable' => 'Массо цIера анахь лахар',
 'searchrelated' => 'хlоттаделларг',
 'searchall' => 'массо',
@@ -1097,8 +1093,6 @@ PICT # тайп тайпан
 'watching' => 'Тергаме мlогаман юкъаяккха…',
 'unwatching' => 'Тергаме мlогаман чура дlайаккха…',
 
-'enotif_newpagetext' => 'Хlара керла агlо ю.',
-
 # Delete
 'deletepage' => 'Дlайайá агlо',
 'confirm' => 'Къобалде',
index b7d1060..b894232 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Abastillas
  * @author Dosmiin Barsbold
+ * @author Harvzsf
  * @author Jordz
  * @author Mirzali
  * @author Palang hernan
@@ -207,7 +208,6 @@ $messages = array(
 'qbbrowse' => 'Browse',
 'qbedit' => 'Usba',
 'qbpageoptions' => 'Kini nga panid',
-'qbpageinfo' => 'Konteksto',
 'qbmyoptions' => 'Akong mga panid',
 'qbspecialpages' => 'Mga espesyal nga panid',
 'faq' => 'FAQ',
@@ -442,10 +442,7 @@ Ang rason nga gihatag mao ang "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Nakabiya ka na.'''
 
-Mahimo kang magpadayon sa paggamit sa {{SITENAME}} bisan wala ka magpaila o puyde usab nga [[Special:UserLogin|mag-log in ka'g usab]] o isip laing gumagamit. Palihog hinumdomi nga may ubang mga panid nga magpakita sama nga ikaw naka-log in pa; kini tungod kay wala pa nimo malimpiyohi ang cache sa imong brawser.",
-'welcomecreation' => '== Maayong pag-abot, $1! ==
-Nahimo na ang imong akawnt.
-Ayaw kalimot sa pag-usab sa imong [[Special:Preferences|{{SITENAME}} mga preperensiya]].',
+Mahimo kang magpadayon sa paggamit sa {{SITENAME}} bisan wala ka magpaila o puyde usab nga <span class='plainlinks'>[$1 mag-log in ka'g usab]</span> o isip laing gumagamit. Palihog hinumdomi nga may ubang mga panid nga magpakita sama nga ikaw naka-log in pa; kini tungod kay wala pa nimo malimpiyohi ang cache sa imong brawser.",
 'yourname' => 'Ngalan sa tiggamit:',
 'yourpassword' => 'Pasword:',
 'yourpasswordagain' => 'Itayp og usab ang pasword:',
@@ -723,8 +720,6 @@ Hinumdomi nga ang paggamit sa mga sumpay sa nabigasyon mo-reset sa column.',
 'search-interwiki-caption' => 'Mga kaubang proyekto',
 'search-interwiki-default' => '$1 ka mga resulta:',
 'search-interwiki-more' => '(dugang pa)',
-'search-mwsuggest-enabled' => 'may mga sugyot',
-'search-mwsuggest-disabled' => 'walay mga sugyot',
 'showingresultsheader' => "{{PLURAL:$5|Resulta '''$1''' sa '''$3'''|Mga resulta '''$1 - $2''' of '''$3'''}} sa '''$4'''",
 'nonefound' => "'''Bantayi''': Dili tanang ngalang espasyo (namespaces) ang gipangita by default.
 Sulayi'g prefix ang imong gipangita gamit ang ''all:'' alang mangita sa tanang sulod (apil ang mga panid sa hisgot, plantilya, ubp), o gamita ang gikinahanglang ngalang espasyo isip prefix.",
@@ -1076,7 +1071,7 @@ Puyde nimo usbon ang level sa proteksyon ning panid, pero dili kini makaapekto s
 'linkshere' => "Ang mosunod nga mga panid misumpay sa '''[[:$1]]''':",
 'isredirect' => 'panid sa redirekta',
 'istemplate' => 'transklusyon',
-'isimage' => 'sumpay nga imahen',
+'isimage' => 'sumpay sa payl',
 'whatlinkshere-prev' => '{{PLURAL:$1|miaging|miaging $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|sunod|sunod $1}}',
 'whatlinkshere-links' => '← mga sumpay',
index 99d4116..d461fa8 100644 (file)
@@ -146,7 +146,6 @@ $messages = array(
 'qbbrowse' => 'Atan',
 'qbedit' => 'Tulaika',
 'qbpageoptions' => 'Este na pahina',
-'qbpageinfo' => 'Kontekstu',
 'qbmyoptions' => 'Påhina-hu siha',
 'qbspecialpages' => 'Manespesiat na påhina',
 
@@ -304,9 +303,6 @@ Ha nå'i i rason ''$2''.",
 
 Siña hao kumontinua manu'usa {{SITENAME}} sin nå'an, pat siña uma'log ta'lo pat siña un usa otra na nå'an muna'sesetbi.
 Fanapunta na pålu na påhina siha para u na'annok na ma'log-in hao, asta ki un funas iyo-mu browser cache.",
-'welcomecreation' => "== Bienbenido, $1! ==
-Mafa'tinas i kuenta-mu.
-Munga mamalefa tumulaika ga'ña-mu {{SITENAME}}.",
 'yourname' => "Nå'an ni muna'setbi:",
 'yourpassword' => 'Password:',
 'yourpasswordagain' => "Taip ta'lo i password:",
@@ -644,8 +640,6 @@ Fanapunta na para u na'nuebu i kolumna anggen un usa i inachetton nabegasion.",
 'search-interwiki-caption' => 'Proyektu siha ni mamarehu',
 'search-interwiki-default' => 'Humuyongña gi $1:',
 'search-interwiki-more' => '(mas)',
-'search-mwsuggest-enabled' => 'yan abisa',
-'search-mwsuggest-disabled' => "tåya' abisa",
 'search-relatedarticle' => 'Umachetton',
 'mwsuggest-disable' => "Na'påra i abisan AJAX",
 'searchrelated' => 'umachetton',
index 7d6c525..9867ae2 100644 (file)
@@ -9,53 +9,77 @@
  *
  * @author Etse (on chr.wikipedia.org)
  * @author Gmaxwell (on chr.wikipedia.org)
+ * @author Malafaya
  * @author Maximillion Pegasus
  * @author Srtxg (on chr.wikipedia.org)
  */
 
 $messages = array(
 # Dates
-'january'  => 'UᏃᎸᏔᏂ',
-'february' => 'KᎠᎦᎵ',
-'march'    => 'ᎠᏄᏱ',
-'april'    => 'ᏥᎶᏂ',
-'june'     => 'DᎡᎭᎷᏱ',
-
-'about'      => 'ᎬᏩᏚᏫᏛ',
-'article'    => 'ᎤᏓᏡᎬ',
+'january' => 'ᏚᏃᎸᏔᏂ',
+'february' => 'ᎧᎦᎵ',
+'march' => 'ᎠᏄᏱ',
+'april' => 'ᎧᏩᏂ',
+'may_long' => 'ᎠᎾᎠᎬᏘ',
+'june' => 'ᏕᎭᎷᏱ',
+'july' => 'ᎫᏰᏉᏂ',
+'august' => 'ᎦᎶᏂᎢ',
+'september' => 'ᏚᎵᎢᏍᏗ',
+'october' => 'ᏚᏂᏅᏗ',
+'november' => 'ᏄᏓᏕᏆ',
+'december' => 'ᎥᏍᎩᎦ',
+'jan' => 'ᏚᏃᎸ',
+'feb' => 'ᎧᎦᎵ',
+'mar' => 'ᎠᏄᏱ',
+'apr' => 'ᎧᏩᏂ',
+'may' => 'ᎠᎾᎠ',
+'jun' => 'ᏕᎭᎷ',
+'jul' => 'ᎫᏰᏉ',
+'aug' => 'ᎦᎶᏂ',
+'sep' => 'ᏚᎵᎢ',
+'oct' => 'ᏚᏂᏅ',
+'nov' => 'ᏄᏓᏕ',
+'dec' => 'ᎥᏍᎩ',
+
+'about' => 'ᎬᏩᏚᏫᏛ',
+'article' => 'ᎤᏓᏡᎬ',
 'navigation' => 'ᎠᏂᎩᏍᏗ ᏥᏳ',
 
 # Cologne Blue skin
-'qbpageinfo'     => 'ᎦᎷᎯᏍᏗ',
+'qbpageinfo' => 'ᎦᎷᎯᏍᏗ',
 'qbspecialpages' => 'ᎤᏤᎵᏛ',
 
-'help'             => 'ᎠᎵᏍᏕᎸᏗ',
-'search'           => 'ᎠᏯᏍᏗ',
-'go'               => 'ᎮᎦ',
-'history'          => 'ᏆᏥ ᎧᏃᎮᏍᎩ',
-'history_short'    => 'ᎧᏃᎮᏍᎩ',
+'help' => 'ᎠᎵᏍᏕᎸᏗ',
+'search' => 'ᎠᏯᏍᏗ',
+'searchbutton' => 'ᎠᏯᏍᏗ',
+'go' => 'ᎮᎦ',
+'history' => 'ᏆᏥ ᎧᏃᎮᏍᎩ',
+'history_short' => 'ᎧᏃᎮᏍᎩ',
 'printableversion' => 'ᎦᎴᏯᏛ ᏅᎬᎪᏔᏅᎯ',
-'permalink'        => 'ᏂᎪᎯᎸ ᏕᎬᏔᏛ',
+'permalink' => 'ᏂᎪᎯᎸ ᏕᎬᏔᏛ',
 'talkpagelinktext' => 'ᎧᏃᎮᎸᏗ',
-'talk'             => 'ᎧᏃᎮᎸᏗ',
-'toolbox'          => 'ᎪᎱᏍᏗ ᎬᏔᏂᏓᏍᏗ ᎧᏁᏌᎢ',
-'otherlanguages'   => 'ᎭᏫᎾᏗᏢ ᏐᎢ ᏗᎦᏬᏂᎯᏍᏗ',
-'jumptosearch'     => 'ᎡᏗt',
+'talk' => 'ᎧᏃᎮᎸᏗ',
+'toolbox' => 'ᎪᎱᏍᏗ ᎬᏔᏂᏓᏍᏗ ᎧᏁᏌᎢ',
+'otherlanguages' => 'ᎭᏫᎾᏗᏢ ᏐᎢ ᏗᎦᏬᏂᎯᏍᏗ',
+'jumptosearch' => 'ᎡᏗt',
 
 # 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).
-'aboutpage'            => 'Project:ᎬᏩᏚᏫᏛ',
-'currentevents'        => 'ᏗᏤᎢ',
-'mainpage'             => 'ᎤᎵᎮᎵᏍᏗ',
+'aboutpage' => 'Project:ᎬᏩᏚᏫᏛ',
+'currentevents' => 'ᏗᏤᎢ',
+'mainpage' => 'ᎤᎵᎮᎵᏍᏗ',
 'mainpage-description' => 'ᎤᎵᎮᎵᏍᏗ',
-'portal'               => 'ᎾᎥ ᏄᎾᏓᎸ ᎠᏍᏚᎢᏍᏗ',
+'portal' => 'ᎾᎥ ᏄᎾᏓᎸ ᎠᏍᏚᎢᏍᏗ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'ᎤᏓᏡᎬ',
+'nstab-main' => 'ᎤᏓᏡᎬ',
 'nstab-category' => 'ᏗᎦᎪᏗ',
 
 # General errors
 'viewsource' => 'DᎢᎧᏃᏗᎢ DᎢᏓᎴᎲᏍᎬ',
 
+# Revision deletion
+'revdelete-radio-set' => 'ᎥᎥ',
+
 # Diffs
 'editundo' => 'IᎬᎾᏕᏍᏗ',
 
@@ -69,8 +93,8 @@ $messages = array(
 'recentchanges' => 'ᎾᏞᎬ ᏗᎦᏁᏟᏴᏍᏗ',
 
 # Recent changes linked
-'recentchangeslinked'         => 'ᎪᎱᏍᏗ ᎠᎾᏓᏛᏂ ᏗᎦᏁᏟᏴᏍᏗ',
-'recentchangeslinked-feed'    => 'ᎪᎱᏍᏗ ᎠᎾᏓᏛᏂ ᏗᎦᏁᏟᏴᏍᏗ',
+'recentchangeslinked' => 'ᎪᎱᏍᏗ ᎠᎾᏓᏛᏂ ᏗᎦᏁᏟᏴᏍᏗ',
+'recentchangeslinked-feed' => 'ᎪᎱᏍᏗ ᎠᎾᏓᏛᏂ ᏗᎦᏁᏟᏴᏍᏗ',
 'recentchangeslinked-toolbox' => 'ᎪᎱᏍᏗ ᎠᎾᏓᏛᏂ ᏗᎦᏁᏟᏴᏍᏗ',
 
 # Upload
index f2e1eaf..0e83ce7 100644 (file)
@@ -24,21 +24,6 @@ $fallback8bitEncoding = 'windows-1256';
 
 $rtl = true;
 
-$digitTransformTable = array(
-       '0' => '٠', # &#x0660;
-       '1' => '١', # &#x0661;
-       '2' => '٢', # &#x0662;
-       '3' => '٣', # &#x0663;
-       '4' => '٤', # &#x0664;
-       '5' => '٥', # &#x0665;
-       '6' => '٦', # &#x0666;
-       '7' => '٧', # &#x0667;
-       '8' => '٨', # &#x0668;
-       '9' => '٩', # &#x0669;
-       '.' => '٫', # &#x066b; wrong table ?
-       ',' => '٬', # &#x066c;
-);
-
 $namespaceNames = array(
        NS_MEDIA            => 'میدیا',
        NS_SPECIAL          => 'تایبەت',
@@ -145,6 +130,21 @@ $magicWords = array(
        'img_border'                => array( '1', 'سنوور', 'border' ),
 );
 
+$digitTransformTable = array(
+       '0' => '٠', # &#x0660;
+       '1' => '١', # &#x0661;
+       '2' => '٢', # &#x0662;
+       '3' => '٣', # &#x0663;
+       '4' => '٤', # &#x0664;
+       '5' => '٥', # &#x0665;
+       '6' => '٦', # &#x0666;
+       '7' => '٧', # &#x0667;
+       '8' => '٨', # &#x0668;
+       '9' => '٩', # &#x0669;
+       '.' => '٫', # &#x066b; wrong table ?
+       ',' => '٬', # &#x066c;
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'ھێڵ ھێنان بەژێر بەستەرەکان:',
@@ -195,7 +195,7 @@ $messages = array(
 
 'underline-always' => 'ھەمیشە',
 'underline-never' => 'ھەرگیز',
-'underline-default' => 'دیفاڵتی وێبگەڕەکە',
+'underline-default' => 'پێستە یان دیفاڵتی وێبگەڕەکە',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'شێوازی جۆرەپیتی بەشی دەستکاری:',
@@ -281,8 +281,8 @@ $messages = array(
 'newwindow' => '(لە پەڕەیەکی نوێ دەکرێتەوە)',
 'cancel' => 'ھەڵیوەشێنەوە',
 'moredotdotdot' => 'زیاتر',
-'mypage' => 'په‌ڕه‌ی من',
-'mytalk' => 'لێدوانەکەم',
+'mypage' => 'پەڕه‌',
+'mytalk' => 'لێدوان',
 'anontalk' => 'وتووێژ بۆ ئەم ئای‌پی یە',
 'navigation' => 'ڕێدۆزی',
 'and' => '&#32;و',
@@ -292,7 +292,6 @@ $messages = array(
 'qbbrowse' => 'بگه‌ڕێ',
 'qbedit' => 'دەستکاری',
 'qbpageoptions' => 'ئەم پەڕەیە',
-'qbpageinfo' => 'زانیاریی په‌ڕه‌',
 'qbmyoptions' => 'پەڕەکانم',
 'qbspecialpages' => 'پەڕە تایبەتەکان',
 'faq' => 'پرسیار و وەڵام (FAQ)',
@@ -305,16 +304,17 @@ $messages = array(
 'vector-action-protect' => 'بیپارێزە',
 'vector-action-undelete' => 'سڕینەوە بگەڕێنەوە',
 'vector-action-unprotect' => 'پاراستنی بگۆڕە',
-'vector-simplesearch-preference' => 'Ú\95Û\8eÚ¯Û\95 Ø¨Ø¯Û\95 Ø¨Û\95 Ù¾Û\8eØ´Ù\86Û\8cارÛ\95کاÙ\86Û\8c Ú¯Û\95Ú\95اÙ\86Û\8c Ù¾Û\8eØ´Ú©Û\95Ù\88تÙ\88Ù\88 (تەنیا بۆ پێستەی ڤێکتۆر)',
+'vector-simplesearch-preference' => 'Ú¯Û\95Ú\95اÙ\86Û\8c Ø³Ø§Ú©Ø§Ø± Ú\86اÙ\84اک Ø¨Ú©Û\95 (تەنیا بۆ پێستەی ڤێکتۆر)',
 'vector-view-create' => 'دروستکردن',
 'vector-view-edit' => 'دەستکاریی بکە',
 'vector-view-history' => 'مێژووەکەی ببینە',
 'vector-view-view' => 'بیخوێنەوە',
 'vector-view-viewsource' => 'سەرچاوەکەی ببینە',
-'actions' => 'کردارەکان',
+'actions' => 'کردەوەکان',
 'namespaces' => 'شوێنناوەکان',
 'variants' => 'شێوەزارەکان',
 
+'navigation-heading' => 'مێنۆی ڕێدۆزی',
 'errorpagetitle' => 'ھەڵە',
 'returnto' => 'بگەڕێوە بۆ $1.',
 'tagline' => 'لە {{SITENAME}}',
@@ -413,7 +413,7 @@ $1',
 'youhavenewmessages' => '$1ت ھەیە ($2).',
 'newmessageslink' => 'پەیامی نوێ',
 'newmessagesdifflink' => 'دوایین گۆڕانکاری',
-'youhavenewmessagesfromusers' => '$1ت لە {{PLURAL:$3|بەکارھێنەرێکی تر| $3 بەکارھێنەر}} ھەیە ( $2 ).',
+'youhavenewmessagesfromusers' => 'لە {{PLURAL:$3|بەکارھێنەرێک|$3 بەکارھێنەران}} $1ت ھەیە ($2).',
 'youhavenewmessagesmanyusers' => '$1ت  لە ژمارەیەک بەکارھێنەر ھەیە ( $2 ).',
 'newmessageslinkplural' => '{{PLURAL:$1|پەیامێکی نوێ|پەیامی نوێ}}',
 'newmessagesdifflinkplural' => 'دوایین {{PLURAL:$1|گۆڕانکاری|گۆڕانکارییەکان}}',
@@ -469,10 +469,10 @@ $1',
 'databaseerror' => 'ھەڵەی داتابەیس',
 '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"
@@ -508,6 +508,8 @@ $1',
 'cannotdelete' => 'نەتوانرا پەڕە یان پەڕگەی «$1» بسڕدرێتەوە.
 لەوانەیە پێشتر لە لایەن کەسێکی ترەوە سڕابێتەوە.',
 'cannotdelete-title' => 'ناکرێ پەڕەی «$1» بسڕدرێتەوە',
+'delete-hook-aborted' => 'سڕینەوە لە لایەن قولاپەوە ھەڵوەشێنرایەوە.
+ھۆکارەکەی لەبەر دەست نییە.',
 'badtitle' => 'ناونیشانی خراپ',
 'badtitletext' => 'سەرناوی پەڕەی داواکراو بەتاڵە، واڵایە یان سەرناوێکی نێوان-زمانی یان نێوانی-ویکییە کە بە شێوەیەکی ھەڵە بەستەری بۆ دراوە.
 ڕەنگە یەک یان چەند کاراکتەری تێدا بێت کە ناکرێت لە سەرناوەکاندا بەکار بھێنرێت.',
@@ -525,10 +527,12 @@ $1',
 تکایە پاش چەند خولەک دووبارە تاقی بکەوە.',
 'protectedpagetext' => 'بە مەبەستی پەرگری لە دەستکاریکردن ئەم پەڕە پارێزراوە.',
 'viewsourcetext' => 'دەتوانی سەرچاوەی ئەم پەڕە ببینی و کۆپیی بکەی:',
-'protectedinterface' => 'ئەم پەڕە دەقی ڕوواڵەتی نەرمامێرەکە نیشان دەدات و بۆ پەرگری لە خراپکاریی پارێزراوە.',
-'editinginterface' => "'''ئاگاداری:''' تۆ خەریکی دەستکاریی پەڕەیەکی کە بۆ دابینکردنی دەقی ڕوواڵەتی نەرمامێر بە کار دەھێنرێت.
-گۆڕانکاری لە ئەم پەڕە کاریگەر دەبێت لە سەر ڕواڵەتی پەڕەکانی بەکارھێنەرانی دیکە.
-بۆ وەرگێڕان تکایە [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، پرۆژەی ناوچەیی‌کردنی میدیاویکی بەکار بێنە.",
+'viewyourtext' => "دەتوانی ژێدەری '''دەستکارییەکەت''' لەم پەڕەیەدا ببینی و کۆپی بکەی:",
+'protectedinterface' => 'ئەم پەڕەیە دەقی ڕواڵەتی نەرمامێری ئەم ویکییە نیشان دەدات و بۆ بەرگری لە خراپکاری پارێزراوە.
+بۆ زیادکردن یان گۆڕینی وەرگێڕانەکان بۆ ھەموو ویکییەکان، تکایە لە [//translatewiki.net/ translatewiki.net]، پرۆژەی ناوچەیی کردنی میدیاویکی کەڵک وەربگرە.',
+'editinginterface' => "'''ئاگاداری:''' تۆ خەریکی دەستکاریی پەڕەیەکی کە بۆ دابینکردنی دەقی ڕواڵەتی نەرمامێر بە کار دەھێنرێت.
+گۆڕانکاریی  ئەم پەڕەیە کاریگەر دەبێت لە سەر ڕواڵەتی پەڕەکانی بەکارھێنەرانی تر لەم ویکییەدا.
+بۆ زیادکردن یان گۆڕینی وەرگێڕانەکان بۆ ھەموو ویکییەکان، تکایە لە [//translatewiki.net/ translatewiki.net]، پرۆژەی ناوچەیی کردنی میدیاویکی کەڵک وەربگرە.",
 'sqlhidden' => '(داواکاریی SQL شاراوەیە)',
 'cascadeprotected' => 'ئەم لاپەڕە پارێزراوە لە دەستکاریی، چونکا خراوەتە سەر ڕیزی ئەم {{PLURAL:$1|لاپەڕانه‌، کە}} که‌ به‌ هه‌ڵکردنی بژارده‌ی داڕژان هه‌ڵکراوه‌:
 $2',
@@ -546,15 +550,13 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ئێستا تۆ لە ھەژمارەکەت ھاتوویتە دەرەوە.'''
 
-دەتوانی بە شێوەی بێناو درێژە بدەی بە بەرکارھێنانی {{SITENAME}}، یان دەتوانی [[Special:UserLogin|دیسانەوە بچیتەوە ژوورەوە]] ھەر بەو ناوە یان بە ناوی بەکارھێنەرییەکی جیاوازەوە.
+دەتوانی بە شێوەی بێناو درێژە بدەی بە بەرکارھێنانی {{SITENAME}}، یان دەتوانی <span class='plainlinks'>[$1 دیسانەوە بچیتەوە ژوورەوە]</span> ھەر بەو ناوە یان بە ناوی بەکارھێنەرییەکی جیاوازەوە.
 ئاگادار بە کە ھەتا کاتێک کە کەشی وێبگەڕەکەت دەسڕیتەوە، سەرەڕای چوونەدەرەوەی تۆ ھەندێک لە پەڕەکان ھەر بە شێوەیەک نیشان دەدرێن کە گوایە تۆ ھێشتا لە ژوورەوەیت.",
-'welcomecreation' => '== بەخێربێی، $1! ==
-ھەژمارەکەت دروست کرا.
-لە بیرت نەچێت کە گۆڕانکاری لە [[Special:Preferences|ھەڵبژاردەکانی {{SITENAME}}]]ی تایبەتی خۆت بدەی.',
+'welcomeuser' => 'بەخێربێیت، $1!',
 'yourname' => 'ناوی بەکارھێنەری:',
 'yourpassword' => 'تێپەڕوشە:',
 'yourpasswordagain' => 'دیسان تێپەڕوشەکە بنووسەوە:',
-'remembermypassword' => 'چوونە ژوورەوەم لەسەر ئەم کۆمپیوتەرە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ە)',
+'remembermypassword' => 'چوونە ژوورەوەم لەسەر ئەم کۆمپیوتەرە پاشەکەوت بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕۆژ}}ە)',
 'yourdomainname' => 'ناوی دۆمه‌ینی خۆت',
 'password-change-forbidden' => 'ناتوانیت تێپەڕوشەکانت لەم ویکییەدا بگۆڕیت.',
 'externaldberror' => 'یان هەڵەی ڕێگەپێدانی بنکەدراو هەیە یان ڕێگات پێ نادرێت بۆ نوێ کردنی هەژماری دەرەکیت.',
@@ -607,6 +609,7 @@ $2',
 
 ئەگەر کەسێکی تر ئەم داوایەی کردووە یان تێپەڕوشەکەت هاتووەتەوە بیرت و ئیتر پێویستت بە گۆڕانی نییە، دەتوانی گوێ بەم پەیامە نەدەیت و لە تێپەڕوشە کۆنەکەت کەڵک وەربگری.',
 'noemail' => 'ھیچ ئەدرەسێکی ئیمەیل تۆمار نەکراوە بۆ بەکارھێنەر « $1 ».',
+'noemailcreate' => 'دەبێ ناونیشانێکی دروستی ئیمەیل بنووسی',
 'passwordsent' => 'تێپەڕوشەیەکی نوێ ناردرا بۆ ئەدرەسی ئیمەیلی تۆمارکراوی «$1».
 تکایە دوای وەرگرتنی دیسان بچۆ ژوورەوە.',
 'blocked-mailpassword' => 'ئادرەسی ئای‌پی تۆ بۆ دەستکاری کردن بەستراوه بۆیە بۆ بەرگری لە بەکارهێنانی نابەجێ ئەنجامی گەڕانەوەی تێپەڕوشە ڕیگە نەدراوە.',
@@ -624,8 +627,9 @@ $2',
 'emailconfirmlink' => 'ئیمەیلەکەت پشت‌ڕاست بکەرەوە',
 'invalidemailaddress' => 'ئەو ئەدرەسی ئی‌مێڵە لەبەر ئەوەی بە شێوازێکی نەناسراوە، پەسند نەکرا.
 تکایە ئەدرەسێک بە شێوازی ناسراو بنووسە یان ئەو خانەیە بەتاڵ بهێڵەوە.',
+'emaildisabled' => 'ئەم ماڵپەڕە ناتوانێ ئیمەیل بنێرێ.',
 'accountcreated' => 'ھەژمار دروست کرا',
-'accountcreatedtext' => 'هەژماری بەکارهێنەر بۆ $1 درووست‌کرا.',
+'accountcreatedtext' => 'هەژماری بەکارهێنەری $1 دروست کراوە.',
 'createaccount-title' => 'درووست‌کردنی هەژمارە بۆ {{SITENAME}}',
 'createaccount-text' => 'کەسێک هەژمارەیەکی بۆ ئی‌مێڵ ئەدرەسەکی تۆ لەسەر {{SITENAME}} ($4) بەناوی "$2"، بە وشەی نهێنی "$3".
 ئێستا دەبێ بڕۆیتە ژوورەوە و وشەی نهێنی بگۆڕیت.
@@ -787,13 +791,15 @@ $2
 لەبەر ئەوە مەجبوورین ئای‌پی ئەدرەسەکی ژمارەیی بۆ ناساندنی بەکار بێنین.
 ئای‌پی ئەدرەسی وا لەوانەیه لە لایەن چەندین بەکارهێنەروە بەکاربێت.
 ئەگەر تۆ بەکارهێنەرێکی نەناسراوی و هەست ئەکەی ئەم لێدوانە پەیوەندی بە تۆوە نیە تکایە [[Special:UserLogin/signup|ھەژمارێکی نوێ دروست بکە]] یان [[Special:UserLogin|بچۆ ژوورەوە]] لەبەر ئەوەی لەداهاتوودا دەگەڵ بەکارهێنەرانی‌ نەناسراوی دی تێکەڵ نەکرێیت. ''",
-'noarticletext' => 'ھەنووکە ھیچ دەقێک لەم پەڕەدا نییە.
-دەتوانی بۆ ئەم ناوە لە [[Special:Search/{{PAGENAME}}|پەڕەکانی تردا بگەڕێی]]، <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگەکاندا بگەڕێی]، یان [{{fullurl:{{FULLPAGENAME}}|action=edit}} ئەم پەڕە دەستکاری بکەیت]</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>.',
+دەتوانی لە پەڕەکانی تردا [[Special:Search/{{PAGENAME}}|بۆ ئەم ناوە بگەڕێی]]، یان <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لە لۆگە پەیوەندیدارەکاندا بگەڕێی]</span>، بەڵام ناتوانی ئەم پەڕەیە دروست بکەی.',
 'userpage-userdoesnotexist' => 'هەژماری بەکارهێنەری "<nowiki>$1</nowiki>" تۆمار نەکراوە.<br />
 گەر دەتەوێ ئەم لاپەڕە درووست‌کەی یان دەستکاری بکەی تکایە تاقی‌بکەوە .',
 'userpage-userdoesnotexist-view' => 'ھەژماری بەکارھێنەریی «$1» تۆمار نەکراوە.',
+'blocked-notice-logextract' => 'ھەنووکە ئەم بەکارھێنەرە بەربەست کراوە.
+دوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:',
 'clearyourcache' => "تێبینی:''' لە دوای پاشەکەوت کردن، لەوانەیە  بۆ بینینی گۆڕانکارییەکان پێویست بێ cacheی وێبگەڕەکەت پاکبکەیتەوە.
 * '''Firefox / Safari:''' دوگمەی ''Shift'' بگرە کاتێک لەسەر ''Reload''دا کرتە دەکەی، یان ھەرکام لە ''Ctrl-F5'' یان ''Ctrl-R'' لێبدە (''⌘-R'' لەسەر Mac دا)
 * '''Google Chrome:''' دوگمەکانی ''Ctrl-Shift-R'' لێبدە  (''⌘-Shift-R'' لەسەر Mac دا)
@@ -815,7 +821,7 @@ $2
 'note' => "'''تێبینی:'''",
 'previewnote' => "'''لە بیرت نەچێت ئەمە تەنیا پێشبینینە.'''
 گۆڕانکارییەکانت ھێشتا پاشەکەوت نەکراون!",
-'continue-editing' => 'بەردەوام بە لەدەستکاریکردن',
+'continue-editing' => 'چوونە سەر بەشی دەستکاریکردن',
 'previewconflict' => 'ئەم پێشبینینە بە تۆ نیشان ئەدات ئەو دەقەی لە شوێنی دەستکاری سەرەوە داتناوە چۆن بەرچاو ئەکەوێت ئەگەر پاشەکەوتی بکەیت.',
 'session_fail_preview' => "'''ببوورە! ناتوانین دەستکارییەکەت پێواژۆ بکەین بە ھۆی لەدەستدانی session data.'''
 تکایە دیسان ھەوڵبدەوە.
@@ -882,15 +888,15 @@ $2
 'permissionserrors' => 'ھەڵەی ئیجازەکان',
 'permissionserrorstext' => 'مافی ئەنجامی ئەوەت نیە لەبەر ئەم {{PLURAL:$1|هۆکار|هۆکارانە}} :',
 'permissionserrorstext-withaction' => 'دەسەڵاتت نییە بۆ $2، لەبەر ئەم {{PLURAL:$1|ھۆکارە|ھۆکارانە}}ی خوارەوە:',
-'recreate-moveddeleted-warn' => "'''ھۆشیار بە: خەریکی پەڕەیەک درووست‌ دەکەیتەوە کە لە پێشدا سڕاوەتەوە. '''
+'recreate-moveddeleted-warn' => "'''ھۆشیار بە: خەریکی پەڕەیەک دروست‌ دەکەیتەوە کە لە پێشدا سڕاوەتەوە.'''
 
¯Û\95بÛ\8e Ø¦Ø§Ú¯Ø§Øª Ù\84Û\95Ù\88Û\95 Ø¨Û\8eت Ú©Û\95 Ø¯Û\95ستکارÛ\8cکردÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95 Ù\82ازاÙ\86جÛ\8c Ú¾Û\95Û\8cÛ\95 Û\8cا نا.
-لۆگی سڕینەوە و گواستنەوەی ئەم پەڕە بۆ ئاسانکاری لێرەدا ھاتووە:",
¦Û\95Ù\85Û\95 Ù\84Û\95بÛ\95ر Ú\86اÙ\88 Ø¨Ú¯Ø±Û\95 Ú©Û\95 Ø¯Û\95ستکارÛ\8cکردÙ\86Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ø¨Û\95Ù\82ازاÙ\86جÛ\95 Û\8cاÙ\86 نا.
+لۆگی سڕینەوە و گواستنەوەی ئەم پەڕەیە بۆ سانایی لێرەدا ھاتووە:",
 'moveddeleted-notice' => 'ئەم پەڕەیە سڕاوەتەوە.
 لۆگی سڕینەوە و گواستنەوە بۆ پەڕەکە لە خوارەوە دابینکراوە.',
 'log-fulllog' => 'دیتنی لۆگی تەواو',
-'edit-hook-aborted' => 'دەستکاری لە لایەن قولاپەوە هەڵوەشێندرایەوە.<br />
-هۆکاری ئەوەی بەردەست نەخستووە.',
+'edit-hook-aborted' => 'دەستکاری لە لایەن قولاپەوە ھەڵوەشێنرایەوە.
+ھۆکارەکەی لەبەر دەست نییە.',
 'edit-gone-missing' => 'توانای نوێ‌کردنەوەی لاپەڕەکە نیە.<br />
 لەوە دەچی سڕدرابێتەوه.‌',
 'edit-conflict' => 'کێشەی دەستکاری.',
@@ -899,12 +905,18 @@ $2
 ئەوە لەپێش‌دا هەبوو.',
 'defaultmessagetext' => 'دەقی پەیامی هەمیشەیی',
 
+# Content models
+'content-model-wikitext' => 'ویکیدەق',
+'content-model-text' => 'دەقی ساکار',
+'content-model-javascript' => 'جاڤاسکریپت',
+'content-model-css' => 'سی ئێس ئێس',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ئاگاداری:''' ئەم لاپەڕە ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەی لەخۆ گرتوو.<br /><br />
 ئەوە دەبێ کەمتر بێت لە $2 {{PLURAL:$2|بانگ‌کەردن|بانگ‌کەردن}} کە ئێستا {{PLURAL:$1|بانگ‌کردنی|بانگ‌کردنی}} تێدایە.",
 'expensive-parserfunction-category' => 'ئەو لاپەڕانەی  ژمارەیەکی زۆر بانگ‌کەری فەنکشێنی لێک‌کەرەوەیان لەخۆ گرتووە.',
-'post-expand-template-inclusion-warning' => "'''ئاگاداری:''' قەبارەی داڕێژەکە زۆر گەورەیە.<br />
-لەوانەیە ھەندێ لە داڕێژەکان لەخۆ نەگرێت.",
+'post-expand-template-inclusion-warning' => "'''ئاگاداری:''' قەبارەی داڕێژەکە زۆر گەورەیە.
+لەوانەیە ھەندێک لە داڕێژەکان لەخۆنەگرێتەوە.",
 'post-expand-template-inclusion-category' => 'ئەو لاپەڕانەی وا داڕێژە تیێدا قەبارەی تێپەڕیوە',
 'post-expand-template-argument-warning' => "'''ئاگاداری:''' ئەم لاپەڕە لانیکەم یەک بەڵگەی داڕێژە لە خۆ گرتوو کە قەبارەی کردنەوەی زۆر گەورەیە.<br />
 ئەم بەڵگە بەکار نەخراوە.",
@@ -928,7 +940,7 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 'viewpagelogs' => 'لۆگەکانی ئەم پەڕەیە ببینە',
 'nohistory' => 'هیچ مێژوویەکی دەستکاری نییە بۆ ئەم پەڕەیە.',
 'currentrev' => 'دوایین پیاچوونەوە',
-'currentrev-asof' => 'دÙ\88اÛ\8cÛ\8cÙ\86 Ù¾Û\8cاچوونەوەی $1',
+'currentrev-asof' => 'دÙ\88اÛ\8cÛ\8cÙ\86 Ù¾Û\8eداچوونەوەی $1',
 'revisionasof' => 'وەک پیاچوونەوەی $1',
 'revision-info' => 'پێداچوونەوی $1 لە لایەن $2',
 'previousrevision' => '→پیاچوونەوەی کۆنتر',
@@ -960,23 +972,31 @@ $3 هۆکاری "$2" خستوەتەڕوو',
 'rev-deleted-comment' => '(پوختەی دەستکاری سڕایەوە)',
 'rev-deleted-user' => '(ناوی بەکارهێنەر سڕایەوە)',
 'rev-deleted-event' => '(لۆگی کردەوە سڕایەوە)',
-'rev-deleted-text-permission' => "ئÛ\95Ù\85 Ù¾Û\8cاÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8c Ù¾Û\95Ú\95Û\95Û\8cÛ\95 '''سÚ\95اوەتەوە'''.
+'rev-deleted-text-permission' => "ئÛ\95Ù\85 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8cÛ\95 Ù\84Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 '''سÚ\95دراوەتەوە'''.
 وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.",
-'rev-deleted-text-unhide' => "ئÛ\95Ù\85 Ù¾Û\8cاÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8c Ù¾Û\95Ú\95Û\95Û\8cÛ\95 '''سÚ\95راوەتەوە'''.
-وردەکارییەکان لە [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەدۆزرێتەوە.
-Ú¾Û\8eشتا Ø¯Û\95تÙ\88اÙ\86Û\8c [$1 Ø¦Û\95Ù\85 Ù¾Û\8cاÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8cÛ\95 Ø¨Ø¨Û\8cÙ\86Û\8c] Ø¦Û\95Ú¯Û\95ر Ø¯Û\95تÛ\95Ù\88Û\8e Ù¾Û\8eشتر Ø¨Ú\95Û\86Û\8c.",
-'rev-suppressed-text-unhide' => "پێداچوونەوی ئەم لاپەڕە '''بەرگری''' لێ‌کراوە.
\84Û\95Ù\88اÙ\86Û\95Û\8cÛ\95 Ù\88ردÛ\95کارÛ\8c Ø³Û\95بارÛ\95ت Ø¨Û\95Ù\88Û\95 Ù\84Û\8eرÛ\95دا Ø¯Û\95ست Ú©Û\95Ù\88Û\8e : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\84Û\86Ú¯Û\8c Ø¨Û\95رگرÛ\8c].
-وەک بەڕێوبەر هێشتا دەتوانی [$1 ئەم پێداچوونەوە] ببینی، گەر دەتەوێ پێشتر بڕۆی.",
-'rev-deleted-text-view' => "پێداچوونەوەی ئەم لاپەڕە '''سڕدراوەتەوە'''.<br />
-وەک بەڕێوبەر هێشتا دەتوانی چاوی لێ‌بکەی؛ لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].",
-'rev-suppressed-text-view' => "پێداچوونەوی ئەم لاپەڕە '''بەرگری''' لێ‌کراوە.
-وەک بەڕێوبەر دەتوانی بیبینی؛ لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].",
+'rev-deleted-text-unhide' => "ئÛ\95Ù\85 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8cÛ\95 Ù\84Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 '''سÚ\95دراوەتەوە'''.
+وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.
+Ú¾Û\8eشتا Ø¦Û\95Ú¯Û\95ر Ø¨ØªÛ\95Ù\88Û\8e Ø¯Û\95تÙ\88اÙ\86Û\8c [$1 Ø¦Û\95Ù\85 Ù¾Û\8eداÚ\86Ù\88Ù\88Ù\86Û\95Ù\88Û\95Û\8cÛ\95 Ø¨Ø¨Û\8cÙ\86Û\8c].",
+'rev-suppressed-text-unhide' => "ئەم پێداچوونەوەیە لەم پەڕەیە '''بەرگری لێ‌کراوە'''.
\88ردÛ\95کارÛ\8c Ø³Û\95بارÛ\95ت Ø¨Û\95Ù\88Û\95 Ù\84Û\95 [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Ù\84Û\86Ú¯Û\8c Ø¨Û\95رگرÛ\8c]دا Ø¯Û\95ست Ø¯Û\95Ú©Û\95Ù\88Û\8eت.
+ھێشتا ئەگەر بتەوێ دەتوانی [$1 ئەم پێداچوونەوەیە ببینی].",
+'rev-deleted-text-view' => "ئەم پێداچوونەوەیە لەم پەڕەیە '''سڕدراوەتەوە'''.
+ئێستا دەتوانی بیبینی؛ وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.",
+'rev-suppressed-text-view' => "ئەم پێداچوونەوەیە لەم پەڕەیە '''بەرگری لێ‌کراوە'''.
+ئێستا دەتوانی بیبینی؛ وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری]دا دەست دەکەوێت.",
 'rev-deleted-no-diff' => "ناتوانی ئەم جیاوازیە ببینی لەبەر ئەوەی یەکێک لە پێداچوونەوەکان '''سڕدراوەتەوه'''‌.<br />
 لەوانەیە وردەکاری سەبارەت بەوە لێرەدا دەست کەوێ : [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری].",
-'rev-deleted-unhide-diff' => "یەکێک لە پیاچوونەوەکانی ئەم جیاوازیە '''سڕاوەتەوه'''.
-وردەکارییەکان لە [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەدۆزرێتەوە.
-ھێشتا دەتوانیت [$1 ئەم جیاوازییە ببینیت] ئەگەر بتەوێ.",
+'rev-suppressed-no-diff' => "ناتوانی ئەم چیاوازییە ببینی چون یەکێک لە پێداچوونەوەکان '''سڕدراوەتەوە'''.",
+'rev-deleted-unhide-diff' => "یەکێک لە پێداچوونەوەکانی ئەم جیاوازیە '''سڕدراوەتەوه'''.
+وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.
+ھێشتا ئەگەر بتەوێ دەتوانی [$1 ئەم جیاوازییە ببینی].",
+'rev-suppressed-unhide-diff' => "یەکێک لە پێداچوونەوەکانی ئەم جیاوازیە '''سڕدراوەتەوه'''.
+وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری]دا دەست دەکەوێت.
+ھێشتا ئەگەر بتەوێ دەتوانی [$1 ئەم جیاوازییە ببینی].",
+'rev-deleted-diff-view' => "یەکێک لە پێداچوونەوەکانی ئەم جیاوازییە  '''سڕدراوەتەوە'''.
+ئێستا دەتوانی بیبینی؛ وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی سڕینەوە]دا دەست دەکەوێت.",
+'rev-suppressed-diff-view' => "یەکێک لە پێداچوونەوەکانی ئەم جیاوازییە '''بەرگری لێ‌کراوە'''.
+ئێستا دەتوانی بیبینی؛ وردەکاری سەبارەت بەوە لە [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} لۆگی بەرگری]دا دەست دەکەوێت.",
 'rev-delundel' => 'نیشانبدە/بشارەوە',
 'rev-showdeleted' => 'نیشان بدە',
 'revisiondelete' => 'سڕینەوە/ھێنانەوەی پێداچوونەوەکان',
@@ -1040,7 +1060,7 @@ $1",
 ** ناوی بەکارھێنەریی نەشیاو
 ** زانیارییەک کە دەتوانێ بوختاناوی بێت',
 'revdelete-otherreason' => 'ھۆکاری تر/زیاتر:',
-'revdelete-reasonotherlist' => 'هۆکاری دیکە',
+'revdelete-reasonotherlist' => 'ھۆکاری تر',
 'revdelete-edit-reasonlist' => 'دەستکاریی ھۆکارەکانی سڕینەوە',
 'revdelete-offender' => 'نووسەری پیاچوونەوە:',
 
@@ -1132,8 +1152,6 @@ $1",
 'search-interwiki-caption' => 'پرۆژە خوشکەکان',
 'search-interwiki-default' => '$1 ئەنجام:',
 'search-interwiki-more' => '(زیاتر)',
-'search-mwsuggest-enabled' => 'بە پێشنیارەکانەوە',
-'search-mwsuggest-disabled' => 'بێ پێشنیار',
 'search-relatedarticle' => 'پەیوەست',
 'mwsuggest-disable' => 'پێشنیارەکانی AJAX نیشان مەدە',
 'searcheverything-enable' => 'لە ھەموو بۆشایی‌‌ناوەکان دا بگەڕێ',
@@ -1168,7 +1186,7 @@ $1",
 
 # Preferences page
 'preferences' => 'ھەڵبژاردەکان',
-'mypreferences' => 'ھەڵبژاردەکانم',
+'mypreferences' => 'ھەڵبژاردەکان',
 'prefs-edits' => 'ژمارەی گۆڕانکارییەکان:',
 'prefsnologin' => 'لەژوورەوە نیت',
 'prefsnologintext' => 'بۆ دانانی هەڵبژاردەکانی بەکارهێنەر دەبێ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} بچیتە ژوورەوە]</span>.',
@@ -1231,7 +1249,7 @@ $1",
 'timezoneregion-indian' => 'ئوقیانووسی ھیند',
 'timezoneregion-pacific' => 'ئوقیانووسی پاسیفیک',
 'allowemail' => 'ڕێگە بدە بە بەکارھێنەرانی تر کە ئیمەیلم بۆ بنێرن',
-'prefs-searchoptions' => 'Ú¾Û\95ڵبÚ\98اردÛ\95کاÙ\86Û\8c Ú¯Û\95Ú\95اÙ\86',
+'prefs-searchoptions' => 'گەڕان',
 'prefs-namespaces' => 'بۆشایی‌ناوەکان',
 'defaultns' => 'ئەگەرنا لەم بۆشایی‌ناوانەدا بگەڕێ:',
 'default' => 'بنچینەیی',
@@ -1283,6 +1301,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' => 'بەڕێوەبردنی گرووپەکانی بەکارھێنەر',
@@ -1352,15 +1374,15 @@ $1",
 'right-apihighlimits' => 'خستنە‌کاری سنووری زیاتر بۆ داخوازیەکانی API',
 'right-writeapi' => 'کەڵک وەر گرتن لە نووسینی API',
 'right-delete' => 'سڕینەوەی پەڕەکان',
-'right-bigdelete' => 'سڕینەوە و هاوردنەوەی پێداچوونەوەیکی تایبەتی لاپەڕەکان',
+'right-bigdelete' => 'سڕینەوەی پەڕەکان بە مێژووی گەورە',
 'right-deleterevision' => 'سڕینەوە و هاوردنەوەی پێداچوونەوەیکی تایبەتی لاپەڕەکان',
 'right-deletedhistory' => 'دیتنی دراوە سڕاوەکانی مێژوو بێ دەقە هەڵواسراوەکانی',
-'right-browsearchive' => 'Ú¯Û\95Ú\95اÙ\86Û\8c Ù\86اÙ\88 Ù\84اپÛ\95Ú\95Û\95 Ø³Ú\95اÙ\88Û\95کاÙ\86',
+'right-browsearchive' => 'گەڕانی پەڕە سڕاوەکان',
 'right-undelete' => 'هاوەردنەوەی لاپەڕەیەک',
 'right-suppressrevision' => 'چاوپێداخشان و هاردنوەی ئەو لاپەڕانەی لە بەڕێوبەران داشاردرابوو.',
 'right-suppressionlog' => 'دیتنی لۆگە ئەهلیەکان',
 'right-block' => 'بەربەستنی بەکارھێنەرانی تر لە دەستکاری کردن',
-'right-blockemail' => 'بەرگریâ\80\8cکردÙ\86Û\8c Ø¨Û\95کارÙ\87Û\8eÙ\86Û\95رÛ\8eÚ© Ù\84Û\95 Ù\86اردÙ\86Û\8c Ø¦Û\8câ\80\8cÙ\85Û\95Û\8cÙ\84',
+'right-blockemail' => 'بەرگری Ø¨Û\95کارÙ\87Û\8eÙ\86Û\95رÛ\8eÚ© Ø¨Ú©Û\95 Ù\84Û\95 Ù\86اردÙ\86Û\8c Ø¦Û\8cÙ\85Û\95Û\8cÙ\84',
 'right-hideuser' => 'بەربەست‌کردنی ناوێکی بەکارهێنەری، داشاردنی لە بەرچاوی هەموان',
 'right-ipblock-exempt' => 'لادان لە بەرگریەکانی ئای‌پی، بەرگریە خۆکارەکان و بەرگریە ڕیزەکان',
 'right-proxyunbannable' => 'لادان لە بەرگری خۆکاری پرۆکسیەکان',
@@ -1400,7 +1422,7 @@ $1",
 'action-createaccount' => 'درووست‌کردنی هەژمارەی ئەم بەکارهێنەرە',
 'action-minoredit' => 'نیشان‌کردنی ئەم دەستکاریە وەک بچووک',
 'action-move' => 'گواستنەوەی ئەم پەڕە',
-'action-move-subpages' => 'Ú¯Ù\88استÙ\86Û\95Ù\88Û\95Û\8c Ø¦Û\95Ù\85 Ù\84اپÛ\95Ú\95Û\95 Ù\88 Ú\98Û\8eرÙ\84اپەڕەکانی',
+'action-move-subpages' => 'Ú¯Ù\88استÙ\86Û\95Ù\88Û\95Û\8c Ø¦Û\95Ù\85 Ù¾Û\95Ú\95Û\95Û\8cÛ\95 Ù\88 Ú\98Û\8eرپەڕەکانی',
 'action-move-rootuserpages' => 'گواستنەوەی بنەرەتی لاپەڕەکانی بەکارهێنەر',
 'action-movefile' => 'ئەم پەڕگەیە بگوازەوە',
 'action-upload' => 'ئەم پەڕەیە بار بکە',
@@ -1421,7 +1443,7 @@ $1",
 'action-importupload' => 'هێنانەناوەی ئەم لاپەڕە لە پەڕگەیەکی بارکراو',
 'action-patrol' => 'لەژێرچاودێری نیشان‌کردنی دەستکاریەکانی کەسانی‌تر',
 'action-autopatrol' => 'دەستکاریەکانت وەک لەژێرچاودێری نیشان کراون',
-'action-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù\84Û\8cستÛ\8eÚ© Ù\84Û\95Ù\88 Ù\84اپەڕانەی چاودێری ناکرێن',
+'action-unwatchedpages' => 'دÛ\8cتÙ\86Û\8c Ù¾Û\8eرستÛ\8c Ø¦Û\95Ù\88 پەڕانەی چاودێری ناکرێن',
 'action-mergehistory' => 'سەریەک‌خستنی میژووی ئەم لاپەڕە',
 'action-userrights' => 'دەستکاری مافەکانی هەموو بەکارهێنەران',
 'action-userrights-interwiki' => 'دەستکاری مافەکانی بەکارهێنەریی بەکارهێنەران لە ویکی‌یەکانی دیکە‌دا',
@@ -1445,7 +1467,7 @@ $1",
 'rcshowhidebots' => 'بۆتەکان $1',
 'rcshowhideliu' => 'بەکارھێنەرە تۆمارکراوەکان $1',
 'rcshowhideanons' => 'بەکارھێنەرە نەناسراوەکان $1',
-'rcshowhidepatr' => 'Ú¯Û\86راÙ\86کارÛ\8cÛ\8cÛ\95 Ú©Û\86Ù\86ترÛ\86Úµکراوەکان $1',
+'rcshowhidepatr' => 'Ú¯Û\86راÙ\86کارÛ\8cÛ\8cÛ\95 Ú\86اÙ\88دÛ\8eرÛ\8cکراوەکان $1',
 'rcshowhidemine' => 'دەستکارییەکانی من $1',
 'rclinks' => 'دوایین $1 گۆڕانکاریی $2 ڕۆژی ڕابردوو نیشان بدە<br />$3',
 'diff' => 'جیاوازی',
@@ -1458,9 +1480,11 @@ $1",
 'number_of_watching_users_pageview' => '[$1 چاودێر لەسەر {{PLURAL:$1|بەکارهێنەر|بەکارهێنەر}}]',
 'rc_categories' => 'بەرتەسک‌کردنەوە بە هاوپۆلەکان (به "|" جودای بکەوە‌)',
 'rc_categories_any' => 'هەرکام',
-'newsectionsummary' => '/* $1 */ بەشی نوێ',
+'rc-change-size-new' => '$1 {{PLURAL:$1|بایت}} پاش گۆڕانکاری',
+'newsectionsummary' => 'بەشی نوێ /* $1 */',
 'rc-enhanced-expand' => 'وردەکارییەکان پیشان بدە (پێویستی بە جاڤاسکریپتە)',
 'rc-enhanced-hide' => 'وردەکارییەکان بشارەوە',
+'rc-old-title' => 'بە ناوی سەرەکیی «$1» دروست کراوە',
 
 # Recent changes linked
 'recentchangeslinked' => 'گۆڕانکارییە پەیوەندیدارەکان',
@@ -1512,6 +1536,7 @@ $1",
 'minlength1' => 'ناوی پەڕگەکان دەبێ لانیکەم یەک پیت ببێت.',
 'illegalfilename' => 'ناوی‌پەڕگەی "$1" پیتێکی تێدایە کە ڕێگەنەدراوە بۆ سەردێڕی لاپەڕە بەکاربێت.
 تکایە ناوی پەڕگەکە بگۆڕە و دیسان باری بکەوە.',
+'filename-toolong' => 'ناوی پەڕگە ناتوانێ لە ٢٤٠ بایت درێژتر بێت.',
 'badfilename' => 'ناوی پەڕگە بە "$1" گۆڕا .',
 'filetype-badmime' => 'ڕێگە نەدراوە پەڕگەی "$1" جۆری MIME بار بکرێت.',
 'filetype-bad-ie-mime' => 'ناتوانین ئەم پەڕگە باربکەین لەبەر ئەوەی وێبگەڕی Internet Explore ئەوە وەک "$1" دەناسێت کە ڕێگەنەدراوەیە و جۆرە پەڕگەیەکی مەترسی‌دارە.',
@@ -1524,6 +1549,7 @@ $2، ئەو جۆرە {{PLURAL:$3|پەڕگەیە کە ڕێگەی|پەڕگانەی
 'file-too-large' => 'ئەو پەڕگەیە ناردووتە زۆر گەورەیە.',
 'filename-tooshort' => 'ناوی پەڕگە زۆر کورتە.',
 'filetype-banned' => 'ئەم جۆرە پەڕگەیە قەدەغەیە.',
+'illegal-filename' => 'ناوی پەڕگە رێگەپێ‌نەدراوە.',
 'unknown-error' => 'ھەڵەیەکی نەزانراو ڕوویداوە.',
 'large-file' => 'پێشنیار دەکرێت قەبارەی پەڕگەکان زیاتر لە $1 نەبێت؛
 قەبارەی ئەم پەڕگە $2.',
@@ -1600,11 +1626,18 @@ $1',
 'upload-http-error' => 'هەڵەیەکی HTTP ڕووئ داوە: $1',
 
 # File backend
+'backend-fail-stream' => 'نەکرا پەڕگەی $1 بنێردرێت.',
+'backend-fail-notexists' => 'پەڕگەی $1 بوونی نییە.',
 'backend-fail-delete' => 'نەکرا پەڕگەی $1 بسڕدرێتەوە.',
 'backend-fail-copy' => 'نەکرا پەڕگەی $1 کۆپی بکرێت بۆ $2.',
 'backend-fail-move' => 'نەکرا پەڕگەی $1 بگوازرێتەوە بۆ $2.',
+'backend-fail-read' => 'نەکرا پەڕگەی $1 بخوێنرێتەوە.',
 'backend-fail-create' => 'نەکرا پەڕگەی $1 بنووسرێت',
 
+# Special:UploadStash
+'uploadstash-errclear' => 'سڕینەوەی پەڕگەکان سەرکەوتوو نەبوو.',
+'uploadstash-refresh' => 'نوێکردنەوەی پێرستی پەڕگەکان',
+
 # img_auth script messages
 'img-auth-accessdenied' => 'تێپه‌ربوون ره‌تکرایه‌وه‌',
 'img-auth-nofile' => 'فایلی "$1" بوونی نیه‌',
@@ -1700,8 +1733,8 @@ $1',
 'filedelete-success-old' => "وەشانی $3، $2 لە '''[[Media:$1|$1]]''' سڕاوەتەوە.",
 'filedelete-nofile' => "'''$1''' بوونی نییە.",
 'filedelete-nofile-old' => "وەشانێکی ئەرشیڤ‌کراوی '''$1''' بەو تایبەتمەندییە دیاری‌کراوانە نییە.",
-'filedelete-otherreason' => 'هۆکاری دیکە\\زیادی:',
-'filedelete-reason-otherlist' => 'هۆکاری دیکە',
+'filedelete-otherreason' => 'ھۆکاری تر/زیاتر:',
+'filedelete-reason-otherlist' => 'ھۆکاری تر',
 'filedelete-reason-dropdown' => '*هوکارە هاوبەشەکانی سڕینەوە
 **لادان لە مافەکانی بڵاوکردنەوە
 ***پەڕگەی دووبارەکراوە',
@@ -1719,7 +1752,7 @@ $1',
 'unwatchedpages' => 'لاپەڕە چاودێری‌نەکراوەکان',
 
 # List redirects
-'listredirects' => 'Ù\84Û\8cستÛ\8c Ø¦Ø§Ú\95استÛ\95کراÙ\88ەکان',
+'listredirects' => 'Ù¾Û\8eرستÛ\8c Ú\95Û\95Ù\88اÙ\86Û\95Ú©Û\95رەکان',
 
 # Unused templates
 'unusedtemplates' => 'داڕێژە بەکارنەھێنراوەکان',
@@ -1757,9 +1790,9 @@ $1',
 
 'disambiguations' => 'ئەو پەڕانە لینکیان ھەیە بۆ پەڕەکانی ڕوونکردنەوە',
 'disambiguationspage' => 'Template:ڕوونکردنەوە',
-'disambiguations-text' => "ئەم پەڕانە بەستەریان ھەیە بۆ '''پەڕەی ڕوونکردنەوە'''.
-ئەوانە دەبێ لە جیاتی ئەوە بەستەریان ببێت بۆ بابەتی گونجاو.<br />
-ئەگەر پەڕەیەک لە داڕێژەیەک کەڵک وەرگرێت کە بەستەری ھەیە بۆ [[MediaWiki:Disambiguationspage]]، وەک پەڕەی ڕوونکردنەوە مامەڵەی لەگەڵدا دەکرێ.",
+'disambiguations-text' => "ئەم پەڕانە لانی کەم یەک بەستەریان بۆ '''پەڕەی ڕوونکردنەوە''' ھەیە.
+لەوانەیە لە جیاتی ئەو، بەستەریان ھەبێت  بۆ بابەتەکانیی گونجاو.<br />
+ئەگەر پەڕەیەک لە داڕێژەیەک کەڵک وەرگرێت کە بەستەری ھەبێت بۆ [[MediaWiki:Disambiguationspage]]، وەک پەڕەی ڕوونکردنەوە لەبەر چاو دەگیرێت.",
 
 'doubleredirects' => 'دووجار ڕەوانەکراوەکان',
 'doubleredirectstext' => 'ئەم پەڕە لیستی ئەو پەڕانەیە کە ڕەوانەکراون بۆ پەڕەیەکی ڕەوانەکراوی دیکە.
@@ -1784,6 +1817,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|پیاچوونەوە|پیاچوونەوە}}',
@@ -1810,6 +1844,7 @@ $1',
 'mostlinkedtemplates' => 'ئەو داڕێژانە زۆرترین بەستەریان پێدراوە',
 'mostcategories' => 'پەڕە زۆرتر پۆلێنکراوەکان',
 'mostimages' => 'ئەو پەڕگانە زۆرترین بەستەریان پێدراوە',
+'mostinterwikis' => 'پەڕەکان بە زۆرترین نێوانویکی',
 'mostrevisions' => 'ئەو پەڕانە زۆرترین پیاچوونەوەیان ھەیە',
 'prefixindex' => 'گشت پەڕەکان بە پێشگرەوە',
 'prefixindex-namespace' => 'هەموو پەڕەکان بەپێشگری (بۆشایی ناوی $1)',
@@ -1881,7 +1916,7 @@ $1',
 'allpagesbadtitle' => 'سەردێڕی لاپەڕە گونجاو نەبوو یان پێشگڕێکی بەینی‌زمانی یان بەینی‌ویکی هەبوو.
 لەوانەیە یەک یان زیاتر پیتی نەگونجاو بۆ سەردێڕی لەخۆ گرتبێ.',
 'allpages-bad-ns' => '{{SITENAME}} ناوبۆشایی نیە "$1".',
-'allpages-hide-redirects' => 'ڕەوانەکراوەکان بشارەوە',
+'allpages-hide-redirects' => 'ڕەوانەکەرەکان بشارەوە',
 
 # SpecialCachedPage
 'cachedspecial-refresh-now' => 'دواترین پیشانبدە',
@@ -1952,10 +1987,11 @@ $1',
 'mailnologin' => 'ناونیشان بۆ ناردن نییه‌',
 'mailnologintext' => 'ده‌بێ له‌ [[Special:UserLogin|ژووره‌وه‌]] بیت و ناونیشانێکی بڕواپێ‌کراوی ئی‌مه‌یلت له‌ ناو [[Special:Preferences|هه‌ڵبژارده‌کان]] دیاری کردبێت تا بتوانی ئی‌مه‌یل بنێریت بۆ به‌کارهێنه‌رانی دیکه‌.',
 'emailuser' => 'ئیمەیل بنێرە بۆ ئەم بەکارھێنەرە',
+'emailuser-title-target' => 'ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە',
 'emailuser-title-notarget' => 'ئیمەیل بۆ بەکارھێنەر',
 'emailpage' => 'ئیمەیل بۆ بەکارھێنەر',
-'emailpagetext' => 'دەتوانی لەم فۆرمەی خوارەوە کەڵک وەربگریت بۆ ناردنی پەیامێکی ئیمەیل بۆ ئەم بەکارھێنەرە.
-ئەو ئەدرەسی ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، بۆ ئەدرەسی «لەلایەن» (From) لە ئیمەیلدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.',
+'emailpagetext' => 'دەتوانی لەم فۆرمەی ژێرەوە بۆ ناردنی ئیمەیلێک بۆ ئەم {{GENDER:$1|بەکارھێنەر}}ە کەڵک وەربگریت.
+ئەو ناونیشانە ئیمەیلە لە [[Special:Preferences|ھەڵبژاردەکانی بەکارھێنەر‌یتدا]] نووسیوتە، لە ناونیشانی «لەلایەن»ی (From) ئیمەیلەکەدا نیشان دەدرێت، کە وایە بەکارھێنەری وەرگر دەتوانێ ڕاستەوخۆ وەڵامت بداتەوە.',
 'defemailsubject' => 'ئیمەیڵی {{SITENAME}} لە بەکارھێنەر «$1»ەوە',
 'usermaildisabled' => 'ئیمەیڵی بەکارهێنەر لەکاردانیە',
 'noemailtitle' => 'هیچ ناونیشانێکی ئی‌مەیل نییە',
@@ -1983,7 +2019,7 @@ $1',
 
 # Watchlist
 'watchlist' => 'پێرستی چاودێرییەکانم',
-'mywatchlist' => 'پێرستی چاودێرییەکەم',
+'mywatchlist' => 'پێرستی چاودێری',
 'watchlistfor2' => 'بۆ $1 $2',
 'nowatchlist' => 'لە لیستی چاودێڕییەکانتدا ھیچ نیە.',
 'watchlistanontext' => 'تکایە بۆ دیتن و دەستکاری بابەتەکانی لە ناو لیستی چاودێریەکەت‌دا $1.',
@@ -2018,11 +2054,7 @@ $1',
 
 'enotif_mailer' => 'نامەی ڕاگەیاندنی {{SITENAME}}',
 'enotif_reset' => 'گشت پەڕەکان وەک بینراو دیاری بکە',
-'enotif_newpagetext' => 'ئەمە پەڕەیەکی تازەیە.',
 'enotif_impersonal_salutation' => 'بەکارهێنەری      {{SITENAME}}',
-'changed' => 'گۆڕدرا',
-'created' => 'دروستکرا',
-'enotif_subject' => '‫پەڕەی «$PAGETITLE»ی {{SITENAME}} بەدەستی $PAGEEDITOR $CHANGEDORCREATED',
 'enotif_lastvisited' => 'بۆ بینینی ھەموو گۆرانکارییەکانی پاش دوایین سەردانت $1 ببینە.',
 'enotif_lastdiff' => 'بۆ بینینی ئەم گۆڕانکارییە $1 ببینە.',
 'enotif_anon_editor' => 'بەکارھێنەری نەناسراو $1',
@@ -2060,8 +2092,8 @@ $UNWATCHURL
 'confirm' => 'پشتدار بکەرەوە',
 'excontent' => 'ناوەرۆک ئەمە بوو: «$1»',
 'excontentauthor' => 'ناوەرۆک ئەمە بوو: «$1» (و تەنیا بەشداربوو «[[Special:Contributions/$2|$2]]» بوو)',
-'exbeforeblank' => 'ناوەرۆک بەر لە بەتاڵ کردنەوە ئەمە بوو: «$1»',
-'exblank' => 'پەڕە خاڵی بوو',
+'exbeforeblank' => 'ناوەرۆک بەر لە واڵاکردنەوە ئەمە بوو: «$1»',
+'exblank' => 'پەڕە واڵا بوو',
 'delete-confirm' => 'سڕینەوەی «$1»',
 'delete-legend' => 'بیسڕەوە',
 'historywarning' => "'''وشیار بە:''' پەڕەیەک کە دەتەوێ بیسڕیتەوە مێژوویەکی ھەیە بە نزیکەی $1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}}وە:",
@@ -2076,8 +2108,8 @@ $UNWATCHURL
 'deletionlog' => 'لۆگی سڕینەوە',
 'reverted' => 'گەڕێندراوە بۆ پێداچوونەوەی پێشووتر',
 'deletecomment' => 'ھۆکار:',
-'deleteotherreason' => 'Ú¾Û\86کارÛ\8c Ø¯Û\8cÚ©Û\95:',
-'deletereasonotherlist' => 'Ú¾Û\86کارÛ\8c Ø¯Û\8cÚ©Û\95',
+'deleteotherreason' => 'Ú¾Û\86کارÛ\8c ØªØ±/زÛ\8cاتر:',
+'deletereasonotherlist' => 'Ú¾Û\86کارÛ\8c ØªØ±',
 'deletereason-dropdown' => '* ھۆکاری سڕینەوە
 ** داواکاریی نووسەر
 ** تێکدانی مافی لەبەرگرتنەوە
@@ -2093,7 +2125,8 @@ $UNWATCHURL
 'rollback' => 'گەڕاندنەوەی دەستکارییەکان',
 'rollback_short' => 'گەڕاندنەوە',
 'rollbacklink' => 'گەڕاندنەوە',
-'rollbacklinkcount' => 'گەڕاندنەوەی $1 دەستکاری',
+'rollbacklinkcount' => 'گەڕاندنەوەی $1 {{PLURAL:$1|دەستکاری}}',
+'rollbacklinkcount-morethan' => 'گەڕاندنەوەی زۆرتر لە $1 {{PLURAL:$1|دەستکاری}}',
 'rollbackfailed' => 'گەڕاندنەوە سەرکەوتوو نەبوو',
 'cantrollback' => 'دەستکاریەکان ناگەڕێندرێتەوە؛
 دوایین هاوبەش تەنها ڕێکخەری ئەم لاپەڕەیە.',
@@ -2140,14 +2173,15 @@ $UNWATCHURL
 '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' => 'Ú¾Û\86کارÛ\8c Ø¯Û\8cÚ©Û\95',
+'protect-otherreason' => 'ھۆکاری تر/زیاتر:',
+'protect-otherreason-op' => 'Ú¾Û\86کارÛ\8c ØªØ±',
 'protect-dropdown' => '*ھۆکارە باوەکانی پاراستن
 ** خراپکاریی لەڕادەبەدەر
 ** سپامی لەڕادەبەدەر
@@ -2201,8 +2235,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} هێنرایەوە',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 پێداچوونەوە|$1 پێداچوونەوە}} و {{PLURAL:$2|1 پەڕگە|$2 پەڕگە}} هێنرایەوە',
 'undeletedfiles' => '{{PLURAL:$1|1 پەڕگە|$1 پەڕگە}} هێنرایەوه',
-'cannotundelete' => 'لە سڕین گەڕانەوە سەرکەوتوو نەبوو؛
-کەسێکی دیکە پێش تۆ گەڕاندوویەتەوە.',
+'cannotundelete' => 'ھێنانەوە سەرکەوتوو نەبوو:
+$1',
 'undeletedpage' => "'''$1 هێنراوەتەوە'''
 
 بۆ دیتنی پێشینەی دوایین سڕینەوەکان و هێنانەوەکان سەرنجی [[Special:Log/delete|لۆگی سڕینەوە]] بدە.",
@@ -2231,7 +2265,7 @@ $1',
 # Contributions
 'contributions' => 'بەشدارییەکانی بەکارھێنەر',
 'contributions-title' => 'بەشدارییەکانی بەکارھێنەر $1',
-'mycontris' => 'بەشدارییەکانم',
+'mycontris' => 'بەشدارییەکان',
 'contribsub2' => 'بۆ $1 ($2)',
 'nocontribs' => 'هیچ گۆڕانکاریەکی هاوتای ئەم پێوەرانە نودۆزرایەوە',
 'uctop' => '(سەر)',
@@ -2244,10 +2278,14 @@ $1',
 'sp-contributions-blocklog' => 'لۆگی بەربەستن',
 'sp-contributions-deleted' => 'بەشدارییە سڕاوەکان',
 'sp-contributions-uploads' => 'بارکردنەکان',
-'sp-contributions-logs' => 'تۆمارەکان',
+'sp-contributions-logs' => 'لۆگەکان',
 'sp-contributions-talk' => 'لێدوان',
 'sp-contributions-userrights' => 'بەڕێوبەرایەتی مافەکانی بەکارهێنەر',
-'sp-contributions-search' => 'گەڕین بۆ بەشدارییەکان',
+'sp-contributions-blocked-notice' => 'ھەنووکە ئەم بەکارھێنەرە بەربەست کراوە.
+دوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:',
+'sp-contributions-blocked-notice-anon' => 'ھەنووکە ئەم ناونیشانەی IPیە بەربەست کراوە.
+دوایین بابەتی لۆگی بەربەستن لە ژێرەوە ھاتووە:',
+'sp-contributions-search' => 'گەڕان بۆ بەشدارییەکان',
 'sp-contributions-username' => 'ناونیشانی ئای‌پی یان ناوی‌ بەکارھێنەری:',
 'sp-contributions-toponly' => 'تەنیا ئەو دەستکارییانە نیشانبدە کە دوایین پیاچوونەوەن',
 'sp-contributions-submit' => 'بگەڕێ',
@@ -2265,14 +2303,14 @@ $1',
 '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-hideimages' => '$1 بەستەرەکانی پەڕگە',
 'whatlinkshere-filters' => 'پاڵێوکەکان',
 
 # Block/unblock
-'block' => 'بەربەستکردنی بەکارهێنەر',
+'block' => 'بەربەستکردنی بەکارھێنەر',
 'unblock' => 'لە بەربەست‌دەرهێنانی بەکارهێنەر',
 'blockip' => 'بەربەستنی بەکارھێنەر',
 'blockip-title' => 'بەربەستکردنی بەکارهێنەر',
@@ -2292,16 +2330,18 @@ $1',
 **هەڵسووکەوت یان وتاری هاندەر بۆ توندوتیژی
 **بەکارهێنانی چەن هەژمارە پێکەوە
 **ناوی بەکارهێنەریی نەگونجاو',
-'ipbcreateaccount' => 'بەرگری لە درووست‌کردنی هەژمارە',
-'ipbemailban' => 'بەرگری لە ئی‌مەیل ناردنی بەکارهێنەر',
-'ipbenableautoblock' => 'خۆکار بەربەست‌کردنی ئەو ناونیشانی‌ ئای‌پیە وا ئەم بەکار‌هێنەرە کەڵکی لێ‌وەرگرتووە و ئەو ئای‌پی‌یانەی دیکە وا لەوێوە هەوڵی دەستکاری ئەدەن.',
-'ipbsubmit' => 'بەربەست‌کردنی ئەم بەکارهێنەرە',
+'ipb-hardblock' => 'بەرگری بەکارھێنەرانی تۆمارکراو بکە لە دەستکاریکردن لە ڕێگەی ناونیشانی ئەم IPیەوە',
+'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' => 'هۆکاری زیادکراو\\دیکە:',
+'ipbotherreason' => 'ھۆکاری تر/زیاتر:',
 'ipbhidename' => 'شاردنەوەی ناوی‌ بەکارهێنەر لە دەستکاری و لیستەکان',
-'ipbwatchuser' => 'دیتنی لاپەڕەی بەکارهێنەر و وتووێژی ئەم بەکارهێنەرە',
+'ipbwatchuser' => 'پەڕەکانی بەکارھێنەر و لێدوانی ئەم بەکارهێنەرە بخە ژێر چاودێری',
+'ipb-disableusertalk' => 'بەرگری ئەم بەکارھێنەرە بکە لە دستکاریکردنی پەڕەی لێدوانەکەی کاتێک بەربەست کراوە',
 'ipb-change-block' => 'دیسان بەربەست‌کردنەوەی ئەم بەکارهێنەرە بەم هەڵبژاردانە',
 'badipaddress' => 'ناونیشانی ئای‌پی نەگونجاو',
 'blockipsuccesssub' => 'بەربەست کردن سەرکەوتوو بوو',
@@ -2311,19 +2351,23 @@ $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-id' => 'بەربەستی $1 لابرا',
 'blocklist' => 'بەکارھێنەر بەربەستکراوەکان',
-'ipblocklist' => 'بەکارھێنەر بەربەستنکراوەکان',
+'ipblocklist' => 'بەکارھێنەر بەربەستکراوەکان',
 'ipblocklist-legend' => 'دۆزینەوەی بەکارهێنەرێکی بەربەست‌کراو',
+'blocklist-userblocks' => 'ھەژمارە بەربەستکراوەکان بشارەوە',
 'blocklist-target' => 'مەبەست',
 'blocklist-expiry' => 'ھەتا:',
+'blocklist-params' => 'پارامەترەکانی بەربەستن',
 'blocklist-reason' => 'ھۆکار',
 'ipblocklist-submit' => 'گەڕان',
+'ipblocklist-localblock' => 'بەرەبەستنی خۆماڵی',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|بەربەستنەکانی}} تر',
 'infiniteblock' => 'بێکۆتایی',
 'expiringblock' => 'لە $2، $1 ماوەی بەسەر دەچێ',
 'anononlyblock' => 'تەنها بۆ چەن سات',
@@ -2341,19 +2385,21 @@ $1',
 'autoblocker' => 'خۆکار بەربەست‌کراوە لەبەر ئەوەی ناونیشانی ئای‌پی تۆ لەم دواییانەدا لە لایەن "[[User:$1|$1]]" بەکار هاتووە.
 هۆکاری بەربەست‌کرانی $1 ئەمەیە: "$2"',
 'blocklogpage' => 'لۆگی بەربەستن',
-'blocklogentry' => '[[$1]] ئاستەنگ کرا بۆ ماوەی $2 $3',
+'blocklog-showlog' => 'ئەم بەکارھێنەرە پێشتر بربەست کراوە.
+لۆگی بەربەستن لە ژێرەوە ھاتووە:',
+'blocklogentry' => '[[$1]] بەربەست کرا بۆ ماوەی $2 $3',
 'reblock-logentry' => 'دۆخی ئاستەنگ کردنی [[$1]]  بۆ گۆڕدرا بۆ ماوەی $2 $3',
 'blocklogtext' => 'ئەمە لۆگێکی کردەوەکانی بەربەستن یان لابردنی بەربەستنی بەکارھێنەرە.
 ئەو ئایپی ئەدرەسانە خۆکارانە بەربستکراون بە ڕیز نەکراون.
 سەیری [[Special:BlockList|لیستی بەربەستن]] بکە بۆ بینینی ئەو بەرگری و بەربەستنانە ئێستا لە بەرکاردان.',
 'unblocklogentry' => 'بەربەستنی "$1" بەتاڵ کرا',
-'block-log-flags-anononly' => 'تەنها بەکارهێنەرە نەناسراوەکان',
-'block-log-flags-nocreate' => 'دروستکردنی ھەژمار ناچالاککراوە',
+'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' => 'شاردنەوەی ناوی‌بەکارهێنەری',
+'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' => 'بەربەستی ناوی‌بەکارهێنەرە شاراوەکان دەبێ پایەدار بێت.',
@@ -2361,6 +2407,7 @@ $1',
 'ipb_already_blocked' => '"$1" لە پێش‌دا بەربەست‌‌کراوە',
 'ipb-needreblock' => '"$1" لە پێش‌دا بەربەست‌‌کراوە.
 ئایا دەتەو‌ێ هەڵبژاردەکانی بگۆڕیت؟',
+'ipb-otherblocks-header' => '{{PLURAL:$1|بەربەستنەکانی}} تر',
 'ipb_cant_unblock' => 'پێناسەی بەربەست‌کردنی $1 نەدۆزرایەوە.
 لەوانەیە لە بەربەستی لابرابێت.',
 'ipb_blocked_as_range' => 'هەڵە: ئای‌پی $1 ڕاستەوخۆ بەربەست نەکراوە بۆیە ناکڕێت لە بەربەست لای‌ بەیت.
@@ -2376,6 +2423,7 @@ $1',
 'sorbs_create_account_reason' => 'ناونیشانی ئای‌پی تۆ لە DNSBLدا کە {{SITENAME}} کەڵکی لێ‌وەر دەگرێ، وەک پرۆکسیەکی کراوە لیست کراوە.
 بۆیە ناتوانی هەژمارە درووست‌بکەی.',
 'cant-block-while-blocked' => 'کاتێ خۆت بەربەست‌کراوی، ناتوانی بەکارهێنەرانی دیکە بەربەست بکەی.',
+'ipbblocked' => 'ناتوانی بەکارھێنەرانی تر بەربەست بکەی یان بکەیەوە، چون خۆت بەربەست کراوی.',
 
 # Developer tools
 'lockdb' => 'داخستنی بنکەدراوە',
@@ -2585,14 +2633,17 @@ $1',
 'import-logentry-interwiki' => 'ترانس‌ویکی‌کراو $1',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|پێداچوونەوە|پێداچوونەوە}} لە $2',
 
+# JavaScriptTest
+'javascripttest' => 'تاقیکردنەوەی جاڤاسکریپت',
+
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'پەڕە بەکارھێنەریی تۆ',
+'tooltip-pt-userpage' => 'پەڕەی بەکارھێنەرییەکەت',
 'tooltip-pt-anonuserpage' => 'پەڕەی بەکارھێنەری بۆ ئای‌پی یەکە کە بەناویەوە خەریکی دەستکاری کردنی',
-'tooltip-pt-mytalk' => 'Ù¾Û\95Ú\95Û\95Û\8c Ù\88تÙ\88بÛ\8eÚ\98Û\8c ØªÛ\86',
+'tooltip-pt-mytalk' => 'Ù¾Û\95Ú\95Û\95Û\8c Ù\84Û\8eدÙ\88اÙ\86Û\95Ú©Û\95ت',
 'tooltip-pt-anontalk' => 'لێدوان لەسەر دەستکارییەکان لەم ئایپی ئەدرەسەوە',
-'tooltip-pt-preferences' => 'بژاردەکانت',
+'tooltip-pt-preferences' => 'هەڵبژاردەکانت',
 'tooltip-pt-watchlist' => 'پێرستی ئەو پەڕانە کە چاودێریی گۆڕانکارییەکانیانی دەکەی',
-'tooltip-pt-mycontris' => 'Ù\84Û\8cستی بەشدارییەکانت',
+'tooltip-pt-mycontris' => 'Ù¾Û\8eرستی بەشدارییەکانت',
 'tooltip-pt-login' => 'پێشنیارت پێدەکرێ بچیتە ژوورەوە؛ ھەرچەندە زۆرت لێناکرێ',
 'tooltip-pt-anonlogin' => 'پێشنیار دەکەین بڕۆیتەژوورەوە، ئەگەرچی ئەوە زۆرەملیی نیە',
 'tooltip-pt-logout' => 'دەرچوون',
@@ -2620,14 +2671,14 @@ $1',
 'tooltip-n-recentchanges' => 'لیستی دوایین گۆڕانکارییەکان لەم ویکییەدا',
 'tooltip-n-randompage' => 'پەڕەیەک بە هەڵکەوت نیشان بدە',
 'tooltip-n-help' => 'شوێنی تێگەیشتن',
-'tooltip-t-whatlinkshere' => 'Ù\84Û\8cستÛ\8c Ú¾Û\95Ù\85Ù\88Ù\88 Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\88Û\8cÚ©Û\8c Ú©Û\95 Ø¨Û\95ستÛ\95رکراون بۆ ئێرە',
+'tooltip-t-whatlinkshere' => 'Ù¾Û\8eرستÛ\8c Ú¾Û\95Ù\85Ù\88Ù\88 Ù¾Û\95Ú\95Û\95کاÙ\86Û\8c Ù\88Û\8cÚ©Û\8c Ú©Û\95 Ø¨Û\95ستÛ\95ر Ø¯راون بۆ ئێرە',
 'tooltip-t-recentchangeslinked' => 'دوایین گۆڕانکارییەکان لەو پەڕانە کە بەگرەوە گرێ دراون',
 'tooltip-feed-rss' => 'RSS feed بۆ ئەم پەڕە',
 'tooltip-feed-atom' => 'Atom feed بۆ ئەم پەڕە',
 'tooltip-t-contributions' => 'لیستی بەشدارییەکانی ئەم بەکارھێنەرە ببینە',
 'tooltip-t-emailuser' => 'ئیمەیلێک بنێرە بۆ ئەم بەکارھێنەرە',
 'tooltip-t-upload' => 'پەڕگەیەک (فایل) بار بکە',
-'tooltip-t-specialpages' => 'Ù\84Û\8cستی ھەموو پەڕە تایبەتەکان',
+'tooltip-t-specialpages' => 'Ù¾Û\8eرستی ھەموو پەڕە تایبەتەکان',
 'tooltip-t-print' => 'وەشانی چاپی ئەم پەڕەیە',
 'tooltip-t-permalink' => 'گرێدەری ھەمیشەیی بۆ ئەم وەشانەی ئەم پەڕەیە',
 'tooltip-ca-nstab-main' => 'بینینی پەڕەی ناوەڕۆک',
@@ -2685,16 +2736,30 @@ $1',
 '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-recent-edits' => 'ژمارەی دوایین دەستکارییەکان (لە $1ی ڕابردوودا)',
+'pageinfo-recent-authors' => 'ژمارەی دوایین نووسەرە جیاوازەکان',
+'pageinfo-templates' => 'داڕێژە{{PLURAL:$1|ی بەکارگیراو| بەکارگیراوەکان}} ($1)',
+'pageinfo-toolboxlink' => 'زانیاریی پەڕە',
+'pageinfo-redirectsto-info' => 'زانیاری',
+'pageinfo-contentpage-yes' => 'بەڵێ',
+'pageinfo-protect-cascading-yes' => 'بەڵێ',
 
 # Skin names
 'skinname-standard' => 'کلاسیک',
@@ -2807,6 +2872,7 @@ $1',
 # EXIF tags
 'exif-imagewidth' => 'پانی',
 'exif-imagelength' => 'بەرزی',
+'exif-datetime' => 'ڕێکەوتی و کاتی گۆڕانی پەڕگە',
 'exif-imagedescription' => 'ناونیشانی وێنە',
 'exif-model' => 'جۆری کامێرا',
 'exif-software' => 'نەرمەواڵەی بەکارهاتوو',
@@ -2817,13 +2883,16 @@ $1',
 'exif-usercomment' => 'بۆچوونەکانی بەکارهێنەر',
 'exif-relatedsoundfile' => 'فایلی ده‌نگی لێکچوو',
 'exif-exposuretime-format' => '$1 چرکە ($2)',
+'exif-fnumber' => 'ڕێژەی ئێف',
 'exif-lightsource' => 'سەرچاوەی ڕووناکی',
 'exif-flash' => 'فلاش',
 'exif-filesource' => 'سەرچاوەی پەڕگە',
 'exif-saturation' => 'تێربوون',
 'exif-gpslatitude' => 'پانی',
 'exif-gpslongitude' => 'درێژی',
+'exif-gpsaltitude' => 'بەرزایی',
 'exif-gpstimestamp' => 'کاتی GPS (سەعاتی ئەتۆمی)',
+'exif-gpssatellites' => 'سەتەلایتەکانی بەکارگیراو بۆ پێوان',
 'exif-gpsmeasuremode' => 'جۆری پێوان',
 'exif-gpsdop' => 'وردی پێوان',
 'exif-gpsspeedref' => 'یەکەی خێرایی',
@@ -2832,7 +2901,17 @@ $1',
 'exif-gpsimgdirection' => 'ئاڕاستەی وێنە',
 'exif-gpsareainformation' => 'ناوی ناوچەی GPS',
 'exif-gpsdatestamp' => 'ڕێکەوتی GPS',
+'exif-jpegfilecomment' => 'تێبینیی پەڕگەی JPEG',
+'exif-worldregioncreated' => 'ناوچەی جیھانێک کە وێنەکە تێیدا گیراوە',
+'exif-countrycreated' => 'وڵاتێک کە وێنەکە تێیدا گیراوە',
+'exif-citycreated' => 'شارێک کە وێنەکە تێیدا گیراوە',
+'exif-worldregiondest' => 'ناوچەی جیھانی نیشان دراو',
+'exif-countrydest' => 'وڵاتی نیشان دراو',
+'exif-countrycodedest' => 'کۆدی وڵاتی نیشان دراو',
+'exif-provinceorstatedest' => 'پارێزگا یان ویلایەتی نیشان دراو',
+'exif-citydest' => 'شاری نیشان دراو',
 'exif-objectname' => 'سەردێری کورت',
+'exif-specialinstructions' => 'ڕیسای کاری تایبەت',
 'exif-headline' => 'سەردێر',
 'exif-source' => 'سەرچاوە',
 'exif-contact' => 'زانیاری پەیوەندیکردن',
@@ -2840,7 +2919,14 @@ $1',
 'exif-languagecode' => 'زمان',
 'exif-iimversion' => 'وەشانی IIM',
 'exif-iimcategory' => 'پۆل',
+'exif-lens' => 'لێنزی بەکارگیراو',
+'exif-serialnumber' => 'ژمارە زنجیرەی کامێرا',
+'exif-cameraownername' => 'خاوەنی کامێرا',
 'exif-copyrighted' => 'ڕەوشی مافی لەبەرگرتنەوە',
+'exif-pngfilecomment' => 'تێبینیی پەڕگەی PNG',
+'exif-contentwarning' => 'ھۆشداری ناوەرۆک',
+'exif-giffilecomment' => 'تێبینیی پەڕگەی GIF',
+'exif-intellectualgenre' => 'جۆری بابەت',
 
 # Make & model, can be wikified in order to link to the camera and model name
 'exif-subjectnewscode-value' => '$2 ($1)',
@@ -2848,6 +2934,9 @@ $1',
 # EXIF attributes
 'exif-compression-1' => 'نەپەستێنراو',
 
+'exif-copyrighted-true' => 'خاوەنی مافی بڵاوکردنەوە',
+'exif-copyrighted-false' => 'پاوانی گشتی',
+
 'exif-unknowndate' => 'ڕێکەوتی نەزانراو',
 
 'exif-orientation-1' => 'ئاسایی',
@@ -2858,6 +2947,7 @@ $1',
 'exif-componentsconfiguration-0' => 'بوونی نییە',
 
 'exif-exposureprogram-1' => 'دەستکار',
+'exif-exposureprogram-2' => 'بەرنامەی ئاسایی',
 
 'exif-subjectdistance-value' => '$1 مەتر',
 
@@ -2951,6 +3041,10 @@ $1',
 'exif-gpslongitude-e' => 'پانیی جوگرافیایی ڕۆژهەڵات',
 'exif-gpslongitude-w' => 'پانیی جوگرافیایی ڕۆژئاوا',
 
+# Pseudotags used for GPSAltitudeRef
+'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|مەتر}} بەرزتر لە ئاستی زەریا',
+'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|مەتر}} نزمتر لە ئاستی زەریا',
+
 # Pseudotags used for GPSSpeedRef
 'exif-gpsspeed-k' => 'کیلۆمەتر هەر کاتژمێر',
 'exif-gpsspeed-m' => 'مایل هەر کاتژمێر',
@@ -2962,6 +3056,14 @@ $1',
 
 'exif-gpsdop-good' => 'چاک ($1)',
 
+'exif-objectcycle-a' => 'تەنیا بەیانان',
+'exif-objectcycle-p' => 'تەنیا ئێواران',
+'exif-objectcycle-b' => 'بەیانان و ئێواران',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'لای دروست',
+
+'exif-dc-contributor' => 'بەشداربووان',
 'exif-dc-date' => 'ڕۆژ(ەکان)',
 'exif-dc-publisher' => 'بڵاوکار',
 'exif-dc-relation' => 'میدیای پەیوەندیدار',
@@ -2969,8 +3071,18 @@ $1',
 'exif-dc-source' => 'سەرچاوەی میدیا',
 'exif-dc-type' => 'جۆری میدیا',
 
+'exif-rating-rejected' => 'ڕەت کراوە',
+
+'exif-isospeedratings-overflow' => 'گەورەتر لە ٦٥٥٣٥',
+
+'exif-iimcategory-ace' => 'ھونەر، چاند و تاوژین',
+'exif-iimcategory-fin' => 'ئابووری و بازرگانی',
+'exif-iimcategory-edu' => 'فێرکاری',
+'exif-iimcategory-evn' => 'ژینگە',
 'exif-iimcategory-hth' => 'تەندروستی',
+'exif-iimcategory-lab' => 'کار',
 'exif-iimcategory-pol' => 'سیاسەت',
+'exif-iimcategory-rel' => 'ئایین و باوەڕ',
 'exif-iimcategory-sci' => 'زانست و تەکنۆلۆژیا',
 'exif-iimcategory-soi' => 'بابەتە کۆمەڵایەتییەکان',
 'exif-iimcategory-spo' => 'وەرزشەکان',
@@ -3167,6 +3279,9 @@ $5
 'hijri-calendar-m11' => 'زولقەعدە',
 'hijri-calendar-m12' => 'زولحەججە',
 
+# Hebrew month names
+'hebrew-calendar-m7-gen' => 'نیسان',
+
 # Signatures
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|لێدوان]])',
 'timezone-utc' => 'UTC',
@@ -3192,9 +3307,11 @@ $5
 'version-hook-subscribedby' => 'بەشداربوو لە لایەن',
 'version-version' => '(وەشانی $1)',
 'version-license' => 'مۆڵەت',
+'version-poweredby-others' => 'دیکە',
 'version-software' => 'نەرمەکاڵای دامەزراو',
 'version-software-product' => 'بەرهەم',
 'version-software-version' => 'وەشان',
+'version-entrypoints-header-url' => 'ناونیشانی ئینتەرنێتی',
 
 # Special:FilePath
 'filepath' => 'ڕێڕەوی پەڕگە',
@@ -3212,6 +3329,7 @@ $5
 'fileduplicatesearch-info' => '$1 × $2 پیکسەل<br />قەبارەی پەڕگە: $3<br />MIME جۆری: $4',
 'fileduplicatesearch-result-1' => 'پەڕگەی "$1" دووپاتکراوەیەکی کوتوموتی نییە.',
 'fileduplicatesearch-result-n' => 'پەڕگەی «$1» {{PLURAL:$2|١ دووپاتکراوەی کوتوموتی|$2 دووپاتکراوەی کوتوموتی}} ھەیە.',
+'fileduplicatesearch-noresults' => 'پەڕگەیەک بە ناوی «$1» نەدۆزرایەوە.',
 
 # Special:SpecialPages
 'specialpages' => 'پەڕە تایبەتەکان',
@@ -3266,6 +3384,7 @@ $5
 'compare-rev1' => 'پێداچوونەوەی ١',
 'compare-rev2' => 'پێداچوونەوەی ٢',
 'compare-submit' => 'ھەڵسەنگاندن',
+'compare-invalid-title' => 'ئەم سەردێڕە دەستنیشانت کردووە نادروستە.',
 
 # Database error messages
 'dberr-header' => 'ئەم ویکی‌یە کێشەی هەیە',
@@ -3291,8 +3410,13 @@ $5
 'logentry-delete-delete' => '$1 پەڕەی $3ی سڕییەوە',
 'logentry-delete-restore' => '$1 پەڕەی $3ی ھێنایەوە',
 'logentry-delete-revision' => '$1 دەرکەوتنی {{PLURAL:$5|پێداچوونەوەیەکی|$5 پێداچوونەوەی}} پەڕەی $3 گۆڕیی: $4',
+'logentry-suppress-delete' => '$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',
@@ -3312,10 +3436,17 @@ $5
 'feedback-submit' => 'تێبینییەکان بنێرە',
 'feedback-close' => 'ئەنجام درا',
 
+# Search suggestions
+'searchsuggest-search' => 'گەڕان',
+'searchsuggest-containing' => 'بە لەبەرگرتنەوەی ...',
+
 # API errors
+'api-error-empty-file' => 'ئەو پەڕگەیە کە ناردووتە واڵا بوو.',
+'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-illegal-filename' => 'ناوی پەڕگە رێگەپێ‌نەدراوە.',
 'api-error-unclassified' => 'ھەڵەیەکی نەزانراو ڕوویداوە.',
 'api-error-unknown-code' => 'ھەڵەی نەزانراو: «$1».',
 'api-error-unknownerror' => 'ھەڵەی نەزانراو: «$1».',
index 91b6cc4..c4cad31 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Corsican (Corsu)
+/** Corsican (corsu)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
 
 $messages = array(
 'underline-always' => 'Sempre',
-'underline-never'  => 'Mai',
+'underline-never' => 'Mai',
 
 # Dates
-'sunday'        => 'dumenica',
-'monday'        => 'luni',
-'tuesday'       => 'marti',
-'wednesday'     => 'mercuri',
-'thursday'      => 'ghjovi',
-'friday'        => 'venneri',
-'saturday'      => 'sabbatu',
-'sun'           => 'dum',
-'mon'           => 'lun',
-'tue'           => 'mar',
-'wed'           => 'mer',
-'thu'           => 'ghj',
-'fri'           => 'ven',
-'sat'           => 'sab',
-'january'       => 'ghjennaghju',
-'february'      => 'ferraghju',
-'march'         => 'marzu',
-'april'         => 'aprile',
-'may_long'      => 'maghju',
-'june'          => 'ghjugnu',
-'july'          => 'lugliu',
-'august'        => 'aostu',
-'september'     => 'settembre',
-'october'       => 'ottobre',
-'november'      => 'nuvembre',
-'december'      => 'dicembre',
-'january-gen'   => 'ghjennaghju',
-'february-gen'  => 'ferraghju',
-'march-gen'     => 'marzu',
-'april-gen'     => 'aprile',
-'may-gen'       => 'maghju',
-'june-gen'      => 'ghjugnu',
-'july-gen'      => 'lugliu',
-'august-gen'    => 'aostu',
+'sunday' => 'dumenica',
+'monday' => 'luni',
+'tuesday' => 'marti',
+'wednesday' => 'mercuri',
+'thursday' => 'ghjovi',
+'friday' => 'venneri',
+'saturday' => 'sabbatu',
+'sun' => 'dum',
+'mon' => 'lun',
+'tue' => 'mar',
+'wed' => 'mer',
+'thu' => 'ghj',
+'fri' => 'ven',
+'sat' => 'sab',
+'january' => 'ghjennaghju',
+'february' => 'ferraghju',
+'march' => 'marzu',
+'april' => 'aprile',
+'may_long' => 'maghju',
+'june' => 'ghjugnu',
+'july' => 'lugliu',
+'august' => 'aostu',
+'september' => 'settembre',
+'october' => 'ottobre',
+'november' => 'nuvembre',
+'december' => 'dicembre',
+'january-gen' => 'ghjennaghju',
+'february-gen' => 'ferraghju',
+'march-gen' => 'marzu',
+'april-gen' => 'aprile',
+'may-gen' => 'maghju',
+'june-gen' => 'ghjugnu',
+'july-gen' => 'lugliu',
+'august-gen' => 'aostu',
 'september-gen' => 'settembre',
-'october-gen'   => 'ottobre',
-'november-gen'  => 'nuvembre',
-'december-gen'  => 'dicembre',
-'jan'           => 'ghje',
-'feb'           => 'fer',
-'mar'           => 'mar',
-'apr'           => 'apr',
-'may'           => 'mag',
-'jun'           => 'ghju',
-'jul'           => 'lug',
-'aug'           => 'aos',
-'sep'           => 'set',
-'oct'           => 'ott',
-'nov'           => 'nuv',
-'dec'           => 'dic',
+'october-gen' => 'ottobre',
+'november-gen' => 'nuvembre',
+'december-gen' => 'dicembre',
+'jan' => 'ghje',
+'feb' => 'fer',
+'mar' => 'mar',
+'apr' => 'apr',
+'may' => 'mag',
+'jun' => 'ghju',
+'jul' => 'lug',
+'aug' => 'aos',
+'sep' => 'set',
+'oct' => 'ott',
+'nov' => 'nuv',
+'dec' => 'dic',
 
 # Categories related messages
-'pagecategories'  => '{{PLURAL:$1|Categuria|Categurie}}',
+'pagecategories' => '{{PLURAL:$1|Categuria|Categurie}}',
 'category_header' => 'Articuli in a categuria "$1"',
-'subcategories'   => 'Sottucategurie',
-
-'about'      => 'À prupositu',
-'article'    => 'Articulu',
-'cancel'     => 'Annullà',
-'mypage'     => 'A mo pagina',
-'mytalk'     => 'E mo discussioni',
-'anontalk'   => 'Discussione per istu indirizzu IP',
+'subcategories' => 'Sottucategurie',
+
+'about' => 'À prupositu',
+'article' => 'Articulu',
+'cancel' => 'Annullà',
+'mypage' => 'A mo pagina',
+'mytalk' => 'E mo discussioni',
+'anontalk' => 'Discussione per istu indirizzu IP',
 'navigation' => 'Navigazione',
-'and'        => '&#32;è',
+'and' => '&#32;è',
 
 # Cologne Blue skin
-'qbpageoptions'  => 'Issa pagina',
-'qbpageinfo'     => 'Cuntestu',
-'qbmyoptions'    => 'E mo pagine',
+'qbpageoptions' => 'Issa pagina',
+'qbpageinfo' => 'Cuntestu',
+'qbmyoptions' => 'E mo pagine',
 'qbspecialpages' => 'Pagine spiciale',
 
 # Vector skin
-'vector-action-delete'  => 'Supprimà',
+'vector-action-delete' => 'Supprimà',
 'vector-action-protect' => 'Pruteghje',
-'vector-view-edit'      => 'Mudificà',
-
-'errorpagetitle'   => 'Errore',
-'returnto'         => 'Vultà à $1.',
-'help'             => 'Aiutu',
-'search'           => 'Ricerca',
-'searchbutton'     => 'Ricerca',
-'searcharticle'    => 'Và',
-'history'          => 'Cronolugia',
-'history_short'    => 'Cronolugia',
-'permalink'        => 'Ligame permanente',
-'print'            => 'Stampà',
-'edit'             => 'Mudificà',
-'create'           => 'Creà',
-'delete'           => 'Supprimà',
-'deletethispage'   => 'Cancellà issa pagina',
-'protect'          => 'Pruteghje',
-'protectthispage'  => 'Pruteghje issa pagina',
-'newpage'          => 'Pagina nova',
+'vector-view-edit' => 'Mudificà',
+
+'errorpagetitle' => 'Errore',
+'returnto' => 'Vultà à $1.',
+'help' => 'Aiutu',
+'search' => 'Ricerca',
+'searchbutton' => 'Ricerca',
+'searcharticle' => 'Và',
+'history' => 'Cronolugia',
+'history_short' => 'Cronolugia',
+'permalink' => 'Ligame permanente',
+'print' => 'Stampà',
+'edit' => 'Mudificà',
+'create' => 'Creà',
+'delete' => 'Supprimà',
+'deletethispage' => 'Cancellà issa pagina',
+'protect' => 'Pruteghje',
+'protectthispage' => 'Pruteghje issa pagina',
+'newpage' => 'Pagina nova',
 'talkpagelinktext' => 'discussione',
-'specialpage'      => 'Pagina speciale',
-'articlepage'      => "Vede l'articulu",
-'talk'             => 'Discussione',
-'toolbox'          => 'Stuvigli',
-'userpage'         => 'Vede a pagina di utilizatore',
-'otherlanguages'   => 'In altri lingui',
-'lastmodifiedat'   => 'Ultima mudifica di ista pagina u $1 à e $2.',
-'protectedpage'    => 'Pagina prutetta',
+'specialpage' => 'Pagina speciale',
+'articlepage' => "Vede l'articulu",
+'talk' => 'Discussione',
+'toolbox' => 'Stuvigli',
+'userpage' => 'Vede a pagina di utilizatore',
+'otherlanguages' => 'In altri lingui',
+'lastmodifiedat' => 'Ultima mudifica di ista pagina u $1 à e $2.',
+'protectedpage' => 'Pagina prutetta',
 'jumptonavigation' => 'navigazione',
-'jumptosearch'     => 'ricerca',
+'jumptosearch' => 'ricerca',
 
 # 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'            => 'À prupositu di {{SITENAME}}',
-'aboutpage'            => 'Project:À prupositu',
-'currentevents'        => 'Ultimi evenimenti',
-'currentevents-url'    => 'Project:Ultimi evenimenti',
-'disclaimers'          => 'Avertimenti',
-'disclaimerpage'       => 'Project:Avertimenti generali',
-'mainpage'             => 'Pagina maestra',
+'aboutsite' => 'À prupositu di {{SITENAME}}',
+'aboutpage' => 'Project:À prupositu',
+'currentevents' => 'Ultimi evenimenti',
+'currentevents-url' => 'Project:Ultimi evenimenti',
+'disclaimers' => 'Avertimenti',
+'disclaimerpage' => 'Project:Avertimenti generali',
+'mainpage' => 'Pagina maestra',
 'mainpage-description' => 'Pagina maestra',
-'portal'               => 'Purtone di a cumunità',
-'portal-url'           => 'Project:Purtone di a cumunità',
-'privacy'              => 'Pulitica pè a riservatezza',
-'privacypage'          => 'Project:Pulitica pè a riservatezza',
+'portal' => 'Purtone di a cumunità',
+'portal-url' => 'Project:Purtone di a cumunità',
+'privacy' => 'Pulitica pè a riservatezza',
+'privacypage' => 'Project:Pulitica pè a riservatezza',
 
 'versionrequired' => 'A version $1 di MediaWiki hè necessaria',
 
 'newmessagesdifflink' => 'ultima mudifica',
-'editsection'         => 'mudificà',
-'editold'             => 'mudificà',
-'editlink'            => 'mudificà',
-'toc'                 => 'Cuntenutu',
-'showtoc'             => 'mustrà',
-'hidetoc'             => 'piattà',
-'feed-atom'           => 'Atomu',
+'editsection' => 'mudificà',
+'editold' => 'mudificà',
+'editlink' => 'mudificà',
+'toc' => 'Cuntenutu',
+'showtoc' => 'mustrà',
+'hidetoc' => 'piattà',
+'feed-atom' => 'Atomu',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Articulu',
-'nstab-user'      => 'Utilizatore',
-'nstab-image'     => 'Schedariu',
+'nstab-main' => 'Articulu',
+'nstab-user' => 'Utilizatore',
+'nstab-image' => 'Schedariu',
 'nstab-mediawiki' => 'Messaghju',
-'nstab-template'  => 'Mudellu',
-'nstab-help'      => "Pagina d'aiutu",
-'nstab-category'  => 'Categuria',
+'nstab-template' => 'Mudellu',
+'nstab-help' => "Pagina d'aiutu",
+'nstab-category' => 'Categuria',
 
 # General errors
-'error'         => 'Errore',
+'error' => 'Errore',
 'internalerror' => 'Errore internu',
 
 # Login and logout pages
-'yourname'                   => 'Nome di utilizatore:',
-'yourpassword'               => 'Parulla secreta:',
-'yourpasswordagain'          => 'Scrive torna a parulla secreta:',
-'yourdomainname'             => 'U to duminiu:',
-'login'                      => 'Cunnessione',
-'userlogin'                  => 'Cunnessione / Registramentu',
-'logout'                     => 'Scunnessione',
-'userlogout'                 => 'Scunnessione',
-'nologinlink'                => 'Registramentu',
-'createaccount'              => 'Registramentu',
-'gotaccountlink'             => 'Cunnessione',
-'createaccountreason'        => 'Mutivu:',
-'loginsuccesstitle'          => 'Cunnessione fatta',
+'yourname' => 'Nome di utilizatore:',
+'yourpassword' => 'Parulla secreta:',
+'yourpasswordagain' => 'Scrive torna a parulla secreta:',
+'yourdomainname' => 'U to duminiu:',
+'login' => 'Cunnessione',
+'userlogin' => 'Cunnessione / Registramentu',
+'logout' => 'Scunnessione',
+'userlogout' => 'Scunnessione',
+'nologinlink' => 'Registramentu',
+'createaccount' => 'Registramentu',
+'gotaccountlink' => 'Cunnessione',
+'createaccountreason' => 'Mutivu:',
+'loginsuccesstitle' => 'Cunnessione fatta',
 'acct_creation_throttle_hit' => "Desulatu, ai digià fattu $1 registramenti. Ùn ne poi micca fà d'altri.",
-'accountcreated'             => 'Registramentu fattu',
-'accountcreatedtext'         => "U registramentu di l'utilizatore $1 hè statu fattu.",
-'loginlanguagelabel'         => 'Lingua: $1',
+'accountcreated' => 'Registramentu fattu',
+'accountcreatedtext' => "U registramentu di l'utilizatore $1 hè statu fattu.",
+'loginlanguagelabel' => 'Lingua: $1',
 
 # Change password dialog
 'retypenew' => 'Scrive torna a nova parulla secreta:',
@@ -185,39 +185,39 @@ $messages = array(
 'image_sample' => 'Esempiu.jpg',
 
 # Edit pages
-'minoredit'              => 'Mudifica minore',
-'savearticle'            => 'Arrighjistrà a pagina',
-'showdiff'               => 'Mustrà i cambiamenti',
-'anoneditwarning'        => "'''Attenzione''': ùn sè micca un utilizatore registratu, oppuru ùn ai fattu a cunnessione.
+'minoredit' => 'Mudifica minore',
+'savearticle' => 'Arrighjistrà a pagina',
+'showdiff' => 'Mustrà i cambiamenti',
+'anoneditwarning' => "'''Attenzione''': ùn sè micca un utilizatore registratu, oppuru ùn ai fattu a cunnessione.
 U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
-'loginreqlink'           => 'cunnessione',
-'accmailtitle'           => 'Parulla secreta inviata.',
-'accmailtext'            => 'A parulla secreta per "$1" hè stata inviata à l\'indirizzu $2.',
-'editing'                => 'Mudifica di $1',
-'editingsection'         => 'Mudifica di $1 (sezzione)',
-'editingcomment'         => 'Mudifica di $1 (cummentu)',
-'editconflict'           => 'Cunflittu di mudificazione: $1',
-'yourtext'               => 'U to testu',
-'yourdiff'               => 'Differenze',
-'template-protected'     => '(prutettu)',
+'loginreqlink' => 'cunnessione',
+'accmailtitle' => 'Parulla secreta inviata.',
+'accmailtext' => 'A parulla secreta per "$1" hè stata inviata à l\'indirizzu $2.',
+'editing' => 'Mudifica di $1',
+'editingsection' => 'Mudifica di $1 (sezzione)',
+'editingcomment' => 'Mudifica di $1 (cummentu)',
+'editconflict' => 'Cunflittu di mudificazione: $1',
+'yourtext' => 'U to testu',
+'yourdiff' => 'Differenze',
+'template-protected' => '(prutettu)',
 'template-semiprotected' => '(mezu prutettu)',
-'nocreatetitle'          => 'Creazione di pagina limitata',
+'nocreatetitle' => 'Creazione di pagina limitata',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Registramentu micca pussibile',
 
 # History pages
-'currentrev'  => 'Ultima revisione',
-'page_first'  => 'prima',
-'histfirst'   => 'Prima',
-'histlast'    => 'Ultima',
+'currentrev' => 'Ultima revisione',
+'page_first' => 'prima',
+'histfirst' => 'Prima',
+'histlast' => 'Ultima',
 'historysize' => '({{PLURAL:$1|1 ottettu|$1 ottetti}})',
 
 # Revision feed
 'history-feed-title' => 'Cronolugia di e revisione',
 
 # Revision deletion
-'rev-delundel'  => 'mustrà/piattà',
+'rev-delundel' => 'mustrà/piattà',
 'revdelete-log' => 'Mutivu:',
 
 # History merging
@@ -225,90 +225,90 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 
 # Search results
 'searchresults' => 'Risultati di a ricerca',
-'powersearch'   => 'Ricerca',
+'powersearch' => 'Ricerca',
 
 # Preferences page
-'preferences'       => 'Preferenze',
-'mypreferences'     => 'Preferenze',
-'prefs-rc'          => 'Ultimi cambiamenti',
-'prefs-watchlist'   => 'Articuli seguitati',
-'columns'           => 'Culonne:',
+'preferences' => 'Preferenze',
+'mypreferences' => 'Preferenze',
+'prefs-rc' => 'Ultimi cambiamenti',
+'prefs-watchlist' => 'Articuli seguitati',
+'columns' => 'Culonne:',
 'searchresultshead' => 'Ricerca',
-'localtime'         => 'Ora lucale',
-'allowemail'        => 'Abilità a ricezzione di e-mail da altri utilizatori',
-'prefs-files'       => 'Schedarii',
-'youremail'         => 'Indirizzu e-mail:',
-'yourrealname'      => 'U to veru nome:',
-'yourlanguage'      => "Lingua di l'interfaccia:",
-'yourvariant'       => 'Variante',
-'yournick'          => 'Signatura pè e discussioni:',
+'localtime' => 'Ora lucale',
+'allowemail' => 'Abilità a ricezzione di e-mail da altri utilizatori',
+'prefs-files' => 'Schedarii',
+'youremail' => 'Indirizzu e-mail:',
+'yourrealname' => 'U to veru nome:',
+'yourlanguage' => "Lingua di l'interfaccia:",
+'yourvariant' => 'Variante',
+'yournick' => 'Signatura pè e discussioni:',
 
 # User rights
-'editinguser'             => "Mudifica di '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Mudifica di '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]]{{int:pipe-separator}}[[Special:Contributions/$1|{{int:contribslink}}]])",
 'userrights-groupsmember' => 'Membru di:',
-'userrights-reason'       => 'Mutivu:',
+'userrights-reason' => 'Mutivu:',
 
 # Groups
-'group'            => 'Gruppu:',
-'group-bot'        => 'Boti',
-'group-sysop'      => 'Amministratori',
+'group' => 'Gruppu:',
+'group-bot' => 'Boti',
+'group-sysop' => 'Amministratori',
 'group-bureaucrat' => 'Burocrati',
-'group-all'        => '(tutti)',
+'group-all' => '(tutti)',
 
-'group-bot-member'        => 'Botu',
-'group-sysop-member'      => 'Amministratore',
+'group-bot-member' => 'Botu',
+'group-sysop-member' => 'Amministratore',
 'group-bureaucrat-member' => 'Burocratu',
 
-'grouppage-bot'        => '{{ns:project}}:Boti',
-'grouppage-sysop'      => '{{ns:project}}:Amministratori',
+'grouppage-bot' => '{{ns:project}}:Boti',
+'grouppage-sysop' => '{{ns:project}}:Amministratori',
 'grouppage-bureaucrat' => '{{ns:project}}:Burocrati',
 
 # Recent changes
-'recentchanges'   => 'Ultimi cambiamenti',
-'rcnotefrom'      => "Quì sò discritti i cambiamenti dipoi <b>$2</b> (sin'à <b>$1</b>).",
-'rclistfrom'      => 'Mustrà i cambiamenti dipoi $1',
+'recentchanges' => 'Ultimi cambiamenti',
+'rcnotefrom' => "Quì sò discritti i cambiamenti dipoi <b>$2</b> (sin'à <b>$1</b>).",
+'rclistfrom' => 'Mustrà i cambiamenti dipoi $1',
 'rcshowhideminor' => '$1 i cambiamenti minori',
-'rcshowhidebots'  => '$1 i boti',
-'rcshowhideliu'   => "$1 l'utilizatori registrati",
+'rcshowhidebots' => '$1 i boti',
+'rcshowhideliu' => "$1 l'utilizatori registrati",
 'rcshowhideanons' => '$1 i cuntributori anonimi',
-'rcshowhidemine'  => '$1 e mo cuntribuzioni',
-'rclinks'         => 'Mustrà ultimi $1 cambiamenti in i $2 ghjorni scorsi<br />$3',
-'hist'            => 'cron',
-'hide'            => 'piattà',
-'show'            => 'mustrà',
+'rcshowhidemine' => '$1 e mo cuntribuzioni',
+'rclinks' => 'Mustrà ultimi $1 cambiamenti in i $2 ghjorni scorsi<br />$3',
+'hist' => 'cron',
+'hide' => 'piattà',
+'show' => 'mustrà',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Cambiamenti assuciati',
-'recentchangeslinked-feed'    => 'Cambiamenti assuciati',
+'recentchangeslinked' => 'Cambiamenti assuciati',
+'recentchangeslinked-feed' => 'Cambiamenti assuciati',
 'recentchangeslinked-toolbox' => 'Cambiamenti assuciati',
 
 # Upload
-'upload'     => 'Incaricà un schedariu',
-'uploadbtn'  => 'Incaricà un schedariu',
-'filename'   => 'Nome di u schedariu',
+'upload' => 'Incaricà un schedariu',
+'uploadbtn' => 'Incaricà un schedariu',
+'filename' => 'Nome di u schedariu',
 'filestatus' => "Statu di u dirittu d'autore:",
 
 'upload-file-error' => 'Errore internu',
 
 # Special:ListFiles
-'imgfile'        => 'schedariu',
+'imgfile' => 'schedariu',
 'listfiles_date' => 'Data',
 'listfiles_name' => 'Nome',
 'listfiles_user' => 'Utilizatore',
 
 # File description page
-'file-anchor-link'   => 'Schedariu',
-'filehist'           => "Cronolugia di l'imagine",
+'file-anchor-link' => 'Schedariu',
+'filehist' => "Cronolugia di l'imagine",
 'filehist-deleteone' => 'supprimà',
-'filehist-user'      => 'Utilizatore',
-'imagelinks'         => 'Ligami',
+'filehist-user' => 'Utilizatore',
+'imagelinks' => 'Ligami',
 
 # File reversion
 'filerevert-comment' => 'Mutivu:',
 
 # File deletion
 'filedelete-comment' => 'Mutivu:',
-'filedelete-submit'  => 'Supprimà',
+'filedelete-submit' => 'Supprimà',
 
 # Unused templates
 'unusedtemplateswlh' => 'altri ligami',
@@ -317,39 +317,39 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'randompage' => 'Pagina à casu',
 
 # Statistics
-'statistics'              => 'Statistiche',
+'statistics' => 'Statistiche',
 'statistics-header-users' => "Statistiche nant'à l'utilizatori",
 
 'brokenredirects-edit' => 'mudificà',
 
 # Miscellaneous special pages
-'ncategories'       => '$1 {{PLURAL:$1|categuria|categurie}}',
+'ncategories' => '$1 {{PLURAL:$1|categuria|categurie}}',
 'specialpage-empty' => 'Issa pagina hè biota.',
-'popularpages'      => 'Pagine populare',
-'shortpages'        => 'Pagine corte',
-'longpages'         => 'Pagine longhe',
-'protectedpages'    => 'Pagine prutette',
-'listusers'         => 'Listinu di i cuntributori',
-'newpages'          => 'Pagine nove',
-'ancientpages'      => 'Pagine vechje',
+'popularpages' => 'Pagine populare',
+'shortpages' => 'Pagine corte',
+'longpages' => 'Pagine longhe',
+'protectedpages' => 'Pagine prutette',
+'listusers' => 'Listinu di i cuntributori',
+'newpages' => 'Pagine nove',
+'ancientpages' => 'Pagine vechje',
 
 # Special:Log
-'specialloguserlabel'  => 'Utilizatore:',
+'specialloguserlabel' => 'Utilizatore:',
 'speciallogtitlelabel' => 'Titulu:',
-'all-logs-page'        => "Tutte l'azzioni",
+'all-logs-page' => "Tutte l'azzioni",
 
 # Special:AllPages
-'allpages'          => 'Tutte e pagine',
-'alphaindexline'    => 'da $1 à $2',
-'allpagesfrom'      => 'Mustrà e pagine à parte da:',
-'allarticles'       => "Tutti l'articuli",
-'allinnamespace'    => 'Tutte e pagine di u spaziu $1',
+'allpages' => 'Tutte e pagine',
+'alphaindexline' => 'da $1 à $2',
+'allpagesfrom' => 'Mustrà e pagine à parte da:',
+'allarticles' => "Tutti l'articuli",
+'allinnamespace' => 'Tutte e pagine di u spaziu $1',
 'allnotinnamespace' => 'Tutte e pagine micca di u spaziu $1',
-'allpagesprev'      => 'Precedenti',
-'allpagesnext'      => 'Seguenti',
-'allpagessubmit'    => 'Và',
-'allpagesprefix'    => 'Mustrà e pagine chì cumincianu cù:',
-'allpages-bad-ns'   => 'U spaziu "$1" ùn esiste micca nant\'à {{SITENAME}}',
+'allpagesprev' => 'Precedenti',
+'allpagesnext' => 'Seguenti',
+'allpagessubmit' => 'Và',
+'allpagesprefix' => 'Mustrà e pagine chì cumincianu cù:',
+'allpages-bad-ns' => 'U spaziu "$1" ùn esiste micca nant\'à {{SITENAME}}',
 
 # Special:Categories
 'categories' => 'Categurie',
@@ -362,59 +362,59 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'listusers-submit' => 'Mustrà',
 
 # E-mail user
-'emailto'      => 'À:',
+'emailto' => 'À:',
 'emailsubject' => 'Sughjettu:',
 'emailmessage' => 'Messaghju:',
-'emailsend'    => 'Invià',
+'emailsend' => 'Invià',
 
 # Watchlist
-'watchlist'   => 'Articuli seguitati',
+'watchlist' => 'Articuli seguitati',
 'mywatchlist' => 'Articuli seguitati',
-'watch'       => 'Seguità',
+'watch' => 'Seguità',
 
-'enotif_reset'       => 'Marcà tutte e pagine visitate',
+'enotif_reset' => 'Marcà tutte e pagine visitate',
 'enotif_newpagetext' => 'Ista hè una pagina nova.',
-'changed'            => 'cambiatu',
-'created'            => 'creatu',
+'changed' => 'cambiatu',
+'created' => 'creatu',
 
 # Delete
-'deletepage'      => 'Supprimà a pagina',
-'excontent'       => "u cuntenutu era: '$1'",
+'deletepage' => 'Supprimà a pagina',
+'excontent' => "u cuntenutu era: '$1'",
 'excontentauthor' => "u cuntenutu era: '$1' (è u solu cuntributore era '[[Special:Contributions/$2|$2]]')",
-'exblank'         => 'a pagina era biota',
-'delete-legend'   => 'Supprimà',
-'actioncomplete'  => 'Azzione compia',
-'deletecomment'   => 'Mutivu:',
+'exblank' => 'a pagina era biota',
+'delete-legend' => 'Supprimà',
+'actioncomplete' => 'Azzione compia',
+'deletecomment' => 'Mutivu:',
 
 # Protect
-'protectedarticle'            => 'prutettu "[[$1]]"',
-'prot_1movedto2'              => 'hà mossu [[$1]] à [[$2]]',
-'protect-legend'              => 'Cunfirmà a prutezzione',
-'protectcomment'              => 'Mutivu:',
+'protectedarticle' => 'prutettu "[[$1]]"',
+'prot_1movedto2' => 'hà mossu [[$1]] à [[$2]]',
+'protect-legend' => 'Cunfirmà a prutezzione',
+'protectcomment' => 'Mutivu:',
 'protect-level-autoconfirmed' => 'Bluccà i cuntributori micca arrighjistrati',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'Mudificà',
+'restriction-edit' => 'Mudificà',
 'restriction-create' => 'Creà',
 
 # Restriction levels
 'restriction-level-autoconfirmed' => 'mezu prutettu',
 
 # Undelete
-'viewdeletedpage'        => 'Fighjulà e p agine supprimate',
-'undeletecomment'        => 'Mutivu:',
-'undelete-search-box'    => 'Circà e pagine supprimate',
+'viewdeletedpage' => 'Fighjulà e p agine supprimate',
+'undeletecomment' => 'Mutivu:',
+'undelete-search-box' => 'Circà e pagine supprimate',
 'undelete-search-submit' => 'Ricerca',
 
 # Namespace form on various pages
-'namespace'      => 'Spaziu:',
+'namespace' => 'Spaziu:',
 'blanknamespace' => '(Principale)',
 
 # Contributions
 'contributions' => "Cuntribuzioni di l'utilizatore",
-'mycontris'     => 'E mo cuntribuzioni',
-'contribsub2'   => 'Per $1 ($2)',
-'month'         => 'Da u mese (è nanzu):',
+'mycontris' => 'E mo cuntribuzioni',
+'contribsub2' => 'Per $1 ($2)',
+'month' => 'Da u mese (è nanzu):',
 
 'sp-contributions-talk' => 'discussione',
 
@@ -422,83 +422,83 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 'istemplate' => 'inclusione',
 
 # Block/unblock
-'ipadressorusername'       => 'Adrizzu IP o nome di cuntributore',
-'ipbreason'                => 'Mutivu:',
-'blocklist-reason'         => 'Mutivu',
-'ipblocklist-submit'       => 'Ricerca',
-'anononlyblock'            => 'solu i cuntributori anonimi',
-'blocklink'                => 'bluccà',
-'unblocklink'              => 'sbluccà',
-'contribslink'             => 'cuntribuzioni',
+'ipadressorusername' => 'Adrizzu IP o nome di cuntributore',
+'ipbreason' => 'Mutivu:',
+'blocklist-reason' => 'Mutivu',
+'ipblocklist-submit' => 'Ricerca',
+'anononlyblock' => 'solu i cuntributori anonimi',
+'blocklink' => 'bluccà',
+'unblocklink' => 'sbluccà',
+'contribslink' => 'cuntribuzioni',
 'block-log-flags-anononly' => 'solu cuntributori anonimi',
 'block-log-flags-nocreate' => 'registramentu pruibitu',
-'proxyblocksuccess'        => 'Hè fattu.',
+'proxyblocksuccess' => 'Hè fattu.',
 
 # Move page
-'move-page-legend'        => 'Move a pagina',
-'movearticle'             => 'Move a pagina',
-'move-watch'              => 'Fighjulà issa pagina',
-'movepagebtn'             => 'Move a pagina',
-'movedto'                 => 'mossu à',
-'movelogpagetext'         => 'Elencu di e pagine mosse.',
-'movereason'              => 'Mutivu:',
+'move-page-legend' => 'Move a pagina',
+'movearticle' => 'Move a pagina',
+'move-watch' => 'Fighjulà issa pagina',
+'movepagebtn' => 'Move a pagina',
+'movedto' => 'mossu à',
+'movelogpagetext' => 'Elencu di e pagine mosse.',
+'movereason' => 'Mutivu:',
 'delete_and_move_confirm' => 'Iè, supprimà issa pagina',
 
 # Export
-'export'        => 'Espurtà pagine',
+'export' => 'Espurtà pagine',
 'export-submit' => 'Espurtà',
 'export-addcat' => 'Aghjunghje',
 
 # Namespace 8 related
-'allmessages'               => 'Messaghji di sistemu',
-'allmessagesname'           => 'Nome',
-'allmessagesdefault'        => 'Testu prestabilitu',
-'allmessagescurrent'        => 'Testu attuale',
-'allmessagestext'           => 'Istu hè u listinu di tutti i messaghji dispunibili in u spaziu MediaWiki.',
+'allmessages' => 'Messaghji di sistemu',
+'allmessagesname' => 'Nome',
+'allmessagesdefault' => 'Testu prestabilitu',
+'allmessagescurrent' => 'Testu attuale',
+'allmessagestext' => 'Istu hè u listinu di tutti i messaghji dispunibili in u spaziu MediaWiki.',
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' ùn hè dispunibile perchè '''\$wgUseDatabaseMessages''' ùn hè micca attivu.",
 
 # Special:Import
 'import-interwiki-submit' => 'Impurtà',
-'importnopages'           => 'Micca pagine da impurtà.',
-'importfailed'            => 'Importu fiascatu: $1',
+'importnopages' => 'Micca pagine da impurtà.',
+'importfailed' => 'Importu fiascatu: $1',
 
 # Import log
-'importlogpage'                 => 'Importu log',
+'importlogpage' => 'Importu log',
 'import-logentry-upload-detail' => '$1 {{PLURAL:$1|revisione|revisione}}',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'    => 'A to pagina di utilizatore',
-'tooltip-pt-mytalk'      => 'A to pagina di discussione',
+'tooltip-pt-userpage' => 'A to pagina di utilizatore',
+'tooltip-pt-mytalk' => 'A to pagina di discussione',
 'tooltip-pt-preferences' => 'E to preferenze',
-'tooltip-pt-watchlist'   => 'U listinu di e pagine chì seguiti',
-'tooltip-pt-mycontris'   => 'U listinu di e to cuntribuzioni',
-'tooltip-pt-login'       => 'U registramentu hè suggeritu, micca ubligatoriu',
-'tooltip-pt-logout'      => 'Scunnessione',
-'tooltip-ca-protect'     => 'Pruteghje issa pagina',
-'tooltip-ca-delete'      => 'Supprimà issa pagina',
-'tooltip-p-logo'         => 'Pagina maestra',
-'tooltip-n-mainpage'     => 'Andà à a Pagina maestra',
+'tooltip-pt-watchlist' => 'U listinu di e pagine chì seguiti',
+'tooltip-pt-mycontris' => 'U listinu di e to cuntribuzioni',
+'tooltip-pt-login' => 'U registramentu hè suggeritu, micca ubligatoriu',
+'tooltip-pt-logout' => 'Scunnessione',
+'tooltip-ca-protect' => 'Pruteghje issa pagina',
+'tooltip-ca-delete' => 'Supprimà issa pagina',
+'tooltip-p-logo' => 'Pagina maestra',
+'tooltip-n-mainpage' => 'Andà à a Pagina maestra',
 'tooltip-t-specialpages' => 'Listinu di tutte e pagine spiciale',
-'tooltip-ca-nstab-user'  => 'Vede a pagina di utilizatore',
+'tooltip-ca-nstab-user' => 'Vede a pagina di utilizatore',
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Utilizatore anonimu|Utilizatori anonimi}} di {{SITENAME}}',
-'others'    => 'altri',
+'others' => 'altri',
 
 # Media information
 'show-big-image' => 'Imagine in alta resoluzione',
 
 # Special:NewFiles
 'showhidebots' => '($1 boti)',
-'noimages'     => 'Nulla da vede.',
-'ilsubmit'     => 'Ricerca',
-'bydate'       => 'per data',
+'noimages' => 'Nulla da vede.',
+'ilsubmit' => 'Ricerca',
+'bydate' => 'per data',
 
 # EXIF tags
-'exif-orientation'      => 'Orientazione',
+'exif-orientation' => 'Orientazione',
 'exif-imagedescription' => "Titulu di l'imagine",
-'exif-artist'           => 'Autore',
-'exif-usercomment'      => "Cummenti di l'utilizatore",
+'exif-artist' => 'Autore',
+'exif-usercomment' => "Cummenti di l'utilizatore",
 
 'exif-orientation-1' => 'Nurmale',
 
@@ -514,20 +514,20 @@ U to indirizzu IP serà registratu indu a cronolugia di ista pagina.",
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'tutti',
-'monthsall'     => 'tutti',
+'monthsall' => 'tutti',
 
 # action=purge
 'confirm_purge_button' => "D'accordu",
 
 # Table pager
-'table_pager_next'  => 'Prossima pagina',
+'table_pager_next' => 'Prossima pagina',
 'table_pager_first' => 'Prima pagina',
-'table_pager_last'  => 'Ultima pagina',
+'table_pager_last' => 'Ultima pagina',
 'table_pager_empty' => 'Micca risultati',
 
 # Auto-summaries
 'autoredircomment' => 'Reindirizzamentu à [[$1]]',
-'autosumm-new'     => 'Pagina nova: $1',
+'autosumm-new' => 'Pagina nova: $1',
 
 # Watchlist editor
 'watchlistedit-raw-titles' => 'Pagine:',
index b63fe8d..dde0ed4 100644 (file)
@@ -158,7 +158,6 @@ $messages = array(
 'qbbrowse' => 'Pangita-on',
 'qbedit' => 'Ilisan',
 'qbpageoptions' => 'Mini nga pahina',
-'qbpageinfo' => 'Konteksto',
 'qbmyoptions' => 'Akon mga pahina',
 'qbspecialpages' => 'Pinasahi nga mga pahina',
 'faq' => 'Mga perme napamangkot ("FAQ")',
@@ -408,11 +407,8 @@ Mini ang ginhatag nga kabangdanan "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Nakagwa ka na.'''
 
-Pwede mo mapadayon usar ang {{SITENAME}}, ukon pwede ka [[Special:UserLogin|lmagsulod liwat]] bilang pareho ukon la-in nga manug-usar.
+Pwede mo mapadayon usar ang {{SITENAME}}, ukon pwede ka <span class='plainlinks'>[$1 lmagsulod liwat]</span> bilang pareho ukon la-in nga manug-usar.
 Tandaan nga ang iban nga pahina magapadayon nga ipakita nga nakasulod ka man gyapon kuno abi, asta panason mo ang cache sang imo browser.",
-'welcomecreation' => '==Malipayon nga pag-abot, $1! ==
-Nahimo na ang imo account.
-Indi pagkalimtan nga islan ang imo [[Special:Preferences|mga uyon mo sa {{SITENAME}}]].',
 'yourname' => 'Hayo (username):',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'Liwata ka pindot ang password:',
@@ -591,8 +587,6 @@ Indi pag-ilakip ang pila ka mga suleras.',
 'search-interwiki-caption' => 'Mga utod nga proyekto',
 'search-interwiki-default' => '$1 mga resulta:',
 'search-interwiki-more' => '(mas damu pa)',
-'search-mwsuggest-enabled' => 'may mga suhestiyon',
-'search-mwsuggest-disabled' => 'wala suhestiyon',
 'searchall' => 'tanan',
 'showingresultsheader' => "{{PLURAL:$5|Resulta nga '''$1''' sang '''$3'''|Mga resulta nga '''$1 - $2''' sang '''$3'''}} para sa '''$4'''",
 'nonefound' => "'''Tandaan''': Ang iban lang nga mga ngalan-espasyo ang ginapangita depende sa gintakda.
index 92cc193..70d8a54 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Crimean Turkish (Cyrillic script) (‪къырымтатарджа (Кирилл)‬)
+/** Crimean Turkish (Cyrillic script) (къырымтатарджа (Кирилл)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -17,10 +17,6 @@ $fallback = 'ru';
 
 $fallback8bitEncoding = 'windows-1251';
 
-$separatorTransformTable = array( ','     => '.', '.'     => ',' );
-
-$linkTrail = '/^([a-zâçğıñöşüа-яё“»]+)(.*)$/sDu';
-
 $namespaceNames = array(
        NS_MEDIA            => 'Медиа',
        NS_SPECIAL          => 'Махсус',
@@ -40,8 +36,8 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Категория_музакереси',
 );
 
-# Aliases to latin namespaces
 $namespaceAliases = array(
+       # Aliases of Latin (crh-latn) namespaces
        "Media"                 => NS_MEDIA,
        "Mahsus"                => NS_SPECIAL,
        "Muzakere"              => NS_TALK,
@@ -105,6 +101,9 @@ $dateFormats = array(
     'ISO 8601 both' => 'xnY.xnm.xnd"T"xnH:xni:xns',
 );
 
+$separatorTransformTable = array( ','  => '.', '.' => ',' );
+$linkTrail = '/^([a-zâçğıñöşüа-яё“»]+)(.*)$/sDu';
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Багълантыларнынъ тюбюни сызув:',
@@ -241,8 +240,8 @@ $messages = array(
 'newwindow' => '(янъы бир пенджереде ачылыр)',
 'cancel' => 'Лягъу',
 'moredotdotdot' => 'Даа...',
-'mypage' => 'Саифем',
-'mytalk' => 'Музакере саифем',
+'mypage' => 'Саифе',
+'mytalk' => 'Музакере',
 'anontalk' => 'Бу IP-нинъ музакереси',
 'navigation' => 'Сайтта ёл тапув',
 'and' => '&#32;ве',
@@ -252,7 +251,6 @@ $messages = array(
 'qbbrowse' => 'Бакъып чыкъ',
 'qbedit' => 'Денъиштир',
 'qbpageoptions' => 'Бу саифе',
-'qbpageinfo' => 'Саифе акъкъында малюмат',
 'qbmyoptions' => 'Саифелерим',
 'qbspecialpages' => 'Махсус саифелер',
 'faq' => 'Сыкъ берильген суаллер',
@@ -491,10 +489,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Отурымны къапаттынъыз.'''
 
-Шимди {{SITENAME}} сайтыны аноним оларакъ къулланып оласынъыз, я да янъыдан [[Special:UserLogin|отурым ачып]] оласынъыз (истер айны къулланыджы адынен, истер башкъа бир къулланыджы адынен). Web браузеринъиз кэшини темизлегендже базы саифелер санки аля даа отурымынъыз ачыкъ экен киби корюнип олур.",
-'welcomecreation' => '== Хош кельдинъиз, $1! ==
-Эсабынъыз ачылды.
-Бу сайтнынъ [[Special:Preferences|сазламаларыны]] шахсынъызгъа коре денъиштирмеге унутманъыз.',
+Шимди {{SITENAME}} сайтыны аноним оларакъ къулланып оласынъыз, я да янъыдан <span class='plainlinks'>[$1 отурым ачып]</span> оласынъыз (истер айны къулланыджы адынен, истер башкъа бир къулланыджы адынен). Web браузеринъиз кэшини темизлегендже базы саифелер санки аля даа отурымынъыз ачыкъ экен киби корюнип олур.",
 'yourname' => 'Къулланыджы адынъыз',
 'yourpassword' => 'Паролинъиз',
 'yourpasswordagain' => 'Парольни бир даа язынъыз:',
@@ -871,8 +866,6 @@ $3 мына бу себепни бильдирди: ''$2''",
 'search-interwiki-caption' => 'Къардаш лейхалар',
 'search-interwiki-default' => '$1 нетидже:',
 'search-interwiki-more' => '(даа чокъ)',
-'search-mwsuggest-enabled' => 'тевсиелернен',
-'search-mwsuggest-disabled' => 'тевсие ёкъ',
 'search-relatedarticle' => 'Багълы',
 'mwsuggest-disable' => 'AJAX тевсиелерини ишлетме',
 'searcheverything-enable' => 'Бутюн исим фезаларында къыдыр',
@@ -1444,11 +1437,7 @@ $3 мына бу себепни бильдирди: ''$2''",
 
 'enotif_mailer' => '{{SITENAME}} почта вастасынен хабер берген хызмет',
 'enotif_reset' => 'Джумле саифелерни бакъылгъан оларакъ ишаретле',
-'enotif_newpagetext' => 'Бу янъы бир саифедир.',
 'enotif_impersonal_salutation' => '{{SITENAME}} къулланыджысы',
-'changed' => 'денъиштирильди',
-'created' => 'яратылды',
-'enotif_subject' => '«{{SITENAME}}» $PAGETITLE саифеси $PAGEEDITOR къулланыджы тарафындан $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Сонъки зияретинъизден берли япылгъан денъишмелерни корьмек ичюн $1 бакъынъыз.',
 'enotif_anon_editor' => 'адсыз (аноним) къулланыджы $1',
 'enotif_body' => 'Сайгъылы $WATCHINGUSERNAME,
@@ -2112,4 +2101,7 @@ $5
 # New logging system
 'newuserlog-byemail' => 'пароль e-mail вастасынен йиберильген',
 
+# Search suggestions
+'searchsuggest-containing' => 'ичинде бу олгъан...',
+
 );
index 02d032d..d68ea76 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
@@ -14,8 +14,6 @@
 
 $fallback8bitEncoding = 'windows-1254';
 
-$separatorTransformTable = array( ','     => '.', '.'     => ',' );
-
 $namespaceNames = array(
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Mahsus',
@@ -35,8 +33,8 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Kategoriya_muzakeresi',
 );
 
-# Aliases to cyril namespaces
 $namespaceAliases = array(
+       # Aliases to Cyrillic (crh-cyrl) namespaces
        "Медиа"                  => NS_MEDIA,
        "Махсус"                 => NS_SPECIAL,
        "Музакере"               => NS_TALK,
@@ -57,7 +55,6 @@ $namespaceAliases = array(
        'Категория_музакереси'   => NS_CATEGORY_TALK
 );
 
-
 $datePreferences = array(
     'default',
     'mdy',
@@ -98,6 +95,7 @@ $dateFormats = array(
     'ISO 8601 both' => 'xnY.xnm.xnd"T"xnH:xni:xns',
 );
 
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
 $linkTrail = '/^([a-zâçğıñöşüа-яё“»]+)(.*)$/sDu';
 
 $messages = array(
@@ -236,8 +234,8 @@ $messages = array(
 'newwindow' => '(yañı bir pencerede açılır)',
 'cancel' => 'Lâğu',
 'moredotdotdot' => 'Daa...',
-'mypage' => 'Saifem',
-'mytalk' => 'Muzakere saifem',
+'mypage' => 'Saife',
+'mytalk' => 'Muzakere',
 'anontalk' => 'Bu IP-niñ muzakeresi',
 'navigation' => 'Saytta yol tapuv',
 'and' => '&#32;ve',
@@ -247,7 +245,6 @@ $messages = array(
 'qbbrowse' => 'Baqıp çıq',
 'qbedit' => 'Deñiştir',
 'qbpageoptions' => 'Bu saife',
-'qbpageinfo' => 'Saife aqqında malümat',
 'qbmyoptions' => 'Saifelerim',
 'qbspecialpages' => 'Mahsus saifeler',
 'faq' => 'Sıq berilgen sualler',
@@ -487,10 +484,7 @@ Sebep: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Oturımnı qapattıñız.'''
 
-Şimdi {{SITENAME}} saytını anonim olaraq qullanıp olasıñız, ya da yañıdan [[Special:UserLogin|oturım açıp]] olasıñız (ister aynı qullanıcı adınen, ister başqa bir qullanıcı adınen). Web brauzeriñiz keşini temizlegence bazı saifeler sanki alâ daa oturımıñız açıq eken kibi körünip olur.",
-'welcomecreation' => '== Hoş keldiñiz, $1! ==
-Esabıñız açıldı.
-Bu saytnıñ [[Special:Preferences|sazlamalarını]] şahsıñızğa köre deñiştirmege unutmañız.',
+Şimdi {{SITENAME}} saytını anonim olaraq qullanıp olasıñız, ya da yañıdan <span class='plainlinks'>[$1 oturım açıp]</span> olasıñız (ister aynı qullanıcı adınen, ister başqa bir qullanıcı adınen). Web brauzeriñiz keşini temizlegence bazı saifeler sanki alâ daa oturımıñız açıq eken kibi körünip olur.",
 'yourname' => 'Qullanıcı adıñız',
 'yourpassword' => 'Paroliñiz',
 'yourpasswordagain' => 'Parolni bir daa yazıñız:',
@@ -868,8 +862,6 @@ Vikide bu saifege oşağan saifelerni [[Special:Search|tapıp baqıñız]].',
 'search-interwiki-caption' => 'Qardaş leyhalar',
 'search-interwiki-default' => '$1 netice:',
 'search-interwiki-more' => '(daa çоq)',
-'search-mwsuggest-enabled' => 'tevsiyelernen',
-'search-mwsuggest-disabled' => 'tevsiye yoq',
 'search-relatedarticle' => 'Bağlı',
 'mwsuggest-disable' => 'AJAX tevsiyelerini işletme',
 'searcheverything-enable' => 'Bütün isim fezalarında qıdır',
@@ -1439,11 +1431,7 @@ Ayrıca [[Special:WantedCategories|talap etilgen kategoriyalarnıñ cedveline]]
 
 'enotif_mailer' => '{{SITENAME}} poçta vastasınen haber bergen hızmet',
 'enotif_reset' => 'Cümle saifelerni baqılğan olaraq işaretle',
-'enotif_newpagetext' => 'Bu yañı bir saifedir.',
 'enotif_impersonal_salutation' => '{{SITENAME}} qullanıcısı',
-'changed' => 'deñiştirildi',
-'created' => 'yaratıldı',
-'enotif_subject' => '"{{SITENAME}}" $PAGETITLE saifesi $PAGEEDITOR qullanıcı tarafından $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Soñki ziyaretiñizden berli yapılğan deñişmelerni körmek içün $1 baqıñız.',
 'enotif_anon_editor' => 'adsız (anonim) qullanıcı $1',
 'enotif_body' => 'Sayğılı $WATCHINGUSERNAME,
@@ -2107,4 +2095,7 @@ Bitirgen soñ "{{int:Watchlistedit-raw-submit}}" yazısına basıñız.
 # New logging system
 'newuserlog-byemail' => 'parol e-mail vastasınen yiberilgen',
 
+# Search suggestions
+'searchsuggest-containing' => 'içinde bu olğan...',
+
 );
index 369180d..b9a5d0e 100644 (file)
@@ -23,6 +23,7 @@
  * @author Michawiki
  * @author Mormegil
  * @author Mr. Richard Bolla
+ * @author Quinn
  * @author Ragimiri
  * @author Reaperman
  * @author Spiffyk
@@ -70,72 +71,96 @@ $namespaceGenderAliases = array(
     NS_USER_TALK => array( 'male' => 'Diskuse_s_uživatelem', 'female' => 'Diskuse_s_uživatelkou' ),
 );
 
-/**
- * Date formats list for Special:Preferences
- * see $dateFormats for definitions
- */
-$datePreferences =  array(
-       'ČSN basic dt',
-       'ČSN padded dt',
-       'ČSN basic td',
-       'ČSN padded td',
-       'PČP dt',
-       'PČP td',
-       'ISO dt',
-);
-
-/**
- * Default date format to be used
- */
-$defaultDateFormat = 'ČSN basic dt';
-
-/**
- * Date formats definitions
- *
- * ČSN - Česká státní norma 01 6910 / Czech state norm 01 6910; numeral representation, basic = 1-12(31), padded = 01-12(31)
- * PČP - Pravidla českého pravopisu / The rules of Czech ortography (ISBN 80-200-0475-0); verbal representation
- * ISO - ISO 8601:2004 - Data elements and interchange formats -- Information interchange -- Representation of dates and times
- * dt - date, time order
- * td - time, date order
- */
-$dateFormats = array(
-       'ČSN basic dt time' => 'H:i',
-       'ČSN basic dt date' => 'j. n. Y',
-       'ČSN basic dt both' => 'j. n. Y, H:i',
-
-       'ČSN padded dt time' => 'H:i',
-       'ČSN padded dt date' => 'd.m.Y',
-       'ČSN padded dt both' => 'd.m.Y, H:i',
-
-       'ČSN basic td time' => 'H:i',
-       'ČSN basic td date' => 'j. n. Y',
-       'ČSN basic td both' => 'H:i, j. n. Y',
-
-       'ČSN padded td time' => 'H:i',
-       'ČSN padded td date' => 'd.m.Y',
-       'ČSN padded td both' => 'H:i, d.m.Y',
-
-       'PČP dt time' => 'H.i',
-       'PČP dt date' => 'j. xg Y',
-       'PČP dt both' => 'j. xg Y, H.i',
-
-       'PČP td time' => 'H.i',
-       'PČP td date' => 'j. xg Y',
-       'PČP td both' => 'H.i, j. xg Y',
-
-       'ISO dt time' => 'xnH:xni:xns',
-       'ISO dt date' => 'xnY-xnm-xnd',
-       'ISO dt both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
-);
-
-/**
- * Default list of book sources
- * Hledání knihy podle ISBN
- */
-$bookstoreList = array(
-       'Národní knihovna'          => 'http://aleph.nkp.cz/F/?func=find-a&find_code=ISN&request=$1',
-       'Státní technická knihovna' => 'http://www.stk.cz/cgi-bin/dflex/CZE/STK/BROWSE?A=01&V=$1',
-       'inherit' => true,
+$specialPageAliases = array(
+       'Activeusers'               => array( 'Aktivní_uživatelé', 'Aktivni_uzivatele' ),
+       '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( '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' ),
+       'CreateAccount'             => array( 'Vytvořit_účet', 'Vytvorit_ucet' ),
+       'Deadendpages'              => array( 'Slepé_stránky', 'Slepe_stranky' ),
+       'DeletedContributions'      => array( 'Smazané_příspěvky', 'Smazane_prispevky' ),
+       'Disambiguations'           => array( 'Rozcestníky', 'Rozcestniky' ),
+       'DoubleRedirects'           => array( 'Dvojitá_přesměrování', 'Dvojita_presmerovani' ),
+       'Emailuser'                 => array( 'E-mail' ),
+       'Export'                    => array( 'Exportovat_stránky' ),
+       'Fewestrevisions'           => array( 'Stránky_s_nejméně_editacemi', 'Stranky_s_nejmene_editacemi', 'Stránky_s_nejmenším_počtem_editací' ),
+       'FileDuplicateSearch'       => array( 'Hledání_duplicitních_souborů', 'Hledani_duplicitnich_souboru' ),
+       'Filepath'                  => array( 'Cesta_k_souboru' ),
+       'Import'                    => array( 'Importovat_stránky' ),
+       'Invalidateemail'           => array( 'Zneplatnit_e-mail', 'Zrušit_potvrzení_e-mailu' ),
+       'BlockList'                 => array( 'Blokovaní_uživatelé', 'Blokovani_uzivatele' ),
+       'LinkSearch'                => array( 'Hledání_odkazů', 'Hledani_odkazu' ),
+       'Listadmins'                => array( 'Seznam_správců', 'Seznam_spravcu' ),
+       'Listbots'                  => array( 'Seznam_botů', 'Seznam_botu' ),
+       'Listfiles'                 => array( 'Seznam_souborů', 'Seznam_souboru' ),
+       'Listgrouprights'           => array( 'Seznam_uživatelských_práv', 'Seznam_uzivatelskych_prav' ),
+       'Listredirects'             => array( 'Seznam_přesměrování', 'Seznam_presmerovani' ),
+       'Listusers'                 => array( 'Uživatelé', 'Uzivatele', 'Seznam_uživatelů', 'Seznam_uzivatelu' ),
+       'Lockdb'                    => array( 'Zamknout_databázi', 'Zamknout_databazi' ),
+       'Log'                       => array( 'Protokolovací_záznamy', 'Protokoly', 'Protokol', 'Protokolovaci_zaznamy' ),
+       'Lonelypages'               => array( 'Sirotčí_stránky', 'Sirotci_stranky' ),
+       'Longpages'                 => array( 'Nejdelší_stránky', 'Nejdelsi_stranky' ),
+       'MergeHistory'              => array( 'Sloučení_historie', 'Slouceni_historie', 'Sloučit_historii' ),
+       'MIMEsearch'                => array( 'Hledání_podle_MIME', 'Hledani_podle_MIME', 'Hledat_podle_MIME_typu' ),
+       'Mostcategories'            => array( 'Stránky_s_nejvíce_kategoriemi', 'Stranky_s_nejvice_kategoriemi', 'Stránky_s_nejvyšším_počtem_kategorií' ),
+       'Mostimages'                => array( 'Nejpoužívanější_soubory', 'Nejpouzivanejsi_soubory' ),
+       'Mostlinked'                => array( 'Nejodkazovanější_stránky', 'Nejodkazovanejsi_stranky' ),
+       'Mostlinkedcategories'      => array( 'Nejpoužívanější_kategorie', 'Nejpouzivanejsi_kategorie' ),
+       'Mostlinkedtemplates'       => array( 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ),
+       'Mostrevisions'             => array( 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_počtem_editací' ),
+       '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' ),
+       'Newimages'                 => array( 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ),
+       'Newpages'                  => array( 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ),
+       'Popularpages'              => array( 'Nejnavštěvovanější_stránky', 'Nejnavstevovanejsi_stranky' ),
+       'Preferences'               => array( 'Nastavení', 'Nastaveni' ),
+       'Protectedpages'            => array( 'Zamčené_stránky', 'Zamcene_stranky' ),
+       'Protectedtitles'           => array( 'Zamčené_názvy', 'Zamcene_nazvy', 'Stránky_které_nelze_vytvořit' ),
+       'Randompage'                => array( 'Náhodná_stránka', 'Nahodna_stranka' ),
+       'Randomredirect'            => array( 'Náhodné_přesměrování', 'Nahodne_presmerovani' ),
+       'Recentchanges'             => array( 'Poslední_změny', 'Posledni_zmeny' ),
+       'Recentchangeslinked'       => array( 'Související_změny', 'Souvisejici_zmeny' ),
+       'Revisiondelete'            => array( 'Smazat_revizi' ),
+       'Search'                    => array( 'Hledání', 'Hledani' ),
+       'Shortpages'                => array( 'Nejkratší_stránky', 'Nejkratsi_stranky' ),
+       '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' ),
+       'Uncategorizedtemplates'    => array( 'Nekategorizované_šablony', 'Nekategorizovane_sablony' ),
+       'Undelete'                  => array( 'Smazané_stránky', 'Smazane_stranky' ),
+       'Unlockdb'                  => array( 'Odemknout_databázi', 'Odemknout_databazi' ),
+       'Unusedcategories'          => array( 'Nepoužívané_kategorie', 'Nepouzivane_kategorie' ),
+       'Unusedimages'              => array( 'Nepoužívané_soubory', 'Nepouzivane_soubory' ),
+       'Unusedtemplates'           => array( 'Nepoužívané_šablony', 'Nepouzivane_sablony' ),
+       'Unwatchedpages'            => array( 'Nesledované_stránky' ),
+       'Upload'                    => array( 'Načíst_soubor', 'Nacist_soubor', 'Načíst_obrázek' ),
+       'Userlogin'                 => array( 'Přihlásit', 'Prihlasit' ),
+       'Userlogout'                => array( 'Odhlásit', 'Odhlasit' ),
+       'Userrights'                => array( 'Uživatelská_práva', 'Správa_uživatelů', 'Uzivatelska_prava' ),
+       'Version'                   => array( 'Verze' ),
+       'Wantedcategories'          => array( 'Chybějící_kategorie', 'Požadované_kategorie', 'Pozadovane_kategorie' ),
+       'Wantedfiles'               => array( 'Chybějící_soubory', 'Požadované_soubory', 'Pozadovane_soubory' ),
+       'Wantedpages'               => array( 'Chybějící_stránky', 'Požadované_stránky', 'Pozadovane_stranky' ),
+       'Wantedtemplates'           => array( 'Chybějící_šablony', 'Požadované_šablony', 'Pozadovane_sablony' ),
+       'Watchlist'                 => array( 'Sledované_stránky', 'Sledovane_stranky' ),
+       'Whatlinkshere'             => array( 'Co_odkazuje_na', 'Odkazuje_sem' ),
+       'Withoutinterwiki'          => array( 'Bez_interwiki', 'Stránky_bez_interwiki_odkazů' ),
 );
 
 $magicWords = array(
@@ -256,6 +281,74 @@ $magicWords = array(
        'protectionlevel'           => array( '1', 'ÚROVEŇZAMČENÍ', 'PROTECTIONLEVEL' ),
 );
 
+/**
+ * Date formats list for Special:Preferences
+ * see $dateFormats for definitions
+ */
+$datePreferences =  array(
+       'ČSN basic dt',
+       'ČSN padded dt',
+       'ČSN basic td',
+       'ČSN padded td',
+       'PČP dt',
+       'PČP td',
+       'ISO dt',
+);
+
+/**
+ * Default date format to be used
+ */
+$defaultDateFormat = 'ČSN basic dt';
+
+/**
+ * Date formats definitions
+ *
+ * ČSN - Česká státní norma 01 6910 / Czech state norm 01 6910; numeral representation, basic = 1-12(31), padded = 01-12(31)
+ * PČP - Pravidla českého pravopisu / The rules of Czech ortography (ISBN 80-200-0475-0); verbal representation
+ * ISO - ISO 8601:2004 - Data elements and interchange formats -- Information interchange -- Representation of dates and times
+ * dt - date, time order
+ * td - time, date order
+ */
+$dateFormats = array(
+       'ČSN basic dt time' => 'H:i',
+       'ČSN basic dt date' => 'j. n. Y',
+       'ČSN basic dt both' => 'j. n. Y, H:i',
+
+       'ČSN padded dt time' => 'H:i',
+       'ČSN padded dt date' => 'd.m.Y',
+       'ČSN padded dt both' => 'd.m.Y, H:i',
+
+       'ČSN basic td time' => 'H:i',
+       'ČSN basic td date' => 'j. n. Y',
+       'ČSN basic td both' => 'H:i, j. n. Y',
+
+       'ČSN padded td time' => 'H:i',
+       'ČSN padded td date' => 'd.m.Y',
+       'ČSN padded td both' => 'H:i, d.m.Y',
+
+       'PČP dt time' => 'H.i',
+       'PČP dt date' => 'j. xg Y',
+       'PČP dt both' => 'j. xg Y, H.i',
+
+       'PČP td time' => 'H.i',
+       'PČP td date' => 'j. xg Y',
+       'PČP td both' => 'H.i, j. xg Y',
+
+       'ISO dt time' => 'xnH:xni:xns',
+       'ISO dt date' => 'xnY-xnm-xnd',
+       'ISO dt both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
+/**
+ * Default list of book sources
+ * Hledání knihy podle ISBN
+ */
+$bookstoreList = array(
+       'Národní knihovna'          => 'http://aleph.nkp.cz/F/?func=find-a&find_code=ISN&request=$1',
+       'Státní technická knihovna' => 'http://www.stk.cz/cgi-bin/dflex/CZE/STK/BROWSE?A=01&V=$1',
+       'inherit' => true,
+);
+
 /**
  * Regular expression matching the "link trail", e.g. "ed" in [[Toast]]ed, as
  * the first group, and the remainder of the string as the second group.
@@ -265,98 +358,6 @@ $linkTrail = '/^([a-záčďéěíňóřšťúůýž]+)(.*)$/sDu';
 
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
-$specialPageAliases = array(
-       'Activeusers'               => array( 'Aktivní_uživatelé', 'Aktivni_uzivatele' ),
-       '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( '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' ),
-       'CreateAccount'             => array( 'Vytvořit_účet', 'Vytvorit_ucet' ),
-       'Deadendpages'              => array( 'Slepé_stránky', 'Slepe_stranky' ),
-       'DeletedContributions'      => array( 'Smazané_příspěvky', 'Smazane_prispevky' ),
-       'Disambiguations'           => array( 'Rozcestníky', 'Rozcestniky' ),
-       'DoubleRedirects'           => array( 'Dvojitá_přesměrování', 'Dvojita_presmerovani' ),
-       'Emailuser'                 => array( 'E-mail' ),
-       'Export'                    => array( 'Exportovat_stránky' ),
-       'Fewestrevisions'           => array( 'Stránky_s_nejméně_editacemi', 'Stranky_s_nejmene_editacemi', 'Stránky_s_nejmenším_počtem_editací' ),
-       'FileDuplicateSearch'       => array( 'Hledání_duplicitních_souborů', 'Hledani_duplicitnich_souboru' ),
-       'Filepath'                  => array( 'Cesta_k_souboru' ),
-       'Import'                    => array( 'Importovat_stránky' ),
-       'Invalidateemail'           => array( 'Zneplatnit_e-mail', 'Zrušit_potvrzení_e-mailu' ),
-       'BlockList'                 => array( 'Blokovaní_uživatelé', 'Blokovani_uzivatele' ),
-       'LinkSearch'                => array( 'Hledání_odkazů', 'Hledani_odkazu' ),
-       'Listadmins'                => array( 'Seznam_správců', 'Seznam_spravcu' ),
-       'Listbots'                  => array( 'Seznam_botů', 'Seznam_botu' ),
-       'Listfiles'                 => array( 'Seznam_souborů', 'Seznam_souboru' ),
-       'Listgrouprights'           => array( 'Seznam_uživatelských_práv', 'Seznam_uzivatelskych_prav' ),
-       'Listredirects'             => array( 'Seznam_přesměrování', 'Seznam_presmerovani' ),
-       'Listusers'                 => array( 'Uživatelé', 'Uzivatele', 'Seznam_uživatelů', 'Seznam_uzivatelu' ),
-       'Lockdb'                    => array( 'Zamknout_databázi', 'Zamknout_databazi' ),
-       'Log'                       => array( 'Protokolovací_záznamy', 'Protokoly', 'Protokol', 'Protokolovaci_zaznamy' ),
-       'Lonelypages'               => array( 'Sirotčí_stránky', 'Sirotci_stranky' ),
-       'Longpages'                 => array( 'Nejdelší_stránky', 'Nejdelsi_stranky' ),
-       'MergeHistory'              => array( 'Sloučení_historie', 'Slouceni_historie', 'Sloučit_historii' ),
-       'MIMEsearch'                => array( 'Hledání_podle_MIME', 'Hledani_podle_MIME', 'Hledat_podle_MIME_typu' ),
-       'Mostcategories'            => array( 'Stránky_s_nejvíce_kategoriemi', 'Stranky_s_nejvice_kategoriemi', 'Stránky_s_nejvyšším_počtem_kategorií' ),
-       'Mostimages'                => array( 'Nejpoužívanější_soubory', 'Nejpouzivanejsi_soubory' ),
-       'Mostlinked'                => array( 'Nejodkazovanější_stránky', 'Nejodkazovanejsi_stranky' ),
-       'Mostlinkedcategories'      => array( 'Nejpoužívanější_kategorie', 'Nejpouzivanejsi_kategorie' ),
-       'Mostlinkedtemplates'       => array( 'Nejpoužívanější_šablony', 'Nejpouzivanejsi_sablony' ),
-       'Mostrevisions'             => array( 'Stránky_s_nejvíce_editacemi', 'Stranky_s_nejvice_editacemi', 'Stránky_s_nejvyšším_počtem_editací' ),
-       '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' ),
-       'Newimages'                 => array( 'Nové_obrázky', 'Galerie_nových_obrázků', 'Nove_obrazky' ),
-       'Newpages'                  => array( 'Nové_stránky', 'Nove_stranky', 'Nejnovější_stránky', 'Nejnovejsi_stranky' ),
-       'Popularpages'              => array( 'Nejnavštěvovanější_stránky', 'Nejnavstevovanejsi_stranky' ),
-       'Preferences'               => array( 'Nastavení', 'Nastaveni' ),
-       'Protectedpages'            => array( 'Zamčené_stránky', 'Zamcene_stranky' ),
-       'Protectedtitles'           => array( 'Zamčené_názvy', 'Zamcene_nazvy', 'Stránky_které_nelze_vytvořit' ),
-       'Randompage'                => array( 'Náhodná_stránka', 'Nahodna_stranka' ),
-       'Randomredirect'            => array( 'Náhodné_přesměrování', 'Nahodne_presmerovani' ),
-       'Recentchanges'             => array( 'Poslední_změny', 'Posledni_zmeny' ),
-       'Recentchangeslinked'       => array( 'Související_změny', 'Souvisejici_zmeny' ),
-       'Revisiondelete'            => array( 'Smazat_revizi' ),
-       'Search'                    => array( 'Hledání', 'Hledani' ),
-       'Shortpages'                => array( 'Nejkratší_stránky', 'Nejkratsi_stranky' ),
-       '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' ),
-       'Uncategorizedtemplates'    => array( 'Nekategorizované_šablony', 'Nekategorizovane_sablony' ),
-       'Undelete'                  => array( 'Smazané_stránky', 'Smazane_stranky' ),
-       'Unlockdb'                  => array( 'Odemknout_databázi', 'Odemknout_databazi' ),
-       'Unusedcategories'          => array( 'Nepoužívané_kategorie', 'Nepouzivane_kategorie' ),
-       'Unusedimages'              => array( 'Nepoužívané_soubory', 'Nepouzivane_soubory' ),
-       'Unusedtemplates'           => array( 'Nepoužívané_šablony', 'Nepouzivane_sablony' ),
-       'Unwatchedpages'            => array( 'Nesledované_stránky' ),
-       'Upload'                    => array( 'Načíst_soubor', 'Nacist_soubor', 'Načíst_obrázek' ),
-       'Userlogin'                 => array( 'Přihlásit', 'Prihlasit' ),
-       'Userlogout'                => array( 'Odhlásit', 'Odhlasit' ),
-       'Userrights'                => array( 'Uživatelská_práva', 'Správa_uživatelů', 'Uzivatelska_prava' ),
-       'Version'                   => array( 'Verze' ),
-       'Wantedcategories'          => array( 'Chybějící_kategorie', 'Požadované_kategorie', 'Pozadovane_kategorie' ),
-       'Wantedfiles'               => array( 'Chybějící_soubory', 'Požadované_soubory', 'Pozadovane_soubory' ),
-       'Wantedpages'               => array( 'Chybějící_stránky', 'Požadované_stránky', 'Pozadovane_stranky' ),
-       'Wantedtemplates'           => array( 'Chybějící_šablony', 'Požadované_šablony', 'Pozadovane_sablony' ),
-       'Watchlist'                 => array( 'Sledované_stránky', 'Sledovane_stranky' ),
-       'Whatlinkshere'             => array( 'Co_odkazuje_na', 'Odkazuje_sem' ),
-       'Withoutinterwiki'          => array( 'Bez_interwiki', 'Stránky_bez_interwiki_odkazů' ),
-);
-
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Podtrhávat odkazy:',
@@ -407,7 +408,7 @@ $messages = array(
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
-'underline-default' => 'Podle nastavení prohlížeče',
+'underline-default' => 'Podle nastavení prohlížeče nebo vzhledu',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Druh písma v editačním poli:',
@@ -492,8 +493,8 @@ $messages = array(
 'newwindow' => '(otevře se v novém okně)',
 'cancel' => 'Storno',
 'moredotdotdot' => 'Další…',
-'mypage' => 'Moje stránka',
-'mytalk' => 'Moje diskuse',
+'mypage' => 'Stránka',
+'mytalk' => 'Diskuse',
 'anontalk' => 'Diskuse k této IP adrese',
 'navigation' => 'Navigace',
 'and' => '&#32;a',
@@ -503,7 +504,6 @@ $messages = array(
 'qbbrowse' => 'Listování',
 'qbedit' => 'Editování',
 'qbpageoptions' => 'Tato stránka',
-'qbpageinfo' => 'Kontext',
 'qbmyoptions' => 'Moje volby',
 'qbspecialpages' => 'Speciální stránky',
 'faq' => 'Často kladené otázky',
@@ -516,7 +516,7 @@ $messages = array(
 'vector-action-protect' => 'Zamknout',
 'vector-action-undelete' => 'Obnovit',
 'vector-action-unprotect' => 'Změnit zámek',
-'vector-simplesearch-preference' => 'Zapnout rozšířené návrhy hledání (pouze vzhled Vektor)',
+'vector-simplesearch-preference' => 'Zapnout zjednodušené vyhledávání (pouze vzhled Vektor)',
 'vector-view-create' => 'Založit',
 'vector-view-edit' => 'Editovat',
 'vector-view-history' => 'Zobrazit historii',
@@ -526,6 +526,7 @@ $messages = array(
 'namespaces' => 'Jmenné prostory',
 'variants' => 'Varianty',
 
+'navigation-heading' => 'Navigační menu',
 'errorpagetitle' => 'Chyba',
 'returnto' => 'Návrat na stránku „$1“.',
 'tagline' => 'Z {{grammar:2sg|{{SITENAME}}}}',
@@ -732,7 +733,7 @@ Dotaz: $2',
 'viewsource-title' => 'Zobrazení zdroje stránky $1',
 'actionthrottled' => 'Akce byla pozastavena',
 'actionthrottledtext' => 'Vzhledem k protispamovým opatřením nemůžete požadovanou akci provádět příliš častokrát v krátké době. Zkuste to znovu za několik minut.',
-'protectedpagetext' => 'Tato stránka byla zamčena, takže ji nelze editovat.',
+'protectedpagetext' => 'Tato stránka byla zamčena, aby se předešlo jejímu editování.',
 'viewsourcetext' => 'Můžete si prohlédnout a zkopírovat zdrojový kód této stránky:',
 'viewyourtext' => "Můžete si prohlédnout a zkopírovat zdrojový kód '''vašich změn''' této stránky:",
 'protectedinterface' => 'Tato stránka obsahuje text softwarového rozhraní a je zamčena kvůli prevenci zneužití.
@@ -764,10 +765,10 @@ Správce serveru, který úložiště zamkl, poskytl toto zdůvodnění: „''$3
 # Login and logout pages
 'logouttext' => "'''Nyní jste odhlášeni.'''
 
-Můžete pokračovat v anonymním prohlížení a editaci {{grammar:2sg|{{SITENAME}}}}, nebo se můžete [[Special:UserLogin|znovu přihlásit]] jako stejný či jiný uživatel.
+Můžete pokračovat v anonymním prohlížení a editaci {{grammar:2sg|{{SITENAME}}}}, nebo se můžete <span class='plainlinks'>[$1 znovu přihlásit]</span> jako stejný či jiný uživatel.
 Uvědomte si, že některé stránky se mohou i nadále zobrazovat, jako byste byli dosud přihlášeni, pokud nevymažete cache prohlížeče.",
-'welcomecreation' => '== Vítejte, $1! ==
-Váš účet byl úspěšně vytvořen.
+'welcomeuser' => 'Vítejte, uživateli $1!',
+'welcomecreation-msg' => 'Váš účet byl vytvořen.
 Nezapomeňte si upravit své [[Special:Preferences|nastavení {{grammar:2sg|{{SITENAME}}}}]].',
 'yourname' => 'Uživatelské jméno:',
 'yourpassword' => 'Vaše heslo',
@@ -966,16 +967,16 @@ Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace z
 'summary-preview' => 'Náhled shrnutí:',
 'subject-preview' => 'Náhled předmětu/nadpisu:',
 'blockedtitle' => 'Uživatel zablokován',
-'blockedtext' => "Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.'''
+'blockedtext' => "'''Vaší IP adrese či uživatelskému jménu byla zablokována možnost editace.'''
 
-Zablokování provedl{{gender:$1||a}} $1.
+Zablokování provedl{{GENDER:$4||a}} $1.
 Udaným důvodem bylo ''$2''.
 
 * Začátek blokování: $8
 * Zablokování vyprší: $6
 * Blokovaný uživatel: $7
 
-Pokud chcete zablokování prodiskutovat, můžete kontaktovat {{gender:$1|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].
+Pokud chcete zablokování prodiskutovat, můžete kontaktovat {{GENDER:$4|uživatele|uživatelku}} $1 či jiného [[{{MediaWiki:Grouppage-sysop}}|správce]].
 Uvědomte si, že nemůžete použít nabídku „Poslat e-mail“, jestliže nemáte ve svém [[Special:Preferences|nastavení]] uvedenu platnou e-mailovou adresu nebo pokud vám byla tato možnost zakázána.
 Vaše IP adresa je $3 a&nbsp;identifikační číslo bloku je #$5; tyto údaje uvádějte ve všech dotazech na správce.",
 'autoblockedtext' => "Vaše IP adresa byla automaticky zablokována, protože ji používal jiný uživatel, kterého zablokoval $1.
@@ -1042,7 +1043,7 @@ Zde je pro přehled zobrazen nejnovější záznam z knihy zablokování:',
 'note' => "'''Poznámka:'''&nbsp;",
 'previewnote' => "'''Pamatujte, že toto je pouze náhled.'''
 Změny zatím nebyly uloženy!",
-'continue-editing' => 'Pokračovat v editaci',
+'continue-editing' => 'Přejít k editačnímu poli',
 'previewconflict' => 'Tento náhled ukazuje text tak, jak bude vypadat po uložení stránky.',
 'session_fail_preview' => "'''Váš požadavek se nepodařilo zpracovat kvůli ztrátě dat z relace.
 Zkuste to prosím znovu.
@@ -1119,6 +1120,15 @@ Zřejmě byla smazána.',
 'edit-no-change' => 'Vaše editace byla ignorována, protože nedošlo k žádné změně textu.',
 'edit-already-exists' => 'Nepodařilo se vytvořit novou stránku, protože již existuje.',
 'defaultmessagetext' => 'Výchozí text hlášení',
+'content-failed-to-parse' => 'Nepodařilo se zpracovat data $2 do modelu $1: $3',
+'invalid-content-data' => 'Obsažená data jsou chybná',
+'content-not-allowed-here' => 'Obsah typu $1 není na stránce [[$2]] dovolen.',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'čistý text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Varování: Tato stránka obsahuje příliš mnoho volání výkonnostně náročných funkcí parseru.
@@ -1374,8 +1384,6 @@ Podrobnosti mohou být uvedeny v [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-interwiki-caption' => 'Sesterské projekty',
 'search-interwiki-default' => 'Výsledky z $1:',
 'search-interwiki-more' => '(více)',
-'search-mwsuggest-enabled' => 's návrhy',
-'search-mwsuggest-disabled' => 'bez návrhů',
 'search-relatedarticle' => 'Související',
 'mwsuggest-disable' => 'Vypnout ajaxové napovídání',
 'searcheverything-enable' => 'Hledat ve všech jmenných prostorech',
@@ -1447,7 +1455,7 @@ Pokud na začátek dotazu přidáte ''all:'', bude se hledat všude (včetně di
 'stub-threshold' => 'Limit pro formátování odkazu jako <a href="#" class="stub">pahýl</a> (v bajtech):',
 'stub-threshold-disabled' => 'Vypnuto',
 'recentchangesdays' => 'Počet dní zobrazených v posledních změnách:',
-'recentchangesdays-max' => '(maximálně $1 {{PLURAL:$1|den|dny|dní}})',
+'recentchangesdays-max' => 'Maximálně $1 {{PLURAL:$1|den|dny|dní}}',
 'recentchangescount' => 'Počet implicitně zobrazovaných záznamů:',
 'prefs-help-recentchangescount' => 'Týká se posledních změn, historie stránek a protokolovacích záznamů.',
 'prefs-help-watchlist-token' => 'Pokud do tohoto pole vyplníte tajný klíč, bude vytvořen RSS kanál vašich sledovaných stránek.
@@ -1639,6 +1647,9 @@ Tuto operaci nelze vrátit zpět.',
 'rightslogtext' => 'Toto je záznam změn uživatelských práv.',
 'rightslogentry' => 'změnil pro $1 zařazení ve skupinách z $2 na $3',
 'rightslogentry-autopromote' => 'byl automaticky povýšen z $2 na $3',
+'logentry-rights-rights' => '$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|změnil|změnila}} členství $3 ve skupinách',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|byl automaticky povýšen|byla automaticky povýšena}} z $4 na $5',
 'rightsnone' => '(žádné)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1873,6 +1884,7 @@ Kontaktuje prosím [[Special:ListUsers/sysop|správce]].',
 'backend-fail-notsame' => 'Odlišný soubor $1 už existuje.',
 'backend-fail-invalidpath' => '$1 je neplatná cesta k místu uložení.',
 'backend-fail-delete' => 'Soubor $1 nelze smazat.',
+'backend-fail-describe' => 'Nepodařilo se změnit metadata souboru „$1“.',
 'backend-fail-alreadyexists' => 'Soubor $1 už existuje.',
 'backend-fail-store' => 'Soubor $1 nelze uložit v $2.',
 'backend-fail-copy' => 'Soubor $1 nelze kopírovat do $2.',
@@ -2022,7 +2034,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.',
+'upload-disallowed-here' => 'Tento soubor nemůžete přepsat.',
 
 # File reversion
 'filerevert' => 'Vrátit zpět $1',
@@ -2259,7 +2271,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: <code>$1</code> (nepřidávejte je do hledání).',
+Podporované protokoly: <code>$1</code> (pokud není protokol uveden, použije se http://).',
 'linksearch-line' => '$2 odkazuje na $1',
 'linksearch-error' => 'Zástupné znaky lze použít jen na začátku doménového jména.',
 
@@ -2309,7 +2321,7 @@ Podporované protokoly: <code>$1</code> (nepřidávejte je do hledání).',
 '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.
+'emailpagetext' => 'Pomocí níže zobrazeného formuláře můžete {{GENDER:$1|tomuto uživateli|této uživatelce}} 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.',
 'usermailererror' => 'Chyba poštovního programu:',
 'defemailsubject' => 'E-mail z {{grammar:2sg|{{SITENAME}}}} od {{gender:$1|uživatele|uživatelky|uživatele}} „$1“',
@@ -2376,19 +2388,23 @@ E-mailová adresa, kterou máte uvedenu v [[Special:Preferences|nastavení]], se
 
 'enotif_mailer' => 'Zasílač hlášení {{grammar:2sg|{{SITENAME}}}}',
 'enotif_reset' => 'Označit vše jako navštívené',
-'enotif_newpagetext' => 'Toto je nová stránka.',
 'enotif_impersonal_salutation' => 'Uživatel {{grammar:2sg|{{SITENAME}}}}',
-'changed' => 'upravil',
-'created' => 'vytvořil',
-'enotif_subject' => '$PAGEEDITOR upravil stránku $PAGETITLE na {{grammar:6sg|{{SITENAME}}}}.',
+'enotif_subject_deleted' => '$2 {{gender:$2|smazal|smazala}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_created' => '$2 {{gender:$2|založil|založila}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_moved' => '$2 {{gender:$2|přesunul|přesunula}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_restored' => '$2 {{gender:$2|obnovil|obnovila}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_subject_changed' => '$2 {{gender:$2|změnil|změnila}} stránku $1 na {{grammar:6sg|{{SITENAME}}}}',
+'enotif_body_intro_deleted' => 'V $PAGEEDITDATE {{gender:$2|smazal|smazala}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
+'enotif_body_intro_created' => 'V $PAGEEDITDATE {{gender:$2|založil|založila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
+'enotif_body_intro_moved' => 'V $PAGEEDITDATE {{gender:$2|přesunul|přesunula}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
+'enotif_body_intro_restored' => 'V $PAGEEDITDATE {{gender:$2|obnovil|obnovila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
+'enotif_body_intro_changed' => 'V $PAGEEDITDATE {{gender:$2|změnil|změnila}} $2 na {{grammar:6sg|{{SITENAME}}}} stránku $1, vizte aktuální verzi na $3 .',
 'enotif_lastvisited' => 'Vizte $1 pro seznam všech změn od minulé návštěvy.',
 'enotif_lastdiff' => 'Tuto změnu vizte na $1 .',
 'enotif_anon_editor' => 'anonymní uživatel $1',
 'enotif_body' => 'Vážený uživateli $WATCHINGUSERNAME,
 
-Ve $PAGEEDITDATE $CHANGEDORCREATED $PAGEEDITOR stránku $PAGETITLE, vizte aktuální verzi na $PAGETITLE_URL .
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Shrnutí editace: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2396,8 +2412,7 @@ Uživatele, který změnu provedl, můžete kontaktovat:
 e-mailem: $PAGEEDITOR_EMAIL
 na wiki: $PAGEEDITOR_WIKI
 
-Dokud stránku nenavštívíte, nebudou vám zasílána další oznámení o změnách této stránky.
-Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.
+Dokud stránku nenavštívíte, nebudou vám zasílána další oznámení o změnách této stránky. Případně si můžete vynulovat příznaky ve svém seznamu sledovaných stránek.
 
        S pozdravem váš zasílač hlášení {{grammar:2sg|{{SITENAME}}}}
 
@@ -2556,7 +2571,8 @@ Pro částečné obnovení zaškrtněte čtverečky u obnovovaných revizí a kl
 'undeletedrevisions' => '{{PLURAL:$1|Obnovena $1 verze|Obnoveny $1 verze|Obnoveno $1 verzí}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|Obnovena jedna verze|Obnoveny $1 verze|Obnoveno $1 verzí}} a $2 {{PLURAL:$2|soubor|soubory|souborů}}.',
 'undeletedfiles' => '{{PLURAL:$1|obnoven $1 soubor|obnoveny $1 soubory|obnoveno $1 souborů}}',
-'cannotundelete' => 'Obnovení se nepovedlo; stránku již pravděpodobně obnovil někdo jiný.',
+'cannotundelete' => 'Obnovení se nezdařilo:
+$1',
 'undeletedpage' => "'''$1 byla obnovena'''
 
 Záznam o posledních mazáních a obnoveních najdete v [[Special:Log/delete|knize smazaných stránek]].",
@@ -2587,9 +2603,9 @@ $1',
 'blanknamespace' => '(Hlavní)',
 
 # Contributions
-'contributions' => 'Příspěvky uživatele',
+'contributions' => 'Příspěvky {{GENDER:$1|uživatele|uživatelky}}',
 'contributions-title' => 'Příspěvky uživatele $1',
-'mycontris' => 'Mé příspěvky',
+'mycontris' => 'Příspěvky',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Nenalezeny žádné změny vyhovující kritériím.',
 'uctop' => ' (aktuální)',
@@ -2850,6 +2866,7 @@ Cílová stránka „[[:$1]]“ již existuje. Přejete si ji smazat pro uvolně
 'immobile-target-namespace-iw' => 'Mezijazykový odkaz není validní cíl při přesouvání stránky.',
 'immobile-source-page' => 'Tuto stránku nelze přesouvat.',
 'immobile-target-page' => 'Stránku nelze přesunout na zadaný název.',
+'bad-target-model' => 'Požadovaný cíl používá jiný model obsahu. Nelze převést $1 na $2.',
 'imagenocrossnamespace' => 'Nelze přesunout mimo jmenný prostor Soubor:',
 'nonfile-cannot-move-to-file' => 'Do jmenného prostoru {{ns:file}} nelze přesouvat stránky nepřináležející k souboru',
 'imagetypemismatch' => 'Nová přípona souboru neodpovídá jeho typu',
@@ -2973,7 +2990,6 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # JavaScriptTest
 'javascripttest' => 'Testování JavaScriptu',
-'javascripttest-disabled' => 'Tato funkce nebyla na této wiki povolena.',
 'javascripttest-title' => 'Spouštějí se testy v $1',
 'javascripttest-pagetext-noframework' => 'Tato stránka je vyhrazena pro spouštění testů JavaScriptu.',
 'javascripttest-pagetext-unknownframework' => 'Neznámá testovací knihovna „$1“.',
@@ -3112,6 +3128,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 
 # Info page
 'pageinfo-title' => 'Informace o stránce „$1“',
+'pageinfo-not-current' => 'Informace bohužel nelze zobrazit pro starší verze.',
 'pageinfo-header-basic' => 'Základní údaje',
 'pageinfo-header-edits' => 'Historie editací',
 'pageinfo-header-restrictions' => 'Zámek stránky',
@@ -3120,6 +3137,7 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'pageinfo-default-sort' => 'Výchozí klíč řazení',
 'pageinfo-length' => 'Velikost stránky (v bajtech)',
 'pageinfo-article-id' => 'ID stránky',
+'pageinfo-language' => 'Jazyk obsahu stránky',
 'pageinfo-robot-policy' => 'Nastavení pro vyhledávače',
 'pageinfo-robot-index' => 'Indexovatelná',
 'pageinfo-robot-noindex' => 'Neindexovatelná',
@@ -3136,10 +3154,17 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Informace o stránce',
+'pageinfo-redirectsto' => 'Přesměrovává na',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Stránka se počítá do obsahu',
+'pageinfo-contentpage-yes' => 'Ano',
+'pageinfo-protect-cascading' => 'Kaskádový zámek',
+'pageinfo-protect-cascading-yes' => 'Ano',
+'pageinfo-protect-cascading-from' => 'Zámky pocházejí z kaskádových zámků na',
 
 # Skin names
 'skinname-standard' => 'Klasický',
@@ -3161,6 +3186,8 @@ Uložte jej na svůj disk a nahrajte ho sem.',
 'markedaspatrollederror' => 'Nelze označit za prověřené',
 'markedaspatrollederrortext' => 'Musíte zvolit revizi, která má být označena jako prověřená.',
 'markedaspatrollederror-noautopatrol' => 'Nemáte dovoleno označovat vlastní editace jako prověřené.',
+'markedaspatrollednotify' => 'Tato změna stránky $1 byla označena jako prověřená.',
+'markedaspatrollederrornotify' => 'Nepodařilo se označit jako prověřené.',
 
 # Patrol log
 'patrol-log-page' => 'Kniha prověřených editací',
@@ -3226,6 +3253,7 @@ Otevřením souboru můžete ohrozit svůj počítač.",
 'days' => '{{PLURAL:$1|$1 den|$1 dny|$1 dní}}',
 'ago' => 'před 
 $1',
+'just-now' => 'Právě teď',
 
 # Bad image list
 'bad_image_list' => 'Tato stránka má následující formát:
@@ -3717,6 +3745,7 @@ Platnost tohoto potvrzovacího kódu vyprší $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Vkládání šablon mezi wiki je vypnuto]',
 'scarytranscludefailed' => '[Nepodařilo se načíst šablonu pro $1]',
+'scarytranscludefailed-httpstatus' => '[Nepodařilo se načíst šablonu pro $1: HTTP $2]',
 'scarytranscludetoolong' => '[Příliš dlouhé URL]',
 
 # Delete conflict
@@ -3888,6 +3917,7 @@ Seznam editovaných stránek můžete také [[Special:EditWatchlist|editovat ve
 'version-license' => 'Licence',
 'version-poweredby-credits' => "Tato wiki běží na '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'další',
+'version-credits-summary' => 'Následujícím lidem bychom rádi poděkovali za jejich příspěvky [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki je svobodný software; můžete jej šířit nebo modifikovat podle podmínek GNU General Public License, vydávané Free Software Foundation; buď verze 2 této licence anebo (podle vašeho uvážení) kterékoli pozdější verze.
 
 MediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URČITÝ ÚČEL. Podrobnosti se dočtete v textu GNU General Public License.
@@ -3899,6 +3929,8 @@ MediaWiki je distribuována v naději, že bude užitečná, avšak BEZ JAKÉKOL
 'version-entrypoints' => 'URL vstupních bodů',
 'version-entrypoints-header-entrypoint' => 'Vstupní bod',
 'version-entrypoints-header-url' => 'URL',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Cesta k článkům]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Cesta ke skriptům]',
 
 # Special:FilePath
 'filepath' => 'Cesta k souboru',
@@ -3922,8 +3954,7 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'specialpages' => 'Speciální stránky',
 'specialpages-note' => '----
 * Normální speciální stránky
-* <span class="mw-specialpagerestricted">Speciální stránky s&nbsp;vyhrazeným přístupem</span>
-* <span class="mw-specialpagecached">Speciální stránky z&nbsp;cache (mohou být zastaralé)</span>',
+* <span class="mw-specialpagerestricted">Speciální stránky s&nbsp;vyhrazeným přístupem</span>',
 'specialpages-group-maintenance' => 'Údržba',
 'specialpages-group-other' => 'Ostatní',
 'specialpages-group-login' => 'Přihlášení / vytvoření účtu',
@@ -4027,8 +4058,8 @@ Obrázky se zobrazí v plném rozlišení, jiné typy souborů se otevřenou v p
 'logentry-move-move_redir-noredirect' => '$1 přesunul stránku $3 na $4 místo přesměrování bez založení přesměrování',
 'logentry-patrol-patrol' => '$1 označil revizi $4 stránky $3 jako prověřenou',
 'logentry-patrol-patrol-auto' => '$1 automaticky označil revizi $4 stránky $3 jako prověřenou',
-'logentry-newusers-newusers' => '$1 založil uživatelský účet',
-'logentry-newusers-create' => '$1 založil uživatelský účet',
+'logentry-newusers-newusers' => 'Byl založen uživatelský účet $1',
+'logentry-newusers-create' => 'Byl založen uživatelský účet $1',
 'logentry-newusers-create2' => '$1 založil uživatelský účet $3',
 'logentry-newusers-autocreate' => 'Automaticky byl založen účet $1',
 'newuserlog-byemail' => 'heslo zasláno e-mailem',
@@ -4049,6 +4080,10 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 'feedback-bugcheck' => 'Skvělé! Jen zkontrolujte, zda se nejedná o jednu z [$1 už známých chyb].',
 'feedback-bugnew' => 'Zkontroloval(a) jsem to. Chci ohlásit novou chybu.',
 
+# Search suggestions
+'searchsuggest-search' => 'Hledat',
+'searchsuggest-containing' => 'obsahující…',
+
 # API errors
 'api-error-badaccess-groups' => 'Nemáte povoleno nahrávat soubory na tuto wiki.',
 'api-error-badtoken' => 'Vnitřní chyba: špatný token.',
@@ -4101,4 +4136,6 @@ Jinak můžete využít jednoduchý formulář níže. Váš komentář bude př
 'duration-centuries' => '$1 {{PLURAL:$1|století}}',
 'duration-millennia' => '$1 {{PLURAL:$1|tisíciletí}}',
 
+# Unknown messages
+'svg-long-error' => 'Neplatný soubor SVG: $1',
 );
index d6b834d..7f37b57 100644 (file)
@@ -177,7 +177,6 @@ $messages = array(
 'qbbrowse' => 'Przezeranié',
 'qbedit' => 'Edicëjô',
 'qbpageoptions' => 'Òptacëje starnë',
-'qbpageinfo' => 'Ò starnie',
 'qbmyoptions' => 'Mòje òptacëje',
 'qbspecialpages' => 'Specjalné starnë',
 'faq' => 'FAQ',
@@ -354,11 +353,8 @@ Przemëszlë dolmaczënié na [//translatewiki.net/wiki/Main_Page?setlang=csb tr
 
 # Login and logout pages
 'logouttext' => "'''Jes wëlogòwóny.'''
-Mòżesz robic dali na {{SITENAME}} jakno anonimòwi brëkòwnik abò sã [[Special:UserLogin|wlogòwac]] znowa jakno równy, a bò jinszi brëkòwnik.
+Mòżesz robic dali na {{SITENAME}} jakno anonimòwi brëkòwnik abò sã <span class='plainlinks'>[$1 wlogòwac]</span> znowa jakno równy, a bò jinszi brëkòwnik.
 Bôczë, że do czasu wëczëszczenia pòdrãczny pamiãcë przezérnika, niejedné starnë bãdą wëzdrzëc jakbë të bëł wlogòwóny.",
-'welcomecreation' => ' == Witôj, $1! ==
-Twòjé kònto òstało prawie ùsôdzoné.
-Nie zbëjë zmienic swòjich nastôwów na [[Special:Preferences|{{SITENAME}}]].',
 'yourname' => 'Miono brëkòwnika',
 'yourpassword' => 'Twòja parola',
 'yourpasswordagain' => 'Pòwtórzë parolã',
@@ -578,8 +574,6 @@ Administrator, chtëren jã zablokòwôł, pòdôł przëczënã: $1",
 'search-interwiki-caption' => 'Sosterné ùdbë',
 'search-interwiki-default' => 'Skùtczi dlô $1:',
 'search-interwiki-more' => '(wicy)',
-'search-mwsuggest-enabled' => 'z sugestëjama',
-'search-mwsuggest-disabled' => 'bez sugestëjów',
 'searchall' => 'wszëtczé',
 'nonefound' => "'''Bôczënk''':Dlô szëkbë są domëslno przistãpné blós niejedné rumë mionów.
 Spróbùjë szëkbë z przëdôwkã ''all:'' dlô całowny zamkłoscë starnów (zamëkający w se starnë diskùsëji, szablónë, ëtp), abò ùżëje przëdôwka wëbrónegò ruma mionów.",
@@ -935,8 +929,6 @@ Czej chcesz remôc starnã z lëste ùzéronëch artiklów, klikni ''Òprzestôj
 'unwatching' => 'Ju ni ùzéróm...',
 
 'enotif_reset' => 'Òznaczë wszëtczé artiklë jakno òbëzdrzóné',
-'changed' => 'zmienioné',
-'created' => 'zrobionô',
 
 # Delete
 'deletepage' => 'Rëmôj starnã',
index ce92abd..1914124 100644 (file)
  * @author ОйЛ
  */
 
-$separatorTransformTable = array(
-       ',' => ".",
-       '.' => ','
-);
-
-$linkPrefixExtension = true;
-
 $namespaceNames = array(
        NS_MEDIA            => 'Срѣдьства',
        NS_SPECIAL          => 'Нарочьна',
@@ -65,6 +58,13 @@ $magicWords = array(
        'language'                  => array( '0', '#ѨꙀꙐКЪ:', '#LANGUAGE:' ),
 );
 
+$separatorTransformTable = array(
+       ',' => ".",
+       '.' => ','
+);
+
+$linkPrefixExtension = true;
+
 $defaultDateFormat = 'mdy';
 
 $dateFormats = array(
@@ -154,8 +154,8 @@ $messages = array(
 'article' => 'члѣнъ',
 'newwindow' => '(иномь окънѣ)',
 'moredotdotdot' => 'вѧщє ···',
-'mypage' => 'моꙗ страница',
-'mytalk' => 'моê\99\97 Ð±Ñ\94Ñ\81ѣда',
+'mypage' => 'страница',
+'mytalk' => 'бєсѣда',
 'navigation' => 'плаваниѥ',
 'and' => '&#32;и',
 
@@ -321,7 +321,7 @@ $messages = array(
 или [{{fullurl:{{FULLPAGENAME}}|action=edit}} ѭжє исправити]</span> можєши',
 'noarticletext-nopermission' => 'нꙑнѣ с̑ьдє ничєсожє нє напьсано ѥстъ ⁙
 [[Special:Search/{{PAGENAME}}|си страницѧ имѧ искати]] дроугꙑ страницѧ или
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} съвѧꙁанꙑ їсторїѩ видѣти]</span> можєши',
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} съвѧꙁанꙑ їсторїѩ видѣти]</span> можєши ⁙ сътворити жє си страницѧ нє можєши',
 'userpage-userdoesnotexist' => 'польꙃєватєльска мѣста ⁖ $1 ⁖ нꙑнѣ нѣстъ ⁙
 прѣдъ сътворѥниѥмь или исправлѥниѥмь си страницѧ помꙑсли жє ащє исто тъ дѣиство ноуждьно ли',
 'clearyourcache' => "'''НАРОЧИТО''': По съхранѥнии можєши обити своѥго съмотрила съхранъ да видѣлъ би мѣнꙑ
@@ -393,7 +393,7 @@ $messages = array(
 
 # Preferences page
 'preferences' => 'строи',
-'mypreferences' => 'мои строи',
+'mypreferences' => 'строи',
 'changepassword' => 'таина словєсє иꙁмѣнѥниѥ',
 'prefs-rc' => 'послѣдьнѩ мѣнꙑ',
 'prefs-watchlist' => 'блюдєниꙗ',
@@ -489,6 +489,8 @@ $messages = array(
 'filedesc' => 'опьсаниѥ',
 'fileuploadsummary' => 'опьсаниѥ:',
 'uploadedimage' => '⁖ [[$1]] ⁖ положєнъ ѥстъ',
+'upload-source' => 'источьно дѣло',
+'sourcefilename' => 'источьна дѣла имꙗ :',
 'watchthisupload' => 'си дѣла блюдєниѥ',
 'upload-success-subj' => 'дѣло положєно ѥстъ',
 
@@ -602,7 +604,7 @@ $messages = array(
 
 # Watchlist
 'watchlist' => 'моꙗ блюдєниꙗ',
-'mywatchlist' => 'моê\99\97 Ð±Ð»Ñ\8eдÑ\94ниê\99\97',
+'mywatchlist' => 'блюдєниꙗ',
 'addedwatchtext' => "страница ⁖ [[:$1]] ⁖ нꙑнѣ подъ твоимь [[Special:Watchlist|блюдєниѥмь]] ѥстъ ⁙
 всꙗ ѥѩ и ѥѩжє бєсѣдꙑ мѣнꙑ страницѧ ⁖ [[Special:Watchlist|моꙗ блюдєниꙗ]] ⁖ покаꙁанꙑ сѫтъ и  [[Special:RecentChanges|послѣдьнъ мѣнъ]] каталоꙃѣ '''чрьнꙑимъ''' сѧ авлꙗѭтъ",
 'removedwatchtext' => 'страница ⁖ [[:$1]] ⁖ нꙑнѣ твоѥго [[Special:Watchlist|блюдєниꙗ]] иꙁнєсєна ѥстъ',
@@ -614,8 +616,6 @@ $messages = array(
 'watching' => 'блюдєниѥ ...',
 'unwatching' => 'оставьлєниѥ блюдєниꙗ ...',
 
-'created' => 'сътворѥнъ ѥстъ',
-
 # Delete
 'deletepage' => 'поничьжєниѥ',
 'excontent' => "вънѫтри бѣ: '$1'",
@@ -653,7 +653,7 @@ $messages = array(
 # Contributions
 'contributions' => 'польꙃєватєлꙗ добродѣꙗниꙗ',
 'contributions-title' => 'польꙃєватєлꙗ ⁖ $1 ⁖ добродѣꙗниꙗ',
-'mycontris' => 'моê\99\97 Ð´Ð¾Ð±Ñ\80одѣê\99\97ниê\99\97',
+'mycontris' => 'добродѣꙗниꙗ',
 'contribsub2' => 'польꙃєватєлꙗ имѧ ⁖ $1 ⁖ ѥстъ ($2)',
 'uctop' => '(послѣдьнꙗ мѣна)',
 
@@ -688,6 +688,7 @@ $messages = array(
 'blocklink' => 'ꙁагради',
 'contribslink' => 'добродѣꙗниꙗ',
 'blocklogpage' => 'ꙁаграждєниꙗ їсторїꙗ',
+'blocklogentry' => 'ꙁаградихъ [[$1]] на врѣмѧ $2 $3',
 
 # Move page
 'move-page' => 'прѣимєнованиѥ ⁖ $1 ⁖',
@@ -732,8 +733,12 @@ $messages = array(
 'tooltip-t-specialpages' => 'вьсѣѩ нарочьнъ страницѧ каталогъ',
 'tooltip-t-print' => 'сѥѩ страницѧ пєчатьнъ обраꙁъ',
 'tooltip-ca-nstab-special' => 'си нарочьна страница ѥстъ · ѥѩжє иꙁмѣнꙗти нє можєши',
+'tooltip-minoredit' => 'оꙁначи ꙗко малоу мѣноу',
 'tooltip-watch' => 'си страницѧ блюдєниѥ',
 
+# Info page
+'pageinfo-toolboxlink' => 'страницѧ плирофорїꙗ',
+
 # Media information
 'file-info-size' => '$1 × $2 п҃ѯ · дѣла мѣра : $3 · MIME тѷпъ : $4',
 'svg-long-desc' => 'дѣло SVG · обꙑчьнъ обраꙁъ : $1 × $2 п҃ѯ · дѣла мѣра : $3',
@@ -793,7 +798,11 @@ $messages = array(
 'logentry-delete-delete' => '$1 поничьжихъ страницѫ ⁖ $3 ⁖',
 'logentry-move-move' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖',
 'logentry-move-move-noredirect' => '$1 нарєчє страницѫ ⁖ $3 ⁖ имєньмь ⁖ $4 ⁖ бєꙁ прѣнаправлєниꙗ сътворѥниꙗ',
-'logentry-newusers-create' => '$1 сътворихъ польꙃєватєльско мѣсто',
+'logentry-newusers-create' => 'польꙃєватєльско мѣсто ⁖ $1 ⁖ сътворѥно ѥстъ',
+
+# Search suggestions
+'searchsuggest-search' => 'исканиѥ',
+'searchsuggest-containing' => 'сѥ дрьжащи···',
 
 # API errors
 'api-error-unknownerror' => 'нєвѣдома блаꙁна : ⁖ $1 ⁖',
index 1efc850..cd5b8d6 100644 (file)
@@ -16,8 +16,6 @@
 
 $fallback = 'ru';
 
-$linkPrefixExtension = true;
-
 $namespaceNames = array(
        NS_MEDIA            => 'Медиа',
        NS_SPECIAL          => 'Ятарлă',
@@ -40,6 +38,7 @@ $namespaceNames = array(
 // Remove Russian aliases
 $namespaceGenderAliases = array();
 
+$linkPrefixExtension = true;
 $linkTrail = '/^([a-zа-яĕçăӳ"»]+)(.*)$/sDu';
 
 $messages = array(
@@ -172,7 +171,6 @@ $messages = array(
 'qbbrowse' => 'Курăм',
 'qbedit' => 'Тӳрлет',
 'qbpageoptions' => 'Страница ĕнерлевĕсем',
-'qbpageinfo' => 'Страница çинчен',
 'qbmyoptions' => 'Сирĕн ĕнĕрлевсем',
 'qbspecialpages' => 'Ятарлӑ страницӑсем',
 'faq' => 'ЫйХу',
@@ -383,9 +381,6 @@ $1',
 Сайт сире ятпа мар, IP-адрес урлă пĕлет.
 Эсир анонимла, е малтанхи евĕрлĕ çĕнĕ сеанс уçса, е  урăх ятпа ĕçлеме пултаратăр.
 Хăш-пĕр страницăсем эсир сайта кĕнĕ пек курăнма пултараççĕ, ăна тӳрлетмешкĕн браузер кэшне çĕнетĕр.',
-'welcomecreation' => '== Ырă сунса кĕтетпĕр, $1! ==
-Эсир пирĕн патăмăрта çырăнтăр.
-[[Special:Preferences|Сайт ĕнĕрлевĕсене хăвсамăра кирлĕ пек]] лартма ан манса кайăр.',
 'yourname' => 'Сирĕн ят',
 'yourpassword' => 'Вăрттăн сăмах:',
 'yourpasswordagain' => 'Вăрттăн сăмах тепре çырăр:',
@@ -926,9 +921,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatching' => 'Сăнав ят-йышĕнчен кăларса пăрахасси…',
 
 'enotif_reset' => 'Пур страницăсене те пăхнă пек палăрт',
-'enotif_newpagetext' => 'Ку çĕнĕ страница',
-'changed' => 'улăштарнă',
-'created' => 'хатĕрленĕ',
 'enotif_anon_editor' => '$1 анонимлă хутшăнакан',
 
 # Delete
index 8860d97..59629b8 100644 (file)
@@ -37,17 +37,6 @@ $namespaceNames = array(
        NS_CATEGORY_TALK    => 'Sgwrs_Categori',
 );
 
-
-$defaultDateFormat = 'dmy';
-
-$bookstoreList = array(
-       "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN",
-       "PriceSCAN" => "http://www.pricescan.com/books/bookDetail.asp?isbn=$1",
-       "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1",
-       "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1",
-       "Amazon.co.uk" => "http://www.amazon.co.uk/exec/obidos/ISBN=$1"
-);
-
 $magicWords = array(
        'redirect'                  => array( '0', '#ail-cyfeirio', '#ailgyfeirio', '#REDIRECT' ),
        'notoc'                     => array( '0', '__DIMTAFLENCYNNWYS__', '__DIMRHESTRGYNNWYS__', '__DIMRHG__', '__NOTOC__' ),
@@ -114,6 +103,16 @@ $magicWords = array(
        'pagesize'                  => array( '1', 'MAINTTUD', 'PAGESIZE' ),
 );
 
+$defaultDateFormat = 'dmy';
+
+$bookstoreList = array(
+       "AddALL" => "http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN",
+       "PriceSCAN" => "http://www.pricescan.com/books/bookDetail.asp?isbn=$1",
+       "Barnes & Noble" => "http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1",
+       "Amazon.com" => "http://www.amazon.com/exec/obidos/ISBN=$1",
+       "Amazon.co.uk" => "http://www.amazon.co.uk/exec/obidos/ISBN=$1"
+);
+
 $linkTrail = "/^([àáâèéêìíîïòóôûŵŷa-z]+)(.*)$/sDu";
 
 $messages = array(
@@ -165,7 +164,7 @@ $messages = array(
 
 'underline-always' => 'Bob amser',
 'underline-never' => 'Byth',
-'underline-default' => 'Rhagosodyn y porwr',
+'underline-default' => "Rhagosodyn y porwr neu'r wedd",
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Arddull y ffont yn y blwch golygu:',
@@ -250,8 +249,8 @@ $messages = array(
 'newwindow' => '(yn agor mewn ffenest newydd)',
 'cancel' => 'Diddymu',
 'moredotdotdot' => 'Rhagor...',
-'mypage' => 'Fy nhudalen',
-'mytalk' => 'Fy sgwrs',
+'mypage' => 'Tudalen defnyddiwr',
+'mytalk' => 'Sgwrs',
 'anontalk' => 'Sgwrs ar gyfer y cyfeiriad IP hwn',
 'navigation' => 'Panel llywio',
 'and' => '&#32;a/ac',
@@ -261,7 +260,6 @@ $messages = array(
 'qbbrowse' => 'Pori',
 'qbedit' => 'Golygu',
 'qbpageoptions' => 'Y dudalen hon',
-'qbpageinfo' => 'Cyd-destun',
 'qbmyoptions' => 'Fy nhudalennau',
 'qbspecialpages' => 'Tudalennau arbennig',
 'faq' => 'Cwestiynau cyffredin',
@@ -274,7 +272,7 @@ $messages = array(
 'vector-action-protect' => 'Diogelu',
 'vector-action-undelete' => 'Adfer',
 'vector-action-unprotect' => 'Newid y diogelwch',
-'vector-simplesearch-preference' => 'Galluogi awgrymiadau chwilio uwch (gwedd Vector yn unig)',
+'vector-simplesearch-preference' => 'Galluogi bar chwilio syml (gwedd Vector yn unig)',
 'vector-view-create' => 'Dechrau',
 'vector-view-edit' => 'Golygu',
 'vector-view-history' => 'Gweld yr hanes',
@@ -284,6 +282,7 @@ $messages = array(
 'namespaces' => 'Parthau',
 'variants' => 'Amrywiolion',
 
+'navigation-heading' => 'Llywio',
 'errorpagetitle' => 'Gwall',
 'returnto' => 'Dychwelyd at $1.',
 'tagline' => 'Oddi ar {{SITENAME}}',
@@ -495,8 +494,8 @@ Ceisiwch eto ymhen rhai munudau.",
 'protectedpagetext' => "Mae'r dudalen hon wedi'i diogelu rhag cael ei golygu.",
 'viewsourcetext' => 'Cewch weld a chopïo côd y dudalen:',
 'viewyourtext' => "Cewch weld a copïo ffynhonnell ''eich golygiadau'' i'r dudalen hon:",
-'protectedinterface' => 'Testun ar gyfer rhyngwyneb y wici yw cynnwys y dudalen hon. Clowyd y dudalen er mwyn ei diogeli.',
-'editinginterface' => "'''Dalier sylw:''' Rydych yn golygu tudalen sy'n rhan o destun rhyngwyneb y meddalwedd. Bydd newidiadau i'r dudalen hon yn effeithio ar y rhyngwyneb a ddefnyddir gan eraill. Os am gyfieithu'r neges, ystyriwch ddefnyddio [//translatewiki.net/wiki/Main_Page?setlang=cy translatewiki.net], sef y prosiect MediaWiki sy'n hyrwyddo creu wicïau amlieithog.",
+'protectedinterface' => "Testun ar gyfer rhyngwyneb y wici yw cynnwys y dudalen hon. Clowyd y dudalen er mwyn ei diogeli. Os am gyfieithu'r neges neu ei newid ym mhob wici yn hytrach nag yn hwn yn unig, defnyddiwch [//translatewiki.net/ translatewiki.net], y prosiect MediaWiki sy'n hyrwyddo'r gwaith cyfieithu.",
+'editinginterface' => "'''Dalier sylw:''' Rydych yn golygu tudalen sy'n rhan o destun rhyngwyneb y meddalwedd. Bydd newidiadau i'r dudalen hon yn effeithio ar y rhyngwyneb a ddefnyddir ar y wici hwn yn unig. Os am gyfieithu'r neges rhagosodedig a ddefnyddir ar bob wici, ystyriwch ddefnyddio [//translatewiki.net/ translatewiki.net], sef y prosiect MediaWiki sy'n hyrwyddo creu rhyngwyneb amlieithog ar wicïau.",
 'sqlhidden' => '(cuddiwyd chwiliad SQL)',
 'cascadeprotected' => "Diogelwyd y dudalen hon rhag ei newid, oherwydd ei bod wedi ei chynnwys yn y {{PLURAL:$1|dudalen ganlynol|dudalen ganlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol|tudalennau canlynol}}, a {{PLURAL:$1|honno yn ei thro wedi ei|honno yn ei thro wedi ei|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu|rheiny yn eu tro wedi eu}} diogelu, a'r dewisiad 'sgydol' ynghynn:
 $2",
@@ -522,11 +521,9 @@ Y rheswm a roddwyd gan y gweinyddwr a roddodd y ffeil dan glo yw "\'\'$3\'\'".',
 # Login and logout pages
 'logouttext' => "'''Rydych wedi allgofnodi.'''
 
-Gallwch ddefnyddio {{SITENAME}} yn anhysbys, neu fe allwch [[Special:UserLogin|fewngofnodi eto]] wrth yr un un enw neu wrth enw arall.
+Gallwch ddefnyddio {{SITENAME}} yn anhysbys, neu fe allwch <span class='plainlinks'>[$1 fewngofnodi eto]</span> wrth yr un un enw neu wrth enw arall.
 Sylwer y bydd rhai tudalennau yn parhau i ymddangos fel ag yr oeddent pan oeddech wedi mewngofnodi hyd nes i chi glirio celc eich porwr.",
-'welcomecreation' => "==Croeso, $1!==
-Mae eich cyfrif wedi'i greu.
-Cofiwch osod y [[Special:Preferences|dewisiadau]] sydd fwyaf hwylus i chi ar {{SITENAME}}.",
+'welcomeuser' => 'Croeso, $1!',
 'yourname' => 'Eich enw defnyddiwr:',
 'yourpassword' => 'Eich cyfrinair:',
 'yourpasswordagain' => 'Ail-deipiwch y cyfrinair:',
@@ -761,8 +758,8 @@ Os daethoch yma ar ddamwain, cliciwch botwm '''n&ocirc;l''' y porwr.",
 'anontalkpagetext' => "----''Dyma dudalen sgwrs ar gyfer defnyddiwr anhysbys sydd heb greu cyfrif eto, neu nad yw'n ei ddefnyddio. Felly mae'n rhaid inni ddefnyddio'r cyfeiriad IP i'w (h)adnabod. Mae cyfeiriadau IP yn gallu cael eu rhannu rhwng nifer o ddefnyddwyr. Os ydych chi'n ddefnyddiwr anhysbys ac yn teimlo'ch bod wedi derbyn sylwadau amherthnasol, [[Special:UserLogin/signup|crëwch gyfrif]] neu [[Special:UserLogin|mewngofnodwch]] i osgoi cael eich drysu gyda defnyddwyr anhysbys eraill o hyn ymlaen.''",
 'noarticletext' => "Mae'r dudalen hon yn wag ar hyn o bryd.
 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>.',
+'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>, ond nid yw'r gallu gennych i ddechrau'r dudalen o'r dechrau cyntaf.",
 '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.
@@ -790,7 +787,7 @@ Cofiwch bod y tudalennau .css a .js yn defnyddio llythrennau bach, e.e. {{ns:use
 'updated' => '(Diweddariad)',
 'note' => "'''Dalier sylw:'''",
 'previewnote' => "'''Cofiwch taw rhagolwg yw hwn.''' Nid yw eich gwaith wedi ei roi ar gadw eto!",
-'continue-editing' => 'Parhau i olygu',
+'continue-editing' => "Neidier i'r blwch golygu",
 'previewconflict' => "Mae'r rhagolwg hwn yn dangos y testun yn yr ardal golygu uchaf, fel ag y byddai'n ymddangos petaech yn rhoi'r dudalen ar gadw.",
 'session_fail_preview' => "'''Ymddiheurwn! Methwyd prosesu eich golygiad gan fod rhan o ddata'r sesiwn wedi'i golli. Ceisiwch eto.
 Os digwydd yr un peth eto, ceisiwch [[Special:UserLogout|allgofnodi]] ac yna mewngofnodi eto.'''",
@@ -870,6 +867,11 @@ Ymddengys iddi gael ei dileu.",
 Mae ar gael yn barod.',
 'defaultmessagetext' => 'Y testun rhagosodedig',
 
+# Content models
+'content-model-wikitext' => 'cystrawen wici',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Rhybudd:''' Mae gormod o alwadau ar ffwythiannau dosrannu sy'n dreth ar adnoddau yn y dudalen hon.
 
@@ -1120,8 +1122,6 @@ Pan yn gwneud hyn dylid sicrhau nad yw dilyniant hanes tudalennau yn cael ei ddi
 'search-interwiki-caption' => 'Chwaer-brosiectau',
 'search-interwiki-default' => 'Y canlyniadau o $1:',
 'search-interwiki-more' => '(rhagor)',
-'search-mwsuggest-enabled' => 'gydag awgrymiadau',
-'search-mwsuggest-disabled' => 'dim awgrymiadau',
 'search-relatedarticle' => 'Erthyglau eraill tebyg',
 'mwsuggest-disable' => 'Analluogi awgrymiadau AJAX',
 'searcheverything-enable' => 'Chwilio pob parth',
@@ -1156,7 +1156,7 @@ Cofiwch y gall mynegeion Google o gynnwys {{SITENAME}} fod ar ei hôl hi.",
 
 # Preferences page
 'preferences' => 'Dewisiadau',
-'mypreferences' => 'Fy newisiadau',
+'mypreferences' => 'Dewisiadau',
 'prefs-edits' => 'Nifer y golygiadau:',
 'prefsnologin' => 'Nid ydych wedi mewngofnodi',
 'prefsnologintext' => 'Rhaid i chi <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} fewngofnodi]</span> er mwyn gosod eich dewisiadau defnyddiwr.',
@@ -1632,7 +1632,7 @@ Os yw'r broblem yn parhau, cysylltwch â [[Special:ListUsers/sysop|gweinyddwr]].
 'backend-fail-internal' => 'Cafwyd gwall anhysbys yn y storfa tu ôl i\'r llenni yn "$1".',
 'backend-fail-contenttype' => 'Methwyd a dirnad pa fath o gynnwys sydd yn y ffeil y ceisir ei storio yn "$1".',
 'backend-fail-batchsize' => "Rhoddwyd llwyth o {{PLURAL:$1|$1 o weithrediadau}} ffeil i'w gwneud i'r storfa; ni all nifer y {{PLURAL:$2|gweithrediadau}} fod yn fwy na $2.",
-'backend-fail-usable' => "Ni ellid ysgrifennu'r ffeil $1 oherwydd nad oedd caniatad digonol ynteu bod cyfeiriaduron neu flychau yn eisiau.",
+'backend-fail-usable' => 'Ni ellid darllen nag ysgrifennu\'r ffeil "$1" oherwydd nad oedd caniatad digonol ynteu bod cyfeiriaduron neu flychau yn eisiau.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Methwyd cysylltu â lòg y gweithrediadau ar y storfa "$1".',
@@ -1767,7 +1767,7 @@ Mae modd golygu'r disgrifiad ohoni ar ei [$2 thudalen disgrifio] fan honno.",
 'shared-repo-from' => 'oddi ar $1',
 'shared-repo' => 'storfa cyfrannol',
 'shared-repo-name-wikimediacommons' => 'Comin Wikimedia',
-'upload-disallowed-here' => "Yn anffodus ni allwch drosysgrifo'r ddelwedd hon.",
+'upload-disallowed-here' => "Ni allwch drosysgrifo'r ffeil hon.",
 
 # File reversion
 'filerevert' => 'Gwrthdroi $1',
@@ -2004,7 +2004,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: <code>$1</code> (peidiwch ag ychwanegu\'r rhain wrth ysgrifennu\'r ymholiad).',
+Protocoliau sy\'n cael eu cynnal: <code>$1</code> (yn neidio i http:// os na roddir protocol o gwbl).',
 '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.",
 
@@ -2054,8 +2054,8 @@ er mwyn medru anfon e-bost at ddefnyddwyr eraill.',
 'emailuser-title-target' => "Ebostio'r {{GENDER:$1|defnyddiwr hwn}}",
 'emailuser-title-notarget' => 'Anfon e-bost at ddefnyddiwr',
 'emailpage' => 'Anfon e-bost at ddefnyddiwr',
-'emailpagetext' => "Os yw'r cyfeiriad e-bost sydd yn newisiadau'r 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.",
+'emailpagetext' => 'Os yw\'r cyfeiriad e-bost sydd yn newisiadau\'r {{GENDER:$1|defnyddiwr}} hwn yn un dilys, gellir anfon neges ato o\'i ysgrifennu ar y ffurflen isod.
+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.',
 'usermailererror' => 'Dychwelwyd gwall gan y rhaglen e-bost:',
 'defemailsubject' => '{{SITENAME}} yn anfon e-bost oddi wrth y defnyddiwr "$1"',
 'usermaildisabled' => 'Dim modd anfon e-bost at ddefnyddwyr',
@@ -2086,7 +2086,7 @@ Bydd y cyfeiriad e-bost a osodoch yn eich [[Special:Preferences|dewisiadau chith
 
 # Watchlist
 'watchlist' => 'Fy rhestr wylio',
-'mywatchlist' => 'Fy rhestr wylio',
+'mywatchlist' => 'Rhestr wylio',
 'watchlistfor2' => 'Yn ôl gofyn $1 $2',
 'nowatchlist' => "Mae eich rhestr wylio'n wag.",
 'watchlistanontext' => "Rhaid $1 er mwyn gweld neu ddiwygio'ch rhestr wylio.",
@@ -2124,11 +2124,7 @@ Os ydych am ddiddymu'r dudalen o'r rhestr wylio, cliciwch ar \"Stopio gwylio\" y
 
 'enotif_mailer' => 'Sustem hysbysu {{SITENAME}}',
 'enotif_reset' => 'Ystyried bod pob tudalen wedi cael ymweliad',
-'enotif_newpagetext' => 'Mae hon yn dudalen newydd.',
 'enotif_impersonal_salutation' => 'at ddefnyddiwr {{SITENAME}}',
-'changed' => 'Newidiwyd',
-'created' => 'crëwyd',
-'enotif_subject' => '$CHANGEDORCREATED y dudalen \'$PAGETITLE\' ar {{SITENAME}} gan $PAGEEDITOR',
 'enotif_lastvisited' => 'Gwelwch $1 am bob newid ers eich ymweliad blaenorol.',
 'enotif_lastdiff' => 'Gallwch weld y newid ar $1.',
 'enotif_anon_editor' => 'defnyddiwr anhysbys $1',
@@ -2310,8 +2306,8 @@ Mae'n bosibl bod nam ar y cyswllt, neu fod y diwygiad eisoes wedi'i adfer neu we
 'undeletedrevisions' => 'wedi adfer $1 {{PLURAL:$1|diwygiad|diwygiad|ddiwygiad|diwygiad|diwygiad|diwygiad}}',
 'undeletedrevisions-files' => 'Adferwyd $1 {{PLURAL:$1|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn|fersiwn}} a $2 {{PLURAL:$2|ffeil|ffeil|ffeil|ffeil|ffeil|ffeil}}',
 'undeletedfiles' => 'Adferwyd $1 {{PLURAL:$1|ffeil|ffeil|ffeil|ffeil|ffeil|ffeil}}',
-'cannotundelete' => "Mae'r cais i ddad-ddileu wedi'i fethu;
-efallai bod rhywun arall wedi dad-ddileu'r dudalen yn barod.",
+'cannotundelete' => "Mae'r cais i ddad-ddileu wedi methu:
+$1",
 'undeletedpage' => "'''Adferwyd $1'''
 
 Ceir cofnod o'r tudalennau a ddilëwyd neu a adferwyd yn ddiweddar ar y [[Special:Log/delete|lòg ddileuon]].",
@@ -2345,7 +2341,7 @@ $1',
 # Contributions
 'contributions' => "Cyfraniadau'r defnyddiwr",
 'contributions-title' => "Cyfraniadau'r defnyddiwr am $1",
-'mycontris' => 'Fy nghyfraniadau',
+'mycontris' => 'Cyfraniadau',
 'contribsub2' => 'Dros $1 ($2)',
 'nocontribs' => "Heb ddod o hyd i newidiadau gyda'r meini prawf hyn.",
 'uctop' => '(cyfredol)',
@@ -2386,7 +2382,7 @@ Mae'r cofnod diweddaraf yn y lòg blocio i'w weld isod:",
 'whatlinkshere-hideredirs' => '$1 ailgyfeiriadau',
 'whatlinkshere-hidetrans' => '$1 cynhwysion',
 'whatlinkshere-hidelinks' => '$1 cysylltau',
-'whatlinkshere-hideimages' => '$1 cysylltau delweddau',
+'whatlinkshere-hideimages' => '$1 cysylltau ffeiliau',
 'whatlinkshere-filters' => 'Hidlau',
 
 # Block/unblock
@@ -2742,7 +2738,6 @@ Mae ffolder dros dro yn eisiau.',
 
 # JavaScriptTest
 'javascripttest' => 'Profi JavaScript',
-'javascripttest-disabled' => 'Ni alluogwyd y swyddogaeth hon ar y wici hwn.',
 'javascripttest-title' => 'Yn cynnal profion $1',
 'javascripttest-pagetext-noframework' => 'Neilltuwyd y dudalen hon at gynnal profion JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Ni nabyddwyd y fframwaith profi "$1".',
@@ -2856,6 +2851,7 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
 'pageinfo-default-sort' => 'Allwedd trefnu diofyn',
 'pageinfo-length' => 'Hyd y dudalen (beitiau)',
 'pageinfo-article-id' => 'ID y dudalen',
+'pageinfo-language' => 'Iaith cynnwys y dudalen',
 'pageinfo-robot-policy' => 'Statws i beiriannau chwilio',
 'pageinfo-views' => 'Nifer yr ymweliadau',
 'pageinfo-watchers' => 'Nifer gwylwyr y dudalen',
@@ -2867,8 +2863,10 @@ Achos hyn yn fwy na thebyg yw presenoldeb cysylltiad i wefan ar y rhestr wahardd
 'pageinfo-lasttime' => 'Dyddiad y golygiad diweddaraf',
 'pageinfo-edits' => 'Cyfanswm y golygiadau',
 'pageinfo-authors' => 'Cyfanswm yr awduron gwahanol',
+'pageinfo-recent-edits' => 'Nifer y golygiadau diweddar (o fewn y $1 diwethaf).',
 'pageinfo-magic-words' => '{{PLURAL:$1|Gair|Gair|Geiriau}} hud ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categori|Categori|Categorïau}} cudd ($1)',
+'pageinfo-toolboxlink' => 'Gwybodaeth am y dudalen',
 
 # Skin names
 'skinname-standard' => 'Safonol',
@@ -3681,9 +3679,9 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'logentry-move-move_redir-noredirect' => 'Symudwyd y dudalen $3 i $4 gan $1 dros ddolen ailgyfeirio heb adael dolen ailgyfeirio newydd',
 'logentry-patrol-patrol' => "Rhoddodd $1 nod ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
 'logentry-patrol-patrol-auto' => "Rhoddodd $1 nod yn awtomatig ar ddiwygiad $4 o'r dudalen $3 yn dynodi ei fod wedi derbyn ymweliad patrôl",
-'logentry-newusers-newusers' => 'Crëodd $1 gyfrif defnyddiwr',
-'logentry-newusers-create' => 'Crëodd $1 gyfrif defnyddiwr',
-'logentry-newusers-create2' => 'Crëodd $1 y cyfrif defnyddiwr $3',
+'logentry-newusers-newusers' => 'Dechreuwyd y cyfrif defnyddiwr $1',
+'logentry-newusers-create' => 'Dechreuwyd y cyfrif defnyddiwr $1',
+'logentry-newusers-create2' => 'Dechreuwyd y cyfrif defnyddiwr $3 gan $1',
 'logentry-newusers-autocreate' => 'Crëwyd y cyfrif $1 yn awtomatig',
 'newuserlog-byemail' => 'anfonwyd y cyfrinair trwy e-bost',
 
@@ -3702,6 +3700,10 @@ Dangosir delweddau ar eu maint llawn, dechreuir ffeiliau o fathau eraill yn unio
 'feedback-bugcheck' => "Iawn! Gwnewch yn siwr yn gyntaf nag ydy hwn yn un o'r [$1 bygiau hysbys].",
 'feedback-bugnew' => "Edrychais ar y bygiau hysbys. Mae byg newydd gennyf i'w adrodd",
 
+# Search suggestions
+'searchsuggest-search' => 'Chwilio',
+'searchsuggest-containing' => 'yn cynnwys...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nid oes caniatad gennych i uwchlwytho ffeiliau ar y wici hwn.',
 'api-error-badtoken' => 'Gwall mewnol: tocyn gwael.',
index 71f0d65..a78fc67 100644 (file)
@@ -73,15 +73,6 @@ $namespaceAliases = array(
        'Hjælp-diskussion'     => NS_HELP_TALK,
 );
 
-$bookstoreList = array(
-       "Bibliotek.dk" => "http://bibliotek.dk/vis.php?base=dfa&origin=kommando&field1=ccl&term1=is=$1&element=L&start=1&step=10",
-       "Bogguide.dk" => "http://www.bogguide.dk/find_boeger_bog.asp?ISBN=$1",
-       'inherit' => true,
-);
-
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-$linkTrail = '/^([a-zæøå]+)(.*)$/sDu';
-
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktive_Brugere' ),
        'Allmessages'               => array( 'MediaWiki-systemmeddelelser' ),
@@ -125,6 +116,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIME-type-søgning' ),
        'Mostcategories'            => array( 'Sider_med_flest_kategorier' ),
        'Mostimages'                => array( 'Mest_brugte_filer' ),
+       'Mostinterwikis'            => array( 'Flest_interwikilinks' ),
        'Mostlinked'                => array( 'Sider_med_flest_henvisninger' ),
        'Mostlinkedcategories'      => array( 'Kategorier_med_flest_sider' ),
        'Mostlinkedtemplates'       => array( 'Hyppigst_brugte_skabeloner' ),
@@ -145,7 +137,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Seneste_ændringer' ),
        'Recentchangeslinked'       => array( 'Relaterede_ændringer' ),
        'Revisiondelete'            => array( 'Versionssletning' ),
-       'RevisionMove'              => array( 'Versionsflytning' ),
        'Search'                    => array( 'Søgning' ),
        'Shortpages'                => array( 'Korteste_sider' ),
        'Specialpages'              => array( 'Specialsider' ),
@@ -186,6 +177,15 @@ $dateFormats = array(
        'ymd both' => 'Y M j, H:i'
 );
 
+$bookstoreList = array(
+       "Bibliotek.dk" => "http://bibliotek.dk/vis.php?base=dfa&origin=kommando&field1=ccl&term1=is=$1&element=L&start=1&step=10",
+       "Bogguide.dk" => "http://www.bogguide.dk/find_boeger_bog.asp?ISBN=$1",
+       'inherit' => true,
+);
+
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$linkTrail = '/^([a-zæøå]+)(.*)$/sDu';
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Understreg henvisninger:',
@@ -236,7 +236,7 @@ $messages = array(
 
 'underline-always' => 'Altid',
 'underline-never' => 'Aldrig',
-'underline-default' => 'Brug browserens indstilling',
+'underline-default' => 'Brug browserens indstilling eller standarden for det valgte udseende',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Skriftstil ved redigering:',
@@ -321,8 +321,8 @@ $messages = array(
 'newwindow' => '(åbner i et nyt vindue)',
 'cancel' => 'Afbryd',
 'moredotdotdot' => 'Mere...',
-'mypage' => 'Min side',
-'mytalk' => 'Min diskussion',
+'mypage' => 'Side',
+'mytalk' => 'Diskussion',
 'anontalk' => 'Diskussionsside for denne IP-adresse',
 'navigation' => 'Navigation',
 'and' => '&#32;og',
@@ -332,7 +332,6 @@ $messages = array(
 'qbbrowse' => 'Gennemse',
 'qbedit' => 'Redigér',
 'qbpageoptions' => 'Indstillinger for side',
-'qbpageinfo' => 'Information om side',
 'qbmyoptions' => 'Mine indstillinger',
 'qbspecialpages' => 'Specielle sider',
 'faq' => 'OSS',
@@ -345,7 +344,7 @@ $messages = array(
 'vector-action-protect' => 'Beskyt',
 'vector-action-undelete' => 'Gendan',
 'vector-action-unprotect' => 'Ændr beskyttelse',
-'vector-simplesearch-preference' => 'Aktivér forbedrede søgeforslag (kun Vector-udseendet)',
+'vector-simplesearch-preference' => 'Aktivér forenklet søgefelt (kun Vector-udseendet)',
 'vector-view-create' => 'Opret',
 'vector-view-edit' => 'Redigér',
 'vector-view-history' => 'Se historik',
@@ -355,6 +354,7 @@ $messages = array(
 'namespaces' => 'Navnerum',
 'variants' => 'Varianter',
 
+'navigation-heading' => 'Navigationsmenu',
 'errorpagetitle' => 'Fejl',
 'returnto' => 'Tilbage til $1.',
 'tagline' => 'Fra {{SITENAME}}',
@@ -562,7 +562,7 @@ Forespørgsel: $2',
 'viewsource-title' => 'Se kildekoden til $1',
 'actionthrottled' => 'Begrænsning af handling',
 'actionthrottledtext' => 'For at modvirke spam, er det ikke muligt at udføre denne handling mange gange på kort tid. Du har overskredet grænsen, hvorfor handlingen er blevet afbrudt. Vær venlig at forsøge igen om et par minutter.',
-'protectedpagetext' => 'Denne side er skrivebeskyttet.',
+'protectedpagetext' => 'Denne side er blevet beskyttet, for at forhindre redigering eller andre handlinger.',
 'viewsourcetext' => 'Du kan se og kopiere kildekoden til siden:',
 'viewyourtext' => "Du kan se og kopiere kildekoden for '''dine redigeringer''' til denne side:",
 'protectedinterface' => 'Denne side indeholder teksten i brugergrænsefladen til softwaren på denne wiki, og er beskyttet for at forhindre misbrug.
@@ -593,11 +593,11 @@ Administratoren, som skrivebeskyttede den, gav følgende begrundelse: "$3".',
 # Login and logout pages
 'logouttext' => "'''Du er nu logget af.'''
 
-Du kan fortsætte med at bruge {{SITENAME}} anonymt, eller du kan [[Special:UserLogin|logge på igen]] som den samme eller en anden bruger.
+Du kan fortsætte med at bruge {{SITENAME}} anonymt, eller du kan <span class='plainlinks'>[$1 logge på igen]</span> som den samme eller en anden bruger.
 Bemærk, at nogle sider stadigvæk kan vises som om du var logget på, indtil du tømmer din browsers cache.",
-'welcomecreation' => '== Velkommen, $1! ==
-
-Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Preferences|{{SITENAME}}-indstillinger]].',
+'welcomeuser' => 'Velkommen, $1!',
+'welcomecreation-msg' => 'Din konto er blevet oprettet.
+Glem ikke at ændre dine [[Special:Preferences|{{SITENAME}} indstillinger]].',
 'yourname' => 'Dit brugernavn:',
 'yourpassword' => 'Din adgangskode:',
 'yourpasswordagain' => 'Gentag adgangskode',
@@ -762,7 +762,7 @@ Midlertidig adgangskode: $2',
 'extlink_sample' => 'http://www.example.com Titel på henvisning',
 'extlink_tip' => 'Ekstern henvisning (husk http:// præfiks)',
 'headline_sample' => 'Tekst til overskrift',
-'headline_tip' => 'Type 2 overskrift',
+'headline_tip' => 'Type 2-overskrift',
 'nowiki_sample' => 'Indsæt tekst her som ikke skal wikiformateres',
 'nowiki_tip' => 'Ignorer wikiformatering',
 'image_sample' => 'Eksempel.jpg',
@@ -800,7 +800,7 @@ Blokeringen udløber: $6
 Blokeringen er rettet mod: $7
 
 Du kan kontakte $1 eller en af de andre [[{{MediaWiki:Grouppage-sysop}}|administratorer]] for at diskutere blokeringen.
-Du kan ikke bruge funktionen 'e-mail til denne bruger' medmindre der er angivet en gyldig email-adresse i dine
+Du kan ikke bruge funktionen 'e-mail til denne bruger' medmindre der er angivet en gyldig e-mailadresse i dine
 [[Special:Preferences|kontoindstillinger]], og du ikke er blevet blokeret fra at bruge den.
 
 Din nuværende IP-adresse er $3, og blokerings-id er #$5.
@@ -876,7 +876,7 @@ Loggen over den seneste blokering ses nedenfor:',
 'note' => "'''Bemærk:'''",
 'previewnote' => "'''Husk at dette er kun en forhåndsvisning.'''
 Dine ændringer er endnu ikke blevet gemt!",
-'continue-editing' => 'Fortsæt med at redigere',
+'continue-editing' => 'Gå til redigeringsfeltet',
 'previewconflict' => 'Denne forhåndsvisning er resultatet af den redigérbare tekst ovenfor, sådan vil det komme til at se ud hvis du vælger at gemme teksten.',
 'session_fail_preview' => "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.
 Prøv venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
@@ -952,6 +952,15 @@ Den ser du til at være slettet.',
 'edit-no-change' => 'Din ændring ignoreredes, fordi der ikke var ændring af teksten.',
 'edit-already-exists' => 'En ny side kunne ikke oprettes, fordi den allerede findes.',
 'defaultmessagetext' => 'Standardtekst',
+'content-failed-to-parse' => 'Kunne ikke fortolke $2-indholdet af $1-modellen: $3',
+'invalid-content-data' => 'Ugyldig indholdsdata',
+'content-not-allowed-here' => '"$1" indhold er ikke tilladt på siden [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'almindelig tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Advarsel: Der er for mange beregningstunge oversætter-funktionskald på denne side.
@@ -1203,8 +1212,6 @@ Detaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-interwiki-caption' => 'Søsterprojekter',
 'search-interwiki-default' => '{{PLURAL:$1|et resultat|$1 resultater}}:',
 'search-interwiki-more' => '(mere)',
-'search-mwsuggest-enabled' => 'med forslag',
-'search-mwsuggest-disabled' => 'ingen forslag',
 'search-relatedarticle' => 'Relateret',
 'mwsuggest-disable' => 'Slå AJAX-forslag fra',
 'searcheverything-enable' => 'Søg i alle navnerum',
@@ -1313,7 +1320,7 @@ Her er en tilfældig genereret værdi som du kan bruge: $1',
 Det kan ikke gøres om.',
 'prefs-emailconfirm-label' => 'Bekræftelse af e-mail:',
 'prefs-textboxsize' => 'Størrelse på redigeringsvindue',
-'youremail' => 'Din e-mail-adresse:',
+'youremail' => 'Din e-mailadresse:',
 'username' => 'Brugernavn:',
 'uid' => 'Brugernummer:',
 'prefs-memberingroups' => 'Medlem af {{PLURAL:$1|gruppen|grupperne}}:',
@@ -1469,6 +1476,9 @@ Hvis du vælger at oplyse dit navn, vil det blive brugt til at tilskrive dig dit
 'rightslogtext' => 'Dette er en log over ændringer i brugeres rettigheder.',
 'rightslogentry' => 'ændrede grupperettigheder for „$1“ fra „$2“ til „$3“.',
 'rightslogentry-autopromote' => 'blev automatisk forfremmet fra $2 til $3',
+'logentry-rights-rights' => '$1 ændrede gruppemedlemskabet for $3 fra $4 til $5',
+'logentry-rights-rights-legacy' => '$1 ændrede gruppemedlemskabet for $3',
+'logentry-rights-autopromote' => '$1 blev automatisk forfremmet fra $4 til $5',
 'rightsnone' => '(-)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1663,6 +1673,20 @@ Det er ikke tilladt at uploade Javafiler, da det kan forårsage, at sikkerhedsre
 'watchthisupload' => 'Overvåg filen',
 'filewasdeleted' => 'En fil med dette navn er tidligere uploadet og i mellemtiden slettet igen. Kontroller først indførslen i $1, før du gemmer filen.',
 'filename-bad-prefix' => "Navnet på filen du er ved at lægge op begynder med '''\"\$1\"'''. Dette er et ikkebeskrivende navn, der typisk er skabt automatisk af et digitalkamera. Vær venlig at vælge et mere beskrivende navn på dit billede.",
+'filename-prefix-blacklist' => ' #<!-- efterlad denne linje præcis som den er --> <pre>
+# Syntax is as follows:
+#   * Alt fra at "#" tegn til slutningen af linjen er en kommentar
+#   * Hver ikke tom linje er et præfiks for typiske filnavne automatisk tildelt af digitalkameraer
+CIMG # Casio
+DSC_ # Nikon
+DSCF # Fuji
+DSCN # Nikon
+DUW # nogen mobil telefoner
+IMG # generic
+JD # Jenoptik
+MGP # Pentax
+PICT # div.
+ #</pre> <!-- efterlad denne linje præcis som den er -->',
 'upload-success-subj' => 'Oplægningen er gennemført',
 'upload-success-msg' => 'Din upload fra [$2] lykkedes. Den er tilgængelig her: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'Upload problem',
@@ -1692,6 +1716,7 @@ Informer venligst en [[Special:ListUsers/sysop|systemadministrator]].',
 'backend-fail-notsame' => 'En ikke-identisk fil eksisterer allerede som $1.',
 'backend-fail-invalidpath' => '$1 er ikke en gyldig lagringssti.',
 'backend-fail-delete' => 'Kunne ikke slette filen $1.',
+'backend-fail-describe' => 'Kunne ikke ændre metadata for filen "$1".',
 'backend-fail-alreadyexists' => 'Filen $1 findes allerede.',
 'backend-fail-store' => 'Kunne ikke gemme filen $1 i $2.',
 'backend-fail-copy' => 'Kunne ikke kopiere filen $1 til $2.',
@@ -1840,7 +1865,7 @@ Måske vil du redigere beskrivelsen på dens [$2 filbeskrivelsesside] der.',
 'uploadnewversion-linktext' => 'Læg en ny version af denne fil op',
 'shared-repo-from' => 'fra $1',
 'shared-repo' => 'et delt filarkiv',
-'upload-disallowed-here' => 'Desværre kan du ikke overskrive dette billede.',
+'upload-disallowed-here' => 'Du kan ikke overskrive denne fil.',
 
 # File reversion
 'filerevert' => 'Gendan $1',
@@ -2078,7 +2103,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: <code>$1</code> (tilføj ikke protokollerne til din søgning).',
+Understøttede protokoller: <code>$1</code> (bruger automatisk http:// hvis der ikke er angivet nogen protokol).',
 'linksearch-line' => '$2 linker til $1',
 'linksearch-error' => 'Wildcards må kun benyttes i starten af hostnavnet.',
 
@@ -2128,8 +2153,8 @@ Der findes muligvis [[{{MediaWiki:Listgrouprights-helppage}}|yderligere informat
 'emailuser-title-target' => 'Send email til denne {{GENDER:$1|bruger}}',
 'emailuser-title-notarget' => 'Send email til en bruger',
 'emailpage' => 'E-mail bruger',
-'emailpagetext' => 'Du kan bruge formularen nedenfor til at sende en e-mail til denne bruger.
-Den e-mail-adresse du har angivet i [[Special:Preferences|dine indstillinger]] vil dukke op i "fra"-feltet på e-mailen, så modtageren kan svare dig.',
+'emailpagetext' => 'Du kan bruge formularen nedenfor til at sende en e-mail til denne {{GENDER:$1|bruger}}.
+Den e-mail-adresse, du har angivet i [[Special:Preferences|dine indstillinger]], vil dukke op i "fra"-feltet på e-mailen, så modtageren kan svare dig.',
 'usermailererror' => 'E-mail-modulet returnerede en fejl:',
 'defemailsubject' => '{{SITENAME}}-email fra brugeren "$1"',
 'usermaildisabled' => 'Bruger-e-mail deaktiveret',
@@ -2160,7 +2185,7 @@ Den e-mail-adresse du har angivet i [[Special:Preferences|dine indstillinger]] v
 
 # Watchlist
 'watchlist' => 'Overvågningsliste',
-'mywatchlist' => 'Min overvågningsliste',
+'mywatchlist' => 'Overvågningsliste',
 'watchlistfor2' => 'For $1 $2',
 'nowatchlist' => 'Du har ingenting i din overvågningsliste.',
 'watchlistanontext' => 'Du skal $1, for at se din overvågningsliste eller ændre indholdet af den.',
@@ -2195,19 +2220,23 @@ Den e-mail-adresse du har angivet i [[Special:Preferences|dine indstillinger]] v
 
 'enotif_mailer' => '{{SITENAME}} informationsmail',
 'enotif_reset' => 'Marker alle sider som besøgt',
-'enotif_newpagetext' => 'Dette er en ny side.',
 'enotif_impersonal_salutation' => '{{SITENAME}} bruger',
-'changed' => 'ændret',
-'created' => 'oprettet',
-'enotif_subject' => '{{SITENAME}}-siden $PAGETITLE er blevet ændret af $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} side $1 er blevet slettet af {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}} side $1 er blevet oprettet af {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}} side $1 er blevet flyttet af {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}} side $1 er blevet gendannet af {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}} side $1 er blevet ændret af {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => '{{SITENAME}} siden $1 er blevet slettet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.',
+'enotif_body_intro_created' => '{{SITENAME}} siden $1 er blevet oprettet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.',
+'enotif_body_intro_moved' => '{{SITENAME}} siden $1 er blevet flyttet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle revision.',
+'enotif_body_intro_restored' => '{{SITENAME}} siden $1 er blevet gendannet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.',
+'enotif_body_intro_changed' => '{{SITENAME}} siden $1 er blevet ændret den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.',
 'enotif_lastvisited' => 'Se $1 for alle ændringer siden dit sidste besøg.',
 'enotif_lastdiff' => 'Se $1 for at vise denne ændring.',
 'enotif_anon_editor' => 'anonym bruger $1',
-'enotif_body' => 'Kære $WATCHINGUSERNAME,
-
-{{SITENAME}}-siden $PAGETITLE er blevet $CHANGEDORCREATED den $PAGEEDITDATE af $PAGEEDITOR, se $PAGETITLE_URL for den aktuelle version.
+'enotif_body' => 'Kære $WATCHINGUSERNAME
 
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Bidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2215,13 +2244,12 @@ Kontakt bidragyderen:
 e-mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Du vil ikke modtage flere beskeder om yderligere ændringer medmindre du besøger denne side.
-På din overvågningsliste kan du også nulstille alle markeringer på de sider, du overvåger.
+Du vil ikke modtage flere beskeder om yderligere ændringer medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.
 
              Med venlig hilsen {{SITENAME}}s informationssystem
 
 --
-For at ændre dine indstillinger for e-mail-notifikationer, besøg
+For at ændre dine indstillinger for e-mail meddelelser, besøg
 {{canonicalurl:{{#special:Preferences}}}}
 
 For at ændre indstillingerne for din overvågningsliste, besøg
@@ -2380,7 +2408,8 @@ Teksten i de slettede versioner er kun tilgængelig for administratorer.',
 'undeletedrevisions' => '$1 {{PLURAL:$1|version|versioner}} gendannet',
 'undeletedrevisions-files' => '$1 {{plural:$1|version|versioner}} og $2 {{plural:$2|fil|filer}} gendannet',
 'undeletedfiles' => '$1 {{plural:$1|fil|filer}} gendannet',
-'cannotundelete' => 'Gendannelse mislykkedes; en anden har allerede gendannet siden.',
+'cannotundelete' => 'Gendannelse mislykkedes:
+$1',
 'undeletedpage' => "'''$1''' blev gendannet.
 
 I [[Special:Log/delete|slette-loggen]] findes en oversigt over de nyligt slettede og gendannede sider.",
@@ -2411,9 +2440,9 @@ $1',
 'blanknamespace' => '(Hoved)',
 
 # Contributions
-'contributions' => 'Brugerbidrag',
+'contributions' => '{{GENDER:$1|Brugerbidrag}}',
 'contributions-title' => 'Brugerbidrag for $1',
-'mycontris' => 'Mine bidrag',
+'mycontris' => 'Bidrag',
 'contribsub2' => 'For $1 ($2)',
 'nocontribs' => 'Ingen ændringer er fundet som opfylder disse kriterier.',
 'uctop' => ' (seneste)',
@@ -2453,7 +2482,7 @@ Den seneste post i blokeringsloggen vises nedenfor:',
 'whatlinkshere-hideredirs' => '$1 omdirigeringer',
 'whatlinkshere-hidetrans' => '$1 inkluderinger',
 'whatlinkshere-hidelinks' => '$1 henvisninger',
-'whatlinkshere-hideimages' => '$1 fillinks',
+'whatlinkshere-hideimages' => '$1 filhenvisninger',
 'whatlinkshere-filters' => 'Filtre',
 
 # Block/unblock
@@ -2538,7 +2567,7 @@ Se [[Special:BlockList|blokeringslisten]] for alle blokeringer.',
 'unblocklink' => 'ophæv blokering',
 'change-blocklink' => 'ændr blokering',
 'contribslink' => 'bidrag',
-'emaillink' => 'send email',
+'emaillink' => 'send e-mail',
 'autoblocker' => 'Du er automatisk blokeret, fordi du deler IP-adresse med "[[User:$1|$1]]".
 Begrundelse: "$2".',
 'blocklogpage' => 'Blokeringslog',
@@ -2667,6 +2696,7 @@ Artiklen "[[:$1]]" eksisterer allerede. Vil du slette den for at gøre plads til
 'immobile-target-namespace-iw' => 'En side kan ikke flyttes til en interwiki-henvisning.',
 'immobile-source-page' => 'Denne side kan ikke flyttes.',
 'immobile-target-page' => 'Kan ikke flytte til det navn.',
+'bad-target-model' => 'Den ønskede destination bruger en anden indholdsmodel. Kan ikke konvertere fra $1 til $2.',
 'imagenocrossnamespace' => 'Filer kan ikke flyttes til et navnerum der ikke indeholder filer',
 'nonfile-cannot-move-to-file' => 'Kan ikke flytte ikke-filer til fil-navnerummet',
 'imagetypemismatch' => 'Den nye filendelse passer ikke til filtypen',
@@ -2791,7 +2821,6 @@ Alle Transwiki import-aktioner protokolleres i [[Special:Log/import|import-logge
 
 # JavaScriptTest
 'javascripttest' => 'Test af JavaScript',
-'javascripttest-disabled' => 'Denne funktion er ikke aktiveret på denne wiki.',
 'javascripttest-title' => 'Kører $1 test',
 'javascripttest-pagetext-noframework' => 'Denne side er reserveret til at teste JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Ukendt testmiljø "$1".',
@@ -2842,7 +2871,7 @@ Du kan se på kildeteksten.',
 'tooltip-t-contributions' => 'Se denne brugers bidrag',
 'tooltip-t-emailuser' => 'Send en e-mail til denne bruger',
 'tooltip-t-upload' => 'Upload et billede eller anden mediafil',
-'tooltip-t-specialpages' => 'Liste med alle specielle sider',
+'tooltip-t-specialpages' => 'Liste over alle specialsider',
 'tooltip-t-print' => 'Printervenlig udgave af denne side',
 'tooltip-t-permalink' => 'Permanent henvisning til denne version af denne side',
 'tooltip-ca-nstab-main' => 'Se indholdet',
@@ -2906,6 +2935,7 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 
 # Info page
 'pageinfo-title' => 'Information om "$1"',
+'pageinfo-not-current' => 'Beklager, det er umuligt at give denne information for gamle udgaver.',
 'pageinfo-header-basic' => 'Grundlæggende oplysninger',
 'pageinfo-header-edits' => 'Redigeringshistorik',
 'pageinfo-header-restrictions' => 'Sidebeskyttelse',
@@ -2914,6 +2944,7 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'pageinfo-default-sort' => 'Standardsorteringsnøgle',
 'pageinfo-length' => 'Sidelængde (i bytes)',
 'pageinfo-article-id' => 'Side-ID',
+'pageinfo-language' => 'Sprog for sideindholdet',
 'pageinfo-robot-policy' => 'Søgemaskinestatus',
 'pageinfo-robot-index' => 'Indekserbar',
 'pageinfo-robot-noindex' => 'Ikke indekserbar',
@@ -2930,10 +2961,17 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'pageinfo-authors' => 'Det samlede antal forskellige forfattere',
 'pageinfo-recent-edits' => 'Antallet af nylige redigeringer (i løbet af de seneste $1)',
 'pageinfo-recent-authors' => 'Antallet af bidragydere, der har redigeret siden for nyligt',
-'pageinfo-restriction' => 'Sidebeskyttelse ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magisk|Magiske}} ord ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skjult kategori|Skjulte kategorier}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Transkluderet skabelon|Transkluderede skabeloner}} ($1)',
+'pageinfo-toolboxlink' => 'Oplysninger om siden',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Talt som en indholdsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Kaskadebeskyttelser begynder her',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Kaskadebeskyttelser begynder fra',
 
 # Skin names
 'skinname-standard' => 'Klassik',
@@ -2955,6 +2993,8 @@ Dette skyldes sandsynligvis en henvisning til et sortlistet eksternt websted.',
 'markedaspatrollederror' => 'Markering som „kontrolleret“ ikke mulig.',
 'markedaspatrollederrortext' => 'Du skal vælge en sideændring.',
 'markedaspatrollederror-noautopatrol' => 'Du må ikke markere dine egne ændringer som kontrolleret.',
+'markedaspatrollednotify' => 'Denne ændring af $1 er blevet markeret som patruljeret.',
+'markedaspatrollederrornotify' => 'Markering som patruljeret mislykkedes.',
 
 # Patrol log
 'patrol-log-page' => 'Kontrollog',
@@ -3019,6 +3059,7 @@ Du kan beskadige dit system hvis du udfører den.",
 'hours' => '{{PLURAL: $1|$1 time|$1 timer}}',
 'days' => '{{PLURAL: $1|$1 dag|$1 dage}}',
 'ago' => '$1 siden',
+'just-now' => 'lige nu',
 
 # Bad image list
 'bad_image_list' => 'Formatet er:
@@ -3506,6 +3547,7 @@ Denne bekræftelseskode vil udløbe den $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-tilkobling er deaktiveret]',
 'scarytranscludefailed' => '[Hentning af skabelon for $1 mislykkedes]',
+'scarytranscludefailed-httpstatus' => '[Hentning af skabelon for $1 mislykkedes: HTTP $2]',
 'scarytranscludetoolong' => "[URL'en er for lang]",
 
 # Delete conflict
@@ -3617,6 +3659,7 @@ Du kan også [[Special:EditWatchlist|bruge standard editoren]].',
 'version-license' => 'Licens',
 'version-poweredby-credits' => "Denne wiki er drevet af '''[//www.mediawiki.org/ MediaWiki ]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andre',
+'version-credits-summary' => 'Vi vil gerne anerkende følgende personer for deres bidrag til [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki er fri software; du kan redistribuere det og/eller ændre det under betingelserne i GNU General Public License som offentliggjort af Free Software Foundation; enten version 2 af licensen eller (efter eget valg) enhver senere version. 
 
 MediaWiki distribueres i håb om at det vil være nyttigt, men UDEN NOGEN GARANTI; uden selv de underforståede garantier SALGBARHED eller EGNETHED TIL ET BESTEMT FORMÅL. Se GNU General Public License for yderligere detaljer. 
@@ -3755,9 +3798,9 @@ Billeder vises i fuld opløsning, og andre mediatyper vil blive aktiveret med de
 'logentry-move-move_redir-noredirect' => '$1 flyttede siden $3 til $4 hen over en omdirigering og uden at efterlade en omdirigering',
 'logentry-patrol-patrol' => '$1 markerede version $4 af siden $3 som patruljeret',
 'logentry-patrol-patrol-auto' => '$1 markerede automatisk version $4 af siden $3 som patruljeret',
-'logentry-newusers-newusers' => '$1 oprettede en brugerkonto',
-'logentry-newusers-create' => '$1 oprettede en brugerkonto',
-'logentry-newusers-create2' => '$1 oprettede brugerkontoen $3',
+'logentry-newusers-newusers' => 'Brugerkontoen $1 blev oprettet',
+'logentry-newusers-create' => 'Brugerkontoen $1 blev oprettet',
+'logentry-newusers-create2' => 'Brugerkontoen $3 blev oprettet af $1',
 'logentry-newusers-autocreate' => 'Kontoen $1 blev automatisk oprettet',
 'newuserlog-byemail' => 'kodeord tilsendt pr. e-mail',
 
@@ -3777,6 +3820,10 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 'feedback-bugcheck' => 'Skønt! Men tjek venligst, at det ikke er en af de [$1 kendte fejl].',
 'feedback-bugnew' => 'Jeg har kontrolleret. Rapporter en ny fejl.',
 
+# Search suggestions
+'searchsuggest-search' => 'Søg',
+'searchsuggest-containing' => 'indeholder...',
+
 # API errors
 'api-error-badaccess-groups' => 'Du har ikke tilladelse til at overføre filer til denne wiki.',
 'api-error-badtoken' => 'Intern fejl: ugyldigt mærke.',
@@ -3829,4 +3876,6 @@ Ellers kan du bruge den enkle formular nedenfor. Din kommentar vil blive tilføj
 'duration-centuries' => '$1 {{PLURAL:$1|århundrede|århundreder}}',
 'duration-millennia' => '$1 {{PLURAL:$1|årtusind|årtusinder}}',
 
+# Unknown messages
+'svg-long-error' => 'Ugyldig SVG-fil: $1',
 );
index e987ae0..3505c5a 100644 (file)
  * @author ChrisiPK
  * @author Church of emacs
  * @author DaSch
+ * @author Das Schäfchen
  * @author Duesentrieb
  * @author Filzstift
  * @author Geitost
  * @author Giftpflanze
+ * @author Hoo
  * @author Imre
  * @author Inkowik
  * @author Jan Luca
@@ -69,8 +71,6 @@
  * @author ✓
  */
 
-$capitalizeAllNouns = true;
-
 $namespaceNames = array(
        NS_MEDIA            => 'Medium',
        NS_SPECIAL          => 'Spezial',
@@ -94,22 +94,12 @@ $namespaceAliases = array(
        'Bild' => NS_FILE,
        'Bild_Diskussion' => NS_FILE_TALK,
 );
+
 $namespaceGenderAliases = array(
        NS_USER => array( 'male' => 'Benutzer', 'female' => 'Benutzerin' ),
        NS_USER_TALK => array( 'male' => 'Benutzer_Diskussion', 'female' => 'Benutzerin_Diskussion' ),
 );
 
-$bookstoreList = array(
-       'abebooks.de' => 'http://www.abebooks.de/servlet/BookSearchPL?ph=2&isbn=$1',
-       'amazon.de' => 'http://www.amazon.de/gp/search/field-isbn=$1',
-       'buch.de' => 'http://www.buch.de/shop/home/suche/?sswg=BUCH&sq=$1',
-       'Karlsruher Virtueller Katalog (KVK)' => 'http://www.ubka.uni-karlsruhe.de/kvk.html?SB=$1',
-       'Lehmanns Fachbuchhandlung' => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1'
-);
-
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-$linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
-
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktive_Benutzer' ),
        'Allmessages'               => array( 'MediaWiki-Systemnachrichten', 'Systemnachrichten' ),
@@ -181,7 +171,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Letzte_Änderungen' ),
        'Recentchangeslinked'       => array( 'Änderungen_an_verlinkten_Seiten' ),
        'Revisiondelete'            => array( 'Versionslöschung' ),
-       'RevisionMove'              => array( 'Version_verschieben' ),
        'Search'                    => array( 'Suche' ),
        'Shortpages'                => array( 'Kürzeste_Seiten' ),
        'Specialpages'              => array( 'Spezialseiten' ),
@@ -212,39 +201,6 @@ $specialPageAliases = array(
        'Withoutinterwiki'          => array( 'Fehlende_Interwikis' ),
 );
 
-$datePreferences = array(
-       'default',
-       'dmyt',
-       'dmyts',
-       'dmy',
-       'ymd',
-       'ISO 8601'
-);
-
-$defaultDateFormat = 'dmy';
-
-$dateFormats = array(
-       'dmyt time' => 'H:i',
-       'dmyt date' => 'j. F Y',
-       'dmyt both' => 'j. M Y, H:i',
-
-       'dmyts time' => 'H:i:s',
-       'dmyts date' => 'j. F Y',
-       'dmyts both' => 'j. M Y, H:i:s',
-
-       'dmy time' => 'H:i',
-       'dmy date' => 'j. F Y',
-       'dmy both' => 'H:i, j. M Y',
-
-       'ymd time' => 'H:i',
-       'ymd date' => 'Y M j',
-       'ymd both' => 'H:i, Y M j',
-
-       'ISO 8601 time' => 'xnH:xni:xns',
-       'ISO 8601 date' => 'xnY-xnm-xnd',
-       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns'
-);
-
 $magicWords = array(
        'redirect'                  => array( '0', '#WEITERLEITUNG', '#REDIRECT' ),
        'notoc'                     => array( '0', '__KEIN_INHALTSVERZEICHNIS__', '__KEININHALTSVERZEICHNIS__', '__NOTOC__' ),
@@ -252,14 +208,13 @@ $magicWords = array(
        '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' ),
+       'currentmonthnamegen'       => array( '1', 'JETZIGER_MONATSNAME_GENITIV', 'JETZIGER_MONATSNAME_GEN', 'CURRENTMONTHNAMEGEN' ),
        'currentmonthabbrev'        => array( '1', 'JETZIGER_MONATSNAME_KURZ', 'CURRENTMONTHABBREV' ),
-       'currentday'                => array( '1', 'JETZIGER_KALENDERTAG', 'CURRENTDAY' ),
-       'currentday2'               => array( '1', 'JETZIGER_KALENDERTAG_2', 'CURRENTDAY2' ),
+       'currentday'                => array( '1', 'JETZIGER_KALENDERTAG', 'JETZIGER_TAG', 'CURRENTDAY' ),
+       'currentday2'               => array( '1', 'JETZIGER_KALENDERTAG_2', 'JETZIGER_TAG_2', 'CURRENTDAY2' ),
        'currentdayname'            => array( '1', 'JETZIGER_WOCHENTAG', 'CURRENTDAYNAME' ),
        'currentyear'               => array( '1', 'JETZIGES_JAHR', 'CURRENTYEAR' ),
        'currenttime'               => array( '1', 'JETZIGE_UHRZEIT', 'CURRENTTIME' ),
@@ -267,10 +222,10 @@ $magicWords = array(
        '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' ),
+       'localmonthnamegen'         => array( '1', 'LOKALER_MONATSNAME_GENITIV', 'LOKALER_MONATSNAME_GEN', 'LOCALMONTHNAMEGEN' ),
        'localmonthabbrev'          => array( '1', 'LOKALER_MONATSNAME_KURZ', 'LOCALMONTHABBREV' ),
-       'localday'                  => array( '1', 'LOKALER_KALENDERTAG', 'LOCALDAY' ),
-       'localday2'                 => array( '1', 'LOKALER_KALENDERTAG_2', 'LOCALDAY2' ),
+       'localday'                  => array( '1', 'LOKALER_KALENDERTAG', 'LOKALER_TAG', 'LOCALDAY' ),
+       'localday2'                 => array( '1', 'LOKALER_KALENDERTAG_2', 'LOKALER_TAG_2', 'LOCALDAY2' ),
        'localdayname'              => array( '1', 'LOKALER_WOCHENTAG', 'LOCALDAYNAME' ),
        'localyear'                 => array( '1', 'LOKALES_JAHR', 'LOCALYEAR' ),
        'localtime'                 => array( '1', 'LOKALE_UHRZEIT', 'LOCALTIME' ),
@@ -299,8 +254,8 @@ $magicWords = array(
        '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' ),
+       'subjectpagename'           => array( '1', 'HAUPTSEITENNAME', 'VORDERSEITE', 'HAUPTSEITE', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'subjectpagenamee'          => array( '1', 'HAUPTSEITENNAME_URL', 'VORDERSEITE_URL', 'HAUPTSEITE_URL', 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ),
        'subst'                     => array( '0', 'ERS:', 'SUBST:' ),
        'safesubst'                 => array( '0', 'SICHER_ERS:', 'SICHERERS:', 'SAFESUBST:' ),
        'img_thumbnail'             => array( '1', 'miniatur', 'mini', 'thumbnail', 'thumb' ),
@@ -312,7 +267,7 @@ $magicWords = array(
        '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_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' ),
@@ -324,6 +279,7 @@ $magicWords = array(
        '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' ),
+       'img_class'                 => array( '1', 'klasse=$1', 'class=$1' ),
        'int'                       => array( '0', 'NACHRICHT:', 'INT:' ),
        'sitename'                  => array( '1', 'PROJEKTNAME', 'SITENAME' ),
        'ns'                        => array( '0', 'NR:', 'NS:' ),
@@ -338,18 +294,18 @@ $magicWords = array(
        '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' ),
+       'currentweek'               => array( '1', 'JETZIGE_KALENDERWOCHE', 'JETZIGE_WOCHE', 'CURRENTWEEK' ),
        'currentdow'                => array( '1', 'JETZIGER_WOCHENTAG_ZAHL', 'CURRENTDOW' ),
-       'localweek'                 => array( '1', 'LOKALE_KALENDERWOCHE', 'LOCALWEEK' ),
+       'localweek'                 => array( '1', 'LOKALE_KALENDERWOCHE', 'LOKALE_WOCHE', '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' ),
+       'revisionid'                => array( '1', 'REVISIONSID', 'VERSIONSID', 'REVISIONID' ),
+       'revisionday'               => array( '1', 'REVISIONSTAG', 'VERSIONSTAG', 'REVISIONDAY' ),
+       'revisionday2'              => array( '1', 'REVISIONSTAG2', 'VERSIONSTAG2', 'REVISIONDAY2' ),
+       'revisionmonth'             => array( '1', 'REVISIONSMONAT', 'VERSIONSMONAT', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'REVISIONSMONAT1', 'VERSIONSMONAT1', 'REVISIONMONTH1' ),
+       'revisionyear'              => array( '1', 'REVISIONSJAHR', 'VERSIONSJAHR', 'REVISIONYEAR' ),
+       'revisiontimestamp'         => array( '1', 'REVISIONSZEITSTEMPEL', 'VERSIONSZEITSTEMPEL', 'REVISIONTIMESTAMP' ),
+       'revisionuser'              => array( '1', 'REVISIONSBENUTZER', 'VERSIONSBENUTZER', 'REVISIONUSER' ),
        'fullurl'                   => array( '0', 'VOLLSTÄNDIGE_URL:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'VOLLSTÄNDIGE_URL_C:', 'FULLURLE:' ),
        'canonicalurl'              => array( '0', 'KANONISCHE_URL:', 'CANONICALURL:' ),
@@ -381,10 +337,10 @@ $magicWords = array(
        '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' ),
+       'pagesincategory'           => array( '1', 'SEITEN_IN_KATEGORIE', 'SEITEN_KAT', 'SEITENINKAT', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                  => array( '1', 'SEITENGRÖSSE', 'PAGESIZE' ),
-       'index'                     => array( '1', '__INDIZIEREN__', '__INDEX__' ),
-       'noindex'                   => array( '1', '__NICHT_INDIZIEREN__', '__NOINDEX__' ),
+       'index'                     => array( '1', '__INDEXIEREN__', '__INDIZIEREN__', '__INDEX__' ),
+       'noindex'                   => array( '1', '__NICHT_INDEXIEREN__', '__KEIN_INDEX__', '__NICHT_INDIZIEREN__', '__NOINDEX__' ),
        'numberingroup'             => array( '1', 'BENUTZER_IN_GRUPPE', 'NUMBERINGROUP', 'NUMINGROUP' ),
        'staticredirect'            => array( '1', '__PERMANENTE_WEITERLEITUNG__', '__STATICREDIRECT__' ),
        'protectionlevel'           => array( '1', 'SCHUTZSTATUS', 'PROTECTIONLEVEL' ),
@@ -393,8 +349,57 @@ $magicWords = array(
        'url_query'                 => array( '0', 'ABFRAGE', 'QUERY' ),
        'defaultsort_noerror'       => array( '0', 'keinfehler', 'noerror' ),
        'defaultsort_noreplace'     => array( '0', 'keineersetzung', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', 'alle', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'seiten', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'unterkategorien', 'unterkats', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'dateien', 'files' ),
 );
 
+$datePreferences = array(
+       'default',
+       'dmyt',
+       'dmyts',
+       'dmy',
+       'ymd',
+       'ISO 8601'
+);
+
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+       'dmyt time' => 'H:i',
+       'dmyt date' => 'j. F Y',
+       'dmyt both' => 'j. M Y, H:i',
+
+       'dmyts time' => 'H:i:s',
+       'dmyts date' => 'j. F Y',
+       'dmyts both' => 'j. M Y, H:i:s',
+
+       'dmy time' => 'H:i',
+       'dmy date' => 'j. F Y',
+       'dmy both' => 'H:i, j. M Y',
+
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y M j',
+       'ymd both' => 'H:i, Y M j',
+
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns'
+);
+
+$capitalizeAllNouns = true;
+$bookstoreList = array(
+       'abebooks.de' => 'http://www.abebooks.de/servlet/BookSearchPL?ph=2&isbn=$1',
+       'amazon.de' => 'http://www.amazon.de/gp/search/field-isbn=$1',
+       'buch.de' => 'http://www.buch.de/shop/home/suche/?sswg=BUCH&sq=$1',
+       'Karlsruher Virtueller Katalog (KVK)' => 'http://www.ubka.uni-karlsruhe.de/kvk.html?SB=$1',
+       'Lehmanns Fachbuchhandlung' => 'http://www.lob.de/cgi-bin/work/suche?flag=new&stich1=$1'
+);
+
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$linkTrail = '/^([äöüßa-z]+)(.*)$/sDu';
+
 $imageFiles = array(
        'button-bold'     => 'de/button_bold.png',
        'button-italic'   => 'de/button_italic.png',
@@ -408,7 +413,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' => 'Seitenbezogene Gruppierung bei den „Letzten Änderungen“ und auf der Beobachtungsliste (benötigt JavaScript)',
+'tog-usenewrc' => 'Seitenbezogene Gruppierung in 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)',
@@ -450,7 +455,7 @@ $messages = array(
 
 'underline-always' => 'immer',
 'underline-never' => 'nie',
-'underline-default' => 'abhängig von Browsereinstellung',
+'underline-default' => 'abhängig von der Benutzeroberfläche oder Browsereinstellung',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Schriftart für den Text im Bearbeitungsfenster:',
@@ -536,7 +541,7 @@ $messages = array(
 'cancel' => 'Abbrechen',
 'moredotdotdot' => 'Mehr …',
 'mypage' => 'Eigene Seite',
-'mytalk' => 'Eigene Diskussion',
+'mytalk' => 'Diskussion',
 'anontalk' => 'Diskussionsseite dieser IP',
 'navigation' => 'Navigation',
 'and' => '&#32;und',
@@ -546,10 +551,9 @@ $messages = array(
 'qbbrowse' => 'Durchsuchen',
 'qbedit' => 'Bearbeiten',
 'qbpageoptions' => 'Seitenoptionen',
-'qbpageinfo' => 'Seitendaten',
 'qbmyoptions' => 'Meine Seiten',
 'qbspecialpages' => 'Spezialseiten',
-'faq' => 'Häufige Fragen',
+'faq' => 'Häufig gestellte Fragen',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
@@ -559,7 +563,7 @@ $messages = array(
 'vector-action-protect' => 'Schützen',
 'vector-action-undelete' => 'Wiederherstellen',
 'vector-action-unprotect' => 'Seitenschutz ändern',
-'vector-simplesearch-preference' => 'Erweiterte Suchvorschläge aktivieren (nur Vector)',
+'vector-simplesearch-preference' => 'Vereinfachte Suchleiste aktivieren (nur Vector)',
 'vector-view-create' => 'Erstellen',
 'vector-view-edit' => 'Bearbeiten',
 'vector-view-history' => 'Versionsgeschichte',
@@ -569,6 +573,7 @@ $messages = array(
 'namespaces' => 'Namensräume',
 'variants' => 'Varianten',
 
+'navigation-heading' => 'Navigationsmenü',
 'errorpagetitle' => 'Fehler',
 'returnto' => 'Zurück zur Seite $1.',
 'tagline' => 'Aus {{SITENAME}}',
@@ -648,13 +653,13 @@ $1',
 'mainpage' => 'Hauptseite',
 'mainpage-description' => 'Hauptseite',
 'policy-url' => 'Project:Richtlinien',
-'portal' => 'Gemeinschafts-Portal',
-'portal-url' => 'Project:Gemeinschafts-Portal',
+'portal' => 'Gemeinschaftsportal',
+'portal-url' => 'Project:Gemeinschaftsportal',
 'privacy' => 'Datenschutz',
 'privacypage' => 'Project:Datenschutz',
 
-'badaccess' => 'Keine ausreichenden Rechte',
-'badaccess-group0' => 'Du hast nicht die erforderliche Berechtigung für diese Aktion.',
+'badaccess' => 'Keine ausreichenden Benutzerrechte',
+'badaccess-group0' => 'Du hast nicht die erforderlichen Benutzerrechte für diese Aktion.',
 'badaccess-groups' => 'Diese Aktion ist auf Benutzer beschränkt, die {{PLURAL:$2|der Gruppe|einer der Gruppen}} „$1“ angehören.',
 
 'versionrequired' => 'Version $1 von MediaWiki ist erforderlich.',
@@ -777,7 +782,7 @@ Abfrage: $2',
 'actionthrottled' => 'Aktionsanzahl limitiert',
 'actionthrottledtext' => 'Im Rahmen einer Anti-Spam-Maßnahme kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze hast du überschritten.
 Bitte versuche es in ein paar Minuten erneut.',
-'protectedpagetext' => 'Diese Seite wurde geschützt, um Bearbeitungen zu verhindern.',
+'protectedpagetext' => 'Diese Seite wurde geschützt, um Bearbeitungen sowie andere Aktionen zu verhindern.',
 'viewsourcetext' => 'Du kannst den Quelltext dieser Seite betrachten und kopieren:',
 'viewyourtext' => "Du kannst den Quelltext '''deiner Bearbeitung''' dieser Seite betrachten und kopieren:",
 'protectedinterface' => 'Diese Seite enthält Text für die Benutzeroberfläche der Software auf diesem Wiki und ist geschützt, um Missbrauch vorzubeugen.
@@ -785,12 +790,12 @@ Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt
 'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
 Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
 Nutze bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
-'sqlhidden' => "''Die SQL-Datenbankabfrage ist verborgen.''",
+'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.",
 'customcssprotected' => 'Du hast nicht die Berechtigung, diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.',
-'customjsprotected' => 'Du hast nicht die Berechtigung diese JavaScript enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.',
+'customjsprotected' => 'Du hast nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.',
 'ns-specialprotected' => 'Spezialseiten können nicht bearbeitet werden.',
 'titleprotected' => "Eine Seite mit diesem Namen kann nicht angelegt werden.
 Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''„$2“'' eingerichtet.",
@@ -810,12 +815,11 @@ Der Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: „$3
 # Login and logout pages
 'logouttext' => "'''Du bist nun abgemeldet.'''
 
-Du kannst {{SITENAME}} jetzt anonym weiternutzen, oder dich erneut unter demselben oder einem anderen Benutzernamen [[Special:UserLogin|anmelden]].
+Du kannst {{SITENAME}} jetzt anonym weiternutzen oder dich erneut unter dem selben oder einem anderen Benutzernamen <span class='plainlinks'>[$1 anmelden]</span>.
 Beachte, dass einige Seiten noch anzeigen können, dass du angemeldet bist, solange du nicht deinen Browsercache geleert hast.",
-'welcomecreation' => '== Willkommen, $1! ==
-
-Dein Benutzerkonto wurde eingerichtet.
-Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] anzupassen.',
+'welcomeuser' => 'Willkommen, $1!',
+'welcomecreation-msg' => 'Dein Benutzerkonto wurde erstellt.
+Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] zu ändern.',
 'yourname' => 'Benutzername:',
 'yourpassword' => 'Passwort:',
 'yourpasswordagain' => 'Passwort wiederholen:',
@@ -827,7 +831,7 @@ Vergiss nicht, deine [[Special:Preferences|{{SITENAME}}-Einstellungen]] anzupass
 'login' => 'Anmelden',
 'nav-login-createaccount' => 'Anmelden / Benutzerkonto erstellen',
 'loginprompt' => 'Zur Anmeldung müssen Cookies aktiviert sein.',
-'userlogin' => 'Anmelden / Erstellen',
+'userlogin' => 'Anmelden / Benutzerkonto anlegen',
 'userloginnocreate' => 'Anmelden',
 'logout' => 'Abmelden',
 'userlogout' => 'Abmelden',
@@ -907,7 +911,7 @@ Bitte warte, bevor du es erneut probierst.',
 
 # E-mail sending
 'php-mail-error-unknown' => 'Unbekannter Fehler mit der Funktion mail() von PHP',
-'user-mail-no-addy' => 'Versuchte eine E-Mail ohne Angabe einer E-Mail-Adresse zu versenden',
+'user-mail-no-addy' => 'Versuchte, eine E-Mail ohne Angabe einer E-Mail-Adresse zu versenden.',
 
 # Change password dialog
 'resetpass' => 'Passwort ändern',
@@ -997,7 +1001,7 @@ Temporäres Passwort: $2',
 'showpreview' => 'Vorschau zeigen',
 'showlivepreview' => 'Sofortige Vorschau',
 'showdiff' => 'Änderungen zeigen',
-'anoneditwarning' => "Du bearbeitest diese Seite unangemeldet. Wenn du speicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+'anoneditwarning' => "Du bearbeitest diese Seite unangemeldet. Wenn du sie speicherst, wird deine aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
 'anonpreviewwarning' => "''Du bist nicht angemeldet. Beim Speichern wird deine IP-Adresse in der Versionsgeschichte aufgezeichnet.''",
 'missingsummary' => "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf „{{int:savearticle}}“ klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
 'missingcommenttext' => 'Dein Abschnitt enthält keinen Text.',
@@ -1007,7 +1011,7 @@ Temporäres Passwort: $2',
 'blockedtitle' => 'Benutzer ist gesperrt',
 'blockedtext' => "'''Dein Benutzername oder deine IP-Adresse wurde gesperrt.'''
 
-Die Sperrung wurde von $1 durchgeführt.
+Die Sperrung wurde vom Administrator $1 durchgeführt.
 Als Grund wurde ''$2'' angegeben.
 
 * Beginn der Sperre: $8
@@ -1016,7 +1020,7 @@ Als Grund wurde ''$2'' angegeben.
 
 Du kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.
 Du kannst die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.
-Deine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
+Deine aktuelle IP-Adresse ist $3 und die Sperrkennung lautet $5.
 Bitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
 'autoblockedtext' => "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.
 Als Grund wurde angegeben:
@@ -1055,8 +1059,8 @@ Sofern du fälschlicherweise hier bist, klicke auf die Schaltfläche '''Zurück'
 Du kannst sie <span class="plainlinks">[{{fullurl:{{FULLPAGENAME}}|action=edit}} bearbeiten]</span>,
 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>.',
-'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> Du bist allerdings nicht berechtigt diese Seite zu erstellen.',
+'noarticletext-nopermission' => 'Diese Seite enthält momentan noch keinen Text, du bist auch nicht berechtigt diese Seite zu erstellen.
+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.
@@ -1085,7 +1089,7 @@ Zur Information folgt ein aktueller Auszug aus dem Benutzersperr-Logbuch:',
 'note' => "'''Hinweis:'''",
 'previewnote' => "'''Dies ist nur eine Vorschau.'''
 Die Seite wurde noch nicht gespeichert!",
-'continue-editing' => 'Weiter bearbeiten',
+'continue-editing' => 'Zum Bearbeitungsfeld gehen',
 'previewconflict' => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn du jetzt speicherst.',
 'session_fail_preview' => "'''Deine Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.
 Bitte versuche es erneut, indem du unter der folgenden Textvorschau nochmals auf „Seite speichern“ klickst.
@@ -1104,7 +1108,7 @@ Eine Speicherung kann den Seiteninhalt zerstören. Dies geschieht bisweilen durc
 'editingsection' => 'Bearbeiten von „$1“ (Abschnitt)',
 'editingcomment' => 'Bearbeiten von „$1“ (Neuer Abschnitt)',
 'editconflict' => 'Bearbeitungskonflikt: $1',
-'explainconflict' => "Jemand anders hat diese Seite geändert, nachdem du angefangen hast sie zu bearbeiten.
+'explainconflict' => "Jemand anders hat diese Seite geändert, nachdem du angefangen hast, sie zu bearbeiten.
 Das obere Textfeld enthält den aktuellen Bearbeitungsstand der Seite.
 Das untere Textfeld enthält deine Änderungen.
 Bitte füge deine Änderungen in das obere Textfeld ein.
@@ -1164,6 +1168,15 @@ Sie wurde anscheinend gelöscht.',
 'edit-no-change' => 'Deine Bearbeitung wurde ignoriert, da keine Änderung an dem Text vorgenommen wurde.',
 'edit-already-exists' => 'Die neue Seite konnte nicht erstellt werden, da sie bereits vorhanden ist.',
 'defaultmessagetext' => 'Standardtext',
+'content-failed-to-parse' => 'Parsen des Inhalts $2 für Modell $1 fehlgeschlagen: $3',
+'invalid-content-data' => 'Ungültige Inhaltsdaten',
+'content-not-allowed-here' => 'Der Inhalt „$1“ ist auf der Seite [[$2]] nicht erlaubt',
+
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-text' => 'Klartext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Achtung''': Diese Seite enthält zu viele Aufrufe aufwändiger Parserfunktionen.
@@ -1187,7 +1200,7 @@ Sie darf nicht mehr als $2 {{PLURAL:$2|Aufruf|Aufrufe}} haben, es {{PLURAL:$1|is
 
 # "Undo" feature
 'undo-success' => 'Die Bearbeitung kann rückgängig gemacht werden.
-Bitte prüfe den Vergleich unten um sicherzustellen, dass du dies tun möchtest, und speichere dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.',
+Bitte prüfe den Vergleich unten, um sicherzustellen, dass du dies tun möchtest, und speichere dann unten deine Änderungen, um die Bearbeitung rückgängig zu machen.',
 'undo-failure' => 'Die Änderung konnte nicht rückgängig gemacht werden, da der betroffene Abschnitt zwischenzeitlich verändert wurde.',
 'undo-norev' => 'Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie nicht vorhanden ist oder gelöscht wurde.',
 'undo-summary' => 'Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.',
@@ -1398,7 +1411,7 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'searchhelp-url' => 'Help:Hilfe',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Zeige alle Seiten, die mit dem Suchbegriff anfangen]]',
 'searchprofile-articles' => 'Inhaltsseiten',
-'searchprofile-project' => 'Hilfe und Projektseiten',
+'searchprofile-project' => 'Hilfe- und Projektseiten',
 'searchprofile-images' => 'Multimedia',
 'searchprofile-everything' => 'Alles',
 'searchprofile-advanced' => 'Erweitert',
@@ -1416,8 +1429,6 @@ Einzelheiten sind im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'search-interwiki-caption' => 'Schwesterprojekte',
 'search-interwiki-default' => '$1 Ergebnisse:',
 'search-interwiki-more' => '(weitere)',
-'search-mwsuggest-enabled' => 'mit Vorschlägen',
-'search-mwsuggest-disabled' => 'keine Vorschläge',
 'search-relatedarticle' => 'Verwandte',
 'mwsuggest-disable' => 'Vorschläge per Ajax deaktivieren',
 'searcheverything-enable' => 'In allen Namensräumen suchen',
@@ -1497,7 +1508,7 @@ Hier ein zufällig generierter Wert, den du verwenden kannst: $1',
 'savedprefs' => 'Deine Einstellungen wurden gespeichert.',
 'timezonelegend' => 'Zeitzone:',
 'localtime' => 'Ortszeit:',
-'timezoneuseserverdefault' => 'Standardzeit des Wikis nutzen ($1)',
+'timezoneuseserverdefault' => 'Standardzeit dieses Wikis nutzen ($1)',
 'timezoneuseoffset' => 'Andere (Unterschied angeben)',
 'timezoneoffset' => 'Unterschied¹:',
 'servertime' => 'Aktuelle Zeit auf dem Server:',
@@ -1579,6 +1590,7 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'saveusergroups' => 'Gruppenzugehörigkeit ändern',
 'userrights-groupsmember' => 'Mitglied von:',
 'userrights-groupsmember-auto' => 'Automatisch Mitglied von:',
+'userrights-groupsmember-type' => '$2',
 'userrights-groups-help' => 'Du kannst die Gruppenzugehörigkeit {{GENDER:$1|dieses Benutzers|dieser Benutzerin}} ändern:
 * Ein markiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} Mitglied dieser Gruppe ist.
 * Ein nichtmarkiertes Kästchen bedeutet, dass {{GENDER:$1|der Benutzer|die Benutzerin}} nicht Mitglied dieser Gruppe ist.
@@ -1682,6 +1694,9 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 'rightslogtext' => 'Dies ist das Logbuch der Änderungen der Benutzerrechte.',
 'rightslogentry' => 'änderte die Benutzerrechte für „$1“ von „$2“ zu „$3“',
 'rightslogentry-autopromote' => 'wurde automatisch von „$2“ zu „$3“ zugeordnet',
+'logentry-rights-rights' => '$1 änderte die Gruppenzugehörigkeit für $3 von $4 zu $5',
+'logentry-rights-rights-legacy' => '$1 änderte die Gruppenzugehörigkeit für $3',
+'logentry-rights-autopromote' => '$1 wurde automatisch von $4 zu $5 zugeordnet',
 'rightsnone' => '(–)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1806,7 +1821,7 @@ Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden
 'ignorewarning' => 'Warnung ignorieren und Datei speichern',
 'ignorewarnings' => 'Warnungen ignorieren',
 'minlength1' => 'Dateinamen müssen mindestens einen Buchstaben lang sein.',
-'illegalfilename' => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benenne die Datei um und versuche sie erneut hochzuladen.',
+'illegalfilename' => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benenne die Datei um und versuche, sie erneut hochzuladen.',
 'filename-toolong' => 'Dateinamen dürfen nicht größer als 240 Byte sein.',
 'badfilename' => 'Der Dateiname wurde in „$1“ geändert.',
 'filetype-mime-mismatch' => 'Dateierweiterung „.$1“ stimmt nicht mit dem MIME-Typ ($2) überein.',
@@ -1816,14 +1831,14 @@ Um ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden
 'filetype-banned-type' => "'''„.$1“''' {{PLURAL:$4|ist ein nicht erlaubter Dateityp|sind nicht erlaubte Dateitypen}}.
 {{PLURAL:$3|Erlaubter Dateityp ist|Erlaubte Dateitypen sind}} $2.",
 'filetype-missing' => 'Die hochzuladende Datei hat keine Erweiterung (z. B. „.jpg“).',
-'empty-file' => 'Die übertragene Datei ist leer',
-'file-too-large' => 'Die übertragene Datei ist zu groß',
-'filename-tooshort' => 'Der Dateiname ist zu kurz',
+'empty-file' => 'Die von dir übertragene Datei hat keinen Inhalt.',
+'file-too-large' => 'Die hochgeladene Datei war zu groß.',
+'filename-tooshort' => 'Der Dateiname ist zu kurz.',
 'filetype-banned' => 'Diese Dateiendung ist gesperrt.',
 'verification-error' => 'Diese Datei hat die Dateiprüfung nicht bestanden.',
-'hookaborted' => 'Der Versuch, die Änderung durchzuführen, ist aufgrund eines Extension-Hooks fehlgeschlagen',
-'illegal-filename' => 'Der Dateiname ist nicht erlaubt',
-'overwrite' => 'Das Überschreiben einer existierenden Datei ist nicht erlaubt',
+'hookaborted' => 'Der Versuch, die Änderung durchzuführen, wurde von einer Parsererweiterung abgebrochen.',
+'illegal-filename' => 'Der Dateiname ist nicht zulässig.',
+'overwrite' => 'Das Überschreiben einer bereits vorhandenen Datei ist nicht erlaubt.',
 'unknown-error' => 'Ein unbekannter Fehler ist aufgetreten.',
 'tmp-create-error' => 'Temporäre Datei konnte nicht erstellt werden',
 'tmp-write-error' => 'Fehler beim Schreiben der temporären Datei',
@@ -1839,7 +1854,7 @@ Die Beschreibungsseite musst du nach dem Hochladen der Datei noch manuell bearbe
 [[$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>
+* Name der bereits 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>.
@@ -1923,6 +1938,7 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
 'backend-fail-notsame' => 'Es ist bereits eine Datei $1 vorhanden, die nicht identisch ist.',
 'backend-fail-invalidpath' => '$1 ist kein gültiger Pfad zum Speichern.',
 'backend-fail-delete' => 'Die Datei $1 konnte nicht gelöscht werden.',
+'backend-fail-describe' => 'Die Metadaten für die Datei „$1“ konnten nicht geändert werden.',
 'backend-fail-alreadyexists' => 'Die Seite $1 ist bereits vorhanden',
 'backend-fail-store' => 'Die Datei $1 konnte nicht unter $2 gespeichert werden.',
 'backend-fail-copy' => 'Die Datei $1 konnte nicht nach $2 kopiert werden.',
@@ -1939,7 +1955,7 @@ Wenn das Problem weiter besteht, informiere einen [[Special:ListUsers/sysop|Syst
 'backend-fail-internal' => 'Im Speicher-Backend „$1“ ist ein unbekannter Fehler aufgetreten.',
 'backend-fail-contenttype' => 'Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.',
 'backend-fail-batchsize' => 'Eine Stapelverarbeitungsdatei, die {{PLURAL:$1|eine Operation|$1 Operationen}} enthält, wurde an das Speicher-Backend gesandt. Die Begrenzung liegt allerdings bei {{PLURAL:$2|einer Operation|$2 Operationen}}.',
-'backend-fail-usable' => 'Die Datei „$1“ konnte, entweder aufgrund eines nicht vorhandenen Verzeichnisses oder aufgrund unzureichender Berechtigungen, weder abgerufen noch gespeichert werden.',
+'backend-fail-usable' => 'Die Datei „$1“ konnte entweder aufgrund eines nicht vorhandenen Verzeichnisses oder wegen unzureichender Berechtigungen weder abgerufen noch gespeichert werden.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Es konnte keine Verbindung zur Journaldatenbank des Speicher-Backends „$1“ hergestellt werden.',
@@ -1970,17 +1986,17 @@ Sie kann daher keiner ordnungsgemäßen Sicherheitsüberprüfung unterzogen werd
 'uploadstash-summary' => 'Diese Seite ermöglicht den Zugriff auf Dateien, die hochgeladen wurden, bzw. gerade hochgeladen werden, aber noch nicht auf dem Wiki publiziert wurden. Diese Dateien sind, der hochladende Benutzer ausgenommen, noch nicht öffentlich einsehbar.',
 'uploadstash-clear' => 'Die vorab gespeicherten Dateien entfernen',
 'uploadstash-nofiles' => 'Es sind keine vorab gespeicherten Dateien vorhanden.',
-'uploadstash-badtoken' => 'Das Entfernen der vorab gespeicherten Dateien war erfolglos, vielleicht weil die Sitzungsdaten abgelaufen sind. Bitte erneut versuchen.',
+'uploadstash-badtoken' => 'Das Entfernen der vorab gespeicherten Dateien war erfolglos, vielleicht weil deine Sitzungsdaten abgelaufen sind. Bitte versuche es erneut.',
 'uploadstash-errclear' => 'Das Entfernen der vorab gespeicherten Dateien war erfolglos.',
 'uploadstash-refresh' => 'Liste der Dateien aktualisieren',
 'invalid-chunk-offset' => 'Ungültiger Startpunkt',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Zugriff verweigert',
-'img-auth-nopathinfo' => 'PATH_INFO fehlt.
+'img-auth-nopathinfo' => 'Die Angabe PATH_INFO fehlt.
 Der Server ist nicht dafür eingerichtet, diese Information weiterzugeben.
-Sie könnte CGI-gestützt sein und kann daher img_auth nicht ermöglichen.
-Siehe hierzu die Seite https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+Sie könnte CGI-gestützt sein und kann daher „img_auth“ (Authentifizierung des Dateiaufrufs) nicht unterstützen.
+Siehe hierzu die Seite https://www.mediawiki.org/wiki/Manual:Image_Authorization (englisch) für weitere Informationen.',
 'img-auth-notindir' => 'Der gewünschte Pfad ist nicht im konfigurierten Uploadverzeichnis.',
 'img-auth-badtitle' => 'Aus „$1“ kann kein gültiger Titel erstellt werden.',
 'img-auth-nologinnWL' => 'Du bist nicht angemeldet und „$1“ ist nicht in der weißen Liste.',
@@ -2008,11 +2024,11 @@ Aus Sicherheitsgründen ist img_auth.php deaktiviert.',
 'upload-curl-error6' => 'URL ist nicht erreichbar',
 'upload-curl-error6-text' => 'Die angegebene URL ist nicht erreichbar. Prüfe sowohl die URL auf Fehler als auch den Online-Status der Seite.',
 'upload-curl-error28' => 'Zeitüberschreitung beim Hochladen',
-'upload-curl-error28-text' => 'Die Seite braucht zu lange für eine Antwort. Prüfe, ob die Seite online ist, warte einen kurzen Moment und versuche es dann erneut. Es kann sinnvoll sein, einen erneuten Versuch zu einem anderen Zeitpunkt zu probieren.',
+'upload-curl-error28-text' => 'Die Seite braucht zu lange, um zu antworten. Prüfe, ob die Seite online ist, warte einen kurzen Moment und versuche es dann erneut. Es kann sinnvoll sein, es zu einem anderen Zeitpunkt erneut zu versuchen.',
 
 'license' => 'Lizenz:',
 'license-header' => 'Lizenz',
-'nolicense' => 'keine Vorauswahl',
+'nolicense' => 'Keine Vorauswahl',
 'license-nopreview' => '(es ist keine Vorschau verfügbar)',
 'upload_source_url' => ' (gültige, öffentlich zugängliche URL)',
 'upload_source_file' => ' (eine Datei auf deinem Computer)',
@@ -2070,7 +2086,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.',
+'upload-disallowed-here' => 'Du kannst diese Datei nicht überschreiben.',
 
 # File reversion
 'filerevert' => 'Zurücksetzen von „$1“',
@@ -2142,7 +2158,7 @@ Vielleicht möchtest du die Beschreibung auf der dortigen [$2 Dateibeschreibungs
 'statistics-edits' => 'Seitenbearbeitungen',
 'statistics-edits-average' => 'Bearbeitungen pro Seite im Durchschnitt',
 'statistics-views-total' => 'Seitenaufrufe gesamt',
-'statistics-views-total-desc' => 'Aufrufe nicht vorhandener Seiten und von Spezialseiten werden nicht berücksichtigt',
+'statistics-views-total-desc' => 'Aufrufe nicht vorhandener Seiten und von Spezialseiten werden nicht berücksichtigt.',
 'statistics-views-peredit' => 'Seitenaufrufe pro Bearbeitung',
 'statistics-users' => 'Registrierte [[Special:ListUsers|Benutzer]]',
 'statistics-users-active' => 'Aktive Benutzer',
@@ -2305,7 +2321,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 <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-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> (Standard ist http, falls kein Protokoll angegeben ist.)',
 'linksearch-line' => '$1 ist verlinkt von $2',
 'linksearch-error' => 'Wildcards können nur am Anfang der URL verwendet werden.',
 
@@ -2354,10 +2370,10 @@ Zusätzliche Informationen über einzelne Rechte können [[{{MediaWiki:Listgroup
 '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.',
+'emailpagetext' => 'Du kannst {{GENDER:$1|dem Benutzer|der Benutzerin}} mit dem unten stehenden Formular eine E-Mail senden.
+Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit {{GENDER:$1|der Benutzer|die Benutzerin}} dir antworten kann.',
 'usermailererror' => 'Das E-Mail-Objekt gab einen Fehler zurück:',
-'defemailsubject' => '{{SITENAME}} - E-Mail von Benutzer „$1“',
+'defemailsubject' => '{{SITENAME}}  E-Mail von Benutzer „$1“',
 'usermaildisabled' => 'E-Mail-Empfang deaktiviert',
 'usermaildisabledtext' => 'Du kannst in diesem Wiki keine E-Mails an andere Benutzer senden',
 'noemailtitle' => 'Keine E-Mail-Adresse',
@@ -2423,21 +2439,23 @@ Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werde
 
 'enotif_mailer' => '{{SITENAME}}-E-Mail-Benachrichtigungsdienst',
 'enotif_reset' => 'Alle Seiten als besucht markieren',
-'enotif_newpagetext' => 'Das ist eine neue Seite.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-Benutzer',
-'changed' => 'geändert',
-'created' => 'erstellt',
-'enotif_subject' => '[{{SITENAME}}] Die Seite „$PAGETITLE“ wurde von $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} gelöscht',
+'enotif_subject_created' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} erstellt',
+'enotif_subject_moved' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} verschoben',
+'enotif_subject_restored' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} wiederhergestellt',
+'enotif_subject_changed' => '{{SITENAME}}-Seite $1 wurde von {{GENDER:$2|$2}} geändert',
+'enotif_body_intro_deleted' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} gelöscht. Siehe $3 für deren aktuelle Version.',
+'enotif_body_intro_created' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} erstellt. Siehe $3 für deren aktuelle Version.',
+'enotif_body_intro_moved' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} verschoben. Siehe $3 für deren aktuelle Version.',
+'enotif_body_intro_restored' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} wiederhergestellt. Siehe $3 für deren aktuelle Version.',
+'enotif_body_intro_changed' => 'Die {{SITENAME}}-Seite $1 wurde am $PAGEEDITDATE von {{GENDER:$2|$2}} geändert. Siehe $3 für deren aktuelle Version.',
 'enotif_lastvisited' => 'Alle Änderungen auf einen Blick: $1',
 'enotif_lastdiff' => 'Siehe $1 nach dieser Änderung.',
 'enotif_anon_editor' => 'Anonymer Benutzer $1',
 'enotif_body' => 'Hallo $WATCHINGUSERNAME,
 
-die {{SITENAME}}-Seite „$PAGETITLE“ wurde von $PAGEEDITOR am $PAGEEDITDATE um $PAGEEDITTIME Uhr $CHANGEDORCREATED.
-
-Aktuelle Version: $PAGETITLE_URL
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Zusammenfassung des Bearbeiters: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2505,9 +2523,9 @@ Die letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int
 
 # Edit tokens
 'sessionfailure-title' => 'Sitzungsfehler',
-'sessionfailure' => 'Es gab ein Problem mit der Übertragung deiner Benutzerdaten.
+'sessionfailure' => 'Es gab ein Problem bei der Übertragung deiner Benutzerdaten.
 Diese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.
-Bitte gehe zurück und versuche den Vorgang erneut auszuführen.',
+Bitte gehe zurück zur vorherigen Seite, lade sie erneut und versuche, den Vorgang erneut auszuführen.',
 
 # Protect
 'protectlogpage' => 'Seitenschutz-Logbuch',
@@ -2602,7 +2620,8 @@ Der aktuelle Text der gelöschten Seite ist nur Administratoren zugänglich.',
 'undeletedrevisions' => '{{PLURAL:$1|1 Version wurde|$1 Versionen wurden}} wiederhergestellt',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versionen}} und {{PLURAL:$2|1 Datei|$2 Dateien}} wurden wiederhergestellt',
 'undeletedfiles' => '{{PLURAL:$1|1 Datei wurde|$1 Dateien wurden}} wiederhergestellt',
-'cannotundelete' => 'Wiederherstellung fehlgeschlagen; jemand anderes hat die Seite bereits wiederhergestellt.',
+'cannotundelete' => 'Die Wiederherstellung ist fehlgeschlagen:
+$1',
 'undeletedpage' => "'''„$1“''' wurde wiederhergestellt.
 
 Im [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelöschten und wiederhergestellten Seiten.",
@@ -2633,9 +2652,9 @@ $1',
 'blanknamespace' => '(Seiten)',
 
 # Contributions
-'contributions' => 'Benutzerbeiträge',
+'contributions' => '{{GENDER:$1|Benutzerbeiträge}}',
 'contributions-title' => 'Benutzerbeiträge von „$1“',
-'mycontris' => 'Eigene Beiträge',
+'mycontris' => 'Beiträge',
 'contribsub2' => 'Von $1 ($2)',
 'nocontribs' => 'Es wurden keine Benutzerbeiträge mit diesen Kriterien gefunden.',
 'uctop' => '(aktuell)',
@@ -2719,13 +2738,13 @@ Bitte gib den Grund für die Sperre an.',
 'blockipsuccesstext' => 'Der Benutzer / die IP-Adresse [[Special:Contributions/$1|$1]] wurde gesperrt.<br />
 Zur Aufhebung der Sperre siehe die [[Special:BlockList|Liste aller aktiven Sperren]].',
 'ipb-blockingself' => 'Du bist gerade dabei, dich selbst zu sperren! Möchtest du das wirklich tun?',
-'ipb-confirmhideuser' => 'Du bist gerade dabei einen Benutzer im Modus „Benutzer verstecken“ zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchtest du das wirklich tun?',
+'ipb-confirmhideuser' => 'Du bist gerade dabei, einen Benutzer im Modus „Benutzer verstecken“ zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchtest du das wirklich tun?',
 'ipb-edit-dropdown' => 'Sperrgründe bearbeiten',
 'ipb-unblock-addr' => '„$1“ freigeben',
 'ipb-unblock' => 'IP-Adresse/Benutzer freigeben',
 'ipb-blocklist' => 'Alle aktuellen Sperren anzeigen',
 'ipb-blocklist-contribs' => 'Benutzerbeiträge von „$1“',
-'unblockip' => 'IP-Adresse freigeben',
+'unblockip' => 'Benutzer freigeben',
 'unblockiptext' => 'Mit diesem Formular kannst du eine IP-Adresse oder einen Benutzer freigeben.',
 'ipusubmit' => 'Freigeben',
 'unblocked' => '[[User:$1|$1]] wurde freigegeben',
@@ -2867,7 +2886,7 @@ Bitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung
 'movepagebtn' => 'Seite verschieben',
 'pagemovedsub' => 'Verschiebung erfolgreich',
 'movepage-moved' => "'''Die Seite „$1“ wurde nach „$2“ verschoben.'''",
-'movepage-moved-redirect' => 'Es wurde eine Weiterleitung erstellt.',
+'movepage-moved-redirect' => 'Eine Weiterleitung wurde erstellt.',
 'movepage-moved-noredirect' => 'Die Erstellung einer Weiterleitung wurde unterdrückt.',
 'articleexists' => 'Unter diesem Namen existiert bereits eine Seite. Bitte wähle einen anderen Namen.',
 'cantmove-titleprotected' => 'Die Verschiebung kann nicht durchgeführt werden, da der Zieltitel zur Erstellung gesperrt ist.',
@@ -2887,7 +2906,7 @@ Bitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung
 'movenosubpage' => 'Diese Seite hat keine Unterseiten.',
 'movereason' => 'Grund:',
 'revertmove' => 'zurück verschieben',
-'delete_and_move' => 'Löschen und Verschieben',
+'delete_and_move' => 'Löschen und verschieben',
 'delete_and_move_text' => '== Löschung erforderlich ==
 
 Die Seite „[[:$1]]“ existiert bereits. Möchtest du diese löschen, um die Seite verschieben zu können?',
@@ -2900,6 +2919,7 @@ Eine Seite kann nicht auf sich selbst verschoben werden.',
 'immobile-target-namespace-iw' => 'Interwiki-Link ist kein gültiges Ziel für Seitenverschiebungen.',
 'immobile-source-page' => 'Diese Seite ist nicht verschiebbar.',
 'immobile-target-page' => 'Es kann nicht auf diese Zielseite verschoben werden.',
+'bad-target-model' => 'Die gewünschte Zielseite verwendet ein abweichendes Inhaltsmodell. Das Inhaltsmodell $1 kann nicht in das Inhaltsmodell $2 umgewandelt werden.',
 'imagenocrossnamespace' => 'Dateien können nicht aus dem {{ns:file}}-Namensraum heraus verschoben werden',
 'nonfile-cannot-move-to-file' => 'Nichtdateien können nicht in den {{ns:file}}-Namensraum hinein verschoben werden',
 'imagetypemismatch' => 'Die neue Dateierweiterung ist nicht mit der alten identisch',
@@ -3026,7 +3046,6 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-Test',
-'javascripttest-disabled' => 'Diese Funktion wurde in diesem Wiki nicht aktiviert.',
 'javascripttest-title' => '$1-Tests werden durchgeführt',
 'javascripttest-pagetext-noframework' => 'Diese Seite ist JavaSkript-Tests vorbehalten.',
 'javascripttest-pagetext-unknownframework' => 'Unbekanntes Framework „$1“.',
@@ -3042,14 +3061,14 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'tooltip-pt-anontalk' => 'Diskussion über Änderungen von dieser IP-Adresse',
 'tooltip-pt-preferences' => 'Eigene Einstellungen',
 'tooltip-pt-watchlist' => 'Liste der beobachteten Seiten',
-'tooltip-pt-mycontris' => 'Liste deiner Beiträge',
+'tooltip-pt-mycontris' => 'Liste eigener Beiträge',
 'tooltip-pt-login' => 'Sich anzumelden wird zwar gerne gesehen, ist aber keine Pflicht.',
 'tooltip-pt-anonlogin' => 'Sich anzumelden wird zwar gerne gesehen, ist aber keine Pflicht.',
 'tooltip-pt-logout' => 'Abmelden',
 'tooltip-ca-talk' => 'Diskussion zum Seiteninhalt',
 'tooltip-ca-edit' => 'Seite bearbeiten. Bitte vor dem Speichern die Vorschaufunktion benutzen.',
 'tooltip-ca-addsection' => 'Neuen Abschnitt beginnen',
-'tooltip-ca-viewsource' => 'Diese Seite ist geschützt. Der Quelltext kann angesehen werden.',
+'tooltip-ca-viewsource' => 'Diese Seite ist geschützt. Ihr Quelltext kann dennoch angesehen und kopiert werden.',
 'tooltip-ca-history' => 'Frühere Versionen dieser Seite',
 'tooltip-ca-protect' => 'Diese Seite schützen',
 'tooltip-ca-unprotect' => 'Seitenschutz ändern',
@@ -3067,7 +3086,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'tooltip-n-portal' => 'Über das Projekt, was du tun kannst, wo was zu finden ist',
 'tooltip-n-currentevents' => 'Hintergrundinformationen zu aktuellen Ereignissen',
 'tooltip-n-recentchanges' => 'Liste der letzten Änderungen in {{SITENAME}}',
-'tooltip-n-randompage' => 'Zufällige Seite',
+'tooltip-n-randompage' => 'Zufällige Seite aufrufen',
 'tooltip-n-help' => 'Hilfeseite anzeigen',
 'tooltip-t-whatlinkshere' => 'Liste aller Seiten, die hierher verlinken',
 'tooltip-t-recentchangeslinked' => 'Letzte Änderungen an Seiten, die von hier verlinkt sind',
@@ -3109,7 +3128,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'standard.css' => '/* Das folgende CSS wird für Benutzer der Klassik-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'nostalgia.css' => '/* Das folgende CSS wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'cologneblue.css' => '/* Das folgende CSS wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
-'monobook.css' => '/* Das folgende CSS wird für Benutzer der Monobook-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
+'monobook.css' => '/* Das folgende CSS wird für Benutzer der MonoBook-Benutzeroberfläche geladen */',
 'myskin.css' => '/* Das folgende CSS wird für Benutzer der MySkin-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'chick.css' => '/* Das folgende CSS wird für Benutzer der Küken-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
 'simple.css' => '/* Das folgende CSS wird für Benutzer der Einfach-Benutzeroberfläche geladen. Für allgemeingültige Benutzeroberflächen-Anpassungen bitte [[MediaWiki:Common.css]] bearbeiten. */',
@@ -3128,7 +3147,7 @@ Diese auf dem lokalen Rechner speichern und danach hier hochladen.',
 'standard.js' => '/* Das folgende JavaScript wird für Benutzer der Klassik-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'nostalgia.js' => '/* Das folgende JavaScript wird für Benutzer der Nostalgie-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'cologneblue.js' => '/* Das folgende JavaScript wird für Benutzer der Kölnisch-Blau-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
-'monobook.js' => '/* Das folgende JavaScript wird für Benutzer der Monobook-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
+'monobook.js' => '/* Das folgende JavaScript wird für Benutzer der MonoBook-Benutzeroberfläche geladen */',
 'myskin.js' => '/* Das folgende JavaScript wird für Benutzer der MySkin-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'chick.js' => '/* Das folgende JavaScript wird für Benutzer der Küken-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
 'simple.js' => '/* Das folgende JavaScript wird für Benutzer der Einfach-Benutzeroberfläche geladen. Allgemeingültiges JavaScript bitte in [[MediaWiki:Common.js]] eintragen. */',
@@ -3166,6 +3185,7 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 
 # Info page
 'pageinfo-title' => 'Informationen zu „$1“',
+'pageinfo-not-current' => 'Diese Information kann leider nicht für alte Versionen zur Verfügung gestellt werden.',
 'pageinfo-header-basic' => 'Basisinformationen',
 'pageinfo-header-edits' => 'Bearbeitungsgeschichte',
 'pageinfo-header-restrictions' => 'Seitenschutz',
@@ -3174,6 +3194,7 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'pageinfo-default-sort' => 'Standardsortierkriterium',
 'pageinfo-length' => 'Seitenlänge (in Byte)',
 'pageinfo-article-id' => 'Seitenkennnummer',
+'pageinfo-language' => 'Seiteninhaltssprache',
 'pageinfo-robot-policy' => 'Suchmaschinenstatus',
 'pageinfo-robot-index' => 'Indizierbar',
 'pageinfo-robot-noindex' => 'Nicht indizierbar',
@@ -3189,12 +3210,19 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 '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 ({{lcfirst:$1}})',
+'pageinfo-recent-edits' => 'Anzahl der kürzlich erfolgten Bearbeitungen (innerhalb der letzten $1)',
+'pageinfo-recent-authors' => 'Anzahl unterschiedlicher Autoren',
 '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)',
+'pageinfo-toolboxlink' => 'Seiteninformationen',
+'pageinfo-redirectsto' => 'Weiterleitungen nach',
+'pageinfo-redirectsto-info' => 'Information',
+'pageinfo-contentpage' => 'Gezählt als eine Inhaltsseite',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Seiten mit Kaskadenschutz von hier',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Seiten mit Kaskadenschutz von',
 
 # Skin names
 'skinname-standard' => 'Klassik',
@@ -3217,6 +3245,8 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 'markedaspatrollederror' => 'Markierung als „kontrolliert“ nicht möglich.',
 'markedaspatrollederrortext' => 'Du musst eine Seitenänderung auswählen.',
 'markedaspatrollederror-noautopatrol' => 'Es ist nicht erlaubt, eigene Bearbeitungen als kontrolliert zu markieren.',
+'markedaspatrollednotify' => 'Diese Änderung an $1 wurde als kontrolliert markiert.',
+'markedaspatrollederrornotify' => 'Der Versuch, die Version als kontrolliert zu markieren, ist fehlgeschlagen.',
 
 # Patrol log
 'patrol-log-page' => 'Kontroll-Logbuch',
@@ -3280,6 +3310,7 @@ Durch das Herunterladen und Öffnen der Datei kann dein Computer beschädigt wer
 'hours' => '{{PLURAL:$1|einer Stunde|$1 Stunden}}',
 'days' => '{{PLURAL:$1|$1 Tag|$1 Tage}}',
 'ago' => 'vor $1',
+'just-now' => 'Gerade eben',
 
 # Bad image list
 'bad_image_list' => 'Format:
@@ -3776,6 +3807,7 @@ Dieser Bestätigungscode ist gültig bis $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-Einbindung ist deaktiviert]',
 'scarytranscludefailed' => '[Vorlageneinbindung für $1 ist gescheitert]',
+'scarytranscludefailed-httpstatus' => '[Vorlagenabruf fehlgeschlagen für $1: HTTP  $2]',
 'scarytranscludetoolong' => '[URL ist zu lang]',
 
 # Delete conflict
@@ -3823,7 +3855,7 @@ Bitte bestätige, dass du diese Seite wirklich neu erstellen möchten.",
 # Auto-summaries
 'autosumm-blank' => 'Die Seite wurde geleert.',
 'autosumm-replace' => 'Der Seiteninhalt wurde durch einen anderen Text ersetzt: „$1“',
-'autoredircomment' => 'Weiterleitung auf [[$1]] erstellt',
+'autoredircomment' => 'Weiterleitung nach [[$1]] erstellt',
 'autosumm-new' => 'Die Seite wurde neu angelegt: „$1“',
 
 # Size units
@@ -3905,6 +3937,7 @@ Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutz
 'version-license' => 'Lizenz',
 'version-poweredby-credits' => "Diese Website nutzt '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'andere',
+'version-credits-summary' => 'Wir danken folgenden Personen für ihre Beiträge zu [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki ist eine Freie Software, d. h. sie kann, gemäß den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.
 
 Die Software MediaWiki wird in der Hoffnung verteilt, dass sie nützlich sein wird, allerdings OHNE JEGLICHE GARANTIE und sogar ohne die implizierte Garantie einer MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.
@@ -4040,7 +4073,7 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'revdelete-restricted' => 'Einschränkungen gelten auch für Administratoren',
 'revdelete-unrestricted' => 'Einschränkungen für Administratoren aufgehoben',
 'logentry-move-move' => '$1 verschob Seite $3 nach $4',
-'logentry-move-move-noredirect' => '$1 verschob Seite $3 nach $4 ohne dabei eine Weiterleitung anzulegen',
+'logentry-move-move-noredirect' => '$1 verschob Seite $3 nach $4, ohne dabei eine Weiterleitung anzulegen',
 'logentry-move-move_redir' => '$1 verschob Seite $3 nach $4 und überschrieb dabei eine Weiterleitung',
 'logentry-move-move_redir-noredirect' => '$1 verschob Seite $3 nach $4 und überschrieb dabei eine Weiterleitung ohne selbst eine Weiterleitung anzulegen',
 'logentry-patrol-patrol' => '$1 markierte Version $4 von Seite $3 als kontrolliert',
@@ -4052,8 +4085,8 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 'newuserlog-byemail' => 'das Passwort wurde per E-Mail versandt',
 
 # Feedback
-'feedback-bugornote' => 'Sofern Du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].
-Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kommentar wird, zusammen mit deinem Benutzernamen und der Version des von Dir verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.',
+'feedback-bugornote' => 'Sofern du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].
+Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kommentar wird, zusammen mit deinem Benutzernamen und der Version des von dir verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.',
 'feedback-subject' => 'Betreff:',
 'feedback-message' => 'Nachricht:',
 'feedback-cancel' => 'Abbrechen',
@@ -4067,6 +4100,10 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 'feedback-bugcheck' => 'Super! Bitte überprüfe noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.',
 'feedback-bugnew' => 'Ich habe es überprüft. Den neuen Fehler melden.',
 
+# Search suggestions
+'searchsuggest-search' => 'Suchen',
+'searchsuggest-containing' => 'enthält …',
+
 # API errors
 'api-error-badaccess-groups' => 'Du hast nicht die Berechtigung Dateien in dieses Wiki hochzuladen.',
 'api-error-badtoken' => 'Interner Fehler: Der Token ist fehlerhaft.',
@@ -4085,7 +4122,7 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 '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-hookaborted' => 'Der Versuch, die Änderung durchzuführen, wurde von einer Parsererweiterung (API) abgebrochen.',
 'api-error-http' => 'Interner Fehler: Es konnte keine Verbindung zum Server hergestellt werden.',
 'api-error-illegal-filename' => 'Der Dateiname ist nicht erlaubt.',
 'api-error-internal-error' => 'Interner Fehler: Ein unbekannter Fehler ist beim Hochladen der Datei ins Wiki aufgetreten.',
@@ -4119,4 +4156,6 @@ Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kom
 'duration-centuries' => '$1 {{PLURAL:$1|Jahrhundert|Jahrhunderte}}',
 'duration-millennia' => '$1 {{PLURAL:$1|Jahrtausend|Jahrtausende}}',
 
+# Unknown messages
+'svg-long-error' => 'Ungültige SVG-Datei: $1',
 );
index 685dde6..a4fabf9 100644 (file)
@@ -7,6 +7,8 @@
  * @ingroup Language
  * @file
  *
+ * @author Filzstift
+ * @author Geitost
  * @author Ianusius
  * @author Kghbln
  * @author MichaelFrey
@@ -18,101 +20,467 @@ $fallback = 'de';
 $separatorTransformTable = array( ',' => "'", '.' => ',' );
 
 $messages = array(
+# User preference toggles
+'tog-hideminor' => 'Kleine Änderungen in den «Letzten Änderungen» ausblenden',
+'tog-hidepatrolled' => 'Kontrollierte Änderungen in den «Letzten Änderungen» ausblenden',
+'tog-newpageshidepatrolled' => 'Kontrollierte Seiten bei den «Neuen Seiten» ausblenden',
+'tog-usenewrc' => 'Erweiterte Darstellung der «Letzten Änderungen» (benötigt JavaScript)',
+'tog-minordefault' => 'Eigene Änderungen standardmässig als minim markieren',
+'tog-externaleditor' => 'Externen Editor standardmässig 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ässig 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',
+
+# Categories related messages
+'category_header' => 'Seiten in der Kategorie «$1»',
+'category-media-header' => 'Medien in der Kategorie «$1»',
+
+'badaccess-groups' => 'Diese Aktion ist auf Benutzer beschränkt, die {{PLURAL:$2|der Gruppe|einer der Gruppen}} «$1» angehören.',
+
+'retrievedfrom' => 'Von «$1»',
+'site-atom-feed' => 'Atom-Feed für «$1»',
+'page-rss-feed' => 'RSS-Feed für «$1»',
+'page-atom-feed' => 'Atom-Feed für «$1»',
+
 # General errors
+'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>».',
+'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>».',
+'missing-article' => 'Der Text von «$1» $2 wurde nicht in der Datenbank gefunden.
+
+Die Seite ist möglicherweise gelöscht oder verschoben worden.
+
+Falls dies nicht  zutrifft, hast du eventuell einen Fehler in der Software gefunden. Bitte melde dies einem [[Special:ListUsers/sysop|Administrator]] unter Nennung der URL.',
+'fileappenderrorread' => '«$1» konnte während des Hinzufügens nicht gelesen werden.',
+'fileappenderror' => 'Konnte «$1» nicht an «$2» anhängen.',
+'filecopyerror' => 'Die Datei «$1» konnte nicht nach «$2» kopiert werden.',
+'filerenameerror' => 'Die Datei «$1» konnte nicht nach «$2» umbenannt werden.',
+'filedeleteerror' => 'Die Datei «$1» konnte nicht gelöscht werden.',
+'directorycreateerror' => 'Das Verzeichnis «$1» konnte nicht angelegt werden.',
+'filenotfound' => 'Die Datei «$1» wurde nicht gefunden.',
+'fileexistserror' => 'In die Datei «$1» konnte nicht geschrieben werden, da die Datei bereits vorhanden ist.',
+'unexpected' => 'Unerwarteter Wert: «$1» = «$2»',
+'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',
 'actionthrottledtext' => 'Im Rahmen einer Anti-Spam-Massnahme oder aufgrund eines Missbrauchsfilters kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze hast du überschritten.
 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-ch translatewiki.net], der Lokalisierungsplattform für MediaWiki, durchzuführen.",
+'titleprotected' => "Eine Seite mit diesem Namen kann nicht angelegt werden.
+Die Sperre wurde durch [[User:$1|$1]] mit der Begründung ''«$2»'' eingerichtet.",
+'filereadonlyerror' => 'Die Datei «$1» kann nicht verändert werden, da auf das Dateirepositorium «$2» nur Lesezugriff möglich ist.
+
+Der Administrator, der den Schreibzugriff sperrte, gab folgenden Grund an: «$3».',
 
 # Login and logout pages
-'nosuchuser' => 'Der Benutzername „$1“ existiert nicht.
+'loginsuccess' => 'Du bist jetzt als «$1» bei {{SITENAME}} angemeldet.',
+'nosuchuser' => 'Der Benutzername «$1» existiert nicht.
 Überprüfe die Schreibweise (Gross-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|melde dich als neuer Benutzer an]].',
+'nosuchusershort' => 'Der Benutzername «$1» ist nicht vorhanden. Bitte überprüfe die Schreibweise.',
+'passwordremindertext' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.
+
+Das automatisch generierte Passwort für Benutzer „$2“ lautet nun: $3
+
+Falls du dies wirklich gewünscht hast, solltest du dich jetzt anmelden und das Passwort ändern.
+Das neue Passwort ist {{PLURAL:$5|1 Tag|$5 Tage}} gültig.
+
+Bitte ignoriere dieses E-Mail, falls du sie nicht selbst angefordert hast. Das alte Passwort bleibt weiterhin gültig.',
+'noemail' => '{{GENDER:$1|Benutzer|Benutzerin|Benutzer}} «$1» hat keine E-Mail-Adresse angegeben.',
+'passwordsent' => 'Ein neues, temporäres Passwort wurde an die E-Mail-Adresse von Benutzer «$1» gesandt.
+Bitte melde dich damit an, sobald du es erhalten hast. Das alte Passwort bleibt weiterhin gültig.',
+'eauthentsent' => 'Ein Bestätigungs-E-Mail wurde an die angegebene Adresse verschickt.
+
+Bevor ein E-Mail von anderen Benutzern über die E-Mail-Funktion empfangen werden kann, muss die Adresse und ihre tatsächliche Zugehörigkeit zu diesem Benutzerkonto erst bestätigt werden. Bitte befolge die Hinweise im Bestätigungs-E-Mail.',
+'mailerror' => 'Fehler beim Senden des E-Mails: $1',
+'createaccount-text' => 'Es wurde für dich ein Benutzerkonto «$2» auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für «$2» ist «$3». Du solltest dich nun anmelden und das Passwort ändern.
+
+Falls das Benutzerkonto irrtümlich angelegt wurde, kannst du diese Nachricht ignorieren.',
+
+# E-mail sending
+'user-mail-no-addy' => 'Versuchte ein E-Mail ohne Angabe einer E-Mail-Adresse zu versenden',
 
 # Change password dialog
 'resetpass_announce' => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschliessen, musst du jetzt ein neues Passwort wählen.',
 
 # Edit pages
-'longpageerror' => "'''Fehler: Der Text, den du zu speichern versuchst, ist $1 KB gross. Dies ist grösser als das erlaubte Maximum von $2 KB.'''
+'missingsummary' => "'''Hinweis:''' Du hast keine Zusammenfassung angegeben. Wenn du erneut auf «{{int:savearticle}}» klickst, wird deine Änderung ohne Zusammenfassung übernommen.",
+'missingcommentheader' => "'''Achtung:''' Du hast kein Betreff/Überschrift eingegeben. Wenn du erneut auf «{{int:savearticle}}» klickst, wird deine Bearbeitung ohne Überschrift gespeichert.",
+'blockedtext' => "'''Dein Benutzername oder deine IP-Adresse wurde gesperrt.'''
+
+Die Sperrung wurde von $1 durchgeführt.
+Als Grund wurde ''$2'' angegeben.
+
+* Beginn der Sperre: $8
+* Ende der Sperre: $6
+* Sperre betrifft: $7
+
+Du kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.
+Du kannst die «E-Mail an diesen Benutzer»-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.
+Deine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
+Bitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
+'autoblockedtext' => "Deine IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.
+Als Grund wurde angegeben:
+
+:''$2''
+
+* Beginn der Sperre: $8
+* Ende der Sperre: $6
+* Sperre betrifft: $7
+
+Du kannst $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.
+
+Du kannst die «E-Mail an diesen Benutzer»-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in deinen [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für dich gesperrt wurde.
+
+Deine aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
+Bitte füge alle Informationen jeder Anfrage hinzu, die du stellst.",
+'confirmedittext' => 'Du musst deine E-Mail-Adresse erst bestätigen, bevor du Bearbeitungen durchführen kannst. Bitte ergänze und bestätige dein E-Mail in den [[Special:Preferences|Einstellungen]].',
+'accmailtext' => 'Ein zufällig generiertes Passwort für [[User talk:$1|$1]] wurde an $2 versandt.
+
+Das Passwort für dieses neue Benutzerkonto kann auf der Spezialseite «[[Special:ChangePassword|Passwort ändern]]» geändert werden.',
+'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.',
+'clearyourcache' => "'''Hinweis:''' Leere nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.
+* '''Firefox/Safari:''' ''Umschalttaste'' drücken und gleichzeitig ''Aktualisieren'' anklicken oder entweder ''Ctrl+F5'' oder ''Ctrl+R'' (''⌘+R'' auf dem Mac) drücken
+* '''Google Chrome:''' ''Umschalttaste+Ctrl+R'' (''⌘+Umschalttaste+R'' auf dem Mac) drücken
+* '''Internet Explorer:''' ''Ctrl+F5'' drücken oder ''Ctrl'' drücken und gleichzeitig ''Aktualisieren'' anklicken
+* '''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.",
+'userinvalidcssjstitle' => "'''Achtung:''' Die Benutzeroberfläche «$1» existiert nicht. Bedenke, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/vector.css'' an Stelle von ''{{ns:user}}:Mustermann/Vector.css''.",
+'editing' => 'Bearbeiten von «$1»',
+'editingsection' => 'Bearbeiten von «$1» (Abschnitt)',
+'editingcomment' => 'Bearbeiten von «$1» (Neuer Abschnitt)',
+'explainconflict' => "Jemand anders hat diese Seite geändert, nachdem du angefangen hast sie zu bearbeiten.
+Das obere Textfeld enthält den aktuellen Bearbeitungsstand der Seite.
+Das untere Textfeld enthält deine Änderungen.
+Bitte füge deine Änderungen in das obere Textfeld ein.
+'''Nur''' der Inhalt des oberen Textfeldes wird gespeichert, wenn du auf «{{int:savearticle}}» klickst.",
+'copyrightwarning' => "'''Bitte kopiere keine Webseiten, die nicht deine eigenen sind, benutze keine urheberrechtlich geschützten Werke ohne Erlaubnis des Urhebers!'''<br />
+Du gibst uns hiermit deine Zusage, dass du den Text '''selbst verfasst''' hast, dass der Text Allgemeingut '''(public domain)''' ist, oder dass der '''Urheber''' seine '''Zustimmung''' gegeben hat. Falls dieser Text bereits woanders veröffentlicht wurde, weise bitte auf der Diskussionsseite darauf hin.
+<i>Bitte beachte, dass alle {{SITENAME}}-Beiträge automatisch unter der «$2» stehen (siehe $1 für Einzelheiten). Falls du nicht möchtest, dass deine Arbeit hier von anderen verändert und verbreitet wird, dann drücke nicht auf «Seite speichern».</i>",
+'longpageerror' => "'''Fehler: Der Text, den du zu speichern versuchst, ist {{PLURAL:$1|ein Kilobyte|$1 Kilobytes}} gross. Dies ist grösser als das erlaubte Maximum von {{PLURAL:$2|ein Kilobyte|$2 Kilobytes}}.'''
 Er kann nicht gespeichert werden.",
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning'  => 'Warnung: Die Grösse eingebundener Vorlagen ist zu gross, einige Vorlagen können nicht eingebunden werden.',
+'post-expand-template-inclusion-warning' => 'Warnung: Die Grösse eingebundener Vorlagen ist zu gross, einige Vorlagen können nicht eingebunden werden.',
 'post-expand-template-inclusion-category' => 'Seiten, in denen die maximale Grösse eingebundener Vorlagen überschritten ist',
-'post-expand-template-argument-warning'   => "'''Warnung:''' Diese Seite enthält mindestens ein Argument in einer Vorlage, das expandiert zu gross ist. Diese Argumente werden ignoriert.",
+'post-expand-template-argument-warning' => "'''Warnung:''' Diese Seite enthält mindestens einen Parameter in einer Vorlage, der expandiert zu gross ist. Diese Parameter werden ignoriert.",
+
+# History pages
+'histlegend' => 'Zur Anzeige der Änderungen einfach die zu vergleichenden Versionen auswählen und die Schaltfläche «{{int:compareselectedversions}}» klicken.<br />
+* ({{int:cur}}) = Unterschied zur aktuellen Version, ({{int:last}}) = Unterschied zur vorherigen Version
+* Uhrzeit/Datum = Version zu dieser Zeit, Benutzername/IP-Adresse des Bearbeiters, {{int:minoreditletter}} = Kleine Änderung',
+
+# Revision deletion
+'revdelete-show-file-confirm' => 'Bist du sicher, dass du die gelöschte Version der Datei «<nowiki>$1</nowiki>» vom $2 um $3 Uhr ansehen willst?',
+'revdelete-show-no-access' => 'Fehler beim Anzeigen des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als «eingeschränkt» markiert.
+Du hast darauf keinen Zugriff.',
+'revdelete-modify-no-access' => 'Fehler beim Bearbeiten des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als «eingeschränkt» markiert.
+Du hast darauf keinen Zugriff.',
 
 # History merging
-'mergehistory-merge' => 'Die folgenden Versionen von „[[:$1]]“ können nach „[[:$2]]“ übertragen werden. Markiere die Version, bis zu der (einschliesslich) die Versionen übertragen werden sollen. Bitte beachte, dass die Nutzung der Navigationslinks die Auswahl zurücksetzt.',
+'mergehistory-merge' => 'Die folgenden Versionen von «[[:$1]]» können nach «[[:$2]]» übertragen werden. Markiere die Version, bis zu der (einschliesslich) die Versionen übertragen werden sollen. Bitte beachte, dass die Nutzung der Navigationslinks die Auswahl zurücksetzt.',
+'mergehistory-success' => '{{PLURAL:$3|1 Version|$3 Versionen}} von «[[:$1]]» erfolgreich nach «[[:$2]]» vereinigt.',
+'mergehistory-no-source' => 'Ursprungsseite «$1» ist nicht vorhanden.',
+'mergehistory-no-destination' => 'Zielseite «$1» ist nicht vorhanden.',
+'mergehistory-autocomment' => '«[[:$1]]» vereinigt nach «[[:$2]]»',
+'mergehistory-comment' => '«[[:$1]]» vereinigt nach «[[:$2]]»: $3',
+
+# Diffs
+'history-title' => 'Versionsgeschichte von «$1»',
 
 # Search results
+'searchresults-title' => 'Suchergebnisse für «$1»',
+'searchsubtitle' => 'Deine Suchanfrage: «[[:$1]]» ([[Special:Prefixindex/$1|alle mit «$1» beginnenden Seiten]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Seiten, die nach «$1» verlinken]])',
+'searchsubtitleinvalid' => 'Deine Suchanfrage: «$1».',
 'toomanymatches' => 'Die Anzahl der Suchergebnisse ist zu gross, bitte versuche eine andere Abfrage.',
-'nonefound'      => "'''Hinweis:''' Es werden standardmässig nur einige Namensräume durchsucht. Setze ''all:'' vor deinen Suchbegriff, um alle Seiten (inkl. Diskussionsseiten, Vorlagen usw.) zu durchsuchen oder gezielt den Namen des zu durchsuchenden Namensraumes.",
+'searchmenu-exists' => "'''Es gibt eine Seite, die den Namen «[[:$1]]» hat.'''",
+'searchmenu-new' => "'''Erstelle die Seite «[[:$1]]» in diesem Wiki.'''",
+'search-redirect' => '(Weiterleitung von «$1»)',
+'search-suggest' => 'Meintest du «$1»?',
+'nonefound' => "'''Hinweis:''' Es werden standardmässig nur einige Namensräume durchsucht. Setze ''all:'' vor deinen Suchbegriff, um alle Seiten (inkl. Diskussionsseiten, Vorlagen usw.) zu durchsuchen oder gezielt den Namen des zu durchsuchenden Namensraumes.",
 
 # Preferences page
 'prefs-watchlist-days' => 'Anzahl der Tage, die die Beobachtungsliste standardmässig umfassen soll:',
-'prefs-edit-boxsize'   => 'Grösse des Bearbeitungsfensters:',
-'recentchangesdays'    => 'Anzahl der Tage, die die Liste der „Letzten Änderungen“ standardmässig umfassen soll:',
-'recentchangescount'   => 'Anzahl der standardmässig angezeigten Bearbeitungen:',
-'defaultns'            => 'In diesen Namensräumen soll standardmässig gesucht werden:',
-'prefs-textboxsize'    => 'Grösse des Bearbeitungsfensters',
+'prefs-edit-boxsize' => 'Grösse des Bearbeitungsfensters:',
+'recentchangesdays' => 'Anzahl der Tage, die die Liste der «Letzten Änderungen» standardmässig umfassen soll:',
+'recentchangescount' => 'Anzahl der standardmässig angezeigten Bearbeitungen:',
+'defaultns' => 'In diesen Namensräumen soll standardmässig gesucht werden:',
+'prefs-textboxsize' => 'Grösse des Bearbeitungsfensters',
+'prefs-help-signature' => 'Beiträge auf Diskussionsseiten sollten mit «<nowiki>~~~~</nowiki>» signiert werden, was dann in die Signatur mit Zeitstempel umgewandelt wird.',
 
 # Rights
-'right-createpage'            => 'Seiten erstellen (ausser Diskussionsseiten)',
-'right-bigdelete'             => 'Seiten mit grosser Versionsgeschichte löschen',
+'right-createpage' => 'Seiten erstellen (ausser Diskussionsseiten)',
+'right-nominornewtalk' => 'Kleine Bearbeitungen an Diskussionsseiten führen zu keiner «Neue Nachrichten»-Anzeige',
+'right-bigdelete' => 'Seiten mit grosser Versionsgeschichte löschen',
 'right-override-export-depth' => 'Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5',
+'right-passwordreset' => 'Passwort eines Benutzers zurücksetzen und das dazu verschickte E-Mail einsehen',
+
+# User rights log
+'rightslogentry' => 'änderte die Benutzerrechte für «$1» von «$2» auf «$3»',
+'rightslogentry-autopromote' => 'wurde automatisch von «$2» nach «$3» zugeordnet',
+
+# Recent changes
+'rc_categories' => 'Nur Seiten aus den Kategorien (getrennt mit «|»):',
+'rc-old-title' => 'ursprünglich erstellt als «$1»',
+
+# Recent changes linked
+'recentchangeslinked-title' => 'Änderungen an Seiten, die von «$1» verlinkt sind',
 
 # Upload
-'file-too-large'           => 'Die übertragene Datei ist zu gross',
-'large-file'               => 'Die Dateigrösse sollte nach Möglichkeit $1 nicht überschreiten. Diese Datei ist $2 gross.',
-'largefileserver'          => 'Die Datei ist grösser als die vom Server eingestellte Maximalgrösse.',
-'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>'''
-Nur die Dateiendung unterscheidet sich in Gross-/Kleinschreibung. Bitte prüfe, ob die Dateien inhaltlich identisch sind.",
+'uploadtext' => "Benutze dieses Formular, um neue Dateien hochzuladen.
+
+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:
+* '''<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",
+'illegalfilename' => 'Der Dateiname «$1» enthält mindestens ein nicht erlaubtes Zeichen. Bitte benenne die Datei um und versuche, sie erneut hochzuladen.',
+'filename-toolong' => 'Dateinamen dürfen nicht grösser als 240 Byte sein.',
+'badfilename' => 'Der Dateiname wurde in «$1» geändert.',
+'filetype-mime-mismatch' => 'Dateierweiterung «.$1» stimmt nicht mit dem MIME-Typ ($2) überein.',
+'filetype-badmime' => 'Dateien mit dem MIME-Typ «$1» dürfen nicht hochgeladen werden.',
+'filetype-bad-ie-mime' => 'Diese Datei kann nicht hochgeladen werden, da der Internet Explorer sie als «$1» erkennt, welcher ein nicht erlaubter potentiell gefährlicher Dateityp ist.',
+'filetype-unwanted-type' => "'''«.$1»''' ist ein unerwünschtes Dateiformat. Erlaubt {{PLURAL:$3|ist das Dateiformat|sind die Dateiformate}}: $2.",
+'filetype-banned-type' => "'''«.$1»''' {{PLURAL:$4|ist ein nicht erlaubter Dateityp|sind nicht erlaubte Dateitypen}}.
+{{PLURAL:$3|Erlaubter Dateityp ist|Erlaubte Dateitypen sind}} $2.",
+'filetype-missing' => 'Die hochzuladende Datei hat keine Erweiterung (z. B. «.jpg»).',
+'file-too-large' => 'Die hochgeladene Datei war zu gross.',
+'large-file' => 'Die Dateigrösse sollte nach Möglichkeit $1 nicht überschreiten. Diese Datei ist $2 gross.',
+'largefileserver' => 'Die Datei ist grösser als die vom Server eingestellte Maximalgrösse.',
+'fileexists-extension' => 'Eine Datei mit ähnlichem Namen existiert bereits: [[$2|thumb]]
+* Name der hochzuladenden Datei: <strong>[[:$1]]</strong>
+* Name der vorhandenen Datei: <strong>[[:$2]]</strong>
+Nur die Dateiendung unterscheidet sich in Gross-/Kleinschreibung. Bitte prüfe, ob die Dateien inhaltlich identisch sind.',
 'fileexists-thumbnail-yes' => "Bei der Datei scheint es sich um ein Bild verringerter Grösse ''(thumbnail)'' zu handeln. [[$1|thumb]]
-Bitte prüfe die Datei '''<tt>[[:$1]]</tt>'''.
+Bitte prüfe die Datei <strong>[[:$1]]</strong>.
 Wenn es sich um das Bild in Originalgrösse 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össe ''(thumbnail)'' hin.
+'file-thumbnail-no' => "Der Dateiname beginnt mit <strong>$1</strong>. Dies deutet auf ein Bild verringerter Grösse ''(thumbnail)'' hin.
 Bitte prüfe, ob du das Bild in voller Auflösung vorliegen hast und lade dieses unter dem Originalnamen hoch.",
-'upload-maxfilesize'       => 'Maximale Dateigrösse: $1',
+'uploadedimage' => 'lud «[[$1]]» hoch',
+'overwroteimage' => 'lud eine neue Version von «[[$1]]» hoch',
+'upload-maxfilesize' => 'Maximale Dateigrösse: $1',
+'filename-bad-prefix' => "Der Dateiname beginnt mit '''«$1»'''. Dies ist im allgemeinen der von einer Digitalkamera vorgegebene Dateiname und daher nicht sehr aussagekräftig.
+Bitte gib der Datei einen Namen, der den Inhalt besser beschreibt.",
 
 'upload-unknown-size' => 'Unbekannte Grösse',
 
+# File backend
+'backend-fail-maxsize' => 'Die Datei $1 konnte nicht erstellt werden, da sie grösser als {{PLURAL:$2|ein Byte|$2 Byte}} ist.',
+'backend-fail-readonly' => 'Das Speicher-Backend «$1» befindet sich derzeit im Lesemodus. Der angegebene Grund lautet: «$2»',
+'backend-fail-synced' => 'Die Datei «$1» befindet sich, innerhalb des internen Speicher-Backends, in einem inkonsistenten Zustand.',
+'backend-fail-connect' => 'Es konnte keine Verbindung zum Speicher-Backend «$1» hergestellt werden.',
+'backend-fail-internal' => 'Im Speicher-Backend «$1» ist ein unbekannter Fehler aufgetreten.',
+'backend-fail-contenttype' => 'Der Inhaltstyp, der im Pfad «$1» zu speichernden Datei, konnte nicht bestimmt werden.',
+'backend-fail-usable' => 'Die Datei «$1» konnte entweder aufgrund eines nicht vorhandenen Verzeichnisses oder wegen unzureichender Berechtigungen weder abgerufen noch gespeichert werden.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Es konnte keine Verbindung zur Journaldatenbank des Speicher-Backends «$1» hergestellt werden.',
+'filejournal-fail-dbquery' => 'Die Journaldatenbank des Speicher-Backends «$1» konnte nicht aktualisiert werden.',
+
+# Lock manager
+'lockmanager-notlocked' => '«$1» konnte nicht entsperrt werden, da keine Sperrung besteht.',
+'lockmanager-fail-closelock' => 'Die Sperrdatei für «$1» konnte nicht geschlossen werden.',
+'lockmanager-fail-deletelock' => 'Die Sperrdatei für «$1» konnte nicht gelöscht werden.',
+'lockmanager-fail-acquirelock' => 'Die Sperre für «$1» konnte nicht abgerufen werden.',
+'lockmanager-fail-openlock' => 'Die Sperrdatei für «$1» konnte nicht geöffnet werden.',
+'lockmanager-fail-releaselock' => 'Die Sperre für «$1» konnte nicht freigegeben werden.',
+
+# ZipDirectoryReader
+'zip-bad' => 'Die Datei ist beschädigt oder eine aus anderweitigen Gründen nicht lesbare ZIP-Datei.
+Sie kann daher keiner ordnungsgemässen Sicherheitsüberprüfung unterzogen werden.',
+'zip-unsupported' => 'Diese ZIP-Datei verfügt über Komprimierungseigenschaften, die nicht von MediaWiki unterstützt werden.
+Sie kann daher keiner ordnungsgemässen Sicherheitsüberprüfung unterzogen werden.',
+
 # img_auth script messages
-'img-auth-nologinnWL' => 'Du bist nicht angemeldet und „$1“ ist nicht in der weissen Liste.',
+'img-auth-badtitle' => 'Aus «$1» kann kein gültiger Titel erstellt werden.',
+'img-auth-nologinnWL' => 'Du bist nicht angemeldet und «$1» ist nicht in der weissen Liste.',
+'img-auth-nofile' => 'Datei «$1» existiert nicht.',
+'img-auth-isdir' => 'Du versuchst, auf ein Verzeichnis «$1» zuzugreifen.
+Nur Dateizugriff ist erlaubt.',
+'img-auth-streaming' => 'Lade «$1».',
+'img-auth-noread' => 'Benutzer hat keine Berechtigung, «$1» zu lesen.',
+
+# HTTP errors
+'http-invalid-scheme' => 'URLs mit dem Schema «$1» werden nicht unterstützt',
 
 # Special:ListFiles
+'listfiles-summary' => 'Diese Spezialseite listet alle hochgeladenen Dateien auf. Standardmässig werden die zuletzt hochgeladenen Dateien zuerst angezeigt. Durch einen Klick auf die Spaltenüberschriften kann die Sortierung umgedreht werden oder es kann nach einer anderen Spalte sortiert werden.',
 'listfiles_size' => 'Grösse',
 
 # File description page
 'filehist-dimensions' => 'Masse',
-'filehist-filesize'   => 'Dateigrösse',
+'filehist-filesize' => 'Dateigrösse',
+
+# File reversion
+'filerevert' => 'Zurücksetzen von «$1»',
+
+# File deletion
+'filedelete' => 'Lösche «$1»',
+'filedelete-intro' => "Du löschst die Datei '''«[[Media:$1|$1]]»''' inklusive ihrer Versionsgeschichte.",
+'filedelete-intro-old' => "Du löschst von der Datei '''«[[Media:$1|$1]]»''' die [$4 Version vom $2, $3 Uhr].",
+'filedelete-success' => "'''«$1»''' wurde gelöscht.",
+'filedelete-success-old' => "Von der Datei '''«[[Media:$1|$1]]»''' wurde die Version vom $2, $3 Uhr gelöscht.",
+'filedelete-nofile' => "'''«$1»''' ist nicht vorhanden.",
+'filedelete-nofile-old' => "Es gibt von '''«$1»''' keine archivierte Version mit den angegebenen Attributen.",
+
+# Random page
+'randompage-nopages' => 'Es sind keine Seiten {{PLURAL:$2|im folgenden Namensraum|in den folgenden Namensräumen}} enthalten: «$1»',
+
+# Random redirect
+'randomredirect-nopages' => 'Im Namensraum «$1» sind keine Weiterleitungen vorhanden.',
 
 # Special:Log
 'alllogstext' => 'Dies ist die kombinierte Anzeige aller in {{SITENAME}} geführten Logbücher.
 Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels eingeschränkt werden (Gross-/Kleinschreibung muss beachtet werden).',
 
+# Special:AllPages
+'allpages-bad-ns' => 'Der Namensraum «$1» ist in {{SITENAME}} nicht vorhanden.',
+
+# Special:LinkSearch
+'linksearch-text' => 'Diese Spezialseite ermöglicht die Suche nach Seiten, in denen bestimmte Weblinks enthalten sind. Dabei können Platzhalter wie beispielsweise <code>*.beispiel.ch</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.)',
+
+# E-mail user
+'emailpagetext' => 'Du kannst dem Benutzer mit dem unten stehenden Formular ein E-Mail senden.
+Als Absender wird die E-Mail-Adresse aus deinen [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer dir antworten kann.',
+'defemailsubject' => '{{SITENAME}} - E-Mail von Benutzer «$1»',
+'emailnotarget' => 'Nicht vorhandener oder ungültiger Benutzername für den Empfang eines E-Mails.',
+'emailccme' => 'Sende eine Kopie des E-Mails an mich',
+'emailsenttext' => 'Dein E-Mail wurde verschickt.',
+'emailuserfooter' => 'Dieses E-Mail wurde von {{SITENAME}}-Benutzer «$1» an «$2» gesendet.',
+
+# Watchlist
+'addedwatchtext' => 'Die Seite «[[:$1]]» wurde zu deiner [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.
+Spätere Änderungen an dieser Seite und der zugehörigen Diskussionsseite werden dort gelistet und die Seite wird in der [[Special:RecentChanges|Liste der letzten Änderungen]] in Fettschrift angezeigt.',
+'removedwatchtext' => 'Die Seite «[[:$1]]» wurde von deiner [[Special:Watchlist|Beobachtungsliste]] entfernt.',
+'iteminvalidname' => 'Problem mit dem Eintrag «$1», ungültiger Name.',
+
+# Displayed when you click the "watch" button and it is in the process of watching
+'watcherrortext' => 'Beim Ändern der Beobachtungslisteneinstellungen für «$1» ist ein Fehler aufgetreten.',
+
+# Delete
+'excontent' => 'Inhalt war: «$1»',
+'excontentauthor' => 'Inhalt war: «$1» (einziger Bearbeiter: [[Special:Contributions/$2|$2]])',
+'exbeforeblank' => 'Inhalt vor dem Leeren der Seite: «$1»',
+'delete-confirm' => 'Löschen von «$1»',
+'deletedtext' => '«$1» wurde gelöscht. Im $2 findest du eine Liste der letzten Löschungen.',
+
+# Rollback
+'editcomment' => "Die Änderungszusammenfassung lautet: ''«$1»''.",
+
 # Protect
+'protectedarticle' => 'schützte «[[$1]]»',
+'modifiedarticleprotection' => 'änderte den Schutz von «[[$1]]»',
+'unprotectedarticle' => 'hob den Schutz von «[[$1]]» auf',
+'movedarticleprotection' => 'übertrug den Seitenschutz von «[[$2]]» auf «[[$1]]»',
+'protect-title' => 'Schutz ändern von «$1»',
+'protect-title-notallowed' => 'Schutz ansehen von «$1»',
+'protect-text' => 'Hier kannst du den Schutzstatus der Seite «$1» einsehen und ändern.',
+'protect-locked-blocked' => "Du kannst den Seitenschutz nicht ändern, da dein Benutzerkonto gesperrt ist. Hier sind die aktuellen Seitenschutz-Einstellungen der Seite '''«$1»:'''",
+'protect-locked-dblock' => "Die Datenbank ist gesperrt, der Seitenschutz kann daher nicht geändert werden. Hier sind die aktuellen Seitenschutz-Einstellungen der Seite '''«$1»:'''",
+'protect-locked-access' => "Dein Benutzerkonto verfügt nicht über die notwendigen Rechte zur Änderung des Seitenschutzes. Hier sind die aktuellen Seitenschutzeinstellungen der Seite '''«$1»:'''",
+'protect-fallback' => 'Es wird die «$1»-Berechtigung benötigt.',
 'minimum-size' => 'Mindestgrösse',
 'maximum-size' => 'Maximalgrösse:',
 
+# Undelete
+'undeleteextrahelp' => '* Um die Seite mitsamt aller Versionen wiederherzustellen, wähle keine Version aus, gib eine Begründung an und klicke dann auf «{{int:undeletebtn}}».
+* Um lediglich bestimmte Versionen der Seite wiederherzustellen, wähle die betreffenden Versionen einzeln aus, gib eine Begründung an und klicke dann auf «{{int:undeletebtn}}».',
+'undeletedpage' => "'''«$1»''' wurde wiederhergestellt.
+
+Im [[Special:Log/delete|Lösch-Logbuch]] findest du eine Übersicht der gelöschten und wiederhergestellten Seiten.",
+'undelete-cleanup-error' => 'Fehler beim Löschen der unbenutzten Archiv-Version «$1».',
+'undelete-show-file-confirm' => 'Bist du sicher, dass du eine gelöschte Version der Datei «<nowiki>$1</nowiki>» vom $2, $3 Uhr sehen willst?',
+
+# Contributions
+'contributions-title' => 'Benutzerbeiträge von «$1»',
+
+# What links here
+'whatlinkshere-title' => 'Seiten, die auf «$1» verlinken',
+'linkshere' => "Die folgenden Seiten verlinken auf '''«[[:$1]]»''':",
+'nolinkshere' => "Keine Seite verlinkt auf '''«[[:$1]]»'''.",
+'nolinkshere-ns' => "Keine Seite verlinkt auf '''«[[:$1]]»''' im gewählten Namensraum.",
+
 # Block/unblock
+'ipb-confirmhideuser' => 'Du bist gerade dabei, einen Benutzer im Modus «Benutzer verstecken» zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchtest du das wirklich tun?',
+'ipb-blocklist-contribs' => 'Benutzerbeiträge von «$1»',
+'autoblocker' => 'Automatische Sperre, da du eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzt. Grund der Benutzersperre: «$2».',
+'blocklogentry' => 'sperrte «[[$1]]» für den Zeitraum: $2 $3',
+'reblock-logentry' => 'änderte die Sperre von «[[$1]]» für den Zeitraum: $2 $3',
+'unblocklogentry' => 'hob die Sperre von «$1» auf',
+'ipb_already_blocked' => '«$1» wurde bereits gesperrt.',
+'ipb-needreblock' => '«$1» ist bereits gesperrt. Möchtest du die Sperrparameter ändern?',
 'ip_range_toolarge' => 'Adressbereiche, die größer als /$1 sind, sind nicht erlaubt.',
+'cant-see-hidden-user' => 'Der Benutzer, den du versuchst zu sperren, wurde bereits gesperrt und verborgen. Da du das «hideuser»-Recht nicht hast, kannst du die Benutzersperre nicht sehen und nicht bearbeiten.',
+
+# Move page
+'move-page' => 'Verschieben von «$1»',
+'movepage-moved' => "'''Die Seite «$1» wurde nach «$2» verschoben.'''",
+'movepage-page-exists' => 'Die Seite «$1» ist bereits vorhanden und kann nicht automatisch überschrieben werden.',
+'movepage-page-moved' => 'Die Seite «$1» wurde nach «$2» verschoben.',
+'movepage-page-unmoved' => 'Die Seite «$1» konnte nicht nach «$2» verschoben werden.',
+'delete_and_move_text' => '== Löschung erforderlich ==
+
+Die Seite «[[:$1]]» existiert bereits. Möchtest du diese löschen, um die Seite verschieben zu können?',
+'delete_and_move_reason' => 'gelöscht, um Platz für die Verschiebung von «[[$1]]» zu machen',
+'immobile-source-namespace' => 'Seiten des «$1»-Namensraums können nicht verschoben werden',
+'immobile-target-namespace' => 'Seiten können nicht in den «$1»-Namensraum verschoben werden',
 
 # Thumbnails
-'thumbnail-more'  => 'vergrössern',
+'thumbnail-more' => 'vergrössern',
 'djvu_page_error' => 'DjVu-Seite ausserhalb des Seitenbereichs',
 
 # Special:Import
 'import-interwiki-templates' => 'Alle Vorlagen einschliessen',
-'importuploaderrorsize'      => 'Das Hochladen der Importdatei ist fehlgeschlagen. Die Datei ist grösser als die maximal erlaubte Dateigrösse.',
+'importuploaderrorsize' => 'Das Hochladen der Importdatei ist fehlgeschlagen. Die Datei ist grösser als die maximal erlaubte Dateigrösse.',
+'import-error-edit' => 'Die Seite «$1» wurde nicht importiert, da du nicht berechtigt bist, sie zu bearbeiten.',
+'import-error-create' => 'Die Seite «$1» wurde nicht importiert, da du nicht berechtigt bist, sie zu erstellen.',
+'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 log
+'import-logentry-upload' => 'importierte «[[$1]]» von einer Datei',
+'import-logentry-interwiki' => 'importierte «$1» (Transwiki)',
+
+# JavaScriptTest
+'javascripttest-pagetext-unknownframework' => 'Unbekanntes Framework «$1».',
+
+# Tooltip help for the actions
+'tooltip-t-emailuser' => 'Ein E-Mail an diesen Benutzer senden',
+
+# Info page
+'pageinfo-title' => 'Informationen zu «$1»',
+
+# Patrolling
+'markedaspatrollederror' => 'Markierung als «kontrolliert» nicht möglich.',
+
+# Image deletion
+'filedelete-missing' => 'Die Datei «$1» kann nicht gelöscht werden, da sie nicht vorhanden ist.',
+'filedelete-old-unregistered' => 'Die angegebene Datei-Version «$1» ist nicht in der Datenbank vorhanden.',
+'filedelete-current-unregistered' => 'Die angegebene Datei «$1» ist nicht in der Datenbank vorhanden.',
+'filedelete-archive-read-only' => 'Das Archiv-Verzeichnis «$1» ist für den Webserver nicht beschreibbar.',
 
 # Media information
-'imagemaxsize'   => "Maximale Bildgrösse:<br />''(für Dateibeschreibungsseiten)''",
-'thumbsize'      => 'Standardgrösse der Vorschaubilder:',
-'file-info'      => 'Dateigrösse: $1, MIME-Typ: $2',
+'imagemaxsize' => "Maximale Bildgrösse:<br />''(für Dateibeschreibungsseiten)''",
+'thumbsize' => 'Standardgrösse der Vorschaubilder:',
+'file-info' => 'Dateigrösse: $1, MIME-Typ: $2',
 'file-info-size' => '$1 × $2 Pixel, Dateigrösse: $3, MIME-Typ: $4',
-'svg-long-desc'  => 'SVG-Datei, Basisgrösse: $1 × $2 Pixel, Dateigrösse: $3',
+'file-info-size-pages' => '$1 × $2 Pixel, Dateigrösse: $3, MIME-Typ: $4, $5 {{PLURAL:$5|Seite| Seiten}}',
+'svg-long-desc' => 'SVG-Datei, Basisgrösse: $1 × $2 Pixel, Dateigrösse: $3',
+'show-big-image-preview' => 'Grösse dieser Vorschau: $1.',
 
 # Metadata
-'metadata-fields' => 'Die folgenden Felder der EXIF-Metadaten in diesem MediaWiki-Systemtext werden auf Bildbeschreibungsseiten angezeigt; weitere standardmässig „eingeklappte“ Details können angezeigt werden.
+'metadata-fields' => 'Die folgenden Felder der EXIF-Metadaten, die in diesem MediaWiki-Systemtext angegeben sind, werden auf Bildbeschreibungsseiten mit eingeklappter Metadatentabelle angezeigt.
+Weitere werden standardmässig nicht angezeigt.
 * make
 * model
 * datetimeoriginal
@@ -129,17 +497,85 @@ Die Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seite
 
 # EXIF tags
 'exif-jpeginterchangeformatlength' => 'Grösse der JPEG-Daten in Bytes',
-'exif-referenceblackwhite'         => 'Schwarz/Weiss-Referenzpunkte',
-'exif-maxaperturevalue'            => 'Grösste Blende',
-'exif-whitebalance'                => 'Weissabgleich',
-'exif-gpsdop'                      => 'Masspräzision',
+'exif-referenceblackwhite' => 'Schwarz/Weiss-Referenzpunkte',
+'exif-maxaperturevalue' => 'Grösste Blende',
+'exif-whitebalance' => 'Weissabgleich',
+'exif-gpsdop' => 'Masspräzision',
 
 'exif-lightsource-13' => 'Tagesweiss fluoreszierend (N 4600–5400 K)',
 'exif-lightsource-14' => 'Kaltweiss fluoreszierend (W 3900–4500 K)',
 'exif-lightsource-15' => 'Weiss fluoreszierend (WW 3200–3700 K)',
 
+'exif-isospeedratings-overflow' => 'Grösser als 65535',
+
+# E-mail address confirmation
+'confirmemail_text' => '{{SITENAME}} erfordert, dass du deine E-Mail-Adresse bestätigst (authentifizierst), bevor du die erweiterten E-Mail-Funktionen benutzen kannst. Klicke bitte auf die unten stehende, mit «Bestätigungscode zuschicken» beschriftete Schaltfläche, damit ein automatisch erstelltes E-Mail an die angegebene Adresse geschickt wird. Dieses E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem du diese Webseite in deinem Webbrowser öffnest, bestätigst du, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
+'confirmemail_pending' => 'Es wurde dir bereits ein Bestätigungscode per E-Mail zugeschickt.
+Wenn du dein Benutzerkonto erst vor kurzem erstellt hast, warte bitte noch ein paar Minuten auf das E-Mail, bevor du einen neuen Code anforderst.',
+'confirmemail_body' => 'Hallo,
+
+jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat das Benutzerkonto «$2» in {{SITENAME}} registriert.
+
+Um die E-Mail-Funktion von {{SITENAME}} (wieder) zu aktivieren und um zu bestätigen,
+dass dieses Benutzerkonto wirklich zu deiner E-Mail-Adresse und damit zu dir gehört, öffne bitte die folgende Web-Adresse:
+
+$3
+
+Sollte die vorstehende Adresse in deinem E-Mail-Programm über mehrere Zeilen gehen, musst du sie allenfalls per Hand in die Adresszeile deines Web-Browsers einfügen.
+
+Wenn du das genannte Benutzerkonto *nicht* registriert hast, folge diesem Link, um den Bestätigungsprozess abzubrechen:
+
+$5
+
+Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
+'confirmemail_body_changed' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst,
+hat die E-Mail-Adresse des Benutzerkontos «$2» zu dieser Adresse auf {{SITENAME}} geändert.
+
+Um zu bestätigen, dass dieses Benutzerkonto wirklich dir gehört
+und um die E-Mail-Features auf {{SITENAME}} zu reaktivieren, öffne diesen Link in deinem Browser:
+
+$3
+
+Falls das Konto *nicht* dir gehört, folge diesem Link,
+um die E-Mail-Adress-Bestätigung abzubrechen:
+
+$5
+
+Dieser Bestätigungscode ist gültig bis $4.',
+'confirmemail_body_set' => 'Jemand mit der IP-Adresse $1, wahrscheinlich du selbst,
+hat die E-Mail-Adresse des Benutzerkontos «$2» auf {{SITENAME}} zu dieser E-Mail-Adresse abgeändert.
+
+Um zu bestätigen, dass dieses Benutzerkonto wirklich zu dir gehört
+und um die E-Mail-Funktionen auf {{SITENAME}} wieder zu aktivieren, öffne bitte den folgenden Link in deinem Browser:
+
+$3
+
+Falls das Konto *nicht* zu dir gehört, bitte den nachfolgenden Link öffnen,
+um die Bestätigung der E-Mail-Adresse abzubrechen:
+
+$5
+
+Dieser Bestätigungscode ist gültig bis $4.',
+
+# Auto-summaries
+'autosumm-replace' => 'Der Seiteninhalt wurde durch einen anderen Text ersetzt: «$1»',
+'autosumm-new' => 'Die Seite wurde neu angelegt: «$1»',
+
+# Live preview
+'livepreview-error' => 'Verbindung nicht möglich: $1 «$1». Bitte die normale Vorschau benutzen.',
+
+# Watchlist editor
+'watchlistedit-normal-explain' => 'Dies sind die Einträge deiner Beobachtungsliste. Um Einträge zu entfernen, markiere die Kästchen neben den Einträgen und klicke am Ende der Seite auf «{{int:Watchlistedit-normal-submit}}». Du kannst deine Beobachtungsliste auch im [[Special:EditWatchlist/raw|Listenformat bearbeiten]].',
+'watchlistedit-raw-explain' => 'Dies sind die Einträge deiner Beobachtungsliste im Listenformat. Die Einträge können zeilenweise gelöscht oder hinzugefügt werden.
+Pro Zeile ist ein Eintrag erlaubt. Sobald du fertig bist, klicke auf «{{int:Watchlistedit-raw-submit}}».
+Du kannst auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutzen.',
+
+# Core parser functions
+'unknown_extension_tag' => 'Unbekanntes Parsertag «$1»',
+'duplicate-defaultsort' => 'Achtung: Der Sortierungsschlüssel «$2» überschreibt den vorher verwendeten Schlüssel «$1».',
+
 # Special:Version
-'version-license-info' => "MediaWiki ist freie Software, d. h. sie kann, gemäss den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/ oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.
+'version-license-info' => "MediaWiki ist freie Software, d. h. sie kann, gemäss den Bedingungen der von der Free Software Foundation veröffentlichten ''GNU General Public License'', weiterverteilt und/oder modifiziert werden. Dabei kann die Version 2, oder nach eigenem Ermessen, jede neuere Version der Lizenz verwendet werden.
 
 MediaWiki wird in der Hoffnung verteilt, dass es nützlich sein wird, allerdings OHNE JEGLICHE GARANTIE und sogar ohne die implizierte Garantie einer MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Hierzu sind weitere Hinweise in der ''GNU General Public License'' enthalten.
 
@@ -147,15 +583,30 @@ Eine [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie der ''GNU General Public License'']
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-info' => '$1 × $2 Pixel<br />Dateigrösse: $3<br />MIME-Typ: $4',
+'fileduplicatesearch-result-1' => 'Die Datei «$1» hat keine identischen Duplikate.',
+'fileduplicatesearch-result-n' => 'Die Datei «$1» hat {{PLURAL:$2|ein identisches Duplikat|$2 identische Duplikate}}.',
+'fileduplicatesearch-noresults' => 'Es wurde keine Datei namens «$1» gefunden.',
 
 # External image whitelist
-'external_image_whitelist' => ' #Diese Zeile nicht verändern<pre>
+'external_image_whitelist' => ' #Diese Zeile nicht verändern.<pre>
 #Untenstehend können Fragmente regulärer Ausdrücke (der Teil zwischen den //) eingegeben werden.
-#Diese werden mit den URLs von Bildern aus externen Quellen verglichen
-#Ein positiver Vergleich führt zur Anzeige des Bildes, andernfalls wird das Bild nur als Link angezeigt
-#Zeilen, die mit einem # beginnen, werden als Kommentar behandelt
-#Es wird nicht zwischen Gross- und Kleinschreibung unterschieden
+#Diese werden mit den URLs von Bildern aus externen Quellen verglichen.
+#Ein positiver Vergleich führt zur Anzeige des Bildes, andernfalls wird das Bild nur als Link angezeigt.
+#Zeilen, die mit einem # beginnen, werden als Kommentar behandelt.
+#Es wird nicht zwischen Gross- und Kleinschreibung unterschieden.
+
+#Fragmente regulärer Ausdrücke nach dieser Zeile eintragen. Diese Zeile nicht verändern.</pre>',
+
+# Feedback
+'feedback-bugornote' => 'Sofern Du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].
+Anderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kommentar wird, zusammen mit deinem Benutzernamen und der Version des von Dir verwendeten Webbrowsers sowie Betriebssystems, auf der Seite «[$3 $2]» hinzugefügt.',
+'feedback-thanks' => 'Vielen Dank. Deine Rückmeldung wurde auf der Seite «[$2 $1]» gespeichert.',
 
-#Fragmente regulärer Ausdrücke nach dieser Zeile eintragen. Diese Zeile nicht verändern</pre>',
+# API errors
+'api-error-file-too-large' => 'Die hochgeladene Datei war zu gross.',
+'api-error-hookaborted' => 'Die von dir vorgesehene Anpassung kann nicht durchgeführt werden (Unterbruch durch eine Programmschnittstelle).',
+'api-error-unknown-code' => 'Unbekannter Fehler: «$1»',
+'api-error-unknown-warning' => 'Unbekannte Warnung: «$1»',
+'api-error-unknownerror' => 'Unbekannter Fehler: «$1»',
 
 );
index 1c105b0..31a782a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** German (formal address) (‪Deutsch (Sie-Form)‬)
+/** German (formal address) (Deutsch (Sie-Form)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -39,61 +39,65 @@ Bitte warten Sie einige Minuten, bevor Sie es noch einmal versuchen.
 
 $1',
 
-'badaccess-group0' => 'Sie haben nicht die erforderliche Berechtigung für diese Aktion.',
+'badaccess-group0' => 'Sie haben nicht die erforderlichen Benutzerrechte für diese Aktion.',
 
-'youhavenewmessages'      => 'Sie haben $1 ($2).',
+'youhavenewmessages' => 'Sie haben $1 ($2).',
 'youhavenewmessagesmulti' => 'Sie haben neue Nachrichten: $1',
 
 # General errors
-'enterlockreason'     => 'Bitte geben Sie einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung',
-'readonlytext'        => 'Die Datenbank ist vorübergehend für Neueinträge und Änderungen gesperrt. Bitte versuchen Sie es später noch einmal.
+'enterlockreason' => 'Bitte geben Sie einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung',
+'readonlytext' => 'Die Datenbank ist vorübergehend für Neueinträge und Änderungen gesperrt. Bitte versuchen Sie es später noch einmal.
 
 Grund der Sperrung: $1',
-'missing-article'     => 'Der Text von „$1“ $2 wurde nicht in der Datenbank gefunden.
+'missing-article' => 'Der Text von „$1“ $2 wurde nicht in der Datenbank gefunden.
 
 Die Seite ist möglicherweise gelöscht oder verschoben worden.
 
 Falls dies nicht der Fall ist, haben Sie eventuell einen Fehler in der Software gefunden. Bitte melden Sie dies einem [[Special:ListUsers/sysop|Administrator]] unter Nennung der URL.',
 'actionthrottledtext' => 'Im Rahmen einer Anti-Spam-Maßnahme kann diese Aktion in einem kurzen Zeitabstand nur begrenzt oft ausgeführt werden. Diese Grenze haben Sie überschritten.
 Bitte versuchen Sie es in ein paar Minuten erneut.',
-'viewsourcetext'      => 'Sie können den Quelltext dieser Seite betrachten und kopieren:',
-'viewyourtext'        => "Sie können den Quelltext '''Ihrer Bearbeitung''' dieser Seite betrachten und kopieren:",
-'editinginterface'    => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
-Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche aus.
-Ziehen Sie bitte im Fall von Übersetzungen in Betracht, diese bei [//translatewiki.net/wiki/Main_Page?setlang=de-formal translatewiki.net], der Lokalisierungsplattform für MediaWiki, durchzuführen.",
-'namespaceprotected'  => "Sie haben nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
-'customcssprotected'  => 'Sie haben nicht die Berechtigung diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.',
-'customjsprotected'   => 'Sie haben nicht die Berechtigung diese JavaScript enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.',
+'viewsourcetext' => 'Sie können den Quelltext dieser Seite betrachten und kopieren:',
+'viewyourtext' => "Sie können den Quelltext '''Ihrer Bearbeitung''' dieser Seite betrachten und kopieren:",
+'protectedinterface' => 'Diese Seite enthält Text für die Benutzeroberfläche der Software auf diesem Wiki und ist geschützt, um Missbrauch vorzubeugen.
+Nutzen Sie bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.',
+'editinginterface' => "'''Warnung:''' Diese Seite enthält von der MediaWiki-Software genutzten Text.
+Änderungen auf dieser Seite wirken sich auf die Benutzeroberfläche dieses Wikis aus.
+Nutzen Sie bitte [//translatewiki.net/ translatewiki.net], das Lokalisierungsprojekt von MediaWiki, um Übersetzungen für alle Wikis hinzuzufügen oder zu ändern.",
+'namespaceprotected' => "Sie haben nicht die erforderliche Berechtigung, um Seiten im Namensraum '''$1''' bearbeiten zu können.",
+'customcssprotected' => 'Sie haben nicht die Berechtigung diese CSS enthaltende Seite zu bearbeiten, da sie die persönlichen Einstellungen eines anderen Benutzers enthält.',
+'customjsprotected' => 'Sie haben nicht die Berechtigung, diese JavaScript enthaltende Seite zu bearbeiten, da es sich hierbei um die persönlichen Einstellungen eines anderen Benutzers handelt.',
+'exception-nologin-text' => 'Diese Seite oder Aktion erfordert, dass Sie auf diesem Wiki angemeldet sind.',
 
 # Login and logout pages
-'logouttext'                 => "'''Sie sind nun abgemeldet.'''
+'logouttext' => "'''Sie sind nun abgemeldet.'''
 
 Sie können {{SITENAME}} jetzt anonym weiternutzen, oder sich erneut unter demselben oder einem anderen Benutzernamen [[Special:UserLogin|anmelden]].
 Beachten Sie, dass einige Seiten noch anzeigen können, dass Sie angemeldet sind, solange Sie nicht Ihren Browsercache geleert haben.",
-'welcomecreation'            => '== Willkommen, $1! ==
-
-Ihr Benutzerkonto wurde eingerichtet.
-Vergessen Sie nicht, Ihre [[Special:Preferences|{{SITENAME}}-Einstellungen]] anzupassen.',
-'yourdomainname'             => 'Ihre Domain:',
-'externaldberror'            => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder Sie dürfen Ihr externes Benutzerkonto nicht aktualisieren.',
-'nologin'                    => "Sie haben kein Benutzerkonto? '''$1'''.",
-'gotaccount'                 => "Haben Sie bereits ein Benutzerkonto? '''$1'''.",
-'userexists'                 => 'Dieser Benutzername ist schon vergeben.
+'welcomecreation' => '== Willkommen, $1! ==
+
+Ihr Benutzerkonto wurde soeben eingerichtet.
+Vergessen Sie nicht, Ihre [[Special:Preferences|Einstellungen]] anzupassen.',
+'yourdomainname' => 'Ihre Domain:',
+'password-change-forbidden' => 'Sie können auf diesem Wiki keine Passwörter ändern.',
+'externaldberror' => 'Entweder es liegt ein Fehler bei der externen Authentifizierung vor oder Sie dürfen Ihr externes Benutzerkonto nicht aktualisieren.',
+'nologin' => "Sie haben kein Benutzerkonto? '''$1'''.",
+'gotaccount' => "Haben Sie bereits ein Benutzerkonto? '''$1'''.",
+'userexists' => 'Dieser Benutzername ist schon vergeben.
 Bitte wählen Sie einen anderen.',
-'nocookiesnew'               => 'Der Benutzerzugang wurde erstellt, aber Sie sind nicht angemeldet.
+'nocookiesnew' => 'Der Benutzerzugang wurde erstellt, aber Sie sind nicht angemeldet.
 {{SITENAME}} benötigt für diese Funktion Cookies, bitte aktivieren Sie diese und melden sich dann mit Ihrem neuen Benutzernamen und dem zugehörigen Passwort an.',
-'nocookieslogin'             => '{{SITENAME}} benutzt Cookies zur Anmeldung der Benutzer.
+'nocookieslogin' => '{{SITENAME}} benutzt Cookies zur Anmeldung der Benutzer.
 Sie haben Cookies deaktiviert, bitte aktivieren Sie diese und versuchen Sie es erneut.',
-'noname'                     => 'Sie müssen einen gültigen Benutzernamen angeben.',
-'loginsuccess'               => 'Sie sind jetzt als „$1“ bei {{SITENAME}} angemeldet.',
-'nosuchuser'                 => 'Der Benutzername „$1“ existiert nicht.
+'noname' => 'Sie müssen einen gültigen Benutzernamen angeben.',
+'loginsuccess' => 'Sie sind jetzt als „$1“ bei {{SITENAME}} angemeldet.',
+'nosuchuser' => 'Der Benutzername „$1“ existiert nicht.
 Überprüfen Sie die Schreibweise (Groß-/Kleinschreibung beachten) oder [[Special:UserLogin/signup|melden Sie sich als neuer Benutzer an]].',
-'nosuchusershort'            => 'Der Benutzername „$1“ ist nicht vorhanden. Bitte überprüfen Sie die Schreibweise.',
-'nouserspecified'            => 'Bitte geben Sie einen Benutzernamen an.',
-'wrongpassword'              => 'Das Passwort ist falsch. Bitte versuchen Sie es erneut.',
-'wrongpasswordempty'         => 'Es wurde kein Passwort eingegeben. Bitte versuchen Sie es erneut.',
-'password-name-match'        => 'Ihr Passwort muss sich von Ihrem Benutzernamen unterscheiden.',
-'passwordremindertext'       => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.
+'nosuchusershort' => 'Der Benutzername „$1“ ist nicht vorhanden. Bitte überprüfen Sie die Schreibweise.',
+'nouserspecified' => 'Bitte geben Sie einen Benutzernamen an.',
+'wrongpassword' => 'Das Passwort ist falsch. Bitte versuchen Sie es erneut.',
+'wrongpasswordempty' => 'Es wurde kein Passwort eingegeben. Bitte versuchen Sie es erneut.',
+'password-name-match' => 'Ihr Passwort muss sich von Ihrem Benutzernamen unterscheiden.',
+'passwordremindertext' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat ein neues Passwort für die Anmeldung bei {{SITENAME}} ($4) angefordert.
 
 Das automatisch generierte Passwort für Benutzer „$2“ lautet nun: $3
 
@@ -101,38 +105,39 @@ Falls Sie dies wirklich gewünscht haben, sollten Sie sich jetzt anmelden und da
 Das neue Passwort ist {{PLURAL:$5|1 Tag|$5 Tage}} gültig.
 
 Bitte ignorieren Sie diese E-Mail, falls Sie sie nicht selbst angefordert haben. Das alte Passwort bleibt weiterhin gültig.',
-'noemailcreate'              => 'Sie müssen eine gültige E-Mail-Adresse angeben',
-'passwordsent'               => 'Ein neues, temporäres Passwort wurde an die E-Mail-Adresse von Benutzer „$1“ gesandt.
+'noemailcreate' => 'Sie müssen eine gültige E-Mail-Adresse angeben',
+'passwordsent' => 'Ein neues, temporäres Passwort wurde an die E-Mail-Adresse von Benutzer „$1“ gesandt.
 Bitte melden Sie sich damit an, sobald sie es erhalten haben. Das alte Passwort bleibt weiterhin gültig.',
-'blocked-mailpassword'       => 'Die von Ihnen verwendete IP-Adresse ist für das Ändern von Seiten gesperrt. Um einen Missbrauch zu verhindern, wurde die Möglichkeit zur Anforderung eines neuen Passwortes ebenfalls gesperrt.',
-'eauthentsent'               => 'Eine Bestätigungs-E-Mail wurde an die angegebene Adresse verschickt.
+'blocked-mailpassword' => 'Die von Ihnen verwendete IP-Adresse ist für das Ändern von Seiten gesperrt. Um einen Missbrauch zu verhindern, wurde die Möglichkeit zur Anforderung eines neuen Passwortes ebenfalls gesperrt.',
+'eauthentsent' => 'Eine Bestätigungs-E-Mail wurde an die angegebene Adresse verschickt.
 
 Bevor eine E-Mail von anderen Benutzern über die E-Mail-Funktion empfangen werden kann, muss die Adresse und ihre tatsächliche Zugehörigkeit zu diesem Benutzerkonto erst bestätigt werden. Bitte befolgen Sie die Hinweise in der Bestätigungs-E-Mail.',
 'acct_creation_throttle_hit' => 'Besucher dieses Wikis, die Ihre IP-Adresse verwenden, haben innerhalb des letzten Tages {{PLURAL:$1|1 Benutzerkonto|$1 Benutzerkonten}} erstellt, was die maximal erlaubte Anzahl in dieser Zeitperiode ist.
 
 Besucher, die diese IP-Adresse verwenden, können momentan keine Benutzerkonten mehr erstellen.',
-'emailauthenticated'         => 'Ihre E-Mail-Adresse wurde am $2 um $3 Uhr bestätigt.',
-'emailnotauthenticated'      => 'Ihre E-Mail-Adresse ist noch nicht bestätigt. Die folgenden E-Mail-Funktionen stehen erst nach erfolgreicher Bestätigung zur Verfügung.',
-'noemailprefs'               => 'Geben Sie eine E-Mail-Adresse in den Einstellungen an, damit die nachfolgenden Funktionen zur Verfügung stehen.',
-'invalidemailaddress'        => 'Die E-Mail-Adresse wird nicht akzeptiert, weil sie ein ungültiges Format (eventuell ungültige Zeichen) zu haben scheint. Bitte geben Sie eine korrekte Adresse ein oder leeren Sie das Feld.',
-'createaccount-text'         => 'Es wurde für Sie ein Benutzerkonto „$2“ auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für „$2“ ist „$3“. Sie sollten sich nun anmelden und das Passwort ändern.
+'emailauthenticated' => 'Ihre E-Mail-Adresse wurde am $2 um $3 Uhr bestätigt.',
+'emailnotauthenticated' => 'Ihre E-Mail-Adresse ist noch nicht bestätigt. Die folgenden E-Mail-Funktionen stehen erst nach erfolgreicher Bestätigung zur Verfügung.',
+'noemailprefs' => 'Geben Sie eine E-Mail-Adresse in den Einstellungen an, damit die nachfolgenden Funktionen zur Verfügung stehen.',
+'invalidemailaddress' => 'Die E-Mail-Adresse wird nicht akzeptiert, weil sie ein ungültiges Format (eventuell ungültige Zeichen) zu haben scheint. Bitte geben Sie eine korrekte Adresse ein oder leeren Sie das Feld.',
+'createaccount-text' => 'Es wurde für Sie ein Benutzerkonto „$2“ auf {{SITENAME}} ($4) erstellt. Das automatisch generierte Passwort für „$2“ ist „$3“. Sie sollten sich nun anmelden und das Passwort ändern.
 
 Falls das Benutzerkonto irrtümlich angelegt wurde, können Sie diese Nachricht ignorieren.',
-'login-throttled'            => 'Sie haben zu oft versucht, sich anzumelden.
-Bitte warten Sie, bevor Sie es erneut probierst.',
+'login-throttled' => 'Sie haben zu oft versucht, sich anzumelden.
+Bitte warten Sie, bevor Sie es erneut probieren.',
 
 # Change password dialog
-'resetpass_announce'      => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschließen, müssen Sie jetzt ein neues Passwort wählen.',
-'resetpass_text'          => '<!-- Ergänzen Sie den Text hier -->',
-'resetpass_success'       => 'Ihr Passwort wurde erfolgreich geändert. Es folgt die Anmeldung …',
-'resetpass-no-info'       => 'Sie müssen sich anmelden, um auf diese Seite direkt zuzugreifen.',
+'resetpass_announce' => 'Anmeldung mit dem per E-Mail zugesandten Code. Um die Anmeldung abzuschließen, müssen Sie jetzt ein neues Passwort wählen.',
+'resetpass_text' => '<!-- Ergänzen Sie den Text hier -->',
+'resetpass_success' => 'Ihr Passwort wurde erfolgreich geändert. Es folgt die Anmeldung …',
+'resetpass-no-info' => 'Sie müssen sich anmelden, um auf diese Seite direkt zuzugreifen.',
 'resetpass-wrong-oldpass' => 'Ungültiges temporäres oder aktuelles Passwort.
 Möglicherweise haben Sie Ihr Passwort bereits erfolgreich geändert oder ein neues temporäres Passwort beantragt.',
 
 # Special:PasswordReset
-'passwordreset-text'           => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen Ihres Benutzerkontos zu erhalten.',
-'passwordreset-capture-help'   => 'Sofern Sie dieses Kästchen ankreuzen, wird die E-Mail-Nachricht mit dem temporären Passwort, sowohl Ihnen angezeigt, als auch dem Benutzer zugesandt.',
-'passwordreset-emailtext-ip'   => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat eine Erinnerung an Ihre Benutzerkonteninformationen für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
+'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen Ihres Benutzerkontos zu erhalten.',
+'passwordreset-pretext' => '{{PLURAL:$1||Geben Sie eines der folgenden Daten ein.}}',
+'passwordreset-capture-help' => 'Sofern Sie dieses Kästchen ankreuzen, wird die E-Mail-Nachricht mit dem temporären Passwort, sowohl Ihnen angezeigt, als auch dem Benutzer zugesandt.',
+'passwordreset-emailtext-ip' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat eine Erinnerung an Ihre Benutzerkonteninformationen für {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:
 
 $2
 
@@ -145,20 +150,20 @@ $2
 {{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab. Sie sollten sich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder Sie sich wieder an Ihr ursprüngliches Passwort erinnern können und es nicht ändern möchten, können Sie diese Nachricht ignorieren und weiterhin Ihr altes Passwort benutzen.',
 
 # Special:ChangeEmail
-'changeemail-text'    => 'Füllen Sie dieses Formular vollständig aus, um Ihre E-Mail-Adresse zu ändern. Sie müssen Ihr Passwort angeben, um diese Änderung zu bestätigen.',
+'changeemail-text' => 'Füllen Sie dieses Formular vollständig aus, um Ihre E-Mail-Adresse zu ändern. Sie müssen Ihr Passwort angeben, um diese Änderung zu bestätigen.',
 'changeemail-no-info' => 'Sie müssen angemeldet sein, um direkt auf diese Seite zugreifen zu können.',
 
 # Edit page toolbar
 'sig_tip' => 'Ihre Signatur mit Zeitstempel',
 
 # Edit pages
-'anoneditwarning'                  => "Sie bearbeiten diese Seite unangemeldet. Wenn Sie speichern, wird Ihre aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
-'missingsummary'                   => "'''Hinweis:''' Sie haben keine Zusammenfassung angegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Änderung ohne Zusammenfassung übernommen.",
-'missingcommenttext'               => 'Ihr Abschnitt enthält keinen Text.',
-'missingcommentheader'             => "'''Achtung:''' Sie haben kein Betreff/Überschrift eingegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
-'blockedtext'                      => "'''Ihr Benutzername oder Ihre IP-Adresse wurde gesperrt.'''
+'anoneditwarning' => "Sie bearbeiten diese Seite unangemeldet. Wenn Sie sie speichern, wird Ihre aktuelle IP-Adresse in der Versionsgeschichte aufgezeichnet und ist damit unwiderruflich '''öffentlich''' einsehbar.",
+'missingsummary' => "'''Hinweis:''' Sie haben keine Zusammenfassung angegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Änderung ohne Zusammenfassung übernommen.",
+'missingcommenttext' => 'Ihr Abschnitt enthält keinen Text.',
+'missingcommentheader' => "'''Achtung:''' Sie haben kein Betreff/Überschrift eingegeben. Wenn Sie erneut auf „{{int:savearticle}}“ klicken, wird Ihre Bearbeitung ohne Überschrift gespeichert.",
+'blockedtext' => "'''Ihr Benutzername oder Ihre IP-Adresse wurde gesperrt.'''
 
-Die Sperrung wurde von $1 durchgeführt.
+Die Sperrung wurde vom Administrator $1 durchgeführt.
 Als Grund wurde ''$2'' angegeben.
 
 * Beginn der Sperre: $8
@@ -166,10 +171,10 @@ Als Grund wurde ''$2'' angegeben.
 * Sperre betrifft: $7
 
 Sie könnten $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.
-Sie können die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist, oder diese Funktion für Sie gesperrt wurde.
-Ihre aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
+Sie können die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für Sie gesperrt wurde.
+Ihre aktuelle IP-Adresse ist $3 und die Sperrkennung lautet $5.
 Bitte fügen Sie alle Informationen jeder Anfrage hinzu, die Sie stellen.",
-'autoblockedtext'                  => "Ihre IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.
+'autoblockedtext' => "Ihre IP-Adresse wurde automatisch gesperrt, da sie von einem anderen Benutzer genutzt wurde, der von $1 gesperrt wurde.
 Als Grund wurde angegeben:
 
 :''$2''
@@ -180,171 +185,170 @@ Als Grund wurde angegeben:
 
 Sie können $1 oder einen der anderen [[{{MediaWiki:Grouppage-sysop}}|Administratoren]] kontaktieren, um über die Sperre zu diskutieren.
 
-Sie können die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist, oder diese Funktion für Sie gesperrt wurde.
+Sie können die „E-Mail an diesen Benutzer“-Funktion nicht nutzen, solange keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|Benutzerkonto-Einstellungen]] eingetragen ist oder diese Funktion für Sie gesperrt wurde.
 
 Ihre aktuelle IP-Adresse ist $3, und die Sperr-ID ist $5.
 Bitte fügen Sie alle Informationen jeder Anfrage hinzu, die Sie stellen.",
-'whitelistedittext'                => 'Sie müssen sich $1, um Seiten bearbeiten zu können.',
-'confirmedittext'                  => 'Sie müssen Ihre E-Mail-Adresse erst bestätigen, bevor Sie Bearbeitungen vornehmen können. Bitte ergänzen und bestätigen Sie Ihre E-Mail in den [[Special:Preferences|Einstellungen]].',
-'nosuchsectiontext'                => 'Sie haben versucht, einen Abschnitt zu bearbeiten, der nicht existiert.
+'whitelistedittext' => 'Sie müssen sich $1, um Seiten bearbeiten zu können.',
+'confirmedittext' => 'Sie müssen Ihre E-Mail-Adresse erst bestätigen, bevor Sie Bearbeitungen vornehmen können. Bitte ergänzen und bestätigen Sie Ihre E-Mail in den [[Special:Preferences|Einstellungen]].',
+'nosuchsectiontext' => 'Sie haben versucht, einen Abschnitt zu bearbeiten, der nicht existiert.
 Vermutlich wurde er verschoben oder gelöscht, nachdem Sie die Seite aufgerufen haben.',
-'loginreqpagetext'                 => 'Sie müssen sich $1, um Seiten lesen zu können.',
-'newarticletext'                   => "Sie sind einem Link zu einer Seite gefolgt, die nicht vorhanden ist.
+'loginreqpagetext' => 'Sie müssen sich $1, um Seiten lesen zu können.',
+'newarticletext' => "Sie sind einem Link zu einer Seite gefolgt, die nicht vorhanden ist.
 Um diese Seite anzulegen, tragen Sie Ihren Text in das untenstehende Bearbeitungsfeld ein (siehe die [[{{MediaWiki:Helppage}}|Hilfeseite]] für weitere Informationen).
 Sofern Sie fälschlicherweise hier sind, klicken Sie auf die Schaltfläche '''Zurück''' Ihres Browsers.",
-'anontalkpagetext'                 => "----''Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen. Es wird seine IP-Adresse zur Identifizierung verwendet. IP-Adressen können von mehreren Benutzern gemeinsam verwendet werden. Wenn Sie mit den Kommentaren auf dieser Seite nichts anfangen können, richten sie sich vermutlich an einen früheren Inhaber Ihrer IP-Adresse und Sie können sie ignorieren. Sie können sich auch ein [[Special:UserLogin/signup|Benutzerkonto erstellen]] oder sich [[Special:UserLogin|anmelden]], um künftig Verwechslungen mit anderen anonymen Benutzern zu vermeiden.''",
-'noarticletext'                    => 'Diese Seite enthält momentan noch keinen Text.
+'anontalkpagetext' => "----''Diese Seite dient dazu, einem nicht angemeldeten Benutzer Nachrichten zu hinterlassen. Es wird seine IP-Adresse zur Identifizierung verwendet. IP-Adressen können von mehreren Benutzern gemeinsam verwendet werden. Wenn Sie mit den Kommentaren auf dieser Seite nichts anfangen können, richten sie sich vermutlich an einen früheren Inhaber Ihrer IP-Adresse und Sie können sie ignorieren. Sie können sich auch ein [[Special:UserLogin/signup|Benutzerkonto erstellen]] oder sich [[Special:UserLogin|anmelden]], um künftig Verwechslungen mit anderen anonymen Benutzern zu vermeiden.''",
+'noarticletext' => 'Diese Seite enthält momentan noch keinen Text.
 Sie können diesen Titel auf den anderen Seiten [[Special:Search/{{PAGENAME}}|suchen]],
 <span class="plainlinks">in den zugehörigen [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbüchern suchen] oder diese Seite [{{fullurl:{{FULLPAGENAME}}|action=edit}} bearbeiten]</span>.',
-'noarticletext-nopermission'       => 'Diese Seite enthält momentan noch keinen Text.
-Sie können diesen Titel auf den anderen Seiten [[Special:Search/{{PAGENAME}}|suchen]]
-oder in den zugehörigen <span class="plainlinks">[{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbüchern suchen]</span>.',
-'userpage-userdoesnotexist'        => 'Das Benutzerkonto „<nowiki>$1</nowiki>“ ist nicht vorhanden. Bitte prüfen Sie, ob Sie diese Seite wirklich erstellen/bearbeiten möchten.',
-'clearyourcache'                   => "'''Hinweis:''' Leeren Sie nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.
+'noarticletext-nopermission' => 'Diese Seite enthält momentan noch keinen Text.
+Sie können 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>. Sie sind allerdings nicht berechtigt diese Seite zu erstellen.',
+'userpage-userdoesnotexist' => 'Das Benutzerkonto „<nowiki>$1</nowiki>“ ist nicht vorhanden. Bitte prüfen Sie, ob Sie diese Seite wirklich erstellen/bearbeiten möchten.',
+'clearyourcache' => "'''Hinweis:''' Leeren Sie nach dem Speichern den Browser-Cache, um die Änderungen sehen zu können.
 * '''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",
-'usercssyoucanpreview'             => "'''Tipp:''' Benutzen Sie den „{{int:showpreview}}“-Button, um Ihr neues CSS vor dem Speichern zu testen.",
-'userjsyoucanpreview'              => "'''Tipp:''' Benutzen Sie den „{{int:showpreview}}“-Button, um Ihr neues JavaScript vor dem Speichern zu testen.",
-'usercsspreview'                   => "'''Beachten Sie, dass Sie nur eine Vorschau Ihres Benutzer-CSS betrachten.'''
+* '''Opera:''' ''Extras → Internetspuren löschen … → Individuelle Auswahl → Den kompletten Cache löschen''",
+'usercssyoucanpreview' => "'''Tipp:''' Benutzen Sie den „{{int:showpreview}}“-Button, um Ihr neues CSS vor dem Speichern zu testen.",
+'userjsyoucanpreview' => "'''Tipp:''' Benutzen Sie den „{{int:showpreview}}“-Button, um Ihr neues JavaScript vor dem Speichern zu testen.",
+'usercsspreview' => "'''Beachten Sie, dass Sie nur eine Vorschau Ihres Benutzer-CSS betrachten.'''
 '''Es wurde noch nicht gespeichert!'''",
-'userjspreview'                    => "'''Beachten Sie, dass Sie nur eine Vorschau Ihres Benutzer-JavaScript betrachten.'''
+'userjspreview' => "'''Beachten Sie, dass Sie nur eine Vorschau Ihres Benutzer-JavaScript betrachten.'''
 '''Es wurde noch nicht gespeichert!'''",
-'sitecsspreview'                   => "'''Beachten Sie, dass Sie nur eine Vorschau dieses CSS betrachten.'''
+'sitecsspreview' => "'''Beachten Sie, dass Sie nur eine Vorschau dieses CSS betrachten.'''
 '''Es wurde noch nicht gespeichert!'''",
-'sitejspreview'                    => "'''Beachten Sie, dass Sie nur eine Vorschau dieses JavaScript betrachten.'''
+'sitejspreview' => "'''Beachten Sie, dass Sie nur eine Vorschau dieses JavaScript betrachten.'''
 '''Es wurde noch nicht gespeichert!'''",
-'userinvalidcssjstitle'            => "'''Achtung:''' Die Benutzeroberfläche „$1“ existiert nicht. Bedenken Sie, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/vector.css'' an Stelle von ''{{ns:user}}:Mustermann/Vector.css''.",
-'previewconflict'                  => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn Sie jetzt speichern.',
-'session_fail_preview'             => "'''Ihre Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.
+'userinvalidcssjstitle' => "'''Achtung:''' Die Benutzeroberfläche „$1“ existiert nicht. Bedenken Sie, dass benutzerspezifische .css- und .js-Seiten mit einem Kleinbuchstaben anfangen müssen, also beispielsweise ''{{ns:user}}:Mustermann/vector.css'' an Stelle von ''{{ns:user}}:Mustermann/Vector.css''.",
+'previewconflict' => 'Diese Vorschau gibt den Inhalt des oberen Textfeldes wieder. So wird die Seite aussehen, wenn Sie jetzt speichern.',
+'session_fail_preview' => "'''Ihre Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.
 Bitte versuchen Sie es erneut, indem Sie unter der folgenden Textvorschau nochmals auf „Seite speichern“ klicken.
 Sollte das Problem bestehen bleiben, [[Special:UserLogout|melden Sie sich ab]] und danach wieder an.'''",
-'session_fail_preview_html'        => "'''Ihre Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.'''
+'session_fail_preview_html' => "'''Ihre Bearbeitung konnte nicht gespeichert werden, da Sitzungsdaten verloren gegangen sind.'''
 
 ''Da in {{SITENAME}} das Speichern von reinem HTML aktiviert ist, wurde die Vorschau ausgeblendet, um JavaScript-Attacken vorzubeugen.''
 
 '''Bitte versuchen Sie es erneut, indem Sie unter der folgenden Textvorschau nochmals auf „Seite speichern“ klicken.
 Sollte das Problem bestehen bleiben, [[Special:UserLogout|melden Sie sich ab]] und danach wieder an.'''",
-'token_suffix_mismatch'            => "'''Ihre Bearbeitung wurde zurückgewiesen, da Ihr Browser Zeichen im Bearbeiten-Token verstümmelt hat.
+'token_suffix_mismatch' => "'''Ihre Bearbeitung wurde zurückgewiesen, da Ihr Browser Zeichen im Bearbeiten-Token verstümmelt hat.
 Eine Speicherung kann den Seiteninhalt zerstören. Dies geschieht bisweilen durch die Benutzung eines anonymen Proxy-Dienstes, der fehlerhaft arbeitet.'''",
-'edit_form_incomplete'             => "'''Der Inhalt des Bearbeitungsformulars hat den Server nicht vollständig erreicht. Bitte prüfen Sie Ihre Bearbeitungen auf Vollständigkeit und versuchen Sie es erneut.'''",
-'explainconflict'                  => "Jemand anders hat diese Seite geändert, nachdem Sie angefangen haben sie zu bearbeiten.
+'edit_form_incomplete' => "'''Der Inhalt des Bearbeitungsformulars hat den Server nicht vollständig erreicht. Bitte prüfen Sie Ihre Bearbeitungen auf Vollständigkeit und versuchen Sie es erneut.'''",
+'explainconflict' => "Jemand anders hat diese Seite geändert, nachdem Sie angefangen haben, sie zu bearbeiten.
 Das obere Textfeld enthält den aktuellen Bearbeitungsstand der Seite.
 Das untere Textfeld enthält Ihre Änderungen.
 Bitte fügen Sie Ihre Änderungen in das obere Textfeld ein.
 '''Nur''' der Inhalt des oberen Textfeldes wird gespeichert, wenn Sie auf „{{int:savearticle}}“ klicken.",
-'yourtext'                         => 'Ihr Text',
-'nonunicodebrowser'                => "'''Achtung:''' Ihr Browser kann Unicode-Zeichen nicht richtig verarbeiten. Bitte verwenden Sie einen anderen Browser um Seiten zu bearbeiten.",
-'editingold'                       => "'''Achtung: Sie bearbeiten eine alte Version dieser Seite. Sofern Sie sie speichern, werden alle neueren Versionen überschrieben.'''",
-'copyrightwarning'                 => "'''Bitte kopieren Sie keine Webseiten, die nicht Ihre eigenen sind, benutzen Sie keine urheberrechtlich geschützten Werke ohne Erlaubnis des Urhebers!'''<br />
+'yourtext' => 'Ihr Text',
+'nonunicodebrowser' => "'''Achtung:''' Ihr Browser kann Unicode-Zeichen nicht richtig verarbeiten. Bitte verwenden Sie einen anderen Browser um Seiten zu bearbeiten.",
+'editingold' => "'''Achtung: Sie bearbeiten eine alte Version dieser Seite. Sofern Sie sie speichern, werden alle neueren Versionen überschrieben.'''",
+'copyrightwarning' => "'''Bitte kopieren Sie keine Webseiten, die nicht Ihre eigenen sind, benutzen Sie keine urheberrechtlich geschützten Werke ohne Erlaubnis des Urhebers!'''<br />
 Sie geben uns hiermit Ihre Zusage, dass Sie den Text '''selbst verfasst''' haben, dass der Text Allgemeingut '''(public domain)''' ist, oder dass der '''Urheber''' seine '''Zustimmung''' gegeben hat. Falls dieser Text bereits woanders veröffentlicht wurde, weisen Sie bitte auf der Diskussionsseite darauf hin.
-<i>Bitte beachten Sie, dass alle {{SITENAME}}-Beiträge automatisch unter der „$2“ stehen (siehe $1 für Details). Falls Sie nicht möchten, dass Ihre Arbeit hier von anderen verändert und verbreitet wird, dann drücken Sie nicht auf „Seite speichern“.</i>",
-'copyrightwarning2'                => "Bitte beachten Sie, dass alle Beiträge zu {{SITENAME}} von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können.
+<i>Bitte beachten Sie, dass alle {{SITENAME}}-Beiträge automatisch unter der „$2“ stehen (siehe $1 für Einzelheiten). Falls Sie nicht möchten, dass Ihre Arbeit hier von anderen verändert und verbreitet wird, dann klicken Sie nicht auf „Seite speichern“.</i>",
+'copyrightwarning2' => "Bitte beachten Sie, dass alle Beiträge zu {{SITENAME}} von anderen Mitwirkenden bearbeitet, geändert oder gelöscht werden können.
 Reichen Sie keine Texte ein, falls Sie nicht wollen, dass diese ohne Einschränkung geändert werden können.
 
 Sie bestätigen hiermit auch, dass Sie diese Texte selbst geschrieben haben oder diese von einer gemeinfreien Quelle kopiert haben
-(siehe $1 für weitere Details). '''ÜBERTRAGEN SIE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!'''",
-'longpageerror'                    => "'''Fehler: Der Text, den Sie zu speichern versuchen, ist {{PLURAL:$1|ein Kilobyte|$1 Kilobyte}} groß. Dies ist größer als das erlaubte Maximum von {{PLURAL:$2|ein Kilobyte|$2 Kilobyte}}.'''
+(siehe $1 für weitere Einzelheiten). '''ÜBERTRAGEN SIE OHNE GENEHMIGUNG KEINE URHEBERRECHTLICH GESCHÜTZTEN INHALTE!'''",
+'longpageerror' => "'''Fehler: Der Text, den Sie zu speichern versuchen, ist {{PLURAL:$1|ein Kilobyte|$1 Kilobyte}} groß. Dies ist größer als das erlaubte Maximum von {{PLURAL:$2|ein Kilobyte|$2 Kilobyte}}.'''
 Er kann nicht gespeichert werden.",
-'readonlywarning'                  => "'''Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass Ihre Änderungen derzeit nicht gespeichert werden können.
+'readonlywarning' => "'''Achtung: Die Datenbank wurde für Wartungsarbeiten gesperrt, so dass Ihre Änderungen derzeit nicht gespeichert werden können.
 Sichern Sie den Text bitte lokal auf Ihrem Computer und versuchen Sie zu einem späteren Zeitpunkt, die Änderungen zu übertragen.'''
 
 Grund für die Sperre: $1",
-'nocreatetext'                     => 'Auf {{SITENAME}} wurde das Erstellen neuer Seiten eingeschränkt. Sie können bestehende Seiten ändern oder sich [[Special:UserLogin|anmelden]].',
-'nocreate-loggedin'                => 'Sie haben nicht die erforderliche Berechtigung, um neue Seiten erstellen zu können.',
-'permissionserrorstext'            => 'Sie sind nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:',
+'nocreatetext' => 'Auf {{SITENAME}} wurde das Erstellen neuer Seiten eingeschränkt. Sie können bestehende Seiten ändern oder sich [[Special:UserLogin|anmelden]].',
+'nocreate-loggedin' => 'Sie haben nicht die erforderliche Berechtigung, um neue Seiten erstellen zu können.',
+'permissionserrorstext' => 'Sie sind nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:',
 'permissionserrorstext-withaction' => 'Sie sind nicht berechtigt, $2.
 {{PLURAL:$1|Grund|Gründe}}:',
-'recreate-moveddeleted-warn'       => "'''Achtung: Sie erstellen eine Seite, die bereits früher gelöscht wurde.'''
+'recreate-moveddeleted-warn' => "'''Achtung: Sie erstellen eine Seite, die bereits früher gelöscht wurde.'''
 
 Bitte prüfen Sie sorgfältig, ob die erneute Seitenerstellung den Richtlinien entspricht.
 Zu Ihrer Information folgt das Lösch- und Verschiebungs-Logbuch mit der Begründung für die vorhergehende Löschung:",
-'edit-no-change'                   => 'Ihre Bearbeitung wurde ignoriert, da keine Änderung an dem Text vorgenomme wurde.',
+'edit-no-change' => 'Ihre Bearbeitung wurde ignoriert, da keine Änderung an dem Text vorgenomme wurde.',
 
 # "Undo" feature
 'undo-success' => 'Die Bearbeitung kann rückgängig gemacht werden.
-Bitte prüfen Sie den Vergleich unten um sicherzustellen, dass Sie dies tun möchten, und speicheren Sie dann unten Ihre Änderungen, um die Bearbeitung rückgängig zu machen.',
+Bitte prüfen Sie den Vergleich unten, um sicherzustellen, dass Sie dies tun möchten, und speichern Sie dann unten Ihre Änderungen, um die Bearbeitung rückgängig zu machen.',
 
 # Revision feed
 'history-feed-empty' => 'Die angeforderte Seite existiert nicht. Vielleicht wurde sie gelöscht oder verschoben. [[Special:Search|Durchsuchen Sie]] {{SITENAME}} nach passenden neuen Seiten.',
 
 # Revision deletion
-'rev-deleted-text-unhide'     => "Diese Version wurde '''gelöscht'''.
+'rev-deleted-text-unhide' => "Diese Version wurde '''gelöscht'''.
 Nähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].
 Sie können [$1 diese Version einsehen], sofern Sie möchten.",
-'rev-suppressed-text-unhide'  => "Diese Version wurde '''unterdrückt'''.
+'rev-suppressed-text-unhide' => "Diese Version wurde '''unterdrückt'''.
 Nähere Angaben stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unterdrückungs-Logbuch].
 Sie können [$1 diese Version einsehen], sofern Sie möchten.",
-'rev-deleted-text-view'       => "Diese Version wurde '''gelöscht'''.
+'rev-deleted-text-view' => "Diese Version wurde '''gelöscht'''.
 Sie können sie einsehen, sofern Sie möchten. Nähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].",
-'rev-suppressed-text-view'    => "Diese Version wurde '''unterdrückt'''.
+'rev-suppressed-text-view' => "Diese Version wurde '''unterdrückt'''.
 Sie können sie einsehen, sofern Sie möchten. Nähere Angaben stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unterdrückungs-Logbuch].",
-'rev-deleted-no-diff'         => "Sie können diesen Unterschied nicht betrachten, da eine der Versionen '''gelöscht''' wurde.
+'rev-deleted-no-diff' => "Sie können diesen Unterschied nicht betrachten, da eine der Versionen '''gelöscht''' wurde.
 Details stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].",
-'rev-suppressed-no-diff'      => "Sie können diesen Versionsunterschied nicht betrachten, da eine der Versionen '''gelöscht''' wurde.",
-'rev-deleted-unhide-diff'     => "Eine der Versionen dieses Versionsunterschieds wurde '''gelöscht'''.
+'rev-suppressed-no-diff' => "Sie können diesen Versionsunterschied nicht betrachten, da eine der Versionen '''gelöscht''' wurde.",
+'rev-deleted-unhide-diff' => "Eine der Versionen dieses Versionsunterschieds wurde '''gelöscht'''.
 Nähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].
 Sie können [$1 diesen Versionsunterschied einsehen], sofern Sie möchten.",
-'rev-suppressed-unhide-diff'  => "Eine der Versionen dieses Versionsunterschieds wurde '''unterdrückt'''.
+'rev-suppressed-unhide-diff' => "Eine der Versionen dieses Versionsunterschieds wurde '''unterdrückt'''.
 Nähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Unterdrückungs-Logbuch].
 Sie können [$1 diesen Versionsunterschied einsehen], sofern Sie möchten.",
-'rev-deleted-diff-view'       => "Eine Version dieses Versionsunterschieds wurde '''gelöscht'''.
+'rev-deleted-diff-view' => "Eine Version dieses Versionsunterschieds wurde '''gelöscht'''.
 Sie können diesen Versionsunterschied einsehen, sofern Sie möchten. Nähere Angaben stehen im [{{fullurl:{{#special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lösch-Logbuch].",
-'rev-suppressed-diff-view'    => "Eine der Versionen dieses Versionsunterschiedes wurde '''unterdrückt'''.
+'rev-suppressed-diff-view' => "Eine der Versionen dieses Versionsunterschiedes wurde '''unterdrückt'''.
 Sie können diesen Versionsunterschied einsehen, sofern Sie möchten. Nähere Angaben stehen im [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} Unterdrückungs-Logbuch].",
-'revdelete-nooldid-text'      => 'Sie haben entweder keine Version angegeben, auf die diese Aktion ausgeführt werden soll, die gewählte Version ist nicht vorhanden oder Sie versuchen, die aktuelle Version zu entfernen.',
+'revdelete-nooldid-text' => 'Sie haben entweder keine Version angegeben, auf die diese Aktion ausgeführt werden soll, die gewählte Version ist nicht vorhanden oder Sie versuchen, die aktuelle Version zu entfernen.',
 'revdelete-show-file-confirm' => 'Sind Sie sicher, dass Sie die gelöschte Version der Datei „<nowiki>$1</nowiki>“ vom $2 um $3 Uhr ansehen wollen?',
-'revdelete-confirm'           => 'Bitte bestätigen Sie, dass Sie beabsichtigen, dies zu tun, die Konsequenzen verstehen und es in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] tun.',
-'revdelete-show-no-access'    => 'Fehler beim Anzeigen des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als „eingeschränkt“ markiert.
+'revdelete-confirm' => 'Bitte bestätigen Sie, dass Sie beabsichtigen, dies zu tun, die Konsequenzen verstehen und es in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] tun.',
+'revdelete-show-no-access' => 'Fehler beim Anzeigen des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als „eingeschränkt“ markiert.
 Sie haben darauf keinen Zugriff.',
-'revdelete-modify-no-access'  => 'Fehler beim Bearbeiten des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als „eingeschränkt“ markiert.
+'revdelete-modify-no-access' => 'Fehler beim Bearbeiten des Eintrags vom $1, $2 Uhr: Dieser Eintrag wurde als „eingeschränkt“ markiert.
 Sie haben darauf keinen Zugriff.',
 'revdelete-concurrent-change' => 'Fehler beim Bearbeiten des Eintrags vom $1, $2 Uhr: Es scheint, als ob der Status von jemandem geändert wurde, bevor Sie vorhatten, ihn zu bearbeiten.
 Bitte prüfen Sie die Logbücher.',
-'revdelete-only-restricted'   => 'Fehler beim Verstecken des Eintrags vom $1, $2 Uhr: Sie können keinen Eintrag vor Administratoren verstecken, ohne eine der anderen Ansichtsoptionen gewählt zu haben.',
+'revdelete-only-restricted' => 'Fehler beim Verstecken des Eintrags vom $1, $2 Uhr: Sie können keinen Eintrag vor Administratoren verstecken, ohne eine der anderen Ansichtsoptionen gewählt zu haben.',
 
 # History merging
 'mergehistory-header' => 'Mit dieser Spezialseite können Sie die Versionsgeschichte einer Ursprungsseite mit der Versionsgeschichte einer Zielseite vereinen.
 Stellen Sie sicher, dass die Versionsgeschichte einer Seite historisch korrekt ist.',
-'mergehistory-merge'  => 'Die folgenden Versionen von „[[:$1]]“ können nach „[[:$2]]“ übertragen werden. Markieren Sie die Version, bis zu der (einschließlich) die Versionen übertragen werden sollen. Bitte beachten Sie, dass die Nutzung der Navigationslinks die Auswahl zurücksetzt.',
-'mergehistory-fail'   => 'Versionsvereinigung nicht möglich, bitte prüfen Sie die Seite und die Zeitangaben.',
+'mergehistory-merge' => 'Die folgenden Versionen von „[[:$1]]“ können nach „[[:$2]]“ übertragen werden. Markieren Sie die Version, bis zu der (einschließlich) die Versionen übertragen werden sollen. Bitte beachten Sie, dass die Nutzung der Navigationslinks die Auswahl zurücksetzt.',
+'mergehistory-fail' => 'Versionsvereinigung nicht möglich, bitte prüfen Sie die Seite und die Zeitangaben.',
 
 # Search results
-'searchsubtitle'        => 'Ihre Suchanfrage: „[[:$1]]“ ([[Special:Prefixindex/$1|alle mit „$1“ beginnenden Seiten]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Seiten, die nach „$1“ verlinken]])',
+'searchsubtitle' => 'Ihre Suchanfrage: „[[:$1]]“ ([[Special:Prefixindex/$1|alle mit „$1“ beginnenden Seiten]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|alle Seiten, die nach „$1“ verlinken]])',
 'searchsubtitleinvalid' => 'Ihre Suchanfrage: „$1“.',
-'toomanymatches'        => 'Die Anzahl der Suchergebnisse ist zu groß, bitte versuchen Sie eine andere Abfrage.',
-'searchmenu-new'        => "'''Erstellen Sie die Seite „[[:$1]]“ in diesem Wiki.'''",
-'search-suggest'        => 'Meinten Sie „$1“?',
-'nonefound'             => "'''Hinweis:''' Es werden standardmäßig nur einige Namensräume durchsucht. Setzen Sie ''all:'' vor Ihren Suchbegriff, um alle Seiten (inkl. Diskussionsseiten, Vorlagen usw.) zu durchsuchen oder gezielt den Namen des zu durchsuchenden Namensraumes.",
-'search-nonefound'      => 'Für Ihre Suchanfrage wurden keine Ergebnisse gefunden.',
-'searchdisabled'        => 'Die {{SITENAME}} Suche wurde deaktiviert. Sie können unterdessen mit Google suchen. Bitte bedenken Sie, dass der Suchindex von {{SITENAME}} veraltet sein kann.',
+'toomanymatches' => 'Die Anzahl der Suchergebnisse ist zu groß, bitte versuchen Sie eine andere Abfrage.',
+'searchmenu-new' => "'''Erstellen Sie die Seite „[[:$1]]“ in diesem Wiki.'''",
+'search-suggest' => 'Meinten Sie „$1“?',
+'nonefound' => "'''Hinweis:''' Es werden standardmäßig nur einige Namensräume durchsucht. Setzen Sie ''all:'' vor Ihren Suchbegriff, um alle Seiten (inkl. Diskussionsseiten, Vorlagen usw.) zu durchsuchen oder gezielt den Namen des zu durchsuchenden Namensraumes.",
+'search-nonefound' => 'Für Ihre Suchanfrage wurden keine Ergebnisse gefunden.',
+'searchdisabled' => 'Die {{SITENAME}} Suche wurde deaktiviert. Sie können unterdessen mit Google suchen. Bitte bedenken Sie, dass der Suchindex von {{SITENAME}} veraltet sein kann.',
 
 # Preferences page
-'prefsnologintext'           => 'Sie müssen <span class="plainlinks">[{{fullurl:{{#special:UserLogin}}|returnto=$1}} angemeldet]</span> sein, um Ihre Einstellungen ändern zu können.',
+'prefsnologintext' => 'Sie müssen <span class="plainlinks">[{{fullurl:{{#special:UserLogin}}|returnto=$1}} angemeldet]</span> sein, um Ihre Einstellungen ändern zu können.',
 'prefs-help-watchlist-token' => 'Das Ausfüllen dieses Feldes mit einem geheimen Schlüssel generiert einen RSS-Feed für Ihre Beobachtungsliste.
 Jeder, der diesen Schlüssel kennt, kann Ihre Beobachtungsliste einsehen. Wählen Sie also einen sicheren Wert.
 Hier ein zufällig generierter Wert, den Sie verwenden können: $1',
-'savedprefs'                 => 'Ihre Einstellungen wurden gespeichert.',
-'prefs-reset-intro'          => 'Sie können diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.
+'savedprefs' => 'Ihre Einstellungen wurden gespeichert.',
+'prefs-reset-intro' => 'Sie können diese Seite verwenden, um die Einstellungen auf die Standards zurückzusetzen.
 Dies kann nicht mehr rückgängig gemacht werden.',
-'prefs-help-realname'        => 'Optional. Damit kann Ihr bürgerlicher Name Ihren Beiträgen zugeordnet werden.',
-'prefs-help-email'           => 'Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern Sie Ihr Passwort vergessen haben.',
-'prefs-help-email-others'    => 'Mit anderen Benutzern können Sie auch über die Benutzerdiskussionsseiten Kontakt aufnehmen, ohne dass Sie Ihre Identität offenlegen müssen.',
+'prefs-help-realname' => 'Optional. Damit kann Ihr bürgerlicher Name Ihren Beiträgen zugeordnet werden.',
+'prefs-help-email' => 'Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern Sie Ihr Passwort vergessen haben.',
+'prefs-help-email-others' => 'Mit anderen Benutzern können Sie auch über die Benutzerdiskussionsseiten Kontakt aufnehmen, ohne dass Sie Ihre Identität offenlegen müssen.',
 
 # User rights
-'userrights-groups-help'      => 'Sie können die Gruppenzugehörigkeit dieses Benutzer ändern.
+'userrights-groups-help' => 'Sie können die Gruppenzugehörigkeit dieses Benutzers ändern:
 * Ein markiertes Kästchen bedeutet, dass der Benutzer Mitglied dieser Gruppe ist.
+* Ein nichtmarkiertes Kästchen bedeutet, dass der Benutzer nicht Mitglied dieser Gruppe ist.
 * Ein * bedeutet, dass Sie das Benutzerrecht nach Erteilung nicht wieder zurücknehmen können (oder umgekehrt).',
-'userrights-no-interwiki'     => 'Sie haben nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.',
-'userrights-nologin'          => 'Sie müssen sich mit einem Administrator-Benutzerkonto [[Special:UserLogin|anmelden]], um Benutzerrechte zu ändern.',
-'userrights-notallowed'       => 'Sie verfügen nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.',
-'userrights-changeable-col'   => 'Gruppenzugehörigkeit, die Sie ändern dürfen',
+'userrights-no-interwiki' => 'Sie haben nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.',
+'userrights-nologin' => 'Sie müssen sich mit einem Administrator-Benutzerkonto [[Special:UserLogin|anmelden]], um Benutzerrechte zu ändern.',
+'userrights-notallowed' => 'Sie verfügen nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.',
+'userrights-changeable-col' => 'Gruppenzugehörigkeit, die Sie ändern dürfen',
 'userrights-unchangeable-col' => 'Gruppenzugehörigkeit, die Sie nicht ändern dürfen',
 
 # Recent changes
-'recentchangestext'              => "Auf dieser Seite können Sie die letzten Änderungen auf '''{{SITENAME}}''' nachverfolgen.",
+'recentchanges-summary' => "Auf dieser Seite können Sie die letzten Änderungen auf '''{{SITENAME}}''' nachverfolgen.",
 'recentchanges-feed-description' => 'Verfolgen Sie mit diesem Feed die letzten Änderungen in {{SITENAME}}.',
 
 # Recent changes linked
@@ -352,45 +356,44 @@ Dies kann nicht mehr rückgängig gemacht werden.',
 Seiten auf Ihrer [[Special:Watchlist|Beobachtungsliste]] sind '''fett''' dargestellt.",
 
 # Upload
-'uploadnologintext'           => 'Sie müssen [[Special:UserLogin|angemeldet sein]], um Dateien hochladen zu können.',
-'uploadtext'                  => "Benutzen Sie dieses Formular, um neue Dateien hochzuladen.
+'uploadnologintext' => 'Sie müssen [[Special:UserLogin|angemeldet sein]], um Dateien hochladen zu können.',
+'uploadtext' => "Benutzen Sie dieses Formular, um neue Dateien hochzuladen.
 
 Gehen Sie 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, nutzen Sie 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",
-'illegalfilename'             => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benennen Sie die Datei um und versuchen Sie sie erneut hochzuladen.',
-'emptyfile'                   => 'Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrollieren Sie, ob Sie die Datei wirklich hochladen wollen.',
-'fileexists'                  => "Eine Datei mit diesem Namen existiert bereits.
-Wenn Sie auf „Datei speichern“ klicken, wird die Datei überschrieben.
-Bitte prüfen Sie '''<tt>[[:$1]]</tt>''', wenn Sie sich nicht sicher sind.
-[[$1|thumb]]",
-'filepageexists'              => "Eine Beschreibungsseite wurde bereits als '''<tt>[[:$1]]</tt>''' erstellt, es ist aber keine Datei mit diesem Namen vorhanden.
+* '''<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",
+'illegalfilename' => 'Der Dateiname „$1“ enthält mindestens ein nicht erlaubtes Zeichen. Bitte benennen Sie die Datei um und versuchen Sie, sie erneut hochzuladen.',
+'empty-file' => 'Die von Ihnen übertragene Datei hat keinen Inhalt.',
+'emptyfile' => 'Die hochgeladene Datei ist leer. Der Grund kann ein Tippfehler im Dateinamen sein. Bitte kontrollieren Sie, ob Sie die Datei wirklich hochladen wollen.',
+'fileexists' => 'Eine Datei dieses Namens ist bereits vorhanden. Bitte prüfen Sie <strong>[[:$1]]</strong>, sofern Sie sich nicht sicher sind, ob Sie sie ändern möchten.
+[[$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 müssen Sie 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ählen Sie 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üfen Sie 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ählen Sie einen anderen Namen.',
+'fileexists-thumbnail-yes' => "Bei der Datei scheint es sich um ein Bild verringerter Größe ''(Minitatur)'' zu handeln. [[$1|thumb]]
+Bitte prüfen Sie 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 ''(Miniatur)'' hin.
 Bitte prüfen Sie, ob Sie das Bild in voller Auflösung vorliegen haben und laden dieses unter dem Originalnamen hoch.",
-'fileexists-forbidden'        => 'Unter diesem Namen existiert bereits eine Datei und sie kann nicht überschrieben werden. Bitte gehen Sie zurück und laden Sie die Datei unter einem anderen Namen hoch. [[File:$1|thumb|center|$1]]',
+'fileexists-forbidden' => 'Unter diesem Namen existiert bereits eine Datei und sie kann nicht überschrieben werden. Bitte gehen Sie zurück und laden Sie 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.
 Wenn Sie diese Datei trotzdem hochladen möchten, gehen Sie bitte zurück und ändern den Namen.
 [[File:$1|thumb|center|$1]]',
-'file-deleted-duplicate'      => 'Eine mit dieser identische Datei ([[:$1]]) wurde früher gelöscht. Sehen Sie das Lösch-Logbuch ein, bevor Sie sie hochladen.',
-'uploadwarning-text'          => 'Bitte ändern Sie unten die Dateibeschreibung und versuchen Sie es erneut.',
-'uploadfromurl-queued'        => 'Ihr Upload befindet sich nun in der Warteschlange.',
-'php-uploaddisabledtext'      => 'Das Hochladen von Dateien wurde in PHP deaktiviert.
+'file-deleted-duplicate' => 'Eine mit dieser identische Datei ([[:$1]]) wurde früher gelöscht. Sehen Sie das Lösch-Logbuch ein, bevor Sie sie hochladen.',
+'uploadwarning-text' => 'Bitte ändern Sie unten die Dateibeschreibung und versuchen Sie es erneut.',
+'uploadfromurl-queued' => 'Ihr Upload befindet sich nun in der Warteschlange.',
+'php-uploaddisabledtext' => 'Das Hochladen von Dateien wurde in PHP deaktiviert.
 Bitte überprüfen Sie die <code>file_uploads</code>-Einstellung.',
-'filewasdeleted'              => 'Eine Datei mit diesem Namen wurde schon einmal hochgeladen und zwischenzeitlich wieder gelöscht. Bitte prüfen Sie zuerst den Eintrag im $1, bevor Sie die Datei wirklich speichern.',
-'filename-bad-prefix'         => "Der Dateiname beginnt mit '''„$1“'''. Dies ist im allgemeinen der von einer Digitalkamera vorgegebene Dateiname und daher nicht sehr aussagekräftig.
+'filewasdeleted' => 'Eine Datei mit diesem Namen wurde schon einmal hochgeladen und zwischenzeitlich wieder gelöscht. Bitte prüfen Sie zuerst den Eintrag im $1, bevor Sie die Datei wirklich speichern.',
+'filename-bad-prefix' => "Der Dateiname beginnt mit '''„$1“'''. Dies ist im allgemeinen der von einer Digitalkamera vorgegebene Dateiname und daher nicht sehr aussagekräftig.
 Bitte geben Sie der Datei einen Namen, der den Inhalt besser beschreibt.",
 
 'upload-file-error-text' => 'Bei der Erstellung einer temporären Datei auf dem Server ist ein interner Fehler aufgetreten.
@@ -399,26 +402,37 @@ Bitte informieren Sie einen [[Special:ListUsers/sysop|System-Administrator]].',
 Prüfen Sie die URL auf Fehler, den Online-Status der Seite und versuchem Sie erneut.
 Wenn das Problem weiter besteht, informieren Sie einen [[Special:ListUsers/sysop|System-Administrator]].',
 
+# Special:UploadStash
+'uploadstash-badtoken' => 'Das Entfernen der vorab gespeicherten Dateien war erfolglos, vielleicht weil Ihre Sitzungsdaten abgelaufen sind. Bitte versuchen Sie es erneut.',
+
 # img_auth script messages
+'img-auth-nopathinfo' => 'PATH_INFO fehlt.
+Ihr Server ist nicht dafür eingerichtet, diese Information weiterzugeben.
+Sie könnte CGI-gestützt sein und kann daher img_auth nicht ermöglichen.
+Siehe http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-nologinnWL' => 'Sie sind nicht angemeldet und „$1“ ist nicht in der weißen Liste.',
-'img-auth-isdir'      => 'Sie versuchen, auf ein Verzeichnis „$1“ zuzugreifen.
+'img-auth-isdir' => 'Sie versuchen, auf ein Verzeichnis „$1“ zuzugreifen.
 Nur Dateizugriff ist erlaubt.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
-'upload-curl-error6-text'  => 'Die angegebene URL ist nicht erreichbar. Prüfen Sie sowohl die URL auf Fehler als auch den Online-Status der Seite.',
-'upload-curl-error28-text' => 'Die Seite braucht zu lange für eine Antwort. Prüfen Sie, ob die Seite online ist, warten Sie einen kurzen Moment und versuchen es dann erneut. Es kann sinnvoll sein, einen erneuten Versuch zu einem anderen Zeitpunkt zu probieren.',
+'upload-curl-error6-text' => 'Die angegebene URL ist nicht erreichbar. Prüfen Sie sowohl die URL auf Fehler als auch den Online-Status der Seite.',
+'upload-curl-error28-text' => 'Die Seite braucht zu lange, um zu antworten. Prüfen Sie, ob die Seite online ist, warten Sie einen kurzen Moment und versuchen Sie es dann erneut. Es kann sinnvoll sein, es zu einem anderen Zeitpunkt erneut zu versuchen.',
 
 'upload_source_file' => ' (eine Datei auf Ihrem Computer)',
 
 # File description page
-'filehist-help'        => 'Klicken Sie auf einen Zeitpunkt, um diese Version zu laden.',
-'filepage-nofile-link' => 'Es existiert keine Datei mit diesem Namen, aber Sie können [$1 diese Datei hochladen].',
+'filehist-help' => 'Klicken Sie auf einen Zeitpunkt, um diese Version zu laden.',
+'sharedupload-desc-edit' => 'Diese Datei stammt aus $1 und kann auf anderen Projekten verwendet werden.
+Vielleicht möchten Sie die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.',
+'sharedupload-desc-create' => 'Diese Datei stammt aus $1 und kann von anderen Projekten verwendet werden.
+Vielleicht möchten Sie die Beschreibung auf der dortigen [$2 Dateibeschreibungsseite] bearbeiten.',
+'filepage-nofile-link' => 'Es ist keine Datei dieses Namens vorhanden. Sie können jedoch [$1 diese Datei hochladen].',
 
 # File reversion
 'filerevert-intro' => "Sie setzen die Datei '''[[Media:$1|$1]]''' auf die [$4 Version vom $2, $3 Uhr] zurück.",
 
 # File deletion
-'filedelete-intro'     => "Sie löschen die Datei '''„[[Media:$1|$1]]“''' inklusive ihrer Versionsgeschichte.",
+'filedelete-intro' => "Sie löschen die Datei '''„[[Media:$1|$1]]“''' inklusive ihrer Versionsgeschichte.",
 'filedelete-intro-old' => "Sie löschen von der Datei '''„[[Media:$1|$1]]“''' die [$4 Version vom $2, $3 Uhr].",
 
 # Unused templates
@@ -427,7 +441,7 @@ Nur Dateizugriff ist erlaubt.',
 
 # Miscellaneous special pages
 'unusedimagestext' => 'Bitte beachten Sie, dass andere Webseiten eine Datei mit einer direkten URL verlinken können. Sie könnte daher hier aufgelistet sein, obwohl sie in aktiver Verwendung ist.',
-'notargettext'     => 'Sie haben nicht angegeben, auf welche Seite diese Funktion angewendet werden soll.',
+'notargettext' => 'Sie haben nicht angegeben, auf welche Seite diese Funktion angewendet werden soll.',
 
 # Book sources
 'booksources-invalid-isbn' => 'Vermutlich ist die ISBN ungültig.
@@ -435,26 +449,26 @@ Bitte prüfen Sie, ob sie korrekt von der Quelle übertragen wurde.',
 
 # SpecialCachedPage
 'cachedspecial-viewing-cached-ttl' => 'Sie sehen die gecachte Version dieser Seite, die bis zu $1 alt sein kann.',
-'cachedspecial-viewing-cached-ts'  => 'Sie sehen die gecachte Version dieser Seite, die möglicherweise nicht aktuell ist.',
+'cachedspecial-viewing-cached-ts' => 'Sie sehen die gecachte Version dieser Seite, die möglicherweise nicht aktuell ist.',
 
 # E-mail user
 'mailnologintext' => 'Sie müssen [[Special:UserLogin|angemeldet sein]] und eine bestätigte E-Mail-Adresse in Ihren [[Special:Preferences|Einstellungen]] eingetragen haben, um anderen Benutzern E-Mails schicken zu können.',
-'emailpagetext'   => 'Sie könnent dem Benutzer mit dem unten stehenden Formular eine E-Mail senden.
+'emailpagetext' => 'Sie könnent dem Benutzer mit dem unten stehenden Formular eine E-Mail senden.
 Als Absender wird die E-Mail-Adresse aus ihren [[Special:Preferences|Einstellungen]] eingetragen, damit der Benutzer Ihnen antworten kann.',
-'emailccsubject'  => 'Kopie Ihrer Nachricht an $1: $2',
-'emailsenttext'   => 'Ihre E-Mail wurde verschickt.',
+'emailccsubject' => 'Kopie Ihrer Nachricht an $1: $2',
+'emailsenttext' => 'Ihre E-Mail wurde verschickt.',
 
 # Watchlist
-'nowatchlist'       => 'Es befinden sich keine Einträge auf Ihrer Beobachtungsliste.',
+'nowatchlist' => 'Es befinden sich keine Einträge auf Ihrer Beobachtungsliste.',
 'watchlistanontext' => 'Sie müssen sich $1, um Ihre Beobachtungsliste sehen oder Einträge auf ihr bearbeiten zu können.',
-'watchnologin'      => 'Sie sind nicht angemeldet',
-'watchnologintext'  => 'Sie müssen [[Special:UserLogin|angemeldet]] sein, um Ihre Beobachtungsliste bearbeiten zu können.',
-'addedwatchtext'    => 'Die Seite „[[:$1]]“ wurde zu Ihrer [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.
+'watchnologin' => 'Sie sind nicht angemeldet',
+'watchnologintext' => 'Sie müssen [[Special:UserLogin|angemeldet]] sein, um Ihre Beobachtungsliste bearbeiten zu können.',
+'addedwatchtext' => 'Die Seite „[[:$1]]“ wurde zu Ihrer [[Special:Watchlist|Beobachtungsliste]] hinzugefügt.
 
 Spätere Änderungen an dieser Seite und der dazugehörigen Diskussionsseite werden dort gelistet und
 in der Übersicht der [[Special:RecentChanges|letzten Änderungen]] in Fettschrift dargestellt.',
-'removedwatchtext'  => 'Die Seite „[[:$1]]“ wurde von Ihrer [[Special:Watchlist|Beobachtungsliste]] entfernt.',
-'watchnochange'     => 'Keine der von Ihnen beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
+'removedwatchtext' => 'Die Seite „[[:$1]]“ wurde von Ihrer [[Special:Watchlist|Beobachtungsliste]] entfernt.',
+'watchnochange' => 'Keine der von Ihnen beobachteten Seiten wurde während des angezeigten Zeitraums bearbeitet.',
 'watchlist-details' => 'Sie beobachten {{PLURAL:$1|1 Seite|$1 Seiten}}.',
 'watchlistcontains' => 'Ihre Beobachtungsliste enthält $1 {{PLURAL:$1|Seite|Seiten}}.',
 
@@ -486,30 +500,30 @@ Um diese Seite von Ihrer Beobachtungsliste zu entfernen, besuchen Sie $UNWATCHUR
 Rückmeldungen und weitere Hilfe: {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
-'historywarning'    => "'''Achtung:''' Die Seite, die Sie löschen möchten, hat eine Versionsgeschichte mit etwa $1 {{PLURAL:$1|Version|Versionen}}:",
+'historywarning' => "'''Achtung:''' Die Seite, die Sie löschen möchten, hat eine Versionsgeschichte mit etwa $1 {{PLURAL:$1|Version|Versionen}}:",
 'confirmdeletetext' => 'Sie sind dabei, eine Seite mit allen zugehörigen älteren Versionen zu löschen. Bitte bestätigen Sie, dass Sie sich der Konsequenzen bewusst sind, und dass Sie in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]] handeln.',
-'deletedtext'       => '„$1“ wurde gelöscht. Im $2 finden Sie eine Liste der letzten Löschungen.',
+'deletedtext' => '„$1“ wurde gelöscht. Im $2 finden Sie eine Liste der letzten Löschungen.',
 
 # Edit tokens
-'sessionfailure' => 'Es gab ein Problem mit der Übertragung Ihrer Benutzerdaten.
+'sessionfailure' => 'Es gab ein Problem bei der Übertragung Ihrer Benutzerdaten.
 Diese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung Ihrer Änderungen zu einem anderen Benutzer zu verhindern.
-Bitte gehen Sie zurück und versuchen Sie den Vorgang erneut auszuführen.',
+Bitte gehen Sie zurück zur vorherigen Seite, laden Sie sie erneut und versuchen Sie, den Vorgang erneut auszuführen.',
 
 # Protect
-'protect-text'           => 'Hier können Sie den Schutzstatus der Seite „$1“ einsehen und ändern.',
+'protect-text' => 'Hier können Sie den Schutzstatus der Seite „$1“ einsehen und ändern.',
 'protect-locked-blocked' => "Sie können den Seitenschutz nicht ändern, da Ihr Benutzerkonto gesperrt ist. Hier sind die aktuellen Seitenschutz-Einstellungen der Seite '''„$1“:'''",
-'protect-locked-access'  => "Ihr Benutzerkonto verfügt nicht über die notwendigen Rechte zur Änderung des Seitenschutzes. Hier sind die aktuellen Seitenschutzeinstellungen für die Seite '''„$1“:'''",
-'protect-cantedit'       => 'Sie können die Sperre dieser Seite nicht ändern, da Sie keine Berechtigung zum Bearbeiten der Seite haben.',
+'protect-locked-access' => "Ihr Benutzerkonto verfügt nicht über die notwendigen Rechte zur Änderung des Seitenschutzes. Hier sind die aktuellen Seitenschutzeinstellungen für die Seite '''„$1“:'''",
+'protect-cantedit' => 'Sie können die Sperre dieser Seite nicht ändern, da Sie keine Berechtigung zum Bearbeiten der Seite haben.',
 
 # Undelete
-'undeleteextrahelp'          => '* Um die Seite mitsamt aller Versionen wiederherzustellen, wählen Sie keine Version aus, geben eine Begründung an und klicken dann auf „{{int:undeletebtn}}“.
+'undeleteextrahelp' => '* Um die Seite mitsamt aller Versionen wiederherzustellen, wählen Sie keine Version aus, geben eine Begründung an und klicken dann auf „{{int:undeletebtn}}“.
 * Um lediglich bestimmte Versionen der Seite wiederherzustellen, wählen Sie die betreffenden Versionen einzeln aus, geben eine Begründung an und klicken dann auf „{{int:undeletebtn}}“.',
-'undeletehistory'            => 'Wenn Sie diese Seite wiederherstellen, werden auch alle alten Versionen wiederhergestellt.
+'undeletehistory' => 'Wenn Sie diese Seite wiederherstellen, werden auch alle alten Versionen wiederhergestellt.
 Wenn seit der Löschung eine neue Seite gleichen Namens erstellt wurde, werden die wiederhergestellten Versionen chronologisch in die Versionsgeschichte eingeordnet.',
-'undeleterevdel'             => 'Die Wiederherstellung wird nicht durchgeführt, wenn die aktuellste Version versteckt ist oder versteckte Teile enthält.
+'undeleterevdel' => 'Die Wiederherstellung wird nicht durchgeführt, wenn die aktuellste Version versteckt ist oder versteckte Teile enthält.
 In diesem Fall darf die aktuellste Version nicht markiert werden oder ihr Status muss auf den einer normalen Version geändert werden.
 Versionen von Dateien, auf die Sie keinen Zugriff haben, werden nicht wiederhergestellt.',
-'undeletedpage'              => "'''$1''' wurde wiederhergestellt.
+'undeletedpage' => "'''$1''' wurde wiederhergestellt.
 
 Im [[Special:Log/delete|Lösch-Logbuch]] finden Sie eine Übersicht der gelöschten und wiederhergestellten Seiten.",
 'undelete-show-file-confirm' => 'Sind Sie sicher, dass Sie eine gelöschte Version der Datei „<nowiki>$1</nowiki>“ vom $2, $3 Uhr sehen wollen?',
@@ -518,26 +532,26 @@ Im [[Special:Log/delete|Lösch-Logbuch]] finden Sie eine Übersicht der gelösch
 'tooltip-namespace_association' => 'Dieses Auswahlfeld anklicken, um den Ihrer Auswahl zugehörigen Diskussionsnamensraum, oder im umgekehrten Fall, den zugehörigen Namensraum, mit einzubeziehen',
 
 # Block/unblock
-'blockiptext'              => 'Mit diesem Formular sperren Sie eine IP-Adresse oder einen Benutzernamen, so dass von dort keine Änderungen mehr vorgenommen werden können.
+'blockiptext' => 'Mit diesem Formular sperren Sie eine IP-Adresse oder einen Benutzernamen, so dass von dort keine Änderungen mehr vorgenommen werden können.
 Dies sollte nur erfolgen, um Vandalismus zu verhindern und in Übereinstimmung mit den [[{{MediaWiki:Policy-url}}|Richtlinien]].
 Bitte geben Sie den Grund für die Sperre an.',
-'ipb-blockingself'         => 'Sie sind gerade dabei, sich selbst zu sperren! Möchten Sie das wirklich tun?',
-'ipb-confirmhideuser'      => 'Sie sind gerade dabei einen Benutzer im Modus „Benutzer verstecken“ zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchten Sie das wirklich tun?',
-'unblockiptext'            => 'Mit diesem Formular können Sie eine IP-Adresse oder einen Benutzer freigeben.',
-'autoblocker'              => 'Automatische Sperre, da Sie eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzen. Grund der Benutzersperre: „$2“.',
-'ipb-needreblock'          => '„$1“ ist bereits gesperrt. Möchten Sie die Sperrparameter ändern?',
-'proxyblockreason'         => 'Ihre IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktieren Sie Ihren Internet-Provider oder Ihre Systemadministratoren und informieren Sie sie über dieses mögliche Sicherheitsproblem.',
+'ipb-blockingself' => 'Sie sind gerade dabei, sich selbst zu sperren! Möchten Sie das wirklich tun?',
+'ipb-confirmhideuser' => 'Sie sind gerade dabei, einen Benutzer im Modus „Benutzer verstecken“ zu sperren. Dies führt dazu, dass der Benutzername in allen Listen und Logbüchern unterdrückt wird. Möchten Sie das wirklich tun?',
+'unblockiptext' => 'Mit diesem Formular können Sie eine IP-Adresse oder einen Benutzer freigeben.',
+'autoblocker' => 'Automatische Sperre, da Sie eine gemeinsame IP-Adresse mit [[User:$1|$1]] benutzen. Grund der Benutzersperre: „$2“.',
+'ipb-needreblock' => '„$1“ ist bereits gesperrt. Möchten Sie die Sperrparameter ändern?',
+'proxyblockreason' => 'Ihre IP-Adresse wurde gesperrt, da sie ein offener Proxy ist. Bitte kontaktieren Sie Ihren Internet-Provider oder Ihre Systemadministratoren und informieren Sie sie über dieses mögliche Sicherheitsproblem.',
 'cant-block-while-blocked' => 'Sie können keine anderen Benutzer sperren, während Sie selbst gesperrt sind.',
-'cant-see-hidden-user'     => 'Der Benutzer, den Sie versuchen zu sperren, wurde bereits gesperrt und verborgen. Da Sie das „hideuser“-Recht nicht haben, können Sie die Benutzersperre nicht sehen und nicht bearbeiten.',
-'ipbblocked'               => 'Sie können keine anderen Benutzer sperren oder entsperren, da Sie selbst gesperrt sind',
-'ipbnounblockself'         => 'Sie haben nicht die Berechtigung, sich selbst zu entsperren',
+'cant-see-hidden-user' => 'Der Benutzer, den Sie versuchen zu sperren, wurde bereits gesperrt und verborgen. Da Sie das „hideuser“-Recht nicht haben, können Sie die Benutzersperre nicht sehen und nicht bearbeiten.',
+'ipbblocked' => 'Sie können keine anderen Benutzer sperren oder entsperren, da Sie selbst gesperrt sind',
+'ipbnounblockself' => 'Sie haben nicht die Berechtigung, sich selbst zu entsperren',
 
 # Developer tools
-'locknoconfirm'     => 'Sie haben das Bestätigungsfeld nicht markiert.',
+'locknoconfirm' => 'Sie haben das Bestätigungsfeld nicht markiert.',
 'lockdbsuccesstext' => 'Die {{SITENAME}}-Datenbank wurde gesperrt.<br />Bitte geben Sie die Datenbank [[Special:UnlockDB|wieder frei]], sobald die Wartung abgeschlossen ist.',
 
 # Move page
-'movepagetext'                 => "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.
+'movepagetext' => "Mit untenstehendem Formular können Sie eine Seite umbenennen, indem Sie sie mitsamt allen Versionen auf einen neuen Titel verschieben.
 Der alte Titel wird danach zum neuen weiterleiten.
 Sie können Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.
 Stellen Sie sicher, dass Sie im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|kaputten Weiterleitungen]] überprüfen.
@@ -560,26 +574,26 @@ Dies bedeutet, dass Sie die Umbenennung rückgängig machen können, sofern Sie
 '''Warnung!'''
 Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.
 Sie sollten daher die Konsequenzen verstanden haben, bevor Sie jetzt fortfahren.",
-'movepagetalktext'             => "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''
+'movepagetalktext' => "Die dazugehörige Diskussionsseite wird, sofern vorhanden, mitverschoben, '''es sei denn:'''
 *Es existiert bereits eine Diskussionsseite mit diesem Namen, oder
 *Sie wählen die unten stehende Option ab.
 
 In diesen Fällen müssen Sie, falls gewünscht, den Inhalt der Seite von Hand verschieben oder zusammenführen.
 
 Bitte den '''neuen''' Titel unter '''Ziel''' eintragen, darunter die Umbenennung bitte '''begründen.'''",
-'moveuserpage-warning'         => "'''Warnung:''' Sie sind dabei, eine Benutzerseite zu verschieben. Bitte bedenken Sie, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
-'movenologin'                  => 'Sie sind nicht angemeldet',
-'movenologintext'              => 'Sie müssen ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.',
-'movenotallowed'               => 'Sie haben nicht die erforderliche Berechtigung, um Seiten verschieben zu können.',
-'movenotallowedfile'           => 'Sie haben nicht die erforderliche Berechtigung, um Dateien verschieben zu können.',
-'cant-move-user-page'          => 'Sie haben nicht die erforderliche Berechtigung, Benutzerhauptseiten verschieben zu können.',
-'cant-move-to-user-page'       => 'Sie haben nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).',
-'articleexists'                => 'Unter diesem Namen existiert bereits eine Seite. Bitte wählen Sie einen anderen Namen.',
-'talkexists'                   => 'Die Seite selbst wurde erfolgreich verschoben, aber die zugehörige Diskussionsseite nicht, da bereits eine mit dem neuen Titel existiert. Bitte gleichen Sie die Inhalte von Hand ab.',
-'delete_and_move_text'         => '== Löschung erforderlich ==
+'moveuserpage-warning' => "'''Warnung:''' Sie sind dabei, eine Benutzerseite zu verschieben. Bitte bedenken Sie, dass dadurch nur die Benutzerseite verschoben, '''nicht''' aber der Benutzer umbenannt wird.",
+'movenologin' => 'Sie sind nicht angemeldet',
+'movenologintext' => 'Sie müssen ein registrierter Benutzer und [[Special:UserLogin|angemeldet]] sein, um eine Seite zu verschieben.',
+'movenotallowed' => 'Sie haben nicht die erforderliche Berechtigung, um Seiten verschieben zu können.',
+'movenotallowedfile' => 'Sie haben nicht die erforderliche Berechtigung, um Dateien verschieben zu können.',
+'cant-move-user-page' => 'Sie haben nicht die erforderliche Berechtigung, Benutzerhauptseiten verschieben zu können.',
+'cant-move-to-user-page' => 'Sie haben nicht die Berechtigung, Seiten auf eine Benutzerseite zu verschieben (mit Ausnahme von Benutzerunterseiten).',
+'articleexists' => 'Unter diesem Namen existiert bereits eine Seite. Bitte wählen Sie einen anderen Namen.',
+'talkexists' => 'Die Seite selbst wurde erfolgreich verschoben, aber die zugehörige Diskussionsseite nicht, da bereits eine mit dem neuen Titel existiert. Bitte gleichen Sie die Inhalte von Hand ab.',
+'delete_and_move_text' => '== Löschung erforderlich ==
 
 Die Seite „[[:$1]]“ existiert bereits. Möchten Sie diese löschen, um die Seite verschieben zu können?',
-'file-exists-sharedrepo'       => 'Der gewählte Dateiname wird bereits in einem gemeinsam genutzten Repositorium verwendet.
+'file-exists-sharedrepo' => 'Der gewählte Dateiname wird bereits in einem gemeinsam genutzten Repositorium verwendet.
 Bitte wählen Sie einen anderen Namen.',
 
 # Export
@@ -599,20 +613,23 @@ Bitte besuchen Sie die Seiten [//www.mediawiki.org/wiki/Localisation MediaWiki-L
 Die Versionsdaten und Benutzernamen bleiben dabei erhalten.
 Alle Transwiki-Import-Aktionen werden im [[Special:Log/import|Import-Logbuch]] protokolliert.',
 'import-token-mismatch' => 'Verlust der Sessiondaten. Bitte versuchen Sie es erneut.',
-'import-error-edit'     => 'Die Seite „$1“ wurde nicht importiert, da Sie nicht berechtigt sind, sie zu bearbeiten.',
-'import-error-create'   => 'Die Seite „$1“ wurde nicht importiert, da Sie nicht berechtigt sind, sie zu erstellen.',
+'import-error-edit' => 'Die Seite „$1“ wurde nicht importiert, da Sie nicht berechtigt sind, sie zu bearbeiten.',
+'import-error-create' => 'Die Seite „$1“ wurde nicht importiert, da Sie nicht berechtigt sind, sie zu erstellen.',
 
 # JavaScriptTest
+'javascripttest-pagetext-frameworks' => 'Bitte wählen Sie eine der folgenden Prüfumgebungen aus: $1',
 'javascripttest-pagetext-skins' => 'Wählen Sie eine Benutzeroberfläche zur Durchführung der Tests aus:',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'     => 'Ihre Benutzerseite',
+'tooltip-pt-userpage' => 'Ihre Benutzerseite',
 'tooltip-pt-anonuserpage' => 'Benutzerseite der IP-Adresse, von der aus Sie Änderungen durchführen',
-'tooltip-pt-mytalk'       => 'Ihre Diskussionsseite',
-'tooltip-pt-mycontris'    => 'Liste Ihrer Beiträge',
-'tooltip-n-portal'        => 'Über das Projekt, was Sie tun können, wo was zu finden ist',
-'tooltip-watch'           => 'Diese Seite zu Ihrer Beobachtungsliste hinzufügen',
-'tooltip-summary'         => 'Geben Sie eine kurze Zusammenfassung ein.',
+'tooltip-pt-mytalk' => 'Ihre Diskussionsseite',
+'tooltip-pt-mycontris' => 'Liste Ihrer Beiträge',
+'tooltip-n-mainpage' => 'Besuchen Sie die Hauptseite',
+'tooltip-n-mainpage-description' => 'Besuchen Sie die Hauptseite',
+'tooltip-n-portal' => 'Über das Projekt, was Sie tun können, wo was zu finden ist',
+'tooltip-watch' => 'Diese Seite zu Ihrer Beobachtungsliste hinzufügen',
+'tooltip-summary' => 'Geben Sie eine kurze Zusammenfassung ein.',
 
 # Metadata
 'notacceptable' => 'Der Wiki-Server kann die Daten nicht für Ihr Ausgabegerät aufbereiten.',
@@ -629,21 +646,21 @@ Das liegt wahrscheinlich an einem Link auf eine externe Seite.',
 Durch das Herunterladen und Öffnen der Datei kann Ihr Computer beschädigt werden.",
 
 # E-mail address confirmation
-'confirmemail_noemail'    => 'Sie haben keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|persönlichen Einstellungen]] eingetragen.',
-'confirmemail_text'       => '{{SITENAME}} erfordert, dass Sie Ihre E-Mail-Adresse bestätigen (authentifizieren), bevor Sie die erweiterten E-Mail-Funktionen benutzen können. Klicken Sie bitte auf die unten stehende, mit „Bestätigungscode zuschicken“ beschriftete Schaltfläche, damit eine automatisch erstellte E-Mail an die angegebene Adresse geschickt wird. Diese E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem Sie diese Webseite in Ihrem Webbrowser öffnen, bestätigen Sie, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
-'confirmemail_pending'    => 'Es wurde Ihnen bereits ein Bestätigungscode per E-Mail zugeschickt.
+'confirmemail_noemail' => 'Sie haben keine gültige E-Mail-Adresse in Ihren [[Special:Preferences|persönlichen Einstellungen]] eingetragen.',
+'confirmemail_text' => '{{SITENAME}} erfordert, dass Sie Ihre E-Mail-Adresse bestätigen (authentifizieren), bevor Sie die erweiterten E-Mail-Funktionen benutzen können. Klicken Sie bitte auf die unten stehende, mit „Bestätigungscode zuschicken“ beschriftete Schaltfläche, damit eine automatisch erstellte E-Mail an die angegebene Adresse geschickt wird. Diese E-Mail enthält eine Web-Adresse mit einem Bestätigungscode. Indem Sie diese Webseite in Ihrem Webbrowser öffnen, bestätigen Sie, dass die angegebene E-Mail-Adresse korrekt und gültig ist.',
+'confirmemail_pending' => 'Es wurde Ihnen bereits ein Bestätigungscode per E-Mail zugeschickt.
 Wenn Sie Ihr Benutzerkonto erst vor kurzem erstellt haben, warten Sie bitte noch ein paar Minuten auf die E-Mail, bevor Sie einen neuen Code anfordern.',
-'confirmemail_oncreate'   => 'Ein Bestätigungs-Code wurde an Ihre E-Mail-Adresse gesandt. Dieser Code wird für die Anmeldung nicht benötigt, jedoch wird er zur Aktivierung der E-Mail-Funktionen innerhalb des Wikis gebraucht.',
+'confirmemail_oncreate' => 'Ein Bestätigungs-Code wurde an Ihre E-Mail-Adresse gesandt. Dieser Code wird für die Anmeldung nicht benötigt, jedoch wird er zur Aktivierung der E-Mail-Funktionen innerhalb des Wikis gebraucht.',
 'confirmemail_sendfailed' => '{{SITENAME}} konnte die Bestätigungs-E-Mail nicht an Sie versenden.
 Bitte prüfen Sie die E-Mail-Adresse auf ungültige Zeichen.
 
 Rückmeldung des Mailservers: $1',
-'confirmemail_invalid'    => 'Ungültiger Bestätigungscode. Möglicherweise ist der Bestätigungszeitraum verstrichen. Versuchen Sie bitte, die Bestätigung zu wiederholen.',
-'confirmemail_needlogin'  => 'Sie müssen sich $1, um Ihre E-Mail-Adresse zu bestätigen.',
-'confirmemail_success'    => 'Ihre E-Mail-Adresse wurde erfolgreich bestätigt. Sie können sich jetzt [[Special:UserLogin|anmelden]].',
-'confirmemail_loggedin'   => 'Ihre E-Mail-Adresse wurde erfolgreich bestätigt.',
-'confirmemail_error'      => 'Es gab einen Fehler bei der Bestätigung Ihrer E-Mail-Adresse.',
-'confirmemail_body'       => 'Hallo,
+'confirmemail_invalid' => 'Ungültiger Bestätigungscode. Möglicherweise ist der Bestätigungszeitraum verstrichen. Versuchen Sie bitte, die Bestätigung zu wiederholen.',
+'confirmemail_needlogin' => 'Sie müssen sich $1, um Ihre E-Mail-Adresse zu bestätigen.',
+'confirmemail_success' => 'Ihre E-Mail-Adresse wurde erfolgreich bestätigt. Sie können sich jetzt [[Special:UserLogin|anmelden]].',
+'confirmemail_loggedin' => 'Ihre E-Mail-Adresse wurde erfolgreich bestätigt.',
+'confirmemail_error' => 'Es gab einen Fehler bei der Bestätigung Ihrer E-Mail-Adresse.',
+'confirmemail_body' => 'Hallo,
 
 jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst, hat das Benutzerkonto „$2“ in {{SITENAME}} registriert.
 
@@ -659,7 +676,7 @@ Wenn Sie das genannte Benutzerkonto *nicht* registriert haben, folgen Sie diesem
 $5
 
 Dieser Bestätigungscode ist gültig bis $6, $7 Uhr.',
-'confirmemail_body_set'   => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst,
+'confirmemail_body_set' => 'Jemand mit der IP-Adresse $1, wahrscheinlich Sie selbst,
 hat die E-Mail-Adresse des Benutzerkontos „$2“ auf {{SITENAME}} zu dieser E-Mail-Adresse abgeändert.
 
 Um zu bestätigen, dass dieses Benutzerkonto wirklich zu Ihnen gehört
@@ -678,35 +695,39 @@ Dieser Bestätigungscode ist gültig bis $4.',
 'deletedwhileediting' => 'Achtung: Diese Seite wurde gelöscht, nachdem Sie angefangen haben sie zu bearbeiten!
 Im [{{fullurl:{{#special:Log}}|type=delete&page={{FULLPAGENAMEE}}}} Lösch-Logbuch] finden Sie den Grund für die Löschung.
 Wenn Sie die Seite speichern, wird sie neu angelegt.',
-'confirmrecreate'     => "Benutzer [[User:$1|$1]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem Sie angefangen haben, sie zu bearbeiten. Die Begründung lautete:
+'confirmrecreate' => "Benutzer [[User:$1|$1]] ([[User talk:$1|Diskussion]]) hat diese Seite gelöscht, nachdem Sie angefangen haben, sie zu bearbeiten. Die Begründung lautete:
 : ''$2''
 Bitte bestätigen Sie, dass Sie diese Seite wirklich neu erstellen möchten.",
 
+# Live preview
+'livepreview-failed' => 'Die Vorschau kann nicht sofort angezeigt werden!
+Bitte nutzen Sie die reguläre Vorschau.',
+
 # Watchlist editor
-'watchlistedit-numitems'       => 'Ihre Beobachtungsliste enthält {{PLURAL:$1|einen Eintrag|$1 Einträge}}. Die Diskussionsseiten wurden dabei nicht mitgezählt.',
-'watchlistedit-noitems'        => 'Ihre Beobachtungsliste ist leer.',
+'watchlistedit-numitems' => 'Ihre Beobachtungsliste enthält {{PLURAL:$1|einen Eintrag|$1 Einträge}}. Die Diskussionsseiten wurden dabei nicht mitgezählt.',
+'watchlistedit-noitems' => 'Ihre Beobachtungsliste ist leer.',
 'watchlistedit-normal-explain' => 'Dies sind die Einträge Ihrer Beobachtungsliste. Um Einträge zu entfernen, markieren Sie die Kästchen neben den Einträgen und klicken Sie am Ende der Seite auf „{{int:Watchlistedit-normal-submit}}“. Sie können Ihre Beobachtungsliste auch im [[Special:EditWatchlist/raw|Listenformat bearbeiten]].',
-'watchlistedit-normal-done'    => '{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} von Ihrer Beobachtungsliste entfernt:',
-'watchlistedit-raw-explain'    => 'Dies sind die Einträge Ihrer Beobachtungsliste im Listenformat. Die Einträge können zeilenweise gelöscht oder hinzugefügt werden.
+'watchlistedit-normal-done' => '{{PLURAL:$1|Ein Eintrag wurde|$1 Einträge wurden}} von Ihrer Beobachtungsliste entfernt:',
+'watchlistedit-raw-explain' => 'Dies sind die Einträge Ihrer Beobachtungsliste im Listenformat. Die Einträge können zeilenweise gelöscht oder hinzugefügt werden.
 Pro Zeile ist ein Eintrag erlaubt.
 Sobald Sie fertig sind, klicken Sie auf „{{int:Watchlistedit-raw-submit}}“.
 Sie können auch die [[Special:EditWatchlist|Standardseite]] zum Bearbeiten benutzen.',
-'watchlistedit-raw-done'       => 'Ihre Beobachtungsliste wurde gespeichert.',
+'watchlistedit-raw-done' => 'Ihre Beobachtungsliste wurde gespeichert.',
 
 # Database error messages
-'dberr-again'     => 'Warten Sie einige Minuten und versuchen Sie dann neu zuladen.',
+'dberr-again' => 'Warten Sie einige Minuten und versuchen Sie dann neu zuladen.',
 'dberr-usegoogle' => 'Sie könnten in der Zwischenzeit mit Google suchen.',
 'dberr-outofdate' => 'Beachten Sie, dass der Suchindex unserer Inhalte bei Google veraltet sein kann.',
 
 # Feedback
 'feedback-bugornote' => 'Sofern Sie detailliert ein technisches Problem beschreiben möchten, melden Sie bitte [$1 einen Fehler].
 Anderenfalls können Sie auch das untenstehende einfache Formular nutzen. Ihr Kommentar wird, zusammen mit Ihrem Benutzernamen und der Version des von Ihnen verwendeten Webbrowsers sowie Betriebssystems, auf der Seite „[$3 $2]“ hinzugefügt.',
-'feedback-thanks'    => 'Vielen Dank. Ihre Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert.',
-'feedback-bugcheck'  => 'Super! Bitte überprüfen Sie noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.',
+'feedback-thanks' => 'Vielen Dank. Ihre Rückmeldung wurde auf der Seite „[$2 $1]“ gespeichert.',
+'feedback-bugcheck' => 'Super! Bitte überprüfen Sie noch, ob es sich hierbei nicht um einen bereits [$1 bekannten Fehler] handelt.',
 
 # API errors
 'api-error-badaccess-groups' => 'Sie haben nicht die Berechtigung Dateien in dieses Wiki hochzuladen.',
-'api-error-hookaborted'      => 'Die von Ihnen vorgesehene Anpassung kann nicht durchgeführt werden (Unterbrechung durch eine Programmschnittstelle).',
-'api-error-mustbeloggedin'   => 'Um Dateien hochladen zu können, müssen Sie angemeldet sein.',
+'api-error-hookaborted' => 'Die von Ihnen vorgesehene Anpassung kann nicht durchgeführt werden (Unterbrechung durch eine Programmschnittstelle).',
+'api-error-mustbeloggedin' => 'Um Dateien hochladen zu können, müssen Sie angemeldet sein.',
 
 );
index df1f9af..e3e8b13 100644 (file)
@@ -14,6 +14,7 @@
  * @author George Animal
  * @author Kaganer
  * @author Mirzali
+ * @author Olvörg
  * @author Reedy
  * @author Sahim
  * @author Xoser
@@ -62,21 +63,21 @@ $specialPageAliases = array(
        'ChangePassword'            => array( 'ParolaBıvurnê', 'ParolaResetke' ),
        'ComparePages'              => array( 'PelaPêverke' ),
        'Confirmemail'              => array( 'EpostayAraştke' ),
-       'Contributions'             => array( 'İştiraxi' ),
+       'Contributions'             => array( 'İştiraqi' ),
        'CreateAccount'             => array( 'HesabVırazê' ),
-       'Deadendpages'              => array( 'PelaBêgıre' ),
-       'DeletedContributions'      => array( 'İştıraxêkeBesterneyayê' ),
+       'Deadendpages'              => array( 'PelaBıgirê' ),
+       'DeletedContributions'      => array( 'İştıraqêkeBesterneyayê' ),
        'Disambiguations'           => array( 'ManeoBin' ),
        'DoubleRedirects'           => array( 'DıletHeteneayış' ),
-       'EditWatchlist'             => array( 'ListeyaSeyriVurnayış' ),
+       'EditWatchlist'             => array( 'ListeyaTemaşiVurnayış' ),
        'Emailuser'                 => array( 'EpostayaKarberi' ),
        'Export'                    => array( 'Ateberde' ),
        'Fewestrevisions'           => array( 'TewrtaynRevizyon' ),
        'FileDuplicateSearch'       => array( 'KopyaydosyaCıgeyrayış', 'DıletdosyaCıgeyrayış' ),
        'Filepath'                  => array( 'RayaDosya', 'HerunaDosya', 'CayêDosya' ),
        'Import'                    => array( 'Azeredê', 'Atewrke' ),
-       'Invalidateemail'           => array( 'TesdiqêepostaBıterknê' ),
-       'BlockList'                 => array( 'ListeyêBLoki', 'IPBloki', 'Blokeyê_IP' ),
+       'Invalidateemail'           => array( 'EpostaAraştkerdışiBıterknê' ),
+       'BlockList'                 => array( 'ListeyêBloki', 'IPBloki', 'Blokeyê_IP' ),
        'LinkSearch'                => array( 'GreCıgeyrayış' ),
        'Listadmins'                => array( 'ListeyêXizmetkaran' ),
        'Listbots'                  => array( 'ListeyêBotan' ),
@@ -96,15 +97,15 @@ $specialPageAliases = array(
        'Mostlinkedcategories'      => array( 'KategoriyêkeCırêvêşiGreDeyayo' ),
        'Mostlinkedtemplates'       => array( 'ŞablonêkeCırêvêşiGreDeyayo' ),
        'Mostrevisions'             => array( 'TewrvêşiRevizyon' ),
-       'Movepage'                  => array( 'PelaAhuln' ),
-       'Mycontributions'           => array( 'İştırakeMe' ),
+       'Movepage'                  => array( 'PelaAhulne' ),
+       'Mycontributions'           => array( 'İştıraqeMe' ),
        'Mypage'                    => array( 'PelaMe' ),
-       'Mytalk'                    => array( 'PersiyeME' ),
+       'Mytalk'                    => array( 'PersiyeMe' ),
        'Myuploads'                 => array( 'BarkerdışeMe' ),
        'Newimages'                 => array( 'DosyeyêNewey', 'ResimêNewey' ),
        'Newpages'                  => array( 'PeleyeNewey' ),
-       'PasswordReset'             => array( 'ParolaReset' ),
-       'PermanentLink'             => array( 'DaimiGre' ),
+       'PasswordReset'             => array( 'ParolaResetkerdış' ),
+       'PermanentLink'             => array( 'GreyoDaimi' ),
        'Popularpages'              => array( 'PeleyêPopuleri' ),
        'Preferences'               => array( 'Tercihi' ),
        'Prefixindex'               => array( 'SerVerole' ),
@@ -115,13 +116,12 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'VurnayışêPeyêni' ),
        'Recentchangeslinked'       => array( 'GreyêVurnayışêPeyêni' ),
        'Revisiondelete'            => array( 'RevizyoniBesterne' ),
-       'RevisionMove'              => array( 'RewizyoniAhulne' ),
        'Search'                    => array( 'Cıgeyre' ),
        'Shortpages'                => array( 'PeleyêKılmi' ),
        'Specialpages'              => array( 'PeleyXısusi' ),
        'Statistics'                => array( 'İstatistiki' ),
        'Tags'                      => array( 'Etiketi' ),
-       'Unblock'                   => array( 'Bloqiwedarne' ),
+       'Unblock'                   => array( 'BloqiWedarne' ),
        'Uncategorizedcategories'   => array( 'KategoriyêkeKategorinêbiyê' ),
        'Uncategorizedimages'       => array( 'DosyeyêkeKategorinêbiyê' ),
        'Uncategorizedpages'        => array( 'PeleyêkeKategorinêbiyê' ),
@@ -154,7 +154,6 @@ $magicWords = array(
        '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' ),
@@ -306,42 +305,42 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Bınê gırey de xete bance:',
+'tog-underline' => 'Bınê gırey de xete bıance:',
 'tog-justify' => 'Paragrafan eyar ke',
 'tog-hideminor' => 'Vurnayışanê şenıkan pela vurnayışanê peyênan de bınımne',
 'tog-hidepatrolled' => 'Vurnayışanê qontrolkerdeyan pela vurnayışê peyêni de bınımne',
 'tog-newpageshidepatrolled' => 'Pelanê qontrolkerdeyan lista pelanê neweyan de bınımne',
 'tog-extendwatchlist' => 'Lista seyrkerdışi hera bıke ke vurnayışi pêro bıasê, tenya tewr peyêni nê',
-'tog-usenewrc' => 'Vurnayışanê peyênanê herakerdeyan bıxebetne (JavaScript lazımo)',
+'tog-usenewrc' => 'Pele be vurnayışanê grube de vurnayışê peyêni u lista seyrkerdışi (JavaScript lazımo)',
 'tog-numberheadings' => 'Sernuşteyan be xo numre cı şane',
 'tog-showtoolbar' => 'Goceganê hacetanê vurnayışi bımocne (JavaScript lazımo)',
 'tog-editondblclick' => 'Pê dı rey tıknayış pele sero bıxebetiye (JavaScript lazımo)',
 'tog-editsection' => 'Vurnayışê qısımi be gıreyanê [bıvurne] ra feal ke',
 '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-rememberpassword' => 'Parola mı nê cıgeyrayoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}}).',
 '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-watchdeletion' => 'Pel u dosyeyê ke mı esterı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-nocache' => 'Pelanê cıgeyrayoği meya xo viri',
 '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ê pelan u dosyeyan de zi mı rê e-poste bırışe',
 'tog-enotifrevealaddr' => 'Adresa e-posteyê mı posteyê xeberan de bımocne',
 'tog-shownumberswatching' => 'Amarê karberanê seyrkerdoğan bımocne',
-'tog-oldsig' => 'İmzaya şıma:',
-'tog-fancysig' => 'İmza rê mameley wikimeqaley bıke (bê gıreyo otomatik)',
+'tog-oldsig' => 'İmzaya mewcude:',
+'tog-fancysig' => 'İmza rê mameleyê wikimeqaley bıke (bê gıreyo otomatik)',
 'tog-externaleditor' => 'Editorê teberi standard bıxebetne (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
 'tog-externaldiff' => 'Têverşanayışan pê programê teberi vıraze (tenya seba ekspertano, komputerê şıma de eyarê xısusiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato vêşêr.])',
-'tog-showjumplinks' => 'Gırey "şo"y feal ke',
+'tog-showjumplinks' => 'Gıreyê "şo"y aktif ke',
 'tog-uselivepreview' => 'Verqayto cınde bıxebetne (JavaScript lazımo) (hewna cerrebnayış dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
 'tog-watchlisthideown' => 'Vurnayışanê mı lista mına seyrkerdışi de bınımne',
-'tog-watchlisthidebots' => 'Vurnayışanê bota liste da seyrkerdışi de bınımne',
+'tog-watchlisthidebots' => 'Lista seyrkerdışi ra vurnayışanê boti bınımne',
 'tog-watchlisthideminor' => 'Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne',
 'tog-watchlisthideliu' => 'Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne',
 'tog-watchlisthideanons' => 'Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne',
@@ -354,26 +353,26 @@ $messages = array(
 
 'underline-always' => 'Tım',
 'underline-never' => 'Qet',
-'underline-default' => 'Qerar cıgeyraoği dest dero',
+'underline-default' => 'Cild ya zi cıgeyrayoğo hesıbyaye',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Cayê vurnayışi de tipê nuştış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',
+'editfont-style' => 'Cayê vurnayışi de terzê nuştışi:',
+'editfont-default' => 'Cıgeyrayoğo hesabiyaye',
+'editfont-monospace' => 'Terzê nusteyê sabıtcagırewtoği',
+'editfont-sansserif' => 'Babetê Sans-serifi',
+'editfont-serif' => 'Babetê serifi',
 
 # Dates
 'sunday' => 'Kırê',
 'monday' => 'Dışeme',
 'tuesday' => 'Sêşeme',
-'wednesday' => 'Çarşeme',
+'wednesday' => 'Çeharşeme',
 'thursday' => 'Pancşeme',
 'friday' => 'Êne',
 'saturday' => 'Şeme',
 'sun' => 'Krê',
-'mon' => 'Dşm',
-'tue' => 'Sşm',
+'mon' => 'Dış',
+'tue' => 'Sêş',
 'wed' => 'Çrş',
 'thu' => 'Pşm',
 'fri' => 'Êne',
@@ -390,18 +389,18 @@ $messages = array(
 'october' => 'Tışrino Verên',
 'november' => 'Tışrino Peyên',
 'december' => 'Kanun',
-'january-gen' => 'Çeley',
+'january-gen' => 'Çele',
 'february-gen' => 'Şıbate',
-'march-gen' => 'Adari',
+'march-gen' => 'Adar',
 'april-gen' => 'Nisane',
 'may-gen' => 'Gulane',
-'june-gen' => 'Hezirani',
+'june-gen' => 'Heziran',
 'july-gen' => 'Temuze',
 'august-gen' => 'Tebaxe',
-'september-gen' => 'Keşkeluni',
-'october-gen' => 'Tışrinê Verêni',
-'november-gen' => 'Tışrinê Peyêni',
-'december-gen' => 'Kanuni',
+'september-gen' => 'Keşkelun',
+'october-gen' => 'Tışrino Verên',
+'november-gen' => 'Tışrino Peyên',
+'december-gen' => 'Kanun',
 'jan' => 'Çel',
 'feb' => 'Şbt',
 'mar' => 'Adr',
@@ -419,7 +418,7 @@ $messages = array(
 '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',
+'category-media-header' => 'Dosyeyê ke kategoriya da "$1" deyê',
 'category-empty' => "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
 'hidden-categories' => '{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}',
 'hidden-category-category' => 'Kategoriyê nımıtey',
@@ -427,25 +426,26 @@ $messages = array(
 'category-subcat-count-limited' => 'Na kategoriye de {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê}}.',
 'category-article-count' => '{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Na kategoriye de $2 ra pêro pia, {{PLURAL:$1|ena pele esta|enê $1 peli estê.}}, be $2 ra pêro pia}}',
 'category-article-count-limited' => '{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.',
-'category-file-count' => '{{PLURAL:$2|Na kategoriye de tenya dosya cêrêne esta.|Teberê $2 ra pêro, {{PLURAL:$1|dosya cêrêne|$1 dosyê cêrêni}} na kategoriye derê.}}',
+'category-file-count' => '<noinclude>{{PLURAL:$2|Na kategoriye tenya dosyayanê cêrênan muhtewa kena.}}</noinclude>
+*Na kategoriye de $2 dosyayan ra {{PLURAL:$1|yew dosya tenêka esta| $1 dosyey asenê}}.',
 'category-file-count-limited' => '{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.',
-'listingcontinuesabbrev' => 'dewam',
+'listingcontinuesabbrev' => '(dewam)',
 'index-category' => 'Pelê endeksıni',
-'noindex-category' => 'Pelê ke endeksıni niyê',
+'noindex-category' => 'Perê ke ratnena cı çinıya',
 'broken-file-category' => 'Peleye ke linkê Dosyayandê xelata muhtewa kenê',
 'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'linkprefix' => "'''MediaWiki niya ro.'''",
 
-'about' => 'Heqa',
+'about' => 'Heqa cı de',
 'article' => 'Wesiqe',
-'newwindow' => '(zerreyê teqeyê newey de beno a)',
+'newwindow' => '(pençereyê newey de beno a)',
 'cancel' => 'Bıtexelne',
-'moredotdotdot' => 'Vêşêri...',
-'mypage' => 'Pela mı',
-'mytalk' => 'Verênayışê mı',
+'moredotdotdot' => 'Vêşi...',
+'mypage' => 'Per',
+'mytalk' => 'Werênayış',
 'anontalk' => 'Pela werênayışê nê IPy',
-'navigation' => 'Pusula',
+'navigation' => 'Geyrayış',
 'and' => '&#32;u',
 
 # Cologne Blue skin
@@ -453,9 +453,8 @@ $messages = array(
 'qbbrowse' => 'Rovete',
 'qbedit' => 'Bıvurne',
 'qbpageoptions' => 'Ena pele',
-'qbpageinfo' => 'Gıre',
 'qbmyoptions' => 'Pelê mı',
-'qbspecialpages' => 'Peley xısusi',
+'qbspecialpages' => 'Pelê xısusiy',
 'faq' => 'PZP (Persê ke zehf persiyenê)',
 'faqpage' => 'Project: PZP',
 
@@ -466,16 +465,17 @@ $messages = array(
 'vector-action-protect' => 'Bıpawe',
 'vector-action-undelete' => 'Esterıtışi peyser bıgê',
 'vector-action-unprotect' => 'Starkerdışi bıvurne',
-'vector-simplesearch-preference' => 'Tewsiyanê cıgeyrayışê raverberdan ake (Tenya vector skin de)',
+'vector-simplesearch-preference' => 'Çuweya cı geyreyış de rehater aktiv ke (Tenya vector skin de)',
 'vector-view-create' => 'Vıraze',
 'vector-view-edit' => 'Bıvurne',
 'vector-view-history' => 'Vurnayışê verêni',
-'vector-view-view' => 'Bıwanê',
+'vector-view-view' => 'Bıwane',
 'vector-view-viewsource' => 'Çımey bıvêne',
-'actions' => 'Kerdeni',
-'namespaces' => 'Cayê namey',
+'actions' => 'Kerdışi',
+'namespaces' => 'Cayê namam',
 'variants' => 'Varyanti',
 
+'navigation-heading' => 'Menuya Navigasyoni',
 'errorpagetitle' => 'Xırab',
 'returnto' => 'Peyser şo $1.',
 'tagline' => '{{SITENAME}} ra',
@@ -484,19 +484,19 @@ $messages = array(
 'searchbutton' => 'Cı geyre',
 'go' => 'Şo',
 'searcharticle' => 'Şo',
-'history' => 'Ravêrdena pela',
-'history_short' => 'Ravêrden',
+'history' => 'Verora perer',
+'history_short' => 'Vurnayışê verêni',
 'updatedmarker' => 'cıkewtena mına peyêne ra dıme biyo rocane',
-'printableversion' => 'Asayışo çapkerden',
-'permalink' => 'Gıreyo daimi',
-'print' => 'Çap ke',
+'printableversion' => 'Asayışê çapkerdışi',
+'permalink' => 'Gıreyo jûqere',
+'print' => 'Nusten ke',
 'view' => 'Bıvin',
 'edit' => 'Bıvurnên',
 'create' => 'Vıraze',
 'editthispage' => 'Ena pele bıvurne',
 'create-this-page' => 'Na pele bınuse',
 'delete' => 'Besterne',
-'deletethispage' => 'Ena pele bestere',
+'deletethispage' => 'Ena perer besternê',
 'undelete_short' => '{{PLURAL:$1|Yew vurnayışi|$1 Vurnayışan}} mestere',
 'viewdeleted_short' => '{{PLURAL:$1|Yew vurnayışo esterıte|$1 Vurnayışanê esterıtan}} bımocne',
 'protect' => 'Bıpawe',
@@ -504,11 +504,11 @@ $messages = array(
 'protectthispage' => 'Ena pele bıpawe',
 'unprotect' => 'Starkerdışi bıvurne',
 'unprotectthispage' => 'Starkerdışe ena peler bıvurne',
-'newpage' => 'Pela newi',
+'newpage' => 'Pera newiye',
 'talkpage' => 'Ena pele sero werêne',
 'talkpagelinktext' => 'Mesac',
 'specialpage' => 'Pela xısusiye',
-'personaltools' => 'Haletê şexsi',
+'personaltools' => 'Hacetê şexsiy',
 'postcomment' => 'Qısımo newe',
 'articlepage' => 'Pela zerreki bıvêne',
 'talk' => 'Werênayış',
@@ -528,8 +528,8 @@ $messages = array(
 'lastmodifiedat' => 'Ena pele tewr peyên roca $2, $1 de biya rocaniye.',
 'viewcount' => 'Ena pele {{PLURAL:$1|rae|$1 rey}} vêniya.',
 'protectedpage' => 'Pela pawıtiye',
-'jumpto' => 'Şo be:',
-'jumptonavigation' => 'pusula',
+'jumpto' => 'Şo:',
+'jumptonavigation' => 'karfiyê',
 'jumptosearch' => 'cı geyre',
 'view-pool-error' => 'Qaytê qısuri mekerên, serverê ma enıka zêde bar gırewto xo ser.
 Hedê xo ra zêde karberi kenê ke seyrê na pele bıkerê.
@@ -541,7 +541,7 @@ $1',
 'pool-errorunknown' => 'Xeta nêzanıtiye',
 
 # 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',
+'aboutsite' => 'Heqa {{SITENAME}}i de',
 'aboutpage' => 'Project:Heqdê cı',
 'copyright' => 'Zerrek bınê $1 dero.',
 'copyrightpage' => '{{ns:project}}:Heqa telifi',
@@ -552,12 +552,12 @@ $1',
 'edithelp' => 'Peştdariya vurnayışi',
 'edithelppage' => 'Help:Vurnayış',
 'helppage' => 'Help:Estêni',
-'mainpage' => 'Pela Seri',
+'mainpage' => 'Pera Seri',
 'mainpage-description' => 'Pela Seri',
 'policy-url' => 'Project:Terzê hereketi',
 'portal' => 'Portalê cemaeti',
 'portal-url' => 'Project:Portalê cemaeti',
-'privacy' => 'Madeyê dızdine',
+'privacy' => 'Madeyê dızdiye',
 'privacypage' => 'Project:Xısusiyetê nımtışi',
 
 'badaccess' => 'Xeta mısadey',
@@ -573,8 +573,8 @@ $1',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'backlinksubtitle' => '← $1',
 'retrievedfrom' => '"$1" ra ard',
-'youhavenewmessages' => 'To rê estê $1 ($2).',
-'newmessageslink' => 'mesacê newey',
+'youhavenewmessages' => 'To rê $1 esto ($2).',
+'newmessageslink' => 'mesacê şıma',
 '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ê.',
@@ -584,10 +584,10 @@ $1',
 'editsection' => 'bıvurne',
 'editsection-brackets' => '[$1]',
 'editold' => 'bıvurne',
-'viewsourceold' => 'çımey bıvêne',
+'viewsourceold' => 'çımey cı bıvinê',
 'editlink' => 'bıvurne',
 'viewsourcelink' => 'çımey bıvêne',
-'editsectionhint' => 'Qısımi bıvurne: $1',
+'editsectionhint' => 'Leteyo ke bıvuriyo: $1',
 'toc' => 'Sernameyê meselan',
 'showtoc' => 'bımocne',
 'hidetoc' => 'bınımne',
@@ -605,16 +605,16 @@ $1',
 'page-atom-feed' => '"$1" Cıresnayışê atomi',
 'feed-atom' => 'Atom',
 'feed-rss' => 'RSS',
-'red-link-title' => '$1 (pele çıniya)',
+'red-link-title' => '$1 (çınîya)',
 'sort-descending' => 'Ratnayışê qemeyayışi',
 'sort-ascending' => 'Ratnayışê Zeydnayışi',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Per',
-'nstab-user' => 'Pela Karberi',
+'nstab-main' => 'Pele',
+'nstab-user' => 'Pera Karberi',
 'nstab-media' => 'Pela Medya',
 'nstab-special' => 'Pela xısusiye',
-'nstab-project' => 'Pela Procey',
+'nstab-project' => 'Pera proci',
 'nstab-image' => 'Dosya',
 'nstab-mediawiki' => 'Mesac',
 'nstab-template' => 'Şablon',
@@ -654,7 +654,7 @@ Ena belki seba yew vurnayışo kıhan ya zi tarixê gırê yew pele esteriya.
 
 Eke wına niyo, belki ''software''i de yew xeta esta.
 Kerem kerê, naye be namey ''URL''i yew [[Special:ListUsers/sysop|karber]]i ra vacê.",
-'missingarticle-rev' => '(tekrar diyayış#: $1)',
+'missingarticle-rev' => '(rewizyon#: $1)',
 'missingarticle-diff' => '(Ferq: $1, $2)',
 'readonly_lag' => 'Daegeh (database) otomatikmen kılit bi, sureo ke  daegehê bınêni resay daegehê serêni.',
 'internalerror' => 'Xeta zerreki',
@@ -689,7 +689,7 @@ Perse: $2',
 'actionthrottled' => 'Kerden peysnaya',
 'actionthrottledtext' => 'Riyê tedbirê anti-spami ra,  wextê do kılmek de şıma nê fealiyeti nêşkenê zaf zêde bıkerê, şıma ki no hedi viyarna ra.
 Çend deqey ra tepeya reyna bıcerrebnên.',
-'protectedpagetext' => 'No pel qey nêvuriyayiş hao (nao) pawyeno.',
+'protectedpagetext' => 'Na per qey nêvuriyayiş ho pawyeno ya zi kerdışe bini.',
 'viewsourcetext' => 'To şikinay çımey na pele bıvêne u kopya kerê:',
 'viewyourtext' => "Na pela '''Vurnayışê ke kerdê''' re şıma şenê kopya kerê:",
 'protectedinterface' => 'Na pela qandê nusnerin destegê verri dana u kes xırabin nêqero deye kerda kılit.',
@@ -702,7 +702,7 @@ $2',
 'namespaceprotected' => "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
 'customcssprotected' => 'Mısadeyê şıma çıniyo ke na pela CSSi bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
 'customjsprotected' => 'Mısadeyê şıma çıniyo ke na pela Java Scripti bıvurnên, çıke na pela xısusiye eyaranê karberan muhtewa kena.',
-'ns-specialprotected' => 'Peley xısusi nênê vurnayış.',
+'ns-specialprotected' => 'Pelê xısusiy nênê vurnayış.',
 'titleprotected' => 'Eno [[User:$1|$1]] zerreyê ena peli nişeno vuriye.
 Sebeb: "\'\'$2\'\'".',
 'filereadonlyerror' => 'Dosyay vurnayışê "$1" nê abê no lakin depoy dosya da "$2" mod dê  salt wendi deyo.
@@ -721,31 +721,30 @@ Xızmetkarê  kılitkerdışi wa bewni ro enay wa çımra ravyarno: "$3".',
 # Login and logout pages
 'logouttext' => "'''Şıma hesab qefelna.'''
 
-Nıka kamiyê xo eşkera mekere u siteyê {{SITENAME}} ra eşkeni devam bıkeri, ya zi [[Special:UserLogin|newe ra hesabê xo akere]] (wazeni pey nameyê xo, wazeni pey yewna name).
+Nıka kamiyê xo eşkera mekere u siteyê {{SITENAME}} ra eşkeni devam bıkeri, ya zi <span class='plainlinks'>[$1 newe ra hesabê xo akere]</span> (wazeni pey nameyê xo, wazeni pey yewna name).
 Wexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de hesabe şıma akerde aseno.",
-'welcomecreation' => '== Şıma xeyr amey, $1! ==
-
-Hesabê şıma biyo a.
+'welcomeuser' => 'Xeyr ameyê $1',
+'welcomecreation-msg' => 'Hesabê şıma abiyo.
 [[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.',
 'yourname' => 'Namey karberi',
 'yourpassword' => 'Parola',
 'yourpasswordagain' => 'Parola reyna bınusne:',
-'remembermypassword' => 'Parola mı nê cıgeyraoği de biya xo viri (heta $1 {{PLURAL:$1|roc|roci}}).',
+'remembermypassword' => 'Parola mı nê cıgeyrayoği de bia xo viri (seba tewr zêde $1 {{PLURAL:$1|roce|rocan}})',
 '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ê.",
+'loginprompt' => "{{SITENAME}} dı ronıştış akerdışi rê ''çerezan'' aktiv kerdış icab keno.",
 'userlogin' => 'Cı kewe / hesab vıraze',
 'userloginnocreate' => 'Cı kewe',
-'logout' => 'Veciyayış',
+'logout' => 'Bıveciye',
 'userlogout' => 'Bıveciye',
 'notloggedin' => 'Hesab akerde niyo',
 'nologin' => "Hesabê şıma çıniyo? '''$1'''.",
 'nologinlink' => 'Yew hesab ake',
-'createaccount' => 'hesab vıraze',
+'createaccount' => 'Hesab vıraze',
 'gotaccount' => "Hesabê şıma esto? '''$1'''.",
 'gotaccountlink' => 'Cı kewe',
 'userlogin-resetlink' => 'Melumatê cıkewtışi xo vira kerdê?',
@@ -781,7 +780,7 @@ Nuştışê xo qonrol kerên, ya zi [[Special:UserLogin/signup|yew hesabo newe a
 'password-name-match' => 'Parola u nameyê şıma gani zeypê (seypê) nêbo.',
 'password-login-forbidden' => 'No namey karberi u parola karkerdışê cı  kerdo xırab.',
 'mailmypassword' => 'E-mail sera parola newiye bırışe',
-'passwordremindertitle' => 'Qey na keyepel {{SITENAME}} yew parolayo emanet',
+'passwordremindertitle' => "Qandê {{SITENAME}}'i idareten parolaya newiye",
 'passwordremindertext' => 'Yew ten (muhtemelen, şıma na aderesê IP ra $1 ) {{SITENAME}} ($4) newe yew parola waşt. "$2" no name ri emanet yew parola vıraziya "$3". Eke na şıma waşta, hesabê xo akere u newe yew parola bıvıraze. Muddetê parolayê şıma yo emanet {{PLURAL:$5|1 roc|$5 roci}}.
 
 Eke vurnayişê parolayi, şıma nêwaşt ya zi parolayê şıma ameyo şıma vir u şıma hini qayil nşye parolayê xo bıvurni; no mesaj peygoş kere u bıewne gureyê xo.',
@@ -805,7 +804,7 @@ Yew formato meqbul de adresê e-posta bınuse ya zi veng bıverde.',
 'cannotchangeemail' => 'E-postay hesabi ena wiki sera nêvurneyêno.',
 'emaildisabled' => 'Na site ra e-posta nêrışêno.',
 'accountcreated' => 'Hesab vıraciya',
-'accountcreatedtext' => 'Qey no $1 karker newe yew hesab vıraziya.',
+'accountcreatedtext' => 'Qandê $1 hesabê karberi vıraziyayo.',
 'createaccount-title' => 'Qey {{SITENAME}} newe yew heab vıraştış',
 'createaccount-text' => 'Kesê, be e-posteyê şıma ra {{SITENAME}} ($4) de, ebe nameyê "$2" u parola "$3" ra yew hesab vıraşto.
 Şıma gani cı kewê u parola xo nıka bıvurnê.',
@@ -833,7 +832,7 @@ Bıne vındere u newe ra dest pê bıkere.',
 'resetpass_forbidden' => 'parolayi nêvuryayi',
 'resetpass-no-info' => 'şıma gani hesab akere u hona bıeşke bırese cı',
 'resetpass-submit-loggedin' => 'Parola bıvurne',
-'resetpass-submit-cancel' => 'ibtal ke',
+'resetpass-submit-cancel' => 'Bıtexelne',
 'resetpass-wrong-oldpass' => 'parolayo parola maqbul niyo.
 şıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.',
 'resetpass-temp-password' => 'parolayo muweqet:',
@@ -882,28 +881,28 @@ Parola vêrdiye: $2',
 # Edit page toolbar
 'bold_sample' => 'Metno qalın',
 'bold_tip' => 'Metno qalın',
-'italic_sample' => 'Herfo Çewt',
-'italic_tip' => 'Herfo çewt',
+'italic_sample' => 'Metno vırandere',
+'italic_tip' => 'Metno vırandere',
 'link_sample' => 'Namey gırê',
 'link_tip' => 'Gıreyê miyani',
-'extlink_sample' => 'http://www.example.com titleya gire',
-'extlink_tip' => 'Çımeyo tewer (http:// prefix)',
+'extlink_sample' => 'http://www.example.com şınasiya adresi',
+'extlink_tip' => 'Greyê teberi (adresi vero http:// dekerê de)',
 'headline_sample' => 'nuştey xeta seri',
-'headline_tip' => 'Ket 2 headline',
+'headline_tip' => '2.ki sewiye sername',
 'nowiki_sample' => 'Non-format nuşte itiya ra bıerz',
-'nowiki_tip' => 'Formatê wiki iptal bık',
+'nowiki_tip' => 'Format kerdışê wiki bıterknê',
 'image_sample' => 'Misal resim.jpg',
-'image_tip' => 'Dosyaya embedi',
+'image_tip' => 'Dosyaya gumın',
 'media_sample' => 'misal.jpg',
-'media_tip' => 'Gırey dosya',
-'sig_tip' => 'İmzay tı u tarix',
-'hr_tip' => 'Çızgiy Horizantoli (use sparingly)',
+'media_tip' => 'Gıreyê dosya',
+'sig_tip' => 'İmza u wext',
+'hr_tip' => 'Çıxiza dimdayi (hend akar mefiye)',
 
 # Edit pages
-'summary' => 'Xulasa:',
-'subject' => 'Mewzu/serrêze:',
-'minoredit' => 'Eno yew vurnayışo qıckeko',
-'watchthis' => 'Ena pele seyr ke',
+'summary' => "<font style=\"color:Blue\">'''Xulasa:'''</font>",
+'subject' => 'Mewzu/sernuşte:',
+'minoredit' => "<font style=\"color:Green\">'''Eno vurnayışo de qıckeko'''</font>",
+'watchthis' => "<font style=\"color:Green\">'''Ena pele seyr ke'''</font>",
 'savearticle' => 'Pele qeyd ke',
 'preview' => 'Verqayt',
 'showpreview' => 'Verqayti bımocne',
@@ -946,7 +945,7 @@ Not, [[Special:Preferences|Tercihê karberi]] eke şıma yew e-postayo raşt nê
 
 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.',
+'whitelistedittext' => 'Qandê vurnayış kerdışi rê $1.',
 'confirmedittext' => 'Eka ti wazene binusi, adresê xo e-maili confirme bike.
 Adresê xo e-maili [[Special:Preferences|user preferences]] de confirme bike.',
 'nosuchsectiontitle' => 'Eno qısım çıniyo',
@@ -998,7 +997,7 @@ Dosyanê be namey .css u .js'i de herfa werdiye bıgurêne, mesela herında {{ns
 'note' => "'''Not:'''",
 'previewnote' => "'''Xo vira mekerê ke ena yew verqayta.'''
 Vurnayışê şıma hona qeyd nêbiyo!",
-'continue-editing' => 'Vurnayışi rê dewam ke',
+'continue-editing' => 'Şo herunda vurnayışi',
 'previewconflict' => 'No seyrkerdışê verqaydi serê qutiyê nuşte tezim kerdış de yo, eke şıma qayile vurnayişê maddeyi seyino bıvini, no mocneno şıma.',
 'session_fail_preview' => 'Ma ef kere. Vindibiyayişê tayê datay ra a kerdışê hesabê şıma de ma vurnayişê şıma qayd nêkerd. Newe ra tesel (cereb) bıkere. Eke no qayde zi nêbo, [[Special:UserLogout|hesabê xo bıqefelne]] u newera a kere.',
 'session_fail_preview_html' => "'''Ma meluli! Sebayê vindbiyayişê datasistemi ma vurnayişê şıma nêeşkeni qaydker.'''
@@ -1010,9 +1009,9 @@ Vurnayışê şıma hona qeyd nêbiyo!",
 Vurnayişê şıma qey nêxerepyayişê peli tepeya geyra a.
 Eke şıma servisê proksi yo anonim şuxulneni sebebê ey noyo.'''",
 'edit_form_incomplete' => "'''Qandê form dê vurnayışa tay wastera ma nêreşti; Vurnayışê ke şıma kerdê nêalızyayê, çım ra ravyarnê u fına bıcerbnê.'''",
-'editing' => 'Pela "$1"\'i bıvurnê',
-'creating' => "Pela $1'i vıraze",
-'editingsection' => '$1 vurneno (qısım)',
+'editing' => 'Şımayê <font style="color:red">$1</font> vurnenê',
+'creating' => 'Pela <font style="color:blue">$1</font> vırazê',
+'editingsection' => 'Per da $1 de şımaye kenê ke leti bıvurnê',
 'editingcomment' => '$1 vuryeno (qısmo newe)',
 'editconflict' => 'Vurnayişê ke yewbini nêtepışeni: $1',
 'explainconflict' => "Wexta ke şıma pel vurneyene yewna ten zi pel vurna.
@@ -1046,7 +1045,7 @@ Loge peniye cor de este:",
 'templatesusedsection' => '{{PLURAL:$1|Template|Templateyan}}  ke na qısım de xebetniyenê:',
 'template-protected' => '(kılit biyo)',
 'template-semiprotected' => '(nimey ena pele kılit biya)',
-'hiddencategories' => 'Ena pela bınê {{PLURAL:$1|1 hidden category|$1 categoriyan nımne}}:',
+'hiddencategories' => 'Ena per de {{PLURAL:$1|1 kategoriyo nımıte|$1 kategoriyê nımıtey}} muhtewa benê:',
 'edittools' => '<!-- Text here will be shown below edit and upload forms. -->',
 'edittools-upload' => '-',
 'nocreatetitle' => 'Vıraştışê pele mehcuro',
@@ -1057,7 +1056,7 @@ Loge peniye cor de este:",
 'sectioneditnotsupported-text' => 'Destekê vurnayışiê qısımi ena pela vurnayışi de çıniyo.',
 'permissionserrors' => 'Xetayê icazeyi',
 'permissionserrorstext' => 'Qey {{PLURAL:$1|sebebê|sebebê}} cêrini ra icazeyê şıma çin o:',
-'permissionserrorstext-withaction' => 'Desturê to be $2 çıniyo, semedê {{PLURAL:$1|ena sebebi|enê sebeban}} ra:',
+'permissionserrorstext-withaction' => '{{PLURAL:$1|Sebeba|Sebeb da}} cêri ra icazetê $2 çıniyo:',
 'recreate-moveddeleted-warn' => "'''Hişyari: no pel o ke şıma vırazeni vere cû vırazyayo.'''
 
 Diqet bıkeri no vurnayişê şıma re gerek esto:",
@@ -1073,16 +1072,25 @@ Hewna kerde aseno.',
 'edit-already-exists' => 'Pelo newe nêvıraziyeno.
 Pel ca ra esto.',
 'defaultmessagetext' => 'Hesıbyaye metne mesaci',
+'content-failed-to-parse' => 'Qandê madela $3 zereyê $1, $2 sero nêagozyayo',
+'invalid-content-data' => 'Zerrey malumati nêravêrdeyo',
+'content-not-allowed-here' => '"$1" sero per da [[$2]] rê mısade nêdeyêno',
+
+# Content models
+'content-model-wikitext' => 'wikimetin',
+'content-model-text' => 'duz metin',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Hişyari: No pel de fonksiyoni zaf esti.
 
 No $2 daweti ra gani tay bıbo, na hel {{PLURAL:$1|1 dawet esto|$1 dawet esto}}.',
 'expensive-parserfunction-category' => 'Pelê ke tede zaf fonksiyoni esti',
-'post-expand-template-inclusion-warning' => 'Hişyari: zerreyê şabloni zaf gırdo.
+'post-expand-template-inclusion-warning' => 'Tembe: zerreyê şabloni zaf gırdo.
 Taye şabloni zerre pel de nêmociyayeni.',
 'post-expand-template-inclusion-category' => 'Pelê şabloni ke hed ra veceyi',
-'post-expand-template-argument-warning' => 'Hişyari: No pel de tewr tay yew şablono herayi esto.',
+'post-expand-template-argument-warning' => 'Tembe: No per de tewr tay yew şablono herayi esto.Nê vurnayeni ser çebyay',
 'post-expand-template-argument-category' => 'Pelê ke şablonê eyi qebul niye',
 'parser-template-loop-warning' => 'Gıreyê şabloni ca biyo: [[$1]]',
 'parser-template-recursion-depth-warning' => 'limitê şablonê newekerdışi biyo de ($1)',
@@ -1113,19 +1121,19 @@ Sebebo ke terefê $3 ra diyao ''$2''",
 'currentrev' => 'Halo nıkayên',
 'currentrev-asof' => 'Revizyonanê peniyan, tarixê $1',
 'revisionasof' => 'Verziyonê roca $1ine',
-'revision-info' => 'Tehsis kerdışê roca $1ine be terefê $2',
+'revision-info' => 'Vıraştena cı karber $2 ra rewizyona $1',
 'previousrevision' => '← Çımraviyarnayışo kıhanêr',
-'nextrevision' => 'Tekrar-diyayışo newêr →',
-'currentrevisionlink' => 'Revizyono veror',
+'nextrevision' => 'Rewizyono newên →',
+'currentrevisionlink' => 'Tewr halê rocaniye bımocne',
 'cur' => 'ferq',
 'next' => 'badên',
-'last' => 'pey',
+'last' => 'peyên',
 'page_first' => 'verên',
 'page_last' => 'peyên',
-'histlegend' => "'''Ferqê weçinayışi:''' Qutiya versiyonan mor ke u  ''enter''i pıploxne ya zi makera cêrêner pılpxne.<br /> 
-Lecant: '''({{int:cur}})''' = ferqê versiyonê peni,
-'''({{int:last}})''' = ferqê versiyonê verni, '''{{int:minoreditletter}}''' = vurnayışo werdı.",
-'history-fieldset-title' => 'Tarixê browsey',
+'histlegend' => "'''Ferqê weçinayışi:''' Qutiya versiyonan mor ke u  ''enter''i bıpıloxne ya zi makera cêrêne bıpıloxne.<br /> 
+Lecant: '''({{int:cur}})''' = ferqê versiyonê peni,
+'''({{int:last}})''' = ferqê versiyonê verêni, '''{{int:minoreditletter}}''' = vurnayışo werdi.",
+'history-fieldset-title' => 'Bewni tarixer',
 'history-show-deleted' => 'Tenya esterıt',
 'histfirst' => 'Verênêr',
 'histlast' => 'Peyênêr',
@@ -1213,8 +1221,8 @@ $1",
 $1",
 'revdel-restore' => 'asayışi bıvurne',
 'revdel-restore-deleted' => 'revizyonê wedariyaye',
-'revdel-restore-visible' => 'revizyonanê esani',
-'pagehist' => 'vere cûyê peli',
+'revdel-restore-visible' => 'revizyonê ke asenê',
+'pagehist' => 'Verora perer',
 'deletedhist' => 'tarixê hewna şiyaye',
 'revdelete-hide-current' => '$2 $1 ney çiye ke wexta diyayene wera (wedar dayiş) xeta da: no reviyon nınımiyeno.',
 'revdelete-show-no-access' => '$2 $1 wexta ke ney tarix de mociyayene xeta da: ne çi "vergırewtı" nişane biyo.
@@ -1268,7 +1276,7 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 # Merge log
 'mergelog' => 'Logê yew kerdişî',
 'pagemerge-logentry' => '[[$1]] u [[$2]] yew kerd (revizyonî heta $3)',
-'revertmerge' => 'Ro mevılêşne/pê meşane',
+'revertmerge' => 'Abırnê',
 'mergelogpagetext' => 'Cêr de jû liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.',
 
 # Diffs
@@ -1276,8 +1284,8 @@ no vurnayişo ke şıma keni kontrol bıkere yew pelo kehen nêbo.',
 '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:',
-'compareselectedversions' => 'Verziyonan kontrol bıke',
+'lineno' => 'Xeta $1i:',
+'compareselectedversions' => 'Rewizyonanê weçineyan pêver ke',
 'showhideselectedversions' => 'Revizyonanê weçinıtan bımocne/bınımne',
 'editundo' => 'peyser bia',
 'diff-multi' => '({{PLURAL:$1|Yew revizyono miyanên|$1 revizyonê miyanêni}} terefê {{PLURAL:$2|yew karberi|$2 karberan}} nêmocno)',
@@ -1289,7 +1297,7 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 
 # Search results
 'searchresults' => 'Neticeyê geyrayışi',
-'searchresults-title' => '"$1" dı neticeyê geyrayışi',
+'searchresults-title' => 'Qandê "$1" neticeyê geyrayışi',
 'searchresulttext' => 'Zerrey {{SITENAME}} de heqa cıgeyrayışi de seba melumat gırewtışi, şenay qaytê [[{{MediaWiki:Helppage}}|{{int:help}}]] ke.',
 'searchsubtitle' => 'Tı semedê \'\'\'[[:$1]]\'\'\' cıgeyra. ([[Special:Prefixindex/$1|pelê ke pêro be "$1" ra dest niyaê pıra]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|pelê ke pêro be "$1"\' ra gırê xo esto]])',
 'searchsubtitleinvalid' => "Tı cıgeyra qe '''$1'''",
@@ -1310,9 +1318,9 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'searchhelp-url' => 'Help:Tedeestey',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|pê eno prefix ser pelan de bigêre]]',
 'searchprofile-articles' => 'Pelê tedeestey',
-'searchprofile-project' => 'Pelê yardım u projey',
+'searchprofile-project' => 'Pelê yardım u procey',
 'searchprofile-images' => 'Multimedya',
-'searchprofile-everything' => 'Hemi',
+'searchprofile-everything' => 'Her çi',
 'searchprofile-advanced' => 'Raverşiyaye',
 'searchprofile-articles-tooltip' => '$1 de bigêre',
 'searchprofile-project-tooltip' => '$1 de bigêre',
@@ -1320,27 +1328,25 @@ Detayê besternayışi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 '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 ç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-category-size' => '{{PLURAL:$1|1 eza|$1 ezayan}} ({{PLURAL:$2|1 kategoriyê bini|$2 kategirayanê binan}}, {{PLURAL:$3|1 dosya|$3 dosyayan}})',
 'search-result-score' => 'Eleqa: $1%',
 'search-redirect' => '(ber $1)',
 'search-section' => '(qısmê $1)',
-'search-suggest' => 'To ney rê vat: $1',
+'search-suggest' => 'To va: $1',
 'search-interwiki-caption' => 'Projey Bıray',
 'search-interwiki-default' => '$1 neticeyan:',
 'search-interwiki-more' => '(hona)',
-'search-mwsuggest-enabled' => 'ebe teklifan',
-'search-mwsuggest-disabled' => 'weşenayışi çıniyê',
 'search-relatedarticle' => 'Eqreba',
 'mwsuggest-disable' => 'Tewsiyay AJAXi bıgê',
 'searcheverything-enable' => 'cayê nameyê hemi de bigêre',
-'searchrelated' => 'eleqayî',
+'searchrelated' => 'eleqeyın',
 'searchall' => 'pêro',
-'showingresults' => "Heta {{PLURAL:$1|'''1''' netice|'''$1''' neticeyan}} ke pê #'''$2''' başli beno ey bimocne .",
+'showingresults' => "#$2 netican ra {{PLURAL:$1|'''1''' netica|'''$1''' neticey}} cêr deyê.",
 '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'''",
+'showingresultsheader' => "{{PLURAL:$5|Neticeyê '''$1''' of '''$3'''|Neticeyanê '''$1 - $2''' hetê '''$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' => 'Zey cıgeyrayış de şıma netice nêvineya',
+'search-nonefound' => 'Zey perskerdışê şıma netice nêvêniya.',
 'powersearch' => 'Cıgeyrayışo hera',
 'powersearch-legend' => 'Cıgeyrayışo hera',
 'powersearch-ns' => 'Cayanê nameyan de cıgeyrayış:',
@@ -1363,13 +1369,13 @@ 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ê.',
 'changepassword' => 'Parola bıvurne',
 'prefs-skin' => 'Çerme',
-'skin-preview' => 'Verqayt',
+'skin-preview' => 'Verasayış',
 'datedefault' => 'Tercih çıniyo',
 'prefs-beta' => 'Xacetê beta',
 'prefs-datetime' => 'Tarix u wext',
@@ -1377,7 +1383,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'prefs-user-pages' => 'Pela Karberi',
 'prefs-personal' => 'Pela karberi',
 'prefs-rc' => 'Vurnayışê peyêni',
-'prefs-watchlist' => 'Lista seyr-kerdışi',
+'prefs-watchlist' => 'Lista seyrkerdışi',
 'prefs-watchlist-days' => 'Rocê ke lista seyrkerdışi de bêrê ramocnaene',
 'prefs-watchlist-days-max' => 'tewr vêşi $1 {{PLURAL:$1|roci|roci}}',
 'prefs-watchlist-edits' => 'tewr zêde amarê vurnayışi ke lista seyrkerdışia herakerdiye de bıasê:',
@@ -1389,7 +1395,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'prefs-setemail' => 'E-posta adresiyê xo saz kerê',
 'prefs-email' => 'Tercihê e-maili',
 'prefs-rendering' => 'Asayış',
-'saveprefs' => 'Star ke',
+'saveprefs' => 'Qeyd ke',
 'resetprefs' => 'Vurnayışê ke qeyd nêbiy, pak ke',
 'restoreprefs' => 'Sazanê hesıbyaya pêron newe dere barke',
 'prefs-editing' => 'Cay pela nustısi',
@@ -1399,7 +1405,7 @@ Pe verbendi ''all:'', vaceyê xo bıvurni ki contenti hemi cıgeyro (pelanê mı
 'searchresultshead' => 'Cı geyre',
 'resultsperpage' => 'Serê pele  amarê cıkewtoğan:',
 'stub-threshold' => 'Baraj ke <a href="#" class="stub">stub link</a> ho şekil dano (bîtî):',
-'stub-threshold-disabled' => 'Dezge ra vıcyaya',
+'stub-threshold-disabled' => 'Astengın',
 'recentchangesdays' => 'Rocê ke vurnayışanê peyênan de bıasê:',
 'recentchangesdays-max' => 'Tewr zaf $1 {{PLURAL:$1|roc|roci}}',
 'recentchangescount' => 'Amarê vurnayışê ke hesıbyaye deye bımocneyê:',
@@ -1415,21 +1421,21 @@ Etıya şıma rê yew kılito raştameo ke şıma şenê bıgurenê/bıxebetnê:
 'timezoneoffset' => 'Offset¹:',
 'servertime' => 'Wextê serveri:',
 'guesstimezone' => 'Browser ra pırr ke',
-'timezoneregion-africa' => 'Afriqa',
+'timezoneregion-africa' => 'Afrika',
 'timezoneregion-america' => 'Amerika',
 'timezoneregion-antarctica' => 'Antarktika',
 'timezoneregion-arctic' => 'Arktik',
-'timezoneregion-asia' => 'Esya',
+'timezoneregion-asia' => 'Asya',
 'timezoneregion-atlantic' => 'Okyanuso Atlantik',
-'timezoneregion-australia' => 'Evistiralya',
-'timezoneregion-europe' => 'Ewrope',
+'timezoneregion-australia' => 'Awıstralya',
+'timezoneregion-europe' => 'Ewropa',
 'timezoneregion-indian' => 'Okyanuso Hind',
 'timezoneregion-pacific' => 'Okyanuso Pasifik',
 'allowemail' => 'Karberê bini wa bışê mı rê e-posta bırışê.',
 'prefs-searchoptions' => 'Cı geyre',
-'prefs-namespaces' => 'Caê namey',
+'prefs-namespaces' => 'Cayê namam',
 'defaultns' => 'Eke heni, enê cayanê namey de cı geyre (sae ke):',
-'default' => 'hesıbyaye',
+'default' => 'qısur',
 'prefs-files' => 'Dosyey',
 'prefs-custom-css' => 'CSSê xasi',
 'prefs-custom-js' => 'JSê xasi',
@@ -1441,7 +1447,7 @@ Na game tepeya nêerziyena.',
 'youremail' => 'E-Mail (mecbur niyo) *:',
 'username' => 'Namey karberi:',
 'uid' => 'Namey karberi:',
-'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grub|grubi}}:',
+'prefs-memberingroups' => 'Ezayê {{PLURAL:$1|grube|gruban}}:',
 'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'Wextê qeydbiyayışi',
 'prefs-registration-date-time' => '$1',
@@ -1455,10 +1461,10 @@ Na game tepeya nêerziyena.',
 Etiketê HTMLî kontrol bike.',
 'badsiglength' => 'İmzayê şıma zaf dergo.
 $1 gani bınê no {{PLURAL:$1|karakter|karakter}} de bıbo.',
-'yourgender' => 'Neri makey:',
+'yourgender' => 'Cınsiyet:',
 'gender-unknown' => 'Cınsiyet nêvato',
-'gender-male' => 'cıwamêrd',
-'gender-female' => 'Cenıke',
+'gender-male' => 'Camêrd',
+'gender-female' => 'Cıniye',
 'prefs-help-gender' => 'keyfiyo: sofware qey adersê cinsiyet şuxulneno, no malumat umumiyo.',
 'email' => 'E-posta',
 'prefs-help-realname' => 'Nameyo raşt waştena şıma rê mendo.
@@ -1467,8 +1473,8 @@ Eka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de moc
 'prefs-help-email-others' => 'Şıma şenê weçinê ke ê bini be yew gırey pela şımaya karberi ya zi pela werênayışi sera şıma de ebe e-poste irtıbat kewê.
 Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena.',
 'prefs-help-email-required' => 'E-mail adrese mecburiya.',
-'prefs-info' => 'Seron zanayış',
-'prefs-i18n' => 'Şaryayış kerdış',
+'prefs-info' => 'Melumato bıngeh',
+'prefs-i18n' => 'Beynelmılelkerdış',
 'prefs-signature' => 'İmza',
 'prefs-dateformat' => 'Formatê tarixi',
 'prefs-timeoffset' => 'Wext offset',
@@ -1480,7 +1486,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'prefs-displayrc' => 'Tercihan bımocne',
 'prefs-displaysearchoptions' => 'Weçinayışê mocnayışi',
 'prefs-displaywatchlist' => 'Weçinayışê mocnayışi',
-'prefs-diffs' => 'Diffs',
+'prefs-diffs' => 'Ferqi',
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => 'e-posta adresi raştayo',
@@ -1489,12 +1495,12 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 # User rights
 'userrights' => 'İdarey heqanê karberan',
 'userrights-lookup-user' => 'Grubanê karberi/karbere idare bıke',
-'userrights-user-editname' => 'Yew namey karberi bınusne',
+'userrights-user-editname' => 'Yew nameyê karberi cı kewe:',
 'editusergroup' => 'Grupanê karberi/karbere bıvurne (bıbedelne)',
 'editinguser' => "'''[[User:$1|$1]]''' keno weziyetê $2'i bıvurno",
 'userrights-editusergroup' => 'Grubanê karberi/karbere sero bıgureye (bıxebetiye)',
 'saveusergroups' => 'Grubanê karberi qeyd bıke',
-'userrights-groupsmember' => 'Ezaê / Ezaya:',
+'userrights-groupsmember' => 'Eza:',
 'userrights-groupsmember-auto' => 'Ezao daxıl/ezaa daxıle ê:',
 'userrights-groups-help' => 'şıma şenê grubanê nê karberi/na karbere, oyo/aya ke tede, bıvurnê:
 * qutiya ke nışankerdiya, mocnena ke karber/e na grube dero/dera.
@@ -1510,7 +1516,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'userrights-irreversible-marker' => '$1*',
 
 # Groups
-'group' => 'Grup:',
+'group' => 'Grube:',
 'group-user' => 'Karberi',
 'group-autoconfirmed' => 'Karberê ke xob xo biyê araşt',
 'group-bot' => 'Boti',
@@ -1531,10 +1537,10 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'grouppage-bot' => '{{ns:project}}:Boti',
 'grouppage-sysop' => '{{ns:project}}:İdarekeri',
 'grouppage-bureaucrat' => '{{ns:project}}:Burokrati',
-'grouppage-suppress' => '{{ns:project}}:Kontrol',
+'grouppage-suppress' => '{{ns:project}}:Qontrol',
 
 # Rights
-'right-read' => 'Pelan bıwanê',
+'right-read' => 'Pelan bıwane',
 'right-edit' => 'Pele bıvurne',
 'right-createpage' => 'Pele vıraze (pelê ke ê werênayışi niyê)',
 'right-createtalk' => 'Pela werênayışi vıraze',
@@ -1562,7 +1568,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-deleterevision' => 'Vurnayışê xısusiyê ke ê pelanê, inan bestere ya zi 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',
-'right-browsearchive' => 'Bıgeyre pelanê eserıtiyan',
+'right-browsearchive' => 'Pelanê esterıteyan bıgeyre',
 'right-undelete' => 'Jû pela esterıtiye peyser bia',
 'right-suppressrevision' => 'İdarekeran ra dızdeni/miyanki, newede vurnayışan de qayt ke u newede vıraze',
 'right-suppressionlog' => 'Rocekanê xasan bıvêne',
@@ -1571,7 +1577,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-hideuser' => 'Yew namey karberi  şari ra dızdeni/miyanki bloke bıke',
 'right-ipblock-exempt' => 'Blokanê IPi, oto-blokan u blokanê menzıli ra ravêre',
 'right-proxyunbannable' => 'Blokanê otomatikiê proksiyan ra ravêre',
-'right-unblockself' => 'Inan a bike',
+'right-unblockself' => 'İnan ake',
 'right-protect' => 'Sewiyanê pawıtışi (mıhafezey) bıvurne u pelanê kılitbiyaiyan sero bıgureye.',
 'right-editprotected' => 'Pelanê pawıtiyan sero bıgureye (bê pawıtena kaskadi (game be game))',
 'right-editinterface' => 'Interfaceê karberi sero bıgureye',
@@ -1587,7 +1593,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-autopatrol' => 'Vurnayîşanê xo otomatik nîşan bike ke patrol biyê',
 'right-patrolmarks' => 'Vurnayîşanê peniyî nîşan patrol biyê bivîne',
 'right-unwatchedpages' => 'Yew listeyê pelanê seyrnibiye bivîne',
-'right-mergehistory' => 'Tarixê pelanê yew bike',
+'right-mergehistory' => 'Tarixê pelan yew ke',
 'right-userrights' => 'Heqanê karberi pêro bıvurne',
 'right-userrights-interwiki' => 'Heqqa karberanê ke ho wîkîyo binî de ey bivurne',
 'right-siteadmin' => 'Database kilit bike u a bike',
@@ -1600,6 +1606,9 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rightslogtext' => 'Ena listeyê loganê ke heqqa karbaranî mucneno.',
 'rightslogentry' => 'eza biyayişê grupî $1 ra $2 rê $3î bivurne',
 'rightslogentry-autopromote' => '$2 otomatikmen gırdkerdışi ra kerd $3.',
+'logentry-rights-rights' => '$1 qandê $3 rê ezayina grube $4 ra $5 vuriye',
+'logentry-rights-rights-legacy' => '$1 qandê $3 rê ezayina grube vuriye',
+'logentry-rights-autopromote' => '$1 otomatikmen $4 ra terfi bi ra $5',
 'rightsnone' => '(çino)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1613,12 +1622,12 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-move-subpages' => 'ena pele, u pelanê daê bınênan bere',
 'action-move-rootuserpages' => 'pelanê karberiyê bıngeyan bere',
 'action-movefile' => 'ena dosya bere',
-'action-upload' => 'ena dosya bar bike',
+'action-upload' => 'ena dosya bar ke',
 'action-reupload' => 'dosyayê ke database de esto ser ey binuse',
 'action-reupload-shared' => 'dosyayê ki ho embarê medyayî de esto ser ay binusne',
 'action-upload_by_url' => 'Ena dosya yew URL ra bar bike',
 'action-writeapi' => 'ser nuşte API gure bike',
-'action-delete' => 'ena pele biestere',
+'action-delete' => 'ena perer besternê',
 'action-deleterevision' => 'nê çımraviyarnayışi bıestere',
 'action-deletedhistory' => 'tarixê ena pel ki estereyî biya, ey bivine',
 'action-browsearchive' => 'pelanê esterıteyan bıgeyre',
@@ -1633,7 +1642,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'action-patrol' => 'vurnayîşê karberanê binî nişan bike patrol biye',
 'action-autopatrol' => 'vurnayîşê xoye nişan bike ke belli biyo patrol biye',
 'action-unwatchedpages' => 'listeyê pelanê seyirnibiya bivîne',
-'action-mergehistory' => 'tarixê ena pele yew bike',
+'action-mergehistory' => 'tarixê ena pele yew ke',
 'action-userrights' => 'heqqa karberanê hemî bivurne',
 'action-userrights-interwiki' => 'heqqa karberanê ke wikiyê binî de hemî bivurne',
 'action-siteadmin' => 'database kilit bike ya zi a bike',
@@ -1642,28 +1651,28 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|fın vurna|fıni vurna}}',
 'recentchanges' => 'Vurnayışê peyêni',
-'recentchanges-legend' => 'Tercihê vurnayışanê peniyan',
-'recentchanges-summary' => 'Ena pele de wiki sero vurnayışê peyêni teqib ke',
+'recentchanges-legend' => 'Tercihê vurnayışanê peyênan',
+'recentchanges-summary' => 'Ena pele de wiki sero vurnayışanê peyênan 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 vurnayışo do qickek o',
+'recentchanges-label-minor' => 'Eno yew vurnayışo qıckeko',
 'recentchanges-label-bot' => 'Yew boti xo het ra no vurnayış vıraşto',
-'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.",
-'rcnotefrom' => "Cêr de vurnayîşê esto ke '''$2''' ra raver  (heta '''$1''' mucnayiyo).",
+'recentchanges-label-unpatrolled' => 'Eno vurnayış hewna dewriya nêbiyo',
+'rcnote' => "Bıni dı {{PLURAL:$1|'''1''' vurnayış|peyni de '''$1''' vurnayışi estê}} {{PLURAL:$2|roc|'''$2''' roci}}, hetana $5, $4.",
+'rcnotefrom' => "Cêr de '''$2''' ra nata vurnayışiyê asenê (tewr vêşi <b> '''$1'''</b> asenê).",
 'rclistfrom' => '$1 ra vurnayışanê neweyan bımocne',
-'rcshowhideminor' => 'Vurnayışanê werdiya $1',
-'rcshowhidebots' => 'Bota $1',
-'rcshowhideliu' => 'karberanê qeydına $1',
-'rcshowhideanons' => 'karberanê anoniman $1',
+'rcshowhideminor' => 'Vurnayışanê werdiyan $1',
+'rcshowhidebots' => 'Botan $1',
+'rcshowhideliu' => 'Karberanê qeydınan $1',
+'rcshowhideanons' => 'Karberanê anoniman $1',
 'rcshowhidepatr' => '$1 vurnayışê ke dewriya geyrayê',
-'rcshowhidemine' => 'nuştışanê mı $1',
-'rclinks' => 'Peyni $2 rocan de vurnayışa $1  bımocne <br />$3',
+'rcshowhidemine' => 'Vurnayışanê mı $1',
+'rclinks' => 'Peyniya $2 rocan de $1 vurnayışan bımocne <br />$3',
 'diff' => 'ferq',
 'hist' => 'verên',
 'hide' => 'Bınımne',
 'show' => 'Bımocne',
-'minoreditletter' => 'w',
+'minoreditletter' => 'q',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'unpatrolledletter' => '!',
@@ -1678,9 +1687,9 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rc-old-title' => '"$1"i orcinalê cı vıraşt',
 
 # Recent changes linked
-'recentchangeslinked' => 'Ney sero vurnayışi',
-'recentchangeslinked-feed' => 'Ney sero vurnayışi',
-'recentchangeslinked-toolbox' => 'Ney sero vurnayışi',
+'recentchangeslinked' => 'Vurnayışê eleqeyıni',
+'recentchangeslinked-feed' => 'Vurnayışê eleqeyıni',
+'recentchangeslinked-toolbox' => 'Vurnayışê eleqeyıni',
 'recentchangeslinked-title' => 'vurnayışan ser "$1"',
 'recentchangeslinked-noresult' => 'Pelanê ke link biye ey vurnayîşî çino.',
 'recentchangeslinked-summary' => "Lista cêrêne, pela bêlikerdiye rê (ya zi karberanê kategoriya bêlikerdiye rê) pelanê gırêdaoğan de lista de vurnayışê peyênana.
@@ -1718,7 +1727,7 @@ wexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişux
 'filedesc' => 'Xulasa',
 'fileuploadsummary' => 'Xulasa:',
 'filereuploadsummary' => 'Vurnayîşê dosyayî:',
-'filestatus' => 'Weziyetê heqê telifiye:',
+'filestatus' => 'Weziyetê heqa telifi:',
 'filesource' => 'Çıme:',
 'uploadedfiles' => 'Dosyayê ke bar biye',
 'ignorewarning' => 'Îkazi kebul meke u dosya reyna bar bike',
@@ -1818,7 +1827,7 @@ PICT # misc.
 
 'upload-proto-error' => 'Porotokol raşt ni yo.',
 'upload-proto-error-text' => 'Bar kerdişê durî gani  URLî estbiye ke pe <code>http://</code> ya zi <code>ftp://</code> başli beno.',
-'upload-file-error' => 'Ğeletê dahilî',
+'upload-file-error' => 'Xeta daxılkiye',
 'upload-file-error-text' => 'Peşkeşwan de wexta yew dosya vıraziyayene xeta bı.
 kerem kerê [[Special:ListUsers/sysop|serkari]]de irtibat kewe.',
 'upload-misc-error' => 'Ğeletê bar kerdişî nizanyeno',
@@ -1838,6 +1847,7 @@ Eke problem dewam kerd [[Special:ListUsers/sysop|serkari]] de irtibat kewe.',
 'backend-fail-notsame' => 'Zey $1 ju dosya xora  esta.',
 'backend-fail-invalidpath' => '$1 rayê da depo kerdışa raştay niya.',
 'backend-fail-delete' => '$1 nê besterneyê',
+'backend-fail-describe' => 'Qande dosya da "$1" metadata nêvurêna.',
 'backend-fail-alreadyexists' => "Dosyay $1'ya nêwanêna",
 'backend-fail-store' => '$1 ra $2 berdışo nê wanêno',
 'backend-fail-copy' => '$1 ra $2 kopya kerdışena dosyayo nêbeno',
@@ -1950,7 +1960,7 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 # File description page
 'file-anchor-link' => 'Dosya',
 'filehist' => 'Ravêrdê dosya',
-'filehist-help' => 'Klik bık ser yew tarih u aye tarih dı versionê dosya bıvin.',
+'filehist-help' => 'bıploxne ser yew tarih u aye tarih dı versionê dosya bıvin.',
 'filehist-deleteall' => 'hemî biestere',
 'filehist-deleteone' => 'bıestere',
 'filehist-revert' => 'reyna biyere',
@@ -1960,9 +1970,9 @@ keyepel nıka zaf meşğulo yew dema herayi de newe ra tesel bıkerê.',
 'filehist-thumbtext' => 'Thumbnail qe versiyonê $1',
 'filehist-nothumb' => 'Thumbnail çin o.',
 'filehist-user' => 'Karber',
-'filehist-dimensions' => 'Dimensiyoni',
+'filehist-dimensions' => 'Ebati',
 'filehist-filesize' => 'Ebatê dosyayî',
-'filehist-comment' => 'Mışewre',
+'filehist-comment' => 'Vacayış',
 'filehist-missing' => 'Dosya nieseno',
 'imagelinks' => 'Gurenayışê dosya',
 'linkstoimage' => 'Ena {{PLURAL:$1|pela|$1 pela}} gıreye ena dosya:',
@@ -1987,7 +1997,7 @@ 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.',
+'upload-disallowed-here' => 'Şıma nêşenê serê na dosya ra bınusên.',
 
 # File reversion
 'filerevert' => '$1 reyna biyere',
@@ -2037,7 +2047,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'unusedtemplateswlh' => 'linkanê binî',
 
 # Random page
-'randompage' => 'Peleya ke raştamê',
+'randompage' => 'Pela raştameyiye',
 'randompage-nopages' => 'Ena {{PLURAL:$2|cayêname|cayênameyî}} de enê pelan çin o: $1.',
 
 # Random redirect
@@ -2052,7 +2062,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'statistics-header-users' => 'Îstatistiksê karberî',
 'statistics-header-hooks' => 'Îstatistiksê binî',
 'statistics-articles' => 'Pelanê tedesteyî',
-'statistics-pages' => 'Peri',
+'statistics-pages' => 'Peli',
 'statistics-pages-desc' => 'Pelanê hemî ke wîkî de estê, pelanê mineqeşeyî, redireksiyon ucb... dehil o.',
 'statistics-files' => 'Dosyayê bar biye',
 'statistics-edits' => 'Amarê vurnayîşî ke wextê {{SITENAME}} ronayîşî ra',
@@ -2066,7 +2076,7 @@ listeya ke ha ver a têna na {{PLURAL:$1|dosyaya ewwili|dosyaya $1 ewwili}} mocn
 'statistics-mostpopular' => 'Pelayanê ke tewr zafî vînî biye',
 
 'disambiguations' => 'Pelayê ke maneyo bini rê gırey cı esto',
-'disambiguationspage' => 'Template:disambig',
+'disambiguationspage' => 'Template:Maneo bin',
 'disambiguations-text' => "Peleyê ke satır da sıteyên dı pelanê '''maneo bin'''i rê esteyina zeregri mocnenê. Nara satırda dıdın dı zi <br />tiya de [[MediaWiki:Disambiguationspage|Pelaya Maneo do bini ]] gani heme gıreyê şablonê ciya-manayan re gıre dayış icab keno.",
 
 'doubleredirects' => 'Hetenayışê dıletıni',
@@ -2096,15 +2106,15 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'nlinks' => '$1 {{PLURAL:$1|link|linkî}}',
 'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
 'nrevisions' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
-'nviews' => '$1 {{PLURAL:$1|vînayîÅ\9f|vînayîÅ\9fî}}',
-'nimagelinks' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
-'ntransclusions' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
-'specialpage-empty' => 'Ser ena report netice çini yo.',
-'lonelypages' => 'Peleyê ke cı rê gıre nêdeyayo',
+'nviews' => '$1 {{PLURAL:$1|vênayıÅ\9f|vênayıÅ\9fi}}',
+'nimagelinks' => '$1 {{PLURAL:$1|pele de|pelan de}} gureyeno',
+'ntransclusions' => '$1 {{PLURAL:$1|pele de|pelan de}} gureyeno',
+'specialpage-empty' => 'Seba na rapore netice çıniyo.',
+'lonelypages' => 'Pelê seyi',
 'lonelypagestext' => 'Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.',
 'uncategorizedpages' => 'Pelayanê ke kategorî nibiye',
 'uncategorizedcategories' => 'Kategoriyê ke bê kategorîyê',
-'uncategorizedimages' => 'Dosyayê ke bê kategorîyê',
+'uncategorizedimages' => 'Dosyayê ke bê kategoriyê',
 'uncategorizedtemplates' => 'Şablonê ke bê kategoriyê',
 'unusedcategories' => 'Kategoriyê ke nê xebtênê',
 'unusedimages' => 'Dosyeyê ke nê xebtênê',
@@ -2125,7 +2135,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'mostrevisions' => 'Pelan ke tewr zaf revizyonî biyê.',
 'prefixindex' => 'Veroleya peley pêro',
 'prefixindex-namespace' => 'Peleyê Veroleyıni ($1 cay nami)',
-'shortpages' => 'Peleyê kılmeki',
+'shortpages' => 'Pelê kılmeki',
 'longpages' => 'Peleyê dergeki',
 'deadendpages' => 'pelê ke pelê binan re gırey nêeşto',
 'deadendpagestext' => 'Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.',
@@ -2143,9 +2153,9 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'usereditcount' => '$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}',
 'usercreated' => '$2 de $1 {{GENDER:$3|viraziya}}',
 'newpages' => 'Pelê newey',
-'newpages-username' => 'Namey Karberi:',
+'newpages-username' => 'Nameyê karberi:',
 'ancientpages' => 'Wesiqeyê ke vurnayışê ciyê peyeni tewr kehani',
-'move' => 'Berê',
+'move' => 'Berdış',
 'movethispage' => 'Ena pele bere',
 'unusedimagestext' => 'Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.
 Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.',
@@ -2155,7 +2165,7 @@ Xo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gı
 'nopagetitle' => 'wina yew pelê hedefi çin o.',
 '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}}',
+'pager-older-n' => '{{PLURAL:$1|deha kehan 1|deha kehan $1}}',
 'suppress' => 'Çımpawıten',
 'querypage-disabled' => 'Na pelaya xısusi,sebeb de performansi ra qefılneyê.',
 
@@ -2179,17 +2189,17 @@ tipa rocaneyi, nameyê karberi (herfa pil u qıci re hessas a), ya zi peli (reyn
 'showhideselectedlogentries' => 'Qeydê weçinayışê bımocne/bınımne dekerê',
 
 # Special:AllPages
-'allpages' => 'Peli pêro',
+'allpages' => 'Peri pêro',
 'alphaindexline' => '$1 ra $2ine',
 'nextpage' => 'Pela badê cû ($1)',
 'prevpage' => 'Pela verêne ($1)',
 'allpagesfrom' => 'Pelanê ke be ena herfe dest pêkenê bımocne',
 'allpagesto' => 'Pelanê ke be ena herfe qediyenê bımocne:',
-'allarticles' => 'Peli pêro',
+'allarticles' => 'Wesiqey pêro',
 'allinnamespace' => 'Peli pênro ( $1 cayênameyî)',
 'allnotinnamespace' => 'Pelanê hemî ($1 cayênameyî de niyo)',
 'allpagesprev' => 'Verên',
-'allpagesnext' => 'ver şo',
+'allpagesnext' => 'Bahdo',
 'allpagessubmit' => 'Şo',
 '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.',
@@ -2213,15 +2223,16 @@ hem zi bıewnê [[Special:WantedCategories|kategori yê ke waziyeni]].',
 # Special:DeletedContributions
 'deletedcontributions' => 'İştiraqê karberan de besternayına',
 'deletedcontributions-title' => 'Îştirakê karberî wederna',
-'sp-deletedcontributions-contribs' => 'dekerdeni',
+'sp-deletedcontributions-contribs' => 'iştıraqi',
 
 # Special:LinkSearch
 'linksearch' => 'Gıreyê teberi cı geyrê',
 'linksearch-pat' => 'bıgêr motif:',
 'linksearch-ns' => 'Cayênameyî:',
 'linksearch-ok' => 'Cı geyre',
-'linksearch-text' => 'joker ê zey "*.wikipedia.org"i karneno.<br />
-qaydeyê destek biyayeyi: <code>$1</code>',
+'linksearch-text' => 'Jokeri ê zey "*.wikipedia.org"i benê ke bıgureniyê.
+Tewr senık yew sewiya serêna cayê tesiri lazıma, mesela "*.org".<br />
+Qeydeyê destegbiyayey: <code>$1</code> (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).',
 'linksearch-line' => '$1, $2 ra link biya',
 'linksearch-error' => 'jokeri têna nameyê makina ya serekini de aseni/eseni.',
 
@@ -2238,10 +2249,10 @@ qaydeyê destek biyayeyi: <code>$1</code>',
 'activeusers-from' => 'Enê karberi ra tepya bımocne:',
 'activeusers-hidebots' => 'Botan bınımne',
 'activeusers-hidesysops' => 'İdarekerdoğan bınımne',
-'activeusers-noresult' => 'Karberî çini yo.',
+'activeusers-noresult' => 'Karberi nêdiyayê.',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Cıkewtışê hesab-vıraştışi',
+'newuserlogpage' => 'Cıkewtışê hesabvıraştışi',
 'newuserlogpagetext' => 'Ena log de viraştişê karberî esta.',
 
 # Special:ListGroupRights
@@ -2250,18 +2261,18 @@ qaydeyê destek biyayeyi: <code>$1</code>',
 qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed]] belka esto.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Heqa daiye</span>
 * <span class="listgrouprights-revoked">Heqa guretiye</span>',
-'listgrouprights-group' => 'Grup',
+'listgrouprights-group' => 'Grube',
 'listgrouprights-rights' => 'Heqqî',
 'listgrouprights-helppage' => 'Help:Heqqanê gruban',
-'listgrouprights-members' => '(lista ezayan)',
+'listgrouprights-members' => '(listey ezayan)',
 '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' => '{{PLURAL:$2|Grube|Gruban}} cı kerê: $1',
+'listgrouprights-removegroup' => '{{PLURAL:$2|Grube|Gruban}} bıvecê: $1',
 'listgrouprights-addgroup-all' => 'şıma hesabê xo re heme gruban eşkeni têare bıkeri',
 'listgrouprights-removegroup-all' => 'şıma hesabê xo ra heme gruban eşkeni veci',
-'listgrouprights-addgroup-self' => 'şıma hesabê xo re eşkeni {{PLURAL:$2|grub|gruban}} têare bıkerî: $1',
-'listgrouprights-removegroup-self' => 'şıma hesabê xo ra eşkeni {{PLURAL:$2|grub|gruban}} bıveci: $1',
+'listgrouprights-addgroup-self' => 'Hesabê xo rê {{PLURAL:$2|grube|gruban}} cı kerê: $1',
+'listgrouprights-removegroup-self' => 'Hesabê xo ra {{PLURAL:$2|grube|gruban}} bıvecê: $1',
 'listgrouprights-addgroup-self-all' => 'şıma eşkeni hesabê xo re heme gruban têare bıkerî',
 'listgrouprights-removegroup-self-all' => 'şıma hesabê xo ra eşkeni heme gruban bıveci',
 
@@ -2272,8 +2283,8 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'emailuser-title-target' => 'Na E-postaya {{GENDER:$1|karberi}}ya',
 'emailuser-title-notarget' => 'E-postaya karberi',
 'emailpage' => 'karberi re e-posta bırışê',
-'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.',
+'emailpagetext' => 'Şıma şenê nê formê cêrêni nê {{GENDER:$1|karber}}i rê e-poste rıştış de bıgurenê.
+[[Special:Preferences|Tercihanê şımayê karberi]] de adresa e-posteya ke şıma daya, na adrese qısmê adresa e-postey de "kami ra" asena, no sebeb ra gırewtoğ şeno direkt cewab bıdero şıma.',
 'usermailererror' => 'xizmetê e-postayi xeta da:',
 'defemailsubject' => '"$1" ra e-postay {{SITENAME}} amê',
 'usermaildisabled' => 'E-mailê karberani kafiliyeya',
@@ -2285,13 +2296,13 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 'emailnotarget' => 'Qandê Gêreninamey karberiyo wuna çınyo yana xırabo.',
 'emailtarget' => 'Namey Karberi defiyê de.',
 'emailusername' => 'Nameyê karberi:',
-'emailusernamesubmit' => 'Stare dı',
+'emailusernamesubmit' => 'İtaet',
 'email-legend' => 'karberê {{SITENAME}} binan re e-posta bıerşaw',
-'emailfrom' => 'Rışten:',
-'emailto' => 'Geren:',
-'emailsubject' => 'Mersel:',
-'emailmessage' => 'E-posta:',
-'emailsend' => 'bıerşawê/bıruşnê',
+'emailfrom' => 'Kami ra:',
+'emailto' => 'Kami rê:',
+'emailsubject' => 'Mewzu:',
+'emailmessage' => 'Mesac:',
+'emailsend' => 'Bırışe',
 'emailccme' => 'kopyayekê mesaji mı re bıerşaw',
 'emailccsubject' => '$2 kopyaya mesaj a ke şıma erşawıto/a $1:',
 'emailsent' => 'E-posta bırşê',
@@ -2299,13 +2310,13 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 '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.',
 
 # User Messenger
-'usermessage-summary' => 'Mesajê sistemi caverd.',
+'usermessage-summary' => 'Mesacê sistemi caverde.',
 'usermessage-editor' => 'Mesaj berdoxe sistemi',
 'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
-'watchlist' => 'lista mına seyr-kerdışi',
-'mywatchlist' => 'Listey taqiban',
+'watchlist' => 'Lista mına seyrkerdışi',
+'mywatchlist' => 'Lista seyrkerdışi',
 'watchlistfor2' => 'Qandê $1 ($2)',
 'nowatchlist' => 'listeya temaşa kerdıişê şıma de yew madde zi çina.',
 'watchlistanontext' => 'qey vurnayişê maddeya listeya temaşakerdişi $1.',
@@ -2316,9 +2327,9 @@ qey heqê şexsi de [[{{MediaWiki:Listgrouprights-helppage}}|hema malumato ziyed
 Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem ma tu ri heber dun, zerri [[Special:RecentChanges|list of recent changes]] name pele beno qalın. Tı ri beno qolay çıta vurnaye biyo.',
 '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' => 'Peler seyr ke',
-'unwatch' => 'Seyr meke',
+'watch' => 'Temaşe ke',
+'watchthispage' => 'Na pele seyr ke',
+'unwatch' => 'Teqib mekerê',
 'unwatchthispage' => 'temaşa kerdışê peli vındarn.',
 'notanarticle' => 'mebhesê peli niyo',
 'notvisiblerev' => 'Revizyon esteriyayo',
@@ -2341,15 +2352,21 @@ Ena deme ra, ma qe vurnayışan ser ena pele tı haberdar keni. Hem zi çı dem
 
 'enotif_mailer' => 'postaya xeberdayişi {{SITENAME}}',
 'enotif_reset' => 'Pela pêro ziyaret kerde deye mor ke',
-'enotif_newpagetext' => 'Ena yew pela newî ya.',
 'enotif_impersonal_salutation' => '{{SITENAME}} karber',
-'changed' => 'vurneya',
-'created' => 'viraziya',
-'enotif_subject' => 'pelê {{SITENAME}}i $PAGETITLE, hetê/perrê $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} esterıt.',
+'enotif_subject_created' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} vıraşt',
+'enotif_subject_moved' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} berde',
+'enotif_subject_restored' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} timar ke',
+'enotif_subject_changed' => '{{SITENAME}} de pera $1 {{gender:$2|$2}} vurne',
+'enotif_body_intro_deleted' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i esterıt, rewizyonê $3 bıvin.',
+'enotif_body_intro_created' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i vıraşt, rewizyonê $3 bıvin.',
+'enotif_body_intro_moved' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i berd, rewizyonê $3 bıvin.',
+'enotif_body_intro_restored' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i timar ke, rewizyonê $3 bıvin.',
+'enotif_body_intro_changed' => '{{SITENAME}} de pera $1 $PAGEEDITDATE de {{gender:$2|$2}}i vurne, rewizyonê $3 bıvin.',
 'enotif_lastvisited' => 'ziyareta şıma ye peyini ra nata heme vuryayiş ê ke biyê bıewnê $1i re..',
 'enotif_lastdiff' => 'qey vinayişê ney vurnayişi bıewnê pelê $1i',
 'enotif_anon_editor' => 'karbero anonim $1',
-'enotif_body' => 'Embazê $WATCHINGUSERNAME,
+'enotif_body' => 'Erciyayê $WATCHINGUSERNAME,
 
 {{SITENAME}} keyepel de no $PAGETITLE pelo sernameyın re $PAGEEDITDATE no tarix de $PAGEEDITOR no karberi $CHANGEDORCREATED. şıma eşkeni bıresi halê no peli re $PAGETITLE_URL na adresi ra.
 
@@ -2366,13 +2383,16 @@ no pel o ke behs beno heta ziyaret kerdışê yewna heli, mesajê vuriyayişi n
            {{SITENAME}} sistemê hişyariyê keyepeli.
 
 --
-qey vurnayişê eyari:
+Qey vurnayişê eyari:
 {{canonicalurl:{{#Special:Watchlist/edit}}}}
 
-qey wedarayişê ena pele liste xo ra seyr kerdişi, şo
+Qey vurnayişê eyaran de lista seyri:
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+Qey wedarayişê ena pele liste xo ra seyr kerdişi, şo
 $UNWATCHURL
 
-qey hemkari u pêşniyazi:
+Qey hemkari u pêşniyazi:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -2387,11 +2407,11 @@ qey hemkari u pêşniyazi:
 'historywarning' => "'''Teme:''' Pela ke şıma esterenê tede yew viyarte be teqriben $1 {{PLURAL:$1|versiyon esto|versiyoni estê}}:",
 'confirmdeletetext' => 'Tı ho yew pele u tarixê pele wederneno.
 Tı ra rica keno, tı zani tı ho sekeno, tı zani neticeyanê eno wedarnayışi u tı zani tı ser [[{{MediaWiki:Policy-url}}|poliçe]] kar keno.',
-'actioncomplete' => 'Aksiyon temam biyo',
+'actioncomplete' => 'Xebten temam biyo',
 'actionfailed' => 'kar nêbı',
 'deletedtext' => '"$1" biya wedariya.
 Qe qeydê wedarnayışi, $2 bevinin.',
-'dellogpage' => 'Qeydê besternayışi',
+'dellogpage' => 'Qeydê esterniye',
 'dellogpagetext' => 'listeya cêrıni heme qaydê hewn a kerdeyan o.',
 'deletionlog' => 'qaydê hewnakerdışani',
 'reverted' => 'revizyono verin tepiya anciyayo',
@@ -2402,7 +2422,7 @@ Qe qeydê wedarnayışi, $2 bevinin.',
 ** talebê nuştekari
 ** ihlalê heqê telifi
 ** Vandalizm',
-'delete-edit-reasonlist' => 'sebebê hewn a kerdışani bıvurn',
+'delete-edit-reasonlist' => 'Sebebê vurnayışan bıvurne',
 'delete-toobig' => 'no pel, pê $1 {{PLURAL:$1|tene vuriyayiş|tene vuriyayiş}}i wayirê yew tarixo kehen o.
 qey hewna nêşiyayişi wina pelani u {{SITENAME}}nêxerebnayişê keyepeli yew hed niyaya ro.',
 'delete-warning-toobig' => 'no pel wayirê tarixê vurnayiş ê derg o, $1 {{PLURAL:$1|revizyonê|revizyonê}} seri de.
@@ -2422,7 +2442,7 @@ yewna ten pel de vurnayiş kerdo u pel tepiya nêgeriyeno.
 
 oyo ke vurnayişo peyin kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "kılmnuşteyê vurnayişibi: \"''\$1''\".",
-'revertpage' => 'hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.',
+'revertpage' => 'Hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Mesac]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.',
 'revertpage-nouser' => '(nameyê karberi veteyo) no keso ke vuriyayiş kerdo vuriyayişê no kesi hetê no [[User:$1|$1]] kesi ra tepiya anciyayo',
 'rollback-success' => 'vurnayişê no kesi $1 tepiya geriyayo u hetê no
 $2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.',
@@ -2434,7 +2454,7 @@ no kar semedê dızdiyê hesabi ibtal biyo.
 kerem kerê "tepiya" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar kerê , newe ra tesel/cereb kerê.',
 
 # Protect
-'protectlogpage' => 'Logê kılit-kerdışi',
+'protectlogpage' => 'Qeydê staryayan',
 'protectlogtext' => 'Şıma vurnayişê gırewtışê/wedarnayışê pawıtişi vinenê.
 Qey malumato ziyede [[Special:ProtectedPages|Peleyê ke star biye]] bewni rê êna .',
 'protectedarticle' => '"[[$1]]" kılit biyo',
@@ -2527,7 +2547,8 @@ Revizyoni ya hewn a biyê ya arşiw ra veciyayê ya zi cıresayişê şımayi ş
 'undeletedrevisions' => 'pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni',
 'undeletedfiles' => '{{PLURAL:$1|1 dosya|$1 dosya}} tepiya anciyayi.',
-'cannotundelete' => 'şıma ya ver yewna ten pel u medya tepiya ard u ê ra tepiya ardışê şıma meqbul niyo.',
+'cannotundelete' => 'Besternayışo nêbeno:
+$1',
 'undeletedpage' => "'''$1 pel tepiya anciya'''
 
 qey karê tepiya ardışi u qey karê hewn a kerdışê verıni bıewnê [[Special:Log/delete|qeydê hewn a kerdışi]].",
@@ -2553,21 +2574,21 @@ $1',
 
 # Namespace form on various pages
 'namespace' => 'Cayê namey:',
-'invert' => 'Bê weçineni ê bina peyser biya',
+'invert' => 'Weçinıtışo peyserki',
 'tooltip-invert' => 'nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê',
-'namespace_association' => 'Cayê nameyanê elaqadaran',
+'namespace_association' => 'Cayê nameyanê eleqedaran',
 'tooltip-namespace_association' => 'Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê',
 'blanknamespace' => '(Ser)',
 
 # Contributions
-'contributions' => 'İştiraqê karberi',
-'contributions-title' => '$1 de iştırakê karberi',
-'mycontris' => 'Dekerdeni',
+'contributions' => 'İştiraqê {{GENDER:$1|Karber}}i',
+'contributions-title' => 'Dekerdenê karber de $1',
+'mycontris' => 'İştıraqi',
 'contribsub2' => 'Qandê $1 ($2)',
 'nocontribs' => 'Ena kriteriya de vurnayîş çini yo.',
-'uctop' => '(ser)',
-'month' => 'Aşm ra (u verniyer):',
-'year' => 'Serre ra (u verênêr):',
+'uctop' => '(top)',
+'month' => 'Aşm:',
+'year' => 'Ser:',
 
 'sp-contributions-newbies' => 'Tenya iştıraqanê karberanê neweyan bımocne',
 'sp-contributions-newbies-sub' => 'Qe hesebê newe',
@@ -2582,28 +2603,28 @@ $1',
 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-search' => 'Dekerdena cı geyrê',
 'sp-contributions-username' => 'Adresa IP yana namey karberi:',
 'sp-contributions-toponly' => 'Tenya rewizyonanê tewr peyniyan bimocne',
 'sp-contributions-submit' => 'Cı geyre',
 
 # What links here
-'whatlinkshere' => 'Çı tiyay rê gırê beno',
-'whatlinkshere-title' => 'Peleye ke  "$1" re gre biyê',
-'whatlinkshere-page' => 'Per:',
+'whatlinkshere' => 'Gıreyê pele',
+'whatlinkshere-title' => 'Per da "$1" rê perê ke gre danê',
+'whatlinkshere-page' => 'Pele:',
 'linkshere' => "Ena peleyan grey biya '''[[:$1]]''':",
-'nolinkshere' => "Yew pel zi '''[[:$1]]''' rê link nibeno.",
+'nolinkshere' => "Per da '''[[:$1]]''' rê pera ke gıre dana çıniya.",
 'nolinkshere-ns' => "Ena cayê nameyî de yew pel zi '''[[:$1]]''' rê link nibeno.",
-'isredirect' => 'pele redireksiyon',
-'istemplate' => 'Çarnayışin',
+'isredirect' => 'pera hetenayışi',
+'istemplate' => 'Açarnayene',
 'isimage' => 'gıreyê dosya',
 'whatlinkshere-prev' => '{{PLURAL:$1|veror|veror $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|verni|verni $1}}',
 'whatlinkshere-links' => '← gırey',
-'whatlinkshere-hideredirs' => 'Hetekerdışa $1',
+'whatlinkshere-hideredirs' => 'Hetenayışê $1',
 'whatlinkshere-hidetrans' => 'Açarnayışê $1',
-'whatlinkshere-hidelinks' => '$1 greyan',
-'whatlinkshere-hideimages' => 'gireyê resimî $1',
+'whatlinkshere-hidelinks' => 'Greyê $1',
+'whatlinkshere-hideimages' => 'Gıreyê dosya $1',
 'whatlinkshere-filters' => 'Avrêci',
 
 # Block/unblock
@@ -2632,7 +2653,7 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipbenableautoblock' => 'verniyê IPadresa peyin ê no karberi u wexta ke vurnayişi kerd ê IPadresani otomotik bıger.',
 'ipbsubmit' => 'Ena karber blok bike',
 'ipbother' => 'Waxtê bini:',
-'ipboptions' => '2 seat:2 hours,1 roc:1 day,3 roc:3 days,1 hefte:1 week,2 hefte:2 weeks,1 aşm:1 month,3 aşm:3 months,6 aşm:6 months,1 aşm:1 year,ebedi:infinite',
+'ipboptions' => '2 seat:2 hours,1 roc:1 day,3 roci:3 days,1 hefte:1 week,2 heftey:2 weeks,1 aşm:1 month,3 aşm:3 months,6 aşmi:6 months,1 ser:1 year,ebedi:infinite',
 'ipbotheroption' => 'bini',
 'ipbotherreason' => 'Sebebê bini:',
 'ipbhidename' => 'Nameyê karberî listeyan u vurnayîşan ra binumne',
@@ -2683,16 +2704,16 @@ Cıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:',
 'ipblocklist-empty' => 'Listeyê blokî veng o.',
 'ipblocklist-no-results' => 'Adresa IPya waştiye ya zi namey karberi kılit nêbiyo.',
 'blocklink' => 'kılit ke',
-'unblocklink' => 'ake',
+'unblocklink' => 'bloqi hewad',
 'change-blocklink' => 'kılit-kerdışi bıvurne',
-'contribslink' => 'pêşteni',
+'contribslink' => 'iştıraqi',
 'emaillink' => 'e-poste bırışe',
 'autoblocker' => 'Şıma otomatikmen kılit biy, çıke adresa şımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gureniyena.
 Sebebê kılit-biyayışê $1\'i: "$2"o',
-'blocklogpage' => 'Protokolê kıliti',
+'blocklogpage' => 'Qeydê bloqi',
 'blocklog-showlog' => 'verniyê no/na karberi cıwa ver geriyayo/ya.',
 'blocklog-showsuppresslog' => 'verniyê no/na karberi cıwa ver geriyayo/ya.',
-'blocklogentry' => '[[$1]] block kerd, hetani $2 $3',
+'blocklogentry' => 'Karberê [[$1]] ke bloqe, bloqey cı hetana $2 $3 do bıramo.',
 'reblock-logentry' => 'qey [[$1]]i tarixê qediyayişi $2 $3 pa ninan a eyarê ver-grewtışan vurna.',
 'blocklogtext' => "No kuliyatê kılitkerdış u rakerdışê fealiyetê karberano.
 Adresê IP'ya ke otomatikmen kılit biyê lista de çıniya.
@@ -2814,7 +2835,7 @@ Yewna name bınus.',
 'movepage-page-moved' => 'pelê $1i kırışiya pelê $2i.',
 'movepage-page-unmoved' => 'pelê $1i nêkırışiyeno sernameyê $2i.',
 'movepage-max-pages' => 'tewr ziyed $1 {{PLURAL:$1|peli|peli}} kırışiya u hıni ziyedê ıney otomotikmen nêkırışiyeno.',
-'movelogpage' => 'Logê berdışi',
+'movelogpage' => 'Qeydê berdışi',
 'movelogpagetext' => 'nameyê liste ya ke cêr de yo, pelê vuriyayeyani mocneno',
 'movesubpage' => '{{PLURAL:$1|Subpage|pelê bınıni}}',
 'movesubpagetext' => '{{PLURAL:$1|pelê bınıni yê|pelê bınıni yê}} no $1 peli cer de yo.',
@@ -2833,6 +2854,7 @@ Yewna name bınus.',
 'immobile-target-namespace-iw' => 'xetê benatê wikiyan, hedefê pelkırıştış niyo',
 'immobile-source-page' => 'nameyê no peli nêvuriyeno',
 'immobile-target-page' => 'sernameyê no hedefi re nêkırışiyeno',
+'bad-target-model' => 'Hedefo ke waştiyayo zerreke cı babetna model karneno. Ke nêşeno $1 ra açarno $2.',
 'imagenocrossnamespace' => 'Dosya, ca yo ke qey nameyê dosyayan nêbıbo nêkırışiyeno',
 'nonfile-cannot-move-to-file' => 'Ekê dosya niyê, cade namande dosyaya nêahulneyênê',
 'imagetypemismatch' => 'tipa dosyaya neweyi re pênêgıneno/nêgıneno pê',
@@ -2872,8 +2894,8 @@ ma vaci: qey pelê "[[{{MediaWiki:Mainpage}}]]i " [[{{#Special:Export}}/{{MediaW
 # Namespace 8 related
 'allmessages' => 'Mesacê sistemi',
 'allmessagesname' => 'Name',
-'allmessagesdefault' => 'Hesıbyaye metnê mesaci',
-'allmessagescurrent' => 'nuşte yo ke Karyayo',
+'allmessagesdefault' => 'Metnê mesacê hesabiyayey',
+'allmessagescurrent' => 'Nuşteyê mesacê rocaney',
 '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.",
@@ -2883,7 +2905,7 @@ eke şıma qayili paşt bıdi mahalli kerdışê wikimedyayi, kerem kerê pelê
 'allmessages-filter-all' => 'Pêro',
 'allmessages-filter-modified' => 'Vurnaye',
 'allmessages-prefix' => 'pê prefiks filtre bıker',
-'allmessages-language' => 'Ziwan:',
+'allmessages-language' => 'Zıwan:',
 'allmessages-filter-submit' => 'Şo',
 
 # Thumbnails
@@ -2951,16 +2973,15 @@ dosyaya emaneti vindbiyo',
 'import-rootpage-nosubpage' => 'Qan de bınnaman reçe de "$1" re mısade nedano.',
 
 # Import log
-'importlogpage' => 'Logê împortî',
+'importlogpage' => 'Defterê seyırio idxal',
 'importlogpagetext' => 'wiki yo ke nişane biyo tera kırıştışê zerredayişi nêbeno.',
 'import-logentry-upload' => 'dosyayê bar kerdişî ra [[$1]] împort biyo',
-'import-logentry-upload-detail' => '$1 {{PLURAL:$1|revizyon|revizyonî}}',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|çımraviyarnayış|çımraviyarnayışi}}',
 'import-logentry-interwiki' => '$1 transwiki biyo',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|revizyon|revizyonî}} $2 ra',
 
 # JavaScriptTest
-'javascripttest' => 'Cerbnayışê JavaScripti',
-'javascripttest-disabled' => 'Na kerdin, na wiki sero aktiv nêbiya.',
+'javascripttest' => 'Cerebnayışê JavaScripti',
 'javascripttest-title' => 'Testê $1 gurweyênê',
 'javascripttest-pagetext-noframework' => 'Na pela testanê JavaScripta gurweynayışi re abıryaya.',
 'javascripttest-pagetext-unknownframework' => 'Çerçeweyê "$1" cerbnayışi xırabo.',
@@ -2976,36 +2997,35 @@ 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' => 'Listey iştıraqa',
-'tooltip-pt-login' => 'Seba cıkewtışi şıma rê dewato; labelê, no zeruri niyo',
+'tooltip-pt-mycontris' => 'Yew lista iştıraqanê şıma',
+'tooltip-pt-login' => 'Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo',
 'tooltip-pt-anonlogin' => 'Seba cıkewtışi şıma rê dewato; labelê, no zeruri niyo',
-'tooltip-pt-logout' => 'Bıveciyên',
+'tooltip-pt-logout' => 'Bıveciye',
 'tooltip-ca-talk' => 'Zerrey pela sero werênayış',
 'tooltip-ca-edit' => 'Tı şenay na pele bıvurnê.
 Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-ca-addsection' => 'Yew qısımo newe ake',
-'tooltip-ca-viewsource' => 'Ena pele kılit biyo.
-
-Çımey ena pele bıvin',
+'tooltip-ca-viewsource' => 'Ena pele kılit biya.
+Şıma şenê çımeyê aye bıvênê',
 'tooltip-ca-history' => 'Versiyonê verênê ena pele',
 'tooltip-ca-protect' => 'Ena pele kılit ke',
 'tooltip-ca-unprotect' => 'Starkerdışe ena peler bıvurne',
-'tooltip-ca-delete' => 'Ena pele bıestere',
+'tooltip-ca-delete' => 'Ena perer besternê',
 'tooltip-ca-undelete' => 'peli biyarê halê ver hewnakerdışi',
 'tooltip-ca-move' => 'Ena pele bere',
-'tooltip-ca-watch' => 'Ena pela lista mına seyr-kerdışi ri dek',
+'tooltip-ca-watch' => 'Ena pele lista xoya seyrkerdışi ke',
 'tooltip-ca-unwatch' => 'Ena pele listeya seyir-kerdışi xo ra bıvec',
 'tooltip-search' => 'Zerreyê {{SITENAME}} de cı geyre',
 'tooltip-search-go' => 'Ebe nê namey tami şo yew pela ke esta',
-'tooltip-search-fulltext' => 'Seba nê meqaley pelan seha ke',
-'tooltip-p-logo' => 'Pela seri',
+'tooltip-search-fulltext' => 'Nê  metni peran dı cı geyre',
+'tooltip-p-logo' => 'Pela seri bıvênên',
 'tooltip-n-mainpage' => 'Şo pela seri',
 'tooltip-n-mainpage-description' => 'Şo pela seri',
-'tooltip-n-portal' => 'Heqa projey de, çı şenay bıkerê, çı koti vêniyeno',
+'tooltip-n-portal' => 'Heqa projey de, kes çı şeno bıkero, çıçiyo koti deyo',
 'tooltip-n-currentevents' => 'Vurnayışanê peyênan de melumatê pey bıvêne',
 'tooltip-n-recentchanges' => 'Wiki de lista vurnayışanê peyênan',
-'tooltip-n-randompage' => 'Pelê da raştamayiye bar ke',
-'tooltip-n-help' => 'Cayê doşkerdışi',
+'tooltip-n-randompage' => 'Şırê pera ke raştameyê',
+'tooltip-n-help' => 'Cayê doskerdışi',
 'tooltip-t-whatlinkshere' => 'Lista pelanê wikiya pêroina ke tiya gırê bena',
 'tooltip-t-recentchangeslinked' => 'Vurnayışê peyênê pelanê ke ena pela ra gırê biyê',
 'tooltip-feed-rss' => 'RSS feed qe ena pele',
@@ -3013,35 +3033,548 @@ Kerem ke, qeydkerdış ra ver gocega verqayti bıxebetne.',
 'tooltip-t-contributions' => 'İştirakanê ena karber bevin',
 'tooltip-t-emailuser' => 'Ena karber ri yew email bışırav',
 'tooltip-t-upload' => 'Dosya bar ke',
-'tooltip-t-specialpages' => 'Lista pelanê xasanê pêroinan',
+'tooltip-t-specialpages' => 'Yew lista pelanê xasanê pêroyinan',
 'tooltip-t-print' => 'Nımuney çapkerdışiê ena pele',
 'tooltip-t-permalink' => 'Gırêyo daimi be ena versiyonê pele',
 'tooltip-ca-nstab-main' => 'Pela zerreki bımocne',
 'tooltip-ca-nstab-user' => 'Pela karberi bıvin',
 'tooltip-ca-nstab-media' => 'Pele Mediya bivinên',
 'tooltip-ca-nstab-special' => 'Na yew pelê da xususiya, şıma nêşenê nae bıvurnê',
-'tooltip-ca-nstab-project' => 'pelayê kılit-kerdeyi bıvin',
+'tooltip-ca-nstab-project' => 'Pela procey bıvêne',
 'tooltip-ca-nstab-image' => 'Pelay dosya bımocne',
 'tooltip-ca-nstab-mediawiki' => 'Mesacê sistemi bivinên',
-'tooltip-ca-nstab-template' => 'Şabloni bıvêne',
+'tooltip-ca-nstab-template' => 'Şabloni bıvinê',
 'tooltip-ca-nstab-help' => 'Peleyê yardimi bivinên',
 'tooltip-ca-nstab-category' => 'Pele kategoriyan bevinin',
 'tooltip-minoredit' => 'Eno vurnayışê qıçkeko',
 'tooltip-save' => 'Vurnayışanê xo qeyd ke',
 'tooltip-preview' => 'Vurnayışê xo bıvin. Verniyê qeyd kerdışi, vurnayışê xo ena pele dı control bık.',
-'tooltip-diff' => 'Vurnayışe mı bımoc',
-'tooltip-compareselectedversions' => 'Ferqê versiyonan bevinin',
+'tooltip-diff' => 'Metni sero vurnayışan mocneno',
+'tooltip-compareselectedversions' => 'Ena per de ferqê rewziyonan de dı weçinaya bıvinê',
 'tooltip-watch' => 'Eno pele listey tıyo seyir-kerdişi ri dek',
 'tooltip-watchlistedit-normal-submit' => 'Sernuşteya hewad',
 'tooltip-watchlistedit-raw-submit' => 'Listeyê seyri newen ke',
 'tooltip-recreate' => 'pel hewn a bışiyo zi tepiya biya',
-'tooltip-upload' => 'Bar bike',
-'tooltip-rollback' => '"Peyser biya" be yew tik pela îştirak(an)ê peyên|i(an) peyser ano.',
+'tooltip-upload' => 'Dest be barkerdışi ke',
+'tooltip-rollback' => '"Peyser bia" be yew tık pela iştıraq(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' => 'Terciha qeyd ke',
 'tooltip-summary' => 'Yew xulasaya kilm binuse',
 
+# Scripts
+'common.js' => "/**
+ * Keep code in MediaWiki:Common.js to a minimum as it is unconditionally
+ * loaded for all users on every wiki page. If possible create a gadget that is
+ * enabled by default instead of adding it here (since gadgets are fully
+ * optimized ResourceLoader modules with possibility to add dependencies etc.)
+ *
+ * Since common.js isn't a gadget, there is no place to declare its
+ * dependencies, so we have to lazy load them with mw.loader.using on demand and
+ * then execute the rest in the callback. In most cases these dependencies will
+ * be loaded (or loading) already and the callback will not be delayed. In case a
+ * dependency hasn't arrived yet it'll make sure those are loaded before this.
+ */
+mw.loader.using( 'mediawiki.util', function() {
+/* Begin of mw.loader.using callback */
+
+/**
+ * Redirect User:Name/skin.js and skin.css to the current skin's pages
+ * (unless the 'skin' page really exists)
+ * @source: http://www.mediawiki.org/wiki/Snippets/Redirect_skin.js
+ * @rev: 2
+ */
+if ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgNamespaceNumber' ) == 2 ) {
+       var titleParts = mw.config.get( 'wgPageName' ).split( '/' );
+       // Make sure there was a part before and after the slash
+       // And that the latter is 'skin.js' or 'skin.css'
+       if ( titleParts.length == 2 ) {
+               var userSkinPage = titleParts.shift() + '/' + mw.config.get( 'skin' );
+               if ( titleParts.slice(-1) == 'skin.js' ) {
+                       window.location.href = mw.util.wikiGetlink( userSkinPage + '.js' );
+               } else if ( titleParts.slice(-1) == 'skin.css' ) {
+                       window.location.href = mw.util.wikiGetlink( userSkinPage + '.css' );
+               }
+       }
+}
+
+/** Map addPortletLink to mw.util 
+ */
+window.addPortletLink = function() {
+    return mw.util.addPortletLink.apply( mw.util, arguments );
+};
+
+/** extract a URL parameter from the current URL **********
+ *
+ * @deprecated: Use mw.util.getParamValue with proper escaping
+ */
+window.getURLParamValue = function() {
+    return mw.util.getParamValue.apply( mw.util, arguments );
+};
+
+/** &withCSS= and &withJS= URL parameters *******
+ * Allow to try custom scripts from MediaWiki space 
+ * without editing personal .css or .js files
+ */
+var extraCSS = mw.util.getParamValue(\"withCSS\");
+if ( extraCSS && extraCSS.match(/^MediaWiki:[^&<>=%]*\\.css\$/) ) {
+    importStylesheet(extraCSS);
+}
+var extraJS = mw.util.getParamValue(\"withJS\");
+if ( extraJS && extraJS.match(/^MediaWiki:[^&<>=%]*\\.js\$/) ) {
+    importScript(extraJS);
+}
+
+
+/* Import more specific scripts if necessary */
+if (wgAction == 'edit' || wgAction == 'submit' || wgPageName == 'Special:Upload') { //scripts specific to editing pages
+    importScript('MediaWiki:Common.js/edit.js');
+}
+else if (mw.config.get('wgPageName') == 'Special:Watchlist') { //watchlist scripts
+    mw.loader.load(mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=MediaWiki:Common.js/watchlist.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');
+}
+
+if ( wgNamespaceNumber == 6 ) {
+    importScript('MediaWiki:Common.js/file.js');
+}
+
+/**
+ * WikiMiniAtlas
+ *
+ *  Description: WikiMiniAtlas is a popup click and drag world map.
+ *               This script causes all of our coordinate links to display the WikiMiniAtlas popup button.
+ *               The script itself is located on meta because it is used by many projects.
+ *               See [[Meta:WikiMiniAtlas]] for more information. 
+ *  Maintainers: [[User:Dschwen]]
+ */
+
+mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript&smaxage=21600&maxage=86400');
+
+/* Scripts specific to Internet Explorer */
+if (\$.client.profile().name == 'msie') {
+    /** Internet Explorer bug fix **************************************************
+     *
+     *  Description: Fixes IE horizontal scrollbar bug
+     *  Maintainers: [[User:Tom-]]?
+     */
+    
+    var oldWidth;
+    var docEl = document.documentElement;
+    
+    var fixIEScroll = function() {
+        if (!oldWidth || docEl.clientWidth > oldWidth) {
+            doFixIEScroll();
+        } else {
+            setTimeout(doFixIEScroll, 1);
+        }
+        
+        oldWidth = docEl.clientWidth;
+    };
+    
+    var doFixIEScroll = function () {
+        docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? \"hidden\" : \"\";
+    };
+    
+    document.attachEvent(\"onreadystatechange\", fixIEScroll);
+    document.attachEvent(\"onresize\", fixIEScroll);
+    
+    // In print IE (7?) does not like line-height
+    mw.util.addCSS('@media print { sup, sub, p, .documentDescription { line-height: normal; } }');
+
+    // IE overflow bug
+    mw.util.addCSS('div.overflowbugx { overflow-x: scroll !important; overflow-y: hidden !important; } '
+      + 'div.overflowbugy { overflow-y: scroll !important; overflow-x: hidden !important; }');
+
+    // IE zoomfix
+    // Use to fix right floating div/table inside tables
+    mw.util.addCSS('.iezoomfix div, .iezoomfix table { zoom: 1; }');
+
+    // Import scripts specific to Internet Explorer 6
+    if (\$.client.profile().versionBase == '6') {
+        importScript('MediaWiki:Common.js/IE60Fixes.js');
+    }
+}
+
+/* Fixes for Windows XP font rendering */
+if (navigator.appVersion.search(/windows nt 5/i) != -1) {
+    mw.util.addCSS('.IPA {font-family: \"Lucida Sans Unicode\", \"Arial Unicode MS\";} ' + 
+                   '.Unicode {font-family: \"Arial Unicode MS\", \"Lucida Sans Unicode\";}');
+}
+
+/* Helper script for .hlist class in Common.css
+ * Last updated: September 12, 2012
+ * Maintainer: [[User:Edokter]]
+ */
+if ( \$.client.profile().name == 'msie' ) {
+    /* Add pseudo-selector class to last-child list items in IE 8 */
+    if ( \$.client.profile().versionBase == '8' ) {
+        \$( '.hlist' ).find( 'dd:last-child, dt:last-child, li:last-child' )
+            .addClass( 'hlist-last-child' );
+    }
+    /* Generate interpuncts and parens for IE < 8 */
+    if ( \$.client.profile().versionBase < '8' ) {
+        var hlists = \$( '.hlist' );
+        hlists.find( 'dt:not(:last-child)' )
+            .append( ': ' );
+        hlists.find( 'dd:not(:last-child)' )
+            .append( '<b>·</b> ' );
+        hlists.find( 'li:not(:last-child)' )
+            .append( '<b>·</b> ' );
+        hlists.find( 'dl dl, ol ol, ul ul' )
+            .prepend( '( ' ).append( ') ' );
+    }
+}
+
+/* Test if an element has a certain class
+ * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]]
+ *
+ * @deprecated:  Use \$(element).hasClass() instead.
+ */
+
+window.hasClass = ( function() {
+    var reCache = {};
+    return function (element, className) {
+        return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp(\"(?:\\\\s|^)\" + className + \"(?:\\\\s|\$)\"))).test(element.className);
+    };
+})();
+
+
+/** Interwiki links to featured articles ***************************************
+ *
+ *  Description: Highlights interwiki links to featured articles (or
+ *               equivalents) by changing the bullet before the interwiki link
+ *               into a star.
+ *  Maintainers: [[User:R. Koot]]
+ */
+
+function LinkFA() {
+    if ( document.getElementById( \"p-lang\" ) ) {
+        var InterwikiLinks = document.getElementById( \"p-lang\" ).getElementsByTagName( \"li\" );
+
+        for ( var i = 0; i < InterwikiLinks.length; i++ ) {
+            if ( document.getElementById( InterwikiLinks[i].className + \"-fa\" ) ) {
+                InterwikiLinks[i].className += \" FA\";
+                InterwikiLinks[i].title = \"This is a featured article in another language.\";
+            } else if ( document.getElementById( InterwikiLinks[i].className + \"-ga\" ) ) {
+                InterwikiLinks[i].className += \" GA\";
+                InterwikiLinks[i].title = \"This is a good article in another language.\";
+            }
+        }
+    }
+}
+
+\$( LinkFA );
+
+
+/** Collapsible tables *********************************************************
+ *
+ *  Description: Allows tables to be collapsed, showing only the header. See
+ *               [[Wikipedia:NavFrame]].
+ *  Maintainers: [[User:R. Koot]]
+ */
+
+var autoCollapse = 2;
+var collapseCaption = \"bınımne\";
+var expandCaption = \"bıvin\";
+
+window.collapseTable = function( tableIndex ){
+    var Button = document.getElementById( \"collapseButton\" + tableIndex );
+    var Table = document.getElementById( \"collapsibleTable\" + tableIndex );
+
+    if ( !Table || !Button ) {
+        return false;
+    }
+
+    var Rows = Table.rows;
+
+    if ( Button.firstChild.data == collapseCaption ) {
+        for ( var i = 1; i < Rows.length; i++ ) {
+            Rows[i].style.display = \"none\";
+        }
+        Button.firstChild.data = expandCaption;
+    } else {
+        for ( var i = 1; i < Rows.length; i++ ) {
+            Rows[i].style.display = Rows[0].style.display;
+        }
+        Button.firstChild.data = collapseCaption;
+    }
+}
+
+function createCollapseButtons(){
+    var tableIndex = 0;
+    var NavigationBoxes = new Object();
+    var Tables = document.getElementsByTagName( \"table\" );
+
+    for ( var i = 0; i < Tables.length; i++ ) {
+        if ( hasClass( Tables[i], \"collapsible\" ) ) {
+
+            /* only add button and increment count if there is a header row to work with */
+            var HeaderRow = Tables[i].getElementsByTagName( \"tr\" )[0];
+            if (!HeaderRow) continue;
+            var Header = HeaderRow.getElementsByTagName( \"th\" )[0];
+            if (!Header) continue;
+
+            NavigationBoxes[ tableIndex ] = Tables[i];
+            Tables[i].setAttribute( \"id\", \"collapsibleTable\" + tableIndex );
+
+            var Button     = document.createElement( \"span\" );
+            var ButtonLink = document.createElement( \"a\" );
+            var ButtonText = document.createTextNode( collapseCaption );
+
+            Button.className = \"collapseButton\";  //Styles are declared in Common.css
+
+            ButtonLink.style.color = Header.style.color;
+            ButtonLink.setAttribute( \"id\", \"collapseButton\" + tableIndex );
+            ButtonLink.setAttribute( \"href\", \"#\" );
+            addHandler( ButtonLink,  \"click\", new Function( \"evt\", \"collapseTable(\" + tableIndex + \" ); return killEvt( evt );\") );
+            ButtonLink.appendChild( ButtonText );
+
+            Button.appendChild( document.createTextNode( \"[\" ) );
+            Button.appendChild( ButtonLink );
+            Button.appendChild( document.createTextNode( \"]\" ) );
+
+            Header.insertBefore( Button, Header.firstChild );
+            tableIndex++;
+        }
+    }
+
+    for ( var i = 0;  i < tableIndex; i++ ) {
+        if ( hasClass( NavigationBoxes[i], \"collapsed\" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], \"autocollapse\" ) ) ) {
+            collapseTable( i );
+        } 
+        else if ( hasClass( NavigationBoxes[i], \"innercollapse\" ) ) {
+            var element = NavigationBoxes[i];
+            while (element = element.parentNode) {
+                if ( hasClass( element, \"outercollapse\" ) ) {
+                    collapseTable ( i );
+                    break;
+                }
+            }
+        }
+    }
+}
+
+\$( createCollapseButtons );
+
+
+/** Dynamic Navigation Bars (experimental) *************************************
+ *
+ *  Description: See [[Wikipedia:NavFrame]].
+ *  Maintainers: UNMAINTAINED
+ */
+
+// set up the words in your language
+var NavigationBarHide = '[' + collapseCaption + ']';
+var NavigationBarShow = '[' + expandCaption + ']';
+
+// shows and hides content and picture (if available) of navigation bars
+// Parameters:
+//     indexNavigationBar: the index of navigation bar to be toggled
+window.toggleNavigationBar = function(indexNavigationBar){
+    var NavToggle = document.getElementById(\"NavToggle\" + indexNavigationBar);
+    var NavFrame = document.getElementById(\"NavFrame\" + indexNavigationBar);
+
+    if (!NavFrame || !NavToggle) {
+        return false;
+    }
+
+    // if shown now
+    if (NavToggle.firstChild.data == NavigationBarHide) {
+        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
+            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
+                NavChild.style.display = 'none';
+            }
+        }
+    NavToggle.firstChild.data = NavigationBarShow;
+
+    // if hidden now
+    } else if (NavToggle.firstChild.data == NavigationBarShow) {
+        for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
+            if (hasClass(NavChild, 'NavContent') || hasClass(NavChild, 'NavPic')) {
+                NavChild.style.display = 'block';
+            }
+        }
+        NavToggle.firstChild.data = NavigationBarHide;
+    }
+}
+
+// adds show/hide-button to navigation bars
+function createNavigationBarToggleButton(){
+    var indexNavigationBar = 0;
+    // iterate over all < div >-elements 
+    var divs = document.getElementsByTagName(\"div\");
+    for (var i = 0; NavFrame = divs[i]; i++) {
+        // if found a navigation bar
+        if (hasClass(NavFrame, \"NavFrame\")) {
+
+            indexNavigationBar++;
+            var NavToggle = document.createElement(\"a\");
+            NavToggle.className = 'NavToggle';
+            NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
+            NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');');
+
+            var isCollapsed = hasClass( NavFrame, \"collapsed\" );
+            /*
+             * Check if any children are already hidden.  This loop is here for backwards compatibility:
+             * the old way of making NavFrames start out collapsed was to manually add style=\"display:none\"
+             * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
+             * the content visible without JavaScript support), the new recommended way is to add the class
+             * \"collapsed\" to the NavFrame itself, just like with collapsible tables.
+             */
+            for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) {
+                if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
+                    if ( NavChild.style.display == 'none' ) {
+                        isCollapsed = true;
+                    }
+                }
+            }
+            if (isCollapsed) {
+                for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) {
+                    if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) {
+                        NavChild.style.display = 'none';
+                    }
+                }
+            }
+            var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide);
+            NavToggle.appendChild(NavToggleText);
+
+            // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
+            for(var j=0; j < NavFrame.childNodes.length; j++) {
+                if (hasClass(NavFrame.childNodes[j], \"NavHead\")) {
+                    NavToggle.style.color = NavFrame.childNodes[j].style.color;
+                    NavFrame.childNodes[j].appendChild(NavToggle);
+                }
+            }
+            NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
+        }
+    }
+}
+
+\$( createNavigationBarToggleButton );
+
+
+/** Main Page layout fixes *********************************************************
+ *
+ *  Description: Adds an additional link to the complete list of languages available.
+ *  Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]]
+ */
+
+if (wgPageName == 'Main_Page' || wgPageName == 'Talk:Main_Page') {
+    \$(function () {
+        mw.util.addPortletLink('p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias',
+            'Complete list', 'interwiki-completelist', 'Complete list of Wikipedias');
+    });
+}
+
+
+/** Table sorting fixes ************************************************
+  *
+  *  Description: Disables code in table sorting routine to set classes on even/odd rows
+  *  Maintainers: [[User:Random832]]
+  */
+ts_alternate_row_colors = false;
+
+
+/***** uploadwizard_newusers ********
+ * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]]
+ *
+ *  Maintainers: [[User:Krimpet]]
+ */
+function uploadwizard_newusers() {
+  if (wgNamespaceNumber == 4 && wgTitle == \"Upload\" && wgAction == \"view\") {
+    var oldDiv = document.getElementById(\"autoconfirmedusers\"),
+        newDiv = document.getElementById(\"newusers\");
+    if (oldDiv && newDiv) {
+      if (typeof wgUserGroups == \"object\" && wgUserGroups) {
+        for (i = 0; i < wgUserGroups.length; i++) {
+          if (wgUserGroups[i] == \"autoconfirmed\") {
+            oldDiv.style.display = \"block\";
+            newDiv.style.display = \"none\";
+            return;
+          }
+        }
+      }
+      oldDiv.style.display = \"none\";
+      newDiv.style.display = \"block\";
+      return;
+    }
+  }
+}
+\$(uploadwizard_newusers);
+
+
+/** IPv6 AAAA connectivity testing 
+
+var __ipv6wwwtest_factor = 100;
+var __ipv6wwwtest_done = 0;
+if ((wgServer != \"https://secure.wikimedia.org\") && (Math.floor(Math.random()*__ipv6wwwtest_factor)==42)) {
+    importScript(\"MediaWiki:Common.js/IPv6.js\");
+}
+**/
+
+/** Magic editintros ****************************************************
+ *
+ *  Description: Adds editintros on disambiguation pages and BLP pages.
+ *  Maintainers: [[User:RockMFR]]
+ */
+
+function addEditIntro( name ) {
+  \$( '.editsection, #ca-edit' ).find( 'a' ).each( function( i, el ) {
+    el.href = \$(this).attr(\"href\") + '&editintro=' + name;
+  });
+}
+
+if (wgNamespaceNumber === 0) {
+  \$(function(){
+    if (document.getElementById('disambigbox')) {
+      addEditIntro('Template:Disambig_editintro');
+    }
+  });
+
+  \$(function(){
+    var cats = document.getElementById('mw-normal-catlinks');
+    if (!cats) {
+      return;
+    }
+    cats = cats.getElementsByTagName('a');
+    for (var i = 0; i < cats.length; i++) {
+      if (cats[i].title == 'Category:Living people' || cats[i].title == 'Category:Possibly living people') {
+        addEditIntro('Template:BLP_editintro');
+        break;
+      }
+    }
+  });
+}
+
+/**
+ * Description: Stay on the secure server as much as possible
+ * Maintainers: [[User:TheDJ]]
+ */
+if ( mw.config.get('wgServer') == 'https://secure.wikimedia.org' ) {
+    /* Old secure server */
+    importScript( 'MediaWiki:Common.js/secure.js');
+} else if( document.location && document.location.protocol  && document.location.protocol == \"https:\" ) {
+  /* New secure servers */
+  importScript('MediaWiki:Common.js/secure new.js');
+}
+
+/**
+  * Description: Fix the toggle for Mobile view
+  * https://bugzilla.wikimedia.org/show_bug.cgi?id=38009
+  * Maintainer: [[User:TheDJ]]
+  */
+mw.loader.using( 'jquery.cookie', function() {
+    \$('a[href\$=\"toggle_view_mobile\"]').click(function(){
+        document.cookie = 'stopMobileRedirect=false; domain=.wikipedia.org;'
+                    + 'path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT;'
+    });
+});
+
+/* End of mw.loader.using callback */
+} );
+/* DO NOT ADD CODE BELOW THIS LINE */",
+
 # Metadata
 'notacceptable' => "formatê ma'lumati no peşkeşwanê wikiyi nêweniyeno.",
 
@@ -3068,34 +3601,44 @@ Tı eşkeno yew sebeb bınus.',
 
 # Info page
 'pageinfo-title' => 'Heq tê "$1"\'i',
+'pageinfo-not-current' => 'Qısur de mevêne, rewizyonanê verênan rê nê melumatan dayış mumkın niyo',
 '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-header-edits' => 'Vurnayışê verêni',
+'pageinfo-header-restrictions' => 'Sıtarkerdışê pele',
+'pageinfo-header-properties' => 'Xısusiyetê pele',
+'pageinfo-display-title' => 'Sernuştey bımocne',
 'pageinfo-default-sort' => 'Hesıbyaye mırfeyo kılm',
 'pageinfo-length' => 'Derdeya pela (bayti heta)',
-'pageinfo-article-id' => 'Nımrey pela',
+'pageinfo-article-id' => 'Kamiya pele',
+'pageinfo-language' => 'Zıwanê zerreyê pele',
 'pageinfo-robot-policy' => 'Weziyetê motor de cıgeyrayışi',
 'pageinfo-robot-index' => 'İIndeksbiyayen',
 'pageinfo-robot-noindex' => 'İndeksnêbiyayen',
 'pageinfo-views' => 'Amarina mocnayışan',
 'pageinfo-watchers' => 'Amariya pela serykeran',
 'pageinfo-redirects-name' => 'Hetenayışê na pela',
+'pageinfo-redirects-value' => '$1',
 '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-lastuser' => 'Vurnayo 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 ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Çekuya|Çekuyê}} ($1) sihırini',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Kategoriye|Kategoriyan}} ($1) bınımne',
 'pageinfo-templates' => '{{PLURAL:$1|Şablon|Şabloni}} ($1) açarneyayê',
+'pageinfo-toolboxlink' => 'Melumatê pele',
+'pageinfo-redirectsto' => 'Beno hetê',
+'pageinfo-redirectsto-info' => 'melumat',
+'pageinfo-contentpage' => 'Zey jû pela zerreki hesebiyena',
+'pageinfo-contentpage-yes' => 'Heya',
+'pageinfo-protect-cascading' => 'Sıtarkerdey tiya cı ra yenê war',
+'pageinfo-protect-cascading-yes' => 'Heya',
+'pageinfo-protect-cascading-from' => 'Sıtarkerdey cı ra yenê war',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3109,7 +3652,7 @@ Tı eşkeno yew sebeb bınus.',
 'skinname-vector' => 'Vektor',
 
 # Patrolling
-'markaspatrolleddiff' => 'Nişan bike ke devriye biyo',
+'markaspatrolleddiff' => 'Nişan bıke ke dewriya biyo',
 'markaspatrolledtext' => 'Ena pele nişan bike ke devriye biyo',
 'markedaspatrolled' => 'Nişan biyo ke verni de devriye biyo',
 'markedaspatrolledtext' => 'Versiyone weçinaye [[:$1]] nişan biyo ke devriye biyo',
@@ -3118,6 +3661,8 @@ Tı eşkeno yew sebeb bınus.',
 'markedaspatrollederror' => 'Nişan nibeno ke devriye biyo',
 'markedaspatrollederrortext' => 'Ti gani revizyon işaret bike ke Nişanê devriye biyo',
 'markedaspatrollederror-noautopatrol' => 'Ti nieşkeno ke vurnayişê xo nişan bike ke devriye biyê.',
+'markedaspatrollednotify' => 'Na vurnayışa dewriye deye $1 nışan biyo.',
+'markedaspatrollederrornotify' => 'Nışan kerdışê dewriyey nêbı',
 
 # Patrol log
 'patrol-log-page' => 'Logê devriye',
@@ -3150,9 +3695,9 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'file-info-size' => '$1 × $2 pixelan, ebatê dosya: $3, MIME type: $4',
 'file-info-size-pages' => '$1 × $2 pikse, dergeya dosyay: $3, MIME tipiya cı: $4, $5 {{PLURAL:$5|pela|pela}}',
 'file-nohires' => 'Deha berz agozney cı çıniyo',
-'svg-long-desc' => 'SVG dosya, nominalin $1 × $2 piksels, ebatê dosya: $3',
+'svg-long-desc' => 'Dosyay SVG, zek vanê $1 × $2 piksela, ebatê dosya: $3',
 'svg-long-desc-animated' => 'SVG dosya, nominalin $1 × $2 piksela, ebatê dosya: $3',
-'show-big-image' => 'Resolosyonê temami',
+'show-big-image' => 'Tam agoznayen',
 'show-big-image-preview' => "Verqayd dergiya: $1'i.",
 'show-big-image-other' => 'Zewmi{{PLURAL:$2|Vılêşnayış|Vılêşnayışê}}: $1.',
 'show-big-image-size' => '$1 × $2 piksel',
@@ -3172,7 +3717,7 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'newimages-label' => 'Nameyê dosya ( ya zi parçe ey)',
 'showhidebots' => '(bota $1)',
 'noimages' => 'Çik çini yo.',
-'ilsubmit' => 'Cıgeyre',
+'ilsubmit' => 'Cı geyre',
 'bydate' => 'goreyê zemani',
 'sp-newimages-showfrom' => 'Dosyayê newi ke $2, $1 ra dest pe keni bimocne',
 
@@ -3187,6 +3732,7 @@ Gurênayışê nae de, beno ke sistemê şıma zerar bıvêno.",
 'hours' => 'Verdê {{PLURAL:$1|$1 seata|$1 seata}}',
 'days' => 'Verdê {{PLURAL:$1|$1 rocan|$1 rocan}}',
 'ago' => 'Verdê $1',
+'just-now' => 'Hema newke',
 
 # Bad image list
 'bad_image_list' => 'Şeklo umumi wınayo:
@@ -3366,7 +3912,7 @@ Eg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.'
 'exif-gpsaltituderef' => 'çımeyê berziyi',
 'exif-gpsaltitude' => 'berzî',
 'exif-gpstimestamp' => "Wextê GPSyi (se'eta atomiki)",
-'exif-gpssatellites' => 'Satellite yê ke pê peymawıtışi kenî',
+'exif-gpssatellites' => 'Qandê peymıtışi antenê ke vıstê kar',
 'exif-gpsstatus' => 'cayê gırewtoxi',
 'exif-gpsmeasuremode' => 'moda peymawıtışi',
 'exif-gpsdop' => 'karê peymawıtışi',
@@ -3469,7 +4015,7 @@ $8',
 
 # EXIF attributes
 'exif-compression-1' => 'Nêdegusneyayo',
-'exif-compression-2' => 'CCITT Group 3 1-Dimensiyonel dergeya cı timarkerdışê cı bıwanê',
+'exif-compression-2' => 'CCITT Grube 3 1-ebadın kodkerdışê dergiya gurenayışê Huffmanio modifiyekerde',
 'exif-compression-3' => 'CCITT Group 3 fax kodkerdış',
 'exif-compression-4' => 'CCITT Group 4 fax kodkerdış',
 'exif-compression-5' => 'LZW',
@@ -3526,7 +4072,7 @@ $8',
 
 'exif-subjectdistance-value' => '$1 metreyi',
 
-'exif-meteringmode-0' => 'Nêzanıte',
+'exif-meteringmode-0' => 'Nêzanayen',
 'exif-meteringmode-1' => 'orta',
 'exif-meteringmode-2' => 'gıraniyê merkeziyi ser',
 'exif-meteringmode-3' => 'noqtayın',
@@ -3535,7 +4081,7 @@ $8',
 'exif-meteringmode-6' => 'qısmî',
 'exif-meteringmode-255' => 'Bin',
 
-'exif-lightsource-0' => 'Nêzanıte',
+'exif-lightsource-0' => 'Nêzanayen',
 'exif-lightsource-1' => 'Roşnê Tici',
 'exif-lightsource-2' => 'Florasant',
 'exif-lightsource-3' => 'roşnê bêbızate',
@@ -3616,7 +4162,7 @@ $8',
 'exif-sharpness-1' => 'Nerm',
 'exif-sharpness-2' => 'Huşk',
 
-'exif-subjectdistancerange-0' => 'Nêzanıte',
+'exif-subjectdistancerange-0' => 'Nêzanayen',
 'exif-subjectdistancerange-1' => 'Makro',
 'exif-subjectdistancerange-2' => 'Vinayişê nezdiyi',
 'exif-subjectdistancerange-3' => 'Vinayişê duri',
@@ -3666,7 +4212,7 @@ $8',
 'exif-ycbcrpositioning-1' => 'Wertekerdış',
 'exif-ycbcrpositioning-2' => 'Wayırê-site',
 
-'exif-dc-contributor' => 'Dekerdeni',
+'exif-dc-contributor' => 'İştıraqkeri',
 'exif-dc-coverage' => 'Heruna yana wextin grotışa medya',
 'exif-dc-date' => 'Tarix(i)',
 'exif-dc-publisher' => 'Hesrekar',
@@ -3782,6 +4328,7 @@ kodê tesdiqi heta ıney tarixi $4 meqbul o.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Transcludê înterwîkîyî nihebityeno]',
 'scarytranscludefailed' => '[Qe $1 fetch kerdişî nihebitiyeno]',
+'scarytranscludefailed-httpstatus' => '[Qande $1 şablon nêşa bıgêriyo: HTTP $2]',
 'scarytranscludetoolong' => '[Ena URL zaf dergo]',
 
 # Delete conflict
@@ -3825,7 +4372,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 peyên',
+'table_pager_next' => 'Pela peyêne',
 'table_pager_prev' => 'Pela verêne',
 'table_pager_first' => 'Pela jûyıne',
 'table_pager_last' => 'Pela peyêne',
@@ -3892,11 +4439,11 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'watchlistedit-raw-submit' => 'Listeyê seyri newen ke',
 'watchlistedit-raw-done' => 'Listeyê tuyê seyrkerdişi rocaniye biyo',
 'watchlistedit-raw-added' => '{{PLURAL:$1|1 seroğ|$1 seroğî}} de kerd:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|1 seroğ|$1 seroğî}} de wedarno:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 seroğ|$1 seroği}} besteriyaye:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'vurnayışanê eleqadari bıvin',
-'watchlisttools-edit' => 'listey seyrkerdışi bevin u edit bık',
+'watchlisttools-edit' => 'Lista seyrkerdışi bıvênên u bıvurnên',
 'watchlisttools-raw' => 'Listeyê seyr-kerdışi bıvin',
 
 # Iranian month names
@@ -3963,7 +4510,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 
 # Core parser functions
 'unknown_extension_tag' => 'Etiketê ekstensiyon ê "$1"î nizanyeno',
-'duplicate-defaultsort' => '\'\'\'Teme:\'\'\' Tuşê default sort "$2" sero tuşê default sort "$1"î ra şino.',
+'duplicate-defaultsort' => '\'\'\'Tembe:\'\'\' Hesıbyaye sırmey ratnayış de "$2" sırmey ratnayış de "$1"i nêhesıbneno.',
 
 # Special:Version
 'version' => 'Versiyon',
@@ -3987,6 +4534,7 @@ Ti hem zi eşkeno [[Special:EditWatchlist|use the standard editor]].',
 'version-license' => 'Lisans',
 'version-poweredby-credits' => "Ena wiki, dezginda '''[//www.mediawiki.org/ MediaWiki]''' ya piya vıraziyaya, heqê telifi © 2001-$1 $2.",
 'version-poweredby-others' => 'Zewmi',
+'version-credits-summary' => 'Ma qayılime ke [[Special:Version|MediaWiki]] rê ke kami destek dayo wa mayê vanime inan bışınasne.',
 'version-license-info' => "MediaWiki xoseri jew nuştereno; MediaWiki'yer, weqfê xoseri nuşteren GNU lisansiya merdumi şene ke vıla kerê, bıvurnê u timar kerê.
 
 Nuşterenê MediaWiki merdumi cı ra nahfat bivinê deye êyê mısade danê; feqet ke nêşeno BIROŞO yana XOSERİ VILA KERO qerantiya ney çına. bewni rê lisansta GNU'y.
@@ -4020,7 +4568,7 @@ Resımi be tam asayış mocniyayê, tipê dosyaê bini be programê cıyo elaqed
 'fileduplicatesearch-noresults' => 'Ebe namey "$1" ra dosya nêdiyayê.',
 
 # Special:SpecialPages
-'specialpages' => 'Peley xısusi',
+'specialpages' => 'Pelê xısusiy',
 'specialpages-note' => '----
 * Xısusi pelaya normal
 * <span class="mw-specialpagerestricted">Xısusi peleyê keı rê ray nê deyaya.</span>
@@ -4054,7 +4602,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' => 'Avrêcê [[Special:Tags|Etiketi]]:',
 'tag-filter-submit' => 'Avrêc',
 'tags-title' => 'Etiketan',
 'tags-intro' => 'Eno pel de listeyê eyiketî este ke belki software pê ey edit kenî.',
@@ -4068,8 +4616,8 @@ 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' => 'Pela 1',
-'compare-page2' => 'Pel 2',
+'compare-page1' => 'Pele 1',
+'compare-page2' => 'Pele 2',
 'compare-rev1' => 'Revizyonê 1i',
 'compare-rev2' => 'Revizyonê 2i',
 'compare-submit' => 'Miqayese',
@@ -4129,9 +4677,9 @@ Ena sita dı newke xırabiya teknik esta.',
 'logentry-move-move_redir-noredirect' => '$1 hetenayışê qeydê pela da  $3 ahulnê $4 sero hetenayış vıraşt',
 'logentry-patrol-patrol' => '$1 revizyonê pela da $4 $3 ke kontrol',
 'logentry-patrol-patrol-auto' => "$1 pelay $3'i rewizyon dê $4 ya kontrol ke",
-'logentry-newusers-newusers' => '$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",
+'logentry-newusers-newusers' => 'Hesabê karberi $1 vıraziya',
+'logentry-newusers-create' => 'Hesabê karberi $1 vıraziya',
+'logentry-newusers-create2' => 'Hesabê karberi $1 terefê $3 ra vıraziya',
 'logentry-newusers-autocreate' => 'Hesabê $1 Otomatikmen vıraziya',
 'newuserlog-byemail' => 'pê e-mail ra paralo şiravt',
 
@@ -4150,6 +4698,10 @@ Ena sita dı newke xırabiya teknik esta.',
 'feedback-bugcheck' => 'Harika! Sadece [xırabina ke $1 ] çınyayışê cı kontrol keno.',
 'feedback-bugnew' => 'Mı qontrol ke. Xetaya newi xeber ke',
 
+# Search suggestions
+'searchsuggest-search' => 'Cı geyre',
+'searchsuggest-containing' => 'Estên...',
+
 # API errors
 'api-error-badaccess-groups' => 'Ena wiki de dosya barkerdışi rê mısade nêdeyêno.',
 'api-error-badtoken' => 'Xirabiya zerrek:Xırab resim.',
@@ -4202,4 +4754,6 @@ Ena sita dı newke xırabiya teknik esta.',
 'duration-centuries' => '$1 {{PLURAL:$1|seserre|seserri}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenyum|milenyumi}}',
 
+# Unknown messages
+'svg-long-error' => "Nêmeqbul dosyaya SVG'i: $1",
 );
index 2278e13..af548fe 100644 (file)
@@ -23,7 +23,6 @@
 
 $fallback = 'de';
 
-
 $namespaceNames = array(
        NS_MEDIA            => 'Medija',
        NS_SPECIAL          => 'Specialne',
@@ -53,20 +52,6 @@ $namespaceGenderAliases = array(
         NS_USER_TALK => array( 'male' => 'Diskusija_wužywarja', 'female' => 'Diskusija_wužywarki' ),
 );
 
-$datePreferences = array(
-       'default',
-       'dmy',
-       'ISO 8601',
-);
-
-$defaultDateFormat = 'dmy';
-
-$dateFormats = array(
-       'dmy time' => 'H:i',
-       'dmy date' => 'j. xg Y',
-       'dmy both' => 'j. xg Y, H:i',
-);
-
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktiwne_wužywarje' ),
        'Allmessages'               => array( 'Systemowe_powěsći' ),
@@ -158,6 +143,20 @@ $specialPageAliases = array(
        'Withoutinterwiki'          => array( 'Interwikije_feluju' ),
 );
 
+$datePreferences = array(
+       'default',
+       'dmy',
+       'ISO 8601',
+);
+
+$defaultDateFormat = 'dmy';
+
+$dateFormats = array(
+       'dmy time' => 'H:i',
+       'dmy date' => 'j. xg Y',
+       'dmy both' => 'j. xg Y, H:i',
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Wótkaze pódšmarnuś:',
@@ -207,7 +206,7 @@ $messages = array(
 
 'underline-always' => 'pśecej',
 'underline-never' => 'žednje',
-'underline-default' => 'pó standarźe browsera',
+'underline-default' => 'Standard drastwy abo wobglědowaka',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Pismowy stil wobźěłowańskego póla:',
@@ -292,8 +291,8 @@ $messages = array(
 'newwindow' => '(se wótcynijo w nowem woknje)',
 'cancel' => 'Pśetergnuś',
 'moredotdotdot' => 'Wěcej…',
-'mypage' => 'Mój bok',
-'mytalk' => 'mója diskusija',
+'mypage' => 'Bok',
+'mytalk' => 'Diskusija',
 'anontalk' => 'Diskusija z toś teju IP',
 'navigation' => 'Nawigacija',
 'and' => '&#32;a',
@@ -303,7 +302,6 @@ $messages = array(
 'qbbrowse' => 'Pśeběraś',
 'qbedit' => 'Pśeměniś',
 'qbpageoptions' => 'Toś ten bok',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Móje boki',
 'qbspecialpages' => 'Specialne boki',
 'faq' => 'FAQ (pšašanja a wótegrona)',
@@ -316,7 +314,7 @@ $messages = array(
 'vector-action-protect' => 'Šćitaś',
 'vector-action-undelete' => 'Wótnowiś',
 'vector-action-unprotect' => 'Šćit změniś',
-'vector-simplesearch-preference' => 'Pólěpšone pytańske naraźenja zmóžniś (jano suknja Vector)',
+'vector-simplesearch-preference' => 'Zjadnorjonu pytańsku lejstwu zmóžniś (jano drastwa Vector)',
 'vector-view-create' => 'Napóraś',
 'vector-view-edit' => 'Wobźěłaś',
 'vector-view-history' => 'Wersije a awtory',
@@ -326,6 +324,7 @@ $messages = array(
 'namespaces' => 'Mjenjowe rumy',
 'variants' => 'Warianty',
 
+'navigation-heading' => 'Nawigaciski meni',
 'errorpagetitle' => 'Zmólka',
 'returnto' => 'Slědk k bokoju $1.',
 'tagline' => 'Z {{GRAMMAR:genitiw|{{SITENAME}}}}',
@@ -532,7 +531,7 @@ Wótpšašanje: $2',
 'viewsource-title' => 'Žrědłowy tekst za $1 se woglědaś',
 'actionthrottled' => 'Akcije limitowane',
 'actionthrottledtext' => 'Ako napšawa pśeśiwo spamoju, móžoš toś tu akciju jano někotare raze we wěstym case wuwjasć. Sy toś ten limit dośěgnuł. Pšosym wopytaj za někotare minuty hyšći raz.',
-'protectedpagetext' => 'Wobźěłanje toś togo boka jo se znjemóžniło.',
+'protectedpagetext' => 'Toś ten bok jo pśeśiwo wobźěłowanjeju abo drugim akcijam šćitany.',
 'viewsourcetext' => 'Žrědłowy tekst togo boka móžoš se woglědaś a kopěrowaś:',
 'viewyourtext' => "Móžoš se žrědłowy tekst '''swójich změnow''' woglědaś a do toś togo bok kopěrowaś:",
 'protectedinterface' => 'Toś ten bok wopśimujo tekst za rěcny zwjerch softwary na toś tom wikiju a šćita se, aby se znjewužywanjeju zadorało.
@@ -562,11 +561,10 @@ Administrator, kenž jo jen zastajił, jo toś tu pśicynu pódał: "$3".',
 # Login and logout pages
 'logouttext' => "'''Sy se něnto wótzjawił.'''
 
-Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš [[Special:UserLogin|se znowego pśizjawiś]] ako samski abo hynakšy wužywaŕ.
+Móžoš {{SITENAME}} anomymnje dalej wužywaś abo móžoš <span class='plainlinks'>[$1 se znowego pśizjawiś]</span> ako samski abo hynakšy wužywaŕ.
 Źiwaj na to, až někotare boki se dalej tak zwobraznjuju ako by hyšći pśizjawjeny był, až njewuproznijoš cache swójego wobglědowaka.",
-'welcomecreation' => '== Witaj, $1! ==
-
-Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences|nastajenja {{SITENAME}}]].',
+'welcomeuser' => 'Witaj $1',
+'welcomecreation-msg' => 'Twójo konto jo se załožyło. Njezabydni změniś swóje [[Special:Preferences|nastajenja za {{SITENAME}}]].',
 'yourname' => 'mě wužywarja',
 'yourpassword' => 'šćitne gronidło:',
 'yourpasswordagain' => 'Šćitne gronidło hyšći raz zapódaś:',
@@ -827,7 +825,7 @@ Nejnowšy zapisk blokěrowańskego protokola pódawa se dołojce ako referenca:'
 'note' => "'''Pokazka:'''",
 'previewnote' => "'''Wobmysli, až to jo jano pśeglěd.'''
 Twóje změny hyšći njejsu składowane!",
-'continue-editing' => 'Dalej wobźěłaś',
+'continue-editing' => 'K wobźěłowańskemu póloju',
 'previewconflict' => 'Toś ten pśeglěd wótbłyšćujo tekst górjejcnego póla. Bok buźo tak wuglědaś, jolic jen něnto składujoš.',
 'session_fail_preview' => "'''Wódaj! Twójo wobźěłanje njejo se mógało składowaś, dokulaž su daty twójogo pósejźenja se zgubili. Pšosym wopytaj hyšći raz. Jolic až to pón pśecej hyšći njejźo, wopytaj se wótzjawiś a zasej pśizjawiś.'''",
 'session_fail_preview_html' => "'''Wódaj! Twójo wobźěłanje njejo se mógało składowaś, dokulaž su daty twójogo pósejźenja se zgubili.'''
@@ -898,6 +896,15 @@ Zda sem až jo wulašowany.',
 'edit-already-exists' => 'Njejo móžno było nowy bok napóraś.
 Eksistěrujo južo.',
 'defaultmessagetext' => 'Standardny tekst powěźeńki',
+'content-failed-to-parse' => 'Parsowanje wopśimjeśa $2 za model $1 jo se njeraźiło: $3',
+'invalid-content-data' => 'Njepłaśiwe wopśimjeśowe daty',
+'content-not-allowed-here' => 'Wopśimjeśe "$1" njejo na boku [[$2]] dowólone',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'lutny tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Warnowanje: Toś ten bok wopśimujo pśewjele wołanjow parserowych funkcijow wupominajucych wusoke wugbaśe.
@@ -1151,8 +1158,6 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-interwiki-caption' => 'Sotšine projekty',
 'search-interwiki-default' => '$1 wuslědki:',
 'search-interwiki-more' => '(wěcej)',
-'search-mwsuggest-enabled' => 'z naraźenjami',
-'search-mwsuggest-disabled' => 'žedne naraźenja',
 'search-relatedarticle' => 'swójźbne',
 'mwsuggest-disable' => 'Naraźenja pśez AJAX znjemóžniś',
 'searcheverything-enable' => 'We wšych mjenjowych rumach pytaś',
@@ -1185,7 +1190,7 @@ Drobnostki móžoš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 
 # Preferences page
 'preferences' => 'Nastajenja',
-'mypreferences' => 'nastajenja',
+'mypreferences' => 'Nastajenja',
 'prefs-edits' => 'Licba wobźěłanjow:',
 'prefsnologin' => 'Njejsy pśizjawjony',
 'prefsnologintext' => 'Musyš se <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} pśizjawiś]</span>, aby mógał swóje nastajenja změniś.',
@@ -1415,6 +1420,9 @@ Móžoš toś ten bok wužywaś, aby slědk stajił swóje nastajenja na standar
 'rightslogtext' => 'To jo protokol wužywarskich pšawow.',
 'rightslogentry' => 'Pśisłušnosć ku kupce jo se za „$1“ změniła wót „$2“ na „$3“.',
 'rightslogentry-autopromote' => 'jo se awtomatiski wót $2 do $3 změnił',
+'logentry-rights-rights' => '$1 jo kupkowe cłonkojstwo za $3 z $4 do $5 změnił',
+'logentry-rights-rights-legacy' => '$1 jo kupkowe cłonkojstwo za $3 změnił',
+'logentry-rights-autopromote' => '$1 jo se awtomatiski wót $4 do $5 pówušył',
 'rightsnone' => '(nic)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1651,6 +1659,7 @@ $1',
 'backend-fail-notsame' => 'Njeidentiska dataja $1 južo eksistěrujo.',
 'backend-fail-invalidpath' => '$1 njejo płaśiwy puśik za składowanje.',
 'backend-fail-delete' => 'Dataja $1 njedajo se wulašowaś.',
+'backend-fail-describe' => 'Metadaty za dataju "$1" njedaju se změniś.',
 'backend-fail-alreadyexists' => 'Dataja $1 južo eksistěrujo.',
 'backend-fail-store' => 'Dataja $1 njedajo se pód $2 składowaś.',
 'backend-fail-copy' => 'Dataja $1 njedajo se pód $2 kopěrowaś.',
@@ -1797,7 +1806,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ś.',
+'upload-disallowed-here' => 'Njamóžoš toś tu dataju pśepisaś.',
 
 # File reversion
 'filerevert' => 'Slědk wześ $1',
@@ -2031,7 +2040,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: <code>$1</code> (pšosym njepódaj je w swójom pytanju).',
+Pódpěrane protokole: <code>$1</code> (standard jo http://, jolic žeden protokol njejo pódany).',
 'linksearch-line' => '$1 wótkazany z $2',
 'linksearch-error' => 'Zasupne znamješko daju se jano na zachopjeńku URL wužywaś.',
 
@@ -2079,7 +2088,7 @@ Pódpěrane protokole: <code>$1</code> (pšosym njepódaj je w swójom pytanju).
 '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ł.
+'emailpagetext' => 'Móžoš slědujucy formular wužywaś, aby toś tomu {{GENDER:$1|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ś.',
 'usermailererror' => 'E-mailowy objekt jo zmólku wrośił.',
 'defemailsubject' => '{{SITENAME}} - e-mail wót wužywarja "$1"',
@@ -2111,7 +2120,7 @@ E-mailowa adresa, kótaruž sy zapódał w [[Special:Preferences|swójich wužyw
 
 # Watchlist
 'watchlist' => 'Wobglědowańka',
-'mywatchlist' => 'wobglědowańka',
+'mywatchlist' => 'Wobglědowańka',
 'watchlistfor2' => 'Za wužywarja $1 $2',
 'nowatchlist' => 'Žedne zapise w twójej wobglědowańce.',
 'watchlistanontext' => 'Dejš $1, aby mógał swóju wobglědowańku wiźeś abo zapise w njej wobźěłaś.',
@@ -2147,19 +2156,23 @@ Pózdźejšne změny na toś tom boku a w pśisłušecej diskusiji se tam nalicu
 
 'enotif_mailer' => '{{SITENAME}} e-mailowe powěsći',
 'enotif_reset' => 'Wšykne boki ako woglědane markěrowaś',
-'enotif_newpagetext' => 'To jo nowy bok.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-wužywaŕ',
-'changed' => 'změnił',
-'created' => 'napórał',
-'enotif_subject' => '[{{SITENAME}}] $PAGEEDITOR jo bok "$PAGETITLE" $CHANGEDORCREATED',
+'enotif_subject_deleted' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} wulašował',
+'enotif_subject_created' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} napórał',
+'enotif_subject_moved' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} pśesunuł',
+'enotif_subject_restored' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} wótnowił',
+'enotif_subject_changed' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se wót {{GENDER:$2|$2}} změnił',
+'enotif_body_intro_deleted' => 'Bok{{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$1|$2}} wulašował, glědaj $3 za aktualnu wersiju.',
+'enotif_body_intro_created' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$2|$2}} napórał, glědaj $3 za aktualnu wersiju.',
+'enotif_body_intro_moved' => 'Bok{{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$1|$2}} pśesunuł, glědaj $3 za aktualnu wersiju.',
+'enotif_body_intro_restored' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$2|$2}} wótnowił, glědaj $3 za aktualnu wersiju.',
+'enotif_body_intro_changed' => 'Bok {{GRAMMAR:genitiw|{{SITENAME}}}} $1 jo se na $PAGEEDITDATE wót {{GENDER:$2|$2}} změnił, glědaj $3 za aktualnu wersiju.',
 'enotif_lastvisited' => 'Wšykne změny na jadno póglědnjenje: $1',
 'enotif_lastdiff' => 'Za toś tu změnu glědaj w $1.',
 'enotif_anon_editor' => 'anonymny wužywaŕ $1',
 'enotif_body' => 'Luby $WATCHINGUSERNAME,
 
-$PAGEEDITOR jo bok $PAGETITLE na {{GRAMMAR:lokatiw|{{SITENAME}}}} $PAGEEDITDATE $CHANGEDORCREATED, glědaj $PAGETITLE_URL za aktualnu wersiju.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Zespominanje wobźěłarja: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2167,10 +2180,9 @@ Kontakt z wobźěłarjom:
 E-mail: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
-Njebudu žedne dalšne powěźeńki w paźe dalšnych změnow, snaźkuli woglědujoš se toś ten bok.
-Móźoś teke chórgojcki powěźeńkow za wšykne twóje wobglědowane boki slědk stajiś.
+Njebudu žedne dalšne powěźeńki w paźe dalšnych změnow, snaźkuli woglědujoš se toś ten bok. Móźoś teke chórgojcki powěźeńkow za wšykne twóje wobglědowane boki slědk stajiś.
 
-             Twój pśijaśelny powěsćowy system {{SITENAME}}
+Twój pśijaśelny powěsćowy system {{SITENAME}}
 --
 Aby swoje nastajenja za e-mailowe zdźělenja změnił, woglědaj
 {{canonicalurl:{{#special:Preferences}}}}
@@ -2326,7 +2338,8 @@ W takich padach dejš nejnowše wulašowane wersije markěroanje abo schowanje w
 'undeletedrevisions' => '{{PLURAL:$1|1 wersija jo se nawrośiła|$1 wersiji stej se nawrośiłej|$1 wersije su se nawrośili}}.',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 wersija|$1 wersiji|$1 wersije}} a {{PLURAL:$2|1 dataja|$2 dataji|$2 dataje}} {{PLURAL:$2|jo se nawrośiła|stej se nawrośiłej|su se nawrośili}}.',
 'undeletedfiles' => '{{PLURAL:$1|1 dataja jo se nawrośiła|$1 dataji stej se nawrośiłej|$1 dataje su se nawrośili}}.',
-'cannotundelete' => 'Nawrośenje njejo se zglucyło; něchten drugi jo bok južo nawrośił.',
+'cannotundelete' => 'Wótnowjenje jo se njeraźiło:
+$1',
 'undeletedpage' => "Bok '''$1''' jo se nawrośił.
 
 W [[Special:Log/delete|log-lisćinje wulašowanjow]] namakajoš pśeglěd wulašowanych a nawrośonych bokow.",
@@ -2357,9 +2370,9 @@ $1',
 'blanknamespace' => '(Nastawki)',
 
 # Contributions
-'contributions' => 'Wužywarske pśinoski',
+'contributions' => 'Pśinoski {{GENDER:$1|wužywarja|wužywarki}}',
 'contributions-title' => 'Wužywarske pśinoski wót $1',
-'mycontris' => 'móje pśinoski',
+'mycontris' => 'Pśinoski',
 'contribsub2' => 'Za $1 ($2)',
 'nocontribs' => 'Za toś te kriterije njejsu žedne změny se namakali.',
 'uctop' => '(aktualny)',
@@ -2616,6 +2629,7 @@ Bok „[[:$1]]“ južo eksistěrujo. Coš jen wulašowaś, aby mógał toś ten
 'immobile-target-namespace-iw' => 'Interwiki-wótkaz njejo płaśiwy cel za pśesunjenja bokow.',
 'immobile-source-page' => 'Toś ten bok njedajo se pśesunuś.',
 'immobile-target-page' => 'Njejo móžno na toś ten celowy bok pśesunuś.',
+'bad-target-model' => 'Póžedany cel wužywa drugi wopśimjeśowy model. $1 njedajo se do $2 konwertěrowaś.',
 'imagenocrossnamespace' => 'Dataja njedajo se pśesunuś do mjenjowego ruma, kótarež njejo za dataje.',
 'nonfile-cannot-move-to-file' => 'Njedataje njedaje se do datajowego mjenjowego ruma pśesunuś',
 'imagetypemismatch' => 'Nowy datajowy sufiks swójomu typoju njewótpowědujo',
@@ -2740,7 +2754,6 @@ Wšykne transwiki-importowe akcije protokolěruju se w [[Special:Log/import|log-
 
 # JavaScriptTest
 'javascripttest' => 'JavaScriptowy test',
-'javascripttest-disabled' => 'Toś ta funkcija njejo na toś tom wikiju zmóžnjona.',
 'javascripttest-title' => 'Testy $1 se pśewjeduju',
 'javascripttest-pagetext-noframework' => 'Toś ten bok jo pśewjedowanjeju javascriptowych testow pśewóstajony.',
 'javascripttest-pagetext-unknownframework' => 'Njeznaty wobłuk "$1".',
@@ -2853,6 +2866,7 @@ W zespominanju dajo se pśicyna pódaś.',
 
 # Info page
 'pageinfo-title' => 'Informacije za bok "$1"',
+'pageinfo-not-current' => 'Bóžko njedaju se toś te informacije za stare wersije pódaś.',
 'pageinfo-header-basic' => 'Zakładne informacije',
 'pageinfo-header-edits' => 'Historiju wobźěłaś',
 'pageinfo-header-restrictions' => 'Šćit boka',
@@ -2861,6 +2875,7 @@ W zespominanju dajo se pśicyna pódaś.',
 'pageinfo-default-sort' => 'Standardny sortěrowański kluc',
 'pageinfo-length' => 'Dłujkosć boka (w bajtach)',
 'pageinfo-article-id' => 'ID boka',
+'pageinfo-language' => 'Rěc bokowego wopśimjeśa',
 'pageinfo-robot-policy' => 'Status pytawy',
 'pageinfo-robot-index' => 'Indeksěrujobny',
 'pageinfo-robot-noindex' => 'Njeindeksěrujobny',
@@ -2878,10 +2893,17 @@ W zespominanju dajo se pśicyna pódaś.',
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Informacije wó boku',
+'pageinfo-redirectsto' => 'Pósrědnja dalej k',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage' => 'Licy se ako wopśimjeśowy bok',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading' => 'Kaskadowy šćit wót how',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-protect-cascading-from' => 'Kaskadowy šćit wót',
 
 # Skin names
 'skinname-standard' => 'Klasiski',
@@ -2903,6 +2925,8 @@ W zespominanju dajo se pśicyna pódaś.',
 'markedaspatrollederror' => 'Markěrowanje ako "kontrolěrowane" njejo móžne.',
 'markedaspatrollederrortext' => 'Musyš wersiju wuzwóliś.',
 'markedaspatrollederror-noautopatrol' => 'Njesmějoš swóje změny ako kontrolěrowane markěrowaś.',
+'markedaspatrollednotify' => 'Toś ta změna do $1 jo se ako doglědowana markěrowała.',
+'markedaspatrollederrornotify' => 'Markěrowanje ako doglědowane jo se njeraźiło.',
 
 # Patrol log
 'patrol-log-page' => 'Protokol kontrolow',
@@ -2965,6 +2989,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 góźinu|$1 góźinoma|$1 góźinami|$1 góźinami}}',
 'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjoma|$1 dnjami|$1 dnjami}}',
 'ago' => 'pśed $1',
+'just-now' => 'rowno',
 
 # Bad image list
 'bad_image_list' => 'Format jo slědujucy:
@@ -3450,6 +3475,7 @@ Toś ten wobkšuśeński kod płaśi až do $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Pśidawanje interwiki jo deaktiwěrowane]',
 'scarytranscludefailed' => '[Zapśěgnjenje pśedłogi za $1 njejo se raźiło]',
+'scarytranscludefailed-httpstatus' => '[Wótwołanje pśedłogi za $1 jo se njeraźiło: HTTP $2]',
 'scarytranscludetoolong' => '[URL jo pśedłujki]',
 
 # Delete conflict
@@ -3571,6 +3597,7 @@ Móžoš teke [[Special:EditWatchlist|standardny wobźěłowański bok wužywaś
 'version-license' => 'Licenca',
 'version-poweredby-credits' => "Toś ten wiki spěchujo se wót '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'druge',
+'version-credits-summary' => 'Źěkujomy se slědujucym wósobam za jich pśinoski k [[Special:Version|MediaWiki]]',
 'version-license-info' => 'MediaWiki jo licha softwara: móžoš ju pód wuměnjenjami licence GNU General Public License, wózjawjeneje wót załožby Free Software Foundation, rozdźěliś a/abo změniś: pak pód wersiju 2 licence pak pód někakeju pózdźejšeju wersiju.
 
 MediaWiki rozdźěla se w naźeji, až buźo wužitny, ale BŹEZ GARANTIJE: samo bźez wopśimjoneje garantije PŚEDAWAJOBNOSĆI abo PŚIGÓDNOSĆI ZA WĚSTY ZAMĚR. Glědaj GNU general Public License za dalšne drobnostki.
@@ -3709,8 +3736,8 @@ Wobraze se w połnym wótgranicowanju pokazuju, druge datajowe typy se ze zwěza
 'logentry-move-move_redir-noredirect' => '$1 jo pśesunuł bok $3 do $4 a jo pśepisał dalejpósrědnjenje, mimo až jo napórał dalejpósrědnjenje',
 'logentry-patrol-patrol' => '$1 jo markěrował wersiju $4 boka $3 ako doglědowanu',
 'logentry-patrol-patrol-auto' => '$1 jo awtomatiski markěrował wersiju $4 boka $3 ako doglědowanu',
-'logentry-newusers-newusers' => '$1 jo załožył wužywarske konto',
-'logentry-newusers-create' => '$1 jo załožył wužywarske konto',
+'logentry-newusers-newusers' => 'Wužywarske konto $1 jo se załožyło',
+'logentry-newusers-create' => 'Wužywarske konto $1 jo se załožyło',
 'logentry-newusers-create2' => '$1 jo załožył wužywarske konto $3',
 'logentry-newusers-autocreate' => 'Konto $1 jo se awtomatiski załožyło',
 'newuserlog-byemail' => 'Pótajne słowo bu pśez e-mail pósłane.',
@@ -3731,6 +3758,10 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'feedback-bugcheck' => 'Wjelicnje! Pśekontrolěruj jano, lěc to njejo jadna z [$1 znatych zmólkow].',
 'feedback-bugnew' => 'Som pśekontrolěrował. Nowu zmólku k wěsći daś',
 
+# Search suggestions
+'searchsuggest-search' => 'Pytaś',
+'searchsuggest-containing' => 'wopśimujo...',
+
 # API errors
 'api-error-badaccess-groups' => 'Njamaš pšawo dataje do toś togo wikija nagraś.',
 'api-error-badtoken' => 'Nutśikowna zmólka: Wopacny token',
@@ -3783,4 +3814,6 @@ Hować móžoš slědujucy jadnory formular wužywaś. Twój komentar pśidajo s
 'duration-centuries' => '$1 {{PLURAL:$1|stolěśe|stolěśi|stolěśa|stolěśow}}',
 'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysaca|lěttysace|lěttysacow}}',
 
+# Unknown messages
+'svg-long-error' => 'Njepłaśiwa SVG-dataja: $1',
 );
index 58e5be0..b24b850 100644 (file)
@@ -158,7 +158,6 @@ $messages = array(
 'qbbrowse' => 'Pogihum',
 'qbedit' => 'Idito',
 'qbpageoptions' => 'Bolikon diti',
-'qbpageinfo' => 'Pogiromutan',
 'qbmyoptions' => 'Bobolikonku ngawi',
 'qbspecialpages' => 'Bobolikon suaikowokon',
 'faq' => 'Ponguhatan Koinsoruan om Poninimbar',
@@ -425,11 +424,8 @@ Mongungulud di minongunsi pinopointalang do kointalangan diti: "$3".',
 # Login and logout pages
 'logouttext' => "'''Baino nakalabus log ko noh.'''
 
-Milo ko do monilombus mongoguno {{SITENAME}} poinlisok, toi [[Special:UserLogin|sumuang log koh kawagu]] miagal ngaran di tiinu toi mongoguno ngaran suai.
+Milo ko do monilombus mongoguno {{SITENAME}} poinlisok, toi <span class='plainlinks'>[$1 sumuang log koh kawagu]</span> miagal ngaran di tiinu toi mongoguno ngaran suai.
 Birio do kipipiro bolikon popokito do maso poinsuang log koh poh gisom no do opugas nu dangkob do pogigihumnu.",
-'welcomecreation' => '== Kopiwosian, $1! ==
-Nowonsoi no takaunnu.
-Soroho no do mongolon [[Special:Preferences|{{SITENAME}} komoisoonnu]].',
 'yourname' => 'Ngarandait:',
 'yourpassword' => 'Kaatalib:',
 'yourpasswordagain' => 'Mintaipo kaatalib:',
@@ -965,8 +961,6 @@ Intaai [[Special:BlockList|lis nantaban]] montok lis kawawagu karaja mogoduh om
 'search-interwiki-caption' => 'Taka do purujik',
 'search-interwiki-default' => 'Kootuson $1:',
 'search-interwiki-more' => '(lobi)',
-'search-mwsuggest-enabled' => 'miampai tua do tutok',
-'search-mwsuggest-disabled' => 'ingaa tua do tutok',
 'search-relatedarticle' => 'Kompinaian',
 'searcheverything-enable' => 'Pogihum momoguno oinsanan ngaran:',
 'searchrelated' => 'kompinaian',
index 8ba3464..bece75c 100644 (file)
@@ -57,200 +57,200 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-hideminor'    => 'ކުޑަ ކުޑަ އުނި އިތުރުތައް އެންމެފަހުގެ ބަދަލުތަކުގެ ލިސްޓުން ފޮރުއްވަވާ',
+'tog-hideminor' => 'ކުޑަ ކުޑަ އުނި އިތުރުތައް އެންމެފަހުގެ ބަދަލުތަކުގެ ލިސްޓުން ފޮރުއްވަވާ',
 'tog-ccmeonemails' => 'އަޅުގަނޑު އެހެން މެމްބަރުންނަށް ފޮނުވާ އީމެއިލްގެ ނަކަލެއް އަޅުގަނޑަށް ފޮނުވާ',
 
 'underline-always' => 'އަބަދުވެސް',
-'underline-never'  => 'ހަމަހިލާ ނޫން',
+'underline-never' => 'ހަމަހިލާ ނޫން',
 
 # Dates
-'sunday'        => 'އާދީއްތަ',
-'monday'        => 'ހޯމަ',
-'tuesday'       => 'އަންގާރަ',
-'wednesday'     => 'ބުދަ',
-'thursday'      => 'ބުރާސްފަތި',
-'friday'        => 'ހުކުރު',
-'saturday'      => 'ހޮނިހިރު',
-'sun'           => 'އާދީއްތަ',
-'mon'           => 'ހޯމަ',
-'tue'           => 'އަންގާރަ',
-'wed'           => 'ބުދަ',
-'thu'           => 'ބުރާސްފަތި',
-'fri'           => 'ހުކުރު',
-'sat'           => 'ހޮނިހިރު',
-'january'       => 'ޖެނުއަރީ',
-'february'      => 'ފެބްރުއަރީ',
-'march'         => 'މާރޗް',
-'april'         => 'އެޕްރީލް',
-'may_long'      => 'މެއި',
-'june'          => 'ޖޫން',
-'july'          => 'ޖުލައި',
-'august'        => 'އޮގަސްޓު',
-'september'     => 'ސެޕްޓެމްބަރު',
-'october'       => 'އޮކްޓޫބަރު',
-'november'      => 'ނޮވެމްބަރު',
-'december'      => 'ޑިސެމްބަރު',
-'january-gen'   => 'ޖެނުއަރީ',
-'february-gen'  => 'ފެބްރުއަރީ',
-'march-gen'     => 'މާޗް',
-'april-gen'     => 'އޭޕްރިލް',
-'may-gen'       => 'މޭއި',
-'june-gen'      => 'ޖޫން',
-'july-gen'      => 'ޖުލައި',
-'august-gen'    => 'އޯގަސްޓް',
+'sunday' => 'އާދީއްތަ',
+'monday' => 'ހޯމަ',
+'tuesday' => 'އަންގާރަ',
+'wednesday' => 'ބުދަ',
+'thursday' => 'ބުރާސްފަތި',
+'friday' => 'ހުކުރު',
+'saturday' => 'ހޮނިހިރު',
+'sun' => 'އާދީއްތަ',
+'mon' => 'ހޯމަ',
+'tue' => 'އަންގާރަ',
+'wed' => 'ބުދަ',
+'thu' => 'ބުރާސްފަތި',
+'fri' => 'ހުކުރު',
+'sat' => 'ހޮނިހިރު',
+'january' => 'ޖެނުއަރީ',
+'february' => 'ފެބްރުއަރީ',
+'march' => 'މާރޗް',
+'april' => 'އެޕްރީލް',
+'may_long' => 'މެއި',
+'june' => 'ޖޫން',
+'july' => 'ޖުލައި',
+'august' => 'އޮގަސްޓު',
+'september' => 'ސެޕްޓެމްބަރު',
+'october' => 'އޮކްޓޫބަރު',
+'november' => 'ނޮވެމްބަރު',
+'december' => 'ޑިސެމްބަރު',
+'january-gen' => 'ޖެނުއަރީ',
+'february-gen' => 'ފެބްރުއަރީ',
+'march-gen' => 'މާޗް',
+'april-gen' => 'އޭޕްރިލް',
+'may-gen' => 'މޭއި',
+'june-gen' => 'ޖޫން',
+'july-gen' => 'ޖުލައި',
+'august-gen' => 'އޯގަސްޓް',
 'september-gen' => 'ސެޕްޓެމްބަރ',
-'october-gen'   => 'އޮކްޓޯބަރ',
-'november-gen'  => 'ނޮވެމްބަރ',
-'december-gen'  => 'ޑިސެމްބަރ',
-'jan'           => 'ޖެނުއަރީ',
-'feb'           => 'ފެބްރުއަރީ',
-'mar'           => 'މާޗް',
-'apr'           => 'އޭޕްރިލް',
-'may'           => 'މެއި',
-'jun'           => 'ޖޫން',
-'jul'           => 'ޖުލައި',
-'aug'           => 'އޯގަސްޓް',
-'sep'           => 'ސެޕްޓެމްބަރ',
-'oct'           => 'އޮކްޓޯބަރ',
-'nov'           => 'ނޮވެމްބަރ',
-'dec'           => 'ޑިސެމްބަރ',
+'october-gen' => 'އޮކްޓޯބަރ',
+'november-gen' => 'ނޮވެމްބަރ',
+'december-gen' => 'ޑިސެމްބަރ',
+'jan' => 'ޖެނުއަރީ',
+'feb' => 'ފެބްރުއަރީ',
+'mar' => 'މާޗް',
+'apr' => 'އޭޕްރިލް',
+'may' => 'މެއި',
+'jun' => 'ޖޫން',
+'jul' => 'ޖުލައި',
+'aug' => 'އޯގަސްޓް',
+'sep' => 'ސެޕްޓެމްބަރ',
+'oct' => 'އޮކްޓޯބަރ',
+'nov' => 'ނޮވެމްބަރ',
+'dec' => 'ޑިސެމްބަރ',
 
 # Categories related messages
 'category_header' => 'ގިސްމު "$1" ގައިވާ މަޒުމޫނުތައް',
-'subcategories'   => 'ކުދިގިސްމުތައް',
-'category-empty'  => "''މި ގިސްމުގައި އެއްވެއސް ސަފްހާ އެއް އަދި އެއްވެސް ފައިލެއް ނުހިމެނެއެވެ.''",
-
-'about'      => 'ތާރަފު',
-'article'    => 'ފިހުރިސްތު ޞަފްޙާ',
-'newwindow'  => '(އާ ވިންޑޯ އެއް ހުޅުވޭނެއެވެ)',
-'cancel'     => 'މަންސޫހު',
-'mytalk'     => 'މަގޭ ވާހަކަ',
+'subcategories' => 'ކުދިގިސްމުތައް',
+'category-empty' => "''މި ގިސްމުގައި އެއްވެއސް ސަފްހާ އެއް އަދި އެއްވެސް ފައިލެއް ނުހިމެނެއެވެ.''",
+
+'about' => 'ތާރަފު',
+'article' => 'ފިހުރިސްތު ޞަފްޙާ',
+'newwindow' => '(އާ ވިންޑޯ އެއް ހުޅުވޭނެއެވެ)',
+'cancel' => 'މަންސޫހު',
+'mytalk' => 'މަގޭ ވާހަކަ',
 'navigation' => 'ސަމުގާ',
-'and'        => '&#32;އަދި',
+'and' => '&#32;އަދި',
 
 # Cologne Blue skin
-'qbfind'        => 'ހޯއްދަވާ',
-'qbedit'        => 'އުނިއިތުރުގެންނަވާ',
+'qbfind' => 'ހޯއްދަވާ',
+'qbedit' => 'އުނިއިތުރުގެންނަވާ',
 'qbpageoptions' => 'މި ޞަފްޙާ',
-'qbmyoptions'   => 'މަގޭ ސަފްހާ ތައް',
-
-'errorpagetitle'    => 'ކުށް',
-'returnto'          => 'އަނބުރާ $1 އަށް ވަޑައިގަންނަވާ!',
-'tagline'           => 'ވިކިޕީޑިއާ އިން',
-'help'              => 'އެހީ',
-'search'            => 'ހޯއްދަވާ',
-'go'                => 'ދުރުވޭ',
-'history'           => 'ޞަފްޙާގެ ތާރީހު',
-'history_short'     => 'ތާރީހު',
-'printableversion'  => 'ޗާޕަށްފަހި ނުސްހާ',
-'permalink'         => 'ދާއިމީ ފާލަން',
-'print'             => 'ޗާޕުކުރައްވާ',
-'edit'              => 'އުނިއިތުރު ގެންނަވާ',
-'editthispage'      => 'މި ޞަފްޙާއަށް އުނިއިތުރު ގެންނަވާ',
-'delete'            => 'ފޮހެލައްވާ',
-'deletethispage'    => 'މި ޞަފްޙާ ފޮހެލައްވާ',
-'protect'           => 'ދިފާއުކުރައްވާ',
-'protect_change'    => 'ބަދަލު ގެންނަވާ',
-'protectthispage'   => 'މި ޞަފްޙާ ދިފާއުކުރައްވާ',
-'unprotect'         => 'ދިފާއުކުރުން ހުއްޓަވާލައްވާ',
+'qbmyoptions' => 'މަގޭ ސަފްހާ ތައް',
+
+'errorpagetitle' => 'ކުށް',
+'returnto' => 'އަނބުރާ $1 އަށް ވަޑައިގަންނަވާ!',
+'tagline' => 'ވިކިޕީޑިއާ އިން',
+'help' => 'އެހީ',
+'search' => 'ހޯއްދަވާ',
+'go' => 'ދުރުވޭ',
+'history' => 'ޞަފްޙާގެ ތާރީހު',
+'history_short' => 'ތާރީހު',
+'printableversion' => 'ޗާޕަށްފަހި ނުސްހާ',
+'permalink' => 'ދާއިމީ ފާލަން',
+'print' => 'ޗާޕުކުރައްވާ',
+'edit' => 'އުނިއިތުރު ގެންނަވާ',
+'editthispage' => 'މި ޞަފްޙާއަށް އުނިއިތުރު ގެންނަވާ',
+'delete' => 'ފޮހެލައްވާ',
+'deletethispage' => 'މި ޞަފްޙާ ފޮހެލައްވާ',
+'protect' => 'ދިފާއުކުރައްވާ',
+'protect_change' => 'ބަދަލު ގެންނަވާ',
+'protectthispage' => 'މި ޞަފްޙާ ދިފާއުކުރައްވާ',
+'unprotect' => 'ދިފާއުކުރުން ހުއްޓަވާލައްވާ',
 'unprotectthispage' => 'މި ޞަފްޙާ ދިފާއުކުރުން ހުއްޓަވާލައްވާ',
-'newpage'           => 'އާ ސަފްޙާ',
-'talkpage'          => 'މި ސަފްޙާއާ މެދު ބަހުސްކުރައްވާ',
-'talkpagelinktext'  => 'ޚިޔާލު ސަފްޙާ',
-'specialpage'       => 'ހާއްސަ ޞަފްޙާ',
-'articlepage'       => 'ފިހުރިސްތު ޞަފްޙާ ބައްލަވާ',
-'talk'              => 'ބަހުސް',
-'views'             => 'ހިޔާލުފުޅުތައް',
-'toolbox'           => 'އަތްމަތީފޮށި',
-'userpage'          => 'މެންބަރުގެ ޞަފްޙާ ބައްލަވާ',
-'viewtalkpage'      => 'ބަހުސް ބައްލަވާ',
-'otherlanguages'    => 'އެހެން ބަސްބަހުން',
-'redirectedfrom'    => '(މިސްރާބުކުރެވުނީ $1 އިން)',
-'redirectpagesub'   => 'ޞަފްޙާގެ މިސްރާބު އައުކުރައްވާ',
-'lastmodifiedat'    => 'މި ޞަފްހާ އަށް އެންމެ ފަހުން ބަދަލެއް ގެނެވިފައިވަނީ $1، $2 ގައެވެ.',
-'protectedpage'     => 'ދިފާއުކުރެވިފައިވާ ޞަފްޙާ',
-'jumptosearch'      => 'ހޯއްދަވާ',
+'newpage' => 'އާ ސަފްޙާ',
+'talkpage' => 'މި ސަފްޙާއާ މެދު ބަހުސްކުރައްވާ',
+'talkpagelinktext' => 'ޚިޔާލު ސަފްޙާ',
+'specialpage' => 'ހާއްސަ ޞަފްޙާ',
+'articlepage' => 'ފިހުރިސްތު ޞަފްޙާ ބައްލަވާ',
+'talk' => 'ބަހުސް',
+'views' => 'ހިޔާލުފުޅުތައް',
+'toolbox' => 'އަތްމަތީފޮށި',
+'userpage' => 'މެންބަރުގެ ޞަފްޙާ ބައްލަވާ',
+'viewtalkpage' => 'ބަހުސް ބައްލަވާ',
+'otherlanguages' => 'އެހެން ބަސްބަހުން',
+'redirectedfrom' => '(މިސްރާބުކުރެވުނީ $1 އިން)',
+'redirectpagesub' => 'ޞަފްޙާގެ މިސްރާބު އައުކުރައްވާ',
+'lastmodifiedat' => 'މި ޞަފްހާ އަށް އެންމެ ފަހުން ބަދަލެއް ގެނެވިފައިވަނީ $1، $2 ގައެވެ.',
+'protectedpage' => 'ދިފާއުކުރެވިފައިވާ ޞަފްޙާ',
+'jumptosearch' => 'ހޯއްދަވާ',
 
 # 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'            => 'ވިކިޕީޑިއާ ގެ ތާރަފު',
-'aboutpage'            => 'Project:ތާރަފު',
-'copyright'            => 'ހުރިހާ މާއްދާއެއް $1 ގެ ދަށުން ލިބެން އެބަހުއްޓެވެ.',
-'copyrightpage'        => '{{ns:project}}:ނަކަލުކުރުމުގެހައްގު',
-'currentevents'        => 'ހިނގަމުންދާ ހާދިސާތައް',
-'disclaimers'          => 'އިއުލާނުތައް',
-'edithelp'             => 'ބަދަލުތައް ގެނައުމަށް އެހީ އެއް',
-'edithelppage'         => 'އެހީ: އުނިއިތުރު ގެންނެވުން',
-'helppage'             => 'Help:ފިހުރިސްތު',
-'mainpage'             => 'މައި ޞަފްޙާ',
+'aboutsite' => 'ވިކިޕީޑިއާ ގެ ތާރަފު',
+'aboutpage' => 'Project:ތާރަފު',
+'copyright' => 'ހުރިހާ މާއްދާއެއް $1 ގެ ދަށުން ލިބެން އެބަހުއްޓެވެ.',
+'copyrightpage' => '{{ns:project}}:ނަކަލުކުރުމުގެހައްގު',
+'currentevents' => 'ހިނގަމުންދާ ހާދިސާތައް',
+'disclaimers' => 'އިއުލާނުތައް',
+'edithelp' => 'ބަދަލުތައް ގެނައުމަށް އެހީ އެއް',
+'edithelppage' => 'އެހީ: އުނިއިތުރު ގެންނެވުން',
+'helppage' => 'Help:ފިހުރިސްތު',
+'mainpage' => 'މައި ޞަފްޙާ',
 'mainpage-description' => 'މައި ޞަފްޙާ',
-'portal'               => 'އާންމު ހޮޅުއަށި',
-'privacy'              => 'އަމިއްލަވަންތަ ސިޔާސަތު',
+'portal' => 'އާންމު ހޮޅުއަށި',
+'privacy' => 'އަމިއްލަވަންތަ ސިޔާސަތު',
 
 'badaccess' => 'ހުއްދައިގެ ކުށެއް',
 
-'ok'              => 'ރަނގަޅު',
-'editsection'     => 'އުނިއިތުރު ގެންނަވާ',
+'ok' => 'ރަނގަޅު',
+'editsection' => 'އުނިއިތުރު ގެންނަވާ',
 'editsectionhint' => 'މަޒްމޫނުގެ $1 ބަޔަށް އުނިއިތުރު ގެންނަނީ',
-'toc'             => 'ފިހުރިސްތު',
-'showtoc'         => 'ދައްކަވާ',
-'hidetoc'         => 'ފޮރުއްވާ',
+'toc' => 'ފިހުރިސްތު',
+'showtoc' => 'ދައްކަވާ',
+'hidetoc' => 'ފޮރުއްވާ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'މަޒުމޫނު',
-'nstab-user'      => 'މެންބަރު ޞަފްޙާ',
-'nstab-special'   => 'ހާއްސަ',
+'nstab-main' => 'މަޒުމޫނު',
+'nstab-user' => 'މެންބަރު ޞަފްޙާ',
+'nstab-special' => 'ހާއްސަ',
 'nstab-mediawiki' => 'މެސެޖު',
-'nstab-template'  => 'ފަންވަތް',
-'nstab-category'  => 'ގިސްމު',
+'nstab-template' => 'ފަންވަތް',
+'nstab-category' => 'ގިސްމު',
 
 # General errors
-'error'         => 'ކުށް',
+'error' => 'ކުށް',
 'databaseerror' => 'ކޮށާރުގެ އޮޅުމެއް',
-'cannotdelete'  => 'ޞަފްޙާ ނުވަތަ ފައިލު ފޮހެއެއް ނުލެވުނު (ފަހަރެއްގައި މީގެ ކުރީން އެހެން ބޭފުޅަކު ފޮހެލެއްވީ ކަމަށް ވެދާނެ)',
-'badtitle'      => 'ނުރަނގަޅު ސުރުހީއެއް',
-'viewsource'    => 'މަސްދަރު ބައްލަވާ',
+'cannotdelete' => 'ޞަފްޙާ ނުވަތަ ފައިލު ފޮހެއެއް ނުލެވުނު (ފަހަރެއްގައި މީގެ ކުރީން އެހެން ބޭފުޅަކު ފޮހެލެއްވީ ކަމަށް ވެދާނެ)',
+'badtitle' => 'ނުރަނގަޅު ސުރުހީއެއް',
+'viewsource' => 'މަސްދަރު ބައްލަވާ',
 
 # Login and logout pages
-'welcomecreation'            => '== މަރުހަބާ، $1 ! ==
+'welcomecreation' => '== މަރުހަބާ، $1 ! ==
 ތިޔަބޭފުޅާގެ މެންބަރުޝިޕް ހެދިއްޖެއެވެ. ތިޔަ ބޭފުޅާގެ ވިކިޕީޑިއާގެ ތަރުޖީހުތައް ބަދަލުކުރައްވަން ހަނދުމަފުޅު ބަހައްޓަވާށެވެ.',
-'yourname'                   => 'މެންބަރުގެނަން',
-'yourpassword'               => 'ސިއްރުބަސް',
-'yourpasswordagain'          => 'ސިއްރުބަސް އަލުންލިޔުއްވާ',
-'login'                      => 'ވަދެވަޑައިގަންނަވާ',
-'userlogin'                  => 'ވަންނަވާ / މެންބަރަކަށް ވެ ވަޑައިގަންނަވާ',
-'userlogout'                 => 'ބޭރަށް ވަޑައިގަންނަވާ',
-'nologin'                    => "މެމްބަރުކަން ހާސިލް ކުރައްވާފައި ނުވޭތޯ؟ '''$1'''",
-'nologinlink'                => 'މެމްބަރުކަން ހާސިލް ކުރައްވާ!',
-'createaccount'              => 'މެންބަރަކަށް ވެ ވަޑައިގަންނަވާ',
-'badretype'                  => 'ތިޔަ ލިޔުއްވި ދެ ސިއްރުބަސް އެއް ސިއްރު ބަހާއި އަނެއް ސިއްރު ބަހާއި ދިމަލެއް ނުވޭ. އަދި ސިއްރުބަސް ރަނގަޅަށް ޖައްސަވާށެވެ!',
-'userexists'                 => 'ތިޔަ ލިޔުއްވި ނަން މިހާރުވެސް ދަނީ ބޭނުން ކުރެވެމުން، އައު ނަމެއް އިހުތިޔާރު ކުރައްވާ!',
-'wrongpassword'              => 'ތިޔަ ލިޔުއްވި ސިއްރުބަސް އަދި ރަނގަޅެއް ނޫނެވެ! އަދި މަސައްކަތް ކޮށްލައްވާށެވެ!',
-'wrongpasswordempty'         => 'ތިޔަ ލިޔުއްވި ސިއްރުބަހެއް ނޭނގުނު. އަލުން މަސައްކަތް ކޮށްލައްވާ!',
-'mailmypassword'             => 'ސިއްރުބަސް އީމޭލުކުރައްވާ',
+'yourname' => 'މެންބަރުގެނަން',
+'yourpassword' => 'ސިއްރުބަސް',
+'yourpasswordagain' => 'ސިއްރުބަސް އަލުންލިޔުއްވާ',
+'login' => 'ވަދެވަޑައިގަންނަވާ',
+'userlogin' => 'ވަންނަވާ / މެންބަރަކަށް ވެ ވަޑައިގަންނަވާ',
+'userlogout' => 'ބޭރަށް ވަޑައިގަންނަވާ',
+'nologin' => "މެމްބަރުކަން ހާސިލް ކުރައްވާފައި ނުވޭތޯ؟ '''$1'''",
+'nologinlink' => 'މެމްބަރުކަން ހާސިލް ކުރައްވާ!',
+'createaccount' => 'މެންބަރަކަށް ވެ ވަޑައިގަންނަވާ',
+'badretype' => 'ތިޔަ ލިޔުއްވި ދެ ސިއްރުބަސް އެއް ސިއްރު ބަހާއި އަނެއް ސިއްރު ބަހާއި ދިމަލެއް ނުވޭ. އަދި ސިއްރުބަސް ރަނގަޅަށް ޖައްސަވާށެވެ!',
+'userexists' => 'ތިޔަ ލިޔުއްވި ނަން މިހާރުވެސް ދަނީ ބޭނުން ކުރެވެމުން، އައު ނަމެއް އިހުތިޔާރު ކުރައްވާ!',
+'wrongpassword' => 'ތިޔަ ލިޔުއްވި ސިއްރުބަސް އަދި ރަނގަޅެއް ނޫނެވެ! އަދި މަސައްކަތް ކޮށްލައްވާށެވެ!',
+'wrongpasswordempty' => 'ތިޔަ ލިޔުއްވި ސިއްރުބަހެއް ނޭނގުނު. އަލުން މަސައްކަތް ކޮށްލައްވާ!',
+'mailmypassword' => 'ސިއްރުބަސް އީމޭލުކުރައްވާ',
 'acct_creation_throttle_hit' => 'މާފު ކުރައްވާ، އެހެނީ ތިޔަބޭފުޅާ ވަނީ ކުރީއްސުރެ $1 މެންބަރުކަން ހޯއްދަވާފައި އެހެންވީމާ އިތުރަށް ލިބިވަޑައެއް ނުގަންނަވާނެ.',
 
 # Change password dialog
 'oldpassword' => 'ކުރީގެ ސިއްރުބަސް:',
 
 # Edit page toolbar
-'bold_sample'     => 'ބޯ އިބާރާތް',
-'bold_tip'        => 'ބޯ އިބާރާތް',
-'italic_sample'   => 'ކަތި އިބާރާތް',
-'italic_tip'      => 'ކަތި އިބާރާތް',
+'bold_sample' => 'ބޯ އިބާރާތް',
+'bold_tip' => 'ބޯ އިބާރާތް',
+'italic_sample' => 'ކަތި އިބާރާތް',
+'italic_tip' => 'ކަތި އިބާރާތް',
 'headline_sample' => 'ސުރުހީގެ އިބާރާތް',
 
 # Edit pages
-'summary'                  => 'ހުލާސާ:',
-'subject'                  => 'މާއްދާ/ސުރުހީ:',
-'minoredit'                => 'މިއީ ކުޑަކުޑަ އުނިއިތުރެކެވެ',
-'watchthis'                => 'މި ޞަފްޙާއަށް ނަޒަރުބަހައްޓަވާ',
-'savearticle'              => 'ޞަފްޙާ ރައްކާކުރައްވާ',
-'preview'                  => 'ނަމޫނާ',
-'showpreview'              => 'ނަމޫނާ',
-'showdiff'                 => 'ބަދަލުތައް ދައްކަވާ',
-'anoneditwarning'          => "'''ސަމާލުކަމަށް:''' ތިޔަ ބޭފުޅާވަނީ ވިކިޕީޑިޔާގެ މެމްބަރެއްގެ ގޮތުގައި ވަދެ ވަޑައި ނުގަނެ. އެހެންކަމުން ތިޔަ '''އައި.ޕީ''' އެޑްރެސް މި ސަފްހާގެ ތާރީހުގައި ރެކޯޑު ކުރެވޭނެއެވެ.",
-'blockedtitle'             => 'މެންބަރާމެދު ވަނީ ފިޔަވަޅުއެޅިފައި',
-'blockedtext'              => "ތިޔަ މެމްބަރު، ނުވަތަ ތިޔަ ބޭފުޅާގެ އައި.ޕީ އެޑްރެސް ވަނީ ބްލޮކް ކުރެވިފައެވ
+'summary' => 'ހުލާސާ:',
+'subject' => 'މާއްދާ/ސުރުހީ:',
+'minoredit' => 'މިއީ ކުޑަކުޑަ އުނިއިތުރެކެވެ',
+'watchthis' => 'މި ޞަފްޙާއަށް ނަޒަރުބަހައްޓަވާ',
+'savearticle' => 'ޞަފްޙާ ރައްކާކުރައްވާ',
+'preview' => 'ނަމޫނާ',
+'showpreview' => 'ނަމޫނާ',
+'showdiff' => 'ބަދަލުތައް ދައްކަވާ',
+'anoneditwarning' => "'''ސަމާލުކަމަށް:''' ތިޔަ ބޭފުޅާވަނީ ވިކިޕީޑިޔާގެ މެމްބަރެއްގެ ގޮތުގައި ވަދެ ވަޑައި ނުގަނެ. އެހެންކަމުން ތިޔަ '''އައި.ޕީ''' އެޑްރެސް މި ސަފްހާގެ ތާރީހުގައި ރެކޯޑު ކުރެވޭނެއެވެ.",
+'blockedtitle' => 'މެންބަރާމެދު ވަނީ ފިޔަވަޅުއެޅިފައި',
+'blockedtext' => "ތިޔަ މެމްބަރު، ނުވަތަ ތިޔަ ބޭފުޅާގެ އައި.ޕީ އެޑްރެސް ވަނީ ބްލޮކް ކުރެވިފައެވ
 
 މި އައި.ޕީ އެޑްރެސް ބްލޮކް ކުރީ $1 އެވެ.
 
@@ -264,66 +264,65 @@ $messages = array(
 
 ތިބޭފުޅޭގެ އައި.ޕީ އެޑް ރެސް އަކީ  $3 އެވެ.
 އަދި ބްލޮކް އައި.ޑީ އަކީ #$5 އެވެ.",
-'accmailtitle'             => 'ސިއްރުބަސް ފޮނުވިއްޖެ.',
-'accmailtext'              => '"$1" އަށްޓަކައިވާ ސިއްރު ބަސް $2 އަށް ވަނީ ފޮނުވިފައި',
-'newarticle'               => '(އައު)',
-'editing'                  => '$1 އަށް އުނިއިތުރު ގެންނަނީ',
-'editingsection'           => '$1 ގެ (ބަޔަކަށް) އުނި އިތުރު ގެންނަނީ',
-'editconflict'             => 'އުނިއިތުރުގެންނެވުމުގައި އަރާރުން: $1',
-'yourtext'                 => 'ތިޔބޭފުޅާގެ ލިޔުއްވުން',
-'yourdiff'                 => 'ތަފާތުތައް',
+'accmailtitle' => 'ސިއްރުބަސް ފޮނުވިއްޖެ.',
+'accmailtext' => '"$1" އަށްޓަކައިވާ ސިއްރު ބަސް $2 އަށް ވަނީ ފޮނުވިފައި',
+'newarticle' => '(އައު)',
+'editing' => '$1 އަށް އުނިއިތުރު ގެންނަނީ',
+'editingsection' => '$1 ގެ (ބަޔަކަށް) އުނި އިތުރު ގެންނަނީ',
+'editconflict' => 'އުނިއިތުރުގެންނެވުމުގައި އަރާރުން: $1',
+'yourtext' => 'ތިޔބޭފުޅާގެ ލިޔުއްވުން',
+'yourdiff' => 'ތަފާތުތައް',
 'semiprotectedpagewarning' => "'''ސަމާލުކަމަށް:''' މި ޞަފްހާވަނީ ދިފާއު ކުރެވިފައެވެ. އެހެންކަމުން މިސަފްޙާ އަށް އުނި އިތުރު ގެނެވޭނީ ހަމައެކަނި މެމްބަރުކަން ހާސިލް ކުރައްވާފައިވާ ބޭފުޅުންނަށެވެ!",
-'templatesused'            => 'މި ޞަފްޙާ ގައި ބޭނުން ކުރެވިފައިވާ ފަންވަތްތައް:',
+'templatesused' => 'މި ޞަފްޙާ ގައި ބޭނުން ކުރެވިފައިވާ ފަންވަތްތައް:',
 
 # History pages
 'next' => 'ކުރިޔަށް',
 
 # Diffs
-'difference'              => '(އިސްލާހުތަކުގައި ހުރި ފަރަގު)',
 'compareselectedversions' => 'އިހުތިޔާރު ކުރެވިފައިވާ ނުސްހާތައް އަޅައިކިޔުއްވާ',
 
 # Search results
-'viewprevnext'   => 'ބައްލަވާ($1 {{int:pipe-separator}} $2) ($3).',
+'viewprevnext' => 'ބައްލަވާ($1 {{int:pipe-separator}} $2) ($3).',
 'searchhelp-url' => 'Help:ފިހުރިސްތު',
 
 # Preferences page
-'preferences'    => 'ތަރުޖީހުތައް',
-'mypreferences'  => 'މަގޭ ތަރުޖީހުތައް',
+'preferences' => 'ތަރުޖީހުތައް',
+'mypreferences' => 'މަގޭ ތަރުޖީހުތައް',
 'changepassword' => 'ސިއްރުބަސް ބަދަލުކުރައްވާ',
-'columns'        => 'ކޮލަންތައް:',
-'prefs-files'    => 'ފައިލުތައް',
-'youremail'      => '٭ އީމޭލު',
-'username'       => 'މެންބަރުނަން:',
-'yourrealname'   => '* އަސްލު ނަން',
-'yourlanguage'   => 'ބަސް:',
-'yournick'       => 'ލަގަބު/ކުއްނިއްޔާ:',
-'email'          => 'އީމޭލު',
+'columns' => 'ކޮލަންތައް:',
+'prefs-files' => 'ފައިލުތައް',
+'youremail' => '٭ އީމޭލު',
+'username' => 'މެންބަރުނަން:',
+'yourrealname' => '* އަސްލު ނަން',
+'yourlanguage' => 'ބަސް:',
+'yournick' => 'ލަގަބު/ކުއްނިއްޔާ:',
+'email' => 'އީމޭލު',
 
 # User rights
-'userrights'               => 'މެންބަރުގެ ހައްގުތަކުގެ އިންތިޒާމް',
+'userrights' => 'މެންބަރުގެ ހައްގުތަކުގެ އިންތިޒާމް',
 'userrights-user-editname' => 'މެންބަރުނަން ލިޔުއްވާ:',
 
 # Recent changes
-'recentchanges'     => 'ފަހު ބަދަލުތައް',
-'recentchangestext' => 'މި ވިކިޕީޑިޔާ އަށް ގެނެވިފައިވާ އެންމެ ފަހުގެ ބަދަލުތައް މި ޞަފްހާ އިން ބައްލަވާ!',
-'diff'              => 'ފަރަގު',
-'hide'              => 'ފޮރުވާ',
-'show'              => 'ދައްކަވާ',
+'recentchanges' => 'ފަހު ބަދަލުތައް',
+'recentchanges-summary' => 'މި ވިކިޕީޑިޔާ އަށް ގެނެވިފައިވާ އެންމެ ފަހުގެ ބަދަލުތައް މި ޞަފްހާ އިން ބައްލަވާ!',
+'diff' => 'ފަރަގު',
+'hide' => 'ފޮރުވާ',
+'show' => 'ދައްކަވާ',
 
 # Recent changes linked
-'recentchangeslinked'         => 'ގުޅުންހުރި ބަދަލުތައް',
-'recentchangeslinked-feed'    => 'ގުޅުންހުރި ބަދަލުތައް',
+'recentchangeslinked' => 'ގުޅުންހުރި ބަދަލުތައް',
+'recentchangeslinked-feed' => 'ގުޅުންހުރި ބަދަލުތައް',
 'recentchangeslinked-toolbox' => 'ގުޅުންހުރި ބަދަލުތައް',
 
 # Upload
-'upload'            => 'ފައިލު ފޮނުވާ',
-'uploadbtn'         => 'ފައިލު ފޮނުވާ',
-'filedesc'          => 'ހުލާސާ',
+'upload' => 'ފައިލު ފޮނުވާ',
+'uploadbtn' => 'ފައިލު ފޮނުވާ',
+'filedesc' => 'ހުލާސާ',
 'fileuploadsummary' => 'ހުލާސާ:',
-'filestatus'        => 'ނަކަލުކުރުމުގެހައްގުގެ ހާލަތު:',
-'filesource'        => 'މަސްދަރު:',
-'uploadedfiles'     => 'ފޮނުވިފައިވާ ފައިލުތައް',
-'uploadwarning'     => 'ފައިލުފޮނުއްވުމުގެ ކުރިން ދެވޭ އިންޒާރު',
+'filestatus' => 'ނަކަލުކުރުމުގެހައްގުގެ ހާލަތު:',
+'filesource' => 'މަސްދަރު:',
+'uploadedfiles' => 'ފޮނުވިފައިވާ ފައިލުތައް',
+'uploadwarning' => 'ފައިލުފޮނުއްވުމުގެ ކުރިން ދެވޭ އިންޒާރު',
 
 # Special:ListFiles
 'listfiles' => 'ފައިލުތަކުގެ ފިހުރިސްތު',
@@ -335,34 +334,34 @@ $messages = array(
 'randompage' => 'ކޮންމެވެސް ޞަފްޙާއެއް',
 
 # Statistics
-'statistics'              => 'ތަފާސްހިސާބުތައް',
+'statistics' => 'ތަފާސްހިސާބުތައް',
 'statistics-header-users' => 'މެންބަރުގެ ތަފާސްހިސާބު',
 
 'brokenredirects' => 'އޮޅިފައިވާ މިސްރާބުތައް',
 
 # Miscellaneous special pages
 'unusedcategories' => 'ބޭނުންނުކުރެވޭ ގިސްމުތައް',
-'unusedimages'     => 'ބޭނުންނުކުރެވޭ ފައިލުތައް',
+'unusedimages' => 'ބޭނުންނުކުރެވޭ ފައިލުތައް',
 'wantedcategories' => 'ބޭނުންފުޅުވާ ގިސްމުތައް',
-'wantedpages'      => 'ބޭނުންފުޅުވާ ޞަފްޙާތައް',
-'shortpages'       => 'ކުރު ޞަފްޙާތައް',
-'ancientpages'     => 'ބޯދާ ޞަފްޙާތައް',
-'move'             => 'ނަން/ތަން ބަދަލުކުރައްވާ',
-'movethispage'     => 'މި ޞަފްހާގެ ނަންބަދަލުކުރައްވާ',
+'wantedpages' => 'ބޭނުންފުޅުވާ ޞަފްޙާތައް',
+'shortpages' => 'ކުރު ޞަފްޙާތައް',
+'ancientpages' => 'ބޯދާ ޞަފްޙާތައް',
+'move' => 'ނަން/ތަން ބަދަލުކުރައްވާ',
+'movethispage' => 'މި ޞަފްހާގެ ނަންބަދަލުކުރައްވާ',
 
 # Book sources
 'booksources' => 'ފޮތްތަކުގެ މަސްދަރުތައް',
 
 # Special:AllPages
-'allpages'       => 'ހުރިހާ ޞަފްޙާތައް',
-'allarticles'    => 'ހުރިހާ މަޒުމޫނުތައް',
+'allpages' => 'ހުރިހާ ޞަފްޙާތައް',
+'allarticles' => 'ހުރިހާ މަޒުމޫނުތައް',
 'allinnamespace' => 'ހުރިހާ ޞަފްޙާތައް (ނުތުގު $1 ގައިވާ)',
-'allpagesprev'   => 'ކުރީގެ',
-'allpagesnext'   => 'ކުރިޔަށް އޮތް',
+'allpagesprev' => 'ކުރީގެ',
+'allpagesnext' => 'ކުރިޔަށް އޮތް',
 'allpagessubmit' => 'ދުރުވޭ',
 
 # Special:Categories
-'categories'         => 'ގިސްމުތައް',
+'categories' => 'ގިސްމުތައް',
 'categoriespagetext' => 'ތިރީގައި މިވާ ގިސްމުތައް ވިކީ ގައި މައުޖޫދުވެގެން ވެއެވެ.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
@@ -371,44 +370,44 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'emailuser' => 'މި މެންބަރަށް އީމޭލު ފޮނުއްވާ',
 
 # Watchlist
-'watchlist'         => 'މަގޭ ނަޒަރު',
-'addedwatchtext'    => "މި ޞަފްޙާ \"<nowiki>\$1</nowiki>\" ތިޔަބޭފުޅާގެ [[Special:Watchlist|ހާއްސަ ނަޒަރު]] ފިހުރިސްތަށް ލެވިއްޖެއެވެ. ދެން ކުރިމަގުގައި މި ޞަފްޙާ އަދި މިއާ ގުޅޭ ބަހުސް ގެ ޞަފްޙާ އަށް ގެނެވޭ އުނިއިތުރު ތަކުގެ މައުލޫމާތު މިޞަފްހާއަށް ލެވޭނެއެވެ. އަދި އެ ޞަފްޙާތަކުގެ ޝަނާހަތު ފަސޭހަ ކުރުމަށްޓަކައި [[Special:ފަހު ބަދަލުތައް|ފަހު ބަދަލުތަކުގެ ފިހުރިސްތު]] ގައި އެބައިތައް '''ބޯ''' (bold) އަކުރުން ލިޔެވޭނެއެވެ. <p> ކޮންމެ އިރަކުވެސް ތިޔަބޭފުޅާ ހާއްސަ ނަޒަރުގެ ފިހުރިސްތުން މި ޞަފްޙާ އުނިކުރައްވަން ބޭނުންފުޅިއްޔާ މަތީގައި ދެވިފައިވާ \"ހާއްސަ ނަޒަރުން އުނިކުރޭ\" ގައި ކޮއްޓަވާ ލައްވާށެވެ.",
-'watch'             => 'ނަޒަރުބަހައްޓަވާ',
-'watchthispage'     => 'މި ޞަފްޙާއަށް ނަޒަރުބަހައްޓަވާ',
-'unwatch'           => 'ހާއްސަ ނަޒަރުން އުނިކުރޭ',
+'watchlist' => 'މަގޭ ނަޒަރު',
+'addedwatchtext' => "މި ޞަފްޙާ \"<nowiki>\$1</nowiki>\" ތިޔަބޭފުޅާގެ [[Special:Watchlist|ހާއްސަ ނަޒަރު]] ފިހުރިސްތަށް ލެވިއްޖެއެވެ. ދެން ކުރިމަގުގައި މި ޞަފްޙާ އަދި މިއާ ގުޅޭ ބަހުސް ގެ ޞަފްޙާ އަށް ގެނެވޭ އުނިއިތުރު ތަކުގެ މައުލޫމާތު މިޞަފްހާއަށް ލެވޭނެއެވެ. އަދި އެ ޞަފްޙާތަކުގެ ޝަނާހަތު ފަސޭހަ ކުރުމަށްޓަކައި [[Special:ފަހު ބަދަލުތައް|ފަހު ބަދަލުތަކުގެ ފިހުރިސްތު]] ގައި އެބައިތައް '''ބޯ''' (bold) އަކުރުން ލިޔެވޭނެއެވެ. <p> ކޮންމެ އިރަކުވެސް ތިޔަބޭފުޅާ ހާއްސަ ނަޒަރުގެ ފިހުރިސްތުން މި ޞަފްޙާ އުނިކުރައްވަން ބޭނުންފުޅިއްޔާ މަތީގައި ދެވިފައިވާ \"ހާއްސަ ނަޒަރުން އުނިކުރޭ\" ގައި ކޮއްޓަވާ ލައްވާށެވެ.",
+'watch' => 'ނަޒަރުބަހައްޓަވާ',
+'watchthispage' => 'މި ޞަފްޙާއަށް ނަޒަރުބަހައްޓަވާ',
+'unwatch' => 'ހާއްސަ ނަޒަރުން އުނިކުރޭ',
 'watchlistcontains' => 'ތިޔަބޭފުޅާގެ ހާއްސަ ނަޒަރު ފިހުރިސްތުގައި ވަނީ $1 ޞަފްޙާއެވެ.',
-'wlnote'            => 'ތިރީގައި މިވަނީ އެއީ ފާއިތުވި <b>$2</b> ގަޑި އިރުގެ ތެރޭގައިގެނެވިފައިވާ ފަހު $1 ބަދަލެވެ.',
+'wlnote' => 'ތިރީގައި މިވަނީ އެއީ ފާއިތުވި <b>$2</b> ގަޑި އިރުގެ ތެރޭގައިގެނެވިފައިވާ ފަހު $1 ބަދަލެވެ.',
 
 'changed' => 'ބަދަލުކުރެވިއްޖެ',
 
 # Delete
-'deletepage'        => 'ޞަފްޙާ ފޮހެލައްވާ',
-'confirm'           => 'ޔަގީން',
+'deletepage' => 'ޞަފްޙާ ފޮހެލައްވާ',
+'confirm' => 'ޔަގީން',
 'confirmdeletetext' => 'ތިޔަބޭފުޅާ ތިޔަ އުޅުއްވަނީ ޞަފްޙާއެއް ނުވަތަ ތަޞްވީރެއް އެއާ ގުޅިފައިވާ ހުރިހާ ތާރީހަކާއެކު ކޮށާރުން ފޮހެލައްވާށެވެ. މިކަން މިގޮތަށް ކުރައްވަން ބޭނުންފުޅުކަން ޔަގީން ކުރައްވާށެވެ. އަދި މިކަމުން ނުކުމެދާނެ ނަތީޖާއެއް ވެސް ތިޔަ ބޭފުޅާއަށް ރަނގަޅަށް އެނގިވަޑައިގަންނަވަންވާނެއެވެ. އަދި ތިޔަކަން ތިކުރެއްވެނީ [[{{MediaWiki:Policy-url}}|ވިކިޕީޑިއާ ގެ ސިޔާސަތާ]] އެއްގޮތަށްތޯ ވެސް ބައްލަވައި ޔަގީން ކުރައްވާށެވެ!',
-'actioncomplete'    => 'އަމަލު ފުރިހަމަވެއްޖެ',
-'deletecomment'     => 'ސަބަބު',
+'actioncomplete' => 'އަމަލު ފުރިހަމަވެއްޖެ',
+'deletecomment' => 'ސަބަބު',
 
 # Rollback
 'cantrollback' => 'އުނިއިތުރު އިއާދައެއް ނުކުރެވޭނެ؛ އެހެނީ އެންމެ ފަހު އުނިއިތުރުގައި ހިއްސާވި ފަރާތަކީ މިޞަފްޙާގެ ހަމައެކަނި މުއައްލިފެވެ.',
 
 # Protect
 'unprotectedarticle' => '"[[$1]]" ދިފާއުކުރުން ހުއްޓާލެވިއްޖެ',
-'prot_1movedto2'     => '[[$1]] އަށް ނަގުލުކުރެވިފައި [[$2]]',
+'prot_1movedto2' => '[[$1]] އަށް ނަގުލުކުރެވިފައި [[$2]]',
 
 # Restrictions (nouns)
 'restriction-edit' => 'އުނިއިތުރު ގެންނަވާ',
 
 # Undelete
-'undelete'        => 'ފޮހެލެވިފައިވާ ޞަފްޙާތައް ބައްލަވާ',
+'undelete' => 'ފޮހެލެވިފައިވާ ޞަފްޙާތައް ބައްލަވާ',
 'viewdeletedpage' => 'ފޮހެލެވިފައިވާ ޞަފްޙާތައް ބައްލަވާ',
-'undeletebtn'     => 'އިއާދަ ކުރޭ!',
+'undeletebtn' => 'އިއާދަ ކުރޭ!',
 
 # Namespace form on various pages
 'blanknamespace' => '(މައި)',
 
 # Contributions
 'contributions' => 'މެންބަރު ގެ ހިއްސާ',
-'mycontris'     => 'މަގޭ ހިއްސާ',
+'mycontris' => 'މަގޭ ހިއްސާ',
 
 'sp-contributions-userrights' => 'މެންބަރުގެ ހައްގުތަކުގެ އިންތިޒާމް',
 
@@ -416,51 +415,51 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'whatlinkshere' => 'މިއާ ގުޅެނީ ކޮންއެއްޗެއް',
 
 # Block/unblock
-'blockip'           => 'މެންބަރާ މެދު ފިޔަވަޅުއަޅުއްވާ',
-'ipbreason'         => 'ސަބަބު',
-'ipbsubmit'         => 'މި މެމްބަރާއި މެދު ފިޔަވަޅު އަޅުއްވާ!',
-'badipaddress'      => 'ނުރަނގަޅު އައި.ޕީ އެޑްރެހެއް',
-'expiringblock'     => 'މުއްދަތު ހަމަވާނީ $1 $2',
-'blocklink'         => 'ފިޔަވަޅުއަޅުއްވާ',
-'contribslink'      => 'ޙިއްޞާ',
+'blockip' => 'މެންބަރާ މެދު ފިޔަވަޅުއަޅުއްވާ',
+'ipbreason' => 'ސަބަބު',
+'ipbsubmit' => 'މި މެމްބަރާއި މެދު ފިޔަވަޅު އަޅުއްވާ!',
+'badipaddress' => 'ނުރަނގަޅު އައި.ޕީ އެޑްރެހެއް',
+'expiringblock' => 'މުއްދަތު ހަމަވާނީ $1 $2',
+'blocklink' => 'ފިޔަވަޅުއަޅުއްވާ',
+'contribslink' => 'ޙިއްޞާ',
 'proxyblocksuccess' => 'ފުރިހަމަވެއްޖެ.',
 
 # Developer tools
-'lockdb'  => 'ކޮށާރު ބަންދުކުރައްވާ',
+'lockdb' => 'ކޮށާރު ބަންދުކުރައްވާ',
 'lockbtn' => 'ކޮށާރު ބަންދުކުރައްވާ',
 
 # Move page
-'move-page-legend'        => 'ޞަފްޙާގެ ނަން ބަދަލުކުރައްވާ',
-'movearticle'             => 'ޞަފްޙާގެ ނަން/ތަން ބަދަލުކުރައްވާ',
-'newtitle'                => 'އައު ނަމަކަށް',
-'move-watch'              => 'މި ޞަފްހާ އަށް ނަޒަރުބަހައްޓަވާ!',
-'movepagebtn'             => 'ޞަފްޙާގެނަން ބަދަލުކުރައްވާ',
-'articleexists'           => 'ތިޔަ ސުރުހީގައި ކުރީއްސުރެ ވެސް ޞަފްޙައެއް ވޭ، ނުވަތަ ތިޔަ އިހުތިޔާރުކުރެއްވި ނަން ރަނގަޅެއް ނޫން، ވީމާ އެހެން ނަމެއް އިހުތިޔާރުކުރެއްވުން އެދެވިގެންވެއެވެ.',
-'movedto'                 => 'އަށް ބަދަލުކުރެވިފައި',
-'movelogpagetext'         => 'ތިރީގައި މިވަނީ ނަން/ތަން ބަދަލުކުރެވިފައިވާ ޞަފްޙާތަކުގެ ފިހުރިސްތެކެވެ.',
-'movereason'              => 'ސަބަބު',
-'delete_and_move'         => 'ފޮހެލައްވާފައި އެހެންނަމަކަށްބަދަލުކުރައްވާ',
+'move-page-legend' => 'ޞަފްޙާގެ ނަން ބަދަލުކުރައްވާ',
+'movearticle' => 'ޞަފްޙާގެ ނަން/ތަން ބަދަލުކުރައްވާ',
+'newtitle' => 'އައު ނަމަކަށް',
+'move-watch' => 'މި ޞަފްހާ އަށް ނަޒަރުބަހައްޓަވާ!',
+'movepagebtn' => 'ޞަފްޙާގެނަން ބަދަލުކުރައްވާ',
+'articleexists' => 'ތިޔަ ސުރުހީގައި ކުރީއްސުރެ ވެސް ޞަފްޙައެއް ވޭ، ނުވަތަ ތިޔަ އިހުތިޔާރުކުރެއްވި ނަން ރަނގަޅެއް ނޫން، ވީމާ އެހެން ނަމެއް އިހުތިޔާރުކުރެއްވުން އެދެވިގެންވެއެވެ.',
+'movedto' => 'އަށް ބަދަލުކުރެވިފައި',
+'movelogpagetext' => 'ތިރީގައި މިވަނީ ނަން/ތަން ބަދަލުކުރެވިފައިވާ ޞަފްޙާތަކުގެ ފިހުރިސްތެކެވެ.',
+'movereason' => 'ސަބަބު',
+'delete_and_move' => 'ފޮހެލައްވާފައި އެހެންނަމަކަށްބަދަލުކުރައްވާ',
 'delete_and_move_confirm' => 'އާދެ، މި ޞަފްޙާ ފޮހެލައްވާ',
-'delete_and_move_reason'  => 'އެހެންނަމަކަށް ބަދަލުކުރުމަށްޓަކައި ފޮހެލެވިއްޖެ',
+'delete_and_move_reason' => 'އެހެންނަމަކަށް ބަދަލުކުރުމަށްޓަކައި ފޮހެލެވިއްޖެ',
 
 # Namespace 8 related
-'allmessages'        => 'ނިޒާމުގެ މެސެޖުތައް',
-'allmessagesname'    => 'ނަން',
+'allmessages' => 'ނިޒާމުގެ މެސެޖުތައް',
+'allmessagesname' => 'ނަން',
 'allmessagesdefault' => 'ކުރީގެ މަތަން',
 'allmessagescurrent' => 'މިހާރުގެ މަތަން',
 
 # Tooltip help for the actions
-'tooltip-pt-logout'  => 'ބޭރަށްވަޑައިގަންނަވާ',
+'tooltip-pt-logout' => 'ބޭރަށްވަޑައިގަންނަވާ',
 'tooltip-n-mainpage' => 'މައި ސަފްޙާއަށް ވަަޑައިގަންނަވާ',
 
 # Special:NewFiles
 'showhidebots' => '($1 ސެއްޓި)',
-'ilsubmit'     => 'ހޯއްދަވާ',
+'ilsubmit' => 'ހޯއްދަވާ',
 
 # EXIF tags
 'exif-imagedescription' => 'ތަސްވީރުގެ ސުރުހީ',
-'exif-artist'           => 'މުސައްނިފު',
-'exif-filesource'       => 'ފައިލުގެ މަސްދަރު',
+'exif-artist' => 'މުސައްނިފު',
+'exif-filesource' => 'ފައިލުގެ މަސްދަރު',
 
 # Pseudotags used for GPSSpeedRef
 'exif-gpsspeed-n' => 'ތަސްވީރުގެ ސުރުހީ',
index ad84110..8afc106 100644 (file)
@@ -27,220 +27,220 @@ $digitTransformTable = array(
 
 $messages = array(
 # Dates
-'sunday'        => 'འབྲུག་གཟའ་ཟླཝ་',
-'monday'        => 'འབྲུག་གཟའ་མིག་དམར་',
-'tuesday'       => 'འབྲུག་གཟའ་ལྷགཔ་',
-'wednesday'     => 'འབྲུག་གཟའ་ཕུརཔ་',
-'thursday'      => 'འབྲུག་གཟའ་པ་སངས་',
-'friday'        => 'འབྲུག་གཟའ་སྤེནཔ་',
-'saturday'      => 'འབྲུག་གཟའ་ཉིམ་',
-'sun'           => 'ཟླཝ།',
-'mon'           => 'མིགམ།',
-'tue'           => 'ལྷགཔ།',
-'wed'           => 'ཕུརཔ།',
-'thu'           => 'སྤ་སངས།',
-'fri'           => 'སྤེནཔ།',
-'sat'           => 'ཉིམ།',
-'january'       => 'སྤྱི་ཟླ་དང་པ།',
-'february'      => 'སྤྱི་ཟླ་གཉིས་པ།',
-'march'         => 'སྤྱི་ཟླ་གསུམ་པ།',
-'april'         => 'སྤྱི་ཟླ་བཞི་པ།',
-'may_long'      => 'སྤྱི་ཟླ་ལྔ་པ།',
-'june'          => 'སྤྱི་ཟླ་དྲུག་པ།',
-'july'          => 'སྤྱི་ཟླ་བདུན་པ།',
-'august'        => 'སྤྱི་ཟླ་བརྒྱད་པ།',
-'september'     => 'སྤྱི་ཟླ་དགུ་པ།',
-'october'       => 'སྤྱི་ཟླ་བཅུ་པ།',
-'november'      => 'སྤྱི་ཟླ་བཅུ་གཅིག་པ།',
-'december'      => 'སྤྱི་ཟླ་བཅུ་གཉིས་པ།',
-'january-gen'   => 'སྤྱི་ཟླ་ ༡ པའི་',
-'february-gen'  => 'སྤྱི་ཟླ་ ༢ པའི་',
-'march-gen'     => 'སྤྱི་ཟླ་ ༣ པའི་',
-'april-gen'     => 'སྤྱི་ཟླ་ ༤ པའི་',
-'may-gen'       => 'སྤྱི་ཟླ་ ༥ པའི་',
-'june-gen'      => 'སྤྱི་ཟླ་ ༦ པའི་',
-'july-gen'      => 'སྤྱི་ཟླ་ ༧ པའི་',
-'august-gen'    => 'སྤྱི་ཟླ་ ༨ པའི་',
+'sunday' => 'འབྲུག་གཟའ་ཟླཝ་',
+'monday' => 'འབྲུག་གཟའ་མིག་དམར་',
+'tuesday' => 'འབྲུག་གཟའ་ལྷགཔ་',
+'wednesday' => 'འབྲུག་གཟའ་ཕུརཔ་',
+'thursday' => 'འབྲུག་གཟའ་པ་སངས་',
+'friday' => 'འབྲུག་གཟའ་སྤེནཔ་',
+'saturday' => 'འབྲུག་གཟའ་ཉིམ་',
+'sun' => 'ཟླཝ།',
+'mon' => 'མིགམ།',
+'tue' => 'ལྷགཔ།',
+'wed' => 'ཕུརཔ།',
+'thu' => 'སྤ་སངས།',
+'fri' => 'སྤེནཔ།',
+'sat' => 'ཉིམ།',
+'january' => 'སྤྱི་ཟླ་དང་པ།',
+'february' => 'སྤྱི་ཟླ་གཉིས་པ།',
+'march' => 'སྤྱི་ཟླ་གསུམ་པ།',
+'april' => 'སྤྱི་ཟླ་བཞི་པ།',
+'may_long' => 'སྤྱི་ཟླ་ལྔ་པ།',
+'june' => 'སྤྱི་ཟླ་དྲུག་པ།',
+'july' => 'སྤྱི་ཟླ་བདུན་པ།',
+'august' => 'སྤྱི་ཟླ་བརྒྱད་པ།',
+'september' => 'སྤྱི་ཟླ་དགུ་པ།',
+'october' => 'སྤྱི་ཟླ་བཅུ་པ།',
+'november' => 'སྤྱི་ཟླ་བཅུ་གཅིག་པ།',
+'december' => 'སྤྱི་ཟླ་བཅུ་གཉིས་པ།',
+'january-gen' => 'སྤྱི་ཟླ་ ༡ པའི་',
+'february-gen' => 'སྤྱི་ཟླ་ ༢ པའི་',
+'march-gen' => 'སྤྱི་ཟླ་ ༣ པའི་',
+'april-gen' => 'སྤྱི་ཟླ་ ༤ པའི་',
+'may-gen' => 'སྤྱི་ཟླ་ ༥ པའི་',
+'june-gen' => 'སྤྱི་ཟླ་ ༦ པའི་',
+'july-gen' => 'སྤྱི་ཟླ་ ༧ པའི་',
+'august-gen' => 'སྤྱི་ཟླ་ ༨ པའི་',
 'september-gen' => 'སྤྱི་ཟླ་ ༩ པའི་',
-'october-gen'   => 'སྤྱི་ཟླ་ ༡༠ པའི་',
-'november-gen'  => 'སྤྱི་ཟླ་ ༡༡ པའི་',
-'december-gen'  => 'སྤྱི་ཟླ་ ༡༢ པའི་',
-'jan'           => 'ཟླ་༡ པ།',
-'feb'           => 'ཟླ་༢ པ།',
-'mar'           => 'ཟླ་༣ པ།',
-'apr'           => 'ཟླ་༤ པ།',
-'may'           => 'ཟླ་༥ པ།',
-'jun'           => 'ཟླ་༦ པ།',
-'jul'           => 'ཟླ་༧ པ།',
-'aug'           => 'ཟླ་༨ པ།',
-'sep'           => 'ཟླ་༩ པ།',
-'oct'           => 'ཟླ་༡༠ པ།',
-'nov'           => 'ཟླ་༡༡ པ།',
-'dec'           => 'ཟླ་༡༢ པ།',
+'october-gen' => 'སྤྱི་ཟླ་ ༡༠ པའི་',
+'november-gen' => 'སྤྱི་ཟླ་ ༡༡ པའི་',
+'december-gen' => 'སྤྱི་ཟླ་ ༡༢ པའི་',
+'jan' => 'ཟླ་༡ པ།',
+'feb' => 'ཟླ་༢ པ།',
+'mar' => 'ཟླ་༣ པ།',
+'apr' => 'ཟླ་༤ པ།',
+'may' => 'ཟླ་༥ པ།',
+'jun' => 'ཟླ་༦ པ།',
+'jul' => 'ཟླ་༧ པ།',
+'aug' => 'ཟླ་༨ པ།',
+'sep' => 'ཟླ་༩ པ།',
+'oct' => 'ཟླ་༡༠ པ།',
+'nov' => 'ཟླ་༡༡ པ།',
+'dec' => 'ཟླ་༡༢ པ།',
 
 # Categories related messages
-'category_header'        => 'དབྱེ་རིམ་ "$1" ནང་གི་ཤོག་ལེབ་ཚུ།',
-'subcategories'          => 'ཡན་ལག་དབྱེ་རིམ།',
-'category-media-header'  => 'དབྱེ་རིམ་ \\"$1\\" ནང་གི་བརྡ་བརྒྱུད།',
-'category-empty'         => "''ད་ལྟོ་དབྱེ་རིམ་དེ་ནང་ ཤོག་ལེབ་དང་བརྡ་བརྒྱུད་ག་ནི་ཡང་མིན་འདུག།''",
+'category_header' => 'དབྱེ་རིམ་ "$1" ནང་གི་ཤོག་ལེབ་ཚུ།',
+'subcategories' => 'ཡན་ལག་དབྱེ་རིམ།',
+'category-media-header' => 'དབྱེ་རིམ་ \\"$1\\" ནང་གི་བརྡ་བརྒྱུད།',
+'category-empty' => "''ད་ལྟོ་དབྱེ་རིམ་དེ་ནང་ ཤོག་ལེབ་དང་བརྡ་བརྒྱུད་ག་ནི་ཡང་མིན་འདུག།''",
 'listingcontinuesabbrev' => 'འཕྲོ་མཐུད།',
 
-'about'     => 'སྐོར་ལས།',
+'about' => 'སྐོར་ལས།',
 'newwindow' => '(ཝིན་ཌོ་གསརཔ་ནང་ ཁ་ཕྱེཝ་ཨིན།)',
-'cancel'    => 'ཆ་མེད་གཏང་།',
-'mytalk'    => 'ངེ་གི་བློ།',
+'cancel' => 'ཆ་མེད་གཏང་།',
+'mytalk' => 'ངེ་གི་བློ།',
 
 # Cologne Blue skin
 'qbfind' => 'འཚོལ།',
 'qbedit' => 'ཞུན་དག',
 
-'errorpagetitle'   => 'འཛོལ་བ།',
-'returnto'         => '$1 ལུ་ལོག།',
-'tagline'          => '{{SITENAME}} ལས།',
-'help'             => 'གྲོགས་རམ།',
-'search'           => 'འཚོལ་ཞིབ།',
-'searchbutton'     => 'འཚོལ་ཞིབ།',
-'searcharticle'    => 'འགྱོ།',
-'history'          => 'ཤོག་ལེབ་སྤྱོད་ཤུལ།',
-'history_short'    => 'སྤྱོད་ཤུལ།',
+'errorpagetitle' => 'འཛོལ་བ།',
+'returnto' => '$1 ལུ་ལོག།',
+'tagline' => '{{SITENAME}} ལས།',
+'help' => 'གྲོགས་རམ།',
+'search' => 'འཚོལ་ཞིབ།',
+'searchbutton' => 'འཚོལ་ཞིབ།',
+'searcharticle' => 'འགྱོ།',
+'history' => 'ཤོག་ལེབ་སྤྱོད་ཤུལ།',
+'history_short' => 'སྤྱོད་ཤུལ།',
 'printableversion' => 'དཔར་བསྐྲུན་འབད་བཏུབ་པའི་ཐོན་རིམ།',
-'permalink'        => 'རྟག་བརྟན་འབྲེལ་ལམ།',
-'edit'             => 'ཞུན་དག།',
-'editthispage'     => 'ཤོག་ལེབ་འདི་ ཞུན་དག་འབད།',
-'delete'           => 'བཏོན་གཏང་།',
-'protect'          => 'ཉེན་སྐྱོབ།',
-'newpage'          => 'ཤོག་ལེབ་གསརཔ།',
-'talkpage'         => 'ཤོག་ལེབ་འདི་གྲོས་བསྡུར་འབད།',
+'permalink' => 'རྟག་བརྟན་འབྲེལ་ལམ།',
+'edit' => 'ཞུན་དག།',
+'editthispage' => 'ཤོག་ལེབ་འདི་ ཞུན་དག་འབད།',
+'delete' => 'བཏོན་གཏང་།',
+'protect' => 'ཉེན་སྐྱོབ།',
+'newpage' => 'ཤོག་ལེབ་གསརཔ།',
+'talkpage' => 'ཤོག་ལེབ་འདི་གྲོས་བསྡུར་འབད།',
 'talkpagelinktext' => 'བློ།',
-'personaltools'    => 'རང་དོན་ལག་ཆས།',
-'talk'             => 'གྲོས་བསྡུར།',
-'views'            => 'མཐོང་སྣང་།',
-'toolbox'          => 'ལག་ཆས་སྒྲོམ།',
-'redirectedfrom'   => '($1 ལས་ ལོག་བཏང་ཡོདཔ་)',
-'redirectpagesub'  => 'ཤོག་ལེབ་སླར་ལོག་འབད།',
-'jumpto'           => 'འཕྲོ་མཐུད་འགྱོ་:',
+'personaltools' => 'རང་དོན་ལག་ཆས།',
+'talk' => 'གྲོས་བསྡུར།',
+'views' => 'མཐོང་སྣང་།',
+'toolbox' => 'ལག་ཆས་སྒྲོམ།',
+'redirectedfrom' => '($1 ལས་ ལོག་བཏང་ཡོདཔ་)',
+'redirectpagesub' => 'ཤོག་ལེབ་སླར་ལོག་འབད།',
+'jumpto' => 'འཕྲོ་མཐུད་འགྱོ་:',
 'jumptonavigation' => 'འཛུལ་འགྱོ་',
-'jumptosearch'     => 'འཚོལ་ཞིབ།',
+'jumptosearch' => 'འཚོལ་ཞིབ།',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => '{{SITENAME}} གི་སྐོར་ལས།',
-'aboutpage'            => 'Project:སྐོར་ལས།',
-'copyrightpage'        => '{{ns:project}}:འདྲ་བཤུས་འབད་ཆ།',
-'currentevents'        => 'ད་ལྟོའི་བྱུང་ལས།',
-'currentevents-url'    => 'Project:ད་ལྟོའི་བྱུང་ལས།',
-'disclaimers'          => 'ཁས་མི་ལེན་པ།',
-'disclaimerpage'       => 'Project: སྤྱིར་བཏང་ཁས་མི་ལེན་པ།',
-'edithelp'             => 'ཞུན་དག་གྲོགས་རམ།',
-'edithelppage'         => 'Help: ཞུན་དག།',
-'helppage'             => 'Help:ནང་དོན།',
-'mainpage'             => 'མ་ཤོག།',
+'aboutsite' => '{{SITENAME}} གི་སྐོར་ལས།',
+'aboutpage' => 'Project:སྐོར་ལས།',
+'copyrightpage' => '{{ns:project}}:འདྲ་བཤུས་འབད་ཆ།',
+'currentevents' => 'ད་ལྟོའི་བྱུང་ལས།',
+'currentevents-url' => 'Project:ད་ལྟོའི་བྱུང་ལས།',
+'disclaimers' => 'ཁས་མི་ལེན་པ།',
+'disclaimerpage' => 'Project: སྤྱིར་བཏང་ཁས་མི་ལེན་པ།',
+'edithelp' => 'ཞུན་དག་གྲོགས་རམ།',
+'edithelppage' => 'Help: ཞུན་དག།',
+'helppage' => 'Help:ནང་དོན།',
+'mainpage' => 'མ་ཤོག།',
 'mainpage-description' => 'མ་ཤོག།',
-'portal'               => 'མི་སྡེའི་སྒོ་ར།',
-'portal-url'           => 'Project:མི་སྡེའི་སྒོ་ར།',
-'privacy'              => 'སྒེར་གསང་སྲིད་བྱུས།',
-'privacypage'          => 'Project:སྒེར་གསང་སྲིད་བྱུས།',
-
-'retrievedfrom'       => '"$1" ལས་ སླར་འདྲེན་འབད་ཡོདཔ།',
-'youhavenewmessages'  => 'ཁྱོད་ལུ་ $1 ($2) འདུག།',
-'newmessageslink'     => 'འཕྲིན་དོན་གསརཔ།',
+'portal' => 'མི་སྡེའི་སྒོ་ར།',
+'portal-url' => 'Project:མི་སྡེའི་སྒོ་ར།',
+'privacy' => 'སྒེར་གསང་སྲིད་བྱུས།',
+'privacypage' => 'Project:སྒེར་གསང་སྲིད་བྱུས།',
+
+'retrievedfrom' => '"$1" ལས་ སླར་འདྲེན་འབད་ཡོདཔ།',
+'youhavenewmessages' => 'ཁྱོད་ལུ་ $1 ($2) འདུག།',
+'newmessageslink' => 'འཕྲིན་དོན་གསརཔ།',
 'newmessagesdifflink' => 'བསྒྱུར་བཅོས་མཇུག།',
-'editsection'         => 'ཞུན་དག།',
-'editold'             => 'ཞུན་དག།',
-'editsectionhint'     => 'དབྱེ་ཚན་:$1 ཞུན་དག་འབད།',
-'toc'                 => 'ནང་དོན།',
-'showtoc'             => 'སྟོན།',
-'hidetoc'             => 'སྦ།',
-'site-rss-feed'       => '$1 ཨར་ཨེསི་ཨེསི་ འབྱུང་ས།',
-'site-atom-feed'      => '$1 ཨེ་ཊོམ་ འབྱུང་ས།',
-'page-rss-feed'       => '"$1" ཨར་ཨེསི་ཨེསི་འབྱུང་ས།',
+'editsection' => 'ཞུན་དག།',
+'editold' => 'ཞུན་དག།',
+'editsectionhint' => 'དབྱེ་ཚན་:$1 ཞུན་དག་འབད།',
+'toc' => 'ནང་དོན།',
+'showtoc' => 'སྟོན།',
+'hidetoc' => 'སྦ།',
+'site-rss-feed' => '$1 ཨར་ཨེསི་ཨེསི་ འབྱུང་ས།',
+'site-atom-feed' => '$1 ཨེ་ཊོམ་ འབྱུང་ས།',
+'page-rss-feed' => '"$1" ཨར་ཨེསི་ཨེསི་འབྱུང་ས།',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-user'     => 'ལག་ལེན་པའི་ཤོག་ལེབ།',
-'nstab-project'  => 'ལས་འགུལ་ཤོག་ལེབ།',
-'nstab-image'    => 'ཡིག་སྣོད།',
+'nstab-user' => 'ལག་ལེན་པའི་ཤོག་ལེབ།',
+'nstab-project' => 'ལས་འགུལ་ཤོག་ལེབ།',
+'nstab-image' => 'ཡིག་སྣོད།',
 'nstab-template' => 'ཊེམ་པེལེཊི།',
 'nstab-category' => 'དབྱེ་རིམ།',
 
 # General errors
-'badtitle'       => 'མགོ་མིང་བྱང་ཉེས།',
-'badtitletext'   => 'ཞུ་བ་འབད་ཡོད་པའི་ཤོག་ལེབ་མགོ་མིང་འདི་ ནུས་མེད་ སྟོངམ་ ཡང་ན་ བདེན་མེད་འབྲེལ་མཐུད་ཅན་གྱི་ནང་ཁུལ་-སྐད་ཡིག་ ཡངན་ ནང་ཁུལ་-ཝི་ཀི་མགོ་མིང་ཨིན་པས། དེ་ནང་ མགོ་མིང་ནང་ལུ་ལག་ལེན་འཐབ་མ་བཏུབ་པའི་ཡིག་འབྲུ་གཅིག་ ཡང་ན་ ལེ་ཤ་ཡོདཔ་འོང་།',
-'viewsource'     => 'འབྱུང་ས་སྟོན།',
+'badtitle' => 'མགོ་མིང་བྱང་ཉེས།',
+'badtitletext' => 'ཞུ་བ་འབད་ཡོད་པའི་ཤོག་ལེབ་མགོ་མིང་འདི་ ནུས་མེད་ སྟོངམ་ ཡང་ན་ བདེན་མེད་འབྲེལ་མཐུད་ཅན་གྱི་ནང་ཁུལ་-སྐད་ཡིག་ ཡངན་ ནང་ཁུལ་-ཝི་ཀི་མགོ་མིང་ཨིན་པས། དེ་ནང་ མགོ་མིང་ནང་ལུ་ལག་ལེན་འཐབ་མ་བཏུབ་པའི་ཡིག་འབྲུ་གཅིག་ ཡང་ན་ ལེ་ཤ་ཡོདཔ་འོང་།',
+'viewsource' => 'འབྱུང་ས་སྟོན།',
 'viewsourcetext' => 'ཁྱོད་ཀྱིས་ ཤོག་ལེབ་འདི་གི་འབྱུང་ས་བལྟ་བཏུབ་པའི་ཁར་ འདྲ་བཤུས་ཡང་རྐྱབ་བཏུབ་ཨིན་:',
 
 # Login and logout pages
-'yourname'                => 'ལག་ལེན་པའི་མིང་:',
-'yourpassword'            => 'ཆོག་ཡིག:',
-'remembermypassword'      => 'གློག་རིག་དེ་གུར་ ངེ་གི་ནང་བསྐྱོད་སེམས་ཁར་བཞག (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'                   => 'ནང་བསྐྱོད།',
+'yourname' => 'ལག་ལེན་པའི་མིང་:',
+'yourpassword' => 'ཆོག་ཡིག:',
+'remembermypassword' => 'གློག་རིག་དེ་གུར་ ངེ་གི་ནང་བསྐྱོད་སེམས་ཁར་བཞག (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'login' => 'ནང་བསྐྱོད།',
 'nav-login-createaccount' => 'ནང་བསྐྱོད་འབད་ / རྩིས་ཐོ་གསརཔ་བཟོ།',
-'loginprompt'             => '{{SITENAME}} ནང་ལུ་ ནང་བསྐྱོད་འབད་ནིའི་དོན་ལུ་ ཁྱོད་ཀྱིས་ ཀུ་ཀིསི་འདི་ལྕོགས་ཅན་བཟོ་དགོ།',
-'userlogin'               => 'ནང་བསྐྱོད་འབད་ / རྩིས་ཐོ་གསརཔ་བཟོ།',
-'logout'                  => 'ཕྱིར་བསྐྱོད།',
-'userlogout'              => 'ཕྱིར་བསྐྱོད།',
-'nologin'                 => "ནང་བསྐྱོད་མེད་ག? '''$1'''",
-'nologinlink'             => 'རྩིས་ཐོ་གསརཔ་བཟོ།',
-'createaccount'           => 'རྩིས་ཐོ་གསརཔ་བཟོ།',
-'gotaccount'              => "ཧེ་མ་ལས་རྩིས་ཐོ་ཡོད་ག? '''$1'''",
-'gotaccountlink'          => 'ནང་བསྐྱོད།',
-'loginsuccesstitle'       => 'ནང་བསྐྱོད་ལེགས་ཤོམ་འབད་ཡོདཔ།',
-'loginsuccess'            => "'''ད་འབདན་ཁྱོད་  {{SITENAME}} ནང་ \"\$1\" སྦེ་ ནང་བསྐྱོད་འབད་ཡོདཔ།'''",
-'nosuchuser'              => 'མིང་ "$1" བཟུམ་གྱི་ལག་ལེན་པ་མེད།
+'loginprompt' => '{{SITENAME}} ནང་ལུ་ ནང་བསྐྱོད་འབད་ནིའི་དོན་ལུ་ ཁྱོད་ཀྱིས་ ཀུ་ཀིསི་འདི་ལྕོགས་ཅན་བཟོ་དགོ།',
+'userlogin' => 'ནང་བསྐྱོད་འབད་ / རྩིས་ཐོ་གསརཔ་བཟོ།',
+'logout' => 'ཕྱིར་བསྐྱོད།',
+'userlogout' => 'ཕྱིར་བསྐྱོད།',
+'nologin' => "ནང་བསྐྱོད་མེད་ག? '''$1'''",
+'nologinlink' => 'རྩིས་ཐོ་གསརཔ་བཟོ།',
+'createaccount' => 'རྩིས་ཐོ་གསརཔ་བཟོ།',
+'gotaccount' => "ཧེ་མ་ལས་རྩིས་ཐོ་ཡོད་ག? '''$1'''",
+'gotaccountlink' => 'ནང་བསྐྱོད།',
+'loginsuccesstitle' => 'ནང་བསྐྱོད་ལེགས་ཤོམ་འབད་ཡོདཔ།',
+'loginsuccess' => "'''ད་འབདན་ཁྱོད་  {{SITENAME}} ནང་ \"\$1\" སྦེ་ ནང་བསྐྱོད་འབད་ཡོདཔ།'''",
+'nosuchuser' => 'མིང་ "$1" བཟུམ་གྱི་ལག་ལེན་པ་མེད།
 སྡེབ་དཔྱད་འབད་ ཡང་ན་ རྩིས་ཐོ་གསརཔ་ཅིག་བཟོ།',
-'nosuchusershort'         => 'མིང་ "$1" བཟུམ་གྱི་ལག་ལེན་པ་མེད།
+'nosuchusershort' => 'མིང་ "$1" བཟུམ་གྱི་ལག་ལེན་པ་མེད།
 སྡེབ་དཔྱད་འབད།',
-'nouserspecified'         => 'ལག་ལེན་པའི་མིང་ གསལ་བཀོད་འབད་དགོ།',
-'wrongpassword'           => 'མ་བདེན་པའི་ཆོག་ཡིག་བཙུགས་ཡོདཔ། ལོག་འབད་རྩོལ་བསྐྱེད།',
-'wrongpasswordempty'      => 'ཆོག་ཡིག་བཙུགས་མི་འདི་སྟོངམ་ཨིན་པས། ལོག་འབད་རྩོལ་བསྐྱེད།',
-'passwordtooshort'        => 'ཁྱོད་ཀྱི་ཆོག་ཡིག་འདི་ནུས་མེད་ ཡང་ན་ ཐུང་དྲགས་ནུག།
+'nouserspecified' => 'ལག་ལེན་པའི་མིང་ གསལ་བཀོད་འབད་དགོ།',
+'wrongpassword' => 'མ་བདེན་པའི་ཆོག་ཡིག་བཙུགས་ཡོདཔ། ལོག་འབད་རྩོལ་བསྐྱེད།',
+'wrongpasswordempty' => 'ཆོག་ཡིག་བཙུགས་མི་འདི་སྟོངམ་ཨིན་པས། ལོག་འབད་རྩོལ་བསྐྱེད།',
+'passwordtooshort' => 'ཁྱོད་ཀྱི་ཆོག་ཡིག་འདི་ནུས་མེད་ ཡང་ན་ ཐུང་དྲགས་ནུག།
 ཆོག་ཡིག་འདི་ ཡིག་འབྲུ་ཉུང་ཤོས་ $1 དགོ་པའི་ཁར་ ལག་ལེན་པའི་མིང་དང་ཡང་མ་འདྲཝ་ཅིག་སྦེ་དགོཔ་ཨིན།',
-'mailmypassword'          => 'གློག་འཕྲིན་ཆོག་ཡིག།',
-'passwordremindertitle'   => '{{SITENAME}} གི་དོན་ལུ་ གནས་སྐབས་ཅིག་གི་ཆོག་ཡིག་གསརཔ།',
-'passwordremindertext'    => 'མི་གང་རུང་(ཡང་ན་ ཨའི་པི་ཁ་བྱང་ $1 ནང་ལས་ ཁྱོད་བཟུམ་ཅིག་གིས་)
+'mailmypassword' => 'གློག་འཕྲིན་ཆོག་ཡིག།',
+'passwordremindertitle' => '{{SITENAME}} གི་དོན་ལུ་ གནས་སྐབས་ཅིག་གི་ཆོག་ཡིག་གསརཔ།',
+'passwordremindertext' => 'མི་གང་རུང་(ཡང་ན་ ཨའི་པི་ཁ་བྱང་ $1 ནང་ལས་ ཁྱོད་བཟུམ་ཅིག་གིས་)
 {{SITENAME}} ($4) གི་དོན་ལུ་ ཆོག་ཡིག་གསརཔ་ཅིག་བཏང་ཡོད་པའི་སྐོར་ལས་ཞུ་བ་འབད་ནུག།
 ད་ལས་ཕར་ ལག་ལེན་པ་ \\"$2\\" གི་ཆོག་ཡིག་འདི་ \\"$3\\" ཨིན།
 ཁྱོད་ཀྱིས་ ད་ལྟོ་ར་ ནང་བསྐྱོད་འབད་དེ་ཆོག་ཡིག་སོར་དགོ།
 
 མི་གཞན་ཅིག་གིས་ཞུ་བ་འབད་ཡོད་པའི་སྐབས་ལུ་ ཡང་ན་ ཁྱོད་རའི་ཆོག་ཡིག་འདི་སེམས་ཁར་དྲན་ཚུགས་རུང་ བསྒྱུར་བཅོས་འབད་དགོ་མ་མནོ་བ་ཅིན་ འཕྲིན་དོན་དེ་སྣང་མེད་བཞག་སྟེ་ ཧེ་མའི་ཆོག་ཡིག་འདི་ར་ལག་ལེན་འཐབ་རུང་བཏུབ།',
-'noemail'                 => 'ལག་ལེན་པ་ "$1" གི་དོན་ལུ་ གློག་འཕྲིན་ཁ་བྱང་ཐོ་བཀོད་མ་འབད་བས།',
-'passwordsent'            => '"$1" ནང་ཐོ་བཀོད་འབད་ཡོད་མི་ གློག་འཕྲིན་ཁ་བྱང་ནང་ ཆོག་ཡིག་གསརཔ་ཅིག་བཏང་ནུག།
+'noemail' => 'ལག་ལེན་པ་ "$1" གི་དོན་ལུ་ གློག་འཕྲིན་ཁ་བྱང་ཐོ་བཀོད་མ་འབད་བས།',
+'passwordsent' => '"$1" ནང་ཐོ་བཀོད་འབད་ཡོད་མི་ གློག་འཕྲིན་ཁ་བྱང་ནང་ ཆོག་ཡིག་གསརཔ་ཅིག་བཏང་ནུག།
 གློག་འཕྲིན་དེ་ཐོབ་ད་ ལོག་སྟེ་ནང་བསྐྱོད་འབད་གནང་།',
-'eauthentsent'            => 'ངེས་དཔྱད་གློག་འཕྲིན་འདི་ གདམ་ཁ་བརྐྱབས་ཡོད་པའི་གློག་འཕྲིན་ཁ་བྱང་ལུ་ བཏང་ཡོདཔ།
+'eauthentsent' => 'ངེས་དཔྱད་གློག་འཕྲིན་འདི་ གདམ་ཁ་བརྐྱབས་ཡོད་པའི་གློག་འཕྲིན་ཁ་བྱང་ལུ་ བཏང་ཡོདཔ།
 གཞན་གློག་འཕྲིན་གང་རུང་ རྩིས་ཐོ་ནང་མ་གཏང་པའི་ཧེ་མ་ རྩིས་ཐོ་འདི་ཁྱོད་ར་གི་ཨིན་པའི་ངེས་དཔྱད་འབད་ནི་ལུ་ གློག་འཕྲིན་ནང་གི་བཀོད་རྒྱ་དང་འཁྲིལ་དགོཔ་ཨིན།',
 
 # Change password dialog
 'retypenew' => 'ཆོག་ཡིག་གསརཔ་ལོག་ཡིག་དཔར་རྐྱབས:',
 
 # Edit page toolbar
-'bold_sample'     => 'ཚིག་ཡིག་རྒྱགས་པ།',
-'bold_tip'        => 'ཚིག་ཡིག་རྒྱགས་པ།',
-'italic_sample'   => 'ཨའི་ཊ་ལིཀ་ཚིག་ཡིག།',
-'italic_tip'      => 'ཨའི་ཊ་ལིཀ་ཚིག་ཡིག།',
-'link_sample'     => 'འབྲེལ་ལམ་མགོ་མིང་།',
-'link_tip'        => 'ནང་འཁོད་འབྲེལ་ལམ།',
-'extlink_sample'  => 'http://www.example.com འབྲེལ་ལམ མགོ་མིང་།',
-'extlink_tip'     => 'ཕྱིའི་འབྲེལ་ལམ་ (http:// prefix སེམས་ཁར་བཞག)',
+'bold_sample' => 'ཚིག་ཡིག་རྒྱགས་པ།',
+'bold_tip' => 'ཚིག་ཡིག་རྒྱགས་པ།',
+'italic_sample' => 'ཨའི་ཊ་ལིཀ་ཚིག་ཡིག།',
+'italic_tip' => 'ཨའི་ཊ་ལིཀ་ཚིག་ཡིག།',
+'link_sample' => 'འབྲེལ་ལམ་མགོ་མིང་།',
+'link_tip' => 'ནང་འཁོད་འབྲེལ་ལམ།',
+'extlink_sample' => 'http://www.example.com འབྲེལ་ལམ མགོ་མིང་།',
+'extlink_tip' => 'ཕྱིའི་འབྲེལ་ལམ་ (http:// prefix སེམས་ཁར་བཞག)',
 'headline_sample' => 'གཙོ་དོན་ཚིག་ཡིག།',
-'headline_tip'    => 'གནས་རིམ་ ༢ གཙོ་དོན།',
-'nowiki_sample'   => 'ནཱ་ལུ་ རྩ་སྒྲིག་མ་འབད་བའི་ཚིག་ཡིག་བཙུགས།',
-'nowiki_tip'      => 'ཝི་ཀི་རྩ་སྒྲིག་ སྣང་མེད་བཞག།',
-'image_tip'       => 'གནས་འདྲེན་ཡིག་སྣོད།',
-'media_tip'       => 'ཡིག་སྣོད་ཀྱི་འབྲེལ་ལམ།',
-'sig_tip'         => 'དུས་བཀོད་དང་གཅིག་ཁར་ ཁྱོད་རའི་མིང་རྟགས།',
-'hr_tip'          => 'ཐད་སྙོམས་གྲལ་ཐིག་ (ཉུང་སུ་སྦེ་ལག་ལེན་འཐབ)',
+'headline_tip' => 'གནས་རིམ་ ༢ གཙོ་དོན།',
+'nowiki_sample' => 'ནཱ་ལུ་ རྩ་སྒྲིག་མ་འབད་བའི་ཚིག་ཡིག་བཙུགས།',
+'nowiki_tip' => 'ཝི་ཀི་རྩ་སྒྲིག་ སྣང་མེད་བཞག།',
+'image_tip' => 'གནས་འདྲེན་ཡིག་སྣོད།',
+'media_tip' => 'ཡིག་སྣོད་ཀྱི་འབྲེལ་ལམ།',
+'sig_tip' => 'དུས་བཀོད་དང་གཅིག་ཁར་ ཁྱོད་རའི་མིང་རྟགས།',
+'hr_tip' => 'ཐད་སྙོམས་གྲལ་ཐིག་ (ཉུང་སུ་སྦེ་ལག་ལེན་འཐབ)',
 
 # Edit pages
-'summary'                    => 'བཅུད་དོན།:',
-'subject'                    => 'དོན་ཚན་/གཙོ་དོན།:',
-'minoredit'                  => 'འདི་ གལ་གནད་ཆུང་བའི་ཞུན་དག་ཅིག་ཨིན།',
-'watchthis'                  => 'ཤོག་ལེབ་འདི་ལུ་བལྟ།',
-'savearticle'                => 'ཤོག་ལེབ་སྲུངས།',
-'preview'                    => 'སྔོན་ལྟ།',
-'showpreview'                => 'སྔོན་ལྟ་སྟོན།',
-'showdiff'                   => 'བསྒྱུར་བཅོས་ཚུ་སྟོན།',
-'anoneditwarning'            => "'''ཉེན་བརྡ:''' ཁྱོད་ཀྱིས་ ནང་བསྐྱོད་མ་འབད་བས།
+'summary' => 'བཅུད་དོན།:',
+'subject' => 'དོན་ཚན་/གཙོ་དོན།:',
+'minoredit' => 'འདི་ གལ་གནད་ཆུང་བའི་ཞུན་དག་ཅིག་ཨིན།',
+'watchthis' => 'ཤོག་ལེབ་འདི་ལུ་བལྟ།',
+'savearticle' => 'ཤོག་ལེབ་སྲུངས།',
+'preview' => 'སྔོན་ལྟ།',
+'showpreview' => 'སྔོན་ལྟ་སྟོན།',
+'showdiff' => 'བསྒྱུར་བཅོས་ཚུ་སྟོན།',
+'anoneditwarning' => "'''ཉེན་བརྡ:''' ཁྱོད་ཀྱིས་ ནང་བསྐྱོད་མ་འབད་བས།
 ཁྱོད་ཀྱི་ ཨའི་པི་ཁ་བྱང་འདི་ ཤོག་ལེབ་ཀྱི་ཞུན་དག་སྤྱོད་ཤུལ་འདི་ནང་ ཐོ་བཀོད་འབད་དེ་བཞག་འོང་།",
-'summary-preview'            => 'བཅུད་དོན་སྔོན་ལྟ།:',
-'blockedtext'                => "'''ཁྱོད་ཀྱི་ ལག་ལེན་པའི་མིང་ ཡང་ན་ ཨའི་པི་ཁ་བྱང་འདི་ བཀག་དམ་འབད་ཡོདཔ།'''
+'summary-preview' => 'བཅུད་དོན་སྔོན་ལྟ།:',
+'blockedtext' => "'''ཁྱོད་ཀྱི་ ལག་ལེན་པའི་མིང་ ཡང་ན་ ཨའི་པི་ཁ་བྱང་འདི་ བཀག་དམ་འབད་ཡོདཔ།'''
 
 དེ་ཡང་ $1 གིས་ བཀག་ཡོདཔ། བཀག་དགོ་པའི་རྒྱུ་མཚན་འདི་  ''$2''ཨིན་པས།
 
@@ -252,22 +252,22 @@ $messages = array(
 
 ཁྱོད་ཀྱིས་ ཁྱོད་རའི་ [[Special:Preferences|account preferences]] ནང་ ནུས་ལྡན་གློག་འཕྲིན་ཁ་བྱང་ཅིག་ གསལ་བཀོད་མ་འབད་ཚུན་དང་ དེ་ལག་ལེན་འཐབ་ནི་ལས་འགག་བསུབ་མ་འབད་བ་ཅིན་རྐྱངམ་ཅིག་ 'ལག་ལེན་པ་ལུ་ གློག་འཕྲིན་གཏང་' གི་ཁྱད་ཆོས་འདི་ ལག་ལེན་འཐབ་མི་བཏུབ་ཨིན།
 ཁྱོད་ཀྱི་ད་ལྟོའི་ཨའི་པི་ཁ་བྱང་འདི་ $3, དང་ འགག་བསུབ་ཨའི་ཌི་འདི་ #$5 ཨིན། དེ་གཉིས་ ཡང་ན་ ག་ཨིན་རུང་ཅིག་ འདྲི་དཔྱད་གང་རུང་གི་གྲངས་སུ་བཙུགས་གནང་།",
-'newarticle'                 => '(གསརཔ་)',
-'newarticletext'             => "ཁྱོད་ཀྱིས་ ཤོག་ལེབ་ཅིག་ལུ་ ད་ཚུན་མེད་པའི་འབྲེལ་མཐུད་འབད་ཡོདཔ།
+'newarticle' => '(གསརཔ་)',
+'newarticletext' => "ཁྱོད་ཀྱིས་ ཤོག་ལེབ་ཅིག་ལུ་ ད་ཚུན་མེད་པའི་འབྲེལ་མཐུད་འབད་ཡོདཔ།
 ཤོག་ལེབ་གསརཔ་བཟོ་ནི་ལུ་ འོག་གི་སྒྲོམ་ནང་ ཡིག་དཔར་རྐྱབས་ (བརྡ་དོན་ཁ་གསལ་གྱི་དོན་ལུ་ [[{{MediaWiki:Helppage}}|help page]] ལུ་བལྟ་)།
 གལ་སྲིད་འཛོལ་ཏེ་ཡར་སོང་པ་ཅིན་ '''རྒྱབ་''' ཨེབ་རྟ་ལུ་ ཨེབ་གཏང་འབད།",
-'noarticletext'              => 'ད་ལྟོ་ ཤོག་ལེབ་འདི་ནང་ ཚིག་ཡིག་མེདཔ་ཨིནམ་དང་ ཁྱོད་ཀྱིས་ [[Special:Search/{{PAGENAME}}| ཤོག་ལེབ་མགོ་མིང་འདི་ ]] ཤོག་ལེབ་གཞན་ནང་ལས་འཚོལ་བཏུབ་ ཡང་ན་ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ཤོག་ལེབ་འདི་ ཞུན་དག་འབད་བཏུབ།]',
-'previewnote'                => "'''འདི་ སྔོན་ལྟ་རྐྱངམ་ཅིག་ཨིན་  བསྒྱུར་བཅོས་ཚུ་ ད་ལྟོ་ཚུན་མ་སྲུངས་པས་!'''",
-'editing'                    => '$1 ཞུན་དག་འབད་དོ།',
-'editingsection'             => '$1 (དབྱེ་ཚན་)འདི་ ཞུན་དག་འབད་ནི།',
-'copyrightwarning'           => "{{SITENAME}} ལུ་ ཕུལ་མི་ཞལ་འདེབས་ཚུ་  $2 གི་འོག་ལུ་ གསར་བཏོན་འབད་ནིའི་ཆ་འཇོག་གྲུབ་ཡོདཔ་(ཁ་གསལ་གྱི་དོན་ལས་ $1 ལུ་བལྟ་)། གལ་སྲིད་ ཁྱོད་རའི་འབྲི་ལཱ་འདི་ ཞུན་དག་དང་ལོག་བཀྲམ་མ་འབད་ནི་ཨིན་པ་ཅིན་ ནཱ་ལུ་མ་ཕུལ།<br />
+'noarticletext' => 'ད་ལྟོ་ ཤོག་ལེབ་འདི་ནང་ ཚིག་ཡིག་མེདཔ་ཨིནམ་དང་ ཁྱོད་ཀྱིས་ [[Special:Search/{{PAGENAME}}| ཤོག་ལེབ་མགོ་མིང་འདི་ ]] ཤོག་ལེབ་གཞན་ནང་ལས་འཚོལ་བཏུབ་ ཡང་ན་ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ཤོག་ལེབ་འདི་ ཞུན་དག་འབད་བཏུབ།]',
+'previewnote' => "'''འདི་ སྔོན་ལྟ་རྐྱངམ་ཅིག་ཨིན་  བསྒྱུར་བཅོས་ཚུ་ ད་ལྟོ་ཚུན་མ་སྲུངས་པས་!'''",
+'editing' => '$1 ཞུན་དག་འབད་དོ།',
+'editingsection' => '$1 (དབྱེ་ཚན་)འདི་ ཞུན་དག་འབད་ནི།',
+'copyrightwarning' => "{{SITENAME}} ལུ་ ཕུལ་མི་ཞལ་འདེབས་ཚུ་  $2 གི་འོག་ལུ་ གསར་བཏོན་འབད་ནིའི་ཆ་འཇོག་གྲུབ་ཡོདཔ་(ཁ་གསལ་གྱི་དོན་ལས་ $1 ལུ་བལྟ་)། གལ་སྲིད་ ཁྱོད་རའི་འབྲི་ལཱ་འདི་ ཞུན་དག་དང་ལོག་བཀྲམ་མ་འབད་ནི་ཨིན་པ་ཅིན་ ནཱ་ལུ་མ་ཕུལ།<br />
 དེ་མ་ཚད་ཁྱོད་ཀྱིས་ ང་བཅས་ལུ་ དེ་ཁྱོད་རང་གིས་བྲིས་འབྲིཝ་དང་ མི་མང་ཌོ་མཱེན་ ཡང་ན་ རྒྱུ་ཁུངས་སྟོང་མར་ནང་ལས་འདྲ་བཤུས་བརྐྱབས་རྐྱབ་ཨིནམ་སྦེ་ བཤདཔ་ཨིན་པས།
 '''གནང་བ་མེད་པར་ འདྲ་བཤུས་དབང་ཆ་ཅན་གྱི་ལཱ་མ་ཕུལ་!'''",
-'templatesused'              => 'ཤོག་ལེབ་འདི་གུ་ལག་ལེན་འཐབ་ཡོད་པའི་ཊེམ་པེལེཊི:',
-'templatesusedpreview'       => 'སྔོན་ལྟ་འདི་ནང་ལག་ལེན་འཐབ་ཡོད་པའི་ {{PLURAL:$1|Template|Templates}} :',
-'template-protected'         => '(ཉེན་སྐྱོབ་འབད་ཡོདཔ།)',
-'template-semiprotected'     => '(ཉེན་སྐྱོབ་ཕྱེད་ཀ་འབད་ཡོདཔ་)',
-'nocreatetext'               => '{{SITENAME}} གིས་ ཤོག་ལེབ་གསརཔ་བཟོ་ནི་ལས་ བཀག་དམ་འབད་ཡོདཔ།
+'templatesused' => 'ཤོག་ལེབ་འདི་གུ་ལག་ལེན་འཐབ་ཡོད་པའི་ཊེམ་པེལེཊི:',
+'templatesusedpreview' => 'སྔོན་ལྟ་འདི་ནང་ལག་ལེན་འཐབ་ཡོད་པའི་ {{PLURAL:$1|Template|Templates}} :',
+'template-protected' => '(ཉེན་སྐྱོབ་འབད་ཡོདཔ།)',
+'template-semiprotected' => '(ཉེན་སྐྱོབ་ཕྱེད་ཀ་འབད་ཡོདཔ་)',
+'nocreatetext' => '{{SITENAME}} གིས་ ཤོག་ལེབ་གསརཔ་བཟོ་ནི་ལས་ བཀག་དམ་འབད་ཡོདཔ།
 ཁྱོད་ཀྱིས་ ལོག་འགྱོ་ཞིནམ་ལས་ ཡོད་བཞིན་པའི་ཤོག་ལེབ་འདི་ཞུན་དག་འབད་ ཡང་ན་  [[Special:UserLogin|ནང་བསྐྱོད་དང་ ཡངན་ རྩིས་ཐོ་གསརཔ་བཟོ་]].',
 'recreate-moveddeleted-warn' => "'''ཉེན་བརྡ་: ཁྱོད་ཀྱིས་ ཧ་མ་ལས་བཏོན་བཏང་ཡོད་པའི་ཤོག་ལེབ་ཅིག་ ལོག་གསར་བཟོ་འབདཝ་ཨིན་པས།'''
 
@@ -275,45 +275,44 @@ $messages = array(
 སྟབས་བདེ་ནིའི་དོན་ལས་ ཤོག་ལེབ་ཀྱི་བཏོན་གཏང་ལོག་འདི་ ནཱ་ལུ་བྱིན་ཏེ་ཡོད།:",
 
 # History pages
-'viewpagelogs'        => 'ཤོག་ལེབ་འདི་གི་ལོགསི་སྟོན།',
-'currentrev'          => 'ད་ལྟོའི་བསྐྱར་ཞིབ།',
-'revisionasof'        => '$1 གི་བསྐྱར་ཞིབ།',
-'revision-info'       => '$2 གིས་ $1 ཚུན་གྱི་བསྐྱར་ཞིབ།',
-'previousrevision'    => '←བསྐྱར་ཞིབ་རྙིངམ།',
-'nextrevision'        => 'བསྐྱར་ཞིབ་གསརཔ་→',
+'viewpagelogs' => 'ཤོག་ལེབ་འདི་གི་ལོགསི་སྟོན།',
+'currentrev' => 'ད་ལྟོའི་བསྐྱར་ཞིབ།',
+'revisionasof' => '$1 གི་བསྐྱར་ཞིབ།',
+'revision-info' => '$2 གིས་ $1 ཚུན་གྱི་བསྐྱར་ཞིབ།',
+'previousrevision' => '←བསྐྱར་ཞིབ་རྙིངམ།',
+'nextrevision' => 'བསྐྱར་ཞིབ་གསརཔ་→',
 'currentrevisionlink' => 'ད་ལྟོའི་བསྐྱར་ཞིབ།',
-'cur'                 => 'ཀཱར།',
-'last'                => 'མཇུག།',
-'page_first'          => 'དང་པ།',
-'page_last'           => 'མཇུག།',
-'histlegend'          => 'སེལ་འཐུ་སོར་སོ་: ག་བསྡུར་འབད་ནི་དང་ གཤམ་གྱི་བཙུགས་ལྡེ་ ཡང་ན་ ཨེབ་རྟ་ལུ་ཨེབ་ནི་ལུ་ ཐོན་རིམ་གྱི་རེ་ཌིའོ་སྒྲོམ་ལུ་རྟགས་བཀལ།<br />
+'cur' => 'ཀཱར།',
+'last' => 'མཇུག།',
+'page_first' => 'དང་པ།',
+'page_last' => 'མཇུག།',
+'histlegend' => 'སེལ་འཐུ་སོར་སོ་: ག་བསྡུར་འབད་ནི་དང་ གཤམ་གྱི་བཙུགས་ལྡེ་ ཡང་ན་ ཨེབ་རྟ་ལུ་ཨེབ་ནི་ལུ་ ཐོན་རིམ་གྱི་རེ་ཌིའོ་སྒྲོམ་ལུ་རྟགས་བཀལ།<br />
 འབད་ཤུལ་: (ཀཱར་) = ད་ལྟོའི་ཐོན་རིམ་ལས་སོར་སོ་
 (མཇུག་) = ཧེ་མའི་ཐོན་རིམ་ལས་སོར་སོ་ M = ཞུན་དག་ཆུང་ཀུ།',
-'histfirst'           => 'རྙིང་ཤོས།',
-'histlast'            => 'གསར་ཤོས།',
+'histfirst' => 'རྙིང་ཤོས།',
+'histlast' => 'གསར་ཤོས།',
 
 # Revision feed
 'history-feed-item-nocomment' => '$༢ ལུ་ $༡',
 
 # Diffs
-'history-title'           => '"$1" གི་བསྐྱར་ཞིབ་སྤྱོད་ཤུལ།',
-'difference'              => '(བསྐྱར་ཞིབ་བར་ནའི་ཁྱད་པར)',
-'lineno'                  => 'གྲལ་ཐིག་ $1:',
+'history-title' => '"$1" གི་བསྐྱར་ཞིབ་སྤྱོད་ཤུལ།',
+'lineno' => 'གྲལ་ཐིག་ $1:',
 'compareselectedversions' => 'སེལ་འཐུ་འབད་ཡོད་པའི་ཐོན་རིམ་ཚུ་ ག་བསྡུར་རྐྱབས།',
-'editundo'                => 'འབད་བཤོལ།',
-'diff-multi'              => '({{PLURAL:$1|བར་ནའི་བསྐྱར་ཞིབ་གཅིག་|$1 བར་ནའི་བསྐྱར་ཞིབ་ཚུ་}} མ་སྟོན་པས།)',
+'editundo' => 'འབད་བཤོལ།',
+'diff-multi' => '({{PLURAL:$1|བར་ནའི་བསྐྱར་ཞིབ་གཅིག་|$1 བར་ནའི་བསྐྱར་ཞིབ་ཚུ་}} མ་སྟོན་པས།)',
 
 # Search results
-'prevn'          => 'ཧེ་མའི་ {{PLURAL:$1|$1}}',
-'nextn'          => 'ཤུལ་མའི་ {{PLURAL:$1|$1}}',
-'viewprevnext'   => '($1 {{int:pipe-separator}} $2) ($3) སྟོན།',
+'prevn' => 'ཧེ་མའི་ {{PLURAL:$1|$1}}',
+'nextn' => 'ཤུལ་མའི་ {{PLURAL:$1|$1}}',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) སྟོན།',
 'searchhelp-url' => 'Help:ནང་དོན།',
-'powersearch'    => 'མཐོ་རིམ་ཅན་གྱི་འཚོལ་ཞིབ།',
+'powersearch' => 'མཐོ་རིམ་ཅན་གྱི་འཚོལ་ཞིབ།',
 
 # Preferences page
-'preferences'         => 'དགའ་གདམ།',
-'mypreferences'       => 'ངེ་གི་དགའ་གདམ།',
-'yourrealname'        => 'མིང་ངོ་མ:',
+'preferences' => 'དགའ་གདམ།',
+'mypreferences' => 'ངེ་གི་དགའ་གདམ།',
+'yourrealname' => 'མིང་ངོ་མ:',
 'prefs-help-realname' => 'མིང་ངོ་མ་འདི་ གདམ་ཁ་ཅན་ཨིན་རུང་ ཐོ་བཀོད་འབད་བ་ཅིན་ ཁྱོད་རའི་ལཱ་གི་ཁྱད་བརྗོད་ཀྱི་དོན་ལུ་ ལག་ལེན་འཐབ་འོང་།',
 
 'grouppage-sysop' => '{{ns:project}}:བདག་སྐྱོང་པ།',
@@ -322,39 +321,39 @@ $messages = array(
 'rightslog' => 'ལག་ལེན་པའི་དབང་ཆ་དྲན་དེབ།',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|བསྒྱུར་བཅོས་|བསྒྱུར་བཅོས་ཚུ}}',
-'recentchanges'                  => 'འཕྲལ་གྱི་བསྒྱུར་བཅོས',
+'nchanges' => '$1 {{PLURAL:$1|བསྒྱུར་བཅོས་|བསྒྱུར་བཅོས་ཚུ}}',
+'recentchanges' => 'འཕྲལ་གྱི་བསྒྱུར་བཅོས',
 'recentchanges-feed-description' => 'འབྱུང་སའི་ནང་ ཝི་ཀི་ལུ་འཕྲལ་གྱི་བསྒྱུར་བཅོས་འབད་མི་འདི་ རྗེས་འཚོལ་འབད།',
-'rcnote'                         => "གཤམ་འཁོད་ཚུ་ $3 ཚུན་ཚོད་ཀྱི་ མཇུག་མཐའ {{PLURAL:$2|ཉིནམ་|'''$2''' ཉིནམ་}} གྱི་ {{PLURAL:$1|བསྒྱུར་བཅོས་ | '''$1''' བསྒྱུར་བཅོས་ཚུ་ }} ཨིན།",
-'rcnotefrom'                     => "འོག་གི་ཚུ་ '''$2''' (up to '''$1''' shown) ལས་ཚུར་གྱི་བསྒྱུར་བཅོས་ཨིན།",
-'rclistfrom'                     => '$1 ལས་ འགོ་བཟུང་སྟེ་ བསྒྱུར་བཅོས་གསརཔ་ཚུ་སྟོན་',
-'rcshowhideminor'                => '$1 གལ་གནད་ཆུང་བའི་ཞུན་དག།',
-'rcshowhidebots'                 => '$1 བོཊིསི།',
-'rcshowhideliu'                  => '$1 ནང་བསྐྱོད་འབད་ཡོད་པའི་ལག་ལེན་པ་ཚུ་',
-'rcshowhideanons'                => '$1 མིང་མེད་ལག་ལེན་པ།',
-'rcshowhidepatr'                 => '$1 པེ་ཌོལཊི་ཞུན་དག་ཚུ།',
-'rcshowhidemine'                 => '$1 ངེ་གི་ཞུན་དག།',
-'rclinks'                        => 'མཇུག་མཐའི་ $1 བསྒྱུར་བཅོས་ཚུ་ ཉིནམ་ $2 ནང་ལུ་སྟོན་<br />$3',
-'diff'                           => 'ཁྱད་པར།',
-'hist'                           => 'སྤྱོད་ཤུལ',
-'hide'                           => 'སྦ།',
-'show'                           => 'སྟོན།',
-'minoreditletter'                => 'm',
-'newpageletter'                  => 'N',
-'boteditletter'                  => 'b',
+'rcnote' => "གཤམ་འཁོད་ཚུ་ $3 ཚུན་ཚོད་ཀྱི་ མཇུག་མཐའ {{PLURAL:$2|ཉིནམ་|'''$2''' ཉིནམ་}} གྱི་ {{PLURAL:$1|བསྒྱུར་བཅོས་ | '''$1''' བསྒྱུར་བཅོས་ཚུ་ }} ཨིན།",
+'rcnotefrom' => "འོག་གི་ཚུ་ '''$2''' (up to '''$1''' shown) ལས་ཚུར་གྱི་བསྒྱུར་བཅོས་ཨིན།",
+'rclistfrom' => '$1 ལས་ འགོ་བཟུང་སྟེ་ བསྒྱུར་བཅོས་གསརཔ་ཚུ་སྟོན་',
+'rcshowhideminor' => '$1 གལ་གནད་ཆུང་བའི་ཞུན་དག།',
+'rcshowhidebots' => '$1 བོཊིསི།',
+'rcshowhideliu' => '$1 ནང་བསྐྱོད་འབད་ཡོད་པའི་ལག་ལེན་པ་ཚུ་',
+'rcshowhideanons' => '$1 མིང་མེད་ལག་ལེན་པ།',
+'rcshowhidepatr' => '$1 པེ་ཌོལཊི་ཞུན་དག་ཚུ།',
+'rcshowhidemine' => '$1 ངེ་གི་ཞུན་དག།',
+'rclinks' => 'མཇུག་མཐའི་ $1 བསྒྱུར་བཅོས་ཚུ་ ཉིནམ་ $2 ནང་ལུ་སྟོན་<br />$3',
+'diff' => 'ཁྱད་པར།',
+'hist' => 'སྤྱོད་ཤུལ',
+'hide' => 'སྦ།',
+'show' => 'སྟོན།',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 
 # Recent changes linked
-'recentchangeslinked'          => 'འབྲེལ་བ་ཅན་གྱི་བསྒྱུར་བཅོས།',
-'recentchangeslinked-feed'     => 'འབྲེལ་བ་ཅན་གྱི་བསྒྱུར་བཅོས།',
-'recentchangeslinked-toolbox'  => 'འབྲེལ་བ་ཅན་གྱི་བསྒྱུར་བཅོས།',
-'recentchangeslinked-title'    => '"$1" དང་འབྲེལ་བ་ཡོད་པའི་བསྒྱུར་བཅོས་ཚུ།',
+'recentchangeslinked' => 'འབྲེལ་བ་ཅན་གྱི་བསྒྱུར་བཅོས།',
+'recentchangeslinked-feed' => 'འབྲེལ་བ་ཅན་གྱི་བསྒྱུར་བཅོས།',
+'recentchangeslinked-toolbox' => 'འབྲེལ་བ་ཅན་གྱི་བསྒྱུར་བཅོས།',
+'recentchangeslinked-title' => '"$1" དང་འབྲེལ་བ་ཡོད་པའི་བསྒྱུར་བཅོས་ཚུ།',
 'recentchangeslinked-noresult' => 'དུས་བཀོད་ཀྱི་སྐབས་ལུ་ འབྲེལ་མཐུད་ཅན་གྱི་ཤོག་ལེབ་ལུ་བསྒྱུར་བཅོས་མེད།',
-'recentchangeslinked-summary'  => "དམིགས་བསལ་ཤོག་ལེབ་འདི་གིས་ འབྲེལ་མཐུད་ཅན་གྱི་ཤོག་ལེབ་གུ་ མཇུག་ཀྱི་བསྒྱུར་བཅོས་ཚུ་ ཐོ་བཀོད་འབདཝ་ཨིན།
+'recentchangeslinked-summary' => "དམིགས་བསལ་ཤོག་ལེབ་འདི་གིས་ འབྲེལ་མཐུད་ཅན་གྱི་ཤོག་ལེབ་གུ་ མཇུག་ཀྱི་བསྒྱུར་བཅོས་ཚུ་ ཐོ་བཀོད་འབདཝ་ཨིན།
 ཁྱོད་ཀྱི་བལྟ་ཞིབ་ཐོ་ཡིག་གུ་འི་ཤོག་ལེབ་ཚུ་ '''མངོན་གསལ་ཅན་ཨིན།'''",
 
 # Upload
-'upload'        => 'ཡིག་སྣོད་སྐྱེལ་བཙུགས་འབད།',
-'uploadbtn'     => 'ཡིག་སྣོད་སྐྱེལ་བཙུགས་འབད།',
+'upload' => 'ཡིག་སྣོད་སྐྱེལ་བཙུགས་འབད།',
+'uploadbtn' => 'ཡིག་སྣོད་སྐྱེལ་བཙུགས་འབད།',
 'uploadlogpage' => 'ལོག་སྐྱེལ་བཙུགས་འབད།',
 'uploadedimage' => '"[[$1]]" སྐྱེལ་བཙུགས་འབད་ཡོདཔ།',
 
@@ -362,19 +361,19 @@ $messages = array(
 'listfiles' => 'ཡིག་སྣོད་ཐོ་ཡིག།',
 
 # File description page
-'file-anchor-link'          => 'ཡིག་སྣོད།',
-'filehist'                  => 'ཡིག་སྣོད་སྤྱོད་ཤུལ།',
-'filehist-help'             => 'ཡིག་སྣོད་འདི་ དེ་བསྒང་སྟོན་དོ་བཟུམ་སྦེ་ བལྟ་ནི་གི་དོན་ལུ་ ཚེས་གྲངས་/ཆུ་ཚོད་གུ་ ཨེབ་གཏང་འབད།',
-'filehist-current'          => 'ད་ལྟོ།',
-'filehist-datetime'         => 'ཚེས་གྲངས་/ཆུ་ཚོད།',
-'filehist-user'             => 'ལག་ལེན་པ།',
-'filehist-dimensions'       => 'རྒྱ་ཚད་',
-'filehist-filesize'         => 'པར་སྣོད་ཀྱི་ཚད།',
-'filehist-comment'          => 'བསམ་བཀོད།',
-'imagelinks'                => 'འབྲེལ་ལམ།',
-'linkstoimage'              => 'འོག་གི་ཤོག་ལེབ་ཚུ་ ཡིག་སྣོད་འདི་དང་འབྲེལ་བ་འདུག:',
-'nolinkstoimage'            => 'ཡིག་སྣོད་དེ་དང་འབྲེལ་བ་ཡོད་པའི་ཤོག་ལེབ་མིན་འདུག།',
-'sharedupload'              => 'ཡིག་སྣོད་འདི་རུབ་སྤྱོད་ཅན་གྱི་སྐྱེལ་བཙུགས་ཅིག་ཨིནམ་ལས་ ལས་འགུལ་གཞན་ཚུ་གིས་ལག་ལེན་འཐབ་འོང་།',
+'file-anchor-link' => 'ཡིག་སྣོད།',
+'filehist' => 'ཡིག་སྣོད་སྤྱོད་ཤུལ།',
+'filehist-help' => 'ཡིག་སྣོད་འདི་ དེ་བསྒང་སྟོན་དོ་བཟུམ་སྦེ་ བལྟ་ནི་གི་དོན་ལུ་ ཚེས་གྲངས་/ཆུ་ཚོད་གུ་ ཨེབ་གཏང་འབད།',
+'filehist-current' => 'ད་ལྟོ།',
+'filehist-datetime' => 'ཚེས་གྲངས་/ཆུ་ཚོད།',
+'filehist-user' => 'ལག་ལེན་པ།',
+'filehist-dimensions' => 'རྒྱ་ཚད་',
+'filehist-filesize' => 'པར་སྣོད་ཀྱི་ཚད།',
+'filehist-comment' => 'བསམ་བཀོད།',
+'imagelinks' => 'འབྲེལ་ལམ།',
+'linkstoimage' => 'འོག་གི་ཤོག་ལེབ་ཚུ་ ཡིག་སྣོད་འདི་དང་འབྲེལ་བ་འདུག:',
+'nolinkstoimage' => 'ཡིག་སྣོད་དེ་དང་འབྲེལ་བ་ཡོད་པའི་ཤོག་ལེབ་མིན་འདུག།',
+'sharedupload' => 'ཡིག་སྣོད་འདི་རུབ་སྤྱོད་ཅན་གྱི་སྐྱེལ་བཙུགས་ཅིག་ཨིནམ་ལས་ ལས་འགུལ་གཞན་ཚུ་གིས་ལག་ལེན་འཐབ་འོང་།',
 'uploadnewversion-linktext' => 'ཡིག་སྣོད་དེ་གི་ཐོ་རིམ་གསརཔ་ཅིག་ སྐྱེལ་བཙུགས་འབད།',
 
 # MIME search
@@ -406,51 +405,51 @@ $messages = array(
 'fewestrevisions' => 'བསྐྱར་ཞིབ་ཉུང་ཤོས་ཨིན་མི་ཤོག་ལེབ།',
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 {{PLURAL:$1|བའིཊི|བའིཊིསི}}',
-'nlinks'                  => '$1 {{PLURAL:$1|འབྲེལ་ལམ་|འབྲེལ་ལམ་ཚུ་}}',
-'nmembers'                => '$1 {{PLURAL:$1|རིགས་|རིགས་ཚུ་}}',
-'lonelypages'             => 'རྩ་བའི་ཤོག་ལེབ་མེད་པའི་ཤོག་ལེབ་ཚུ།',
-'uncategorizedpages'      => 'དབྱེ་བ་མ་ཕཟོ་བའི་ཤོག་ལེབ།',
+'nbytes' => '$1 {{PLURAL:$1|བའིཊི|བའིཊིསི}}',
+'nlinks' => '$1 {{PLURAL:$1|འབྲེལ་ལམ་|འབྲེལ་ལམ་ཚུ་}}',
+'nmembers' => '$1 {{PLURAL:$1|རིགས་|རིགས་ཚུ་}}',
+'lonelypages' => 'རྩ་བའི་ཤོག་ལེབ་མེད་པའི་ཤོག་ལེབ་ཚུ།',
+'uncategorizedpages' => 'དབྱེ་བ་མ་ཕཟོ་བའི་ཤོག་ལེབ།',
 'uncategorizedcategories' => 'དབྱེ་ཁག་མ་བཟོ་བའི་དབྱེ་རིམ་',
-'uncategorizedimages'     => 'དབྱེ་རིམ་མ་བཟོ་བའི་ཡིག་སྣོད།',
-'uncategorizedtemplates'  => 'དབྱེ་རིམ་མ་བཟོ་བའི་ཊེམ་པེལེཊི།',
-'unusedcategories'        => 'ལག་ལེན་མ་འཐབ་པའི་དབྱེ་རིམ།',
-'unusedimages'            => 'ལག་ལེན་མ་འཐབ་པའི་ཡིག་སྣོད།',
-'wantedcategories'        => 'ངེས་མཁོའི་དབྱེ་རིམ།',
-'wantedpages'             => 'དགོས་མཁོ་ཡོད་པའི་ཤོག་ལེབ།',
-'mostlinked'              => 'ཤོག་ལེབ་ལུ་འབྲེལ་མཐུད་ཆེ་ཤོས་',
-'mostlinkedcategories'    => 'དབྱེ་རིམ་ལུ་འབྲེལ་མཐུད་ཆེ་ཤོས་',
-'mostlinkedtemplates'     => 'ཊེམ་པེལེཊིསི་ལུ་འབྲེལ་མཐུད་ཆེ་ཤོས་',
-'mostcategories'          => 'དབྱེ་རིམ་མང་ཤོས་དང་འབྲེལ་བའི་ཤོག་ལེབ་',
-'mostimages'              => 'ཡིག་སྣོད་ལུ་འབྲེལ་མཐུད་ཆེ་ཤོས་',
-'mostrevisions'           => 'བསྐྱར་ཞིབ་མང་ཤོས་དང་འབྲེལ་བའི་ཤོག་ལེབ་',
-'prefixindex'             => 'སྔོན་ཚིག་ཟུར་ཐོ།',
-'shortpages'              => 'ཤོག་ལེབ་ཐུང་ཀུ།',
-'longpages'               => 'ཤོག་ལེབ་རིངམོ།',
-'deadendpages'            => 'ཤོག་ལེབ་མཇུག་',
-'protectedpages'          => 'ཉེན་སྐྱོབ་འབད་ཡོད་པའི་ཤོག་ལེབ།',
-'listusers'               => 'ལག་ལེན་པའི་ཐོ་ཡིག།',
-'newpages'                => 'ཤོག་ལེབ་གསརཔ།',
-'ancientpages'            => 'ཤོག་ལེབ་རྙིང་ཤོས།',
-'move'                    => 'སྤོ་བཤུད་འབད།',
-'movethispage'            => 'ཤོག་ལེབ་འདི་ སྤོ་བཤུད་འབད།',
+'uncategorizedimages' => 'དབྱེ་རིམ་མ་བཟོ་བའི་ཡིག་སྣོད།',
+'uncategorizedtemplates' => 'དབྱེ་རིམ་མ་བཟོ་བའི་ཊེམ་པེལེཊི།',
+'unusedcategories' => 'ལག་ལེན་མ་འཐབ་པའི་དབྱེ་རིམ།',
+'unusedimages' => 'ལག་ལེན་མ་འཐབ་པའི་ཡིག་སྣོད།',
+'wantedcategories' => 'ངེས་མཁོའི་དབྱེ་རིམ།',
+'wantedpages' => 'དགོས་མཁོ་ཡོད་པའི་ཤོག་ལེབ།',
+'mostlinked' => 'ཤོག་ལེབ་ལུ་འབྲེལ་མཐུད་ཆེ་ཤོས་',
+'mostlinkedcategories' => 'དབྱེ་རིམ་ལུ་འབྲེལ་མཐུད་ཆེ་ཤོས་',
+'mostlinkedtemplates' => 'ཊེམ་པེལེཊིསི་ལུ་འབྲེལ་མཐུད་ཆེ་ཤོས་',
+'mostcategories' => 'དབྱེ་རིམ་མང་ཤོས་དང་འབྲེལ་བའི་ཤོག་ལེབ་',
+'mostimages' => 'ཡིག་སྣོད་ལུ་འབྲེལ་མཐུད་ཆེ་ཤོས་',
+'mostrevisions' => 'བསྐྱར་ཞིབ་མང་ཤོས་དང་འབྲེལ་བའི་ཤོག་ལེབ་',
+'prefixindex' => 'སྔོན་ཚིག་ཟུར་ཐོ།',
+'shortpages' => 'ཤོག་ལེབ་ཐུང་ཀུ།',
+'longpages' => 'ཤོག་ལེབ་རིངམོ།',
+'deadendpages' => 'ཤོག་ལེབ་མཇུག་',
+'protectedpages' => 'ཉེན་སྐྱོབ་འབད་ཡོད་པའི་ཤོག་ལེབ།',
+'listusers' => 'ལག་ལེན་པའི་ཐོ་ཡིག།',
+'newpages' => 'ཤོག་ལེབ་གསརཔ།',
+'ancientpages' => 'ཤོག་ལེབ་རྙིང་ཤོས།',
+'move' => 'སྤོ་བཤུད་འབད།',
+'movethispage' => 'ཤོག་ལེབ་འདི་ སྤོ་བཤུད་འབད།',
 
 # Book sources
 'booksources' => 'ཀི་དེབ་འབྱུང་ས།',
 
 # Special:Log
-'specialloguserlabel'  => 'ལག་ལེན་པ:',
+'specialloguserlabel' => 'ལག་ལེན་པ:',
 'speciallogtitlelabel' => 'མགོ་མིང:',
-'log'                  => 'ལོགསི།',
-'all-logs-page'        => 'ལོག་སི་ཆ་མཉམ།',
+'log' => 'ལོགསི།',
+'all-logs-page' => 'ལོག་སི་ཆ་མཉམ།',
 
 # Special:AllPages
-'allpages'       => 'ཤོག་ལེབ་ག་ར།',
+'allpages' => 'ཤོག་ལེབ་ག་ར།',
 'alphaindexline' => '$1 ལས་ $2',
-'nextpage'       => 'ཤུལ་མའི་ཤོག་ལེབ་ ($1)',
-'prevpage'       => 'ཧེ་མའི་ཤོག་ལེབ་ ($1)',
-'allpagesfrom'   => 'ཤོག་ལེབ་བཀྲམ་སྟོན་འགོ་བཙུགས་:',
-'allarticles'    => 'ཤོག་ལེབ་ག་ར།',
+'nextpage' => 'ཤུལ་མའི་ཤོག་ལེབ་ ($1)',
+'prevpage' => 'ཧེ་མའི་ཤོག་ལེབ་ ($1)',
+'allpagesfrom' => 'ཤོག་ལེབ་བཀྲམ་སྟོན་འགོ་བཙུགས་:',
+'allarticles' => 'ཤོག་ལེབ་ག་ར།',
 'allpagessubmit' => 'འགྱོ།',
 'allpagesprefix' => 'སྔོན་ཚིག་གི་ཐོག་ལས་ཤོག་ལེབ་ཚུ་སྟོན།',
 
@@ -461,104 +460,104 @@ $messages = array(
 'emailuser' => 'ལག་ལེན་པ་ལུ་ གློག་འཕྲིན་གཏང་',
 
 # Watchlist
-'watchlist'         => 'ངེ་གི་བལྟ་ཞིབ་ཐོ་ཡིག།',
-'mywatchlist'       => 'ངེ་གི་བལྟ་ཞིབ་ཐོ་ཡིག།',
-'addedwatchtext'    => "ཤོག་ལེབ་  \"[[:\$1]]\" འདི་ ཁྱོད་རའི་ [[Special:Watchlist|watchlist]] ལུ་ ཁ་སྐོང་བརྐྱབས་ནུག།\\n
+'watchlist' => 'ངེ་གི་བལྟ་ཞིབ་ཐོ་ཡིག།',
+'mywatchlist' => 'ངེ་གི་བལྟ་ཞིབ་ཐོ་ཡིག།',
+'addedwatchtext' => "ཤོག་ལེབ་  \"[[:\$1]]\" འདི་ ཁྱོད་རའི་ [[Special:Watchlist|watchlist]] ལུ་ ཁ་སྐོང་བརྐྱབས་ནུག།\\n
 ཤོག་ལེབ་དེ་ལུ་མ་འོངས་བསྒྱུར་བཅོས་དང་ དེ་གི་འབྲེལ་ཡོད་བློ་ཤོག་འདི་ དེ་ཁར་ཐོ་བཀོད་འབད་ནི་དང་ འཇམ་ཏོང་ཏོ་སྦེ་གདམ་ཁ་བརྐྱབ་ཚུགས་ནི་གི་དོན་ལུ་  ཤོག་ལེབ་འདི་ [[Special:RecentChanges|list of recent changes]] ནང་ལུ་ '''མངོན་གསལ་''' སྦེ་འབྱུང་འོང་།",
-'removedwatchtext'  => 'ཤོག་ལེབ་  "[[:$1]]" འདི་ [[Special:Watchlist|your watchlist]] ལས་ བཏོན་བཀོག་ནུག།',
-'watch'             => 'བལྟ་ཞིབ་འབད།',
-'watchthispage'     => 'ཤོག་ལེབ་འདི་ལྟ།',
-'unwatch'           => 'བལྟ་བཤོལ།',
+'removedwatchtext' => 'ཤོག་ལེབ་  "[[:$1]]" འདི་ [[Special:Watchlist|your watchlist]] ལས་ བཏོན་བཀོག་ནུག།',
+'watch' => 'བལྟ་ཞིབ་འབད།',
+'watchthispage' => 'ཤོག་ལེབ་འདི་ལྟ།',
+'unwatch' => 'བལྟ་བཤོལ།',
 'watchlist-details' => '{{PLURAL:$1|$1 ཤོག་ལེབ་|$1 ཤོག་ལེབ་ཚུ་}} ཁག་ཆེ་བའི་བློ་ཤོག་ བལྟ་ཞིབ་མ་འབད་བས།',
-'wlshowlast'        => 'མཇུག་གི་ ཆུ་ཚོད་ $1 ཉིནམ་ $2  $3 སྟོན་',
+'wlshowlast' => 'མཇུག་གི་ ཆུ་ཚོད་ $1 ཉིནམ་ $2  $3 སྟོན་',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'བལྟ་ཞིབ་འབད་དོ་་་',
+'watching' => 'བལྟ་ཞིབ་འབད་དོ་་་',
 'unwatching' => 'བལྟ་ཞིབ་འབད་བཤོལ་དོ་་་',
 
 # Delete
-'deletepage'            => 'ཤོག་ལེབ་བཏོན་གཏང་།',
-'historywarning'        => 'ཉེན་བརྡ་: ཁྱོད་ཀྱིས་ བཏོན་བཀོག་ནི་འབད་མི་ཤོག་ལེབ་ནང་སྤྱོད་ཤུལ་འདུག་:',
-'confirmdeletetext'     => 'ཁྱོད་ཀྱིས་ ཤོག་ལེབ་དང་དེའི་སྤྱོད་ཤུལ་ བཏོན་གཏང་ནི་འབད་དོ།
+'deletepage' => 'ཤོག་ལེབ་བཏོན་གཏང་།',
+'historywarning' => 'ཉེན་བརྡ་: ཁྱོད་ཀྱིས་ བཏོན་བཀོག་ནི་འབད་མི་ཤོག་ལེབ་ནང་སྤྱོད་ཤུལ་འདུག་:',
+'confirmdeletetext' => 'ཁྱོད་ཀྱིས་ ཤོག་ལེབ་དང་དེའི་སྤྱོད་ཤུལ་ བཏོན་གཏང་ནི་འབད་དོ།
 ཁྱོད་ཀྱིས་འདི་འབད་ནི་དང་ དེ་འབད་བ་ཅིན་ དེ་གི་འབྲེལ་འབྱུང་ དེ་ལས་ ཁྱོད་ཀྱིས་འབད་མི་འདི་  [[{{MediaWiki:Policy-url}}| སྲིད་བྱུས་]] དང་འཁྲིལ་ཏེ་ཨིན་པའི་ངེས་དཔྱད་འབད་གནང་།',
-'actioncomplete'        => 'བྱ་ལས་མཇུག་བསྡུ།',
-'deletedtext'           => '"$1" འདི་ བཏོན་བཀོག་ནུག།
+'actioncomplete' => 'བྱ་ལས་མཇུག་བསྡུ།',
+'deletedtext' => '"$1" འདི་ བཏོན་བཀོག་ནུག།
 འཕྲལ་ཁམས་ལུ་བཏོན་བཀོག་མི་ཐོ་གི་དོན་ལུ་ $2 ལུ་བལྟ།',
-'dellogpage'            => 'བཏོན་གཏང་ཡོད་པའི་ལོག།',
-'deletecomment'         => 'རྒྱུ་མཚན:',
-'deleteotherreason'     => 'གཞན་/ཁ་སྐོང་ཅན་གྱི་རྒྱུ་མཚན།',
+'dellogpage' => 'བཏོན་གཏང་ཡོད་པའི་ལོག།',
+'deletecomment' => 'རྒྱུ་མཚན:',
+'deleteotherreason' => 'གཞན་/ཁ་སྐོང་ཅན་གྱི་རྒྱུ་མཚན།',
 'deletereasonotherlist' => 'རྒྱུ་མཚན་གཞན།',
 
 # Rollback
 'rollbacklink' => 'རྒྱབ་སྒྲིལ།',
 
 # Protect
-'protectlogpage'              => 'ཉེན་སྐྱོབ་ལོག།',
-'prot_1movedto2'              => '[[$1]] འདི་ [[$2]] ལུ་སྤོ་བཤུད་འབད་ཡོདཔ།',
-'protectcomment'              => 'རྒྱུ་མཚན:',
-'protectexpiry'               => 'དུས་ཡོལ:',
-'protect_expiry_invalid'      => 'དུས་ཡོལ་དུས་ཚོད་འདི་ ནུས་མེད་ཨིན་པས།',
-'protect_expiry_old'          => 'དུས་ཡོལ་དུས་ཚོད་འདི་ཚར་ནུག།',
-'protect-text'                => "ཁྱོད་ཀྱིས་ ནཱ་ལུ་ ཤོག་ལེབ་ '''$1''' གི་དོན་ལུ་ ཉེན་སྐྱོབ་གནས་རིམ་འདི་བསྒྱུར་བཅོས་རྐྱབ་བཏུབ།",
-'protect-locked-access'       => "ཁྱོད་ཀྱི་རྩིས་ཐོ་ནང་ ཤོག་ལེབ་ཉེན་སྐྱོབ་གནས་རིམ་བསྒྱུར་བཅོས་འབད་ནིའི་གནང་བ་མིན་འདུག།
+'protectlogpage' => 'ཉེན་སྐྱོབ་ལོག།',
+'prot_1movedto2' => '[[$1]] འདི་ [[$2]] ལུ་སྤོ་བཤུད་འབད་ཡོདཔ།',
+'protectcomment' => 'རྒྱུ་མཚན:',
+'protectexpiry' => 'དུས་ཡོལ:',
+'protect_expiry_invalid' => 'དུས་ཡོལ་དུས་ཚོད་འདི་ ནུས་མེད་ཨིན་པས།',
+'protect_expiry_old' => 'དུས་ཡོལ་དུས་ཚོད་འདི་ཚར་ནུག།',
+'protect-text' => "ཁྱོད་ཀྱིས་ ནཱ་ལུ་ ཤོག་ལེབ་ '''$1''' གི་དོན་ལུ་ ཉེན་སྐྱོབ་གནས་རིམ་འདི་བསྒྱུར་བཅོས་རྐྱབ་བཏུབ།",
+'protect-locked-access' => "ཁྱོད་ཀྱི་རྩིས་ཐོ་ནང་ ཤོག་ལེབ་ཉེན་སྐྱོབ་གནས་རིམ་བསྒྱུར་བཅོས་འབད་ནིའི་གནང་བ་མིན་འདུག།
 ད་ལྟོ་ནཱ་ལུ་ཡོད་པའི་སྒྲིག་སྟངས་འདི་ ཤོག་ལེབ་ '''$1''' གི་དོན་ལུ་ཨིན་:",
-'protect-cascadeon'           => 'འོག་གི་ཀསི་ཀེ་ཌིངཉེན་སྐྱོབ་ཤུགས་ཅན་བཟོ་ཡོད་པའི་ {{PLURAL:$1|ཤོག་ལེབ| ཤོག་ལེབ་་ཚུ་}} གི་གྲངས་སུ་ཚུད་ཡོདཔ་ལས་ ཤོག་ལེབ་འདི་ ད་ལྟོ་ཉེན་སྐྱོབ་འབད་དེ་འདུག།
+'protect-cascadeon' => 'འོག་གི་ཀསི་ཀེ་ཌིངཉེན་སྐྱོབ་ཤུགས་ཅན་བཟོ་ཡོད་པའི་ {{PLURAL:$1|ཤོག་ལེབ| ཤོག་ལེབ་་ཚུ་}} གི་གྲངས་སུ་ཚུད་ཡོདཔ་ལས་ ཤོག་ལེབ་འདི་ ད་ལྟོ་ཉེན་སྐྱོབ་འབད་དེ་འདུག།
 ཁྱོད་ཀྱིས་ ཤོག་ལེབ་འདི་གི་ཉེན་སྐྱོབ་གནས་རིམ་འདི་ བསྒྱུར་བཅོས་འབད་ཚུགས་རུང་ ཀསི་ཀ་ཌིང་ཉེན་སྐྱོབ་ལུ་མི་གནོད།',
-'protect-default'             => '(སྔོན་སྒྲིག།)',
-'protect-fallback'            => '"$1" གནང་བ་དགོས།',
+'protect-default' => '(སྔོན་སྒྲིག།)',
+'protect-fallback' => '"$1" གནང་བ་དགོས།',
 'protect-level-autoconfirmed' => 'ལེན་པ་གསརཔ་དང་ཐོ་བཀོད་མ་འབད་བའི་ལག་ལེན་པ་ཚུ་ བཀག།',
-'protect-level-sysop'         => 'སི་སོཔསི་རྐྱངམ་ཅིག།',
-'protect-summary-cascade'     => 'ཀེསི་ཀེ་ཌིང་།',
-'protect-expiring'            => '$1 (UTC) དུས་ཡོལཝ་ཨིན།',
-'protect-cascade'             => 'ཤོག་ལེབ་(ཀེསི་ཀེ་ཌིང་ཉེན་སྐྱོབ་) ཀྱི་གྲངས་སུ་ཚུད་མི་ཉེན་སྐྱོབ་ཤོག་ལེབ།',
-'protect-cantedit'            => 'ཁྱོད་ལུ་ ཞུན་དག་གི་གནང་བ་མེདཔ་ལས་ ཤོག་ལེབ་འདི་གི་ཉེན་སྐྱོབ་གནས་རིམ་བསྒྱུར་མི་ཚུགས།',
-'protect-expiry-options'      => 'ཆུ་ཚོད་ ༢:2 hours,ཉིནམ་ ༡:1 day,ཉིནམ་ ༣:3 days,བདུན་ཕྲག་ ༡:1 week,བདུན་ཕྲག་ ༢:2 weeks,ཟླཝ་ ༡:1 month,ཟླཝ་ ༣:3 months,ཟླཝ་ ༦:6 months,ལོ་ ༡:1 year,ཚད་ལས་འདས་པ་:infinite',
-'restriction-type'            => 'གནང་བ:',
-'restriction-level'           => 'མི་ཆོག་པའི་གནས་རིམ:',
+'protect-level-sysop' => 'སི་སོཔསི་རྐྱངམ་ཅིག།',
+'protect-summary-cascade' => 'ཀེསི་ཀེ་ཌིང་།',
+'protect-expiring' => '$1 (UTC) དུས་ཡོལཝ་ཨིན།',
+'protect-cascade' => 'ཤོག་ལེབ་(ཀེསི་ཀེ་ཌིང་ཉེན་སྐྱོབ་) ཀྱི་གྲངས་སུ་ཚུད་མི་ཉེན་སྐྱོབ་ཤོག་ལེབ།',
+'protect-cantedit' => 'ཁྱོད་ལུ་ ཞུན་དག་གི་གནང་བ་མེདཔ་ལས་ ཤོག་ལེབ་འདི་གི་ཉེན་སྐྱོབ་གནས་རིམ་བསྒྱུར་མི་ཚུགས།',
+'protect-expiry-options' => 'ཆུ་ཚོད་ ༢:2 hours,ཉིནམ་ ༡:1 day,ཉིནམ་ ༣:3 days,བདུན་ཕྲག་ ༡:1 week,བདུན་ཕྲག་ ༢:2 weeks,ཟླཝ་ ༡:1 month,ཟླཝ་ ༣:3 months,ཟླཝ་ ༦:6 months,ལོ་ ༡:1 year,ཚད་ལས་འདས་པ་:infinite',
+'restriction-type' => 'གནང་བ:',
+'restriction-level' => 'མི་ཆོག་པའི་གནས་རིམ:',
 
 # Undelete
 'undeletebtn' => 'བསྐྱར་གསོ།',
 
 # Namespace form on various pages
-'namespace'      => 'མིང་:',
-'invert'         => 'གནས་ལོག་སེལ་འཐུ།',
+'namespace' => 'མིང་:',
+'invert' => 'གནས་ལོག་སེལ་འཐུ།',
 'blanknamespace' => '(གཙོ་བོ།)',
 
 # Contributions
 'contributions' => 'ལག་ལེན་པའི་ཞལ་འདེབས།',
-'mycontris'     => 'ངེ་གི་ཞལ་འདེབས།',
-'contribsub2'   => '$1 ($2) གི་དོན་ལུ་',
-'uctop'         => '(མགུ་)',
-'month'         => 'ཟླཝ་(ཧེ་མ་)ལས་:',
-'year'          => 'ལོ་(ཧེ་མ་)ལས་:',
+'mycontris' => 'ངེ་གི་ཞལ་འདེབས།',
+'contribsub2' => '$1 ($2) གི་དོན་ལུ་',
+'uctop' => '(མགུ་)',
+'month' => 'ཟླཝ་(ཧེ་མ་)ལས་:',
+'year' => 'ལོ་(ཧེ་མ་)ལས་:',
 
 'sp-contributions-newbies-sub' => 'རྩིས་ཐོ་གསརཔ་གི་དོན་ལུ།',
-'sp-contributions-blocklog'    => 'སྡེབ་ཚན་ལོག།',
-'sp-contributions-talk'        => 'བློ།',
+'sp-contributions-blocklog' => 'སྡེབ་ཚན་ལོག།',
+'sp-contributions-talk' => 'བློ།',
 
 # What links here
-'whatlinkshere'       => 'ནཱ་ལུ་ ག་ཅི་འབྲེལ་མཐུད་འོང་ནི་མས།',
+'whatlinkshere' => 'ནཱ་ལུ་ ག་ཅི་འབྲེལ་མཐུད་འོང་ནི་མས།',
 'whatlinkshere-title' => '$1 དང་འབྲེལ་མཐུད་ཡོད་པའི་ཤོག་ལེབ།',
-'linkshere'           => "འོག་གི་ཤོག་ལེབ་ཚུ་ '''[[:$1]]''' ལུ་ འབྲེལ་མཐུད་འབད་ཨིན:",
-'nolinkshere'         => "'''[[:$1]]''' ལུ་ ཤོག་ལེབ་འབྲེལ་མཐུད་མིན་འདུག།",
-'isredirect'          => 'སླར་ལོག་ཤོག་ལེབ།',
-'istemplate'          => 'གྲངས་ཚུད།',
-'whatlinkshere-prev'  => '{{PLURAL:$1|ཧེ་མམ་|ཧེ་མམ་ $1}}',
-'whatlinkshere-next'  => '{{PLURAL:$1|ཤུལ་མམ་|ཤུལ་མམ་ $1}}',
+'linkshere' => "འོག་གི་ཤོག་ལེབ་ཚུ་ '''[[:$1]]''' ལུ་ འབྲེལ་མཐུད་འབད་ཨིན:",
+'nolinkshere' => "'''[[:$1]]''' ལུ་ ཤོག་ལེབ་འབྲེལ་མཐུད་མིན་འདུག།",
+'isredirect' => 'སླར་ལོག་ཤོག་ལེབ།',
+'istemplate' => 'གྲངས་ཚུད།',
+'whatlinkshere-prev' => '{{PLURAL:$1|ཧེ་མམ་|ཧེ་མམ་ $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|ཤུལ་མམ་|ཤུལ་མམ་ $1}}',
 'whatlinkshere-links' => '← འབྲེལ་ལམ།',
 
 # Block/unblock
-'blockip'       => 'ལག་ལེན་པ་བཀག',
-'ipboptions'    => 'ཆུ་ཚོད་ ༢:2 hours,ཉིནམ་ ༡:1 day,ཉིནམ་ ༣:3 days,བདུན་ཕྲག་ ༡:1 week,བདུན་ཕྲག་ ༢:2 weeks,ཟླཝ་ ༡:1 month,ཟླཝ་ ༣:3 months,ཟླཝ་ ༦:6 months,ལོ་ ༡:1 year,ཚད་ལས་འདས་པ་:infinite',
-'ipblocklist'   => 'བཀག་ཆ་འབད་ཡོད་པའི ཨའི་པི་ཁ་བྱང་དང་ལག་ལེན་པའི་མིང།',
-'blocklink'     => 'བཀག།',
-'unblocklink'   => 'བཀག་བཤོལ་',
-'contribslink'  => 'ཕན་འདེབས།',
-'blocklogpage'  => 'སྡེབ་ཚན་ལོག།',
+'blockip' => 'ལག་ལེན་པ་བཀག',
+'ipboptions' => 'ཆུ་ཚོད་ ༢:2 hours,ཉིནམ་ ༡:1 day,ཉིནམ་ ༣:3 days,བདུན་ཕྲག་ ༡:1 week,བདུན་ཕྲག་ ༢:2 weeks,ཟླཝ་ ༡:1 month,ཟླཝ་ ༣:3 months,ཟླཝ་ ༦:6 months,ལོ་ ༡:1 year,ཚད་ལས་འདས་པ་:infinite',
+'ipblocklist' => 'བཀག་ཆ་འབད་ཡོད་པའི ཨའི་པི་ཁ་བྱང་དང་ལག་ལེན་པའི་མིང།',
+'blocklink' => 'བཀག།',
+'unblocklink' => 'བཀག་བཤོལ་',
+'contribslink' => 'ཕན་འདེབས།',
+'blocklogpage' => 'སྡེབ་ཚན་ལོག།',
 'blocklogentry' => '[[$1]] འདི་ དུས་ཡོལ་དུས་ཚོད་ $2 $3 ལུ་ འགག་བསུབ་འབད་ཡོདཔ',
 
 # Move page
-'movepagetext'     => "འོག་གི་འབྲི་ཤོག་ལག་ལེན་འཐབ་མི་དེ་གིས་ སྤྱོད་ཤུལ་ཆ་མཉམ་ མིང་གསརཔ་ལུ་སྤོ་བཤུད་འབད་དེ་ ཤོག་ལེབ་ཀྱི་བསྐྱར་མིང་བཏགས་འོང་།
+'movepagetext' => "འོག་གི་འབྲི་ཤོག་ལག་ལེན་འཐབ་མི་དེ་གིས་ སྤྱོད་ཤུལ་ཆ་མཉམ་ མིང་གསརཔ་ལུ་སྤོ་བཤུད་འབད་དེ་ ཤོག་ལེབ་ཀྱི་བསྐྱར་མིང་བཏགས་འོང་།
 མགོ་མིང་རྙིངམ་འདི་ མགོ་མིང་གསརཔ་ནང་ སླར་ལོག་ཤོག་ལེབ་ལུ་འགྱུར་འོང་།
 མགོ་མིང་རྙིངམ་གི་འབྲེལ་ལམ་ཚུ་མི་འགྱུར་   སླར་ལོག་གཉིས་ལྡན་དང་མེདཔ་ཐལ་ཡོད་མི་ཚུ་ ཞིབ་དཔྱད་ངེས་གཏན་འབད་དགོ།
 ཁྱོད་ཀྱིས་ འབྲེལ་ལམ་ཚུ་རྒྱུན་མ་ཆད་པར་འཕྲོ་མཐུད་དེ་འགྱོ་ནི་ཡོདཔ་བཟོ་དགོ།
@@ -572,21 +571,21 @@ $messages = array(
 * ཁྱོད་ཀྱིས་ འོག་ལུ་སྒྲོམ་འདི་ ཞིབ་དཔྱད་འབད་བཤོལ་ནི།
 
 གནད་དོན་དེ་ནང་ དགོས་འདོད་དང་བསྟུན་ཏེ་ ཁྱོད་ཀྱིས་ ཤོག་ལེབ་འདི་ ལག་ཐོག་ལས་ མཉམ་བསྡོམས་འབད་དགོ།",
-'movearticle'      => 'ཤོག་ལེབ་སྤོ་བཤུད་འབད་:',
-'newtitle'         => 'མགོ་མིང་གསརཔ་ལུ་:',
-'move-watch'       => 'ཤོག་ལེབ་འདི་ལྟ།',
-'movepagebtn'      => 'ཤོག་ལེབ་སྤོ་བཤུད་འབད།',
-'pagemovedsub'     => 'སྤོ་བཤུད་མཐར་འཁྱོལ་བྱུང་ཡོདཔ།',
-'movepage-moved'   => '\'\'\'"$1" འདི་ "$2"\'\'\' ལུ་ སྤོ་བཤུད་འབད་ནུག།',
-'articleexists'    => 'ཤོག་ལེབ་མིང་འདི་ཧེ་མ་ལས་ཡོདཔ་ཨིནམ་དང་ ཡང་ན་ ཁྱོད་ཀྱིས་གདམ་ཁ་བརྐྱབས་མི་མིང་འདི་ ནུས་མེད་ཨིན་པས།
+'movearticle' => 'ཤོག་ལེབ་སྤོ་བཤུད་འབད་:',
+'newtitle' => 'མགོ་མིང་གསརཔ་ལུ་:',
+'move-watch' => 'ཤོག་ལེབ་འདི་ལྟ།',
+'movepagebtn' => 'ཤོག་ལེབ་སྤོ་བཤུད་འབད།',
+'pagemovedsub' => 'སྤོ་བཤུད་མཐར་འཁྱོལ་བྱུང་ཡོདཔ།',
+'movepage-moved' => '\'\'\'"$1" འདི་ "$2"\'\'\' ལུ་ སྤོ་བཤུད་འབད་ནུག།',
+'articleexists' => 'ཤོག་ལེབ་མིང་འདི་ཧེ་མ་ལས་ཡོདཔ་ཨིནམ་དང་ ཡང་ན་ ཁྱོད་ཀྱིས་གདམ་ཁ་བརྐྱབས་མི་མིང་འདི་ ནུས་མེད་ཨིན་པས།
 མིང་གཞན་ཅིག་ གདམ་ཁ་རྐྱབས།',
-'talkexists'       => "'''ཤོག་ལེབ་འདི་ལེགས་ཤོམ་པས་སྤོ་བཤུད་འབད་ཡོད་རུང་ གཅིག་ཧེ་མ་ལས་ར་ མགོ་མིང་གསརཔ་གུ་ཡོདཔ་ལས་ བློ་ཤོག་འདི་སྤོ་བཤུད་འབད་མ་ཚུགས།
+'talkexists' => "'''ཤོག་ལེབ་འདི་ལེགས་ཤོམ་པས་སྤོ་བཤུད་འབད་ཡོད་རུང་ གཅིག་ཧེ་མ་ལས་ར་ མགོ་མིང་གསརཔ་གུ་ཡོདཔ་ལས་ བློ་ཤོག་འདི་སྤོ་བཤུད་འབད་མ་ཚུགས།
 དེ་ཚུ་ ལག་ཐོག་ལས་མཉམ་བསྡོམས་འབད་གནང་།'''",
-'movedto'          => 'ལུ་སྤོ་བཤུད་འབད།',
-'movetalk'         => 'འབྲེལ་བ་ཡོད་པའི་ཁ་སླབ་ཤོག་ལེབ་ སྤོ་བཤུད་འབད།',
-'movelogpage'      => 'ལོག་སྤོ་བཤུད་འབད།',
-'movereason'       => 'རྒྱུ་མཚན:',
-'revertmove'       => 'རྒྱབ་ལོག།',
+'movedto' => 'ལུ་སྤོ་བཤུད་འབད།',
+'movetalk' => 'འབྲེལ་བ་ཡོད་པའི་ཁ་སླབ་ཤོག་ལེབ་ སྤོ་བཤུད་འབད།',
+'movelogpage' => 'ལོག་སྤོ་བཤུད་འབད།',
+'movereason' => 'རྒྱུ་མཚན:',
+'revertmove' => 'རྒྱབ་ལོག།',
 
 # Export
 'export' => 'ཤོག་ལེབ་ཕྱིར་འདྲེན་འབད།',
@@ -595,62 +594,62 @@ $messages = array(
 'allmessages' => 'རིམ་ལུགས་འཕྲིན་དོན།',
 
 # Thumbnails
-'thumbnail-more'  => 'ཆེར་བསྐྱེད།',
+'thumbnail-more' => 'ཆེར་བསྐྱེད།',
 'thumbnail_error' => 'མཐེ་གཟེར་གསར་བཟོའི་སྐབས་ལུ་འཛོལ་བ་: $1',
 
 # Import log
 'importlogpage' => 'ལོག་ ནང་འདྲེན་འབད།',
 
 # 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-logout'               => 'ཕྱིར་བསྐྱོད།',
-'tooltip-ca-talk'                 => 'ནང་དོན་ཤོག་ལེབ་ཀྱི་སྐོར་ལས་གྲོས་བསྡུར།',
-'tooltip-ca-edit'                 => 'ཁྱོད་ཀྱིས་ ཤོག་ལེབ་འདི་ཞུན་དག་འབད་བཏུབ། དེ་ མ་སྲུང་པའི་ཧེ་མ་ སྔོན་ལྟའི་ཨེབ་རྟ་འདི་ ལག་ལེན་འཐབ་གནང་།',
-'tooltip-ca-addsection'           => 'གྲོས་བསྡུར་འདི་ལུ་ བསམ་བཀོད་ཅིག་ཁ་སྐོང་རྐྱབས།',
-'tooltip-ca-viewsource'           => 'ཤོག་ལེབ་འདི་ཉེན་སྐྱོབ་ཅན་ཅིག་ཨིན། དེ་གི་འབྱུང་ས་བལྟ་བཏུབ།',
-'tooltip-ca-protect'              => 'ཤོག་ལེབ་འདི་ཉེན་སྐྱོབ་འབད།',
-'tooltip-ca-delete'               => 'ཤོག་ལེབ་འདི་ བཏོན་བཏང་།',
-'tooltip-ca-move'                 => 'ཤོག་ལེབ་འདི་ སྤོ་བཤུད་འབད།',
-'tooltip-ca-watch'                => 'ཤོག་ལེབ་འདི་ ཁྱོད་རའི་བལྟ་ཞིབ་ཐོ་ཡིག་ནང་ ཁ་སྐོང་རྐྱབས།',
-'tooltip-ca-unwatch'              => 'ཤོག་ལེབ་འདི་ ཁྱོད་རའི་བལྟ་ཞིབ་ཐོ་ཡིག་ནང་ལས་ བཏོན་གཏང་།',
-'tooltip-search'                  => '{{SITENAME}} འཚོལ་ཞིབ་འབད།',
-'tooltip-n-mainpage'              => 'མ་ཤོག་ལུ་བལྟ་ཞིབ་འབད།',
-'tooltip-n-portal'                => 'ལས་འགུལ་གྱི་སྐོར་ལས་   ཁྱོད་ཀྱིས་ ག་ཅི་འབད་ཚུགས་ག་ འཚོལ་ཞིབ་ག་ཏེ་ལས་འབད་ནི་ཨིན་ན་',
-'tooltip-n-currentevents'         => 'ད་ལྟོའི་འབྱུང་ལས་གུ་ རྒྱབ་གཞིའི་བརྡ་དོན་འཚོལ།',
-'tooltip-n-recentchanges'         => 'ཝི་ཀི་ནང་གི་ཕྲལ་གྱི་བསྒྱུར་བཅོས་ཐོ་ཡིག།',
-'tooltip-n-randompage'            => 'རིམ་བྲལ་ཤོག་ལེབ་ཅིག་ མངོན་གསལ་འབད།',
-'tooltip-n-help'                  => 'འཚོལ་ཞིབ་འབད་སའི་ས་གནས།',
-'tooltip-t-whatlinkshere'         => 'ནཱ་ལུ་ འབྲེལ་མཐུད་འབད་བའི་ཝི་ཀི་ཤོག་ལེབ་ག་ར་གི་ཐོ་ཡིག།',
-'tooltip-t-contributions'         => 'ལག་ལེན་པ་འདི་གི་ཞལ་འདེབས་ཐོ་ཡིག་བལྟ།',
-'tooltip-t-emailuser'             => 'ལག་ལེན་པ་འདི་ལུ་ གློག་འཕྲིན་གཏང་།',
-'tooltip-t-upload'                => 'ཡིག་སྣོད་སྐྱེལ་བཙུགས་འབད།',
-'tooltip-t-specialpages'          => 'དམིགས་བསལ་ཤོག་ལེབ་ཚུ་གི་ཐོ་ཡིག།',
-'tooltip-ca-nstab-user'           => 'ལག་ལེན་པའི་ཤོག་ལེབ་བལྟ།',
-'tooltip-ca-nstab-project'        => 'ལས་འགུལ་ཤོག་ལེབ་བལྟ།',
-'tooltip-ca-nstab-image'          => 'ཡིག་སྣོད་ཤོག་ལེབ་འདི་སྟོན།',
-'tooltip-ca-nstab-template'       => 'ཊེམ་པེལེཊི་བལྟ།',
-'tooltip-ca-nstab-help'           => 'གྲོགས་རམ་ཤོག་ལེབ་ལུ་ལྟ།',
-'tooltip-ca-nstab-category'       => 'དབྱེ་རིམ་ཤོག་ལེབ་སྟོན།',
-'tooltip-minoredit'               => 'གལ་གནད་ཆུང་བའི་ཞུན་དག་སྦེ་རྟགས་བཀལ།',
-'tooltip-save'                    => 'ཁྱོད་ཀྱིས་ བསྒྱུར་བཅོས་བརྐྱབས་མི་ཚུ་སྲུངས།',
-'tooltip-preview'                 => 'ཁྱོད་ཀྱི་བསྒྱུར་བཅོས་ཚུ་མ་སྲུང་པའི་ཧེ་མར་  སྔོན་ལྟ་འབད་གནང།',
-'tooltip-diff'                    => 'ཁྱོད་ཀྱིས་ ཚིག་ཡིག་ལུ་ ག་ཅི་བསྒྱུར་བཅོས་འབད་ཡི་ག་སྟོན།',
+'tooltip-pt-userpage' => 'ངེ་གི་ལག་ལེན་པའི་ཤོག་ལེབ།',
+'tooltip-pt-mytalk' => 'ངེ་གི་བློ་ཤོག།',
+'tooltip-pt-preferences' => 'ངེ་གི་དགའ་གདམ།',
+'tooltip-pt-watchlist' => 'ཁྱོད་ཀྱིས་ བསྒྱུར་བཅོས་ཀྱི་དོན་ལས་ ལྟ་རྟོག་འབད་མི་ཤོག་ལེབ་ཐོ་ཡིག།',
+'tooltip-pt-mycontris' => 'ངེ་གི་ཞལ་འདེབས་ཐོ་ཡིག།',
+'tooltip-pt-login' => 'ནང་བསྐྱོད་འབད་ ཡང་ན་ མ་འབད་རུང་བཏུབ།',
+'tooltip-pt-logout' => 'ཕྱིར་བསྐྱོད།',
+'tooltip-ca-talk' => 'ནང་དོན་ཤོག་ལེབ་ཀྱི་སྐོར་ལས་གྲོས་བསྡུར།',
+'tooltip-ca-edit' => 'ཁྱོད་ཀྱིས་ ཤོག་ལེབ་འདི་ཞུན་དག་འབད་བཏུབ། དེ་ མ་སྲུང་པའི་ཧེ་མ་ སྔོན་ལྟའི་ཨེབ་རྟ་འདི་ ལག་ལེན་འཐབ་གནང་།',
+'tooltip-ca-addsection' => 'གྲོས་བསྡུར་འདི་ལུ་ བསམ་བཀོད་ཅིག་ཁ་སྐོང་རྐྱབས།',
+'tooltip-ca-viewsource' => 'ཤོག་ལེབ་འདི་ཉེན་སྐྱོབ་ཅན་ཅིག་ཨིན། དེ་གི་འབྱུང་ས་བལྟ་བཏུབ།',
+'tooltip-ca-protect' => 'ཤོག་ལེབ་འདི་ཉེན་སྐྱོབ་འབད།',
+'tooltip-ca-delete' => 'ཤོག་ལེབ་འདི་ བཏོན་བཏང་།',
+'tooltip-ca-move' => 'ཤོག་ལེབ་འདི་ སྤོ་བཤུད་འབད།',
+'tooltip-ca-watch' => 'ཤོག་ལེབ་འདི་ ཁྱོད་རའི་བལྟ་ཞིབ་ཐོ་ཡིག་ནང་ ཁ་སྐོང་རྐྱབས།',
+'tooltip-ca-unwatch' => 'ཤོག་ལེབ་འདི་ ཁྱོད་རའི་བལྟ་ཞིབ་ཐོ་ཡིག་ནང་ལས་ བཏོན་གཏང་།',
+'tooltip-search' => '{{SITENAME}} འཚོལ་ཞིབ་འབད།',
+'tooltip-n-mainpage' => 'མ་ཤོག་ལུ་བལྟ་ཞིབ་འབད།',
+'tooltip-n-portal' => 'ལས་འགུལ་གྱི་སྐོར་ལས་   ཁྱོད་ཀྱིས་ ག་ཅི་འབད་ཚུགས་ག་ འཚོལ་ཞིབ་ག་ཏེ་ལས་འབད་ནི་ཨིན་ན་',
+'tooltip-n-currentevents' => 'ད་ལྟོའི་འབྱུང་ལས་གུ་ རྒྱབ་གཞིའི་བརྡ་དོན་འཚོལ།',
+'tooltip-n-recentchanges' => 'ཝི་ཀི་ནང་གི་ཕྲལ་གྱི་བསྒྱུར་བཅོས་ཐོ་ཡིག།',
+'tooltip-n-randompage' => 'རིམ་བྲལ་ཤོག་ལེབ་ཅིག་ མངོན་གསལ་འབད།',
+'tooltip-n-help' => 'འཚོལ་ཞིབ་འབད་སའི་ས་གནས།',
+'tooltip-t-whatlinkshere' => 'ནཱ་ལུ་ འབྲེལ་མཐུད་འབད་བའི་ཝི་ཀི་ཤོག་ལེབ་ག་ར་གི་ཐོ་ཡིག།',
+'tooltip-t-contributions' => 'ལག་ལེན་པ་འདི་གི་ཞལ་འདེབས་ཐོ་ཡིག་བལྟ།',
+'tooltip-t-emailuser' => 'ལག་ལེན་པ་འདི་ལུ་ གློག་འཕྲིན་གཏང་།',
+'tooltip-t-upload' => 'ཡིག་སྣོད་སྐྱེལ་བཙུགས་འབད།',
+'tooltip-t-specialpages' => 'དམིགས་བསལ་ཤོག་ལེབ་ཚུ་གི་ཐོ་ཡིག།',
+'tooltip-ca-nstab-user' => 'ལག་ལེན་པའི་ཤོག་ལེབ་བལྟ།',
+'tooltip-ca-nstab-project' => 'ལས་འགུལ་ཤོག་ལེབ་བལྟ།',
+'tooltip-ca-nstab-image' => 'ཡིག་སྣོད་ཤོག་ལེབ་འདི་སྟོན།',
+'tooltip-ca-nstab-template' => 'ཊེམ་པེལེཊི་བལྟ།',
+'tooltip-ca-nstab-help' => 'གྲོགས་རམ་ཤོག་ལེབ་ལུ་ལྟ།',
+'tooltip-ca-nstab-category' => 'དབྱེ་རིམ་ཤོག་ལེབ་སྟོན།',
+'tooltip-minoredit' => 'གལ་གནད་ཆུང་བའི་ཞུན་དག་སྦེ་རྟགས་བཀལ།',
+'tooltip-save' => 'ཁྱོད་ཀྱིས་ བསྒྱུར་བཅོས་བརྐྱབས་མི་ཚུ་སྲུངས།',
+'tooltip-preview' => 'ཁྱོད་ཀྱི་བསྒྱུར་བཅོས་ཚུ་མ་སྲུང་པའི་ཧེ་མར་  སྔོན་ལྟ་འབད་གནང།',
+'tooltip-diff' => 'ཁྱོད་ཀྱིས་ ཚིག་ཡིག་ལུ་ ག་ཅི་བསྒྱུར་བཅོས་འབད་ཡི་ག་སྟོན།',
 'tooltip-compareselectedversions' => 'ཤོག་ལེབ་འདི་གི་སེལ་འཐུ་འབད་ཡོད་པའི་ཐོན་རིམ་གཉིས་ཀྱི་བར་ནའི་ཁྱད་པར་ཚུ་ བལྟ།',
-'tooltip-watch'                   => 'ཤོག་ལེབ་འདི་ ཁྱོད་རའི་བལྟ་ཞིབ་ཐོ་ཡིག་ནང་ ཁ་སྐོང་རྐྱབས།',
+'tooltip-watch' => 'ཤོག་ལེབ་འདི་ ཁྱོད་རའི་བལྟ་ཞིབ་ཐོ་ཡིག་ནང་ ཁ་སྐོང་རྐྱབས།',
 
 # Browsing diffs
 'previousdiff' => '← ཧེ་མའི་ཁྱད་པར།',
-'nextdiff'     => 'ཤུལ་མམ་གྱི་ཁྱད་པར་ →',
+'nextdiff' => 'ཤུལ་མམ་གྱི་ཁྱད་པར་ →',
 
 # Media information
 'file-info-size' => '$1 × $2 པིག་སེལ་  ཡིག་སྣོད་ཀྱི་ཚད་: $3 མའིམ་དབྱེ་བ་: $4',
-'file-nohires'   => 'ཧུམ་ཆ་ལེགས་ཤོམ་མིན་འདུག།',
-'svg-long-desc'  => 'ཨེསི་བི་ཇི་ཡིག་སྣོད་  $1 × $2 པིག་སེལསི་ཆུང་སུ་ཅིག་  ཡིག་སྣོད་ཚད་: $3',
+'file-nohires' => 'ཧུམ་ཆ་ལེགས་ཤོམ་མིན་འདུག།',
+'svg-long-desc' => 'ཨེསི་བི་ཇི་ཡིག་སྣོད་  $1 × $2 པིག་སེལསི་ཆུང་སུ་ཅིག་  ཡིག་སྣོད་ཚད་: $3',
 'show-big-image' => 'ཧུམ་ཆ་གང་།',
 
 # Special:NewFiles
@@ -664,12 +663,12 @@ $messages = array(
 གྲལ་ཐིག་ཅོག་འཐད་མི་གུ་ལུ་ ཤུལ་མའི་འབྲེལ་ལམ་ག་ཅི་ཨིན་རུང་ དེའི་གྲངས་སུ་མི་རྩིས་ དེ་ཡང་ གྱལ་རིམ་ནང་ཡོད་པའི་ཡིག་སྣོད་ཤོགལེབ་ཚུ།',
 
 # Metadata
-'metadata'          => 'མེ་ཊ་གནས་སྡུད།',
-'metadata-help'     => 'ཡིག་སྣོད་དེ་ནང་ ཌི་ཇི་ཊཱལ་པར་ཆས་དང་ ཡང་ན་ པར་ལེན་འཕྲུལ་ཆས་ནང་ལས་ཁ་སྐོང་འབད་ཡོད་པའི་ གསར་བཟོའི་བརྡ་དོན་ཚུ་ཡོད།
+'metadata' => 'མེ་ཊ་གནས་སྡུད།',
+'metadata-help' => 'ཡིག་སྣོད་དེ་ནང་ ཌི་ཇི་ཊཱལ་པར་ཆས་དང་ ཡང་ན་ པར་ལེན་འཕྲུལ་ཆས་ནང་ལས་ཁ་སྐོང་འབད་ཡོད་པའི་ གསར་བཟོའི་བརྡ་དོན་ཚུ་ཡོད།
 གལ་སྲིད་ ཡིག་སྣོད་འདི་ སྔར་བཞིན་མ་བཞག་པར་ ལེགས་བཅོས་འབད་བ་ཅིན་ ཁ་གསལ་བཀོད་མི་ལ་ལོ་ཅིག་གིས་ལེགས་བཅོས་འབད་ཡོད་མི་ཡིག་སྣོད་ ཆ་ཚང་མི་སྟོན་འོང་།',
-'metadata-expand'   => 'རྒྱ་བསྐྱེད་ཅན་གྱི་རྒྱས་བཤད་སྟོན།',
+'metadata-expand' => 'རྒྱ་བསྐྱེད་ཅན་གྱི་རྒྱས་བཤད་སྟོན།',
 'metadata-collapse' => 'རྒྱ་བསྐྱེད་ཅན་གྱི་རྒྱས་བཤད་ཚུ་སྦ།',
-'metadata-fields'   => 'མེ་ཊ་གནས་སྡུད་ཐིག་ཁྲམ་ ཧྲམ་པའི་སྐབས་ལུ་ འཕྲིན་དོན་འདི་ནང་ ཐོ་བཀོད་འབད་་ཡོད་པའི་ ཨི་ཨེགསི་ཨའི་ཨེཕ་ མེ་ཊ༌གནས་སྡུད་འདི་ གཟུགས་བརྙན་ཤོག་ལེབ་བཀྲམ་སྟོན་གུ་ གྲངས་སུ་བཙུགས་འོང་།
+'metadata-fields' => 'མེ་ཊ་གནས་སྡུད་ཐིག་ཁྲམ་ ཧྲམ་པའི་སྐབས་ལུ་ འཕྲིན་དོན་འདི་ནང་ ཐོ་བཀོད་འབད་་ཡོད་པའི་ ཨི་ཨེགསི་ཨའི་ཨེཕ་ མེ་ཊ༌གནས་སྡུད་འདི་ གཟུགས་བརྙན་ཤོག་ལེབ་བཀྲམ་སྟོན་གུ་ གྲངས་སུ་བཙུགས་འོང་།
 གཞན་ཚུ་ སྔོན་སྒྲིག་གི་ཐོག་ལས་སྦ་འོང་།
 * make
 * model
@@ -686,18 +685,18 @@ $messages = array(
 * gpsaltitude',
 
 # External editor support
-'edit-externally'      => 'ཕྱིའི་གློག་རིམ་ལག་ལེན་འཐབ་ཐོག་ལས་ ཡིག་སྣོད་འདི་ཞུན་དག་འབད།',
+'edit-externally' => 'ཕྱིའི་གློག་རིམ་ལག་ལེན་འཐབ་ཐོག་ལས་ ཡིག་སྣོད་འདི་ཞུན་དག་འབད།',
 'edit-externally-help' => 'བརྡ་དོན་ཁ་གསལ་གྱི་དོན་ལུ་ [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] ལུ་ལྟ།',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'ཆ་མཉམ།',
 'namespacesall' => 'ཆ་མཉམ།',
-'monthsall'     => 'ཆ་མཉམ།',
+'monthsall' => 'ཆ་མཉམ།',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'འབྲེལ་བ་ཡོད་པའི་བསྒྱུར་བཅོས་ཚུ་སྟོན།',
 'watchlisttools-edit' => 'བལྟ་སྟེ་བལྟ་ཞིབ་ཐོ་ཡིག་ཞུན་དག་འབད།',
-'watchlisttools-raw'  => 'རགས་ཙམ་གྱི་བལྟ་ཞིབ་ཐོ་ཡིག་ ཞུན་དག་འབད་',
+'watchlisttools-raw' => 'རགས་ཙམ་གྱི་བལྟ་ཞིབ་ཐོ་ཡིག་ ཞུན་དག་འབད་',
 
 # Special:Version
 'version' => 'ཐོན་རིམ།',
index 4b7c562..5be1194 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Ewe (Eʋegbe)
+/** Ewe (eʋegbe)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
 
 $messages = array(
 # User preference toggles
-'tog-hideminor'            => 'Ɣla tɔtrɔ suewo le tɔtrɔ yeyeawo me',
-'tog-watchcreations'       => 'Tsɔ axa siwo gɔme medze la kpe ɖe axa siwo ŋu nyeƒe ŋku le la ŋu',
-'tog-watchdefault'         => 'Tsɔ axa siwo ŋu metrɔ asi le la kpe ɖe axa siwo ŋu nyeƒe ŋku le la ŋu',
-'tog-watchmoves'           => 'Tsɔ axa siwo ƒe nɔƒe meɖɔli la kpe ɖe axa siwo ŋu nyeƒe ŋku le la ŋu',
-'tog-watchdeletion'        => 'Tsɔ axa siwo metutu la kpe ɖe axa siwo ŋu nyeƒe ŋku le la ŋu',
+'tog-hideminor' => 'Ɣla tɔtrɔ suewo le tɔtrɔ yeyeawo me',
+'tog-watchcreations' => 'Tsɔ axa siwo gɔme medze la kpe ɖe axa siwo ŋu nyeƒe ŋku le la ŋu',
+'tog-watchdefault' => 'Tsɔ axa siwo ŋu metrɔ asi le la kpe ɖe axa siwo ŋu nyeƒe ŋku le la ŋu',
+'tog-watchmoves' => 'Tsɔ axa siwo ƒe nɔƒe meɖɔli la kpe ɖe axa siwo ŋu nyeƒe ŋku le la ŋu',
+'tog-watchdeletion' => 'Tsɔ axa siwo metutu la kpe ɖe axa siwo ŋu nyeƒe ŋku le la ŋu',
 'tog-enotifwatchlistpages' => 'Ɖo du nam ne axa aɖe si ŋu nyeƒe ŋku le la trɔ',
 
 'underline-always' => 'Ɣesiaɣi',
-'underline-never'  => 'Gbeɖe',
+'underline-never' => 'Gbeɖe',
 
 # Dates
-'sunday'        => 'Kɔsiɖagbe',
-'monday'        => 'Dzoɖagbe',
-'tuesday'       => 'Brãɖagbe',
-'wednesday'     => 'Kuɖagbe',
-'thursday'      => 'Yawoɖagbe',
-'friday'        => 'Fiɖagbe',
-'saturday'      => 'Memleɖagbe',
-'sun'           => 'Kɔs',
-'mon'           => 'Dzo',
-'tue'           => 'Brã',
-'wed'           => 'Kuɖ',
-'thu'           => 'Yaw',
-'fri'           => 'Fiɖ',
-'sat'           => 'Mem',
-'january'       => 'Dzove',
-'february'      => 'Dzodze',
-'march'         => 'Tedoxe',
-'april'         => 'Afɔfiɛ',
-'may_long'      => 'Damɛ',
-'june'          => 'Masa',
-'july'          => 'Siamlɔm',
-'august'        => 'Dasiamime',
-'september'     => 'Anyɔnyɔ',
-'october'       => 'Kele',
-'november'      => 'Adeɛmekpɔxe',
-'december'      => 'Dzome',
-'january-gen'   => 'Dzove',
-'february-gen'  => 'Dzodze',
-'march-gen'     => 'Tedoxe',
-'april-gen'     => 'Afɔfiɛ',
-'may-gen'       => 'Damɛ',
-'june-gen'      => 'Masa',
-'july-gen'      => 'Siamlɔm',
-'august-gen'    => 'Dasiamime',
+'sunday' => 'Kɔsiɖagbe',
+'monday' => 'Dzoɖagbe',
+'tuesday' => 'Brãɖagbe',
+'wednesday' => 'Kuɖagbe',
+'thursday' => 'Yawoɖagbe',
+'friday' => 'Fiɖagbe',
+'saturday' => 'Memleɖagbe',
+'sun' => 'Kɔs',
+'mon' => 'Dzo',
+'tue' => 'Brã',
+'wed' => 'Kuɖ',
+'thu' => 'Yaw',
+'fri' => 'Fiɖ',
+'sat' => 'Mem',
+'january' => 'Dzove',
+'february' => 'Dzodze',
+'march' => 'Tedoxe',
+'april' => 'Afɔfiɛ',
+'may_long' => 'Damɛ',
+'june' => 'Masa',
+'july' => 'Siamlɔm',
+'august' => 'Dasiamime',
+'september' => 'Anyɔnyɔ',
+'october' => 'Kele',
+'november' => 'Adeɛmekpɔxe',
+'december' => 'Dzome',
+'january-gen' => 'Dzove',
+'february-gen' => 'Dzodze',
+'march-gen' => 'Tedoxe',
+'april-gen' => 'Afɔfiɛ',
+'may-gen' => 'Damɛ',
+'june-gen' => 'Masa',
+'july-gen' => 'Siamlɔm',
+'august-gen' => 'Dasiamime',
 'september-gen' => 'Anyɔnyɔ',
-'october-gen'   => 'Kele',
-'november-gen'  => 'Adeɛmekpɔxe',
-'december-gen'  => 'Dzome',
-'jan'           => 'Dzov',
-'feb'           => 'Dzod',
-'mar'           => 'Ted',
-'apr'           => 'Afɔ',
-'may'           => 'Damɛ',
-'jun'           => 'Mas',
-'jul'           => 'Sia',
-'aug'           => 'Das',
-'sep'           => 'Any',
-'oct'           => 'Kel',
-'nov'           => 'Ade',
-'dec'           => 'Dzom',
+'october-gen' => 'Kele',
+'november-gen' => 'Adeɛmekpɔxe',
+'december-gen' => 'Dzome',
+'jan' => 'Dzov',
+'feb' => 'Dzod',
+'mar' => 'Ted',
+'apr' => 'Afɔ',
+'may' => 'Damɛ',
+'jun' => 'Mas',
+'jul' => 'Sia',
+'aug' => 'Das',
+'sep' => 'Any',
+'oct' => 'Kel',
+'nov' => 'Ade',
+'dec' => 'Dzom',
 
 # Categories related messages
 'listingcontinuesabbrev' => 'yi dzi',
 
-'about'      => 'Ŋutinya',
-'newwindow'  => '(eʋua fesre yeye)',
-'cancel'     => 'Dzudzɔ etɔtrɔ',
-'mypage'     => 'Axa nye',
-'mytalk'     => 'Nyeƒe nyamedzroƒe',
+'about' => 'Ŋutinya',
+'newwindow' => '(eʋua fesre yeye)',
+'cancel' => 'Dzudzɔ etɔtrɔ',
+'mypage' => 'Axa nye',
+'mytalk' => 'Nyeƒe nyamedzroƒe',
 'navigation' => 'Mɔtabiala',
-'and'        => '&#32;kpakple',
+'and' => '&#32;kpakple',
 
 # Cologne Blue skin
-'qbfind'         => 'Di',
-'qbedit'         => 'Trɔ asi le eŋu',
-'qbpageoptions'  => 'Axa sia',
-'qbmyoptions'    => 'Nyeƒe axawo',
+'qbfind' => 'Di',
+'qbedit' => 'Trɔ asi le eŋu',
+'qbpageoptions' => 'Axa sia',
+'qbmyoptions' => 'Nyeƒe axawo',
 'qbspecialpages' => 'Axa tɔxewo',
 
 # Vector skin
-'vector-action-delete'   => 'Tutui',
-'vector-action-move'     => 'Ɖɔli eƒe nɔƒe',
-'vector-view-create'     => 'Dze egɔme',
-'vector-view-edit'       => 'Trɔ asi le eŋu',
-'vector-view-history'    => 'Kpɔ xoxoawo',
-'vector-view-view'       => 'Xlẽ',
+'vector-action-delete' => 'Tutui',
+'vector-action-move' => 'Ɖɔli eƒe nɔƒe',
+'vector-view-create' => 'Dze egɔme',
+'vector-view-edit' => 'Trɔ asi le eŋu',
+'vector-view-history' => 'Kpɔ xoxoawo',
+'vector-view-view' => 'Xlẽ',
 'vector-view-viewsource' => 'Kpɔ alesi woŋlɔe',
 
-'errorpagetitle'   => 'Vodada',
-'returnto'         => 'Gbugbɔ yi $1.',
-'tagline'          => 'Tso {{SITENAME}}',
-'help'             => 'Kpekpeɖeŋu',
-'search'           => 'Dii',
-'searchbutton'     => 'Dii',
-'go'               => 'Yi',
-'searcharticle'    => 'Yi',
-'history'          => 'Axa sia ƒe tata xoxoawo',
-'history_short'    => 'Xoxoawo',
-'edit'             => 'Trɔ asi le eŋu',
-'create'           => 'Dze egɔme',
-'editthispage'     => 'Ðɔ axa sia ɖo',
+'errorpagetitle' => 'Vodada',
+'returnto' => 'Gbugbɔ yi $1.',
+'tagline' => 'Tso {{SITENAME}}',
+'help' => 'Kpekpeɖeŋu',
+'search' => 'Dii',
+'searchbutton' => 'Dii',
+'go' => 'Yi',
+'searcharticle' => 'Yi',
+'history' => 'Axa sia ƒe tata xoxoawo',
+'history_short' => 'Xoxoawo',
+'edit' => 'Trɔ asi le eŋu',
+'create' => 'Dze egɔme',
+'editthispage' => 'Ðɔ axa sia ɖo',
 'create-this-page' => 'Dze axa sia gɔme',
-'delete'           => 'Tutui',
-'deletethispage'   => 'Tutu axa sia',
-'protect'          => 'Dzɔ eŋu',
-'protect_change'   => 'ɖɔlii',
-'protectthispage'  => 'Dzɔ axa sia ŋu',
-'newpage'          => 'Axa yeye',
+'delete' => 'Tutui',
+'deletethispage' => 'Tutu axa sia',
+'protect' => 'Dzɔ eŋu',
+'protect_change' => 'ɖɔlii',
+'protectthispage' => 'Dzɔ axa sia ŋu',
+'newpage' => 'Axa yeye',
 'talkpagelinktext' => 'Nyamedzroƒe',
-'specialpage'      => 'Axa Tɔxe',
-'personaltools'    => 'Wòƒe dɔwɔnuwo',
-'postcomment'      => 'Akpa yeye',
-'talk'             => 'Nyamedzroƒe',
-'toolbox'          => 'Dɔwɔnuɖaka',
-'otherlanguages'   => 'Le gbe bubuwo me',
-'redirectedfrom'   => '(Woɖo wò ɖe afii tso $1)',
-'lastmodifiedat'   => 'Wó ɖɔ axa sia ɖo susue le $2 le ŋkeke $1 dzi.',
-'viewcount'        => 'Wokpɔ axa sia zi {{PLURAL:$1|ɖeka|$1 sɔ̃}}.',
-'jumpto'           => 'Dzo yi:',
+'specialpage' => 'Axa Tɔxe',
+'personaltools' => 'Wòƒe dɔwɔnuwo',
+'postcomment' => 'Akpa yeye',
+'talk' => 'Nyamedzroƒe',
+'toolbox' => 'Dɔwɔnuɖaka',
+'otherlanguages' => 'Le gbe bubuwo me',
+'redirectedfrom' => '(Woɖo wò ɖe afii tso $1)',
+'lastmodifiedat' => 'Wó ɖɔ axa sia ɖo susue le $2 le ŋkeke $1 dzi.',
+'viewcount' => 'Wokpɔ axa sia zi {{PLURAL:$1|ɖeka|$1 sɔ̃}}.',
+'jumpto' => 'Dzo yi:',
 'jumptonavigation' => 'kuɖɔɖoɖo',
-'jumptosearch'     => 'dii',
+'jumptosearch' => 'dii',
 
 # 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}} ŋutinya',
-'aboutpage'            => 'Project:Ŋutinya',
-'copyright'            => 'Nusiwo le afii le $1 mɔɖeɖea te.',
-'copyrightpage'        => '{{ns:project}}:Mɔɖeɖewo',
-'currentevents'        => 'Amaneɛ',
-'currentevents-url'    => 'Project:Nusiwo le dzɔdzɔm',
-'disclaimers'          => 'Nuxlɔ̃amenyawo',
-'edithelp'             => 'Kpekpeɖeŋu na etɔtrɔ',
-'mainpage'             => 'Axa do Ŋgɔ',
+'aboutsite' => '{{SITENAME}} ŋutinya',
+'aboutpage' => 'Project:Ŋutinya',
+'copyright' => 'Nusiwo le afii le $1 mɔɖeɖea te.',
+'copyrightpage' => '{{ns:project}}:Mɔɖeɖewo',
+'currentevents' => 'Amaneɛ',
+'currentevents-url' => 'Project:Nusiwo le dzɔdzɔm',
+'disclaimers' => 'Nuxlɔ̃amenyawo',
+'edithelp' => 'Kpekpeɖeŋu na etɔtrɔ',
+'mainpage' => 'Axa do Ŋgɔ',
 'mainpage-description' => 'Axa do ŋgɔ',
-'portal'               => 'Takpekpewɔƒe',
-'portal-url'           => 'Project:Takpekpewɔƒe',
+'portal' => 'Takpekpewɔƒe',
+'portal-url' => 'Project:Takpekpewɔƒe',
 
-'badaccess'        => 'Mɔɖeɖe vodada',
+'badaccess' => 'Mɔɖeɖe vodada',
 'badaccess-group0' => 'Se meɖe mɔ be nawɔ nusi wòle babiam be yeawɔ o.',
 
-'retrievedfrom'           => 'Nuŋɔŋlɔ sia tso "$1"',
-'youhavenewmessages'      => '$1 le asiwo ($2).',
-'newmessageslink'         => 'du yeyewo',
-'newmessagesdifflink'     => 'tɔtrɔ mamlea',
+'retrievedfrom' => 'Nuŋɔŋlɔ sia tso "$1"',
+'youhavenewmessages' => '$1 le asiwo ($2).',
+'newmessageslink' => 'du yeyewo',
+'newmessagesdifflink' => 'tɔtrɔ mamlea',
 'youhavenewmessagesmulti' => 'Du yeyewo le asiwo le $1',
-'editsection'             => 'trɔ asi le eŋu',
-'editold'                 => 'trɔ asi le eŋu',
-'viewsourceold'           => 'kpɔ alesi wó ŋlɔe',
-'editlink'                => 'trɔ asi le eŋu',
-'viewsourcelink'          => 'kpɔ alesi woŋlɔe',
-'editsectionhint'         => 'Trɔ akpa: $1',
-'toc'                     => 'Emenyawo',
-'showtoc'                 => 'fia',
-'hidetoc'                 => 'ɣla',
-'thisisdeleted'           => 'Kpɔ $1 alo wòa gbugbɔe ve hã?',
-'viewdeleted'             => 'Wòa kpɔ $1 a?',
-'red-link-title'          => '$1 (womeŋlɔ axa sia haɖeke o)',
+'editsection' => 'trɔ asi le eŋu',
+'editold' => 'trɔ asi le eŋu',
+'viewsourceold' => 'kpɔ alesi wó ŋlɔe',
+'editlink' => 'trɔ asi le eŋu',
+'viewsourcelink' => 'kpɔ alesi woŋlɔe',
+'editsectionhint' => 'Trɔ akpa: $1',
+'toc' => 'Emenyawo',
+'showtoc' => 'fia',
+'hidetoc' => 'ɣla',
+'thisisdeleted' => 'Kpɔ $1 alo wòa gbugbɔe ve hã?',
+'viewdeleted' => 'Wòa kpɔ $1 a?',
+'red-link-title' => '$1 (womeŋlɔ axa sia haɖeke o)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Axa',
-'nstab-user'      => 'Ezãla axa',
-'nstab-special'   => 'Axa tɔxe',
-'nstab-image'     => 'Agbalẽ',
+'nstab-main' => 'Axa',
+'nstab-user' => 'Ezãla axa',
+'nstab-special' => 'Axa tɔxe',
+'nstab-image' => 'Agbalẽ',
 'nstab-mediawiki' => 'Du',
 
 # General errors
-'error'           => 'Vodada',
+'error' => 'Vodada',
 'badarticleerror' => 'Wòmateŋu awɔ nusia le axa sia dzi o.',
-'cannotdelete'    => 'Womateŋu atutu axa sia alo axa "$1" o.
+'cannotdelete' => 'Womateŋu atutu axa sia alo axa "$1" o.
 Ɖewomahĩ ame aɖe tutui xoxo.',
-'badtitle'        => 'Tanya gbegblẽ',
-'viewsource'      => 'Kpɔ alesi wowɔe',
+'badtitle' => 'Tanya gbegblẽ',
+'viewsource' => 'Kpɔ alesi wowɔe',
 
 # Login and logout pages
-'remembermypassword'         => 'Ɖo ŋku nyeƒe dzesi ŋkɔ dzi le mɔ sia dzi (vaseɖe {{PLURAL:$1|ŋkeke|ŋkeke}} $1 megbe)',
-'login'                      => 'Ge ɖe eme',
-'nav-login-createaccount'    => 'Geɖe me / Ŋlɔ ŋkɔ',
-'userlogin'                  => 'Ge ɖe eme / ŋlɔ ŋkɔ daɖi',
-'logout'                     => 'Do le eme',
-'userlogout'                 => 'Do le eme',
-'nologin'                    => "Wòmeŋlɔ ŋkɔ oa? '''$1'''.",
-'nologinlink'                => 'Ŋlɔ ŋkɔ daɖi',
-'createaccount'              => 'Ŋlɔ ŋkɔ daɖi',
-'gotaccount'                 => "Wò ŋlɔ ŋkɔ xoxoa? '''$1'''.",
-'gotaccountlink'             => 'Ge ɖe eme',
-'loginsuccesstitle'          => 'Wò ge ɖe eme azɔ̃.',
-'loginsuccess'               => "'''Wò le {{SITENAME}} me fifia abe \"\$1\" ene.'''",
-'nouserspecified'            => 'Elebe na ŋlɔ ŋkɔ si wò zãna',
+'remembermypassword' => 'Ɖo ŋku nyeƒe dzesi ŋkɔ dzi le mɔ sia dzi (vaseɖe {{PLURAL:$1|ŋkeke|ŋkeke}} $1 megbe)',
+'login' => 'Ge ɖe eme',
+'nav-login-createaccount' => 'Geɖe me / Ŋlɔ ŋkɔ',
+'userlogin' => 'Ge ɖe eme / ŋlɔ ŋkɔ daɖi',
+'logout' => 'Do le eme',
+'userlogout' => 'Do le eme',
+'nologin' => "Wòmeŋlɔ ŋkɔ oa? '''$1'''.",
+'nologinlink' => 'Ŋlɔ ŋkɔ daɖi',
+'createaccount' => 'Ŋlɔ ŋkɔ daɖi',
+'gotaccount' => "Wò ŋlɔ ŋkɔ xoxoa? '''$1'''.",
+'gotaccountlink' => 'Ge ɖe eme',
+'loginsuccesstitle' => 'Wò ge ɖe eme azɔ̃.',
+'loginsuccess' => "'''Wò le {{SITENAME}} me fifia abe \"\$1\" ene.'''",
+'nouserspecified' => 'Elebe na ŋlɔ ŋkɔ si wò zãna',
 'acct_creation_throttle_hit' => "Wiki sia zãla aɖe tso wò ''IP address'' ŋlɔ {{PLURAL:$1|1 ŋkɔ|$1 ŋkɔwo}} le ŋkeke si vayi me xoxo. Mɔɖeɖe le na ŋkɔ  ɖeka ko ŋɔŋlɔ le ŋkeke ɖeka me.<br />
 Le esiata la, ''IP address'' sia zãlawo mekpɔ mɔ aŋlɔ ŋkɔ bubuwo fifia o.",
-'loginlanguagelabel'         => 'Gbe: $1',
+'loginlanguagelabel' => 'Gbe: $1',
 
 # Edit page toolbar
 'sig_tip' => 'Dzesiwò kple gaƒoƒoa',
 
 # Edit pages
-'subject'                          => 'Ta nya:',
-'minoredit'                        => 'Esia nye tɔtrɔ sue aɖe ko',
-'watchthis'                        => 'Le ŋku ɖe axa sia ŋu',
-'savearticle'                      => 'Dzra axa sia ɖo',
-'preview'                          => 'Kpɔe do ŋgɔ',
-'showpreview'                      => 'Fiae do ŋgɔ',
-'showdiff'                         => 'Fia tɔtrɔwo',
-'newarticle'                       => '(Yeye)',
-'newarticletext'                   => "Eva ɖo axa si gɔme womedze haɖeke o. Ne wòadi be yeadze egɔme la, dze nuŋlɔm ɖe go sia me le afi sia ɖome (kpɔ [[{{MediaWiki:Helppage}}|kpekpeɖeŋu nyawo]] na kpekpeɖeŋu bubuwo). Ne wòme ɖoe be yeava afii hafi o la, ekema tia '''megbe''' eye wòa gbugbɔ ayi afisi wòtso va.",
-'previewnote'                      => "'''Ɖo ŋku edzi be wole afii fiam do ŋgɔ, wome dzrae ɖo haɖeke o!'''",
-'editing'                          => '$1 na etɔtrɔ',
-'editingsection'                   => 'Wòle $1 (ƒe akpa aɖe) trɔm',
-'yourtext'                         => 'Wò nuŋɔŋlɔ',
-'yourdiff'                         => 'Vovototowo',
-'copyrightwarning'                 => "Taflatse, mítsɔe be nusiwo katã netsɔ kpe ɖe {{SITENAME}} ŋu lii fãa le $2 la nu (kpɔ $1 me nyawo). Ne madze ŋuwò be amebubuwo natrɔ asi le nusiwo newɔ ŋuti o, eye woagbugbɔ dɔsiwo newɔ ama na amebubuwo fãa o la, mega dae ɖe afisia o.<br /> Wòle ŋugbe dom na mí bena wò ŋutɔe ŋlɔ nusiawo, alo etsɔe tso afisi mɔɖeɖe li fãa be amesiame na tsɔ nuwo tso afima fãa. '''Mega da nusiwo ŋu mɔɖeɖe meli na o la ɖe afisia o!'''",
+'subject' => 'Ta nya:',
+'minoredit' => 'Esia nye tɔtrɔ sue aɖe ko',
+'watchthis' => 'Le ŋku ɖe axa sia ŋu',
+'savearticle' => 'Dzra axa sia ɖo',
+'preview' => 'Kpɔe do ŋgɔ',
+'showpreview' => 'Fiae do ŋgɔ',
+'showdiff' => 'Fia tɔtrɔwo',
+'newarticle' => '(Yeye)',
+'newarticletext' => "Eva ɖo axa si gɔme womedze haɖeke o. Ne wòadi be yeadze egɔme la, dze nuŋlɔm ɖe go sia me le afi sia ɖome (kpɔ [[{{MediaWiki:Helppage}}|kpekpeɖeŋu nyawo]] na kpekpeɖeŋu bubuwo). Ne wòme ɖoe be yeava afii hafi o la, ekema tia '''megbe''' eye wòa gbugbɔ ayi afisi wòtso va.",
+'previewnote' => "'''Ɖo ŋku edzi be wole afii fiam do ŋgɔ, wome dzrae ɖo haɖeke o!'''",
+'editing' => '$1 na etɔtrɔ',
+'editingsection' => 'Wòle $1 (ƒe akpa aɖe) trɔm',
+'yourtext' => 'Wò nuŋɔŋlɔ',
+'yourdiff' => 'Vovototowo',
+'copyrightwarning' => "Taflatse, mítsɔe be nusiwo katã netsɔ kpe ɖe {{SITENAME}} ŋu lii fãa le $2 la nu (kpɔ $1 me nyawo). Ne madze ŋuwò be amebubuwo natrɔ asi le nusiwo newɔ ŋuti o, eye woagbugbɔ dɔsiwo newɔ ama na amebubuwo fãa o la, mega dae ɖe afisia o.<br /> Wòle ŋugbe dom na mí bena wò ŋutɔe ŋlɔ nusiawo, alo etsɔe tso afisi mɔɖeɖe li fãa be amesiame na tsɔ nuwo tso afima fãa. '''Mega da nusiwo ŋu mɔɖeɖe meli na o la ɖe afisia o!'''",
 'permissionserrorstext-withaction' => 'Se meɖe mɔ bena na $2 o, le {{PLURAL:$1|ta|ta}}:',
-'edit-already-exists'              => 'Wòmateŋu adze axa sia gɔme o.<br />
+'edit-already-exists' => 'Wòmateŋu adze axa sia gɔme o.<br />
 Wo ŋlɔe xoxo.',
 
 # History pages
-'currentrev-asof'      => 'Tata susue le $1 dzi',
-'revisionasof'         => 'Tataa le $1',
-'revision-info'        => 'Tataa le $1 si $2 wɔ',
-'previousrevision'     => '← Tata xoxoa',
-'nextrevision'         => 'Tata yeyea →',
-'currentrevisionlink'  => 'Tata susuea',
-'cur'                  => 'yeyea',
-'next'                 => 'eyome',
-'last'                 => 'mamlea',
-'page_first'           => 'gbãtɔ',
-'page_last'            => 'mamlea',
-'histlegend'           => "Vovo tatia: de dzesi tata siwo ƒe vovototowo wò di be yea kpɔ ɖa eye na tia 'enter' alo kpe si le eɖome.<br />
+'currentrev-asof' => 'Tata susue le $1 dzi',
+'revisionasof' => 'Tataa le $1',
+'revision-info' => 'Tataa le $1 si $2 wɔ',
+'previousrevision' => '← Tata xoxoa',
+'nextrevision' => 'Tata yeyea →',
+'currentrevisionlink' => 'Tata susuea',
+'cur' => 'yeyea',
+'next' => 'eyome',
+'last' => 'mamlea',
+'page_first' => 'gbãtɔ',
+'page_last' => 'mamlea',
+'histlegend' => "Vovo tatia: de dzesi tata siwo ƒe vovototowo wò di be yea kpɔ ɖa eye na tia 'enter' alo kpe si le eɖome.<br />
 Gɔmeɖeɖe: '''({{int:cur}})''' = vovototo tso tata mamlea gbɔ, '''({{int:last}})''' = vovototo tso tata si do ŋgɔ gbɔ, '''{{int:minoreditletter}}''' = tɔtrɔ sue.",
 'history-show-deleted' => 'Esiwo wotutu ko',
-'histfirst'            => 'Xoxoɔwu',
-'histlast'             => 'Yeyeɛwu',
+'histfirst' => 'Xoxoɔwu',
+'histlast' => 'Yeyeɛwu',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1 le $2',
-'history-feed-empty'          => 'Axa si dim wòle meli o.
+'history-feed-empty' => 'Axa si dim wòle meli o.
 Dewomahĩ, wotutui le wiki sia dzi alo wotrɔ eƒe ŋkɔ.
 Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
 
 # Revision deletion
-'rev-delundel'          => 'fia/ɣla',
-'rev-showdeleted'       => 'fia',
-'revdelete-radio-same'  => '(megatrɔe o)',
-'revdelete-radio-set'   => 'Yo',
+'rev-delundel' => 'fia/ɣla',
+'rev-showdeleted' => 'fia',
+'revdelete-radio-same' => '(megatrɔe o)',
+'revdelete-radio-set' => 'Yo',
 'revdelete-radio-unset' => 'Kpao',
 
 # Diffs
-'history-title'           => '"$1" ƒe tata xoxoawo',
-'difference'              => '(Vovototowo le tata xoxoawo me)',
-'lineno'                  => 'Fli $1:',
+'history-title' => '"$1" ƒe tata xoxoawo',
+'lineno' => 'Fli $1:',
 'compareselectedversions' => 'Kpɔ tata siwo wotia la',
 
 # Search results
-'searchresults'                  => 'Nusiwo wòdi',
-'searchresults-title'            => 'Nusiwo wofɔ le "$1" didi me',
-'searchsubtitle'                 => 'Nusi wòdi enye \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|axawo katã siwo dze egɔme kple "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|axawo katã siwo kuɖe "$1" ŋu]]).',
-'searchsubtitleinvalid'          => "Wòdi '''$1'''",
-'notitlematches'                 => 'Mesɔ axa aɖeke ƒe tanya o',
-'notextmatches'                  => 'Axa aɖeke ƒe nyawo mesɔ kple nyasiawo o.',
-'prevn'                          => '{{PLURAL:$1|$1}} do ŋgɔ',
-'nextn'                          => '{{PLURAL:$1|$1}} yometɔwo',
-'viewprevnext'                   => 'Kpɔ ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists'              => "'''Axa si ŋkɔ enye \"[[:\$1]]\" le wiki sia dzi'''",
-'searchmenu-new'                 => "'''Dze axa \"[[:\$1]]\" sia ŋlɔm ɖe wiki la dzi!'''",
-'searchprofile-everything'       => 'Nuɖesiaɖe',
+'searchresults' => 'Nusiwo wòdi',
+'searchresults-title' => 'Nusiwo wofɔ le "$1" didi me',
+'searchsubtitle' => 'Nusi wòdi enye \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|axawo katã siwo dze egɔme kple "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|axawo katã siwo kuɖe "$1" ŋu]]).',
+'searchsubtitleinvalid' => "Wòdi '''$1'''",
+'notitlematches' => 'Mesɔ axa aɖeke ƒe tanya o',
+'notextmatches' => 'Axa aɖeke ƒe nyawo mesɔ kple nyasiawo o.',
+'prevn' => '{{PLURAL:$1|$1}} do ŋgɔ',
+'nextn' => '{{PLURAL:$1|$1}} yometɔwo',
+'viewprevnext' => 'Kpɔ ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Axa si ŋkɔ enye \"[[:\$1]]\" le wiki sia dzi'''",
+'searchmenu-new' => "'''Dze axa \"[[:\$1]]\" sia ŋlɔm ɖe wiki la dzi!'''",
+'searchprofile-everything' => 'Nuɖesiaɖe',
 'searchprofile-articles-tooltip' => 'Dii le $1',
-'searchprofile-project-tooltip'  => 'Dii le $1',
-'search-result-size'             => '$1 ({{PLURAL:$2|nya 1|nya $2}})',
-'search-suggest'                 => 'Ɖe wò be: $1',
-'search-interwiki-more'          => '(kɔ kpe ɖe eŋu)',
-'searchall'                      => 'wokatã',
-'powersearch'                    => 'Dii de eme',
-'powersearch-field'              => 'Di',
-'powersearch-toggleall'          => 'Wokatã',
+'searchprofile-project-tooltip' => 'Dii le $1',
+'search-result-size' => '$1 ({{PLURAL:$2|nya 1|nya $2}})',
+'search-suggest' => 'Ɖe wò be: $1',
+'search-interwiki-more' => '(kɔ kpe ɖe eŋu)',
+'searchall' => 'wokatã',
+'powersearch' => 'Dii de eme',
+'powersearch-field' => 'Di',
+'powersearch-toggleall' => 'Wokatã',
 
 # Preferences page
-'preferences'              => 'Didiwo',
-'mypreferences'            => 'Nyeƒe didiwo',
-'skin-preview'             => 'Kpɔe do ŋgɔ',
-'prefs-datetime'           => 'Ŋkeke kple gaƒoƒo',
+'preferences' => 'Didiwo',
+'mypreferences' => 'Nyeƒe didiwo',
+'skin-preview' => 'Kpɔe do ŋgɔ',
+'prefs-datetime' => 'Ŋkeke kple gaƒoƒo',
 'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
-'timezoneregion-africa'    => 'Afrika',
-'yourlanguage'             => 'Gbe:',
-'yournick'                 => 'Dzesi',
-'gender-male'              => 'Ŋutsu',
-'gender-female'            => 'Nyɔnu',
+'timezoneregion-africa' => 'Afrika',
+'yourlanguage' => 'Gbe:',
+'yournick' => 'Dzesi',
+'gender-male' => 'Ŋutsu',
+'gender-female' => 'Nyɔnu',
 
 # Groups
-'group'       => 'Hame:',
-'group-bot'   => 'Bɔtwo',
+'group' => 'Hame:',
+'group-bot' => 'Bɔtwo',
 'group-sysop' => 'Dɔdzikpɔlawo',
-'group-all'   => '(wokatã)',
+'group-all' => '(wokatã)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'xlẽ axa sia',
 'action-edit' => 'trɔ asi le axa sia ŋu',
 
 # Recent changes
-'recentchanges'        => 'Tɔtrɔ yeyewo',
+'recentchanges' => 'Tɔtrɔ yeyewo',
 'recentchanges-legend' => 'Tatiawo na tɔtrɔ yeyewo',
-'rcnote'               => "Afisia wofia {{PLURAL:$1|tɔtrɔ '''1''' susue|tɔtrɔ '''$1''' susuewo}} le {{PLURAL:$2|ŋkeke si|ŋkeke '''$2''' mamleawo siwo}} vayi la me, le $5, $4.",
-'rcnotefrom'           => "Tɔtrɔwo siwo wowɔ tso '''$2''' (wofia vaseɖe '''$1''') le afii.",
-'rclistfrom'           => 'Fia tɔtrɔ yeyewo tso $1',
-'rcshowhideminor'      => '$1 tɔtrɔ suewo',
-'rcshowhidebots'       => '$1 bɔtwo',
-'rcshowhideliu'        => '$1 ezãla siwo ŋlɔ ŋkɔ',
-'rcshowhideanons'      => '$1 ŋkɔ maŋlɔlawo',
-'rcshowhidemine'       => '$1 nyeƒe tɔtrɔwo',
-'rclinks'              => 'Fia tɔtrɔ $1 mamleawo le ŋkeke $2 siwo vayi me<br />$3',
-'diff'                 => 'tɔtrɔ',
-'hist'                 => 'xoxo',
-'hide'                 => 'Ɣla',
-'show'                 => 'Fia',
-'minoreditletter'      => 's',
-'newpageletter'        => 'Y',
+'rcnote' => "Afisia wofia {{PLURAL:$1|tɔtrɔ '''1''' susue|tɔtrɔ '''$1''' susuewo}} le {{PLURAL:$2|ŋkeke si|ŋkeke '''$2''' mamleawo siwo}} vayi la me, le $5, $4.",
+'rcnotefrom' => "Tɔtrɔwo siwo wowɔ tso '''$2''' (wofia vaseɖe '''$1''') le afii.",
+'rclistfrom' => 'Fia tɔtrɔ yeyewo tso $1',
+'rcshowhideminor' => '$1 tɔtrɔ suewo',
+'rcshowhidebots' => '$1 bɔtwo',
+'rcshowhideliu' => '$1 ezãla siwo ŋlɔ ŋkɔ',
+'rcshowhideanons' => '$1 ŋkɔ maŋlɔlawo',
+'rcshowhidemine' => '$1 nyeƒe tɔtrɔwo',
+'rclinks' => 'Fia tɔtrɔ $1 mamleawo le ŋkeke $2 siwo vayi me<br />$3',
+'diff' => 'tɔtrɔ',
+'hist' => 'xoxo',
+'hide' => 'Ɣla',
+'show' => 'Fia',
+'minoreditletter' => 's',
+'newpageletter' => 'Y',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Tɔtrɔ siwo kaa afii',
-'recentchangeslinked-feed'    => 'Tɔtrɔ siwo kaa afii',
+'recentchangeslinked' => 'Tɔtrɔ siwo kaa afii',
+'recentchangeslinked-feed' => 'Tɔtrɔ siwo kaa afii',
 'recentchangeslinked-toolbox' => 'Tɔtrɔ siwo kaa afii',
-'recentchangeslinked-title'   => 'Tɔtrɔ siwo ku ɖe "$1" ŋu',
-'recentchangeslinked-page'    => 'Axaa ƒe ŋkɔ',
+'recentchangeslinked-title' => 'Tɔtrɔ siwo ku ɖe "$1" ŋu',
+'recentchangeslinked-page' => 'Axaa ƒe ŋkɔ',
 
 # Upload
-'upload'    => 'Ɖo agbalẽ ɖa',
+'upload' => 'Ɖo agbalẽ ɖa',
 'uploadbtn' => 'Ɖo agbalẽ ɖa',
 
 # File description page
-'file-anchor-link'   => 'Agbalẽ',
-'filehist'           => 'Axa sia ƒe tata xoxoawo',
-'filehist-help'      => 'Tia ŋkeke/gaƒoƒo ɖeka ne wòadi be yea kpɔ axa sia ƒe tata le ɣemaɣi',
+'file-anchor-link' => 'Agbalẽ',
+'filehist' => 'Axa sia ƒe tata xoxoawo',
+'filehist-help' => 'Tia ŋkeke/gaƒoƒo ɖeka ne wòadi be yea kpɔ axa sia ƒe tata le ɣemaɣi',
 'filehist-deleteone' => 'tutui',
-'filehist-datetime'  => 'Ŋkeke/Gaƒoƒo',
-'filehist-user'      => 'Ezãla',
-'linkstoimage'       => 'Axa {{PLURAL:$1|sia|$1 siawo}} ku ɖe agbalẽ sia ŋu.',
-'sharedupload'       => "Agbalɛ̃ sia tso $1 eye dɔ (''alo project'') bubuawo woateŋu azãe fãa.",
+'filehist-datetime' => 'Ŋkeke/Gaƒoƒo',
+'filehist-user' => 'Ezãla',
+'linkstoimage' => 'Axa {{PLURAL:$1|sia|$1 siawo}} ku ɖe agbalẽ sia ŋu.',
+'sharedupload' => "Agbalɛ̃ sia tso $1 eye dɔ (''alo project'') bubuawo woateŋu azãe fãa.",
 
 # File deletion
 'filedelete-submit' => 'Tutui',
@@ -357,51 +356,51 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
 'mimesearch' => 'MIME me didi',
 
 # Random page
-'randompage'         => 'Axaa ɖe ko',
+'randompage' => 'Axaa ɖe ko',
 'randompage-nopages' => 'Axa aɖeke mele "$1" o.',
 
 # Statistics
 'statistics' => 'Akɔntawo',
 
-'brokenredirects-edit'   => 'trɔ asi le eŋu',
+'brokenredirects-edit' => 'trɔ asi le eŋu',
 'brokenredirects-delete' => 'tutui',
 
 'fewestrevisions' => 'Axawo siwo womeɖɔɖo zã o',
 
 # Miscellaneous special pages
-'wantedpages'    => 'Axawo siwo le hahĩam',
-'mostrevisions'  => 'Axawo siwo woɖɔɖo wu',
-'shortpages'     => 'Axa kpuiwo',
-'longpages'      => 'Axa didiwo',
+'wantedpages' => 'Axawo siwo le hahĩam',
+'mostrevisions' => 'Axawo siwo woɖɔɖo wu',
+'shortpages' => 'Axa kpuiwo',
+'longpages' => 'Axa didiwo',
 'protectedpages' => 'Axawo siwo ŋu wole dzɔdzɔm',
-'listusers'      => 'Ezãlawo ƒe xexlẽme',
-'usercreated'    => 'Wodze egɔme le ŋkeke $1 dzi le gaƒoƒo $2 me.',
-'newpages'       => 'Axa yeyewo',
-'ancientpages'   => 'Axawo si wo do xoxo wu',
-'move'           => 'Ɖɔli eƒe nɔƒe',
-'movethispage'   => 'Ɖɔli axa sia ƒe nɔƒe',
-'pager-newer-n'  => '{{PLURAL:$1|1 yeyea|$1 yeyeawo}}',
-'pager-older-n'  => '{{PLURAL:$1|1 xoxoa|$1 xoxoawo}}',
+'listusers' => 'Ezãlawo ƒe xexlẽme',
+'usercreated' => 'Wodze egɔme le ŋkeke $1 dzi le gaƒoƒo $2 me.',
+'newpages' => 'Axa yeyewo',
+'ancientpages' => 'Axawo si wo do xoxo wu',
+'move' => 'Ɖɔli eƒe nɔƒe',
+'movethispage' => 'Ɖɔli axa sia ƒe nɔƒe',
+'pager-newer-n' => '{{PLURAL:$1|1 yeyea|$1 yeyeawo}}',
+'pager-older-n' => '{{PLURAL:$1|1 xoxoa|$1 xoxoawo}}',
 
 # Book sources
-'booksources'               => 'Agbalɛ̃wo ƒe tsoƒe',
+'booksources' => 'Agbalɛ̃wo ƒe tsoƒe',
 'booksources-search-legend' => 'Di agbalẽwo ƒe tsoƒewo',
-'booksources-go'            => 'Yi',
+'booksources-go' => 'Yi',
 
 # Special:Log
-'specialloguserlabel'  => 'Ezãla:',
+'specialloguserlabel' => 'Ezãla:',
 'speciallogtitlelabel' => 'Ta nya:',
 
 # Special:AllPages
-'allpages'       => 'Axawo katã',
+'allpages' => 'Axawo katã',
 'alphaindexline' => '$1 vaseɖe $2',
-'nextpage'       => 'Axa yometɔ ($1)',
-'prevpage'       => 'Axa do ŋgɔ ($1)',
-'allpagesfrom'   => 'Fia axawo tso:',
-'allpagesto'     => 'Fia axawo vaseɖe:',
-'allarticles'    => 'Axawo katã',
+'nextpage' => 'Axa yometɔ ($1)',
+'prevpage' => 'Axa do ŋgɔ ($1)',
+'allpagesfrom' => 'Fia axawo tso:',
+'allpagesto' => 'Fia axawo vaseɖe:',
+'allarticles' => 'Axawo katã',
 'allinnamespace' => 'Axawo katã ($1 namespace)',
-'allpagesnext'   => 'Eyome',
+'allpagesnext' => 'Eyome',
 'allpagessubmit' => 'Yi',
 
 # Special:LinkSearch
@@ -414,153 +413,153 @@ Zã [[Special:Search|nuwo didi le wiki sia dzi]] kpɔ na axa yeyeawo.',
 'listgrouprights-group' => 'Hame',
 
 # Watchlist
-'watch'         => 'Le ŋku ɖe eŋu',
+'watch' => 'Le ŋku ɖe eŋu',
 'watchthispage' => 'Le ŋku ɖe axa sia ŋu',
-'wlnote'        => "Afisia wofia {{PLURAL:$1|tɔtrɔ '''1''' mamlea|tɔtrɔ '''$1''' mamleawo}} le {{PLURAL:$2|gaƒoƒo mamlea si|gaƒoƒo '''$2''' mamleawo siwo}} vayi la me.",
-'wlshowlast'    => 'Fia gaƒoƒo $1 ŋkeke $2 mamleawo. $3',
+'wlnote' => "Afisia wofia {{PLURAL:$1|tɔtrɔ '''1''' mamlea|tɔtrɔ '''$1''' mamleawo}} le {{PLURAL:$2|gaƒoƒo mamlea si|gaƒoƒo '''$2''' mamleawo siwo}} vayi la me.",
+'wlshowlast' => 'Fia gaƒoƒo $1 ŋkeke $2 mamleawo. $3',
 
 # Delete
-'deletepage'     => 'Tutu axa sia',
-'exblank'        => 'axa la le gbɔlo',
+'deletepage' => 'Tutu axa sia',
+'exblank' => 'axa la le gbɔlo',
 'delete-confirm' => 'Tutu "$1"',
-'delete-legend'  => 'Tutui',
+'delete-legend' => 'Tutui',
 'actioncomplete' => 'Wowɔe vɔ',
 'dellogpagetext' => 'Afisia wofia axa mamleawo siwo wotutu la',
 
 # Protect
-'prot_1movedto2'              => '[[$1]] wohee yi [[$2]]',
-'protect-default'             => 'Namɔ ezãlawo katã',
+'prot_1movedto2' => '[[$1]] wohee yi [[$2]]',
+'protect-default' => 'Namɔ ezãlawo katã',
 'protect-level-autoconfirmed' => 'Xemɔ na ame yeyewo kple ŋkɔmaŋlɔlawo',
-'protect-expiring'            => 'ewunu $1 (UTC)',
-'protect-existing-expiry'     => 'Nuwuwu gaƒoƒo: $3, $2"',
-'protect-expiry-options'      => 'gaƒoƒo 1:1 hour,ŋkeke 1:1 day,kɔsiɖa 1:1 week,kɔsiɖa 2:2 weeks,ɣleti 1:1 month,ɣleti 3:3 months,ɣleti 6:6 months,ƒe 1:1 year,tegbe:infinite',
-'restriction-type'            => 'Mɔɖeɖe:',
+'protect-expiring' => 'ewunu $1 (UTC)',
+'protect-existing-expiry' => 'Nuwuwu gaƒoƒo: $3, $2"',
+'protect-expiry-options' => 'gaƒoƒo 1:1 hour,ŋkeke 1:1 day,kɔsiɖa 1:1 week,kɔsiɖa 2:2 weeks,ɣleti 1:1 month,ɣleti 3:3 months,ɣleti 6:6 months,ƒe 1:1 year,tegbe:infinite',
+'restriction-type' => 'Mɔɖeɖe:',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'Trɔ asi le eŋu',
-'restriction-move'   => 'Ɖɔli eƒe nɔƒe',
+'restriction-edit' => 'Trɔ asi le eŋu',
+'restriction-move' => 'Ɖɔli eƒe nɔƒe',
 'restriction-create' => 'Dze egɔme',
 
 # Undelete
-'undelete'                  => 'Kpɔ axawo si wotutu',
-'viewdeletedpage'           => 'Kpɔ axawo si wotutu',
-'undeleteviewlink'          => 'kpɔe',
-'undelete-search-submit'    => 'Dii',
+'undelete' => 'Kpɔ axawo si wotutu',
+'viewdeletedpage' => 'Kpɔ axawo si wotutu',
+'undeleteviewlink' => 'kpɔe',
+'undelete-search-submit' => 'Dii',
 'undelete-show-file-submit' => 'Yo',
 
 # Namespace form on various pages
 'invert' => 'Trɔ tatiawo tu',
 
 # Contributions
-'contributions'       => 'Ezãla ƒe nuŋɔŋlɔwo',
+'contributions' => 'Ezãla ƒe nuŋɔŋlɔwo',
 'contributions-title' => '$1 ƒe nuŋɔŋlɔwo',
-'mycontris'           => 'Nyeƒe nuŋɔŋlɔwo',
-'contribsub2'         => 'Na $1 ($2)',
-'uctop'               => '(tametɔ)',
-'month'               => 'Tso ɣleti (kple do ŋgɔ):',
-'year'                => 'Tso ƒe (kple do ŋgɔ):',
+'mycontris' => 'Nyeƒe nuŋɔŋlɔwo',
+'contribsub2' => 'Na $1 ($2)',
+'uctop' => '(tametɔ)',
+'month' => 'Tso ɣleti (kple do ŋgɔ):',
+'year' => 'Tso ƒe (kple do ŋgɔ):',
 
 'sp-contributions-newbies' => 'Fia ŋkɔŋlɔla yeyewo ƒe ɖɔɖɔɖowo ko.',
-'sp-contributions-talk'    => 'Nyamedzroƒe',
-'sp-contributions-search'  => 'Di nuŋɔŋlɔwo',
-'sp-contributions-submit'  => 'Dii',
+'sp-contributions-talk' => 'Nyamedzroƒe',
+'sp-contributions-search' => 'Di nuŋɔŋlɔwo',
+'sp-contributions-submit' => 'Dii',
 
 # What links here
-'whatlinkshere'       => 'Nusiwo kaa afii ŋu',
+'whatlinkshere' => 'Nusiwo kaa afii ŋu',
 'whatlinkshere-title' => 'Axawo siwo ku ɖe "$1" ŋu',
-'whatlinkshere-page'  => 'Axa:',
-'linkshere'           => "Axa siwo le afisia ku ɖe '''[[:$1]]''' ŋu:",
-'nolinkshere'         => "Axa aɖeke meku ɖe '''[[:$1]]''' ŋu o.",
-'whatlinkshere-prev'  => '{{PLURAL:$1|do ŋgɔ|$1 do ŋgɔ}}',
-'whatlinkshere-next'  => '{{PLURAL:$1|eyome|$1 eyome}}',
+'whatlinkshere-page' => 'Axa:',
+'linkshere' => "Axa siwo le afisia ku ɖe '''[[:$1]]''' ŋu:",
+'nolinkshere' => "Axa aɖeke meku ɖe '''[[:$1]]''' ŋu o.",
+'whatlinkshere-prev' => '{{PLURAL:$1|do ŋgɔ|$1 do ŋgɔ}}',
+'whatlinkshere-next' => '{{PLURAL:$1|eyome|$1 eyome}}',
 
 # Block/unblock
-'blockip'                  => 'Xe mɔ na ezãla sia',
-'blockip-legend'           => 'Xe mɔ na ezãla sia',
-'ipbexpiry'                => 'Nuwuwu:',
-'ipboptions'               => 'gaƒoƒo 2:2 hours,ŋkeke 1:1 day,ŋkeke 3:3 days,kɔsiɖa 1:1 week,kɔsiɖa 2:2 weeks,ɣleti 1:1 month,ɣleti 3:3 months,ɣleti 6:6 months,ƒe 1:1 year,tegbe:infinite',
-'blockipsuccesssub'        => 'Mɔxexea dze edzi',
-'ipb-unblock-addr'         => 'Ɖe $1 ƒe mɔxexe ɖa',
-'ipb-blocklist'            => 'Kpɔ mɔxexe siwo li xoxo',
-'ipb-blocklist-contribs'   => '$1 ƒe nuŋɔŋlɔwo',
-'ipusubmit'                => 'Ɖe mɔxexe sia ɖa',
-'ipblocklist-submit'       => 'Dii',
-'infiniteblock'            => 'tegbee',
-'expiringblock'            => 'ewunu le gaƒoƒo $2 le ŋkeke $1 dzi',
-'createaccountblock'       => 'woxe mɔ na ŋkɔa ŋɔŋlɔ',
-'blocklink'                => 'xemɔ',
-'unblocklink'              => 'ɖe mɔxexe',
-'change-blocklink'         => 'ɖɔli mɔxexe',
-'contribslink'             => 'nuŋɔŋlɔ',
-'blocklogentry'            => 'xemɔ na [[$1]] vaseɖe $2 megbe $3',
+'blockip' => 'Xe mɔ na ezãla sia',
+'blockip-legend' => 'Xe mɔ na ezãla sia',
+'ipbexpiry' => 'Nuwuwu:',
+'ipboptions' => 'gaƒoƒo 2:2 hours,ŋkeke 1:1 day,ŋkeke 3:3 days,kɔsiɖa 1:1 week,kɔsiɖa 2:2 weeks,ɣleti 1:1 month,ɣleti 3:3 months,ɣleti 6:6 months,ƒe 1:1 year,tegbe:infinite',
+'blockipsuccesssub' => 'Mɔxexea dze edzi',
+'ipb-unblock-addr' => 'Ɖe $1 ƒe mɔxexe ɖa',
+'ipb-blocklist' => 'Kpɔ mɔxexe siwo li xoxo',
+'ipb-blocklist-contribs' => '$1 ƒe nuŋɔŋlɔwo',
+'ipusubmit' => 'Ɖe mɔxexe sia ɖa',
+'ipblocklist-submit' => 'Dii',
+'infiniteblock' => 'tegbee',
+'expiringblock' => 'ewunu le gaƒoƒo $2 le ŋkeke $1 dzi',
+'createaccountblock' => 'woxe mɔ na ŋkɔa ŋɔŋlɔ',
+'blocklink' => 'xemɔ',
+'unblocklink' => 'ɖe mɔxexe',
+'change-blocklink' => 'ɖɔli mɔxexe',
+'contribslink' => 'nuŋɔŋlɔ',
+'blocklogentry' => 'xemɔ na [[$1]] vaseɖe $2 megbe $3',
 'block-log-flags-nocreate' => 'wo xemɔ na ŋkɔ ŋɔŋlɔ',
 
 # Move page
-'move-page-legend'        => 'Ɖɔli eƒe nɔƒe',
-'movearticle'             => 'Ɖɔli eƒe nɔƒe:',
-'newtitle'                => 'Yi ɖe tanya yeye la:',
-'move-watch'              => 'Le ŋku ɖe axa sia ŋu',
-'movepagebtn'             => 'Ɖɔli eƒe nɔƒe',
-'pagemovedsub'            => 'Axaa ƒe hehe dze edzi',
-'movepage-moved'          => '\'\'\'Wohe "$1" vayi "$2"\'\'\'',
-'articleexists'           => 'Tanya alo ŋkɔ sia nye axa bubu aɖe tɔ xoxo, alo eda se dzi.
+'move-page-legend' => 'Ɖɔli eƒe nɔƒe',
+'movearticle' => 'Ɖɔli eƒe nɔƒe:',
+'newtitle' => 'Yi ɖe tanya yeye la:',
+'move-watch' => 'Le ŋku ɖe axa sia ŋu',
+'movepagebtn' => 'Ɖɔli eƒe nɔƒe',
+'pagemovedsub' => 'Axaa ƒe hehe dze edzi',
+'movepage-moved' => '\'\'\'Wohe "$1" vayi "$2"\'\'\'',
+'articleexists' => 'Tanya alo ŋkɔ sia nye axa bubu aɖe tɔ xoxo, alo eda se dzi.
 Tia ŋkɔ alo tanya bubu.',
 'cantmove-titleprotected' => 'Wòmateŋu ahe axa aɖeke va afii o, elabena wo xemɔ na tanya sia ƒe ŋɔŋlɔ',
-'movedto'                 => 'wohee yi',
+'movedto' => 'wohee yi',
 
 # Export
 'export' => 'Ɖo axa siawo ɖa',
 
 # Namespace 8 related
-'allmessages'               => 'Gbeƒãɖeɖewo',
-'allmessages-filter-all'    => 'Wokatã',
+'allmessages' => 'Gbeƒãɖeɖewo',
+'allmessages-filter-all' => 'Wokatã',
 'allmessages-filter-submit' => 'Yi',
 
 # Thumbnails
 'thumbnail-more' => 'Ne lolo ɖe edzi',
 
 # Tooltip help for the actions
-'tooltip-pt-preferences'          => 'Nyeƒe didiwo',
-'tooltip-pt-mycontris'            => 'Wò nuŋɔŋlɔwo ƒe xexlẽme',
-'tooltip-pt-login'                => 'Togbɔ be menye ɖe wò hĩa o tse la, mía ve nuwò bena na ŋlɔ ŋkɔ',
-'tooltip-pt-logout'               => 'Do le eme',
-'tooltip-ca-edit'                 => 'Wòateŋu aɖɔ axa sia ɖo.
+'tooltip-pt-preferences' => 'Nyeƒe didiwo',
+'tooltip-pt-mycontris' => 'Wò nuŋɔŋlɔwo ƒe xexlẽme',
+'tooltip-pt-login' => 'Togbɔ be menye ɖe wò hĩa o tse la, mía ve nuwò bena na ŋlɔ ŋkɔ',
+'tooltip-pt-logout' => 'Do le eme',
+'tooltip-ca-edit' => 'Wòateŋu aɖɔ axa sia ɖo.
 Ne ewɔvɔ la, tia "Fiae do ŋgɔ" kpea gbã hafi na dzrae ɖo.',
-'tooltip-ca-addsection'           => 'Dze akpa yeye gɔme',
-'tooltip-ca-viewsource'           => 'Wo dokpɔ ɖe axa sia ŋu.
+'tooltip-ca-addsection' => 'Dze akpa yeye gɔme',
+'tooltip-ca-viewsource' => 'Wo dokpɔ ɖe axa sia ŋu.
 Wòateŋu akpɔ alesi woŋlɔe.',
-'tooltip-ca-history'              => 'Axa sia ƒe tata xoxoawo',
-'tooltip-ca-protect'              => 'Dzɔ axa sia ŋu',
-'tooltip-ca-delete'               => 'Tutu axa sia',
-'tooltip-ca-move'                 => 'Ɖɔli axa sia ƒe nɔƒe',
-'tooltip-search'                  => 'Dii {{SITENAME}}',
-'tooltip-search-go'               => 'Yi axa si ƒe ŋkɔ enye esia ne woŋlɔe xoxo',
-'tooltip-search-fulltext'         => 'Di nyasiawo le axawo me.',
-'tooltip-n-mainpage'              => 'Yi axa si do ŋgɔ',
-'tooltip-n-mainpage-description'  => 'Yi axa si do ŋgɔ',
-'tooltip-n-recentchanges'         => 'Tɔtrɔ yeyewo le wiki sia me.',
-'tooltip-n-randompage'            => 'Kpɔ axa ɖesiaɖe ko',
-'tooltip-n-help'                  => 'Nuwo srɔ̃ƒe',
-'tooltip-t-whatlinkshere'         => 'Wiki nuŋɔŋlɔwo katã siwo ku ɖe afii ŋuti',
-'tooltip-t-recentchangeslinked'   => 'Tɔtrɔ yeyewo le axa siwo ku ɖe axa sia ŋuti',
-'tooltip-t-contributions'         => 'Kpɔ nusiwo amesia ŋlɔ',
-'tooltip-t-upload'                => 'Ɖo nutatawo kple nuƒoƒowo ɖa',
-'tooltip-t-specialpages'          => 'Axa tɔxewo ƒe xexlẽme',
-'tooltip-ca-nstab-main'           => 'Kpɔ axa si tanyawo le',
-'tooltip-ca-nstab-special'        => 'Axa sia nye axa tɔxe.  Wò mateŋu atrɔ nu aɖeke le edzi o.',
-'tooltip-minoredit'               => 'Esia nye tɔtrɔ sue aɖe ko',
-'tooltip-save'                    => 'Dzra wòƒe tɔtrɔwo ɖo',
-'tooltip-preview'                 => 'Kpɔ wò ɖɔɖɔɖowo do ŋgɔ, mía ve nuwo bena na zãe hafi na dzrae ɖo!',
-'tooltip-diff'                    => 'Fia tɔtrɔ siwo newɔ le nuŋɔŋlɔa me',
+'tooltip-ca-history' => 'Axa sia ƒe tata xoxoawo',
+'tooltip-ca-protect' => 'Dzɔ axa sia ŋu',
+'tooltip-ca-delete' => 'Tutu axa sia',
+'tooltip-ca-move' => 'Ɖɔli axa sia ƒe nɔƒe',
+'tooltip-search' => 'Dii {{SITENAME}}',
+'tooltip-search-go' => 'Yi axa si ƒe ŋkɔ enye esia ne woŋlɔe xoxo',
+'tooltip-search-fulltext' => 'Di nyasiawo le axawo me.',
+'tooltip-n-mainpage' => 'Yi axa si do ŋgɔ',
+'tooltip-n-mainpage-description' => 'Yi axa si do ŋgɔ',
+'tooltip-n-recentchanges' => 'Tɔtrɔ yeyewo le wiki sia me.',
+'tooltip-n-randompage' => 'Kpɔ axa ɖesiaɖe ko',
+'tooltip-n-help' => 'Nuwo srɔ̃ƒe',
+'tooltip-t-whatlinkshere' => 'Wiki nuŋɔŋlɔwo katã siwo ku ɖe afii ŋuti',
+'tooltip-t-recentchangeslinked' => 'Tɔtrɔ yeyewo le axa siwo ku ɖe axa sia ŋuti',
+'tooltip-t-contributions' => 'Kpɔ nusiwo amesia ŋlɔ',
+'tooltip-t-upload' => 'Ɖo nutatawo kple nuƒoƒowo ɖa',
+'tooltip-t-specialpages' => 'Axa tɔxewo ƒe xexlẽme',
+'tooltip-ca-nstab-main' => 'Kpɔ axa si tanyawo le',
+'tooltip-ca-nstab-special' => 'Axa sia nye axa tɔxe.  Wò mateŋu atrɔ nu aɖeke le edzi o.',
+'tooltip-minoredit' => 'Esia nye tɔtrɔ sue aɖe ko',
+'tooltip-save' => 'Dzra wòƒe tɔtrɔwo ɖo',
+'tooltip-preview' => 'Kpɔ wò ɖɔɖɔɖowo do ŋgɔ, mía ve nuwo bena na zãe hafi na dzrae ɖo!',
+'tooltip-diff' => 'Fia tɔtrɔ siwo newɔ le nuŋɔŋlɔa me',
 'tooltip-compareselectedversions' => 'Kpɔ vovototwo le axa sia ƒe tata eve siwo wotia la me',
 
 # Browsing diffs
 'previousdiff' => '← Tata xoxoa',
-'nextdiff'     => 'Tɔtrɔ yeyea →',
+'nextdiff' => 'Tɔtrɔ yeyea →',
 
 # Special:NewFiles
 'newimages' => 'Nutata yeyewo',
-'ilsubmit'  => 'Dii',
+'ilsubmit' => 'Dii',
 
 # External editor support
 'edit-externally-help' => '(Kpɔ [//www.mediawiki.org/wiki/Manual:External_editors gɔmedzedze sewo] na kpekpeɖeŋu bubuwo.)',
@@ -568,19 +567,19 @@ Wòateŋu akpɔ alesi woŋlɔe.',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'katã',
 'namespacesall' => 'wokatã',
-'monthsall'     => 'wokatã',
+'monthsall' => 'wokatã',
 
 # Multipage image navigation
 'imgmultipagenext' => 'axa yometɔ',
-'imgmultigo'       => 'Yi!',
-'imgmultigoto'     => 'Yi axa $1',
+'imgmultigo' => 'Yi!',
+'imgmultigoto' => 'Yi axa $1',
 
 # Table pager
-'table_pager_next'         => 'Axa yometɔ',
-'table_pager_prev'         => 'Axa si do ŋgɔ',
-'table_pager_first'        => 'Axa gbãtɔ',
-'table_pager_last'         => 'Axa mamlea',
-'table_pager_limit'        => 'Fia nu $1 le axa sia axa dzi',
+'table_pager_next' => 'Axa yometɔ',
+'table_pager_prev' => 'Axa si do ŋgɔ',
+'table_pager_first' => 'Axa gbãtɔ',
+'table_pager_last' => 'Axa mamlea',
+'table_pager_limit' => 'Fia nu $1 le axa sia axa dzi',
 'table_pager_limit_submit' => 'Yi',
 
 # Watchlist editing tools
index d51332b..c7be691 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author AK
+ * @author Aitolos
  * @author Assassingr
  * @author Azimout
  * @author Badseed
@@ -25,6 +26,7 @@
  * @author Kaganer
  * @author Kiolalis
  * @author Kiriakos
+ * @author Kongr43gpen
  * @author Lou
  * @author MF-Warburg
  * @author Malafaya
@@ -41,7 +43,7 @@
  */
 
 /**
-  * Translation by Pasok Internet Volunteers
+  * Initial translation by Pasok Internet Volunteers
   * http://forum.pasok.gr
   * version 1.0 (initial release)
   *
@@ -180,37 +182,6 @@ $specialPageAliases = array(
        'Withoutinterwiki'          => array( 'ΧωρίςInterwiki' ),
 );
 
-$fallback8bitEncoding = 'iso-8859-7';
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
-$linkTrail = '/^([a-zαβγδεζηθικλμνξοπρστυφχψωςΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίόύώϊϋΐΰΆΈΉΊΌΎΏΪΫ]+)(.*)$/sDu';
-
-
-$datePreferences = array(
-       'default',
-       'dmy',
-       'ISO 8601',
-);
-
-$defaultDateFormat = 'dmy';
-
-$datePreferenceMigrationMap = array(
-       'default',
-       'dmy',
-       'dmy',
-       'dmy'
-);
-
-$dateFormats = array(
-       'dmy time' => 'H:i',
-       'dmy date' => 'j xg Y',
-       'dmy both' => 'H:i, j xg Y',
-
-       'ISO 8601 time' => 'xnH:xni:xns',
-       'ISO 8601 date' => 'xnY-xnm-xnd',
-       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
-);
-
-
 $magicWords = array(
        'redirect'                  => array( '0', '#ΑΝΑΚΑΤΕΥΘΥΝΣΗ', '#REDIRECT' ),
        'notoc'                     => array( '0', '__ΧΩΡΙΣΠΠ__', '__NOTOC__' ),
@@ -218,7 +189,6 @@ $magicWords = array(
        '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' ),
@@ -351,6 +321,35 @@ $magicWords = array(
        'protectionlevel'           => array( '1', 'ΕΠΙΠΕΔΟΠΡΟΣΤΑΣΙΑΣ', 'PROTECTIONLEVEL' ),
 );
 
+$fallback8bitEncoding = 'iso-8859-7';
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$linkTrail = '/^([a-zαβγδεζηθικλμνξοπρστυφχψωςΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίόύώϊϋΐΰΆΈΉΊΌΎΏΪΫ]+)(.*)$/sDu';
+
+$datePreferences = array(
+       'default',
+       'dmy',
+       'ISO 8601',
+);
+
+$defaultDateFormat = 'dmy';
+
+$datePreferenceMigrationMap = array(
+       'default',
+       'dmy',
+       'dmy',
+       'dmy'
+);
+
+$dateFormats = array(
+       'dmy time' => 'H:i',
+       'dmy date' => 'j xg Y',
+       'dmy both' => 'H:i, j xg Y',
+
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Υπογράμμιση συνδέσμων:',
@@ -401,7 +400,7 @@ $messages = array(
 
 'underline-always' => 'Πάντα',
 'underline-never' => 'Ποτέ',
-'underline-default' => 'ΠÏ\81οεÏ\80ιλογή Ï\84οÏ\85 browser',
+'underline-default' => 'ΠÏ\81οεÏ\80ιλεγμένο Ï\80Ï\81Ï\8cγÏ\81αμμα Ï\80εÏ\81ιήγηÏ\83ηÏ\82',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Τύπος γραμματοσειράς της περιοχής επεξεργασίας:',
@@ -486,8 +485,8 @@ $messages = array(
 'newwindow' => '(ανοίγει σε ξεχωριστό παράθυρο)',
 'cancel' => 'Ακύρωση',
 'moredotdotdot' => 'Περισσότερα...',
-'mypage' => 'Î\97 Ï\83ελίδα Î¼Î¿Ï\85',
-'mytalk' => 'Î\9fι Ï\83Ï\85ζηÏ\84ήÏ\83ειÏ\82 Î¼Î¿Ï\85',
+'mypage' => 'Σελίδα',
+'mytalk' => 'ΣÏ\85ζήÏ\84ηÏ\83η',
 'anontalk' => 'Οι συζητήσεις αυτής της διεύθυνσης IP',
 'navigation' => 'Πλοήγηση',
 'and' => '&#32;και',
@@ -497,7 +496,6 @@ $messages = array(
 'qbbrowse' => 'Περιήγηση',
 'qbedit' => 'Επεξεργασία',
 'qbpageoptions' => 'Αυτή η σελίδα',
-'qbpageinfo' => 'Συμφραζόμενα',
 'qbmyoptions' => 'Οι σελίδες μου',
 'qbspecialpages' => 'Σελίδες λειτουργιών',
 'faq' => 'Συχνές ερωτήσεις (FAQ)',
@@ -510,7 +508,7 @@ $messages = array(
 'vector-action-protect' => 'Προστασία',
 'vector-action-undelete' => 'Επαναφορά',
 'vector-action-unprotect' => 'Αλλάξτε την προστασία',
-'vector-simplesearch-preference' => 'Î\95νεÏ\81γοÏ\80οίηÏ\83η ÎµÎ½Î¹Ï\83Ï\87Ï\85μένÏ\89ν Ï\80Ï\81οÏ\84άÏ\83εÏ\89ν Î±Î½Î±Î¶Î®Ï\84ηÏ\83ηÏ\82',
+'vector-simplesearch-preference' => 'Î\95νεÏ\81γοÏ\80οίηÏ\83η Î±Ï\80λοÏ\80οιημένηÏ\82 Î¼Ï\80άÏ\81αÏ\82 Î±Î½Î±Î¶Î®Ï\84ηÏ\83ηÏ\82 (μÏ\8cνον Vector skin)',
 'vector-view-create' => 'Δημιουργία',
 'vector-view-edit' => 'Επεξεργασία',
 'vector-view-history' => 'Προβολή ιστορικού',
@@ -520,6 +518,7 @@ $messages = array(
 'namespaces' => 'Περιοχές ονομάτων',
 'variants' => 'Παραλλαγές',
 
+'navigation-heading' => 'Μενού πλοήγησης',
 'errorpagetitle' => 'Σφάλμα',
 'returnto' => 'Επιστροφή στη σελίδα $1.',
 'tagline' => 'Από {{SITENAME}}',
@@ -532,7 +531,7 @@ $messages = array(
 'history_short' => 'Ιστορικό',
 'updatedmarker' => 'Ενημερωμένα από την τελευταία επίσκεψή μου',
 'printableversion' => 'Εκτυπώσιμη έκδοση',
-'permalink' => 'Î\9cÏ\8cνιμος σύνδεσμος',
+'permalink' => 'ΣÏ\84αθεÏ\81Ï\8cς σύνδεσμος',
 'print' => 'Εκτύπωση',
 'view' => 'Προβολή',
 'edit' => 'Επεξεργασία',
@@ -557,7 +556,7 @@ $messages = array(
 'articlepage' => 'Εμφάνιση σελίδας κειμένου',
 'talk' => 'Συζήτηση',
 'views' => 'Εμφανίσεις',
-'toolbox' => 'Î\95Ï\81γαλεία',
+'toolbox' => 'Î\95Ï\81γαλειοθήκη',
 'userpage' => 'Εμφάνιση σελίδας χρήστη',
 'projectpage' => 'Εμφάνιση σελίδας βοήθειας',
 'imagepage' => 'Εμφάνιση σελίδας αρχείου',
@@ -671,12 +670,12 @@ $1',
 # General errors
 'error' => 'Σφάλμα',
 'databaseerror' => 'Σφάλμα στη βάση δεδομένων',
-'dberrortext' => 'ΣημειÏ\8eθηκε Ï\83Ï\85νÏ\84ακÏ\84ικÏ\8c Ï\83Ï\86άλμα Ï\83ε Î±Î¯τημα προς τη βάση δεδομένων.
+'dberrortext' => 'ΣημειÏ\8eθηκε Ï\83Ï\85νÏ\84ακÏ\84ικÏ\8c Ï\83Ï\86άλμα Ï\83ε ÎµÏ\81Ï\8eτημα προς τη βάση δεδομένων.
 Πιθανόν να πρόκειται για ένδειξη σφάλματος στο λογισμικό.
 Το τελευταίο αίτημα προς τη βάση δεδομένων που επιχειρήθηκε ήταν:
-<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"
@@ -726,8 +725,10 @@ $1',
 'protectedpagetext' => 'Αυτή η σελίδα έχει κλειδωθεί για αποτροπή επεξεργασίας της.',
 'viewsourcetext' => 'Μπορείτε να δείτε και να αντιγράψετε τον κώδικα αυτής της σελίδας:',
 'viewyourtext' => "Μπορείτε να προβάλετε και να αντιγράψετε τον κώδικα των '''επεξεργασιών σας''' σε αυτήν τη σελίδα:",
-'protectedinterface' => 'Αυτή η σελίδα παρέχει κείμενο διεπαφής για το λογισμικό, και έχει κλειδωθεί για πρόληψη τυχόν βανδαλισμού.',
-'editinginterface' => "'''Προσοχή:''' Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτή τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για τους άλλους χρήστες. Εάν θέλετε να διορθώσετε τη μετάφραση, μπορείτε να χρησιμοποιήσετε το [//translatewiki.net/wiki/Main_Page?setlang=el translatewiki.net], που ασχολείται με τις μεταφράσεις των μηνυμάτων MediaWiki.",
+'protectedinterface' => 'Αυτή η σελίδα παρέχει κείμενο διεπαφής για το λογισμικό σε αυτό το wiki, και έχει κλειδωθεί για αποτροπή τυχόν βανδαλισμού.
+
+Για να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wikis, παρακαλούμε χρησιμοποιήστε  [//translatewiki.net/ translatewiki.net], το εγχείρημα τοπικοποίησης του  MediaWiki.',
+'editinginterface' => "'''Προσοχή:''' Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτή τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για τους άλλους χρήστες. Εάν θέλετε να διορθώσετε τη μετάφραση, μπορείτε να χρησιμοποιήσετε το [//translatewiki.net/ translatewiki.net], το εγχείρημα για με τις μεταφράσεις των μηνυμάτων MediaWiki.",
 'sqlhidden' => '(το αίτημα SQL δεν εμφανίζεται)',
 'cascadeprotected' => 'Αυτή η σελίδα έχει προστατευθεί από επεξεργασία, επειδή περιλαμβάνεται στις ακόλουθες {{PLURAL:$1|σελίδα|σελίδες}}, που είναι προστατευμένες με την ενεργοποιημένη "διαδοχική" προστασία στο:
 $2',
@@ -751,17 +752,18 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Έχετε αποσυνδεθεί.'''
 
-Μπορείτε να παραμείνετε στο {{SITENAME}} ανώνυμα, ή μπορείτε [[Special:UserLogin|να συνδεθείτε ξανά]] με το ίδιο ή με διαφορετικό (εάν έχετε) όνομα χρήστη.
+Μπορείτε να παραμείνετε στο {{SITENAME}} ανώνυμα, ή μπορείτε <span class='plainlinks'>[$1 να συνδεθείτε ξανά]</span> με το ίδιο ή με διαφορετικό (εάν έχετε) όνομα χρήστη.
 Έχετε υπόψη σας πως αρκετές σελίδες θα συνεχίσουν να εμφανίζονται κανονικά, σαν να μην έχετε αποσυνδεθεί, μέχρι να καθαρίσετε τη λανθάνουσα μνήμη του φυλλομετρητή σας.",
-'welcomecreation' => '== Καλώς ήλθατε, $1! ==
-Ο λογαριασμός σας έχει δημιουργηθεί.
-Μην ξεχάσετε να ρυθμίσετε τις [[Special:Preferences|προτιμήσεις]] σας στο {{SITENAME}}.',
+'welcomeuser' => 'Καλώς ορίσατε, $1!',
+'welcomecreation-msg' => 'Ο λογαριασμός σας έχει δημιουργηθεί.
+Μην ξεχάσετε να αλλάξετε τις [[Special:Preferences|{{SITENAME}} προτιμήσεις]] σας.',
 'yourname' => 'Όνομα χρήστη:',
 'yourpassword' => 'Κωδικός:',
 'yourpasswordagain' => 'Πληκτρολογήστε ξανά τον κωδικό',
 'remembermypassword' => 'Διατήρηση του κωδικού πρόσβασης σε αυτόν τον υπολογιστή (για μέγιστο $1 {{PLURAL:$1|ημέρα|ημέρες}})',
 'securelogin-stick-https' => 'Μείνετε συνδεδεμένοι με HTTPS μετά την είσοδο',
 'yourdomainname' => 'Το domain σας:',
+'password-change-forbidden' => 'Δεν μπορείτε να αλλάξετε τους κωδικούς πρόσβασης σε αυτό το βίκι.',
 'externaldberror' => 'Είτε συνέβη κάποιο σφάλμα εξωτερικής πιστοποίησης της βάσης δεδομένων είτε δεν σας έχει επιτραπεί να ενημερώσετε τον εξωτερικό σας λογαριασμό.',
 'login' => 'Είσοδος',
 'nav-login-createaccount' => 'Δημιουργία Λογαριασμού/Είσοδος',
@@ -989,8 +991,8 @@ $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>.',
+Μπορείτε να [[Special:Search/{{PAGENAME}}|αναζητήσετε αυτόν τον τίτλο σελίδας]] σε άλλες σελίδες,
+ή <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} να αναζητήσετε τα σχετικά αρχεία]</span>, αλλά δεν έχεις την άδεια να δημιουργήσεις αυτή τη σελίδα.',
 'userpage-userdoesnotexist' => 'Ο Λογαριασμός του χρήστη "<nowiki>$1</nowiki>" δεν είναι καταχωρημένος. Παρακαλώ δείτε αν θα θέλατε να δημιουργήσετε/επεξεργαστείτε αυτή τη σελίδα.',
 'userpage-userdoesnotexist-view' => 'Ο λογαριασμός χρήστη "$1" δεν είναι εγγεγραμμένος.',
 'blocked-notice-logextract' => 'Επί του παρόντος, αυτός ο χρήστης έχει υποστεί φραγή. Παρακάτω παρέχεται για αναφορά η πιο πρόσφατη καταχώρηση του αρχείου φραγών.',
@@ -998,7 +1000,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 πριν την αποθηκεύσετε.",
@@ -1013,7 +1014,7 @@ $2
 'note' => "'''Προσοχή: '''",
 'previewnote' => "'''Να θυμάστε ότι αυτή είναι μόνο μια προεπισκόπηση.'''
 Οι αλλαγές σας δεν έχουν ακόμη αποθηκευτεί!",
-'continue-editing' => 'ΣÏ\85νέÏ\87εια επεξεργασίας',
+'continue-editing' => 'Î\9cεÏ\84αβείÏ\84ε Ï\83Ï\84ην Ï\80εÏ\81ιοÏ\87ή επεξεργασίας',
 'previewconflict' => 'Αυτή η προεπισκόπηση απεικονίζει το κείμενο στην επάνω περιοχή επεξεργασίας κειμένου, όπως θα εμφανιστεί εάν επιλέξετε να το αποθηκεύσετε.',
 'session_fail_preview' => "'''Συγγνώμη! Δεν μπορούσαμε να διεκπεραιώσουμε την επεξεργασία σας λόγω απώλειας των δεδομένων της συνεδρίας.
 Παρακαλώ προσπαθήστε ξανά. Αν δεν δουλεύει ξανά, δοκιμάστε να αποσυνδεθείτε και να συνδεθείτε πάλι.'''",
@@ -1093,6 +1094,13 @@ $2
 'edit-already-exists' => 'Δεν ήταν εφικτό να δημιουργηθεί η νέα σελίδα.
 Υπάρχει ήδη.',
 'defaultmessagetext' => 'Προεπιλεγμένο κείμενο μηνύματος',
+'invalid-content-data' => 'Μη έγκυρα δεδομένα περιεχομένου',
+
+# Content models
+'content-model-wikitext' => 'βικικείμενο',
+'content-model-text' => 'απλό κείμενο',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Προειδοποίηση: Αυτή η σελίδα περιέχει πάρα πολύ ακριβό αναλυτή λειτουργικών κλήσεων.
@@ -1168,7 +1176,7 @@ $2
 Μπορεί να υπάρχουν λεπτομέρειες στο [{{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}}}} αρχείο καταστολής].",
 'rev-deleted-no-diff' => "Δεν μπορείτε να δείτε αυτή τη διαφορά επειδή μια από τις αναθεωρήσεις έχει '''διαγραφεί'''.
@@ -1240,8 +1248,10 @@ $1",
 Παρακαλώ ελέξτε τα αρχεία καταγραφών.',
 'revdelete-only-restricted' => 'Σφάλμα κατα την απόκρυψη του αντικειμένου στις $2, $1: δεν μπορείτε να αποκρύψετε τη προβολή στοιχείων από τους διαχειριστές χωρίς ταυτόχρονα να επιλέξετε και μία από τις άλλες επιλογές απόκρυψης.',
 'revdelete-reason-dropdown' => '*Συνήθεις αιτίες διαγραφής
-** Παραβίαση δικαιωμάτων
-** Ανάρμοστες προσωπικές πληροφορίες',
+** Παραβίαση πνευματικών δικαιωμάτων
+** Ανάρμοστα σχόλια ή προσωπικές πληροφορίες 
+** Ανάρμοστο όνομα χρήστη 
+** Εν δυνάμει δυσφημιστική πληροφορία',
 'revdelete-otherreason' => 'Άλλος/πρόσθετος λόγος:',
 'revdelete-reasonotherlist' => 'Άλλος λόγος',
 'revdelete-edit-reasonlist' => 'Επεξεργασία λόγων διαγραφής',
@@ -1334,8 +1344,6 @@ $1",
 'search-interwiki-caption' => 'Αδελφικά εγχειρήματα',
 'search-interwiki-default' => '$1 αποτελέσματα:',
 'search-interwiki-more' => '(περισσότερα)',
-'search-mwsuggest-enabled' => 'με υποδείξεις',
-'search-mwsuggest-disabled' => 'χωρίς υποδείξεις',
 'search-relatedarticle' => 'Σχετικά',
 'mwsuggest-disable' => 'Απενεργοποίηση των προτάσεων AJAX',
 'searcheverything-enable' => 'Αναζήτηση σε όλες τις περιοχές ονομάτων',
@@ -1368,7 +1376,7 @@ $1",
 
 # Preferences page
 'preferences' => 'Προτιμήσεις',
-'mypreferences' => 'Î\9fι Ï\80Ï\81οÏ\84ιμήÏ\83ειÏ\82 Î¼Î¿Ï\85',
+'mypreferences' => 'ΠÏ\81οÏ\84ιμήÏ\83ειÏ\82',
 'prefs-edits' => 'Αριθμός επεξεργασιών:',
 'prefsnologin' => 'Δεν έχετε συνδεθεί.',
 'prefsnologintext' => 'Πρέπει να έχετε <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} συνδεθεί]</span> για να καθορίσετε τις προτιμήσεις χρήστη.',
@@ -1431,7 +1439,7 @@ $1",
 'timezoneregion-indian' => 'Ινδικός Ωκεανός',
 'timezoneregion-pacific' => 'Ειρηνικός Ωκεανός',
 'allowemail' => 'Ενεργοποίηση παραλαβής μηνύματος ηλεκτρονικού ταχυδρομείου από άλλους χρήστες',
-'prefs-searchoptions' => 'Î\95Ï\80ιλογέÏ\82 Î±Î½Î±Î¶Î®Ï\84ηÏ\83ηÏ\82',
+'prefs-searchoptions' => 'Î\91ναζήÏ\84ηÏ\83η',
 'prefs-namespaces' => 'Περιοχές ονομάτων',
 'defaultns' => 'Ειδάλλως αναζήτηση σε αυτές τις περιοχές ονομάτων:',
 'default' => 'προεπιλογή',
@@ -1597,6 +1605,8 @@ $1",
 'rightslogtext' => 'Καταγραφές των αλλαγών στα δικαιώματα χρηστών.',
 'rightslogentry' => 'η ιδιότητα μέλους ομάδας για τον/την $1 από $2 σε $3 άλλαξε',
 'rightslogentry-autopromote' => 'προωθήθηκε αυτόματα από $2 σε $3',
+'logentry-rights-rights-legacy' => '{{GENDER:$1|Ο|Η}} $1 άλλαξε την ιδιότητα μέλους ομάδας {{GENDER:$1|του|της}} $3',
+'logentry-rights-autopromote' => '$1 προωθήθηκε αυτόματα από το $4 στο $5',
 'rightsnone' => '(κανένα)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1835,6 +1845,7 @@ $1',
 'backend-fail-notsame' => 'Ένα μη-ταυτόσημο αρχείο υπάρχει ήδη στο $1.',
 'backend-fail-invalidpath' => '$1 δεν είναι έγκυρη διαδρομή αποθήκευσης.',
 'backend-fail-delete' => 'Αδύνατη η διαγραφή αρχείου $1.',
+'backend-fail-describe' => 'Δεν ήταν δυνατή η αλλαγή μεταδεδομένων για το αρχείο "$1".',
 'backend-fail-alreadyexists' => 'Το αρχείο $1 υπάρχει ήδη.',
 'backend-fail-store' => 'Αδύνατη η αποθήκευση του αρχείου $1 σε $2.',
 'backend-fail-copy' => 'Αδύνατη η αντιγραφή του αρχείου από $1 σε $2.',
@@ -1849,10 +1860,11 @@ $1',
 'backend-fail-connect' => 'Δεν ήταν δυνατή η σύνδεση στο αντικείμενο αποθήκευσης "$1".',
 'backend-fail-internal' => 'Παρουσιάστηκε ένα άγνωστο σφάλμα στην αποθήκευση παρασκηνίου "$1".',
 'backend-fail-contenttype' => 'Δεν μπόρεσε να προσδιοριστεί ο τύπος περιεχομένου του αρχείου για την αποθήκευση σε "$1".',
+'backend-fail-usable' => 'Δεν ήταν δυνατή η ανάγνωση ή εγγραφή του αρχείου "$1" λόγω ανεπαρκών δικαιωμάτων ή απουσίας καταλόγων/φακέλων.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Δεν μπορέσατε να  ξεκλειδώσετε το " $1 ". Δεν είναι κλειδωμένο.',
-'lockmanager-fail-closelock' => 'Δεν μπόρεσε να κλείσει το κλειδωμένο αρχείο για " $1 ".',
+'lockmanager-fail-closelock' => 'Δεν μπόρεσε να κλείσει το κλειδωμένο αρχείο για "$1".',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'Παρουσιάστηκε σφάλμα κατά το άνοιγμα του αρχείου για ZIP ελέγχους.',
@@ -1967,6 +1979,7 @@ $1',
 'shared-repo-from' => 'από το $1',
 'shared-repo' => 'ένα κοινό εναποθετήριο',
 'shared-repo-name-wikimediacommons' => 'Κοινά Wikimedia',
+'upload-disallowed-here' => 'Δεν μπορείτε να αντικαταστήσετε αυτό το αρχείο.',
 
 # File reversion
 'filerevert' => 'Επαναφορά $1',
@@ -2037,7 +2050,7 @@ $1',
 'statistics-edits' => 'Επεξεργασίες σελίδων από τη δημιουργία του εγχειρήματος {{SITENAME}}',
 'statistics-edits-average' => 'Μέσος όρος επεξεργασιών ανά σελίδα',
 'statistics-views-total' => 'Συνολικές εμφανίσεις',
-'statistics-views-total-desc' => ' Επισκέψεις σε μη  υπάρχουσες σελίδες και ειδικές σελίδες δεν συμπεριλαμβάνονται',
+'statistics-views-total-desc' => 'Επισκέψεις σε μη υπάρχουσες σελίδες και ειδικές σελίδες δεν συμπεριλαμβάνονται',
 'statistics-views-peredit' => 'Εμφανίσεις ανά επεξεργασία',
 'statistics-users' => 'Εγγεγραμμένοι [[Special:ListUsers|χρήστες]]',
 'statistics-users-active' => 'Ενεργοί χρήστες',
@@ -2099,6 +2112,7 @@ $1',
 'mostlinkedtemplates' => 'Περισσότερο χρησιμοποιούμενα πρότυπα',
 'mostcategories' => 'Άρθρα με τις περισσότερες κατηγορίες',
 'mostimages' => 'Περισσότερο χρησιμοποιούμενα αρχεία',
+'mostinterwikis' => 'Σελίδες με τους περισσότερους διαγλωσσικούς συνδέσμους',
 'mostrevisions' => 'Άρθρα με τις περισσότερες αναθεωρήσεις',
 'prefixindex' => 'Όλες οι σελίδες με πρόθεμα',
 'prefixindex-namespace' => 'Όλες οι σελίδες με πρόθεμα (περιοχής  $1)',
@@ -2197,7 +2211,7 @@ $1',
 'linksearch-ok' => 'Αναζήτηση',
 'linksearch-text' => 'Χαρακτήρες όπως "*.wikipedia.org" μπορούν να χρησιμοποιηθούν. 
 Χρειάζεται τουλάχιστον ένα domain ανώτατου επιπέδου, για παράδειγμα "*.org".<br />
-Υποστηριζόμενα πρωτόκολλα: <code> $1 </code> (μην προσθέτετε οποιαδήποτε από αυτές στην αναζήτησή σας).',
+Υποστηριζόμενα πρωτόκολλα: <code>$1</code> (μην προσθέτετε οποιαδήποτε από αυτές στην αναζήτησή σας).',
 'linksearch-line' => 'Η $1 συνδεδεμένη από την $2',
 'linksearch-error' => 'Λέξεις-μπαλαντέρ μπορεί να εμφανιστούν μόνο στην αρχή τού ονόματος ιστοτόπου (hostname).',
 
@@ -2248,7 +2262,7 @@ $1',
 'emailuser-title-target' => 'Αποστολή e-mail {{GENDER:$1|στο|στη}} χρήστη',
 'emailuser-title-notarget' => 'Αποστολή e-mail σε χρήστη',
 'emailpage' => 'Αποστολή μηνύματος ηλεκτρονικού ταχυδρομείο στο χρήστη',
-'emailpagetext' => 'Συπληρώνοντας την παρακάτω φόρμα θα στείλετε ένα μήνυμα εφόσον έχετε δηλώσει μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου στις [[Special:Preferences|προτιμήσεις χρήστη]]. Αυτή θα εμφανιστεί ως διεύθυνση αποστολέα του μηνύματος, ούτως ώστε ο παραλήπτης να μπορέσει να σας απαντήσει.',
+'emailpagetext' => 'Συμπληρώνοντας την παρακάτω φόρμα θα στείλετε ένα μήνυμα εφόσον έχετε δηλώσει μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου στις [[Special:Preferences|προτιμήσεις χρήστη]]. Αυτή θα εμφανιστεί ως διεύθυνση αποστολέα του μηνύματος, ούτως ώστε ο παραλήπτης να μπορέσει να σας απαντήσει.',
 'usermailererror' => 'Σφάλμα ηλεκτρονικού ταχυδρομείου:',
 'defemailsubject' => '{{SITENAME}} e-mail από τον χρήστη "$1"',
 'usermaildisabled' => 'To e-mail χρήστη είναι απενεργοποιημένο',
@@ -2319,11 +2333,7 @@ $1',
 
 'enotif_mailer' => 'Σύστημα ειδοποίησης μέσω αλληλογραφίας του {{SITENAME}}',
 'enotif_reset' => 'Σημειώστε όλες τις σελίδες ως αναγνωσμένες.',
-'enotif_newpagetext' => 'Αυτή είναι μια νέα σελίδα.',
 'enotif_impersonal_salutation' => 'Χρήστης του ιστοτόπου "{{SITENAME}}"',
-'changed' => 'έχει αλλάξει',
-'created' => 'δημιουργήθηκε',
-'enotif_subject' => 'Η σελίδα $PAGETITLE του εγχειρήματος {{SITENAME}} $CHANGEDORCREATED από το χρήστη $PAGEEDITOR',
 'enotif_lastvisited' => 'Δείτε το $1 για όλες τις αλλαγές που έγιναν από την τελευταία σας επίσκεψη.',
 'enotif_lastdiff' => 'Δείτε το $1 για να εμφανίσετε αυτή την αλλαγή.',
 'enotif_anon_editor' => 'ανώνυμος χρήστης $1',
@@ -2506,7 +2516,7 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|τροποποίηση|τροποποιήσεις}} αποκαταστάθηκαν',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|αναθεώρηση|αναθεωρήσεις}} και $2 {{PLURAL:$2|αρχείο|αρχεία}} επαναφέρθηκαν',
 'undeletedfiles' => '$1 {{PLURAL:$1|αρχείο|αρχεία}} επαναφέρθηκαν',
-'cannotundelete' => 'Î\97 ÎµÏ\80αναÏ\86οÏ\81ά Î±Ï\80έÏ\84Ï\85Ï\87ε: ÎºÎ¬Ï\80οιοÏ\82 Î¬Î»Î»Î¿Ï\82 Î¼Ï\80οÏ\81εί Î½Î± Î­Ï\87ει ÎµÏ\80αναÏ\86έÏ\81ει Ï\84η Ï\83ελίδα Ï\80Ï\81Ï\8eÏ\84οÏ\82.',
+'cannotundelete' => 'Î\97 Î±Î½Î±Î¯Ï\81εÏ\83η Î´Î¹Î±Î³Ï\81αÏ\86ήÏ\82 Î±Ï\80έÏ\84Ï\85Ï\87ε: $1',
 'undeletedpage' => "'''Η $1 έχει επαναφερθεί'''
 
 Συμβουλευτείτε το [[Special:Log/delete|αρχείο καταγραφής διαγραφών]] για ένα μητρώο των πρόσφατων διαγραφών και επαναφορών.",
@@ -2539,7 +2549,7 @@ $1',
 # Contributions
 'contributions' => 'Συνεισφορές χρήστη',
 'contributions-title' => 'Συνεισφορές του χρήστη $1',
-'mycontris' => 'Î\9fι Ï\83Ï\85νειÏ\83Ï\86οÏ\81έÏ\82 Î¼Î¿Ï\85',
+'mycontris' => 'ΣÏ\85νειÏ\83Ï\86οÏ\81έÏ\82',
 'contribsub2' => 'Για τον/την $1 ($2)',
 'nocontribs' => 'Δεν βρέθηκαν αλλαγές με αυτά τα κριτήρια.',
 'uctop' => '(τελευταία)',
@@ -2579,7 +2589,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 ανακατευθύνσεις',
 'whatlinkshere-hidetrans' => '$1 υπερκλεισμοί',
 'whatlinkshere-hidelinks' => '$1 συνδέσμων',
-'whatlinkshere-hideimages' => '$1 Ï\83Ï\8dνδεÏ\83μοι ÎµÎ¹ÎºÏ\8cνων',
+'whatlinkshere-hideimages' => '$1 Ï\83Ï\8dνδεÏ\83μοι Î±Ï\81Ï\87είων',
 'whatlinkshere-filters' => 'Φίλτρα',
 
 # Block/unblock
@@ -2913,6 +2923,8 @@ $1',
 'import-error-edit' => 'Η σελίδα "$1" δεν εισήχθηκε επειδή δεν επιτρέπεται να το επεξεργαστείτε.',
 'import-error-create' => 'Η σελίδα "$1" δεν εισήχθηκε επειδή δεν επιτρέπεται να τη δημιουργήσετε.',
 'import-error-interwiki' => 'Η σελίδα " $1 " δεν έχει εισαχθεί, επειδή το όνομα της δεσμευμένο για εξωτερική σύνδεση (interwiki).',
+'import-error-special' => 'Η σελίδα "$1" δεν εισήχθη επειδή ανήκει σε έναν ειδικό χώρο ονομάτων που δεν επιτρέπει σελίδες.',
+'import-error-invalid' => 'Η σελίδα "$1" δεν εισήχθη επειδή το όνομά της δεν είναι έγκυρο.',
 
 # Import log
 'importlogpage' => 'Αρχείο καταγραφής εισαγωγών',
@@ -2924,7 +2936,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Δοκιμή JavaScript',
-'javascripttest-disabled' => 'Αυτή η λειτουργία έχει απενεργοποιηθεί.',
 'javascripttest-title' => 'Εκτελούνται  $1  δοκιμές',
 'javascripttest-pagetext-noframework' => 'Αυτή η σελίδα είναι δεσμευμένη για την εκτέλεση δοκιμών σε JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Άγνωστο πλαίσιο δοκιμών " $1 ".',
@@ -2960,7 +2971,7 @@ $1',
 'tooltip-search-go' => 'Πήγαινε σε μια σελίδα με το ακριβές όνομα εάν υπάρχει',
 'tooltip-search-fulltext' => 'Αναζήτηση για αυτό το κείμενο',
 'tooltip-p-logo' => 'Αρχική σελίδα',
-'tooltip-n-mainpage' => 'Î\94είÏ\84ε Ï\84ην Î\91ρχική σελίδα',
+'tooltip-n-mainpage' => 'Î\94είÏ\84ε Ï\84ην Î±ρχική σελίδα',
 'tooltip-n-mainpage-description' => 'Επισκεφθείτε την κύρια σελίδα',
 'tooltip-n-portal' => 'Σχετικά με το Wiκi - πώς μπορείτε να βοηθήσετε, πού μπορείτε να απευθυνθείτε',
 'tooltip-n-currentevents' => 'Πληροφορίες για πρόσφατα γεγονότα',
@@ -3054,6 +3065,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Πληροφορίες για "$1"',
+'pageinfo-not-current' => 'Μας συγχωρείτε, είναι αδύνατο να παράσχουμε αυτή την πληροφορία για παλιές αναθεωρήσεις.',
 'pageinfo-header-basic' => 'Βασικές πληροφορίες',
 'pageinfo-header-edits' => 'Ιστορικό επεξεργασίας',
 'pageinfo-header-restrictions' => 'Προστασία σελίδας',
@@ -3062,10 +3074,32 @@ $1',
 'pageinfo-default-sort' => 'Προεπιλεγμένο κλειδί ταξινόμησης',
 'pageinfo-length' => 'Μήκος σελίδας (σε bytes)',
 'pageinfo-article-id' => 'Αναγνωριστικό σελίδας',
+'pageinfo-language' => 'Γλώσσα σελίδας περιεχομένου',
+'pageinfo-robot-policy' => 'Στάτους μηχανής αναζήτησης',
+'pageinfo-robot-index' => 'Καταχωρήσιμο σε ευρετήριο',
+'pageinfo-robot-noindex' => 'Μη καταχωρήσιμο σε ευρετήριο',
 'pageinfo-views' => 'Αριθμός προβολών',
-'pageinfo-watchers' => 'Αριθμός παρατηρητών',
-'pageinfo-edits' => 'Αριθμός επεξεργασιών',
-'pageinfo-authors' => 'Αριθμός ξεχωριστών συγγραφέων',
+'pageinfo-watchers' => 'Αριθμός παρατηρητών σελίδας',
+'pageinfo-redirects-name' => 'Ανακατευθύνσεις σε αυτή τη σελίδα',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Υποσελίδες αυτής της σελίδας',
+'pageinfo-firstuser' => 'Δημιουργός της σελίδας',
+'pageinfo-firsttime' => 'Ημερομηνία δημιουργίας της σελίδας',
+'pageinfo-lastuser' => 'Τελευταίος συντάκτης',
+'pageinfo-lasttime' => 'Ημερομηνία τελευταίας επεξεργασίας',
+'pageinfo-edits' => 'Συνολικός αριθμός επεξεργασιών',
+'pageinfo-authors' => 'Συνολικός αριθμός διαφορετικών συντακτών',
+'pageinfo-recent-edits' => 'Πρόσφατος αριθμός επεξεργασιών (σε διάστημα $1)',
+'pageinfo-recent-authors' => 'Πρόσφατος αριθμός μοναδικών συντακτών',
+'pageinfo-magic-words' => '{{PLURAL:$1|Μαγική λέξη|Μαγικές λέξεις}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Κρυφή κατηγορία|Κρυφές κατηγορίες}} ($1)',
+'pageinfo-templates' => 'Ενσωματωμένα {{PLURAL:$1|πρότυπο|πρότυπα}} ($1)',
+'pageinfo-toolboxlink' => 'Πληροφορίες σελίδας',
+'pageinfo-redirectsto' => 'Ανακατευθύνσεις σε',
+'pageinfo-redirectsto-info' => 'πληροφορίες',
+'pageinfo-contentpage' => 'Υπολογίζονται ως σελίδες περιεχομένου',
+'pageinfo-contentpage-yes' => 'Ναι',
+'pageinfo-protect-cascading-yes' => 'Ναι',
 
 # Skin names
 'skinname-standard' => 'Κλασσικό',
@@ -3116,6 +3150,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, ονομαστικό μέγεθος σε pixels: $1 × $2, μέγεθος αρχείου: $3',
 'show-big-image' => 'Πλήρης ανάλυση',
 'show-big-image-preview' => 'Μέγεθος αυτής της προεπισκόπησης: $1 .',
 'show-big-image-other' => 'Άλλες {{PLURAL:$2|ανάλυση|αναλύσεις}}: $1.',
@@ -3125,6 +3160,7 @@ $1',
 'file-info-png-looped' => 'Σε άπειρο βρόγχο',
 'file-info-png-repeat' => 'έπαιξε $1 {{PLURAL:$1|φορά|φορές}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|πλαίσιο|πλαίσια}}',
+'file-no-thumb-animation' => "'''Σημείωση: λόγω τεχνικών περιορισμών, οι μικρογραφίες αυτού του αρχείου δεν θα είναι κινούμενες.'''",
 
 # Special:NewFiles
 'newimages' => 'Πινακοθήκη νέων εικόνων',
@@ -3743,6 +3779,7 @@ $5
 'version-license' => 'Άδεια χρήσης',
 'version-poweredby-credits' => "Αυτό το wiki λειτουργεί με στο '''[//www.mediawiki.org/ MediaWiki]''', πνευματική ιδιοκτησία © 2001-$1 $2.",
 'version-poweredby-others' => 'άλλοι',
+'version-credits-summary' => 'Θα θέλαμε να αναγνωρίσουμε τη συμβολή των παρακάτω προσώπων στο [[Special:Version|MediaWiki]].',
 'version-license-info' => "Το MediaWiki είναι ελεύθερο λογισμικό. Μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό τους όρους της άδειας GNU General Public License όπως αυτή εκδόθηκε από το Free Software Foundation· είτε της δεύτερης έκδοσης της άδειας, είτε (κατ' επιλογή σας) οποιασδήποτε επόμενης έκδοσης.
 
 Το MediaWiki διανέμεται με την ελπίδα ότι θα είναι χρήσιμο, αλλά ΧΩΡΙΣ ΚΑΜΙΑ ΕΓΓΥΗΣΗ· ούτε καν την σιωπηρή εγγύηση ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ή ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ ΕΝΑ ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ. Βλ. GNU General Public License για περισσότερες λεπτομέρειες.
@@ -3857,6 +3894,7 @@ $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' => '$1 άλλαξε την ορατότητα {{PLURAL:$5|μιας έκδοσης|$5 εκδόσεων}} στη σελίδα $3: $4',
 'logentry-delete-revision-legacy' => '$1 άλλαξε την  ορατότητα των αναθεωρήσεων στη σελίδα $3',
 'logentry-suppress-delete' => 'Ο $1 διέγραψε τη σελίδα $3',
 'logentry-suppress-revision-legacy' => '$1 κρυφά άλλαξαν την  ορατότητα των αναθεωρήσεων στη σελίδα $3',
@@ -3874,9 +3912,9 @@ $5
 'logentry-move-move_redir-noredirect' => '{{GENDER:$1|Ο|Η}} $1 μετακίνησε την σελίδα $3 στην $4 πάνω από ανακατεύθυνση χωρίς να αφήσει ανακατεύθυνση',
 'logentry-patrol-patrol' => '{{GENDER:$1|Ο|Η}} $1 σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
 'logentry-patrol-patrol-auto' => '{{GENDER:$1|Ο|Η}} $1 αυτόματα σήμανε την έκδοση $4 της σελίδας $3 ως ελεγμένη',
-'logentry-newusers-newusers' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε έναν λογαριασμό χρήστη',
-'logentry-newusers-create' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε έναν λογαριασμό χρήστη',
-'logentry-newusers-create2' => '{{GENDER:$1|Ο|Η}} $1 δημιούργησε τον λογαριασμό χρήστη $3',
+'logentry-newusers-newusers' => 'Ο λογαριασμός χρήστη $1 δημιουργήθηκε',
+'logentry-newusers-create' => 'Ο λογαριασμός χρήστη $1 δημιουργήθηκε',
+'logentry-newusers-create2' => 'Ο λογαριασμός χρήστη $3 δημιουργήθηκε από {{GENDER:$1|τον|την}} $1',
 'logentry-newusers-autocreate' => 'Ο λογαριασμός $1 δημιουργήθηκε αυτόματα',
 'newuserlog-byemail' => 'ο κωδικός έχει σταλεί μέσω ηλεκτρονικού μηνύματος',
 
@@ -3896,6 +3934,10 @@ $5
 'feedback-bugcheck' => 'Ωραία! Ελέγξτε μόνο ότι δεν είναι ήδη ένα από τα [ $1  γνωστά σφάλματα].',
 'feedback-bugnew' => 'Έλεγξα. Αναφέρετε ένα νέο σφάλμα',
 
+# Search suggestions
+'searchsuggest-search' => 'Αναζήτηση',
+'searchsuggest-containing' => 'περιέχει...',
+
 # API errors
 'api-error-badaccess-groups' => 'Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.',
 'api-error-badtoken' => 'Εσωτερικό σφάλμα: εσφαλμένο διακριτικό.',
@@ -3907,10 +3949,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-banned-type' => '$1 δεν είναι {{PLURAL:$4|επιτρεπόμενος τύπος αρχείου|επιτρεπόμενοι τύποι αρχείων}}.  {{PLURAL:$3|Επιτρεπόμενος τύπος αρχείων|Επιτρεπόμενοι τύποι αρχείων}} είναι το $2.',
 'api-error-filetype-missing' => 'Το αρχείο δεν έχει επέκταση.',
 'api-error-hookaborted' => 'Η τροποποίηση που επιχειρήσατε να κάνετε ματαιώθηκε από ένα άγκιστρο της επέκτασης.',
 'api-error-http' => 'Εσωτερικό σφάλμα: δεν είναι δυνατή η σύνδεση με το διακομιστή.',
index 6675900..b0fd2ad 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Emiliano-Romagnolo (Emiliàn e rumagnòl)
+/** Emiliano-Romagnolo (emiliàn e rumagnòl)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -16,102 +16,102 @@ $fallback = 'it';
 
 $messages = array(
 # Dates
-'sunday'    => 'Dmànga',
-'monday'    => 'Lonedè',
-'tuesday'   => 'Martedè',
+'sunday' => 'Dmànga',
+'monday' => 'Lonedè',
+'tuesday' => 'Martedè',
 'wednesday' => 'Merculdè',
-'thursday'  => 'Giuvidè',
-'friday'    => 'Venerdè',
-'saturday'  => 'Sâbet',
-'january'   => 'Znèr',
-'february'  => 'Febrèr',
-'march'     => 'Mèrz',
-'april'     => 'Avrîl',
-'june'      => 'Zógn',
-'july'      => 'Lój',
-'august'    => 'Agòst',
+'thursday' => 'Giuvidè',
+'friday' => 'Venerdè',
+'saturday' => 'Sâbet',
+'january' => 'Znèr',
+'february' => 'Febrèr',
+'march' => 'Mèrz',
+'april' => 'Avrîl',
+'june' => 'Zógn',
+'july' => 'Lój',
+'august' => 'Agòst',
 'september' => 'Setàmber',
-'october'   => 'Utóber',
-'november'  => 'Nuvàmber',
-'december'  => 'Dzèmber',
-'may'       => 'Mâz',
+'october' => 'Utóber',
+'november' => 'Nuvàmber',
+'december' => 'Dzèmber',
+'may' => 'Mâz',
 
 'mytalk' => 'I mê discussiòun',
 
 # Cologne Blue skin
 'qbspecialpages' => 'Pagini specièli',
 
-'returnto'         => 'Tórna a $1.',
-'help'             => 'Per quî rivê da pôch',
-'history_short'    => 'Stôria',
+'returnto' => 'Tórna a $1.',
+'help' => 'Per quî rivê da pôch',
+'history_short' => 'Stôria',
 'printableversion' => 'Versiòun stampàbil',
-'permalink'        => 'Link permanèint',
-'edit'             => 'Mudifichèr',
-'delete'           => 'Dscanzèla',
-'protect'          => 'Prutèzz',
-'specialpage'      => 'Pàgina specièla',
-'talk'             => 'Discussiòun',
-'jumptosearch'     => 'Zerca',
+'permalink' => 'Link permanèint',
+'edit' => 'Mudifichèr',
+'delete' => 'Dscanzèla',
+'protect' => 'Prutèzz',
+'specialpage' => 'Pàgina specièla',
+'talk' => 'Discussiòun',
+'jumptosearch' => 'Zerca',
 
 # 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).
-'currentevents'     => 'Fât e prugèt ed tót',
+'currentevents' => 'Fât e prugèt ed tót',
 'currentevents-url' => 'Project:Prugèt_ed_tót',
-'helppage'          => 'Help:Introduzione',
-'portal'            => 'Discóter e quistiunêr',
-'portal-url'        => 'Project:Bar',
+'helppage' => 'Help:Introduzione',
+'portal' => 'Discóter e quistiunêr',
+'portal-url' => 'Project:Bar',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Artéccol',
+'nstab-main' => 'Artéccol',
 'nstab-template' => 'Modèl',
 
 # Login and logout pages
-'logouttext'           => "'''Adèsa s'et discunnês.'''
+'logouttext' => "'''Adèsa s'et discunnês.'''
 
 Putiv cuntinuèr ad usèr {{SITENAME}} anonimamèint, o putiv cunnètterv dòp cun al stèss nàmm o cun un èter.
 Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv discunnès, finchè non purghê la cache dal vòster browser.",
-'userlogin'            => 'Entrèr / Argistrères',
-'logout'               => 'va fôra',
-'userlogout'           => 'Va fôra',
-'userexists'           => "Al nòmm ch'èt scélt l'è stê bèle usê: càten un èter, per piasêr.",
-'loginsuccess'         => "'''Adèsa sèt cunês in {{SITENAME}} cun al nàmm d'utèint \"\$1\".'''",
-'wrongpassword'        => "La password ch'et méss l'è sbajèda. Pròva ancàrra.",
+'userlogin' => 'Entrèr / Argistrères',
+'logout' => 'va fôra',
+'userlogout' => 'Va fôra',
+'userexists' => "Al nòmm ch'èt scélt l'è stê bèle usê: càten un èter, per piasêr.",
+'loginsuccess' => "'''Adèsa sèt cunês in {{SITENAME}} cun al nàmm d'utèint \"\$1\".'''",
+'wrongpassword' => "La password ch'et méss l'è sbajèda. Pròva ancàrra.",
 'blocked-mailpassword' => "Al tô indirézz IP l'an pôl più feèr di cambiamèint, e l'en brisa abilitê par user la funziòun ed recópper ed password par evitèr di abûs.",
-'accountcreated'       => 'Et criê un nôv account',
+'accountcreated' => 'Et criê un nôv account',
 
 # Edit pages
-'summary'          => "Mutîv d'al cambiamèint:",
-'minoredit'        => "Còst cambiamèint ché l'é un gnînt in tót",
-'watchthis'        => "Tîn a drê a c'la pàgina chè",
-'savearticle'      => 'Salva',
-'showpreview'      => 'Anteprémma',
-'showdiff'         => 'Guèrda al differèinzi',
-'anoneditwarning'  => "'''Attenziòun:''' An sîv ménga vgnû dèinter. Al vòster indirézz IP al vrà signê in d'la stòria d'i cambiamèint ed sta pagina chè..",
+'summary' => "Mutîv d'al cambiamèint:",
+'minoredit' => "Còst cambiamèint ché l'é un gnînt in tót",
+'watchthis' => "Tîn a drê a c'la pàgina chè",
+'savearticle' => 'Salva',
+'showpreview' => 'Anteprémma',
+'showdiff' => 'Guèrda al differèinzi',
+'anoneditwarning' => "'''Attenziòun:''' An sîv ménga vgnû dèinter. Al vòster indirézz IP al vrà signê in d'la stòria d'i cambiamèint ed sta pagina chè..",
 'anontalkpagetext' => "----''Sta chè l'éla pàgina ed discussiòun d'un utèint anònim c'al n'à brisa criê un sô account o c'an l'usa ménga. Bsògna quindi usêr al sô indirézz IP par identifichèrel. L'istèss indirézz IP al pôl èsser usê da di mòndi utèint. Se sèt un utèint anònim e pèinset c'a-t in sun stèdi fâti di cummèint irrilevànt, per piasér [[Special:UserLogin|criêt un account o fê al log-in]] par evitèr confusiòuni futuri cun di èter utèint anònim.''",
-'editing'          => 'Cambiamèint ed $1',
-'yourdiff'         => 'Differèinzi',
-'templatesused'    => '{{PLURAL:$1|Modêl|Modêl}} usèdi in sta pàgina:',
+'editing' => 'Cambiamèint ed $1',
+'yourdiff' => 'Differèinzi',
+'templatesused' => '{{PLURAL:$1|Modêl|Modêl}} usèdi in sta pàgina:',
 
 # Search results
 'searchhelp-url' => 'Help:Introduzione',
 
 # Preferences page
 'mypreferences' => 'AL mê preferèinzi',
-'yourrealname'  => 'Al tô vér nàmm:',
-'yourlanguage'  => 'Léngua:',
+'yourrealname' => 'Al tô vér nàmm:',
+'yourlanguage' => 'Léngua:',
 
 # Recent changes
 'recentchanges' => 'Ûltem cambiamèint',
-'diff'          => 'diferèinzi',
-'hist'          => 'stôria',
+'diff' => 'diferèinzi',
+'hist' => 'stôria',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Mudéffic curelèdi',
-'recentchangeslinked-feed'    => 'Mudéffic curelèdi',
+'recentchangeslinked' => 'Mudéffic curelèdi',
+'recentchangeslinked-feed' => 'Mudéffic curelèdi',
 'recentchangeslinked-toolbox' => 'Mudéffic curelèdi',
 
 # Upload
-'upload'            => 'Carghèr un file',
-'filedesc'          => "Ugêt d'al cambiamèint",
+'upload' => 'Carghèr un file',
+'filedesc' => "Ugêt d'al cambiamèint",
 'fileuploadsummary' => "Ugêt d'al cambiamèint:",
 
 # Special:ListFiles
@@ -133,19 +133,19 @@ Nutêv ca alcuni pàgini i putrèbber cuntinuèr a cràdder ca vueter a-sîv dis
 'newuserlogpage' => 'Regestér di nōv utèint',
 
 # Watchlist
-'watchlist'     => 'Al còsi ca guèrd',
-'watch'         => 'Tîn a drê',
+'watchlist' => 'Al còsi ca guèrd',
+'watch' => 'Tîn a drê',
 'watchthispage' => "Tîn a drê a c'la pàgina chè",
 
 # Delete
-'excontent'         => "al cointgnû l'éra: '$1'",
-'excontentauthor'   => "al cointgnû l'éra: '$1' (e l'ónic cuntribudôr l'éra '[[Special:Contributions/$2|$2]]')",
+'excontent' => "al cointgnû l'éra: '$1'",
+'excontentauthor' => "al cointgnû l'éra: '$1' (e l'ónic cuntribudôr l'éra '[[Special:Contributions/$2|$2]]')",
 'confirmdeletetext' => "Stèt per scanzlèr 'na pàgina o n'imàgin, insìmma a tòt la sô crunolugî dal database.
 Cunfermèr per piasèr ca saîv quàl che stèv par fêr, ca capîv al pussìbil counseguèinzi e ca stèv facènd quàst in confurmitê cun [[{{MediaWiki:Policy-url}}]].",
-'deletedtext'       => '"$1" l\'è stê scanzlê.
+'deletedtext' => '"$1" l\'è stê scanzlê.
 Guèrda $2 par vèdder la lésta d\'al pàgin ch\'i sun stèdi scanzlèdi di recèint.',
-'dellogpage'        => 'Regestér dal scanzladûri',
-'deletionlog'       => 'regéster dal scanzladûri',
+'dellogpage' => 'Regestér dal scanzladûri',
+'deletionlog' => 'regéster dal scanzladûri',
 
 # Contributions
 'mycontris' => 'I mê cuntribùdi',
@@ -154,7 +154,7 @@ Guèrda $2 par vèdder la lésta d\'al pàgin ch\'i sun stèdi scanzlèdi di rec
 'whatlinkshere' => 'I pùnten chè',
 
 # Block/unblock
-'blocklink'    => 'blòchel',
+'blocklink' => 'blòchel',
 'contribslink' => "còl ch'l'à scrét",
 
 # Move page
index 1ab27bf..09e0ad0 100644 (file)
@@ -207,7 +207,6 @@ $magicWords = array(
        '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' ),
@@ -570,6 +569,7 @@ $preloadedMessages = array(
        'searcharticle',
        'searchbutton',
        'sidebar',
+       'navigation-heading',
        'site-atom-feed',
        'sitenotice',
        'specialpages',
@@ -684,7 +684,7 @@ XHTML id names.
 
 'underline-always'  => 'Always',
 'underline-never'   => 'Never',
-'underline-default' => 'Browser default',
+'underline-default' => 'Skin or browser default',
 
 # Font style option in Special:Preferences
 'editfont-style'     => 'Edit area font style:',
@@ -773,8 +773,8 @@ XHTML id names.
 'newwindow'     => '(opens in new window)',
 'cancel'        => 'Cancel',
 'moredotdotdot' => 'More...',
-'mypage'        => 'My page',
-'mytalk'        => 'My talk',
+'mypage'        => 'Page',
+'mytalk'        => 'Talk',
 'anontalk'      => 'Talk for this IP address',
 'navigation'    => 'Navigation',
 'and'           => '&#32;and',
@@ -784,7 +784,6 @@ XHTML id names.
 'qbbrowse'       => 'Browse',
 'qbedit'         => 'Edit',
 'qbpageoptions'  => 'This page',
-'qbpageinfo'     => 'Context',
 'qbmyoptions'    => 'My pages',
 'qbspecialpages' => 'Special pages',
 'faq'            => 'FAQ',
@@ -799,7 +798,7 @@ XHTML id names.
 'vector-action-protect'          => 'Protect',
 'vector-action-undelete'         => 'Undelete',
 'vector-action-unprotect'        => 'Change protection',
-'vector-simplesearch-preference' => 'Enable enhanced search suggestions (Vector skin only)',
+'vector-simplesearch-preference' => 'Enable simplified search bar (Vector skin only)',
 'vector-view-create'             => 'Create',
 'vector-view-edit'               => 'Edit',
 'vector-view-history'            => 'View history',
@@ -809,71 +808,72 @@ XHTML id names.
 'namespaces'                     => 'Namespaces',
 'variants'                       => 'Variants',
 
-'errorpagetitle'    => 'Error',
-'returnto'          => 'Return to $1.',
-'tagline'           => 'From {{SITENAME}}',
-'help'              => 'Help',
-'search'            => 'Search',
-'searchbutton'      => 'Search',
-'go'                => 'Go',
-'searcharticle'     => 'Go',
-'history'           => 'Page history',
-'history_short'     => 'History',
-'updatedmarker'     => 'updated since my last visit',
-'printableversion'  => 'Printable version',
-'permalink'         => 'Permanent link',
-'print'             => 'Print',
-'view'              => 'View',
-'edit'              => 'Edit',
-'create'            => 'Create',
-'editthispage'      => 'Edit this page',
-'create-this-page'  => 'Create this page',
-'delete'            => 'Delete',
-'deletethispage'    => 'Delete this page',
-'undelete_short'    => 'Undelete {{PLURAL:$1|one edit|$1 edits}}',
-'viewdeleted_short' => 'View {{PLURAL:$1|one deleted edit|$1 deleted edits}}',
-'protect'           => 'Protect',
-'protect_change'    => 'change',
-'protectthispage'   => 'Protect this page',
-'unprotect'         => 'Change protection',
-'unprotectthispage' => 'Change protection of this page',
-'newpage'           => 'New page',
-'talkpage'          => 'Discuss this page',
-'talkpagelinktext'  => 'Talk',
-'specialpage'       => 'Special page',
-'personaltools'     => 'Personal tools',
-'postcomment'       => 'New section',
-'addsection'        => '+', # do not translate or duplicate this message to other languages
-'articlepage'       => 'View content page',
-'talk'              => 'Discussion',
-'views'             => 'Views',
-'toolbox'           => 'Toolbox',
-'userpage'          => 'View user page',
-'projectpage'       => 'View project page',
-'imagepage'         => 'View file page',
-'mediawikipage'     => 'View message page',
-'templatepage'      => 'View template page',
-'viewhelppage'      => 'View help page',
-'categorypage'      => 'View category page',
-'viewtalkpage'      => 'View discussion',
-'otherlanguages'    => 'In other languages',
-'redirectedfrom'    => '(Redirected from $1)',
-'redirectpagesub'   => 'Redirect page',
-'talkpageheader'    => '-', # do not translate or duplicate this message to other languages
-'lastmodifiedat'    => 'This page was last modified on $1, at $2.',
-'viewcount'         => 'This page has been accessed {{PLURAL:$1|once|$1 times}}.',
-'protectedpage'     => 'Protected page',
-'jumpto'            => 'Jump to:',
-'jumptonavigation'  => 'navigation',
-'jumptosearch'      => 'search',
-'view-pool-error'   => 'Sorry, the servers are overloaded at the moment.
+'navigation-heading' => 'Navigation menu',
+'errorpagetitle'     => 'Error',
+'returnto'           => 'Return to $1.',
+'tagline'            => 'From {{SITENAME}}',
+'help'               => 'Help',
+'search'             => 'Search',
+'searchbutton'       => 'Search',
+'go'                 => 'Go',
+'searcharticle'      => 'Go',
+'history'            => 'Page history',
+'history_short'      => 'History',
+'updatedmarker'      => 'updated since my last visit',
+'printableversion'   => 'Printable version',
+'permalink'          => 'Permanent link',
+'print'              => 'Print',
+'view'               => 'View',
+'edit'               => 'Edit',
+'create'             => 'Create',
+'editthispage'       => 'Edit this page',
+'create-this-page'   => 'Create this page',
+'delete'             => 'Delete',
+'deletethispage'     => 'Delete this page',
+'undelete_short'     => 'Undelete {{PLURAL:$1|one edit|$1 edits}}',
+'viewdeleted_short'  => 'View {{PLURAL:$1|one deleted edit|$1 deleted edits}}',
+'protect'            => 'Protect',
+'protect_change'     => 'change',
+'protectthispage'    => 'Protect this page',
+'unprotect'          => 'Change protection',
+'unprotectthispage'  => 'Change protection of this page',
+'newpage'            => 'New page',
+'talkpage'           => 'Discuss this page',
+'talkpagelinktext'   => 'Talk',
+'specialpage'        => 'Special page',
+'personaltools'      => 'Personal tools',
+'postcomment'        => 'New section',
+'addsection'         => '+', # do not translate or duplicate this message to other languages
+'articlepage'        => 'View content page',
+'talk'               => 'Discussion',
+'views'              => 'Views',
+'toolbox'            => 'Toolbox',
+'userpage'           => 'View user page',
+'projectpage'        => 'View project page',
+'imagepage'          => 'View file page',
+'mediawikipage'      => 'View message page',
+'templatepage'       => 'View template page',
+'viewhelppage'       => 'View help page',
+'categorypage'       => 'View category page',
+'viewtalkpage'       => 'View discussion',
+'otherlanguages'     => 'In other languages',
+'redirectedfrom'     => '(Redirected from $1)',
+'redirectpagesub'    => 'Redirect page',
+'talkpageheader'     => '-', # do not translate or duplicate this message to other languages
+'lastmodifiedat'     => 'This page was last modified on $1, at $2.',
+'viewcount'          => 'This page has been accessed {{PLURAL:$1|once|$1 times}}.',
+'protectedpage'      => 'Protected page',
+'jumpto'             => 'Jump to:',
+'jumptonavigation'   => 'navigation',
+'jumptosearch'       => 'search',
+'view-pool-error'    => 'Sorry, the servers are overloaded at the moment.
 Too many users are trying to view this page.
 Please wait a while before you try to access this page again.
 
 $1',
-'pool-timeout'      => 'Timeout waiting for the lock',
-'pool-queuefull'    => 'Pool queue is full',
-'pool-errorunknown' => 'Unknown error',
+'pool-timeout'       => 'Timeout waiting for the lock',
+'pool-queuefull'     => 'Pool queue is full',
+'pool-errorunknown'  => 'Unknown error',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite'            => 'About {{SITENAME}}',
@@ -913,8 +913,8 @@ See [[Special:Version|version page]].',
 '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"
+'newmessageslinkplural'        => '{{PLURAL:$1|a new message|new messages}}',
+'newmessagesdifflinkplural'    => 'last {{PLURAL:$1|change|changes}}',
 'youhavenewmessagesmulti'      => 'You have new messages on $1',
 'newtalkseparator'             => ',&#32;', # do not translate or duplicate this message to other languages
 'editsection'                  => 'edit',
@@ -1033,7 +1033,7 @@ Query: $2',
 '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.',
+'protectedpagetext'             => 'This page has been protected to prevent editing or other actions.',
 'viewsourcetext'                => 'You can view and copy the source of this page:',
 'viewyourtext'                  => "You can view and copy the source of '''your edits''' to this page:",
 'protectedinterface'            => 'This page provides interface text for the software on this wiki, and is protected to prevent abuse.
@@ -1066,10 +1066,10 @@ The administrator who locked it offered this explanation: "$3".',
 # Login and logout pages
 'logouttext'                 => "'''You are now logged out.'''
 
-You can continue to use {{SITENAME}} anonymously, or you can [[Special:UserLogin|log in again]] as the same or as a different user.
+You can continue to use {{SITENAME}} anonymously, or you can <span class='plainlinks'>[$1 log in again]</span> as the same or as a different user.
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomecreation'            => '== Welcome, $1! ==
-Your account has been created.
+'welcomeuser'                => 'Welcome, $1!',
+'welcomecreation-msg'        => 'Your account has been created.
 Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'yourname'                   => 'Username:',
 'yourpassword'               => 'Password:',
@@ -1394,7 +1394,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'                 => 'Go to editing area',
 '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.
@@ -1485,6 +1485,15 @@ It already exists.',
 'addsection-preload'               => '', # do not translate or duplicate this message to other languages
 'addsection-editintro'             => '', # do not translate or duplicate this message to other languages
 'defaultmessagetext'               => 'Default message text',
+'content-failed-to-parse'          => 'Failed to parse $2 content for $1 model: $3',
+'invalid-content-data'             => 'Invalid content data',
+'content-not-allowed-here'         => '"$1" content is not allowed on page [[$2]]',
+
+# Content models
+'content-model-wikitext'   => 'wikitext',
+'content-model-text'       => 'plain text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css'        => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning'        => "'''Warning:''' This page contains too many expensive parser function calls.
@@ -1752,8 +1761,6 @@ Details can be found in the [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENA
 'search-interwiki-default'         => '$1 results:',
 'search-interwiki-custom'          => '', # do not translate or duplicate this message to other languages
 'search-interwiki-more'            => '(more)',
-'search-mwsuggest-enabled'         => 'with suggestions',
-'search-mwsuggest-disabled'        => 'no suggestions',
 'search-relatedarticle'            => 'Related',
 'mwsuggest-disable'                => 'Disable AJAX suggestions',
 'searcheverything-enable'          => 'Search in all namespaces',
@@ -1806,7 +1813,7 @@ Note that their indexes of {{SITENAME}} content may be out of date.',
 # Preferences page
 'preferences'                   => 'Preferences',
 'preferences-summary'           => '', # do not translate or duplicate this message to other languages
-'mypreferences'                 => 'My preferences',
+'mypreferences'                 => 'Preferences',
 'prefs-edits'                   => 'Number of edits:',
 'prefsnologin'                  => 'Not logged in',
 'prefsnologintext'              => 'You must be <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} logged in]</span> to set user preferences.',
@@ -1942,6 +1949,7 @@ Your e-mail address is not revealed when other users contact you.',
 'saveusergroups'                 => 'Save user groups',
 'userrights-groupsmember'        => 'Member of:',
 'userrights-groupsmember-auto'   => 'Implicit member of:',
+'userrights-groupsmember-type'   => '$1', # only translate this message to other languages if you have to change it
 'userrights-groups-help'         => 'You may alter the groups this user is in:
 * A checked box means the user is in that group.
 * An unchecked box means the user is not in that group.
@@ -2042,11 +2050,14 @@ Your e-mail address is not revealed when other users contact you.',
 'right-passwordreset'         => 'View password reset e-mails',
 
 # User rights log
-'rightslog'                  => 'User rights log',
-'rightslogtext'              => 'This is a log of changes to user rights.',
-'rightslogentry'             => 'changed group membership for $1 from $2 to $3',
-'rightslogentry-autopromote' => 'was automatically promoted from $2 to $3',
-'rightsnone'                 => '(none)',
+'rightslog'                     => 'User rights log',
+'rightslogtext'                 => 'This is a log of changes to user rights.',
+'rightslogentry'                => 'changed group membership for $1 from $2 to $3',
+'rightslogentry-autopromote'    => 'was automatically promoted from $2 to $3',
+'logentry-rights-rights'        => '$1 changed group membership for $3 from $4 to $5',
+'logentry-rights-rights-legacy' => '$1 changed group membership for $3',
+'logentry-rights-autopromote'   => '$1 was automatically promoted from $4 to $5',
+'rightsnone'                    => '(none)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read'                 => 'read this page',
@@ -2206,16 +2217,16 @@ 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 <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 <strong>[[:$1]]</strong>, but no file with this name currently exists.
+'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 <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]]
+[[$1|thumb]]',
+'fileexists-extension'        => 'A file with a similar name exists: [[$2|thumb]]
 * Name of the uploading file: <strong>[[:$1]]</strong>
 * Name of the existing file: <strong>[[:$2]]</strong>
-Please choose a different name.",
+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 <strong>[[:$1]]</strong>.
@@ -2305,6 +2316,7 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 '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-describe'      => 'Could not change metadata for 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".',
@@ -2460,7 +2472,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.',
+'upload-disallowed-here'            => 'You cannot overwrite this file.',
 
 # File reversion
 'filerevert'                => 'Revert $1',
@@ -2748,7 +2760,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: <code>$1</code> (do not add any of these in your search).',
+Supported protocols: <code>$1</code> (defaults to http:// if no protocol is specified).',
 'linksearch-line'    => '$1 is linked from $2',
 'linksearch-error'   => 'Wildcards may appear only at the start of the hostname.',
 
@@ -2794,38 +2806,38 @@ There may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] a
 'listgrouprights-removegroup-self-all' => 'Remove all groups from own account',
 
 # E-mail user
-'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}}',
+'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.
+'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 {{GENDER:$1|user}}.
 The e-mail address you entered in [[Special:Preferences|your user preferences]] will appear as the "From" address of the e-mail, so the recipient will be able to reply directly to you.',
-'usermailererror'      => 'Mail object returned error:',
-'defemailsubject'      => '{{SITENAME}} e-mail from user "$1"',
-'usermaildisabled'     => 'User e-mail disabled',
-'usermaildisabledtext' => 'You cannot send e-mail to other users on this wiki',
-'noemailtitle'         => 'No e-mail address',
-'noemailtext'          => 'This user has not specified a valid e-mail address.',
-'nowikiemailtitle'     => 'No e-mail allowed',
-'nowikiemailtext'      => 'This user has chosen not to receive e-mail from other users.',
-'emailnotarget'        => 'Non-existent or invalid username for recipient.',
-'emailtarget'          => 'Enter username of recipient',
-'emailusername'        => 'Username:',
-'emailusernamesubmit'  => 'Submit',
-'email-legend'         => 'Send an e-mail to another {{SITENAME}} user',
-'emailfrom'            => 'From:',
-'emailto'              => 'To:',
-'emailsubject'         => 'Subject:',
-'emailmessage'         => 'Message:',
-'emailsend'            => 'Send',
-'emailccme'            => 'E-mail me a copy of my message.',
-'emailccsubject'       => 'Copy of your message to $1: $2',
-'emailsent'            => 'E-mail sent',
-'emailsenttext'        => 'Your e-mail message has been sent.',
-'emailuserfooter'      => 'This e-mail was sent by $1 to $2 by the "E-mail user" function at {{SITENAME}}.',
+'usermailererror'          => 'Mail object returned error:',
+'defemailsubject'          => '{{SITENAME}} e-mail from user "$1"',
+'usermaildisabled'         => 'User e-mail disabled',
+'usermaildisabledtext'     => 'You cannot send e-mail to other users on this wiki',
+'noemailtitle'             => 'No e-mail address',
+'noemailtext'              => 'This user has not specified a valid e-mail address.',
+'nowikiemailtitle'         => 'No e-mail allowed',
+'nowikiemailtext'          => 'This user has chosen not to receive e-mail from other users.',
+'emailnotarget'            => 'Non-existent or invalid username for recipient.',
+'emailtarget'              => 'Enter username of recipient',
+'emailusername'            => 'Username:',
+'emailusernamesubmit'      => 'Submit',
+'email-legend'             => 'Send an e-mail to another {{SITENAME}} user',
+'emailfrom'                => 'From:',
+'emailto'                  => 'To:',
+'emailsubject'             => 'Subject:',
+'emailmessage'             => 'Message:',
+'emailsend'                => 'Send',
+'emailccme'                => 'E-mail me a copy of my message.',
+'emailccsubject'           => 'Copy of your message to $1: $2',
+'emailsent'                => 'E-mail sent',
+'emailsenttext'            => 'Your e-mail message has been sent.',
+'emailuserfooter'          => 'This e-mail was sent by $1 to $2 by the "E-mail user" function at {{SITENAME}}.',
 
 # User Messenger
 'usermessage-summary'  => 'Leaving system message.',
@@ -2835,7 +2847,7 @@ The e-mail address you entered in [[Special:Preferences|your user preferences]]
 # Watchlist
 'watchlist'            => 'My watchlist',
 'watchlist-summary'    => '', # do not translate or duplicate this message to other languages
-'mywatchlist'          => 'My watchlist',
+'mywatchlist'          => 'Watchlist',
 'watchlistfor2'        => 'For $1 $2',
 'nowatchlist'          => 'You have no items on your watchlist.',
 'watchlistanontext'    => 'Please $1 to view or edit items on your watchlist.',
@@ -2871,20 +2883,23 @@ Future changes to this page and its associated talk page will be listed there, a
 
 'enotif_mailer'                => '{{SITENAME}} notification mailer',
 'enotif_reset'                 => 'Mark all pages visited',
-'enotif_newpagetext'           => 'This is a new page.',
 'enotif_impersonal_salutation' => '{{SITENAME}} user',
-'changed'                      => 'changed',
-'created'                      => 'created',
-'enotif_subject'               => '{{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED by $PAGEEDITOR',
+'enotif_subject_deleted'       => '{{SITENAME}} page $1 has been deleted by {{gender:$2|$2}}',
+'enotif_subject_created'       => '{{SITENAME}} page $1 has been created by {{gender:$2|$2}}',
+'enotif_subject_moved'         => '{{SITENAME}} page $1 has been moved by {{gender:$2|$2}}',
+'enotif_subject_restored'      => '{{SITENAME}} page $1 has been restored by {{gender:$2|$2}}',
+'enotif_subject_changed'       => '{{SITENAME}} page $1 has been changed by {{gender:$2|$2}}',
+'enotif_body_intro_deleted'    => 'The {{SITENAME}} page $1 has been deleted on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
+'enotif_body_intro_created'    => 'The {{SITENAME}} page $1 has been created on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
+'enotif_body_intro_moved'      => 'The {{SITENAME}} page $1 has been moved on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
+'enotif_body_intro_restored'   => 'The {{SITENAME}} page $1 has been restored on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
+'enotif_body_intro_changed'    => 'The {{SITENAME}} page $1 has been changed on $PAGEEDITDATE by {{gender:$2|$2}}, see $3 for the current revision.',
 'enotif_lastvisited'           => 'See $1 for all changes since your last visit.',
 'enotif_lastdiff'              => 'See $1 to view this change.',
 'enotif_anon_editor'           => 'anonymous user $1',
 'enotif_body'                  => 'Dear $WATCHINGUSERNAME,
 
-
-The {{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED on $PAGEEDITDATE by $PAGEEDITOR, see $PAGETITLE_URL for the current revision.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Editor\'s summary: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2892,8 +2907,7 @@ Contact the editor:
 mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-There will be no other notifications in case of further changes unless you visit this page.
-You could also reset the notification flags for all your watched pages on your watchlist.
+There will be no other notifications in case of further changes unless you visit this page. You could also reset the notification flags for all your watched pages on your watchlist.
 
                         Your friendly {{SITENAME}} notification system
 
@@ -3068,8 +3082,8 @@ You may have a bad link, or the revision may have been restored or removed from
 'undeletedrevisions'           => '{{PLURAL:$1|1 revision|$1 revisions}} restored',
 'undeletedrevisions-files'     => '{{PLURAL:$1|1 revision|$1 revisions}} and {{PLURAL:$2|1 file|$2 files}} restored',
 'undeletedfiles'               => '{{PLURAL:$1|1 file|$1 files}} restored',
-'cannotundelete'               => 'Undelete failed;
-someone else may have undeleted the page first.',
+'cannotundelete'               => 'Undelete failed:
+$1',
 'undeletedpage'                => "'''$1 has been restored'''
 
 Consult the [[Special:Log/delete|deletion log]] for a record of recent deletions and restorations.",
@@ -3102,10 +3116,10 @@ $1',
 'blanknamespace'                => '(Main)',
 
 # Contributions
-'contributions'         => 'User contributions',
+'contributions'         => '{{GENDER:$1|User}} contributions',
 'contributions-summary' => '', # do not translate or duplicate this message to other languages
 'contributions-title'   => 'User contributions for $1',
-'mycontris'             => 'My contributions',
+'mycontris'             => 'Contributions',
 'contribsub2'           => 'For $1 ($2)',
 'nocontribs'            => 'No changes were found matching these criteria.',
 'uctop'                 => '(top)',
@@ -3151,7 +3165,7 @@ The latest block log entry is provided below for reference:',
 'whatlinkshere-hideredirs' => '$1 redirects',
 'whatlinkshere-hidetrans'  => '$1 transclusions',
 'whatlinkshere-hidelinks'  => '$1 links',
-'whatlinkshere-hideimages' => '$1 image links',
+'whatlinkshere-hideimages' => '$1 file links',
 'whatlinkshere-filters'    => 'Filters',
 
 # Block/unblock
@@ -3391,6 +3405,7 @@ cannot move a page over itself.',
 'immobile-target-namespace-iw' => 'Interwiki link is not a valid target for page move.',
 'immobile-source-page'         => 'This page is not movable.',
 'immobile-target-page'         => 'Cannot move to that destination title.',
+'bad-target-model'             => 'The desired destination uses a different content model. Can not convert from $1 to $2.',
 'imagenocrossnamespace'        => 'Cannot move file to non-file namespace',
 'nonfile-cannot-move-to-file'  => 'Cannot move non-file to file namespace',
 'imagetypemismatch'            => 'The new file extension does not match its type',
@@ -3524,7 +3539,6 @@ Please try again.',
 # JavaScriptTest
 'javascripttest'                           => 'JavaScript testing',
 'javascripttest-backlink'                  => '< $1', # do not translate or duplicate this message to other languages
-'javascripttest-disabled'                  => 'This function has not been enabled on this wiki.',
 'javascripttest-title'                     => 'Running $1 tests',
 'javascripttest-pagetext-noframework'      => 'This page is reserved for running JavaScript tests.',
 'javascripttest-pagetext-unknownframework' => 'Unknown testing framework "$1".',
@@ -3679,7 +3693,7 @@ You can view its source',
 'standard.css'            => '/* CSS placed here will affect users of the Standard skin */', # only translate this message to other languages if you have to change it
 'nostalgia.css'           => '/* CSS placed here will affect users of the Nostalgia skin */', # only translate this message to other languages if you have to change it
 'cologneblue.css'         => '/* CSS placed here will affect users of the Cologne Blue skin */', # only translate this message to other languages if you have to change it
-'monobook.css'            => '/* CSS placed here will affect users of the Monobook skin */', # only translate this message to other languages if you have to change it
+'monobook.css'            => '/* CSS placed here will affect users of the MonoBook skin */', # only translate this message to other languages if you have to change it
 'myskin.css'              => '/* CSS placed here will affect users of the MySkin skin */', # only translate this message to other languages if you have to change it
 'chick.css'               => '/* CSS placed here will affect users of the Chick skin */', # only translate this message to other languages if you have to change it
 'simple.css'              => '/* CSS placed here will affect users of the Simple skin */', # only translate this message to other languages if you have to change it
@@ -3735,38 +3749,47 @@ This is probably caused by a link to a blacklisted external site.',
 'spam_deleting'       => 'All revisions contained links to $1, deleting',
 
 # Info page
-'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 ({{lcfirst:$1}})',
-'pageinfo-magic-words'         => 'Magic {{PLURAL:$1|word|words}} ($1)',
-'pageinfo-hidden-categories'   => 'Hidden {{PLURAL:$1|category|categories}} ($1)',
-'pageinfo-templates'           => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
-'pageinfo-footer'              => '-', # do not translate or duplicate this message to other languages
+'pageinfo-header'                 => '-', # do not translate or duplicate this message to other languages
+'pageinfo-title'                  => 'Information for "$1"',
+'pageinfo-not-current'            => "Sorry, it's impossible to provide this information for old revisions.",
+'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-language'               => 'Page content language',
+'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', # only translate this message to other languages if you have to change it
+'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-magic-words'            => 'Magic {{PLURAL:$1|word|words}} ($1)',
+'pageinfo-hidden-categories'      => 'Hidden {{PLURAL:$1|category|categories}} ($1)',
+'pageinfo-templates'              => 'Transcluded {{PLURAL:$1|template|templates}} ($1)',
+'pageinfo-footer'                 => '-', # do not translate or duplicate this message to other languages
+'pageinfo-toolboxlink'            => 'Page information',
+'pageinfo-redirectsto'            => 'Redirects to',
+'pageinfo-redirectsto-info'       => 'info',
+'pageinfo-contentpage'            => 'Counted as a content page',
+'pageinfo-contentpage-yes'        => 'Yes',
+'pageinfo-protect-cascading'      => 'Protections are cascading from here',
+'pageinfo-protect-cascading-yes'  => 'Yes',
+'pageinfo-protect-cascading-from' => 'Protections are cascading from',
 
 # Skin names
 'skinname-standard'    => 'Classic', # only translate this message to other languages if you have to change it
@@ -3790,6 +3813,8 @@ This is probably caused by a link to a blacklisted external site.',
 'markedaspatrollederror'              => 'Cannot mark as patrolled',
 'markedaspatrollederrortext'          => 'You need to specify a revision to mark as patrolled.',
 'markedaspatrollederror-noautopatrol' => 'You are not allowed to mark your own changes as patrolled.',
+'markedaspatrollednotify'             => 'This change to $1 has been marked as patrolled.',
+'markedaspatrollederrornotify'        => 'Marking as patrolled failed.',
 
 # Patrol log
 'patrol-log-page'      => 'Patrol log',
@@ -3812,29 +3837,30 @@ $1',
 'nextdiff'     => 'Newer edit →',
 
 # Media information
-'mediawarning'           => "'''Warning''': This file type may contain malicious code.
+'mediawarning'                => "'''Warning''': This file type may contain malicious code.
 By executing it, your system may be compromised.",
-'imagemaxsize'           => "Image size limit:<br />''(for file description pages)''",
-'thumbsize'              => 'Thumbnail size:',
-'widthheight'            => '$1 × $2', # only translate this message to other languages if you have to change it
-'widthheightpage'        => '$1 × $2, $3 {{PLURAL:$3|page|pages}}',
-'file-info'              => 'file size: $1, MIME type: $2',
-'file-info-size'         => '$1 × $2 pixels, file size: $3, MIME type: $4',
-'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.',
-'show-big-image-size'    => '$1 × $2 pixels',
-'file-info-gif-looped'   => 'looped',
-'file-info-gif-frames'   => '$1 {{PLURAL:$1|frame|frames}}',
-'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.\'\'\'',
+'imagemaxsize'                => "Image size limit:<br />''(for file description pages)''",
+'thumbsize'                   => 'Thumbnail size:',
+'widthheight'                 => '$1 × $2', # only translate this message to other languages if you have to change it
+'widthheightpage'             => '$1 × $2, $3 {{PLURAL:$3|page|pages}}',
+'file-info'                   => 'file size: $1, MIME type: $2',
+'file-info-size'              => '$1 × $2 pixels, file size: $3, MIME type: $4',
+'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',
+'svg-long-error'              => 'Invalid SVG file: $1',
+'show-big-image'              => 'Full resolution',
+'show-big-image-preview'      => 'Size of this preview: $1.',
+'show-big-image-other'        => 'Other {{PLURAL:$2|resolution|resolutions}}: $1.',
+'show-big-image-size'         => '$1 × $2 pixels',
+'file-info-gif-looped'        => 'looped',
+'file-info-gif-frames'        => '$1 {{PLURAL:$1|frame|frames}}',
+'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',
@@ -3850,15 +3876,16 @@ By executing it, your system may be compromised.",
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims'     => '$1, $2 × $3', # only translate this message to other languages if you have to change it
-'seconds-abbrev' => '$1s', # only translate this message to other languages if you have to change it
-'minutes-abbrev' => '$1m', # only translate this message to other languages if you have to change it
-'hours-abbrev'   => '$1h', # only translate this message to other languages if you have to change it
-'days-abbrev'    => '$1d', # only translate this message to other languages if you have to change it
+'seconds-abbrev' => '$1 s', # only translate this message to other languages if you have to change it
+'minutes-abbrev' => '$1 min', # only translate this message to other languages if you have to change it
+'hours-abbrev'   => '$1 h', # only translate this message to other languages if you have to change it
+'days-abbrev'    => '$1 d', # only translate this message to other languages if you have to change it
 'seconds'        => '{{PLURAL:$1|$1 second|$1 seconds}}',
 'minutes'        => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours'          => '{{PLURAL:$1|$1 hour|$1 hours}}',
 'days'           => '{{PLURAL:$1|$1 day|$1 days}}',
 'ago'            => '$1 ago',
+'just-now'       => 'just now',
 
 # Bad image list
 'bad_image_list' => 'The format is as follows:
@@ -4461,9 +4488,10 @@ This confirmation code will expire at $4.',
 'invalidateemail'           => 'Cancel e-mail confirmation',
 
 # Scary transclusion
-'scarytranscludedisabled' => '[Interwiki transcluding is disabled]',
-'scarytranscludefailed'   => '[Template fetch failed for $1]',
-'scarytranscludetoolong'  => '[URL is too long]',
+'scarytranscludedisabled'          => '[Interwiki transcluding is disabled]',
+'scarytranscludefailed'            => '[Template fetch failed for $1]',
+'scarytranscludefailed-httpstatus' => '[Template fetch failed for $1: HTTP $2]',
+'scarytranscludetoolong'           => '[URL is too long]',
 
 # Delete conflict
 'deletedwhileediting'      => "'''Warning''': This page was deleted after you started editing!",
@@ -4697,7 +4725,8 @@ You can also [[Special:EditWatchlist|use the standard editor]].',
 '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-poweredby-others'              => 'others',
+'version-credits-summary'               => 'We would like to recognize the following persons for their contribution to [[Special:Version|MediaWiki]].',
 'version-license-info'                  => 'MediaWiki is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
 
 MediaWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
@@ -4845,10 +4874,10 @@ This site is experiencing technical difficulties.',
 'logentry-move-move_redir-noredirect' => '$1 moved page $3 to $4 over a redirect without leaving a redirect',
 'logentry-patrol-patrol'              => '$1 marked revision $4 of page $3 patrolled',
 'logentry-patrol-patrol-auto'         => '$1 automatically marked revision $4 of page $3 patrolled',
-'logentry-newusers-newusers'          => '$1 created a user account',
-'logentry-newusers-create'            => '$1 created a user account',
-'logentry-newusers-create2'           => '$1 created a user account $3',
-'logentry-newusers-autocreate'        => 'Account $1 was created automatically',
+'logentry-newusers-newusers'          => 'User account $1 was created',
+'logentry-newusers-create'            => 'User account $1 was created',
+'logentry-newusers-create2'           => 'User account $3 was created by $1',
+'logentry-newusers-autocreate'        => 'User account $1 was created automatically',
 'newuserlog-byemail'                  => 'password sent by e-mail',
 
 # For IRC, see bug 34508. Do not change
@@ -4876,7 +4905,7 @@ This site is experiencing technical difficulties.',
 
 # Feedback
 'feedback-bugornote' => 'If you are ready to describe a technical problem in detail please [$1 report a bug].
-Otherwise, you can use the easy form below. Your comment will be added to the page "[$3 $2]", along with your username and what browser you are using.',
+Otherwise, you can use the easy form below. Your comment will be added to the page "[$3 $2]", along with your username.',
 'feedback-subject'   => 'Subject:',
 'feedback-message'   => 'Message:',
 'feedback-cancel'    => 'Cancel',
@@ -4890,6 +4919,10 @@ Otherwise, you can use the easy form below. Your comment will be added to the pa
 'feedback-bugcheck'  => 'Great! Just check that it is not already one of the [$1 known bugs].',
 'feedback-bugnew'    => 'I checked. Report a new bug',
 
+# Search suggestions
+'searchsuggest-search'     => 'Search',
+'searchsuggest-containing' => 'containing...',
+
 # API errors
 'api-error-badaccess-groups'              => 'You are not permitted to upload files to this wiki.',
 'api-error-badtoken'                      => 'Internal error: Bad token.',
index 3928e70..c38fd29 100644 (file)
@@ -25,23 +25,56 @@ $specialPageAliases = array(
 $messages = array(
 # User preference toggles
 '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-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-showjumplinks' => 'Enable ‘jump to’ accessibility links',
+
+# Categories related messages
+'category_header' => 'Pages in category ‘$1’',
+'category-media-header' => 'Media in category ‘$1’',
+
+'retrievedfrom' => 'Retrieved from ‘$1’',
+'page-rss-feed' => '‘$1’ RSS feed',
+'page-atom-feed' => '‘$1’ Atom feed',
 
 # General errors
+'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.
+The last attempted database query was:
+‘$1’
+from within function ‘$2.’
+Database returned error ‘$3: $4’',
 '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.',
+'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’.',
+'cannotdelete' => 'The page or file ‘$1’ could not be deleted.
+It may have already been deleted by someone else.',
+'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',
 
 # Miscellaneous special pages
-'uncategorizedpages'      => 'Uncategorised pages',
+'uncategorizedpages' => 'Uncategorised pages',
 'uncategorizedcategories' => 'Uncategorised categories',
-'uncategorizedimages'     => 'Uncategorised files',
-'uncategorizedtemplates'  => 'Uncategorised templates',
+'uncategorizedimages' => 'Uncategorised files',
+'uncategorizedtemplates' => 'Uncategorised templates',
 
 # Edit tokens
 'sessionfailure' => 'There seems to be a problem with your login session;
@@ -58,11 +91,11 @@ Fill in a specific reason below (for example, citing particular pages that were
 If the file has been modified from its original state, some details may not fully reflect the modified file.',
 
 # EXIF tags
-'exif-ycbcrcoefficients'   => 'Colour space transformation matrix coefficients',
-'exif-colorspace'          => 'Colour space',
-'exif-datetimedigitized'   => 'Date and time of digitising',
+'exif-ycbcrcoefficients' => 'Colour space transformation matrix coefficients',
+'exif-colorspace' => 'Colour space',
+'exif-datetimedigitized' => 'Date and time of digitising',
 'exif-subsectimedigitized' => 'DateTimeDigitised subseconds',
-'exif-exposureprogram'     => 'Exposure programme',
+'exif-exposureprogram' => 'Exposure programme',
 
 'exif-exposureprogram-2' => 'Normal programme',
 'exif-exposureprogram-5' => 'Creative programme (biased toward depth of field)',
index b01b0d9..2e2704d 100644 (file)
@@ -143,7 +143,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Lastaj_ŝanĝoj' ),
        'Recentchangeslinked'       => array( 'Rilataj_ŝanĝoj' ),
        'Revisiondelete'            => array( 'Forigi_revizion' ),
-       'RevisionMove'              => array( 'Movi_revizion' ),
        'Search'                    => array( 'Serĉi' ),
        'Shortpages'                => array( 'Mallongaj_paĝoj' ),
        'Specialpages'              => array( 'Specialaj_paĝoj' ),
@@ -181,7 +180,6 @@ $magicWords = array(
        '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' ),
@@ -360,7 +358,7 @@ $messages = array(
 
 'underline-always' => 'Ĉiam',
 'underline-never' => 'Neniam',
-'underline-default' => 'Defaŭlte laŭ foliumilo',
+'underline-default' => 'Pravaloro laŭ foliumilo',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Tipara stilo de redakta tekstujo',
@@ -445,8 +443,8 @@ $messages = array(
 'newwindow' => '(en nova fenestro)',
 'cancel' => 'Nuligi',
 'moredotdotdot' => 'Pli...',
-'mypage' => 'Mia paĝo',
-'mytalk' => 'Mia diskuto',
+'mypage' => 'Paĝo',
+'mytalk' => 'Diskuto',
 'anontalk' => 'Diskutpaĝo por tiu ĉi IP',
 'navigation' => 'Navigado',
 'and' => '&#32;kaj',
@@ -456,7 +454,6 @@ $messages = array(
 'qbbrowse' => 'Foliumi',
 'qbedit' => 'Redakti',
 'qbpageoptions' => 'Paĝagado',
-'qbpageinfo' => 'Paĝinformoj',
 'qbmyoptions' => 'Personaĵoj',
 'qbspecialpages' => 'Specialaj paĝoj',
 'faq' => 'Oftaj demandoj',
@@ -469,7 +466,7 @@ $messages = array(
 'vector-action-protect' => 'Protekti',
 'vector-action-undelete' => 'Malforigi',
 'vector-action-unprotect' => 'Ŝanĝi protekadon',
-'vector-simplesearch-preference' => 'Ebligi plibonigitajn serĉajn sugestojn (nur Vektora etoso)',
+'vector-simplesearch-preference' => 'Ebligi simpligitan serĉan strion (nur Vektora etoso)',
 'vector-view-create' => 'Krei',
 'vector-view-edit' => 'Redakti',
 'vector-view-history' => 'Vidi historion',
@@ -479,6 +476,7 @@ $messages = array(
 'namespaces' => 'Nomspacoj',
 'variants' => 'Variantoj',
 
+'navigation-heading' => 'Navigacia menuo',
 'errorpagetitle' => 'Eraro',
 'returnto' => 'Reiri al $1.',
 'tagline' => 'El {{SITENAME}}',
@@ -695,8 +693,9 @@ Peto: $2',
 'protectedpagetext' => 'Tiu ĉi paĝo estas ŝlosita por malebligi redaktadon.',
 'viewsourcetext' => 'Vi povas rigardi kaj kopii la fonton de la paĝo:',
 'viewyourtext' => "Vi povas vidi kaj kopii la fonton de '''viaj redaktoj''' al ĉi tiu paĝo:",
-'protectedinterface' => 'Ĉi tiu paĝo provizas interfacan tekston por la softvaro, kaj estas ŝlosita por malabeligi misuzon.',
-'editinginterface' => "'''Atentu:''' Vi redaktas paĝon, kiu estas uzata kiel interfaca teksto por la rogramaro. Ŝanĝoj de ĉi tiu teksto povas ŝanĝi aspekton de la interfaco por aliaj uzantoj. Por tradukojn, bonvolu uzi [//translatewiki.net/wiki/Main_Page?setlang=eo translatewiki.net], la MediaWiki-projekton por lingvigaj versioj.",
+'protectedinterface' => 'Ĉi tiu paĝo provizas interfacan tekston por la softvaro, kaj estas ŝlosita por malebligi misuzon.
+Por aldoni aŭ ŝanĝi tradukojn por ĉiuj vikioj, bonvolu uzi [//translatewiki.net/ translatewiki.net], la projekto por provizi tradukojn por MediaWiki.',
+'editinginterface' => "'''Atentu:''' Vi redaktas paĝon, kiu estas uzata kiel interfaca teksto por la programaro. Ŝanĝoj de ĉi tiu teksto povas ŝanĝi aspekton de la interfaco por aliaj uzantoj sur ĉi tiu vikio. Por aldoni aŭ ŝanĝi tradukojn, bonvolu uzi [//translatewiki.net/ translatewiki.net], la MediaWiki-projekton por lingvigaj versioj.",
 'sqlhidden' => '(SQL serĉomendo kaŝita)',
 'cascadeprotected' => 'Ĉi tiu paĝo estas protektita kontraŭ redaktado, ĉar ĝi estas inkludita en la {{PLURAL:$1|sekvan paĝon, kiu|sekvajn paĝojn, kiuj}} estas {{PLURAL:$1|protektata|protektataj}} kun la "kaskada" opcio turnita sur:
 $2',
@@ -722,11 +721,9 @@ La administranto kiu ŝlosis ĝin proponis tiun klarigon: "$3".',
 # Login and logout pages
 'logouttext' => "'''Vi nun estas elsalutita.'''
 
-Vi rajtas daŭre vikiumi sennome, aŭ vi povas [[Special:UserLogin|reensaluti]] kiel la sama aŭ kiel alia uzanto.
+Vi rajtas daŭre vikiumi sennome, aŭ vi povas <span class='plainlinks'>[$1 reensaluti]</span> kiel la sama aŭ kiel alia uzanto.
 Notu ke iuj paĝoj daŭre ŝajnos kvazaŭ vi ankoraŭ estas ensalutita, ĝis vi refreŝigu vian retumilan kaŝmemoron.",
-'welcomecreation' => '== Bonvenon, $1! ==
-Via konto estas kreita.
-Ne forgesu fari viajn [[Special:Preferences|{{SITENAME}}-preferojn]].',
+'welcomeuser' => 'Bonvenon, $1!',
 'yourname' => 'Salutnomo:',
 'yourpassword' => 'Pasvorto:',
 'yourpasswordagain' => 'Retajpu pasvorton',
@@ -980,7 +977,7 @@ Vi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝtitolon]] en aliaj pa
 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>.',
+aŭ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn]</span>, sed vi ne rajtas krei ĉi tiun paĝon.',
 '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.
@@ -995,7 +992,7 @@ La lasta protokolero estas jene montrata por via referenco:',
 * '''Interreta Esplorilo''': Premu ''Stir'' klakante ''Refreŝu'', aŭ premu ''Stir-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.",
+'userjsyoucanpreview' => "'''Konsileto:''' Uzu la butonon \"{{int:showpreview}}\" por provi vian novan JS-kodon antaŭ konservado.",
 'usercsspreview' => "'''Notu ke vi nur antaŭvidas vian uzanto-CSS.
 Ĝi ne jam estis konservita!'''",
 'userjspreview' => "'''Memoru ke vi nun nur provas kaj antaŭrigardas vian uzantan javaskripton, ĝi ne estas jam konservita'''",
@@ -1008,7 +1005,7 @@ Rememoru ke individuaj .css-aj kaj .js-aj paĝoj uzas minusklan titolon, ekz. {{
 'note' => "'''Noto:'''",
 'previewnote' => "'''Memoru, ke ĉi tio estas nur antaŭrigardo.''' 
 Viaj ŝanĝoj ne ankoraŭ estas konservitaj!",
-'continue-editing' => 'Redaktu plu',
+'continue-editing' => 'Iru al redakta spaco',
 'previewconflict' => 'La jena antaŭrigardo montras la tekston el la supra tekstujo,
 kiel ĝi aperos se vi elektos konservi la paĝon.',
 'session_fail_preview' => "'''Ni ne povas procezi vian redakton pro perdo de seancaj datenoj.
@@ -1090,6 +1087,14 @@ Verŝajne ĝi estis forigita.',
 'edit-already-exists' => 'Ne eblis krei novan paĝon.
 Ĝi jam ekzistas.',
 'defaultmessagetext' => 'Defaŭlta teksto',
+'invalid-content-data' => 'Enhavo estas malvalida',
+'content-not-allowed-here' => 'Enhavo de $1 ne estas permesita en paĝo [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'vikiteksto',
+'content-model-text' => 'ordinara teksto',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Averto: Ĉi tiu paĝo enhavas tro da multekostaj sintaksaj funkcio-vokoj.
@@ -1246,8 +1251,9 @@ Bonvolu kontroli la protokolojn.',
 'revdelete-only-restricted' => 'Eraro kaŝante la aĵon de $2, $1: Vi ne povas subpremi aĵojn de vido de administrantoj sen ankaŭ selektante unu el la aliaj subpremo-opcioj.',
 'revdelete-reason-dropdown' => '*Oftaj kialoj por forigado
 ** Aŭtorrajta neglekto
-** Maltaŭga persona informo
-** Eventualaj malhonorigaj informoj',
+** Maltaŭga komento aŭ persona informo
+** Nekonvena uzantnomo
+** Eventuale kalumnaj informoj',
 'revdelete-otherreason' => 'Alia/aldona kialo:',
 'revdelete-reasonotherlist' => 'Alia kialo',
 'revdelete-edit-reasonlist' => 'Redakti kialojn por forigo',
@@ -1344,8 +1350,6 @@ Detaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'search-interwiki-caption' => 'Kunprojektoj',
 'search-interwiki-default' => '$1 rezultoj:',
 'search-interwiki-more' => '(plu)',
-'search-mwsuggest-enabled' => 'kun sugestoj',
-'search-mwsuggest-disabled' => 'sen sugestoj',
 'search-relatedarticle' => 'Relataj',
 'mwsuggest-disable' => 'Malŝalti AJAX-sugestojn',
 'searcheverything-enable' => 'Traserĉi ĉiujn nomspacojn',
@@ -1380,7 +1384,7 @@ indekso pro troŝarĝita servilo. Intertempe, vi povas serĉi per <i>guglo</i> a
 
 # Preferences page
 'preferences' => 'Preferoj',
-'mypreferences' => 'Miaj preferoj',
+'mypreferences' => 'Preferoj',
 'prefs-edits' => 'Nombro de redaktoj:',
 'prefsnologin' => 'Ne jam salutis!',
 'prefsnologintext' => 'Vi devas esti <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ensalutita]</span> por fari viajn preferojn.',
@@ -1443,7 +1447,7 @@ Jen hazarde generita valoro por via uzo: $1',
 'timezoneregion-indian' => 'Hinda Oceano',
 'timezoneregion-pacific' => 'Pacifiko',
 'allowemail' => 'Rajtigi retmesaĝojn de aliaj uzantoj',
-'prefs-searchoptions' => 'Serĉaj opcioj',
+'prefs-searchoptions' => 'Serĉu',
 'prefs-namespaces' => 'Nomspacoj',
 'defaultns' => 'Alimaniere, traserĉi la jenajn nomspacojn:',
 'default' => 'defaŭlte',
@@ -1611,6 +1615,8 @@ Jen hazarde generita valoro por via uzo: $1',
 'rightslogtext' => 'Ĉi tio estas protokolo pri la ŝanĝoj de uzantorajtoj.',
 'rightslogentry' => 'ŝanĝis grupan membrecon por $1 de $2 al $3',
 'rightslogentry-autopromote' => 'estis aŭtomate altrangigita de $2 al $3',
+'logentry-rights-rights' => '$1 ŝanĝis grupan membrecon por $3 de $4 al $5',
+'logentry-rights-rights-legacy' => '$1 ŝanĝis grupan membrecon por $3',
 'rightsnone' => '(nenia)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1854,7 +1860,7 @@ Se la problemo kontinuas, kontaku [[Special:ListUsers/sysop|sisteman administran
 '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.',
+'backend-fail-usable' => 'Ne eblis legi aŭ 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".',
@@ -1986,7 +1992,7 @@ Eble vi volas redakti la priskribon ĉe ties [$2 dosier-priskriba paĝo].',
 '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.',
+'upload-disallowed-here' => 'Vi ne povas superskribi ĉi tiun bildon.',
 
 # File reversion
 'filerevert' => 'Restarigi $1',
@@ -2094,6 +2100,7 @@ Paĝo estas traktata kiel apartigilo se ĝi uzas ŝablonon kiu estas ligita de [
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bitoko|bitokoj}}',
 'ncategories' => '{{PLURAL:$1|unu kategorio|$1 kategorioj}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interlingva ligilo|interlingvaj ligiloj}}',
 'nlinks' => '$1 {{PLURAL:$1|ligilo|ligiloj}}',
 'nmembers' => '{{PLURAL:$1|unu membro|$1 membroj}}',
 'nrevisions' => '$1 {{PLURAL:$1|versio|versioj}}',
@@ -2122,6 +2129,7 @@ Paĝo estas traktata kiel apartigilo se ĝi uzas ŝablonon kiu estas ligita de [
 'mostlinkedtemplates' => 'Plej ligitaj ŝablonoj',
 'mostcategories' => 'Artikoloj kun la plej multaj kategorioj',
 'mostimages' => 'Plej ligitaj bildoj',
+'mostinterwikis' => 'Artikoloj kun la plej multaj interlingvaj ligiloj',
 'mostrevisions' => 'Artikoloj kun la plej multaj versioj',
 'prefixindex' => 'Ĉiuj paĝoj kun prefikso',
 'prefixindex-namespace' => 'Ĉiuj paĝoj kun prefikso ($1 nomspaco)',
@@ -2272,7 +2280,7 @@ Estas [[{{MediaWiki:Listgrouprights-helppage}}|aldona informo]] pri individuaj r
 '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.
+'emailpagetext' => 'Vi povas uzi la jenan paĝon por sendi retpoŝtan mesaĝon al ĉi tiu {{GENDER:$1|uzanto|uzantino}}.
 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.',
 'usermailererror' => 'Resendita retmesaĝa erarsubjekto:',
 'defemailsubject' => '{{SITENAME}} retmesaĝo de uzanto "$1"',
@@ -2339,11 +2347,7 @@ La retadreso kiun vi enigis en [[Special:Preferences|viaj preferoj]] aperos kiel
 
 'enotif_mailer' => 'Averta retmesaĝo de {{SITENAME}}',
 'enotif_reset' => 'Marki ĉiujn paĝojn vizititaj',
-'enotif_newpagetext' => 'Tiu ĉi estas nova paĝo',
 'enotif_impersonal_salutation' => 'Uzanto de {{SITENAME}}',
-'changed' => 'ŝanĝita',
-'created' => 'kreita',
-'enotif_subject' => 'la paĝo $PAGETITLE de {{SITENAME}} estis $CHANGEDORCREATED de $PAGEEDITOR',
 'enotif_lastvisited' => 'Vidi $1 por ĉiuj ŝanĝoj de post via lasta vizito.',
 'enotif_lastdiff' => 'Vidi $1 por rigardi ĉi tiun ŝanĝon.',
 'enotif_anon_editor' => 'anonima uzanto $1',
@@ -2523,7 +2527,8 @@ Vi verŝajne havas malbonan ligilon, aŭ la revizio eble estis restarigita aŭ f
 'undeletedrevisions' => '{{PLURAL:$1|1 versio restarigita|$1 versioj restarigitaj}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 versio|$1 versioj}} kaj {{PLURAL:$2|1 dosiero|$2 dosieroj}} restarigitaj',
 'undeletedfiles' => '{{PLURAL:$1|1 dosiero restarigita|$1 dosieroj restarigitaj}}',
-'cannotundelete' => 'Restarigo malsukcesis; iu eble restarigis la paĝon antaŭe.',
+'cannotundelete' => 'Restarigo malsukcesis: 
+$1',
 'undeletedpage' => "'''$1 estis restarigita'''
 
 Konsultu la [[Special:Log/delete|deletion log]] por protokolo pri la lastatempaj forigoj kaj restarigoj.",
@@ -2557,7 +2562,7 @@ $1',
 # Contributions
 'contributions' => 'Kontribuoj de uzanto',
 'contributions-title' => 'Kontribuoj de uzanto $1',
-'mycontris' => 'Miaj kontribuoj',
+'mycontris' => 'Kontribuoj',
 'contribsub2' => 'De $1 ($2)',
 'nocontribs' => 'Trovis neniajn redaktojn laŭ tiu kriterio.',
 'uctop' => ' (lasta)',
@@ -2954,7 +2959,6 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 
 # JavaScriptTest
 '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".',
@@ -3094,18 +3098,43 @@ Datoj de versioj kaj nomoj de redaktantoj estos preservitaj.
 
 # Info page
 'pageinfo-title' => 'Informoj por "$1"',
+'pageinfo-not-current' => 'Informoj povas esti montritaj nur por la nuna versio',
 'pageinfo-header-basic' => 'Baza informo',
 'pageinfo-header-edits' => 'Historio de redaktoj',
+'pageinfo-header-restrictions' => 'Protektado de la paĝo',
+'pageinfo-header-properties' => 'Ecoj de la paĝo',
+'pageinfo-display-title' => 'Montrita titolo',
+'pageinfo-default-sort' => 'Pravaloro de ordiga ŝlosilo',
+'pageinfo-length' => 'Paĝgrandeco (en bajtoj)',
 'pageinfo-article-id' => 'Paĝa identigo',
+'pageinfo-language' => 'Lingvo de paĝa enhavo',
+'pageinfo-robot-policy' => 'Statuso de la serĉilo',
 'pageinfo-robot-index' => 'Indeksebla',
 'pageinfo-robot-noindex' => 'Ne indeksebla',
 'pageinfo-views' => 'Nombro de rigardoj',
 'pageinfo-watchers' => 'Nombro de paĝatentantoj',
-'pageinfo-lastuser' => 'Lasta redaktoro',
+'pageinfo-redirects-name' => 'Alidirektoj al ĉi tiu paĝo',
+'pageinfo-subpages-name' => 'Subpaĝoj de ĉi tiu paĝo',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|alidirektilo|alidirektiloj}}; $3 {{PLURAL:$3|ne-alidirektilo|ne-alidirektiloj}})',
+'pageinfo-firstuser' => 'Kreinto de la paĝo',
+'pageinfo-firsttime' => 'Dato de paĝkreado',
+'pageinfo-lastuser' => 'Lasta redaktinto',
 'pageinfo-lasttime' => 'Dato de lasta redakto',
-'pageinfo-edits' => 'Tuta nombro de redaktoj',
-'pageinfo-authors' => 'Tuta nombro de malsamaj aŭtoroj',
+'pageinfo-edits' => 'Suma nombro de redaktoj',
+'pageinfo-authors' => 'Suma nombro de malsamaj aŭtoroj',
+'pageinfo-recent-edits' => 'Nombro da lastaj redaktoj (ene de lastaj $1)',
 'pageinfo-recent-authors' => 'Lasta nombro de malsamaj aŭtoroj',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magia vorto|Magiaj vortoj}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Kaŝita kategorio|Kaŝitaj kategorioj}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Inkluzivita ŝablono|Inkluzivitaj ŝablonoj}} ($1)',
+'pageinfo-toolboxlink' => 'Informoj pri la paĝo',
+'pageinfo-redirectsto' => 'Alidirektas al',
+'pageinfo-redirectsto-info' => 'Informo',
+'pageinfo-contentpage' => 'Kalkulita kiel entenopaĝo',
+'pageinfo-contentpage-yes' => 'Jes',
+'pageinfo-protect-cascading' => 'Protektado kaskade fontas el ĉi tie',
+'pageinfo-protect-cascading-yes' => 'Jes',
+'pageinfo-protect-cascading-from' => 'Protektado kaskade fontas el',
 
 # Skin names
 'skinname-standard' => 'Klasiko',
@@ -3159,6 +3188,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 rastrumeroj, dosiera grandeco: $3, MIME-tipo: $4, $5 {{PLURAL:$5|paĝo|paĝoj}}',
 'file-nohires' => 'Nenia pli granda distingivo havebla.',
 'svg-long-desc' => 'SVG-dosiero, $1 × $2 rastrumeroj, grandeco de dosiero: $3',
+'svg-long-desc-animated' => 'Animata SVG-dosiero, $1 × $2 rastrumeroj, grandeco de dosiero: $3',
 'show-big-image' => 'Plena distingivo',
 'show-big-image-preview' => 'Grandeco de ĉi antaŭvido: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Alia distingivo|Aliaj distingivoj}}: $1.',
@@ -3168,6 +3198,8 @@ $1',
 'file-info-png-looped' => 'ripetita',
 'file-info-png-repeat' => 'Ludis $1 fojo{{PLURAL:$1||j}}n',
 'file-info-png-frames' => '$1 kadro{{PLURAL:$1||j}}',
+'file-no-thumb-animation' => "'''Noto: Pro teĥnikaj limigoj antaŭvido de ĉi tiu dosiero ne estas animita.'''",
+'file-no-thumb-animation-gif' => "'''Noto: Pro teĥnikaj limigoj antaŭvido de altrezolucia GIF-dosiero kia ĉi tiu ne estas animita.'''",
 
 # Special:NewFiles
 'newimages' => 'Galerio de novaj dosieroj',
@@ -3200,7 +3232,7 @@ Sekvaj ligilo en la sama linio estas konsiderata kiel esceptoj (paĝoj kiel la b
 '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',
-'metadata-fields' => 'Metadatumaj kampoj de ĉi tiu mesaĝo estos inkluzivita en la paĝoj de bidloj kiam la metadatuma tabelo estas disfaldigita. 
+'metadata-fields' => 'Metadatumaj kampoj de ĉi tiu mesaĝo estos inkluzivitaj en la paĝoj de bildoj kiam la metadatuma tabelo estas disfaldita. 
 Aliaj estos kaŝitaj defaŭlte.
 * make
 * model
@@ -3682,6 +3714,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Intervikia transinkluzivado estas malebligita.]',
 'scarytranscludefailed' => '[Akiro de ŝablono $1 malsukcesis.]',
+'scarytranscludefailed-httpstatus' => '[Malsukcesis akiri la ŝablonon $1 : HTTP  $2 ]',
 'scarytranscludetoolong' => '[URL-o estas tro longa]',
 
 # Delete conflict
@@ -3929,9 +3962,9 @@ Bildoj montriĝas en plena distingivo, aliaj dosiertipoj estas malfermataj rekte
 'logentry-move-move_redir-noredirect' => '$1 movis paĝon $3 al $4 anstataŭigante alidirektilon sen lasante alidirektilon',
 'logentry-patrol-patrol' => '$1 markis revizion $4 de paĝo $3 kiel patrolita',
 'logentry-patrol-patrol-auto' => '$1 aŭtomate markis revizion $4 de paĝo $3 kiel patrolita',
-'logentry-newusers-newusers' => '$1 kreis salutnomon',
-'logentry-newusers-create' => '$1 kreis salutnomon',
-'logentry-newusers-create2' => '$1 kreis salutnomo $3',
+'logentry-newusers-newusers' => '$1 kreis konton',
+'logentry-newusers-create' => '$1 kreis konton',
+'logentry-newusers-create2' => '$1 kreis uzanton $3',
 'logentry-newusers-autocreate' => 'Konto $1 estis kreita aŭtomate',
 'newuserlog-byemail' => 'pasvorto sendita retpoŝte',
 
@@ -3951,6 +3984,10 @@ Aŭ vi povas uzi la facilan formularon sube. Via komento estos aldonita al la pa
 'feedback-bugcheck' => 'Bonega! Nur konfirmu ke ĝi ne jam ekzistas inter la [$1 konataj cimoj].',
 'feedback-bugnew' => 'Mi konfirmis. Raportu novan cimon.',
 
+# Search suggestions
+'searchsuggest-search' => 'Serĉi',
+'searchsuggest-containing' => 'enhavas...',
+
 # API errors
 'api-error-badaccess-groups' => 'Vi ne havas permeson alŝuti dosierojn al tiu ĉi vikio.',
 'api-error-badtoken' => 'Interna eraro: fuŝaĵo.',
index 5a47d98..a9751a5 100644 (file)
@@ -30,6 +30,7 @@
  * @author Clerc
  * @author Crazymadlover
  * @author Cvmontuy
+ * @author Dalton2
  * @author Danke7
  * @author David0811
  * @author Dferg
@@ -41,6 +42,7 @@
  * @author Fitoschido
  * @author Fluence
  * @author Gustronico
+ * @author Gwickwire
  * @author Hercule
  * @author Icvav
  * @author Imre
@@ -56,6 +58,7 @@
  * @author Locos epraix
  * @author Mahadeva
  * @author Manuelt15
+ * @author Maor X
  * @author McDutchie
  * @author Muro de Aguas
  * @author Omnipaedista
@@ -66,6 +69,7 @@
  * @author Piolinfax
  * @author Platonides
  * @author PoLuX124
+ * @author Ralgis
  * @author Remember the dot
  * @author Richard Wolf VI
  * @author Sanbec
@@ -80,6 +84,7 @@
  * @author Urhixidur
  * @author VegaDark
  * @author Vivaelcelta
+ * @author Waldir
  * @author Wilfredor
  * @author XalD
  * @author XanaG
@@ -115,7 +120,6 @@ $namespaceGenderAliases = array(
        NS_USER_TALK => array( 'male' => 'Usuario_Discusión', 'female' => 'Usuaria_Discusión' ),
 );
 
-
 $specialPageAliases = array(
        'Activeusers'               => array( 'UsuariosActivos' ),
        'Allmessages'               => array( 'TodosLosMensajes' ),
@@ -185,7 +189,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'CambiosRecientes', 'Cambios_recientes' ),
        'Recentchangeslinked'       => array( 'CambiosEnEnlazadas', 'Cambios_en_enlazadas' ),
        'Revisiondelete'            => array( 'BorrarRevisión', 'Borrar_revisión' ),
-       'RevisionMove'              => array( 'MoverRevision' ),
        'Search'                    => array( 'Buscar' ),
        'Shortpages'                => array( 'PáginasCortas', 'Páginas_cortas' ),
        'Specialpages'              => array( 'PáginasEspeciales', 'Páginas_especiales' ),
@@ -223,7 +226,6 @@ $magicWords = array(
        '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' ),
@@ -319,8 +321,8 @@ $magicWords = array(
        '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__' ),
+       'newsectionlink'            => array( '1', '__VINCULARANUEVASECCION__', '__ENLACECREARSECCIÓN__', '__NEWSECTIONLINK__' ),
+       'nonewsectionlink'          => array( '1', '__NOVINCULARANUEVASECCION__', '__SINENLACECREARSECCIÓN__', '__NONEWSECTIONLINK__' ),
        'currentversion'            => array( '1', 'VERSIONACTUAL', 'VERSIÓNACTUAL', 'CURRENTVERSION' ),
        'urlencode'                 => array( '0', 'CODIFICARURL:', 'URLENCODE:' ),
        'currenttimestamp'          => array( '1', 'MARCADEHORAACTUAL', 'CURRENTTIMESTAMP' ),
@@ -353,29 +355,29 @@ $dateFormats = array(
        'dmy both' => 'H:i j M Y',
 );
 
-$separatorTransformTable = array( ',' => '.', '.' => ',' );
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 $linkTrail = '/^([a-záéíóúñ]+)(.*)$/sDu';
 
 $messages = array(
 # User preference toggles
 'tog-underline' => 'Subrayar enlaces:',
-'tog-justify' => 'Justificar párrafos',
-'tog-hideminor' => 'Ocultar ediciones menores en cambios recientes',
-'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' => 'Agrupar los cambios por página en los cambios recientes y en la lista de vigilancia (requiere JavaScript)',
+'tog-justify' => 'Justificar los párrafos',
+'tog-hideminor' => 'Ocultar las ediciones menores en los cambios recientes',
+'tog-hidepatrolled' => 'Ocultar las ediciones patrulladas en los cambios recientes',
+'tog-newpageshidepatrolled' => 'Ocultar las páginas patrulladas 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' => 'Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento (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)',
-'tog-editsection' => 'Habilitar la edición de secciones usando el enlace [editar]',
-'tog-editsectiononrightclick' => 'Habilitar la edición de secciones presionando el botón de la derecha en los títulos de secciones (requiere JavaScript)',
+'tog-editondblclick' => 'Editar las páginas con doble clic (requiere JavaScript)',
+'tog-editsection' => 'Habilitar la edición de secciones mediante el enlace [editar]',
+'tog-editsectiononrightclick' => 'Habilitar la edición de secciones pulsando el botón derecho 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' => '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-watchcreations' => 'Añadir las páginas que cree y los archivos que suba a mi lista de seguimento',
+'tog-watchdefault' => 'Añadir las páginas y archivos que edite a mi lista de seguimiento',
+'tog-watchmoves' => 'Añadir las páginas y archivos que mueva a mi lista de seguimiento',
+'tog-watchdeletion' => 'Añadir las páginas y archivos que borre a mi lista de seguimiento',
 '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',
@@ -386,27 +388,27 @@ $messages = array(
 '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:',
-'tog-fancysig' => 'Tratar firma como wikitexto (sin un enlace automático)',
-'tog-externaleditor' => 'Utilizar editor 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-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' => 'Avisar cuando grabe la página sin introducir un resumen de edición',
+'tog-fancysig' => 'Tratar la firma como wikitexto (sin un enlace automático)',
+'tog-externaleditor' => 'Utilizar editor externo por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])',
+'tog-externaldiff' => "Utilizar ''diferencia'' externa por defecto (sólo para expertos: son necesarios ajustes especiales en la computadora; [//www.mediawiki.org/wiki/Manual:External_editors más información])",
+'tog-showjumplinks' => 'Habilitar los enlaces de accesibilidad «saltar a»',
+'tog-uselivepreview' => 'Usar previsualización en vivo (requiere JavaScript) (experimental)',
+'tog-forceeditsummary' => 'Avisarme cuando grabe la página sin introducir un resumen de edición',
 '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-watchlisthidebots' => 'Ocultar las ediciones de bots en la lista de seguimiento',
+'tog-watchlisthideminor' => 'Ocultar las ediciones menores en la lista de seguimiento',
+'tog-watchlisthideliu' => 'Ocultar las ediciones de los usuarios registrados en la lista de seguimiento',
+'tog-watchlisthideanons' => 'Ocultar las ediciones de los usuarios anónimos en la lista de seguimiento',
 'tog-watchlisthidepatrolled' => 'Ocultar las ediciones patrulladas en la lista de seguimiento',
 'tog-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',
+'tog-diffonly' => "No mostrar bajo las ''diferencias'' el contenido de la página",
+'tog-showhiddencats' => 'Mostrar las categorías escondidas',
 'tog-noconvertlink' => 'Desactivar la conversión de título de enlace',
-'tog-norollbackdiff' => "Omitir el ''diff'' después de revertir",
+'tog-norollbackdiff' => "Omitir la ''diferencia'' después de revertir",
 
 'underline-always' => 'Siempre',
 'underline-never' => 'Nunca',
-'underline-default' => 'Valor predeterminado del navegador',
+'underline-default' => 'Aspecto (skin) o navegador predeterminado',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Estilo de tipografía del área de edición:',
@@ -502,20 +504,19 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Opciones de página',
-'qbpageinfo' => 'Información de página',
 'qbmyoptions' => 'Mis páginas',
 'qbspecialpages' => 'Páginas especiales',
 'faq' => 'Preguntas más frecuentes',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'Añadir tema',
+'vector-action-addsection' => 'Nueva sección',
 'vector-action-delete' => 'Borrar',
-'vector-action-move' => 'Mover',
+'vector-action-move' => 'Trasladar',
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Cambiar protección',
-'vector-simplesearch-preference' => 'Activar sugerencias de búsqueda mejoradas (piel Vector solamente)',
+'vector-simplesearch-preference' => 'Activar la barra de búsqueda simplificada (sólo con la apariencia Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver historial',
@@ -525,6 +526,7 @@ $messages = array(
 'namespaces' => 'Espacios de nombres',
 'variants' => 'Variantes',
 
+'navigation-heading' => 'Menú de navegación',
 'errorpagetitle' => 'Error',
 'returnto' => 'Volver a $1.',
 'tagline' => 'De {{SITENAME}}',
@@ -732,7 +734,7 @@ Consulta: $2',
 'viewsource-title' => 'Ver el código fuente de «$1»',
 'actionthrottled' => 'Acción bloqueada',
 'actionthrottledtext' => "Como medida contra el ''spam'', la acción que estás realizando está limitada a un número determinado de veces en un periodo corto de tiempo, y has excedido ese límite. Por favor inténtalo de nuevo en unos minutos.",
-'protectedpagetext' => 'Esta página ha sido protegida para evitar su edición.',
+'protectedpagetext' => 'Esta página ha sido protegida para evitar su edición u otras acciones.',
 'viewsourcetext' => 'Puedes ver y copiar el código fuente de esta página:',
 'viewyourtext' => "Puedes ver y copiar el código de '''tus ediciones''' a esta página:",
 'protectedinterface' => 'Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.
@@ -764,12 +766,11 @@ El administrador que lo ha bloqueado ofrece esta explicación: "$3".',
 # Login and logout pages
 'logouttext' => "'''Ha terminado su sesión.'''
 
-Puedes continuar usando {{SITENAME}} de forma anónima, o puedes [[Special:UserLogin|iniciar sesión otra vez]] con el mismo u otro usuario.
+Puedes continuar usando {{SITENAME}} de forma anónima, o puedes <span class='plainlinks'>[$1 iniciar sesión otra vez]</span> con el mismo u otro usuario.
 Ten en cuenta que las páginas que tengas abiertas en otras ventanas o pestañas pueden verse como si siguieras identificado hasta que las refresques.",
-'welcomecreation' => '== ¡Bienvenido(a), $1! ==
-
-Tu cuenta ha sido creada.
-No olvides personalizar [[Special:Preferences|tus preferencias]].',
+'welcomeuser' => '¡Bienvenido, $1!',
+'welcomecreation-msg' => 'Tu cuenta ha sido creada.
+No olvides cambiar tus [[Special:Preferences|preferencias de {{SITENAME}} ]].',
 'yourname' => 'Nombre de usuario:',
 'yourpassword' => 'Contraseña:',
 'yourpasswordagain' => 'Confirma la contraseña:',
@@ -1026,7 +1027,7 @@ Puedes [[Special:Search/{{PAGENAME}}|buscar el título de esta página]] en otra
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los registros],
 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>, pero no tienespermiso para crear 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>, pero no tienes permiso para crear esta página.',
 '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.
@@ -1042,7 +1043,7 @@ La última entrada del registro de bloqueos se proporciona debajo para mayor ref
 * '''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.",
-'usercsspreview' => "'''Recuerda que solo estás previsualizando tu CSS de usuario.'''
+'usercsspreview' => "'''Recuerda que sólo estás previsualizando tu CSS de usuario.'''
 '''¡Aún no se ha guardado!'''",
 'userjspreview' => "'''¡Recuerda que solo estás previsualizando tu JavaScript de usuario.'''
 '''¡Aún no se ha guardado!'''",
@@ -1050,12 +1051,12 @@ La última entrada del registro de bloqueos se proporciona debajo para mayor ref
 '''¡Aún no se ha guardado!'''",
 'sitejspreview' => "'''Recuerda que sólo estás previsualizando este código JavaScript.'''
 '''¡Aún no se ha guardado!'''",
-'userinvalidcssjstitle' => "'''Aviso:''' No existe la skin «$1». Recuerda que las páginas personalizadas ''.css'' y ''.js'' tienen un título en minúsculas. Por ejemplo, {{ns:user}}:Ejemplo/vector.css en vez de {{ns:user}}:Ejemplo/Vector.css.",
+'userinvalidcssjstitle' => "'''Aviso:''' No existe la piel «$1». Recuerda que las páginas personalizadas ''.css'' y ''.js'' tienen un título en minúsculas. Por ejemplo, {{ns:user}}:Ejemplo/vector.css en vez de {{ns:user}}:Ejemplo/Vector.css.",
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
-'previewnote' => "'''¡Recuerda que esto es solo una previsualización.'''
-¡Tus cambios aún no se ha guardado!",
-'continue-editing' => 'Continuar editando',
+'previewnote' => "'''Recuerda que esto es solo una previsualización.'''
+¡Tus cambios aún no se han guardado!",
+'continue-editing' => 'Ir al área de edición',
 'previewconflict' => 'Esta previsualización refleja el texto en el área de edición superior como aparecerá una vez guardados los cambios.',
 'session_fail_preview' => "'''Lo sentimos, no pudimos procesar la edición debido a una pérdida de los datos de sesión.'''
 Por favor, inténtalo de nuevo.
@@ -1134,6 +1135,15 @@ Parece que ha sido borrada.',
 'edit-already-exists' => 'No se pudo crear una página nueva.
 Ya existe.',
 'defaultmessagetext' => 'Texto de mensaje predeterminado',
+'content-failed-to-parse' => 'No se pudo analizar el contenido $2 del modelo $1: $3',
+'invalid-content-data' => 'Datos de contenido inválidos',
+'content-not-allowed-here' => 'El contenido "$1" no está permitido en la página [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'texto wiki',
+'content-model-text' => 'Texto sin formato',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Aviso: Esta página contiene demasiadas llamadas a funciones sintácticas costosas (#ifexist: y similares)
@@ -1185,10 +1195,10 @@ El motivo dado por $3 es ''$2''",
 'page_first' => 'primeras',
 'page_last' => 'últimas',
 'histlegend' => "Selección de diferencias: marca los selectores de las versiones a comparar y pulsa ''enter'' o el botón de abajo.<br />
-Leyenda: (act) = diferencias con la versión actual,
-(prev) = diferencias con la versión previa, M = edición menor",
+Leyenda: '''(act)''' = diferencias con la versión actual,
+'''(ant)''' = diferencias con la versión anterior, '''m''' = edición menor",
 'history-fieldset-title' => 'Buscar en el historial',
-'history-show-deleted' => 'Solamente borrado',
+'history-show-deleted' => 'Solo ediciones ocultadas',
 'histfirst' => 'Primeras',
 'histlast' => 'Últimas',
 'historysize' => '({{PLURAL:$1|1 byte|$1 bytes}})',
@@ -1249,7 +1259,7 @@ Aún tiene la posibilidad de verla; puede ampliar los detalles en el [{{fullurl:
 'revdelete-text' => "Las revisiones borradas aún aparecerán en el historial de la página y en los registros, pero sus contenidos no serán accesibles al público.'''
 Otros administradores de {{SITENAME}} aún podrán acceder al contenido oculto y podrán deshacer el borrado a través de la misma interfaz, a menos que se establezcan restricciones adicionales.",
 'revdelete-confirm' => 'Por favor confirma que deseas realizar la operación, que entiendes las consecuencias y que estás ejecutando dicha acción acorde con [[{{MediaWiki:Policy-url}}|las políticas]].',
-'revdelete-suppress-text' => "La herramienta de supresión '''sólo''' debería usarse en los siguientes casos:
+'revdelete-suppress-text' => "La herramienta de supresión '''solo''' debería usarse en los siguientes casos:
 * Información potencialmente injuriosa o calumniante.
 * Información personal inapropiada, tal como:
 *: ''nombres, domicilios, números de teléfono, números de la seguridad social e información análoga.",
@@ -1296,12 +1306,12 @@ No tiene acceso a él.',
 'revdelete-otherreason' => 'Otra/adicional razón:',
 'revdelete-reasonotherlist' => 'Otra razón',
 'revdelete-edit-reasonlist' => 'Editar razones de borrado',
-'revdelete-offender' => 'Autor de revisión:',
+'revdelete-offender' => 'Autor de la revisión:',
 
 # Suppression log
 'suppressionlog' => 'Registro de supresiones',
 'suppressionlogtext' => 'A continuación hay una lista con los borrados y bloqueos cuyo contenido se encuentra oculto para los administradores.
-Ver la [[Special:BlockList|lista de bloqueos]] que incluye las prohibiciones y bloqueos actualmente operativos.',
+Véase la [[Special:BlockList|lista de bloqueos]] que incluye las prohibiciones y bloqueos actualmente operativos.',
 
 # History merging
 'mergehistory' => 'Fusionar historiales de páginas',
@@ -1391,8 +1401,6 @@ Los detalles pueden encontrarse en el [{{fullurl:{{#Special:Log}}/delete|page={{
 'search-interwiki-caption' => 'Proyectos hermanos',
 'search-interwiki-default' => 'Resultados de $1:',
 'search-interwiki-more' => '(más)',
-'search-mwsuggest-enabled' => 'con sugerencias',
-'search-mwsuggest-disabled' => 'sin sugerencias',
 'search-relatedarticle' => 'Relacionado',
 'mwsuggest-disable' => 'Desactivar AJAX al realizar búsquedas',
 'searcheverything-enable' => 'Buscar en todos los espacios de nombres',
@@ -1599,8 +1607,8 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'right-minoredit' => 'Marcar ediciones como «menores»',
 'right-move' => 'Trasladar páginas',
 'right-move-subpages' => 'Trasladar páginas con sus subpáginas',
-'right-move-rootuserpages' => 'Mover páginas del usuario raíz',
-'right-movefile' => 'Mover archivos',
+'right-move-rootuserpages' => 'Trasladar páginas de usuario raíz',
+'right-movefile' => 'Trasladar archivos',
 'right-suppressredirect' => 'No crear redirecciones de las páginas fuente  al trasladar páginas',
 'right-upload' => 'Subir archivos',
 'right-reupload' => 'Subir una nueva versión de un archivo existente',
@@ -1657,6 +1665,9 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'rightslogtext' => 'Este es un registro de cambios en los permisos de usuarios.',
 'rightslogentry' => 'modificó los grupos a los que pertenece $1: de $2 a $3',
 'rightslogentry-autopromote' => 'fue promovido automáticamente desde $2 a $3',
+'logentry-rights-rights' => '$1 modificó los grupos a los que pertenece $3: de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 ha cambiado la pertenencia a grupos de $3',
+'logentry-rights-autopromote' => '$1 fue promocionado automáticamente de $4 a $5',
 'rightsnone' => '(ninguno)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1666,10 +1677,10 @@ Tu dirección de correo no se revela cuando otros usuarios te contactan.',
 'action-createtalk' => 'crear páginas de discusión',
 'action-createaccount' => 'crear esta cuenta de usuario',
 'action-minoredit' => 'marcar este cambio como menor',
-'action-move' => 'mover esta página',
-'action-move-subpages' => 'mover esta página y sus subpáginas',
-'action-move-rootuserpages' => 'mover páginas del usuario raíz',
-'action-movefile' => 'mover este archivo',
+'action-move' => 'trasladar esta página',
+'action-move-subpages' => 'trasladar esta página y sus subpáginas',
+'action-move-rootuserpages' => 'trasladar páginas de usuario raíz',
+'action-movefile' => 'trasladar este archivo',
 'action-upload' => 'subir este archivo',
 'action-reupload' => 'reemplazar este archivo existente',
 'action-reupload-shared' => 'reemplazar este archivo existente en un depósito compartido',
@@ -1895,10 +1906,11 @@ $1',
 'backend-fail-notsame' => 'Ya existe un fichero distinto en $1.',
 'backend-fail-invalidpath' => '$1 no es una ruta de almacenamiento válida',
 'backend-fail-delete' => 'No se pudo borrar el archivo «$1».',
+'backend-fail-describe' => 'No pudieron cambiar los metadatos del archivo "$1".',
 'backend-fail-alreadyexists' => 'El archivo  $1  ya existe.',
 'backend-fail-store' => 'No se pudo almacenar el archivo $1 en $2.',
 'backend-fail-copy' => 'No se pudo copiar el archivo $1 a $2.',
-'backend-fail-move' => 'No se pudo mover el archivo $1 a $2.',
+'backend-fail-move' => 'No se pudo trasladar el archivo $1 a $2.',
 'backend-fail-opentemp' => 'No se pudo crear archivo temporal.',
 'backend-fail-writetemp' => 'No se pudo escribir en el archivo temporal.',
 'backend-fail-closetemp' => 'No se pudo cerrar el archivo temporal.',
@@ -2046,7 +2058,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.',
+'upload-disallowed-here' => 'No puedes sobrescribir este archivo.',
 
 # File reversion
 'filerevert' => 'Revertir $1',
@@ -2114,7 +2126,7 @@ Entrada: contenttype/subtype, p. ej. <code>image/jpeg</code>.',
 'statistics-articles' => 'Páginas de contenido',
 'statistics-pages' => 'Páginas',
 'statistics-pages-desc' => 'Todas las páginas en el wiki, incluyendo páginas de discusión, redirecciones, etc.',
-'statistics-files' => 'Ficheros subidos',
+'statistics-files' => 'Archivos subidos',
 'statistics-edits' => 'Ediciones en páginas desde que {{SITENAME}} fue instalado',
 'statistics-edits-average' => 'Media de ediciones por página',
 'statistics-views-total' => 'Visitas totales',
@@ -2237,7 +2249,7 @@ Por favor note que otros sitios web pueden vincular a un archivo con un URL dire
 Puedes filtrar la vista seleccionando un tipo de registro, el nombre del usuario o la página afectada. Se distinguen mayúsculas de minúsculas.',
 'logempty' => 'No hay elementos en el registro con esas condiciones.',
 'log-title-wildcard' => 'Buscar títulos que empiecen con este texto',
-'showhideselectedlogentries' => 'Mostrar u ocultar las entradas del registro seleccionado',
+'showhideselectedlogentries' => 'Mostrar u ocultar las entradas seleccionadas del registro',
 
 # Special:AllPages
 'allpages' => 'Todas las páginas',
@@ -2282,8 +2294,8 @@ Véase también las [[Special:WantedCategories|categorías requeridas]].',
 'linksearch-ns' => 'Espacio de nombre:',
 '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: <code>$1</code> (no añada ninguno de estos en su búsqueda).',
+Es necesario, por lo menos, un dominio de alto nivel, por ejemplo "*.org".<br />
+Protocolos soportados: <code>$1</code> (si no se especifica ninguno, el protocolo por defecto es http://).',
 'linksearch-line' => '$1 enlazado desde $2',
 'linksearch-error' => 'Los comodines sólo pueden aparecer al principio del nombre de sitio.',
 
@@ -2332,10 +2344,10 @@ Puede haber información adicional sobre privilegios individuales en [[{{MediaWi
 '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.',
+'emailpagetext' => 'Puedes usar el formulario de abajo para enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.
+La dirección de correo electrónico que indicaste en [[Special:Preferences|tus preferencias de usuario]] aparecerá en el campo "Remitente" o "De" para que el destinatario pueda responderte.',
 'usermailererror' => 'El sistema de correo devolvió un error:',
-'defemailsubject' => 'Correo de {{SITENAME}} para el usuario $1',
+'defemailsubject' => 'Correo electrónico enviado por el usuario «$1» desde {{SITENAME}}',
 'usermaildisabled' => 'Correo electrónico del usuario deshabilitado',
 'usermaildisabledtext' => 'No puedes enviar correos electrónicos a otros usuarios en esta wiki',
 'noemailtitle' => 'No hay dirección de correo electrónico',
@@ -2399,31 +2411,33 @@ La dirección electrónica que indicaste en [[Special:Preferences|tus preferenci
 
 'enotif_mailer' => 'Notificación por correo de {{SITENAME}}',
 'enotif_reset' => 'Marcar todas las páginas como visitadas',
-'enotif_newpagetext' => 'Se trata de una nueva página.',
 'enotif_impersonal_salutation' => 'usuario de {{SITENAME}}',
-'changed' => 'modificada',
-'created' => 'creada',
-'enotif_subject' => 'La página $PAGETITLE de {{SITENAME}} ha sido $CHANGEDORCREATED por $PAGEEDITOR',
+'enotif_subject_deleted' => 'La página $1 de {{SITENAME}} ha sido eliminada por {{gender:$2|$2}}',
+'enotif_subject_created' => 'La página $1 de {{SITENAME}} ha sido creada por {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'La página $1 de {{SITENAME}} ha sido trasladada por {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'La página $1 de {{SITENAME}} ha sido restaurada por {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'La página $1 de {{SITENAME}} ha sido cambiada por {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'La página $1 de {{SITENAME}} ha sido borrada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
+'enotif_body_intro_created' => 'La página $1 de {{SITENAME}} ha sido creada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
+'enotif_body_intro_moved' => 'La página $1 de {{SITENAME}} ha sido trasladada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
+'enotif_body_intro_restored' => 'La página $1 de {{SITENAME}} ha sido restaurada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
+'enotif_body_intro_changed' => 'La página $1 de {{SITENAME}} ha sido cambiada el $PAGEEDITDATE por {{GENDER:$2|$2}}, véase $3 para la revisión actual.',
 'enotif_lastvisited' => 'Consulta $1 para ver todos los cambios realizados desde tu última visita.',
 'enotif_lastdiff' => 'Consulta $1 para ver este cambio.',
 'enotif_anon_editor' => 'usuario anónimo $1',
 'enotif_body' => 'Estimado/a $WATCHINGUSERNAME,
 
-La página de {{SITENAME}} $PAGETITLE ha sido $CHANGEDORCREATED el $PAGEEDITDATE por el usuario $PAGEEDITOR.
-La versión actual se encuentra en $PAGETITLE_URL
+$PAGEINTRO $NEWPAGE
 
-$NEWPAGE
+Resumen de edición: $PAGESUMMARY $PAGEMINOREDIT
 
-El resumen de edición es: $PAGESUMMARY $PAGEMINOREDIT
-
-Contacta al editor:
+Contacta con el editor:
 Correo electrónico: $PAGEEDITOR_EMAIL
 Wiki: $PAGEEDITOR_WIKI
 
-No habrá otras notificaciones en caso de cambios adicionales, a menos que visites esta página nuevamente.
-También puedes reestablecer las notificaciones para todas tus páginas vigiladas en tu página de vigilancia.
+No habrá otras notificaciones en caso de cambios adicionales, a menos que visites esta página nuevamente. También puedes reestablecer las notificaciones de todas tus páginas que sigas en tu página de vigilancia.
 
-             El sistema de notificación de {{SITENAME}}.
+El sistema de notificaciones de {{SITENAME}}.
 
 --
 Para cambiar las opciones de tu lista de seguimiento, visita:
@@ -2432,7 +2446,7 @@ Para cambiar las opciones de tu lista de seguimiento, visita:
 Para borrar la página de tu lista de seguimiento visita:
 $UNWATCHURL
 
-Retroalimentación y asistencia adicional:
+Comentarios y asistencia adicional:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -2583,8 +2597,8 @@ o a que la revisión haya sido restaurada o eliminada del archivo.',
 'undeletedrevisions' => '{{PLURAL:$1|Una edición restaurada|$1 ediciones restauradas}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|ediciones restauradas y $2 archivo restaurado|ediciones y $2 archivos restaurados}}',
 'undeletedfiles' => '$1 {{PLURAL:$1|archivo restaurado|archivos restaurados}}',
-'cannotundelete' => 'Ha fallado el deshacer el borrado;
-alguien más puede haber deshecho el borrado antes.',
+'cannotundelete' => 'Hubo un error durante la restauración:
+$1',
 'undeletedpage' => "'''Se ha restaurado $1'''
 
 Consulta el [[Special:Log/delete|registro de borrados]] para ver una lista de los últimos borrados y restauraciones.",
@@ -2616,14 +2630,14 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contribuciones del usuario',
+'contributions' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}}',
 'contributions-title' => 'Contribuciones {{GENDER:$1|del usuario|de la usuaria}} $1',
 'mycontris' => 'Contribuciones',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'No se encontraron cambios que cumplieran estos criterios.',
 'uctop' => '(última edición)',
-'month' => 'Desde el mes (y anterior):',
-'year' => 'Desde el año (y anterior):',
+'month' => 'Desde el mes (y anteriores):',
+'year' => 'Desde el año (y anteriores):',
 
 'sp-contributions-newbies' => 'Mostrar solo las contribuciones de usuarios nuevos',
 'sp-contributions-newbies-sub' => 'Para cuentas nuevas',
@@ -2639,7 +2653,7 @@ $1',
 A continuación se muestra la última entrada del registro de bloqueos para mayor referencia.',
 'sp-contributions-search' => 'Buscar contribuciones',
 'sp-contributions-username' => 'Dirección IP o nombre de usuario:',
-'sp-contributions-toponly' => 'Mostrar solamente revisiones top',
+'sp-contributions-toponly' => 'Solo mostrar últimas ediciones de página',
 'sp-contributions-submit' => 'Buscar',
 
 # What links here
@@ -2658,7 +2672,7 @@ A continuación se muestra la última entrada del registro de bloqueos para mayo
 'whatlinkshere-hideredirs' => '$1 redirecciones',
 'whatlinkshere-hidetrans' => '$1 inclusiones',
 'whatlinkshere-hidelinks' => '$1 enlaces',
-'whatlinkshere-hideimages' => '$1 enlaces a imágenes',
+'whatlinkshere-hideimages' => '$1 enlaces a archivos',
 'whatlinkshere-filters' => 'Filtros',
 
 # Block/unblock
@@ -2760,7 +2774,7 @@ Consulta la [[Special:BlockList|lista de bloqueos]] para ver la lista de bloqueo
 'block-log-flags-noemail' => 'correo electrónico deshabilitado',
 'block-log-flags-nousertalk' => 'no puede editar su propia página de discusión',
 'block-log-flags-angry-autoblock' => 'autobloqueo avanzado habilitado',
-'block-log-flags-hiddenname' => 'nombre de usuario oculto',
+'block-log-flags-hiddenname' => 'nombre de usuario ocultado',
 'range_block_disabled' => 'La facultad de administrador de crear bloqueos por rangos está deshabilitada.',
 'ipb_expiry_invalid' => 'El tiempo de caducidad no es válido.',
 'ipb_expiry_temp' => 'Los bloqueos a nombres de usuario ocultos deben ser permanentes.',
@@ -2808,7 +2822,7 @@ Sin embargo, está bloqueada como parte del rango $2, que puede ser desbloqueado
 # Move page
 'move-page' => 'Trasladar $1',
 'move-page-legend' => 'Renombrar página',
-'movepagetext' => "Usando el siguiente formulario se renombrará una página, moviendo todo su historial al nuevo nombre.
+'movepagetext' => "Usando el siguiente formulario se renombrará una página, trasladando todo su historial al nuevo nombre.
 El título anterior se convertirá en una redirección al nuevo título.
 Los enlaces al antiguo título de la página no se cambiarán.
 Asegúrate de no dejar [[Special:DoubleRedirects|redirecciones dobles]] o [[Special:BrokenRedirects|rotas]].
@@ -2820,7 +2834,7 @@ Esto significa que podrás renombrar una página a su título original si has co
 '''¡Aviso!'''
 Este puede ser un cambio drástico e inesperado para una página popular;
 por favor, asegúrate de entender las consecuencias del procedimiento antes de seguir adelante.",
-'movepagetext-noredirectfixer' => "Usando el siguiente formulario se renombrará una página, moviendo todo su historial al nuevo nombre.
+'movepagetext-noredirectfixer' => "Usando el siguiente formulario se renombrará una página, trasladando todo su historial al nuevo nombre.
 El título anterior se convertirá en una redirección al nuevo título.
 Asegúrate de no dejar [[Special:DoubleRedirects|redirecciones dobles]] o [[Special:BrokenRedirects|rotas]].
 Tú eres responsable de hacer que los enlaces sigan apuntando adonde se supone que deberían hacerlo.
@@ -2832,19 +2846,19 @@ Esto significa que podrás renombrar una página a su título original si has co
 Este puede ser un cambio drástico e inesperado para una página popular;
 por favor, asegúrate de entender las consecuencias del procedimiento antes de seguir adelante.",
 'movepagetalktext' => "La página de discusión asociada, si existe, será renombrada automáticamente '''a menos que:'''
-*Esté moviendo la página entre espacios de nombres diferentes,
+*Estés trasladando la página entre espacios de nombres diferentes,
 *Una página de discusión no vacía ya exista con el nombre nuevo, o
-*No actives la opción «Renombrar la página de discusión también».
+*No marques el recuadro «Renombrar la página de discusión asociada».
 
 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 que solo será trasladada la página; el usuario '''no''' será renombrado.",
+'moveuserpage-warning' => "'''Aviso:''' estás a punto de trasladar 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.',
-'movenotallowedfile' => 'No tienes permiso para mover archivos.',
-'cant-move-user-page' => 'No tienes permiso para mover páginas de usuario (excepto subpáginas).',
-'cant-move-to-user-page' => 'No tienes permiso para mover una página a una página de usuario (excepto a subpáginas de usuario).',
+'movenotallowed' => 'No tienes permiso para trasladar páginas.',
+'movenotallowedfile' => 'No tienes permiso para trasladar archivos.',
+'cant-move-user-page' => 'No tienes permiso para trasladar páginas de usuario (excepto subpáginas).',
+'cant-move-to-user-page' => 'No tienes permiso para trasladar una página a una página de usuario (excepto a subpáginas de usuario).',
 'newtitle' => 'A título nuevo:',
 'move-watch' => 'Vigilar páginas de origen y destino',
 'movepagebtn' => 'Renombrar página',
@@ -2854,8 +2868,8 @@ En estos casos, deberás trasladar manualmente el contenido de la página de dis
 'movepage-moved-noredirect' => 'Se ha suprimido la creación de la redirección.',
 'articleexists' => 'Ya existe una página con ese nombre, o el nombre que has escogido no es válido.
 Por favor, elige otro nombre.',
-'cantmove-titleprotected' => 'No puedes mover la página a esta ubicación, porque el nuevo título ha sido protegido para evitar su creación.',
-'talkexists' => 'La página fue renombrada con éxito, pero la discusión no se pudo mover porque ya existe una en el título nuevo. Por favor incorpora sus contenidos manualmente.',
+'cantmove-titleprotected' => 'No puedes trasladar la página a esta ubicación, porque el nuevo título ha sido protegido para evitar su creación.',
+'talkexists' => 'La página fue renombrada con éxito, pero la discusión no se pudo trasladar porque ya existe una con el título nuevo. Por favor, incorpora sus contenidos manualmente.',
 'movedto' => 'renombrado a',
 'movetalk' => 'Renombrar la página de discusión asociada',
 'move-subpages' => 'Intentar trasladar las subpáginas (hasta $1)',
@@ -2863,7 +2877,7 @@ Por favor, elige otro nombre.',
 'movepage-page-exists' => 'La página $1 ya existe, por lo que no puede ser renombrada automáticamente.',
 'movepage-page-moved' => 'La página $1 ha sido trasladada a $2.',
 'movepage-page-unmoved' => 'La página $1 no se ha podido trasladar a $2.',
-'movepage-max-pages' => 'Se {{PLURAL:$1|ha trasladado un máximo de una página|han trasladado un máximo de $1 páginas}}, y no se van a mover más automáticamente.',
+'movepage-max-pages' => 'Se {{PLURAL:$1|ha trasladado un máximo de una página|han trasladado un máximo de $1 páginas}}, y no van a trasladarse más automáticamente.',
 'movelogpage' => 'Registro de traslados',
 'movelogpagetext' => 'Abajo se encuentra una lista de páginas trasladadas.',
 'movesubpage' => '{{PLURAL:$1|Subpágina|Subpáginas}}',
@@ -2884,8 +2898,9 @@ no se puede trasladar una página sobre sí misma.',
 'immobile-target-namespace-iw' => 'Un enlace interwiki no es un destino válido para trasladar una página.',
 'immobile-source-page' => 'Esta página no se puede renombrar.',
 'immobile-target-page' => 'No se puede trasladar a tal título.',
+'bad-target-model' => 'El destino deseado utiliza un modelo diferente de contenido. No se puede realizar la conversión de $1 a $2.',
 'imagenocrossnamespace' => 'No se puede trasladar el fichero a otro espacio de nombres',
-'nonfile-cannot-move-to-file' => 'No es posible mover un no-archivo al espacio de nombres de archivo',
+'nonfile-cannot-move-to-file' => 'No es posible trasladar lo que no es un archivo al espacio de nombres de archivo',
 'imagetypemismatch' => 'La nueva extensión de archivo no corresponde con su tipo',
 'imageinvalidfilename' => 'El nombre del fichero de destino no es válido',
 'fix-double-redirects' => 'Actualizar las redirecciones que apuntan al título original',
@@ -2895,7 +2910,7 @@ A continuación se muestra la última entrada de registro para referencia:",
 'semiprotectedpagemovewarning' => "'''Nota:''' Esta página ha sido bloqueada para que  solamente usuarios registrados pueden moverla.
 A continuación se muestra la última entrada de registro para referencia:",
 'move-over-sharedrepo' => '== El archivo existe ==
-[[:$1]] existe en un repositorio compartido. Mover el archivo a este título invalidará el archivo compartido.',
+[[:$1]] existe en un repositorio compartido. El traslado a este título invalidará la compartición del archivo.',
 'file-exists-sharedrepo' => 'El nombre de archivo elegido ya está siendo usado en un repositorio compartido.
 Por favor, elige otro nombre.',
 
@@ -3011,7 +3026,6 @@ No hay un directorio temporal.',
 
 # JavaScriptTest
 'javascripttest' => 'Pruebas de JavaScript',
-'javascripttest-disabled' => 'Esta función no ha sido activada en este wiki.',
 'javascripttest-title' => 'Pruebas de $1 en ejecución',
 'javascripttest-pagetext-noframework' => 'Esta página está reservada para ejecutar pruebas de JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Marco de pruebas desconocido "$1".',
@@ -3041,8 +3055,8 @@ Puedes ver su código fuente',
 'tooltip-ca-unprotect' => 'Cambiar protección de esta página',
 'tooltip-ca-delete' => 'Borrar esta página',
 'tooltip-ca-undelete' => 'Restaurar las ediciones hechas a esta página antes de que fuese borrada',
-'tooltip-ca-move' => 'Mover esta página',
-'tooltip-ca-watch' => 'Añadir esta página a su lista de seguimiento',
+'tooltip-ca-move' => 'Trasladar esta página',
+'tooltip-ca-watch' => 'Añadir esta página a tu lista de seguimiento',
 'tooltip-ca-unwatch' => 'Borrar esta página de su lista de seguimiento',
 'tooltip-search' => 'Buscar en {{SITENAME}}',
 'tooltip-search-go' => 'Ir al artículo con este nombre exacto si existe',
@@ -3080,7 +3094,7 @@ Puedes ver su código fuente',
 'tooltip-preview' => 'Previsualiza los cambios realizados. ¡Por favor, hazlo antes de grabar!',
 'tooltip-diff' => 'Muestra los cambios que ha introducido en el texto.',
 'tooltip-compareselectedversions' => 'Ver las diferencias entre las dos versiones seleccionadas de esta página.',
-'tooltip-watch' => 'Añadir esta página a su lista de seguimiento',
+'tooltip-watch' => 'Añadir esta página a tu lista de seguimiento',
 'tooltip-watchlistedit-normal-submit' => 'Borrar páginas',
 'tooltip-watchlistedit-raw-submit' => 'Actualizar lista de seguimiento',
 'tooltip-recreate' => 'Recupera una página que ha sido borrada',
@@ -3096,7 +3110,7 @@ Permite añadir una razón al resumen de edición.',
 'standard.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel Standard */',
 'nostalgia.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel Nostalgia */',
 'cologneblue.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel Cologne Blue */',
-'monobook.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel Monobook */',
+'monobook.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel MonoBook */',
 'myskin.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel MySkin */',
 'chick.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel Chick */',
 'simple.css' => '/* Los estilos CSS colocados aquí se aplicarán para todos los usuarios que usen la piel Simple */',
@@ -3153,6 +3167,7 @@ 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-not-current' => 'Lo sentimos, no es posible mostrar esta información para las revisiones antiguas.',
 'pageinfo-header-basic' => 'Información básica',
 'pageinfo-header-edits' => 'Historial de ediciones',
 'pageinfo-header-restrictions' => 'Protección de página',
@@ -3161,6 +3176,7 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 '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-language' => 'Idioma de la página',
 'pageinfo-robot-policy' => 'Estado del motor de búsqueda',
 'pageinfo-robot-index' => 'Indexable',
 'pageinfo-robot-noindex' => 'No indexable',
@@ -3178,10 +3194,17 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-templates' => '{{PLURAL:$1|Plantilla incluida|Plantillas incluidas}} ($1)',
+'pageinfo-toolboxlink' => 'Información de la página',
+'pageinfo-redirectsto' => 'Redirige a',
+'pageinfo-redirectsto-info' => 'Información',
+'pageinfo-contentpage' => 'Contado como página de contenido',
+'pageinfo-contentpage-yes' => 'Sí',
+'pageinfo-protect-cascading' => 'Protecciones en serie activadas',
+'pageinfo-protect-cascading-yes' => 'Sí',
+'pageinfo-protect-cascading-from' => 'Protecciones en serie activadas',
 
 # Skin names
 'skinname-standard' => 'Estándar',
@@ -3204,6 +3227,8 @@ Esto podría estar causado por un enlace a un sitio externo incluido en la lista
 'markedaspatrollederror' => 'No se puede marcar como patrullada',
 'markedaspatrollederrortext' => 'Debes especificar una revisión para marcarla como patrullada.',
 'markedaspatrollederror-noautopatrol' => 'No tienes permisos para marcar tus propios cambios como revisados.',
+'markedaspatrollednotify' => 'Este cambio realizado en $1 se ha marcado como revisado.',
+'markedaspatrollederrornotify' => 'Error al marcar como revisado.',
 
 # Patrol log
 'patrol-log-page' => 'Registro de revisiones',
@@ -3253,7 +3278,7 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
 # Special:NewFiles
 'newimages' => 'Galería de imágenes nuevas',
 'imagelisttext' => "Debajo hay una lista de '''$1''' {{PLURAL:$1|imagen|imágenes}} ordenadas $2.",
-'newimages-summary' => 'Esta página especial muestra una galería de los últimos ficheros subidos.',
+'newimages-summary' => 'Esta página especial muestra una galería de los últimos archivos subidos.',
 'newimages-legend' => 'Nombre del fichero',
 'newimages-label' => 'Nombre del fichero (o una parte):',
 'showhidebots' => '($1 bots)',
@@ -3272,6 +3297,7 @@ Ejecutarlo podría comprometer la seguridad de su equipo.",
 'hours' => '{{PLURAL:$1|una hora|$1 horas}}',
 'days' => '{{PLURAL:$1|un día|$1 días}}',
 'ago' => 'hace $1',
+'just-now' => 'Ahora mismo',
 
 # Bad image list
 'bad_image_list' => 'El formato es el siguiente:
@@ -3761,6 +3787,7 @@ Este código de confirmación caducará el $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Transclusión interwiki está deshabilitada]',
 'scarytranscludefailed' => '[Obtención de plantilla falló para $1]',
+'scarytranscludefailed-httpstatus' => '[Error de recuperación de plantilla para $1: HTTP $2]',
 'scarytranscludetoolong' => '[El URL es demasiado largo]',
 
 # Delete conflict
@@ -3875,6 +3902,7 @@ También puedes [[Special:EditWatchlist|usar el editor estándar]].',
 'version-license' => 'Licencia',
 'version-poweredby-credits' => "Este wiki funciona gracias a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'otros',
+'version-credits-summary' => 'Queremos reconocer a las siguientes personas por su contribución a [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki es software libre; puedes redistribuírlo y/o modificarlo bajo los términos de la Licencia General Pública GNU publicada por la Fundación del Software Libre; ya sea la versión 2 de la licencia, o (a tu elección) cualquier versión posterior.
 
 MediaWiki es distribuído con la esperanza de que será útil, pero SIN NINGUNA GARANTÍA; ni siquiera con la garantía implícita de COMERCIALIZACIÓN ó ADAPTACIÓN A UN PROPÓSITO PARTICULAR. Véase la Licencia Pública General GNU para mayores detalles.
@@ -3992,8 +4020,8 @@ Este sitio está experimentando dificultades técnicas.',
 'sqlite-no-fts' => '$1 sin soporte para búsqueda de texto completo',
 
 # New logging system
-'logentry-delete-delete' => '$1 borró la página $3',
-'logentry-delete-restore' => '$1 restauró la página $3',
+'logentry-delete-delete' => '$1 borró la página «$3»',
+'logentry-delete-restore' => '$1 restauró la página «$3»',
 'logentry-delete-event' => '$1 modificó la visibilidad de {{PLURAL:$5|un evento del registro|$5 eventos del registro}} en $3: $4',
 'logentry-delete-revision' => '$1 modificó la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-delete-event-legacy' => '$1 modificó la visibilidad de los eventos del registro en $3',
@@ -4003,9 +4031,9 @@ Este sitio está experimentando dificultades técnicas.',
 'logentry-suppress-revision' => '$1 modificó secretamente la visibilidad de {{PLURAL:$5|una edición|$5 ediciones}} en la página $3: $4',
 'logentry-suppress-event-legacy' => '$1 modificó secretamente la visibilidad de los eventos del registro en $3',
 'logentry-suppress-revision-legacy' => '$1 modificó secretamente la visibilidad de las ediciones en la página $3',
-'revdelete-content-hid' => 'contenido oculto',
+'revdelete-content-hid' => 'contenido ocultado',
 'revdelete-summary-hid' => 'resumen de edición oculto',
-'revdelete-uname-hid' => 'nombre de usuario oculto',
+'revdelete-uname-hid' => 'nombre de usuario ocultado',
 'revdelete-content-unhid' => 'contenido mostrado',
 'revdelete-summary-unhid' => 'resumen de edición mostrado',
 'revdelete-uname-unhid' => 'nombre de usuario mostrado',
@@ -4017,9 +4045,9 @@ Este sitio está experimentando dificultades técnicas.',
 'logentry-move-move_redir-noredirect' => '$1 movió la página $3 a $4 sobre una redirección, sin dejar redirección',
 'logentry-patrol-patrol' => '$1 marcó la edición $4 de la página $3 como patrullada',
 'logentry-patrol-patrol-auto' => '$1 marcó automáticamente la edición $4 de la página $3 como patrullada',
-'logentry-newusers-newusers' => '$1 creó una cuenta de usuario',
-'logentry-newusers-create' => '$1 creó una cuenta de usuario',
-'logentry-newusers-create2' => '$1 creó una cuenta de usuario $3',
+'logentry-newusers-newusers' => 'Se ha creado la cuenta de usuario $1',
+'logentry-newusers-create' => 'Se ha creado la cuenta de usuario $1',
+'logentry-newusers-create2' => '$1 ha creado la cuenta de usuario $3',
 'logentry-newusers-autocreate' => 'La cuenta $1 fue creada automáticamente',
 'newuserlog-byemail' => 'contraseña enviada por correo electrónico',
 
@@ -4040,6 +4068,10 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'feedback-bugcheck' => '¡Perfecto! Únicamente comprueba que no sea un [$1 fallo conocido].',
 'feedback-bugnew' => 'Lo he comprobado. Informar de un nuevo fallo.',
 
+# Search suggestions
+'searchsuggest-search' => 'Buscar',
+'searchsuggest-containing' => 'que contiene...',
+
 # API errors
 'api-error-badaccess-groups' => 'No puedes cargar archivos en este wiki.',
 'api-error-badtoken' => 'Error interno: Símbolo incorrecto.',
@@ -4092,4 +4124,6 @@ En otro caso, puedes usar el siguiente formulario. Tu comentario será añadido
 'duration-centuries' => '$1 {{PLURAL:$1|siglo|siglos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
 
+# Unknown messages
+'svg-long-error' => 'Archivo SVG no válido: $1',
 );
index 63fe960..3c488e0 100644 (file)
@@ -434,7 +434,6 @@ $messages = array(
 'qbbrowse' => 'Sirvi',
 'qbedit' => 'Redigeeri',
 'qbpageoptions' => 'Lehekülje suvandid',
-'qbpageinfo' => 'Lehekülje andmed',
 'qbmyoptions' => 'Minu suvandid',
 'qbspecialpages' => 'Erileheküljed',
 'faq' => 'KKK',
@@ -447,7 +446,7 @@ $messages = array(
 'vector-action-protect' => 'Kaitse',
 'vector-action-undelete' => 'Taasta',
 'vector-action-unprotect' => 'Muuda kaitset',
-'vector-simplesearch-preference' => 'Luba täiustatud otsinguvihjed (ainult Vektori-kujunduses)',
+'vector-simplesearch-preference' => 'Kasuta lihtsustatud otsiriba (ainult Vektori-kujunduses)',
 'vector-view-create' => 'Loo',
 'vector-view-edit' => 'Redigeeri',
 'vector-view-history' => 'Näita ajalugu',
@@ -668,8 +667,11 @@ Palun proovi mõne minuti pärast uuesti.',
 'protectedpagetext' => 'See lehekülg on lukustatud, et muudatusi ei tehtaks.',
 '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:''' 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.",
+'protectedinterface' => 'Sellel leheküljel on selle viki tarkvara kasutajaliidese tekst. Väärtarvituse vältimiseks on lehekülg kaitstud.
+Et lisada ja muuta tõlkeid kõigi vikide jaoks, kasuta palun MediaWiki lokaliseerimisprojekti [//translatewiki.net/ translatewiki.net].',
+'editinginterface' => "'''Hoiatus:''' Redigeerid tarkvara kasutajaliidese tekstiga lehekülge.
+Muudatused siin mõjutavad kõikide selle viki kasutajate kasutajaliidest.
+Et lisada ja muuta tõlkeid kõigi vikide jaoks, kasuta palun MediaWiki lokaliseerimisprojekti [//translatewiki.net/ translatewiki.net].",
 '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',
@@ -694,12 +696,11 @@ Administraator lukustas selle järgmisel põhjusel: "$3".',
 # Login and logout pages
 'logouttext' => "'''Oled nüüd välja loginud.'''
 
-Võid jätkata {{GRAMMAR:genitive|{{SITENAME}}}} kasutamist anonüümselt, aga ka sama või mõne teise kasutajana uuesti [[Special:UserLogin|sisse logida]].
+Võid jätkata {{GRAMMAR:genitive|{{SITENAME}}}} kasutamist anonüümselt, aga ka sama või mõne teise kasutajana uuesti <span class='plainlinks'>[$1 sisse logida]</span>.
 Pane tähele, et seni kuni sa pole oma võrgulehitseja puhvrit tühjendanud, võidakse mõni lehekülg endiselt nii kuvada nagu oleksid ikka sisse logitud.",
-'welcomecreation' => '== Tere tulemast, $1! ==
-
-Sinu konto on loodud.
-Ära unusta oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|eelistusi]] seada.',
+'welcomeuser' => 'Tere tulemast, $1!',
+'welcomecreation-msg' => 'Sinu konto on loodud.
+Ära unusta seada oma {{GRAMMAR:genitive|{{SITENAME}}}} [[Eri:Eelistused|eelistusi]].',
 'yourname' => 'Kasutajanimi:',
 'yourpassword' => 'Parool:',
 'yourpasswordagain' => 'Sisesta parool uuesti:',
@@ -940,9 +941,8 @@ Kui sattusid siia kogemata, klõpsa võrgulehitseja ''tagasi''-nupule.",
 'noarticletext' => 'Käesoleval leheküljel hetkel teksti ei ole.
 Võid [[Special:Search/{{PAGENAME}}|otsida pealkirjaks olevat fraasi]] teistelt lehtedelt,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} uurida asjassepuutuvaid logisid] või [{{fullurl:{{FULLPAGENAME}}|action=edit}} puuduva lehekülje ise luua]</span>.',
-'noarticletext-nopermission' => 'Sellel leheküljel 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>.',
+'noarticletext-nopermission' => 'Sellel leheküljel pole praegu teksti.
+Saad [[Special:Search/{{PAGENAME}}|otsida selle lehekülje pealkirja]] teistelt lehekülgedelt või <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} otsida seonduvatest logidest]</span>, aga sul pole õigust seda lehekülge alustada.',
 '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.
@@ -1298,8 +1298,6 @@ Harilikult tähendab see seda, et sind siia juhatanud link on vananenud ja siin
 'search-interwiki-caption' => 'Sõsarprojektid',
 'search-interwiki-default' => '$1 tulemused:',
 'search-interwiki-more' => '(veel)',
-'search-mwsuggest-enabled' => 'ettepanekutega',
-'search-mwsuggest-disabled' => 'ettepanekuid ei ole',
 'search-relatedarticle' => 'Seotud',
 'mwsuggest-disable' => 'Ära näita otsinguvihjeid',
 'searcheverything-enable' => 'Otsi kõigist nimeruumidest',
@@ -1811,7 +1809,7 @@ Kui probleem ei kao, võta ühendust [[Special:ListUsers/sysop|administraatoriga
 'backend-fail-create' => 'Faili $1 ei saa kirjutada.',
 'backend-fail-maxsize' => 'Faili $1 ei saa kirjutada, sest see on {{PLURAL:$2|ühest baidist|$2 baidist}} suurem.',
 'backend-fail-contenttype' => 'Faili, mida soovitakse talletada asukohas "$1", sisutüüpi saanud kindlaks teha.',
-'backend-fail-usable' => 'Faili $1 ei saa ebapiisavate õiguste või puuduvate kataloogide/konteinerite tõttu kirjutada.',
+'backend-fail-usable' => 'Faili $1 ei saa ebapiisavate õiguste või puuduvate kataloogide/konteinerite tõttu lugeda ega kirjutada.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Rada "$1" ei saa lukust lahti teha, sest see pole lukus.',
@@ -2290,11 +2288,7 @@ Kui tahad seda lehte hiljem jälgimisloendist eemaldada, klõpsa päisenupule \"
 
 'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} lehekülje muutmise teavitaja',
 'enotif_reset' => 'Märgi kõik lehed loetuks',
-'enotif_newpagetext' => 'See on uus lehekülg.',
 'enotif_impersonal_salutation' => '{{GRAMMAR:genitive|{{SITENAME}}}} kasutaja',
-'changed' => 'muutnud lehekülge',
-'created' => 'loonud lehekülje',
-'enotif_subject' => '$PAGEEDITOR on {{GRAMMAR:inessive|{{SITENAME}}}} $CHANGEDORCREATED $PAGETITLE',
 'enotif_lastvisited' => 'Kõigi sinu viimase külastuse järel tehtud muudatuste nägemiseks vaata: $1.',
 'enotif_lastdiff' => 'Muudatus on leheküljel $1.',
 'enotif_anon_editor' => 'anonüümne kasutaja $1',
@@ -2912,7 +2906,6 @@ Palun ürita uuesti.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScripti katsetamine',
-'javascripttest-disabled' => 'See funktsioon pole selles vikis lubatud.',
 'javascripttest-title' => '$1-katse käitus',
 'javascripttest-pagetext-noframework' => 'Seda lehekülge hoitakse JavaScripti katsete jaoks.',
 'javascripttest-pagetext-unknownframework' => 'Tundmatu katseraamistik "$1".',
@@ -3050,7 +3043,6 @@ See on ilmselt põhjustatud linkimisest mustas nimekirjas olevasse välisvõrguk
 '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 ({{lcfirst:$1}})',
 '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)',
@@ -3416,8 +3408,8 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 
 'exif-filesource-3' => 'Digitaalne fotokaamera',
 
-'exif-customrendered-0' => 'Normaalne protsess',
-'exif-customrendered-1' => 'Kohandatud protsess',
+'exif-customrendered-0' => 'Tavatöötlus',
+'exif-customrendered-1' => 'Kohandatud töötlus',
 
 'exif-exposuremode-0' => 'Automaatne säritus',
 'exif-exposuremode-1' => 'Manuaalne säritus',
@@ -3438,16 +3430,16 @@ Kui faili on rakendustarkvaraga töödeldud, võib osa andmeid olla muudetud võ
 'exif-gaincontrol-4' => 'Vähene',
 
 'exif-contrast-0' => 'Normaalne',
-'exif-contrast-1' => 'Pehme',
-'exif-contrast-2' => 'Kõva',
+'exif-contrast-1' => 'Nõrk',
+'exif-contrast-2' => 'Tugev',
 
 'exif-saturation-0' => 'Normaalne',
 'exif-saturation-1' => 'Madal värviküllastus',
 'exif-saturation-2' => 'Kõrge värviküllastus',
 
 'exif-sharpness-0' => 'Normaalne',
-'exif-sharpness-1' => 'Pehme',
-'exif-sharpness-2' => 'Kõva',
+'exif-sharpness-1' => 'Nõrk',
+'exif-sharpness-2' => 'Tugev',
 
 'exif-subjectdistancerange-0' => 'Teadmata',
 'exif-subjectdistancerange-1' => 'Makro',
@@ -3872,6 +3864,10 @@ Kui ei, kasuta allolevat lihtsat vormi. Sinu kommentaar lisatakse koos kasutajan
 'feedback-bugcheck' => 'Hästi! Kontrolli vaid, ega tegu pole juba [$1 teada oleva veaga].',
 'feedback-bugnew' => 'Kontrollisin. Teata uuest veast',
 
+# Search suggestions
+'searchsuggest-search' => 'Otsi',
+'searchsuggest-containing' => 'sisalduv...',
+
 # API errors
 'api-error-badaccess-groups' => 'Sul pole selles vikis üleslaadimisõigust.',
 'api-error-badtoken' => 'Sisemine tõrge: Sobimatu nimi.',
index d563bf1..958e2c3 100644 (file)
@@ -173,7 +173,7 @@ $messages = array(
 
 'underline-always' => 'Beti',
 'underline-never' => 'Inoiz ez',
-'underline-default' => 'Nabigatzailearen lehenetsitako balioa',
+'underline-default' => 'Lehenetsitako nabigatzailea',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Aldatu eremuko letra tipoa:',
@@ -258,8 +258,8 @@ $messages = array(
 'newwindow' => '(leiho berrian irekitzen da)',
 'cancel' => 'Utzi',
 'moredotdotdot' => 'Gehiago...',
-'mypage' => 'Nire orrialdea',
-'mytalk' => 'Nire eztabaida',
+'mypage' => 'Orrialdea',
+'mytalk' => 'Eztabaida',
 'anontalk' => 'IP honen eztabaida',
 'navigation' => 'Nabigazioa',
 'and' => '&#32;eta',
@@ -269,20 +269,19 @@ $messages = array(
 'qbbrowse' => 'Arakatu',
 'qbedit' => 'Aldatu',
 'qbpageoptions' => 'Orrialde hau',
-'qbpageinfo' => 'Testuingurua',
 'qbmyoptions' => 'Nire orrialdeak',
 'qbspecialpages' => 'Aparteko orrialdeak',
 'faq' => 'Maiz egindako galderak',
 'faqpage' => 'Project:Maiz egindako galderak',
 
 # Vector skin
-'vector-action-addsection' => 'Mintzagaia gehitu',
+'vector-action-addsection' => 'Gehitu atala',
 'vector-action-delete' => 'Ezabatu',
 'vector-action-move' => 'Mugitu',
 'vector-action-protect' => 'Babestu',
 'vector-action-undelete' => 'Berreskuratu',
 'vector-action-unprotect' => 'Babesa aldatu',
-'vector-simplesearch-preference' => 'Baimendu bilaketa gomendio hobetuak (Vector itxurarekin bakarrik)',
+'vector-simplesearch-preference' => 'Bilaketa barra sinplifikatua gaitu (Vector itxurarekin bakarrik)',
 'vector-view-create' => 'Sortu',
 'vector-view-edit' => 'Aldatu',
 'vector-view-history' => 'Historia ikusi',
@@ -317,7 +316,7 @@ $messages = array(
 'viewdeleted_short' => 'Ikusi ezabatutako {{PLURAL:$1|bidalketa bat|$1 bidalketa}}',
 'protect' => 'Babestu',
 'protect_change' => 'aldatu',
-'protectthispage' => 'Orrialde hau babestu',
+'protectthispage' => 'Orri hau babestu',
 'unprotect' => 'Babesa aldatu',
 'unprotectthispage' => 'Orrialde honen babesa aldatu',
 'newpage' => 'Orrialde berria',
@@ -352,6 +351,7 @@ Erabiltzaile gehiegi ari da orrialde hau ikusi nahiean.
 Mesedez itxaron ezazu unetxo bat orrialde honetara berriz sartzen saiatu baino lehen.
 
 $1',
+'pool-timeout' => 'Lock-a itxoiten denbora amaitu da',
 'pool-queuefull' => 'Prozesuen zerrenda beteta dago',
 'pool-errorunknown' => 'Errore ezezaguna',
 
@@ -411,6 +411,8 @@ $1',
 'page-rss-feed' => '"$1" RSS Jarioa',
 'page-atom-feed' => '"$1" Atom Jarioa',
 'red-link-title' => '$1 (orria ez da existitzen)',
+'sort-descending' => 'Sailkatu beherantz',
+'sort-ascending' => 'Sailkatu gorantz',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Orrialdea',
@@ -493,11 +495,13 @@ Kontsulta: $2',
 '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.',
 'protectedpagetext' => 'Orrialde hau aldaketak saihesteko blokeatu egin da.',
-'viewsourcetext' => 'Orrialde honen testua ikusi eta kopiatu dezakezu:',
-'protectedinterface' => 'Orrialde honek softwarearentzako interfaze testua gordetzen du eta blokeatuta dago bandalismoak saihesteko.',
-'editinginterface' => "'''Oharra:''' Softwarearentzako interfaze testua duen orrialde bat aldatzen ari zara.
-Orrialde honetako aldaketek erabiltzaile guztiei eragingo die.
-Itzulpenetarako, [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] erabili ezazu, MediaWiki proiektuan.",
+'viewsourcetext' => 'Orri honen iturburu-testua ikusi eta kopiatu dezakezu:',
+'viewyourtext' => "Orrialde honetara '''zure aldaketen''' jatorria ikus eta kopiatu ahal duzu:",
+'protectedinterface' => 'Orrialde honek softwarearentzako interfaze testua gordetzen du eta blokeatuta dago bandalismoak saihesteko.
+Wiki guztientzako aldaketak egin edo gehitzeko, mesedez erabili [//translatewiki.net/ translatewiki.net], MediaWikiren lokalizazio proiektua.',
+'editinginterface' => "'''Oharra:''' Softwarearen interfazerako testua duen orri bat aldatzen ari zara.
+Orri honetako aldaketek wiki honetako erabiltzaile guztiei eragingo diete.
+Itzulpenetarako, erabil ezazu [//translatewiki.net/ translatewiki.net], MediaWiki proiektuan.",
 'sqlhidden' => '(ezkutuko SQL kontsulta)',
 'cascadeprotected' => "Orrialde hau aldaketen aurka babestua dago, ''kaskada'' aukerarekin babestu {{PLURAL:$1|duten orrialde honetan|dituzten orrialde hauetan}} txertaturik dagoelako:
 $2",
@@ -505,6 +509,7 @@ $2",
 'ns-specialprotected' => 'Ezin dira {{ns:special}} izen-tarteko orrialdeak editatu.',
 'titleprotected' => "[[User:$1|$1]]ek izenburu hau sortzea ekidin zuen.
 Emandako arrazoia ''$2'' izan zen.",
+'exception-nologin' => 'Saioa hasi gabe',
 
 # Virus scanner
 'virus-badscanner' => "Ezarpen txarrak: antibirus ezezaguna: ''$1''",
@@ -514,11 +519,8 @@ Emandako arrazoia ''$2'' izan zen.",
 # Login and logout pages
 'logouttext' => "'''Saioa itxi egin duzu.'''
 
-Erabiltzaile anonimo bezala jarrai dezakezu {{SITENAME}} erabiltzen, edo [[Special:UserLogin|saioa has dezakezu berriz]] erabiltzaile berdinarekin edo ezberdin batekin.
+Erabiltzaile anonimo bezala jarrai dezakezu {{SITENAME}} erabiltzen, edo <span class='plainlinks'>[$1 saioa has dezakezu berriz]</span> erabiltzaile berdinarekin edo ezberdin batekin.
 Kontuan izan orrialde batzuk saioa hasita bazenu bezala ikus ditzakezula nabigatzailearen katxea garbitu arte.",
-'welcomecreation' => '== Ongi etorri, $1! ==
-
-Zure kontua sortu egin da. Ez ahaztu [[Special:Preferences|{{SITENAME}}(e)ko hobespenak]] aldatzea.',
 'yourname' => 'Erabiltzaile izena',
 'yourpassword' => 'Pasahitza:',
 'yourpasswordagain' => 'Pasahitza berriz',
@@ -594,6 +596,7 @@ Ondorioz, ezin duzu kontu gehiago sortu.',
 'invalidemailaddress' => 'Ezin da e-posta helbide hori ontzat eman baliogabeko formatua duela dirudielako.
 
 Mesedez, formatu egokia duen helbide bat zehaztu, edo hutsik utzi.',
+'emaildisabled' => 'Gune honek ezin du e-postarik bidali.',
 'accountcreated' => 'Kontua sortuta',
 'accountcreatedtext' => '$1 erabiltzaile kontua sortu egin da.',
 'createaccount-title' => '{{SITENAME}}-rako kontua sortu',
@@ -735,9 +738,9 @@ Erabiltzaile anonimoa bazara eta zurekin zerikusirik ez duten mezuak jasotzen ba
 Beste orrialde batzuetan [[Special:Search/{{PAGENAME}}|bilatu dezakezu izenburu hau]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} bilatu lotutako logak],
 edo [{{fullurl:{{FULLPAGENAME}}|action=edit}} berau aldatu ere egin dezakezu]</span>.',
-'noarticletext-nopermission' => 'Une honetan ez dago texturik orri honetan.
-Beste orrietan [[Special:Search/{{PAGENAME}}|testua bilatu dezakezu]],
-edo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} erlazionatutako erregistroak ikusi]</span>.',
+'noarticletext-nopermission' => 'Une honetan ez dago testurik orrialde honetan.
+Beste orrialdeetan [[Special:Search/{{PAGENAME}}|izenburu hau bilatu dezakezu]],
+edo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} erlazionatutako erregistroak bilatu]</span>, baina ez duzu orrialde hau sortzeko baimenik.',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" lankidea ez dago erregistatuta. Mesedez, konprobatu orri hau editatu/sortu nahi duzun.',
 'userpage-userdoesnotexist-view' => '"$1" erabiltzaile-kontua ez dago erregistraturik.',
 'blocked-notice-logextract' => 'Erabiltzaile hau blokeatuta dago une honetan.
@@ -761,7 +764,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',
+'continue-editing' => 'Edizio-eremura joan',
 '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.'''
@@ -814,16 +817,16 @@ Azken erregistroko sarrera ematen da azpian erreferentzia gisa:",
 'edittools' => '<!-- Hemen jarritako testua aldaketa eta igoera formularioen azpian agertuko da. -->',
 'nocreatetitle' => 'Orrialdeak sortzea mugatuta',
 'nocreatetext' => 'Gune honek orrialde berriak sortzeko gaitasuna mugatu du. Atzera egin dezakezu existitzen den orrialde bat aldatzeko, edo [[Special:UserLogin|saio hasi edo kontua sortu]].',
-'nocreate-loggedin' => 'Ez daukazu orrialde berriak sortzeko baimenik.',
+'nocreate-loggedin' => 'Ez duzu orri berriak sortzeko baimenik.',
 'sectioneditnotsupported-title' => 'Ezin dira atalak aldatu',
 'sectioneditnotsupported-text' => 'Ezin dira atalak aldatu orrialde honetan.',
 'permissionserrors' => 'Baimen erroreak',
 'permissionserrorstext' => 'Ez duzu hori egiteko baimenik, hurrengo {{PLURAL:$1|arrazoia dela eta|arrazoiak direla eta}}:',
 'permissionserrorstext-withaction' => 'Ez duzu $2 egiteko eskumenik, honako {{PLURAL:$1|arrazoia dela eta:|arrazoiak direla eta:}}',
-'recreate-moveddeleted-warn' => "'''Oharra: Lehenago ezabatutako orrialdea birsortzen ari zara.'''
+'recreate-moveddeleted-warn' => "'''Oharra: Lehenago ezabatutako orri bat berriz sortzen ari zara.'''
 
-Pentsatu ea orrialde hau editatzen jarraitzeak zentzurik baduen.
-Hemen duzu orrialde honen ezabaketa erregistroa badaezpada ere:",
+Pentsatu ea orri hau editatzen jarraitzeak zentzurik baduen.
+Hemen duzu orri honen ezabaketa erregistroa, badaezpada ere:",
 'moveddeleted-notice' => 'Orrialde hau ezabatua izan da.
 Orrialdearen ezabatze erregistroa behean agertzen da erreferentzia gisa.',
 'log-fulllog' => 'Erregistro osoa ikusi',
@@ -835,6 +838,12 @@ Ez du azalpenik eman.',
 'edit-already-exists' => 'Ezin izan da orri berria sortu.
 Jada existitzen da.',
 
+# Content models
+'content-model-wikitext' => 'wikitestua',
+'content-model-text' => 'testu laua',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Adi: Orrialde honek parser funtzio deialdi oso garesti gehiegi ditu.
 
@@ -1076,8 +1085,6 @@ Kontura zaitez nabigazio loturek, zutabea ezabatu dezakela.',
 'search-interwiki-caption' => 'Beste proiektuak',
 'search-interwiki-default' => '$1(r)en emaitzak:',
 'search-interwiki-more' => '(gehiago)',
-'search-mwsuggest-enabled' => 'iradokizunekin',
-'search-mwsuggest-disabled' => 'ez dago gomendiorik',
 'search-relatedarticle' => 'Erlazionatua',
 'mwsuggest-disable' => 'AJAX gomendioak ezgaitu',
 'searcheverything-enable' => 'Bilatu izen-tarte guztietan',
@@ -1110,7 +1117,7 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 
 # Preferences page
 'preferences' => 'Hobespenak',
-'mypreferences' => 'Nire hobespenak',
+'mypreferences' => 'Hobespenak',
 'prefs-edits' => 'Aldaketa kopurua:',
 'prefsnologin' => 'Saioa hasi gabe',
 'prefsnologintext' => '<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} Izena eman]</span> behar duzu zure hobespenak ezartzeko.',
@@ -1121,6 +1128,7 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'prefs-beta' => 'Beta ezaugarriak',
 'prefs-datetime' => 'Data eta ordua',
 'prefs-labs' => 'Labs ezaugarriak',
+'prefs-user-pages' => 'Erabiltzaile orrialdeak',
 'prefs-personal' => 'Erabiltzaile profila',
 'prefs-rc' => 'Azken aldaketak',
 'prefs-watchlist' => 'Jarraipen zerrenda',
@@ -1169,7 +1177,7 @@ Saia zaitez zure eskeraren aurretik ''all:'' jartzen eduki guztien artean bilatz
 'timezoneregion-indian' => 'Indiar Ozeanoa',
 'timezoneregion-pacific' => 'Ozeano Barea',
 'allowemail' => 'Beste erabiltzaileengandik e-posta mezuak jasotzea gaitu',
-'prefs-searchoptions' => 'Bilaketa aukerak',
+'prefs-searchoptions' => 'Bilatu',
 'prefs-namespaces' => 'Izen-tarteak',
 'defaultns' => 'Bestela izen-tarte hauetan bilatu:',
 'default' => 'lehenetsia',
@@ -1399,14 +1407,15 @@ $1 {{PLURAL:$1|karakteretik|karakteretik}} behera izan behar ditu.',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|lankide|lankide}} jarraitzen]',
 'rc_categories' => 'Kategorietara mugatu ("|" karaktereaz banandu)',
 'rc_categories_any' => 'Edozein',
+'rc-change-size-new' => '{{PLURAL:$1|Byte 1|$1 byte}} aldaketaren ostean',
 'newsectionsummary' => '/* $1 */ atal berria',
 'rc-enhanced-expand' => 'Erakutsi xehetasunak (JavaScript beharrezkoa da)',
 'rc-enhanced-hide' => 'Xehetasunak ezkutatu',
 
 # Recent changes linked
-'recentchangeslinked' => 'Lotutako orrialdeen aldaketak',
-'recentchangeslinked-feed' => 'Lotutako orrialdeen aldaketak',
-'recentchangeslinked-toolbox' => 'Lotutako orrialdeen aldaketak',
+'recentchangeslinked' => 'Lotutako orrietako aldaketak',
+'recentchangeslinked-feed' => 'Lotutako orrietako aldaketak',
+'recentchangeslinked-toolbox' => 'Lotutako orrietako aldaketak',
 'recentchangeslinked-title' => '"$1"(e)kin harremanetan dauden aldaketak',
 'recentchangeslinked-noresult' => 'Emandako epean ez da egon aldaketarik loturiko orrialdetan.',
 'recentchangeslinked-summary' => "Zerrenda honetan zehazturiko orrialde bati (edo kategoria berezi bateko azkeneko kideei) lotura duten orrietan eginiko azken aldaketak agertzen dira.
@@ -1798,7 +1807,7 @@ Erregistro mota, erabiltzailearen izena edota orrialdearen izena iragaziz bistar
 'log-title-wildcard' => 'Testu honekin hasten diren izenburuak bilatu',
 
 # Special:AllPages
-'allpages' => 'Orrialde guztiak',
+'allpages' => 'Orri guztiak',
 'alphaindexline' => '$1(e)tik $2(e)raino',
 'nextpage' => 'Hurrengo orrialdea ($1)',
 'prevpage' => 'Aurreko orrialdea ($1)',
@@ -1839,7 +1848,7 @@ Ikus, gainera [[Special:WantedCategories|kategoriarik eskatuenak]].',
 'linksearch-ok' => 'Bilatu',
 'linksearch-text' => '"*.wikipedia.org" bezalako izartxoak erabil daitezke.
 Gutxienez goi mailako domeinua behar du, adibidez "*.org".<br />
-Baimendutako protokoloak: <code>$1</code> (zure bilaketan hauek ez gehitu).',
+Baimendutako protokoloak: <code>$1</code> (protokoloa zehazten ez bada http:// hartzen da lehenetsitzat).',
 'linksearch-line' => '$1, $2(e)tik lotuta',
 'linksearch-error' => 'Komodinak izenaren hasieran bakarrik agertu beharko lirateke.',
 
@@ -1913,7 +1922,7 @@ Badago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako
 
 # Watchlist
 'watchlist' => 'Nire jarraipen zerrenda',
-'mywatchlist' => 'Nire jarraipen zerrenda',
+'mywatchlist' => 'Jarraipen zerrenda',
 'watchlistfor2' => '$1 ($2)',
 'nowatchlist' => 'Zure jarraipen zerrenda hutsik dago.',
 'watchlistanontext' => 'Mesedez $1 zure jarraipen zerrendako orrialdeak ikusi eta aldatu ahal izateko.',
@@ -1947,11 +1956,7 @@ Jarraipen zerrendatik artikulua kentzeko, artikuluan ''ez jarraitu''ri eman.",
 
 'enotif_mailer' => '{{SITENAME}}(e)ko Oharpen Postaria',
 'enotif_reset' => 'Orrialde guztiak bisitatu bezala markatu',
-'enotif_newpagetext' => 'Honako hau orrialde berria da.',
 'enotif_impersonal_salutation' => '{{SITENAME}} erabiltzailea',
-'changed' => 'aldatu',
-'created' => 'sortu',
-'enotif_subject' => '{{SITENAME}}(e)ko $PAGETITLE orrialdea $PAGEEDITOR(e)k $CHANGEDORCREATED du',
 'enotif_lastvisited' => 'Jo $1 orrialdera zure azken bisitaz geroztik izandako aldaketa guztiak ikusteko.',
 'enotif_lastdiff' => 'Jo $1(e)ra aldaketa hau ikusteko.',
 'enotif_anon_editor' => '$1 erabiltzaile anonimoa',
@@ -2161,7 +2166,7 @@ $1',
 # Contributions
 'contributions' => 'Lankidearen ekarpenak',
 'contributions-title' => '$1(r)entzat lankidearen ekarpenak',
-'mycontris' => 'Nire ekarpenak',
+'mycontris' => 'Ekarpenak',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Ez da ezaugarri horiekin bat datorren aldaketarik aurkitu.',
 'uctop' => ' (Azken aldaketa)',
@@ -2185,7 +2190,7 @@ Blokeo erregistroa azken sarrera ematen da azpian erreferentziarako:',
 'sp-contributions-submit' => 'Bilatu',
 
 # What links here
-'whatlinkshere' => 'Orri honetaranzko lotura dutenak',
+'whatlinkshere' => 'Honanzko lotura duten orriak',
 'whatlinkshere-title' => '$1(e)ra lotura duten orriak',
 'whatlinkshere-page' => 'Orrialdea:',
 'linkshere' => "Hauek dute '''[[:$1]]''' orrialderako lotura:",
@@ -2200,10 +2205,11 @@ Blokeo erregistroa azken sarrera ematen da azpian erreferentziarako:',
 'whatlinkshere-hideredirs' => '$1 birzuzenketak',
 'whatlinkshere-hidetrans' => '$1 transklusioak',
 'whatlinkshere-hidelinks' => '$1 loturak',
-'whatlinkshere-hideimages' => '$1 irudiak loturak ditu',
+'whatlinkshere-hideimages' => '$1 irudi loturak',
 'whatlinkshere-filters' => 'Iragazleak',
 
 # Block/unblock
+'autoblockid' => 'Blokeo automatikoa #$1',
 'block' => 'Erabiltzailea blokeatu',
 'unblock' => 'Erabiltzailea desblokeatu',
 'blockip' => 'Erabiltzailea blokeatu',
@@ -2372,7 +2378,7 @@ Kasu horietan orrialdea eskuz mugitu edo bestearekin bateratu beharko duzu.",
 'move-subpages' => 'Azpiorrialde guztiak ($1-tik gora) mugitu',
 'move-talk-subpages' => 'Azpiorrialdeen eztabaida orrialde guztiak ($1-tik gora) mugitu',
 'movepage-page-exists' => '$1 orrialdea jada badago eta ezin da automatikoki gainetik idatzi.',
-'movepage-page-moved' => '$1 orrialdea $2(e)ra mugitu da.',
+'movepage-page-moved' => '$1 orria $2 izenera aldatu da.',
 'movepage-page-unmoved' => '$1 orrialdea ezin da $2(e)ra mugitu.',
 'movepage-max-pages' => '$1 {{PLURAL:$1|orrialderen|orrialdeen}} maximoa mugitu da eta jada ez dira gehiago mugituko modu automatikoan.',
 'movelogpage' => 'Mugimendu erregistroa',
@@ -2534,7 +2540,7 @@ Fitxategiaren atal bat baino ez zen igo.',
 'tooltip-n-randompage' => 'Ausazko orrialde bat kargatu',
 'tooltip-n-help' => 'Aurkitzeko lekua.',
 'tooltip-t-whatlinkshere' => 'Orri honetara lotura duten wiki orri guztien zerrenda',
-'tooltip-t-recentchangeslinked' => 'Orrialde honetatik lotutako orrialdeen azken aldaketak',
+'tooltip-t-recentchangeslinked' => 'Orri honetatik lotura duten orrietako azken aldaketak',
 'tooltip-feed-rss' => 'Orrialde honen RSS jarioa',
 'tooltip-feed-atom' => 'Orrialde honen atom jarioa',
 'tooltip-t-contributions' => 'Lankide honen ekarpen zerrenda ikusi',
@@ -2599,9 +2605,39 @@ Baliteke zerrenda beltzean dagoen kanpo lotura batek sortzea arazo hori.',
 'spam_blanking' => 'Berrikuspen guztiek $1(e)rako lotura zeukaten, husten',
 
 # Info page
+'pageinfo-header-basic' => 'Oinarrizko informazioa',
 'pageinfo-header-edits' => 'Aldaketen historia',
+'pageinfo-header-restrictions' => 'Orriaren babesa',
+'pageinfo-header-properties' => 'Orriaren propietateak',
+'pageinfo-display-title' => 'Ageri den izenburua',
+'pageinfo-default-sort' => 'Ordenatze irizpide lehenetsia',
+'pageinfo-length' => 'Orriaren neurria (byteak)',
+'pageinfo-article-id' => 'Orriaren identifikazio zenbakia',
+'pageinfo-language' => 'Orriaren edukiaren hizkuntza',
+'pageinfo-robot-policy' => 'Bilaketa motorraren egoera',
+'pageinfo-robot-index' => 'Indexagarria',
+'pageinfo-robot-noindex' => 'Indexaezina',
 'pageinfo-views' => 'Bistaratze-kopurua',
-'pageinfo-edits' => 'Aldaketa kopuru totala',
+'pageinfo-watchers' => 'Orriaren jarraitzaileen kopurua',
+'pageinfo-redirects-name' => 'Orri honetara dakarten birzuzenketak',
+'pageinfo-subpages-name' => 'Orri honen azpiorriak',
+'pageinfo-firstuser' => 'Orriaren sortzailea',
+'pageinfo-firsttime' => 'Orriaren sortze data',
+'pageinfo-lastuser' => 'Azken editorea',
+'pageinfo-lasttime' => 'Azken edizioaren data',
+'pageinfo-edits' => 'Edizio kopurua, guztira',
+'pageinfo-authors' => 'Egile kopurua, guztira',
+'pageinfo-recent-edits' => 'Oraintsuko edizioen kopurua (azken $1)',
+'pageinfo-recent-authors' => 'Oraintsuko egileen kopurua',
+'pageinfo-hidden-categories' => 'Ezkutuko {{PLURAL:$1|kategoria|kategoriak}} ($1)',
+'pageinfo-templates' => 'Txertatutako {{PLURAL:$1|txantiloia|txantiloiak}} ($1)',
+'pageinfo-toolboxlink' => 'Orri honen datuak',
+'pageinfo-redirectsto-info' => 'Informazioa',
+'pageinfo-contentpage' => 'Eduki-orritzat zenbatua',
+'pageinfo-contentpage-yes' => 'Bai',
+'pageinfo-protect-cascading' => 'Serieko babesa, orri honetatik',
+'pageinfo-protect-cascading-yes' => 'Bai',
+'pageinfo-protect-cascading-from' => 'Serieko babesak aktibatuta. Sorburua:',
 
 # Skin names
 'skinname-standard' => 'Lehenetsia',
@@ -3123,7 +3159,7 @@ Egiaztapen kode hau $4 iraungiko da.',
 'autosumm-blank' => 'Orritik eduki guztia ezabatuta',
 'autosumm-replace' => 'Orriaren edukiaren ordez, «$1» jarri da',
 'autoredircomment' => '[[$1]] orrialdera birzuzentzentzen',
-'autosumm-new' => 'Orrialde berria $1-(e)kin sortua',
+'autosumm-new' => 'Orria sortu da. Edukia: $1',
 
 # Live preview
 'livepreview-loading' => 'Kargatzen…',
@@ -3210,12 +3246,12 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 'fileduplicatesearch-result-n' => '"$1" fitxategiak {{PLURAL:$2|kopia zehatz bakarra du|$2 kopia zehatz ditu}}.',
 
 # Special:SpecialPages
-'specialpages' => 'Orrialde bereziak',
+'specialpages' => 'Orri bereziak',
 'specialpages-note' => '----
-* Orrialde berezi arruntak.
-* <strong class="mw-specialpagerestricted">Mugatutako orrialde bereziak.</strong>',
+* Orri berezi arruntak.
+* <strong class="mw-specialpagerestricted">Mugatutako orri bereziak.</strong>',
 'specialpages-group-maintenance' => 'Mantentze-oharrak',
-'specialpages-group-other' => 'Beste orrialde berezi batzuk',
+'specialpages-group-other' => 'Beste orri berezi batzuk',
 'specialpages-group-login' => 'Saioa hasi / kontua sortu',
 'specialpages-group-changes' => 'Aldaketa berriak eta erregistroak',
 'specialpages-group-media' => 'Artxiboen orriak',
@@ -3287,6 +3323,12 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 # New logging system
 'revdelete-restricted' => 'administratzaileentzako mugak ezarri dira',
 'revdelete-unrestricted' => 'administratzaileentzako mugak kendu dira',
+'logentry-move-move' => '$1 wikilariak «$3» orria «$4» izenera aldatu du',
+'logentry-move-move-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketarik utzi gabe',
+'logentry-move-move_redir-noredirect' => '$1 wikilariak «$3» orria «$4» izenera aldatu du, birzuzenketa bat gainidatzita, birzuzenketarik utzi gabe',
+'logentry-newusers-newusers' => '$1 wikilariak erabiltzaile kontu bat sortu du',
+'logentry-newusers-create' => '$1 wikilariak erabiltzaile kontu bat sortu du',
+'logentry-newusers-create2' => '$1 wikilariak $3 erabiltzaile kontu bat sortu du',
 'newuserlog-byemail' => 'pasahitza e-postaz bidali da',
 
 # Feedback
@@ -3295,4 +3337,8 @@ Irudiak bereizmen handienean daude, bestelako fitxategi motak beraiei esleitutak
 'feedback-cancel' => 'Utzi',
 'feedback-submit' => 'Feedbacka bidali',
 
+# Search suggestions
+'searchsuggest-search' => 'Bilatu',
+'searchsuggest-containing' => 'edukian...',
+
 );
index 533c28c..10cb2b8 100644 (file)
@@ -153,7 +153,6 @@ $messages = array(
 'qbbrowse' => 'Escrucal',
 'qbedit' => 'Eital',
 'qbpageoptions' => 'Esta páhina',
-'qbpageinfo' => 'Contestu',
 'qbmyoptions' => 'Las mis páhinas',
 'qbspecialpages' => 'Páhinas especialis',
 'faq' => 'FAQ',
@@ -377,12 +376,8 @@ La razón es la siguienti: ''$2''.",
 
 # Login and logout pages
 'logouttext' => "'''Cuenta afechá corretamenti.'''<br />
-Pueis acontinal gastandu {{SITENAME}} de holma anónima, u [[Special:UserLogin|entral ena tu cuenta]] con el mesmu ussuáriu, u con otru.
+Pueis acontinal gastandu {{SITENAME}} de holma anónima, u <span class='plainlinks'>[$1 entral ena tu cuenta]</span> con el mesmu ussuáriu, u con otru.
 Dati cuenta que hata que nu esborris el caché del tu escrucaol pué paecel que la tu cuenta acontina abierta n'angunas páginas.",
-'welcomecreation' => "== Bienviniu, $1! ==
-
-La tu cuenta d'ussuáriu á siu criá.
-Alcuerdati de chambal las tus [[Special:Preferences|preferéncias de {{SITENAME}}]].",
 'yourname' => "Nombri d'usuáriu:",
 'yourpassword' => 'Consínia:',
 'yourpasswordagain' => 'Escrebi e nuevu la consínia:',
@@ -790,8 +785,6 @@ Asigurati e qu'esti chambu mantenga la continuiá el estorial la páhina.",
 'search-interwiki-caption' => 'Proyeutus helmanus',
 'search-interwiki-default' => '$1 resurtaus:',
 'search-interwiki-more' => '(más)',
-'search-mwsuggest-enabled' => 'muestral sugeréncias',
-'search-mwsuggest-disabled' => 'nu muestral sugeréncias',
 'searchrelated' => 'relacionau',
 'searchall' => 'tó',
 'showingresults' => "Embahu se {{PLURAL:$1|muestra '''1''' resurtau qu'esmiença|muestran hata '''$1''' resurtaus qu'esmiençan}} pol #'''$2'''.",
@@ -1424,11 +1417,7 @@ Si quieis ehal de vehilal la páhina, pursa sobri \"Ehal de vehilal\".",
 
 'enotif_mailer' => 'Notificaeru pol correu e {{SITENAME}}',
 'enotif_reset' => 'Aseñalal tolas páhinas vesitás',
-'enotif_newpagetext' => 'Esta páhina es nueva.',
 'enotif_impersonal_salutation' => 'usuáriu e {{SITENAME}}',
-'changed' => 'chambau',
-'created' => 'criá',
-'enotif_subject' => '{{SITENAME}}: la páhina $PAGETITLE á siu $CHANGEDORCREATED pol $PAGEEDITOR',
 'enotif_lastvisited' => 'Vai pa $1 pa visoreal tolos chambus hechus dendi la tu úrtima vesita.',
 'enotif_lastdiff' => 'Vai pa $1 pa visoreal esti chambu.',
 'enotif_anon_editor' => 'usuáriu anónimu $1',
index 775a1ba..e39c909 100644 (file)
@@ -39,6 +39,9 @@
  * @author محک
  */
 
+$rtl = true;
+$fallback8bitEncoding = 'windows-1256';
+
 $namespaceNames = array(
        NS_MEDIA            => 'مدیا',
        NS_SPECIAL          => 'ویژه',
@@ -88,7 +91,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'مشارکت‌های_حذف_شده' ),
        'Disambiguations'           => array( 'ابهام‌زدایی' ),
        'DoubleRedirects'           => array( 'تغییرمسیرهای_دوتایی' ),
-       'EditWatchlist'             => array( 'ویرایش_پی‌گیری‌ها' ),
+       'EditWatchlist'             => array( 'Ù\88Û\8cراÛ\8cØ´_Ù\81Ù\87رست_Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا' ),
        'Emailuser'                 => array( 'نامه_به_کاربر' ),
        'Export'                    => array( 'برون_بری_صفحه' ),
        'Fewestrevisions'           => array( 'کمترین_نسخه' ),
@@ -135,7 +138,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'تغییرات_اخیر' ),
        'Recentchangeslinked'       => array( 'تغییرات_مرتبط' ),
        'Revisiondelete'            => array( 'حذف_نسخه' ),
-       'RevisionMove'              => array( 'انتقال_نسخه' ),
        'Search'                    => array( 'جستجو' ),
        'Shortpages'                => array( 'صفحه‌های_کوتاه' ),
        'Specialpages'              => array( 'صفحه‌های_ویژه' ),
@@ -167,102 +169,6 @@ $specialPageAliases = array(
        'Withoutinterwiki'          => array( 'بدون_میان‌ویکی' ),
 );
 
-
-
-$digitTransformTable = array(
-       '0' => '۰', # &#x06f0;
-       '1' => '۱', # &#x06f1;
-       '2' => '۲', # &#x06f2;
-       '3' => '۳', # &#x06f3;
-       '4' => '۴', # &#x06f4;
-       '5' => '۵', # &#x06f5;
-       '6' => '۶', # &#x06f6;
-       '7' => '۷', # &#x06f7;
-       '8' => '۸', # &#x06f8;
-       '9' => '۹', # &#x06f9;
-       '%' => '٪', # &#x066a;
-       '.' => '٫', # &#x066b; wrong table?
-       ',' => '٬', # &#x066c;
-);
-
-$fallback8bitEncoding = 'windows-1256';
-
-$rtl = true;
-
-
-/**
- * A list of date format preference keys which can be selected in user
- * preferences. New preference keys can be added, provided they are supported
- * by the language class's timeanddate(). Only the 5 keys listed below are
- * supported by the wikitext converter (DateFormatter.php).
- *
- * The special key "default" is an alias for either dmy or mdy depending on
- * $wgAmericanDates
- */
-$datePreferences = array(
-       'default',
-       'mdy',
-       'dmy',
-       'ymd',
-       'persian',
-       'hebrew',
-       'ISO 8601',
-);
-
-/**
- * The date format to use for generated dates in the user interface.
- * This may be one of the above date preferences, or the special value
- * "dmy or mdy", which uses mdy if $wgAmericanDates is true, and dmy
- * if $wgAmericanDates is false.
- */
-$defaultDateFormat = 'dmy or mdy';
-
-/**
- * Associative array mapping old numeric date formats, which may still be
- * stored in user preferences, to the new string formats.
- */
-$datePreferenceMigrationMap = array(
-       'default',
-       'mdy',
-       'dmy',
-       'ymd'
-);
-
-/**
- * These are formats for dates generated by MediaWiki (as opposed to the wikitext
- * DateFormatter). Documentation for the format string can be found in
- * Language.php, search for sprintfDate.
- *
- * This array is automatically inherited by all subclasses. Individual keys can be
- * overridden.
- */
-$dateFormats = array(
-    # Please be cautious not to delete the invisible RLM from the beginning of the strings.
-       'mdy time' => '‏H:i',
-       'mdy date' => '‏n/j/Y میلادی',
-       'mdy both' => '‏n/j/Y میلادی، ساعت H:i',
-
-       'dmy time' => '‏H:i',
-       'dmy date' => '‏j xg Y',
-       'dmy both' => '‏j xg Y، ساعت H:i',
-
-       'ymd time' => '‏H:i',
-       'ymd date' => '‏Y/n/j میلادی',
-       'ymd both' => '‏Y/n/j میلادی، ساعت H:i',
-
-       'persian time' => '‏H:i',
-       'persian date' => '‏xij xiF xiY',
-       'persian both' => '‏xij xiF xiY، ساعت H:i',
-
-       'hebrew time' => '‏H:i',
-       'hebrew date' => '‏xij xjF xjY',
-       'hebrew both' => '‏H:i, xij xjF xjY',
-
-       'ISO 8601 time' => 'xnH:xni:xns',
-       'ISO 8601 date' => 'xnY-xnm-xnd',
-       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
-);
-
 $magicWords = array(
        'redirect'                  => array( '0', '#تغییر_مسیر', '#تغییرمسیر', '#REDIRECT' ),
        'notoc'                     => array( '0', '__بی‌فهرست__', '__NOTOC__' ),
@@ -270,7 +176,6 @@ $magicWords = array(
        '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' ),
@@ -418,6 +323,95 @@ $magicWords = array(
        'defaultsort_noreplace'     => array( '0', 'جایگزین‌نکن', 'جایگزین_نکن', 'noreplace' ),
 );
 
+$digitTransformTable = array(
+       '0' => '۰', # &#x06f0;
+       '1' => '۱', # &#x06f1;
+       '2' => '۲', # &#x06f2;
+       '3' => '۳', # &#x06f3;
+       '4' => '۴', # &#x06f4;
+       '5' => '۵', # &#x06f5;
+       '6' => '۶', # &#x06f6;
+       '7' => '۷', # &#x06f7;
+       '8' => '۸', # &#x06f8;
+       '9' => '۹', # &#x06f9;
+       '%' => '٪', # &#x066a;
+       '.' => '٫', # &#x066b; wrong table?
+       ',' => '٬', # &#x066c;
+);
+
+/**
+ * A list of date format preference keys which can be selected in user
+ * preferences. New preference keys can be added, provided they are supported
+ * by the language class's timeanddate(). Only the 5 keys listed below are
+ * supported by the wikitext converter (DateFormatter.php).
+ *
+ * The special key "default" is an alias for either dmy or mdy depending on
+ * $wgAmericanDates
+ */
+$datePreferences = array(
+       'default',
+       'mdy',
+       'dmy',
+       'ymd',
+       'persian',
+       'hebrew',
+       'ISO 8601',
+);
+
+/**
+ * The date format to use for generated dates in the user interface.
+ * This may be one of the above date preferences, or the special value
+ * "dmy or mdy", which uses mdy if $wgAmericanDates is true, and dmy
+ * if $wgAmericanDates is false.
+ */
+$defaultDateFormat = 'dmy or mdy';
+
+/**
+ * Associative array mapping old numeric date formats, which may still be
+ * stored in user preferences, to the new string formats.
+ */
+$datePreferenceMigrationMap = array(
+       'default',
+       'mdy',
+       'dmy',
+       'ymd'
+);
+
+/**
+ * These are formats for dates generated by MediaWiki (as opposed to the wikitext
+ * DateFormatter). Documentation for the format string can be found in
+ * Language.php, search for sprintfDate.
+ *
+ * This array is automatically inherited by all subclasses. Individual keys can be
+ * overridden.
+ */
+$dateFormats = array(
+    # Please be cautious not to delete the invisible RLM from the beginning of the strings.
+       'mdy time' => '‏H:i',
+       'mdy date' => '‏n/j/Y میلادی',
+       'mdy both' => '‏n/j/Y میلادی، ساعت H:i',
+
+       'dmy time' => '‏H:i',
+       'dmy date' => '‏j xg Y',
+       'dmy both' => '‏j xg Y، ساعت H:i',
+
+       'ymd time' => '‏H:i',
+       'ymd date' => '‏Y/n/j میلادی',
+       'ymd both' => '‏Y/n/j میلادی، ساعت H:i',
+
+       'persian time' => '‏H:i',
+       'persian date' => '‏xij xiF xiY',
+       'persian both' => '‏xij xiF xiY، ساعت H:i',
+
+       'hebrew time' => '‏H:i',
+       'hebrew date' => '‏xij xjF xjY',
+       'hebrew both' => '‏H:i, xij xjF xjY',
+
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+);
+
 # Harakat are intentionally not included in the linkTrail. Their addition should
 # take place after enough tests.
 $linkTrail = "/^([ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیآأئؤة‌]+)(.*)$/sDu";
@@ -480,7 +474,7 @@ $messages = array(
 
 'underline-always' => 'همیشه',
 'underline-never' => 'هرگز',
-'underline-default' => 'پیش‌فرض مرورگر',
+'underline-default' => 'پوسته یا مرورگر پیش‌فرض',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'سبک قلم جعبهٔ ویرایش:',
@@ -565,8 +559,8 @@ $messages = array(
 'newwindow' => '(در پنجرهٔ جدید باز می‌شود)',
 'cancel' => 'لغو',
 'moredotdotdot' => 'بیشتر...',
-'mypage' => 'صفحهٔ من',
-'mytalk' => 'بحث من',
+'mypage' => 'صفحه',
+'mytalk' => 'بحث',
 'anontalk' => 'بحث برای این آی‌پی',
 'navigation' => 'گشتن',
 'and' => '&#32;و',
@@ -576,7 +570,6 @@ $messages = array(
 'qbbrowse' => 'مرور',
 'qbedit' => 'ویرایش',
 'qbpageoptions' => 'این صفحه',
-'qbpageinfo' => 'محتوا',
 'qbmyoptions' => 'صفحه‌های من',
 'qbspecialpages' => 'صفحه‌های ویژه',
 'faq' => 'پرسش‌های متداول',
@@ -589,7 +582,7 @@ $messages = array(
 'vector-action-protect' => 'محافظت',
 'vector-action-undelete' => 'احیا',
 'vector-action-unprotect' => 'تغییر سطح حفاظت',
-'vector-simplesearch-preference' => 'فعال کردن پیشنهادهای جستجوی پیشرفته (فقط در پوستهٔ برداری)',
+'vector-simplesearch-preference' => 'فعال کردن جستجوی ساده (فقط در پوستهٔ برداری)',
 'vector-view-create' => 'ایجاد',
 'vector-view-edit' => 'ویرایش',
 'vector-view-history' => 'نمایش تاریخچه',
@@ -599,6 +592,7 @@ $messages = array(
 'namespaces' => 'فضاهای نام',
 'variants' => 'گویش‌ها',
 
+'navigation-heading' => 'منوی ناوبری',
 'errorpagetitle' => 'خطا',
 'returnto' => 'بازگشت به $1.',
 'tagline' => 'از {{SITENAME}}',
@@ -673,15 +667,15 @@ $1',
 'disclaimers' => 'تکذیب‌نامه‌ها',
 'disclaimerpage' => 'Project:تکذیب‌نامهٔ عمومی',
 'edithelp' => 'راهنمای ویرایش‌کردن',
-'edithelppage' => 'Help:چگونه صفحه‌ها را ویرایش کنیم',
-'helppage' => 'Help:محتویات',
+'edithelppage' => 'Help:ویرایش',
+'helppage' => 'Help:محتوا',
 'mainpage' => 'صفحهٔ اصلی',
 'mainpage-description' => 'صفحهٔ اصلی',
 'policy-url' => 'Project:سیاست‌ها',
 'portal' => 'ورودی کاربران',
 'portal-url' => 'Project:ورودی کاربران',
-'privacy' => 'سیاست حفظ اسرار',
-'privacypage' => 'Project:سیاست حفظ اسرار',
+'privacy' => 'سیاست محرمانگی',
+'privacypage' => 'Project:سیاست محرمانگی',
 
 'badaccess' => 'خطای دسترسی',
 'badaccess-group0' => 'شما اجازهٔ اجرای عملی را که درخواست کرده‌اید ندارید.',
@@ -697,10 +691,10 @@ $1',
 'youhavenewmessages' => '$1 دارید ($2).',
 'newmessageslink' => 'پیام‌های جدید',
 'newmessagesdifflink' => 'آخرین تغییر',
-'youhavenewmessagesfromusers' => 'شما  $1  از  {{PLURAL:$3| کاربر دیگر| $3  کاربر}} دارید ( $2 ).',
-'youhavenewmessagesmanyusers' => 'شما  $1  از تعدادی کاربر دارید ( $2 ).',
-'newmessageslinkplural' => '{{PLURAL:$1|پیام جدید |پیام جدید}}',
-'newmessagesdifflinkplural' => '{{formatnum:$1}} {{PLURAL:$1|تغییر|تغییرات}} اخیر',
+'youhavenewmessagesfromusers' => 'شما از {{PLURAL:$3|یک کاربر دیگر|$3  کاربر}} $1 دارید ($2).',
+'youhavenewmessagesmanyusers' => 'شما از تعدادی کاربر $1 دارید ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|پیام جدید}}',
+'newmessagesdifflinkplural' => '{{formatnum:$1}} {{PLURAL:$1|تغییر|تغییر}} اخیر',
 'youhavenewmessagesmulti' => 'پیام‌های جدیدی در $1 دارید.',
 'editsection' => 'ویرایش',
 'editold' => 'ویرایش',
@@ -815,13 +809,14 @@ $1',
 'actionthrottled' => 'جلوی عمل شما گرفته شد',
 'actionthrottledtext' => 'به منظور جلوگیری از انتشار اسپم، اجازه ندارید که چنین عملی را بیش از چند بار در یک مدت زمان کوتاه انجام بدهید.
 لطفاً پس از چند دقیقه دوباره تلاش کنید.',
-'protectedpagetext' => 'این صفحه برای جلوگیری از ویرایش محافظت شده‌است.',
+'protectedpagetext' => 'این صفحه برای جلوگیری از ویرایش یا فعالیت دیگر محافظت شده‌است.',
 'viewsourcetext' => 'می‌توانید متن مبدأ این صفحه را مشاهده کنید یا از آن نسخه بردارید:',
 'viewyourtext' => "می‌توانید کد مبدأ '''ویرایش‌هایتان''' در این صفحه را ببینید و کپی کنید:",
-'protectedinterface' => 'این صفحه ارائه‌دهندهٔ متنی برای واسط کاربر این نرم‌افزار است و به منظور پیشگیری از خرابکاری محافظت شده‌است.',
-'editinginterface' => "'''هشدار:''' صفحه‌ای را که ویرایش می‌کنید شامل متنی است که در واسط کاربر این نرم‌افزار به کار رفته‌است.
+'protectedinterface' => 'این صفحه ارائه‌دهندهٔ متنی برای واسط کاربر این نرم‌افزار در این ویکی است و به منظور پیشگیری از خرابکاری محافظت شده‌است.
+برای افزودن یا تغییر دادن ترجمه برای همهٔ ویکی‌ها، لطفاً از [//translatewiki.net/ translatewiki.net]، پروژهٔ محلی‌سازی مدیاویکی، استفاده کنید.',
+'editinginterface' => "'''هشدار:''' صفحه‌ای که ویرایش می‌کنید شامل متنی است که در واسط کاربر این نرم‌افزار به کار رفته‌است.
 تغییر این صفحه منجر به تغییر ظاهر واسط کاربر این نرم‌افزار برای دیگر کاربران خواهد شد.
-براÛ\8c ØªØ±Ø¬Ù\85Ù\87 Ù\84Ø·Ù\81اÙ\8b Ø§Ø² [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] (پرÙ\88Ú\98Ù\87Ù\94 ØªØ±Ø¬Ù\85Ù\87Ù\94 Ù\85دÛ\8cاÙ\88Û\8cÚ©Û\8c) استفاده کنید.",
+براÛ\8c Ø§Ù\81زÙ\88دÙ\86 Û\8cا ØªØºÛ\8cÛ\8cر Ø¯Ø§Ø¯Ù\86 ØªØ±Ø¬Ù\85Ù\87 Ø¨Ø±Ø§Û\8c Ù\87Ù\85Ù\87Ù\94 Ù\88Û\8cÚ©Û\8câ\80\8cÙ\87اØ\8c Ù\84Ø·Ù\81اÙ\8b Ø§Ø² [//translatewiki.net/ translatewiki.net]Ø\8c Ù¾Ø±Ù\88Ú\98Ù\87Ù\94 Ù\85Ø­Ù\84Û\8câ\80\8cسازÛ\8c Ù\85دÛ\8cاÙ\88Û\8cÚ©Û\8cØ\8c استفاده کنید.",
 'sqlhidden' => '(دستور اس‌کیوال پنهان شده)',
 'cascadeprotected' => 'این صفحه در مقابل ویرایش محافظت شده‌است چون در {{PLURAL:$1|صفحهٔ|صفحه‌های}} محافظت‌شدهٔ زیر که گزینهٔ «آبشاری» در {{PLURAL:$1|آن|آن‌ها}} انتخاب شده قرار گرفته‌است:
 $2',
@@ -847,14 +842,12 @@ $2',
 # Login and logout pages
 'logouttext' => "'''هم‌اکنون از سامانه خارج شدید.'''
 
-شما می‌توانید به استفادهٔ گمنام از {{SITENAME}} ادامه دهید، یا با همین حساب کاربری یا حسابی دیگر [[Special:UserLogin|به سامانه وارد شوید]].
+شما می‌توانید به استفادهٔ گمنام از {{SITENAME}} ادامه دهید، یا با همین حساب کاربری یا حسابی دیگر <span class='plainlinks'>[$1 به سامانه وارد شوید]</span>.
 توجه کنید که تا زمانی که میانگیر مرورگرتان را پاک نکنید، بعضی صفحه‌ها ممکن است به گونه‌ای نمایش یابند که گویی هنوز از سامانه خارج نشده‌اید.",
-'welcomecreation' => '==$1، خوش آمدید!==
-حساب شما ایجاد شد.
-فراموش نکنید که [[Special:Preferences|ترجیحات {{SITENAME}}]] را برای خود تغییر دهید.',
+'welcomeuser' => 'خوشامدید، $1!',
 'yourname' => 'نام کاربری:',
 'yourpassword' => 'گذرواژه:',
-'yourpasswordagain' => 'گذرواژه را دوباره وارد کنید',
+'yourpasswordagain' => 'تکرار گذرواژه:',
 'remembermypassword' => 'گذرواژه را (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) در این رایانه به خاطر بسپار',
 'securelogin-stick-https' => 'پس از ورود به سامانه به HTTPS متصل بمان',
 'yourdomainname' => 'دامنهٔ شما:',
@@ -871,8 +864,8 @@ $2',
 'nologin' => 'حساب کاربری ندارید؟ $1.',
 'nologinlink' => 'یک حساب کاربری جدید بسازید',
 'createaccount' => 'ایجاد حساب کاربری',
-'gotaccount' => "حساب کاربری دارید؟ '''$1'''.",
-'gotaccountlink' => 'وارد شوید',
+'gotaccount' => 'حساب کاربری دارید؟ $1.',
+'gotaccountlink' => 'به سامانه وارد شوید',
 'userlogin-resetlink' => 'جزئیات ورود را فراموش کرده‌اید؟',
 'createaccountmail' => 'با رایانامه',
 'createaccountreason' => 'دلیل:',
@@ -904,7 +897,7 @@ $2',
 لطفاً دوباره امتحان کنید.',
 'wrongpasswordempty' => 'گذرواژه‌ای که وارد کرده‌اید، خالی است.
 لطفاً دوباره تلاش کنید.',
-'passwordtooshort' => 'گذرواژه باید دست‌کم {{PLURAL:$1|$1 حرف|$1 حرف}} داشته باشد.',
+'passwordtooshort' => 'گذرواژه باید دست‌کم {{PLURAL:$1|۱ حرف|$1 حرف}} داشته باشد.',
 'password-name-match' => 'گذرواژهٔ شما باید با نام کاربری شما تفاوت داشته باشد.',
 'password-login-forbidden' => 'استفاده از این نام کاربری و گذرواژه ممنوع است.',
 'mailmypassword' => 'گذرواژهٔ جدید با رایانامه فرستاده شود',
@@ -923,7 +916,7 @@ $2',
 'eauthentsent' => 'یک نامه برای تأیید نشانی رایانامه به نشانی موردنظر ارسال شد.
 قبل از اینکه نامهٔ دیگری قابل ارسال به این نشانی باشد، باید دستورهایی که در آن نامه آمده است را جهت تأیید این مساله که این نشانی متعلق به شماست، اجرا کنید.',
 'throttled-mailpassword' => 'یک یادآور گذرواژه در $1 {{PLURAL:$1|ساعت|ساعت}} گذشته برای شما فرستاده شده‌است.
-برای جلوگیری از سوءاستفاده هر  $1 ساعت تنها یک یادآوری فرستاده می‌شود.',
+برای جلوگیری از سوءاستفاده هر $1 {{PLURAL:$1|ساعت|ساعت}} تنها یک یادآوری فرستاده می‌شود.',
 'mailerror' => 'خطا در فرستادن رایانامه: $1',
 'acct_creation_throttle_hit' => 'بازدیدکنندگان این ویکی که از نشانی آی‌پی شما استفاده می‌کنند در روز گذشته {{PLURAL:$1|یک حساب کاربری|$1 حساب کاربری}} ساخته‌اند، که بیشترین تعداد مجاز در آن بازهٔ زمانی است.
 به همین خاطر، بازدیدکنندگانی که از این نشانی آی‌پی استفاده می‌کنند نمی‌توانند در حال حاضر حساب جدیدی بسازند.',
@@ -1006,8 +999,8 @@ $2
 'passwordreset-emailerror-capture' => 'رایانامهٔ یادآور همانطور که در زیر مشاهده می‌فرمایید ایجاد شد ولی ارسال آن به کاربر موفقیت‌آمیز نبود: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'تغییر آدرس پست رایانامه',
-'changeemail-header' => 'تغییر آدرس ایمیل حساب کاربری',
+'changeemail' => 'تغییر نشانی رایانامه',
+'changeemail-header' => 'تغییر نشانی رایانامهٔ حساب کاربری',
 'changeemail-text' => 'این فرم را تکمیل کنید تا آدرس رایانامه‌تان تغییر یابد. برای این که این تغییر را تأیید کنید لازم است گذرواژهٔ خود را وارد کنید.',
 'changeemail-no-info' => 'برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.',
 'changeemail-oldemail' => 'نشانی رایانامهٔ کنونی:',
@@ -1059,32 +1052,30 @@ $2
 'blockedtitle' => 'کاربر بسته شده‌است',
 'blockedtext' => "'''دسترسی حساب کاربری یا نشانی آی‌پی شما بسته شده‌است.'''
 
-این کار توسط $1 انجام شده‌است.
+این قطع دسترسی توسط $1 انجام شده‌است.
 دلیل ارائه‌شده چنین است: $2''
 
 * شروع قطع دسترسی: $8
 * پایان قطع دسترسی: $6
-* کاربری که قطع دسترسی‌اش مد نظر بوده‌است: $7
+* کاربری هدف قطع دسترسی: $7
 
 شما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
-توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]]تان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
 نشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
 لطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
 'autoblockedtext' => "دسترسی نشانی آی‌پی شما قطع شده‌است، زیرا این نشانی آی‌پی توسط کاربر دیگری استفاده شده که دسترسی او توسط $1 قطع شده‌است.
-دلیل ارائه شده چنین است:
+دلیل ارائهشده چنین است:
 
 :''$2''
 
 * شروع قطع دسترسی: $8
 * پایان قطع دسترسی: $6
-* کاربری که قطع دسترسی‌اش مد نظر بوده‌است: $7
+* کاربری هدف قطع دسترسی: $7
 
-شما می‌توانید با $1 یا یکی دیگر از [[{{MediaWiki:Grouppage-sysop}}|مدیران]] تماس بگیرید، تا پیرامون این قطع دسترسی صحبت کنید.
-
-توجه کنید که برای ارسال رایانامه در ویکی، باید رایانامهٔ خود را از طریق صفحهٔ [[Special:Preferences|تنظیمات]] فعال کرده باشید، و نیز، باید امکان استفاده از این ویژگی برای شما قطع نباشد.
-
-نشانی آی‌پی فعلی شما $3 است و شمارهٔ قطع دسترسی $5 است.
-لطفاً این شماره را در هر درخواستی که در این باره مطرح می‌کنید ذکر کنید.",
+شما می‌توانید با $1 یا  [[{{MediaWiki:Grouppage-sysop}}|مدیری]] دیگر تماس بگیرید و در این باره صحبت کنید.
+توجه کنید که شما نمی‌توانید از ویژگی «فرستادن رایانامه به این کاربر» استفاده کنید مگر آنکه نشانی رایانامه معتبری در [[Special:Preferences|ترجیحات کاربری]] خودتان ثبت کرده باشید و نیز باید امکان استفاده از این ویژگی برای شما قطع نشده باشد.
+نشانی آی‌پی فعلی شما $3 و شمارهٔ قطع دسترسی شما $5 است.
+لطفاً تمامی جزئیات فوق را در کلیهٔ درخواست‌هایی که در این باره مطرح می‌کنید ذکر کنید.",
 'blockednoreason' => 'دلیلی مشخص نشده‌است',
 'whitelistedittext' => 'برای ویرایش مقاله‌ها باید $1.',
 'confirmedittext' => 'شما باید، پیش از ویرایش صفحه‌ها، نشانی رایانامهٔ خود را مشخص و تأیید کنید. لطفاً از طریق [[Special:Preferences|ترجیحات کاربر]] این کار را صورت دهید.',
@@ -1112,7 +1103,7 @@ $2
 یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} این صفحه را ویرایش کنید]</span>.',
 'noarticletext-nopermission' => 'این صفحه هم‌اکنون متنی ندارد.
 شما می‌توانید در دیگر صفحه‌ها [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،
-یا <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span>.',
+یا <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.',
 'missing-revision' => 'ویرایش #$1 از صفحهٔ "{{PAGENAME}}" موجود نیست.
 
 معمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.
@@ -1122,13 +1113,13 @@ $2
 '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'' را با هم فشار دهید
 *'''اپرا:''' حافظهٔ نهانی مرورگر را از طریق منوی ''Tools &rarr; Preferences'' پاک کنید",
-'usercssyoucanpreview' => "'''نکته:''' پیش از ذخیه‌کردن فایل CSS یا JS خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
-'userjsyoucanpreview' => "'''نکته:''' پیش از ذخیره‌کردن فایل CSS یا JS خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'usercssyoucanpreview' => "'''نکته:''' پیش از ذخیره‌کردن فایل سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
+'userjsyoucanpreview' => "'''نکته:''' پیش از ذخیره‌کردن فایل جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
 'usercsspreview' => "'''فراموش مکنید که شما فقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''
 '''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
 'userjspreview' => "'''به یاد داشته باشید که شما فقط دارید جاوااسکریپت کاربری‌تان را امتحان می‌کنید/پیش‌نمایش آن را می‌بینید.'''
@@ -1143,7 +1134,7 @@ $2
 'note' => "'''نکته:'''",
 'previewnote' => "'''به یاد داشته باشید که این فقط پیش‌نمایش است.'''
 تغییرات شما هنوز ذخیره نشده‌است!",
-'continue-editing' => 'اداÙ\85Ù\87Ù\94 ویرایش',
+'continue-editing' => 'رÙ\81تÙ\86 Ø¨Ù\87 Ù\82سÙ\85ت ویرایش',
 'previewconflict' => 'این پیش‌نمایش منعکس‌کنندهٔ متن ناحیهٔ ویرایش متن بالایی است، به شکلی که اگر متن را ذخیره کنید نمایش خواهد یافت.',
 'session_fail_preview' => "'''شرمنده! به علت از دست رفتن اطلاعات نشست کاربری نمی‌توانیم ویرایش شما را پردازش کنیم.'''
 لطفاً دوباره سعی کنید.
@@ -1154,7 +1145,7 @@ $2
 
 '''اگر مطمئن هستید که این پیش‌نمایش یک ویرایش مجاز است، آن را تکرار کنید.'''
 اگر تکرار پیش‌نمایش نتیجه نداد، از سامانه [[Special:UserLogout|خارج شوید]] و دوباره وارد شوید.",
-'token_suffix_mismatch' => "'''ویرایش شما ذخیره نشد، زیرا مرورگر شما نویسه‌های نقطه‌گذاری را از هم پاشیده‌است.'''
+'token_suffix_mismatch' => "'''Ù\88Û\8cراÛ\8cØ´ Ø´Ù\85ا Ø°Ø®Û\8cرÙ\87 Ù\86شدØ\8c Ø²Û\8cرا Ù\85رÙ\88رگر Ø´Ù\85ا Ù\86Ù\88Û\8cسÙ\87â\80\8cÙ\87اÛ\8c Ù\86Ù\82Ø·Ù\87â\80\8cگذارÛ\8c Ø±Ø§ Ø¯Ø± Ú©Ø¯ Ø§Ù\85Ù\86Û\8cتÛ\8c Ù\88Û\8cراÛ\8cØ´ Ø§Ø² Ù\87Ù\85 Ù¾Ø§Ø´Û\8cدÙ\87â\80\8cاست.'''
 ویرایش شما مردود شد تا از خراب شدن متن صفحه جلوگیری شود.
 گاهی این اشکال زمانی پیش می‌آید که شما از یک پروکسی تحت وب استفاده کنید.",
 'edit_form_incomplete' => "'''بعضی قسمت‌های فرم ویرایش به سرور نرسیدند؛ اطمینان حاصل کنید که ویرایش‌های شما کامل است و دوباره تلاش کنید.'''",
@@ -1228,6 +1219,15 @@ $2
 'edit-already-exists' => 'امکان ساختن صفحهٔ جدید وجود ندارد.
 این صفحه از قبل وجود داشته‌است.',
 'defaultmessagetext' => 'متن پیش‌فرض پیغام',
+'content-failed-to-parse' => 'عدم موفقیت در تجزیه محتوای $2 برای مدل $1: $3',
+'invalid-content-data' => 'داده محتوای نامعتبر',
+'content-not-allowed-here' => 'محتوای «$1» در صفحهٔ [[$2]] مجاز نیست',
+
+# Content models
+'content-model-wikitext' => 'ویکی‌متن',
+'content-model-text' => 'متنی ساده',
+'content-model-javascript' => 'جاوااسکریپت',
+'content-model-css' => 'سی‌اس‌اس',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''هشدار:''' این صفحه حاوی تعدادی زیادی فراخوانی دستورهای تجزیه‌گر است.
@@ -1249,7 +1249,7 @@ $2
 'expansion-depth-exceeded-warning' => 'صفحه حداکثر عمق بسط دادن تجاوز کرد',
 'parser-unstrip-loop-warning' => 'حلقه در دستور unstrip پیدا شد',
 'parser-unstrip-recursion-limit' => 'از حداکثر ارجاع در دستور unstrip تجاوز شد ($1)',
-'converter-manual-rule-error' => 'خطا در ساختار کتابچهٔ مبدل زبان',
+'converter-manual-rule-error' => 'خطا در قوانین مبدل دستی زبان',
 
 # "Undo" feature
 'undo-success' => 'این ویرایش را می‌توان خنثی کرد.
@@ -1270,7 +1270,7 @@ $2
 'currentrev' => 'نسخهٔ فعلی',
 'currentrev-asof' => 'نسخهٔ کنونی تا $1',
 'revisionasof' => 'نسخهٔ $1',
-'revision-info' => 'Ù\88Û\8cراÛ\8cØ´ Ø¯Ø± تاریخ $1 توسط $2',
+'revision-info' => 'Ù\86سخÙ\87Ù\94 تاریخ $1 توسط $2',
 'previousrevision' => '→ نسخهٔ قدیمی‌تر',
 'nextrevision' => 'نسخهٔ جدیدتر ←',
 'currentrevisionlink' => 'نمایش نسخهٔ فعلی',
@@ -1279,8 +1279,8 @@ $2
 'last' => 'قبلی',
 'page_first' => 'نخست',
 'page_last' => 'واپسین',
-'histlegend' => 'شرح: (فعلی) = تفاوت با نسخهٔ فعلی،
-(قبلی) = تفاوت با نسخهٔ قبلی، جز = ویرایش جزئی',
+'histlegend' => "انتخاب تفاوت: دکمه‌های گرد کنار ویرایش‌هایی که می‌خواهید با هم مقایسه کنید را علامت بزنید و دکمهٔ Enter را بزنید یا دکمهٔ پایین را فشار دهید.<br />
+اختصارات: '''({{int:cur}})''' = تفاوت با نسخهٔ فعلی، '''({{int:last}})''' = تفاوت با نسخهٔ قبلی، '''({{int:minoreditletter}})''' = ویرایش جزئی.",
 'history-fieldset-title' => 'مرور تاریخچه',
 'history-show-deleted' => 'فقط حذف‌شده',
 'histfirst' => 'قدیمی‌ترین',
@@ -1290,7 +1290,7 @@ $2
 
 # Revision feed
 'history-feed-title' => 'تاریخچهٔ ویرایش‌ها',
-'history-feed-description' => 'تاریخچهٔ ویرایشهای صفحه در ویکی',
+'history-feed-description' => 'تاریخچهٔ ویرایش‌های این صفحه در ویکی',
 'history-feed-item-nocomment' => '$1 در $2',
 'history-feed-empty' => 'صفحهٔ درخواست شده وجود ندارد.
 ممکن است که از ویکی حذف یا اینکه نامش تغییر داده شده باشد.
@@ -1299,20 +1299,20 @@ $2
 # Revision deletion
 'rev-deleted-comment' => '(خلاصه ویرایش حذف شد)',
 'rev-deleted-user' => '(نام کاربری حذف شد)',
-'rev-deleted-event' => '(مورد پاک شد)',
+'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 این نسخه را ببینید].",
+شما کماکان می‌توانید در صورت تمایل [$1 این نسخه را ببینید].",
 'rev-suppressed-text-unhide' => "این ویرایش از این صفحه '''فرونشانده شده‌است'''.
 ممکن است اطلاعات مرتبط با آن در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ فرونشانی] موجود باشد.
-شما به عنوان یک مدیر کماکان می‌توانید در صورت تمایل [$1 این نسخه را ببینید].",
+شما کماکان می‌توانید در صورت تمایل [$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' => "شما نمی‌توانید این تفاوت را مشاهده کنید زیرا یکی از نسخه‌ها '''حذف شده‌است'''.",
@@ -1321,11 +1321,11 @@ $2
 شما کماکان می‌توانید در صورت تمایل [$1 این تفاوت را ببینید].",
 'rev-suppressed-unhide-diff' => "یکی از نسخه‌های این تفاوت '''فرونشانی شده‌است'''.
 ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page=سیاههٔ فرونشانی{{FULLPAGENAMEE}}}}] موجود باشد.
-شما به عنوان یک مدیر کماکان می‌توانید در صورت تمایل [$1 این تفاوت را ببینید].",
+شما کماکان می‌توانید در صورت تمایل [$1 این تفاوت را ببینید].",
 'rev-deleted-diff-view' => "یکی از نسخه‌های این تفاوت '''حذف شده‌است'''.
-شما به عنوان یک مدیر کماکان می‌توانید این تفاوت را ببینید؛ ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
+شما می‌توانید این تفاوت را ببینید؛ ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] موجود باشد.",
 'rev-suppressed-diff-view' => "یکی از نسخه‌های این تفاوت '''فرونشانی شده‌است'''.
-شما به عنوان یک مدیر کماکان می‌توانید این تفاوت را ببینید؛ ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ فرونشانی] موجود باشد.",
+شما می‌توانید این تفاوت را ببینید؛ ممکن است جزئیاتی در [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سیاههٔ فرونشانی] موجود باشد.",
 'rev-delundel' => 'نمایش/نهفتن',
 'rev-showdeleted' => 'نمایش',
 'revisiondelete' => 'حذف/احیای نسخه‌ها',
@@ -1333,7 +1333,7 @@ $2
 'revdelete-nooldid-text' => 'شما نسخه‌های هدف را برای انجام این عمل مشخص نکرده‌اید یا این نسخه‌ها وجود ندارند، یا این که شما می‌خواهید آخرین نسخه را پنهان کنید.',
 'revdelete-nologtype-title' => 'نوع سیاهه مشخص نشده‌است',
 'revdelete-nologtype-text' => 'شما هیچ نوع سیاهه‌ای را برای این کار مشخص نکردید.',
-'revdelete-nologid-title' => 'مدخل غیرمجاز در سیاهه',
+'revdelete-nologid-title' => 'مورد غیرمجاز در سیاهه',
 'revdelete-nologid-text' => 'شما یا رویدادی را در سیاههٔ هدف مشخص نکردید یا موردی را مشخص کردید که وجود ندارد.',
 'revdelete-no-file' => 'پروندهٔ مشخص شده وجود ندارد.',
 'revdelete-show-file-confirm' => 'آیا مطمئن هستید که می‌خواهید یک نسخهٔ حذف شده از پروندهٔ «<nowiki>$1</nowiki>» مورخ $2 ساعت $3 را ببینید؟',
@@ -1413,8 +1413,8 @@ $1",
 'mergehistory-fail' => 'ادغام تاریخچه ممکن نیست، لطفاً گزینه‌های صفحه و زمان را بازبینی کنید.',
 'mergehistory-no-source' => 'صفحهٔ مبدأ $1 وجود ندارد.',
 'mergehistory-no-destination' => 'صفحهٔ مقصد $1 وجود ندارد.',
-'mergehistory-invalid-source' => 'صفحهٔ مبدأ باید عنوان قابل قبولی داشته باشد.',
-'mergehistory-invalid-destination' => 'صفحهٔ مقصد باید عنوان قابل قبولی داشته باشد.',
+'mergehistory-invalid-source' => 'صفحهٔ مبدأ باید عنوانی معتبر داشته باشد.',
+'mergehistory-invalid-destination' => 'صفحهٔ مقصد باید عنوانی معتبر داشته باشد.',
 'mergehistory-autocomment' => '[[:$1]] را در [[:$2]] ادغام کرد',
 'mergehistory-comment' => '[[:$1]] را در [[:$2]] ادغام کرد: $3',
 'mergehistory-same-destination' => 'صفحهٔ مبدأ و مقصد نمی‌تواند یکی باشد',
@@ -1458,11 +1458,11 @@ $1",
 'prevn-title' => '$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} قبلی',
 'nextn-title' => '$1 {{PLURAL:$1|نتیجهٔ|نتیجهٔ}} بعدی',
 'shown-title' => 'نمایش $1 {{PLURAL:$1|نتیجه|نتیجه}} در هر صفحه',
-'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3).',
+'viewprevnext' => 'نمایش ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'گزینه‌های جستجو',
 'searchmenu-exists' => "'''صفحه‌ای با عنوان \"[[:\$1]]\" در این ویکی وجود دارد.'''",
 'searchmenu-new' => "'''صفحهٔ «[[:$1]]» را در این ویکی بسازید!'''",
-'searchhelp-url' => 'Help:راهنما',
+'searchhelp-url' => 'Help:محتوا',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|مرور صفحه‌های با این پیشوند]]',
 'searchprofile-articles' => 'صفحه‌های محتوایی',
 'searchprofile-project' => 'صفحه‌های راهنما و پروژه',
@@ -1483,8 +1483,6 @@ $1",
 'search-interwiki-caption' => 'پروژه‌های خواهر',
 'search-interwiki-default' => '$1 نتیجه:',
 'search-interwiki-more' => '(بیشتر)',
-'search-mwsuggest-enabled' => 'با پیشنهاد',
-'search-mwsuggest-disabled' => 'هیچ پیشنهادی وجود ندارد',
 'search-relatedarticle' => 'مرتبط',
 'mwsuggest-disable' => 'پیشنهادهای مبتنی بر AJAX را غیرفعال کن',
 'searcheverything-enable' => 'جستجو در تمام فضاهای نام',
@@ -1499,7 +1497,7 @@ $1",
 'powersearch' => 'جستجوی پیشرفته',
 'powersearch-legend' => 'جستجوی پیشرفته',
 'powersearch-ns' => 'جستجو در فضاهای نام:',
-'powersearch-redir' => 'تغییرمسیرها فهرست شوند',
+'powersearch-redir' => 'فهرست‌کردن تغییرمسیرها',
 'powersearch-field' => 'جستجو برای',
 'powersearch-togglelabel' => 'بررسی:',
 'powersearch-toggleall' => 'همه',
@@ -1520,7 +1518,7 @@ $1",
 
 # Preferences page
 'preferences' => 'ترجیحات',
-'mypreferences' => 'ترجیحات من',
+'mypreferences' => 'ترجیحات',
 'prefs-edits' => 'تعداد ویرایش‌ها:',
 'prefsnologin' => 'به سامانه وارد نشده‌اید',
 'prefsnologintext' => 'برای تنظیم ترجیحات کاربر باید <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} به سامانه وارد شوید]</span>.',
@@ -1528,22 +1526,22 @@ $1",
 'prefs-skin' => 'پوسته',
 'skin-preview' => 'پیش‌نمایش',
 'datedefault' => 'بدون ترجیح',
-'prefs-beta' => 'ابزارهای کارآمد',
+'prefs-beta' => 'ویژگی های بتا',
 'prefs-datetime' => 'تاریخ و زمان',
-'prefs-labs' => 'قسمت‌های آزمایشی',
+'prefs-labs' => 'گزینه‌های آزمایشی',
 'prefs-user-pages' => 'صفحه‌های کاربری',
 'prefs-personal' => 'داده‌های کاربر',
 'prefs-rc' => 'تغییرات اخیر',
 'prefs-watchlist' => 'فهرست پی‌گیری‌ها',
 'prefs-watchlist-days' => 'تعداد روزهایی که باید در فهرست پی‌گیری‌ها نمایش داده شود:',
-'prefs-watchlist-days-max' => '(حداکثر $1 {{PLURAL:$1|روز|روز}})',
+'prefs-watchlist-days-max' => 'حداکثر $1 {{PLURAL:$1|روز}}',
 'prefs-watchlist-edits' => 'تعداد ویرایش‌های نشان‌داده‌شده در فهرست پی‌گیری‌های گسترش‌یافته:',
 'prefs-watchlist-edits-max' => 'حداکثر تعداد: ۱۰۰۰',
 'prefs-watchlist-token' => 'رمز فهرست پی‌گیری:',
-'prefs-misc' => 'تنظیمات متفرقه',
+'prefs-misc' => 'متفرقه',
 'prefs-resetpass' => 'تغییر گذرواژه',
 'prefs-changeemail' => 'تغییر رایانامه',
-'prefs-setemail' => 'تغیین آدرس رایانامه',
+'prefs-setemail' => 'تنظیم نشانی رایانامه',
 'prefs-email' => 'گزینه‌های رایانامه',
 'prefs-rendering' => 'نمایش صفحه',
 'saveprefs' => 'ذخیره',
@@ -1558,7 +1556,7 @@ $1",
 'stub-threshold' => 'آستانهٔ ویرایش پیوندهای <a href="#" class="stub">ناقص</a> (بایت):',
 'stub-threshold-disabled' => 'غیرفعال',
 'recentchangesdays' => 'تعداد روزهای نمایش داده‌شده در تغییرات اخیر:',
-'recentchangesdays-max' => '(حداکثر $1 {{PLURAL:$1|روز|روز}})',
+'recentchangesdays-max' => 'حداکثر $1 {{PLURAL:$1|روز}}',
 'recentchangescount' => 'تعداد پیش‌فرض ویرایش‌های نمایش یافته:',
 'prefs-help-recentchangescount' => 'این گزینه شامل تغییرات اخیر، تاریخچهٔ صفحه‌ها و سیاهه‌ها می‌شود.',
 'prefs-help-watchlist-token' => 'پرکردن این بخش با یک کلید رمز سبب ایجاد یک خوراک آراس‌اس برای فهرست پی‌گیری شما می‌شود.
@@ -1583,7 +1581,7 @@ $1",
 'timezoneregion-indian' => 'اقیانوس هند',
 'timezoneregion-pacific' => 'اقیانوس آرام',
 'allowemail' => 'امکان دریافت رایانامه از دیگر کاربران',
-'prefs-searchoptions' => 'گزینه‌های جستجو',
+'prefs-searchoptions' => 'جستجو',
 'prefs-namespaces' => 'فضاهای نام',
 'defaultns' => 'در غیر این صورت جستجو در این فضاهای نام:',
 'default' => 'پیش‌فرض',
@@ -1597,7 +1595,7 @@ $1",
 'prefs-textboxsize' => 'اندازهٔ جعبهٔ ویرایش',
 'youremail' => 'رایانامه:',
 'username' => 'نام کاربری:',
-'uid' => 'Ø´Ù\85ارÙ\87Ù\94 Ú©Ø§Ø±Ø¨Ø±Û\8c:',
+'uid' => 'Ø´Ù\86اسÙ\87Ù\94 Ú©Ø§Ø±Ø¨Ø±:',
 'prefs-memberingroups' => 'عضو این {{PLURAL:$1|گروه|گروه‌ها}}:',
 'prefs-registration' => 'زمان ثبت‌نام:',
 'yourrealname' => 'نام واقعی:',
@@ -1609,7 +1607,7 @@ $1",
 'badsig' => 'امضای خام غیرمجاز.
 لطفاً برچسب‌های اچ‌تی‌ام‌ال را بررسی کنید.',
 'badsiglength' => 'امضای شما بیش از اندازه طولانی است.
-امضا باید کمتر از $1 نویسه طول داشته باشد.',
+امضا باید کمتر از $1 {{PLURAL:$1|نویسه}} طول داشته باشد.',
 'yourgender' => 'جنسیت:',
 'gender-unknown' => 'مشخص‌نشده',
 'gender-male' => 'مرد',
@@ -1617,7 +1615,7 @@ $1",
 'prefs-help-gender' => 'اختیاری: برای خطاب‌شدن با جنسیت درست توسط نرم‌افزار به کار می‌رود.
 این اطلاعات عمومی خواهد بود.',
 'email' => 'رایانامه',
-'prefs-help-realname' => 'نام واقعی اختیاری است
+'prefs-help-realname' => 'نام واقعی اختیاری است.
 اگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.',
 'prefs-help-email' => 'نشانی رایانامه اختیاری‌است، اما فرستادن گذرواژه‌ای جدید را اگر گذرواژهٔ خود را فراموش کنید ممکن می‌کند.',
 'prefs-help-email-others' => 'شما همچنین می‌توانید انتخاب کنید که کاربران بتوانند از طریق پیوندی در صفحهٔ کاربری یا صفحهٔ بحث کاربری‌تان به شما رایانامه بفرستند.
@@ -1692,8 +1690,8 @@ $1",
 'right-read' => 'خواندن صفحه',
 'right-edit' => 'ویرایش صفحه',
 'right-createpage' => 'ایجاد صفحه (در مورد صفحه‌های غیر بحث)',
-'right-createtalk' => 'ایجاد صفحهٔ بحث',
-'right-createaccount' => 'ایجاد حساب کاربری',
+'right-createtalk' => 'ایجاد صفحه‌های بحث',
+'right-createaccount' => 'ایجاد حساب‌های کاربری',
 'right-minoredit' => 'علامت‌زدن ویرایش‌ها به عنوان جزئی',
 'right-move' => 'انتقال صفحه',
 'right-move-subpages' => 'انتقال صفحه‌ها به همراه زیر‌صفحه‌هایشان',
@@ -1718,7 +1716,7 @@ $1",
 'right-deletedhistory' => 'مشاهدهٔ موارد حذف‌شده از تاریخچه، بدون دیدن متن آن‌ها',
 'right-deletedtext' => 'مشاهدهٔ متن حذف‌شده و تغییرات بین نسخه‌های حذف‌شده',
 'right-browsearchive' => 'جستجوی صفحه‌های حذف‌شده',
-'right-undelete' => 'احیای صفحه‌ای حذف‌شده',
+'right-undelete' => 'احیای صفحه‌ها',
 'right-suppressrevision' => 'بازبینی و احیای ویرایش‌هایی که از مدیران پنهان شده‌اند',
 'right-suppressionlog' => 'مشاهدهٔ سیاهه‌های خصوصی',
 'right-block' => 'قطع دسترسی ویرایشی دیگر کاربران',
@@ -1755,6 +1753,9 @@ $1",
 'rightslogtext' => 'این سیاههٔ تغییرات اختیارات کاربر است.',
 'rightslogentry' => 'عضویت $1 را از گروه $2 به $3 تغییر داد',
 'rightslogentry-autopromote' => 'به طور خودکار از $2 به $3 ارتقا یافت',
+'logentry-rights-rights' => '$1 عضویت $3 را از گروه $4 به $5 تغییر داد',
+'logentry-rights-rights-legacy' => '$1 گروه عضویت $3 را تغییر داد',
+'logentry-rights-autopromote' => '$1 به طور خودکار از $4 به $5 ارتقا یافت',
 'rightsnone' => '(هیچ)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1993,6 +1994,7 @@ $1',
 'backend-fail-notsame' => 'پروندهٔ غیریکسانی در $1 وجود دارد.',
 'backend-fail-invalidpath' => '$1 مسیر ذخیره‌سازی معتبری نیست.',
 'backend-fail-delete' => 'نمی‌توان پروندهٔ $1 را حذف کرد.',
+'backend-fail-describe' => 'نمی‌توان فرادادهٔ پروندهٔ «$1» را تغییر داد.',
 'backend-fail-alreadyexists' => 'پروندهٔ $1 از قبل وجود داشت.',
 'backend-fail-store' => 'نمی‌توان پروندهٔ $1 را در $2 ذخیره کرد.',
 'backend-fail-copy' => 'نمی‌توان پروندهٔ $1 را به $2 کپی کرد.',
@@ -2145,7 +2147,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'shared-repo-from' => 'از $1',
 'shared-repo' => 'یک مخزن مشترک',
 'shared-repo-name-wikimediacommons' => 'ویکی‌انبار',
-'upload-disallowed-here' => 'Ù\85تاسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8c ØªÙ\88اÙ\86Û\8cد Ø§Û\8cÙ\86 Ù\86گاره را بازنویس کنید.',
+'upload-disallowed-here' => 'Ù\85تاسÙ\81اÙ\86Ù\87 Ø´Ù\85ا Ù\86Ù\85Û\8c ØªÙ\88اÙ\86Û\8cد Ø§Û\8cÙ\86 Ù¾Ø±Ù\88Ù\86ده را بازنویس کنید.',
 
 # File reversion
 'filerevert' => 'واگردانی $1',
@@ -2384,7 +2386,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'linksearch-ok' => 'جستجو',
 'linksearch-text' => 'نشانه‌هایی مانند «‎*.wikipedia.org» را می‌توان استفاده کرد.
 حداقل یک دامنه سطح بالا ، به عنوان مثال "*.org" نیاز دارد.<br />
-پرÙ\88تکÙ\84â\80\8cÙ\87اÛ\8c Ù¾Ø´ØªÛ\8cباÙ\86Û\8câ\80\8cشدÙ\87: <code>$1</code> (Ù\87Û\8cÚ\86 Û\8cÚ© Ø§Ø² Ø§Û\8cÙ\86 Ù\85Ù\88ارد Ø±Ø§ Ø¯Ø± Ø¬Ø³ØªØ¬Ù\88Û\8c Ø®Ù\88د Ù\86Û\8cاÙ\81زاÛ\8cÛ\8cد)',
+پرÙ\88تکÙ\84â\80\8cÙ\87اÛ\8c Ù¾Ø´ØªÛ\8cباÙ\86Û\8câ\80\8cشدÙ\87: <code>$1</code> (Ù¾Û\8cØ´â\80\8cÙ\81رض Ø¨Ø±Ø§Û\8c http:// Ø¯Ø± ØµÙ\88رت Ù\85شخص Ù\86شدÙ\86 Ù¾Ø±Ù\88تکÙ\84 ØªÙ\86ظÛ\8cÙ\85 Ø´Ø¯Ù\87â\80\8cاست)',
 'linksearch-line' => '$1 از $2 پیوند دارد',
 'linksearch-error' => 'نشانه‌ها فقط در ابتدای نام میزبان اینترنتی می‌توانند استفاده شوند.',
 
@@ -2433,7 +2435,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 'emailuser-title-target' => 'ایمیل این {{GENDER:$1| کاربر}}',
 'emailuser-title-notarget' => 'رایانامه به کاربر',
 'emailpage' => 'رایانامه به کاربر',
-'emailpagetext' => 'شما می‌توانید از فرم زیر برای ارسال یک رایانامه به این کاربر استفاده کنید.
+'emailpagetext' => 'شما می‌توانید از فرم زیر برای ارسال یک رایانامه به این {{GENDER:$1|کاربر}} استفاده کنید.
 نشانی رایانامه‌ای که در [[Special:Preferences|ترجیحات کاربریتان]] وارد کرده‌اید در نشانی فرستنده (From) نامه خواهد آمد، تا گیرنده بتواند پاسخ دهد.',
 'usermailererror' => 'رایانامه دچار خطا شد:',
 'defemailsubject' => 'رایانامه {{SITENAME}} از طرف کاربر «$1»',
@@ -2465,7 +2467,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 
 # Watchlist
 'watchlist' => 'فهرست پی‌گیری‌های من',
-'mywatchlist' => 'Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87اÛ\8c Ù\85Ù\86',
+'mywatchlist' => 'Ù\81Ù\87رست Ù¾Û\8câ\80\8cÚ¯Û\8cرÛ\8câ\80\8cÙ\87ا',
 'watchlistfor2' => 'برای $1 $2',
 'nowatchlist' => 'در فهرست پی‌گیری‌های شما هیچ موردی نیست.',
 'watchlistanontext' => 'برای مشاهده و ویرایش فهرست پی‌گیری‌های خود از $1 استفاده کنید.',
@@ -2501,11 +2503,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization را ببینید.',
 
 'enotif_mailer' => 'رایانامهٔ اطلاع‌رسانی {{SITENAME}}',
 'enotif_reset' => 'علامت‌گذاری همهٔ صفحه‌ها به عنوان بازدید شده',
-'enotif_newpagetext' => 'این یک صفحهٔ تازه‌است.',
 'enotif_impersonal_salutation' => 'کاربر {{SITENAME}}',
-'changed' => 'تغییر یافته',
-'created' => 'ایجاد شده',
-'enotif_subject' => 'صفحهٔ «$PAGETITLE» در {{SITENAME}} به دست $PAGEEDITOR $CHANGEDORCREATED است.',
 'enotif_lastvisited' => 'برای دیدن همهٔ تغییرات از آخرین باری که سر زده‌اید $1 را ببینید.',
 'enotif_lastdiff' => 'برای نمایش این تغییر $1 را ببینید.',
 'enotif_anon_editor' => 'کاربر ناشناس $1',
@@ -2685,7 +2683,7 @@ $NEWPAGE
 'undeleterevision-missing' => 'نسخه نامعتبر یا مفقود است.
 ممکن است پیوندتان نادرست باشد یا اینکه نسخه از بایگانی حذف یا بازیابی شده باشد .',
 'undelete-nodiff' => 'نسخهٔ قدیمی‌تری یافت نشد.',
-'undeletebtn' => 'احیا شود',
+'undeletebtn' => 'احیا',
 'undeletelink' => 'نمایش/احیا',
 'undeleteviewlink' => 'نمایش',
 'undeletereset' => 'از نو',
@@ -2694,8 +2692,8 @@ $NEWPAGE
 'undeletedrevisions' => '$1 نسخه احیا {{PLURAL:$1|شد|شدند}}',
 'undeletedrevisions-files' => '$1 نسخه و $2 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
 'undeletedfiles' => '$1 پرونده احیا {{PLURAL:$1|شد|شدند}}.',
-'cannotundelete' => 'احیا ناموفق بود؛
-ممکن است کس دیگری پیشتر این صفحه را احیا کرده باشد.',
+'cannotundelete' => 'احیا ناموفق بود:
+$1',
 'undeletedpage' => "'''$1 احیا شد'''
 
 برای دیدن سیاههٔ حذف‌ها و احیاهای اخیر به  [[Special:Log/delete|سیاههٔ حذف]] رجوع کنید.",
@@ -2729,7 +2727,7 @@ $1',
 # Contributions
 'contributions' => 'مشارکت‌های کاربری',
 'contributions-title' => 'مشارکت‌های کاربری $1',
-'mycontris' => 'مشارکت‌های من',
+'mycontris' => 'مشارکت‌ها',
 'contribsub2' => 'برای $1 ($2)',
 'nocontribs' => 'هیچ تغییری با این مشخصات یافت نشد.',
 'uctop' => ' (بالا)',
@@ -2770,7 +2768,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 تغییرمسیر',
 'whatlinkshere-hidetrans' => '$1 تراگنجانش‌ها',
 'whatlinkshere-hidelinks' => '$1 پیوند',
-'whatlinkshere-hideimages' => '$1 پیوند به تصویر',
+'whatlinkshere-hideimages' => '$1 پیوندهای پرونده',
 'whatlinkshere-filters' => 'پالایه‌ها',
 
 # Block/unblock
@@ -2809,7 +2807,7 @@ $1',
 'ipb-disableusertalk' => 'جلوگیری از ویرایشی صفحهً بحث توسط خود کاربر در زمانی که بسته است',
 'ipb-change-block' => 'بستن دوبارهٔ کاربر با این تنظیم‌ها',
 'ipb-confirm' => 'تأیید بستن',
-'badipaddress' => 'نشانی آی‌ی غیر مجاز',
+'badipaddress' => 'نشانی آی‌پی غیر مجاز',
 'blockipsuccesssub' => 'بستن با موفقیت انجام شد',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] بسته شد.<br />
 برای بررسی بسته‌شده‌ها [[Special:BlockList|فهرست بسته‌شده‌ها]] را ببینید.',
@@ -3005,6 +3003,7 @@ $1',
 'immobile-target-namespace-iw' => 'پیوند میان‌ویکی هدفی مجاز برای انتقال صفحه نیست.',
 'immobile-source-page' => 'این صفحه قابل انتقال نیست.',
 'immobile-target-page' => 'امکان انتقال به این عنوان مقصد وجود ندارد.',
+'bad-target-model' => 'مقصد مورد نظر از مدل محتوایی متفاوتی استفاده می‌کند. تبدیل $1 به $2 ممکن نیست.',
 'imagenocrossnamespace' => 'امکان انتقال تصویر به فضای نام غیر پرونده وجود ندارد',
 'nonfile-cannot-move-to-file' => 'امکان انتقال محتوای غیر پرونده به فضای نام پرونده وجود ندارد',
 'imagetypemismatch' => 'پسوند پرونده جدید با نوع آن سازگار نیست',
@@ -3133,7 +3132,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'آزمایش جاوا اسکریپت',
-'javascripttest-disabled' => 'این عملکرد در این ویکی فعال نشده‌است.',
 'javascripttest-title' => 'در حال اجرای آزمایش‌های $1',
 'javascripttest-pagetext-noframework' => 'این صفحه برای اجرای آزمایش‌های جاوا اسکریپت کنار گذاشته شده‌است.',
 'javascripttest-pagetext-unknownframework' => 'چارچوب آزمایشی ناشناخته «$1».',
@@ -3243,6 +3241,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'اطلاعات در مورد «$1»',
+'pageinfo-not-current' => 'متاسفانه تهیه اطلاعات ویرایش‌های قدیمی غیرممکن است.',
 'pageinfo-header-basic' => 'اطلاعات اولیه',
 'pageinfo-header-edits' => 'ویرایش تاریخچه',
 'pageinfo-header-restrictions' => 'حفاظت از صفحه',
@@ -3251,6 +3250,7 @@ $1',
 'pageinfo-default-sort' => 'کلید مرتب‌سازی پیش‌فرض',
 'pageinfo-length' => 'حجم صفحه  (بایت)',
 'pageinfo-article-id' => 'شناسهٔ صفحه',
+'pageinfo-language' => 'زبان محتوای صفحه',
 'pageinfo-robot-policy' => 'وضعیت موتور جستجو',
 'pageinfo-robot-index' => 'فهرست‌پذیر',
 'pageinfo-robot-noindex' => 'عدم فهرست‌پذیری',
@@ -3267,10 +3267,17 @@ $1',
 'pageinfo-authors' => 'تعداد کلی نویسندگان یکتا',
 'pageinfo-recent-edits' => 'شماره ویرایش‌های اخیر (در $1 گذشته)',
 'pageinfo-recent-authors' => 'تعداد نویسندگان یکتای اخیر',
-'pageinfo-restriction' => 'محافظت صفحه ( {{lcfirst:$1}} )',
 'pageinfo-magic-words' => '{{PLURAL:$1|حرف|حروف}} جادویی ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1| ردهٔ|ردهٔ}} پنهان ( $1 )',
 'pageinfo-templates' => '{{PLURAL:$1|الگو|الگو}} استفاده‌شده ($1)',
+'pageinfo-toolboxlink' => 'اطلاعات صفحه',
+'pageinfo-redirectsto' => 'تغییرمسیر به',
+'pageinfo-redirectsto-info' => 'اطلاعات',
+'pageinfo-contentpage' => 'شمرده شده به عنوان صفحهٔ محتویی',
+'pageinfo-contentpage-yes' => 'بله',
+'pageinfo-protect-cascading' => 'محافظت آبشاری از اینجا',
+'pageinfo-protect-cascading-yes' => 'بله',
+'pageinfo-protect-cascading-from' => 'محافظت آبشاری از',
 
 # Skin names
 'skinname-standard' => 'کلاسیک',
@@ -3293,6 +3300,8 @@ $1',
 'markedaspatrollederror' => 'برچسب گشت زده نشد',
 'markedaspatrollederrortext' => 'باید یک نسخه را مشخص کنید تا برچسب گشت بخورد.',
 'markedaspatrollederror-noautopatrol' => 'شما نمی‌توانید به تغییرات انجام شده توسط خودتان برچسب گشت بزنید.',
+'markedaspatrollednotify' => 'این تغییر روی $1 برچسب گشت خورده است.',
+'markedaspatrollederrornotify' => 'زدن برچسب گشت، ناموفق بود.',
 
 # Patrol log
 'patrol-log-page' => 'سیاههٔ گشت',
@@ -3357,6 +3366,7 @@ $1',
 'hours' => '{{PLURAL: $1|ساعت|ساعت}}',
 'days' => '{{PLURAL: $1|روز|روز}}',
 'ago' => '$1 پیش',
+'just-now' => 'هم‌اکنون',
 
 # Bad image list
 'bad_image_list' => 'اطلاعات را باید اینگونه وارد کنید:
@@ -3850,6 +3860,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[تراگنجانش بین‌ویکیانه فعال نیست]',
 'scarytranscludefailed' => '[فراخوانی الگو برای $1 میسر نشد]',
+'scarytranscludefailed-httpstatus' => '[فراخوانی الگو برای $1 میسر نشد: خطای اچ‌تی‌تی‌پی $2]',
 'scarytranscludetoolong' => '[نشانی اینترنتی مورد نظر (URL) بیش از اندازه بلند بود]',
 
 # Delete conflict
@@ -4027,6 +4038,7 @@ $5
 'version-license' => 'اجازه‌نامه',
 'version-poweredby-credits' => "این ویکی توسط '''[//www.mediawiki.org/ مدیاویکی]''' پشتیبانی می‌شود، کلیهٔ حقوق محفوظ است © 2001-$1 $2.",
 'version-poweredby-others' => 'دیگران',
+'version-credits-summary' => 'افراد زیر را به خاطر ویرایش‌هایش در [[Special:Version|مدیاویکی]] معرفی می‌نمائیم.',
 'version-license-info' => 'مدیاویکی نرم‌افزاری رایگان است؛ می‌توانید آن را تحت شرایط مجوز عمومی همگانی گنو که توسط بنیاد نرم‌افزار رایگان منتشر شده‌است، بازنشر کنید؛ یا نسخهٔ ۲ از این مجوز، یا (بنا به اختیار) نسخه‌های بعدی.
 
 مدیاویکی به این امید که مفید واقع شود منتشر شده‌است، ولی بدون هیچ‌گونه ضمانتی؛ بدون ضمانت ضمنی که تجاری یا برای کار خاصی مناسب باشد. برای اطلاعات بیشتر مجوز گنو جی‌پی‌ال را مشاهده کنید.
@@ -4167,9 +4179,9 @@ $5
 '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-newusers' => 'حساب کاربری $1 ایجاد شد',
+'logentry-newusers-create' => 'حساب کاربری $1 ایجاد شد',
+'logentry-newusers-create2' => 'حساب کاربری $3 توسط $1 ایجاد شد',
 'logentry-newusers-autocreate' => 'حساب $1  به شکل خودکار ساخته شد',
 'newuserlog-byemail' => 'گذرواژه بوسیله رایانامه ارسال شد',
 
@@ -4188,6 +4200,10 @@ $5
 'feedback-bugcheck' => 'عالی‌است! فقط بررسی کنید که از [$1 ایرادهای شناخته‌شده] نباشد.',
 'feedback-bugnew' => 'بررسی کردم. ایرادی جدید را گزارش بده',
 
+# Search suggestions
+'searchsuggest-search' => 'جستجو',
+'searchsuggest-containing' => 'صفحه‌های دربردارنده...',
+
 # API errors
 'api-error-badaccess-groups' => 'شما اجازهٔ بارگذاری پرونده‌ها را در این ویکی ندارید.',
 'api-error-badtoken' => 'خطای داخلی: کد امنیتی اشتباه (Bad token).',
index 8309848..45ce3eb 100644 (file)
  * @ingroup Language
  * @file
  *
+ * @author Amire80
  * @author Amkoullel
  * @author Guaka (on ff.wikipedia.org)
+ * @author Ibrahima
  */
 
 $fallback = 'fr';
 
 $messages = array(
+# User preference toggles
+'tog-underline' => 'Diidtol jokke',
+'tog-justify' => 'Fonndito lelnanɗe',
+'tog-hideminor' => 'Duuɗ taƴtanɗe pamare e bayle cakkitiiɗe',
+'tog-hidepatrolled' => 'Suuɗ taƴtanɗe deenaaɗe ɗee e bayle cakkitiiɗe',
+'tog-newpageshidepatrolled' => 'Suuɗ kelle deenaaɗe e doggol kelle kese',
+'tog-extendwatchlist' => 'Wertu doggol ndeenka ngam hollude bayle fof, wonaa tan cakkitiiɗe',
+'tog-usenewrc' => 'Renndin bayle e hello e bayle cakkitiiɗe kañum e doggol ndeenka (ena naamnii Javascritp)',
+'tog-numberheadings' => 'Ɓeydi limoore tiitooɗe e jaajol',
+'tog-showtoolbar' => 'Hollu palal taƴtorde (ena naamnii JavaScript)',
+'tog-editondblclick' => 'Taƴto kelle e dobtitannde (ena naamnii Javascritp)',
+
+'underline-default' => 'Goowaaɗe wanngorde',
+
+# Font style option in Special:Preferences
+'editfont-style' => 'Pannol ponte boowal taƴtorgal',
+'editfont-default' => 'Goowaaɗe wanngorde',
+
+# Dates
+'sunday' => 'Dewo',
+'monday' => 'Aaɓnde',
+'tuesday' => 'Mawbaare',
+'wednesday' => 'Njeslaare',
+'thursday' => 'Naasaande',
+'friday' => 'Mawnde',
+'saturday' => 'Hoore-Biir',
+'sun' => 'Dew',
+'mon' => 'Aaɓ',
+'tue' => 'Maw',
+'wed' => 'Nje',
+'thu' => 'Naa',
+'fri' => 'Mde',
+'sat' => 'Hoo',
+'january' => 'Siilo',
+'february' => 'Colte',
+'march' => 'MBooy',
+'april' => 'Seeɗto',
+'may_long' => 'Duujal',
+'june' => 'Korse',
+'july' => 'Morso',
+'august' => 'Juko',
+'september' => 'Siilto',
+'october' => 'Yarkomaa',
+'november' => 'Jolal',
+'december' => 'Bowte',
+'january-gen' => 'Siilo',
+'february-gen' => 'Colte',
+'march-gen' => 'Mbooy',
+'april-gen' => 'Seeɗto',
+'may-gen' => 'Duujal',
+'june-gen' => 'Korse',
+'july-gen' => 'Morso',
+'august-gen' => 'Juko',
+'september-gen' => 'Siilto',
+'october-gen' => 'Yarkomaa',
+'november-gen' => 'Jolal',
+'december-gen' => 'Bowte',
+'jan' => 'Sii',
+'feb' => 'Col',
+'mar' => 'Mbo',
+'apr' => 'See',
+'may' => 'Duu',
+'jun' => 'Kor',
+'jul' => 'Mor',
+'aug' => 'Juk',
+'sep' => 'Sto',
+'oct' => 'Yar',
+'nov' => 'Jol',
+'dec' => 'Bow',
+
+# Categories related messages
+'pagecategories' => '{{PLURAL:$1|Fedde|Pelle}}',
+'category_header' => 'Kelle e fedde "$1"',
+'subcategories' => 'Taƴte pelle',
+'hidden-categories' => '{{PLURAL:$1|Fedde suuɗiinde|Pelle cuuɗiiɗe}}',
+'listingcontinuesabbrev' => 'jokku',
+'noindex-category' => 'Kello njoopaaka',
+
 'mytalk' => 'kaldigal am',
+'navigation' => 'Peeragol',
+
+# Vector skin
+'vector-action-addsection' => 'Ɓeydi toɓɓere',
+'vector-action-move' => 'Dirtin',
+'vector-view-edit' => 'Taƴto',
+'vector-view-history' => 'Yiyto aslol',
+'vector-view-view' => 'Tar',
+'actions' => 'Baɗe',
+'namespaces' => 'Boowal inɗe',
+'variants' => 'Lomtooɗe',
 
-'help'             => 'Ballal',
-'history_short'    => 'Tarik',
-'edit'             => 'Wallifaade',
-'talkpagelinktext' => 'Kaldigal',
-'talk'             => 'Kaldigal',
-'toolbox'          => 'Wakannde gollirɗe',
-'otherlanguages'   => 'ɗemɗe goɗe',
-'jumptosearch'     => 'Ɗaɓɓitugol',
+'errorpagetitle' => 'Juumre',
+'returnto' => 'Rutto to $1.',
+'tagline' => 'Iwde to {{SITENAME}}',
+'help' => 'Ballal',
+'search' => 'Yiylo',
+'searchbutton' => 'Yiylo',
+'searcharticle' => 'Tar',
+'history_short' => 'Tarik',
+'printableversion' => 'Yamre winndittoonde',
+'permalink' => 'Jokkol duumingol',
+'view' => 'Yiyto',
+'edit' => 'Wallifaade',
+'create' => 'Sos',
+'editthispage' => 'Taƴto ngoo hello',
+'create-this-page' => 'Sos ngoo hello',
+'delete' => 'Momtu',
+'deletethispage' => 'Momtu ngoo hello',
+'protect' => 'Hisnu',
+'protect_change' => 'waylu',
+'protectthispage' => 'Hisnu ngoo hello',
+'unprotect' => 'Waylu kisnugol',
+'unprotectthispage' => 'Waylu kisnugol e ngoo hello',
+'newpage' => 'Hello heso',
+'talkpage' => 'Yeewtu baɗte ngoo hello',
+'talkpagelinktext' => 'Yeewtere',
+'specialpage' => 'Hello heeriingo',
+'personaltools' => 'Kuutorɗe maa keeriiɗe',
+'postcomment' => 'Taƴre hesere',
+'articlepage' => 'Yiyto hello loowdi ngoo',
+'talk' => 'Kaldigal',
+'views' => 'Jiyte',
+'toolbox' => 'Wakannde gollirɗe',
+'userpage' => 'Yiyto hello kuutoro',
+'projectpage' => 'Yiyto hello eɓɓoore',
+'imagepage' => 'Yiyto hello fiilde',
+'mediawikipage' => 'Yiyto hello ɓatakuure ndee',
+'templatepage' => 'Yiyto hello tiimtorde',
+'viewhelppage' => 'Yiyto hello ballal',
+'categorypage' => 'Yiyto hello fedde',
+'viewtalkpage' => 'Yiyto yeewtere',
+'otherlanguages' => 'ɗemɗe goɗe',
+'redirectedfrom' => '(Yiitannde iwde e $1)',
+'redirectpagesub' => 'Hello jiiltugol',
+'lastmodifiedat' => 'Ngoo hello waylaa ko ñalnde $1 sahnga $2.',
+'viewcount' => 'Ngoo hello yillaama laabi $1.',
+'protectedpage' => 'Hello hisnaango',
+'jumpto' => 'Diw fayde:',
+'jumptonavigation' => 'peeragol',
+'jumptosearch' => 'Ɗaɓɓitugol',
+'view-pool-error' => 'Ɗaccu hakke, carworɗe ɗee ko keewraa oo sahaa.
+Etotooɓe yillaade ngoo hello keewii haa ɓurti.
+Tiiɗno sabbo seeɗa hade maa etaade naatde e hello ngoo kadi.',
+'pool-timeout' => 'Sahaa ɓennii fade geƴƴol',
+'pool-queuefull' => 'Doggol golle ko keewngol',
+'pool-errorunknown' => 'Juumre nde heftinaaka',
 
 # 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).
-'currentevents'        => 'Tawtoraɗi',
-'currentevents-url'    => 'Project:Tawtoraɗi',
-'mainpage'             => 'Hello jaɓɓorgo',
+'aboutsite' => 'Baɗte {{SITENAME}}',
+'aboutpage' => 'Project:Baɗte',
+'copyright' => 'Loowdi ena heɓoo les $1.',
+'copyrightpage' => '{{ns:project}}:Copyrights',
+'currentevents' => 'Tawtoraɗi',
+'currentevents-url' => 'Project:Tawtoraɗi',
+'disclaimers' => 'Deentine',
+'disclaimerpage' => 'Project:Deentine kuuɓtidinɗe',
+'edithelp' => 'Ballal Taƴtagol',
+'edithelppage' => 'Help:Taƴtagol',
+'helppage' => 'Help:Loowdi',
+'mainpage' => 'Hello jaɓɓorgo',
 'mainpage-description' => 'Hello jaɓɓorgo',
-'portal'               => 'Jaɓɓogol renndo',
+'policy-url' => 'Eɓɓoore:Dawirgol',
+'portal' => 'Jaɓɓogol renndo',
+'portal-url' => 'Project:Damugal renndo',
+'privacy' => 'Dawirgol suturo',
+'privacypage' => 'Project:Dawirgol suturo',
+
+'badaccess' => 'Juumre jamirooje',
+'badaccess-group0' => 'A yamiraaka siynude gollal naamni-ɗaa ngal.',
+
+'ok' => 'OK',
+'retrievedfrom' => 'Ittaa ko to "$1"',
+'youhavenewmessages' => 'A heɓii $1 ($2).',
+'newmessageslink' => 'ɓatakuuje kese',
+'newmessagesdifflink' => 'baylol cakkitiingol',
+'youhavenewmessagesmulti' => 'A heɓii ɓatakuuje kese e $1',
+'editsection' => 'taƴto',
+'editold' => 'taƴto',
+'viewsourceold' => 'yiyto ɗaɗol',
+'editlink' => 'taƴto',
+'viewsourcelink' => 'yiyto ɗaɗol',
+'editsectionhint' => 'Taƴto rogere: $1',
+'toc' => 'Loowdi',
+'showtoc' => 'hollu',
+'hidetoc' => 'suuɗ',
+'collapsible-collapse' => 'Taggu',
+'collapsible-expand' => 'Wertu',
+'thisisdeleted' => 'Yiyto walla artir $1?',
+'viewdeleted' => 'Yiyto $1?',
+'feedlinks' => 'Balol',
+'feed-invalid' => 'Lulnannde fannu balol moƴƴaani',
+'feed-unavailable' => 'Bale lultinorde ɗee keɓotaako',
+'site-rss-feed' => '$1 balol RSS',
+'site-atom-feed' => 'Balol Atom $1',
+'page-rss-feed' => '"$1" balol RSS',
+'page-atom-feed' => '"$1" balol Atom',
+'red-link-title' => '$1 (hello ngoo woodaani)',
+'sort-descending' => 'Leemto telloo',
+'sort-ascending' => 'Leemto faya dow',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Winndannde',
+'nstab-user' => 'Hello kuutoro',
+'nstab-media' => 'Hello Mejaaje',
+'nstab-special' => 'Hello heeriingo',
+'nstab-project' => 'Hello eɓɓoore',
+'nstab-image' => 'Fiilde',
+'nstab-mediawiki' => 'Ɓatakuure',
+'nstab-template' => 'Tiimtorde',
+'nstab-help' => 'Hello ballal',
+'nstab-category' => 'Fedde',
+
+# Main script and global functions
+'nosuchaction' => 'Ngal baɗal anndaaka',
+'nosuchactiontext' => 'Baɗal joopagnal e URL ngal moƴƴaani.
+Maa taw w juum e mbinndiin URL oo, walla ndew-ɗaa ko e jokkol taƴngol.
+Ɗuum kadi ena waawi wonde buggere e topirde huutoraande e {{SITENAME}}.',
+'nosuchspecialpage' => 'Ngoo hello heeriingo woodaani',
+'nospecialpagetext' => '<strong>A naamniima hello heeriingo ngo woodaani.</strong>
+Doggol kelle ɗe moƴƴaani ena tawee to [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Faljere',
+'databaseerror' => 'Juumre ruttorde keɓe',
+'dberrortext' => 'Juumre lelngo ɗaɓɓitannde keɓe waɗii.
+Ɗuum kadi ena waawi wonde buggere e topirde ndee.
+Ɗaɓɓitannde keɓe sakkitiinde eteede wonnoo ko:
+<blockquote><code>$1</code></blockquote>
+iwde e golloore "<code>$2</code>".
+Ruttorde keɓe ruttinii juumre "<samp>$3: $4</samp>".',
+'missing-article' => 'Ruttorde keɓe ndee yiytaani loowdi hello ndi nde fotnoo yiytude, ena inniraa "$1" $2.
+
+Heewi waɗde noon ko diff nayeejo walla jokkol aslol fayde e hello momtaango.
+
+So wonaa ɗuum, maataw ko a kawruɗo e buggere e topirde ndee.
+Tiiɗno jaŋto ɗum to [[Special:ListUsers/sysop|jiiloowo]] mbaasaa yejjitde URL jokkol ngol.',
+'badtitle' => 'Tiitoonde moƴƴaani',
+'badtitletext' => 'Tiitoonde ello ɗaɓɓitaango ngoo moƴƴaani, ko mehre, walla ko hakkude-ɗemɗe jokkoraade no feewaani walla tiitoonde hakkude-wiki',
+
+# Login and logout pages
+'yourname' => 'Innde Kuutoro',
+'yourpassword' => 'Finnde:',
+'remembermypassword' => 'Siiftor ceŋagol am e ndee wanngorde (so heewii ko {{PLURAL:$1|ñalawma|balɗe}}$1)',
+'login' => 'Seŋo',
+'nav-login-createaccount' => 'Seŋo / uddit konte',
+'loginprompt' => 'Alaa e sago kurminaa kukiije ngam seŋaade e {{SITENAME}}.',
+'userlogin' => 'Seŋo / uddit konte',
+'nologin' => 'A alaa konte tawo? $1.',
+'nologinlink' => 'Uddit konte',
+'mailmypassword' => 'Neldu finnde hesere e iimeel',
+'loginlanguagelabel' => 'Ɗemngal: $1',
 
 # Edit pages
+'preview' => 'Yiytindo',
 'newarticle' => '(Kesi)',
+'newarticletext' => 'A rewii e jokkol feewde e hello ngo woodaani tawo.
+Ngam sosde hello ngoo, fuɗɗo tappude e gallol les ngol (Yah to [[{{MediaWiki:Helppage}}|help page]] ngam ɓeydude humpito).',
+'noarticletext' => 'Ngoo hello alaa tawo hay binndol.
+Aɗa waawi [[Special:Search/{{PAGENAME}}|weddo njiilaw e tiitoonde mayre]] e kello goɗɗe,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} yiylo logge toɗɗiiɗe ɗum],
+walla [{{fullurl:{{FULLPAGENAME}}|action=edit}} taƴto hello ngoo]</span>.',
+'editingsection' => 'Taƴtagol $1 (taƴre)',
+'templatesused' => '{{PLURAL:$1|Tiimtorde|Tiimtorɗe}} kuutoraaɗe e ngoo hello:',
+'template-protected' => 'ko-ko hisnaa',
+'template-semiprotected' => '(ena hisnaa feccere)',
+'hiddencategories' => 'Ngoo hello jeyaa ko e {{PLURAL:$1|1 fedde suuɗiinde|$1 pelle cuuɗiiɗe}}:',
+
+# Parser/template warnings
+'post-expand-template-argument-warning' => "'''Warning:''' Ngoo hello ena jogii daliilu tiimtorde jogiiɗo ɓetol layo mawngol haa ɓurti.
+Ɗiin dalillaaji nduulaama.",
+'post-expand-template-argument-category' => 'Kelle jogiiɗe dalillaaji tiimtorde jejjitaaɗe',
+
+# History pages
+'viewpagelogs' => 'Yiyto loge ngoo hello',
+'revisionasof' => 'Waylitannde $1',
+'histlegend' => 'Cifol : ({{int:cur}}) = ko seerti e yamre wonaande ndee, ({{int:last}}) = ko seerti e yamre ɓennunde ndee, <b>{{int:minoreditletter}}</b> = baylital pamaral',
+'history-fieldset-title' => 'Feero e aslol',
+'history-show-deleted' => 'Momtaaɗi tan',
+'histfirst' => 'Hello adanngo',
+
+# Revision deletion
+'revdel-restore' => 'waylu jiyagol',
+'revdel-restore-visible' => 'baylitte jiyotooɗe',
+
+# Merge log
+'revertmerge' => 'Ittu renndino',
+
+# Diffs
+'history-title' => 'Aslol baylitte "$1"',
+'lineno' => 'Gorol $1:',
+'compareselectedversions' => 'Yerondir baylitte labaaɗe',
+'editundo' => 'firtu',
+
+# Search results
+'searchresults' => 'Yiylo e njaltudi',
+'searchresults-title' => 'Yiylo "$1" e njaltudi',
+'prevn' => 'caggal {{PLURAL:$1|$1}}',
+'nextn' => 'yeeso {{PLURAL:$1|$1}}',
+'prevn-title' => 'Caggal $1 {{PLURAL:$1|njaltudi|jaltuɗe}}',
+'nextn-title' => 'Yeeso $1 {{PLURAL:$1|njaltudi|jaltuɗe}}',
+'shown-title' => 'Hollu $1 {{PLURAL:$1|njaltudi|jaltuɗe}} e hello fof',
+'viewprevnext' => 'Yiyto ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Ena woodi hello ena wiyee \"[[:\$1]]\" e oo wiki.'''",
+'searchprofile-articles' => 'Kello loowdi',
+'searchprofile-project' => 'Hello ballal e Eɓɓoore',
+'searchprofile-images' => 'Sawmejaajo',
+'searchprofile-everything' => 'Fofof',
+'searchprofile-advanced' => 'Ceeɓtore',
+'searchprofile-articles-tooltip' => 'Yiylo e $1',
+'searchprofile-project-tooltip' => 'Yiylo e $1',
+'searchprofile-images-tooltip' => 'Yiylo piille',
+'searchprofile-everything-tooltip' => 'Yiylo loowdi fof (waɗoe heen kelle jeewte)',
+'searchprofile-advanced-tooltip' => 'Yiylo e boowe inɗe peŋtore',
+'search-result-size' => '$1 ({{PLURAL:$2|helmere 1|kelme$ 2}})',
+'search-redirect' => '(yiiltu $1)',
+'search-section' => '(taƴre $1)',
+'searchall' => 'fof',
+'showingresultsheader' => "{{PLURAL:$5|Njaltudi'''$1''' of '''$3'''|Jaltuɗe'''$1 - $2''' of '''$3'''}} for '''$4'''",
 
 # Recent changes
 'recentchanges' => 'Wailitooji kesi',
+'recentchanges-legend' => 'Cuɓe bayle cakkitiiɗe',
+'recentchanges-label-newpage' => 'Ngoo taƴto sosii hello heso',
+'recentchanges-label-bot' => 'Ngoo taƴto waɗi ɗum ko botol',
+'recentchanges-label-unpatrolled' => 'Ngoo taƴto suwaa tawo ƴeewteede',
+'rclistfrom' => 'Hollu bayle kese puɗɗiiɗe gila $1',
+'rclinks' => 'Hollu bayle $1 cakkitiiɗe baɗaaɗe e balɗe $2 ɓannuɗe ɗee<br />$3',
+'diff' => 'ceer',
+'hist' => 'aslol',
+'rc-enhanced-expand' => 'Hollu cariiɗe (ena naamnii JavaScript)',
+'rc-enhanced-hide' => 'Suuɗ cariiɗe',
+
+# Recent changes linked
+'recentchangeslinked' => 'Bayle toɗɗiiɗe ɗum',
+'recentchangeslinked-toolbox' => 'Bayle toɗɗiiɗe ɗee',
+'recentchangeslinked-title' => 'Bayle toɗɗiiɗe "$1"',
+'recentchangeslinked-noresult' => 'Alaa bayle ngoni e hello jokkiingo ngoo e dumunna joopaaɗo oo.',
+'recentchangeslinked-page' => 'Innde hello:',
+'recentchangeslinked-to' => 'Hollu bayle kelle jokkaaɗe e hello toɗɗaango ngoo kisa',
 
 # Upload
+'upload' => 'Yollu fiilde',
 'uploaderror' => 'Faljere',
+'filedesc' => 'Tonngol',
+
+# File description page
+'filehist' => 'Aslol fiilde',
+'imagelinks' => 'Kuutorgol fiilde',
+'nolinkstoimage' => 'Alaa kelle jokkiiɗe e ndee fiilde.',
 
 # Random page
 'randompage' => 'Ɗerewol kawral',
 
+# Miscellaneous special pages
+'nbytes' => '$1 {{PLURAL:$1|bitere|bite}}',
+'nmembers' => '$1 {{PLURAL:$1|tergal|terɗe}}',
+'newpages' => 'Kelle kese',
+'pager-newer-n' => '{{PLURAL:$1|kesol 1|kesi $1}}',
+'pager-older-n' => '{{PLURAL:$1|ɓennungol 1|ɓennuɗi $1}}',
+
+# Book sources
+'booksources' => 'Sewnde defte',
+
+# Special:Log
+'log' => 'Loge',
+
 # Special:AllPages
 'allarticles' => 'Winndannde hesere',
 
+# Special:LinkSearch
+'linksearch-line' => '$1 ko-ko jokkaa e $2',
+
 # Watchlist
+'watchlist' => 'Doggol ndeenka am',
 'watch' => 'Rewindaande',
+'unwatch' => 'Darin rewindo',
+
+# Delete
+'actioncomplete' => 'Gollal timmii',
+'actionfailed' => 'Gollal woorii',
+'dellogpage' => 'Logagol momtaaɗe',
+
+# Rollback
+'rollbacklink' => 'riiwtu',
+
+# Undelete
+'undeletelink' => 'yiyto/artir',
+
+# Namespace form on various pages
+'blanknamespace' => '(Dowrowo)',
+
+# Contributions
+'contributions' => 'Ballitte kuutoro',
+'month' => 'Tuggi nduu lewru (e ɓennuɗi):',
+'year' => 'Tuggi ndee hitaande (e ɓennuɗe):',
 
 'sp-contributions-talk' => 'Kaldigal',
 
+# What links here
+'whatlinkshere' => 'Ko jokkii ɗoo',
+'whatlinkshere-title' => 'Kello jokkiiɗe e "$1"',
+'whatlinkshere-page' => 'Hello:',
+'linkshere' => "Kelle ɗee-ɗoo jokkii ko to '''[[:$1]]''':",
+'isredirect' => 'hello yiiltorde',
+'istemplate' => 'naattine',
+'isimage' => 'jokkol fiilde',
+'whatlinkshere-prev' => '{{PLURAL:$1|caggal|caggal $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|yeeso|yeeso $1}}',
+'whatlinkshere-links' => '← jokke',
+'whatlinkshere-hideredirs' => '$1 jiiltanɗe',
+'whatlinkshere-hidetrans' => '$1 naattine',
+'whatlinkshere-hidelinks' => '$1 jokke',
+'whatlinkshere-filters' => 'Ceɗe',
+
+# Block/unblock
+'blocklink' => 'daaƴ',
+'unblocklink' => 'daaƴtu',
+'change-blocklink' => 'wayli daaƴo',
+'contribslink' => 'ballitte',
+
+# Move page
+'movelogpage' => 'Dirtin loge',
+'revertmove' => 'firlit',
+
+# Namespace 8 related
+'allmessagesname' => 'Innde',
+'allmessagesdefault' => 'Binndo ɓatakuru goowangol',
+
+# Thumbnails
+'thumbnail-more' => 'Mawnin',
+'thumbnail_error' => 'Juumre waɗii e cosgol dooɓre $1',
+
+# Tooltip help for the actions
+'tooltip-pt-userpage' => 'Hello kuutoro maa',
+'tooltip-pt-mytalk' => 'Hello jeewte maa',
+'tooltip-pt-preferences' => 'Cuɓoraaɗe maa',
+'tooltip-pt-watchlist' => "Doggol kelle ɗe ngon-ɗaa e ƴeewtaade bayle mum'en",
+'tooltip-pt-mycontris' => 'Doggol ballitte maa',
+'tooltip-pt-login' => 'Aɗa wasiyaa yo a seŋo; kono waɗɗaaki',
+'tooltip-pt-logout' => 'Seŋto',
+'tooltip-ca-talk' => 'Yeewtere baɗte hello loowdi ngoo',
+'tooltip-ca-edit' => 'Aɗa waawi taƴtaade ngoo hello. Tiiɗno huutoro butoŋ yiytindo oo hade maa danndude',
+'tooltip-ca-viewsource' => 'Ngoo hello ko hisnaango.
+Aɗa waawi yiytaade ɗaɗol maggo.',
+'tooltip-ca-history' => 'Baylitte ɓennuɗe e  ngoo hello',
+'tooltip-ca-protect' => 'Hisnu ngoo hello',
+'tooltip-ca-delete' => 'Momtu ngoo hello',
+'tooltip-ca-unwatch' => 'Momtu ngoo hello e doggol ndeenka maa',
+'tooltip-search' => 'Yiylo e {{SITENAME}}',
+'tooltip-search-fulltext' => 'Yiylo ndii loowdi e kelle ɗee',
+'tooltip-p-logo' => 'Yillo hello jaɓɓorgo ngoo',
+'tooltip-n-mainpage' => 'Yillo hello jaɓɓorgo ngoo',
+'tooltip-n-mainpage-description' => 'Yillo hello jaɓɓorgo ngoo',
+'tooltip-n-portal' => 'Baɗte eɓɓoore ndee, hol ko mbaaw-ɗaa waɗde, hol to njiytataa geɗe',
+'tooltip-n-currentevents' => 'Yiylo humpito yawtungo toɗɗiingo ɗee joljole',
+'tooltip-n-recentchanges' => 'Doggol bayle cakkitiiɗe e Wiki hee',
+'tooltip-n-randompage' => 'Loow hello hawraango',
+'tooltip-n-help' => 'Ko ɗoo yiytetee',
+'tooltip-t-whatlinkshere' => 'Doggol kelle Wiki jokkaaɗe ɗoo ɗee fof',
+'tooltip-t-recentchangeslinked' => 'Bayle cakkitiiɗe e kelle jokkaaɗe e ngoo hello',
+'tooltip-t-contributions' => 'Doggol ballitte oo kuutoro',
+'tooltip-t-upload' => 'Yollu piille',
+'tooltip-t-specialpages' => 'Doggol kelle keeriiɗe fof',
+'tooltip-t-print' => 'Jame binndittooɗe ngoo hello',
+'tooltip-t-permalink' => 'Jokkol duumingol e baylital ngoo hello',
+'tooltip-ca-nstab-main' => 'Yiyto hello loowdi ngoo',
+'tooltip-ca-nstab-user' => 'Yiyto hello kuutoro',
+'tooltip-ca-nstab-project' => 'Yiyto hello eɓɓoore ngoo',
+'tooltip-ca-nstab-image' => 'Yiyto hello fiilde ngoo',
+'tooltip-minoredit' => 'Maanto ɗum ko taƴto famaro',
+'tooltip-compareselectedversions' => 'Ƴeew ko seerndi hakkunde baylitte ɗiɗi ngoo hello labaaɗe ɗee',
+'tooltip-watch' => 'Ɓeydu ngoo hello e doggol ndeenka maa',
+'tooltip-rollback' => '"Riiwtude" firlittu taƴte  ngoo hello ruttoo to battindiiɗo waylude ngo e dobannde wootere',
+'tooltip-undo' => '"Firtu" artirtu ngol taƴtol tee uddita gallol taƴto ngol e mbaydi yiytindo. Nafata ko ɓeydude daliilu e tonngol ngol.',
+
+# Browsing diffs
+'previousdiff' => 'Taƴte ɓennungol',
+
+# Media information
+'file-nohires' => 'Werngo ɓurngo ɗoo toowde alaa.',
+'svg-long-desc' => 'Fiilde SVG, werngo mum ko $1 × $2 pikelle, ɓetol fiildee: $3',
+
 # Special:NewFiles
 'ilsubmit' => 'Yiilaade',
 
+# Bad image list
+'bad_image_list' => 'Mbayka kaa ko nih yahri:
+
+Reggin teme tan (kelle puɗɗoriiɗe *) ena kiisaa.
+Jokkol gadanol e gorol foti wonde ko jokkol fiilde nde moƴƴaani.
+Kala jokkol dewngol e ngool gorol nanngiraa ko paltooje, wano kelle ɗo fiilde ndee waawi yaltude.',
+
+# Metadata
+'metadata-help' => 'Ngoo hello ena waɗi humpito woɗngo, tawata ko ummii ko e kameraa numerik walla niiwtorde huutoraande ngam sosde walla ngaanndinde nde.',
+'metadata-fields' => 'Galli metaakeɓe natal gongal nde nduu ɓaakuru maa naatine e jaytinol hello natal tuma nde haatumeere metaakeɓe ndee taggitaa.
+Goɗɗe maa cuuɗe e sahaa kala.
+* make
+* model
+* datetimeoriginal
+* exposuretime
+* fnumber
+* isospeedratings
+* focallength
+* artist
+* copyright
+* imagedescription
+* gpslatitude
+* gpslongitude
+* gpsaltitude',
+
+# External editor support
+'edit-externally' => 'Taƴto ndee fiilde huutoraade jaaɓnirgal jiggangal',
+'edit-externally-help' => '(Yah to [//www.mediawiki.org/wiki/Manual:External_editors/ff tinndinoore teelto] ngam ɓeydude humpito)',
+
+# 'all' in various places, this might be different for inflected languages
+'monthsall' => 'fof',
+
+# Special:SpecialPages
+'specialpages' => 'Kelle keeriiɗe',
+
 );
index d2f5e76..9df40ce 100644 (file)
@@ -13,6 +13,7 @@
  * @author Crt
  * @author ElmA
  * @author Harriv
+ * @author Hyperborean
  * @author Jaakonam
  * @author Jack Phoenix
  * @author Jafeluv
@@ -37,8 +38,6 @@
  * @author לערי ריינהארט
  */
 
-$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
-
 $namespaceNames = array(
        NS_MEDIA            => 'Media',
        NS_SPECIAL          => 'Toiminnot',
@@ -63,43 +62,103 @@ $namespaceAliases = array(
        'Keskustelu_kuvasta' => NS_FILE_TALK,
 );
 
-
-$datePreferences = array(
-       'default',
-       'fi normal',
-       'fi seconds',
-       'fi numeric',
-       'ISO 8601',
-);
-
-$defaultDateFormat = 'fi normal';
-
-$dateFormats = array(
-       'fi normal time' => 'H.i',
-       'fi normal date' => 'j. F"ta" Y',
-       'fi normal both' => 'j. F"ta" Y "kello" H.i',
-
-       'fi seconds time' => 'H:i:s',
-       'fi seconds date' => 'j. F"ta" Y',
-       'fi seconds both' => 'j. F"ta" Y "kello" H:i:s',
-
-       'fi numeric time' => 'H.i',
-       'fi numeric date' => 'j.n.Y',
-       'fi numeric both' => 'j.n.Y "kello" H.i',
-);
-
-$datePreferenceMigrationMap = array(
-       'default',
-       'fi normal',
-       'fi seconds',
-       'fi numeric',
-);
-
-$bookstoreList = array(
-       'Bookplus'                      => 'http://www.bookplus.fi/product.php?isbn=$1',
-       'Helsingin yliopiston kirjasto' => 'http://pandora.lib.hel.fi/cgi-bin/mhask/monihask.py?volname=&author=&keyword=&ident=$1&submit=Hae&engine_helka=ON',
-       'Pääkaupunkiseudun kirjastot'   => 'http://www.helmet.fi/search*fin/i?SEARCH=$1',
-       'Tampereen seudun kirjastot'    => 'http://kirjasto.tampere.fi/Piki?formid=fullt&typ0=6&dat0=$1'
+$specialPageAliases = array(
+       'Activeusers'               => array( 'Aktiiviset_käyttäjät' ),
+       'Allmessages'               => array( 'Järjestelmäviestit' ),
+       'Allpages'                  => array( 'Kaikki_sivut' ),
+       'Ancientpages'              => array( 'Kuolleet_sivut' ),
+       'Badtitle'                  => array( 'Kelpaamaton_otsikko' ),
+       'Blankpage'                 => array( 'Tyhjä_sivu' ),
+       'Block'                     => array( 'Estä' ),
+       'Blockme'                   => array( 'Estä_minut' ),
+       'Booksources'               => array( 'Kirjalähteet' ),
+       'BrokenRedirects'           => array( 'Virheelliset_ohjaukset', 'Virheelliset_uudelleenohjaukset' ),
+       'Categories'                => array( 'Luokat' ),
+       'ChangeEmail'               => array( 'Muuta_sähköpostiosoite' ),
+       'ChangePassword'            => array( 'Muuta_salasana', 'Alusta_salasana' ),
+       'ComparePages'              => array( 'Vertaa_sivuja' ),
+       'Confirmemail'              => array( 'Varmista_sähköpostiosoite' ),
+       'Contributions'             => array( 'Muokkaukset' ),
+       'CreateAccount'             => array( 'Luo_tunnus' ),
+       'Deadendpages'              => array( 'Linkittömät_sivut' ),
+       'DeletedContributions'      => array( 'Poistetut_muokkaukset' ),
+       'Disambiguations'           => array( 'Täsmennyssivut' ),
+       'DoubleRedirects'           => array( 'Kaksinkertaiset_ohjaukset', 'Kaksinkertaiset_uudelleenohjaukset' ),
+       'EditWatchlist'             => array( 'Muokkaa_tarkkailulistaa' ),
+       'Emailuser'                 => array( 'Lähetä_sähköpostia' ),
+       'Export'                    => array( 'Vie_sivuja' ),
+       'Fewestrevisions'           => array( 'Vähiten_muokatut_sivut' ),
+       'FileDuplicateSearch'       => array( 'Kaksoiskappaleiden_haku' ),
+       'Filepath'                  => array( 'Tiedostopolku' ),
+       'Import'                    => array( 'Tuo_sivuja' ),
+       'Invalidateemail'           => array( 'Hylkää_sähköpostiosoite' ),
+       'BlockList'                 => array( 'Muokkausestot' ),
+       'LinkSearch'                => array( 'Linkkihaku' ),
+       'Listadmins'                => array( 'Ylläpitäjät' ),
+       'Listbots'                  => array( 'Botit' ),
+       'Listfiles'                 => array( 'Tiedostoluettelo' ),
+       'Listgrouprights'           => array( 'Käyttäjäryhmien_oikeudet' ),
+       'Listredirects'             => array( 'Ohjaukset', 'Ohjaussivut', 'Uudelleenohjaukset' ),
+       'Listusers'                 => array( 'Käyttäjät' ),
+       'Lockdb'                    => array( 'Lukitse_tietokanta' ),
+       'Log'                       => array( 'Loki', 'Lokit' ),
+       'Lonelypages'               => array( 'Yksinäiset_sivut' ),
+       'Longpages'                 => array( 'Pitkät_sivut' ),
+       'MergeHistory'              => array( 'Liitä_muutoshistoria' ),
+       'MIMEsearch'                => array( 'MIME-haku' ),
+       'Mostcategories'            => array( 'Luokitelluimmat_sivut' ),
+       'Mostimages'                => array( 'Viitatuimmat_tiedostot' ),
+       'Mostlinked'                => array( 'Viitatuimmat_sivut' ),
+       'Mostlinkedcategories'      => array( 'Viitatuimmat_luokat' ),
+       'Mostlinkedtemplates'       => array( 'Viitatuimmat_mallineet' ),
+       'Mostrevisions'             => array( 'Muokatuimmat_sivut' ),
+       'Movepage'                  => array( 'Siirrä_sivu' ),
+       'Mycontributions'           => array( 'Omat_muokkaukset' ),
+       'Mypage'                    => array( 'Oma_sivu' ),
+       'Mytalk'                    => array( 'Oma_keskustelu' ),
+       'Myuploads'                 => array( 'Omat_tiedostot' ),
+       'Newimages'                 => array( 'Uudet_tiedostot', 'Uudet_kuvat' ),
+       'Newpages'                  => array( 'Uudet_sivut' ),
+       'PasswordReset'             => array( 'Unohtuneen_salasanan_vaihto' ),
+       'PermanentLink'             => array( 'Ikilinkki' ),
+       'Popularpages'              => array( 'Suositut_sivut' ),
+       'Preferences'               => array( 'Asetukset' ),
+       'Prefixindex'               => array( 'Etuliiteluettelo' ),
+       'Protectedpages'            => array( 'Suojatut_sivut' ),
+       'Protectedtitles'           => array( 'Suojatut_sivunimet' ),
+       'Randompage'                => array( 'Satunnainen_sivu' ),
+       'Randomredirect'            => array( 'Satunnainen_ohjaus', 'Satunnainen_uudelleenohjaus' ),
+       'Recentchanges'             => array( 'Tuoreet_muutokset' ),
+       'Recentchangeslinked'       => array( 'Linkitetyt_muutokset' ),
+       'Revisiondelete'            => array( 'Poista_muokkaus' ),
+       'Search'                    => array( 'Haku' ),
+       'Shortpages'                => array( 'Lyhyet_sivut' ),
+       'Specialpages'              => array( 'Toimintosivut' ),
+       'Statistics'                => array( 'Tilastot' ),
+       'Tags'                      => array( 'Merkinnät' ),
+       'Unblock'                   => array( 'Poista_esto' ),
+       'Uncategorizedcategories'   => array( 'Luokittelemattomat_luokat' ),
+       'Uncategorizedimages'       => array( 'Luokittelemattomat_tiedostot' ),
+       'Uncategorizedpages'        => array( 'Luokittelemattomat_sivut' ),
+       'Uncategorizedtemplates'    => array( 'Luokittelemattomat_mallineet' ),
+       'Undelete'                  => array( 'Palauta' ),
+       'Unlockdb'                  => array( 'Avaa_tietokanta' ),
+       'Unusedcategories'          => array( 'Käyttämättömät_luokat' ),
+       'Unusedimages'              => array( 'Käyttämättömät_tiedostot' ),
+       'Unusedtemplates'           => array( 'Käyttämättömät_mallineet' ),
+       'Unwatchedpages'            => array( 'Tarkkailemattomat_sivut' ),
+       'Upload'                    => array( 'Tallenna', 'Lisää_tiedosto' ),
+       'Userlogin'                 => array( 'Kirjaudu_sisään' ),
+       'Userlogout'                => array( 'Kirjaudu_ulos' ),
+       'Userrights'                => array( 'Käyttöoikeudet' ),
+       'Version'                   => array( 'Versio' ),
+       'Wantedcategories'          => array( 'Halutuimmat_luokat' ),
+       'Wantedfiles'               => array( 'Halutuimmat_tiedostot' ),
+       'Wantedpages'               => array( 'Halutuimmat_sivut' ),
+       'Wantedtemplates'           => array( 'Halutuimmat_mallineet' ),
+       'Watchlist'                 => array( 'Tarkkailulista' ),
+       'Whatlinkshere'             => array( 'Tänne_viittaavat_sivut' ),
+       'Withoutinterwiki'          => array( 'Kielilinkittömät_sivut' ),
 );
 
 $magicWords = array(
@@ -108,7 +167,6 @@ $magicWords = array(
        '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' ),
@@ -209,104 +267,44 @@ $magicWords = array(
        'protectionlevel'           => array( '1', 'SUOJAUSTASO', 'PROTECTIONLEVEL' ),
 );
 
-$specialPageAliases = array(
-       'Activeusers'               => array( 'Aktiiviset_käyttäjät' ),
-       'Allmessages'               => array( 'Järjestelmäviestit' ),
-       'Allpages'                  => array( 'Kaikki_sivut' ),
-       'Ancientpages'              => array( 'Kuolleet_sivut' ),
-       'Badtitle'                  => array( 'Kelpaamaton_otsikko' ),
-       'Blankpage'                 => array( 'Tyhjä_sivu' ),
-       'Block'                     => array( 'Estä' ),
-       'Blockme'                   => array( 'Estä_minut' ),
-       'Booksources'               => array( 'Kirjalähteet' ),
-       'BrokenRedirects'           => array( 'Virheelliset_ohjaukset', 'Virheelliset_uudelleenohjaukset' ),
-       'Categories'                => array( 'Luokat' ),
-       'ChangeEmail'               => array( 'Muuta_sähköpostiosoite' ),
-       'ChangePassword'            => array( 'Muuta_salasana', 'Alusta_salasana' ),
-       'ComparePages'              => array( 'Vertaa_sivuja' ),
-       'Confirmemail'              => array( 'Varmista_sähköpostiosoite' ),
-       'Contributions'             => array( 'Muokkaukset' ),
-       'CreateAccount'             => array( 'Luo_tunnus' ),
-       'Deadendpages'              => array( 'Linkittömät_sivut' ),
-       'DeletedContributions'      => array( 'Poistetut_muokkaukset' ),
-       'Disambiguations'           => array( 'Täsmennyssivut' ),
-       'DoubleRedirects'           => array( 'Kaksinkertaiset_ohjaukset', 'Kaksinkertaiset_uudelleenohjaukset' ),
-       'EditWatchlist'             => array( 'Muokkaa_tarkkailulistaa' ),
-       'Emailuser'                 => array( 'Lähetä_sähköpostia' ),
-       'Export'                    => array( 'Vie_sivuja' ),
-       'Fewestrevisions'           => array( 'Vähiten_muokatut_sivut' ),
-       'FileDuplicateSearch'       => array( 'Kaksoiskappaleiden_haku' ),
-       'Filepath'                  => array( 'Tiedostopolku' ),
-       'Import'                    => array( 'Tuo_sivuja' ),
-       'Invalidateemail'           => array( 'Hylkää_sähköpostiosoite' ),
-       'BlockList'                 => array( 'Muokkausestot' ),
-       'LinkSearch'                => array( 'Linkkihaku' ),
-       'Listadmins'                => array( 'Ylläpitäjät' ),
-       'Listbots'                  => array( 'Botit' ),
-       'Listfiles'                 => array( 'Tiedostoluettelo' ),
-       'Listgrouprights'           => array( 'Käyttäjäryhmien_oikeudet' ),
-       'Listredirects'             => array( 'Ohjaukset', 'Ohjaussivut', 'Uudelleenohjaukset' ),
-       'Listusers'                 => array( 'Käyttäjät' ),
-       'Lockdb'                    => array( 'Lukitse_tietokanta' ),
-       'Log'                       => array( 'Loki', 'Lokit' ),
-       'Lonelypages'               => array( 'Yksinäiset_sivut' ),
-       'Longpages'                 => array( 'Pitkät_sivut' ),
-       'MergeHistory'              => array( 'Liitä_muutoshistoria' ),
-       'MIMEsearch'                => array( 'MIME-haku' ),
-       'Mostcategories'            => array( 'Luokitelluimmat_sivut' ),
-       'Mostimages'                => array( 'Viitatuimmat_tiedostot' ),
-       'Mostlinked'                => array( 'Viitatuimmat_sivut' ),
-       'Mostlinkedcategories'      => array( 'Viitatuimmat_luokat' ),
-       'Mostlinkedtemplates'       => array( 'Viitatuimmat_mallineet' ),
-       'Mostrevisions'             => array( 'Muokatuimmat_sivut' ),
-       'Movepage'                  => array( 'Siirrä_sivu' ),
-       'Mycontributions'           => array( 'Omat_muokkaukset' ),
-       'Mypage'                    => array( 'Oma_sivu' ),
-       'Mytalk'                    => array( 'Oma_keskustelu' ),
-       'Myuploads'                 => array( 'Omat_tiedostot' ),
-       'Newimages'                 => array( 'Uudet_tiedostot', 'Uudet_kuvat' ),
-       'Newpages'                  => array( 'Uudet_sivut' ),
-       'PasswordReset'             => array( 'Unohtuneen_salasanan_vaihto' ),
-       'PermanentLink'             => array( 'Ikilinkki' ),
-       'Popularpages'              => array( 'Suositut_sivut' ),
-       'Preferences'               => array( 'Asetukset' ),
-       'Prefixindex'               => array( 'Etuliiteluettelo' ),
-       'Protectedpages'            => array( 'Suojatut_sivut' ),
-       'Protectedtitles'           => array( 'Suojatut_sivunimet' ),
-       'Randompage'                => array( 'Satunnainen_sivu' ),
-       'Randomredirect'            => array( 'Satunnainen_ohjaus', 'Satunnainen_uudelleenohjaus' ),
-       'Recentchanges'             => array( 'Tuoreet_muutokset' ),
-       'Recentchangeslinked'       => array( 'Linkitetyt_muutokset' ),
-       'Revisiondelete'            => array( 'Poista_muokkaus' ),
-       'RevisionMove'              => array( 'Versioiden_siirto' ),
-       'Search'                    => array( 'Haku' ),
-       'Shortpages'                => array( 'Lyhyet_sivut' ),
-       'Specialpages'              => array( 'Toimintosivut' ),
-       'Statistics'                => array( 'Tilastot' ),
-       'Tags'                      => array( 'Merkinnät' ),
-       'Unblock'                   => array( 'Poista_esto' ),
-       'Uncategorizedcategories'   => array( 'Luokittelemattomat_luokat' ),
-       'Uncategorizedimages'       => array( 'Luokittelemattomat_tiedostot' ),
-       'Uncategorizedpages'        => array( 'Luokittelemattomat_sivut' ),
-       'Uncategorizedtemplates'    => array( 'Luokittelemattomat_mallineet' ),
-       'Undelete'                  => array( 'Palauta' ),
-       'Unlockdb'                  => array( 'Avaa_tietokanta' ),
-       'Unusedcategories'          => array( 'Käyttämättömät_luokat' ),
-       'Unusedimages'              => array( 'Käyttämättömät_tiedostot' ),
-       'Unusedtemplates'           => array( 'Käyttämättömät_mallineet' ),
-       'Unwatchedpages'            => array( 'Tarkkailemattomat_sivut' ),
-       'Upload'                    => array( 'Tallenna', 'Lisää_tiedosto' ),
-       'Userlogin'                 => array( 'Kirjaudu_sisään' ),
-       'Userlogout'                => array( 'Kirjaudu_ulos' ),
-       'Userrights'                => array( 'Käyttöoikeudet' ),
-       'Version'                   => array( 'Versio' ),
-       'Wantedcategories'          => array( 'Halutuimmat_luokat' ),
-       'Wantedfiles'               => array( 'Halutuimmat_tiedostot' ),
-       'Wantedpages'               => array( 'Halutuimmat_sivut' ),
-       'Wantedtemplates'           => array( 'Halutuimmat_mallineet' ),
-       'Watchlist'                 => array( 'Tarkkailulista' ),
-       'Whatlinkshere'             => array( 'Tänne_viittaavat_sivut' ),
-       'Withoutinterwiki'          => array( 'Kielilinkittömät_sivut' ),
+$separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
+
+$datePreferences = array(
+       'default',
+       'fi normal',
+       'fi seconds',
+       'fi numeric',
+       'ISO 8601',
+);
+
+$defaultDateFormat = 'fi normal';
+
+$dateFormats = array(
+       'fi normal time' => 'H.i',
+       'fi normal date' => 'j. F"ta" Y',
+       'fi normal both' => 'j. F"ta" Y "kello" H.i',
+
+       'fi seconds time' => 'H:i:s',
+       'fi seconds date' => 'j. F"ta" Y',
+       'fi seconds both' => 'j. F"ta" Y "kello" H:i:s',
+
+       'fi numeric time' => 'H.i',
+       'fi numeric date' => 'j.n.Y',
+       'fi numeric both' => 'j.n.Y "kello" H.i',
+);
+
+$datePreferenceMigrationMap = array(
+       'default',
+       'fi normal',
+       'fi seconds',
+       'fi numeric',
+);
+
+$bookstoreList = array(
+       'Bookplus'                      => 'http://www.bookplus.fi/product.php?isbn=$1',
+       'Helsingin yliopiston kirjasto' => 'http://pandora.lib.hel.fi/cgi-bin/mhask/monihask.py?volname=&author=&keyword=&ident=$1&submit=Hae&engine_helka=ON',
+       'Pääkaupunkiseudun kirjastot'   => 'http://www.helmet.fi/search*fin/i?SEARCH=$1',
+       'Tampereen seudun kirjastot'    => 'http://kirjasto.tampere.fi/Piki?formid=fullt&typ0=6&dat0=$1'
 );
 
 $linkTrail = '/^([a-zäö]+)(.*)$/sDu';
@@ -351,7 +349,7 @@ $messages = array(
 'tog-watchlisthidebots' => 'Piilota bottien muokkaukset',
 'tog-watchlisthideminor' => 'Piilota pienet muokkaukset',
 'tog-watchlisthideliu' => 'Piilota kirjautuneiden käyttäjien muokkaukset tarkkailulistalta',
-'tog-watchlisthideanons' => 'Piilota anonyymien käyttäjien muokkaukset tarkkailulistalta',
+'tog-watchlisthideanons' => 'Piilota rekisteröitymättömien käyttäjien muokkaukset tarkkailulistalta',
 'tog-watchlisthidepatrolled' => 'Piilota tarkastetut muokkaukset tarkkailulistalta',
 'tog-ccmeonemails' => 'Lähetä minulle kopio MediaWikin kautta lähetetyistä sähköposteista',
 'tog-diffonly' => 'Älä näytä sivun sisältöä versioita vertailtaessa',
@@ -361,7 +359,7 @@ $messages = array(
 
 'underline-always' => 'Aina',
 'underline-never' => 'Ei koskaan',
-'underline-default' => 'Selaimen oletustapa',
+'underline-default' => 'Ulkoasun tai selaimen oletustapa',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Muokkauskentän kirjasintyyppi',
@@ -457,8 +455,7 @@ $messages = array(
 'qbbrowse' => 'Selaa',
 'qbedit' => 'Muokkaa',
 'qbpageoptions' => 'Sivuasetukset',
-'qbpageinfo' => 'Sivun tiedot',
-'qbmyoptions' => 'Asetukset',
+'qbmyoptions' => 'Omat sivut',
 'qbspecialpages' => 'Toimintosivut',
 'faq' => 'Usein kysytyt kysymykset',
 'faqpage' => 'Project:Usein kysytyt kysymykset',
@@ -470,7 +467,7 @@ $messages = array(
 'vector-action-protect' => 'Suojaa',
 'vector-action-undelete' => 'Palauta',
 'vector-action-unprotect' => 'Muuta suojausta',
-'vector-simplesearch-preference' => 'Ota käyttöön parannetut hakuehdotukset (vain Vector-ulkoasu)',
+'vector-simplesearch-preference' => 'Ota käyttöön yksinkertaistettu hakupalkki (vain Vector-ulkoasu)',
 'vector-view-create' => 'Luo',
 'vector-view-edit' => 'Muokkaa',
 'vector-view-history' => 'Näytä historia',
@@ -480,6 +477,7 @@ $messages = array(
 'namespaces' => 'Nimiavaruudet',
 'variants' => 'Kirjoitusjärjestelmät',
 
+'navigation-heading' => 'Navigointivalikko',
 'errorpagetitle' => 'Virhe',
 'returnto' => 'Palaa sivulle $1.',
 'tagline' => '{{SITENAME}}',
@@ -670,11 +668,11 @@ 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ä.',
+'delete-hook-aborted' => 'Laajennuskoodi esti poiston 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}}.',
-'perfcachedts' => 'Tiedot ovat välimuistista ja se päivitettiin viimeksi $1. Välimuistissa on enintään {{PLURAL:$4|yksi tulos|$4 tulosta}}.',
+'perfcached' => 'Nämä tiedot ovat välimuistista eivätkä välttämättä ole ajan tasalla. Välimuistissa on saatavilla enintään {{PLURAL:$1|yksi tulos|$1 tulosta}}.',
+'perfcachedts' => 'Nämä tiedot ovat välimuistista, ja ne on päivitetty viimeksi $1. Välimuistissa on saatavilla enintään {{PLURAL:$4|yksi tulos|$4 tulosta}}.',
 'querypage-no-updates' => 'Tämän sivun tietoja ei toistaiseksi päivitetä.',
 'wrong_wfQuery_params' => 'Virheelliset parametrit wfQuery()<br />Funktio: $1<br />Tiedustelu: $2',
 'viewsource' => 'Lähdekoodi',
@@ -684,10 +682,11 @@ Joku muu on saattanut poistaa sen.',
 'protectedpagetext' => 'Tämä sivu on suojattu muutoksilta.',
 'viewsourcetext' => 'Voit tarkastella ja kopioida tämän sivun lähdekoodia:',
 'viewyourtext' => "Voit tarkastella ja kopioida lähdekoodin '''tekemistäsi muutoksista''' tähän sivuun:",
-'protectedinterface' => 'Tämä sivu sisältää ohjelmiston käyttöliittymätekstiä ja on suojattu häiriköinnin estämiseksi.',
+'protectedinterface' => 'Tämä sivu sisältää ohjelmiston käyttöliittymätekstiä ja on suojattu häiriköinnin estämiseksi.
+Viestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netissä] – MediaWikin kotoistusprojektissa.',
 'editinginterface' => "'''Varoitus:''' Muokkaat sivua, joka sisältää ohjelmiston käyttöliittymätekstiä.
-Muutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymän ulkoasuun.
-Viestien kääntäminen tulisi tehdä [//translatewiki.net/wiki/Main_Page?setlang=fi translatewiki.netissä] – MediaWikin kotoistusprojektissa.",
+Muutokset tähän sivuun vaikuttavat muiden käyttäjien käyttöliittymän ulkoasuun tässä wikissä.
+Viestien kääntäminen tulisi tehdä [//translatewiki.net/ translatewiki.netissä] – MediaWikin kotoistusprojektissa.",
 'sqlhidden' => '(SQL-kysely piilotettu)',
 'cascadeprotected' => 'Tämä sivu on suojattu muokkauksilta, koska se on sisällytetty alla {{PLURAL:$1|olevaan laajennetusti suojattuun sivuun|oleviin laajennetusti suojattuihin sivuihin}}:
 $2',
@@ -697,9 +696,9 @@ $2',
 'ns-specialprotected' => 'Toimintosivuja ei voi muokata.',
 'titleprotected' => "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.
 Syynä on: ''$2''.",
-'filereadonlyerror' => 'Tiedostoa "$1" ei voi muuttaa, koska jaettu mediavarasto "$2" on "vain luku" -tilassa.
+'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".',
+Lukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: $3.',
 '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',
@@ -713,10 +712,10 @@ Lukituksen asettanut ylläpitäjä on antanut seuraavan syyn toimenpiteelle: "$3
 # Login and logout pages
 'logouttext' => "'''Olet nyt kirjautunut ulos.'''
 
-Voit jatkaa {{GRAMMAR:genitive|{{SITENAME}}}} käyttöä nimettömänä, tai [[Special:UserLogin|kirjautua uudelleen sisään]].
+Voit jatkaa {{GRAMMAR:genitive|{{SITENAME}}}} käyttöä nimettömänä, tai <span class='plainlinks'>[$1 kirjautua uudelleen sisään]</span>.
 Huomaa, että jotkut sivut saattavat näkyä edelleen kuin olisit kirjautunut sisään, kunnes tyhjennät selaimen välimuistin.",
-'welcomecreation' => '== Tervetuloa $1! ==
-Käyttäjätunnuksesi on luotu.
+'welcomeuser' => 'Tervetuloa $1!',
+'welcomecreation-msg' => 'Käyttäjätunnuksesi on luotu.
 Älä unohda virittää {{GRAMMAR:genitive|{{SITENAME}}}} [[Special:Preferences|asetuksiasi]].',
 'yourname' => 'Käyttäjätunnus',
 'yourpassword' => 'Salasana',
@@ -780,7 +779,7 @@ Tästä johtuen tästä IP-osoitteesta ei voi tällä hetkellä luoda uusia tunn
 'noemailprefs' => 'Sähköpostiosoitetta ei ole määritelty.',
 'emailconfirmlink' => 'Varmenna sähköpostiosoite',
 'invalidemailaddress' => 'Sähköpostiosoitetta ei voida hyväksyä, koska se ei ole oikeassa muodossa. Ole hyvä ja anna oikea sähköpostiosoite tai jätä kenttä tyhjäksi.',
-'cannotchangeemail' => 'Tunnuksien sähköpostiosoitteita ei voi muuttaa tässä wikissä.',
+'cannotchangeemail' => 'Tunnusten sähköpostiosoitteita ei voi muuttaa tässä wikissä.',
 'emaildisabled' => 'Tältä sivustolta ei voi lähettää sähköpostia.',
 'accountcreated' => 'Käyttäjätunnus luotiin',
 'accountcreatedtext' => 'Käyttäjän $1 käyttäjätunnus luotiin.',
@@ -881,7 +880,7 @@ Väliaikainen salasana: $2',
 'image_sample' => 'Esimerkki.jpg',
 'image_tip' => 'Tallennettu tiedosto',
 'media_sample' => 'Esimerkki.ogg',
-'media_tip' => 'Mediatiedostolinkki',
+'media_tip' => 'Tiedostolinkki',
 'sig_tip' => 'Allekirjoitus aikamerkinnällä',
 'hr_tip' => 'Vaakasuora viiva',
 
@@ -955,11 +954,10 @@ Voit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]
 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.
+Voit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta tai <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]</span>, mutta sinulla ei ole oikeutta luoda tätä sivua.',
+'missing-revision' => 'Sivusta {{PAGENAME}} ei ole olemassa versiota $1.
 
-Tämä yleensä johtuu vanhentuneesta historialinkistä sivulle, joka on poistettu.
+Useimmiten tämä johtuu vanhentuneesta historialinkistä poistettuun sivuun.
 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.',
@@ -981,8 +979,9 @@ Alla on viimeisin estolokin tapahtuma:',
 'userinvalidcssjstitle' => "'''Varoitus:''' Tyyliä nimeltä ”$1” ei ole olemassa. Muista, että käyttäjän määrittelemät .css- ja .js-sivut alkavat pienellä alkukirjaimella, esim. {{ns:user}}:Matti Meikäläinen/vector.css eikä {{ns:user}}:Matti Meikäläinen/Vector.css.",
 'updated' => '(Päivitetty)',
 'note' => "'''Huomautus:'''",
-'previewnote' => "'''Tämä on vasta sivun esikatselu. Tekemiäsi muokkauksia ei ole vielä tallennettu!'''",
-'continue-editing' => 'Jatka muokkaamista',
+'previewnote' => "'''Tämä on vasta sivun esikatselu.'''
+Tekemiäsi muutoksia ei ole vielä tallennettu.",
+'continue-editing' => 'Siirry muokkauskenttään',
 'previewconflict' => 'Tämä esikatselu näyttää miltä muokkausalueella oleva teksti näyttää tallennettuna.',
 'session_fail_preview' => "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.''' Yritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään.",
 'session_fail_preview_html' => "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.'''
@@ -993,7 +992,7 @@ Yritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ul
 'token_suffix_mismatch' => "'''Muokkauksesi on hylätty, koska asiakasohjelmasi ei osaa käsitellä välimerkkejä muokkaustarkisteessa. Syynä voi olla viallinen välityspalvelin.'''",
 'edit_form_incomplete' => "'''Osa muokkauslomakkeesta ei saavuttanut palvelinta. Tarkista, että muokkauksesi ovat vahingoittumattomia ja yritä uudelleen.'''",
 'editing' => 'Muokataan sivua $1',
-'creating' => 'Luodaan sivu $1',
+'creating' => 'Luodaan sivua $1',
 'editingsection' => 'Muokataan osiota sivusta $1',
 'editingcomment' => 'Muokataan uutta osiota sivulla $1',
 'editconflict' => 'Päällekkäinen muokkaus: $1',
@@ -1049,6 +1048,14 @@ Se on ilmeisesti poistettu.',
 'edit-already-exists' => 'Uuden sivun luominen ei onnistunut.
 Se on jo olemassa.',
 'defaultmessagetext' => 'Viestin oletusteksti',
+'invalid-content-data' => 'Virheellinen sisältö',
+'content-not-allowed-here' => 'Sivun [[$2]] sisältö ei voi olla tyyppiä $1.',
+
+# Content models
+'content-model-wikitext' => 'wikiteksti',
+'content-model-text' => 'teksti',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.
@@ -1199,7 +1206,9 @@ Sinulla ei ole oikeutta siihen.',
 'revdelete-only-restricted' => 'Virhe piilotettaessa $1 kello $2 päivättyä kohdetta: Et voi poistaa kohteita ylläpitäjien näkyviltä valitsematta myös jotain muuta näkyvyysasetusta.',
 'revdelete-reason-dropdown' => '*Yleiset poistosyyt
 ** Tekijänoikeusrikkomus
-** Sopimattomat henkilötiedot',
+** Sopimattomat henkilötiedot
+** Sopimaton käyttäjätunnus
+** Mahdollinen kunnianloukkaus',
 'revdelete-otherreason' => 'Muu syy tai tarkennus',
 'revdelete-reasonotherlist' => 'Muu syy',
 'revdelete-edit-reasonlist' => 'Muokkaa poistosyitä',
@@ -1240,9 +1249,9 @@ Uuden ja vanhan sivun muutoksien pitää muodostaa jatkumo – ne eivät saa men
 'mergelogpagetext' => 'Alla on loki viimeisimmistä muutoshistorioiden yhdistämisistä.',
 
 # Diffs
-'history-title' => 'Sivun "$1" muutoshistoria',
-'difference-title' => 'Ero sivun ”$1” versioiden välillä',
-'difference-title-multipage' => 'Erot sivujen "$1" ja "$2" välillä',
+'history-title' => 'Sivun $1 muutoshistoria',
+'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:',
 'compareselectedversions' => 'Vertaile valittuja versioita',
@@ -1250,9 +1259,9 @@ 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.
+'difference-missing-revision' => '{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.
 
-Tämä johtuu yleensä seuraavasta vanhentuneeesta diffilinkistä sivulle, joka on poistettu.
+Useimmiten tämä johtuu vanhentuneesta vertailulinkistä poistettuun sivuun.
 Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].',
 
 # Search results
@@ -1298,8 +1307,6 @@ $1 {{int:pipe-separator}} $2',
 'search-interwiki-caption' => 'Sisarprojektit',
 'search-interwiki-default' => 'Tulokset osoitteesta $1:',
 'search-interwiki-more' => '(lisää)',
-'search-mwsuggest-enabled' => 'näytä ehdotukset',
-'search-mwsuggest-disabled' => 'ilman ehdotuksia',
 'search-relatedarticle' => 'Hae samankaltaisia sivuja',
 'mwsuggest-disable' => 'Älä näytä ehdotuksia AJAXilla',
 'searcheverything-enable' => 'Hae kaikista nimiavaruuksista',
@@ -1318,7 +1325,7 @@ Kokeile lisätä haun alkuun ''all:'', niin haku kohdistuu kaikkeen sisältöön
 'powersearch-field' => 'Etsi',
 'powersearch-togglelabel' => 'Muuta valintaa',
 'powersearch-toggleall' => 'Valitse kaikki',
-'powersearch-togglenone' => 'Valitse ei mitään',
+'powersearch-togglenone' => 'Poista valinnat',
 'search-external' => 'Ulkoinen haku',
 'searchdisabled' => 'Tekstihaku on poistettu toistaiseksi käytöstä suuren kuorman vuoksi. Voit käyttää alla olevaa Googlen hakukenttää sivujen etsimiseen, kunnes haku tulee taas käyttöön. <small>Huomaa, että ulkopuoliset kopiot {{GRAMMAR:genitive|{{SITENAME}}}} sisällöstä eivät välttämättä ole ajan tasalla.</small>',
 
@@ -1562,6 +1569,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'rightslogtext' => 'Tämä on loki käyttäjien käyttöoikeuksien muutoksista.',
 'rightslogentry' => 'muutti käyttäjän $1 oikeudet ryhmistä $2 ryhmiin $3',
 'rightslogentry-autopromote' => 'muutettiin automaattisesti ryhmistä $2 ryhmiin $3',
+'logentry-rights-rights' => '$1 muutti käyttäjän $3 oikeudet ryhmistä $4 ryhmiin $5',
 'rightsnone' => '(ei oikeuksia)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1792,6 +1800,7 @@ $1',
 'backend-fail-notsame' => 'Epäidenttinen tiedosto on jo olemassa sijainnissa $1.',
 'backend-fail-invalidpath' => '$1 ei ole sallittu tallennuspolku.',
 'backend-fail-delete' => 'Tiedostoa $1 ei voitu poistaa.',
+'backend-fail-describe' => 'Tiedoston "$1" metatietoja ei voitu muuttaa.',
 'backend-fail-alreadyexists' => 'Tiedosto $1 on jo olemassa.',
 'backend-fail-store' => 'Tiedostoa $1 ei voitu tallentaa polkuun $2.',
 'backend-fail-copy' => 'Tiedostoa ei voitu kopioida kohteesta $1 kohteeseen $2.',
@@ -1808,7 +1817,7 @@ $1',
 '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.',
+'backend-fail-usable' => 'Tiedostoa $1 ei voitu lukea tai luoda, koska käyttöoikeudet eivät riittäneet tai hakemisto puuttuu.',
 
 # Lock manager
 'lockmanager-notlocked' => 'Kohteen $1 lukitusta ei voitu poistaa, koska se ei ole lukittu.',
@@ -1936,6 +1945,7 @@ Voit tarvittaessa muokata [$2 tiedoston kuvaussivua] kohteessa.',
 'uploadnewversion-linktext' => 'Tallenna uusi versio tästä tiedostosta',
 'shared-repo-from' => 'kohteesta $1',
 'shared-repo' => 'jaettu mediavarasto',
+'upload-disallowed-here' => 'Et voi korvata tätä tiedostoa.',
 
 # File reversion
 'filerevert' => 'Tiedoston $1 palautus',
@@ -2043,7 +2053,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|tavu|tavua}}',
 'ncategories' => '$1 {{PLURAL:$1|luokka|luokkaa}}',
-'ninterwikis' => '$1 {{PLURAL:$1|interwiki-linkki|interwiki-linkkiä}}',
+'ninterwikis' => '$1 {{PLURAL:$1|kielilinkki|kielilinkkiä}}',
 'nlinks' => '$1 {{PLURAL:$1|linkki|linkkiä}}',
 'nmembers' => '$1 {{PLURAL:$1|jäsen|jäsentä}}',
 'nrevisions' => '$1 {{PLURAL:$1|muutos|muutosta}}',
@@ -2072,7 +2082,7 @@ Jokaisella rivillä on linkit ensimmäiseen ja toiseen ohjaukseen sekä toisen o
 'mostlinkedtemplates' => 'Viitatuimmat mallineet',
 'mostcategories' => 'Luokitelluimmat sivut',
 'mostimages' => 'Viitatuimmat tiedostot',
-'mostinterwikis' => 'Sivut joilla on eniten kielilinkkejä',
+'mostinterwikis' => 'Sivut, joilla on eniten kielilinkkejä',
 'mostrevisions' => 'Muokatuimmat sivut',
 'prefixindex' => 'Kaikki sivut katkaisuhaulla',
 'prefixindex-namespace' => 'Kaikki sivut etuliitteellä (nimiavaruus $1)',
@@ -2145,11 +2155,11 @@ Voit rajoittaa listaa valitsemalla lokityypin, käyttäjän tai sivun johon muut
 'allpagesprefix' => 'Katkaisuhaku',
 'allpagesbadtitle' => 'Annettu otsikko oli kelvoton tai siinä oli wikien välinen etuliite.',
 'allpages-bad-ns' => '{{GRAMMAR:inessive|{{SITENAME}}}} ei ole nimiavaruutta ”$1”.',
-'allpages-hide-redirects' => 'Piilota ohjaussivut',
+'allpages-hide-redirects' => 'Piilota ohjaukset',
 
 # SpecialCachedPage
-'cachedspecial-viewing-cached-ttl' => 'Katselet arkistoitua versiota tästä sivusta, joka voi olla jopa $1 vanha.',
-'cachedspecial-viewing-cached-ts' => 'Katselet arkistoitua versiota tästä sivusta, joka ei välttämättä ole sivun viimeisin versio.',
+'cachedspecial-viewing-cached-ttl' => 'Tarkastelet arkistoitua versiota tästä sivusta, joka voi olla jopa $1 vanha.',
+'cachedspecial-viewing-cached-ts' => 'Tarkastelet arkistoitua versiota tästä sivusta, joka ei välttämättä ole sivun viimeisin versio.',
 'cachedspecial-refresh-now' => 'Näytä uusin versio.',
 
 # Special:Categories
@@ -2173,7 +2183,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: <code>$1</code> (älä lisää näitä hakuusi).',
+Tuetut protokollat: <code>$1</code> (oletuksena on <code>http://</code>, jos protokollaa ei määritetä).',
 'linksearch-line' => '$1 on linkitetty sivulta $2',
 'linksearch-error' => 'Jokerimerkkiä voi käyttää ainoastaan osoitteen alussa.',
 
@@ -2222,7 +2232,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 'emailuser-title-target' => 'Lähetä sähköpostia tälle {{GENDER:$1|käyttäjälle}}',
 'emailuser-title-notarget' => 'Lähetä sähköpostia käyttäjälle',
 'emailpage' => 'Lähetä sähköpostia käyttäjälle',
-'emailpagetext' => 'Jos tämä käyttäjä on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakkeella voit lähettää hänelle viestin. [[Special:Preferences|Omissa asetuksissasi]] annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi suoraan vastata viestiin.',
+'emailpagetext' => 'Jos tämä {{GENDER:$1|käyttäjä}} on antanut asetuksissaan kelvollisen sähköpostiosoitteen, alla olevalla lomakkeella voit lähettää hänelle viestin. [[Special:Preferences|Omissa asetuksissasi]] annettu sähköpostiosoite näkyy sähköpostin lähettäjän osoitteena, jotta vastaanottaja voi suoraan vastata viestiin.',
 'usermailererror' => 'Postitus palautti virheen:',
 'defemailsubject' => 'Sähköpostia käyttäjältä $1 sivustolta {{SITENAME}}',
 'usermaildisabled' => 'Käyttäjien sähköposti poistettu käytöstä',
@@ -2278,7 +2288,7 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 'watchlistcontains' => 'Tarkkailulistallasi on {{PLURAL:$1|yksi sivu|$1 sivua}}.',
 'iteminvalidname' => 'Sivun $1 kanssa oli ongelmia! Sivun nimessä on vikaa.',
 'wlnote' => "Alla on {{PLURAL:$1|yksi muutos|'''$1''' muutosta}} viimeisen {{PLURAL:$2|tunnin|'''$2''' tunnin}} ajalta $3 kello $4 asti.",
-'wlshowlast' => 'Näytä viimeiset $1 tuntia tai $2 päivää$3',
+'wlshowlast' => 'Näytä viimeiset $1 tuntia tai $2 päivää$3',
 'watchlist-options' => 'Tarkkailulistan asetukset',
 
 # Displayed when you click the "watch" button and it is in the process of watching
@@ -2288,19 +2298,23 @@ Lisätietoa yksittäisistä käyttäjäoikeuksista saattaa löytyä [[{{MediaWik
 
 'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} sivu on muuttunut -ilmoitus',
 'enotif_reset' => 'Merkitse kaikki sivut kerralla nähdyiksi',
-'enotif_newpagetext' => 'Tämä on uusi sivu.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-käyttäjä',
-'changed' => 'muuttanut sivua',
-'created' => 'luonut sivun',
-'enotif_subject' => '$PAGEEDITOR on $CHANGEDORCREATED $PAGETITLE',
+'enotif_subject_deleted' => '{{gender:$2|$2}} poisti {{SITENAME}}-sivun $1',
+'enotif_subject_created' => '{{gender:$2|$2}} loi {{SITENAME}}-sivun $1',
+'enotif_subject_moved' => '{{gender:$2|$2}} siirsi {{SITENAME}}-sivun $1',
+'enotif_subject_restored' => '{{gender:$2|$2}} palautti {{SITENAME}}-sivun $1',
+'enotif_subject_changed' => '{{gender:$2|$2}} muutti {{SITENAME}}-sivua $1',
+'enotif_body_intro_deleted' => '{{gender:$2|$2}} poisti {{SITENAME}}-sivun $1 $PAGEEDITDATE, sivun nykyinen versio on osoitteessa $3.',
+'enotif_body_intro_created' => '{{gender:$2|$2}} loi {{SITENAME}}-sivun $1 $PAGEEDITDATE, sivun nykyinen versio on osoitteessa $3.',
+'enotif_body_intro_moved' => '{{gender:$2|$2}} siirsi {{SITENAME}}-sivun $1 $PAGEEDITDATE, sivun nykyinen versio on osoitteessa $3.',
+'enotif_body_intro_restored' => '{{gender:$2|$2}} palautti {{SITENAME}}-sivun $1 $PAGEEDITDATE, sivun nykyinen versio on osoitteessa $3.',
+'enotif_body_intro_changed' => '{{gender:$2|$2}} muutti {{SITENAME}}-sivua $1 $PAGEEDITDATE, sivun nykyinen versio on osoitteessa $3.',
 'enotif_lastvisited' => 'Osoitteessa $1 on kaikki muutokset viimeisen käyntisi jälkeen.',
 'enotif_lastdiff' => 'Muutos on osoitteessa $1.',
 'enotif_anon_editor' => 'kirjautumaton käyttäjä $1',
 'enotif_body' => '$WATCHINGUSERNAME,
 
-{{GRAMMAR:genitive|{{SITENAME}}}} käyttäjä $PAGEEDITOR on $CHANGEDORCREATED $PAGETITLE $PAGEEDITDATE. Nykyinen versio on osoitteessa $PAGETITLE_URL .
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Muokkaajan yhteenveto: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2359,7 +2373,7 @@ Sivulla $2 on lista viimeaikaisista poistoista.',
 'rollback' => 'palauta aiempaan versioon',
 'rollback_short' => 'Palautus',
 'rollbacklink' => 'palauta',
-'rollbacklinkcount' => 'palauta {{PLURAL:$1|muokkaus|$1 muokkausta}}',
+'rollbacklinkcount' => 'palauta {{PLURAL:$1|muutos|$1 muutosta}}',
 '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ä.',
@@ -2400,7 +2414,7 @@ Viimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|k
 'protect-cascadeon' => 'Tämä sivu on suojauksen kohteena, koska se on sisällytetty alla {{PLURAL:$1|olevaan laajennetusti suojattuun sivuun|oleviin laajennetusti suojattuihin sivuihin}}. Voit muuttaa tämän sivun suojaustasoa, mutta se ei vaikuta laajennettuun suojaukseen.',
 'protect-default' => 'Salli kaikki käyttäjät',
 'protect-fallback' => 'Vaadi $1-oikeus',
-'protect-level-autoconfirmed' => 'Estä uudet ja anonyymit käyttäjät',
+'protect-level-autoconfirmed' => 'Estä uudet ja kirjautumattomat käyttäjät',
 'protect-level-sysop' => 'Vain ylläpitäjät',
 'protect-summary-cascade' => 'laajennettu',
 'protect-expiring' => 'vanhentuu $1 (UTC)',
@@ -2464,7 +2478,8 @@ Tiedostoversioita, joihin sinulla ei ole katseluoikeutta (''häivytetyt versiot'
 'undeletedrevisions' => '{{PLURAL:$1|Yksi versio|$1 versiota}} palautettiin',
 'undeletedrevisions-files' => '{{PLURAL:$1|Yksi versio|$1 versiota}} ja {{PLURAL:$2|yksi tiedosto|$2 tiedostoa}} palautettiin',
 'undeletedfiles' => '{{PLURAL:$1|1 tiedosto|$1 tiedostoa}} palautettiin',
-'cannotundelete' => 'Palauttaminen epäonnistui; joku muu on voinut jo palauttaa sivun.',
+'cannotundelete' => 'Palauttaminen epäonnistui:
+$1',
 'undeletedpage' => "'''$1 on palautettu.'''
 
 [[Special:Log/delete|Poistolokista]] löydät listan viimeisimmistä poistoista ja palautuksista.",
@@ -2495,7 +2510,7 @@ $1',
 'blanknamespace' => '(sivut)',
 
 # Contributions
-'contributions' => 'Käyttäjän muokkaukset',
+'contributions' => '{{GENDER:$1|Käyttäjän}} muokkaukset',
 'contributions-title' => 'Käyttäjän $1 muokkaukset',
 'mycontris' => 'Omat muokkaukset',
 'contribsub2' => 'Käyttäjän $1 ($2) muokkaukset',
@@ -2576,7 +2591,7 @@ Alla on viimeisin estolokin tapahtuma:',
 'ipb-confirm' => 'Vahvista esto',
 'badipaddress' => 'IP-osoite on väärin muotoiltu.',
 'blockipsuccesssub' => 'Esto onnistui',
-'blockipsuccesstext' => 'Käyttäjä tai IP-osoite [[Special:Contributions/$1|$1]] on estetty.<br />
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] on estetty.<br />
 Voimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].',
 'ipb-blockingself' => 'Olet estämässä itseäsi. Oletko varma, että haluat tehdä niin?',
 'ipb-confirmhideuser' => 'Olet estämässä käyttäjää ”piilota käyttäjä” -toiminnon kanssa.  Tämä piilottaa käyttäjän nimen kaikissa luetteloissa ja lokitapahtumissa.  Oletko varma, että haluat tehdä näin?',
@@ -2751,6 +2766,7 @@ $1 {{PLURAL:$1|sivu|sivua}} siirrettiin.',
 'immobile-target-namespace-iw' => 'Kielilinkki ei ole kelvollinen kohde sivun siirrolle.',
 'immobile-source-page' => 'Tämä sivu ei ole siirrettävissä.',
 'immobile-target-page' => 'Kyseiselle kohdenimelle ei voi siirtää.',
+'bad-target-model' => 'Kohde käyttää eri sisältömallia. Sisällön muuttaminen muodosta $1 muotoon $2 ei ole mahdollista.',
 'imagenocrossnamespace' => 'Tiedostoja ei voi siirtää pois tiedostonimiavaruudesta.',
 'nonfile-cannot-move-to-file' => 'Sivuja ei voi siirtää tiedostonimiavaruuteen.',
 'imagetypemismatch' => 'Uusi tiedostopääte ei vastaa tiedoston tyyppiä',
@@ -2829,6 +2845,7 @@ Jos haluat muokata MediaWikin yleistä kotoistusta, käy [//www.mediawiki.org/wi
 'import-interwiki-templates' => 'Liitä kaikki mallineet',
 'import-interwiki-submit' => 'Tuo',
 'import-interwiki-namespace' => 'Kohdenimiavaruus:',
+'import-interwiki-rootpage' => 'Tuo annetun sivun alasivuiksi (valinnainen):',
 'import-upload-filename' => 'Tiedostonimi:',
 'import-comment' => 'Syy',
 'importtext' => 'Vie sivuja lähdewikistä käyttäen [[Special:Export|vientityökalua]].
@@ -2861,6 +2878,9 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 'import-error-interwiki' => 'Sivua $1 ei voitu tuoda, koska sen nimi on varattu ulkoisen linkittämisen (interwiki).',
 'import-error-special' => 'Sivua $1 ei tuoda, koska se kuuluu nimitilaan, joka ei salli sivuja.',
 'import-error-invalid' => 'Sivua $1 ei tuoda, koska sen nimi ei kelpaa.',
+'import-options-wrong' => '{{PLURAL:$2|Väärä asetus|Väärät asetukset}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Annettu sivun nimi ei kelpaa.',
+'import-rootpage-nosubpage' => 'Annetun sivun nimiavaruus $1 ei salli alasivuja.',
 
 # Import log
 'importlogpage' => 'Tuontiloki',
@@ -2872,7 +2892,6 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScriptin testaus',
-'javascripttest-disabled' => 'Tämä toiminto ei ole käytössä tässä wikissä.',
 'javascripttest-title' => 'Suoritetaan $1-testejä.',
 'javascripttest-pagetext-noframework' => 'Tämä sivu on varattu JavaScript-testien suorittamiseen.',
 'javascripttest-pagetext-unknownframework' => 'Tuntematon testausalusta $1.',
@@ -3010,18 +3029,41 @@ Tallenna tiedot koneellesi ja tuo ne tällä sivulla.',
 
 # Info page
 'pageinfo-title' => 'Tietoja sivusta $1',
+'pageinfo-not-current' => 'Tätä tietoa on mahdoton näyttää vanhoille versiolle.',
 'pageinfo-header-basic' => 'Perustiedot',
-'pageinfo-header-edits' => 'Muokkaushistoria',
+'pageinfo-header-edits' => 'Muutoshistoria',
 'pageinfo-header-restrictions' => 'Sivun suojaus',
 'pageinfo-header-properties' => 'Sivun ominaisuudet',
+'pageinfo-display-title' => 'Sivun otsikko',
+'pageinfo-default-sort' => 'Oletuslajitteluavain',
+'pageinfo-length' => 'Sivun pituus (tavuina)',
+'pageinfo-article-id' => 'Sivun tunniste',
+'pageinfo-language' => 'Sivun sisällön kieli',
+'pageinfo-robot-policy' => 'Hakukonemerkinnät',
+'pageinfo-robot-index' => 'Indeksoitava',
+'pageinfo-robot-noindex' => 'Ei indeksoitava',
 'pageinfo-views' => 'Katselukertojen määrä',
 'pageinfo-watchers' => 'Sivun tarkkailijoiden lukumäärä',
 'pageinfo-redirects-name' => 'Sivulle johtavat ohjaukset',
 'pageinfo-subpages-name' => 'Sivun alasivut',
-'pageinfo-firstuser' => 'Sivun luoja',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ohjaus|ohjausta}}; $3 {{PLURAL:$3|ei-ohjausta}})',
+'pageinfo-firstuser' => 'Sivun luonut',
+'pageinfo-firsttime' => 'Sivun luontipäivämäärä',
 'pageinfo-lastuser' => 'Viimeisin muokkaaja',
+'pageinfo-lasttime' => 'Viimeisin muokkauspäivämäärä',
 'pageinfo-edits' => 'Muokkausten kokonaismäärä',
 'pageinfo-authors' => 'Sivun eri muokkaajien kokonaismäärä',
+'pageinfo-recent-edits' => 'Tuoreita muutoksia ($1)',
+'pageinfo-recent-authors' => 'Tuoreita muokkaajia',
+'pageinfo-magic-words' => '{{PLURAL:$1|Taikasana|Taikasanat}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Piilotettu luokka|Piilotetut luokat}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Sisällytetty malline|Sisällytetyt mallineet}} ($1)',
+'pageinfo-toolboxlink' => 'Sivun tiedot',
+'pageinfo-redirectsto' => 'Ohjaus sivulle',
+'pageinfo-redirectsto-info' => 'tiedot',
+'pageinfo-contentpage' => 'Lasketaan sisältösivuksi',
+'pageinfo-contentpage-yes' => 'Kyllä',
+'pageinfo-protect-cascading-yes' => 'Kyllä',
 
 # Skin names
 'skinname-standard' => 'Perus',
@@ -3075,6 +3117,7 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
 'file-info-size-pages' => '$1 × $2 kuvapistettä, tiedoston koko $3, MIME-tyyppi $4, $5 {{PLURAL:$5|sivu|sivua}}',
 'file-nohires' => 'Tarkempaa kuvaa ei ole saatavilla.',
 'svg-long-desc' => 'SVG-tiedosto; oletustarkkuus $1 × $2 kuvapistettä; tiedostokoko $3',
+'svg-long-desc-animated' => 'Animoitu SVG-tiedosto; oletustarkkuus $1 × $2 kuvapistettä; tiedostokoko $3',
 'show-big-image' => 'Korkeatarkkuuksinen versio',
 'show-big-image-preview' => 'Tämän esikatselun koko: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Muu resoluutio|Muut resoluutiot}}: $1.',
@@ -3084,6 +3127,8 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
 'file-info-png-looped' => 'toistuva',
 'file-info-png-repeat' => 'toistettu $1 {{PLURAL:$1|kertaa|kertaa}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|kehys|kehystä}}',
+'file-no-thumb-animation' => "'''Huomautus: Teknisten rajoitusten vuoksi tämän tiedoston pienoiskuvat eivät ole animoituja.'''",
+'file-no-thumb-animation-gif' => "'''Huomautus: Teknisten rajoitusten vuoksi korkearesoluutioisten GIF-kuvien pienoiskuvat eivät ole animoituja.'''",
 
 # Special:NewFiles
 'newimages' => 'Uudet tiedostot',
@@ -3103,6 +3148,7 @@ Suorittamalla sen järjestelmäsi voi muuttua epäluotettavaksi.",
 'hours' => '{{PLURAL:$1|$1 tunti|$1 tuntia}}',
 'days' => '{{PLURAL:$1|$1 päivä|$1 päivää}}',
 'ago' => '$1 sitten',
+'just-now' => 'juuri nyt',
 
 # Bad image list
 'bad_image_list' => 'Listan muoto on seuraava:
@@ -3526,7 +3572,7 @@ Kaikki muut linkit ovat poikkeuksia eli toisin sanoen sivuja, joissa tiedostoa s
 'edit-externally-help' => '(Katso [//www.mediawiki.org/wiki/Manual:External_editors ohjeet], jos haluat lisätietoja.)',
 
 # 'all' in various places, this might be different for inflected languages
-'watchlistall2' => 'koko historia',
+'watchlistall2' => 'koko historia',
 'namespacesall' => 'kaikki',
 'monthsall' => 'kaikki',
 'limitall' => 'kaikki',
@@ -3588,6 +3634,7 @@ Varmennuskoodi vanhenee $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Wikienvälinen sisällytys ei ole käytössä]',
 'scarytranscludefailed' => '[Mallineen hakeminen epäonnistui: $1]',
+'scarytranscludefailed-httpstatus' => '[Mallineen hakeminen epäonnistui: $1 HTTP $2]',
 'scarytranscludetoolong' => '[Verkko-osoite on liian pitkä]',
 
 # Delete conflict
@@ -3845,8 +3892,8 @@ Kuvat näytetään täysikokoisina. Muut tiedostot avataan niille määritetyss
 'logentry-move-move_redir-noredirect' => '$1 siirsi sivun $3 ohjauksen $4 päälle luomatta ohjausta',
 'logentry-patrol-patrol' => '$1 merkitsi sivun $3 muutoksen $4 tarkastetuksi',
 'logentry-patrol-patrol-auto' => '$1 merkitsi automaattisesti sivun $3 muutoksen $4 tarkastetuksi',
-'logentry-newusers-newusers' => '$1 loi käyttäjätunnuksen',
-'logentry-newusers-create' => '$1 loi käyttäjätunnuksen',
+'logentry-newusers-newusers' => 'Käyttäjätunnus $1 luotiin',
+'logentry-newusers-create' => 'Käyttäjätunnus $1 luotiin',
 'logentry-newusers-create2' => '$1 loi käyttäjätunnuksen $3',
 'logentry-newusers-autocreate' => 'Käyttäjätunnus $1 luotiin automaattisesti',
 'newuserlog-byemail' => 'salasana lähetetty sähköpostitse',
@@ -3867,6 +3914,10 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'feedback-bugcheck' => 'Hyvä! Varmista, että ohjelmointivirhe ei vielä löydy [$1 tästä listasta].',
 'feedback-bugnew' => 'Varmistin. Ilmoitan uuden ohjelmointivirheen',
 
+# Search suggestions
+'searchsuggest-search' => 'Hae',
+'searchsuggest-containing' => 'sisältää...',
+
 # API errors
 'api-error-badaccess-groups' => 'Sinulla ei ole oikeutta tallentaa tiedostoja tähän wikiin.',
 'api-error-badtoken' => 'Sisäinen virhe: virheellinen tarkistussumma.',
@@ -3919,4 +3970,6 @@ Muussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi
 'duration-centuries' => '$1 {{PLURAL:$1|vuosisata|vuosisataa}}',
 'duration-millennia' => '$1 {{PLURAL:$1|vuosituhat|vuosituhatta}}',
 
+# Unknown messages
+'svg-long-error' => 'Kelvoton SVG-tiedosto: $1',
 );
index a20078a..5f838b8 100644 (file)
@@ -44,7 +44,7 @@ $messages = array(
 'tog-shownumberswatching' => 'Näytä kuinka moni käyttäjä valvoo sivua',
 'tog-oldsig' => 'Nykynen allekirjotus',
 'tog-fancysig' => 'Mookkaamaton allekirjotus ilman auttomaattista linkkiä',
-'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. (<span class="plainlinks">[[//www.mediawiki.org/wiki/Manual:External_editors Ohje]</span>)',
+'tog-externaleditor' => 'Käytä ekterniä tekstiedituuria stantartina. Vain kokenheile käyttäjile, vaatii taattorin asetuksitten muuttamista. Käytä eksterniä tekstiedituuria oletuksena. Vain kokeneille käyttäjille, vaatii selaimen asetusten muuttamista. ([//www.mediawiki.org/wiki/Manual:External_editors Ohje])',
 
 # Dates
 'sunday' => 'pyhä',
@@ -120,7 +120,6 @@ $messages = array(
 # Cologne Blue skin
 'qbedit' => 'Mookkaa',
 'qbpageoptions' => 'Tämä sivu',
-'qbpageinfo' => 'Sisältö',
 'qbmyoptions' => 'Minun inställninkit',
 'qbspecialpages' => 'Spesiaali sivut',
 'faq' => 'Useasti kysytyt kysymykset',
index 2055a8f..7ee949f 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'Sigatabu',
-'monday'        => 'Moniti',
-'tuesday'       => 'Tusiti',
-'wednesday'     => 'Vukelulu',
-'thursday'      => 'Lotulevu',
-'friday'        => 'Vakaraubuka',
-'saturday'      => 'Vakarauwai',
-'sun'           => 'Sigatabu',
-'mon'           => 'Moniti',
-'tue'           => 'Tusiti',
-'wed'           => 'Vukelulu',
-'thu'           => 'Lotulevu',
-'fri'           => 'Vakaraubuka',
-'sat'           => 'Vakarauwai',
-'january'       => 'Janueri',
-'february'      => 'Veverueri',
-'march'         => 'Maji',
-'april'         => 'Epereli',
-'july'          => 'Jiulai',
-'august'        => 'Okosita',
-'september'     => 'Seviteba',
-'october'       => 'Okotova',
-'november'      => 'Noveba',
-'december'      => 'Tiseba',
-'january-gen'   => 'Janueri',
-'february-gen'  => 'Veverueri',
-'march-gen'     => 'Maji',
-'april-gen'     => 'Evereli',
-'may-gen'       => 'Me',
-'july-gen'      => 'Jiulai',
-'august-gen'    => 'Okosita',
+'sunday' => 'Sigatabu',
+'monday' => 'Moniti',
+'tuesday' => 'Tusiti',
+'wednesday' => 'Vukelulu',
+'thursday' => 'Lotulevu',
+'friday' => 'Vakaraubuka',
+'saturday' => 'Vakarauwai',
+'sun' => 'Sigatabu',
+'mon' => 'Moniti',
+'tue' => 'Tusiti',
+'wed' => 'Vukelulu',
+'thu' => 'Lotulevu',
+'fri' => 'Vakaraubuka',
+'sat' => 'Vakarauwai',
+'january' => 'Janueri',
+'february' => 'Veverueri',
+'march' => 'Maji',
+'april' => 'Epereli',
+'july' => 'Jiulai',
+'august' => 'Okosita',
+'september' => 'Seviteba',
+'october' => 'Okotova',
+'november' => 'Noveba',
+'december' => 'Tiseba',
+'january-gen' => 'Janueri',
+'february-gen' => 'Veverueri',
+'march-gen' => 'Maji',
+'april-gen' => 'Evereli',
+'may-gen' => 'Me',
+'july-gen' => 'Jiulai',
+'august-gen' => 'Okosita',
 'september-gen' => 'Seviteba',
-'october-gen'   => 'Okotova',
-'november-gen'  => 'Noveba',
-'december-gen'  => 'Tiseba',
-'jan'           => 'Janueri',
-'feb'           => 'Veverueri',
-'mar'           => 'Maji',
-'apr'           => 'Epereli',
-'may'           => 'Me',
-'jun'           => 'June',
-'jul'           => 'Julai',
-'aug'           => 'Okosita',
-'sep'           => 'Seviteba',
-'oct'           => 'Okotova',
-'nov'           => 'Noveba',
-'dec'           => 'Tiseba',
-
-'cancel'     => 'Sasamaki',
-'mytalk'     => 'Noqu vosa',
+'october-gen' => 'Okotova',
+'november-gen' => 'Noveba',
+'december-gen' => 'Tiseba',
+'jan' => 'Janueri',
+'feb' => 'Veverueri',
+'mar' => 'Maji',
+'apr' => 'Epereli',
+'may' => 'Me',
+'jun' => 'June',
+'jul' => 'Julai',
+'aug' => 'Okosita',
+'sep' => 'Seviteba',
+'oct' => 'Okotova',
+'nov' => 'Noveba',
+'dec' => 'Tiseba',
+
+'cancel' => 'Sasamaki',
+'mytalk' => 'Noqu vosa',
 'navigation' => 'Vakatasosoko',
 
 # Cologne Blue skin
 'qbedit' => 'Veisautaki',
 
-'help'             => 'Veivuke',
-'search'           => 'Vaqaqara',
-'searchbutton'     => 'Vaqaqara',
-'go'               => 'Lako',
-'searcharticle'    => 'Lako',
-'history_short'    => 'Tukuni',
+'help' => 'Veivuke',
+'search' => 'Vaqaqara',
+'searchbutton' => 'Vaqaqara',
+'go' => 'Lako',
+'searcharticle' => 'Lako',
+'history_short' => 'Tukuni',
 'printableversion' => 'Tikina e rawa ni tabaki',
-'permalink'        => 'Sema tudei',
-'edit'             => 'Veisautaki',
-'delete'           => 'Vakarusa',
-'protect'          => 'Taqomaki',
-'unprotect'        => 'Sega ni taqomaki',
-'talk'             => 'Veiwasei',
-'toolbox'          => 'Kato ni yaya',
-'otherlanguages'   => 'Veimataqali vosa',
+'permalink' => 'Sema tudei',
+'edit' => 'Veisautaki',
+'delete' => 'Vakarusa',
+'protect' => 'Taqomaki',
+'unprotect' => 'Sega ni taqomaki',
+'talk' => 'Veiwasei',
+'toolbox' => 'Kato ni yaya',
+'otherlanguages' => 'Veimataqali vosa',
 'jumptonavigation' => 'Vakatasosoko',
-'jumptosearch'     => 'Vaqaqara',
+'jumptosearch' => 'Vaqaqara',
 
 # 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).
-'currentevents'        => 'Tukutuku kuruvaki',
-'currentevents-url'    => 'Project:Tukutuku kuruvaki',
-'edithelp'             => 'Veivukei',
-'mainpage'             => 'Tabana levu',
+'currentevents' => 'Tukutuku kuruvaki',
+'currentevents-url' => 'Project:Tukutuku kuruvaki',
+'edithelp' => 'Veivukei',
+'mainpage' => 'Tabana levu',
 'mainpage-description' => 'Tabana levu',
-'portal'               => 'Soqosoqo toso',
+'portal' => 'Soqosoqo toso',
 
 'editsection' => 'Veisautaki',
-'editold'     => 'Veisautaki',
+'editold' => 'Veisautaki',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Vola volai',
 
 # Login and logout pages
-'yourname'           => 'Yaca vakayagataki',
-'yourpassword'       => 'Yaca vuni',
-'yourpasswordagain'  => 'Vola tale na Yaca vuni',
+'yourname' => 'Yaca vakayagataki',
+'yourpassword' => 'Yaca vuni',
+'yourpasswordagain' => 'Vola tale na Yaca vuni',
 'remembermypassword' => 'Nanuma na yacaqu ena komipiuta oqo (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'              => 'Curu mai',
-'userlogin'          => 'Curu mai / Dolava nomu Akaude',
-'logout'             => 'Curu yani',
-'userlogout'         => 'Curu yani',
-'nologinlink'        => 'Dolava nomu Akaude',
-'createaccount'      => 'Dolava nomu Akaude',
-'gotaccountlink'     => 'Curu mai',
+'login' => 'Curu mai',
+'userlogin' => 'Curu mai / Dolava nomu Akaude',
+'logout' => 'Curu yani',
+'userlogout' => 'Curu yani',
+'nologinlink' => 'Dolava nomu Akaude',
+'createaccount' => 'Dolava nomu Akaude',
+'gotaccountlink' => 'Curu mai',
 
 # Edit pages
-'summary'      => 'Kena i Soqoni:',
-'watchthis'    => 'Vakaraica toka na tabana oqo',
-'savearticle'  => 'Vakabula na tabana oqo',
-'showpreview'  => 'Vakaraitaka na kenai yaloyalo',
-'showdiff'     => 'Vakaritaka na veisau',
+'summary' => 'Kena i Soqoni:',
+'watchthis' => 'Vakaraica toka na tabana oqo',
+'savearticle' => 'Vakabula na tabana oqo',
+'showpreview' => 'Vakaraitaka na kenai yaloyalo',
+'showdiff' => 'Vakaritaka na veisau',
 'loginreqlink' => 'Curu mai',
 
 # Search results
 'powersearch' => 'Vaqaqara',
 
 # Preferences page
-'mypreferences'     => 'Ulutaga taleitaki',
+'mypreferences' => 'Ulutaga taleitaki',
 'searchresultshead' => 'Vaqaqara',
-'youremail'         => 'I vola livaliva *:',
-'username'          => 'Yaca vakayagataki:',
-'email'             => 'I vola livaliva',
+'youremail' => 'I vola livaliva *:',
+'username' => 'Yaca vakayagataki:',
+'email' => 'I vola livaliva',
 
 # Recent changes
 'recentchanges' => 'Veisau vovou',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Veisau e veiwekani',
-'recentchangeslinked-feed'    => 'Veisau e veiwekani',
+'recentchangeslinked' => 'Veisau e veiwekani',
+'recentchangeslinked-feed' => 'Veisau e veiwekani',
 'recentchangeslinked-toolbox' => 'Veisau e veiwekani',
 
 # Upload
-'upload'            => 'Vakasinaita',
-'uploadbtn'         => 'Vakasinaita',
-'filedesc'          => 'Kena i Soqoni',
+'upload' => 'Vakasinaita',
+'uploadbtn' => 'Vakasinaita',
+'filedesc' => 'Kena i Soqoni',
 'fileuploadsummary' => 'Kena i Soqoni:',
-'watchthisupload'   => 'Vakaraica toka na tabana oqo',
+'watchthisupload' => 'Vakaraica toka na tabana oqo',
 
 # Random page
 'randompage' => 'Vakawasoma',
 
-'brokenredirects-edit'   => 'Veisautaki',
+'brokenredirects-edit' => 'Veisautaki',
 'brokenredirects-delete' => 'Vakarusa',
 
 # Miscellaneous special pages
 'newpages-username' => 'Yaca vakayagataki:',
-'move'              => 'Toso',
-'movethispage'      => 'Toso na tabana oqo',
+'move' => 'Toso',
+'movethispage' => 'Toso na tabana oqo',
 
 # Special:AllPages
 'allpagessubmit' => 'Lako',
@@ -163,8 +163,8 @@ $messages = array(
 'defemailsubject' => '{{SITENAME}} I vola livaliva',
 
 # Watchlist
-'watchlist'     => 'Ulutaga yadravi',
-'watch'         => 'Vakaraica mada',
+'watchlist' => 'Ulutaga yadravi',
+'watch' => 'Vakaraica mada',
 'watchthispage' => 'Vakaraica toka na tabana oqo',
 
 # Restrictions (nouns)
@@ -185,17 +185,17 @@ $messages = array(
 
 # Move page
 'move-page-legend' => 'Toso kina yasana kadua',
-'movearticle'      => 'Toso kina yasana kadua',
-'move-watch'       => 'Vakaraica toka na tabana oqo',
-'movepagebtn'      => 'Toso kina yasana kadua',
-'movereason'       => 'Vuna',
+'movearticle' => 'Toso kina yasana kadua',
+'move-watch' => 'Vakaraica toka na tabana oqo',
+'movepagebtn' => 'Toso kina yasana kadua',
+'movereason' => 'Vuna',
 
 # Tooltip help for the actions
 'tooltip-pt-preferences' => 'Ulutaga taleitaki',
-'tooltip-pt-logout'      => 'Curu yani',
-'tooltip-ca-move'        => 'Toso na tabana oqo',
-'tooltip-search'         => 'Vaqaqara {{SITENAME}}',
-'tooltip-p-logo'         => 'Tabana levu',
+'tooltip-pt-logout' => 'Curu yani',
+'tooltip-ca-move' => 'Toso na tabana oqo',
+'tooltip-search' => 'Vaqaqara {{SITENAME}}',
+'tooltip-p-logo' => 'Tabana levu',
 
 # Special:NewFiles
 'ilsubmit' => 'Vaqaqara',
index fbab491..fd19ce3 100644 (file)
  * @author לערי ריינהארט
  */
 
-$bookstoreList = array(
-       'Bokasolan.fo' => 'http://www.bokasolan.fo/vleitari.asp?haattur=bok.alfa&Heiti=&Hovindur=&Forlag=&innbinding=Oell&bolkur=Allir&prisur=Allir&Aarstal=Oell&mal=Oell&status=Oell&ISBN=$1',
-       'inherit' => true,
-);
-
 $namespaceNames = array(
        NS_MEDIA            => 'Miðil',
        NS_SPECIAL          => 'Serstakt',
@@ -53,15 +48,6 @@ $namespaceAliases = array(
        'Bólkur_kjak' => NS_CATEGORY_TALK,
 );
 
-
-$datePreferences = false;
-$defaultDateFormat = 'dmy';
-$dateFormats = array(
-       'dmy time' => 'H:i',
-       'dmy date' => 'j. M Y',
-       'dmy both' => 'j. M Y "kl." H:i',
-);
-
 $specialPageAliases = array(
        'Allmessages'               => array( 'Øll kervisboð' ),
        'Allpages'                  => array( 'Allar síður' ),
@@ -109,6 +95,19 @@ $specialPageAliases = array(
        'Watchlist'                 => array( 'Mítt eftirlit' ),
 );
 
+$datePreferences = false;
+$defaultDateFormat = 'dmy';
+$dateFormats = array(
+       'dmy time' => 'H:i',
+       'dmy date' => 'j. M Y',
+       'dmy both' => 'j. M Y "kl." H:i',
+);
+
+$bookstoreList = array(
+       'Bokasolan.fo' => 'http://www.bokasolan.fo/vleitari.asp?haattur=bok.alfa&Heiti=&Hovindur=&Forlag=&innbinding=Oell&bolkur=Allir&prisur=Allir&Aarstal=Oell&mal=Oell&status=Oell&ISBN=$1',
+       'inherit' => true,
+);
+
 $linkTrail = '/^([áðíóúýæøa-z]+)(.*)$/sDu';
 
 $messages = array(
@@ -246,7 +245,7 @@ $messages = array(
 'cancel' => 'Ógilda',
 'moredotdotdot' => 'Meira...',
 'mypage' => 'Mín síða',
-'mytalk' => 'Mítt kjak',
+'mytalk' => 'Kjak',
 'anontalk' => 'Kjak til hesa ip-adressuna',
 'navigation' => 'Navigatión',
 'and' => '&#32;og',
@@ -256,7 +255,6 @@ $messages = array(
 'qbbrowse' => 'Kaga',
 'qbedit' => 'Rætta',
 'qbpageoptions' => 'Henda síðan',
-'qbpageinfo' => 'Samanhangur',
 'qbmyoptions' => 'Mínar síður',
 'qbspecialpages' => 'Serstakar síður',
 'faq' => 'OSS',
@@ -494,7 +492,7 @@ Vinarliga royn aftur um fáir minuttir.',
 'editinginterface' => "↓ '''Ávaring:''' Tú rættar eina síðu sum verður brúkt til at geva markamóts tekst til ritbúnaðin (software).
 Broytingar á hesi síðu fara at ávirka útsjóndina á brúkara markamótinum (interface) fyri aðrir brúkarar.
 Fyri at gera týðingar verður tú vinarliga biðin um at umhugsa at brúka [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], sum er verkætlan fyri týðingum av MediaWiki.",
-'sqlhidden' => '↓ (SQL fyrispurningur fjaldur)',
+'sqlhidden' => '(SQL fyrispurningur fjaldur)',
 'cascadeprotected' => 'Henda síðan er vard fyri rættingum, tí hon er í fylgjandi {{PLURAL:$1|síðu, sum er|síðum, sum eru}}
 vardar við "arvaðari síðuverjing"
 $2',
@@ -514,12 +512,11 @@ Givin orsøk er "\'\'$2\'\'".',
 
 # Login and logout pages
 'logouttext' => "'''Tú hevur nú ritað út.'''
-Tú kanst halda fram at brúka {{SITENAME}} sum dulnevndur, ella kanst tú [[Special:UserLogin|logga á aftur]] sum sami ella sum annar brúkari. 
+Tú kanst halda fram at brúka {{SITENAME}} sum dulnevndur, ella kanst tú <span class='plainlinks'>[\$1 logga á aftur]</span> sum sami ella sum annar brúkari. 
 Legg til merkis, at summar síður framvegis vera vístar, sum um tú enn vart loggaður á, til tú hevur reinsa tín brovsara fyri \"cache\".",
-'welcomecreation' => '== Vælkomin, $1! ==
-
-Tín konta er nú stovnað.
-Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}} innstillingar]].',
+'welcomeuser' => 'Vælkomin, $1!',
+'welcomecreation-msg' => 'Tín konta er nú stovnað.
+Gloym ikki at broyta tínar [[Special:Preferences|{{SITENAME}}-innstillingar]].',
 'yourname' => 'Títt brúkaranavn:',
 'yourpassword' => 'Títt loyniorð:',
 'yourpasswordagain' => 'Skriva loyniorð umaftur:',
@@ -796,7 +793,6 @@ Tann seinasti sperringar gerðalistin er her niðanfyri fyri ávísing:',
 * '''Firefox / Safari:''' Halt ''Shift'' meðan tú klikkir á ''Reload'', ella trýst antin ''Ctrl-F5'' ella ''Ctrl-R'' (''Command-R'' á einari Mac)
 * '''Google Chrome:''' Trýst ''Ctrl-Shift-R'' (''⌘-Shift-R'' á einari Mac)
 * '''Internet Explorer:''' Halt ''Ctrl'' meðan tú trýstir á ''Refresh'', ella trýst á ''Ctrl-F5''
-* '''Konqueror:''' Trýst ''Reload'' ella trýst ''F5''
 * '''Opera:''' Reinsa cache í ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Gott ráð:''' Brúka \"{{int:showpreview}}\" knappin fyri at royna tína nýggju CSS áðrenn tú goymir.",
 'userjsyoucanpreview' => "'''Gott ráð:''' Brúka \"{{int:showpreview}}\" knappin fyri at royna títt nýggja JavaScript áðrenn tú goymir.",
@@ -1071,8 +1067,6 @@ Tú hevur ikki atgongd til hann.',
 'search-interwiki-caption' => 'Líknandi verkætlanir',
 'search-interwiki-default' => '$1 úrslit:',
 'search-interwiki-more' => '(meira)',
-'search-mwsuggest-enabled' => 'við uppskotum',
-'search-mwsuggest-disabled' => 'ongi uppskot',
 'search-relatedarticle' => 'Líknandi',
 'mwsuggest-disable' => 'Slá AJAX uppskot frá',
 'searcheverything-enable' => 'Leita í øllum navnaøkjum',
@@ -1107,7 +1101,7 @@ Legg til merkis, at teirra innihaldsyvirlit av {{SITENAME}} kann vera gamalt og
 
 # Preferences page
 'preferences' => 'Innstillingar',
-'mypreferences' => 'Mínar innstillingar',
+'mypreferences' => 'Innstillingar',
 'prefs-edits' => 'Tal av rættingum:',
 'prefsnologin' => 'Tú hevur ikki ritað inn',
 'changepassword' => 'Broyt loyniorð',
@@ -1768,9 +1762,7 @@ Vilt tú flyta síðuna undan tínum eftirliti, kanst tú trýsta á \"Strika ef
 'watching' => 'Eftirlitir...',
 'unwatching' => 'Strikar eftirlit...',
 
-'enotif_newpagetext' => 'Hetta er ein nýggj síða.',
 'enotif_impersonal_salutation' => '{{SITENAME}}brúkari',
-'created' => 'stovnað',
 
 # Delete
 'deletepage' => 'Strika síðu',
@@ -1860,16 +1852,16 @@ broytti tað aftur til seinastu versjón hjá $2.',
 'blanknamespace' => '(Greinir)',
 
 # Contributions
-'contributions' => 'Brúkaraíkast',
-'contributions-title' => 'Brúkara íkøst fyri $1',
-'mycontris' => 'Mítt íkast',
+'contributions' => '{{GENDER:$1|Brúkaraíkøst}}',
+'contributions-title' => 'Brúkaraíkøst fyri $1',
+'mycontris' => 'Íkøst',
 'contribsub2' => 'Eftir $1 ($2)',
 'uctop' => '(ovast)',
 'month' => 'Frá mánaði (og áðrenn):',
 'year' => 'Frá ár (og áðrenn):',
 
 'sp-contributions-newbies' => 'Vís bert íkast frá nýggjum kontoum',
-'sp-contributions-blocklog' => 'Bannagerðabók',
+'sp-contributions-blocklog' => 'bannagerðabók',
 'sp-contributions-uploads' => 'uploads',
 'sp-contributions-logs' => 'gerðalistar (logglistar)',
 'sp-contributions-talk' => 'kjak',
@@ -1893,7 +1885,7 @@ broytti tað aftur til seinastu versjón hjá $2.',
 'whatlinkshere-hideredirs' => '$1 umdirigeringar',
 'whatlinkshere-hidetrans' => '$1 innkluderingar (transclusions)',
 'whatlinkshere-hidelinks' => '$1 slóðir',
-'whatlinkshere-hideimages' => '$1 mynda slóðir',
+'whatlinkshere-hideimages' => '$1 fíluslóðir',
 'whatlinkshere-filters' => 'Filtur',
 
 # Block/unblock
@@ -2124,6 +2116,12 @@ Vinarliga vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] o
 'ilsubmit' => 'Leita',
 'bydate' => 'eftir dato',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 sekund}}',
+'minutes' => '{{PLURAL:$1|$1 minuttur|$1 minuttir}}',
+'hours' => '{{PLURAL:$1|$1 tími|$1 tímar}}',
+'days' => '{{PLURAL:$1|$1 dagur|$1 dagar}}',
+
 # Bad image list
 'bad_image_list' => 'Støddin er soleiðis: 
 
@@ -2248,11 +2246,16 @@ Hendan váttanarkoda fer úr gildi tann $4.',
 
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] filtur:',
+'tags-edit' => 'rætta',
+'tags-hitcount' => '$1 {{PLURAL:$1|broyting|broytingar}}',
 
 # Special:ComparePages
 'compare-page1' => 'Síða 1',
 'compare-page2' => 'Síða 2',
 
+# Search suggestions
+'searchsuggest-search' => 'Leita',
+
 # API errors
 'api-error-empty-file' => 'Fílan sum tú sendi inn var tóm.',
 'api-error-file-too-large' => 'Fílan sum tú sendi inn var óv stór.',
@@ -2262,4 +2265,14 @@ Hendan váttanarkoda fer úr gildi tann $4.',
 'api-error-unclassified' => 'Ein ókendur feilur hendi.',
 'api-error-unknown-code' => 'Ókendur feilur: "$1"',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|sekund}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuttur|minuttir}}',
+'duration-hours' => '$1 {{PLURAL:$1|tími|tímar}}',
+'duration-days' => '$1 {{PLURAL:$1|dagur|dagar}}',
+'duration-weeks' => '$1 {{PLURAL:$1|vika|vikur}}',
+'duration-years' => '$1 {{PLURAL:$1|ár}}',
+'duration-decades' => '$1 {{PLURAL:$1|áratíggju}}',
+'duration-centuries' => '$1 {{PLURAL:$1|øld|øldir}}',
+
 );
index 3a176a9..71c72a5 100644 (file)
  * @author Erkethan
  * @author Esbardu
  * @author Fryed-peach
+ * @author Geoleplubo
  * @author Giro720
  * @author Gomoko
  * @author Grondin
  * @author Guillom
  * @author Hashar
+ * @author Hello71
  * @author Hercule
  * @author Houcinee1
  * @author Hégésippe Cormier
@@ -50,6 +52,7 @@
  * @author Litlok
  * @author Lloffiwr
  * @author Louperivois
+ * @author Ltrlg
  * @author Lucyin
  * @author McDutchie
  * @author Meithal
@@ -73,6 +76,7 @@
  * @author TouzaxA
  * @author Tpt
  * @author Urhixidur
+ * @author VIGNERON
  * @author Verdy p
  * @author WikiEoFrEn
  * @author Wyz
  * @author לערי ריינהארט
  */
 
-$bookstoreList = array(
-       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
-       'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
-       'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
-       'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
-);
-
 $namespaceNames = array(
        NS_MEDIA            => 'Média',
        NS_SPECIAL          => 'Spécial',
@@ -120,20 +117,97 @@ $namespaceAliases = array(
        'Discussion_Catégorie' => NS_CATEGORY_TALK
 );
 
-$linkTrail = '/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÏÖÜÀÈÙ]+)(.*)$/sDu';
-
-$dateFormats = array(
-       'mdy time' => 'H:i',
-       'mdy date' => 'F j, Y',
-       'mdy both' => 'F j, Y à H:i',
-
-       'dmy time' => 'H:i',
-       'dmy date' => 'j F Y',
-       'dmy both' => 'j F Y à H:i',
-
-       'ymd time' => 'H:i',
-       'ymd date' => 'Y F j',
-       'ymd both' => 'Y F j à H:i',
+$specialPageAliases = array(
+       'Activeusers'               => array( 'Utilisateurs_actifs', 'UtilisateursActifs' ),
+       'Allmessages'               => array( 'Messages_système', 'Messages_systeme', 'Messagessystème', 'Messagessysteme' ),
+       'Allpages'                  => array( 'Toutes_les_pages', 'ToutesLesPages' ),
+       'Ancientpages'              => array( 'Pages_anciennes', 'PagesAnciennes', 'Anciennes_pages', 'AnciennesPages' ),
+       'Badtitle'                  => array( 'MauvaisTitre', 'Mauvais_titre' ),
+       'Blankpage'                 => array( 'Page_blanche', 'PageBlanche' ),
+       'Block'                     => array( 'Bloquer', 'Blocage' ),
+       'Blockme'                   => array( 'Bloquez-moi', 'Bloquezmoi' ),
+       'Booksources'               => array( 'Ouvrages_de_référence', 'Ouvrages_de_reference', 'Ouvragesderéférence', 'Ouvragesdereference', 'Recherche_ISBN', 'Recherche_isbn', 'RechercheISBN', 'Rechercheisbn' ),
+       'BrokenRedirects'           => array( 'Redirections_cassées', 'RedirectionCassées', 'Redirections_cassees', 'RedirectionsCassees' ),
+       'Categories'                => array( 'Catégories' ),
+       'ChangePassword'            => array( 'Changement_du_mot_de_passe', 'ChangementDuMotDePasse' ),
+       'Confirmemail'              => array( 'Confirmer_l\'adresse_de_contact', 'Confirmer_le_courriel', 'ConfirmerLeCourriel' ),
+       'CreateAccount'             => array( 'Créer_un_compte', 'CréerUnCompte', 'CréerCompte' ),
+       'Deadendpages'              => array( 'Pages_en_impasse', 'PagesEnImpasse' ),
+       'DeletedContributions'      => array( 'Contributions_supprimées', 'ContributionsSupprimées', 'ContributionSupprimees' ),
+       'Disambiguations'           => array( 'Homonymies', 'Homonymie', 'Pages_d\'homonymie' ),
+       'DoubleRedirects'           => array( 'Doubles_redirections', 'DoublesRedirections', 'Redirections_doubles', 'RedirectionsDoubles' ),
+       'Emailuser'                 => array( 'Envoyer_un_courriel', 'EnvoyerUnCourriel', 'Courriel', 'Envoyer_un_e-mail', 'EnvoyerUnEMail', 'E-mail', 'EMail' ),
+       'Export'                    => array( 'Exporter', 'Exportation' ),
+       'Fewestrevisions'           => array( 'Pages_les_moins_modifiées', 'PagesLesMoinsModifiées', 'Pages_les_moins_modifiees', 'PagesLesMoinsModifiees', 'Les_moins_modifiés', 'LesMoinsModifiés', 'Les_moins_modifies', 'LesMoinsModifies' ),
+       'FileDuplicateSearch'       => array( 'Recherche_fichier_en_double', 'RechercheFichierEnDouble' ),
+       'Filepath'                  => array( 'Chemin_du_fichier', 'CheminDuFichier', 'CheminFichier' ),
+       'Import'                    => array( 'Importer', 'Importation' ),
+       'Invalidateemail'           => array( 'Invalider_le_courriel', 'Invalider_courriel', 'InvaliderCourriel' ),
+       'BlockList'                 => array( 'Liste_des_blocages', 'ListeDesBlocages', 'Blocages', 'Utilisateurs_bloqués', 'UtilisateursBloqués', 'Utilisateurs_bloques', 'UtilisateursBloques', 'IP_bloquées', 'IPBloquees', 'IPBloquées' ),
+       'LinkSearch'                => array( 'Recherche_de_lien', 'Recherche_de_liens' ),
+       'Listadmins'                => array( 'Liste_des_administrateurs', 'Listedesadministrateurs', 'Liste_des_admins', 'Listedesadmins', 'Liste_admins', 'Listeadmins' ),
+       'Listbots'                  => array( 'Liste_des_bots', 'ListedesBots' ),
+       'Listfiles'                 => array( 'Liste_des_fichiers', 'ListeDesFichiers', 'Liste_des_images', 'ListeDesImages' ),
+       'Listgrouprights'           => array( 'Liste_des_droits_de_groupe', 'ListeDesDroitsDeGroupes' ),
+       'Listredirects'             => array( 'Liste_des_redirections', 'Listedesredirections', 'Liste_des_redirects', 'Listedesredirects', 'Liste_redirections', 'Listeredirections', 'Liste_redirects', 'Listeredirects' ),
+       'Listusers'                 => array( 'Liste_des_utilisateurs', 'ListeDesUtilisateurs', 'Utilisateurs' ),
+       'Lockdb'                    => array( 'Verrouiller_la_base', 'Verrouillerlabase', 'Verrouiller_base', 'Verrouillerbase', 'Verrouiller_BD', 'VerrouillerBD', 'Verrouiller_bd', 'Verrouillerbd' ),
+       'Log'                       => array( 'Journal', 'Journaux' ),
+       'Lonelypages'               => array( 'Pages_orphelines', 'PagesOrphelines' ),
+       'Longpages'                 => array( 'Pages_longues', 'PagesLongues' ),
+       'MergeHistory'              => array( 'Fusionner_les_historiques', 'FusionnerHistoriques', 'Fusionner_l\'historique', 'Fusionnerlhistorique' ),
+       'MIMEsearch'                => array( 'Recherche_MIME', 'RechercheMIME', 'Recherche_mime', 'Recherchemime' ),
+       'Mostcategories'            => array( 'Pages_les_plus_catégorisées', 'PagesLesPlusCatégorisées', 'Pages_les_plus_categorisees', 'PagesLesPlusCategorisees', 'Les_plus_catégorisés', 'LesPlusCatégorisés', 'Les_plus_categorises', 'LesPlusCategorises' ),
+       'Mostimages'                => array( 'Fichiers_les_plus_liés', 'FichiersLesPlusLiés', 'Fichiers_les_plus_lies', 'FichiersLesPlusLies', 'Fichiers_les_plus_utilisés', 'FichiersLesPlusUtilisés', 'Fichiers_les_plus_utilises', 'FichiersLesPlusUtilises', 'Images_les_plus_liées', 'ImagesLesPlusLiées', 'Images_les_plus_liees', 'ImagesLesPlusLiees', 'Images_les_plus_utilisées', 'ImagesLesPlusUtilisées', 'Images_les_plus_utilisees', 'ImagesLesPlusUtilisees' ),
+       'Mostlinked'                => array( 'Pages_les_plus_liées', 'PagesLesPlusLiées', 'Pages_les_plus_liees', 'PagesLesPlusLiees', 'Les_plus_liées', 'LesPlusLiées', 'Les_plus_liees', 'LesPlusLiees' ),
+       'Mostlinkedcategories'      => array( 'Catégories_les_plus_liées', 'CatégoriesLesPlusLiées', 'Categories_les_plus_liees', 'CategoriesLesPlusLiees', 'Catégories_les_plus_utilisées', 'CatégoriesLesPlusUtilisées', 'Categories_les_plus_utilisees', 'CategoriesLesPlusUtilisees' ),
+       'Mostlinkedtemplates'       => array( 'Modèles_les_plus_liés', 'ModèlesLesPlusLiés', 'Modeles_les_plus_lies', 'ModelesLesPlusLies', 'Modèles_les_plus_utilisés', 'ModèlesLesPlusUtilisés', 'Modeles_les_plus_utilises', 'ModelesLesPlusUtilises' ),
+       'Mostrevisions'             => array( 'Pages_les_plus_modifiées', 'PagesLesPlusModifiées', 'Pages_les_plus_modifiees', 'PagesLesPlusModifiees', 'Les_plus_modifiés', 'LesPlusModifiés', 'Les_plus_modifies', 'LesPlusModifies' ),
+       'Movepage'                  => array( 'Renommer_une_page', 'Renommer', 'Renommage' ),
+       'Mycontributions'           => array( 'Mes_contributions', 'Mescontributions' ),
+       'Mypage'                    => array( 'Ma_page', 'Mapage' ),
+       'Mytalk'                    => array( 'Mes_discussions', 'Mesdiscussions' ),
+       'Newimages'                 => array( 'Nouveaux_fichiers', 'NouveauxFichiers', 'Nouvelles_images', 'NouvellesImages' ),
+       'Newpages'                  => array( 'Nouvelles_pages', 'NouvellesPages', 'Pages_récentes', 'PagesRécentes', 'Pages_recentes', 'PagesRecentes' ),
+       'PasswordReset'             => array( 'Réinitialisation_du_mot_de_passe', 'RéinitialisationDuMotDePasse' ),
+       'PermanentLink'             => array( 'LienPermanent', 'Lien_permanent' ),
+       'Popularpages'              => array( 'Pages_les_plus_visitées', 'Pages_les_plus_visitees', 'Pageslesplusvisitées', 'Pageslesplusvisitees' ),
+       'Preferences'               => array( 'Préférences' ),
+       'Prefixindex'               => array( 'Index', 'Préfixes', 'Prefixes' ),
+       'Protectedpages'            => array( 'Pages_protégées', 'PagesProtégées', 'Pages_protegees', 'PagesProtegees' ),
+       'Protectedtitles'           => array( 'Titres_protégés', 'TitresProtégés', 'Titres_proteges', 'TitresProteges' ),
+       'Randompage'                => array( 'Page_au_hasard', 'PageAuHasard', 'Au_hasard', 'AuHasard', 'Aléatoire', 'Aleatoire' ),
+       'Randomredirect'            => array( 'Redirection_au_hasard', 'Redirect_au_hasard', 'Redirectionauhasard', 'Redirectauhasard', 'Redirection_aléatoire', 'Redirect_aléatoire', 'Redirectionaléatoire', 'Redirectaléatoire', 'Redirection_aleatoire', 'Redirect_aleatoire', 'Redirectionaleatoire', 'Redirectaleatoire' ),
+       'Recentchanges'             => array( 'Modifications_récentes', 'Modifications_recentes', 'ModificationsRécentes', 'ModificationsRecentes' ),
+       'Recentchangeslinked'       => array( 'Suivi_des_liens', 'SuiviDesLiens' ),
+       'Revisiondelete'            => array( 'Versions_supprimées', 'Versions_supprimees', 'Versionsupprimées', 'Versionsupprimees' ),
+       'Search'                    => array( 'Recherche', 'Rechercher', 'Chercher' ),
+       'Shortpages'                => array( 'Pages_courtes', 'PagesCourtes' ),
+       'Specialpages'              => array( 'Pages_spéciales', 'PagesSpéciales', 'Pages_speciales', 'PagesSpeciales' ),
+       'Statistics'                => array( 'Statistiques', 'Stats' ),
+       'Tags'                      => array( 'Balises' ),
+       'Unblock'                   => array( 'Débloquer', 'Déblocage' ),
+       'Uncategorizedcategories'   => array( 'Catégories_non_catégorisées', 'CatégoriesNonCatégorisées', 'Categories_non_categorisees', 'CategoriesNonCategorisees', 'Catégories_sans_catégorie', 'CatégoriesSansCatégorie', 'Categories_sans_categorie', 'CategoriesSansCategorie' ),
+       'Uncategorizedimages'       => array( 'Fichiers_non_catégorisés', 'FichiersNonCatégorisés', 'Fichiers_non_categorises', 'FichiersNonCategorises', 'Fichiers_sans_catégorie', 'FichiersSansCatégorie', 'Fichiers_sans_categorie', 'FichiersSansCategorie', 'Images_non_catégorisées', 'ImagesNonCatégorisées', 'Images_non_categorisees', 'ImagesNonCategorisees', 'Images_sans_catégorie', 'ImagesSansCatégorie', 'Images_sans_categorie', 'ImagesSansCategorie' ),
+       'Uncategorizedpages'        => array( 'Pages_non_catégorisées', 'PagesNonCatégorisées', 'Pages_non_categorisees', 'PagesNonCategorisees', 'Pages_sans_catégorie', 'PagesSansCatégorie', 'Pages_sans_categorie', 'PagesSansCategorie' ),
+       'Uncategorizedtemplates'    => array( 'Modèles_non_catégorisés', 'ModèlesNonCatégorisés', 'Modeles_non_categorises', 'ModelesNonCategorises', 'Modèles_sans_catégorie', 'ModèlesSansCatégorie', 'Modeles_sans_catégorie', 'ModelesSansCatégorie' ),
+       'Undelete'                  => array( 'Restaurer', 'Restauration' ),
+       'Unlockdb'                  => array( 'Déverrouiller_la_base', 'Déverrouillerlabase', 'Deverrouiller_la_base', 'Deverrouillerlabase', 'Déverrouiller_base', 'Déverrouillerbase', 'Deverrouiller_base', 'Deverrouillerbase', 'Déverrouiller_BD', 'DéverrouillerBD', 'Deverrouiller_BD', 'DeverrouillerBD', 'Déverrouiller_bd', 'Déverrouillerbd', 'Deverrouiller_bd', 'Deverrouillerbd' ),
+       'Unusedcategories'          => array( 'Catégories_inutilisées', 'CatégoriesInutilisées', 'Categories_inutilisees', 'CategoriesInutilisees', 'Catégories_non_utilisées', 'CatégoriesNonUtilisées', 'Categories_non_utilisees', 'CategoriesNonUtilisees' ),
+       'Unusedimages'              => array( 'Fichiers_inutilisés', 'FichiersInutilisés', 'Fichiers_inutilises', 'FichiersInutilises', 'Fichiers_non_utilisés', 'FichiersNon_utilisés', 'Fichiers_non_utilises', 'FichiersNon_utilises', 'Images_inutilisées', 'ImagesInutilisées', 'Images_inutilisees', 'ImagesInutilisees', 'Images_non_utilisées', 'ImagesNonUtilisées', 'Images_non_utilisees', 'ImagesNonUtilisees' ),
+       'Unusedtemplates'           => array( 'Modèles_inutilisés', 'Modèlesinutilisés', 'Modeles_inutilises', 'Modelesinutilises', 'Modèles_non_utilisés', 'Modèlesnonutilisés', 'Modeles_non_utilises', 'Modelesnonutilises' ),
+       'Unwatchedpages'            => array( 'Pages_non_suivies', 'Pagesnonsuivies' ),
+       'Upload'                    => array( 'Téléverser', 'Televerser', 'Téléversement', 'Televersement', 'Téléchargement', 'Telechargement' ),
+       'Userlogin'                 => array( 'Connexion', 'Identification' ),
+       'Userlogout'                => array( 'Déconnexion', 'Deconnexion' ),
+       'Userrights'                => array( 'Permissions', 'Droits', 'Droits_des_utilisateurs' ),
+       'Wantedcategories'          => array( 'Catégories_demandées', 'CatégoriesDemandées', 'Categories_demandees', 'CategoriesDemandees' ),
+       'Wantedfiles'               => array( 'Fichiers_demandés', 'FichiersDemandés', 'Fichiers_demandes', 'FichiersDemandes' ),
+       'Wantedpages'               => array( 'Pages_demandées', 'PagesDemandées', 'Pages_demandees', 'PagesDemandees', 'Liens_brisés', 'LiensBrisés', 'Liens_brises', 'LiensBrises' ),
+       'Wantedtemplates'           => array( 'Modèles_demandés', 'ModèlesDemandés', 'Modeles_demandes', 'ModelesDemandes' ),
+       'Watchlist'                 => array( 'Liste_de_suivi', 'ListeDeSuivi', 'Suivi' ),
+       'Whatlinkshere'             => array( 'Pages_liées', 'PagesLiées', 'Pages_liees', 'PagesLiees' ),
+       'Withoutinterwiki'          => array( 'Sans_interwiki', 'Sansinterwiki', 'Sans_interwikis', 'Sansinterwikis' ),
 );
 
 $magicWords = array(
@@ -143,7 +217,6 @@ $magicWords = array(
        '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' ),
@@ -276,97 +349,27 @@ $magicWords = array(
        'url_query'                 => array( '0', 'QUESTION', 'QUERY' ),
 );
 
-$specialPageAliases = array(
-       'Activeusers'               => array( 'Utilisateurs_actifs', 'UtilisateursActifs' ),
-       'Allmessages'               => array( 'Messages_système', 'Messages_systeme', 'Messagessystème', 'Messagessysteme' ),
-       'Allpages'                  => array( 'Toutes_les_pages', 'ToutesLesPages' ),
-       'Ancientpages'              => array( 'Pages_anciennes', 'PagesAnciennes', 'Anciennes_pages', 'AnciennesPages' ),
-       'Badtitle'                  => array( 'MauvaisTitre', 'Mauvais_titre' ),
-       'Blankpage'                 => array( 'Page_blanche', 'PageBlanche' ),
-       'Block'                     => array( 'Bloquer', 'Blocage' ),
-       'Blockme'                   => array( 'Bloquez-moi', 'Bloquezmoi' ),
-       'Booksources'               => array( 'Ouvrages_de_référence', 'Ouvrages_de_reference', 'Ouvragesderéférence', 'Ouvragesdereference', 'Recherche_ISBN', 'Recherche_isbn', 'RechercheISBN', 'Rechercheisbn' ),
-       'BrokenRedirects'           => array( 'Redirections_cassées', 'RedirectionCassées', 'Redirections_cassees', 'RedirectionsCassees' ),
-       'Categories'                => array( 'Catégories' ),
-       'ChangePassword'            => array( 'Changement_du_mot_de_passe', 'ChangementDuMotDePasse' ),
-       'Confirmemail'              => array( 'Confirmer_l\'adresse_de_contact', 'Confirmer_le_courriel', 'ConfirmerLeCourriel' ),
-       'CreateAccount'             => array( 'Créer_un_compte', 'CréerUnCompte', 'CréerCompte' ),
-       'Deadendpages'              => array( 'Pages_en_impasse', 'PagesEnImpasse' ),
-       'DeletedContributions'      => array( 'Contributions_supprimées', 'ContributionsSupprimées', 'ContributionSupprimees' ),
-       'Disambiguations'           => array( 'Homonymies', 'Homonymie', 'Pages_d\'homonymie' ),
-       'DoubleRedirects'           => array( 'Doubles_redirections', 'DoublesRedirections', 'Redirections_doubles', 'RedirectionsDoubles' ),
-       'Emailuser'                 => array( 'Envoyer_un_courriel', 'EnvoyerUnCourriel', 'Courriel', 'Envoyer_un_e-mail', 'EnvoyerUnEMail', 'E-mail', 'EMail' ),
-       'Export'                    => array( 'Exporter', 'Exportation' ),
-       'Fewestrevisions'           => array( 'Pages_les_moins_modifiées', 'PagesLesMoinsModifiées', 'Pages_les_moins_modifiees', 'PagesLesMoinsModifiees', 'Les_moins_modifiés', 'LesMoinsModifiés', 'Les_moins_modifies', 'LesMoinsModifies' ),
-       'FileDuplicateSearch'       => array( 'Recherche_fichier_en_double', 'RechercheFichierEnDouble' ),
-       'Filepath'                  => array( 'Chemin_du_fichier', 'CheminDuFichier', 'CheminFichier' ),
-       'Import'                    => array( 'Importer', 'Importation' ),
-       'Invalidateemail'           => array( 'Invalider_le_courriel', 'Invalider_courriel', 'InvaliderCourriel' ),
-       'BlockList'                 => array( 'Liste_des_blocages', 'ListeDesBlocages', 'Blocages', 'Utilisateurs_bloqués', 'UtilisateursBloqués', 'Utilisateurs_bloques', 'UtilisateursBloques', 'IP_bloquées', 'IPBloquees', 'IPBloquées' ),
-       'LinkSearch'                => array( 'Recherche_de_lien', 'Recherche_de_liens' ),
-       'Listadmins'                => array( 'Liste_des_administrateurs', 'Listedesadministrateurs', 'Liste_des_admins', 'Listedesadmins', 'Liste_admins', 'Listeadmins' ),
-       'Listbots'                  => array( 'Liste_des_bots', 'ListedesBots' ),
-       'Listfiles'                 => array( 'Liste_des_fichiers', 'ListeDesFichiers', 'Liste_des_images', 'ListeDesImages' ),
-       'Listgrouprights'           => array( 'Liste_des_droits_de_groupe', 'ListeDesDroitsDeGroupes' ),
-       'Listredirects'             => array( 'Liste_des_redirections', 'Listedesredirections', 'Liste_des_redirects', 'Listedesredirects', 'Liste_redirections', 'Listeredirections', 'Liste_redirects', 'Listeredirects' ),
-       'Listusers'                 => array( 'Liste_des_utilisateurs', 'ListeDesUtilisateurs', 'Utilisateurs' ),
-       'Lockdb'                    => array( 'Verrouiller_la_base', 'Verrouillerlabase', 'Verrouiller_base', 'Verrouillerbase', 'Verrouiller_BD', 'VerrouillerBD', 'Verrouiller_bd', 'Verrouillerbd' ),
-       'Log'                       => array( 'Journal', 'Journaux' ),
-       'Lonelypages'               => array( 'Pages_orphelines', 'PagesOrphelines' ),
-       'Longpages'                 => array( 'Pages_longues', 'PagesLongues' ),
-       'MergeHistory'              => array( 'Fusionner_les_historiques', 'FusionnerHistoriques', 'Fusionner_l\'historique', 'Fusionnerlhistorique' ),
-       'MIMEsearch'                => array( 'Recherche_MIME', 'RechercheMIME', 'Recherche_mime', 'Recherchemime' ),
-       'Mostcategories'            => array( 'Pages_les_plus_catégorisées', 'PagesLesPlusCatégorisées', 'Pages_les_plus_categorisees', 'PagesLesPlusCategorisees', 'Les_plus_catégorisés', 'LesPlusCatégorisés', 'Les_plus_categorises', 'LesPlusCategorises' ),
-       'Mostimages'                => array( 'Fichiers_les_plus_liés', 'FichiersLesPlusLiés', 'Fichiers_les_plus_lies', 'FichiersLesPlusLies', 'Fichiers_les_plus_utilisés', 'FichiersLesPlusUtilisés', 'Fichiers_les_plus_utilises', 'FichiersLesPlusUtilises', 'Images_les_plus_liées', 'ImagesLesPlusLiées', 'Images_les_plus_liees', 'ImagesLesPlusLiees', 'Images_les_plus_utilisées', 'ImagesLesPlusUtilisées', 'Images_les_plus_utilisees', 'ImagesLesPlusUtilisees' ),
-       'Mostlinked'                => array( 'Pages_les_plus_liées', 'PagesLesPlusLiées', 'Pages_les_plus_liees', 'PagesLesPlusLiees', 'Les_plus_liées', 'LesPlusLiées', 'Les_plus_liees', 'LesPlusLiees' ),
-       'Mostlinkedcategories'      => array( 'Catégories_les_plus_liées', 'CatégoriesLesPlusLiées', 'Categories_les_plus_liees', 'CategoriesLesPlusLiees', 'Catégories_les_plus_utilisées', 'CatégoriesLesPlusUtilisées', 'Categories_les_plus_utilisees', 'CategoriesLesPlusUtilisees' ),
-       'Mostlinkedtemplates'       => array( 'Modèles_les_plus_liés', 'ModèlesLesPlusLiés', 'Modeles_les_plus_lies', 'ModelesLesPlusLies', 'Modèles_les_plus_utilisés', 'ModèlesLesPlusUtilisés', 'Modeles_les_plus_utilises', 'ModelesLesPlusUtilises' ),
-       'Mostrevisions'             => array( 'Pages_les_plus_modifiées', 'PagesLesPlusModifiées', 'Pages_les_plus_modifiees', 'PagesLesPlusModifiees', 'Les_plus_modifiés', 'LesPlusModifiés', 'Les_plus_modifies', 'LesPlusModifies' ),
-       'Movepage'                  => array( 'Renommer_une_page', 'Renommer', 'Renommage' ),
-       'Mycontributions'           => array( 'Mes_contributions', 'Mescontributions' ),
-       'Mypage'                    => array( 'Ma_page', 'Mapage' ),
-       'Mytalk'                    => array( 'Mes_discussions', 'Mesdiscussions' ),
-       'Newimages'                 => array( 'Nouveaux_fichiers', 'NouveauxFichiers', 'Nouvelles_images', 'NouvellesImages' ),
-       'Newpages'                  => array( 'Nouvelles_pages', 'NouvellesPages', 'Pages_récentes', 'PagesRécentes', 'Pages_recentes', 'PagesRecentes' ),
-       'PasswordReset'             => array( 'Réinitialisation_du_mot_de_passe', 'RéinitialisationDuMotDePasse' ),
-       'PermanentLink'             => array( 'LienPermanent', 'Lien_permanent' ),
-       'Popularpages'              => array( 'Pages_les_plus_visitées', 'Pages_les_plus_visitees', 'Pageslesplusvisitées', 'Pageslesplusvisitees' ),
-       'Preferences'               => array( 'Préférences' ),
-       'Prefixindex'               => array( 'Index', 'Préfixes', 'Prefixes' ),
-       'Protectedpages'            => array( 'Pages_protégées', 'PagesProtégées', 'Pages_protegees', 'PagesProtegees' ),
-       'Protectedtitles'           => array( 'Titres_protégés', 'TitresProtégés', 'Titres_proteges', 'TitresProteges' ),
-       'Randompage'                => array( 'Page_au_hasard', 'PageAuHasard', 'Au_hasard', 'AuHasard', 'Aléatoire', 'Aleatoire' ),
-       'Randomredirect'            => array( 'Redirection_au_hasard', 'Redirect_au_hasard', 'Redirectionauhasard', 'Redirectauhasard', 'Redirection_aléatoire', 'Redirect_aléatoire', 'Redirectionaléatoire', 'Redirectaléatoire', 'Redirection_aleatoire', 'Redirect_aleatoire', 'Redirectionaleatoire', 'Redirectaleatoire' ),
-       'Recentchanges'             => array( 'Modifications_récentes', 'Modifications_recentes', 'ModificationsRécentes', 'ModificationsRecentes' ),
-       'Recentchangeslinked'       => array( 'Suivi_des_liens', 'SuiviDesLiens' ),
-       'Revisiondelete'            => array( 'Versions_supprimées', 'Versions_supprimees', 'Versionsupprimées', 'Versionsupprimees' ),
-       'Search'                    => array( 'Recherche', 'Rechercher', 'Chercher' ),
-       'Shortpages'                => array( 'Pages_courtes', 'PagesCourtes' ),
-       'Specialpages'              => array( 'Pages_spéciales', 'PagesSpéciales', 'Pages_speciales', 'PagesSpeciales' ),
-       'Statistics'                => array( 'Statistiques', 'Stats' ),
-       'Tags'                      => array( 'Balises' ),
-       'Unblock'                   => array( 'Débloquer', 'Déblocage' ),
-       'Uncategorizedcategories'   => array( 'Catégories_non_catégorisées', 'CatégoriesNonCatégorisées', 'Categories_non_categorisees', 'CategoriesNonCategorisees', 'Catégories_sans_catégorie', 'CatégoriesSansCatégorie', 'Categories_sans_categorie', 'CategoriesSansCategorie' ),
-       'Uncategorizedimages'       => array( 'Fichiers_non_catégorisés', 'FichiersNonCatégorisés', 'Fichiers_non_categorises', 'FichiersNonCategorises', 'Fichiers_sans_catégorie', 'FichiersSansCatégorie', 'Fichiers_sans_categorie', 'FichiersSansCategorie', 'Images_non_catégorisées', 'ImagesNonCatégorisées', 'Images_non_categorisees', 'ImagesNonCategorisees', 'Images_sans_catégorie', 'ImagesSansCatégorie', 'Images_sans_categorie', 'ImagesSansCategorie' ),
-       'Uncategorizedpages'        => array( 'Pages_non_catégorisées', 'PagesNonCatégorisées', 'Pages_non_categorisees', 'PagesNonCategorisees', 'Pages_sans_catégorie', 'PagesSansCatégorie', 'Pages_sans_categorie', 'PagesSansCategorie' ),
-       'Uncategorizedtemplates'    => array( 'Modèles_non_catégorisés', 'ModèlesNonCatégorisés', 'Modeles_non_categorises', 'ModelesNonCategorises', 'Modèles_sans_catégorie', 'ModèlesSansCatégorie', 'Modeles_sans_catégorie', 'ModelesSansCatégorie' ),
-       'Undelete'                  => array( 'Restaurer', 'Restauration' ),
-       'Unlockdb'                  => array( 'Déverrouiller_la_base', 'Déverrouillerlabase', 'Deverrouiller_la_base', 'Deverrouillerlabase', 'Déverrouiller_base', 'Déverrouillerbase', 'Deverrouiller_base', 'Deverrouillerbase', 'Déverrouiller_BD', 'DéverrouillerBD', 'Deverrouiller_BD', 'DeverrouillerBD', 'Déverrouiller_bd', 'Déverrouillerbd', 'Deverrouiller_bd', 'Deverrouillerbd' ),
-       'Unusedcategories'          => array( 'Catégories_inutilisées', 'CatégoriesInutilisées', 'Categories_inutilisees', 'CategoriesInutilisees', 'Catégories_non_utilisées', 'CatégoriesNonUtilisées', 'Categories_non_utilisees', 'CategoriesNonUtilisees' ),
-       'Unusedimages'              => array( 'Fichiers_inutilisés', 'FichiersInutilisés', 'Fichiers_inutilises', 'FichiersInutilises', 'Fichiers_non_utilisés', 'FichiersNon_utilisés', 'Fichiers_non_utilises', 'FichiersNon_utilises', 'Images_inutilisées', 'ImagesInutilisées', 'Images_inutilisees', 'ImagesInutilisees', 'Images_non_utilisées', 'ImagesNonUtilisées', 'Images_non_utilisees', 'ImagesNonUtilisees' ),
-       'Unusedtemplates'           => array( 'Modèles_inutilisés', 'Modèlesinutilisés', 'Modeles_inutilises', 'Modelesinutilises', 'Modèles_non_utilisés', 'Modèlesnonutilisés', 'Modeles_non_utilises', 'Modelesnonutilises' ),
-       'Unwatchedpages'            => array( 'Pages_non_suivies', 'Pagesnonsuivies' ),
-       'Upload'                    => array( 'Téléverser', 'Televerser', 'Téléversement', 'Televersement', 'Téléchargement', 'Telechargement' ),
-       'Userlogin'                 => array( 'Connexion', 'Identification' ),
-       'Userlogout'                => array( 'Déconnexion', 'Deconnexion' ),
-       'Userrights'                => array( 'Permissions', 'Droits', 'Droits_des_utilisateurs' ),
-       'Wantedcategories'          => array( 'Catégories_demandées', 'CatégoriesDemandées', 'Categories_demandees', 'CategoriesDemandees' ),
-       'Wantedfiles'               => array( 'Fichiers_demandés', 'FichiersDemandés', 'Fichiers_demandes', 'FichiersDemandes' ),
-       'Wantedpages'               => array( 'Pages_demandées', 'PagesDemandées', 'Pages_demandees', 'PagesDemandees', 'Liens_brisés', 'LiensBrisés', 'Liens_brises', 'LiensBrises' ),
-       'Wantedtemplates'           => array( 'Modèles_demandés', 'ModèlesDemandés', 'Modeles_demandes', 'ModelesDemandes' ),
-       'Watchlist'                 => array( 'Liste_de_suivi', 'ListeDeSuivi', 'Suivi' ),
-       'Whatlinkshere'             => array( 'Pages_liées', 'PagesLiées', 'Pages_liees', 'PagesLiees' ),
-       'Withoutinterwiki'          => array( 'Sans_interwiki', 'Sansinterwiki', 'Sans_interwikis', 'Sansinterwikis' ),
+$bookstoreList = array(
+       'Amazon.fr'    => 'http://www.amazon.fr/exec/obidos/ISBN=$1',
+       'alapage.fr'   => 'http://www.alapage.com/mx/?tp=F&type=101&l_isbn=$1&donnee_appel=ALASQ&devise=&',
+       'fnac.com'     => 'http://www3.fnac.com/advanced/book.do?isbn=$1',
+       'chapitre.com' => 'http://www.chapitre.com/frame_rec.asp?isbn=$1',
+);
+
+$linkTrail = '/^([a-zàâçéèêîôûäëïöüùÇÉÂÊÎÔÛÄËÏÖÜÀÈÙ]+)(.*)$/sDu';
+
+$dateFormats = array(
+       'mdy time' => 'H:i',
+       'mdy date' => 'F j, Y',
+       'mdy both' => 'F j, Y à H:i',
+
+       'dmy time' => 'H:i',
+       'dmy date' => 'j F Y',
+       'dmy both' => 'j F Y à H:i',
+
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y F j',
+       'ymd both' => 'Y F j à H:i',
 );
 
 $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
@@ -378,7 +381,7 @@ $messages = array(
 'tog-hideminor' => 'Masquer les modifications mineures dans les modifications récentes',
 '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-extendwatchlist' => 'Étendre la liste de suivi pour afficher toutes les modifications et pas uniquement les plus récentes',
 '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)",
@@ -387,7 +390,7 @@ $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 et les fichiers que j’importe à 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',
@@ -395,33 +398,33 @@ $messages = array(
 '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 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-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 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-shownumberswatching' => "Afficher le nombre d'utilisateurs qui suivent cette page",
 'tog-oldsig' => 'Signature existante :',
 'tog-fancysig' => 'Traiter la signature comme du wikitexte (sans lien automatique)',
-'tog-externaleditor' => 'Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d’informations]).',
-'tog-externaldiff' => 'Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d’informations]).',
+'tog-externaleditor' => "Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
+'tog-externaldiff' => "Utiliser un comparateur externe par défaut (pour les utilisateurs avancés, nécessite des réglages sur votre ordinateur, [//www.mediawiki.org/wiki/Manual:External_editors/fr plus d'informations]).",
 'tog-showjumplinks' => 'Activer les liens « navigation » et « recherche » en haut de page',
-'tog-uselivepreview' => 'Utiliser l’aperçu rapide (nécessite JavaScript) (expérimental)',
-'tog-forceeditsummary' => 'M’avertir lorsque je n’ai pas spécifié de résumé de modification',
+'tog-uselivepreview' => "Utiliser l'aperçu rapide (nécessite JavaScript) (expérimental)",
+'tog-forceeditsummary' => "M'avertir lorsque je n'ai pas spécifié de résumé de modification",
 'tog-watchlisthideown' => 'Masquer mes propres modifications dans la liste de suivi',
 'tog-watchlisthidebots' => 'Masquer les modifications faites par des robots dans la liste de suivi',
 'tog-watchlisthideminor' => 'Masquer les modifications mineures dans la liste de suivi',
 'tog-watchlisthideliu' => 'Masquer les modifications faites par des utilisateurs inscrits dans la liste de suivi',
 'tog-watchlisthideanons' => 'Masquer les modifications anonymes dans la liste de suivi',
 'tog-watchlisthidepatrolled' => 'Masquer les modifications surveillées dans la liste de suivi',
-'tog-ccmeonemails' => 'M’envoyer une copie des courriels que j’envoie aux autres utilisateurs',
+'tog-ccmeonemails' => "M'envoyer une copie des courriels que j'envoie aux autres utilisateurs",
 'tog-diffonly' => 'Ne pas afficher le contenu des pages sous les diffs',
 'tog-showhiddencats' => 'Afficher les catégories cachées',
 'tog-noconvertlink' => 'Désactiver la conversion des titres',
-'tog-norollbackdiff' => 'Ne pas afficher le diff lors d’une révocation',
+'tog-norollbackdiff' => "Ne pas afficher le diff lors d'une révocation",
 
 'underline-always' => 'Toujours',
 'underline-never' => 'Jamais',
-'underline-default' => 'Valeur par défaut du navigateur',
+'underline-default' => 'Valeur par défaut du navigateur ou du thème',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Style de police de la zone de modification :',
@@ -506,8 +509,8 @@ $messages = array(
 'newwindow' => '(ouvre une nouvelle fenêtre)',
 'cancel' => 'Annuler',
 'moredotdotdot' => 'Plus...',
-'mypage' => 'Ma page',
-'mytalk' => 'Page de discussion',
+'mypage' => 'Page',
+'mytalk' => 'Discussion',
 'anontalk' => 'Discussion avec cette adresse IP',
 'navigation' => 'Navigation',
 'and' => '&#32;et',
@@ -517,7 +520,6 @@ $messages = array(
 'qbbrowse' => 'Parcourir',
 'qbedit' => 'Modifier',
 'qbpageoptions' => 'Cette page',
-'qbpageinfo' => 'Contexte',
 'qbmyoptions' => 'Mes pages',
 'qbspecialpages' => 'Pages spéciales',
 'faq' => 'FAQ',
@@ -530,16 +532,17 @@ $messages = array(
 'vector-action-protect' => 'Protéger',
 'vector-action-undelete' => 'Rétablir',
 'vector-action-unprotect' => 'Changer la protection',
-'vector-simplesearch-preference' => 'Activer les suggestions de recherche améliorées (seulement pour Vector)',
+'vector-simplesearch-preference' => "Activer la barre de recherche simplifiée (seulement pour l'habillage Vector)",
 'vector-view-create' => 'Créer',
 'vector-view-edit' => 'Modifier',
-'vector-view-history' => 'Afficher l’historique',
+'vector-view-history' => "Afficher l'historique",
 'vector-view-view' => 'Lire',
 'vector-view-viewsource' => 'Voir la source',
 'actions' => 'Actions',
 'namespaces' => 'Espaces de noms',
 'variants' => 'Variantes',
 
+'navigation-heading' => 'Menu de navigation',
 'errorpagetitle' => 'Erreur',
 'returnto' => 'Revenir à la page $1.',
 'tagline' => 'De {{SITENAME}}',
@@ -583,7 +586,7 @@ $messages = array(
 'imagepage' => 'Voir la page du fichier',
 'mediawikipage' => 'Voir la page du message',
 'templatepage' => 'Voir la page du modèle',
-'viewhelppage' => 'Voir la page d’aide',
+'viewhelppage' => "Voir la page d'aide",
 'categorypage' => 'Voir la page de catégorie',
 'viewtalkpage' => 'Page de discussion',
 'otherlanguages' => 'Autres langues',
@@ -595,12 +598,12 @@ $messages = array(
 'jumpto' => 'Aller à :',
 'jumptonavigation' => 'Navigation',
 'jumptosearch' => 'rechercher',
-'view-pool-error' => 'Désolé, les serveurs sont surchargés en ce moment.
-Trop dutilisateurs cherchent à consulter cette page.
-Veuillez attendre un moment avant de retenter laccès à cette page.
+'view-pool-error' => "Désolé, les serveurs sont surchargés en ce moment.
+Trop d'utilisateurs cherchent à consulter cette page.
+Veuillez attendre un moment avant de retenter l'accès à cette page.
 
-$1',
-'pool-timeout' => 'Délai dépassé durant l’attente du verrou',
+$1",
+'pool-timeout' => "Délai dépassé durant l'attente du verrou",
 'pool-queuefull' => 'La file de travail est pleine',
 'pool-errorunknown' => 'Erreur inconnue',
 
@@ -625,8 +628,8 @@ $1',
 'privacypage' => 'Project:Confidentialité',
 
 'badaccess' => 'Erreur de permission',
-'badaccess-group0' => 'Vous n’avez pas les droits suffisants pour réaliser l’action demandée.',
-'badaccess-groups' => 'L’action que vous essayez de réaliser n’est accessible qu’aux utilisateurs {{PLURAL:$2|du groupe|des groupes}} : $1.',
+'badaccess-group0' => "Vous n'avez pas les droits suffisants pour réaliser l'action demandée.",
+'badaccess-groups' => "L'action que vous essayez de réaliser n'est accessible qu'aux utilisateurs {{PLURAL:$2|du groupe|des groupes}} : $1.",
 
 'versionrequired' => 'Version $1 de MediaWiki nécessaire',
 'versionrequiredtext' => 'La version $1 de MediaWiki est nécessaire pour utiliser cette page. Consultez [[Special:Version|la page des versions]]',
@@ -636,10 +639,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 ).",
+'youhavenewmessagesfromusers' => "Vous avez $1 {{PLURAL:$3|d'un autre utilisateur|de $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}}',
+'newmessageslinkplural' => '{{PLURAL:$1|un message|de nouveaux messages}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|dernière modification|dernières modifications}}',
 'youhavenewmessagesmulti' => 'Vous avez de nouveaux messages sur $1.',
 'editsection' => 'modifier',
 'editold' => 'modifier',
@@ -680,13 +683,13 @@ $1',
 
 # Main script and global functions
 'nosuchaction' => 'Action inconnue',
-'nosuchactiontext' => 'L’action spécifiée dans l’URL est invalide.
-Vous avez peut-être mal entré lURL ou suivi un lien erroné.
-Il peut également s’agir d’un bogue dans le logiciel utilisé par {{SITENAME}}.',
+'nosuchactiontext' => "L'action spécifiée dans l'URL est invalide.
+Vous avez peut-être mal entré l'URL ou suivi un lien erroné.
+Il peut également s'agir d'un bug dans le logiciel utilisé par {{SITENAME}}.",
 'nosuchspecialpage' => 'Page spéciale inexistante',
-'nospecialpagetext' => '<strong>Vous avez demandé une page spéciale qui n’existe pas.</strong>
+'nospecialpagetext' => "<strong>Vous avez demandé une page spéciale qui n'existe pas.</strong>
 
-Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{int:specialpages}}]].',
+Une liste des pages spéciales valides se trouve sur [[Special:SpecialPages|{{int:specialpages}}]].",
 
 # General errors
 'error' => 'Erreur',
@@ -697,46 +700,46 @@ La dernière requête traitée par la base de données était :
 <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.
+'dberrortextcl' => "Une requête dans la base de données comporte une erreur de syntaxe.
 La dernière requête émise était :
 « $1 »
 dans la fonction « $2 ».
-La base de données a renvoyé l’erreur « $3 : $4 ».',
+La base de données a renvoyé l'erreur « $3 : $4 ».",
 'laggedslavemode' => 'Attention, cette page peut ne pas contenir les toutes dernières modifications effectuées',
 'readonly' => 'Base de données verrouillée',
-'enterlockreason' => 'Indiquez la raison du verrouillage ainsi qu’une estimation de sa durée',
-'readonlytext' => 'Les ajouts et mises à jour de la base de données sont actuellement bloqués, probablement pour permettre la maintenance de la base, après quoi, tout rentrera dans l’ordre.
+'enterlockreason' => "Indiquez la raison du verrouillage ainsi qu'une estimation de sa durée",
+'readonlytext' => "Les ajouts et mises à jour de la base de données sont actuellement bloqués, probablement pour permettre la maintenance de la base, après quoi, tout rentrera dans l'ordre.
 
-L’administrateur ayant verrouillé la base de données a fourni l’explication suivante :<br />$1',
-'missing-article' => "La base de données n’a pas trouvé le texte d'une page qu’elle aurait dû trouver, intitulée « $1 » $2.
+L'administrateur ayant verrouillé la base de données a fourni l'explication suivante :<br />$1",
+'missing-article' => "La base de données n'a pas trouvé le texte d'une page qu'elle aurait dû trouver, intitulée « $1 » $2.
 
-Généralement, cela survient en suivant un lien vers un diff périmé ou vers lhistorique d'une page supprimée.
+Généralement, cela survient en suivant un lien vers un diff périmé ou vers l'historique d'une page supprimée.
 
-Si ce n’est pas le cas, il peut s’agir d'un bogue dans le programme.
-Veuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer lURL du lien.",
+Si ce n'est pas le cas, il peut s'agir d'un bug dans le programme.
+Veuillez le signaler à un [[Special:ListUsers/sysop|administrateur]] sans oublier de lui indiquer l'URL du lien.",
 'missingarticle-rev' => '(numéro de version : $1)',
 'missingarticle-diff' => '(diff : $1, $2)',
 'readonly_lag' => 'La base de données a été automatiquement verrouillée pendant que les serveurs secondaires rattrapent leur retard sur le serveur principal.',
 'internalerror' => 'Erreur interne',
 'internalerror_info' => 'Erreur interne : $1',
-'fileappenderrorread' => 'Impossible de lire « $1 » lors de l’insertion',
-'fileappenderror' => 'Impossible d’ajouter « $1 » à « $2 ».',
+'fileappenderrorread' => "Impossible de lire « $1 » lors de l'insertion",
+'fileappenderror' => "Impossible d'ajouter « $1 » à « $2 ».",
 'filecopyerror' => 'Impossible de copier le fichier « $1 » vers « $2 ».',
 'filerenameerror' => 'Impossible de renommer le fichier « $1 » en « $2 ».',
 'filedeleteerror' => 'Impossible de supprimer le fichier « $1 ».',
 'directorycreateerror' => 'Impossible de créer le dossier « $1 ».',
 'filenotfound' => 'Impossible de trouver le fichier « $1 ».',
-'fileexistserror' => 'Impossible d’écrire le fichier « $1 » : le fichier existe.',
+'fileexistserror' => "Impossible d'écrire le fichier « $1 » : le fichier existe.",
 'unexpected' => 'Valeur inattendue : « $1 » = « $2 ».',
 'formerror' => 'Erreur : Impossible de soumettre le formulaire.',
 'badarticleerror' => 'Cette action ne peut pas être effectuée sur cette page.',
-'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' => "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.',
+'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.',
 'perfcachedts' => 'Les données suivantes sont en cache et ont été mises à jour pour la dernière fois à $1. Un maximum de {{PLURAL:$4|un résultat|$4 résultats}} est disponible dans le cache.',
 'querypage-no-updates' => 'Les mises à jour pour cette page sont actuellement désactivées. Les données ci-dessous ne sont pas mises à jour.',
@@ -746,29 +749,29 @@ Requête : $2',
 'viewsource' => 'Voir le texte source',
 'viewsource-title' => 'Voir la source de $1',
 'actionthrottled' => 'Action limitée',
-'actionthrottledtext' => 'Pour lutter contre les pourriels, l’utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s’avère que vous avez dépassé cette limite.
-Essayez à nouveau dans quelques minutes.',
-'protectedpagetext' => 'Cette page a été protégée pour empêcher sa modification.',
+'actionthrottledtext' => "Pour lutter contre le spam, l'utilisation de cette action est limitée à un certain nombre de fois dans un laps de temps assez court. Il s'avère que vous avez dépassé cette limite.
+Essayez à nouveau dans quelques minutes.",
+'protectedpagetext' => "Cette page a été protégée pour empêcher sa modification ou d'autres actions.",
 'viewsourcetext' => 'Vous pouvez voir et copier le contenu de la page :',
 'viewyourtext' => "Vous pouvez voir et copier le contenu de '''vos modifications''' à cette page :",
-'protectedinterface' => 'Cette page fournit du texte d’interface pour le logiciel sur ce wiki, et est protégée pour éviter les abus.
-Pour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.',
-'editinginterface' => "'''Attention''': Vous êtes en train de modifier une page utilisée pour créer le texte de linterface du logiciel. Les changements sur cette page se répercuteront dur l'apparence de l'interface utilisateur pour les autres utilisateurs de ce wiki.
-Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet dinternationalisation de MediaWiki.",
+'protectedinterface' => "Cette page fournit du texte d'interface pour le logiciel sur ce wiki, et est protégée pour éviter les abus.
+Pour ajouter ou modifier des traductions sur tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet de localisation de MediaWiki.",
+'editinginterface' => "'''Attention''': Vous êtes en train de modifier une page utilisée pour créer le texte de l'interface du logiciel. Les changements sur cette page se répercuteront dur l'apparence de l'interface utilisateur pour les autres utilisateurs de ce wiki.
+Pour ajouter ou modifier des traductions pour tous les wikis, veuillez utiliser [//translatewiki.net/ translatewiki.net], le projet d'internationalisation de MediaWiki.",
 'sqlhidden' => '(Requête SQL cachée)',
-'cascadeprotected' => 'Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée :
-$2',
-'namespaceprotected' => "Vous n’avez pas la permission de modifier les pages de l’espace de noms « '''$1''' ».",
-'customcssprotected' => 'Vous n’avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d’un autre utilisateur.',
-'customjsprotected' => 'Vous n’avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d’un autre utilisateur.',
-'ns-specialprotected' => 'Les pages dans l’espace de noms « {{ns:special}} » ne peuvent pas être modifiées.',
+'cascadeprotected' => "Cette page est protégée car elle est incluse par {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l'option « protection en cascade » activée :
+$2",
+'namespaceprotected' => "Vous n'avez pas la permission de modifier les pages de l'espace de noms « '''$1''' ».",
+'customcssprotected' => "Vous n'avez pas la permission de modifier cette page de CSS, car elle contient les paramètres personnels d'un autre utilisateur.",
+'customjsprotected' => "Vous n'avez pas la permission de modifier cette page de JavaScript, car elle contient les paramètres personnels d'un autre utilisateur.",
+'ns-specialprotected' => "Les pages dans l'espace de noms « {{ns:special}} » ne peuvent pas être modifiées.",
 'titleprotected' => "Ce titre a été protégé à la création par [[User:$1|$1]].
 Le motif avancé est « ''$2'' ».",
-'filereadonlyerror' => 'Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.
+'filereadonlyerror' => "Impossible de modifier le fichier « $1 » parce que le répertoire de fichiers « $2 » est en lecture seule.
 
-L’administrateur qui l’a verrouillé a fourni ce motif: « $3 ».',
-'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',
+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.",
 
@@ -780,29 +783,28 @@ L’administrateur qui l’a verrouillé a fourni ce motif: « $3 ».',
 # Login and logout pages
 'logouttext' => "'''Vous êtes à présent déconnecté(e).'''
 
-Vous pouvez continuer à utiliser {{SITENAME}} de façon anonyme, [[Special:UserLogin|vous reconnecter]] sous le même nom ou un autre.
-Notez que certaines pages peuvent être encore affichées comme si vous étiez toujours connecté(e), jusqu’à ce que vous effaciez le cache de votre navigateur.",
-'welcomecreation' => '== Bienvenue, $1 ! ==
-
-Votre compte a été créé.
-N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{SITENAME}}]].',
-'yourname' => 'Nom d’utilisateur&nbsp;:',
+Vous pouvez continuer à utiliser {{SITENAME}} de façon anonyme, <span class='plainlinks'>[$1 vous reconnecter]</span> sous le même nom ou un autre.
+Notez que certaines pages peuvent être encore affichées comme si vous étiez toujours connecté(e), jusqu'à ce que vous effaciez le cache de votre navigateur.",
+'welcomeuser' => 'Bienvenue, $1!',
+'welcomecreation-msg' => "Votre compte a été créé.
+N'oubliez pas de modifier vos [[Special:Preferences|{{SITENAME}} préférences]].",
+'yourname' => "Nom d'utilisateur :",
 'yourpassword' => 'Mot de passe&nbsp;:',
 'yourpasswordagain' => 'Confirmez le mot de passe :',
 'remembermypassword' => 'Me reconnecter automatiquement aux prochaines visites avec ce navigateur (au maximum $1&nbsp;{{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.',
+'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',
-'loginprompt' => "Vous devez activer les témoins (''cookies'') pour vous connecter à {{SITENAME}}.",
+'loginprompt' => 'Vous devez activer les cookies pour vous connecter à {{SITENAME}}.',
 'userlogin' => 'Créer un compte ou se connecter',
 'userloginnocreate' => 'Connexion',
 'logout' => 'Se déconnecter',
 'userlogout' => 'Déconnexion',
 'notloggedin' => 'Non connecté',
-'nologin' => 'Vous n’êtes pas encore inscrit ? $1.',
+'nologin' => "Vous n'êtes pas encore inscrit ? $1.",
 'nologinlink' => 'Créer un compte',
 'createaccount' => 'Créer un compte',
 'gotaccount' => "Vous avez déjà un compte ? '''$1'''.",
@@ -811,51 +813,51 @@ N’oubliez pas de personnaliser vos [[Special:Preferences|préférences sur {{S
 'createaccountmail' => 'par courriel',
 'createaccountreason' => 'Motif :',
 'badretype' => 'Les mots de passe que vous avez saisis ne correspondent pas.',
-'userexists' => 'Nom d’utilisateur entré déjà utilisé.
-Veuillez choisir un nom différent.',
+'userexists' => "Nom d'utilisateur entré déjà utilisé.
+Veuillez choisir un nom différent.",
 'loginerror' => 'Erreur de connexion',
 'createaccounterror' => 'Impossible de créer le compte : $1',
-'nocookiesnew' => "Le compte utilisateur a été créé, mais vous n’êtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des témoins (''cookies'') pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
-'nocookieslogin' => "{{SITENAME}} utilise des témoins (''cookies'') pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.",
-'nocookiesfornew' => 'Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.
-Vérifiez que vous avez activé les cookies, rechargez la page et réessayez.',
-'noname' => 'Vous n’avez pas saisi un nom d’utilisateur valide.',
+'nocookiesnew' => "Le compte utilisateur a été créé, mais vous n'êtes pas connecté{{GENDER:||e|(e)}}. {{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
+'nocookieslogin' => '{{SITENAME}} utilise des cookies pour la connexion mais vous les avez désactivés. Veuillez les activer et vous reconnecter.',
+'nocookiesfornew' => "Le compte utilisateur n'a pas été créé, car nous n'avons pas pu identifier son origine.
+Vérifiez que vous avez activé les cookies, rechargez la page et réessayez.",
+'noname' => "Vous n'avez pas saisi un nom d'utilisateur valide.",
 'loginsuccesstitle' => 'Connexion réussie',
 'loginsuccess' => 'Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».',
-'nosuchuser' => 'L’utilisateur « $1 » n’existe pas.
-Les noms dutilisateurs sont sensibles à la casse.
-Vérifiez l’orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].',
-'nosuchusershort' => 'Il n’y a pas de contributeur avec le nom « $1 ». Veuillez vérifier l’orthographe.',
-'nouserspecified' => 'Vous devez saisir un nom d’utilisateur.',
+'nosuchuser' => "L'utilisateur « $1 » n'existe pas.
+Les noms d'utilisateurs sont sensibles à la casse.
+Vérifiez l'orthographe, ou [[Special:UserLogin/signup|créez un nouveau compte]].",
+'nosuchusershort' => "Il n'y a pas de contributeur avec le nom « $1 ». Veuillez vérifier l'orthographe.",
+'nouserspecified' => "Vous devez saisir un nom d'utilisateur.",
 'login-userblocked' => 'Cet utilisateur est bloqué. Connexion non autorisée.',
 'wrongpassword' => 'Le mot de passe est incorrect. Veuillez essayer à nouveau.',
-'wrongpasswordempty' => 'Vous n’avez pas entré de mot de passe. Veuillez essayer à nouveau.',
+'wrongpasswordempty' => "Vous n'avez pas entré de mot de passe. Veuillez essayer à nouveau.",
 'passwordtooshort' => 'Votre mot de passe doit contenir au moins $1 caractère{{PLURAL:$1||s}}.',
-'password-name-match' => 'Votre mot de passe doit être différent de votre nom d’utilisateur.',
-'password-login-forbidden' => "Lutilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
+'password-name-match' => "Votre mot de passe doit être différent de votre nom d'utilisateur.",
+'password-login-forbidden' => "L'utilisation de ce nom d'utilisateur et de ce mot de passe a été interdite.",
 'mailmypassword' => 'Recevoir un nouveau mot de passe par courriel',
 'passwordremindertitle' => 'Nouveau mot de passe temporaire pour {{SITENAME}}',
-'passwordremindertext' => 'Quelqu’un (probablement vous, ayant l’adresse IP $1) a demandé un nouveau mot de
+'passwordremindertext' => "Quelqu'un (probablement vous, ayant l'adresse IP $1) a demandé un nouveau mot de
 passe pour {{SITENAME}} ($4 ). Un mot de passe temporaire a été créé pour
-lutilisateur « $2 » et est « $3 ». Si cela était votre intention, vous devrez
+l'utilisateur « $2 » et est « $3 ». Si cela était votre intention, vous devrez
 vous connecter et choisir un nouveau mot de passe.
 Votre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.
 
-Si vous n’êtes pas l’auteur de cette demande, ou si vous vous souvenez à présent
+Si vous n'êtes pas l'auteur de cette demande, ou si vous vous souvenez à présent
 de votre ancien mot de passe et que vous ne souhaitez plus en changer, vous
-pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
-'noemail' => "Aucune adresse de courriel na été enregistrée pour l'utilisateur « $1 ».",
+pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
+'noemail' => "Aucune adresse de courriel n'a été enregistrée pour l'utilisateur « $1 ».",
 'noemailcreate' => 'Vous devez fournir une adresse de courriel valide',
-'passwordsent' => 'Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisateur « $1 ». Veuillez vous reconnecter après l’avoir reçu.',
+'passwordsent' => "Un nouveau mot de passe a été envoyé à l'adresse de courriel de l'utilisateur « $1 ». Veuillez vous reconnecter après l'avoir reçu.",
 'blocked-mailpassword' => 'Votre adresse IP est bloquée en écriture, la fonction de rappel du mot de passe est donc désactivée pour éviter les abus.',
-'eauthentsent' => 'Un courriel de confirmation a été envoyé à l’adresse indiquée.
-Avant qu’un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.',
-'throttled-mailpassword' => 'Un courriel de rappel de votre mot de passe a déjà été envoyé durant {{PLURAL:$1|la dernière heure|les $1 dernières heures}}. Afin d’éviter les abus, un seul courriel de rappel sera envoyé par {{PLURAL:$1|heure|intervalle de $1 heures}}.',
-'mailerror' => 'Erreur lors de l’envoi du courriel : $1',
-'acct_creation_throttle_hit' => 'Quelqu’un utilisant votre adresse IP a créé {{PLURAL:$1|un compte|$1 comptes}} au cours des dernières 24 heures, ce qui constitue la limite autorisée dans cet intervalle de temps.
-Par conséquent, la création de compte a été temporairement désactivée pour cette adresse IP.',
+'eauthentsent' => "Un courriel de confirmation a été envoyé à l'adresse indiquée.
+Avant qu'un autre courriel ne soit envoyé à ce compte, vous devrez suivre les instructions du courriel et confirmer que le compte est bien le vôtre.",
+'throttled-mailpassword' => "Un courriel de rappel de votre mot de passe a déjà été envoyé durant {{PLURAL:$1|la dernière heure|les $1 dernières heures}}. Afin d'éviter les abus, un seul courriel de rappel sera envoyé par {{PLURAL:$1|heure|intervalle de $1 heures}}.",
+'mailerror' => "Erreur lors de l'envoi du courriel : $1",
+'acct_creation_throttle_hit' => "Quelqu'un utilisant votre adresse IP a créé {{PLURAL:$1|un compte|$1 comptes}} au cours des dernières 24 heures, ce qui constitue la limite autorisée dans cet intervalle de temps.
+Par conséquent, la création de compte a été temporairement désactivée pour cette adresse IP.",
 'emailauthenticated' => 'Votre adresse de courriel a été authentifiée le $2 à $3.',
-'emailnotauthenticated' => 'Votre adresse de courriel n’est <strong>pas encore authentifiée</strong>. Aucun courriel ne sera envoyé pour chacune des fonctions suivantes.',
+'emailnotauthenticated' => "Votre adresse de courriel n'est <strong>pas encore authentifiée</strong>. Aucun courriel ne sera envoyé pour chacune des fonctions suivantes.",
 'noemailprefs' => 'Indiquez une adresse de courriel dans vos préférences pour utiliser ces fonctions.',
 'emailconfirmlink' => 'Confirmez votre adresse de courriel',
 'invalidemailaddress' => 'Cette adresse courriel ne peut pas être acceptée car elle semble avoir un format incorrect.
@@ -864,25 +866,25 @@ Entrez une adresse bien formatée ou laissez ce champ vide.',
 'emaildisabled' => 'Ce site ne peut pas envoyer de courriels.',
 'accountcreated' => 'Compte créé',
 'accountcreatedtext' => 'Le compte utilisateur pour $1 a été créé.',
-'createaccount-title' => 'Création d’un compte pour {{SITENAME}}',
-'createaccount-text' => 'Quelqu’un a créé un compte pour votre adresse de courriel sur {{SITENAME}} ($4) intitulé « $2 », avec le mot de passe « $3 ».
+'createaccount-title' => "Création d'un compte pour {{SITENAME}}",
+'createaccount-text' => "Quelqu'un a créé un compte pour votre adresse de courriel sur {{SITENAME}} ($4) intitulé « $2 », avec le mot de passe « $3 ».
 Vous devriez ouvrir une session et modifier dès à présent votre mot de passe.
 
-Ignorez ce message si ce compte a été créé par erreur.',
-'usernamehasherror' => 'Le nom d’utilisateur ne peut pas contenir des caractères de hachage',
-'login-throttled' => 'Vous avez tenté un trop grand nombre de connexions dernièrement.
-Veuillez attendre avant d’essayer à nouveau.',
+Ignorez ce message si ce compte a été créé par erreur.",
+'usernamehasherror' => "Le nom d'utilisateur ne peut pas contenir des caractères de hachage",
+'login-throttled' => "Vous avez tenté un trop grand nombre de connexions dernièrement.
+Veuillez attendre avant d'essayer à nouveau.",
 'login-abort-generic' => 'Votre tentative de connexion a échoué',
 'loginlanguagelabel' => 'Langue : $1',
-'suspicious-userlogout' => 'Votre demande de déconnexion a été refusée car il semble qu’elle a été envoyée par un navigateur cassé ou la mise en cache d’un proxy.',
+'suspicious-userlogout' => "Votre demande de déconnexion a été refusée car il semble qu'elle a été envoyée par un navigateur cassé ou la mise en cache d'un proxy.",
 
 # E-mail sending
 'php-mail-error-unknown' => 'Erreur inconnue dans la fonction mail() de PHP.',
-'user-mail-no-addy' => 'Tenté d’envoyer un courriel sans adresse de courriel',
+'user-mail-no-addy' => "Tenté d'envoyer un courriel sans adresse de courriel",
 
 # Change password dialog
 'resetpass' => 'Changer de mot de passe',
-'resetpass_announce' => 'Vous vous êtes enregistré{{GENDER:||e|(e)}} avec un mot de passe temporaire envoyé par courriel. Pour terminer l’enregistrement, vous devez entrer un nouveau mot de passe ici :',
+'resetpass_announce' => "Vous vous êtes enregistré{{GENDER:||e|(e)}} avec un mot de passe temporaire envoyé par courriel. Pour terminer l'enregistrement, vous devez entrer un nouveau mot de passe ici :",
 'resetpass_text' => '<!-- Ajoutez le texte ici -->',
 'resetpass_header' => 'Changer le mot de passe du compte',
 'oldpassword' => 'Ancien mot de passe :',
@@ -904,37 +906,37 @@ Vous avez peut-être déjà changé votre mot de passe ou demandé un nouveau mo
 'passwordreset-legend' => 'Remise à zéro du mot de passe',
 'passwordreset-disabled' => 'La réinitialisation des mots de passe a été désactivée sur ce wiki.',
 'passwordreset-pretext' => '{{PLURAL:$1||Entrez un élément de données ci-dessous}}',
-'passwordreset-username' => 'Nom d’utilisateur :',
+'passwordreset-username' => "Nom d'utilisateur :",
 'passwordreset-domain' => 'Domaine :',
 'passwordreset-capture' => 'Voir le courriel résultant?',
-'passwordreset-capture-help' => 'Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu’il sera envoyé à l’utilisateur.',
+'passwordreset-capture-help' => "Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu'il sera envoyé à l'utilisateur.",
 'passwordreset-email' => 'Adresse de courriel :',
 'passwordreset-emailtitle' => 'Détails du compte sur {{SITENAME}}',
-'passwordreset-emailtext-ip' => 'Quelqu’un (probablement vous, depuis l’adresse IP $1) a demandé un rappel des informations de votre compte pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :
+'passwordreset-emailtext-ip' => "Quelqu'un (probablement vous, depuis l'adresse IP $1) a demandé un rappel des informations de votre compte pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :
 
 $2
 
-{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
-'passwordreset-emailtext-user' => 'L’utilisateur $1 sur {{SITENAME}} a demandé un rappel des informations de votre compte pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :
+{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
+'passwordreset-emailtext-user' => "L'utilisateur $1 sur {{SITENAME}} a demandé un rappel des informations de votre compte pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :
 
 $2
 
-{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.',
-'passwordreset-emailelement' => 'Nom d’utilisateur : $1
-Mot de passe temporaire : $2',
+{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. Vous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou que vous vous êtes souvenu de votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
+'passwordreset-emailelement' => "Nom d'utilisateur : $1
+Mot de passe temporaire : $2",
 'passwordreset-emailsent' => 'Un courriel de rappel a été envoyé.',
 'passwordreset-emailsent-capture' => 'Un courriel de rappel a été envoyé, qui est affiché ci-dessous.',
-'passwordreset-emailerror-capture' => 'Un courriel de rappel a été généré, qui est affiché ci-dessous, mais l’envoi à l’utilisateur a échoué : $1',
+'passwordreset-emailerror-capture' => "Un courriel de rappel a été généré, qui est affiché ci-dessous, mais l'envoi à l'utilisateur a échoué : $1",
 
 # Special:ChangeEmail
-'changeemail' => 'Changer l’adresse de courriel',
-'changeemail-header' => 'Changer l’adresse de courriel du compte',
+'changeemail' => "Changer l'adresse de courriel",
+'changeemail-header' => "Changer l'adresse de courriel du compte",
 'changeemail-text' => 'Remplissez ce formulaire pour changer votre adresse de courriel. Vous devrez entrer votre mot de passe pour confirmer ce changement.',
 'changeemail-no-info' => 'Vous devez être connecté pour pouvoir accéder directement à cette page.',
 'changeemail-oldemail' => 'Adresse de courriel actuelle :',
 'changeemail-newemail' => 'Nouvelle adresse de courriel :',
 'changeemail-none' => '(aucune)',
-'changeemail-submit' => 'Changer l’adresse de courriel',
+'changeemail-submit' => "Changer l'adresse de courriel",
 'changeemail-cancel' => 'Annuler',
 
 # Edit page toolbar
@@ -945,7 +947,7 @@ Mot de passe temporaire : $2',
 'link_sample' => 'Titre du lien',
 'link_tip' => 'Lien interne',
 'extlink_sample' => 'http://www.example.com titre du lien',
-'extlink_tip' => 'Lien externe (n’oubliez pas le préfixe http://)',
+'extlink_tip' => "Lien externe (n'oubliez pas le préfixe http://)",
 'headline_sample' => 'Texte du titre',
 'headline_tip' => 'Sous-titre niveau 2',
 'nowiki_sample' => 'Entrez le texte non formaté ici',
@@ -967,16 +969,16 @@ Mot de passe temporaire : $2',
 'showpreview' => 'Prévisualiser',
 'showlivepreview' => 'Aperçu rapide',
 'showdiff' => 'Modifications en cours',
-'anoneditwarning' => "'''Attention :''' vous n’êtes pas identifié(e). Votre adresse IP sera enregistrée dans l’historique de cette page.",
-'anonpreviewwarning' => "''Vous n’êtes pas identifié. Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.''",
-'missingsummary' => "'''Rappel :''' vous navez pas encore fourni le résumé de votre modification.
+'anoneditwarning' => "'''Attention :''' vous n'êtes pas identifié(e). Votre adresse IP sera enregistrée dans l'historique de cette page.",
+'anonpreviewwarning' => "''Vous n'êtes pas identifié. Sauvegarder enregistrera votre adresse IP dans l'historique des modifications de la page.''",
+'missingsummary' => "'''Rappel :''' vous n'avez pas encore fourni le résumé de votre modification.
 Si vous cliquez de nouveau sur le bouton « {{int:savearticle}} », la publication sera faite sans nouvel avertissement.",
 'missingcommenttext' => 'Veuillez entrer un commentaire ci-dessous.',
-'missingcommentheader' => "'''Rappel :''' vous navez pas fourni de sujet ou de titre à ce commentaire.
+'missingcommentheader' => "'''Rappel :''' vous n'avez pas fourni de sujet ou de titre à ce commentaire.
 Si vous cliquez de nouveau sur « {{int:Savearticle}} », votre modification sera enregistrée sans titre.",
 'summary-preview' => 'Aperçu du résumé :',
 'subject-preview' => 'Prévisualisation du sujet/titre :',
-'blockedtitle' => 'L’utilisateur est bloqué.',
+'blockedtitle' => "L'utilisateur est bloqué.",
 'blockedtext' => "'''Votre compte utilisateur ou votre adresse IP a été bloqué.'''
 
 Le blocage a été effectué par $1.
@@ -987,7 +989,7 @@ La raison invoquée est la suivante : ''$2''.
 * Compte bloqué : $7.
 
 Vous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.
-Vous ne pouvez utiliser la fonction « {{MediaWiki:emailpage}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité na pas été bloquée.
+Vous ne pouvez utiliser la fonction « {{MediaWiki:emailpage}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité n'a pas été bloquée.
 Votre adresse IP actuelle est $3 et votre identifiant de blocage est $5.
 Veuillez préciser ces indications dans toutes les requêtes que vous ferez.",
 'autoblockedtext' => "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.
@@ -999,9 +1001,9 @@ La raison invoquée est :
 * Expiration du blocage : $6
 * Compte bloqué : $7
 
-Vous pouvez contacter $1 ou lun des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.
+Vous pouvez contacter $1 ou l'un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.
 
-Notez que vous ne pourrez utiliser la fonctionnalité d’envoi de courriel que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que la fonctionnalité n’a pas été désactivée.
+Notez que vous ne pourrez utiliser la fonctionnalité d'envoi de courriel que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que la fonctionnalité n'a pas été désactivée.
 
 Votre adresse IP actuelle est $3, et le numéro de blocage est $5.
 Veuillez préciser ces indications dans toutes les requêtes que vous ferez.",
@@ -1010,100 +1012,100 @@ Veuillez préciser ces indications dans toutes les requêtes que vous ferez.",
 'confirmedittext' => 'Vous devez confirmer votre adresse de courriel avant de modifier les pages.
 Veuillez entrer et valider votre adresse de courriel dans vos [[Special:Preferences|préférences]].',
 'nosuchsectiontitle' => 'Impossible de trouver la section',
-'nosuchsectiontext' => 'Vous avez essayé de modifier une section qui n’existe pas.
-Elle a peut-être été déplacée ou supprimée depuis que vous avez lu cette page.',
+'nosuchsectiontext' => "Vous avez essayé de modifier une section qui n'existe pas.
+Elle a peut-être été déplacée ou supprimée depuis que vous avez lu cette page.",
 'loginreqtitle' => 'Connexion nécessaire',
 'loginreqlink' => 'connecter',
 'loginreqpagetext' => 'Vous devez vous $1 pour voir les autres pages.',
 'accmailtitle' => 'Mot de passe envoyé.',
 'accmailtext' => "Un mot de passe généré aléatoirement pour [[User talk:$1|$1]] a été envoyé à $2.
-Le mot de passe pour ce nouveau compte peut être changé sur la page ''[[Special:ChangePassword|de changement de mot de passe]]'' après sêtre connecté.",
+Le mot de passe pour ce nouveau compte peut être changé sur la page ''[[Special:ChangePassword|de changement de mot de passe]]'' après s'être connecté.",
 'newarticle' => '(Nouveau)',
-'newarticletext' => "Vous avez suivi un lien vers une page qui nexiste pas encore ou qui a été [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} effacée].
-Pour créer cette page, entrez votre texte dans la boîte ci-dessous (vous pouvez consulter [[{{MediaWiki:Helppage}}|la page d’aide]] pour plus d’informations).
+'newarticletext' => "Vous avez suivi un lien vers une page qui n'existe pas encore ou qui a été [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} effacée].
+Pour créer cette page, entrez votre texte dans la boîte ci-dessous (vous pouvez consulter [[{{MediaWiki:Helppage}}|la page d'aide]] pour plus d'informations).
 Si vous êtes arrivé{{GENDER:||e|(e)}} ici par erreur, cliquez sur le bouton '''retour''' de votre navigateur.",
-'anontalkpagetext' => "---- ''Vous êtes sur la page de discussion d’un utilisateur anonyme qui n’a pas encore créé de compte ou qui n’en utilise pas. Pour cette raison, nous devons utiliser son adresse IP pour l’identifier. Une adresse IP peut être partagée par plusieurs utilisateurs. Si vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:UserLogin/signup|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d’éviter toute confusion future avec d’autres contributeurs anonymes.''",
-'noarticletext' => 'Il n’y a pour l’instant aucun texte sur cette page.
+'anontalkpagetext' => "---- ''Vous êtes sur la page de discussion d'un utilisateur anonyme qui n'a pas encore créé de compte ou qui n'en utilise pas. Pour cette raison, nous devons utiliser son adresse IP pour l'identifier. Une adresse IP peut être partagée par plusieurs utilisateurs. Si vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:UserLogin/signup|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d'éviter toute confusion future avec d'autres contributeurs anonymes.''",
+'noarticletext' => 'Il n\'y a pour l\'instant aucun texte sur cette page.
 Vous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.',
-'noarticletext-nopermission' => 'Il n’y a pour l’instant aucun texte sur cette page.
+'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é.
-La dernière entrée du registre des blocages est indiquée ci-dessous à titre d’information :',
+'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é.
+La dernière entrée du registre des blocages est indiquée ci-dessous à titre d'information :",
 'clearyourcache' => "'''Note :''' après avoir enregistré vos préférences, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
 * '''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'' ;
 * '''Opera :''' Videz le cache dans ''Outils → Préférences''.",
-'usercssyoucanpreview' => "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de lenregistrer.",
-'userjsyoucanpreview' => "'''Astuce :''' utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de lenregistrer.",
-'usercsspreview' => "'''Rappelez-vous que vous n’êtes qu’en train de prévisualiser votre propre feuille CSS.'''
-'''Elle na pas encore été enregistrée !'''",
-'userjspreview' => "'''Rappelez-vous que vous êtes en train de visualiser ou de tester votre code JavaScript et qu’il n’a pas encore été enregistré !'''",
+'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.",
+'usercsspreview' => "'''Rappelez-vous que vous n'êtes qu'en train de prévisualiser votre propre feuille CSS.'''
+'''Elle n'a pas encore été enregistrée !'''",
+'userjspreview' => "'''Rappelez-vous que vous êtes en train de visualiser ou de tester votre code JavaScript et qu'il n'a pas encore été enregistré !'''",
 'sitecsspreview' => "'''Souvenez-vous que vous êtes seulement en train de prévisualiser cette feuille de style.'''
-'''Elle na pas encore été enregistrée !'''",
+'''Elle n'a pas encore été enregistrée !'''",
 'sitejspreview' => "'''Souvenez-vous que vous êtes seulement en train de prévisualiser ce code JavaScript.'''
-'''Il na pas encore été enregistré !'''",
-'userinvalidcssjstitle' => "'''Attention :''' il n’existe pas d’habillage « $1 ». Rappelez-vous que les pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
+'''Il n'a pas encore été enregistré !'''",
+'userinvalidcssjstitle' => "'''Attention :''' il n'existe pas d'habillage « $1 ». Rappelez-vous que les pages personnelles avec extensions .css et .js utilisent des titres en minuscules, par exemple {{ns:user}}:Foo/vector.css et non {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Mis à jour)',
 'note' => "'''Note :'''",
-'previewnote' => "'''Rappelez-vous que ce n’est qu’une prévisualisation.'''
-Vos modifications nont pas encore été enregistrées !",
-'continue-editing' => 'Continuer la modification',
-'previewconflict' => 'Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu’il apparaîtra si vous choisissez de le publier.',
-'session_fail_preview' => "'''Nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.'''
+'previewnote' => "'''Rappelez-vous que ce n'est qu'une prévisualisation.'''
+Vos modifications n'ont pas encore été enregistrées !",
+'continue-editing' => 'Aller à la zone de modification',
+'previewconflict' => "Cette prévisualisation montre le texte de la boîte supérieure de modification tel qu'il apparaîtra si vous choisissez de le publier.",
+'session_fail_preview' => "'''Nous ne pouvons enregistrer votre modification à cause d'une perte d'informations concernant votre session.'''
 Veuillez réessayer.
 Si cela échoue de nouveau, essayez en vous [[Special:UserLogout|déconnectant]], puis en vous reconnectant.",
-'session_fail_preview_html' => "'''Nous ne pouvons enregistrer votre modification à cause d’une perte d’informations concernant votre session.'''
+'session_fail_preview_html' => "'''Nous ne pouvons enregistrer votre modification à cause d'une perte d'informations concernant votre session.'''
 
 ''Parce que {{SITENAME}} a activé le HTML brut, la prévisualisation a été masquée afin de prévenir les attaques par JavaScript.''
 
 '''Si la tentative de modification était légitime, veuillez réessayer.'''
 Si cela échoue de nouveau, [[Special:UserLogout|déconnectez-vous]], puis reconnectez-vous.",
-'token_suffix_mismatch' => "'''Votre modification n’a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l’identifiant de modification.'''
+'token_suffix_mismatch' => "'''Votre modification n'a pas été acceptée car votre navigateur a mal codé les caractères de ponctuation dans l'identifiant de modification.'''
 Ce rejet est nécessaire pour empêcher la corruption du texte de la page.
 Ce problème se produit parfois lorsque vous utilisez un serveur mandataire anonyme problématique basé sur le web.",
-'edit_form_incomplete' => "'''Certaines parties du formulaire de modification nont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
+'edit_form_incomplete' => "'''Certaines parties du formulaire de modification n'ont pas atteint le serveur, vérifiez que vos modifications sont intactes et essayez à nouveau.'''",
 'editing' => 'Modification de $1',
 'creating' => 'Création de $1',
 'editingsection' => 'Modification de $1 (section)',
 'editingcomment' => 'Modification de $1 (nouvelle section)',
 'editconflict' => 'Conflit de modification : $1',
 'explainconflict' => "Cette page a été changée après que vous ayez commencé à la modifier.
-La zone de modification supérieure contient le texte tel quil est actuellement enregistré dans la base de données.
+La zone de modification supérieure contient le texte tel qu'il est actuellement enregistré dans la base de données.
 Vos modifications apparaissent dans la zone de modification inférieure.
 Vous allez devoir fusionner vos modifications dans le texte existant.
 '''Seul''' le texte de la zone supérieure sera sauvegardé si vous cliquez sur « {{int:savearticle}} ».",
 'yourtext' => 'Votre texte',
 'storedversion' => 'La version enregistrée',
-'nonunicodebrowser' => "'''Attention : Votre navigateur ne supporte pas lUnicode.'''
+'nonunicodebrowser' => "'''Attention : Votre navigateur ne supporte pas l'Unicode.'''
 Une solution de rechange a été trouvée pour vous permettre de modifier en toute sûreté une page : les caractères non-ASCII apparaîtront dans votre boîte de modification en tant que codes hexadécimaux. Vous devriez utiliser un navigateur plus récent.",
 'editingold' => "'''Attention : vous êtes en train de modifier une ancienne version de cette page.
 Si vous la publiez, toutes les modifications effectuées depuis cette version seront perdues.'''",
 'yourdiff' => 'Différences',
 'copyrightwarning' => "Toutes les contributions à {{SITENAME}} sont considérées comme publiées sous les termes de la $2 (voir $1 pour plus de détails). Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br />
-Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. '''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
-'copyrightwarning2' => "Toutes les contributions à {{SITENAME}} peuvent être modifiées ou supprimées par dautres utilisateurs. Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br />
-Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l’avez copié d’une source provenant du domaine public, ou d’une ressource libre. (voir $1 pour plus de détails).
-'''N’UTILISEZ PAS DE TRAVAUX SOUS DROIT D’AUTEUR SANS AUTORISATION EXPRESSE !'''",
+Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l'avez copié d'une source provenant du domaine public, ou d'une ressource libre. '''N'UTILISEZ PAS DE TRAVAUX SOUS DROIT D'AUTEUR SANS AUTORISATION EXPRESSE !'''",
+'copyrightwarning2' => "Toutes les contributions à {{SITENAME}} peuvent être modifiées ou supprimées par d'autres utilisateurs. Si vous ne désirez pas que vos écrits soient modifiés et distribués à volonté, merci de ne pas les soumettre ici.<br />
+Vous nous promettez aussi que vous avez écrit ceci vous-même, ou que vous l'avez copié d'une source provenant du domaine public, ou d'une ressource libre. (voir $1 pour plus de détails).
+'''N'UTILISEZ PAS DE TRAVAUX SOUS DROIT D'AUTEUR SANS AUTORISATION EXPRESSE !'''",
 'longpageerror' => "'''Erreur: Le texte que vous avez soumis fait {{PLURAL:$1|un Kio|$1 Kio}}, ce qui dépasse la limite fixée à {{PLURAL:$2|un Kio|$2 Kio}}.'''
 Il ne peut pas être sauvegardé.",
-'readonlywarning' => "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour linstant.'''
+'readonlywarning' => "'''AVERTISSEMENT : la base de données a été verrouillée pour des opérations de maintenance. Vous ne pouvez donc pas publier vos modifications pour l'instant.'''
 Vous pouvez copier le texte dans un fichier texte et le conserver pour plus tard.
 
-L’administrateur ayant verrouillé la base de données a donné l’explication suivante : $1",
-'protectedpagewarning' => "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut dadministrateur peuvent la modifier.'''<br />
+L'administrateur ayant verrouillé la base de données a donné l'explication suivante : $1",
+'protectedpagewarning' => "'''AVERTISSEMENT : cette page est protégée. Seuls les utilisateurs ayant le statut d'administrateur peuvent la modifier.'''<br />
 La dernière entrée du journal est affichée ci-dessous pour référence :",
 'semiprotectedpagewarning' => "'''Note :''' Cette page a été protégée de telle façon que seuls les contributeurs enregistrés puissent la modifier. La dernière entrée du journal est affichée ci-dessous pour référence :",
-'cascadeprotectedwarning' => "'''ATTENTION :''' Cette page a été protégée de manière à ce que seuls les administrateurs puissent léditer. Cette protection est héritée par son inclusion par {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
+'cascadeprotectedwarning' => "'''ATTENTION :''' Cette page a été protégée de manière à ce que seuls les administrateurs puissent l'éditer. Cette protection est héritée par son inclusion par {{PLURAL:$1|la page protégée suivante, qui a|les pages protégées suivantes, qui ont}} la « protection en cascade » activée :",
 'titleprotectedwarning' => "'''ATTENTION : Cette page a été protégée de telle manière que des [[Special:ListGroupRights|droits spécifiques]] sont requis pour pouvoir la créer.''' La dernière entrée du journal est affichée ci-dessous pour référence :",
 'templatesused' => '{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} par cette page :',
 'templatesusedpreview' => '{{PLURAL:$1|Modèle utilisé|Modèles utilisés}} dans cette prévisualisation :',
@@ -1115,35 +1117,44 @@ La dernière entrée du journal est affichée ci-dessous pour référence :",
 'nocreatetitle' => 'Création de page limitée',
 'nocreatetext' => '{{SITENAME}} a restreint la possibilité de créer de nouvelles pages.
 Vous pouvez revenir en arrière et modifier une page existante, ou bien [[Special:UserLogin|vous connecter ou créer un compte]].',
-'nocreate-loggedin' => 'Vous n’avez pas la permission de créer de nouvelles pages.',
+'nocreate-loggedin' => "Vous n'avez pas la permission de créer de nouvelles pages.",
 'sectioneditnotsupported-title' => 'Modification de section non prise en charge',
-'sectioneditnotsupported-text' => 'La modification d’une section n’est pas supportée dans cette page de modification.',
+'sectioneditnotsupported-text' => "La modification d'une section n'est pas prise en charge pour cette page.",
 'permissionserrors' => 'Erreur de permissions',
-'permissionserrorstext' => 'Vous n’avez pas la permission d’effectuer l’opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :',
-'permissionserrorstext-withaction' => 'Vous n’êtes pas autorisé{{GENDER:||e|(e)}} à $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :',
+'permissionserrorstext' => "Vous n'avez pas la permission d'effectuer l'opération demandée pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
+'permissionserrorstext-withaction' => "Vous n'êtes pas autorisé{{GENDER:||e|(e)}} à $2, pour {{PLURAL:$1|la raison suivante|les raisons suivantes}} :",
 'recreate-moveddeleted-warn' => "'''Attention : vous êtes en train de recréer une page qui a été précédemment supprimée.'''
 
-Assurez-vous quil est pertinent de poursuivre les modifications sur cette page. Le journal des suppressions et des déplacements est affiché ci-dessous :",
+Assurez-vous qu'il est pertinent de poursuivre les modifications sur cette page. Le journal des suppressions et des déplacements est affiché ci-dessous :",
 'moveddeleted-notice' => 'Cette page a été supprimée. Le journal des suppressions et des déplacements est affiché ci-dessous pour référence.',
 'log-fulllog' => 'Voir le journal complet',
 'edit-hook-aborted' => 'Échec de la modification par une extension.
 Cause inconnue',
-'edit-gone-missing' => 'N’a pas pu mettre à jour la page.
-Il semble qu’elle ait été supprimée.',
+'edit-gone-missing' => "N'a pas pu mettre à jour la page.
+Il semble qu'elle ait été supprimée.",
 'edit-conflict' => 'Conflit de modification.',
-'edit-no-change' => 'Votre modification a été ignorée car aucun changement n’a été fait au texte.',
-'edit-already-exists' => 'La nouvelle page n’a pas pu être créée.
-Elle existe déjà.',
+'edit-no-change' => "Votre modification a été ignorée car aucun changement n'a été fait au texte.",
+'edit-already-exists' => "La nouvelle page n'a pas pu être créée.
+Elle existe déjà.",
 'defaultmessagetext' => 'Message par défaut',
+'content-failed-to-parse' => "Échec de l'analyse du contenu de $2 pour le modèle $1: $3",
+'invalid-content-data' => 'Données du contenu non valides',
+'content-not-allowed-here' => 'Le contenu "$1" n\'est pas autorisé sur la page [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitexte',
+'content-model-text' => 'texte brut',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'Attention : cette page contient de trop nombreux appels à des fonctions coûteuses de l’analyseur syntaxique.
+'expensive-parserfunction-warning' => "Attention : cette page contient de trop nombreux appels à des fonctions coûteuses de l'analyseur syntaxique.
 
-Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maintenant $1.',
-'expensive-parserfunction-category' => 'Pages avec trop d’appels dispendieux de fonctions de l’analyseur syntaxique',
-'post-expand-template-inclusion-warning' => 'Attention : Cette page contient trop d’inclusions de modèles. Certaines inclusions ne seront pas effectuées.',
-'post-expand-template-inclusion-category' => 'Pages contenant trop d’inclusions de modèles',
-'post-expand-template-argument-warning' => 'Attention : Cette page contient au moins un paramètre de modèle dont l’inclusion est rendue impossible. Après extension, celui-ci aurait produit un résultat trop long, il n’a donc pas été inclus.',
+Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu'il y en a maintenant $1.",
+'expensive-parserfunction-category' => "Pages avec trop d'appels dispendieux de fonctions de l'analyseur syntaxique",
+'post-expand-template-inclusion-warning' => "Attention : Cette page contient trop d'inclusions de modèles. Certaines inclusions ne seront pas effectuées.",
+'post-expand-template-inclusion-category' => "Pages contenant trop d'inclusions de modèles",
+'post-expand-template-argument-warning' => "Attention : Cette page contient au moins un paramètre de modèle dont l'inclusion est rendue impossible. Après extension, celui-ci aurait produit un résultat trop long, il n'a donc pas été inclus.",
 'post-expand-template-argument-category' => 'Pages contenant des paramètres de modèle non évalués',
 'parser-template-loop-warning' => 'Modèle en boucle détecté : [[$1]]',
 'parser-template-recursion-depth-warning' => 'Limite de profondeur des appels de modèles dépassée ($1)',
@@ -1157,9 +1168,9 @@ Il devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maint
 '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.',
+'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.",
 'undo-failure' => 'Cette modification ne peut pas être défaite : cela entrerait en conflit avec les modifications intermédiaires.',
-'undo-norev' => 'La modification n’a pas pu être défaite parce qu’elle est inexistante ou qu’elle a été supprimée.',
+'undo-norev' => "La modification n'a pas pu être défaite parce qu'elle est inexistante ou qu'elle a été supprimée.",
 'undo-summary' => 'Annulation des modifications $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]])',
 
 # Account creation failure
@@ -1170,7 +1181,7 @@ La raison donnée était ''$2''.",
 
 # History pages
 'viewpagelogs' => 'Voir les opérations sur cette page',
-'nohistory' => 'Il n’existe pas d’historique pour cette page.',
+'nohistory' => "Il n'existe pas d'historique pour cette page.",
 'currentrev' => 'Version actuelle',
 'currentrev-asof' => 'Version actuelle en date du $1',
 'revisionasof' => 'Version du $1',
@@ -1184,7 +1195,7 @@ La raison donnée était ''$2''.",
 'page_first' => 'première',
 'page_last' => 'dernière',
 'histlegend' => 'Légende : ({{int:cur}}) = différence avec la version actuelle, ({{int:last}}) = différence avec la version précédente, <b>{{int:minoreditletter}}</b> = modification mineure',
-'history-fieldset-title' => 'Naviguer dans l’historique',
+'history-fieldset-title' => "Naviguer dans l'historique",
 'history-show-deleted' => 'Masqués seulement',
 'histfirst' => 'première page',
 'histlast' => 'dernière page',
@@ -1195,15 +1206,15 @@ La raison donnée était ''$2''.",
 'history-feed-title' => 'Historique des versions',
 'history-feed-description' => 'Historique pour cette page sur le wiki',
 'history-feed-item-nocomment' => '$1 le $2',
-'history-feed-empty' => 'La page demandée n’existe pas.
+'history-feed-empty' => "La page demandée n'existe pas.
 Elle a peut-être été effacée ou renommée.
-Essayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.',
+Essayez de [[Special:Search|rechercher sur le wiki]] pour trouver des pages en rapport.",
 
 # Revision deletion
-'rev-deleted-comment' => '(résumé d’édition enlevé)',
-'rev-deleted-user' => '(nom d’utilisateur supprimé)',
+'rev-deleted-comment' => "(résumé d'édition enlevé)",
+'rev-deleted-user' => "(nom d'utilisateur supprimé)",
 'rev-deleted-event' => '(entrée supprimée)',
-'rev-deleted-user-contribs' => '[nom d’utilisateur ou adresse IP supprimée - modification cachée sur les contributions]',
+'rev-deleted-user-contribs' => "[nom d'utilisateur ou adresse IP supprimée - modification cachée sur les contributions]",
 'rev-deleted-text-permission' => "Cette version de la page a été '''effacée'''.
 Des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
 'rev-deleted-text-unhide' => "Cette version de la page a été '''effacée'''.
@@ -1216,13 +1227,13 @@ Vous pouvez toujours [$1 voir cette version] si vous le voulez.",
 Vous pouvez la visualiser ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
 'rev-suppressed-text-view' => "Cette version de la page a été '''supprimée'''.
 Vous pouvez la visualiser ; des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des suppressions].",
-'rev-deleted-no-diff' => "Vous ne pouvez pas voir ce diff parce quune des versions a été '''effacée'''.
+'rev-deleted-no-diff' => "Vous ne pouvez pas voir ce diff parce qu'une des versions a été '''effacée'''.
 Des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].",
 'rev-suppressed-no-diff' => "Vous ne pouvez pas voir cette différence car une des révisions a été '''supprimée'''.",
 'rev-deleted-unhide-diff' => "Une des révisions de cette différence a été '''effacée'''.
 Des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des effacements].
 Vous pouvez toujours [$1 voir cette différence] si vous le voulez.",
-'rev-suppressed-unhide-diff' => "Lune des révisions de ce diff a été '''supprimée'''.
+'rev-suppressed-unhide-diff' => "L'une des révisions de ce diff a été '''supprimée'''.
 Des détails sont disponibles dans le [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} journal des suppressions].
 Vous pouvez toujours [$1 voir ce diff] si vous souhaitez poursuivre.",
 'rev-deleted-diff-view' => "Une des révisions de ce diff a été '''supprimée'''.
@@ -1233,17 +1244,17 @@ Vous pouvez voir ce diff ; des détails sont disponibles dans le [{{fullurl:{{#S
 'rev-showdeleted' => 'afficher',
 'revisiondelete' => 'Supprimer ou restaurer des événements',
 'revdelete-nooldid-title' => 'Version cible non valide',
-'revdelete-nooldid-text' => 'Vous n’avez pas précisé la version cible de cette fonction, elle n’existe pas, ou il s’agit de la version actuelle.',
+'revdelete-nooldid-text' => "Vous n'avez pas précisé la version cible de cette fonction, elle n'existe pas, ou il s'agit de la version actuelle.",
 'revdelete-nologtype-title' => 'Aucun type de journal spécifié',
-'revdelete-nologtype-text' => 'Vous n’avez pas spécifié un type de journal sur lequel cette action doit être réalisée.',
+'revdelete-nologtype-text' => "Vous n'avez pas spécifié un type de journal sur lequel cette action doit être réalisée.",
 'revdelete-nologid-title' => 'Entrée du journal invalide',
-'revdelete-nologid-text' => 'Vous n’avez pas spécifié une entrée du journal sur laquelle cette action doit être effectuée, ou alors l’événement spécifié n’existe pas.',
-'revdelete-no-file' => 'Le fichier spécifié n’existe pas.',
+'revdelete-nologid-text' => "Vous n'avez pas spécifié une entrée du journal sur laquelle cette action doit être effectuée, ou alors l'événement spécifié n'existe pas.",
+'revdelete-no-file' => "Le fichier spécifié n'existe pas.",
 'revdelete-show-file-confirm' => 'Êtes-vous sûr de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?',
 'revdelete-show-file-submit' => 'Oui',
 'revdelete-selected' => "'''{{PLURAL:$2|Version sélectionnée|Versions sélectionnées}} de '''[[:$1]]''' :'''",
-'logdelete-selected' => "'''{{PLURAL:$1|Événement d’historique sélectionné|Événements d’historique sélectionnés}} :'''",
-'revdelete-text' => "'''Les versions et événements supprimés seront encore présents dans lhistorique de la page et dans les journaux, mais leur contenu textuel sera inaccessible au public.'''
+'logdelete-selected' => "'''{{PLURAL:$1|Événement d'historique sélectionné|Événements d'historique sélectionnés}} :'''",
+'revdelete-text' => "'''Les versions et événements supprimés seront encore présents dans l'historique de la page et dans les journaux, mais leur contenu textuel sera inaccessible au public.'''
 Les autres administrateurs de {{SITENAME}} pourront toujours accéder au contenu caché et le restaurer à travers cette même interface, à moins que des restrictions supplémentaires ne soient mises en place.",
 'revdelete-confirm' => 'Confirmez que vous voulez effectuer cette action, que vous en comprenez les conséquences, et que vous le faites en accord avec [[{{MediaWiki:Policy-url}}|les règles]].',
 'revdelete-suppress-text' => "La suppression ne doit être utilisée '''que''' dans les cas suivants :
@@ -1252,10 +1263,10 @@ Les autres administrateurs de {{SITENAME}} pourront toujours accéder au contenu
 'revdelete-legend' => 'Mettre en place des restrictions de visibilité :',
 'revdelete-hide-text' => 'Masquer le texte de la version',
 'revdelete-hide-image' => 'Masquer le contenu du fichier',
-'revdelete-hide-name' => 'Masquer l’action et la cible',
+'revdelete-hide-name' => "Masquer l'action et la cible",
 'revdelete-hide-comment' => 'Masquer le commentaire de modification',
-'revdelete-hide-user' => 'Masquer le pseudo ou l’adresse IP du contributeur.',
-'revdelete-hide-restricted' => 'Supprimer ces données aux administrateurs ainsi qu’aux autres',
+'revdelete-hide-user' => "Masquer le pseudo ou l'adresse IP du contributeur.",
+'revdelete-hide-restricted' => "Supprimer ces données aux administrateurs ainsi qu'aux autres",
 'revdelete-radio-same' => '(ne pas changer)',
 'revdelete-radio-set' => 'Oui',
 'revdelete-radio-unset' => 'Non',
@@ -1264,31 +1275,31 @@ Les autres administrateurs de {{SITENAME}} pourront toujours accéder au contenu
 'revdelete-log' => 'Motif :',
 'revdelete-submit' => 'Appliquer {{PLURAL:$1|à la révision sélectionnée|aux révisions sélectionnées}}',
 'revdelete-success' => "'''Visibilité des versions mise à jour avec succès.'''",
-'revdelete-failure' => "'''La visibilité de la version na pas pu être mise à jour :'''
+'revdelete-failure' => "'''La visibilité de la version n'a pas pu être mise à jour :'''
 $1",
 'logdelete-success' => "'''Visibilité du journal paramétrée avec succès.'''",
-'logdelete-failure' => "'''La visibilité du journal na pas pu être définie :'''
+'logdelete-failure' => "'''La visibilité du journal n'a pas pu être définie :'''
 $1",
 'revdel-restore' => 'modifier la visibilité',
 'revdel-restore-deleted' => 'révisions supprimées',
 'revdel-restore-visible' => 'révisions visibles',
 'pagehist' => 'Historique de la page',
 'deletedhist' => 'Historique supprimé',
-'revdelete-hide-current' => 'Erreur lors de la suppression de l’élément daté du $1 à $2 : il est la révision courante.
-Il ne peut pas être supprimé.',
-'revdelete-show-no-access' => 'Erreur lors de l’affichage de l’élément daté du $1 à $2 : il est marqué comme « restreint ».
-Vous n’y avez pas accès.',
-'revdelete-modify-no-access' => 'Erreur lors de la modification de l’élément daté du $1 à $2 : il est marqué comme « restreint ».
-Vous n’y avez pas accès.',
-'revdelete-modify-missing' => 'Erreur lors de la modification de l’élément avec l’ID $1 : il est manquant dans la base de données !',
-'revdelete-no-change' => "'''Attention :''' Lélément daté du $1 à $2 a déjà les paramètres de visibilité demandés.",
-'revdelete-concurrent-change' => 'Erreur lors de la modification de l’élément daté du $1 à $2 : son statut a été changé par quelqu’un d’autre pendant que vous le modifiez.
-Vérifiez les journaux.',
-'revdelete-only-restricted' => 'Erreur lors de la suppression de l’entrée datée du $1 à $2 : vous ne pouvez pas supprimer ces éléments aux administrateurs sans également sélectionner des autres options de suppression.',
-'revdelete-reason-dropdown' => '* Raisons courantes de suppression :
-** Violation des droits dauteurs ;
+'revdelete-hide-current' => "Erreur lors de la suppression de l'élément daté du $1 à $2 : il est la révision courante.
+Il ne peut pas être supprimé.",
+'revdelete-show-no-access' => "Erreur lors de l'affichage de l'élément daté du $1 à $2 : il est marqué comme « restreint ».
+Vous n'y avez pas accès.",
+'revdelete-modify-no-access' => "Erreur lors de la modification de l'élément daté du $1 à $2 : il est marqué comme « restreint ».
+Vous n'y avez pas accès.",
+'revdelete-modify-missing' => "Erreur lors de la modification de l'élément avec l'ID $1 : il est manquant dans la base de données !",
+'revdelete-no-change' => "'''Attention :''' L'élément daté du $1 à $2 a déjà les paramètres de visibilité demandés.",
+'revdelete-concurrent-change' => "Erreur lors de la modification de l'élément daté du $1 à $2 : son statut a été changé par quelqu'un d'autre pendant que vous le modifiez.
+Vérifiez les journaux.",
+'revdelete-only-restricted' => "Erreur lors de la suppression de l'entrée datée du $1 à $2 : vous ne pouvez pas supprimer ces éléments aux administrateurs sans également sélectionner des autres options de suppression.",
+'revdelete-reason-dropdown' => "* Raisons courantes de suppression :
+** Violation des droits d'auteurs ;
 ** Commentaires ou renseignements personnels inappropriés ;
-** Informations potentiellement diffamatoires.',
+** Informations potentiellement diffamatoires.",
 'revdelete-otherreason' => 'Autre raison / raison supplémentaire :',
 'revdelete-reasonotherlist' => 'Autre raison',
 'revdelete-edit-reasonlist' => 'Modifier les motifs fréquents de suppression',
@@ -1301,32 +1312,32 @@ Voir la [[Special:BlockList|liste des blocages]] pour la liste des bannissements
 
 # History merging
 'mergehistory' => 'Fusionner les historiques des pages',
-'mergehistory-header' => 'Cette page vous permet de fusionner des versions de l’historique d’une page d’origine vers une nouvelle page.
-Assurez-vous que cette opération conservera la continuité de l’historique de la page.',
+'mergehistory-header' => "Cette page vous permet de fusionner des versions de l'historique d'une page d'origine vers une nouvelle page.
+Assurez-vous que cette opération conservera la continuité de l'historique de la page.",
 'mergehistory-box' => 'Fusionner les versions de deux pages :',
-'mergehistory-from' => 'Page d’origine :',
+'mergehistory-from' => "Page d'origine :",
 'mergehistory-into' => 'Page de destination :',
-'mergehistory-list' => 'Historique des modifications fusionnable',
-'mergehistory-merge' => 'Les versions suivantes de [[:$1]] peuvent être fusionnées avec [[:$2]]. Utilisez la colonne de boutons radio pour fusionner uniquement les versions créées du début jusqu’à la date indiquée. Notez bien que l’utilisation des liens de navigation réinitialisera cette colonne.',
+'mergehistory-list' => 'Historique fusionnable des modifications',
+'mergehistory-merge' => "Les versions suivantes de [[:$1]] peuvent être fusionnées avec [[:$2]]. Utilisez la colonne de boutons radio pour fusionner uniquement les versions créées du début jusqu'à la date indiquée. Notez bien que l'utilisation des liens de navigation réinitialisera cette colonne.",
 'mergehistory-go' => 'Voir les modifications qui peuvent être fusionnées',
 'mergehistory-submit' => 'Fusionner les versions',
 'mergehistory-empty' => 'Aucune version ne peut être fusionnée.',
 'mergehistory-success' => '$3 version{{PLURAL:$3||s}} de [[:$1]] fusionnée{{PLURAL:$3||s}} dans [[:$2]].',
 'mergehistory-fail' => 'Impossible de procéder à la fusion des historiques. Resélectionner la page ainsi que les paramètres de date.',
-'mergehistory-no-source' => 'La page d’origine $1 n’existe pas.',
-'mergehistory-no-destination' => 'La page de destination $1 n’existe pas.',
-'mergehistory-invalid-source' => 'La page d’origine doit avoir un titre valide.',
+'mergehistory-no-source' => "La page d'origine $1 n'existe pas.",
+'mergehistory-no-destination' => "La page de destination $1 n'existe pas.",
+'mergehistory-invalid-source' => "La page d'origine doit avoir un titre valide.",
 'mergehistory-invalid-destination' => 'La page de destination doit avoir un titre valide.',
 'mergehistory-autocomment' => '[[:$1]] fusionnée avec [[:$2]]',
 'mergehistory-comment' => '[[:$1]] fusionnée avec [[:$2]] : $3',
-'mergehistory-same-destination' => 'Les pages d’origine et de destination ne peuvent pas être la même',
+'mergehistory-same-destination' => "Les pages d'origine et de destination ne peuvent pas être la même",
 'mergehistory-reason' => 'Motif :',
 
 # Merge log
 'mergelog' => 'Journal des fusions',
-'pagemerge-logentry' => '[[$1]] fusionnée avec [[$2]] (versions jusqu’au $3)',
+'pagemerge-logentry' => "[[$1]] fusionnée avec [[$2]] (versions jusqu'au $3)",
 'revertmerge' => 'Séparer',
-'mergelogpagetext' => 'Voici la liste des fusions de l’historique d’une page dans celui d’une autre les plus récentes.',
+'mergelogpagetext' => "Voici la liste des fusions de l'historique d'une page dans celui d'une autre les plus récentes.",
 
 # Diffs
 'history-title' => '$1 : Historique des versions',
@@ -1338,7 +1349,7 @@ Assurez-vous que cette opération conservera la continuité de l’historique de
 'showhideselectedversions' => 'Afficher/masquer les versions sélectionnées',
 '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}})',
+'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.
@@ -1347,10 +1358,10 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 # Search results
 'searchresults' => 'Résultats de la recherche',
 'searchresults-title' => 'Résultats de recherche pour « $1 »',
-'searchresulttext' => 'Pour plus d’informations sur la recherche dans {{SITENAME}}, voir [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchresulttext' => "Pour plus d'informations sur la recherche dans {{SITENAME}}, voir [[{{MediaWiki:Helppage}}|{{int:help}}]].",
 'searchsubtitle' => "Vous avez recherché « '''[[:$1]]''' » ([[Special:Prefixindex/$1|toutes les pages commençant par « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|toutes les pages qui ont un lien vers « $1 »]])",
 'searchsubtitleinvalid' => "Vous avez recherché « '''$1''' »",
-'toomanymatches' => 'Un trop grand nombre d’occurrences a été renvoyé, veuillez soumettre une requête différente.',
+'toomanymatches' => "Un trop grand nombre d'occurrences a été renvoyé, veuillez soumettre une requête différente.",
 'titlematches' => 'Correspondances dans les titres des pages',
 'notitlematches' => 'Aucun titre de page ne correspond à la recherche.',
 'textmatches' => 'Correspondances dans le texte des pages',
@@ -1367,7 +1378,7 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'searchhelp-url' => 'Help:Accueil',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Rechercher les pages commençant par ce préfixe]]',
 'searchprofile-articles' => 'Pages de contenu',
-'searchprofile-project' => 'Pages d’aide et de projet',
+'searchprofile-project' => "Pages d'aide et de projet",
 'searchprofile-images' => 'Multimédia',
 'searchprofile-everything' => 'Tout',
 'searchprofile-advanced' => 'Recherche avancée',
@@ -1385,8 +1396,6 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'search-interwiki-caption' => 'Projets frères',
 'search-interwiki-default' => 'Résultats sur $1 :',
 'search-interwiki-more' => '(plus)',
-'search-mwsuggest-enabled' => 'avec suggestions',
-'search-mwsuggest-disabled' => 'sans suggestions',
 'search-relatedarticle' => 'Relaté',
 'mwsuggest-disable' => 'Désactiver les suggestions AJAX',
 'searcheverything-enable' => 'Rechercher dans tous les espaces de noms',
@@ -1396,8 +1405,8 @@ Vous pouvez trouver des détails dans le [{{fullurl:{{#Special:Log}}/delete|page
 'showingresultsnum' => 'Affichage de <b>$3</b> résultat{{PLURAL:$3||s}} à partir du n°<b>$2</b>.',
 'showingresultsheader' => "{{PLURAL:$5|Résultat '''$1'''|Résultats '''$1–$2'''}} de '''$3''' pour '''$4'''",
 'nonefound' => "'''Note''' : par défaut, seuls certains espaces de noms sont utilisés pour la recherche.
-Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (y compris les pages de discussion, les modèles, etc.) ou bien utilisez lespace de noms souhaité comme préfixe.",
-'search-nonefound' => 'Il n’y a aucun résultat correspondant à la requête.',
+Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (y compris les pages de discussion, les modèles, etc.) ou bien utilisez l'espace de noms souhaité comme préfixe.",
+'search-nonefound' => "Il n'y a aucun résultat correspondant à la requête.",
 'powersearch' => 'Rechercher',
 'powersearch-legend' => 'Recherche avancée',
 'powersearch-ns' => 'Rechercher dans les espaces de noms :',
@@ -1410,20 +1419,20 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'searchdisabled' => 'La recherche sur {{SITENAME}} est désactivée. En attendant la réactivation, vous pouvez effectuer une recherche via Google. Attention, leur indexation du contenu de {{SITENAME}} peut ne pas être à jour.',
 
 # Quickbar
-'qbsettings' => 'Barre d’outils',
+'qbsettings' => "Barre d'outils",
 'qbsettings-none' => 'Aucune',
 'qbsettings-fixedleft' => 'Gauche',
 'qbsettings-fixedright' => 'Droite',
 'qbsettings-floatingleft' => 'Flottante à gauche',
 'qbsettings-floatingright' => 'Flottante à droite',
-'qbsettings-directionality' => 'Fixe, en fonction de la directivité d’écriture de votre langue',
+'qbsettings-directionality' => "Fixe, en fonction de la directivité d'écriture de votre langue",
 
 # Preferences page
 'preferences' => 'Préférences',
 'mypreferences' => 'Préférences',
 'prefs-edits' => 'Nombre de modifications :',
 'prefsnologin' => 'Non connecté',
-'prefsnologintext' => 'Vous devez être <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} connecté]</span> pour modifier vos préférences dutilisateur.',
+'prefsnologintext' => 'Vous devez être <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} connecté]</span> pour modifier vos préférences d\'utilisateur.',
 'changepassword' => 'Changer de mot de passe',
 'prefs-skin' => 'Habillage',
 'skin-preview' => 'Prévisualiser',
@@ -1442,7 +1451,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'prefs-watchlist-token' => 'Jeton pour la liste de suivi :',
 'prefs-misc' => 'Préférences diverses',
 'prefs-resetpass' => 'Changer de mot de passe',
-'prefs-changeemail' => 'Changer l’adresse de courriel',
+'prefs-changeemail' => "Changer l'adresse de courriel",
 'prefs-setemail' => 'Définir une adresse de courriel',
 'prefs-email' => 'Options des courriels',
 'prefs-rendering' => 'Apparence',
@@ -1460,7 +1469,7 @@ Essayez en utilisant le préfixe ''all:'' pour rechercher dans tout le contenu (
 'recentchangesdays' => 'Nombre de jours à afficher dans les modifications récentes :',
 'recentchangesdays-max' => '(maximum $1 jour{{PLURAL:$1||s}})',
 'recentchangescount' => 'Nombre de modifications à afficher par défaut :',
-'prefs-help-recentchangescount' => 'Ceci inclut les modifications récentes, les pages d’historiques et les journaux.',
+'prefs-help-recentchangescount' => "Ceci inclut les modifications récentes, les pages d'historiques et les journaux.",
 'prefs-help-watchlist-token' => 'Remplissez ce champ avec une valeur secrète et un flux RSS sera généré pour votre liste de suivi.
 Toute personne connaissant ce jeton pourra lire votre liste de suivi, choisissez donc une valeur sécurisée.
 Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
@@ -1482,8 +1491,8 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
 'timezoneregion-europe' => 'Europe',
 'timezoneregion-indian' => 'Océan indien',
 'timezoneregion-pacific' => 'Océan pacifique',
-'allowemail' => 'Autoriser l’envoi de courriels venant d’autres utilisateurs',
-'prefs-searchoptions' => 'Options de recherche',
+'allowemail' => "Autoriser l'envoi de courriels venant d'autres utilisateurs",
+'prefs-searchoptions' => 'Recherche',
 'prefs-namespaces' => 'Espaces de noms',
 'defaultns' => 'Rechercher par défaut dans ces espaces de noms :',
 'default' => 'défaut',
@@ -1495,10 +1504,10 @@ Voici une valeur générée aléatoirement que vous pouvez utiliser : $1',
 'prefs-emailconfirm-label' => 'Confirmation du courriel :',
 'prefs-textboxsize' => 'Taille de la fenêtre de modification',
 'youremail' => 'Courriel :',
-'username' => 'Nom d’utilisateur :',
-'uid' => 'Numéro d’utilisateur :',
+'username' => "Nom d'utilisateur :",
+'uid' => "Numéro d'utilisateur :",
 'prefs-memberingroups' => 'Membre {{PLURAL:$1|du groupe|des groupes}} :',
-'prefs-registration' => 'Date d’inscription :',
+'prefs-registration' => "Date d'inscription :",
 'yourrealname' => 'Nom réel :',
 'yourlanguage' => 'Langue :',
 'yourvariant' => 'Variante de la langue du contenu :',
@@ -1513,10 +1522,10 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'gender-unknown' => 'Non renseigné',
 'gender-male' => 'Masculin',
 'gender-female' => 'Féminin',
-'prefs-help-gender' => 'Facultatif : utilisé pour accorder en genre les messages de l’interface. Cette information sera publique.',
+'prefs-help-gender' => "Facultatif : utilisé pour accorder en genre les messages de l'interface. Cette information sera publique.",
 'email' => 'Courriel',
 'prefs-help-realname' => 'Facultatif : si vous le spécifiez, il sera utilisé pour vous attribuer vos contributions.',
-'prefs-help-email' => 'L’adresse de courriel est facultative, mais elle est nécessaire pour réinitialiser votre mot de passe, si vous veniez à l’oublier.',
+'prefs-help-email' => "L'adresse de courriel est facultative, mais elle est nécessaire pour réinitialiser votre mot de passe, si vous veniez à l'oublier.",
 'prefs-help-email-others' => 'Vous pourriez aussi choisir de laisser les autres vous contacter sur votre page de discussion utilisateur sans que soit nécessaire de révéler votre identité.',
 'prefs-help-email-required' => 'Une adresse de courriel est requise.',
 'prefs-info' => 'Informations de base',
@@ -1529,9 +1538,9 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'prefs-advancedrendering' => 'Options avancées',
 'prefs-advancedsearchoptions' => 'Options avancées',
 'prefs-advancedwatchlist' => 'Options avancées',
-'prefs-displayrc' => 'Options d’affichage',
-'prefs-displaysearchoptions' => 'Options d’affichage',
-'prefs-displaywatchlist' => 'Options d’affichage',
+'prefs-displayrc' => "Options d'affichage",
+'prefs-displaysearchoptions' => "Options d'affichage",
+'prefs-displaywatchlist' => "Options d'affichage",
 'prefs-diffs' => 'Différences',
 
 # User preference: e-mail validation using jQuery
@@ -1540,23 +1549,23 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 
 # User rights
 'userrights' => 'Gestion des droits des utilisateurs',
-'userrights-lookup-user' => 'Gestion des groupes d’utilisateurs',
-'userrights-user-editname' => 'Entrez un nom d’utilisateur :',
-'editusergroup' => 'Modification des groupes d’utilisateurs',
-'editinguser' => "Modification des droits de l{{GENDER:$1|utilisateur|utilisatrice}} '''[[User:$1|$1]]''' $2",
-'userrights-editusergroup' => 'Modifier les groupes de l’utilisateur',
-'saveusergroups' => 'Enregistrer les groupes de l’utilisateur',
+'userrights-lookup-user' => "Gestion des groupes d'utilisateurs",
+'userrights-user-editname' => "Entrez un nom d'utilisateur :",
+'editusergroup' => "Modification des groupes d'utilisateurs",
+'editinguser' => "Modification des droits de l'{{GENDER:$1|utilisateur|utilisatrice}} '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => "Modifier les groupes de l'utilisateur",
+'saveusergroups' => "Enregistrer les groupes de l'utilisateur",
 'userrights-groupsmember' => 'Membre de :',
 'userrights-groupsmember-auto' => 'Membre implicite de :',
-'userrights-groups-help' => 'Vous pouvez modifier les groupes auxquels appartient cet utilisateur:
-* Une case cochée signifie que lutilisateur se trouve dans ce groupe.
-* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.
-* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.',
+'userrights-groups-help' => "Vous pouvez modifier les groupes auxquels appartient cet utilisateur:
+* Une case cochée signifie que l'utilisateur se trouve dans ce groupe.
+* Une case non cochée signifie qu'{{GENDER:$1|il|elle}} ne s'y trouve pas.
+* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l'avez ajouté, ou vice-versa.",
 'userrights-reason' => 'Motif :',
-'userrights-no-interwiki' => 'Vous n’avez pas la permission de modifier des droits d’utilisateurs sur d’autres wikis.',
-'userrights-nodatabase' => 'La base de donnée « $1 » n’existe pas ou n’est pas locale.',
-'userrights-nologin' => 'Vous devez vous [[Special:UserLogin|connecter]] avec un compte d’administrateur pour modifier des droits d’utilisateur.',
-'userrights-notallowed' => 'Votre compte n’a pas la permission de modifier des droits d’utilisateur.',
+'userrights-no-interwiki' => "Vous n'avez pas la permission de modifier des droits d'utilisateurs sur d'autres wikis.",
+'userrights-nodatabase' => "La base de donnée « $1 » n'existe pas ou n'est pas locale.",
+'userrights-nologin' => "Vous devez vous [[Special:UserLogin|connecter]] avec un compte d'administrateur pour modifier des droits d'utilisateur.",
+'userrights-notallowed' => "Votre compte n'a pas la permission de modifier des droits d'utilisateur.",
 'userrights-changeable-col' => 'Les groupes que vous pouvez modifier',
 'userrights-unchangeable-col' => 'Les groupes que vous ne pouvez pas modifier',
 
@@ -1593,64 +1602,67 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'right-minoredit' => 'Marquer ses modifications comme mineures',
 'right-move' => 'Renommer des pages',
 'right-move-subpages' => 'Renommer des pages avec leurs sous-pages',
-'right-move-rootuserpages' => 'Renommer la page principale d’un utilisateur',
+'right-move-rootuserpages' => "Renommer la page principale d'un utilisateur",
 'right-movefile' => 'Renommer des fichiers',
-'right-suppressredirect' => 'Ne pas créer de redirection depuis le titre d’origine en renommant une page',
+'right-suppressredirect' => "Ne pas créer de redirection depuis le titre d'origine en renommant une page",
 'right-upload' => 'Importer des fichiers',
 'right-reupload' => 'Écraser un fichier existant',
-'right-reupload-own' => 'Écraser un fichier que l’on a soi-même importé',
+'right-reupload-own' => "Écraser un fichier que l'on a soi-même importé",
 'right-reupload-shared' => 'Écraser localement un fichier présent sur un dépôt partagé',
 'right-upload_by_url' => 'Importer un fichier depuis une adresse URL',
 'right-purge' => 'Purger le cache des pages sans demande de confirmation',
 'right-autoconfirmed' => 'Modifier les pages semi-protégées',
 'right-bot' => 'Être traité comme un processus automatisé',
-'right-nominornewtalk' => 'Ne pas déclencher la notification de nouveau message lorsqu’on effectue une modification mineure sur la page de discussion d’un utilisateur',
+'right-nominornewtalk' => "Ne pas déclencher la notification de nouveau message lorsqu'on effectue une modification mineure sur la page de discussion d'un utilisateur",
 'right-apihighlimits' => 'Utiliser des limites plus élevées dans les requêtes API',
-'right-writeapi' => 'Utiliser l’API de modification du wiki',
+'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-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',
 'right-browsearchive' => 'Rechercher des pages supprimées',
 'right-undelete' => 'Restaurer une page supprimée',
 'right-suppressrevision' => 'Examiner et restaurer les versions masquées aux administrateurs',
 'right-suppressionlog' => 'Voir les journaux privés',
-'right-block' => 'Bloquer en écriture d’autres utilisateurs',
-'right-blockemail' => 'Empêcher un utilisateur d’envoyer des courriels',
+'right-block' => "Bloquer en écriture d'autres utilisateurs",
+'right-blockemail' => "Empêcher un utilisateur d'envoyer des courriels",
 'right-hideuser' => 'Bloquer un utilisateur en masquant son nom au public',
-'right-ipblock-exempt' => 'Ne pas être affecté par les IP bloquées, les blocages automatiques et les blocages de plages d’IP',
+'right-ipblock-exempt' => "Ne pas être affecté par les IP bloquées, les blocages automatiques et les blocages de plages d'IP",
 'right-proxyunbannable' => 'Ne pas être affecté par les blocages automatiques de serveurs mandataires',
 'right-unblockself' => 'Se débloquer eux-mêmes',
 'right-protect' => 'Modifier le niveau de protection des pages et modifier les pages protégées',
 'right-editprotected' => 'Modifier les pages protégées (sans protection en cascade)',
-'right-editinterface' => 'Modifier l’interface utilisateur',
-'right-editusercssjs' => 'Modifier les fichiers CSS et JavaScript d’autres utilisateurs',
-'right-editusercss' => 'Modifier les fichiers CSS d’autres utilisateurs',
-'right-edituserjs' => 'Modifier les fichiers JavaScript d’autres utilisateurs',
-'right-rollback' => 'Révoquer rapidement les modifications du dernier contributeur d’une page particulière',
+'right-editinterface' => "Modifier l'interface utilisateur",
+'right-editusercssjs' => "Modifier les fichiers CSS et JavaScript d'autres utilisateurs",
+'right-editusercss' => "Modifier les fichiers CSS d'autres utilisateurs",
+'right-edituserjs' => "Modifier les fichiers JavaScript d'autres utilisateurs",
+'right-rollback' => "Révoquer rapidement les modifications du dernier contributeur d'une page particulière",
 'right-markbotedits' => 'Marquer des modifications révoquées comme ayant été faites par un robot.',
 'right-noratelimit' => 'Ne pas être affecté par les limites de taux',
-'right-import' => 'Importer des pages depuis d’autres wikis',
+'right-import' => "Importer des pages depuis d'autres wikis",
 'right-importupload' => 'Importer des pages depuis un fichier',
 'right-patrol' => 'Marquer des modifications des autres comme vérifiées',
 'right-autopatrol' => 'Avoir ses modifications automatiquement marquées comme surveillées',
 'right-patrolmarks' => 'Voir les marquages de surveillance dans les modifications récentes',
 'right-unwatchedpages' => 'Voir la liste des pages non suivies',
 'right-mergehistory' => 'Fusionner les historiques des pages',
-'right-userrights' => 'Modifier tous les droits d’un utilisateur',
-'right-userrights-interwiki' => 'Modifier les droits d’utilisateurs qui sont sur un autre wiki',
+'right-userrights' => "Modifier tous les droits d'un utilisateur",
+'right-userrights-interwiki' => "Modifier les droits d'utilisateurs qui sont sur un autre wiki",
 'right-siteadmin' => 'Verrouiller ou déverrouiller la base de données',
-'right-override-export-depth' => 'Exporter les pages en incluant les pages liées jusqu’à une profondeur de 5 niveaux',
+'right-override-export-depth' => "Exporter les pages en incluant les pages liées jusqu'à une profondeur de 5 niveaux",
 'right-sendemail' => 'Envoyer un courriel aux autres utilisateurs',
 'right-passwordreset' => 'Voir les courriels de réinitialisation des mots de passe',
 
 # User rights log
-'rightslog' => 'Journal des modifications de droits d’utilisateurs',
-'rightslogtext' => 'Voici l’historique des modifications des droits des utilisateurs.',
-'rightslogentry' => 'a modifié les droits de l’utilisateur « $1 » de $2 à $3',
+'rightslog' => "Journal des modifications de droits d'utilisateurs",
+'rightslogtext' => "Voici l'historique des modifications des droits des utilisateurs.",
+'rightslogentry' => "a modifié les droits de l'utilisateur « $1 » de $2 à $3",
 'rightslogentry-autopromote' => 'a été automatiquement promu de $2 à $3',
+'logentry-rights-rights' => "$1 a modifié l'appartenance au groupe pour $3 de $4 à $5",
+'logentry-rights-rights-legacy' => "$1 a modifié l'appartenance au groupe pour $3",
+'logentry-rights-autopromote' => '$1 a été promu automatiquement de $4 à $5',
 'rightsnone' => '(aucun)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1662,16 +1674,16 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'action-minoredit' => 'marquer cette modification comme mineure',
 'action-move' => 'renommer cette page',
 'action-move-subpages' => 'renommer cette page et ses sous-pages',
-'action-move-rootuserpages' => 'renommer la page principale d’un utilisateur',
+'action-move-rootuserpages' => "renommer la page principale d'un utilisateur",
 'action-movefile' => 'renommer ce fichier',
 'action-upload' => 'importer ce fichier',
 'action-reupload' => 'écraser ce fichier existant',
 'action-reupload-shared' => 'outrepasser localement ce fichier présent sur un dépôt partagé',
-'action-upload_by_url' => 'importer ce fichier à partir d’une adresse URL',
-'action-writeapi' => 'utiliser l‘API d’écriture',
+'action-upload_by_url' => "importer ce fichier à partir d'une adresse URL",
+'action-writeapi' => "utiliser l‘API d'écriture",
 'action-delete' => 'supprimer cette page',
 'action-deleterevision' => 'supprimer cette version',
-'action-deletedhistory' => 'voir l’historique supprimé de cette page',
+'action-deletedhistory' => "voir l'historique supprimé de cette page",
 'action-browsearchive' => 'rechercher des pages supprimées',
 'action-undelete' => 'restaurer cette page',
 'action-suppressrevision' => 'visionner et rétablir cette version supprimée',
@@ -1679,14 +1691,14 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'action-block' => 'bloquer en écriture cet utilisateur',
 'action-protect' => 'modifier les niveaux de protection pour cette page',
 'action-rollback' => 'annuler rapidement les modifications du dernier utilisateur qui a modifié une page donnée',
-'action-import' => 'importer cette page à partir d’un autre wiki',
-'action-importupload' => 'importer cette page à partir d’un fichier',
+'action-import' => "importer cette page à partir d'un autre wiki",
+'action-importupload' => "importer cette page à partir d'un fichier",
 'action-patrol' => 'marquer la modification des autres comme relue',
 'action-autopatrol' => 'avoir votre modification marquée comme relue',
 'action-unwatchedpages' => 'voir la liste des pages non suivies',
-'action-mergehistory' => 'fusionner l’historique de cette page',
-'action-userrights' => 'modifier tous les droits d’utilisateur',
-'action-userrights-interwiki' => 'modifier les droits des utilisateurs sur d’autres wikis',
+'action-mergehistory' => "fusionner l'historique de cette page",
+'action-userrights' => "modifier tous les droits d'utilisateur",
+'action-userrights-interwiki' => "modifier les droits des utilisateurs sur d'autres wikis",
 'action-siteadmin' => 'verrouiller ou déverrouiller la base de données',
 'action-sendemail' => 'envoyer des courriels',
 
@@ -1699,8 +1711,8 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'recentchanges-label-newpage' => 'Cette modification a créé une nouvelle page',
 'recentchanges-label-minor' => 'Cette modification est mineure',
 'recentchanges-label-bot' => 'Cette modification a été effectuée par un robot.',
-'recentchanges-label-unpatrolled' => 'Cette modification n’a pas encore été patrouillée.',
-'rcnote' => 'Voici {{PLURAL:$1|la dernière modification effectuée|les $1 dernières modifications effectuées}} durant {{PLURAL:$2|la dernière journée|les <b>$2</b> derniers jours}} jusqu’à $5 le $4.',
+'recentchanges-label-unpatrolled' => "Cette modification n'a pas encore été patrouillée.",
+'rcnote' => "Voici {{PLURAL:$1|la dernière modification effectuée|les $1 dernières modifications effectuées}} durant {{PLURAL:$2|la dernière journée|les <b>$2</b> derniers jours}} jusqu'à $5 le $4.",
 'rcnotefrom' => "Voici les modifications effectuées depuis le '''$2''' ('''$1''' au maximum).",
 'rclistfrom' => 'Afficher les nouvelles modifications depuis le $1.',
 'rcshowhideminor' => '$1 les modifications mineures',
@@ -1731,35 +1743,35 @@ Elle ne doit pas dépasser $1 caractère{{PLURAL:$1||s}}.',
 'recentchangeslinked-feed' => 'Suivi des pages liées',
 'recentchangeslinked-toolbox' => 'Suivi des pages liées',
 'recentchangeslinked-title' => 'Suivi des pages associées à « $1 »',
-'recentchangeslinked-noresult' => 'Il n’y a pas de modification sur les pages liées pendant la période choisie.',
+'recentchangeslinked-noresult' => "Il n'y a pas de modification des pages liées pendant la période choisie.",
 'recentchangeslinked-summary' => "Cette page spéciale montre les modifications récentes sur les pages qui sont liées. Les pages de votre liste de suivi sont '''en gras'''.",
 'recentchangeslinked-page' => 'Nom de la page :',
-'recentchangeslinked-to' => 'Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l’inverse',
+'recentchangeslinked-to' => "Afficher les modifications des pages qui comportent un lien vers la page donnée plutôt que l'inverse",
 
 # Upload
 'upload' => 'Importer un fichier',
 'uploadbtn' => 'Importer le fichier',
-'reuploaddesc' => 'Annuler et retourner au formulaire d’import',
+'reuploaddesc' => "Annuler et retourner au formulaire d'import",
 'upload-tryagain' => 'Envoyer la description du fichier modifiée',
 'uploadnologin' => 'Non connecté(e)',
 'uploadnologintext' => 'Vous devez être [[Special:UserLogin|connecté(e)]] pour importer des fichiers sur le serveur.',
-'upload_directory_missing' => 'Le répertoire d’import de fichier ($1) est introuvable et n’a pas pu être créé par le serveur web.',
-'upload_directory_read_only' => 'Le répertoire d’import de fichier ($1) n’est pas accessible en écriture depuis le serveur web.',
-'uploaderror' => 'Erreur lors de l’import',
+'upload_directory_missing' => "Le répertoire d'import de fichier ($1) est introuvable et n'a pas pu être créé par le serveur web.",
+'upload_directory_read_only' => "Le répertoire d'import de fichier ($1) n'est pas accessible en écriture depuis le serveur web.",
+'uploaderror' => "Erreur lors de l'import",
 'upload-recreate-warning' => "'''Attention : Un fichier portant ce nom a été supprimé ou déplacé.'''
 
 Le journal des suppressions et celui des déplacements de cette page sont affichés ici pour informations :",
 'uploadtext' => "Utilisez ce formulaire pour importer des fichiers sur le serveur.
-Pour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. Limport est aussi enregistrés dans le [[Special:Log/upload|journal d'import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].
+Pour voir ou rechercher des images précédemment envoyées, consultez la [[Special:FileList|liste des images]]. L'import est aussi enregistrés dans le [[Special:Log/upload|journal d'import des fichiers]], et les suppressions dans le [[Special:Log/delete|journal des suppressions]].
 
 Pour inclure un fichier dans une page, utilisez un lien de la forme :
-* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas dune image) ;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.jpg]]</nowiki></code>''', pour afficher le fichier en pleine résolution (dans le cas d'une image) ;
 * '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:fichier.png|200px|thumb|left|texte descriptif]]</nowiki></code>''' pour utiliser une miniature de 200 pixels de large dans une boîte à gauche avec « texte descriptif » comme description ;
-* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code>''' pour lier directement vers le fichier sans lafficher.",
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:fichier.ogg]]</nowiki></code>''' pour lier directement vers le fichier sans l'afficher.",
 'upload-permitted' => 'Formats de fichiers autorisés : $1.',
 'upload-preferred' => 'Formats de fichiers préférés : $1.',
 'upload-prohibited' => 'Formats de fichiers interdits : $1.',
-'uploadlog' => 'Journal d’import de fichiers',
+'uploadlog' => "Journal d'import de fichiers",
 'uploadlogpage' => "Journal d'import de fichiers",
 'uploadlogpagetext' => 'Voici la liste des derniers fichiers importés sur le serveur.
 Voyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentation plus visuelle.',
@@ -1767,62 +1779,62 @@ Voyez la [[Special:NewFiles|galerie des nouvelles images]] pour une présentatio
 'filedesc' => 'Description',
 'fileuploadsummary' => 'Description :',
 'filereuploadsummary' => 'Modifications du fichier :',
-'filestatus' => 'Statut du droit d’auteur :',
+'filestatus' => "Statut du droit d'auteur :",
 'filesource' => 'Source :',
 'uploadedfiles' => 'Fichiers importés',
-'ignorewarning' => 'Ignorer l’avertissement et sauvegarder le fichier quand même',
+'ignorewarning' => "Ignorer l'avertissement et sauvegarder le fichier quand même",
 'ignorewarnings' => 'Ignorer les avertissements',
 'minlength1' => 'Le noms de fichiers doivent comprendre au moins une lettre.',
 'illegalfilename' => "Le nom de fichier « $1 » contient des caractères interdits dans les titres de pages. Merci de le renommer et de l'importer à nouveau.",
 'filename-toolong' => 'Le nom du fichier ne peut pas dépasser 240 octets.',
 'badfilename' => 'Le fichier a été renommé en « $1 ».',
-'filetype-mime-mismatch' => 'L’extension du fichier « .$1 » ne correspond pas au type MIME détecté du fichier ($2).',
+'filetype-mime-mismatch' => "L'extension du fichier « .$1 » ne correspond pas au type MIME détecté du fichier ($2).",
 'filetype-badmime' => 'Les fichiers du type MIME « $1 » ne peuvent pas être importés.',
-'filetype-bad-ie-mime' => 'Le fichier ne peut pas être importé parce qu’il serait détecté comme « $1 » par Internet Explorer, ce qui correspond à un type de fichier interdit car potentiellement dangereux.',
+'filetype-bad-ie-mime' => "Le fichier ne peut pas être importé parce qu'il serait détecté comme « $1 » par Internet Explorer, ce qui correspond à un type de fichier interdit car potentiellement dangereux.",
 'filetype-unwanted-type' => "'''« .$1 »''' est un format de fichier non désiré.
 {{PLURAL:$3|Le type de fichier préconisé est|Les types de fichiers préconisés sont}} $2.",
-'filetype-banned-type' => "''' « .$1 » '''{{PLURAL:$4|nest pas un type de fichier autorisé|ne sont pas des types de fichiers autorisés}}. 
+'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.",
-'filetype-missing' => 'Le fichier n’a aucune extension (comme « .jpg » par exemple).',
+'filetype-missing' => "Le fichier n'a aucune extension (comme « .jpg » par exemple).",
 'empty-file' => 'Le fichier que vous avez soumis était vide.',
 'file-too-large' => 'Le fichier que vous avez soumis était trop grand.',
 'filename-tooshort' => 'Le nom du fichier est trop court.',
 'filetype-banned' => 'Ce type de fichier est interdit.',
 'verification-error' => 'Ce fichier ne passe pas la vérification des fichiers.',
-'hookaborted' => 'La modification que vous avez essayé de faire a été arrêtée par un crochet d’une extension.',
-'illegal-filename' => 'Le nom du fichier n’est pas autorisé.',
-'overwrite' => 'Écraser un fichier existant n’est pas autorisé.',
-'unknown-error' => 'Une erreur inconnue s’est produite.',
+'hookaborted' => 'La modification que vous avez essayé de faire a été annulée par une extension.',
+'illegal-filename' => "Le nom du fichier n'est pas autorisé.",
+'overwrite' => "Écraser un fichier existant n'est pas autorisé.",
+'unknown-error' => "Une erreur inconnue s'est produite.",
 'tmp-create-error' => 'Impossible de créer le fichier temporaire.',
-'tmp-write-error' => 'Erreur d’écriture du fichier temporaire.',
+'tmp-write-error' => "Erreur d'écriture du fichier temporaire.",
 'large-file' => 'Les fichiers importés ne devraient pas dépasser $1 ; ce fichier fait $2.',
 'largefileserver' => 'La taille de ce fichier est supérieure au maximum autorisé.',
 'emptyfile' => 'Le fichier que vous voulez importer semble vide.
 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 <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 napparaîtra pas sur la page de description.
-Pour que ce soit le cas, vous devrez modifier manuellement la page. [[$1|thumb]]',
+'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 : <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 <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.",
+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 <strong>$1</strong>.
-Il est possible qu’il s’agisse d’une version réduite ''(vignette)''.
+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é.
-Si vous voulez toujours importer votre fichier, merci de retourner en arrière et d’utiliser un nouveau nom. [[File:$1|thumb|center|$1]]',
+'fileexists-forbidden' => "Un fichier avec ce nom existe déjà et ne peut pas être écrasé.
+Si vous voulez toujours importer votre fichier, merci de retourner en arrière et d'utiliser un nouveau nom. [[File:$1|thumb|center|$1]]",
 'fileexists-shared-forbidden' => 'Un fichier portant ce nom existe déjà dans le dépôt de fichiers partagé.
 Si vous voulez toujours importer votre fichier, veuillez revenir en arrière et utiliser un autre nom. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'Ce fichier est un doublon {{PLURAL:$1|du fichier suivant|des fichiers suivants}} :',
-'file-deleted-duplicate' => 'Un fichier identique à celui-ci ([[:$1]]) a déjà été supprimé. Vous devriez vérifier le journal des suppressions de ce fichier avant de l’importer à nouveau.',
+'file-deleted-duplicate' => "Un fichier identique à celui-ci ([[:$1]]) a déjà été supprimé. Vous devriez vérifier le journal des suppressions de ce fichier avant de l'importer à nouveau.",
 'uploadwarning' => 'Attention !',
 'uploadwarning-text' => 'Modifiez la description du fichier et essayez de nouveau.',
 'savefile' => 'Sauvegarder le fichier',
@@ -1830,9 +1842,9 @@ Si vous voulez toujours importer votre fichier, veuillez revenir en arrière et
 'overwroteimage' => 'a importé une nouvelle version de « [[$1]] »',
 'uploaddisabled' => "Désolé, l'import de fichiers est désactivé.",
 'copyuploaddisabled' => 'Import de fichier par URL désactivé.',
-'uploadfromurl-queued' => 'Votre fichier a été mis dans la file d’attente.',
+'uploadfromurl-queued' => "Votre fichier a été mis dans la file d'attente.",
 'uploaddisabledtext' => "L'import de fichiers est désactivé sur ce wiki.",
-'php-uploaddisabledtext' => "L'import de fichiers a été désactivé dans PHP. Vérifiez loption de configuration file_uploads.",
+'php-uploaddisabledtext' => "L'import de fichiers a été désactivé dans PHP. Vérifiez l'option de configuration file_uploads.",
 'uploadscripted' => 'Ce fichier contient du code HTML ou un script qui pourrait être interprété de façon incorrecte par un navigateur web.',
 'uploadvirus' => 'Ce fichier contient un virus ! Pour plus de détails, consultez : $1',
 'uploadjava' => "C'est un fichier ZIP qui contient un fichier Java .class.
@@ -1845,8 +1857,8 @@ Le téléchargement de fichiers Java n'est pas autorisé, car ils peuvent contou
 'upload-description' => 'Description du fichier',
 'upload-options' => "Options d'import de fichiers",
 'watchthisupload' => 'Suivre ce fichier',
-'filewasdeleted' => 'Un fichier avec ce nom a déjà été importé, puis supprimé.
-Vous devriez vérifier $1 avant de l’importer à nouveau.',
+'filewasdeleted' => "Un fichier avec ce nom a déjà été importé, puis supprimé.
+Vous devriez vérifier $1 avant de l'importer à nouveau.",
 'filename-bad-prefix' => "Le nom du fichier commence par '''« $1 »''' qui est typiquement un nom attribué automatiquement par les appareils photo numériques.
 Veuillez choisir un nom de fichier descriptif.",
 'filename-prefix-blacklist' => ' #<!-- laisser cette ligne telle quelle --><pre>
@@ -1878,9 +1890,9 @@ $1',
 'upload-file-error-text' => 'Une erreur interne est survenue en voulant créer un fichier temporaire sur le serveur. Veuillez contacter un [[Special:ListUsers/sysop|administrateur]].',
 'upload-misc-error' => "Erreur d'import inconnue",
 'upload-misc-error-text' => "Une erreur inconnue est survenue pendant l'import.
-Veuillez vérifier que lURL est valide et accessible, puis essayer à nouveau.
+Veuillez vérifier que l'URL est valide et accessible, puis essayer à nouveau.
 Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]].",
-'upload-too-many-redirects' => 'L’URL contient trop de redirections.',
+'upload-too-many-redirects' => "L'URL contient trop de redirections.",
 'upload-unknown-size' => 'Taille inconnue',
 'upload-http-error' => 'Une erreur HTTP est survenue : $1',
 'upload-copy-upload-invalid-domain' => "La copie des téléchargements n'est pas disponible depuis ce domaine.",
@@ -1891,8 +1903,9 @@ Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]
 'backend-fail-notexists' => "Le fichier $1 n'existe pas.",
 'backend-fail-hashes' => "Impossible d'obtenir les hachages du fichier pour comparaison.",
 'backend-fail-notsame' => 'Un fichier différent existe déjà pour $1 .',
-'backend-fail-invalidpath' => '$1 n’est pas un chemin de stockage valide.',
+'backend-fail-invalidpath' => "$1 n'est pas un chemin de stockage valide.",
 'backend-fail-delete' => 'Impossible de supprimer le fichier $1.',
+'backend-fail-describe' => 'Impossible de modifier les métadonnées du fichier "$1".',
 'backend-fail-alreadyexists' => 'Le fichier $1 existe déjà.',
 'backend-fail-store' => 'Impossible de stocker le fichier $1 en $2.',
 'backend-fail-copy' => 'Impossible de copier le fichier $1 en $2.',
@@ -1901,26 +1914,26 @@ Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]
 'backend-fail-writetemp' => "Impossible d'écrire dans le fichier temporaire.",
 'backend-fail-closetemp' => 'Impossible de fermer le fichier temporaire.',
 'backend-fail-read' => 'Impossible de lire le fichier $1.',
-'backend-fail-create' => 'Impossible d’écrire le fichier $1.',
-'backend-fail-maxsize' => "Impossible décrire le fichier $1 parce qu'il est plus grand {{PLURAL:$2|qu'un octet|que $2 octets}}.",
+'backend-fail-create' => "Impossible d'écrire le fichier $1.",
+'backend-fail-maxsize' => "Impossible d'écrire le fichier $1 parce qu'il est plus grand {{PLURAL:$2|qu'un octet|que $2 octets}}.",
 'backend-fail-readonly' => 'Le support de stockage "$1" est actuellement en lecture seule. La raison indiquée est: "$2"',
 'backend-fail-synced' => 'Le fichier "$1" est dans un état incohérent dans les supports de stockage internes',
 'backend-fail-connect' => 'Impossible de se connecter au support de stockage "$1".',
 'backend-fail-internal' => 'Une erreur inconnue s\'est produite dans le support de stockage "$1".',
 'backend-fail-contenttype' => 'Impossible de déterminer le type de contenu du fichier à stocker en "$1".',
 'backend-fail-batchsize' => 'Le support de stockage a fourni un lot de $1 {{PLURAL:$1|opération|opérations}} de fichier; la limite est $2 {{PLURAL:$2|opération|opérations}}.',
-'backend-fail-usable' => 'Impossible de lire ou d’écrire le fichier « $1 » en raison de droits insuffisants ou répertoires/conteneurs manquants.',
+'backend-fail-usable' => "Impossible de lire ou d'écrire le fichier « $1 » en raison de droits insuffisants ou répertoires/conteneurs manquants.",
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Impossible de se connecter à la base de données du journal pour le terminal de stockage "$1".',
 'filejournal-fail-dbquery' => 'Impossible de mettre à jour la base de données du journal pour le terminal de stockage "$1".',
 
 # Lock manager
-'lockmanager-notlocked' => 'Impossible de déverrouiller « $1 » ; elle n’est pas verrouillée.',
+'lockmanager-notlocked' => "Impossible de déverrouiller « $1 » ; elle n'est pas verrouillée.",
 'lockmanager-fail-closelock' => 'Impossible de fermer le fichier de verrou pour « $1 ».',
 'lockmanager-fail-deletelock' => 'Impossible de supprimer le fichier de verrou pour « $1 ».',
-'lockmanager-fail-acquirelock' => 'Impossible d’obtenir le verrou pour « $1 ».',
-'lockmanager-fail-openlock' => 'Impossible d’ouvrir le fichier de verrou pour « $1» .',
+'lockmanager-fail-acquirelock' => "Impossible d'obtenir le verrou pour « $1 ».",
+'lockmanager-fail-openlock' => "Impossible d'ouvrir le fichier de verrou pour « $1» .",
 '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.',
@@ -1928,8 +1941,8 @@ Si le problème persiste, contactez un [[Special:ListUsers/sysop|administrateur]
 '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 une archive ZIP.',
+'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 une archive ZIP qui utilise des caractéristiques non supportées par MediaWiki. 
@@ -1947,36 +1960,36 @@ Sa sécurité ne peut pas être correctement vérifiée.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Accès refusé',
-'img-auth-nopathinfo' => 'PATH_INFO manquant.
-Votre serveur nest pas paramétré pour passer cette information.
+'img-auth-nopathinfo' => "PATH_INFO manquant.
+Votre serveur n'est pas paramétré pour passer cette information.
 Il fonctionne peut-être en CGI et ne supporte pas img_auth.
-Voyez https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
-'img-auth-notindir' => "Le chemin demandé nest pas le répertoire d'import configuré.",
+Voyez https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
+'img-auth-notindir' => "Le chemin demandé n'est pas le répertoire d'import configuré.",
 'img-auth-badtitle' => 'Impossible de construire un titre valide à partir de « $1 ».',
-'img-auth-nologinnWL' => 'Vous n’êtes pas connecté et « $1 » n’est pas dans la liste blanche.',
-'img-auth-nofile' => 'Le fichier « $1 » n’existe pas.',
-'img-auth-isdir' => 'Vous essayez d’accéder au répertoire « $1 ».
-Seul l’accès aux fichiers est permis.',
+'img-auth-nologinnWL' => "Vous n'êtes pas connecté et « $1 » n'est pas dans la liste blanche.",
+'img-auth-nofile' => "Le fichier « $1 » n'existe pas.",
+'img-auth-isdir' => "Vous essayez d'accéder au répertoire « $1 ».
+Seul l'accès aux fichiers est permis.",
 'img-auth-streaming' => 'Lecture en continu de « $1 ».',
-'img-auth-public' => 'La fonction de img_auth.php est d’afficher des fichiers d’un wiki privé.
+'img-auth-public' => "La fonction de img_auth.php est d'afficher des fichiers d'un wiki privé.
 Ce wiki est configuré comme un wiki public.
-Pour une sécurité optimale, img_auth.php est désactivé.',
-'img-auth-noread' => 'L’utilisateur n’a pas le droit en lecture sur « $1 ».',
+Pour une sécurité optimale, img_auth.php est désactivé.",
+'img-auth-noread' => "L'utilisateur n'a pas le droit en lecture sur « $1 ».",
 'img-auth-bad-query-string' => "L'URL a une chaîne de requête invalide.",
 
 # HTTP errors
 'http-invalid-url' => 'URL incorrecte : $1',
 'http-invalid-scheme' => 'Les URL avec le schéma « $1 » ne sont pas supportées.',
-'http-request-error' => 'Erreur inconnue lors de l’envoi de la requête.',
+'http-request-error' => "Erreur inconnue lors de l'envoi de la requête.",
 'http-read-error' => 'Erreur de lecture HTTP.',
 'http-timed-out' => 'La requête HTTP a expiré.',
-'http-curl-error' => 'Erreur lors de la récupération de l’URL : $1',
-'http-host-unreachable' => 'Impossible d’atteindre l’URL.',
+'http-curl-error' => "Erreur lors de la récupération de l'URL : $1",
+'http-host-unreachable' => "Impossible d'atteindre l'URL.",
 'http-bad-status' => 'Il y a eu un problème lors de la requête HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'URL injoignable',
-'upload-curl-error6-text' => 'L’URL fournie ne peut pas être atteinte. Veuillez vérifier que l’URL est correcte et que le site est en ligne.',
+'upload-curl-error6-text' => "L'URL fournie ne peut pas être atteinte. Veuillez vérifier que l'URL est correcte et que le site est en ligne.",
 'upload-curl-error28' => "Dépassement du délai lors de l'import",
 'upload-curl-error28-text' => 'Le site a mis trop longtemps à répondre. Vérifiez que le site est en ligne, attendez un peu et réessayez. Vous pouvez aussi réessayer à une heure de moindre affluence.',
 
@@ -2004,7 +2017,7 @@ Quand elle est filtrée par utilisateur, seuls les fichiers dont la version la p
 # File description page
 'file-anchor-link' => 'Fichier',
 'filehist' => 'Historique du fichier',
-'filehist-help' => 'Cliquer sur une date et heure pour voir le fichier tel qu’il était à ce moment-là.',
+'filehist-help' => "Cliquer sur une date et heure pour voir le fichier tel qu'il était à ce moment-là.",
 'filehist-deleteall' => 'supprimer tout',
 'filehist-deleteone' => 'supprimer',
 'filehist-revert' => 'rétablir',
@@ -2020,30 +2033,30 @@ Quand elle est filtrée par utilisateur, seuls les fichiers dont la version la p
 'filehist-missing' => 'Fichier manquant',
 'imagelinks' => 'Utilisation du fichier',
 'linkstoimage' => '{{PLURAL:$1|La page suivante utilise|Les $1 pages suivantes utilisent}} ce fichier :',
-'linkstoimage-more' => 'Plus {{PLURAL:$1|d’une page utilise|de $1 pages utilisent}} ce fichier.
+'linkstoimage-more' => "Plus {{PLURAL:$1|d'une page utilise|de $1 pages utilisent}} ce fichier.
 La liste suivante affiche seulement {{PLURAL:$1|la première page qui utilise|les $1 premières pages qui utilisent}} ce fichier.
-Une [[Special:WhatLinksHere/$2|liste complète]] est disponible.',
-'nolinkstoimage' => 'Aucune page n’utilise ce fichier.',
+Une [[Special:WhatLinksHere/$2|liste complète]] est disponible.",
+'nolinkstoimage' => "Aucune page n'utilise ce fichier.",
 'morelinkstoimage' => 'Voir [[Special:WhatLinksHere/$1|plus de liens]] vers ce fichier.',
 'linkstoimage-redirect' => '$1 (redirection de fichier) $2',
 'duplicatesoffile' => '{{PLURAL:$1|Le fichier suivant est un duplicata|Les fichiers suivants sont des duplicatas}} de celui-ci ([[Special:FileDuplicateSearch/$2|plus de détails]]) :',
-'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.
-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].',
-'sharedupload-desc-create' => '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].',
+'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.
+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].",
+'sharedupload-desc-create' => "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].",
 'filepage-nofile' => 'Aucun fichier de ce nom existe.',
-'filepage-nofile-link' => 'Aucun fichier de ce nom n’existe, mais vous pouvez [$1 en importer un].',
+'filepage-nofile-link' => "Aucun fichier de ce nom n'existe, mais vous pouvez [$1 en importer un].",
 'uploadnewversion-linktext' => 'Importer une nouvelle version de ce fichier',
 'shared-repo-from' => 'de : $1',
 '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.',
+'upload-disallowed-here' => 'Vous ne pouvez pas remplacer ce fichier.',
 
 # File reversion
 'filerevert' => 'Rétablir $1',
@@ -2053,24 +2066,24 @@ Vous voulez peut-être modifier la description sur sa [$2 page de description].'
 'filerevert-defaultcomment' => 'Version du $1 à $2 rétablie',
 'filerevert-submit' => 'Rétablir',
 'filerevert-success' => "'''[[Media:$1|$1]]''' a été rétabli à [$4 la version du $2 à $3].",
-'filerevert-badversion' => 'Il n’y a pas localement de version antérieure du fichier qui porte la date indiquée.',
+'filerevert-badversion' => "Il n'y a pas localement de version antérieure du fichier qui porte la date indiquée.",
 
 # File deletion
 'filedelete' => 'Supprimer $1',
 'filedelete-legend' => 'Supprimer le fichier',
 'filedelete-intro' => "Vous êtes sur le point de supprimer '''[[Media:$1|$1]]''' ainsi que tout son historique.",
-'filedelete-intro-old' => "Vous êtes en train deffacer la version de '''[[Media:$1|$1]]''' du [$4 $2 à $3].",
+'filedelete-intro-old' => "Vous êtes en train d'effacer la version de '''[[Media:$1|$1]]''' du [$4 $2 à $3].",
 'filedelete-comment' => 'Motif :',
 'filedelete-submit' => 'Supprimer',
 'filedelete-success' => "'''$1''' a été supprimé.",
 'filedelete-success-old' => "La version de '''[[Media:$1|$1]]''' du $2 à $3 a été supprimée.",
-'filedelete-nofile' => "'''$1''' nexiste pas.",
-'filedelete-nofile-old' => "Il nexiste aucune version archivée de '''$1''' avec les attributs indiqués.",
+'filedelete-nofile' => "'''$1''' n'existe pas.",
+'filedelete-nofile-old' => "Il n'existe aucune version archivée de '''$1''' avec les attributs indiqués.",
 'filedelete-otherreason' => 'Motif autre / supplémentaire :',
 'filedelete-reason-otherlist' => 'Autre motif',
-'filedelete-reason-dropdown' => '* Motifs fréquents de suppression de fichiers
-** Violation du droit dauteur
-** Fichier dupliqué',
+'filedelete-reason-dropdown' => "* Motifs fréquents de suppression de fichiers
+** Violation du droit d'auteur
+** Fichier dupliqué",
 'filedelete-edit-reasonlist' => 'Modifier les motifs fréquents de suppression',
 'filedelete-maintenance' => 'La suppression et restauration de fichiers est temporairement désactivée durant la maintenance.',
 'filedelete-maintenance-title' => 'Impossible de supprimer le fichier',
@@ -2083,24 +2096,24 @@ Entrée : ''typedecontenu''/''sous-type'', par exemple <code>image/jpeg</code>."
 'download' => 'télécharger',
 
 # Unwatched pages
-'unwatchedpages' => 'Pages ne faisant partie d’aucune liste de suivi',
+'unwatchedpages' => "Pages ne faisant partie d'aucune liste de suivi",
 
 # List redirects
 'listredirects' => 'Liste des redirections',
 
 # Unused templates
 'unusedtemplates' => 'Modèles inutilisés',
-'unusedtemplatestext' => 'Cette page liste toutes les pages de l’espace de noms « {{ns:template}} » qui ne sont incluses dans aucune autre page.
-N’oubliez pas de vérifier s’il n’y a pas d’autres liens vers les modèles avant de les supprimer.',
+'unusedtemplatestext' => "Cette page liste toutes les pages de l'espace de noms « {{ns:template}} » qui ne sont incluses dans aucune autre page.
+N'oubliez pas de vérifier s'il n'y a pas d'autres liens vers les modèles avant de les supprimer.",
 'unusedtemplateswlh' => 'autres liens',
 
 # Random page
 'randompage' => 'Page au hasard',
-'randompage-nopages' => 'Il n’y a aucune page dans {{PLURAL:$2|l’espace de noms|les espaces de noms}} : $1.',
+'randompage-nopages' => "Il n'y a aucune page dans {{PLURAL:$2|l'espace de noms|les espaces de noms}} : $1.",
 
 # Random redirect
 'randomredirect' => 'Page de redirection au hasard',
-'randomredirect-nopages' => 'Il n’y a aucune page de redirection dans l’espace de noms « $1 ».',
+'randomredirect-nopages' => "Il n'y a aucune page de redirection dans l'espace de noms « $1 ».",
 
 # Statistics
 'statistics' => 'Statistiques',
@@ -2113,7 +2126,7 @@ N’oubliez pas de vérifier s’il n’y a pas d’autres liens vers les modèl
 'statistics-pages' => 'Pages',
 'statistics-pages-desc' => 'Toutes les pages du wiki, y compris les pages de discussion, les redirections, etc.',
 'statistics-files' => 'Fichers importés',
-'statistics-edits' => 'Modifications de pages depuis l’installation de {{SITENAME}}',
+'statistics-edits' => "Modifications de pages depuis l'installation de {{SITENAME}}",
 'statistics-edits-average' => 'Nombre moyen de modifications par page',
 'statistics-views-total' => 'Visites',
 'statistics-views-total-desc' => 'Les vues des pages non existantes et des pages spéciales ne sont pas incluses',
@@ -2123,11 +2136,11 @@ N’oubliez pas de vérifier s’il n’y a pas d’autres liens vers les modèl
 'statistics-users-active-desc' => 'Utilisateurs ayant fait au moins une action durant {{PLURAL:$1|le dernier jours|les $1 derniers jours}}',
 'statistics-mostpopular' => 'Pages les plus consultées',
 
-'disambiguations' => 'Pages ayant des liens vers des pages d’homonymie',
+'disambiguations' => "Pages ayant des liens vers des pages d'homonymie",
 'disambiguationspage' => 'Template:Homonymie',
-'disambiguations-text' => "Les pages suivantes comportent au moins un lien vers une '''page dhomonymie'''.
+'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 dhomonymie si elle utilise un modèle lié à [[MediaWiki:Disambiguationspage]]",
+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.
@@ -2143,7 +2156,7 @@ Les entrées <del>barrées</del> ont été résolues.',
 'brokenredirects-delete' => 'supprimer',
 
 'withoutinterwiki' => 'Pages sans liens inter-langues',
-'withoutinterwiki-summary' => 'Les pages suivantes ne possèdent pas de liens vers d’autres langues :',
+'withoutinterwiki-summary' => "Les pages suivantes ne possèdent pas de liens vers d'autres langues :",
 'withoutinterwiki-legend' => 'Préfixe',
 'withoutinterwiki-submit' => 'Afficher',
 
@@ -2159,9 +2172,9 @@ Les entrées <del>barrées</del> ont été résolues.',
 'nviews' => '$1 consultation{{PLURAL:$1||s}}',
 'nimagelinks' => 'Utilisé sur $1 {{PLURAL:$1|page|pages}}',
 'ntransclusions' => 'Utilisé sur $1 {{PLURAL:$1|page|pages}}',
-'specialpage-empty' => 'Il n’y a aucun résultat à afficher.',
+'specialpage-empty' => "Il n'y a aucun résultat à afficher.",
 'lonelypages' => 'Pages orphelines',
-'lonelypagestext' => 'Les pages suivantes ne sont ni pointées, ni incluses par d’autres pages du wiki.',
+'lonelypagestext' => "Les pages suivantes ne sont ni pointées, ni incluses par d'autres pages du wiki.",
 'uncategorizedpages' => 'Pages sans catégories',
 'uncategorizedcategories' => 'Catégories sans catégories',
 'uncategorizedimages' => 'Fichiers sans catégories',
@@ -2173,8 +2186,8 @@ Les entrées <del>barrées</del> ont été résolues.',
 'wantedpages' => 'Pages les plus demandées',
 'wantedpages-badtitle' => 'Titre invalide dans les résultats : $1',
 'wantedfiles' => 'Fichiers les plus demandés',
-'wantedfiletext-cat' => "Les fichiers suivants sont utilisés, mais il n'existent pas. Les fichiers de dépôts à distance peuvent être listés malgré qu'ils existent. Tout ces faux positifs seront <del>barrés</del>. En outre, les pages qui intègrent des fichiers qui n'existent pas sont répertoriés dans [[:$1]].",
-'wantedfiletext-nocat' => "Les fichiers suivants sont utilisés, mais n'existent pas. Les fichiers de dépôts à distance peuvent être listés malgré qu'ils existent. Tout ces faux positifs seront <del>barrés</del>.",
+'wantedfiletext-cat' => "Les fichiers suivants sont utilisés, mais n'existent pas. Les fichiers d'autres dépôts peuvent être listés malgré qu'ils existent. Tous ces faux positifs seront <del>barrés</del>. En outre, les pages qui intègrent des fichiers qui n'existent pas sont répertoriées dans [[:$1]].",
+'wantedfiletext-nocat' => "Les fichiers suivants sont utilisés, mais n'existent pas. Les fichiers d'autres dépôts peuvent être listés malgré qu'ils existent. Tous ces faux positifs seront <del>barrés</del>.",
 'wantedtemplates' => 'Modèles demandés',
 'mostlinked' => 'Pages les plus liées',
 'mostlinkedcategories' => 'Catégories les plus utilisées',
@@ -2188,32 +2201,32 @@ Les entrées <del>barrées</del> ont été résolues.',
 'shortpages' => 'Pages courtes',
 'longpages' => 'Pages longues',
 'deadendpages' => 'Pages en impasse',
-'deadendpagestext' => 'Les pages suivantes ne contiennent aucun lien vers d’autres pages du wiki.',
+'deadendpagestext' => "Les pages suivantes ne contiennent aucun lien vers d'autres pages du wiki.",
 'protectedpages' => 'Pages protégées',
 'protectedpages-indef' => 'Uniquement les protections permanentes',
 'protectedpages-cascade' => 'Uniquement les protections en cascade',
 'protectedpagestext' => 'Les pages suivantes sont protégées contre les modifications ou le déplacement.',
-'protectedpagesempty' => 'Aucune page n’est protégée de cette façon.',
+'protectedpagesempty' => "Aucune page n'est protégée de cette façon.",
 'protectedtitles' => 'Titres protégés',
 'protectedtitlestext' => 'Les titres suivants sont protégés à la création',
-'protectedtitlesempty' => 'Aucun titre n’est actuellement protégé avec ces paramètres.',
+'protectedtitlesempty' => "Aucun titre n'est actuellement protégé avec ces paramètres.",
 'listusers' => 'Liste des utilisateurs',
 'listusers-editsonly' => 'Ne montrer que les utilisateurs ayant au moins une contribution',
 'listusers-creationsort' => 'Trier par date de création',
 'usereditcount' => '$1 modification{{PLURAL:$1||s}}',
 'usercreated' => '{{GENDER:$3|Créé}} le $1 à $2',
 'newpages' => 'Nouvelles pages',
-'newpages-username' => 'Nom d’utilisateur :',
+'newpages-username' => "Nom d'utilisateur :",
 'ancientpages' => 'Pages les plus anciennement modifiées',
 'move' => 'Renommer',
 'movethispage' => 'Renommer cette page',
-'unusedimagestext' => 'Les fichiers suivants existent, mais ne sont inclus dans aucune page.
-Veuillez noter que d’autres sites peuvent avoir un lien direct vers un fichier, et donc qu’un fichier peut être listé ici alors qu’il est en réalité utilisé sur ces sites.',
+'unusedimagestext' => "Les fichiers suivants existent, mais ne sont inclus dans aucune page.
+Veuillez noter que d'autres sites peuvent avoir un lien direct vers un fichier, et donc qu'un fichier peut être listé ici alors qu'il est en réalité utilisé sur ces sites.",
 'unusedcategoriestext' => 'Les catégories suivantes existent mais aucune page ou catégorie ne les utilise.',
 'notargettitle' => 'Pas de cible',
-'notargettext' => 'Vous n’avez pas indiqué une page ou un utilisateur sur lequel vous souhaitez effectuer cette action.',
+'notargettext' => "Vous n'avez pas indiqué une page ou un utilisateur sur lequel vous souhaitez effectuer cette action.",
 'nopagetitle' => 'Aucune telle page cible',
-'nopagetext' => 'La page cible que vous avez indiquée n’existe pas.',
+'nopagetext' => "La page cible que vous avez indiquée n'existe pas.",
 'pager-newer-n' => '{{PLURAL:$1|plus récente|$1 plus récentes}}',
 'pager-older-n' => '{{PLURAL:$1|plus ancienne|$1 plus anciennes}}',
 'suppress' => 'Superviser',
@@ -2224,16 +2237,16 @@ Veuillez noter que d’autres sites peuvent avoir un lien direct vers un fichier
 'booksources-search-legend' => 'Rechercher parmi des ouvrages de référence',
 'booksources-isbn' => 'ISBN :',
 'booksources-go' => 'Lister',
-'booksources-text' => 'Voici une liste indicative et non exclusive de liens vers d’autres sites vendant des livres neufs et d’occasion et sur lesquels vous trouverez peut-être des informations sur les ouvrages que vous cherchez :',
-'booksources-invalid-isbn' => 'L’ISBN donné ne semble pas être correct ; vérifiez si vous avez fait une erreur en copiant la source originale.',
+'booksources-text' => "Voici une liste indicative et non exclusive de liens vers d'autres sites vendant des livres neufs et d'occasion et sur lesquels vous trouverez peut-être des informations sur les ouvrages que vous cherchez :",
+'booksources-invalid-isbn' => "L'ISBN donné ne semble pas être correct ; vérifiez si vous avez fait une erreur en copiant la source originale.",
 
 # Special:Log
 'specialloguserlabel' => 'Auteur :',
 'speciallogtitlelabel' => 'Cible (titre ou utilisateur):',
-'log' => 'Journaux d’opérations',
+'log' => "Journaux d'opérations",
 'all-logs-page' => 'Tous les journaux publics',
-'alllogstext' => 'Affichage combiné de tous les journaux disponibles sur {{SITENAME}}.<br />
-Vous pouvez personnaliser l’affichage en sélectionnant le type de journal, le nom d’utilisateur ou la page concernée (ces deux derniers étant sensibles à la casse).',
+'alllogstext' => "Affichage combiné de tous les journaux disponibles sur {{SITENAME}}.<br />
+Vous pouvez personnaliser l'affichage en sélectionnant le type de journal, le nom d'utilisateur ou la page concernée (ces deux derniers étant sensibles à la casse).",
 'logempty' => 'Aucune opération correspondante dans les journaux.',
 'log-title-wildcard' => 'Chercher parmi les titres commençant par ce texte',
 'showhideselectedlogentries' => 'Afficher/masquer les entrées de journal sélectionnées',
@@ -2244,16 +2257,16 @@ Vous pouvez personnaliser l’affichage en sélectionnant le type de journal, le
 'nextpage' => 'Page suivante ($1)',
 'prevpage' => 'Page précédente ($1)',
 'allpagesfrom' => 'Afficher les pages à partir de :',
-'allpagesto' => 'Afficher les pages jusqu’à :',
+'allpagesto' => "Afficher les pages jusqu'à :",
 'allarticles' => 'Toutes les pages',
-'allinnamespace' => 'Toutes les pages (dans l’espace de noms $1)',
-'allnotinnamespace' => 'Toutes les pages (hors de l’espace de noms $1)',
+'allinnamespace' => "Toutes les pages (dans l'espace de noms $1)",
+'allnotinnamespace' => "Toutes les pages (hors de l'espace de noms $1)",
 'allpagesprev' => 'Précédent',
 'allpagesnext' => 'Suivant',
 'allpagessubmit' => 'Lister',
-'allpagesprefix' => 'Afficher les pages commençant par le préfixe :',
+'allpagesprefix' => 'Afficher les pages commençant par :',
 'allpagesbadtitle' => 'Le titre de page indiqué est incorrect : il contient un préfixe inter-langue ou inter-wiki réservé, ou contient un ou plusieurs caractères inutilisables dans les titres.',
-'allpages-bad-ns' => '{{SITENAME}} n’a pas d’espace de noms « $1 ».',
+'allpages-bad-ns' => "{{SITENAME}} n'a pas d'espace de noms « $1 ».",
 'allpages-hide-redirects' => 'Masquer les redirections',
 
 # SpecialCachedPage
@@ -2267,7 +2280,7 @@ Vous pouvez personnaliser l’affichage en sélectionnant le type de journal, le
 [[Special:UnusedCategories|Les catégories inutilisées]] ne sont pas affichées ici.
 Voyez aussi [[Special:WantedCategories|les catégories demandées]].',
 'categoriesfrom' => 'Afficher les catégories à partir de :',
-'special-categories-sort-count' => 'tri par nombre d’éléments',
+'special-categories-sort-count' => "tri par nombre d'éléments",
 'special-categories-sort-abc' => 'tri alphabétique',
 
 # Special:DeletedContributions
@@ -2280,11 +2293,11 @@ Voyez aussi [[Special:WantedCategories|les catégories demandées]].',
 'linksearch-pat' => 'Expression recherchée :',
 'linksearch-ns' => 'Espace de noms :',
 'linksearch-ok' => 'Rechercher',
-'linksearch-text' => 'Des caractères jokers comme « *.wikipedia.org » peuvent être utilisés.
+'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 : <code>$1</code> (n’ajoutez aucun de ceux-ci dans votre recherche).',
+Protocoles reconnus : <code>$1</code> (http:// par défaut si aucun protocole n'est indiqué).",
 '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.',
+'linksearch-error' => "Les caractères jokers ne peuvent être utilisés qu'au début du nom de domaine de l'hôte.",
 
 # Special:ListUsers
 'listusersfrom' => 'Afficher les utilisateurs à partir de :',
@@ -2303,12 +2316,12 @@ Protocoles reconnus : <code>$1</code> (n’ajoutez aucun de ceux-ci dans votre r
 
 # Special:Log/newusers
 'newuserlogpage' => 'Journal des créations de comptes utilisateur',
-'newuserlogpagetext' => 'Cette page affiche l’historique des créations de comptes utilisateur.',
+'newuserlogpagetext' => "Cette page affiche l'historique des créations de comptes utilisateur.",
 
 # Special:ListGroupRights
-'listgrouprights' => 'Droits des groupes d’utilisateurs',
-'listgrouprights-summary' => 'Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d’accès qui leur sont associés.
-Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuvent exister au sujet des droits individuels.',
+'listgrouprights' => "Droits des groupes d'utilisateurs",
+'listgrouprights-summary' => "Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d'accès qui leur sont associés.
+Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuvent exister au sujet des droits individuels.",
 'listgrouprights-key' => '*<span class="listgrouprights-granted">Droit octroyé</span>
 *<span class="listgrouprights-revoked">Droit révoqué</span>',
 'listgrouprights-group' => 'Groupe',
@@ -2319,31 +2332,31 @@ Des [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuve
 'listgrouprights-removegroup' => 'Retirer des membres {{PLURAL:$2|du groupe|des groupes}} : $1',
 'listgrouprights-addgroup-all' => 'Ajouter des membres à tous les groupes',
 'listgrouprights-removegroup-all' => 'Retirer des membres de tous les groupes',
-'listgrouprights-addgroup-self' => 'Peut s’ajouter {{PLURAL:$2|le groupe|les groupes}} à son propre compte : $1',
+'listgrouprights-addgroup-self' => "Peut s'ajouter {{PLURAL:$2|le groupe|les groupes}} à son propre compte : $1",
 'listgrouprights-removegroup-self' => 'Peut se retirer {{PLURAL:$2|le groupe|les groupes}} de son propre compte : $1',
-'listgrouprights-addgroup-self-all' => 'Peut s’ajouter tous les groupes à son propre compte',
+'listgrouprights-addgroup-self-all' => "Peut s'ajouter tous les groupes à son propre compte",
 'listgrouprights-removegroup-self-all' => 'Peut se retirer tous les groupes de son propre compte',
 
 # E-mail user
-'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.',
+'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.',
-'usermailererror' => 'Erreur dans l’objet du courriel :',
-'defemailsubject' => '{{SITENAME}} Courriel de l’utilisateur « $1 »',
-'usermaildisabled' => 'L’envoi de courriels entre utilisateurs est désactivé',
-'usermaildisabledtext' => 'Vous ne pouvez pas envoyer de courriels à d’autres utilisateurs sur ce wiki',
+'emailuser-title-notarget' => "Envoyer un courriel à l'utilisateur",
+'emailpage' => "Envoyer un courriel à l'utilisateur",
+'emailpagetext' => "Vous pouvez utiliser le formulaire ci-dessous pour envoyer un courriel à {{GENDER:$1|cet utilisateur|cette utilisatrice}}.
+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.",
+'usermailererror' => "Erreur dans l'objet du courriel :",
+'defemailsubject' => "{{SITENAME}} Courriel de l'utilisateur « $1 »",
+'usermaildisabled' => "L'envoi de courriels entre utilisateurs est désactivé",
+'usermaildisabledtext' => "Vous ne pouvez pas envoyer de courriels à d'autres utilisateurs sur ce wiki",
 'noemailtitle' => 'Aucune adresse de courriel',
-'noemailtext' => 'Cet utilisateur n’a pas spécifié une adresse de courriel valide.',
+'noemailtext' => "Cet utilisateur n'a pas spécifié une adresse de courriel valide.",
 'nowikiemailtitle' => 'Pas de courriel autorisé',
-'nowikiemailtext' => 'Cet utilisateur a choisi de ne pas recevoir de courriel de la part d’autres utilisateurs.',
+'nowikiemailtext' => "Cet utilisateur a choisi de ne pas recevoir de courriel de la part d'autres utilisateurs.",
 'emailnotarget' => "Nom d'utilisateur du destinataire inexistant ou invalide.",
 'emailtarget' => "Entrez le nom d'utilisateur du destinataire",
-'emailusername' => "Nom de l'utilisateur :",
+'emailusername' => "Nom d'utilisateur :",
 'emailusernamesubmit' => 'Soumettre',
 'email-legend' => 'Envoyer un courriel à un autre utilisateur de {{SITENAME}}',
 'emailfrom' => 'De :',
@@ -2351,11 +2364,11 @@ L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos
 'emailsubject' => 'Objet :',
 'emailmessage' => 'Message :',
 'emailsend' => 'Envoyer',
-'emailccme' => 'M’envoyer par courriel une copie de mon message.',
+'emailccme' => "M'envoyer par courriel une copie de mon message.",
 'emailccsubject' => 'Copie de votre message à $1 : $2',
 'emailsent' => 'Courriel envoyé',
 'emailsenttext' => 'Votre message a été envoyé par courriel.',
-'emailuserfooter' => 'Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l’utilisateur » de {{SITENAME}}.',
+'emailuserfooter' => "Ce courriel a été envoyé par « $1 » à « $2 » par la fonction « Envoyer un courriel à l'utilisateur » de {{SITENAME}}.",
 
 # User Messenger
 'usermessage-summary' => 'A laissé un message système.',
@@ -2377,16 +2390,16 @@ L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos
 'watchthispage' => 'Suivre cette page',
 'unwatch' => 'Ne plus suivre',
 'unwatchthispage' => 'Ne plus suivre',
-'notanarticle' => 'Ce n’est pas une page de contenu',
+'notanarticle' => "Ce n'est pas une page de contenu",
 'notvisiblerev' => 'La version a été supprimée',
-'watchnochange' => 'Aucun des éléments que vous suivez n’a été modifié durant la période affichée.',
+'watchnochange' => "Aucun des éléments que vous suivez n'a été modifié durant la période affichée.",
 'watchlist-details' => 'Votre liste de suivi référence $1 page{{PLURAL:$1||s}}, sans compter les pages de discussion.',
 'wlheader-enotif' => '* La notification par courriel est activée.',
 'wlheader-showupdated' => "* Les pages qui ont été modifiées depuis votre dernière visite sont affichées en '''gras'''.",
 'watchmethod-recent' => 'vérification des modifications récentes pour y trouver des pages suivies',
 'watchmethod-list' => 'vérification des pages suivies pour y trouver des modifications récentes',
 'watchlistcontains' => 'Votre liste de suivi référence $1 page{{PLURAL:$1||s}}.',
-'iteminvalidname' => 'Problème avec l’élément « $1 » : le nom est invalide.',
+'iteminvalidname' => "Problème avec l'élément « $1 » : le nom est invalide.",
 'wlnote' => "Ci-dessous {{PLURAL:$1|figure la dernière modification effectuée|figurent les '''$1''' dernières modifications effectuées}} durant {{PLURAL:$2|la dernière heure|les '''$2''' dernières heures}}, depuis $3, $4.",
 'wlshowlast' => 'Montrer les dernières $1 heures, les derniers $2 jours ou bien $3',
 'watchlist-options' => 'Options de la liste de suivi',
@@ -2398,19 +2411,23 @@ L’adresse électronique que vous avez indiquée dans [[Special:Preferences|vos
 
 'enotif_mailer' => 'Système de notification par courriel de {{SITENAME}}',
 'enotif_reset' => 'Marquer toutes les pages comme visitées',
-'enotif_newpagetext' => 'Ceci est une nouvelle page.',
 'enotif_impersonal_salutation' => 'Utilisateur de {{SITENAME}}',
-'changed' => 'modifiée',
-'created' => 'créée',
-'enotif_subject' => 'La page $PAGETITLE de {{SITENAME}} a été $CHANGEDORCREATED par $PAGEEDITOR',
+'enotif_subject_deleted' => 'La page $1 sur {{SITENAME}} a été supprimée par {{GENDER:$2|$2}}',
+'enotif_subject_created' => 'La page $1 sur {{SITENAME}} a été créée par {{GENDER:$2|$2}}',
+'enotif_subject_moved' => 'La page $1 sur {{SITENAME}} a été renommée par {{GENDER:$2|$2}}',
+'enotif_subject_restored' => 'La page $1 sur {{SITENAME}} a été restaurée par {{GENDER:$2|$2}}',
+'enotif_subject_changed' => 'La page $1 sur {{SITENAME}} a été modifiée par {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'La page $1 sur {{SITENAME}} a été effacée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
+'enotif_body_intro_created' => 'La page $1 sur {{SITENAME}} a été créée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
+'enotif_body_intro_moved' => 'La page $1 sur {{SITENAME}} a été renommée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
+'enotif_body_intro_restored' => 'La page $1 sur {{SITENAME}} a été restaurée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
+'enotif_body_intro_changed' => 'La page $1 sur {{SITENAME}} a été modifiée le $PAGEEDITDATE par {{GENDER:$2|$2}}, voir $3 pour la révision actuelle.',
 'enotif_lastvisited' => 'Voyez $1 pour tous les changements depuis votre dernière visite.',
 'enotif_lastdiff' => 'Voyez $1 pour visualiser ces changements.',
 'enotif_anon_editor' => 'utilisateur non-enregistré $1',
 'enotif_body' => 'Cher $WATCHINGUSERNAME,
 
-La page « $PAGETITLE » de {{SITENAME}} a été $CHANGEDORCREATED le $PAGEEDITDATE par « $PAGEEDITOR », visitez $PAGETITLE_URL pour visualiser la version actuelle.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Résumé du contributeur : $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2418,8 +2435,7 @@ Contactez ce contributeur :
 courriel : $PAGEEDITOR_EMAIL
 wiki : $PAGEEDITOR_WIKI
 
-Il n’y aura pas d’autres notifications en cas de changements ultérieurs, à moins que vous ne visitiez cette page.
-Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pages de votre liste de suivi.
+Il n\'y aura pas d\'autres notifications en cas de changements ultérieurs, à moins que vous ne visitiez cette page. Vous pouvez aussi réinitialiser les drapeaux de notification pour toutes les pages de votre liste de suivi.
 
              Votre système de notification de {{SITENAME}}
 
@@ -2446,9 +2462,9 @@ Retour et assistance :
 'delete-confirm' => 'Supprimer « $1 »',
 'delete-legend' => 'Supprimer',
 'historywarning' => "'''Attention :''' la page que vous êtes sur le point de supprimer a un historique avec environ $1 {{PLURAL:$1|version|versions}} :",
-'confirmdeletetext' => 'Vous êtes sur le point de supprimer une page ou un fichier, ainsi que toutes ses versions antérieures historisées. Veuillez confirmer que c’est bien là ce que vous voulez faire, que vous en comprenez les conséquences et que vous faites ceci en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].',
+'confirmdeletetext' => "Vous êtes sur le point de supprimer une page ou un fichier, ainsi que toutes ses versions antérieures historisées. Veuillez confirmer que c'est bien là ce que vous voulez faire, que vous en comprenez les conséquences et que vous faites ceci en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].",
 'actioncomplete' => 'Action effectuée',
-'actionfailed' => 'L’action a échoué',
+'actionfailed' => "L'action a échoué",
 'deletedtext' => '« $1 » a été supprimée.
 Voir $2 pour une liste des suppressions récentes.',
 'dellogpage' => 'Journal des suppressions de page',
@@ -2458,16 +2474,16 @@ Voir $2 pour une liste des suppressions récentes.',
 'deletecomment' => 'Motif :',
 'deleteotherreason' => 'Motif autre ou supplémentaire :',
 'deletereasonotherlist' => 'Autre motif',
-'deletereason-dropdown' => '* Motifs de suppression les plus courants
-** Demande de lauteur
-** Violation des droits dauteur
-** Vandalisme',
+'deletereason-dropdown' => "* Motifs de suppression les plus courants
+** Demande de l'auteur
+** Violation des droits d'auteur
+** Vandalisme",
 'delete-edit-reasonlist' => 'Modifier les motifs de suppression de page',
 'delete-toobig' => 'Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.
 La suppression de telles pages a été restreinte pour prévenir des perturbations accidentelles de {{SITENAME}}.',
-'delete-warning-toobig' => 'Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.
+'delete-warning-toobig' => "Cette page possède un historique important de modifications, dépassant $1 version{{PLURAL:$1||s}}.
 La supprimer peut perturber le fonctionnement de la base de données de {{SITENAME}} ;
-veuiller ne procéder qu’avec prudence.',
+veuiller ne procéder qu'avec prudence.",
 
 # Rollback
 'rollback' => 'Révoquer les modifications',
@@ -2478,21 +2494,21 @@ veuiller ne procéder qu’avec prudence.',
 'rollbackfailed' => 'La révocation a échoué',
 'cantrollback' => 'Impossible de révoquer la modification ;
 le dernier contributeur est le seul auteur de cette page.',
-'alreadyrolled' => 'Impossible de révoquer la dernière modification de la page « [[:$1]] » effectuée par [[User:$2|$2]] ([[User talk:$2|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;
-quelqu’un d’autre a déjà modifié ou révoqué la page.
+'alreadyrolled' => "Impossible de révoquer la dernière modification de la page « [[:$1]] » effectuée par [[User:$2|$2]] ([[User talk:$2|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ;
+quelqu'un d'autre a déjà modifié ou révoqué la page.
 
-La dernière modification de la page a été effectuée par [[User:$3|$3]] ([[User talk:$3|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+La dernière modification de la page a été effectuée par [[User:$3|$3]] ([[User talk:$3|Discuter]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
 'editcomment' => "Le résumé de la modification était : « ''$1'' ».",
 'revertpage' => 'Révocation des modifications de [[Special:Contributions/$2|$2]] ([[User talk:$2|discussion]]) vers la dernière version de [[User:$1|$1]]',
-'revertpage-nouser' => 'Révocation des modifications par (nom d’utilisateur supprimé) à la dernière version par [[User:$1|$1]]',
+'revertpage-nouser' => "Révocation des modifications par (nom d'utilisateur supprimé) à la dernière version par [[User:$1|$1]]",
 'rollback-success' => 'Révocation des modifications effectuées par $1 ;
 rétablissement de la dernière version par $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Erreur de session',
-'sessionfailure' => 'Votre session de connexion semble avoir des problèmes ;
-cette action a été annulée en prévention dun piratage de session.
-Veuillez cliquer sur « Précédent », rechargez la page d’où vous venez, puis réessayez.',
+'sessionfailure' => "Votre session de connexion semble avoir des problèmes ;
+cette action a été annulée en prévention d'un piratage de session.
+Veuillez cliquer sur « Précédent », rechargez la page d'où vous venez, puis réessayez.",
 
 # Protect
 'protectlogpage' => 'Journal des protections',
@@ -2509,18 +2525,18 @@ Consultez la [[Special:ProtectedPages|liste des pages protégées]] pour la list
 'protect-badnamespace-text' => 'Les pages dans cet espace de noms ne peuvent pas être protégées.',
 'protect-legend' => 'Confirmer la protection',
 'protectcomment' => 'Motif :',
-'protectexpiry' => 'Date d’expiration :',
-'protect_expiry_invalid' => 'La date d’expiration est invalide.',
-'protect_expiry_old' => 'La date d’expiration est déjà passée.',
-'protect-unchain-permissions' => 'Déverrouiller davantage d’options de protection',
+'protectexpiry' => "Date d'expiration :",
+'protect_expiry_invalid' => "La date d'expiration est invalide.",
+'protect_expiry_old' => "La date d'expiration est déjà passée.",
+'protect-unchain-permissions' => "Déverrouiller davantage d'options de protection",
 'protect-text' => "Vous pouvez consulter et modifier le niveau de protection de la page '''$1'''.",
 'protect-locked-blocked' => "Vous ne pouvez pas modifier les niveaux de protection tant que vous êtes bloqué{{GENDER:||e|(e)}}.
 Voici les réglages actuels de la page '''$1''' :",
 'protect-locked-dblock' => "Le niveau de protection ne peut pas être modifié car la base de données est verrouillée.
 Voici les réglages actuels de la page '''$1''' :",
-'protect-locked-access' => "Vous navez pas les droits nécessaires pour modifier les niveaux de protection de pages.
+'protect-locked-access' => "Vous n'avez pas les droits nécessaires pour modifier les niveaux de protection de pages.
 Voici les réglages actuels de la page '''$1''' :",
-'protect-cascadeon' => 'Cette page est protégée car incluse dans {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l’option « protection en cascade » activée. Vous pouvez changer le niveau de protection de cette page sans que cela n’affecte la protection en cascade.',
+'protect-cascadeon' => "Cette page est protégée car incluse dans {{PLURAL:$1|la page suivante, qui a été protégée|les pages suivantes, qui ont été protégées}} avec l'option « protection en cascade » activée. Vous pouvez changer le niveau de protection de cette page sans que cela n'affecte la protection en cascade.",
 'protect-default' => 'Autoriser tous les utilisateurs',
 'protect-fallback' => 'Nécessite la permission « $1 »',
 'protect-level-autoconfirmed' => 'Bloquer les nouveaux utilisateurs et les utilisateurs anonymes',
@@ -2530,10 +2546,10 @@ Voici les réglages actuels de la page '''$1''' :",
 'protect-expiring-local' => 'expire le $1',
 'protect-expiry-indefinite' => 'infini',
 'protect-cascade' => 'Protéger les pages incluses dans celle-ci (protection en cascade)',
-'protect-cantedit' => 'Vous ne pouvez pas changer les niveaux de protection de cette page car vous n’avez pas la permission de la modifier.',
-'protect-othertime' => 'Autre date d’expiration :',
-'protect-othertime-op' => 'autre date d’expiration',
-'protect-existing-expiry' => 'Date d’expiration existante : $2 à $3',
+'protect-cantedit' => "Vous ne pouvez pas changer les niveaux de protection de cette page car vous n'avez pas la permission de la modifier.",
+'protect-othertime' => "Autre date d'expiration :",
+'protect-othertime-op' => "autre date d'expiration",
+'protect-existing-expiry' => "Date d'expiration existante : $2 à $3",
 'protect-otherreason' => 'Motif autre ou supplémentaire :',
 'protect-otherreason-op' => 'Autre motif',
 'protect-dropdown' => '* Motifs de protection courants
@@ -2565,22 +2581,22 @@ Voici les réglages actuels de la page '''$1''' :",
 'undeletepage' => 'Voir et restaurer des pages supprimées',
 'undeletepagetitle' => "'''La liste suivante contient des versions supprimées de [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Voir les pages supprimées',
-'undeletepagetext' => '{{PLURAL:$1|La page suivante a été supprimée et se trouve|Les pages suivantes ont été supprimées et se trouvent}} dans la base de données archive, d’où {{PLURAL:$1|elle peut|elles peuvent}} encore être restaurée{{PLURAL:$1||s}}.
-L’archive peut être nettoyée périodiquement.',
+'undeletepagetext' => "{{PLURAL:$1|La page suivante a été supprimée et se trouve|Les pages suivantes ont été supprimées et se trouvent}} dans la base de données archive, d'où {{PLURAL:$1|elle peut|elles peuvent}} encore être restaurée{{PLURAL:$1||s}}.
+L'archive peut être nettoyée périodiquement.",
 'undelete-fieldset-title' => 'Restaurer les versions',
-'undeleteextrahelp' => "Pour restaurer lhistorique complet de cette page, laissez toutes les cases décochées et cliquez sur '''''Restaurer'''''.
+'undeleteextrahelp' => "Pour restaurer l'historique complet de cette page, laissez toutes les cases décochées et cliquez sur '''''Restaurer'''''.
 Pour effectuer une restauration partielle, cochez les cases correspondant aux versions à rétablir, puis cliquez sur '''''Restaurer'''''.",
 'undeleterevisions' => '$1 {{PLURAL:$1|version archivée|versions archivées}}',
-'undeletehistory' => 'Si vous restaurez la page, toutes les versions seront replacées dans l’historique.
-Si une nouvelle page avec le même nom a été créée depuis la suppression, les versions restaurées apparaîtront dans l’historique antérieur et la version courante ne sera pas automatiquement remplacée.',
+'undeletehistory' => "Si vous restaurez la page, toutes les versions seront replacées dans l'historique.
+Si une nouvelle page avec le même nom a été créée depuis la suppression, les versions restaurées apparaîtront dans l'historique antérieur et la version courante ne sera pas automatiquement remplacée.",
 'undeleterevdel' => 'La restauration ne sera pas effectuée si, au final, la version la plus récente de la page ou du fichier reste partiellement supprimée.
 Dans de tels cas, vous devez décocher ou démasquer les versions effacées les plus récentes (en tête de liste).',
-'undeletehistorynoadmin' => 'Cette page a été supprimée.
-Le motif de la suppression est indiqué dans le résumé ci-dessous, avec les détails des utilisateurs qui lont modifié avant sa suppression.
-Le contenu effectif de ces versions supprimées n’est accessible qu’aux administrateurs.',
+'undeletehistorynoadmin' => "Cette page a été supprimée.
+Le motif de la suppression est indiqué dans le résumé ci-dessous, avec les détails des utilisateurs qui l'ont modifié avant sa suppression.
+Le contenu effectif de ces versions supprimées n'est accessible qu'aux administrateurs.",
 'undelete-revision' => 'Version supprimée de $1 (version du $4 à $5) par $3 :',
-'undeleterevision-missing' => 'Version incorrecte ou manquante.
-Vous avez peut-être un mauvais lien, ou la version a pu être restaurée ou supprimée de l’archive.',
+'undeleterevision-missing' => "Version incorrecte ou manquante.
+Vous avez peut-être un mauvais lien, ou la version a pu être restaurée ou supprimée de l'archive.",
 'undelete-nodiff' => 'Aucune version précédente trouvée.',
 'undeletebtn' => 'Restaurer',
 'undeletelink' => 'visualiser/rétablir',
@@ -2591,8 +2607,8 @@ Vous avez peut-être un mauvais lien, ou la version a pu être restaurée ou sup
 'undeletedrevisions' => '$1 {{PLURAL:$1|version restaurée|versions restaurées}}',
 'undeletedrevisions-files' => '$1 version{{PLURAL:$1||s}} et $2 fichier{{PLURAL:$2||s}} restauré{{PLURAL:$2||s}}',
 'undeletedfiles' => '$1 {{PLURAL:$1|fichier restauré|fichiers restaurés}}',
-'cannotundelete' => 'La restauration a échoué ;
-un autre utilisateur a probablement déjà restauré la page.',
+'cannotundelete' => 'Échec de la restauration:
+$1',
 'undeletedpage' => "'''La page $1 a été restaurée.'''
 
 Consultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la liste des récentes suppressions et restaurations.",
@@ -2601,12 +2617,12 @@ Consultez le [[Special:Log/delete|journal des suppressions]] pour obtenir la lis
 'undelete-search-box' => 'Rechercher des pages supprimées',
 'undelete-search-prefix' => 'Montrer les pages commençant par :',
 'undelete-search-submit' => 'Rechercher',
-'undelete-no-results' => 'Aucune page correspondante n’a été trouvée dans les archives de suppression.',
+'undelete-no-results' => "Aucune page correspondante n'a été trouvée dans les archives de suppression.",
 'undelete-filename-mismatch' => 'Impossible de restaurer la version du fichier datée du $1 : le nom de fichier ne correspond pas.',
 'undelete-bad-store-key' => 'Impossible de restaurer la version du fichier datée du $1 : le fichier était absent avant la suppression.',
-'undelete-cleanup-error' => 'Erreur lors de la suppression du fichier d’archive inutilisé « $1 ».',
-'undelete-missing-filearchive' => 'Impossible de restaurer le fichier d’archive avec l’identifiant $1 parce qu’il n’est pas dans la base de données.
-Il a peut-être déjà été restauré.',
+'undelete-cleanup-error' => "Erreur lors de la suppression du fichier d'archive inutilisé « $1 ».",
+'undelete-missing-filearchive' => "Impossible de restaurer le fichier d'archive avec l'identifiant $1 parce qu'il n'est pas dans la base de données.
+Il a peut-être déjà été restauré.",
 'undelete-error' => "Page d'erreur d'annulation",
 'undelete-error-short' => 'Erreur lors de la restauration du fichier : $1',
 'undelete-error-long' => 'Des erreurs ont été rencontrées lors de la restauration du fichier :
@@ -2624,14 +2640,14 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contributions de l’utilisateur',
-'contributions-title' => 'Liste des contributions de l’utilisateur $1',
+'contributions' => "Contributions de l'{{GENDER:$1|utilisateur|utilisatrice}}",
+'contributions-title' => "Liste des contributions de l'utilisateur $1",
 'mycontris' => 'Contributions',
 'contribsub2' => 'Pour $1 ($2)',
-'nocontribs' => 'Aucune modification correspondant à ces critères n’a été trouvée.',
+'nocontribs' => "Aucune modification correspondant à ces critères n'a été trouvée.",
 'uctop' => '(dernière)',
 'month' => 'À partir du mois (et précédents) :',
-'year' => 'À partir de l’année (et précédentes) :',
+'year' => "À partir de l'année (et précédentes) :",
 
 'sp-contributions-newbies' => 'Ne montrer que les contributions des nouveaux utilisateurs',
 'sp-contributions-newbies-sub' => 'Parmi les nouveaux comptes',
@@ -2647,7 +2663,7 @@ $1',
 La dernière entrée du journal des blocages est indiquée ci-dessous à titre d’information :',
 'sp-contributions-search' => 'Rechercher les contributions',
 'sp-contributions-username' => 'Adresse IP ou nom d’utilisateur :',
-'sp-contributions-toponly' => 'Ne montrer que les articles dont je suis le dernier contributeur',
+'sp-contributions-toponly' => 'Ne montrer que les contributions qui sont les dernières des articles',
 'sp-contributions-submit' => 'Rechercher',
 
 # What links here
@@ -2672,14 +2688,14 @@ La dernière entrée du journal des blocages est indiquée ci-dessous à titre d
 # Block/unblock
 'autoblockid' => 'Blocage automatique #$1',
 'block' => 'Bloquer l’utilisateur',
-'unblock' => 'Débloquer l’utilisateur',
+'unblock' => "Débloquer l'utilisateur",
 'blockip' => 'Bloquer l’utilisateur',
 'blockip-title' => 'Bloquer l’utilisateur',
 'blockip-legend' => 'Bloquer l’utilisateur',
 'blockiptext' => 'Utilisez le formulaire ci-dessous pour bloquer l’accès aux modifications faites à partir d’une adresse IP spécifique ou d’un nom d’utilisateur.
 Une telle mesure ne devrait être prise que pour prévenir le vandalisme et en accord avec les [[{{MediaWiki:Policy-url}}|règles internes]].
 Donnez ci-dessous un motif précis (par exemple en citant les pages qui ont été vandalisées).',
-'ipadressorusername' => 'Adresse IP ou nom d’utilisateur :',
+'ipadressorusername' => "Adresse IP ou nom d'utilisateur :",
 'ipbexpiry' => 'Durée avant expiration :',
 'ipbreason' => 'Motif :',
 'ipbreasonotherlist' => 'Autre motif',
@@ -2717,7 +2733,7 @@ Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.'
 'ipb-blocklist' => 'Voir les blocages existants',
 'ipb-blocklist-contribs' => 'Contributions pour $1',
 'unblockip' => 'Débloquer un utilisateur ou une adresse IP',
-'unblockiptext' => 'Utilisez le formulaire ci-dessous pour rétablir l’accès aux modifications depuis une adresse IP ou un nom d’utilisateur.',
+'unblockiptext' => "Utilisez le formulaire ci-dessous pour rétablir l'accès aux modifications depuis une adresse IP ou un nom d'utilisateur.",
 'ipusubmit' => 'Supprimer ce blocage',
 'unblocked' => '[[User:$1|$1]] a été débloqué',
 'unblocked-range' => '$1 a été débloqué',
@@ -2727,11 +2743,11 @@ Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.'
 'ipblocklist-legend' => 'Chercher un utilisateur bloqué',
 'blocklist-userblocks' => 'Masquer les blocages de comptes',
 'blocklist-tempblocks' => 'Masquer les blocages temporaires',
-'blocklist-addressblocks' => 'Masquer les blocages d’adresses IP uniques',
+'blocklist-addressblocks' => "Masquer les blocages d'adresses IP uniques",
 'blocklist-rangeblocks' => 'Masquer les blocs de portée',
 'blocklist-timestamp' => 'Date et heure',
 'blocklist-target' => 'Cible',
-'blocklist-expiry' => 'Date d’expiration',
+'blocklist-expiry' => "Date d'expiration",
 'blocklist-by' => 'Administrateur ayant effectué le blocage',
 'blocklist-params' => 'Paramètres de blocage',
 'blocklist-reason' => 'Motif',
@@ -2746,7 +2762,7 @@ Consultez la [[Special:BlockList|liste des blocages]] pour revoir les blocages.'
 'emailblock' => 'courriel bloqué',
 'blocklist-nousertalk' => 'ne peut modifier sa propre page de discussion',
 'ipblocklist-empty' => 'La liste des adresses IP bloquées est actuellement vide.',
-'ipblocklist-no-results' => 'L’adresse IP ou l’utilisateur demandé n’est pas bloqué.',
+'ipblocklist-no-results' => "L'adresse IP ou l'utilisateur demandé n'est pas bloqué.",
 'blocklink' => 'bloquer',
 'unblocklink' => 'débloquer',
 'change-blocklink' => 'modifier le blocage',
@@ -2759,9 +2775,9 @@ Le motif fourni pour le blocage de $1 est : « $2 ».',
 'blocklog-showsuppresslog' => 'Cet utilisateur a été bloqué et caché précédemment. Le journal des suppressions est disponible ci-dessous :',
 'blocklogentry' => 'a bloqué [[$1]] ; expiration : $2 $3',
 'reblock-logentry' => 'a modifié les paramètres du blocage de [[$1]] avec une expiration au $2 $3',
-'blocklogtext' => 'Ceci est le journal des actions de blocages et déblocages d’utilisateurs.
+'blocklogtext' => "Ceci est le journal des actions de blocages et déblocages d'utilisateurs.
 Les adresses IP automatiquement bloquées ne sont pas listées.
-Consultez la [[Special:BlockList|liste des blocages]] pour voir les bannissements et blocages effectivement en cours.',
+Consultez la [[Special:BlockList|liste des blocages]] pour voir les bannissements et blocages effectivement en cours.",
 'unblocklogentry' => 'a débloqué $1',
 'block-log-flags-anononly' => 'utilisateurs anonymes seulement',
 'block-log-flags-nocreate' => 'création de compte interdite',
@@ -2769,75 +2785,75 @@ Consultez la [[Special:BlockList|liste des blocages]] pour voir les bannissement
 'block-log-flags-noemail' => 'envoi de courriel interdit',
 'block-log-flags-nousertalk' => 'ne peut modifier sa propre page de discussion',
 'block-log-flags-angry-autoblock' => 'autoblocage amélioré activé',
-'block-log-flags-hiddenname' => 'nom d’utilisateur caché',
+'block-log-flags-hiddenname' => "nom d'utilisateur caché",
 'range_block_disabled' => 'Le droit administrateur de créer des blocages de plages IP est désactivé.',
-'ipb_expiry_invalid' => 'Durée d’expiration incorrecte.',
-'ipb_expiry_temp' => 'Les blocages de noms d’utilisateurs cachés doivent être permanents.',
+'ipb_expiry_invalid' => "Durée d'expiration incorrecte.",
+'ipb_expiry_temp' => "Les blocages de noms d'utilisateurs cachés doivent être permanents.",
 'ipb_hide_invalid' => 'Impossible de supprimer ce compte ; il semble avoir trop de modifications.',
 'ipb_already_blocked' => '« $1 » est déjà bloqué',
 'ipb-needreblock' => '$1 est déjà bloqué. Voulez-vous modifier les paramètres ?',
 'ipb-otherblocks-header' => '{{PLURAL:$1|Autre blocage|Autres blocages}}',
 'unblock-hideuser' => "Vous ne pouvez pas débloquer cet utilisateur, car son nom d'utilisateur a été masqué.",
-'ipb_cant_unblock' => 'Erreur : identifiant de blocage $1 non trouvé.
-Il est possible qu’un déblocage ait déjà été effectué.',
-'ipb_blocked_as_range' => 'Erreur : l’adresse IP $1 n’est pas bloquée directement et ne peut donc pas être débloquée.
-Elle fait cependant partie de la plage $2 qui, elle, peut être débloquée.',
+'ipb_cant_unblock' => "Erreur : identifiant de blocage $1 non trouvé.
+Il est possible qu'un déblocage ait déjà été effectué.",
+'ipb_blocked_as_range' => "Erreur : l'adresse IP $1 n'est pas bloquée directement et ne peut donc pas être débloquée.
+Elle fait cependant partie de la plage $2 qui, elle, peut être débloquée.",
 'ip_range_invalid' => 'Plage IP incorrecte.',
 'ip_range_toolarge' => 'Les blocages de plages plus grandes que /$1 ne sont pas autorisées.',
 'blockme' => 'Bloquez-moi',
 'proxyblocker' => 'Bloqueur de mandataires',
 'proxyblocker-disabled' => 'Cette fonction est désactivée.',
-'proxyblockreason' => 'Votre adresse IP a été bloquée car il s’agit d’un mandataire ouvert.
-Veuillez contacter votre fournisseur d’accès Internet ou votre support technique et l’informer de ce sérieux problème de sécurité.',
+'proxyblockreason' => "Votre adresse IP a été bloquée car il s'agit d'un mandataire ouvert.
+Veuillez contacter votre fournisseur d'accès Internet ou votre support technique et l'informer de ce sérieux problème de sécurité.",
 'proxyblocksuccess' => 'Fait.',
 'sorbsreason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.',
 'sorbs_create_account_reason' => 'Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.
 Vous ne pouvez pas créer un compte.',
-'cant-block-while-blocked' => 'Vous ne pouvez pas bloquer d’autres utilisateurs tant que vous êtes bloqué{{GENDER:||e|(e)}}.',
-'cant-see-hidden-user' => "L’utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N’ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
-'ipbblocked' => 'Vous ne pouvez pas bloquer ou débloquer d’autres utilisateurs, parce que vous êtes vous-même bloqué',
-'ipbnounblockself' => 'Vous n’êtes pas autorisé à vous débloquer vous-même',
+'cant-block-while-blocked' => "Vous ne pouvez pas bloquer d'autres utilisateurs tant que vous êtes bloqué{{GENDER:||e|(e)}}.",
+'cant-see-hidden-user' => "L'utilisateur que vous tentez de bloquer a déjà été bloqué et masqué. N'ayant pas le droit ''hideuser'', vous ne pouvez pas voir ou modifier le blocage de cet utilisateur.",
+'ipbblocked' => "Vous ne pouvez pas bloquer ou débloquer d'autres utilisateurs, parce que vous êtes vous-même bloqué",
+'ipbnounblockself' => "Vous n'êtes pas autorisé à vous débloquer vous-même",
 
 # Developer tools
 'lockdb' => 'Verrouiller la base de données',
 'unlockdb' => 'Déverrouiller la base de données',
-'lockdbtext' => 'Le verrouillage de la base de données empêchera tous les utilisateurs de modifier des pages, d’enregistrer leurs préférences, de modifier leur liste de suivi et d’effectuer toutes les autres opérations nécessitant des changements dans la base de données.
-Veuillez confirmer que c’est bien là ce que vous voulez faire et que vous déverrouillerez la base dès que votre opération de maintenance sera terminée.',
-'unlockdbtext' => 'Le déverrouillage de la base de données permettra à nouveau à tous les utilisateurs de modifier des pages, de changer leurs préférences, de modifier leur liste de suivi et d’effectuer les autres opérations nécessitant des changements dans la base de données.
-Veuillez confirmer que c’est bien là ce que vous voulez faire.',
+'lockdbtext' => "Le verrouillage de la base de données empêchera tous les utilisateurs de modifier des pages, d'enregistrer leurs préférences, de modifier leur liste de suivi et d'effectuer toutes les autres opérations nécessitant des changements dans la base de données.
+Veuillez confirmer que c'est bien là ce que vous voulez faire et que vous déverrouillerez la base dès que votre opération de maintenance sera terminée.",
+'unlockdbtext' => "Le déverrouillage de la base de données permettra à nouveau à tous les utilisateurs de modifier des pages, de changer leurs préférences, de modifier leur liste de suivi et d'effectuer les autres opérations nécessitant des changements dans la base de données.
+Veuillez confirmer que c'est bien là ce que vous voulez faire.",
 'lockconfirm' => 'Oui, je confirme que je souhaite verrouiller la base de données.',
 'unlockconfirm' => 'Oui, je confirme que je souhaite déverrouiller la base de données.',
 'lockbtn' => 'Verrouiller la base de données',
 'unlockbtn' => 'Déverrouiller la base de données',
-'locknoconfirm' => 'Vous n’avez pas coché la case de confirmation.',
+'locknoconfirm' => "Vous n'avez pas coché la case de confirmation.",
 'lockdbsuccesssub' => 'Verrouillage de la base de données réussi',
 'unlockdbsuccesssub' => 'Verrouillage de la base de données supprimé',
-'lockdbsuccesstext' => 'La base de données a été verrouillée.<br />
-N’oubliez pas de la [[Special:UnlockDB|déverrouiller]] lorsque vous aurez terminé votre opération de maintenance.',
+'lockdbsuccesstext' => "La base de données a été verrouillée.<br />
+N'oubliez pas de la [[Special:UnlockDB|déverrouiller]] lorsque vous aurez terminé votre opération de maintenance.",
 'unlockdbsuccesstext' => 'La base de données a été déverrouillée.',
-'lockfilenotwritable' => 'Le fichier de verrouillage de la base de données n’est pas inscriptible.
-Pour bloquer ou débloquer la base de données, il doit être accessible par le serveur web.',
-'databasenotlocked' => 'La base de données n’est pas verrouillée.',
+'lockfilenotwritable' => "Le fichier de verrouillage de la base de données n'est pas inscriptible.
+Pour bloquer ou débloquer la base de données, il doit être accessible par le serveur web.",
+'databasenotlocked' => "La base de données n'est pas verrouillée.",
 'lockedbyandtime' => '(par $1 le $2 à $3)',
 
 # Move page
 'move-page' => 'Renommer $1',
 'move-page-legend' => 'Renommer une page',
-'movepagetext' => "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. Lancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.
+'movepagetext' => "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L'ancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.
 
-Notez que la page ne sera '''pas''' renommée s’il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d’origine si le déplacement s’avère erroné.
+Notez que la page ne sera '''pas''' renommée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné.
 
 '''Attention !'''
-Ceci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous den avoir compris les conséquences avant de continuer.",
+Ceci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
 'movepagetext-noredirectfixer' => "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom.
-Lancien titre deviendra une page de redirection vers le nouveau titre.
+L'ancien titre deviendra une page de redirection vers le nouveau titre.
 Vérifiez bien les [[Special:DoubleRedirects|doubles redirections]] ou les [[Special:BrokenRedirects|redirections cassées]].
 Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.
 
-Notez que la page ne sera '''pas''' déplacée s’il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d’origine si le déplacement s’avère erroné, et il est impossible d’écraser une page existante.
+Notez que la page ne sera '''pas''' déplacée s'il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d'origine si le déplacement s'avère erroné, et il est impossible d'écraser une page existante.
 
 '''Attention !'''
-Ceci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous den avoir compris les conséquences avant de continuer.",
+Ceci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d'en avoir compris les conséquences avant de continuer.",
 'movepagetalktext' => "La page de discussion associée, si présente, sera automatiquement renommée '''sauf si :'''
 * vous déplacez la page vers un autre espace de noms, ou
 * une page de discussion non vide existe déjà sous le nouveau nom, ou
@@ -2845,37 +2861,37 @@ Ceci peut provoquer un changement radical et imprévu pour une page souvent cons
 
 Dans ces cas-là, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
 'movearticle' => 'Renommer la page :',
-'moveuserpage-warning' => "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seul la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
-'movenologin' => 'Vous n’êtes pas identifié{{GENDER:||e|(e)}}.',
-'movenologintext' => 'Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e|(e)}}]] avec un compte utilisateur enregistré et d’ancienneté suffisante.',
-'movenotallowed' => 'Vous n’avez pas la permission de renommer les pages.',
-'movenotallowedfile' => 'Vous n’avez pas la permission de renommer les fichiers.',
-'cant-move-user-page' => 'Vous n’avez pas la permission de renommer les pages principales d’utilisateurs (en dehors de leurs sous-pages).',
-'cant-move-to-user-page' => 'Vous n’avez pas la permission de renommer une page vers une page utilisateur (à l’exception d’une sous-page).',
+'moveuserpage-warning' => "'''Attention :''' Vous êtes sur le point de renommer une page d'utilisateur. Veuillez noter que seul la page sera renommée et que l'utilisateur '''ne''' sera '''pas''' renommé.",
+'movenologin' => "Vous n'êtes pas identifié{{GENDER:||e|(e)}}.",
+'movenologintext' => "Pour pouvoir renommer une page, vous devez être [[Special:UserLogin|identifié{{GENDER:||e|(e)}}]] avec un compte utilisateur enregistré et d'ancienneté suffisante.",
+'movenotallowed' => "Vous n'avez pas la permission de renommer les pages.",
+'movenotallowedfile' => "Vous n'avez pas la permission de renommer les fichiers.",
+'cant-move-user-page' => "Vous n'avez pas la permission de renommer les pages principales d'utilisateurs (en dehors de leurs sous-pages).",
+'cant-move-to-user-page' => "Vous n'avez pas la permission de renommer une page vers une page utilisateur (à l'exception d'une sous-page).",
 'newtitle' => 'Vers le nouveau titre :',
 'move-watch' => 'Suivre les pages originale et nouvelle',
 'movepagebtn' => 'Renommer la page',
 'pagemovedsub' => 'Renommage réussi',
 'movepage-moved' => "'''« $1 »''' a été renommé '''« $2 »'''",
-'movepage-moved-redirect' => 'Une redirection depuis l’ancien nom a été créée.',
-'movepage-moved-noredirect' => 'La création d’une redirection depuis l’ancien nom a été annulée.',
-'articleexists' => 'Il existe déjà une page portant ce titre, ou le titre que vous avez choisi n’est pas correct.
-Veuillez en choisir un autre.',
+'movepage-moved-redirect' => "Une redirection depuis l'ancien nom a été créée.",
+'movepage-moved-noredirect' => "La création d'une redirection depuis l'ancien nom a été annulée.",
+'articleexists' => "Il existe déjà une page portant ce titre, ou le titre que vous avez choisi n'est pas correct.
+Veuillez en choisir un autre.",
 'cantmove-titleprotected' => 'Vous ne pouvez pas déplacer une page vers cet emplacement car la création de page avec ce nouveau titre a été protégée.',
-'talkexists' => "'''La page elle-même a été déplacée avec succès, mais la page de discussion na pas pu être déplacée car il en existait déjà une sous le nouveau nom. Veuillez les fusionner manuellement.'''",
+'talkexists' => "'''La page elle-même a été déplacée avec succès, mais la page de discussion n'a pas pu être déplacée car il en existait déjà une sous le nouveau nom. Veuillez les fusionner manuellement.'''",
 'movedto' => 'renommé en',
 'movetalk' => 'Renommer aussi la page de discussion associée',
-'move-subpages' => 'Renommer les sous-pages (jusqu’à $1 {{PLURAL:$1|page|pages}})',
-'move-talk-subpages' => 'Renommer les sous-pages de la page de discussion (jusqu’à $1 pages)',
+'move-subpages' => "Renommer les sous-pages (jusqu'à $1 {{PLURAL:$1|page|pages}})",
+'move-talk-subpages' => "Renommer les sous-pages de la page de discussion (jusqu'à $1 pages)",
 'movepage-page-exists' => 'La page $1 existe déjà et ne peut pas être écrasée automatiquement.',
 'movepage-page-moved' => 'La page $1 a été renommée en $2.',
-'movepage-page-unmoved' => 'La page $1 n’a pas pu être renommée en $2.',
+'movepage-page-unmoved' => "La page $1 n'a pas pu être renommée en $2.",
 'movepage-max-pages' => 'Le maximum de $1 {{PLURAL:$1|page renommée|pages renommées}} a été atteint et aucune autre page ne sera renommée automatiquement.',
 'movelogpage' => 'Journal des renommages',
 'movelogpagetext' => 'Voici la liste de toutes les pages renommées ou déplacées.',
 'movesubpage' => 'Sous-page{{PLURAL:$1||s}}',
 'movesubpagetext' => 'Cette page a $1 {{PLURAL:$1|sous-page affichée|sous-pages affichées}} ci-dessous.',
-'movenosubpage' => 'Cette page n’a aucune sous-page.',
+'movenosubpage' => "Cette page n'a aucune sous-page.",
 'movereason' => 'Motif :',
 'revertmove' => 'rétablir',
 'delete_and_move' => 'Supprimer et renommer',
@@ -2884,20 +2900,21 @@ La page de destination « [[:$1]] » existe déjà.
 Êtes-vous certain{{GENDER:||e|}} de vouloir la supprimer pour permettre ce renommage ?',
 'delete_and_move_confirm' => 'Oui, supprimer la page de destination',
 'delete_and_move_reason' => 'Page supprimée pour permettre le renommage depuis "[[$1]]"',
-'selfmove' => 'Les titres d’origine et de destination sont les mêmes ;
-impossible de renommer une page sur elle-même.',
-'immobile-source-namespace' => 'Vous ne pouvez pas renommer les pages dans l’espace de noms « $1 »',
-'immobile-target-namespace' => 'Vous ne pouvez pas renommer des pages vers l’espace de noms « $1 »',
+'selfmove' => "Les titres d'origine et de destination sont les mêmes ;
+impossible de renommer une page sur elle-même.",
+'immobile-source-namespace' => "Vous ne pouvez pas renommer les pages dans l'espace de noms « $1 »",
+'immobile-target-namespace' => "Vous ne pouvez pas renommer des pages vers l'espace de noms « $1 »",
 'immobile-target-namespace-iw' => 'Les destinations interwikis ne sont pas une cible valide pour les déplacements.',
-'immobile-source-page' => 'Cette page n’est pas renommable.',
-'immobile-target-page' => 'Il n’est pas possible de renommer la page vers ce titre.',
+'immobile-source-page' => "Cette page n'est pas renommable.",
+'immobile-target-page' => "Il n'est pas possible de renommer la page vers ce titre.",
+'bad-target-model' => 'La destination souhaitée utilise un autre modèle de contenu. Impossible de convertir de $1 vers $2.',
 'imagenocrossnamespace' => 'Impossible de renommer un fichier vers un espace de noms autre que fichier.',
-'nonfile-cannot-move-to-file' => "Impossible de renommer quelque chose d’autre qu'un fichier vers l’espace de noms fichier.",
+'nonfile-cannot-move-to-file' => "Impossible de renommer quelque chose d'autre qu'un fichier vers l'espace de noms fichier.",
 'imagetypemismatch' => 'La nouvelle extension de ce fichier ne correspond pas à son type.',
 'imageinvalidfilename' => 'Le nom du fichier cible est incorrect',
 'fix-double-redirects' => 'Mettre à jour les redirections pointant vers le titre original',
 'move-leave-redirect' => 'Laisser une redirection vers le nouveau titre',
-'protectedpagemovewarning' => "'''Attention :''' Cette page a été protégée afin que seuls les utilisateurs possédant les droits dadministrateur puissent la renommer. La dernière entrée du journal est affichée ci-dessous pour référence :",
+'protectedpagemovewarning' => "'''Attention :''' Cette page a été protégée afin que seuls les utilisateurs possédant les droits d'administrateur puissent la renommer. La dernière entrée du journal est affichée ci-dessous pour référence :",
 'semiprotectedpagemovewarning' => "'''Note :''' Cette page a été protégée afin que seuls les utilisateurs enregistrés puissent la renommer. La dernière entrée du journal est affichée ci-dessous pour référence :",
 'move-over-sharedrepo' => '== Le fichier existe ==
 [[:$1]] existe déjà sur un dépôt partagé. Renommer ce fichier rendra le fichier sur le dépôt partage inaccessible.',
@@ -2906,21 +2923,21 @@ Choisissez un autre nom.',
 
 # Export
 'export' => 'Exporter des pages',
-'exporttext' => 'Vous pouvez exporter en XML le texte et l’historique d’une page ou d’un ensemble de pages ;
-le résultat peut alors être importé dans un autre wiki utilisant le logiciel MediaWiki via la [[Special:Import|page dimportation]].
+'exporttext' => "Vous pouvez exporter en XML le texte et l'historique d'une page ou d'un ensemble de pages ;
+le résultat peut alors être importé dans un autre wiki utilisant le logiciel MediaWiki via la [[Special:Import|page d'importation]].
 
-Pour exporter des pages, entrez leurs titres dans la boîte de texte ci-dessous, à raison d’un titre par ligne. Sélectionnez si vous désirez ou non la version actuelle avec toutes les anciennes versions, avec les lignes de l’historique de la page, ou simplement la page actuelle avec des informations sur la dernière modification.
+Pour exporter des pages, entrez leurs titres dans la boîte de texte ci-dessous, à raison d'un titre par ligne. Sélectionnez si vous désirez ou non la version actuelle avec toutes les anciennes versions, avec les lignes de l'historique de la page, ou simplement la page actuelle avec des informations sur la dernière modification.
 
-Dans ce dernier cas vous pouvez aussi utiliser un lien, tel que [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pour la page [[{{MediaWiki:Mainpage}}]].',
+Dans ce dernier cas vous pouvez aussi utiliser un lien, tel que [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] pour la page [[{{MediaWiki:Mainpage}}]].",
 'exportall' => 'Exporter toutes les pages',
-'exportcuronly' => 'Exporter uniquement la version courante, sans l’historique complet',
+'exportcuronly' => "Exporter uniquement la version courante, sans l'historique complet",
 'exportnohistory' => "----
-'''Note :''' l’exportation de l’historique complet des pages à l’aide de ce formulaire a été désactivée pour des raisons de performance.",
+'''Note :''' l'exportation de l'historique complet des pages à l'aide de ce formulaire a été désactivée pour des raisons de performance.",
 'exportlistauthors' => 'Inclure une liste complète des contributeurs pour chaque page',
 'export-submit' => 'Exporter',
 'export-addcattext' => 'Ajouter les pages de la catégorie :',
 'export-addcat' => 'Ajouter',
-'export-addnstext' => 'Ajouter des pages dans l’espace de noms :',
+'export-addnstext' => "Ajouter des pages dans l'espace de noms :",
 'export-addns' => 'Ajouter',
 'export-download' => 'Enregistrer dans un fichier',
 'export-templates' => 'Inclure les modèles',
@@ -2931,9 +2948,9 @@ Dans ce dernier cas vous pouvez aussi utiliser un lien, tel que [[{{#Special:Exp
 'allmessagesname' => 'Nom du message',
 'allmessagesdefault' => 'Message par défaut',
 'allmessagescurrent' => 'Message actuel',
-'allmessagestext' => 'Ceci est la liste des messages disponibles dans l’espace MediaWiki.
-Veuillez visiter la [//www.mediawiki.org/wiki/Localisation Localisation de MediaWiki] et [//translatewiki.net/ translatewiki.net] si vous désirez contribuer à la localisation générique de MediaWiki.',
-'allmessagesnotsupportedDB' => "Cette page '''{{ns:special}}:Allmessages''' nest pas utilisable car '''\$wgUseDatabaseMessages''' a été désactivé.",
+'allmessagestext' => "Ceci est la liste des messages disponibles dans l'espace MediaWiki.
+Veuillez visiter la [//www.mediawiki.org/wiki/Localisation Localisation de MediaWiki] et [//translatewiki.net/ translatewiki.net] si vous désirez contribuer à la localisation générique de MediaWiki.",
+'allmessagesnotsupportedDB' => "Cette page '''{{ns:special}}:Allmessages''' n'est pas utilisable car '''\$wgUseDatabaseMessages''' a été désactivé.",
 'allmessages-filter-legend' => 'Filtrer',
 'allmessages-filter' => 'Filtrer par état de modification :',
 'allmessages-filter-unmodified' => 'Non modifié',
@@ -2953,72 +2970,71 @@ Veuillez visiter la [//www.mediawiki.org/wiki/Localisation Localisation de Media
 'thumbnail-dest-create' => "Impossible d'enregistrer la vignette sur la destination",
 'thumbnail_invalid_params' => 'Paramètres de la miniature incorrects',
 'thumbnail_dest_directory' => 'Impossible de créer le répertoire de destination',
-'thumbnail_image-type' => 'Type d’image non supporté',
+'thumbnail_image-type' => "Type d'image non supporté",
 'thumbnail_gd-library' => 'Configuration incomplète de la bibliothèque GD : fonction $1 introuvable',
 'thumbnail_image-missing' => 'Le fichier suivant est introuvable : $1',
 
 # Special:Import
 'import' => 'Importer des pages',
 'importinterwiki' => 'Importation inter-wiki',
-'import-interwiki-text' => 'Sélectionnez un wiki et un titre de page à importer.
+'import-interwiki-text' => "Sélectionnez un wiki et un titre de page à importer.
 Les dates des versions et les noms des contributeurs seront préservés.
-Toutes les actions d’importation inter-wiki sont consignées dans l’[[Special:Log/import|historique des importations]].',
+Toutes les actions d'importation inter-wiki sont consignées dans l'[[Special:Log/import|historique des importations]].",
 'import-interwiki-source' => 'Wiki et page sources :',
-'import-interwiki-history' => 'Copier toutes les versions de l’historique de cette page',
+'import-interwiki-history' => "Copier toutes les versions de l'historique de cette page",
 '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]].
-Sauvegardez-le sur votre disque dur puis importez-le ici.',
+'importtext' => "Veuillez exporter le fichier depuis le wiki d'origine en utilisant son [[Special:Export|outil d'exportation]].
+Sauvegardez-le sur votre disque dur puis importez-le ici.",
 'importstart' => 'Importation des pages…',
 'import-revision-count' => '$1 version{{PLURAL:$1||s}}',
 'importnopages' => 'Aucune page à importer.',
 'imported-log-entries' => '$1 {{PLURAL:$1|entrée|entrées}} du journal {{PLURAL:$1|importée|importées}}.',
-'importfailed' => 'Échec de l’importation : <nowiki>$1</nowiki>',
+'importfailed' => "Échec de l'importation : <nowiki>$1</nowiki>",
 'importunknownsource' => 'Type inconnu de la source à importer',
-'importcantopen' => 'Impossible d’ouvrir le fichier à importer',
+'importcantopen' => "Impossible d'ouvrir le fichier à importer",
 'importbadinterwiki' => 'Mauvais lien inter-wiki',
 'importnotext' => 'Vide ou sans texte',
-'importsuccess' => 'L’importation a réussi !',
-'importhistoryconflict' => 'Un conflit a été détecté dans l’historique des versions (cette page a pu être importée auparavant).',
-'importnosources' => "Aucune source d’importation inter-wiki n’a été définie et l'import direct d’historiques est désactivé.",
-'importnofile' => 'Aucun fichier d’importation n’a été envoyé.',
+'importsuccess' => "L'importation a réussi !",
+'importhistoryconflict' => "Un conflit a été détecté dans l'historique des versions (cette page a pu être importée auparavant).",
+'importnosources' => "Aucune source d'importation inter-wiki n'a été définie et l'import direct d'historiques est désactivé.",
+'importnofile' => "Aucun fichier d'importation n'a été envoyé.",
 'importuploaderrorsize' => "L'import du fichier a échoué.
 Sa taille est supérieure au maximum autorisé pour l'import de fichier.",
 'importuploaderrorpartial' => "L'import du fichier échoué.
-Son contenu na été transféré que partiellement.",
+Son contenu n'a été transféré que partiellement.",
 'importuploaderrortemp' => "L'import du fichier a échoué.
 Un dossier temporaire est manquant.",
-'import-parse-failure' => 'Échec lors de l’analyse du XML à importer',
+'import-parse-failure' => "Échec lors de l'analyse du XML à importer",
 'import-noarticle' => 'Aucune page à importer !',
 'import-nonewrevisions' => 'Toutes les versions ont été importées auparavant.',
 'xml-error-string' => '$1 à la ligne $2, colonne $3 (octet $4) : $5',
 'import-upload' => 'Import de données XML',
 'import-token-mismatch' => 'Perte des données de session. Veuillez réessayez.',
-'import-invalid-interwiki' => 'Impossible d’importer depuis le wiki spécifié.',
-'import-error-edit' => 'La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisés à la modifier.',
-'import-error-create' => 'La page « $1 » n’a pas été importée parce que vous n’êtes pas autorisés à la créer.',
+'import-invalid-interwiki' => "Impossible d'importer depuis le wiki spécifié.",
+'import-error-edit' => "La page « $1 » n'a pas été importée parce que vous n'êtes pas autorisés à la modifier.",
+'import-error-create' => "La page « $1 » n'a pas été importée parce que vous n'êtes pas autorisés à la créer.",
 'import-error-interwiki' => "La page « $1 » n'est pas importée parce que son nom est réservé pour un lien externe (interwiki).",
-'import-error-special' => 'La page " $1 " n\'est pas importée parce qu\'elle appartient à un espace de noms special qui nen autorise aucune.',
-'import-error-invalid' => 'Page « $1 » n’est pas importée parce que son nom n’est pas valide.',
+'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',
-'importlogpagetext' => 'Importations administratives de pages avec leur historique de modifications depuis d’autres wikis.',
+'importlogpagetext' => "Importations administratives de pages d'autres wikis, avec leur historique de modification.",
 'import-logentry-upload' => 'a importé [[$1]] par envoi de fichier',
 'import-logentry-upload-detail' => '$1 version{{PLURAL:$1||s}}',
-'import-logentry-interwiki' => 'a importé $1 d’un wiki à l’autre',
+'import-logentry-interwiki' => "a importé $1 d'un wiki à l'autre",
 'import-logentry-interwiki-detail' => '$1 version{{PLURAL:$1||s}} depuis $2',
 
 # JavaScriptTest
 'javascripttest' => 'Test de JavaScript',
-'javascripttest-disabled' => "Cette fonction n'a pas été activée sur ce wiki.",
 'javascripttest-title' => 'Exécution des tests $1',
 'javascripttest-pagetext-noframework' => "Cette page est réservée pour l'exécution des tests JavaScript.",
 'javascripttest-pagetext-unknownframework' => 'Structure "$1" inconnue.',
@@ -3029,18 +3045,18 @@ Un dossier temporaire est manquant.",
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Votre page utilisateur',
-'tooltip-pt-anonuserpage' => 'La page utilisateur de l’IP avec laquelle vous contribuez',
+'tooltip-pt-anonuserpage' => "La page utilisateur de l'IP avec laquelle vous contribuez",
 'tooltip-pt-mytalk' => 'Votre page de discussion',
 'tooltip-pt-anontalk' => 'La page de discussion pour les contributions depuis cette adresse IP',
 'tooltip-pt-preferences' => 'Vos préférences',
 'tooltip-pt-watchlist' => 'La liste des pages dont vous suivez les modifications',
 'tooltip-pt-mycontris' => 'La liste de vos contributions',
-'tooltip-pt-login' => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier ; ce n’est cependant pas obligatoire.',
-'tooltip-pt-anonlogin' => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier ; ce n’est cependant pas obligatoire.',
+'tooltip-pt-login' => "Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier ; ce n'est cependant pas obligatoire.",
+'tooltip-pt-anonlogin' => "Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier ; ce n'est cependant pas obligatoire.",
 'tooltip-pt-logout' => 'Se déconnecter',
 'tooltip-ca-talk' => 'Discussion au sujet de cette page de contenu',
-'tooltip-ca-edit' => 'Vous pouvez modifier cette page.
-Veuillez utiliser le bouton de prévisualisation avant d’enregistrer.',
+'tooltip-ca-edit' => "Vous pouvez modifier cette page.
+Veuillez utiliser le bouton de prévisualisation avant d'enregistrer.",
 'tooltip-ca-addsection' => 'Commencer une nouvelle section',
 'tooltip-ca-viewsource' => 'Cette page est protégée.
 Vous pouvez toutefois en visualiser la source.',
@@ -3056,10 +3072,10 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-search-go' => 'Aller vers une page portant exactement ce nom si elle existe.',
 'tooltip-search-fulltext' => 'Rechercher les pages comportant ce texte.',
 'tooltip-p-logo' => 'Page principale',
-'tooltip-n-mainpage' => 'Visiter la page d’accueil du site',
-'tooltip-n-mainpage-description' => 'Aller à l’accueil',
+'tooltip-n-mainpage' => "Visiter la page d'accueil du site",
+'tooltip-n-mainpage-description' => "Aller à l'accueil",
 'tooltip-n-portal' => 'À propos du projet',
-'tooltip-n-currentevents' => 'Trouver les informations de fond sur l’actualité du moment',
+'tooltip-n-currentevents' => "Trouver les informations de fond sur l'actualité du moment",
 'tooltip-n-recentchanges' => 'Liste des modifications récentes sur le wiki',
 'tooltip-n-randompage' => 'Afficher une page au hasard',
 'tooltip-n-help' => 'Aide',
@@ -3081,7 +3097,7 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-ca-nstab-image' => 'Voir la page du fichier',
 'tooltip-ca-nstab-mediawiki' => 'Voir le message système',
 'tooltip-ca-nstab-template' => 'Voir le modèle',
-'tooltip-ca-nstab-help' => 'Voir la page d’aide',
+'tooltip-ca-nstab-help' => "Voir la page d'aide",
 'tooltip-ca-nstab-category' => 'Voir la page de la catégorie',
 'tooltip-minoredit' => 'Marquer mes modifications comme mineures',
 'tooltip-save' => 'Publier vos modifications',
@@ -3094,8 +3110,8 @@ Vous pouvez toutefois en visualiser la source.',
 'tooltip-recreate' => 'Recréer la page même si celle-ci a été effacée',
 'tooltip-upload' => "Démarrer l'import",
 'tooltip-rollback' => '« Révoquer » annule en un clic la ou les modification(s) de cette page par son dernier contributeur.',
-'tooltip-undo' => '« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
-Permet de rétablir la version précédente et d’ajouter un motif dans la boîte de résumé.',
+'tooltip-undo' => "« Défaire » révoque cette modification et ouvre la fenêtre de modification en mode prévisualisation.
+Permet de rétablir la version précédente et d'ajouter un motif dans la boîte de résumé.",
 'tooltip-preferences-save' => 'Sauvegarder les préférences',
 'tooltip-summary' => 'Entrez un bref résumé',
 
@@ -3139,27 +3155,28 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 
 # Attribution
 'anonymous' => '{{PLURAL:$1|Utilisateur non enregistré|Utilisateurs non enregistrés}} sur {{SITENAME}}',
-'siteuser' => '{{GENDER:$2|l’utilisateur|l’utilisatrice|l’utilisateur}} $1 de {{SITENAME}}',
-'anonuser' => 'l’utilisateur anonyme $1 de {{SITENAME}}',
+'siteuser' => "{{GENDER:$2|l'utilisateur|l'utilisatrice|l'utilisateur}} $1 de {{SITENAME}}",
+'anonuser' => "l'utilisateur anonyme $1 de {{SITENAME}}",
 'lastmodifiedatby' => 'Cette page a été modifiée pour la dernière fois le $1 à $2 par $3.',
 'othercontribs' => 'Basé sur le travail de $1.',
 'others' => 'autres',
-'siteusers' => '{{PLURAL:$2|l’utilisateur|les utilisateurs}} $1 de {{SITENAME}}',
-'anonusers' => '{{PLURAL:$2|l’utilisateur anonyme|les utilisateurs anonymes}} $1 de {{SITENAME}}',
+'siteusers' => "{{PLURAL:$2|l'utilisateur|les utilisateurs}} $1 de {{SITENAME}}",
+'anonusers' => "{{PLURAL:$2|l'utilisateur anonyme|les utilisateurs anonymes}} $1 de {{SITENAME}}",
 'creditspage' => 'Crédits de la page',
-'nocredits' => 'Il n’y a pas d’informations d’attribution disponibles pour cette page.',
+'nocredits' => "Il n'y a pas d'informations d'attribution disponibles pour cette page.",
 
 # Spam protection
 'spamprotectiontitle' => 'Filtre de protection anti-pollution',
-'spamprotectiontext' => 'La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-pollution. Ceci est probablement dû à l’introduction d’un lien vers un site externe apparaissant sur la liste noire. Cette dernière utilise les expressions rationnelles suivantes :',
-'spamprotectionmatch' => "La chaîne de caractères « '''$1''' » a déclenché le détecteur de pourriel.",
-'spambot_username' => 'Nettoyage de pourriels par MediaWiki',
+'spamprotectiontext' => "La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-pollution. Ceci est probablement dû à l'introduction d'un lien vers un site externe apparaissant sur la liste noire. Cette dernière utilise les expressions rationnelles suivantes :",
+'spamprotectionmatch' => "La chaîne de caractères « '''$1''' » a déclenché le détecteur de spam.",
+'spambot_username' => 'Nettoyage de spams par MediaWiki',
 'spam_reverting' => 'Rétablissement de la dernière version ne contenant pas de lien vers $1',
 'spam_blanking' => 'Toutes les versions contenant des liens vers $1 sont blanchies',
 'spam_deleting' => 'Toutes les versions contenaient des liens vers $1, suppression',
 
 # Info page
 'pageinfo-title' => 'Informations pour « $1 »',
+'pageinfo-not-current' => 'Désolé, impossible de fournir cette information pour les anciennes révisions.',
 'pageinfo-header-basic' => 'Informations de base',
 'pageinfo-header-edits' => 'Historique des modifications',
 'pageinfo-header-restrictions' => 'Protection de la page',
@@ -3168,6 +3185,7 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 '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-language' => 'Langue du contenu de la page',
 'pageinfo-robot-policy' => 'Statut de moteur de recherche',
 'pageinfo-robot-index' => 'Indexable',
 'pageinfo-robot-noindex' => 'Non indexable',
@@ -3184,10 +3202,17 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Information sur la page',
+'pageinfo-redirectsto' => 'Rediriger vers',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Compté comme page de contenu',
+'pageinfo-contentpage-yes' => 'Oui',
+'pageinfo-protect-cascading' => "Les protections sont déduites d'ici",
+'pageinfo-protect-cascading-yes' => 'Oui',
+'pageinfo-protect-cascading-from' => 'Les protections sont déduites depuis',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3205,16 +3230,18 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'markaspatrolledtext' => 'Marquer cette page comme relue',
 'markedaspatrolled' => 'Marquée comme relue',
 'markedaspatrolledtext' => 'La version sélectionnée de [[:$1]] a été marquée comme relue.',
-'rcpatroldisabled' => 'La fonction de relecture des modifications récentes n’est pas activée.',
+'rcpatroldisabled' => "La fonction de relecture des modifications récentes n'est pas activée.",
 'rcpatroldisabledtext' => 'La fonctionnalité de relecture des modifications récentes est actuellement désactivée.',
 'markedaspatrollederror' => 'Ne peut être marquée comme relue',
 'markedaspatrollederrortext' => 'Vous devez sélectionner une version pour pouvoir la marquer comme relue.',
-'markedaspatrollederror-noautopatrol' => 'Vous n’avez pas le droit de marquer vos propres modifications comme relues.',
+'markedaspatrollederror-noautopatrol' => "Vous n'avez pas le droit de marquer vos propres modifications comme relues.",
+'markedaspatrollednotify' => 'Cette modification de $1 a été marquée comme contrôlée.',
+'markedaspatrollederrornotify' => 'Échec du marquage comme contrôlé.',
 
 # Patrol log
 'patrol-log-page' => 'Journal des relectures',
-'patrol-log-header' => 'Voici l’historique des versions relues.',
-'log-show-hide-patrol' => '$1 l’historique des relectures',
+'patrol-log-header' => "Voici l'historique des versions relues.",
+'log-show-hide-patrol' => "$1 l'historique des relectures",
 
 # Image deletion
 'deletedrevision' => 'Ancienne version $1 supprimée',
@@ -3222,10 +3249,10 @@ Permet de rétablir la version précédente et d’ajouter un motif dans la boî
 'filedeleteerror-long' => 'Des erreurs ont été rencontrées lors de la suppression du fichier :
 
 $1',
-'filedelete-missing' => 'Le fichier « $1 » ne peut pas être supprimé parce qu’il n’existe pas.',
-'filedelete-old-unregistered' => 'La version du fichier spécifiée « $1 » n’est pas dans la base de données.',
-'filedelete-current-unregistered' => 'Le fichier spécifié « $1 » n’est pas dans la base de données.',
-'filedelete-archive-read-only' => 'Le dossier d’archivage « $1 » n’est pas modifiable par le serveur.',
+'filedelete-missing' => "Le fichier « $1 » ne peut pas être supprimé parce qu'il n'existe pas.",
+'filedelete-old-unregistered' => "La version du fichier spécifiée « $1 » n'est pas dans la base de données.",
+'filedelete-current-unregistered' => "Le fichier spécifié « $1 » n'est pas dans la base de données.",
+'filedelete-archive-read-only' => "Le dossier d'archivage « $1 » n'est pas modifiable par le serveur.",
 
 # Browsing diffs
 'previousdiff' => '← Modification précédente',
@@ -3233,7 +3260,7 @@ $1',
 
 # Media information
 'mediawarning' => "'''Attention :''' ce type de fichier peut contenir du code malveillant.
-Si vous lexécutez, votre système peut être compromis.",
+Si vous l'exécutez, votre système peut être compromis.",
 'imagemaxsize' => "Taille maximale des images :<br />''(pour les pages de description de fichier)''",
 'thumbsize' => 'Taille de la miniature :',
 'widthheightpage' => '$1 × $2, $3 page{{PLURAL:$3||s}}',
@@ -3268,24 +3295,26 @@ Si vous l’exécutez, votre système peut être compromis.",
 'sp-newimages-showfrom' => 'Afficher les nouveaux fichiers à partir du $1 à $2',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'days-abbrev' => '$1 j',
 'seconds' => '{{PLURAL:$1|$1 seconde|$1 secondes}}',
 'minutes' => '{{PLURAL:$1|$1 minute|$1 minutes}}',
 'hours' => '{{PLURAL:$1|$1 heure|$1 heures}}',
 'days' => '{{PLURAL:$1|$1 jour|$1 jours}}',
 'ago' => 'Il y a $1',
+'just-now' => "à l'instant",
 
 # Bad image list
-'bad_image_list' => 'Le format est le suivant :
+'bad_image_list' => "Le format est le suivant :
 
-Seules les listes d’énumération (commençant par *) sont prises en compte. Le premier lien d’une ligne doit être celui d’une mauvaise image.
-Les autres liens sur la même ligne sont considérés comme des exceptions, par exemple des pages sur lesquelles l’image peut apparaître.',
+Seules les listes d'énumération (commençant par *) sont prises en compte. Le premier lien d'une ligne doit être celui d'une mauvaise image.
+Les autres liens sur la même ligne sont considérés comme des exceptions, par exemple des pages sur lesquelles l'image peut apparaître.",
 
 # Metadata
 'metadata' => 'Métadonnées',
-'metadata-help' => 'Ce fichier contient des informations supplémentaires, probablement ajoutées par l’appareil photo numérique ou le numériseur utilisé pour le créer. Si le fichier a été modifié depuis son état original, certains détails peuvent ne pas refléter entièrement l’image modifiée.',
+'metadata-help' => "Ce fichier contient des informations supplémentaires, probablement ajoutées par l'appareil photo numérique ou le numériseur utilisé pour le créer. Si le fichier a été modifié depuis son état original, certains détails peuvent ne pas refléter entièrement l'image modifiée.",
 'metadata-expand' => 'Afficher les informations détaillées',
 'metadata-collapse' => 'Masquer les informations détaillées',
-'metadata-fields' => 'Les champs de métadonnées d’image listés dans ce message seront inclus dans la page de description de l’image quand la table de métadonnées sera réduite. Les autres champs seront cachés par défaut.
+'metadata-fields' => "Les champs de métadonnées d'image listés dans ce message seront inclus dans la page de description de l'image quand la table de métadonnées sera réduite. Les autres champs seront cachés par défaut.
 * make
 * model
 * datetimeoriginal
@@ -3298,7 +3327,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 * imagedescription
 * gpslatitude
 * gpslongitude
-* gpsaltitude',
+* gpsaltitude",
 
 # EXIF tags
 'exif-imagewidth' => 'Largeur',
@@ -3313,7 +3342,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-ycbcrpositioning' => 'Positionnement YCbCr',
 'exif-xresolution' => 'Résolution horizontale',
 'exif-yresolution' => 'Résolution verticale',
-'exif-stripoffsets' => 'Emplacement des données de l’image',
+'exif-stripoffsets' => "Emplacement des données de l'image",
 'exif-rowsperstrip' => 'Nombre de lignes par bande',
 'exif-stripbytecounts' => 'Taille en octets par bande',
 'exif-jpeginterchangeformat' => 'Position du SOI JPEG',
@@ -3323,36 +3352,36 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-ycbcrcoefficients' => 'Coefficients YCbCr',
 'exif-referenceblackwhite' => 'Valeurs de référence noir et blanc',
 'exif-datetime' => 'Date de modification',
-'exif-imagedescription' => 'Description de l’image',
-'exif-make' => 'Fabricant de l’appareil',
-'exif-model' => 'Modèle de l’appareil',
+'exif-imagedescription' => "Description de l'image",
+'exif-make' => "Fabricant de l'appareil",
+'exif-model' => "Modèle de l'appareil",
 'exif-software' => 'Logiciel utilisé',
 'exif-artist' => 'Auteur',
-'exif-copyright' => 'Détenteur du droit d’auteur',
+'exif-copyright' => "Détenteur du droit d'auteur",
 'exif-exifversion' => 'Version EXIF',
 'exif-flashpixversion' => 'Version FlashPix',
 'exif-colorspace' => 'Espace colorimétrique',
 'exif-componentsconfiguration' => 'Signification de chaque composante',
-'exif-compressedbitsperpixel' => 'Mode de compression de l’image',
-'exif-pixelydimension' => 'Largeur de l’image',
-'exif-pixelxdimension' => 'Hauteur de l’image',
-'exif-usercomment' => 'Commentaires de l’utilisateur',
+'exif-compressedbitsperpixel' => "Mode de compression de l'image",
+'exif-pixelydimension' => "Largeur de l'image",
+'exif-pixelxdimension' => "Hauteur de l'image",
+'exif-usercomment' => "Commentaires de l'utilisateur",
 'exif-relatedsoundfile' => 'Fichier audio associé',
 'exif-datetimeoriginal' => 'Date de la prise originelle',
 'exif-datetimedigitized' => 'Date de la numérisation',
 'exif-subsectime' => 'Date de modification',
 'exif-subsectimeoriginal' => 'Date de la prise originelle',
 'exif-subsectimedigitized' => 'Date de la numérisation',
-'exif-exposuretime' => 'Temps d’exposition',
+'exif-exposuretime' => "Temps d'exposition",
 'exif-exposuretime-format' => '$1 s ($2 s)',
 'exif-fnumber' => 'Ouverture',
-'exif-exposureprogram' => 'Programme d’exposition',
+'exif-exposureprogram' => "Programme d'exposition",
 'exif-spectralsensitivity' => 'Sensibilité spectrale',
 'exif-isospeedratings' => 'Sensibilité ISO',
-'exif-shutterspeedvalue' => 'vitesse d’obturation de l’APEX',
-'exif-aperturevalue' => 'Ouverture de l’APEX',
+'exif-shutterspeedvalue' => "vitesse d'obturation de l'APEX",
+'exif-aperturevalue' => "Ouverture de l'APEX",
 'exif-brightnessvalue' => 'Luminance APEX',
-'exif-exposurebiasvalue' => 'Correction d’exposition',
+'exif-exposurebiasvalue' => "Correction d'exposition",
 'exif-maxaperturevalue' => 'Ouverture maximale',
 'exif-subjectdistance' => 'Distance du sujet',
 'exif-meteringmode' => 'Mode de mesure',
@@ -3365,12 +3394,12 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-focalplaneyresolution' => 'Résolution verticale du plan focal',
 'exif-focalplaneresolutionunit' => 'Unité de résolution du plan focal',
 'exif-subjectlocation' => 'Localisation du sujet',
-'exif-exposureindex' => 'Index d’exposition',
+'exif-exposureindex' => "Index d'exposition",
 'exif-sensingmethod' => 'Type de capteur',
 'exif-filesource' => 'Source du fichier',
 'exif-scenetype' => 'Type de scène',
 'exif-customrendered' => 'Rendu personnalisé',
-'exif-exposuremode' => 'Mode d’exposition',
+'exif-exposuremode' => "Mode d'exposition",
 'exif-whitebalance' => 'Balance des blancs',
 'exif-digitalzoomratio' => 'Taux de zoom numérique',
 'exif-focallengthin35mmfilm' => 'Longueur focale pour un film 35 mm',
@@ -3381,13 +3410,13 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-sharpness' => 'Netteté',
 'exif-devicesettingdescription' => 'Description de la configuration du dispositif',
 'exif-subjectdistancerange' => 'Distance du sujet',
-'exif-imageuniqueid' => 'Identifiant unique de l’image',
+'exif-imageuniqueid' => "Identifiant unique de l'image",
 'exif-gpsversionid' => 'Version de la balise GPS',
 'exif-gpslatituderef' => 'Référence pour la latitude',
 'exif-gpslatitude' => 'Latitude',
 'exif-gpslongituderef' => 'Référence pour la longitude',
 'exif-gpslongitude' => 'Longitude',
-'exif-gpsaltituderef' => 'Référence d’altitude (0=altitude, 1=profondeur)',
+'exif-gpsaltituderef' => "Référence d'altitude (0=altitude, 1=profondeur)",
 'exif-gpsaltitude' => 'Altitude',
 'exif-gpstimestamp' => 'Heure GPS (horloge atomique)',
 'exif-gpssatellites' => 'Satellites utilisés pour la mesure',
@@ -3398,8 +3427,8 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-gpsspeed' => 'Vitesse du récepteur GPS',
 'exif-gpstrackref' => 'Référence pour la direction du mouvement',
 'exif-gpstrack' => 'Direction du mouvement',
-'exif-gpsimgdirectionref' => 'Référence pour la direction de l’image',
-'exif-gpsimgdirection' => 'Direction de l’image',
+'exif-gpsimgdirectionref' => "Référence pour la direction de l'image",
+'exif-gpsimgdirection' => "Direction de l'image",
 'exif-gpsmapdatum' => 'Système géodésique utilisé',
 'exif-gpsdestlatituderef' => 'Référence pour la latitude de la destination',
 'exif-gpsdestlatitude' => 'Latitude de la destination',
@@ -3432,7 +3461,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-headline' => 'Titre',
 'exif-credit' => 'Crédit / fournisseur',
 'exif-source' => 'Source',
-'exif-editstatus' => 'Statut éditorial de l’image',
+'exif-editstatus' => "Statut éditorial de l'image",
 'exif-urgency' => 'Urgence',
 'exif-fixtureidentifier' => 'Nom élément récurrent',
 'exif-locationdest' => 'Lieu représenté',
@@ -3449,17 +3478,17 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-originaltransmissionref' => 'Code de localisation de la transmission originale',
 'exif-identifier' => 'Identifiant',
 'exif-lens' => 'Lentille utilisée',
-'exif-serialnumber' => 'Numéro de série de l’appareil photo',
+'exif-serialnumber' => "Numéro de série de l'appareil photo",
 'exif-cameraownername' => "Propriétaire de l'appareil photo",
 'exif-label' => 'Libellé',
 'exif-datetimemetadata' => 'Date de la dernière modification des métadonnées',
-'exif-nickname' => 'Nom informel de l’image',
+'exif-nickname' => "Nom informel de l'image",
 'exif-rating' => 'Note (sur 5)',
 'exif-rightscertificate' => 'Certificat de gestion des droits',
-'exif-copyrighted' => 'Statut du droit d’auteur',
-'exif-copyrightowner' => 'Détenteur du droit d’auteur',
-'exif-usageterms' => 'Conditions d’utilisation',
-'exif-webstatement' => 'Déclaration de droits d’auteur en ligne',
+'exif-copyrighted' => "Statut du droit d'auteur",
+'exif-copyrightowner' => "Détenteur du droit d'auteur",
+'exif-usageterms' => "Conditions d'utilisation",
+'exif-webstatement' => "Déclaration de droits d'auteur en ligne",
 'exif-originaldocumentid' => 'Identifiant unique du document original',
 'exif-licenseurl' => 'URL de la licence',
 'exif-morepermissionsurl' => 'Informations sur les licences alternatives',
@@ -3469,14 +3498,14 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-disclaimer' => 'Désistement',
 'exif-contentwarning' => 'Avertissement sur le contenu',
 'exif-giffilecomment' => 'Commentaire de fichier GIF',
-'exif-intellectualgenre' => 'Type d’élément',
+'exif-intellectualgenre' => "Type d'élément",
 'exif-subjectnewscode' => 'Code du sujet',
 'exif-scenecode' => 'Code de scène IPTC',
 'exif-event' => 'Événement représenté',
 'exif-organisationinimage' => 'Organisation représentée',
 'exif-personinimage' => 'Personne représentée',
-'exif-originalimageheight' => 'Hauteur de l’image avant qu’elle ait été recadrée',
-'exif-originalimagewidth' => 'Largeur de l’image avant qu’elle ait été recadrée',
+'exif-originalimageheight' => "Hauteur de l'image avant qu'elle ait été recadrée",
+'exif-originalimagewidth' => "Largeur de l'image avant qu'elle ait été recadrée",
 
 # EXIF attributes
 'exif-compression-1' => 'Non compressé',
@@ -3484,7 +3513,7 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-compression-3' => 'CCITT Groupe 3 codage du fax',
 'exif-compression-4' => 'CCITT Groupe 4 codage du fax',
 
-'exif-copyrighted-true' => 'Soumis au droit d’auteur',
+'exif-copyrighted-true' => "Soumis au droit d'auteur",
 'exif-copyrighted-false' => 'Domaine public',
 
 'exif-unknowndate' => 'Date inconnue',
@@ -3503,16 +3532,16 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 
 'exif-colorspace-65535' => 'Non calibré',
 
-'exif-componentsconfiguration-0' => 'N’existe pas',
+'exif-componentsconfiguration-0' => "N'existe pas",
 'exif-componentsconfiguration-5' => 'V',
 
 'exif-exposureprogram-0' => 'Indéfini',
 'exif-exposureprogram-1' => 'Manuel',
 'exif-exposureprogram-2' => 'Programme normal',
-'exif-exposureprogram-3' => 'Priorité à l’ouverture',
-'exif-exposureprogram-4' => 'Priorité à l’obturateur',
+'exif-exposureprogram-3' => "Priorité à l'ouverture",
+'exif-exposureprogram-4' => "Priorité à l'obturateur",
 'exif-exposureprogram-5' => 'Programme création (préférence à la profondeur de champ)',
-'exif-exposureprogram-6' => 'Programme action (préférence à la vitesse d’obturation)',
+'exif-exposureprogram-6' => "Programme action (préférence à la vitesse d'obturation)",
 'exif-exposureprogram-7' => 'Mode portrait (pour clichés de près avec arrière-plan flou)',
 'exif-exposureprogram-8' => 'Mode paysage (pour des clichés de paysages nets)',
 
@@ -3628,8 +3657,8 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-gpsmeasuremode-3' => 'Mesure à 3 dimensions',
 
 # Pseudotags used for GPSSpeedRef
-'exif-gpsspeed-k' => 'Kilomètres à l’heure',
-'exif-gpsspeed-m' => 'Milles à l’heure',
+'exif-gpsspeed-k' => "Kilomètres à l'heure",
+'exif-gpsspeed-m' => "Milles à l'heure",
 'exif-gpsspeed-n' => 'Nœud',
 
 # Pseudotags used for GPSDestDistanceRef
@@ -3688,11 +3717,11 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'exif-urgency-normal' => 'Normale ($1)',
 'exif-urgency-low' => 'Faible ($1)',
 'exif-urgency-high' => 'Haute ($1)',
-'exif-urgency-other' => 'Urgence définie par l’utilisateur ($1)',
+'exif-urgency-other' => "Urgence définie par l'utilisateur ($1)",
 
 # External editor support
 'edit-externally' => 'Modifier ce fichier en utilisant une application externe',
-'edit-externally-help' => '(Consulter [//www.mediawiki.org/wiki/Manual:External_editors/fr les instructions d’installation] pour plus d’informations)',
+'edit-externally-help' => "(Consulter [//www.mediawiki.org/wiki/Manual:External_editors/fr les instructions d'installation] pour plus d'informations)",
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'tout',
@@ -3701,8 +3730,8 @@ Les autres liens sur la même ligne sont considérés comme des exceptions, par
 'limitall' => 'tous',
 
 # E-mail address confirmation
-'confirmemail' => 'Confirmer l’adresse de courriel',
-'confirmemail_noemail' => 'Vous n’avez pas défini une adresse de courriel valide dans vos [[Special:Preferences|préférences]].',
+'confirmemail' => "Confirmer l'adresse de courriel",
+'confirmemail_noemail' => "Vous n'avez pas défini une adresse de courriel valide dans vos [[Special:Preferences|préférences]].",
 'confirmemail_text' => 'Ce wiki nécessite la vérification de votre adresse de courriel avant de pouvoir utiliser toute fonction de messagerie.
 Utilisez le bouton ci-dessous pour envoyer un courriel de confirmation à votre adresse.
 Le courriel inclura un lien comportant un code à usage unique et limité dans le temps ;
@@ -3711,39 +3740,39 @@ chargez ce lien dans votre navigateur pour confirmer que votre adresse de courri
 si vous venez de créer votre compte, veuillez attendre quelques minutes que le courriel arrive avant de demander un nouveau code.',
 'confirmemail_send' => 'Envoyer un code de confirmation',
 'confirmemail_sent' => 'Courriel de confirmation envoyé',
-'confirmemail_oncreate' => 'Un code de confirmation a été envoyé à votre adresse de courriel.
-Ce code n’est pas requis pour vous identifier sur ce wiki, mais vous devrez le fournir pour activer toute fonction de messagerie.',
-'confirmemail_sendfailed' => '{{SITENAME}} n’a pas pu vous envoyer le courriel de confirmation.
+'confirmemail_oncreate' => "Un code de confirmation a été envoyé à votre adresse de courriel.
+Ce code n'est pas requis pour vous identifier sur ce wiki, mais vous devrez le fournir pour activer toute fonction de messagerie.",
+'confirmemail_sendfailed' => "{{SITENAME}} n'a pas pu vous envoyer le courriel de confirmation.
 Veuillez vérifiez que votre adresse de courriel ne comprend aucun caractère incorrect.
 
-Le programme d’envoi de courriel a retourné l’indication suivante : $1',
+Le programme d'envoi de courriel a retourné l'indication suivante : $1",
 'confirmemail_invalid' => 'Code de confirmation incorrect.
 Celui-ci a peut-être expiré.',
 'confirmemail_needlogin' => 'Vous devez vous $1 pour confirmer votre adresse de courriel.',
 'confirmemail_success' => 'Votre adresse de courriel a été confirmée.
 Vous pouvez maintenant vous [[Special:UserLogin|{{MediaWiki:Loginreqlink}}]] et profiter du wiki.',
 'confirmemail_loggedin' => 'Votre adresse de courriel est maintenant confirmée.',
-'confirmemail_error' => 'Un problème est survenu lors de l’enregistrement de votre confirmation.',
-'confirmemail_subject' => 'Confirmation d’adresse de courriel pour {{SITENAME}}',
-'confirmemail_body' => 'Quelqu’un, probablement vous, à partir de l’adresse IP $1,
+'confirmemail_error' => "Un problème est survenu lors de l'enregistrement de votre confirmation.",
+'confirmemail_subject' => "Confirmation d'adresse de courriel pour {{SITENAME}}",
+'confirmemail_body' => "Quelqu'un, probablement vous, à partir de l'adresse IP $1,
 a enregistré un compte « $2 » avec cette adresse de courriel
 sur le site {{SITENAME}}.
 
 Pour confirmer que ce compte vous appartient vraiment et afin
-dactiver les fonctions de messagerie sur {{SITENAME}},
+d'activer les fonctions de messagerie sur {{SITENAME}},
 veuillez suivre ce lien dans votre navigateur :
 
 $3
 
-Si vous n’avez *pas* enregistré ce compte, n’ouvrez pas ce lien ;
-vous pouvez suivre lautre lien ci-dessous pour annuler la
+Si vous n'avez *pas* enregistré ce compte, n'ouvrez pas ce lien ;
+vous pouvez suivre l'autre lien ci-dessous pour annuler la
 confirmation de votre adresse courriel :
 
 $5
 
-Ce code de confirmation expirera le $4.',
-'confirmemail_body_changed' => 'Quelqu’un, probablement vous, à partir de l’adresse IP $1,
-a modifié ladresse de courriel associée au compte « $2 » de {{SITENAME}}
+Ce code de confirmation expirera le $4.",
+'confirmemail_body_changed' => "Quelqu'un, probablement vous, à partir de l'adresse IP $1,
+a modifié l'adresse de courriel associée au compte « $2 » de {{SITENAME}}
 en cette adresse.
 
 Pour confirmer que ce compte vous appartient vraiment et afin
@@ -3752,14 +3781,14 @@ veuillez suivre ce lien dans votre navigateur :
 
 $3
 
-Si ce compte ne vous appartient *pas*, nouvrez pas ce lien ;
-vous pouvez suivre lautre lien ci-dessous pour annuler la
+Si ce compte ne vous appartient *pas*, n'ouvrez pas ce lien ;
+vous pouvez suivre l'autre lien ci-dessous pour annuler la
 confirmation de votre adresse courriel :
 
 $5
 
-Ce code de confirmation expirera le $4.',
-'confirmemail_body_set' => 'Quelqu’un, probablement vous, de l’adresse IP $1, a modifié l’adresse de courriel du compte « $2 » en celle-ci sur {{SITENAME}}.
+Ce code de confirmation expirera le $4.",
+'confirmemail_body_set' => "Quelqu'un, probablement vous, de l'adresse IP $1, a modifié l'adresse de courriel du compte « $2 » en celle-ci sur {{SITENAME}}.
 
 Pour confirmer que ce compte vous appartient et réactiver les fonctions de courriel sur {{SITENAME}}, ouvrez ce lien dans votre navigateur Web :
 
@@ -3767,15 +3796,16 @@ $3
 
 Ce code de confirmation expirera le $4.
 
-Si le compte ne vous appartient PAS, suivez plutôt ce lien pour annuler la confirmation de ladresse de courriel :
+Si le compte ne vous appartient PAS, suivez plutôt ce lien pour annuler la confirmation de l'adresse de courriel :
 
-$5',
+$5",
 'confirmemail_invalidated' => 'Confirmation de l’adresse courriel annulée',
 'invalidateemail' => 'Annuler la confirmation de l’adresse de courriel',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[La transclusion interwiki est désactivée]',
 'scarytranscludefailed' => '[La récupération de modèle a échoué pour $1]',
+'scarytranscludefailed-httpstatus' => '[Échec de la récupération du modèle pour  $1 : HTTP  $2 ]',
 'scarytranscludetoolong' => '[L’URL est trop longue]',
 
 # Delete conflict
@@ -3938,7 +3968,7 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l’éditeur normal]].',
 'version-specialpages' => 'Pages spéciales',
 'version-parserhooks' => 'Greffons de l’analyseur syntaxique',
 'version-variables' => 'Variables',
-'version-antispam' => 'Prévention du pourriel',
+'version-antispam' => 'Prévention du spam',
 'version-skins' => 'Habillages',
 'version-other' => 'Divers',
 'version-mediahandlers' => 'Manipulateurs de médias',
@@ -3952,18 +3982,19 @@ Vous pouvez aussi [[Special:EditWatchlist|utiliser l’éditeur normal]].',
 'version-license' => 'Licence',
 'version-poweredby-credits' => "Ce wiki fonctionne grâce à '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'autres',
-'version-license-info' => "MediaWiki est un logiciel libre, vous pouvez le redistribuer et / ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre choix) toute version ultérieure.
+'version-credits-summary' => 'Nous tenons à remercier les personnes suivantes pour leur contribution à  [[Special:Version|MediaWiki]].',
+'version-license-info' => 'MediaWiki est un logiciel libre, vous pouvez le redistribuer ou le modifier selon les termes de la Licence Publique Générale GNU telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre choix) toute version ultérieure.
 
-MediaWiki est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION A UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU pour plus de détails.
+MediaWiki est distribué dans l’espoir qu’il sera utile, mais SANS AUCUNE GARANTIE, sans même la garantie implicite de COMMERCIALISATION ou D’ADAPTATION À UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU pour plus de détails.
 
-Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licence Publique Générale GNU] avec ce programme, sinon, écrivez à la Free Software Foundation, Inc, 51, rue Franklin, cinquième étage, Boston, MA 02110-1301, États-Unis ou [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lisez-la en ligne].",
+Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licence Publique Générale GNU] avec ce programme, sinon, écrivez à la Free Software Foundation, Inc., 51, rue Franklin, cinquième étage, Boston, MA 02110-1301, États-Unis ou [//www.gnu.org/licenses/old-licenses/gpl-2.0.html lisez-la en ligne].',
 'version-software' => 'Logiciels installés',
 'version-software-product' => 'Produit',
 'version-software-version' => 'Version',
 'version-entrypoints' => 'URL des points d’entrée',
-'version-entrypoints-header-entrypoint' => "Point d'entrée",
+'version-entrypoints-header-entrypoint' => 'Point d’entrée',
 'version-entrypoints-header-url' => 'URL',
-'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d\'article]',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin darticle]',
 'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath Chemin de script]',
 
 # Special:FilePath
@@ -3992,7 +4023,7 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 * <span class="mw-specialpagecached">Pages spéciales seulement en cache (pourraient être désuètes).</span>',
 'specialpages-group-maintenance' => 'Rapports de maintenance',
 'specialpages-group-other' => 'Autres pages spéciales',
-'specialpages-group-login' => 'S’identifier / s’inscrire',
+'specialpages-group-login' => "S'identifier / s'inscrire",
 'specialpages-group-changes' => 'Modifications récentes et journaux',
 'specialpages-group-media' => 'Rapports et import de fichiers médias',
 'specialpages-group-users' => 'Utilisateurs et droits rattachés',
@@ -4079,10 +4110,10 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'logentry-suppress-revision' => "$1 a secrètement modifié la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
 'logentry-suppress-event-legacy' => '$1 a secrètement modifié la visibilité des événements du journal sur $3',
 'logentry-suppress-revision-legacy' => '$1 a secrètement modifié la visibilité des révisions sur la page $3',
-'revdelete-content-hid' => 'contenu caché',
+'revdelete-content-hid' => 'contenu masqué',
 'revdelete-summary-hid' => 'résumé de modification caché',
 'revdelete-uname-hid' => "nom d'utilisateur caché",
-'revdelete-content-unhid' => 'contenu démasqué',
+'revdelete-content-unhid' => 'contenu révélé',
 'revdelete-summary-unhid' => 'résumé de modification démasqué',
 'revdelete-uname-unhid' => "nom d'utilisateur démasqué",
 'revdelete-restricted' => 'restrictions appliquées aux administrateurs',
@@ -4093,9 +4124,9 @@ Les images sont montrées dans leur pleine résolution, les autres fichiers sont
 'logentry-move-move_redir-noredirect' => '$1 a déplacé la page $3 vers $4 par-dessus une redirection sans laisser de redirection',
 'logentry-patrol-patrol' => '$1 a marqué la révision $4 de la page $3 comme relue',
 'logentry-patrol-patrol-auto' => '$1 a automatiquement marqué la révision $4 de la page $3 comme relue',
-'logentry-newusers-newusers' => '$1 a créé un compte utilisateur',
-'logentry-newusers-create' => '$1 a créé son compte utilisateur',
-'logentry-newusers-create2' => '$1 a créé un compte utilisateur $3',
+'logentry-newusers-newusers' => 'Le compte utilisateur $1 a été créé',
+'logentry-newusers-create' => 'Le compte utilisateur $1 a été créé',
+'logentry-newusers-create2' => 'Le compte utilisateur $3 a été créé par $1',
 'logentry-newusers-autocreate' => 'Le compte $1 a été créé automatiquement',
 'newuserlog-byemail' => 'mot de passe envoyé par courriel',
 
@@ -4115,6 +4146,10 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'feedback-bugcheck' => 'Formidable ! Vérifiez simplement que ce n’est pas un des [$1 bogues déjà connus].',
 'feedback-bugnew' => "J'ai vérifié. Signaler un nouveau bogue",
 
+# Search suggestions
+'searchsuggest-search' => 'Rechercher',
+'searchsuggest-containing' => 'contenant...',
+
 # API errors
 'api-error-badaccess-groups' => 'Vous n’êtes pas autorisé à verser des fichiers sur ce wiki.',
 'api-error-badtoken' => 'Erreur interne : mauvais « jeton ».',
@@ -4133,7 +4168,7 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 '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-hookaborted' => 'La modification que vous avez essayé de faire a été annulée par une extension.',
 'api-error-http' => 'Erreur interne : ne peut se connecter au serveur.',
 'api-error-illegal-filename' => 'Le nom du fichier n’est pas autorisé.',
 'api-error-internal-error' => 'Erreur interne : Quelque chose s’est mal passé lors du traitement de votre import sur le wiki.',
@@ -4141,7 +4176,7 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'api-error-missingparam' => 'Erreur interne : Il manque des paramètres dans la requête.',
 'api-error-missingresult' => 'Erreur interne : Nous n’avons pas pu déterminer si la copie avait réussi.',
 'api-error-mustbeloggedin' => 'Vous devez être connecté pour télécharger des fichiers.',
-'api-error-mustbeposted' => 'Il y a un bogue dans ce logiciel ; il n’utilise pas la méthode HTTP adéquate.',
+'api-error-mustbeposted' => 'Erreur interne : cette requête nécessite la méthode HTTP POST.',
 'api-error-noimageinfo' => 'Le téléversement a réussi, mais le serveur n’a pas donné d’informations sur le fichier.',
 'api-error-nomodule' => 'Erreur interne : aucun module de versement défini.',
 'api-error-ok-but-empty' => 'Erreur interne : Le serveur n’a pas répondu.',
@@ -4153,18 +4188,20 @@ Sinon, vous pouvez utiliser le formulaire simplifié ci-dessous. Votre commentai
 'api-error-unknown-error' => 'Erreur interne : Quelque chose a mal tourné lors du versement de votre fichier.',
 'api-error-unknown-warning' => 'Avertissement inconnu : $1',
 'api-error-unknownerror' => 'Erreur inconnue : « $1 ».',
-'api-error-uploaddisabled' => 'Le versement est désactivé sur ce wiki.',
+'api-error-uploaddisabled' => 'Le téléversement est désactivé sur ce wiki.',
 'api-error-verification-error' => 'Ce fichier peut être corrompu, ou son extension est incorrecte.',
 
 # Durations
-'duration-seconds' => '$1 {{PLURAL:$1|seconde|secondes}}',
-'duration-minutes' => '$1 {{PLURAL:$1|minute|minutes}}',
-'duration-hours' => '$1 {{PLURAL:$1|heure|heures}}',
-'duration-days' => '$1 {{PLURAL:$1|jour|jours}}',
-'duration-weeks' => '$1 {{PLURAL:$1|semaine|semaines}}',
-'duration-years' => '$1 {{PLURAL:$1|année|années}}',
-'duration-decades' => '$1 {{PLURAL:$1|décennie|décennies}}',
-'duration-centuries' => '$1 {{PLURAL:$1|siècle|siècles}}',
-'duration-millennia' => '$1 {{PLURAL:$1|millénaire|millénaires}}',
-
+'duration-seconds' => '$1 seconde{{PLURAL:$1||s}}',
+'duration-minutes' => '$1 minute{{PLURAL:$1||s}}',
+'duration-hours' => '$1 heure{{PLURAL:$1||s}}',
+'duration-days' => '$1 jour{{PLURAL:$1||s}}',
+'duration-weeks' => '$1 semaine{{PLURAL:$1||s}}',
+'duration-years' => '$1 année{{PLURAL:$1||s}}',
+'duration-decades' => '$1 décennie{{PLURAL:$1||s}}',
+'duration-centuries' => '$1 siècle{{PLURAL:$1||s}}',
+'duration-millennia' => '$1 millénaire{{PLURAL:$1||s}}',
+
+# Unknown messages
+'svg-long-error' => 'Fichier SVG non valide: $1',
 );
index fb1cf20..c5dd402 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Cajun French (Français cadien)
+/** Cajun French (français cadien)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -20,421 +20,420 @@ $fallback = 'fr';
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'Souligner les liens:',
-'tog-justify'                 => 'Égalisez les paragraphes',
-'tog-hideminor'               => 'Cachez les petits changements dans la liste des derniers changements',
-'tog-hidepatrolled'           => '↓ Cachez les petits changements dans la liste des derniers changements',
-'tog-newpageshidepatrolled'   => '↓Cache pages patrollés de la list des pages nouveau',
-'tog-extendwatchlist'         => 'Agrandir la liste des pages guettées pour montrer tous les changements',
-'tog-usenewrc'                => 'User les derniers changements improuvés (JavaScript)',
-'tog-numberheadings'          => 'Mettre les numéros sus les en-têtes',
-'tog-showtoolbar'             => "Montrer la barre d'outils des changements (JavaScript)",
-'tog-editondblclick'          => 'Faire un clic-double pour changer la page (JavaScript)',
-'tog-editsection'             => 'Changer une section avec les liens [changer]',
+'tog-underline' => 'Souligner les liens:',
+'tog-justify' => 'Égalisez les paragraphes',
+'tog-hideminor' => 'Cachez les petits changements dans la liste des derniers changements',
+'tog-hidepatrolled' => '↓ Cachez les petits changements dans la liste des derniers changements',
+'tog-newpageshidepatrolled' => '↓Cache pages patrollés de la list des pages nouveau',
+'tog-extendwatchlist' => 'Agrandir la liste des pages guettées pour montrer tous les changements',
+'tog-usenewrc' => 'User les derniers changements improuvés (JavaScript)',
+'tog-numberheadings' => 'Mettre les numéros sus les en-têtes',
+'tog-showtoolbar' => "Montrer la barre d'outils des changements (JavaScript)",
+'tog-editondblclick' => 'Faire un clic-double pour changer la page (JavaScript)',
+'tog-editsection' => 'Changer une section avec les liens [changer]',
 'tog-editsectiononrightclick' => 'Changer une section en faisant un clic droit sus son nom (JavaScript)',
-'tog-showtoc'                 => 'Montrer la table des matières (pour les pages avec plus que 3 têtes)',
-'tog-rememberpassword'        => 'Garder mon mot de passe (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations'          => 'Additionner les pages que je crée à ma liste des pages guettées',
-'tog-watchdefault'            => 'Additionner les pages que je change à ma liste des pages guettées',
-'tog-watchmoves'              => 'Additionner les pages que je renomme à ma liste des pages guettées',
-'tog-watchdeletion'           => "Additionner les pages que j'ôte à ma liste des pages guettées",
-'tog-minordefault'            => "Marquer tous les petits changements d'après le réglage",
-'tog-previewontop'            => "Montrer la vue d'avance au-dessus la boëte de changement",
-'tog-previewonfirst'          => "Montrer la vue d'avance au temps du premier changement",
-'tog-nocache'                 => 'Arrêter le cache des pages',
-'tog-enotifwatchlistpages'    => 'Envoyer un e-mail quand une de mes pages guettées est changée',
-'tog-enotifusertalkpages'     => 'Envoyer un e-mail quand ma page de discussion est changée',
-'tog-enotifminoredits'        => 'Envoyer un e-mail même pour les petits changements',
-'tog-enotifrevealaddr'        => "Montrer mon adresse e-mail dans les e-mails d'avertissement",
-'tog-shownumberswatching'     => 'Montrer le montant de guetteurs',
-'tog-oldsig'                  => '↓ Preview du signature existant:',
-'tog-fancysig'                => 'Signature brute (sans liens préparés)',
-'tog-externaleditor'          => 'Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur)',
-'tog-externaldiff'            => 'User un autre comparateur comme réglage ordinaire',
-'tog-showjumplinks'           => 'Mettre les "liens vites" en haut de la page',
-'tog-uselivepreview'          => "User la vue d'avance vite (JavaScript) (En assai)",
-'tog-forceeditsummary'        => "M'avertir quand j'ai laissé la boëte de commentaires vide",
-'tog-watchlisthideown'        => 'Cacher mes changements dans la liste des pages guettées',
-'tog-watchlisthidebots'       => 'Cacher les changements faits par les bots dans la liste des pages guettées',
-'tog-watchlisthideminor'      => 'Cacher les petits changements dans la liste des pages guettées',
-'tog-watchlisthideliu'        => 'Cacher édites de useurs anonymes du liste de pages guettées',
-'tog-watchlisthideanons'      => 'Cacher édites de useurs anonymes du liste de pages guettées',
-'tog-watchlisthidepatrolled'  => 'Cacher les changements faits par les bots dans la liste des pages guettées',
-'tog-nolangconversion'        => 'Arrêter le changement des différences de langue',
-'tog-ccmeonemails'            => "Envoyer une copie des e-mails que j'envoye aux autres useurs",
-'tog-diffonly'                => 'Couper la page sous les diffs',
-
-'underline-always'  => 'Tout le temps',
-'underline-never'   => 'Jamais',
+'tog-showtoc' => 'Montrer la table des matières (pour les pages avec plus que 3 têtes)',
+'tog-rememberpassword' => 'Garder mon mot de passe (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-watchcreations' => 'Additionner les pages que je crée à ma liste des pages guettées',
+'tog-watchdefault' => 'Additionner les pages que je change à ma liste des pages guettées',
+'tog-watchmoves' => 'Additionner les pages que je renomme à ma liste des pages guettées',
+'tog-watchdeletion' => "Additionner les pages que j'ôte à ma liste des pages guettées",
+'tog-minordefault' => "Marquer tous les petits changements d'après le réglage",
+'tog-previewontop' => "Montrer la vue d'avance au-dessus la boëte de changement",
+'tog-previewonfirst' => "Montrer la vue d'avance au temps du premier changement",
+'tog-nocache' => 'Arrêter le cache des pages',
+'tog-enotifwatchlistpages' => 'Envoyer un e-mail quand une de mes pages guettées est changée',
+'tog-enotifusertalkpages' => 'Envoyer un e-mail quand ma page de discussion est changée',
+'tog-enotifminoredits' => 'Envoyer un e-mail même pour les petits changements',
+'tog-enotifrevealaddr' => "Montrer mon adresse e-mail dans les e-mails d'avertissement",
+'tog-shownumberswatching' => 'Montrer le montant de guetteurs',
+'tog-oldsig' => '↓ Preview du signature existant:',
+'tog-fancysig' => 'Signature brute (sans liens préparés)',
+'tog-externaleditor' => 'Utiliser par défaut un éditeur de texte externe (pour les utilisateurs avancés, nécessite des réglages spécifiques sur votre ordinateur)',
+'tog-externaldiff' => 'User un autre comparateur comme réglage ordinaire',
+'tog-showjumplinks' => 'Mettre les "liens vites" en haut de la page',
+'tog-uselivepreview' => "User la vue d'avance vite (JavaScript) (En assai)",
+'tog-forceeditsummary' => "M'avertir quand j'ai laissé la boëte de commentaires vide",
+'tog-watchlisthideown' => 'Cacher mes changements dans la liste des pages guettées',
+'tog-watchlisthidebots' => 'Cacher les changements faits par les bots dans la liste des pages guettées',
+'tog-watchlisthideminor' => 'Cacher les petits changements dans la liste des pages guettées',
+'tog-watchlisthideliu' => 'Cacher édites de useurs anonymes du liste de pages guettées',
+'tog-watchlisthideanons' => 'Cacher édites de useurs anonymes du liste de pages guettées',
+'tog-watchlisthidepatrolled' => 'Cacher les changements faits par les bots dans la liste des pages guettées',
+'tog-ccmeonemails' => "Envoyer une copie des e-mails que j'envoye aux autres useurs",
+'tog-diffonly' => 'Couper la page sous les diffs',
+
+'underline-always' => 'Tout le temps',
+'underline-never' => 'Jamais',
 'underline-default' => "D'après le réglage du navigateur",
 
 # Dates
-'sunday'        => 'dimanche',
-'monday'        => 'lundi',
-'tuesday'       => 'mardi',
-'wednesday'     => 'mercredi',
-'thursday'      => 'jeudi',
-'friday'        => 'vendredi',
-'saturday'      => 'samedi',
-'sun'           => 'dim',
-'mon'           => 'lun',
-'tue'           => 'mar',
-'wed'           => 'mer',
-'thu'           => 'jeu',
-'fri'           => 'ven',
-'sat'           => 'sam',
-'january'       => 'de janvier',
-'february'      => 'de février',
-'march'         => 'de mars',
-'april'         => "d'avril",
-'may_long'      => 'de mai',
-'june'          => 'de juin',
-'july'          => 'de juliette',
-'august'        => "d'août",
-'september'     => 'de septembre',
-'october'       => "d'octobre",
-'november'      => 'de novembre',
-'december'      => 'de décembre',
-'january-gen'   => 'janvier',
-'february-gen'  => 'février',
-'march-gen'     => 'mars',
-'april-gen'     => 'avril',
-'may-gen'       => 'mai',
-'june-gen'      => 'juin',
-'july-gen'      => 'juliette',
-'august-gen'    => 'août',
+'sunday' => 'dimanche',
+'monday' => 'lundi',
+'tuesday' => 'mardi',
+'wednesday' => 'mercredi',
+'thursday' => 'jeudi',
+'friday' => 'vendredi',
+'saturday' => 'samedi',
+'sun' => 'dim',
+'mon' => 'lun',
+'tue' => 'mar',
+'wed' => 'mer',
+'thu' => 'jeu',
+'fri' => 'ven',
+'sat' => 'sam',
+'january' => 'de janvier',
+'february' => 'de février',
+'march' => 'de mars',
+'april' => "d'avril",
+'may_long' => 'de mai',
+'june' => 'de juin',
+'july' => 'de juliette',
+'august' => "d'août",
+'september' => 'de septembre',
+'october' => "d'octobre",
+'november' => 'de novembre',
+'december' => 'de décembre',
+'january-gen' => 'janvier',
+'february-gen' => 'février',
+'march-gen' => 'mars',
+'april-gen' => 'avril',
+'may-gen' => 'mai',
+'june-gen' => 'juin',
+'july-gen' => 'juliette',
+'august-gen' => 'août',
 'september-gen' => 'septembre',
-'october-gen'   => 'octobre',
-'november-gen'  => 'novembre',
-'december-gen'  => 'décembre',
-'jan'           => 'jan',
-'feb'           => 'fév',
-'mar'           => 'mar',
-'apr'           => 'avr',
-'may'           => 'mai',
-'jun'           => 'jui',
-'jul'           => 'jul',
-'aug'           => 'aoû',
-'sep'           => 'sep',
-'oct'           => 'oct',
-'nov'           => 'nov',
-'dec'           => 'déc',
+'october-gen' => 'octobre',
+'november-gen' => 'novembre',
+'december-gen' => 'décembre',
+'jan' => 'jan',
+'feb' => 'fév',
+'mar' => 'mar',
+'apr' => 'avr',
+'may' => 'mai',
+'jun' => 'jui',
+'jul' => 'jul',
+'aug' => 'aoû',
+'sep' => 'sep',
+'oct' => 'oct',
+'nov' => 'nov',
+'dec' => 'déc',
 
 # Categories related messages
-'pagecategories'        => '{{PLURAL:$1|Classe|Classes}}',
-'category_header'       => 'Articles dans classe "$1"',
-'subcategories'         => 'Sous-classes',
+'pagecategories' => '{{PLURAL:$1|Classe|Classes}}',
+'category_header' => 'Articles dans classe "$1"',
+'subcategories' => 'Sous-classes',
 'category-media-header' => 'Média dans classe "$1"',
-'category-empty'        => "''À présent, cette classe a ni articles ni média.''",
+'category-empty' => "''À présent, cette classe a ni articles ni média.''",
 
-'about'         => 'Info',
-'article'       => 'Page des matières',
-'newwindow'     => '(va ouverre une nouvelle fenêtre)',
-'cancel'        => 'Arrêter',
+'about' => 'Info',
+'article' => 'Page des matières',
+'newwindow' => '(va ouverre une nouvelle fenêtre)',
+'cancel' => 'Arrêter',
 'moredotdotdot' => 'Plus...',
-'mypage'        => 'Ma page',
-'mytalk'        => 'Ma page de discussion',
-'anontalk'      => 'Discussion avec cette adresse IP',
-'navigation'    => 'Navigation',
+'mypage' => 'Ma page',
+'mytalk' => 'Ma page de discussion',
+'anontalk' => 'Discussion avec cette adresse IP',
+'navigation' => 'Navigation',
 
 # Cologne Blue skin
-'qbfind'         => 'Charcher',
-'qbbrowse'       => 'Regarder',
-'qbedit'         => 'Changer',
-'qbpageoptions'  => 'Page de choix',
-'qbpageinfo'     => "Page d'information",
-'qbmyoptions'    => 'Mes options',
+'qbfind' => 'Charcher',
+'qbbrowse' => 'Regarder',
+'qbedit' => 'Changer',
+'qbpageoptions' => 'Page de choix',
+'qbpageinfo' => "Page d'information",
+'qbmyoptions' => 'Mes options',
 'qbspecialpages' => 'Pages espéciales',
-'faq'            => 'Questions Communes',
-'faqpage'        => 'Project:Questions Communes',
+'faq' => 'Questions Communes',
+'faqpage' => 'Project:Questions Communes',
 
 # Vector skin
-'vector-action-delete'  => 'Supprimer',
+'vector-action-delete' => 'Supprimer',
 'vector-action-protect' => 'Protéger',
 
-'errorpagetitle'    => 'Erreur',
-'returnto'          => 'Retourner back à la page $1.',
-'tagline'           => 'Un article de {{SITENAME}}',
-'help'              => 'Aide',
-'search'            => 'Charcher',
-'searchbutton'      => 'Charcher',
-'go'                => 'Aller',
-'searcharticle'     => 'Aller',
-'history'           => 'Changements',
-'history_short'     => 'Changements',
-'updatedmarker'     => 'changé depuis ma dernière visite',
-'printableversion'  => 'Version imprimable',
-'permalink'         => 'Lien permanent',
-'print'             => 'Imprimer',
-'edit'              => 'Changer',
-'editthispage'      => 'Faire un changement',
-'delete'            => 'Supprimer',
-'deletethispage'    => 'Supprimer cette page',
-'undelete_short'    => 'Rétablir {{PLURAL:$1|un changement|$1 changements}}',
-'protect'           => 'Protéger',
-'protect_change'    => 'Changer le niveau de protection',
-'protectthispage'   => 'Protéger cette page',
-'unprotect'         => 'déprotéger',
+'errorpagetitle' => 'Erreur',
+'returnto' => 'Retourner back à la page $1.',
+'tagline' => 'Un article de {{SITENAME}}',
+'help' => 'Aide',
+'search' => 'Charcher',
+'searchbutton' => 'Charcher',
+'go' => 'Aller',
+'searcharticle' => 'Aller',
+'history' => 'Changements',
+'history_short' => 'Changements',
+'updatedmarker' => 'changé depuis ma dernière visite',
+'printableversion' => 'Version imprimable',
+'permalink' => 'Lien permanent',
+'print' => 'Imprimer',
+'edit' => 'Changer',
+'editthispage' => 'Faire un changement',
+'delete' => 'Supprimer',
+'deletethispage' => 'Supprimer cette page',
+'undelete_short' => 'Rétablir {{PLURAL:$1|un changement|$1 changements}}',
+'protect' => 'Protéger',
+'protect_change' => 'Changer le niveau de protection',
+'protectthispage' => 'Protéger cette page',
+'unprotect' => 'déprotéger',
 'unprotectthispage' => 'Déprotéger cette page',
-'newpage'           => 'Nouvelle page',
-'talkpage'          => 'Discuter cette page',
-'talkpagelinktext'  => 'Discuter',
-'specialpage'       => 'Page espéciale',
-'personaltools'     => 'Outils personnels',
-'postcomment'       => 'Nouvelle section',
-'articlepage'       => "Voir l'article",
-'talk'              => 'Discussion',
-'views'             => 'Vues',
-'toolbox'           => "Boëte d'outils",
-'userpage'          => "Page d'useur",
-'projectpage'       => 'Page des projets',
-'imagepage'         => 'Page des images',
-'mediawikipage'     => 'Page des messages',
-'templatepage'      => 'Page de patron',
-'viewhelppage'      => "Page d'aide",
-'categorypage'      => 'Page des classes',
-'viewtalkpage'      => 'Page de discussion',
-'otherlanguages'    => 'Autres langues',
-'redirectedfrom'    => '(Envoyé ici de la page $1)',
-'redirectpagesub'   => 'Page de redirection',
-'lastmodifiedat'    => 'Cette page a été changée le $1 à $2.',
-'viewcount'         => 'Cette page a été visitée {{PLURAL:$1|$1 fois|$1 fois}}.',
-'protectedpage'     => 'Page protégée',
-'jumpto'            => 'Aller à:',
-'jumptosearch'      => 'charcher',
+'newpage' => 'Nouvelle page',
+'talkpage' => 'Discuter cette page',
+'talkpagelinktext' => 'Discuter',
+'specialpage' => 'Page espéciale',
+'personaltools' => 'Outils personnels',
+'postcomment' => 'Nouvelle section',
+'articlepage' => "Voir l'article",
+'talk' => 'Discussion',
+'views' => 'Vues',
+'toolbox' => "Boëte d'outils",
+'userpage' => "Page d'useur",
+'projectpage' => 'Page des projets',
+'imagepage' => 'Page des images',
+'mediawikipage' => 'Page des messages',
+'templatepage' => 'Page de patron',
+'viewhelppage' => "Page d'aide",
+'categorypage' => 'Page des classes',
+'viewtalkpage' => 'Page de discussion',
+'otherlanguages' => 'Autres langues',
+'redirectedfrom' => '(Envoyé ici de la page $1)',
+'redirectpagesub' => 'Page de redirection',
+'lastmodifiedat' => 'Cette page a été changée le $1 à $2.',
+'viewcount' => 'Cette page a été visitée {{PLURAL:$1|$1 fois|$1 fois}}.',
+'protectedpage' => 'Page protégée',
+'jumpto' => 'Aller à:',
+'jumptosearch' => 'charcher',
 
 # 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'            => "Qui c'est {{SITENAME}}?",
-'aboutpage'            => 'Project:Info',
-'copyright'            => 'Les matières sont avalable en accord avec $1',
-'copyrightpage'        => '{{ns:project}}:Protection de Droits',
-'currentevents'        => 'Événements',
-'currentevents-url'    => 'Project:Événements',
-'disclaimers'          => 'Avertissements',
-'disclaimerpage'       => 'Project:Avertissements ordinaires',
-'edithelp'             => 'Aide',
-'edithelppage'         => 'Help:Comment changer une page',
-'helppage'             => 'Help:Aide',
-'mainpage'             => 'Page Principale',
+'aboutsite' => "Qui c'est {{SITENAME}}?",
+'aboutpage' => 'Project:Info',
+'copyright' => 'Les matières sont avalable en accord avec $1',
+'copyrightpage' => '{{ns:project}}:Protection de Droits',
+'currentevents' => 'Événements',
+'currentevents-url' => 'Project:Événements',
+'disclaimers' => 'Avertissements',
+'disclaimerpage' => 'Project:Avertissements ordinaires',
+'edithelp' => 'Aide',
+'edithelppage' => 'Help:Comment changer une page',
+'helppage' => 'Help:Aide',
+'mainpage' => 'Page Principale',
 'mainpage-description' => 'Page Principale',
-'policy-url'           => 'Project:Régulations',
-'portal'               => 'Communauté',
-'portal-url'           => 'Project:Communauté',
-'privacy'              => 'Régulations des affaires privées',
-'privacypage'          => 'Project:Régulations des affaires privées',
+'policy-url' => 'Project:Régulations',
+'portal' => 'Communauté',
+'portal-url' => 'Project:Communauté',
+'privacy' => 'Régulations des affaires privées',
+'privacypage' => 'Project:Régulations des affaires privées',
 
-'badaccess'        => 'Erreur de permission',
+'badaccess' => 'Erreur de permission',
 'badaccess-group0' => 'Vous avez pas assez de permission de faire ça que vous demandez.',
 'badaccess-groups' => "L'action que vous avez demandé est juste pour les useurs dans une des groupes $1.",
 
-'versionrequired'     => 'Vous avez besoin de la version $1 de MediaWiki.',
+'versionrequired' => 'Vous avez besoin de la version $1 de MediaWiki.',
 'versionrequiredtext' => 'Vous avez besoin de la version $1 de MediaWiki pour utiliser cette page. Voir [[Special:Version]].',
 
-'retrievedfrom'           => 'Pris de "$1"',
-'youhavenewmessages'      => 'Vous avez $1 ($2).',
-'newmessageslink'         => 'nouveaux messages',
-'newmessagesdifflink'     => 'dernier changement',
+'retrievedfrom' => 'Pris de "$1"',
+'youhavenewmessages' => 'Vous avez $1 ($2).',
+'newmessageslink' => 'nouveaux messages',
+'newmessagesdifflink' => 'dernier changement',
 'youhavenewmessagesmulti' => 'Vous avez des nouveaux messages sus $1.',
-'editsection'             => 'changer',
-'editold'                 => 'changer',
-'viewsourcelink'          => 'Voir la source',
-'editsectionhint'         => 'Changer la section: $1',
-'toc'                     => 'Matières',
-'showtoc'                 => 'montrer',
-'hidetoc'                 => 'cacher',
-'thisisdeleted'           => 'Vous aimerait mieux voir ou rétablir $1?',
-'viewdeleted'             => 'Voir $1?',
-'restorelink'             => '{{PLURAL:$1|1 changement ôté|$1 changements ôtés}}',
-'feedlinks'               => 'Distribution RSS:',
-'feed-invalid'            => 'Mauvaise qualité de distribution RSS.',
-'red-link-title'          => "$1 (page n'existe pas)",
+'editsection' => 'changer',
+'editold' => 'changer',
+'viewsourcelink' => 'Voir la source',
+'editsectionhint' => 'Changer la section: $1',
+'toc' => 'Matières',
+'showtoc' => 'montrer',
+'hidetoc' => 'cacher',
+'thisisdeleted' => 'Vous aimerait mieux voir ou rétablir $1?',
+'viewdeleted' => 'Voir $1?',
+'restorelink' => '{{PLURAL:$1|1 changement ôté|$1 changements ôtés}}',
+'feedlinks' => 'Distribution RSS:',
+'feed-invalid' => 'Mauvaise qualité de distribution RSS.',
+'red-link-title' => "$1 (page n'existe pas)",
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Page',
-'nstab-user'     => 'Useur',
-'nstab-media'    => 'Média',
-'nstab-special'  => 'Page espécial',
-'nstab-project'  => 'Info',
-'nstab-image'    => 'Dossier',
+'nstab-main' => 'Page',
+'nstab-user' => 'Useur',
+'nstab-media' => 'Média',
+'nstab-special' => 'Page espécial',
+'nstab-project' => 'Info',
+'nstab-image' => 'Dossier',
 'nstab-template' => 'Patron',
-'nstab-help'     => 'Aide',
+'nstab-help' => 'Aide',
 'nstab-category' => 'Classe',
 
 # Main script and global functions
-'nosuchaction'      => 'Action inconnue',
-'nosuchactiontext'  => "L'action demandée dans l'adresse URL est pas reconnue par le wiki.",
+'nosuchaction' => 'Action inconnue',
+'nosuchactiontext' => "L'action demandée dans l'adresse URL est pas reconnue par le wiki.",
 'nosuchspecialpage' => 'Page espéciale inconnue',
 'nospecialpagetext' => 'La page que vous avez demandée est pas une bonne page espéciale.  Vous pouvez trouver une liste des bonnes pages espéciales dans la [[Special:SpecialPages|liste des pages espéciales]].',
 
 # General errors
-'error'                => 'Erreur',
-'databaseerror'        => "Erreur de la base d'information",
-'dberrortext'          => 'Erreur de syntaxe dans la base d\'information.
+'error' => 'Erreur',
+'databaseerror' => "Erreur de la base d'information",
+'dberrortext' => 'Erreur de syntaxe dans la base d\'information.
 
 Ça pourrait vouloir dire qu\'y a une imperfection dans le software.<br />
 La dernière demande faite dans la base d\'information était:
 <blockquote><tt>$1</tt></blockquote>
 dedans la fonction "<tt>$2</tt>".<br />
 MySQL a retourné l\'erreur "<tt>$3: $4</tt>".',
-'dberrortextcl'        => 'Erreur de syntaxe dans la base d\'information.
+'dberrortextcl' => 'Erreur de syntaxe dans la base d\'information.
 
 La dernière demande faite dans la base d\'information était:
 "$1"
 dedans la fonction "$2".
 MySQL a retourné l\'erreur "$3: $4".',
-'laggedslavemode'      => 'Avertissement: La page est peut-être pas renouvelée.',
-'readonly'             => "La base d'information est barrée.",
-'enterlockreason'      => "Écrire une raison pour le barrage avec un temps estimé
+'laggedslavemode' => 'Avertissement: La page est peut-être pas renouvelée.',
+'readonly' => "La base d'information est barrée.",
+'enterlockreason' => "Écrire une raison pour le barrage avec un temps estimé
 d'équand le barrage va être ôté.",
-'readonlytext'         => "À présent, la base d'information est barrée aux nouveaux changements, peut-être pour le soutien habituel de la base d'information, et ça va retourner à normal t'à l'heure.
+'readonlytext' => "À présent, la base d'information est barrée aux nouveaux changements, peut-être pour le soutien habituel de la base d'information, et ça va retourner à normal t'à l'heure.
 
 L'administrateur qui l'a barrée a donné cette explication: $1",
-'readonly_lag'         => "La base d'information s'a barré pendant que les serveurs de la base d'information rapprochont le maître.",
-'internalerror'        => 'Erreur internelle',
-'internalerror_info'   => 'Erreur intérieur: $1',
-'filecopyerror'        => 'Impossible de copier le dossier de "$1" à "$2".',
-'filerenameerror'      => 'Impossible de renommer le dossier de "$1" à "$2".',
-'filedeleteerror'      => 'Impossible d\'ôter le dossier "$1".',
+'readonly_lag' => "La base d'information s'a barré pendant que les serveurs de la base d'information rapprochont le maître.",
+'internalerror' => 'Erreur internelle',
+'internalerror_info' => 'Erreur intérieur: $1',
+'filecopyerror' => 'Impossible de copier le dossier de "$1" à "$2".',
+'filerenameerror' => 'Impossible de renommer le dossier de "$1" à "$2".',
+'filedeleteerror' => 'Impossible d\'ôter le dossier "$1".',
 'directorycreateerror' => 'Impossible de créer le directoire "$1".',
-'filenotfound'         => 'Impossible de trouver le dossier "$1".',
-'fileexistserror'      => 'Impossible d\'écrire dans le dossier "$1": le dossier est là',
-'unexpected'           => 'Valeur pas prévue: "$1"="$2".',
-'formerror'            => "Erreur: impossible d'envoyer l'application",
-'badarticleerror'      => 'Cette action peut pas être faite sus cette page.',
-'cannotdelete'         => "Impossible d'ôter la page ou le dossier choisi.  (Il est possible que quèqu'une d'autre l'a déjà ôté.)",
-'badtitle'             => 'Mauvais titre',
-'badtitletext'         => 'Le titre que vous avez demandé était pas bon, vide, ou y avait un mauvais titre entre-langue ou entre-wiki.  Ça pourrait avoir des caractères qui pouvont pas être usés dans les titres.',
-'perfcached'           => 'Cette information est en cache et pourrait pas être courante. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts'         => 'Cette information est en cache et le dernier changement a été fait $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'filenotfound' => 'Impossible de trouver le dossier "$1".',
+'fileexistserror' => 'Impossible d\'écrire dans le dossier "$1": le dossier est là',
+'unexpected' => 'Valeur pas prévue: "$1"="$2".',
+'formerror' => "Erreur: impossible d'envoyer l'application",
+'badarticleerror' => 'Cette action peut pas être faite sus cette page.',
+'cannotdelete' => "Impossible d'ôter la page ou le dossier choisi.  (Il est possible que quèqu'une d'autre l'a déjà ôté.)",
+'badtitle' => 'Mauvais titre',
+'badtitletext' => 'Le titre que vous avez demandé était pas bon, vide, ou y avait un mauvais titre entre-langue ou entre-wiki.  Ça pourrait avoir des caractères qui pouvont pas être usés dans les titres.',
+'perfcached' => 'Cette information est en cache et pourrait pas être courante. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcachedts' => 'Cette information est en cache et le dernier changement a été fait $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
 'querypage-no-updates' => "À présent, les renouvelages pour cette page sont barrés.  L'information ici va pas être renouvelée t'à l'heure.",
 'wrong_wfQuery_params' => 'Informaton incorrecte sus le wfQuery()<br />
 Fonction: $1<br />
 Demande: $2',
-'viewsource'           => 'Voir la source',
-'protectedpagetext'    => 'Cette page est barrée pour empêcher des changements.',
-'viewsourcetext'       => 'Vous pouvez voir et copier la source de cette page:',
-'protectedinterface'   => "Cette page crée le texte de l'interface pour le software, et est barrée pour empêcher l'abus.",
-'editinginterface'     => "'''Warning:''' You are editing a page which is used to provide interface text for the software.
+'viewsource' => 'Voir la source',
+'protectedpagetext' => 'Cette page est barrée pour empêcher des changements.',
+'viewsourcetext' => 'Vous pouvez voir et copier la source de cette page:',
+'protectedinterface' => "Cette page crée le texte de l'interface pour le software, et est barrée pour empêcher l'abus.",
+'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'            => '(Demande SQL cachée)',
-'cascadeprotected'     => 'Cette page est protégée parce qu’elle est incluse par {{PLURAL:$1|la page suivante, qui est protégée|les pages suivantes, qui sont protégées}} avec l’option « protection en cascade » activée :
+'sqlhidden' => '(Demande SQL cachée)',
+'cascadeprotected' => 'Cette page est protégée parce qu’elle est incluse par {{PLURAL:$1|la page suivante, qui est protégée|les pages suivantes, qui sont protégées}} avec l’option « protection en cascade » activée :
 $2',
-'namespaceprotected'   => 'Vous avez pas la permission de changer les pages dans l\'espace de noms "$1".',
-'ns-specialprotected'  => "Vous pouvez pas changer les pages dans l'espace de noms {{ns:special}}.",
+'namespaceprotected' => 'Vous avez pas la permission de changer les pages dans l\'espace de noms "$1".',
+'ns-specialprotected' => "Vous pouvez pas changer les pages dans l'espace de noms {{ns:special}}.",
 
 # Login and logout pages
-'logouttext'                 => "'''Vous êtes déconnecté asteur.'''
+'logouttext' => "'''Vous êtes déconnecté asteur.'''
 
 Vous pouvez continuer à user {{SITENAME}} sans nom ou vous pouvez connecter encore une fois avec le même nom ou un autre nom.
 Notez: certaines pages pourriont être vues comme si vous êtes connecté, jusqu'à vous videz l'information de votre navigateur.",
-'welcomecreation'            => '== Bonjour, $1! ==
+'welcomecreation' => '== Bonjour, $1! ==
 
 Votre compte a été créé.  Oubliez pas de changer votre réglage sus {{SITENAME}}.',
-'yourname'                   => "Nom d'useur:",
-'yourpassword'               => 'Mot de passe:',
-'yourpasswordagain'          => 'Mot de passe encore:',
-'remembermypassword'         => 'Garder mon mot de passe dans cette browser (pour un maximum of $1 {{PLURAL:$1|jour|jours}})',
-'yourdomainname'             => 'Votre domaine:',
-'externaldberror'            => "Soit y avait une erreur avec la base d'information de certification extérieur, soit vous avez pas la permission de renouveler votre compte extérieur.",
-'login'                      => 'Connecter',
-'nav-login-createaccount'    => 'Connecter / créer un compte',
-'loginprompt'                => 'Il faut partir les cookies pour connecter à {{SITENAME}}.',
-'userlogin'                  => 'Connecter / créer un compte',
-'logout'                     => 'Déconnecter',
-'userlogout'                 => 'Déconnecter',
-'notloggedin'                => 'Pas connecté',
-'nologin'                    => "Vous avez pas de compte? '''$1'''.",
-'nologinlink'                => 'Créez un compte',
-'createaccount'              => 'Créer un compte',
-'gotaccount'                 => "Vous avez un compte déjà? '''$1'''.",
-'gotaccountlink'             => 'Connectez',
-'userlogin-resetlink'        => 'Oublié vôtre détailes de log in?',
-'createaccountmail'          => 'par e-mail',
-'badretype'                  => 'Les mots de passe que vous avez mis sont pas pareils.',
-'userexists'                 => "Le nom d'useur choisi est déjà usé.  Choissez donc un autre nom.",
-'loginerror'                 => "Erreur d'identification",
-'nocookiesnew'               => "Votre compte a été créé, mais vous êtes pas connecté.  {{SITENAME}} use les cookies pour connecter les useurs.  Partez les cookies et connectez avec votre nouveau nom d'useur et votre mot de passe, s'il vous plaît.",
-'nocookieslogin'             => '{{SITENAME}} use les cookies pour connecter les useurs.  Partez donc les cookies et assayez encore.',
-'nocookiesfornew'            => "Le conte d'useur n'était pas fait, à cause qu'on pouvait pas confirmer la source.  Ensurer que tu as des cookies, reload ce page et essayer encore.",
-'noname'                     => "Vous avez pas mis un bon nom d'useur.",
-'loginsuccesstitle'          => 'Vous êtes connecté',
-'loginsuccess'               => "'''Asteur vous êtes connecté à {{SITENAME}} comme \"\$1\".'''",
-'nosuchuser'                 => 'Y a aucun utilisateur avec le nom "$1".  Les noms d\'utilisateur respectent les majuscules et minuscules. Vérifiez l\'orthographe, ou créez un nouveau compte.',
-'nosuchusershort'            => 'Y a aucun useur avec le nom "$1".  Regardez donc l\'espellage.',
-'nouserspecified'            => "Il faut mettre un nom d'useur.",
-'login-userblocked'          => 'Cet useur est blockée.  Log in pas accépté.',
-'wrongpassword'              => "Mauvais mot de passe.  Assayez encore s'il vous plaît.",
-'wrongpasswordempty'         => "Le mot de passe était vide.  Assayez encore s'il vous plaît.",
-'passwordtooshort'           => "Votre mot de passe est soit pas bon ou trop court.  Un mot de passe devrait avoir au moins $1 caractères et être différent de votre nom d'useur.",
-'mailmypassword'             => 'Envoyer mon mot de passe par e-mail',
-'passwordremindertitle'      => 'Votre nouveau mot de passe sus {{SITENAME}}',
-'passwordremindertext'       => 'Quèqu\'une (peut-être vous, de l\'adresse IP $1) a demandé qu\'on vous envoye un nouveau mot de passe pour {{SITENAME}} ($4).  Le mot de passe pour useur "$2" est "$3" asteur.  Vous devrait connecter et changer votre mot de passe asteur.
+'yourname' => "Nom d'useur:",
+'yourpassword' => 'Mot de passe:',
+'yourpasswordagain' => 'Mot de passe encore:',
+'remembermypassword' => 'Garder mon mot de passe dans cette browser (pour un maximum of $1 {{PLURAL:$1|jour|jours}})',
+'yourdomainname' => 'Votre domaine:',
+'externaldberror' => "Soit y avait une erreur avec la base d'information de certification extérieur, soit vous avez pas la permission de renouveler votre compte extérieur.",
+'login' => 'Connecter',
+'nav-login-createaccount' => 'Connecter / créer un compte',
+'loginprompt' => 'Il faut partir les cookies pour connecter à {{SITENAME}}.',
+'userlogin' => 'Connecter / créer un compte',
+'logout' => 'Déconnecter',
+'userlogout' => 'Déconnecter',
+'notloggedin' => 'Pas connecté',
+'nologin' => "Vous avez pas de compte? '''$1'''.",
+'nologinlink' => 'Créez un compte',
+'createaccount' => 'Créer un compte',
+'gotaccount' => "Vous avez un compte déjà? '''$1'''.",
+'gotaccountlink' => 'Connectez',
+'userlogin-resetlink' => 'Oublié vôtre détailes de log in?',
+'createaccountmail' => 'par e-mail',
+'badretype' => 'Les mots de passe que vous avez mis sont pas pareils.',
+'userexists' => "Le nom d'useur choisi est déjà usé.  Choissez donc un autre nom.",
+'loginerror' => "Erreur d'identification",
+'nocookiesnew' => "Votre compte a été créé, mais vous êtes pas connecté.  {{SITENAME}} use les cookies pour connecter les useurs.  Partez les cookies et connectez avec votre nouveau nom d'useur et votre mot de passe, s'il vous plaît.",
+'nocookieslogin' => '{{SITENAME}} use les cookies pour connecter les useurs.  Partez donc les cookies et assayez encore.',
+'nocookiesfornew' => "Le conte d'useur n'était pas fait, à cause qu'on pouvait pas confirmer la source.  Ensurer que tu as des cookies, reload ce page et essayer encore.",
+'noname' => "Vous avez pas mis un bon nom d'useur.",
+'loginsuccesstitle' => 'Vous êtes connecté',
+'loginsuccess' => "'''Asteur vous êtes connecté à {{SITENAME}} comme \"\$1\".'''",
+'nosuchuser' => 'Y a aucun utilisateur avec le nom "$1".  Les noms d\'utilisateur respectent les majuscules et minuscules. Vérifiez l\'orthographe, ou créez un nouveau compte.',
+'nosuchusershort' => 'Y a aucun useur avec le nom "$1".  Regardez donc l\'espellage.',
+'nouserspecified' => "Il faut mettre un nom d'useur.",
+'login-userblocked' => 'Cet useur est blockée.  Log in pas accépté.',
+'wrongpassword' => "Mauvais mot de passe.  Assayez encore s'il vous plaît.",
+'wrongpasswordempty' => "Le mot de passe était vide.  Assayez encore s'il vous plaît.",
+'passwordtooshort' => "Votre mot de passe est soit pas bon ou trop court.  Un mot de passe devrait avoir au moins $1 caractères et être différent de votre nom d'useur.",
+'mailmypassword' => 'Envoyer mon mot de passe par e-mail',
+'passwordremindertitle' => 'Votre nouveau mot de passe sus {{SITENAME}}',
+'passwordremindertext' => 'Quèqu\'une (peut-être vous, de l\'adresse IP $1) a demandé qu\'on vous envoye un nouveau mot de passe pour {{SITENAME}} ($4).  Le mot de passe pour useur "$2" est "$3" asteur.  Vous devrait connecter et changer votre mot de passe asteur.
 
 Si quèqu\'une d\'autre a demandé ce mot de passe ou si vous vous rappelez de votre mot de passe et vous voulez p\'us le changer, vous pouvez ignorer ce message et continuer à user votre vieux mot de passe.',
-'noemail'                    => 'Y a aucune adresse e-mail pour l\'useur "$1".',
-'passwordsent'               => 'Un nouveau mot de passe a été envoyé à l\'adresse e-mail de l\'useur "$1".  Reconnectez donc après que vous l\'avez reçu.',
-'blocked-mailpassword'       => "Votre adresse IP est bloquée.  Pour empêcher l'abus, vous pouvez ni faire des changements ni user la fonction de rappel du mot de passe.",
-'eauthentsent'               => "Un message de confirmation a été envoyé à l'adresse e-mail choisie.  Avant qu'on peuve envoyer des autres e-mails à ce compte, il faut que vous suivez les instructions dans le message pour confirmer que le compte est le vôtre.",
-'throttled-mailpassword'     => "On a déjà envoyé un e-mail de rappel avec votre mot de passe dans les $1 dernières heures.  Pour empêcher l'abus, juste un seul e-mail de rappel va être envoyé en $1 heures.",
-'mailerror'                  => 'On pouvait pas envoyer votre e-mail: $1',
+'noemail' => 'Y a aucune adresse e-mail pour l\'useur "$1".',
+'passwordsent' => 'Un nouveau mot de passe a été envoyé à l\'adresse e-mail de l\'useur "$1".  Reconnectez donc après que vous l\'avez reçu.',
+'blocked-mailpassword' => "Votre adresse IP est bloquée.  Pour empêcher l'abus, vous pouvez ni faire des changements ni user la fonction de rappel du mot de passe.",
+'eauthentsent' => "Un message de confirmation a été envoyé à l'adresse e-mail choisie.  Avant qu'on peuve envoyer des autres e-mails à ce compte, il faut que vous suivez les instructions dans le message pour confirmer que le compte est le vôtre.",
+'throttled-mailpassword' => "On a déjà envoyé un e-mail de rappel avec votre mot de passe dans les $1 dernières heures.  Pour empêcher l'abus, juste un seul e-mail de rappel va être envoyé en $1 heures.",
+'mailerror' => 'On pouvait pas envoyer votre e-mail: $1',
 'acct_creation_throttle_hit' => "Ça fait de la peine, vous avez déjà créé $1 comptes.  Vous pouvez pas en créer d'autres.",
-'emailauthenticated'         => 'Votre adresse e-mail a été certifiée le $1.',
-'emailnotauthenticated'      => 'Votre adresse e-mail est pas encore certifiée.  On va pas envoyer des e-mails pour les fonctions suivantes.',
-'noemailprefs'               => 'Il faut donner une adresse e-mail pour partir ces fonctions.',
-'emailconfirmlink'           => 'Confirmez votre adresse e-mail',
-'invalidemailaddress'        => "L'adresse e-mail peut pas être acceptée parce que c'est pas bien écrit.  Mettez donc une bonne adresse ou laissez-lé vide.",
-'accountcreated'             => 'Compte créé',
-'accountcreatedtext'         => "Le compte d'useur pour $1 a été créé.",
-'loginlanguagelabel'         => 'Langue: $1',
+'emailauthenticated' => 'Votre adresse e-mail a été certifiée le $1.',
+'emailnotauthenticated' => 'Votre adresse e-mail est pas encore certifiée.  On va pas envoyer des e-mails pour les fonctions suivantes.',
+'noemailprefs' => 'Il faut donner une adresse e-mail pour partir ces fonctions.',
+'emailconfirmlink' => 'Confirmez votre adresse e-mail',
+'invalidemailaddress' => "L'adresse e-mail peut pas être acceptée parce que c'est pas bien écrit.  Mettez donc une bonne adresse ou laissez-lé vide.",
+'accountcreated' => 'Compte créé',
+'accountcreatedtext' => "Le compte d'useur pour $1 a été créé.",
+'loginlanguagelabel' => 'Langue: $1',
 
 # Change password dialog
-'resetpass'           => 'Rétablir le mot de passe du compte',
-'resetpass_announce'  => "Pour le moment, vous êtes connecté avec un mot de passe qu'a été envoyé par e-mail.  Pour finir de vous connecter, il faut créer un nouveau mot de passe ici:",
-'resetpass_text'      => '<!-- Mettez du texte ici -->',
-'resetpass_header'    => 'Rétablir le mot de passe',
-'resetpass_submit'    => 'Créer le mot de passe et connecter',
-'resetpass_success'   => 'Vous avez bien changé votre mot de passe!  On est après vous connecter...',
+'resetpass' => 'Rétablir le mot de passe du compte',
+'resetpass_announce' => "Pour le moment, vous êtes connecté avec un mot de passe qu'a été envoyé par e-mail.  Pour finir de vous connecter, il faut créer un nouveau mot de passe ici:",
+'resetpass_text' => '<!-- Mettez du texte ici -->',
+'resetpass_header' => 'Rétablir le mot de passe',
+'resetpass_submit' => 'Créer le mot de passe et connecter',
+'resetpass_success' => 'Vous avez bien changé votre mot de passe!  On est après vous connecter...',
 'resetpass_forbidden' => 'Vous pouvez pas changer votre mot de passe sus ce wiki ici.',
 
 # Edit page toolbar
-'bold_sample'     => 'Gras',
-'bold_tip'        => 'Gras',
-'italic_sample'   => 'Italique',
-'italic_tip'      => 'Italique',
-'link_sample'     => 'Nom du lien',
-'link_tip'        => 'Lien intérieur',
-'extlink_sample'  => 'http://www.example.com nom du lien',
-'extlink_tip'     => 'Lien extérieur (Oubliez pas de mettre http:// avant.)',
+'bold_sample' => 'Gras',
+'bold_tip' => 'Gras',
+'italic_sample' => 'Italique',
+'italic_tip' => 'Italique',
+'link_sample' => 'Nom du lien',
+'link_tip' => 'Lien intérieur',
+'extlink_sample' => 'http://www.example.com nom du lien',
+'extlink_tip' => 'Lien extérieur (Oubliez pas de mettre http:// avant.)',
 'headline_sample' => 'Sujet',
-'headline_tip'    => 'Sujet niveau 2',
-'nowiki_sample'   => 'Mettez du texte non-préparé ici',
-'nowiki_tip'      => 'Ignorez le code wiki',
-'image_sample'    => 'Exemple.jpg',
-'image_tip'       => 'Mettez un portrait',
-'media_sample'    => 'Exemple.ogg',
-'media_tip'       => 'Lien dossier',
-'sig_tip'         => 'Votre signature avec la date',
-'hr_tip'          => 'Ligne horizontale (Abusez-lé pas.)',
+'headline_tip' => 'Sujet niveau 2',
+'nowiki_sample' => 'Mettez du texte non-préparé ici',
+'nowiki_tip' => 'Ignorez le code wiki',
+'image_sample' => 'Exemple.jpg',
+'image_tip' => 'Mettez un portrait',
+'media_sample' => 'Exemple.ogg',
+'media_tip' => 'Lien dossier',
+'sig_tip' => 'Votre signature avec la date',
+'hr_tip' => 'Ligne horizontale (Abusez-lé pas.)',
 
 # Edit pages
-'summary'                          => 'Description:',
-'subject'                          => 'Sujet:',
-'minoredit'                        => "Ça ici, c'est un petit changement.",
-'watchthis'                        => 'Guetter cette page',
-'savearticle'                      => 'Sauver la page',
-'preview'                          => "Vue d'avance",
-'showpreview'                      => "Vue d'avance",
-'showlivepreview'                  => "Vue d'avance vite",
-'showdiff'                         => 'Montrer les changements',
-'anoneditwarning'                  => "'''Attention:''' Vous êtes pas connecté.  Votre adresse IP vas être sauvée dans la liste des changements pour cette page.",
-'missingsummary'                   => "'''Attention:'''  Vous avez pas mis de description.  Si vous cliquez le bouton \"Sauver\" encore, votre changement va être sauvé sans description.",
-'missingcommenttext'               => 'Mettez donc un commentaire en bas.',
-'missingcommentheader'             => "'''Attention :''' Vous avez pas mis de sujet pour ce commentaire. Si vous cliquez le bouton \"Sauver\" encore, votre changement va être sauvé sans sujet.",
-'summary-preview'                  => "Vue d'avance de la description:",
-'subject-preview'                  => "Vue d'avance du sujet:",
-'blockedtitle'                     => "L'useur est bloqué",
-'blockedtext'                      => "'''Votre compte d'useur (ou votre adresse IP) est bloqué.'''
+'summary' => 'Description:',
+'subject' => 'Sujet:',
+'minoredit' => "Ça ici, c'est un petit changement.",
+'watchthis' => 'Guetter cette page',
+'savearticle' => 'Sauver la page',
+'preview' => "Vue d'avance",
+'showpreview' => "Vue d'avance",
+'showlivepreview' => "Vue d'avance vite",
+'showdiff' => 'Montrer les changements',
+'anoneditwarning' => "'''Attention:''' Vous êtes pas connecté.  Votre adresse IP vas être sauvée dans la liste des changements pour cette page.",
+'missingsummary' => "'''Attention:'''  Vous avez pas mis de description.  Si vous cliquez le bouton \"Sauver\" encore, votre changement va être sauvé sans description.",
+'missingcommenttext' => 'Mettez donc un commentaire en bas.',
+'missingcommentheader' => "'''Attention :''' Vous avez pas mis de sujet pour ce commentaire. Si vous cliquez le bouton \"Sauver\" encore, votre changement va être sauvé sans sujet.",
+'summary-preview' => "Vue d'avance de la description:",
+'subject-preview' => "Vue d'avance du sujet:",
+'blockedtitle' => "L'useur est bloqué",
+'blockedtext' => "'''Votre compte d'useur (ou votre adresse IP) est bloqué.'''
 
 Le blocage a été fait par $1.  La raison donnée est ''$2''.
 
@@ -443,7 +442,7 @@ Le blocage a été fait par $1.  La raison donnée est ''$2''.
 * L'useur bloqué: $7
 
 Vous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour discuter le blocage.  Vous pouvez pas user la fonction 'envoyer un e-mail à cet useur' hormis que vous avez une adresse e-mail confirmée dans votre [[Special:Preferences|réglage de compte]] et vous avez la permission de l'user.  Votre adresse IP est $3, et le numéro du blocage est #$5.  Mettez donc cette information dans toutes vos demandes.",
-'autoblockedtext'                  => "Le système a bloqué votre adresse IP parce qu'alle a été usée par un autre useur qu'était bloqué par $1.
+'autoblockedtext' => "Le système a bloqué votre adresse IP parce qu'alle a été usée par un autre useur qu'était bloqué par $1.
 
 La raison donnée est: ''$2''
 
@@ -455,74 +454,76 @@ Vous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrat
 Notez donc que vous pouvez pas user la fonction 'envoyer un e-mail à cet useur' hormis que vous avez une adresse e-mail confirmée dans votre [[Special:Preferences|réglage de compte]] et vous avez la permission de l'user.
 
 Votre numéro de blocage est #$5.  Mettez donc cette information dans toutes vos demandes.",
-'whitelistedittext'                => 'Il faut $1 pour faire des changements.',
-'confirmedittext'                  => "Il faut confirmer votre adresse e-mail pour faire des changements.  Mettez et confirmez un adresse e-mail dans votre [[Special:Preferences|réglage de compte]], s'il vous plaît.",
-'nosuchsectiontitle'               => 'Aucune section pareille',
-'nosuchsectiontext'                => "Vous avez assayé de faire des changements dans une section qu'existe pas.",
-'loginreqtitle'                    => 'Il faut connecter.',
-'loginreqlink'                     => 'connecter',
-'loginreqpagetext'                 => 'Il faut $1 pour voir des autres pages.',
-'accmailtitle'                     => 'Mot de passe envoyé.',
-'accmailtext'                      => 'Le mot de passe pour "$1" a été envoyé à $2.',
-'newarticle'                       => '(Nouveau)',
-'newarticletext'                   => "Vous avez suit un lien à une page qu'existe pas encore.
+'whitelistedittext' => 'Il faut $1 pour faire des changements.',
+'confirmedittext' => "Il faut confirmer votre adresse e-mail pour faire des changements.  Mettez et confirmez un adresse e-mail dans votre [[Special:Preferences|réglage de compte]], s'il vous plaît.",
+'nosuchsectiontitle' => 'Aucune section pareille',
+'nosuchsectiontext' => "Vous avez assayé de faire des changements dans une section qu'existe pas.",
+'loginreqtitle' => 'Il faut connecter.',
+'loginreqlink' => 'connecter',
+'loginreqpagetext' => 'Il faut $1 pour voir des autres pages.',
+'accmailtitle' => 'Mot de passe envoyé.',
+'accmailtext' => 'Le mot de passe pour "$1" a été envoyé à $2.',
+'newarticle' => '(Nouveau)',
+'newarticletext' => "Vous avez suit un lien à une page qu'existe pas encore.
 Pour créer la page, mettez des mots dans la boëte en bas (voyez la [[{{MediaWiki:Helppage}}|page d'aide]] pour plus d'information).
 Si vous êtes ici par erreur, cliquez le bouton \"back\" sus votre navigateur.",
-'anontalkpagetext'                 => "----''Ça ici, c'est la page de discussion pour un useur sans nom qu'a pas encore créé un compte ou qui l'use pas.  Ça fait, il faut user l'adresse IP numérique pour l'identifier.  Une adresse comme ça pourrait être usée par plusieurs useurs.  Si vous êtes un useur sans nom et vous croyez que des messages sans rapport ont été envoyés à vous, [[Special:UserLogin|créer un compte ou connecter]] pour empêcher la confusion avec des autres useurs sans nom dans l'avenir.''",
-'noarticletext'                    => 'À présent, y a pas de texte sus cette page.
+'anontalkpagetext' => "----''Ça ici, c'est la page de discussion pour un useur sans nom qu'a pas encore créé un compte ou qui l'use pas.  Ça fait, il faut user l'adresse IP numérique pour l'identifier.  Une adresse comme ça pourrait être usée par plusieurs useurs.  Si vous êtes un useur sans nom et vous croyez que des messages sans rapport ont été envoyés à vous, [[Special:UserLogin|créer un compte ou connecter]] pour empêcher la confusion avec des autres useurs sans nom dans l'avenir.''",
+'noarticletext' => 'À présent, y a pas de texte sus cette page.
 Vous pouvez [[Special:Search/{{PAGENAME}}|charcher pour le titre de cette page]] dans des autres pages, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} charcher dans les notes parents], ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} changer cette page]</span>.',
-'clearyourcache'                   => "'''Notez:''' Après que vous avez sauvé votres changements, il foudra peut-être dépasser le cache de votre navigateur pour voir les changements.  '''Mozilla / Firefox / Safari:''' Tenez le bouton ''Shift'' en pèsant ''Reload'', ou pèsez ''Ctrl-Shift-R'' (''Cmd-Shift-R'' sus Apple Mac); '''IE:''' Tenez ''Ctrl'' en pèsant ''Refresh'', ou pèsez ''Ctrl-F5''; '''Konqueror:''' Simplement pèsez le bouton ''Reload'', ou pèsez ''F5''; Pour les useurs de '''Opera''', il foudra peut-être vider complètement le cache dans ''Tools→Preferences''.",
-'usercssyoucanpreview'             => "'''Conseil:''' Usez le bouton \"Vue d'avance\" pour tester votre nouvelle feuille CSS avant de la sauver.",
-'userjsyoucanpreview'              => "'''Conseil:''' Usez le bouton \"Vue d'avance\" pour tester votre nouvelle feuille JS avant de la sauver.",
-'usercsspreview'                   => "'''Rappelez-vous que vous êtes après regarder votre feuille CSS qu'a pas encore été sauvée!'''",
-'userjspreview'                    => "'''Rappelez-vous que vous êtes juste après regarder ou tester votre code JavaScript qu'a pas encore été sauvé!'''",
-'userinvalidcssjstitle'            => "'''Attention:''' Y a pas de style \"\$1\".  Rappelez-vous qu'il faut user les petites lettres dans le sujet des pages personnelles avec les extensions .css et .js.
+'clearyourcache' => "'''Notez:''' Après que vous avez sauvé votres changements, il foudra peut-être dépasser le cache de votre navigateur pour voir les changements.  '''Mozilla / Firefox / Safari:''' Tenez le bouton ''Shift'' en pèsant ''Reload'', ou pèsez ''Ctrl-Shift-R'' (''Cmd-Shift-R'' sus Apple Mac); '''IE:''' Tenez ''Ctrl'' en pèsant ''Refresh'', ou pèsez ''Ctrl-F5''; '''Konqueror:''' Simplement pèsez le bouton ''Reload'', ou pèsez ''F5''; Pour les useurs de '''Opera''', il foudra peut-être vider complètement le cache dans ''Tools→Preferences''.",
+'usercssyoucanpreview' => "'''Conseil:''' Usez le bouton \"Vue d'avance\" pour tester votre nouvelle feuille CSS avant de la sauver.",
+'userjsyoucanpreview' => "'''Conseil:''' Usez le bouton \"Vue d'avance\" pour tester votre nouvelle feuille JS avant de la sauver.",
+'usercsspreview' => "'''Rappelez-vous que vous êtes après regarder votre feuille CSS qu'a pas encore été sauvée!'''",
+'userjspreview' => "'''Rappelez-vous que vous êtes juste après regarder ou tester votre code JavaScript qu'a pas encore été sauvé!'''",
+'userinvalidcssjstitle' => "'''Attention:''' Y a pas de style \"\$1\".  Rappelez-vous qu'il faut user les petites lettres dans le sujet des pages personnelles avec les extensions .css et .js.
 Exemple:  {{ns:user}}:Foo/vector.css (bon)  {{ns:user}}:Foo/Vector.css (mauvais)",
-'updated'                          => '(Renouvelé)',
-'note'                             => "'''Notez:'''",
-'previewnote'                      => "'''Ça ici, c'est juste une vue d'avance; les changements ont pas encore été sauvés!'''",
-'previewconflict'                  => "Cette vue d'avance montre le texte qu'est dans la boëte de changements en haut comme ça serait si vous choisirait de le sauver.",
-'session_fail_preview'             => "'''Ça fait de la peine!  Votre changement pouvait pas être sauvé à cause d'une perte d'information de la session.  Assayez donc encore.  Si ça travaille pas toujours, assayez de déconnecter et reconnecter.'''",
-'session_fail_preview_html'        => "'''Ça fait de la peine!  Votre changement pouvait pas être sauvé à cause d'une perte d'information de votre session.'''
+'updated' => '(Renouvelé)',
+'note' => "'''Notez:'''",
+'previewnote' => "'''Ça ici, c'est juste une vue d'avance; les changements ont pas encore été sauvés!'''",
+'previewconflict' => "Cette vue d'avance montre le texte qu'est dans la boëte de changements en haut comme ça serait si vous choisirait de le sauver.",
+'session_fail_preview' => "'''Ça fait de la peine!  Votre changement pouvait pas être sauvé à cause d'une perte d'information de la session.  Assayez donc encore.  Si ça travaille pas toujours, assayez de déconnecter et reconnecter.'''",
+'session_fail_preview_html' => "'''Ça fait de la peine!  Votre changement pouvait pas être sauvé à cause d'une perte d'information de votre session.'''
 
 ''La vue d'avance est cachée pour empêcher les attaques JavaScript parce que ce wiki use le HTML brute.''
 
 '''Si ça ici est un changement juste, assayez donc encore.  Si ça travaille pas toujours, assayez de déconnecter et reconnecter.'''",
-'token_suffix_mismatch'            => "'''Votre changement pouvait pas être accepté parce que votre navigateur a mélangé les caractères de ponctuation dans l'indication des changements.  Le changement a été rejeté pour empêcher la corruption du texte de l'article.  Ça arrive des fois quand vous êtes après user un proxy sans nom.'''",
-'editing'                          => 'Changement de $1',
-'editingsection'                   => 'Changement de $1 (section)',
-'editingcomment'                   => 'Changement de $1 (remarque)',
-'editconflict'                     => 'Dispute de changement: $1',
-'explainconflict'                  => "Quèqu'une d'autre a changé cette page depuis vous avez commencé à la changer.
+'token_suffix_mismatch' => "'''Votre changement pouvait pas être accepté parce que votre navigateur a mélangé les caractères de ponctuation dans l'indication des changements.  Le changement a été rejeté pour empêcher la corruption du texte de l'article.  Ça arrive des fois quand vous êtes après user un proxy sans nom.'''",
+'editing' => 'Changement de $1',
+'editingsection' => 'Changement de $1 (section)',
+'editingcomment' => 'Changement de $1 (remarque)',
+'editconflict' => 'Dispute de changement: $1',
+'explainconflict' => "Quèqu'une d'autre a changé cette page depuis vous avez commencé à la changer.
 La boëtte de changements en haut contient le texte de la page comme c'est asteur.
 Vos changements sont montrés dans la boëtte de changements en bas.
 Il foudra que vous mettez vos changements dans le texte qu'est là asteur.
 '''Juste''' le texte dans la boëtte de changements en haut va être sauvé quand vous pèsez \"{{int:savearticle}}\".",
-'yourtext'                         => 'Votre texte',
-'storedversion'                    => 'Version sauvée',
-'nonunicodebrowser'                => "'''ATTENTION: Votre navigateur supporte pas les caractères unicode.  Une solution de peu de durée a été trouvée pour que vous peuvez changer des articles sans problèmes.  Les caractères qui sont pas ASCII va apparaître dans la boëte de changements comme des codes hexadécimaux.'''",
-'editingold'                       => "'''ATTENTION: Vous êtes après changer une vieille version de cette page.  Si vous le sauverait, vous perdrait n'importe quels changements faits depuis cette version.'''",
-'yourdiff'                         => 'Différences',
-'copyrightwarning'                 => "Notez donc que toutes les contributions à {{SITENAME}} sont considérées d'être libérées sous le $2 (voyez $1 pour les détails).  Si vous voulez pas que votre écriture soye changée sans pitié et redistribuée à volonté, mettez donc pas votre écriture ici.<br />  Vous êtes après nous promettre aussi que vous l'avez écrit vous-même ou que vous l'avez copié du domain public ou un autre ressource libre. ''' METTEZ PAS DE L'OUVRAGE SOUS COPYRIGHT ICI SANS PERMISSION!'''",
-'copyrightwarning2'                => "Notez donc que toutes les contributions à {{SITENAME}} pourriont être changées ou ôtées par des autres useurs.  Si vous voulez pas que votre écriture soye changée sans pitié, mettez donc pas votre écriture ici.<br />  Vous êtes après nous promettre aussi que vous l'avez écrit vous-même ou que vous l'avez copié du domain public ou un autre ressource libre (voyez $1 pour les détails). ''' METTEZ PAS DE L'OUVRAGE SOUS COPYRIGHT ICI SANS PERMISSION!'''",
-'longpageerror'                    => "'''ERREUR: Le texte que vous avec mis a une taille de $1 kilobytes qu'est plus grande que le maximum de $2 kilobytes.  Ça peut pas être sauvé.'''",
-'readonlywarning'                  => "'''ATTENTION: La base d'information a été barrée, ça fait, vous serez pas capable de sauver votres changements asteur.  Vous ferait mieux de copier et coller le texte dans un dossier texte et le sauver pour plus tard.'''",
-'protectedpagewarning'             => "'''ATTENTION: Cette page a été barrée pour que ça peuve être changée juste par les administrateurs.'''",
-'semiprotectedpagewarning'         => "'''Notez:'''  Cette page a été barrée pour que ça peuve être changé juste par les useurs connectés.",
-'cascadeprotectedwarning'          => "'''Attention :''' Cette page est protégée (ne peut être modifiée que par les administrateurs) parce qu’elle est incluse par {{PLURAL:$1|une page protégée|des pages protégées}} avec la protection en cascade activée :",
-'templatesused'                    => 'Patrons usés sus cette page:',
-'templatesusedpreview'             => "Patrons usés dans cette vue d'avance:",
-'templatesusedsection'             => 'Patrons usés dans cette section:',
-'template-protected'               => '(protégé)',
-'template-semiprotected'           => '(demi-protégé)',
-'edittools'                        => "<!-- Le texte que vous mettez ici va être montré sous les boëttes de changements ou d'import de dossier. -->",
-'nocreatetitle'                    => 'Création de page limitée',
-'nocreatetext'                     => "La création des pages est limitée.  Vous pouvez changer une page qu'a été déjà créée ou [[Special:UserLogin|connecter ou créer un compte]].",
-'nocreate-loggedin'                => 'Vous avez pas la permission de créer des nouvelles pages.',
-'permissionserrors'                => 'Erreur de permissions',
-'permissionserrorstext'            => 'Vous avez pas la permission de faire ça pour {{PLURAL:$1|cette raison|ces raisons}}:',
+'yourtext' => 'Votre texte',
+'storedversion' => 'Version sauvée',
+'nonunicodebrowser' => "'''ATTENTION: Votre navigateur supporte pas les caractères unicode.  Une solution de peu de durée a été trouvée pour que vous peuvez changer des articles sans problèmes.  Les caractères qui sont pas ASCII va apparaître dans la boëte de changements comme des codes hexadécimaux.'''",
+'editingold' => "'''ATTENTION: Vous êtes après changer une vieille version de cette page.  Si vous le sauverait, vous perdrait n'importe quels changements faits depuis cette version.'''",
+'yourdiff' => 'Différences',
+'copyrightwarning' => "Notez donc que toutes les contributions à {{SITENAME}} sont considérées d’être libérées sous le $2 (voyez $1 pour les détails). Si vous voulez pas que votre écriture soye changée sans pitié et redistribuée à volonté, mettez donc pas votre écriture ici.<br 
+/>Vous êtes après nous promettre aussi que vous l’avez écrit vous-même ou que vous l’avez copié du domaine public ou un autre ressource libre. ''' METTEZ PAS DE L’OUVRAGE SOUS COPYRIGHT ICI SANS PERMISSION !'''",
+'copyrightwarning2' => "Notez donc que toutes les contributions à {{SITENAME}} pourriont être changées ou ôtées par des autres useurs. Si vous voulez pas que votre écriture soye changée sans pitié, mettez donc pas votre écriture ici.<br 
+/>Vous êtes après nous promettre aussi que vous l’avez écrit vous-même ou que vous l’avez copié du domaine public ou un autre ressource libre (voyez $1 pour les détails). ''' METTEZ PAS DE L’OUVRAGE SOUS COPYRIGHT ICI SANS PERMISSION !'''",
+'longpageerror' => "'''ERREUR: Le texte que vous avec mis a une taille de $1 kilobytes qu'est plus grande que le maximum de $2 kilobytes.  Ça peut pas être sauvé.'''",
+'readonlywarning' => "'''ATTENTION: La base d'information a été barrée, ça fait, vous serez pas capable de sauver votres changements asteur.  Vous ferait mieux de copier et coller le texte dans un dossier texte et le sauver pour plus tard.'''",
+'protectedpagewarning' => "'''ATTENTION: Cette page a été barrée pour que ça peuve être changée juste par les administrateurs.'''",
+'semiprotectedpagewarning' => "'''Notez:'''  Cette page a été barrée pour que ça peuve être changé juste par les useurs connectés.",
+'cascadeprotectedwarning' => "'''Attention :''' Cette page est protégée (ne peut être modifiée que par les administrateurs) parce qu’elle est incluse par {{PLURAL:$1|une page protégée|des pages protégées}} avec la protection en cascade activée :",
+'templatesused' => 'Patrons usés sus cette page:',
+'templatesusedpreview' => "Patrons usés dans cette vue d'avance:",
+'templatesusedsection' => 'Patrons usés dans cette section:',
+'template-protected' => '(protégé)',
+'template-semiprotected' => '(demi-protégé)',
+'edittools' => "<!-- Le texte que vous mettez ici va être montré sous les boëttes de changements ou d'import de dossier. -->",
+'nocreatetitle' => 'Création de page limitée',
+'nocreatetext' => "La création des pages est limitée.  Vous pouvez changer une page qu'a été déjà créée ou [[Special:UserLogin|connecter ou créer un compte]].",
+'nocreate-loggedin' => 'Vous avez pas la permission de créer des nouvelles pages.',
+'permissionserrors' => 'Erreur de permissions',
+'permissionserrorstext' => 'Vous avez pas la permission de faire ça pour {{PLURAL:$1|cette raison|ces raisons}}:',
 'permissionserrorstext-withaction' => 'Vous avez pas la permission de faire ça pour {{PLURAL:$1|cette raison|ces raisons}}:',
-'recreate-moveddeleted-warn'       => "'''Attention: Vous êtes après recréer une page qu'a déjà été ôtée.'''
+'recreate-moveddeleted-warn' => "'''Attention: Vous êtes après recréer une page qu'a déjà été ôtée.'''
 
 Vous devrait considérer si c'est à propos de continuer à changer cette page.
 Les notes d'ôtage pour cette page sont données ici pour vous aider:",
@@ -536,96 +537,95 @@ Les notes d'ôtage pour cette page sont données ici pour vous aider:",
 'cantcreateaccounttitle' => 'Impossible de créer le compte',
 
 # History pages
-'viewpagelogs'        => 'Voir les notes pour cette page',
-'nohistory'           => 'Y a pas de changements pour cette page.',
-'currentrev'          => 'Version courante',
-'revisionasof'        => 'Version depuis le $1',
-'revision-info'       => 'Version depuis le $1 par $2',
-'previousrevision'    => '←Version avant',
-'nextrevision'        => 'Version après→',
+'viewpagelogs' => 'Voir les notes pour cette page',
+'nohistory' => 'Y a pas de changements pour cette page.',
+'currentrev' => 'Version courante',
+'revisionasof' => 'Version depuis le $1',
+'revision-info' => 'Version depuis le $1 par $2',
+'previousrevision' => '←Version avant',
+'nextrevision' => 'Version après→',
 'currentrevisionlink' => 'Version courante',
-'cur'                 => 'cour.',
-'next'                => 'prochain',
-'last'                => 'dernier',
-'page_first'          => 'premier',
-'page_last'           => 'dernier',
-'histlegend'          => 'Choisir une version: Marquez les ronds pour les versions que vous voulez comparer et cliquez "enter" ou le bouton en bas.<br />
+'cur' => 'cour.',
+'next' => 'prochain',
+'last' => 'dernier',
+'page_first' => 'premier',
+'page_last' => 'dernier',
+'histlegend' => 'Choisir une version: Marquez les ronds pour les versions que vous voulez comparer et cliquez "enter" ou le bouton en bas.<br />
 Clé: (cour.) = différence avec la version courante, (dernier) = différence avec la version avant, m = petit changement.',
-'histfirst'           => 'Premiers changements',
-'histlast'            => 'Derniers changements',
-'historyempty'        => '(vide)',
+'histfirst' => 'Premiers changements',
+'histlast' => 'Derniers changements',
+'historyempty' => '(vide)',
 
 # Revision feed
-'history-feed-title'          => 'Détails des changements',
-'history-feed-description'    => 'Détails des changements pour cette page sus le wiki',
+'history-feed-title' => 'Détails des changements',
+'history-feed-description' => 'Détails des changements pour cette page sus le wiki',
 'history-feed-item-nocomment' => '$1 le $2',
-'history-feed-empty'          => 'La page que vous avez demandé est pas là.
+'history-feed-empty' => 'La page que vous avez demandé est pas là.
 Ça a peut-être été ôté du wiki, ou renommé.
 Assayez de [[Special:Search|charcher dans le wiki]] pour des nouvelles pages.',
 
 # Revision deletion
-'rev-deleted-comment'         => '(remarque ôtée)',
-'rev-deleted-user'            => "(nom d'useur ôté)",
-'rev-deleted-event'           => '(message ôté)',
+'rev-deleted-comment' => '(remarque ôtée)',
+'rev-deleted-user' => "(nom d'useur ôté)",
+'rev-deleted-event' => '(message ôté)',
 'rev-deleted-text-permission' => "Cette page a été ôtée de la liste des pages publiques.  Il pourrait y avoir des détails dans les [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} notes d'ôtage].",
-'rev-deleted-text-view'       => "Cette version de la page a été ôtée de la liste des pages publiques.  Comme administrateur sus ce wiki vous pouvez le voir; il pourrait y avoir des détails dans les [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} notes d'ôtage].",
-'rev-delundel'                => 'montrer/cacher',
-'revisiondelete'              => 'Supprimer/rétablir les changements',
-'revdelete-nooldid-title'     => 'Aucun changement choisi',
-'revdelete-nooldid-text'      => 'Vous avez pas choisi le ou les changement(s) pour user cette fonction.',
-'revdelete-selected'          => "'''{{PLURAL:$2|Changement choisi|Changements choisis}} de [[:$1]]'''",
-'logdelete-selected'          => "'''{{PLURAL:$1|Événement de notes choisi|Événements de notes choisis}}:'''",
-'revdelete-text'              => "'''La liste des changements va sauver les versions ôtées, mais le public pourra pas voir certains morceaux de ces versions.'''
+'rev-deleted-text-view' => "Cette version de la page a été ôtée de la liste des pages publiques.  Comme administrateur sus ce wiki vous pouvez le voir; il pourrait y avoir des détails dans les [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} notes d'ôtage].",
+'rev-delundel' => 'montrer/cacher',
+'revisiondelete' => 'Supprimer/rétablir les changements',
+'revdelete-nooldid-title' => 'Aucun changement choisi',
+'revdelete-nooldid-text' => 'Vous avez pas choisi le ou les changement(s) pour user cette fonction.',
+'revdelete-selected' => "'''{{PLURAL:$2|Changement choisi|Changements choisis}} de [[:$1]]'''",
+'logdelete-selected' => "'''{{PLURAL:$1|Événement de notes choisi|Événements de notes choisis}}:'''",
+'revdelete-text' => "'''La liste des changements va sauver les versions ôtées, mais le public pourra pas voir certains morceaux de ces versions.'''
 
 Des autres administrateurs sus ce wiki ont la permission de voir et de rétablir les morceaux cachés hormis qu'y aye des restrictions.",
-'revdelete-legend'            => 'Mettre des restrictions',
-'revdelete-hide-text'         => 'Cacher le texte de la version',
-'revdelete-hide-image'        => "Cacher l'information du dossier",
-'revdelete-hide-name'         => "Cacher l'action et l'objet",
-'revdelete-hide-comment'      => 'Cacher la remarque du changement',
-'revdelete-hide-user'         => "Cacher le nom ou l'adresse IP de l'useur",
-'revdelete-hide-restricted'   => 'Appliquer ces restrictions aux administrateurs et les autres useurs',
-'revdelete-suppress'          => 'Supprimer les données des administrateurs ainsi que celles des autres utilisateurs',
-'revdelete-unsuppress'        => 'Enlever les restrictions des versions rétablies',
-'revdelete-log'               => 'Raison:',
-'revdelete-submit'            => 'Appliquer à la version choisie',
-'revdelete-success'           => "'''Vous avez bien changé la visibilité des versions.'''",
-'logdelete-success'           => "'''Vous avez bien changé la visibilité des événements.'''",
+'revdelete-legend' => 'Mettre des restrictions',
+'revdelete-hide-text' => 'Cacher le texte de la version',
+'revdelete-hide-image' => "Cacher l'information du dossier",
+'revdelete-hide-name' => "Cacher l'action et l'objet",
+'revdelete-hide-comment' => 'Cacher la remarque du changement',
+'revdelete-hide-user' => "Cacher le nom ou l'adresse IP de l'useur",
+'revdelete-hide-restricted' => 'Appliquer ces restrictions aux administrateurs et les autres useurs',
+'revdelete-suppress' => 'Supprimer les données des administrateurs ainsi que celles des autres utilisateurs',
+'revdelete-unsuppress' => 'Enlever les restrictions des versions rétablies',
+'revdelete-log' => 'Raison:',
+'revdelete-submit' => 'Appliquer à la version choisie',
+'revdelete-success' => "'''Vous avez bien changé la visibilité des versions.'''",
+'logdelete-success' => "'''Vous avez bien changé la visibilité des événements.'''",
 
 # Diffs
-'difference'              => '(Différences entre les versions)',
-'lineno'                  => 'Ligne $1:',
+'lineno' => 'Ligne $1:',
 'compareselectedversions' => 'Comparer les versions choisies',
-'editundo'                => 'renverser',
-'diff-multi'              => '({{PLURAL:$1|Un changement moyen caché|$1 changements moyens cachés}})',
+'editundo' => 'renverser',
+'diff-multi' => '({{PLURAL:$1|Un changement moyen caché|$1 changements moyens cachés}})',
 
 # Search results
-'searchresults'            => 'Résultats de la charche',
-'searchresults-title'      => 'Résultats de charche pour « $1 »',
-'searchresulttext'         => "Pour plus d'information pour vous aider à charcher dans {{SITENAME}}, voyez [[{{MediaWiki:Helppage}}|{{int:help}}]].",
-'searchhelp-url'           => 'Help:Aide',
+'searchresults' => 'Résultats de la charche',
+'searchresults-title' => 'Résultats de charche pour « $1 »',
+'searchresulttext' => "Pour plus d'information pour vous aider à charcher dans {{SITENAME}}, voyez [[{{MediaWiki:Helppage}}|{{int:help}}]].",
+'searchhelp-url' => 'Help:Aide',
 'searchprofile-everything' => 'Tout',
-'search-result-size'       => '$1 ({{PLURAL:$2|1 mot|$2 mots}})',
+'search-result-size' => '$1 ({{PLURAL:$2|1 mot|$2 mots}})',
 
 # Preferences page
-'preferences'         => 'Réglage',
-'mypreferences'       => 'Mon réglage',
-'skin-preview'        => "Vue d'avance",
-'prefs-custom-css'    => 'Custom CSS',
-'prefs-custom-js'     => 'Custom JavaScript',
-'youremail'           => 'E-mail:',
-'username'            => "Nom d'useur:",
-'uid'                 => "Numéro d'useur:",
-'yourrealname'        => 'Vrai nom:',
-'yourlanguage'        => 'Langue:',
-'yourvariant'         => 'Différent:',
-'yournick'            => "'Tit nom:",
-'badsig'              => 'Votre signature brute est pas bonne.  Regardez-voir les tags HTML.',
-'badsiglength'        => "Votre 'tit nom est trop long.  Il faut que ça soye moins que $1 caractères.",
-'gender-male'         => 'Male',
-'gender-female'       => 'Female',
+'preferences' => 'Réglage',
+'mypreferences' => 'Mon réglage',
+'skin-preview' => "Vue d'avance",
+'prefs-custom-css' => 'Custom CSS',
+'prefs-custom-js' => 'Custom JavaScript',
+'youremail' => 'E-mail:',
+'username' => "Nom d'useur:",
+'uid' => "Numéro d'useur:",
+'yourrealname' => 'Vrai nom:',
+'yourlanguage' => 'Langue:',
+'yourvariant' => 'Différent:',
+'yournick' => "'Tit nom:",
+'badsig' => 'Votre signature brute est pas bonne.  Regardez-voir les tags HTML.',
+'badsiglength' => "Votre 'tit nom est trop long.  Il faut que ça soye moins que $1 caractères.",
+'gender-male' => 'Male',
+'gender-female' => 'Female',
 'prefs-help-realname' => 'Votre vrai nom est pas nécessaire.  Si vous choisirait de le mettre, ça serait usé pour vous donner du crédit pour votre ouvrage.',
-'prefs-help-email'    => "Votre adresse e-mail est pas nécessaire, mais ça quitte le monde vous contacter par votre page d'useur ou votre page de discussion sans montrer votre identité.",
+'prefs-help-email' => "Votre adresse e-mail est pas nécessaire, mais ça quitte le monde vous contacter par votre page d'useur ou votre page de discussion sans montrer votre identité.",
 
 # User rights
 'editinguser' => "Changement de '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
@@ -634,7 +634,7 @@ Des autres administrateurs sus ce wiki ont la permission de voir et de rétablir
 'action-edit' => 'Faire un changement',
 
 # Recent changes
-'recentchanges'  => 'Changements récent',
+'recentchanges' => 'Changements récent',
 'rcshowhidepatr' => '$1 les modifications patrouillés',
 
 # File description page
@@ -644,8 +644,8 @@ Des autres administrateurs sus ce wiki ont la permission de voir et de rétablir
 'randompage' => 'Page au hasard',
 
 # Miscellaneous special pages
-'nbytes'       => '$1 octet{{PLURAL:$1||s}}',
-'move'         => 'Renommer',
+'nbytes' => '$1 octet{{PLURAL:$1||s}}',
+'move' => 'Renommer',
 'movethispage' => 'Renommer cette page',
 
 # Special:Categories
@@ -655,37 +655,37 @@ Des autres administrateurs sus ce wiki ont la permission de voir et de rétablir
 'emailuser' => 'E-mail cet useur',
 
 # Watchlist
-'watchlist'   => 'Mes pages guettées',
+'watchlist' => 'Mes pages guettées',
 'mywatchlist' => 'Mes pages guettées',
-'watch'       => 'Guetter',
-'unwatch'     => "guettez p'us",
+'watch' => 'Guetter',
+'unwatch' => "guettez p'us",
 
 # Namespace form on various pages
 'blanknamespace' => '(Principal)',
 
 # Contributions
 'contributions' => "Changements de l'useur",
-'mycontris'     => 'Mes changements',
+'mycontris' => 'Mes changements',
 
 'sp-contributions-talk' => 'Discuter',
 
 # Block/unblock
-'ipblocklist'              => 'Useurs bloqués',
-'blocklink'                => 'bloquer',
-'contribslink'             => 'changes',
+'ipblocklist' => 'Useurs bloqués',
+'blocklink' => 'bloquer',
+'contribslink' => 'changes',
 'block-log-flags-nocreate' => 'création de compte interdite',
 
 # Tooltip help for the actions
-'tooltip-pt-login'        => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier mais ce n’est pas obligatoire.',
-'tooltip-ca-talk'         => 'Discussion de cette page de contenu',
-'tooltip-search'          => 'Charche {{SITENAME}}',
+'tooltip-pt-login' => 'Vous êtes encouragé{{GENDER:||e|(e)}} à vous identifier mais ce n’est pas obligatoire.',
+'tooltip-ca-talk' => 'Discussion de cette page de contenu',
+'tooltip-search' => 'Charche {{SITENAME}}',
 'tooltip-search-fulltext' => 'Charche les pages pour ce texte',
-'tooltip-p-logo'          => "Visitez la page d'acceuil",
-'tooltip-n-portal'        => 'À propos du projet, quoi faire, où trouver tout',
+'tooltip-p-logo' => "Visitez la page d'acceuil",
+'tooltip-n-portal' => 'À propos du projet, quoi faire, où trouver tout',
 'tooltip-n-recentchanges' => 'La liste de changement récent dans ce wiki',
-'tooltip-n-randompage'    => 'Afficher un page au hasard',
-'tooltip-n-help'          => 'La place pour savoir',
-'tooltip-t-specialpages'  => 'Liste de tout les pages speciales',
+'tooltip-n-randompage' => 'Afficher un page au hasard',
+'tooltip-n-help' => 'La place pour savoir',
+'tooltip-t-specialpages' => 'Liste de tout les pages speciales',
 
 # Bad image list
 'bad_image_list' => 'Le format est le suivant :
index d62107b..5e4e8f3 100644 (file)
@@ -151,7 +151,6 @@ $magicWords = array(
        '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' ),
@@ -454,7 +453,6 @@ $messages = array(
 'qbbrowse' => 'Fâre dèfelar',
 'qbedit' => 'Changiér',
 'qbpageoptions' => 'Ceta pâge',
-'qbpageinfo' => 'Contèxto',
 'qbmyoptions' => 'Mes pâges',
 'qbspecialpages' => 'Pâges spèciâles',
 'faq' => 'Quèstions sovent posâyes',
@@ -467,7 +465,7 @@ $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 les idês de rechèrche bônâyes (solament por « Vèctor »)',
+'vector-simplesearch-preference' => 'Activar la bârra de rechèrche simplifiâye (solament por l’habelyâjo « Vèctor »)',
 'vector-view-create' => 'Fâre',
 'vector-view-edit' => 'Changiér',
 'vector-view-history' => 'Fâre vêre l’historico',
@@ -516,7 +514,7 @@ $messages = array(
 'views' => 'Visualisacions',
 'toolbox' => 'Bouèta d’outils',
 'userpage' => 'Vêde la pâge utilisator',
-'projectpage' => 'Vêde la pâge du projèt',
+'projectpage' => 'Vêde la pâge 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',
@@ -574,7 +572,7 @@ Vêde la [[Special:Version|pâge de les vèrsions]].',
 'youhavenewmessages' => 'Vos avéd de $1 ($2).',
 'newmessageslink' => 'mèssâjos novéls',
 'newmessagesdifflink' => 'dèrriér changement',
-'youhavenewmessagesfromusers' => 'Vos avéd $1 {{PLURAL:$3|d’un ôtrutilisator|de $3 ôtros utilisators}} ($2).',
+'youhavenewmessagesfromusers' => 'Vos avéd $1 {{PLURAL:$3|d’un ôtrutilisator|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}}',
@@ -677,7 +675,7 @@ Contint sûrament yon ou ben un mouél de caractèros que pôvont pas étre empl
 '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.',
+Les donâs ique seront pas betâyes a jorn.',
 'wrong_wfQuery_params' => 'Paramètros fôx dessus wfQuery()<br />
 Fonccion : $1<br />
 Demanda : $2',
@@ -689,16 +687,17 @@ 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.',
+'protectedinterface' => 'Cela pâge-que balye de tèxto d’entèrface por la programeria sur ceti vouiqui, et est vêr protègiêye por èvitar los abus.
+Por apondre ou ben changiér des traduccions sur tôs los vouiquis, volyéd empleyér [//translatewiki.net/ translatewiki.net], lo projèt de localisacion de MediaWiki.',
 '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.",
+Los changements sè cognetront sur l’aparence de l’entèrface utilisator por los ôtros utilisators de ceti vouiqui.
+Por apondre ou ben changiér des traduccions sur tôs los vouiquis, volyéd empleyér [//translatewiki.net/ 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 la configuracion a sè d’un ôtrutilisator.',
-'customjsprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge JavaScript, perce que contint la configuracion a sè d’un ôtrutilisator.',
+'customcssprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge CSS, perce que contint la configuracion a sè d’un ôtrutilisator.',
+'customjsprotected' => 'Vos avéd pas la pèrmission de changiér cela pâge JavaScript, perce que contint la configuracion a sè d’un ôtrutilisator.',
 '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'' ».",
@@ -712,11 +711,8 @@ La rêson balyêye est « ''$2'' ».",
 # Login and logout pages
 'logouttext' => "'''Ora vos éte dèbranchiê{{GENDER:||ye|(ye)}}.'''
 
-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.
+Vos pouede continuar a empleyér {{SITENAME}} de façon anonima ou ben <span class='plainlinks'>[$1 vos tornar branchiér]</span> 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 est étâ fêt.
-Oubliâd pas de pèrsonalisar voutres [[Special:Preferences|prèferences dessus {{SITENAME}}]].',
 'yourname' => 'Nom d’utilisator :',
 'yourpassword' => 'Contresegno :',
 'yourpasswordagain' => 'Confirmâd lo contresegno :',
@@ -786,7 +782,7 @@ pouede ignorar ceti mèssâjo et continuar a empleyér voutron viely contresegno
 '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' => '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.
+'eauthentsent' => 'Un mèssâjo de confirmacion est étâ mandâ a l’adrèce èlèctronica 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}}.',
@@ -795,8 +791,8 @@ Por èvitar los abus, solament yon mèssâjo de sovegnence serat mandâ per {{PL
 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' => 'Spècifiâd n’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccions.',
+Nion mèssâjo serat mandâ por châcuna de cetes fonccionalitâts.',
+'noemailprefs' => 'Spècifiâd n’adrèce èlèctronica dens voutres prèferences por empleyér cetes fonccionalitâts.',
 '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.',
@@ -912,39 +908,39 @@ Contresegno temporèro : $2',
 # Edit pages
 'summary' => 'Rèsumâ :',
 'subject' => 'Chousa / titro :',
-'minoredit' => 'Petiôt changement',
+'minoredit' => 'O est un petiôt changement',
 'watchthis' => 'Siuvre ceta pâge',
 'savearticle' => 'Sôvar la pâge',
 'preview' => 'Prèvisualisacion',
-'showpreview' => 'Fâre vêre una prèvisualisacion',
-'showlivepreview' => 'Apèrçu vito fêt',
+'showpreview' => 'Fâre vêre na prèvisualisacion',
+'showlivepreview' => 'Apèrçu rapido',
 'showdiff' => 'Fâre vêre los changements',
-'anoneditwarning' => "'''Atencion :''' vos éte pas branchiê.
-Voutra adrèce IP serat encartâ dens l’historico de ceta pâge.",
-'anonpreviewwarning' => "''Vos éte pas branchiê. Sôvar encarterat voutra adrèce IP dens l’historico des changements de la pâge.''",
-'missingsummary' => "'''Rapèl :''' vos éd p’oncor balyê lo rèsumâ de voutron changement.
-Se vos tornâd clicar dessus « {{int:savearticle}} », voutron changement serat sôvâ sen novél avèrtissement.",
-'missingcommenttext' => 'Volyéd fâre voutron comentèro ce-desot.',
-'missingcommentheader' => "'''Rapèl :''' vos éd p’oncor balyê de sujèt ou ben de titro a ceti comentèro.
-Se vos tornâd clicar dessus « {{int:savearticle}} », voutron changement serat sôvâ sen titro.",
-'summary-preview' => 'Prèvisualisacion du rèsumâ :',
-'subject-preview' => 'Prèvisualisacion du sujèt / titro :',
-'blockedtitle' => 'L’usanciér est blocâ.',
-'blockedtext' => "'''Voutron compto usanciér ou ben voutra adrèce IP at étâ blocâ.'''
-
-Lo blocâjo at étâ fêt per $1.
-La rêson balyê est ceta : ''$2''.
+'anoneditwarning' => "'''Atencion :''' vos éte pas branchiê(ye).
+Voutron adrèce IP serat encartâye dedens l’historico des changements de ceta pâge.",
+'anonpreviewwarning' => "''Vos éte pas branchiê(ye). Sôvar encarterat voutron adrèce IP dedens l’historico des changements de ceta pâge.''",
+'missingsummary' => "'''Sovegnence :''' vos éd balyê gins de rèsumâ de changement.
+Se vos tornâd clicar sur lo boton « {{int:savearticle}} », voutron changement serat sôvâ sen rèsumâ.",
+'missingcommenttext' => 'Volyéd buchiér un comentèro ce-desot.',
+'missingcommentheader' => "'''Sovegnence :''' vos éd balyê gins de chousa / titro a ceti comentèro.
+Se vos tornâd clicar sur lo boton « {{int:savearticle}} », voutron changement serat sôvâ sen chousa / titro.",
+'summary-preview' => 'Apèrçu du rèsumâ :',
+'subject-preview' => 'Apèrçu de la chousa / du titro :',
+'blockedtitle' => 'L’utilisator est blocâ',
+'blockedtext' => "'''Voutron nom d’utilisator ou ben voutron adrèce IP est étâ(ye) blocâ(ye).'''
+
+Lo blocâjo est étâ fêt per $1.
+La rêson balyêye est ''$2''.
 
 * Comencement du blocâjo : $8
 * Èxpiracion du blocâjo : $6
 * Compto blocâ : $7
 
-Vos vos pouede veriér vers $1 ou ben yon des ôtros [[{{MediaWiki:Grouppage-sysop}}|administrators]] por nen discutar.
-Vos pouede pas utilisar la fonccionalitât « Lui mandar un mèssâjo » a muens que vos èyâd una adrèce èlèctronica valida encartâ dens voutres [[Special:Preferences|prèferences]] et que la fonccionalitât èye pas étâ dèsactivâ.
-Voutra adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
-Volyéd spècefiar cetes endicacions dens totes les requétes que vos faréd.",
-'autoblockedtext' => "Voutra adrèce IP at étâ blocâ ôtomaticament perce qu’el at étâ utilisâ per un ôtro usanciér, lui-mémo blocâ per $1.
-La rêson balyê est ceta :
+Vos vos pouede veriér vers $1 ou ben un ôtr’[[{{MediaWiki:Grouppage-sysop}}|administrator]] por nen discutar.
+Vos pouede pas empleyér la fonccionalitât « Lui mandar un mèssâjo » a muens qu’un’adrèce èlèctronica valida est spècifiâye dens voutres [[Special:Preferences|prèferences]] et que vos éte pas étâ blocâ de l’empleyér.
+Voutron adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
+Volyéd encllure tôs los dètalys ce-dessus dedens quinta que seye demanda que vos faréd.",
+'autoblockedtext' => "Voutron adrèce IP est étâye blocâye ôtomaticament perce qu’el est étâye empleyêye per un ôtr’utilisator, lui-mémo blocâ per $1.
+La rêson balyêye est :
 
 :''$2''
 
@@ -954,12 +950,12 @@ La rêson balyê est ceta :
 
 Vos vos pouede veriér vers $1 ou ben yon des ôtros [[{{MediaWiki:Grouppage-sysop}}|administrators]] por nen discutar.
 
-Notâd que vos porréd pas utilisar la fonccionalitât « Lui mandar un mèssâjo » a muens que vos èyâd una adrèce èlèctronica valida encartâ dens voutres [[Special:Preferences|prèferences]] et que la fonccionalitât èye pas étâ dèsactivâ.
+Notâd que vos porréd pas empleyér la fonccionalitât « Lui mandar un mèssâjo » a muens que vos avéd n’adrèce èlèctronica valida encartâye dens voutres [[Special:Preferences|prèferences]] et que vos éte pas étâ blocâ de l’empleyér.
 
-Voutra adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
-Volyéd spècefiar cetes endicacions dens totes les requétes que vos faréd.",
-'blockednoreason' => 'gins de rêson balyê',
-'whitelistedittext' => 'Vos dête étre $1 por avêr la pèrmission de changiér lo contegnu.',
+Voutron adrèce IP d’ora est $3, et lo numerô de blocâjo est $5.
+Volyéd encllure tôs los dètalys ce-dessus dedens quinta que seye demanda que vos faréd.",
+'blockednoreason' => 'gins de rêson balyêye',
+'whitelistedittext' => 'Vos vos dête $1 por povêr changiér les pâges.',
 'confirmedittext' => 'Vos dête confirmar voutra adrèce èlèctronica devant que changiér les pâges.
 Volyéd buchiér et pués validar voutra adrèce èlèctronica dens voutres [[Special:Preferences|prèferences]].',
 'nosuchsectiontitle' => 'Empossiblo de trovar la sèccion',
@@ -1345,8 +1341,6 @@ Notâd bien que l’usâjo des lims de navigacion tornerat inicialisar cela colo
 'search-interwiki-caption' => 'Projèts frâres',
 'search-interwiki-default' => 'Rèsultats dessus $1 :',
 'search-interwiki-more' => '(més)',
-'search-mwsuggest-enabled' => 'avouéc consèlys',
-'search-mwsuggest-disabled' => 'sen consèlys',
 'search-relatedarticle' => 'Raportâ',
 'mwsuggest-disable' => 'Dèsactivar los consèlys AJAX',
 'searcheverything-enable' => 'Rechèrchiér dens tôs los èspâços de noms',
@@ -1445,7 +1439,7 @@ Vê-que una valor fêta per hasârd que vos pouede utilisar : $1',
 'timezoneregion-indian' => 'Ocèan endien',
 'timezoneregion-pacific' => 'Ocèan pacefico',
 'allowemail' => 'Ôtorisar l’èxpèdicion de mèssâjos que vegnont d’ôtros usanciérs',
-'prefs-searchoptions' => 'Chouèx de rechèrche',
+'prefs-searchoptions' => 'Rechèrche',
 'prefs-namespaces' => 'Èspâços de noms',
 'defaultns' => 'Ôtrament rechèrchiér dens cetos èspâços de noms :',
 'default' => 'per dèfôt',
@@ -2353,11 +2347,7 @@ Los changements a vegnir de ceta pâge et de sa pâge de discussion y seront lis
 
 'enotif_mailer' => 'Sistèmo de notificacion per mèssageria èlèctronica de {{SITENAME}}',
 'enotif_reset' => 'Marcar totes les pâges coment visitâs',
-'enotif_newpagetext' => 'O est una pâge novèla.',
 'enotif_impersonal_salutation' => 'Usanciér de {{SITENAME}}',
-'changed' => 'changiê',
-'created' => 'fêta',
-'enotif_subject' => 'La pâge « $PAGETITLE » de {{SITENAME}} at étâ $CHANGEDORCREATED per $PAGEEDITOR',
 'enotif_lastvisited' => 'Vêde $1 por tôs los changements dês voutra dèrriére visita.',
 'enotif_lastdiff' => 'Vêde $1 por vêre cél changement.',
 'enotif_anon_editor' => 'usanciér pas encartâ $1',
@@ -2985,7 +2975,6 @@ Volyéd tornar èprovar.',
 
 # 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',
@@ -4063,6 +4052,10 @@ Les émâges sont montrâs dens lor plêna rèsolucion, los ôtros fichiérs son
 'feedback-bugcheck' => 'Formidâblo ! Controlâd simplament qu’o est pas yona de les [$1 cofieries ja cognues].',
 'feedback-bugnew' => 'J’é controlâ. Signalar una cofierie novèla',
 
+# Search suggestions
+'searchsuggest-search' => 'Rechèrchiér',
+'searchsuggest-containing' => 'que contint...',
+
 # API errors
 'api-error-badaccess-groups' => 'Vos éte pas ôtorisâ a tèlèchargiér des fichiérs sur ceti vouiqui.',
 'api-error-badtoken' => 'Èrror de dedens : crouyo « jeton ».',
index fd91b54..9cb1bd0 100644 (file)
@@ -163,7 +163,6 @@ $messages = array(
 'qbbrowse' => 'Bleese',
 'qbedit' => 'Änre',
 'qbpageoptions' => 'Jüdeer sid',
-'qbpageinfo' => 'Sidedoote',
 'qbmyoptions' => 'Min side',
 'qbspecialpages' => 'Spetsjåålside',
 'faq' => 'FAQ',
@@ -422,12 +421,8 @@ Di grünj faan di administraator as: „$3“.',
 # Login and logout pages
 'logouttext' => "'''Dü bast nü oufmälded.'''
 
-Dü koost {{SITENAME}} nü anonüüm widerbrüke, unti de wider uner diseelew unti en oudern brükernoome [[Special:UserLogin|önjmälde]].
+Dü koost {{SITENAME}} nü anonüüm widerbrüke, unti de wider uner diseelew unti en oudern brükernoome <span class='plainlinks'>[$1 önjmälde]</span>.
 Påås aw, dåt hu side nuch wise koone, dåt dü önjmälded bast, sülung dü ai dan browsercache lääsimååged heest.",
-'welcomecreation' => '== Wäljkiimen, $1! ==
-
-Din brükerkonto wörd inruchted.
-Ferjees ai, din [[Special:Preferences|{{SITENAME}}-önjstalinge]] önjtupååsen.',
 'yourname' => 'Brükernoome:',
 'yourpassword' => 'Pååsuurd:',
 'yourpasswordagain' => 'Schriw pååsuurd nuch iinjsen:',
@@ -1026,8 +1021,6 @@ A nawigatsjuun links saat ales weder turag üüb di ual stant.',
 'search-interwiki-caption' => 'Süsterprujäkte',
 'search-interwiki-default' => '$1 resultoote:',
 'search-interwiki-more' => '(widere)',
-'search-mwsuggest-enabled' => 'ma forsliike',
-'search-mwsuggest-disabled' => 'niinj forsliike',
 'search-relatedarticle' => 'früne',
 'mwsuggest-disable' => 'forsliike per Ajax deaktiviire',
 'searcheverything-enable' => 'Onj ål noomerüme säke',
index 2fe2c25..abfd631 100644 (file)
@@ -239,7 +239,6 @@ $messages = array(
 'qbbrowse' => 'Sgarfe',
 'qbedit' => 'Cambie',
 'qbpageoptions' => 'Cheste pagjine',
-'qbpageinfo' => 'Contest',
 'qbmyoptions' => 'Mês pagjinis',
 'qbspecialpages' => 'Pagjinis speciâls',
 'faq' => 'Domandis plui frecuentis',
@@ -410,11 +409,8 @@ Al podarès vê dentri caratars che no podin jessi doprâts tai titui.',
 # Login and logout pages
 'logouttext' => "'''Tu sâs cumò lât fûr.'''
 
-Tu puedis continuâ a doprâ {{SITENAME}} come anonim, o tu puedis [[Special:UserLogin|jentrâ di gnûf]] cul stes o cuntun altri non utent.
+Tu puedis continuâ a doprâ {{SITENAME}} come anonim, o tu puedis <span class='plainlinks'>[$1 jentrâ di gnûf]</span> cul stes o cuntun altri non utent.
 Considere che cualchi pagjine e pues mostrâti ancjemò come jentrât tal sît fin cuant che no tu netis la memorie cache dal sgarfadôr.",
-'welcomecreation' => '== Mandi e benvignût $1! ==
-La tô identitât e je stade creade. 
-No stâ dismenteâti di gambiâ lis [[Special:Preferences|preferencis di {{SITENAME}}]].',
 'yourname' => 'Non utent',
 'yourpassword' => 'Peraule clâf',
 'yourpasswordagain' => 'Torne a scrivile',
@@ -692,8 +688,6 @@ Leiende: (cur) = difarencis cun la version atuâl, (prec) = difarencis cun la ve
 'search-interwiki-caption' => 'Progjets fradis',
 'search-interwiki-default' => 'Risultâts di $1:',
 'search-interwiki-more' => '(altri)',
-'search-mwsuggest-enabled' => 'cui sugjeriments',
-'search-mwsuggest-disabled' => 'cence i sugjeriments',
 'mwsuggest-disable' => 'Disative i sugjeriments AJAX',
 'searchrelated' => 'leâts',
 'searchall' => 'ducj',
@@ -1179,8 +1173,6 @@ e la pagjine e sarà '''gruessute''' te [[Special:RecentChanges|liste dai ultins
 'enotif_mailer' => 'Sisteme di notifiche par pueste eletroniche di {{SITENAME}}',
 'enotif_reset' => 'Segne dutis lis pagjinis come visitadis',
 'enotif_impersonal_salutation' => 'Utent di {{SITENAME}}',
-'changed' => 'cambiade',
-'created' => 'creade',
 'enotif_anon_editor' => 'utent anonim $1',
 
 # Delete
@@ -1701,6 +1693,10 @@ Se il file al è stât cambiât rispiet al so stât origjinâl, cualchi informaz
 # New logging system
 'newuserlog-byemail' => 'peraule clâf mandade par pueste eletroniche',
 
+# Search suggestions
+'searchsuggest-search' => 'Ricercje',
+'searchsuggest-containing' => 'che al à dentri...',
+
 # API errors
 'api-error-unclassified' => 'Al è capitât un erôr no cognossût',
 
index ee72895..9dbcb72 100644 (file)
@@ -281,7 +281,6 @@ $messages = array(
 'qbbrowse' => 'Blêdzje',
 'qbedit' => 'Bewurkje',
 'qbpageoptions' => 'Side-opsjes',
-'qbpageinfo' => 'Side-ynfo',
 'qbmyoptions' => 'Myn Opsjes',
 'qbspecialpages' => 'Bysûndere siden',
 'faq' => 'FAQ (faak stelde fragen)',
@@ -504,10 +503,8 @@ De oanfierde reden is ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Jo binne no ôfmeld.'''
 
-Jo kinne de {{SITENAME}} fierders anonym brûke, of jo op 'e [[Special:UserLogin|nij oanmelde]] ûnder deselde of in oare namme.
+Jo kinne de {{SITENAME}} fierders anonym brûke, of jo op 'e <span class='plainlinks'>[$1 nij oanmelde]</span> ûnder deselde of in oare namme.
 Mûglik wurdt noch in tal siden werjûn as wiene Jo oanmeld, oant Jo de cache fan Jo browser leegje.",
-'welcomecreation' => '<h2>Wolkom, $1!</h2><p>Jo ynstellings binne oanmakke.
-Ferjit net se oan jo foarkar oan te passen.',
 'yourname' => 'Jo meidochnamme:',
 'yourpassword' => 'Jo wachtwurd',
 'yourpasswordagain' => 'Jo wachtwurd (nochris)',
@@ -942,8 +939,6 @@ Prebearje in oare sykopdracht.',
 'search-interwiki-caption' => 'Susterprojekten',
 'search-interwiki-default' => '$1 resultaten:',
 'search-interwiki-more' => '(mear)',
-'search-mwsuggest-enabled' => 'mei suggestjes',
-'search-mwsuggest-disabled' => 'gjin suggestjes',
 'search-relatedarticle' => 'Besibbe',
 'mwsuggest-disable' => 'Suggestjes fia AJAX útskeakelje',
 'searcheverything-enable' => 'Sykje op alle nammeromten',
@@ -1717,10 +1712,7 @@ At jo letter in side net mear folgje wolle, dan brûke jo op dy side de keppelin
 'watching' => "Dwaande mei op'e folchlist te setten ...",
 'unwatching' => "Dwaande mei fan'e folchlist ôf te heljen ...",
 
-'enotif_newpagetext' => 'Dit is in nije side.',
 'enotif_impersonal_salutation' => 'meidogger fan {{SITENAME}}',
-'changed' => 'feroare',
-'created' => 'oanmakke',
 'enotif_body' => 'Bêste $WATCHINGUSERNAME,
 
 De {{SITENAME}}side \'$PAGETITLE\' is op $PAGEEDITDATE $CHANGEDORCREATED troch meidogger $PAGEEDITOR;
index 522a976..d0a51dc 100644 (file)
@@ -237,7 +237,6 @@ $messages = array(
 'qbbrowse' => 'Brabhsáil',
 'qbedit' => 'Cuir in eagar',
 'qbpageoptions' => 'An leathanach seo',
-'qbpageinfo' => 'Comhthéacs',
 'qbmyoptions' => 'Mo chuid leathanaigh',
 'qbspecialpages' => 'Leathanaigh speisialta',
 'faq' => 'Ceisteanna Coiteanta',
@@ -476,11 +475,8 @@ An fáth ná ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Tá tú logáilte amach anois.'''
 
-Is féidir leat an {{SITENAME}} a úsáid fós gan ainm, nó is féidir leat [[Special:UserLogin|logáil isteach arís]] mar an úsáideoir céanna, nó mar úsáideoir eile.
+Is féidir leat an {{SITENAME}} a úsáid fós gan ainm, nó is féidir leat <span class='plainlinks'>[$1 logáil isteach arís]</span> mar an úsáideoir céanna, nó mar úsáideoir eile.
 Tabhair faoi deara go taispeáinfear roinnt leathanaigh mar atá tú logáilte isteach fós, go dtí go ghlanfá amach do taisce líonleitheora.",
-'welcomecreation' => '== Tá fáilte romhat, $1! ==
-
-Cruthaíodh do chuntas. Ná déan dearmad athrú a dhéanamh ar do chuid [[Special:Preferences|sainroghanna {{GRAMMAR:genitive|{{SITENAME}}}}]].',
 'yourname' => "D'ainm úsáideora",
 'yourpassword' => "D'fhocal faire",
 'yourpasswordagain' => "Athiontráil d'fhocal faire",
@@ -802,8 +798,6 @@ Treoir: (rth) = difríocht ón leagan reatha, (rmh) = difríocht ón leagan roim
 'search-interwiki-caption' => 'Comhthionscadail',
 'search-interwiki-default' => '$1 torthaí:',
 'search-interwiki-more' => '(níos mó)',
-'search-mwsuggest-enabled' => 'le moltaí',
-'search-mwsuggest-disabled' => 'gan mholtaí',
 'search-relatedarticle' => 'Gaolmhar',
 'mwsuggest-disable' => 'Díchumasaigh moltaí AJAX',
 'searchrelated' => 'gaolmhara',
@@ -1310,11 +1304,7 @@ taobh istigh den tréimhse atá roghnaithe agat.',
 
 'enotif_mailer' => 'Fógrasheoltóir as {{SITENAME}}',
 'enotif_reset' => 'Marcáil gach leathanach bheith tadhlaithe',
-'enotif_newpagetext' => 'Is leathanach nua é seo.',
 'enotif_impersonal_salutation' => 'úsáideoir {{SITENAME}}',
-'changed' => "D'athraigh",
-'created' => 'Chruthaigh',
-'enotif_subject' => '  $CHANGEDORCREATED $PAGEEDITOR an leathanach $PAGETITLE ag {{SITENAME}}.',
 'enotif_lastvisited' => 'Féach ar $1 le haghaidh gach athrú a rinneadh ó thús na cuairte seo caite a rinne tú.',
 'enotif_anon_editor' => 'úsáideoir gan ainm $1',
 'enotif_body' => 'A $WATCHINGUSERNAME, a chara,
@@ -2234,4 +2224,7 @@ Rachaidh an cód deimhnithe seo as feidhm ag $4.',
 'feedback-message' => 'Teachtaireacht:',
 'feedback-cancel' => 'Cealaigh',
 
+# Search suggestions
+'searchsuggest-search' => 'Cuardaigh',
+
 );
index bb10a36..66bfeb9 100644 (file)
@@ -218,7 +218,6 @@ $messages = array(
 'qbbrowse' => 'Taramaa',
 'qbedit' => 'Diiştir',
 'qbpageoptions' => 'Bu sayfa',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Sayfalarım',
 'qbspecialpages' => 'Maasus sayfalar',
 'faq' => 'SSS',
@@ -375,11 +374,8 @@ Yalvarêrız benneyiniz URL - i hem raport ediniz bunu bir [[Special:ListUsers/s
 'viewsourcetext' => 'Var nicä görmää hem kopiya etmää bu yapraa gelinirini:',
 
 # Login and logout pages
-'logouttext' => 'Sessiyayı kapattınız.
-Şindi var nicä devam etmää kullanmaa {{SITENAME}} saytını kimlik göstermedän yaki [[Special:UserLogin|enidän sessiya açmaa]] (ister hep o kullanıcı adıylan, ister başka bir kullanıcı adıylan). O zamana kadar ani web brauzerinizin keşi temizlenecek bir takım sayfalar var nicä görünsün sansın sessiya hep açık.',
-'welcomecreation' => '== Hoş geldiniz $1! ==
-
-Esapınız açıldı. Unutmayın [[Special:Preferences|{{SITENAME}} preferences]] seçimnerin diiştirmää.',
+'logouttext' => "Sessiyayı kapattınız.
+Şindi var nicä devam etmää kullanmaa {{SITENAME}} saytını kimlik göstermedän yaki <span class='plainlinks'>[$1 enidän sessiya açmaa]</span> (ister hep o kullanıcı adıylan, ister başka bir kullanıcı adıylan). O zamana kadar ani web brauzerinizin keşi temizlenecek bir takım sayfalar var nicä görünsün sansın sessiya hep açık.",
 'yourname' => 'Kullanıcı adınız',
 'yourpassword' => 'Parol',
 'yourpasswordagain' => 'Parolu enidän yaz',
@@ -588,8 +584,6 @@ Nışannar: (bitki) = şindiki versiyalan aradaki fark,
 'search-interwiki-caption' => 'Kardaş proyektlär',
 'search-interwiki-default' => '$1 rezultatlar:',
 'search-interwiki-more' => '(taa çok)',
-'search-mwsuggest-enabled' => 'tekliflerlän',
-'search-mwsuggest-disabled' => 'tekliflersiz',
 'nonefound' => "'''Bennemäk''': Sadä kimi ad erleri sessizcä aaranêr.
 Aaramaanızın önünä ''all:'' prefiksini koyun da deneyin hepsi içlii aaramaa deyni (sözleşmäk sayfaları, şablonlar h.b.pay alarak), yaki kullanınız beenilän prefiksi sansın er adı.",
 'powersearch' => 'Gelişmiş arama',
index 6187ec1..6095d74 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Simplified Gan script (‪赣语(简体)‬)
+/** Simplified Gan script (赣语(简体)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -176,7 +176,6 @@ $messages = array(
 'qbbrowse' => '查看',
 'qbedit' => '编写',
 'qbpageoptions' => '个页',
-'qbpageinfo' => '个页信息',
 'qbmyoptions' => '偶𠮶选项',
 'qbspecialpages' => '特殊页',
 'faq' => 'FAQ',
@@ -401,10 +400,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''汝退出正哩。'''
 
-接到汝得匿名使用{{SITENAME}},或[[Special:UserLogin|登入过]]。除非汝删吥浏览器缓存,只把子页面可能会接到话汝系登入状态。",
-'welcomecreation' => '== 欢迎, $1! ==
-
-建正哩汝𠮶帐户,莫𫍧记设置 [[Special:Preferences|{{SITENAME}}𠮶个人参数]]。',
+接到汝得匿名使用{{SITENAME}},或<span class='plainlinks'>[$1 登入过]</span>。除非汝删吥浏览器缓存,只把子页面可能会接到话汝系登入状态。",
 'yourname' => '用户名:',
 'yourpassword' => '密码:',
 'yourpasswordagain' => '输过道密码:',
@@ -767,8 +763,6 @@ $2',
 'search-interwiki-caption' => '姊妹计划',
 'search-interwiki-default' => '$1只结果:',
 'search-interwiki-more' => '(更多)',
-'search-mwsuggest-enabled' => '有建议',
-'search-mwsuggest-disabled' => '冇建议',
 'searchrelated' => '相关',
 'searchall' => '所有',
 'showingresults' => '底下从第<b>$2</b>条显示起先𠮶<b>$1</b>条结果:',
@@ -1296,11 +1290,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => '{{SITENAME}}邮件报告员',
 'enotif_reset' => '拿全部文章标成已读',
-'enotif_newpagetext' => '个系新开𠮶页面。',
 'enotif_impersonal_salutation' => '{{SITENAME}}用户',
-'changed' => '改卟嘞',
-'created' => '建正嘞',
-'enotif_subject' => '{{SITENAME}}有页面 $PAGETITLE拖$PAGEEDITOR $CHANGEDORCREATED',
 'enotif_lastvisited' => '眵倷上回访问后𠮶全部改动请去$1。',
 'enotif_lastdiff' => '想眵改动请去$1。',
 'enotif_anon_editor' => '匿名用户$1',
@@ -2241,6 +2231,7 @@ $3
 'version-hook-subscribedby' => '订阅人',
 'version-version' => '(版本 $1)',
 'version-license' => '许可证',
+'version-poweredby-credits' => "个只 Wiki 由 '''[//www.mediawiki.org/ MediaWiki]''' 驱动,版权所有 © 2001-$1 $2。",
 'version-software' => '装正𠮶软件',
 'version-software-version' => '版本',
 
@@ -2270,4 +2261,7 @@ $3
 # Special:Tags
 'tag-filter' => '[[Special:Tags|标签]]过滤器:',
 
+# Search suggestions
+'searchsuggest-search' => '寻吖',
+
 );
index bf73fb7..d3e42c0 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Traditional Gan script (‪贛語(繁體)‬)
+/** Traditional Gan script (贛語(繁體)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -198,7 +198,6 @@ $messages = array(
 'qbbrowse' => '查看',
 'qbedit' => '編寫',
 'qbpageoptions' => '箇頁',
-'qbpageinfo' => '箇頁信息',
 'qbmyoptions' => '我嗰頁面',
 'qbspecialpages' => '特殊頁',
 'faq' => 'FAQ',
@@ -423,10 +422,7 @@ $2',
 # Login and logout pages
 'logouttext' => "'''汝退出正哩。'''
 
-接到汝得匿名使用{{SITENAME}},或[[Special:UserLogin|登入過]]。除非汝刪吥瀏覽器緩存,隻把子頁面可能會接到話汝係登入狀態。",
-'welcomecreation' => '== 歡迎, $1! ==
-
-建正哩汝嗰帳戶,莫誺記設置 [[Special:Preferences|{{SITENAME}}嗰個人參數]]。',
+接到汝得匿名使用{{SITENAME}},或<span class='plainlinks'>[$1 登入過]</span>。除非汝刪吥瀏覽器緩存,隻把子頁面可能會接到話汝係登入狀態。",
 'yourname' => '用戶名:',
 'yourpassword' => '密碼:',
 'yourpasswordagain' => '輸過道密碼:',
@@ -789,8 +785,6 @@ $2',
 'search-interwiki-caption' => '姊妹計劃',
 'search-interwiki-default' => '$1隻結果:',
 'search-interwiki-more' => '(更多)',
-'search-mwsuggest-enabled' => '有建議',
-'search-mwsuggest-disabled' => '冇建議',
 'searchrelated' => '相關',
 'searchall' => '所有',
 'showingresults' => '底下從第<b>$2</b>條顯示起先嗰<b>$1</b>條結果:',
@@ -1318,11 +1312,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => '{{SITENAME}}郵件報告員',
 'enotif_reset' => '拿全部文章標成已讀',
-'enotif_newpagetext' => '箇係新開嗰頁面。',
 'enotif_impersonal_salutation' => '{{SITENAME}}用戶',
-'changed' => '改卟嘞',
-'created' => '建正嘞',
-'enotif_subject' => '{{SITENAME}}有頁面 $PAGETITLE拕$PAGEEDITOR $CHANGEDORCREATED',
 'enotif_lastvisited' => '眵倷上回訪問後嗰全部改動請去$1。',
 'enotif_lastdiff' => '想眵改動請去$1。',
 'enotif_anon_editor' => '匿名用戶$1',
@@ -2293,4 +2283,7 @@ $3
 # Special:Tags
 'tag-filter' => '[[Special:Tags|標籤]]過濾器:',
 
+# Search suggestions
+'searchsuggest-search' => '尋吖',
+
 );
index cf837a4..288066f 100644 (file)
@@ -83,7 +83,7 @@ $messages = array(
 
 'underline-always' => 'An-còmhnaidh',
 'underline-never' => 'Na dèan seo idir',
-'underline-default' => "Roghainn bhunaiteach a' bhrabhsair",
+'underline-default' => "Bun-roghainn a' bhrabhsair no a' chraicinn",
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stoidhle cruth-clò an raoin dheasachaidh:',
@@ -168,8 +168,8 @@ $messages = array(
 'newwindow' => "(a' fosgladh ann an uinneag ùr)",
 'cancel' => 'Sguir dheth',
 'moredotdotdot' => 'Barrachd...',
-'mypage' => 'Mo dhuilleag',
-'mytalk' => 'Mo chonaltradh',
+'mypage' => 'Duilleag',
+'mytalk' => 'Deasbaireachd',
 'anontalk' => 'Conaltradh airson an IP seo',
 'navigation' => 'Seòladh',
 'and' => '&#32;agus',
@@ -179,7 +179,6 @@ $messages = array(
 'qbbrowse' => 'Brabhsaich',
 'qbedit' => 'Deasaich',
 'qbpageoptions' => 'An duilleag seo',
-'qbpageinfo' => 'Co-theacs',
 'qbmyoptions' => 'Na duilleagan agam',
 'qbspecialpages' => 'Duilleagan sònraichte',
 'faq' => 'CÀBHA',
@@ -192,7 +191,7 @@ $messages = array(
 'vector-action-protect' => 'Dìon',
 'vector-action-undelete' => 'Neo-dhèan an sguabadh às',
 'vector-action-unprotect' => 'Atharraich an dìon',
-'vector-simplesearch-preference' => 'Cuir an comas molaidhean luirg adhartach (craiceann vector a-mhàin)',
+'vector-simplesearch-preference' => 'Cuir an comas am bàr-luirg simplidh (craiceann vector a-mhàin)',
 'vector-view-create' => 'Cruthaich',
 'vector-view-edit' => 'Deasaich',
 'vector-view-history' => 'Seall an eachdraidh',
@@ -299,6 +298,10 @@ Seall air [[Special:Version|duilleag an tionndaidh]].',
 'youhavenewmessages' => 'Tha $1 ($2) agad.',
 'newmessageslink' => 'teachdaireachdan ùra',
 'newmessagesdifflink' => 'mùthadh mu dheireadh',
+'youhavenewmessagesfromusers' => 'Tha $1 o {{PLURAL:$3|aon chleachdaiche|$3 chleachdaiche|$3 chleachdaiche|$3 chleachdaiche|$3 cleachdaichean|$3 cleachdaiche}} agad ($2).',
+'youhavenewmessagesmanyusers' => 'Tha $1 agad o iomadh cleachdaiche ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|aon teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachd ùr|$1 theachdaireachd ùr|$1 teachdaireachdan ùra|$1 teachdaireachd ùr}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|am mùthadh|an $1 mhùthadh|an $1 mhùthadh|an $1 mhùthadh|na $1 mùthaidhean|na $1 mùthadh}} mu dheireadh',
 'youhavenewmessagesmulti' => 'Tha teachdaireachdan ùra agad ann an $1',
 'editsection' => 'deasaich',
 'editold' => 'deasaich',
@@ -392,6 +395,8 @@ An dèan thu aithris air seo do [[Special:ListUsers/sysop|rianadair]], ag innse
 'cannotdelete' => 'Cha do ghabh an duilleag no am faidhle "$1" a sguabadh às.
 Faodaidh gun deach a sguabadh às le cuideigin eile mu thràth.',
 'cannotdelete-title' => 'Cha ghabh an duilleag "$1" a sguabadh às',
+'delete-hook-aborted' => 'Sguireadh dhen sguabadh às ri linn dubhain.
+Cha deach adhbhar a thoirt seachad.',
 'badtitle' => 'Droch thiotal',
 'badtitletext' => "Bha an duilleag a dh'iarr thu mì-dhligheach, falamh no le tiotal eadar-chànanach no eadar-uici air a dhroch cheangal.
 Faodaidh gu bheil aon no barrachd charactairean ann nach urrainn dhut a chleachdadh ann an tiotalan.",
@@ -407,13 +412,13 @@ Iarrtas: $2',
 'actionthrottled' => 'Gnìomh air a mhùchadh',
 'actionthrottledtext' => "Gus casg a chur air spama, chan urrainn dhut an gnìomh seo a dhèanamh ro thric am broinn ùine ghoirid agus chaidh thu thairis air a' chrìoch seo.
 Feuch ris a-rithist às a dhèidh seo.",
-'protectedpagetext' => 'Chaidh an duilleag seo a ghlasadh gus casg a chur air deasachadh.',
+'protectedpagetext' => 'Chaidh an duilleag seo a dhìon gus casg a chur air deasachadh.',
 'viewsourcetext' => "'S urrainn dhut coimhead air tùs na duilleige seo 's lethbhreac a dhèanamh dheth:",
 'viewyourtext' => "'S urrainn dhut coimhead air '''na mhùthaich thu''' 's lethbhreac a dhèanamh dheth air an duilleag seo:",
-'protectedinterface' => "Tha an duilleag seo a' solar teacsa eadar-aghaidh airson a' bhathar-bhog is chaidh a ghlaadh gus casg a chur air mì-chleachdadh.",
+'protectedinterface' => "Bheir an duilleag seo dhut teacsa eadar-aghaidh airson a' bhathar-bhog air an uicipeid seo 's chaidh a ghlasadh gus casg a chur air mì-chleachdadh. Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
 'editinginterface' => "'''Rabhadh:''' Tha thu a' deasachadh duilleag a tha 'ga chleachdadh a chum teacsa eadar-aghaidh a sholar airson a' bhathar-bhog.
-Ma dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch i.
-Ma tha thu airson Gàidhlig a chur air, saoil an cleachd thu [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], am pròiseact ionadailidh aig MediaWiki?",
+Ma dh'atharraicheas tu an duilleag seo, bidh buaidh ann air coltas na h-eadar-aghaidh mar a chì càch e air an uicipeid seo.
+Gus eadar-theangachadh atharrachadh no a chur ris airson gach uicipeid, cleachd [//translatewiki.net/ translatewiki.net], pròiseactan eadar-theangachadh MediaWiki.",
 'sqlhidden' => "(Iarrtas SQL 'ga fhalach)",
 'cascadeprotected' => 'Chaidh an duilleag seo a dhìon o dheasachadh a chionn \'s gu bheil e am broinn {{PLURAL:$1|na duilleige|nan duilleagan}} a leanas a chaidh an dìon \'s an roghainn "mar eas" air:
 $2',
@@ -423,6 +428,12 @@ $2',
 'ns-specialprotected' => 'Chan ghabh duilleagan sònraichte a dheasachadh.',
 'titleprotected' => 'Chaidh an duilleag seo a dhìon o chruthachadh le [[User:$1|$1]].
 Seo am mìneachadh: "\'\'$2\'\'".',
+'filereadonlyerror' => 'Cha ghabh am faidhle "$1" atharrachadh a chionn \'s gu bheil ionad-tasgaidh fhaidhlichean "$2" ri leughadh a-mhàin.
+Thug an rianaire a ghlais e seachad an t-adhbhar a leanas: "$3".',
+'invalidtitle-knownnamespace' => 'Tiotal mì-dhligheach leis an namespace "$2" agus an teacsa "$3"',
+'invalidtitle-unknownnamespace' => 'Tiotal mì-dhligheach leis an àireamh namespace $1 agus an teacsa "$2"',
+'exception-nologin' => 'Chan eil thu air clàradh a-steach',
+'exception-nologin-text' => 'Feumaidh tu clàradh a-steach air an uicipeid seo mus urrainn dhut seo a dhèanamh.',
 
 # Virus scanner
 'virus-badscanner' => "Droch cho-dhealbhachd: sganair bhìorasan neo-aithnichte: ''$1''",
@@ -431,17 +442,15 @@ Seo am mìneachadh: "\'\'$2\'\'".',
 
 # Login and logout pages
 'logouttext' => "'''Chaidh do logadh a-mach.'''
-'S urrainn dhut leantainn air adhart a' cleachdadh {{SITENAME}} a chleachdadh gun urra no 's urrainn dhut [[Special:UserLogin|logadh a-steach a-rithist]] mar an dearbh-chleachdaiche no mar chleachdaiche eile.
+'S urrainn dhut leantainn air adhart a' cleachdadh {{SITENAME}} a chleachdadh gun urra no 's urrainn dhut <span class='plainlinks'>[$1 logadh a-steach a-rithist]</span> mar an dearbh-chleachdaiche no mar chleachdaiche eile.
 Thoir an aire gum bi coltas air cuide dhe na duilleagan mar gum biodh tu air logadh a-steach gus am falamhaich thu tasgadan a' bhrabhsair agad.",
-'welcomecreation' => '== Fàilte ort, $1! ==
-Chaidh an cunntas agad a chruthachadh.
-Na dìochuimhnich na [[Special:Preferences|roghainnean agad air {{SITENAME}}]] a ghleusadh dhut fhèin.',
 'yourname' => 'Ainm-cleachdaiche:',
 'yourpassword' => 'Am facal-faire agad',
 'yourpasswordagain' => 'Ath-sgrìobh facal-faire',
 'remembermypassword' => "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|làithean}})",
 'securelogin-stick-https' => 'Glèidh an ceangal ri HTTPS as dèidh logadh a-steach',
 'yourdomainname' => 'An àrainn-lìn agad:',
+'password-change-forbidden' => 'Chan urrainn dhut faclan-faire atharrachadh air an uicipeid seo.',
 'externaldberror' => 'Thachair mearachd le dearbhadh an stòir-dhàta air neo chan eil cead agad an cunntas agad air an taobh a-muigh ùrachadh.',
 'login' => 'Log a-steach',
 'nav-login-createaccount' => 'Log a-steach / cruthaich cunntas',
@@ -519,6 +528,7 @@ Cha dèid post-d a chur airson gin dhe na feartan a leanas.',
 'invalidemailaddress' => "Chan urrainn dhuinn gabhail ris an t-seòladh seo a chionn 's gu bheil coltas cearr air.
 Cuir a-steach seòladh san fhòrmat cheart no falamhaich an raon sin.",
 'cannotchangeemail' => 'Cha ghabh na puist-d a tha co-cheangailte ri cunntas atharrachadh air an uicipeid seo.',
+'emaildisabled' => 'Chan urrainn dhut puist-d a chur air an làrach seo.',
 'accountcreated' => 'Cunntas cruthaichte',
 'accountcreatedtext' => 'Chaidh an cunntas cleachdaiche airson $1 a chruthachadh.',
 'createaccount-title' => 'Cruthachadh cunntais airson {{SITENAME}}',
@@ -692,9 +702,12 @@ Mas e cleachdaiche gun urra a tha annad 's ma tha thu dhen bheachd nach eil na b
 \'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],
 no [{{fullurl:{{FULLPAGENAME}}|action=edit}} an duilleag seo a dheasachadh]</span>.',
-'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>.',
+'noarticletext-nopermission' => 'Chan eil teacsa sam bith san duilleag seo an-dràsta.
+\'S urrainn dhut [[Special:Search/{{PAGENAME}}|tiotal na duilleige seo a lorg]] ann an duilleagan eile, no <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} na logaichean co-cheangailte a rannsachadh]</span> ach chan eil cead agad an duilleag seo a chruthachadh.',
+'missing-revision' => 'Chan eil mùthadh #$1 na duilleige "{{PAGENAME}}" ann.
+
+Mar is trice, tachraidh seo ma leanas tu ceangal san eachdraidh a tha fìor aosta \'s a tha a\' dol gu duilleag a chaidh a sguabadh às.
+Gheibh thu mion-fhiosrachadh ann an [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} loga nan duilleagan a chaidh a sguabadh às].',
 '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.',
@@ -721,6 +734,7 @@ Cleachdaidh duilleagan gnàthaichte .css agus .js tiotal ann an litrichean beaga
 'note' => "'''An aire:'''",
 'previewnote' => "'''Cuimhnich nach eil ann ach ro-shealladh.'''
 Cha deach na mùthaidhean agad a shàbhaladh fhathast!",
+'continue-editing' => 'Rach gun raon deasachaidh',
 '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?
@@ -736,6 +750,7 @@ 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",
+'creating' => "A' cruthachadh $1",
 'editingsection' => "A' deasachadh $1 (earrann)",
 'editingcomment' => "A' deasachadh $1 (earrann ùr)",
 'editconflict' => 'Còmhstri deasachaidh: $1',
@@ -802,6 +817,7 @@ Tha coltas gun deach a sguabadh às.",
 '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.",
+'defaultmessagetext' => 'Teacsa bunaiteach na teachdaireachd',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Rabhadh:''' Tha cus expensive parser function calls san duilleag seo.
@@ -815,6 +831,7 @@ Cha dèid cuid dhith a ghabhail a-steach.",
 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]]',
+'parser-unstrip-loop-warning' => 'Mhothaich sinn do lùb unstrip',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Cha ghabh an cunntas a chruthachadh',
@@ -832,12 +849,15 @@ Chaidh na h-argamaidean sinn a leigeil seachad.",
 'cur' => 'làith',
 'next' => 'ath',
 'last' => 'roimhe',
+'page_first' => 'Toiseach',
+'page_last' => 'Deireadh',
 'histlegend' => "Taghadh nan diofar: comharraich bogsaichean rèidio nam mùthaidhean gus coimeas a dhèanamh agus put Enter no am putan gu h-ìosal.<br />
 Mìneachadh: '''({{int:cur}})''' = an diofar eadar e 's am mùthadh as ùire, '''({{int:last}})''' = an diofar eadar e 's am mùthadh roimhe, '''{{int:minoreditletter}}''' = deasachadh beag.",
 'history-fieldset-title' => 'An eachdraidh brabhsaidh',
 'history-show-deleted' => 'Na chaidh sguabadh às a-mhàin',
 'histfirst' => 'As sine',
 'histlast' => 'As ùire',
+'historysize' => '({{PLURAL:$1|1 bhaidt|$1 bhaidht|$1 bhaidht|$1 bhaidht|$1 baidht|$1 baidht}})',
 'historyempty' => '(falamh)',
 
 # Revision feed
@@ -858,6 +878,10 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'revdel-restore' => 'mùth follaiseachd',
 'revdel-restore-deleted' => 'mùthaidhean a chaidh a sguabadh às',
 'revdel-restore-visible' => 'mùthaidhean faicsinneach',
+'revdelete-otherreason' => 'Adhbhar eile/a bharrachd:',
+'revdelete-reasonotherlist' => 'Adhbhar eile',
+'revdelete-edit-reasonlist' => 'Deasaich adhbharan an sguabaidh às',
+'revdelete-offender' => "Ùghdar a' mhùthaidh:",
 
 # History merging
 'mergehistory-from' => 'An duilleag thùsail:',
@@ -908,8 +932,6 @@ Feuch is [[Special:Search|lorg duilleagan ùra iomachaidh air an uici]]",
 'search-interwiki-caption' => 'Pròiseactan co-cheangailte',
 'search-interwiki-default' => 'Toraidhean $1:',
 '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',
@@ -930,7 +952,7 @@ Feuch ri ''all:'' a chuir air beulaibh an iarrtais agad gus rannsachadh a dhèan
 
 # Preferences page
 'preferences' => 'Roghainnean',
-'mypreferences' => 'Mo roghainnean',
+'mypreferences' => 'Na roghainnean agam',
 'changepassword' => 'Atharraich facal-faire',
 'prefs-skin' => 'Bian',
 'skin-preview' => 'Ro-shealladh',
@@ -1174,7 +1196,7 @@ Thoir sùil air na [[Special:WantedCategories|roinntean-seòrsa a thathar 'gan i
 
 # Watchlist
 'watchlist' => 'Mo chlàr-faire',
-'mywatchlist' => 'Mo chlàr-faire',
+'mywatchlist' => 'An clàr-faire',
 'watchlistfor2' => 'Do $1 $2',
 'nowatchlist' => "Chan eil rud sam bith air a' chlàr-fhaire agad.",
 'addedwatchtext' => "Chaidh an duilleag \"[[:\$1]]\" a chur ri [[Special:Watchlist|do chlàr-faire]].
@@ -1266,9 +1288,9 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'blanknamespace' => '(Prìomh)',
 
 # Contributions
-'contributions' => 'Mùthaidhean an neach-chleachdaidh',
+'contributions' => "Mùthaidhean a' {{GENDER:$1|chleachdaiche}}",
 'contributions-title' => 'Mùthaidhean a rinn $1',
-'mycontris' => 'Mo mhùthaidhean',
+'mycontris' => 'Mùthaidhean',
 'contribsub2' => 'Do $1 ($2)',
 'uctop' => ' (barr)',
 'month' => 'On mhìos (agus na bu tràithe):',
@@ -1299,7 +1321,7 @@ Seo roghainnean làithreach na duilleige '''$1''':",
 'whatlinkshere-hideredirs' => '$1 ath-sheòlaidhean',
 'whatlinkshere-hidetrans' => '$1 transclusions',
 'whatlinkshere-hidelinks' => '$1 ceanglaichean',
-'whatlinkshere-hideimages' => '$1 ceanglaichean nan dealbhan',
+'whatlinkshere-hideimages' => '$1 ceanglaichean nam faidhlichean',
 'whatlinkshere-filters' => 'Criathairean',
 
 # Block/unblock
@@ -1534,4 +1556,7 @@ Bidh an fheadhainn eile falaichte a ghnàth.
 # Special:Tags
 'tag-filter' => 'Criathrag [[Special:Tags|Tag]]:',
 
+# Search suggestions
+'searchsuggest-containing' => 'anns a bheil...',
+
 );
index bc04e17..316ce8a 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Alma
+ * @author Dferg
  * @author Elisardojm
  * @author Gallaecio
  * @author Gustronico
@@ -15,6 +16,7 @@
  * @author Lameiro
  * @author Prevert
  * @author Toliño
+ * @author Vivaelcelta
  * @author Xosé
  * @author לערי ריינהארט
  */
@@ -59,7 +61,7 @@ $defaultDateFormat = 'dmy';
 $dateFormats = array(
        'dmy time' => 'H:i',
        'dmy date' => 'j \d\e F \d\e Y',
-       'dmy both' => 'H:i\,\ j \d\e F \d\e Y',
+       'dmy both' => 'j \d\e F \d\e Y "ás" H:i',
 );
 
 $specialPageAliases = array(
@@ -131,7 +133,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Cambios_recentes' ),
        'Recentchangeslinked'       => array( 'Cambios_relacionados' ),
        'Revisiondelete'            => array( 'Revisións_borradas' ),
-       'RevisionMove'              => array( 'Traslado_de_revisión' ),
        'Search'                    => array( 'Procurar' ),
        'Shortpages'                => array( 'Páxinas_curtas' ),
        'Specialpages'              => array( 'Páxinas_especiais' ),
@@ -169,7 +170,6 @@ $magicWords = array(
        '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' ),
@@ -271,7 +271,7 @@ $messages = array(
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunca',
-'underline-default' => 'Opción do propio navegador',
+'underline-default' => 'Opción predeterminada da aparencia ou do navegador',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Tipo de letra da caixa de edición:',
@@ -352,12 +352,12 @@ $messages = array(
 'broken-file-category' => 'Páxinas con ligazóns rotas cara a ficheiros',
 
 'about' => 'Acerca de',
-'article' => 'Artigo',
+'article' => 'Páxina de contido',
 'newwindow' => '(abre unha ventá nova)',
 'cancel' => 'Cancelar',
 'moredotdotdot' => 'Máis...',
-'mypage' => 'A miña páxina',
-'mytalk' => 'A miña conversa',
+'mypage' => 'Páxina',
+'mytalk' => 'Conversa',
 'anontalk' => 'Conversa con este enderezo IP',
 'navigation' => 'Navegación',
 'and' => '&#32;e',
@@ -367,20 +367,19 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta páxina',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'As miñas páxinas',
 'qbspecialpages' => 'Páxinas especiais',
 'faq' => 'Preguntas máis frecuentes',
 'faqpage' => 'Project:FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'Engadir un comentario',
+'vector-action-addsection' => 'Nova sección',
 'vector-action-delete' => 'Borrar',
 'vector-action-move' => 'Mover',
 'vector-action-protect' => 'Protexer',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Cambiar a protección',
-'vector-simplesearch-preference' => 'Activar as suxestións de procura melloradas (soamente na aparencia Vector)',
+'vector-simplesearch-preference' => 'Activar a barra de procuras simplificada (soamente na aparencia Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver o historial',
@@ -390,6 +389,7 @@ $messages = array(
 'namespaces' => 'Espazos de nomes',
 'variants' => 'Variantes',
 
+'navigation-heading' => 'Menú de navegación',
 'errorpagetitle' => 'Erro',
 'returnto' => 'Volver a "$1".',
 'tagline' => 'De {{SITENAME}}',
@@ -488,7 +488,7 @@ $1',
 '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}}',
+'newmessageslinkplural' => '{{PLURAL:$1|unha mensaxe nova|mensaxes novas}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|última modificación|últimas modificacións}}',
 'youhavenewmessagesmulti' => 'Ten mensaxes novas en $1',
 'editsection' => 'editar',
@@ -525,7 +525,7 @@ $1',
 'nstab-image' => 'Ficheiro',
 'nstab-mediawiki' => 'Mensaxe',
 'nstab-template' => 'Modelo',
-'nstab-help' => 'Axuda',
+'nstab-help' => 'Páxina de axuda',
 'nstab-category' => 'Categoría',
 
 # Main script and global functions
@@ -586,20 +586,20 @@ Se cadra, xa a borrou alguén.',
 '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.',
+'badtitletext' => 'O título da páxina pedida non era válido, estaba baleiro ou proviña dunha ligazón interlingüística ou interwiki incorrecta.
+Poida que conteña un ou máis caracteres dos que non se poden empregar nos títulos.',
 'perfcached' => 'Esta información é da memoria caché e pode ser que non estea completamente actualizada. Hai un máximo de {{PLURAL:$1|$1 resultado dispoñible|$1 resultados dispoñibles}} na caché.',
 'perfcachedts' => 'Esta información é da memoria caché. Última actualización: $2 ás $3. Hai un máximo de {{PLURAL:$4|$4 resultado dispoñible|$4 resultados dispoñibles}} na caché.',
 'querypage-no-updates' => 'Neste momento están desactivadas as actualizacións nesta páxina. O seu contido non se modificará.',
 'wrong_wfQuery_params' => 'Parámetros incorrectos para wfQuery()<br />
 Función: $1<br />
-Dúbida: $2',
+Pescuda: $2',
 'viewsource' => 'Ver o código fonte',
 'viewsource-title' => 'Ver o código fonte de "$1"',
 'actionthrottled' => 'Acción limitada',
 'actionthrottledtext' => "Como unha medida de loita contra o ''spam'', limítase a realización desta acción a un número determinado de veces nun curto espazo de tempo, e vostede superou este límite.
 Inténteo de novo nuns minutos.",
-'protectedpagetext' => 'Esta páxina foi protexida para evitar a edición.',
+'protectedpagetext' => 'Esta páxina foi protexida para evitar a edición e outras accións.',
 'viewsourcetext' => 'Pode ver e copiar o código fonte desta páxina:',
 'viewyourtext' => "Pode ver e copiar o código fonte '''das súas edicións''' nesta páxina:",
 'protectedinterface' => 'Esta páxina fornece o texto da interface do software e está protexida para evitar o seu abuso.
@@ -613,7 +613,7 @@ $2',
 'namespaceprotected' => "Non dispón de permisos para modificar páxinas no espazo de nomes '''$1'''.",
 'customcssprotected' => 'Non dispón de permisos para modificar esta páxina de CSS, dado que contén a configuración persoal doutro usuario.',
 'customjsprotected' => 'Non dispón de permisos para modificar esta páxina de JavaScript, dado que contén a configuración persoal doutro usuario.',
-'ns-specialprotected' => 'Non se poden editar as páxinas no espazo de nomes {{ns:special}}.',
+'ns-specialprotected' => 'Non se poden editar as páxinas no espazo de nomes "{{ns:special}}".',
 'titleprotected' => "Este título foi protexido da creación por [[User:$1|$1]].
 O motivo achegado é ''$2''.",
 'filereadonlyerror' => 'Non se puido modificar o ficheiro "$1" porque o repositorio "$2" está en modo de só lectura.
@@ -632,10 +632,10 @@ O administrador que bloqueou o repositorio achegou este motivo: "$3".',
 # Login and logout pages
 'logouttext' => "'''Agora está fóra do sistema.'''
 
-Pode continuar usando {{SITENAME}} de xeito anónimo, ou pode [[Special:UserLogin|acceder de novo]] co mesmo nome de usuario ou con outro.
+Pode continuar usando {{SITENAME}} de xeito anónimo, ou pode <span class='plainlinks'>[$1 acceder de novo]</span> co mesmo nome de usuario ou con outro.
 Teña en conta que mentres non se limpa a memoria caché do seu navegador algunhas páxinas poden continuar aparecendo como se aínda estivese dentro do sistema.",
-'welcomecreation' => '== Reciba a nosa benvida, $1! ==
-A súa conta foi creada correctamente.
+'welcomeuser' => 'Reciba a nosa benvida, $1!',
+'welcomecreation-msg' => 'A súa conta foi creada correctamente.
 Non esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENAME}}]].',
 'yourname' => 'Nome de usuario:',
 'yourpassword' => 'Contrasinal:',
@@ -873,7 +873,7 @@ A razón que deu foi a seguinte:
 
 Pode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.
 
-Teña en conta que non pode empregar "enviarlle un correo electrónico a este usuario" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e e que o seu uso non fose bloqueado.
+Teña en conta que non pode empregar a característica "Enviar un correo electrónico a este usuario" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e e que o seu uso non fose bloqueado.
 
 O seu enderezo IP actual é $3 e o ID do bloqueo é #$5.
 Por favor, inclúa eses datos nas consultas que faga.',
@@ -929,7 +929,7 @@ Lembre que as páxinas .css e .js personalizadas utilizan un título en minúscu
 'updated' => '(Actualizado)',
 'note' => "'''Nota:'''",
 'previewnote' => "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
-'continue-editing' => 'Continuar editando',
+'continue-editing' => 'Ir ata a caixa de edición',
 'previewconflict' => 'Esta vista previa mostra o texto na área superior tal e como aparecerá se escolle gardar.',
 'session_fail_preview' => "'''O sistema non pode procesar a súa edición porque se perderon os datos de inicio da sesión.
 Por favor, inténteo de novo.
@@ -1012,6 +1012,15 @@ Semella que foi borrada.',
 'edit-already-exists' => 'Non se pode crear a nova páxina.
 Esta xa existe.',
 'defaultmessagetext' => 'Texto predeterminado',
+'content-failed-to-parse' => 'Erro ao analizar o contido de "$2" para o modelo de $1: $3',
+'invalid-content-data' => 'Datos de contido inválidos',
+'content-not-allowed-here' => 'O contido "$1" non está permitido na páxina "[[$2]]"',
+
+# Content models
+'content-model-wikitext' => 'texto wiki',
+'content-model-text' => 'texto simple',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Aviso:''' Esta páxina contén demasiados analizadores de funcións de chamadas.
@@ -1268,8 +1277,6 @@ O [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistro de borrad
 'search-interwiki-caption' => 'Proxectos irmáns',
 'search-interwiki-default' => 'Resultados en $1:',
 'search-interwiki-more' => '(máis)',
-'search-mwsuggest-enabled' => 'con suxestións',
-'search-mwsuggest-disabled' => 'sen suxestións',
 'search-relatedarticle' => 'Relacionado',
 'mwsuggest-disable' => 'Deshabilitar as suxestións AJAX',
 'searcheverything-enable' => 'Procurar en todos os espazos de nomes',
@@ -1305,7 +1312,7 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 
 # Preferences page
 'preferences' => 'Preferencias',
-'mypreferences' => 'As miñas preferencias',
+'mypreferences' => 'Preferencias',
 'prefs-edits' => 'Número de edicións:',
 'prefsnologin' => 'Non accedeu ao sistema',
 'prefsnologintext' => 'Debe <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} acceder ao sistema]</span> para modificar as preferencias de usuario.',
@@ -1317,7 +1324,7 @@ Note que os seus índices do contido de {{SITENAME}} poden estar desactualizados
 'prefs-datetime' => 'Data e hora',
 'prefs-labs' => 'Características experimentais',
 'prefs-user-pages' => 'Páxinas de usuario',
-'prefs-personal' => 'Información do usuario',
+'prefs-personal' => 'Información de usuario',
 'prefs-rc' => 'Cambios recentes',
 'prefs-watchlist' => 'Lista de vixilancia',
 'prefs-watchlist-days' => 'Número de días que mostrar na lista de vixilancia:',
@@ -1386,7 +1393,7 @@ Este cambio non se poderá desfacer.',
 'prefs-memberingroups' => 'Membro {{PLURAL:$1|do grupo|dos grupos}}:',
 'prefs-registration' => 'Data e hora de rexistro:',
 'yourrealname' => 'Nome real:',
-'yourlanguage' => 'Lingua da interface:',
+'yourlanguage' => 'Lingua:',
 'yourvariant' => 'Variante de lingua para os contidos:',
 'prefs-help-variant' => 'A variante ou ortografía preferida na que mostrar o contido das páxinas deste wiki.',
 'yournick' => 'Sinatura:',
@@ -1534,8 +1541,11 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 # User rights log
 'rightslog' => 'Rexistro de dereitos de usuario',
 'rightslogtext' => 'Este é un rexistro dos cambios nos permisos de usuario.',
-'rightslogentry' => 'cambiou o grupo ao que pertence "$1" de $2 a $3',
+'rightslogentry' => 'cambiou o grupo ao que pertence $1 de $2 a $3',
 'rightslogentry-autopromote' => 'foi promovido automaticamente de $2 a $3',
+'logentry-rights-rights' => '$1 cambiou o grupo ao que pertence $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 cambiou o grupo ao que pertence $3',
+'logentry-rights-autopromote' => '$1 foi promovido automaticamente de $4 a $5',
 'rightsnone' => '(ningún)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1587,7 +1597,7 @@ Ha de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.',
 'recentchanges-label-unpatrolled' => 'Esta edición aínda non foi comprobada',
 'rcnote' => "A continuación {{PLURAL:$1|móstrase '''1''' cambio|móstranse os últimos '''$1''' cambios}} {{PLURAL:$2|no último día|nos últimos '''$2''' días}} ata o $4 ás $5.",
 'rcnotefrom' => "A continuación móstranse os cambios feitos desde o '''$3''' ás '''$4''' (móstranse '''$1''' como máximo).",
-'rclistfrom' => 'Mostrar os cambios novos desde as $1',
+'rclistfrom' => 'Mostrar os cambios novos desde o $1',
 'rcshowhideminor' => '$1 as edicións pequenas',
 'rcshowhidebots' => '$1 os bots',
 'rcshowhideliu' => '$1 os usuarios rexistrados',
@@ -1783,6 +1793,7 @@ Se o problema persiste, póñase en contacto cun [[Special:ListUsers/sysop|admin
 'backend-fail-notsame' => 'Xa existe un ficheiro chamado "$1", con contidos diferentes.',
 'backend-fail-invalidpath' => '"$1" non é unha ruta de almacenamento válida.',
 'backend-fail-delete' => 'Non se deu borrado o ficheiro "$1".',
+'backend-fail-describe' => 'Non se puideron cambiar os metadatos do ficheiro "$1".',
 'backend-fail-alreadyexists' => 'O ficheiro "$1" xa existe.',
 'backend-fail-store' => 'Non se deu almacenado o ficheiro "$1" en "$2".',
 'backend-fail-copy' => 'Non se deu copiado o ficheiro "$1" en "$2".',
@@ -1934,7 +1945,7 @@ 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.',
+'upload-disallowed-here' => 'Non pode sobrescribir este ficheiro.',
 
 # File reversion
 'filerevert' => 'Reverter $1',
@@ -2142,7 +2153,8 @@ Pode precisar máis a vista seleccionando o tipo de rexistro, o nome do usuario
 'allpagesnext' => 'Seguinte',
 'allpagessubmit' => 'Mostrar',
 'allpagesprefix' => 'Mostrar as páxinas que comezan co prefixo:',
-'allpagesbadtitle' => 'O título dado á páxina non era válido ou contiña un prefixo inter-linguas ou inter-wikis. Pode que conteña un ou máis caracteres que non se poden empregar nos títulos.',
+'allpagesbadtitle' => 'O título dado á páxina non era válido ou tiña un prefixo interlingüístico ou interwiki.
+Poida que conteña un ou máis caracteres dos que non se poden empregar nos títulos.',
 'allpages-bad-ns' => '{{SITENAME}} carece do espazo de nomes "$1".',
 'allpages-hide-redirects' => 'Agochar as redireccións',
 
@@ -2172,7 +2184,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: <code>$1</code> (non engada ningún destes na súa procura).',
+Protocolos soportados: <code>$1</code> (úsase http:// como predeterminado se non se especifica ningún protocolo).',
 '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.',
 
@@ -2221,8 +2233,8 @@ Se quere máis información acerca dos dereitos individuais, pode atopala [[{{Me
 '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.',
+'emailpagetext' => 'Pode usar o seguinte formulario para enviar unha mensaxe de correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}.
+O enderezo de correo electrónico que inseriu [[Special:Preferences|nas súas preferencias]] aparecerá no campo "De:" do correo, polo que {{GENDER:$1|o receptor|a receptora}} da mensaxe poderá responderlle directamente.',
 'usermailererror' => 'O obxecto enviado deu unha mensaxe de erro:',
 'defemailsubject' => 'Correo electrónico do usuario $1 de {{SITENAME}}',
 'usermaildisabled' => 'O correo electrónico do usuario está desactivado',
@@ -2253,7 +2265,7 @@ O correo electrónico que inseriu [[Special:Preferences|nas súas preferencias]]
 
 # Watchlist
 'watchlist' => 'A miña lista de vixilancia',
-'mywatchlist' => 'A miña lista de vixilancia',
+'mywatchlist' => 'Lista de vixilancia',
 'watchlistfor2' => 'De $1 $2',
 'nowatchlist' => 'Non ten elementos na súa lista de vixilancia.',
 'watchlistanontext' => 'Faga o favor de $1 ao sistema para ver ou editar os elementos da súa lista de vixilancia.',
@@ -2287,22 +2299,25 @@ Os cambios futuros nesta páxina e na súa páxina de conversa asociada serán l
 'unwatching' => 'Deixando de vixiar...',
 'watcherrortext' => 'Houbo un erro ao cambiar as súas opcións de vixilancia para a páxina "$1".',
 
-'enotif_mailer' => 'Correo de aviso de {{SITENAME}}',
+'enotif_mailer' => 'Sistema de notificacións por correo de {{SITENAME}}',
 'enotif_reset' => 'Marcar todas as páxinas como visitadas',
-'enotif_newpagetext' => 'Esta é unha páxina nova.',
 'enotif_impersonal_salutation' => 'usuario de {{SITENAME}}',
-'changed' => 'modificada',
-'created' => 'creada',
-'enotif_subject' => 'A páxina de {{SITENAME}} chamada "$PAGETITLE" foi $CHANGEDORCREATED por $PAGEEDITOR',
-'enotif_lastvisited' => 'Vexa $1 para comprobar todos os cambios desde a súa última visita.',
-'enotif_lastdiff' => 'Vexa $1 para visualizar esta modificación.',
+'enotif_subject_deleted' => '{{GENDER:$2|$2}} borrou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_subject_created' => '{{GENDER:$2|$2}} creou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_subject_moved' => '{{GENDER:$2|$2}} trasladou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_subject_restored' => '{{GENDER:$2|$2}} restaurou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_subject_changed' => '{{GENDER:$2|$2}} modificou a páxina chamada "$1" en {{SITENAME}}',
+'enotif_body_intro_deleted' => '{{GENDER:$2|$2}} borrou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
+'enotif_body_intro_created' => '{{GENDER:$2|$2}} creou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
+'enotif_body_intro_moved' => '{{GENDER:$2|$2}} trasladou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
+'enotif_body_intro_restored' => '{{GENDER:$2|$2}} restaurou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
+'enotif_body_intro_changed' => '{{GENDER:$2|$2}} modificou a páxina chamada "$1" en {{SITENAME}} o $PAGEEDITDATE. Consulte $3 para ver a revisión actual.',
+'enotif_lastvisited' => 'Consulte $1 para comprobar todos os cambios feitos desde a súa última visita.',
+'enotif_lastdiff' => 'Consulte $1 para ver esta modificación.',
 'enotif_anon_editor' => 'usuario anónimo $1',
-'enotif_body' => 'Estimado $WATCHINGUSERNAME:
-
-
-A páxina de {{SITENAME}} "$PAGETITLE" foi $CHANGEDORCREATED o $PAGEEDITDATE por $PAGEEDITOR, olle $PAGETITLE_URL para comprobar a versión actual.
+'enotif_body' => 'Boas, $WATCHINGUSERNAME:
 
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Resumo de edición: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2310,10 +2325,9 @@ Pode contactar co editor:
 por correo electrónico: $PAGEEDITOR_EMAIL
 no wiki: $PAGEEDITOR_WIKI
 
-Non se producirán novas notificacións cando haxa novos cambios ata que vostede visite a páxina.
-Pode borrar os indicadores de aviso de notificación para o conxunto das páxinas marcadas na súa lista de vixilancia.
+Non se producirán novas notificacións cando haxa novos cambios ata que vostede visite a páxina. Pode borrar os indicadores de aviso de notificación para o conxunto das páxinas marcadas na súa lista de vixilancia.
 
-             O sistema de aviso de {{SITENAME}}
+       O sistema de avisos de {{SITENAME}}
 
 --
 Para cambiar as notificacións por correo electrónico, visite
@@ -2369,7 +2383,7 @@ proceda con coidado.',
 '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',
+'rollbackfailed' => 'Houbo un erro 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.
 
@@ -2482,7 +2496,8 @@ O texto destas revisións eliminadas só está á disposición dos administrador
 'undeletedrevisions' => '$1 {{PLURAL:$1|revisión restaurada|revisións restauradas}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|revisión|revisións}} e $2 {{PLURAL:$2|ficheiro restaurado|ficheiros restaurados}}',
 'undeletedfiles' => '$1 {{PLURAL:$1|ficheiro restaurado|ficheiros restaurados}}',
-'cannotundelete' => 'Non se restaurou a páxina porque alguén xa o fixo antes.',
+'cannotundelete' => 'Houbo un erro durante a restauración:
+$1',
 'undeletedpage' => "'''A páxina \"\$1\" foi restaurada'''
 
 Comprobe o [[Special:Log/delete|rexistro de borrados]] para ver as entradas recentes no rexistro de páxinas eliminadas e restauradas.",
@@ -2514,9 +2529,9 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contribucións {{GENDER:{{BASEPAGENAME}}|do usuario|da usuaria}}',
+'contributions' => 'Contribucións {{GENDER:$1|do usuario|da usuaria}}',
 'contributions-title' => 'Contribucións de $1',
-'mycontris' => 'As miñas contribucións',
+'mycontris' => 'Contribucións',
 'contribsub2' => 'De $1 ($2)',
 'nocontribs' => 'Non se deron atopado cambios con eses criterios.',
 'uctop' => '(última revisión)',
@@ -2556,7 +2571,7 @@ Velaquí está a última entrada do rexistro de bloqueos, por se quere consultal
 'whatlinkshere-hideredirs' => '$1 as redireccións',
 'whatlinkshere-hidetrans' => '$1 as inclusións',
 'whatlinkshere-hidelinks' => '$1 as ligazóns',
-'whatlinkshere-hideimages' => '$1 as ligazóns á imaxe',
+'whatlinkshere-hideimages' => '$1 as ligazóns ao ficheiro',
 'whatlinkshere-filters' => 'Filtros',
 
 # Block/unblock
@@ -2647,7 +2662,7 @@ O motivo do bloqueo de $1 é: "$2"',
 'blocklogpage' => 'Rexistro de bloqueos',
 'blocklog-showlog' => 'Este usuario xa foi bloqueado con anterioridade. Velaquí está o rexistro de bloqueos por se quere consultalo:',
 'blocklog-showsuppresslog' => 'Este usuario xa foi bloqueado e agochado con anterioridade. Velaquí está o rexistro de supresións por se quere consultalo:',
-'blocklogentry' => 'bloqueou a "[[$1]]" cun tempo de duración de $2 $3',
+'blocklogentry' => 'bloqueou a [[$1]] cun tempo de duración de $2 $3',
 'reblock-logentry' => 'cambiou as configuracións do bloqueo de "[[$1]]" cunha caducidade de $2 $3',
 'blocklogtext' => 'Este é o rexistro das accións de bloqueo e desbloqueo de usuarios.
 Non se listan os enderezos IP bloqueados automaticamente.
@@ -2785,6 +2800,7 @@ Quérea borrar para deixar sitio para facer o traslado?',
 'immobile-target-namespace-iw' => 'A ligazón interwiki non é válida para o movemento da páxina.',
 'immobile-source-page' => 'Esta páxina non se pode mover.',
 'immobile-target-page' => 'Non se pode mover a ese título.',
+'bad-target-model' => 'O destino desexado utiliza un modelo de contido diferente. Non se pode facer a conversión entre $1 e $2.',
 'imagenocrossnamespace' => 'Non se pode mover o ficheiro a un espazo de nomes que non o admite',
 'nonfile-cannot-move-to-file' => 'Non se pode mover algo que non é un ficheiro ao espazo de nomes reservado aos ficheiros',
 'imagetypemismatch' => 'A nova extensión do fiheiro non coincide co seu tipo',
@@ -2910,7 +2926,6 @@ Gárdeo no seu disco duro e cárgueo aquí.',
 
 # JavaScriptTest
 'javascripttest' => 'Proba de JavaScript',
-'javascripttest-disabled' => 'Esta función está desactivada neste wiki.',
 'javascripttest-title' => 'Executando probas de $1',
 'javascripttest-pagetext-noframework' => 'Esta páxina está reservada para executar probas do JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Descoñécese a infraestrutura dixital "$1" de probas.',
@@ -2960,7 +2975,7 @@ Pode ver o código fonte.',
 'tooltip-feed-atom' => 'Fonte de novas Atom desta páxina',
 'tooltip-t-contributions' => 'Ver a lista de contribucións {{GENDER:{{BASEPAGENAME}}|deste usuario|desta usuaria}}',
 'tooltip-t-emailuser' => 'Enviarlle unha mensaxe a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}} por correo electrónico',
-'tooltip-t-upload' => 'Cargar os ficheiros',
+'tooltip-t-upload' => 'Cargar ficheiros',
 'tooltip-t-specialpages' => 'Lista de todas as páxinas especiais',
 'tooltip-t-print' => 'Versión para imprimir da páxina',
 'tooltip-t-permalink' => 'Ligazón permanente a esta versión da páxina',
@@ -3014,7 +3029,7 @@ Pode ver o código fonte.',
 'nostalgia.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Morriña */',
 'cologneblue.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Azul colonial */',
 'monobook.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia MonoBook */',
-'myskin.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia A miña aparencia */',
+'myskin.js' => '/* O JavaScript que se coloque aquí afectará a quen use a aparencia A miña aparencia */',
 'chick.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Parrulo */',
 'simple.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Sinxela */',
 'modern.js' => '/* Calquera JavaScript que haxa aquí será cargado para os usuarios que usen a aparencia Moderna */',
@@ -3051,6 +3066,7 @@ 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-not-current' => 'Sentímolo, non é posible achegar esa información sobre as revisións vellas.',
 'pageinfo-header-basic' => 'Información básica',
 'pageinfo-header-edits' => 'Historial de edicións',
 'pageinfo-header-restrictions' => 'Protección da páxina',
@@ -3059,6 +3075,7 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 '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-language' => 'Lingua do contido da páxina',
 'pageinfo-robot-policy' => 'Estado do motor de procuras',
 'pageinfo-robot-index' => 'Indexable',
 'pageinfo-robot-noindex' => 'Non indexable',
@@ -3075,10 +3092,17 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Información da páxina',
+'pageinfo-redirectsto' => 'Redirixe cara a',
+'pageinfo-redirectsto-info' => 'información',
+'pageinfo-contentpage' => 'Cóntase como páxina de contido',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading' => 'Protección en serie activada',
+'pageinfo-protect-cascading-yes' => 'Si',
+'pageinfo-protect-cascading-from' => 'Protección en serie activada',
 
 # Skin names
 'skinname-standard' => 'Clásica',
@@ -3100,6 +3124,8 @@ Isto, probabelmente, se debe a unha ligazón cara a un sitio externo que está n
 'markedaspatrollederror' => 'Non se pode marcar como revisada',
 'markedaspatrollederrortext' => 'É preciso especificar unha revisión para marcala como revisada.',
 'markedaspatrollederror-noautopatrol' => 'Non está permitido que un mesmo marque as propias edicións como revisadas.',
+'markedaspatrollednotify' => 'A modificación feita en "$1" marcouse como revisada.',
+'markedaspatrollederrornotify' => 'Erro ao marcar como revisada.',
 
 # Patrol log
 'patrol-log-page' => 'Rexistro de revisións',
@@ -3158,12 +3184,13 @@ O seu sistema pode quedar comprometido se o executa.",
 'sp-newimages-showfrom' => 'Mostrar os novos ficheiros comezando polo $1 ás $2',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
-'minutes-abbrev' => '$1min',
+'minutes-abbrev' => '$1 min',
 'seconds' => '{{PLURAL:$1|$1 segundo|$1 segundos}}',
 'minutes' => '{{PLURAL:$1|$1 minuto|$1 minutos}}',
 'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
 'days' => '{{PLURAL:$1|$1 día|$1 días}}',
 'ago' => 'hai $1',
+'just-now' => 'agora mesmo',
 
 # Bad image list
 'bad_image_list' => 'O formato é o seguinte:
@@ -3664,6 +3691,7 @@ O código de confirmación caduca o $6 ás $7.',
 # Scary transclusion
 'scarytranscludedisabled' => '[A transclusión interwiki está desactivada]',
 'scarytranscludefailed' => '[Fallou a busca do modelo "$1"]',
+'scarytranscludefailed-httpstatus' => '[Fallou a busca do modelo "$1": HTTP $2]',
 'scarytranscludetoolong' => '[O enderezo URL é demasiado longo]',
 
 # Delete conflict
@@ -3779,6 +3807,7 @@ Tamén pode [[Special:EditWatchlist|empregar o editor normal]].',
 'version-license' => 'Licenza',
 'version-poweredby-credits' => "Este wiki está desenvolvido por '''[//www.mediawiki.org/wiki/MediaWiki/gl MediaWiki]''', dereitos de autor © 2001-$1 $2.",
 'version-poweredby-others' => 'outros',
+'version-credits-summary' => 'Queremos recoñecer as seguintes persoas polas súas achegas a [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki é software libre; pode redistribuílo e/ou modificalo segundo os termos da licenza pública xeral GNU publicada pola Free Software Foundation; versión 2 ou (na súa escolla) calquera outra posterior.
 
 MediaWiki distribúese coa esperanza de que poida ser útil, pero SEN GARANTÍA NINGUNHA; nin sequera a garantía implícita de COMERCIALIZACIÓN ou ADECUACIÓN A UNHA FINALIDADE ESPECÍFICA. Olle a licenza pública xeral GNU para obter máis detalles.
@@ -3919,10 +3948,10 @@ As imaxes móstranse na súa resolución completa; outros tipos de ficheiros in
 'logentry-move-move_redir-noredirect' => '$1 moveu a páxina "$3" a "$4" sobre unha redirección sen deixar unha redirección',
 'logentry-patrol-patrol' => '$1 marcou a revisión $4 da páxina "$3" como patrullada',
 'logentry-patrol-patrol-auto' => '$1 marcou automaticamente a revisión $4 da páxina "$3" como patrullada',
-'logentry-newusers-newusers' => '$1 creou unha conta de usuario',
-'logentry-newusers-create' => '$1 creou unha conta de usuario',
-'logentry-newusers-create2' => '$1 creou unha conta de usuario $3',
-'logentry-newusers-autocreate' => 'A conta $1 creouse automaticamente',
+'logentry-newusers-newusers' => 'Creouse a conta de usuario $1',
+'logentry-newusers-create' => 'Creouse a conta de usuario $1',
+'logentry-newusers-create2' => '$1 creou a conta de usuario $3',
+'logentry-newusers-autocreate' => 'A conta de usuario $1 creouse automaticamente',
 'newuserlog-byemail' => 'contrasinal enviado por correo electrónico',
 
 # Feedback
@@ -3941,6 +3970,10 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 'feedback-bugcheck' => 'Perfecto! Comprobe que aínda non está entre os [$1 erros coñecidos].',
 'feedback-bugnew' => 'Comprobeino. Informar deste novo erro',
 
+# Search suggestions
+'searchsuggest-search' => 'Procurar',
+'searchsuggest-containing' => 'que conteña...',
+
 # API errors
 'api-error-badaccess-groups' => 'Non ten os permisos necesarios para cargar ficheiros neste wiki.',
 'api-error-badtoken' => 'Erro interno: Pase incorrecto.',
@@ -3993,4 +4026,6 @@ En caso contrario, pode empregar o formulario sinxelo inferior. O seu comentario
 'duration-centuries' => '$1 {{PLURAL:$1|século|séculos}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenio|milenios}}',
 
+# Unknown messages
+'svg-long-error' => 'Ficheiro SVG non válido: $1',
 );
index 14353d3..2a37792 100644 (file)
 
 $fallback = 'fa';
 
+$rtl = true;
+
 $messages = array(
 'moredotdotdot' => 'ویشتر...',
-'mypage'        => 'می هنه‌شر',
-'mytalk'        => 'می گب',
-'anontalk'      => 'اَ آی.پیˇ گب',
+'mypage' => 'می هنه‌شر',
+'mytalk' => 'می گب',
+'anontalk' => 'اَ آی.پیˇ گب',
 
 # Cologne Blue skin
 'qbfind' => 'یاتن',
 'qbedit' => 'دچین واچین',
 
-'returnto'         => 'واگرد به $1.',
-'search'           => 'واموج',
-'searchbutton'     => 'واموج',
-'go'               => 'بوشو',
-'searcharticle'    => 'بوشو',
-'history_short'    => 'تارئخ',
+'returnto' => 'واگرد به $1.',
+'search' => 'واموج',
+'searchbutton' => 'واموج',
+'go' => 'بوشو',
+'searcharticle' => 'بوشو',
+'history_short' => 'تارئخ',
 'printableversion' => 'پرینتی نوسخه',
-'permalink'        => 'مؤنسنی پیوند',
-'edit'             => 'دچین واچین',
-'editthispage'     => 'اَ هنه‌شره (صفحه‌یه) دچین‌واچین بکون.',
+'permalink' => 'مؤنسنی پیوند',
+'edit' => 'دچین واچین',
+'editthispage' => 'اَ هنه‌شره (صفحه‌یه) دچین‌واچین بکون.',
 'create-this-page' => 'اَ هنه‌شره (صفحه‌یه) چاکون.',
-'deletethispage'   => 'اَ هنه‌شره پاکأ کون.',
-'newpage'          => 'تازه هنه‌شر (تازه صفحه)',
+'deletethispage' => 'اَ هنه‌شره پاکأ کون.',
+'newpage' => 'تازه هنه‌شر (تازه صفحه)',
 'talkpagelinktext' => 'گب',
-'talk'             => 'گب',
-'toolbox'          => 'ابزار جیگا',
-'jumpto'           => 'واز بکون به:',
+'talk' => 'گب',
+'toolbox' => 'ابزار جیگا',
+'jumpto' => 'واز بکون به:',
 'jumptonavigation' => 'گردسن',
-'jumptosearch'     => 'واموج',
+'jumptosearch' => 'واموج',
 
 # 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).
-'currentevents'        => 'تازه چیؤن',
-'mainpage'             => 'گت صفحه',
+'currentevents' => 'تازه چیؤن',
+'mainpage' => 'گت صفحه',
 'mainpage-description' => 'گت صفحه',
-'portal'               => 'امه جیگا',
-'privacy'              => 'رازبداری',
+'portal' => 'امه جیگا',
+'privacy' => 'رازبداری',
 
 'editsection' => 'دچین‌واچین',
-'editold'     => 'دچین‌واچین',
+'editold' => 'دچین‌واچین',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'وانیویس (مقاله)',
-'nstab-user'     => 'کاربری هنه‌شر',
+'nstab-main' => 'وانیویس (مقاله)',
+'nstab-user' => 'کاربری هنه‌شر',
 'nstab-category' => 'رج',
 
 # Search results
-'searchresults'       => 'واموج‌دموجˇ نتایج',
+'searchresults' => 'واموج‌دموجˇ نتایج',
 'searchresults-title' => 'واموج‌دموجˇ نتایج، «$1»ˇ واسی',
-'searchsubtitle'      => "شمه '''[[:$1]]''' ره واموتید ([[Special:Prefixindex/$1|هنه‌شرانی (صفحه‌هایی) کی «$1» همره سرأ گیفته بیدی (شوروع بیدی).]]{{int:pipe-separator}}
+'searchsubtitle' => "شمه '''[[:$1]]''' ره واموتید ([[Special:Prefixindex/$1|هنه‌شرانی (صفحه‌هایی) کی «$1» همره سرأ گیفته بیدی (شوروع بیدی).]]{{int:pipe-separator}}
 [[Special:WhatLinksHere/$1|او هنه‌شرانی (صفحه‌هایی) کی به «$1» خال (لینک) بدأیید]])",
 
 # Special:AllPages
@@ -77,7 +79,7 @@ $messages = array(
 'blocklink' => 'دَوَسته ببه',
 
 # Tooltip help for the actions
-'tooltip-ca-edit'    => 'شمه تانید اَ هنه‌شره (صفحه) دچین‌واچین بکونید. بی‌زحمت قبل از ان‌کی ذخیره بکونید، پیش‌نمایشˇ دوکمه جا استفاده بکونید.',
+'tooltip-ca-edit' => 'شمه تانید اَ هنه‌شره (صفحه) دچین‌واچین بکونید. بی‌زحمت قبل از ان‌کی ذخیره بکونید، پیش‌نمایشˇ دوکمه جا استفاده بکونید.',
 'tooltip-ca-history' => 'اَ هنه‌شر (صفحه)ˇ قدیمی نسخه‌یان',
 
 );
index 5733ff5..06af738 100644 (file)
@@ -36,151 +36,151 @@ $namespaceGenderAliases = array();
 
 $messages = array(
 # User preference toggles
-'tog-underline'       => 'Haiguy joajuha',
-'tog-justify'         => 'embojoja haipyvo',
-'tog-hideminor'       => 'Eñomi ñemyatyrõ michĩva «ñemoambue pyahúpe»',
+'tog-underline' => 'Haiguy joajuha',
+'tog-justify' => 'embojoja haipyvo',
+'tog-hideminor' => 'Eñomi ñemyatyrõ michĩva «ñemoambue pyahúpe»',
 'tog-extendwatchlist' => 'Eipyso tembiapo rapykueho rysýi opaite ñemoambue ikatúvape',
-'tog-usenewrc'        => "Ñemoambue ojejapo ramóva (ndoikói opaite 'navegador'-pe)",
-'tog-numberheadings'  => 'Mbopapapy ijehegui myakãha',
-'tog-showtoolbar'     => 'Ehechauka ñemyatyrõ renda',
+'tog-usenewrc' => "Ñemoambue ojejapo ramóva (ndoikói opaite 'navegador'-pe)",
+'tog-numberheadings' => 'Mbopapapy ijehegui myakãha',
+'tog-showtoolbar' => 'Ehechauka ñemyatyrõ renda',
 
 'underline-always' => 'Akói',
-'underline-never'  => "Araka'eve",
+'underline-never' => "Araka'eve",
 
 # Dates
-'sunday'        => 'arateĩ',
-'monday'        => 'arakői',
-'tuesday'       => 'araapy',
-'wednesday'     => 'ararundy',
-'thursday'      => 'arapo',
-'friday'        => 'arapoteĩ',
-'saturday'      => 'arapokői',
-'sun'           => 'arateĩ',
-'mon'           => 'arakõi',
-'tue'           => 'araapy',
-'wed'           => 'ararundy',
-'thu'           => 'arapo',
-'fri'           => 'arapoteĩ',
-'january'       => 'jasyteĩ',
-'february'      => 'jasykői',
-'march'         => 'jasyapy',
-'april'         => 'jasyrundy',
-'may_long'      => 'jasypo',
-'june'          => 'jasypoteĩ',
-'july'          => 'jasypokői',
-'august'        => 'jasypoapy',
-'september'     => 'jasyporundy',
-'october'       => 'jasypa',
-'november'      => 'jasypateĩ',
-'december'      => 'jasypakői',
-'january-gen'   => 'jasyteĩ',
-'february-gen'  => 'jasykõi',
-'march-gen'     => 'jasyapy',
-'april-gen'     => 'jasyrundy',
-'may-gen'       => 'jasypo',
-'june-gen'      => 'jasypoteĩ',
-'july-gen'      => 'jasypokõi',
-'august-gen'    => 'jasypoapy',
+'sunday' => 'arateĩ',
+'monday' => 'arakői',
+'tuesday' => 'araapy',
+'wednesday' => 'ararundy',
+'thursday' => 'arapo',
+'friday' => 'arapoteĩ',
+'saturday' => 'arapokői',
+'sun' => 'arateĩ',
+'mon' => 'arakõi',
+'tue' => 'araapy',
+'wed' => 'ararundy',
+'thu' => 'arapo',
+'fri' => 'arapoteĩ',
+'january' => 'jasyteĩ',
+'february' => 'jasykői',
+'march' => 'jasyapy',
+'april' => 'jasyrundy',
+'may_long' => 'jasypo',
+'june' => 'jasypoteĩ',
+'july' => 'jasypokői',
+'august' => 'jasypoapy',
+'september' => 'jasyporundy',
+'october' => 'jasypa',
+'november' => 'jasypateĩ',
+'december' => 'jasypakői',
+'january-gen' => 'jasyteĩ',
+'february-gen' => 'jasykõi',
+'march-gen' => 'jasyapy',
+'april-gen' => 'jasyrundy',
+'may-gen' => 'jasypo',
+'june-gen' => 'jasypoteĩ',
+'july-gen' => 'jasypokõi',
+'august-gen' => 'jasypoapy',
 'september-gen' => 'jasyporundy',
-'october-gen'   => 'jasypa',
-'november-gen'  => 'jasypateĩ',
-'december-gen'  => 'jasypakõi',
-'jan'           => 'jasyteĩ',
-'feb'           => 'jasykõi',
-'mar'           => 'jasyapy',
-'apr'           => 'jasyrundy',
-'may'           => 'jasypo',
-'jun'           => 'jasypoteĩ',
-'jul'           => 'jasypokõi',
-'aug'           => 'jasypoapy',
-'sep'           => 'jasyporundy',
-'oct'           => 'jasypa',
-'nov'           => 'jasypateĩ',
-'dec'           => 'jasypakõi',
+'october-gen' => 'jasypa',
+'november-gen' => 'jasypateĩ',
+'december-gen' => 'jasypakõi',
+'jan' => 'jasyteĩ',
+'feb' => 'jasykõi',
+'mar' => 'jasyapy',
+'apr' => 'jasyrundy',
+'may' => 'jasypo',
+'jun' => 'jasypoteĩ',
+'jul' => 'jasypokõi',
+'aug' => 'jasypoapy',
+'sep' => 'jasyporundy',
+'oct' => 'jasypa',
+'nov' => 'jasypateĩ',
+'dec' => 'jasypakõi',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Ñemohenda|Ñemohendakuéra}}',
 
-'about'      => 'Rehegua',
-'article'    => 'Kuatiahai',
-'newwindow'  => "(Ojepe'a peteĩ ovetã pyahu)",
-'cancel'     => 'Mbotove',
-'mypage'     => 'Che kuatiarogue',
-'mytalk'     => 'Che myangekõi',
+'about' => 'Rehegua',
+'article' => 'Kuatiahai',
+'newwindow' => "(Ojepe'a peteĩ ovetã pyahu)",
+'cancel' => 'Mbotove',
+'mypage' => 'Che kuatiarogue',
+'mytalk' => 'Che myangekõi',
 'navigation' => 'Kundaharã',
 
 # Cologne Blue skin
-'qbfind'         => 'Heka',
-'qbedit'         => 'Jehaijey',
+'qbfind' => 'Heka',
+'qbedit' => 'Jehaijey',
 'qbspecialpages' => 'Kuatiarogue hekochĩchĩva',
 
-'tagline'          => '{{SITENAME}}megua',
-'help'             => 'Pytyvõhára',
-'search'           => 'Heka',
-'searchbutton'     => 'Heka',
-'go'               => 'Ha',
-'searcharticle'    => 'Ha',
-'history'          => 'Tembiasakue',
-'history_short'    => 'Tembiasakue',
+'tagline' => '{{SITENAME}}megua',
+'help' => 'Pytyvõhára',
+'search' => 'Heka',
+'searchbutton' => 'Heka',
+'go' => 'Ha',
+'searcharticle' => 'Ha',
+'history' => 'Tembiasakue',
+'history_short' => 'Tembiasakue',
 'printableversion' => 'Osẽma haguãicha',
-'edit'             => 'Jehaijey',
-'delete'           => "Mboje'o",
-'undelete_short'   => 'Restaurar $1 ediciones',
-'newpage'          => 'Pyahu kuatia',
+'edit' => 'Jehaijey',
+'delete' => "Mboje'o",
+'undelete_short' => 'Restaurar $1 ediciones',
+'newpage' => 'Pyahu kuatia',
 'talkpagelinktext' => "ñe'ẽ",
-'specialpage'      => "Kuatiarogue mba'echĩchĩ",
-'personaltools'    => 'Tapicha rembipuru',
-'postcomment'      => "Emoĩ ne remimo'ã",
-'talk'             => 'Myangekõi',
-'views'            => 'Techakuéra',
-'toolbox'          => 'Tembiporu',
-'mediawikipage'    => 'Hecha kuatiarogue marandu',
-'viewtalkpage'     => 'Hecha myangekõi',
-'otherlanguages'   => "Ambue ñe'ẽ",
-'redirectedfrom'   => '(Oñembohapejeýva $1)',
-'lastmodifiedat'   => 'Ko kuatiarogue oñemoambuejeýkuri: $2, $1.',
-'viewcount'        => 'Esta página ha sido visitada $1 veces.',
-'jumpto'           => 'Kundaharãme jeho',
+'specialpage' => "Kuatiarogue mba'echĩchĩ",
+'personaltools' => 'Tapicha rembipuru',
+'postcomment' => "Emoĩ ne remimo'ã",
+'talk' => 'Myangekõi',
+'views' => 'Techakuéra',
+'toolbox' => 'Tembiporu',
+'mediawikipage' => 'Hecha kuatiarogue marandu',
+'viewtalkpage' => 'Hecha myangekõi',
+'otherlanguages' => "Ambue ñe'ẽ",
+'redirectedfrom' => '(Oñembohapejeýva $1)',
+'lastmodifiedat' => 'Ko kuatiarogue oñemoambuejeýkuri: $2, $1.',
+'viewcount' => 'Esta página ha sido visitada $1 veces.',
+'jumpto' => 'Kundaharãme jeho',
 'jumptonavigation' => 'kundaharã',
-'jumptosearch'     => 'Jeheka',
+'jumptosearch' => 'Jeheka',
 
 # 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'            => 'Ári {{SITENAME}}',
-'aboutpage'            => 'Project:Rehegua',
-'copyright'            => "Tembikuaa'aty ikatu ojepuru <i>$1</i> rekópe",
-'currentevents'        => 'Ag̃agua',
-'disclaimers'          => 'Marandu leiguigua',
-'edithelp'             => 'Jehairã ñepytyvõ',
-'mainpage'             => 'Ape',
+'aboutsite' => 'Ári {{SITENAME}}',
+'aboutpage' => 'Project:Rehegua',
+'copyright' => "Tembikuaa'aty ikatu ojepuru <i>$1</i> rekópe",
+'currentevents' => 'Ag̃agua',
+'disclaimers' => 'Marandu leiguigua',
+'edithelp' => 'Jehairã ñepytyvõ',
+'mainpage' => 'Ape',
 'mainpage-description' => 'Ape',
-'portal'               => 'Tekohapegua',
-'privacy'              => 'Polítika marandu ñeñangareko rehegua',
-'privacypage'          => 'Project:Polítika marandu ñeñangareko rehegua',
+'portal' => 'Tekohapegua',
+'privacy' => 'Polítika marandu ñeñangareko rehegua',
+'privacypage' => 'Project:Polítika marandu ñeñangareko rehegua',
 
-'newmessageslink'         => 'marandu pyahu',
-'newmessagesdifflink'     => 'Joavy oĩva mokõive jehai paha apytépe',
+'newmessageslink' => 'marandu pyahu',
+'newmessagesdifflink' => 'Joavy oĩva mokõive jehai paha apytépe',
 'youhavenewmessagesmulti' => 'Reguereko marandu pyahu $1',
-'editsection'             => 'jehaijey',
-'editsection-brackets'    => '($1)',
-'editold'                 => 'jehaijey',
-'editsectionhint'         => 'Jehaijey vore: $1',
-'toc'                     => "Tembikuaa'aty rechaukaha",
-'showtoc'                 => 'hechauka',
-'hidetoc'                 => 'toñemi',
-'restorelink'             => '$1 ediciones borradas',
-'red-link-title'          => '$1 (ndaipóri ko togue)',
+'editsection' => 'jehaijey',
+'editsection-brackets' => '($1)',
+'editold' => 'jehaijey',
+'editsectionhint' => 'Jehaijey vore: $1',
+'toc' => "Tembikuaa'aty rechaukaha",
+'showtoc' => 'hechauka',
+'hidetoc' => 'toñemi',
+'restorelink' => '$1 ediciones borradas',
+'red-link-title' => '$1 (ndaipóri ko togue)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Kuatiahai',
-'nstab-user'      => 'Puruhára',
-'nstab-media'     => 'Media rogue',
-'nstab-special'   => "Mba'echĩchĩ",
-'nstab-project'   => "Mba'e apopyrã rogue",
-'nstab-image'     => 'Ñongatupy',
+'nstab-main' => 'Kuatiahai',
+'nstab-user' => 'Puruhára',
+'nstab-media' => 'Media rogue',
+'nstab-special' => "Mba'echĩchĩ",
+'nstab-project' => "Mba'e apopyrã rogue",
+'nstab-image' => 'Ñongatupy',
 'nstab-mediawiki' => 'Marandu',
-'nstab-template'  => 'Tembiecharã',
-'nstab-help'      => 'Pytyvõ',
-'nstab-category'  => 'Ñemohenda',
+'nstab-template' => 'Tembiecharã',
+'nstab-help' => 'Pytyvõ',
+'nstab-category' => 'Ñemohenda',
 
 # Main script and global functions
 'nosuchaction' => 'Upe tembiapo ndaipóri',
@@ -189,145 +189,144 @@ $messages = array(
 'ns-specialprotected' => 'Las páginas en el espacio de nombres Especial no se pueden editar.',
 
 # Login and logout pages
-'yourname'                => 'Hero',
-'yourpassword'            => 'Ne remiñemi',
-'yourpasswordagain'       => 'Repita ne remiñemi',
-'remembermypassword'      => "Aipota chemomandu'ajepi amba'apo jave (for a maximum of $1 {{PLURAL:$1|day|days}})",
-'login'                   => 'Terañemboguapy/Ke',
+'yourname' => 'Hero',
+'yourpassword' => 'Ne remiñemi',
+'yourpasswordagain' => 'Repita ne remiñemi',
+'remembermypassword' => "Aipota chemomandu'ajepi amba'apo jave (for a maximum of $1 {{PLURAL:$1|day|days}})",
+'login' => 'Terañemboguapy/Ke',
 'nav-login-createaccount' => 'Terañemboguapy/Ke',
-'userlogin'               => 'Terañemboguapy/Ke',
-'logout'                  => 'Sẽ',
-'userlogout'              => 'Sẽ',
-'nologin'                 => "¿Ne'ĩrãpa remohenda nde réra? '''$1'''.",
-'nologinlink'             => 'Téra ñemohenda',
-'loginsuccesstitle'       => 'Remoñepyrũ hekopete ne rembiapo',
-'nosuchusershort'         => 'No hay un usuario con el nombre "$1". Compruebe que lo ha escrito correctamente.',
-'mailmypassword'          => "Embou chéve ñe'ẽveve rupive peteĩ temiñemĩ pyahu",
-'loginlanguagelabel'      => "Ñe'ẽ: $1",
+'userlogin' => 'Terañemboguapy/Ke',
+'logout' => 'Sẽ',
+'userlogout' => 'Sẽ',
+'nologin' => "¿Ne'ĩrãpa remohenda nde réra? '''$1'''.",
+'nologinlink' => 'Téra ñemohenda',
+'loginsuccesstitle' => 'Remoñepyrũ hekopete ne rembiapo',
+'nosuchusershort' => 'No hay un usuario con el nombre "$1". Compruebe que lo ha escrito correctamente.',
+'mailmypassword' => "Embou chéve ñe'ẽveve rupive peteĩ temiñemĩ pyahu",
+'loginlanguagelabel' => "Ñe'ẽ: $1",
 
 # Edit page toolbar
-'bold_sample'   => 'Haipyre oñemohũvéva',
-'bold_tip'      => 'Haipyre oñemohũvéva',
+'bold_sample' => 'Haipyre oñemohũvéva',
+'bold_tip' => 'Haipyre oñemohũvéva',
 'italic_sample' => 'Haipyre ikarẽva',
-'italic_tip'    => 'Haipyre ikarẽva',
-'link_tip'      => 'Joaju hyepyguávandi',
-'extlink_tip'   => 'Joaju okapeguávandi (recuerde añadir el prefijo http://)',
-'headline_tip'  => 'Teraete mokõiha',
-'nowiki_tip'    => "Viki jehaireko ñembo'yke",
-'image_tip'     => "Ta'ãnga moĩngepyréva",
-'media_tip'     => "Joaju jehai'aty multimediaguándi",
-'sig_tip'       => 'Teraguapy, arange, aravo',
-'hr_tip'        => 'Haipuku oñenóva (eipurúke tekotevẽ javénte)',
+'italic_tip' => 'Haipyre ikarẽva',
+'link_tip' => 'Joaju hyepyguávandi',
+'extlink_tip' => 'Joaju okapeguávandi (recuerde añadir el prefijo http://)',
+'headline_tip' => 'Teraete mokõiha',
+'nowiki_tip' => "Viki jehaireko ñembo'yke",
+'image_tip' => "Ta'ãnga moĩngepyréva",
+'media_tip' => "Joaju jehai'aty multimediaguándi",
+'sig_tip' => 'Teraguapy, arange, aravo',
+'hr_tip' => 'Haipuku oñenóva (eipurúke tekotevẽ javénte)',
 
 # Edit pages
-'summary'               => 'Jehaimombyky:',
-'subject'               => "Mba'ekuaarã/teraete:",
-'minoredit'             => "Kóva ha'e peteĩ jehai mbyky",
-'watchthis'             => 'Toñeñangareko ko tembiapóre',
-'savearticle'           => 'Hai',
-'showpreview'           => 'Tojechauka jehai ñemboguapy mboyve',
-'showdiff'              => 'Tojechauka ñemoambue',
-'missingsummary'        => "'''Atención:''' No has escrito un resumen de edición. Si haces clic nuevamente en «Hai» tu edición se grabará sin él.",
-'subject-preview'       => "Previsualización del mba'ekuaarã/teraete:",
-'newarticletext'        => "Rehapykuehókuri peteĩ joaju peteĩ kuatiarogue ndaipórivape.
+'summary' => 'Jehaimombyky:',
+'subject' => "Mba'ekuaarã/teraete:",
+'minoredit' => "Kóva ha'e peteĩ jehai mbyky",
+'watchthis' => 'Toñeñangareko ko tembiapóre',
+'savearticle' => 'Hai',
+'showpreview' => 'Tojechauka jehai ñemboguapy mboyve',
+'showdiff' => 'Tojechauka ñemoambue',
+'missingsummary' => "'''Atención:''' No has escrito un resumen de edición. Si haces clic nuevamente en «Hai» tu edición se grabará sin él.",
+'subject-preview' => "Previsualización del mba'ekuaarã/teraete:",
+'newarticletext' => "Rehapykuehókuri peteĩ joaju peteĩ kuatiarogue ndaipórivape.
 Nde remoheñoisérõ ko kuatiarogue, eñepyrũkatu ehai.
 Reikotevẽvérõ marandu, emoñe'ẽ kuatiarogue ñepytyvõ rehegua. Oiméramo reikereínte térã rejavyhaguére, upéicharõ terehojey [[{{MediaWiki:Helppage}}|kuatiarogue mboyveguápe]].",
 'userinvalidcssjstitle' => "'''Aviso:''' No existe la piel \"\$1\". Recuerda que las páginas personalizadas .css y .js tienen un título en minúsculas, p.e. Usuario:Foo/vector.css en vez de  Usuario:Foo/Vector.css.",
-'editing'               => 'Ojehaihína $1',
-'editingsection'        => 'Ojehaihína $1 (vore)',
-'editingcomment'        => 'Ojehaihína $1 (comentario)',
-'yourtext'              => "Mba'ehaipyre",
+'editing' => 'Ojehaihína $1',
+'editingsection' => 'Ojehaihína $1 (vore)',
+'editingcomment' => 'Ojehaihína $1 (comentario)',
+'yourtext' => "Mba'ehaipyre",
 
 # History pages
-'cur'         => "ko'ag̃agua",
-'last'        => 'ipaha',
+'cur' => "ko'ag̃agua",
+'last' => 'ipaha',
 'historysize' => '($1 bytes)',
 
 # Revision deletion
-'rev-delundel'       => 'hechauka/toñemi',
+'rev-delundel' => 'hechauka/toñemi',
 'logdelete-selected' => "'''Seleccionados $1 eventos de registro:'''",
 
 # Diffs
-'difference' => "(Mba'épe ojaovy oñemyatyrõva'ekue)",
-'lineno'     => 'Jehai $1:',
-'editundo'   => 'embyai',
+'lineno' => 'Jehai $1:',
+'editundo' => 'embyai',
 'diff-multi' => '($1 ediciones intermedias no se muestran.)',
 
 # Search results
-'searchresults'     => 'Ojejuhúva jeheka',
-'searchsubtitle'    => "Nde reporandúkuri: '''[[:$1]]-re'''",
-'prevn'             => '{{PLURAL:$1|$1}} mboyvegua',
-'viewprevnext'      => 'Hecha ($1 {{int:pipe-separator}} $2) ($3).',
-'showingresults'    => "Abajo se muestran hasta '''$1''' resultados empezando por el nº '''$2'''.",
+'searchresults' => 'Ojejuhúva jeheka',
+'searchsubtitle' => "Nde reporandúkuri: '''[[:$1]]-re'''",
+'prevn' => '{{PLURAL:$1|$1}} mboyvegua',
+'viewprevnext' => 'Hecha ($1 {{int:pipe-separator}} $2) ($3).',
+'showingresults' => "Abajo se muestran hasta '''$1''' resultados empezando por el nº '''$2'''.",
 'showingresultsnum' => "Abajo se muestran los '''$3''' resultados empezando por el nº '''$2'''.",
-'powersearch'       => 'Jeheka',
+'powersearch' => 'Jeheka',
 
 # Preferences page
-'preferences'       => 'Mbohoryha',
-'mypreferences'     => 'Che mbohoryha',
-'prefs-rc'          => 'Oñemoambue pyahúva',
+'preferences' => 'Mbohoryha',
+'mypreferences' => 'Che mbohoryha',
+'prefs-rc' => 'Oñemoambue pyahúva',
 'searchresultshead' => 'Jeheka',
-'youremail'         => "Ñe'ẽveve",
-'yourlanguage'      => "Ñe'ẽ:",
-'email'             => 'Pareha eleytróniko',
+'youremail' => "Ñe'ẽveve",
+'yourlanguage' => "Ñe'ẽ:",
+'email' => 'Pareha eleytróniko',
 
 # User rights
-'userrights-lookup-user'   => 'Configurar grupos de usuarios',
+'userrights-lookup-user' => 'Configurar grupos de usuarios',
 'userrights-user-editname' => 'Ehaimi peteĩ téra puruháragua:',
-'editusergroup'            => 'Modificar grupos de usuarios',
-'editinguser'              => "Ojehaihína '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editusergroup' => 'Modificar grupos de usuarios',
+'editinguser' => "Ojehaihína '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
 'userrights-editusergroup' => 'Modificar grupos de usuarios',
-'saveusergroups'           => 'Guardar grupos de usuarios',
-'userrights-groupsmember'  => 'Pehengue:',
-'userrights-reason'        => 'Motivo para el cambio:',
+'saveusergroups' => 'Guardar grupos de usuarios',
+'userrights-groupsmember' => 'Pehengue:',
+'userrights-reason' => 'Motivo para el cambio:',
 
 # Groups
 'group-all' => '(opaite)',
 
 # Recent changes
-'nchanges'          => '$1 ñemoambue',
-'recentchanges'     => 'Oñemoambue pyahúva',
-'rcnote'            => "Iguýpe oĩ umi {{PLURAL:$1|'''1'''|$1}} oñemoambue pyahúva ko ara{{PLURAL:$2|'''1'''|$2}}ndýpe, hekopyahúva $5, $4.",
-'rclistfrom'        => 'Tojehechauka oñemoambue pyahúva $1 guive',
-'rcshowhideminor'   => '$1 jehaijey michĩva',
-'rcshowhideliu'     => '$1 puruhára ohejáva teraguapy',
-'rcshowhideanons'   => "$1 puruhára ojekuaa'ỹva",
-'rcshowhidemine'    => '$1 che jehaijey',
-'rclinks'           => "Ápe ojehechakuaa umi $1 oñemoambue pyahúva $2 ára ohasava'ekuépe.<br />$3",
-'hide'              => 'toñemi',
-'show'              => 'hechauka',
+'nchanges' => '$1 ñemoambue',
+'recentchanges' => 'Oñemoambue pyahúva',
+'rcnote' => "Iguýpe oĩ umi {{PLURAL:$1|'''1'''|$1}} oñemoambue pyahúva ko ara{{PLURAL:$2|'''1'''|$2}}ndýpe, hekopyahúva $5, $4.",
+'rclistfrom' => 'Tojehechauka oñemoambue pyahúva $1 guive',
+'rcshowhideminor' => '$1 jehaijey michĩva',
+'rcshowhideliu' => '$1 puruhára ohejáva teraguapy',
+'rcshowhideanons' => "$1 puruhára ojekuaa'ỹva",
+'rcshowhidemine' => '$1 che jehaijey',
+'rclinks' => "Ápe ojehechakuaa umi $1 oñemoambue pyahúva $2 ára ohasava'ekuépe.<br />$3",
+'hide' => 'toñemi',
+'show' => 'hechauka',
 'newsectionsummary' => 'Pyahuvore: /* $1 */',
 
 # Recent changes linked
-'recentchangeslinked-title'   => 'Ñemoambue $1 rehegua',
+'recentchangeslinked-title' => 'Ñemoambue $1 rehegua',
 'recentchangeslinked-summary' => "Ko kuatiarogue hekochĩchĩvape oñembohysýi umi ñemoambue ipyahúva ko'ã kuatiarogue ojoajúvape. Kuatiarogue oĩva tapykueho rysýipe oĩ '''haipyre oñemohũvape'''.",
 
 # Upload
-'upload'     => "Tojehupi jehai'aty",
+'upload' => "Tojehupi jehai'aty",
 'uploadtext' => "Eipuru pe tembipuru oĩva iguýpe ehupi hag̃ua jehai'aty, rehecha térã reheka hag̃ua ta'ãnga ojehupipyrémava eike jehai'aty jehupipyre rysýipe, umi ihupipyréva ha oñemboguémava avei oñemboguapy [[Special:Log/upload|jehai'aty jehupipyrépe]].
 Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 '''<nowiki>[[</nowiki>Imagen<nowiki>:Archivo.jpg]]</nowiki>''', '''<nowiki>[[</nowiki>Imagen<nowiki>:Archivo.png|texto alternativo]]</nowiki>''' o
 '''<nowiki>[[</nowiki>Media<nowiki>:Archivo.ogg]]</nowiki>''' ojoaju hag̃ua hekopete pe jehai'atýre.",
-'filename'   => "Téra jehai'aty",
+'filename' => "Téra jehai'aty",
 
 # Special:ListFiles
-'listfiles'      => "Ta'ãnga rysýi",
+'listfiles' => "Ta'ãnga rysýi",
 'listfiles_user' => 'Puruhára',
 
 # File description page
-'file-anchor-link'  => 'Ñongatupy',
-'filehist-revert'   => 'embojevy',
-'filehist-current'  => "ko'ag̃agua",
+'file-anchor-link' => 'Ñongatupy',
+'filehist-revert' => 'embojevy',
+'filehist-current' => "ko'ag̃agua",
 'filehist-datetime' => 'Ára/Aravo',
-'filehist-user'     => 'Puruhára',
-'filehist-comment'  => 'Jehaimombyky',
-'imagelinks'        => 'Joajukuéra',
+'filehist-user' => 'Puruhára',
+'filehist-comment' => 'Jehaimombyky',
+'imagelinks' => 'Joajukuéra',
 
 # File reversion
 'filerevert' => 'Embojevy $1',
 
 # File deletion
-'filedelete-legend'  => "Mboje'o jehai'aty",
+'filedelete-legend' => "Mboje'o jehai'aty",
 'filedelete-success' => "'''$1''' oñembogue'akue",
 
 # MIME search
@@ -348,13 +347,13 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 # Statistics
 'statistics' => 'Papyrekokuaa',
 
-'disambiguations'     => 'Kuatiarogue mohesakãporãha',
+'disambiguations' => 'Kuatiarogue mohesakãporãha',
 'disambiguationspage' => 'Template:Disambig',
 
 'doubleredirects' => "Ñembohapejey jo'apyre",
 
-'brokenredirects'        => "Ñembohapejey hekopegua'ỹva",
-'brokenredirects-edit'   => 'jehaijey',
+'brokenredirects' => "Ñembohapejey hekopegua'ỹva",
+'brokenredirects-edit' => 'jehaijey',
 'brokenredirects-delete' => "mboje'o",
 
 'withoutinterwiki' => 'Kuatiarogue ndorekóiva interwiki',
@@ -362,38 +361,38 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 'fewestrevisions' => "Kuatiahai sa'ive ijehaijeýva",
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 bytes',
-'ncategories'             => '$1 ñemohendakuéra',
-'nlinks'                  => '$1 joaju',
-'nmembers'                => '$1 kuatiahai',
-'nrevisions'              => '$1 revisiones',
-'nviews'                  => '$1 vistas',
-'lonelypages'             => "Kuatiarogue ityre'ỹva",
-'uncategorizedpages'      => "Kuatiarogue oñemohenda'ỹva",
+'nbytes' => '$1 bytes',
+'ncategories' => '$1 ñemohendakuéra',
+'nlinks' => '$1 joaju',
+'nmembers' => '$1 kuatiahai',
+'nrevisions' => '$1 revisiones',
+'nviews' => '$1 vistas',
+'lonelypages' => "Kuatiarogue ityre'ỹva",
+'uncategorizedpages' => "Kuatiarogue oñemohenda'ỹva",
 'uncategorizedcategories' => 'Ñemohenda noñemohendáiva',
-'uncategorizedimages'     => "Ta'ãnga ne'ĩrã oñemohendáva",
-'uncategorizedtemplates'  => 'Tembiecharã noñemohendáiva',
-'unusedcategories'        => "Ñemohenda ojepuru'ỹva",
-'unusedimages'            => "Ta'ãnga ndojepurúiva",
-'wantedcategories'        => 'Ñemohenda oñekotevẽva',
-'wantedpages'             => 'Kuatiarogue oñekotevẽva',
-'mostlinked'              => 'Kuatiahai ojoaju hetavéva',
-'mostlinkedcategories'    => 'Ñemohenda ojoaju hetavéva',
-'mostlinkedtemplates'     => 'Tembiecharã ojoaju hetavéva',
-'mostcategories'          => 'Kuatiarogue iñemohenda hetavéva',
-'mostimages'              => "Ta'ãnga ojepuruvéva",
-'mostrevisions'           => 'Kuatiahai hetave ijehaijeýva',
-'prefixindex'             => 'Kuatiarogue henondepyguáva',
-'shortpages'              => 'Kuatiarogue mbykýva',
-'longpages'               => 'Kuatiarogue ipukúva',
-'deadendpages'            => "Kuatiarogue ñesẽ'ỹva",
-'protectedpages'          => 'Kuatiarogue oñeñangarekóva',
-'listusers'               => 'Puruhára rysýi',
-'newpages'                => 'Kuatiarogue ipyahúva',
-'newpages-username'       => 'Hero',
-'ancientpages'            => "Kuatiahai hi'arevéva",
-'move'                    => 'Guerova',
-'movethispage'            => 'Guerova kuatiarogue',
+'uncategorizedimages' => "Ta'ãnga ne'ĩrã oñemohendáva",
+'uncategorizedtemplates' => 'Tembiecharã noñemohendáiva',
+'unusedcategories' => "Ñemohenda ojepuru'ỹva",
+'unusedimages' => "Ta'ãnga ndojepurúiva",
+'wantedcategories' => 'Ñemohenda oñekotevẽva',
+'wantedpages' => 'Kuatiarogue oñekotevẽva',
+'mostlinked' => 'Kuatiahai ojoaju hetavéva',
+'mostlinkedcategories' => 'Ñemohenda ojoaju hetavéva',
+'mostlinkedtemplates' => 'Tembiecharã ojoaju hetavéva',
+'mostcategories' => 'Kuatiarogue iñemohenda hetavéva',
+'mostimages' => "Ta'ãnga ojepuruvéva",
+'mostrevisions' => 'Kuatiahai hetave ijehaijeýva',
+'prefixindex' => 'Kuatiarogue henondepyguáva',
+'shortpages' => 'Kuatiarogue mbykýva',
+'longpages' => 'Kuatiarogue ipukúva',
+'deadendpages' => "Kuatiarogue ñesẽ'ỹva",
+'protectedpages' => 'Kuatiarogue oñeñangarekóva',
+'listusers' => 'Puruhára rysýi',
+'newpages' => 'Kuatiarogue ipyahúva',
+'newpages-username' => 'Hero',
+'ancientpages' => "Kuatiahai hi'arevéva",
+'move' => 'Guerova',
+'movethispage' => 'Guerova kuatiarogue',
 
 # Book sources
 'booksources' => "Heñóiva kuatiañe'ẽme",
@@ -402,18 +401,18 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 'log' => 'Ñemboguapypyre',
 
 # Special:AllPages
-'allpages'          => 'Opaite kuatiarogue',
-'alphaindexline'    => '$1 $2 peve',
-'nextpage'          => 'Kuatia rogue upeigua($1)',
-'prevpage'          => 'Kuatia rogue mboyvegua ($1)',
-'allpagesfrom'      => 'Ehechauka kuatia rogue oñepyrũva:   -pe',
-'allpagesto'        => 'Ehechauka kuatia rogue opáva:  -pe',
-'allarticles'       => 'Opa kuatia rogue',
-'allinnamespace'    => "Opa kuatia rogue (pa'ũ $1)",
+'allpages' => 'Opaite kuatiarogue',
+'alphaindexline' => '$1 $2 peve',
+'nextpage' => 'Kuatia rogue upeigua($1)',
+'prevpage' => 'Kuatia rogue mboyvegua ($1)',
+'allpagesfrom' => 'Ehechauka kuatia rogue oñepyrũva:   -pe',
+'allpagesto' => 'Ehechauka kuatia rogue opáva:  -pe',
+'allarticles' => 'Opa kuatia rogue',
+'allinnamespace' => "Opa kuatia rogue (pa'ũ $1)",
 'allnotinnamespace' => 'Opaite kuatiarogue (fuera del espacio $1)',
-'allpagesprev'      => 'Mboyvegua',
-'allpagesnext'      => 'Upeigua',
-'allpagessubmit'    => 'Hechauka',
+'allpagesprev' => 'Mboyvegua',
+'allpagesnext' => 'Upeigua',
+'allpagessubmit' => 'Hechauka',
 
 # Special:Categories
 'categories' => 'Ñemohendakuéra',
@@ -422,67 +421,67 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 'listusers-submit' => 'Hechauka',
 
 # E-mail user
-'emailuser'    => "Tojeguerahauka ñe'ẽveve ko puruhárape",
-'emailpage'    => 'Pareha eleytrónico',
+'emailuser' => "Tojeguerahauka ñe'ẽveve ko puruhárape",
+'emailpage' => 'Pareha eleytrónico',
 'emailmessage' => 'Marandu',
 
 # Watchlist
-'watchlist'   => 'Tapykueho rysýi',
+'watchlist' => 'Tapykueho rysýi',
 'mywatchlist' => 'Tapykueho rysýi',
-'watch'       => 'Ñangareko',
+'watch' => 'Ñangareko',
 
 # Delete
-'dellogpage'  => 'Ñemboguepyre ñonagatupy',
+'dellogpage' => 'Ñemboguepyre ñonagatupy',
 'deletionlog' => 'ñemboguepyre ñonagatupy',
 
 # Rollback
 'rollback_short' => 'Embojevy',
-'rollbacklink'   => 'Embojevy',
+'rollbacklink' => 'Embojevy',
 
 # Protect
 'prot_1movedto2' => '[[$1]] oñembohasa [[$2]]-pe',
-'protect-text'   => "Puedes ver y modificar el nivel de protección de la página '''$1'''.",
+'protect-text' => "Puedes ver y modificar el nivel de protección de la página '''$1'''.",
 
 # Undelete
-'undeletedrevisions'       => '$1 ediciones restauradas',
+'undeletedrevisions' => '$1 ediciones restauradas',
 'undeletedrevisions-files' => '$1 ediciones y $2 archivos restaurados',
-'undeletedfiles'           => '$1 archivos restaurados',
-'undelete-search-submit'   => 'Heka',
+'undeletedfiles' => '$1 archivos restaurados',
+'undelete-search-submit' => 'Heka',
 
 # Namespace form on various pages
-'namespace'      => 'Téra rendagua:',
-'invert'         => "Toñembo'ovývo mba'eporavopyre",
+'namespace' => 'Téra rendagua:',
+'invert' => "Toñembo'ovývo mba'eporavopyre",
 'blanknamespace' => '(Tenondeguáva)',
 
 # Contributions
 'contributions' => "Puruhára mba'emoĩmbyre",
-'mycontris'     => "Che mba'emoĩmbyre",
+'mycontris' => "Che mba'emoĩmbyre",
 
 'sp-contributions-search' => "Heka mba'emoĩmbyre",
 'sp-contributions-submit' => 'Heka',
 
 # What links here
-'whatlinkshere'       => "Oñembojoajukuaáva ko'ápe",
+'whatlinkshere' => "Oñembojoajukuaáva ko'ápe",
 'whatlinkshere-title' => 'Kuatiarogue ojoajúva "$1" rehe',
-'whatlinkshere-page'  => 'Kuatiarogue:',
-'linkshere'           => "Ko'ã kuatiarogue ojoaju '''[[:$1]]''' rehe:",
-'whatlinkshere-prev'  => 'mboyvegua $1',
-'whatlinkshere-next'  => 'upeigua $1',
+'whatlinkshere-page' => 'Kuatiarogue:',
+'linkshere' => "Ko'ã kuatiarogue ojoaju '''[[:$1]]''' rehe:",
+'whatlinkshere-prev' => 'mboyvegua $1',
+'whatlinkshere-next' => 'upeigua $1',
 'whatlinkshere-links' => '← joajukuéra',
 
 # Block/unblock
-'blockip'            => 'Ejoko puruhára',
-'ipblocklist'        => 'IP mbohape rysýi imbotypyréva',
+'blockip' => 'Ejoko puruhára',
+'ipblocklist' => 'IP mbohape rysýi imbotypyréva',
 'ipblocklist-submit' => 'Heka',
-'blocklink'          => 'ejoko',
-'contribslink'       => "mba'emoĩmbyre",
-'blocklogtext'       => 'Esto es un registro de bloqueos y desbloqueos de usuarios. Las direcciones bloqueadas automáticamente no aparecen aquí. Consulte la [[Special:BlockList|IP mbohape rysýi imbotypyréva]] para ver la lista de prohibiciones y bloqueos actualmente vigente.',
+'blocklink' => 'ejoko',
+'contribslink' => "mba'emoĩmbyre",
+'blocklogtext' => 'Esto es un registro de bloqueos y desbloqueos de usuarios. Las direcciones bloqueadas automáticamente no aparecen aquí. Consulte la [[Special:BlockList|IP mbohape rysýi imbotypyréva]] para ver la lista de prohibiciones y bloqueos actualmente vigente.',
 
 # Move page
-'movearticle'     => 'Guerova kuatiarogue',
-'move-watch'      => 'Toñeñangareko ko tembiapóre',
-'movepagebtn'     => 'Guerova kuatiarogue',
-'revertmove'      => 'embojevy',
+'movearticle' => 'Guerova kuatiarogue',
+'move-watch' => 'Toñeñangareko ko tembiapóre',
+'movepagebtn' => 'Guerova kuatiarogue',
+'revertmove' => 'embojevy',
 'delete_and_move' => "Mboje'o ha guerova",
 
 # Export
@@ -495,55 +494,55 @@ Reomĩsérõ ta'ãnga peteĩ kuatiaroguépe, eipuru peteĩ joaju:
 'import-revision-count' => '$1 revisiones',
 
 # Import log
-'import-logentry-upload-detail'    => '$1 revisiones',
+'import-logentry-upload-detail' => '$1 revisiones',
 'import-logentry-interwiki-detail' => '$1 revisiones desde $2',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'    => 'Che puruhárakuatia',
-'tooltip-pt-mytalk'      => 'Che kuatiarogue myangekõi',
+'tooltip-pt-userpage' => 'Che puruhárakuatia',
+'tooltip-pt-mytalk' => 'Che kuatiarogue myangekõi',
 'tooltip-pt-preferences' => 'Che mbohoryha',
-'tooltip-pt-mycontris'   => "Tysỹi che mba'emoĩmbyre",
-'tooltip-ca-move'        => 'Guerova kuatiarogue',
-'tooltip-p-logo'         => 'Ape',
-'tooltip-n-mainpage'     => 'Eho ijapépe',
+'tooltip-pt-mycontris' => "Tysỹi che mba'emoĩmbyre",
+'tooltip-ca-move' => 'Guerova kuatiarogue',
+'tooltip-p-logo' => 'Ape',
+'tooltip-n-mainpage' => 'Eho ijapépe',
 
 # Spam protection
 'spamprotectiontitle' => 'Filtro de protección contra spam',
-'spamprotectiontext'  => 'La página que intentas guardar ha sido bloqueada por el filtro de spam. Esto se debe probablemente a alguno de los un enlaces externos incluidos en ella.',
+'spamprotectiontext' => 'La página que intentas guardar ha sido bloqueada por el filtro de spam. Esto se debe probablemente a alguno de los un enlaces externos incluidos en ella.',
 'spamprotectionmatch' => "El siguiente texto es el que activó nuestro filtro ''anti-spam'' (contra la publicidad no solicitada): $1",
-'spambot_username'    => 'Limpieza de spam de MediaWiki',
-'spam_reverting'      => 'Revirtiendo a la última versión que no contenga enlaces a $1',
-'spam_blanking'       => 'Todas las revisiones contienen enlaces a $1, blanqueando',
+'spambot_username' => 'Limpieza de spam de MediaWiki',
+'spam_reverting' => 'Revirtiendo a la última versión que no contenga enlaces a $1',
+'spam_blanking' => 'Todas las revisiones contienen enlaces a $1, blanqueando',
 
 # Media information
 'file-info' => "tamaño de jehai'aty: $1; tipo MIME: $2",
 
 # Special:NewFiles
 'newimages' => "Ta'ãnga pyahu renda",
-'ilsubmit'  => 'Jeheka',
+'ilsubmit' => 'Jeheka',
 
 # 'all' in various places, this might be different for inflected languages
 'namespacesall' => 'opaite',
-'monthsall'     => 'opaite',
+'monthsall' => 'opaite',
 
 # Auto-summaries
 'autosumm-new' => 'Kuatiarogue ipyahúva: $1',
 
 # Watchlist editor
-'watchlistedit-numitems'      => 'Tu lista de seguimiento tiene $1 páginas, excluyendo las páginas de discusión.',
-'watchlistedit-normal-title'  => 'Moambue tapykueho rysýi',
+'watchlistedit-numitems' => 'Tu lista de seguimiento tiene $1 páginas, excluyendo las páginas de discusión.',
+'watchlistedit-normal-title' => 'Moambue tapykueho rysýi',
 'watchlistedit-normal-submit' => "Mboje'o kuatiarogue",
-'watchlistedit-normal-done'   => '$1 páginas han sido borradas de tu lista de seguimiento:',
-'watchlistedit-raw-titles'    => 'Kuatiarogue:',
-'watchlistedit-raw-added'     => 'Se han añadido $1 páginas:',
-'watchlistedit-raw-removed'   => '$1 páginas han sido borradas:',
+'watchlistedit-normal-done' => '$1 páginas han sido borradas de tu lista de seguimiento:',
+'watchlistedit-raw-titles' => 'Kuatiarogue:',
+'watchlistedit-raw-added' => 'Se han añadido $1 páginas:',
+'watchlistedit-raw-removed' => '$1 páginas han sido borradas:',
 
 # Special:Version
 'version' => "Mba'ereko",
 
 # Special:FilePath
-'filepath'        => 'Ruta de archivo',
-'filepath-page'   => 'Archivo:',
+'filepath' => 'Ruta de archivo',
+'filepath-page' => 'Archivo:',
 'filepath-submit' => 'Ruta',
 
 # Special:SpecialPages
index 868dd32..e1f807f 100644 (file)
@@ -180,7 +180,6 @@ $messages = array(
 'qbbrowse' => 'Ἀλάου',
 'qbedit' => 'Μεταγράφειν',
 'qbpageoptions' => 'Ἥδε ἡ δέλτος',
-'qbpageinfo' => 'Συγκείμενον',
 'qbmyoptions' => 'Οἱ δέλτοι μου',
 'qbspecialpages' => 'Εἰδικαὶ δέλτοι',
 'faq' => 'Τὰ πολλάκις αἰτηθέντα',
@@ -413,11 +412,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Νῦν γὰρ ἀποσυνδεδεμένος εἰ.'''
 
-Ἔξεστί σοι χρῆσθαι τῷ {{SITENAME}} ἀνωνύμως, ἢ ἔξεστί σοι [[Special:UserLogin|συνδεῖσθαι πάλιν]] ὡς ὁ αὐτὸς ἢ ὡς ἄλλος χρώμενος.
+Ἔξεστί σοι χρῆσθαι τῷ {{SITENAME}} ἀνωνύμως, ἢ ἔξεστί σοι <span class='plainlinks'>[$1 συνδεῖσθαι πάλιν]</span> ὡς ὁ αὐτὸς ἢ ὡς ἄλλος χρώμενος.
 Δέλτοι τινὲς δέ, ἐνδεχομένως, δειχθήσονται ὡς ἂν ἀκμὴν συνδεδεμένος ᾖς, μέχρι ὅτε καθαίρῃς τὴν λανθάνουσαν μνήμην τοῦ προγράμματος πλοηγήσεώς σου.",
-'welcomecreation' => '== Ὡς εὖ παρέστης, $1! ==
-
-Λογισμός σὸς πεποίηται. Μέμνησο μεταβάλλειν τὰς τοῦ [[Special:Preferences|{{SITENAME}} προαιρέσεις σου]].',
 'yourname' => 'Ὄνομα χρωμένου:',
 'yourpassword' => 'Σῆμα:',
 'yourpasswordagain' => 'Ἀνατυπῶσαι σύνθημα:',
@@ -823,8 +819,6 @@ $1",
 'search-interwiki-caption' => 'Ἀδελφὰ σχέδια',
 'search-interwiki-default' => '$1 ἀποτελέσματα:',
 'search-interwiki-more' => '(πλείω)',
-'search-mwsuggest-enabled' => "μεθ'ὑποδείξεων",
-'search-mwsuggest-disabled' => 'οὐκ αἵτινες ὑποδείξεις',
 'search-relatedarticle' => 'Σχετικά',
 'mwsuggest-disable' => 'Μὴ ἐνεργαὶ αἱ ὑποδείξεις AJAX',
 'searcheverything-enable' => 'Ζήτησις ἐν πᾶσι τοῖς ὀνοματοχώροις',
@@ -1568,11 +1562,7 @@ $1",
 
 'enotif_mailer' => 'Σύστημα εἰδήσεως τοῦ {{SITENAME}} μέσῳ ἐπιστολῶν',
 'enotif_reset' => 'Σημαίνειν ἁπάσας τὰς ἐπεσκοπημένας δέλτους',
-'enotif_newpagetext' => 'Ἥδε νέα δέλτος ἐστίν.',
 'enotif_impersonal_salutation' => 'Χρώμενος τῷ {{SITENAME}}',
-'changed' => 'ἠλλαγμένη',
-'created' => 'ποιηθέν',
-'enotif_subject' => 'Ἡ τοῦ {{SITENAME}} δέλτος $PAGETITLE ἐποιἠθη $CHANGEDORCREATED ὑπὸ τὸν $PAGEEDITOR',
 'enotif_lastvisited' => 'Ἴδε $1 διὰ ἁπάσας τὰς ἀλλαγὰς ἐκ τῆς ὑστάτης ἐπισκέψεώς σου.',
 'enotif_lastdiff' => 'Ἴδε $1 διὰ τὸ ὁρᾶν τήνδε τὴν ἀλλαγήν.',
 'enotif_anon_editor' => 'ἀνώνυμος χρώμενος $1',
@@ -2717,4 +2707,8 @@ $5
 # Feedback
 'feedback-cancel' => 'Ἀκυροῦν',
 
+# Search suggestions
+'searchsuggest-search' => 'Ζητεῖν',
+'searchsuggest-containing' => 'περιέχον...',
+
 );
index d1a0703..869a334 100644 (file)
@@ -96,7 +96,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Letschti_Änderige' ),
        'Recentchangeslinked'       => array( 'Änderige_an_verlinkte_Syte' ),
        'Revisiondelete'            => array( 'Versionsleschig' ),
-       'RevisionMove'              => array( 'Version_verschiebe' ),
        'Search'                    => array( 'Suech' ),
        'Shortpages'                => array( 'Churzi_Syte' ),
        'Specialpages'              => array( 'Spezialsyte' ),
@@ -182,7 +181,7 @@ $messages = array(
 
 'underline-always' => 'immer',
 'underline-never' => 'nie',
-'underline-default' => 'Browser-Vorystellig',
+'underline-default' => 'Voryystellig vu dr Benutzeroberfleichi oder em Brwoser',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Schriftfamilie fir dr Text im Bearbeitigsfänschter:',
@@ -267,8 +266,8 @@ $messages = array(
 'newwindow' => '(imene nöie Fänschter)',
 'cancel' => 'Abbräche',
 'moredotdotdot' => 'Meh …',
-'mypage' => 'Myyni Syte',
-'mytalk' => 'Myyni Diskussionsyte',
+'mypage' => 'Syte',
+'mytalk' => 'Diskussionsyte',
 'anontalk' => 'Diskussionssyste vo sellere IP',
 'navigation' => 'Navigation',
 'and' => '&#32;un',
@@ -278,7 +277,6 @@ $messages = array(
 'qbbrowse' => 'Blättre',
 'qbedit' => 'Ändere',
 'qbpageoptions' => 'Sytenoptione',
-'qbpageinfo' => 'Sytedate',
 'qbmyoptions' => 'Ystellige',
 'qbspecialpages' => 'Spezialsytene',
 'faq' => 'Froge, wo vilmol gstellt wäre',
@@ -291,7 +289,7 @@ $messages = array(
 'vector-action-protect' => 'Schitze',
 'vector-action-undelete' => 'Widerhärstelle',
 'vector-action-unprotect' => 'Syteschutz ändere',
-'vector-simplesearch-preference' => 'Erwytereti Suechvorschleg aktiviere (nume Vector)',
+'vector-simplesearch-preference' => 'Vereifachti Suechvorschleg aktiviere (nume Vector)',
 'vector-view-create' => 'Aalege',
 'vector-view-edit' => 'Bearbeite',
 'vector-view-history' => 'Versionsgschicht',
@@ -398,6 +396,10 @@ Di maximal Wartezyt fir e Lock isch umme',
 'youhavenewmessages' => 'Du hesch $1 ($2).',
 'newmessageslink' => 'nöji Nachrichte',
 'newmessagesdifflink' => 'Unterschid',
+'youhavenewmessagesfromusers' => 'Du hesch $1 vu {{PLURAL:$3|eme andere Benutzer|$3 Benutzer}} ($2).',
+'youhavenewmessagesmanyusers' => 'Du hesch $1 vu vil Benutzer ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|e neji Nochricht|neji Nochrichte}}',
+'newmessagesdifflinkplural' => 'letschti {{PLURAL:$1|Änderig|Änderige}}',
 'youhavenewmessagesmulti' => 'Si hen neui Nochrichte: $1',
 'editsection' => 'ändere',
 'editold' => 'Ändre',
@@ -489,6 +491,7 @@ Wänn s des nit isch, hesch villicht e Fähler in dr Software gfunde. Bitte mäl
 'badarticleerror' => 'D Aktion konn uf denne Artikel nit ongwendet werre.',
 'cannotdelete' => 'D Syte oder d Datei „$1“ cha nit glescht wäre. Si isch villicht scho vu eber anderem glescht wore.',
 'cannotdelete-title' => 'Syte „$1“ cha nit glescht wäre',
+'delete-hook-aborted' => 'D Leschig isch ohni Erchlärung dur e Schnittstell abbroche wore.',
 'badtitle' => 'Ugültiger Titel',
 'badtitletext' => 'Dr Titel vu dr agforderte Syte isch nit giltig gsi, leer, oder e nit giltig Sprochgleich vun eme andre Wiki.',
 'perfcached' => 'Die Informatione chemme us em Zwischespycher un sin derwyl villicht nit aktuäll. Maximal {{PLURAL:$1|ei Ergebnis isch|$1 Ergebnis sin}} im Cache verfiegbar.',
@@ -505,7 +508,7 @@ Abfrog: $2',
 'viewsourcetext' => 'Quelltext vo dere Syte:',
 'viewyourtext' => "Du chasch dr Quälltext vu '''Dyre Bearbeitig''' vu däre Syte aaluege un kopiere:",
 'protectedinterface' => 'In däre Syte het s Text fir s Sproch-Interface vu dr Software un si isch gsperrt, zum Missbruch z verhindre.',
-'editinginterface' => "'''Obacht:''' Du bisch e Syten am Verändere, wu zum User.Interface ghert. Wänn Du die Syte veränderesch, no änderet sich s User-Interface au fir di andere Benutzer. Fir Ibersetzige lueg bitte, eb Du doodefir s [//translatewiki.net/wiki/Main_Page?setlang=gsw Translatewiki] witt bruuche, s MediaWiki-Lokalisierigsprojäkt.",
+'editinginterface' => "'''Obacht:''' Du bisch e Syten am Verändere, wu zum User.Interface ghert. Wänn Du die Syte veränderesch, no änderet sich s User-Interface au fir di andere Benutzer vu däm Wiki. Fir Ibersetzige lueg bitte, eb Du doodefir s [//translatewiki.net/wiki/Main_Page?setlang=gsw Translatewiki] witt bruuche, s MediaWiki-Lokalisierigsprojäkt.",
 'sqlhidden' => '(SQL-Abfrog verschteckt)',
 'cascadeprotected' => 'Die Syte isch fir s Bearbeite gsperrt. Si isch yybunde in {{PLURAL:$1|die Syte, wu do chunnt|die Syte, wu do chemme}} , wu mit ere Kaskadesperroption gschitzt {{PLURAL:$1|isch|sin}}:
 $2',
@@ -520,6 +523,8 @@ Die Sperri isch dur [[User:$1|$1]] yygrichtet wore mit dr Begrindig ''„$2“''
 Dr Administrator, wu dr Schrybzuegriff gsperrt het, het dää Grund aagee: „$3“.',
 'invalidtitle-knownnamespace' => 'Nit-gültige Titel mit Namensruum „$2“ un Text „$3“',
 'invalidtitle-unknownnamespace' => 'Ungültige Titel mit unbekannte Namensruumnummer $1 un Text „$2“',
+'exception-nologin' => 'Nit aagmäldet',
+'exception-nologin-text' => 'Fir die Syte oder Aktion muesch aagmäldet syy.',
 
 # Virus scanner
 'virus-badscanner' => "Fählerhafti Konfiguration: Virescanner, wu nid bekannt isch: ''$1''",
@@ -529,18 +534,16 @@ Dr Administrator, wu dr Schrybzuegriff gsperrt het, het dää Grund aagee: „$3
 # Login and logout pages
 'logouttext' => "'''Du bisch jetz abgmäldet.'''
 
-Du chasch {{SITENAME}} wyter anonym bruche, oder Du chasch di [[Special:UserLogin|wider aamälde]] mit em glyche oder eme andere Benutzername.
+Du chasch {{SITENAME}} wyter anonym bruche, oder Du chasch di <span class='plainlinks'>[$1 wider aamälde]</span> mit em glyche oder eme andere Benutzername.
 
 Ochat: s cha syy, ass bstimmti Syte eso aazeigt wäre, wie wänn Du allno aagmäldet wärsch, bis Du dr Zwischespycher vu Dyym Browser glescht hesch.",
-'welcomecreation' => '==Willcho, $1!==
-Dyy Benutzerkonto isch aaglait wore.
-Vergiss nid, dyni [[Special:Preferences|{{SITENAME}}-Yystellige]] aazpasse.',
 'yourname' => 'Dyy Benutzername',
 'yourpassword' => 'Passwort:',
 'yourpasswordagain' => 'Passwort no mol yygee:',
 'remembermypassword' => 'Uf däm Computer duurhaft aamälde (Maximal fir $1 {{PLURAL:$1|Tag|Täg}})',
 'securelogin-stick-https' => 'Noch em Aamälde mit HTTPS verbunde blybe',
 'yourdomainname' => 'Dyyni Domäne',
+'password-change-forbidden' => 'Du chasch uf däm Wiki kei Passwerter ändere.',
 'externaldberror' => 'Entwäder s lit e Fähler bi dr externe Authentifizierung vor, oder Du derfsch Dyy extern Benutzerkonto nid aktualisiere.',
 'login' => 'Aamälde',
 'nav-login-createaccount' => 'Aamälde / Konto aalege',
@@ -711,7 +714,7 @@ Temporär Passwort: $2',
 'hr_tip' => 'Horizontali Linie (sparsam verwende)',
 
 # Edit pages
-'summary' => 'Zämefassig:',
+'summary' => 'Zämmefassig:',
 'subject' => 'Beträff:',
 'minoredit' => 'Numen es birebitzeli gänderet',
 'watchthis' => 'Dä Artikel beobachte',
@@ -778,7 +781,11 @@ Wänn do nid hesch welle aane goh, no druck in Dyynem Browser uf '''Zruck'''.",
 oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} die Syte bearbeite]</span>.',
 'noarticletext-nopermission' => 'In däre Syte het s zur Zyt no kei Text.
 Du chasch dää Titel uf andre Syte [[Special:Search/{{PAGENAME}}|sueche]]
-oder <span class="plainlinks">in dr zuegherige [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbiecher sueche].</span>',
+oder <span class="plainlinks">in dr zuegherige [{{fullurl:{{#special:Log}}|page={{FULLPAGENAMEE}}}} Logbiecher sueche].</span> Du derfsch aber die Syte nit aalege.',
+'missing-revision' => 'D Version $1 vu dr Syte mit Name „{{PAGENAME}}“ git s nit.
+
+Dää Fähler chunnt normalerwyys dur e veraltete Link zue dr Versionsgschicht vun ere Syte, wu in dr Zwischezyt glescht woren isch.
+Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech] bschaue.',
 'userpage-userdoesnotexist' => 'S Benutzerkonto „<nowiki>$1</nowiki>“ git s nit. Bitte prief, eb Du die Syte wirkli wit aalege/bearbeite.',
 'userpage-userdoesnotexist-view' => 'S Benutzerkonto „$1“ isch nit registriert.',
 'blocked-notice-logextract' => 'Dää Benutzer isch zur Zyt gsperrt.
@@ -805,7 +812,7 @@ As Information chunnt do ne aktuälle Uuszug us em Benutzersperr-Logbuech:',
 'note' => "'''Obacht: '''",
 'previewnote' => "'''Das isch numen e Vorschau und nonig gspycheret!'''
 Die Syte isch nonig gspycheret wore!",
-'continue-editing' => 'Wyter bearbeite',
+'continue-editing' => 'Zum Bearbeitigsfäld',
 'previewconflict' => 'Die Vorschau zeigt dr Inhalt vum obere Täxtfäld. Eso siht dr Artikel us, wän Du jetz uf Spychere drucksch.',
 'session_fail_preview' => "'''Dyyni Bearbeitig het nid chenne gspycheret wäre, wel Sitzigsdate verlore gange sin.
 Bitte versuech s nomol. Derzue drucksch unter däre Täxtvorschau nomol uf „Syte spychere“.
@@ -884,6 +891,15 @@ Si isch schyns glescht wore.',
 'edit-no-change' => 'Dyyni Bearbeitig isch ignoriert wore, wel kei Änderig am Täxt gmacht woren isch.',
 'edit-already-exists' => 'Di nej Syte het nid chenne aaglait wäre, wel s si scho git.',
 'defaultmessagetext' => 'Standardtext',
+'content-failed-to-parse' => 'Parse vum Inhalt $2 fir Modell $1 fählgschlaa: $3',
+'invalid-content-data' => 'Uugiltigi Inhaltsdate',
+'content-not-allowed-here' => 'Dr Inhalt „$1“ isch uf dr Syte [[$2]] nit erlaubt',
+
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-text' => 'Klartext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Achtig: In däre Syte het s z vyyl Ufruef vu ufwändige Parserfunktione.
@@ -903,6 +919,7 @@ S {{PLURAL:$2|derf nid meh wie ein Ufruef|derfe nid meh wie $1 Ufruef}} gee.',
 'expansion-depth-exceeded-warning' => 'Die Syte het d Expansionsdiefi überschritte.',
 'parser-unstrip-loop-warning' => 'Zirkelbezug festgstellt',
 'parser-unstrip-recursion-limit' => 'Rekursionsgränz bim Ufflöse überschritte ($1)',
+'converter-manual-rule-error' => 'Bi dr manuälle Sprochkonvertierigsregle isch e Fähler entdeckt wore.',
 
 # "Undo" feature
 'undo-success' => 'Zum die Änderig ruckgängig z mache, kontrollier bitte d Bearbeitig in dr Verglichsaasicht un druck derno uf „Syte spichere“.',
@@ -1035,7 +1052,8 @@ Bitte prief d Logbiecher.',
 'revdelete-only-restricted' => 'Fähler bim Uusblände vum Byytrag vum $2, $1: Du chasch kei Yyträg vor Adminischtratore unterdrucke, ohni ass Du au eini vu dr andere Unterdruckigsoptione uusgwehlt hesch.',
 'revdelete-reason-dropdown' => '*Gängigi Leschgrind
 **Urheberrächtsverletzig
-**Falschi Information iber Persone',
+**Falschi Information iber Persone
+**Informatione, wu villicht anderi belaidige',
 'revdelete-otherreason' => 'Andere/Zuesätzlige Grund:',
 'revdelete-reasonotherlist' => 'Andere Grund',
 'revdelete-edit-reasonlist' => 'Leschgrind bearbeite',
@@ -1086,6 +1104,10 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
 'editundo' => 'rückgängig',
 'diff-multi' => '({{PLURAL:$1|Ei Version|$1 Versione}} vu {{PLURAL:$2|eim Benutzer|$2 Benutzer}}, {{PLURAL:$1|wu derzwische lyt, wird|wu derzwische lige, wäre}} nit aazeigt)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Ei Version|$1 Versione}} vu meh {{PLURAL:$2|eim Benutzer|$2 Benutzer}}, {{PLURAL:$1|wu derzwische lyt un nit aazeigt wird|wu derzwische lige un nit aazeigt wäre}})',
+'difference-missing-revision' => '{{PLURAL:$2|Ei Version|$2 Versione}} vui däre Unterschidsaazeig ($1) {{PLURAL:$2|isch|sin}} nit gfunde wore.
+
+Dää Fähler chunnt normalerwyys dur e veraltete Link zue dr Versionsgschicht vun ere Syte, wu in dr Zwischezyt glescht woren isch.
+Einzelheite chasch im [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Lesch-Logbuech] bschaue.',
 
 # Search results
 'searchresults' => 'Suech-Ergäbnis',
@@ -1128,8 +1150,6 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
 'search-interwiki-caption' => 'Schweschterprojäkt',
 'search-interwiki-default' => '$1 Ergebniss:',
 'search-interwiki-more' => '(meh)',
-'search-mwsuggest-enabled' => 'mit Vorschleg',
-'search-mwsuggest-disabled' => 'kei Vorschleg',
 'search-relatedarticle' => 'Verwandti',
 'mwsuggest-disable' => 'Vorschleg per Ajax deaktiviere',
 'searcheverything-enable' => 'In alle Namensryym sueche',
@@ -1162,7 +1182,7 @@ Stell sicher, ass d Versionsgschicht vun eme Artikel historisch korrekt isch.',
 
 # Preferences page
 'preferences' => 'Yystellige',
-'mypreferences' => 'Ystellige',
+'mypreferences' => 'Yystellige',
 'prefs-edits' => 'Aazahl vu dr Bearbeitige:',
 'prefsnologin' => 'Nid aagmäldet',
 'prefsnologintext' => 'Du muesch <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aagmäldet]</span> sy, für Benutzerystellige chönne z ändere',
@@ -1349,6 +1369,7 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'right-writeapi' => 'D writeAPI verwände',
 'right-delete' => 'Syte lesche',
 'right-bigdelete' => 'Syte lesche mit grosse Versionsgschichte',
+'right-deletelogentry' => 'Einzelni Logbuech-Yytreg lesche un widerhärstelle',
 'right-deleterevision' => 'Lesche un Widerherstelle vu einzelne Versione',
 'right-deletedhistory' => 'Gleschti Versione in der Versionsgschicht aaluege, ohni dr zuegherig Text',
 'right-deletedtext' => 'Gleschti Text un Versionsunterschid zwische gleschte Versionen aaluege',
@@ -1390,6 +1411,9 @@ Des cha nimmi ruckgängig gmacht wäre.',
 'rightslogtext' => 'Des ischs Logbuech vun de Änderunge on Bnutzerrechte.',
 'rightslogentry' => 'het d Benutzerrächt fir „$1“ vu „$2“ uf „$3“ gänderet',
 'rightslogentry-autopromote' => 'd Zueornig zue dr Benutzergruppe isch automatisch vu $2 in $3 gänderet wore',
+'logentry-rights-rights' => '$1 het d Gruppezuegherigkeit fir $3 vu $4 uf $5 gänderet',
+'logentry-rights-rights-legacy' => '$1 het d Gruppezuegherigkeit fir $3 gänderet',
+'logentry-rights-autopromote' => '$1 isch automatisch vu $4 zue $5 zuegordnet wore',
 'rightsnone' => '(keini)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1634,7 +1658,7 @@ Wänn s Problem alno uftritt, informier e [[Special:ListUsers/sysop|Ammann]].',
 'backend-fail-internal' => 'Im Spycher-Backend „$1“ isch e nit bekannte Fähler ufträtte.',
 'backend-fail-contenttype' => 'Dr Inhaltstyp vu dr Datei, wu im Pfad „$1“ gspycheret soll wäre, het nit chenne bstimmt wäre.',
 'backend-fail-batchsize' => 'E Bygiverarbeitigsdatei, wu s {{PLURAL:$1|ei Operation|$1 Operatione}} din het, isch an s Spycher-Backend gschickt wore. D Gränz lyt aber bi {{PLURAL:$2|eire Operation|$2 Operatione}}.',
-'backend-fail-usable' => 'D Datei $1 het nit chönne gspyycheret werde, entweder wyl kei Verzeichniss vorhande isch oder wyl kei Berächtigung hesch.',
+'backend-fail-usable' => 'D Datei „$1“ het nit chönne abgruefe oder gspyycheret werde, entweder wyl kei Verzeichniss vorhande isch oder wyl kei Berächtigung hesch.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'S het kei Verbindig chenne härgstellt würe zue dr Journaldatebank vum Spycher-Backend „$1“.',
@@ -1649,6 +1673,7 @@ Wänn s Problem alno uftritt, informier e [[Special:ListUsers/sysop|Ammann]].',
 'lockmanager-fail-releaselock' => 'D Sperri fir „$1“ het nit chenne frejgee wäre.',
 'lockmanager-fail-db-bucket' => 'Mit em Sammelabruef $1 hän nit gnue Verbindige zue Sperrdatebanke chenne härgstellt wäre.',
 'lockmanager-fail-db-release' => 'D Sperrine uf dr Datebank $1 hän nit chenne frejgee wäre.',
+'lockmanager-fail-svr-acquire' => 'D Sperrine uf em Server $1 hän nit chenne abgruefe wäre.',
 'lockmanager-fail-svr-release' => 'D Sperrine uf em Server $1 hän nit chenne frejgee wäre.',
 
 # ZipDirectoryReader
@@ -1762,6 +1787,7 @@ Villicht witt d Bschryybig uf dr dertige [$2 Dateibschryybigssyte] bearbeite.',
 'uploadnewversion-linktext' => 'E nöui Version vo dere Datei ufelade',
 'shared-repo-from' => 'vu $1',
 'shared-repo' => 'eme gmeinsame Repositorium',
+'upload-disallowed-here' => 'Du chasch die Datei nit iberschryybe.',
 
 # File reversion
 'filerevert' => 'Zrucksetze vu „$1“',
@@ -1869,6 +1895,7 @@ In jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|Kategori|Kategorie}}',
+'ninterwikis' => '{{PLURAL:$1|Ei Interwikilink|$1 Interwikilink}}',
 'nlinks' => '$1 {{PLURAL:$1|Link|Links}}',
 'nmembers' => '$1 {{PLURAL:$1|Syte|Sytene}}',
 'nrevisions' => '$1 {{PLURAL:$1|Revision|Revisione}}',
@@ -1897,6 +1924,7 @@ In jedere Zyylete het s Link zue dr erschte un dr zwote Wyterleitig un s Ziil vu
 'mostlinkedtemplates' => 'Am meischten yybouti Vorlage',
 'mostcategories' => 'Sytene mit de meischte Kategorië',
 'mostimages' => 'Am meischte verlinkti Dateie',
+'mostinterwikis' => 'Syte mit de meischte Interwikilink',
 'mostrevisions' => 'Syte mit de meischte Bearbeitige',
 'prefixindex' => 'Alli Syte (mit Präfix)',
 'prefixindex-namespace' => 'Alli Syte mit Präfix (Nameruum $1)',
@@ -1950,6 +1978,7 @@ Bitte gib Acht, ass anderi Netzsyte die Datei mit ere diräkte URL chenne verlin
 D Aazeig cha dur d Uuswahl vun eme Protokoll, eme Benutzername oder eme Sytename yygschränkt wäre (Acht gee uf d Gross- un Chleischrybig).',
 'logempty' => 'Kei Yyträg gfunde, wu passe.',
 'log-title-wildcard' => 'Titel fangt aa mit',
+'showhideselectedlogentries' => 'Uusgwehlti Logbuechyytreg aazeige/verstecke',
 
 # Special:AllPages
 'allpages' => 'alli Sytene',
@@ -1993,7 +2022,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 <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-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> (Standard isch http, wänn kei Protokoll aagee isch).',
 'linksearch-line' => '$1 isch vo $2 verknüpft',
 'linksearch-error' => 'Platzhalter chönne numme am Aafang verwändet werre.',
 
@@ -2039,9 +2068,11 @@ Zuesätzligi Informatione iber einzelni Rächt git s [[{{MediaWiki:Listgrouprigh
 'mailnologin' => 'Du bisch nid aagmäldet oder hesch keis Mail aaggä',
 'mailnologintext' => 'Du muesch [[Special:UserLogin|aagmäldet syy]] un e bstätigti E-Mail-Adräss in Dyyne [[Special:Preferences|Yystellige]] aagee ha, fir dass epper anderem es E-Mail chasch schicke.',
 'emailuser' => 'Es Mail schrybe',
+'emailuser-title-target' => 'E-Mail an {{GENDER:$1|dää Benutzer|die Benutzeri}} schicke',
+'emailuser-title-notarget' => 'E-Mail an Benutzer',
 'emailpage' => 'E-Mail an Benutzer',
-'emailpagetext' => 'Du chasch im Benutzer mit däm Formular e E-Mail schicke.
-As Absender wird d E-Mail-Adräss us Dyyne [[Special:Preferences|Yystellige]] yytrait, ass dr Benutzer Dir cha Antwort gee.',
+'emailpagetext' => 'Du chasch {{GENDER:$1|em Benutzer|dr Benutzeri}} mit däm Formular e E-Mail schicke.
+As Absender wird d E-Mail-Adräss us Dyyne [[Special:Preferences|Yystellige]] yytrait, ass {{GENDER:$1|dr Benutzer|d Benutzeri}} Dir cha Antwort gee.',
 'usermailererror' => 'S Mail-Objekt het e Fähler zruckgee:',
 'defemailsubject' => '{{SITENAME}}-E-Mail vum Benutzer „$1“',
 'usermaildisabled' => 'Benutzer-E-Mail abgstellt',
@@ -2110,11 +2141,7 @@ Wänn Du d Syte speter wider vu dr Lischt witt stryyche, deno druck eifach uf 
 
 'enotif_mailer' => '{{SITENAME}} E-Mail-Benochrichtigungsdienscht',
 'enotif_reset' => 'Alli Syte as aagluegt markiere',
-'enotif_newpagetext' => 'Des isch e neiji Syte.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-Benutzer',
-'changed' => 'gänderet',
-'created' => 'aagleit',
-'enotif_subject' => 'D {{SITENAME}} Syte $PAGETITLE isch vum $PAGEEDITOR $CHANGEDORCREATED wore.',
 'enotif_lastvisited' => '$1 zeigt alli Änderige uf s Mol.',
 'enotif_lastdiff' => 'Lueg $1 no däre Änderig.',
 'enotif_anon_editor' => 'Anonyme Benutzer $1',
@@ -2180,6 +2207,8 @@ Im $2 het s e Lischt vu dr letschte Leschige.',
 'rollback' => 'Zrucksetze vu dr Änderige',
 'rollback_short' => 'Zrucksetze',
 'rollbacklink' => 'Zrüggsetze',
+'rollbacklinkcount' => '{{PLURAL:$1|Ei Version|$1 Versione}} zrucksetze',
+'rollbacklinkcount-morethan' => 'Meh wie {{PLURAL:$1|ei Version|$1 Versione}} zrucksetze',
 'rollbackfailed' => 'S Zrucksetze het nit funktioniert',
 'cantrollback' => 'D Änderig cha nit zruckgsetzt wäre, wel s keini friejere Autore git.',
 'alreadyrolled' => 'Cha d Änderig uf [[:$1]] wu vu [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) gmacht wore sin, zruckneh, wel e andere Benutzer in dr Zwischenzyt s scho zruckgsetzt het oder suscht ebis an däre Syte gänderet het.
@@ -2288,7 +2317,9 @@ In däm Fall darf di neijscht Version nit markiert wäre oder ihre Status muess
 'undeletedrevisions' => '{{PLURAL:$1|ei Revision|$1 Revisione}} wider zruckgholt.',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 Version|$1 Versione}} un {{PLURAL:$2|1 Datei|$2 Dateie}} sin widerhärgstellt wore',
 'undeletedfiles' => '{{PLURAL:$1|1 Datei isch|$1 Dateie sin}} widerhärgstellt wore',
-'cannotundelete' => 'Widerhärstellig isch nit gange; eber ander het villicht d Syte scho widerhärgstellt.',
+'cannotundelete' => 'D Widerhärstellig isch nit gange:
+
+$1',
 'undeletedpage' => "'''„$1“''' isch widerhärgstellt wore.
 
 Im [[Special:Log/delete|Lesch-Logbuech]] findsch e Ibersicht vu dr gleschte un widerhärgstellte Syte.",
@@ -2361,7 +2392,7 @@ Do chunnt dr aktuäll Yytrag us em Benutzersperr-Logbuech:',
 'whatlinkshere-hideredirs' => 'Wyterleitige $1',
 'whatlinkshere-hidetrans' => 'Vorlageyybindige $1',
 'whatlinkshere-hidelinks' => 'Links $1',
-'whatlinkshere-hideimages' => 'Dateigleicher $1',
+'whatlinkshere-hideimages' => 'Dateilink $1',
 'whatlinkshere-filters' => 'Filter',
 
 # Block/unblock
@@ -2571,6 +2602,7 @@ D Syte „[[:$1]]“ gits scho. Wottsch du si lösche, zume Platz zum verschiebe
 'immobile-target-namespace-iw' => 'E Interwiki-Link isch kei gültigs Ziil für e Syteverschiebig.',
 'immobile-source-page' => 'Die Syte cha nüt verschobe werde.',
 'immobile-target-page' => 'Uf die Ziilsyte cha nüt verschobe werde.',
+'bad-target-model' => 'Di gwinsche Ziilsyte brucht e ander Inhaltsmodell. S Inhaltsmodell $1 cha nit in s Inhaltsmodell $2 umgwandlet wäre.',
 'imagenocrossnamespace' => 'Dateie chönne nüt ussem {{ns:file}}-Namensruum use verschobe werde',
 'nonfile-cannot-move-to-file' => 'Nit-Dateie chenne nit in dr Datei-Namensruum verschobe wäre',
 'imagetypemismatch' => 'D nöii Dateierwiiterig passt nüt zu sym Typ',
@@ -2646,6 +2678,7 @@ Alli Transwiki-Import-Aktione werde im [[Special:Log/import|Import-Logbuech]] pr
 'import-interwiki-templates' => 'Mit allene Vorlage',
 'import-interwiki-submit' => 'Import',
 'import-interwiki-namespace' => 'Ziilnamensruum:',
+'import-interwiki-rootpage' => 'Ziilstammsyte (optional):',
 'import-upload-filename' => 'Dateiname:',
 'import-comment' => 'Grund:',
 'importtext' => 'Datei iber d Spezialsyte [[Special:Export|Exportfunktion]] us em Quellwiki exportiere.
@@ -2678,6 +2711,9 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'import-error-interwiki' => 'D Syte „$1“ isch nit importiert wore, wel dr Name vun ere fir externi Link (Interwiki) reserviert isch.',
 'import-error-special' => 'D Syte „$1“ isch nit importiert wore, wel si zuen eme bsundere Namensruum ghert, wu kei Syte megli sin.',
 'import-error-invalid' => 'Syte „$1“ isch nit importiert wore, wel dr Name vun ere nit giltig isch.',
+'import-options-wrong' => 'Falschi {{PLURAL:$2|Option|Optione}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Dää Stammsytename isch nit giltig.',
+'import-rootpage-nosubpage' => 'Im Namensruum „$1“ vu dr Stammsyte sin kei Untersyte erlaubt.',
 
 # Import log
 'importlogpage' => 'Import-Logbuech',
@@ -2689,7 +2725,6 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-Tescht',
-'javascripttest-disabled' => 'Die Funktion isch in däm Wiki nit aktiviert wore.',
 'javascripttest-title' => '$1-Tescht wäre durgfiert',
 'javascripttest-pagetext-noframework' => 'Die Syte isch reserviert fir JavaSkript-Tescht.',
 'javascripttest-pagetext-unknownframework' => 'Nit bekannt Framework „$1“.',
@@ -2789,14 +2824,47 @@ Die uf em lokale Rächner spychere un derno do uffelade.',
 'spambot_username' => 'MediaWiki Spam-Syyferig',
 'spam_reverting' => 'Letschti Version ohni Links zue $1 widerhärgstellt.',
 'spam_blanking' => 'In allene Versione het s Links zue $1 gha, sufer gmacht.',
+'spam_deleting' => 'Alli Versione mit eme Link zue $1 sin glescht woret.',
 
 # Info page
 'pageinfo-title' => 'Informatione zue „$1“',
+'pageinfo-not-current' => 'Die Informatione chenne leider nit fir alti Versionen aazeigt wäre.',
+'pageinfo-header-basic' => 'Basisinformatione',
 'pageinfo-header-edits' => 'Bearbeitige',
+'pageinfo-header-restrictions' => 'Syteschutz',
+'pageinfo-header-properties' => 'Syteneigeschafte',
+'pageinfo-display-title' => 'Aazeigtitel',
+'pageinfo-default-sort' => 'Standardsortierkriterium',
+'pageinfo-length' => 'Sytelengi (in Byte)',
+'pageinfo-article-id' => 'Syten-ID',
+'pageinfo-language' => 'Syteninhaltssproch',
+'pageinfo-robot-policy' => 'Suechmaschinestatus',
+'pageinfo-robot-index' => 'Indizierbar',
+'pageinfo-robot-noindex' => 'Nit indizierbar',
 'pageinfo-views' => 'Aazahl Sytenufruef',
 'pageinfo-watchers' => 'Aazahl vu Beobachter',
+'pageinfo-redirects-name' => 'Wyterleitige zue däre Syte',
+'pageinfo-subpages-name' => 'Untersyte vu däre Syte',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|Wyterleitig|Wyterleitige}}; $3 {{PLURAL:$3|anderi Syte}})',
+'pageinfo-firstuser' => 'Aagleit vu',
+'pageinfo-firsttime' => 'Aagleit am',
+'pageinfo-lastuser' => 'Letschte Bearbeiter',
+'pageinfo-lasttime' => 'Datum vu dr letschte Bearbeitig',
 'pageinfo-edits' => 'Aazahl Bearbeitige',
 'pageinfo-authors' => 'Aazahl vu unterschidlige Autore',
+'pageinfo-recent-edits' => 'Aazahl vu dr letschte Bearbeitige (innerhalb vu $1)',
+'pageinfo-recent-authors' => 'Aazahl vu unterschidlige Autore',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magischs Wort|Magischi Werter}} ($1)',
+'pageinfo-hidden-categories' => 'Versteckti {{PLURAL:$1|Kategori|Kategorie}} ($1)',
+'pageinfo-templates' => 'Yybundeni {{PLURAL:$1|Vorlag|Vorlage}} ($1)',
+'pageinfo-toolboxlink' => 'Informatione zue dr Syte',
+'pageinfo-redirectsto' => 'Weiterleitung nach',
+'pageinfo-redirectsto-info' => 'Information',
+'pageinfo-contentpage' => 'Zellt as Inhaltssyte',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading' => 'Syte mit Kaskadeschutz vu do',
+'pageinfo-protect-cascading-yes' => 'Jo',
+'pageinfo-protect-cascading-from' => 'Syte mit Kaskadeschutz vu',
 
 # Patrolling
 'markaspatrolleddiff' => 'Als patrulyrt markyre',
@@ -2839,6 +2907,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 Pixel, Dateigreßi: $3, MIME-Typ: $4, $5 {{PLURAL:$5|Syte| Syte}}',
 'file-nohires' => 'Kei höcheri Uflösig verfüegbar.',
 'svg-long-desc' => 'SVG-Datei, Basisgrößi: $1 × $2 Pixel, Dateigrößi: $3',
+'svg-long-desc-animated' => 'Animierti SVG-Datei, Basisgreßi $1 × $2 Pixel, Dateigreßi: $3',
 'show-big-image' => 'Originalgrößi',
 'show-big-image-preview' => 'Greßi vu däre Vorschau: $1.',
 'show-big-image-other' => 'Wyteri {{PLURAL:$2|Ufflösig|Ufflösige}}: $1.',
@@ -2848,6 +2917,8 @@ $1',
 'file-info-png-looped' => 'Ändlosschlupf',
 'file-info-png-repeat' => 'het $1 {{PLURAL:$1|Mol|Mol}} gspilt',
 'file-info-png-frames' => '$1 {{PLURAL:$1|Ramme|Ramme}}',
+'file-no-thumb-animation' => "'''Hiiwyys: Wäge tächnische Bschränkige wäre Vorschaubilder vu däre Datei nit animiert.'''",
+'file-no-thumb-animation-gif' => "'''Hiiwyys: Wäge tächnische Bschränkige wäre Vorschaubilder vu hochuufgleste GIF-Dateien wie däre nit animiert.'''",
 
 # Special:NewFiles
 'newimages' => 'Gallery vo noie Bilder',
@@ -3363,6 +3434,7 @@ Dää Bstetigungscode isch giltig bis am $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-Yybindig isch deaktiviert]',
 'scarytranscludefailed' => '[Vorlage-Yybindig fir $1 isch gescheitert]',
+'scarytranscludefailed-httpstatus' => '[Vorlagenabruef fählgschlaa fir $1: HTTP  $2]',
 'scarytranscludetoolong' => '[URL isch z lang]',
 
 # Delete conflict
@@ -3470,6 +3542,7 @@ Du chasch au d [[Special:EditWatchlist|Standard-Bearbeitigssyte]] bruuche.',
 'version-license' => 'Lizänz',
 'version-poweredby-credits' => "Die Websyte nutzt '''[//www.mediawiki.org/wiki/MediaWiki/de MediaWiki]''', Copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'anderi',
+'version-credits-summary' => 'Mir danke däne Lyt fir ihri Bytreg zue [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki isch e freji Software, d. h. s cha, no dr Bedingige vu dr GNU General Public-Lizänz, wu vu dr Free Software Foundation vereffentligt woren isch, wyterverteilt un/oder modifiziert wäre. Doderbyy cha d Version 2, oder no eigenem Ermässe, jedi nejeri Version vu dr Lizänz brucht wäre.
 
 Des Programm wird in dr Hoffnig verteilt, ass es nitzli isch, aber OHNI JEDI GARANTI un sogar ohni di impliziert Garanti vun ere MÄRTGÄNGIGKEIT oder EIGNIG FIR E BSTIMMTE ZWÄCK. Doderzue git meh Hiiwys in dr GNU General Public-Lizänz.
@@ -3608,9 +3681,9 @@ Di aagfrogt Datei wird diräkt dargstellt bzw. mit dr verchnipfte Aawändig gsta
 'logentry-move-move_redir-noredirect' => '$1 het d Syte $3 nooch $4 verschobe un het debi e Wyterleitig überschrybe, ohni sälber eini aazlege',
 'logentry-patrol-patrol' => '$1 het Version $4 vo Syte $3 als kontrolliert markiert',
 'logentry-patrol-patrol-auto' => '$1 het Version $4 vo Syte $3 automatisch als kontrolliert markiert',
-'logentry-newusers-newusers' => '$1 het en Benutzerchonto erstellt',
-'logentry-newusers-create' => '$1 het en Benutzerchonto erstellt',
-'logentry-newusers-create2' => '$1 het en Benutzerchonto $3 erstellt',
+'logentry-newusers-newusers' => 'Benutzerkonto $1 isch aagleit wore.',
+'logentry-newusers-create' => 'Benutzerkonto $1 isch aagleit wore.',
+'logentry-newusers-create2' => 'Benutzerkonto $3 isch aalgeit wore vu $1',
 'logentry-newusers-autocreate' => 'S Benutzerchonto $1 isch automatisch erstellt worde',
 'newuserlog-byemail' => 's Passwort isch per E-Mail gschickt wore',
 
@@ -3630,6 +3703,10 @@ Sunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit D
 'feedback-bugcheck' => 'Schen! Bitte iberprief no, eb s sich doderby nit um e scho [$1 bekannte Fähler] handlet.',
 'feedback-bugnew' => 'Ich haa s iberprieft. Dr nej Fähler mälde.',
 
+# Search suggestions
+'searchsuggest-search' => 'Suechi',
+'searchsuggest-containing' => 'din het s …',
+
 # API errors
 'api-error-badaccess-groups' => 'Du derfsch keini Dateie in des Wiki uffelade.',
 'api-error-badtoken' => 'Intärne Fähler: Dr Token isch fählerhaft.',
@@ -3641,10 +3718,12 @@ Sunscht chasch au s eifach Formular unte nutze. Dyy Kommentar wird, zämme mit D
 'api-error-empty-file' => 'D Datei, wu Du uffeglade hesch, isch läär.',
 'api-error-emptypage' => 'S isch nit erlaubt, neji lääri Syte aazlege.',
 'api-error-fetchfileerror' => 'Intärne Fähler: Bim Abruefe vu dr Datei isch e Fähler ufträtte.',
+'api-error-fileexists-forbidden' => 'S git scho ne Datei mit Name „$1“, si cha nit iberschryybe wäre.',
+'api-error-fileexists-shared-forbidden' => 'S git scho ne Datei mit Name „$1“ im gmeinsame Dateirepositorium, si cha wäge däm nit iberschrybe wäre.',
 '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-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 67fd0e8..bef0379 100644 (file)
  * @author Dineshjk
  * @author Dsvyas
  * @author Haritosh
+ * @author Harsh4101991
  * @author Jay
  * @author Kaganer
  * @author KartikMistry
+ * @author Kondi
  * @author Metrix1312
  * @author Mohit.dalal
  * @author Nehal
@@ -172,7 +174,7 @@ $messages = array(
 'tog-nocache' => 'બ્રાઉઝરનું પેજ કેશિંગ અક્રિય કરો',
 'tog-enotifwatchlistpages' => 'મારી ધ્યાનસૂચિમાંનું પાનુ અને ફાઇલમાં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો',
 'tog-enotifusertalkpages' => 'મારી ચર્ચાનાં પાનામાં ફેરફાર થાય ત્યારે મને ઇ-મેલ મોકલો',
-'tog-enotifminoredits' => 'પાનાં અનેફાઇલ્સમાં નાનાં ફેરફાર થાય તો પણ મને ઇ-મેલ મોકલો',
+'tog-enotifminoredits' => 'પાનાં અને ફાઇલ્સમાં નાનાં ફેરફાર થાય તો પણ મને ઇ-મેલ મોકલો',
 'tog-enotifrevealaddr' => 'નોટીફીકેશનના ઇમેલમાં મારૂ ઇમેલ એડ્રેસ બતાવો',
 'tog-shownumberswatching' => 'ધ્યાનમાં રાખતા સભ્યોની સંખ્યા બતાવો',
 'tog-oldsig' => 'હાલના હસ્તાક્ષર',
@@ -229,7 +231,7 @@ $messages = array(
 'july' => 'જુલાઇ',
 'august' => 'ઓગસ્ટ',
 'september' => 'સપ્ટેમ્બર',
-'october' => 'ઓકટોબર',
+'october' => 'àª\93àª\95à«\8dàª\9fà«\8bબર',
 'november' => 'નવેમ્બર',
 'december' => 'ડિસેમ્બર',
 'january-gen' => 'જાન્યુઆરી',
@@ -241,7 +243,7 @@ $messages = array(
 'july-gen' => 'જુલાઇ',
 'august-gen' => 'ઓગસ્ટ',
 'september-gen' => 'સપ્ટેમ્બર',
-'october-gen' => 'ઓકટોબર',
+'october-gen' => 'àª\93àª\95à«\8dàª\9fà«\8bબર',
 'november-gen' => 'નવેમ્બર',
 'december-gen' => 'ડિસેમ્બર',
 'jan' => 'જાન્યુ',
@@ -294,7 +296,6 @@ $messages = array(
 'qbbrowse' => 'બ્રાઉઝ',
 'qbedit' => 'ફેરફાર કરો',
 'qbpageoptions' => 'આ પાનું',
-'qbpageinfo' => 'સંદર્ભ',
 'qbmyoptions' => 'મારાં પાનાં',
 'qbspecialpages' => 'ખાસ પાનાં',
 'faq' => 'FAQ
@@ -418,7 +419,9 @@ $1',
 'youhavenewmessages' => 'તમારા માટે $1 ($2).',
 'newmessageslink' => 'નવીન સંદેશ',
 'newmessagesdifflink' => 'છેલ્લો ફેરફાર',
-'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશ|નવાં સંદેશાઓ}}',
+'youhavenewmessagesfromusers' => 'આપને માટે {{PLURAL:$3|અન્ય સભ્ય|$3 અન્ય સભ્યો}} તરફથી $1 છે. ($2).',
+'youhavenewmessagesmanyusers' => 'આપને માટે $1 છે. ($2)',
+'newmessageslinkplural' => '{{PLURAL:$1|નવો સંદેશો|નવા સંદેશા}}',
 'newmessagesdifflinkplural' => 'છેલ્લા {{PLURAL:$1|ફેરફાર|ફેરફારો}}',
 'youhavenewmessagesmulti' => '$1 ઉપર તમારા માટે નવો સંદેશ છે.',
 'editsection' => 'ફેરફાર કરો',
@@ -531,10 +534,11 @@ Query: $2',
 'protectedpagetext' => 'ફેરફારો થતાં રોકવા માટે આ પાનું સુરક્ષિત કરવામાં આવ્યું છે.',
 'viewsourcetext' => 'આપ આ પાનાનો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:',
 'viewyourtext' => "આપ આ પાનાનાં '''આપનાં સંપાદનો'''નો મૂળ સ્રોત નિહાળી શકો છો અને તેની નકલ (copy) પણ કરી શકો છો:",
-'protectedinterface' => 'આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.',
+'protectedinterface' => 'આ પાનું સોફ્ટવેર માટે ઇન્ટરફેઇસ ટેક્સટ આપે છે, અને તેને દુરુપયોગ રોકવા માટે સ્થગિત કર્યું છે.
+બધાંજ વિકિ માટે ભાષાંતર ઉમેરવા કે બદલવા માટે, કૃપા કરી [//translatewiki.net/ translatewiki.net], મિડિયાવિકિ સ્થાનિયકરણ પ્રકલ્પ, વાપરો.',
 'editinginterface' => "'''ચેતવણી:''' તમે જે પાનામાં ફેરફાર કરી રહ્યા છો તે પાનું સોફ્ટવેર માટે ઇન્ટરફેસ ટેક્સટ પુરી પાડે છે.
-àª\85હà«\80àª\82નà«\8b àª¬àª¦àª²àª¾àªµ àª¬à«\80àª\9cા સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.
-ભાષાàª\82તર àª\95રવા àª®àª¾àª\9fà«\87 àª\95à«\83પા àª\95રà«\80 [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] -- àª®àª¿àª¡àª¿àª¯àª¾àªµàª¿àª\95à«\80 àª²à«\8bàª\95લાàª\87àª\9dà«\87શન àªªà«\8dરàª\95લà«\8dપ વાપરો.",
+àª\85હà«\80àª\82નà«\8b àª¬àª¦àª²àª¾àªµ àª\86 àªµàª¿àª\95િ àªªàª° àª\89પસà«\8dથિત àª\85નà«\8dય સભ્યોના ઇન્ટરફેસનાં દેખાવ ઉપર અસરકર્તા બનશે.
+બધાàª\82àª\9c àªµàª¿àª\95િ àª®àª¾àª\9fà«\87 àª­àª¾àª·àª¾àª\82તર àª\89મà«\87રવા àª\95à«\87 àª¬àª¦àª²àªµàª¾ àª®àª¾àª\9fà«\87 àª\95à«\83પા àª\95રà«\80 [//translatewiki.net/ translatewiki.net], àª®àª¿àª¡àª¿àª¯àª¾àªµàª¿àª\95à«\80 àª¸à«\8dથાનિયàª\95રણ àªªà«\8dરàª\95લà«\8dપ, વાપરો.",
 'sqlhidden' => '(છુપી SQL ક્વેરી)',
 'cascadeprotected' => 'આ પાના પર ફેરફાર પ્રતિબંધિત છે કેમ કે આ પાનું  {{PLURAL:$1|એવું પાનું|એવા પાના}} માં શામિલ છે જેમાં અનુવર્તી (પગથિયામય)સંરક્ષણ સક્રીય છે :
 $2',
@@ -557,10 +561,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''તમે (લોગ આઉટ કરીને) બહાર નિકળી ચુક્યા છો.'''
 
-તમે અનામી તરીકે {{SITENAME}} વાપરવાનું ચાલુ રાખી શકો છો, કે પછી તેના તે જ કે અલગ સભ્ય તરીકે [[Special:UserLogin|ફરી પ્રવેશ]] કરી શકો છો.
+તમે અનામી તરીકે {{SITENAME}} વાપરવાનું ચાલુ રાખી શકો છો, કે પછી તેના તે જ કે અલગ સભ્ય તરીકે <span class='plainlinks'>[$1 ફરી પ્રવેશ]</span> કરી શકો છો.
 ધ્યાન રાખો કે જ્યાં સુધી તમે તમારા બ્રાઉઝરનો  કૅશ સાફ નહીં કરો ત્યાં સુધી કેટલાક પાનાં તમે પ્રવેશી ચુક્યા છો તેમ બતાવશે.",
-'welcomecreation' => '== તમારૂં સ્વાગત છે $1! ==
-તમારૂં ખાતું બની ગયું છે.
+'welcomeuser' => 'સુસ્વાગતમ્, $1!',
+'welcomecreation-msg' => 'તમારૂં ખાતું ખુલી ગયું છે.
 તમારી [[Special:Preferences|{{SITENAME}} પસંદ]] બદલવાનું ભૂલશો નહીં.',
 'yourname' => 'સભ્ય નામ:',
 'yourpassword' => 'ગુપ્ત સંજ્ઞા:',
@@ -820,8 +824,7 @@ $2
 તમે  [[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>.',
+તમે  [[Special:Search/{{PAGENAME}}|આ શબ્દ]] ધરાવતાં અન્ય લેખો શોધી શકો છો, અથવા <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} સંલગ્ન માહિતિ પત્રકોમાં શોધી શકો છો], પરંતુ તમને આ પાનું બનાવવાની મંજૂરી નથી.',
 'userpage-userdoesnotexist' => 'સભ્ય ખાતું "<nowiki>$1</nowiki>"ની નોંધણીનથી થઈ.
 શું તમે ખરેખર આ પાનાની રચના કે ફેરફાર કરવા માંગો છો',
 'userpage-userdoesnotexist-view' => 'સભ્યના ખાતા $1 ની નોંધણી નથી થઈ',
@@ -848,7 +851,7 @@ $2
 'note' => "'''નોંધ:'''",
 'previewnote' => "'''આ ફક્ત પૂર્વાવલોકન છે;'''
 તમારા ફેરફારો હજુ સાચવવામાં નથી આવ્યા!",
-'continue-editing' => 'વાàª\82àª\9aવાનું ચાલુ રાખો',
+'continue-editing' => 'ફà«\87રફાર àª\95રવાનું ચાલુ રાખો',
 'previewconflict' => 'જો તમે આ પાનું સાચવશો તો આ પ્રિવ્યુમાં દેખાય છે તેવું સચવાશે.',
 'session_fail_preview' => "'''અફસોસ છે! સત્ર માહિતી ખોઇ દેવાને કારણે અમે તમારું કાર્ય સાચવી ન શક્યાં.'''
 કૃપયા ફરી પ્રયત્ન કરો.
@@ -933,6 +936,11 @@ $2
 તે પહેલેથી હાજર છે.',
 'defaultmessagetext' => 'મૂળભૂત સંદેશ લખાણ',
 
+# Content models
+'content-model-wikitext' => 'વિકિલખાણ',
+'content-model-text' => 'સાદું લખાણ',
+'content-model-javascript' => 'જાવાસ્ક્રિપ્ટ',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ચેતવણી:''' આ પાનું ખૂબ ખર્ચાળ પદચ્છેદ સૂત્ર ધરાવે છે.
 
@@ -1180,8 +1188,6 @@ $1",
 'search-interwiki-caption' => 'બંધુ પ્રકલ્પ',
 'search-interwiki-default' => '$1 પરીણામો:',
 'search-interwiki-more' => '(વધુ)',
-'search-mwsuggest-enabled' => 'સુઝાવ સહિત',
-'search-mwsuggest-disabled' => 'સુઝાવ વિના',
 'search-relatedarticle' => 'શોધ સંબંધિત',
 'mwsuggest-disable' => 'AJAX સુઝાવો નિષ્ક્રીય કરો',
 'searcheverything-enable' => 'નામસ્થળોમાં શોધો:',
@@ -1280,7 +1286,7 @@ $1",
 'timezoneregion-indian' => 'હિંદ મહાસાગર',
 'timezoneregion-pacific' => 'પ્રશાંત મહાસાગર',
 'allowemail' => 'અન્ય સભ્યો તરફથી આવતા ઇ-મેલને પરવાનગી આપો',
-'prefs-searchoptions' => 'શોધ વિકલ્પો',
+'prefs-searchoptions' => 'શોધો',
 'prefs-namespaces' => 'નામ અવકાશો',
 'defaultns' => 'અન્યથા આ નામ અવકાશ માં શોધો',
 'default' => 'મૂળ વિકલ્પ',
@@ -1955,18 +1961,19 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'wantedfiles' => 'ઇચ્છિત ફાઈલો',
 'wantedfiletext-cat' => 'નીચેની ફાઈલ વપરાઈ છે પણ તે વિહરમન નથી. ફાઈલ અહીં હોવા તેવી ફાઈલોને પણ પરદેશી રીપોસીટરીમાંથી ફાઈલો યાદીમાં જોઈ શકાય છે. આવા પુનરાવર્તનોને  <del>struck out</del> કાઢી નાખવામાં આવશે.વધારામાં, અસ્તિત્વમાં નહોય તેવી ફાઈલધરાવતાં પાનાની યાદી [[:$1]].',
 'wantedfiletext-nocat' => 'નીચેની ફાઈલ વપરાઈ છે પણ તે અસ્તિત્વમાં નથી. ફાઈલ અહીં હોવા તેવી ફાઈલોને પણ પરદેશી રીપોસીટરીમાંથી ફાઈલો યાદીમાં જોઈ શકાય છે. આવા પુનરાવર્તનોને  <del>struck out</del> કાઢી નાખવામાં આવશે.',
-'wantedtemplates' => 'àª\9cà«\8bàª\88તા ઢાંચા',
+'wantedtemplates' => 'àª\87àª\9aà«\8dàª\9bિત ઢાંચા',
 'mostlinked' => 'સૌથી વધુ કડીઓ દ્વારા જોડાયેલ પાનું',
 'mostlinkedcategories' => 'સૌથી વધુ શ્રેણીઓ દ્વારા જોડાયેલ પાનું',
 'mostlinkedtemplates' => 'સૌથી વધુ ઢાંચાઓ  દ્વારા જોડાયેલ પાનું',
 'mostcategories' => 'સૌથી વધુ શ્રેણીઓ ધરાવતાં પાનાં',
 'mostimages' => 'સૌથી વધુ કડીઓ દ્વારા જોડાયેલી ફાઇલ',
+'mostinterwikis' => 'સૌથી વધુ આંતરવિકી કડીઓ ધરાવતાં પાના',
 'mostrevisions' => 'સૌથી વધુ ફેરફાર થયેલા પાનાં',
 'prefixindex' => 'પૂર્વાક્ષર સૂચિ',
 'prefixindex-namespace' => 'શરૂઆતમાં ($1 namespace) ધરાવતા પાનાં',
 'shortpages' => 'નાનાં પાનાં',
 'longpages' => 'લાંબા પાનાઓ',
-'deadendpages' => 'લà«\87àª\96 àª¸àª®àª¾àªªà«\8dતિ પાના',
+'deadendpages' => 'મà«\83તાàª\82ત પાના',
 'deadendpagestext' => 'નીચેના પાના {{SITENAME}}ના અન્ય પાનાને કડીઓ દ્વારા નથી જોડતાં.',
 'protectedpages' => 'સંરક્ષિત પાનાઓ',
 'protectedpages-indef' => 'ફક્ત અનિશ્ચિત સુરક્ષા ધરાવતા પાના',
@@ -2054,8 +2061,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'sp-deletedcontributions-contribs' => 'યોગદાન',
 
 # Special:LinkSearch
-'linksearch' => 'બાહ્ય કડીઓ શોધ',
-'linksearch-pat' => 'શોધ આલેખ',
+'linksearch' => 'બાહ્ય કડીઓ શોધ',
+'linksearch-pat' => 'શોધ આલેખ',
 'linksearch-ns' => 'નામાવકાશ:',
 'linksearch-ok' => 'શોધ',
 'linksearch-text' => '"*.wikipedia.org" જેવા વાઈલ્ડાકાર્ડ અહીં વાપર્યા હોઈ શકે છે.
@@ -2106,6 +2113,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 'mailnologin' => 'મેળવનારનું સરનામું નથી',
 'mailnologintext' => 'અન્ય સભ્યને ઇ-મેલ મોકલવા માટે તમે [[Special:UserLogin|logged in]] પ્રવેશ કરેલ હોવો જોઈએ અને તમારા[[Special:Preferences|preferences]] વિકલ્પોમાં તમારા ઈ-મેલ સરનામાની પુષ્ટિ થયેલી હોવી જોઈએ',
 'emailuser' => 'સભ્યને ઇ-મેલ કરો',
+'emailuser-title-notarget' => 'ઇ-મેલ વપરાશકર્તા',
 'emailpage' => 'ઈ-મેલ સભ્ય',
 'emailpagetext' => 'તમે નીચે દર્શાવેલ ફોર્મ વાપરી ઇ-મેલ મોકલી શકો છો.
 તમે તમારી માહિતીમાં [[Special:Preferences|your user preferences]] જે ઇ-મેલ લખ્યો હશે  તે દ્વારા ના નામ હેઠળ દેખાશે, જેથી ઇ-મેલ મેળવનાર તમને સંદેશાનો જવાબ આપી શકશે.',
@@ -2175,11 +2183,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 
 'enotif_mailer' => '{{SITENAME}} સૂચના ઈ-મેલ પાઠક',
 'enotif_reset' => 'બધા પાનાને મુલાકાત લેવાયેલા અંકિત કરો',
-'enotif_newpagetext' => 'આ નવું પાનું છે.',
 'enotif_impersonal_salutation' => '{{SITENAME}} સભ્ય',
-'changed' => 'બદલ્યું',
-'created' => 'બનાવ્યું',
-'enotif_subject' => '{{SITENAME}} નું પાનું $PAGETITLE $PAGEEDITOR દ્વારા $CHANGEDORCREATED',
 'enotif_lastvisited' => 'તમારી પાછલી મુલાકાત પછી થયેલા બધા ફેરફારો માટે $1 જુઓ',
 'enotif_lastdiff' => 'આ ફેરફાર જોવા $1 જુઓ',
 'enotif_anon_editor' => 'અનામિ સભ્ય $1',
@@ -2375,8 +2379,8 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 'undeletedrevisions' => '{{PLURAL:$1|૧ સંપાદન|$1 સંપાદનો}} પુન સ્થાપિત કરાયા',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 ફેરફાર|$1 ફેરફારો}} અને {{PLURAL:$2|1 ફાઈલા|$2 ફાઈલો}} પુનઃસ્થાપિત',
 'undeletedfiles' => '{{PLURAL:$1|1 ફાઇલ|$1 ફાઇલો}} પુનઃસ્થાપિત',
-'cannotundelete' => 'પુનર્જીવિત કરવાનું કાર્ય અસફળ
-કોઇકે આ પાનાને પહેલેથી પુનર્જીવિત કર્યું હોઈ શકે.',
+'cannotundelete' => 'પુનર્જીવિત કરવાનું કાર્ય અસફળ:
+$1',
 'undeletedpage' => "'''$1 પુનઃસ્થાપિત કરાયા'''
 
 તાજેતરમાં હટાવેલા કે પુનઃસ્થાપિત થયેલા ફેરફારની નોંધ નો સંદર્ભ અહીં ઉપ્લબ્ધ [[Special:Log/delete|deletion log]].",
@@ -2813,7 +2817,6 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 
 # JavaScriptTest
 'javascripttest' => 'જાવા સ્ક્રીપ્ટ પરીક્ષણ',
-'javascripttest-disabled' => 'આ સૂત્ર (ફંકશન) આ વિકિ પર કાર્યરત કરાયેલું નથી.',
 'javascripttest-title' => '$1 પરીક્ષણ જારી',
 'javascripttest-pagetext-noframework' => 'આ પાનું જાવા સ્ક્રીપ્ટ ચલાવવા આરક્ષિત છે.',
 'javascripttest-pagetext-unknownframework' => 'અજાણ ચકાસણી ફ્રેમવર્ક "$1".',
@@ -2919,10 +2922,15 @@ To perform a selective restoration, check the boxes corresponding to the revisio
 # Info page
 'pageinfo-title' => ' $1 પાના ની માહિતી નૂ મથાડૂ',
 'pageinfo-header-edits' => 'ઇતિહાસ સંપાદન',
+'pageinfo-length' => 'પૃષ્ઠની લંબાઇ (બાઇટમાં)',
 'pageinfo-views' => 'જોનારાની સંખ્યા',
 'pageinfo-watchers' => 'પાના નીરીક્ષકોની સંખ્યા',
 'pageinfo-edits' => 'કુલ સંપાદનોની સંખ્યા',
 'pageinfo-authors' => 'ક્ષેત્રના લેખકોની કુલ સંખ્યા',
+'pageinfo-toolboxlink' => 'પૃષ્ઠમાહિતી',
+'pageinfo-redirectsto-info' => 'માહિતી',
+'pageinfo-contentpage-yes' => 'હા',
+'pageinfo-protect-cascading-yes' => 'હા',
 
 # Patrolling
 'markaspatrolleddiff' => 'નિરીક્ષીત અંકિત કરો',
@@ -3757,6 +3765,10 @@ $5
 'feedback-bugcheck' => 'સરસ! જરા જોઈ લેશો કે આ  પહેલેથી જ હાજર [$1 known bugs] નથીને?',
 'feedback-bugnew' => 'મેં તપાસ્યું.  નવી ત્રુટીની જાણ કરો.',
 
+# Search suggestions
+'searchsuggest-search' => 'શોધો',
+'searchsuggest-containing' => 'ધરાવતી...',
+
 # API errors
 'api-error-badaccess-groups' => 'આ વિકિ પર ફાઈલ ચઢાવવાની પરવાનગી તમને નથી.',
 'api-error-badtoken' => 'આંતરીક ત્રુટી: ખરાબ ટોકન',
index c7fbd44..ac155d2 100644 (file)
@@ -164,7 +164,6 @@ $messages = array(
 'qbbrowse' => 'Ronsee',
 'qbedit' => 'Reagh',
 'qbpageoptions' => 'Yn duillag shoh',
-'qbpageinfo' => 'Co-hecks',
 'qbmyoptions' => 'My ghuillagyn',
 'qbspecialpages' => 'Duillagyn er lheh',
 'faq' => 'FC',
@@ -343,9 +342,6 @@ Cur coontey jeh da [[Special:ListUsers/sysop|reireyder]], as goaill stiagh yn UR
 'virus-unknownscanner' => 'ronseyder noi-veerys gyn enney',
 
 # Login and logout pages
-'welcomecreation' => '== Failt ort, $1! ==
-Ta dty choontys crooit nish.<br />
-Ny jean jarrood dty [[Special:Preferences|hosheeaghtyn {{SITENAME}}]] y chaghlaa.',
 'yourname' => "Dt'ennym ymmydeyr:",
 'yourpassword' => 'Fockle yn arrey:',
 'yourpasswordagain' => "Aascreeu d'ockle arrey:",
@@ -586,8 +582,6 @@ Ogher: '''({{int:cur}})''' = anchaslyssyn rish y lhieggan t'ayn nish,
 'search-interwiki-caption' => 'Shuyr-haleeghyn',
 'search-interwiki-default' => '{{PLURAL:$1|$1 eiyrtys|$1 eiyrtys|$1 eiyrtys|$1 eiyrtyssyn}}:',
 'search-interwiki-more' => '(ny smoo)',
-'search-mwsuggest-enabled' => 'lesh coyrle',
-'search-mwsuggest-disabled' => 'gyn coyrle',
 'search-relatedarticle' => 'Bentyn rish',
 'mwsuggest-disable' => 'Lhiettal coyrle AJAX',
 'searchrelated' => 'bentyn rish',
@@ -1002,10 +996,7 @@ Bee caghlaaghyn jeant er y duillag shoh as e ghuillag resoonaght ry-akin ayns y
 'watching' => 'Jannoo arrey...',
 'unwatching' => 'Stap y chur er arrey...',
 
-'enotif_newpagetext' => 'She duillag noa eh shoh.',
 'enotif_impersonal_salutation' => '{{SITENAME}} ymmydeyr',
-'changed' => 'ceaghlit',
-'created' => 'crooit',
 'enotif_anon_editor' => 'ymmydeyr $1 neuenmyssit',
 'enotif_body' => '$WATCHINGUSERNAME veen,
 
@@ -1477,4 +1468,8 @@ Bee adsyn elley follit dy seyr-obbragh.<br />
 # Special:Tags
 'tags-edit' => 'reaghey',
 
+# Search suggestions
+'searchsuggest-search' => 'Ronsaghey',
+'searchsuggest-containing' => 'goaill stiagh...',
+
 );
index d9ffb7e..02ae94e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Hausa (هَوُسَ)
+/** Hausa (Hausa)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -351,8 +351,6 @@ Fasali: '''({{int:cur}})''' = bambanci da zubi na yanzu, '''({{int:last}})''' =
 'search-interwiki-caption' => 'Shire-shire masu dangantaka',
 'search-interwiki-default' => 'Sakamakon $1:',
 'search-interwiki-more' => '(ƙari)',
-'search-mwsuggest-enabled' => 'Tare da shawarwari',
-'search-mwsuggest-disabled' => 'Banda shawarwari',
 'searchall' => 'duka',
 'nonefound' => "'''Hattara''': Galibi wasu sararen suna ƙalilan kawai ake nemowa.
 Ku gwada tare da amfani da \"all:\" don bincikar duka shafunan (har da shafunan muhawara, mulaye, d.s.), ko kuma ku yi amfani da sararin sunan da kuke so.",
index de9ed56..05863ff 100644 (file)
@@ -133,7 +133,6 @@ $messages = array(
 'qbbrowse' => 'Chhà-khon',
 'qbedit' => 'Phiên-siá',
 'qbpageoptions' => 'Vùn-chông sién-hong',
-'qbpageinfo' => 'Vùn-chông chṳ̂-liau',
 'qbmyoptions' => 'Ngô-ke sién-hong',
 'qbspecialpages' => 'Thi̍t-sû hong-mien',
 'faq' => 'Sòng-kien mun-thì kié-tap',
@@ -329,7 +328,6 @@ For translations, please consider using [//translatewiki.net/wiki/Main_Page?setl
 'logouttext' => "'''Ngì hien-chhai yí-kîn thui-chhut.'''
 
 Ngì khó-yî ki-siu̍k yî ngia̍k-miàng fông-sṳt sṳ́-yung {{SITENAME}}, fe̍t-chá chai-chhṳ yî siông-thùng fe̍t-he mò-thùng yung-fu sṳ̂n-fun tên-ngi̍p.",
-'welcomecreation' => '<h2>Fôn-ngiàng, $1!</h2><p>Ngì-ke chong-ho yí-kîn kien-li̍p, put-yeu mong-ki sat-chṳ {{SITENAME}} ke-ngìn chhâm-sṳ.</p>',
 'yourname' => 'Yung-fu-miàng',
 'yourpassword' => 'Me̍t-ma:',
 'yourpasswordagain' => 'Chai-chhṳ sû-ngi̍p me̍t-ma:',
@@ -624,8 +622,6 @@ Tông-tsûng pûn $3 fûng-só ke ngièn-yîn he ''$2''",
 'search-interwiki-caption' => 'Chí-moi kie-va̍k',
 'search-interwiki-default' => '$1 kiet-kó:',
 'search-interwiki-more' => '(kien-tô)',
-'search-mwsuggest-enabled' => 'yù kien-ngi',
-'search-mwsuggest-disabled' => 'mò kien-ngi',
 'showingresults' => "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$1'''-thiàu kiet-kó:",
 'showingresultsnum' => "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$3'''-thiàu kiet-kó:",
 'nonefound' => '<strong>Chu-yi:</strong> Sṳt-phai ke sêu-chhà vông-vông he chhut-yì chhṳ-thù sêu-chhà chû-yì "ke" fe̍t-chá "lâu" chṳ̂-lui ke sòng-kien-sṳ só yîn-hí.',
@@ -1067,11 +1063,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => '{{SITENAME}} email thûng-tî-hi',
 'enotif_reset' => 'Chiông só-yû hong-mien phêu-vi yí-kîn thu̍k-ko.',
-'enotif_newpagetext' => 'Liá-he sîn-kien vùn-chông.',
 'enotif_impersonal_salutation' => '{{SITENAME}} yung-fu',
-'changed' => 'siû-kói liáu',
-'created' => 'Yí-kîn kien-li̍p',
-'enotif_subject' => '{{SITENAME}} yû vùn-chông $PAGETITLE pûn $PAGEEDITOR $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Kiám-sṳ ngì song-chhṳ fóng-mun heu ke só-yû kiên-kói chhián chhâm-siòng $1.',
 'enotif_lastdiff' => 'Kiám-chhà kiên-kói chhiáng chhâm-siòng $1.',
 'enotif_anon_editor' => 'ngia̍k-miàng yung-fu $1',
index 45caf62..4501a66 100644 (file)
@@ -192,7 +192,6 @@ $messages = array(
 'qbfind' => 'Loa‘a',
 'qbedit' => 'E ho‘ololi',
 'qbpageoptions' => 'Kēia ‘ao‘ao',
-'qbpageinfo' => 'Pō‘aiapili',
 'qbmyoptions' => 'Ka‘u mau ‘ao‘ao',
 'qbspecialpages' => 'Nā ‘ao‘ao kūikawā',
 
@@ -324,9 +323,6 @@ $2',
 'ns-specialprotected' => '‘A‘ole hiki ke ho‘opololei i nā ‘ao‘ao kūikawā',
 
 # Login and logout pages
-'welcomecreation' => '== E komo mai, $1! ==
-Ua hoʻokumu ʻia kāu moʻokāki.
-Mai poina e hoʻololi i [[Special:Preferences|kāu makemake ma {{SITENAME}}]].',
 'yourname' => "Inoa mea ho'ohana",
 'yourpassword' => 'ʻŌlelo hūnā:',
 'yourpasswordagain' => "Hua'ōlelo huna hou",
@@ -473,8 +469,6 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 'search-section' => '(māhele $1)',
 'search-suggest' => 'ʻO kēia paha kou manaʻo: $1',
 'search-interwiki-caption' => 'Nā pāhana ʻē aʻe',
-'search-mwsuggest-enabled' => 'me nā manaʻo kōkua',
-'search-mwsuggest-disabled' => 'ʻaʻohe manaʻo kōkua',
 'searchall' => 'apau',
 'powersearch' => 'Hulina kūlana kiʻekiʻe',
 'powersearch-legend' => 'Hulina kūlana kiʻekiʻe',
@@ -665,8 +659,6 @@ E ʻoluʻolu, e hōʻoia i ka hoʻokūkū ʻana i lalo, a laila, e mālama i nā
 'watching' => 'Ke kia‘i nei...',
 'unwatching' => 'Ke wehe nei i ke kiaʻi...',
 
-'changed' => 'ua loli ‘ia',
-
 # Delete
 'deletepage' => 'Kāpae ʻaoʻao',
 'actioncomplete' => 'Ua pau',
index d8882df..7848a85 100644 (file)
@@ -10,6 +10,7 @@
  * @author Agbad
  * @author Amire80
  * @author Drorsnir
+ * @author Hoo
  * @author Ijon
  * @author Ofekalef
  * @author Ofrahod
@@ -27,43 +28,133 @@ $rtl = true;
 $linkTrail = '/^([a-zא-ת]+)(.*)$/sDu';
 $fallback8bitEncoding = 'windows-1255';
 
-
-$datePreferences = array(
-       'default',
-       'mdy',
-       'dmy',
-       'ymd',
-       'hebrew',
-       'ISO 8601',
+$namespaceNames = array(
+       NS_MEDIA            => 'מדיה',
+       NS_SPECIAL          => 'מיוחד',
+       NS_MAIN             => '',
+       NS_TALK             => 'שיחה',
+       NS_USER             => 'משתמש',
+       NS_USER_TALK        => 'שיחת_משתמש',
+       NS_PROJECT_TALK     => 'שיחת_$1',
+       NS_FILE             => 'קובץ',
+       NS_FILE_TALK        => 'שיחת_קובץ',
+       NS_MEDIAWIKI        => 'מדיה_ויקי',
+       NS_MEDIAWIKI_TALK   => 'שיחת_מדיה_ויקי',
+       NS_TEMPLATE         => 'תבנית',
+       NS_TEMPLATE_TALK    => 'שיחת_תבנית',
+       NS_HELP             => 'עזרה',
+       NS_HELP_TALK        => 'שיחת_עזרה',
+       NS_CATEGORY         => 'קטגוריה',
+       NS_CATEGORY_TALK    => 'שיחת_קטגוריה',
 );
-
-$dateFormats = array(
-       'mdy time' => 'H:i',
-       'mdy date' => 'xg j, Y',
-       'mdy both' => 'H:i, xg j, Y',
-
-       'dmy time' => 'H:i',
-       'dmy date' => 'j xg Y',
-       'dmy both' => 'H:i, j xg Y',
-
-       'ymd time' => 'H:i',
-       'ymd date' => 'Y xg j',
-       'ymd both' => 'H:i, Y xg j',
-
-       'hebrew time' => 'H:i',
-       'hebrew date' => 'xhxjj xjx xhxjY',
-       'hebrew both' => 'H:i, xhxjj xjx xhxjY',
-
-       'ISO 8601 time' => 'xnH:xni:xns',
-       'ISO 8601 date' => 'xnY-xnm-xnd',
-       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
+$namespaceAliases = array(
+       'תמונה'      => NS_FILE,
+       'שיחת_תמונה' => NS_FILE_TALK,
+);
+$namespaceGenderAliases = array(
+       NS_USER      => array( 'male' => 'משתמש', 'female' => 'משתמשת' ),
+       NS_USER_TALK => array( 'male' => 'שיחת_משתמש', 'female' => 'שיחת_משתמשת' ),
 );
 
-$bookstoreList = array(
-       'מיתוס'          => 'http://www.mitos.co.il/',
-       'iBooks'         => 'http://www.ibooks.co.il/',
-       'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
-       'Amazon.com'     => 'http://www.amazon.com/exec/obidos/ISBN=$1'
+$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( 'ביטול_דואר' ),
+       'JavaScriptTest'            => array( 'בדיקת_JavaScript' ),
+       '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( 'הקבצים_המקושרים_ביותר', 'התמונות_המקושרות_ביותר' ),
+       'Mostlinked'                => 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( 'העדפות', 'ההעדפות_שלי' ),
+       'Prefixindex'               => array( 'דפים_המתחילים_ב' ),
+       'Protectedpages'            => array( 'דפים_מוגנים' ),
+       'Protectedtitles'           => array( 'כותרות_מוגנות' ),
+       'Randompage'                => array( 'אקראי', 'דף_אקראי' ),
+       'Randomredirect'            => array( 'הפניה_אקראית' ),
+       'Recentchanges'             => array( 'שינויים_אחרונים' ),
+       'Recentchangeslinked'       => array( 'שינויים_בדפים_המקושרים' ),
+       'Revisiondelete'            => array( 'מחיקת_ושחזור_גרסאות' ),
+       'Search'                    => array( 'חיפוש' ),
+       'Shortpages'                => array( 'דפים_קצרים' ),
+       'Specialpages'              => array( 'דפים_מיוחדים' ),
+       'Statistics'                => array( 'סטטיסטיקות' ),
+       'Tags'                      => array( 'תגיות' ),
+       'Unblock'                   => array( 'שחרור_חסימה' ),
+       'Uncategorizedcategories'   => array( 'קטגוריות_חסרות_קטגוריה' ),
+       'Uncategorizedimages'       => array( 'קבצים_חסרי_קטגוריה', 'תמונות_חסרות_קטגוריה' ),
+       'Uncategorizedpages'        => array( 'דפים_חסרי_קטגוריה' ),
+       'Uncategorizedtemplates'    => array( 'תבניות_חסרות_קטגוריות' ),
+       'Undelete'                  => array( 'צפייה_בדפים_מחוקים' ),
+       'Unlockdb'                  => array( 'שחרור_בסיס_הנתונים' ),
+       'Unusedcategories'          => array( 'קטגוריות_שאינן_בשימוש' ),
+       'Unusedimages'              => array( 'קבצים_שאינם_בשימוש', 'תמונות_שאינן_בשימוש' ),
+       'Unusedtemplates'           => array( 'תבניות_שאינן_בשימוש' ),
+       'Unwatchedpages'            => array( 'דפים_שאינם_במעקב' ),
+       'Upload'                    => array( 'העלאה', 'העלאת_קובץ_לשרת' ),
+       'UploadStash'               => array( 'מאגר_העלאות' ),
+       'Userlogin'                 => array( 'כניסה_לחשבון', 'כניסה', 'כניסה_/_הרשמה_לחשבון' ),
+       'Userlogout'                => array( 'יציאה_מהחשבון', 'יציאה' ),
+       'Userrights'                => array( 'ניהול_הרשאות_משתמש', 'הפיכת_משתמש_למפעיל_מערכת', 'הענקת_או_ביטול_הרשאת_בוט' ),
+       'Version'                   => array( 'גרסה', 'גרסת_התוכנה' ),
+       'Wantedcategories'          => array( 'קטגוריות_מבוקשות' ),
+       'Wantedfiles'               => array( 'קבצים_מבוקשים' ),
+       'Wantedpages'               => array( 'דפים_מבוקשים' ),
+       'Wantedtemplates'           => array( 'תבניות_מבוקשות' ),
+       'Watchlist'                 => array( 'רשימת_המעקב', 'רשימת_מעקב', 'רשימת_המעקב_שלי' ),
+       'Whatlinkshere'             => array( 'דפים_המקושרים_לכאן' ),
+       'Withoutinterwiki'          => array( 'דפים_ללא_קישורי_שפה' ),
 );
 
 $magicWords = array(
@@ -73,7 +164,6 @@ $magicWords = array(
        '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' ),
@@ -221,134 +311,42 @@ $magicWords = array(
        'defaultsort_noreplace'     => array( '0', 'ללא החלפה', 'noreplace' ),
 );
 
-$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( 'ביטול_דואר' ),
-       'JavaScriptTest'            => array( 'בדיקת_JavaScript' ),
-       '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( 'הקבצים_המקושרים_ביותר', 'התמונות_המקושרות_ביותר' ),
-       'Mostlinked'                => 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( 'העדפות', 'ההעדפות_שלי' ),
-       'Prefixindex'               => array( 'דפים_המתחילים_ב' ),
-       'Protectedpages'            => array( 'דפים_מוגנים' ),
-       'Protectedtitles'           => array( 'כותרות_מוגנות' ),
-       'Randompage'                => 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( 'קבצים_חסרי_קטגוריה', 'תמונות_חסרות_קטגוריה' ),
-       'Uncategorizedpages'        => array( 'דפים_חסרי_קטגוריה' ),
-       'Uncategorizedtemplates'    => array( 'תבניות_חסרות_קטגוריות' ),
-       'Undelete'                  => array( 'צפייה_בדפים_מחוקים' ),
-       'Unlockdb'                  => array( 'שחרור_בסיס_הנתונים' ),
-       'Unusedcategories'          => array( 'קטגוריות_שאינן_בשימוש' ),
-       'Unusedimages'              => array( 'קבצים_שאינם_בשימוש', 'תמונות_שאינן_בשימוש' ),
-       'Unusedtemplates'           => array( 'תבניות_שאינן_בשימוש' ),
-       'Unwatchedpages'            => array( 'דפים_שאינם_במעקב' ),
-       'Upload'                    => array( 'העלאה', 'העלאת_קובץ_לשרת' ),
-       'UploadStash'               => array( 'מאגר_העלאות' ),
-       'Userlogin'                 => array( 'כניסה_לחשבון', 'כניסה', 'כניסה_/_הרשמה_לחשבון' ),
-       'Userlogout'                => array( 'יציאה_מהחשבון', 'יציאה' ),
-       'Userrights'                => array( 'ניהול_הרשאות_משתמש', 'הפיכת_משתמש_למפעיל_מערכת', 'הענקת_או_ביטול_הרשאת_בוט' ),
-       'Version'                   => array( 'גרסה', 'גרסת_התוכנה' ),
-       'Wantedcategories'          => array( 'קטגוריות_מבוקשות' ),
-       'Wantedfiles'               => array( 'קבצים_מבוקשים' ),
-       'Wantedpages'               => array( 'דפים_מבוקשים' ),
-       'Wantedtemplates'           => array( 'תבניות_מבוקשות' ),
-       'Watchlist'                 => array( 'רשימת_המעקב', 'רשימת_מעקב', 'רשימת_המעקב_שלי' ),
-       'Whatlinkshere'             => array( 'דפים_המקושרים_לכאן' ),
-       'Withoutinterwiki'          => array( 'דפים_ללא_קישורי_שפה' ),
+$datePreferences = array(
+       'default',
+       'mdy',
+       'dmy',
+       'ymd',
+       'hebrew',
+       'ISO 8601',
 );
 
-$namespaceNames = array(
-       NS_MEDIA            => 'מדיה',
-       NS_SPECIAL          => 'מיוחד',
-       NS_MAIN             => '',
-       NS_TALK             => 'שיחה',
-       NS_USER             => 'משתמש',
-       NS_USER_TALK        => 'שיחת_משתמש',
-       NS_PROJECT_TALK     => 'שיחת_$1',
-       NS_FILE             => 'קובץ',
-       NS_FILE_TALK        => 'שיחת_קובץ',
-       NS_MEDIAWIKI        => 'מדיה_ויקי',
-       NS_MEDIAWIKI_TALK   => 'שיחת_מדיה_ויקי',
-       NS_TEMPLATE         => 'תבנית',
-       NS_TEMPLATE_TALK    => 'שיחת_תבנית',
-       NS_HELP             => 'עזרה',
-       NS_HELP_TALK        => 'שיחת_עזרה',
-       NS_CATEGORY         => 'קטגוריה',
-       NS_CATEGORY_TALK    => 'שיחת_קטגוריה',
-);
-$namespaceAliases = array(
-       'תמונה'      => NS_FILE,
-       'שיחת_תמונה' => NS_FILE_TALK,
+$dateFormats = array(
+       'mdy time' => 'H:i',
+       'mdy date' => 'xg j, Y',
+       'mdy both' => 'H:i, xg j, Y',
+
+       'dmy time' => 'H:i',
+       'dmy date' => 'j xg Y',
+       'dmy both' => 'H:i, j xg Y',
+
+       'ymd time' => 'H:i',
+       'ymd date' => 'Y xg j',
+       'ymd both' => 'H:i, Y xg j',
+
+       'hebrew time' => 'H:i',
+       'hebrew date' => 'xhxjj xjx xhxjY',
+       'hebrew both' => 'H:i, xhxjj xjx xhxjY',
+
+       'ISO 8601 time' => 'xnH:xni:xns',
+       'ISO 8601 date' => 'xnY-xnm-xnd',
+       'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
 );
-$namespaceGenderAliases = array(
-       NS_USER      => array( 'male' => 'משתמש', 'female' => 'משתמשת' ),
-       NS_USER_TALK => array( 'male' => 'שיחת_משתמש', 'female' => 'שיחת_משתמשת' ),
+
+$bookstoreList = array(
+       'מיתוס'          => 'http://www.mitos.co.il/',
+       'iBooks'         => 'http://www.ibooks.co.il/',
+       'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1',
+       'Amazon.com'     => 'http://www.amazon.com/exec/obidos/ISBN=$1'
 );
 
 $messages = array(
@@ -401,7 +399,7 @@ $messages = array(
 
 'underline-always' => 'תמיד',
 'underline-never' => 'לעולם לא',
-'underline-default' => 'ברירת מחדל של הדפדפן',
+'underline-default' => '×\91ר×\99רת ×\9e×\97×\93×\9c ×©×\9c ×\94×¢×\99צ×\95×\91 ×\90×\95 ×©×\9c ×\94×\93פ×\93פ×\9f',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'הגופן בתיבת העריכה:',
@@ -486,8 +484,8 @@ $messages = array(
 'newwindow' => '(נפתח בחלון חדש)',
 'cancel' => 'ביטול / יציאה',
 'moredotdotdot' => 'עוד…',
-'mypage' => '×\94×\93×£ ×©×\9c×\99',
-'mytalk' => '×\93×£ ×\94ש×\99×\97×\94 ×©×\9c×\99',
+'mypage' => '×\93×£ ×\9eשת×\9eש',
+'mytalk' => 'ש×\99×\97×\94',
 'anontalk' => 'השיחה עבור IP זה',
 'navigation' => 'ניווט',
 'and' => '&#32;וגם',
@@ -497,7 +495,6 @@ $messages = array(
 'qbbrowse' => 'דפדוף',
 'qbedit' => 'עריכה',
 'qbpageoptions' => 'אפשרויות דף',
-'qbpageinfo' => 'מידע על הדף',
 'qbmyoptions' => 'האפשרויות שלי',
 'qbspecialpages' => 'דפים מיוחדים',
 'faq' => 'שאלות ותשובות',
@@ -510,7 +507,7 @@ $messages = array(
 'vector-action-protect' => 'הגנה',
 'vector-action-undelete' => 'ביטול מחיקה',
 'vector-action-unprotect' => 'שינוי הגנה',
-'vector-simplesearch-preference' => '×\94פע×\9cת ×\94צע×\95ת ×\94×\97×\99פ×\95ש ×\94×\9eש×\95פר×\95ת (בעיצוב וקטור בלבד)',
+'vector-simplesearch-preference' => '×\94פע×\9cת ×¡×¨×\92×\9c ×\97×\99פ×\95ש ×\9eפ×\95ש×\98 (בעיצוב וקטור בלבד)',
 'vector-view-create' => 'יצירה',
 'vector-view-edit' => 'עריכה',
 'vector-view-history' => 'הצגת היסטוריה',
@@ -520,6 +517,7 @@ $messages = array(
 'namespaces' => 'מרחבי שם',
 'variants' => 'גרסאות שפה',
 
+'navigation-heading' => 'תפריט הניווט',
 'errorpagetitle' => 'שגיאה',
 'returnto' => 'חזרה לדף $1.',
 'tagline' => 'מתוך {{SITENAME}}',
@@ -730,7 +728,7 @@ $1',
 'viewsource-title' => 'הצגת המקור של $1',
 'actionthrottled' => 'הפעולה הוגבלה',
 'actionthrottledtext' => 'כאמצעי נגד ספאם, אינכם מורשים לבצע פעולה זו פעמים רבות מדי בזמן קצר. אנא נסו שוב בעוד מספר דקות.',
-'protectedpagetext' => '×\93×£ ×\96×\94 ×\9e×\95×\92×\9f ×\95×\9c×\90 × ×\99ת×\9f ×\9cער×\95×\9a ×\90×\95ת×\95.',
+'protectedpagetext' => '×\93×£ ×\96×\94 ×\9e×\95×\92×\9f ×\9b×\93×\99 ×\9c×\9e× ×\95×¢ ×¢×¨×\99×\9b×\94 ×\95פע×\95×\9c×\95ת ×\90×\97ר×\95ת.',
 'viewsourcetext' => 'באפשרותכם לצפות בטקסט המקור של הדף ולהעתיקו:',
 'viewyourtext' => "באפשרותכם לצפות בטקסט המקור של '''העריכות שלכם''' של הדף ולהעתיקו:",
 'protectedinterface' => 'דף זה הוא אחד מסדרת דפים המספקים הודעות מערכת לתוכנה באתר ויקי זה, ומוגן כדי למנוע השחתות.
@@ -763,11 +761,11 @@ $2',
 # Login and logout pages
 'logouttext' => "'''יצאתם זה עתה מהחשבון.'''
 
-באפשרותכם להמשיך ולעשות שימוש ב{{grammar:תחילית|{{SITENAME}}}} באופן אנונימי, או [[Special:UserLogin|לשוב ולהיכנס לאתר]] עם שם משתמש זהה או אחר.
+באפשרותכם להמשיך ולעשות שימוש ב{{grammar:תחילית|{{SITENAME}}}} באופן אנונימי, או <span class='plainlinks'>[$1 לשוב ולהיכנס לאתר]</span> עם שם משתמש זהה או אחר.
 שימו לב כי ייתכן שדפים אחדים ימשיכו להיות מוצגים כאילו אתם עדיין מחוברים לחשבון עד שתנקו את המטמון של הדפדפן שלכם.",
-'welcomecreation' => '== ברוך בואך, $1! ==
-חשבונך נוצר.
-נא לא לשכוח להתאים את [[Special:Preferences|העדפות המשתמש]] שלך באתר {{SITENAME}}.',
+'welcomeuser' => 'ברוך בואך, $1!',
+'welcomecreation-msg' => 'חשבונך נוצר.
+נא לא לשכוח להתאים את [[Special:Preferences|העדפות המשתמש]] שלך ב{{grammar:תחילית|{{SITENAME}}}}.',
 'yourname' => 'שם משתמש:',
 'yourpassword' => 'סיסמה:',
 'yourpasswordagain' => 'הקש סיסמה שנית:',
@@ -844,7 +842,8 @@ $2',
 'acct_creation_throttle_hit' => 'מבקרים באתר זה דרך כתובת ה־IP שלכם כבר יצרו {{PLURAL:$1|חשבון אחד|$1 חשבונות}} ביום האחרון. זהו המקסימום המותר בתקופה זו.
 לפיכך, מבקרים דרך כתובת ה־IP הזו לא יכולים ליצור חשבונות נוספים ברגע זה.',
 'emailauthenticated' => 'כתובת הדוא"ל שלך אומתה ב־$3, $2.',
-'emailnotauthenticated' => 'כתובת הדוא"ל שלכם <strong>עדיין לא אושרה</strong> - שירותי הדוא"ל הבאים אינם פעילים.',
+'emailnotauthenticated' => 'כתובת הדוא"ל שלכם עדיין לא אושרה.
+לא יישלח אליכם דוא"ל עבור אף אחת מהאפשרויות הבאות.',
 'noemailprefs' => 'אנא ציינו כתובת דוא"ל בהעדפות שלכם כדי שתכונות אלה יעבדו.',
 'emailconfirmlink' => 'אישור כתובת הדוא"ל שלך',
 'invalidemailaddress' => 'כתובת הדוא"ל אינה מתקבלת כיוון שנראה שהיא בפורמט לא נכון.
@@ -1056,7 +1055,7 @@ $2
 'note' => "'''הערה:'''",
 'previewnote' => "'''זכרו שזו רק תצוגה מקדימה.'''
 השינויים שלכם טרם נשמרו!",
-'continue-editing' => '×\9c×\94×\9eש×\9a העריכה',
+'continue-editing' => '×\9e×¢×\91ר ×\9c×\90×\96×\95ר העריכה',
 'previewconflict' => 'תצוגה מקדימה זו מציגה כיצד ייראה הטקסט בחלון העריכה העליון, אם תבחרו לשמור אותו.',
 'session_fail_preview' => "'''לא ניתן לבצע את עריכתכם עקב אובדן מידע הכניסה.'''
 אנא נסו שוב.
@@ -1134,6 +1133,15 @@ $2
 'edit-already-exists' => 'לא ניתן ליצור דף חדש.
 הוא כבר קיים.',
 'defaultmessagetext' => 'טקסט ההודעה המקורי',
+'content-failed-to-parse' => 'פענוח $2 כתוכן מסוג $1 נכשל: $3',
+'invalid-content-data' => 'מידע שגוי על התוכן',
+'content-not-allowed-here' => 'תוכן מסוג "$1" אינו מותר בדף [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'טקסט ויקי',
+'content-model-text' => 'טקסט פשוט',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''אזהרה:''' דף זה כולל יותר מדי קריאות לפונקציות מפענח שגוזלות משאבים.
@@ -1389,8 +1397,6 @@ $1",
 'search-interwiki-caption' => 'מיזמי אחות',
 'search-interwiki-default' => 'תוצאות ב{{GRAMMAR:תחילית|$1}}:',
 'search-interwiki-more' => '(עוד)',
-'search-mwsuggest-enabled' => 'עם הצעות',
-'search-mwsuggest-disabled' => 'ללא הצעות',
 'search-relatedarticle' => 'קשור',
 'mwsuggest-disable' => 'ביטול הצעות AJAX',
 'searcheverything-enable' => 'חיפוש בכל מרחבי השם',
@@ -1425,7 +1431,7 @@ $1",
 
 # Preferences page
 'preferences' => 'העדפות',
-'mypreferences' => '×\94×\94×¢×\93פ×\95ת ×©×\9c×\99',
+'mypreferences' => '×\94×¢×\93פ×\95ת',
 'prefs-edits' => 'מספר עריכות:',
 'prefsnologin' => 'לא נכנסת לחשבון',
 'prefsnologintext' => 'עליכם <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} להיכנס לחשבון]</span> כדי לשנות העדפות משתמש.',
@@ -1554,8 +1560,8 @@ $1",
 'editinguser' => "שינוי הרשאות המשתמש של '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'עריכת קבוצות משתמש',
 'saveusergroups' => 'שמירת קבוצות משתמש',
-'userrights-groupsmember' => 'חבר בקבוצות:',
-'userrights-groupsmember-auto' => 'חבר אוטומטית בקבוצות:',
+'userrights-groupsmember' => '{{GENDER:$2|חבר|חברה}} ב{{PLURAL:$1|קבוצה|קבוצות}}:',
+'userrights-groupsmember-auto' => '{{GENDER:$2|חבר|חברה}} אוטומטית ב{{PLURAL:$1|קבוצה|קבוצות}}:',
 'userrights-groups-help' => 'באפשרותכם לשנות את הקבוצות שמשתמש זה חבר בהן:
 * תיבה מסומנת פירושה שהמשתמש חבר בקבוצה.
 * תיבה בלתי מסומנת פירושה שהמשתמש אינו חבר בקבוצה.
@@ -1659,6 +1665,9 @@ $1",
 'rightslogtext' => 'זהו יומן השינויים בתפקידי המשתמשים.',
 'rightslogentry' => 'שינה את ההרשאות של $1 מ$2 ל$3',
 'rightslogentry-autopromote' => 'קודם אוטומטית מ$2 ל$3',
+'logentry-rights-rights' => '$1 שינה את ההרשאות של $3 מ$4 ל$5',
+'logentry-rights-rights-legacy' => '$1 שינה את ההרשאות של $3',
+'logentry-rights-autopromote' => '$1 קודם אוטומטית מ$4 ל$5',
 'rightsnone' => '(כלום)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1896,23 +1905,24 @@ $1',
 'upload-copy-upload-invalid-domain' => 'העלאת קבצים משרת זה אינה אפשרית.',
 
 # File backend
-'backend-fail-stream' => 'לא הייתה אפשרות להזרים את הקובץ $1.',
-'backend-fail-backup' => 'לא הייתה אפשרות לגבות את הקובץ $1.',
-'backend-fail-notexists' => 'הקובץ $1 אינו קיים.',
+'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-notsame' => 'כבר קיים קובץ לא זהה ב־"$1".',
+'backend-fail-invalidpath' => '"$1" אינו נתיב אחסון תקין.',
+'backend-fail-delete' => 'לא הייתה אפשרות למחוק את הקובץ "$1".',
+'backend-fail-describe' => 'לא הייתה אפשרות לשנות את המידע הנוסף על הקובץ "$1".',
+'backend-fail-alreadyexists' => 'הקובץ "$1" כבר קיים.',
+'backend-fail-store' => 'לא הייתה אפשרות לאחסן את הקובץ "$1" ב־"$2".',
+'backend-fail-copy' => 'לא הייתה אפשרות להעתיק את הקובץ "$1" ל־"$2".',
+'backend-fail-move' => 'לא הייתה אפשרות להעביר את הקובץ "$1" ל־"$2".',
 'backend-fail-opentemp' => 'לא הייתה אפשרות לפתוח את הקובץ הזמני.',
 'backend-fail-writetemp' => 'לא הייתה אפשרות לכתוב אל הקובץ הזמני.',
 'backend-fail-closetemp' => 'לא הייתה אפשרות לסגור את הקובץ הזמני.',
-'backend-fail-read' => 'קר×\99×\90ת ×\94ק×\95×\91×¥ $1 ×\9c×\90 ×\94צ×\9c×\99×\97×\94',
-'backend-fail-create' => '×\9bת×\99×\91ת ×\94ק×\95×\91×¥ $1 ×\9c×\90 ×\94צ×\9c×\99×\97×\94',
-'backend-fail-maxsize' => '×\9bת×\99×\91ת ×\94ק×\95×\91×¥ $1 ×\9c×\90 ×\94צ×\9c×\99×\97×\94 כיוון שהוא גדול יותר {{PLURAL:$2|מבית אחד|מ־$2 בתים}}.',
+'backend-fail-read' => '×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9cקר×\95×\90 ×\90ת ×\94ק×\95×\91×¥ "$1".',
+'backend-fail-create' => '×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\9bת×\95×\91 ×\90ת ×\94ק×\95×\91×¥ "$1".',
+'backend-fail-maxsize' => '×\9c×\90 × ×\99ת×\9f ×\94×\99×\94 ×\9c×\9bת×\95×\91 ×\90ת ×\94ק×\95×\91×¥ "$1" כיוון שהוא גדול יותר {{PLURAL:$2|מבית אחד|מ־$2 בתים}}.',
 'backend-fail-readonly' => 'מאגר האחסון לקבצים "$1" הוא כרגע במצב קריאה בלבד. הסיבה שניתנה לכך היא: "\'\'\'$2\'\'\'"',
 'backend-fail-synced' => 'הקובץ "$1" נמצא במצב לא עקבי בתוך מאגרי אחסון הקבצים הפנימיים',
 'backend-fail-connect' => 'לא ניתן היה להתחבר למאגר אחסון הקבצים הפנימי "$1".',
@@ -2053,7 +2063,7 @@ $1',
 'shared-repo' => 'מקום איחסון משותף',
 'shared-repo-name-wikimediacommons' => 'ויקישיתוף',
 'filepage.css' => '/* הסגנונות הנכתבים כאן יוכללו בדף תיאור הקובץ, כולל באתרי ויקי זרים */',
-'upload-disallowed-here' => '×\9c×\9eר×\91×\94 ×\94צער, ×\90×\99×\9f ×\9c×\9a ×\94רש×\90×\94 ×\9c×\94×¢×\9c×\95ת ×\92רס×\94 ×\90×\97רת ×©×\9c ×\94ת×\9e×\95× ×\94 ×\94×\96×\90ת.',
+'upload-disallowed-here' => '×\90×\99×\9f ×\91×\90פשר×\95ת×\9b×\9d ×\9c×\93ר×\95ס ×\90ת ×\94ק×\95×\91×¥ ×\94×\96×\94.',
 
 # File reversion
 'filerevert' => 'שחזור $1',
@@ -2292,7 +2302,7 @@ $1',
 'linksearch-ok' => 'חיפוש',
 'linksearch-text' => 'ניתן להשתמש בתווים כלליים, לדוגמה <span dir="ltr">"*.wikipedia.org"</span>.
 נדרשת לפחות סיומת אינטרנט (TLD), למשל <span dir="ltr">"*.org"</span>.<br />
-פר×\95×\98×\95ק×\95×\9c×\99×\9d × ×ª×\9e×\9b×\99×\9d: <code dir="ltr">$1</code> (×\90×\99×\9f ×\9c×\94×\95ס×\99×£ ×\90×\95ת×\9d ×\91×\97×\99פ×\95ש).',
+פר×\95×\98×\95ק×\95×\9c×\99×\9d × ×ª×\9e×\9b×\99×\9d: <code dir="ltr">$1</code> (×\91ר×\99רת ×\94×\9e×\97×\93×\9c ×\94×\99×\90 <span dir="ltr">http://</span> ×\90×\9d ×\9c×\90 ×¦×\95×\99×\9f ×¤×¨×\95×\98×\95ק×\95×\9c).',
 'linksearch-line' => '$1 מקושר מהדף $2',
 'linksearch-error' => 'תווים כלליים יכולים להופיע רק בתחילת שם השרת.',
 
@@ -2341,8 +2351,8 @@ $1',
 'emailuser-title-target' => 'שליחת דוא"ל {{GENDER:$1|למשתמש זה|למשתמשת זו}}',
 'emailuser-title-notarget' => 'שליחת דוא"ל למשתמש',
 'emailpage' => 'שליחת דואר למשתמש',
-'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני למשתמש זה.
\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\9bת×\91ת×\9d ×\91[[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש ×©×\9c×\9b×\9d]] ×ª×\95פ×\99×¢ ×\9b×\9bת×\95×\91ת ×\9e×\9e× ×\94 × ×©×\9c×\97×\94 ×\94×\94×\95×\93×¢×\94, ×\9b×\93×\99 ×\9c×\90פשר ×ª×\92×\95×\91×\94 ×\99ש×\99ר×\94 ×\9c×\9e×\9bת×\91.',
+'emailpagetext' => 'ניתן להשתמש בטופס כדי לשלוח הודעת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}.
\9bת×\95×\91ת ×\94×\93×\95×\90ר ×\94×\90×\9cק×\98ר×\95× ×\99 ×©×\9bת×\91ת×\9d ×\91[[Special:Preferences|×\94×¢×\93פ×\95ת ×\94×\9eשת×\9eש ×©×\9c×\9b×\9d]] ×ª×\95פ×\99×¢ ×\9b×\9bת×\95×\91ת ×©×\94×\94×\95×\93×¢×\94 × ×©×\9c×\97×\94 ×\9e×\9e× ×\94, ×\9b×\93×\99 ×\9c×\90פשר ×ª×\92×\95×\91×\94 ×\99ש×\99ר×\94.',
 'usermailererror' => 'אובייקט הדואר החזיר שגיאה:',
 'defemailsubject' => 'דוא"ל מ{{grammar:תחילית|{{SITENAME}}}} מהמשתמש "$1"',
 'usermaildisabled' => 'שליחת דוא"ל למשתמשים מבוטלת',
@@ -2373,7 +2383,7 @@ $1',
 
 # Watchlist
 'watchlist' => 'רשימת המעקב שלי',
-'mywatchlist' => 'רש×\99×\9eת ×\94×\9eעק×\91 ×©×\9c×\99',
+'mywatchlist' => 'רש×\99×\9eת ×\9eעק×\91',
 'watchlistfor2' => 'עבור $1 $2',
 'nowatchlist' => 'אין דפים ברשימת המעקב.',
 'watchlistanontext' => 'עליכם $1 כדי לצפות או לערוך פריטים ברשימת המעקב.',
@@ -2410,19 +2420,23 @@ $1',
 
 'enotif_mailer' => 'הודעות {{SITENAME}}',
 'enotif_reset' => 'סימון כל הדפים כאילו נצפו',
-'enotif_newpagetext' => 'זהו דף חדש.',
 'enotif_impersonal_salutation' => 'משתמש של {{SITENAME}}',
-'changed' => 'שונה',
-'created' => 'נוצר',
-'enotif_subject' => 'הדף $PAGETITLE ב{{grammar:תחילית|{{SITENAME}}}} $CHANGEDORCREATED על ידי $PAGEEDITOR',
+'enotif_subject_deleted' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק על ידי {{gender:$2|$2}}',
+'enotif_subject_created' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר על ידי {{gender:$2|$2}}',
+'enotif_subject_moved' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר על ידי {{gender:$2|$2}}',
+'enotif_subject_restored' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר על ידי {{gender:$2|$2}}',
+'enotif_subject_changed' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה על ידי {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נמחק ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
+'enotif_body_intro_created' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} נוצר ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
+'enotif_body_intro_moved' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} הועבר ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
+'enotif_body_intro_restored' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שוחזר ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
+'enotif_body_intro_changed' => 'הדף $1 ב{{grammar:תחילית|{{SITENAME}}}} שונה ב־$PAGEEDITDATE על ידי {{gender:$2|$2}}, ראו $3 לגרסה הנוכחית.',
 'enotif_lastvisited' => 'ראו $1 לכל השינויים מאז ביקורכם האחרון.',
 'enotif_lastdiff' => 'ראו $1 לשינוי זה.',
 'enotif_anon_editor' => 'משתמש אנונימי $1',
 'enotif_body' => 'לכבוד $WATCHINGUSERNAME,
 
-הדף $PAGETITLE ב{{grammar:תחילית|{{SITENAME}}}} $CHANGEDORCREATED ב־$PAGEEDITDATE על ידי $PAGEEDITOR, ראו $PAGETITLE_URL לגרסה הנוכחית.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 תקציר העריכה: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2595,7 +2609,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|שוחזרה גרסה אחת|שוחזרו $1 גרסאות}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|גרסה אחת|$1 גרסאות}} ו{{PLURAL:$2|קובץ אחד|־$2 קבצים}} שוחזרו',
 'undeletedfiles' => '{{PLURAL:$1|שוחזר קובץ אחד|שוחזרו $1 קבצים}}',
-'cannotundelete' => 'השחזור נכשל; ייתכן שמישהו אחר כבר שחזר את הדף.',
+'cannotundelete' => 'השחזור נכשל:
+$1',
 'undeletedpage' => "'''הדף $1 שוחזר בהצלחה.'''
 
 ראו את [[Special:Log/delete|יומן המחיקות]] לרשימה של מחיקות ושחזורים אחרונים.",
@@ -2626,9 +2641,9 @@ $1',
 'blanknamespace' => '(ראשי)',
 
 # Contributions
-'contributions' => 'תרומות המשתמש',
+'contributions' => 'תרומות {{GENDER:$1|המשתמש|המשתמשת}}',
 'contributions-title' => 'תרומות של המשתמש $1',
-'mycontris' => '×\94תר×\95×\9e×\95ת ×©×\9c×\99',
+'mycontris' => 'תר×\95×\9e×\95ת',
 'contribsub2' => 'עבור $1 ($2)',
 'nocontribs' => 'לא נמצאו שינויים המתאימים לקריטריונים אלו.',
 'uctop' => '(אחרון)',
@@ -2898,6 +2913,7 @@ $1',
 'immobile-target-namespace-iw' => 'קישור בינוויקי אינו יעד תקין להעברת דף.',
 'immobile-source-page' => 'דף זה אינו ניתן להעברה.',
 'immobile-target-page' => 'לא ניתן להעביר אל כותרת יעד זו.',
+'bad-target-model' => 'היעד המבוקש משתמש בסוג תוכן שונה. לא ניתן להמיר $1 ל{{grammar:תחילית|$2}}.',
 'imagenocrossnamespace' => 'לא ניתן להעביר קובץ למרחב שם אחר',
 'nonfile-cannot-move-to-file' => 'לא ניתן להעביר דף שאינו קובץ למרחב קובץ',
 'imagetypemismatch' => 'סיומת הקובץ החדשה אינה מתאימה לסוג הקובץ',
@@ -3026,7 +3042,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'בדיקת JavaScript',
-'javascripttest-disabled' => 'תכונה זו לא הופעלה באתר הוויקי הזה.',
 'javascripttest-title' => 'הרצת בדיקות $1',
 'javascripttest-pagetext-noframework' => 'דף זה שמור להרצת בדיקות JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'סביבת הבדיקות "$1" אינה ידועה.',
@@ -3110,7 +3125,7 @@ $1',
 'standard.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Standard בלבד */',
 'nostalgia.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Nostalgia בלבד */',
 'cologneblue.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב CologneBlue בלבד */',
-'monobook.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Monobook בלבד */',
+'monobook.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MonoBook בלבד */',
 'myskin.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב MySkin בלבד */',
 'chick.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Chick בלבד */',
 'simple.css' => '/* הסגנונות הנכתבים כאן ישפיעו על העיצוב Simple בלבד */',
@@ -3167,6 +3182,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'מידע על "$1"',
+'pageinfo-not-current' => 'מצטערים, לא ניתן להציג את המידע הזה לגרסאות ישנות.',
 'pageinfo-header-basic' => 'מידע בסיסי',
 'pageinfo-header-edits' => 'היסטוריית עריכות',
 'pageinfo-header-restrictions' => 'הגנה על הדף',
@@ -3175,6 +3191,7 @@ $1',
 'pageinfo-default-sort' => 'מפתח המיון הרגיל',
 'pageinfo-length' => 'אורך הדף (בבתים)',
 'pageinfo-article-id' => 'מזהה הדף',
+'pageinfo-language' => 'שפת התוכן של הדף',
 'pageinfo-robot-policy' => 'מצב מנוע חיפוש',
 'pageinfo-robot-index' => 'יכול להיאסף למפתחות חיפוש',
 'pageinfo-robot-noindex' => 'לא יכול להיאסף למפתחות חיפוש',
@@ -3191,10 +3208,17 @@ $1',
 'pageinfo-authors' => 'המספר הכולל של כותבים שונים',
 'pageinfo-recent-edits' => 'מספר העריכות לאחרונה ($1)',
 'pageinfo-recent-authors' => 'מספר הכותבים הייחודיים לאחרונה',
-'pageinfo-restriction' => 'הגנה על הדף ($1)',
 'pageinfo-magic-words' => '{{PLURAL:$1|מילת קסם|מילות קסם}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|תבנית מוכללת|תבניות מוכללות}} ($1)',
+'pageinfo-toolboxlink' => 'מידע על הדף',
+'pageinfo-redirectsto' => 'מפנה אל',
+'pageinfo-redirectsto-info' => 'מידע',
+'pageinfo-contentpage' => 'נספר כדף תוכן',
+'pageinfo-contentpage-yes' => 'כן',
+'pageinfo-protect-cascading' => 'מופעלת הגנה מדורגת מכאן',
+'pageinfo-protect-cascading-yes' => 'כן',
+'pageinfo-protect-cascading-from' => 'דף זה מוגן בגלל הגנה מדורגת על',
 
 # Skin names
 'skinname-standard' => 'קלאסי',
@@ -3217,6 +3241,8 @@ $1',
 'markedaspatrollederror' => 'לא ניתן לסמן כבדוק',
 'markedaspatrollederrortext' => 'עליכם לציין גרסה שתציינו כבדוקה.',
 'markedaspatrollederror-noautopatrol' => 'אינכם מורשים לסמן את השינויים של עצמכם כבדוקים.',
+'markedaspatrollednotify' => 'שינוי זה ל"$1" סומן כבדוק.',
+'markedaspatrollederrornotify' => 'סימון השינוי כבדוק נכשל.',
 
 # Patrol log
 'patrol-log-page' => 'יומן שינויים בדוקים',
@@ -3280,6 +3306,7 @@ $1',
 'hours' => '{{PLURAL:$1|שעה|שעתיים|$1 שעות}}',
 'days' => '{{PLURAL:$1|יום|יומיים|$1 ימים}}',
 'ago' => 'לפני $1',
+'just-now' => 'לפני זמן קצר',
 
 # Bad image list
 'bad_image_list' => 'דרך הכתיבה בהודעה היא כמתואר להלן:
@@ -3770,7 +3797,8 @@ $5
 
 # Scary transclusion
 'scarytranscludedisabled' => '[הכללת דפים בין אתרים מבוטלת]',
-'scarytranscludefailed' => '[הכללת התבנית נכשלה בגלל $1]',
+'scarytranscludefailed' => '[אחזור התבנית נכשל עבור $1]',
+'scarytranscludefailed-httpstatus' => '[אחזור התבנית נכשל עבור $1&rlm;: HTTP $2]',
 'scarytranscludetoolong' => '[כתובת ה־URL ארוכה מדי]',
 
 # Delete conflict
@@ -3949,7 +3977,8 @@ $5
 'version-version' => '(גרסה $1)',
 'version-license' => 'רישיון',
 'version-poweredby-credits' => "אתר הוויקי הזה מופעל על ידי '''[//www.mediawiki.org/ מדיה־ויקי]''', © 2001–$1 $2.",
-'version-poweredby-others' => '[{{SERVER}}{{SCRIPTPATH}}/CREDITS אחרים]',
+'version-poweredby-others' => 'אחרים',
+'version-credits-summary' => 'אנו רוצים להודות לאנשים הבאים על תרומתם ל[[Special:Version|מדיה־ויקי]].',
 'version-license-info' => "מדיה־ויקי היא תוכנה חופשית; באפשרותכם להפיץ אותה מחדש ו/או לשנות אותה לפי תנאי הרישיון הציבורי הכללי של גנו המפורסם על ידי המוסד לתוכנה חופשית: גרסה 2 של רישיון זה, או (לפי בחירתכם) כל גרסה מאוחרת יותר.
 
 מדיה־ויקי מופצת בתקווה שהיא תהיה שימושית, אך '''ללא כל הבטחה לאחריות'''; אפילו לא אחריות משתמעת של '''יכולת להיסחר''' או '''התאמה למטרה מסוימת'''. ראו את הרישיון הציבורי הכללי של גנו לפרטים נוספים.
@@ -4088,10 +4117,10 @@ $5
 'logentry-move-move_redir-noredirect' => '$1 העביר את הדף $3 ל{{GRAMMAR:תחילית|$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' => '×\94×\97ש×\91×\95×\9f $1 נוצר אוטומטית',
+'logentry-newusers-newusers' => 'חשבון המשתמש $1 נוצר',
+'logentry-newusers-create' => 'חשבון המשתמש $1 נוצר',
+'logentry-newusers-create2' => 'חשבון המשתמש $3 נוצר על ידי $1',
+'logentry-newusers-autocreate' => '×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש $1 נוצר אוטומטית',
 'newuserlog-byemail' => 'הסיסמה נשלחה בדוא"ל',
 
 # Feedback
@@ -4110,6 +4139,10 @@ $5
 'feedback-bugcheck' => 'מצוין! נא לבדוק שזה לא אחד מה[$1 באגים הידועים].',
 'feedback-bugnew' => 'בדקתי. נא לדווח כבאג חדש',
 
+# Search suggestions
+'searchsuggest-search' => 'חיפוש',
+'searchsuggest-containing' => 'כולל...',
+
 # API errors
 'api-error-badaccess-groups' => 'אינכם מורשים להעלות קבצים לאתר הוויקי הזה.',
 'api-error-badtoken' => 'שגיאה פנימית: אסימון רע.',
@@ -4162,4 +4195,6 @@ $5
 'duration-centuries' => '{{PLURAL:$1|מאה שנה|מאתיים שנה|$1 מאות שנים}}',
 'duration-millennia' => '{{PLURAL:$1|אלף שנה|אלפיים שנה|$1 אלפי שנים}}',
 
+# Unknown messages
+'svg-long-error' => 'קובץ SVG לא תקין: $1',
 );
index f159368..4183c53 100644 (file)
@@ -31,6 +31,7 @@
  * @author Omprakash
  * @author Pulkitsingh01
  * @author Purodha
+ * @author Raj Singh
  * @author Rajesh
  * @author Rajivkurjee
  * @author Reedy
@@ -226,7 +227,7 @@ $messages = array(
 
 'underline-always' => 'सदैव',
 'underline-never' => 'कभी नहीं',
-'underline-default' => 'ब्राउज़र डिफ़ॉल्ट',
+'underline-default' => 'तà¥\8dवà¤\9aा à¤¯à¤¾ à¤¬à¥\8dराà¤\89à¤\9c़र à¤¡à¤¿à¤«à¤¼à¥\89लà¥\8dà¤\9f',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'सम्पादन क्षेत्र की मुद्रलिपि शैली:',
@@ -322,7 +323,6 @@ $messages = array(
 'qbbrowse' => 'ब्राउज़',
 'qbedit' => 'बदलें',
 'qbpageoptions' => 'यह पृष्ठ',
-'qbpageinfo' => 'पृष्ठ जानकारी',
 'qbmyoptions' => 'मेरे पृष्ठ',
 'qbspecialpages' => 'विशेष पृष्ठ',
 'faq' => 'बहुधा पूछित प्रश्न',
@@ -581,10 +581,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''अब आपका सत्रांत हो चुका है।'''
 
-आप बेनामी हो के {{SITENAME}} का प्रयोग जारी रख सकते हैं, या उसी या किसी और सदस्य के तौर पर [[Special:UserLogin|फिर से सत्रारंभ]] कर सकते हैं।
+आप बेनामी हो के {{SITENAME}} का प्रयोग जारी रख सकते हैं, या उसी या किसी और सदस्य के तौर पर <span class='plainlinks'>[$1 फिर से सत्रारंभ]</span> कर सकते हैं।
 ध्यान दें कि जब तक आप अपनी ब्राउज़र कैशे खाली नहीं करते हैं, कुछ पृष्ठ अब भी ऐसे दिख सकते हैं जैसे कि आपका सत्र अभी भी चल रहा हो।",
-'welcomecreation' => '== आपका स्वागत है, $1 ! ==
-आपका खाता बनाया जा चुका है। अपनी [[Special:Preferences|{{SITENAME}} वरीयताएँ]] परिवर्तित करना न भूलिएगा।',
 'yourname' => 'सदस्यनाम:',
 'yourpassword' => 'कूटशब्द:',
 'yourpasswordagain' => 'कूटशब्द दुबारा लिखें:',
@@ -953,6 +951,9 @@ $2
 यह पहले से मौजूद है।',
 'defaultmessagetext' => 'संदेश का डिफ़ॉल्ट पाठ',
 
+# Content models
+'content-model-javascript' => 'जावास्क्रिप्ट',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''चेतावनी:''' इस पृष्ठ पर बहुत अधिक संख्या में कीमती पार्सर फ़ंक्शनों का प्रयोग किया गया है।
 
@@ -1191,14 +1192,12 @@ $1",
 'search-result-size' => '$1 ({{PLURAL:$2|$2 शब्द}})',
 'search-result-category-size' => '{{PLURAL:$1|$1 सदस्य}} ({{PLURAL:$2|$2 उपश्रेणी|$2 उपश्रेणियाँ}}, {{PLURAL:$3|$3 सञ्चिका|$3 सञ्चिकाएँ}})',
 'search-result-score' => 'संबद्ध: $1%',
-'search-redirect' => '(पुनर्निर्देश $1)',
+'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' => 'सुझाव नहीं',
 'search-relatedarticle' => 'सम्बंधित',
 'mwsuggest-disable' => 'AJAX सुझाव बंद करें',
 'searcheverything-enable' => 'सभी नामस्थानों में खोजें',
@@ -1233,7 +1232,7 @@ $1",
 
 # Preferences page
 'preferences' => 'मेरी वरीयताएँ',
-'mypreferences' => 'मà¥\87रà¥\80 à¤µà¤°à¥\80यताà¤\8fà¤\81',
+'mypreferences' => 'मà¥\87रà¥\80 à¤ªà¤¸à¤\82द',
 'prefs-edits' => 'संपादन संख्या:',
 'prefsnologin' => 'लॉग इन नहीं किया है',
 'prefsnologintext' => 'वरीयताएँ बदलने के लिए आपको <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} सत्रारंभ]</span> करना होगा।',
@@ -1968,6 +1967,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|बाइट|बाइट}}',
 'ncategories' => '{{PLURAL:$1|एक श्रेणी|$1 श्रेणियाँ}}',
+'ninterwikis' => '$1 अंतरविकी {{PLURAL:$1|कड़ी|कड़ियाँ}}',
 'nlinks' => '$1 {{PLURAL:$1|कड़ी|कड़ियाँ}}',
 'nmembers' => '$1 {{PLURAL:$1|सदस्य}}',
 'nrevisions' => '$1 {{PLURAL:$1|अवतरण}}',
@@ -2050,6 +2050,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 आप और बारीकी के लिए लॉग का प्रकार, सदस्य नाम (लघु-दीर्घ-अक्षर संवेदी), या प्रभावित पृष्ठ (लघु-दीर्घ-अक्षर संवेदी) चुन सकते हैं।',
 'logempty' => 'लॉग में ऐसी प्रविष्टि नहीं है।',
 'log-title-wildcard' => 'इस पाठ से शुरू होने वाले शीर्षक खोजें',
+'showhideselectedlogentries' => 'चयनित लॉग प्रविष्टियाँ दिखाएँ/छुपाएँ',
 
 # Special:AllPages
 'allpages' => 'सभी पृष्ठ',
@@ -2137,6 +2138,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|अपनी सदस्य वरीयताओं]] में दिया था वह इस ई-मेल के "भेजने वाले" के तौर पर आएगा, अतः प्राप्तकर्ता आपको सीधे जवाब दे सकेंगे।',
@@ -2208,11 +2211,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization देखें।',
 
 'enotif_mailer' => '{{SITENAME}} सूचना इ-मेल कर्ता',
 'enotif_reset' => 'सभी पृष्ठ देखे हुए दर्शाएँ',
-'enotif_newpagetext' => 'यह नया पृष्ठ है।',
 'enotif_impersonal_salutation' => '{{SITENAME}} सदस्य',
-'changed' => 'परिवर्तित किया',
-'created' => 'बनाया',
-'enotif_subject' => '{{SITENAME}} पृष्ठ $PAGETITLE $PAGEEDITOR ने $CHANGEDORCREATED',
 'enotif_lastvisited' => 'आपकी आखिरी भेंट के बाद हुए बदलाव देखने के लिये $1 देखें।',
 'enotif_lastdiff' => 'इस बदलाव को देखने के लिये $1 देखें।',
 'enotif_anon_editor' => 'अनामक सदस्य $1',
@@ -3809,6 +3808,9 @@ $5
 'feedback-bugcheck' => 'शानदार! जांच ले कहीं ये [ $1 known bugs] पहले से ही न हो ।',
 'feedback-bugnew' => 'मैं जाँच कीया। एक नया बग रिपोर्ट करें',
 
+# Search suggestions
+'searchsuggest-search' => 'खोज',
+
 # API errors
 'api-error-badaccess-groups' => 'आपको इस विकि के लिए फ़ाइलें अपलोड करने की अनुमति नहीं है.',
 'api-error-badtoken' => 'आंतरिक त्रुटि: बुरी टोकन।',
index 261937c..8e5f5bd 100644 (file)
@@ -179,7 +179,6 @@ $messages = array(
 'qbbrowse' => 'Browse karo',
 'qbedit' => 'Badlo',
 'qbpageoptions' => 'Ii panna',
-'qbpageinfo' => 'Vishay',
 'qbmyoptions' => 'Hamar panna',
 'qbspecialpages' => 'Khaas panna',
 'faq' => 'Sab time puchhe waala sawal',
@@ -192,7 +191,7 @@ $messages = array(
 'vector-action-protect' => 'Bachao',
 'vector-action-undelete' => 'Pahile jaise karo',
 'vector-action-unprotect' => 'Surakchha ke badlo',
-'vector-simplesearch-preference' => 'Aur achchhaa se khoje salah do (Khaali vector skin)',
+'vector-simplesearch-preference' => 'Aur achchhaa se khoje ke salah do (Khaali vector skin)',
 'vector-view-create' => 'Banao',
 'vector-view-edit' => 'Badlo',
 'vector-view-history' => 'Itihaas dekho',
@@ -298,6 +297,10 @@ $1',
 'youhavenewmessages' => 'Aapke pass hai $1 ($2).',
 'newmessageslink' => 'nawaa khabar',
 'newmessagesdifflink' => 'pahile waala badlao',
+'youhavenewmessagesfromusers' => 'Aap ke lage {{PLURAL:$3|duusra sadasya|$3 sadasya}} ke lage se $1 hae ($2).',
+'youhavenewmessagesmanyusers' => 'Aap ke lage dher sadasya se $1 hae ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ek nawaa sandes|nawaa sandes}}',
+'newmessagesdifflinkplural' => 'pichhla {{PLURAL:$1|badlao}}',
 'youhavenewmessagesmulti' => 'Aap ke khatir $1 pe sandes hai',
 'editsection' => 'badlo',
 'editold' => 'badlao',
@@ -350,11 +353,11 @@ Sahi khaas panna ke suchi [[Special:SpecialPages|{{int:specialpages}}]]pe mili.'
 'error' => 'Galti',
 'databaseerror' => 'Database me galti hai',
 'dberrortext' => 'Database ke khoj me syntax error hoe gais hae.
-Saait software me bug hoi.
+Iske matlab ii hoe sake hae ki saait software me bug hoi.
 Pahile waala database ke khoj ke kosis rahaa:
-<blockquote><tt>$1</tt></blockquote>
-"<tt>$2</tt>" function ke bhitar se.
-Database ke galti sandes rahaa "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+"<code>$2</code>" function ke bhitar se.
+Database ke galti sandes rahaa "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Database ke khoj me syntax error hoe gais hae.
 Pahile waala database ke khoj ke kosis rahaa:
 "$1"
@@ -408,10 +411,11 @@ Kuch deri be baad fir se kosis karna.',
 'protectedpagetext' => 'Ii panna ke badlao ke roke ke khatir band kar dewa gais hai.',
 'viewsourcetext' => 'Aap ii panna ke source ke dekhe aur nakal utare kare sakta hai:',
 'viewyourtext' => "Aap '''aapan badlao''' ke source ke dekhe aur copy kare saktaa hae",
-'protectedinterface' => 'Ii panna software ke interface text dewe hai, aur iske barbaadi se roke ke khatir band kar dewa gais hai.',
+'protectedinterface' => 'Ii panna, ii wiki ke khatir, software ke interface text dewe hai, aur iske barbaadi se roke ke khatir band kar dewa gais hai.
+Sab wiki me anuwaad ke jorre nai to badle ke khatir, meharbaani kar ke [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project ke kaam me laao.',
 'editinginterface' => "'''Chetawani:''' Aap ek panna ke badaltaa hai jon ki software ke interface text dewe hae.
-Ii panna me badlao ke asar duusra sadasya ke interface ke bhi hoi.
-Translation khatir [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net], the MediaWiki localisation project, ke kaam me lao.",
+Ii panna me badlao ke asar duusra sadasya ke interface pe bhi hoi.
+Translation khatir [//translatewiki.net/ translatewiki.net], the MediaWiki localisation project, ke kaam me lao.",
 'sqlhidden' => '(SQL query lukawal hai)',
 'cascadeprotected' => 'Ii panna ke badlao se bachawa gais hai, kahe ki iske {{PLURAL:$1|panna, jon ki|panna, jon ki}} surakchhit hae "cascading" option turned on ke saathe me rakkhaa gais hai:
 $2',
@@ -436,17 +440,15 @@ Jon administrator iske lock karis hae, koi kaaran nai diis hae: "$3"',
 # Login and logout pages
 'logouttext' => "'''Aap abhi logged out hai.'''
 
-Aap bina naam ke {{SITENAME}} ke kaam me lae sakta hai, nai to aap wahi sadasya ke naam se nai to duusra sadasya ke naam se [[Special:UserLogin|log in kare sakta hai]].
+Aap bina naam ke {{SITENAME}} ke kaam me lae sakta hai, nai to aap wahi sadasya ke naam se nai to duusra sadasya ke naam se <span class='plainlinks'>[$1 log in kare sakta hai]</span>.
 Yaad rakhna ki kuch panna wahi rakam se dekhai jaise ki aap log in bhaya hai, jab tak ki browser ke cache safaa nai hoe jaae.",
-'welcomecreation' => '== Swagat, $1! ==
-Aap ke account banae dewa gais hai.
-Aapan [[Special:Preferences|{{SITENAME}} pasand]]  ke badle nai bhulna.',
 'yourname' => 'Username:',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'Password fir se type karo:',
 'remembermypassword' => 'Ii computer pe hamaar login yaad rakho (jaada se jaada $1 {{PLURAL:$1|din|din}} talak)',
 'securelogin-stick-https' => 'Login kare ke baad HTTPS se connected raho',
 'yourdomainname' => 'Aap ke domain:',
+'password-change-forbidden' => 'Aap ii wiki me password nai badle saktaa hae.',
 'externaldberror' => 'Koi bahaari database authentication error hai, nai to aap ke bahaari account badle ke adhikar nai hai.',
 'login' => 'Log in karo',
 'nav-login-createaccount' => 'Log in karo/ nawaa account banao',
@@ -692,20 +694,21 @@ Agar aap ek anonymous user hai aur ii sochta hai ki bekar baat aap ke baare me k
 Aap saktaa hai [[Special:Search/{{PAGENAME}}|ii panna ke title khoje]] duusra panna me,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],
 nai to [{{fullurl:{{FULLPAGENAME}}|action=edit}} ii panna ke badlo]</span>.',
-'noarticletext-nopermission' => 'Abhi ii panna pe koi chij likha nai hae.
+'noarticletext-nopermission' => 'Abhi ii panna me koi chij likha nai hae.
 Aap sakta hae [[Special:Search/{{PAGENAME}}|ii panna ke title ke khoje]] duusra panna me,
-nai to <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.',
+nai to <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, lekin aap ke ii panna ke banae ke ijaaja tnai hae.',
+'missing-revision' => 'Panna "{{PAGENAME}}" me #$1 badlao nai hae.
+Iske kaaran ii hoe sake hae ki ek mitawa gais panna se link karaa jaawe hae.
+Iske baare me aur jaankari [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] me paawa jaae sake hae.',
 'userpage-userdoesnotexist' => 'User account "<nowiki>$1</nowiki>" abi registered nai hai.
 Check karo ki Ii panna ke aap banae/badle mangta hai.',
 'userpage-userdoesnotexist-view' => 'User account "$1" abhi register nai karaa gais hae',
 'blocked-notice-logextract' => 'Ii sadasya ke abhi rok dewa gais hae.
 Sab se nawaa block log entry, aap ke reference ke khatir,  niche dewa gais hae:',
 'clearyourcache' => "'''Note:''' - Save kare ke baad, aap ke sait browser ke cache ke bypass kare ke parri badlao ke dekhe khatir.
-* '''Mozilla / Firefox / Safari:'''  ''Shift'' ke dabae ke ''Reload,'' pe click karo, nai to chaahe ''Ctrl-F5'' nai to ''Ctrl-R'' (''Command-R''  Mac pe)
-* '''Google Chrome:'''  ''Ctrl-Shift-R'' dabao (''Command-Shift-R'' Mac pe)
-*  '''Internet Explorer:'''  ''Ctrl'' dabae ke  ''Refresh'' pe click karo, nai to  ''Ctrl-F5'' dabao
-*  '''Konqueror: ''' ''Reload''  click karo nai to  ''F5 dabao;'' 
-* '''Opera:'''  ''Tools → Preferences''  me se cache ke safaa karo",
+* '''Firefox / Safari:''' me ''Shift'' ke dabae ke ''Reload,'' pe click karo, nai to chaahe ''Ctrl-F5'' nai to ''Ctrl-R'' (''⌘-R''  Mac pe)
+* '''Google Chrome:''' me ''Ctrl-Shift-R'' dabao (''⌘-Shift-R'' Mac pe)
+*  '''Internet Explorer:''' me ''Ctrl'' dabae ke  ''Refresh'' pe click karo, nai to  ''Ctrl-F5'' dabao",
 'usercssyoucanpreview' => "'''Salah:''' Bachae se pahile \"{{int:showpreview}}\"  button ke kaam me laae ke aapan nawaa CSS ke test karo.",
 'userjsyoucanpreview' => "'''Salah:''' Bachae se pahile  \"{{int:showpreview}}\"  button ke kaam me laae ke aapan nawaa JavaScript ke test karo.",
 'usercsspreview' => "'''Yaad rakhna ki aap khali aapan CSS ke jhalak dekhta hai.
@@ -805,6 +808,9 @@ Janae hai ki iske koi mitae dii hai.',
 'edit-already-exists' => 'Nawaa panna nai banae sakaa hai.
 Ii naam ke panna abhi hai.',
 'defaultmessagetext' => 'Default message text',
+'content-failed-to-parse' => '$1 model ke khatir $2 ke parse nai kare sakaa hae: $3',
+'invalid-content-data' => 'Panna me likha gais chij right nai hae',
+'content-not-allowed-here' => 'Panna [[$2]] me "$1" likhe ke ijaajat nai hae',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Chetauni''': Ii panna me bahut jaada expensive parser function calls hai.
@@ -826,6 +832,7 @@ Ii sab arguments ke omit kar dewa gais hai.',
 '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)',
+'converter-manual-rule-error' => 'Bhasa ke anuwaad kare waala niyam me galti hae',
 
 # "Undo" feature
 'undo-success' => 'Ii badlao ke pahile jaise karaa jaae sake hai.
@@ -959,8 +966,9 @@ Aap ke ispe adhikar nai hai.',
 Meharbani ka ke logs ke check karo.',
 'revdelete-only-restricted' => 'Jon chij aap $2, $1 ke lukae mangta rahaa me galti hoe gais hae: aap administrator log se koi chij lukae nai saktaa hae bina duursa dekhe waala option ke chune.',
 'revdelete-reason-dropdown' => '*Mitae ke jaada kar ke kaaran
-** Bina chhape ke adikar se
+** Bina chhape ke adikar nai
 ** Aapan baare me fajuul jankari
+** Kharaab sadasya ke naam
 ** Ninda kare waala jankari',
 'revdelete-otherreason' => 'Duusra/aur kaaran:',
 'revdelete-reasonotherlist' => 'Duusra kaaran',
@@ -1056,8 +1064,6 @@ Ii baat ke dhyan me rakhna ki navigation jorr ke kaam me laae se ii column reset
 'search-interwiki-caption' => 'Saathe ke project',
 'search-interwiki-default' => '$1 ke result:',
 'search-interwiki-more' => '(aur)',
-'search-mwsuggest-enabled' => 'bichar ke saathe',
-'search-mwsuggest-disabled' => 'koi bichar nai hae',
 'search-relatedarticle' => 'sambandh rakkhe hai',
 'mwsuggest-disable' => 'AJAX sughao ke beasar karo',
 'searcheverything-enable' => 'Sab namespaces me khojo',
@@ -1156,7 +1162,7 @@ Hian pe ek, apne se banaa sabd hae, jiske aap kaam me laae saktaa hae: $1',
 'timezoneregion-indian' => 'Indian Ocean',
 'timezoneregion-pacific' => 'Pacific Ocean',
 'allowemail' => 'Aur sadasya se e-mail enable karo',
-'prefs-searchoptions' => 'Khoje ke option',
+'prefs-searchoptions' => 'Khojo',
 'prefs-namespaces' => 'Naam:',
 'defaultns' => 'Default se ii namespaces me khojo:',
 'default' => 'baaki',
@@ -1282,6 +1288,7 @@ Iske $1 {{PLURAL:$1|character|characters}} se kamti rahe ke chaahi.',
 'right-writeapi' => 'Likhe waala API ke kaam me lawa jaawe hae',
 'right-delete' => 'Panna ke mitao',
 'right-bigdelete' => 'Barraa itihaas waala panna ke mitao',
+'right-deletelogentry' => 'Mitawa aur khola gais panna ke baare me log entires',
 'right-deleterevision' => 'Panna ke khaas badlao ke mitao nai to bachao',
 'right-deletedhistory' => 'Mitawa gais itihass ke entry ke binaa saathe waala text ke dekho',
 'right-deletedtext' => 'Mitawa gais text aur mitawa gais badlao ke biich waala badlao ke dekho',
@@ -1570,7 +1577,7 @@ Agar jo problem fir nai khatam hoe tab [[Special:ListUsers/sysop|administrator]]
 '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.',
+'backend-fail-usable' => 'File $1 me nai likhe, nai to nai parrhe, 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.',
@@ -1766,8 +1773,8 @@ Templates ke delete kare se pahile duusra links ke bhi check kare ke nai bhulna.
 'disambiguations' => 'Garrbarri ke sudhare waala panna',
 'disambiguationspage' => 'Template:disambig',
 'disambiguations-text' => "Niche ke panna '''disambiguation panna''' se link hoe hai.
-They should link to the appropriate topic instead.<br />
-A page is treated as disambiguation page if it uses a template which is linked from [[MediaWiki:Disambiguationspage]]",
+Saait isse aur achchha panna se link hoi. <br />
+Ek panna ke disambiguation panna maana jaae hae jab ki ii ek template ke kaam me laae hae jon ki [[MediaWiki:Disambiguationspage]] se link hoe hae.",
 
 'doubleredirects' => 'Dugna redirects',
 'doubleredirectstext' => 'Ii panna uu panna ke suchi de hai jon ki duusra redirect panna pe redirect kare hai.
@@ -2022,11 +2029,7 @@ Ii panna ke aage ke badlao aur usse jurra baat waala panna ki suchi hian pe hae,
 
 'enotif_mailer' => '{{SITENAME}} Suchna de waala Mailer',
 'enotif_reset' => 'Sab panna ke visited mark karo',
-'enotif_newpagetext' => 'Ii ek nawaa panna hai.',
 'enotif_impersonal_salutation' => '{{SITENAME}} sadasya',
-'changed' => 'badal dewa gais hai',
-'created' => 'banae dewa gais hai',
-'enotif_subject' => '$PAGEEDITOR {{SITENAME}} panna $PAGETITLE ke badal $CHANGEDORCREATED diis hai',
 'enotif_lastvisited' => 'Aap ke pichhla visit ke baad ke badlao ke khatir $1 ke dekho.',
 'enotif_lastdiff' => 'Ii badlao ke dekhe ke khatir $1 ke dekho.',
 'enotif_anon_editor' => 'bina naam ke sadasya $1',
@@ -3027,4 +3030,7 @@ Wahii line pe aur koi jorr exception consider karaa jai i.e. jahaan pe panna sak
 'revdelete-unrestricted' => 'sysops se hatawa gae rukawat',
 'newuserlog-byemail' => 'password ke e-mail se bheja gais hai',
 
+# Search suggestions
+'searchsuggest-search' => 'Khojo',
+
 );
index e34ebfd..a0bfaac 100644 (file)
@@ -161,7 +161,6 @@ $messages = array(
 'qbbrowse' => 'Magbasa-basa',
 'qbedit' => 'Ilisan',
 'qbpageoptions' => 'Ining panid',
-'qbpageinfo' => 'Kahulugan/Konteksto',
 'qbmyoptions' => 'Akon mga panid',
 'qbspecialpages' => 'Pinasahi nga mga panid',
 'faq' => 'Mga masami pamangkoton',
@@ -427,11 +426,8 @@ Ang administrador nga nag-kandado sini naghatag sang paathag nga: "$3".',
 # Login and logout pages
 'logouttext' => "'''Naka-guha ka na.'''
 
-Makapadayon ka sa gihapon sa paggamit sang {{SITENAME}} nga indi makilal-an, ukon mahimo ka man [[Special:UserLogin|magsulod liwat]] bilang amo sa gihapon ukon lain nga nga manug-gamit.
+Makapadayon ka sa gihapon sa paggamit sang {{SITENAME}} nga indi makilal-an, ukon mahimo ka man <span class='plainlinks'>[$1 magsulod liwat]</span> bilang amo sa gihapon ukon lain nga nga manug-gamit.
 Tandaan nga may mga panid nga mahimo ma-display sa gihapon nga daw nakasulod ka sa gihapon, hasta mapanas mo na ang tinago sang imo brawser.",
-'welcomecreation' => '== Pagtamyaw, $1! ==
-Ang imo account nahimo na.
-Indi pagkalimti ang pag-ilis sang imo mga [[Special:Preferences|{{SITENAME}} pagpasulabi]].',
 'yourname' => 'Ngalan sang Manog-gamit:',
 'yourpassword' => 'Kontra-senyas:',
 'yourpasswordagain' => 'Suliton ang kontra-senyas:',
@@ -1074,8 +1070,6 @@ Ang mga detalye mahimo nga makita sa [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-caption' => 'Mga Utod proyekto',
 'search-interwiki-default' => '$1 mga resulta:',
 'search-interwiki-more' => '(damu)',
-'search-mwsuggest-enabled' => 'may suhestiyon',
-'search-mwsuggest-disabled' => 'wala suhestiyon',
 'search-relatedarticle' => 'Konektado',
 'mwsuggest-disable' => 'Untaton ang mga suhestiyon sang AJAX',
 'searcheverything-enable' => 'Pangitaon sa tanan nga espasyo sang pangalan',
index bc1fbfe..995e5a8 100644 (file)
@@ -157,7 +157,6 @@ $magicWords = array(
        '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' ),
@@ -458,7 +457,6 @@ $messages = array(
 'qbbrowse' => 'Pregledaj',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'O stranici',
 'qbmyoptions' => 'Moje stranice',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'Najčešća pitanja',
@@ -580,7 +578,7 @@ $1',
 '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}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|zadnje uređivanje|zadnja $1 uređivanja|zadnjih $1 uređivanja}} na stranici za razgovor',
 'youhavenewmessagesmulti' => 'Imate nove poruke na $1',
 'editsection' => 'uredi',
 'editold' => 'uredi',
@@ -711,12 +709,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Odjavili ste se.'''
 
-Možete nastaviti s korištenjem {{SITENAME}} neprijavljeni, ili se možete ponovo [[Special:UserLogin|prijaviti]] pod istim ili drugim imenom.
+Možete nastaviti s korištenjem {{SITENAME}} neprijavljeni, ili se možete ponovo <span class='plainlinks'>[$1 prijaviti]</span> pod istim ili drugim imenom.
 Neke se stranice mogu prikazivati kao da ste još uvijek prijavljeni, sve dok ne očistite međuspremnik svog preglednika.",
-'welcomecreation' => '== Dobrodošli, $1! ==
-Vaš je suradnički račun otvoren.
-
-Ne zaboravite prilagoditi [[Special:Preferences|{{SITENAME}} postavke]].',
 'yourname' => 'Suradničko ime',
 'yourpassword' => 'Lozinka:',
 'yourpasswordagain' => 'Ponovno upišite lozinku',
@@ -973,8 +967,8 @@ Posljednja stavka evidencije blokiranja navedena je niže kao napomena:',
 * '''Google Chrome:''' pritisnite ''Ctrl-Shift-R'' (''Command-Shift-R'' na Macu)
 * '''Internet Explorer:''' držite ''Ctrl'' i kliknite ''Refresh'', ili pritisnite ''Ctrl-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.",
+'usercssyoucanpreview' => "'''Savjet:''' Rabite puce \"{{int:showpreview}}\" za testiranje svog CSS-a prije snimanja.",
+'userjsyoucanpreview' => "'''Savjet:''' Rabite puce \"{{int:showpreview}}\" za testiranje svog novog JavaScripta prije snimanja.",
 'usercsspreview' => "'''Ne zaboravite: samo isprobavate/pregledavate svoj suradnički CSS. Još nije snimljen!'''",
 'userjspreview' => "'''Ne zaboravite: samo isprobavate/pregledavate svoj suradnički JavaScript, i da još nije snimljen!'''",
 'sitecsspreview' => "'''Ne zaboravite ovo je samo pregled ovog CSS-a.'''
@@ -1310,8 +1304,6 @@ Primijetite da uporaba navigacijskih poveznica resetira Vaše izbore u stupcu.',
 'search-interwiki-caption' => 'Sestrinski projekti',
 'search-interwiki-default' => '$1 rezultati:',
 'search-interwiki-more' => '(više)',
-'search-mwsuggest-enabled' => 's prijedlozima',
-'search-mwsuggest-disabled' => 'nema prijedloga',
 'search-relatedarticle' => 'Povezano',
 'mwsuggest-disable' => 'Isključi AJAX prijedloge',
 'searcheverything-enable' => 'Traži u svim imenskim prostorima',
@@ -2184,6 +2176,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-target' => 'Pošalji poruku {{GENDER:$1|suradniku|suradnici|suradniku}}',
 'emailuser-title-notarget' => 'Pošalji e-poštu suradniku',
 'emailpage' => 'Pošalji e-poštu suradniku',
 'emailpagetext' => 'Možete koristiti ovaj obrazac za slanje elektroničke pošte ovom suradniku.
@@ -2255,11 +2248,7 @@ Promjene na toj stranici i njenoj stranici za razgovor bit će prikazane na popi
 
 'enotif_mailer' => '{{SITENAME}} - izvješća o promjenama',
 'enotif_reset' => 'Označi sve stranice kao već posjećene',
-'enotif_newpagetext' => 'Ovo je nova stranica.',
 'enotif_impersonal_salutation' => '{{SITENAME}} suradnik',
-'changed' => 'promijenio',
-'created' => 'stvorio',
-'enotif_subject' => '{{SITENAME}}: Stranicu $PAGETITLE je $CHANGEDORCREATED suradnik $PAGEEDITOR',
 'enotif_lastvisited' => 'Pogledaj $1 za promjene od zadnjeg posjeta.',
 'enotif_lastdiff' => 'Pogledajte $1 kako biste mogli vidjeti tu izmjenu.',
 'enotif_anon_editor' => 'neprijavljeni suradnik $1',
@@ -2369,9 +2358,9 @@ Slijede postavke stranice '''$1''':",
 'protect-locked-access' => "Nemate ovlasti za mijenjanje razine zaštite.
 Slijede trenutačne postavke stranice '''$1''':",
 'protect-cascadeon' => 'Ova stranica je zaštićena jer je uključena u {{PLURAL:$1|stranicu, koja ima|stranice, koje imaju|stranice, koje imaju}} uključenu prenosivu zaštitu. Možete promijeniti stupanj zaštite ove stranice, no to neće utjecati na prenosivu zaštitu.',
-'protect-default' => 'Omogući svim suradnicima',
+'protect-default' => 'Omogućeno svim suradnicima',
 'protect-fallback' => 'Potrebno je imati "$1" ovlasti',
-'protect-level-autoconfirmed' => 'Blokiraj nove i neprijavljene suradnike',
+'protect-level-autoconfirmed' => 'Onemogućeno novim i neprijavljenim suradnicima',
 'protect-level-sysop' => 'Samo administratori',
 'protect-summary-cascade' => 'prenosiva zaštita',
 'protect-expiring' => 'istječe $1 (UTC)',
@@ -2859,7 +2848,6 @@ Snimite je na svoje računalo i postavite je ovdje.',
 
 # 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',
@@ -2964,25 +2952,40 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 '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-title' => 'Podatci o stranici "$1"',
+'pageinfo-not-current' => 'Nema podataka o uređivanju za najstarija uređivanja stranice.',
+'pageinfo-header-basic' => 'Osnovni podatci',
 'pageinfo-header-edits' => 'Uređivanja',
-'pageinfo-header-restrictions' => 'Zaštita stranice',
+'pageinfo-header-restrictions' => 'Status zaštite stranice',
 'pageinfo-header-properties' => 'Svojstva stranice',
-'pageinfo-display-title' => 'Prikaži naslov',
+'pageinfo-display-title' => 'Naslov stranice',
 'pageinfo-default-sort' => 'Podrazumijevano sortiranje',
 'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
+'pageinfo-language' => 'Jezik stranice',
 'pageinfo-robot-policy' => 'Status tražilice',
 'pageinfo-robot-index' => 'Stranicu je moguće indeksirati',
+'pageinfo-robot-noindex' => 'Indeksiranje stranice onemogućeno',
 'pageinfo-views' => 'Broj pregleda',
 'pageinfo-watchers' => 'Broj pratitelja stranice',
+'pageinfo-redirects-name' => 'Broj preusmjeravanja na ovu stranicu',
+'pageinfo-subpages-name' => 'Podstranice',
+'pageinfo-subpages-value' => 'Ukupno $1 ($2 {{PLURAL:$2|preusmjeravanje|preusmjeravanja}}; $3 {{PLURAL:$3|obična podstranica|obične podstranice|običnih podstranica}})',
 '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-edits' => 'Ukupan broj uređivanja',
 'pageinfo-authors' => 'Broj različitih autora',
+'pageinfo-recent-edits' => 'Broj uređivanja (u zadnjih $1)',
+'pageinfo-recent-authors' => 'Broj različitih autora u gornjem razdoblju',
+'pageinfo-magic-words' => '{{PLURAL:$1|Magična riječ - varijabla|Magične riječi - varijable}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Postoji|Postoje|Postoji}} $1 {{PLURAL:$1|skrivena kategorija|skrivene kategorije|skrivenih kategorija}}',
+'pageinfo-templates' => '{{PLURAL:$1|Rabi|Rabe|Rabi}} se $1 {{PLURAL:$1|predložak|predloška|predložaka}}',
+'pageinfo-toolboxlink' => 'Podatci o stranici',
+'pageinfo-contentpage' => 'Broji se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading-yes' => 'Da',
 
 # Skin names
 'skinname-standard' => 'Standardna',
@@ -3002,6 +3005,7 @@ Razlog je vjerojatno vanjska poveznica koja se nalazi na crnom popisu.',
 'markedaspatrollederror' => 'Ne mogu označiti za pregledano',
 'markedaspatrollederrortext' => 'Morate odabrati inačicu koju treba označiti za pregledanu.',
 'markedaspatrollederror-noautopatrol' => 'Ne možete vlastite promjene označiti patroliranima.',
+'markedaspatrollednotify' => 'Uređivanje stranice $1 označeno je pregledanim.',
 
 # Patrol log
 'patrol-log-page' => 'Evidencija pregledavanja promjena',
@@ -3273,7 +3277,7 @@ Svaka sljedeća poveznica u istom retku je izuzetak, npr. kod stranica gdje se s
 
 # EXIF attributes
 'exif-compression-1' => 'Nesažeto',
-'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeo Huffmanovo šifriranje po dužini',
+'exif-compression-2' => 'CCITT Grupa 3 1 — Dimenzionalno izmijenjeno Huffmanovo šifriranje po dužini',
 'exif-compression-3' => 'CCITT Grupa 3 faks kodiranje',
 'exif-compression-4' => 'CCITT Grupa 4 faks kodiranje',
 
@@ -3886,6 +3890,10 @@ Inače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će
 'feedback-bugcheck' => 'Izvrsno! Molimo provjerite da se ne radi o nekom [$1 poznatom "bugu"].',
 'feedback-bugnew' => 'Provjereno. Prijavi novi "bug"',
 
+# Search suggestions
+'searchsuggest-search' => 'Traži',
+'searchsuggest-containing' => 'sadrži....',
+
 # API errors
 'api-error-badaccess-groups' => 'Nemate ovlasti za postavljanje datoteka na ovu wiki.',
 'api-error-badtoken' => 'Interna pogrješka: Token nije ispravan.',
@@ -3921,5 +3929,10 @@ Inače, možete ispuniti jednostavan obrazac u nastavku. Vaš komentar biti će
 
 # Durations
 'duration-seconds' => '$1 {{PLURAL:$1|sekunda|sekunde|sekundi}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minute|minuta}}',
+'duration-hours' => '$1 {{PLURAL:$1|sat|sata|sati}}',
+'duration-days' => '$1 {{PLURAL:$1|dan|dana}}',
+'duration-weeks' => '$1 {{PLURAL:$1|tjedan|tjedna|tjedana}}',
+'duration-years' => '$1 {{PLURAL:$1|godina|godine|godina}}',
 
 );
index a9c2d02..614d08a 100644 (file)
@@ -201,7 +201,7 @@ $messages = array(
 
 'underline-always' => 'Přeco',
 'underline-never' => 'Ženje',
-'underline-default' => 'Standard wobhladowaka',
+'underline-default' => 'Standard drasty abo wobhladowaka',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Pismowy stil wobdźěłowanskeho pola:',
@@ -286,8 +286,8 @@ $messages = array(
 'newwindow' => '(wočinja so w nowym woknje)',
 'cancel' => 'Přetorhnyć',
 'moredotdotdot' => 'Wjace…',
-'mypage' => 'Moja strona',
-'mytalk' => 'moja diskusija',
+'mypage' => 'Strona',
+'mytalk' => 'Diskusija',
 'anontalk' => 'Diskusijna strona tuteje IP.adresy',
 'navigation' => 'Nawigacija',
 'and' => '&#32;a',
@@ -297,7 +297,6 @@ $messages = array(
 'qbbrowse' => 'Přepytować',
 'qbedit' => 'Wobdźěłać',
 'qbpageoptions' => 'Tuta strona',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Moje strony',
 'qbspecialpages' => 'Specialne strony',
 'faq' => 'Husto stajene prašenja (FAQ)',
@@ -310,7 +309,7 @@ $messages = array(
 'vector-action-protect' => 'škitać',
 'vector-action-undelete' => 'Wobnowić',
 'vector-action-unprotect' => 'Škit wotstronić',
-'vector-simplesearch-preference' => 'Polěpšene pytanske namjety zmóžnić (jenož šat Vector)',
+'vector-simplesearch-preference' => 'Zjednorjenu pytansku lajstu zmóžnić (jenož drasta Vector)',
 'vector-view-create' => 'Wutworić',
 'vector-view-edit' => 'Wobdźěłać',
 'vector-view-history' => 'Stawizny',
@@ -320,6 +319,7 @@ $messages = array(
 'namespaces' => 'Mjenowe rumy',
 'variants' => 'Warianty',
 
+'navigation-heading' => 'Nawigaciski meni',
 'errorpagetitle' => 'Zmylk',
 'returnto' => 'Wróćo k stronje $1.',
 'tagline' => 'z {{GRAMMAR:genitiw|{{SITENAME}}}}',
@@ -526,7 +526,7 @@ Wotprašenje: $2',
 'viewsource-title' => 'Žórłowy tekst za $1 sej wobhladać',
 'actionthrottled' => 'Akcije wobmjezowane',
 'actionthrottledtext' => 'Jako připrawa přećiwo spamej, je častosć wuwjedźenja tuteje akcije w krótkej dobje wobmjezowana a ty sy tutón limit překročił. Prošu spytaj za něšto mjeńšiny hišće raz.',
-'protectedpagetext' => 'Strona je přećiwo wobdźěłowanju škitana.',
+'protectedpagetext' => 'Tuta strona je přećiwo wobdźěłowanju abo druhim akcijam škitana.',
 'viewsourcetext' => 'Móžeš sej žórłowy tekst tuteje strony wobhladać a jón kopěrować:',
 'viewyourtext' => "Móžeš sej žórłowy tekst '''swojich změnow''' wobhladać a do slědowaceje strony kopěrować:",
 'protectedinterface' => 'Tuta strona wobsahuje tekst za wužiwarski powjerch softwary na tutym wikiju a je škitana, zo by so znjewužiwanje zadźěwało.
@@ -557,11 +557,11 @@ Administrator, kiž je jón zawrěł, je tule přičinu podał: "$3".',
 # Login and logout pages
 'logouttext' => "'''{{GENDER:|Sy|Sy}} nětko {{GENDER:|wotzjewjeny|wotzjewjena}}.'''
 
-Móžeš {{GRAMMAR:akuzatiw|{{SITENAME}}}} nětko anonymnje dale wužiwać abo so ze samsnym abo druhim wužiwarskim mjenom [[Special:UserLogin|zaso přizjewić]].
+Móžeš {{GRAMMAR:akuzatiw|{{SITENAME}}}} nětko anonymnje dale wužiwać abo so ze samsnym abo druhim wužiwarskim mjenom <span class='plainlinks'>[$1 zaso přizjewić]</span>.
 Wobkedźbuj, zo so někotre strony dale jewja, kaž by hišće přizjewjeny był, doniž pufrowak swojeho wobhladowaka njewuprózdnješ.",
-'welcomecreation' => '== Witaj, $1! ==
-
-Twoje konto bu wutworjene. Njezabudź swoje nastajenja za [[Special:Preferences|{{GRAMMAR:akuzatiw|{{SITENAME}}}}]] změnić.',
+'welcomeuser' => 'Witaj $1',
+'welcomecreation-msg' => 'Twoje konto bu wutworjene.
+Njezabudź swoje [[Special:Preferences|nastajenja za {{GRAMMAR:akuzatiw|{{SITENAME}}}}]] změnić.',
 'yourname' => 'Wužiwarske mjeno:',
 'yourpassword' => 'Hesło:',
 'yourpasswordagain' => 'Hesło znowa zapodać:',
@@ -818,7 +818,7 @@ Podrobnosće móžeš w  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'note' => "'''Kedźbu:'''",
 'previewnote' => "'''Wobmysl, zo to je jenož přehlad.'''
 Twoje změny hišće njejsu składowane!",
-'continue-editing' => 'Dale wobdźěłać',
+'continue-editing' => 'K wobdźěłowanskemu polu',
 'previewconflict' => 'Tutón přehlad zwobraznja tekst w hornim tekstowym polu,  kaž so zjewi, jeli jón składuješ.',
 'session_fail_preview' => "'''Njemóžachmy twoju změnu předźěłać, dokelž su so posedźenske daty zhubili.'''
 Spytaj prošu hišće raz.
@@ -897,6 +897,15 @@ Zda so, zo je hîžo wušmórnjena.',
 'edit-already-exists' => 'Njebě móžno nowu stronu wutworić.
 Eksistuje hižo.',
 'defaultmessagetext' => 'Standardny tekst zdźělenki',
+'content-failed-to-parse' => 'Parsowanje wobsaha $2 za model $1 je so njeporadźiło: $3',
+'invalid-content-data' => 'Njepłaćiwe wobsahowe daty',
+'content-not-allowed-here' => 'Wobsah "$1" njeje na stronje [[$2]] dowoleny',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'luty tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Warnowanje: Tuta strona wobsahuje přewjele parserowych wołanjow.
@@ -1148,8 +1157,6 @@ Podrobnosće móžeš w [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'search-interwiki-caption' => 'Sotrowske projekty',
 'search-interwiki-default' => '$1 wuslědki:',
 'search-interwiki-more' => '(dalše)',
-'search-mwsuggest-enabled' => 'z namjetami',
-'search-mwsuggest-disabled' => 'žane namjety',
 'search-relatedarticle' => 'Přiwuzne',
 'mwsuggest-disable' => 'Namjety AJAX znjemóžnić',
 'searcheverything-enable' => 'We wšěch mjenowych rumach pytać',
@@ -1183,7 +1190,7 @@ Spytaj swoje naprašowanje z prefiksom ''all:'' wužiwać, zo by wšón wobsah (
 
 # Preferences page
 'preferences' => 'Nastajenja',
-'mypreferences' => 'nastajenja',
+'mypreferences' => 'Nastajenja',
 'prefs-edits' => 'Ličba změnow:',
 'prefsnologin' => 'Njepřizjewjeny',
 'prefsnologintext' => 'Dyrbiš <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} přizjewjeny]</span>  być, zo by móhł nastajenja postajić.',
@@ -1414,6 +1421,9 @@ Smě mjenje hač $1 {{PLURAL:$1|znamješko|znamješce|znamješka|znamješkow}} d
 'rightslogtext' => 'To je protokol změnow wužiwarskich prawow.',
 'rightslogentry' => 'změni skupinske čłonstwo za $1 z $2 do $3',
 'rightslogentry-autopromote' => 'je so awtomatisce wot $2 do $3 změnił',
+'logentry-rights-rights' => '$1 změni skupinske čłonstwo za $3 z $4 do $5',
+'logentry-rights-rights-legacy' => '$1 změni skupinske čłonstwo za $3',
+'logentry-rights-autopromote' => '$1 powyši so awtomatisce wot $4 do $5',
 'rightsnone' => '(ničo)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1653,6 +1663,7 @@ $1',
 'backend-fail-notsame' => 'Dataja, kotraž identiska njeje, hižo pola $1 eksistuje.',
 'backend-fail-invalidpath' => '$1 płaćiwy pućik za składowanje njeje.',
 'backend-fail-delete' => 'Dataja $1 njeda so zhašeć.',
+'backend-fail-describe' => 'Metadaty za dataju "$1" njedadźa so změnić.',
 'backend-fail-alreadyexists' => 'Dataja $1 hižo eksistuje.',
 'backend-fail-store' => 'Dataja $1 njeda so pod $2 składować',
 'backend-fail-copy' => 'Dataja $1 njeda so do $2 kopěrować',
@@ -1799,7 +1810,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ć.',
+'upload-disallowed-here' => 'Njemóžeš tutu dataju přepisać.',
 
 # File reversion
 'filerevert' => 'Wersiju $1 cofnyć',
@@ -2031,7 +2042,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: <code>$1</code> (prošu njepodaj je w swojim pytanje).',
+Podpěrowane protokole: <code>$1</code> (standard je http://, jeli žadyn protokol njeje podaty).',
 'linksearch-line' => '$1 je z $2 wotkazany.',
 'linksearch-error' => 'Zastupniske znamjenja dadźa so jenož na spočatku URL wužiwać.',
 
@@ -2079,7 +2090,7 @@ Podpěrowane protokole: <code>$1</code> (prošu njepodaj je w swojim pytanje).',
 '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ł.
+'emailpagetext' => 'Móžeš slědowacy formular wužiwać, zo by tutomu {{GENDER:$1|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ć.',
 'usermailererror' => 'E-mejlowy objekt je zmylk wróćił:',
 'defemailsubject' => '{{SITENAME}} - e-mejlka wot wužiwarja "$1"',
@@ -2111,7 +2122,7 @@ E-mejlowa adresa, kotruž sy w [[Special:Preferences|swojich wužiwarskich nasta
 
 # Watchlist
 'watchlist' => 'wobkedźbowanki',
-'mywatchlist' => 'wobkedźbowanki',
+'mywatchlist' => 'Wobkedźbowanki',
 'watchlistfor2' => 'Za wužiwarja $1 $2',
 'nowatchlist' => 'Nimaš žane strony w swojich wobkedźbowankach.',
 'watchlistanontext' => 'Dyrbiš so $1, zo by swoje wobkedźbowanki wobhladać abo wobdźěłać móhł.',
@@ -2149,20 +2160,24 @@ Jeli chceš stronu pozdźišo ze swojich wobkedźbowankow wotstronić, klikń na
 
 'enotif_mailer' => '{{SITENAME}} E-mejlowe zdźělenje',
 'enotif_reset' => 'Wšě strony jako wopytane woznamjenić',
-'enotif_newpagetext' => 'To je nowa strona.',
 'enotif_impersonal_salutation' => 'wužiwar {{GRAMMAR:genitiw|{{SITENAME}}}}',
-'changed' => 'změnjena',
-'created' => 'wutworjena',
-'enotif_subject' => '[{{SITENAME}}] Strona „$PAGETITLE” bu přez wužiwarja $PAGEEDITOR $CHANGEDORCREATED.',
+'enotif_subject_deleted' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} zhašała',
+'enotif_subject_created' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} wutworiła',
+'enotif_subject_moved' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} přesunyła',
+'enotif_subject_restored' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} wobnowiła',
+'enotif_subject_changed' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so wot {{GENDER:$2|$2}} změniła',
+'enotif_body_intro_deleted' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$1|$2}} zhašała, hlej $3 za aktualnu wersiju',
+'enotif_body_intro_created' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$2|$2}} wutworiła, hlej $3 za aktualnu wersiju',
+'enotif_body_intro_moved' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$2|$2}} přesunyła, hlej $3 za aktualnu wersiju',
+'enotif_body_intro_restored' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$2|$2}} wobnowiła, hlej $3 za aktualnu wersiju',
+'enotif_body_intro_changed' => 'Strona {{GRAMMAR:genitiw|{{SITENAME}}}} $1 je so na $PAGEEDITDATE wot {{GENDER:$2|$2}} změniła, hlej $3 za aktualnu wersiju',
 'enotif_lastvisited' => 'Hlej $1 za wšě změny po twojim poslednim wopyće.',
 'enotif_lastdiff' => 'Hlej $1 za tutu změnu.',
 'enotif_anon_editor' => 'anonymny wužiwar $1',
 'enotif_body' => 'Luby $WATCHINGUSERNAME,
 
+$PAGEINTRO $NEWPAGE
 
-Strona we {{GRAMMAR:lokatiw|{{SITENAME}}}} z mjenom $PAGETITLE bu dnja $PAGEEDITDATE wot $PAGEEDITOR $CHANGEDORCREATED, hlej $PAGETITLE_URL za aktualnu wersiju.
-
-$NEWPAGE
 
 Zjeće wobdźěłarja: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2173,7 +2188,7 @@ wiki: $PAGEEDITOR_WIKI
 Njebudu žane druhe zdźělenki w padźe dalšich změnow, chibazo wopytaš tutu stronu.
 Móžeš tež zdźělenske marki za wšě swoje wobkedźbowane strony we swojich wobkedźbowankach wróćo stajić.
 
-               Twój přećelny zdźělenski system {{GRAMMAR:genitiw|{{SITENAME}}}}
+Twój přećelny zdźělenski system {{GRAMMAR:genitiw|{{SITENAME}}}}
 
 --
 Zo by swoje nastajenja za e-mejlowe zdźělenja změnił, wopytaj
@@ -2329,7 +2344,8 @@ W tutym padźe dyrbiš najnowšu wušmórnjenu wersiju znjemóžnić abo pokaza
 'undeletedrevisions' => '$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} {{PLURAL:$1|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|wersija|wersiji|wersije|wersijow}} a $2 {{PLURAL:$2|dataja|dataji|dataje|datajow}} {{PLURAL:$2|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}',
 'undeletedfiles' => '$1 {{PLURAL:$1|dataja|dataji|dataje|datajow}} {{PLURAL:$1|wobnowjena|wobnowjenej|wobnowjene|wobnowjene}}.',
-'cannotundelete' => 'Wobnowjenje zwrěšćiło; něchtó druhi je stronu prjedy wobnowił.',
+'cannotundelete' => 'Wobnowjenje zwrěšćiło:
+$1',
 'undeletedpage' => "'''Strona $1 bu z wuspěchom wobnowjena.'''
 
 Hlej [[Special:Log/delete|protokol]] za lisćinu aktualnych wušmórnjenjow a wobnowjenjow.",
@@ -2360,9 +2376,9 @@ $1',
 'blanknamespace' => '(Nastawki)',
 
 # Contributions
-'contributions' => 'Přinoški wužiwarja',
+'contributions' => 'Přinoški {{GENDER:$1|wužiwarja|wužiwarki}}',
 'contributions-title' => 'Wužiwarske přinoški wot „$1“',
-'mycontris' => 'moje přinoški',
+'mycontris' => 'Přinoški',
 'contribsub2' => 'za wužiwarja $1 ($2)',
 'nocontribs' => 'Žane změny, kotrež podatym kriterijam wotpowěduja.',
 'uctop' => '(aktualnje)',
@@ -2402,7 +2418,7 @@ Najnowši zapisk w protokolu blokowanjow so deleka jako referenca podawa:',
 'whatlinkshere-hideredirs' => 'Daleposrědkowanja $1',
 'whatlinkshere-hidetrans' => 'Zapřijeća $1',
 'whatlinkshere-hidelinks' => 'Wotkazy $1',
-'whatlinkshere-hideimages' => 'wobrazowe wotkazy $1',
+'whatlinkshere-hideimages' => 'Datajowe wotkazy $1',
 'whatlinkshere-filters' => 'Filtry',
 
 # Block/unblock
@@ -2615,6 +2631,7 @@ Cilowa strona „[[:$1]]” hižo eksistuje. Chceš ju wušmórnyć, zo by so p
 'immobile-target-namespace-iw' => 'Interwiki-wotkaz njeje płaćiwy cil za přesunjenja stronow.',
 'immobile-source-page' => 'Strona njeda so přesunyć.',
 'immobile-target-page' => 'Njemóžno do teje ciloweje strony přesunyć.',
+'bad-target-model' => 'Požadany cil wužiwa druhi wobsahowy model. $1 njeda so do $2 konwertować.',
 'imagenocrossnamespace' => 'Wobraz njeda so do druheho mjenoweho ruma hač wobraz přesunyć',
 'nonfile-cannot-move-to-file' => 'Njedataje njedadźa so do datajoweho mjenoweho ruma přesunyć',
 'imagetypemismatch' => 'Nowa dataja swojemu typej njewotpowěduje',
@@ -2736,7 +2753,6 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 
 # JavaScriptTest
 'javascripttest' => 'JavaScriptowy test',
-'javascripttest-disabled' => 'Tuta funkcija njeje na tutym wikiju zmóžnjena.',
 'javascripttest-title' => 'Testy $1 so přewjedu',
 'javascripttest-pagetext-noframework' => 'Tuta strona je za přewjedźenje javascriptowych testow přewostajena.',
 'javascripttest-pagetext-unknownframework' => 'Njeznaty wobłuk "$1".',
@@ -2848,6 +2864,7 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 
 # Info page
 'pageinfo-title' => 'Informacije za stronu "$1"',
+'pageinfo-not-current' => 'Bohužel njedadźa so tute informacije za stare wersije podać.',
 'pageinfo-header-basic' => 'Zakładne informacije',
 'pageinfo-header-edits' => 'Stawizny wobdźěłać',
 'pageinfo-header-restrictions' => 'Škit strony',
@@ -2856,6 +2873,7 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'pageinfo-default-sort' => 'Standardny sortěrowanski kluč',
 'pageinfo-length' => 'Dołhosć strony (w bajtach)',
 'pageinfo-article-id' => 'ID strony',
+'pageinfo-language' => 'Rěč wobsaha strony',
 'pageinfo-robot-policy' => 'Status pytawy',
 'pageinfo-robot-index' => 'Indeksujomny',
 'pageinfo-robot-noindex' => 'Njeindeksujomny',
@@ -2873,10 +2891,17 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Informacije wo stronje',
+'pageinfo-redirectsto' => 'Sposrědkuje k',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage' => 'Liči so jako wobsahowa strona',
+'pageinfo-contentpage-yes' => 'Haj',
+'pageinfo-protect-cascading' => 'Kaskadowy škit wottud',
+'pageinfo-protect-cascading-yes' => 'Haj',
+'pageinfo-protect-cascading-from' => 'Kaskadowy škit wot',
 
 # Skin names
 'skinname-standard' => 'Klasiski',
@@ -2898,6 +2923,8 @@ W poslednim padźe móžeš tež wotkaz wužiwać, na př. „[[{{#Special:Expor
 'markedaspatrollederror' => 'Njemóžno jako přepruwowanu woznamjenić.',
 'markedaspatrollederrortext' => 'Dyrbiš wersiju podać, kotraž so ma jako přepruwowana woznamjenić.',
 'markedaspatrollederror-noautopatrol' => 'Njesměš swoje změny jako přepruwowane woznamjenjeć.',
+'markedaspatrollednotify' => 'Tuta změna do $1 je so jako dohladowana markěrowała.',
+'markedaspatrollederrornotify' => 'Markěrowanje jako dohladowane je so njeporadźiło.',
 
 # Patrol log
 'patrol-log-page' => 'Protokol přepruwowanjow',
@@ -2961,6 +2988,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 hodźinu|$1 hodźinomaj|$1 hodźinami|$1 hodźinami}}',
 'days' => '{{PLURAL:$1|$1 dnjom|$1 dnjomaj|$1 dnjemi|$1 dnjemi}}',
 'ago' => 'před $1',
+'just-now' => 'runje',
 
 # Bad image list
 'bad_image_list' => 'Format:
@@ -3445,6 +3473,7 @@ Tutón wobkrućenski kod spadnje $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Zapřijeće mjezyrěčnych wotkazow je znjemóžnjene]',
 'scarytranscludefailed' => '[Zapřijimanje předłohi za $1 je so njeporadźiło]',
+'scarytranscludefailed-httpstatus' => '[Wotwołanje předłohi za $1 je so njeporadźiło: HTTP $2]',
 'scarytranscludetoolong' => '[URL je předołhi]',
 
 # Delete conflict
@@ -3560,6 +3589,7 @@ Móžeš tež [[Special:EditWatchlist|standardnu wobdźěłowansku stronu]] wuž
 'version-license' => 'Licenca',
 'version-poweredby-credits' => "Tutón wiki so wot  '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2 podpěruje.",
 'version-poweredby-others' => 'druzy',
+'version-credits-summary' => 'Dźakujemy so slědowacym wosobam za jich přinoški k [[Special:Version|MediaWiki]]',
 'version-license-info' => 'MediaWiki je swobodna softwara: móžeš ju pod wuměnjenjemi licency GNU General Public License, wozjewjeneje wot załožby Free Software Foundation, rozdźělić a/abo změnić: pak pod wersiju 2 licency pak pod někajkej pozdźišej wersiju.
 
 MediaWiki so w nadźiji rozdźěla, zo budźe wužitny, ale BJEZ GARANTIJU: samo bjez wobsahowaneje garantije PŘEDAWAJOMNOSĆE abo PŘIHÓDNOSĆE ZA WĚSTY ZAMĚR. Hlej GNU general Public License za dalše podrobnosće.
@@ -3699,8 +3729,8 @@ Wobrazy so połnym rozeznaću pokazuja, druhe datajowe typy so ze zwjazanym prog
 'logentry-move-move_redir-noredirect' => '$1 přesuny stronu $3 do $4 přepisujo dalesposrědkowanje, bjeztoho zo by dalesposrědkowanje wutworił',
 'logentry-patrol-patrol' => '$1 markěrowaše wersiju $4 strony $3 jako skontrolowanu',
 'logentry-patrol-patrol-auto' => '$1 awtomatisce markěrowaše wersiju $4 strony $3 jako skontrolowanu',
-'logentry-newusers-newusers' => '$1 je wužiwarske konto załožił',
-'logentry-newusers-create' => '$1 je wužiwarske konto załožił',
+'logentry-newusers-newusers' => 'Wužiwarske konto $1 je so załožiło',
+'logentry-newusers-create' => 'Wužiwarske konto $1 je so załožiło',
 'logentry-newusers-create2' => '$1 załoži wužiwarske konto $3',
 'logentry-newusers-autocreate' => 'Konto $1 je so awtomatisce załožiło',
 'newuserlog-byemail' => 'Hesło z e-mejlku pósłane',
@@ -3721,6 +3751,10 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'feedback-bugcheck' => 'Wulkotnje! Skontroluj jenož, hač to jedyn z [$1 znatych zmylkow] njeje.',
 'feedback-bugnew' => 'Sym to skontrolował. Nowy zmylk zdźělić',
 
+# Search suggestions
+'searchsuggest-search' => 'Pytać',
+'searchsuggest-containing' => 'wobsahuje...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nimaš prawo dataje do tutoho wikija nahrać.',
 'api-error-badtoken' => 'Nutřkowny zmylk: Wopačny token.',
@@ -3773,4 +3807,6 @@ Hewak móžeš slědowacy jednory formular wužiwać. Twój komentar přida so s
 'duration-centuries' => '$1 {{PLURAL:$1|lětstotk|lětstotkaj|lětstotki|lětstotkow}}',
 'duration-millennia' => '$1 {{PLURAL:$1|lěttysac|lěttysacaj|lěttysacy|lěttysacow}}',
 
+# Unknown messages
+'svg-long-error' => 'Njepłaćiwa SVG-dataja: $1',
 );
index a2a5394..011dcfa 100644 (file)
@@ -107,7 +107,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'ChanjmanResan' ),
        'Recentchangeslinked'       => array( 'LyenChanjmanResan', 'ChanjmanAk' ),
        'Revisiondelete'            => array( 'RevizyonSiprime' ),
-       'RevisionMove'              => array( 'DeplaseRevizyon' ),
        'Search'                    => array( 'Chache', 'Fouye' ),
        'Shortpages'                => array( 'PajKout' ),
        'Specialpages'              => array( 'PajEspesyal' ),
@@ -285,7 +284,6 @@ $messages = array(
 'qbbrowse' => 'Bouske',
 'qbedit' => 'Modifye',
 'qbpageoptions' => 'Paj sa a',
-'qbpageinfo' => 'Kontèks',
 'qbmyoptions' => 'Paj mwen yo',
 'qbspecialpages' => 'Paj espesyal',
 'faq' => 'FAQ',
@@ -525,11 +523,8 @@ Rezon li bay yo se « ''$2'' ».",
 # Login and logout pages
 'logouttext' => "'''Ou dekonekte kounye a.'''
 
-Ou mèt kontinye itilize {{SITENAME}} san ou pa idantifye, oubyen ou ka [[Special:UserLogin|rekonekte]] w ankò ak menm non an oubyen yon lòt.
+Ou mèt kontinye itilize {{SITENAME}} san ou pa idantifye, oubyen ou ka <span class='plainlinks'>[$1 rekonekte]</span> w ankò ak menm non an oubyen yon lòt.
 Note ke kèk paj gendwa afiche tankou ou te toujou konekte tank ou pa efase kach nan navigatè ou.",
-'welcomecreation' => '== Byenvini, $1 ! ==
-
-Kont ou an kreye. Pa bliye pèsonalize l nan  [[Special:Preferences|preferans ou an sou paj sa {{SITENAME}}]].',
 'yourname' => 'Non itilizatè ou an :',
 'yourpassword' => 'Mopas ou an :',
 'yourpasswordagain' => 'Mete mopas ou an ankò :',
@@ -905,8 +900,6 @@ Lejand : ({{MediaWiki:Cur}}) = diferans ak vèsyon kounye a, ({{MediaWiki:Last}}
 'search-interwiki-caption' => 'Pwojè frè, ki ansanm oubyen ki ap deplwaye ansanm',
 'search-interwiki-default' => 'Rezilta yo pou $1 :',
 'search-interwiki-more' => '(plis)',
-'search-mwsuggest-enabled' => 'ak sijesyon, kèk lide',
-'search-mwsuggest-disabled' => 'san lide, san endikasyon',
 'nonefound' => "'''Remak''' : sèl kèk espas non chache nan sityasyon nòmal.
 Eseye mete prefiks ''all:'' devan tèm rechèche ou an pou chache nan tout kontni a (sa conprann paj diskisyon yo, modèl yo, etc.) oubyen itilize espas non ou ta renmen pou prefiks.",
 'powersearch' => 'Fouye fon',
index 5863d2f..985a67f 100644 (file)
@@ -136,7 +136,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Friss_változtatások' ),
        'Recentchangeslinked'       => array( 'Kapcsolódó_változtatások' ),
        'Revisiondelete'            => array( 'Változat_törlése' ),
-       'RevisionMove'              => array( 'Változat_áthelyezése' ),
        'Search'                    => array( 'Keresés' ),
        'Shortpages'                => array( 'Rövid_lapok' ),
        'Specialpages'              => array( 'Speciális_lapok' ),
@@ -360,7 +359,7 @@ $messages = array(
 
 'underline-always' => 'mindig',
 'underline-never' => 'soha',
-'underline-default' => 'a böngésző alapértelmezése szerint',
+'underline-default' => 'Felület és böngésző alapértelmezése szerint',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'A szerkesztőterület betűtípusa:',
@@ -446,7 +445,7 @@ $messages = array(
 'cancel' => 'Mégse',
 'moredotdotdot' => 'Tovább…',
 'mypage' => 'Lapom',
-'mytalk' => 'Vitalapom',
+'mytalk' => 'Vitalap',
 'anontalk' => 'Az IP-címhez tartozó vitalap',
 'navigation' => 'Navigáció',
 'and' => '&#32;és',
@@ -456,7 +455,6 @@ $messages = array(
 'qbbrowse' => 'Böngészés',
 'qbedit' => 'Szerkesztés',
 'qbpageoptions' => 'Lapbeállítások',
-'qbpageinfo' => 'Lapinformáció',
 'qbmyoptions' => 'Lapjaim',
 'qbspecialpages' => 'Speciális lapok',
 'faq' => 'GyIK',
@@ -469,7 +467,7 @@ $messages = array(
 'vector-action-protect' => 'Lapvédelem',
 'vector-action-undelete' => 'Visszaállítás',
 'vector-action-unprotect' => 'Védelem módosítása',
-'vector-simplesearch-preference' => 'Továbbfejlesztett keresési javaslatok engedélyezése (csak Vector felületen)',
+'vector-simplesearch-preference' => 'Egyszerűsített keresési sáv engedélyezése (csak Vector felületen)',
 'vector-view-create' => 'Létrehozás',
 'vector-view-edit' => 'Szerkesztés',
 'vector-view-history' => 'Laptörténet',
@@ -479,6 +477,7 @@ $messages = array(
 'namespaces' => 'Névterek',
 'variants' => 'Változók',
 
+'navigation-heading' => 'Navigációs menü',
 'errorpagetitle' => 'Hiba',
 'returnto' => 'Vissza a(z) $1 laphoz.',
 'tagline' => 'A {{SITENAME}} wikiből',
@@ -576,6 +575,7 @@ További információkat a [[Special:Version|verzióinformációs lapon]] talál
 'youhavenewmessages' => '$1 a vitalapodon! ($2 külön is megtekintheted.)',
 'newmessageslink' => 'új üzenet vár',
 'newmessagesdifflink' => 'az utolsó üzenetet',
+'youhavenewmessagesfromusers' => '$1 a vitalapodon {{PLURAL:$3|egy|$3}} szerkesztőtől! ($2 külön is megtekintheted.)',
 'youhavenewmessagesmanyusers' => '$1ed van több szerkesztőtől ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|Új üzenet vár|Új üzenetek várnak}}',
 'newmessagesdifflinkplural' => 'Az utolsó {{PLURAL:$1|változtatást|változtatásokat}}',
@@ -671,6 +671,8 @@ Jelezd ezt egy [[Special:ListUsers/sysop|adminiszttrátornak]] az URL megadásá
 'cannotdelete' => 'A(z) $1 lapot vagy fájlt nem lehet törölni.
 Talán már valaki más törölte.',
 'cannotdelete-title' => 'Nem lehet törölni a(z) „$1” lapot',
+'delete-hook-aborted' => 'A törlés meg lett szakítva egy hook által.
+Nem lett magyarázat csatolva.',
 'badtitle' => 'Hibás cím',
 'badtitletext' => 'A kért oldal címe érvénytelen, üres, vagy rosszul hivatkozott nyelvközi vagy wikiközi cím volt. Olyan karaktereket is tartalmazhatott, melyek a címekben nem használhatóak.',
 'perfcached' => "Az alábbi adatok gyorsítótárból (''cache''-ből) származnak, és ezért lehetséges, hogy nem a legfrissebb változatot mutatják. Legfeljebb {{PLURAL:$1|egy|$1 }} eredmény áll rendelkezésre a gyorsítótárban.",
@@ -713,11 +715,8 @@ A lezárást végrehajtó rendszergazda az alábbi indoklást adta meg: "$3".',
 # Login and logout pages
 'logouttext' => "'''Sikeresen kijelentkeztél.'''
 
-Folytathatod névtelenül  a(z) {{SITENAME}} használatát, vagy [[Special:UserLogin|ismét bejelentkezhetsz]] ugyanezzel, vagy egy másik névvel.
+Folytathatod névtelenül  a(z) {{SITENAME}} használatát, vagy <span class='plainlinks'>[$1 ismét bejelentkezhetsz]</span> ugyanezzel, vagy egy másik névvel.
 Lehetséges, hogy néhány oldalon továbbra is azt látod, be vagy jelentkezve, mindaddig, amíg nem üríted a böngésződ gyorsítótárát.",
-'welcomecreation' => '== Köszöntünk, $1! ==
-A felhasználói fiókodat létrehoztuk.
-Ne felejtsd el átnézni a [[Special:Preferences|személyes beállításaidat]].',
 'yourname' => 'Szerkesztőneved:',
 'yourpassword' => 'Jelszavad:',
 'yourpasswordagain' => 'Jelszavad ismét:',
@@ -1072,6 +1071,12 @@ Nem lett magyarázat csatolva.',
 Már létezik.',
 'defaultmessagetext' => 'Alapértelmezett szöveg',
 
+# Content models
+'content-model-wikitext' => 'wikiszöveg',
+'content-model-text' => 'egyszerű szöveg',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Figyelem: ezen a lapon túl sok erőforrásigényes elemzőfüggvény-hívás található.
 
@@ -1311,8 +1316,6 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
 'search-interwiki-caption' => 'Társlapok',
 'search-interwiki-default' => '$1 találat',
 'search-interwiki-more' => '(több)',
-'search-mwsuggest-enabled' => 'javaslatokkal',
-'search-mwsuggest-disabled' => 'javaslatok nélkül',
 'search-relatedarticle' => 'Kapcsolódó',
 'mwsuggest-disable' => 'AJAX-alapú keresési javaslatok letiltása',
 'searcheverything-enable' => 'Keresés az összes névtérben',
@@ -1345,7 +1348,7 @@ Győződj meg róla, hogy a laptörténet folytonossága megmarad.',
 
 # Preferences page
 'preferences' => 'Beállítások',
-'mypreferences' => 'Beállításaim',
+'mypreferences' => 'Beállítások',
 'prefs-edits' => 'Szerkesztéseid száma:',
 'prefsnologin' => 'Nem jelentkeztél be',
 'prefsnologintext' => 'Saját beállításaid elmentéséhez <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} be kell jelentkezned.] </span>',
@@ -1408,7 +1411,7 @@ Itt van egy véletlenszerűen generált érték, amit használhatsz: $1',
 'timezoneregion-indian' => 'Indiai-óceán',
 'timezoneregion-pacific' => 'Csendes-óceán',
 'allowemail' => 'E-mail engedélyezése más szerkesztőktől',
-'prefs-searchoptions' => 'A keresés beállításai',
+'prefs-searchoptions' => 'Keresés',
 'prefs-namespaces' => 'Névterek',
 'defaultns' => 'Egyébként a következő névterekben keressen:',
 'default' => 'alapértelmezett',
@@ -1533,6 +1536,7 @@ A műveletet nem lehet visszavonni.',
 'right-writeapi' => 'a szerkesztő-API használata',
 'right-delete' => 'lapok törlése',
 'right-bigdelete' => 'nagy történettel rendelkező fájlok törlése',
+'right-deletelogentry' => 'bizonyos napló bejegyzések törlése és visszaállítása',
 'right-deleterevision' => 'lapok adott változatainak törlése és helyreállítása',
 'right-deletedhistory' => 'törölt lapváltozatok megtekintése, a szövegük nélkül',
 'right-deletedtext' => 'törölt változatok szövegének és a változatok közötti eltérés megtekintése',
@@ -1616,7 +1620,7 @@ A műveletet nem lehet visszavonni.',
 # Recent changes
 'nchanges' => '{{PLURAL:$1|egy|$1}} változtatás',
 'recentchanges' => 'Friss változtatások',
-'recentchanges-legend' => 'A friss változások beállításai',
+'recentchanges-legend' => 'A friss változtatások beállításai',
 'recentchanges-summary' => 'Ezen a lapon a wikiben történt legutóbbi fejleményeket lehet nyomon követni.',
 'recentchanges-feed-description' => 'Kövesd a wiki friss változtatásait ezzel a hírcsatornával.',
 'recentchanges-label-newpage' => 'Ezzel a szerkesztéssel egy új lap jött létre',
@@ -1624,8 +1628,8 @@ A műveletet nem lehet visszavonni.',
 'recentchanges-label-bot' => 'Ezt a szerkesztést egy bot hajtotta végre',
 'recentchanges-label-unpatrolled' => 'Ezt a szerkesztést még nem ellenőrizték',
 'rcnote' => "Alább az utolsó '''{{PLURAL:$2|egy|$2}}''' nap utolsó '''{{PLURAL:$1|egy|$1}}''' változtatása látható. A lap generálásának időpontja $4, $5.",
-'rcnotefrom' => 'Alább a <b>$2</b> óta történt változások láthatóak (<b>$1</b> db).',
-'rclistfrom' => '$1 után történt változások megtekintése',
+'rcnotefrom' => 'Alább a <b>$2</b> óta történt változtatások láthatóak (<b>$1</b> db).',
+'rclistfrom' => '$1 után történt változtatások megtekintése',
 'rcshowhideminor' => 'apró szerkesztések $1',
 'rcshowhidebots' => 'botok szerkesztéseinek $1',
 'rcshowhideliu' => 'bejelentkezett felhasználók szerkesztéseinek $1',
@@ -1654,7 +1658,7 @@ A műveletet nem lehet visszavonni.',
 'recentchangeslinked-feed' => 'Kapcsolódó változtatások',
 'recentchangeslinked-toolbox' => 'Kapcsolódó változtatások',
 'recentchangeslinked-title' => 'A(z) $1 laphoz kapcsolódó változtatások',
-'recentchangeslinked-noresult' => 'A megadott időtartam alatt nem történt változás a kapcsolódó lapokon.',
+'recentchangeslinked-noresult' => 'A megadott időtartam alatt nem történt változtatás a kapcsolódó lapokon.',
 'recentchangeslinked-summary' => "Alább azon lapoknak a legutóbbi változtatásai láthatóak, amelyekre hivatkozik egy megadott lap (vagy tagjai a megadott kategóriának).
 A [[Special:Watchlist|figyelőlistádon]] szereplő lapok '''félkövérrel''' vannak jelölve.",
 'recentchangeslinked-page' => 'Lap neve:',
@@ -1950,6 +1954,7 @@ A [$2 fájl ottani leírólapjának] másolata alább látható.',
 'shared-repo-from' => 'a(z) $1 megosztott tárhelyről',
 'shared-repo' => 'megosztott tárhely',
 'filepage.css' => '/* Az itt elhelyezett CSS a fájl leíró lapra kerül beillesztésre, a külföldi nyelvű kliens wikikbe is*/',
+'upload-disallowed-here' => 'Ezt a fájlt nem lehet felülírni.',
 
 # File reversion
 'filerevert' => '$1 visszaállítása',
@@ -2057,6 +2062,7 @@ Az <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.',
 # Miscellaneous special pages
 'nbytes' => '{{PLURAL:$1|egy|$1}} bájt',
 'ncategories' => '{{PLURAL:$1|egy|$1}} kategória',
+'ninterwikis' => '{{PLURAL:$1|egy|$1}} interwiki',
 'nlinks' => '{{PLURAL:$1|egy|$1}} hivatkozás',
 'nmembers' => '{{PLURAL:$1|egy|$1}} elem',
 'nrevisions' => '{{PLURAL:$1|egy|$1}} változat',
@@ -2085,6 +2091,7 @@ Az <del>áthúzott</del> sorok a lista elkészülése óta javítva lettek.',
 'mostlinkedtemplates' => 'Legtöbbet hivatkozott sablonok',
 'mostcategories' => 'Legtöbb kategóriába tartozó lapok',
 'mostimages' => 'Legtöbbet hivatkozott fájlok',
+'mostinterwikis' => 'Legtöbb interwikit tartalmazó lapok',
 'mostrevisions' => 'Legtöbbet szerkesztett lapok',
 'prefixindex' => 'Keresés előtag szerint',
 'prefixindex-namespace' => 'Összes lap adott előtaggal ($1 névtér)',
@@ -2184,7 +2191,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: <code>$1</code> (ezeket ne írd be a keresésbe).',
+Támogatott protokollok: <code>$1</code> (http:// az alapértelmezett, ha nincs protokoll megadva).',
 'linksearch-line' => '$1 hivatkozva innen: $2',
 'linksearch-error' => 'Helyettesítő karakterek csak a cím elején szerepelhetnek.',
 
@@ -2230,9 +2237,11 @@ Az egyes csoportokról további információt [[{{MediaWiki:Listgrouprights-help
 'mailnologin' => 'Nincs feladó',
 'mailnologintext' => 'Ahhoz hogy másoknak e-mailt küldhess, [[Special:UserLogin|be kell jelentkezned]] és meg kell adnod egy érvényes e-mail címet a [[Special:Preferences|beállításaidban]].',
 'emailuser' => 'E-mail küldése ezen szerkesztőnek',
+'emailuser-title-target' => 'E-mail küldése ennek a felhasználónak: $1',
+'emailuser-title-notarget' => 'E-mail küldése a felhasználónak',
 'emailpage' => 'E-mail küldése',
 'emailpagetext' => 'A szerkesztő e-mail-címére ezen űrlap kitöltésével üzenetet tudsz küldeni.
-Feladóként a [[Special:Preferences|beállításaid]]nál megadott e-mail-címed fog szerepelni, így a címzett közvetlenül neked tud majd válaszolni.',
+Feladóként a [[Special:Preferences|beállításaid]]nál megadott e-mail-címed fog szerepelni, így a címzett közvetlenül tud majd válaszolni neked.',
 'usermailererror' => 'A levélküldő objektum hibával tért vissza:',
 'defemailsubject' => '{{SITENAME}} e-mail a következő felhasználótól: „$1”',
 'usermaildisabled' => 'Email fogadás letiltva',
@@ -2263,7 +2272,7 @@ Feladóként a [[Special:Preferences|beállításaid]]nál megadott e-mail-címe
 
 # Watchlist
 'watchlist' => 'Figyelőlistám',
-'mywatchlist' => 'Figyelőlistám',
+'mywatchlist' => 'Figyelőlista',
 'watchlistfor2' => '$1 részére $2',
 'nowatchlist' => 'Nincs lap a figyelőlistádon.',
 'watchlistanontext' => 'A figyelőlistád megtekintéséhez és szerkesztéséhez $1.',
@@ -2299,11 +2308,7 @@ Ezután minden, a lapon vagy annak vitalapján történő változást ott fogsz
 
 'enotif_mailer' => '{{SITENAME}} Értesítéspostázó',
 'enotif_reset' => 'Az összes lap megjelölése felkeresettként',
-'enotif_newpagetext' => 'Ez egy új lap.',
 'enotif_impersonal_salutation' => '{{SITENAME}} felhasználó',
-'changed' => 'megváltoztatta',
-'created' => 'létrehozta',
-'enotif_subject' => 'A(z) {{SITENAME}} $PAGETITLE című oldalát $CHANGEDORCREATED $PAGEEDITOR',
 'enotif_lastvisited' => 'Lásd a $1 lapot az utolsó látogatásod óta történt változtatásokért.',
 'enotif_lastdiff' => 'Lásd a $1 lapot ezen változtatás megtekintéséhez.',
 'enotif_anon_editor' => '$1 névtelen felhasználó',
@@ -2491,7 +2496,7 @@ változatot visszaállították vagy eltávolították az archívumból.',
 'undeletedrevisions' => '{{PLURAL:$1|egy|$1}} változat helyreállítva',
 'undeletedrevisions-files' => '{{PLURAL:$1|egy|$1}} változat és {{PLURAL:$2|egy|$2}} fájl visszaállítva',
 'undeletedfiles' => '{{PLURAL:$1|egy|$1}} fájl visszaállítva',
-'cannotundelete' => 'Nem lehet a lapot visszaállítani; lehet, hogy azt már valaki visszaállította.',
+'cannotundelete' => 'Lap visszaállítása sikertelen: $1',
 'undeletedpage' => "'''$1 helyreállítva'''
 
 Lásd a [[Special:Log/delete|törlési naplót]] a legutóbbi törlések és helyreállítások listájához.",
@@ -2522,9 +2527,9 @@ $1',
 'blanknamespace' => '(Fő)',
 
 # Contributions
-'contributions' => 'Szerkesztő közreműködései',
+'contributions' => '{{GENDER:$1|Szerkesztő}} közreműködései',
 'contributions-title' => '$1 közreműködései',
-'mycontris' => 'Közreműködéseim',
+'mycontris' => 'Közreműködések',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Nem található a feltételeknek megfelelő változtatás.',
 'uctop' => ' (utolsó)',
@@ -2564,7 +2569,7 @@ A blokknapló legutóbbi ide vonatkozó bejegyzése a következő:',
 'whatlinkshere-hideredirs' => 'átirányítások $1',
 'whatlinkshere-hidetrans' => 'beillesztések $1',
 'whatlinkshere-hidelinks' => 'linkek $1',
-'whatlinkshere-hideimages' => 'képhivatkozás $1',
+'whatlinkshere-hideimages' => 'fájlhivatkozások $1',
 'whatlinkshere-filters' => 'Elemek szűrése',
 
 # Block/unblock
@@ -2874,6 +2879,7 @@ Valamennyi transwiki importálási művelet az [[Special:Log/import|importálás
 'import-interwiki-templates' => 'Az összes sablon hozzáadása',
 'import-interwiki-submit' => 'Importálás',
 'import-interwiki-namespace' => 'Célnévtér:',
+'import-interwiki-rootpage' => 'Cél gyökér lap (opcionális):',
 'import-upload-filename' => 'Fájlnév:',
 'import-comment' => 'Megjegyzés:',
 'importtext' => 'Exportáld a fájlt a forráswikiből az [[Special:Export|exportáló eszköz]] segítségével.
@@ -2906,6 +2912,9 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
 'import-error-interwiki' => '„$1” lap nem került importálásra, mert a név külső hivatkozásokra van fenntartva (interwiki).',
 'import-error-special' => '„$1” lap nem került importálásra, mert olyan speciális névtérbe tartozik, amelyen nem engedélyezettek a lapok.',
 'import-error-invalid' => '„$1” lap nem került importálásra, mert a neve nem érvényes.',
+'import-options-wrong' => 'Rossz {{PLURAL:$2|opció|opciók}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'A megadott gyökér oldal címe érvénytelen.',
+'import-rootpage-nosubpage' => 'A(z) "$1" névtér nem engedi meg aloldalak használatát.',
 
 # Import log
 'importlogpage' => 'Importnapló',
@@ -2917,7 +2926,6 @@ Mentsd el a számítógépedre, majd töltsd fel ide.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript tesztelés',
-'javascripttest-disabled' => 'Ez a funkció nincs engedélyezve ebben a wikiben.',
 'javascripttest-title' => '$1 tesztek futtatása',
 'javascripttest-pagetext-noframework' => 'Ez az oldal JavaStript tesztek futtatására van fenntartva.',
 'javascripttest-pagetext-unknownframework' => 'Ismeretlen teszt keretrendszer: $1.',
@@ -3056,11 +3064,40 @@ 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-basic' => 'Alapinformációk',
 'pageinfo-header-edits' => 'Szerkesztések története',
+'pageinfo-header-restrictions' => 'Lapvédelem',
+'pageinfo-header-properties' => 'Lap tulajdonságok',
+'pageinfo-display-title' => 'Megjelenített cím',
+'pageinfo-default-sort' => 'Alapértelmezett rendezési kulcs',
+'pageinfo-length' => 'Lap hossza (bájtokban)',
+'pageinfo-article-id' => 'Lapazonosító',
+'pageinfo-language' => 'Laptartalom nyelve',
+'pageinfo-robot-policy' => 'Kereső motor státusz',
+'pageinfo-robot-index' => 'Indexelhető',
+'pageinfo-robot-noindex' => 'Nem indexelhető',
 'pageinfo-views' => 'Megtekintések száma',
 'pageinfo-watchers' => 'Figyelők száma',
+'pageinfo-redirects-name' => 'Átirányítások erre a lapra',
+'pageinfo-subpages-name' => 'Az lap allapjai',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|átirányítás}}; $3 {{PLURAL:$3|nem átirányítás}})',
+'pageinfo-firstuser' => 'Lap létrehozója',
+'pageinfo-firsttime' => 'A lap létrehozás ideje',
+'pageinfo-lastuser' => 'Utolsó szerkesztő',
+'pageinfo-lasttime' => 'Az utolsó szerkesztés ideje',
 'pageinfo-edits' => 'Szerkesztések teljes száma',
 'pageinfo-authors' => 'Egyedi szerkesztők teljes száma',
+'pageinfo-recent-edits' => 'Friss változtatások száma (elmúlt $1 alatt)',
+'pageinfo-recent-authors' => 'Friss változtatások szerkesztőinek száma',
+'pageinfo-magic-words' => 'Varázs{{PLURAL:$1|szó|szavak}} ($1)',
+'pageinfo-hidden-categories' => 'Rejtett {{PLURAL:$1|kategória|kategóriák}} ($1)',
+'pageinfo-templates' => 'Felhasznált {{PLURAL:$1|sablon|sablonok}} ($1)',
+'pageinfo-toolboxlink' => 'Lapinformációk',
+'pageinfo-redirectsto' => 'Átirányítás ide',
+'pageinfo-redirectsto-info' => 'infó',
+'pageinfo-contentpage' => 'Tartalmi lapnak számít',
+'pageinfo-contentpage-yes' => 'Igen',
+'pageinfo-protect-cascading-yes' => 'Igen',
 
 # Skin names
 'skinname-standard' => 'Klasszikus',
@@ -3082,6 +3119,8 @@ Ez valószínűleg egy olyan link miatt van, ami egy feketelistán lévő oldalr
 'markedaspatrollederror' => 'Nem lehet ellenőrzöttnek jelölni',
 'markedaspatrollederrortext' => 'Meg kell adnod egy ellenőrzöttként megjelölt változatot.',
 'markedaspatrollederror-noautopatrol' => 'A saját változtatásaid megjelölése ellenőrzöttként nem engedélyezett.',
+'markedaspatrollednotify' => '$1 változtatása ellenőrzöttnek lett jelölve.',
+'markedaspatrollederrornotify' => 'Nem sikerült ellenőrzöttnek jelölni.',
 
 # Patrol log
 'patrol-log-page' => 'Ellenőrzési napló (patrol)',
@@ -3114,6 +3153,7 @@ A futtatása során kárt tehet a számítógépedben.",
 'file-info-size-pages' => '$1 × $2 képpont, fájlméret: $3, MIME típus: $4, $5 oldal',
 'file-nohires' => 'Nem érhető el nagyobb felbontású változat.',
 'svg-long-desc' => 'SVG fájl, névlegesen $1 × $2 képpont, fájlméret: $3',
+'svg-long-desc-animated' => 'Animált SVG fájl, névlegesen $1 × $2 képpont, fájlméret: $3',
 'show-big-image' => 'A kép nagyfelbontású változata',
 'show-big-image-preview' => 'Az előnézet mérete: $1',
 'show-big-image-other' => 'További {{PLURAL:$2|felbontás|felbontások}}: $1.',
@@ -3123,6 +3163,8 @@ A futtatása során kárt tehet a számítógépedben.",
 'file-info-png-looped' => 'ismétlődik',
 'file-info-png-repeat' => 'lejátszva {{PLURAL:$1|egy|$1}} alkalommal',
 'file-info-png-frames' => '{{PLURAL:$1|egy|$1}} képkocka',
+'file-no-thumb-animation' => "'''Megjegyzés: technikai korlátok miatt a fájl bélyegképe nem lesz animált.'''",
+'file-no-thumb-animation-gif' => "'''Megjegyzés: technikai korlátok miatt a nagy felbontású GIF képekből készített bélyegkép nem lesz animált.'''",
 
 # Special:NewFiles
 'newimages' => 'Új fájlok galériája',
@@ -3142,6 +3184,7 @@ A futtatása során kárt tehet a számítógépedben.",
 'hours' => '{{PLURAL:$1|egy|$1}} órával',
 'days' => '{{PLURAL:$1|egy|$1}} nappal',
 'ago' => '$1 ezelőtt',
+'just-now' => 'épp most',
 
 # Bad image list
 'bad_image_list' => 'A formátum a következő:
@@ -3886,9 +3929,9 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'logentry-move-move_redir-noredirect' => '$1 átnevezte a(z) $3 lapot $4 lapra az átirányítást felülírva, átirányítás nélkül',
 'logentry-patrol-patrol' => '$1 a(z) $3 lap $4 változatát ellenőrzöttnek jelölte',
 'logentry-patrol-patrol-auto' => '$1 a(z) $3 lap $4 változatát automatikusan ellenőrzöttnek jelölte',
-'logentry-newusers-newusers' => '$1 létrehozott egy felhasználói fiókot',
-'logentry-newusers-create' => '$1 létrehozott egy felhasználói fiókot',
-'logentry-newusers-create2' => '$1 létrehozott egy felhasználói fiókot $3',
+'logentry-newusers-newusers' => '$1 felhasználói fiók létrehozva',
+'logentry-newusers-create' => '$1 felhasználói fiók létrehozva',
+'logentry-newusers-create2' => '$1 létrehozta $3 felhasználói fiókját',
 'logentry-newusers-autocreate' => '$1 fiók automatikusan létrehozva',
 'newuserlog-byemail' => 'a jelszót kiküldtük a megadott e-mail címre',
 
@@ -3907,6 +3950,10 @@ A képek teljes méretben jelennek meg, más fájltípusok közvetlenül a hozz
 'feedback-bugcheck' => 'Nagyszerű! Ellenőrizd, hogy ez nem egy [$1 ismert hiba].',
 'feedback-bugnew' => 'Ellenőriztem. Új hiba jelentése',
 
+# Search suggestions
+'searchsuggest-search' => 'Keresés',
+'searchsuggest-containing' => 'tartalmazza…',
+
 # API errors
 'api-error-badaccess-groups' => 'Nincs jogod fájlokat feltölteni erre a wikire.',
 'api-error-badtoken' => 'Belső hiba: hibás token.',
index abaa5fe..4982e77 100644 (file)
@@ -14,6 +14,7 @@
  * @author Teak
  * @author Togaed
  * @author Vacio
+ * @author Vadgt
  * @author Xelgen
  * @author Համլետ
  * @author לערי ריינהארט
@@ -279,7 +280,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Թաքցնել պարեկված խմբագրումները վերջին փոփոխությունների ցանկից',
 'tog-newpageshidepatrolled' => 'Թաքցնել պարեկված էջերը նոր էջերի ցանկից',
 'tog-extendwatchlist' => 'Ընդարձակել հսկացանկը՝ ցույց տալով բոլոր փոփոխությունները, այլ ոչ միայն վերջինները',
-'tog-usenewrc' => 'Օգտագործել վերջին փոփոխությունների լավացված ցանկ (պահանջում է JavaScript)',
+'tog-usenewrc' => 'Խմբավորել փոփոխությունները Վերջին փոփոխություններում և հսկացանկում (պահանջում է JavaScript)',
 'tog-numberheadings' => 'Ինքնաթվագրել վերնագրերը',
 'tog-showtoolbar' => 'Ցույց տալ խմբագրումների գործիքների վահանակը (JavaScript)',
 'tog-editondblclick' => 'Խմբագրել էջերը կրկնակի մատնահարմամբ (JavaScript)',
@@ -287,9 +288,9 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Խմբագրել բաժինները վերնագրի աջ մատնահարմամբ (JavaScript)',
 'tog-showtoc' => 'Ցույց տալ բովանդակությունը (3  կամ ավել վերնագրեր ունեցող էջերի համար)',
 'tog-rememberpassword' => 'Հիշել իմ մուտքագրված տվյալներն այս համակարգչում ($1 {{PLURAL:$1|օրից}} ոչ ավել ժամկետով)',
-'tog-watchcreations' => 'Ավելացնել իմ ստեղծած էջերը հսկացանկին',
-'tog-watchdefault' => 'Ավելացնել իմ խմբագրած էջերը հսկացանկին',
-'tog-watchmoves' => 'Ավելացնել իմ վերնավանած էջերը հսկացանկին',
+'tog-watchcreations' => 'Ավելացնել իմ ստեղծած էջերը և բեռնած նիշքերը հսկացանկին',
+'tog-watchdefault' => 'Ավելացնել իմ խմբագրած էջերը և նիշքերը հսկացանկին',
+'tog-watchmoves' => 'Ավելացնել իմ վերնավանած էջերը և նիշքերը հսկացանկին',
 'tog-watchdeletion' => 'Ավելացնել իմ ջնջած էջերը հսկացանկին',
 'tog-minordefault' => 'Նշել խմբագրումները որպես չնչին ըստ լռության',
 'tog-previewontop' => 'Ցույց տալ նախադիտումը խմբագրման դաշտից առաջ',
@@ -406,7 +407,7 @@ $messages = array(
 'cancel' => 'Բեկանել',
 'moredotdotdot' => 'Ավելին...',
 'mypage' => 'Իմ էջը',
-'mytalk' => 'Իմ քննարկումները',
+'mytalk' => 'Քննարկում',
 'anontalk' => 'Քննարկում այս IP-հասցեի համար',
 'navigation' => 'Շրջել կայքում',
 'and' => '&#32;և',
@@ -416,7 +417,6 @@ $messages = array(
 'qbbrowse' => 'Թերթել',
 'qbedit' => 'Խմբագրել',
 'qbpageoptions' => 'Այս էջը',
-'qbpageinfo' => 'Հոդվածի մասին',
 'qbmyoptions' => 'Իմ էջերը',
 'qbspecialpages' => 'Սպասարկող էջեր',
 'faq' => 'ՀՏՀ',
@@ -438,9 +438,10 @@ $messages = array(
 'namespaces' => 'Անվանատարածքներ',
 'variants' => 'Տարբերակներ',
 
+'navigation-heading' => 'Նավիգացիոն ցանկ',
 'errorpagetitle' => 'Սխալ',
 'returnto' => 'Վերադառնալ $1։',
-'tagline' => '{{SITENAME}}յից՝ ազատ հանրագիտարանից',
+'tagline' => '{{SITENAME}}յից',
 'help' => 'Օգնություն',
 'search' => 'Որոնում',
 'searchbutton' => 'Որոնել',
@@ -501,7 +502,7 @@ $1',
 'pool-errorunknown' => 'Անհայտ սխալ',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite' => '{{grammar:genitive|{{SITENAME}}}} մասին',
+'aboutsite' => '{{grammar:genitive|{{SITENAME}}}}ի մասին',
 'aboutpage' => 'Project:Էությունը',
 'copyright' => 'Կայքի բովանդակությունը գտնվում է «$1» արտոնագրի տակ։',
 'copyrightpage' => '{{ns:project}}:Հեղինակային իրավունքներ',
@@ -527,11 +528,11 @@ $1',
 'versionrequired' => 'Պահանջվում է ՄեդիաՎիքի ծրագրի $1 տարբերակը',
 'versionrequiredtext' => 'Այս էջի օգտագործման համար պահանջվում է ՄեդիաՎիքի ծրագրի $1 տարբերակը։ Տես [[Special:Version|տարբերակի էջը]]։',
 
-'ok' => 'OK',
+'ok' => 'Լավ',
 'pagetitle' => '$1 — {{SITENAME}}',
 'retrievedfrom' => 'Ստացված է «$1» էջից',
 'youhavenewmessages' => 'Դուք ունեք $1 ($2)։',
-'newmessageslink' => 'Õ¶Õ¸Ö\80 Õ¸Ö\82Õ²Õ¥Ö\80Õ±Õ¶Õ¥Ö\80',
+'newmessageslink' => 'Õ\86Õ¸Ö\80 Õ°Õ¡Õ²Õ¸Ö\80Õ¤Õ¡Õ£Ö\80Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶',
 'newmessagesdifflink' => 'վերջին փոփոխությունը',
 'newmessageslinkplural' => '{{PLURAL:$1|նոր հաղորդագրություն|նոր հաղորդագրություններ}}',
 'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|փոփոխում|փոփոխումներ}}',
@@ -568,7 +569,7 @@ $1',
 'nstab-special' => 'Սպասարկող էջ',
 'nstab-project' => 'Նախագծի էջ',
 'nstab-image' => 'Նիշք',
-'nstab-mediawiki' => 'Õ\88Ö\82Õ²Õ¥Ö\80Õ±',
+'nstab-mediawiki' => 'Õ\80Õ¡Õ²Õ¸Ö\80Õ¤Õ¡Õ£Ö\80Õ¸Ö\82Õ©ÕµÕ¸Ö\82Õ¶',
 'nstab-template' => 'Կաղապար',
 'nstab-help' => 'Օգնության էջ',
 'nstab-category' => 'Կատեգորիա',
@@ -630,7 +631,7 @@ $1',
 'cannotdelete-title' => 'Հնարավոր չէ ջնջել $1 էջը',
 'badtitle' => 'Անընդունելի անվանում',
 'badtitletext' => 'Հարցված էջի անվանումը անընդունելի է, դատարկ է կամ սխալ միջ-լեզվական կամ ինտերվիքի անվանում է։ Հնարավոր է, որ այն պարունակում է անթույլատրելի սիմվոլներ։',
-'perfcached' => 'Հետևյալ տվյալները վերցված են քեշից և հնարավոր է չարտացոլեն վերջին փոփոխությունները։ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'perfcached' => 'Հետևյալ տվյալները վերցված են քեշից և հնարավոր է չարտացոլեն վերջին փոփոխությունները։ Առավելագույն {{PLURAL:$1|արդյունք|$1 արդյունք}} է հասանելի քեշում։',
 'perfcachedts' => 'Հետևյալ տվյալները վերցված են քեշից և վերջին անգամ թարմացվել են $1։ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
 'querypage-no-updates' => 'Այս էջի փոփոխությունները ներկայումս արգելված են։ Այստեղի տվյալները այժմ չեն թարմացվի։',
 'wrong_wfQuery_params' => 'Անթույլատրելի պարամետրեր wfQuery() ֆունկցիայի համար<br />
@@ -650,9 +651,13 @@ $1',
 'cascadeprotected' => 'Այս էջը պաշտպանված է խմբագրումից, քանի որ ընդգրկված է հետևյալ {{PLURAL:$1|էջի|էջերի}} տեքստում, {{PLURAL:$1|որը|որոնք}} պաշտպանվել {{PLURAL:$1|է|են}} կասկադային հնարավորությամբ.
 $2',
 'namespaceprotected' => 'Դուք չունեք «$1» անվանատարածքի էջերի խմբագրման իրավունք։',
+'customcssprotected' => 'Դուք չեք կարող խմբագրել այս CSS էջը, քանի որ այն պարունակում է այլ մասնակցի անձնական նախընտրանքներ։',
+'customjsprotected' => 'Դուք չեք կարող խմբագրել այս ՋավաՍկրիպտ էջը, քանի որ այն պարունակում է այլ մասնակցի անձնական նախընտրանքներ։',
 'ns-specialprotected' => '«{{ns:special}}» անվանատարածքի էջերը չեն կարող խմբագրվել։',
 'titleprotected' => "Այս անվանմամբ էջի ստեղծումը արգելվել է [[User:$1|$1]] մասնակցի կողմից։
 Տրված պատճառն է՝ ''$2''։",
+'exception-nologin' => 'Չեք մտել համակարգ',
+'exception-nologin-text' => 'Այս էջը դիտելու կամ գործողություն կատարելու համար դուք պետք է մուտք գործեք այս վիքի։',
 
 # Virus scanner
 'virus-badscanner' => "Սխալ կարգավորւմ։ Անծանոթ վիրուսների զննիչ. ''$1''",
@@ -662,27 +667,28 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Դուք դուրս եկաք համակարգից։'''
 
-Դուք կարող եք շարունակել օգտագործել {{SITENAME}} կայքը անանուն, կամ [[Special:UserLogin|կրկին մուտք գործել համակարգ]] նույն կամ մեկ այլ մասնակցի անվամբ։ Ի նկատի ունեցեք, որ որոշ էջեր կարող են ցուցադրվել այնպես՝ ինչպես եթե դեռ համակարգում լինեիք մինչև որ չջնջեք ձեր զննարկիչի հիշապահեստը։",
-'welcomecreation' => '== Բարի՛ գալուստ, $1 ==
-Ձեր հաշիվը ստեղծված է։
-Չմոռանաք անձնավորել ձեր [[Special:Preferences|նախընտրությունները]]։',
+Դուք կարող եք շարունակել օգտագործել {{SITENAME}} կայքը անանուն, կամ <span class='plainlinks'>[$1 կրկին մուտք գործել համակարգ]</span> նույն կամ մեկ այլ մասնակցի անվամբ։ Ի նկատի ունեցեք, որ որոշ էջեր կարող են ցուցադրվել այնպես՝ ինչպես եթե դեռ համակարգում լինեիք մինչև որ չջնջեք ձեր զննարկիչի հիշապահեստը։",
+'welcomeuser' => 'Բարի գալո՜ւստ, $1',
+'welcomecreation-msg' => 'Ձեր հաշիվն ստեղծված է։
+Չմոռանաք փոփոխել ձեր [[Special:Preferences|նախընտրությունները]]։',
 'yourname' => 'Մասնակցի անուն.',
 'yourpassword' => 'Գաղտնաբառ.',
 'yourpasswordagain' => 'Կրկնեք գաղտնաբառը.',
 'remembermypassword' => 'Հիշել իմ մուտքագրված տվյալները այս համակարգչում ($1 {{PLURAL:$1|օրից|օրից}} ոչ ավել ժամկետով)',
 'yourdomainname' => 'Ձեր դոմենը.',
+'password-change-forbidden' => 'Այս վիքիում չեք կարող փոխել գաղտնաբառ։',
 'externaldberror' => 'Տեղի է ունեցել վավերացման արտաքին տվյալների բազայի սխալ, կամ դուք չունեք բավարար իրավունքներ ձեր արտաքին հաշվի փոփոխման համար։',
-'login' => 'Մտնել',
+'login' => 'Մտնել համակարգ',
 'nav-login-createaccount' => 'Մտնել / Գրանցվել',
 'loginprompt' => '{{SITENAME}} մուտք գործելու համար հարկավոր է քուքիները թույլատրել։',
 'userlogin' => 'Մտնել / Գրանցվել',
 'userloginnocreate' => 'Մտնել',
-'logout' => 'ÔµÕ¬Õ¶Õ¥Õ¬',
+'logout' => 'Ô´Õ¸Ö\82Ö\80Õ½ Õ£Õ¡Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö\80Õ£Õ«Ö\81',
 'userlogout' => 'Ելնել',
 'notloggedin' => 'Դուք չեք մտել համակարգ',
 'nologin' => "Դեռևս չե՞ք գրանցվել։ '''$1'''։",
 'nologinlink' => 'Ստեղծեք մասնակցային հաշիվ',
-'createaccount' => 'Õ\8dÕ¿Õ¥Õ²Õ®Õ¥Õ¬ Õ¶Õ¸Ö\80 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ·Õ«Õ¾',
+'createaccount' => 'Ստեղծել նոր հաշիվ',
 'gotaccount' => "Դուք արդեն գրանցվա՞ծ եք։ '''$1'''։",
 'gotaccountlink' => 'Մուտք գործեք համակարգ',
 'userlogin-resetlink' => 'Մոռացե՞լ եք Ձեր լոգին տվյալները։',
@@ -694,6 +700,8 @@ $2',
 'createaccounterror' => 'Չհաջողվեց ստեղծել մասնակցային հաշիվ. $1',
 'nocookiesnew' => 'Մասնակցային հաշիվը ստեղծված է, սակայն մուտքը համակարգ չհաջողվեց։ {{SITENAME}} կայքը օգտագործում է «քուքիներ» մասնակիցների վավերացման համար։ Ձեր մոտ «քուքիները» արգելված են։ Խնդրում ենք թույլատրել սրանք, ապա մտնել համակարգ ձեր նոր մասնակցի անունով և գաղտնաբառով։',
 'nocookieslogin' => '{{SITENAME}} կայքը օգտագործում է «քուքիներ» մասնակիցների վավերացման համար։ Ձեր մոտ «քուքիները» արգելված են։ Խնդրում ենք թույլատրել սրանք և փորձել կրկին։',
+'nocookiesfornew' => 'Մասնակցային հաշիվը չհաջողվեց ստեղծվել, քանի որ հնարավոր չեր վավերացնել աղբյուրը։
+Ստուգեք, որ ձեզ մոտ թույլատրված են քուկիները, վերբեռնեք էջը և փորձեք կրկին։',
 'noname' => 'Դուք չեք նշել թույլատրելի մասնակցային անուն։',
 'loginsuccesstitle' => 'Բարեհաջող մուտք',
 'loginsuccess' => "'''Դուք մուտք գործեցիք {{SITENAME}}, որպես \"\$1\"։'''",
@@ -730,6 +738,7 @@ $2',
 'noemailprefs' => 'Այս հնարավորության գործածման համար անհրաժեշտ է նշել էլ-փոստի հասցե։',
 'emailconfirmlink' => 'Վավերացնել ձեր էլ-փոստի հասցեն',
 'invalidemailaddress' => 'Նշված էլ-փոստի հասցեն անընդունելի է, քանի որ այն ունի անթույլատրելի ֆորմատ։ Խնդրում ենք նշել ճշմարիտ հասցե կամ այս դաշտը թողնել դատարկ։',
+'emaildisabled' => 'Այս կայքը չի կարող ուղարկել էլ․ նամակներ։',
 'accountcreated' => 'Հաշիվը ստեղծված է',
 'accountcreatedtext' => '$1 մասնակցի հաշիվը ստեղծված է։',
 'createaccount-title' => '{{SITENAME}}. մասնակցային հաշվի ստեղծում',
@@ -743,6 +752,7 @@ $2',
 
 # E-mail sending
 'php-mail-error-unknown' => 'Անհայտ սխալ PHP-ի mail() ֆունկցիայում',
+'user-mail-no-addy' => 'Փորձվեց ուղարկել էլ․ նամակ առանց էլ․ հասցեի։',
 
 # Change password dialog
 'resetpass' => 'Փոխել գաղտնաբառը',
@@ -763,14 +773,25 @@ $2',
 'resetpass-temp-password' => 'Ժամանակավոր գաղտնաբառ.',
 
 # Special:PasswordReset
+'passwordreset' => 'Վերականգնել գաղտնաբառը',
+'passwordreset-text' => 'Լրացրեք ձևը՝ էլ-փոստով ձեր տվյալների մասին հիշեցում ստանալու համար։',
 'passwordreset-legend' => 'Վերականգնել գաղտնաբառը',
+'passwordreset-disabled' => 'Գաղտնաբառի վերականգնումը այս վիքիում թույլատրված չէ։',
 'passwordreset-username' => 'Մասնակցի անուն.',
+'passwordreset-email' => 'Էլ-փոստի հասցեն՝',
 'passwordreset-emailelement' => 'Մասնակցային անուն. $1
 Ժամանակավոր գաղտնաբառ. $2',
+'passwordreset-emailsent' => 'Ուղարկվեց հիշեցնող էլ․ նամակ։',
+'passwordreset-emailsent-capture' => 'Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։',
+'passwordreset-emailerror-capture' => 'Ուղարկվեց հիշեցնող էլ․ նամակ։ Այն ներկայացված է ստորև։ Սակայն մասնակցին ուղարկելը չհաջողվեց․',
 
 # Special:ChangeEmail
 'changeemail' => 'Փոխել էլ. հասցեն',
-'changeemail-submit' => 'Խմբագրել էլ․ հասցեն',
+'changeemail-header' => 'Փոխել հաշվի էլ․ հասցեն',
+'changeemail-oldemail' => 'Ներկա էլ․ հասցե․',
+'changeemail-newemail' => 'Նոր էլ․ հասցե․',
+'changeemail-none' => '(ոչ մի)',
+'changeemail-submit' => 'Փոխել էլ․ հասցեն',
 'changeemail-cancel' => 'Չեղարկել',
 
 # Edit page toolbar
@@ -820,7 +841,7 @@ $2',
 * Արգելափակման մարում՝ $6
 * Արգելափակվել է՝ $7
 
-Ô´Õ¸Ö\82Ö\84 Õ¯Õ¡Ö\80Õ¸Õ² Õ¥Ö\84 Õ¯Õ¡ÕºÕ¶Õ¾Õ¥Õ¬ $1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« Õ¯Õ¡Õ´ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ [[{{MediaWiki:Grouppage-sysop}}|Õ¡Õ¤Õ´Õ«Õ¶Õ«Õ½Õ¿Ö\80Õ¡Õ¿Õ¸Ö\80Õ«]] Õ°Õ¥Õ¿Õ\9d Õ±Õ¥Ö\80 Õ¡Ö\80Õ£Õ¥Õ¬Õ¡Ö\83Õ¡Õ¯Õ¸Ö\82Õ´Õ¨ Ö\84Õ¶Õ¶Õ¡Ö\80Õ¯Õ¥Õ¬Õ¸Ö\82 Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¸Õ¾։
+Ô´Õ¸Ö\82Ö\84 Õ¯Õ¡Ö\80Õ¸Õ² Õ¥Ö\84 Õ¯Õ¡ÕºÕ¾Õ¥Õ¬ $1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« Õ¯Õ¡Õ´ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ [[{{MediaWiki:Grouppage-sysop}}|Õ¡Õ¤Õ´Õ«Õ¶Õ«Õ½Õ¿Ö\80Õ¡Õ¿Õ¸Ö\80Õ«]] Õ°Õ¥Õ¿Õ\9d Õ±Õ¥Ö\80 Õ¡Ö\80Õ£Õ¥Õ¬Õ¡Ö\83Õ¡Õ¯Õ¸Ö\82Õ´Õ¨ Ö\84Õ¶Õ¶Õ¡Ö\80Õ¯Õ¥Õ¬Õ¸Ö\82 Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¸Õ¾Ö\89 Ô´Õ¡ Õ¶Õ¡Ö\87 Õ°Õ¶Õ¡Ö\80Õ¡Õ¾Õ¸Ö\80 Õ§ Õ¡Õ¶Õ¥Õ¬ Õ±Õ¥Ö\80 Ö\84Õ¶Õ¶Õ¡Ö\80Õ¯Õ´Õ¡Õ¶ Õ§Õ»Õ¸Ö\82Õ´։
 Դուք չեք կարող օգտվել` «էլ-նամակ ուղարկել այս մասնակցին» հնարավորությունից, քանի դեռ ինքներդ գործող էլ-փոստի հասցե չէք  նշել ձեր [[Special:Preferences|մասնակցի նախընտրություններում]] և չեք արգելափակվել այս հնարավորւությունը օգտագործելուց։
 
 Ձեր ընթացիկ IP-հասցեն է` $3, արգելափակման իդենտիֆիկատորը՝ #$5։
@@ -834,7 +855,7 @@ $2',
 * Արգելափակման մարում՝ $6
 * Արգելափակվել է՝ $7
 
-Ô´Õ¸Ö\82Ö\84 Õ¯Õ¡Ö\80Õ¸Õ² Õ¥Ö\84 Õ¯Õ¡ÕºÕ¶Õ¾Õ¥Õ¬ $1 Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ« Õ¯Õ¡Õ´ Õ´Õ¥Õ¯ Õ¡ÕµÕ¬ [[{{MediaWiki:Grouppage-sysop}}|Õ¡Õ¤Õ´Õ«Õ¶Õ«Õ½Õ¿Ö\80Õ¡Õ¿Õ¸Ö\80Õ«]] Õ°Õ¥Õ¿Õ\9d Õ±Õ¥Ö\80 Õ¡Ö\80Õ£Õ¥Õ¬Õ¡Ö\83Õ¡Õ¯Õ¸Ö\82Õ´Õ¨ Ö\84Õ¶Õ¶Õ¡Ö\80Õ¯Õ¥Õ¬Õ¸Ö\82 Õ¶ÕºÕ¡Õ¿Õ¡Õ¯Õ¸Õ¾Ö\89
+Դուք կարող եք կապվել $1 մասնակցի կամ մեկ այլ [[{{MediaWiki:Grouppage-sysop}}|ադմինիստրատորի]] հետ՝ ձեր արգելափակումը քննարկելու նպատակով։
 
 Դուք չեք կարող օգտվել «էլ-նամակ ուղարկել այս մասնակցին» հնարավորությունից քանի դեռ ինքներդ գործող էլ-փոստի հասցե չէք  նշել ձեր [[Special:Preferences|մասնակցի նախընտրություններում]] և չեք արգելափակվել այս հնարավորությից օգտվելուց։
 
@@ -854,7 +875,10 @@ $2',
 
 Համակարգ մուտք գործելուն պես կարող եք ''[[Special:ChangePassword|փոխել գաղտնաբառը]]''։",
 'newarticle' => '(Նոր)',
-'newarticletext' => "Դուք հղվել եք դեռևս գոյություն չունեցող էջի։ Էջը ստեղծելու համար սկսեք տեքստի մուտքագրումը ներքևի արկղում (այցելեք [[{{MediaWiki:Helppage}}|օգնության էջը]]՝ մանրամասն տեղեկությունների համար)։ Եթե դուք սխալմամբ եք այստեղ հայտնվել, ապա մատնահարեք ձեր զննարկիչի '''back''' կոճակը։",
+'newarticletext' => "Դուք հղվել եք դեռևս գոյություն չունեցող էջի։ 
+Նոր էջ ստեղծելու համար ներքևում գտնվող խմբագրման դաշտում ավելացրեք ձեր տեքստը, այնուհետև սեղմեք '''Հիշել էջը''' (այցելեք [[{{MediaWiki:Helppage}}|օգնության էջը]]՝ մանրամասն տեղեկությունների համար)։ 
+
+Եթե դուք սխալմամբ եք այստեղ հայտնվել, ապա սեղմեք ձեր զննարկիչի '''հետ''' (back) կոճակը։",
 'anontalkpagetext' => "{| style=\"background-repeat:no-repeat; background-position:800px -20px; margin:0.5em 0 0.5em 0; clear:both;\" width=100% class=toccolours
 |- 
 | <span class=\"plainlinksneverexpand\">''Այս քննարկման էջը պատկանում է չգրանցված կամ համակարգ չմտած մասնակցի, ով խմբագրում կատարելիս օգտվել է {{BASEPAGENAME}} ԱյՓի հասցեից։''
@@ -895,10 +919,10 @@ $2',
 
 '''Եթե սա բարեխիղճ խմբագրման փորձ է, խնդրում ենք փորձել կրկին։ Սխալի կրկնման դեպքում՝ փորձեք [[Special:UserLogout|դուրս գալ]], ապա կրկին մտնել համակարգ։'''",
 'token_suffix_mismatch' => "'''Ձեր խմբագրումը մերժվել է, քանի որ ձեր օգտագործած ծրագիրը աղավաղել է կետադրության նշանները խմբագրման դաշտում։ Խմբագրումը մերժվել է էջի տեքստի խաթարումը կանխելու նպատակով։ Սա երբեմն պայմանավորված է սխալներ պարունակող անանվանեցնող վեբ-փոխարինորդ (proxy) ծառայության օգտագործմամբ։'''",
-'editing' => 'Խմբագրում. $1',
+'editing' => '$1ն խմբագրելիս',
 'creating' => 'Ստեղծում $1',
-'editingsection' => 'Խմբագրում. $1 (բաժին)',
-'editingcomment' => 'Խմբագրում $1 (նոր բաժին)',
+'editingsection' => 'Խմբագրում՝ $1 (բաժին)',
+'editingcomment' => 'Խմբագրում՝ $1 (նոր բաժին)',
 'editconflict' => 'Խմբագրման ընդհարում. $1',
 'explainconflict' => "Մեկ այլ մասնակից փոփոխել է այս տեքստը ձեր խմբագրման ընթացքում։
 Վերին խմբագրման դաշտում ընդգրկված է ընթացիկ տեքստը, որն ենթակա է հիշման։
@@ -1027,6 +1051,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'revdelete-hide-comment' => 'Թաքցնել մեկնաբանությունը',
 'revdelete-hide-user' => 'Թաքցնել հեղինակի մասնակցի անունը/IP',
 'revdelete-hide-restricted' => 'Թաքցնել տվյալները և՛ ադմինիստրատորներից, և՛ այլ մասնակիցներից',
+'revdelete-radio-same' => '(չի կարելի խմբագրել)',
 'revdelete-radio-set' => 'Այո',
 'revdelete-radio-unset' => 'Ոչ',
 'revdelete-suppress' => 'Թաքցնել տվյալները ադմինիստրատորներից և մյուսներից նոյնպես',
@@ -1046,7 +1071,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'revdelete-offender' => 'Էջի տարբերակի հեղինակ՝',
 
 # History merging
-'mergehistory-reason' => 'Պատճառ.',
+'mergehistory-reason' => 'Պատճառ՝',
 
 # Merge log
 'revertmerge' => 'Անջատել',
@@ -1091,7 +1116,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$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-category-size' => '{{PLURAL:$1|անդամ}} ({{PLURAL:$2|ենթակատեգորիա}}, {{PLURAL:$3|նիշք}})',
 'search-result-score' => 'Համընկնում $1%',
 'search-redirect' => '(վերահղում $1)',
 'search-section' => '(բաժին $1)',
@@ -1099,8 +1124,6 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'search-interwiki-caption' => 'Կից նախագծեր',
 'search-interwiki-default' => '$1 արդյունք.',
 'search-interwiki-more' => '(էլի)',
-'search-mwsuggest-enabled' => 'առաջարկներով',
-'search-mwsuggest-disabled' => 'առանց առաջարկների',
 'search-relatedarticle' => 'Հարակից',
 'mwsuggest-disable' => 'Անջատել AJAX հուշումներ',
 'searcheverything-enable' => 'Որոնել բոլոր անվանատարածքներում',
@@ -1132,7 +1155,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 
 # Preferences page
 'preferences' => 'Նախընտրություններ',
-'mypreferences' => 'Իմ նախընտրությունները',
+'mypreferences' => 'Նախընտրություններ',
 'prefs-edits' => 'Խմբագրումների քանակը.',
 'prefsnologin' => 'Դուք չեք մտել համակարգ',
 'prefsnologintext' => 'Մասնակցային նախընտրությունները փոփոխելու համար անհրաժեշտ է <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} մտնել համակարգ]</span>։',
@@ -1223,7 +1246,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 Այս տեղեկությունը բոլորին տեսանլի է լինելու։',
 'email' => 'Էլ-փոստ',
 'prefs-help-realname' => 'Իրական անունը պարտադիր չէ, սակայն եթե դուք նշեք դա, ապա այն կօգտագործվի ձեր փոփոխությունների իրական անվանը վերագրման համար։',
-'prefs-help-email' => 'Էլեկտրոնային փոստի մուտքագրումը պարտադիր չէ, սակայն սա թույլ կտա մյուս մասնակիցներին կապնվել ձեզ հետ ձեր մասնակցի կամ մասնակցի քննարկման էջի միջոցով՝ առանց ձեր անձի կամ ձեր էլեկտրոնային հասցեի բացահայտման։',
+'prefs-help-email' => 'Էլ-փոստի հասցեն նշելը պարտադիր չէ, սակայն այն անհրաժեշտ կլինի, եթե դուք երբևէ մոռանաք ձեր գաղտնաբառը։',
 'prefs-help-email-required' => 'Էլ-փոստի հասցեն նշելը պարտադիր է։',
 'prefs-info' => 'Հիմնական տեղեկություններ',
 'prefs-i18n' => 'Միջազգայնացում',
@@ -1281,10 +1304,17 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'grouppage-suppress' => '{{ns:project}}:Հսկիչ',
 
 # Rights
-'right-edit' => 'էջերի խմբագրում',
-'right-move' => 'Տեղափոխել էջերը',
-'right-move-subpages' => 'Տեղափոխել էջերն իրենց ենթաէջերով',
+'right-read' => 'Դիտել էջեր',
+'right-edit' => 'Խմբագրել էջեր',
+'right-createtalk' => 'Ստեղծել քննարկման էջեր',
+'right-createaccount' => 'Ստեղծել նոր մասնակցային հաշիվներ',
+'right-minoredit' => 'Նշել խմբագրումը որպես ստուգված',
+'right-move' => 'Վերանվանել էջը',
+'right-move-subpages' => 'Վերանվանել էջն իր ենթաէջերով',
+'right-movefile' => 'Վերանվանել նիշքեր',
+'right-suppressredirect' => 'Էջը վերանավանելիս վերահղում չթողնել',
 'right-upload' => 'Նիշքերի բեռնում',
+'right-upload_by_url' => 'Բեռնել նիշքեր ինտերնետային հասցեից',
 'right-delete' => 'Էջերի ջնջում',
 
 # User rights log
@@ -1295,6 +1325,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'խմբագրել այս էջը',
+'action-createpage' => 'Ստեղծել էջ',
 'action-upload' => 'Բեռնել այս ֆայլը',
 'action-upload_by_url' => 'Բեռնել այս ֆայլը URL-ից',
 'action-delete' => 'Ջնջել այս էջը',
@@ -1347,7 +1378,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'recentchangeslinked-to' => 'Հակառա՛կը. ցույց տալ այս էջին հղող էջերի փոփոխությունները։',
 
 # Upload
-'upload' => 'Բեռնել նիշք',
+'upload' => 'Բեռնել նիշք (ֆայլ)',
 'uploadbtn' => 'Բեռնել նիշք',
 'reuploaddesc' => 'Վերադառնալ բեռնման ձևին։',
 'uploadnologin' => 'Դուք չեք մտել համակարգ',
@@ -1368,6 +1399,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'filename' => 'Նիշքի անվանում',
 'filedesc' => 'Ամփոփում',
 'fileuploadsummary' => 'Նկարագրություն՝',
+'filereuploadsummary' => 'Ֆայլի Փոփոխություները:',
 'filestatus' => 'Հեղինակային իրավունքի կարգավիճակ.',
 'filesource' => 'Աղբյուր՝',
 'uploadedfiles' => 'Բեռնված նիշքեր',
@@ -1396,15 +1428,18 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'fileexists-forbidden' => 'Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի։ Խնդրում ենք հետ վերադառնալ և բեռնել նիշքը նոր անվանմամբ։ [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի նիշքերի ընդհանուր զետեղարանում։ Խնդրում ենք հետ վերադառնալ և բեռնել նիշքը նոր անվանմամբ։ [[File:$1|thumb|center|$1]]',
 'uploadwarning' => 'Զգուշացում',
-'savefile' => 'Õ\80Õ«Õ·Õ¥Õ¬ Õ¶Õ«Õ·Ö\84ը',
+'savefile' => 'Õ\80Õ«Õ·Õ¥Õ¬ Õ\96Õ¡ÕµÕ¬ը',
 'uploadedimage' => 'բեռնվեց «[[$1]]»',
 'overwroteimage' => 'բեռնվեց «[[$1]]» նիշքի նոր տարբերակ',
 'uploaddisabled' => 'Բեռնումները արգելված են',
 'uploaddisabledtext' => 'Նիշքերի բեռնումը արգելափակված է։',
 'uploadscripted' => 'Այս նիշքը պարունակում է HTML-կոդ կամ գրվածք (սկրիպտ), որը կարող է սխալ մեկնաբանվել զննարկիչի կողմից։',
 'uploadvirus' => 'Նիշքը պարունակում է վիրո՜ւս։ Տես $1',
+'upload-source' => 'Աղբյուրը ֆայլի',
 'sourcefilename' => 'Սկզբնական նիշք՝',
 'destfilename' => 'Նիշքի նոր անվանում՝',
+'upload-description' => 'Ֆայլի մեկնաբանություն',
+'upload-options' => 'Բեռնման ընտրանքներ',
 'watchthisupload' => 'Հսկել այս նիշքը',
 'filewasdeleted' => 'Այս անվանմամբ նիշք նախկինում բեռնվել է և հետագայում ջնջվել։ Այն կրկին բեռնելուց առաջ խնդրում ենք ստուգել $1։',
 'filename-bad-prefix' => "Բեռնվող նիշքի անվանումը սկսվում է '''<tt>«$1»</tt>''' արտահայտությամբ, որը ոչ-նկարագրական է և սովորաբար տրվում է թվային լուսանկարչական ապարատների կողմից։ Խնդրում ենք ընտրել ավելի նկարագրական անվանում ձեր նիշքի համար։",
@@ -1413,7 +1448,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'upload-proto-error' => 'Սխալ պրոտոկոլ',
 'upload-proto-error-text' => 'Հեռավոր բեռնումը պահանջում է URL-հասցե, որը սկսվում է <code>http://</code> կամ <code>ftp://</code> նախածանցով։',
 'upload-file-error' => 'Ներքին սխալ',
-'upload-file-error-text' => 'Õ\8fÕ¥Õ²Õ« Õ¸Ö\82Õ¶Õ¥Ö\81Õ¡Õ¾ Õ¶Õ¥Ö\80Ö\84Õ«Õ¶ Õ½Õ­Õ¡Õ¬Õ\9d Õ½Õ¥Ö\80Õ¾Õ¥Ö\80Õ« Õ¾Ö\80Õ¡ ÕªÕ¡Õ´Õ¡Õ¶Õ¡Õ¯Õ¡Õ¾Õ¸Ö\80 Õ¶Õ«Õ·Ö\84 Õ½Õ¿Õ¥Õ²Õ®Õ¥Õ¬Õ«Õ½Ö\89 Ô½Õ¶Õ¤Ö\80Õ¸Ö\82Õ´ Õ¥Õ¶Ö\84 Õ¯Õ¡ÕºÕ¶Õ¾Õ¥Õ¬ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö\80Õ£Õ¡ÕµÕ«Õ¶ [[Special:ListUsers/sysop|Õ¡Õ¤Õ´Õ«Õ¶Õ«Õ½Õ¿Ö\80Õ¡Õ¿Õ¸Ö\80Õ«]] Õ°Õ¥Õ¿Ö\89',
+'upload-file-error-text' => 'Տեղի ունեցավ ներքին սխալ՝ սերվերի վրա ժամանակավոր նիշք ստեղծելիս։ Խնդրում ենք կապվել համակարգային [[Special:ListUsers/sysop|ադմինիստրատորի]] հետ։',
 'upload-misc-error' => 'Բեռնման անհայտ սխալ',
 'upload-misc-error-text' => 'Տեղի ունեցավ անհայտ սխալ բեռնման ընթացքում։ Խնդրում ենք ստուգել URL-հասցեի ճշտությունն ու հասանելիությունը և փորձել կրկին։ Սխալի կրկնման դեպքում կապնվեք համակարգային ադմինիստրատորի հետ։',
 
@@ -1462,6 +1497,8 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'nolinkstoimage' => 'Այս նիշքին հղվող էջեր չկան։',
 'sharedupload' => 'Այս նիշքը $1 զետեղարանից է և կարող է օգտագործվել այլ նախագծերում։',
 'sharedupload-desc-here' => 'Այս նիշքը $1-ից է և թուլատրելի է այլ նախագծերի կողմից օգտագործվել։ [$2 Նիշքի նկարագրման էջի] նկարագրությունը ներկայացված է ներքո։',
+'filepage-nofile' => 'Այս անունով նիշք գոյություն չունի։',
+'filepage-nofile-link' => 'Այս անունով նիշք գոյություն չունի, դուք կարող եք [$1 բեռնել այն]:',
 'uploadnewversion-linktext' => 'Բեռնել այս նիշքի նոր տարբերակ',
 
 # File reversion
@@ -1488,6 +1525,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'filedelete-otherreason' => 'Այլ/հավելյալ պատճառ․',
 'filedelete-reason-otherlist' => 'Ուրիշ պատճառ',
 'filedelete-edit-reasonlist' => 'Խմբագրել ջնջման պատճառների ցանկը',
+'filedelete-maintenance-title' => 'Հնարավոր չէ ջնջել նիշքը։',
 
 # MIME search
 'mimesearch' => 'Որոնել MIME-տեսակով',
@@ -1560,10 +1598,13 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 # 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|տարբերակ|տարբերակներ}}',
 'nviews' => '$1 {{PLURAL:$1|դիտում|դիտումներ}}',
+'nimagelinks' => 'օգտագործվում է $1 {{PLURAL:$1|էջ|էջեր}}',
+'ntransclusions' => 'օգտագործվում է $1 {{PLURAL:$1|էջ|էջեր}}',
 'specialpage-empty' => 'Հայցումը արդյունքներ չվերադարձրեց։',
 'lonelypages' => 'Որբ էջեր',
 'lonelypagestext' => 'Հետևյալ էջերին չկան հղումներ այս վիքիի այլ էջերից։',
@@ -1583,6 +1624,7 @@ $3 մասնակիցը տվել է հետևյալ պատճառը. ''$2''",
 'mostlinkedtemplates' => 'Կաղապարներ, որոնց շատ են հղվում',
 'mostcategories' => 'Ամենաշատ կատեգորիաներով էջեր',
 'mostimages' => 'Ամենաշատ օգտագործվող նկարներ',
+'mostinterwikis' => 'Ամենաշատ միջլեզվային հղումներով էջեր',
 'mostrevisions' => 'Ամենաշատ վերափոխումներով հոդվածներ',
 'prefixindex' => 'Բոլոր էջերը ըստ սկզբնատառի',
 'shortpages' => 'Կարճ էջեր',
@@ -1675,13 +1717,20 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'mailnologin' => 'Ուղարկման հասցե չկա',
 'mailnologintext' => 'Անհրաժեշտ է [[Special:UserLogin|մտնել համակարգ]] և ունենալ գործող էլ-փոստի հասցե ձեր [[Special:Preferences|նախընտրություններում]]՝ ուրիշ մասնակիցներին էլեկտրոնային նամակներ ուղարկելու համար։',
 'emailuser' => 'էլ-նամակ ուղարկել այս մասնակցին',
+'emailuser-title-target' => 'Ուղարկել էլ․ նամակ {{GENDER:$1|մասնակցին}}',
+'emailuser-title-notarget' => 'Ուղարկել էլ․ նամակ',
 'emailpage' => 'Էլ-նամակ ուղարկել մասնակցին',
-'emailpagetext' => 'Եթե այս մասնակիցը նշել է գործող էլ-փոստի հասցե իր նախընտրություններում, ապա ստորև բերված ձևով հնարավոր է ուղարկել նրան էլ-նամակ։
-Այն էլ-հասցեն, որը դուք նշել եք ձեր նախընտրություններում, կերևա «Ումից» դաշտում, ուստի ստացողը հնարավորություն կունենա պատասխանել։',
+'emailpagetext' => 'Դուք կարող եք օգտագործել ներքևի ձևը այս {{GENDER:$1|մասնակցին}} էլ-նամաակ ուղարկելու համար։
+
+Ձեր նախընտրանքներում նշված էլ-հասցեն կերևա «Ումից» դաշտում և ստացողը կարող է անմիջապես պատասխանել ձեզ։',
 'usermailererror' => 'Նամակն ուղարկելիս սխալ է վերադարձվել.',
-'defemailsubject' => '{{SITENAME}} e-mail',
+'defemailsubject' => '{{SITENAME}} էլ-նամակ',
+'usermaildisabled' => 'Էլ․ նամակ ուղարկելը թույլատրված չէ։',
+'usermaildisabledtext' => 'Այս վիքիում չեք կարղ էլ․ նամակ ուղարկել այլ մասնակիցների',
 'noemailtitle' => 'Չկա էլ-փոստի հասցե',
 'noemailtext' => 'Այս մասնակիցը չի նշել էլ-փոստի հասցե կամ նախընտրել է չստանալ էլ-նամակներ այլ մասնակիցներից։',
+'emailusername' => 'Մասնակցի անուն՝',
+'email-legend' => 'Ուղարկել էլ․ նամակ {{SITENAME}}յի այլ մասնակցի',
 'emailfrom' => 'Ումից.',
 'emailto' => 'Ում.',
 'emailsubject' => 'Թեմա.',
@@ -1694,7 +1743,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 # Watchlist
 'watchlist' => 'Իմ հսկողության ցանկը',
-'mywatchlist' => 'Իմ հսկացանկը',
+'mywatchlist' => 'Հսկացանկ',
 'nowatchlist' => 'Ձեր հսկողության ցանկը դատարկ է։',
 'watchlistanontext' => 'Անհրաժեշտ է $1՝ հսկացանկը դիտելու կամ խմբագրելու համար։',
 'watchnologin' => 'Չեք մտել համակարգ',
@@ -1728,11 +1777,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => '{{grammar:genitive|{{SITENAME}}}} Տեղեկացման ծառայություն',
 'enotif_reset' => 'Նշել բոլոր էջերը այցելված',
-'enotif_newpagetext' => 'Սա նոր էջ է։',
 'enotif_impersonal_salutation' => '{{grammar:genitive|{{SITENAME}}}} մասնակից',
-'changed' => 'փոփոխված է',
-'created' => 'ստեղծված է',
-'enotif_subject' => '{{grammar:genitive|{{SITENAME}}}} «$PAGETITLE» էջը $CHANGEDORCREATED $PAGEEDITOR մասնակցի կողմից',
 'enotif_lastvisited' => 'Տես $1՝ ձեր վերջին այցից ի վեր կատարված փոփոխությունների համար։',
 'enotif_lastdiff' => 'Տես $1՝ այս փոփոխությունը դիտելու համար։',
 'enotif_anon_editor' => 'անանուն մասնակից $1',
@@ -1842,6 +1887,7 @@ $NEWPAGE
 'protect-cantedit' => 'Դուք չեք կարող փոխել այս էջի պաշտպանության մակարդակը, քանի որ ձեզ չի թույլատրվում խմբագրել այն։',
 'protect-othertime' => 'Այլ ժամկետ',
 'protect-othertime-op' => 'այլ ժամկետ',
+'protect-otherreason-op' => 'Այլ պատճառ',
 'protect-dropdown' => '* Ամենահաճախ նշվող պատճառներ
 ** Հաճախակի վանդալություններ
 ** Հաճախակի սփամ
@@ -1904,10 +1950,12 @@ $NEWPAGE
 '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-submit' => 'Այո',
 
 # Namespace form on various pages
 'namespace' => 'Անվանատարածք.',
@@ -1918,7 +1966,7 @@ $1',
 # Contributions
 'contributions' => 'Մասնակցի ներդրում',
 'contributions-title' => '$1 մասնակցի ներդրումը',
-'mycontris' => 'Իմ ներդրումը',
+'mycontris' => 'Ներդրում',
 'contribsub2' => '$1-ի ներդրումները ($2)',
 'nocontribs' => 'Այս չափանիշներին համապատասխանող փոփոխություններ չեն գտնվել։',
 'uctop' => ' (վերջինը)',
@@ -1929,11 +1977,15 @@ $1',
 'sp-contributions-newbies-sub' => 'Նոր մասնակցային հաշիվներից',
 'sp-contributions-newbies-title' => 'Նոր մասնակիցների ներդրումներ',
 'sp-contributions-blocklog' => 'Արգելափակման տեղեկամատյան',
-'sp-contributions-deleted' => 'Õ\84ասնակցի ջնջված ներդրում',
+'sp-contributions-deleted' => 'Õ´ասնակցի ջնջված ներդրում',
 'sp-contributions-uploads' => 'Բեռնումներ',
 'sp-contributions-logs' => 'տեղեկամատյաններ',
 'sp-contributions-talk' => 'քննարկում',
 'sp-contributions-userrights' => 'մասնակիցների իրավունքների կառավարում',
+'sp-contributions-blocked-notice' => 'Այս մասնակիցը ներկա պահին արգելափակված է։
+Ստորև ներկայացված է արգելափակման տեղեկամատյանի վերջին գրառումը.',
+'sp-contributions-blocked-notice-anon' => 'Այս IP հասցեն ներկա պահին արգելափակված է։
+Ստորև ներկայացված է արգելափակման տեղեկամատյանի վերջին գրառումը.',
 'sp-contributions-search' => 'Որոնել ներդրումները',
 'sp-contributions-username' => 'IP-հասե կամ մասնակցի անուն.',
 'sp-contributions-toponly' => 'Ցույց տալ միայն այն խմբագրումները, որոնք վերջին փոփոխություն են',
@@ -1955,10 +2007,15 @@ $1',
 'whatlinkshere-hideredirs' => '$1 վերահղում',
 'whatlinkshere-hidetrans' => '$1 ներառումները',
 'whatlinkshere-hidelinks' => '$1 հղում',
+'whatlinkshere-hideimages' => '$1 նիշքային հղումներ',
 'whatlinkshere-filters' => 'Զտիչներ',
 
 # Block/unblock
+'autoblockid' => 'Ավտոմատ արգելափակում #$1',
+'block' => 'Արգելափակել մասնակցին',
+'unblock' => 'Արգելափակումից հանել',
 'blockip' => 'Մասնակցի արգելափակում',
+'blockip-title' => 'Արգելափակել մասնակցին',
 'blockip-legend' => 'Մասնակցի արգելափակում',
 'blockiptext' => 'Օգտագործեք ստորև բերված ձևը որոշակի IP-հասցեից կամ մասնակցի անունից գրելու հնարավորությունը արգելափակելու համար։
 Նման բան հարկավոր է անել միայն վանդալության կանխարգելման նպատակով և համաձայն [[{{MediaWiki:Policy-url}}|կանոնակարգի]]։
@@ -1998,6 +2055,7 @@ $1',
 'ipusubmit' => 'Հանել արգելափակումը',
 'unblocked' => '[[User:$1|$1]] մասնակիցը անարգելված է։',
 'unblocked-id' => '$1 արգելափակումը հանված է',
+'blocklist' => 'Արգելափակված մասնակիցներ։',
 'ipblocklist' => 'Արգելափակված IP-հասցեները և մասնակիցները',
 'ipblocklist-legend' => 'Արգելափակված մասնակցի որոնում',
 'ipblocklist-submit' => 'Որոնել',
@@ -2035,7 +2093,7 @@ $1',
 'ipb_cant_unblock' => 'Սխալ. համար «$1» արգելափակումը չի գտնվել։ Հնարավոր է, որ արգելափակումն արդեն հանված է։',
 'ip_range_invalid' => 'IP-հասցեների անթույլատրելի լայնույթ։',
 'proxyblocker' => 'Փոխանորդի արգելափակում',
-'proxyblockreason' => 'Õ\81Õ¥Ö\80 IP-Õ°Õ¡Õ½Ö\81Õ¥Õ¶ Õ¡Ö\80Õ£Õ¥Õ¬Õ¡Ö\83Õ¡Õ¯Õ¾Õ¥Õ¬ Õ§, Ö\84Õ¡Õ¶Õ« Õ¸Ö\80 Õ¡ÕµÕ¶ Õ¡Õ¦Õ¡Õ¿ Ö\85Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ´Õ¡Õ¶ Ö\83Õ¸Õ­Õ¡Õ¶Õ¸Ö\80Õ¤ Õ§Ö\89 Ô½Õ¶Õ¤Ö\80Õ¸Ö\82Õ´ Õ¥Õ¶Ö\84 Õ¯Õ¡ÕºÕ¶վել ձեր ցանցային կամ տեխնիկական ծառայության տրամադրողի հետ և տեղեկացնել այս լուրջ անվտանգության խնդրի մասին։',
+'proxyblockreason' => 'Õ\81Õ¥Ö\80 IP-Õ°Õ¡Õ½Ö\81Õ¥Õ¶ Õ¡Ö\80Õ£Õ¥Õ¬Õ¡Ö\83Õ¡Õ¯Õ¾Õ¥Õ¬ Õ§, Ö\84Õ¡Õ¶Õ« Õ¸Ö\80 Õ¡ÕµÕ¶ ÕºÕ¡Õ¿Õ¯Õ¡Õ¶Õ¸Ö\82Õ´ Õ§ Õ°Õ¡Õ¶Ö\80Õ¡ÕµÕ«Õ¶ Õ´Õ«Õ»Õ¶Õ¸Ö\80Õ¤ (ÕºÖ\80Õ¸Ö\84Õ½Õ«) Õ½Õ¥Õ¼Õ¾Õ¥Ö\80Õ«Õ¶Ö\89 Ô½Õ¶Õ¤Ö\80Õ¸Ö\82Õ´ Õ¥Õ¶Ö\84 Õ¯Õ¡Õºվել ձեր ցանցային կամ տեխնիկական ծառայության տրամադրողի հետ և տեղեկացնել այս լուրջ անվտանգության խնդրի մասին։',
 'proxyblocksuccess' => 'Արված է։',
 'sorbsreason' => 'Ձեր IP-հասցեն հաշվված է որպես ազատ օգտագործման փոխանորդ DNSBL ցանկում։',
 'sorbs_create_account_reason' => 'Ձեր IP-հասցեն հաշվված է որպես ազատ օգտագործման փոխանորդ DNSBL ցանկում։ Դուք չեք կարող ստեղծել մասնակցային հաշիվ։',
@@ -2074,6 +2132,13 @@ $1',
 '''ԶԳՈՒՇԱՑՈ՜ՒՄ'''
 Այս գործողությունը կարող է ունենալ արմատական ազդեցություն ''ժողովրդական'' էջի համար։
 Շարունակելուց առաջ խնդրում ենք համոզվել նրանում, որ դուք հասկանում եք հնարավոր հետևանքները։",
+'movepagetext-noredirectfixer' => "Օգտագործելով ներքևի ձևը, դուք կարող եք վերանավանել էջը։ Այդ դեպքում էջի ողջ կտեղափոխվի նոր վերնագրի ներքո։ Հին վերնագիրը կդառնա ավտոմատ վերահղում նոր վերնագրին։ Ստուգե՛ք, արդյոք վերանվանման պատճառով չե՞ն առաջացել [[Special:DoubleRedirects|կրկնակի]] կամ [[Special:BrokenRedirects|կոտրված վերահղումներ]]։ Դուք պատասխանատու եք, որ այլ էջերի հղումները այս անվանափոխությունից հետո շարունակեն ճիշտ գործել։
+
+Էջը հնարավոր '''չի''' լինի վերանվանել, եթե նոր վերնագրով արդեն էջ գոյութուն ունի, բացի այն դեպքից, երբ այն դատարկ է կամ վերահղում է առանց պատմության։ Այսինքն սխալ անուն ընտրելու դեպքում դուք կարող եք վերադարձնել էջի նախկին անվանումը, սակայն դուք չեք կարող օգտագործել գոյություն ունեցող էջի վերնագիր։
+
+'''Ուշադրությո՛ւն'''
+Անվանափոխությունը կարող է լուրջ խնդիրներ առաջացնել հաճախակի խմբագրվող էջի դեպքում։
+Խնդրում ենք շարունակել միայն, եթե գիտակցում եք կատարվող փոփոխության հետևանքները։",
 'movepagetalktext' => "Կցված քննարկման էջը ավտոմատ կտեղափոխվի էջի հետ՝ '''բացառությամբ այն դեպքերի, երբ'''.
 *Գոյություն ունի ոչ-դատարկ քննարկման էջ նոր անվանման տակ
 *Դուք հանել եք նշումը ստորև արկղից
@@ -2089,6 +2154,7 @@ $1',
 'pagemovedsub' => 'Էջը վերանվանվեց',
 'movepage-moved' => "'''«$1» էջը վերանվանվել է «$2»'''",
 'movepage-moved-redirect' => 'Ստեղծվել է վերահղում։',
+'movepage-moved-noredirect' => 'Վերահղման ստեղծում թույլ չի տրվել',
 'articleexists' => 'Այդ անվանմամբ էջ արդեն գոյություն ունի կամ ձեր ընտրած անվանումը անթույլատրելի է։
 Խնդրում ենք ընտրել այլ անվանում։',
 'talkexists' => "'''Էջը հաջողությամբ տեղափոխվեց, սակայն կցված քննարկման էջը հնարավոր չէր տեղափոխել, քանի որ նոր անվանմամբ էջ արդեն գոյություն ուներ։ Խնդրում ենք միաձուլել դրանք ձեռքով։'''",
@@ -2125,16 +2191,20 @@ $1',
 'export-submit' => 'Արտածել',
 'export-addcattext' => 'Ավելացնել էջեր կատեգորիայից.',
 'export-addcat' => 'Ավելացնել',
+'export-addns' => 'Ավելացնել',
 'export-download' => 'Առաջարկել հիշել որպես նիշք',
 
 # Namespace 8 related
 'allmessages' => 'Համակարգային ուղերձներ',
-'allmessagesname' => 'Ուղերձ',
-'allmessagesdefault' => 'Լռությամբ տեքստ',
+'allmessagesname' => 'Անուն',
+'allmessagesdefault' => 'Ուղերձի լռելյայն տեքստ',
 'allmessagescurrent' => 'Ընթացիկ տեքստ',
 'allmessagestext' => 'Ստորև բերված է «MediaWiki» անվանատարածքի բոլոր համակարգային ուղերձների ցանկը։
 Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
 'allmessagesnotsupportedDB' => "Այս էջը չի գործում, քանի որ '''\$wgUseDatabaseMessages''' հատկանիշը անջատված է։",
+'allmessages-filter-all' => 'Բոլորը',
+'allmessages-language' => 'Լեզու',
+'allmessages-filter-submit' => 'Անցնել',
 
 # Thumbnails
 'thumbnail-more' => 'Ընդարձակել',
@@ -2154,6 +2224,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'import-interwiki-history' => 'Պատճենել այս էջի փոփոխումների լրիվ պատմությունը',
 'import-interwiki-submit' => 'Ներմուծել',
 'import-interwiki-namespace' => 'Տեղադրել էջերը անվանատարածքում.',
+'import-upload-filename' => 'Նիշքի անուն․',
 'import-comment' => 'Մեկնաբանություն.',
 'importtext' => 'Խնդրում ենք արտածեք էջը ելակետային վիքիից օգտագործելով [[Special:Export|արտածման գործիք]], հիշեք այն նիշքի տեսքով ձեր համակարգչի վրա և այնուհետև, բեռնեք այն այստեղ։',
 'importstart' => 'Էջերի ներմուծում...',
@@ -2271,12 +2342,41 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'spam_blanking' => 'Բոլոր տարբերակները պարունակում են հղումներ դեպի $1, մաքրում',
 
 # Info page
-'pageinfo-title' => 'Տեղեկություններ $1-ի վերաբերյալ',
+'pageinfo-title' => '$1-ի տվյալներ',
+'pageinfo-not-current' => 'Ցավոք հին խմբագրումների համար այս տվյալները հասանելի չեն։',
+'pageinfo-header-basic' => 'Հիմնական տվյալներ',
 'pageinfo-header-edits' => 'Խմբագրումներ',
+'pageinfo-header-restrictions' => 'Էջի պաշտպանումներ',
+'pageinfo-header-properties' => 'Էջի հատկանիշեր',
+'pageinfo-display-title' => 'Վերնագիր',
+'pageinfo-default-sort' => 'Լռելայն տեսակավորման բանալի',
+'pageinfo-length' => 'Ծավալ (բայթերով)',
+'pageinfo-article-id' => 'Էջի N',
+'pageinfo-language' => 'Բովանդակության լեզու',
+'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-authors' => 'Առանձին հեղինակների քանակ',
+'pageinfo-recent-edits' => 'Վերջին խմբագրումներ քանակ (վերջին $1)',
+'pageinfo-recent-authors' => 'Վերջին առանձին հեղինակների քանակ',
+'pageinfo-magic-words' => 'Մոգական {{PLURAL:$1|բառ|բառեր}} ($1)',
+'pageinfo-hidden-categories' => 'Թաքնված {{PLURAL:$1|կաղապար|կաղապարներ}} ($1)',
+'pageinfo-templates' => 'Օգտագործված {{PLURAL:$1|կաղապար|կաղապարներ}} ($1)',
+'pageinfo-toolboxlink' => 'Էջի տվյալներ',
+'pageinfo-redirectsto' => 'Վերահղում է դեպի',
+'pageinfo-redirectsto-info' => 'տվյալներ',
+'pageinfo-contentpage' => 'Հաշվառված որպես բովանդակային էջ',
+'pageinfo-contentpage-yes' => 'Այո',
 
 # Skin names
 'skinname-standard' => 'Դասական',
@@ -2379,6 +2479,9 @@ $1',
 'exif-imagewidth' => 'Լայնք',
 'exif-imagelength' => 'Բարձրություն',
 'exif-artist' => 'Հեղինակ',
+'exif-flash' => 'Ֆլեշ տարբ.',
+'exif-languagecode' => 'Լեզու',
+'exif-label' => 'Պիտակ',
 
 'exif-componentsconfiguration-0' => 'գոյություն չունի',
 
@@ -2433,11 +2536,13 @@ $3
 'unit-pixel' => ' փիքսել',
 
 # action=purge
-'confirm_purge_button' => 'OK',
+'confirm_purge_button' => 'ԼԱՎ',
 'confirm-purge-top' => 'Մաքրե՞լ այս էջի քեշը։',
 
 # action=watch/unwatch
+'confirm-watch-button' => 'ԼԱՎ',
 'confirm-watch-top' => 'Ավելացնե՞լ ձեր հսկացանկին',
+'confirm-unwatch-button' => 'ԼԱՎ',
 'confirm-unwatch-top' => 'Հեռացնե՞լ ձեր հսկացանկից։',
 
 # Multipage image navigation
@@ -2461,7 +2566,7 @@ $3
 'autosumm-blank' => 'Ջնջվում է էջի ամբողջ պարունակությունը',
 'autosumm-replace' => "Փոխվում է էջը '$1'-ով",
 'autoredircomment' => 'Վերահղվում է դեպի [[$1]]',
-'autosumm-new' => 'Նոր էջ. $1',
+'autosumm-new' => 'Նոր էջ «$1»:',
 
 # Size units
 'size-bytes' => '$1 բայթ',
@@ -2510,11 +2615,19 @@ $3
 'version' => 'ՄեդիաՎիքի տարբերակը',
 
 # Special:FilePath
-'filepath-page' => 'Õ\96Õ¡ÕµÕ¬:',
+'filepath-page' => 'Õ\86Õ«Õ·Ö\84Õ\9d',
 'filepath-submit' => 'Անցնել',
 
 # Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Փնտրել կրկնօրինակ պատկերներ',
+'fileduplicatesearch-summary' => 'Փնտրել կրկնօրինակ պատկերներ՝ հեշ արժեքների հիման վրա',
+'fileduplicatesearch-legend' => 'Փնտրել կրկնօրինակներ',
+'fileduplicatesearch-filename' => 'Նիշքի անուն․',
 'fileduplicatesearch-submit' => 'Որոնել',
+'fileduplicatesearch-info' => '$1 × $2 փիքսել<br />Նիշքի չափը՝ $3<br />MIME-տիպը՝ $4',
+'fileduplicatesearch-result-1' => '$1 նիշքը կրկնօրինակներ չունի',
+'fileduplicatesearch-result-n' => '$1 նիշքն ունի {{PLURAL:$2|1 նույնական կրկնօրինակ|$2 նույնական կրկնօրինակ}}.',
+'fileduplicatesearch-noresults' => '$1 անունով նիշք չի գտնվել',
 
 # Special:SpecialPages
 'specialpages' => 'Սպասարկող էջեր',
@@ -2543,8 +2656,14 @@ $3
 'tags-edit' => 'խմբագրել',
 
 # Special:ComparePages
+'comparepages' => 'Համեմատել էջեր',
+'compare-selector' => 'Համեմատել էջի տարբերակներ',
 'compare-page1' => 'Էջ 1',
 'compare-page2' => 'Էջ 2',
+'compare-submit' => 'Համեմատել',
+'compare-invalid-title' => 'Ձեր նշած վերնագիրը անվավեր է։',
+'compare-title-not-exists' => 'Ձեր նշած վերնագիրը գոյություն չունի:',
+'compare-revision-not-exists' => 'Ձեր նշած փոփոխությունը գոյություն չունի։',
 
 # Database error messages
 'dberr-header' => 'Այս վիքիում խնդիրներ են առաջացել',
@@ -2573,5 +2692,26 @@ $3
 'logentry-newusers-newusers' => '$1 մասնակիցը ստեղծեց նոր հաշիվ',
 'logentry-newusers-create' => '$1 մասնակիցը ստեղծեց նոր հաշիվ',
 'logentry-newusers-create2' => '$1 Ստեղծեց նոր հաշիվ $3',
+'newuserlog-byemail' => 'Գաղտնաբառն ուղարկված է էլ․ փոստով',
+
+# Feedback
+'feedback-subject' => 'Թեմա.',
+'feedback-message' => 'Հաղորդագրություն․',
+'feedback-cancel' => 'Բեկանել',
+'feedback-close' => 'Արված է',
+
+# Search suggestions
+'searchsuggest-search' => 'Որոնել',
+
+# 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 135e150..05408b5 100644 (file)
@@ -12,6 +12,7 @@
  * @author Malafaya
  * @author McDutchie
  * @author Reedy
+ * @author Yfdyh000
  * @author לערי ריינהארט
  */
 
@@ -110,7 +111,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Modificationes_recente' ),
        'Recentchangeslinked'       => array( 'Modificationes_recente_ligate', 'Modificationes_connexe' ),
        'Revisiondelete'            => array( 'Deletion_de_versiones' ),
-       'RevisionMove'              => array( 'Displaciar_versiones' ),
        'Search'                    => array( 'Recerca' ),
        'Shortpages'                => array( 'Paginas_curte' ),
        'Specialpages'              => array( 'Paginas_special' ),
@@ -191,7 +191,7 @@ $messages = array(
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Nunquam',
-'underline-default' => 'Secundo le configuration del navigator',
+'underline-default' => 'Como definite per tu navigator o apparentia',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stilo de litteras del area de modification:',
@@ -276,8 +276,8 @@ $messages = array(
 'newwindow' => '(se aperi in un nove fenestra)',
 'cancel' => 'Cancellar',
 'moredotdotdot' => 'Plus...',
-'mypage' => 'Mi pagina',
-'mytalk' => 'Mi discussion',
+'mypage' => 'Pagina',
+'mytalk' => 'Discussion',
 'anontalk' => 'Discussion pro iste adresse IP',
 'navigation' => 'Navigation',
 'and' => '&#32;e',
@@ -287,7 +287,6 @@ $messages = array(
 'qbbrowse' => 'Foliar',
 'qbedit' => 'Modificar',
 'qbpageoptions' => 'Iste pagina',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Mi paginas',
 'qbspecialpages' => 'Paginas special',
 'faq' => 'FAQ',
@@ -300,7 +299,7 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Cambiar protection',
-'vector-simplesearch-preference' => 'Activar le suggestiones de recerca meliorate (solmente in apparentia Vector)',
+'vector-simplesearch-preference' => 'Activar le barra de recerca simplificate (solmente in apparentia Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Modificar',
 'vector-view-history' => 'Vider historia',
@@ -310,6 +309,7 @@ $messages = array(
 'namespaces' => 'Spatios de nomines',
 'variants' => 'Variantes',
 
+'navigation-heading' => 'Menu de navigation',
 'errorpagetitle' => 'Error',
 'returnto' => 'Retornar a $1.',
 'tagline' => 'De {{SITENAME}}',
@@ -552,10 +552,10 @@ Le administrator qui lo blocava offereva iste explication: "$3".',
 # Login and logout pages
 'logouttext' => "'''Tu ha claudite le session.'''
 
-Tu pote continuar a usar {{SITENAME}} anonymemente, o tu pote [[Special:UserLogin|aperir un nove session]] con le mesme nomine de usator o con un altere.
+Tu pote continuar a usar {{SITENAME}} anonymemente, o tu pote <span class='plainlinks'>[$1 aperir un nove session]</span> con le mesme nomine de usator o con un altere.
 Nota que alcun paginas pote continuar a apparer como si tu esserea ancora authenticate. Pro remediar isto, tu pote vacuar le cache de tu navigator.",
-'welcomecreation' => '== Benvenite, $1! ==
-Tu conto ha essite create.
+'welcomeuser' => 'Benvenite, $1!',
+'welcomecreation-msg' => 'Tu conto ha essite create.
 Non oblida personalisar tu [[Special:Preferences|preferentias in {{SITENAME}}]].',
 'yourname' => 'Nomine de usator:',
 'yourpassword' => 'Contrasigno:',
@@ -825,9 +825,9 @@ Si tu es un usator anonyme e pensa que commentos irrelevante ha essite dirigite
 Tu pote [[Special:Search/{{PAGENAME}}|cercar le titulo de iste pagina]] in altere paginas,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente],
 o [{{fullurl:{{FULLPAGENAME}}|action=edit}} modificar iste pagina]</span>.',
-'noarticletext-nopermission' => 'Al momento il non ha texto in iste pagina.
+'noarticletext-nopermission' => 'In iste 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>',
+o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cercar in le registros pertinente], ma tu non ha le permission de crear iste pagina.</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.
@@ -857,7 +857,7 @@ Memora que le paginas .css and .js personalisate usa un titulo in minusculas, p.
 'note' => "'''Nota:'''",
 'previewnote' => "'''Isto es solmente un previsualisation.'''
 Le modificationes non ha ancora essite publicate!",
-'continue-editing' => 'Continuar a modificar',
+'continue-editing' => 'Saltar al quadro de modification',
 'previewconflict' => 'Iste previsualisation reflecte le apparentia final del texto in le area de modification superior
 si tu opta pro publicar lo.',
 'session_fail_preview' => "'''Nos non poteva processar tu modification proque nos perdeva le datos del session.
@@ -941,6 +941,15 @@ Pare que illo ha essite delite.',
 'edit-already-exists' => 'Non poteva crear un nove pagina.
 Illo existe ja.',
 'defaultmessagetext' => 'Texto predefinite del message',
+'content-failed-to-parse' => 'Impossibile processar le contento $2 pro le modello $1: $3',
+'invalid-content-data' => 'Datos de contento invalide',
+'content-not-allowed-here' => 'Le contento "$1" non es permittite in le pagina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitexto',
+'content-model-text' => 'texto simple',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Attention: Iste pagina contine troppo de appellos costose al functiones del analysator syntactic.
@@ -1100,7 +1109,9 @@ Per favor verifica le registros.',
 'revdelete-only-restricted' => 'Error de celar le entrata del $1 a $2: tu non pote render entratas invisibile a administratores sin seliger tamben un del altere optiones de visibilitate.',
 'revdelete-reason-dropdown' => '*Motivos commun pro deletion
 ** Violation de copyright
-** Information personal inappropriate',
+** Information personal o commento inappropriate
+** Nomine de usator inappropriate
+** Information que pote esser diffamatori',
 'revdelete-otherreason' => 'Altere/additional motivo:',
 'revdelete-reasonotherlist' => 'Altere motivo',
 'revdelete-edit-reasonlist' => 'Modificar motivos pro deletion',
@@ -1199,8 +1210,6 @@ Detalios se trova in le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}
 'search-interwiki-caption' => 'Projectos fratres',
 'search-interwiki-default' => 'Resultatos de $1:',
 'search-interwiki-more' => '(plus)',
-'search-mwsuggest-enabled' => 'con suggestiones',
-'search-mwsuggest-disabled' => 'sin suggestiones',
 'search-relatedarticle' => 'Connexe',
 'mwsuggest-disable' => 'Disactivar suggestiones via AJAX',
 'searcheverything-enable' => 'Cercar in tote le spatios de nomines',
@@ -1236,7 +1245,7 @@ Nota que lor indices del contento de {{SITENAME}} pote esser obsolete.',
 
 # Preferences page
 'preferences' => 'Preferentias',
-'mypreferences' => 'Mi preferentias',
+'mypreferences' => 'Preferentias',
 'prefs-edits' => 'Numero de modificationes:',
 'prefsnologin' => 'Tu non ha aperite un session',
 'prefsnologintext' => 'Tu debe <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aperir session]</span> pro configurar preferentias de usator.',
@@ -1299,7 +1308,7 @@ Ecce un valor aleatorimente generate que tu pote usar: $1',
 'timezoneregion-indian' => 'Oceano Indian',
 'timezoneregion-pacific' => 'Oceano Pacific',
 'allowemail' => 'Activar reception de e-mail de altere usatores',
-'prefs-searchoptions' => 'Optiones de recerca',
+'prefs-searchoptions' => 'Recerca',
 'prefs-namespaces' => 'Spatios de nomines',
 'defaultns' => 'Alteremente cercar in iste spatios de nomines:',
 'default' => 'predefinite',
@@ -1468,6 +1477,9 @@ Si tu opta pro dar lo, isto essera usate pro dar te attribution pro tu contribut
 'rightslogtext' => 'Isto es un registro de cambios in derectos de usator.',
 'rightslogentry' => 'cambiava le gruppos del quales $1 es membro de $2 a $3',
 'rightslogentry-autopromote' => 'ha essite automaticamente promovite de $2 a $3',
+'logentry-rights-rights' => '$1 cambiava le appertinentia a gruppos pro $3 de $4 a $5',
+'logentry-rights-rights-legacy' => '$1 cambiava le appertinentia a gruppos pro $3',
+'logentry-rights-autopromote' => '$1 ha essite automaticamente promovite de $4 a $5',
 'rightsnone' => '(nulle)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1715,6 +1727,7 @@ Si le problema persiste, contacta un [[Special:ListUsers/sysop|administrator]].'
 'backend-fail-notsame' => 'Un file non identic jam existe a $1.',
 'backend-fail-invalidpath' => '$1 non es un cammino valide de immagazinage.',
 'backend-fail-delete' => 'Impossibile deler file $1.',
+'backend-fail-describe' => 'Impossibile cambiar le metadatos pro le file "$1".',
 'backend-fail-alreadyexists' => 'Le file $1 jam existe.',
 'backend-fail-store' => 'Non poteva immagazinar le file $1 a $2',
 'backend-fail-copy' => 'Impossibile copiar file $1 a $2',
@@ -1731,7 +1744,7 @@ Si le problema persiste, contacta un [[Special:ListUsers/sysop|administrator]].'
 'backend-fail-internal' => 'Un error incognite occurreva in le systema de immagazinage "$1".',
 'backend-fail-contenttype' => 'Non poteva determinar le typo de contento del file a immagazinar in "$1".',
 'backend-fail-batchsize' => 'Le systema de immagazinage ha recipite un lot de $1 {{PLURAL:$1|operation|operationes}} de file; le limite es $2 {{PLURAL:$2|operation|operationes}}.',
-'backend-fail-usable' => 'Non poteva scriber le file $1 a causa de permissiones insufficiente o directorios/contentores mancante.',
+'backend-fail-usable' => 'Non poteva leger o scriber le file "$1" a causa de permissiones insufficiente o directorios/contentores mancante.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Non poteva connecter al base de datos de jornal pro le systema de immagazinage "$1".',
@@ -1866,7 +1879,7 @@ Tu vole forsan modificar le description in le [$2 pagina de description del file
 'uploadnewversion-linktext' => 'Incargar un nove version de iste file',
 'shared-repo-from' => 'ab $1',
 'shared-repo' => 'un repositorio partite',
-'upload-disallowed-here' => 'Infortunatemente tu non pote superscriber iste imagine.',
+'upload-disallowed-here' => 'Tu non pote superscriber iste file.',
 
 # File reversion
 'filerevert' => 'Reverter $1',
@@ -1947,7 +1960,8 @@ Memora verificar que non existe altere ligamines al patronos ante que tu los del
 'statistics-mostpopular' => 'Le paginas plus visitate',
 
 'disambiguations' => 'Paginas con ligamines a paginas de disambiguation',
-'disambiguationspage' => 'Template:Disambiguation',
+'disambiguationspage' => 'Template:Disambig
+Template:Disambiguation',
 '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]].",
@@ -2105,8 +2119,8 @@ Vide etiam le [[Special:WantedCategories|categorias desirate]].',
 'linksearch-ns' => 'Spatio de nomines:',
 '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: <code>$1</code> (non include alcun de istes in tu recerca).',
+Isto necessita specificar al minus le dominio de nivello superior, per exemplo "*.org".<br />
+Protocollos supportate: <code>$1</code> (http:// es assumite si nulle protocollo es specificate).',
 'linksearch-line' => '$1 ligate ab $2',
 'linksearch-error' => 'Le metacharacteres pote apparer solmente al initio del nomine de host.',
 
@@ -2157,9 +2171,9 @@ pro inviar e-mail a altere usatores.',
 '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
-como le adresse del expeditor del e-mail, de modo que le destinatario pote responder directemente a te.',
+'emailpagetext' => 'Le formulario sequente es pro inviar un message de e-mail a iste {{GENDER:$1|usator}}.
+Le adresse de e-mail que tu specificava in [[Special:Preferences|tu preferentias de usator]] apparera
+como le adresse del expeditor, de sorta que le destinatario potera responder te directemente.',
 'usermailererror' => 'Le objecto de e-mail retornava le error:',
 'defemailsubject' => 'E-mail del usator "$1" de {{SITENAME}}',
 'usermaildisabled' => 'E-mail a usatores disactivate',
@@ -2190,7 +2204,7 @@ como le adresse del expeditor del e-mail, de modo que le destinatario pote respo
 
 # Watchlist
 'watchlist' => 'Mi observatorio',
-'mywatchlist' => 'Mi observatorio',
+'mywatchlist' => 'Observatorio',
 'watchlistfor2' => 'De $1 $2',
 'nowatchlist' => 'Tu non ha paginas sub observation.',
 'watchlistanontext' => 'Tu debe $1 pro poter vider o modificar entratas in tu observatorio.',
@@ -2228,11 +2242,7 @@ render lo plus facile de deteger.",
 
 'enotif_mailer' => 'Systema de notification via e-mail de {{SITENAME}}',
 'enotif_reset' => 'Marcar tote le paginas como visitate',
-'enotif_newpagetext' => 'Isto es un nove pagina.',
 'enotif_impersonal_salutation' => 'Usator de {{SITENAME}}',
-'changed' => 'modificate',
-'created' => 'create',
-'enotif_subject' => 'Le pagina $PAGETITLE de {{SITENAME}} ha essite $CHANGEDORCREATED per $PAGEEDITOR',
 'enotif_lastvisited' => 'Vide $1 pro tote le modificationes depost tu ultime visita.',
 'enotif_lastdiff' => 'Vide $1 pro revider iste modification.',
 'enotif_anon_editor' => 'usator anonyme $1',
@@ -2426,8 +2436,8 @@ Es possibile que le adresse URL es invalide, o que le version ha essite restaura
 'undeletedrevisions' => '{{PLURAL:$1|1 version|$1 versiones}} restaurate',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 version|$1 versiones}} e {{PLURAL:$2|1 file|$2 files}} restaurate',
 'undeletedfiles' => '$1 {{PLURAL:$1|archivo|archivos}} restaurate',
-'cannotundelete' => 'Le restauration ha fallite;
-es possibile que un altere persona ha ja restaurate le pagina.',
+'cannotundelete' => 'Le restauration ha fallite:
+$1',
 'undeletedpage' => "'''$1 ha essite restaurate'''
 
 Consulta le [[Special:Log/delete|registro de deletiones]] pro un lista de deletiones e restaurationes recente.",
@@ -2461,7 +2471,7 @@ $1',
 # Contributions
 'contributions' => 'Contributiones del usator',
 'contributions-title' => 'Contributiones del usator $1',
-'mycontris' => 'Mi contributiones',
+'mycontris' => 'Contributiones',
 'contribsub2' => 'Pro $1 ($2)',
 'nocontribs' => 'Necun modification ha essite trovate secundo iste criterios.',
 'uctop' => '(ultime)',
@@ -2501,7 +2511,7 @@ Le ultime entrata del registro de blocadas es reproducite hic infra pro informat
 'whatlinkshere-hideredirs' => '$1 redirectiones',
 'whatlinkshere-hidetrans' => '$1 transclusiones',
 'whatlinkshere-hidelinks' => '$1 ligamines',
-'whatlinkshere-hideimages' => '$1 ligamines verso imagines',
+'whatlinkshere-hideimages' => '$1 le ligamines a files',
 'whatlinkshere-filters' => 'Filtros',
 
 # Block/unblock
@@ -2742,6 +2752,7 @@ non pote renominar un pagina al mesme titulo.',
 'immobile-target-namespace-iw' => 'Un ligamine interwiki non es un destination valide pro le renomination de un pagina.',
 'immobile-source-page' => 'Iste pagina non es renominabile.',
 'immobile-target-page' => 'Non pote renominar a iste titulo de destination.',
+'bad-target-model' => 'Le destination desirate usa un altere modello de contento. Non es possibile converter de $1 a $2.',
 'imagenocrossnamespace' => 'Impossibile renominar un file verso un spatio de nomines non-file',
 'nonfile-cannot-move-to-file' => 'Impossibile renominar un non-file verso le spatio de nomines file',
 'imagetypemismatch' => 'Le nove extension del nomine del file non corresponde al typo del file',
@@ -2866,7 +2877,6 @@ Salveguarda lo in tu computator e incarga lo hic.',
 
 # JavaScriptTest
 'javascripttest' => 'Test de JavaScript',
-'javascripttest-disabled' => 'Iste function non ha essite activate in iste wiki.',
 'javascripttest-title' => 'Execution de $1 tests',
 'javascripttest-pagetext-noframework' => 'Iste pagina es reservate pro le execution de tests de JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Structura de test "$1" incognite.',
@@ -2999,6 +3009,7 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 
 # Info page
 'pageinfo-title' => 'Informationes pro "$1"',
+'pageinfo-not-current' => 'Regrettabilemente, il es impossibile fornir iste information pro versiones ancian.',
 'pageinfo-header-basic' => 'Information de base',
 'pageinfo-header-edits' => 'Historia de modificationes',
 'pageinfo-header-restrictions' => 'Protection del pagina',
@@ -3007,6 +3018,7 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'pageinfo-default-sort' => 'Clave de ordination predefinite',
 'pageinfo-length' => 'Dimension del pagina (in bytes)',
 'pageinfo-article-id' => 'ID del pagina',
+'pageinfo-language' => 'Lingua del contento del pagina',
 'pageinfo-robot-policy' => 'Stato del motor de recerca',
 'pageinfo-robot-index' => 'Indexabile',
 'pageinfo-robot-noindex' => 'Non indexabile',
@@ -3023,10 +3035,17 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Information sur le pagina',
+'pageinfo-redirectsto' => 'Redirige a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Contate como pagina de contento',
+'pageinfo-contentpage-yes' => 'Si',
+'pageinfo-protect-cascading' => 'Protection in cascada a partir de hic',
+'pageinfo-protect-cascading-yes' => 'Si',
+'pageinfo-protect-cascading-from' => 'Protection in cascada a partir de',
 
 # Skin names
 'skinname-standard' => 'Classic',
@@ -3048,6 +3067,8 @@ Le causa es probabilemente un ligamine verso un sito externe que es presente in
 'markedaspatrollederror' => 'Impossibile marcar como patruliate',
 'markedaspatrollederrortext' => 'Tu debe specificar un version a marcar como patruliate.',
 'markedaspatrollederror-noautopatrol' => 'Tu non es permittite a marcar tu proprie modificationes como patruliate.',
+'markedaspatrollednotify' => 'Iste modification de $1 ha essite marcate como patruliate.',
+'markedaspatrollederrornotify' => 'Le marcar como patruliate ha fallite.',
 
 # Patrol log
 'patrol-log-page' => 'Registro de patrulia',
@@ -3111,6 +3132,7 @@ Le execution de illo pote compromitter le securitate de tu systema.",
 'hours' => '{{PLURAL:$1|$1 hora|$1 horas}}',
 'days' => '{{PLURAL:$1|$1 die|$1 dies}}',
 'ago' => '$1 retro',
+'just-now' => 'Justo nunc',
 
 # Bad image list
 'bad_image_list' => 'Le formato es como seque:
@@ -3613,6 +3635,7 @@ Iste codice de confirmation expirara a $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Le transclusion interwiki es disactivate]',
 'scarytranscludefailed' => '[Falleva de obtener le patrono pro $1]',
+'scarytranscludefailed-httpstatus' => '[Obtention de patrono fallite pro $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL es troppo longe]',
 
 # Delete conflict
@@ -3722,6 +3745,7 @@ Tu pote etiam [[Special:EditWatchlist|usar le editor standard]].',
 'version-license' => 'Licentia',
 'version-poweredby-credits' => "Iste wiki es actionate per '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'alteres',
+'version-credits-summary' => 'Nos vole recognoscer le sequente personas pro lor contribution a [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki es software libere; vos pote redistribuer lo e/o modificar lo sub le conditiones del Licentia Public General de GNU publicate per le Free Software Foundation; version 2 del Licentia, o (a vostre option) qualcunque version posterior.
 
 Iste programma es distribuite in le sperantia que illo sia utile, ma SIN GARANTIA; sin mesmo le implicite garantia de COMMERCIALISATION o APTITUDE PRO UN PROPOSITO PARTICULAR. Vide le Licentia Public General de GNU pro plus detalios.
@@ -3863,9 +3887,9 @@ Le imagines se monstra in plen resolution, le altere typos de file se executa di
 'logentry-move-move_redir-noredirect' => '$1 renominava le pagina $3 a $4, superscribente un redirection sin lassar un nove redirection',
 'logentry-patrol-patrol' => '$1 marcava le version $4 del pagina $3 como patruliate',
 'logentry-patrol-patrol-auto' => '$1 automaticamente marcava le version $4 del pagina $3 como patruliate',
-'logentry-newusers-newusers' => '$1 creava un conto de usator',
-'logentry-newusers-create' => '$1 creava un conto de usator',
-'logentry-newusers-create2' => '$1 creava un conto de usator $3',
+'logentry-newusers-newusers' => 'Le conto de usator $1 ha essite create',
+'logentry-newusers-create' => 'Le conto de usator $1 ha essite create',
+'logentry-newusers-create2' => 'Le conto de usator $3 ha essite create per $1',
 'logentry-newusers-autocreate' => 'Le conto $1 ha essite create automaticamente',
 'newuserlog-byemail' => 'contrasigno inviate per e-mail',
 
@@ -3885,6 +3909,10 @@ Si non, tu pote usar le formulario facile hic infra. Tu commento essera addite a
 'feedback-bugcheck' => 'Bon! Ma per favor verifica que iste falta non es [$1 jam cognoscite].',
 'feedback-bugnew' => 'Si, io lo ha verificate; reportar un nove falta',
 
+# Search suggestions
+'searchsuggest-search' => 'Cercar',
+'searchsuggest-containing' => 'continente...',
+
 # API errors
 'api-error-badaccess-groups' => 'Tu non ha le permission de incargar files in iste wiki.',
 'api-error-badtoken' => 'Error interne: indicio invalide.',
index cd02b48..5a59d46 100644 (file)
@@ -80,7 +80,6 @@ $magicWords = array(
        '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' ),
@@ -283,7 +282,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Perubahan_terbaru', 'PerubahanTerbaru', 'RC', 'PT' ),
        'Recentchangeslinked'       => array( 'Perubahan_terkait', 'PerubahanTerkait' ),
        'Revisiondelete'            => array( 'Hapus_revisi', 'HapusRevisi' ),
-       'RevisionMove'              => array( 'Revisi_pemindahan', 'RevisiPemindahan' ),
        'Search'                    => array( 'Pencarian', 'Cari' ),
        'Shortpages'                => array( 'Halaman_pendek', 'HalamanPendek' ),
        'Specialpages'              => array( 'Halaman_istimewa', 'HalamanIstimewa' ),
@@ -385,7 +383,7 @@ $messages = array(
 
 'underline-always' => 'Selalu',
 'underline-never' => 'Tidak pernah',
-'underline-default' => 'Bawaan penjelajah web',
+'underline-default' => 'Kulit atau penjelajah bawaan',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Gaya tulisan komputer pada kotak penyuntingan:',
@@ -470,8 +468,8 @@ $messages = array(
 'newwindow' => '(buka di jendela baru)',
 'cancel' => 'Batalkan',
 'moredotdotdot' => 'Lainnya...',
-'mypage' => 'Halaman saya',
-'mytalk' => 'Pembicaraan saya',
+'mypage' => 'Halaman',
+'mytalk' => 'Pembicaraan',
 'anontalk' => 'Pembicaraan IP ini',
 'navigation' => 'Navigasi',
 'and' => '&#32;dan',
@@ -481,7 +479,6 @@ $messages = array(
 'qbbrowse' => 'Navigasi',
 'qbedit' => 'Sunting',
 'qbpageoptions' => 'Halaman ini',
-'qbpageinfo' => 'Konteks halaman',
 'qbmyoptions' => 'Halaman saya',
 'qbspecialpages' => 'Halaman istimewa',
 'faq' => 'FAQ',
@@ -494,7 +491,7 @@ $messages = array(
 'vector-action-protect' => 'Lindungi',
 'vector-action-undelete' => 'Pembatalan penghapusan',
 'vector-action-unprotect' => 'Ubah perlindungan',
-'vector-simplesearch-preference' => 'Aktifkan pencarian saran yang disempurnakan (hanya kulit Vector)',
+'vector-simplesearch-preference' => 'Aktifkan bilah pencarian sederhana (hanya kulit Vector)',
 'vector-view-create' => 'Buat',
 'vector-view-edit' => 'Sunting',
 'vector-view-history' => 'Versi terdahulu',
@@ -657,9 +654,9 @@ Daftar halaman istimewa yang sah dapat dilihat di [[Special:SpecialPages|{{int:s
 'dberrortext' => 'Ada kesalahan sintaks pada permintaan basis data.
 Kesalahan ini mungkin menandakan adanya sebuah \'\'bug\'\' dalam perangkat lunak.
 Permintaan basis data yang terakhir adalah:
-<blockquote><tt>$1</tt></blockquote>
-dari dalam fungsi "<tt>$2</tt>".
-Basis data menghasilkan kesalahan "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+dari dalam fungsi "<code>$2</code>".
+Basis data menghasilkan kesalahan "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Ada kesalahan sintaks pada permintaan basis data.
 Permintaan basis data yang terakhir adalah:
 "$1"
@@ -707,9 +704,9 @@ Mungkin telah dihapus oleh orang lain.',
 'protectedpagetext' => 'Halaman ini telah dikunci untuk menghindari penyuntingan.',
 'viewsourcetext' => 'Anda dapat melihat atau menyalin sumber halaman ini:',
 'viewyourtext' => "Anda dapat melihat atau menyalin sumber dari '''suntingan Anda''' ke halaman ini:",
-'protectedinterface' => 'Halaman ini berisi teks antarmuka untuk digunakan oleh perangkat lunak dan telah dikunci untuk menghindari kesalahan.',
-'editinginterface' => "'''Peringatan:''' Anda menyunting suatu halaman yang digunakan untuk menyediakan teks antarmuka untuk perangkat lunak situs ini. Perubahan teks ini akan mempengaruhi tampilan pada antarmuka pengguna untuk pengguna lain.
-Untuk terjemahan, harap gunakan [//translatewiki.net/wiki/Main_Page?setlang=id translatewiki.net], proyek pelokalan MediaWiki.",
+'protectedinterface' => 'Halaman ini memuat teks antarmuka untuk perangkat lunak pada wiki ini, dan dilindungi terhadap penyalahgunaan. Untuk menambah atau mengubah terjemahan pada semua wiki, harap gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.',
+'editinginterface' => "'''Peringatan:''' Anda menyunting suatu halaman yang digunakan untuk menyediakan teks antarmuka untuk perangkat lunak situs ini. Perubahan teks ini akan memengaruhi tampilan pada antarmuka pengguna untuk pengguna lain di wiki ini.
+Untuk menambah atau mengubahterjemahan untuk semua wiki, harap gunakan [//translatewiki.net/ translatewiki.net], proyek pelokalan MediaWiki.",
 'sqlhidden' => '(Permintaan SQL disembunyikan)',
 'cascadeprotected' => 'Halaman ini telah dilindungi dari penyuntingan karena disertakan di {{PLURAL:$1|halaman|halaman-halaman}} berikut yang telah dilindungi dengan opsi "runtun":
 $2',
@@ -735,11 +732,10 @@ Administrator yang terkunci menawarkan penjelasan ini: " $3 ".',
 # Login and logout pages
 'logouttext' => "'''Anda telah keluar log dari sistem.'''
 
-Anda dapat terus menggunakan {{SITENAME}} secara anonim, atau Anda dapat [[Special:UserLogin|masuk log lagi]] sebagai pengguna yang sama atau pengguna yang lain.
+Anda dapat terus menggunakan {{SITENAME}} secara anonim, atau Anda dapat <span class='plainlinks'>[$1 masuk log lagi]</span> sebagai pengguna yang sama atau pengguna yang lain.
 Perhatikan bahwa beberapa halaman mungkin masih terus menunjukkan bahwa Anda masih masuk log sampai Anda membersihkan singgahan penjelajah web Anda",
-'welcomecreation' => '== Selamat datang, $1! ==
-
-Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Anda.',
+'welcomeuser' => 'Selamat datang,  $1 !',
+'welcomecreation-msg' => 'Akun Anda telah dibuat. Jangan lupa mengatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Anda.',
 'yourname' => 'Nama pengguna:',
 'yourpassword' => 'Kata sandi:',
 'yourpasswordagain' => 'Ulangi kata sandi:',
@@ -985,8 +981,8 @@ Alamat IP seperti ini mungkin dipakai bersama oleh beberapa pengguna yang berbed
 Jika Anda adalah seorang pengguna anonim dan merasa mendapatkan komentar-komentar yang tidak relevan yang ditujukan langsung kepada Anda, silakan [[Special:UserLogin/signup|membuat akun]] atau [[Special:UserLogin|masuk log]] untuk menghindari kerancuan dengan pengguna anonim lainnya di lain waktu.''",
 'noarticletext' => '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>.',
-'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>.',
+'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, atau <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mencari log terkait]</span>, tapi anda tidak memiliki izin untuk membuat halaman ini',
 'missing-revision' => 'Revisi #$1 halaman berjudul "{{PAGENAME}}" tidak eksks.
 
 Hal ini biasanya disebabkan oleh tautan versi terdahulu menuju halaman yang sudah dihapus.
@@ -995,11 +991,10 @@ Rinciannya dapat ditemukan di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'userpage-userdoesnotexist-view' => 'Pengguna "$1" tidak terdaftar.',
 'blocked-notice-logextract' => 'Pengguna ini sedang diblokir.
 Entri log pemblokiran terakhir tersedia di bawah ini sebagai rujukan.',
-'clearyourcache' => "'''Catatan:''' Setelah menyimpan, Anda mungkin harus memotong tembolok peramban Anda untuk melihat perubahan.
+'clearyourcache' => "'''Catatan:''' Setelah menyimpan, Anda mungkin harus memintas singgahan peramban Anda untuk melihat perubahan.
 * '''Firefox / Safari:''' Tahan ''Shift'' sambil mengeklik ''Reload'', atau tekan ''Ctrl-F5'' atau ''Ctrl-R'' (''⌘-R'' di Mac)
 * '''Google Chrome:''' Tekan ''Ctrl-Shift-R'' (''⌘-Shift-R'' di Mac)
 * '''Internet Explorer:''' Tahan ''Ctrl'' sambl mengeklik ''Refresh'', atau tekan ''Ctrl-F5''
-* '''Konqueror:''' Klik ''Reload'' atau tekan ''F5''
 * '''Opera:''' Bersihkan tembolok di ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Tips:''' Gunakan tombol \"{{int:showpreview}}\" untuk menguji CSS baru Anda sebelum menyimpannya.",
 'userjsyoucanpreview' => "'''Tips:''' Gunakan tombol \"{{int:showpreview}}\" untuk menguji JS baru Anda sebelum menyimpannya.",
@@ -1094,6 +1089,14 @@ Halaman kemungkinan telah dihapus.',
 'edit-already-exists' => 'Tidak dapat membuat halaman baru
 karena telah ada.',
 'defaultmessagetext' => 'Teks baku',
+'invalid-content-data' => 'Data konten tidak sah',
+'content-not-allowed-here' => 'Konten "$1" tidak diizinkan di halaman [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'teks wiki',
+'content-model-text' => 'teks polos',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Peringatan: Halaman ini mengandung terlalu banyak panggilan fungsi parser.
@@ -1114,6 +1117,7 @@ Beberapa templat akan diabaikan.',
 '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' => 'Kesalahan terdeteksi di aturan konversi bahasa manual',
 
 # "Undo" feature
 'undo-success' => 'Suntingan ini dapat dibatalkan. Tolong cek perbandingan di bawah untuk meyakinkan bahwa benar itu yang Anda ingin lakukan, lalu simpan perubahan tersebut untuk menyelesaikan pembatalan suntingan.',
@@ -1244,9 +1248,10 @@ Anda tidak memiliki akses ke revisi ini.',
 'revdelete-concurrent-change' => 'Gagal mengubah revisi per $2, $1: statusnya kemungkinan telah diubah oleh pengguna lain bersamaan dengan Anda.
 Silakan periksa catatan log.',
 'revdelete-only-restricted' => 'Kesalahan sewaktu menyembunyikan butir bertanggal $2, $1: Anda tidak dapat menyembunyikan butir dari pengurus tanpa memilih juga salah satu opsi penyembunyian lainnya.',
-'revdelete-reason-dropdown' => '*Alasan penghapusan
+'revdelete-reason-dropdown' => '*Alasan penghapusan yang umum
 ** Pelanggaran hak cipta
-** Informasi pribadi yang tidak pantas
+** Komentar atau informasi pribadi yang tidak pantas
+** Nama pengguna yang tidak pantas
 ** Berpotensi mencemarkan nama baik',
 'revdelete-otherreason' => 'Alasan lain/tambahan:',
 'revdelete-reasonotherlist' => 'Alasan lain',
@@ -1340,8 +1345,6 @@ Pastikan bahwa perubahan ini tetap mempertahankan kontinuitas versi terdahulu ha
 'search-interwiki-caption' => 'Proyek lain',
 'search-interwiki-default' => 'Hasil $1:',
 'search-interwiki-more' => '(selanjutnya)',
-'search-mwsuggest-enabled' => 'dengan saran',
-'search-mwsuggest-disabled' => 'tidak ada saran',
 'search-relatedarticle' => 'Berkaitan',
 'mwsuggest-disable' => 'Non-aktifkan saran AJAX',
 'searcheverything-enable' => 'Cari di semua ruang nama',
@@ -1376,7 +1379,7 @@ Perlu diingat bahwa indeks Google untuk konten {{SITENAME}} mungkin belum mencak
 
 # Preferences page
 'preferences' => 'Preferensi',
-'mypreferences' => 'Preferensi saya',
+'mypreferences' => 'Preferensi',
 'prefs-edits' => 'Jumlah suntingan:',
 'prefsnologin' => 'Belum masuk log',
 'prefsnologintext' => 'Anda harus <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} masuk log]</span> untuk mengeset preferensi Anda.',
@@ -1438,7 +1441,7 @@ Berikut ini adalah nilai acak yang dapat Anda gunakan: $1',
 'timezoneregion-indian' => 'Samudera Hindia',
 'timezoneregion-pacific' => 'Samudera Pasifik',
 'allowemail' => 'Izinkan pengguna lain mengirim surel',
-'prefs-searchoptions' => 'Pencarian',
+'prefs-searchoptions' => 'Cari',
 'prefs-namespaces' => 'Ruang nama',
 'defaultns' => 'Atau cari dalam ruang-ruang nama berikut:',
 'default' => 'baku',
@@ -1844,7 +1847,7 @@ Silakan hubungi salah seorang [[Special:ListUsers/sysop|pengurus]].',
 'backend-fail-internal' => 'Kesalahan yang tidak dikenal terjadi di backend penyimpanan "$1".',
 'backend-fail-contenttype' => 'Tidak dapat menentukan tipe konten dari berkas yang disimpan di "$1".',
 'backend-fail-batchsize' => 'Penyimpanan backend diberikan batch $1 berkas {{PLURAL:$1||}}operasi; batasnya adalah $2 {{PLURAL:$2||}}operasi.',
-'backend-fail-usable' => 'Tidak dapat membuat berkas $1 karena izin tidak memadai atau direktori/kontainer yang hilang.',
+'backend-fail-usable' => 'Tidak dapat membaca atau menulis berkas "$1" karena izin tidak memadai atau direktori/kontainer hilang.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Tidak dapat menyambung ke database jurnal untuk penyimpanan backend "$1".',
@@ -2209,8 +2212,8 @@ Lihat pula [[Special:WantedCategories|kategori yang diinginkan]].',
 'linksearch-ns' => 'Ruang nama:',
 'linksearch-ok' => 'Cari',
 'linksearch-text' => 'Kartu liar seperti "*.wikipedia.org" dapat digunakan.
-Membutuhkan sedikitnya satu ranah tingkat atas, misalnya "*.org".<br />
-Protokol yang didukung: <code>$1</code> (jangan tambahkan dalam pencarian Anda)',
+Perlu sedikitnya satu domain tingkat atas, misalnya "*.org".<br />
+Protokol yang didukung: <code>$1</code> (menggunakan http:// bila protokol tidak ditentukan)',
 'linksearch-line' => '$1 memiliki pranala dari $2',
 'linksearch-error' => "''Wildcards'' hanya dapat digunakan di bagian awal dari nama host.",
 
@@ -2255,6 +2258,8 @@ Protokol yang didukung: <code>$1</code> (jangan tambahkan dalam pencarian Anda)'
 'mailnologin' => 'Tidak ada alamat surel',
 'mailnologintext' => 'Anda harus [[Special:UserLogin|masuk log]] dan mempunyai alamat surel yang sah di dalam [[Special:Preferences|preferensi]] untuk mengirimkan surel kepada pengguna lain.',
 'emailuser' => 'Surel pengguna',
+'emailuser-title-target' => 'Kirim surel ke {{GENDER:$1|pengguna}} ini',
+'emailuser-title-notarget' => 'Kirim surel',
 'emailpage' => 'Kirim surel ke pengguna ini',
 'emailpagetext' => 'Anda dapat menggunakan formulir di bawah ini untuk mengirimkan surel ke pengguna ini.
 Alamat surel yang Anda masukkan di [[Special:Preferences|preferensi akun Anda]] akan muncul sebagai alamat "Dari" dalam surel tersebut, sehingga penerima dapat langsung membalas kepada Anda.',
@@ -2288,7 +2293,7 @@ Alamat surel yang Anda masukkan di [[Special:Preferences|preferensi akun Anda]]
 
 # Watchlist
 'watchlist' => 'Daftar pantauan',
-'mywatchlist' => 'Pantauan saya',
+'mywatchlist' => 'Daftar pantauan',
 'watchlistfor2' => 'Untuk $1 $2',
 'nowatchlist' => 'Daftar pantauan Anda kosong.',
 'watchlistanontext' => 'Silakan $1 untuk melihat atau menyunting daftar pantauan Anda.',
@@ -2324,11 +2329,7 @@ Perubahan-perubahan berikutnya pada halaman tersebut dan halaman pembicaraan ter
 
 'enotif_mailer' => 'Pengirim Notifikasi {{SITENAME}}',
 'enotif_reset' => 'Tandai semua halaman sebagai telah dikunjungi',
-'enotif_newpagetext' => 'Ini adalah halaman baru.',
 'enotif_impersonal_salutation' => 'Pengguna {{SITENAME}}',
-'changed' => 'diubah',
-'created' => 'dibuat',
-'enotif_subject' => 'Halaman $PAGETITLE di {{SITENAME}} telah $CHANGEDORCREATED oleh $PAGEEDITOR',
 'enotif_lastvisited' => 'Lihat $1 untuk semua perubahan sejak kunjungan terakhir Anda.',
 'enotif_lastdiff' => 'Kunjungi $1 untuk melihat perubahan ini.',
 'enotif_anon_editor' => 'pengguna anonim $1',
@@ -2539,7 +2540,7 @@ $1',
 # Contributions
 'contributions' => 'Kontribusi pengguna',
 'contributions-title' => 'Kontribusi pengguna untuk $1',
-'mycontris' => 'Kontribusi saya',
+'mycontris' => 'Kontribusi',
 'contribsub2' => 'Untuk $1 ($2)',
 'nocontribs' => 'Tidak ada perubahan yang sesuai dengan kriteria tersebut.',
 'uctop' => ' (atas)',
@@ -2919,7 +2920,6 @@ Simpan ke komputer Anda dan unggah ke sini.',
 
 # JavaScriptTest
 'javascripttest' => 'Pengujian JavaScript',
-'javascripttest-disabled' => 'Fungsi ini belum diaktifkan di wiki ini.',
 'javascripttest-title' => '$1 pengujian sedang berjalan',
 'javascripttest-pagetext-noframework' => 'Halaman ini disediakan untuk pengujian JavaScript yang sedang berjalan.',
 'javascripttest-pagetext-unknownframework' => 'Pengujian kerangka kerja "$1" tidak diketahui',
@@ -3050,11 +3050,33 @@ 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-basic' => 'Informasi dasar',
+'pageinfo-header-edits' => 'Sejarah suntingan',
+'pageinfo-header-restrictions' => 'Perlindungan halaman',
+'pageinfo-header-properties' => 'Properti halaman',
+'pageinfo-display-title' => 'Judul tampilan',
+'pageinfo-default-sort' => 'Kunci urut baku',
+'pageinfo-length' => 'Panjang halaman (dalam bita)',
+'pageinfo-article-id' => 'ID Halaman',
+'pageinfo-language' => 'Bahasa isi halaman',
+'pageinfo-robot-policy' => 'Status mesin pencari',
+'pageinfo-robot-index' => 'Dapat diindeks',
+'pageinfo-robot-noindex' => 'Tidak dapat diindeks',
 'pageinfo-views' => 'Jumlah penampilan',
-'pageinfo-watchers' => 'Jumlah pemantau',
-'pageinfo-edits' => 'Jumlah suntingan',
-'pageinfo-authors' => 'Jumlah penulis yang berbeda',
+'pageinfo-watchers' => 'Jumlah pemantau halaman',
+'pageinfo-redirects-name' => 'Pengalihan ke halaman ini',
+'pageinfo-subpages-name' => 'Subhalaman halaman ini',
+'pageinfo-firstuser' => 'Pembuat halaman',
+'pageinfo-firsttime' => 'Tanggal pembuatan halaman',
+'pageinfo-lastuser' => 'Penyunting terakhir',
+'pageinfo-lasttime' => 'Tanggal suntingan terakhir',
+'pageinfo-edits' => 'Jumlah total suntingan',
+'pageinfo-authors' => 'Jumlah total penulis yang berbeda',
+'pageinfo-toolboxlink' => 'Informasi halaman',
+'pageinfo-redirectsto' => 'Beralih ke',
+'pageinfo-redirectsto-info' => 'Info',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading-yes' => 'Ya',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3917,7 +3939,7 @@ Gambar ditampilkan dalam resolusi penuh dan tipe lain berkas akan dibuka langsun
 'logentry-move-move_redir-noredirect' => '$1 memindahkan halaman $3 ke $4 melalui pengalihan tanpa membuat pengalihan',
 'logentry-patrol-patrol' => '$1 menandai revisi $4 dari halaman $3 terpatroli',
 'logentry-patrol-patrol-auto' => '$1 secara otomatis menandai revisi $4 dari halaman $3 terpatroli',
-'logentry-newusers-newusers' => '$1 membuat akun pengguna',
+'logentry-newusers-newusers' => 'Akun pengguna $1 telah dibuat',
 'logentry-newusers-create' => '$1 membuat akun pengguna',
 'logentry-newusers-create2' => '$1 membuat akun pengguna $3',
 'logentry-newusers-autocreate' => 'Akun $1 dibuat secara otomatis',
@@ -3939,6 +3961,10 @@ Jika tidak, Anda dapat menggunakan formulir mudah di bawah ini. Komentar Anda ak
 'feedback-bugcheck' => 'Hebat! Hanya periksa bahwa itu bukan satu di antara [$1 bug yang telah dikenal].',
 'feedback-bugnew' => 'Saya telah memeriksa. Laporkan bug baru',
 
+# Search suggestions
+'searchsuggest-search' => 'Cari',
+'searchsuggest-containing' => 'isian ...',
+
 # API errors
 'api-error-badaccess-groups' => 'Anda tidak diizinkan mengunggah berkas ke wiki ini.',
 'api-error-badtoken' => 'Kesalahan internal: token buruk.',
@@ -3953,7 +3979,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-banned-type' => '$1 {{PLURAL:$4|bukan ekstensi berkas yang diizinkan|bukan ekstensi berkas yang diizinkan}}. {{PLURAL:$3|Jenis berkas yang diizinkan adalah|Jenis berkas yang diizinkan 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 ec2cba0..e0235b8 100644 (file)
@@ -102,7 +102,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Nov_changes' ),
        'Recentchangeslinked'       => array( 'Changes_referet', 'Changes_relatet' ),
        'Revisiondelete'            => array( 'Deleter_revision' ),
-       'RevisionMove'              => array( 'Mover_revision' ),
        'Search'                    => array( 'Serchar' ),
        'Shortpages'                => array( 'Págines_curt' ),
        'Specialpages'              => array( 'Págines_special' ),
@@ -263,7 +262,6 @@ $messages = array(
 'qbfind' => 'Constatar',
 'qbedit' => 'Redacter',
 'qbpageoptions' => 'Págine de optiones',
-'qbpageinfo' => 'Págine de information',
 'qbmyoptions' => 'Mi optiones',
 'qbspecialpages' => 'Págines special',
 'faq' => 'FAQ',
@@ -422,11 +420,8 @@ Li motive dat es "\'\'$2\'\'".',
 
 # Login and logout pages
 'logouttext' => "'''Vu ha terminat vor session.'''
-Vu posse continuar usar {{SITENAME}} anonimimen, o vu posse [[Special:UserLogin|aperter un session denov]] quam li sam usator o quam un diferent usator.
+Vu posse continuar usar {{SITENAME}} anonimimen, o vu posse <span class='plainlinks'>[$1 aperter un session denov]</span> quam li sam usator o quam un diferent usator.
 Nota que alcun págines posse continuar esser monstrat quam si vu esset registrat, til que vu vacua li cache de tui navigator.",
-'welcomecreation' => '== Benevenit, $1! == 
-Tui conto hat esset creat. 
-Ne oblivia de mutar tui [[Special:Preferences|preferenties de {{SITENAME}}]].',
 'yourname' => 'Nómine de usator:',
 'yourpassword' => 'Parol-clave:',
 'yourpasswordagain' => 'Parol-clave denov:',
@@ -1015,8 +1010,6 @@ Li descrition es in li [$2 págine de descrition del file] ta e es monstrat in i
 'watching' => 'Vigilant...',
 'unwatching' => 'Desvigilant...',
 
-'created' => 'creat',
-
 # Delete
 'deletepage' => 'Deleter págine',
 'delete-legend' => 'Deleter',
index fcc45d6..d0349b0 100644 (file)
@@ -218,7 +218,6 @@ $messages = array(
 'qbbrowse' => 'Garia',
 'qbedit' => 'Mèzi',
 'qbpageoptions' => 'Ihü nka',
-'qbpageinfo' => 'Abwátà nka',
 'qbmyoptions' => 'Ihüm',
 'qbspecialpages' => 'Ihü mkpà',
 'faq' => 'FAQ',
@@ -439,11 +438,8 @@ Maka ikuwaria na asụsụ nke ozor, biko chetu I ji [//translatewiki.net/wiki/M
 # Login and logout pages
 'logouttext' => "'''I fwuóla ubwá.'''
 
-I nwèríkí jíwá {{SITENAME}} na nke ẹnwéghi áhà, mànà Í nwèríkí [[Special:UserLogin|bátá òzọr]] na áhà Í shị fwüo ma áhà ozọr.
+I nwèríkí jíwá {{SITENAME}} na nke ẹnwéghi áhà, mànà Í nwèríkí <span class='plainlinks'>[$1 bátá òzọr]</span> na áhà Í shị fwüo ma áhà ozọr.
 Màkwá na o dị ihü gi zi kà Í nor kwa ímé, o gi kwüshí mgbe Í sáfùrù cache ihe ishi a gá intanet gi.",
-'welcomecreation' => '== Nnöö, $1! ==
-Okíkè buwa gi a guchala.
-E chefụkwạlạ I gbanwere [[Special:Preferences|{{SITENAME}} iheichọrọ]].',
 'yourname' => "Áhà ọ'bànifé:",
 'yourpassword' => 'Okwúngáfè:',
 'yourpasswordagain' => 'Detuari mkpurụ okwu ejị a gafẹ:',
@@ -732,8 +728,6 @@ Okwu ụmà: '''({{int:cur}})''' = gbánwe na nké orü mbu, '''({{int:last}})''
 'search-interwiki-caption' => 'Orürü nwanne nwanyị',
 'search-interwiki-default' => '$1 nke ziri:',
 'search-interwiki-more' => '(dikarírí)',
-'search-mwsuggest-enabled' => 'ma okwu',
-'search-mwsuggest-disabled' => 'adighi okwu',
 'search-relatedarticle' => 'Nwanne',
 'searcheverything-enable' => 'Chọwa na ébé nílé',
 'searchrelated' => 'nke kọlu',
@@ -1143,9 +1137,6 @@ Ihe gi gbanwe na ógè gi bya nà ihüá na ihü okwu ya gi di ndétu ngáhù, n
 'unwatching' => 'O mele ka o na á hü kwagi...',
 
 'enotif_impersonal_salutation' => "ọ'bànifé {{SITENAME}}",
-'changed' => 'gbanwere',
-'created' => 'kèrè',
-'enotif_subject' => 'Ihü {{SITENAME}} $PAGETITLE à gálá $CHANGEDORCREATED nà áká $PAGEEDITOR',
 'enotif_anon_editor' => "ọ'bànifé ézíghị ihu $1",
 
 # Delete
@@ -1684,4 +1675,7 @@ Nke ozor gí zonari na áká onwe ha.
 'htmlform-reset' => 'Emekwàlà gbanwere',
 'htmlform-selectorother-other' => 'Nke ozor',
 
+# Search suggestions
+'searchsuggest-search' => 'Chọwa',
+
 );
index d916747..8cea6d0 100644 (file)
@@ -14,228 +14,227 @@ $messages = array(
 'tog-rememberpassword' => 'ᐃᖅᑑ ᐅᐃᑭᐱᑎᐊ ᐊᑎᖅ ᖃᑯᒍᖅ ᐊᑐᐃᓐᓇᓯᕗᖅ ᐅᕙᓗᒪᔪᖅ ᖃᕆᑕᐅᔭᖅ (for a maximum of $1 {{PLURAL:$1|day|days}})',
 
 # Dates
-'sunday'        => 'ᓴᓇᑦᑕᐃᓕ',
-'monday'        => 'ᓇᒡᒐᔭᖅ',
-'wednesday'     => 'ᐱᖓᔪᐊ',
-'friday'        => 'ᐸᒐᐃᑖᒃ',
-'sun'           => 'ᓴᓇ',
-'mon'           => 'ᓇᒡ',
-'tue'           => 'ᐱᖃ',
-'wed'           => 'ᐱᖓ',
-'thu'           => 'ᕿᑎ',
-'fri'           => 'ᐅᓪᓗ',
-'sat'           => 'ᓯᕙᑕ',
-'january'       => 'ᔭᓐᓄᐊᓕ',
-'february'      => 'ᕕᐳᐊᕆ',
-'march'         => 'ᒫᕐᓯ',
-'april'         => 'ᐊᐃᐳᕆᓪ',
-'may_long'      => 'ᒪᐃ',
-'june'          => 'ᔪᓂ',
-'july'          => 'ᔪᓚᐃ',
-'august'        => 'ᐊᐅᒍᔅ',
-'september'     => 'ᓯᑎᒻᐳᕆ',
-'october'       => 'ᐅᒃᑐᐳᕆ',
-'november'      => 'ᓄᕕᒻᐳᕆ',
-'december'      => 'ᑎᓯᒻᐳᕆ',
-'january-gen'   => 'ᔭᓐᓄᐊᓕ',
-'february-gen'  => 'ᕕᐳᐊᕆ',
-'march-gen'     => 'ᒫᕐᓯ',
-'april-gen'     => 'ᐊᐃᐳᕆᓪ',
-'may-gen'       => 'ᒪᐃ',
-'june-gen'      => 'ᔪᓂ',
-'july-gen'      => 'ᔪᓚᐃ',
-'august-gen'    => 'ᐊᐅᒍᔅ',
+'sunday' => 'ᓴᓇᑦᑕᐃᓕ',
+'monday' => 'ᓇᒡᒐᔭᖅ',
+'wednesday' => 'ᐱᖓᔪᐊ',
+'friday' => 'ᐸᒐᐃᑖᒃ',
+'sun' => 'ᓴᓇ',
+'mon' => 'ᓇᒡ',
+'tue' => 'ᐱᖃ',
+'wed' => 'ᐱᖓ',
+'thu' => 'ᕿᑎ',
+'fri' => 'ᐅᓪᓗ',
+'sat' => 'ᓯᕙᑕ',
+'january' => 'ᔭᓐᓄᐊᓕ',
+'february' => 'ᕕᐳᐊᕆ',
+'march' => 'ᒫᕐᓯ',
+'april' => 'ᐊᐃᐳᕆᓪ',
+'may_long' => 'ᒪᐃ',
+'june' => 'ᔪᓂ',
+'july' => 'ᔪᓚᐃ',
+'august' => 'ᐊᐅᒍᔅ',
+'september' => 'ᓯᑎᒻᐳᕆ',
+'october' => 'ᐅᒃᑐᐳᕆ',
+'november' => 'ᓄᕕᒻᐳᕆ',
+'december' => 'ᑎᓯᒻᐳᕆ',
+'january-gen' => 'ᔭᓐᓄᐊᓕ',
+'february-gen' => 'ᕕᐳᐊᕆ',
+'march-gen' => 'ᒫᕐᓯ',
+'april-gen' => 'ᐊᐃᐳᕆᓪ',
+'may-gen' => 'ᒪᐃ',
+'june-gen' => 'ᔪᓂ',
+'july-gen' => 'ᔪᓚᐃ',
+'august-gen' => 'ᐊᐅᒍᔅ',
 'september-gen' => 'ᓯᑎᒻᐳᕆ',
-'october-gen'   => 'ᐅᒃᑐᐳᕆ',
-'november-gen'  => 'ᓄᕕᒻᐳᕆ',
-'december-gen'  => 'ᑎᓯᒻᐳᕆ',
-'jan'           => 'ᔭᓐᓄ',
-'feb'           => 'ᕕᐳᐊ',
-'mar'           => 'ᓇᑦᓯ',
-'apr'           => 'ᐊᐃᐳ',
-'may'           => 'ᒪᐃ',
-'jun'           => 'ᔪᓂ',
-'jul'           => 'ᔪᓚᐃ',
-'aug'           => 'ᐊᐅᒍ',
-'sep'           => 'ᓯᑎᒻ',
-'oct'           => 'ᐅᒃᑐ',
-'nov'           => 'ᓄᕕ',
-'dec'           => 'ᑎᓯᒻ',
-
-'about'         => 'ᒥᒃᓵᓂ',
-'article'       => 'ᐃᓗᓕᒃ ᒪᑉᐱᑕᖅ',
-'newwindow'     => '(ᐅᐃᑦᑐᖅ ᖃᕋᓴᐅᔭᖅ ᐃᑭᐊᖅ ᐱᒋᕗᖅ ᐃᒐᓛᖅ)',
-'cancel'        => 'ᐃᓂᖅᑎᐹ',
+'october-gen' => 'ᐅᒃᑐᐳᕆ',
+'november-gen' => 'ᓄᕕᒻᐳᕆ',
+'december-gen' => 'ᑎᓯᒻᐳᕆ',
+'jan' => 'ᔭᓐᓄ',
+'feb' => 'ᕕᐳᐊ',
+'mar' => 'ᓇᑦᓯ',
+'apr' => 'ᐊᐃᐳ',
+'may' => 'ᒪᐃ',
+'jun' => 'ᔪᓂ',
+'jul' => 'ᔪᓚᐃ',
+'aug' => 'ᐊᐅᒍ',
+'sep' => 'ᓯᑎᒻ',
+'oct' => 'ᐅᒃᑐ',
+'nov' => 'ᓄᕕ',
+'dec' => 'ᑎᓯᒻ',
+
+'about' => 'ᒥᒃᓵᓂ',
+'article' => 'ᐃᓗᓕᒃ ᒪᑉᐱᑕᖅ',
+'newwindow' => '(ᐅᐃᑦᑐᖅ ᖃᕋᓴᐅᔭᖅ ᐃᑭᐊᖅ ᐱᒋᕗᖅ ᐃᒐᓛᖅ)',
+'cancel' => 'ᐃᓂᖅᑎᐹ',
 'moredotdotdot' => 'ᐱᓪᓗᐊᕆᕚ...',
-'mypage'        => 'ᐊᒥ ᒪᑉᐱᑕᖅ',
-'mytalk'        => 'ᐊᓪᓚᖁᑎᒃᑲ',
-'navigation'    => 'ᒥᐊᓂᕆᕚ',
-'and'           => '&#32;ᐊᒻᒪ',
+'mypage' => 'ᐊᒥ ᒪᑉᐱᑕᖅ',
+'mytalk' => 'ᐊᓪᓚᖁᑎᒃᑲ',
+'navigation' => 'ᒥᐊᓂᕆᕚ',
+'and' => '&#32;ᐊᒻᒪ',
 
 # Cologne Blue skin
-'qbedit'         => 'ᓱᖁᓯᖅᐹ',
+'qbedit' => 'ᓱᖁᓯᖅᐹ',
 'qbspecialpages' => 'ᐱᔨ ᒪᑉᐱᑕᖅ',
 
-'errorpagetitle'    => 'ᑕᒻᒪᓇᖅᑐᖅ',
-'help'              => 'ᖃᔭᓕᑉᐹ',
-'search'            => 'ᐃᕚᖅᐳᖅ',
-'searchbutton'      => 'ᐃᕚᖅᐳᖅ',
-'go'                => 'ᐊᐃᕗᖅ',
-'searcharticle'     => 'ᐊᐃᕗᖅ',
-'history_short'     => 'ᒪᑉᐱᑕᖅ ᑭᖑᓂᑦᑎᓐᓂ',
-'edit'              => 'ᓱᖁᓯᖅᐹ',
-'editthispage'      => 'ᓱᖁᓯᖅᐹ ᒪᑉᐱᑕᖅ',
-'delete'            => 'ᓂᐸᖅᑎᐹ',
-'protect'           => 'ᓴᐳᒻᒥᕚ',
-'unprotect'         => 'ᐃᖅ ᓴᐳᒻᒥᕚ',
+'errorpagetitle' => 'ᑕᒻᒪᓇᖅᑐᖅ',
+'help' => 'ᖃᔭᓕᑉᐹ',
+'search' => 'ᐃᕚᖅᐳᖅ',
+'searchbutton' => 'ᐃᕚᖅᐳᖅ',
+'go' => 'ᐊᐃᕗᖅ',
+'searcharticle' => 'ᐊᐃᕗᖅ',
+'history_short' => 'ᒪᑉᐱᑕᖅ ᑭᖑᓂᑦᑎᓐᓂ',
+'edit' => 'ᓱᖁᓯᖅᐹ',
+'editthispage' => 'ᓱᖁᓯᖅᐹ ᒪᑉᐱᑕᖅ',
+'delete' => 'ᓂᐸᖅᑎᐹ',
+'protect' => 'ᓴᐳᒻᒥᕚ',
+'unprotect' => 'ᐃᖅ ᓴᐳᒻᒥᕚ',
 'unprotectthispage' => 'ᐃᖅ ᓴᐳᒻᒥᕚ ᒪᑉᐱᑕᖅ',
-'newpage'           => 'ᐱᒋᕗᖅ ᒪᑉᐱᑕᖅ',
-'talkpagelinktext'  => 'ᐅᖃᓕᒪᔪᖅ',
-'specialpage'       => 'ᐱᔨ ᒪᑉᐱᑕᖅ',
-'articlepage'       => 'ᐅᕝᕙ ᐃᓗᓕᒃ ᒪᑉᐱᑕᖅ',
-'talk'              => 'ᐅᖃᓕᒪᔪᖅ',
-'toolbox'           => 'ᓴᓇᕐᖁᑎᖃᐅᑎ',
-'otherlanguages'    => 'ᑭᓪᓗᒧᑦ ᐅᐃᑭ',
-'redirectedfrom'    => '(ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ $1)',
-'redirectpagesub'   => 'ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ ᒪᑉᐱᑕᖅ',
-'jumptonavigation'  => 'ᒥᐊᓂᕆᕚ',
-'jumptosearch'      => 'ᐃᕚᖅᐳᖅ',
+'newpage' => 'ᐱᒋᕗᖅ ᒪᑉᐱᑕᖅ',
+'talkpagelinktext' => 'ᐅᖃᓕᒪᔪᖅ',
+'specialpage' => 'ᐱᔨ ᒪᑉᐱᑕᖅ',
+'articlepage' => 'ᐅᕝᕙ ᐃᓗᓕᒃ ᒪᑉᐱᑕᖅ',
+'talk' => 'ᐅᖃᓕᒪᔪᖅ',
+'toolbox' => 'ᓴᓇᕐᖁᑎᖃᐅᑎ',
+'otherlanguages' => 'ᑭᓪᓗᒧᑦ ᐅᐃᑭ',
+'redirectedfrom' => '(ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ $1)',
+'redirectpagesub' => 'ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ ᒪᑉᐱᑕᖅ',
+'jumptonavigation' => 'ᒥᐊᓂᕆᕚ',
+'jumptosearch' => 'ᐃᕚᖅᐳᖅ',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => 'ᒥᒃᓵᓂ {{SITENAME}}',
-'aboutpage'            => 'Project:ᒥᒃᓵᓂ',
-'currentevents'        => 'ᐱᒋᕗᖅ ᐱᐅᓯᖅ',
-'currentevents-url'    => 'Project:ᐱᒋᕗᖅ ᐱᐅᓯᖅ',
-'edithelp'             => 'ᓱᖁᓯᖅᐹ ᐃᑯᕐᕆᐹ',
-'edithelppage'         => 'Help:ᐃᑯᕐᕆᐹ',
-'mainpage'             => 'ᐊᒥᖅ',
+'aboutsite' => 'ᒥᒃᓵᓂ {{SITENAME}}',
+'aboutpage' => 'Project:ᒥᒃᓵᓂ',
+'currentevents' => 'ᐱᒋᕗᖅ ᐱᐅᓯᖅ',
+'currentevents-url' => 'Project:ᐱᒋᕗᖅ ᐱᐅᓯᖅ',
+'edithelp' => 'ᓱᖁᓯᖅᐹ ᐃᑯᕐᕆᐹ',
+'edithelppage' => 'Help:ᐃᑯᕐᕆᐹ',
+'mainpage' => 'ᐊᒥᖅ',
 'mainpage-description' => 'ᐊᒥᖅ',
-'portal'               => 'ᖃᒡᒋᖅ',
-'portal-url'           => 'Project:ᖃᒡᒋᖅ',
-'privacy'              => 'ᓇᒻᒥᓂᖅ ᐱᓕᕆᕝᕕᖃᐅᖅᑐᓄᑦ ᐊᐅᓚᑕᐅᔪᑦ ᐊᑐᐊᒐᖅ, ᐱᓇᓱᐊᕐᓂᖅ',
-'privacypage'          => 'Project:ᓇᒻᒥᓂᖅ ᐱᓕᕆᕝᕕᖃᐅᖅᑐᓄᑦ ᐊᐅᓚᑕᐅᔪᑦ ᐊᑐᐊᒐᖅ, ᐱᓇᓱᐊᕐᓂᖅ',
+'portal' => 'ᖃᒡᒋᖅ',
+'portal-url' => 'Project:ᖃᒡᒋᖅ',
+'privacy' => 'ᓇᒻᒥᓂᖅ ᐱᓕᕆᕝᕕᖃᐅᖅᑐᓄᑦ ᐊᐅᓚᑕᐅᔪᑦ ᐊᑐᐊᒐᖅ, ᐱᓇᓱᐊᕐᓂᖅ',
+'privacypage' => 'Project:ᓇᒻᒥᓂᖅ ᐱᓕᕆᕝᕕᖃᐅᖅᑐᓄᑦ ᐊᐅᓚᑕᐅᔪᑦ ᐊᑐᐊᒐᖅ, ᐱᓇᓱᐊᕐᓂᖅ',
 
-'youhavenewmessages'  => 'ᐃᓕᔅᓯ ᐱᒋᕚ $1 ($2).',
-'newmessageslink'     => 'ᐱᒋᕗᖅ ᑭᒡᒐᐹ',
+'youhavenewmessages' => 'ᐃᓕᔅᓯ ᐱᒋᕚ $1 ($2).',
+'newmessageslink' => 'ᐱᒋᕗᖅ ᑭᒡᒐᐹ',
 'newmessagesdifflink' => 'ᐊᓐᓂᑐᔪᖅ ᐊᓯᐊᙳᑐᖅ',
-'editsection'         => 'ᓱᖁᓯᖅᐹ ᐃᓚ',
-'editold'             => 'ᓱᖁᓯᖅᐹ',
-'editsectionhint'     => 'ᓱᖁᓯᖅᐹ ᐃᓚᖏᐅᑎᑎᑦᓯᒍᑎ: $1',
-'showtoc'             => 'ᐊᓚᒃᑲᑎᖅᐹ',
-'hidetoc'             => 'ᐃᔨᖅᐳᖅ',
-'site-rss-feed'       => '$1 ᕐᔅᔅ ᒥᐊᓂᕆᕚ',
-'site-atom-feed'      => '$1 ᐊᑐᒻ ᒥᐊᓂᕆᕚ',
-'page-rss-feed'       => '"$1" ᕐᔅᔅ ᒥᐊᓂᕆᕚ',
-'page-atom-feed'      => '"$1" ᐊᑐᒻ ᒥᐊᓂᕆᕚ',
+'editsection' => 'ᓱᖁᓯᖅᐹ ᐃᓚ',
+'editold' => 'ᓱᖁᓯᖅᐹ',
+'editsectionhint' => 'ᓱᖁᓯᖅᐹ ᐃᓚᖏᐅᑎᑎᑦᓯᒍᑎ: $1',
+'showtoc' => 'ᐊᓚᒃᑲᑎᖅᐹ',
+'hidetoc' => 'ᐃᔨᖅᐳᖅ',
+'site-rss-feed' => '$1 ᕐᔅᔅ ᒥᐊᓂᕆᕚ',
+'site-atom-feed' => '$1 ᐊᑐᒻ ᒥᐊᓂᕆᕚ',
+'page-rss-feed' => '"$1" ᕐᔅᔅ ᒥᐊᓂᕆᕚ',
+'page-atom-feed' => '"$1" ᐊᑐᒻ ᒥᐊᓂᕆᕚ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'ᒪᑉᐱᑕᖅ',
-'nstab-user'      => 'ᐃᓄᒃ ᒪᑉᐱᑕᖅ',
-'nstab-special'   => 'ᐱᔨ',
-'nstab-project'   => 'ᐱᓕᕆᐊᒃᓴᐃᑦ ᐱᕙᓪᓕᐊᔾᔪᑎᒃᓴᓄᑦ ᒪᑉᐱᑕᖅ',
-'nstab-image'     => 'ᐊᒋᐅᑦ',
+'nstab-main' => 'ᒪᑉᐱᑕᖅ',
+'nstab-user' => 'ᐃᓄᒃ ᒪᑉᐱᑕᖅ',
+'nstab-special' => 'ᐱᔨ',
+'nstab-project' => 'ᐱᓕᕆᐊᒃᓴᐃᑦ ᐱᕙᓪᓕᐊᔾᔪᑎᒃᓴᓄᑦ ᒪᑉᐱᑕᖅ',
+'nstab-image' => 'ᐊᒋᐅᑦ',
 'nstab-mediawiki' => 'ᑭᒡᒐᐹ',
-'nstab-template'  => 'ᒥᐊᓂᕆᕚ-ᕿᔪᖁᑦ',
-'nstab-category'  => 'ᓄᐊᑉᐳᑦ',
+'nstab-template' => 'ᒥᐊᓂᕆᕚ-ᕿᔪᖁᑦ',
+'nstab-category' => 'ᓄᐊᑉᐳᑦ',
 
 # General errors
-'badtitle'         => 'ᐊᔪᖅᑐᖅ ᐊᑎᖅ',
+'badtitle' => 'ᐊᔪᖅᑐᖅ ᐊᑎᖅ',
 'editinginterface' => "'''ᐃᓂᖅᑎᕈᑎ—''' ᐋᕼᐊ ᓱᖁᓯᖅᐹ ᐃᑭᐊᖅ ᒪᑉᐱᑕᖅ ᐊᑐᐃᓐᓇᓯᕗᖅ ᐄᔭᑦᓴᖅ ᖃᕋᓴᐅᔭᖅ ᑕᖅᓴᓕᖅᐹ ᐃᑭᐊᖅ ᐊᕿᑦᑐᖅ ᖃᕆᑕᐅᔭᐅᑉ ᑎᑎᕋᕐᕕᖓ. ᐊᓯᐊᙳᑐᖅ ᐃᑭᐊᖅ ᒪᑉᐱᑕᖅ ᐃᓄᒃᑎᑐᑦ ᐅᐃᑭᐱᑎᐊ ᐊᓪᓚᖑᖅᑐᐊᖅ ᓇᑭᒪᖅᐳᖅ ᖃᑕᙳᑎ.",
 
 # Login and logout pages
-'welcomecreation'    => "== ᐊᕆᐅᙵᐃᐹ, $1! ==
+'welcomecreation' => "== ᐊᕆᐅᙵᐃᐹ, $1! ==
 ᐱᒋᕗᖅ ᖃᑕᙳᑎ ᐅᐃᑭᐱᑎᐊ ᑮᓇᐅᔭᖁᑎᖃᕐᕕᒃ ᐃᓱᐃᓪᓕᖓᐃᑦᔭᐹ. ᐃᖅᑑ ᓱᖁᓯᖅᐹ {{SITENAME}} ᐃᓐᓂᐊᑐᖅ «''ᓂᐱ ᐊᒥ''»",
-'yourname'           => 'ᐅᐃᑭᐱᑎᐊ ᐊᑎᖅ',
-'yourpassword'       => 'ᐅᐃᑭᐱᑎᐊ ᐸᓚᙵᓴᐅᑎ',
-'yourpasswordagain'  => 'ᑕᒪᑐᒪᓃᖅᐹ ᐃᒃᓯᒐᖅᑐᖅ ᐅᐃᑭᐱᑎᐊ ᐸᓚᙵᓴᐅᑎ',
+'yourname' => 'ᐅᐃᑭᐱᑎᐊ ᐊᑎᖅ',
+'yourpassword' => 'ᐅᐃᑭᐱᑎᐊ ᐸᓚᙵᓴᐅᑎ',
+'yourpasswordagain' => 'ᑕᒪᑐᒪᓃᖅᐹ ᐃᒃᓯᒐᖅᑐᖅ ᐅᐃᑭᐱᑎᐊ ᐸᓚᙵᓴᐅᑎ',
 'remembermypassword' => 'ᐃᖅᑑ ᐅᐃᑭᐱᑎᐊ ᐊᑎᖅ ᖃᑯᒍᖅ ᐊᑐᐃᓐᓇᓯᕗᖅ ᐅᕙᓗᒪᔪᖅ ᖃᕆᑕᐅᔭᖅ (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'              => 'ᐊᑯᓐᓇᐳᖅ',
-'loginprompt'        => 'ᐱᒋᐊᓕᒃ ᐃᒪᑐᐊᖅ ᖃᕆᑕᐅᔭᖅ ᖂᑮᔅ(Cookies) ᐱᕐᖄᑎ ᐊᑯᓐᓇᐳᖅ ᐅᐃᑭᐱᑎᐊ.',
-'userlogin'          => 'ᐊᑯᓐᓇᐳᖅ / ᐱᕐᖄᐹ ᑮᓇᐅᔭᒃᑯᕕᖕᒥ ᑐᖅᑯᖅᓯᕕᒃ',
-'logout'             => 'ᐊᓂᕝᕕᒃ',
-'userlogout'         => 'ᐊᓂᕝᕕᒃ',
-'nologin'            => "ᐊᔪᐃᓐᓈᖅ ᐃᓄᖁᑎ? '''$1'''.",
-'nologinlink'        => 'ᐱᕐᖄᐹ ᑮᓇᐅᔭᒃᑯᕕᖕᒥ ᑐᖅᑯᖅᓯᕕᒃ',
-'gotaccountlink'     => 'ᐊᑯᓐᓇᐳᖅ',
-'mailmypassword'     => 'ᕿᓪᓗᑐᖅ ᐅᐃᑭᐱᑎᐊ ᐸᓚᙵᓴᐅᑎ ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ',
+'login' => 'ᐊᑯᓐᓇᐳᖅ',
+'loginprompt' => 'ᐱᒋᐊᓕᒃ ᐃᒪᑐᐊᖅ ᖃᕆᑕᐅᔭᖅ ᖂᑮᔅ(Cookies) ᐱᕐᖄᑎ ᐊᑯᓐᓇᐳᖅ ᐅᐃᑭᐱᑎᐊ.',
+'userlogin' => 'ᐊᑯᓐᓇᐳᖅ / ᐱᕐᖄᐹ ᑮᓇᐅᔭᒃᑯᕕᖕᒥ ᑐᖅᑯᖅᓯᕕᒃ',
+'logout' => 'ᐊᓂᕝᕕᒃ',
+'userlogout' => 'ᐊᓂᕝᕕᒃ',
+'nologin' => "ᐊᔪᐃᓐᓈᖅ ᐃᓄᖁᑎ? '''$1'''.",
+'nologinlink' => 'ᐱᕐᖄᐹ ᑮᓇᐅᔭᒃᑯᕕᖕᒥ ᑐᖅᑯᖅᓯᕕᒃ',
+'gotaccountlink' => 'ᐊᑯᓐᓇᐳᖅ',
+'mailmypassword' => 'ᕿᓪᓗᑐᖅ ᐅᐃᑭᐱᑎᐊ ᐸᓚᙵᓴᐅᑎ ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ',
 
 # Edit page toolbar
 'bold_sample' => 'ᐃᔾᔪᔪᒡ ᑕᖅᓴᓕᖅᐹ',
-'bold_tip'    => 'ᐃᔾᔪᔪᒡ ᑕᖅᓴᓕᖅᐹ',
+'bold_tip' => 'ᐃᔾᔪᔪᒡ ᑕᖅᓴᓕᖅᐹ',
 
 # Edit pages
-'summary'         => 'ᓱᕕᑦ:',
-'minoredit'       => 'ᐅᑭᐅᑭᓗᐊᖅᑐᖅ ᐊᓯᐊᙳᑐᖅ',
-'watchthis'       => 'ᐅᕝᕙ',
-'savearticle'     => 'ᐅᖃᐅᓯᓪᓚᕆᖏᑕ ᑎᑎᕋᖅᑕᐅᓂᖏᑦ',
-'preview'         => 'ᐅᕝᕙ ᖃᖓᓵᖑᓕᖅᑐᖅ',
-'showpreview'     => 'ᓱᖁᓯᖅᐹ ᐊᓚᒃᑲᐅᑎᕗᖅ ᓯᕗᓕᐅᖅᐹ ᐅᖃᐅᓯᓪᓚᕆᖏᑕ ᑎᑎᕋᖅᑕᐅᓂᖏᑦ',
-'showdiff'        => 'ᐊᓚᒃᑲᑎᑉᐹ ᐊᓯᐊᙳᑐᖅ',
+'summary' => 'ᓱᕕᑦ:',
+'minoredit' => 'ᐅᑭᐅᑭᓗᐊᖅᑐᖅ ᐊᓯᐊᙳᑐᖅ',
+'watchthis' => 'ᐅᕝᕙ',
+'savearticle' => 'ᐅᖃᐅᓯᓪᓚᕆᖏᑕ ᑎᑎᕋᖅᑕᐅᓂᖏᑦ',
+'preview' => 'ᐅᕝᕙ ᖃᖓᓵᖑᓕᖅᑐᖅ',
+'showpreview' => 'ᓱᖁᓯᖅᐹ ᐊᓚᒃᑲᐅᑎᕗᖅ ᓯᕗᓕᐅᖅᐹ ᐅᖃᐅᓯᓪᓚᕆᖏᑕ ᑎᑎᕋᖅᑕᐅᓂᖏᑦ',
+'showdiff' => 'ᐊᓚᒃᑲᑎᑉᐹ ᐊᓯᐊᙳᑐᖅ',
 'summary-preview' => 'ᓱᕕᑦ:',
-'blockedtitle'    => 'ᐋᖅᑭᒃᓱᐃᔨ ᐅᒥᙵᓯᓯᔪᖅ',
-'loginreqlink'    => 'ᐊᑯᓐᓇᐳᖅ',
-'newarticle'      => '(ᐱᒋᕗᖅ)',
-'editing'         => 'ᐊᓯᐊᙳᑐᖅ $1',
-'editingsection'  => 'ᓱᖁᓯᖅᐹ ᐃᓚ $1 (ᖏᐅᑎᑎᑦᓯᒍᑎ)',
-'editingcomment'  => 'ᓱᖁᓯᖅᐹ $1 (ᐅᔾᔨᕆᔭᖅ)',
-'editconflict'    => 'ᓱᖁᓯᖅᐹ ᐊᑲᐅᙱᓕᐅᕈᑎᓂᖅ: $1',
+'blockedtitle' => 'ᐋᖅᑭᒃᓱᐃᔨ ᐅᒥᙵᓯᓯᔪᖅ',
+'loginreqlink' => 'ᐊᑯᓐᓇᐳᖅ',
+'newarticle' => '(ᐱᒋᕗᖅ)',
+'editing' => 'ᐊᓯᐊᙳᑐᖅ $1',
+'editingsection' => 'ᓱᖁᓯᖅᐹ ᐃᓚ $1 (ᖏᐅᑎᑎᑦᓯᒍᑎ)',
+'editingcomment' => 'ᓱᖁᓯᖅᐹ $1 (ᐅᔾᔨᕆᔭᖅ)',
+'editconflict' => 'ᓱᖁᓯᖅᐹ ᐊᑲᐅᙱᓕᐅᕈᑎᓂᖅ: $1',
 
 # History pages
-'currentrev'          => 'ᒫᓐᓇ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ',
-'previousrevision'    => '←ᐅᑐᖃᖅ  ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ',
-'nextrevision'        => 'ᐱᓪᓗᐊᕆᕚ ᐱᒋᕗᖅ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ→',
+'currentrev' => 'ᒫᓐᓇ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ',
+'previousrevision' => '←ᐅᑐᖃᖅ  ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ',
+'nextrevision' => 'ᐱᓪᓗᐊᕆᕚ ᐱᒋᕗᖅ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ→',
 'currentrevisionlink' => 'ᒫᓐᓇ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ',
-'next'                => 'ᑕᒡᒐ',
-'last'                => 'ᐊᓐᓂᑐᔪᖅ',
+'next' => 'ᑕᒡᒐ',
+'last' => 'ᐊᓐᓂᑐᔪᖅ',
 
 # Revision feed
-'history-feed-title'       => 'ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ ᒪᑉᐱᑕᖅ ᑭᖑᓂᑦᑎᓐᓂ',
+'history-feed-title' => 'ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ ᒪᑉᐱᑕᖅ ᑭᖑᓂᑦᑎᓐᓂ',
 'history-feed-description' => 'ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ ᒪᑉᐱᑕᖅ ᑭᖑᓂᑦᑎᓐᓂ ᐃᑭᐊᖅ ᐅᐃᑭ',
 
 # Diffs
 'history-title' => 'ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ ᒪᑉᐱᑕᖅ ᑭᖑᓂᑦᑎᓐᓂ "$1"',
-'difference'    => '(ᐊᓯᐊᙳᑐᖅ ᒪᑉᐱᑕᖅ ᐊᑯᓐᓂᖓᓐᓂ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ)',
-'lineno'        => 'ᑐᑭᖅᓯᖅ $1:',
-'editundo'      => 'ᐃᐱᐅᑦᔮᐹ',
-'diff-multi'    => '({{PLURAL:$1|ᐊᑕᐅᓯᖅ ᑭᒻᒥᐅᕗᖅ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ|$1 ᑭᒻᒥᐅᕗᖅ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ}} ᐊᔪᖅᑐᖅ ᐅᕝᕙ.)',
+'lineno' => 'ᑐᑭᖅᓯᖅ $1:',
+'editundo' => 'ᐃᐱᐅᑦᔮᐹ',
+'diff-multi' => '({{PLURAL:$1|ᐊᑕᐅᓯᖅ ᑭᒻᒥᐅᕗᖅ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ|$1 ᑭᒻᒥᐅᕗᖅ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ}} ᐊᔪᖅᑐᖅ ᐅᕝᕙ.)',
 
 # Search results
-'nextn'       => 'ᑕᒡᒐ {{PLURAL:$1|$1}}',
+'nextn' => 'ᑕᒡᒐ {{PLURAL:$1|$1}}',
 'powersearch' => 'ᕿᓐᓇᕆᒃᓴᕐᓂᖅ',
 
 # Preferences page
-'mypreferences'     => 'ᐊᒥ ᐱᒃᑯᒪᓂᖅᐹᖅ',
-'prefs-rc'          => 'ᐱᒋᕗᖅ ᐊᓯᐊᙳᑐᖅ',
+'mypreferences' => 'ᐊᒥ ᐱᒃᑯᒪᓂᖅᐹᖅ',
+'prefs-rc' => 'ᐱᒋᕗᖅ ᐊᓯᐊᙳᑐᖅ',
 'searchresultshead' => 'ᐃᕚᖅᐳᖅ',
-'youremail'         => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ:',
-'username'          => 'ᐅᐃᑭᐱᑎᐊ ᐊᑎᖅ:',
-'yourrealname'      => 'ᐃᓄᓪᓚᕆᒃ ᐊᑎᖅ:',
-'email'             => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ',
-'prefs-help-email'  => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ (ᐱᒃᑲᓪᓚᕗᖅ) — ᖃᑯᒍ ᓇᓗᓇᙱᓚᖅ ᐃᓕᔅᓯ ᐱᔪᖕᓇᖅᑐᖅ ᐱᒋᕚ ᑲᙳᓇᖅᑐᖅ ᐋᔩᖃᑎᒋᖏᖅ',
+'youremail' => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ:',
+'username' => 'ᐅᐃᑭᐱᑎᐊ ᐊᑎᖅ:',
+'yourrealname' => 'ᐃᓄᓪᓚᕆᒃ ᐊᑎᖅ:',
+'email' => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ',
+'prefs-help-email' => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ (ᐱᒃᑲᓪᓚᕗᖅ) — ᖃᑯᒍ ᓇᓗᓇᙱᓚᖅ ᐃᓕᔅᓯ ᐱᔪᖕᓇᖅᑐᖅ ᐱᒋᕚ ᑲᙳᓇᖅᑐᖅ ᐋᔩᖃᑎᒋᖏᖅ',
 
 # User rights
 'editinguser' => "ᓱᖁᓯᖅᐹ ᖃᑕᙳᑎ '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
 
 # Recent changes
-'recentchanges'   => 'ᐱᒋᕗᖅ ᐊᓯᐊᙳᑐᖅ',
-'hide'            => 'ᐃᔨᖅᐳᖅ',
-'show'            => 'ᐊᓚᒃᑲᑎᖅᐹ',
+'recentchanges' => 'ᐱᒋᕗᖅ ᐊᓯᐊᙳᑐᖅ',
+'hide' => 'ᐃᔨᖅᐳᖅ',
+'show' => 'ᐊᓚᒃᑲᑎᖅᐹ',
 'minoreditletter' => 'ᐅ',
-'newpageletter'   => 'ᐱ',
-'boteditletter'   => 'ᑉ',
+'newpageletter' => 'ᐱ',
+'boteditletter' => 'ᑉ',
 
 # Recent changes linked
-'recentchangeslinked'          => 'ᐊᓯᐊᙳᑐᖅ ᒥᑦᓵᓯᔪᖅ',
-'recentchangeslinked-feed'     => 'ᐊᓯᐊᙳᑐᖅ ᒥᑦᓵᓯᔪᖅ',
-'recentchangeslinked-toolbox'  => 'ᐊᓯᐊᙳᑐᖅ ᒥᑦᓵᓯᔪᖅ',
+'recentchangeslinked' => 'ᐊᓯᐊᙳᑐᖅ ᒥᑦᓵᓯᔪᖅ',
+'recentchangeslinked-feed' => 'ᐊᓯᐊᙳᑐᖅ ᒥᑦᓵᓯᔪᖅ',
+'recentchangeslinked-toolbox' => 'ᐊᓯᐊᙳᑐᖅ ᒥᑦᓵᓯᔪᖅ',
 'recentchangeslinked-noresult' => '0 ᐊᓯᐊᙳᑐᖅ ᐃᑦᓯᕕᒻᒥᐅᓯᖅᐹ ᒪᑉᐱᑕᖅ ᑕᑯᕙᓪᓚᑐᖅ ᓱᓪᓗᒃ ᑕᒪᑐᒪᓂ ᑐᒥᑯ',
 
 # Upload
-'upload'            => 'ᒪᑉᐱᐹ ᓇᓗᓇᐃᔭᐅᑎᑦ',
-'uploadbtn'         => 'ᒪᑉᐱᐹ ᓇᓗᓇᐃᔭᐅᑎᑦ',
-'filedesc'          => 'ᐱᓕᕆᐊᒃᓴᑦ ᐱᕕᒡᔪᐊᖑᓂᖏᑦ',
+'upload' => 'ᒪᑉᐱᐹ ᓇᓗᓇᐃᔭᐅᑎᑦ',
+'uploadbtn' => 'ᒪᑉᐱᐹ ᓇᓗᓇᐃᔭᐅᑎᑦ',
+'filedesc' => 'ᐱᓕᕆᐊᒃᓴᑦ ᐱᕕᒡᔪᐊᖑᓂᖏᑦ',
 'fileuploadsummary' => 'ᓱᕕᑦ:',
-'watchthisupload'   => 'ᐅᕝᕙ',
+'watchthisupload' => 'ᐅᕝᕙ',
 
 # File description page
 'file-anchor-link' => 'ᐊᒋᐅᑦ',
@@ -250,57 +249,57 @@ $messages = array(
 'randomredirect' => 'ᓇᑭᑐᐃᓐᓇᖅ ᖃᐅᔨᓴᕐᓂᖅ ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ',
 
 # Statistics
-'statistics'              => 'ᑭᓯᑦᓯᓯᖕᖑᕐᓗᒋᑦ ᐹᓯᔅᓱᑎᔅᓴᑦ',
+'statistics' => 'ᑭᓯᑦᓯᓯᖕᖑᕐᓗᒋᑦ ᐹᓯᔅᓱᑎᔅᓴᑦ',
 'statistics-header-users' => 'ᖃᑕᙳᑎ ᑭᓯᑦᓯᓯᖕᖑᕐᓗᒋᑦ ᐹᓯᔅᓱᑎᔅᓴᑦ',
 
 'doubleredirects' => 'ᑕᐱᕐᖃᓕᒃ ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ',
 
-'brokenredirects'        => 'ᓇᐱᕚ ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ',
-'brokenredirects-edit'   => 'ᓱᖁᓯᖅᐹ',
+'brokenredirects' => 'ᓇᐱᕚ ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ',
+'brokenredirects-edit' => 'ᓱᖁᓯᖅᐹ',
 'brokenredirects-delete' => 'ᓂᐸᖅᑎᐹ',
 
 # Miscellaneous special pages
-'listusers'         => 'ᖃᑕᙳᑎ ᓂᐱ',
+'listusers' => 'ᖃᑕᙳᑎ ᓂᐱ',
 'newpages-username' => 'ᐅᐃᑭᐱᑎᐊ ᐊᑎᖅ:',
-'ancientpages'      => 'ᒪᑉᐱᑕᖅ ᐃᑦᑐᓴᖅ ᐅᑐᖃᖅ',
-'move'              => 'ᐅᐊᔪᖅ',
+'ancientpages' => 'ᒪᑉᐱᑕᖅ ᐃᑦᑐᓴᖅ ᐅᑐᖃᖅ',
+'move' => 'ᐅᐊᔪᖅ',
 
 # Book sources
 'booksources-go' => 'ᐊᐃᕗᖅ',
 
 # Special:AllPages
-'allpages'       => 'ᓱᓇᒥᑦᑐᖅ ᒪᑉᐱᑕᖅ',
-'nextpage'       => 'ᑕᒡᒐ ᒪᑉᐱᑕᖅ ($1)',
-'allpagesprev'   => 'ᑐᓄᓪᓕᐹᖅ',
-'allpagesnext'   => 'ᑕᒡᒐ',
+'allpages' => 'ᓱᓇᒥᑦᑐᖅ ᒪᑉᐱᑕᖅ',
+'nextpage' => 'ᑕᒡᒐ ᒪᑉᐱᑕᖅ ($1)',
+'allpagesprev' => 'ᑐᓄᓪᓕᐹᖅ',
+'allpagesnext' => 'ᑕᒡᒐ',
 'allpagessubmit' => 'ᐊᐃᕗᖅ',
 
 # Special:Categories
 'categories' => 'ᓄᐊᑉᐳᑦ',
 
 # E-mail user
-'emailuser'    => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ ᐃᓄᒃ',
-'emailfrom'    => 'ᓇᑭᑦ',
+'emailuser' => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ ᐃᓄᒃ',
+'emailfrom' => 'ᓇᑭᑦ',
 'emailmessage' => 'ᑭᒡᒐᐹ',
-'emailsend'    => 'ᕿᐅᑦᓴᕕᒋᕚ',
+'emailsend' => 'ᕿᐅᑦᓴᕕᒋᕚ',
 
 # Watchlist
-'watchlist'     => 'ᐅᕝᕙ ᒪᑉᐱᑕᖅ',
-'mywatchlist'   => 'ᓂᐱ ᐊᒥ',
-'watch'         => 'ᐅᕝᕙ',
+'watchlist' => 'ᐅᕝᕙ ᒪᑉᐱᑕᖅ',
+'mywatchlist' => 'ᓂᐱ ᐊᒥ',
+'watch' => 'ᐅᕝᕙ',
 'watchthispage' => 'ᐅᕝᕙ',
-'unwatch'       => 'ᐃᖅ ᐅᕝᕙ',
+'unwatch' => 'ᐃᖅ ᐅᕝᕙ',
 
 'enotif_impersonal_salutation' => '{{SITENAME}} ᖃᑕᙳᑎ',
-'created'                      => 'ᒪᑉᐱᑕᖅ ᐊᓂᕗᖅ',
+'created' => 'ᒪᑉᐱᑕᖅ ᐊᓂᕗᖅ',
 
 # Delete
-'dellogpage'  => 'ᓂᐸᖅ ᓂᐱ',
+'dellogpage' => 'ᓂᐸᖅ ᓂᐱ',
 'deletionlog' => 'ᓂᐸᖅ ᓂᐱ',
 
 # Protect
-'prot_1movedto2'      => '[[$1]] ᓱᕐᕋᒪᔪᖅ [[$2]]',
-'protect-legend'      => 'ᐸᑎᒻᒥᕚ ᓴᐳᒻᒥᕚ',
+'prot_1movedto2' => '[[$1]] ᓱᕐᕋᒪᔪᖅ [[$2]]',
+'protect-legend' => 'ᐸᑎᒻᒥᕚ ᓴᐳᒻᒥᕚ',
 'protect-level-sysop' => 'ᓯᕐᓚᒃ ᑎᑎᕋᖅᓯᒪᔪᓂᒃ ᑐᖅᑯᖅᑎᕆᔨ',
 
 # Restrictions (nouns)
@@ -315,49 +314,49 @@ $messages = array(
 # Contributions
 'mycontris' => 'ᑕᓕᐊᖅ',
 
-'sp-contributions-talk'   => 'ᐅᖃᓕᒪᔪᖅ',
+'sp-contributions-talk' => 'ᐅᖃᓕᒪᔪᖅ',
 'sp-contributions-submit' => 'ᐃᕚᖅᐳᖅ',
 
 # What links here
 'whatlinkshere' => 'ᐅᖅᓯᖅ ᒪᐅᖓ',
-'isredirect'    => 'ᑕᐱᑕᕇᒃ ᐅᖅᓯᖅ ᒪᑉᐱᑕᖅ',
+'isredirect' => 'ᑕᐱᑕᕇᒃ ᐅᖅᓯᖅ ᒪᑉᐱᑕᖅ',
 
 # Block/unblock
-'blockip'                  => 'ᐃᖅ ᐋᖅᑭᒃᓱᐃᔨ',
-'badipaddress'             => 'ᐃᓪᓕᑐᖅ ᖃᕆᓴᐅᔭᒃᑯᑦ ᑎᑎᕋᖅᓯᒪᔪᑦ ᒪᓕᒐᑎᒍᑦ ᐊᖏᕈᑕᐅᓯᒪᔪᖅ ᐅᓂᒃᑳᕆᔭᖃᕐᓂᖅ',
-'blockipsuccesssub'        => 'ᐅᒥᙵᓯᓯᔪᖅ ᓈᔪᖅ',
-'ipblocklist-submit'       => 'ᐃᕚᖅᐳᖅ',
-'anononlyblock'            => 'ᓯᕐᓚᒃ ᐃᓕᓴᕐᓇᙱᑎᑦᑐᖅ',
-'blocklink'                => 'ᐃᖅ',
-'contribslink'             => 'ᖃᑕᙳᑎ ᓱᖁᓯᖅᐹ',
-'blocklogpage'             => 'ᐅᒥᙵᓯᓯᔪᖅ/ᐃᖅ ᑎᑎᖅᑲᖁᑎᑦ ᑐᖅᑯᖅᓯᒪᔭᐃᑦ',
+'blockip' => 'ᐃᖅ ᐋᖅᑭᒃᓱᐃᔨ',
+'badipaddress' => 'ᐃᓪᓕᑐᖅ ᖃᕆᓴᐅᔭᒃᑯᑦ ᑎᑎᕋᖅᓯᒪᔪᑦ ᒪᓕᒐᑎᒍᑦ ᐊᖏᕈᑕᐅᓯᒪᔪᖅ ᐅᓂᒃᑳᕆᔭᖃᕐᓂᖅ',
+'blockipsuccesssub' => 'ᐅᒥᙵᓯᓯᔪᖅ ᓈᔪᖅ',
+'ipblocklist-submit' => 'ᐃᕚᖅᐳᖅ',
+'anononlyblock' => 'ᓯᕐᓚᒃ ᐃᓕᓴᕐᓇᙱᑎᑦᑐᖅ',
+'blocklink' => 'ᐃᖅ',
+'contribslink' => 'ᖃᑕᙳᑎ ᓱᖁᓯᖅᐹ',
+'blocklogpage' => 'ᐅᒥᙵᓯᓯᔪᖅ/ᐃᖅ ᑎᑎᖅᑲᖁᑎᑦ ᑐᖅᑯᖅᓯᒪᔭᐃᑦ',
 'block-log-flags-anononly' => 'ᐃᓕᓴᕐᓇᙱᑎᑦᑐᖅ ᐋᖅᑭᒃᓱᐃᔨ ᑭᓯᐊᓂ',
 'block-log-flags-nocreate' => 'ᑮᓇᐅᔭᖃᕐᕕᒃ ᐃᓄᐃᕈᑎᕚ ᐃᓂᖅᑎᐹ ᐱᒋᕗᖅ',
-'block-log-flags-noemail'  => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ',
+'block-log-flags-noemail' => 'ᑭᒍᑎᐅᑉ ᓯᑎᓂᖅᐹᖓ',
 
 # Move page
 'move-page-legend' => 'ᐅᐊᔪᖅ ᒪᑉᐱᑕᖅ',
-'movearticle'      => 'ᐅᐊᔪᖅ ᒪᑉᐱᑕᖅ',
-'movedto'          => 'ᐅᐊᔪᖅ',
-'movelogpage'      => 'ᐅᐊᔪᖅ ᓂᐱ',
-'movereason'       => 'ᐃᓱᒪᒃᓴᖅᓯᐅᕈᓐᓇᑦᑎᐊᕐᓂᖅ:',
-'delete_and_move'  => 'ᓂᐸᖅᑎᐹ  ᐊᒻᒪ ᐅᐊᔪᖅ',
+'movearticle' => 'ᐅᐊᔪᖅ ᒪᑉᐱᑕᖅ',
+'movedto' => 'ᐅᐊᔪᖅ',
+'movelogpage' => 'ᐅᐊᔪᖅ ᓂᐱ',
+'movereason' => 'ᐃᓱᒪᒃᓴᖅᓯᐅᕈᓐᓇᑦᑎᐊᕐᓂᖅ:',
+'delete_and_move' => 'ᓂᐸᖅᑎᐹ  ᐊᒻᒪ ᐅᐊᔪᖅ',
 
 # Namespace 8 related
 'allmessagesname' => 'ᐊᑎᖅ',
 
 # Import log
-'import-logentry-upload-detail'    => '$1 {{PLURAL:$1|ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ|ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ}}',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ|ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ}}',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ|ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ}} ᐃᑭᐊᖅ $2',
 
 # Tooltip help for the actions
-'tooltip-pt-mytalk'               => 'ᐊᓪᓚᖁᑎᒃᑲ',
-'tooltip-pt-preferences'          => 'ᐊᒥ ᐱᒃᑯᒪᓂᖅᐹᖅ',
-'tooltip-pt-logout'               => 'ᐊᓂᕝᕕᒃ',
-'tooltip-ca-protect'              => 'ᓴᐳᒻᒥᕚ ᒪᑉᐱᑕᖅ',
-'tooltip-search'                  => 'ᐃᕚᖅᐳᖅ {{SITENAME}}',
-'tooltip-minoredit'               => 'ᑐᐊᐸᖅ ᐊᓯᐊᙳᑐᖅ',
-'tooltip-diff'                    => 'ᓱᕐᕋᐹ ᖃᑕᙳᑎ',
+'tooltip-pt-mytalk' => 'ᐊᓪᓚᖁᑎᒃᑲ',
+'tooltip-pt-preferences' => 'ᐊᒥ ᐱᒃᑯᒪᓂᖅᐹᖅ',
+'tooltip-pt-logout' => 'ᐊᓂᕝᕕᒃ',
+'tooltip-ca-protect' => 'ᓴᐳᒻᒥᕚ ᒪᑉᐱᑕᖅ',
+'tooltip-search' => 'ᐃᕚᖅᐳᖅ {{SITENAME}}',
+'tooltip-minoredit' => 'ᑐᐊᐸᖅ ᐊᓯᐊᙳᑐᖅ',
+'tooltip-diff' => 'ᓱᕐᕋᐹ ᖃᑕᙳᑎ',
 'tooltip-compareselectedversions' => 'ᐅᕝᕙ ᐊᓯᐊᙳᑐᖅ ᒪᑉᐱᑕᖅ ᐊᑯᓐᓂᖓᓐᓂ ᒪᕐᕉᒃ ᑎᑎᕋᖅᑕᐅᒋᐊᕐᖓᕈᑦ',
 
 # Attribution
@@ -368,25 +367,25 @@ $messages = array(
 
 # Browsing diffs
 'previousdiff' => '← ᑐᓄᓪᓕᐹᖅ ᐊᓯᐊᙳᑐᖅ',
-'nextdiff'     => 'ᑕᒡᒐ ᐊᓯᐊᙳᑐᖅ ᒪᑉᐱᑕᖅ →',
+'nextdiff' => 'ᑕᒡᒐ ᐊᓯᐊᙳᑐᖅ ᒪᑉᐱᑕᖅ →',
 
 # Special:NewFiles
 'ilsubmit' => 'ᐃᕚᖅᐳᖅ',
-'bydate'   => 'ᐱᑖᕈᑦᑐᖅ ᐃᓅᓕᕐᕕᒃ',
+'bydate' => 'ᐱᑖᕈᑦᑐᖅ ᐃᓅᓕᕐᕕᒃ',
 
 # Variants for Inuktitut language
 'variantname-ike-cans' => 'ᑎᑎᕋᐅᓯᖅ ᓄᑖᖅ',
 'variantname-ike-latn' => 'ilisautik',
-'variantname-iu'       => 'disable',
+'variantname-iu' => 'disable',
 
 # EXIF tags
-'exif-imagelength'         => 'ᖁᑦᓯᖕᓂᖅ',
-'exif-imagedescription'    => 'ᐃᓄᙳᐊᖅ ᐊᑎᖅ',
-'exif-colorspace'          => 'ᒥᖑᐊᕈᑎᒥᑎᖅᐹ',
-'exif-datetimeoriginal'    => 'ᖃᑦᓯᐹ ᐊᒪᒻ ᑎᑭᐅᑎ ᓴᕐᕿᐹ ᐃᓱᐃᓪᓕᖓᐃᑦᔭᐹ',
-'exif-datetimedigitized'   => 'ᖃᑦᓯᐹ ᐊᒪᒻ ᑎᑭᐅᑎ ᓴᕐᕿᐹ ᖃᕋᓴᐅᔭᖅ',
+'exif-imagelength' => 'ᖁᑦᓯᖕᓂᖅ',
+'exif-imagedescription' => 'ᐃᓄᙳᐊᖅ ᐊᑎᖅ',
+'exif-colorspace' => 'ᒥᖑᐊᕈᑎᒥᑎᖅᐹ',
+'exif-datetimeoriginal' => 'ᖃᑦᓯᐹ ᐊᒪᒻ ᑎᑭᐅᑎ ᓴᕐᕿᐹ ᐃᓱᐃᓪᓕᖓᐃᑦᔭᐹ',
+'exif-datetimedigitized' => 'ᖃᑦᓯᐹ ᐊᒪᒻ ᑎᑭᐅᑎ ᓴᕐᕿᐹ ᖃᕋᓴᐅᔭᖅ',
 'exif-exposuretime-format' => '$1 ᐊᐃᑉᐸᖅ ($2)',
-'exif-brightnessvalue'     => 'ᖃᐅᒻᒪᐹ ᐊᒃᑭᐅᑕᖅ',
+'exif-brightnessvalue' => 'ᖃᐅᒻᒪᐹ ᐊᒃᑭᐅᑕᖅ',
 
 # 'all' in various places, this might be different for inflected languages
 'monthsall' => 'ᓱᓇᒥᑦᑐᖅ',
@@ -397,14 +396,14 @@ $messages = array(
 # Multipage image navigation
 'imgmultipageprev' => '← ᑐᓄᓪᓕᐹᖅ  ᒪᑉᐱᑕᖅ',
 'imgmultipagenext' => 'ᑕᒡᒐ ᒪᑉᐱᑕᖅ →',
-'imgmultigo'       => 'ᐊᐃᕗᖅ!',
+'imgmultigo' => 'ᐊᐃᕗᖅ!',
 
 # Table pager
 'table_pager_limit_submit' => 'ᐊᐃᕗᖅ',
 
 # Auto-summaries
 'autoredircomment' => 'ᖃᓂᖓᓂ ᑲᒪᒋᔭᖅ ᐋᓯᑦ ᓇᑭᑦ [[$1]]',
-'autosumm-new'     => 'ᐱᒋᕗᖅ ᒪᑉᐱᑕᖅ: $1',
+'autosumm-new' => 'ᐱᒋᕗᖅ ᒪᑉᐱᑕᖅ: $1',
 
 # Special:SpecialPages
 'specialpages' => 'ᐱᔨ ᒪᑉᐱᑕᖅ',
index 3265c55..4325b71 100644 (file)
@@ -14,49 +14,49 @@ $messages = array(
 'tog-rememberpassword' => 'Iqtuu uikipitia atiq qakugiq atuinnasivuq uvalumaq qaritaujaq (for a maximum of $1 {{PLURAL:$1|day|days}})',
 
 # Dates
-'sunday'       => 'sanattaili',
-'monday'       => 'naggajaq',
-'wednesday'    => 'pingajua',
-'friday'       => 'pagaitaak',
-'sun'          => 'sana',
-'mon'          => 'nag',
-'wed'          => 'pinga',
-'january'      => 'januari',
-'february'     => 'vipuari',
-'march'        => 'maarsi',
-'april'        => 'aipuril',
-'may_long'     => 'mai',
-'june'         => 'juni',
-'july'         => 'julai',
-'august'       => 'augus',
-'october'      => 'uktupuri',
-'november'     => 'nuvimpuri',
-'december'     => 'tisimpuri',
-'january-gen'  => 'januari',
+'sunday' => 'sanattaili',
+'monday' => 'naggajaq',
+'wednesday' => 'pingajua',
+'friday' => 'pagaitaak',
+'sun' => 'sana',
+'mon' => 'nag',
+'wed' => 'pinga',
+'january' => 'januari',
+'february' => 'vipuari',
+'march' => 'maarsi',
+'april' => 'aipuril',
+'may_long' => 'mai',
+'june' => 'juni',
+'july' => 'julai',
+'august' => 'augus',
+'october' => 'uktupuri',
+'november' => 'nuvimpuri',
+'december' => 'tisimpuri',
+'january-gen' => 'januari',
 'february-gen' => 'vipuari',
-'march-gen'    => 'maarsi',
-'april-gen'    => 'aipuril',
-'may-gen'      => 'mai',
-'june-gen'     => 'juni',
-'july-gen'     => 'julai',
-'august-gen'   => 'augus',
-'october-gen'  => 'uktupuri',
+'march-gen' => 'maarsi',
+'april-gen' => 'aipuril',
+'may-gen' => 'mai',
+'june-gen' => 'juni',
+'july-gen' => 'julai',
+'august-gen' => 'augus',
+'october-gen' => 'uktupuri',
 'november-gen' => 'nuvimpuri',
 'december-gen' => 'tisimpuri',
-'apr'          => 'aipu',
-'may'          => 'mai',
-'aug'          => 'augu',
-'nov'          => 'nuvi',
-
-'about'         => 'miksaani',
-'article'       => 'ilulik mappitaq',
-'newwindow'     => '(uittuq qarasaujaq ikiaq pigivuq igalaaq)',
-'cancel'        => 'iniqtipaa',
+'apr' => 'aipu',
+'may' => 'mai',
+'aug' => 'augu',
+'nov' => 'nuvi',
+
+'about' => 'miksaani',
+'article' => 'ilulik mappitaq',
+'newwindow' => '(uittuq qarasaujaq ikiaq pigivuq igalaaq)',
+'cancel' => 'iniqtipaa',
 'moredotdotdot' => 'pilluarivaa...',
-'mypage'        => 'ami mappitaq',
-'mytalk'        => 'atlarqutikka',
-'navigation'    => 'mianirivaa',
-'and'           => '&#32;amma',
+'mypage' => 'ami mappitaq',
+'mytalk' => 'atlarqutikka',
+'navigation' => 'mianirivaa',
+'and' => '&#32;amma',
 
 # Cologne Blue skin
 'qbspecialpages' => 'piji mappitaq',
@@ -64,135 +64,134 @@ $messages = array(
 # Vector skin
 'vector-view-edit' => 'Suqusiqpaa',
 
-'help'              => 'qajalippaa',
-'search'            => 'ivaaqpuq',
-'searchbutton'      => 'ivaaqpuq',
-'go'                => 'aivuq',
-'searcharticle'     => 'aivuk',
-'history_short'     => 'mappitaq kingunittinni',
-'edit'              => 'Suqusiqpaa',
-'editthispage'      => 'suqusiqpaa mappitaq',
-'delete'            => 'nipaqtipaa',
-'protect'           => 'sapummivaa',
-'unprotect'         => 'iq sapummivaa',
+'help' => 'qajalippaa',
+'search' => 'ivaaqpuq',
+'searchbutton' => 'ivaaqpuq',
+'go' => 'aivuq',
+'searcharticle' => 'aivuk',
+'history_short' => 'mappitaq kingunittinni',
+'edit' => 'Suqusiqpaa',
+'editthispage' => 'suqusiqpaa mappitaq',
+'delete' => 'nipaqtipaa',
+'protect' => 'sapummivaa',
+'unprotect' => 'iq sapummivaa',
 'unprotectthispage' => 'iq sapummivaa mappitaq',
-'newpage'           => 'pigivuk mappitaq',
-'specialpage'       => 'piji mappitaq',
-'articlepage'       => 'ilulik mappitaq uvva',
-'talk'              => 'uqalimajuq',
-'toolbox'           => 'sanarqutiqauti',
-'otherlanguages'    => 'killumut uiki',
-'redirectedfrom'    => '(qaningani kamagijaq aasit nakit $1)',
-'redirectpagesub'   => 'aningani kamagijaq aasit nakit mappitaq',
-'jumptonavigation'  => 'mianirivaa',
-'jumptosearch'      => 'ivaaqpuq',
+'newpage' => 'pigivuk mappitaq',
+'specialpage' => 'piji mappitaq',
+'articlepage' => 'ilulik mappitaq uvva',
+'talk' => 'uqalimajuq',
+'toolbox' => 'sanarqutiqauti',
+'otherlanguages' => 'killumut uiki',
+'redirectedfrom' => '(qaningani kamagijaq aasit nakit $1)',
+'redirectpagesub' => 'aningani kamagijaq aasit nakit mappitaq',
+'jumptonavigation' => 'mianirivaa',
+'jumptosearch' => 'ivaaqpuq',
 
 # 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'            => 'miksaani {{SITENAME}}',
-'aboutpage'            => 'Project:miksaani',
-'currentevents'        => 'pigivuq piusiq',
-'currentevents-url'    => 'Project:pigivuq piusiq',
-'edithelp'             => 'ikurripaa suqusiqpaa',
-'edithelppage'         => 'Help:suqusiqpaa',
-'mainpage'             => 'amiq',
+'aboutsite' => 'miksaani {{SITENAME}}',
+'aboutpage' => 'Project:miksaani',
+'currentevents' => 'pigivuq piusiq',
+'currentevents-url' => 'Project:pigivuq piusiq',
+'edithelp' => 'ikurripaa suqusiqpaa',
+'edithelppage' => 'Help:suqusiqpaa',
+'mainpage' => 'amiq',
 'mainpage-description' => 'amiq',
-'portal'               => 'qaggiq',
-'portal-url'           => 'Project:qaggiq',
-'privacy'              => 'namminiq pilirivviqauqtunut aulataujut atuagaq, pinasuarniq',
-'privacypage'          => 'Project:namminiq pilirivviqauqtunut aulataujut atuagaq, pinasuarniq',
+'portal' => 'qaggiq',
+'portal-url' => 'Project:qaggiq',
+'privacy' => 'namminiq pilirivviqauqtunut aulataujut atuagaq, pinasuarniq',
+'privacypage' => 'Project:namminiq pilirivviqauqtunut aulataujut atuagaq, pinasuarniq',
 
-'youhavenewmessages'  => 'ilissu pigivaa $1 ($2).',
-'newmessageslink'     => 'pigivuk kiggapaa',
+'youhavenewmessages' => 'ilissu pigivaa $1 ($2).',
+'newmessageslink' => 'pigivuk kiggapaa',
 'newmessagesdifflink' => 'annitujuq asiaNngutuq',
-'editsection'         => 'suqusiqpaa',
-'editold'             => 'suqusiqpaa',
-'editlink'            => 'suqusiqpaa',
-'editsectionhint'     => 'suqusiqpaa ilangiutititsiguti: $1',
-'site-rss-feed'       => '$1 rss mianirivaa',
-'site-atom-feed'      => '$1 atum mianirivaa',
-'page-rss-feed'       => '"$1" rss mianirivaa',
-'page-atom-feed'      => '"$1" atum mianirivaa',
+'editsection' => 'suqusiqpaa',
+'editold' => 'suqusiqpaa',
+'editlink' => 'suqusiqpaa',
+'editsectionhint' => 'suqusiqpaa ilangiutititsiguti: $1',
+'site-rss-feed' => '$1 rss mianirivaa',
+'site-atom-feed' => '$1 atum mianirivaa',
+'page-rss-feed' => '"$1" rss mianirivaa',
+'page-atom-feed' => '"$1" atum mianirivaa',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'mappitaq',
-'nstab-user'      => 'inuk mappitaq',
-'nstab-special'   => 'piji',
-'nstab-project'   => 'piliriaksait pivalliajjutiksanut miqitaq',
+'nstab-main' => 'mappitaq',
+'nstab-user' => 'inuk mappitaq',
+'nstab-special' => 'piji',
+'nstab-project' => 'piliriaksait pivalliajjutiksanut miqitaq',
 'nstab-mediawiki' => 'kiggapaa',
-'nstab-template'  => 'mianirivaa-qijuqut',
-'nstab-category'  => 'nuapput',
+'nstab-template' => 'mianirivaa-qijuqut',
+'nstab-category' => 'nuapput',
 
 # General errors
-'badtitle'         => 'ajuqtuq atiq',
+'badtitle' => 'ajuqtuq atiq',
 'editinginterface' => "'''iniqtiruti—''' aaha suqusiqpaa iqiak mappitaq atuinnasivuq iijatsaq qarasaujaq taqsaliqpaa ikiaq aqittuq qaritaujaup titirarvinga. asiaNngutuq ikiaq mappitaq inuktitut uikipitia allanguqtuaq nakimaqpuq qatannguti.",
 
 # Login and logout pages
-'welcomecreation'    => "== ariunngaipaa, $1! ==
+'welcomecreation' => "== ariunngaipaa, $1! ==
 pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiqpa{{SITENAME}} inniatuq—«''nipi ami''»",
-'yourname'           => 'uikipitia atiq',
-'yourpassword'       => 'uikipitia palanngasauti',
-'yourpasswordagain'  => 'tamatumaniiqpaa iksigaqtuq uikipitia palanngasauti',
+'yourname' => 'uikipitia atiq',
+'yourpassword' => 'uikipitia palanngasauti',
+'yourpasswordagain' => 'tamatumaniiqpaa iksigaqtuq uikipitia palanngasauti',
 'remembermypassword' => 'iqtuu uikipitia atiq qakakuq atuinnasivuq uvalumajuq qaritaujaq (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'              => 'akunnapuq',
-'loginprompt'        => 'pigialik imatuaq qaritaujaq quukiis (Cookies) pirqaati akunnapuq {{SITENAME}}.',
-'userlogin'          => 'akunnapuq / pirqaapaa kiinaijakkuvingmi tuqkuqsivik',
-'logout'             => 'anivvik',
-'userlogout'         => 'anivvik',
-'nologin'            => "ajuinnaaq inuquti? '''$1'''.",
-'nologinlink'        => 'pirqaapaa kiinaujakkuvingmi tuqkuqsivik',
-'mailmypassword'     => 'qillutuq uikipitia palanngasauti kigutiup sitiniqpaanga',
+'login' => 'akunnapuq',
+'loginprompt' => 'pigialik imatuaq qaritaujaq quukiis (Cookies) pirqaati akunnapuq {{SITENAME}}.',
+'userlogin' => 'akunnapuq / pirqaapaa kiinaijakkuvingmi tuqkuqsivik',
+'logout' => 'anivvik',
+'userlogout' => 'anivvik',
+'nologin' => "ajuinnaaq inuquti? '''$1'''.",
+'nologinlink' => 'pirqaapaa kiinaujakkuvingmi tuqkuqsivik',
+'mailmypassword' => 'qillutuq uikipitia palanngasauti kigutiup sitiniqpaanga',
 
 # Edit page toolbar
 'bold_sample' => 'ijjujug taqsaliqpaa',
-'bold_tip'    => 'ijjujug taqsaliqpaa',
+'bold_tip' => 'ijjujug taqsaliqpaa',
 
 # Edit pages
-'summary'         => 'suvit:',
-'minoredit'       => 'ukiukiluaq asianngutuq',
-'watchthis'       => 'uvva',
-'savearticle'     => 'uqausillaringgita titiraqtauninggil',
-'preview'         => 'uvva qangasaanguliqtuq',
-'showpreview'     => 'surkuqpaa alakkautivuq sivuliqpaa uqaasillarigita titiraqtauningigit',
-'showdiff'        => 'alakkatippaa asianngutuq',
+'summary' => 'suvit:',
+'minoredit' => 'ukiukiluaq asianngutuq',
+'watchthis' => 'uvva',
+'savearticle' => 'uqausillaringgita titiraqtauninggil',
+'preview' => 'uvva qangasaanguliqtuq',
+'showpreview' => 'surkuqpaa alakkautivuq sivuliqpaa uqaasillarigita titiraqtauningigit',
+'showdiff' => 'alakkatippaa asianngutuq',
 'summary-preview' => 'suvit preview:',
-'blockedtitle'    => 'aaqqiksuiji uminngasisijuq',
-'loginreqlink'    => 'akunnapuq',
-'newarticle'      => '(pigivuk)',
-'editingsection'  => 'suqusiqpaa $1 (ilangiutititsiguti)',
-'editingcomment'  => 'suqusiqpaa $1 (ujjirijaq)',
-'editconflict'    => 'suqusiqpaa akaunngiliurutiniq: $1',
+'blockedtitle' => 'aaqqiksuiji uminngasisijuq',
+'loginreqlink' => 'akunnapuq',
+'newarticle' => '(pigivuk)',
+'editingsection' => 'suqusiqpaa $1 (ilangiutititsiguti)',
+'editingcomment' => 'suqusiqpaa $1 (ujjirijaq)',
+'editconflict' => 'suqusiqpaa akaunngiliurutiniq: $1',
 
 # History pages
-'currentrev'          => 'maanna titiraqtaugiarngarut',
-'previousrevision'    => '←utuqaq titiraqtaugiarngarut',
-'nextrevision'        => 'pilluarivaa pigivuk revision titiraqtaugiarngarut→',
+'currentrev' => 'maanna titiraqtaugiarngarut',
+'previousrevision' => '←utuqaq titiraqtaugiarngarut',
+'nextrevision' => 'pilluarivaa pigivuk revision titiraqtaugiarngarut→',
 'currentrevisionlink' => 'maanna titiraqtaugiarngarut',
-'next'                => 'tagga',
+'next' => 'tagga',
 
 # Revision feed
-'history-feed-title'       => 'titiraqtaugiarngarut mappitaq kingunittinni',
+'history-feed-title' => 'titiraqtaugiarngarut mappitaq kingunittinni',
 'history-feed-description' => 'titiraqtaugiarngarut mappitaq kingunittinni ikiaq uiki',
 
 # Diffs
 'history-title' => 'titiraqtaugiarngarut mappitaq kingunittinni "$1"',
-'difference'    => '(asiaNngutuq mappitaq akunninganni titiraqtaugiarngarut)',
-'lineno'        => 'tukiqsiq $1:',
-'editundo'      => 'ipiutjaapaa',
-'diff-multi'    => '({{PLURAL:$1|atausiq kimmiuvuq titiraqtaugiarngarut|$1 kimmiuvuq titiraqtaugiarngarut}} ajuqtuq uvva.)',
+'lineno' => 'tukiqsiq $1:',
+'editundo' => 'ipiutjaapaa',
+'diff-multi' => '({{PLURAL:$1|atausiq kimmiuvuq titiraqtaugiarngarut|$1 kimmiuvuq titiraqtaugiarngarut}} ajuqtuq uvva.)',
 
 # Search results
-'nextn'       => 'tagga {{PLURAL:$1|$1}}',
+'nextn' => 'tagga {{PLURAL:$1|$1}}',
 'powersearch' => 'ivaaqpuq',
 
 # Preferences page
-'mypreferences'     => 'mi pikkumaniqpaaq',
-'prefs-rc'          => 'pigivuq asianngutuq',
+'mypreferences' => 'mi pikkumaniqpaaq',
+'prefs-rc' => 'pigivuq asianngutuq',
 'searchresultshead' => 'ivaaqpuq',
-'youremail'         => 'kigutiup sitiniqpaanga:',
-'username'          => 'uikipitia atiq:',
-'yourrealname'      => 'inullarik atiq:',
-'email'             => 'kigutiup sitiniqpaanga',
-'prefs-help-email'  => 'kigutiup sitiniqpaanga (pikkallavuq) — qakugu nalunanngilaq ilissi pijungnaqtuq pigivaa kanngunaqtuq aajiiqatiginggiq',
+'youremail' => 'kigutiup sitiniqpaanga:',
+'username' => 'uikipitia atiq:',
+'yourrealname' => 'inullarik atiq:',
+'email' => 'kigutiup sitiniqpaanga',
+'prefs-help-email' => 'kigutiup sitiniqpaanga (pikkallavuq) — qakugu nalunanngilaq ilissi pijungnaqtuq pigivaa kanngunaqtuq aajiiqatiginggiq',
 
 # User rights
 'editinguser' => "suqusiqpaa qatannguti '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
@@ -201,17 +200,17 @@ pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiq
 'recentchanges' => 'pigivuq asianngutuq',
 
 # Recent changes linked
-'recentchangeslinked'          => 'asiaNngutuq mitsaasijuq',
-'recentchangeslinked-feed'     => 'asiaNngutuq mitsaasijuq',
-'recentchangeslinked-toolbox'  => 'asiaNngutuq mitsaasijuq',
+'recentchangeslinked' => 'asiaNngutuq mitsaasijuq',
+'recentchangeslinked-feed' => 'asiaNngutuq mitsaasijuq',
+'recentchangeslinked-toolbox' => 'asiaNngutuq mitsaasijuq',
 'recentchangeslinked-noresult' => '0 asiaNngutuq itsivimmiusiqpaa mappitaq takuvallatuq sulluk tamatumani tumiku',
 
 # Upload
-'upload'            => 'mappipaa nalinaijatit',
-'uploadbtn'         => 'mappipaa nalunaijautit',
-'filedesc'          => 'piliriaksat pivigjuanguningit',
+'upload' => 'mappipaa nalinaijatit',
+'uploadbtn' => 'mappipaa nalunaijautit',
+'filedesc' => 'piliriaksat pivigjuanguningit',
 'fileuploadsummary' => 'suvit:',
-'watchthisupload'   => 'uvva',
+'watchthisupload' => 'uvva',
 
 # List redirects
 'listredirects' => 'nipi qaningani kamagijaq aasit nakit',
@@ -223,56 +222,56 @@ pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiq
 'randomredirect' => 'nakituinnaq qaujisarniq qaningani kamagijaq aasit nakit',
 
 # Statistics
-'statistics'              => 'kisitsisillgurlugitpasissitissat',
+'statistics' => 'kisitsisillgurlugitpasissitissat',
 'statistics-header-users' => 'qatannguti kisitsisillgurlugitpasissitissat',
 
 'doubleredirects' => 'tapirqilik qaningani kamagijaq aasit nakit',
 
-'brokenredirects'        => 'napivaa qaningani kamagijaq aasit nakit',
-'brokenredirects-edit'   => 'suqusiqpaa',
+'brokenredirects' => 'napivaa qaningani kamagijaq aasit nakit',
+'brokenredirects-edit' => 'suqusiqpaa',
 'brokenredirects-delete' => 'nipaqtipaa',
 
 # Miscellaneous special pages
-'listusers'         => 'qatannguti nipi',
+'listusers' => 'qatannguti nipi',
 'newpages-username' => 'uikipitia atiq:',
-'ancientpages'      => 'utuqaq ittusaq mappitaq',
-'move'              => 'uajuq',
+'ancientpages' => 'utuqaq ittusaq mappitaq',
+'move' => 'uajuq',
 
 # Book sources
 'booksources-go' => 'aivuq',
 
 # Special:AllPages
-'allpages'       => 'sunamittuq mappitaq',
-'nextpage'       => 'tagga mappitaq ($1)',
-'allpagesprev'   => 'tunullipaaq',
-'allpagesnext'   => 'tagga',
+'allpages' => 'sunamittuq mappitaq',
+'nextpage' => 'tagga mappitaq ($1)',
+'allpagesprev' => 'tunullipaaq',
+'allpagesnext' => 'tagga',
 'allpagessubmit' => 'aivuk',
 
 # Special:Categories
 'categories' => 'nuapput',
 
 # E-mail user
-'emailfrom'    => 'nakit',
+'emailfrom' => 'nakit',
 'emailmessage' => 'kiggapaa',
-'emailsend'    => 'qiutsavigivaa',
+'emailsend' => 'qiutsavigivaa',
 
 # Watchlist
-'watchlist'     => 'uvva mappitaq',
-'mywatchlist'   => 'nipi ami',
-'watch'         => 'uvva',
+'watchlist' => 'uvva mappitaq',
+'mywatchlist' => 'nipi ami',
+'watch' => 'uvva',
 'watchthispage' => 'uvva',
-'unwatch'       => 'iq uvva',
+'unwatch' => 'iq uvva',
 
 'enotif_impersonal_salutation' => '{{SITENAME}} qatannguti',
-'created'                      => 'mappitaq anivuq',
+'created' => 'mappitaq anivuq',
 
 # Delete
-'dellogpage'  => 'nipaq nipi',
+'dellogpage' => 'nipaq nipi',
 'deletionlog' => 'nipaq nipi',
 
 # Protect
-'prot_1movedto2'      => '[[$1]] surramajuq [[$2]]',
-'protect-legend'      => 'patimmivaa sapummivaa',
+'prot_1movedto2' => '[[$1]] surramajuq [[$2]]',
+'protect-legend' => 'patimmivaa sapummivaa',
 'protect-level-sysop' => 'sirlak titiraqsimajunik tuqquqtiriji',
 
 # Restrictions (nouns)
@@ -292,40 +291,40 @@ pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiq
 
 # What links here
 'whatlinkshere' => 'uqsiq maungu',
-'isredirect'    => 'tapitariik uqsaq mappitaq',
+'isredirect' => 'tapitariik uqsaq mappitaq',
 
 # Block/unblock
-'blockip'                  => 'iq aaqqiksuiji',
-'badipaddress'             => 'illituq qarisaujakkut titiraqsimajut maligatigut angirutausimajuq unikkaarijaqarniq',
-'blockipsuccesssub'        => 'uminngasisijuq naajuq',
-'ipblocklist-submit'       => 'ivaaqpuq',
-'anononlyblock'            => 'sirlak ilisarnanngitittuq',
-'blocklink'                => 'iq',
-'contribslink'             => 'qatannguti suqusiqpaa',
-'blocklogpage'             => 'uminngasisijuq/iq titiqqaqutit tuqquqsimajait',
+'blockip' => 'iq aaqqiksuiji',
+'badipaddress' => 'illituq qarisaujakkut titiraqsimajut maligatigut angirutausimajuq unikkaarijaqarniq',
+'blockipsuccesssub' => 'uminngasisijuq naajuq',
+'ipblocklist-submit' => 'ivaaqpuq',
+'anononlyblock' => 'sirlak ilisarnanngitittuq',
+'blocklink' => 'iq',
+'contribslink' => 'qatannguti suqusiqpaa',
+'blocklogpage' => 'uminngasisijuq/iq titiqqaqutit tuqquqsimajait',
 'block-log-flags-anononly' => 'ilisarnanngitittuq aaqqiksuiji kisiani',
 'block-log-flags-nocreate' => 'kiinaujaqarvik inuirutivaa iniqtipaa pigivuq',
-'block-log-flags-noemail'  => 'kigutiup sitiniqpaanga uminngasisijuq',
+'block-log-flags-noemail' => 'kigutiup sitiniqpaanga uminngasisijuq',
 
 # Move page
 'move-page-legend' => 'uajuq mappitaq',
-'movearticle'      => 'uajuq mappitaq',
-'movedto'          => 'uajuq',
-'movelogpage'      => 'uajuq nipi',
-'delete_and_move'  => 'nipaqtipaa amma uajuq',
+'movearticle' => 'uajuq mappitaq',
+'movedto' => 'uajuq',
+'movelogpage' => 'uajuq nipi',
+'delete_and_move' => 'nipaqtipaa amma uajuq',
 
 # Namespace 8 related
 'allmessagesname' => 'atiq',
 
 # Import log
-'import-logentry-upload-detail'    => '$1 {{PLURAL:$1|titiraqtaugiarngarut|titiraqtaugiarngarut}}',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|titiraqtaugiarngarut|titiraqtaugiarngarut}}',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|titiraqtaugiarngarut|titiraqtaugiarngarut}} ikiaq $2',
 
 # Tooltip help for the actions
-'tooltip-ca-protect'              => 'sapummivaa mappitaq',
-'tooltip-search'                  => 'ivaaqpuq {{SITENAME}}',
-'tooltip-minoredit'               => 'tuapaq asiaNngutuq',
-'tooltip-diff'                    => 'surrapaa qatannguti',
+'tooltip-ca-protect' => 'sapummivaa mappitaq',
+'tooltip-search' => 'ivaaqpuq {{SITENAME}}',
+'tooltip-minoredit' => 'tuapaq asiaNngutuq',
+'tooltip-diff' => 'surrapaa qatannguti',
 'tooltip-compareselectedversions' => 'uvva asiaNngutuq mappitaq akunninganni marruuk titiraqtaugiarngarut',
 
 # Attribution
@@ -336,25 +335,25 @@ pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiq
 
 # Browsing diffs
 'previousdiff' => '← tunullipaaq asiaNngutuq',
-'nextdiff'     => 'tagga asiaNngutuq mappitaq →',
+'nextdiff' => 'tagga asiaNngutuq mappitaq →',
 
 # Special:NewFiles
 'ilsubmit' => 'ivaaqpuq',
-'bydate'   => 'pitaaruttuq inuulirvik',
+'bydate' => 'pitaaruttuq inuulirvik',
 
 # Variants for Inuktitut language
 'variantname-ike-cans' => 'ᑎᑎᕋᐅᓯᖅ ᓄᑖᖅ',
 'variantname-ike-latn' => 'ilisautik',
-'variantname-iu'       => 'disable',
+'variantname-iu' => 'disable',
 
 # EXIF tags
-'exif-imagelength'         => 'qutsingniq',
-'exif-imagedescription'    => 'inunnguaq atiq',
-'exif-colorspace'          => 'minguarutimitiqpaa',
-'exif-datetimeoriginal'    => 'qatsipaa amma tikiuti sarqipaa isuillingaitjapaa',
-'exif-datetimedigitized'   => 'qatsipaa amma tikiuti sarqipaa qarasaujaq',
+'exif-imagelength' => 'qutsingniq',
+'exif-imagedescription' => 'inunnguaq atiq',
+'exif-colorspace' => 'minguarutimitiqpaa',
+'exif-datetimeoriginal' => 'qatsipaa amma tikiuti sarqipaa isuillingaitjapaa',
+'exif-datetimedigitized' => 'qatsipaa amma tikiuti sarqipaa qarasaujaq',
 'exif-exposuretime-format' => '$1 aippaq ($2)',
-'exif-brightnessvalue'     => 'qaummapaa akkiutaq',
+'exif-brightnessvalue' => 'qaummapaa akkiutaq',
 
 # 'all' in various places, this might be different for inflected languages
 'monthsall' => 'sunamittuq',
@@ -365,14 +364,14 @@ pigivuq qatannguti uikipitia kiinaujaqutiqarvik isuillingaitjapaa. iqtuu suqusiq
 # Multipage image navigation
 'imgmultipageprev' => '← tunullipaaq mappitaq',
 'imgmultipagenext' => 'tagga mappitaq →',
-'imgmultigo'       => 'aivuq!',
+'imgmultigo' => 'aivuq!',
 
 # Table pager
 'table_pager_limit_submit' => 'aivuk',
 
 # Auto-summaries
 'autoredircomment' => 'qaningani kamagijaq aasit nakit [[$1]]',
-'autosumm-new'     => 'pigivuq mappitaq: $1',
+'autosumm-new' => 'pigivuq mappitaq: $1',
 
 # Special:SpecialPages
 'specialpages' => 'piji mappitaq',
index 3af5815..00ef0ab 100644 (file)
@@ -46,7 +46,7 @@ $messages = array(
 'tog-numberheadings' => 'Automatiko a pabilangan dagiti paulo',
 'tog-showtoolbar' => 'Ipakita ti ramit ti panag-urnos (masapul ti JavaScript)',
 'tog-editondblclick' => 'Urnosen dagiti panid iti mamindua a panagtakla (masapul ti JavaScript)',
-'tog-editsection' => 'Pakabaelan ti panag-urnos iti paset babaen kadagiti [urnosen] a  panilpo',
+'tog-editsection' => 'Pakabaelan ti paset a panag-urnos babaen kadagiti [urnosen] a  panilpo',
 'tog-editsectiononrightclick' => 'Pakabaelan ti paset  a panag-urnos babaen ti agtakla ti kanawan kadagiti paset a titulo (masapul ti JavaScript)',
 'tog-showtoc' => 'Ipakita ti tabla dagiti linaon (para kadagiti panid nga adda ti ad-adu ngem dagiti 3 a paulo)',
 'tog-rememberpassword' => 'Laglagipem ti iseserrekko iti daytoy a pagbasabasa (iti kapaut nga $1 {{PLURAL:$1|aldaw|al-aldaw}})',
@@ -83,7 +83,7 @@ $messages = array(
 
 'underline-always' => 'Kanayon',
 'underline-never' => 'Saan uray kaanoman',
-'underline-default' => 'Kasisigud a pagbasabasa',
+'underline-default' => 'Kasisigud a kudil wenno pagbasabasa',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Urnosen ti kita ti letra iti lugar:',
@@ -168,8 +168,8 @@ $messages = array(
 'newwindow' => '(aglukat iti sabali a tawa)',
 'cancel' => 'Ukasen',
 'moredotdotdot' => 'Adu pay...',
-'mypage' => 'Panidko',
-'mytalk' => 'Pakitungtungak',
+'mypage' => 'Panid',
+'mytalk' => 'Tungtungan',
 'anontalk' => 'Tungtungan para iti daytoy a pagtaengan ti IP',
 'navigation' => 'Pagdaliasatan',
 'and' => '&#32;ken',
@@ -179,7 +179,6 @@ $messages = array(
 'qbbrowse' => 'Agbasabasa',
 'qbedit' => 'Urnosen',
 'qbpageoptions' => 'Daytoy a panid',
-'qbpageinfo' => 'Linaon',
 'qbmyoptions' => 'Pampanidko',
 'qbspecialpages' => 'Espesial a pampanid',
 'faq' => 'FAQ',
@@ -192,7 +191,7 @@ $messages = array(
 'vector-action-protect' => 'Salakniban',
 'vector-action-undelete' => 'Isubli ti inikkat',
 'vector-action-unprotect' => 'Sukatan ti salaknib',
-'vector-simplesearch-preference' => 'Pakabaelan ti napasayaat a singasing ti panagbiruk (Kudil a Vector laeng)',
+'vector-simplesearch-preference' => 'Pakabaelan ti napalaka a baras ti panagbiruk (Kudil a Vector laeng)',
 'vector-view-create' => 'Agaramid',
 'vector-view-edit' => 'Urnosen',
 'vector-view-history' => 'Kitaen ti pakasaritaan',
@@ -202,6 +201,7 @@ $messages = array(
 'namespaces' => 'Nagan ti lug-lugar',
 'variants' => 'Sab-sabali a pagsasao',
 
+'navigation-heading' => 'Pagpilian ti pagdaliasatan',
 'errorpagetitle' => 'Biddut',
 'returnto' => 'Agsubli idiay $1.',
 'tagline' => 'Naggapo idiay {{SITENAME}}',
@@ -281,7 +281,7 @@ $1',
 'mainpage' => 'Umuna a Panid',
 'mainpage-description' => 'Umuna a Panid',
 'policy-url' => 'Project:Annuroten',
-'portal' => 'Pagdadanonan',
+'portal' => 'Portal ti komunidad',
 'portal-url' => 'Project:Portal ti komunidad',
 'privacy' => 'Annuroten iti kinapribado',
 'privacypage' => 'Project:Annuroten iti kinapribado',
@@ -366,7 +366,7 @@ naggapu ti uneg ti opisio "$2".
 Ti database ket nangipatulod ti biddut "$3: $4".',
 'laggedslavemode' => 'Ballaag: Mabalin a ti panid ket saan nga aglaon kadagiti naudi a panagpabaro.',
 'readonly' => 'Nakandadoan ti database',
-'enterlockreason' => 'Agikabil ti maysa a rasaon para iti kandado, agraman ti karkulo no kaano a maluktan ti kandado',
+'enterlockreason' => 'Agikabil ti maysa a rason para iti kandado, agraman ti karkulo no kaano a malukatan ti kandado',
 'readonlytext' => 'Ti database ket agdama a naikandado kadagiti baro a panagikabil ken panagbaliw, mabalin a gapu dagiti kanayon a pagsimpa, ket no malpas kadawyanto nga agsubli.
 
 Ti administrador a nangkandado ket nangited ti daytoy a palawag: $1',
@@ -401,8 +401,8 @@ Awan ti intedna a palawag.',
 'badtitle' => 'Madi a titulo',
 '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 naidulin ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagan|dagiti $1 a nagbanagan}} ket magun-od idiay nagidulinan.',
-'perfcachedts' => 'Ti sumaganad a data ket naidulin, ken naudi a napabaro idi $1. Ti kaadu a {{PLURAL:$4|iti maysa a nagbanagan |dagiti $4 nagbanagan}} ket magun-od idiay pagidulinan.',
+'perfcached' => 'Ti sumaganad a datos ket naidulin ken mabalin a saan a napabaro. Ti kaadu {{PLURAL:$1|iti maysa a nagbanagan|dagiti $1 a nagbanagan}} ket magun-od idiay nagidulinan.',
+'perfcachedts' => 'Ti sumaganad a datos ket naidulin, ken naudi a napabaro idi $1. Ti kaadu a {{PLURAL:$4|iti maysa a nagbanagan |dagiti $4 nagbanagan}} ket magun-od idiay pagidulinan.',
 'querypage-no-updates' => 'Dagiti panangpabaro iti daytoy a panid ket agdama a nabaldado. 
 Saan a mipasaradiwa ita dagiti datos ditoy.',
 'wrong_wfQuery_params' => 'Kamali a parametro iti wfQuery()<br />
@@ -413,7 +413,7 @@ Panagsapul: $2',
 'actionthrottled' => 'Napabuntog ti aramid',
 '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.',
+'protectedpagetext' => 'Nasalakniban daytoy a panid tapno mapawilan ti panag-urnos wenno dagiti dadduma pay nga aksion.',
 'viewsourcetext' => 'Mabalinmo a kitaen ken tuladen ti taudan daytoy a panid:',
 'viewyourtext' => "Mabalinmo a makita ken tuladen ti taudan dagiti '''inurnosmo''' ditoy a panid:",
 'protectedinterface' => 'Daytoy a panid ket mangited ti testo nga interface para iti software iti daytoy a wiki, ken nasalakniban tapno mapawilan ti panag-abuso.
@@ -446,11 +446,11 @@ Ti administrador a nagserra ket nagited iti daytoy a panagilawlawag "\'\'$3\'\'"
 # Login and logout pages
 'logouttext' => "'''Nakaruarkan.'''
 
-Mabalinmo nga ituloy ti agusar iti {{SITENAME}} a di am-ammo, wenno [[Special:UserLogin|sumrek ka manen]] iti sigud wenno sabali nga agar-aramat.
+Mabalinmo nga ituloy ti agusar iti {{SITENAME}} a di am-ammo, wenno <span class='plainlinks'>[\$1 sumrek ka manen]</span> iti sigud wenno sabali nga agar-aramat.
 Laglagipem a sumagmamano a pampanid ti mabalin a nakaparang latta a kasla nakaserrekka pay laeng, aginggana no dalusam ti \"cache\" ti panagbasabasam.",
-'welcomecreation' => '== Kablaaw, $1! ==
-Naaramiden ti pakabilangam.
-Dimo liplipatan a sukatan dagita kaykayatmo idiay [[Special:Preferences|{{SITENAME}} kaykayat]].',
+'welcomeuser' => 'Naragsak nga isasangbay, $1!',
+'welcomecreation-msg' => 'Naaramiden ti pakabilangam.
+Dimo liplipatan a sukatan dagiti kakaykayatam idiay [[Special:Preferences|{{SITENAME}} kakaykayatan]].',
 'yourname' => 'Nagan ti agar-aramat:',
 'yourpassword' => 'Kontrasenias:',
 'yourpasswordagain' => 'Uliten ti kontrasenias:',
@@ -746,12 +746,12 @@ Ti naudi a listaan ti panaka-serra ket adda dita baba tapno mausar a reperensia:
 'sitejspreview' => "'''Laglagipem nga ipadpadasmo laeng ti kodigo daytoy a JavaScript.'''
 '''Saan pay nga naidulin!'''",
 'userinvalidcssjstitle' => "'''Ballaag:''' Awan ti kudil a \"\$1\".
-Annawid a .css ken .js dagiti titulo ket agususar ti napababa a letra, a kas dagiti {{ns:user}}:Foo/vector.css saan ket a {{ns:user}}:Foo/Vector.css.",
+Annawid a .css ken .js dagiti titulo ket agususar ti babassit a letra, a kas dagiti {{ns:user}}:Foo/vector.css saan ket a {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Napabaro)',
 'note' => "'''Paammo:'''",
 'previewnote' => "'''Laglagipem a daytoy ket panagipadas laeng.'''
 Dagiti sinukatam ket saan pay a naidulin!",
-'continue-editing' => 'Agtultuloy nga agurnos',
+'continue-editing' => 'Mapan idiay pagurnosan a lugar',
 'previewconflict' => 'Daytoy a panagpadas ket agiparang ti testo dita ngato a panagurnos a lugar a kasla agparang no kayatmo nga idulin.',
 'session_fail_preview' => "'''Pasensia! Saanmi a maaramid ti panag-urnos gapu ngamin ta naawanan ti gimong ti data.'''
 Pangngaasi a padasem manen.
@@ -783,11 +783,11 @@ Adda sabali a mausar tapno makaurnoska kadagiti panid: Ti saan nga-ASCII a kabab
 'editingold' => "'''Ballag: Ururnosem ti daan a panag-baliw iti daytoy a panid.'''
 No idulinmo, mapukaw amin a sinukatam iti daytoy a panag-baliw.",
 'yourdiff' => 'Dagiti nagdudumaan',
-'copyrightwarning' => "Laglagipenyo koma, apo, nga amin a parawad iti {{SITENAME}} ket maibilang a mairuar iti babaen ti $2 (kitaen ti $1 para kadagiti salaysay). 
+'copyrightwarning' => "Laglagipenyo koma, apo, nga amin a maiparawad iti {{SITENAME}} ket maibilang a mairuar babaen ti $2 (kitaen ti $1 para kadagiti salaysay). 
 No dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmo laengen nga ip-ipan wenno ipabpablaak ditoy.<br />
-Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo manipud ti maysa a nawaya a pagturayan ti publiko wenno ti kapadpadana a lnawaya a nagtaudan.
+Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo manipud ti maysa a nawaya a pagturayan ti publiko wenno ti kapadpadana a nawaya a nagtaudan.
  '''Saan a mangited ti adda karbenganna a panagipablaak nga obra no awan ti  pammalubos!'''",
-'copyrightwarning2' => "Pangngaasiyo, apo, a laglagipen nga amin a parawad iti {{SITENAME}} ket mabalin a maurnos, masuktan, wenno ikkaten dagiti sabali pay nga agar-aramat.
+'copyrightwarning2' => "Pangngaasiyo, apo, a laglagipen nga amin a maiparawad iti {{SITENAME}} ket mabalin a maurnos, masuktan, wenno ikkaten dagiti sabali pay nga agar-aramat.
 No dimo kayat a ti sinuratmo ket maurnos nga awanan-asi ken maiwaras nga awan sungsungbatan kenka, saanmo laengen nga ip-ipan wenno ipabpablaak ditoy.<br />
 Kasta met nga ikarim kadakami a bukodmo a sinurat wenno gapuanan daytoy, wenno tinuladmo manipud ti maysa a nawaya a pagturayan ti publiko wenno ti kapadpadana a nawaya a pagtaudan (kitaen ti $1 para iti salaysay).
 '''Saan a mangipan iti adda ti karbenganna a panagpablaak nga obra no awan ti  pammalubos!'''",
@@ -836,6 +836,15 @@ Kasla met naikkaten.',
 'edit-already-exists' => 'Saan a makaaramid ti baro a panid.
 Adda met daytoyen.',
 'defaultmessagetext' => 'Kasisigud a testo ti mensahe',
+'content-failed-to-parse' => 'Napaay a nausig ti $2 a linaon para iti $1 a modelo: $3',
+'invalid-content-data' => 'Imbalido a datos ti linaon',
+'content-not-allowed-here' => 'Ti "$1" a linaon ket saan a maipalubos idiay [[$2]] a panid',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'naranas a testo',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Ballaag:''' Daytoy a panid ket adu unay kadagiti nangina a parser a pamay-an  a panagtawtawag.
@@ -1058,7 +1067,7 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'searchresults-title' => 'Dagiti nabirukan a nagbanagan para iti "$1"',
 'searchresulttext' => 'Para iti adu pay a pakaammo a maipanggep ti panagbiruk {{SITENAME}}, kitaem ti [[{{MediaWiki:Helppage}}|{{int:help}}]].',
 'searchsubtitle' => 'Nagbirukka  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'''",
+'searchsubtitleinvalid' => "Nagbirukka para  iti '''$1'''",
 'toomanymatches' => 'Adu unay ti napasubli  nga agpapada, pangngaasi a padasem ti sabali a panagsapul',
 'titlematches' => 'Dagiti kapadpada a titulo ti panid',
 'notitlematches' => 'Awan dagiti kapadpada a titulo ti panid',
@@ -1094,8 +1103,6 @@ Dagiti salaysay ket mabalin a mabirukan idiay [{{fullurl:{{#Special:Log}}/delete
 'search-interwiki-caption' => 'Dagiti kakabsat a gandat',
 'search-interwiki-default' => '$1 dagiti nagbanagan:',
 'search-interwiki-more' => '(adu pay)',
-'search-mwsuggest-enabled' => 'addaan dagiti singasing',
-'search-mwsuggest-disabled' => 'awanan dagiti singasing',
 'search-relatedarticle' => 'Mainaig',
 'mwsuggest-disable' => 'Pagsardengen dagiti AJAX a naisingasing',
 'searcheverything-enable' => 'Agbirukka kadagiti amin a nagan ti lugar',
@@ -1130,15 +1137,15 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'qbsettings-directionality' => 'Nasimpa, gapu laeng ti papanan ti panagsurat ti pagsasaom',
 
 # Preferences page
-'preferences' => 'Kaykayatan',
-'mypreferences' => 'Kaykayatko',
+'preferences' => 'Kakaykayatan',
+'mypreferences' => 'Kakaykayatan',
 'prefs-edits' => 'Bilang dagiti inurnos:',
 'prefsnologin' => 'Saan a nakastrek',
-'prefsnologintext' => 'Masapul a <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nakastrekka]</span> tapno makapili kadagiti kaykayatmo.',
+'prefsnologintext' => 'Masapul a <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} nakastrekka]</span> tapno makapili kadagiti kakaykayatam.',
 'changepassword' => 'Baliwan ti kontrasenias',
 'prefs-skin' => 'Kudil',
 'skin-preview' => 'Padasem',
-'datedefault' => 'Awan ti kaykayatan',
+'datedefault' => 'Awan ti kakaykayatan',
 'prefs-beta' => 'Dagiti beta a langa',
 'prefs-datetime' => 'Petsa ken oras',
 'prefs-labs' => 'Dagiti subokan a langa',
@@ -1147,7 +1154,7 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 'prefs-rc' => 'Kinaudi a binalbaliwan',
 'prefs-watchlist' => 'Listaan ti bambantayan',
 'prefs-watchlist-days' => 'Alaldaw nga iparang idiay listaan ti bambantayan:',
-'prefs-watchlist-days-max' => 'Kabayag nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
+'prefs-watchlist-days-max' => 'Kapaut nga $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}',
 'prefs-watchlist-edits' => 'Kaadu a bilang ti ipakita kadagiti sinukatan iti napadakkel a bambantayan:',
 'prefs-watchlist-edits-max' => 'Kaadu a bilang: 1000',
 'prefs-watchlist-token' => 'Tandaan ti bambantayan:',
@@ -1176,7 +1183,7 @@ Laglagipem laeng a dagiti pagsurotan nagyan ti {{SITENAME}} ket baka baak.',
 No adda makaammo daytoy a tulbek ditoy a pagikabilan ket mabalin da a basaen ti binambantayam, masapul nga agpilika ti pateg a seguridad.
 
 Adda ditoy ti pugto a pateg a mausarmo: $1',
-'savedprefs' => 'Naidulin dagitoy kaykayatmon.',
+'savedprefs' => 'Naidulinen dagiti kakaykayatam.',
 'timezonelegend' => 'Sona ti oras:',
 'localtime' => 'Lokal nga oras:',
 'timezoneuseserverdefault' => 'Usaren ti wiki a kasisigud ($1)',
@@ -1197,13 +1204,13 @@ Adda ditoy ti pugto a pateg a mausarmo: $1',
 'allowemail' => 'Pakabaelam ti e-surat a naggapu kadagiti sabali nga agar-aramat',
 'prefs-searchoptions' => 'Biruken',
 'prefs-namespaces' => 'Nagan ti luglugar',
-'defaultns' => 'Wenno no saan agbirukka kadagitoy a nagan ti luglugar:',
+'defaultns' => 'Wenno saan agbirukka kadagitoy a nagan ti luglugar:',
 'default' => 'kasisigud',
 'prefs-files' => 'Dagiti papeles',
 'prefs-custom-css' => 'Naiduma a CSS',
 'prefs-custom-js' => 'Naiduma a JavaScript',
 'prefs-common-css-js' => 'Bingay a CSS/JavaScript dagiti amin a kudil:',
-'prefs-reset-intro' => 'Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kaykayatmo iti kinasigud daytoy a wiki.
+'prefs-reset-intro' => 'Mabalinmo nga usaren daytoy a panid tapno maisublim dagita kakaykayatam iti kasisigud ti daytoy a wiki.
 Ngem saanto a mabalinen nga ipasubli.',
 'prefs-emailconfirm-label' => 'Pagsingkedan ti e-surat:',
 'prefs-textboxsize' => 'Ti kadakkel ti pagurnosan a tawa',
@@ -1215,7 +1222,7 @@ Ngem saanto a mabalinen nga ipasubli.',
 'yourrealname' => 'Pudno a nagan:',
 'yourlanguage' => 'Pagsasao:',
 'yourvariant' => 'Linaon ti sabali a pagsasao:',
-'prefs-help-variant' => 'Ti kaykayatmo a sabsabali a panagsurat a maipakita kadagiti linaon ti panid daytoy a wiki.',
+'prefs-help-variant' => 'Ti kinaykayatmo a kita ti pagsasao wenno sabali a panagsurat a maipakita kadagiti linaon ti panid daytoy a wiki.',
 'yournick' => 'Baro a pirma:',
 'prefs-help-signature' => 'Komentario kadagiti  pakipatangan a panid ket  mapirmaan koma iti "<nowiki>~~~~</nowiki>" nga agpabalin ti pirmam ken ti petsa.',
 'badsig' => 'Saan a pudno a kilaw a pirma.
@@ -1232,7 +1239,7 @@ Daytoy a pakaammo ket makita ti publiko.',
 'prefs-help-realname' => 'Saan a nasken ti pudno a nagan.
 Ngem no kayatmo nga ited, maaramat daytoy a kas pammadayaw ken pangpatalged iti obram.',
 'prefs-help-email' => 'Ti e-surat a pagtaengan ket saan a masapul, ngem masapul no agsukat ka ti kontrasenias, no baka malipatam ti kontrasenias mo.',
-'prefs-help-email-others' => 'Mabalinmo nga agpili tapno dagiti sabsabali nga agar-aramat ket ma e-suratandaka idiay panagsilpo ti panidmo wenno ti panid ti kapatangam.
+'prefs-help-email-others' => 'Mabalinmo nga agpili tapno dagiti sabsabali nga agar-aramat ket ma e-suratandaka idiay panagsilpo ti panidmo wenno ti panid ti tungtungam.
 Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak kenka.',
 'prefs-help-email-required' => 'Masapul ti e-surat a pagtaengan.',
 'prefs-info' => 'Kangrunaan a pakaammuan',
@@ -1367,6 +1374,9 @@ Ti e-surat a pagtaengam ket saan nga maipakita kadagiti agar-aramat nga agkontak
 'rightslogtext' => 'Listaan daytoy kadagiti sinukatan a karbengan ti agar-aramat.',
 'rightslogentry' => 'sinukatan ti panagkameng iti bunggoy ti $1 manipud $2 iti $3',
 'rightslogentry-autopromote' => 'naautomatiko a naipangato a naggapo iti $2 idiay $3',
+'logentry-rights-rights' => 'Ni $1 ket nangbaliw ti grupo a panakaikameng para kenni $3 manipud ti $4 iti $5',
+'logentry-rights-rights-legacy' => 'Ni $1 ket nangbaliw ti grupo a panakaikameng para kenni $3',
+'logentry-rights-autopromote' => 'Ni $1 ket automatiko idi a naipangato manipud ti $4 iti $5',
 'rightsnone' => '(awan)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1456,7 +1466,7 @@ Dagiti panid iti [[Special:Watchlist|listaan ti bambantayam]] ket '''napuskol'''
 # Upload
 'upload' => 'Mangipan iti papeles',
 'uploadbtn' => 'Mangipan iti papeles',
-'reuploaddesc' => 'Ukasen ti pag-ipan ken absubli idiay kabuklan ti pag-ipan',
+'reuploaddesc' => 'Ukasen ti pag-ipan ken agsubli idiay kabuklan ti pag-ipan',
 'upload-tryagain' => 'Ited ti napabaro a panagipalawag ti papeles',
 'uploadnologin' => 'Saan a nakastrek',
 'uploadnologintext' => 'Masapul a [[Special:UserLogin|nakaserrekka]] tapno makaipanka iti papeles.',
@@ -1522,7 +1532,7 @@ 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  <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.
+'filepageexists' => 'Ti panangipalpalawag a panid ti daytoy a papeles ket naaramiden idiay <strong>[[:$1]]</strong>, ngem 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]]',
@@ -1604,6 +1614,7 @@ No ti parikut ket agsubli latta, kontaken ti [[Special:ListUsers/sysop|administr
 'backend-fail-notsame' => 'Addaan ti saan a kapada ti papeles idiay $1.',
 'backend-fail-invalidpath' => '$1 ket imbalido a pagnaan ti pagidulinan.',
 'backend-fail-delete' => 'Saan a maikkat ti papeles $1.',
+'backend-fail-describe' => 'Saam a mabaliwan ti metadata para iti papeles ti "$1".',
 'backend-fail-alreadyexists' => 'Ti papeles $1 ket addan.',
 'backend-fail-store' => 'Saan a maidulin ti papeles $1 idiay $2.',
 'backend-fail-copy' => 'Saan a makopia ti papeles $1 idiay $2.',
@@ -1689,9 +1700,9 @@ Para iti kangatuan a talinaay, nabaldado ti img_auth.php.',
 'upload-curl-error6-text' => 'Ti URL a naited ket saan a madanon.
 Pangngaasi ta kitaem manen no husto ti URL ken adda dayta a pagsaadan.',
 'upload-curl-error28' => 'Nagsardeng ti panag-ipan',
-'upload-curl-error28-text' => 'Ti pagsaadan ket nabayag unay nga simmungbat.
-Pangngaasi ti kitaen no naipatakder ti pagsaadan, aguray no madamdama ket padasem manen.
-Baka kayatmo a padasen no saan da a makumikom.',
+'upload-curl-error28-text' => 'Ti pagsaadan ket nabayag unay a simmungbat.
+Pangngaasi a kitaen no naipatakder ti pagsaadan, aguray no madamdama ket padasem manen.
+Baka kayatmo a padasen no saan a makumikom nga oras.',
 
 'license' => 'Lisensia:',
 'license-header' => 'Lisensia',
@@ -1750,11 +1761,11 @@ Baka kayatmo nga urnosen ti bukodna a deskripsion idiay [$2 deskripsion ti papel
 'sharedupload-desc-create' => 'Daytoy a papeles ket naggapu manipud idiay  $1  ken mabalin a mausar babaen dagiti sabali a gandat.
 Baka kayatmo nga urnosen ti bukodna a deskripsionna idiay [$2 deskripsion ti papeles a panid].',
 'filepage-nofile' => 'Awan ti agnagan ti kasta a papeles.',
-'filepage-nofile-link' => 'Awan ti agnagan ti kastoy a papeles, ngem mabalin mo ti [$1 mangipan].',
+'filepage-nofile-link' => 'Awan ti agnagan ti kastoy a papeles, ngem mabalinmo ti [$1 mangipan].',
 'uploadnewversion-linktext' => 'Mangipan ti kabarbaro a bersion iti daytoy a papeles',
 'shared-repo-from' => 'Naggapo iti $1',
 'shared-repo' => 'iti pagbingbingayan a nagikabilan',
-'upload-disallowed-here' => 'Daksanggasat a saanmo a mabalin a suratan manen daytoy nga imahen.',
+'upload-disallowed-here' => 'Saanmo a masuratan manen daytoy nga imahen.',
 
 # File reversion
 'filerevert' => 'Isubli ti $1',
@@ -1764,7 +1775,7 @@ Baka kayatmo nga urnosen ti bukodna a deskripsionna idiay [$2 deskripsion ti pap
 'filerevert-defaultcomment' => 'Naisubli ti bersion manipud idi $2, $1',
 'filerevert-submit' => 'Isubli',
 'filerevert-success' => "Ti '''[[Media:$1|$1]]''' ket naipasubli idiay [$4 bersion ti oras ken petsa $3, $2].",
-'filerevert-badversion' => 'Awan ti dati a lokal a bersion daytoy a papelesa naited ti dayta nga oras ken petsa.',
+'filerevert-badversion' => 'Awan ti dati a lokal a bersion daytoy a papeles a naited ti dayta nga oras ken petsa.',
 
 # File deletion
 'filedelete' => 'Ikkaten ti $1',
@@ -1782,13 +1793,13 @@ Baka kayatmo nga urnosen ti bukodna a deskripsionna idiay [$2 deskripsion ti pap
 'filedelete-reason-dropdown' => '*Kadawyan a rasrason ti pannakaikkat
 ** Panagsalungasing iti karbengan ti panagkopia
 ** Nadoble a papeles',
-'filedelete-edit-reasonlist' => 'Unosen dagiti rason ti panagikkat',
+'filedelete-edit-reasonlist' => 'Urnosen dagiti rason ti panagikkat',
 'filedelete-maintenance' => 'Ti panagikkat ken panagisubli kadagiti papaeles ket nabaldado iti las-ud ti panagtartaripatu.',
 'filedelete-maintenance-title' => 'Saan a maikkat daytoy a papeles',
 
 # MIME search
 'mimesearch' => 'Pagbiruk ti MIME',
-'mimesearch-summary' => 'Daytoy a panid ket pakabaelan na ti panagsagat ti papeles iti kita da a MIME.
+'mimesearch-summary' => 'Daytoy a panid ket pakabaelanna ti panagsagat ti papeles iti MIME a kitada.
 Ikabil: kita ti nagyan/apo a kita, a kas ti <code>image/jpeg</code>.',
 'mimetype' => 'Kita ti MIME:',
 'download' => 'Ikarga nga agpababa',
@@ -1824,14 +1835,14 @@ Laglagipem ti agkita kadagiti sabsabali a panilpo ti plantilia sakbay nga ikkate
 'statistics-pages' => 'Pampanid',
 'statistics-pages-desc' => 'Dagiti amin a panid ti wiki, a mairaman dagiti tungtungan a panid, dagiti baw-ing, ken dadduma pay',
 'statistics-files' => 'Ti naipapan a papeles',
-'statistics-edits' => 'Dagit naurnos a panid manipud idi nairugi ti {{SITENAME}}',
-'statistics-edits-average' => 'Pagtengngaan nga urnos tungal maysa a panid',
+'statistics-edits' => 'Dagiti naurnos a panid manipud idi nairugi ti {{SITENAME}}',
+'statistics-edits-average' => 'Pagtengngaan nga urnos ti tunggal maysa a panid',
 'statistics-views-total' => 'Dagiti dagup ti panagkita',
 'statistics-views-total-desc' => 'Saan a naikabil ti panagkita dagiti awan a panid ken dagiti espesial a panid',
-'statistics-views-peredit' => 'Mano a panagkita tunggal maysa nga urnos',
+'statistics-views-peredit' => 'Mano a panagkita ti tunggal maysa nga urnos',
 'statistics-users' => 'Dagiti nakarehistro nga [[Special:ListUsers|agar-aramat]]',
 'statistics-users-active' => 'Dagiti nasiglat nga agar-aramat',
-'statistics-users-active-desc' => 'Dagiti agar-aramat a nagtungpal iti aramid idi napalubos nga {{PLURAL:$1|aldaw|$1 al-aldaw}}',
+'statistics-users-active-desc' => 'Dagiti agar-aramat a nagtungpal ti aramid ti napalabas nga {{PLURAL:$1|aldaw|$1 nga al-aldaw}}',
 'statistics-mostpopular' => 'Kaaduan a nabuya a pampanid',
 
 'disambiguations' => 'Dagiti panid a nakasilpo kadagiti panangilawlawag',
@@ -1936,7 +1947,7 @@ Pangngaasi a laglagipen a dagiti sabali a sapot ti pagsaadan  ket makasilpoda ti
 'booksources-search-legend' => 'Agsapul kadagiti nagtaudan ti liblibro',
 'booksources-go' => 'Inkan',
 'booksources-text' => 'Dita baba ket listaan dagiti panilpo ti sabsali a lugar nga aglaklako ti liblibro, ken baka adda pay adu a pakaammo da kadagiti liblibro a kitkitaem:',
-'booksources-invalid-isbn' => 'Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti pinagtulad kadagiti naggappuanna a taudan.',
+'booksources-invalid-isbn' => 'Ti naited nga ISBN ket kasla saan nga umisu; kitaen dagiti biddut ti panagtulad kadagiti naggappuanna a taudan.',
 
 # Special:Log
 'specialloguserlabel' => 'Ti nagtungpal:',
@@ -1984,7 +1995,7 @@ Kitaen met [[Special:WantedCategories|dagiti makidkiddaw a kategoria]].',
 # Special:DeletedContributions
 'deletedcontributions' => 'Dagiti naikkat nga inararamid ti agar-aramat',
 'deletedcontributions-title' => 'Dagiti naikkat nga inararamid ti agar-aramat',
-'sp-deletedcontributions-contribs' => 'dagiti parawad',
+'sp-deletedcontributions-contribs' => 'naar-aramid',
 
 # Special:LinkSearch
 'linksearch' => 'Dagiti panagbiruk ti ruar a panilpo',
@@ -1993,7 +2004,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: <code>$1</code> (saanmo nga inayon dagitoy iti panagbirukmo) .',
+Dagiti nasuportaran a protokol: <code>$1</code> (naipakasigud ti http:// no awan ti protokol a nainaganan).',
 'linksearch-line' => 'Ti $1 ket nakasilpo idiay $2',
 'linksearch-error' => 'Ti naatap a tarheta ket agparang laeng iti pinagrugi ti nagan ti agsangaili.',
 
@@ -2042,7 +2053,7 @@ Adda pay ngata [[{{MediaWiki:Listgrouprights-helppage}}|adu pay a pakaammo]] a m
 'emailuser-title-target' => 'E-suratam daytoy nga {{GENDER:$1|agar-aramat}}',
 'emailuser-title-notarget' => 'E-suratan ti agar-aramat',
 'emailpage' => 'E-suratan ti agar-aramat',
-'emailpagetext' => 'Mabalinmo nga usaren ti kinabuklan dita baba nga agipatulod ti e-surat a mensahe daytoy nga agar-aramat.
+'emailpagetext' => 'Mabalinmo nga usaren ti kinabuklan dita baba nga agipatulod ti e-surat a mensahe ti daytoy nga {{GENDER:$1|agar-aramat}}.
 Ti e-surat nga inkabilmo idiay  [[Special:Preferences|kakaykayatam]] ket agparang a kas "Naggapu" a pagtaengan ti e-surat, tapno ti nagipatulodam ket makasungbat kenka.',
 'usermailererror' => 'Kita ti surat ket nangisubli ti biddut:',
 'defemailsubject' => '{{SITENAME}} e-surat naggapo ken ni "$1"',
@@ -2074,7 +2085,7 @@ Ti e-surat nga inkabilmo idiay  [[Special:Preferences|kakaykayatam]] ket agparan
 
 # Watchlist
 'watchlist' => 'Bambantayak',
-'mywatchlist' => 'Bambantayak',
+'mywatchlist' => 'Bambantayan',
 'watchlistfor2' => 'Para iti $1 $2',
 'nowatchlist' => 'Awan ti banag iti listaan dagiti bambantayam.',
 'watchlistanontext' => 'Pangngaasim ti $1 tapno makitam dagiti inurnosmo dita bambantayam.',
@@ -2110,20 +2121,23 @@ Mailistanto ditoy dagiti pinagsukat daytoy a panid iti masakbayan agraman ti kan
 
 'enotif_mailer' => 'Agipatulod ti pakiammo ti {{SITENAME}}',
 'enotif_reset' => 'Markaan amin a pampanid a kas nasarungkaranen',
-'enotif_newpagetext' => 'Baro daytoy a panid.',
 'enotif_impersonal_salutation' => '{{SITENAME}} agar-aramat',
-'changed' => 'nasukatan',
-'created' => 'naaramid',
-'enotif_subject' => 'Ti {{SITENAME}} a panid a $PAGETITLE ket $CHANGEDORCREATED ni $PAGEEDITOR',
+'enotif_subject_deleted' => 'Ti {{SITENAME}} a panid ti $1 ket inikkat idin babaen ni {{gender:$2|$2}}',
+'enotif_subject_created' => 'Ti {{SITENAME}} a panid ti $1 ket napartuat idin babaen ni {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Ti {{SITENAME}} panid ti $1 ket naiyalis idin babaen ni {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Ti {{SITENAME}} a panid ti $1 ket naipasubli idin babaen ni {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Ti {{SITENAME}} a panid ti $1 ket nasukatan idin babaen ni {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Ti {{SITENAME}} a panid ti $1 ket naikkat idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_created' => 'Ti {{SITENAME}} a panid ti $1 ket napartuat idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_moved' => 'Ti {{SITENAME}} a panid ti $1 ket naiyalis idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_restored' => 'Ti {{SITENAME}} a panid ti $1 ket naipasubli idi idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
+'enotif_body_intro_changed' => 'Ti {{SITENAME}} a panid ti $1 ket nasukatan idin idiay $PAGEEDITDATE babaen ni {{gender:$2|$2}}, kitaen ti $3 para iti agdama panagbaliw.',
 'enotif_lastvisited' => 'Kitaen ti $1 para iti am-amin a panagsukat sipud ti naudi nga isasarungkarmo.',
 'enotif_lastdiff' => 'Kitaen ti $1 tapno mabuya daytoy a panagsukat.',
 'enotif_anon_editor' => 'di am-ammo nga agar-aramat $1',
 'enotif_body' => 'Nadungngo a $WATCHINGUSERNAME,
 
-
-Ti {{SITENAME}} a panid $PAGETITLE ket $CHANGEDORCREATED idi $PAGEEDITDATE ni $PAGEEDITOR, kitaen ti $PAGETITLE_URL ti agdama a panagbaliw.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Pakabuklan ti mannurat: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2131,10 +2145,9 @@ Kontaken ti mannurat:
 surat: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Awanen iti sabali pay a paka-ammo a maipatulod kenka no adda pay dagiti masukatan inggana laeng no sarungkaram daytoy a panid.
-Mabalin met nga ipasadiwa dagiti bandera ti paka-ammom para amin kadagiti buybuyaem a panid idiay bambantayam.
+Awanen ti sabali pay a paka-ammo a maipatulod kenka no adda pay dagiti masukatan inggana laeng no sarungkaram daytoy a panid. Mabalin met nga ipasadiwa dagiti bandera ti paka-ammom para amin kadagiti buybuyaem a panid idiay bambantayam.
 
-                        Ti gayyem mo iti {{SITENAME}} a sistema ti pagpa-ammo
+Ti gayyemmo ti {{SITENAME}} a sistema ti pagpa-ammo
 
 --
 Ti panagsukat ti kasasaad ti e-surat a pagpa-ammom, sarungkaram ti
@@ -2195,7 +2208,7 @@ ti naudi a nakaaramid ket iti laeng nagsurat daytoy a panid..',
 'alreadyrolled' => 'Saan a maipasubli ti kinaudi a panagurnos iti [[:$1]] babaen ni [[User:$2|$2]] ([[User talk:$2|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
 adda sabali a naurnos wenno nagipasubli ti panid.
 
-Ti kinaudi a panagurnos daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+Ti kinaudi a panagurnos ti daytoy a panid ket babaen ni [[User:$3|$3]] ([[User talk:$3|tungtungan]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
 'editcomment' => "Ti panagurnos a pakabuklan idi ket: \"''\$1''\".",
 'revertpage' => 'Insubli ti panagurnos babaen ni [[Special:Contributions/$2|$2]] ([[User talk:$2|tungtungan]]), naisubli ti kinaudi a panagbaliw babaen ni [[User:$1|$1]]',
 'revertpage-nouser' => 'Naisubli ti panagurnos babaen ni (naikkat ti nagan ti agar-aramat) ti kinaudi a panagbaliw babaen ni [[User:$1|$1]]',
@@ -2306,8 +2319,8 @@ Addaan ka ngata ti madi a panilpo, wenno ti panagbaliw ket naipasubli wenno naik
 'undeletedrevisions' => '{{PLURAL:$1|1 a  binaliwan|dagiti $1 a binaliwan}} ti naisubli',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 a binaliwan|dagiti $1 a binaliwan}} ken {{PLURAL:$2|1 a papeles|dagiti $2 a papeles}} ti naisubli',
 'undeletedfiles' => '{{PLURAL:$1|1 a papeles|dagiti $1 a papeles}} ti naisubli',
-'cannotundelete' => 'Napaay ti panagikkat;
-adda ngata immuna a nagikkat ti panid.',
+'cannotundelete' => 'Napaay ti panagikkat:
+$1',
 'undeletedpage' => "'''Naisublin ti $1'''
 
 Binsiren ti [[Special:Log/delete|listaan ti naik-ikkat]] para iti listaan dagiti naudi a naik-ikkat ken naisubsubli.",
@@ -2341,7 +2354,7 @@ $1',
 # Contributions
 'contributions' => 'Naaramidan dagiti agar-aramat',
 'contributions-title' => 'Naaramidan ni $1',
-'mycontris' => 'Naaramidak',
+'mycontris' => 'Naar-aramid',
 'contribsub2' => 'Para iti $1 ($2)',
 'nocontribs' => 'Awan ti nasarakan a nasukatan a kapada daytoy a kita.',
 'uctop' => '(rabaw)',
@@ -2379,10 +2392,10 @@ Ti naudi a listaan ti panakaserra ket adda dita baba ta usaren a reperensia:',
 'whatlinkshere-prev' => '{{PLURAL:$1|kallabes|kallabes $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|sumaruno|sumaruno $1}}',
 'whatlinkshere-links' => '← silsilpo',
-'whatlinkshere-hideredirs' => '$1 a panangibaw-ing',
-'whatlinkshere-hidetrans' => '$1 a mairamraman',
-'whatlinkshere-hidelinks' => '$1 a pampanilpo',
-'whatlinkshere-hideimages' => '$1 a pampanilpo ti imahen',
+'whatlinkshere-hideredirs' => '$1 dagiti baw-ing',
+'whatlinkshere-hidetrans' => '$1 dagiti mailaklak-am',
+'whatlinkshere-hidelinks' => '$1 dagiti silpo',
+'whatlinkshere-hideimages' => '$1 a silsilpo ti papeles',
 'whatlinkshere-filters' => 'Dagiti sagat',
 
 # Block/unblock
@@ -2433,7 +2446,7 @@ Kitaen ti [[Special:BlockList|listaan ti lapden nga IP ]] tapno marepaso dagiti
 'ipb-blocklist' => 'Kitaen dagiti adda a serra',
 'ipb-blocklist-contribs' => 'Dagiti naaramidan ni $1',
 'unblockip' => 'Lukatan ti serra ti agar-aramat',
-'unblockiptext' => 'Usaren ti kinabuklan dita baba ti pinagisubli ti pinagserrek nga agsurat ti napalubos a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.',
+'unblockiptext' => 'Usaren ti kinabuklan dita baba ti pinagisubli ti pinagserrek nga agsurat ti napalabas a naserran nga IP a pagtaengan wenno nagan ti agar-aramat.',
 'ipusubmit' => 'Ikkaten daytoy a serra',
 'unblocked' => 'Naikkat ti panakaserra ni [[User:$1|$1]]',
 'unblocked-range' => '$1 naikkaten ti serra na',
@@ -2590,7 +2603,7 @@ Pangngaasim a mangpilika iti sabali a nagan.',
 'talkexists' => "'''Sibaballigi a naiyalis ti panid, nupay kasta saan a maiyalis ti panid ti tungtongan gapu ta addan panid-tungtongan iti baro a titulo.
 Pangngaasim ta i-manualmo lattan a pagtiponem ida.'''",
 'movedto' => 'naiyalis iti',
-'movetalk' => 'Iyalis ti mainaig a panid ti tungtongan',
+'movetalk' => 'Iyalis ti mainaig a panid ti tungtungan',
 'move-subpages' => 'Iyalis dagiti apo ti panid (aginggana ti $1)',
 'move-talk-subpages' => 'Iyalis dagiti apo ti panid iti tungtungan ti panid (aginggana ti $1)',
 'movepage-page-exists' => 'Ti panid ti $1 ket addan ken saan a mautomatiko a suratan manen.',
@@ -2608,7 +2621,7 @@ Pangngaasim ta i-manualmo lattan a pagtiponem ida.'''",
 'delete_and_move_text' => '== Masapul nga ikkaten ==
 Ti pangipanan ti panid ket "[[:$1]]" addan.
 Kayatmo nga ikkaten  tapno makaiyalis ka?',
-'delete_and_move_confirm' => 'Wen, ikkatenen ti panid',
+'delete_and_move_confirm' => 'Wen, ikkaten ti panid',
 'delete_and_move_reason' => 'Naikkat tapno mawayaan ti panaka-iyalis idiay "[[$1]]"',
 'selfmove' => 'Ti titulo ti taudan ken ti pangipanan ket agpadpada;
 saanmo a maiyalis ti panid ti isu met laeng a panid.',
@@ -2617,6 +2630,7 @@ saanmo a maiyalis ti panid ti isu met laeng a panid.',
 'immobile-target-namespace-iw' => 'Ti panilpo nga interwiki ket saan na mabalin nga iyalis.',
 'immobile-source-page' => 'Saan a mabalin nga iyalis daytoy a panid.',
 'immobile-target-page' => 'Saan a maiyalis dita a papananna a titulo.',
+'bad-target-model' => 'Ti kinaykayat a pagipanan ket agus-usar ti sabali a modelo ti linaon. Saan a maipabalin manipud ti $1 iti $2.',
 'imagenocrossnamespace' => 'Saan a maiyalis ti papeles idiay saan a papeles a nagan ti lugar',
 'nonfile-cannot-move-to-file' => 'Saan a maiyalis ti saan a papeles idiay papeles a nagan a lugar',
 'imagetypemismatch' => 'Ti baro a pagpaatiddog ti papeles ket saan nga agpada ti kita na',
@@ -2628,7 +2642,7 @@ Ti kinaudi a naikabil ti listaan ket adda dita baba tapno mausar a reperensia:",
 'semiprotectedpagemovewarning' => "'''Pakaammo:''' Nasalakniban daytoy a panid tapno dagiti laeng nakarehistro nga agar-aramat ti makaiyalis daytoy.
 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.',
+[[:$1]] addaan idiay pagbingayan a nagikabilan. Ti panagiyalis ti papeles iti titulo nga itoy ket paawanenna ti pagbingayan a papeles.',
 'file-exists-sharedrepo' => 'Ti napilim a nagan ti papeles ket naususaren idiay pagbingayan a pagikabilan.
 Pangngaasi nga agpilika ti sabali a nagan.',
 
@@ -2637,13 +2651,13 @@ Pangngaasi nga agpilika ti sabali a nagan.',
 'exporttext' => 'Maipanmo ti testo ken pakasaritaan ti inurnos iti maysa a panid wenno pampanid a nabalkut ti XML.
 Daytoy ket mabalin a maikabil iti sabali a wiki nga agususar ti MediaWiki nga usaren ti [[Special:Import|pinagala ti panid]].
 
-Ti pinagipan ti panid, ikabil ti titulo dita kahon ti testo dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a pinagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a pinagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a pinagurnos.
+Ti pinagipan ti panid, ikabil ti titulo dita kahon ti testo dita baba, maysa a titulo iti maysa a linia, ken agpili ka no ti kayatmo ket ti agdama a pinagbaliw ken amin nga daan a panagbalbaliw, nga addaan ti linia ti pakasaritaan ti pampanid, wenno ti agdama a panagbaliw nga addaan ti pakaammo a maipapan ti kinaudi a panagurnos.
 
 No iti kinaudi a kaso mabalinmo nga usaren ti panilpo, a kas pagarigan [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] para iti panid "[[{{MediaWiki:Mainpage}}]]".',
 'exportall' => 'Ipan amin a pampanid',
 'exportcuronly' => 'Iraman laeng ti kinaudi a panagbaliw, saan a ti napno a pakasaritaan',
 'exportnohistory' => "----
-'''Palagip:''' Ti pagipapan dagiti punno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti pinakalaing ti pinagandar a rason.",
+'''Palagip:''' Ti pagipapan dagiti punno a pakasaritaan dagiti panid iti daytoy a kinabuklan ket nabaldado gapu dagiti panakalaing ti panagandar a rason.",
 'exportlistauthors' => 'Iraman ti amin a listaan kadagiti nagaramid iti tunggal a maysa a panid',
 'export-submit' => 'Agipan',
 'export-addcattext' => 'Agnayon kadagiti panid a naggapu idiay kategoria:',
@@ -2660,10 +2674,10 @@ No iti kinaudi a kaso mabalinmo nga usaren ti panilpo, a kas pagarigan [[{{#Spec
 'allmessagesdefault' => 'Kasisigud a testo ti mensahe',
 'allmessagescurrent' => 'Agdama a testo ti mensahe',
 'allmessagestext' => 'Daytoy ti listaan dagiti mensahe ti sistema a magun-od idiay MediaWiki a nagan ti lugar.
-Pangngaasi a bisitaeen ti [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] ken [//translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.',
+Pangngaasi a bisitaen ti [//www.mediawiki.org/wiki/Localisation Lokalisasion ti MediaWiki] ken [//translatewiki.net translatewiki.net] no kayatmo ti agparawad kadagiti sapasap a panagipatarus ti MediaWiki.',
 'allmessagesnotsupportedDB' => "Saan a mausar daytoy a panid ngamin ket ti '''\$wgUseDatabaseMessages''' ket nabaldado.",
 'allmessages-filter-legend' => 'Sagat',
-'allmessages-filter' => 'Sagaten ti naiduma a estado:',
+'allmessages-filter' => 'Sagaten babaen ti naipaduma nga estado:',
 'allmessages-filter-unmodified' => 'Saan a nabaliwan',
 'allmessages-filter-all' => 'Amin',
 'allmessages-filter-modified' => 'Napabaro',
@@ -2682,7 +2696,7 @@ Pangngaasi a bisitaeen ti [//www.mediawiki.org/wiki/Localisation MediaWiki Local
 'thumbnail_invalid_params' => 'Imbalido a parametro ti imahen',
 'thumbnail_dest_directory' => 'Saan a nakaaramid ti pangipanan a direktoria.',
 'thumbnail_image-type' => 'Daytoy a kita ti imahen ket saan a nasuportaran.',
-'thumbnail_gd-library' => 'Saan a kompleto a GD bibliotika a pinakaaramid: Awan ti opisio $1',
+'thumbnail_gd-library' => 'Saan a kompleto a GD biblioteka a panakaaramid: Awan ti opisio $1',
 'thumbnail_image-missing' => 'Daytoy a papeles ket  kasla napukaw: $1',
 
 # Special:Import
@@ -2708,7 +2722,7 @@ Amin a transwiki nga alaem ket mailista idiay [[Special:Log/import|listaan ti pi
 'importunknownsource' => 'Di amammo a kita ti taudan ti innala',
 'importcantopen' => 'Saan a maluktan ti innala a papeles',
 'importbadinterwiki' => 'Saan a nasayaat a panilpo nga interwiki',
-'importnotext' => 'Awanan linaon wenno awanan testo',
+'importnotext' => 'Awan linaon wenno awan ti testo',
 'importsuccess' => 'Nalpasen ti pinagala!',
 'importhistoryconflict' => 'Adda kasinnungat a pinagbaliw ti pakasaritaan (baka naala daytoy a panid idi)',
 'importnosources' => 'Awan ti innala a taudan ti transwiki ti naipalawag ken ti dagus a pakasaritaan ti pinag-ipan ket nabaldado.',
@@ -2724,11 +2738,11 @@ Awan ti saan nga agnayon a polder.',
 'import-nonewrevisions' => 'Amin a panagbalbaliw ket dati a naala.',
 'xml-error-string' => '$1 iti linia $2, tukol $3 (byte $4): $5',
 'import-upload' => 'Ipan ti XML data',
-'import-token-mismatch' => 'Napukaw ti gimong ti data.
-Pangngaasi ta padasem manen.',
+'import-token-mismatch' => 'Napukaw ti gimong ti datos.
+Pangngaasi a padasem manen.',
 'import-invalid-interwiki' => 'Saan a makaala dita naited a wiki.',
-'import-error-edit' => 'Ti panid ti "$1" ket saan a naala ngamin ket saan mo a mabalin nga urnosen.',
-'import-error-create' => 'Ti panid ti "$1" ket saan a naala ngamin ket saan mo a mabalin nga aramiden.',
+'import-error-edit' => 'Ti panid ti "$1" ket saan a naala ngamin ket saanmo a mabalin nga urnosen.',
+'import-error-create' => 'Ti panid ti "$1" ket saan a naala ngamin ket saanmo a mabalin nga aramiden.',
 'import-error-interwiki' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket nailasin para iti ruar a panagsilpo (interwiki).',
 'import-error-special' => 'Ti panid ti "$1" ket saan a naala ngamin ket bukod ti  espesial a nagan a lugar a saan nga agpalubos ti pampanid.',
 'import-error-invalid' => 'Ti panid ti "$1" ket saan a naala ngamin ket ti nagan ket imbalido.',
@@ -2746,7 +2760,6 @@ Pangngaasi ta padasem manen.',
 
 # JavaScriptTest
 'javascripttest' => 'Subsubokan ti JavaScript',
-'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".',
@@ -2756,15 +2769,15 @@ Pangngaasi ta padasem manen.',
 'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit test suite',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Daytoy ti panid mo',
+'tooltip-pt-userpage' => 'Panidmo nga agar-aramat',
 'tooltip-pt-anonuserpage' => 'Ti panid ti agar-aramat daytoy nga IP a pagtaengan nga urnosem a  kasla',
 'tooltip-pt-mytalk' => 'Pakitungtungam a panid',
 'tooltip-pt-anontalk' => 'Pakitungtungan a maipapan ti panagurnos a naggapu ditoy nga IP a pagtaengan',
-'tooltip-pt-preferences' => 'Dagiti kaykayatmo',
-'tooltip-pt-watchlist' => 'Listaan dagiti panid a sipsiputem ti panagsuksutda',
-'tooltip-pt-mycontris' => 'Listaan dagiti naaramidmo',
-'tooltip-pt-login' => 'Maisingasing ti inka panag-serrek; nupay kasta, daytoy ket saan a maipapilit',
-'tooltip-pt-anonlogin' => 'Maisingasing ti inka panag-serrek; nupay kasta, daytoy ket saan a maipapilit',
+'tooltip-pt-preferences' => 'Dagiti kakaykayatam',
+'tooltip-pt-watchlist' => 'Listaan dagiti panid a sipsiputem para iti panakabalbaliw',
+'tooltip-pt-mycontris' => 'Listaan dagiti inaramidmo',
+'tooltip-pt-login' => 'Maisingasing a sumrekka; nupay kasta, daytoy ket saan a maipapilit',
+'tooltip-pt-anonlogin' => 'Maisingasing a sumrekka; nupay kasta, daytoy ket saan a maipapilit',
 'tooltip-pt-logout' => 'Rummuar',
 'tooltip-ca-talk' => 'Pagtungtungan a maipapan ti linaon ti panid',
 'tooltip-ca-edit' => 'Mabalinmo nga urnosen daytoy a panid. Pangngaasi nga aramatem ti buton ti panagipadas sakbay nga agidulin',
@@ -2789,7 +2802,7 @@ Mabalinmo a kitaen ti taudanna.',
 'tooltip-n-currentevents' => 'Agsapul iti lugar ti likud a pakaammo kadagiti agdama a paspasamak',
 'tooltip-n-recentchanges' => 'Listaan dagiti naudi a sinukatan iti wiki.',
 'tooltip-n-randompage' => 'Mangiparuar iti pugto a panid',
-'tooltip-n-help' => 'Ti lugar a pakasapulan.',
+'tooltip-n-help' => 'Ti lugar a pagsapulan',
 'tooltip-t-whatlinkshere' => 'Listaan ti am-amin a pampanid ti wiki a nakasilpo ditoy',
 'tooltip-t-recentchangeslinked' => 'Kinaudian a sinukatan  dagiti panid a nakasilpo ditoy a panid',
 'tooltip-feed-rss' => 'RSS a pakan para iti daytoy a panid',
@@ -2812,9 +2825,9 @@ Mabalinmo a kitaen ti taudanna.',
 'tooltip-ca-nstab-category' => 'Kitaen ti panid ti kategoria',
 'tooltip-minoredit' => 'Markaan daytoy a kas bassit a panag-urnos',
 'tooltip-save' => 'Idulin dagiti sinukatam',
-'tooltip-preview' => 'Ipadas dagiti sinukatam, pangngaasimnga usarem daytoy sakbay nga idulinmo ti panid!',
+'tooltip-preview' => 'Ipadas dagiti sinukatam, pangngaasim nga usarem daytoy sakbay nga idulinmo ti panid!',
 'tooltip-diff' => 'Ipakita no ania dagiti sinukatan nga inaramidmo iti testo',
-'tooltip-compareselectedversions' => 'Kitaen ti naggidiatan dagiti dua a napili a bersion daytoy a panid.',
+'tooltip-compareselectedversions' => 'Kitaen ti naggidiatan dagiti dua a napili a bersion ti daytoy a panid.',
 'tooltip-watch' => 'Inayon daytoy a panid idiay listaan dagiti bambantayam',
 'tooltip-watchlistedit-normal-submit' => 'Ikkaten dagiti titulo',
 'tooltip-watchlistedit-raw-submit' => 'Pabaruen ti listaan ti bambantayan',
@@ -2822,7 +2835,7 @@ Mabalinmo a kitaen ti taudanna.',
 'tooltip-upload' => 'Rugian ti agip-ipan',
 'tooltip-rollback' => '"Baliktaden"   isubli ti inurnos (dagiti inurnos) ti daytoy a panid ti kinaudi a nangaramid iti maysa a takla',
 'tooltip-undo' => '"Ibabawi" ipasubli daytoy nga urnos ken lukatanna ti kinabuklan ti urnos iti panagpadas. Agpabalin daytoy a mangikabil ti rason idiay pinakabuklan.',
-'tooltip-preferences-save' => 'Idulin dagiti kaykayatmo',
+'tooltip-preferences-save' => 'Idulin dagiti kakaykayatam',
 'tooltip-summary' => 'Ikabil ti bassit a pakabuklan',
 
 # Metadata
@@ -2852,6 +2865,7 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 
 # Info page
 'pageinfo-title' => 'Pakaammo para iti "$1"',
+'pageinfo-not-current' => 'Pasensia, saan a mabalin ti mangited ti pakaammo para kadagiti daan a panagbalbaliw.',
 'pageinfo-header-basic' => 'Kangrunaan a pakaammuan',
 'pageinfo-header-edits' => 'Pakasaritaan ti inurnos',
 'pageinfo-header-restrictions' => 'Panagsalaknib ti panid',
@@ -2860,6 +2874,7 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 'pageinfo-default-sort' => 'Kasisigud a kangrunaan a panagilasin',
 'pageinfo-length' => 'Kaatiddog ti panid (kadagiti byte)',
 'pageinfo-article-id' => 'ID ti panid',
+'pageinfo-language' => 'Pagsasao ti naglaon a panid',
 'pageinfo-robot-policy' => 'Kasasaad ti panagbiruk a makina',
 'pageinfo-robot-index' => 'Mabalin a maipasurotan',
 'pageinfo-robot-noindex' => 'Saan a mabalin a maipasurotan',
@@ -2876,10 +2891,17 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 'pageinfo-authors' => 'Dagup a bilang dagiti naisangsangayn a mannurat',
 'pageinfo-recent-edits' => 'Itay nabiit a bilang dagiti inurnos (ti uneg ti napalabas ti $1)',
 'pageinfo-recent-authors' => 'Itay nabiit a bilang dagiti naisangsangayan a mannurat',
-'pageinfo-restriction' => 'Panagsalaknib ti panid ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'Salamangka  {{PLURAL:$1|a balikas|a balbalikas}} ($1)',
 'pageinfo-hidden-categories' => 'Nailemmeng {{PLURAL:$1|a kategoria|a katkategoria}} ($1)',
 'pageinfo-templates' => 'Nailak-am  {{PLURAL:$1|a plantilia|a planplantilia}} ($1)',
+'pageinfo-toolboxlink' => 'Pakaammo ti panid',
+'pageinfo-redirectsto' => 'Maibaw-ing idiay',
+'pageinfo-redirectsto-info' => 'pakaammo',
+'pageinfo-contentpage' => 'Naibilang a kas naglaon a panid',
+'pageinfo-contentpage-yes' => 'Wen',
+'pageinfo-protect-cascading' => 'Dagiti panagsalaknib ket agsariap manipud ditoy',
+'pageinfo-protect-cascading-yes' => 'Wen',
+'pageinfo-protect-cascading-from' => 'Dagiti panagsalaknib ket agsariap manipud idiay',
 
 # Patrolling
 'markaspatrolleddiff' => 'Markaan a kas napatruliaan',
@@ -2891,6 +2913,8 @@ Daytoy ket mabalin a gapuanan babaen ti panilpo a naiparit ti akin ruar a pagsaa
 'markedaspatrollederror' => 'Madi a mamarkaan a kas napatruliaan',
 'markedaspatrollederrortext' => 'Nasken a naganam ti maysa a rebision tapno mamarkaan a kas napatruliaan.',
 'markedaspatrollederror-noautopatrol' => 'Saanmo a mabalin a markaan dagita sinukatam a kas napatruliaan.',
+'markedaspatrollednotify' => 'Daytoy a panagbaliw ti $1 ket namarkaanen a kas napatruliaan.',
+'markedaspatrollederrornotify' => 'Ti panagmarka a kas napatruliaan ket napaay.',
 
 # Patrol log
 'patrol-log-page' => 'Listaan ti napatruliaan',
@@ -2954,6 +2978,7 @@ No usarem daytoy, baka makompromiso ti sistema.",
 'hours' => '{{PLURAL:$1|$1 oras$1 oras}}',
 'days' => '{{PLURAL:$1|$1 aldaw|$1 al-aldaw}}',
 'ago' => '$1 nagtapos',
+'just-now' => 'tatta laeng',
 
 # Bad image list
 'bad_image_list' => 'Ti kinabuklan ket kas iti sumaganad:
@@ -3061,9 +3086,9 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-gaincontrol' => 'Scene control',
 'exif-contrast' => 'Contrast',
 'exif-saturation' => 'Saturation',
-'exif-sharpness' => 'Sharpness',
+'exif-sharpness' => 'Kalawag',
 'exif-subjectdistancerange' => 'Nasakup a kaadayo ti suheto',
-'exif-imageuniqueid' => 'Unique image ID',
+'exif-imageuniqueid' => 'Naisangsangayan nga ID ti imahen',
 'exif-gpsversionid' => 'Etiketa a bersion ti GPS',
 'exif-gpslatituderef' => 'Amianan wenno Abagatan a Latitude',
 'exif-gpslatitude' => 'Latitude',
@@ -3071,11 +3096,11 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-gpslongitude' => 'Longitude',
 'exif-gpsaltituderef' => 'Reperensia ti kangato',
 'exif-gpsaltitude' => 'Kangato',
-'exif-gpstimestamp' => 'GPS time (atomic clock)',
-'exif-gpssatellites' => 'Dagiti satellites a naaramat iti measurement',
+'exif-gpstimestamp' => 'GPS nga oras (atomiko a pagurasan)',
+'exif-gpssatellites' => 'Dagiti satelite a naaramat para iti panagrukod',
 'exif-gpsstatus' => 'Receiver status',
 'exif-gpsmeasuremode' => 'Panagrukod a moda',
-'exif-gpsdop' => 'Measurement precision',
+'exif-gpsdop' => 'Kasayaat ti panagrukod',
 'exif-gpsspeedref' => 'Speed unit',
 'exif-gpsspeed' => 'Kapaspas ti GPS receiver',
 'exif-gpstrackref' => 'Reperensia iti direksion ti panaggunay',
@@ -3148,7 +3173,7 @@ Dagiti dadduma ket mailemmeng a kinasigud.
 'exif-attributionurl' => 'No usaren manen daytoy nga obra, pangngaasi nga agisilpo idiay',
 'exif-preferredattributionname' => 'No usaren manen daytoy nga obra, pangngaasi a padayawen ni',
 'exif-pngfilecomment' => 'Komentario ti PNG a papeles',
-'exif-disclaimer' => 'Dagiti karbengan ken rebbeng',
+'exif-disclaimer' => 'Renunsia',
 'exif-contentwarning' => 'Ballaag ti nagyan',
 'exif-giffilecomment' => 'Komentario ti GIF a papeles',
 'exif-intellectualgenre' => 'Kita ti banag',
@@ -3389,7 +3414,7 @@ no kadamdama ka a nangaramid ti pakabilangam, aguray ka pay ti mano a minutos a
 'confirmemail_sent' => 'Naipatuloden ti pammasingked nga e-surat.',
 'confirmemail_oncreate' => 'Ti pakasingkedan a kodigo ket naipatulod dita e-surat a pagtaengam.
 Daytoy a kodigo ket saan a masapul ti sumrek, ngem masapulmo nga ited sakbay ka nga agpabalin kadagiti e-surat a langa ti wiki.',
-'confirmemail_sendfailed' => 'Ti {{SITENAME}} ket saan a makaipatulod ti pammasingke a surat.
+'confirmemail_sendfailed' => 'Ti {{SITENAME}} ket saan a makaipatulod ti pammasingked a surat.
 Pangngaasi a kitaem ti e-surat a pagtaengam para kadagiti imbalido a karakter.
 
 Insubli ti nangisurat: $1',
@@ -3415,11 +3440,11 @@ ta pasardengem ti pinakasingkedan ti e-surat a  pagtaengam:
 $5
 
 Daytoy a pammasingked a kodigo ket agpaso iti $4.',
-'confirmemail_body_changed' => 'Addaan, baka sika, ti naggapu ti IP a apagtaengam $1,
+'confirmemail_body_changed' => 'Addaan, baka sika, ti naggapu ti IP a pagtaengam $1,
 ket nangsukat ti e-surat a pagtaengan ti pakabilangan "$2" iti daytoy a pagtaengan idiay {{SITENAME}}
 
 Tapno mapasingkedan daytoy a pakabilangan ket kukuam ken ti 
-pinagpabalin ti e-surat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:
+panagpabalin ti e-surat a kita idiay {{SITENAME}}, lukatam daytoy a panilpo dita pabasabasam:
 
 $3
 
@@ -3449,6 +3474,7 @@ Daytoy a kodigo a pasingkedan ket agpaso iti $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Nabaldado ti Interwiki panagiraman]',
 'scarytranscludefailed' => '[Napaay ti panagala ti plantilia para iti $1]',
+'scarytranscludefailed-httpstatus' => '[Napaay ti panagala ti plantilia para iti $1: HTTP $2]',
 'scarytranscludetoolong' => '[Atiddog unay ti URL]',
 
 # Delete conflict
@@ -3533,7 +3559,7 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
 'watchlisttools-raw' => 'Urnosen ti kilaw a listaan ti bambantayan',
 
 # Signatures
-'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|patang]])',
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|tungtungan]])',
 
 # Core parser functions
 'unknown_extension_tag' => 'Di amammo a pagpaatiddog nga etiketa "$1"',
@@ -3559,9 +3585,10 @@ Mabalinmo pay nga [[Special:EditWatchlist|usaren ti dati a panagurnos]].',
 'version-license' => 'Lisensia',
 'version-poweredby-credits' => "Daytoy a wiki ket pinaandar ti '''[//www.mediawiki.org/ MediaWiki]''', karbengan a kopia © 2001-$1 $2.",
 'version-poweredby-others' => 'dadduma pay',
-'version-license-info' => 'Ti MediaWiki ket nawaya a software; maiwaras mo ken/wenno mabaliwam babaen ti banag iti GNU General Public License a naipablaak babaen ti Free Software Foundation; nupay iti bersion 2 iti Lisensia, wenno (ti panagpilim) ti  ania man a bersion.
+'version-credits-summary' => 'Kayat mi kuma a pammadayawan dagiti sumaganad a tao para kadagiti inparawadda ti [[Special:Version|MediaWiki]].',
+'version-license-info' => 'Ti MediaWiki ket nawaya a software; maiwarasmo ken/wenno mabaliwam babaen ti banag iti GNU General Public License a naipablaak babaen ti Free Software Foundation; nupay iti bersion 2 iti Lisensia, wenno (ti panagpilim) ti  ania man a bersion.
 
-Ti MediaWiki ket naiwarwaras nga addaan ti namnama a makatulong, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANAKAILAKO wenno KALAINGAN NA ITI DAYTOY A PANGGEP. Kitaen ti GNU Sapasap a  Publiko a Lisensia para kadagiti adu pay a salaysay.
+Ti MediaWiki ket naiwarwaras nga adda ti namnama a makatulong, ngem AWAN TI ANIA MAN A GARANTIA; nga awan pay ti naibagbaga a PANAKAILAKO wenno KALAINGAN NA ITI DAYTOY A PANGGEP. Kitaen ti GNU Sapasap a  Publiko a Lisensia para kadagiti adu pay a salaysay.
 
 Naka-awat ka kuman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a  Publiko a Lisensia] a nairaman iti daytoy a programa; no saan, agsurat ka idiay Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA wenno [//www.gnu.org/licenses/old-licenses/gpl-2.0.html basaem idiay online].',
 'version-software' => 'Naikabil a software',
@@ -3576,7 +3603,7 @@ Naka-awat ka kuman ti [{{SERVER}}{{SCRIPTPATH}}/COPYING kopia iti GNU Sapasap a
 'filepath-page' => 'Papeles:',
 'filepath-submit' => 'Inkan',
 'filepath-summary' => 'Daytoy nga espesial a panid ket agisubli ti kompleto a dalan ti papeles.
-Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti papeles ket mangrugi da a idiay nakairamanan da a programa.',
+Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti papeles ket dagus a mangrugida idiay nakairamananda a programa.',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Agbiruk kadagiti duplikado a papeles',
@@ -3603,7 +3630,7 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'specialpages-group-users' => 'Dagiti agar-aramat ken karkarbengan',
 'specialpages-group-highuse' => 'Adu ti panaka-usar a pampanid',
 'specialpages-group-pages' => 'Listaan dagiti panid',
-'specialpages-group-pagetools' => 'Dagiti ramramit ti panid',
+'specialpages-group-pagetools' => 'Ramramit ti panid',
 'specialpages-group-wiki' => 'Linaon ti wiki ken ramramit',
 'specialpages-group-redirects' => 'Maibawbaw-ing dagiti espesial a pampanid',
 'specialpages-group-spam' => 'Ramramit kontra spam',
@@ -3627,7 +3654,7 @@ Dagiti imahen ket agparang iti kadakkelan a resolusion, dagiti sabali a kita ti
 'tag-filter' => '[[Special:Tags|Ti etiketa]] a sagat:',
 'tag-filter-submit' => 'Sagat',
 'tags-title' => 'Dagiti etiketa',
-'tags-intro' => 'Daytoy a panid ket ilista na dagiti etiketa nga usaren ti software nga agmarka ti panag-urnos, ken dagiti kayat da a saoen.',
+'tags-intro' => 'Daytoy a panid ket ilistana dagiti etiketa nga usaren ti software nga agmarka ti panag-urnos, ken dagiti kayatda a saoen.',
 'tags-tag' => 'Nagan ti etiketa',
 'tags-display-header' => 'Tabas dagiti listaan ti panagsukat',
 'tags-description-header' => 'Napno a panangipalpalawag iti kayatna a saoen.',
@@ -3699,9 +3726,9 @@ Daytoy a pagsaadan ket agdadama ti teknikal a pagrigrigatan.',
 'logentry-move-move_redir-noredirect' => 'Inyalis ni $1 ti panid ti $3 idiay $4 nga adda iti maysa a baw-ing a saan a nangibati ti baw-ing',
 'logentry-patrol-patrol' => 'Minarkaan ni $1 ti panagbaliw a $4 ti panid ti  $3 a napatruliaan',
 'logentry-patrol-patrol-auto' => 'Automatiko a minarkaan ni $1 ti panagbaliw a $4 ti panid ti $3 a napatruliaan',
-'logentry-newusers-newusers' => 'Nagpartuat ni $1 ti pakabilangan ti  agar-aramat',
-'logentry-newusers-create' => 'Nagpartuat ni $1 ti pakabilangan ti agar-aramat',
-'logentry-newusers-create2' => 'Nagpartuat ni $1 ti pakabilangan ti agar-aramat ti $3',
+'logentry-newusers-newusers' => 'Nagpartuat idi ti $1 a pakabilangan ti agar-aramat',
+'logentry-newusers-create' => 'Nagpartuat idi ti $1 a pakabilangan ti agar-aramat',
+'logentry-newusers-create2' => 'Nagpartuat ni ti $3 a pakabilangan ti agar-aramat babaen ni $1',
 'logentry-newusers-autocreate' => 'Ti pakabilangan ni $1 ket automatiko a napartuat',
 'newuserlog-byemail' => 'naipatulod ti kontrasenias ti e-surat',
 
@@ -3721,6 +3748,10 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'feedback-bugcheck' => 'Nasayaaten! Kitaem tapno saan a dagiti adda idin a [$1 nga amammo a kitkiteb].',
 'feedback-bugnew' => 'Kinitak. Ireporta ti baro a kiteb',
 
+# Search suggestions
+'searchsuggest-search' => 'Biruken',
+'searchsuggest-containing' => 'naglaon ti...',
+
 # API errors
 'api-error-badaccess-groups' => 'Saan mo a mabalin ti agipan kadagiti papeles iti daytoy a wiki.',
 'api-error-badtoken' => 'Kinauneg a biddut: Dakes a tandaan.',
@@ -3773,4 +3804,6 @@ Nupay kasta, mau-sarmo ti nakabuklan dita baba. Ti komentario nga itedmo ket mai
 'duration-centuries' => '$1 {{PLURAL:$1|siglo|sig-siglo}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenio|mil-milenio}}',
 
+# Unknown messages
+'svg-long-error' => 'Saan nga umisu a papeles ti SVG: $1',
 );
index f48debb..f7ce2a7 100644 (file)
@@ -155,7 +155,6 @@ $messages = array(
 'qbbrowse' => 'БӀаргтасса',
 'qbedit' => 'Хувца',
 'qbpageoptions' => 'ОагӀува оттамаш',
-'qbpageinfo' => 'ОагӀува тохкам',
 'qbmyoptions' => 'Са оттамаш',
 'qbspecialpages' => 'ГӀулакхий оагӀувнаш',
 'faq' => 'Каст-каста хаттараш',
@@ -541,8 +540,6 @@ $messages = array(
 'search-interwiki-caption' => 'Гаргалон хьахьоадайтамаш',
 'search-interwiki-default' => '$1 толамчаш:',
 'search-interwiki-more' => '(кха)',
-'search-mwsuggest-enabled' => ' Хьехамашца',
-'search-mwsuggest-disabled' => ' Хьехамаш боацаш',
 'search-relatedarticle' => 'шоайл дола',
 'searchrelated' => 'гаргара',
 'searchall' => 'деррига',
index 26ca3da..de5f384 100644 (file)
@@ -234,7 +234,6 @@ $messages = array(
 'qbfind' => 'Trovez',
 'qbedit' => 'Redaktar',
 'qbpageoptions' => 'Ica pagino',
-'qbpageinfo' => 'Kuntexto',
 'qbmyoptions' => 'Mea pagini',
 'qbspecialpages' => 'Specala pagini',
 
@@ -409,11 +408,8 @@ nekorekta interlinguale od interwikale ligilo.',
 # Login and logout pages
 'logouttext' => "'''Vu nun esas nun ek {{SITENAME}}.'''
 
-Vu povas durar uzante {{SITENAME}} anonimale, o vu povas [[Special:UserLogin|enirar itere]] kom la sama o diferenta uzanto.
+Vu povas durar uzante {{SITENAME}} anonimale, o vu povas <span class='plainlinks'>[$1 enirar itere]</span> kom la sama o diferenta uzanto.
 Atencez ke kelka pagini posible duras montresar semblante ke vu ne ekirus, til vu vakuigas la tempala-magazino di vua navigilo.",
-'welcomecreation' => '== Bonveno, $1! ==
-Vua konto kreesis.
-Voluntez, ne obliviez chanjor vua [[Special:Preferences|preferaji en {{SITENAME}}]].',
 'yourname' => 'Vua uzantonomo:',
 'yourpassword' => 'Pasovorto:',
 'yourpasswordagain' => 'Riskribez la pasovorto:',
@@ -672,8 +668,6 @@ Surskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,
 'search-interwiki-caption' => 'Altra projekti',
 'search-interwiki-default' => 'Rezultaji di $1:',
 'search-interwiki-more' => '(plusa)',
-'search-mwsuggest-enabled' => 'kun sugestaji',
-'search-mwsuggest-disabled' => 'sen sugestaji',
 'searchall' => 'omna',
 'showingresults' => "Montrante infre {{PLURAL:$1|'''1''' rezulto|'''$1''' rezulti}}, qui komencas kun numero #'''$2'''.",
 'showingresultsnum' => "Montrante infre {{PLURAL:$3|'''1''' rezulto|'''$3''' rezulti}}, qui komencas kun numero #'''$2'''.",
@@ -1086,7 +1080,6 @@ Volutez kontrolar <strong>[[:$1]]</strong> se vu ne esas certa pri chanjar olu.
 'watching' => 'Surveyanta…',
 'unwatching' => 'Cesanta surveyar…',
 
-'enotif_newpagetext' => 'Ico esas nula pagino.',
 'enotif_impersonal_salutation' => 'Uzanto di {{SITENAME}}',
 'enotif_anon_editor' => 'anonima uzanto $1',
 
@@ -1556,4 +1549,8 @@ Vu darfos adjuntar kauso en la rezumo.',
 'htmlform-reset' => 'Desfacar chanji',
 'htmlform-selectorother-other' => 'Altra',
 
+# Search suggestions
+'searchsuggest-search' => 'Serchez',
+'searchsuggest-containing' => 'quan kontenas...',
+
 );
index 3d8d8f7..4da56a3 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Bjarki S
  * @author Cessator
  * @author Friðrik Bragi Dýrfjörð
  * @author Gott wisst
@@ -238,7 +239,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Fela yfirfarnar breytingar í nýlegum breytingum',
 'tog-newpageshidepatrolled' => 'Fela yfirfarnar breytingar í listanum yfir nýjar síður',
 'tog-extendwatchlist' => 'Sýna allar breytingar á vaktlistanum, ekki einungis þær nýjustu',
-'tog-usenewrc' => 'Endurbættar auknar nýlegar breytingar (þarfnast JavaScript)',
+'tog-usenewrc' => 'Flokka breytingar eftir síðu í nýlegum breytingum og vaktlista (þarfnast JavaScript)',
 'tog-numberheadings' => 'Númera fyrirsagnir sjálfkrafa',
 'tog-showtoolbar' => 'Sýna breytingarverkfærastiku (JavaScript)',
 'tog-editondblclick' => 'Breyta síðum þegar tvísmellt er (JavaScript)',
@@ -279,7 +280,7 @@ $messages = array(
 
 'underline-always' => 'Alltaf',
 'underline-never' => 'Aldrei',
-'underline-default' => 'skv. vafrastillingu',
+'underline-default' => 'Fletta eða vafra sjálfkrafa',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Breyta leturgerð í textareitum',
@@ -366,7 +367,7 @@ $messages = array(
 'newwindow' => '(opnast í nýjum glugga)',
 'cancel' => 'Hætta við',
 'moredotdotdot' => 'Meira...',
-'mypage' => 'Mín síða',
+'mypage' => 'Síða',
 'mytalk' => 'Spjall',
 'anontalk' => 'Spjallsíða þessa vistfangs.',
 'navigation' => 'Flakk',
@@ -377,7 +378,6 @@ $messages = array(
 'qbbrowse' => 'Flakka',
 'qbedit' => 'Breyta',
 'qbpageoptions' => 'Þessi síða',
-'qbpageinfo' => 'Samhengi',
 'qbmyoptions' => 'Mínar síður',
 'qbspecialpages' => 'Kerfissíður',
 'faq' => 'Algengar spurningar',
@@ -390,7 +390,7 @@ $messages = array(
 'vector-action-protect' => 'Vernda',
 'vector-action-undelete' => 'Hætta við eyðingu',
 'vector-action-unprotect' => 'Breyta verndunarstigi',
-'vector-simplesearch-preference' => 'Virkja leitaruppástungur (eingöngu fyrir vector þema)',
+'vector-simplesearch-preference' => 'Virkja einfaldaða leitarstiku (Vector-þemað eingöngu)',
 'vector-view-create' => 'Skapa',
 'vector-view-edit' => 'Breyta',
 'vector-view-history' => 'Breytingaskrá',
@@ -400,6 +400,7 @@ $messages = array(
 'namespaces' => 'Nafnrými',
 'variants' => 'Útgáfur',
 
+'navigation-heading' => 'Leiðsagnarval',
 'errorpagetitle' => 'Villa',
 'returnto' => 'Aftur á: $1.',
 'tagline' => 'Úr {{SITENAME}}',
@@ -637,17 +638,18 @@ Möppudýrið sem læsti skránni gaf þessa ástæðu: "\'\'$3\'\'".',
 # Login and logout pages
 'logouttext' => "'''Þú hefur verið skráð(ur) út.'''
 
-Þú getur haldið áfram að nota {{SITENAME}} óþekkt(ur), eða þú getur [[Special:UserLogin|skráð þig inn aftur]] sem sami eða annar notandi.
+Þú getur haldið áfram að nota {{SITENAME}} óþekkt(ur), eða þú getur <span class='plainlinks'>[$1 skráð þig inn aftur]</span> sem sami eða annar notandi.
 Athugaðu að sumar síður kunna að birtast líkt og þú sért ennþá skráð(ur) inn, þangað til að þú hreinsar skyndiminnið í vafranum þínum.",
-'welcomecreation' => '== Velkomin(n), $1! ==
-Aðgangurinn þinn hefur verið búinn til.
-Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}}-stillingunum]] þínum.',
+'welcomeuser' => 'Velkomin(n), $1!',
+'welcomecreation-msg' => 'Aðgangurinn þinn hefur verið búinn til.
+Ekki gleyma að breyta [[Special:Preferences|{{SITENAME}} stillingunum]] þínum.',
 'yourname' => 'Notandanafn:',
 'yourpassword' => 'Lykilorð:',
 'yourpasswordagain' => 'Endurrita lykilorð:',
 'remembermypassword' => 'Muna innskráninguna mína í þessum vafra (í allt að $1 {{PLURAL:$1|dag|daga}})',
 'securelogin-stick-https' => 'Halda öllum samskiptum áfram yfir HTTPS eftir að þú skráir þig inn',
 'yourdomainname' => 'Þitt lén:',
+'password-change-forbidden' => 'Þú getur ekki breytt lykilorðum á þessum wiki.',
 'externaldberror' => 'Uppfærsla mistókst. Annaðhvort varð villa í gagnasafninu eða að þér sé óheimilt að uppfæra aðra aðganga.',
 'login' => 'Innskrá',
 'nav-login-createaccount' => 'Innskrá / Búa til aðgang',
@@ -903,12 +905,11 @@ Gjörðu svo vel og athugaðu hvort að þú viljir skapa/breyta þessari síðu
 'userpage-userdoesnotexist-view' => 'Notandinn "$1" er ekki skráður.',
 'blocked-notice-logextract' => 'Þessi notandi er í banni.
 Síðasta færsla notandans úr bönnunarskrá er sýnd hér fyrir neðan til skýringar:',
-'clearyourcache' => "Athugaðu - Eftir vistun, má vera að þú þurfir að komast hjá skyndiminni vafrans til að sjá breytingarnar.'''
-'''Mozilla / Firefox / Safari:''' haltu ''Shift'' og smelltu á ''Reload'', eða ýttu á annaðhvort ''Ctrl-F5'' eða ''Ctrl-R'' (''Command-R'' á Mac)
-'''Google Chrome: '''smelltu á ''Ctrl-Shift-R'' (''Command-Shift-R'' á Mac)
-'''Konqueror: '''smelltu á ''Reload'' eða ýttu á ''F5'' 
-'''Opera:''' hreinsaðu skyndiminnið í ''Tools → Prefernces'';
-'''Internet Explorer:''' haltu ''Ctrl'' og smelltu á ''Refresh'', eða ýttu á ''Ctrl-F5''.",
+'clearyourcache' => "'''Athugaðu:''' Eftir vistun kann að vera að þú þurfir að komast hjá skyndiminni vafrans þíns til að sjá breytingarnar.
+* '''Firefox / Safari:''' Haltu ''Shift'' samtímis og þú smellir á ''Endurhlaða (Reload)'', eða ýttu á annaðhvort ''Ctrl-F5'' eða ''Ctrl-R'' (''⌘-R'' á Mac)
+* '''Google Chrome:''' Ýttu á ''Ctrl-Shift-R'' (''⌘-Shift-R'' á Mac)
+* '''Internet Explorer:''' Haltu ''Ctrl'' samtímis og þú smellir á ''Endurnýja (Refresh)'', eða ýttu á ''Ctrl-F5''
+* '''Opera:''' Hreinsaðu skyndiminnið í ''Verkfæri (Tools) → Stillingar (Preferences)''",
 'usercssyoucanpreview' => "'''Ath:''' Hægt er að nota „{{int:showpreview}}“ hnappinn til að prófa CSS-kóða áður en hann er vistaður.",
 'userjsyoucanpreview' => "'''Ath:''' Hægt er að nota \"{{int:showpreview}}\" hnappinn til að prófa JavaScript-kóða áður en hann er vistaður.",
 'usercsspreview' => "'''Mundu að þú ert aðeins að forskoða CSS-kóðann þinn.'''
@@ -923,7 +924,7 @@ Síðasta færsla notandans úr bönnunarskrá er sýnd hér fyrir neðan til sk
 'updated' => '(Uppfært)',
 'note' => "'''Athugið:'''",
 'previewnote' => "'''Það sem sést hér er aðeins forskoðun og hefur ekki enn verið vistað!'''",
-'continue-editing' => 'Halda áfram að breyta',
+'continue-editing' => 'Fara á breytingasvæði',
 'previewconflict' => 'Þessi forskoðun endurspeglar textann í efra breytingarsvæði eins og hann myndi líta út ef þú vistar.',
 'session_fail_preview' => "'''Því miður! Gat ekki unnið úr breytingum þínum vegna týndra lotugagna.
 Vinsamlegast reyndu aftur síðar. Ef það virkar ekki heldur skaltu reyna að skrá þig út og inn á ný.'''",
@@ -999,6 +1000,12 @@ Svo virðist sem henni hafi verið eytt.',
 Hún er nú þegar til.',
 'defaultmessagetext' => 'Sjálfgefinn skilaboða texti',
 
+# Content models
+'content-model-wikitext' => 'wiki-texti',
+'content-model-text' => 'hreinn texti',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Viðvörun:''' Þessi síða inniheldur of mörg vinnslufrek aðgerðar þáttunar köll.
 
@@ -1130,9 +1137,10 @@ Ekki er hægt að fela hana.',
 'revdelete-no-change' => "'''Viðvörun:''' Breytingin frá $1 $2 hefur þegar umbeðnar sýnileika stillingar.",
 'revdelete-only-restricted' => 'Mistókst að fela breytingu frá $1 $2: Þú getur ekki falið breytingu fyrir möppudýrum án þess að velja eina af hinum sýnileika stillingunum.',
 'revdelete-reason-dropdown' => '*Algengar eyðingarástæður
-** Höfundarréttarbrot
-** Óviðeigandi persónuuplýsingar
-** Mögulega ærumleiðandi upplýsingar',
+**Höfundarréttarbrot
+**Óviðeigandi athugasemdir eða persónuuplýsingar
+**Óviðeigandi notandanafn
+**Mögulega ærumleiðandi upplýsingar',
 'revdelete-otherreason' => 'Aðrar/fleiri ástæður:',
 'revdelete-reasonotherlist' => 'Önnur ástæða',
 'revdelete-edit-reasonlist' => 'Eyðingarástæður',
@@ -1158,8 +1166,8 @@ Sjáðu til þess að þessi breyting sameini breytingarskrárnar samfellt.',
 
 # Diffs
 'history-title' => '$1: Breytingaskrá',
-'difference-title' => '$1: Munur á milli útgáfa',
-'difference-title-multipage' => '$1 og $2: Munur á milli síðna',
+'difference-title' => 'Munur á milli breytinga „$1“',
+'difference-title-multipage' => 'Munur á milli síðna „$1“ og „$2“',
 'difference-multipage' => '(Munur á milli síðna)',
 'lineno' => 'Lína $1:',
 'compareselectedversions' => 'Bera saman valdar útgáfur',
@@ -1186,7 +1194,7 @@ Sjáðu til þess að þessi breyting sameini breytingarskrárnar samfellt.',
 'shown-title' => 'Sýna $1 {{PLURAL:$1|niðurstöðu|niðurstöður}} á hverri síðu',
 'viewprevnext' => 'Skoða ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-legend' => 'Leitarvalmöguleikar',
-'searchmenu-exists' => "'''Það er síða að nafni „[[$1]]“ á þessum wiki'''",
+'searchmenu-exists' => "'''Það er síða að nafni „[[:$1]]“ á þessum wiki'''",
 'searchmenu-new' => "'''Skapaðu síðuna \"[[:\$1]]\" á þessum wiki!'''",
 'searchhelp-url' => 'Help:Efnisyfirlit',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Leita að síðum með þessu forskeyti]]',
@@ -1209,8 +1217,6 @@ Sjáðu til þess að þessi breyting sameini breytingarskrárnar samfellt.',
 'search-interwiki-caption' => 'Systurverkefni',
 'search-interwiki-default' => '$1 útkomur:',
 'search-interwiki-more' => '(fleiri)',
-'search-mwsuggest-enabled' => 'með uppástungum',
-'search-mwsuggest-disabled' => 'engar uppástungur',
 'search-relatedarticle' => 'Tengt',
 'mwsuggest-disable' => 'Gera AJAX-uppástungur óvirkar',
 'searcheverything-enable' => 'Leita í öllum nafnrýmum',
@@ -1245,7 +1251,7 @@ Athugaðu að skrár þeirra yfir {{SITENAME}}-efni kunna að vera úreltar.',
 
 # Preferences page
 'preferences' => 'Stillingar',
-'mypreferences' => 'Stillingar',
+'mypreferences' => 'Mínar stillingar',
 'prefs-edits' => 'Fjöldi breytinga:',
 'prefsnologin' => 'Ekki innskráður',
 'prefsnologintext' => 'Þú verður að vera <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} skráð(ur) inn]</span> til að breyta notandastillingum.',
@@ -1307,7 +1313,7 @@ Hér er gildi sem var valið af handahófi sem þú getur notað: $1',
 'timezoneregion-indian' => 'Indlandshaf',
 'timezoneregion-pacific' => 'Kyrrahaf',
 'allowemail' => 'Virkja tölvupóst frá öðrum notendum',
-'prefs-searchoptions' => 'Leitarvalmöguleikar',
+'prefs-searchoptions' => 'Leit',
 'prefs-namespaces' => 'Nafnrými',
 'defaultns' => 'Leita í þessum nafnrýmum sjálfgefið:',
 'default' => 'sjálfgefið',
@@ -1326,7 +1332,7 @@ Ekki er hægt að taka þessa breytingu til baka.',
 'prefs-registration' => 'Nýskráningartími:',
 'yourrealname' => 'Fullt nafn:',
 'yourlanguage' => 'Viðmótstungumál:',
-'yourvariant' => 'Útgáfa:',
+'yourvariant' => 'Afbrigði efnismáls:',
 'prefs-help-variant' => 'Þín sérvalda útgáfa eða réttritun til að birta innihald síðna í.',
 'yournick' => 'Undirskrift:',
 'prefs-help-signature' => 'Ummæli á spjallsíðum eiga að vera skrifuð undir með "<nowiki>~~~~</nowiki>" sem verður breytt í undirskrift þína og dagsetningu.',
@@ -2116,7 +2122,7 @@ Studdar samskiptareglur: <code>$1</code> (ekki bæta neinum af þessum í leitin
 'emailpagetext' => 'Hafi notandi tilgreint netfang í stillingunum sínum er hægt að senda póst til hans hér.
 Póstfangið sem þú tilgreindir í [[Special:Preferences|stillingunum þínum]] birtist í "Frá:" hluta tölvupóstsins, svo að viðtakandi þess geti svarað beint til þín.',
 'usermailererror' => 'Póst hlutur skilaði villu:',
-'defemailsubject' => '{{SITENAME}} netfang notanda "$1"',
+'defemailsubject' => '{{SITENAME}} skilaboð frá notandanum "$1"',
 'usermaildisabled' => 'Netfang notenda er óvirkt',
 'usermaildisabledtext' => 'Þú getur ekki sent tölvupóst til annara notenda á þessum wiki',
 'noemailtitle' => 'Ekkert póstfang',
@@ -2145,7 +2151,7 @@ Póstfangið sem þú tilgreindir í [[Special:Preferences|stillingunum þínum]
 
 # Watchlist
 'watchlist' => 'Vaktlistinn',
-'mywatchlist' => 'Vaktlistinn',
+'mywatchlist' => 'Vaktlisti',
 'watchlistfor2' => 'Eftir $1 $2',
 'nowatchlist' => 'Vaktlistinn er tómur.',
 'watchlistanontext' => 'Vinsamlegast $1 til að skoða eða breyta vaktlistanum þínum.',
@@ -2180,32 +2186,27 @@ Frekari breytingar á henni eða spallsíðu hennar munu verða sýndar þar, og
 'watcherrortext' => 'Villa kom upp við breytingu á stillingum vaktlistans fyrir "$1".',
 
 'enotif_reset' => 'Merkja allar síður sem skoðaðar',
-'enotif_newpagetext' => 'Þetta er ný síða.',
 'enotif_impersonal_salutation' => '{{SITENAME}}notandi',
-'changed' => 'breytt',
-'created' => 'búin til',
-'enotif_subject' => '$PAGETITLE á {{SITENAME}} hefur verið $CHANGEDORCREATED af $PAGEEDITOR',
 '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_anon_editor' => 'ónefndum notanda $1',
 'enotif_body' => 'Kæri $WATCHINGUSERNAME,
 
-Það lítur út fyrir að þú hafir ný skilaboð á {{SITENAME}} $PAGETITLE.
-Hún hefur verið $CHANGEDORCREATED $PAGEEDITDATE af 
+Síðan „$PAGETITLE” sem þú hefur beðið um að fylgjast með á {{SITENAME}} hefur verið $CHANGEDORCREATED $PAGEEDITDATE af 
 $PAGEEDITOR. Breytingarágripið var:
 
    $PAGESUMMARY
 
-Þetta er tengill á spjallsíðuna þína:
+Þetta er tengill á síðuna:
 
    $PAGETITLE_URL
 
 $NEWPAGE
 
-Til þess að hafa samband við $PAGEEDITOR, heimsóttu:
+Til þess að hafa samband við $PAGEEDITOR, smelltu á:
 
    $PAGEEDITOR_WIKI
 
@@ -2217,12 +2218,12 @@ Kveðja,
 
 --
 
-Til þess að breyta stillingum um hvenær þú færð sendar tilkynningar, heimsóttu:
+Til þess að breyta stillingum um hvenær þú færð sendar tilkynningar, smelltu á:
 
 {{canonicalurl:{{#special:Preferences}}}}
 
 
-Til þess að hætta að fylgjast með $PAGETITLE, heimsóttu:
+Til þess að hætta að fylgjast með „$PAGETITLE”, smelltu á:
 
 $UNWATCHURL',
 
@@ -2454,7 +2455,7 @@ Síðasta færsla vistfangsins úr bönnunarskrá er sýnd hér fyrir neðan til
 'whatlinkshere-hideredirs' => '$1 tilvísanir',
 'whatlinkshere-hidetrans' => '$1 ítengingar',
 'whatlinkshere-hidelinks' => '$1 tengla',
-'whatlinkshere-hideimages' => '$1 myndatenglar',
+'whatlinkshere-hideimages' => '$1 skrátenglar',
 'whatlinkshere-filters' => 'Síur',
 
 # Block/unblock
@@ -2717,7 +2718,7 @@ Ef síðari möguleikinn á við getur þú einnig notað tengil, til dæmis
 '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.',
+Vinsamlegast 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.',
 'allmessagesnotsupportedDB' => "Það er ekki hægt að nota '''{{ns:special}}:Allmessages''' því '''\$wgUseDatabaseMessages''' hefur verið gerð óvirk.",
 'allmessages-filter-legend' => 'Sía',
 'allmessages-filter' => 'Sía með breytingarstöðu:',
@@ -2795,7 +2796,6 @@ Vinsamlegast reyndu aftur.',
 
 # 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
@@ -2899,11 +2899,42 @@ Vinsamlegast reyndu aftur.',
 
 # Info page
 'pageinfo-title' => 'Upplýsingar um $1',
+'pageinfo-header-basic' => 'Grunnupplýsingar',
 'pageinfo-header-edits' => 'Breytingarskrá',
+'pageinfo-header-restrictions' => 'Verndunarstig síðunnar',
+'pageinfo-header-properties' => 'Eiginleikar síðunnar',
+'pageinfo-display-title' => 'Sýnilegur titill',
+'pageinfo-default-sort' => 'Sjálfgefinn röðunarlykill',
+'pageinfo-length' => 'Lengd síðunnar (í bætum)',
+'pageinfo-article-id' => 'Einkennisnúmer síðunnar',
+'pageinfo-language' => 'Tungumál síðunnar',
+'pageinfo-robot-policy' => 'Leitarvélastaða',
+'pageinfo-robot-index' => 'Skráanleg',
+'pageinfo-robot-noindex' => 'Óskráanleg',
 'pageinfo-views' => 'Fjöldi innlita',
 'pageinfo-watchers' => 'Fjöldi notenda, sem vakta síðuna',
+'pageinfo-redirects-name' => 'Tilvísanir til þessarar síðu',
+'pageinfo-subpages-name' => 'Undirsíður þessarar síðu',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|tilvísun|tilvísanir}}; $3 {{PLURAL:$3|ekki tilvísun|ekki tilvísanir}})',
+'pageinfo-firstuser' => 'Stofnandi síðunnar',
+'pageinfo-firsttime' => 'Dagsetning stofnunar síðunnar',
+'pageinfo-lastuser' => 'Síðasti notandinn til þess að breyta',
+'pageinfo-lasttime' => 'Dagsetning síðustu breytingar',
 'pageinfo-edits' => 'Heildarfjöldi breytinga',
 'pageinfo-authors' => 'Heildarfjöldi einstakra höfunda',
+'pageinfo-recent-edits' => 'Fjöldi nýlegra breytinga á síðunni (síðustu $1)',
+'pageinfo-recent-authors' => 'Fjöldi notenda sem breytt hafa síðunni nýlega',
+'pageinfo-magic-words' => 'Töfra {{PLURAL:$1|orð}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Falinn flokkur|Faldir flokkar}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Innifalið snið|Innifalin snið}} ($1)',
+'pageinfo-toolboxlink' => 'Síðuupplýsingar',
+'pageinfo-redirectsto' => 'Vísar til',
+'pageinfo-redirectsto-info' => 'upplýsingar',
+'pageinfo-contentpage' => 'Talin sem efnissíða',
+'pageinfo-contentpage-yes' => 'Já',
+'pageinfo-protect-cascading' => 'Keðjuvörn hefst hér',
+'pageinfo-protect-cascading-yes' => 'Já',
+'pageinfo-protect-cascading-from' => 'Keðjuvörn stafar frá',
 
 # Skin names
 'skinname-standard' => 'Sígilt',
@@ -3671,6 +3702,10 @@ Ef ekki, þá getur þú notað einfalt eyðublað hér fyrir neðan. Athugasemd
 'feedback-bugcheck' => 'Frábært! Athugaðu hvort þessi villa hafi verið [$1 tilkynnt áður].',
 'feedback-bugnew' => 'Ég athugaði það. Tilkynna nýja villu.',
 
+# Search suggestions
+'searchsuggest-search' => 'Leita',
+'searchsuggest-containing' => 'sem innihalda ...',
+
 # API errors
 'api-error-badaccess-groups' => 'Þú hefur ekki leyfi til að hlaða inn skrám.',
 'api-error-badtoken' => 'Innri villa: Skemmdur tóki.',
index 3243623..a6d23be 100644 (file)
@@ -19,6 +19,7 @@
  * @author Brownout
  * @author Candalua
  * @author Civvì
+ * @author Codicorumus
  * @author Cruccone
  * @author Cryptex
  * @author Dakrismeno
@@ -316,7 +317,7 @@ $messages = array(
 
 'underline-always' => 'Sempre',
 'underline-never' => 'Mai',
-'underline-default' => 'Mantieni le impostazioni del browser',
+'underline-default' => 'Mantieni le impostazioni del browser o della skin',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stile del carattere nella casella di modifica:',
@@ -401,8 +402,8 @@ $messages = array(
 'newwindow' => '(si apre in una nuova finestra)',
 'cancel' => 'Annulla',
 'moredotdotdot' => 'Altro...',
-'mypage' => 'La mia pagina',
-'mytalk' => 'mie discussioni',
+'mypage' => 'Pagina',
+'mytalk' => 'discussioni',
 'anontalk' => 'Discussioni per questo IP',
 'navigation' => 'Navigazione',
 'and' => '&#32;e',
@@ -412,7 +413,6 @@ $messages = array(
 'qbbrowse' => 'Sfoglia',
 'qbedit' => 'Modifica',
 'qbpageoptions' => 'Opzioni pagina',
-'qbpageinfo' => 'Informazioni sulla pagina',
 'qbmyoptions' => 'Le mie pagine',
 'qbspecialpages' => 'Pagine speciali',
 'faq' => 'Domande frequenti',
@@ -425,7 +425,7 @@ $messages = array(
 'vector-action-protect' => 'Proteggi',
 'vector-action-undelete' => 'Recupera',
 'vector-action-unprotect' => 'Cambia la protezione',
-'vector-simplesearch-preference' => 'Abilita i suggerimenti di ricerca avanzata (solo per la skin Vector)',
+'vector-simplesearch-preference' => 'Abilita la barra per la ricerca semplificata (solo per la skin Vector)',
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Modifica',
 'vector-view-history' => 'Visualizza cronologia',
@@ -435,6 +435,7 @@ $messages = array(
 'namespaces' => 'Namespace',
 'variants' => 'Varianti',
 
+'navigation-heading' => 'Menu di navigazione',
 'errorpagetitle' => 'Errore',
 'returnto' => 'Torna a $1.',
 'tagline' => 'Da {{SITENAME}}.',
@@ -642,7 +643,7 @@ Query: $2',
 'viewsource-title' => 'Visualizza sorgente di $1',
 'actionthrottled' => 'Azione ritardata',
 'actionthrottledtext' => "Come misura di sicurezza contro lo spam, l'esecuzione di alcune azioni è limitata a un numero massimo di volte in un determinato periodo di tempo, limite che in questo caso è stato superato. Si prega di riprovare tra qualche minuto.",
-'protectedpagetext' => 'Questa pagina è stata protetta per impedirne la modifica.',
+'protectedpagetext' => 'Questa pagina è stata protetta per impedirne la modifica o altre operazioni.',
 'viewsourcetext' => 'È possibile visualizzare e copiare il codice sorgente di questa pagina:',
 'viewyourtext' => "È possibile visualizzare e copiare il codice sorgente delle '''tue modifiche''' a questa pagina:",
 'protectedinterface' => "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software di questo sito ed è protetta per evitare possibili abusi.
@@ -674,11 +675,11 @@ L\'amministratore che lo ha bloccato ha fornito questa motivazione: "$3".',
 # Login and logout pages
 'logouttext' => "'''Logout effettuato.'''
 
-Si può continuare ad usare {{SITENAME}} come utente anonimo oppure [[Special:UserLogin|eseguire un nuovo accesso]], con lo stesso nome utente o un nome diverso.
+Si può continuare ad usare {{SITENAME}} come utente anonimo oppure <span class='plainlinks'>[$1 eseguire un nuovo accesso]</span>, con lo stesso nome utente o un nome diverso.
 Nota che alcune pagine potrebbero continuare ad apparire come se il logout non fosse avvenuto finché non viene pulita la cache del proprio browser.",
-'welcomecreation' => "== Benvenuto, $1! ==
-
-L'account è stato creato correttamente. Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITENAME}}]].",
+'welcomeuser' => 'Benvenuto, $1!',
+'welcomecreation-msg' => "L'account è stato creato correttamente.
+Non dimenticare di personalizzare le [[Special:Preferences|preferenze di {{SITENAME}}]].",
 'yourname' => 'Nome utente:',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'Ripeti la password:',
@@ -942,7 +943,7 @@ L'ultimo elemento del registro dei blocchi è riportato di seguito per informazi
 'note' => "'''Nota:'''",
 'previewnote' => "'''Ricorda che questa è solo un'anteprima.'''
 Le tue modifiche NON sono ancora state salvate!",
-'continue-editing' => 'Continua a modificare',
+'continue-editing' => "Vai all'area di modifica",
 'previewconflict' => 'L\'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di premere "Salva la pagina" in questo momento.',
 'session_fail_preview' => "'''Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.
 Riprovare.
@@ -1021,6 +1022,15 @@ Sembra che sia stata cancellata.',
 'edit-already-exists' => 'Impossibile creare una nuova pagina.
 Esiste già.',
 'defaultmessagetext' => 'Testo predefinito',
+'content-failed-to-parse' => 'Impossibile analizzare $2 per il modello $1: $3',
+'invalid-content-data' => 'Dati contenuti non validi',
+'content-not-allowed-here' => 'Contenuto in "$1" non consentito nella pagine [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitesto',
+'content-model-text' => 'testo normale',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Attenzione:''' Questa pagina contiene troppe chiamate alle parser functions.
@@ -1094,7 +1104,7 @@ Legenda: '''({{int:cur}})''' = differenze con la versione attuale, '''({{int:las
 'rev-deleted-text-permission' => "Questa versione della pagina è stata '''cancellata'''.
 Consultare il [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.",
 'rev-deleted-text-unhide' => "Questa versione della pagina è stata '''cancellata'''.
-Consultare il [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.
+Consultare il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log delle cancellazioni] per ulteriori dettagli.
 Agli amministratori è ancora consentito [$1 visualizzare questa versione] se necessario.",
 'rev-suppressed-text-unhide' => "Questa versione della pagina è stata '''rimossa'''.
 Consultare il [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} log di rimozione] per ulteriori dettagli.
@@ -1269,8 +1279,6 @@ I dettagli possono essere trovati nel [{{fullurl:{{#Special:Log}}/delete|page={{
 'search-interwiki-caption' => 'Progetti fratelli',
 'search-interwiki-default' => 'Risultati da $1:',
 'search-interwiki-more' => '(altro)',
-'search-mwsuggest-enabled' => 'con suggerimenti',
-'search-mwsuggest-disabled' => 'senza suggerimenti',
 'search-relatedarticle' => 'Risultati correlati',
 'mwsuggest-disable' => 'Disattiva suggerimenti AJAX',
 'searcheverything-enable' => 'Cerca in tutti i namespace',
@@ -1532,6 +1540,9 @@ Il tuo indirizzo non viene rivelato quando gli altri utenti ti contattano.',
 'rightslogtext' => 'Di seguito sono elencate le modifiche ai diritti assegnati agli utenti.',
 'rightslogentry' => "ha modificato l'appartenenza di $1 dal gruppo $2 al gruppo $3",
 'rightslogentry-autopromote' => 'è stato/a automaticamente promosso/a da $2 a $3',
+'logentry-rights-rights' => "$1 ha modificato l'appartenenza di $3 dal gruppo $4 al gruppo $5",
+'logentry-rights-rights-legacy' => "$1 ha modificato l'appartenenza a gruppi di $3",
+'logentry-rights-autopromote' => '$1 è stato/a automaticamente promosso/a da $4 a $5',
 'rightsnone' => '(nessuno)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1761,6 +1772,7 @@ $1',
 'backend-fail-notsame' => 'Esiste già un file non identico a  $1 .',
 'backend-fail-invalidpath' => '$1 non è un percorso di archiviazione valido.',
 'backend-fail-delete' => 'Impossibile cancellare il file $1.',
+'backend-fail-describe' => 'Impossibile modificare i metadati del file "$1".',
 'backend-fail-alreadyexists' => 'Il file $1 esiste già.',
 'backend-fail-store' => 'Impossibilie memorizzare file  $1  in  $2 .',
 'backend-fail-copy' => 'Impossibile copiare il file  $1  in  $2 .',
@@ -1910,7 +1922,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.',
+'upload-disallowed-here' => 'Impossibile sovrascrivere questo file.',
 
 # File reversion
 'filerevert' => 'Ripristina $1',
@@ -2015,7 +2027,7 @@ I redirect <del>cancellati</del> sono stati corretti.',
 'fewestrevisions' => 'Pagine con meno revisioni',
 
 # Miscellaneous special pages
-'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
+'nbytes' => '$1 {{PLURAL:$1|byte}}',
 'ncategories' => '$1 {{PLURAL:$1|categoria|categorie}}',
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki}}',
 'nlinks' => '$1 {{PLURAL:$1|collegamento|collegamenti}}',
@@ -2147,7 +2159,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: <code>$1</code> (non aggiungere nessuno di questi nella tua ricerca).',
+Protocolli supportati: <code>$1</code> (predefinito http:// se nessun protocollo è specificato).',
 'linksearch-line' => '$1 presente nella pagina $2',
 'linksearch-error' => "I metacaratteri possono essere usati solo all'inizio dell'indirizzo.",
 
@@ -2196,7 +2208,7 @@ Potrebbero esserci [[{{MediaWiki:Listgrouprights-helppage}}|ulteriori informazio
 '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.',
+'emailpagetext' => 'Usare il modulo sottostante per inviare un messaggio e-mail all\'{{GENDER:$1|utente}} indicato. L\'indirizzo specificato nelle [[Special:Preferences|preferenze]] del mittente apparirà nel campo "Da:" del messaggio per consentire al destinatario di rispondere direttamente.',
 'usermailererror' => "L'oggetto mail ha restituito l'errore:",
 'defemailsubject' => 'Messaggio da {{SITENAME}} dall\'utente "$1"',
 'usermaildisabled' => 'e-mail utente disabilitata',
@@ -2265,19 +2277,23 @@ il titolo della pagina apparirà in '''grassetto''' nella pagina delle [[Special
 
 'enotif_mailer' => 'Sistema di notifica via e-mail di {{SITENAME}}',
 'enotif_reset' => 'Segna tutte le pagine come già visitate',
-'enotif_newpagetext' => 'Questa è una nuova pagina.',
 'enotif_impersonal_salutation' => 'Utente di {{SITENAME}}',
-'changed' => 'modificata',
-'created' => 'creata',
-'enotif_subject' => 'La pagina $PAGETITLE di {{SITENAME}} è stata $CHANGEDORCREATED da $PAGEEDITOR',
+'enotif_subject_deleted' => 'La pagina $1 di {{SITENAME}} è stata cancellata da {{gender:$2|$2}}',
+'enotif_subject_created' => 'La pagina $1 di {{SITENAME}} è stata creata da {{gender:$2|$2}}',
+'enotif_subject_moved' => 'La pagina $1 di {{SITENAME}} è stata spostata da {{gender:$2|$2}}',
+'enotif_subject_restored' => 'La pagina $1 di {{SITENAME}} è stata ripristinata da {{gender:$2|$2}}',
+'enotif_subject_changed' => 'La pagina $1 di {{SITENAME}} è stata modificata da {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'La pagina $1 di {{SITENAME}} è stata cancellata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
+'enotif_body_intro_created' => 'La pagina $1 di {{SITENAME}} è stata creata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
+'enotif_body_intro_moved' => 'La pagina $1 di {{SITENAME}} è stata spostata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
+'enotif_body_intro_restored' => 'La pagina $1 di {{SITENAME}} è stata ripristinata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
+'enotif_body_intro_changed' => 'La pagina $1 di {{SITENAME}} è stata modificata da {{gender:$2|$2}} il $PAGEEDITDATE, vedi $3 per la versione attuale.',
 'enotif_lastvisited' => "Consultare $1 per vedere tutte le modifiche dall'ultima visita.",
 'enotif_lastdiff' => 'Vedere $1 per visualizzare la modifica.',
 'enotif_anon_editor' => 'utente anonimo $1',
 'enotif_body' => 'Gentile $WATCHINGUSERNAME,
 
-la pagina $PAGETITLE di {{SITENAME}} è stata $CHANGEDORCREATED in data $PAGEEDITDATE da $PAGEEDITOR; la versione attuale si trova all\'indirizzo $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Oggetto della modifica, inserito dall\'autore: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2290,7 +2306,7 @@ Non verranno inviate altre notifiche in caso di ulteriori cambiamenti, a meno ch
              Il sistema di notifica di {{SITENAME}}, al tuo servizio
 
 --
-Per modificare le impostazioni delle notifiche via e-mail, visita 
+Per modificare le impostazioni delle notifiche via email, visita 
 {{canonicalurl:{{#special:Preferences}}}}
 
 Per modificare la lista degli osservati speciali, visita 
@@ -2444,7 +2460,8 @@ Il testo contenuto nelle revisioni cancellate è disponibile solo agli amministr
 'undeletedrevisions' => '{{PLURAL:$1|Una revisione recuperata|$1 revisioni recuperate}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|Una revisione|$1 revisioni}} e $2 file recuperati',
 'undeletedfiles' => '{{PLURAL:$1|Un file recuperato|$1 file recuperati}}',
-'cannotundelete' => 'Ripristino non riuscito; è possibile che la pagina sia già stata recuperata da un altro utente.',
+'cannotundelete' => 'Ripristino non riuscito:
+$1',
 'undeletedpage' => "'''La pagina $1 è stata recuperata'''
 
 Consultare il [[Special:Log/delete|log delle cancellazioni]] per vedere le cancellazioni e i recuperi più recenti.",
@@ -2475,9 +2492,9 @@ $1',
 'blanknamespace' => '(Principale)',
 
 # Contributions
-'contributions' => 'Contributi utente',
+'contributions' => 'Contributi {{GENDER:$1|utente}}',
 'contributions-title' => 'Contributi di $1',
-'mycontris' => 'miei contributi',
+'mycontris' => 'contributi',
 'contribsub2' => 'Per $1 ($2)',
 'nocontribs' => 'Non sono state trovate modifiche che soddisfino i criteri di ricerca.',
 'uctop' => '(ultima per la pagina)',
@@ -2516,7 +2533,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 redirect',
 'whatlinkshere-hidetrans' => '$1 inclusioni',
 'whatlinkshere-hidelinks' => '$1 link',
-'whatlinkshere-hideimages' => '$1 link da immagini',
+'whatlinkshere-hideimages' => '$1 link da file',
 'whatlinkshere-filters' => 'Filtri',
 
 # Block/unblock
@@ -2732,6 +2749,7 @@ La pagina specificata come destinazione "[[:$1]]" esiste già. Vuoi cancellarla
 'immobile-target-namespace-iw' => 'Un collegamento interwiki non è una destinazione valida per spostare la pagina.',
 'immobile-source-page' => 'Questa pagina non può essere spostata.',
 'immobile-target-page' => 'Non è possibile spostare sul titolo indicato.',
+'bad-target-model' => 'La destinazione desiderata utilizza un modello di contenuti diverso. Non è possibile convertire da $1 a $2.',
 'imagenocrossnamespace' => 'Non è possibile spostare un file fuori dal relativo namespace.',
 'nonfile-cannot-move-to-file' => 'Non è possibile spostare un file fuori dal relativo namespace.',
 'imagetypemismatch' => 'La nuova estensione del file non corrisponde al tipo dello stesso',
@@ -2856,7 +2874,6 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # JavaScriptTest
 'javascripttest' => 'Sperimentazione JavaScript',
-'javascripttest-disabled' => 'Questa funzione non è abilitata su questo wiki.',
 'javascripttest-title' => 'In esecuzione test per $1',
 'javascripttest-pagetext-noframework' => "Questa pagina è riservata all'esecuzione di test di JavaScript.",
 'javascripttest-pagetext-unknownframework' => 'Framework di test sconosciuto "$1".',
@@ -2995,6 +3012,7 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 
 # Info page
 'pageinfo-title' => 'Informazioni per "$1"',
+'pageinfo-not-current' => "Spiacente, ma è impossibile fornire quest'informazione per vecchie versioni.",
 'pageinfo-header-basic' => 'Informazioni di base',
 'pageinfo-header-edits' => 'Cronologia delle modifiche',
 'pageinfo-header-restrictions' => 'Protezione della pagina',
@@ -3003,11 +3021,12 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'pageinfo-default-sort' => 'Criterio di ordinamento predefinito',
 'pageinfo-length' => 'Lunghezza della pagina (in byte)',
 'pageinfo-article-id' => 'ID della pagina',
+'pageinfo-language' => 'Lingua del contenuto 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-watchers' => 'Numero di utenti che hanno la pagina nei loro Osservati Speciali',
+'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}})',
@@ -3019,10 +3038,17 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Informazioni sulla pagina',
+'pageinfo-redirectsto' => 'Reindirizza a',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Conteggiata come una pagina di contenuto',
+'pageinfo-contentpage-yes' => 'Sì',
+'pageinfo-protect-cascading' => 'Protezione ricorsiva da qui',
+'pageinfo-protect-cascading-yes' => 'Sì',
+'pageinfo-protect-cascading-from' => 'Protezione ricorsiva ereditata da',
 
 # Patrolling
 'markaspatrolleddiff' => 'Segna la modifica come verificata',
@@ -3034,6 +3060,8 @@ Tutte le operazioni di importazione trans-wiki sono registrate nel [[Special:Log
 'markedaspatrollederror' => 'Impossibile contrassegnare la voce come verificata',
 'markedaspatrollederrortext' => 'Occorre specificare una modifica da contrassegnare come verificata.',
 'markedaspatrollederror-noautopatrol' => 'Non si dispone dei permessi necessari per segnare le proprie modifiche come verificate.',
+'markedaspatrollednotify' => 'La modifica a $1 è stata contrassegnata come verificata.',
+'markedaspatrollederrornotify' => 'Errore durante la verifica.',
 
 # Patrol log
 'patrol-log-page' => 'Modifiche verificate',
@@ -3100,6 +3128,7 @@ $1',
 'hours' => "{{PLURAL:$1|un'ora|$1 ore}}",
 'days' => '{{PLURAL:$1|un giorno|$1 giorni}}',
 'ago' => '$1 fa',
+'just-now' => 'proprio ora',
 
 # Bad image list
 'bad_image_list' => "Il formato è il seguente:
@@ -3601,6 +3630,7 @@ Questo codice di conferma scadrà automaticamente alle $4.',
 # Scary transclusion
 'scarytranscludedisabled' => "[L'inclusione di pagine tra siti wiki non è attiva]",
 'scarytranscludefailed' => '[Errore: Impossibile ottenere il template $1]',
+'scarytranscludefailed-httpstatus' => '[Errore: impossibile ottenere il template $1: HTTP $2]',
 'scarytranscludetoolong' => '[Errore: URL troppo lunga]',
 
 # Delete conflict
@@ -3718,6 +3748,7 @@ Si noti che è anche possibile [[Special:EditWatchlist|modificare la lista con l
 'version-license' => 'Licenza',
 'version-poweredby-credits' => "Questo wiki è realizzato con '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'altri',
+'version-credits-summary' => 'Siamo lieti di riconoscere le seguenti persone per aver contribuito a [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki è un software libero; puoi redistribuirlo e/o modificarlo secondo i termini della GNU General Public License, come pubblicata dalla Free Software Foundation; o la versione 2 della Licenza o (a propria scelta) qualunque versione successiva.
 
 MediaWiki è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di NEGOZIABILITÀ o di APPLICABILITÀ PER UN PARTICOLARE SCOPO. Si veda la GNU General Public License per maggiori dettagli.
@@ -3859,9 +3890,9 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'logentry-move-move_redir-noredirect' => '$1 ha spostato la pagina $3 a $4 al posto di un redirect senza lasciare redirect',
 'logentry-patrol-patrol' => '$1 ha segnato la versione $4 della pagina $3 come verificata',
 'logentry-patrol-patrol-auto' => '$1 ha segnato automaticamente la versione $4 della pagina $3 come verificata',
-'logentry-newusers-newusers' => "$1 ha creato un'utenza",
-'logentry-newusers-create' => "$1 ha creato un'utenza",
-'logentry-newusers-create2' => "$1 ha creato un'utenza $3",
+'logentry-newusers-newusers' => "L'utenza $1 è stata creata",
+'logentry-newusers-create' => "L'utenza $1 è stata creata",
+'logentry-newusers-create2' => "L'utenza $3 è stata creata da $1",
 'logentry-newusers-autocreate' => "L'utenza $1 è stata creata automaticamente",
 'newuserlog-byemail' => 'password inviata via mail',
 
@@ -3880,6 +3911,10 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'feedback-bugcheck' => 'Ottimo! Verifica che non sia già fra i [$1 bug conosciuti].',
 'feedback-bugnew' => 'Controllo effettuato. Segnala un nuovo bug',
 
+# Search suggestions
+'searchsuggest-search' => 'Ricerca',
+'searchsuggest-containing' => 'contenente...',
+
 # API errors
 'api-error-badaccess-groups' => 'Non sei autorizzato a caricare documenti su questa wiki.',
 'api-error-badtoken' => 'Errore interno: token errato.',
@@ -3932,4 +3967,6 @@ Le immagini vengono mostrate alla massima risoluzione disponibile, per gli altri
 'duration-centuries' => '$1 {{PLURAL:$1|secolo|secoli}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennio|millenni}}',
 
+# Unknown messages
+'svg-long-error' => 'File SVG non valido: $1',
 );
index a2ef485..f31f75f 100644 (file)
@@ -179,7 +179,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( '最近の更新', '最近更新したページ' ),
        'Recentchangeslinked'       => array( '関連ページの更新状況', 'リンク先の更新状況' ),
        'Revisiondelete'            => array( '版指定削除', '特定版削除' ),
-       'RevisionMove'              => array( '版移動' ),
        'Search'                    => array( '検索' ),
        'Shortpages'                => array( '短いページ' ),
        'Specialpages'              => array( '特別ページ一覧' ),
@@ -218,7 +217,6 @@ $magicWords = array(
        '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' ),
@@ -292,7 +290,7 @@ $magicWords = array(
        '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:' ),
+       'int'                       => array( '0', 'インターフェース:', 'インタ:', 'インターフェース:', 'インタ:', 'インターフェイス:', 'インターフェイス:', 'INT:' ),
        'sitename'                  => array( '1', 'サイト名', 'サイトネーム', 'SITENAME' ),
        'ns'                        => array( '0', '名前空間:', '名前空間:', '名空:', '名空:', 'NS:' ),
        'nse'                       => array( '0', '名前空間E:', 'NSE:' ),
@@ -359,7 +357,7 @@ $magicWords = array(
        'formatdate'                => array( '0', '日付整形', 'formatdate', 'dateformat' ),
        'url_path'                  => array( '0', 'パス', 'PATH' ),
        'url_wiki'                  => array( '0', 'ウィキ', 'WIKI' ),
-       'url_query'                 => array( '0', 'クエリー', 'QUERY' ),
+       'url_query'                 => array( '0', 'クエリ', 'クエリー', 'QUERY' ),
 );
 
 $messages = array(
@@ -370,14 +368,14 @@ $messages = array(
 'tog-hidepatrolled' => '最近の更新に巡回済みの編集を表示しない',
 'tog-newpageshidepatrolled' => '新しいページの一覧に巡回済みのページを表示しない',
 'tog-extendwatchlist' => 'ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示',
-'tog-usenewrc' => '最近の更新とウォッチリストで複数の変更をページごとにまとめる(JavaScriptが必要)',
+'tog-usenewrc' => '最近の更新とウォッチリストで複数の変更をページごとにまとめる (JavaScript が必要)',
 'tog-numberheadings' => '見出しに番号を自動的に振る',
 'tog-showtoolbar' => '編集用のツールバーを表示(JavaScriptが必要)',
 'tog-editondblclick' => 'ダブルクリックで編集(JavaScriptが必要)',
 'tog-editsection' => '[編集]リンクから節を編集できるようにする',
 'tog-editsectiononrightclick' => '節見出しの右クリックで節を編集できるようにする(JavaScriptが必要)',
 'tog-showtoc' => '目次を表示(ページに見出しが4つ以上ある場合)',
-'tog-rememberpassword' => 'このブラウザーにログイン情報を記憶(最大 $1 {{PLURAL:$1|日間}})',
+'tog-rememberpassword' => 'このブラウザーにログイン情報を保存 (最長 $1 {{PLURAL:$1|日|日間}})',
 'tog-watchcreations' => '自分が作成したページやアップロードしたファイルをウォッチリストに追加',
 'tog-watchdefault' => '自分が編集したページやファイルをウォッチリストに追加',
 'tog-watchmoves' => '自分が移動したページやファイルをウォッチリストに追加',
@@ -393,10 +391,10 @@ $messages = array(
 'tog-shownumberswatching' => 'ページをウォッチしている利用者数を表示',
 'tog-oldsig' => '既存の署名:',
 'tog-fancysig' => '署名をウィキ文として扱う (自動リンクなし)',
-'tog-externaleditor' => '既定で編集に外部アプリケーションを使用(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
-'tog-externaldiff' => '差分表示に外部アプリケーションを使用(上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
+'tog-externaleditor' => '既定で編集に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
+'tog-externaldiff' => '差分表示に外部アプリケーションを使用 (上級者向け、コンピューターに特殊な設定が必要。[//www.mediawiki.org/wiki/Manual:External_editors 詳細])',
 'tog-showjumplinks' => '利用しやすさ向上のための「{{int:jumpto}}」リンクを有効にする',
-'tog-uselivepreview' => 'ライブプレビューを使用(JavaScriptが必要)(開発中)',
+'tog-uselivepreview' => 'ライブプレビューを使用 (JavaScriptが必要) (開発中)',
 'tog-forceeditsummary' => '要約欄が空欄の場合に確認を促す',
 'tog-watchlisthideown' => 'ウォッチリストに自分の編集を表示しない',
 'tog-watchlisthidebots' => 'ウォッチリストにボットによる編集を表示しない',
@@ -412,7 +410,7 @@ $messages = array(
 
 'underline-always' => '常に付ける',
 'underline-never' => '常に付けない',
-'underline-default' => 'ブラウザーの設定を使用',
+'underline-default' => '外装またはブラウザーの既定値を使用',
 
 # Font style option in Special:Preferences
 'editfont-style' => '編集エリアのフォント:',
@@ -494,11 +492,11 @@ $messages = array(
 
 'about' => '解説',
 'article' => '本文',
-'newwindow' => '(新しいウィンドウが開きます)',
+'newwindow' => '(新しいウィンドウで開きます)',
 'cancel' => '中止',
 'moredotdotdot' => '続き...',
-'mypage' => '自分のページ',
-'mytalk' => '自分のトーク',
+'mypage' => 'ページ',
+'mytalk' => 'トーク',
 'anontalk' => 'このIPアドレスのトーク',
 'navigation' => '案内',
 'and' => '&#32;および&#32;',
@@ -508,7 +506,6 @@ $messages = array(
 'qbbrowse' => '閲覧',
 'qbedit' => '編集',
 'qbpageoptions' => 'このページについて',
-'qbpageinfo' => '関連情報',
 'qbmyoptions' => '自分のページ',
 'qbspecialpages' => '特別ページ',
 'faq' => 'よくある質問と回答',
@@ -519,9 +516,9 @@ $messages = array(
 'vector-action-delete' => '削除',
 'vector-action-move' => '移動',
 'vector-action-protect' => '保護',
-'vector-action-undelete' => '復帰',
+'vector-action-undelete' => '復å\85\83',
 'vector-action-unprotect' => '保護再設定',
-'vector-simplesearch-preference' => '検索語の提案機能を拡張(ベクター外装のみ)',
+'vector-simplesearch-preference' => '簡素化した検索バーを有効にする (ベクター外装のみ)',
 'vector-view-create' => '作成',
 'vector-view-edit' => '編集',
 'vector-view-history' => '履歴表示',
@@ -531,8 +528,9 @@ $messages = array(
 'namespaces' => '名前空間',
 'variants' => '変種',
 
+'navigation-heading' => '案内メニュー',
 'errorpagetitle' => 'エラー',
-'returnto' => '$1に戻る。',
+'returnto' => '$1 に戻る。',
 'tagline' => '提供:{{SITENAME}}',
 'help' => 'ヘルプ',
 'search' => '検索',
@@ -541,7 +539,7 @@ $messages = array(
 'searcharticle' => '表示',
 'history' => 'ページの履歴',
 'history_short' => '履歴',
-'updatedmarker' => '最後の訪問以降に更新されました',
+'updatedmarker' => '最終閲覧以降に変更されました',
 'printableversion' => '印刷用バージョン',
 'permalink' => 'この版への固定リンク',
 'print' => '印刷',
@@ -552,7 +550,7 @@ $messages = array(
 'create-this-page' => 'このページを作成',
 'delete' => '削除',
 'deletethispage' => 'このページを削除',
-'undelete_short' => '{{PLURAL:$1|$1 ç·¨é\9b\86}}ã\82\92復帰',
+'undelete_short' => '{{PLURAL:$1|$1 ç·¨é\9b\86}}ã\82\92復å\85\83',
 'viewdeleted_short' => '{{PLURAL:$1|削除された $1 編集}}を閲覧',
 'protect' => '保護',
 'protect_change' => '設定変更',
@@ -579,11 +577,11 @@ $messages = array(
 'viewtalkpage' => '議論を表示',
 'otherlanguages' => '他言語版',
 'redirectedfrom' => '($1から転送)',
-'redirectpagesub' => 'リダイレクトページ',
-'lastmodifiedat' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81\8cæ\9c\80å¾\8cã\81«æ\9b´æ\96°ã\81\95ã\82\8cã\81\9fã\81®は $1 $2 です。',
+'redirectpagesub' => '転送ページ',
+'lastmodifiedat' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®æ\9c\80çµ\82æ\9b´æ\96°æ\97¥æ\99\82は $1 $2 です。',
 'viewcount' => 'このページは {{PLURAL:$1|$1 回}}アクセスされました。',
 'protectedpage' => '保護されたページ',
-'jumpto' => '移動',
+'jumpto' => '移動:',
 'jumptonavigation' => '案内',
 'jumptosearch' => '検索',
 'view-pool-error' => '申し訳ありませんが、現在サーバーに過大な負荷がかかっています。
@@ -612,8 +610,8 @@ $1',
 'policy-url' => 'Project:方針',
 'portal' => 'コミュニティ・ポータル',
 'portal-url' => 'Project:コミュニティ・ポータル',
-'privacy' => 'プライバシー ポリシー',
-'privacypage' => 'Project:プライバシー ポリシー',
+'privacy' => 'プライバシーポリシー',
+'privacypage' => 'Project:プライバシーポリシー',
 
 'badaccess' => '権限がありません',
 'badaccess-group0' => '要求した操作を行うことは許可されていません。',
@@ -644,9 +642,9 @@ $1',
 'hidetoc' => '非表示',
 'collapsible-collapse' => '折り畳む',
 'collapsible-expand' => '展開する',
-'thisisdeleted' => '$1ã\82\92é\96²è¦§ã\81¾ã\81\9fã\81¯å¾©å¸°しますか?',
+'thisisdeleted' => '$1ã\82\92é\96²è¦§ã\81¾ã\81\9fã\81¯å¾©å\85\83しますか?',
 'viewdeleted' => '$1を閲覧しますか?',
-'restorelink' => '{{PLURAL:$1|削除された $1 編集}}',
+'restorelink' => '{{PLURAL:$1|削除された$1編集}}',
 'feedlinks' => 'フィード:',
 'feed-invalid' => 'フィード形式の指定が正しくありません。',
 'feed-unavailable' => 'フィードの配信は利用できません',
@@ -654,6 +652,8 @@ $1',
 'site-atom-feed' => '$1のAtomフィード',
 'page-rss-feed' => '「$1」のRSSフィード',
 'page-atom-feed' => '「$1」のAtomフィード',
+'feed-atom' => 'Atom',
+'feed-rss' => 'RSS',
 'red-link-title' => '$1(存在しないページ)',
 'sort-descending' => '降順に並べ替え',
 'sort-ascending' => '昇順に並べ替え',
@@ -713,7 +713,7 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'internalerror_info' => '内部エラー:$1',
 'fileappenderrorread' => '追加中に、「$1」を読み取れませんでした。',
 'fileappenderror' => '「$1」を「$2」に追加できませんでした。',
-'filecopyerror' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\82\92ã\80\8c$2ã\80\8dã\81¸複製できませんでした。',
+'filecopyerror' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\80\8c$1ã\80\8dã\82\92ã\80\8c$2ã\80\8dã\81«複製できませんでした。',
 'filerenameerror' => 'ファイル名を「$1」から「$2」へ変更できませんでした。',
 'filedeleteerror' => 'ファイル「$1」を削除できませんでした。',
 'directorycreateerror' => 'ディレクトリ「$1」を作成できませんでした。',
@@ -742,12 +742,12 @@ URL を間違って入力したか、正しくないリンクをたどった可
 'actionthrottled' => '操作が速度規制されました',
 'actionthrottledtext' => '短時間にこの操作を大量に行ったため、スパム対策として設定されている制限を超えました。
 少し時間をおいてからもう一度操作してください。',
-'protectedpagetext' => 'このページは編集できないように保護されています。',
+'protectedpagetext' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¯ç·¨é\9b\86ã\82\84ä»\96ã\81®æ\93\8dä½\9cã\81\8cã\81§ã\81\8dã\81ªã\81\84ã\82\88ã\81\86ã\81«ä¿\9dè­·ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99ã\80\82',
 'viewsourcetext' => 'このページのソースの閲覧やコピーができます:',
 'viewyourtext' => "このページへの'''あなたの編集'''のソースの閲覧やコピーができます:",
 'protectedinterface' => 'このページにはこのウィキのソフトウェアのインターフェイスに使用されるテキストが保存されており、いたずらなどの防止のために保護されています。
 すべてのウィキに対して翻訳を追加/変更する場合は、MediaWiki の地域化プロジェクト [//translatewiki.net/ translatewiki.net] を使用してください。',
-'editinginterface' => "'''è­¦å\91\8a:''' ã\82½ã\83\95ã\83\88ã\82¦ã\82§ã\82¢ã\81®ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤ã\82¹ã\81«ä½¿ç\94¨ã\81\95ã\82\8cã\82\8bã\81®ã\83\86ã\82­ã\82¹ã\83\88ã\81®ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\97ã\81¦ã\81\84ã\81¾ã\81\99ã\80\82
+'editinginterface' => "'''警告:''' ソフトウェアのインターフェイスに使用されるテキストのページを編集しています。
 このページを変更すると、このウィキの他の利用者のユーザーインターフェイスの外観に影響します。
 すべてのウィキに対して翻訳を追加/変更する場合は、MediaWiki の地域化プロジェクト [//translatewiki.net/wiki/Main_Page?setlang=ja translatewiki.net] を使用してください。",
 'sqlhidden' => '(SQL クエリ非表示)',
@@ -762,6 +762,8 @@ $2',
 'filereadonlyerror' => 'ファイルリポジトリ「$2」が読み取り専用の状態にあるため、ファイル「$1」を変更できません。
 
 読み取り専用に設定した管理者からの説明:「$3」',
+'invalidtitle-knownnamespace' => '名前空間名「$2」と名前「$3」の組み合わせはページ名として無効です',
+'invalidtitle-unknownnamespace' => '不明な名前空間番号 $1 と名前「$2」の組み合わせはページ名として無効です',
 'exception-nologin' => 'ログインしていません',
 'exception-nologin-text' => 'このページまたは操作には、このウィキへのログインが必要です。',
 
@@ -773,10 +775,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ログアウトしました。'''
 
-このまま匿名で{{SITENAME}}の使用を続行できます。同じまたは別の利用者として[[Special:UserLogin|もう一度ログイン]]することもできます。
+このまま匿名で{{SITENAME}}の使用を続行できます。同じまたは別の利用者として<span class='plainlinks'>[$1 もう一度ログイン]</span>することもできます。
 なお、ページによっては、ブラウザーのキャッシュをクリアするまで、ログインしているかのように表示され続ける場合があるためご注意ください。",
-'welcomecreation' => '== ようこそ、$1 さん! ==
-アカウントが作成されました。
+'welcomeuser' => 'ようこそ、$1さん!',
+'welcomecreation-msg' => 'アカウントが作成されました。
 [[Special:Preferences|{{SITENAME}}の個人設定]]の変更も忘れないようにしてください。',
 'yourname' => '利用者名:',
 'yourpassword' => 'パスワード:',
@@ -797,7 +799,7 @@ $2',
 'nologin' => '登録がまだの場合、$1。',
 'nologinlink' => 'アカウントを作成してください',
 'createaccount' => 'アカウント作成',
-'gotaccount' => '既にアカウントを持っている場合、$1。',
+'gotaccount' => 'アカウントを既に持っている場合、$1。',
 'gotaccountlink' => 'ログインしてください',
 'userlogin-resetlink' => 'ログイン情報をお忘れですか?',
 'createaccountmail' => 'メールで送信',
@@ -808,9 +810,9 @@ $2',
 'loginerror' => 'ログインのエラー',
 'createaccounterror' => 'アカウントを作成できませんでした: $1',
 'nocookiesnew' => '利用者アカウントは作成されましたが、ログインしていません。
-{{SITENAME}}ではログインにCookieを使用します。
\81\94使ç\94¨ã\81®ã\83\96ã\83©ã\82¦ã\82¶ã\81§ã\81¯Cookieが無効になっています。
-Cookieを有効にしてから、新しい利用者名とパスワードでログインしてください。',
+{{SITENAME}}では利用者のログインに Cookie を使用します。
\81\94使ç\94¨ã\81®ã\83\96ã\83©ã\82¦ã\82¶ã\83¼ã\81§ã\81¯ Cookie が無効になっています。
+Cookie を有効にしてから、新しい利用者名とパスワードでログインしてください。',
 'nocookieslogin' => '{{SITENAME}}ではログインにCookieを使用します。
 Cookieを無効にしているようです。
 Cookieを有効にしてから、もう一度試してください。',
@@ -1008,7 +1010,7 @@ $2
 ただし、[[Special:Preferences|個人設定]]で有効なメールアドレスが登録されていない場合、またはメール送信機能の使用がブロックされている場合、「この利用者にメールを送信」の機能は使えません。
 現在ご使用中のIPアドレスは$3、このブロックIDは#$5です。
 お問い合わせの際には、上記の情報を必ず書いてください。",
-'autoblockedtext' => "ã\81\94使ç\94¨ä¸­ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81¯ã\80\81$1ã\81«ã\82\88ã\81£ã\81¦æ\8a\95稿ã\82\92ã\83\96ã\83­ã\83\83ã\82¯ã\81\95ã\82\8cã\81\9få\88©ç\94¨è\80\85ã\81«ã\82\88ã\81£ã\81¦ä½¿ç\94¨ã\81\95ã\82\8cã\81\9fã\81\9fã\82\81ã\81«自動的にブロックされています。
+'autoblockedtext' => "ã\81\93ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81¯ã\80\81$1ã\81«ã\82\88ã\82\8aã\83\96ã\83­ã\83\83ã\82¯ã\81\95ã\82\8cã\81\9få\88©ç\94¨è\80\85ã\81«ã\82\88ã\81£ã\81¦ä½¿ç\94¨ã\81\95ã\82\8cã\81\9fã\81\9fã\82\81ã\80\81自動的にブロックされています。
 理由は次の通りです。
 
 :''$2''
@@ -1017,12 +1019,12 @@ $2
 * ブロック解除予定:$6
 * 意図されているブロック対象者:$7
 
-$1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのについて問い合わせることができます。
+$1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこのブロックについて問い合わせることができます。
 
 ただし、[[Special:Preferences|個人設定]]に正しいメールアドレスが登録されていない場合、またはメール送信がブロックされている場合、メール送信機能が使えないことに注意してください。
 
 現在ご使用中のIPアドレスは$3 、このブロックIDは#$5です。
\81\8aå\95\8fã\81\84å\90\88ã\82\8fã\81\9bã\81®é\9a\9bã\81«ã\81¯ã\80\81ã\81\93の情報を必ず書いてください。",
\81\8aå\95\8fã\81\84å\90\88ã\82\8fã\81\9bã\81®é\9a\9bã\81¯ã\80\81ä¸\8aè¨\98の情報を必ず書いてください。",
 'blockednoreason' => '理由が設定されていません',
 'whitelistedittext' => 'このページを編集するには$1する必要があります。',
 'confirmedittext' => 'ページの編集を始める前にメールアドレスの確認をする必要があります。
@@ -1033,24 +1035,24 @@ $1または他の[[{{MediaWiki:Grouppage-sysop}}|管理者]]にこの件につ
 'loginreqtitle' => 'ログインが必要',
 'loginreqlink' => 'ログイン',
 'loginreqpagetext' => '他のページを閲覧するには$1する必要があります。',
-'accmailtitle' => 'パスワードを送信しました。',
+'accmailtitle' => 'パスワードをお送りしました。',
 'accmailtext' => "[[User talk:$1|$1]]のために無作為に生成したパスワードを、$2に送信しました。
 
 この新アカウントのパスワードは、ログインした際に''[[Special:ChangePassword|パスワード変更]]''ページで変更できます。",
 'newarticle' => '(新)',
-'newarticletext' => "ã\81¾ã\81 å­\98å\9c¨ã\81\97ã\81¦ã\81\84ã\81ªã\81\84ã\83\9aã\83¼ã\82¸ã\81¸ã\81®ã\83ªã\83³ã\82¯ã\82\92ã\81\9fã\81©ã\82\8aã\81¾ã\81\97ã\81\9fã\80\82
-このページを新規に作成するには、下のボックスに内容を書き込んでください(詳しくは[[{{MediaWiki:Helppage}}|ヘルプページ]]を参照してください)
+'newarticletext' => "まだ存在しないページへのリンクをたどりました。
+このページを新規作成するには、ページの内容を以下のボックスに記入してください (詳しくは[[{{MediaWiki:Helppage}}|ヘルプ ページ]]を参照してください)
 誤ってこのページにたどり着いた場合には、ブラウザーの'''戻る'''ボタンで前のページに戻ってください。",
 'anontalkpagetext' => "----''このページはアカウントをまだ作成していないか使用していない匿名利用者のための議論ページです。
 匿名利用者を識別するために、利用者名の代わりにIPアドレスが使用されています。
 IP アドレスは複数の利用者で共有されている場合があります。
 もし、あなたが匿名利用者であり、自分に関係のないコメントが寄せられている考えられる場合は、[[Special:UserLogin/signup|アカウントを作成する]]か[[Special:UserLogin|ログインして]]他の匿名利用者と間違えられないようにしてください。''",
 'noarticletext' => '現在このページには内容がありません。
-ä»\96ã\81®ã\83\9aã\83¼ã\82¸å\86\85ã\81§[[Special:Search/{{PAGENAME}}|ã\81\93ã\81®ã\83\9aã\83¼ã\82¸å\90\8dã\82\92æ¤\9cç´¢]]ã\81\99ã\82\8bã\81\8bã\80\81
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} é\96¢é\80£ã\81\99ã\82\8bè¨\98é\8c²ã\82\92æ¤\9cç´¢]ã\81\99ã\82\8bã\81\8bã\80\81
-[{{fullurl:{{FULLPAGENAME}}|action=edit}} このページを編集]</span>することができます。',
+他のページ内で[[Special:Search/{{PAGENAME}}|このページ名を検索]]、
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連する記録を検索]、
+または[{{fullurl:{{FULLPAGENAME}}|action=edit}} このページを編集]</span>できます。',
 'noarticletext-nopermission' => '現在このページには内容がありません。
-ä»\96ã\81®ã\83\9aã\83¼ã\82¸å\86\85ã\81§[[Special:Search/{{PAGENAME}}|ã\81\93ã\81®ã\83\9aã\83¼ã\82¸å\90\8dã\82\92æ¤\9cç´¢]]ã\81\99ã\82\8bã\81\8bã\80\81<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} é\96¢é\80£è¨\98é\8c²ã\82\92æ¤\9cç´¢]</span>ã\81\99ã\82\8bã\81\93ã\81¨ã\81\8cできますが、あなたにはこのページを作成する権限はありません。',
+ä»\96ã\81®ã\83\9aã\83¼ã\82¸å\86\85ã\81§[[Special:Search/{{PAGENAME}}|ã\81\93ã\81®ã\83\9aã\83¼ã\82¸å\90\8dã\82\92æ¤\9cç´¢]]ã\80\81ã\81¾ã\81\9fã\81¯<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} é\96¢é\80£ã\81\99ã\82\8bè¨\98é\8c²ã\82\92æ¤\9cç´¢]</span>できますが、あなたにはこのページを作成する権限はありません。',
 'missing-revision' => '「{{PAGENAME}}」というページの版番号 $1 の版は存在しません。
 
 通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 
@@ -1061,9 +1063,9 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'blocked-notice-logextract' => 'この利用者は現在ブロックされています。
 参考のために最新のブロック記録を以下に表示します:',
 'clearyourcache' => "'''注意:''' 保存後、変更を確認するにはブラウザーのキャッシュを消去する必要がある場合があります。
-* '''Firefox / Safari:''' ''Shift'' ã\82\92æ\8a¼ã\81\97ã\81ªã\81\8cã\82\89 ''å\86\8d読ã\81¿è¾¼ã\81¿'' ã\82\92ã\82¯ã\83ªã\83\83ã\82¯ã\81\99ã\82\8bã\80\81ã\82\82ã\81\97ã\81\8fã\81¯ ''Ctrl-F5'' ã\81\8b ''Ctrl-R'' ã\82\92æ\8a¼ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84 (Macã\81§ã\81¯ ''&#x2318;-R'' )
-* '''Google Chrome:''' ''Ctrl-Shift-R'' を押してください (Macでは ''&#x2318;-Shift-R'' )
-* '''Internet Explorer:''' ''Ctrl'' ã\82\92æ\8a¼ã\81\97ã\81ªã\81\8cã\82\89 ''æ\9c\80æ\96°ã\81®æ\83\85å ±ã\81«æ\9b´æ\96°'' ã\82\92ã\82¯ã\83ªã\83\83ã\82¯ã\81\99ã\82\8bã\80\81ã\82\82ã\81\97ã\81\8fã\81¯ ''Ctrl-F5'' を押してください
+* '''Firefox / Safari:''' ''Shift'' ã\82\92æ\8a¼ã\81\97ã\81ªã\81\8cã\82\89 ''å\86\8d読ã\81¿è¾¼ã\81¿'' ã\82\92ã\82¯ã\83ªã\83\83ã\82¯ã\81\99ã\82\8bã\81\8bã\80\81''Ctrl-F5'' ã\81¾ã\81\9fã\81¯ ''Ctrl-R'' ã\82\92æ\8a¼ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84 (Mac ã\81§ã\81¯ ''&#x2318;-R'')
+* '''Google Chrome:''' ''Ctrl-Shift-R'' を押してください (Mac では ''&#x2318;-Shift-R'')
+* '''Internet Explorer:''' ''Ctrl'' ã\82\92æ\8a¼ã\81\97ã\81ªã\81\8cã\82\89 ''æ\9c\80æ\96°ã\81®æ\83\85å ±ã\81«æ\9b´æ\96°'' ã\82\92ã\82¯ã\83ªã\83\83ã\82¯ã\81\99ã\82\8bã\81\8bã\80\81''Ctrl-F5'' を押してください
 * '''Opera:''' ''ツール → 設定'' からキャッシュをクリアしてください。",
 'usercssyoucanpreview' => "'''ヒント:'''「{{int:showpreview}}」ボタンを使うと、保存前に新しいスタイルシートを試験できます。",
 'userjsyoucanpreview' => "'''ヒント:''' 「{{int:showpreview}}」ボタンを使うと、保存前に新しいスクリプトを試験できます。",
@@ -1080,7 +1082,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'updated' => '(更新)',
 'note' => "'''お知らせ:'''",
 'previewnote' => "'''これはプレビューです。'''
-変更箇所はまだ保存されていません!",
+変更内容はまだ保存されていません!",
 'continue-editing' => '編集を続行',
 'previewconflict' => 'これは、上の編集エリアの文章を保存した場合にどう表示されるかを示すプレビューです。',
 'session_fail_preview' => "'''申し訳ありません!セッションデータが消失したため編集を処理できませんでした。'''
@@ -1113,10 +1115,10 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'editingold' => "'''警告:このページの古い版を編集しています。'''
 保存すると、この版以降に追加されていた変更がすべて失われます。",
 'yourdiff' => '差分',
-'copyrightwarning' => "{{SITENAME}}への投稿は、すべて$2(詳細は$1を参照)のもとで公開したと見なされることにご注意ください。
+'copyrightwarning' => "{{SITENAME}}への投稿は、すべて$2 (詳細は$1を参照) のもとで公開したと見なされることにご注意ください。
 あなたが投稿したものを、他人がよって遠慮なく編集し、それを自由に配布するのを望まない場合は、ここには投稿しないでください。<br />
 また、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください。
-'''著作権保護されている作品を、許諾なしに投稿しないでください'''",
+'''著作権保護されている作品を、許諾なしに投稿しないでください!'''",
 'copyrightwarning2' => "{{SITENAME}}へのすべての投稿は、他の利用者が編集、変更、除去する可能性があります。
 あなたの投稿を、他人が遠慮なく編集するのを望まない場合は、ここには投稿しないでください。<br />
 また、投稿するのは、あなたが書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は$1を参照)。
@@ -1149,7 +1151,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'sectioneditnotsupported-text' => 'このページでは節単位編集はサポートされません。',
 'permissionserrors' => '認証エラー',
 'permissionserrorstext' => 'あなたにはこの操作を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:',
-'permissionserrorstext-withaction' => 'あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです',
+'permissionserrorstext-withaction' => 'あなたには「$2」を行う権限はありません。{{PLURAL:$1|理由}}は以下の通りです:',
 'recreate-moveddeleted-warn' => "'''警告:以前削除されたページを再作成しようとしています。'''
 
 このページの編集を続行するのが適切かどうかご確認ください。
@@ -1166,6 +1168,15 @@ IP アドレスは複数の利用者で共有されている場合がありま
 'edit-already-exists' => '新しいページを作成できませんでした。
 そのページは既に存在しています。',
 'defaultmessagetext' => '既定のメッセージ文',
+'content-failed-to-parse' => '$2 の本文を$1モデルとして構文解析できませんでした: $3',
+'invalid-content-data' => '本文データが無効です',
+'content-not-allowed-here' => 'ページ [[$2]] では、「$1」コンテンツは許可されていません',
+
+# Content models
+'content-model-wikitext' => 'ウィキテキスト',
+'content-model-text' => 'プレーンテキスト',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''警告:'''このページでの高負荷なパーサー関数の呼び出し回数が多過ぎます。
@@ -1203,7 +1214,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 $3が示した理由:''$2''",
 
 # History pages
-'viewpagelogs' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81«é\96¢ã\81\99ã\82\8b記録を閲覧',
+'viewpagelogs' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®記録を閲覧',
 'nohistory' => 'このページには編集履歴がありません。',
 'currentrev' => '最新版',
 'currentrev-asof' => '$1時点における最新版',
@@ -1224,7 +1235,7 @@ $3が示した理由:''$2''",
 'histfirst' => '最古',
 'histlast' => '最新',
 'historysize' => '({{PLURAL:$1|$1バイト}})',
-'historyempty' => '(空)',
+'historyempty' => '(空)',
 
 # Revision feed
 'history-feed-title' => '変更履歴',
@@ -1266,21 +1277,21 @@ $3が示した理由:''$2''",
 この差分を閲覧できます。[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 秘匿記録]に詳細情報があるかもしれません。",
 'rev-delundel' => '表示/非表示',
 'rev-showdeleted' => '表示',
-'revisiondelete' => 'ç\89\88ã\81®å\89\8aé\99¤ã\81¨å¾©å¸°',
+'revisiondelete' => 'ç\89\88ã\81®å\89\8aé\99¤ã\81¨å¾©å\85\83',
 'revdelete-nooldid-title' => '無効な対象版',
 'revdelete-nooldid-text' => 'この操作の対象となる版を指定していないか、指定した版が存在していないか、あるいは最新版を非表示しようとしています。',
 'revdelete-nologtype-title' => '記録の種類を指定していません',
 'revdelete-nologtype-text' => 'この操作を実行する記録の種類を指定していません。',
 'revdelete-nologid-title' => '無効な記録項目',
-'revdelete-nologid-text' => 'この操作の対象となる記録項目を指定していないか、あるいは指定した項目が存在しません。',
+'revdelete-nologid-text' => 'この操作の対象となる記録項目を指定していないか、あるいは指定した項目が存在しません。',
 'revdelete-no-file' => '指定されたファイルは存在しません。',
 'revdelete-show-file-confirm' => '本当にファイル「<nowiki>$1</nowiki>」の削除された$2$3の版を閲覧しますか?',
 'revdelete-show-file-submit' => 'はい',
 'revdelete-selected' => "'''[[:$1]] の{{PLURAL:$2|選択された版}}:'''",
-'logdelete-selected' => "'''{{PLURAL:$1|選択された記録項目}}:'''",
-'revdelete-text' => "'''削除された版や記録はページの履歴や記録に表示され続けますが、一般の利用者はその内容にアクセスできなくなります。'''
-追å\8a ã\81®å\88¶é\99\90ã\81\8cã\81\8bã\81\91ã\82\89ã\82\8cã\81ªã\81\84é\99\90ã\82\8aã\80\81{{SITENAME}}ã\81®ä»\96ã\81®ç®¡ç\90\86è\80\85ã\82\82ã\81\93ã\82\8cã\81¨å\90\8cã\81\98ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤ã\82¹ã\82\92使ç\94¨ã\81\97ã\81¦é\9a ã\81\95ã\82\8cã\81\9få\86\85容ã\81«ã\82¢ã\82¯ã\82»ã\82¹ã\81\97ã\81\9fã\82\8aã\80\81復å\85\83ã\81\97ã\81\9fã\82\8aできます。",
-'revdelete-confirm' => 'この操作を意図して行っていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に沿って行っていることを確認してください。',
+'logdelete-selected' => "'''{{PLURAL:$1|選択された記録項目}}:'''",
+'revdelete-text' => "'''削除された版や記録項目は引き続きページの履歴や記録に表示されますが、一般利用者はその内容の一部を取得できなくなります。'''
+追å\8a ã\81®å\88¶é\99\90ã\81\8cã\81\8bã\81\91ã\82\89ã\82\8cã\81ªã\81\84é\99\90ã\82\8aã\80\81{{SITENAME}}ã\81®ä»\96ã\81®ç®¡ç\90\86è\80\85ã\81¯å\90\8cã\81\98ã\82¤ã\83³ã\82¿ã\83¼ã\83\95ã\82§ã\82¤ã\82¹ã\82\92使ã\81£ã\81¦é\9d\9e表示ã\81®å\86\85容ã\81®å\8f\96å¾\97ã\82\84復å\85\83ã\81\8cできます。",
+'revdelete-confirm' => 'この操作を行おうとしていること、その結果を理解していること、[[{{MediaWiki:Policy-url}}|方針]]に従っていること、を確認してください。',
 'revdelete-suppress-text' => "秘匿は、'''以下の場合に限って'''使用すべきです:
 * 名誉毀損の恐れのある記述
 * 非公開個人情報
@@ -1292,7 +1303,7 @@ $3が示した理由:''$2''",
 'revdelete-hide-comment' => '編集の要約を隠す',
 'revdelete-hide-user' => '投稿者の利用者名またはIPを隠す',
 'revdelete-hide-restricted' => '他の利用者と同様に管理者からもデータを隠す',
-'revdelete-radio-same' => '(変更しない)',
+'revdelete-radio-same' => '(変更しない)',
 'revdelete-radio-set' => 'はい',
 'revdelete-radio-unset' => 'いいえ',
 'revdelete-suppress' => '他の利用者と同様に管理者からもデータを隠す',
@@ -1321,11 +1332,11 @@ $1",
 'revdelete-concurrent-change' => '$1$2の項目の変更に失敗しました:あなたが変更しようとしている間に、他の誰かが変更したようです。
 記録を確認してください。',
 'revdelete-only-restricted' => '$1$2の項目の版指定削除に失敗しました:他の閲覧レベルの選択肢のうちどれかをさらに選択しなければ、管理者から項目を秘匿できません。',
-'revdelete-reason-dropdown' => '
-*よくある削除理由
+'revdelete-reason-dropdown' => '*よくある削除理由
 ** 著作権侵害
-** 名誉毀損のおそれ
-** 非公開個人情報',
+** 不適切なコメントや個人情報の開示
+** 不適切な利用者名
+** 名誉毀損のおそれ',
 'revdelete-otherreason' => '他の、または追加の理由:',
 'revdelete-reasonotherlist' => 'その他の理由',
 'revdelete-edit-reasonlist' => '削除理由を編集',
@@ -1399,7 +1410,7 @@ $1",
 'prevn-title' => '前の{{PLURAL:$1|$1結果}}',
 'nextn-title' => '次の{{PLURAL:$1|$1結果}}',
 'shown-title' => 'ページあたり{{PLURAL:$1|$1件の結果}}を表示',
-'viewprevnext' => '($1{{int:pipe-separator}}$2)($3)を表示',
+'viewprevnext' => '($1{{int:pipe-separator}}$2) ($3 件) を表示',
 'searchmenu-legend' => '検索オプション',
 'searchmenu-exists' => "'''このウィキには「[[:$1]]」という名前のページがあります'''",
 'searchmenu-new' => "'''このウィキでページ「[[:$1]]」を新規作成する'''",
@@ -1413,28 +1424,26 @@ $1",
 'searchprofile-articles-tooltip' => '$1内を検索',
 'searchprofile-project-tooltip' => '$1内を検索',
 'searchprofile-images-tooltip' => 'ファイルを検索',
-'searchprofile-everything-tooltip' => '全本文ページ(トークページ含む)を検索',
+'searchprofile-everything-tooltip' => '全本文ページ (トークページを含む) 内を検索',
 'searchprofile-advanced-tooltip' => '特定の名前空間内を検索',
-'search-result-size' => '$1({{PLURAL:$2|$2単語}})',
-'search-result-category-size' => '{{PLURAL:$1|$1件}}({{PLURAL:$2|$2下位カテゴリ}}、{{PLURAL:$3|$3ファイル}})',
-'search-result-score' => '関連度$1%',
+'search-result-size' => '$1 ({{PLURAL:$2|$2 単語}})',
+'search-result-category-size' => '{{PLURAL:$1|$1 件}} ({{PLURAL:$2|$2 下位カテゴリ}}、{{PLURAL:$3|$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' => '(続き)',
-'search-mwsuggest-enabled' => '検索候補を表示',
-'search-mwsuggest-disabled' => '検索候補を表示しない',
+'search-interwiki-default' => '$1の結果:',
+'search-interwiki-more' => '(続き)',
 'search-relatedarticle' => '関連',
 'mwsuggest-disable' => 'Ajaxによる検索候補の提示を無効にする',
 'searcheverything-enable' => 'すべての名前空間を検索',
 'searchrelated' => '関連',
 'searchall' => 'すべて',
-'showingresults' => "'''$2''' 件目以降の {{PLURAL:$1|'''$1''' 件の結果}}を表示しています。",
+'showingresults' => "'''$2''' 件目以降の最大 {{PLURAL:$1|'''$1''' 件の結果}}を表示しています。",
 'showingresultsnum' => "'''$2''' 件目以降の {{PLURAL:$3|'''$3''' 件の結果}}を表示しています。",
 'showingresultsheader' => "「'''$4'''」の検索結果 {{PLURAL:$5|'''$3''' 件中の '''$1''' 件目|'''$3''' 件中の '''$1''' 件目から '''$2''' 件目}}",
-'nonefound' => "'''注意'''既定では一部の名前空間のみを検索します。
+'nonefound' => "'''注意'''既定では一部の名前空間のみを検索します。
 ''all:''を前に付けると、すべて(トークページやテンプレートなどを含む)を対象にできます。検索する名前空間を前に付けることもできます。",
 'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
 'powersearch' => '高度な検索',
@@ -1479,10 +1488,10 @@ $1",
 'prefs-watchlist-days' => 'ウォッチリストの表示日数:',
 'prefs-watchlist-days-max' => '最大 $1 {{PLURAL:$1|日間}}',
 'prefs-watchlist-edits' => '拡張ウォッチリストの表示件数:',
-'prefs-watchlist-edits-max' => '最大数1000',
+'prefs-watchlist-edits-max' => '最大数1000',
 'prefs-watchlist-token' => 'ウォッチリストのトークン:',
 'prefs-misc' => 'その他',
-'prefs-resetpass' => 'ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\81®変更',
+'prefs-resetpass' => 'ã\83\91ã\82¹ã\83¯ã\83¼ã\83\89ã\82\92変更',
 'prefs-changeemail' => 'メールアドレスを変更',
 'prefs-setemail' => 'メールアドレスを設定',
 'prefs-email' => 'メールの設定',
@@ -1495,7 +1504,7 @@ $1",
 'rows' => '行数:',
 'columns' => '列数:',
 'searchresultshead' => '検索',
-'resultsperpage' => '1ページあたりの表示件数:',
+'resultsperpage' => '1 ページあたりの表示件数:',
 'stub-threshold' => '<a href="#" class="stub">スタブリンク</a>として表示する閾値 (バイト):',
 'stub-threshold-disabled' => '無効',
 'recentchangesdays' => '最近の更新に表示する日数:',
@@ -1504,7 +1513,7 @@ $1",
 'prefs-help-recentchangescount' => 'この設定は最近の更新、ページの履歴、および記録に適用されます。',
 'prefs-help-watchlist-token' => 'この欄に秘密鍵を入力すると、あなたのウォッチリストのRSSフィードが生成されます。
 この欄に入力されている鍵を知っている人は誰でもこのウォッチリストを閲覧できるようになるため、他人に分からない値を選んでください。
-乱数によって生成された次の値を使うこともできます$1',
+乱数によって生成された次の値を使うこともできます$1',
 'savedprefs' => '個人設定を保存しました。',
 'timezonelegend' => 'タイムゾーン:',
 'localtime' => 'ローカルの時刻:',
@@ -1540,7 +1549,9 @@ $1",
 'username' => '利用者名:',
 'uid' => '利用者 ID:',
 'prefs-memberingroups' => '所属{{PLURAL:$1|グループ}}:',
+'prefs-memberingroups-type' => '$1',
 'prefs-registration' => '登録日時:',
+'prefs-registration-date-time' => '$1',
 'yourrealname' => '本名:',
 'yourlanguage' => '使用言語:',
 'yourvariant' => 'コンテンツ言語変種:',
@@ -1555,11 +1566,11 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'gender-unknown' => '未指定',
 'gender-male' => '男',
 'gender-female' => '女',
-'prefs-help-gender' => '省略可ソフトウェアによる文法的性の解決に使用されます。
+'prefs-help-gender' => '省略可ソフトウェアによる文法的性の解決に使用されます。
 この情報は公開されます。',
 'email' => 'メール',
 'prefs-help-realname' => '本名は省略できます。
-入力すると、あなたの著作物の帰属表記に本名を使用します。',
+入力すると、あなたの著作物の帰属表示に使われます。',
 'prefs-help-email' => 'メールアドレスは省略できますが、パスワードを忘れた際にパスワードをリセットするのに必要です。',
 'prefs-help-email-others' => '利用者ページやトークページ上のリンクを通じて、他の利用者があなたにメールで連絡を取れるようにすることもできます。
 他の利用者が連絡を取る際にあなたのメールアドレスが開示されることはありません。',
@@ -1586,34 +1597,36 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 # User rights
 'userrights' => '利用者権限を管理',
 'userrights-lookup-user' => '利用者グループを管理',
-'userrights-user-editname' => '利用者名を入力',
+'userrights-user-editname' => '利用者名を入力:',
 'editusergroup' => '利用者グループを編集',
 'editinguser' => "利用者''' [[User:$1|$1]]''' $2 の権限を変更",
 'userrights-editusergroup' => '利用者グループを編集',
 'saveusergroups' => '利用者グループを保存',
-'userrights-groupsmember' => '所属グループ:',
-'userrights-groupsmember-auto' => '自動的に付与される権限:',
+'userrights-groupsmember' => '所属グループ:',
+'userrights-groupsmember-auto' => '自動的に付与される権限:',
+'userrights-groupsmember-type' => '$1',
 'userrights-groups-help' => 'この利用者が属するグループを変更できます。
 * チェックが入っているボックスは、この利用者がそのグループに属していることを意味します。
 * チェックが入っていないボックスは、この利用者がそのグループに属していないことを意味します。
 * 「*」はグループに一旦追加した場合に除去(あるいはその逆)ができないことを示しています。',
-'userrights-reason' => '理由',
+'userrights-reason' => '理由:',
 'userrights-no-interwiki' => '他ウィキ上における利用者権限の編集権限はありません。',
 'userrights-nodatabase' => 'データベース$1は存在しないか、ローカル上にありません。',
 'userrights-nologin' => '利用者権限を付与するには、管理者アカウントで[[Special:UserLogin|ログイン]]する必要があります。',
 'userrights-notallowed' => 'あなたのアカウントには利用者権限を追加または除去する権限がありません。',
 'userrights-changeable-col' => '変更できるグループ',
 'userrights-unchangeable-col' => '変更できないグループ',
+'userrights-irreversible-marker' => '$1*',
 
 # Groups
-'group' => 'グループ',
+'group' => 'グループ:',
 'group-user' => '登録利用者',
 'group-autoconfirmed' => '自動承認された利用者',
 'group-bot' => 'ボット',
 'group-sysop' => '管理者',
 'group-bureaucrat' => 'ビューロクラット',
 'group-suppress' => '秘匿者',
-'group-all' => '(全員)',
+'group-all' => '(全員)',
 
 'group-user-member' => '{{GENDER:$1|登録利用者}}',
 'group-autoconfirmed-member' => '{{GENDER:$1|自動承認された利用者}}',
@@ -1643,7 +1656,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-suppressredirect' => '転送ページを作成せずにページを移動',
 'right-upload' => 'ファイルをアップロード',
 'right-reupload' => '既存のファイルに上書き',
-'right-reupload-own' => '自分自身がアップロードした既存のファイルに上書き',
+'right-reupload-own' => '自身がアップロードした既存のファイルに上書き',
 'right-reupload-shared' => '共有メディアリポジトリ上のファイルにローカルで上書き',
 'right-upload_by_url' => 'URL からファイルをアップロード',
 'right-purge' => '確認なしでサイトのキャッシュを破棄',
@@ -1654,12 +1667,12 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-writeapi' => '書き込みAPIを使用',
 'right-delete' => 'ページを削除',
 'right-bigdelete' => '大きな履歴があるページを削除',
-'right-deletelogentry' => 'ç\89¹å®\9aã\81®è¨\98é\8c²é \85ç\9b®ã\82\92å\89\8aé\99¤/復帰',
-'right-deleterevision' => 'ã\83\9aã\83¼ã\82¸ã\81®ç\89¹å®\9aã\81®ç\89\88ã\82\92å\89\8aé\99¤/復帰',
+'right-deletelogentry' => 'ç\89¹å®\9aã\81®è¨\98é\8c²é \85ç\9b®ã\82\92å\89\8aé\99¤/復å\85\83',
+'right-deleterevision' => 'ã\83\9aã\83¼ã\82¸ã\81®ç\89¹å®\9aã\81®ç\89\88ã\82\92å\89\8aé\99¤/復å\85\83',
 'right-deletedhistory' => '削除された履歴項目(関連する本文を除く)を閲覧',
 'right-deletedtext' => '削除された本文と削除された版間の差分を閲覧',
 'right-browsearchive' => '削除されたページを検索',
-'right-undelete' => 'ã\83\9aã\83¼ã\82¸ã\82\92復帰',
+'right-undelete' => 'ã\83\9aã\83¼ã\82¸ã\82\92復å\85\83',
 'right-suppressrevision' => '管理者から隠された版を確認/復元',
 'right-suppressionlog' => '非公開記録を閲覧',
 'right-block' => '他の利用者の編集をブロック',
@@ -1667,7 +1680,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-hideuser' => '利用者名をブロックして公開記録から隠す',
 'right-ipblock-exempt' => 'IPブロック、自動ブロック、広域ブロックを回避',
 'right-proxyunbannable' => 'プロキシの自動ブロックを回避',
-'right-unblockself' => '自分自身に対するブロックを解除',
+'right-unblockself' => '自身に対するブロックを解除',
 'right-protect' => '保護レベルを変更し、保護されたページを編集',
 'right-editprotected' => '保護ページ(カスケード保護を除く)を編集',
 'right-editinterface' => 'ユーザーインターフェイスを編集',
@@ -1680,7 +1693,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'right-import' => '他のウィキからページを取り込み',
 'right-importupload' => 'ファイルアップロードでページを取り込み',
 'right-patrol' => '他人の編集を巡回済みにする',
-'right-autopatrol' => '自分の編集を自動的に巡回済みにする',
+'right-autopatrol' => '自身の編集を自動で巡回済みにする',
 'right-patrolmarks' => '最近の更新で巡回済み印を閲覧',
 'right-unwatchedpages' => 'ウォッチされていないページ一覧を閲覧',
 'right-mergehistory' => 'ページの履歴を統合',
@@ -1694,9 +1707,12 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 # User rights log
 'rightslog' => '利用者権限変更記録',
 'rightslogtext' => '以下は利用者権限の変更記録です。',
-'rightslogentry' => '$1の所属グループを $2 から $3 に変更しました',
+'rightslogentry' => '$1 の所属グループを $2 から $3 に変更しました',
 'rightslogentry-autopromote' => '$2 から $3 に自動的に昇格しました',
-'rightsnone' => '(なし)',
+'logentry-rights-rights' => '$1 が $3 の所属グループを $4 から $5 に変更しました',
+'logentry-rights-rights-legacy' => '$1 が $3 の所属グループを変更しました',
+'logentry-rights-autopromote' => '$1 が $4 から $5 に自動的に昇格しました',
+'rightsnone' => '(なし)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'このページの閲覧',
@@ -1718,7 +1734,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'action-deleterevision' => 'この版の削除',
 'action-deletedhistory' => 'このページの削除履歴の閲覧',
 'action-browsearchive' => '削除されたページの検索',
-'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å¾©å¸°',
+'action-undelete' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81®å¾©å\85\83',
 'action-suppressrevision' => '隠された版の確認と復元',
 'action-suppressionlog' => 'この非公開記録の閲覧',
 'action-block' => 'この利用者の編集ブロック',
@@ -1746,7 +1762,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'recentchanges-label-bot' => 'この編集はボットによって行われました',
 'recentchanges-label-unpatrolled' => 'この編集はまだ巡回されていません',
 'rcnote' => "$4 $5 までの{{PLURAL:$2|'''$2'''日間}}になされた{{PLURAL:$1|'''$1'''件の変更}}は以下の通りです。",
-'rcnotefrom' => "以下は、'''$2'''以降の更新です(最大'''$1'''件)。",
+'rcnotefrom' => "以下は'''$2'''以降の更新です (最大 '''$1''' 件)。",
 'rclistfrom' => '$1以降の更新を表示する',
 'rcshowhideminor' => '細部の編集を$1',
 'rcshowhidebots' => 'ボットを$1',
@@ -1754,7 +1770,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'rcshowhideanons' => '匿名利用者を$1',
 'rcshowhidepatr' => '巡回された編集を$1',
 'rcshowhidemine' => '自分の編集を$1',
-'rclinks' => '最近$2日間の更新$1件以内を表示<br />$3',
+'rclinks' => '最近 $2 日間の更新を最大 $1 件表示<br />$3',
 'diff' => '差分',
 'hist' => '履歴',
 'hide' => '非表示',
@@ -1766,6 +1782,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'number_of_watching_users_pageview' => '[{{PLURAL:$1|$1 人の利用者}}がウォッチしています]',
 'rc_categories' => 'カテゴリを限定(「|」で区切る)',
 'rc_categories_any' => 'すべて',
+'rc-change-size' => '$1',
 'rc-change-size-new' => '変更後は $1 {{PLURAL:$1|バイト}}',
 'newsectionsummary' => '/* $1 */ 新しい節',
 'rc-enhanced-expand' => '詳細を表示(JavaScript が必要)',
@@ -1780,7 +1797,7 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'recentchangeslinked-noresult' => '指定期間中に指定ページのリンク先に変更はありませんでした。',
 'recentchangeslinked-summary' => "これは指定したページからリンクされている(または指定したカテゴリに含まれている)ページの最近の変更の一覧です。
 [[Special:Watchlist|自分のウォッチリスト]]にあるページは'''太字'''で表示されます。",
-'recentchangeslinked-page' => 'ページ名',
+'recentchangeslinked-page' => 'ページ名:',
 'recentchangeslinked-to' => '指定したページの「リンク元」ページの変更を表示',
 
 # Upload
@@ -1790,19 +1807,19 @@ $1 {{PLURAL:$1|文字}}以下である必要があります。',
 'upload-tryagain' => '修正したファイル解説を投稿',
 'uploadnologin' => 'ログインしていません',
 'uploadnologintext' => 'ファイルをアップロードするには[[Special:UserLogin|ログイン]]する必要があります。',
-'upload_directory_missing' => 'アップロード先ディレクトリ($1)が見つからないため、ウェブサーバーによる作成ができませんでした。',
+'upload_directory_missing' => 'アップロード先ディレクトリ ($1) が見つかりませんでした。ウェブ サーバーによる作成もできませんでした。',
 'upload_directory_read_only' => 'アップロード先ディレクトリ($1)には、ウェブサーバーが書き込めません。',
 'uploaderror' => 'アップロードのエラー',
-'upload-recreate-warning' => "'''警告その名前のファイルは、以前に削除または移動されています。'''
+'upload-recreate-warning' => "'''警告その名前のファイルは、以前に削除または移動されています。'''
 
-参考のため、このページの削除と移動の記録を以下に示します",
-'uploadtext' => "ファイルをアップロードするには、以下のフォームを用してください。
-以å\89\8dã\81«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\95ã\82\8cã\81\9fã\83\95ã\82¡ã\82¤ã\83«ã\81®è¡¨ç¤ºã\81¨æ¤\9cç´¢ã\81«ã\81¯[[Special:FileList|{{int:listfiles}}]]ã\82\92使ç\94¨ã\81\97ã\80\81ï¼\88å\86\8dï¼\89アップロードは[[Special:Log/upload|アップロード記録]]に、削除は[[Special:Log/delete|削除記録]]にも記録されます。
+参考のため、このページの削除と移動の記録を以下に示します:",
+'uploadtext' => "ファイルをアップロードするには、以下のフォームを使用してください。
+以å\89\8dã\81«ã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81\95ã\82\8cã\81\9fã\83\95ã\82¡ã\82¤ã\83«ã\81®è¡¨ç¤ºã\81¨æ¤\9cç´¢ã\81«ã\81¯[[Special:FileList|{{int:listfiles}}]]ã\82\92使ç\94¨ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84ã\80\82\86\8dアップロードは[[Special:Log/upload|アップロード記録]]に、削除は[[Special:Log/delete|削除記録]]にも記録されます。
 
-ページにファイルを入れるには、以下の書式のリンクを使用してください
-* '''<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>'''とするとファイルを表示せずに直接ファイルへリンクします",
+ページにファイルを入れるには、以下の書式のリンクを使用してください:
+* '''<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。',
@@ -1932,7 +1949,7 @@ $1',
 'upload-file-error' => '内部エラー',
 'upload-file-error-text' => '内部エラーのため、サーバー上の一時ファイル作成に失敗しました。
 [[Special:ListUsers/sysop|管理者]]に連絡してください。',
-'upload-misc-error' => 'ä¸\8dæ\98\8eã\81ªã\82¢ã\83\83ã\83\97ã\83­ã\83¼ã\83\89ã\81®ã\82¨ã\83©ã\83¼',
+'upload-misc-error' => '不明なアップロードエラー',
 'upload-misc-error-text' => 'アップロード中に不明なエラーが発生しました。
 指定した URL が正しいこととアクセスできることを確認して、もう一度試してください。
 それでもこのエラーが発生する場合は、[[Special:ListUsers/sysop|管理者]]に連絡してください。',
@@ -1946,19 +1963,20 @@ $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-notsame' => '異なる内容のファイル「$1」が既に存在します。',
+'backend-fail-invalidpath' => '「$1」は有効なストレージパスではありません。',
+'backend-fail-delete' => 'ファイル「$1」を削除できませんでした。',
+'backend-fail-describe' => 'ファイル「$1」のメタデータを変更できませんでした。',
+'backend-fail-alreadyexists' => 'ファイル「$1」は既に存在します。',
+'backend-fail-store' => 'ファイル「$1」を「$2」に格納できませんでした。',
+'backend-fail-copy' => 'ファイル「$1」を「$2」に複製できませんでした。',
+'backend-fail-move' => 'ファイル「$1」を「$2」に移動できませんでした。',
 'backend-fail-opentemp' => '一時ファイルを開けませんでした。',
 'backend-fail-writetemp' => '一時ファイルに書き込めませんでした。',
 'backend-fail-closetemp' => '一時ファイルを閉じることができませんでした。',
-'backend-fail-read' => 'ファイル $1 を読み込めませんでした。',
-'backend-fail-create' => 'ファイル $1 に書き込めませんでした。',
-'backend-fail-maxsize' => 'サイズが {{PLURAL:$2|$2 バイト}}を超えているため、ファイル $1 に書き込めませんでした。',
+'backend-fail-read' => 'ファイル「$1」から読み取れませんでした。',
+'backend-fail-create' => 'ファイル「$1」に書き込めませんでした。',
+'backend-fail-maxsize' => 'サイズが {{PLURAL:$2|$2 バイト}}を超えているため、ファイル「$1」に書き込めませんでした。',
 'backend-fail-readonly' => "ストレージバックエンド「$1」は現在読み取り専用です。理由:「''$2''」",
 'backend-fail-synced' => 'ファイル「$1」は、ストレージバックエンド内部で不一致の状態にあります',
 'backend-fail-connect' => 'ストレージバックエンド「$1」に接続できませんでした。',
@@ -2102,7 +2120,7 @@ $1での[$2 ファイル解説ページ]にある説明を編集したほうが
 'shared-repo' => '共有リポジトリ',
 'shared-repo-name-wikimediacommons' => 'ウィキメディア・コモンズ',
 'filepage.css' => '/* ここに記述したCSSはファイル解説ページにて読み込まれます。また外部のクライアントウィキにも影響します */',
-'upload-disallowed-here' => '残念ながらこの画像には上書きできません。',
+'upload-disallowed-here' => 'あなたはこのファイルを上書きできません。',
 
 # File reversion
 'filerevert' => '$1を差し戻す',
@@ -2131,14 +2149,14 @@ $1での[$2 ファイル解説ページ]にある説明を編集したほうが
 ** 著作権侵害
 ** 重複ファイル',
 'filedelete-edit-reasonlist' => '削除理由を編集',
-'filedelete-maintenance' => 'ã\83¡ã\83³ã\83\86ã\83\8aã\83³ã\82¹ä¸­ã\81®ã\81\9fã\82\81ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\81®å\89\8aé\99¤ã\81¨å¾©å¸°は一時的に無効化されています。',
+'filedelete-maintenance' => 'ã\83¡ã\83³ã\83\86ã\83\8aã\83³ã\82¹ä¸­ã\81®ã\81\9fã\82\81ã\80\81ã\83\95ã\82¡ã\82¤ã\83«ã\81®å\89\8aé\99¤ã\81¨å¾©å\85\83は一時的に無効化されています。',
 'filedelete-maintenance-title' => 'ファイルを削除できません',
 
 # MIME search
 'mimesearch' => 'MIMEタイプ検索',
 'mimesearch-summary' => 'このページでは、ファイルをMIMEタイプで絞り込みます。
-contenttype/subtypeの形式で入力してください(例:<code>image/jpeg</code>)。',
-'mimetype' => 'MIMEタイプ',
+contenttype/subtypeの形式で入力してください (例: <code>image/jpeg</code>)。',
+'mimetype' => 'MIMEタイプ:',
 'download' => 'ダウンロード',
 
 # Unwatched pages
@@ -2189,9 +2207,9 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 [[MediaWiki:Disambiguationspage]] にリンクがあるテンプレートを使用しているページを、曖昧さ回避ページと見なします。",
 
 'doubleredirects' => '二重転送',
-'doubleredirectstext' => 'ã\81\93ã\82\8cã\81¯ä»\96ã\81®ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\83\9aã\83¼ã\82¸ã\81¸ã\81®ã\83ªã\83\80ã\82¤ã\83¬ã\82¯ã\83\88ã\81®ä¸\80覧ã\81§す。
-各行には、最初のリダイレクト、その転送先のリダイレクト、さらにその転送先、それぞれへのリンクが表示されています。多くの場合、最終の転送先が正しい転送先であり、最初のリダイレクトは直接最後の転送先に向けるべきです。
-<del>打ち消し線</del>が入った項目は既に解決しています。',
+'doubleredirectstext' => 'ã\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81§ã\81¯ã\80\81転é\80\81ã\83\9aã\83¼ã\82¸ã\81¸ã\81®è»¢é\80\81ã\83\9aã\83¼ã\82¸ã\82\92å\88\97æ\8c\99ã\81\97ã\81¾す。
+最初の転送ページ、その転送先にある転送ページ、さらにその転送先にあるページ、それぞれへのリンクを各行に表示しています。多くの場合は最終的な転送先が「正しい」転送先であり、最初の転送ページの転送先は最終的な転送先に直接向けるべきです。
+<del>取り消し線</del>が入った項目は解決済みです。',
 'double-redirect-fixed-move' => '[[$1]]を移動しました。
 今後は[[$2]]に転送されます。',
 'double-redirect-fixed-maintenance' => '[[$1]]から[[$2]]への二重転送を修正します。',
@@ -2251,7 +2269,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'deadendpagestext' => '以下のページは、{{SITENAME}}の他のページにリンクしていません。',
 'protectedpages' => '保護されているページ',
 'protectedpages-indef' => '無期限保護のみ',
-'protectedpages-cascade' => '連続保護のみ',
+'protectedpages-cascade' => 'カスケード保護のみ',
 'protectedpagestext' => '以下のページは移動や編集が禁止されています',
 'protectedpagesempty' => '指定した条件で保護中のページは現在ありません。',
 'protectedtitles' => '作成保護されているページ名',
@@ -2260,7 +2278,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'listusers' => '利用者一覧',
 'listusers-editsonly' => '投稿記録のある利用者のみを表示',
 'listusers-creationsort' => '作成日順に並べ替え',
-'usereditcount' => '$1 {{PLURAL:$1|回編集}}',
+'usereditcount' => '$1 {{PLURAL:$1|回編集}}',
 'usercreated' => '$1 $2 に{{GENDER:$3|作成}}',
 'newpages' => '新しいページ',
 'newpages-username' => '利用者名:',
@@ -2285,7 +2303,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'booksources-isbn' => 'ISBN:',
 'booksources-go' => '検索',
 'booksources-text' => 'お探しの書籍の新品/中古品を販売している外部サイトへのリンクを以下に列挙します。この書籍についてさらに詳しい情報があるかもしれません:',
-'booksources-invalid-isbn' => '指定したISBN番号は有効ではないようです。情報源から写し間違えていないか確認してください。',
+'booksources-invalid-isbn' => '指定した ISBN は有効ではないようです。情報源から写し間違えていないか確認してください。',
 
 # Special:Log
 'specialloguserlabel' => '実行者:',
@@ -2296,15 +2314,15 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 記録の種類、実行した利用者(大文字小文字は区別)、影響を受けたページ(大文字小文字は区別)による絞り込みができます。',
 'logempty' => '該当する記録はありません。',
 'log-title-wildcard' => 'この文字列で始まるページ名を検索',
-'showhideselectedlogentries' => '選択した記録項目を表示/非表示',
+'showhideselectedlogentries' => '選択した記録項目を表示/非表示',
 
 # Special:AllPages
 'allpages' => '全ページ',
 'alphaindexline' => '$1から$2まで',
 'nextpage' => '次のページ ($1)',
 'prevpage' => '前のページ ($1)',
-'allpagesfrom' => '最初に表示するページ',
-'allpagesto' => '最後に表示するページ',
+'allpagesfrom' => '最初に表示するページ:',
+'allpagesto' => '最後に表示するページ:',
 'allarticles' => '全ページ',
 'allinnamespace' => '全ページ ($1名前空間)',
 'allnotinnamespace' => '全ページ ($1名前空間以外)',
@@ -2338,26 +2356,26 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 
 # Special:LinkSearch
 'linksearch' => '外部リンクの検索',
-'linksearch-pat' => '検索パターン',
+'linksearch-pat' => '検索パターン:',
 'linksearch-ns' => '名前空間:',
 'linksearch-ok' => '検索',
-'linksearch-text' => '"*.wikipedia.org" のようにワイルドカードを使用できます。
-少なくとも "*.org" のようなトップレベルドメインが必要です。<br />
-対å¿\9cã\83\97ã\83­ã\83\88ã\82³ã\83«: <code>$1</code> (ã\81\93ã\82\8cã\82\89ã\82\92æ¤\9cç´¢ã\81«å\90«ã\82\81ã\81ªã\81\84ã\81§ã\81\8fã\81 ã\81\95ã\81\84)。',
+'linksearch-text' => '「*.wikipedia.org」のようにワイルドカードを使用できます。
+少なくとも「*.org」のようなトップレベルドメインが必要です。<br />
+対å¿\9cã\83\97ã\83­ã\83\88ã\82³ã\83«: <code>$1</code> (ã\83\97ã\83­ã\83\88ã\82³ã\83«ã\82\92ç\9c\81ç\95¥ã\81\97ã\81\9få ´å\90\88ã\81®æ\97¢å®\9aå\80¤ã\81¯ http:// )。',
 'linksearch-line' => '$1 が $2 からリンクされています',
 'linksearch-error' => 'ワイルドカードはホスト名の先頭でのみ使用できます。',
 
 # Special:ListUsers
-'listusersfrom' => '最初に表示する利用者',
+'listusersfrom' => '最初に表示する利用者:',
 'listusers-submit' => '表示',
 'listusers-noresult' => '利用者が見つかりませんでした。',
-'listusers-blocked' => '(ブロック中)',
+'listusers-blocked' => '(ブロック中)',
 
 # Special:ActiveUsers
 'activeusers' => '活動中の利用者一覧',
 'activeusers-intro' => 'これは過去 $1 {{PLURAL:$1|日|日間}}に何らかの活動をした利用者の一覧です。',
 'activeusers-count' => '過去 {{PLURAL:$3|1 日|$3 日間}}に $1 {{PLURAL:$1|回の編集}}',
-'activeusers-from' => '最初に表示する利用者',
+'activeusers-from' => '最初に表示する利用者:',
 'activeusers-hidebots' => 'ボットを隠す',
 'activeusers-hidesysops' => '管理者を隠す',
 'activeusers-noresult' => '利用者が見つかりませんでした。',
@@ -2394,7 +2412,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'emailuser-title-target' => 'この{{GENDER:$1|利用者}}にメールを送信',
 'emailuser-title-notarget' => '利用者にメールを送信',
 'emailpage' => '利用者にメールを送信',
-'emailpagetext' => '以下のフォームを使用してこの利用者にメールを送信できます。
+'emailpagetext' => '以下のフォームを使用してこの{{GENDER:$1|利用者}}にメールを送信できます。
 「差出人」として、[[Special:Preferences|利用者の個人設定]]で入力したメールアドレスが設定されます。これにより、受信者があなたに直接返信できるようになります。',
 'usermailererror' => 'メールが以下のエラーを返しました:',
 'defemailsubject' => '{{SITENAME}} 利用者「$1」からのメール',
@@ -2406,16 +2424,16 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'nowikiemailtext' => 'この利用者は他の利用者からメールを受け取らない設定にしています。',
 'emailnotarget' => '受信者の利用者名が存在しない、あるいは無効です。',
 'emailtarget' => '受信者の利用者名を入力してください',
-'emailusername' => '利用者名',
+'emailusername' => '利用者名:',
 'emailusernamesubmit' => '送信',
 'email-legend' => '{{SITENAME}} の他の利用者にメールを送信',
-'emailfrom' => '差出人',
-'emailto' => '宛先',
-'emailsubject' => '件名',
-'emailmessage' => '本文',
+'emailfrom' => '差出人:',
+'emailto' => '宛先:',
+'emailsubject' => '件名:',
+'emailmessage' => '本文:',
 'emailsend' => '送信',
 'emailccme' => '自分宛に控えを送信する。',
-'emailccsubject' => '$1に送信したメールの控え:$2',
+'emailccsubject' => '$1 に送信したメールの控え: $2',
 'emailsent' => 'メールを送信しました',
 'emailsenttext' => 'メールを送信しました。',
 'emailuserfooter' => 'このメールは$1から$2へ、{{SITENAME}}の「利用者にメールを送信」機能で送信されました。',
@@ -2434,7 +2452,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'watchnologintext' => 'ウォッチリストを変更するためには、[[Special:UserLogin|ログイン]]している必要があります。',
 'addwatch' => 'ウォッチリストに追加',
 'addedwatchtext' => "ページ「[[:$1]]」を[[Special:Watchlist|ウォッチリスト]]に追加しました。
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¨ä»\98å±\9eã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81«å¤\89æ\9b´ã\81\8cã\81\82ã\81£ã\81\9fé\9a\9bã\81«ã\81¯ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¾ã\81\99ã\80\82ã\81¾ã\81\9fã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«ç\99»é\8c²ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bã\83\9aã\83¼ã\82¸ã\81¯[[Special:RecentChanges|æ\9c\80è¿\91ã\81®æ\9b´æ\96°ã\81®ä¸\80覧]]ã\81«'''太å­\97'''ã\81§è¡¨ç¤ºã\81\95ã\82\8cã\80\81è¦\8bã\81¤ã\81\91ã\82\84ã\81\99ã\81\8fã\81ªã\82\8aます。",
\81\93ã\81®ã\83\9aã\83¼ã\82¸ã\81¾ã\81\9fã\81¯ã\81\9dã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81\8cå¤\89æ\9b´ã\81\95ã\82\8cã\82\8bã\81¨ã\80\81ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\81«è¡¨ç¤ºã\81\95ã\82\8cã\81¾ã\81\99ã\80\82ã\81¾ã\81\9fã\80\81[[Special:RecentChanges|æ\9c\80è¿\91ã\81®æ\9b´æ\96°ã\81®ä¸\80覧]]ã\81§ã\81¯'''太å­\97'''ã\81§è¡¨ç¤ºã\81\95ã\82\8cます。",
 'removewatch' => 'ウォッチリストから除去',
 'removedwatchtext' => 'ページ「[[:$1]]」を[[Special:Watchlist|ウォッチリスト]]から除去しました。',
 'watch' => 'ウォッチ',
@@ -2462,12 +2480,16 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 
 'enotif_mailer' => '{{SITENAME}} 通知メール',
 'enotif_reset' => 'すべてのページを訪問済みにする',
-'enotif_newpagetext' => 'これは新しいページです。',
 'enotif_impersonal_salutation' => '{{SITENAME}} 利用者',
-'changed' => '変更',
-'created' => '作成',
-'enotif_subject' => '{{SITENAME}}のページ「$PAGETITLE」が$PAGEEDITORによって$CHANGEDORCREATEDされました',
-'enotif_lastvisited' => '最後に閲覧して以降のすべての変更は $1 をご覧ください。',
+'enotif_subject_deleted' => '{{SITENAME}} ページ $1 を {{gender:$2|$2}} が削除しました',
+'enotif_subject_created' => '{{SITENAME}} ページ $1 を {{gender:$2|$2}} が作成しました',
+'enotif_subject_moved' => '{{SITENAME}} ページ $1 を {{gender:$2|$2}} が移動しました',
+'enotif_subject_restored' => '{{SITENAME}} ページ $1 を {{gender:$2|$2}} が復元しました',
+'enotif_subject_changed' => '{{SITENAME}} ページ $1 を {{gender:$2|$2}} が変更しました',
+'enotif_body_intro_deleted' => '{{SITENAME}} のページ「$1」が$PAGEEDITDATEに、{{gender:$2 |$2}}によって削除されました。現在の版は$3で閲覧できます。',
+'enotif_body_intro_created' => '{{SITENAME}} のページ「$1」が$PAGEEDITDATEに、{{gender:$2 |$2}}によって作成されました。現在の版は$3で閲覧できます。',
+'enotif_body_intro_changed' => '{{SITENAME}} のページ「$1」が$PAGEEDITDATEに、{{gender:$2 |$2}}によって変更されました。現在の版は$3で閲覧できます。',
+'enotif_lastvisited' => '最終訪問以降のすべての変更は $1 をご覧ください。',
 'enotif_lastdiff' => 'この変更内容を表示するには $1 をご覧ください。',
 'enotif_anon_editor' => '匿名利用者「$1」',
 'enotif_body' => '$WATCHINGUSERNAMEさん
@@ -2515,9 +2537,9 @@ $UNWATCHURL
 'actioncomplete' => '操作を完了しました',
 'actionfailed' => '操作に失敗しました',
 'deletedtext' => '「$1」は削除されました。
-最近の削除に関しては、$2を参照してください。',
+最近の削除については、$2を参照してください。',
 'dellogpage' => '削除記録',
-'dellogpagetext' => '以下は、最近の削除と復帰の一覧です。',
+'dellogpagetext' => '以下は最近の削除と復元の一覧です。',
 'deletionlog' => '削除記録',
 'reverted' => '以前の版への差し戻し',
 'deletecomment' => '理由:',
@@ -2591,7 +2613,7 @@ $2による直前の版へ変更されました。',
 'protect-fallback' => '「$1」権限が必要',
 'protect-level-autoconfirmed' => '新規利用者と匿名利用者を禁止',
 'protect-level-sysop' => '管理者のみ',
-'protect-summary-cascade' => '連続',
+'protect-summary-cascade' => 'カスケード',
 'protect-expiring' => '$1(UTC)で自動的に解除',
 'protect-expiring-local' => '期限 $1',
 'protect-expiry-indefinite' => '無期限',
@@ -2613,7 +2635,7 @@ $2による直前の版へ変更されました。',
 'restriction-level' => '制限レベル:',
 'minimum-size' => '最小サイズ',
 'maximum-size' => '最大サイズ:',
-'pagesize' => '(バイト)',
+'pagesize' => '(バイト)',
 
 # Restrictions (nouns)
 'restriction-edit' => '編集',
@@ -2629,53 +2651,53 @@ $2による直前の版へ変更されました。',
 # Undelete
 'undelete' => '削除されたページを表示',
 'undeletepage' => '削除されたページの表示と復元',
-'undeletepagetitle' => "'''以下は[[:$1|$1]]の削除された版です'''。",
+'undeletepagetitle' => "'''以下は[[:$1|$1]]の削除された版です'''。",
 'viewdeletedpage' => '削除されたページを表示',
 'undeletepagetext' => '以下の{{PLURAL:$1|削除されたページ|&#32;$1 件の削除されたページ}}は、保存版に残っているため復元できます。
 保存版は定期的に消去される可能性があります。',
 'undelete-fieldset-title' => '削除された版の復元',
 'undeleteextrahelp' => "すべての版を復元する場合は、どのボックスにもチェックを入れていない状態で'''''{{int:undeletebtn}}'''''をクリックしてください。
\89¹å®\9aã\81®ç\89\88ã\82\92復帰ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81復帰する版のボックスにチェックを入れた状態で'''''{{int:undeletebtn}}'''''をクリックしてください。",
\89¹å®\9aã\81®ç\89\88ã\82\92復å\85\83ã\81\99ã\82\8bå ´å\90\88ã\81¯ã\80\81復å\85\83する版のボックスにチェックを入れた状態で'''''{{int:undeletebtn}}'''''をクリックしてください。",
 'undeleterevisions' => '保存版に$1{{PLURAL:$1|版}}あります',
-'undeletehistory' => 'ã\83\9aã\83¼ã\82¸ã\81®å¾©å¸°ã\82\92è¡\8cã\81\86ã\81¨ã\80\81ã\81\99ã\81¹ã\81¦ã\81®ç\89\88ã\81\8c履歴ã\81«å¾©å¸°ã\81\97ます。
-削除されたあとに同じ名前で新しくページが作成されていた場合、復帰した版はそれに先行する履歴として現れます。',
-'undeleterevdel' => '復帰した結果、版指定削除されているページまたはファイルの版が最新となる場合、復帰は実行されません。
-このような場合、版指定削除されていない版が最新となるようにチェックするか、その版の版指定削除を解除する必要があります。',
+'undeletehistory' => 'ã\83\9aã\83¼ã\82¸ã\82\92復å\85\83ã\81\99ã\82\8bã\81¨ã\80\81ã\81\99ã\81¹ã\81¦ã\81®ç\89\88ã\81\8c履歴ã\81«å¾©å\85\83ã\81\95ã\82\8cます。
+削除後に同じ名前で新しいページが作成されている場合、復元された版はそれに先行する履歴として表示されます。',
+'undeleterevdel' => '版指定削除されている版がページまたはファイルの最新版となるような復元はできません。
+この場合、版指定削除されている最新版のチェックを外すか、その版指定削除を解除する必要があります。',
 'undeletehistorynoadmin' => 'このページは削除されています。
 削除の理由は、削除前にこのページを編集していた利用者の詳細情報と共に、以下に表示されています。
 管理者以外の利用者には、削除された各版の本文への制限がかけられています。',
 'undelete-revision' => '削除されたページ「$1」の $4 $5 時点での $3 による版:',
-'undeleterevision-missing' => '正しくないまたは存在しない版です。
\96\93é\81\95ã\81£ã\81\9fã\83ªã\83³ã\82¯ã\82\92ã\81\9fã\81©ã\81£ã\81\9fã\81\8bã\80\81ã\81\93ã\81®ç\89\88ã\81¯æ\97¢ã\81«å¾©å¸°されたか、もしくは保存版から除去された可能性があります。',
+'undeleterevision-missing' => '無効または存在しない版です。
\96\93é\81\95ã\81£ã\81\9fã\83ªã\83³ã\82¯ã\82\92ã\81\9fã\81©ã\81£ã\81\9fã\81\8bã\80\81ã\81\93ã\81®ç\89\88ã\81¯æ\97¢ã\81«å¾©å\85\83されたか、もしくは保存版から除去された可能性があります。',
 'undelete-nodiff' => 'これより前の版はありません。',
 'undeletebtn' => '復元',
 'undeletelink' => '閲覧/復元',
 'undeleteviewlink' => '閲覧',
 'undeletereset' => 'リセット',
 'undeleteinvert' => '選択を反転',
-'undeletecomment' => '理由',
+'undeletecomment' => '理由:',
 'undeletedrevisions' => '{{PLURAL:$1|$1版}}を復元しました',
 'undeletedrevisions-files' => '{{PLURAL:$1|$1版}}と{{PLURAL:$2|$2ファイル}}を復元しました',
-'undeletedfiles' => '{{PLURAL:$1|$1ã\83\95ã\82¡ã\82¤ã\83«}}ã\82\92復帰しました',
-'cannotundelete' => '復帰ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9fã\80\82
-他の誰かがこのページを既に復帰した可能性があります。',
+'undeletedfiles' => '{{PLURAL:$1|$1ã\83\95ã\82¡ã\82¤ã\83«}}ã\82\92復å\85\83しました',
+'cannotundelete' => '復å\85\83ã\81«å¤±æ\95\97ã\81\97ã\81¾ã\81\97ã\81\9f:
+$1',
 'undeletedpage' => "'''$1を復元しました。'''
 
\9c\80è¿\91ã\81®å\89\8aé\99¤ã\81¨å¾©å¸°の記録については[[Special:Log/delete|削除記録]]を参照してください。",
\9c\80è¿\91ã\81®å\89\8aé\99¤ã\81¨å¾©å\85\83の記録については[[Special:Log/delete|削除記録]]を参照してください。",
 'undelete-header' => '最近削除されたページは[[Special:Log/delete|削除記録]]で確認できます。',
 'undelete-search-title' => '削除されたページの検索',
 'undelete-search-box' => '削除されたページを検索',
-'undelete-search-prefix' => '表示を開始するページ名',
+'undelete-search-prefix' => '表示を開始するページ名:',
 'undelete-search-submit' => '検索',
 'undelete-no-results' => '削除の保存版に、一致するページが見つかりませんでした。',
-'undelete-filename-mismatch' => 'ファイルの時刻印$1の版を復帰できません:ファイル名が一致しません。',
-'undelete-bad-store-key' => 'ファイルの時刻印$1の版を復帰できません:削除前にファイルが失われています。',
+'undelete-filename-mismatch' => 'ファイルの $1 時点の版を復元できません: ファイル名が一致しません。',
+'undelete-bad-store-key' => 'ファイルの $1 時点の版を復元できません: 削除前にファイルが失われています。',
 'undelete-cleanup-error' => '未使用の保存版のファイル「$1」の削除中にエラーが発生しました。',
-'undelete-missing-filearchive' => 'データベースに存在しないため、ID $1を持つファイルの保存版を復元できません。
\97¢ã\81«å¾©å¸°されている可能性があります。',
-'undelete-error' => 'ã\83\9aã\83¼ã\82¸ã\81®å¾©å¸°エラー',
-'undelete-error-short' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®å¾©å¸°ã\82¨ã\83©ã\83¼ï¼\9a$1',
-'undelete-error-long' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®å¾©å¸°ä¸­ã\81«ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9fï¼\9a
+'undelete-missing-filearchive' => 'データベースに存在しないため、ファイルの保存版 ID $1 を復元できません。
\97¢ã\81«å¾©å\85\83されている可能性があります。',
+'undelete-error' => 'ã\83\9aã\83¼ã\82¸ã\81®å¾©å\85\83エラー',
+'undelete-error-short' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®å¾©å\85\83ã\82¨ã\83©ã\83¼: $1',
+'undelete-error-long' => 'ã\83\95ã\82¡ã\82¤ã\83«ã\81®å¾©å\85\83中ã\81«ã\82¨ã\83©ã\83¼ã\81\8cç\99ºç\94\9fã\81\97ã\81¾ã\81\97ã\81\9f:
 
 $1',
 'undelete-show-file-confirm' => '$2$3の版からファイル「<nowiki>$1</nowiki>」の削除版を本当に表示しますか?',
@@ -2684,26 +2706,26 @@ $1',
 # Namespace form on various pages
 'namespace' => '名前空間:',
 'invert' => '選択したものを除く',
-'tooltip-invert' => '選択した名前空間(チェックされている場合は、関連付けられた名前空間も)のページの変更を非表示にするには、このボックスにチェックを入れる',
-'namespace_association' => '対応付けられた名前空間',
-'tooltip-namespace_association' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81¦ã\81\84ã\82\8bã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81¾ã\81\9fã\81¯å¯¾è±¡の名前空間も含めるには、このボックスにチェックを入れる',
+'tooltip-invert' => '選択した名前空間 (チェックを入れている場合は、関連付けられた名前空間も含む) のページの変更を非表示にするには、このボックスにチェックを入れる',
+'namespace_association' => '関連付けられた名前空間も含める',
+'tooltip-namespace_association' => 'é\81¸æ\8a\9eã\81\97ã\81\9få\90\8då\89\8d空é\96\93ã\81«é\96¢é\80£ä»\98ã\81\91ã\82\89ã\82\8cã\81\9fã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ (é\80\86ã\81«ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\81®å\90\8då\89\8d空é\96\93ã\82\92é\81¸æ\8a\9eã\81\97ã\81\9få ´å\90\88ã\82\82å\90\8cæ§\98の名前空間も含めるには、このボックスにチェックを入れる',
 'blanknamespace' => '(標準)',
 
 # Contributions
 'contributions' => '利用者の投稿記録',
 'contributions-title' => '$1の投稿記録',
-'mycontris' => '自分の投稿記録',
+'mycontris' => '投稿記録',
 'contribsub2' => '利用者: $1 ($2)',
 'nocontribs' => 'これらの条件に一致する変更は見つかりませんでした。',
 'uctop' => '(最新)',
-'month' => 'これ以前の月',
-'year' => 'これ以前の年',
+'month' => 'これ以前の月:',
+'year' => 'これ以前の年:',
 
-'sp-contributions-newbies' => '新しい利用者からの投稿のみ表示',
+'sp-contributions-newbies' => '新規利用者の投稿のみ表示',
 'sp-contributions-newbies-sub' => '新規利用者のみ',
 'sp-contributions-newbies-title' => '新規利用者の投稿記録',
 'sp-contributions-blocklog' => 'ブロック記録',
-'sp-contributions-deleted' => 'å\88©ç\94¨è\80\85ã\81®å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fæ\8a\95稿è¨\98é\8c²',
+'sp-contributions-deleted' => 'å\89\8aé\99¤ã\81\95ã\82\8cã\81\9fæ\8a\95稿ã\81®ä¸\80覧',
 'sp-contributions-uploads' => 'アップロード',
 'sp-contributions-logs' => '記録',
 'sp-contributions-talk' => 'トーク',
@@ -2713,7 +2735,7 @@ $1',
 'sp-contributions-blocked-notice-anon' => 'このIPアドレスは現在ブロックされています。
 参考のために最近のブロック記録項目を以下に表示します:',
 'sp-contributions-search' => '投稿の検索',
-'sp-contributions-username' => 'IPアドレスまたは利用者名',
+'sp-contributions-username' => 'IPアドレスまたは利用者名:',
 'sp-contributions-toponly' => '最新版の編集のみを表示',
 'sp-contributions-submit' => '検索',
 
@@ -2733,7 +2755,7 @@ $1',
 'whatlinkshere-hideredirs' => '転送ページを$1',
 'whatlinkshere-hidetrans' => '参照読み込みを$1',
 'whatlinkshere-hidelinks' => 'リンクを$1',
-'whatlinkshere-hideimages' => '画像リンクを$1',
+'whatlinkshere-hideimages' => 'ファイルへのリンクを$1',
 'whatlinkshere-filters' => '絞り込み',
 
 # Block/unblock
@@ -2743,10 +2765,10 @@ $1',
 'blockip' => '利用者をブロック',
 'blockip-title' => '利用者のブロック',
 'blockip-legend' => '利用者をブロック',
-'blockiptext' => '以下のフォームを使用して、指定した利用者やIPアドレスからの書き込みアクセスをブロックできます。
-このような措置は、荒らしからの防御のためにのみ行われるべきで、また[[{{MediaWiki:Policy-url}}|方針]]に沿ったものであるべきです。
-以下にブロックの理由を具体的に書いてください(例えば、荒らされたページへの言及など)。',
-'ipadressorusername' => 'IPアドレスまたは利用者名',
+'blockiptext' => '以下のフォームを使用して、指定したIPアドレスまたは利用者からの書き込みアクセスをブロックできます。
+このような措置は、荒らしからの防御の目的のみに行われるべきで、また[[{{MediaWiki:Policy-url}}|方針]]に沿ったものであるべきです。
+以下にブロックの理由を具体的に書いてください (例えば、荒らされたページへの言及など)。',
+'ipadressorusername' => 'IPアドレスまたは利用者名:',
 'ipbexpiry' => '有効期限:',
 'ipbreason' => '理由:',
 'ipbreasonotherlist' => 'その他の理由',
@@ -2758,18 +2780,18 @@ $1',
 ** 威圧的な態度/嫌がらせ
 ** 複数アカウントの不正利用
 ** 不適切な利用者名',
-'ipb-hardblock' => 'ã\83­ã\82°ã\82¤ã\83³å\88©ç\94¨è\80\85ã\81«ã\82\88ã\82\8bã\81\93ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81\8bã\82\89ã\81®ç·¨é\9b\86ã\82\92ä¸\8d許å\8f¯',
+'ipb-hardblock' => 'ã\81\93ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81\8bã\82\89ã\81®ã\83­ã\82°ã\82¤ã\83³å\88©ç\94¨è\80\85ã\81®ç·¨é\9b\86ã\82\92ç¦\81æ­¢',
 'ipbcreateaccount' => 'アカウント作成を禁止',
-'ipbemailban' => 'メール送信を止',
-'ipbenableautoblock' => 'この利用者が最後に使用したIPアドレスと、後に編集しようとしたIPアドレスを自動的にブロック',
+'ipbemailban' => 'メール送信を止',
+'ipbenableautoblock' => 'この利用者が最後に使用したIPアドレスと、ブロック後に編集を試みた際のIPアドレスを自動的にブロック',
 'ipbsubmit' => 'この利用者をブロック',
 'ipbother' => 'その他の期間:',
 'ipboptions' => '2時間:2 hours,1日:1 day,3日:3 days,1週間:1 week,2週間:2 weeks,1か月:1 month,3か月:3 months,6か月:6 months,1年:1 year,無期限:infinite',
 'ipbotheroption' => 'その他',
 'ipbotherreason' => '他の、または追加の理由:',
 'ipbhidename' => '利用者名を編集履歴や各種一覧から秘匿する',
-'ipbwatchuser' => 'この利用者の利用者ページとトークページをウォッチする',
-'ipb-disableusertalk' => 'ã\81\93ã\81®å\88©ç\94¨è\80\85ã\81\8cã\83\96ã\83­ã\83\83ã\82¯ã\81\95ã\82\8cã\81¦ã\81\84ã\82\8bé\96\93ã\81«è\87ªå\88\86ã\81®ã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ã\82\92ç·¨é\9b\86ã\81\99ã\82\8bã\81®ã\82\92ä¸\8d許å\8f¯',
+'ipbwatchuser' => 'この利用者の利用者ページとトークページをウォッチ',
+'ipb-disableusertalk' => 'ã\83\96ã\83­ã\83\83ã\82¯ä¸­ã\81®ã\81\93ã\81®å\88©ç\94¨è\80\85è\87ªèº«ã\81«ã\82\88ã\82\8bã\83\88ã\83¼ã\82¯ã\83\9aã\83¼ã\82¸ç·¨é\9b\86ã\82\92ç¦\81æ­¢',
 'ipb-change-block' => 'これらの設定で、利用者を再びブロック',
 'ipb-confirm' => 'ブロックの確認',
 'badipaddress' => '無効なIPアドレス',
@@ -2784,10 +2806,10 @@ $1',
 'ipb-blocklist' => '現在有効なブロックを表示',
 'ipb-blocklist-contribs' => '$1の投稿の一覧',
 'unblockip' => 'ブロックを解除',
-'unblockiptext' => '以下のフォームで利用者またはIPアドレスの投稿ブロックを解除できます。',
-'ipusubmit' => 'この投稿ブロックを解除',
+'unblockiptext' => '以下のフォームで利用者またはIPアドレスのブロックを解除できます。',
+'ipusubmit' => 'このブロックを解除',
 'unblocked' => '[[User:$1|$1]]のブロックを解除しました',
-'unblocked-range' => '$1ã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\81¯è§£é\99¤ã\81\95ã\82\8cã\81¦ã\81\84ã\81¾ã\81\99',
+'unblocked-range' => '$1ã\81®ã\83\96ã\83­ã\83\83ã\82¯ã\82\92解é\99¤ã\81\97ã\81¾ã\81\97ã\81\9f',
 'unblocked-id' => 'ブロック$1は除去されました',
 'blocklist' => 'ブロックされている利用者',
 'ipblocklist' => 'ブロックされている利用者',
@@ -2809,8 +2831,8 @@ $1',
 'expiringblock' => '$1$2に解除',
 'anononlyblock' => '匿名利用者のみ',
 'noautoblockblock' => '自動ブロック無効',
-'createaccountblock' => 'アカウント作成のブロック',
-'emailblock' => 'メール送信のブロック',
+'createaccountblock' => 'アカウント作成の禁止',
+'emailblock' => 'メール送信の禁止',
 'blocklist-nousertalk' => '自分のトークページの編集禁止',
 'ipblocklist-empty' => 'ブロック一覧は空です。',
 'ipblocklist-no-results' => '指定されたIPアドレスまたは利用者名はブロックされていません。',
@@ -2819,8 +2841,8 @@ $1',
 'change-blocklink' => '設定を変更',
 'contribslink' => '投稿記録',
 'emaillink' => 'メールを送信',
-'autoblocker' => "ã\81\94使ç\94¨ä¸­ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81\8cã\80\8c[[User:$1|$1]]ã\80\8dã\81«ä½¿ç\94¨ã\81\95ã\82\8cたため、自動ブロックされています。
-$1のブロックの理由は「''$2''」です。",
+'autoblocker' => "ã\81\93ã\81® IP ã\82¢ã\83\89ã\83¬ã\82¹ã\82\92ã\80\8c[[User:$1|$1]]ã\80\8dã\81\8cæ\9c\80è¿\91使ç\94¨ã\81\97たため、自動ブロックされています。
+$1 のブロックの理由は「''$2''」です。",
 'blocklogpage' => 'ブロック記録',
 'blocklog-showlog' => 'この利用者は以前にブロックされたことがあります。
 参考のため、ブロックの記録を以下に示します:',
@@ -2855,16 +2877,16 @@ $1のブロックの理由は「''$2''」です。",
 'blockme' => '自分をブロック',
 'proxyblocker' => 'プロキシブロック係',
 'proxyblocker-disabled' => 'この機能は無効になっています。',
-'proxyblockreason' => 'ã\81\94使ç\94¨ä¸­ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81¯å\85¬é\96\8bã\83\97ã\83­ã\82­ã\82·ã\81§ã\81\82ã\82\8bã\81\9fã\82\81æ\8a\95稿ブロックされています。
-使用中のインターネットサービスプロバイダー、または所属組織の技術担当者に連絡して、これが深刻なセキュリティ問題であることを伝えてください。',
+'proxyblockreason' => 'ã\81\93ã\81®IPã\82¢ã\83\89ã\83¬ã\82¹ã\81¯å\85¬é\96\8bã\83\97ã\83­ã\82­ã\82·ã\81§ã\81\82ã\82\8bã\81\9fã\82\81ブロックされています。
+ご使用中のインターネットサービスプロバイダーまたは所属組織の技術担当者に連絡して、これが深刻なセキュリティ問題であることを伝えてください。',
 'proxyblocksuccess' => '完了。',
 'sorbs' => 'DNSBL',
 'sorbsreason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。',
 'sorbs_create_account_reason' => 'ご使用中のIPアドレスが、{{SITENAME}}の使用しているDNSBLに公開プロキシとして記載されています。
 アカウント作成はできません',
 'cant-block-while-blocked' => 'ブロックされている間は、他の利用者をブロックできません。',
-'cant-see-hidden-user' => '投稿ブロックしようとした利用者は、既にブロックされ隠されています。
-hideuser権限を持っていないため、この利用者のブロックを閲覧または編集できません。',
+'cant-see-hidden-user' => 'ブロックしようとしている利用者は、既にブロックされ隠されています。
+あなたには hideuser 権限がないため、この利用者のブロックの閲覧/編集はできません。',
 'ipbblocked' => '自分自身をブロックしているため、他の利用者のブロックやブロック解除はできません',
 'ipbnounblockself' => '自分自身のブロックは解除できません',
 
@@ -2905,7 +2927,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 よく閲覧されるページや、他の多くのページからリンクされているページを移動すると予期しない結果が起こるかもしれません。ページの移動に伴う影響をよく考えてから踏み切るようにしてください。",
 'movepagetext-noredirectfixer' => "下のフォームを使用すると、ページ名を変更でき、そのページの履歴も変更先に移動できます。
 移動元のページは移動先への転送ページになります。
-自動的な修正を選択しない場合は、[[Special:DoubleRedirects|二重転送]]や[[Special:BrokenRedirects|迷子の転送ページ]]を確認する必要があります。
+自動的な修正を選択しない場合は、[[Special:DoubleRedirects|二重転送]]や[[Special:BrokenRedirects|迷子のリダイレクト]]を確認する必要があります。
 つながるべき場所にリンクがつながるよう維持するのは移動した人の責任です。
 
 移動先が既に存在する場合は、そのページが空または転送ページで、かつ過去の版を持たない場合を除いて移動'''できません'''。
@@ -2933,7 +2955,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'pagemovedsub' => '移動に成功しました',
 'movepage-moved' => "'''「$1」は「$2」へ移動されました'''",
 'movepage-moved-redirect' => '転送ページを作成しました。',
-'movepage-moved-noredirect' => '転é\80\81ã\83\9aã\83¼ã\82¸ã\82\92ä½\9cæ\88\90ã\81§ã\81\8dませんでした。',
+'movepage-moved-noredirect' => '転é\80\81ã\83\9aã\83¼ã\82¸ã\81¯ä½\9cæ\88\90ã\81\95ã\82\8cませんでした。',
 'articleexists' => '指定された移動先には既にページが存在するか、名前が不適切です。
 別の名前を選択してください。',
 'cantmove-titleprotected' => '新しいページ名が作成保護されているため、この場所にページを移動できません',
@@ -2967,6 +2989,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'immobile-target-namespace-iw' => 'ウィキ間リンクは、ページの移動先には指定できません。',
 'immobile-source-page' => 'このページは移動できません。',
 'immobile-target-page' => '移動先ページ名に移動させることができません。',
+'bad-target-model' => '指定した移動先では、異なるコンテンツ モデルを使用しています。$1から$2には変換できません。',
 'imagenocrossnamespace' => 'ファイルを、ファイル名前空間以外に移動させることはできません',
 'nonfile-cannot-move-to-file' => 'ファイルではないものを、ファイル名前空間に移動させることはできません',
 'imagetypemismatch' => '新しいファイルの拡張子がファイルのタイプと一致していません',
@@ -3010,7 +3033,7 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 'allmessagesdefault' => '既定のメッセージ文',
 'allmessagescurrent' => '現在のメッセージ文',
 'allmessagestext' => 'これは MediaWiki 名前空間で利用できるシステム メッセージの一覧です。
-MediaWiki 全般のローカライズ(地域化)に貢献したい場合は、[//www.mediawiki.org/wiki/Localisation/ja MediaWiki のローカライズ] や [//translatewiki.net?setlang=ja translatewiki.net] をご覧ください。',
+MediaWiki 全般のローカライズ (地域化) に貢献したい場合は、[//www.mediawiki.org/wiki/Localisation/ja MediaWiki のローカライズ]や [//translatewiki.net?setlang=ja translatewiki.net] をご覧ください。',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages'''が無効のため、このページを使用できません。",
 'allmessages-filter-legend' => '絞り込み',
 'allmessages-filter' => '変更状態により絞り込む:',
@@ -3097,7 +3120,6 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript をテスト中',
-'javascripttest-disabled' => 'この機能はこのウィキでは有効にされていません。',
 'javascripttest-title' => '$1 のテストの実行',
 'javascripttest-pagetext-noframework' => 'このページは JavaScript のテストを実行するために予約されています。',
 'javascripttest-pagetext-unknownframework' => '未知のテストフレームワーク「$1」。',
@@ -3238,6 +3260,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 
 # Info page
 'pageinfo-title' => '「$1」の情報',
+'pageinfo-not-current' => '申し訳ありませんが、過去の版の情報は表示できません。',
 'pageinfo-header-basic' => '基本情報',
 'pageinfo-header-edits' => '編集履歴',
 'pageinfo-header-restrictions' => 'ページの保護',
@@ -3246,15 +3269,17 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'pageinfo-default-sort' => '既定のソートキー',
 'pageinfo-length' => 'ページの長さ (バイト単位)',
 'pageinfo-article-id' => 'ページ ID',
+'pageinfo-language' => 'ページ本文の言語',
 'pageinfo-robot-policy' => '検索エンジンの状態',
-'pageinfo-robot-index' => 'インデックス可能',
-'pageinfo-robot-noindex' => 'インデックス不可',
+'pageinfo-robot-index' => '検索エンジンに収集される',
+'pageinfo-robot-noindex' => '検索エンジンに収集されない',
 'pageinfo-views' => '閲覧回数',
 'pageinfo-watchers' => 'ページをウォッチリストに入れている人数',
-'pageinfo-redirects-name' => 'このページへのリダイレクト',
+'pageinfo-redirects-name' => 'このページへのリダイレクト数',
+'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'このページの下位ページ数',
-'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|リダイレクト}}、$3 {{PLURAL:$3|非リダイレクト}})',
-'pageinfo-firstuser' => 'ページ作成者',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|件のリダイレクト}}、$3 {{PLURAL:$3|件の非リダイレクト}})',
+'pageinfo-firstuser' => 'ページ作成者',
 'pageinfo-firsttime' => 'ページの作成日時',
 'pageinfo-lastuser' => '最終編集者',
 'pageinfo-lasttime' => '最終編集日時',
@@ -3262,10 +3287,17 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'pageinfo-authors' => '総投稿者数',
 'pageinfo-recent-edits' => '最近の編集回数 (過去 $1)',
 'pageinfo-recent-authors' => '最近の投稿者数',
-'pageinfo-restriction' => 'ページ保護 ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'マジック {{PLURAL:$1|ワード}} ($1)',
 'pageinfo-hidden-categories' => '隠し{{PLURAL:$1|カテゴリ}} ($1)',
-'pageinfo-templates' => '参照読み込みされた{{PLURAL:$1|テンプレート}} ($1)',
+'pageinfo-templates' => '参照読み込みされている{{PLURAL:$1|テンプレート}} ($1)',
+'pageinfo-toolboxlink' => 'ページ情報',
+'pageinfo-redirectsto' => '転送先',
+'pageinfo-redirectsto-info' => '情報',
+'pageinfo-contentpage' => '本文ページとして数える',
+'pageinfo-contentpage-yes' => 'はい',
+'pageinfo-protect-cascading' => 'カスケード保護されている',
+'pageinfo-protect-cascading-yes' => 'はい',
+'pageinfo-protect-cascading-from' => 'カスケード保護の起点',
 
 # Skin names
 'skinname-standard' => 'クラシック',
@@ -3288,6 +3320,8 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'markedaspatrollederror' => '巡回済みにできません',
 'markedaspatrollederrortext' => '巡回済みにするには、版を指定する必要があります。',
 'markedaspatrollederror-noautopatrol' => '自分の編集を巡回済みにする権限がありません。',
+'markedaspatrollednotify' => '$1 へのこの変更は巡回済みになりました。',
+'markedaspatrollederrornotify' => '巡回済みにするのに失敗しました。',
 
 # Patrol log
 'patrol-log-page' => '巡回記録',
@@ -3296,7 +3330,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 
 # Image deletion
 'deletedrevision' => '古い版 $1 を削除しました',
-'filedeleteerror-short' => 'ファイル削除エラー:$1',
+'filedeleteerror-short' => 'ファイルの削除エラー: $1',
 'filedeleteerror-long' => 'ファイルの削除中にエラーが発生しました:
 
 $1',
@@ -3312,13 +3346,13 @@ $1',
 # Media information
 'mediawarning' => "'''警告:'''この種類のファイルは悪意のあるコードを含んでいる可能性があります。
 実行するとシステムが危険にさらされる可能性があります。",
-'imagemaxsize' => "画像のサイズ制限:<br />''(ファイルページに対する)''",
-'thumbsize' => 'サムネイルの大きさ',
+'imagemaxsize' => "画像のサイズ制限: <br />''(ファイルページに対する)''",
+'thumbsize' => 'サムネイルの大きさ:',
 'widthheight' => '$1 × $2',
 '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-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',
@@ -3348,6 +3382,10 @@ $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'video-dims' => '$1、 $2 × $3',
+'seconds-abbrev' => '$1 s',
+'minutes-abbrev' => '$1 m',
+'hours-abbrev' => '$1 h',
+'days-abbrev' => '$1 d',
 'seconds' => '{{PLURAL:$1|$1 秒}}',
 'minutes' => '{{PLURAL:$1|$1 分}}',
 'hours' => '{{PLURAL:$1|$1 時間}}',
@@ -3692,7 +3730,7 @@ Variants for Chinese language
 'exif-flash-mode-1' => '強制発光モード',
 'exif-flash-mode-2' => '強制非発光モード',
 'exif-flash-mode-3' => '自動発光モード',
-'exif-flash-function-1' => 'ストロボ機能し',
+'exif-flash-function-1' => 'ストロボ機能し',
 'exif-flash-redeye-1' => '赤目軽減有り',
 
 'exif-focalplaneresolutionunit-2' => 'インチ',
@@ -3911,6 +3949,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[ウィキ間の参照読み込みは無効になっています]',
 'scarytranscludefailed' => '[$1に対してテンプレートの取得に失敗しました]',
+'scarytranscludefailed-httpstatus' => '[$1に対してテンプレートの取得に失敗しました: HTTP $2]',
 'scarytranscludetoolong' => '[URLが長すぎます]',
 
 # Delete conflict
@@ -3933,9 +3972,9 @@ $5
 'confirm-unwatch-top' => 'このページをウォッチリストから除去しますか?',
 
 # Separators for various lists, etc.
-'semicolon-separator' => '',
+'semicolon-separator' => ';&#32;',
 'comma-separator' => '、',
-'colon-separator' => '',
+'colon-separator' => ':&#32;',
 'pipe-separator' => '&#32;|&#32;',
 'word-separator' => '&#32;',
 'parentheses' => '($1)',
@@ -3994,11 +4033,11 @@ $5
 'watchlistedit-normal-legend' => 'ウォッチリストからページ名を除去',
 'watchlistedit-normal-explain' => 'ウォッチリストに入っているページ名を以下に表示しています。
 ページを除去するには、隣のボックスにチェックを入れて「{{int:watchlistedit-normal-submit}}」をクリックしてください。
\81¾ã\81\9fã\80\81[[Special:EditWatchlist/raw|ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\81\9dã\81®ã\81¾ã\81¾編集]]も使用できます。',
\81¾ã\81\9fã\80\81[[Special:EditWatchlist/raw|ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\83\86ã\82­ã\82¹ã\83\88ã\81§編集]]も使用できます。',
 'watchlistedit-normal-submit' => 'ページを除去',
 'watchlistedit-normal-done' => 'ウォッチリストから {{PLURAL:$1|$1 件のページ}}を削除しました:',
-'watchlistedit-raw-title' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\81\9dã\81®ã\81¾ã\81¾編集',
-'watchlistedit-raw-legend' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\81\9dã\81®ã\81¾ã\81¾編集',
+'watchlistedit-raw-title' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\83\86ã\82­ã\82¹ã\83\88ã\81§編集',
+'watchlistedit-raw-legend' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\83\86ã\82­ã\82¹ã\83\88ã\81§編集',
 'watchlistedit-raw-explain' => '以下に、ウォッチリストに含まれるページ名を列挙しています。この一覧で追加や除去ができます。
 1行に1ページ名です。
 完了したら、「{{int:Watchlistedit-raw-submit}}」をクリックしてください。
@@ -4006,13 +4045,13 @@ $5
 'watchlistedit-raw-titles' => 'ページ名:',
 'watchlistedit-raw-submit' => 'ウォッチリストを更新',
 'watchlistedit-raw-done' => 'ウォッチリストを更新しました。',
-'watchlistedit-raw-added' => '{{PLURAL:$1|$1 件のページ}}を追加しました:',
-'watchlistedit-raw-removed' => '{{PLURAL:$1|$1 件のページ}}を除去しました:',
+'watchlistedit-raw-added' => '{{PLURAL:$1|$1 ページ}}を追加しました:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|$1 ページ}}を除去しました:',
 
 # Watchlist editing tools
 'watchlisttools-view' => '関連する変更を閲覧',
 'watchlisttools-edit' => 'ウォッチリストの閲覧と編集',
-'watchlisttools-raw' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\81\9dã\81®ã\81¾ã\81¾編集',
+'watchlisttools-raw' => 'ã\82¦ã\82©ã\83\83ã\83\81ã\83ªã\82¹ã\83\88ã\82\92ã\83\86ã\82­ã\82¹ã\83\88ã\81§編集',
 
 # Iranian month names
 'iranian-calendar-m1' => 'ファルヴァルディーン',
@@ -4095,10 +4134,11 @@ $5
 'version-parser-function-hooks' => 'パーサー関数フック',
 'version-hook-name' => 'フック名',
 'version-hook-subscribedby' => '使用個所',
-'version-version' => '(バージョン$1)',
+'version-version' => '(バージョン $1)',
 'version-license' => 'ライセンス',
 'version-poweredby-credits' => "このウィキは、'''[//www.mediawiki.org/ MediaWiki]'''(copyright © 2001-$1 $2)で動作しています。",
 'version-poweredby-others' => 'その他',
+'version-credits-summary' => '[[Special:Version|MediaWiki]] に貢献した以下の人たちに感謝します。',
 'version-license-info' => 'MediaWikiはフリーソフトウェアです。あなたは、フリーソフトウェア財団の発行するGNU一般公衆利用許諾書 (GNU General Public License)(バージョン2、またはそれ以降のライセンス)の規約に基づき、このライブラリを再配布および改変できます。
 
 MediaWikiは、有用であることを期待して配布されていますが、商用あるいは特定の目的に適するかどうかも含めて、暗黙的にも、一切保証されません。詳しくは、GNU一般公衆利用許諾書をご覧ください。
@@ -4115,7 +4155,7 @@ MediaWikiは、有用であることを期待して配布されていますが
 
 # Special:FilePath
 'filepath' => 'ファイルパス',
-'filepath-page' => 'ファイル',
+'filepath-page' => 'ファイル:',
 'filepath-submit' => '取得',
 'filepath-summary' => 'この特別ページは、ファイルへの完全なパスを返します。
 画像は最大解像度で表示され、他のファイルタイプは関連付けされたプログラムが直接起動します。',
@@ -4124,9 +4164,9 @@ MediaWikiは、有用であることを期待して配布されていますが
 'fileduplicatesearch' => '重複ファイルの検索',
 'fileduplicatesearch-summary' => '重複ファイルをハッシュ値に基づいて検索します。',
 'fileduplicatesearch-legend' => '重複の検索',
-'fileduplicatesearch-filename' => 'ファイル名',
+'fileduplicatesearch-filename' => 'ファイル名:',
 'fileduplicatesearch-submit' => '検索',
-'fileduplicatesearch-info' => '$1 × $2 ピクセル<br />ファイルサイズ:$3<br />MIMEタイプ:$4',
+'fileduplicatesearch-info' => '$1 × $2 ピクセル<br />ファイルサイズ: $3<br />MIME タイプ: $4',
 'fileduplicatesearch-result-1' => 'ファイル「$1」と重複するファイルはありません。',
 'fileduplicatesearch-result-n' => 'ファイル「$1」には {{PLURAL:$2|$2 件の重複ファイル}}があります。',
 'fileduplicatesearch-noresults' => '「$1」という名前のファイルはありません。',
@@ -4184,9 +4224,9 @@ MediaWikiは、有用であることを期待して配布されていますが
 'compare-rev1' => '版 1',
 'compare-rev2' => '版 2',
 'compare-submit' => '比較',
-'compare-invalid-title' => '指定したページ名は使用できません。',
-'compare-title-not-exists' => 'æ\8c\87å®\9aã\81\95ã\82\8cたページは存在しません。',
-'compare-revision-not-exists' => 'æ\8c\87å®\9aã\81\95ã\82\8cた版は存在しません。',
+'compare-invalid-title' => '指定したページ名は無効です。',
+'compare-title-not-exists' => 'æ\8c\87å®\9aã\81\97たページは存在しません。',
+'compare-revision-not-exists' => 'æ\8c\87å®\9aã\81\97た版は存在しません。',
 
 # Database error messages
 'dberr-header' => 'このウィキには問題があります',
@@ -4216,13 +4256,13 @@ MediaWikiは、有用であることを期待して配布されていますが
 
 # New logging system
 'logentry-delete-delete' => '$1 がページ「$3」を削除しました',
-'logentry-delete-restore' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92復帰しました',
-'logentry-delete-event' => '$1 が$3の{{PLURAL:$5|$5件の記録項目}}の閲覧レベルを変更しました:$4',
+'logentry-delete-restore' => '$1 ã\81\8cã\83\9aã\83¼ã\82¸ã\80\8c$3ã\80\8dã\82\92復å\85\83しました',
+'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-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」の版の閲覧レベルを見えない形で変更しました',
@@ -4240,15 +4280,15 @@ MediaWikiは、有用であることを期待して配布されていますが
 'logentry-move-move_redir-noredirect' => '$1 がページ「$3」をリダイレクトの「$4」に、リダイレクトを残さずに移動しました',
 'logentry-patrol-patrol' => '$1 がページ「$3」の版 $4 を巡回済みとしました',
 'logentry-patrol-patrol-auto' => '$1 が自動的にページ「$3」の版 $4 を巡回済みとしました',
-'logentry-newusers-newusers' => '$1 が利用者アカウントを作成しました',
-'logentry-newusers-create' => '$1 が利用者アカウントを作成しました',
-'logentry-newusers-create2' => '$1 が利用者アカウント $3 を作成しました',
-'logentry-newusers-autocreate' => 'アカウント $1 が自動的に作成されました',
+'logentry-newusers-newusers' => '利用者アカウント $1 が作成されました',
+'logentry-newusers-create' => '利用者アカウント $1 が作成されました',
+'logentry-newusers-create2' => '利用者アカウント $3 が $1 により作成されました',
+'logentry-newusers-autocreate' => '利用者アカウント $1 が自動的に作成されました',
 'newuserlog-byemail' => 'パスワードをメールでお送りしました',
 
 # Feedback
-'feedback-bugornote' => 'æ\8a\80è¡\93ç\9a\84ã\81ªå\95\8fé¡\8cã\81®è©³ç´°ã\82\92説æ\98\8eã\81ªã\81\95ã\82\8bæº\96å\82\99ã\81\8cã\81§ã\81\8dã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯[$1 ã\83\90ã\82°ã\82\92å ±å\91\8a\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84
-そうではない場合は、下の簡易フォームを使用してください。あなたのコメントがあなたの利用者名とご使用中のブラウザー名と共に、ページ"[$3 $2]"に追加されます。',
+'feedback-bugornote' => 'æ\8a\80è¡\93ç\9a\84ã\81ªå\95\8fé¡\8cã\81®è©³ç´°ã\82\92説æ\98\8eã\81\99ã\82\8bæº\96å\82\99ã\81\8cã\81§ã\81\8dã\81¦ã\81\84ã\82\8bå ´å\90\88ã\81¯ã\80\81[$1 ã\83\90ã\82°å ±å\91\8a\82\92ã\81\8aé¡\98ã\81\84ã\81\97ã\81¾ã\81\99
+準備ができていない場合は、下の簡易フォームを使用してください。あなたのコメントと利用者名が、ページ「[$3 $2]」に追加されます。',
 'feedback-subject' => '件名:',
 'feedback-message' => 'メッセージ:',
 'feedback-cancel' => 'キャンセル',
@@ -4262,6 +4302,10 @@ MediaWikiは、有用であることを期待して配布されていますが
 'feedback-bugcheck' => 'Great! [$1 既出のバグ]に既に含まれていないかご確認ください。',
 'feedback-bugnew' => 'チェックしました。バグを報告します。',
 
+# Search suggestions
+'searchsuggest-search' => '検索',
+'searchsuggest-containing' => 'この語句を全文検索',
+
 # API errors
 'api-error-badaccess-groups' => 'このウィキへのファイルのアップロードが許可されていません。',
 'api-error-badtoken' => '内部エラー:トークンが正しくありません。',
@@ -4314,4 +4358,6 @@ MediaWikiは、有用であることを期待して配布されていますが
 'duration-centuries' => '$1 {{PLURAL:$1|世紀}}',
 'duration-millennia' => '$1{{PLURAL:$1|,000 年}}',
 
+# Unknown messages
+'svg-long-error' => '無効な SVG ファイル: $1',
 );
index 00c4950..e40b371 100644 (file)
@@ -156,7 +156,6 @@ Lef aaf dif afta pofaamin ruolbak',
 'qbbrowse' => 'Brouz',
 'qbedit' => 'Edit',
 'qbpageoptions' => 'Dis piej',
-'qbpageinfo' => 'Kantex',
 'qbmyoptions' => 'Mi piejdem',
 'qbspecialpages' => 'Peshal piejdem',
 'faq' => 'FAK',
@@ -403,11 +402,8 @@ Di riizn dehn gi a "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Yu nou lag out.'''
 
-Yu kiahn kantiniu yuuz {{SITENAME}} ananimosli, ar yu kiahn [[Special:UserLogin|lag iin agen]] az di siem ar az difrant yuuza.
+Yu kiahn kantiniu yuuz {{SITENAME}} ananimosli, ar yu kiahn <span class='plainlinks'>[$1 lag iin agen]</span> az di siem ar az difrant yuuza.
 Nuot se som piej maita kantiniu fi displie laik se yu stil log iin, antel yu klier yu brouza kiash.",
-'welcomecreation' => '== Welkom, $1! ==
-Yu akount don kriet.
-No figat fi chienj yu [[Special:Preferences|{{SITENAME}} prefransdem]].',
 'yourname' => 'Yuuzaniem:',
 'yourpassword' => 'Paaswod:',
 'yourpasswordagain' => 'Ritaip paaswod:',
@@ -723,8 +719,6 @@ Lejen: '''({{int:cur}})''' = difrans wid lietis rivijan, '''({{int:last}})''' =
 'search-interwiki-caption' => 'Sista prajek',
 'search-interwiki-default' => '$1 rizoltdem:',
 'search-interwiki-more' => '(muo)',
-'search-mwsuggest-enabled' => 'wid sojeshan',
-'search-mwsuggest-disabled' => 'nuo sojeshan',
 'nonefound' => "'''Nuot''': Onggl som niemspies saach bai difaalt.
 Chrai priifix yu kwieri wid ''all:'' fi saach aal kantent (inkluudn taak piej, templit, esechra), ar yuuz di dizaya niemspies fi priifix.",
 'powersearch' => 'Advans saach',
index 54cdcee..90b75d2 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author (vinny)
+ * @author Gleki
  * @author Homo logos
  * @author Inego (on jbo.wikipedia.org)
  * @author Malafaya
@@ -19,244 +20,317 @@ $messages = array(
 # User preference toggles
 'tog-justify' => 'jufmei co mulno selkuspe',
 
+'underline-always' => 'roroi',
+'underline-never' => 'noroi',
+
 # Dates
-'sunday'        => 'la zedjed.',
-'monday'        => 'la padjed.',
-'tuesday'       => 'la redjed.',
-'wednesday'     => 'la cedjed.',
-'thursday'      => 'la vodjed.',
-'friday'        => 'la mudjed.',
-'saturday'      => 'la xadjed.',
-'january'       => 'ianvari',
-'february'      => 'frebruari',
-'march'         => 'martio',
-'april'         => 'prilio',
-'may_long'      => 'madjio',
-'june'          => 'djunio',
-'july'          => 'djulio',
-'august'        => 'avgusto',
-'september'     => 'septembero',
-'october'       => 'oktobero',
-'november'      => 'novmbero',
-'december'      => 'decmbero',
-'january-gen'   => 'la pamast.',
-'february-gen'  => 'la remast.',
-'march-gen'     => 'la cimast.',
-'april-gen'     => 'la vomast.',
-'may-gen'       => 'la mumast.',
-'june-gen'      => 'la xamast.',
-'july-gen'      => 'la zemast.',
-'august-gen'    => 'la bimast.',
+'sunday' => 'la zedjed.',
+'monday' => 'la padjed.',
+'tuesday' => 'la redjed.',
+'wednesday' => 'la cedjed.',
+'thursday' => 'la vodjed.',
+'friday' => 'la mudjed.',
+'saturday' => 'la xadjed.',
+'sun' => 'la zedjed',
+'mon' => 'la padjed',
+'tue' => 'la redjed',
+'wed' => 'la cidjed',
+'thu' => 'la vodjed',
+'fri' => 'la mudjed',
+'sat' => 'la xadjed',
+'january' => 'ianvari',
+'february' => 'frebruari',
+'march' => 'martio',
+'april' => 'prilio',
+'may_long' => 'madjio',
+'june' => 'djunio',
+'july' => 'djulio',
+'august' => 'avgusto',
+'september' => 'septembero',
+'october' => 'oktobero',
+'november' => 'novmbero',
+'december' => 'decmbero',
+'january-gen' => 'la pamast.',
+'february-gen' => 'la remast.',
+'march-gen' => 'la cimast.',
+'april-gen' => 'la vomast.',
+'may-gen' => 'la mumast.',
+'june-gen' => 'la xamast.',
+'july-gen' => 'la zemast.',
+'august-gen' => 'la bimast.',
 'september-gen' => 'la somast.',
-'october-gen'   => 'la daumast.',
-'november-gen'  => 'la feimast.',
-'december-gen'  => 'la gaimast.',
-'jan'           => 'ian',
-'feb'           => 'fre',
-'mar'           => 'mar',
-'apr'           => 'pri',
-'may'           => 'mad',
-'jun'           => 'jun',
-'jul'           => 'jul',
-'aug'           => 'avg',
-'sep'           => 'sep',
-'oct'           => 'okt',
-'nov'           => 'nov',
-'dec'           => 'dec',
+'october-gen' => 'la daumast.',
+'november-gen' => 'la feimast.',
+'december-gen' => 'la gaimast.',
+'jan' => 'ian',
+'feb' => 'fre',
+'mar' => 'mar',
+'apr' => 'pri',
+'may' => 'mad',
+'jun' => 'jun',
+'jul' => 'jul',
+'aug' => 'avg',
+'sep' => 'sep',
+'oct' => 'okt',
+'nov' => 'nov',
+'dec' => 'dec',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|klesi|klesi}}',
-'category_header'        => 'fe le kibypapri cu klesi "$1"',
-'subcategories'          => "le'a ti",
-'category-subcat-count'  => "$2 klesi cu vipsi le vi klesi .i $1 vipkle cu ni'a se jarco",
-'category-article-count' => "$2 kibypapri cu cmima le vi klesi .i $1 kibypapri cu ni'a se jarco",
-
-'mytalk'     => 'casnu mi',
+'pagecategories' => '{{PLURAL:$1|klesi|klesi}}',
+'category_header' => 'fe le kibypapri cu klesi "$1"',
+'subcategories' => "le'a ti",
+'category-subcat-count' => "$2 klesi cu vipsi le vi klesi .i $1 vipkle cu ni'a se jarco",
+'category-article-count' => "{{PLURAL:$2|pa vi ckupau ku po'o cmima lo vi klesi.| {{PLURAL:$1|lo vi ckupau|$1 vi ckupau }} ku cmima lo vi klesi, out of $2 total.}}",
+'listingcontinuesabbrev' => "co'unai",
+
+'about' => 've skicu',
+'moredotdotdot' => '.au zmadu',
+'mytalk' => 'casnu mi',
 'navigation' => 'ckupau',
 
 # Cologne Blue skin
-'qbedit'        => 'stika',
+'qbfind' => 'facki',
+'qbedit' => 'stika',
 'qbpageoptions' => 'ti ckupau',
-'faq'           => 'FAQ',
-'faqpage'       => 'Project:FAQ',
-
-'errorpagetitle'   => 'fliba',
-'tagline'          => "ra'i {{SITENAME}}",
-'help'             => 'sidju ckupau',
-'search'           => 'sisku',
-'searchbutton'     => 'sisku',
-'searcharticle'    => 'jarco',
-'history_short'    => 'galfi plivei',
+'qbmyoptions' => 'lo pe mi ckupau',
+'qbspecialpages' => 'steci ckupau',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+# Vector skin
+'vector-action-addsection' => "jmina la'e se casnu",
+'vector-action-delete' => 'vimcu',
+'vector-action-move' => 'stika lo cmene',
+'vector-view-create' => 'zbasu',
+'vector-view-edit' => 'stika',
+'vector-view-history' => 'ko cpacu lo vreji citri',
+'vector-view-view' => 'tcidu',
+'vector-view-viewsource' => 'cpacu lo krasi',
+'actions' => 'nu zukte',
+'namespaces' => 'cmene canlu',
+
+'errorpagetitle' => 'fliba',
+'tagline' => "ra'i {{SITENAME}}",
+'help' => 'sidju ckupau',
+'search' => 'sisku',
+'searchbutton' => 'sisku',
+'searcharticle' => 'jarco',
+'history' => 'lo ckupau citri',
+'history_short' => 'galfi plivei',
 'printableversion' => 'plepri simsa',
-'permalink'        => "vitno terjo'e",
-'edit'             => 'stika',
-'create'           => 'ninzba',
-'delete'           => 'daspo',
-'protect'          => 'bandu',
-'protect_change'   => 'binxo',
+'permalink' => "vitno terjo'e",
+'view' => 'cpacu',
+'edit' => 'stika',
+'create' => 'ninzba',
+'editthispage' => 'stika lo vi ckupau',
+'create-this-page' => 'zbasu lo vi ckupau',
+'delete' => 'daspo',
+'deletethispage' => 'vimcu lo vi ckupau',
+'protect' => 'bandu',
+'protect_change' => 'binxo',
+'newpage' => 'lo cnino ckupau',
 'talkpagelinktext' => 'casnu',
-'specialpage'      => 'steci ckupau',
-'personaltools'    => 'Sivni tyobuobulysy',
-'talk'             => 'casnu',
-'views'            => 'Catlu',
-'toolbox'          => 'tutci',
-'otherlanguages'   => 'drata bangu',
-'lastmodifiedat'   => "le vi ckupau rore'u se galfi de'i li $2 $1",
-'jumpto'           => 'plipe tyobu:',
+'specialpage' => 'steci ckupau',
+'personaltools' => 'Sivni tyobuobulysy',
+'talk' => 'casnu',
+'views' => 'nu cpacu',
+'toolbox' => 'tutci',
+'otherlanguages' => 'drata bangu',
+'lastmodifiedat' => "le vi ckupau rore'u se galfi de'i li $2 $1",
+'jumpto' => 'plipe tyobu:',
 'jumptonavigation' => 'ckupau',
-'jumptosearch'     => 'sisku',
+'jumptosearch' => 'sisku',
 
 # 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'            => 'About {{SITENAME}}',
-'aboutpage'            => "Project:sera'a",
-'copyright'            => "lo selvau cu gubni ja'i la'o gy. $1 .gy.",
-'copyrightpage'        => "{{ns:project}}:fukyzifpo'e",
-'currentevents'        => "caca'a fasnu",
-'currentevents-url'    => "Project:caca'a fasnu",
-'disclaimers'          => "nunxusra lo za'i na fuzme",
-'disclaimerpage'       => "Project:kampu nunxusra be lo za'i na fuzme",
-'edithelp'             => 'stika nunsidju',
-'edithelppage'         => 'Help:Editing',
-'mainpage'             => 'Ralju Ckupau',
+'aboutsite' => 'About {{SITENAME}}',
+'aboutpage' => "Project:sera'a",
+'copyright' => "lo selvau cu gubni ja'i la'o gy. $1 .gy.",
+'copyrightpage' => "{{ns:project}}:fukyzifpo'e",
+'currentevents' => "caca'a fasnu",
+'currentevents-url' => "Project:caca'a fasnu",
+'disclaimers' => "nunxusra lo za'i na fuzme",
+'disclaimerpage' => "Project:kampu nunxusra be lo za'i na fuzme",
+'edithelp' => 'stika nunsidju',
+'edithelppage' => 'Help:Editing',
+'helppage' => 'to nu sidju toi se vasru',
+'mainpage' => 'Ralju Ckupau',
 'mainpage-description' => 'ralju ckupau',
-'portal'               => 'bende ckupau',
-'portal-url'           => 'Project:bende ckupau',
-'privacy'              => "javni be sera'a lo sivni",
-'privacypage'          => "Project:i'inai zukselpla",
-
-'retrievedfrom'        => 'cpacu fi la\'o .url. "$1" .url.',
-'editsection'          => 'stika ti',
+'portal' => 'bende ckupau',
+'portal-url' => 'Project:bende ckupau',
+'privacy' => "javni be sera'a lo sivni",
+'privacypage' => "Project:i'inai zukselpla",
+
+'ok' => 'ie',
+'retrievedfrom' => 'cpacu fi la\'o .url. "$1" .url.',
+'newmessageslink' => 'loi cnino notci',
+'editsection' => 'stika ti',
 'editsection-brackets' => '[$1]',
-'editold'              => 'stika',
-'viewsourceold'        => 'catlu le mifra',
-'editlink'             => 'stika ti',
-'viewsourcelink'       => 'casnu le mifra',
-'editsectionhint'      => 'stika ti: $1',
-'toc'                  => 'ckupau pagbu',
-'showtoc'              => 'jarco',
-'hidetoc'              => 'toljarco',
-'thisisdeleted'        => 'View or restore $1?',
-'viewdeleted'          => 'View $1?',
-'restorelink'          => '{{PLURAL:$1|one deleted edit|$1 deleted edits}}',
-'feedlinks'            => 'Feed:',
-'feed-invalid'         => 'Invalid subscription feed type.',
-'feed-unavailable'     => 'Syndication feeds are not available',
-'site-rss-feed'        => '$1 RSS cidja',
-'site-atom-feed'       => '$1 Atom cidja',
-'red-link-title'       => '$1 (le vi kibypapri cu na zasti)',
+'editold' => 'stika',
+'viewsourceold' => 'catlu le mifra',
+'editlink' => 'stika ti',
+'viewsourcelink' => 'casnu le mifra',
+'editsectionhint' => 'stika ti: $1',
+'toc' => 'ckupau pagbu',
+'showtoc' => 'jarco',
+'hidetoc' => 'toljarco',
+'thisisdeleted' => 'View or restore $1?',
+'viewdeleted' => 'View $1?',
+'restorelink' => '{{PLURAL:$1|one deleted edit|$1 deleted edits}}',
+'feedlinks' => 'Feed:',
+'feed-invalid' => 'Invalid subscription feed type.',
+'feed-unavailable' => 'Syndication feeds are not available',
+'site-rss-feed' => '$1 RSS cidja',
+'site-atom-feed' => '$1 Atom cidja',
+'red-link-title' => '$1 (le vi kibypapri cu na zasti)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'kibypapri',
-'nstab-user'      => 'pilno kibypapri',
-'nstab-media'     => 'Media page',
-'nstab-special'   => 'steci kibypapri',
+'nstab-main' => 'lo ckupau',
+'nstab-user' => 'pilno kibypapri',
+'nstab-media' => 'Media page',
+'nstab-special' => 'steci ckupau',
+'nstab-project' => 'gungunma ckupau',
+'nstab-image' => 'vreji',
 'nstab-mediawiki' => 'notci',
-'nstab-category'  => 'klesi',
+'nstab-category' => 'klesi',
 
 # General errors
+'badtitle' => "na'e mapti cmene",
 'viewsource' => 'catlu le mifra',
 
 # Login and logout pages
-'login'                   => "co'a se jaspu",
+'yourname' => 'to pilno cmene toi',
+'login' => "co'a se jaspu",
 'nav-login-createaccount' => 'jaspu nerkla / vreji lo cnino pilno',
-'logout'                  => "co'u se jaspu",
-'userlogout'              => "co'u se jaspu",
-'gotaccountlink'          => "co'a se jaspu",
+'userlogin' => "co'a pilno lo jaspu / zbasu lo jaspu",
+'logout' => "co'u se jaspu",
+'userlogout' => "co'u se jaspu",
+'nologinlink' => 'zbasu lo jaspu',
+'gotaccountlink' => "co'a se jaspu",
+'loginlanguagelabel' => 'to bangu toi $1',
+
+# Special:PasswordReset
+'passwordreset-username' => 'to pilno cmene toi',
 
 # Edit page toolbar
 'extlink_sample' => 'http://www.example.com link title',
+'media_tip' => 'judri lo vreji',
 
 # Edit pages
-'minoredit'      => "ti nu na'evajni galfi",
-'watchthis'      => 'zgana ti',
-'savearticle'    => 'vreji le ckupau',
-'showpreview'    => 'troci jarco',
-'showdiff'       => 'jarco lo te frica',
-'loginreqlink'   => "co'a se jaspu",
-'previewnote'    => "'''ko morji le du'u ti seljarco o'i'''
+'summary' => 'to ve skicu toi',
+'minoredit' => "ti nu na'evajni galfi",
+'watchthis' => 'zgana ti',
+'savearticle' => 'vreji le ckupau',
+'showpreview' => 'troci jarco',
+'showdiff' => 'jarco lo te frica',
+'loginreqlink' => "co'a se jaspu",
+'newarticle' => 'to cnino toi',
+'previewnote' => "'''ko morji le du'u ti seljarco o'i'''
 .i lo do nunstika cu na pu vreji",
-'editing'        => "ca galfi la'e lu $1 li'u",
+'editing' => "ca galfi la'e lu $1 li'u",
 'editingsection' => 'ca galfi le selcmene be zoi $1 (section)',
 'editingcomment' => 'ca galfi le selcmene be zoi $1 (comment)',
 
 # History pages
 'revisionasof' => "velfarvi de'i $1",
-'cur'          => 'cab',
-'last'         => "prula'i",
-'page_first'   => 'pamoi',
-'page_last'    => 'fanmo',
+'cur' => 'cab',
+'last' => "prula'i",
+'page_first' => 'pamoi',
+'page_last' => 'fanmo',
+'history-show-deleted' => "mo'u se vimcu po'o",
+'histfirst' => 'clira traji',
+'histlast' => 'lerci traji',
 
 # Revision deletion
 'rev-delundel' => 'jarco/mipri',
 
 # Diffs
-'lineno'   => 'Linji $1',
+'lineno' => 'Linji $1',
 'editundo' => 'fatstika',
 
 # Search results
-'searchresults'             => "tu'a le se sisku",
-'searchresults-title'       => 'Sisku pruce for "$1"',
-'search-result-size'        => '$1 .i $2 valsi',
-'search-suggest'            => "xu do sisydji lu $1 li'u",
-'search-mwsuggest-enabled'  => 'kansa stidiiyobunysy',
-'search-mwsuggest-disabled' => 'no stidiiyobunysy',
+'searchresults' => "tu'a le se sisku",
+'searchresults-title' => 'Sisku pruce for "$1"',
+'searchhelp-url' => 'to nu sidju toi se vasru',
+'searchprofile-everything' => "ro co'e",
+'search-result-size' => '$1 ({{PLURAL:$2|1 valsi|$2 valsi}})',
+'search-suggest' => "xu do sisydji lu $1 li'u",
+'searchall' => "ro co'e",
 
 # Preferences page
-'preferences'       => 'zmaselnei',
-'mypreferences'     => 'zmaselnei liste',
-'prefs-editing'     => 'ca galfi',
+'preferences' => 'zmaselnei',
+'mypreferences' => 'zmaselnei liste',
+'prefs-editing' => 'ca galfi',
 'searchresultshead' => "tu'a le se sisku",
-'savedprefs'        => 'le do zmaselnei pu vreji',
+'savedprefs' => 'le do zmaselnei pu vreji',
+'yourrealname' => 'to fatci cmene toi',
+
+# Associated actions - in the sentence "You do not have permission to X"
+'action-edit' => 'stika lo vi ckupau',
 
 # Recent changes
-'recentchanges'     => 'puzi nunstika',
-'recentchangestext' => 'liste loi nu puzi galfi la .uikis.',
-'rcshowhidebots'    => '$1 lo zmiku',
-'rcshowhideliu'     => '$1 lo samyzva',
-'diff'              => 'te frica',
-'hist'              => 'galfi plivei',
-'hide'              => 'Toljarco',
-'show'              => 'Jarco',
-'minoreditletter'   => 'm',
-'newpageletter'     => 'n',
-'boteditletter'     => 'z',
+'recentchanges' => 'puzi nunstika',
+'recentchanges-summary' => 'liste loi nu puzi galfi la .uikis.',
+'rcshowhidebots' => '$1 lo zmiku',
+'rcshowhideliu' => '$1 lo samyzva',
+'diff' => 'te frica',
+'hist' => 'galfi plivei',
+'hide' => 'Toljarco',
+'show' => 'Jarco',
+'minoreditletter' => 'm',
+'newpageletter' => 'n',
+'boteditletter' => 'z',
 
 # Recent changes linked
 'recentchangeslinked' => "srana nunga'i",
+'recentchangeslinked-page' => 'to ckupau cmene toi',
 
 # Upload
-'upload'    => 'benji lo datnyvei',
-'uploadbtn' => 'benji lo datnyvei',
+'upload' => 'benji pa vreji',
+'uploadbtn' => 'benji pa vreji',
+'filedesc' => 'to ve skicu toi',
 
 # File description page
-'filehist-current'  => 'cabna',
+'file-anchor-link' => 'vreji',
+'filehist' => 'lo vreji citri',
+'filehist-current' => 'cabna',
 'filehist-datetime' => 'detytcika',
+'filehist-user' => 'pilno',
+'filehist-comment' => 'pinka',
+'imagelinks' => 'vreji nu pilno',
 
 # Random page
 'randompage' => 'cunso ckupau',
 
 # Miscellaneous special pages
+'newpages' => 'lo cnino ckupau',
 'move' => 'stika lo cmene',
 
+# Book sources
+'booksources-go' => 'sazri',
+
 # Special:AllPages
-'allarticles'    => 'ro notci',
+'allpages' => 'ro ckupau',
+'allarticles' => 'ro notci',
 'allpagessubmit' => 'jarco',
 
 # Special:Categories
 'categories' => 'klesi',
 
 # Watchlist
-'watchlist'     => 'selzgaste',
-'mywatchlist'   => 'selzgaste',
-'watch'         => 'jundi',
+'watchlist' => 'selzgaste',
+'mywatchlist' => 'selzgaste',
+'watch' => 'jundi',
 'watchthispage' => 'zgana ti',
+'unwatch' => "de'a zgana",
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => "co'a jundi",
+'watching' => "co'a jundi",
 'unwatching' => "co'u jundi",
 
 # Delete
-'dellogpage'  => 'plivei fi loi nu daspo',
+'actioncomplete' => "mo'u pruce",
+'actionfailed' => 'fliba lo nu pruce',
+'dellogpage' => 'plivei fi loi nu daspo',
 'deletionlog' => 'plivei fi loi nu daspo',
 
 # Rollback
@@ -265,45 +339,78 @@ $messages = array(
 # Restrictions (nouns)
 'restriction-edit' => 'stika',
 
+# Undelete
+'undeleteviewlink' => 'cpacu',
+
 # Namespace form on various pages
+'namespace' => 'to cmene canlu toi',
 'blanknamespace' => '(ralju)',
 
 # Contributions
 'contributions' => 'selstika le pilno',
-'mycontris'     => 'pu selstika mi',
+'mycontris' => 'pu selstika mi',
 
-'sp-contributions-talk'   => 'casnu',
+'sp-contributions-talk' => 'casnu',
 'sp-contributions-submit' => 'sisku',
 
 # What links here
 'whatlinkshere' => 'ma jorne ti',
+'whatlinkshere-page' => 'to ckupau toi',
+'isimage' => 'judri lo vreji',
+'whatlinkshere-prev' => "{{PLURAL:$1|lidne|se lidne la'o url $1 url}}",
+'whatlinkshere-links' => 'to loi judri toi',
+'whatlinkshere-hidelinks' => "loi judri la'o .url $1 .url",
 
 # Block/unblock
-'blocklink'        => 'zunti',
+'blocklink' => 'zunti',
 'change-blocklink' => 'stika bliku',
-'contribslink'     => 'selstika',
+'contribslink' => 'selstika',
 
 # Move page
-'movedto'    => 'te muvdu',
+'movedto' => 'te muvdu',
 'revertmove' => 'xruti',
 
+# Namespace 8 related
+'allmessagesname' => 'cmene',
+
 # Tooltip help for the actions
-'tooltip-pt-watchlist'          => 'le liste be lo kibypapri poi do zgana',
-'tooltip-pt-mycontris'          => 'le liste be le do selstika',
-'tooltip-pt-logout'             => "co'u se jaspu",
-'tooltip-ca-watch'              => 'jmive le vi kibypapri le do selzgaste',
-'tooltip-search'                => 'Sisku {{SITENAME}}',
-'tooltip-search-go'             => "Litru tyobu abu kibypapri kansa tyy'y.buibusy satci cmene ibufy zasti",
-'tooltip-search-fulltext'       => "sisku do'i lei ckupau",
-'tooltip-n-mainpage'            => 'vitke le ralju ckupau',
-'tooltip-n-randompage'          => 'jarco lo cunso ckupau',
-'tooltip-n-help'                => 'sidju kibypapri',
-'tooltip-t-whatlinkshere'       => "nu liste lo zifyga'ikibjudri poi ke'a kibjorne le vi ckupau",
+'tooltip-pt-userpage' => 'ckupau pe do poi pilno',
+'tooltip-pt-mytalk' => 'pe do nu casnu ckupau',
+'tooltip-pt-watchlist' => 'le liste be lo kibypapri poi do zgana',
+'tooltip-pt-mycontris' => 'le liste be le do selstika',
+'tooltip-pt-logout' => "co'u se jaspu",
+'tooltip-ca-delete' => 'vimcu lo vi ckupau',
+'tooltip-ca-move' => 'ko galfi lo cmene be lo vi ckupau',
+'tooltip-ca-watch' => 'jmive le vi kibypapri le do selzgaste',
+'tooltip-search' => 'Sisku {{SITENAME}}',
+'tooltip-search-go' => "Litru tyobu abu kibypapri kansa tyy'y.buibusy satci cmene ibufy zasti",
+'tooltip-search-fulltext' => "sisku do'i lei ckupau",
+'tooltip-p-logo' => 'vitke lo ralju ckupau',
+'tooltip-n-mainpage' => 'vitke lo ralju ckupau',
+'tooltip-n-mainpage-description' => 'vitke lo ralju ckupau',
+'tooltip-n-recentchanges' => "liste lo puzi nunstika vreji be bu'u lo vi uitke",
+'tooltip-n-randompage' => 'jarco lo cunso ckupau',
+'tooltip-n-help' => 'sidju kibypapri',
+'tooltip-t-whatlinkshere' => "nu liste lo zifyga'ikibjudri poi ke'a kibjorne le vi ckupau",
 'tooltip-t-recentchangeslinked' => "lo puzi nunga'i pe lo kibypapri poi kibjorne le vi ckupau",
-'tooltip-undo'                  => "fatygau le nunstika gi'e jarco le stika tampapri tai lo nu troci jarco .i kakne jmina lo krinu le torvelski",
+'tooltip-t-upload' => 'benji lo vreji',
+'tooltip-t-specialpages' => 'liste ro steci ckupau',
+'tooltip-ca-nstab-project' => 'cpacu lo gungunma ckupau',
+'tooltip-ca-nstab-image' => 'cpacu lo vreji ckupau',
+'tooltip-ca-nstab-template' => 'cpacu lo morna',
+'tooltip-save' => 'lo nu stika ku ranji gau',
+'tooltip-undo' => "fatygau le nunstika gi'e jarco le stika tampapri tai lo nu troci jarco .i kakne jmina lo krinu le torvelski",
+
+# External editor support
+'edit-externally' => "stika lo vi vreji sepi'o lo na'e diklo selsampla",
+
+# 'all' in various places, this might be different for inflected languages
+'watchlistall2' => "ro co'e",
+'namespacesall' => "ro co'e",
+'monthsall' => "ro co'e",
 
 # Special:FilePath
-'filepath-page' => 'se datnyvei zoi',
+'filepath-page' => 'se vreji zoi',
 
 # Special:SpecialPages
 'specialpages' => 'steci ckupau',
index 017297f..575d864 100644 (file)
@@ -136,7 +136,6 @@ $messages = array(
 'qbbrowse' => 'Gennemse',
 'qbedit' => 'Redigær',
 'qbpageoptions' => 'Endstellenger før side',
-'qbpageinfo' => "Informåsje side'm",
 'qbmyoptions' => 'Miine endstellenger',
 'qbspecialpages' => 'Sonst sider',
 'faq' => 'VSF',
index 62ae858..cf6eb39 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Anggoro
  * @author Helix84
+ * @author Hoo
  * @author Kaganer
  * @author Meursault2004
  * @author NoiX180
@@ -183,8 +184,8 @@ $messages = array(
 'newwindow' => '(buka ing jendhéla anyar)',
 'cancel' => 'Batalna',
 'moredotdotdot' => 'Liyané...',
-'mypage' => 'Kacaku',
-'mytalk' => 'Gunemanku',
+'mypage' => 'Kaca',
+'mytalk' => 'Wicara',
 'anontalk' => 'Dhiskusi IP puniki',
 'navigation' => 'Pandhu Arah',
 'and' => '&#32;Lan',
@@ -194,7 +195,6 @@ $messages = array(
 'qbbrowse' => 'Navigasi',
 'qbedit' => 'Sunting',
 'qbpageoptions' => 'Kaca iki',
-'qbpageinfo' => 'Kontèks kaca',
 'qbmyoptions' => 'Opsiku',
 'qbspecialpages' => 'Kaca-kaca astaméwa',
 'faq' => 'FAQ (Pitakonan sing kerep diajokaké)',
@@ -207,7 +207,7 @@ $messages = array(
 'vector-action-protect' => 'Reksa',
 'vector-action-undelete' => 'Batalna pambusakan',
 'vector-action-unprotect' => 'Owahi pangreksan',
-'vector-simplesearch-preference' => 'Aktifaken pamrayogi pamadosan ingkang kasampurnakaken (namung kulit vektor)',
+'vector-simplesearch-preference' => 'Urubaké wilah panggolèkan ringkes (namung kulit Vèktor)',
 'vector-view-create' => 'Gawé',
 'vector-view-edit' => 'Sunting',
 'vector-view-history' => 'Sajarah kaca',
@@ -217,6 +217,7 @@ $messages = array(
 'namespaces' => 'Ruang jeneng',
 'variants' => 'Varian',
 
+'navigation-heading' => 'Menu navigasi',
 'errorpagetitle' => 'Kasalahan',
 'returnto' => 'Bali menyang $1.',
 'tagline' => 'Saka {{SITENAME}}',
@@ -447,12 +448,9 @@ Pangurus sing ngopèni kuwi ngawedharaké: "$3".',
 # Login and logout pages
 '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.
+Sampéyan bisa nganggo {{SITENAME}} sacara anonim, utawa bisa <span class='plainlinks'>[$1 mlebu log manèh]</span> kanthi jeneng panganggo sing padha utawa beda.
 
 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.',
 'yourname' => 'Asma pangangeman',
 'yourpassword' => 'Tembung sandhi:',
 'yourpasswordagain' => 'Balènana tembung sandhi',
@@ -675,7 +673,7 @@ Yèn ora sengaja tekan kéné, bisa ngeklik pencètan '''back''' waé ing panjla
 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].',
+utawa <span class="plainlinks">[{{fullurl:{{#Special:Log}}|kaca={{urlencode:{{FULLPAGENAME}}}}}} nggolèki log sing kaitan]</span>, nanging Sampéyan ora nduwèni idin nggawé kaca iki.',
 'missing-revision' => 'Benahan #$1 saka kaca ajeneng "{{PAGENAME}}" ora ana.
 
 Iki biasané kasebabaké pranala riwayat sing kedaluwarsa saka kaca kuwi wis dibusak.
@@ -1022,8 +1020,6 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 'search-interwiki-caption' => 'Proyèk-proyèk kagandhèng',
 'search-interwiki-default' => 'Pituwas $1:',
 'search-interwiki-more' => '(luwih akèh)',
-'search-mwsuggest-enabled' => 'mawa sugèsti',
-'search-mwsuggest-disabled' => 'ora ana sugèsti',
 'search-relatedarticle' => 'Kagandhèng',
 'mwsuggest-disable' => 'Patènana sugèsti AJAX',
 'searcheverything-enable' => 'Golèki ing kabèh bilik-jeneng',
@@ -1056,7 +1052,7 @@ Rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLP
 
 # Preferences page
 'preferences' => 'Preferensi (pilihan)',
-'mypreferences' => 'Préferènsiku',
+'mypreferences' => 'Préferènsi',
 'prefs-edits' => 'Gunggungé suntingan:',
 'prefsnologin' => 'Durung mlebu log',
 'prefsnologintext' => 'Panjenengan kudu <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}}| mlebu log]</span> kanggo ngowahin préferènsi njenengan.',
@@ -1964,7 +1960,7 @@ Alamat layang-e sing panjenengan lebokaké ing [[Special:Preferences|préferèsi
 
 # Watchlist
 'watchlist' => 'Daftar artikel pilihan',
-'mywatchlist' => 'Daftar pangawasanku',
+'mywatchlist' => 'Daftar pangawasan',
 'watchlistfor2' => 'Kanggo $1 $2',
 'nowatchlist' => 'Daftar pangawasan panjenengan kosong.',
 'watchlistanontext' => 'Mangga $1 kanggo mirsani utawa nyunting daftar pangawasan panjenengan.',
@@ -2000,11 +1996,7 @@ Owah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhè
 
 'enotif_mailer' => 'Pangirim Notifikasi {{SITENAME}}',
 'enotif_reset' => 'Tandhanana kabèh kaca sing wis ditiliki',
-'enotif_newpagetext' => 'Iki sawijining kaca anyar.',
 'enotif_impersonal_salutation' => 'Panganggo {{SITENAME}}',
-'changed' => 'kaubah',
-'created' => 'kadamel',
-'enotif_subject' => 'Kaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED déning $PAGEEDITOR',
 'enotif_lastvisited' => 'Deleng $1 kanggo kabèh owah-owahan wiwit pungkasan panjenengan niliki.',
 'enotif_lastdiff' => 'Tilikana $1 kanggo mirsani owah-owahan iki.',
 'enotif_anon_editor' => 'panganggo anonim $1',
@@ -2216,7 +2208,7 @@ $1',
 # Contributions
 'contributions' => 'Sumbangan panganggo',
 'contributions-title' => 'Kontribusi panganggo kanggo $1',
-'mycontris' => 'Kontribusiku',
+'mycontris' => 'Kontribusi',
 'contribsub2' => 'Kanggo $1 ($2)',
 'nocontribs' => 'Ora ditemokaké owah-owahan sing cocog karo kritéria kasebut iku.',
 'uctop' => ' (dhuwur)',
@@ -2257,7 +2249,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 pangalihan-pangalihan',
 'whatlinkshere-hidetrans' => '$1 transklusi',
 'whatlinkshere-hidelinks' => 'pranala-pranala $1',
-'whatlinkshere-hideimages' => '$1 pranala-pranala berkas',
+'whatlinkshere-hideimages' => '$1 pranala berkas',
 'whatlinkshere-filters' => 'Filter-filter',
 
 # Block/unblock
@@ -2591,7 +2583,6 @@ Simpen nèng komputer Sampéyan lan unggaha nèng kéné.',
 
 # 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".',
@@ -2696,11 +2687,22 @@ Mbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.',
 
 # Info page
 'pageinfo-title' => 'Inpormasi kanggo "$1"',
-'pageinfo-header-edits' => 'Suntingan',
+'pageinfo-header-edits' => 'Riwayat suntingan',
 'pageinfo-views' => 'Cacahing delokan',
-'pageinfo-watchers' => 'Cacahing pangawas',
-'pageinfo-edits' => 'Cacahing suntingan',
-'pageinfo-authors' => 'Cacahing beda-beda panganggit',
+'pageinfo-watchers' => 'Cacahé pangawas kaca',
+'pageinfo-lasttime' => 'Tanggal suntingan pungkasan',
+'pageinfo-edits' => 'Cacahé kabèh suntingan',
+'pageinfo-authors' => 'Cacahé kabèh panganggit sing bédha-bédha.',
+'pageinfo-recent-edits' => 'Cacahé suntingan saiki (ing $1 kapungkur)',
+'pageinfo-recent-authors' => 'Cacahé panganggit sing bédha-bédha saiki',
+'pageinfo-magic-words' => '{{PLURAL:$1|Tembung|Tembung}} mujarab ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Katégori|Katégori}} kadhelikaké ($1)',
+'pageinfo-toolboxlink' => 'Informasi kaca',
+'pageinfo-redirectsto' => 'Dialihaké dhateng',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Diétung minangka satunggaling kaca isi',
+'pageinfo-contentpage-yes' => 'Iya',
+'pageinfo-protect-cascading-yes' => 'Iya',
 
 # Patrolling
 'markaspatrolleddiff' => 'Tandhanana wis dipatroli',
@@ -3340,7 +3342,7 @@ Panjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan
 '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-poweredby-others' => 'liyané',
 'version-software' => "''Software'' wis diinstalasi",
 'version-software-product' => 'Prodhuk',
 'version-software-version' => 'Vèrsi',
@@ -3473,9 +3475,9 @@ Gambar dituduhaké mawa résolusi kebak lan tipe liyané berkas bakal dibuka lan
 '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-newusers' => 'Akun panganggo $1 digawé',
+'logentry-newusers-create' => 'Akun panganggo $1 digawé',
+'logentry-newusers-create2' => 'Akun panganggo $3 digawé déning $1',
 'logentry-newusers-autocreate' => 'Akun $1 digawé otomatis',
 'newuserlog-byemail' => 'tembung sandhi wis dikirim liwat e-mail',
 
@@ -3495,6 +3497,10 @@ Utawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal
 'feedback-bugcheck' => 'Apik! Pesthèké kuwi dudu sawijining [$1 bug sing dingertèni].',
 'feedback-bugnew' => 'Aku wis mriksa. Kandakaké bug anyar',
 
+# Search suggestions
+'searchsuggest-search' => 'Golèk',
+'searchsuggest-containing' => 'ngisi...',
+
 # API errors
 'api-error-badaccess-groups' => 'Sampéyan ora dililakaké ngunggah berkas nèng wiki iki.',
 'api-error-badtoken' => 'Kasalahan njero: Token èlèk.',
index 83aa23e..6678bb9 100644 (file)
@@ -215,7 +215,7 @@ $messages = array(
 
 'underline-always' => 'მუდამ',
 'underline-never' => 'არასდროს',
-'underline-default' => 'á\83\91á\83 á\83\90á\83£á\83\96á\83\94á\83 á\83\98á\83¡ á\83£á\83\9eá\83\98á\83 á\83\9dá\83\91á\83\9d á\83\90á\83 á\83©á\83\94á\83\95á\83\90á\83\9cá\83\98',
+'underline-default' => 'á\83\93á\83\90á\83\9bá\83\9dá\83\99á\83\98á\83\93á\83\94á\83\91á\83£á\83\9aá\83\98 á\83\9bá\83\9dá\83\9bá\83®á\83\9bá\83\90á\83 á\83\94á\83\91á\83\94á\83\9aá\83\96á\83\94 á\83\90á\83\9c á\83\91á\83 á\83\90á\83£á\83\96á\83\94á\83 á\83\98á\83¡ á\83\90á\83 á\83©á\83\94á\83\95á\83\90á\83\9cá\83\96á\83\94',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'რედაქტირების არის შრიფტის ტიპი:',
@@ -303,8 +303,8 @@ $messages = array(
 'newwindow' => '(ახალ ფანჯარაში)',
 'cancel' => 'გაუქმება',
 'moredotdotdot' => 'ვრცლად...',
-'mypage' => 'á\83©á\83\94á\83\9bá\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\98',
-'mytalk' => 'á\83©á\83\94á\83\9bá\83\98 á\83\92á\83\90á\83\9cá\83®á\83\98á\83\9aá\83\95á\83\90',
+'mypage' => 'გვერდი',
+'mytalk' => 'განხილვა',
 'anontalk' => 'ამ IP-ს განხილვა',
 'navigation' => 'ნავიგაცია',
 'and' => '&#32;და',
@@ -314,7 +314,6 @@ $messages = array(
 'qbbrowse' => 'გადახედე',
 'qbedit' => 'რედაქტირება',
 'qbpageoptions' => 'ეს გვერდი',
-'qbpageinfo' => 'კონტექსტი',
 'qbmyoptions' => 'ჩემი გვერდები',
 'qbspecialpages' => 'სპეციალური გვერდები',
 'faq' => 'ხშირი შეკითხვები',
@@ -327,7 +326,7 @@ $messages = array(
 'vector-action-protect' => 'დაცვა',
 'vector-action-undelete' => 'აღდგენა',
 'vector-action-unprotect' => 'დაცვის დონის შეცვლა',
-'vector-simplesearch-preference' => 'á\83«á\83\94á\83\91á\83\9cá\83\98á\83¡ á\83\92á\83\90á\83¤á\83\90á\83 á\83\97á\83\9dá\83\94á\83\91á\83£á\83\9aá\83\98 á\83\9bá\83\98á\83\9cá\83\98á\83¨á\83\9cá\83\94á\83\91á\83\94á\83\91ის ჩართვა (მხოლოდ ვექტორული იერსახისთვის)',
+'vector-simplesearch-preference' => 'á\83«á\83\94á\83\91á\83\9cá\83\98á\83¡ á\83\92á\83\90á\83¤á\83\90á\83 á\83\97á\83\9dá\83\94á\83\91á\83£á\83\9aá\83\98 á\83\95á\83\94á\83\9aის ჩართვა (მხოლოდ ვექტორული იერსახისთვის)',
 'vector-view-create' => 'შექმნა',
 'vector-view-edit' => 'რედაქტირება',
 'vector-view-history' => 'ისტორია',
@@ -337,6 +336,7 @@ $messages = array(
 'namespaces' => 'სახელთა სივრცე',
 'variants' => 'ვარიანტები',
 
+'navigation-heading' => 'სანავიგაციო მენიუ',
 'errorpagetitle' => 'შეცდომა',
 'returnto' => 'დაბრუნდი $1-ზე.',
 'tagline' => '{{SITENAME}} გვერდიდან',
@@ -551,7 +551,7 @@ $1',
 'viewsource-title' => 'იხილეთ წყარო გვერდისთვის $1',
 'actionthrottled' => 'სიჩქარის შეზღუდვა.',
 'actionthrottledtext' => 'სპამთან ბრძოლასთან დაკავშირებით აკრძალულია შემდეგი მონაცემების მრავალჯერ გამეორება. გთხოვთ გაიმეოროთ იგი მოგვიანებით.',
-'protectedpagetext' => 'ეს გვერდი დაბლოკილია რედაქტირებისთვის.',
+'protectedpagetext' => 'á\83\94á\83¡ á\83\92á\83\95á\83\94á\83 á\83\93á\83\98 á\83\93á\83\90á\83\91á\83\9aá\83\9dá\83\99á\83\98á\83\9aá\83\98á\83\90 á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡ á\83\90á\83\9c á\83¡á\83®á\83\95á\83\90 á\83\9bá\83\9dá\83¥á\83\9bá\83\94á\83\93á\83\94á\83\91á\83\98á\83¡á\83\90á\83\97á\83\95á\83\98á\83¡.',
 'viewsourcetext' => 'თქვენ შეგიძლიათ ნახოთ ამ გვერდის საწყისი ფაილი და მისი ასლი შექმნათ:',
 'viewyourtext' => "თქვენ შეგიძლიათ იხილოთ და დააკოპიროთ  '''თქვენი რედაქტირებების''' საწყისი ტექსტი ამ გვერდზე:",
 'protectedinterface' => 'ეს გვერდი წარმოადგენს ტექსტურ ინტერფეისს პროგრამული უზრუნველყოფისათვის და დაცულია ვანდალიზმის აღკვეთის მიზნით.',
@@ -584,10 +584,10 @@ $2',
 'logouttext' => "'''თქვენ ამჟამად სისტემიდან გასული ხართ.'''
 
 შეგიძლიათ გამოიყენოთ {{SITENAME}} ანონიმურად, ან შეგიძლიათ
-[[Special:UserLogin|შეხვიდეთ ისევ]] როგორც იგივე ან სხვა მომხმარებელი.
+<span class='plainlinks'>[$1 შეხვიდეთ ისევ]</span> როგორც იგივე ან სხვა მომხმარებელი.
 შენიშნეთ, რომ ზოგიერთ გვერდზე შესაძლოა ისევ უჩვენებდეს რომ შესული ხართ სანამ თქვენი ბრაუზერის მეხსიერებას არ გაწმენდთ.",
-'welcomecreation' => '== მოგესალმებით, $1! ==
-თქვენი ანგარიში შექმნილია.
+'welcomeuser' => 'მოგესალმებით, $1!',
+'welcomecreation-msg' => 'თქვენი ანგარიში შექმნილია.
 არ დაგავიწყდეთ თქვენი [[Special:Preferences|{{SITENAME}}-ის კონფიგურაციის]] შეცვლა.',
 'yourname' => 'მომხმარებელი:',
 'yourpassword' => 'პაროლი:',
@@ -854,8 +854,12 @@ $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>',
+თქვენ შეგიძლიათ [[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' => 'ეს მომხმარებელი უკვე დაიბლოკა.
@@ -878,7 +882,7 @@ $2
 'note' => "'''შენიშვნა:'''",
 'previewnote' => "'''დაიმახსოვრეთ, ეს მხოლოდ წინასწარი გადახედვაა.'''
 თქვენი ცვლილებები ჯერ არ შენახულა!",
-'continue-editing' => 'á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83\92á\83 á\83«á\83\94á\83\9aá\83\94á\83\91ა',
+'continue-editing' => 'á\83 á\83\94á\83\93á\83\90á\83¥á\83¢á\83\98á\83 á\83\94á\83\91á\83\90á\83\96á\83\94 á\83\92á\83\90á\83\93á\83\90á\83¡á\83\95á\83\9aა',
 'previewconflict' => 'შავი ნიმუში უჩვენებს ტექსტს ზედა რედაქტირების ფანჯარაში, როგორც ის გამოჩნდება თუ თქვენ მას შეინახავთ.',
 'session_fail_preview' => "'''უკაცრავად! ვერ შევძელით თქვენი რედაქტირების შენახვა სესიის მონაცემთა დაკარგვის გამო.
 გთხოვთ ისევ სცადოთ.
@@ -956,6 +960,15 @@ $2
 'edit-already-exists' => 'ახალი გვერდის შექმნა არ მოხერხდა.
 ის უკვე არსებობს.',
 'defaultmessagetext' => 'შეტყობინების სტანდარტული ტექსტი',
+'content-failed-to-parse' => '$2-ის შინაარსი არ შეესაბამება $1-ის ტიპს: $3.',
+'invalid-content-data' => 'დაუშვებელი მონაცემები',
+'content-not-allowed-here' => '„$1“-ის შინაარსი დაუშვებელია [[$2]] გვერდზე',
+
+# Content models
+'content-model-wikitext' => 'ვიკიტექსტი',
+'content-model-text' => 'უბრალო ტექსტი',
+'content-model-javascript' => 'ჯავასკრიპტი',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'ყურადღება. მოცემული გვერდი შეიცავს ძალიან ბევრ მძიმე ფუნქციას.
@@ -1165,6 +1178,10 @@ $1",
 'editundo' => 'გაუქმება',
 'diff-multi' => '({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}} არ არის ნაჩვენები.)',
 'diff-multi-manyusers' => '({{PLURAL:$2|ერთი მომხმარებლის|$2 მომხმარებლების}} {{PLURAL:$1|ერთი შუალედური ვერსია|$1 შუალედური ვერსიები}}, რომლებიც არ არის ნაჩვენები.)',
+'difference-missing-revision' => '{{PLURAL:$2|$2 ვერსია}} ამ შედარებისათვის ($1) {{PLURAL:$2|ვერ მოიძებნა}}.
+
+ეს ჩვეულებრივ ხდება მაშინ, თუ ვერსიების შედარების მოძველებული ბმულით გადადიხართ გვერდზე, რომელიც წაიშალა.
+დეტალური ინფორმაცია შესაძლებელია იყოს [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} წაშლების ჟურნალში].',
 
 # Search results
 'searchresults' => 'ძიების შედეგები',
@@ -1207,8 +1224,6 @@ $1",
 'search-interwiki-caption' => 'დობილი პროექტები',
 'search-interwiki-default' => 'შედეგები $1-დან:',
 'search-interwiki-more' => '(გაგრძელება)',
-'search-mwsuggest-enabled' => 'რჩევებით',
-'search-mwsuggest-disabled' => 'რჩევების გარეშე',
 'search-relatedarticle' => 'დაკავშირებული',
 'mwsuggest-disable' => 'გათიშეთ AJAX დახმარებები',
 'searcheverything-enable' => 'ძიება სახელთა ყველა სივრცეებში',
@@ -1242,7 +1257,7 @@ $1",
 
 # Preferences page
 'preferences' => 'კონფიგურაცია',
-'mypreferences' => 'á\83©á\83\94á\83\9bá\83\98 á\83\99á\83\9dá\83\9cá\83¤á\83\98á\83\92á\83£á\83 á\83\90á\83ªá\83\98á\83\90',
+'mypreferences' => 'კონფიგურაცია',
 'prefs-edits' => 'რედაქციების რაოდენობა:',
 'prefsnologin' => 'შესული არ ხართ',
 'prefsnologintext' => 'თქვენ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} რეგისტრირებული უნდა იყოთ]</span> მომხმარებლის კონფიგურაციის შესაცვლელად.',
@@ -1371,7 +1386,7 @@ $1",
 'userrights-editusergroup' => 'რედაქტირება გაუკეთეთ მომხმარებელთა ჯგუფებს',
 'saveusergroups' => 'მომხმარებელთა ჯგუფების შენახვა',
 'userrights-groupsmember' => 'ჯგუფის წევრი:',
-'userrights-groupsmember-auto' => 'á\83\92á\83\90á\83£á\83\92á\83\94á\83\91á\83\90á\83 ი წევრი:',
+'userrights-groupsmember-auto' => 'á\83\9cá\83\90á\83\92á\83£á\83\9aá\83\98á\83¡á\83®á\83\9bá\83\94á\83\95ი წევრი:',
 'userrights-groups-help' => 'თქვენ შეგიძლიათ შეცვალოთ ჯგუფები, რომელშიც შედის ეს მომხმარებელი.
 * თუ ჯგუფის სახელწოდებასთან გაკეთებულია ნიშნული, ე.ი მომხმარებელი შედის ამ ჯგუფში.
 * თუ ნიშნული არ არის – მომხმარებელი არ განეკუთვნება არსებულ ჯგუფს.
@@ -1476,6 +1491,9 @@ $1",
 'rightslogtext' => 'მომხმარებელთა უფლებების ცვლილებათა ჟურბალი',
 'rightslogentry' => 'შესწორდა მომხმარებლის ჯგუფები $1  $2-დან  $3-ზე',
 'rightslogentry-autopromote' => 'ავტომატურად იქნა გადაყვანილი $2–დან $3–ში',
+'logentry-rights-rights' => '$1 შეცვალა ჯგუფის წევრობა $3-თვის $4-დან $5-ზე',
+'logentry-rights-rights-legacy' => '$1 შეცვალა ჯგუფის წევრობა $3-თვის',
+'logentry-rights-autopromote' => '$1 ავტომატურად იქნა გადაყვანილი $4–დან $5–ში',
 'rightsnone' => '(არცერთი)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1647,7 +1665,7 @@ $1",
 თუ თქვენ მაინც გსურთ მისი ატვირთვა დაბრუნდით უკან და ატვირთეთ სხვა სახელით. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'ფაილი ამ სახელწოდებით უკვე არსებობს ფაილების საერთო საცავში. თუ შეიძლება, უკან დაბრუნდით და ჩატვირთეთ ფაილი სხვა სახელწოდებით. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'ეს ფაილი არის შემდეგი {{PLURAL:$1|შემდეგი ფაილის|сშემდეგი ფაილების}} დუბლიკატი:',
-'file-deleted-duplicate' => 'á\83\9bá\83¡á\83\92á\83\90á\83\95á\83¡á\83\98 á\83¤á\83\90á\83\98á\83\9aá\83\98 ([[:$1]]) á\83£á\83\99á\83\95á\83\94 á\83¬á\83\90á\83¨á\83\9aá\83\98á\83\9aá\83\90. á\83\92á\83\97á\83®á\83\9dá\83\95á\83\97, á\83\92á\83\90á\83\94á\83ªá\83\90á\83\9cá\83\98á\83\97 á\83¤á\83\90á\83\98á\83\9aá\83\98á\83¡ á\83¬á\83\90á\83¨á\83\9aá\83\98á\83¡ á\83\98á\83¡á\83¢á\83\9dá\83 á\83\98á\83\90á\83¡, á\83\9bá\83\90á\83\9cá\83\90á\83\9bá\83\93á\83\94 á\83\95á\83\98á\83\93á\83 á\83\94 á\83\9bá\83\90á\83¡ á\83®á\83\94á\83\9aá\83\9bá\83\94á\83\9dá\83 á\83\94á\83\93 á\83\90á\83¢á\83\95á\83\98á\83 á\83¢ავთ.',
+'file-deleted-duplicate' => 'á\83\9bá\83¡á\83\92á\83\90á\83\95á\83¡á\83\98 á\83¤á\83\90á\83\98á\83\9aá\83\98 ([[:$1]]) á\83£á\83\99á\83\95á\83\94 á\83¬á\83\90á\83¨á\83\9aá\83\98á\83\9aá\83\90. á\83\92á\83\97á\83®á\83\9dá\83\95á\83\97, á\83\92á\83\90á\83\94á\83ªá\83\90á\83\9cá\83\98á\83\97 á\83¤á\83\90á\83\98á\83\9aá\83\98á\83¡ á\83¬á\83\90á\83¨á\83\9aá\83\98á\83¡ á\83\98á\83¡á\83¢á\83\9dá\83 á\83\98á\83\90á\83¡, á\83\9bá\83\90á\83\9cá\83\90á\83\9bá\83\93á\83\94 á\83\95á\83\98á\83\93á\83 á\83\94 á\83\9bá\83\90á\83¡ á\83®á\83\94á\83\9aá\83\9bá\83\94á\83\9dá\83 á\83\94á\83\93 á\83\90á\83¢á\83\95á\83\98á\83 á\83\97ავთ.',
 'uploadwarning' => 'გადატვირთვის შეხსენება',
 'uploadwarning-text' => 'გთხოვთ ჩაასწოროთ ფაილის აღწერა ქვევით და ხელმეორედ სცადოთ.',
 'savefile' => 'ფაილის შენახვა',
@@ -1703,6 +1721,7 @@ $1',
 'backend-fail-notsame' => 'უკვე არსებობს  ფაილი $1, რომელიც არაა იდენტური.',
 'backend-fail-invalidpath' => '$1 არ წარმოადგენს შენახვის ხელმისაწვდომ გზას.',
 'backend-fail-delete' => 'ფაილი $1-ის წაშლა ვერ მოხერხდა.',
+'backend-fail-describe' => 'შეუძლებელია მეტამონაცემების შეცვლა ფაილისათვის „$1“',
 'backend-fail-alreadyexists' => 'ფაილი $1 უკვე არსებობს.',
 'backend-fail-store' => 'ფაილი $1-ის შენახვა $2-ზე ვერ მოხერხდა.',
 'backend-fail-copy' => 'ფაილი $1-ის კოპირება $2-ში ვერ მოხერხდა.',
@@ -1833,8 +1852,8 @@ $1',
 'filehist-missing' => 'ფაილი ვერ მოიძებნა',
 'imagelinks' => 'ფაილის გამოყენება',
 'linkstoimage' => 'მომდევნო {{PLURAL:$1|გვერდი|გვერდები}} ებმის ამ ფაილს:',
-'linkstoimage-more' => '$1-á\83\96á\83\94 á\83\9bá\83\94á\83¢á\83\98 {{PLURAL:$1|á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98\83¤ვერდების|გვერდები}} რომლებსაც აქვთ ბმულები ამ ფაილზე.
-В данном списке {{PLURAL:$1|წარმოდგენილია მხოლოდ $1 ბმული|წარმოდგენილია მხოლოდ $1 ბმულები|წარმოდგენილია მხოლოდ $1 ბმულების}} ამ ფაილზე
+'linkstoimage-more' => '$1-á\83\96á\83\94 á\83\9bá\83\94á\83¢á\83\98 {{PLURAL:$1|á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98\83\92ვერდების|გვერდები}} რომლებსაც აქვთ ბმულები ამ ფაილზე.
+მოცემულ სიაში {{PLURAL:$1|წარმოდგენილია მხოლოდ $1 ბმული|წარმოდგენილია მხოლოდ $1 ბმულები|წარმოდგენილია მხოლოდ $1 ბმულების}} ამ ფაილზე.
 შეგიძლიათ ნახოთ ასევე [[Special:WhatLinksHere/$2|სრული სია]].',
 'nolinkstoimage' => 'არ არსებობს ამ ფაილთან დაკავშირებული გვერდები.',
 'morelinkstoimage' => 'იხილეთ [[Special:WhatLinksHere/$1|სხვა ბმულები]] ამ ფაილზე.',
@@ -1855,7 +1874,7 @@ $1',
 'shared-repo-from' => ' $1-დან',
 'shared-repo' => 'საერთო საცავიდან',
 'shared-repo-name-wikimediacommons' => 'ვიკისაწყობი',
-'upload-disallowed-here' => 'á\83¡á\83\90á\83\9bá\83¬á\83£á\83®á\83\90á\83 á\83\9dá\83\93, á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\90á\83\9b á\83¡á\83£á\83 á\83\90á\83\97ზე გადაწერა.',
+'upload-disallowed-here' => 'á\83\97á\83¥á\83\95á\83\94á\83\9c á\83\90á\83  á\83¨á\83\94á\83\92á\83\98á\83«á\83\9aá\83\98á\83\90á\83\97 á\83\90á\83\9b á\83¤á\83\90á\83\98á\83\9aზე გადაწერა.',
 
 # File reversion
 'filerevert' => 'დააბრუნე $1',
@@ -1889,7 +1908,7 @@ $1',
 
 # MIME search
 'mimesearch' => 'MIME ძიება',
-'mimesearch-summary' => 'ამ გვერდის მეშვეობით ესაძლებელია ფაილების მოძიება მათი MIME-ტიპის მიხედვით. შეტანის ფორმა: შიგთავსის ტიპი/ქვეტიპი, მაგ <code>image/jpeg</code>.',
+'mimesearch-summary' => 'á\83\90á\83\9b á\83\92á\83\95á\83\94á\83 á\83\93á\83\98á\83¡ á\83\9bá\83\94á\83¨á\83\95á\83\94á\83\9dá\83\91á\83\98á\83\97 á\83¨á\83\94á\83¡á\83\90á\83«á\83\9aá\83\94á\83\91á\83\94á\83\9aá\83\98á\83\90 á\83¤á\83\90á\83\98á\83\9aá\83\94á\83\91á\83\98á\83¡ á\83\9bá\83\9dá\83«á\83\98á\83\94á\83\91á\83\90 á\83\9bá\83\90á\83\97á\83\98 MIME-á\83¢á\83\98á\83\9eá\83\98á\83¡ á\83\9bá\83\98á\83®á\83\94á\83\93á\83\95á\83\98á\83\97. á\83¨á\83\94á\83¢á\83\90á\83\9cá\83\98á\83¡ á\83¤á\83\9dá\83 á\83\9bá\83\90: á\83¨á\83\98á\83\92á\83\97á\83\90á\83\95á\83¡á\83\98á\83¡ á\83¢á\83\98á\83\9eá\83\98\83¥á\83\95á\83\94á\83¢á\83\98á\83\9eá\83\98, á\83\9bá\83\90á\83\92 <code>image/jpeg</code>.',
 'mimetype' => 'MIME ტიპი:',
 'download' => 'გადმოტვირთვა',
 
@@ -1920,7 +1939,7 @@ $1',
 'statistics-header-views' => 'გვერდის მონახულების სტატისტიკა',
 'statistics-header-users' => 'მომხმარებლის სტატისტიკა',
 'statistics-header-hooks' => 'სხვა სტატისტიკა',
-'statistics-articles' => 'á\83¡á\83¢á\83\90á\83¢á\83\98á\83\94á\83\91á\83\98á\83¡',
+'statistics-articles' => 'á\83¡á\83¢á\83\90á\83¢á\83\98á\83\90',
 'statistics-pages' => 'გვერდები',
 'statistics-pages-desc' => 'ვიკის ყველა გვერდი, განხილვის, გადამისამართების და სხვ. ჩათვლით.',
 'statistics-files' => 'ატვირთული ფაილები',
@@ -1931,7 +1950,7 @@ $1',
 'statistics-views-peredit' => 'შესწორებათა ხილვა',
 'statistics-users' => 'დარეგისტრირებული [[Special:ListUsers|მომხმარებლები]]',
 'statistics-users-active' => 'აქტიური მომხმარებლები',
-'statistics-users-active-desc' => 'მომხმარებლები, რომლებმაც განახორციელეს ქმედება  {{PLURAL:$1|ბოლო $1 დღე|ბოლო  $1 დღის|ბოლო $1 დღეების}}',
+'statistics-users-active-desc' => 'მომხმარებლები, რომლებმაც განახორციელეს ქმედება {{PLURAL:$1|ბოლო $1 დღის|ბოლო $1 დღის}} განმავლობაში',
 'statistics-mostpopular' => 'ყველზე ხშირად ხილვადი გვერდები',
 
 'disambiguations' => 'გვერდები, რომელთაც აქვთ ბმული მრავალმნიშვნელოვან გვერდებზე',
@@ -2005,7 +2024,7 @@ $1',
 'protectedpages-indef' => 'მხოლოდ უვადო დაცვები',
 'protectedpages-cascade' => 'მხოლოდ კასკადური დაცვა',
 'protectedpagestext' => 'შემდეგი გვერდები დაცულია გადატანისა თუ ცვლილებებისგან.',
-'protectedpagesempty' => 'ამ დროისთვის არ არსებობს დაცული გვერდები მოთხოვნილი პარამეტრეით.',
+'protectedpagesempty' => 'á\83\90á\83\9b á\83\93á\83 á\83\9dá\83\98á\83¡á\83\97á\83\95á\83\98á\83¡ á\83\90á\83  á\83\90á\83 á\83¡á\83\94á\83\91á\83\9dá\83\91á\83¡ á\83\93á\83\90á\83ªá\83£á\83\9aá\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98 á\83\9bá\83\9dá\83\97á\83®á\83\9dá\83\95á\83\9cá\83\98á\83\9aá\83\98 á\83\9eá\83\90á\83 á\83\90á\83\9bá\83\94á\83¢á\83 á\83\94á\83\91á\83\98á\83\97.',
 'protectedtitles' => 'დაცული სათაურები',
 'protectedtitlestext' => 'შემდეგი სახელების გამოყენება არ შეიძლება',
 'protectedtitlesempty' => 'ამ დროისთვის არ არსებობს მოთხოვნილი გვერდები მოცემული პარამეტრებით.',
@@ -2093,9 +2112,9 @@ $1',
 'linksearch-pat' => 'ძიების თარგი:',
 'linksearch-ns' => 'სახელთა სივრცე:',
 'linksearch-ok' => 'ძიება',
-'linksearch-text' => 'შესაძლებელია გამოიყენოთ ქვეხაზოვანი სიმბოლოები, მაგალითად, <code>*.wikipedia.org</code>.
-უკიდურეს შემთხვევაში საჭიროა ზედა დონის დომენი, მაგალითად <code>*.org</code><br />
\83\9bá\83®á\83\90á\83 á\83\93á\83\90á\83\9bá\83­á\83\94á\83 á\83\98 á\83\9eá\83 á\83\9dá\83¢á\83\9dá\83\99á\83\9dá\83\9aá\83\94á\83\91á\83\98: <code>$1</code> (á\83\90á\83  á\83\93á\83\90á\83\90á\83\9bá\83\90á\83¢á\83\9dá\83¡ á\83\9cá\83\94á\83\91á\83\98á\83¡á\83\9bá\83\98á\83\94á\83 á\83\98 á\83\9bá\83\90á\83\97á\83\92á\83\90á\83\9cá\83\98 á\83\97á\83¥á\83\95á\83\94á\83\9c á\83¡á\83\98á\83\90á\83¨ი)',
+'linksearch-text' => 'შესაძლებელია გამოიყენოთ ქვეხაზოვანი სიმბოლოები, მაგალითად, "*.wikipedia.org".
+უკიდურეს შემთხვევაში საჭიროა ზედა დონის დომენი, მაგალითად "*.org"<br />
\83\9bá\83®á\83\90á\83 á\83\93á\83\90á\83\9bá\83­á\83\94á\83 á\83\98 á\83\9eá\83 á\83\9dá\83¢á\83\9dá\83\99á\83\9dá\83\9aá\83\94á\83\91á\83\98: <code>$1</code> (á\83¡á\83¢á\83\90á\83\9cá\83\93á\83\90á\83 á\83¢á\83£á\83\9aá\83\90á\83\93 http:// á\83\97á\83£á\83\99á\83\98 á\83\9eá\83 á\83\9dá\83¢á\83\9dá\83\99á\83\9dá\83\9aá\83\98 á\83\90á\83  á\83\90á\83 á\83\98á\83¡ á\83\9bá\83\98á\83\97á\83\98á\83\97á\83\94á\83\91á\83£á\83\9aი)',
 'linksearch-line' => 'ბმულები $1-ზე  $2-დან',
 'linksearch-error' => 'წარმოდგენილი სიმბოლოების გამოყენება შესაძლებელია მხოლოდ მისამართის დასაწყისში.',
 
@@ -2135,7 +2154,7 @@ $1',
 'listgrouprights-addgroup-all' => 'ჩაამატეთ ყველა ჯგუფი',
 'listgrouprights-removegroup-all' => 'ყველა ჯგუფის წაშლა',
 'listgrouprights-addgroup-self' => 'შეუძლია ჩაუმატოს {{PLURAL:$2|ჯგუფი|ჯგუფები}} თავის ანგარიშს: $1',
-'listgrouprights-removegroup-self' => 'á\83¨á\83\94á\83£á\83«á\83\9aá\83\98á\83\90 á\83¬á\83\90á\83¨á\83\90á\83\9aá\83\9dá\83¡ {{PLURAL:$2|á\83¯á\83\92á\83§á\83¤á\83£|ჯგუფები}} თავისი ანგარიშიდან: $1',
+'listgrouprights-removegroup-self' => 'á\83¨á\83\94á\83£á\83«á\83\9aá\83\98á\83\90 á\83¬á\83\90á\83¨á\83\90á\83\9aá\83\9dá\83¡ {{PLURAL:$2|á\83¯á\83\92á\83£á\83¤á\83\98|ჯგუფები}} თავისი ანგარიშიდან: $1',
 'listgrouprights-addgroup-self-all' => 'შეუძლია ყელა ჯგუფია ჩამატება ანგარიშს.',
 'listgrouprights-removegroup-self-all' => 'შეუძლია თავისი ანგარიშის ყველა ჯგუფის წაშლა.',
 
@@ -2146,7 +2165,7 @@ $1',
 'emailuser-title-target' => 'ელ. ფოსტის მიწერა {{GENDER:$1|მომხმარებელთან}}',
 'emailuser-title-notarget' => 'ელ. ფოსტის გაგზავნა მომხმარებელთან',
 'emailpage' => 'ელ. ფოსტა მომხმარებელს',
-'emailpagetext' => 'თუ ამ მომხმარებელმა თავის პარამეტრებში ელ. ფოსტის მოქმედი მისამართი მიუთითა, ქვემოთ მოყვანილი ფორმის შევსებისას შეგიძლიათ მისთვის შეტყობინების გაგზავნა. ელ. ფოსტის მისამართი, რომელიც [[Special:Preferences|თქვენს პარამეტრებში]] მიუთითეთ, დაფიქსირდება „გამომგზავნის“ ველში, რათა ადრესატმა პასუხის გაცემა შეძლოს.',
+'emailpagetext' => 'თუ ამ მომხმარებელმა თავის პარამეტრებში ელ. ფოსტის მოქმედი მისამართი მიუთითა, ქვემოთ მოყვანილი ფორმის შევსებისას შეგიძლიათ {{GENDER:$1|მისთვის}} შეტყობინების გაგზავნა. ელ. ფოსტის მისამართი, რომელიც [[Special:Preferences|თქვენს პარამეტრებში]] მიუთითეთ, დაფიქსირდება „გამომგზავნის“ ველში, რათა ადრესატმა პასუხის გაცემა შეძლოს.',
 'usermailererror' => 'ელ. ფოსტა დაბრუნდა შეცდომის გამო:',
 'defemailsubject' => 'ელ-ფოსტა საიტის {{SITENAME}} მომხმარებლისგან „$1“',
 'usermaildisabled' => 'მომხმარებლის e-mail გათიშულია',
@@ -2178,7 +2197,7 @@ $1',
 
 # Watchlist
 'watchlist' => 'ჩემი კონტროლის სია',
-'mywatchlist' => 'á\83©á\83\94á\83\9bá\83\98 á\83\99á\83\9dá\83\9cá\83¢á\83 á\83\9dá\83\9aá\83\98á\83¡ á\83¡á\83\98á\83\90',
+'mywatchlist' => 'კონტროლის სია',
 'watchlistfor2' => '$1 ($2) თვის',
 'nowatchlist' => 'თქვენი კონტროლის სია ცარიელია.',
 'watchlistanontext' => '$1
@@ -2216,19 +2235,18 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}}. ელ. ფოსტით შეტყობინების სამსახური',
 'enotif_reset' => 'აღნიშნე ყველა გვერდი, როგორც გადასინჯული',
-'enotif_newpagetext' => 'ეს არის ახალი გვერდი.',
 'enotif_impersonal_salutation' => 'ვიკიპედიის მომხმარებელი',
-'changed' => 'შეცვლილი',
-'created' => 'შექმნილია',
-'enotif_subject' => '{{SITENAME}}: გვერდი $PAGETITLE $CHANGEDORCREATED იქნა მომხმარებლის $PAGEEDITOR მიერ',
+'enotif_subject_deleted' => 'გვერდი პროექტიდან „{{SITENAME}}“ სახელწოდებით „$1“ წაშალა {{gender:$2|მომხმარებელმა}} $2',
+'enotif_subject_created' => 'გვერდი პროექტიდან „{{SITENAME}}“ სახელწოდებით „$1“ შექმნა {{gender:$2|მომხმარებელმა}} $2',
+'enotif_subject_moved' => 'გვერდი პროექტიდან „{{SITENAME}}“ სახელწოდებით „$1“ გადაიტანა {{gender:$2|მომხმარებელმა}} $2',
+'enotif_subject_restored' => 'გვერდი პროექტიდან „{{SITENAME}}“ სახელწოდებით „$1“ აღადგინა {{gender:$2|მომხმარებელმა}} $2',
+'enotif_subject_changed' => 'გვერდი პროექტიდან „{{SITENAME}}“ სახელწოდებით „$1“ შეცვალა {{gender:$2|მომხმარებელმა}} $2',
 'enotif_lastvisited' => 'იხ. $1 ყველა ცვლილებისთვის თქვენი ბოლო შემოსვლის შემდეგ.',
 'enotif_lastdiff' => 'იხილეთ $1 ამ ცვლილების სანახავად.',
 'enotif_anon_editor' => 'ანონიმური მომხმარებელი $1',
-'enotif_body' => 'á\83\9eá\83\90á\83¢á\83\98á\83\95á\83ªá\83\94á\83\9bá\83£á\83\9aო $WATCHINGUSERNAME,
+'enotif_body' => 'á\83«á\83\95á\83\98á\83 á\83¤á\83\90á\83¡ო $WATCHINGUSERNAME,
 
-პროექტ "{{SITENAME}}"-ის გვერდი $PAGETITLE შეიცვალა $CHANGEDORCREATED $PAGEEDITDATE მომხმარებელ $PAGEEDITOR-ის მიერ, მინდინარე ვერსიის სანახავად იხილეთ $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 ცვლილების მოკლე აღწერა: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2236,10 +2254,9 @@ $NEWPAGE
 ელ.ფოსტა: $PAGEEDITOR_EMAIL
 ვიკი: $PAGEEDITOR_WIKI
 
-შემდგომი ცვლილებების შესახებ შეტყობინებების მისაღებად ამ გვერდს კვლავ უნდა ესტუმროთ.
-აგრეთვე შეგიძლიათ აღადგინოთ შეტყობინებათა პარამეტრები თქვენს კონტროლის სიაში შეტანილი ყველა საკონტროლო გვერდისათვის.
+შემდგომი ცვლილებების შესახებ შეტყობინებების მისაღებად ამ გვერდს კვლავ უნდა ესტუმროთ. თქვენ აგრეთვე შეგიძლიათ თქვენ კონტროლის სიაში გათიშოთ შეტყობინების ფუნქცია ყველა გვერდისათვის.
 
-             {{SITENAME}} შეტყობინებათა სისტემა
+                        {{SITENAME}} შეტყობინებათა სისტემა
 
 --
 შეტყობინების პარამეტრების ცვლილება
@@ -2288,7 +2305,7 @@ $UNWATCHURL
 იმოქმედეთ სიფრთხილით.',
 
 # Rollback
-'rollback' => 'á\83 á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83£á\83¥á\83\9bá\83\94á\83\91á\83\90',
+'rollback' => 'ცვლილებების გაუქმება',
 'rollback_short' => 'სწრაფი გაუქმება',
 'rollbacklink' => 'სწრაფი გაუქმება',
 'rollbacklinkcount' => '$1 {{PLURAL:$1|ცვლილების|ცვლილების}} გაუქმება',
@@ -2392,7 +2409,7 @@ $UNWATCHURL
 'undeleterevdel' => 'აღდგენა არ შესრულდება, თუ ის გამოიწვევს გვერდის ბოლო ვერსიის ან ფაილის ნაწილობრივ წაშლას.
 ასეთ შემთხვევაში თქვენ უნდა მოხსნათ ნიშნული ან აჩვენოთ ბოლო წაშლილი ვერსიები.',
 'undeletehistorynoadmin' => 'ეს სტატია წაშლილია. წაშლის მიზეზი ნაჩვენებია მოკლე ანოტაციაში ქვემოთ, იმ მომხმარებელთა დეტალებთან ერთად ვინც რედაქტირება გაუკეთა ამ გვერდს წაშლის წინ. იმ წაშლილი ტექსტების აქტუალური ვერსიები მიღწევადია მხოლოდ ადმინისტრატორებისათვის.',
-'undelete-revision' => 'წაიშალა ვერსია $1 ($4-დან  $5) მომხმარებლის $3:',
+'undelete-revision' => '$1-ის წაშლილი ვერსია ($5, $4-ის მდგომარეობით), შენახული მომხმარებლის $3 მიერ:',
 'undeleterevision-missing' => 'არასწორი ან არარსებული ვერსია. სავარაუდოდ ქვენ გადახვედით არასწორ ბმულზე, ან იგი წაიშალა არქივიდან.',
 'undelete-nodiff' => 'წინა ცვლილება ვერ ვიპოვეთ.',
 'undeletebtn' => 'აღდგენა',
@@ -2404,7 +2421,8 @@ $UNWATCHURL
 'undeletedrevisions' => '$1 ვერსია აღდგენილია',
 'undeletedrevisions-files' => '$1 ვერსია და $2 ფაილი აღდგენილია',
 'undeletedfiles' => '$1 ფაილი აღდგენილია',
-'cannotundelete' => 'წაშლის გაუქმება ვერ განხორციელდა; შესაძლოა თქვენამდე სხვამ უკვე გააუქმა წაშლა.',
+'cannotundelete' => 'წაშლის გაუქმება ვერ განხორციელდა: 
+$1',
 'undeletedpage' => "'''$1 აღდგენილია'''
 
 უკანასკნელი წაშლილთა და აღდგენის სია შეგიძლიათ ნახოთ [[Special:Log/delete|წაშლილთა სიაში]].",
@@ -2436,9 +2454,9 @@ $1',
 'blanknamespace' => '(მთავარი)',
 
 # Contributions
-'contributions' => 'მომხმარებლის წვლილი',
+'contributions' => '{{GENDER:$1|მომხმარებელი}} წვლილი',
 'contributions-title' => 'მომხმარებლის წვლილი $1',
-'mycontris' => 'á\83©á\83\94á\83\9bá\83\98 á\83¬á\83\95á\83\9aá\83\98á\83\9aá\83\98',
+'mycontris' => 'წვლილი',
 'contribsub2' => '$1 ($2) თვის',
 'nocontribs' => 'ძებნისას მითითებული პარამეტრების შესაბამისი არც ერთი ცვლილება ნაპოვნი არ არის',
 'uctop' => '(თავი)',
@@ -2698,6 +2716,7 @@ $1',
 'immobile-target-namespace-iw' => 'ინტერვიკის ბმული შეუძლებელია გამოყენებული იქნას გადარქმევისთვის.',
 'immobile-source-page' => 'ამ გვეერდის გადატანა შეუძლებელია.',
 'immobile-target-page' => 'შეუძლებელია მოცემულ სახელზე გადატანა.',
+'bad-target-model' => 'შეუძლებელია $1-ის გარდაქმნა $2-ზე: მონაცემების შეუსაბამო მოდელი.',
 'imagenocrossnamespace' => 'შეუძლებელია ფაილს მიეცეს სახელი სახელთა სხვა სივრციდან',
 'nonfile-cannot-move-to-file' => 'შეუძლებელია არაფაილების გადატანა ფაილის სახელთა სივრცეში',
 'imagetypemismatch' => 'ფაილს ახალი გაფართოება არ შეესაბამება მის ტიპს',
@@ -2822,7 +2841,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-ის ტესტირება',
-'javascripttest-disabled' => 'ეს ფუნქცია ამ ვიკიში არ ჩართულა.',
 'javascripttest-title' => 'მიმდინარეობს $1-ის ტესტირება',
 'javascripttest-pagetext-noframework' => 'ეს გვერდი დარეგისტრირებულია JavaScript-ის ტესტების გასაშვებად.',
 'javascripttest-pagetext-unknownframework' => '„$1-ის“ ტესტირების უცნობი გარემო.',
@@ -2836,7 +2854,7 @@ $1',
 'tooltip-pt-anonuserpage' => 'ჩემი IP-ის მქონე მომხმარებლის გვერდი',
 'tooltip-pt-mytalk' => 'თქვენი განხილვის გვერდი',
 'tooltip-pt-anontalk' => 'ჩემი  IP-ის განხილვის გვერდი',
-'tooltip-pt-preferences' => 'á\83©á\83\94á\83\9bი კონფიგურაცია',
+'tooltip-pt-preferences' => 'á\83\97á\83¥á\83\95á\83\94á\83\9cი კონფიგურაცია',
 'tooltip-pt-watchlist' => 'გვერდების სია, რომელთა ცვლილებებს თქვენ უთვალთვალებთ',
 'tooltip-pt-mycontris' => 'თქვენი წვლილის სია',
 'tooltip-pt-login' => 'სასურველია დარეგისტრირდეთ, თუმცა აუცილებელია არაა.',
@@ -2946,6 +2964,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'ინფორმაცია „$1“-თვის',
+'pageinfo-not-current' => 'ბოდიში, ეს ინფორმაცია შეიძლება არ იყოს ძველ ვერსიებში.',
 'pageinfo-header-basic' => 'საბაზისო ინფორმაცია',
 'pageinfo-header-edits' => 'რედაქტირების ისტორია',
 'pageinfo-header-restrictions' => 'გვერდის დაცვა',
@@ -2954,6 +2973,7 @@ $1',
 'pageinfo-default-sort' => 'სტანდარტული სორტირების გასაღები',
 'pageinfo-length' => 'გვერდის სიგრძე (ბაიტებში)',
 'pageinfo-article-id' => 'გვერდის ID',
+'pageinfo-language' => 'გვერდის შინაარსის ენა',
 'pageinfo-robot-policy' => 'საძიებო სისტემის სტატუსი',
 'pageinfo-robot-index' => 'ინდექსირდება',
 'pageinfo-robot-noindex' => 'არ ინდექსირდება',
@@ -2971,10 +2991,17 @@ $1',
 'pageinfo-authors' => 'განსხვავებულ ავტორთა ჯამური რაოდენობა',
 'pageinfo-recent-edits' => 'ბოლო ცვლილებები (უკანასკნელი $1 განმავლობაში)',
 'pageinfo-recent-authors' => 'უნიკალური ავტორების უკანასკნელი რაოდენობა',
-'pageinfo-restriction' => 'გვერდის დაცვა ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'ჯადოსნური {{PLURAL:$1|სიტყვა|სიტყვა}} ($1)',
 'pageinfo-hidden-categories' => 'დამალული {{PLURAL:$1|კატეგორია|კატეგორია}} ($1)',
 'pageinfo-templates' => 'ინტეგრირებულია {{PLURAL:$1|თარგი|თარგი}} ($1)',
+'pageinfo-toolboxlink' => 'გვერდის ინფორმაცია',
+'pageinfo-redirectsto' => 'გადამისამართება',
+'pageinfo-redirectsto-info' => 'ინფორმაცია',
+'pageinfo-contentpage' => 'ითვლება როგორც შინაარსის გვერდი',
+'pageinfo-contentpage-yes' => 'დიახ',
+'pageinfo-protect-cascading' => 'კასკადური დაცვა აქედან',
+'pageinfo-protect-cascading-yes' => 'დიახ',
+'pageinfo-protect-cascading-from' => 'კასკადური დაცვა',
 
 # Skin names
 'skinname-standard' => 'კლასიკური',
@@ -2988,15 +3015,17 @@ $1',
 'skinname-vector' => 'ვექტორული',
 
 # Patrolling
-'markaspatrolleddiff' => 'á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83\94 á\83 á\83\9dá\83\92á\83\9dá\83 á\83ª á\83\9eá\83\90á\83¢á\83 á\83\9dლირებული',
+'markaspatrolleddiff' => 'á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83\94 á\83 á\83\9dá\83\92á\83\9dá\83 á\83ª á\83\9eá\83\90á\83¢á\83 á\83£ლირებული',
 'markaspatrolledtext' => 'მონიშნე ეს სტატია როგორც პატრულირებული',
-'markedaspatrolled' => 'á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83£á\83\9aá\83\98á\83\90 á\83 á\83\9dá\83\92á\83\9dá\83 á\83ª á\83\9eá\83\90á\83¢á\83 á\83\9dლირებული',
-'markedaspatrolledtext' => 'á\83\90á\83 á\83©á\83\94á\83£á\83\9aá\83\98 á\83\95á\83\94á\83 á\83¡á\83\98á\83\90 [[:$1]] á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83£á\83\9aá\83\98á\83\90 á\83 á\83\9dá\83\92á\83\9dá\83 á\83ª á\83¨á\83\94á\83\9bá\83\9dá\83¬á\83\9bებული',
+'markedaspatrolled' => 'á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83£á\83\9aá\83\98á\83\90 á\83 á\83\9dá\83\92á\83\9dá\83 á\83ª á\83\9eá\83\90á\83¢á\83 á\83£ლირებული',
+'markedaspatrolledtext' => 'á\83\90á\83 á\83©á\83\94á\83£á\83\9aá\83\98 á\83\95á\83\94á\83 á\83¡á\83\98á\83\90 [[:$1]] á\83\9bá\83\9dá\83\9cá\83\98á\83¨á\83\9cá\83£á\83\9aá\83\98á\83\90 á\83 á\83\9dá\83\92á\83\9dá\83 á\83ª á\83\9eá\83\90á\83¢á\83 á\83£á\83\9aá\83\98á\83 ებული',
 'rcpatroldisabled' => 'ბოლო ცვლილებების პატრულირება აკრძალულია',
 'rcpatroldisabledtext' => 'ბოლო ცვლილებების პატრულირების შესაძლებლობა ამ მომენტისთვის გათიშულია',
 'markedaspatrollederror' => 'შეუძლებელია ამ სტატიის მოhttp://translatewiki.net/w/i.php?title=MediaWiki:Markedaspatrollederror/ka&action=edit&loadgroup=core&loadtask=untranslatedნიშნვნა პატრულირებულად.',
 'markedaspatrollederrortext' => 'თქვენ უნდა მონიშნოთ ვერსია, რომელიც პატრულირებულად ჩაითვლება.',
-'markedaspatrollederror-noautopatrol' => 'თქვენ ვერ მონიშნავთ ამ შესწორებას შემოწმებულად.',
+'markedaspatrollederror-noautopatrol' => 'თქვენ ვერ მონიშნავთ თქვენივე შესწორებებს პატრულირებულად.',
+'markedaspatrollednotify' => 'ეს ცვლილება გვერდზე $1 პატრულირებულად მოინიშნა.',
+'markedaspatrollederrornotify' => 'პატრულირებულად მონიშვნა ვერ მოხერხდა.',
 
 # Patrol log
 'patrol-log-page' => 'პატრულირების ჟურნალი',
@@ -3066,6 +3095,7 @@ $1',
 'hours' => '$1 საათის',
 'days' => '$1 დღის',
 'ago' => '$1 წინ',
+'just-now' => 'ახლახანს',
 
 # Bad image list
 'bad_image_list' => 'ფორმატი შემდეგია:
@@ -3361,7 +3391,7 @@ $8',
 'exif-lightsource-9' => 'კარგი ამინდი',
 'exif-lightsource-10' => 'მოღრუბლული ამინდი',
 'exif-lightsource-11' => 'ჩრდილი',
-'exif-lightsource-12' => 'ღის სინათლის ნათურა D (5700 − 7100K)',
+'exif-lightsource-12' => 'á\83\93á\83¦á\83\98á\83¡ á\83¡á\83\98á\83\9cá\83\90á\83\97á\83\9aá\83\98á\83¡ á\83\9cá\83\90á\83\97á\83£á\83 á\83\90 D (5700 â\88\92 7100K)',
 'exif-lightsource-13' => 'დღის სინათლის ნათურა N(4600 − 5400K)',
 'exif-lightsource-14' => 'დღის სინათლის ნათურა W (3900 − 4500K)',
 'exif-lightsource-15' => 'დღის სინათლის ნათურა WW (3200 − 3700K)',
@@ -3601,6 +3631,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[«Interwiki transcluding» გათიშულია]',
 'scarytranscludefailed' => '[$1-თან დაკავშირების შეცდომა]',
+'scarytranscludefailed-httpstatus' => '[ვერ მოხერხდა თარგის ჩატვირთვა $1-თვის: HTTP $2]',
 'scarytranscludetoolong' => '[URL ძალიან გრძელია]',
 
 # Delete conflict
@@ -3749,6 +3780,7 @@ $5
 'version-license' => 'ლიცენზია',
 'version-poweredby-credits' => "ეს ვიკი მუშაობს '''[//www.mediawiki.org/ MediaWiki]'''-ს ძრავზე, copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'სხვები',
+'version-credits-summary' => 'გვინდა მადლობა გადავუხადოთ შემდეგ მომხმარებლებს მათი წვლილისათვის [[Special:Version|მედიავიკის]] განვითარებაში.',
 'version-license-info' => 'MediaWiki არის თავისუფალი პროგრამული უზრუნველყოფა; შეგიძლიათ მისი გავრცელება ან/და მოდიფიცირება GNU General Public License ლიცენზიის პირობების შესაბამისად. როგორც გამოქვეყნებულია თავისუფალი პროგრამული უზრუნველყოფის ფონდის მიერ; ან ლიცენზიის მეორე ვერსიაში, ან (თქვენი აზრით) უფრო ახალში.
 
 MediaWiki ვრცელდება იმ იმედით, რომ ის სასარგებლო იქნება, მაგრამ გარანტიის გარეშე; კომერციული ღირებულების ნაგულისხმევი გარანტიის გარეშეც კი ან რაიმე მიზნისთვის სარგებლის მისაღებად. მეტი დეტალური ინფორმაციისთვის, იხილეთ GNU General Public License.
@@ -3886,9 +3918,9 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'logentry-move-move_redir-noredirect' => '$1 გადაიტანა გვერდი $3 $4-ში გადამისამართების დატოვების გარეშე',
 'logentry-patrol-patrol' => '$1 გააკეთა გვერდის „$3“ $4 ვერსიის პატრულირება',
 'logentry-patrol-patrol-auto' => '$1 ავტომატურად გააკეთა გვერდის „$3“ $4 ვერსიის პატრულირება',
-'logentry-newusers-newusers' => '$1 შექმნა მომხმარებლის ანგარიში',
-'logentry-newusers-create' => '$1 შექმნა მომხმარებლის ანგარიში',
-'logentry-newusers-create2' => '$1 შექმნა მომხმარებელ $3 ანგარიში',
+'logentry-newusers-newusers' => 'მომხმარებლის ანგარიში $1 შექმნილია',
+'logentry-newusers-create' => 'მომხმარებლის ანგარიში $1 შეიქმნა',
+'logentry-newusers-create2' => 'მომხმარებლის ანგარიში $3 შექმნა მომხმარებელმა $1',
 'logentry-newusers-autocreate' => 'ანგარიში $1 ავტომატურად შეიქმნა',
 'newuserlog-byemail' => 'პაროლი ელ-ფოსტითაა გამოგზავნილი',
 
@@ -3908,6 +3940,10 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'feedback-bugcheck' => 'კარგია! გთხოვთ, კიდევ ერთხელ შეამოწმეთ, ხომ არ არის აქ რომელიმე უკვე [$1 ნაცნობი შეცდომა].',
 'feedback-bugnew' => 'მე შევამოწმე. ახალი შეცდომის შეტყობინება',
 
+# Search suggestions
+'searchsuggest-search' => 'ძიება',
+'searchsuggest-containing' => 'შეიცავს...',
+
 # API errors
 'api-error-badaccess-groups' => 'თქვენ არ გაქვთ ამ ვიკიში ფაილების ატვირთვის უფლება.',
 'api-error-badtoken' => 'შიდა შეცდომა: ცუდი ტოკენი.',
@@ -3960,4 +3996,6 @@ MediaWiki ვრცელდება იმ იმედით, რომ ი
 'duration-centuries' => '$1 {{PLURAL:$1|საუკუნე|საუკუნე}}',
 'duration-millennia' => '$1 {{PLURAL:$1|ათასწლეული|ათასწლეული}}',
 
+# Unknown messages
+'svg-long-error' => 'არასწორი SVG ფაილი: $1',
 );
index 1425327..78f94fe 100644 (file)
@@ -285,7 +285,6 @@ $messages = array(
 'qbbrowse' => "Ko'riw",
 'qbedit' => "O'zgertiw",
 'qbpageoptions' => 'Usı bet',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => "Menin' betlerim",
 'qbspecialpages' => 'Arnawlı betler',
 'faq' => 'KBS',
@@ -511,12 +510,8 @@ Keltirilgen sebep: ''$2''.",
 'logouttext' => "'''Siz endi sayttan shıqtın'ız.'''
 
 Siz {{SITENAME}} saytınan anonim halda paydalanıwın'ız mu'mkin.
-Yamasa siz ja'ne ha'zirgi yaki basqa paydalanıwshı atı menen [[Special:UserLogin|qaytadan sistemag'a kiriwin'izge]] boladı.
+Yamasa siz ja'ne ha'zirgi yaki basqa paydalanıwshı atı menen <span class='plainlinks'>[$1 qaytadan sistemag'a kiriwin'izge]</span> boladı.
 Sonı este saqlan', ayrım betler sizin' brauzerin'izdin' keshi tazalanbag'anlıg'ı sebebli sistemada kirgenin'izdey ko'riniste dawam ettire beriwi mu'mkin.",
-'welcomecreation' => "== Xosh keldin'iz, $1! ==
-
-Akkauntın'ız jaratıldı.
-[[Special:Preferences|{{SITENAME}} sazlawların'ızdı]] o'zgertiwdi umıtpan'.",
 'yourname' => 'Paydalanıwshı atı:',
 'yourpassword' => 'Parol:',
 'yourpasswordagain' => "Paroldi qayta kiritin':",
@@ -853,8 +848,6 @@ Sha'rtli belgiler: (ha'z.) = ha'zirgi nusqasi menen parqı,
 'search-interwiki-caption' => 'Qarındas proektler',
 'search-interwiki-default' => "$1 na'tiyje:",
 'search-interwiki-more' => "(ko'birek)",
-'search-mwsuggest-enabled' => 'usınıslar menen',
-'search-mwsuggest-disabled' => 'usınıslarsız',
 'search-relatedarticle' => 'Baylanıslı',
 'mwsuggest-disable' => "AJAX usınısların o'shir",
 'searchrelated' => 'baylanıslı',
@@ -1434,11 +1427,7 @@ Eger siz bul betti baqlaw dizimin'izden o'shirmekshi bolsan'ız bettin' joqarg'
 
 'enotif_mailer' => '{{SITENAME}} eskertiw xatın jiberiw xızmeti',
 'enotif_reset' => "Barlıq betti ko'rip shıg'ıldı dep belgile",
-'enotif_newpagetext' => 'Bul taza bet.',
 'enotif_impersonal_salutation' => '{{SITENAME}} paydalanıwshısı',
-'changed' => "o'zgertilgen",
-'created' => "jaratılg'an",
-'enotif_subject' => '{{SITENAME}} proektindegi $PAGEEDITOR $PAGETITLE atamalı betti $CHANGEDORCREATED',
 'enotif_lastvisited' => "Son'g'ı kirwin'izden beri bolg'an o'zgerisler ushın $1 degendi ko'rin'iz.",
 'enotif_lastdiff' => "Usı o'zgeris ushın $1 degendi ko'rin'iz.",
 'enotif_anon_editor' => 'anonim paydalanıwshı $1',
index f96d2ff..51a66ca 100644 (file)
@@ -9,9 +9,11 @@
  *
  * @author Agurzil
  * @author Agzennay
+ * @author Amazigh84
  * @author Azwaw
  * @author Mmistmurt
  * @author MoubarikBelkasim
+ * @author Salem333
  * @author Teak
  * @author Urhixidur
  */
@@ -45,6 +47,8 @@ $messages = array(
 'tog-underline' => 'Derrer izdayen:',
 'tog-justify' => 'Err tehri ger wawalen kif-kif',
 'tog-hideminor' => 'Ffer ibeddlen ifessasen deg yibeddlen imaynuten',
+'tog-hidepatrolled' => 'Ffer ibeddlen iεessan deg yibeddlen imaynuten',
+'tog-newpageshidepatrolled' => 'Ffer isebtaren iɛessan gar umuɣ n isebtaren imaynuten',
 'tog-extendwatchlist' => 'Ssemɣer umuɣ n uɛessi iwakken ad muqleɣ akk n wayen zemreɣ ad beddleɣ',
 'tog-usenewrc' => 'Sselhu ibeddlen ifessasen (JavaScript)',
 'tog-numberheadings' => 'Izwal ɣur-sen imḍanen mebla ma serseɣ-iten',
@@ -67,6 +71,7 @@ $messages = array(
 'tog-enotifminoredits' => 'Azen-iyi-d e-mail ma llan ibeddlen ifessasen',
 'tog-enotifrevealaddr' => 'Ssken e-mail inu asmi yettwazen email n talɣut',
 'tog-shownumberswatching' => 'Ssken geddac yellan n yimseqdacen iɛessasen',
+'tog-oldsig' => 'Azmul yellan :',
 'tog-fancysig' => 'ǧǧ azmul am yettili (war azday awurman)',
 'tog-externaleditor' => 'Sseqdec ambeddel n berra d ameslugen',
 'tog-externaldiff' => 'Sseqdec ambeddel n berra iwakken ad ẓreɣ imgerraden',
@@ -76,13 +81,25 @@ $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-watchlisthideliu' => 'Ffer ibeddlen n iseqdacen yelan deg umuɣ n tiḍefri',
+'tog-watchlisthideanons' => 'Ffer ibeddlen n iseqdacen udrigen deg umuɣ n tiḍefri',
+'tog-watchlisthidepatrolled' => 'Ffer ibeddlen iɛessan deg umuɣ n tiḍefri',
 'tog-ccmeonemails' => 'Azen-iyi-d email n wayen uzneɣ i imseqdacen wiyaḍ',
 'tog-diffonly' => 'Ur temliḍ-iyi-d ara ayen yellan seddaw imgerraden',
+'tog-showhiddencats' => 'Beqqeḍ taggayin yeffren',
+'tog-norollbackdiff' => 'Ur beqqeḍ ara "diff" ma yella usemmet',
 
 'underline-always' => 'Daymen',
 'underline-never' => 'Abaden',
 'underline-default' => 'Browser/Explorateur ameslugen',
 
+# Font style option in Special:Preferences
+'editfont-style' => 'Aɣanib n tasefsit n taɣzut ubeqqeḍ :',
+'editfont-default' => 'Tasefsit n iminig s lexṣas',
+'editfont-monospace' => 'Tasefsit s lqedd usbiḍ',
+'editfont-sansserif' => 'Tasefsit "Sans-serif"',
+'editfont-serif' => 'Tasefsit "Serif"',
+
 # Dates
 'sunday' => 'Ačer',
 'monday' => 'Arim',
@@ -146,9 +163,13 @@ $messages = array(
 'category-subcat-count' => 'Taggayt agi tesɛa {{PLURAL:$2|adu-taggayt|$2 adu-taggayin, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}}}} ddaw agi.',
 'category-subcat-count-limited' => 'Taggayt agi tesɛa {{PLURAL:$1|adu-taggayt agi|tid $1 adu-taggayin agi}} ddaw-agi.',
 'category-article-count' => 'Taggayt agi tesɛa {{PLURAL:$2|asebter agi|$2 isebtaren, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.',
+'category-article-count-limited' => '{{PLURAL:$1|Asebter agi yella|$1 isebtar agi llan}} deg taggayt agi.',
 'category-file-count' => 'Taggayt agi tesɛa {{PLURAL:$2|afaylu agi|$2 ifuyla, ɣef ayed {{PLURAL:$1|t-agi|t-igi $1}} ddaw-agi}}.',
+'category-file-count-limited' => '{{PLURAL:$1|Afaylu agi yella|$1 ifuyla agi llan}} deg taggayt agi.',
 'listingcontinuesabbrev' => 'asartu',
+'index-category' => 'Isebtar s umatar',
 'noindex-category' => 'Asebter agi ur d-yerna ara deg umatar',
+'broken-file-category' => 'Isebtar s iseɣwan n ifuyla iṛzan',
 
 'about' => 'Awal ɣef...',
 'article' => 'Ayen yella deg usebter',
@@ -166,7 +187,6 @@ $messages = array(
 'qbbrowse' => 'Ẓer isebtar',
 'qbedit' => 'Beddel',
 'qbpageoptions' => 'Asebter-agi',
-'qbpageinfo' => 'Asatal',
 'qbmyoptions' => 'isebtar inu',
 'qbspecialpages' => 'isebtar usligen',
 'faq' => 'Isteqsiyen',
@@ -177,6 +197,9 @@ $messages = array(
 'vector-action-delete' => 'Mḥu',
 'vector-action-move' => 'Smimeḍ',
 'vector-action-protect' => 'Mmesten',
+'vector-action-undelete' => 'Uɣaled',
+'vector-action-unprotect' => 'Beddel amesten',
+'vector-simplesearch-preference' => 'Sermed tafeggast taḥerfit n unadi (i "Vector" kan)',
 'vector-view-create' => 'Snulfu',
 'vector-view-edit' => 'Ẓẓiẓreg',
 'vector-view-history' => 'Ẓeṛ amazray',
@@ -199,13 +222,16 @@ $messages = array(
 'updatedmarker' => 'yettubeddel segmi tarzeft taneggarut inu',
 'printableversion' => 'Tasiwelt iwakken ad timprimiḍ',
 'permalink' => 'Azday ur yettbeddil ara',
-'print' => 'Imprimi',
+'print' => 'Siggez',
+'view' => 'Ẓeṛ',
 'edit' => 'Beddel',
 'create' => 'Snulfu',
 'editthispage' => 'Beddel asebter-agi',
+'create-this-page' => 'Snulfu asebter-agi',
 'delete' => 'Mḥu',
 'deletethispage' => 'Mḥu asebter-agi',
 'undelete_short' => 'Fakk amḥay n {{PLURAL:$1|yiwen ubeddel|$1 yibeddlen}}',
+'viewdeleted_short' => 'Ẓeṛ {{PLURAL:$1|yiwen abeddel yettumḥan|$1 Ibeddlen yettumḥan}}',
 'protect' => 'Ḥrez',
 'protect_change' => 'beddel tiḥḥerzi',
 'protectthispage' => 'Ḥrez asebter-agi',
@@ -238,6 +264,14 @@ $messages = array(
 'jumpto' => 'Neggez ar:',
 'jumptonavigation' => 'ẓer isebtar',
 'jumptosearch' => 'anadi',
+'view-pool-error' => 'Suref-aɣ, iqeddacen iwziren tura.
+Aṭas iseqdacen tnadin ad ẓṛen asebter agi.
+Ilaq ad arǧuḍ imir uqbel ad εreḍeḍ tikkelt nniḍen .
+
+$1',
+'pool-timeout' => 'Amenḍar iɛedda deg taganit n uzekṛun',
+'pool-queuefull' => 'Adras n umahil yečuṛ',
+'pool-errorunknown' => 'Anezri warisem',
 
 # 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' => 'Awal ɣef {{SITENAME}}',
@@ -253,6 +287,7 @@ $messages = array(
 'helppage' => 'Help:Agbur',
 'mainpage' => 'Asebter amenzawi',
 'mainpage-description' => 'Asebter amenzawi',
+'policy-url' => 'Project:Ilugan',
 'portal' => 'Awwur n timetti',
 'portal-url' => 'Project:Awwur n timetti',
 'privacy' => 'Tudert tusligt',
@@ -260,15 +295,20 @@ $messages = array(
 
 'badaccess' => 'Agul n turagt',
 'badaccess-group0' => 'Ur tettalaseḍ ara ad texedmeḍ tigawt i tseqsiḍ.',
-'badaccess-groups' => 'Tigawt i steqsiḍ, llan ala imseqdacen seg yiwen n yiderman n $1 i zemren a t-xedmen.',
+'badaccess-groups' => 'Tigawt id steqsiḍ t-uffar kan i iseqdacen n {{PLURAL:$2|ugraw|igrawen}} : $1.',
 
 'versionrequired' => 'Yessefk ad tesɛiḍ tasiwelt $1 n MediaWiki',
 'versionrequiredtext' => 'Yessefk ad tesɛiḍ tasiwelt $1 n MediaWiki iwakken ad tesseqdceḍ asebter-agi. Ẓer [[Special:Version|tasiwelt n usebter]].',
 
+'ok' => 'Seɣbel',
 'retrievedfrom' => 'Yettwaddem seg "$1"',
 'youhavenewmessages' => 'Ɣur-k $1 ($2).',
 'newmessageslink' => 'Izen amaynut',
 'newmessagesdifflink' => 'Abeddel aneggaru',
+'youhavenewmessagesfromusers' => 'Tesɛiḍ $1 n {{PLURAL:$3|useqdac nniḍen|$3 iseqdacen nniḍen}} ( $2 ).',
+'youhavenewmessagesmanyusers' => 'Tesɛiḍ $1 n aṭas n iseqdacen ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|izen amaynut|inzan imaynuten}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|abeddel aneggaru|ibeddilen ineggura}}',
 'youhavenewmessagesmulti' => 'Tesɛiḍ iznan imaynuten deg $1',
 'editsection' => 'beddel',
 'editold' => 'beddel',
@@ -279,14 +319,21 @@ $messages = array(
 'toc' => 'Agbur',
 'showtoc' => 'Ssken',
 'hidetoc' => 'Ffer',
+'collapsible-collapse' => 'Seggelmes',
+'collapsible-expand' => 'Beqqeḍ',
 'thisisdeleted' => 'Ẓer neɣ err $1 am yella?',
 'viewdeleted' => 'Ẓer $1?',
 'restorelink' => '{{PLURAL:$1|Yiwen abeddel yettumḥan|$1 Ibeddlen yettumḥan}}',
 'feedlinks' => 'Asuddem:',
 'feed-invalid' => 'Anaw n usuddem mačči ṣaḥiḥ.',
+'feed-unavailable' => 'Isuddman RSS ur yestufan ara',
+'site-rss-feed' => 'Asuddem RSS n $1',
 'site-atom-feed' => 'Taneflit Atom n $1',
+'page-rss-feed' => 'Asuddem RSS n « $1 »',
 'page-atom-feed' => 'Taneflit Atom n "$1"',
 'red-link-title' => '$1 (ulac asebter)',
+'sort-descending' => 'Afran akaray',
+'sort-ascending' => 'Afran aseffes',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Amagrad',
@@ -333,16 +380,26 @@ Umata, wagi yeḍra mi neḍfeṛ azday ɣer yiwen diff aqbur naɣ ɣer amazray
 Ma mačči d-tajṛut agi, ihi d-taniwit deg uhil.
 Ilaq ad εeggenem yiwen [[Special:ListUsers/sysop|anedbal]] war ad ttum asefkem URL n uzday.',
 'missingarticle-rev' => '(uṭṭun n lqem : $1)',
+'missingarticle-diff' => '(Diff: $1, $2)',
 'readonly_lag' => 'Database d tamsekkert (weḥdes) axaṭer kra n serveur ɛeṭṭlen',
 'internalerror' => 'Agul zdaxel',
+'internalerror_info' => 'Anezri agensan : $1',
+'fileappenderrorread' => 'Ulamek an ɣeṛ « $1 »  mi taguri',
+'fileappenderror' => 'Ulamek an seffes « $1 » ar « $2 ».',
 'filecopyerror' => 'Ur yezmir ara ad yexdem alsaru n ufaylu "$1" ar "$2".',
 'filerenameerror' => 'Ur yezmir ara ad ibeddel isem ufaylu "$1" ar "$2".',
-'filedeleteerror' => 'Ur yezmir ara ad yemḥu afaylu "$1".',
+'filedeleteerror' => 'Ulamek an mḥu afaylu "$1".',
+'directorycreateerror' => 'Ulamek an snulfu akaram « $1 ».',
 'filenotfound' => 'Ur yezmir ara ad yaf afaylu "$1".',
+'fileexistserror' => 'Ulamek an aru afaylu « $1 » : afaylu agi yesnulfad yakan.',
 'unexpected' => 'Agul: "$1"="$2".',
 'formerror' => 'Agul: ur yezmir ara ad yazen talɣa',
 'badarticleerror' => 'Ur yezmir ara ad yexdem tigawt-agi deg usebter-agi.',
-'cannotdelete' => 'Ur yezmir ara ad yemḥu asebter neɣ afaylu i tebɣiḍ. (Ahat amdan wayeḍ yemḥa-t.)',
+'cannotdelete' => 'Ulamek ad yemḥu asebter naɣ afaylu « $1 ».
+Ahat amdan wayeḍ yemḥa-t.',
+'cannotdelete-title' => 'Ulamek an kkes  asebter « $1 »',
+'delete-hook-aborted' => 'Tukkesa tesemmet s usiɣzef.
+Ulac asefru ɣef wagi.',
 'badtitle' => 'Azwel ur yelhi',
 'badtitletext' => 'Asebter i testeqsiḍ fell-as mačči ṣaḥiḥ, d ilem, neɣ yella ugul deg wezday seg wikipedia s tutlayt tayeḍ neɣ deg wezday n wiki nniḍen. Ahat tesɛa asekkil ur yezmir ara ad yettuseqdac deg wezwel.',
 'perfcached' => 'Talɣut deg ukessar seg lkac u waqila mačči d tasiwelt taneggarut. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -352,31 +409,55 @@ Ilaq ad εeggenem yiwen [[Special:ListUsers/sysop|anedbal]] war ad ttum asefkem
 Tawuri: $1<br />
 Query: $2',
 'viewsource' => 'Ẓer aɣbalu',
+'viewsource-title' => 'Ẓeṛ aɣbalu n $1',
+'actionthrottled' => 'Tigawt tesɛa talast',
+'actionthrottledtext' => 'Iwakken an ewwet mgal tira yerkan (SPAM), tigawt agi tesɛa talast n amḍan n tikwalt deg akud awezzlan. talast agi t-ɛedda.
+Ɛred tikkelt nniḍen deg kra n dqiqa.',
 'protectedpagetext' => 'Asebter-agi d amsekker.',
 'viewsourcetext' => 'Tzemreḍ ad twaliḍ u txedmeḍ alsaru n uɣbalu n usebter-agi:',
+'viewyourtext' => 'Tzemṛeḍ ad ẓṛeḍ dɣa ad nɣeleḍ agbur n "ibeddlen inek/inem" deg usebter agi :',
 'protectedinterface' => 'Asebter-agi d amsekker axaṭer yettuseqdac i weḍris n software.',
 'editinginterface' => "'''Aɣtal:''' Aqla-k tettbeddileḍ asebter i yettuseqdac i weḍris n software. Tagmett n software i tt-ẓren yimseqdacen wiyaḍ ad tbeddel akk d ibeddlen inek.",
 'sqlhidden' => '(Query n SQL tettwaffer)',
-'cascadeprotected' => 'Asebter-agi yettwaḥrez seg ubeddil, axaṭer yettusekcem deg isebtar i ttwaḥerzen ula d nutni (acercur), ahaten:',
+'cascadeprotected' => 'Asebter-agi yegdel axaṭer yettusekcem deg {{PLURAL:$1|asebter yegdelen agi|isebtar yegdelen agi}} s Taxtiṛit « amesten s uceṛcuṛ » isermeden :
+$2',
+'namespaceprotected' => "Ur tesɛiḍ ara turagt iwakken ad beddeleḍ isebtar n tallunt n isemawen \"'''\$1'''\".",
+'customcssprotected' => 'Ur tesɛiḍ ara turagt iwakken ad beddeleḍ asebter agi n CSS, acku tesɛa iɣewwaren n yiwen useqdac nniḍen.',
+'customjsprotected' => 'Ur tesɛiḍ ara turagt iwakken ad beddeleḍ asebter agi n Javascript, acku tesɛa iɣewwaren n yiwen useqdac nniḍen.',
+'ns-specialprotected' => 'Ur t-zemred ara ad beddeleḍ isebtar usligen',
+'titleprotected' => "Azwel agi yegdel deg usnulfu ɣef [[User:$1|$1]].
+Taɣẓint id yenna : ''$2''",
+'filereadonlyerror' => 'Ulamek an beddel afaylu « $1 » acku akaram n ifuyla « $2 » yella deg taɣuri kan.
+
+Anedbal i tid sekkweṛen yefkad taɣẓint agi : « $3 ».',
+'invalidtitle-knownnamespace' => 'Azwel ur i ɣbel ara s tallunt n isemawen « $2 » dɣa d-uglam « $3 »',
+'invalidtitle-unknownnamespace' => 'Azwel ur i ɣbel ara s uṭṭun n tallunt n isemawen $1 dɣa d-uglam « $2 » warisem',
+'exception-nologin' => 'Ur tekcimeḍ ara',
+'exception-nologin-text' => 'I usebter agi naɣ i tigawt agi, ilaq ad qqeneḍ ɣef wiki agi.',
+
+# Virus scanner
+'virus-badscanner' => "Yir tawila : anafraḍ n infafaden warisem : ''$1''",
+'virus-scanfailed' => 'Abrir n unadi (tangalt $1)',
+'virus-unknownscanner' => 'amgelanfafad warisem :',
 
 # Login and logout pages
-'logouttext' => "'''Tura teffɣeḍ.'''
+'logouttext' => "'''Tura tesensereḍ.'''
 
-Tzemreḍ ad tesseqdceḍ {{SITENAME}} d udrig, neɣ tzemreḍ ad tkecmeḍ daɣen s yisem n wemseqdac inek (neɣ nniḍen).
+Tzemreḍ ad tesseqdceḍ {{SITENAME}} d udrig, <span class='plainlinks'>[$1 ad tkecmeḍ daɣen]</span> s yisem n wemseqdac inek (neɣ nniḍen).
 Kra n isebtar zemren ad sskanen belli mazal-ik s yisem n wemseqdac inek armi temḥuḍ lkac.",
-'welcomecreation' => '== Anṣuf yis-k, $1! ==
-
-Isem n wemseqdac inek yettwaxleq. Ur tettuḍ ara ad tbeddleḍ Isemyifiyen n {{SITENAME}} inek.',
 'yourname' => 'Isem n wemseqdac',
 'yourpassword' => 'Awal n tbaḍnit',
 'yourpasswordagain' => 'Ɛiwed ssekcem awal n tbaḍnit',
 'remembermypassword' => 'Cfu ɣef wawal n tbaḍnit inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})',
+'securelogin-stick-https' => 'Qqim uqqin s HTTPS sakin tuqqna',
 'yourdomainname' => 'Taɣult inek',
+'password-change-forbidden' => 'Ur zemreḍ ara ad beddeleḍ awalen n uɛaddi ɣef uwiki agi.',
 'externaldberror' => 'Yella ugul aberrani n database neɣ ur tettalaseḍ ara ad tbeddleḍ isem an wemseqdac aberrani inek.',
 'login' => 'Kcem',
 'nav-login-createaccount' => 'Kcem / Xleq isem n wemseqdac',
 'loginprompt' => 'Yessefk ad teǧǧiḍ ikukiyen (cookies) iwakken ad tkecmeḍ ar {{SITENAME}}.',
 'userlogin' => 'Kcem / Xleq isem n wemseqdac',
+'userloginnocreate' => 'Qqen',
 'logout' => 'Ffeɣ',
 'userlogout' => 'Ffeɣ',
 'notloggedin' => 'Ur tekcimeḍ ara',
@@ -387,29 +468,38 @@ Isem n wemseqdac inek yettwaxleq. Ur tettuḍ ara ad tbeddleḍ Isemyifiyen n {{
 'gotaccountlink' => 'Kcem',
 'userlogin-resetlink' => 'Ettuḍ tilɣa n tuqqna ?',
 'createaccountmail' => 's e-mail',
+'createaccountreason' => 'Ayɣer',
 'badretype' => 'Awal n tbaḍnit amezwaru d wis sin mačči d kif-kif.',
 'userexists' => 'Isem n wemseqdac yeddem-as amdan wayeḍ. Fren yiwen nniḍen.',
 'loginerror' => 'Agul n ukcam',
+'createaccounterror' => 'Ulamek ad nesnulfu amiḍan : $1',
 'nocookiesnew' => 'Isem n wemseqdac-agi yettwaxleq, meɛna ur tekcimeḍ ara. {{SITENAME}} yesseqdac ikukiyen (cookies) iwakken ad tkecmeḍ. Tekseḍ ikukiyen-nni. Eǧǧ-aten, umbeɛd kecm s yisem n wemseqdac akk d wawal n tbaḍnit inek.',
 'nocookieslogin' => '{{SITENAME}} yesseqdac ikukiyen (cookies) iwakken ad tkecmeḍ. Tekseḍ ikukiyen-nni. Eǧǧ-aten iwakken ad tkecmeḍ.',
+'nocookiesfornew' => 'Amiḍan n useqdac ur d-isnulfu ara, acku ur nezmer ara an sulu azar-is.
+Selken ma sermedeḍ "cookies", sismeḍ asebter dɣa εreḍ tikkelt nniḍen.',
 'noname' => 'Ur tefkiḍ ara isem n wemseqdac ṣaḥiḥ.',
 'loginsuccesstitle' => 'Tkecmeḍ !',
 'loginsuccess' => "'''Tkecmeḍ ar {{SITENAME}} s yisem n wemseqdac \"\$1\".'''",
-'nosuchuser' => 'Ulac isem n wemseqdac s yisem "$1". Ssenqed tira n yisem-nni, neɣ xelq isem n wemseqdac amaynut.',
+'nosuchuser' => 'Aseqdac « $1 » ulac-it d-agi.
+Ssenqed tira n yisem-nni, naɣ [[Special:UserLogin/signup|snulfu-d amiḍan amaynut]].',
 'nosuchusershort' => 'Ulac isem n wemseqdac s yisem "$1". Ssenqed tira n yisem-nni.',
 'nouserspecified' => 'Yessefk ad tefkeḍ isem n wemseqdac.',
+'login-userblocked' => 'Aseqdac agi i sewḥel. Tuqqna t-ugwi.',
 'wrongpassword' => 'Awal n tbaḍnit ɣaleṭ. Ɛreḍ daɣen.',
 'wrongpasswordempty' => 'Awal n tbaḍnit ulac-it. Ɛreḍ daɣen.',
-'passwordtooshort' => 'Awal n tbaḍnit inek d amecṭuḥ bezzaf. Yessefk ad yesɛu $1 isekkilen neɣ kter.',
+'passwordtooshort' => 'Awal-ik (im) n uɛaddi ilaq ad i sɛu adday {{PLURAL:$1|1 asekkil|$1 isekkilen}}.',
+'password-name-match' => 'Ilaq awal n uɛaddi ad yili imeẓli s-isem n useqdac.',
+'password-login-forbidden' => 'aseqdac agi d awal n uɛaddi agi d-izenbigen.',
 'mailmypassword' => 'Awal n tbaḍnit n e-mail',
 'passwordremindertitle' => 'Asmekti n wawal n tbaḍnit seg {{SITENAME}}',
-'passwordremindertext' => 'Amdan (waqila d kečč, seg tansa IP $1)
-yesteqsa iwakken a nazen awal n tbaḍnit amaynut i {{SITENAME}} ($4).
-Awal n tbaḍnit i wemseqdac "$2" yuɣal-d tura "$3".
-Mliḥ lukan tkecmeḍ u tbeddleḍ awal n tbaḍnit tura.
+'passwordremindertext' => 'Amdan (waqila d kečč/kem, seg tansa IP $1) yesteqsa iwakken a nazen
+Awal n uɛaddi amaynut i {{SITENAME}} ($4). Awal n uɛaddi i wemseqdac "$2" yuɣal-d tura "$3".
+Mliḥ lukan tkecmeḍ u tbeddleḍ Awal n uɛaddi tura.
+Tasewti n awal agi n uɛaddi amaynut ad yaweḍ deg {{PLURAL:$5|yiwen ass|$5 ussan}}
 
-Lukan mačči d kečč i yesteqsan neɣ tecfiḍ ɣef awal n tbaḍnit, tzemreḍ ad tkemmleḍ mebla ma tbeddleḍ awal n tbaḍnit.',
+Lukan mačči d kečč i yesteqsan naɣ tecfiḍ ɣef awal n uɛaddi, tzemreḍ ad tkemmleḍ mebla ma tbeddleḍ awal n uɛaddi.',
 'noemail' => '"$1" ur yesɛi ara email.',
+'noemailcreate' => 'Ilaq ad efkeḍ tansa e-mail i sɛan aseɣbel.',
 'passwordsent' => 'Awal n tbaḍnit amaynut yettwazen i emal inek, aylaw n "$1".
 G leɛnaya-k, kcem tikelt nniḍen yis-s.',
 'blocked-mailpassword' => 'Tansa n IP inek tɛekkel, ur tezmireḍ ara ad txedmeḍ abeddel,
@@ -417,29 +507,88 @@ ur tezmireḍ ara ad tesɛuḍ awal n tbaḍnit i tettuḍ.',
 'eauthentsent' => 'Yiwen e-mail yettwazen-ak iwakken ad tsenteḍ.
 Qbel kulci, ḍfer ayen yenn-ak deg e-mail,
 iwakken ad tbeyyneḍ belli tansa n email inek.',
-'throttled-mailpassword' => 'Asmekti n wawal n tbaḍnit yettwazen yagi deg $1 sswayeɛ i iɛeddan. Asmekti n wawal n tbaḍnit yettwazen tikelt kan mkul $1 swayeɛ.',
+'throttled-mailpassword' => 'Asmekti n wawal n uɛaddi yettwazen yagi deg {{PLURAL:$1|asrag agi aneggaru| $1 isragen agi ineggura}}. Asmekti n wawal n uɛaddi yettwazen tikelt kan mkul $1 swayeɛ. deg {{PLURAL:$1|asrag|azilal n $1 isragen}}.',
 'mailerror' => 'Agul asmi yettwazen e-mail: $1',
-'acct_creation_throttle_hit' => 'Surf-aɣ, txelqeḍ aṭas n yismawen n wemseqdac ($1). Ur tettalaseḍ ara ad txelqeḍ kter.',
-'emailauthenticated' => 'Tansa e-mail inek tettuɛqel deg $1.',
+'acct_creation_throttle_hit' => 'Amdan i seqdacen tansa IP inek/inem yesnulfud {{PLURAL:$1|yiwen amiḍan|$1 imiḍanen}} deg 24 izragen agi ineggura, negweḍ ar talast n turagt deg azilal agi n wakud.',
+'emailauthenticated' => 'Tansa e-mail inek/inem tesesteb ass n $2 af $3.',
 'emailnotauthenticated' => 'Tansa e-mail inek mazal ur tettuɛqel. Ḥedd e-mail ur ttwazen i ulaḥedd n iḍaɣaren-agi.',
 'noemailprefs' => 'Efk tansa e-mail iwakken ad leḥḥun iḍaɣaren-nni.',
 'emailconfirmlink' => 'Sentem tansa e-mail inek',
 'invalidemailaddress' => 'Tansa e-mail-agi ur telhi, ur tesɛi ara taseddast n lɛali. Ssekcem tansa e-mail s taseddast n lɛali neɣ ur tefkiḍ acemma.',
+'cannotchangeemail' => 'Ur t-zemreḍ ara ad beddeleḍ tansa e-mail deg uwiki agi.',
+'emaildisabled' => 'Asmel agi ur yezmer ara ad i cegaɛ e-mail.',
 'accountcreated' => 'Isem n wemseqdac yettwaxleq',
 'accountcreatedtext' => 'Isem n wemseqdac i $1 yettwaxleq.',
+'createaccount-title' => 'Asnulfu n umiḍan i {{SITENAME}}',
+'createaccount-text' => 'Albeɛḍ yesnulfu-d amiḍan i tansa e-amil inek/inem ɣef {{SITENAME}} ($4) s-isem n-useqdac « $2 », s awal n uɛaddi « $3 ».
+Ilaq tura ad lldiḍ taɣimit dɣa ad beddeleḍ awal ik/im n uɛaddi.',
+'usernamehasherror' => 'Isem n useqdac ur yezmer ara ad i sɛu  isekkilen n ugeddeḥ',
+'login-throttled' => 'Tɛerdeḍ ad qqeneḍ aṭas tiqwal deg dqiqat agi iɛddan.
+Ilaq ad rǧuḍ ciṭaḥ uqbel ad ɛerdeḍ tikkelt nniḍen.',
+'login-abort-generic' => 'Taremt ik/im n tuqqna tebrir',
 'loginlanguagelabel' => 'Tutlayt: $1',
+'suspicious-userlogout' => 'Asuter n usenser yugwi acku yella ugur s iminig naɣ s tazarkatut n uqeddac proxy.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'anezri warisem deg tawuri mail() n PHP',
+'user-mail-no-addy' => 'Ɛred ad icegaɛ e-mail war tansa e-mail',
 
 # Change password dialog
-'resetpass' => 'Iɛawed awal n tbaḍnit',
+'resetpass' => 'Beddel awal n uɛaddi',
 'resetpass_announce' => 'Tkecmeḍ s ungal yettwazen-ak s e-mail (ungal-nni qrib yemmut). Iwekken tkemmleḍ, yessefk ad textareḍ awal n tbaḍnit amaynut dagi:',
 'resetpass_text' => '<!-- Rnu aḍris dagi -->',
-'resetpass_header' => 'Ɛiwed awal n tbaḍnit',
+'resetpass_header' => 'Beddel awal n uɛassi n umiḍan',
 'oldpassword' => 'Awal n tbaḍnit aqdim:',
 'newpassword' => 'Awal n tbaḍnit amaynut:',
 'retypenew' => 'Ɛiwed ssekcem n tbaḍnit amaynut:',
 'resetpass_submit' => 'Eg awal n tbaḍnit u kcem',
 'resetpass_success' => 'Awal n tbaḍnit yettubeddel! Qrib ad tkecmeḍ...',
-'resetpass_forbidden' => 'Ur tezmireḍ ara ad tbeddleḍ awal n tbaḍnit deg wiki-yagi',
+'resetpass_forbidden' => 'Ur zemreḍ ara ad beddeleḍ awalen n uɛaddi',
+'resetpass-no-info' => 'Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.',
+'resetpass-submit-loggedin' => 'Beddel awal n uɛaddi',
+'resetpass-submit-cancel' => 'Semmewet',
+'resetpass-wrong-oldpass' => 'Awal n uɛaddi ur i seɣbel ara.
+Ahat ilaq ad beddeleḍ awal ik/im n uɛaddi naɣ ad ssutereḍ awal n uɛaddi amaynut.',
+'resetpass-temp-password' => 'Awal n uɛaddi amakud',
+
+# Special:PasswordReset
+'passwordreset' => 'Awennez tikkelt nniḍen n awal uɛaddi',
+'passwordreset-text' => 'Ččur tiferkit agi iwakken ad eṭṭfeḍ tirawt n usmekti  deg-es tilɣa n umiḍan inek/inem.',
+'passwordreset-legend' => 'Awennez tikkelt nniḍen n awal uɛaddi',
+'passwordreset-disabled' => 'Awennez n awal uɛaddi yensa deg uwiki agi.',
+'passwordreset-pretext' => '{{PLURAL:$1||Sekcem aferdis n isefka ddaw agi}}',
+'passwordreset-username' => 'Isem n useqdac',
+'passwordreset-domain' => 'Talɣut :',
+'passwordreset-capture' => 'Ẓeṛ tirawt ?',
+'passwordreset-capture-help' => 'Lukan ad tekkiḍ ɣef texxamt agi, tirawt (deg-es awal n uɛaddi akudan) att beqqeḍ dɣa ad tetwetceggaɛ i useqdac.',
+'passwordreset-email' => 'Tansa e-mail :',
+'passwordreset-emailtitle' => 'Tilɣa n umiḍan ɣef {{SITENAME}}',
+'passwordreset-emailtext-ip' => 'Yiwen (Ahat kečč/kem, seg tansa IP $1) yessutered asiwel n tilɣa n umiḍan inek/inem i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yedrew|imiḍanen n iseqdacen agi drewen}} s tansa e-mail agi :
+
+$2
+
+{{PLURAL:$3|Awal n uɛaddi agi ad i aff tasewti-s|Awalen n uɛaddi agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
+'passwordreset-emailtext-user' => 'Aseqdac $1 ɣef {{SITENAME}} yessutered asiwel n tilɣa n umiḍan inek/inem i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yedrew|imiḍanen n iseqdacen agi drewen}} s tansa e-mail agi :
+
+$2
+
+{{PLURAL:$3|Awal n uɛaddi agi ad i aff tasewti-s|Awalen n uɛaddi agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.',
+'passwordreset-emailelement' => 'Isem n useqdac : $1
+Awal n uɛddi akudan : $2',
+'passwordreset-emailsent' => 'Tirawt n usmekti tetwazen.',
+'passwordreset-emailsent-capture' => 'Tirawt n usmekti tetwazen, ẓeṛ-itt ddaw agi.',
+'passwordreset-emailerror-capture' => 'Tirawt n usmekti t-arewed, ẓeṛ-itt ddaw agi, lamaɛna azen yefkad anezri (tirawt ur tru ara) : $1',
+
+# Special:ChangeEmail
+'changeemail' => 'Beddel tansa n e-mail',
+'changeemail-header' => 'Beddel tansa n e-mail n umiḍan',
+'changeemail-text' => 'Ččur tiferkit agi iwakken ad beddeleḍ tansa e-mail inek/inem. Ilaq ad sekcemeḍ awal ik/im n uɛaddi iwakken ad sergegeḍ abeddel agi.',
+'changeemail-no-info' => 'Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.',
+'changeemail-oldemail' => 'Tansa e-mail n tura :',
+'changeemail-newemail' => 'Tansa e-mail tamaynut :',
+'changeemail-none' => '(ulac)',
+'changeemail-submit' => 'Beddel tansa e-mail',
+'changeemail-cancel' => 'Semmewet',
 
 # Edit page toolbar
 'bold_sample' => 'Aḍris aberbuz',
@@ -472,42 +621,79 @@ iwakken ad tbeyyneḍ belli tansa n email inek.',
 'showlivepreview' => 'Pre-timeẓriwt taǧiḥbuṭ',
 'showdiff' => 'Ssken ibeddlen',
 'anoneditwarning' => "'''Aɣtal:''' Ur tkecmiḍ ara. Tansa IP inek ad tettusmekti deg umezruy n usebter-agi.",
+'anonpreviewwarning' => "''Ur tesuluḍ ara. Aḥraz ad yekles tansa IP inek/inem deg umezruy n ibeddilen n usebter.''",
 'missingsummary' => "'''Ur tettuḍ ara:''' Ur tefkiḍ ara azwel i ubeddel inek. Lukan twekkiḍ ''Smekti'' tikelt nniḍen, abeddel inek ad yettusmekti mebla azwel.",
 'missingcommenttext' => 'Ssekcem awennit deg ukessar.',
 'missingcommentheader' => "'''Ur tettuḍ ara:''' Ur tefkiḍ ara azwel-azellum i ubeddel inek. Lukan twekkiḍ ''Smekti'' tikelt nniḍen, abeddel inek ad yettusmekti mebla azwel-azellum.",
 'summary-preview' => 'Pre-timeẓriwt n ugzul:',
 'subject-preview' => 'Pre-timeẓriwt asentel/azwel azellum:',
 'blockedtitle' => 'Amseqdac iɛekkel',
-'blockedtext' => "'''Isem n wemseqdac neɣ tansa n IP inek ɛekkelen.'''
+'blockedtext' => "'''Amiḍan ik n useqdac neɣ tansa n IP sewḥlen.'''
+
+Asewḥel yetwexdem af $1
+Taɣẓint id yenna : ''$2''.
+
+* Tazzwara n usewḥel : $8
+* Taggara n usewḥel : $6
+* Amiḍan i sewḥlen : $7.
+
+
+Tzemreḍ ad tmeslayeḍ s $1 neɣ [[{{MediaWiki:Grouppage-sysop}}|anedbal]] nniḍen iwakken ad tsmelayem ɣef uɛekkil-nni.
+Lukan ur tefkiḍ ara email saḥih deg [[Special:Preferences|isemyifiyen n wemseqdac]], ur tezmireḍ ara ad tazneḍ email.
+Tansa n IP inek n tura d $3, ID n uɛekkil d #$5.
+Smekti-ten u fka-ten i unedbal-nni.",
+'autoblockedtext' => "Tansa IP inek/inem tesewḥel s-uwurman acku d-aseqdac nniḍen i ttisexdmen. Ladɣa ula d-aseqdac agi, isewḥel-it $1.
 
-$1 iɛekkel-it u yenna-d ''$2''.
+Taɣẓint id yenna : ''$2''.
 
-Tzemreḍ ad tmeslayeḍ akk d $1 neɣ [[{{MediaWiki:Grouppage-sysop}}|anedbal]] nniḍen iwakken ad tsmelayem ɣef uɛekkil-nni.
-Lukan ur tefkiḍ ara email saḥih deg [[Special:Preferences|isemyifiyen n wemseqdac]], ur tezmireḍ ara ad tazneḍ email. Tansa n IP inek n tura d $3, ID n uɛekkil d #$5. Smekti-ten u fka-ten i unedbal-nni.",
+* Tazzwara n usewḥel : $8
+* Taggara n usewḥel : $6
+* Amiḍan i sewḥlen : $7.
+
+
+Tzemreḍ ad tmeslayeḍ s $1 neɣ [[{{MediaWiki:Grouppage-sysop}}|anedbal]] nniḍen iwakken ad tsmelayem ɣef uɛekkil-nni.
+Lukan ur tefkiḍ ara email saḥih deg [[Special:Preferences|isemyifiyen n wemseqdac]], ur tezmireḍ ara ad tazneḍ email.
+Tansa n IP inek n tura d $3, ID n uɛekkil d #$5.
+Smekti-ten u fka-ten i unedbal-nni.",
+'blockednoreason' => 'Ulac taɣẓint',
 'whitelistedittext' => 'Yessefk ad $1 iwakken ad tbeddleḍ isebtar.',
 'confirmedittext' => 'Yessefk ad tsentmeḍ tansa e-mail inek uqbel abeddel. Xtar tansa e-mail di [[Special:Preferences|isemyifiyen n wemseqdac]].',
-'nosuchsectiontitle' => 'Amur ulac-it',
-'nosuchsectiontext' => 'Tɛerḍeḍ ad tbeddleḍ amur ulac-it.',
+'nosuchsectiontitle' => 'Ulamek an af tigezmi',
+'nosuchsectiontext' => 'Tɛerḍeḍ ad tbeddleḍ tigezmi ur llan ara.',
 'loginreqtitle' => 'Yessefk ad tkecmeḍ',
 'loginreqlink' => 'Kcem',
 'loginreqpagetext' => 'Yessefk $1 iwakken ad teẓriḍ isebtar wiyaḍ.',
 'accmailtitle' => 'Awal n tbaḍnit yettwazen.',
-'accmailtext' => 'Awal n tbaḍnit n "$1" yettwazen ar $2.',
+'accmailtext' => "Awal n uɛaddi id yuran s ugacur i [[User talk:$1|$1]] yetwecgaɛ i $2.
+Awal n uɛaddi i umiḍan agi amaynut yezmer ad yetbeddel ɣef usebter n ''[[Special:ChangePassword|ubeddel n awal uɛddi]]'' sakin tuqqna.",
 'newarticle' => '(Amaynut)',
 'newarticletext' => 'Tḍefreḍ azday ɣer usebter mazal ur yettwaxleq ara.
 Akken ad txelqeḍ asebter-nni, aru deg tenkult i tella deg ukessar
 (ẓer [[{{MediaWiki:Helppage}}|asebter n tallat]] akken ad tessneḍ kter).
 Ma tɣelṭeḍ, wekki kan ɣef tqeffalt "Back/Précédent" n browser/explorateur inek.',
-'anontalkpagetext' => "----''Wagi d asebter n umyennan n wemseqdac adrig. Ihi, yessef ad as nefk ID, nesseqdac tansa IP ines akken a t-neɛqel. Tansa IP nni ahat tettuseqdac sɣur aṭṭas n yimdanen. Lukan ula d kečč aqla-k amseqdac adrig u ur tebɣiḍ ara ad tettwabcreḍ izen am wigini, ihi [[Special:UserLogin|xleq isem n wemseqdac neɣ kcem]].''",
+'anontalkpagetext' => "---- ''Wagi d asebter n umyennan n useqdac adrig, mazal ur d-yesnufa ara amiḍan. I taɣẓint agi, ilaq an seqdec tansa IP ines iwakken at-id n sulu. Yiwet tansa IP tezmer at tettuseqdac sɣur aṭṭas n iseqdacen. Lukan ula d kečč aqla-k amseqdac adrig dɣa ur tebɣiḍ ara ad tettwabcreḍ izen am wigini, ihi [[Special:UserLogin/signup|snulfud amiḍan]] naɣ [[Special:UserLogin|qqened]] iwakken sya d asawen ur t-illint ara uguren n usulu.''",
 'noarticletext' => 'Ulac aḍris deg usebter-agi, tzemreḍ ad [[Special:Search/{{PAGENAME}}|tnadiḍ ɣef wezwel n usebter-agi]] deg isebtar wiyaḍ neɣ [{{fullurl:{{FULLPAGENAME}}|action=edit}} tettbeddileḍ asebter-agi].',
 'noarticletext-nopermission' => 'Imira ulac aḍris deg usebter agi.
 Tzemreḍ [[Special:Search/{{PAGENAME}}|ad nadiḍ ɣef azwel agi]] deg isebtaren nniḍen,
 naɣ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|asebter={{FULLPAGENAMEE}}}} ad nadiḍ deg iɣmisen iqqenen]</span>.',
+'missing-revision' => 'Tacaggart #$1 n usebter s isem « {{PAGENAME}} » ulac-itt.
+
+Acku azday n umezruy, ɣef wayen tsennedeḍ, d-aqbur. Asebter yemḥa.
+Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n isebtar yemḥan].',
+'userpage-userdoesnotexist' => 'Amiḍan n useqdac « <nowiki>$1</nowiki> » ur yekles ara. Ilaq ad selkeneḍ ma tebɣiḍ ad snulfuḍ asebter agi.',
+'userpage-userdoesnotexist-view' => 'Amiḍan n useqdac « $1 » ur yekles ara.',
+'blocked-notice-logextract' => 'Aseqdac agi yekyef.
+Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'clearyourcache' => "'''Tamawt:''' Beɛd asmekti, ahat yessefk ad temḥuḍ lkac n browser/explorateur inek akken teẓriḍ ibeddlen. '''Mozilla / Firefox / Safari:''' qqim twekkiḍ ''Shift'' u wekki ɣef ''Reload/Recharger'', neɣ wekki ɣef ''Ctrl-Shift-R'' (''Cmd-Shift-R'' deg Apple Mac); '''IE:''' qqim twekkiḍ ɣef ''Ctrl'' u wekki ɣef ''Refresh/Actualiser'', neɣ wekki ɣef ''Ctrl-F5''; '''Konqueror:''': wekki kan ɣef taqeffalt ''Reload'', neɣ wekki ɣef ''F5''; '''Opera''' yessefk ad tesseqdceḍ ''Tools→Preferences/Outils→Préférences'' akken ad temḥud akk lkac.",
-'usercssyoucanpreview' => "'''Tixidest:''' Sseqdec taqeffalt 'Ssken pre-timeẓriwt' iwakken ad tɛerḍeḍ CSS amynut inek uqbel ad tesmektiḍ.",
-'userjsyoucanpreview' => "'''Tixidest:''' Sseqdec taqeffalt 'Ssken pre-timeẓriwt' iwakken ad tɛerḍeḍ JS amynut inek uqbel ad tesmektiḍ.",
-'usercsspreview' => "'''Smekti belli aql-ak twaliḍ CSS inek kan, mazal ur yettusmekti ara!'''",
+'usercssyoucanpreview' => "'''taxbalut :''' Sseqdec taqeffalt « {{int:showpreview}} » iwakken ad tɛerḍeḍ asebter CSS inek/inem amaynut  uqbel ad aklasteḍ.",
+'userjsyoucanpreview' => "'''taxbalut :''' Sseqdec taqeffalt « {{int:showpreview}} » iwakken ad tɛerḍeḍ asebter JavaScript inek/inem amaynut  uqbel ad aklasteḍ.",
+'usercsspreview' => "'''Cfu-d, wagi d-azaraskan n usebter ik/im n CSS.'''
+'''Mmazal ur yettusmekti ara!'''",
 'userjspreview' => "'''Smekti belli aql-ak tɛerḍeḍ JavaScript inek kan, mazal ur yettusmekti ara!'''",
+'sitecsspreview' => "'''Smekti belli aql-ak tɛerḍeḍ asebter CSS agi inek kan.'''
+'''Mazal ur yettusmekti ara!'''",
+'sitejspreview' => "'''Smekti belli aql-ak tɛerḍeḍ angal agi JavaScript inek kan.'''
+'''Mazal ur yettusmekti ara!'''",
 'userinvalidcssjstitle' => '\'\'\'Aɣtal:\'\'\' Aglim "$1" ulac-it. Ur tettuḍ ara belli isebtar ".css" d ".js" i txedmeḍ sseqdacen azwel i yesɛan isekkilen imecṭuḥen, s umedya: {{ns:user}}:Foo/vector.css akk d {{ns:user}}:Foo/Vector.css.',
 'updated' => '(Yettubeddel)',
 'note' => "'''Tamawt:'''",
@@ -515,17 +701,24 @@ naɣ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|asebter={{FULLPAGENAME
 
 '''Cfut, ttagi d azar-timeẓriwt kan.'''
 Ibeddlen mazal ur ttusmektin ara!",
+'continue-editing' => 'Kemmel abeddel',
 'previewconflict' => 'Pre-timeẓriwt-agi tesskan aḍris i yellan deg usawen lemmer tebɣiḍ a tt-tesmektiḍ.',
 'session_fail_preview' => "'''Suref-aɣ! ur nezmir ara a nesmekti abeddil inek axaṭer yella ugur.
 G leɛnayek ɛreḍ tikelt nniḍen. Lukan mazal yella ugur, ffeɣ umbeɛd kcem.'''",
-'session_fail_preview_html' => "'''Suref-aɣ! ur nezmir ara a nesmekti abeddel inek axaṭer yella ugur.'''
+'session_fail_preview_html' => "'''Ur nezmer ara an aklas ibeddilen inek/inem acku yella asṛuḥu n tilɣa deg taɣimit inek/inem.'''
 
-''Awaṭer wiki-yagi teǧǧa HTML, teffer pre-timeẓriwt akken teǧǧanez antag n JavaScript.''
+''Acku {{SITENAME}} i sermed azar n HTML, azaraskan yeseggelmes iwakken ur t-illint ara tinṭagin s Javascript.''
 
-'''Lukan abeddel agi d aḥeqqani, g leɛnayek ɛreḍ tikelt nniḍen.. Lukan mazal yella ugur, ffeɣ umbeɛd kcem.'''",
+''' Lukan abeddel agi d-aḥeqqani, ɛered tikkelt nniḍen.'''
+Lukan yella ugur, [[Special:UserLogout|Senser]] dɣa qqen.",
+'token_suffix_mismatch' => "'''Abeddel inek/inem ur yeɣbel ara acku iminig inek/inem ur yesettengel ara s umellil isekkilen n uqqa deg asulay n ubeddel.'''
+Tiririt agi telaq i usḍiqqef n usgufsu n uḍris deg usebter.
+Ugur agi, yetilli tikwal mi seqdeceḍ aqeddac Proxy warisem yellan ɣef Web.",
+'edit_form_incomplete' => "'''Kra n iḥricen n tiferkit n ubeddel ur gweḍen ara ar uqeddac, ilaq ad selkeneḍ ma ibeddilen ur erẓen ara dɣa ɛreḍ tikkelt nniḍen.'''",
 'editing' => 'Abeddel n $1',
+'creating' => 'Asnulfu n $1',
 'editingsection' => 'Abeddel n $1 (amur)',
-'editingcomment' => 'Abeddel n $1 (awennit)',
+'editingcomment' => 'Abeddel n $1 (tigezmi tamaynut)',
 'editconflict' => 'Amennuɣ deg ubeddel: $1',
 'explainconflict' => "Amdan nniḍen ibeddel asebter-agi asmi telliḍ tettbeddileḍ.
 Aḍris deg usawen yesɛa asebter am yella tura.
@@ -544,42 +737,88 @@ Aqlak teggaleḍ belli tureḍ wagi d kečč, neɣ teddmiḍ-t seg taɣult azaye
 'copyrightwarning2' => "Ssen belli akk tikkin deg {{SITENAME}} zemren ad ttubeddlen neɣ ttumḥan sɣur imdanen wiyaḍ. Lukan ur tebɣiḍ ara aru inek yettubeddel neɣ yettwazen u yettwaru deg imkanen nniḍen, ihi ur t-tazneḍ ara dagi.<br />
 Aqlak teggaleḍ belli tureḍ wagi d kečč, neɣ teddmiḍ-t seg taɣult azayez neɣ iɣbula tilelliyin (ẓer $1 akken ad tessneḍ kter).
 '''UR TEFKIḌ ARA AXDAM S COPYRIGHT MEBLA TURAGT!'''",
-'longpageerror' => "'''AGUL: Aḍris i tefkiḍ yesɛa $1 kB/ko, tiddi-yagi kter n $2 kB/ko, ur yezmir ara ad yesmekti.'''",
-'readonlywarning' => "'''AƔTAL: Database d tamsekker akken ad teddwaxdem,
-ihi ur tezmireḍ ara ad tesmektiḍ ibeddlen inek tura. Smekti aḍris inek
-deg afaylu nniḍen akken tesseqdceḍ-it umbeɛd.'''",
-'protectedpagewarning' => "'''AƔTAL:  Asebter-agi yettwaḥrez, ala inedbalen zemren a t-beddlen'''",
-'semiprotectedpagewarning' => "'''Tamawt:''' Asebter-agi yettwaḥrez, ala imseqdacen i yesɛan isem n wemseqdac zemren a t-beddlen.",
-'cascadeprotectedwarning' => "'''Aɣtal:''' Asebter-agi iɛekkel iwakken ad zemren ala inedbalen a t-beddlen, axaṭer yettwassekcem deg isebtar i yettwaḥerzen agi (acercur):",
+'longpageerror' => "'''Anezri : Aḍris i sekcemeḍ yeɛbeṛ {{PLURAL:$1|yiwen kilobyte|$1 kilobytes}}, tiddi-yagi kter n talast yellan af {{PLURAL:$2|yiwen kilobyte|$1 kilobytes}}.'''
+Ur yezmer ara ad yetwaḥrez.",
+'readonlywarning' => "'''ƔUR-WET : taffa n isefka t-sekkweṛ i timhelin n ibeddi. Ur tzemreḍ ara ad ḥrezeḍ  ibeddilen tura.'''
+Tzemreḍ ad nɣeleḍ aḍris ik/im deg ufaylu iwakken ad tesqedceḍ sakin.
+
+Anedbal i sekkweṛen taffa n isefka agi, yefka-d taɣẓint agi : $1",
+'protectedpagewarning' => "'''ƔUR-WET : Asebter-agi yettwaḥrez, inedbalen kan i zemren a t-beddlen.'''
+Asekcem aneggaru n uɣmis yella ddaw-agi :",
+'semiprotectedpagewarning' => "'''Tamawt :''' Asebter-agi yettwaḥrez, iseqdacen yesɛan amiḍan kan i zemren a t-beddlen.
+Asekcem aneggaru n uɣmis yella ddaw-agi :",
+'cascadeprotectedwarning' => "'''ƔUR-WET :''' Asebter-agi yettwaḥrez, inedbalen kan i zemren a t-beddlen. Yettwaḥrez acku yettwassekcem  deg {{PLURAL:$1|asebter i ḥerzen agi yesɛan|isebtar i ḥerzen agi yesɛan}} « amesten s uceṛcuṛ » i sermeden :",
+'titleprotectedwarning' => "'''ƔUR-WET : Asebter agi yemesten, dɣa ilaq ad sɛuḍ [[Special:ListGroupRights|izerfan usligen]] iwakken at id snulfuḍ.''' Asekcem aneggaru n uɣmis yebeqqeḍ ddaw agi :",
 'templatesused' => '{{PLURAL:$1|Talɣa i seqdacen|Tilɣatin i seqdacen}} deg usebter agi :',
-'templatesusedpreview' => 'Talɣiwin ttuseqdacen deg pre-timeẓriwt-agi:',
-'templatesusedsection' => 'Talɣiwin ttuseqdacen deg amur-agi:',
+'templatesusedpreview' => '{{PLURAL:$1|Talɣa i seqdacen|Tilɣatin i seqdacen}} deg azaraskan agi :',
+'templatesusedsection' => '{{PLURAL:$1|Talɣa i seqdacen|Tilɣatin i seqdacen}} deg tigezmi agi :',
 'template-protected' => '(yettwaḥrez)',
 'template-semiprotected' => '(nnefṣ-yettwaḥrez)',
 'hiddencategories' => 'Asebter agi yella deg {{PLURAL:$1|Taggayt i ffren|Tiggayin i ffren}} agi :',
 'edittools' => '<!-- Aḍris yettbanen-d seddaw talɣa n ubeddil d uzen. -->',
 'nocreatetitle' => 'Axleq n isebtar meḥdud',
-'nocreatetext' => 'Adeg n internet agi iḥedded axleq n isebtar imaynuten.
-Tzemreḍ a d-uɣaleḍ u tbeddleḍ asebter i yellan, neɣ ad [[Special:UserLogin|tkecmeḍ neɣ ad txelqeḍ isem n wemseqdac]].',
+'nocreatetext' => '{{SITENAME}} yekref iẓubaẓ n usnulfu n isebtar imaynuten.
+Tzemreḍ ad uɣaleḍ ar deffir dɣa ad beddeleḍ asebter yellan yakan, naɣ [[Special:UserLogin|ad qqeneḍ naɣ ad snulfuḍ amiḍan]].',
+'nocreate-loggedin' => 'Ur tesɛiḍ ara turagt i usnulfu n isebtar imaynuten.',
+'sectioneditnotsupported-title' => 'Abeddel n tigezmi agi ur yezmer ara',
+'sectioneditnotsupported-text' => 'Abeddel n tigezmi ur yezmer ara deg usebtar agi n ubeddel.',
+'permissionserrors' => 'Anezri n turagt',
+'permissionserrorstext' => 'Ur tesɛiḍ ara turagt iwakken ad xedmeḍ wayagi i {{PLURAL:$1|taɣẓint|tiɣẓinin}} agi :',
 'permissionserrorstext-withaction' => 'Ur sɛiḍ ara ttesriḥ af $2, i {{PLURAL:$1|taɣẓint|tiɣẓinin}} agi :',
 'recreate-moveddeleted-warn' => "'''Ɣur-wet : asebter agi i tebɣam ad snulfum, yetwekkes uqbel.'''
 
 Ilaq ad snulfum asebter agi haca ma i xater. Aɣmis n isebtaren i twekkesen yella ddaw-agi :",
 'moveddeleted-notice' => 'Asebter agi yetwekkes. Aɣmis n isebtaren i twekkesen yella ddaw agi.',
+'log-fulllog' => 'Ẓeṛ aɣmis ummid',
+'edit-hook-aborted' => 'Abrir n ubeddel s usiɣzef.
+Tamentilt warisem',
+'edit-gone-missing' => 'Ur yezmer ara ad yemucceḍ asebter agi.
+Ahat yetwemḥa.',
+'edit-conflict' => 'Amgirred n ubeddel.',
+'edit-no-change' => 'Abeddel inek/inem ur yetwexdam ara acku ur di ban ara abeddel deg uḍris.',
+'edit-already-exists' => 'Asebter amaynut ur d yesnufu ara.
+Yella yakan.',
+'defaultmessagetext' => 'Izen s lexṣas',
+'content-failed-to-parse' => 'Tasleṭ n ugbur n $2 i talɣa $1 texseṛ : $3',
+'invalid-content-data' => 'Isefka n ugbur ur ɣbelen ara',
+'content-not-allowed-here' => 'Agbur "$1" ur yesɛa ara turagt ɣef usebter [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikiaḍris',
+'content-model-text' => 'aḍris afraray',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
+'expensive-parserfunction-warning' => "'''Ɣur-wet :''' Asebter agi yesɛa aṭas n tiɣriwin ar tiseɣnin ɣlayen n umsisleḍ taseddast.
+Ilaq ad i sɛu ddaw n  $2 {{PLURAL:$2|tiɣri|tiɣriwin }}, wannag tura {{PLURAL:$1|tella $1 tiɣri|llant $1 tiɣriwin}}.",
+'expensive-parserfunction-category' => 'Isebtar yesɛan aṭas tiɣriwin ɣlayen n tiseeɣnin n umsisleḍ taseddast',
 'post-expand-template-inclusion-warning' => 'Ɣur-wet : Asebter agi yesɛa aṭas tilɣatin. Kra n tilɣatin ur zemrent ara ad seqdacent.',
 'post-expand-template-inclusion-category' => 'Isebtaren i sɛan aṭas tilɣatin',
 'post-expand-template-argument-warning' => "'''Ɣur-wet''' : Asebter agi yesɛa tuccḍa deg aɣewwar n yiwet talɣa.",
 'post-expand-template-argument-category' => 'Isebtaren i sɛan iɣewwaren n talɣa ur skazelen ara',
+'parser-template-loop-warning' => 'N-ufad talɣa s tineddict : [[$1]]',
+'parser-template-recursion-depth-warning' => 'Talast n lqay n tiɣriwin n tilɣatin tefel ($1)',
+'language-converter-depth-warning' => 'Talast n lqay n uselkat n tutlayt tefel ($1)',
+'node-count-exceeded-category' => 'Isebtar anda amḍa n tikerwas yefel',
+'node-count-exceeded-warning' => 'Asebter yefelen amḍan n tikerwas',
+'expansion-depth-exceeded-category' => 'Isebtar anda lqay n uderrec yefel',
+'expansion-depth-exceeded-warning' => 'Isebtar yefelen lqay n uderrec',
+'parser-unstrip-loop-warning' => 'Tifin n tineddict ur nezmer ara an sentuter',
+'parser-unstrip-recursion-limit' => 'Talast n usniles ur nezmer ara an sentuter tefel ($1)',
+'converter-manual-rule-error' => 'Tifin n unezri deg alugen awfus n uselket n tutlayt',
 
 # "Undo" feature
 'undo-success' => 'Tzemreḍ ad tessefsuḍ abeddil. Ssenqed asidmer akken ad tessneḍ ayen tebɣiḍ ad txdmeḍ d ṣṣeḥ, umbeɛd smekti ibeddlen u tkemmleḍ ad tessefsuḍ abeddil.',
 'undo-failure' => 'Ur yezmir ara ad issefu abeddel axaṭer yella amennuɣ abusari deg ubeddel.',
+'undo-norev' => 'Abeddel ur yezmer ara ad yetwekkes acku ulac-itt naɣ tetwekkes yakan',
 'undo-summary' => 'Ssefsu tasiwelt $1 sɣur [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]])',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'Ur yezmir ara ad yexleq isem n wemseqdac',
+'cantcreateaccount-text' => "Asnulfu n umiḍan seg tansa IP (<b>$1</b>) tekyef sɣur [[User:$3|$3]].
+
+Taɣẓint n $3 : ''$2''",
 
 # History pages
 'viewpagelogs' => 'Ẓer aɣmis n usebter-agi',
@@ -603,7 +842,7 @@ Tabadut: (tura) = amgirred akk d tasiwelt n tura,
 'history-show-deleted' => 'Ekkes kan',
 'histfirst' => 'Tikkin timezwura',
 'histlast' => 'Tikkin tineggura',
-'historysize' => '($1 bytes/octets)',
+'historysize' => '({{PLURAL:$1|1 atamḍan|$1 itamḍanen}})',
 'historyempty' => '(amecluc)',
 
 # Revision feed
@@ -615,57 +854,157 @@ Ahat yettumḥa neɣ yettbeddel isem-is.
 Ɛreḍ [[Special:Search|ad tnadiḍ deg wiki]] ɣef isebtar imaynuten.',
 
 # Revision deletion
-'rev-deleted-comment' => '(awennit yettwakes)',
+'rev-deleted-comment' => '(agzul n taẓrigt yettwakes)',
 'rev-deleted-user' => '(isem n wemseqdac yettwakes)',
 'rev-deleted-event' => '(asekcem yettwakkes)',
-'rev-deleted-text-permission' => 'Tasiwelt-agi n tettwakkes seg weɣbar azayez.
-Waqila yella kter n talɣut deg [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} aɣmis n umḥay].',
-'rev-deleted-text-view' => 'Tasiwelt-agi n tettwakkes seg weɣbar azayez.
-Kečč d anedbal, tzemreḍ a t-twaliḍ
-Waqila yella kter n talɣut [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} aɣmis n umḥay].',
+'rev-deleted-user-contribs' => '[isem n useqdac naɣ tansa IP yetwemḥa - abeddel yeffer deg tiwsitin]',
+'rev-deleted-text-permission' => "Lqem n usebter agi '''tetwesfeḍ'''.
+Tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n usfeḍ].",
+'rev-deleted-text-unhide' => "Lqem n usebter agi '''tetwesfeḍ'''.
+Tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n usfeḍ].
+Tzemreḍ meqqar [$1 ad ẓṛeḍ lqem agi]  ma tebɣiḍ",
+'rev-suppressed-text-unhide' => "Lqem n usebter agi '''tetwekkes'''.
+Tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n umḥu].
+Tzemreḍ meqqar [$1 ad ẓṛeḍ lqem agi]  ma tebɣiḍ",
+'rev-deleted-text-view' => "Lqem n usebter agi '''tetwesfeḍ'''.
+Tzemreḍ att ẓṛeḍ ; tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n usfeḍ].",
+'rev-suppressed-text-view' => "Lqem n usebter agi '''tetwekkes'''.
+Tzemreḍ att ẓṛeḍ ; tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n umḥu].",
+'rev-deleted-no-diff' => "Ur tzemreḍ ara ad ẓṛeḍ \"diff\" agi acku yiwet n lqem-is '''tetwesfeḍ'''.
+Tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n usfeḍ].",
+'rev-suppressed-no-diff' => "Ur tzemreḍ ara ad ẓṛeḍ \"diff\" agi acku yiwet n lqem-is '''tetwekkes'''.",
+'rev-deleted-unhide-diff' => "Yiwen lqem n tameẓla agi '''yetwesfeḍ'''.
+Tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n usfeḍ].
+Tzemreḍ meqqar [$1 ad ẓṛeḍ tameẓla agi] ma tebɣiḍ",
+'rev-suppressed-unhide-diff' => "Yiwen lqem n tameẓla agi '''yetwekkes'''.
+Tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n umḥu].
+Tzemreḍ meqqar [$1 ad ẓṛeḍ tameẓla agi] ma tebɣiḍ",
+'rev-deleted-diff-view' => "Yiwen lqem n \"diff\" agi '''yetwekkes'''.
+Tzemreḍ att ẓṛeḍ ; tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n umḥu].",
+'rev-suppressed-diff-view' => "Yiwen lqem n \"diff\" agi '''yetwesfeḍ'''.
+Tzemreḍ att ẓṛeḍ ; tilɣa llant deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n usfeḍ].",
 'rev-delundel' => 'ssken/ffer',
+'rev-showdeleted' => 'Ssken',
 'revisiondelete' => 'Mḥu/kkes amḥay tisiwal',
-'revdelete-nooldid-title' => 'Ulac nnican i tasiwelt',
-'revdelete-nooldid-text' => 'Ur textareḍ ara tasiwelt nnican akken ad txedmeḍ tawuri fell-as.',
+'revdelete-nooldid-title' => 'Lqem asaḍas ur i ɣbel ara',
+'revdelete-nooldid-text' => 'Ur textareḍ ara lqem nnican akken ad txedmeḍ tawuri fell-as.',
+'revdelete-nologtype-title' => 'Ulac tawsit n uɣmis',
+'revdelete-nologtype-text' => 'Ur d ssefruḍ ara tawsit n uɣmis ɣef anwa tigawt agi ad tetwexdam.',
+'revdelete-nologid-title' => 'Asekcem n uɣmis ur i ɣbel ara',
+'revdelete-nologid-text' => 'Ur d ssefruḍ ara asekcem n uɣmis ɣef anwa tigawt agi ilaq ad tetwexdam, naɣ tadyant agi ur tella ara.',
+'revdelete-no-file' => 'Afaylu id ssefruḍ ur yella ara.',
+'revdelete-show-file-confirm' => 'Tebɣriḍ ad mḥuḍ tacaggart n ufaylu « <nowiki>$1</nowiki> » n $2 af $3 ?',
+'revdelete-show-file-submit' => 'Ih',
 'revdelete-selected' => "'''{{PLURAL:$2|Tasiwelt tettwafren|Tisiwal ttwafernen}} n [[:$1]]'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Tamirt n uɣmis tettwafren|Isallen n uɣmis ttwafernen}}:'''",
-'revdelete-text' => "'''Tisiwal i yettumḥan ad baben deg umezruy n usebter d weɣmis,
-meɛna imuren seg-sen zemren imdanen a ten-ẓren.'''
-
-Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a ten-mḥan, ḥaca ma llan icekkilen.",
-'revdelete-legend' => 'Eg icekkilen',
+'revdelete-text' => 'Ileqman d tidyanin yettumḥan ad qqimen deg umezruy n usebter dɣa deg iɣmisen, maca agbur nsen ur i sɛu ara tuffart i uzayez."
+Inedbalen wiyaḍ deg {{SITENAME}} zemren ad ẓṛen imuren i yettwafren u zemren a ten-mḥan, ḥaca ma llan icekkilen.',
+'revdelete-confirm' => 'Sergeg ma tebɣiḍ ad xedmeḍ tigawt agi, fehmeḍ inalkamen, dɣa temtawiḍ s [[{{MediaWiki:Policy-url}}|ilugan]].',
+'revdelete-suppress-text' => "Ilaq tukksa at illi kan deg tijṛa agi :
+* tilɣa n yiwen ur ezgan ara
+*: ''tansa, uṭṭun n tilifun, uṭṭun n taɣellist tamettit, …''",
+'revdelete-legend' => 'Sbebd akref n tamuɣli',
 'revdelete-hide-text' => 'Ffer aḍris n tsiwelt',
 'revdelete-hide-image' => 'Ffer ayen yellan deg ufaylu',
 'revdelete-hide-name' => 'Ffer tigawt d nnican',
 'revdelete-hide-comment' => 'Ffer abeddel n uwennit',
 'revdelete-hide-user' => 'Ffer Isem n wemseqdac/IP n umeskar',
-'revdelete-hide-restricted' => 'Eg icekkilen i inedbalen d yimdanen wiyaḍ',
+'revdelete-hide-restricted' => 'Mḥu isefka agi i inedbalen d yimdanen wiyaḍ',
+'revdelete-radio-same' => '(ur beddel ara)',
+'revdelete-radio-set' => 'Ih',
+'revdelete-radio-unset' => 'Ala',
 'revdelete-suppress' => 'Kkes talɣut seg inedbalen d yimdanen wiyaḍ',
 'revdelete-unsuppress' => 'Kkes icekkilen ɣef tisiwal i yuɣalen-d',
 'revdelete-log' => 'Ayɣer',
-'revdelete-submit' => 'Eg-it i tasiwelt tettwafren',
-'revdelete-success' => "'''Asekkud n tasiwelt yettuxdem.'''",
+'revdelete-submit' => 'Snes {{PLURAL:$1|i tacaggart i tettwafren|i ticggarin i tettwafren}}',
+'revdelete-success' => "''Asekkud n ileqman yemucce war uguren.'''",
+'revdelete-failure' => "'''Iẓṛi n lqem ur yemucceḍ ara :'''
+$1",
 'logdelete-success' => "'''Asekkud n tamirt yettuxdem.'''",
+'logdelete-failure' => "'''Iẓṛi n uɣmis ur yezmer ara ad yesbadu :'''
+$1",
 'revdel-restore' => 'beddel timezrit',
 'revdel-restore-deleted' => 'allas iqḍeεen',
 'revdel-restore-visible' => 'allas i nezmer an ẓeṛ',
+'pagehist' => 'Amezruy n usebter',
+'deletedhist' => 'Amezruy yemḥa',
+'revdelete-hide-current' => 'Yella anezri imi nemḥa aferdis yezemzen ass n $1 af $2 : d lqem aneggaru.
+Ur yezmer ara ad yemḥu.',
+'revdelete-show-no-access' => 'Yella anezri imi n beqqeḍ aferdis yezemzen ass n $1 af $2 : yecreḍ am "ukrif".
+Ur tesɛiḍ ara izerfan n wadduf.',
+'revdelete-modify-no-access' => 'Yella anezri imi nebeddel aferdis yezemzen ass n $1 af $2 : yecreḍ am "ukrif".
+Ur tesɛiḍ ara izerfan n wadduf.',
+'revdelete-modify-missing' => 'Yella anezri imi nebeddel aferdis yesɛan ID $1 : Ulac-it deg taffa n isefka !',
+'revdelete-no-change' => "'''Ɣur-wet :''' Aferdis yezemzen ass n $1 af $2 yesɛa yakan iɣewwaren n iẓṛi i tebɣiḍ.",
+'revdelete-concurrent-change' => 'Yella anezri imi nebeddel aferdis yezemzen ass n $1 af $2 : aẓayeris yetwebeddel sɣur amḍan nniḍen mi tbeddeleḍ
+Ẓeṛ iɣmisen.',
+'revdelete-only-restricted' => 'Yella anezri imi nemḥa asekcem yezemzen ass n $1 af $2 : ur tzemreḍ ara ad mḥuḍ iferdisen agi i inedbalen war ad fruḍ tixtiṛiyin nniḍen n umḥu.',
+'revdelete-reason-dropdown' => 'Tiɣẓinin timiranin n umḥu :
+** Akukel n izerfan umeskar (copyright) ;
+** Iwenniten naɣ tilɣa n yiwen ur yezgan ara ;
+** Tilɣa i zemren ad rgemen.',
+'revdelete-otherreason' => 'Taɣẓint nniḍen / taɣzint tamarnant :',
+'revdelete-reasonotherlist' => 'Taɣẓint nniḍen',
+'revdelete-edit-reasonlist' => 'Beddel tiɣẓinin n umḥu i-d-yettuɣalen',
+'revdelete-offender' => 'Ameskar n tacaggart :',
+
+# Suppression log
+'suppressionlog' => 'Aɣmis n isfaḍen',
+'suppressionlogtext' => 'Ddaw-agi, umuɣ n tukksiwin d ikyafen yellan ɣef ugbur yeffren i inedbalen.
+Ẓeṛ [[Special:BlockList|umuɣ ikyafen]] i umuɣ n tiririyin d ikyafen yellan d imahlanen.',
+
+# History merging
+'mergehistory' => 'Zdi amezruy n isebtar',
+'mergehistory-header' => 'Asebtar agi aken yeǧǧ ad tesduklem ileqman n umezruy n usebtar unṣib γer usebtar amaynut.
+Senked d akken tamhelt agi ad eǧǧ amezruy n usebtar ad ikemmel.',
+'mergehistory-box' => 'Zdi lqem n sin isebtar',
+'mergehistory-from' => 'Azar n usebter :',
+'mergehistory-into' => 'Aserken n usebter :',
+'mergehistory-list' => 'Amezruy n ibeddilen i nezmer an zdi',
+'mergehistory-merge' => 'Ileqman id iteddun n [[:$1]] zemren ad twasduklen d [[:$2]]. Seqdec tigejdit n tqeffalt ṛadyu iwakken ad tesdukleḍ ala ileqman yettwasnulfan seg tazwara armi d azmez yettwamlan. Ẓeṛ d akken aseqdec n iseγwan n tunigin ad iwennez tigejdit agi.',
+'mergehistory-go' => 'Ẓeṛ ibeddilen i nezmer an zdi',
+'mergehistory-submit' => 'Azday n ileqman',
+'mergehistory-empty' => 'Ulac lqem i nezmer an zdi.',
+'mergehistory-success' => '$3 {{PLURAL:$3|lqem|ileqman}} n [[:$1]] {{PLURAL:$3|yezdukel|zdukelen}} deg [[:$2]].',
+'mergehistory-fail' => 'Ulamek an zdukel imezruyen. Fru tikkelt nniḍen asebter d iɣewwaren is n uzmez.',
+'mergehistory-no-source' => 'Azar n usebter $1 ulac-it.',
+'mergehistory-no-destination' => 'Aserken n usebter $1 ulac-it',
+'mergehistory-invalid-source' => 'Azar n usebter ilaq ad i sɛu azwel i ɣbelen.',
+'mergehistory-invalid-destination' => 'Aserken n usebter ilaq ad i sɛu azwel i ɣbelen.',
+'mergehistory-autocomment' => '[[:$1]] yezdukel s [[:$2]]',
+'mergehistory-comment' => '[[:$1]] yezdukel s [[:$2]] : $3',
+'mergehistory-same-destination' => 'Asebter n azar d usebter n userken ur zemren ara ad illin d yiwen',
+'mergehistory-reason' => 'Ayɣer',
 
 # Merge log
+'mergelog' => 'Aɣmis n izdayen',
+'pagemerge-logentry' => '[[$1]] yezdukel s [[$2]] (lqem alama d $3)',
 'revertmerge' => 'Fru',
+'mergelogpagetext' => 'Attan tebdart n wesdukel umezruy usebtar deg win n usebtar nniḍen amaynut.',
 
 # Diffs
 'history-title' => 'Tiẓṛi tiss sint umezruy n "$1"',
+'difference-title' => '$1 : Tameẓla gar ileqman',
+'difference-title-multipage' => 'Timeẓliwin gar isebtar « $1 » d « $2 »',
+'difference-multipage' => '(Tameẓla gar isebtar)',
 'lineno' => 'Ajerriḍ $1:',
 'compareselectedversions' => 'Ẓer imgerraden ger tisiwal i textareḍ',
+'showhideselectedversions' => 'Ssken/Ffer ileqman i xtiṛen',
 'editundo' => 'ssefsu',
 'diff-multi' => '({{PLURAL:$1|Yiwet tasiwelt tabusarit|$1 n tisiwal tibusarin}} af {{PLURAL:$2|amseqdac|$2 imseqdacen}} {{PLURAL:$1|ur ttumlal ara|ur ttumlalent ara}})',
+'diff-multi-manyusers' => '({{PLURAL:$1|Yiwen lqem agrawan|$1 ileqman igrawanen}} af {{PLURAL:$2|aseqdac|$2 iseqdacen}} {{PLURAL:$1|yeffer|ffren}})',
+'difference-missing-revision' => '{{PLURAL:$1|Yiwet tacaggart|$1 ticaggartin}} n tameẓla agi ($1) {{PLURAL:$2|ur tella ara (ulac)|ur llant ara (ulac)}}.
+
+Acku azday n tameẓla, ɣef wayen tsennedeḍ, d-aqbur. Asebter yemḥa.
+Tzemreḍ ad affeḍ tilɣa deg [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} uɣmis n isebtar yekksen].',
 
 # Search results
 'searchresults' => 'Igmad n unadi',
 'searchresults-title' => 'Igmad n unadi i "$1"',
 'searchresulttext' => 'Akken ad tessneḍ amek ara tnadiḍ deg {{SITENAME}}, ẓer [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => "Tnadiḍ ɣef '''[[:$1]]'''",
+'searchsubtitle' => "Tnudaḍ « '''[[:$1]]''' » ([[Special:Prefixindex/$1|akkw isebtar i zwiren s « $1 »]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|Akkw isebtar yesɛan azday ɣer « $1 »]])",
 'searchsubtitleinvalid' => "Tnadiḍ ɣef '''$1'''",
+'toomanymatches' => 'Teceggeɛeḍ amḍan ameqqṛan n igemmaḍ, ilaq ad ceggeɛeḍ tuttra nniḍen.',
 'titlematches' => 'Ayen yecban azwel n umegrad',
 'notitlematches' => 'Ulac ayen yecban azwel n umegrad',
 'textmatches' => 'Ayen yecban azwel n usebter',
@@ -676,10 +1015,12 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'nextn-title' => '$1 {{PLURAL:$1|agmud n sakin|igmad n sakin}}',
 'shown-title' => 'Beqqeḍ $1 {{PLURAL:$1|agmud|igmad}} s usebter',
 'viewprevnext' => 'Ẓer ($1 {{int:pipe-separator}} $2) ($3).',
+'searchmenu-legend' => 'Tixtiṛiyin n unadi',
 'searchmenu-exists' => "'''Yella asebter s isem \"[[:\$1]]\" deg wiki agi.'''",
 'searchmenu-new' => "'''Snulfud asebter « [[:$1|$1]] » deg wiki agi !'''",
 'searchhelp-url' => 'Help:Agbur',
-'searchprofile-articles' => 'Isebtaren n ugbur',
+'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Nadi isebtar i zwaren s adat agi]]',
+'searchprofile-articles' => 'Isebtar n ugbur',
 'searchprofile-project' => 'Isebtaren n tallat dɣa n usenfa',
 'searchprofile-images' => 'Agetmedia',
 'searchprofile-everything' => 'Akk',
@@ -691,108 +1032,319 @@ Inedbalen wiyaḍ deg wiki-yagi zemren ad ẓren imuren i yettwafren u zemren a
 'searchprofile-advanced-tooltip' => 'Fren ideggen n isemawen i unadi',
 'search-result-size' => '$1 ({{PLURAL:$2|1 awal|$2 awalen}})',
 'search-result-category-size' => '$1 {{PLURAL:$1|amseqdac|imseqdacen}} $2 ({{PLURAL:$2|adu-taggayt|adu-tiggayin}}, $3 {{PLURAL:$3|afaylu|ifuyla}})',
+'search-result-score' => 'Taflest : $1%',
 'search-redirect' => '(asemmimeḍ $1)',
 'search-section' => '(tigezmi $1)',
 'search-suggest' => 'D awal $1 i tnadiḍ ?',
+'search-interwiki-caption' => 'Isenfaren atmaten',
+'search-interwiki-default' => 'Igemmaḍ ɣef $1 :',
+'search-interwiki-more' => '(ugar)',
+'search-relatedarticle' => 'Amassaɣ',
+'mwsuggest-disable' => 'Ssens isumar n AJAX',
+'searcheverything-enable' => 'Nadi deg akkw tallunin n isemawen',
 'searchrelated' => 'ineqqes',
 'searchall' => 'akk',
 'showingresults' => "Tamuli n {{PLURAL:$1|'''Yiwen''' wegmud|'''$1''' n yigmad}} seg  #'''$2'''.",
 'showingresultsnum' => "Tamuli n {{PLURAL:$3|'''Yiwen''' wegmud|'''$3''' n yigmad}} seg  #'''$2'''.",
 'showingresultsheader' => "{{PLURAL:$5|Agmud '''$1'''|Igmad '''$1–$2'''}} n '''$3''' i '''$4'''",
-'nonefound' => "'''Tamawt''': S umata, asmi ur tufiḍ acemma
-d ilmen awalen am \"ala\" and \"seg\",
-awalen-agi mačči deg tasmult, neɣ tefkiḍ kter n yiwen n wawal (ala isebtar
-i yesɛan akk awalen i banen-d).",
+'nonefound' => "'''Tamawt''' : S lexṣas, ala kra n tallunin n isemawen t-seqdacen i unadi.
+Ɛreḍ s udat ''all:'' i unadi deg akkw ugbur (ula d-isebtar n umeslay, talɣiwin, ...) naɣ seqdec tallunt n isemawen i tebɣiḍ am adat.",
 'search-nonefound' => 'Ulac igmad i usuter agi.',
-'powersearch' => 'Nadi',
+'powersearch' => 'Anadi amahlan',
+'powersearch-legend' => 'Anadi amahlan',
+'powersearch-ns' => 'Nadi deg tallunin n isemawen',
+'powersearch-redir' => 'Beqqeḍ isemmimḍen',
+'powersearch-field' => 'Nadi',
+'powersearch-togglelabel' => 'Ɛellem :',
+'powersearch-toggleall' => 'Akkw',
+'powersearch-togglenone' => 'Ulac',
+'search-external' => 'Anadi yeffɣen',
 'searchdisabled' => 'Anadi deg {{SITENAME}} yettwakkes. Tzemreḍ ad tnadiḍ s Google. Meɛna ur tettuḍ ara, tasmult n google taqdimt.',
 
 # Quickbar
 'qbsettings' => 'Tanuga taǧiḥbuṭ',
-'qbsettings-none' => 'Ulaḥedd',
+'qbsettings-none' => 'Ulac',
 'qbsettings-fixedleft' => 'Aẓelmaḍ',
 'qbsettings-fixedright' => 'Ayeffus',
 'qbsettings-floatingleft' => 'Tufeg aẓelmaḍ',
 'qbsettings-floatingright' => 'Tufeg ayeffus',
+'qbsettings-directionality' => 'Usbiḍ, ɣef wayen n unamud n tira n tutlayt ik/im',
 
 # Preferences page
 'preferences' => 'Isemyifiyen',
 'mypreferences' => 'Isemyifiyen inu',
+'prefs-edits' => 'Amḍan n ibeddlilen :',
 'prefsnologin' => 'Ur tekcimeḍ ara',
-'prefsnologintext' => 'Yessefk ad [[Special:UserLogin|tkecmeḍ]] iwakken textareḍ isemyifiyen inek.',
+'prefsnologintext' => 'Ilaq ad iliḍ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} qqeneḍ]</span> iwakken ad beddeleḍ iɣewwaren ik/im n useqdac.',
 'changepassword' => 'Beddel awal n tbaḍnit',
 'prefs-skin' => 'Aglim',
 'skin-preview' => 'Pre-timeẓriwt',
 'datedefault' => 'Ur sɛiɣ ara asemyifi',
+'prefs-beta' => 'Tiseɣnin bêta',
 'prefs-datetime' => 'Azemz d ukud',
+'prefs-labs' => 'Tiseɣnin « labs »',
+'prefs-user-pages' => 'Isebtar n useqdac',
 'prefs-personal' => 'Profile n wemseqdac',
-'prefs-rc' => 'Ibeddlen imaynuten',
+'prefs-rc' => 'Ibeddilen imaynuten',
 'prefs-watchlist' => 'Umuɣ n uɛessi',
-'prefs-watchlist-days' => 'Geddac n wussan yessefk ad banen deg wumuɣ n uɛessi:',
+'prefs-watchlist-days' => 'Amḍan n ussan i ubeqqeḍ deg umuɣ n uɛassi :',
+'prefs-watchlist-days-max' => 'Afellay $1 {{PLURAL:$1|ass|ussan}}',
 'prefs-watchlist-edits' => 'Geddac n yibeddlen yessefk ad banen deg wumuɣ n uɛessi ameqqran:',
+'prefs-watchlist-edits-max' => 'Amḍan afellay : 1000',
+'prefs-watchlist-token' => 'Tiddest  umuɣ n uɛassi :',
 'prefs-misc' => 'Isemyifiyen wiyaḍ',
+'prefs-resetpass' => 'Beddel awal n uɛaddi',
+'prefs-changeemail' => 'Beddel tansa n e-mail',
+'prefs-setemail' => 'Sbadu yiwet tansa e-mail',
+'prefs-email' => 'Tixtiṛiyin n tira',
+'prefs-rendering' => 'Tummant',
 'saveprefs' => 'Smekti',
-'resetprefs' => 'Reset/réinitialiser isemyifiyen',
+'resetprefs' => 'Asfeḍ n ibeddilen ur ḥrezen ara',
+'restoreprefs' => 'Err akkw azalen s lexṣas',
 'prefs-editing' => 'Abedddil',
+'prefs-edit-boxsize' => 'Lqedd n usfaylu n ubeddel.',
 'rows' => 'Ijerriḍen:',
 'columns' => 'Tigejda:',
 'searchresultshead' => 'Anadi',
 'resultsperpage' => 'Geddac n tiririyin i mkul asebter:',
-'recentchangescount' => 'Geddac n izwal deg ibeddilen imaynuten:',
+'stub-threshold' => 'Talast timinegt i <a href="#" class="stub">izdayen ɣer ibegzan</a> (itamḍanen) :',
+'stub-threshold-disabled' => 'Yensa',
+'recentchangesdays' => 'Amḍan n ussan an beqqeḍ deg ibeddilen ineggura.',
+'recentchangesdays-max' => 'Afellay $1 {{PLURAL:$1|ass|ussan}}',
+'recentchangescount' => 'Amḍan n ibeddilen i ubeqqeḍ s lexṣas :',
+'prefs-help-recentchangescount' => 'Wagi yesɛa deg-es ibeddilen ineggura, isebtar n umezruy d iɣmisen.',
+'prefs-help-watchlist-token' => 'Ččuṛ taɣzut agi s azal lbaḍna dɣa asuddem RSS ad yetwarew i umuɣ inek/inem n uɛassi.
+Akkw amdan yesnen tiddest agi ad yezmer ad i ɣeṛ umuɣ inek/inem n uɛassi, ihi ilaq ad xtiṛeḍ azal yegdelen.
+Ha-t-an azal agacuran i tzemreḍ ad seqdeceḍ : $1',
 'savedprefs' => 'Isemyifiyen inek yettusmektan.',
-'timezonelegend' => 'Iẓḍi n ukud',
-'localtime' => 'Akud inek',
-'timezoneoffset' => 'Amgirred n ukud',
-'servertime' => 'Akud n server',
+'timezonelegend' => 'Iẓḍi n ukud :',
+'localtime' => 'Asrag adigan :',
+'timezoneuseserverdefault' => 'Seqdec azal s lexṣas n wiki ($1)',
+'timezoneuseoffset' => 'Nniḍen (ssefru asekḥer)',
+'timezoneoffset' => 'Asekḥer n usrag¹ :',
+'servertime' => 'Asrag n uqeddac :',
 'guesstimezone' => 'Sseqdec azal n browser/explorateur',
+'timezoneregion-africa' => 'Tafriqt',
+'timezoneregion-america' => 'Tamrikt',
+'timezoneregion-antarctica' => 'Antarktik',
+'timezoneregion-arctic' => 'Arktik',
+'timezoneregion-asia' => 'Asya',
+'timezoneregion-atlantic' => "Agaraw At'lasi",
+'timezoneregion-australia' => 'Usṭralya',
+'timezoneregion-europe' => 'Turuft',
+'timezoneregion-indian' => 'Agaraw Ahendi',
+'timezoneregion-pacific' => 'Agaraw Amelwi',
 'allowemail' => 'Eǧǧ imseqdacen wiyaḍ a k-aznen email',
-'defaultns' => 'Nadi deg yismawen n taɣult s umeslugen:',
+'prefs-searchoptions' => 'Nadi',
+'prefs-namespaces' => 'Talluntin n isemawen',
+'defaultns' => 'Nadi s lexṣas deg tallunin agi n isemawen :',
 'default' => 'ameslugen',
 'prefs-files' => 'Ifayluwen',
+'prefs-custom-css' => 'CSS asagen',
+'prefs-custom-js' => 'JavaScript asagen',
+'prefs-common-css-js' => 'JavaScript  d CSS azduklan i akkw lebsa :',
+'prefs-reset-intro' => 'Tzemreḍ ad seqdeceḍ asebter agi iwakken ad erreḍ iɣewwaren inek/inem ar azalen n lexṣas n usmel.
+Wagi ur yezmer ara ad yetwekkes.',
+'prefs-emailconfirm-label' => 'Aragag n tirawt :',
+'prefs-textboxsize' => 'Tiddi n usfaylu n ubeddel',
 'youremail' => 'E-mail *:',
 'username' => 'Isem n wemseqdac:',
 'uid' => 'Amseqdac ID:',
+'prefs-memberingroups' => 'Aεeggal n {{PLURAL:$1|ugraw|igrawen}} :',
+'prefs-registration' => 'Azmez n tiggezt :',
 'yourrealname' => 'Isem n ṣṣeḥ *:',
 'yourlanguage' => 'Tutlayt:',
-'yourvariant' => 'Ameskil:',
-'yournick' => 'Isem wis sin (mačči d amenṣib):',
+'yourvariant' => 'Lqem nniḍen n tutlayt n ugbur :',
+'prefs-help-variant' => 'Lqem naɣ inun inek/inem iwakken an beqqeḍ agbur n wiki agi.',
+'yournick' => 'Azmul amaynut :',
+'prefs-help-signature' => 'Iwenniten ɣef isebtar n umeslay ilaq ad illin zmelen s « <nowiki>~~~~</nowiki> », sakin ad i sɛu aselkat ɣer azmul inek/inem dɣa azmez d usrag.',
 'badsig' => 'Azmul mačči d ṣaḥiḥ; Ssenqed tags n HTML.',
+'badsiglength' => 'Azmul inek/inem, teɣwzi-s tameqqṛant aṭas.
+Ur ilaq ara ad i sɛu ugar n $1 {{PLURAL:$1|asekkil|isekkilen}}.',
+'yourgender' => 'Tawsit :',
+'gender-unknown' => 'Ulac tumlin',
+'gender-male' => 'Amalay',
+'gender-female' => 'Untay',
+'prefs-help-gender' => 'Axetṛan : yetseqdec iwakken ad yefk tawsit i inzan n ugrudem. Talɣut agi at illi tazayert.',
+'email' => 'E-mail',
 'prefs-help-realname' => '* Isem n ṣṣeḥ (am tebɣiḍ): ma textareḍ a t-tefkeḍ, ad yettuseqdac iwakken ad snen medden anwa yura tikkin inek.',
 'prefs-help-email' => '* E-mail (am tebɣiḍ): Teǧǧi imseqdacen wiyaḍ a k-aznen email mebla ma ẓren tansa email inek.',
 'prefs-help-email-others' => 'Zemreḍ ad eǧǧeḍ wiyeḍ nniḍen ak(akem) cceqɛen izen deg usebter-ik (im) n umyannan war ad effekeḍ tamagit-ik (im).',
+'prefs-help-email-required' => 'Tansa e-mail tesḍulli.',
+'prefs-info' => 'Tilɣa n udasil',
+'prefs-i18n' => 'Asagraɣlan',
+'prefs-signature' => 'Azmul',
+'prefs-dateformat' => 'Amasal n izemzan',
+'prefs-timeoffset' => 'Asekḥer n usrag',
+'prefs-advancedediting' => 'Tixtiṛiyin timahlanin',
+'prefs-advancedrc' => 'Tixtiṛiyin timahlanin',
+'prefs-advancedrendering' => 'Tixtiṛiyin timahlanin',
+'prefs-advancedsearchoptions' => 'Tixtiṛiyin timahlanin',
+'prefs-advancedwatchlist' => 'Tixtiṛiyin timahlanin',
+'prefs-displayrc' => 'Tixtiṛiyin n ubeqqeḍ',
+'prefs-displaysearchoptions' => 'Tixtiṛiyin n ubeqqeḍ',
+'prefs-displaywatchlist' => 'Tixtiṛiyin n ubeqqeḍ',
+'prefs-diffs' => 'Timeẓliwin',
+
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail agi teɣbel',
+'email-address-validity-invalid' => 'Telaq tansa e-mail i ɣbelen !',
 
 # User rights
 'userrights' => 'Laɛej iserfan n wemseqdac',
 'userrights-lookup-user' => 'Laɛej iderman n yimseqdacen',
 'userrights-user-editname' => 'Ssekcem isem n wemseqdac:',
 'editusergroup' => 'Beddel iderman n yimseqdacen',
-'editinguser' => "Abeddel n wemseqdac '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
+'editinguser' => "Abeddel n izerfan n {{GENDER:$1|useqdac|taseqdact}} '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Beddel iderman n wemseqdac',
 'saveusergroups' => 'Smekti iderman n yimseqdacen',
 'userrights-groupsmember' => 'Amaslad deg:',
+'userrights-groupsmember-auto' => 'Aεeggal udrig n :',
+'userrights-groups-help' => 'Tzemreḍ ad beddeleḍ igrawen anda yella aseqdac agi :
+* Taxxamt i tekkin : aseqdac yella deg ugraw agi.
+* Taxxamt ur tekkin ara : aseqdac ur yella ara deg ugraw agi
+* Titrit (*) : ur tzemreḍ ara ad ekkeseḍ agraw agi sakin i tid ernuḍ, naɣ bis-bersa.',
 'userrights-reason' => 'Ayɣer',
+'userrights-no-interwiki' => 'Ur tesɛiḍ ara turagt iwakken ad beddeleḍ izerfan n iseqdacen ɣef wiki nniḍen.',
+'userrights-nodatabase' => 'Taffa n isefka « $1 » ulac itt naɣ mačči d tadigant.',
+'userrights-nologin' => 'Ilaq ad [[Special:UserLogin|qqeneḍ]] s yiwen umiḍan anedbal iwakken ad beddeleḍ izerfan n useqdac.',
+'userrights-notallowed' => 'Amiḍan inek/inem ur yesɛa ara turagt iwakken ad beddeleḍ izerfan n useqdac.',
+'userrights-changeable-col' => 'Igrawen i tzemreḍ ad beddeleḍ',
+'userrights-unchangeable-col' => 'Igrawen ur tzemreḍ ara ad beddeleḍ',
 
 # Groups
 'group' => 'Adrum:',
+'group-user' => 'Iseqdacen',
+'group-autoconfirmed' => 'Iseqdacen i rgegen',
+'group-bot' => 'Iṛubuten',
 'group-sysop' => 'Inedbalen',
+'group-bureaucrat' => 'Imsifellura',
+'group-suppress' => 'Inemdayen',
 'group-all' => '(akk)',
 
-'group-sysop-member' => 'Anedbal',
+'group-user-member' => '{{GENDER:$1|aseqdac|taseqdact}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|manrgeg aseqdac|manrgeg taseqdact}}',
+'group-bot-member' => '{{GENDER:$1|aṛubut}}',
+'group-sysop-member' => '{{GENDER:$1|anedbal|tanedbalt}}',
+'group-bureaucrat-member' => '{{GENDER:$1|amsfellaru}}',
+'group-suppress-member' => '{{GENDER:$1|anemday|tanemdayt}}',
 
+'grouppage-user' => '{{ns:project}}:Iseqdacen',
+'grouppage-autoconfirmed' => '{{ns:project}}:Iseqdacen i rgegen',
+'grouppage-bot' => '{{ns:project}}:Iṛubuten',
 'grouppage-sysop' => '{{ns:project}}:Inedbalen',
+'grouppage-bureaucrat' => '{{ns:project}}:Imsfelluran',
+'grouppage-suppress' => '{{ns:project}}:Inemdayen',
+
+# Rights
+'right-read' => 'Ɣeṛ isebtar',
+'right-edit' => 'Beddel isebtar',
+'right-createpage' => 'Snulfud isebtar (mačči d-isebtar n umeslay)',
+'right-createtalk' => 'Snulfud isebtar n umeslay',
+'right-createaccount' => 'Snulfud imiḍanen n iseqdacen',
+'right-minoredit' => 'Ffer ibeddilen yellan d-imectuḥen',
+'right-move' => 'Beddel isem n isebtar',
+'right-move-subpages' => 'Beddel isem n isebtar d adu-isebtar nsen',
+'right-move-rootuserpages' => 'Beddel isem n usebtar amenzawi n useqdac',
+'right-movefile' => 'Beddel isem n ifuyla',
+'right-suppressredirect' => 'Ur snulfu ara asemmimeḍ seg azwel amezwaru s ubeddel n isem usebter',
+'right-upload' => 'Azen ifuyla',
+'right-reupload' => 'Sefxes afaylu yellan',
+'right-reupload-own' => 'Sefxes afaylu id n-azen.',
+'right-reupload-shared' => 'Ɛefes deg udigan afaylu yellan ɣef azadur azduklan',
+'right-upload_by_url' => 'Kter afaylu seg tansa URL',
+'right-purge' => 'Senger tazarkatut n isebtar war asuter n uragag',
+'right-autoconfirmed' => 'Beddel isebtar azinsegdelen',
+'right-bot' => 'Ad yilli yesniret am ukala yeswurmen',
+'right-nominornewtalk' => 'Ur ndeḥ ara tazmilt n inzan imaynuten ma neseqdac abeddel amectuḥ ɣef usebtar n umeslay n yiwen useqdac',
+'right-apihighlimits' => 'Seqdec tilisa tid ɛlayen deg tuttriwin API',
+'right-writeapi' => 'Seqdec API n ubeddel',
+'right-delete' => 'Mḥu isebtar',
+'right-bigdelete' => 'Mḥu isebtar yesɛan amezruy affuyan',
+'right-deletelogentry' => 'Ekkes ḍɣa erred yiwen asekcem n uɣmis',
+'right-deleterevision' => 'Ekkes dɣa erred yiwen lqem n usebter',
+'right-deletedhistory' => 'Ẓeṛ isekcam n imezruyen yekksen, maca war aḍris nsen',
+'right-deletedtext' => 'Ẓeṛ aḍris yemḥan d timeẓliwin gar ileqman yemḥan',
+'right-browsearchive' => 'Nadi ɣef isebtar yettumḥan',
+'right-undelete' => 'Erred asebter yemḥan',
+'right-suppressrevision' => 'Ssekyed dɣa erred ileqman yefren i inedbalen',
+'right-suppressionlog' => 'Ẓeṛ iɣmisen usligen',
+'right-block' => 'Kyef deg tira iseqdacen nniḍen',
+'right-blockemail' => 'Sḍiqqef aceggaɛ n tira (e-mail) i yiwen useqdac',
+'right-hideuser' => 'Kyef aseqdac s tuffra n isem-is ar udem n uzayez',
+'right-ipblock-exempt' => 'Zizdew tansiwin IP yekyefen, ikyafen iwurmanen d ikyafen n tagrummiwin IP',
+'right-proxyunbannable' => 'Zizdew ikyafen iwurmanen n iqeddacen proxy',
+'right-unblockself' => 'Ad ekkesen akyaf imanen nsen',
+'right-protect' => 'Beddel aswir n umesten n isebtar dɣa beddel isebtar i gdelen',
+'right-editprotected' => 'Beddel isebtar i gdelen (war asegdel s uceṛcuṛ)',
+'right-editinterface' => 'Beddel agrudem n useqdac',
+'right-editusercssjs' => 'Beddel ifuyla CSS d JavaScript n iseqdacen nniḍen',
+'right-editusercss' => 'Beddel ifuyla CSS n iseqdacen nniḍen',
+'right-edituserjs' => 'Beddel ifuyla JavaScript n iseqdacen nniḍen',
+'right-rollback' => 'Ekkes s urured ibeddilen n umedraw aneggaru deg yiwen asebter',
+'right-markbotedits' => 'Creḍ ibeddilen yetwekkesen am aken d aṛubut i tni beddelen.',
+'right-noratelimit' => 'Ur i tilli ara yeswaɣ sɣur tilisa n utug',
+'right-import' => 'Kter ifuyla seg iWikiyen nniḍen',
+'right-importupload' => 'Azen isebtar seg ufaylu',
+'right-patrol' => 'Creḍ ibeddilen n wiyaḍ nniḍen am aken selkenen',
+'right-autopatrol' => 'Ad i sɛu ibeddilen is creḍen s uwurman am aken ɛessan',
+'right-patrolmarks' => 'Ẓeṛ ticraḍ n uɛassi deg ibeddilen imaynuten',
+'right-unwatchedpages' => 'Ẓeṛ umuɣ n isebtar ur sɛan ara iɛssasen',
+'right-mergehistory' => 'Sdukel amezruy n isebtar',
+'right-userrights' => 'Beddel akkw izerfan n yiwen aseqdac',
+'right-userrights-interwiki' => 'Beddel izerfan n iseqdacen yellan deg awiki nniḍen',
+'right-siteadmin' => 'Sekkweṛ naɣ kkes aseḍru i taffa n isefka',
+'right-override-export-depth' => 'Sifeḍ isebtar akkw d isebtar iqqenen alama tadrut n 5 iswiren',
+'right-sendemail' => 'Ceggaɛ tirawt i iseqdacen nniḍen',
+'right-passwordreset' => 'Ẓeṛ tira n uwennez n awalen uɛaddi',
 
 # User rights log
 'rightslog' => 'Aɣmis n yizerfan n wemseqdac',
 'rightslogtext' => 'Wagi d aɣmis n yibeddlen n yizerfan n wemseqdac',
 'rightslogentry' => 'Yettubeddel izerfan n wemseqdac $1 seg $2 ar $3',
+'rightslogentry-autopromote' => 'yesnerna s uwurman seg $2 ar $3',
 'rightsnone' => '(ulaḥedd)',
 
 # Associated actions - in the sentence "You do not have permission to X"
+'action-read' => 'ɣaṛ asebter agi',
 'action-edit' => 'beddel asebter agi',
+'action-createpage' => 'Snulfud isebtar',
+'action-createtalk' => 'snulfud isebtar n umeslay',
+'action-createaccount' => 'snulfud amiḍan agi n useqdac',
+'action-minoredit' => 'cṛeḍ abeddel agi am umectuḥ',
+'action-move' => 'beddel isem n usebter agi',
+'action-move-subpages' => 'beddel isem n usebter agi d adu-isebtar is',
+'action-move-rootuserpages' => 'beddel isem n usebtar amenzawi n useqdac',
+'action-movefile' => 'beddel isem n ufaylu agi',
+'action-upload' => 'Azen afaylu agi',
+'action-reupload' => 'Sefxes afaylu yellan',
+'action-reupload-shared' => 'fel deg udigan afaylu agi yellan ɣef azadur azduklan',
+'action-upload_by_url' => 'Azen afaylu agi seg tansa URL',
+'action-writeapi' => 'seqdec API n tira',
+'action-delete' => 'mḥu asebter-agi',
+'action-deleterevision' => 'mḥu lqem agi',
+'action-deletedhistory' => 'ẓeṛ amezruy yemḥan n usebter agi',
+'action-browsearchive' => 'nadi ɣef isebtar yettumḥan',
+'action-undelete' => 'erred asebter agi',
+'action-suppressrevision' => 'sekyed dɣa uɣaled ar lqem agi yetwekkesen',
+'action-suppressionlog' => 'ẓeṛ aɣmis agi uslig',
+'action-block' => 'Kyef deg tira aseqdac agi',
+'action-protect' => 'beddel iswiren n umesten i usebter agi',
+'action-rollback' => 'ekkes s urured ibeddilen n umedraw aneggaru yebeddelen yiwen usebter',
+'action-import' => 'Kter asebter agi seg wiki nniḍen',
+'action-importupload' => 'Kter asebter agi seg ufaylu n wezdam (upload)',
+'action-patrol' => 'Creḍ abeddel n wiyaḍ nniḍen am aken tesɛa tacaggart',
+'action-autopatrol' => 'ad sɛuḍ tacaggart i ubeddil ik',
+'action-unwatchedpages' => 'Sken-d tabdart n isebtaren ur yettwalan ara.',
+'action-mergehistory' => 'Sdukel amezruy n usebtar agi',
+'action-userrights' => 'Ẓreg izerfan n imseqdacen yark',
+'action-userrights-interwiki' => 'Ẓreg izerfan n umseqdac deg wikis wiyaḍ',
+'action-siteadmin' => 'sekkweṛ naɣ kkes aseḍru i taffa n isefka',
+'action-sendemail' => 'Ceggaɛ tira',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Abeddel|Ibeddlen}}',
-'recentchanges' => 'Ibeddlen imaynuten',
+'recentchanges' => 'Ibeddilen imaynuten',
 'recentchanges-legend' => 'Tifranin n ibeddilen imaynuten',
 'recentchanges-summary' => 'Ḍfer ibeddilen imaynuten n {{SITENAME}}.',
 'recentchanges-feed-description' => 'Ḍfer ibeddilen imaynuten n wiki-yagi deg usuddem-agi.',
@@ -817,11 +1369,14 @@ i yesɛan akk awalen i banen-d).",
 'minoreditletter' => 'm',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
-'number_of_watching_users_pageview' => '[$1 aɛessas/iɛessasen]',
+'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|aɛessas|iɛessasen}}]',
 'rc_categories' => 'Ḥedded i taggayin (ferreq s "|")',
 'rc_categories_any' => 'Ulayɣer',
+'rc-change-size-new' => '$1 {{PLURAL:$1|atamḍan|itamḍanen}} sakin abeddel',
+'newsectionsummary' => '/* $1 */ tigezmi tamaynut',
 'rc-enhanced-expand' => 'Ẓeṛ tilɣa (yeḥwaǧ JavaScript)',
 'rc-enhanced-hide' => 'Ffer tilɣa',
+'rc-old-title' => 'yesnulfad s uzwel « $1 »',
 
 # Recent changes linked
 'recentchangeslinked' => 'Ibeddlen imaynuten n isebtar myezdin',
@@ -836,68 +1391,224 @@ i yesɛan akk awalen i banen-d).",
 # Upload
 'upload' => 'Azen afaylu',
 'uploadbtn' => 'Azen afaylu',
-'reuploaddesc' => 'Uɣal-d ar talɣa n tuznin.',
+'reuploaddesc' => 'Semmewet dɣa uɣaled ar tiferkit n tuznin.',
+'upload-tryagain' => 'Ceggaɛ aglam n ufaylu ibeddelen',
 'uploadnologin' => 'Ur tekcimeḍ ara',
 'uploadnologintext' => 'Yessefk [[Special:UserLogin|ad tkecmeḍ]]
 iwakken ad tazneḍ afaylu.',
+'upload_directory_missing' => 'Akaram n taktert n ufaylu ($1) ulac-it dɣa ur d-yesnulfa ara sɣur aqeddac web.',
 'upload_directory_read_only' => 'Weserver/serveur Web ur yezmir ara ad yaru deg ($1).',
 'uploaderror' => 'Agul deg usekcam',
-'uploadtext' => "Sseqdec talɣa deg ukessar akken ad tazeneḍ tugnawin, akken ad teẓred neɣ ad tnadiḍ tugnawin yettwaznen, ruḥ ɣer [[Special:FileList|umuɣ n usekcam n tugnawin]], Amezruy n usekcam d umḥay hatent daɣen deg [[Special:Log/upload|amezruy n usekcam]].
-
-Akken ad tessekcmeḍ tugna deg usebter, seqdec azay am wagi
-'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Afaylu.jpg]]</nowiki>''',
-'''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Afaylu.png|aḍris]]</nowiki>''' neɣ
-'''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Afaylu.ogg]]</nowiki>''' akken ad iruḥ wezday qbala ar ufaylu.",
+'upload-recreate-warning' => "'''Ɣur-wet : Afaylu s isem agi yetwekkes naɣ yetembiwel.'''
+Aɣmis n tukksiwin d win n ittembiwilen n usebter agi beqqeḍen d-agi i tilɣa :",
+'uploadtext' => "Sseqdec tiferkit agi iwakken ad ktereḍ ifuyla ɣef uqeddac.
+Iwakken ad ẓṛeḍ naɣ ad nadiḍ tugniwin i ktren uqbel, ẓeṛ [[Special:FileList|umuɣ n tugniwin]]. Taktert tella daɣen deg [[Special:Log/upload|aɣmis n taktert n ifuyla]], dɣa inuzal deg [[Special:Log/delete|aɣmis n inuzal]].
+
+Akken ad tessekcmeḍ afaylu deg usebter, seqdec azay am wagi
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:afaylu.jpg]]</nowiki></code>''', iwakken ad beqqeḍeḍ afaylu deg tabadut tačurant (lukan d-tugna) ;
+* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:afaylu.png|200px|thumb|left|aḍris n uglam]]</nowiki></code>''' i useqdac n uqmamaḍ n 200px s tehri deg tanaka af uzelmeḍ s « aḍris n uglam » am aglam ;
+* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:afaylu.ogg]]</nowiki></code>''' iwakken ad qqeneḍ ɣer ufaylu war ubeqqeḍ.",
+'upload-permitted' => 'Amasal n ifuyla i siregen : $1.',
+'upload-preferred' => 'Amasal n ifuyla i smenyifen : $1.',
+'upload-prohibited' => 'Amasal n ifuyla igdelen : $1.',
 'uploadlog' => 'amezruy n usekcam',
 'uploadlogpage' => 'Amezruy n usekcam',
-'uploadlogpagetext' => 'Deg ukessar, yella wumuɣ n usekcam n ufayluwen imaynuten.',
+'uploadlogpagetext' => 'Hat-an umuɣ n ifuyla ineggura i kteren ɣef uqeddac.
+Ẓeṛ [[Special:NewFiles|tihawt n tugniwin timaynutin]].',
 'filename' => 'Isem n ufaylu',
 'filedesc' => 'Agzul',
 'fileuploadsummary' => 'Agzul:',
-'filestatus' => 'Aẓayer n copyright:',
-'filesource' => 'Seg way yekka',
+'filereuploadsummary' => 'Ibeddilen n ufaylu :',
+'filestatus' => 'Aẓayer n uzref n umeskar :',
+'filesource' => 'Aɣbalu :',
 'uploadedfiles' => 'Ifuyla yettwaznen',
 'ignorewarning' => 'Ttu aɣtal u smekti afaylu',
 'ignorewarnings' => 'Ttu iɣtalen',
+'minlength1' => 'Isem ufaylu ilaq ad yesεu ma drus yiwen usekkil',
 'illegalfilename' => 'Isem n ufaylu "$1" yesɛa isekkilen ur tettalaseḍ ara a ten-tesseqdceḍ deg yizwal n isebtar. G leɛnayek beddel isem n ufaylu u azen-it tikkelt nniḍen.',
+'filename-toolong' => 'Isem ufaylu ilaq ad yesεu m-ay aṭas 240 iṭamḍanen (bytes).',
 'badfilename' => 'Isem ufaylu yettubeddel ar "$1".',
+'filetype-mime-mismatch' => 'Asiɣzef n ufaylu « .$1 » ur yesɛa ara tuqqna s tawsit MIME id n-ufa deg ufaylu ($2).',
 'filetype-badmime' => 'Ur tettalaseḍ ara ad tazneḍ ufayluwen n anaw n MIME "$1".',
+'filetype-bad-ie-mime' => 'Afaylu ur yezmer ara ad yetwekter acku yetwaf am « $1 » sɣur Internet Explorer. Tawsit agi d tazanbagt acku d tamihawt.',
+'filetype-unwanted-type' => "'''« .$1 »''' d amasal n ufaylu azanbag.
+Ilaq ad seqdeceḍ {{PLURAL:$3|amasal|imusal}} $2.",
+'filetype-banned-type' => "''' « .$1 » '''mačči d {{PLURAL:$4|amasal yesɛan turagt|imusal yesɛan turagt}}. 
+{{PLURAL:$3|Amasal yesɛan turagt d-wagi :|Imusal yesɛan turagt d-wigi :}} $2.",
 'filetype-missing' => 'Afaylu ur yesɛi ara taseggiwit (am ".jpg").',
+'empty-file' => 'Afaylu id cegɛeḍ d-ilem.',
+'file-too-large' => 'Afaylu id cegɛed d-ameqqṛan aṭas.',
+'filename-tooshort' => 'Isem n ufaylu d-awezzlan aṭas.',
+'filetype-banned' => 'Tawsit agi n ufaylu d-tazanbagt.',
+'verification-error' => 'Afaylu agi ur i ɛedda ara aselken n ifuyla.',
+'hookaborted' => 'Abeddel i ɛerdeḍ ad xedmeḍ yetweḥbes s tamdeyt n usiɣzef.',
+'illegal-filename' => 'Isem n ufaylu agi ur yeɣbel ara.',
+'overwrite' => 'Asefxes n ufaylu yellan ur yeɣbel ara.',
+'unknown-error' => 'Yefkad anezri warisem.',
+'tmp-create-error' => 'Ulamek ad nesnulfu afaylu agi akudan.',
+'tmp-write-error' => 'Anezri deg tira n ufaylu agi akudan.',
 '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.',
+'windows-nonascii-filename' => 'Wiki agi ur yebra ara isemawen n ifuyla s isekkilen usligen.',
 '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.',
+'filepageexists' => 'Asebter n uglam i ufaylu agi yesnulfad yakan d-agi <strong>[[:$1]]</strong>, maca ulac asebter s isem agi.
+Agzul ad efkeḍ tura ur d yettban ara ɣef asebter n uglam.
+Ma tebɣiḍ ad yeban, ilaq ad beddeleḍ s awfus asebter. [[$1|thumb]]',
+'fileexists-extension' => 'Afaylu s yisem yecban wagi yella : [[$2|thumb]]
+* Isem n ufaylu i tezneḍ: <strong>[[:$1]]</strong>
+* Isem n ufaylu i yellan: <strong>[[:$2]]</strong>
+Ilaq ad xtiṛeḍ isem nniḍen.',
 '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 <strong>[[:$1]]</strong>.
 Ma llant kif-kif ur tt-taznepd ara.",
-'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]]',
+'file-thumbnail-no' => "Isem n ufaylu yezwer s <strong>$1</strong>.
+Ahat d lqem tamectuḥt ''(aqmamaḍ)''.
+Lukan tesɛiḍ afaylu s tabadut taɛlayant, azen-it, m-ulac beddel isem-is.",
+'fileexists-forbidden' => 'Afaylu s isem agi yella yakan, dɣa ur yezmer ara ad yetsefxes.
+Ma tebɣiḍ ad azeneḍ afaylu inek/inem, ilaq ad uɣaleḍ ar deffir dɣa ad as efkeḍ isem amaynut.
+[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'Afaylu s isem agi yella yakan deg uzadur n ifuyla azduklan.
+Ma tebɣiḍ ad azeneḍ afaylu inek/inem, ilaq ad uɣaleḍ ar deffir dɣa ad as efkeḍ isem amaynut.
+[[File:$1|thumb|center|$1]]',
+'file-exists-duplicate' => 'Afaylu agi d-asleg n {{PLURAL:$1|ufaylu agi|ifuyla agi}} :',
+'file-deleted-duplicate' => 'Afaylu am wagi ([[:$1]]) yetwekkes yakan. Ilaq ad selkeneḍ aɣmis n tukksiwin n ufaylu agi uqbel atid ktereḍ tikkelt nniḍen.',
 'uploadwarning' => 'Aɣtal deg wazan n ufayluwen',
+'uploadwarning-text' => 'Beddel aglam n ufaylu dɣa ɛreḍ tikkelt nniḍen',
 'savefile' => 'Smekti afaylu',
 'uploadedimage' => '"[[$1]]" yettwazen',
+'overwroteimage' => 'yekter lqem amaynut n « [[$1]] »',
 'uploaddisabled' => 'Suref-aɣ, azen n ufayluwen yettwakkes',
-'uploaddisabledtext' => 'Azen n ufayluwen yettwakkes deg wiki-yagi',
+'copyuploaddisabled' => 'Taktert n ufaylu s URL yensan.',
+'uploadfromurl-queued' => 'Afaylu inek/inem yekcem deg udras n ugani.',
+'uploaddisabledtext' => 'Azen n ifuyla yettwakkes deg wiki agi.',
+'php-uploaddisabledtext' => 'Taktert n ifuyla tensa deg PHP. Selken taxtiṛit n tawila  file_uploads.',
 'uploadscripted' => 'Afaylu-yagi yesɛa angal n HTML/script i yexdem agula deg browser/explorateur.',
 'uploadvirus' => 'Afaylu-nni yesɛa anfafad asenselkim (virus)! Ẓer kter: $1',
-'sourcefilename' => 'And yella afyalu',
-'destfilename' => 'Anda iruḥ afaylu',
-'watchthisupload' => 'Ɛass asebter-agi',
+'uploadjava' => 'Wagi d afaylu ZIP yesɛan afaylu Java .class.
+Azdam n ifuyla Java ur yesɛa ara turagt, acku zemren ad zizdewen ikyafen n taɣellist.',
+'upload-source' => 'Afaylu aɣbalu',
+'sourcefilename' => 'Isem n ufaylu aɣbalu :',
+'sourceurl' => 'URL aγbalu',
+'destfilename' => 'Isem n ufaylu deg aserken',
+'upload-maxfilesize' => 'Tiddi tafellayt n ufaylu : $1',
+'upload-description' => 'Aglam n ufaylu',
+'upload-options' => 'Tixtiṛiyin n taktert ifuyla',
+'watchthisupload' => 'Ɛass asebter agi',
 'filewasdeleted' => 'Afaylu s yisem-agi yettwazen umbeɛd yettumḥa. Ssenqed $1 qbel ad tazniḍ tikelt nniḍen.',
+'filename-bad-prefix' => "Isem n ufaylu yezwer s '''« $1 »''', wagi d isem i sedgeren s uwurman sɣur timsakenwin tumḍinin.
+Xteṛ isem n ufaylu agelmaw.",
 'upload-success-subj' => 'Azen yekfa',
+'upload-success-msg' => 'Taktert inek/inem seg [$2] yesmures. Af-it d-agi : [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'Ugur n taktert',
+'upload-failure-msg' => 'Yella ugur s taktert inek/inem seg [$2] :
+
+$1',
+'upload-warning-subj' => 'Alɣu deg taktert',
+'upload-warning-msg' => 'Yella ugur s taktert seg [$2]. Tzemreḍ ad uɣaleḍ ar [[Special:Upload/stash/$1|tiferkit n taktert]] iwakken ad fruḍ ugur agi.',
 
 'upload-proto-error' => 'Agul deg protokol',
 'upload-proto-error-text' => 'Assekcam yenṭerr URL i yebdan s <code>http://</code> neɣ <code>ftp://</code>.',
 'upload-file-error' => 'Agul zdaxel',
-'upload-file-error-text' => 'Agul n daxel yeḍran asmi yeɛreḍ ad yexleq afaylu temporaire deg server.  G leɛnayek, meslay akk d unedbal n system.',
+'upload-file-error-text' => 'Anezri agensan yeḍran asmi yeɛreḍ ad yesnulfu afaylu akudan ɣef uqeddac. Ilaq ad meslayeḍ s [[Special:ListUsers/sysop|unedbal]].',
 'upload-misc-error' => 'Agul mačči mechur asmi yettwazen ufaylu',
-'upload-misc-error-text' => 'Agul mačči mechur teḍra asmi yettwazen afaylu.  G leɛnayek sseqed belli URL d ṣaḥiḥ u ɛreḍ tikelt nniḍen.  Ma yella daɣen wagul, mmeslay akk d unedbal n system.',
+'upload-misc-error-text' => 'Anezri warisem yegweḍeḍ asmi yettwazen afaylu.
+Ilaq ad selkeneḍ ma URL nni teɣbel, dɣa ɛreḍ tikkelt nniḍen.
+Ma yella daɣen anezri, ilaq ad meslaye ḍ s  [[Special:ListUsers/sysop|unedbal]].',
+'upload-too-many-redirects' => 'URL agi yesɛa aṭas illusen n wesnili.',
+'upload-unknown-size' => 'Tiddi warisem',
+'upload-http-error' => 'Anezri HTTP : $1',
+'upload-copy-upload-invalid-domain' => 'Anɣel n izdamen ur yezmer ara seg taɣult agi.',
+
+# File backend
+'backend-fail-stream' => 'Ulamek an ɣeṛ afaylu $1.',
+'backend-fail-backup' => 'Ulamek an ḥrez afaylu $1.',
+'backend-fail-notexists' => 'Afaylu $1 ulac it.',
+'backend-fail-hashes' => 'Ulamek an sɛu idwayen n ufaylu i usnemhel.',
+'backend-fail-notsame' => 'Afaylu imeẓli yella yakan i $1.',
+'backend-fail-invalidpath' => '$1 mačči d abrid n uḥraz iɣbelen.',
+'backend-fail-delete' => 'Ulamek an mḥu afaylu "$1".',
+'backend-fail-alreadyexists' => 'Afaylu $1 yella yakan.',
+'backend-fail-store' => 'Ulamek an ḥrez afaylu $1 deg $2.',
+'backend-fail-copy' => 'Ulamek an nɣel afaylu $1 deg $2.',
+'backend-fail-move' => 'Ulamek an sekḥer afaylu $1 deg $2.',
+'backend-fail-opentemp' => 'Ulamek an ldi afaylu akudan.',
+'backend-fail-writetemp' => 'Ulamek an aru deg ufaylu akudan.',
+'backend-fail-closetemp' => 'Ulamek an mdel afaylu akudan.',
+'backend-fail-read' => 'Ulamek an ɣeṛ afaylu "$1".',
+'backend-fail-create' => 'Ulamek an aru afaylu "$1".',
+'backend-fail-maxsize' => 'Ulamek an aru afaylu "$1" acku yugar {{PLURAL:$2|yiwen atamḍan|$2 itamḍanen}}.',
+'backend-fail-readonly' => 'Tannalt n uḥraz "$1" yella deg taɣuri kan. Taɣzint id yefka : "$2"',
+'backend-fail-synced' => 'Afaylu "$1" yesɛa addad azanbag deg tannalin n uḥraz tigensanin',
+'backend-fail-connect' => 'Ulamek an qqen ar tannalt n uḥraz "$1".',
+'backend-fail-internal' => 'Yella anezri warisem deg tannalt n uraz "$1".',
+'backend-fail-contenttype' => 'Ulamek ad n efk tawsit n ugbur n ufaylu an ḥrez deg "$1".',
+'backend-fail-batchsize' => 'Tannalt n uḥraz yefkad akemmus n $1 {{PLURAL:$1|tamhelt|timehlin}} n ufaylu ; talast tella ar $2 {{PLURAL:$2|tamhelt|timehlin}}.',
+'backend-fail-usable' => 'Ulamek an ɣeṛ naɣ an aru afaylu « $1 » acku drus izerfan naɣ ikaramen xusen.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Ulamek an qqen ar taffa n isefka n uɣmis i ixf n uḥraz "$1".',
+'filejournal-fail-dbquery' => 'Ulamek an mucceḍ taffa n isefka n uɣmis i ixf n uḥraz "$1".',
+
+# Lock manager
+'lockmanager-notlocked' => 'Ulamek an kkes aseḍru « $1 » ; ur yesɛa ara asekkweṛ.',
+'lockmanager-fail-closelock' => 'Ulamek an mdel afaylu n uzekṛun i « $1 ».',
+'lockmanager-fail-deletelock' => 'Ulamek an mḥu afaylu n uzekṛun i « $1 ».',
+'lockmanager-fail-acquirelock' => 'Ulamek an krez azekṛun i « $1 ».',
+'lockmanager-fail-openlock' => 'Ulamek an ldi afaylu n uzekṛun i « $1 ».',
+'lockmanager-fail-releaselock' => 'Ulamek an bru azekṛun i « $1 ».',
+'lockmanager-fail-db-bucket' => 'Ulamek an siwel ddeqs taffa n isefka n usekkweṛ deg uqbuc $1.',
+'lockmanager-fail-db-release' => 'Ulamek an bru izekṛunen ɣef taffa n isefka $1.',
+'lockmanager-fail-svr-acquire' => 'Ulamek an krez izekṛunen ɣef uqeddac $1.',
+'lockmanager-fail-svr-release' => 'Ulamek an bru izekṛunen ɣef uqeddac $1.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'Yella agul mi d neldi afaylu i senqeden ifuyla zip.',
+'zip-wrong-format' => 'Afaylu agi mačči d afaylu n weɣbaṛ ZIP.',
+'zip-bad' => 'Afaylu agi d afaylu n weɣbaṛ ameggafsu naɣ ur nezmer ara an ɣaṛ deg-es.
+Ur nezmer ara aten selken i taɣellist.',
+'zip-unsupported' => 'Afaylu agi d afaylu n weɣbaṛ i seqdacen tiɣariwin ur yeḥemmel ara MediaWiki.
+Taɣellist ines ur tezmer ara at illi teseklen.',
+
+# Special:UploadStash
+'uploadstash' => 'Tazarkatut n taktert',
+'uploadstash-summary' => 'Asebter agi yetefk addaf i ifuyla yekteren (naɣ yesɛan taktert tanazzalt), maca mazal i beqqeḍen deg wiki. Ifuyla agi mazal id banen, ḥaca i useqdac i tni kteren.',
+'uploadstash-clear' => 'Sfeḍ ifuyla deg tazarkatut',
+'uploadstash-nofiles' => 'Ur tesɛiḍ ara ifuyla deg tazarkatut n taktert',
+'uploadstash-badtoken' => 'Aselkem n tigawt agi yexseṛ, ahat acku tilɣa inek/inem n usulu gweḍent ar tasewti nsent. Ɛreḍ tikkelt nniḍen.',
+'uploadstash-errclear' => 'Asfeḍ n ifuyla yefkad taruẓi',
+'uploadstash-refresh' => 'Mucceḍ umuɣ n ifuyla',
+'invalid-chunk-offset' => 'Tiggit n iɣil ur teɣbel ara',
+
+# img_auth script messages
+'img-auth-accessdenied' => 'Addaf yugwi',
+'img-auth-nopathinfo' => 'Yexus BATH_INFU.
+Aqeddac inek/inem ur yeseɣwer ara iwakken ad i ɛeddi talɣut agi.
+Ahat i lḥu  s CGI dɣa ur s-yezmer ara i img_auth.
+Ẓeṛ https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
+'img-auth-notindir' => 'Abrid yesuteren mačči d akaram n taktert yellan deg tawila.',
+'img-auth-badtitle' => 'Ulamek an ssali azwel i ɣbelen seg « $1 ».',
+'img-auth-nologinnWL' => 'Ur teqqneḍ ara dɣa « $1 » ur yella ara deg umuɣ amellal.',
+'img-auth-nofile' => 'Afaylu « $1 » ulac it.',
+'img-auth-isdir' => 'Tɛerdeḍ ad ldiḍ akaram « $1 ».
+Tzemreḍ kan ad ldiḍ ifuyla.',
+'img-auth-streaming' => 'Taɣuri tamaɣlalt n « $1 ».',
+'img-auth-public' => 'Tasɣent n img_auth.php tella i ubeqqeḍ n ifuyla n yiwen wiki uslig.
+Wiki agi yesɣwer am wiki azayez.
+I taɣellist tameqqṛant, img_auth.php yensa.',
+'img-auth-noread' => 'Aseqdac ur yesɛa ara azref deg taɣuri ɣef « $1 ».',
+'img-auth-bad-query-string' => 'URL tesɛa azrar n tuttra ur i ɣbelen ara.',
+
+# HTTP errors
+'http-invalid-url' => 'URL ur teɣbel ara : $1',
+'http-invalid-scheme' => 'URL s uzenziɣ « $1 » ur ɣbelen ara d-agi.',
+'http-request-error' => 'Anezri warisem deg uceggaɛ n tuttra.',
+'http-read-error' => 'Anezri n taɣuri HTTP.',
+'http-timed-out' => 'Tuttra HTTP teneffeṛ.',
+'http-curl-error' => 'Anezri deg tiririt n URL : $1',
+'http-host-unreachable' => 'Ulamek an siḍes URL',
+'http-bad-status' => 'Yella ugur deg tuttra HTTP : $1 $2',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6' => 'Ur yezmir ara ad yessglu URL',
@@ -908,38 +1619,95 @@ Ma tesɛiḍ tugna-nni s resolution tameqqrant, azen-it, ma ulac beddel isem-is.
 'license' => 'Turagt',
 'license-header' => 'Turagt',
 'nolicense' => 'Ur textareḍ acemma',
+'license-nopreview' => '(Azarskan ur yestufa ara)',
 'upload_source_url' => ' (URL saḥiḥ)',
 'upload_source_file' => ' (afaylu deg uselkim inek)',
 
 # Special:ListFiles
+'listfiles-summary' => 'Asebter agi uslig i εemmed ad yefk umu n akkw ifuyla i kteren.
+Ma aseqdac as yernu tastayt, ala ifuyla s lqem taneggarut id yekter aseqdac nni ad beqqeḍen.',
 'listfiles_search_for' => 'Nadi ɣef yisem n tugna:',
 'imgfile' => 'afaylu',
 'listfiles' => 'Umuɣ n tugniwin',
+'listfiles_thumb' => 'Aqmamaḍ',
 'listfiles_date' => 'Azemz',
 'listfiles_name' => 'Isem',
 'listfiles_user' => 'Amseqdac',
 'listfiles_size' => 'Tiddi (bytes/octets)',
 'listfiles_description' => 'Aglam',
+'listfiles_count' => 'Ileqman',
 
 # File description page
 'file-anchor-link' => 'Afaylu',
 'filehist' => 'Amazray n tugna',
 'filehist-help' => 'Senned ɣef yiwen azmez d usrag iwakken ad ẓṛeḍ afaylu aken yella deg imir nni.',
+'filehist-deleteall' => 'ekkes akkw',
+'filehist-deleteone' => 'ekkes',
 'filehist-revert' => 'Uɣal ar tasiwelt ssabeq',
 'filehist-current' => 'Lux a',
 'filehist-datetime' => 'Azmez/Asrag',
-'filehist-thumb' => 'Tugna tamecṭuḥt',
+'filehist-thumb' => 'Aqmamaḍ',
 'filehist-thumbtext' => 'Tugna tamectuḥt i lqem n $1',
+'filehist-nothumb' => 'Ulac aqmamaḍ',
 'filehist-user' => 'Amseqdac',
 'filehist-dimensions' => 'Iseggiwen',
+'filehist-filesize' => 'Tiddi n ufaylu',
 'filehist-comment' => 'Awennit',
+'filehist-missing' => 'Afaylu ulac-it',
 'imagelinks' => 'Izdayen',
 'linkstoimage' => '{{PLURAL:$1|Asebter agi teseqdac|$1 isebtaren agi teseqdacen}} afaylu agi :',
+'linkstoimage-more' => 'Ugar n {{PLURAL:$1|yiwen asebter|$1 isebtar}} tseqdacen afaylu agi.
+Umuɣ agi yebeqqeḍ ala {{PLURAL:$1|asebter amezwaru|$1 isebtar imezwura}} i seqdacen afaylu agi.
+Yella [[Special:WhatLinksHere/$2|umuɣ ummid]].',
 'nolinkstoimage' => 'Ulaḥedd seg isebtar sɛan azday ar afaylu-agi.',
-'sharedupload' => 'Afaylu-yagi yettuseqdac sɣur wiki tiyaḍ.',
+'morelinkstoimage' => 'Ẓeṛ [[Special:WhatLinksHere/$1|izdayen nniḍen]] ɣer afaylu agi.',
+'linkstoimage-redirect' => '$1 (allus n wesnili n ufaylu) $2',
+'duplicatesoffile' => '{{PLURAL:$1|Afaylu agi d anɣel|Ifuyla agi d ineɣlan}} n ufaylu agi ([[Special:FileDuplicateSearch/$2|tilɣa timarnanin]]) :',
+'sharedupload' => 'Afaylu agi yettuseqdac seg : $1. Yezmer ad yettuseqdac deg isenfaṛen nniḍen',
+'sharedupload-desc-there' => 'Afaylu agi yussad seg : $1. Yezmer ad yetseqdac sɣur isenfaren nniḍen.
+Ẓeṛ [$2 asebter is n uglam] ma tebɣiḍ tilɣa nniḍen.',
 'sharedupload-desc-here' => 'Afaylu agi yusad seg : $1. Ahat yeseqdec deg isenfaṛen nniḍen.
 Aglam-is ɣef [$2 asebter n aglam] ye beqqeḍ ddaw-agi.',
+'sharedupload-desc-edit' => 'Afaylu agi yussad seg : $1. Yezmer ad yetseqdac sɣur isenfaren nniḍen.
+Ahat tebɣiḍ ad beddeleḍ aglam is ɣef [$2 asebter is n uglam].',
+'sharedupload-desc-create' => 'Afaylu agi yussad seg : $1. Yezmer ad yetseqdac sɣur isenfaren nniḍen.
+Ẓeṛ [$2 asebter is n uglam] ma tebɣiḍ tilɣa nniḍen.',
+'filepage-nofile' => 'Ulac afaylu s isem agi.',
+'filepage-nofile-link' => 'Ulac afaylu s isem agi, maca tzemreḍ ad [$1 ktereḍ yiwen].',
 'uploadnewversion-linktext' => 'tazneḍ tasiwelt tamaynut n ufaylu-yagi',
+'shared-repo-from' => 'seg : $1',
+'shared-repo' => 'azadur azduklan',
+'upload-disallowed-here' => 'Ur tzemreḍ ara ad semselsiḍ afaylu agi.',
+
+# File reversion
+'filerevert' => 'Erred $1',
+'filerevert-legend' => 'Erred afaylu',
+'filerevert-intro' => "Ha-ta-n ad uɣaleḍ ar ufaylu  '''[[Media:$1|$1]]''' ar [$4 lqem n $2 af $3].",
+'filerevert-comment' => 'Taɣẓint :',
+'filerevert-defaultcomment' => 'Uɣaleḍ ar lqem n $1 af $2',
+'filerevert-submit' => 'Erred',
+'filerevert-success' => "'''[[Media:$1|$1]]''' yuɣaled ar  [$4 lqem n $2 af $3].",
+'filerevert-badversion' => 'Ulac, deg udigan, lqem aqbur n ufaylu yesɛan azmez agi.',
+
+# File deletion
+'filedelete' => 'Kkes $1',
+'filedelete-legend' => 'Kkes asebter',
+'filedelete-intro' => "Ha-ta-n ad ekkeseḍ '''[[Media:$1|$1]]'' akkw d umezruy is.",
+'filedelete-intro-old' => "Ha-ta-n ad mḥuḍ lqem n '''[[Media:$1|$1]]''' n [$4 $2 af $3].",
+'filedelete-comment' => 'Taɣẓint :',
+'filedelete-submit' => 'Ekkes',
+'filedelete-success' => "'''$1''' yetwekkes.",
+'filedelete-success-old' => "Lqem n '''[[Media:$1|$1]]''' n $2 af $3 yetwekkes.",
+'filedelete-nofile' => "'''$1''' ulac-it.",
+'filedelete-nofile-old' => "Ulac lqem i ɣbeṛen n '''$1''' s ayla agi.",
+'filedelete-otherreason' => 'Taɣẓint nniḍen / taɣzint tamarnant :',
+'filedelete-reason-otherlist' => 'Taɣẓint nniḍen',
+'filedelete-reason-dropdown' => '* Tiɣzinin tillusanin n tukksa n ifuyla
+** Akukel n uzref n umeskar
+** Afaylu yesɛan anɣel',
+'filedelete-edit-reasonlist' => 'Beddel tiɣẓinin n umḥu i-d-yettuɣalen',
+'filedelete-maintenance' => 'Tukksa d tiririt n ifuyla yensa (akudan) deg ugani n ibeddi.',
+'filedelete-maintenance-title' => 'Ulamek an kkes afaylu',
 
 # MIME search
 'mimesearch' => 'Anadi n MIME',
@@ -955,97 +1723,150 @@ Aglam-is ɣef [$2 asebter n aglam] ye beqqeḍ ddaw-agi.',
 
 # Unused templates
 'unusedtemplates' => 'Talɣiwin mebla aseqdac',
-'unusedtemplatestext' => 'Asebter-agi yesɛa umuɣ n akk isebtar n isem n taɣult s yisem "talɣa" iwumi ulac-iten deg ḥedd asebter. Ur tettuḍ ara ad tessenqdeḍ isebtar n talɣa wiyaḍ qbel ad temḥuḍ.',
+'unusedtemplatestext' => 'Asebter-agi yesɛa umuɣ n akkw isebtar n tallunt isemawen « {{ns:template}} » ur llan ara deg asebter nniḍen.
+Ur tettuḍ ara ad selkeneḍ ma ur llan ara izdayen nniḍen ɣer tilɣatin uqbel ad temḥuḍ.',
 'unusedtemplateswlh' => 'izdayen wiyaḍ',
 
 # Random page
 'randompage' => 'Asebter menwala',
-'randompage-nopages' => 'Ulac isebtar deg isem n taɣult agi.',
+'randompage-nopages' => 'Ulac isebtar deg {{PLURAL:$2|tallunt n isemawen|tallunin n isemawen}} : $1.',
 
 # Random redirect
 'randomredirect' => 'Asemmimeḍ menwala',
+'randomredirect-nopages' => 'Ulac asebter n alsanamad deg tallunt n isemawen « $1 ».',
 
 # Statistics
 'statistics' => 'Tisnaddanin',
+'statistics-header-pages' => 'Tisnaddanin n isebtar',
+'statistics-header-edits' => 'Tisnaddanin n ibeddilen',
+'statistics-header-views' => 'Tisnaddanin n iskanen',
 'statistics-header-users' => 'Tisnaddanin n wemseqdac',
+'statistics-header-hooks' => 'Tisnaddanin nniḍen',
+'statistics-articles' => 'Isebtar n ugbur',
+'statistics-pages' => 'Isebtar',
+'statistics-pages-desc' => 'Akkw isebtar n wiki agi, ula d isebtar n umeslay, etc...',
+'statistics-files' => 'Ifuyla yettwaznen',
+'statistics-edits' => 'Ibeddilen n isebtar seg aserkeb n {{SITENAME}}',
+'statistics-edits-average' => 'Amḍan allal n ibeddilen sɣur asebter',
+'statistics-views-total' => 'Iskanen',
+'statistics-views-total-desc' => 'Timuɣliwin n isebtar ur llan ara dɣa d isebtar usligen ur sseddant ara',
+'statistics-views-peredit' => 'Tizra s ubeddel',
+'statistics-users' => '[[Special:ListUsers|Iseqdacen]] i siggezen',
+'statistics-users-active' => 'Iseqdacen urmiden',
+'statistics-users-active-desc' => 'Iseqdacen yesɛan xersum yiwet tigawt seg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}',
 'statistics-mostpopular' => 'isebtar mmeẓren aṭṭas',
 
-'disambiguations' => 'isebtar n usefham',
+'disambiguations' => 'Isebtar yesɛan izdayen ɣer isebtar n tiynisemt',
 'disambiguationspage' => 'Template:Asefham',
-'disambiguations-text' => "Isebtar-agi sɛan azday ɣer '''usebter n usefham'''. Yessefk ad sɛun azday ɣer wezwel ṣaḥiḥ mačči ɣer usebter n usefham.",
+'disambiguations-text' => "Isebtar agi azday ɣer '''asebter n tiynisemt'''.
+Ilaq ad sɛun azday ɣer amagrad amellay.<br />
+Asebter yella d asebter n tiynisemt lukan yetseqdac talɣa i qqenen ar [[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'Asemmimeḍ yeḍra snat tikwal',
 'doubleredirectstext' => 'Mkull ajerriḍ yesɛa azday ɣer asmimeḍ amezwaru akk d wis sin, ajerriḍ amezwaru n uḍris n usebter wis sin daɣen, iwumi yefkan asmimeḍ ṣaḥiḥ i yessefk ad sɛan isebtar azday ɣur-s.',
+'double-redirect-fixed-move' => 'Alsanamud agi, ɣef ayed asaḍas [[$1]] yetwebeddel isem, yetawi tura ɣer [[$2]].',
+'double-redirect-fixed-maintenance' => 'Yetseɣtu alsanamud aslag seg [[$1]] ɣer [[$2]].',
+'double-redirect-fixer' => 'Aseɣtay n aslanamud',
 
 'brokenredirects' => 'Isemmimḍen imerẓa',
-'brokenredirectstext' => 'Isemmimḍen-agi sɛan izdayen ar isebtar ulac-iten:',
+'brokenredirectstext' => 'Isemmimḍen-agi sɛan izdayen ar isebtar ulac-iten :',
 'brokenredirects-edit' => 'beddel',
 'brokenredirects-delete' => 'mḥu',
 
-'withoutinterwiki' => 'isebtar mebla izdayen ar isebtar n wikipedia s tutlayin tiyaḍ',
-'withoutinterwiki-summary' => 'isebtar-agi ur sɛan ara izdayen ar isebtar n wikipedia s tutlayin tiyaḍ:',
+'withoutinterwiki' => 'Isebtar war izdayen ager-tutlayin',
+'withoutinterwiki-summary' => 'Isebtar agi ur sɛan ara izdayen ɣer tutlayin nniḍen :',
+'withoutinterwiki-legend' => 'Adat',
+'withoutinterwiki-submit' => 'Ssken',
+
+'fewestrevisions' => 'Isebtar yesɛan cwiṭ ibeddilen',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte/octet|bytes/octets}}',
 'ncategories' => '$1 {{PLURAL:$1|Taggayt|Taggayin}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|azday|izdayen}}',
 'nmembers' => '$1 {{PLURAL:$1|amaslad|imasladen}}',
 'nrevisions' => '$1 {{PLURAL:$1|tasiwelt|tisiwal}}',
 'nviews' => '$1 {{PLURAL:$1|timeẓriwt|tuẓrin}}',
+'nimagelinks' => 'Yetseqdec ɣef $1 {{PLURAL:$1|asebter|isebtar}}',
+'ntransclusions' => 'yetseqdec ɣef $1 {{PLURAL:$1|asebter|isebtar}}',
 'specialpage-empty' => 'Asebter-agi d ilem.',
 'lonelypages' => 'isebtar igujilen',
-'lonelypagestext' => 'isebtar-agi ur myezdin ara seg isebtar wiyaḍ deg wiki-yagi.',
+'lonelypagestext' => 'Isebtar agi ur sweṛen, ur llan deg isebtar nniḍen n {{SITENAME}}.',
 'uncategorizedpages' => 'isebtar mebla taggayt',
 'uncategorizedcategories' => 'Taggayin mebla taggayt',
-'uncategorizedimages' => 'Tugna mebla taggayt',
+'uncategorizedimages' => 'Ifuyla war taggayin',
 'uncategorizedtemplates' => 'Talɣiwin mebla taggayt',
 'unusedcategories' => 'Taggayin ur nettwaseqdac ara',
 'unusedimages' => 'Ifayluwin ur nettwaseqdac ara',
 'popularpages' => 'Isebtar iɣerfanen',
 'wantedcategories' => 'Taggayin mmebɣant',
 'wantedpages' => 'Isebtar mmebɣan',
+'wantedpages-badtitle' => 'Azwel ur yeɣbel ara deg igmad : $1',
+'wantedfiles' => 'Ifuyla yettwasutren s waṭas.',
+'wantedfiletext-cat' => 'Ifuyla agi tseqdacen, maca ulac iten. Ifuyla n izudar agwemmad zemren ad illin deg umuɣ xas llan. Akkw ufrir imkerku ad <del>yetjerreḍ</del>. Isebtar yesɛan ifuyla ur llan ara, ur d-tebanen ara deg [[:$1]].',
+'wantedfiletext-nocat' => 'Ifuyla agi tseqdacen, maca ulac iten. Ifuyla n izudar agwemmad zemren ad illin deg umuɣ xas llan. Akkw ufrir imkerku ad <del>yetjerreḍ</del>.',
+'wantedtemplates' => 'Talɣiwin yetsuteren',
 'mostlinked' => 'Isebtar myezdin aṭas',
 'mostlinkedcategories' => 'Taggayin myezdint aṭas',
+'mostlinkedtemplates' => 'Talɣiwin yetseqdacen aṭas.',
 'mostcategories' => 'Isebtar i yesɛan aṭṭas taggayin',
-'mostimages' => 'Tugniwin myezdin aṭas',
+'mostimages' => 'Ifuyla i seqdacen aṭas',
+'mostinterwikis' => 'Isebtar yesɛan aṭas interwikis',
 'mostrevisions' => 'Isebtar i yettubedlen aṭas',
 'prefixindex' => 'Akk isebtaren s yisekkilen imezwura',
+'prefixindex-namespace' => 'Akkw isebtar s adat (tallunt n isemawe $1)',
 'shortpages' => 'isebtar imecṭuḥen',
 'longpages' => 'Isebtar imeqqranen',
 'deadendpages' => 'isebtar mebla izdayen',
-'deadendpagestext' => 'isebtar-agi ur sɛan ara azday ɣer isebtar wiyaḍ deg wiki-yagi.',
+'deadendpagestext' => 'Isebtar agi ur sɛan ara izdayen ɣer isebtar nniḍen n {{SITENAME}}.',
 'protectedpages' => 'isebtar yettwaḥerzen',
+'protectedpages-indef' => 'Imestenen imeɣlalen kan',
+'protectedpages-cascade' => 'Imestenen s uceṛcuṛ kan',
 'protectedpagestext' => 'isebtar-agi yettwaḥerzen seg ubeddel neɣ asemmimeḍ',
 'protectedpagesempty' => 'isebtar-agi ttwaḥerzen s imsektayen -agi.',
+'protectedtitles' => 'Izwal ugdilen',
+'protectedtitlestext' => 'Izwal agi ugdilen deg usnulfu nsen',
+'protectedtitlesempty' => 'Ulac azwel yesɛan asegdel s iɣewwaren agi.',
 'listusers' => 'Umuɣ n yimseqdacen',
+'listusers-editsonly' => 'Sekned kan iseqdacen yesɛan asekcem naɣ ugar',
+'listusers-creationsort' => 'Fren s azmez n usnulfu',
+'usereditcount' => '$1 {{PLURAL:$1|abeddel|ibeddilen}}',
 'usercreated' => '{{GENDER:$3|Yesnulfu-d}} ass n $1 ar $2',
 'newpages' => 'isebtar imaynuten',
 'newpages-username' => 'Isem n wemseqdac:',
 'ancientpages' => 'isebtar iqdimen',
 'move' => 'Smimeḍ',
 'movethispage' => 'Smimeḍ asebter-agi',
-'unusedimagestext' => 'Ssen belli ideggen n internet sɛan izdayen ɣer tugna-agi s URL n qbala, ɣas akken tugna-nni hatt da.',
+'unusedimagestext' => 'Ifuyla agi llan, maca ulac asebter anda llan.
+Ahat llan ismal nniḍen yesɛan azday ɣer afaylu, ihi yezmer ad yiqqim afaylu d agi dɣa ad yetseqdac deg ismal nni.',
 'unusedcategoriestext' => 'Taggayin-agi weǧden meɛna ulac isebtar neɣ taggayin i sseqdacen-iten.',
 'notargettitle' => 'Ulac nnican',
 'notargettext' => 'Ur textareḍ ara asebter d nnican neɣ asebter n wemseqdac d nnican.',
+'nopagetitle' => 'Ulac asebter asaḍas am wagi',
+'nopagetext' => 'Asebter asaḍas agi ulac-it.',
 'pager-newer-n' => '{{PLURAL:$1|amaynut|$1 imaynuten}}',
 'pager-older-n' => '{{PLURAL:$1|aqbur|$1 iqburen}}',
+'suppress' => 'Mdi',
+'querypage-disabled' => 'Asebter uslig agi yensa , taɣzint : timellal is.',
 
 # Book sources
 'booksources' => 'Iɣbula n yidlisen',
 'booksources-search-legend' => 'Nadi ɣef iɣbula n yidlisen',
 'booksources-go' => 'Ruḥ',
 'booksources-text' => 'Deg ukessar, yella wumuɣ n yizdayen iberraniyen izzenzen idlisen (imaynuten akk d weqdimen), yernu ahat sɛan kter talɣut ɣef idlisen i tettnadiḍ fell-asen:',
+'booksources-invalid-isbn' => 'ISBN agi ur yeɣbel ara ; selken ma ulac anezri deg-es.',
 
 # Special:Log
-'specialloguserlabel' => 'Amseqdac:',
-'speciallogtitlelabel' => 'Azwel:',
+'specialloguserlabel' => 'Ameskar :',
+'speciallogtitlelabel' => 'Asaḍas (azwel naɣ aseqdac) :',
 'log' => 'Aɣmis',
-'all-logs-page' => 'Akk iɣmisen',
-'alllogstext' => 'Ssken akk iɣmisen n {{SITENAME}}.
-Tzemreḍ ad textareḍ cwiṭ seg-sen ma tebɣiḍ.',
+'all-logs-page' => 'Akk iɣmisen izayezen',
+'alllogstext' => 'Abeqqeḍ n akkw iɣmisen yestufan ɣef {{SITENAME}}.<br />
+Tzemreḍ ad sageneḍ abeqqeḍ s tixtiṛit n tawsit n uɣmis, isem n useqdac naɣ asebter nni.',
 'logempty' => 'Ur yufi ara deg uɣmis.',
 'log-title-wildcard' => 'Nadi ɣef izwal i yebdan s uḍris-agi',
+'showhideselectedlogentries' => 'Beqqeḍ/ffer isekcam n uɣmis agi',
 
 # Special:AllPages
 'allpages' => 'Akk isebtar',
@@ -1053,6 +1874,7 @@ Tzemreḍ ad textareḍ cwiṭ seg-sen ma tebɣiḍ.',
 'nextpage' => 'Asebter ameḍfir ($1)',
 'prevpage' => 'Asebter ssabeq ($1)',
 'allpagesfrom' => 'Ssken isebtar seg:',
+'allpagesto' => 'Beqqeḍ isebtar alama :',
 'allarticles' => 'Akk imagraden',
 'allinnamespace' => 'Akk isebtar ($1 isem n taɣult)',
 'allnotinnamespace' => 'Akk isebtar (mačči deg $1 isem n taɣult)',
@@ -1062,50 +1884,113 @@ Tzemreḍ ad textareḍ cwiṭ seg-sen ma tebɣiḍ.',
 'allpagesprefix' => 'Ssken isebtar s uzwir:',
 'allpagesbadtitle' => 'Azwel n usebter mačči ṣaḥiḥ neɣ yesɛa azwir inter-wiki. Waqila yesɛa isekkilen ur ttuseqdacen ara deg izwal.',
 'allpages-bad-ns' => '{{SITENAME}} ur yesɛi ara isem n taɣult "$1".',
+'allpages-hide-redirects' => 'Ffer isemmimḍen',
+
+# SpecialCachedPage
+'cachedspecial-viewing-cached-ttl' => 'Tetwaliḍ lqem n usebter agi yellan deg tazarkatut, lqem agi yezmer ad i sɛu alama d $1.',
+'cachedspecial-viewing-cached-ts' => 'Tetwaliḍ lqem n usebter agi yellan deg tazarkatut, ahat ur yemucceḍ ara.',
+'cachedspecial-refresh-now' => 'Ẓeṛ aneggaru.',
 
 # Special:Categories
 'categories' => 'Taggayin',
-'categoriespagetext' => 'Llant taggayin-agi deg wiki-yagi.
-[[Special:UnusedCategories|Unused categories]] are not shown here.
-Also see [[Special:WantedCategories|wanted categories]].',
+'categoriespagetext' => '{{PLURAL:$1|Taggayt agi teseqdec|Taggayin agi teseqdecet}} sɣur isebtar naɣ ifuyla.
+[[Special:UnusedCategories|Taggayin ur sɛan ara aqeddic]]
+Ẓeṛ daɣen [[Special:WantedCategories|taggayin yetwesuteren]].',
+'categoriesfrom' => 'Ssken taggayin seg :',
+'special-categories-sort-count' => 'Afran s amḍan n iferdisen',
+'special-categories-sort-abc' => 'afran s ugemmay',
+
+# Special:DeletedContributions
+'deletedcontributions' => 'Isekcam yemḥan',
+'deletedcontributions-title' => 'Isekcam yemḥan',
+'sp-deletedcontributions-contribs' => 'Isekcam',
 
 # Special:LinkSearch
+'linksearch' => 'Anadi n izdayen yeffɣen',
+'linksearch-pat' => 'Anadi n tanfalit :',
+'linksearch-ns' => 'Talluntin n isemawen :',
+'linksearch-ok' => 'Nadi',
+'linksearch-text' => 'Tzemreḍ ad seqdeceḍ isekkilen imeẓliyen am « *.wikipedia.org ».
+Ilaq-asen deg udday taɣult n uswir imineg, am amedya « *.org ».<br />
+Ineggafen imazdayen : <code>$1</code> (ur d-renu acemma deg unadi inek/inem)',
 'linksearch-line' => '$1 yeqqen seg $2',
+'linksearch-error' => 'Tzemreḍ ad seqdeceḍ isekkilen usligen ala deg tazzwara n taɣult uselkim.',
 
 # Special:ListUsers
 'listusersfrom' => 'Ssken imseqdacen seg:',
 'listusers-submit' => 'Ssken',
 'listusers-noresult' => 'Ur yufi ḥedd (amseqdac).',
+'listusers-blocked' => '(yekyef)',
+
+# Special:ActiveUsers
+'activeusers' => 'Umuɣ n iseqdacen urmiden',
+'activeusers-intro' => 'Wagi d umuɣ n iseqdacen yexedmen armud deg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}.',
+'activeusers-count' => '$1 {{PLURAL:$1|abeddel n ussan agi ineggura|ibeddilen n ussan agi ineggura}} deg {{PLURAL:$3|ass aneggaru|$3 ussan ineggura}}',
+'activeusers-from' => 'Ssken iseqdacen seg :',
+'activeusers-hidebots' => 'Ffer iṛubuten',
+'activeusers-hidesysops' => 'Ffer inedbalen',
+'activeusers-noresult' => 'Ur yufi aseqdac.',
 
 # Special:Log/newusers
 'newuserlogpage' => 'Aɣmis n isnulfan n  imiḍanen n imseqdacen',
+'newuserlogpagetext' => 'Asebter agi yebeqqeḍ amezruy n usnulfu n imiḍanen n iseqdacen.',
 
 # Special:ListGroupRights
+'listgrouprights' => 'Izerfan n igrawen n iseqdacen',
+'listgrouprights-summary' => 'Asebter agi yesɛa yiwen umuɣ n igrawen i sengelen deg wiki agi dɣa izerfan n wadduf i qqenen.
+Zemrent ad ilint [[{{MediaWiki:Listgrouprights-helppage}}|tilɣa nniḍen]] ɣef izerfan n yiwen.',
+'listgrouprights-key' => '*<span class="listgrouprights-granted">Izerfan sefkan</span>
+*<span class="listgrouprights-revoked">Izerfan ekkesen</span>',
+'listgrouprights-group' => 'Agraw',
+'listgrouprights-rights' => 'Izerfan',
+'listgrouprights-helppage' => 'Help:Izerfan n igrawen',
 'listgrouprights-members' => '(umuɣ n imseqdacen)',
+'listgrouprights-addgroup' => 'Rnu iεeggalen i {{PLURAL:$2|ugraw|igrawen}} : $1',
+'listgrouprights-removegroup' => 'Ekkes iεeggalen i {{PLURAL:$2|ugraw|igrawen}} : $1',
+'listgrouprights-addgroup-all' => 'Rnu iεeggalen i akkw igrawen',
+'listgrouprights-removegroup-all' => 'Ekkes iεeggalen i akkw igrawen',
+'listgrouprights-addgroup-self' => 'Yezmer ad yernu {{PLURAL:$2|agraw|igrawen}} ar umiḍan-is : $1',
+'listgrouprights-removegroup-self' => 'Yezmer ad yekkes {{PLURAL:$2|agraw|igrawen}} ar umiḍan-is : $1',
+'listgrouprights-addgroup-self-all' => 'Yezmer ad yernu akkw igrawen ar umiḍan-is',
+'listgrouprights-removegroup-self-all' => 'Yezmer ad yekkes akkw igrawen ar umiḍan-is',
 
 # E-mail user
 'mailnologin' => 'Ur yufi ḥedd (tansa)',
 'mailnologintext' => 'Yessefk ad [[Special:UserLogin|tkecmeḍ]] u tesɛiḍ tansa e-mail ṭaṣhiḥt deg [[Special:Preferences|isemyifiyen]] inek
 iwakken ad tazneḍ email i imseqdacen wiyaḍ.',
 'emailuser' => 'Azen e-mail i wemseqdac-agi',
-'emailpage' => 'Azen e-mail i wemseqdac',
-'emailpagetext' => 'Lukan amseqdac-agi yefka-d tansa n email ṣaḥiḥ
-deg imsifiyen ines, talɣa deg ukessar a t-tazen izen.
-Tansa n email i tefkiḍ deg imisifyen inek ad tban-d
-deg « Expéditeur» n izen inek iwakken amseqdac-nni yezmer a k-yerr.',
+'emailuser-title-target' => 'Ceggaɛ tirawt i {{GENDER:$1|aseqdac agi|taseqdact agi}}',
+'emailuser-title-notarget' => 'Ceggaɛ tirawt i useqdac',
+'emailpage' => 'Ceggaɛ tirawt i useqdac',
+'emailpagetext' => 'Tzemreḍ ad seqdeceḍ tiferkit ddaw agi iwakken ad ceggɛeḍ tirawt i useqdac agi.
+Tansa e-mail id ekfeḍ deg [[Special:Preferences|iɣewwaren inek/inem]] ad tban deg urti "Amceggaɛ" n izen ; akka, anermas ad yezmer ak/akem yefk tiririt.',
 'usermailererror' => 'Yella ugul deg uzwel n email:',
-'defemailsubject' => 'e-mail n {{SITENAME}}',
+'defemailsubject' => '{{SITENAME}} tirawt n useqdac « $1 »',
+'usermaildisabled' => 'Aceggaɛ n tira gar iseqdacen yensa',
+'usermaildisabledtext' => 'Ur tzermeḍ ara ad ceggeɛeḍ tira i iseqdacen nniḍen ɣef wiki agi',
 'noemailtitle' => 'E-mail ulac-it',
-'noemailtext' => 'Amseqdac-agi ur yefki ara e-mail ṣaḥiḥ, neɣ ur yebɣi ara e-mailiyen seg medden.',
-'emailfrom' => 'Seg',
-'emailto' => 'i',
-'emailsubject' => 'Asentel',
-'emailmessage' => 'Izen',
+'noemailtext' => 'Aseqdac-agi ur d-yefka ara tansa e-mail iɣbelen.',
+'nowikiemailtitle' => 'Ulac turagt i e-mail',
+'nowikiemailtext' => 'Aseqdac agi ur yebɣa ara ad yeṭṭef tirawt sɣur iseqdacen nniḍen.',
+'emailnotarget' => 'Isem useqdac n unermas ur yella ara naɣ ur yeɣbel ara.',
+'emailtarget' => 'Sekcem isem useqdac n unermas',
+'emailusername' => 'Isem n useqdac',
+'emailusernamesubmit' => 'Sumer',
+'email-legend' => 'Ceggaɛ tirawt i yiwen useqdac nniḍen n {{SITENAME}}',
+'emailfrom' => 'Seg :',
+'emailto' => 'I :',
+'emailsubject' => 'Asentel :',
+'emailmessage' => 'Izen :',
 'emailsend' => 'Azen',
 'emailccme' => 'Azen-iyi-d e-mail n ulsaru n izen inu.',
 'emailccsubject' => 'Alsaru n izen inek i $1: $2',
 'emailsent' => 'E-mail yettwazen',
 'emailsenttext' => 'Izen n e-mail inek yettwazen.',
+'emailuserfooter' => 'Tirawt agi tetweceggaɛ sɣur « $1 » i « $2 » s tasɣent "Ceggaɛ tirawt i useqdac" n {{SITENAME}}.',
+
+# User Messenger
+'usermessage-summary' => 'Yeǧǧa-d izen anagraw',
+'usermessage-editor' => 'Ameskar n unagraw',
 
 # Watchlist
 'watchlist' => 'Umuɣ n uɛessi inu',
@@ -1115,17 +2000,20 @@ deg « Expéditeur» n izen inek iwakken amseqdac-nni yezmer a k-yerr.',
 'watchlistanontext' => 'G leɛnaya-k $1 iwakken ad twalaḍ neɣ tbeddleḍ iferdas deg wumuɣ n uɛessi inek.',
 'watchnologin' => 'Ur tekcimeḍ ara',
 'watchnologintext' => 'Yessefk ad [[Special:UserLogin|tkecmeḍ]] iwakken ad tbeddleḍ umuɣ n uɛessi inek.',
+'addwatch' => 'Rnu i umuɣ n uɛassi',
 'addedwatchtext' => "Asebter \"[[:\$1]]\" yettwarnu deg [[Special:Watchlist|wumuɣ n uɛessi]] inek.
 Ma llan ibeddlen deg usebter-nni neɣ deg usbtar umyennan ines, ad banen dagi,
 Deg [[Special:RecentChanges|wumuɣ n yibeddlen imaynuten]] ad banen s '''yisekkilen ibberbuzen''' (akken ad teẓriḍ).
 
 Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk aɛessi\".",
-'removedwatchtext' => 'Asebter "[[:$1]]" yettwakkes seg wumuɣ n uɛessi inek.',
+'removewatch' => 'Ekkes seg umuɣ n uɛassi',
+'removedwatchtext' => '!!Asebter "[[:$1]]" yettwakkes seg [[Special:Watchlist|umuɣ n uɛessi]] inek.',
 'watch' => 'Ɛass',
 'watchthispage' => 'Ɛass asebter-agi',
 'unwatch' => 'Fakk aɛassi',
 'unwatchthispage' => 'Fakk aɛassi',
 'notanarticle' => 'Mačči d amagrad',
+'notvisiblerev' => 'Lqem tetwemḥa',
 'watchnochange' => 'Ulaḥedd n yiferdas n wumuɣ n uɛessi inek ma yettubeddel deg tawala i textareḍ.',
 'watchlist-details' => 'ttɛassaɣ {{PLURAL:$1|$1 usebter|$1 n isebtaren}} mebla isebtaren "amyannan".',
 'wlheader-enotif' => '* Yeǧǧa Email n talɣut.',
@@ -1134,44 +2022,49 @@ Ma tebɣiḍ ad tekkseḍ asebter seg wumuɣ n uɛessi inek, wekki ɣef \"Fakk a
 'watchmethod-list' => 'yessenqed isebtar i ttɛassaɣ i ibeddlen imaynuten',
 'watchlistcontains' => 'Umuɣ n uɛessi inek ɣur-s $1 n {{PLURAL:$1|usebter|isebtar}}.',
 'iteminvalidname' => "Agnu akk d uferdis '$1', isem mačči ṣaḥiḥ...",
-'wlnote' => "Deg ukessar {{PLURAL:$1|yella yiwen ubeddel aneggaru|llan '''$1''' n yibeddlen ineggura}} deg {{PLURAL:$2|saɛa taneggarut|'''$2''' swayeɛ tineggura}}.",
+'wlnote' => "Ddaw agi  {{PLURAL:$1|yella abeddel aneggaru|llan '''$1''' ibeddilen ineggura}} n {{PLURAL:$2|usrag aneggaru|'''$2''' isragen ineggura}}, seg $3 af $4.",
 'wlshowlast' => 'Ssken $1 n swayeɛ $2 n wussan neɣ $3 ineggura',
 'watchlist-options' => 'Tifranin n umuɣ n uɛessi',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Ad iɛass...',
 'unwatching' => 'Ad ifukk aɛessi...',
+'watcherrortext' => 'Yella anezri imi tebeddeleḍ iɣewwaren n umuɣ inek/inem n uɛassi i « $1 ».',
 
 'enotif_mailer' => 'Email n talɣut n {{SITENAME}}',
 'enotif_reset' => 'Rcem akk isebtar mmeẓren',
-'enotif_newpagetext' => 'Wagi d asebter amaynut.',
 'enotif_impersonal_salutation' => 'Amseqdac n {{SITENAME}}',
-'changed' => 'yettubeddel',
-'created' => 'yettwaxleq',
-'enotif_subject' => 'Asebter $PAGETITLE n {{SITENAME}} $CHANGEDORCREATED sɣur $PAGEEDITOR',
 'enotif_lastvisited' => 'Ẓer $1 i akk ibeddlen segwasmi tkecmeḍ tikelt taneggarut.',
 'enotif_lastdiff' => 'Ẓer $1 akken ad tmuqleḍ abeddel.',
+'enotif_anon_editor' => 'aseqdac ur i siggezen ara $1',
 'enotif_body' => 'Ay $WATCHINGUSERNAME,
 
-Asebter n {{SITENAME}} $PAGETITLE $CHANGEDORCREATED deg wass $PAGEEDITDATE sɣur $PAGEEDITOR, ẓer $PAGETITLE_URL i tasiwelt n tura.
+Asebter « $PAGETITLE » n {{SITENAME}} $CHANGEDORCREATED ass n $PAGEEDITDATE sɣur « $PAGEEDITOR », ẓeṛ $PAGETITLE_URL iwakken ad ẓṛeḍ lqem n tura.
 
 $NEWPAGE
 
 Abeddel n wegzul: $PAGESUMMARY $PAGEMINOREDIT
 
-Meslay akk d ambeddel:
-email: $PAGEEDITOR_EMAIL
+Meslay s umbeddel:
+e-mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Ur yelli ara email n talɣut asmi llan ibeddlen deg usebter ala lukan teẓreḍ asebter-nni. Tzemreḍ ad terreḍ i zero email n talɣut i akk isebraen i tettɛasseḍ.
+Ur yelli ara email n talɣut asmi llan ibeddlen deg usebter ala lukan teẓreḍ asebter-nni.
+Tzemreḍ ad awennezeḍ akkw isenǧaqen n talɣut i akkw isebtar yellan deg umuɣ inek/inem n uɛassi.
 
-             email n talɣut n {{SITENAME}}
+             Anagraw inek/inem n talɣut n {{SITENAME}}
 
 --
-Akken ad tbeddleḍ n wumuɣ n uɛessi inek settings, ruḥ ɣer
+Iwakken ad beddeleḍ iɣewwaren n talɣut deg tirawt, ẓeṛ
+{{canonicalurl:{{#special:Preferences}}}}
+
+Iwakken ad beddeleḍ iɣewwaren n umuɣ inek/inem n uɛassi, ẓeṛ
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-Tadhelt:
+Iwakken ad mḥuḍ asebter deg umuɣ inek/inem n uɛassi, ẓeṛ
+$UNWATCHURL
+
+Tuɣalin d tadhelt :
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -1181,7 +2074,10 @@ Tadhelt:
 'excontentauthor' => "Ayen yella: '$1' ('[[Special:Contributions/$2|$2]]' kan i yekken deg-s)",
 'exbeforeblank' => "Ayen yella uqbal ma yettumḥa: '$1'",
 'exblank' => 'asebter yella d ilem',
-'historywarning' => 'Aɣtal: Asebter i ara temḥuḍ yesɛa amezruy:',
+'delete-confirm' => 'Kkes "$1"',
+'delete-legend' => 'Ekkes',
+'historywarning' => 'Ɣur-wet : Asebter i ara temḥuḍ yesɛa amezruy s azal alemmas n $1 {{PLURAL:$1|lqem|ileqman}} :',
+'confirmdeletetext' => 'Aqlak ad mḥuḍ asebter naɣ afaylu, dɣa akkw ileqman-is iqdimen. Ilaq ad segegeḍ tigawt agi dɣa tfehemeḍ [[{{MediaWiki:Policy-url}}|ilugan n wiki]].',
 'actioncomplete' => 'Axdam yekfa',
 'actionfailed' => 'Tigawt agi texser',
 'deletedtext' => '"$1" yettumḥa.
@@ -1191,14 +2087,29 @@ Tadhelt:
 'deletionlog' => 'Aɣmis n umḥay',
 'reverted' => 'Asuɣal i tasiwel taqdimt',
 'deletecomment' => 'Ayɣer',
+'deleteotherreason' => 'Taɣẓint nniḍen / taɣzint tamarnant :',
+'deletereasonotherlist' => 'Taɣẓint nniḍen',
+'deletereason-dropdown' => '* Tiɣẓinin n umḥu id t-uɣalen aṭas tikkwal
+** Asuter n useqdac
+** Akukel n izerfan umeskar
+** Asfata',
+'delete-edit-reasonlist' => 'Beddel tiɣẓinin n umḥu n usebter',
+'delete-toobig' => 'Asebter agi yesɛa amezruy ameqqṛan aṭas n ibeddilen, yugar $1 {{PLURAL:$1|lqem|ileqman}}.
+Amḥu n isebtar am wagi yesɛa akref iwakken {{SITENAME}} ur yesɛu ara arway.',
 
 # Rollback
+'rollback' => 'Semmet ibeddilen',
+'rollback_short' => 'Semmet',
 'rollbacklink' => 'semmet',
+'rollbacklinkcount' => 'semmet $1 {{PLURAL:$1|abeddel|ibeddilen}}',
+'rollbacklinkcount-morethan' => 'semmet ugar n $1 {{PLURAL:$1|abeddel|ibeddilen}}',
+'rollbackfailed' => 'Asemmet yexseṛ',
 'cantrollback' => 'Ur yezmir ara ad yessuɣal; yella yiwen kan amseqdac iwumi ibeddel/yexleq asebter-agi.',
 'editcomment' => "Agzul n ubeddel yella: \"''\$1''\".",
 'revertpage' => 'Yessuɣal ibeddlen n [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]]); yettubeddel ɣer tasiwelt taneggarut n [[User:$1|$1]]',
 
 # Edit tokens
+'sessionfailure-title' => 'Anezri n tɣimit',
 'sessionfailure' => 'Yella ugul akk d takmect inek;
 Axdam-agi yebṭel axaṭer waqila yella wemdan nniḍen i yeddem isem n wemseqdac inek.
 G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek, umbeɛd wekki ɣef "Actualiser/reload" akk ad tɛerḍeḍ tikelt nniḍen.',
@@ -1206,33 +2117,73 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 # Protect
 'protectlogpage' => 'Aɣmis n wemḥay',
 'protectedarticle' => '"[[$1]]" yettwaḥrez',
-'protect-title' => 'Ad yeḥrez "$1"',
+'modifiedarticleprotection' => 'yebeddel aswir n usegdel n « [[$1]] »',
+'unprotectedarticle' => 'yekkes asegdel n « [[$1]] »',
+'movedarticleprotection' => 'yesiweḍ iɣewwaren n usegdel seg « [[$2]] » ɣer « [[$1]] »',
+'protect-title' => 'Beddel aswir n usegdel i "$1"',
+'protect-title-notallowed' => 'Ẓeṛ aswir n usegdel n « $1 »',
 'prot_1movedto2' => '[[$1]] yettusmimeḍ ar [[$2]]',
+'protect-badnamespace-title' => 'Tallunt n isemawen ur nezmer ara an segdel',
+'protect-badnamespace-text' => 'Isebtar deg tallunt agi n isemawen ur zemren ara ad sɛun asegdel.',
 'protect-legend' => 'Sentem tiḥḥerzi',
+'protectcomment' => 'Taɣẓint :',
+'protectexpiry' => 'Azmez n tasewti :',
+'protect_expiry_invalid' => 'Azmez n tasewti ur yeɣbel ara.',
+'protect_expiry_old' => 'Azmez n tasewti i ɛedda.',
+'protect-unchain-permissions' => 'Kkes aseḍru i aṭas n tixtiṛiyin n usegdel',
 'protect-default' => '(ameslugen)',
+'protect-fallback' => 'Yeḥweǧ atrug « $1 »',
 'protect-level-sysop' => 'Inedbalen kan',
 'protect-summary-cascade' => 'acercur',
 'protect-expiring' => 'yemmut deg $1 (UTC)',
+'protect-expiring-local' => 'ad i neffeṛ ass n $1',
+'protect-expiry-indefinite' => 'ifeḍ',
+'protect-othertime' => 'Azmez nniḍen n tasewti :',
+'protect-othertime-op' => 'azmez nniḍen n tasewti',
+'protect-existing-expiry' => 'Yella azmez n tasewti : $2 af $3',
+'protect-otherreason' => 'Taɣẓint nniḍen / taɣzint tamarnant :',
+'protect-otherreason-op' => 'Taɣẓint nniḍen',
+'protect-edit-reasonlist' => 'Beddel tiɣẓinin n usegdel',
+'protect-expiry-options' => '1 asrag:1 hour,1 ass:1 day,1 imalas:1 week,2 imalasen:2 weeks,1 aggur:1 month,3 agguren:3 months,6 agguren:6 months,1 assegwas:1 year,adfi:infinite',
 'restriction-type' => 'Turagt',
+'restriction-level' => 'Aswir n ukrif :',
 'minimum-size' => 'Tiddi minimum',
+'maximum-size' => 'Tiddi tafellayt',
+'pagesize' => '(atamḍan)',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Beddel',
 'restriction-move' => 'Smimeḍ',
+'restriction-create' => 'Snulfu',
+'restriction-upload' => 'Taktert n ifuyla',
+
+# Restriction levels
+'restriction-level-sysop' => 'asegdel ummid',
+'restriction-level-autoconfirmed' => 'adu-asegdel',
+'restriction-level-all' => 'akkw aswir',
 
 # Undelete
+'undelete' => 'Ẓer isebtar yettumḥan',
+'undeletepage' => 'Ẓeṛ dɣa erred isebtar yetwekkesen',
+'undeletepagetitle' => "'''Umuɣ agi yesɛa ileqman yetwekkesen n [[:$1|$1]]'''.",
 'viewdeletedpage' => 'Ẓer isebtar yettumḥan',
+'undelete-fieldset-title' => 'Erred ileqman',
+'undeleterevisions' => '$1 {{PLURAL:$1|lqem i ɣbeṛen|ileqman i ɣbeṛen}}',
 'undeletelink' => 'ẓeṛ/uɣaled',
 'undeleteviewlink' => 'ẓeṛ',
-'undeletecomment' => 'Awennit:',
+'undeleteinvert' => 'Snegdam ayen textareḍ',
+'undeletecomment' => 'Taɣẓint :',
 'undelete-header' => 'Ẓer [[Special:Log/delete|aɣmis n umḥay]] i isebtar ttumḥan tura.',
+'undelete-search-title' => 'Nadi ɣef isebtar yettumḥan',
 'undelete-search-box' => 'Nadi ɣef isebtar yettumḥan',
 'undelete-search-prefix' => 'Ssken isebtar i yebdan s:',
 'undelete-search-submit' => 'Nadi',
 'undelete-no-results' => 'Ur yufi ara ulaḥedd n wawalen i tnadiḍ ɣef isebtar deg iɣbaren.',
+'undelete-show-file-confirm' => 'Tebɣriḍ ad ẓṛeḍ lqem yemḥan n ufaylu « <nowiki>$1</nowiki> » n $2 af $3 ?',
+'undelete-show-file-submit' => 'Ih',
 
 # Namespace form on various pages
-'namespace' => 'Isem n taɣult:',
+'namespace' => 'Talluntin n isemawen :',
 'invert' => 'Snegdam ayen textareḍ',
 'blanknamespace' => '(Amenzawi)',
 
@@ -1249,10 +2200,15 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'sp-contributions-newbies' => 'Ssken tikkin n yimseqdacen imaynuten kan',
 'sp-contributions-newbies-sub' => 'I yisem yimseqdacen imaynuten',
 'sp-contributions-blocklog' => 'Aɣmis n uɛeṭṭil',
+'sp-contributions-deleted' => 'isekcam yemḥan',
 'sp-contributions-uploads' => 'izdamen',
 'sp-contributions-logs' => 'iɣmisen',
 'sp-contributions-talk' => 'Mmeslay',
 'sp-contributions-userrights' => 'Laɛej iserfan n umseqdac',
+'sp-contributions-blocked-notice' => 'Aseqdac agi yekyef.
+Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
+'sp-contributions-blocked-notice-anon' => 'Tansa IP agi tekyef.
+Asekcem aneggaru n useklas n ikyafen yella ddaw agi :',
 'sp-contributions-search' => 'Nadi i tikkin',
 'sp-contributions-username' => 'Tansa IP neɣ isem n wemseqdac:',
 'sp-contributions-toponly' => 'Sekned kan imagraden i beddeleɣ nekk d-aneggaru',
@@ -1278,41 +2234,71 @@ G leɛnayek wekki ɣef taqeffalt "Back/Précédent" n browser/explorateur inek,
 'whatlinkshere-filters' => 'Tistaytin',
 
 # Block/unblock
-'blockip' => 'Ɛekkel amseqdac',
+'block' => 'Ɛekkel aseqdac',
+'blockip' => 'Ɛekkel aseqdac',
+'blockip-title' => 'Ɛekkel aseqdac',
+'blockip-legend' => 'Ɛekkel aseqdac',
 'ipadressorusername' => 'Tansa IP neɣ isem n wemseqdac',
 'ipbreason' => 'Ayɣer',
 'ipbsubmit' => 'Ɛekkel amseqdac-agi',
-'ipboptions' => '2 isragen:2 hours,1 ass:1 day,3 ussan:3 days,1 imalas:1 week,2  imulas:2 weeks,1 aggur:1 month,3 igguren:3 months,6 igguren:6 months,1 aseggwas:1 year,afdi:infinite',
+'ipboptions' => '2 isragen:2 hours,1 ass:1 day,3 ussan:3 days,1 imalas:1 week,2  imalasen:2 weeks,1 aggur:1 month,3 agguren:3 months,6 agguren:6 months,1 aseggwas:1 year,afdi:infinite',
 'ipbotheroption' => 'nniḍen',
 'badipaddress' => 'Tansa IP mačči d ṣaḥiḥ',
+'ipusubmit' => 'Ekkes akyaf agi',
+'unblocked' => 'Yetwekkes akyaf n [[User:$1|$1]]',
+'unblocked-range' => 'Yetwekkes akyaf n $1',
+'unblocked-id' => 'Akyaf $1 yetwekkes',
+'blocklist' => 'Iseqdacen id yetkyefen',
 'ipblocklist' => 'imseqdacen isewḥelen',
+'ipblocklist-legend' => 'Nadi aseqdac id yetkyefen',
+'blocklist-userblocks' => 'Ffer ikyafen n imiḍanen',
+'blocklist-tempblocks' => 'Ffer ikyafen ikudanen',
+'blocklist-addressblocks' => 'Ffer ikyafen n tansa IP tisuftin',
+'blocklist-rangeblocks' => 'Ffer iḥedran n azrag',
+'blocklist-timestamp' => 'Azmez d usrag',
+'blocklist-target' => 'Asaḍas',
+'blocklist-expiry' => 'Azmez n tasewti',
+'blocklist-by' => 'Anedbal i sexdemen akyaf',
+'blocklist-params' => 'Iɣewwaren n ukyaf',
+'blocklist-reason' => 'Taɣẓint',
 'ipblocklist-submit' => 'Nadi',
+'ipblocklist-localblock' => 'Akyaf adigan',
+'ipblocklist-otherblocks' => '{{PLURAL:$1|Akyaf nniḍen|Ikyafen nniḍen}}',
+'infiniteblock' => 'ameɣlal',
+'expiringblock' => 'tasewti ass n $1 af $2',
+'anononlyblock' => 'iseqdacen ur sɛan ara amiḍan kan',
+'noautoblockblock' => 'akyaf awurman yensa',
+'createaccountblock' => 'asnulfu n umiḍan yekyef',
+'emailblock' => 'e-mail yekyef',
+'blocklist-nousertalk' => 'ur yezmer ara ad yebeddel asebter-is n umeslay',
+'ipblocklist-empty' => 'Umuɣ n tansiwin IP i kyefen d-ilem.',
+'ipblocklist-no-results' => 'Tansa IP naɣ aseqdac i sutereḍ ur yekyef ara.',
 'blocklink' => 'ɛekkel',
 'unblocklink' => 'ekkes asewḥel',
 'change-blocklink' => 'beddel asewḥel',
 'contribslink' => 'tikkin',
+'emaillink' => 'Ceggaɛ e-mail',
 'blocklogpage' => 'Aɣmis n isewḥelen',
 'blocklogentry' => 'yesewḥel [[$1]] ; alama : $2 $3',
 'block-log-flags-anononly' => 'Imseqdacen udrigen kan',
 'block-log-flags-nocreate' => 'asnulfu n umiḍan yessegdel',
 'proxyblockreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy". G leɛnayek, meslay akk d provider inek.',
 'proxyblocksuccess' => 'D ayen.',
-'sorbsreason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy" deg DNSBL yettuseqdac da.',
-'sorbs_create_account_reason' => 'Tansa n IP inek teɛkel axaṭer nettat "open proxy" deg DNSBL yettuseqdac da. Ur tezmireḍ ara ad txelqeḍ isem n wemseqdac',
+'sorbsreason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.',
+'sorbs_create_account_reason' => 'Tansa IP inek/inem tella deg yiwen umuɣ am "open proxy" deg DNSBL yettuseqdac deg {{SITENAME}}.
+Ur tezmireḍ ara ad snulfuḍ amiḍan.',
 
 # Developer tools
 'lockdb' => 'Sekker database',
 
 # Move page
 'move-page-legend' => 'Smimeḍ asebter',
-'movepagetext' => "Mi tedsseqdceḍ talɣa deg ukessar ad ibddel isem n usebter, yesmimeḍ akk umezruy-is ɣer isem amaynut.
-Azwel aqdim ad yuɣal azady n wesmimeḍ ɣer azwel amaynut.
-Izdayen ɣer azwel aqdim ur ttubeddlen ara;
-ssenqd-iten u ssenqed izdayen n snat d tlata tikkwal.
-D kečč i yessefk a ten-yessenqed.
-
-Meɛna, ma yella amagrad deg azwel amaynut neɣ azday n wamsmimeḍ mebla amezruy, asebter-inek '''ur''' yettusmimeḍ '''ara'''.
-Yernu, tzemreḍ ad tesmimeḍ asebter ɣer isem-is aqdim ma tɣelṭeḍ.",
+'movepagetext' => "Seqdec tiferkit ddaw agi iwakken ad beddeleḍ isem n usebter, s usiweḍ n akkw amezruy is ɣer isem amaynut. Azwel aqbur ad yuɣal d asebter n usemmime ɣer azwel amaynut. Tzemreḍ ad mucceḍeḍ s uwurman isemmimen amiran i sweṛen ɣer azwel amezwaru. Ma ur tebɣiḍ ara at sexdemeḍ wagi, ilaq ad selkeneḍ akkw [[Special:DoubleRedirects|Asemmimeḍ yeḍran snat tikwal]] naɣ [[Special:BrokenRedirects|asmmimeḍ yerẓan]]. Ilaq ad sɛuḍ talkint belli izdayen tsweṛen ɣer aserken is.
+
+Abeddel n isem ur yezmer ara ad yilli ma yella yakan asebter s isem agi, ḥaca ma ulac amezruy deg-es.
+
+'''Ɣur-wet !'''
+Wagi yezmer ad yexdem abeddel ameqqṛan i asebter s aṭas timerziwin ; ilaq ad fehmeḍ uqbel ad beddeleḍ asebter.",
 'movepagetalktext' => "Asebter \"Amyannan\" yettusmimeḍ ula d netta '''ma ulac:'''
 *Yella asebter \"Amyannan\" deg isem amaynut, neɣ
 *Trecmeḍ tankult deg ukessar.
@@ -1341,7 +2327,7 @@ Xtar yiwen nniḍen.',
 
 Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken yeqqim-d wemkan i usmimeḍ?',
 'delete_and_move_confirm' => 'Ih, mḥu asebter',
-'delete_and_move_reason' => 'Mḥu iwakken yeqqim-d wemkan i usmimeḍ',
+'delete_and_move_reason' => 'Asebter yemḥa iwakken yeqqim-d wemkan i usmimeḍ seg "[[$1]]"',
 'selfmove' => 'Izwal amezwaru d uneggaru kif-kif; ur yezmir ara ad yesmimeḍ asebter ɣur iman-is.',
 
 # Export
@@ -1350,21 +2336,32 @@ Anda tebɣiḍ tesmimeḍ "[[:$1]]" yella yagi. tebɣiḍ ad temḥuḍ iwakken
 'export-submit' => 'Ssufeɣ',
 'export-addcattext' => 'Rnu isebtar seg taggayt:',
 'export-addcat' => 'Rnu',
+'export-addnstext' => 'Rnu isebtar deg tallunt n isemawen :',
+'export-addns' => 'Rnu',
+'export-download' => 'Ḥrez deg ufaylu',
+'export-templates' => 'Sekcem tiɣlatin',
 
 # Namespace 8 related
 'allmessages' => 'Izen n system',
 'allmessagesname' => 'Isem',
 'allmessagesdefault' => 'Aḍris ameslugen',
 'allmessagescurrent' => 'Aḍris n tura',
-'allmessagestext' => 'Wagi d umuɣ n izen n system i yellan deg yisem n taɣult.
-Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and [//translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.',
+'allmessagestext' => 'Wagi d-umuɣ n inzan yestufan deg tallunt MediaWiki.
+Ẓeṛ [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] dɣa [//translatewiki.net translatewiki.net] ma tebɣiḍ ad ɛiweneḍ i usideg imcettel n MediaWiki.',
 'allmessagesnotsupportedDB' => "'''{{ns:special}}:Allmessages''' ut yezmir ara ad yettuseqdac axaṭer '''\$wgUseDatabaseMessages''' yettwakkes.",
+'allmessages-filter-legend' => 'Tastayt',
+'allmessages-filter-unmodified' => 'Ur yebeqqeḍ ara',
+'allmessages-filter-all' => 'Akkw',
+'allmessages-filter-modified' => 'Yebeddel',
+'allmessages-prefix' => 'Tastayt s adat :',
 'allmessages-language' => 'Tutlayt :',
+'allmessages-filter-submit' => 'Ruḥ',
 
 # Thumbnails
 'thumbnail-more' => 'Ssemɣer',
 'filemissing' => 'Afaylu ulac-it',
 'thumbnail_error' => 'Agul asmi yexleq tugna tamecṭuḥt: $1',
+'djvu_page_error' => 'Asebter DjVu yeffeɣ seg tilisa',
 
 # Special:Import
 'import' => 'Ssekcem isebtar',
@@ -1372,6 +2369,8 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'import-interwiki-history' => 'Xdem alsaru n akk tisiwal umezruy n usebter-agi',
 'import-interwiki-submit' => 'Ssekcem',
 'import-interwiki-namespace' => 'Azen isebtar ar isem n taɣult:',
+'import-upload-filename' => 'Isem n ufaylu :',
+'import-comment' => 'Awennit :',
 'importstart' => 'Asekcem n isebtar...',
 'import-revision-count' => '$1 {{PLURAL:$1|tasiwelt|tisiwal}}',
 'importnopages' => 'Ulac isebtar iwakken ad ttussekcmen.',
@@ -1380,7 +2379,7 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'importcantopen' => 'Ur yezmir ara ad yexdem asekcem n ufaylu',
 'importbadinterwiki' => 'Azday n interwiki ur yelhi',
 'importnotext' => 'D ilem neɣ ulac aḍris',
-'importsuccess' => 'Asekcem yekfa!',
+'importsuccess' => 'Asekcem yekfa !',
 'importhistoryconflict' => 'Amennuɣ ger tisiwal n umezruy (ahat asebter-agi yettwazen yagi)',
 'importnosources' => 'Asekcam n transwiki ur yexdim ara u amezruy n usekcam yettwakkes.',
 'importnofile' => 'ulaḥedd afaylu usekcam ur yettwazen.',
@@ -1389,9 +2388,9 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'importlogpage' => 'Aɣmis n usekcam',
 'importlogpagetext' => 'Adeblan n usekcam n isebtar i yesɛan amezruy ubeddel seg wiki tiyaḍ.',
 'import-logentry-upload' => 'Yessekcem [[$1]] s usekcam n ufaylu',
-'import-logentry-upload-detail' => '$1 tasiwelt(tisiwal)',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|lqem|ileqman}}',
 'import-logentry-interwiki' => '$1 s transwiki',
-'import-logentry-interwiki-detail' => '$1 tasiwelt(tisiwal) seg $2',
+'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|lqem|ileqman}} seg $2',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Asebter n umseqdac inu',
@@ -1458,12 +2457,12 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'tooltip-summary' => 'Sekcem agzul awezzlan',
 
 # Attribution
-'anonymous' => 'Amseqdac udrig (Imseqdacen udrigen) n {{SITENAME}}',
+'anonymous' => '{{PLURAL:$1|Aseqdac udrig|Iseqdacen udrigen}} ɣef {{SITENAME}}',
 'siteuser' => '{{SITENAME}} amseqdac $1',
 'lastmodifiedatby' => 'Tikkelt taneggarut asmi yettubeddel asebter-agi $2, $1 sɣur $3.',
-'othercontribs' => 'Tikkin n wemseqdac-agi.',
+'othercontribs' => 'Tikkin ɣef umahil n $1.',
 'others' => 'wiyaḍ',
-'siteusers' => '{{SITENAME}} amseqdac(imseqdacen) $1',
+'siteusers' => '{{PLURAL:$2|aseqdac|iseqdacen}} $1 n {{SITENAME}}',
 'creditspage' => 'Win ixedmen asebter',
 'nocredits' => 'Ulac talɣut ɣef wayen ixedmen asebter-agi.',
 
@@ -1474,11 +2473,30 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'spam_reverting' => 'Asuɣal i tasiwel taneggarut i ur tesɛi ara izdayen ɣer $1',
 'spam_blanking' => 'Akk tisiwal sɛan izdayen ɣer $1, ad yemḥu',
 
+# Info page
+'pageinfo-title' => 'Tilɣa i « $1 »',
+'pageinfo-header-basic' => 'Tilɣa n udasil',
+'pageinfo-header-edits' => 'Amezruy n ibeddilen',
+'pageinfo-header-restrictions' => 'Amesten n usebter',
+'pageinfo-header-properties' => 'Ayla n usebter',
+'pageinfo-display-title' => 'Azwel yebeqqeḍen',
+'pageinfo-default-sort' => 'Tasarut n ufran s lexṣas',
+'pageinfo-length' => 'Tiddi n usebter (s itamḍanen)',
+'pageinfo-article-id' => 'Uṭṭun n usebter',
+'pageinfo-robot-policy' => 'Aẓayer n umsadday n unadi',
+'pageinfo-robot-index' => 'Ṭwamatar',
+'pageinfo-robot-noindex' => 'Arṭwamatar',
+'pageinfo-views' => 'Amḍan n timuɣliwin',
+'pageinfo-watchers' => 'Amḍan n imttekkiyen yesɛan asebter agi deg umuɣ nsen n uɛassi',
+'pageinfo-subpages-name' => 'Adu-isebtar n usebter agi',
+'pageinfo-contentpage-yes' => 'Ih',
+'pageinfo-protect-cascading-yes' => 'Ih',
+
 # Patrolling
 'markaspatrolleddiff' => 'Rcem "yettwassenqden"',
 'markaspatrolledtext' => 'Rcem amagrad-agi "yettwassenqden"',
 'markedaspatrolled' => 'Rcem belli yettwasenqed',
-'markedaspatrolledtext' => 'Tasiwelt i textareḍ tettwassenqed.',
+'markedaspatrolledtext' => 'Lqem i textareḍ n [[:$1]] tettwassenqed.',
 'rcpatroldisabled' => 'Yettwakkes asenqad n ibeddlen imaynuten',
 'rcpatroldisabledtext' => 'Yettwakkes asenqad n ibeddlen imaynuten',
 'markedaspatrollederror' => 'Ur yezmir ara ad yercem "yettwassenqden"',
@@ -1496,8 +2514,9 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 'nextdiff' => 'Amgirred ameḍfir →',
 
 # Media information
-'mediawarning' => "'''Aɣtal''': Waqila afaylu-yagi yesɛa angal aḥraymi, lukan a t-tesseqdceḍ yezmer ad ixesser aselkim inek.",
-'imagemaxsize' => 'Ḥedded tiddi n tugniwin deg yiglamen n tugniwim i:',
+'mediawarning' => "'''Ɣuṛ-wet''': tawsit agi n ufaylu tezmer at sɛu angal aḥraymi.
+Lukan a t-tesseqdceḍ yezmer ad yexsser aselkim inek/inem.",
+'imagemaxsize' => "Tiddi tafellayt n tugniwin :<br />''(i isebtar n weglam ufaylu)''",
 'thumbsize' => 'Tiddi n tugna tamecṭuḥt:',
 'file-info' => 'tiddi n ufaylu: $1, anaw n MIME: $2',
 'file-info-size' => '$1 × $2 pixel, tiddi n ufaylu: $3, anaw n MIME: $4',
@@ -1508,10 +2527,21 @@ Please visit [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] and
 # Special:NewFiles
 'newimages' => 'Umuɣ n ifayluwen imaynuten',
 'imagelisttext' => "Deg ukessar yella wumuɣ n '''$1''' {{PLURAL:$1|ufaylu|yifayluwen}} $2.",
+'newimages-legend' => 'Tastayt',
+'newimages-label' => 'Isem n ufaylu (naɣ aḥric ines) :',
+'showhidebots' => '($1 iṛubuten)',
 'noimages' => 'Tugna ulac-itt.',
 'ilsubmit' => 'Nadi',
 'bydate' => 's uzemz',
-'sp-newimages-showfrom' => 'Ssken tugniwin timaynutin seg $1',
+'sp-newimages-showfrom' => 'Beqqeḍ ifuyla imaynuten seg $1 ar $2',
+
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => '{{PLURAL:$1|$1 tasint|$1 tasinin}}',
+'minutes' => '{{PLURAL:$1|$1 tamrect|$1 timercin}}',
+'hours' => '{{PLURAL:$1|$1 asrag|$1 isragen}}',
+'days' => '{{PLURAL:$1|$1 ass|$1 ussan}}',
+'ago' => '$1 aya',
+'just-now' => 'Tura kan',
 
 # Bad image list
 'bad_image_list' => 'Amasal d-wagi :
@@ -1522,6 +2552,8 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 # Metadata
 'metadata' => 'Adferisefka',
 'metadata-help' => 'Afaylu agi, yesɛa tilɣa tisutay, ahat d-tamsaknewt id ernan tilɣa agi. Ma afaylu yebeddel seg addad-is amezwaru, ahat kra n tilɣa ur zemrent ara ad illint d-timekdant s-ufaylu amiran.',
+'metadata-expand' => 'Beqqeḍ tilɣa tummidin',
+'metadata-collapse' => 'Ffer tilɣa tummidin',
 'metadata-fields' => 'Urtan n adferisefka n tugniwin yellan deg umuɣ n izen agi, ad seddun deg usebter n aglam n tugna mi ṭabla n adferisefka at illi tesemẓi. Urtan nniḍen ad illin ffren m-ulac.
 * make
 * model
@@ -1539,11 +2571,275 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 
 # EXIF tags
 'exif-imagewidth' => 'Tehri',
-
+'exif-imagelength' => 'Taɣwzi',
+'exif-bitspersample' => 'Ibitten s isger',
+'exif-compression' => 'Tawsit n asekkusem',
+'exif-photometricinterpretation' => 'Talɣa n uferdis n tugna',
+'exif-orientation' => 'Taɣda',
+'exif-samplesperpixel' => 'Tisegranin s uferdis n tugna',
+'exif-planarconfiguration' => 'Aheggi n isefka',
+'exif-ycbcrsubsampling' => 'Atug n adu-isefka n ulemmec n Y ar C',
+'exif-ycbcrpositioning' => 'Aselfu n Y d C',
+'exif-xresolution' => 'Tabadut taglawit',
+'exif-yresolution' => 'Tabadut taratakt',
+'exif-stripoffsets' => 'Asun n isefka n tugna',
+'exif-rowsperstrip' => 'Amḍan n ijerriden s tasfift',
+'exif-stripbytecounts' => 'Tiddi n itamḍanen s tasfift',
+'exif-jpeginterchangeformat' => 'Ideg n SOI JPEG',
+'exif-jpeginterchangeformatlength' => 'Tiddi s itamḍanen n isefka JPEG',
+'exif-whitepoint' => 'Tiniskit n uqqa amellal',
+'exif-primarychromaticities' => 'Tiniskit n tizwaranin',
+'exif-referenceblackwhite' => 'Azalen n tamselɣut aberkan d umellal',
+'exif-datetime' => 'Azmez n ubeddel',
+'exif-imagedescription' => 'Aglam n tugna',
+'exif-make' => 'Amakras n taweṣṣaft',
+'exif-model' => 'Talɣa n taweṣṣaft',
+'exif-software' => 'Aseɣẓan yetseqdecen',
+'exif-artist' => 'Ameskar',
+'exif-copyright' => 'Amli n uzref n umeskar',
+'exif-exifversion' => 'Lqem EXIF',
+'exif-flashpixversion' => 'Lqem FlashPix',
+'exif-colorspace' => 'Tallunt n tiniskit',
+'exif-componentsconfiguration' => 'Anamek n yal isger',
+'exif-compressedbitsperpixel' => 'Askar n usekkusem n tugna',
+'exif-pixelydimension' => 'Tehri n tugna',
+'exif-pixelxdimension' => 'Taɣwzi n tugna',
+'exif-usercomment' => 'Iwenniten n useqdac',
+'exif-relatedsoundfile' => 'Afaylu n eslu yeqqnen',
+'exif-datetimeoriginal' => 'Azmez n tuddma tamezwarut',
+'exif-datetimedigitized' => 'Azmez n usemḍen',
+'exif-subsectime' => 'Azmez n ubeddel',
+'exif-subsectimeoriginal' => 'Azmez n tuddma tamezwarut',
+'exif-subsectimedigitized' => 'Azmez n usemḍen',
+'exif-exposuretime' => 'Akud n timzikent',
+'exif-exposuretime-format' => '$1 tas ($2 tas)',
+'exif-fnumber' => 'Alday',
+'exif-exposureprogram' => 'Ahil n timzikent',
+'exif-aperturevalue' => 'Alday n APEX',
+'exif-exposurebiasvalue' => 'Aseɣti n timzikent',
+'exif-maxaperturevalue' => 'Alday afellay',
+'exif-subjectdistance' => 'Ameccaq n usentel',
+'exif-meteringmode' => 'Askar n usket',
+'exif-lightsource' => 'Aɣbalu n tafat',
+'exif-flash' => 'Lebṛaq',
+'exif-focallength' => 'Taɣwzi n usaḍas',
+'exif-subjectarea' => 'Asun n usentel',
+'exif-flashenergy' => 'Tanezmart n lebṛaq',
+'exif-focalplanexresolution' => 'Tabadut taglawit n uɣawas asaḍas',
+'exif-focalplaneyresolution' => 'Tabadut taratakt n uɣawas asaḍas',
+'exif-focalplaneresolutionunit' => 'Aferdis n tabadut n uɣawas asaḍas',
+'exif-subjectlocation' => 'Asideg n usentel',
+'exif-exposureindex' => 'Amatar n timzikent',
+'exif-sensingmethod' => 'Tawsit n umaṭṭaf',
+'exif-filesource' => 'Aɣbal n ufaylu',
+'exif-scenetype' => 'Tawsit n usayes',
+'exif-worldregiondest' => 'Timnaḍin n umaḍal yebeqqeḍen',
+'exif-countrydest' => 'Timura yebeqqeḍen',
+'exif-countrycodedest' => 'Tangalt n tamurt yebeqqeḍen',
+'exif-provinceorstatedest' => 'Tamnaṭ naɣ Tamurt yebeqqeḍen',
+'exif-citydest' => 'Tamdint yebeqqeḍen',
+'exif-sublocationdest' => 'Aḥric n temdint yebeqqeḍen',
+'exif-objectname' => 'Azwel amectuḥ',
+'exif-specialinstructions' => 'Tinaḍi tusligin',
+'exif-headline' => 'Azwel',
+'exif-credit' => 'Asmad / imefki',
+'exif-source' => 'Aɣbalu',
+'exif-editstatus' => 'Aẓayer amaẓrag n tugna',
+'exif-urgency' => 'Lḥir',
+'exif-fixtureidentifier' => 'Isem n uferdis aslagan',
+'exif-locationdest' => 'Amḍiq yebeqqeḍen',
+'exif-locationdestcode' => 'Tangalt n umḍiq yebeqqeḍen',
+'exif-contact' => 'Tilɣa n unermis',
+'exif-writer' => 'Ameskar',
+'exif-languagecode' => 'Tutlayt',
+'exif-iimversion' => 'Lqem n IIM',
+'exif-iimcategory' => 'Taggayt',
+'exif-iimsupplementalcategory' => 'Taggayin timarnanin',
+'exif-datetimeexpires' => 'Ur tseqdac ara sakin',
+'exif-datetimereleased' => 'Tuffɣa ass n',
+'exif-originaltransmissionref' => 'Tangalt n usideg n tuzzna tamezwarut',
+'exif-identifier' => 'Asulay',
+
+'exif-copyrighted-true' => 'Ddaw azref n umeskar',
+'exif-copyrighted-false' => 'Taɣuly tazayezt',
+
+'exif-unknowndate' => 'Azmez warisem',
+
+'exif-orientation-1' => 'Amagnu',
+'exif-orientation-2' => 'Tetti s udem aglawan',
+'exif-orientation-3' => 'Tezzi s 180°',
+'exif-orientation-4' => 'Tetti s udem aratak',
+'exif-orientation-5' => 'Tezzi s 90° deg unamek imitti n usrag dɣa tetti s udem aratak',
+'exif-orientation-6' => 'Tezzi s 90° deg unamek imitti n usrag',
+'exif-orientation-7' => 'Tezzi s 90° deg unamek n usrag dɣa tetti s udem aratak',
+'exif-orientation-8' => 'Tezzi s 90° deg unamek n usrag',
+
+'exif-planarconfiguration-1' => 'Isefka iqriben',
+'exif-planarconfiguration-2' => 'Isefka ibrarazen',
+
+'exif-colorspace-65535' => 'Ur yezize ara',
+
+'exif-componentsconfiguration-0' => 'Ulac it',
+
+'exif-exposureprogram-0' => 'Ur yersen ara',
+'exif-exposureprogram-1' => 'Awfus',
+'exif-exposureprogram-2' => 'Ahil alugan',
+'exif-exposureprogram-3' => 'Tazwart i ulday',
+'exif-exposureprogram-4' => 'Tazwart i uqfel',
+'exif-exposureprogram-5' => 'Ahil n usnulfu (azullen i tadrut n urti)',
+'exif-exposureprogram-6' => 'Ahil n tigawt (azullen i urured n yqfel)',
+'exif-exposureprogram-7' => 'Askar tafrist (i tugniwin s tama dɣa s ugilal iluɣen)',
+'exif-exposureprogram-8' => 'Askar agama (i tugniwin n igmaten i llulcen)',
+
+'exif-subjectdistance-value' => '$1 lmitra',
+
+'exif-meteringmode-0' => 'Warisem',
+'exif-meteringmode-1' => 'Alemmas',
+'exif-meteringmode-2' => 'Allal amnekna deg agwans',
+'exif-meteringmode-3' => 'Asfaw',
+'exif-meteringmode-4' => 'Aget-asfaw',
+'exif-meteringmode-5' => 'Talɣa',
+'exif-meteringmode-6' => 'Aḥric',
 'exif-meteringmode-255' => 'Nniḍen',
 
+'exif-lightsource-0' => 'Warisem',
+'exif-lightsource-1' => 'Tafukt n ass',
+'exif-lightsource-2' => 'Arafaw afliyuṛi',
+'exif-lightsource-3' => 'Tungsten (tafat tanesfawt)',
+'exif-lightsource-4' => 'Lebṛaq',
+'exif-lightsource-9' => 'Akud aceεlal',
+'exif-lightsource-10' => 'Akud isignew',
+'exif-lightsource-11' => 'Tili',
+'exif-lightsource-12' => 'Asfaw afliyuṛi  « tafukt n ass » (D 5700 – 7100 K)',
+'exif-lightsource-13' => 'Asfaw afliyuṛi amellal « ass » (N 4600 – 5400 K)',
+'exif-lightsource-14' => 'Asfaw afliyuṛi amellal « asemmaḍ » (W 3900 – 4500 K)',
+'exif-lightsource-15' => 'Asfaw afliyuṛi amellal (WW 3200 – 3700 K)',
+'exif-lightsource-17' => 'Tafat talugent A',
+'exif-lightsource-18' => 'Tafat talugent B',
+'exif-lightsource-19' => 'Tafat talugent C',
+'exif-lightsource-24' => 'Tungsten ISU n usakwen',
+'exif-lightsource-255' => 'Aɣbalu nniḍen n tafat',
+
+# Flash modes
+'exif-flash-fired-0' => 'Lebṛaq ur yendeḥ ara',
+'exif-flash-fired-1' => 'Lebṛaq yendeḥ',
+'exif-flash-mode-1' => 'Tafat n lebaq yuwren',
+'exif-flash-mode-2' => 'Tukksa n lebaq yuwren',
+'exif-flash-mode-3' => 'askar awurman',
+'exif-flash-function-1' => 'Ulac tasɣent n lebṛaq',
+'exif-flash-redeye-1' => 'Tasɣent mgel-allen izeggwaɣen',
+
+'exif-focalplaneresolutionunit-2' => 'Idebbuzen',
+
+'exif-sensingmethod-1' => 'Aranbadu',
+'exif-sensingmethod-2' => 'Amaṭṭaf n ini s yiwen aceṛṛun',
+'exif-sensingmethod-3' => 'Amaṭṭaf n ini s sin iceṛṛunen',
+'exif-sensingmethod-4' => 'Amaṭṭaf n ini s kṛaḍ iceṛṛunen',
+'exif-sensingmethod-5' => 'Amaṭṭaf n ini ulkim',
+'exif-sensingmethod-7' => 'Amaṭṭaf kṛaḍimzireg',
+'exif-sensingmethod-8' => 'Amaṭṭaf n ini imzireg ulkim',
+
+'exif-filesource-3' => 'Taweṣṣaft tumḍint',
+
+'exif-scenetype-1' => 'Tugna n tafarut tusridt',
+
+'exif-customrendered-0' => 'Akala alugen',
+'exif-customrendered-1' => 'Akala yesagen',
+
+'exif-exposuremode-0' => 'Awurman',
+'exif-exposuremode-1' => 'Awfus',
+'exif-exposuremode-2' => 'Tazercet tawurmant',
+
+'exif-whitebalance-0' => 'Awurman',
+'exif-whitebalance-1' => 'Awfus',
+
+'exif-scenecapturetype-0' => 'Alugen',
+'exif-scenecapturetype-1' => 'Agama',
+'exif-scenecapturetype-2' => 'Tafrist',
+'exif-scenecapturetype-3' => 'Asayes n iḍ',
+
+'exif-gaincontrol-0' => 'Ulac',
+'exif-gaincontrol-1' => 'Rrbeḥ ufrir s ubedlez',
+'exif-gaincontrol-2' => 'Rrbeḥ ufrir s aṭas',
+'exif-gaincontrol-3' => 'Rrbeḥ uzdir s ubedlez',
+'exif-gaincontrol-4' => 'Rrbeḥ uzdir s aṭas',
+
+'exif-contrast-0' => 'Amagnu',
+'exif-contrast-1' => 'Abadlaz',
+'exif-contrast-2' => 'Aẓayan',
+
+'exif-saturation-0' => 'Amagnu',
+'exif-saturation-1' => 'Abadlaz',
+'exif-saturation-2' => 'Tameqqṛant',
+
+'exif-sharpness-0' => 'Amagnu',
+'exif-sharpness-1' => 'Alegɣan',
+'exif-sharpness-2' => 'Aẓayan',
+
+'exif-subjectdistancerange-0' => 'Warisem',
+'exif-subjectdistancerange-1' => 'Amɣer',
+
 # Pseudotags used for GPSSpeedRef
 'exif-gpsspeed-k' => 'Kilometr deg ssaɛa',
+'exif-gpsspeed-m' => 'Miles deg usrag',
+'exif-gpsspeed-n' => 'Tikerrist',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Ikilumetren',
+'exif-gpsdestdistance-m' => 'igimen',
+'exif-gpsdestdistance-n' => 'Miles iwlalen',
+
+'exif-gpsdop-excellent' => 'Yufrar ($1)',
+'exif-gpsdop-good' => 'Tamellayt ($1)',
+'exif-gpsdop-moderate' => 'Tallalt ($1)',
+'exif-gpsdop-fair' => 'Attwadag ($1)',
+'exif-gpsdop-poor' => 'Yecmet ($1)',
+
+'exif-objectcycle-a' => 'Tanzayt kan',
+'exif-objectcycle-p' => 'Tameddit kan',
+'exif-objectcycle-b' => 'Tanzayt d tameddit',
+
+# Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
+'exif-gpsdirection-t' => 'Anamud n tidett',
+'exif-gpsdirection-m' => 'Anamud adkiran',
+
+'exif-ycbcrpositioning-1' => 'Agwans',
+'exif-ycbcrpositioning-2' => 'Azdi-sideg',
+
+'exif-dc-contributor' => 'Imttekkiyen',
+'exif-dc-coverage' => 'Azrag allunan naɣ akudan n umedia',
+'exif-dc-date' => 'Azmez',
+'exif-dc-publisher' => 'Amaẓrag',
+'exif-dc-relation' => 'Imediaten iqqenen',
+'exif-dc-rights' => 'Izerfan',
+'exif-dc-source' => 'Aɣbalu umedia',
+'exif-dc-type' => 'Tawsit n umedia',
+
+'exif-rating-rejected' => 'Yerrad',
+
+'exif-isospeedratings-overflow' => 'Ameqqṛan ugar 65535',
+
+'exif-iimcategory-ace' => 'Tiẓuṛiyin, idles d amzel',
+'exif-iimcategory-clj' => 'Anɣa d uṣaḍuf',
+'exif-iimcategory-dis' => 'Tiwaɣin d timedriyin',
+'exif-iimcategory-fin' => 'Tadamsa d tidyanin',
+'exif-iimcategory-edu' => 'Asileɣ',
+'exif-iimcategory-evn' => 'Tawennaṭ',
+'exif-iimcategory-hth' => 'Tadawsa',
+'exif-iimcategory-hum' => 'Aramsu alsi',
+'exif-iimcategory-lab' => 'Amahil',
+'exif-iimcategory-lif' => 'Askar n tudert dɣa n imezlan',
+'exif-iimcategory-pol' => 'Tasertit',
+'exif-iimcategory-rel' => 'Ddin d tifelsin',
+'exif-iimcategory-sci' => 'Tussna d tatiknulujit',
+'exif-iimcategory-soi' => 'Tuttriwin timettiyin',
+'exif-iimcategory-spo' => 'Addalen',
+'exif-iimcategory-war' => 'Ṭrad, taẓit d tasmessit',
+'exif-iimcategory-wea' => 'Tasnignewt',
+
+'exif-urgency-normal' => 'Alugen ($1)',
+'exif-urgency-low' => 'Anammum ($1)',
+'exif-urgency-high' => 'Afella ($1)',
 
 # External editor support
 'edit-externally' => 'Beddel afaylu-yagi s usnas aberrani.',
@@ -1553,13 +2849,15 @@ Izdayen nniḍen ɣef yiwen ajerriḍ llan d tisuraf, am isebtar ɣef anta tugna
 'watchlistall2' => 'akk',
 'namespacesall' => 'akk',
 'monthsall' => 'akk',
+'limitall' => 'Akkw',
 
 # E-mail address confirmation
 'confirmemail' => 'Sentem tansa n e-mail',
 'confirmemail_noemail' => 'Ur tesɛiḍ ara tansa n email ṣaḥiḥ deg [[Special:Preferences|isemyifiyen n wemseqdac]] inek.',
-'confirmemail_text' => 'Deg wiki-yagi, yessefk ad tvalidiḍ tansa n email inek
-qbel ad tesseqdceḍ iḍaɣaren n email. Tella taqeffalt d akessar, wekki fell-as
-iwakken yettwazen ungal n usentem semail. Email-nni yesɛa azady, ldi-t.',
+'confirmemail_text' => '{{SITENAME}} yeḥweǧ aseɣbel n tansa e-mail inek/inem uqbel ad sexdemeḍ tanfa n tirawt.
+Seqdec taqeffalt ddaw-agi iwakken ad cegɛeḍ e-mail n uragag ar tansa e-mail inek/inem.
+Tirawt at sɛu azday deg-es tangalt. Tzemreḍ at seqdeceḍ tikkelt kan deg talast n ukud ;
+llid azday agi deg iminig iwakken ad sergegeḍ tansa e-mail inek/inem.',
 'confirmemail_pending' => 'Yettwazen-ak yagi ungal n usentem; lukan txelqeḍ isem wemseqdac tura kan,
 ahat yessefk ad tegguniḍ cwiṭ qbel ad tɛreḍeḍ ad testeqsiḍ ɣef ungal amaynut.',
 'confirmemail_send' => 'Azen-iyi-d angal n usentem s e-mail iwakken ad snetmeɣ.',
@@ -1567,30 +2865,36 @@ ahat yessefk ad tegguniḍ cwiṭ qbel ad tɛreḍeḍ ad testeqsiḍ ɣef ungal
 'confirmemail_oncreate' => 'Angal n usentem yettwazen ar tansa n e-mail inek.
 Yessefk ad tesseqdceḍ angal-agi iwakken ad tkecmeḍ, meɛna yessefk a t-tefkeḍ
 iwakken ad xedmen yiḍaɣaren n email deg wiki-yagi.',
-'confirmemail_sendfailed' => 'Ur yezmir ara ad yazen asentem n email. Ssenqed tansa n email inek.
+'confirmemail_sendfailed' => '{{SITENAME}} ur yezmir ara ad yazen asentem n email.
+Ssenqed tansa n email inek.
 
-Email yuɣal-d: $1',
+Ahil n uzzun n e-mail yuɣal-d s-izen agi : $1',
 'confirmemail_invalid' => 'Angal n usentem mačči ṣaḥiḥ. Waqila yemmut.',
 'confirmemail_needlogin' => 'Yessefk $1 iwakken tesnetmeḍ tansa n email inek.',
-'confirmemail_success' => 'Asentem n tansa n email inek yekfa. Tura tzemreḍ ad tkecmeḍ.',
+'confirmemail_success' => 'Tansa e-mail inek/inem tergeg.
+Tura tzemreḍ ad [[Special:UserLogin|qqeneḍ]].',
 'confirmemail_loggedin' => 'Asentem n tansa n email inek yekfa tura.',
 'confirmemail_error' => 'Yella ugur s usmekti n usentem inek.',
 'confirmemail_subject' => 'Asentem n tansa n email seg {{SITENAME}}',
-'confirmemail_body' => 'Amdan, waqila d kečč, seg tansa IP $1, yexleq
-isem n wemseqdac "$2" s tansa n e-mail deg {{SITENAME}}.
+'confirmemail_body' => 'Amdan, ahat d kečč/kem, seg tansa IP $1,
+yexleq amiḍan "$2" s tansa n e-mail deg {{SITENAME}}.
 
-Iwakken tbeyyneḍ belli isem n wemseqdac inek u terreḍ
-iḍaɣaren n email ad xdemen deg {{SITENAME}}, ldi azday agi:
+Iwakken ad sergegeḍ amiḍan agi d-win-inek/inem dɣa iwakken
+an sermed tiwura n tirawt deg {{SITENAME}},
+ilaq ad lkemeḍ aseɣwen agi deg iminig :
 
 $3
 
-Lukan mačči d *kečč*, ur teḍfireḍ ara azday. Angal n usentem-agi
-ad yemmut ass $4.',
+Ma mačči d *kečč/kem*, ilaq ad lkemeḍ aseɣwen agi deg iminig :
+
+$5
+
+Angal n usentem-agi ad yemmut ass $4.',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[Yettwakkes assekcam n isebtar seg wiki tiyaḍ]',
-'scarytranscludefailed' => '[Ur yezmir ara a d-yawi talɣa n $1; suref-aɣ]',
-'scarytranscludetoolong' => '[URL d aɣezfan bezzaf; suref-aɣ]',
+'scarytranscludefailed' => '[Ur yezmir ara a d-yawi talɣa n $1]',
+'scarytranscludetoolong' => '[URL agi uffay aṭas]',
 
 # Delete conflict
 'deletedwhileediting' => 'Aɣtal: Asebter-agi yettumḥa qbel ad tebdiḍ a t-tbeddleḍ!',
@@ -1600,8 +2904,13 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'recreate' => 'Ɛiwed xleq',
 
 # action=purge
+'confirm_purge_button' => 'Seɣbel',
 'confirm-purge-top' => 'Mḥu lkac n usebter-agi?',
 
+# action=watch/unwatch
+'confirm-watch-button' => 'Seɣbel',
+'confirm-unwatch-button' => 'Seɣbel',
+
 # Multipage image navigation
 'imgmultipageprev' => '← asebter ssabeq',
 'imgmultipagenext' => 'asebter ameḍfir →',
@@ -1639,8 +2948,8 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 Ɛreḍ pre-timeẓriwt tamagnut.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Ibeddlen imaynuten ɣef $1 tisinin ahat ur ttbanen ara deg wumuɣ-agi.',
-'lag-warn-high' => 'Database tɛeṭṭel aṭas, ibeddlen imaynuten ɣef $1 tisinin ahat ur ttbanen ara deg wumuɣ-agi.',
+'lag-warn-normal' => 'Ibeddelen n ddaw n $1 {{PLURAL:$1|tasint|tisinin}} ur ttbanen ara deg umuɣ-agi.',
+'lag-warn-high' => 'Acku af talalut taxatart n uqeddac n taffa n isefka, ibeddelen n ddaw n $1 {{PLURAL:$1|tasint|tisinin}} ur ttbanen ara deg umuɣ-agi.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Mebla isebtar "Amyannan", umuɣ n uɛessi inek ɣur-s {{PLURAL:$1|1 wezwel|$1 yizwalen}}.',
@@ -1666,8 +2975,19 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 'duplicate-defaultsort' => 'Ɣur-wet : tasarut n ufran m-ulac « $2 » atsefεej tasarut n uqbel « $1 ».',
 
 # Special:Version
-'version' => 'Tasiwelt',
+'version' => 'Lqem',
 'version-specialpages' => 'isebtar usligen',
+'version-software' => 'Iseɣẓanen i serkeben',
+'version-software-product' => 'Afaris',
+'version-software-version' => 'Lqem',
+'version-entrypoints' => 'Tansa URL n irden n wekcam',
+'version-entrypoints-header-entrypoint' => 'Ired n wekcam',
+'version-entrypoints-header-url' => 'Tansa URL',
+
+# Special:FilePath
+'filepath' => 'Abrid n wadduf ufaylu',
+'filepath-page' => 'Afaylu :',
+'filepath-submit' => 'Ruḥ',
 
 # Special:SpecialPages
 'specialpages' => 'isebtar usligen',
@@ -1685,4 +3005,22 @@ G leɛnaya-k sentem belli ṣaḥḥ tebɣiḍ ad tɛiwedeḍ axlaq n usebter-ag
 # Special:Tags
 'tag-filter' => 'Astay n [[Special:Tags|ticraḍ]] :',
 
+# Feedback
+'feedback-subject' => 'Asentel :',
+'feedback-message' => 'Izen :',
+'feedback-cancel' => 'Semmewet',
+'feedback-submit' => 'Ceggaɛ iwenniten',
+'feedback-adding' => 'Rnud iwenniten inek/inem ar usebter...',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|tasint|tisinin}}',
+'duration-minutes' => '$1 {{PLURAL:$1|tamrect|timercin}}',
+'duration-hours' => '$1 {{PLURAL:$1|asrag|isragen}}',
+'duration-days' => '$1 {{PLURAL:$1|ass|ussan}}',
+'duration-weeks' => '$1 {{PLURAL:$1|imalas|imulas}}',
+'duration-years' => '$1 {{PLURAL:$1|aseggwas|iseggwasen}}',
+'duration-decades' => '$1 {{PLURAL:$1|amrawass|amrawussan}}',
+'duration-centuries' => '$1 {{PLURAL:$1|timiḍi|timiḍa}}',
+'duration-millennia' => '$1 {{PLURAL:$1|agimseggwas|agimseggwasen}}',
+
 );
index bca56ac..ea1a3b4 100644 (file)
@@ -161,7 +161,6 @@ $messages = array(
 'qbbrowse' => 'Хэплъэн',
 'qbedit' => 'Гъэтэрэзын',
 'qbpageoptions' => 'НапэкӀуэцӀым и зэгъэзэхуэгъуэр',
-'qbpageinfo' => 'НапэкIуэцIым теухуауэ',
 'qbmyoptions' => 'Уи зэгъэзэхуэгъуэхэр',
 'qbspecialpages' => 'Специал напэкӀуэцӀхэр',
 'faq' => 'FAQ',
@@ -408,11 +407,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Джыпсту уикӀыжауэ щыт.'''
 
-Уихьэжьыфыну {{grammar:genitive|{{SITENAME}}}} зыкъумгъэцӀыху иэ [[Special:UserLogin|зыкъегъэцӀыхун аргуэру]] уи цӀэмкӀэ иэ нэмыщӀымкӀэ.
+Уихьэжьыфыну {{grammar:genitive|{{SITENAME}}}} зыкъумгъэцӀыху иэ <span class='plainlinks'>[$1 зыкъегъэцӀыхун аргуэру]</span> уи цӀэмкӀэ иэ нэмыщӀымкӀэ.
 НапэкӀуэцӀ гуэрэхэр япэми хуэду къикӀыфынухэ, системэм уимыкӀыжьа хуэду. Апхуэду щымытын щхьэкӀэ браузэр кэшыр къэгъэщӀырыщӀын хуэй.",
-'welcomecreation' => '== Къеблагъэ, $1! ==
-Уи аккаунтыр хьэзырщ.
-Зыщумгъэгъупшэ сайтым уи [[Special:Preferences|персонал зэгъэзэхуэгъуэ]] быщӀын.',
 'yourname' => 'Уи цӀэр:',
 'yourpassword' => 'Пэролыр:',
 'yourpasswordagain' => 'Иджыри зэ пэролыр:',
@@ -939,8 +935,6 @@ $1",
 'search-interwiki-caption' => 'Проэкт къыдэщӀхэр',
 'search-interwiki-default' => '$1 къыхэкӀар:',
 'search-interwiki-more' => '(иджыри)',
-'search-mwsuggest-enabled' => 'чэнджэш иӀэу',
-'search-mwsuggest-disabled' => 'чэнджэщыншэу',
 'nonefound' => "'''Гулъытыгъуэ.''' Тэрэзу имытхамэ узхуэныкъуэр, лъыхъуэгъуэр лъэныкъу хъуамкӀи ирегъэкӀуэкӀ. Къэгъэсэбэп ''all:'' пыгъувэгъуэр, зэгъэзэхуэгъуэ иӀэн щхьэкӀэ (хэтхэм я тепсэлъыхьыныгъэр, щапхъэхэр, нымыщӀхэр джоуэ хиубыдэным щхьэ), иэ узхуэныкъуэ лъэныкъуэр итхэ.",
 'search-nonefound' => 'Узлъыхъуэм техуэу щыӀэкъым.',
 'powersearch' => 'Убгъуауэ лъыхъу',
index 6625e3f..57caf22 100644 (file)
 
 $messages = array(
 'underline-always' => 'Bambala nyonso',
-'underline-never'  => 'Ata mbala mosi ve',
+'underline-never' => 'Ata mbala mosi ve',
 
 # Dates
-'sunday'        => 'Lumîngu',
-'monday'        => 'Kimosi',
-'tuesday'       => 'Kizôle',
-'wednesday'     => 'Kitatu',
-'thursday'      => 'Kîya',
-'friday'        => 'Kitânu',
-'saturday'      => 'Sabala',
-'sun'           => 'Lum',
-'mon'           => 'ki-1',
-'tue'           => 'ki-2',
-'wed'           => 'ki-3',
-'thu'           => 'ki-4',
-'fri'           => 'ki-5',
-'sat'           => 'Sab',
-'january'       => 'ngônda ya ntete',
-'february'      => 'ngônda ya zôle',
-'march'         => 'ngônda ya tatu',
-'april'         => 'ngônda ya yiya',
-'may_long'      => 'ngônda ya tânu',
-'june'          => 'ngônda ya sambânu',
-'july'          => 'ngônda ya nsambwâdi',
-'august'        => 'ngônda ya nâna',
-'september'     => 'ngônda ya yivwa',
-'october'       => 'ngônda ya kûmi',
-'november'      => 'ngônda ya kûmi na mosi',
-'december'      => 'ngôida ya kûmi na zôle',
-'january-gen'   => 'ngônda ya ntete',
-'february-gen'  => 'ngônda ya zôle',
-'march-gen'     => 'ngônda ya tatu',
-'april-gen'     => 'ngônda ya yiya',
-'may-gen'       => 'ngônda ya tânu',
-'june-gen'      => 'ngônda ya sambânu',
-'july-gen'      => 'ngônda ya nsambwâdi',
-'august-gen'    => 'ngônda ya nâna',
+'sunday' => 'Lumîngu',
+'monday' => 'Kimosi',
+'tuesday' => 'Kizôle',
+'wednesday' => 'Kitatu',
+'thursday' => 'Kîya',
+'friday' => 'Kitânu',
+'saturday' => 'Sabala',
+'sun' => 'Lum',
+'mon' => 'ki-1',
+'tue' => 'ki-2',
+'wed' => 'ki-3',
+'thu' => 'ki-4',
+'fri' => 'ki-5',
+'sat' => 'Sab',
+'january' => 'ngônda ya ntete',
+'february' => 'ngônda ya zôle',
+'march' => 'ngônda ya tatu',
+'april' => 'ngônda ya yiya',
+'may_long' => 'ngônda ya tânu',
+'june' => 'ngônda ya sambânu',
+'july' => 'ngônda ya nsambwâdi',
+'august' => 'ngônda ya nâna',
+'september' => 'ngônda ya yivwa',
+'october' => 'ngônda ya kûmi',
+'november' => 'ngônda ya kûmi na mosi',
+'december' => 'ngôida ya kûmi na zôle',
+'january-gen' => 'ngônda ya ntete',
+'february-gen' => 'ngônda ya zôle',
+'march-gen' => 'ngônda ya tatu',
+'april-gen' => 'ngônda ya yiya',
+'may-gen' => 'ngônda ya tânu',
+'june-gen' => 'ngônda ya sambânu',
+'july-gen' => 'ngônda ya nsambwâdi',
+'august-gen' => 'ngônda ya nâna',
 'september-gen' => 'ngônda ya yivwa',
-'october-gen'   => 'ngônda ya kûmi',
-'november-gen'  => 'ngônda ya kûmi na mosi',
-'december-gen'  => 'ngônda ya kûmi na zôle',
-'jan'           => 'ng1',
-'feb'           => 'ng2',
-'mar'           => 'ng3',
-'apr'           => 'ng4',
-'may'           => 'ng5',
-'jun'           => 'ng6',
-'jul'           => 'ng7',
-'aug'           => 'ng8',
-'sep'           => 'ng9',
-'oct'           => 'ng10',
-'nov'           => 'ng11',
-'dec'           => 'ng12',
+'october-gen' => 'ngônda ya kûmi',
+'november-gen' => 'ngônda ya kûmi na mosi',
+'december-gen' => 'ngônda ya kûmi na zôle',
+'jan' => 'ng1',
+'feb' => 'ng2',
+'mar' => 'ng3',
+'apr' => 'ng4',
+'may' => 'ng5',
+'jun' => 'ng6',
+'jul' => 'ng7',
+'aug' => 'ng8',
+'sep' => 'ng9',
+'oct' => 'ng10',
+'nov' => 'ng11',
+'dec' => 'ng12',
 
 # Categories related messages
-'pagecategories'  => '{{PLURAL:$1|Kalasi|Bakalasi}}',
+'pagecategories' => '{{PLURAL:$1|Kalasi|Bakalasi}}',
 'category_header' => 'Mikanda na kalasi "$1"',
 
 'article' => 'Pagina contenta continens',
-'cancel'  => 'Katula',
-'mypage'  => 'Lukaya ya munu',
-'mytalk'  => 'Disolo ya munu',
-'and'     => '&#32;mpe',
+'cancel' => 'Katula',
+'mypage' => 'Lukaya ya munu',
+'mytalk' => 'Disolo ya munu',
+'and' => '&#32;mpe',
 
 # Cologne Blue skin
-'qbfind'   => 'Sosa',
+'qbfind' => 'Sosa',
 'qbbrowse' => 'Tala',
-'qbedit'   => 'Soba',
+'qbedit' => 'Soba',
 
 # Vector skin
 'vector-action-delete' => 'Kufwa',
-'vector-action-move'   => 'Nata',
-'vector-view-edit'     => 'Sonika',
-'vector-view-history'  => 'Tala bansoba',
-'vector-view-view'     => 'Tânga',
-
-'errorpagetitle'   => 'Foti',
-'returnto'         => 'Vutukila $1',
-'help'             => 'Nsadisa',
-'search'           => 'Sosa',
-'searchbutton'     => 'Sosa',
-'searcharticle'    => 'Kwenda',
-'history'          => 'Bansoba ya mukanda',
-'history_short'    => 'Bansoba',
-'view'             => 'Tala',
-'edit'             => 'Sonika',
-'editthispage'     => 'Soba mukanda yayi',
-'delete'           => 'Kufwa',
-'deletethispage'   => 'Kufwa mukanda yayi',
+'vector-action-move' => 'Nata',
+'vector-view-edit' => 'Sonika',
+'vector-view-history' => 'Tala bansoba',
+'vector-view-view' => 'Tânga',
+
+'errorpagetitle' => 'Foti',
+'returnto' => 'Vutukila $1',
+'help' => 'Nsadisa',
+'search' => 'Sosa',
+'searchbutton' => 'Sosa',
+'searcharticle' => 'Kwenda',
+'history' => 'Bansoba ya mukanda',
+'history_short' => 'Bansoba',
+'view' => 'Tala',
+'edit' => 'Sonika',
+'editthispage' => 'Soba mukanda yayi',
+'delete' => 'Kufwa',
+'deletethispage' => 'Kufwa mukanda yayi',
 'talkpagelinktext' => 'Disolo',
-'talk'             => 'Disolo',
-'views'            => 'Bantadilu',
-'toolbox'          => 'Bisadilu',
-'viewtalkpage'     => 'Tala disolo',
-'otherlanguages'   => 'Bandinga ya nkaka',
-'redirectedfrom'   => '(Balulama tuka $1)',
-'lastmodifiedat'   => 'Mukânda yayi me sobama na kilumbu $1 na ngûnga $2',
-'jumpto'           => 'Pamuka na:',
-'jumptosearch'     => 'nsosa',
+'talk' => 'Disolo',
+'views' => 'Bantadilu',
+'toolbox' => 'Bisadilu',
+'viewtalkpage' => 'Tala disolo',
+'otherlanguages' => 'Bandinga ya nkaka',
+'redirectedfrom' => '(Balulama tuka $1)',
+'lastmodifiedat' => 'Mukânda yayi me sobama na kilumbu $1 na ngûnga $2',
+'jumpto' => 'Pamuka na:',
+'jumptosearch' => 'nsosa',
 
 # 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).
-'currentevents'        => 'Mambu ya mpa',
-'currentevents-url'    => 'Project:Mambu ya mpa',
-'mainpage'             => 'Lukaya ya mfumu',
+'currentevents' => 'Mambu ya mpa',
+'currentevents-url' => 'Project:Mambu ya mpa',
+'mainpage' => 'Lukaya ya mfumu',
 'mainpage-description' => 'Lukaya ya mfumu',
 
-'retrievedfrom'           => 'Receptum de "$1"',
-'youhavenewmessages'      => 'Nge kele na $1 ($2).',
-'newmessageslink'         => 'bansangu ya yimpa',
+'retrievedfrom' => 'Receptum de "$1"',
+'youhavenewmessages' => 'Nge kele na $1 ($2).',
+'newmessageslink' => 'bansangu ya yimpa',
 'youhavenewmessagesmulti' => 'Nge kele na bansangu ya yimpa kuna $1',
-'editsection'             => 'soba',
-'editold'                 => 'soba',
-'editlink'                => 'soba',
-'editsectionhint'         => 'Soba kibuku: $1',
-'red-link-title'          => '$1 (mukanda kele ve)',
+'editsection' => 'soba',
+'editold' => 'soba',
+'editlink' => 'soba',
+'editsectionhint' => 'Soba kibuku: $1',
+'red-link-title' => '$1 (mukanda kele ve)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Mukanda',
+'nstab-main' => 'Mukanda',
 'nstab-mediawiki' => 'Nsangu',
-'nstab-category'  => 'Kalasi',
+'nstab-category' => 'Kalasi',
 
 # Login and logout pages
-'yourname'           => 'Nkûmbu ya nsoniki:',
-'yourpassword'       => 'Mpovo ya kuluta:',
-'login'              => 'Kota',
-'userlogin'          => 'Kota / sala konti',
-'logout'             => 'Basika',
-'userlogout'         => 'Basika',
-'nologin'            => 'Nge kele na konti ve? $1.',
-'nologinlink'        => 'Sala konti',
-'createaccount'      => 'Sala konti',
-'gotaccountlink'     => 'Kota',
+'yourname' => 'Nkûmbu ya nsoniki:',
+'yourpassword' => 'Mpovo ya kuluta:',
+'login' => 'Kota',
+'userlogin' => 'Kota / sala konti',
+'logout' => 'Basika',
+'userlogout' => 'Basika',
+'nologin' => 'Nge kele na konti ve? $1.',
+'nologinlink' => 'Sala konti',
+'createaccount' => 'Sala konti',
+'gotaccountlink' => 'Kota',
 'loginlanguagelabel' => 'Ndinga: $1',
 
 # Edit pages
-'newarticle'     => '(Yimpa)',
-'editing'        => 'Na kusonika $1',
+'newarticle' => '(Yimpa)',
+'editing' => 'Na kusonika $1',
 'editingsection' => 'Na kusonika $1 (kibuku)',
 
 # History pages
 'history-fieldset-title' => 'Monisa bansoba',
-'histfirst'              => 'Ya ntete',
-'histlast'               => 'Ya nsuka',
+'histfirst' => 'Ya ntete',
+'histlast' => 'Ya nsuka',
 
 # Diffs
-'lineno'   => 'Nzila ya $1:',
+'lineno' => 'Nzila ya $1:',
 'editundo' => 'vutula',
 
 # Search results
-'prevn'                          => 'biyita {{PLURAL:$1|$1}}',
-'nextn'                          => 'bilandi {{PLURAL:$1|$1}}',
-'viewprevnext'                   => 'Mona ($1 {{int:pipe-separator}} $2) ($3).',
-'searchprofile-everything'       => 'Nyonso',
+'prevn' => 'biyita {{PLURAL:$1|$1}}',
+'nextn' => 'bilandi {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Mona ($1 {{int:pipe-separator}} $2) ($3).',
+'searchprofile-everything' => 'Nyonso',
 'searchprofile-articles-tooltip' => 'Sosa na $1',
-'searchprofile-project-tooltip'  => 'Sosa na $1',
-'search-result-size'             => '$1 ({{PLURAL:$2|mpovo 1|bampovo $2}})',
-'search-section'                 => '(kibuku $1)',
-'searchall'                      => 'nyonso',
-'powersearch'                    => 'Sosa',
+'searchprofile-project-tooltip' => 'Sosa na $1',
+'search-result-size' => '$1 ({{PLURAL:$2|mpovo 1|bampovo $2}})',
+'search-section' => '(kibuku $1)',
+'searchall' => 'nyonso',
+'powersearch' => 'Sosa',
 
 # Preferences page
 'mypreferences' => 'Konte ya munu',
-'yourlanguage'  => 'Ndinga:',
+'yourlanguage' => 'Ndinga:',
 
 # Recent changes
-'recentchanges'             => 'Bansoba ya yimpa',
+'recentchanges' => 'Bansoba ya yimpa',
 'recentchanges-label-minor' => 'Nsoba yayi kele ya fyoti-fyoti',
-'recentchanges-label-bot'   => 'Nsoba yayi me salama na robo',
-'rcshowhideminor'           => '$1 bansoba ya fyoti-fyoti',
-'rcshowhidemine'            => '$1 bansoba na munu',
-'diff'                      => 'nsoba',
-'hist'                      => 'nsoba',
-'show'                      => 'Monisa',
-'minoreditletter'           => 'f',
+'recentchanges-label-bot' => 'Nsoba yayi me salama na robo',
+'rcshowhideminor' => '$1 bansoba ya fyoti-fyoti',
+'rcshowhidemine' => '$1 bansoba na munu',
+'diff' => 'nsoba',
+'hist' => 'nsoba',
+'show' => 'Monisa',
+'minoreditletter' => 'f',
 
 # File description page
 'filehist-datetime' => 'Kilumbu/Ngûnga',
-'filehist-user'     => 'Nsoniki',
+'filehist-user' => 'Nsoniki',
 
 # Random page
 'randompage' => 'Lukaya na kintulumukini',
 
 # Miscellaneous special pages
 'ncategories' => '{{PLURAL:$1|kalasi|bakalasi}} $1',
-'newpages'    => 'Mikanda ya yimpa',
+'newpages' => 'Mikanda ya yimpa',
 
 # Special:AllPages
 'alphaindexline' => '$1 tî $2',
@@ -207,8 +207,8 @@ $messages = array(
 
 # Contributions
 'mycontris' => 'Makabu ya munu',
-'month'     => 'Katuka ngônda:',
-'year'      => 'Katuka mvula:',
+'month' => 'Katuka ngônda:',
+'year' => 'Katuka mvula:',
 
 'sp-contributions-talk' => 'disolo',
 
@@ -216,30 +216,30 @@ $messages = array(
 'whatlinkshere' => 'Balukaya ke songa awa',
 
 # Move page
-'movearticle'    => 'Nata lukaya:',
-'newtitle'       => 'Nkûmbu ya nkaka:',
-'movepagebtn'    => 'Nata lukaya',
-'pagemovedsub'   => 'Kunata me nunga',
+'movearticle' => 'Nata lukaya:',
+'newtitle' => 'Nkûmbu ya nkaka:',
+'movepagebtn' => 'Nata lukaya',
+'pagemovedsub' => 'Kunata me nunga',
 'movepage-moved' => '\'\'\'"$1" me natama na "$2"\'\'\'',
-'articleexists'  => 'Lukaya ya nkaka kele na nkûmbu yango, to nkûmbu yango kele ya mbote ve.
+'articleexists' => 'Lukaya ya nkaka kele na nkûmbu yango, to nkûmbu yango kele ya mbote ve.
 Sôla nkûmbu ya nkaka.',
-'movereason'     => 'Samu:',
+'movereason' => 'Samu:',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Mukanda ya munu',
-'tooltip-pt-mytalk'   => 'Disolo ya munu',
-'tooltip-pt-logout'   => 'Basika',
-'tooltip-search'      => 'Sosa na {{SITENAME}}',
-'tooltip-undo'        => '"Vutula" ke vutula nsoba yayi mpe yawu ke monisa lumoni ya kusoba. Nge lênda sonika kikuma ya mvutula.',
+'tooltip-pt-mytalk' => 'Disolo ya munu',
+'tooltip-pt-logout' => 'Basika',
+'tooltip-search' => 'Sosa na {{SITENAME}}',
+'tooltip-undo' => '"Vutula" ke vutula nsoba yayi mpe yawu ke monisa lumoni ya kusoba. Nge lênda sonika kikuma ya mvutula.',
 
 # 'all' in various places, this might be different for inflected languages
 'namespacesall' => 'nyonso',
-'monthsall'     => 'nyonso',
+'monthsall' => 'nyonso',
 
 # Table pager
-'table_pager_next'  => 'Lukaya ya kulanda',
-'table_pager_prev'  => 'Lukaya ya kuyita',
+'table_pager_next' => 'Lukaya ya kulanda',
+'table_pager_prev' => 'Lukaya ya kuyita',
 'table_pager_first' => 'Lukaya ya ntete',
-'table_pager_last'  => 'Lukaya ya nsuka',
+'table_pager_last' => 'Lukaya ya nsuka',
 
 );
index d28025d..bcd3210 100644 (file)
@@ -158,7 +158,6 @@ $messages = array(
 'qbbrowse' => 'Browse/تصفّح',
 'qbedit' => 'ترمیم',
 'qbpageoptions' => 'ھیہ صفحہ',
-'qbpageinfo' => 'مفہوم',
 'qbmyoptions' => 'مہ صفحات',
 'qbspecialpages' => 'خاص صفحات',
 'faq' => 'عام معلومات',
@@ -284,6 +283,7 @@ $1',
 'toc' => 'فہرست',
 'showtoc' => 'پشاوے',
 'hidetoc' => 'کھوشتاوے',
+'collapsible-collapse' => 'خاتمہ/Collapse',
 'thisisdeleted' => 'لوڑے  یا بحال کورے $1',
 'viewdeleted' => 'لوڑے $1؟',
 'restorelink' => '{{PLURAL:$1|ای ترمیم حذف ہوی|$1 ترامیم حذف ہونی}}',
@@ -386,14 +386,11 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 
 # Login and logout pages
 'logouttext' => "'''ھنیسے تو خارج بیتی آسوس'''<br />
-تو خفی الاسم {{SITENAME}}  استعمال جاری لاکھیکو بوس، یا دوبارہ ھیہ نامو یا مختلف نامان سورا داخل دی بیکو بوس۔  ھیہ یاد آوری کورے کہ ای کما صفحات ھش [[Special:UserLogin|دوباری لاگن بوس]] غیچھی گونی کہ تو ھنیسے خارج نو بیتی آسوس، کلہ پت کہ تو تان تفصحہ (براؤزرو) ابطن (cache) صاف نوکوروس۔\",",
-'welcomecreation' => '== رحمت عزیز چترالی تتے خوشان گیے ریران، $1 ! ==
-
-تہ  کھاتہ ساوزینو بیتی شیر تو تان [[Special:Preferences|{{SITENAME}} ترجیحات]]ن مرتب کوریکو مو روخڅے.',
+تو خفی الاسم {{SITENAME}}  استعمال جاری لاکھیکو بوس، یا دوبارہ ھیہ نامو یا مختلف نامان سورا داخل دی بیکو بوس۔  ھیہ یاد آوری کورے کہ ای کما صفحات ھش <span class='plainlinks'>[\$1 دوباری لاگن بوس]</span> غیچھی گونی کہ تو ھنیسے خارج نو بیتی آسوس، کلہ پت کہ تو تان تفصحہ (براؤزرو) ابطن (cache) صاف نوکوروس۔\",",
 'yourname' => 'اسمِ رکنیت',
 'yourpassword' => 'کلمۂ شناخت(پاسورڈ)',
 'yourpasswordagain' => 'کلمۂ شناخت(پاسورڈو)دوبارہ نیویشے',
-'remembermypassword' => '!!Rachitrali!!مہ یاد لاکھے (کم از کم $1 {{PLURAL:$1|بس|بس}})',
+'remembermypassword' => 'مہ یاد لاکھے (کم از کم $1 {{PLURAL:$1|بس|بس}})',
 'yourdomainname' => 'تہ ڈومین',
 'externaldberror' => 'یا تھے توثیقی ڈیٹابیسا خطا واقع بیتی شیر یا تتے بیریو کھاتو بتاریخ کوریکو اِجازت نیکی',
 'login' => 'داخل بوس',
@@ -557,6 +554,14 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 'moveddeleted-notice' => 'ھیہ ای حذف شدہ صفحہ شیر.
 صفحو نوشتۂ حذف شدگی و منتقلی ذیلا بطورِ حوالہ دیونو بویان.',
 
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''خبردار:''' سانچو سایز بو لوٹ شیر.
+بعضی سانچہ شامل نو بونی.",
+'post-expand-template-inclusion-category' => 'ھش صفحات کہ ھتیرا ٹمپلیٹ یعنی سانچو ناپ لوٹ بیتی شیر۔',
+'post-expand-template-argument-warning' => "'''خبردار:''' ھیہ صفحا ای سانچہ(ٹمپلیٹ) مشقولگی دیونو بیتی شیر وا ھمو سایز بولوٹ شیر۔
+ھمی لوان نیزونو بیتی شیر",
+'post-expand-template-argument-category' => 'ھش صفحات کہ ھتیرا بوغینو بیرو سانچان یعنی(ٹمپلیٹان) لو شینی۔',
+
 # History pages
 'viewpagelogs' => 'ھیہ صفحہو بچے نوشتہ جاتن لوڑے',
 'currentrev-asof' => 'حالیہ نظرثانی بمطابق $1',
@@ -566,6 +571,7 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 'nextrevision' => '→پروشٹیو اعادہ',
 'currentrevisionlink' => 'حالیہ نظرثانی',
 'cur' => 'رائج',
+'next' => 'پروشٹیو',
 'last' => 'سابقہ',
 'histlegend' => "انتخاب: مختلف نسخان موازنہ کوریکو بچے ، پیامی خانان نشان زد کوری موڑا دیرو بٹنا کلک کورے۔
 
@@ -631,8 +637,6 @@ MySQL جوابِ خطاء پرائے "$3: $4"',
 'search-interwiki-caption' => 'ملگیری منصوبہ',
 'search-interwiki-default' => '$1 نتائج:',
 'search-interwiki-more' => '(مزید)',
-'search-mwsuggest-enabled' => 'تجویزان سوم جستہ',
-'search-mwsuggest-disabled' => 'کیہ تجویز نیکی',
 'searchrelated' => 'متعلقہ',
 'searchall' => 'کھل',
 'showingresultsheader' => "{{PLURAL:$5|نتیجہ'''$1''' of '''$3'''|نتیجہ'''$1 - $2''' of '''$3'''}} بچے'''$4'''",
@@ -688,6 +692,7 @@ HTML tags لوڑے.',",
 'recentchanges-label-newpage' => 'ھیہ ترمیم نوغ صفحہ تخلیق آریر',
 'recentchanges-label-minor' => 'ھیہ ای معمولی ترمیم شیر',
 'recentchanges-label-bot' => 'ھیہ ایڈیٹو خود کار بوٹو زریعا انجام دیونو ہوی',
+'recentchanges-label-unpatrolled' => 'ھیہ ترمیمو ھمونیہ پت مراجعت(Patrolled) کورونو نو بیتی شیر',
 'rcnote' => "درج ذیل گزشتہ {{PLURAL:$2|بس|'''$2''' انوسا}} باک {{PLURAL:$1|'''ای''' تبدیلی شیر|آخری '''$1''' تبدیلی شینی}}، $5، $4.",
 'rcnotefrom' => "ھیہ موڑا '''$2''' کورونو بیرو تبدیلیان تفصیلات شینی ('''$1''' تبدیلیان پشینو بونیان)۔",
 'rclistfrom' => '$1 نوغ تبدیلیاں پشیک شروع کورے',
@@ -712,6 +717,7 @@ HTML tags لوڑے.',",
 'recentchangeslinked' => 'متعلقہ تبدیلی',
 'recentchangeslinked-toolbox' => 'موقعی تبدیلی',
 'recentchangeslinked-title' => 'متعلقہ تبدیلی "$1"',
+'recentchangeslinked-noresult' => 'ھمی صفحا موجودہ وختہ کیہ تبدیلی نیکی۔',
 'recentchangeslinked-summary' => "ھیہ ھتے تبدیلیان لسٹ شیر کہ ھیتان پھوک مدا پروشٹی ساوزینو بیتی شینی وا ھے صفحان سوم جستہ خور کیہ صفحہ چوکی شینی یا کیہ خاص زمرہ جاتو ممبرانن سوم چوکی شینی<br />
 ساوزیرو [[Special:Watchlist|موڑا صفحہ]] '''بولڈ''' شینی",
 'recentchangeslinked-page' => 'کھوار ویکیپیڈیو منصوبو صفحو لوڑے',
@@ -742,6 +748,8 @@ HTML tags لوڑے.',",
 'imagelinks' => 'مسلو روابط',
 'linkstoimage' => 'ھیہ مسلو سوم درج ذیل {{PLURAL:$1|صفحہ مربوط شیر|$1 صفحات مربوط شینی}}',
 'nolinkstoimage' => 'ھیہ کھوار ویکیپیڈیا ھش کیہ صفحات نیکی کہ ھتیت ھیہ مسل (فائلو) متعلقہ شینی',
+'sharedupload-desc-here' => 'ھیہ فائل $1 موژاری شیر وا ھیہ خور پرجیکٹہ استعمال بویان۔
+مزید معلومات ھمو [$2 فائل مشقولگی صفحہا]  دیونو بیتی شیر',
 'uploadnewversion-linktext' => 'ھیہ مسلو نوغ ورژنو اپلوڈ کورے',
 
 # Random page
@@ -750,6 +758,8 @@ HTML tags لوڑے.',",
 # Statistics
 'statistics' => 'اعداد و شمار',
 
+'disambiguationspage' => 'سانچہ: ڈسایمبگ',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|بایٹ|بایٹس}}',
 'nmembers' => '$1 {{PLURAL:$1|ممبار|ممباران}}',
@@ -925,6 +935,7 @@ HTML tags لوڑے.',",
 
 # Block/unblock
 'blockip' => 'داخلہ ممنوع براۓ صارف',
+'ipboptions' => '2 گھنٹہ:2 hours,1 آنوس:1 day,3 بس:3 days,1 ہفتہ:1 week,2 ہفتہ:2 weeks,1 مس:1 month,3 مس:3 months,6 مس:6 months,1 سال:1 year,لامحدود:infinite',
 'ipblocklist' => 'داخلہ ممنوع براۓ صارف',
 'blocklink' => 'پاوبندی لیگاوے',
 'unblocklink' => 'پاوبندی ختم',
@@ -1056,6 +1067,8 @@ HTML tags لوڑے.',",
 * gpslongitude
 * gpsaltitude',
 
+'exif-dc-date' => 'تاریخ',
+
 # External editor support
 'edit-externally' => 'ھیہ مسلو ایڈیٹ کورے',
 'edit-externally-help' => '(See the [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] for more information)
@@ -1066,6 +1079,9 @@ HTML tags لوڑے.',",
 'namespacesall' => 'تھمامو',
 'monthsall' => 'سف',
 
+# action=purge
+'confirm_purge_button' => 'OK/ٹھیک شیر',
+
 # Table pager
 'table_pager_first' => 'آویلو صفحہ',
 
@@ -1074,10 +1090,38 @@ HTML tags لوڑے.',",
 'watchlisttools-edit' => 'لوڑے یا واچ لسٹہ ترمیم کورے',
 'watchlisttools-raw' => 'نوغ واچ لسٹان ایڈیٹ کورے',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'خبردار:\'\'\' ڈیفالٹ تاڑٰ(نغڑی) "$2" پروشٹیو ڈیفالٹ تاڑا "$1" لیگی شیر۔',
+
+# Special:FilePath
+'filepath-page' => 'فایل',
+'filepath-submit' => 'Go/بوغے',
+
 # Special:SpecialPages
 'specialpages' => 'اسپیشل صفحہ',
 
+# External image whitelist
+'external_image_whitelist' => ' #ھیہ لاینو ھموش تان شیکو لاکے کیچہ کہ ھیہ شیر<pre>
+#موڑا ریگولر لوان دیور((صرف ھتیتان کیاغ ھمیتان موژی شینی //) //) 
+#بیریو ھوٹوان آر ایلان سوم ھمیتان میچ کورنو بوی
+# کیاغ کہ میچ ھونی ھیتان ھوٹوان سوم پشینو بوی بصورت دیگر ھیتان لنک کیاغ کی شینی ھتیتان پشینو بوی
+#لاین کیاغ کی شروع بویان  # کومنٹ جوشونو بوی۔
+#ھیہ کیس سینسیٹو شیر۔
+
+#لینو سورا ریجیکس فریگمنٹو لاکھے. ھیہ لاینو ھموش تان شیکو لاکے کیچہ کہ ھیہ شیر۔</pre>',
+
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] filter:',
+'tag-filter-submit' => 'فلٹر',
+'tags-title' => 'Tags/ٹیگز',
+
+# Special:ComparePages
+'compare-page1' => 'صفحہ 1',
+
+# Feedback
+'feedback-message' => 'پیغام',
+
+# Search suggestions
+'searchsuggest-search' => 'Search/تلاش',
 
 );
index cf9fff0..d6d552a 100644 (file)
@@ -53,61 +53,61 @@ $namespaceAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Bınê girey de xete bonce:',
+'tog-underline' => 'Bınê girey de xete bıonce:',
 'tog-justify' => 'Paragrafu ayar ke',
-'tog-hideminor' => 'Vurnaisunê senıku pela vurnaisunê peyênu de wedare',
-'tog-hidepatrolled' => 'Vurnaisunê qontrolkerdu pela vurnaisê peyêni de wedare',
+'tog-hideminor' => 'Vurnayisunê senıku pela vurnayisunê peyênu de wedare',
+'tog-hidepatrolled' => 'Vurnayisunê qontrolkerdu pela vurnayisê peyêni de wedare',
 'tog-newpageshidepatrolled' => 'Pelunê qontrolkerdu lista pelunê newu de wedare',
-'tog-extendwatchlist' => 'Lista şêrkerdene hira bıke ke vurnaişi pêro basê, teyna tewr peyêni nê',
-'tog-usenewrc' => 'Vurnaisunê peyênunê hirakerdiu bıgurene (JavaScript lazımo)',
+'tog-extendwatchlist' => 'Lista şêrkerdene hira bıke ke vurnayişi pêro bıasê, teyna tewr peyêni nê',
+'tog-usenewrc' => 'Pele be vurnayisunê grube de vurnayisê peyêni u lista şêrkerdişi (JavaScript lazımo)',
 'tog-numberheadings' => 'Sernustu be ho numra cı sane',
-'tog-showtoolbar' => 'Gozagunê hacetunê vurnaişi basne (JavaScript lazımo)',
-'tog-editondblclick' => 'Pê dı rey teqnaene pele sero bıguriye (JavaScript lazımo)',
-'tog-editsection' => 'Vurnaena qısımi ebe gireunê [bıvurne] ra feal ke',
-'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-showtoolbar' => 'Gozagunê hacetunê vurnayişi bıasne (JavaScript lazımo)',
+'tog-editondblclick' => 'Pê dı rey teqnayene pele sero bıguriye (JavaScript lazımo)',
+'tog-editsection' => 'Vurnayena qısımi ebe gireyunê [bıvurne] ra feal ke',
+'tog-editsectiononrightclick' => 'Qısımu be teqnayena serrêze ra ebe gozaga raste bıvurne (JavaScript lazımo)',
+'tog-showtoc' => 'Tablowê tedeestewu bıasne (de pelunê be hirê sernustu ra jêdêri de)',
+'tog-rememberpassword' => 'Parola mı nê cıcêrawoği de bia ho viri (serba tewr jêde $1 {{PLURAL:$1|roze|rozu}}).',
 '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' => '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ı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:',
-'tog-fancysig' => 'İmza rê mamelê wikimeqaley bıke (bê gireo otomatik)',
-'tog-externaleditor' => 'Editorê teberi standart bıgurene (teyna serba ekspertuno, komputerê sıma de ayarê xısuşiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
+'tog-minordefault' => 'Vurnayisunê ho pêrune ‘vurnayiso qızkek’ nisan bıde',
+'tog-previewontop' => 'Verqayti pela nustene ser de bıasne',
+'tog-previewonfirst' => 'Vurnayiso verên de verqayti tım bıasne',
+'tog-nocache' => 'Pelunê cıfeteliyawoği mia ho viri',
+'tog-enotifwatchlistpages' => 'Zû pele ya ki dosyawa ke lista mına şêrkerdişi de vurnê mı rê e-poste bırusne',
+'tog-enotifusertalkpages' => 'Pela mına hurênayişi ke vurnê mı rê e-poste bırusne',
+'tog-enotifminoredits' => 'Vurnayisunê qızkekunê pelun u dosyu de ki mı rê e-poste bırusne',
+'tog-enotifrevealaddr' => 'Adresa e-postê mı postê xeberu de bıasne',
+'tog-shownumberswatching' => 'Amorê karberunê şêrkerdoğu bıasne',
+'tog-oldsig' => 'İmza mewcude:',
+'tog-fancysig' => 'İmza rê mamelê wikimeqaley bıke (bê girewo otomatik)',
+'tog-externaleditor' => 'Editorê teberi standart bıgurene (teyna serba ekspertuno, komputerê sıma de ayarê xusışiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
 'tog-externaldiff' => 'Têversanaene pê programê teberi vıraze (teyna serba ekspertuno, komputerê sıma de ayarê xısuşiy lazımê. [//www.mediawiki.org/wiki/Manual:External_editors Melumato jêdêr.])',
 'tog-showjumplinks' => 'Girê "so"y feal ke',
-'tog-uselivepreview' => 'Verqayto cınde bıgurene (JavaScript) (hona cerrebnaene dero)',
+'tog-uselivepreview' => 'Verqayto cande bıgurene (JavaScript) (hona cerrebnayene dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
-'tog-watchlisthideown' => 'Vurnaisunê mı lista mına şêrkerdişi de wedare',
-'tog-watchlisthidebots' => 'Vurnaisunê boti lista mına şêrkerdişi de wedare',
-'tog-watchlisthideminor' => 'Vurnaisunê qızkeku lista mına şêrkerdişi de wedare',
-'tog-watchlisthideliu' => 'Lista şêrkerdişi ra vurnaisunê karberunê cıkotu wedare',
-'tog-watchlisthideanons' => 'Lista şêrkerdişi ra vurnaisunê karberunê anonimu wedare',
-'tog-watchlisthidepatrolled' => 'Lista şêrkerdişi ra vurnaisunê qontrolkerdu wedare',
+'tog-watchlisthideown' => 'Vurnayisunê mı lista mına şêrkerdişi de wedare',
+'tog-watchlisthidebots' => 'Vurnayisunê boti lista mına şêrkerdişi de wedare',
+'tog-watchlisthideminor' => 'Vurnayisunê qızkeku lista mına şêrkerdişi de wedare',
+'tog-watchlisthideliu' => 'Lista şêrkerdişi ra vurnayisunê karberunê cıkotu wedare',
+'tog-watchlisthideanons' => 'Lista şêrkerdişi ra vurnayisunê karberunê anonimu wedare',
+'tog-watchlisthidepatrolled' => 'Lista şêrkerdişi ra vurnayisunê qontrolkerdu wedare',
 'tog-ccmeonemails' => 'E-postunê ke ez karberunê binu rê rusnenu, mı rê kopya inu bırusne',
-'tog-diffonly' => 'Qıyasê versiyonu de tek ferqu basne, pela butıne nê',
-'tog-showhiddencats' => 'Kategoriunê dızdêni basne',
+'tog-diffonly' => 'Qıyasê versiyonu de tek ferqu bıasne, pela butıne nê',
+'tog-showhiddencats' => 'Kategoriyunê dızdêni bıasne',
 'tog-norollbackdiff' => 'Peyserardene ra dıme ferqi caverde',
 
 'underline-always' => 'Tım',
 'underline-never' => 'Qet',
-'underline-default' => 'Qerar cıcêraoği dest dero',
+'underline-default' => 'Cild ya ki cıfeteliyayoğo hesebiyaye',
 
 # Font style option in Special:Preferences
-'editfont-style' => 'Warê vurnaena tipê nustey:',
-'editfont-default' => 'Fereziya cıfeteliyaoği',
-'editfont-monospace' => 'Tipê nustê sabıtcaguretoği',
-'editfont-sansserif' => 'Tipê nustê Sans-serifi',
-'editfont-serif' => 'Tipê nustê Serifi',
+'editfont-style' => 'Warê vurnayena terzê nustey:',
+'editfont-default' => 'Fereziya cıfeteliyawoği',
+'editfont-monospace' => 'Terzê nustê sabıtcaguretoği',
+'editfont-sansserif' => 'Babetê Sans-serifi',
+'editfont-serif' => 'Babetê serifi',
 
 # Dates
 'sunday' => 'Bazar',
@@ -120,7 +120,7 @@ $messages = array(
 'sun' => 'Baz',
 'mon' => 'Dıs',
 'tue' => 'Şês',
-'wed' => 'Çar',
+'wed' => 'Çrs',
 'thu' => 'Pho',
 'fri' => 'Yen',
 'sat' => 'Sem',
@@ -198,7 +198,6 @@ $messages = array(
 'qbbrowse' => 'Çım ra viarne',
 'qbedit' => 'Bıvurne',
 'qbpageoptions' => 'Na pele',
-'qbpageinfo' => 'Gire',
 'qbmyoptions' => 'Pelê mı',
 'qbspecialpages' => 'Pelê xısusiy',
 'faq' => 'PZP (Persê ke zaf perşinê)',
@@ -447,15 +446,12 @@ Sebebê ho ''$2'' dero.",
 # Login and logout pages
 'logouttext' => "'''Sıma nıka cı ra veciyê.'''
 
-Sıma şikinê dızdêni {{SITENAME}} de dewam kerê, ya jê eyni karberi ya ki jê jüyê de bini [[Special:UserLogin|oncia cıkuyê]].
+Sıma şikinê dızdêni {{SITENAME}} de dewam kerê, ya jê eyni karberi ya ki jê jüyê de bini <span class='plainlinks'>[$1 oncia cıkuyê]</span>.
 Beno ke taê peli sıma hona cıkote asnenê, hata ke sıma ''browser cache''ê ho kerd pak.",
-'welcomecreation' => '== Xêr amê, $1! ==
-Hesabê sıma vıraciya.
-Vurnaena [[Special:Preferences|melumatanê {{SITENAME}}]] ho vira mekerê.',
 'yourname' => 'Namê karberi:',
 'yourpassword' => 'Parola:',
 'yourpasswordagain' => 'Parola tekrar ke:',
-'remembermypassword' => 'Cıkotena mı na komputeri de bia ho viri ($1 {{PLURAL:$1|roze|rozu}} ra seba zu zêdêrêni)',
+'remembermypassword' => 'Cıkotena mı na komputeri de bia ho viri (seba tewr jêde $1 {{PLURAL:$1|roze|rozu}})',
 'securelogin-stick-https' => 'Cıkotene ra dıme HTTPS rê giredae bımane',
 'yourdomainname' => 'Bandıra sıma:',
 'externaldberror' => 'Cıfeteliyaisê naskerdene de ya xeta esta ya ki tebera vırastena hesabê sıma rê destur çino.',
@@ -591,7 +587,7 @@ Dosyunê ebe namê .css u .js'y de herfa hurdiye bıgurêne, mesela hurêndia {{
 'note' => "'''Not:'''",
 'previewnote' => "Teme! ena teyna verqeyda.'''
 Vurnayışê tu hama qeyd nıbiyo!",
-'editing' => 'Tıya $1 vurnena',
+'editing' => '$1 Vurnayis',
 'editingsection' => 'Vurnaena $1 (qısım)',
 'editingcomment' => '$1 vurnino (qısımo newe)',
 'editconflict' => 'Têverabiyaena vurnaişi: $1',
@@ -766,8 +762,6 @@ Eke şertê ilawekerdey ke niyê ro, idarekerê bini {{SITENAME}} de nêşikinê
 'search-interwiki-caption' => 'Procê bıray',
 'search-interwiki-default' => '$1 neticey:',
 'search-interwiki-more' => '(zafêr)',
-'search-mwsuggest-enabled' => 'ebe teklifu',
-'search-mwsuggest-disabled' => 'teklifi çinê',
 'search-relatedarticle' => 'alaqedar',
 'searchrelated' => 'alaqedar',
 'searchall' => 'pêro',
@@ -903,7 +897,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'grouppage-bureaucrat' => '{{ns:project}}:Burokrati',
 
 # Rights
-'right-read' => 'Pelan bıwanê',
+'right-read' => 'Pelan bıwane',
 'right-edit' => 'Pelu bıvurne',
 'right-move' => 'Pelu bere',
 'right-movefile' => 'Dosyu bere',
@@ -943,12 +937,12 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'rcnotefrom' => "Cêr de vurnayîşê esto ke '''$2''' ra raver  (heta '''$1''' mucnayiyo).",
 'rclistfrom' => '$1 ra hata nıka vurnaisunê newu bıasne',
 'rcshowhideminor' => '$1 vurnaisê qızkeki',
-'rcshowhidebots' => 'botê $1i',
-'rcshowhideliu' => '$1 karberê qeydbiyaey',
+'rcshowhidebots' => 'Botu $1',
+'rcshowhideliu' => 'Karberunê qeydbiyayu $1',
 'rcshowhideanons' => '$1 karberê anonimi',
 'rcshowhidepatr' => 'Vurnayışê cıyê vênıtey $1',
-'rcshowhidemine' => '$1 vurnaisê mı',
-'rclinks' => '$1 vurnaisunê peyênunê $2 rozunê<br />$3 peyênun bıasne',
+'rcshowhidemine' => 'Vurnayisanê mı $1',
+'rclinks' => 'Peyniya $2 rozu de $1 vurnayisu bıasne <br />$3',
 'diff' => 'ferq',
 'hist' => 'ver',
 'hide' => 'Bınımne',
@@ -1157,7 +1151,7 @@ Cêr [$2 pela arezekerdena dosya de] arezekerdene asnina.',
 
 # Watchlist
 'watchlist' => 'Pela mına şêrkerdene',
-'mywatchlist' => 'Lista mına şêrkerdışi',
+'mywatchlist' => 'Lista şêrkerdışi',
 'watchlistfor2' => 'Serba $1 ($2)',
 'addedwatchtext' => "Pela \"[[:\$1]]\"i ilawe biye be [[Special:Watchlist|pela şêrkerdişi]].
 Nara dıme, vurnaisê na pele u pela hurênaisê dawa alaqedare ita bena lista, u pele [[Special:RecentChanges|lista vurnaisunê peyênu]] de '''qolınd''' asena ke cı ra asan weçiniyo.",
@@ -1173,8 +1167,6 @@ Nara dıme, vurnaisê na pele u pela hurênaisê dawa alaqedare ita bena lista,
 'watching' => 'Şêr ke…',
 'unwatching' => 'Şêr meke…',
 
-'changed' => 'vuriya',
-
 # Delete
 'deletepage' => 'Pele bıestere',
 'delete-legend' => 'Bıestere',
@@ -1256,13 +1248,13 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 
 # Namespace form on various pages
 'namespace' => 'Caê namey:',
-'invert' => 'Weçinıtu ra qêri bıasne',
+'invert' => 'Weçinıtiso peyserki',
 'blanknamespace' => '(Ser)',
 
 # Contributions
 'contributions' => 'İştırakê karberi',
 'contributions-title' => '$1 de iştırakê karberi',
-'mycontris' => 'İştıraqê mı',
+'mycontris' => 'İştıraqi',
 'contribsub2' => 'Serba $1 ($2)',
 'uctop' => '(ser)',
 'month' => 'Asme ra (u ravêr):',
@@ -1293,7 +1285,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 'whatlinkshere-hideredirs' => 'peyser sono $1',
 'whatlinkshere-hidetrans' => 'İlawekerdê çaprazi $1',
 'whatlinkshere-hidelinks' => '$1 girey',
-'whatlinkshere-hideimages' => 'girê resmu $1',
+'whatlinkshere-hideimages' => 'Girê dosya $1',
 'whatlinkshere-filters' => 'Filtrey',
 
 # Block/unblock
@@ -1318,7 +1310,7 @@ Tı şikina sewiya sevekiyaena na pele bıvurnê, hema yê nae sevekiyaena qedem
 'blocklink' => 'kilıt ke',
 'unblocklink' => 'ra ke',
 'change-blocklink' => 'mani bıvurne',
-'contribslink' => 'iştıraki',
+'contribslink' => 'iştıraqi',
 'emaillink' => 'e-poste bırusne',
 'autoblocker' => 'Sıma otomatikmen kılit biy, çıke adresa sımawa \'\'IP\'\'y terefê "[[User:$1|$1]]" gurenina.
 Sebebê kılit-biyaena $1\'i: "$2"o',
index bf7d354..c265eb4 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kazakh (Arabic script) (‫قازاقشا (تٴوتە)‬)
+/** Kazakh (Arabic script) (قازاقشا (تٴوتە)‏)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -520,7 +520,6 @@ $messages = array(
 'qbbrowse' => 'شولۋ',
 'qbedit' => 'وڭدەۋ',
 'qbpageoptions' => 'بۇل بەت',
-'qbpageinfo' => 'اينالا',
 'qbmyoptions' => 'بەتتەرىم',
 'qbspecialpages' => 'ارنايى بەتتەر',
 'faq' => 'ٴجىيى قويىلعان ساۋالدار',
@@ -727,9 +726,6 @@ $2',
 
 جۇيەگە كىرمەستەن {{SITENAME}} جوباسىن پايدالانۋىن جالعاستىرا الاسىز, نەمەسە ٴدال سول نە وزگە قاتىسۋشى بوپ قايتا كرۋىڭىز مۇمكىن.
 اڭعارتپا: كەيبىر بەتتەر شولعىشىڭىزدىڭ بۇركەمەسىن تازارتقانشا دەيىن ٴالى دە كىرپ قالعانىڭىزداي كورىنۋى مۇمكىن.",
-'welcomecreation' => '== قوش كەلدىڭىز, $1! ==
-جاڭا تىركەلگىڭىز جاسالدى.
-{{SITENAME}} باپتالىمدارىڭىزدى وزگەرتۋىن ۇمىتپاڭىز.',
 'yourname' => 'قاتىسۋشى اتىڭىز:',
 'yourpassword' => 'قۇپىييا ٴسوزىڭىز:',
 'yourpasswordagain' => 'قۇپىييا ٴسوزدى قايتالاڭىز:',
@@ -1128,8 +1124,6 @@ $3 كەلتىرىلگەن سەبەبى: ''$2''",
 'search-interwiki-caption' => 'باۋىرلاس جوبالار',
 'search-interwiki-default' => '$1 ناتىيجە:',
 'search-interwiki-more' => '(كوبىرەك)',
-'search-mwsuggest-enabled' => 'ۇسىنىمدارمەن',
-'search-mwsuggest-disabled' => 'ۇسىنىمدارسىز',
 'search-relatedarticle' => 'قاتىستى',
 'mwsuggest-disable' => 'AJAX ۇسىنىمدارىن ٴوشىر',
 'searchrelated' => 'قاتىستى',
@@ -1756,11 +1750,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => '{{SITENAME}} ەسكەرتۋ حات جىبەرۋ قىزمەتى',
 'enotif_reset' => 'بارلىق بەت كەلىپ-كەتىلدى دەپ بەلگىلە',
-'enotif_newpagetext' => 'مىناۋ جاڭا بەت.',
 'enotif_impersonal_salutation' => '{{SITENAME}} قاتىسۋشىسى',
-'changed' => 'وزگەرتتى',
-'created' => 'باستادى',
-'enotif_subject' => '{{SITENAME}} جوباسىندا $PAGEEDITOR $PAGETITLE اتاۋلى بەتتى $CHANGEDORCREATED',
 'enotif_lastvisited' => 'سوڭعى كەلىپ-كەتۋىڭىزدەن بەرى بولعان وزگەرىستەر ٴۇشىن $1 دەگەندى قاراڭىز.',
 'enotif_lastdiff' => 'وسى وزگەرىس ٴۇشىن $1 دەگەندى قاراڭىز.',
 'enotif_anon_editor' => 'تىركەلگىسىز قاتىسۋشى $1',
index 0bcf016..4d2e73b 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kazakh (Cyrillic script) (‪қазақша (кирил)‬)
+/** Kazakh (Cyrillic script) (қазақша (кирил)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -503,7 +503,6 @@ $messages = array(
 'qbbrowse' => 'Шолу',
 'qbedit' => 'Өңдеу',
 'qbpageoptions' => 'Бұл бет',
-'qbpageinfo' => 'Айнала',
 'qbmyoptions' => 'Беттерім',
 'qbspecialpages' => 'Арнайы беттер',
 'faq' => 'Жиі қойылған сауалдар',
@@ -756,11 +755,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Жүйеден шықтыңыз.'''
 
-Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз, немесе баяғы не өзге қатысушы ретінде жүйеге [[Special:UserLogin|қайта кіруіңізге]] болады.
+Жүйеге кірместен де {{SITENAME}} жобасын пайдалана аласыз, немесе баяғы не өзге қатысушы ретінде жүйеге <span class='plainlinks'>[$1 қайта кіруіңізге]</span> болады.
 Аңғартпа: Кейбір беттер шолғышыңыздың кэшін тазартқанша әлі де жүйеге кіріп отырғаныңыздай көрінуі мүмкін.",
-'welcomecreation' => '== Қош келдіңіз, $1! ==
-Жаңа тіркелгіңіз жасалды.
-Өзіңіздің [[Special:Preferences|жеке баптауларыңызды]] өзгертуді ұмытпаңыз.',
 'yourname' => 'Қатысушы аты:',
 'yourpassword' => 'Құпия сөз:',
 'yourpasswordagain' => 'Құпия сөзді қайталаңыз:',
@@ -1274,8 +1270,6 @@ $3 келтірілген себебі: ''$2''",
 'search-interwiki-caption' => 'Бауырлас жобалар',
 'search-interwiki-default' => '$1 нәтиже:',
 'search-interwiki-more' => '(көбірек)',
-'search-mwsuggest-enabled' => 'ұсынымдармен',
-'search-mwsuggest-disabled' => 'ұсынымдарсыз',
 'search-relatedarticle' => 'Қатысты',
 'mwsuggest-disable' => 'AJAX ұсынымдарын өшір',
 'searcheverything-enable' => 'Белгіленген есім кеңістігінен іздеу',
@@ -1993,11 +1987,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => '{{SITENAME}} ескерту хат жіберу қызметі',
 'enotif_reset' => 'Барлық бет келіп-кетілді деп белгіле',
-'enotif_newpagetext' => 'Мынау жаңа бет.',
 'enotif_impersonal_salutation' => '{{SITENAME}} қатысушысы',
-'changed' => 'өзгертті',
-'created' => 'бастады',
-'enotif_subject' => '{{SITENAME}} жобасында $PAGEEDITOR $PAGETITLE атаулы бетті $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Соңғы келіп-кетуіңізден бері болған өзгерістер үшін $1 дегенді қараңыз.',
 'enotif_lastdiff' => 'Осы өзгеріс үшін $1 дегенді қараңыз.',
 'enotif_anon_editor' => 'тіркелгісіз қатысушы $1',
@@ -3193,4 +3183,7 @@ $5
 'logentry-newusers-autocreate' => '$1 аккаунты автоматты түрде тіркелді',
 'newuserlog-byemail' => 'Құпия сөз e-mail арқылы жіберілді',
 
+# Search suggestions
+'searchsuggest-search' => 'Іздеу',
+
 );
index c2524b7..5738a6f 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
@@ -483,7 +483,6 @@ $messages = array(
 'qbbrowse' => 'Şolw',
 'qbedit' => 'Öñdew',
 'qbpageoptions' => 'Bul bet',
-'qbpageinfo' => 'Aýnala',
 'qbmyoptions' => 'Betterim',
 'qbspecialpages' => 'Arnaýı better',
 'faq' => 'Jïi qoýılğan sawaldar',
@@ -690,9 +689,6 @@ Keltirilgen sebebi: ''$2''.",
 
 Jüýege kirmesten {{SITENAME}} jobasın paýdalanwın jalğastıra alasız, nemese däl sol ne özge qatıswşı bop qaýta krwiñiz mümkin.
 Añğartpa: Keýbir better şolğışıñızdıñ bürkemesin tazartqanşa deýin äli de kirp qalğanıñızdaý körinwi mümkin.",
-'welcomecreation' => '== Qoş keldiñiz, $1! ==
-Jaña tirkelgiñiz jasaldı.
-{{SITENAME}} baptalımdarıñızdı özgertwin umıtpañız.',
 'yourname' => 'Qatıswşı atıñız:',
 'yourpassword' => 'Qupïya söziñiz:',
 'yourpasswordagain' => 'Qupïya sözdi qaýtalañız:',
@@ -1091,8 +1087,6 @@ Añğartpa: bağıttaw siltemelerin qoldanğanda bul bağan qaýta qoýıladı.'
 'search-interwiki-caption' => 'Bawırlas jobalar',
 'search-interwiki-default' => '$1 nätïje:',
 'search-interwiki-more' => '(köbirek)',
-'search-mwsuggest-enabled' => 'usınımdarmen',
-'search-mwsuggest-disabled' => 'usınımdarsız',
 'search-relatedarticle' => 'Qatıstı',
 'mwsuggest-disable' => 'AJAX usınımdarın öşir',
 'searchrelated' => 'qatıstı',
@@ -1719,11 +1713,7 @@ Bul bettiñ jäne baýlanıstı talqılaw betiniñ keleşektegi özgeristeri mı
 
 'enotif_mailer' => '{{SITENAME}} eskertw xat jiberw qızmeti',
 'enotif_reset' => 'Barlıq bet kelip-ketildi dep belgile',
-'enotif_newpagetext' => 'Mınaw jaña bet.',
 'enotif_impersonal_salutation' => '{{SITENAME}} qatıswşısı',
-'changed' => 'özgertti',
-'created' => 'bastadı',
-'enotif_subject' => '{{SITENAME}} jobasında $PAGEEDITOR $PAGETITLE atawlı betti $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Soñğı kelip-ketwiñizden beri bolğan özgerister üşin $1 degendi qarañız.',
 'enotif_lastdiff' => 'Osı özgeris üşin $1 degendi qarañız.',
 'enotif_anon_editor' => 'tirkelgisiz qatıswşı $1',
index bb90dec..d0a97cb 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kalaallisut (Kalaallisut)
+/** Kalaallisut (kalaallisut)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -58,70 +58,70 @@ $namespaceAliases = array(
 
 $messages = array(
 # Dates
-'sunday'        => 'Sapaat',
-'monday'        => 'Ataasinngorneq',
-'tuesday'       => 'Marlunngorneq',
-'wednesday'     => 'Pingasunngorneq',
-'thursday'      => 'Sisamanngorneq',
-'friday'        => 'Tallimanngorneq',
-'saturday'      => 'Arfininngorneq',
-'sun'           => 'Sap',
-'mon'           => 'Ata',
-'tue'           => 'Mar',
-'wed'           => 'Pin',
-'thu'           => 'Sis',
-'fri'           => 'Tal',
-'sat'           => 'Arf',
-'january'       => 'Jannuaari',
-'february'      => 'Februaari',
-'march'         => 'Martsi',
-'april'         => 'Apriili',
-'may_long'      => 'Maaji',
-'june'          => 'Juuni',
-'july'          => 'Juuli',
-'august'        => 'Aggusti',
-'september'     => 'Septemberi',
-'october'       => 'Oktoberi',
-'november'      => 'Novemberi',
-'december'      => 'Decemberi',
-'january-gen'   => 'Januaari',
-'february-gen'  => 'Februaari',
-'march-gen'     => 'Marsi',
-'april-gen'     => 'Apriili',
-'may-gen'       => 'Maaji',
-'june-gen'      => 'Juuni',
-'july-gen'      => 'Juuli',
-'august-gen'    => 'Aggusti',
+'sunday' => 'Sapaat',
+'monday' => 'Ataasinngorneq',
+'tuesday' => 'Marlunngorneq',
+'wednesday' => 'Pingasunngorneq',
+'thursday' => 'Sisamanngorneq',
+'friday' => 'Tallimanngorneq',
+'saturday' => 'Arfininngorneq',
+'sun' => 'Sap',
+'mon' => 'Ata',
+'tue' => 'Mar',
+'wed' => 'Pin',
+'thu' => 'Sis',
+'fri' => 'Tal',
+'sat' => 'Arf',
+'january' => 'Jannuaari',
+'february' => 'Februaari',
+'march' => 'Martsi',
+'april' => 'Apriili',
+'may_long' => 'Maaji',
+'june' => 'Juuni',
+'july' => 'Juuli',
+'august' => 'Aggusti',
+'september' => 'Septemberi',
+'october' => 'Oktoberi',
+'november' => 'Novemberi',
+'december' => 'Decemberi',
+'january-gen' => 'Januaari',
+'february-gen' => 'Februaari',
+'march-gen' => 'Marsi',
+'april-gen' => 'Apriili',
+'may-gen' => 'Maaji',
+'june-gen' => 'Juuni',
+'july-gen' => 'Juuli',
+'august-gen' => 'Aggusti',
 'september-gen' => 'Septembari',
-'october-gen'   => 'Oktobari',
-'november-gen'  => 'Novembari',
-'december-gen'  => 'Decembari',
-'jan'           => 'Jan',
-'feb'           => 'Feb',
-'mar'           => 'Mar',
-'apr'           => 'Apr',
-'may'           => 'Maaji',
-'jun'           => 'Jun',
-'jul'           => 'Jul',
-'aug'           => 'Aug',
-'sep'           => 'Sep',
-'oct'           => 'Okt',
-'nov'           => 'Nov',
-'dec'           => 'Dec',
+'october-gen' => 'Oktobari',
+'november-gen' => 'Novembari',
+'december-gen' => 'Decembari',
+'jan' => 'Jan',
+'feb' => 'Feb',
+'mar' => 'Mar',
+'apr' => 'Apr',
+'may' => 'Maaji',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Aug',
+'sep' => 'Sep',
+'oct' => 'Okt',
+'nov' => 'Nov',
+'dec' => 'Dec',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Sumut atassuseq|Sunut atassusit}}',
-'category_header'        => 'Quppernerit sumut atassusermi "$1"-miittut',
-'subcategories'          => 'Sunut atassuserni ataaniittut',
-'category-subcat-count'  => '{{PLURAL:$2|Una sumut atassuseq ataatsimik ataani ilaqarpoq.|Una sumut atassuseq imarivai {{PLURAL:$1|sumut atassuseq ataaniittoq|$1 sunut atassusit ataaniittut}}, $2-suni.}}',
+'pagecategories' => '{{PLURAL:$1|Sumut atassuseq|Sunut atassusit}}',
+'category_header' => 'Quppernerit sumut atassusermi "$1"-miittut',
+'subcategories' => 'Sunut atassuserni ataaniittut',
+'category-subcat-count' => '{{PLURAL:$2|Una sumut atassuseq ataatsimik ataani ilaqarpoq.|Una sumut atassuseq imarivai {{PLURAL:$1|sumut atassuseq ataaniittoq|$1 sunut atassusit ataaniittut}}, $2-suni.}}',
 'category-article-count' => 'Una sumut atassuseq imarivaa {{PLURAL:$2|qupperneq ataaseq ataaniittoq|{{PLURAL:$1|qupperneq ataaseq ataaniittoq|quppernerit ataaniittut $1-it}} $2-suni.}}',
 
-'about'         => 'Pillugu',
-'newwindow'     => '(nutaamut ammassaaq)',
-'cancel'        => 'Unitsiguk',
+'about' => 'Pillugu',
+'newwindow' => '(nutaamut ammassaaq)',
+'cancel' => 'Unitsiguk',
 'moredotdotdot' => 'Suli...',
-'mytalk'        => 'Oqalliffikka',
-'navigation'    => 'Sumiissusersiuut',
+'mytalk' => 'Oqalliffikka',
+'navigation' => 'Sumiissusersiuut',
 
 # Cologne Blue skin
 'qbfind' => 'Naniuk',
@@ -129,255 +129,253 @@ $messages = array(
 
 # Vector skin
 'vector-action-addsection' => 'Imm. nutaaq',
-'vector-action-move'       => 'Nuuguk',
-'vector-view-create'       => 'Pilersiguk',
-'vector-view-edit'         => 'Aaqqissoruk',
-'vector-view-history'      => 'Oqalutt.',
-'vector-view-view'         => 'Takuuk',
-'vector-view-viewsource'   => 'Toqqavia takuuk',
-
-'errorpagetitle'   => 'Kukkuneq',
-'returnto'         => '$1 -mut uterit',
-'tagline'          => '{{SITENAME}}-meersoq',
-'help'             => 'Ikiuutit',
-'search'           => 'Ujarlerit',
-'searchbutton'     => 'Ujarlerit',
-'go'               => 'Ikunnarit',
-'searcharticle'    => 'Tassunngarit',
-'history'          => 'Oqaluttuassartaa',
-'history_short'    => 'Oqaluttuassartaa',
+'vector-action-move' => 'Nuuguk',
+'vector-view-create' => 'Pilersiguk',
+'vector-view-edit' => 'Aaqqissoruk',
+'vector-view-history' => 'Oqalutt.',
+'vector-view-view' => 'Takuuk',
+'vector-view-viewsource' => 'Toqqavia takuuk',
+
+'errorpagetitle' => 'Kukkuneq',
+'returnto' => '$1 -mut uterit',
+'tagline' => '{{SITENAME}}-meersoq',
+'help' => 'Ikiuutit',
+'search' => 'Ujarlerit',
+'searchbutton' => 'Ujarlerit',
+'go' => 'Ikunnarit',
+'searcharticle' => 'Tassunngarit',
+'history' => 'Oqaluttuassartaa',
+'history_short' => 'Oqaluttuassartaa',
 'printableversion' => 'Naqikkuminartoq',
-'permalink'        => 'Ataavartumik innersuut',
-'edit'             => 'Aaqqissoruk',
-'create'           => 'Pilersiguk',
-'editthispage'     => 'Qupperneq aaqqissuuguk',
-'delete'           => 'Peeruk',
-'deletethispage'   => 'Qupperneq piiaruk',
-'protect'          => 'Illersoruk',
-'protect_change'   => 'allannguutit',
-'unprotect'        => 'Illersorunnaaruk',
-'newpage'          => 'Qupperneq nutaaq',
+'permalink' => 'Ataavartumik innersuut',
+'edit' => 'Aaqqissoruk',
+'create' => 'Pilersiguk',
+'editthispage' => 'Qupperneq aaqqissuuguk',
+'delete' => 'Peeruk',
+'deletethispage' => 'Qupperneq piiaruk',
+'protect' => 'Illersoruk',
+'protect_change' => 'allannguutit',
+'unprotect' => 'Illersorunnaaruk',
+'newpage' => 'Qupperneq nutaaq',
 'talkpagelinktext' => 'Oqallinneq',
-'personaltools'    => 'Namminermut sannatit',
-'talk'             => 'Oqallinneq',
-'views'            => 'Takutitat',
-'toolbox'          => 'Atortut',
-'otherlanguages'   => 'Oqaatsit allat',
-'redirectedfrom'   => '($1-mit nuunneq)',
-'lastmodifiedat'   => 'Una qupperneq kingullermik allanngortinneqarsimavoq $1 $2',
-'jumpto'           => 'Uunngarit:',
+'personaltools' => 'Namminermut sannatit',
+'talk' => 'Oqallinneq',
+'views' => 'Takutitat',
+'toolbox' => 'Atortut',
+'otherlanguages' => 'Oqaatsit allat',
+'redirectedfrom' => '($1-mit nuunneq)',
+'lastmodifiedat' => 'Una qupperneq kingullermik allanngortinneqarsimavoq $1 $2',
+'jumpto' => 'Uunngarit:',
 'jumptonavigation' => 'sumiissusersiuut',
-'jumptosearch'     => 'ujarlerit',
+'jumptosearch' => 'ujarlerit',
 
 # 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}} pillugu',
-'aboutpage'            => 'Project:Pillugu',
-'currentevents'        => 'Maannakkut pisut',
-'disclaimers'          => 'Aalajangersagaq',
-'edithelp'             => 'Ikiuutit',
-'edithelppage'         => 'Help:Aaqqissuussineq',
-'helppage'             => 'Help:Ikiuutit',
-'mainpage'             => 'Saqqaa',
+'aboutsite' => '{{SITENAME}} pillugu',
+'aboutpage' => 'Project:Pillugu',
+'currentevents' => 'Maannakkut pisut',
+'disclaimers' => 'Aalajangersagaq',
+'edithelp' => 'Ikiuutit',
+'edithelppage' => 'Help:Aaqqissuussineq',
+'helppage' => 'Help:Ikiuutit',
+'mainpage' => 'Saqqaa',
 'mainpage-description' => 'Saqqaa',
-'portal'               => 'Allattartup saqqaa',
-'privacy'              => 'Namminermut paasissutissat',
+'portal' => 'Allattartup saqqaa',
+'privacy' => 'Namminermut paasissutissat',
 
-'retrievedfrom'       => 'Uannga aaneqartoq "$1"',
-'youhavenewmessages'  => '<!-- This sentence shall be empty because of kl grammar. --> $1 ($2)',
-'newmessageslink'     => 'Allagarsivutit',
+'retrievedfrom' => 'Uannga aaneqartoq "$1"',
+'youhavenewmessages' => '<!-- This sentence shall be empty because of kl grammar. --> $1 ($2)',
+'newmessageslink' => 'Allagarsivutit',
 'newmessagesdifflink' => 'allannguutini kingullerniit',
-'editsection'         => 'aaqqissoruk',
-'editold'             => 'aaqqissoruk',
-'viewsourceold'       => 'toqqavia takuuk',
-'editlink'            => 'aaqqissoruk',
-'editsectionhint'     => 'Aaqqissuuguk immikkoortoq: $1',
-'toc'                 => 'Imarisai',
-'showtoc'             => 'saqqummeruk',
-'hidetoc'             => 'toqqoruk',
-'site-rss-feed'       => '$1 RSS Feed',
-'site-atom-feed'      => '$1 Atom Feed',
-'page-rss-feed'       => '"$1" RSS Feed',
-'red-link-title'      => '$1 (Qupperneq suli allaffigineqanngilaq)',
+'editsection' => 'aaqqissoruk',
+'editold' => 'aaqqissoruk',
+'viewsourceold' => 'toqqavia takuuk',
+'editlink' => 'aaqqissoruk',
+'editsectionhint' => 'Aaqqissuuguk immikkoortoq: $1',
+'toc' => 'Imarisai',
+'showtoc' => 'saqqummeruk',
+'hidetoc' => 'toqqoruk',
+'site-rss-feed' => '$1 RSS Feed',
+'site-atom-feed' => '$1 Atom Feed',
+'page-rss-feed' => '"$1" RSS Feed',
+'red-link-title' => '$1 (Qupperneq suli allaffigineqanngilaq)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Allaaserisaq',
-'nstab-user'     => 'Atuisup quppernera',
-'nstab-special'  => 'Immikkut',
-'nstab-project'  => 'Pillugu',
-'nstab-image'    => 'Assiliaq',
+'nstab-main' => 'Allaaserisaq',
+'nstab-user' => 'Atuisup quppernera',
+'nstab-special' => 'Immikkut',
+'nstab-project' => 'Pillugu',
+'nstab-image' => 'Assiliaq',
 'nstab-template' => 'Ilisserut',
-'nstab-help'     => 'Ikiuutit',
+'nstab-help' => 'Ikiuutit',
 'nstab-category' => 'Sumut atassuseq',
 
 # General errors
-'viewsource'        => 'Toqqavia takuuk',
+'viewsource' => 'Toqqavia takuuk',
 'protectedpagetext' => 'Una qupperneq allaffigineqarnissamut illersugaavoq.',
-'viewsourcetext'    => 'Qupperneq takusinnaavat aamma sanarfia kopeersinnaavat:',
+'viewsourcetext' => 'Qupperneq takusinnaavat aamma sanarfia kopeersinnaavat:',
 
 # Login and logout pages
-'logouttext'                 => "'''Maanna anivutit.'''
+'logouttext' => "'''Maanna anivutit.'''
 
 {{SITENAME}} atorlugu ingerlaqqissinnaavutit kinaanerit isertorlugu, iseqqissinnaavutilluunniit taamatut isissuteqarlutit imalt. allat iserfigisinnaanngorpaat.",
-'yourname'                   => 'Atuisutut atit',
-'yourpassword'               => 'Isissutissaq:',
-'yourpasswordagain'          => 'Isissutissaq allaqqiguk',
-'remembermypassword'         => 'Iserfiga tullissaanut eqqaamalara (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'                      => 'Iserit',
-'nav-login-createaccount'    => 'Konto-mik pilersitsigit imalt. iserit',
-'loginprompt'                => 'Pisariaqassaaq cookies-itit atussallugit {{SITENAME}} -mut isissaguit.',
-'userlogin'                  => 'Kontomik pilersitsigit / iserit',
-'logout'                     => 'Anigit',
-'userlogout'                 => 'Anigit',
-'nologin'                    => "Kontomik peqanngilatit? '''$1'''.",
-'nologinlink'                => 'Kontomik pilersitsigit',
-'createaccount'              => 'Kontomik nutaamik pilersitsigit',
-'gotaccount'                 => "Kontomik peqareerpit? '''$1'''.",
-'gotaccountlink'             => 'Iserit',
-'createaccountmail'          => 'e-mail-ikkut',
-'badretype'                  => 'Isissutissat allanneqartut assigiinngillat.',
-'userexists'                 => 'Atuisup atia atorneqareerpoq. Allamik qinersigit.',
-'loginerror'                 => 'Iserniarnerlunneq',
-'loginsuccesstitle'          => 'Maanna isersimalerputit',
-'loginsuccess'               => 'Maanna {{SITENAME}} -mut isersimalerputit "$1" -itut taaguuserlutit.',
-'wrongpassword'              => 'Isissutissaq kukkusumik allanneqarsimavoq. Misileqqiuk.',
-'mailmypassword'             => 'E-mail-ikkut isissutissaq nutaaq nassiuguk',
+'yourname' => 'Atuisutut atit',
+'yourpassword' => 'Isissutissaq:',
+'yourpasswordagain' => 'Isissutissaq allaqqiguk',
+'remembermypassword' => 'Iserfiga tullissaanut eqqaamalara (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'login' => 'Iserit',
+'nav-login-createaccount' => 'Konto-mik pilersitsigit imalt. iserit',
+'loginprompt' => 'Pisariaqassaaq cookies-itit atussallugit {{SITENAME}} -mut isissaguit.',
+'userlogin' => 'Kontomik pilersitsigit / iserit',
+'logout' => 'Anigit',
+'userlogout' => 'Anigit',
+'nologin' => "Kontomik peqanngilatit? '''$1'''.",
+'nologinlink' => 'Kontomik pilersitsigit',
+'createaccount' => 'Kontomik nutaamik pilersitsigit',
+'gotaccount' => "Kontomik peqareerpit? '''$1'''.",
+'gotaccountlink' => 'Iserit',
+'createaccountmail' => 'e-mail-ikkut',
+'badretype' => 'Isissutissat allanneqartut assigiinngillat.',
+'userexists' => 'Atuisup atia atorneqareerpoq. Allamik qinersigit.',
+'loginerror' => 'Iserniarnerlunneq',
+'loginsuccesstitle' => 'Maanna isersimalerputit',
+'loginsuccess' => 'Maanna {{SITENAME}} -mut isersimalerputit "$1" -itut taaguuserlutit.',
+'wrongpassword' => 'Isissutissaq kukkusumik allanneqarsimavoq. Misileqqiuk.',
+'mailmypassword' => 'E-mail-ikkut isissutissaq nutaaq nassiuguk',
 'acct_creation_throttle_hit' => 'Konto-mik pilersitsereersimagavit pilersitseqqissinnaanngilatit, IP-adressit malillugu.
 Taamaattumik maannakkorpiaq kontomik pilersitsisinnaanngilatit.',
 
 # Change password dialog
 'oldpassword' => 'Isissutissatoqaq:',
 'newpassword' => 'Isissutissaq nutaaq:',
-'retypenew'   => 'Isissutissaq nutaaq allaqqiuk',
+'retypenew' => 'Isissutissaq nutaaq allaqqiuk',
 
 # Edit pages
-'summary'                          => 'Allaaserinera:',
-'subject'                          => 'Pineqartoq/qulequtaq:',
-'minoredit'                        => 'Annikitsumik allannguutaavoq',
-'watchthis'                        => 'Allaaserisaq ersersimatiguk',
-'savearticle'                      => 'Toqqoruk',
-'preview'                          => 'Isikkua',
-'showpreview'                      => 'Isikkua takuuk',
-'showdiff'                         => 'Allannguutit',
-'anoneditwarning'                  => "'''Mianersoqqussut:''' Isersimanak sulilerputit.
+'summary' => 'Allaaserinera:',
+'subject' => 'Pineqartoq/qulequtaq:',
+'minoredit' => 'Annikitsumik allannguutaavoq',
+'watchthis' => 'Allaaserisaq ersersimatiguk',
+'savearticle' => 'Toqqoruk',
+'preview' => 'Isikkua',
+'showpreview' => 'Isikkua takuuk',
+'showdiff' => 'Allannguutit',
+'anoneditwarning' => "'''Mianersoqqussut:''' Isersimanak sulilerputit.
 IP adressit nuisassaaq massuma quppernerup oqaluttuassartaani.",
-'accmailtitle'                     => 'Password-i nassiunneqarsimavoq.',
-'accmailtext'                      => 'Password-i "$1" $2-mut nassiunneqarsimavoq.',
-'newarticle'                       => '(Nuutaq)',
-'newarticletext'                   => "Maanga innersuunneqarsimavutit quppernermut suli pilersinneqarsimanngitsumut.
+'accmailtitle' => 'Password-i nassiunneqarsimavoq.',
+'accmailtext' => 'Password-i "$1" $2-mut nassiunneqarsimavoq.',
+'newarticle' => '(Nuutaq)',
+'newarticletext' => "Maanga innersuunneqarsimavutit quppernermut suli pilersinneqarsimanngitsumut.
 Qupperneq pilersissagukku, boks-ip iluani allagit (takuuk [[{{MediaWiki:Helppage}}|ikiuutit]] paasissutissaanerusut).
 Maanngarsimaguit kukkusumik, toortaat '''utimut''' tooruk.",
-'anontalkpagetext'                 => "---- ''Manna tassaavoq oqalliffik atuisumit anonym-iusumeersumit, konto-mik pilersitsisimanngitsumik imalt. atorneq ajugaanik.
+'anontalkpagetext' => "---- ''Manna tassaavoq oqalliffik atuisumit anonym-iusumeersumit, konto-mik pilersitsisimanngitsumik imalt. atorneq ajugaanik.
 Taamaattumik IP-adressia kinaanerattut atortariaqassavarput.
 IP-adressi pigineqarsinnaavoq atuisunit arlalinnit.
 Atuisuuguit anonym-iusoq, isumaqarlutillu soqutiginngisannik oqaaseqarfigineqarlutit, qinnuigivatsigit [[Special:UserLogin/signup|atuisutut pilersitsissallutit]] aamma [[Special:UserLogin|iserlutit]], taava siunissami paarlattoornernik atuisuni arlalinni pinaveersaartoqarniassammat.''",
-'noarticletext'                    => 'Maannamut una qupperneq allaffigineqanngilaq.
+'noarticletext' => 'Maannamut una qupperneq allaffigineqanngilaq.
 Taamatut oqaasilimmik quppernerni allani [[Special:Search/{{PAGENAME}}|ujaasisinnaavutit]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} log-ini ujaasisinnavutillu] imaluunniit [{{fullurl:{{FULLPAGENAME}}|action=edit}} qupperneq pilersissinnaavat]</span>.',
-'previewnote'                      => 'Eqqaamallugu isikkua takutinneqaannarpoq, toqqorneqanngilaq suli!',
-'editing'                          => 'Aaqqissorpaa $1',
-'editingsection'                   => 'Aaqqissorpaa $1 (immikkoortoq)',
-'editingcomment'                   => 'Aaqqissorpaa $1 (immikkoortoq nutaaq)',
-'yourtext'                         => 'Allatat',
-'editingold'                       => "'''Mianersoqqussut: Qupperneq pisoqaanerusoq aaqqissuutilerpat.'''
+'previewnote' => 'Eqqaamallugu isikkua takutinneqaannarpoq, toqqorneqanngilaq suli!',
+'editing' => 'Aaqqissorpaa $1',
+'editingsection' => 'Aaqqissorpaa $1 (immikkoortoq)',
+'editingcomment' => 'Aaqqissorpaa $1 (immikkoortoq nutaaq)',
+'yourtext' => 'Allatat',
+'editingold' => "'''Mianersoqqussut: Qupperneq pisoqaanerusoq aaqqissuutilerpat.'''
 Toqqorukku quppernerup taamaannera taarserneqassaaq.",
-'protectedpagewarning'             => "'''Mianersoqqussut: Una qupperneq illersugaavoq, administratorit kisimik aaqqissorsinnaavaat.'''",
-'semiprotectedpagewarning'         => "'''Malugiuk:''' Qupperneq parnaaqqavoq, atuisutut nalunaarsimasut kisimik allanngortitersinnaavaat.",
-'templatesused'                    => '{{PLURAL:$1|Ilisserut|Ilisserutit}} quppernermi atorneqartoq/tut:',
+'protectedpagewarning' => "'''Mianersoqqussut: Una qupperneq illersugaavoq, administratorit kisimik aaqqissorsinnaavaat.'''",
+'semiprotectedpagewarning' => "'''Malugiuk:''' Qupperneq parnaaqqavoq, atuisutut nalunaarsimasut kisimik allanngortitersinnaavaat.",
+'templatesused' => '{{PLURAL:$1|Ilisserut|Ilisserutit}} quppernermi atorneqartoq/tut:',
 'permissionserrorstext-withaction' => 'Pisinnaatitaaffeqanngilatit $2 atussallugu, {{PLURAL:$1|peqqutigalugu|peqqutigalugit}}:',
-'moveddeleted-notice'              => 'Una qupperneq peerneqarsimavoq.
+'moveddeleted-notice' => 'Una qupperneq peerneqarsimavoq.
 Peersinermut nuutsinermullu nalunaarsuutit ataani takuneqarsinnaapput.',
 
 # History pages
-'currentrev'             => 'Maanna taamaannera',
-'currentrev-asof'        => 'Maanna taamaannera $1-meersoq',
-'revisionasof'           => 'Taamaannera $1-meersoq',
-'previousrevision'       => '← Pisoqaaneq',
-'nextrevision'           => 'Nutaaneq →',
-'currentrevisionlink'    => 'Massakkuunera takuuk',
-'cur'                    => 'maanna',
-'last'                   => 'siulia',
-'page_first'             => 'siulliit',
-'page_last'              => 'kingulliit',
-'histlegend'             => 'Nassuiaat: (maanna) = assigiinngissut maanna inneranut, (siulia) = assigiinngissut siulianut, M = annikitsumik allannguut',
+'currentrev' => 'Maanna taamaannera',
+'currentrev-asof' => 'Maanna taamaannera $1-meersoq',
+'revisionasof' => 'Taamaannera $1-meersoq',
+'previousrevision' => '← Pisoqaaneq',
+'nextrevision' => 'Nutaaneq →',
+'currentrevisionlink' => 'Massakkuunera takuuk',
+'cur' => 'maanna',
+'last' => 'siulia',
+'page_first' => 'siulliit',
+'page_last' => 'kingulliit',
+'histlegend' => 'Nassuiaat: (maanna) = assigiinngissut maanna inneranut, (siulia) = assigiinngissut siulianut, M = annikitsumik allannguut',
 'history-fieldset-title' => 'Oqaluttuassartaani qupperaagit',
-'histfirst'              => 'Pisoqaaneq',
-'histlast'               => 'Nutaaneq',
+'histfirst' => 'Pisoqaaneq',
+'histlast' => 'Nutaaneq',
 
 # Diffs
-'history-title'           => '"$1"-p oqaluttuassartaa',
+'history-title' => '"$1"-p oqaluttuassartaa',
 'compareselectedversions' => 'Qinikkat nalilersukkit',
-'editundo'                => 'peeruk',
+'editundo' => 'peeruk',
 
 # Search results
-'searchresults'             => 'Ujaasinermi inernerit',
-'searchresults-title'       => 'Uuma ujarnera "$1"',
-'prevn'                     => 'siulii {{PLURAL:$1|$1}}',
-'nextn'                     => 'tullii {{PLURAL:$1|$1}}',
-'viewprevnext'              => 'Takuuk ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-exists'         => "'''Qupperneqarpoq \"[[:\$1]]\" -mik atilimmik maani wikimi'''",
-'searchmenu-new'            => "'''Qupperneq [[:$1]] pilersiguk maani wikimi'''",
-'searchhelp-url'            => 'Help:Ikiuutit',
-'searchprofile-articles'    => 'Imarisai',
-'searchprofile-project'     => 'Ikiuutit suliniutillu imaat',
-'searchprofile-everything'  => 'Tamarmik',
-'searchprofile-advanced'    => 'Ujaasiffik anneq',
-'search-result-size'        => '$1 ({{PLURAL:$2|oqaaseq|$2 oqaatsit}})',
-'search-redirect'           => '(nuunneq $1)',
-'search-suggest'            => 'Una piviuk: $1',
-'search-mwsuggest-enabled'  => 'siunnersuuserlugu',
-'search-mwsuggest-disabled' => 'siunnersuusernagu',
-'showingresultsheader'      => "{{PLURAL:$5|Inernera '''$1''' '''$3'''|Inerneri '''$1 - $2''' '''$3'''}}-suni '''$4'''-mut",
-'search-nonefound'          => 'Ujaasineq inerneqanngilaq',
-'powersearch'               => 'Ujarlerit',
+'searchresults' => 'Ujaasinermi inernerit',
+'searchresults-title' => 'Uuma ujarnera "$1"',
+'prevn' => 'siulii {{PLURAL:$1|$1}}',
+'nextn' => 'tullii {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Takuuk ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Qupperneqarpoq \"[[:\$1]]\" -mik atilimmik maani wikimi'''",
+'searchmenu-new' => "'''Qupperneq [[:$1]] pilersiguk maani wikimi'''",
+'searchhelp-url' => 'Help:Ikiuutit',
+'searchprofile-articles' => 'Imarisai',
+'searchprofile-project' => 'Ikiuutit suliniutillu imaat',
+'searchprofile-everything' => 'Tamarmik',
+'searchprofile-advanced' => 'Ujaasiffik anneq',
+'search-result-size' => '$1 ({{PLURAL:$2|oqaaseq|$2 oqaatsit}})',
+'search-redirect' => '(nuunneq $1)',
+'search-suggest' => 'Una piviuk: $1',
+'showingresultsheader' => "{{PLURAL:$5|Inernera '''$1''' '''$3'''|Inerneri '''$1 - $2''' '''$3'''}}-suni '''$4'''-mut",
+'search-nonefound' => 'Ujaasineq inerneqanngilaq',
+'powersearch' => 'Ujarlerit',
 
 # Preferences page
 'mypreferences' => 'Inissiffissat',
-'prefs-rc'      => 'Allannguutit kingulliit',
-'saveprefs'     => 'Toqqukkit',
-'yourlanguage'  => 'Oqaatsit:',
+'prefs-rc' => 'Allannguutit kingulliit',
+'saveprefs' => 'Toqqukkit',
+'yourlanguage' => 'Oqaatsit:',
 
 # Groups
 'group-sysop' => 'Administratorit',
 
 # Recent changes
-'recentchanges'               => 'Allannguutit kingulliit',
-'recentchanges-legend'        => 'Inissisimaffiit allannguutini kingullerni',
-'recentchangestext'           => "Uani quppernermi '''{{SITENAME}}'''-mi allannguutit kingulliit malinnaavigisinnaavatit.",
+'recentchanges' => 'Allannguutit kingulliit',
+'recentchanges-legend' => 'Inissisimaffiit allannguutini kingullerni',
+'recentchanges-summary' => "Uani quppernermi '''{{SITENAME}}'''-mi allannguutit kingulliit malinnaavigisinnaavatit.",
 'recentchanges-label-newpage' => 'Tassaavoq qupperneq nutaaq',
-'recentchanges-label-minor'   => 'Tassaavoq allannguut annikitsoq',
-'recentchanges-label-bot'     => 'Bot-ip allannguutaa',
-'rclistfrom'                  => 'Allannguutit kingulliit takukkit $1 -nngaanniit',
-'rcshowhideminor'             => '$1 allannguutit annikitsut',
-'rcshowhidebots'              => '$1 robottit',
-'rcshowhideliu'               => '$1 atuisut nalunaarsimasut',
-'rcshowhideanons'             => '$1 atuisut anonymejusut',
-'rcshowhidepatr'              => '$1 allannguutit misissorneqarsimasut',
-'rcshowhidemine'              => '$1 nammineq tapit',
-'rclinks'                     => 'Takutikkit $1 -it allannguutit kingulliit ulluni kingullerni $2 -ni<br />$3',
-'diff'                        => 'assigiinng',
-'hist'                        => 'oqalutt',
-'hide'                        => 'Assequt',
-'show'                        => 'Saqqummiuk',
-'minoreditletter'             => 'm',
-'newpageletter'               => 'N',
-'boteditletter'               => 'b',
+'recentchanges-label-minor' => 'Tassaavoq allannguut annikitsoq',
+'recentchanges-label-bot' => 'Bot-ip allannguutaa',
+'rclistfrom' => 'Allannguutit kingulliit takukkit $1 -nngaanniit',
+'rcshowhideminor' => '$1 allannguutit annikitsut',
+'rcshowhidebots' => '$1 robottit',
+'rcshowhideliu' => '$1 atuisut nalunaarsimasut',
+'rcshowhideanons' => '$1 atuisut anonymejusut',
+'rcshowhidepatr' => '$1 allannguutit misissorneqarsimasut',
+'rcshowhidemine' => '$1 nammineq tapit',
+'rclinks' => 'Takutikkit $1 -it allannguutit kingulliit ulluni kingullerni $2 -ni<br />$3',
+'diff' => 'assigiinng',
+'hist' => 'oqalutt',
+'hide' => 'Assequt',
+'show' => 'Saqqummiuk',
+'minoreditletter' => 'm',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Allannguutit naleqqiussat',
-'recentchangeslinked-feed'    => 'Allannguutit naleqqiussat',
+'recentchangeslinked' => 'Allannguutit naleqqiussat',
+'recentchangeslinked-feed' => 'Allannguutit naleqqiussat',
 'recentchangeslinked-toolbox' => 'Allannguutit naleqqiussat',
 
 # Upload
-'upload'        => 'Fiilimik ilisigit',
+'upload' => 'Fiilimik ilisigit',
 'uploadedimage' => 'ilivaa "[[$1]]"',
 
 # Special:ListFiles
 'listfiles_user' => 'Atuisoq',
 
 # File description page
-'file-anchor-link'  => 'Assiliaq',
+'file-anchor-link' => 'Assiliaq',
 'filehist-datetime' => 'Ulloq/Piffissaq',
-'filehist-user'     => 'Atuisoq',
-'imagelinks'        => 'Innersuutit',
+'filehist-user' => 'Atuisoq',
+'imagelinks' => 'Innersuutit',
 
 # MIME search
 'mimesearch' => 'MIME ujaarlerit',
@@ -389,8 +387,8 @@ Peersinermut nuutsinermullu nalunaarsuutit ataani takuneqarsinnaapput.',
 'statistics' => 'Kisitsisinngorlugit paasissutissat',
 
 # Miscellaneous special pages
-'newpages'      => 'Quppernerit nutaat',
-'move'          => 'Nuuguk',
+'newpages' => 'Quppernerit nutaat',
+'move' => 'Nuuguk',
 'pager-newer-n' => '{{PLURAL:$1|nutaaneq 1|nutaanerit $1}}',
 'pager-older-n' => '{{PLURAL:$1|pisoqaaneq 1|pisoqaanerit $1}}',
 
@@ -401,146 +399,146 @@ Peersinermut nuutsinermullu nalunaarsuutit ataani takuneqarsinnaapput.',
 'specialloguserlabel' => 'Atuisoq:',
 
 # Special:AllPages
-'allarticles'    => 'Quppernerit tamarmik',
-'allpagesprev'   => 'Siulii',
-'allpagesnext'   => 'Tullii',
+'allarticles' => 'Quppernerit tamarmik',
+'allpagesprev' => 'Siulii',
+'allpagesnext' => 'Tullii',
 'allpagessubmit' => 'Tassunngarit',
 
 # Special:Categories
-'categories'         => 'Sunut atassusit',
+'categories' => 'Sunut atassusit',
 'categoriespagetext' => 'Uku {{PLURAL:$1|sumut atassuseq|sunut atassusit}} imarivai quppernerit media-lluunniit.
 [[Special:UnusedCategories|Sunut atassusit]] atorneqanngitsut maani ilaanngillat.
 Aamma takuuk [[Special:WantedCategories|sunut atassusinut kissaatigineqartut]].',
-'categoriesfrom'     => 'Takuuk qanoq aallartiffianeersumiit:',
+'categoriesfrom' => 'Takuuk qanoq aallartiffianeersumiit:',
 
 # Special:LinkSearch
 'linksearch-ok' => 'Ujaruk',
 
 # Watchlist
-'watchlist'      => 'Ersersimasut',
-'mywatchlist'    => 'Nuisatiffikka',
+'watchlist' => 'Ersersimasut',
+'mywatchlist' => 'Nuisatiffikka',
 'addedwatchtext' => 'Una qupperneq "[[:$1]]" ersersimatitannut ilanngunneqarpoq. Siunissami allannguutit ilinnut malugeqquneqartassapput aamma [[Special:RecentChanges|allannguutini kingullerni]] issusuumik allanneqartuusassallutik. Ersersimatikkusunngikkukku [[Special:Watchlist|piiginnassavat]] ersersimasuutitanni.',
-'watch'          => 'Ersilli',
-'watchthispage'  => 'Qupperneq ersersimatiguk',
-'unwatch'        => 'Ersitsinnagu',
+'watch' => 'Ersilli',
+'watchthispage' => 'Qupperneq ersersimatiguk',
+'unwatch' => 'Ersitsinnagu',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Saqqumitiguk',
+'watching' => 'Saqqumitiguk',
 'unwatching' => 'Saqquminera peeruk',
 
 # Delete
-'excontent'       => "imarivaa: '$1'",
+'excontent' => "imarivaa: '$1'",
 'excontentauthor' => "imarivaa: '$1' (allattutuaavorlu '[[Special:Contributions/$2|$2]]')",
-'delete-confirm'  => 'Peeruk "$1"',
-'actioncomplete'  => 'Naammassivoq',
-'deletedtext'     => '"$1" peerpoq. Takukkit $2 peerneqarsimasut kingulliit.',
+'delete-confirm' => 'Peeruk "$1"',
+'actioncomplete' => 'Naammassivoq',
+'deletedtext' => '"$1" peerpoq. Takukkit $2 peerneqarsimasut kingulliit.',
 
 # Rollback
 'revertpage' => 'Inisseqqiineq [[User:$1|$1]]-meersoq, peerneqarpoq [[Special:Contributions/$2|$2]] ([[User talk:$2|diskussion]])-meersoq',
 
 # Protect
-'prot_1movedto2'         => '[[$1]]-i nuunneqarsimavoq [[$2]]-mut',
+'prot_1movedto2' => '[[$1]]-i nuunneqarsimavoq [[$2]]-mut',
 'protect-expiry-options' => '1 tiimi:1 hour,ulloq 1:1 day,sap akunn 1:1 week,sap akunn 2:2 weeks,qaammat 1:1 month,qaammatit 3:3 months,qaammatit 6:6 months,ukioq 1:1 year,killeqanngitsoq:infinite',
 
 # Undelete
-'undeletebtn'            => 'Inisseqqiguk',
+'undeletebtn' => 'Inisseqqiguk',
 'undelete-search-submit' => 'Ujarlerit',
 
 # Namespace form on various pages
-'namespace'      => 'Quppernerup ilusia:',
-'invert'         => 'Quppernerup ilusia qinernagu',
+'namespace' => 'Quppernerup ilusia:',
+'invert' => 'Quppernerup ilusia qinernagu',
 'blanknamespace' => '(Pingaarneq)',
 
 # Contributions
 'contributions' => 'Atuisup tapii',
-'mycontris'     => 'Tapikka',
-'contribsub2'   => '$1-meersoq ($2)',
-'uctop'         => '(kingulleq)',
-'month'         => 'Qaammat:',
-'year'          => 'Ukioq:',
-
-'sp-contributions-newbies'  => 'Atuisut nutaaginnaat takukkit',
-'sp-contributions-talk'     => 'oqallinneq',
-'sp-contributions-search'   => 'Tapiisunik ujaasineq',
+'mycontris' => 'Tapikka',
+'contribsub2' => '$1-meersoq ($2)',
+'uctop' => '(kingulleq)',
+'month' => 'Qaammat:',
+'year' => 'Ukioq:',
+
+'sp-contributions-newbies' => 'Atuisut nutaaginnaat takukkit',
+'sp-contributions-talk' => 'oqallinneq',
+'sp-contributions-search' => 'Tapiisunik ujaasineq',
 'sp-contributions-username' => 'IP adresse imalt. atuisoq:',
-'sp-contributions-submit'   => 'Ujaruk',
+'sp-contributions-submit' => 'Ujaruk',
 
 # What links here
-'whatlinkshere'      => 'Suna maangamut innersuussisoq',
+'whatlinkshere' => 'Suna maangamut innersuussisoq',
 'whatlinkshere-prev' => '{{PLURAL:$1|siulia|siulii $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|tullia|tullii $1}}',
 
 # Block/unblock
-'blockip'            => 'Atuisoq asseruk',
-'blockip-legend'     => 'Atuisoq asseruk',
+'blockip' => 'Atuisoq asseruk',
+'blockip-legend' => 'Atuisoq asseruk',
 'ipadressorusername' => 'IP adresse imalt. atuisoq:',
-'ipboptions'         => '2 tiimit:2 hours,ulloq 1:1 day,ullut 3:3 days,sap akunn 1:1 week,sap akunn 2:2 weeks,qaammat 1:1 month,qaammatit 3:3 months,qaammatit 6:6 months,ukioq 1:1 year,killeqanngitsoq:infinite',
+'ipboptions' => '2 tiimit:2 hours,ulloq 1:1 day,ullut 3:3 days,sap akunn 1:1 week,sap akunn 2:2 weeks,qaammat 1:1 month,qaammatit 3:3 months,qaammatit 6:6 months,ukioq 1:1 year,killeqanngitsoq:infinite',
 'ipblocklist-submit' => 'Ujarlerit',
-'infiniteblock'      => 'killeqanngitsoq',
-'expiringblock'      => 'atorunnaassaaq $1 $2-nngoruni',
-'blocklink'          => 'assersoruk',
-'contribslink'       => 'tapikkat',
-'blocklogentry'      => 'asserpaa [[$1]] $2-mik sivissusilimmik $3',
+'infiniteblock' => 'killeqanngitsoq',
+'expiringblock' => 'atorunnaassaaq $1 $2-nngoruni',
+'blocklink' => 'assersoruk',
+'contribslink' => 'tapikkat',
+'blocklogentry' => 'asserpaa [[$1]] $2-mik sivissusilimmik $3',
 
 # Move page
-'movearticle'    => 'Qupperneq nuuguk',
-'move-watch'     => 'Qupperneq ersersimatiguk',
-'movepagebtn'    => 'Qupperneq nuuguk',
-'pagemovedsub'   => 'Nuunnera iluatsippoq',
+'movearticle' => 'Qupperneq nuuguk',
+'move-watch' => 'Qupperneq ersersimatiguk',
+'movepagebtn' => 'Qupperneq nuuguk',
+'pagemovedsub' => 'Nuunnera iluatsippoq',
 'movepage-moved' => 'Qupperneq \'\'\'"$1" uunga nuuppoq "$2"\'\'\'',
 
 # Namespace 8 related
-'allmessages-language'      => 'Oqaatsit:',
+'allmessages-language' => 'Oqaatsit:',
 'allmessages-filter-submit' => 'Takuuk',
 
 # Thumbnails
 'thumbnail-more' => 'Allisiguk',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'            => 'Atuisutut quppernerit',
-'tooltip-pt-mytalk'              => 'Oqalliffiit',
-'tooltip-pt-preferences'         => 'Inissiinikka',
-'tooltip-pt-mycontris'           => 'Tapikkatit',
-'tooltip-pt-login'               => 'Iseqquneqaraluarputit, pitsaanerussagaluarpoq',
-'tooltip-pt-logout'              => 'Aniffik',
-'tooltip-ca-talk'                => 'Quppernerup imaanik oqallinneq',
-'tooltip-ca-edit'                => 'Allanngortiterisinnaavutit. Isikkua takulaariuk',
-'tooltip-ca-history'             => 'Quppernerup siulii',
-'tooltip-ca-move'                => 'Qupperneq nuuguk',
-'tooltip-ca-watch'               => 'Saqqumitiguk',
-'tooltip-search'                 => 'Ujaarlerit {{SITENAME}}',
-'tooltip-search-go'              => 'Tassunngarit nassaassappat',
-'tooltip-search-fulltext'        => 'Taanna ujaruk',
-'tooltip-n-mainpage'             => 'Saqqaa iseruk',
+'tooltip-pt-userpage' => 'Atuisutut quppernerit',
+'tooltip-pt-mytalk' => 'Oqalliffiit',
+'tooltip-pt-preferences' => 'Inissiinikka',
+'tooltip-pt-mycontris' => 'Tapikkatit',
+'tooltip-pt-login' => 'Iseqquneqaraluarputit, pitsaanerussagaluarpoq',
+'tooltip-pt-logout' => 'Aniffik',
+'tooltip-ca-talk' => 'Quppernerup imaanik oqallinneq',
+'tooltip-ca-edit' => 'Allanngortiterisinnaavutit. Isikkua takulaariuk',
+'tooltip-ca-history' => 'Quppernerup siulii',
+'tooltip-ca-move' => 'Qupperneq nuuguk',
+'tooltip-ca-watch' => 'Saqqumitiguk',
+'tooltip-search' => 'Ujaarlerit {{SITENAME}}',
+'tooltip-search-go' => 'Tassunngarit nassaassappat',
+'tooltip-search-fulltext' => 'Taanna ujaruk',
+'tooltip-n-mainpage' => 'Saqqaa iseruk',
 'tooltip-n-mainpage-description' => 'Saqqaa iseruk',
-'tooltip-n-portal'               => 'Suliaq, ilitsersuut, nassaassaasinnaasullu',
-'tooltip-n-currentevents'        => 'Maannakkut pisut tunuliaqutai takukkit',
-'tooltip-n-recentchanges'        => 'Wikimi allannguutit kingulliit',
-'tooltip-n-randompage'           => 'Allaaserisamukarit',
-'tooltip-n-help'                 => 'Qanoq iliussaanga ...',
-'tooltip-t-whatlinkshere'        => 'Innersuussami saqqummiussat',
-'tooltip-t-recentchangeslinked'  => 'Massuma quppernerani allannguutit kingulliit',
-'tooltip-t-upload'               => 'Assinik mediafiilinilluunniit ilisigit',
-'tooltip-t-specialpages'         => 'Quppernerit immikkut ittut nassaassaasinnaasut',
-'tooltip-t-print'                => 'Quppernerup naqikkuminarnera',
-'tooltip-t-permalink'            => 'Massuma quppernerup taamaaqqaarnera',
-'tooltip-ca-nstab-main'          => 'Imarisaa takuuk',
-'tooltip-save'                   => 'Allannguutitit toqqukkit',
-'tooltip-preview'                => 'Isikkua takuuk, toqqortinnaguk atortaruk!',
+'tooltip-n-portal' => 'Suliaq, ilitsersuut, nassaassaasinnaasullu',
+'tooltip-n-currentevents' => 'Maannakkut pisut tunuliaqutai takukkit',
+'tooltip-n-recentchanges' => 'Wikimi allannguutit kingulliit',
+'tooltip-n-randompage' => 'Allaaserisamukarit',
+'tooltip-n-help' => 'Qanoq iliussaanga ...',
+'tooltip-t-whatlinkshere' => 'Innersuussami saqqummiussat',
+'tooltip-t-recentchangeslinked' => 'Massuma quppernerani allannguutit kingulliit',
+'tooltip-t-upload' => 'Assinik mediafiilinilluunniit ilisigit',
+'tooltip-t-specialpages' => 'Quppernerit immikkut ittut nassaassaasinnaasut',
+'tooltip-t-print' => 'Quppernerup naqikkuminarnera',
+'tooltip-t-permalink' => 'Massuma quppernerup taamaaqqaarnera',
+'tooltip-ca-nstab-main' => 'Imarisaa takuuk',
+'tooltip-save' => 'Allannguutitit toqqukkit',
+'tooltip-preview' => 'Isikkua takuuk, toqqortinnaguk atortaruk!',
 
 # Attribution
 'lastmodifiedatby' => 'Una qupperneq kingullermik allanngortinneqarsimavoq $2, $1 $3-mit.',
 
 # Browsing diffs
 'previousdiff' => '← Assigiinngissut siulia',
-'nextdiff'     => 'Assigiinngissut tullia →',
+'nextdiff' => 'Assigiinngissut tullia →',
 
 # Special:NewFiles
 'ilsubmit' => 'Ujarlerit',
 
 # 'all' in various places, this might be different for inflected languages
 'namespacesall' => 'tamarmik',
-'monthsall'     => 'tamarmik',
+'monthsall' => 'tamarmik',
 
 # Auto-summaries
 'autosumm-new' => "Qupperneq pilersippaa '$1'",
@@ -548,4 +546,7 @@ Aamma takuuk [[Special:WantedCategories|sunut atassusinut kissaatigineqartut]].'
 # Special:SpecialPages
 'specialpages' => 'Quppernerit immikkut ittut',
 
+# Search suggestions
+'searchsuggest-search' => 'Ujarlerit',
+
 );
index 8946a7c..1c9e0ff 100644 (file)
@@ -195,7 +195,6 @@ $magicWords = array(
        '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' ),
@@ -406,7 +405,6 @@ $messages = array(
 'qbbrowse' => 'រាវរក',
 'qbedit' => 'កែប្រែ',
 'qbpageoptions' => 'ទំព័រនេះ',
-'qbpageinfo' => 'ព័ត៌មានទំព័រ',
 'qbmyoptions' => 'ទំព័ររបស់ខ្ញុំ',
 'qbspecialpages' => 'ទំព័រពិសេសៗ',
 'faq' => 'សំណួរដែលសួរញឹកញាប់',
@@ -419,7 +417,7 @@ $messages = array(
 'vector-action-protect' => 'ការពារ',
 'vector-action-undelete' => 'ឈប់លុបចោល',
 'vector-action-unprotect' => 'ប្ដូរការការពារ',
-'vector-simplesearch-preference' => 'á\9e\94á\9f\92á\9e\9aá\9e¾á\9e¢á\9e\93á\9e»á\9e\9fá\9e¶á\9e\9fá\9e\93á\9f\8dá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\85á\9e\84á\9f\8bá\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80 (សំរាប់តែសំបកវ៉ិចទ័រប៉ុណ្ណោះ)',
+'vector-simplesearch-preference' => 'á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\9aá\9e\94á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80á\9e\9fá\9e¶á\9e\98á\9e\89á\9f\92á\9e\89 (សំរាប់តែសំបកវ៉ិចទ័រប៉ុណ្ណោះ)',
 'vector-view-create' => 'បង្កើត​',
 'vector-view-edit' => 'កែប្រែ​',
 'vector-view-history' => 'មើល​ប្រវត្តិ​',
@@ -633,7 +631,8 @@ $1',
 'protectedpagetext' => 'ទំព័រនេះបានត្រូវចាក់សោមិនឱ្យកែប្រែ​។',
 'viewsourcetext' => 'អ្នកអាចមើលនិងចម្លងកូដរបស់ទំព័រនេះ៖',
 'viewyourtext' => "អ្នកអាចមើលនិងចម្លងកូដរបស់'''ការកែប្រែរបស់អ្នក'''ទៅកាន់ទំព័រនេះ៖",
-'protectedinterface' => 'ទំព័រនេះ ផ្ដល់នូវ អត្ថបទអន្តរមុខ សម្រាប់ផ្នែកទន់, និង បានត្រូវចាក់សោ ដើម្បីចៀសវាង ការបំពាន ។',
+'protectedinterface' => 'ទំព័រនេះផ្ដល់នូវអត្ថបទអន្តរមុខសម្រាប់សូហ្វវែរនៅក្នុងវិគីនេះ និងត្រូវបានចាក់សោដើម្បីចៀសវាងការបំពាន។
+ដើម្បីបន្ថែមឬផ្លាស់ប្ដូរការបកប្រែសំរាប់វិគីទាំងអស់ សូមប្រើប្រាស់ [//translatewiki.net/ translatewiki.net] ដែលជាគំរោងបកប្រែរបស់MediaWiki។',
 'editinginterface' => "'''ប្រយ័ត្ន៖''' អ្នកកំពុងតែកែប្រែទំព័រដែលបានប្រើប្រាស់​ដើម្បីផ្ដល់នូវអន្តរមុខសម្រាប់ផ្នែកទន់​។ បំលាស់ប្ដូរចំពោះទំព័រនេះ​នឹងប៉ះពាល់ដល់ទំព័រអន្តរមុខនៃអ្នកប្រើប្រាស់​ជាច្រើន ដែលប្រើប្រាស់វិបសាយនេះ។ សម្រាប់ការបកប្រែ សូមពិចារណាប្រើប្រាស់ [//translatewiki.net/wiki/Main_Page?setlang=km translatewiki.net] (បេតាវិគី) គម្រោង​អន្តរជាតូបនីយកម្ម​នៃមេឌាវិគី ។",
 'sqlhidden' => '(ការអង្កេត SQL ត្រូវបិទបាំង)',
 'cascadeprotected' => 'ទំព័រនេះត្រូវបានការពារពីការការប្រែដោយសារវាមាន{{PLURAL:$1|ទំព័រ, ដែលមាន}} ដែលត្រូវបានការពារជាមួយជំរើស"ជាបណ្ដាក់"៖
@@ -647,6 +646,7 @@ $2',
 'filereadonlyerror' => 'មិនអាចកែប្រែឯកសារ "$1" បានទេពីព្រោះថតឯកសារ "$2" ស្ថិតក្នុងម៉ូដសំរាប់តែអានប៉ុណ្ណោះ។
 
 អភិបាលដែលបានចាក់សោរវាបានផ្ដល់សេចក្ដីពន្យល់បែបនេះ៖ "$3"។',
+'exception-nologin' => 'មិនទាន់កត់ឈ្មោះចូលទេ',
 'exception-nologin-text' => 'ទំព័រឬសកម្មភាពនេះតំរូវអោយអ្នកធ្វើការកត់ឈ្មោះចូលទៅក្នុងវិគីនេះ។',
 
 # Virus scanner
@@ -657,13 +657,9 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ឥឡូវនេះលោកអ្នកបានកត់ឈ្មោះចេញពីគណនីរបស់លោកអ្នកហើយ។'''
 
-អ្នកអាចបន្តប្រើប្រាស់{{SITENAME}}ក្នុងភាពអនាមិក ឬ [[Special:UserLogin|កត់ឈ្មោះចូលម្ដងទៀត]]ក្នុងនាមជាអ្នកប្រើប្រាស់ដដែលឬផ្សេងទៀត។
+អ្នកអាចបន្តប្រើប្រាស់{{SITENAME}}ក្នុងភាពអនាមិក ឬ <span class='plainlinks'>[$1 កត់ឈ្មោះចូលម្ដងទៀត]</span>ក្នុងនាមជាអ្នកប្រើប្រាស់ដដែលឬផ្សេងទៀត។
 
 សូមកត់សំគាល់ថាទំព័រមួយចំនួនប្រហែលជានៅតែបង្ហាញដូចពេលលោកអ្នកកត់ឈ្មោះចូលក្នុងគណនីរបស់លោកអ្នកដដែល។ ប្រសិនបើមានករណីនេះកើតឡើង សូមសំអាត សតិភ្ជាប់នៃកម្មវិធីរុករករបស់លោកអ្នក។",
-'welcomecreation' => '== សូមស្វាគមន៍ $1! ==
-
-គណនីរបស់អ្នកត្រូវបានបង្កើតហើយ។
-កុំភ្លេចផ្លាស់ប្ដូរ[[Special:Preferences|ចំណង់ចំណូលចិត្ត{{SITENAME}}]]របស់អ្នក។',
 'yourname' => 'អត្តនាម៖',
 'yourpassword' => 'ពាក្យសំងាត់៖',
 'yourpasswordagain' => 'វាយពាក្យសំងាត់ម្តងទៀត៖',
@@ -952,7 +948,7 @@ $2
 អ្នកអាច [[Special:Search/{{PAGENAME}}|ស្វែងរក​ចំណងជើង​នៃទំព័រនេះ]]ក្នុងទំព័រដទៃទៀត​​ ឬ [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ស្វែង​រក​កំណត់​ហេតុ​ដែល​ពាក់ព័ន្ធ] ឬ [{{fullurl:{{FULLPAGENAME}}|action=edit}} កែប្រែ​ទំព័រនេះ]។',
 'noarticletext-nopermission' => 'បច្ចុប្បន្ន គ្មានអត្ថបទណាមួយក្នុងទំព័រនេះទេ។
 
-អ្នកអាច [[Special:Search/{{PAGENAME}}|ស្វែងរក​ចំណងជើង​នៃទំព័រនេះ]] ក្នុងទំព័រ​ផ្សេងៗ ឬ<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ស្វែង​រក​កំណត់​ហេតុ​ដែល​ពាក់ព័ន្ធ]</span>។',
+អ្នកអាច [[Special:Search/{{PAGENAME}}|ស្វែងរក​ចំណងជើង​នៃទំព័រនេះ]] ក្នុងទំព័រ​ផ្សេងៗ ឬ<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ស្វែង​រក​កំណត់​ហេតុ​ដែល​ពាក់ព័ន្ធ]</span>។ ប៉ុន្តែអ្នកគ្មានសិទ្ធិក្នុងការបង្កើតទំព័រនេះទេ។',
 'userpage-userdoesnotexist' => 'គណនីអ្នកប្រើឈ្មោះ"<nowiki>$1</nowiki>" មិនទាន់បានចុះបញ្ជី។
 
 ចូរគិតម្ដងទៀតថាអ្នកចង់ បង្កើត / កែប្រែ ទំព័រនេះឬទេ។',
@@ -978,7 +974,7 @@ $2
 'updated' => '(បានបន្ទាន់សម័យ)',
 'note' => "'''ចំណាំ៖'''",
 'previewnote' => "'''សូមចាំថានេះគ្រាន់តែជា​ការបង្ហាញការមើលជាមុនប៉ុណ្ណោះ។ បំលាស់ប្ដូរ​របស់អ្នកមិនទាន់បាន​រក្សាទុកទេ!'''",
-'continue-editing' => 'á\9e\94á\9e\93á\9f\92á\9e\8fធ្វើការកែប្រែ',
+'continue-editing' => 'á\9e\91á\9f\85á\9e\80á\9e¶á\9e\93á\9f\8bá\9e\80á\9e\93á\9f\92á\9e\9bá\9f\82á\9e\84á\9e\9fá\9f\86á\9e\9aá\9e¶á\9e\94á\9f\8bធ្វើការកែប្រែ',
 'previewconflict' => 'ការមើលមុននេះយោងតាមអត្ថបទក្នុងប្រអប់កែប្រែខាងលើ។ ទំព័រអត្ថបទនឹងបង្ហាញចេញបែបនេះប្រសិនបើអ្នកជ្រើសរើសរក្សាទុក។',
 'session_fail_preview' => "'''សូមអភ័យទោស! យើងមិនអាចរក្សាទុកការកែប្រែរបស់អ្នកបានទេ ដោយសារបាត់ទិន្នន័យវេនការងារ។
 
@@ -1201,7 +1197,8 @@ $1",
 'revdelete-no-change' => "'''ប្រយ័ត្ន​៖''' វត្ថុ​ដែល​មាន​កាល​បរិច្ឆេទ​ $2, $1 ត្រូវ​បាន​ស្នើ​សុំ​ការ​កំណត់​គំហើញ​រួច​ហើយ​។",
 'revdelete-reason-dropdown' => '*មូលហេតុលុបចោលទូទៅ
 ** បំពានលើកម្មសិទ្ធិបញ្ញា
-** ព័ត៌មានផ្ទាល់ខ្លួនមិនសមរម្យ
+** មតិយោបល់ឬព័ត៌មានផ្ទាល់ខ្លួនមិនសមរម្យ
+** ឈ្មោះអ្នកប្រើប្រាស់មិនសមរម្យ
 ** ព័ត៌មានបង្ខូចកេរ្តិ៍ឈ្មោះ',
 'revdelete-otherreason' => 'មូលហេតុផ្សេង​ៗ/ដទៃទៀត​៖',
 'revdelete-reasonotherlist' => 'មូលហេតុផ្សេង​ទៀត​',
@@ -1300,8 +1297,6 @@ $1",
 'search-interwiki-caption' => 'គម្រោងជាបងប្អូន',
 'search-interwiki-default' => 'លទ្ធផលពី$1៖',
 'search-interwiki-more' => '(បន្ថែមទៀត)',
-'search-mwsuggest-enabled' => 'មានសំណើ',
-'search-mwsuggest-disabled' => 'គ្មានសំណើ',
 'search-relatedarticle' => 'ទាក់ទិន',
 'mwsuggest-disable' => 'មិនប្រើសំនើAJAX',
 'searcheverything-enable' => 'ស្វែងរកនៅក្នុងលំហឈ្មោះទាំងអស់',
@@ -1397,7 +1392,7 @@ $1",
 'timezoneregion-indian' => 'មហាសមុទ្រឥណ្ឌា',
 'timezoneregion-pacific' => 'មហាសមុទ្រប៉ាស៊ីហ្វិក',
 'allowemail' => 'ទទួលអ៊ីមែលពីអ្នកប្រើប្រាស់ដទៃទៀត',
-'prefs-searchoptions' => 'á\9e\87á\9e\98á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\9cá\9f\82á\9e\84á\9e\9aá\9e\80',
+'prefs-searchoptions' => 'ស្វែងរក',
 'prefs-namespaces' => 'ប្រភេទ',
 'defaultns' => 'ស្វែងរក​ក្នុង​លំហឈ្មោះ​ទាំងនេះ​តាម​បែប​ផ្សេង៖',
 'default' => 'លំនាំដើម',
@@ -1911,6 +1906,7 @@ $1',
 'uploadnewversion-linktext' => 'ផ្ទុកឡើងមួយកំណែថ្មីនៃឯកសារនេះ',
 'shared-repo-from' => 'ពី $1',
 'shared-repo' => 'ឃ្លាំងរួម​',
+'upload-disallowed-here' => 'អ្នកមិនអាចសរសេរជាន់ពីលើឯកសារនេះទេ។',
 
 # File reversion
 'filerevert' => 'ត្រឡប់ $1',
@@ -1940,6 +1936,7 @@ $1',
 **ឯកសារជាន់គ្នា',
 'filedelete-edit-reasonlist' => 'មូលហេតុនៃការលុបការកែប្រែ',
 'filedelete-maintenance' => 'ការលុបឬស្តារឯកសារឡើងវិញត្រូវបានផ្អាកជាបណ្ដោះអាសន្ន​ក្នុងពេលធ្វើការថែទាំប្រព័ន្ធ។',
+'filedelete-maintenance-title' => 'មិនអាចលុបឯកសារចោល',
 
 # MIME search
 'mimesearch' => 'ស្វែងរក MIME',
@@ -1991,9 +1988,9 @@ $1',
 
 'disambiguations' => 'ទំព័រដែលភ្ជាប់ទៅទំព័រមានចំណងជើងស្រដៀងគ្នា',
 'disambiguationspage' => 'Template:ស្រដៀងគ្នា',
-'disambiguations-text' => "ទំព័រទាំងឡាយខាងក្រោមនេះភ្ជាប់ទៅកាន់'''ទំព័រពាក្យស្រដៀងគ្នា'''។
+'disambiguations-text' => "á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e¡á\9e¶á\9e\99á\9e\81á\9e¶á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\98á\9e\93á\9f\81á\9f\87á\9e\98á\9e·á\9e\93á\9e\8fá\9f\86á\9e\8eá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\99á\9f\89á\9e¶á\9e\84á\9e\8fá\9e·á\9e\85á\9e\98á\9e½á\9e\99á\9e\8aá\9f\82á\9e\9bá\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\91á\9f\85á\9e\80á\9e¶á\9e\93á\9f\8b'''á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9f\92á\9e\9aá\9e\8aá\9f\80á\9e\84á\9e\82á\9f\92á\9e\93á\9e¶'''á\9f\94
 
\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e\93á\9f\81á\9f\87á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\91á\9f\85á\9e\94á\9f\92á\9e\9aá\9e\92á\9e¶á\9e\93á\9e\94á\9e\91á\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\8fá\9f\82á\9e\98á\9f\92á\9e\8aá\9e\84។<br />
\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e\93á\9f\81á\9f\87á\9e\82á\9e½á\9e\9aá\9e\8fá\9f\82á\9e\97á\9f\92á\9e\87á\9e¶á\9e\94á\9f\8bá\9e\91á\9f\85á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\8fá\9f\92á\9e\9aá\9e¹á\9e\98á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\87á\9e¶á\9e\84á\9e\93á\9f\81á\9f\87á\9e\9cá\9e·á\9e\89។<br />
 ទំព័រមួយត្រូវចាត់ទុកជាទំព័រពាក្យស្រដៀងគ្នា ប្រសិនបើវាប្រើទំព័រគំរូដែលភ្ជាប់មកពី[[MediaWiki:Disambiguationspage]]",
 
 'doubleredirects' => 'ទំព័របញ្ជូនបន្តទ្វេដង',
@@ -2021,6 +2018,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|កំណែប្រែ}}',
@@ -2255,11 +2253,7 @@ $1',
 
 'enotif_mailer' => 'ភ្នាក់ងារផ្ញើអ៊ីមែលផ្ដល់ដំណឹងរបស់ {{SITENAME}}',
 'enotif_reset' => 'កត់សម្គាល់រាល់គ្រប់ទំព័រដែលបានចូលមើល',
-'enotif_newpagetext' => 'នេះជាទំព័រថ្មី។',
 'enotif_impersonal_salutation' => 'អ្នកប្រើប្រាស់ {{SITENAME}}',
-'changed' => 'បានផ្លាស់ប្តូរ',
-'created' => 'បានបង្កើត',
-'enotif_subject' => 'ទំព័រ $PAGETITLE នៃ {{SITENAME}} ត្រូវបាន $CHANGEDORCREATED ដោយ $PAGEEDITOR',
 'enotif_lastvisited' => 'ពិនិត្យ $1 ចំពោះគ្រប់បំលាស់ប្តូរ តាំងពីពេលចូលមើល ចុងក្រោយ។',
 'enotif_lastdiff' => 'សូមពិនិត្យ$1ដើម្បីមើលបំលាស់ប្តូរនេះ។',
 'enotif_anon_editor' => 'អ្នកប្រើប្រាស់អនាមិក $1',
@@ -2930,14 +2924,19 @@ $1',
 
 # Info page
 'pageinfo-title' => 'ព័ត៌មានសម្រាប់ "$1"',
+'pageinfo-not-current' => 'ព័ត៌មានប្រហែលជាអាចបង្ហាញសំរាប់តែកំណែបច្ចុប្បន្នប៉ុណ្ណោះ។',
 'pageinfo-header-basic' => 'ព័ត៌មាន​មូលដ្ឋាន​',
 'pageinfo-header-edits' => 'ប្រវត្តិកែប្រែ',
 'pageinfo-header-restrictions' => 'ការការពារទំព័រ',
 'pageinfo-header-properties' => 'លក្ខណៈសម្បត្តិទំព័រ',
 'pageinfo-display-title' => 'បង្ហាញចំណងជើង',
+'pageinfo-default-sort' => 'ពាក្យគន្លឺះសំរាប់តំរៀប',
 'pageinfo-length' => 'ប្រវែងទំព័រ (គិតជាបៃ)',
 'pageinfo-article-id' => 'អត្តលេខទំព័រ',
+'pageinfo-language' => 'ភាសារបស់ខ្លឹមសារទំព័រ',
 'pageinfo-robot-policy' => 'ស្ថានភាពម៉ាស៊ីនស្វែងរក',
+'pageinfo-robot-index' => 'អាចដាក់ក្នុងលិបិក្រម',
+'pageinfo-robot-noindex' => 'មិនអាចដាក់ក្នុងលិបិក្រម',
 'pageinfo-views' => 'ចំនួនការបើកមើល',
 'pageinfo-watchers' => 'ចំនួនអ្នកតាមដានទំព័រ',
 'pageinfo-redirects-name' => 'ចំនួនការបញ្ជូនបន្តមកកាន់ទំព័រនេះ',
@@ -2951,9 +2950,17 @@ $1',
 'pageinfo-authors' => 'ចំនួនអ្នកនិពន្ធសរុប',
 'pageinfo-recent-edits' => 'ចំនួនការកែប្រែថ្មីៗ (ក្នុងរយៈពេល $1 កន្លងទៅនេះ)',
 'pageinfo-recent-authors' => 'ចំនួនអ្នកនិពន្ធថ្មីៗនេះ',
-'pageinfo-restriction' => 'ការការពារទំព័រ ({{$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|ពាក្យ|ពាក្យ}} វេទមន្ត ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|ចំណាត់ថ្នាក់ក្រុម|ចំណាត់ថ្នាក់ក្រុម}}ដែលបានលាក់ ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|ទំព័រគំរូ|ទំព័រគំរូ}}ដែលទាញមកបញ្ចូល ($1)',
+'pageinfo-toolboxlink' => 'ព័ត៌មានអំពីទំព័រនេះ',
+'pageinfo-redirectsto' => 'បញ្ជូនបន្តទៅកាន់',
+'pageinfo-redirectsto-info' => 'ព័ត៌មាន​',
+'pageinfo-contentpage' => 'រាប់ជាទំព័រដែលមានខ្លឹមសារនៅខាងក្នុង',
+'pageinfo-contentpage-yes' => 'បាទ/ចាស',
+'pageinfo-protect-cascading' => 'ការការពារត្រូវបានដាក់ជាថ្នាក់ពីទីនេះទៅ',
+'pageinfo-protect-cascading-yes' => 'បាទ/ចាស',
+'pageinfo-protect-cascading-from' => 'ការការពារត្រូវបានដាក់ជាថ្នាក់ពី',
 
 # Skin names
 'skinname-standard' => 'បុរាណ',
@@ -3628,6 +3635,10 @@ $5
 'feedback-thanks' => 'សូមអរគុណ! មតិយោបល់របស់អ្នកត្រូវបានដាក់ផ្សាយនៅលើទំព័រ "[$2 $1]"។',
 'feedback-close' => 'រួចរាល់',
 
+# Search suggestions
+'searchsuggest-search' => 'ស្វែងរក​',
+'searchsuggest-containing' => 'ដែលមានពាក្យ...',
+
 # API errors
 'api-error-badaccess-groups' => 'អ្នកគ្មានការអនុញ្ញាតអោយផ្ទុកឯកសារឡើងទៅក្នុងវិគីនេះទេ។',
 'api-error-empty-file' => 'ឯកសារដែលអ្នកបានដាក់ស្នើគឺទទេ។',
index 42c52af..28b6490 100644 (file)
@@ -196,7 +196,7 @@ $messages = array(
 'cancel' => 'ವಜಾ ಮಾಡಿ',
 'moredotdotdot' => 'ಇನ್ನಷ್ಟು...',
 'mypage' => 'ನನ್ನ ಪುಟ',
-'mytalk' => 'ನನà³\8dನ à²\9aರà³\8dà²\9aà³\86',
+'mytalk' => 'ಚರ್ಚೆ',
 'anontalk' => 'ಈ ಐ.ಪಿ ಗೆ ಮಾತನಾಡಿ',
 'navigation' => 'ಸಂಚರಣೆ',
 'and' => '&#32;ಮತ್ತು',
@@ -206,7 +206,6 @@ $messages = array(
 'qbbrowse' => 'ವಿಹರಿಸು',
 'qbedit' => 'ಸಂಪಾದಿಸು',
 'qbpageoptions' => 'ಈ ಪುಟ',
-'qbpageinfo' => 'ಸನ್ನಿವೇಶ',
 'qbmyoptions' => 'ನನ್ನ ಪುಟಗಳು',
 'qbspecialpages' => 'ವಿಶೇಷ ಪುಟಗಳು',
 'faq' => 'ಸಾಮಾನ್ಯವಾಗಿ ಕೇಳಲಾಗುವ ಪ್ರಶ್ನೆಗಳು',
@@ -437,11 +436,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ನೀವು ಈಗ ಲಾಗ್ ಔಟ್ ಆಗಿರುವಿರಿ.'''
 
-ನೀವು {{SITENAME}} ಅನ್ನು ಅನಾಮಧೇಯವಾಗಿ ಉಪಯೋಗಿಸಬಹುದು, ಅಥವ ಮತ್ತೆ ಇದೇ ಹೆಸರಿನಲ್ಲಿ ಅಥವ ಬೇರೆ ಹೆಸರಿನಲ್ಲಿ [[Special:UserLogin|ಲಾಗ್ ಇನ್]] ಆಗಬಹುದು.
+ನೀವು {{SITENAME}} ಅನ್ನು ಅನಾಮಧೇಯವಾಗಿ ಉಪಯೋಗಿಸಬಹುದು, ಅಥವ ಮತ್ತೆ ಇದೇ ಹೆಸರಿನಲ್ಲಿ ಅಥವ ಬೇರೆ ಹೆಸರಿನಲ್ಲಿ <span class='plainlinks'>[$1 ಲಾಗ್ ಇನ್]</span> ಆಗಬಹುದು.
 ಗಮನಿಸಿ: ನಿಮ್ಮ ಬ್ರೌಸರ್‍ನ cache ಅನ್ನು ಅಳಿಸುವವರೆಗೂ ಕೆಲವು ಪುಟಗಳು ನೀವಿನ್ನೂ ಲಾಗ್ ಇನ್ ಆಗಿರುವಂತೆ ಪ್ರದರ್ಶಿತವಾಗಬಹುದು.",
-'welcomecreation' => '== ಸುಸ್ವಾಗತ, $1! ==
-ನಿಮ್ಮ ಅಕೌಂಟನ್ನು ಸೃಷ್ಟಿಸಲಾಗಿದೆ.
-ನಿಮ್ಮ [[Special:Preferences|{{SITENAME}} ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು]] ಬದಲಾಯಿಸುವುದನ್ನು ಮರೆಯಬೇಡಿ.',
 'yourname' => 'ನಿಮ್ಮ ಬಳಕೆಯ ಹೆಸರು',
 'yourpassword' => 'ನಿಮ್ಮ ಪ್ರವೇಶಪದ',
 'yourpasswordagain' => 'ಪ್ರವೇಶ ಪದ ಮತ್ತೊಮ್ಮೆ ಟೈಪ್ ಮಾಡಿ',
@@ -459,6 +455,7 @@ $2',
 'createaccount' => 'ಹೊಸ ಖಾತೆ ತೆರೆಯಿರಿ',
 'gotaccount' => "ಈಗಾಗಲೇ ಖಾತೆಯಿದೆಯೇ? '''$1'''.",
 'gotaccountlink' => 'ಲಾಗ್ ಇನ್',
+'userlogin-resetlink' => 'ನಿಮ್ಮ ಲಾಗಿನ್ ವಿವರಗಳನ್ನು ಮರೆತಿದ್ದೀರಾ?',
 'createaccountmail' => 'ಇ-ಅಂಚೆಯ ಮೂಲಕ',
 'createaccountreason' => 'ಕಾರಣ:',
 'badretype' => 'ನೀವು ಕೊಟ್ಟ ಪ್ರವೇಶಪದಗಳು ಬೇರೆಬೇರೆಯಾಗಿವೆ.',
@@ -825,6 +822,7 @@ $2',
 'nextn-title' => 'ಮುಂದಿನ $1 {{PLURAL:$1|ಫಲಿತಾಂಶ|ಫಲಿತಾಂಶಗಳು}}',
 'shown-title' => 'ಪ್ರತಿ ಪುಟದಲ್ಲಿಯೂ $1 {{PLURAL:$1|result|results}} ತೋರಿಸು',
 'viewprevnext' => 'ವೀಕ್ಷಿಸು ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''\"[[:\$1]]\" ಹೆಸರಿನ ಪುಟ ಈ ವಿಕಿಯಲ್ಲಿದೆ.'''",
 'searchmenu-new' => "'''''[[:$1]]'' ಪುಟವನ್ನು ಈ ವಿಕಿಯಲ್ಲಿ ಸೃಷ್ಟಿಸಿ!'''",
 'searchhelp-url' => 'Help:ಪರಿವಿಡಿ',
 'searchprofile-articles' => 'ಲೇಖನ ಪುಟ',
@@ -845,8 +843,6 @@ $2',
 'search-interwiki-caption' => 'ಬಳಗದ ಇತರ ಯೋಜನೆಗಳು',
 'search-interwiki-default' => '$1 ಫಲಿತಾಂಶಗಳು:',
 'search-interwiki-more' => '(ಹೆಚ್ಚು)',
-'search-mwsuggest-enabled' => 'ಸಲಹೆಗಳೊಂದಿಗೆ',
-'search-mwsuggest-disabled' => 'ಯಾವುದೇ ಸಲಹೆಗಳಿಲ್ಲ',
 'search-relatedarticle' => 'ಸಂಬಂಧಿತ',
 'mwsuggest-disable' => 'AJAX ಸಲಹೆಗಳನ್ನು ತೋರದಿರು',
 'searchrelated' => 'ಸಂಬಂಧಿತ',
@@ -876,7 +872,7 @@ $2',
 
 # Preferences page
 'preferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
-'mypreferences' => 'ನನà³\8dನ à²ªà³\8dರಾಶಸà³\8dತà³\8dಯà²\97ಳà³\81',
+'mypreferences' => 'ಪ್ರಾಶಸ್ತ್ಯಗಳು',
 'prefs-edits' => 'ಸಂಪಾದನೆಗಳ ಸಂಖ್ಯೆ:',
 'prefsnologin' => 'ಲಾಗಿನ್ ಆಗಿಲ್ಲ',
 'prefsnologintext' => 'ಬಳಕೆದಾರ ಪ್ರಾಶಸ್ತ್ಯಗಳನ್ನು ಬದಲಾಯಿಸಲು ನೀವು <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ಲಾಗ್ ಇನ್]</span> ಆಗಿರಬೇಕು.',
@@ -1031,7 +1027,10 @@ $2',
 'recentchanges-legend' => 'ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳ ಆಯ್ಕೆಗಳು',
 'recentchanges-summary' => 'ವಿಕಿಗೆ ಮಾಡಲ್ಪಟ್ಟ ಇತ್ತೀಚಿನ ಬದಲಾವಣೆಗಳನ್ನು ಈ ಪುಟದಲ್ಲಿ ನೀವು ಕಾಣಬಹುದು.',
 'recentchanges-feed-description' => 'ವಿಕಿಯಲ್ಲಿ ಆಗುವ ಹೊಸ ಬದಲಾವಣೆಗಳ ಮೇಲೆ ನಿಗ ಇಡಲು ಉಪಯೋಗವಾಗುವ ಫೀಡು.',
+'recentchanges-label-newpage' => 'ಈ ಸಂಪಾದನೆ ಹೊಸ ಪುಟವನ್ನು ಸೃಷ್ಟಿಸಿದೆ',
 'recentchanges-label-minor' => 'ಇದು ಚುಟುಕಾದ ಬದಲಾವಣೆ',
+'recentchanges-label-bot' => 'ಈ ಸಂಪಾದನೆಯನ್ನು ಒಂದು ಬಾಟ್ ಮಾಡಿದೆ',
+'recentchanges-label-unpatrolled' => 'ಈ ಸಂಪಾದನೆಯನ್ನು ಇನ್ನೂ ಪರೀಕ್ಷೆಗೆ ಒಳಪಡಿಸಿಲ್ಲ',
 'rcnote' => "$5, $4 ವರೆಗೆ ಹಿಂದಿನ {{PLURAL:$2|ದಿನದಲ್ಲಿ|'''$2''' ದಿನಗಳಲ್ಲಿ}} ಮಾಡಲಾಗಿರುವ {{PLURAL:$1|'''೧''' ಬದಲಾವಣೆ|'''$1''' ಬದಲಾವಣೆಗಳು}} ಕೆಳಗಿವೆ.",
 'rcnotefrom' => "'''$2''' ಇಂದ ಆಗಿರುವ ಬದಲಾವಣೆಗಳು ಕೆಳಗಿವೆ (ಕೊನೆಯ '''$1'''ರವರೆಗೆ ತೋರಿಸಲಾಗಿದೆ).",
 'rclistfrom' => '$1 ಇಂದ ಪ್ರಾರಂಭಿಸಿ ಮಾಡಲಾದ ಬದಲಾವಣೆಗಳನ್ನು ನೋಡಿ',
@@ -1154,6 +1153,7 @@ $2',
 ಈ URL ಸರಿಯಿದೆ ಮತ್ತು ಆ ತಾಣ ಕಾರ್ಯ ಮಾಡುತ್ತಿದೆ ಎಂದು ಮತ್ತೊಮ್ಮೆ ಪರೀಕ್ಷಿಸಿ.',
 'upload-curl-error28' => 'ಅಪ್ಲೋಡ್ ಕಾಲಾವಧಿ ಮೀರಿದೆ',
 
+'license' => 'ಪರವಾನಗಿ:',
 'license-header' => 'ಪರವಾನಗಿ',
 'upload_source_url' => ' (ಒಂದು ಮನ್ನಿತ, ಸಾರ್ವಜನಿಕವಾಗಿ ಎಟಕುವ URL)',
 'upload_source_file' => ' (ನಿಮ್ಮ ಗಣಕಯಂತ್ರದಲ್ಲಿರುವ ಒಂದು ಫೈಲು)',
@@ -1359,6 +1359,7 @@ $2',
 'linksearch' => 'ಹೊರಗಿನ ಸಂಪರ್ಕಗಳು',
 'linksearch-ns' => 'ನಾಮವರ್ಗ:',
 'linksearch-ok' => 'ಹುಡುಕು',
+'linksearch-line' => '$1 ನ್ನು $2 ರಿಂದ ಜೋಡಿಸಲಾಗಿದೆ',
 
 # Special:ListUsers
 'listusersfrom' => 'ಇದರಿಂದ ಪ್ರಾರಂಭವಾಗುವ ಬಳಕೆದಾರರನ್ನು ತೋರಿಸು:',
@@ -1400,7 +1401,8 @@ $2',
 
 # Watchlist
 'watchlist' => 'ವೀಕ್ಷಣಾ ಪಟ್ಟಿ',
-'mywatchlist' => 'ನನ್ನ ವೀಕ್ಷಣಾಪಟ್ಟಿ',
+'mywatchlist' => 'ವೀಕ್ಷಣಾಪಟ್ಟಿ',
+'watchlistfor2' => '$1 ($2) ಗೆ',
 'nowatchlist' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯಲ್ಲಿ ಯಾವುದೇ ಪುಟಗಳಿಲ್ಲ',
 'watchlistanontext' => 'ನಿಮ್ಮ ವೀಕ್ಷಣಾಪಟ್ಟಿಯನ್ನು ನೋಡಲು ಅಥವ ಸಂಪಾದಿಸಲು ದಯವಿಟ್ಟು $1 ಮಾಡಿ.',
 'watchnologin' => 'ಲಾಗಿನ್ ಆಗಿಲ್ಲ',
@@ -1427,10 +1429,7 @@ $2',
 'unwatching' => 'ವೀಕ್ಷಣೆಯಿಂದ ತೆಗೆಯಲಾಗುತ್ತಿದೆ...',
 
 'enotif_reset' => 'ಭೇಟಿಯಿತ್ತ ಎಲ್ಲಾ ಪುಟಗಳನ್ನು ಗುರುತು ಮಾಡಿ',
-'enotif_newpagetext' => 'ಇದೊಂದು ಹೊಸ ಪುಟ.',
 'enotif_impersonal_salutation' => '{{SITENAME}} ಸದಸ್ಯ',
-'changed' => 'ಬದಲಾಯಿಸಲಾಗಿದೆ',
-'created' => 'ಸೃಷ್ಟಿಸಲ್ಪಟ್ಟಿದೆ',
 'enotif_lastvisited' => 'ನಿಮ್ಮ ಕಳೆದ ಭೇಟಿಯ ನಂತರದ ಎಲ್ಲಾ ಬದಲಾವಣೆಗಳಿಗೆ $1 ನೋಡಿ.',
 'enotif_anon_editor' => 'ಅನಾಮಧೇಯ ಸದಸ್ಯ $1',
 
@@ -1444,6 +1443,7 @@ $2',
 'confirmdeletetext' => 'ಒಂದು ಪುಟವನ್ನು ಮತ್ತು ಅದರ ಸಂಪೂರ್ಣ ಇತಿಹಾಸವನ್ನು ನೀವು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಿಹಾಕುತ್ತಿರುವಿರಿ.
 ಇದನ್ನು ನೀವು ಮಾಡಬಯಸುವಿರಿ, ಇದರ ಪರಿಣಾಮಗಳನ್ನು ಬಲ್ಲಿರಿ, ಮತ್ತು [[{{MediaWiki:Policy-url}}|ಕಾರ್ಯನೀತಿಗಳ]] ಅನುಸಾರ ಇದನ್ನು ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂದು ದೃಢಪಡಿಸಿ.',
 'actioncomplete' => 'ಕಾರ್ಯ ಸಂಪೂರ್ಣ',
+'actionfailed' => 'ಕ್ರಿಯೆ ವಿಫಲವಾಗಿದೆ',
 'deletedtext' => '"$1" ಅನ್ನು ಅಳಿಸಲಾಯಿತು.
 ಇತ್ತೀಚೆಗಿನ ಅಳಿಸುವಿಕೆಗಳ ಪಟ್ಟಿಗಾಗಿ $2 ಅನ್ನು ನೋಡಿ.',
 'dellogpage' => 'ಅಳಿಸುವಿಕೆ ದಾಖಲೆ',
@@ -1535,7 +1535,7 @@ $2',
 # Contributions
 'contributions' => 'ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು',
 'contributions-title' => '$1 ಸದಸ್ಯರ ಕಾಣಿಕೆಗಳು',
-'mycontris' => 'ನನà³\8dನ à²\95ಾಣಿà²\95à³\86à²\97ಳà³\81',
+'mycontris' => 'ಕಾಣಿಕೆಗಳು',
 'contribsub2' => '$1 ($2) ಗೆ',
 'uctop' => ' (ಮೇಲಕ್ಕೆ)',
 'month' => 'ಈ ತಿಂಗಳಿಂದ (ಮತ್ತು ಮುಂಚಿನ):',
@@ -1544,11 +1544,13 @@ $2',
 'sp-contributions-newbies' => 'ಹೊಸ ಖಾತೆಗಳ ಕಾಣಿಕೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು',
 'sp-contributions-newbies-sub' => 'ಹೊಸ ಖಾತೆಗಳಿಗೆ',
 'sp-contributions-blocklog' => 'ತಡೆಹಿಡಿಯುವಿಕೆ ದಾಖಲೆ',
+'sp-contributions-uploads' => 'ಅಪ್ಲೋಡುಗಳು',
 'sp-contributions-logs' => 'ದಾಖಲೆಗಳು',
 'sp-contributions-talk' => 'ಚರ್ಚೆ',
 'sp-contributions-userrights' => 'ಬಳಕೆದಾರ ಹಕ್ಕುಗಳ ನಿರ್ವಹಣೆ',
 'sp-contributions-search' => 'ಸಂಪಾದನೆಗಳನ್ನು ಹುಡುಕು',
 'sp-contributions-username' => 'IP ವಿಳಾಸ ಅಥವ ಬಳಕೆಯ ಹೆಸರು:',
+'sp-contributions-toponly' => 'ಕೇವಲ ಇತ್ತೀಚಿನ ಪರಿಷ್ಕರಣೆಗೆ ಸಂಬಂಧಿಸಿದ ಸಂಪಾದನೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸು',
 'sp-contributions-submit' => 'ಹುಡುಕು',
 
 # What links here
@@ -1567,6 +1569,7 @@ $2',
 'whatlinkshere-hideredirs' => '$1 ಪುನರ್ನಿರ್ದೇಶನಗಳು',
 'whatlinkshere-hidetrans' => '$1 ಸೇರಿಸುವಿಕೆಗಳು',
 'whatlinkshere-hidelinks' => '$1 ಕೊಂಡಿಗಳು',
+'whatlinkshere-hideimages' => '$1 ಚಿತ್ರ ಕೊಂಡಿಗಳು',
 'whatlinkshere-filters' => 'ಶೋಧಕಗಳು',
 
 # Block/unblock
@@ -1803,6 +1806,10 @@ $2',
 'siteusers' => '{{SITENAME}} {{PLURAL:$2|ಸದಸ್ಯ|ಸದಸ್ಯರು}} $1',
 'creditspage' => 'ಪುಟದ ಗೌರವಗಳು',
 
+# Info page
+'pageinfo-toolboxlink' => 'ಪುಟದ ಮಾಹಿತಿ',
+'pageinfo-redirectsto' => 'ಪುನರ್ನಿರ್ದೇಶನ:',
+
 # Image deletion
 'deletedrevision' => 'ಹಳೆ ಆವೃತ್ತಿ $1 ಅನ್ನು ಅಳಿಸಲಾಗಿದೆ',
 'filedeleteerror-short' => 'ಈ ಫೈಲನ್ನು ಅಳಿಸುವುದರಲ್ಲಿ ದೋಷ: $1',
@@ -1849,15 +1856,15 @@ $1',
 'metadata-collapse' => 'ವಿಸ್ತಾರವಾದ ವಿವರಗಳನ್ನು ಅಡಗಿಸು',
 'metadata-fields' => 'ಈ ಸಂದೇಶದಲ್ಲಿ ಪಟ್ಟಿ ಮಾಡಲಾಗಿರುವ EXIF ಮೇಲ್ದರ್ಜೆ ಮಾಹಿತಿ ಚಿತ್ರ ಪುಟದಲ್ಲಿ ಸೇರಿಸಲಾಗುತ್ತದೆ. ಪುಟದಲ್ಲಿ ಮೇಲ್ದರ್ಜೆ ಮಾಹಿತಿ ಪಟ್ಟಿಯನ್ನು ತೆರೆದಾಗ ಇವು ಕಾಣುತ್ತದೆ.
 ಉಳಿದವುಗಳು ಮೂಲಸ್ಥಿತಿಯಲ್ಲಿ ಅಗೋಚರವಾಗಿರುತ್ತವೆ.
-* ಸೃಷ್ಟಿ
-* ಮಾದರಿ
-* ಮೂಲಸಮಯದಿನಾಂಕ
-* ಅನಾವರಣಸಮಯ
+* make
+* model
+* datetimeoriginal
+* exposuretime
 * fnumber
 * isospeedratings
 * focallength
-* ಕಲಾವಿದ
-* ಕೃತಿಸ್ವಾಮ್ಯ
+* artist
+* copyright
 * imagedescription
 * gpslatitude
 * gpslongitude
@@ -2112,4 +2119,15 @@ $5
 'revdelete-restricted' => 'ನಿರ್ವಾಹಕರಿಗೆ ನಿಬಂಧನೆಗಳನ್ನು ಅನ್ವಯಿಸಲಾಯಿತು',
 'revdelete-unrestricted' => 'ನಿರ್ವಾಹಕರ ನಿಬಂಧನೆಗಳನ್ನು ತೆಗೆಯಲಾಯಿತು',
 
+# 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 2306640..51ce3b8 100644 (file)
@@ -18,6 +18,7 @@
  * @author Gapo
  * @author Gjue
  * @author Ha98574
+ * @author Hoo
  * @author IRTC1015
  * @author ITurtle
  * @author Idh0854
@@ -133,7 +134,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( '최근바뀜' ),
        'Recentchangeslinked'       => array( '링크최근바뀜' ),
        'Revisiondelete'            => array( '특정판삭제' ),
-       'RevisionMove'              => array( '특정판이동' ),
        'Search'                    => array( '찾기', '검색' ),
        'Shortpages'                => array( '짧은문서' ),
        'Specialpages'              => array( '특수문서', '특수기능' ),
@@ -171,8 +171,7 @@ $magicWords = array(
        'nogallery'                 => array( '0', '__화랑숨김__', '__갤러리숨김__', '__NOGALLERY__' ),
        'forcetoc'                  => array( '0', '__목차보임__', '__목차표시__', '__FORCETOC__' ),
        'toc'                       => array( '0', '__목차__', '__TOC__' ),
-       'noeditsection'             => array( '0', '__단락편집숨김__', '__NOEDITSECTION__' ),
-       'noheader'                  => array( '0', '__머릿글숨김__', '__헤더숨김__', '__NOHEADER__' ),
+       'noeditsection'             => array( '0', '__부분편집숨김__', '__문단편집숨김__', '__단락편집숨김__', '__NOEDITSECTION__' ),
        'currentmonth'              => array( '1', '현재월', 'CURRENTMONTH', 'CURRENTMONTH2' ),
        'currentmonth1'             => array( '1', '현재월1', 'CURRENTMONTH1' ),
        'currentmonthname'          => array( '1', '현재월이름', 'CURRENTMONTHNAME' ),
@@ -247,6 +246,7 @@ $magicWords = array(
        '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' ),
        'int'                       => array( '0', '정수:', 'INT:' ),
        'sitename'                  => array( '1', '사이트이름', 'SITENAME' ),
        'ns'                        => array( '0', '이름:', '이름공간:', 'NS:' ),
@@ -392,7 +392,7 @@ $messages = array(
 
 'underline-always' => '항상',
 'underline-never' => '치지 않음',
-'underline-default' => '브라우저 설정을 따르기',
+'underline-default' => '스킨 또는 브라우저 설정을 따르기',
 
 # Font style option in Special:Preferences
 'editfont-style' => '편집창의 글꼴:',
@@ -477,8 +477,8 @@ $messages = array(
 'newwindow' => '(새 창으로 열림)',
 'cancel' => '취소',
 'moredotdotdot' => '더 보기...',
-'mypage' => 'ë\82´ ì\82¬ì\9a©ì\9e\90 ë¬¸ì\84\9c',
-'mytalk' => '내 사용자 토론',
+'mypage' => '문서',
+'mytalk' => '토론',
 'anontalk' => '익명 사용자 토론',
 'navigation' => '둘러보기',
 'and' => ',',
@@ -488,7 +488,6 @@ $messages = array(
 'qbbrowse' => '탐색',
 'qbedit' => '편집',
 'qbpageoptions' => '문서 기능',
-'qbpageinfo' => '문서 정보',
 'qbmyoptions' => '내 사용자 문서',
 'qbspecialpages' => '특수 문서',
 'faq' => '자주 묻는 질문',
@@ -501,7 +500,7 @@ $messages = array(
 'vector-action-protect' => '보호',
 'vector-action-undelete' => '되살리기',
 'vector-action-unprotect' => '보호 설정 바꾸기',
-'vector-simplesearch-preference' => '향상된 검색어 제안 사용하기 (벡터 스킨 전용)',
+'vector-simplesearch-preference' => '단순한 찾기 막대 사용하기 (벡터 스킨 전용)',
 'vector-view-create' => '만들기',
 'vector-view-edit' => '편집',
 'vector-view-history' => '역사',
@@ -511,6 +510,7 @@ $messages = array(
 'namespaces' => '이름공간',
 'variants' => '변수',
 
+'navigation-heading' => '둘러보기 메뉴',
 'errorpagetitle' => '오류',
 'returnto' => '$1(으)로 돌아갑니다.',
 'tagline' => '{{SITENAME}}',
@@ -521,7 +521,7 @@ $messages = array(
 'searcharticle' => '가기',
 'history' => '문서 역사',
 'history_short' => '역사',
-'updatedmarker' => '마지막으로 읽은 뒤 바뀌었음',
+'updatedmarker' => '마지막으로 방문한 뒤 바뀜',
 'printableversion' => '인쇄용 문서',
 'permalink' => '고유링크',
 'print' => '인쇄',
@@ -607,7 +607,7 @@ $1',
 'retrievedfrom' => '원본 주소 "$1"',
 'youhavenewmessages' => '다른 사용자가 $1란에 글을 남겼습니다. ($2)',
 'newmessageslink' => '사용자 토론',
-'newmessagesdifflink' => 'ë°\94ë\80\90 ë\82´ì\9a© ë¹\84êµ\90',
+'newmessagesdifflink' => 'ë§\88ì§\80ë§\89 ë°\94ë\80\90 ë\82´ì\9a©',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|다른 사용자가|사용자 $3명이}} $1란에 글을 남겼습니다. ($2)',
 'youhavenewmessagesmanyusers' => '여러 사용자가 $1란에 글을 남겼습니다. ($2)',
 'newmessageslinkplural' => '{{PLURAL:$1|사용자 토론}}',
@@ -653,8 +653,8 @@ $1',
 # Main script and global functions
 'nosuchaction' => '해당하는 동작이 없습니다.',
 'nosuchactiontext' => 'URL로 요청한 동작이 잘못되었습니다.
-당신은 URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니다.
-이것은 {{SITENAME}}의 버그일 수도 있습니다.',
+URL을 잘못 입력하였거나, 잘못된 링크를 따라갔을 수 있습니다.
+{{SITENAME}}의 버그일 수도 있습니다.',
 'nosuchspecialpage' => '해당하는 특수 문서가 없습니다.',
 'nospecialpagetext' => '<strong>요청한 특수 문서가 존재하지 않습니다.</strong>
 
@@ -721,20 +721,20 @@ $1',
 'actionthrottled' => '동작 중지',
 'actionthrottledtext' => '스팸을 막기 위해 짧은 시간 안에 이 작업을 너무 많이 하는 것을 막고 있습니다.
 제한을 넘었으니 몇 분 뒤에 새로 시도하세요.',
-'protectedpagetext' => '이 문서는 편집할 수 없도록 보호되어 있습니다.',
+'protectedpagetext' => 'ì\9d´ ë¬¸ì\84\9cë\8a\94 í\8e¸ì§\91í\95\98ê±°ë\82\98 ë\8b¤ë¥¸ í\96\89ë\8f\99ì\9d\84 í\95  ì\88\98 ì\97\86ë\8f\84ë¡\9d ë³´í\98¸ë\90\98ì\96´ ì\9e\88ì\8aµë\8b\88ë\8b¤.',
 'viewsourcetext' => '문서의 원본을 보거나 복사할 수 있습니다:',
-'viewyourtext' => "당신은 이 문서에 남긴 '''당신의 편집''' 내용을 보거나 복사할 수 있습니다:",
+'viewyourtext' => "이 문서에 남긴 '''내 편집''' 내용을 보거나 복사할 수 있습니다:",
 'protectedinterface' => '이 문서는 이 위키의 소프트웨어 인터페이스에 쓰이는 문서로, 부정 행위를 막기 위해 보호되어 있습니다.
 모든 위키에 대한 번역을 추가하거나 바꾸려면 미디어위키 지역화 프로젝트인 [//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''' 이름공간을 편집할 수 있는 권한이 없습니다.",
-'customcssprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 당신은 이 CSS 문서를 편집할 수 없습니다.',
-'customjsprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 당신은 이 자바스크립트 문서를 편집할 수 없습니다.',
+'customcssprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 CSS 문서를 편집할 수 없습니다.',
+'customjsprotected' => '여기에는 다른 사용자의 개인 설정이 포함되어 있기 때문에 이 자바스크립트 문서를 편집할 수 없습니다.',
 'ns-specialprotected' => '특수 문서는 편집할 수 없습니다.',
 'titleprotected' => '[[User:$1|$1]] 사용자가 문서 만들기를 금지했습니다.
 이유는 다음과 같습니다. "$2"',
@@ -754,10 +754,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''{{SITENAME}}에서 로그아웃했습니다.'''
 
-이대로 이름 없이 {{SITENAME}}을(를) 이용하거나, 방금 사용했던 계정이나 다른 계정으로 다시 [[Special:UserLogin|로그인]]해서 이용할 수 있습니다.
+이대로 이름 없이 {{SITENAME}}을(를) 이용하거나, 방금 사용했던 계정이나 다른 계정으로 다시 <span class='plainlinks'>[$1 로그인]</span>해서 이용할 수 있습니다.
 웹 브라우저의 캐시를 지우지 않으면 몇몇 문서에서 로그인이 되어 있는 것처럼 보일 수 있다는 점을 유의해 주세요.",
-'welcomecreation' => '== $1 님, 환영합니다! ==
-계정이 만들어졌습니다.
+'welcomeuser' => '$1, 환영합니다!',
+'welcomecreation-msg' => '계정이 만들어졌습니다.
 [[Special:Preferences|{{SITENAME}} 사용자 환경 설정]]을 바꿀 수 있습니다.',
 'yourname' => '사용자 이름:',
 'yourpassword' => '비밀번호:',
@@ -793,10 +793,10 @@ $2',
 지금 사용하는 웹 브라우저는 쿠키를 사용하지 않도록 설정되어 있습니다.
 로그인하기 전에 웹 브라우저에서 쿠키를 사용하도록 설정해주세요.',
 'nocookieslogin' => '{{SITENAME}}에서는 로그인을 위해 쿠키를 사용합니다.
-당신의 웹 브라우저에서 쿠키가 비활성되어 있습니다.
-ì¿ í\82¤ ì\82¬ì\9a©ì\9d\84 í\99\9cì\84±í\99\94í\95\9c ë\8b¤ì\9d\8c ë¡\9cê·¸ì\9d¸í\95´ ì£¼세요.',
+쿠키가 비활성되어 있습니다.
+ì¿ í\82¤ ì\82¬ì\9a©ì\9d\84 í\99\9cì\84±í\99\94í\95\9c ë\8b¤ì\9d\8c ë\8b¤ì\8b\9c ì\8b\9cë\8f\84í\95\98세요.',
 'nocookiesfornew' => '요청의 출처를 확인할 수 없기 때문에 사용자 계정이 만들어지지 않았습니다.
-쿠키를 허용한 것을 확인한 후에 다시 시도해 보십시오.',
+쿠키를 허용한 것을 확인한 후에 이 문서를 새로 고치고 나서 다시 시도하세요.',
 'noname' => '사용자 이름이 올바르지 않습니다.',
 'loginsuccesstitle' => '로그인 성공',
 'loginsuccess' => "'''{{SITENAME}}에 \"\$1\" 계정으로 로그인했습니다.'''",
@@ -819,7 +819,7 @@ $2',
 'passwordremindertext' => '$1 IP 주소에서 누군가가 아마 자신이 {{SITENAME}} ($4)의 새 비밀번호를 요청했습니다.
 "$2" 사용자의 임시 비밀번호는 "$3"로 설정되었습니다. 이것이 자신이 의도한 바라면
 지금 로그인하여 새로운 비밀번호를 만드세요.
-당신의 임시 비밀번호는 $5일 후에 만료됩니다.
+임시 비밀번호는 $5일 후에 만료됩니다.
 
 이 요청을 다른 사람이 했거나 이전 비밀번호를 기억해 내서 바꿀 필요가 없으면
 이 메시지를 무시하고 이전 비밀번호를 계속 사용할 수 있습니다.',
@@ -835,7 +835,7 @@ $2',
 'mailerror' => '메일 보내기 오류: $1',
 'acct_creation_throttle_hit' => '당신의 IP 주소를 이용한 방문자가 이전에 이미 계정을 $1개 만들어, 계정 만들기 한도를 초과하였습니다.
 따라서 지금은 이 IP 주소로는 더 이상 계정을 만들 수 없습니다.',
-'emailauthenticated' => '당신의 이메일 주소는 $2 $3에 인증되었습니다.',
+'emailauthenticated' => '이메일 주소는 $2 $3에 인증되었습니다.',
 'emailnotauthenticated' => '이메일 주소를 인증하지 않았습니다.
 이메일 확인 절차를 거치지 않으면 다음 이메일 기능을 사용할 수 없습니다.',
 'noemailprefs' => '이 기능을 사용하기 위해서는 사용자 환경 설정에서 이메일 주소를 설정해야 합니다.',
@@ -879,7 +879,7 @@ $2',
 'resetpass-submit-loggedin' => '비밀번호 바꾸기',
 'resetpass-submit-cancel' => '취소',
 'resetpass-wrong-oldpass' => '비밀번호가 잘못되었거나 현재의 비밀번호와 같습니다.
-당신은 이미 비밀번호를 성공적으로 바꾸었거나 새 임시 비밀번호를 발급받았을 수 있습니다.',
+이미 비밀번호를 성공적으로 바꾸었거나 새 임시 비밀번호를 요청했을 수 있습니다.',
 'resetpass-temp-password' => '임시 비밀번호:',
 
 # Special:PasswordReset
@@ -894,7 +894,7 @@ $2',
 'passwordreset-capture-help' => '이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.',
 'passwordreset-email' => '이메일 주소:',
 'passwordreset-emailtitle' => '{{SITENAME}} 계정 자세한 정보',
-'passwordreset-emailtext-ip' => 'IP 주소 $1을 사용하는 누군가(아마도 당신이), {{SITENAME}} ($4)의 비밀번호 찾기를 요청하였습니다.
+'passwordreset-emailtext-ip' => 'IP 주소 $1을 사용하는 누군가가 아마 자신이 {{SITENAME}} ($4)의 비밀번호 찾기를 요청하였습니다.
 이 이메일 주소와 연관된 계정의 목록입니다:
 
 $2
@@ -919,7 +919,7 @@ $2
 # Special:ChangeEmail
 'changeemail' => '이메일 주소 바꾸기',
 'changeemail-header' => '계정 메일 주소 바꾸기',
-'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¼ í\95©ë\8b\88ë\8b¤.',
+'changeemail-text' => '이메일 주소를 바꾸려면 이 양식을 채우세요. 바뀜 내용을 확인하기 위해 비밀번호를 입력해야 합니다.',
 'changeemail-no-info' => '이 특수 문서에 직접 접근하려면 반드시 로그인해야 합니다.',
 'changeemail-oldemail' => '현재 이메일 주소 :',
 'changeemail-newemail' => '새 이메일 주소:',
@@ -933,7 +933,7 @@ $2
 'italic_sample' => '기울인 글씨',
 'italic_tip' => '기울인 글씨',
 'link_sample' => '링크 제목',
-'link_tip' => '내부 링크',
+'link_tip' => '안쪽 링크',
 'extlink_sample' => 'http://www.example.com 사이트 이름',
 'extlink_tip' => '바깥 링크 (주소 앞에 http://가 있어야 합니다.)',
 'headline_sample' => '제목',
@@ -946,7 +946,7 @@ $2
 'hr_tip' => '가로 줄 (되도록 사용하지 말아 주세요)',
 
 # Edit pages
-'summary' => '편집 요약:',
+'summary' => '요약:',
 'subject' => '주제/제목:',
 'minoredit' => '사소한 편집',
 'watchthis' => '이 문서 주시하기',
@@ -957,16 +957,16 @@ $2
 'showdiff' => '차이 보기',
 'anoneditwarning' => "'''경고''': 로그인하고 있지 않습니다.
 당신의 IP 주소가 문서 역사에 남게 됩니다.",
-'anonpreviewwarning' => "'''ë\8b¹ì\8b ì\9d\80 ì§\80ê¸\88 ë¡\9cê·¸ì\9d¸í\95\98ê³  ì\9e\88ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤. ë¬¸ì\84\9c를 ì \80ì\9e¥í\95\98ë©´ ë\8b¹ì\8b ì\9d\98 IP ì£¼ì\86\8cê°\80 ë¬¸ì\84\9c ì\97­ì\82¬ì\97\90 ë\82¨ê²\8c ë\90©ë\8b\88ë\8b¤.'''",
+'anonpreviewwarning' => "'''로그인하고 있지 않습니다. 문서를 저장하면 당신의 IP 주소가 문서 역사에 남게 됩니다.'''",
 'missingsummary' => "'''알림:''' 편집 요약을 적지 않았습니다.
 이대로 \"{{int:savearticle}}\"을 클릭하면 편집 요약 없이 저장됩니다.",
 'missingcommenttext' => '아래에 내용을 채워 넣어 주세요.',
 'missingcommentheader' => "'''알림:''' 글의 제목을 입력하지 않았습니다.
 다시 \"{{int:savearticle}}\" 버튼을 클릭하면 글이 제목 없이 저장됩니다.",
-'summary-preview' => '편집 요약 미리 보기:',
+'summary-preview' => '요약 미리 보기:',
 'subject-preview' => '주제/제목 미리 보기:',
 'blockedtitle' => '차단됨',
-'blockedtext' => "'''당신의 계정 혹은 IP 주소가 차단되었습니다.'''
+'blockedtext' => "'''사용자 계정 또는 IP 주소가 차단되었습니다.'''
 
 차단한 사람은 $1입니다.
 차단한 이유는 다음과 같습니다: $2
@@ -1038,21 +1038,21 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 * '''오페라''': ''도구→설정''에서 캐시를 비움",
 'usercssyoucanpreview' => "'''안내''': CSS 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
 'userjsyoucanpreview' => "'''안내''': 자바스크립트 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
-'usercsspreview' => "'''ì\9d´ê²\83ì\9d\80 ì\82¬ì\9a©ì\9e\90 CSSì\9d\98 ë¯¸ë¦¬ ë³´ê¸°ì\9e\85ë\8b\88ë\8b¤.'''
-'''아직 저장하지 않았다는 것을 기억해두세요!'''",
-'userjspreview' => "'''ì\9d´ê²\83ì\9d\80 ì\9e\90ë°\94ì\8a¤í\81¬ë¦½í\8a¸ ë¯¸ë¦¬ ë³´ê¸°ì\9e\85ë\8b\88ë\8b¤'''
-'''아직 저장하지 않았다는 것을 기억해두세요!'''",
-'sitecsspreview' => "'''이것은 이 CSS의 미리 보기일 뿐입니다.'''
-'''아직 저장하지 않았다는 것을 기억해두세요!'''",
-'sitejspreview' => "'''이것은 이 자바스크립트 코드의 미리 보기일 뿐입니다.'''
-'''아직 저장하지 않았다는 것을 기억해두세요!'''",
+'usercsspreview' => "'''사용자 CSS의 미리 보기입니다.'''
+'''아직 저장하지 않았습니다!'''",
+'userjspreview' => "'''ì\82¬ì\9a©ì\9e\90 ì\9e\90ë°\94ì\8a¤í\81¬ë¦½í\8a¸ ë¯¸ë¦¬ ë³´ê¸°ì\9e\85ë\8b\88ë\8b¤.'''
+'''아직 저장하지 않았습니다!'''",
+'sitecsspreview' => "'''이 CSS의 미리 보기일 뿐입니다.'''
+'''아직 저장하지 않았습니다!'''",
+'sitejspreview' => "'''이 자바스크립트 코드의 미리 보기일 뿐입니다.'''
+'''아직 저장하지 않았습니다!'''",
 'userinvalidcssjstitle' => "'''경고''': \"\$1\" 스킨은 없습니다.
 .css와 .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
 'updated' => '(바뀜)',
 'note' => "'''참고:'''",
 'previewnote' => "'''이 화면은 미리 보기입니다.'''
-편집한 내용은 아직 저장ë\90\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤!",
-'continue-editing' => '계속 편집하기',
+편집한 내용은 아직 저장í\95\98ì§\80 ì\95\8aì\95\98ì\8aµë\8b\88ë\8b¤!",
+'continue-editing' => '편집 영역으로 가기',
 'previewconflict' => '이 미리 보기는 저장할 때의 모습으로 위쪽 편집창의 문서를 반영합니다.',
 'session_fail_preview' => "'''세션 데이터가 없어져 편집을 저장하지 못했습니다.'''
 다시 시도하세요.
@@ -1066,7 +1066,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'token_suffix_mismatch' => "'''저장하려는 내용의 문장 부호가 망가져 있습니다.'''
 문서 보호를 위해 해당 내용을 저장하지 않습니다.
 버그가 있는 익명 프록시 서비스 등을 사용할 때 이런 문제가 발생할 수 있습니다.",
-'edit_form_incomplete' => "'''편집의 일부 내용이 서버에 전달되지 않았습니다. 당신의 편집이 손상되지 않았는지 확인하고 다시 시도해 주십시오.'''",
+'edit_form_incomplete' => "'''편집의 일부 내용이 서버에 전달되지 않았습니다. 편집이 손상되지 않았는지 확인하고 다시 시도해 주십시오.'''",
 'editing' => '$1 편집하기',
 'creating' => '$1 만들기',
 'editingsection' => '$1 편집하기 (부분)',
@@ -1078,7 +1078,7 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 \"{{int:savearticle}}\"을 누르면 '''위쪽의 편집 내역만''' 저장됩니다.",
 'yourtext' => '당신의 편집',
 'storedversion' => '현재 문서',
-'nonunicodebrowser' => "'''경고: 당신의 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다.'''
+'nonunicodebrowser' => "'''경고: 웹 브라우저가 유니코드를 완벽하게 지원하지 않습니다.'''
 아스키가 아닌 문자가 16진수 코드로 나타날 수 있습니다.",
 'editingold' => "'''경고: 지금 이전 버전의 문서를 고치고 있습니다.'''
 이것을 저장하면 최근에 편집된 부분이 사라질 수 있습니다.",
@@ -1118,8 +1118,8 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'sectioneditnotsupported-title' => '부분 편집 지원 안됨',
 'sectioneditnotsupported-text' => '이 문서에서는 문단 편집을 지원하지 않습니다.',
 'permissionserrors' => '권한 오류',
-'permissionserrorstext' => '해당 명령을 수행할 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해보세요:',
-'permissionserrorstext-withaction' => '$2 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해주세요:',
+'permissionserrorstext' => '해당 명령을 수행할 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해보세요:',
+'permissionserrorstext-withaction' => '$2 권한이 없습니다. 다음 {{PLURAL:$1|이유}}를 확인해주세요:',
 'recreate-moveddeleted-warn' => "'''경고: 삭제된 적이 있는 문서를 다시 만들고 있습니다.'''
 
 이 문서를 계속 편집하는 것이 적합한 것인지 확인해주세요.
@@ -1136,6 +1136,15 @@ IP 주소는 여러 사용자가 공유할 수 있습니다.
 'edit-already-exists' => '새 문서를 만들 수 없습니다.
 그 문서는 이미 존재합니다.',
 'defaultmessagetext' => '기본 메세지 내용',
+'content-failed-to-parse' => '$1 모델에 대한 $2 내용을 구문 분석하는 데 실패했습니다: $3',
+'invalid-content-data' => '잘못된 내용 데이터입니다',
+'content-not-allowed-here' => '"$1" 내용은 [[$2]] 문서예 허용하지 않습니다',
+
+# Content models
+'content-model-wikitext' => '위키텍스트',
+'content-model-text' => '일반 텍스트',
+'content-model-javascript' => '자바스크립트',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''경고:''' 이 문서는 너무 많은 파서 함수를 포함하고 있습니다.
@@ -1333,7 +1342,7 @@ $1",
 
 # Merge log
 'mergelog' => '병합 기록',
-'pagemerge-logentry' => '사용자가 [[$1]]을 [[$2]]에 병합 ($3판이 위로 옮겨짐)',
+'pagemerge-logentry' => '사용자가 [[$1]]을 [[$2]]에 병합했습니다 ($3판이 위로 옮겨짐)',
 'revertmerge' => '병합 해제',
 'mergelogpagetext' => '다음은 한 문서의 역사를 다른 문서의 역사와 합친 최근 기록입니다.',
 
@@ -1394,8 +1403,6 @@ $1",
 'search-interwiki-caption' => '자매 프로젝트',
 'search-interwiki-default' => '$1 결과:',
 'search-interwiki-more' => '(더 보기)',
-'search-mwsuggest-enabled' => '검색어 제안 있음',
-'search-mwsuggest-disabled' => '검색어 제안 없음',
 'search-relatedarticle' => '관련',
 'mwsuggest-disable' => 'AJAX 검색어 제안 끄기',
 'searcheverything-enable' => '모든 이름공간에서 찾기',
@@ -1408,7 +1415,7 @@ $1",
 'search-nonefound' => '찾기 결과가 없습니다.',
 'powersearch' => '고급 찾기',
 'powersearch-legend' => '고급 찾기',
-'powersearch-ns' => '다음 이름공간에서 찾기:',
+'powersearch-ns' => '다음 이름공간에서 찾기:',
 'powersearch-redir' => '넘겨주기 목록',
 'powersearch-field' => '찾기',
 'powersearch-togglelabel' => '확인:',
@@ -1430,7 +1437,7 @@ $1",
 
 # Preferences page
 'preferences' => '사용자 환경 설정',
-'mypreferences' => '사용자 환경 설정',
+'mypreferences' => '환경 설정',
 'prefs-edits' => '편집 횟수:',
 'prefsnologin' => '로그인하지 않음',
 'prefsnologintext' => '사용자 환경 설정을 바꾸려면 먼저 <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 로그인]</span>해야 합니다.',
@@ -1530,7 +1537,7 @@ HTML 태그를 확인하세요.',
 'prefs-help-realname' => '실명 기입은 자유입니다.
 실명을 입력할 경우 문서 기여에 자신의 이름이 들어가게 됩니다.',
 'prefs-help-email' => '이메일 주소 입력은 선택 사항입니다. 다만 비밀번호를 잊었을 때 비밀번호 바꾸기를 위해 필요합니다.',
-'prefs-help-email-others' => '당신은 자신의 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.
+'prefs-help-email-others' => '자신의 문서나 토론 문서에 있는 이메일 보내기 링크로 다른 사용자가 연락할 수 있게 할 수도 있습니다.
 이 경우에도 당신의 이메일 주소는 다른 사용자가 연락할 때 공개되지 않습니다.',
 'prefs-help-email-required' => '이메일 주소가 필요합니다.',
 'prefs-info' => '기본 정보',
@@ -1570,12 +1577,12 @@ HTML 태그를 확인하세요.',
 'userrights-no-interwiki' => '다른 위키의 사용자 권한을 바꿀 권한이 없습니다.',
 'userrights-nodatabase' => '데이터베이스 $1이 존재하지 않거나 로컬에 있지 않습니다.',
 'userrights-nologin' => '사용자의 권한을 바꾸기 위해서는 반드시 관리자 계정으로 [[Special:UserLogin|로그인]]해야 합니다.',
-'userrights-notallowed' => 'ë\8b¹ì\8b ì\9d\80 ë\8b¤ë¥¸ ì\82¬ì\9a©ì\9e\90ì\9d\98 ê¶\8cí\95\9cì\9d\84 ì¡°ì \95í\95  ê¶\8cí\95\9cì\9d´ ì\97\86ì\8aµë\8b\88ë\8b¤.',
+'userrights-notallowed' => '다른 사용자의 권한을 조정할 권한이 없습니다.',
 'userrights-changeable-col' => '바꿀 수 있는 권한',
 'userrights-unchangeable-col' => '바꿀 수 없는 권한',
 
 # Groups
-'group' => 'ê\8cí\95\9c:',
+'group' => '그룹:',
 'group-user' => '사용자',
 'group-autoconfirmed' => '자동 인증된 사용자',
 'group-bot' => '봇',
@@ -1663,8 +1670,11 @@ HTML 태그를 확인하세요.',
 # User rights log
 'rightslog' => '사용자 권한 기록',
 'rightslogtext' => '사용자 권한 조정 기록입니다.',
-'rightslogentry' => '사용자가 $1의 권한을 $2에서 $3(으)로 바꿈',
+'rightslogentry' => '사용자가 $1의 권한을 $2에서 $3으로 바꾸었습니다',
 'rightslogentry-autopromote' => '사용자의 권한이 자동적으로 $2에서 $3으로 바뀌었습니다.',
+'logentry-rights-rights' => '$1 사용자가 $3 사용자의 권한을 $4에서 $5으로 바꾸었습니다.',
+'logentry-rights-rights-legacy' => '$1 사용자가 $3 사용자의 권한을 바꾸었습니다.',
+'logentry-rights-autopromote' => '$1 사용자의 권한이 자동적으로 $4에서 $5으로 바뀌었습니다.',
 'rightsnone' => '(없음)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1800,12 +1810,12 @@ HTML 태그를 확인하세요.',
 'filetype-banned-type' => '{{PLURAL:$3$4}}\'\'\'".$1"\'\'\' 형식의 파일은 올릴 수 없습니다.
 $2 형식만 사용할 수 있습니다.',
 'filetype-missing' => '파일에 확장자(".jpg" 등)가 없습니다.',
-'empty-file' => '당신이 올린 파일이 비어 있습니다.',
+'empty-file' => '올린 파일이 비어 있습니다.',
 'file-too-large' => '올리려는 파일이 너무 큽니다.',
 'filename-tooshort' => '파일 이름이 너무 짧습니다.',
 'filetype-banned' => '이러한 종류의 파일은 금지되어 있습니다.',
 'verification-error' => '이 파일은 파일 확인 절차를 통과하지 않았습니다.',
-'hookaborted' => '당신이 수정하려고 한 것이 확장 기능 훅에 의해 중지되었습니다.',
+'hookaborted' => '수정하려고 한 것이 확장 기능 훅에 의해 중지되었습니다.',
 'illegal-filename' => '이 파일 이름은 허용되지 않습니다.',
 'overwrite' => '기존 파일을 덮어쓰는 것은 허용되지 않습니다.',
 'unknown-error' => '알 수 없는 오류가 발생했습니다.',
@@ -1821,8 +1831,8 @@ $2 형식만 사용할 수 있습니다.',
 'fileexists' => '같은 이름의 파일이 이미 있습니다. 파일을 바꾸고 싶지 않다면 <strong>[[:$1]]</strong> 파일을 확인해 주세요.
 [[$1|thumb]]',
 'filepageexists' => '이 파일의 설명 문서가 <strong>[[:$1]]</strong>에 존재하지만, 이 이름을 가진 파일이 존재하지 않습니다.
-당신이 입력한 설명은 설명 문서에 반영되지 않을 것입니다.
-당신의 설명을 반영시키려면, 직접 편집하셔야 합니다.
+입력한 설명은 설명 문서에 반영되지 않을 것입니다.
+설명을 반영시키려면, 직접 편집하셔야 합니다.
 [[$1|thumb]]',
 'fileexists-extension' => '비슷한 이름의 파일이 존재합니다: [[$2|thumb]]
 * 올리려는 파일 이름: <strong>[[:$1]]</strong>
@@ -1850,7 +1860,7 @@ $2 형식만 사용할 수 있습니다.',
 'overwroteimage' => '사용자가 "[[$1]]" 파일의 새 판을 올렸습니다.',
 'uploaddisabled' => '올리기 비활성화됨',
 'copyuploaddisabled' => 'URL로 파일 올리기가 비활성화되어 있습니다.',
-'uploadfromurl-queued' => '당신의 올리기 명령이 기록되었습니다.',
+'uploadfromurl-queued' => '올리기 명령이 기록되었습니다.',
 'uploaddisabledtext' => '파일 올리기 기능이 비활성화되어 있습니다.',
 'php-uploaddisabledtext' => 'PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.',
 'uploadscripted' => '이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.',
@@ -1885,7 +1895,7 @@ MGP # 펜탁스
 PICT # 기타
  #</pre> <!-- 이 줄은 그대로 두십시오 -->',
 'upload-success-subj' => '올리기 성공',
-'upload-success-msg' => '파일을 [$2]에서 성공적으로 올렸습니다. 당신이 올린 파일이 여기 있습니다: [[:{{ns:file}}:$1]]',
+'upload-success-msg' => '파일을 [$2]에서 성공적으로 올렸습니다. 올린 파일은 여기 있습니다: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => '올리기 실패',
 'upload-failure-msg' => '[$2]에서 파일을 올리는 중 문제가 발생했습니다:
 
@@ -1915,6 +1925,7 @@ URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세
 'backend-fail-notsame' => '$1 파일과 같은 이름을 가진 다른 파일이 존재합니다.',
 'backend-fail-invalidpath' => '$1 경로가 유효하지 않습니다.',
 'backend-fail-delete' => '$1 파일을 삭제할 수 없습니다.',
+'backend-fail-describe' => '"$1" 파일에 대한 메타데이터를 바꿀 수 없습니다.',
 'backend-fail-alreadyexists' => '$1 파일이 이미 존재합니다.',
 'backend-fail-store' => '$1 파일을 $2 경로에 저장하지 못했습니다.',
 'backend-fail-copy' => '$1 파일을 $2 경로에 복사하지 못했습니다.',
@@ -1975,7 +1986,7 @@ URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세
 https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오.',
 'img-auth-notindir' => '요청한 경로가 설정한 올리기 디렉토리에 없습니다.',
 'img-auth-badtitle' => '"$1"에서 올바른 제목을 만들 수 없습니다.',
-'img-auth-nologinnWL' => 'ë\8b¹ì\8b ì\9d\80 ë¡\9cê·¸ì\9d¸í\95\98ì§\80 ì\95\8aì\95\98ì\9c¼ë©° "$1" í\8c\8cì\9d¼ì\9d\80 í\99\94ì\9d´í\8a¸ë¦¬ì\8a¤í\8a¸ì\97\90 ì¡´ì\9e¬í\95\98ì§\80 ì\95\8aì\8aµë\8b\88ë\8b¤.',
+'img-auth-nologinnWL' => '로그인하지 않았으며 "$1" 파일은 화이트리스트에 존재하지 않습니다.',
 'img-auth-nofile' => '"$1" 파일이 없습니다.',
 'img-auth-isdir' => '"$1" 디렉토리에 접근을 시도했습니다.
 파일에만 접근할 수 있습니다.',
@@ -2033,7 +2044,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'filehist-deleteall' => '모두 삭제',
 'filehist-deleteone' => '삭제',
 'filehist-revert' => '되돌리기',
-'filehist-current' => '최신',
+'filehist-current' => '현재',
 'filehist-datetime' => '날짜/시간',
 'filehist-thumb' => '섬네일',
 'filehist-thumbtext' => '$1 판의 파일',
@@ -2068,7 +2079,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'shared-repo' => '공용 저장소',
 'shared-repo-name-wikimediacommons' => '위키미디어 공용',
 'filepage.css' => '/* 이 CSS 설정은 파일 설명 문서에 포함되며, 또한 해외 클라이언트 위키에 포함됩니다 */',
-'upload-disallowed-here' => 'ì£\84ì\86¡í\95\98ì§\80ë§\8c ì\9d´ ê·¸ë¦¼ì\9d\84 ë\8d®ì\96´ 쓸 수 없습니다.',
+'upload-disallowed-here' => 'ì\9d´ í\8c\8cì\9d¼ì\9d\84 ë\8d®ì\96´쓸 수 없습니다.',
 
 # File reversion
 'filerevert' => '$1 되돌리기',
@@ -2150,7 +2161,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 'disambiguations' => '동음이의 문서를 가리키는 문서 목록',
 'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "다음 문서는 적어도 하나 이상 '''동음이의 문서'''를 가리키고 있습니다.
+'disambiguations-text' => "다음 문서는 적어도 하나 이상 '''동음이의 문서'''를 가리키고 있습니다.
 그 링크는 다른 적절한 문서로 연결할 필요가 있습니다.<br />
 [[MediaWiki:Disambiguationspage]]에서 링크된 틀을 사용하는 문서를 동음이의 문서로 간주합니다.",
 
@@ -2218,7 +2229,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'protectedpages' => '보호된 문서 목록',
 'protectedpages-indef' => '오른쪽 조건에 맞는 보호만 보기',
 'protectedpages-cascade' => '연쇄적 보호만 보기',
-'protectedpagestext' => '다음의 문서는 이동/편집이 불가능하도록 보호되어 있습니다.',
+'protectedpagestext' => '다음 문서는 이동이나 편집이 불가능하도록 보호되어 있습니다.',
 'protectedpagesempty' => '보호되어 있는 문서가 없습니다.',
 'protectedtitles' => '만들기 보호된 표제어 목록',
 'protectedtitlestext' => '다음 표제어는 만들기가 금지되어 있습니다.',
@@ -2239,7 +2250,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'notargettitle' => '해당하는 문서 없음',
 'notargettext' => '기능을 수행할 대상 문서나 사용자를 지정하지 않았습니다.',
 'nopagetitle' => '해당 문서 없음',
-'nopagetext' => '당신이 찾는 문서는 존재하지 않습니다.',
+'nopagetext' => '찾는 문서가 존재하지 않습니다.',
 'pager-newer-n' => '이전 $1개',
 'pager-older-n' => '다음 $1개',
 'suppress' => '오버사이트',
@@ -2248,6 +2259,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 # Book sources
 'booksources' => '책 찾기',
 'booksources-search-legend' => '책 찾기',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => '찾기',
 'booksources-text' => '아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다:',
 'booksources-invalid-isbn' => '입력한 ISBN이 잘못된 것으로 보입니다. 원본과 대조해 보세요.',
@@ -2306,9 +2318,9 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'linksearch-pat' => '찾기 패턴:',
 'linksearch-ns' => '이름공간:',
 'linksearch-ok' => '찾기',
-'linksearch-text' => '"*.wikipedia.org"와 같이 와일드카드를 사용할 수 있습니다.
+'linksearch-text' => '"*.wikipedia.org"와 같이 와일드 카드를 사용할 수 있습니다.
 적어도 "*.org"와 같이 최상위 도메인을 입력해야 합니다.<br />
-지원하는 프로토콜 목록: <code>$1</code> (찾을 때 이것을 추가하지 마세요)',
+지원하는 프로토콜: <code>$1</code> (프로토콜을 지정하지 않을 때 기본값은 http://)',
 'linksearch-line' => '$2에서 $1 을 링크하고 있습니다.',
 'linksearch-error' => '와일드카드는 주소의 처음 부분에만 사용될 수 있습니다.',
 
@@ -2357,12 +2369,12 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'emailuser-title-target' => '이 {{GENDER:$1|사용자}} 이메일',
 'emailuser-title-notarget' => '사용자 이메일',
 'emailpage' => '사용자에게 이메일 보내기',
-'emailpagetext' => '이 사용자가 환경 설정에 올바른 이메일 주소를 적었다면, 아래 양식을 통해 이메일을 보낼 수 있습니다.
-이메일을 받은 사용자가 바로 답장할 수 있도록 하기 위해 당신이 [[Special:Preferences|사용자 환경 설정]]에 적은 이메일 주소가 "발신자" 정보에 들어갑니다. 따라서 수신자가 당신에게 직접 답장을 보낼 수 있습니다.',
-'usermailererror' => 'ë©\94ì\9d¼ ê°\9d체에서 오류 발생:',
+'emailpagetext' => '이 {{GENDER:$1|사용자}}가 환경 설정에 올바른 이메일 주소를 적었다면, 아래 양식을 통해 이메일을 보낼 수 있습니다.
+이메일을 받은 사용자가 바로 답장할 수 있도록 하기 위해 [[Special:Preferences|사용자 환경 설정]]에 적은 이메일 주소가 "발신자" 정보에 들어갑니다. 따라서 수신자가 당신에게 직접 답장을 보낼 수 있습니다.',
+'usermailererror' => 'ë©\94ì\9d¼ ê°\9c체에서 오류 발생:',
 'defemailsubject' => '"$1" 사용자가 보낸 {{SITENAME}} 이메일',
 'usermaildisabled' => '사용자 이메일 비활성화됨',
-'usermaildisabledtext' => '당신은 이 위키에서 다른 사용자에게 메일을 보낼 수 없습니다',
+'usermaildisabledtext' => '이 위키에서 다른 사용자에게 메일을 보낼 수 없습니다',
 'noemailtitle' => '이메일 주소 없음',
 'noemailtext' => '이 사용자는 올바른 이메일 주소를 입력하지 않았습니다.',
 'nowikiemailtitle' => '이메일이 허용되지 않음',
@@ -2386,10 +2398,11 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 # User Messenger
 'usermessage-summary' => '시스템 메시지 남기기',
 'usermessage-editor' => '시스템 메신저',
+'usermessage-template' => 'MediaWiki:UserMessage',
 
 # Watchlist
 'watchlist' => '주시문서 목록',
-'mywatchlist' => '내 주시문서 목록',
+'mywatchlist' => '주시문서 목록',
 'watchlistfor2' => '사용자:$1 $2',
 'nowatchlist' => '주시하는 문서가 아직 없습니다.',
 'watchlistanontext' => '주시문서 목록을 보거나 고치려면 $1 하세요.',
@@ -2425,19 +2438,23 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 
 'enotif_mailer' => '{{SITENAME}} 자동 알림 메일',
 'enotif_reset' => '모든 문서를 방문한 것으로 표시하기',
-'enotif_newpagetext' => '이것은 새 문서입니다.',
 'enotif_impersonal_salutation' => '{{SITENAME}} 사용자',
-'changed' => '바꾸',
-'created' => '만들',
-'enotif_subject' => '{{SITENAME}}에서 $PAGEEDITOR 사용자가 $PAGETITLE 문서를 $CHANGEDORCREATED었습니다.',
-'enotif_lastvisited' => '마지막으로 방문한 뒤 생긴 모든 바뀜 사항을 보려면 $1을(를) 보세요.',
-'enotif_lastdiff' => '이 바뀐 내용을 보려면 $1을 보세요.',
+'enotif_subject_deleted' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 삭제했습니다',
+'enotif_subject_created' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 만들었습니다',
+'enotif_subject_moved' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 옮겼습니다',
+'enotif_subject_restored' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 복구했습니다',
+'enotif_subject_changed' => '{{SITENAME}} $1 문서를 {{gender:$2|$2}} 사용자가 바꾸었습니다',
+'enotif_body_intro_deleted' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 삭제했습니다. 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_created' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 만들었습니다. 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_moved' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 옮겼습니다. 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_restored' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 복구했습니다. 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_body_intro_changed' => '{{SITENAME}} $1 문서를 $PAGEEDITDATE에 {{gender:$2|$2}} 사용자가 바꾸었습니다. 현재 판은 $3 에서 볼 수 있습니다.',
+'enotif_lastvisited' => '마지막으로 방문한 뒤 생긴 모든 바뀜 사항을 보려면 $1 을 보세요.',
+'enotif_lastdiff' => '이 바뀐 내용을 보려면 $1 을 보세요.',
 'enotif_anon_editor' => '익명 사용자 $1',
 'enotif_body' => '$WATCHINGUSERNAME님,
 
-{{SITENAME}}의 $PAGETITLE 문서를 $PAGEEDITDATE에 $PAGEEDITOR님이 $CHANGEDORCREATED었습니다. 현재의 문서는 $PAGETITLE_URL 에서 볼 수 있습니다.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 편집 요약: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2445,8 +2462,7 @@ $NEWPAGE
 이메일: $PAGEEDITOR_EMAIL
 위키: $PAGEEDITOR_WIKI
 
-이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다.
-모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.
+이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다. 모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.
 
 {{SITENAME}} 알림 시스템
 
@@ -2501,8 +2517,8 @@ $UNWATCHURL
 'rollback' => '편집 되돌리기',
 'rollback_short' => '되돌리기',
 'rollbacklink' => '되돌리기',
-'rollbacklinkcount' => '되돌리기 편집 $1회',
-'rollbacklinkcount-morethan' => '되돌리기 편집 $1회 이상',
+'rollbacklinkcount' => '편집 $1회 되돌리기',
+'rollbacklinkcount-morethan' => '편집 $1회 이상 되돌리기',
 'rollbackfailed' => '되돌리기 실패',
 'cantrollback' => '편집을 되돌릴 수 없습니다.
 문서를 편집한 사용자가 한명뿐입니다.',
@@ -2525,10 +2541,10 @@ $UNWATCHURL
 'protectlogpage' => '문서 보호 기록',
 'protectlogtext' => '아래의 목록은 문서 보호에 관한 바뀜 사항에 대한 기록입니다.
 현재 보호된 문서의 목록에 대해서는 [[Special:ProtectedPages|보호된 문서 목록]]을 참고하세요.',
-'protectedarticle' => 'ì\82¬ì\9a©ì\9e\90ê°\80 "[[$1]]" ë¬¸ì\84\9c를 ë³´í\98¸í\95¨',
-'modifiedarticleprotection' => 'ì\82¬ì\9a©ì\9e\90ê°\80 "[[$1]]" ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 ë°\94ê¿\88',
-'unprotectedarticle' => 'ì\82¬ì\9a©ì\9e\90ê°\80 "[[$1]]" ë¬¸ì\84\9c를 ë³´í\98¸ í\95´ì \9cí\95¨',
-'movedarticleprotection' => 'ì\82¬ì\9a©ì\9e\90ê°\80 ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 "[[$2]]"ì\97\90ì\84\9c "[[$1]]"ì\9c¼ë¡\9c ì\98®ê¹\80',
+'protectedarticle' => 'ì\82¬ì\9a©ì\9e\90ê°\80 "[[$1]]" ë¬¸ì\84\9c를 ë³´í\98¸í\96\88ì\8aµë\8b\88ë\8b¤',
+'modifiedarticleprotection' => 'ì\82¬ì\9a©ì\9e\90ê°\80 "[[$1]]" ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 ë°\94꿨ì\8aµë\8b\88ë\8b¤',
+'unprotectedarticle' => 'ì\82¬ì\9a©ì\9e\90ê°\80 "[[$1]]" ë¬¸ì\84\9c를 ë³´í\98¸ í\95´ì \9cí\96\88ì\8aµë\8b\88ë\8b¤',
+'movedarticleprotection' => 'ì\82¬ì\9a©ì\9e\90ê°\80 ë¬¸ì\84\9cì\9d\98 ë³´í\98¸ ì\84¤ì \95ì\9d\84 "[[$2]]"ì\97\90ì\84\9c "[[$1]]"ì\9c¼ë¡\9c ì\98®ê²¼ì\8aµë\8b\88ë\8b¤',
 'protect-title' => '"$1" 보호하기',
 'protect-title-notallowed' => '"$1" 문서의 보호 수준 보기',
 'prot_1movedto2' => '[[$1]] 문서를 [[$2]] 문서로 이동함',
@@ -2619,8 +2635,8 @@ $UNWATCHURL
 'undeletedrevisions' => '판 $1개를 복구했습니다',
 'undeletedrevisions-files' => '판 $1개와 파일 $2개를 복구했습니다.',
 'undeletedfiles' => '파일 $1개를 복구했습니다',
-'cannotundelete' => '복구에 실패했습니다.
-다른 사용자가 이미 복구했을 수도 있습니다.',
+'cannotundelete' => '복구하는 데 실패했습니다:
+$1',
 'undeletedpage' => "'''$1 문서를 복구했습니다.'''
 
 [[Special:Log/delete|삭제 기록]]에서 최근의 삭제와 복구 기록을 볼 수 있습니다.",
@@ -2637,7 +2653,7 @@ $UNWATCHURL
 이미 복구되었을 수 있습니다.',
 'undelete-error' => '문서 복구 중 오류',
 'undelete-error-short' => '파일 복구 오류: $1',
-'undelete-error-long' => '파일을 복구하는  오류가 발생했습니다:
+'undelete-error-long' => '파일을 복구하는 동안 오류가 발생했습니다:
 
 $1',
 'undelete-show-file-confirm' => '정말 "<nowiki>$1</nowiki>" 파일의 삭제된 $2 $3 버전을 보시겠습니까?',
@@ -2652,9 +2668,9 @@ $1',
 'blanknamespace' => '(일반)',
 
 # Contributions
-'contributions' => '사용자 기여',
+'contributions' => '{{GENDER:$1|사용자}} 기여',
 'contributions-title' => '$1 사용자의 기여 목록',
-'mycontris' => '내 기여 목록',
+'mycontris' => '기여 목록',
 'contribsub2' => '$1($2)의 기여',
 'nocontribs' => '이 사용자는 아무 것도 기여하지 않았습니다.',
 'uctop' => '(최신)',
@@ -2678,12 +2694,13 @@ $1',
 'sp-contributions-username' => 'IP 주소 또는 사용자 이름:',
 'sp-contributions-toponly' => '최신판만 보기',
 'sp-contributions-submit' => '찾기',
+'sp-contributions-explain' => '',
 
 # What links here
 'whatlinkshere' => '여기를 가리키는 문서',
 'whatlinkshere-title' => '"$1" 문서를 가리키는 문서 목록',
 'whatlinkshere-page' => '문서:',
-'linkshere' => "다음 문서가 '''[[:$1]]''' 문서를 가리키고 있습니다:",
+'linkshere' => "다음 문서가 '''[[:$1]]''' 문서를 가리키고 있습니다:",
 'nolinkshere' => "'''[[:$1]]''' 문서를 가리키는 문서가 없습니다.",
 'nolinkshere-ns' => "선택한 이름공간에는 '''[[:$1]]''' 문서를 가리키는 문서가 없습니다.",
 'isredirect' => '넘겨주기 문서',
@@ -2695,7 +2712,7 @@ $1',
 'whatlinkshere-hideredirs' => '넘겨주기를 $1',
 'whatlinkshere-hidetrans' => '틀을 $1',
 'whatlinkshere-hidelinks' => '링크를 $1',
-'whatlinkshere-hideimages' => '그림 포함을 $1',
+'whatlinkshere-hideimages' => '파일 링크를 $1',
 'whatlinkshere-filters' => '필터',
 
 # Block/unblock
@@ -2739,7 +2756,7 @@ $1',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] 사용자가 차단되었습니다.<br />
 차단된 사용자 목록은 [[Special:BlockList|여기]]에서 볼 수 있습니다.',
 'ipb-blockingself' => '자기 자신을 차단하려고 합니다! 정말로 실행할까요?',
-'ipb-confirmhideuser' => '당신은 사용자를 차단하면서 "사용자 숨기기" 설정을 선택했습니다. 이로써 모든 기록에서 이 사용자의 사용자 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
+'ipb-confirmhideuser' => '사용자를 차단하면서 "사용자 숨기기" 설정을 선택했습니다. 모든 기록에서 이 사용자의 사용자 이름을 숨기게 됩니다. 정말로 계정을 숨기시겠습니까?',
 'ipb-edit-dropdown' => '차단 이유 목록 편집하기',
 'ipb-unblock-addr' => '$1 차단 해제하기',
 'ipb-unblock' => '사용자 또는 IP 주소 차단 해제하기',
@@ -2775,7 +2792,7 @@ $1',
 'emailblock' => '이메일 차단됨',
 'blocklist-nousertalk' => '자신의 토론 문서 편집 불가',
 'ipblocklist-empty' => '차단된 사용자가 없습니다.',
-'ipblocklist-no-results' => '당신이 입력한 IP 주소나 사용자는 차단되지 않았습니다.',
+'ipblocklist-no-results' => '요청한 IP 주소나 사용자는 차단되지 않았습니다.',
 'blocklink' => '차단',
 'unblocklink' => '차단 해제',
 'change-blocklink' => '차단 설정 바꾸기',
@@ -2788,8 +2805,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 해당 사용자의 차단 기록은 다음과 같습니다:',
 'blocklog-showsuppresslog' => '이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다.
 해당 사용자의 차단 기록은 다음과 같습니다:',
-'blocklogentry' => 'ì\82¬ì\9a©ì\9e\90ê°\80 [[$1]] ì\82¬ì\9a©ì\9e\90를 $2 ì°¨ë\8b¨í\95¨ $3',
-'reblock-logentry' => 'ì\82¬ì\9a©ì\9e\90ê°\80 [[$1]] ì\82¬ì\9a©ì\9e\90ì\9d\98 ì°¨ë\8b¨ ê¸°ê°\84ì\9d\84 $2(ì\9c¼)ë¡\9c ë°\94ê¿\88 $3',
+'blocklogentry' => 'ì\82¬ì\9a©ì\9e\90ê°\80 [[$1]] ì\82¬ì\9a©ì\9e\90를 $2 ì°¨ë\8b¨í\96\88ì\8aµë\8b\88ë\8b¤ $3',
+'reblock-logentry' => 'ì\82¬ì\9a©ì\9e\90ê°\80 [[$1]] ì\82¬ì\9a©ì\9e\90ì\9d\98 ì°¨ë\8b¨ ê¸°ê°\84ì\9d\84 $2(ì\9c¼)ë¡\9c ë°\94꾸ì\97\88ì\8aµë\8b\88ë\8b¤ $3',
 'blocklogtext' => '이 목록은 사용자 차단/차단 해제 기록입니다.
 자동으로 차단된 IP 주소는 여기에 나오지 않습니다.
 [[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.',
@@ -2823,11 +2840,11 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'sorbsreason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.',
 'sorbs_create_account_reason' => '당신의 IP 주소는 {{SITENAME}}에서 사용하는 DNSBL 공개 프록시 목록에 들어 있습니다.
 계정을 만들 수 없습니다.',
-'cant-block-while-blocked' => '신이 차단되어 있는 동안에는 다른 사용자를 차단할 수 없습니다.',
-'cant-see-hidden-user' => '당신이 차단하려 하는 사용자는 이미 차단되었고 숨김 처리되었습니다.
-당신이 사용자 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 바꿀 수 없습니다.',
-'ipbblocked' => '당신은 차단되어 있기 때문에 다른 사용자를 차단하거나 차단을 해제할 수 없습니다.',
-'ipbnounblockself' => '당신은 자기 스스로를 차단 해제할 수 없습니다.',
+'cant-block-while-blocked' => '신이 차단되어 있는 동안에는 다른 사용자를 차단할 수 없습니다.',
+'cant-see-hidden-user' => '차단하려 하는 사용자는 이미 차단되었고 숨김 처리되었습니다.
+사용자 숨기기 권한을 갖고 있지 않기 때문에, 이 사용자의 차단 기록을 보거나 차단 설정을 바꿀 수 없습니다.',
+'ipbblocked' => '자신이 차단되어 있기 때문에 다른 사용자를 차단하거나 차단을 해제할 수 없습니다.',
+'ipbnounblockself' => '자기 스스로를 차단 해제할 수 없습니다.',
 
 # Developer tools
 'lockdb' => '데이터베이스 잠그기',
@@ -2858,10 +2875,10 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 이전의 제목은 새 제목으로 넘겨줄 것입니다.
 원래 이름을 가리키는 넘겨주기를 자동으로 새로 고칠 수 있습니다.
 만약 이 설정을 선택하지 않았다면 [[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©ë\8b\88ë\8b¤.
+넘겨주기 링크가 제대로 향하고 있는지 확인하여야 합니다.
 
-만약 문서의 새 이름으로 된 문서가 존재할 때, 그 문서가 비었거나 넘겨주기 문서이고 문서 역사가 없을 때에만 이동합니다. 그렇지 않을 경우에는 이동하지 '''않습니다'''.
\9d´ê²\83ì\9d\80 ì\8b¤ì\88\98ë¡\9c ì\9d´ë\8f\99í\95\9c ë¬¸ì\84\9c를 ë\90\98ë\8f\8c릴 ì\88\98ë\8a\94 ì\9e\88ì§\80ë§\8c, ì\9d´ë¯¸ ì¡´ì\9e¬í\95\98ë\8a\94 ë¬¸ì\84\9c ì\9c\84ì\97\90 ë\8d®ì\96´ì\94\8cì\9a¸ ì\88\98ë\8a\94 ì\97\86ë\8b¤ë\8a\94 ê²\83을 의미합니다.
+참고로 새 제목으로 된 문서가 이미 있을 때, 비어 있거나 넘겨주기 문서이고 문서 역사가 없을 때에만 이동하며 그렇지 않을 경우에는 이동하지 '''않습니다'''.
\8b¤ì\88\98ë¡\9c ë¬¸ì\84\9c를 ì\98®ê²¼ì\9d\84 ë\95\8c ë\90\98ë\8f\8c릴 ì\88\98ë\8a\94 ì\9e\88ì§\80ë§\8c ì\9d´ë¯¸ ì\9e\88ë\8a\94 ë¬¸ì\84\9c를 ë\8d®ì\96´ì\93¸ ì\88\98 ì\97\86ì\9d\8c을 의미합니다.
 
 '''경고!'''
 인기 있는 문서일 경우 심각하고 예상하지 못한 문제를 초래할 수 있습니다.
@@ -2869,13 +2886,10 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'movepagetext-noredirectfixer' => "아래의 양식을 사용해 문서의 이름을 바꾸고 문서의 모든 역사를 새 이름으로 옮길 수 있습니다.
 이전의 제목은 새 제목으로 넘겨줄 것입니다.
 [[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©ë\8b\88ë\8b¤.
+넘겨주기 링크가 제대로 향하고 있는지 확인하여야 합니다.
 
-참고로 새 제목을 가진 문서가 이미 있다면 다음 경우에 해당하지 않으면 이 문서는 옮겨지지 '''않을''' 것입니다.
-* 비어 있거나,
-* 넘겨주기 문서이며,
-* 과거에 편집 내력이 없는 경우
-이는 당신이 실수로 문서를 옮겼을 때 되돌릴 수 있으며 이미 있는 문서를 덮어쓸 수 없음을 의미합니다.
+참고로 새 제목으로 된 문서가 이미 있을 때, 비어 있거나 넘겨주기 문서이고 문서 역사가 없을 때에만 이동하며 그렇지 않을 경우에는 이동하지 '''않습니다'''.
+실수로 문서를 옮겼을 때 되돌릴 수는 있지만 이미 있는 문서를 덮어쓸 수 없음을 의미합니다.
 
 '''경고!'''
 인기 있는 문서일 경우 심각하고 예상하지 못한 문제를 초래할 수 있습니다.
@@ -2886,7 +2900,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 이 경우에는 문서를 직접 이동하거나 두 문서를 합쳐야 합니다.",
 'movearticle' => '문서 이동하기',
-'moveuserpage-warning' => "'''경고:''' 당신은 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 '''않는다'''는 점을 명심해주시기 바랍니다.",
+'moveuserpage-warning' => "'''경고:''' 사용자 문서를 옮기려 하고 있습니다. 사용자 문서만 이동되며 사용자 이름이 바뀌지 '''않는다'''는 점을 참고해주시기 바랍니다.",
 'movenologin' => '로그인하지 않음',
 'movenologintext' => '문서를 이동하려면 [[Special:UserLogin|로그인]]해야 합니다.',
 'movenotallowed' => '문서를 이동할 권한이 없습니다.',
@@ -2932,6 +2946,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'immobile-target-namespace-iw' => '인터위키 링크를 넘어 문서를 이동할 수 없습니다.',
 'immobile-source-page' => '이 문서는 이동할 수 없습니다.',
 'immobile-target-page' => '새 이름으로 옮길 수 없습니다.',
+'bad-target-model' => '원하는 대상은 다른 내용 모델을 사용합니다. $1에서 $2로 변환할 수 없습니다.',
 'imagenocrossnamespace' => '파일을 파일이 아닌 이름공간으로 옮길 수 없습니다.',
 'nonfile-cannot-move-to-file' => '파일이 아닌 문서를 파일 이름공간으로 옮길 수 없습니다.',
 'imagetypemismatch' => '새 파일의 확장자가 원래의 확장자와 일치하지 않습니다.',
@@ -2944,7 +2959,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 최근 기록 내용을 참고용로 제공합니다:",
 'move-over-sharedrepo' => '== 파일이 존재함 ==
 [[:$1]] 파일이 공용 저장소에 있습니다. 이 이름으로 파일을 옮기면 공용의 파일을 덮어쓰게 될 것입니다.',
-'file-exists-sharedrepo' => '당신이 선택한 파일 이름은 공용 저장소에서 사용 중입니다.
+'file-exists-sharedrepo' => '선택한 파일 이름은 공용 저장소에서 사용 중입니다.
 다른 이름을 선택해주세요.',
 
 # Export
@@ -3061,7 +3076,6 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # JavaScriptTest
 'javascripttest' => '자바스크립트 테스트',
-'javascripttest-disabled' => '이 기능은 비활성되어 있습니다.',
 'javascripttest-title' => '$1 테스트 실행',
 'javascripttest-pagetext-noframework' => '이 페이지는 자바스크립트 테스트를 실행하기 위한 용도로 할당되어 있습니다.',
 'javascripttest-pagetext-unknownframework' => '실험용 프레임워크 "$1"를 알 수 없습니다.',
@@ -3118,7 +3132,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-ca-nstab-main' => '문서 내용을 봅니다.',
 'tooltip-ca-nstab-user' => '사용자 문서 내용을 봅니다.',
 'tooltip-ca-nstab-media' => '미디어 문서 내용을 봅니다.',
-'tooltip-ca-nstab-special' => '이것은 특수 문서로, 편집할 수 없습니다.',
+'tooltip-ca-nstab-special' => '이 문서는 특수 문서로, 편집할 수 없습니다.',
 'tooltip-ca-nstab-project' => '프로젝트 문서 내용을 봅니다.',
 'tooltip-ca-nstab-image' => '파일 문서 내용을 봅니다.',
 'tooltip-ca-nstab-mediawiki' => '시스템 메시지 내용을 봅니다.',
@@ -3202,6 +3216,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 
 # Info page
 'pageinfo-title' => '"$1" 문서에 대한 정보',
+'pageinfo-not-current' => '죄송합니다, 이전 판에 대한 정보는 제공하지 않습니다.',
 'pageinfo-header-basic' => '기본 정보',
 'pageinfo-header-edits' => '편집 역사',
 'pageinfo-header-restrictions' => '문서 보호',
@@ -3210,6 +3225,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-default-sort' => '기본 정렬 키',
 'pageinfo-length' => '문서 길이 (바이트)',
 'pageinfo-article-id' => '문서 ID',
+'pageinfo-language' => '문서 내용 언어',
 'pageinfo-robot-policy' => '검색 엔진 통계',
 'pageinfo-robot-index' => '색인 가능',
 'pageinfo-robot-noindex' => '색인 불가능',
@@ -3225,12 +3241,19 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'pageinfo-lasttime' => '최근 편집 날짜',
 'pageinfo-edits' => '총 편집 수',
 'pageinfo-authors' => '총 서로 다른 편집자 수',
-'pageinfo-recent-edits' => '최근 편집 수 (지난 $1 이내)',
+'pageinfo-recent-edits' => '최근 편집 수 (지난 $1 이내)',
 'pageinfo-recent-authors' => '최근 기여자 수',
-'pageinfo-restriction' => '문서 보호 ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '매직 {{PLURAL:$1|워드}} ($1개)',
 'pageinfo-hidden-categories' => '숨은 {{PLURAL:$1|분류}} ($1개)',
 'pageinfo-templates' => '포함한 {{PLURAL:$1|틀}} ($1개)',
+'pageinfo-toolboxlink' => '문서 정보',
+'pageinfo-redirectsto' => '넘겨주기 대상',
+'pageinfo-redirectsto-info' => '정보',
+'pageinfo-contentpage' => '내용 문서로 집계',
+'pageinfo-contentpage-yes' => '예',
+'pageinfo-protect-cascading' => '여기서의 연쇄적 보호',
+'pageinfo-protect-cascading-yes' => '예',
+'pageinfo-protect-cascading-from' => '연쇄적 보호한 기점',
 
 # Skin names
 'skinname-standard' => '클래식',
@@ -3253,6 +3276,8 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'markedaspatrollederror' => '검토한 것으로 표시할 수 없습니다.',
 'markedaspatrollederrortext' => '검토한 것으로 표시할 판을 지정해야 합니다.',
 'markedaspatrollederror-noautopatrol' => '자신의 편집은 스스로 검토할 수 없습니다.',
+'markedaspatrollednotify' => '$1에 대한 바뀜을 검토한 것으로 표시했습니다.',
+'markedaspatrollederrornotify' => '검토한 것으로 표시를 실패했습니다.',
 
 # Patrol log
 'patrol-log-page' => '검토 기록',
@@ -3316,6 +3341,7 @@ $1',
 'hours' => '$1시간',
 'days' => '$1일',
 'ago' => '$1 전',
+'just-now' => '방금',
 
 # Bad image list
 'bad_image_list' => '형식은 아래와 같습니다.
@@ -3831,10 +3857,11 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[인터위키가 비활성되어 있습니다]',
 'scarytranscludefailed' => '[$1 틀을 불러오는 데에 실패했습니다]',
+'scarytranscludefailed-httpstatus' => '[$1 틀을 가져오는 데 실패했습니다: HTTP $2]',
 'scarytranscludetoolong' => '[URL이 너무 깁니다]',
 
 # Delete conflict
-'deletedwhileediting' => "'''경고''': 당신이 이 문서를 편집하던 중에 이 문서가 삭제되었습니다!",
+'deletedwhileediting' => "'''경고''': 이 문서를 편집하던 중에 이 문서가 삭제되었습니다!",
 'confirmrecreate' => '[[User:$1|$1]] 사용자([[User talk:$1|토론]])가 당신이 편집하는 도중에 문서를 삭제했습니다. 삭제 이유는 다음과 같습니다:
 : $2
 문서를 다시 만들어야 하는지 확인해주세요.',
@@ -3941,7 +3968,8 @@ $5
 'version-version' => '(버전 $1)',
 'version-license' => '라이선스',
 'version-poweredby-credits' => "이 위키는 '''[//www.mediawiki.org/ MediaWiki]'''를 기반으로 작동합니다. Copyright © 2001-$1 $2.",
-'version-poweredby-others' => '[{{SERVER}}{{SCRIPTPATH}}/CREDITS 그 외 다른 개발자]',
+'version-poweredby-others' => '그 외 다른 개발자',
+'version-credits-summary' => '우리는 [[Special:Version|미디어위키]]에 기여한 다음 사람한테 감사드립니다.',
 'version-license-info' => "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.
 
 미디어위키가 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참고하십시오.
@@ -4027,9 +4055,9 @@ $5
 'compare-rev1' => '첫 번째 판',
 'compare-rev2' => '두 번째 판',
 'compare-submit' => '비교하기',
-'compare-invalid-title' => '당신이 입력한 제목이 잘못되었습니다.',
-'compare-title-not-exists' => '당신이 입력한 문서가 존재하지 않습니다.',
-'compare-revision-not-exists' => '당신이 지정한 판이 없습니다.',
+'compare-invalid-title' => '입력한 제목이 잘못되었습니다.',
+'compare-title-not-exists' => '입력한 문서가 존재하지 않습니다.',
+'compare-revision-not-exists' => '지정한 판이 없습니다.',
 
 # Database error messages
 'dberr-header' => '이 위키에 문제가 있습니다.',
@@ -4042,12 +4070,12 @@ $5
 'dberr-cachederror' => '다음은 요청한 문서의 캐시된 복사본이며, 최신이 아닐 수도 있습니다.',
 
 # HTML forms
-'htmlform-invalid-input' => '당신이 입력한 값에 문제가 있습니다.',
-'htmlform-select-badoption' => '당신이 입력한 값은 올바른 설정이 아닙니다.',
-'htmlform-int-invalid' => '당신이 입력한 값은 정수가 아닙니다.',
-'htmlform-float-invalid' => 'ì\9e\85ë ¥í\95\9c ê°\92ì\9d´ 수가 아닙니다.',
-'htmlform-int-toolow' => '당신이 입력한 값은 최소값 $1 미만입니다.',
-'htmlform-int-toohigh' => '당신이 입력한 값은 최대값 $1 이상입니다.',
+'htmlform-invalid-input' => '입력한 값에 문제가 있습니다.',
+'htmlform-select-badoption' => '지정한 값은 올바른 설정이 아닙니다.',
+'htmlform-int-invalid' => '지정한 값은 정수가 아닙니다.',
+'htmlform-float-invalid' => 'ì§\80ì \95í\95\9c ê°\92ì\9d\80 수가 아닙니다.',
+'htmlform-int-toolow' => '지정한 값은 최소값 $1 미만입니다.',
+'htmlform-int-toohigh' => '지정한 값은 최대값 $1 이상입니다.',
 'htmlform-required' => '이 값은 필수 항목입니다',
 'htmlform-submit' => '저장',
 'htmlform-reset' => '바꾼 것을 되돌리기',
@@ -4058,8 +4086,8 @@ $5
 'sqlite-no-fts' => '$1 (본문은 찾기에서 제외)',
 
 # New logging system
-'logentry-delete-delete' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 ì\82­ì \9cí\95\98ì\98\80습니다.',
-'logentry-delete-restore' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 ë³µêµ¬í\95\98ì\98\80습니다.',
+'logentry-delete-delete' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 ì\82­ì \9cí\96\88습니다.',
+'logentry-delete-restore' => '$1 ì\82¬ì\9a©ì\9e\90ê°\80 $3 ë¬¸ì\84\9c를 ë³µêµ¬í\96\88습니다.',
 'logentry-delete-event' => '$1 사용자가 $3의 기록 $5개에 대해 보이기 설정을 바꾸었습니다: $4',
 'logentry-delete-revision' => '$1 사용자가 $3 문서의 {{PLURAL:$5|$5개 편집}}의 설정을 바꾸었습니다: $4',
 'logentry-delete-event-legacy' => '$1 사용자가 $3 문서 기록의 보이기 설정을 바꾸었습니다.',
@@ -4083,9 +4111,9 @@ $5
 'logentry-move-move_redir-noredirect' => '$1 사용자가 $3 문서를 $4 문서로 넘겨주기를 남기지 않으면서 옮기면서 옮길 대상에 있던 넘겨주기를 덮어썼습니다.',
 'logentry-patrol-patrol' => '$1 사용자가 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
 'logentry-patrol-patrol-auto' => '$1 사용자가 자동적으로 $3 문서의 $4판을 검토한 것으로 표시했습니다.',
-'logentry-newusers-newusers' => '$1 사용자 계정을 만들었습니다.',
-'logentry-newusers-create' => '$1 사용자 계정을 만들었습니다.',
-'logentry-newusers-create2' => '$1 사용자가 $3 계정을 만들었습니다.',
+'logentry-newusers-newusers' => '$1 사용자 계정을 만들었습니다.',
+'logentry-newusers-create' => '$1 사용자 계정을 만들었습니다.',
+'logentry-newusers-create2' => '$1 사용자가 $3 사용자 계정을 만들었습니다.',
 'logentry-newusers-autocreate' => '$1 사용자 계정을 자동적으로 만들었습니다.',
 'newuserlog-byemail' => '이메일로 보낸 비밀번호',
 
@@ -4105,28 +4133,32 @@ $5
 'feedback-bugcheck' => '감사합니다! 혹시 해당 사항이 [$1 기존의 버그 보고서]에 올라와 있는지 확인해주세요.',
 'feedback-bugnew' => '확인했습니다. 새로운 버그 보고서를 작성합니다.',
 
+# Search suggestions
+'searchsuggest-search' => '찾기',
+'searchsuggest-containing' => '다음 어구가 들어간 문서 찾기',
+
 # API errors
-'api-error-badaccess-groups' => '당신은 이 위키에 파일을 올릴 권한이 없습니다.',
+'api-error-badaccess-groups' => '이 위키에 파일을 올릴 권한이 없습니다.',
 'api-error-badtoken' => '내부 오류: 토큰이 잘못되었습니다.',
 'api-error-copyuploaddisabled' => '이 서버에서 URL을 통해 파일 올리기가 비활성화되어 있습니다.',
 'api-error-duplicate' => '이 위키에 내용이 똑같은 {{PLURAL:$1|[$2 다른 파일]}}이 있습니다.',
 'api-error-duplicate-archive' => '같은 내용을 담고 있던 {{PLURAL:$1|[$2 다른 파일]}}이 있었지만 이 {{PLURAL:$1|파일}}은 삭제되었습니다.',
 'api-error-duplicate-archive-popup-title' => '중복된 {{PLURAL:$1|파일}}이 이미 삭제되었습니다.',
 'api-error-duplicate-popup-title' => '중복된 {{PLURAL:$1|파일}}입니다.',
-'api-error-empty-file' => '당신이 올리려는 파일이 비어 있습니다.',
+'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-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-hookaborted' => '수정하려고 한 것이 확장 기능에 의해 중지되었습니다.',
 'api-error-http' => '내부 오류: 서버에 연결할 수 없습니다.',
 'api-error-illegal-filename' => '이 파일 이름을 사용할 수 없습니다.',
-'api-error-internal-error' => '내부 오류: 당신이 올린 파일을 위키에서 처리하는 중 문제가 발생했습니다.',
+'api-error-internal-error' => '내부 오류: 올린 파일을 위키에서 처리하는 중 어떤 문제가 발생했습니다.',
 'api-error-invalid-file-key' => '내부 오류: 임시 저장소에서 파일을 찾지 못했습니다.',
 'api-error-missingparam' => '내부 오류: 요청 중 매개변수가 누락되었습니다.',
 'api-error-missingresult' => '내부 오류: 파일의 복제가 성공했는지 판단할 수 없습니다.',
@@ -4157,4 +4189,6 @@ $5
 'duration-centuries' => '$1{{PLURAL:$1|세기}}',
 'duration-millennia' => '$1{{PLURAL:$1|천년}}',
 
+# Unknown messages
+'svg-long-error' => '잘못된 SVG 파일: $1',
 );
index 30fdfcb..833cdf9 100644 (file)
@@ -343,8 +343,6 @@ $messages = array(
 'search-interwiki-caption' => 'Вачкисян проекттэз',
 'search-interwiki-default' => '$1 результат:',
 'search-interwiki-more' => '(унажык)',
-'search-mwsuggest-enabled' => 'öтсöттэзöн',
-'search-mwsuggest-disabled' => 'öтсöттэзтöг',
 'searchall' => 'быдöс',
 'nonefound' => "'''Пасйöт.''' Он кö нагладь шуан,  кытiсь кошшыны,  шедасö не быдöс тексттэз, кытöн пантасьö колан кылыс. Мед кошшыны быдöс тексттэзiсь (уджкериссез листбоккезiсь,  шаболоннэзiсь дмд.), гиж ''all:'',  нето утлянно мыччав,  кытiсь кошшыны.",
 'powersearch' => 'Паськытжыка кошшан',
index d457a15..4f1072c 100644 (file)
@@ -43,9 +43,9 @@ $messages = array(
 # User preference toggles
 'tog-underline' => 'Джибериулени черт:',
 'tog-justify' => 'Текстни бетни кенглигине кёре тиз',
-'tog-hideminor' => 'Ð\94жангÑ\8b Ñ\82Ñ\8eÑ\80лениÑ\83лени Ñ\81пиÑ\81огÑ\83нда гитче тюрлениулени кёргюзме',
-'tog-hidepatrolled' => 'Ð\94жангÑ\8b Ñ\82Ñ\8eÑ\80лениÑ\83лени Ñ\81пиÑ\81огÑ\83нда тинтилген тюрлениулени кёргюзме',
-'tog-newpageshidepatrolled' => 'Ð\94жангÑ\8b Ð±ÐµÑ\82лени Ñ\81пиÑ\81огÑ\83нда тинтилген бетлени кёргюзме',
+'tog-hideminor' => 'Ð\94жангÑ\8b Ñ\82Ñ\8eÑ\80лениÑ\83лени Ñ\82измеÑ\81инде гитче тюрлениулени кёргюзме',
+'tog-hidepatrolled' => 'Ð\94жангÑ\8b Ñ\82Ñ\8eÑ\80лениÑ\83лени Ñ\82измеÑ\81инде тинтилген тюрлениулени кёргюзме',
+'tog-newpageshidepatrolled' => 'Ð\94жангÑ\8b Ð±ÐµÑ\82лени Ñ\82измеÑ\81инде тинтилген бетлени кёргюзме',
 'tog-extendwatchlist' => 'Кёзде тургъан тизмени, къуру ахыр тюл, бютеу тюрлениулени кёрюр ючюн кенгерт',
 'tog-usenewrc' => 'Ахыр тюрлениуледе эм кёздеги тизмеде бетлени къауум тюрлениулери (JavaScript керекди)',
 'tog-numberheadings' => 'Башлыкъланы (бёлюмлени атлары) автомат номерленсинле',
@@ -55,17 +55,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Бёлюмлени бёлюм башлыкъгъа басханлай тюрлендириу бетин ач',
 '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' => 'Кёзюмде тургъан тизмемдеги бетлени тюрлениулерин E-mail бла билдир',
+'tog-enotifwatchlistpages' => 'Кёзюмде тургъан тизмемдеги бетлени неда файлланы тюрлениулерин E-mail бла билдир',
 'tog-enotifusertalkpages' => 'E-mail бла билдир энчи бетими тюрлениулерин',
-'tog-enotifminoredits' => 'E-mail бла гитче тюрлениуле огъуна болсалада бирдир',
+'tog-enotifminoredits' => 'Бетлени неда файлланы гитче тюрлениулерин огъуна E-mail бла',
 'tog-enotifrevealaddr' => 'E-mail адресими билдириу письмолада кёргюз',
 'tog-shownumberswatching' => 'Бетни, кёзде тургъан тизмелерине къошханланы санын кёргюз',
 'tog-oldsig' => 'Бусагъатдагъы къол салыннган:',
@@ -100,18 +100,18 @@ $messages = array(
 # Dates
 'sunday' => 'Ыйых кюн',
 'monday' => 'Баш кюн',
-'tuesday' => 'Геурге кюн',
-'wednesday' => 'Барас кюн',
+'tuesday' => 'Гюрге кюн',
+'wednesday' => 'Бараз кюн',
 'thursday' => 'Орта кюн',
 'friday' => 'Байрым кюн',
 'saturday' => 'Шабат кюн',
-'sun' => 'Ыйых кюн',
-'mon' => 'Баш кюн',
-'tue' => 'Геурге кюн',
-'wed' => 'Барас кюн',
-'thu' => 'Орта кюн',
-'fri' => 'Байрым кюн',
-'sat' => 'ШабаÑ\82 ÐºÑ\8eн',
+'sun' => 'Ый',
+'mon' => 'Бш',
+'tue' => 'Гр',
+'wed' => 'Брз',
+'thu' => 'Орт',
+'fri' => 'Брм',
+'sat' => 'Шб',
 'january' => 'январь',
 'february' => 'февраль',
 'march' => 'март',
@@ -168,13 +168,13 @@ $messages = array(
 'noindex-category' => 'Индексленмеген бетле',
 'broken-file-category' => 'Ишлемеген файл джибериулери болгъан бетле',
 
-'about' => 'Ð\90Ñ\87Ñ\8bкÑ\8aлау',
+'about' => 'СÑ\83Ñ\80аÑ\82лау',
 'article' => 'Статья',
 'newwindow' => '(джангы терезеде ачылады)',
 'cancel' => 'Ызына алыу',
 'moredotdotdot' => 'Баргъаны…',
-'mypage' => 'ЭнÑ\87и Ð±ÐµÑ\82им',
-'mytalk' => 'Сюзюу бетим',
+'mypage' => 'Ð\91еÑ\82',
+'mytalk' => 'Сюзюу',
 'anontalk' => 'Бу IP-адресге сюзюу бет',
 'navigation' => 'Навигация',
 'and' => '&#32;эм',
@@ -184,7 +184,6 @@ $messages = array(
 'qbbrowse' => 'Къарау',
 'qbedit' => 'Тюрлендир',
 'qbpageoptions' => 'Бу бет',
-'qbpageinfo' => 'Бетни юсюнден',
 'qbmyoptions' => 'Бетлерим',
 'qbspecialpages' => 'Къуллукъчу бетле',
 'faq' => 'FAQ',
@@ -197,16 +196,17 @@ $messages = array(
 'vector-action-protect' => 'Джакъла',
 'vector-action-undelete' => 'Къайтар',
 'vector-action-unprotect' => 'Джакълауну тюрлендир',
-'vector-simplesearch-preference' => 'Ð\9aенглеÑ\88ген Ð¸Ð·Ð»ÐµÑ\83де Ð±Ð¾Ð»Ñ\83Ñ\88лÑ\83кÑ\8aланÑ\8b Ð´Ð¶Ð°Ð½Ð´Ñ\8bÑ\80 (кÑ\8aÑ\83Ñ\80Ñ\83 Ð\92екÑ\82оÑ\80 мотив ючюн)',
+'vector-simplesearch-preference' => 'ТÑ\8bнÑ\87 Ð¸Ð·Ð»ÐµÑ\83де Ð±Ð¾Ð»Ñ\83Ñ\88лÑ\83кÑ\8aланÑ\8b Ð´Ð¶Ð°Ð½Ð´Ñ\8bÑ\80 (кÑ\8aÑ\83Ñ\80Ñ\83 Â«Ð\92екÑ\82оÑ\80» мотив ючюн)',
 'vector-view-create' => 'Къура',
 'vector-view-edit' => 'Тюрлендир',
 'vector-view-history' => 'Тарихин кёргюз',
 'vector-view-view' => 'Окъу',
 'vector-view-viewsource' => 'Кодха къара',
-'actions' => 'Этимле',
+'actions' => 'Этиуле',
 'namespaces' => 'Атланы аламы',
 'variants' => 'Вариантла',
 
+'navigation-heading' => 'Навигация меню',
 'errorpagetitle' => 'Халат',
 'returnto' => '«$1» бетге къайт',
 'tagline' => '{{SITENAME}} сайтдан',
@@ -217,7 +217,7 @@ $messages = array(
 'searcharticle' => 'Кёч',
 'history' => 'Бетни тарихи',
 'history_short' => 'Тарих',
-'updatedmarker' => 'Ахыр киргенимден сора джангыргъан',
+'updatedmarker' => 'Ахыр киргенимден сора джангыргъанды',
 'printableversion' => 'Басмагъа версиясы',
 'permalink' => 'Дайым джибериу',
 'print' => 'Басмала',
@@ -273,7 +273,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' => '{{SITENAME}} сайтны юсюнден',
-'aboutpage' => 'Project:Ð\90Ñ\87Ñ\8bкÑ\8aлау',
+'aboutpage' => 'Project:СÑ\83Ñ\80аÑ\82лау',
 'copyright' => 'Информация мунга кёре хайырланады: $1',
 'copyrightpage' => '{{ns:project}}:Авторлукъ хакъла',
 'currentevents' => 'Бусагъатда бола тургъанла',
@@ -303,6 +303,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' => 'тюрлендир',
@@ -316,7 +320,7 @@ $1',
 'collapsible-collapse' => 'джашыр',
 'collapsible-expand' => 'кёргюз',
 'thisisdeleted' => '$1 къараргъа неда къайтарыргъа (тургъузтургъа)?',
-'viewdeleted' => '$1къараймыса?',
+'viewdeleted' => '$1 къараймыса?',
 'restorelink' => 'кетерилген {{PLURAL:$1|1|$1}} тюрлендириу',
 'feedlinks' => 'Бу кёрюмде:',
 'feed-invalid' => 'Джазылыу каналны типи терсди.',
@@ -349,7 +353,7 @@ $1',
 'nosuchspecialpage' => 'Быллай къуллукъ бет джокъду',
 'nospecialpagetext' => '<strong>Сиз излеген къуллукъ бет джокъду.</strong>
 
\91олгÑ\8aан ÐºÑ\8aÑ\83ллÑ\83кÑ\8a Ð±ÐµÑ\82лени Ñ\81пиÑ\81огÑ\83: [[Special:SpecialPages|{{int:specialpages}}]].',
\91олгÑ\8aан ÐºÑ\8aÑ\83ллÑ\83кÑ\8a Ð±ÐµÑ\82лени Ñ\82измеÑ\81и: [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
 'error' => 'Халат',
@@ -357,9 +361,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»
@@ -395,6 +399,8 @@ $1',
 'cannotdelete' => '«$1» файлны неда бетни кетерирге болмайды.
 Башха къошулуучу кетерген болургъа боллукъду аны.',
 'cannotdelete-title' => '«$1» бетни кетерирге болмайды',
+'delete-hook-aborted' => 'Тюрлениу тохтатыучу процедура бла ызына алынды.
+Ачыкълау берилмегенди.',
 'badtitle' => 'Джарамагъан ат',
 'badtitletext' => 'Сорулгъан бетни аты терсди, бошду, неда интервики аты терс джазылгъанды. Келишмеген (хайырланыргъа болмагъан) символла хайырланыргъада боллукъдула атында.',
 'perfcached' => 'Бу информация кэшден алыннганды, ахыр тюрлениулени кёргюзмезге боллукъду. Кэшде максимум {{PLURAL:$1|джазыу}} сакъланады.',
@@ -410,15 +416,26 @@ $1',
 'actionthrottledtext' => 'Спамгъа къаршчы кюрешиуню себебинден, аз заманны ичинде бу амал бла кёб кере хайырланыу тыйылыбды. Кечирек джангыдан кёрюгюз.',
 'protectedpagetext' => 'Бу бет тюрлендириуге джабылыбды.',
 'viewsourcetext' => 'Сиз бу бетни башланнган текстине къараргъа эм аны копия этерге боллукъсуз:',
-'protectedinterface' => 'Бу бетде программаны интерфейс билдириую барды. Вандализмге къаршчы кюрешиу себебли, бу бетни тюрлендириу джабылыбды.',
-'editinginterface' => "'''Эс бёлюгюз:'''  Сиз MediaWiki системаны интерфейс бетин тюрлендире турасыз. Бу башха къошулуучулагъ да тиерик затды. Кёчюрюр ючюн [//translatewiki.net/wiki/Main_Page?setlang=ru translatewiki.net] локализация этиу проектни хайырландырыгъыз.",
+'viewyourtext' => "Бу бетде '''кесигизни тюрлендириулеригизни''' къайнакъ текстине къараргъа эм копия этерге боллукъсуз:",
+'protectedinterface' => 'Бу бетде программаны интерфейс билдириую барды.
+Бютеу викиледе да бу билдириуню кёчюрмесин къошар неда тюрлендирир ючюн MediaWiki-ни локализациясыны сайты [//translatewiki.net/ translatewiki.net]-ни хайырландырыгъыз.',
+'editinginterface' => "'''Эс бёл:''' Сен системаны интерфейс бетин тюрлендире тураса. Бу, викини башха къошулуучуларына да тиерик затды. Кёчюрюр ючюн неда кёчюрмелени тюрлендирир ючюн, MediaWiki-ни локализация этиу проекти [//translatewiki.net/ translatewiki.net]-ни хайырландырыгъыз.",
 'sqlhidden' => '(SQL соруу джашырылыбды)',
 'cascadeprotected' => 'Бу бет тюрлениуледен джакъланыбды, ол каскадлы джакълау къабыл этилиннген  {{PLURAL:$1|бетге|бетлеге}} киргени ючюндю:
 $2',
 'namespaceprotected' => '«$1» ат аламда бетлени тюрлендирирге эркинлигигиз джокъду.',
+'customcssprotected' => 'Бу CSS-бетни тюрлендирирге эркинлигигиз джокъду, бу бетде башха къошулуучуну энчи джарашдырыулары барды.',
+'customjsprotected' => 'Бу JavaScript-бетни тюрлендирирге эркинлигигиз джокъду, бу бетде башха къошулуучуну энчи джарашдырыулары барды.',
 'ns-specialprotected' => '«{{ns:special}}» ат аламны бетлерин тюрлендирирге болмайды.',
 'titleprotected' => "Быллай атлы бет къураргъа [[User:$1|$1]]  къоймайды.
 Белгиленнген чурум: ''$2''.",
+'filereadonlyerror' => "«$2» гезен «къуру окъур ючюн» режимде болгъаны себебли «$1» файл тюрленмейди.
+
+Бу режимни салгъан администратор бу ангылатыуну къойгъанды: «''$3''».",
+'invalidtitle-knownnamespace' => '«$2» ат аламы бла эм «$3» тексти бла джарамагъан башлыкъ.',
+'invalidtitle-unknownnamespace' => '$1 белгили болмагъан алам номери бла эм «$2» тексти бла джарамагъан башлыкъ',
+'exception-nologin' => 'Авторизацияны ётмегенсиз',
+'exception-nologin-text' => 'Бу бетге къарар ючюн неда сорулгъан ишни этер ючюн авторизацияны ётерге керекди.',
 
 # Virus scanner
 'virus-badscanner' => "Джарашдырыуну хатасы. Белгисиз вирус сканер: ''$1''",
@@ -428,17 +445,18 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Аккаунтугъуздан чыкъдыгъыз.'''
 
-Сиз {{SITENAME}} сайтда аноним халда къалыргъа боллкъсуз. неда [[Special:UserLogin|джангыдан кирирге]].
+Сиз {{SITENAME}} сайтда аноним халда къалыргъа боллкъсуз. неда <span class='plainlinks'>[$1 джангыдан кирирге]</span>.
 Талай бетле сиз тергеу джазыу (аккаунт) бла киргенча кёрюнюрге боллукъдула, аны кетерир ючюн кэшни джангыртыгъыз.",
-'welcomecreation' => '== Хош келигиз, $1!  ==
-Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
-Сайтны [[Special:Preferences|персонал джарашдырыуларыны]]  къараргъа унутмагъыз.',
+'welcomeuser' => 'Сау кел, $1!',
+'welcomecreation-msg' => 'Сизни тергеу джазыуугъуз (аккаунтугъуз) къуралды.
+{{SITENAME}} сайтда [[Special:Preferences|джарашдырыуларыгъызны]] тюрлендирирге унутмагъыз.',
 'yourname' => 'Къошулуучуну аты',
 'yourpassword' => 'Паролюгъуз:',
 'yourpasswordagain' => 'Паролну джангыдан джаз:',
 'remembermypassword' => 'Бу компьютерде мени тергеў джазыўуму унутма (эм кёб $1 {{PLURAL:$1|кюн|кюн}})',
 'securelogin-stick-https' => 'Чыкъгъандан сора да HTTPS бла байламлы къой',
 'yourdomainname' => 'Сизни доменигиз:',
+'password-change-forbidden' => 'Бу викиде паролугъузну тюрлендиреллик тюлсюз.',
 'externaldberror' => 'Тыш информация базаны болушлугъу бла аутентификация, халатлы болду, неда тыш аккаунтугъузну тюрлендирирге хакъларагъыз джетмейди.',
 'login' => 'Кириу',
 'nav-login-createaccount' => 'Кириу / регистрация этиу',
@@ -463,6 +481,8 @@ $2',
 'createaccounterror' => 'Быллай тергеу джазыу (аккаунт) къураргъа болмайды: $1',
 'nocookiesnew' => 'Къошлуучу регистрацияны ётгенди, алай кирмегенди. {{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хайырландырады. Сиз «cookies»-ни эркин этмегенсиз. «Cookies»-ни эркин этигиза да, андан сора джангы атыгъыз эм паролюгъуз бла киригиз.',
 'nocookieslogin' => '{{SITENAME}} къошулуучуланы таныр ючюн «cookies»-ни хаырландырады. Сиз аны джукълатыб турасыз. «Cookies»-ни эркин этигизда джангыдан кёрюгюз.',
+'nocookiesfornew' => 'Къайнагъын тинтир амал болмагъаны себебли тергеу джазыу къуралмады.
+«Cookies» ачыкъ болгъанына ишексиз болугъуз, бетни джангыртыгъыз эм энтда бир кере кёрюгюз.',
 'noname' => 'Терс атны джазгъансыз.',
 'loginsuccesstitle' => 'Авторизация тыйыншлы ётдю',
 'loginsuccess' => "'''Энди {{SITENAME}} сайтха «$1» ат бла кирдигиз.'''",
@@ -476,6 +496,7 @@ $2',
 'wrongpasswordempty' => 'Пароль джазылмай къалгъанды. Джангыдан кёрюгюз.',
 'passwordtooshort' => '$1 {{PLURAL:$1|символдан}} аз болмазгъа керекди пароль.',
 'password-name-match' => 'Пароль къошулуучу атдан башха тюрлю болургъа керекди.',
+'password-login-forbidden' => 'Бу къошулуучу ат бла паролну хайырландыргъан джарамайды.',
 'mailmypassword' => 'Меннге e-mail бла джангы пароль джибер',
 'passwordremindertitle' => '{{SITENAME}}  къошулуучугъа джангы болджаллы пароль',
 'passwordremindertext' => 'Ким эседа (сиз болургъа боллукъсуз, IP-адрес: $1) {{SITENAME}} ($4) къошулуучугъа джангы пароль къураргъа соргъанды. $2 къошулуучугъа джангы пароль: $3. Сорууну джиберген сиз болгъан эсегиз, системагъа кирирге эм паролну алышдырыргъа тыйычлыды. Джангы паролну $5 {{PLURAL:$5|кюнню}} ичинде амалы боллукъду.
@@ -498,6 +519,7 @@ $2',
 'emailconfirmlink' => 'Электрон почта адресигизни бегитигиз.',
 'invalidemailaddress' => 'Электрон почта адресигизи къабыл этилинирге болмайды, форматха келишмегени ючюн.
 Тюз адрес джазыгъыз неда тизгинни бош къоюгъуз.',
+'cannotchangeemail' => 'Тергеу джазыуну электрон почтасыны адреслерин бу викиде тюрлендирирге болмайды.',
 'emaildisabled' => 'Бу сайт, электрон потча бла билдириуле иймейди.',
 'accountcreated' => 'Тергеу джазыу (аккаунт) къуралды',
 'accountcreatedtext' => '$1 къошулуучугъа тергеу джазыу (аккаунт) къуралды.',
@@ -508,11 +530,13 @@ $2',
 'usernamehasherror' => 'Къошулуучуну атында «#» символ болургъа джарамайда.',
 'login-throttled' => 'Сиз асыры кёб кере кирирге кюрешгенсиз.
 Джангыдан кёргюнчю бираз заман ётдюрюгюз.',
+'login-abort-generic' => 'Системагъа кириу джетишимсиз болду',
 'loginlanguagelabel' => 'Тил: $1',
 'suspicious-userlogout' => 'Терс браузер неда кэш этиучу прокси берген соруугъа ушагъаны ючюн, Сизни чыгъаргъа сорууугъуз алынмагъанды.',
 
 # E-mail sending
 'php-mail-error-unknown' => "PHP's mail() функцияда белгили болмагъан халат",
+'user-mail-no-addy' => 'Бир e-mail адрес болмагъанлай e-mail иерге кюрешди',
 
 # Change password dialog
 'resetpass' => 'Паролну тюрлендириу',
@@ -543,8 +567,16 @@ $2',
 'passwordreset-capture-help' => 'Бу белгини салсагъыз, къошулуучугъа ийилген болджаллы пароль бла билдириу сизге кёргюзюллюкдю.',
 'passwordreset-email' => 'Электрон почтаны адреси:',
 'passwordreset-emailtitle' => '{{SITENAME}} сайтдагъы тергеу джазыуну юсюнден билгиле',
+'passwordreset-emailelement' => 'Къошулуучуну аты: $1
+Болджаллы пароль: $2',
+'passwordreset-emailsent' => 'Эсгертиу e-mail ийилди.',
+'passwordreset-emailsent-capture' => 'Ийилген эсгертиу e-mail тюбюрекде берилибди.',
+'passwordreset-emailerror-capture' => 'Ийилген эсгертиу e-mail тюбюрекде берилибди, аны ашырыуу джетишимсиз болду, чурум: $1',
 
 # Special:ChangeEmail
+'changeemail' => 'Электрон почтаны адресин ауушдур',
+'changeemail-header' => 'Электрон почтаны адресин ауушдуруу',
+'changeemail-text' => 'Сизни e-mail адресигизни тюрлендирир ючюн бу форманы толтуругъуз. Тюрлениуню бегитир ючюн паролну джазаргъа керек боллукъду.',
 'changeemail-no-info' => 'Бу бетни кёрюр ючюн сиз системагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керексиз.',
 'changeemail-oldemail' => 'Почтаны бусагъатдагъы адреси:',
 'changeemail-newemail' => 'Электрон почтаны джангы адреси:',
@@ -640,8 +672,7 @@ $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> табаргъа боллукъсуз.',
+Сиз [[Special:Search/{{PAGENAME}}|бу атны таныгъан]] башха статьяланы, неда <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналлада джазылгъанланы]</span> табаргъа боллукъсуз, алай а бу бетни къураргъа эркинлигигиз джокъду.',
 'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» тергеу джазыу (аккаунт) джокъду. Къураргъа/тюрлендирирге излеймисиз бу бетни?',
 'userpage-userdoesnotexist-view' => '«$1» тергеу джазыу (аккаунт) джокъду.',
 'blocked-notice-logextract' => 'Бу къошулуучу бусагъатда блокланыб турады.
@@ -650,7 +681,6 @@ $2',
 * '''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}}» тиекни басыгъыз, джангы JS-файлны сакълатырыгъызны аллы бла тинтиб кёрюрча.",
@@ -665,7 +695,7 @@ $2',
 'note' => "'''Белги:'''",
 'previewnote' => "'''Бу къуру ал къарауду.'''
 Сиз этген тюрлениуле алкъын сакъланмагъандыла!",
-'continue-editing' => 'ТÑ\8eÑ\80лендиÑ\80иÑ\83нÑ\8e бардырыгъыз',
+'continue-editing' => 'ТÑ\8eÑ\80лендиÑ\80иÑ\83лени бардырыгъыз',
 'previewconflict' => 'Бу ал къарау, башындагъы тюрлендириу терезеде текстни сакъланнганча кёргюзеди.',
 'session_fail_preview' => "'''Джарсыугъа, сессияны идентификаторуну тас этгени себебли, сервер сизни тюрлендириуюгюзни сакълаталмагъанды.
 Энтдада кёрюгюз.
@@ -745,6 +775,15 @@ $2',
 'edit-already-exists' => 'Джангы бет къураргъа боллукъ тюлдю.
 Алайсызда барды бу атлы бет.',
 'defaultmessagetext' => 'Тынгылау бла текст',
+'content-failed-to-parse' => '$2 контент $1 типге келишмейди: $3',
+'invalid-content-data' => 'Джаламагъан билгиле',
+'content-not-allowed-here' => '[[$2]] бетни ичинде "$1" контент джарамайды',
+
+# Content models
+'content-model-wikitext' => 'вики-текст',
+'content-model-text' => 'тюз текст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Эсгериу:''' Бу бетде асыры кёб къайнакълы функция барды.
@@ -759,6 +798,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' => 'Бу тюрлениу ызына алыныргъа боллукъду. Тилейбиз, версияланы тенглешдириуюн осмакълагъыз, керти да бу тюрлендириулени этерге излегенигизден ишексиз болугъуз, сора, тюрлениуле къабыл этилир ючюн, «Бетни къош» деген тиекден басыгъыз.',
@@ -892,7 +938,9 @@ $1",
 'revdelete-only-restricted' => '$2, $1 Джазыуланы, джашырыуну башха джарашдырыуларындан бирин сайламай, администраторладан джашыраллыкъ тюлсюз.',
 'revdelete-reason-dropdown' => '* Кетериуню стандарт чурумлары
 ** Автор хакъланы бузуу
-** Орунсуз энчи билгиле',
+** Орунсуз энчи билгиле
+** Джарамагъан къошулуучу ат
+** Адамны юсюнден джалгъан билгиле',
 'revdelete-otherreason' => 'Башха/къошакъ чурум:',
 'revdelete-reasonotherlist' => 'Башха чурум',
 'revdelete-edit-reasonlist' => 'Чурумланы тизмесин тюрлендир',
@@ -945,6 +993,11 @@ $1",
 'editundo' => 'ызына алыу',
 'diff-multi' => '({{PLURAL:$2|Бир къошулуучу|$2 къошулуучу}} этген {{PLURAL:$1|$1 аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
 'diff-multi-manyusers' => '($2 къошулуучудан кёб {{PLURAL:$2|Бир къошулуучу|къошулуучу}} этген {{PLURAL:$1|бир аралыкъ тюрлениу|$1 аралыкъ тюрлениу}} кёргюзюлмегенди)',
+'difference-missing-revision' => 'Бу тенглешдириу ($1) ючюн {{PLURAL:$2|$2 версия}} {{PLURAL:$2|табылмады}}.
+
+
+Бу, эскирген джибериу бла кетерилген бетни версияларын тенглешдириуге кёчген сагъатда кёбюсюне болады.
+Толуракъ информация [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} кетериулени журналында] болургъа боллукъду.',
 
 # Search results
 'searchresults' => 'Излеуню эсеби',
@@ -987,8 +1040,6 @@ $1",
 'search-interwiki-caption' => 'Джууукъ проектле',
 'search-interwiki-default' => '$1 эсеблери:',
 'search-interwiki-more' => '(дагъыда)',
-'search-mwsuggest-enabled' => 'юретиуле бла',
-'search-mwsuggest-disabled' => 'юретиулесиз',
 'search-relatedarticle' => 'Байламлы',
 'mwsuggest-disable' => 'AJAX юретиулени джукълатыгъыз',
 'searcheverything-enable' => 'Атланы бютёу аламларында изле',
@@ -1021,7 +1072,7 @@ $1",
 
 # Preferences page
 'preferences' => 'Джарашдырыула',
-'mypreferences' => 'Джарашдырыуларым',
+'mypreferences' => 'Джарашдырыула',
 'prefs-edits' => 'Тюрлендириулени саны:',
 'prefsnologin' => 'Системагъа кесигизни танытмагъансыз',
 'prefsnologintext' => 'Къошулуучуну джарашдырыуларын тюрлендирир ючюн <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} системагъа кесигизни танытыргъа]</span> керексиз.',
@@ -1032,16 +1083,19 @@ $1",
 'prefs-beta' => 'Бета-амалла',
 'prefs-datetime' => 'Дата бла сагъат',
 'prefs-labs' => 'Эксперимент амалла',
+'prefs-user-pages' => 'Къошулуучуну бетлери',
 'prefs-personal' => 'Энчи билгиле',
 'prefs-rc' => 'Ахыр тюрлениуле',
-'prefs-watchlist' => 'Ð\9aÑ\8aаÑ\80аÑ\83нÑ\83 Ñ\81пиÑ\81огÑ\83',
-'prefs-watchlist-days' => 'Ð\9aÑ\8aаÑ\80аÑ\83нÑ\83 Ñ\81пиÑ\81огÑ\83нда ÐºÑ\91Ñ\80гÑ\8eзÑ\8eллÑ\8eк ÐºÑ\8eннÑ\8e саны:',
+'prefs-watchlist' => 'Ð\9aÑ\91зде Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\82изме',
+'prefs-watchlist-days' => 'Ð\9aÑ\91зде Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\82измеде ÐºÑ\91Ñ\80гÑ\8eзÑ\8eллÑ\8eк ÐºÑ\8eнлени саны:',
 'prefs-watchlist-days-max' => 'Максимум $1 {{PLURAL:$1|кюн|кюн}}',
-'prefs-watchlist-edits' => 'Ð\9aÑ\8aаÑ\80аÑ\83нÑ\83 ÐºÐµÐ½Ð³Ð»ÐµÑ\88диÑ\80илген Ñ\81пиÑ\81огÑ\83нда кёргюзюллюк тюрлениулени саны:',
+'prefs-watchlist-edits' => 'Ð\9aÑ\91зде Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\82измени ÐºÐµÐ½Ð³Ð»ÐµÑ\88диÑ\80илген Ð²Ð°Ñ\80ианÑ\82Ñ\8bнда кёргюзюллюк тюрлениулени саны:',
 'prefs-watchlist-edits-max' => 'Максимум саны:1000',
-'prefs-watchlist-token' => 'Ð\9aÑ\8aаÑ\80аÑ\83нÑ\83 Ñ\81пиÑ\81огÑ\83нÑ\83 токени:',
+'prefs-watchlist-token' => 'Ð\9aÑ\91зде Ñ\82Ñ\8bÑ\80гÑ\8aан Ñ\82измени токени:',
 'prefs-misc' => 'Башха джарашдыдырыула',
 'prefs-resetpass' => 'Паролну тюрлендир',
+'prefs-changeemail' => 'Электрон почтаны адресин ауушдур',
+'prefs-setemail' => 'Лл. почтаны адресин айырыу',
 'prefs-email' => 'Электрон почтаны параметрлери',
 'prefs-rendering' => 'Кёрюнюую',
 'saveprefs' => 'Сакъла',
@@ -1059,8 +1113,8 @@ $1",
 'recentchangesdays-max' => '(максимум $1 {{PLURAL:$1|кюн|кюн}})',
 'recentchangescount' => 'Тынгылау бла кёргюзюллюк тюрлениулени саны:',
 'prefs-help-recentchangescount' => 'Бу, ахыр тюрлениулени, бетни тарихлерин эмда журналланы ичине къошады.',
-'prefs-help-watchlist-token' => 'Ð\91Ñ\83 Ð°Ð»Ð°Ð½Ð½Ñ\8b Ð´Ð¶Ð°Ñ\88Ñ\8bÑ\80Ñ\82Ñ\8bн Ð°Ñ\87Ñ\85Ñ\8bÑ\87 Ð±Ð»Ð° Ñ\82олÑ\82Ñ\83Ñ\80Ñ\83Ñ\83, ÐºÑ\8aаÑ\80аÑ\83 Ñ\81пиÑ\81огÑ\83гÑ\8aÑ\83з ючюн бир RSS-трансляция къурайды.
\91Ñ\83 Ð°Ð»Ð°Ð½Ð´Ð°Ð³Ñ\8aÑ\8b Ð°Ñ\87Ñ\85Ñ\8bÑ\87нÑ\8b Ð±Ð¸Ð»Ð³ÐµÐ½Ð»Ðµ ÐºÑ\8aаÑ\80аÑ\83 Ñ\81пиÑ\81огÑ\83гÑ\8aÑ\83знÑ\83 окъургъа боллукъду, ол себебден сырлы магъана сайлагъыз.
+'prefs-help-watchlist-token' => 'Ð\91Ñ\83 Ð°Ð»Ð°Ð½Ð½Ñ\8b Ð´Ð¶Ð°Ñ\88Ñ\8bÑ\80Ñ\82Ñ\8bн Ð°Ñ\87Ñ\85Ñ\8bÑ\87 Ð±Ð»Ð° Ñ\82олÑ\82Ñ\83Ñ\80Ñ\83Ñ\83, ÐºÑ\91зде Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\82измегиз ючюн бир RSS-трансляция къурайды.
\91Ñ\83 Ð°Ð»Ð°Ð½Ð´Ð°Ð³Ñ\8aÑ\8b Ð°Ñ\87Ñ\85Ñ\8bÑ\87нÑ\8b Ð±Ð¸Ð»Ð³ÐµÐ½Ð»Ðµ ÐºÑ\91зде Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\82измегизни окъургъа боллукъду, ол себебден сырлы магъана сайлагъыз.
 Сакъланмагъанлай генерация этилген магъананы хайырландырыргъа боллукъсуз: $1',
 'savedprefs' => 'Джарашдырыуларыгъыз сакъландыла.',
 'timezonelegend' => 'Заман бел:',
@@ -1081,7 +1135,7 @@ $1",
 'timezoneregion-indian' => 'Индий океан',
 'timezoneregion-pacific' => 'Шош океан',
 'allowemail' => 'Башха къошулуучуладан электрон почтаны келмеге къой',
-'prefs-searchoptions' => 'Излеуню джарашдырыулары',
+'prefs-searchoptions' => 'Излеу',
 'prefs-namespaces' => 'Атла алам',
 'defaultns' => 'Башха халда бу атла аламлада изле:',
 'default' => 'тынгылау бла',
@@ -1103,6 +1157,7 @@ $1",
 'yourrealname' => 'Керти атыгъыз:',
 'yourlanguage' => 'Интерфейсни тили:',
 'yourvariant' => 'Ичиндегисини тилини варианты:',
+'prefs-help-variant' => 'Викини бетлерин кёргюзтюрге сайланнган тилни неда орфографияны варианты',
 'yournick' => 'Псевдонимигиз (къол салыулагъа):',
 'prefs-help-signature' => 'Сюзюу бетледеги комментарийлеге «<nowiki>~~~~</nowiki>» символла къошулуб къол салыныргъа керекди, бу, къолугъузгъа эмда заман тамгъагъа буруллукъду.',
 'badsig' => 'Джараусуз къол салыныу.
@@ -1136,6 +1191,10 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'prefs-displaywatchlist' => 'Кёрюнюуню джарашдырыулары',
 'prefs-diffs' => 'Версияланы башхалыкълары',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail адрес тюзге ушайды',
+'email-address-validity-invalid' => 'Тюз e-mail адрес джазыгъыз!',
+
 # User rights
 'userrights' => 'Къошулуучуну хакъларына оноу этиу',
 'userrights-lookup-user' => 'Къошулуучуланы къауумуна оноу эт',
@@ -1208,6 +1267,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'right-writeapi' => 'API джазыугъа хайырланыуу',
 'right-delete' => 'белтени кетериу',
 'right-bigdelete' => 'узун тарихли бетлени кетериу',
+'right-deletelogentry' => 'журналны белгили бир джазыуларын кетериу эм ызына салыу.',
 'right-deleterevision' => 'бетлени белгили версияларыны кетериу эмда ызына къайтарыу',
 'right-deletedhistory' => 'Узакъдагъы эркинликсиз кетерилген бетлени тарихине къара',
 'right-deletedtext' => 'Кетерилген текстни эм кетерилген версияланы арасындагъы тюрлениулеге къара',
@@ -1235,18 +1295,23 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'right-patrol' => 'Башхаланы тюрлениулерини осмакъланнганларын белгиле',
 'right-autopatrol' => 'Тюрлениуле автоматик осмакъланнган кибик белгиленедиле',
 'right-patrolmarks' => 'Ахыр тюрлениулени осмакъланыуларыны белгилерине къара',
-'right-unwatchedpages' => 'Ð\9aÑ\8aаÑ\80алмагÑ\8aан Ð±ÐµÑ\82лени Ñ\81пиÑ\81огÑ\83на ÐºÑ\8aаÑ\80а',
+'right-unwatchedpages' => 'Ð\9aÑ\91зде Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\82измегизде Ð±Ð¾Ð»Ð¼Ð°Ð³Ñ\8aан Ð±ÐµÑ\82лени Ñ\82измеÑ\81ине ÐºÑ\8aаÑ\80аÑ\83',
 'right-mergehistory' => 'Бетлени тарихлерини бирлешдир',
 'right-userrights' => 'Бютеу къошулуучуланы хакъларыны тюрлендириу',
 'right-userrights-interwiki' => 'Башха викиледеги къошулуучуларыны хакъларын тюрлендир',
 'right-siteadmin' => 'Билги базаны киритле эмда киритни ач',
 'right-override-export-depth' => 'Бетлени, теренлиги 5-ге дери байламлы бетле бла бирге экспорт эт',
 'right-sendemail' => 'Башха къошулуучулагъа электрон почта джиберирге',
+'right-passwordreset' => "пароль тюрлениуле бла e-mail'леге къарау",
 
 # User rights log
 'rightslog' => 'Къошулуучуну хакъларыны журналы',
 'rightslogtext' => 'Бу къошулуучуну хакъларыны тюрлениуюню журналыды',
 'rightslogentry' => '$1-ни къауумлада членлиги $2-ден $3-ге тюрленнгенди',
+'rightslogentry-autopromote' => '$2 къауумдан автомат халда $3 къауумгъа кёчюрюлдю',
+'logentry-rights-rights' => '$1 къошулуучу, $3 къошулуучуну членлигин $4 къауумдан $5 къауумгъа кёчюрдю',
+'logentry-rights-rights-legacy' => '$1 къошулуучу, $3 къушулуучуну къауумлада членлигин тюрлендирди',
+'logentry-rights-autopromote' => '$1 къошулуучу, $4 къауумдан автомат халда $5 къауумгъа кёчюрюлдю',
 'rightsnone' => '(джокъ)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1274,6 +1339,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'action-suppressionlog' => 'бу энчи журналгъа къарау',
 'action-block' => 'Къошулуучуну блок этиу, тюрлендириуле этерге къоймау',
 'action-protect' => 'бу бетни джакълау дараджасын тюрлендириу',
+'action-rollback' => 'бетни ахыр тюрлендирген къошулуучуну тюрлендириулерин дженгил ызына алыу',
 'action-import' => 'бу бетни башха викиден импорт этиу',
 'action-importupload' => 'бу бетни джюкленнген файлдан импорт этиу',
 'action-patrol' => 'башхаланы тюрлендириулерин патруль этилиннгенлеча белгилеу',
@@ -1283,6 +1349,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'action-userrights' => 'къошулуучуну бютеу хакъларын тюрлендириу',
 'action-userrights-interwiki' => 'къошулуучуланы башха викиледе хакъларын тюрлендириу',
 'action-siteadmin' => 'билгилени базасын блокга салыу эм блокдан алыу',
+'action-sendemail' => 'E-mail джибериу',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|тюрлениу|тюрлениу}}',
@@ -1315,9 +1382,11 @@ $1 {{PLURAL:$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' => 'Байламлы тюрлениуле',
@@ -1344,7 +1413,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 
 Бу бетге кетериуле бла ат тюрлендириулени журналы тюбюрекде бериледи:",
 'uploadtext' => "Файл джюклер ючюн тюбюндеги форманы хайырлан.
\90лландан Ð´Ð¶Ñ\8eкленнген Ñ\84айлланÑ\8b ÐºÑ\91Ñ\80Ñ\8eÑ\80 Ð½ÐµÐ´Ð° Ð¸Ð·Ð»ÐµÑ\80 Ñ\8eÑ\87Ñ\8eн [[Special:FileList|джÑ\8eкленнген Ñ\84айлланÑ\8b Ñ\81пиÑ\81огÑ\83на]] къарагъыз, (джангыдан) джюкленнгенле [[Special:Log/upload|джюклеу журналында]], кетерилгенле [[Special:Log/delete|кетериу журналында]] тутуладыла.
\90лландан Ð´Ð¶Ñ\8eкленнген Ñ\84айлланÑ\8b ÐºÑ\91Ñ\80Ñ\8eÑ\80 Ð½ÐµÐ´Ð° Ð¸Ð·Ð»ÐµÑ\80 Ñ\8eÑ\87Ñ\8eн [[Special:FileList|джÑ\8eкленнген Ñ\84айлланÑ\8b Ñ\82измеÑ\81ине]] къарагъыз, (джангыдан) джюкленнгенле [[Special:Log/upload|джюклеу журналында]], кетерилгенле [[Special:Log/delete|кетериу журналында]] тутуладыла.
 
 Бетге файл салыр ючюн байлмыгъызда тюбюндеги формаларыны бирин хайырланыгъыз;
 * Файлны бютеу ёлчемини салыр ючюн: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code>'''
@@ -1355,7 +1424,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'upload-prohibited' => 'Джасакъ этилген файлланы типлери: $1.',
 'uploadlog' => 'Джюклеулени журналы',
 'uploadlogpage' => 'Джюклеулени журналы',
-'uploadlogpagetext' => 'ТÑ\8eбÑ\8eнде Ñ\8dм Ð°Ñ\85Ñ\8bÑ\80 ÐºÑ\8aоÑ\88Ñ\83лгÑ\8aан Ñ\84айлланÑ\8b Ñ\81пиÑ\81огÑ\83 барды.
+'uploadlogpagetext' => 'ТÑ\8eбÑ\8eнде Ñ\8dм Ð°Ñ\85Ñ\8bÑ\80 ÐºÑ\8aоÑ\88Ñ\83лгÑ\8aан Ñ\84айлланÑ\8b Ñ\82измеÑ\81и барды.
 Дагъыда [[Special:NewFiles|dosyalджангы файлланы галереясына]] къара, анда джангы джюклеулени юсюнден билгиле толу кёрюгюзюлгендиле.',
 'filename' => 'Файлны аты',
 'filedesc' => 'Къысха ачыкълау',
@@ -1369,6 +1438,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'minlength1' => 'Файлны аты эм азы бла бир харифден болургъа керекди.',
 'illegalfilename' => '«$1» файл атда хайырланыугъа къабыл этилмеген символла бардыла.
 Файлны атын тюрлендириб, джангыдан джюклегиз.',
+'filename-toolong' => 'Файлланы атлары 240 байтдан кёб болмазгъа керекдиле.',
 'badfilename' => 'Файлны аты $1 болуб ауушду.',
 'filetype-mime-mismatch' => '«.$1» файл MIME-типге ($2) келишмейди.',
 'filetype-badmime' => '«$1» MIME типли файлланы джюклениуюне эркинлик берлимейди.',
@@ -1392,6 +1462,7 @@ $1 {{PLURAL:$1|символдан|символладан}} кеб болургъ
 'large-file' => 'Файлланы $1 байтдан уллу болмасы изленеди (бу файлны ёлчеми $2)',
 'largefileserver' => 'Бу файл сервер эркинлик бергенден уллуду.',
 'emptyfile' => 'Джюклеген файлыгъыз бош кёрюнеди. Буну чуруму файлны атыны джазыуда халат болургъа болур. Файлны джюклерге излегенигизден ишексиз болугъуз.',
+'windows-nonascii-filename' => 'ASCII таблицада болмагъан символла бла файл атланы бу вики тутмайды',
 'fileexists' => 'Быллай атлы файл барды.
 Аны ауушдурурда аккылы эсегиз, алгъын <strong>[[:$1]]</strong> файлгъа кёз джетдиригиз.
 [[$1|thumb]]',
@@ -1478,12 +1549,14 @@ URL-адрес тюз болгъанын осмакълагъыз эмда дж
 # File backend
 'backend-fail-delete' => '«$1» файл кетерилмеди.',
 'backend-fail-store' => '$1 файл $2 ичинде сакъланылынмады.',
+'backend-fail-read' => '«$1» файлны окъуялмады.',
 
 # Special:UploadStash
 'uploadstash' => 'Джашыртын джюклеу',
 'uploadstash-clear' => 'Джашырылгъан файлланы ариула',
 'uploadstash-nofiles' => 'Сизни джашырылгъан файлларыгъыз джокъду',
 'uploadstash-refresh' => 'Файлланы тизмесин джангырт',
+'invalid-chunk-offset' => 'Фрагментни джарамагъан офсети',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Эркинлик джасакъланнганды',
@@ -1493,7 +1566,7 @@ CGI тамалында ишлерге эмда <code>img_auth</code> бла иш
 Къарагъыз: https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Изленнген джол джюклениулени папкасы бла байламлы тюлдю.',
 'img-auth-badtitle' => '«$1» бла джараулу башлыкъ этилмейди.',
-'img-auth-nologinnWL' => 'Сиз Ñ\81иÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80медигиз, Ñ\8dмда Â«$1» Ð°ÐºÑ\8a Ñ\81пиÑ\81окда тюлдю.',
+'img-auth-nologinnWL' => 'Сиз Ñ\81иÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80медигиз, Ñ\8dмда Â«$1» Ð°ÐºÑ\8a Ñ\82измеде тюлдю.',
 'img-auth-nofile' => '«$1» файл джокъду.',
 'img-auth-isdir' => '«$1» каталогга кирирге излейсиз.
 Къуру файллагъа кирирге эркинлик барды.',
@@ -1534,7 +1607,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 Къошулуучугъа кёре айырыуда, ол къошулуучуну джангыз кёб болмай джюклеген файллары кёргюзюледиле.',
 'listfiles_search_for' => 'Медиа ат бла изле:',
 'imgfile' => 'файл',
-'listfiles' => 'ФайлланÑ\8b Ñ\81пиÑ\81огÑ\83',
+'listfiles' => 'ФайлланÑ\8b Ñ\82измеÑ\81и',
 'listfiles_thumb' => 'Миниатюра',
 'listfiles_date' => 'Заман',
 'listfiles_name' => 'Файлны аты',
@@ -1562,9 +1635,9 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'filehist-missing' => 'Файл джокъду',
 'imagelinks' => 'Файлны хайырланыуу',
 'linkstoimage' => 'Бу файлгъа {{PLURAL:$1|бет|$1 бет}} джибередиле:',
-'linkstoimage-more' => '$1-ден артыкъ {{PLURAL:$1|бет|бет}} бу файлгъа джибериу береди.
\9aÑ\91зÑ\8eÑ\83деги Ñ\81пиÑ\81ок ÐºÑ\8aÑ\83Ñ\80Ñ\83 Ð±Ñ\83 Ñ\84айлгÑ\8aа Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83 Ð±ÐµÑ\80ген {{PLURAL:$1|биÑ\80инÑ\87и Ñ\84айлнÑ\8b|биÑ\80инÑ\87и $1 Ñ\84айлнÑ\8b}} ÐºÑ\91Ñ\80гÑ\8eзеди.
-[[Special:WhatLinksHere/$2|ТолÑ\83 Ñ\81пиоÑ\81ок]] барды.',
+'linkstoimage-more' => '$1 дегенден артыкъ {{PLURAL:$1|бет}} бу файлгъа джибериу береди.
\91Ñ\83 Ñ\82измеде Ð±Ñ\83 Ñ\84айлгÑ\8aа {{PLURAL:$1|кÑ\8aÑ\83Ñ\80Ñ\83 $1 Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83}} ÐºÑ\91Ñ\80гÑ\8eзÑ\8eледи.
+[[Special:WhatLinksHere/$2|ТолÑ\83 Ñ\82изме]] Ð´Ð° барды.',
 'nolinkstoimage' => 'Бу файлгъа джиберген бет джокъду.',
 'morelinkstoimage' => 'Бу файлгъа [[Special:WhatLinksHere/$1|къалгъан джибериулеге]] къара.',
 'linkstoimage-redirect' => '$1 (файл редирект) $2',
@@ -1624,7 +1697,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 
 # Unused templates
 'unusedtemplates' => 'Хайырландырылмагъан шаблонла',
-'unusedtemplatestext' => 'Ð\91Ñ\83 Ð±ÐµÑ\82 {{ns:template}} Ð°Ð»Ð°Ð½ Ð°Ñ\82Ñ\8bнда Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\8dмда Ð±Ð°Ñ\88Ñ\85а Ð±ÐµÑ\82леге ÐºÑ\8aоÑ\88Ñ\83лгмаÑ\8aан Ð±ÐµÑ\82лени Ñ\81пиÑ\81огÑ\83 барды. Кетериуню аллы бла, шаблоннга башха джибериулени джокоълагъыз.',
+'unusedtemplatestext' => 'Ð\91Ñ\83 Ð±ÐµÑ\82 {{ns:template}} Ð°Ð»Ð°Ð½ Ð°Ñ\82Ñ\8bнда Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\8dмда Ð±Ð°Ñ\88Ñ\85а Ð±ÐµÑ\82леге ÐºÑ\8aоÑ\88Ñ\83лгмаÑ\8aан Ð±ÐµÑ\82лени Ñ\82измеÑ\81и барды. Кетериуню аллы бла, шаблоннга башха джибериулени джокоълагъыз.',
 'unusedtemplateswlh' => 'башха джибериуле',
 
 # Random page
@@ -1658,11 +1731,12 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 
 'disambiguations' => 'Ангылам айыргъан бетлеге джибериулери болгъан бетле',
 'disambiguationspage' => 'Template:кёб магъаналылыкъ',
-'disambiguations-text' => "Бу бетле '''кёб магъаналы бетлеге''' джибериу этедиле. Аны орнуна ала белгили бир статьягъа джибериу этерге керек болурла.<br />
-[[MediaWiki:Disambiguationspage]] бетде аты салынган шаблон бетде болса, ол бет кёб магъаналы бетге саналады.",
+'disambiguations-text' => "Келтирилген бетледе '''кёб магъаналы бетлеге''' эм азы бла бир джибериу барды.
+Аны орнуна ала белгили бир статьягъа джибериу этерге керек болурла.<br />
+[[MediaWiki:Disambiguationspage]] бетде аты салыннган шаблон бар эсе, ол бет кёб магъаналы бетге саналады.",
 
 'doubleredirects' => 'Джибериу болгъан джибериуле',
-'doubleredirectstext' => 'Ð\91Ñ\83 Ð±ÐµÑ\82де Ð±Ð°Ñ\88Ñ\85Ñ\8b Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83леге Ñ\8dÑ\82илген Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83лени Ñ\81пиÑ\81огÑ\83 барды.
+'doubleredirectstext' => 'Ð\91Ñ\83 Ð±ÐµÑ\82де Ð±Ð°Ñ\88Ñ\85Ñ\8b Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83леге Ñ\8dÑ\82илген Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83лени Ñ\82измеÑ\81и барды.
 Хар тизгин биринчи неда экинчи джибериуню эмда асламысында бетни аты джазылгъан, биринчи джибериу кёргюзген, экинчи джибериуню нюзюр бети джазылады.
 <del>Юсю сызылгъан</del> джазыула тюзетилген этгендиле.',
 'double-redirect-fixed-move' => '[[$1]] бет атын тюрлендиргенди, энди ол [[$2]] бетге джибериу этеди',
@@ -1734,7 +1808,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'move' => 'Атын тюрлендириу',
 'movethispage' => 'Бу бетни атын тюрлендир',
 'unusedimagestext' => 'Файлла бардыла, алай а бетге джазылмагъандыла.
-УнÑ\83Ñ\82магÑ\8aÑ\8bз, Ð±Ð°Ñ\88Ñ\85а Ð²ÐµÐ± Ñ\81айÑ\82ланÑ\8b Ð±Ñ\83 Ñ\84айлгÑ\8aа Ð°Ñ\87Ñ\8bкÑ\8aдан URL Ð±Ð»Ð° Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83 Ð±ÐµÑ\80иÑ\80ге Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aлаÑ\80Ñ\8bн, Ñ\8dмда Ð°Ð½Ñ\8b Ñ\8eÑ\87Ñ\8eн Ð±Ñ\83 Ñ\81пиÑ\81окга киргенине къарамай актив халда хайырланыргъа боллукъду.',
+УнÑ\83Ñ\82магÑ\8aÑ\8bз, Ð±Ð°Ñ\88Ñ\85а Ð²ÐµÐ± Ñ\81айÑ\82ланÑ\8b Ð±Ñ\83 Ñ\84айлгÑ\8aа Ð°Ñ\87Ñ\8bкÑ\8aдан URL Ð±Ð»Ð° Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83 Ð±ÐµÑ\80иÑ\80ге Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aлаÑ\80Ñ\8bн, Ñ\8dмда Ð°Ð½Ñ\8b Ñ\8eÑ\87Ñ\8eн Ð±Ñ\83 Ñ\82измеге киргенине къарамай актив халда хайырланыргъа боллукъду.',
 'unusedcategoriestext' => 'Бу категорияла болгъанлыкъгъа, чырт бир статья неда категория джанындан хайырланмыайдыла.',
 'notargettitle' => 'Нюзюр белгиленмегенди',
 'notargettext' => 'Бу функцияны ишлетир ючюн нюзюр бетни неда къошулуучуну белгилемегенсиз.',
@@ -1749,7 +1823,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'booksources-search-legend' => 'Китабны юсюнден информация излеу',
 'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'Таб',
-'booksources-text' => 'Ð\91Ñ\83 Ð±ÐµÑ\82де Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ñ\8dмда Ñ\8dÑ\81ки ÐºÐ¸Ñ\82аб Ñ\81аÑ\82Ñ\85ан Ð±Ð°Ñ\88Ñ\85а Ñ\81айÑ\82лагÑ\8aа Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83лени Ñ\81пиÑ\81огÑ\83 барды, эм излеген китабларыгъызны юсюнден кёбюрек билги билирге боллукъсуз.',
+'booksources-text' => 'Ð\91Ñ\83 Ð±ÐµÑ\82де Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ñ\8dмда Ñ\8dÑ\81ки ÐºÐ¸Ñ\82аб Ñ\81аÑ\82Ñ\85ан Ð±Ð°Ñ\88Ñ\85а Ñ\81айÑ\82лагÑ\8aа Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83лени Ñ\82измеÑ\81и барды, эм излеген китабларыгъызны юсюнден кёбюрек билги билирге боллукъсуз.',
 'booksources-invalid-isbn' => 'Берилген ISBN джараусуз кибик кёрюнеди; оригинал къайнакъдан кёчюрюлген заманда халатланы контроль этигиз.',
 
 # Special:Log
@@ -1775,7 +1849,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'allpagesprev' => 'Аллындагъы',
 'allpagesnext' => 'Эндиги',
 'allpagessubmit' => 'Тындыр',
-'allpagesprefix' => 'Ð\91Ñ\8bлайда Ð´Ð¶Ð°Ð·Ð³Ñ\8aан Ñ\85аÑ\80иÑ\84леден Ð±Ð°Ñ\88ланнган Ð±ÐµÑ\82лени Ñ\81пиÑ\81ок эт:',
+'allpagesprefix' => 'Ð\91Ñ\8bлайда Ð´Ð¶Ð°Ð·Ð³Ñ\8aан Ñ\85аÑ\80иÑ\84леден Ð±Ð°Ñ\88ланнган Ð±ÐµÑ\82лени Ñ\82изме эт:',
 'allpagesbadtitle' => 'Кирилген бет аты тиллени арасы байлм неда викилени арасында байлам болгъаны себебли джараусузду. Башлыкълада хайырланыуу джасакъ болгъан бир неда андан аслам символ тутаргъа болур.',
 'allpages-bad-ns' => '{{SITENAME}} сайтда «$1» ат алам джокъду.',
 'allpages-hide-redirects' => 'Башха бетлеге джиберген бетлени (редиректлени) джашыр',
@@ -1799,9 +1873,9 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'linksearch-pat' => 'Излеуге шаблон:',
 'linksearch-ns' => 'Ат алам:',
 'linksearch-ok' => 'Таб',
-'linksearch-text' => '<code>*.wikipedia.org</code> кибик символлла хайырландырыргъа боллукъдула.
-Эм азы бла огъары дараджаны домени керекди, юлгюге: <code>*.org</code><br />
\94агÑ\8aан Ð±Ð¾Ð»Ð³Ñ\8aан Ð¿Ñ\80оÑ\82околла: <code>$1</code> (бÑ\8bладан ÐºÑ\8aайÑ\81Ñ\8bÑ\81Ñ\8bнда Ð¸Ð·Ð»ÐµÑ\83Ñ\8eгÑ\8eзге ÐºÑ\8aоÑ\88магÑ\8aÑ\8bз)',
+'linksearch-text' => '"*.wikipedia.org" кибик символлла хайырландырыргъа боллукъдула.
+Эм азы бла огъары дараджаны домени керекди, юлгюге: "*.org".<br />
\94агÑ\8aан Ð±Ð¾Ð»Ð³Ñ\8aан Ð¿Ñ\80оÑ\82околла: <code>$1</code> (пÑ\80оÑ\82окол Ð±ÐµÐ»Ð³Ð¸Ð»ÐµÐ½Ð¼ÐµÐ³ÐµÐ½ Ñ\8dÑ\81е, Ñ\82Ñ\8bнгÑ\8bлаÑ\83 Ð±Ð»Ð° http:// Ð±Ð¾Ð»Ð»Ñ\83кÑ\8aдÑ\83)',
 'linksearch-line' => '$1-ге  $2-ден джибериу берилгенди',
 'linksearch-error' => 'Джокерле къуру адреслени аллында хайырланыргъа боллукъдула.',
 
@@ -1813,7 +1887,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 
 # Special:ActiveUsers
 'activeusers' => 'Актив къошулуучуланы тизмеси',
-'activeusers-intro' => 'Ð\91Ñ\83, Ð°Ñ\85Ñ\8bÑ\80 $1 {{PLURAL:$1|кÑ\8eнде|кÑ\8eнде}} ÐºÑ\8aаллайда Ð±Ð¾Ð»Ñ\81Ñ\83н Ð¸Ñ\88леÑ\82ме ÐºÑ\91Ñ\80гÑ\8eзген ÐºÑ\8aоÑ\88лÑ\83Ñ\83Ñ\87Ñ\83ланÑ\8b Ñ\81пиÑ\81огÑ\83дÑ\83.',
+'activeusers-intro' => 'Ð\91Ñ\83, Ð°Ñ\85Ñ\8bÑ\80 $1 {{PLURAL:$1|кÑ\8eнде|кÑ\8eнде}} ÐºÑ\8aаллайда Ð±Ð¾Ð»Ñ\81Ñ\83н Ð¸Ñ\88леÑ\82ме ÐºÑ\91Ñ\80гÑ\8eзген ÐºÑ\8aоÑ\88лÑ\83Ñ\83Ñ\87Ñ\83ланÑ\8b Ñ\82измеÑ\81иди.',
 'activeusers-count' => 'Ахыр {{PLURAL:$3|кюнде|$3 кюнде}} $1 {{PLURAL:$1|тюрлендириу|тюрлендириу}}',
 'activeusers-from' => 'Бу бла башланнган къошлуучуланы кёргюз:',
 'activeusers-hidebots' => 'Ботланы джашыр',
@@ -1822,11 +1896,11 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 
 # Special:Log/newusers
 'newuserlogpage' => 'Къошулуучуланы регистрацияларыны журналы',
-'newuserlogpagetext' => 'Ð\9aÑ\91б Ð±Ð¾Ð»Ð¼Ð°Ð¹ Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f Ñ\8dÑ\82ген ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83ланÑ\8b Ñ\81пиÑ\81огÑ\83.',
+'newuserlogpagetext' => 'Ð\9aÑ\91б Ð±Ð¾Ð»Ð¼Ð°Ð¹ Ñ\80егиÑ\81Ñ\82Ñ\80аÑ\86иÑ\8f Ñ\8dÑ\82ген ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83ланÑ\8b Ñ\82измеÑ\81и.',
 
 # Special:ListGroupRights
 'listgrouprights' => 'Къошулуучуланы къауумуну хакълары',
-'listgrouprights-summary' => 'ТÑ\8eбÑ\8eндеги Ð±Ñ\83 Ð²Ð¸ÐºÐ¸Ð´Ðµ Ñ\82анÑ\8bлгÑ\8aан ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83 ÐºÑ\8aаÑ\83Ñ\83мланÑ\8b Ñ\8dмда Ð°Ð»Ð°Ð½Ñ\8b Ñ\85акÑ\8aлаÑ\80Ñ\8bнÑ\8b Ñ\81пиÑ\81огÑ\83.
+'listgrouprights-summary' => 'ТÑ\8eбÑ\8eндеги Ð±Ñ\83 Ð²Ð¸ÐºÐ¸Ð´Ðµ Ñ\82анÑ\8bлгÑ\8aан ÐºÑ\8aоÑ\88Ñ\83лÑ\83Ñ\83Ñ\87Ñ\83 ÐºÑ\8aаÑ\83Ñ\83мланÑ\8b Ñ\8dмда Ð°Ð»Ð°Ð½Ñ\8b Ñ\85акÑ\8aлаÑ\80Ñ\8bнÑ\8b Ñ\82измеÑ\81и.
 Энчи хакъла бла байламлы [[{{MediaWiki:Listgrouprights-helppage}}|асламыракъ билги]] болургъа болур.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Берилген хакъла</span>
 * <span class="listgrouprights-revoked">Сыйырылгъан хакъла</span>',
@@ -1881,7 +1955,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 
 # Watchlist
 'watchlist' => 'Кёзюмде тургъан тизмем',
-'mywatchlist' => 'Кёзюмдеги тизмем',
+'mywatchlist' => 'Кёздеги тизме',
 'watchlistfor2' => '$1 ючюн $2',
 'nowatchlist' => 'Кёзюгюзде тургъан тизмегиз бошду.',
 'watchlistanontext' => 'Кёзюгюзде тургъан тизмегизни статьяланы кёрюр неда тюрлендирир ючюн $1.',
@@ -1891,7 +1965,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'addedwatchtext' => '«[[:$1]]» бет [[Special:Watchlist|кёзюгюзде тургъан тизмегизге]] къошулду.
 Бу бетни эмда муну бла байламлы сюзюу бетни тюрлениулери ол тизмеде белгиленникдиле, [[Special:RecentChanges|джангы тюрлениулени тизмесини]] бетинде уа къалын шрифт бла чертилинникдиле, кёрюрге тынчыракъ болурча.',
 'removewatch' => 'Кёзде тургъан тизмеден кетер',
-'removedwatchtext' => '«[[:$1]]» Ð±ÐµÑ\82 Ñ\81изни [[Special:Watchlist|кÑ\91зÑ\8eгÑ\8eзде Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\82измегизден]] ÐºÐµÑ\82еÑ\80илгенди.',
+'removedwatchtext' => '«[[:$1]]» бет сизни [[Special:Watchlist|кёзюгюзде тургъан тизмегизден]] кетерилди.',
 'watch' => 'Кёзде тут',
 'watchthispage' => 'Бу бетни кёзде тут',
 'unwatch' => 'Кёзде тутма',
@@ -1906,7 +1980,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 'watchmethod-list' => 'кёзде тургъан бетледе этилген ахыр тюрлениуле кёрюу',
 'watchlistcontains' => 'Кёзюгюзде тургъан тизмегизде $1 {{PLURAL:$1|бет|бет}} барды.',
 'iteminvalidname' => "'$1' элемент бла проблемала, джараусуз ат...",
-'wlnote' => "Ð\90Ñ\85Ñ\8bÑ\80 {{PLURAL:$2|биÑ\80 Ñ\81агÑ\8aаÑ\82Ñ\85а|'''$2''' Ñ\81агÑ\8aаÑ\82Ñ\85а}} Ñ\8dÑ\82илген {{PLURAL:$1|аÑ\85Ñ\8bÑ\80 Ñ\82Ñ\8eÑ\80лениÑ\83|аÑ\85Ñ\8bÑ\80 '''$1''' Ñ\82Ñ\8eÑ\80лениÑ\83}} Ñ\82Ñ\8eбÑ\8eндеди.",
+'wlnote' => "ТÑ\8eбÑ\8eндеди ÐºÑ\91Ñ\80гÑ\8eзÑ\8eлгенди: Ð°Ñ\85Ñ\8bÑ\80 '''$2''' Ñ\81агÑ\8aаÑ\82Ñ\85а Ñ\8dÑ\82илген Ð°Ñ\85Ñ\8bÑ\80 '''$1''' Ñ\82Ñ\8eÑ\80лениÑ\83, $3 $4 Ð·Ð°Ð¼Ð°Ð½Ð½Ð³Ð° Ð´ÐµÑ\80и.",
 'wlshowlast' => 'Арт $1 сагъат $2 кюннге $3 кёргюз',
 'watchlist-options' => 'Кёзде тургъан тизмени джарашдырыулары',
 
@@ -1916,11 +1990,7 @@ URL-ни тюз , сайтны ачыкъ болгъанына ишексиз б
 
 'enotif_mailer' => '{{SITENAME}} Билдириу Почта',
 'enotif_reset' => 'Бютеу бетлени къаралгъанча белгиле',
-'enotif_newpagetext' => 'Бу джангы бетди',
 'enotif_impersonal_salutation' => '{{SITENAME}} къошулуучу',
-'changed' => 'тюрленди',
-'created' => 'къуралды',
-'enotif_subject' => '{{SITENAME}} бет $PAGETITLE, $PAGEEDITOR джанындан $CHANGEDORCREATED этилгенди.',
 'enotif_lastvisited' => 'Ахыр кириуюгюзден бу кереге дери болгъан бютеу тюрлениулени кёрюр ючюн $1-ге къара.',
 'enotif_lastdiff' => 'Бу тюрлениуню кёрюр ючюн, $1 бетге къарагъыз.',
 'enotif_anon_editor' => 'аноним къошулуучу $1',
@@ -1936,14 +2006,14 @@ $NEWPAGE
 эл. почта: $PAGEEDITOR_EMAIL
 вики: $PAGEEDITOR_WIKI
 
\91Ñ\83 Ð±ÐµÑ\82ге ÐºÐ¸Ñ\80гинÑ\87игизге Ð´ÐµÑ\80и Ð±Ñ\83 Ð±ÐµÑ\82 Ð±Ð»Ð° Ð±Ð°Ð¹Ð»Ð°Ð¼Ð»Ñ\8b Ð±Ð°Ñ\88Ñ\85а Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83лени Ñ\8eÑ\81Ñ\8eнден Ñ\85апаÑ\80 Ð´Ð¶Ð¸Ð±ÐµÑ\80иллик Ñ\82Ñ\8eлдÑ\8e. Ð¡Ð°Ð½Ñ\87Ñ\8bкÑ\8aлаÑ\83 Ñ\81пиÑ\81огÑ\83гÑ\8aÑ\83здагÑ\8aÑ\83 бютеу бетлени билдириу джибериу опцияларын джукълаталлыкъсыз.
\91Ñ\83 Ð±ÐµÑ\82ге ÐºÐ¸Ñ\80гинÑ\87игизге Ð´ÐµÑ\80и Ð±Ñ\83 Ð±ÐµÑ\82 Ð±Ð»Ð° Ð±Ð°Ð¹Ð»Ð°Ð¼Ð»Ñ\8b Ð±Ð°Ñ\88Ñ\85а Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83лени Ñ\8eÑ\81Ñ\8eнден Ñ\85апаÑ\80 Ð´Ð¶Ð¸Ð±ÐµÑ\80иллик Ñ\82Ñ\8eлдÑ\8e. Ð\9aÑ\91зде Ñ\82Ñ\83Ñ\80гÑ\8aан Ñ\82измегиздеги бютеу бетлени билдириу джибериу опцияларын джукълаталлыкъсыз.
 
 {{SITENAME}} сайтны билдириу системасы.
 
 --
 
 Джарашдырыуланы тюрлендирир ючюн:
-{{canonicalurl:Special:Watchlist/edit}}
+{{fullurl:{{#special:Watchlist}}/edit}}
 
 Кёзде тургъан тизмеден кетерир ючюн:
 $UNWATCHURL
@@ -1966,9 +2036,9 @@ $UNWATCHURL
 'actioncomplete' => 'Этим толтурулду',
 'actionfailed' => 'Этим джетишимсиз болду',
 'deletedtext' => '«$1» бет кетерилди.
\90Ñ\85Ñ\8bÑ\80 ÐºÐµÑ\82еÑ\80илгенлени Ñ\81пиÑ\81огÑ\83н кёрюр ючюн, $2на къарагъыз.',
\90Ñ\85Ñ\8bÑ\80 ÐºÐµÑ\82еÑ\80илгенлени Ñ\82измеÑ\81ин кёрюр ючюн, $2на къарагъыз.',
 'dellogpage' => 'Кетерилгенлени журналы',
-'dellogpagetext' => 'ТÑ\8eбÑ\8eндеги Ñ\81пиÑ\81ок ахыр кетериулени журналыды.',
+'dellogpagetext' => 'ТÑ\8eбÑ\8eндеги Ñ\82изме ахыр кетериулени журналыды.',
 'deletionlog' => 'кетериулени журналы',
 'reverted' => 'Алгъынгы версиясына къайтарылгъанды',
 'deletecomment' => 'Чурум:',
@@ -1978,7 +2048,7 @@ $UNWATCHURL
 ** Авторну тилеги
 ** Автор хакъланы бузуу
 ** Вандализм',
-'delete-edit-reasonlist' => 'ЧÑ\83Ñ\80Ñ\83мланÑ\8b Ñ\81пиÑ\81огÑ\83Ñ\82 тюрлендир',
+'delete-edit-reasonlist' => 'ЧÑ\83Ñ\80Ñ\83мланÑ\8b Ñ\82измеÑ\81ин тюрлендир',
 'delete-toobig' => 'Бу бетни, $1 {{PLURAL:$1|версияла|версияла}} бла бек узун тарихи барды.
 Быллай бетлени кетерилиую, {{SITENAME}} сайтны бузмаз ючюн чекленгенди.',
 'delete-warning-toobig' => 'Бу бетни уллу тюрлендириу тарихи барды, $1 {{PLURAL:$1|версиядан|версиядан}} артыкъ.
@@ -1991,10 +2061,10 @@ $UNWATCHURL
 'rollbacklink' => 'ызына къайтарыу',
 'rollbackfailed' => 'Ызына алыу джетишимсизди',
 'cantrollback' => 'Бетге ахыр юлюш къошхан къошулуучу, бетге юлюшюн къошхан джангыз адам болгъаны себебли, тюрлендириуле ызына алыналмайдыла.',
-'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) джанындан [[:$1]] бетде этилген ахыр тюрлендириу ызына алыналмайды;
+'alreadyrolled' => '[[User:$2|$2]] ([[User talk:$2|сюзюу]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) джанындан [[:$1]] бетде этилген ахыр тюрлендириу ызына алыналмайды;
 башха бири бетде тюрлендириу этди неда бетни ызына алды.
 
-Ахыр тюрлендириуюню этген: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).',
+Ахыр тюрлендириуюню этген: [[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]] къошулуучуну версиясына къайтарылдыла',
@@ -2013,7 +2083,7 @@ $2 тюрлендирген алгъаракъ версиясына къайты
 Андан аслам билги ючюн [[Special:ProtectedPages|Коруугъа алыннган бетле]] атлы бетге къараргъа боллукъсуз.',
 'protectedarticle' => '«[[$1]]» джакъланыбды',
 'modifiedarticleprotection' => '"[[$1]]" бетни джакъланыу дараджасы тюрленилгенди',
-'unprotectedarticle' => '"[[$1]]" бетден къоруулау алыннганды',
+'unprotectedarticle' => '«[[$1]]» бетден джакълыкъ алыннганды',
 'movedarticleprotection' => 'Къоруулауну джарашдырыулары "[[$2]]" бетден "[[$1]]" бетге кёчюрюлгенди',
 'protect-title' => '"$1" ючюн къоруулау дараджаны сайлагъыз',
 'prot_1movedto2' => '[[$1]] бетни джангы аты: [[$2]]',
@@ -2049,7 +2119,7 @@ $2 тюрлендирген алгъаракъ версиясына къайты
 ** Тохтаусуз спам
 ** Тюрлендириулени урушу
 ** Мийик трафикли бет',
-'protect-edit-reasonlist' => 'ЧÑ\83Ñ\80Ñ\83мланÑ\8b Ñ\81пиÑ\81огÑ\83н тюрлендир',
+'protect-edit-reasonlist' => 'ЧÑ\83Ñ\80Ñ\83мланÑ\8b Ñ\82измеÑ\81ин тюрлендир',
 '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' => 'Ийилген дараджасы:',
@@ -2125,7 +2195,7 @@ $1',
 # Contributions
 'contributions' => 'Къошулуучуну къошханы',
 'contributions-title' => '$1 къошулуучуну къошагъы',
-'mycontris' => 'Ð\9aÑ\8aоÑ\88Ñ\85анÑ\8bм',
+'mycontris' => 'Ð\9aÑ\8aоÑ\88Ñ\83м',
 'contribsub2' => '$1 ($2) къошакъ',
 'nocontribs' => 'Бу критерийлеге келишген тюрлениуле табылмадыла',
 'uctop' => '(ахыргъы)',
@@ -2165,10 +2235,11 @@ $1',
 'whatlinkshere-hideredirs' => 'джибериуле $1',
 'whatlinkshere-hidetrans' => 'Къошулуулары $1',
 'whatlinkshere-hidelinks' => '$1 джибериуле',
-'whatlinkshere-hideimages' => 'СÑ\83Ñ\80аÑ\82лагÑ\8aа Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83ле $1',
+'whatlinkshere-hideimages' => 'Файл Ð´Ð¶Ð¸Ð±ÐµÑ\80иÑ\83лени $1',
 'whatlinkshere-filters' => 'Фильтрле',
 
 # Block/unblock
+'block' => 'Къошулуучуну блокла',
 'blockip' => 'Бу къошулуучуну блок эт',
 'blockip-title' => 'Къошулуучуну блокга салыу',
 'blockip-legend' => 'Къошулуучуну блокга салыу',
@@ -2198,9 +2269,9 @@ $1',
 'ipb-change-block' => 'Бу джарашдырыула бла къошулуучуну джангыдан тый',
 'badipaddress' => 'Терс IP-адрес',
 'blockipsuccesssub' => 'Тыйыу джетишимли болду',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] тыйылды. <br />
¢Ñ\8bйÑ\8bÑ\83ланÑ\8b ÐºÑ\91Ñ\80Ñ\8eÑ\80 Ñ\8eÑ\87Ñ\8eн [[Special:BlockList|Ñ\82Ñ\8bйÑ\8bлгÑ\8aан IP-адÑ\80еÑ\81лени Ñ\81пиÑ\81огÑ\83на]] къарагъыз.',
-'ipb-edit-dropdown' => 'ЧÑ\83Ñ\80Ñ\83мланÑ\8b Ñ\81пиÑ\81огÑ\83н тюрлендир',
+'blockipsuccesstext' => '[[Special:Contributions/$1|«$1»]] блокланды.<br />
\91локланÑ\8bÑ\83ланÑ\8b ÐºÑ\91Ñ\80Ñ\8eÑ\80 Ñ\8eÑ\87Ñ\8eн [[Special:BlockList|блокланнган IP-адÑ\80еÑ\81лени Ñ\82измеÑ\81ине]] къарагъыз.',
+'ipb-edit-dropdown' => 'ЧÑ\83Ñ\80Ñ\83мланÑ\8b Ñ\82измеÑ\81ин тюрлендир',
 'ipb-unblock-addr' => '$1 блокдан ал',
 'ipb-unblock' => 'Къошулуучуну неда IP-адресни тыйылыуун тохтат',
 'ipb-blocklist' => 'Бусагъатдагъы болгъан тыйгъычланы кёргюз',
@@ -2212,7 +2283,11 @@ $1',
 'unblocked-id' => '$1 тыйылыу къоратылгъанды',
 'ipblocklist' => 'Блок этилиннген къошулуучула',
 'ipblocklist-legend' => 'Тыйылгъан къошулуучуну аты',
+'blocklist-timestamp' => 'Дата/заман',
+'blocklist-target' => 'Ышан',
 'blocklist-expiry' => 'Бошалыу датасы',
+'blocklist-by' => 'Блоклагъан администратор',
+'blocklist-params' => 'Блоклауну параметрлери',
 'blocklist-reason' => 'Чурум',
 'ipblocklist-submit' => 'Таб',
 'ipblocklist-localblock' => 'Локал блокга салыу',
@@ -2224,7 +2299,7 @@ $1',
 'createaccountblock' => 'тергеу джазыула къураргъа болмайды',
 'emailblock' => 'e-mail иерге болмайды',
 'blocklist-nousertalk' => 'кесини сюзюу бетин тюрлендирелмейди',
-'ipblocklist-empty' => 'Ð\91локга Ñ\81алÑ\8bÑ\83ланÑ\8b Ñ\81пиÑ\81огÑ\83 бошду.',
+'ipblocklist-empty' => 'Ð\91локга Ñ\81алÑ\8bÑ\83ланÑ\8b Ñ\82измеÑ\81и бошду.',
 'ipblocklist-no-results' => 'Берилген IP-адрес неда къошулуучу ат блокга салынмагъанды.',
 'blocklink' => 'блок эт',
 'unblocklink' => 'блокну ал',
@@ -2241,7 +2316,7 @@ $1',
 'reblock-logentry' => '[[$1]] ючюн бошалыу заманын $2 $3 этиб тыйыу джарашдырыуларын тюрлендирди',
 'blocklogtext' => 'Къошулуучуланы тыйылыу бла тыйылыудан чыгъарыуну журналы.
 Автомат халда тыйылгъан IP-адресле былайда кёргюзюлмейдиле.
-Банла бла блокланы кёрюр ючюн [[Special:BlockList|IP блок списогуна]] къарагъыз.',
+Банла бла блокланы кёрюр ючюн [[Special:BlockList|блок тизмесине]] къарагъыз.',
 'unblocklogentry' => '$1 къошулуучудан блок алынды',
 'block-log-flags-anononly' => 'джангыз аноним къошулуучула',
 'block-log-flags-nocreate' => 'Тергеу джазыуланы (аккаунтланы) регистрациялары тыйылыбды',
@@ -2343,7 +2418,7 @@ $1',
 'movepage-moved-noredirect' => 'Джибериу къуралыу басдырылды.',
 'articleexists' => 'Быллай аты бла бет барды неда сиз джазгъан ат джарамайды.
 Башха ат сайлагъыз.',
-'cantmove-titleprotected' => 'Ð\91Ñ\83 Ð±ÐµÑ\82ни Ð°Ñ\82Ñ\8bн Ñ\82Ñ\8eÑ\80лендиÑ\80еллик Ñ\82Ñ\8eлÑ\81Ñ\8eз, Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ð°Ñ\82 Ð´Ð¶Ð°Ñ\80аÑ\83Ñ\81Ñ\83з Ð°Ñ\82ланÑ\8b Ñ\81пиÑ\81огÑ\83ндадÑ\8b.',
+'cantmove-titleprotected' => 'Ð\91Ñ\83 Ð±ÐµÑ\82ни Ð°Ñ\82Ñ\8bн Ñ\82Ñ\8eÑ\80лендиÑ\80еллик Ñ\82Ñ\8eлÑ\81Ñ\8eз, Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ð°Ñ\82 Ð´Ð¶Ð°Ñ\80аÑ\83Ñ\81Ñ\83з Ð°Ñ\82ланÑ\8b Ñ\82измеÑ\81индеди.',
 'talkexists' => "'''Бетни аты тюрленнгенди, алай а сюзюу бетни кёчюрюрге джарамайды, аллай аты бла бет болгъаны ючюн. Къол бла къошугъуз аланы бири-бирлерине.'''",
 'movedto' => 'аты тюрленнгенди:',
 'movetalk' => 'Байламлы сюзюу бетни атын тюрлендир',
@@ -2354,7 +2429,7 @@ $1',
 'movepage-page-unmoved' => '$1 бет $2 бетге атын ауушдуралмаз.',
 'movepage-max-pages' => 'Эм кёб $1 {{PLURAL:$1|бет|бет}} атын тюрлендирди эм андан асламы автомат халда атын тюрлендирелмез.',
 'movelogpage' => 'Атла тюрлениуню журналы',
-'movelogpagetext' => 'ТÑ\8eбÑ\8eнде Ð±Ð¾Ð»Ð³Ñ\8aан Ñ\81пиÑ\81ок аты тюрлендирилген бетлени кёргюзеди.',
+'movelogpagetext' => 'ТÑ\8eбÑ\8eнде Ð±Ð¾Ð»Ð³Ñ\8aан Ñ\82изме аты тюрлендирилген бетлени кёргюзеди.',
 'movesubpage' => '{{PLURAL:$1|Subpage|Бет тюбле}}',
 'movesubpagetext' => 'Бу бетни тюбюнде кёргюзюлген $1 {{PLURAL:$1|бет тюбю|бет тюбю}} барды.',
 'movenosubpage' => 'Бу бетни тюб бети джокъду.',
@@ -2410,7 +2485,7 @@ $1',
 'allmessagesname' => 'Ат',
 'allmessagesdefault' => 'Оригинал текст',
 'allmessagescurrent' => 'Хайырлана тургъан текст',
-'allmessagestext' => 'Ð\91Ñ\83 Ñ\81пиÑ\81ок MediaWiki Ð°Ñ\82 Ð°Ð»Ð°Ð¼Ñ\8bнда Ð±Ð°Ñ\80 Ð±Ð¾Ð»Ð³Ñ\8aан Ñ\81иÑ\81Ñ\82ема Ð±Ð¸Ð»Ð´Ð¸Ñ\80иÑ\83лени Ñ\81пиÑ\81огÑ\83дÑ\83.
+'allmessagestext' => 'Ð\91Ñ\83 Ñ\82изме MediaWiki Ð°Ñ\82 Ð°Ð»Ð°Ð¼Ñ\8bнда Ð±Ð°Ñ\80 Ð±Ð¾Ð»Ð³Ñ\8aан Ñ\81иÑ\81Ñ\82ема Ð±Ð¸Ð»Ð´Ð¸Ñ\80иÑ\83лени Ñ\82измеÑ\81иди.
 MediaWiki локализациясына юлюш къошаргъа излей эсегиз, [//www.mediawiki.org/wiki/Localisation MediaWiki локализация] бла [//translatewiki.net translatewiki.net] сайтлагъа киригиз.',
 'allmessagesnotsupportedDB' => "'''\$wgUseDatabaseMessages''' джабыкъ болгъаны ючюн '''{{ns:special}}:Allmessages''' хайырланыугъа ачыкъ тюлдю.",
 'allmessages-filter-legend' => 'Фильтр',
@@ -2447,8 +2522,7 @@ MediaWiki локализациясына юлюш къошаргъа излей
 'import-interwiki-namespace' => 'Нюзюр ат алам:',
 'import-upload-filename' => 'Файлны аты:',
 'import-comment' => 'Эсгериу:',
-'importtext' => 'Файлны вики къайнакъдан [[Special:Export|экспорт амал бла]] эскпорт эт.
-Компьютеригизге салыгъыз эм былайгъа джюклегиз.',
+'importtext' => 'Бетни къайнакъ викиден [[Special:Export|адырны хайырландырыб]] эскпорт этигиз. Файлны дискде сакълагъыз эм былайгъа джюклегиз.',
 'importstart' => 'Файлла импорт этиле турадыла...',
 'import-revision-count' => '$1 {{PLURAL:$1|версия|версия}}',
 'importnopages' => 'Импорт этиллик бет джокъду',
@@ -2574,7 +2648,7 @@ MediaWiki локализациясына юлюш къошаргъа излей
 
 # Spam protection
 'spamprotectiontitle' => 'Спамгъа къаршчы фильтр',
-'spamprotectiontext' => 'Ð\9aÑ\8aоÑ\88аÑ\80гÑ\8aа Ð¸Ð·Ð»ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82 Ñ\81пам Ñ\84илÑ\8cÑ\82Ñ\80 Ð±Ð»Ð° Ð±Ð»Ð¾Ðº Ñ\8dÑ\82илгенди. Ð\9aÑ\8aаÑ\80а Ñ\81пиÑ\81окдагÑ\8aÑ\8b тыш джибериуле чурум болургъа боллукъдула.',
+'spamprotectiontext' => 'Ð\9aÑ\8aоÑ\88аÑ\80гÑ\8aа Ð¸Ð·Ð»ÐµÐ³ÐµÐ½ Ð±ÐµÑ\82 Ñ\81пам Ñ\84илÑ\8cÑ\82Ñ\80 Ð±Ð»Ð° Ð±Ð»Ð¾Ðº Ñ\8dÑ\82илгенди. Ð\9aÑ\8aаÑ\80а Ñ\82измедеги тыш джибериуле чурум болургъа боллукъдула.',
 'spamprotectionmatch' => 'Спам фильтр ишлетген текст: $1',
 'spambot_username' => 'Спамны ариулау',
 'spam_reverting' => '$1 бла джибериую болмагъан ахыр версиягъа къайтылады',
@@ -2582,10 +2656,28 @@ MediaWiki локализациясына юлюш къошаргъа излей
 
 # Info page
 'pageinfo-title' => '«$1» бетни юсюнден информация',
-'pageinfo-header-edits' => 'Тюрлендириуле',
-'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-language' => 'Бетни ичиндегисини тили',
+'pageinfo-robot-policy' => 'Излеу къуллукъла бла индексация',
+'pageinfo-robot-index' => 'Индексация этиледи',
+'pageinfo-robot-noindex' => 'Индексация этилмейди',
+'pageinfo-views' => 'Къарауланы саны',
+'pageinfo-watchers' => 'Бетни кёзде тутханланы саны',
+'pageinfo-redirects-name' => 'Бу бетге редиректле',
+'pageinfo-edits' => 'Бютеу тюрлендириулени саны',
+'pageinfo-authors' => 'Тюрлю-тюрлю авторланы саны',
+'pageinfo-toolboxlink' => 'Бетни юсюнден',
+'pageinfo-redirectsto' => 'Башха бетге редиректди —',
+'pageinfo-redirectsto-info' => 'билги',
+'pageinfo-contentpage-yes' => 'Хоу',
+'pageinfo-protect-cascading-yes' => 'Хоу',
 
 # Skin names
 'skinname-standard' => 'Стандарт',
@@ -2671,7 +2763,7 @@ $1',
 # Bad image list
 'bad_image_list' => 'Формат былай болургъа керекди:
 
\9aÑ\8aÑ\83Ñ\80Ñ\83 Ñ\81пиÑ\81окнÑ\83 кесеклери (* символдан башланнганла) саналлыкъдыла.
\9aÑ\8aÑ\83Ñ\80Ñ\83 Ñ\82измени кесеклери (* символдан башланнганла) саналлыкъдыла.
 Тизгинни биринчи джибериую салыргъа болмагъан (аман) суратха джибериу болургъа керекди.
 Андан ары баргъан джибериуле ол тизгинде, сурат къошулургъа болгъан статьялагъа джибериулеге саналлыкъдыла.',
 
@@ -3197,8 +3289,8 @@ $5
 Нормал ал къарауну хайырланыгъыз.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => '$1 {{PLURAL:$1|Ñ\81екÑ\83ндан|Ñ\81екÑ\83ндан}} Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83ле Ð±Ñ\83 Ñ\81пиÑ\81окда кёрюнмезге боллукъдула.',
-'lag-warn-high' => 'Ð\91илги Ð±Ð°Ð·Ð°Ð½Ñ\8b Ñ\81еÑ\80веÑ\80индеги Ð±ÐµÐº ÐºÐµÑ\87игиÑ\83 Ñ\81ебебли, $1 {{PLURAL:$1|Ñ\81екÑ\83ндан|Ñ\81екÑ\83ндан}} Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83ле Ð±Ñ\83 Ñ\81пиÑ\81окда кёрюнмей къалыргъа болур.',
+'lag-warn-normal' => '$1 {{PLURAL:$1|Ñ\81екÑ\83ндан|Ñ\81екÑ\83ндан}} Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83ле Ð±Ñ\83 Ñ\82измеде кёрюнмезге боллукъдула.',
+'lag-warn-high' => 'Ð\91илги Ð±Ð°Ð·Ð°Ð½Ñ\8b Ñ\81еÑ\80веÑ\80индеги Ð±ÐµÐº ÐºÐµÑ\87игиÑ\83 Ñ\81ебебли, $1 {{PLURAL:$1|Ñ\81екÑ\83ндан|Ñ\81екÑ\83ндан}} Ð´Ð¶Ð°Ð½Ð³Ñ\8b Ñ\82Ñ\8eÑ\80лендиÑ\80иÑ\83ле Ð±Ñ\83 Ñ\82измеде кёрюнмей къалыргъа болур.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Кёзде тургъан тизмеде {{PLURAL:$1|1 джазылгъан|$1 джазылгъан}} барды, сюзюу бетлени тышында.',
@@ -3222,8 +3314,8 @@ $5
 'watchlistedit-raw-removed' => '{{PLURAL:$1|1 башлыкъ|$1 башлыкъ}} кетерилди:',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'СпиÑ\81окдан бетледе тюрлениуле',
-'watchlisttools-edit' => 'Ð\9aÑ\8aаÑ\80а/Ñ\82Ñ\8eÑ\80лендиÑ\80 Ñ\81пиÑ\81окну',
+'watchlisttools-view' => 'Тизмеден бетледе тюрлениуле',
+'watchlisttools-edit' => 'Тизмеге ÐºÑ\8aаÑ\80аÑ\83 Ñ\8dм Ñ\82Ñ\8eÑ\80лендиÑ\80иу',
 'watchlisttools-raw' => 'Текстча тюрлендириу',
 
 # Iranian month names
@@ -3341,12 +3433,12 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 * <span class="mw-specialpagecached">Кэш этилген къуллукъчу бетле (эски болургъа боллукъдула).</span>',
 'specialpages-group-maintenance' => 'Техника баджарыуну отчетлары',
 'specialpages-group-other' => 'Башха къуллукъчу бетле',
-'specialpages-group-login' => 'СиÑ\81Ñ\82емагÑ\8aа ÐºÐ¸Ñ\80/регистрация эт',
+'specialpages-group-login' => 'Ð\9aиÑ\80 / регистрация эт',
 'specialpages-group-changes' => 'Ахыр тюрлендириуле бла журналла',
 'specialpages-group-media' => 'Медиа-материалланы юсюнден отчетла бла джюклеуле',
 'specialpages-group-users' => 'Къошулуучула эм хакълары',
 'specialpages-group-highuse' => 'Бек хайырландырылгъан бетле',
-'specialpages-group-pages' => 'Ð\91еÑ\82лени Ñ\81пиÑ\81оклаÑ\80Ñ\8b',
+'specialpages-group-pages' => 'Ð\91еÑ\82лени Ñ\82измелеÑ\80и',
 'specialpages-group-pagetools' => 'Бетге инструментле',
 'specialpages-group-wiki' => 'Вики-билгиле эм инструментле',
 'specialpages-group-redirects' => 'Джиберген къуллукъчу бетле',
@@ -3371,9 +3463,9 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'tag-filter' => '[[Special:Tags|Тег]] фильтр:',
 'tag-filter-submit' => 'Фильтрлендир',
 'tags-title' => 'Тегле',
-'tags-intro' => 'Ð\91Ñ\83 Ð±ÐµÑ\82, Ð´Ð¶Ð°Ð·Ñ\8bлÑ\8bÑ\83нÑ\83 Ñ\82Ñ\8eÑ\80лениÑ\83Ñ\8eнÑ\8e ÐºÑ\91Ñ\80гÑ\8eзÑ\8eÑ\80ге Ð±Ð¾Ð»Ð»Ñ\83кÑ\8a Ñ\82еглени Ñ\8dм Ð°Ð»Ð°Ð½Ñ\8b Ð°Ð½Ð³Ñ\8bламлаÑ\80Ñ\8bнÑ\8b Ñ\81пиÑ\81огÑ\83дÑ\83.',
+'tags-intro' => 'Ð\91Ñ\83 Ð±ÐµÑ\82, Ð´Ð¶Ð°Ð·Ñ\8bлÑ\8bÑ\83нÑ\83 Ñ\82Ñ\8eÑ\80лениÑ\83Ñ\8eнÑ\8e ÐºÑ\91Ñ\80гÑ\8eзÑ\8eÑ\80ге Ð±Ð¾Ð»Ð»Ñ\83кÑ\8a Ñ\82еглени Ñ\8dм Ð°Ð»Ð°Ð½Ñ\8b Ð°Ð½Ð³Ñ\8bламлаÑ\80Ñ\8bнÑ\8b Ñ\82измеÑ\81иди.',
 'tags-tag' => 'Тегни аты',
-'tags-display-header' => 'ТÑ\8eÑ\80лендиÑ\80иÑ\83лени Ñ\81пиÑ\81оклаÑ\80Ñ\8bнда кёрюнюу',
+'tags-display-header' => 'ТÑ\8eÑ\80лендиÑ\80иÑ\83лени Ñ\82измелеÑ\80инде кёрюнюу',
 'tags-description-header' => 'Магъананы толу ангылтыуу',
 'tags-hitcount-header' => 'Белгиленнген тюрлендириуле',
 'tags-edit' => 'тюрлендир',
@@ -3419,12 +3511,20 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 '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, $3 бетни $4 версияын партруль этиб чыкъды',
 'logentry-patrol-patrol-auto' => '$1, $3 бетни $4 версиясын автомат халда тинтиб чыкъды',
-'logentry-newusers-create' => '$1 тергеу джазыу (аккаунт) къурады',
+'logentry-newusers-newusers' => '$1 тергеу джазыу (аккаунт) къуралды',
+'logentry-newusers-create' => '$1 тергеу джазыу (аккаунт) къуралды',
+'logentry-newusers-create2' => '$1, $3 тергеу джазыуну къурады',
+'logentry-newusers-autocreate' => '$1 тергеу джазыу автомат халда къуралды',
 'newuserlog-byemail' => 'пароль электрон почта бла джиберилгенди',
 
 # Feedback
@@ -3435,6 +3535,10 @@ MediaWiki хайырлы боллукъду деген умут бла джай
 'feedback-error2' => 'Халат. Тюзетиу ётмеди',
 'feedback-close' => 'Тындырылды',
 
+# Search suggestions
+'searchsuggest-search' => 'Излеу',
+'searchsuggest-containing' => 'ичиндегиси…',
+
 # API errors
 'api-error-badtoken' => 'Ич халат: терс токен.',
 'api-error-duplicate-popup-title' => ' {{PLURAL:$1|Файлны|Файлны}} дубликаты',
@@ -3443,7 +3547,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-banned-type' => '$1 — {{PLURAL:$4|джасакъланнган файл типди|джасакъланнган файл типледиле}}. {{PLURAL:$3|Эркинлик берилген файл тип —|Эркинлик берилген файл типле:}} $2.',
 'api-error-filetype-missing' => 'Файлны кенгериую джокъду.',
 'api-error-hookaborted' => 'Сиз теджеген тюрлендириуню кенгертиуню сюзюучю джасакълагъанды.',
 'api-error-illegal-filename' => 'Джарамагъан файл ат.',
index 89dd72e..ccfbd05 100644 (file)
 
 $messages = array(
 # User preference toggles
-'tog-justify'         => 'jostifai di paragraf-dem',
-'tog-hideminor'       => 'Haid di lili chenj-dem na di risent chenj list',
+'tog-justify' => 'jostifai di paragraf-dem',
+'tog-hideminor' => 'Haid di lili chenj-dem na di risent chenj list',
 'tog-extendwatchlist' => 'Big di wachlist fo sho ol di chenj-dem,  pas di risent chenj-dem nomo',
 
 # Dates
-'sunday'        => 'Sonde',
-'monday'        => 'Monde',
-'tuesday'       => 'Tyuzde',
-'wednesday'     => 'Wenzde',
-'thursday'      => 'Tozde',
-'friday'        => 'Fraide',
-'saturday'      => 'Satide',
-'sun'           => 'Son',
-'mon'           => 'Mon',
-'tue'           => 'Tyu',
-'wed'           => 'Wen',
-'thu'           => 'Toz',
-'fri'           => 'Frai',
-'sat'           => 'Sat',
-'january'       => 'Janyuari',
-'february'      => 'Febyuari',
-'march'         => 'Mach',
-'april'         => 'Epril',
-'may_long'      => 'Mey',
-'june'          => 'Jun',
-'july'          => 'Julai',
-'august'        => 'Ogost',
-'september'     => 'Septemba',
-'october'       => 'Oktoba',
-'november'      => 'Novemba',
-'december'      => 'Disemba',
-'january-gen'   => 'Janyuari',
-'february-gen'  => 'Febyuari',
-'march-gen'     => 'Mach',
-'april-gen'     => 'Epril',
-'may-gen'       => 'Mey',
-'june-gen'      => 'Jun',
-'july-gen'      => 'Julai',
-'august-gen'    => 'Ogost',
+'sunday' => 'Sonde',
+'monday' => 'Monde',
+'tuesday' => 'Tyuzde',
+'wednesday' => 'Wenzde',
+'thursday' => 'Tozde',
+'friday' => 'Fraide',
+'saturday' => 'Satide',
+'sun' => 'Son',
+'mon' => 'Mon',
+'tue' => 'Tyu',
+'wed' => 'Wen',
+'thu' => 'Toz',
+'fri' => 'Frai',
+'sat' => 'Sat',
+'january' => 'Janyuari',
+'february' => 'Febyuari',
+'march' => 'Mach',
+'april' => 'Epril',
+'may_long' => 'Mey',
+'june' => 'Jun',
+'july' => 'Julai',
+'august' => 'Ogost',
+'september' => 'Septemba',
+'october' => 'Oktoba',
+'november' => 'Novemba',
+'december' => 'Disemba',
+'january-gen' => 'Janyuari',
+'february-gen' => 'Febyuari',
+'march-gen' => 'Mach',
+'april-gen' => 'Epril',
+'may-gen' => 'Mey',
+'june-gen' => 'Jun',
+'july-gen' => 'Julai',
+'august-gen' => 'Ogost',
 'september-gen' => 'Septemba',
-'october-gen'   => 'Oktoba',
-'november-gen'  => 'Novemba',
-'december-gen'  => 'Disemba',
-'jan'           => 'Jan',
-'feb'           => 'Feb',
-'mar'           => 'Mach',
-'apr'           => 'Epr',
-'may'           => 'Mey',
-'jun'           => 'Jun',
-'jul'           => 'Jul',
-'aug'           => 'Og',
-'sep'           => 'Sep',
-'oct'           => 'Okt',
-'nov'           => 'Nov',
-'dec'           => 'Dis',
+'october-gen' => 'Oktoba',
+'november-gen' => 'Novemba',
+'december-gen' => 'Disemba',
+'jan' => 'Jan',
+'feb' => 'Feb',
+'mar' => 'Mach',
+'apr' => 'Epr',
+'may' => 'Mey',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Og',
+'sep' => 'Sep',
+'oct' => 'Okt',
+'nov' => 'Nov',
+'dec' => 'Dis',
 
 # Categories related messages
-'pagecategories'        => '{{PLURAL:$1|Katigori|Katigori-dem}}',
-'category_header'       => 'Pej-dehm we de na katigori "$1"',
-'subcategories'         => 'Sobkatigori-dem',
+'pagecategories' => '{{PLURAL:$1|Katigori|Katigori-dem}}',
+'category_header' => 'Pej-dehm we de na katigori "$1"',
+'subcategories' => 'Sobkatigori-dem',
 'category-media-header' => 'Midya we de na katigori "$1"',
-'category-empty'        => "''Dis katigori-ya no get no pej o midya fo naw.''",
-'hidden-categories'     => '{{PLURAL:$1|Katigori we dem don haid|Katigori-dem we dehm don haid}}',
+'category-empty' => "''Dis katigori-ya no get no pej o midya fo naw.''",
+'hidden-categories' => '{{PLURAL:$1|Katigori we dem don haid|Katigori-dem we dehm don haid}}',
 
-'cancel'     => 'Kansul',
-'mytalk'     => 'Mi Tok',
+'cancel' => 'Kansul',
+'mytalk' => 'Mi Tok',
 'navigation' => 'Navigeshon',
 
 # Cologne Blue skin
-'qbedit'  => 'Edit',
-'faq'     => 'Kwestyon we dem de aks boku',
+'qbedit' => 'Edit',
+'faq' => 'Kwestyon we dem de aks boku',
 'faqpage' => 'Project:Kwehstyohn-dehm we ohlman de aks',
 
 # Vector skin
-'vector-action-move'     => 'Muf',
-'vector-view-edit'       => 'Chenj',
-'vector-view-history'    => 'Luk histri',
-'vector-view-view'       => 'Rid',
+'vector-action-move' => 'Muf',
+'vector-view-edit' => 'Chenj',
+'vector-view-history' => 'Luk histri',
+'vector-view-view' => 'Rid',
 'vector-view-viewsource' => 'Luk di sos',
-'actions'                => 'Akshon-dem',
-'namespaces'             => 'Nemspes-dem',
-
-'errorpagetitle'   => 'Problem',
-'returnto'         => 'Go bak tu $1.',
-'tagline'          => 'Dis komot {{SITENAME}}',
-'help'             => 'Hep',
-'search'           => 'Luk fo',
-'searchbutton'     => 'Luk fo',
-'go'               => 'Go',
-'searcharticle'    => 'Go',
-'history'          => 'Pej-im histri',
-'history_short'    => 'Histri',
-'updatedmarker'    => 'wetin dem don opdet from we A las vizit',
+'actions' => 'Akshon-dem',
+'namespaces' => 'Nemspes-dem',
+
+'errorpagetitle' => 'Problem',
+'returnto' => 'Go bak tu $1.',
+'tagline' => 'Dis komot {{SITENAME}}',
+'help' => 'Hep',
+'search' => 'Luk fo',
+'searchbutton' => 'Luk fo',
+'go' => 'Go',
+'searcharticle' => 'Go',
+'history' => 'Pej-im histri',
+'history_short' => 'Histri',
+'updatedmarker' => 'wetin dem don opdet from we A las vizit',
 'printableversion' => 'Vazhon fo Print',
-'permalink'        => 'Pamanent link',
-'print'            => 'Print',
-'edit'             => 'Edit',
-'create'           => 'Mek',
-'editthispage'     => 'Edit dis pej-ya',
+'permalink' => 'Pamanent link',
+'print' => 'Print',
+'edit' => 'Edit',
+'create' => 'Mek',
+'editthispage' => 'Edit dis pej-ya',
 'create-this-page' => 'Mek dis pej-ya',
-'delete'           => 'Dilit',
-'deletethispage'   => 'Dilit dis pej-ya',
-'protect'          => 'Protekt',
-'protect_change'   => 'chenj',
-'protectthispage'  => 'Protekt dis pej-ya',
+'delete' => 'Dilit',
+'deletethispage' => 'Dilit dis pej-ya',
+'protect' => 'Protekt',
+'protect_change' => 'chenj',
+'protectthispage' => 'Protekt dis pej-ya',
 'talkpagelinktext' => 'Tok',
-'specialpage'      => 'Speshal Pej',
-'personaltools'    => 'Pasonal tul-dèm',
-'postcomment'      => 'Nyu sekshon',
-'articlepage'      => 'Luk kontent pej',
-'talk'             => 'Diskoshon',
-'views'            => 'Vyu-dem',
-'toolbox'          => 'Tulboks',
-'userpage'         => 'Luk dis yuza-im pej',
-'otherlanguages'   => 'Na oda langwej-dem',
-'jumpto'           => 'Jomp go:',
+'specialpage' => 'Speshal Pej',
+'personaltools' => 'Pasonal tul-dèm',
+'postcomment' => 'Nyu sekshon',
+'articlepage' => 'Luk kontent pej',
+'talk' => 'Diskoshon',
+'views' => 'Vyu-dem',
+'toolbox' => 'Tulboks',
+'userpage' => 'Luk dis yuza-im pej',
+'otherlanguages' => 'Na oda langwej-dem',
+'jumpto' => 'Jomp go:',
 'jumptonavigation' => 'navigeshon',
-'jumptosearch'     => 'Luk fo',
+'jumptosearch' => 'Luk fo',
 
 # 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'            => 'Na bot {{SITENAME}}',
-'aboutpage'            => 'Project:Na bot',
-'copyright'            => 'Dis kontent de onda $1 .',
-'currentevents'        => 'Korent ivent-dem',
-'currentevents-url'    => 'Project:Korent ivent-dem',
-'disclaimers'          => 'Disklema-dem',
-'disclaimerpage'       => 'Project:Jeneral disklema',
-'edithelp'             => 'Advais foh we yu wan fo edit',
-'edithelppage'         => 'Help:Editin',
-'helppage'             => 'Help:Kontent-dem',
-'mainpage'             => 'Men Pej',
+'aboutsite' => 'Na bot {{SITENAME}}',
+'aboutpage' => 'Project:Na bot',
+'copyright' => 'Dis kontent de onda $1 .',
+'currentevents' => 'Korent ivent-dem',
+'currentevents-url' => 'Project:Korent ivent-dem',
+'disclaimers' => 'Disklema-dem',
+'disclaimerpage' => 'Project:Jeneral disklema',
+'edithelp' => 'Advais foh we yu wan fo edit',
+'edithelppage' => 'Help:Editin',
+'helppage' => 'Help:Kontent-dem',
+'mainpage' => 'Men Pej',
 'mainpage-description' => 'Men Pej',
-'policy-url'           => 'Project:Polisi',
-'portal'               => 'Mitin-ples fo yuza-dem',
-'portal-url'           => 'Project:Mitin-ples fo yuza-dem',
-'privacy'              => 'Polisi fo Praivesi',
-'privacypage'          => 'Project:Polisi fo praivesi',
+'policy-url' => 'Project:Polisi',
+'portal' => 'Mitin-ples fo yuza-dem',
+'portal-url' => 'Project:Mitin-ples fo yuza-dem',
+'privacy' => 'Polisi fo Praivesi',
+'privacypage' => 'Project:Polisi fo praivesi',
 
-'badaccess'        => 'Pamishon problem',
+'badaccess' => 'Pamishon problem',
 'badaccess-group0' => 'Yu no get pamishon foh du wetin yu jos chuz',
 'badaccess-groups' => 'Na di yuza-dem we don join {{PLURAL:$2|di grup|wan pa di grup-dem}}: $1 nomo ebul du wetin yu jos chuz.',
 
-'versionrequired'     => 'Yu nid MediaWiki Vazhon $1',
+'versionrequired' => 'Yu nid MediaWiki Vazhon $1',
 'versionrequiredtext' => 'Yu nid MediaWiki Vazhon $1 foh yuz dis pej-ya.
 Luk [[Special:Version|version page]].',
 
-'ok'                      => 'OK',
+'ok' => 'OK',
 'pagetitle-view-mainpage' => ' 
 {{SAITNEM}}',
-'retrievedfrom'           => 'Dem ritriv am na"$1"',
-'youhavenewmessages'      => 'Yu get $1 ($2).',
-'editsection'             => 'edit',
-'editsection-brackets'    => '[$1]',
-'editold'                 => 'chenj',
-'viewsourceold'           => 'Luk di sos',
-'editlink'                => 'edit',
-'viewsourcelink'          => 'luk di sos',
-'editsectionhint'         => 'edit sekshon: $1',
-'toc'                     => 'Kontent-dem',
-'showtoc'                 => 'sho',
-'hidetoc'                 => 'haid',
-'thisisdeleted'           => 'Luk wetin i bi naw o tohn am bak tu wetin i bin bi bifo $1?',
-'viewdeleted'             => 'Luk am $1?',
-'restorelink'             => '{{PLURAL:$1|wan chenj we dehm dohn ires|$1 chenj-dehm we dehm dohn ires}}',
-'feedlinks'               => 'Feed:',
-'site-rss-feed'           => '$1 RSS Fid',
-'site-atom-feed'          => '$1 Atom Fid',
-'red-link-title'          => '$1 (pej no de)',
+'retrievedfrom' => 'Dem ritriv am na"$1"',
+'youhavenewmessages' => 'Yu get $1 ($2).',
+'editsection' => 'edit',
+'editsection-brackets' => '[$1]',
+'editold' => 'chenj',
+'viewsourceold' => 'Luk di sos',
+'editlink' => 'edit',
+'viewsourcelink' => 'luk di sos',
+'editsectionhint' => 'edit sekshon: $1',
+'toc' => 'Kontent-dem',
+'showtoc' => 'sho',
+'hidetoc' => 'haid',
+'thisisdeleted' => 'Luk wetin i bi naw o tohn am bak tu wetin i bin bi bifo $1?',
+'viewdeleted' => 'Luk am $1?',
+'restorelink' => '{{PLURAL:$1|wan chenj we dehm dohn ires|$1 chenj-dehm we dehm dohn ires}}',
+'feedlinks' => 'Feed:',
+'site-rss-feed' => '$1 RSS Fid',
+'site-atom-feed' => '$1 Atom Fid',
+'red-link-title' => '$1 (pej no de)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Pej',
-'nstab-user'      => 'Yuza-im Pej',
-'nstab-media'     => 'Midya Pej',
-'nstab-special'   => 'Speshal Pej',
-'nstab-project'   => 'Projekt Pej',
-'nstab-image'     => 'Fail',
+'nstab-main' => 'Pej',
+'nstab-user' => 'Yuza-im Pej',
+'nstab-media' => 'Midya Pej',
+'nstab-special' => 'Speshal Pej',
+'nstab-project' => 'Projekt Pej',
+'nstab-image' => 'Fail',
 'nstab-mediawiki' => 'Mesej',
-'nstab-template'  => 'Templet',
-'nstab-help'      => 'Advais pej',
-'nstab-category'  => 'Katigori',
+'nstab-template' => 'Templet',
+'nstab-help' => 'Advais pej',
+'nstab-category' => 'Katigori',
 
 # Main script and global functions
-'nosuchaction'      => 'Da kain akshon no de',
-'nosuchactiontext'  => 'Di wiki no de ondastan di akshon we di URL tel am fo du',
+'nosuchaction' => 'Da kain akshon no de',
+'nosuchactiontext' => 'Di wiki no de ondastan di akshon we di URL tel am fo du',
 'nosuchspecialpage' => 'Da kain spehshal pej noh de',
 
 # General errors
 'viewsource' => 'Luk di sos',
 
 # Login and logout pages
-'yourname'                => 'Yuzanem:',
-'login'                   => 'Login',
+'yourname' => 'Yuzanem:',
+'login' => 'Login',
 'nav-login-createaccount' => 'Login / Mek yu-yon akaunt',
-'loginprompt'             => 'Yu get fo de yuz kuki-dem foh ebul fo login {{SITENAME}}.',
-'userlogin'               => 'Login / Mek yu-yon akaunt',
-'logout'                  => 'Komot na di sait',
-'userlogout'              => 'Komot na di sait',
-'notloggedin'             => 'Yu no login yet',
-'nologin'                 => "Yu don mek yu akaunt? '''$1'''.",
-'nologinlink'             => 'Mek yu-yon akaunt',
-'createaccount'           => 'Mek yu-yon akaunt',
-'gotaccount'              => "Yu dohn mek yu yuza login? '''$1'''.",
-'gotaccountlink'          => 'Login',
-'createaccountmail'       => 'wit imel',
-'badretype'               => 'Di paswohd-dehm we yu taip mach.',
-'userexists'              => 'Oda pohsin de yuz da yuzanem de.
+'loginprompt' => 'Yu get fo de yuz kuki-dem foh ebul fo login {{SITENAME}}.',
+'userlogin' => 'Login / Mek yu-yon akaunt',
+'logout' => 'Komot na di sait',
+'userlogout' => 'Komot na di sait',
+'notloggedin' => 'Yu no login yet',
+'nologin' => "Yu don mek yu akaunt? '''$1'''.",
+'nologinlink' => 'Mek yu-yon akaunt',
+'createaccount' => 'Mek yu-yon akaunt',
+'gotaccount' => "Yu dohn mek yu yuza login? '''$1'''.",
+'gotaccountlink' => 'Login',
+'createaccountmail' => 'wit imel',
+'badretype' => 'Di paswohd-dehm we yu taip mach.',
+'userexists' => 'Oda pohsin de yuz da yuzanem de.
 Yu go geht fo pik difren wan.',
 
 # Edit pages
-'summary'                          => 'Somari:',
-'minoredit'                        => 'Dis na lili edit',
-'watchthis'                        => 'Wach dis pej-ya',
-'savearticle'                      => 'Sev dis pej-ya',
-'preview'                          => 'Privyu',
-'showpreview'                      => 'Luk di privyu',
-'showlivepreview'                  => 'Luk di laiv privyu',
-'showdiff'                         => 'Sho wetin don chenj',
-'anoneditwarning'                  => "'''Tek tem:''' Yu noh login yet.
+'summary' => 'Somari:',
+'minoredit' => 'Dis na lili edit',
+'watchthis' => 'Wach dis pej-ya',
+'savearticle' => 'Sev dis pej-ya',
+'preview' => 'Privyu',
+'showpreview' => 'Luk di privyu',
+'showlivepreview' => 'Luk di laiv privyu',
+'showdiff' => 'Sho wetin don chenj',
+'anoneditwarning' => "'''Tek tem:''' Yu noh login yet.
 So dem go sev yu IP address na di pej-im editin histri",
-'missingsummary'                   => "'''Mehmba se:''' yu noh mek editin somari.
+'missingsummary' => "'''Mehmba se:''' yu noh mek editin somari.
 If yu pres Sev bak, dem go sev yu edit nomo.",
-'missingcommenttext'               => 'Rait yu koment onda ya',
+'missingcommenttext' => 'Rait yu koment onda ya',
 'permissionserrorstext-withaction' => 'Yu no get pamishon fo $2, bikoz {{PLURAL:$1|rizin|rizin-dem}}:',
-'recreate-moveddeleted-warn'       => "'''Tek tem!!: Yu de mek bak wan pej we dehm bin dohn ires.'''
+'recreate-moveddeleted-warn' => "'''Tek tem!!: Yu de mek bak wan pej we dehm bin dohn ires.'''
 
 Yu sabi if yu foh wok pan dis pej-ya.
 Di log we dem kip foh dis pej-in dilishon de ya:",
-'moveddeleted-notice'              => 'Dehm dohn ires dis pej-ya.
+'moveddeleted-notice' => 'Dehm dohn ires dis pej-ya.
 Di log we dehm kip foh dis pej-in dilishohn de ya:',
-'edit-hook-aborted'                => 'Wan Hook don blok yu Edit.
+'edit-hook-aborted' => 'Wan Hook don blok yu Edit.
 I no eksplen wetin-mek.',
-'edit-gone-missing'                => 'Wi noh ebul updet dis pej-ya.
+'edit-gone-missing' => 'Wi noh ebul updet dis pej-ya.
 Somtem dem don dilit am.',
-'edit-conflict'                    => 'Edit konflikt',
-'edit-no-change'                   => 'Wi no luk wetin yu chenj, bicoh yu no chenj wetin rait de.',
+'edit-conflict' => 'Edit konflikt',
+'edit-no-change' => 'Wi no luk wetin yu chenj, bicoh yu no chenj wetin rait de.',
 
 # History pages
-'last'                   => 'prev',
-'page_first'             => 'fohs',
-'page_last'              => 'las',
+'last' => 'prev',
+'page_first' => 'fohs',
+'page_last' => 'las',
 'history-fieldset-title' => 'Brawz histri',
 
 # Revision deletion
@@ -263,72 +263,72 @@ Somtem dem don dilit am.',
 'revertmerge' => 'Sepret',
 
 # Diffs
-'editundo'   => 'rivas wetin yu jos do',
+'editundo' => 'rivas wetin yu jos do',
 'diff-multi' => '({{PLURAL:$1|Wan intamidyet vazhon|$1 intamidyet vazhon-dem}} no de sho)',
 
 # Search results
-'searchresults'                  => 'Sach rizolt-dem',
-'prevn'                          => 'privios wan {{PLURAL:$1|$1}}',
-'nextn'                          => 'neks wan {{PLURAL:$1|$1}}',
-'searchhelp-url'                 => 'Help:Kohntehnt-dehm',
-'searchprofile-articles'         => 'Kontent pej-dem',
-'searchprofile-everything'       => 'Oltin',
-'searchprofile-advanced'         => 'Advans',
+'searchresults' => 'Sach rizolt-dem',
+'prevn' => 'privios wan {{PLURAL:$1|$1}}',
+'nextn' => 'neks wan {{PLURAL:$1|$1}}',
+'searchhelp-url' => 'Help:Kohntehnt-dehm',
+'searchprofile-articles' => 'Kontent pej-dem',
+'searchprofile-everything' => 'Oltin',
+'searchprofile-advanced' => 'Advans',
 'searchprofile-articles-tooltip' => 'Luk na $1',
-'searchprofile-images-tooltip'   => 'Sach fo fail-dem',
-'search-result-size'             => '$1 ({{PLURAL:$2|1 wod|$2 wod-dem}})',
-'search-suggest'                 => 'Yu bin min?: $1',
-'searchall'                      => 'ol',
-'powersearch'                    => 'Advans sach',
-'powersearch-legend'             => 'Advans sach',
-'powersearch-ns'                 => 'Sach na nemspes-dem:',
-'powersearch-redir'              => 'List de sen yu kam ya',
-'powersearch-field'              => 'Luk fo',
-'search-external'                => 'Ekstanal sach',
-'searchdisabled'                 => '{{websait-im nem}} Di sach no de wok.
+'searchprofile-images-tooltip' => 'Sach fo fail-dem',
+'search-result-size' => '$1 ({{PLURAL:$2|1 wod|$2 wod-dem}})',
+'search-suggest' => 'Yu bin min?: $1',
+'searchall' => 'ol',
+'powersearch' => 'Advans sach',
+'powersearch-legend' => 'Advans sach',
+'powersearch-ns' => 'Sach na nemspes-dem:',
+'powersearch-redir' => 'List de sen yu kam ya',
+'powersearch-field' => 'Luk fo',
+'search-external' => 'Ekstanal sach',
+'searchdisabled' => '{{websait-im nem}} Di sach no de wok.
 Na mintem yuz Google fo sach.
 Memba se somtem dem indeks-dem noh op tu det {{SITENAME}}.',
 
 # Preferences page
-'prefsnologin'      => 'Yu no login yet',
+'prefsnologin' => 'Yu no login yet',
 'searchresultshead' => 'Sach',
-'youremail'         => 'Imel:',
-'username'          => 'Yuzanem:',
+'youremail' => 'Imel:',
+'username' => 'Yuzanem:',
 
 # Recent changes
-'recentchanges'   => 'Risent chenj-dem',
-'rcshowhideliu'   => '$1 yuza-dem we don login',
+'recentchanges' => 'Risent chenj-dem',
+'rcshowhideliu' => '$1 yuza-dem we don login',
 'rcshowhideanons' => '$1 anonimos yuza-dem',
-'diff'            => 'dif',
-'hist'            => 'hist',
-'hide'            => 'Haid',
-'show'            => 'Sho',
+'diff' => 'dif',
+'hist' => 'hist',
+'hide' => 'Haid',
+'show' => 'Sho',
 
 # Recent changes linked
 'recentchangeslinked-page' => 'pej nem',
 
 # Upload
-'upload'          => 'Oplod fail',
-'uploadbtn'       => 'Oplod fail',
-'uploadnologin'   => 'Yu no login yet',
-'filedesc'        => 'Somari:',
+'upload' => 'Oplod fail',
+'uploadbtn' => 'Oplod fail',
+'uploadnologin' => 'Yu no login yet',
+'filedesc' => 'Somari:',
 'watchthisupload' => 'Wach dis fail-ya',
 
 # File description page
-'file-anchor-link'   => 'Fail',
-'filehist'           => 'fail histri',
+'file-anchor-link' => 'Fail',
+'filehist' => 'fail histri',
 'filehist-deleteone' => 'dilit',
-'filehist-current'   => 'Korent',
-'filehist-datetime'  => 'Det/Tem',
-'filehist-thumb'     => 'Tomnel',
-'filehist-user'      => 'Yuza',
-'filehist-comment'   => 'Koment',
-'imagelinks'         => 'Fail yusej',
-'linkstoimage'       => 'Di {{PLURAL:$1|pej de link|pej-dem  de link}} go dis fail:',
-'linkstoimage-more'  => 'Pas wan $1 {{PLURAL:$1|pej de link|pej-dem de link}} go dis fail-ya.
+'filehist-current' => 'Korent',
+'filehist-datetime' => 'Det/Tem',
+'filehist-thumb' => 'Tomnel',
+'filehist-user' => 'Yuza',
+'filehist-comment' => 'Koment',
+'imagelinks' => 'Fail yusej',
+'linkstoimage' => 'Di {{PLURAL:$1|pej de link|pej-dem  de link}} go dis fail:',
+'linkstoimage-more' => 'Pas wan $1 {{PLURAL:$1|pej de link|pej-dem de link}} go dis fail-ya.
 Dis list get di{{PLURAL:$1|fohs pej link|fohs $1 pej link-dem}} fohdis fail nomo.
 Di [[Special:WhatLinksHere/$2|ful list]] de yah.',
-'nolinkstoimage'     => 'No pej no de we de link kam dis fail-ya.',
+'nolinkstoimage' => 'No pej no de we de link kam dis fail-ya.',
 
 # File deletion
 'filedelete-submit' => 'Dilit',
@@ -336,14 +336,14 @@ Di [[Special:WhatLinksHere/$2|ful list]] de yah.',
 # Random page
 'randompage' => 'Random pej',
 
-'brokenredirects-edit'   => 'edit',
+'brokenredirects-edit' => 'edit',
 'brokenredirects-delete' => 'dilit',
 
 # Miscellaneous special pages
-'nbytes'       => '$1 {{PLURAL:$1|bait|bait-dem}}',
-'nmembers'     => '$1 {{PLURAL:$1|memba|memba-dem}}',
-'newpages'     => 'Nyu pej-dem',
-'move'         => 'Muf',
+'nbytes' => '$1 {{PLURAL:$1|bait|bait-dem}}',
+'nmembers' => '$1 {{PLURAL:$1|memba|memba-dem}}',
+'newpages' => 'Nyu pej-dem',
+'move' => 'Muf',
 'movethispage' => 'Muf dis pej-ya',
 
 # Book sources
@@ -354,7 +354,7 @@ Di [[Special:WhatLinksHere/$2|ful list]] de yah.',
 
 # Special:AllPages
 'alphaindexline' => '$1 go $2',
-'allarticles'    => 'Ol pej-dem',
+'allarticles' => 'Ol pej-dem',
 'allpagessubmit' => 'Go',
 
 # Special:Categories
@@ -364,124 +364,124 @@ Di [[Special:WhatLinksHere/$2|ful list]] de yah.',
 'linksearch-ok' => 'Sach',
 
 # Watchlist
-'watchlist'         => 'Mi wachlist',
-'mywatchlist'       => 'Mi wachlist',
-'nowatchlist'       => 'Yu no get natin na yu wachlist.',
+'watchlist' => 'Mi wachlist',
+'mywatchlist' => 'Mi wachlist',
+'nowatchlist' => 'Yu no get natin na yu wachlist.',
 'watchlistanontext' => '$1 Foh luk o chenj wetin de na yu wachlist',
-'watchnologin'      => 'Yu no login yet',
-'watch'             => 'Wach',
-'watchthispage'     => 'Wach dis pej-ya',
-'unwatch'           => 'Lef fo wach dis pej-ya',
-'unwatchthispage'   => 'Lef fo wach',
-'notanarticle'      => 'Dis pej-ya noto kontent pej',
-'notvisiblerev'     => 'Dem don dilit di last rivizhon we difren yuza rait',
+'watchnologin' => 'Yu no login yet',
+'watch' => 'Wach',
+'watchthispage' => 'Wach dis pej-ya',
+'unwatch' => 'Lef fo wach dis pej-ya',
+'unwatchthispage' => 'Lef fo wach',
+'notanarticle' => 'Dis pej-ya noto kontent pej',
+'notvisiblerev' => 'Dem don dilit di last rivizhon we difren yuza rait',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Ah de wach...',
+'watching' => 'Ah de wach...',
 'unwatching' => 'Ah de lef fo wach...',
 
 # Delete
-'deletepage'    => 'Dilit dis pej-ya',
-'confirm'       => 'Konfam',
-'excontent'     => "Nah dis i bin geht/ de tohk boht: '$1'",
+'deletepage' => 'Dilit dis pej-ya',
+'confirm' => 'Konfam',
+'excontent' => "Nah dis i bin geht/ de tohk boht: '$1'",
 'delete-legend' => 'Dilit',
-'dellogpage'    => 'Dilishon Log',
+'dellogpage' => 'Dilishon Log',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'Edit',
+'restriction-edit' => 'Edit',
 'restriction-create' => 'Mek sohmtin',
 
 # Undelete
-'undeleteviewlink'       => 'luk',
+'undeleteviewlink' => 'luk',
 'undelete-search-submit' => 'Sach',
 
-'sp-contributions-logs'   => 'Log-dem',
-'sp-contributions-talk'   => 'tok',
+'sp-contributions-logs' => 'Log-dem',
+'sp-contributions-talk' => 'tok',
 'sp-contributions-submit' => 'Sach',
 
 # What links here
-'whatlinkshere'      => 'Wetin de link kam ya',
+'whatlinkshere' => 'Wetin de link kam ya',
 'whatlinkshere-page' => 'Pej',
-'isimage'            => 'Fail link',
+'isimage' => 'Fail link',
 
 # Block/unblock
 'ipblocklist-submit' => 'Luk foh am',
-'blocklink'          => 'blok',
-'unblocklink'        => 'lef fo blok',
-'contribslink'       => 'kontribyushon-dem',
-'blocklogpage'       => 'Blok log',
+'blocklink' => 'blok',
+'unblocklink' => 'lef fo blok',
+'contribslink' => 'kontribyushon-dem',
+'blocklogpage' => 'Blok log',
 
 # Move page
 'movenologin' => 'Yu no login yet',
-'move-watch'  => 'Wach dis pej-ya',
+'move-watch' => 'Wach dis pej-ya',
 'movelogpage' => 'Muf log',
 
 # Namespace 8 related
 'allmessagesname' => 'Nem',
 
 # Thumbnails
-'thumbnail-more'  => 'Big-am',
-'filemissing'     => 'Di fail noh de',
+'thumbnail-more' => 'Big-am',
+'filemissing' => 'Di fail noh de',
 'thumbnail_error' => 'Problem foh mek dis tombnel: $1',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Yu yuza pej',
-'tooltip-pt-mytalk'               => 'Yu tok pej',
-'tooltip-pt-preferences'          => 'Yu prefrens-dem',
-'tooltip-pt-mycontris'            => 'List ov yu kontribyushon-dem',
-'tooltip-pt-login'                => 'I go bete if yu login, bot noto obligeshon',
-'tooltip-pt-anonlogin'            => 'I go bete if yu login, bot noto obligeshon',
-'tooltip-pt-logout'               => 'Log komot',
-'tooltip-ca-talk'                 => 'Diskoshon bot kontent pej',
-'tooltip-ca-edit'                 => 'Yu ebul fo edit dis pej-ya
+'tooltip-pt-userpage' => 'Yu yuza pej',
+'tooltip-pt-mytalk' => 'Yu tok pej',
+'tooltip-pt-preferences' => 'Yu prefrens-dem',
+'tooltip-pt-mycontris' => 'List ov yu kontribyushon-dem',
+'tooltip-pt-login' => 'I go bete if yu login, bot noto obligeshon',
+'tooltip-pt-anonlogin' => 'I go bete if yu login, bot noto obligeshon',
+'tooltip-pt-logout' => 'Log komot',
+'tooltip-ca-talk' => 'Diskoshon bot kontent pej',
+'tooltip-ca-edit' => 'Yu ebul fo edit dis pej-ya
 Bot yuz di privyu botin bifo yu sev',
-'tooltip-ca-addsection'           => 'Bigin nyu sekshon.',
-'tooltip-ca-viewsource'           => 'Dem don protekt dis pej-ya.
+'tooltip-ca-addsection' => 'Bigin nyu sekshon.',
+'tooltip-ca-viewsource' => 'Dem don protekt dis pej-ya.
 Yu go ebul luk im sos.',
-'tooltip-ca-history'              => 'Dis pej-im ol vazhon-dèm.',
-'tooltip-ca-protect'              => 'Protekt dis pej-ya',
-'tooltip-ca-delete'               => 'Ires dis pej-ya',
-'tooltip-ca-undelete'             => 'Bring bak di chenj-dehm we dehm bin mek na dis pej-ya bifo dehm ires am.',
-'tooltip-ca-move'                 => 'Muf dis pej-ya',
-'tooltip-ca-watch'                => 'Put dis pej na yu wachlist',
-'tooltip-ca-unwatch'              => 'Pul dis pej komoh nah yu wachlist',
-'tooltip-search'                  => 'Luk nah dis websait {{SITENAME}}',
-'tooltip-search-fulltext'         => 'Sach na di pej fo dis teks',
-'tooltip-p-logo'                  => 'Visit di men pej',
-'tooltip-n-mainpage'              => 'Visit Men Pej',
-'tooltip-n-portal'                => 'Infomeshon bot di projek, wetin yu ebul du, usai fo fen oltin',
-'tooltip-n-currentevents'         => 'Fen infomashon bot wetin de hapin naw-naw',
-'tooltip-n-recentchanges'         => 'List ov wetin dem don chenj trade na di wiki.',
-'tooltip-n-randompage'            => 'Lod eni random pej',
-'tooltip-n-help'                  => 'Di ples fo lan.',
-'tooltip-t-whatlinkshere'         => 'List ov ol di wiki pej-dèm we de link kam ya',
-'tooltip-t-recentchangeslinked'   => 'Resent chenj-dèm na di pej-dem we de link komot na dis pej-ya',
-'tooltip-feed-rss'                => 'RSS feed foh dis pej-ya',
-'tooltip-feed-atom'               => 'Atom fid foh dis pej-ya',
-'tooltip-t-contributions'         => 'dis yuza-im kontribyushon list',
-'tooltip-t-emailuser'             => 'Sen imel go dis yuza',
-'tooltip-t-upload'                => 'Oplod fail-dem',
-'tooltip-t-specialpages'          => 'List we get ol di speshal pej-dem',
-'tooltip-t-print'                 => 'Vazhon fo print',
-'tooltip-t-permalink'             => 'Pamanent link fo go dis vazhon',
-'tooltip-ca-nstab-main'           => 'Luk kontent pej',
-'tooltip-ca-nstab-project'        => 'Luk di projekt pej',
-'tooltip-ca-nstab-image'          => 'Luk di fail pej',
-'tooltip-save'                    => 'Sev wetin yu don chenj',
-'tooltip-preview'                 => 'Luk wetin you dohn chenj, Luk am bifo yu sev!',
-'tooltip-diff'                    => 'Luk us chenj-dem yu mek nah di teks.',
+'tooltip-ca-history' => 'Dis pej-im ol vazhon-dèm.',
+'tooltip-ca-protect' => 'Protekt dis pej-ya',
+'tooltip-ca-delete' => 'Ires dis pej-ya',
+'tooltip-ca-undelete' => 'Bring bak di chenj-dehm we dehm bin mek na dis pej-ya bifo dehm ires am.',
+'tooltip-ca-move' => 'Muf dis pej-ya',
+'tooltip-ca-watch' => 'Put dis pej na yu wachlist',
+'tooltip-ca-unwatch' => 'Pul dis pej komoh nah yu wachlist',
+'tooltip-search' => 'Luk nah dis websait {{SITENAME}}',
+'tooltip-search-fulltext' => 'Sach na di pej fo dis teks',
+'tooltip-p-logo' => 'Visit di men pej',
+'tooltip-n-mainpage' => 'Visit Men Pej',
+'tooltip-n-portal' => 'Infomeshon bot di projek, wetin yu ebul du, usai fo fen oltin',
+'tooltip-n-currentevents' => 'Fen infomashon bot wetin de hapin naw-naw',
+'tooltip-n-recentchanges' => 'List ov wetin dem don chenj trade na di wiki.',
+'tooltip-n-randompage' => 'Lod eni random pej',
+'tooltip-n-help' => 'Di ples fo lan.',
+'tooltip-t-whatlinkshere' => 'List ov ol di wiki pej-dèm we de link kam ya',
+'tooltip-t-recentchangeslinked' => 'Resent chenj-dèm na di pej-dem we de link komot na dis pej-ya',
+'tooltip-feed-rss' => 'RSS feed foh dis pej-ya',
+'tooltip-feed-atom' => 'Atom fid foh dis pej-ya',
+'tooltip-t-contributions' => 'dis yuza-im kontribyushon list',
+'tooltip-t-emailuser' => 'Sen imel go dis yuza',
+'tooltip-t-upload' => 'Oplod fail-dem',
+'tooltip-t-specialpages' => 'List we get ol di speshal pej-dem',
+'tooltip-t-print' => 'Vazhon fo print',
+'tooltip-t-permalink' => 'Pamanent link fo go dis vazhon',
+'tooltip-ca-nstab-main' => 'Luk kontent pej',
+'tooltip-ca-nstab-project' => 'Luk di projekt pej',
+'tooltip-ca-nstab-image' => 'Luk di fail pej',
+'tooltip-save' => 'Sev wetin yu don chenj',
+'tooltip-preview' => 'Luk wetin you dohn chenj, Luk am bifo yu sev!',
+'tooltip-diff' => 'Luk us chenj-dem yu mek nah di teks.',
 'tooltip-compareselectedversions' => 'Luk wetin difren pan di tu vazhon-dem we yu don silekt',
-'tooltip-watch'                   => 'Put dis pej na yu wachlist',
+'tooltip-watch' => 'Put dis pej na yu wachlist',
 
 # Special:NewFiles
 'ilsubmit' => 'Luk foh am',
 
 # 'all' in various places, this might be different for inflected languages
 'namespacesall' => 'ol',
-'monthsall'     => 'ol',
+'monthsall' => 'ol',
 
 # E-mail address confirmation
-'confirmemail'         => 'Konfam yu e-mail adrehs',
+'confirmemail' => 'Konfam yu e-mail adrehs',
 'confirmemail_noemail' => 'Di email adrehs we yu pu na [[Special:Preferences|user preferences]] noh de.',
 
 # Multipage image navigation
index ec7009a..19eea20 100644 (file)
 
 $messages = array(
 # User preference toggles
-'tog-underline'            => "Koritan ang dalum kang manga ''link'':",
-'tog-justify'              => 'Tururupungun ang kilid kang manga paragraph',
-'tog-hideminor'            => "Tagoon ang gagmay nga ''edit'' sa mga bag-o nga ilis",
-'tog-extendwatchlist'      => "Palapadun ang ''watchlist'' agud nga mapakita ang tanan nga ginasogtan nga pag-ilis",
-'tog-numberheadings'       => "Automatiko nga togroan kang nomero ang manga ''heading''",
-'tog-showtoolbar'          => 'Ipakita ang pangbolig sa pag-ilis (JavaScript)',
-'tog-rememberpassword'     => "Tandaan ang akun nga ''log-in'' sa dya nga ''computer'' (for a maximum of $1 {{PLURAL:$1|day|days}})",
-'tog-watchcreations'       => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpanghimo ko",
-'tog-watchdefault'         => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpang-''edit'' ko",
-'tog-watchmoves'           => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpanghalin ko",
-'tog-watchdeletion'        => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpamara ko",
-'tog-previewonfirst'       => 'Ipakita ang preview sa ona nga ilis',
-'tog-nocache'              => "Ontatun ang ''page caching''",
+'tog-underline' => "Koritan ang dalum kang manga ''link'':",
+'tog-justify' => 'Tururupungun ang kilid kang manga paragraph',
+'tog-hideminor' => "Tagoon ang gagmay nga ''edit'' sa mga bag-o nga ilis",
+'tog-extendwatchlist' => "Palapadun ang ''watchlist'' agud nga mapakita ang tanan nga ginasogtan nga pag-ilis",
+'tog-numberheadings' => "Automatiko nga togroan kang nomero ang manga ''heading''",
+'tog-showtoolbar' => 'Ipakita ang pangbolig sa pag-ilis (JavaScript)',
+'tog-rememberpassword' => "Tandaan ang akun nga ''log-in'' sa dya nga ''computer'' (for a maximum of $1 {{PLURAL:$1|day|days}})",
+'tog-watchcreations' => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpanghimo ko",
+'tog-watchdefault' => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpang-''edit'' ko",
+'tog-watchmoves' => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpanghalin ko",
+'tog-watchdeletion' => "Idogang sa akun nga ''watchlist'' ang manga pahina nga ginpamara ko",
+'tog-previewonfirst' => 'Ipakita ang preview sa ona nga ilis',
+'tog-nocache' => "Ontatun ang ''page caching''",
 'tog-enotifwatchlistpages' => 'Padarhan ako kang e-mail kon may nag-ilis kang pahina nga akun ginabantayan',
-'tog-enotifminoredits'     => "Padarhan man ako kang ''e-mail'' tohay sa manga gagmay nga pag-ilis sa manga pahina",
-'tog-shownumberswatching'  => "Ipakita ang karakuun kang manga ''user'' nga galantaw",
-'tog-forceeditsummary'     => "Paman-an ako kon blanko nga ''edit summary'' ang akun ginapasulud",
-'tog-watchlisthideown'     => "Indi pagpakita sa ''watchlist'' ang akun nga manga gin-islan",
-'tog-watchlisthidebots'    => "Indi pagpakita sa ''watchlist'' ang manga gin-islan kang bot",
-'tog-watchlisthideminor'   => "Indi pagpakita sa ''watchlist'' ang mga gagmay nga inislan",
-'tog-nolangconversion'     => "Ontatun ang ''variants conversion''",
-'tog-ccmeonemails'         => "Padarhi man ako kang manga ''e-mail'' nga ginpadara ko sa iban nga manga ''user''",
-
-'underline-always'  => 'Pirme gid',
-'underline-never'   => 'Indi gid',
+'tog-enotifminoredits' => "Padarhan man ako kang ''e-mail'' tohay sa manga gagmay nga pag-ilis sa manga pahina",
+'tog-shownumberswatching' => "Ipakita ang karakuun kang manga ''user'' nga galantaw",
+'tog-forceeditsummary' => "Paman-an ako kon blanko nga ''edit summary'' ang akun ginapasulud",
+'tog-watchlisthideown' => "Indi pagpakita sa ''watchlist'' ang akun nga manga gin-islan",
+'tog-watchlisthidebots' => "Indi pagpakita sa ''watchlist'' ang manga gin-islan kang bot",
+'tog-watchlisthideminor' => "Indi pagpakita sa ''watchlist'' ang mga gagmay nga inislan",
+'tog-ccmeonemails' => "Padarhi man ako kang manga ''e-mail'' nga ginpadara ko sa iban nga manga ''user''",
+
+'underline-always' => 'Pirme gid',
+'underline-never' => 'Indi gid',
 'underline-default' => 'Onay nga browser',
 
 # Dates
-'sunday'        => 'Domingo',
-'monday'        => 'Lones',
-'tuesday'       => 'Martes',
-'wednesday'     => 'Miyerkoles',
-'thursday'      => 'Webes',
-'friday'        => 'Biyernes',
-'saturday'      => 'Sabado',
-'sun'           => 'Dom',
-'mon'           => 'Lon',
-'tue'           => 'Mar',
-'wed'           => 'Miy',
-'thu'           => 'Web',
-'fri'           => 'Biy',
-'sat'           => 'Sab',
-'january'       => 'Enero',
-'february'      => 'Pebrero',
-'march'         => 'Marso',
-'april'         => 'Abril',
-'may_long'      => 'Mayo',
-'june'          => 'Honyo',
-'july'          => 'Holyo',
-'august'        => 'Agosto',
-'september'     => 'Setyembre',
-'october'       => 'Oktobre',
-'november'      => 'Nobyembre',
-'december'      => 'Disyembre',
-'january-gen'   => 'Enero',
-'february-gen'  => 'Pebrero',
-'march-gen'     => 'Marso',
-'april-gen'     => 'Abril',
-'may-gen'       => 'Abril',
-'june-gen'      => 'Honyo',
-'july-gen'      => 'Holyo',
-'august-gen'    => 'Agosto',
+'sunday' => 'Domingo',
+'monday' => 'Lones',
+'tuesday' => 'Martes',
+'wednesday' => 'Miyerkoles',
+'thursday' => 'Webes',
+'friday' => 'Biyernes',
+'saturday' => 'Sabado',
+'sun' => 'Dom',
+'mon' => 'Lon',
+'tue' => 'Mar',
+'wed' => 'Miy',
+'thu' => 'Web',
+'fri' => 'Biy',
+'sat' => 'Sab',
+'january' => 'Enero',
+'february' => 'Pebrero',
+'march' => 'Marso',
+'april' => 'Abril',
+'may_long' => 'Mayo',
+'june' => 'Honyo',
+'july' => 'Holyo',
+'august' => 'Agosto',
+'september' => 'Setyembre',
+'october' => 'Oktobre',
+'november' => 'Nobyembre',
+'december' => 'Disyembre',
+'january-gen' => 'Enero',
+'february-gen' => 'Pebrero',
+'march-gen' => 'Marso',
+'april-gen' => 'Abril',
+'may-gen' => 'Abril',
+'june-gen' => 'Honyo',
+'july-gen' => 'Holyo',
+'august-gen' => 'Agosto',
 'september-gen' => 'Setyembre',
-'october-gen'   => 'Oktobre',
-'november-gen'  => 'Nobyembre',
-'december-gen'  => 'Disyembre',
-'jan'           => 'Ene',
-'feb'           => 'Peb',
-'apr'           => 'Abr',
-'may'           => 'May',
-'jun'           => 'Hon',
-'jul'           => 'Hol',
-'aug'           => 'Ago',
-'sep'           => 'Set',
-'oct'           => 'Okt',
-'nov'           => 'Nob',
-'dec'           => 'Dis',
+'october-gen' => 'Oktobre',
+'november-gen' => 'Nobyembre',
+'december-gen' => 'Disyembre',
+'jan' => 'Ene',
+'feb' => 'Peb',
+'apr' => 'Abr',
+'may' => 'May',
+'jun' => 'Hon',
+'jul' => 'Hol',
+'aug' => 'Ago',
+'sep' => 'Set',
+'oct' => 'Okt',
+'nov' => 'Nob',
+'dec' => 'Dis',
 
 # Categories related messages
-'category_header'       => 'Manga artikolo sa "$1"',
-'subcategories'         => "Manga ''subcategory''",
+'category_header' => 'Manga artikolo sa "$1"',
+'subcategories' => "Manga ''subcategory''",
 'category-media-header' => 'Manga midya sa "$1"',
-'category-empty'        => "''Wara it manga artikolo okon medya ang katergorya nga dya.''",
+'category-empty' => "''Wara it manga artikolo okon medya ang katergorya nga dya.''",
 
-'about'         => 'Angut sa Iwan',
-'article'       => 'Pahina kasudlan',
-'newwindow'     => "(gabokas sa bag-o nga ''window'')",
-'cancel'        => 'Kanselar',
+'about' => 'Angut sa Iwan',
+'article' => 'Pahina kasudlan',
+'newwindow' => "(gabokas sa bag-o nga ''window'')",
+'cancel' => 'Kanselar',
 'moredotdotdot' => 'Raku pa...',
-'mypage'        => 'Akun nga pahina',
-'anontalk'      => "Istoryahun ang dya nga ''IP''",
+'mypage' => 'Akun nga pahina',
+'anontalk' => "Istoryahun ang dya nga ''IP''",
 
 # Cologne Blue skin
-'qbfind'         => 'Sagap',
-'qbbrowse'       => 'Bilid',
-'qbedit'         => 'Iislan',
-'qbpageoptions'  => 'Dya nga Pahina',
-'qbpageinfo'     => 'Konteksto',
+'qbfind' => 'Sagap',
+'qbbrowse' => 'Bilid',
+'qbedit' => 'Iislan',
+'qbpageoptions' => 'Dya nga Pahina',
+'qbpageinfo' => 'Konteksto',
 'qbspecialpages' => 'Manga espesyal nga pahina',
-'faq'            => 'FAQ',
-'faqpage'        => 'Project:FAQ',
-
-'errorpagetitle'    => 'Sayup',
-'returnto'          => 'Balik sa $1.',
-'help'              => 'Bolig',
-'search'            => 'Sagap',
-'searchbutton'      => 'Sagap',
-'go'                => 'Agto',
-'searcharticle'     => 'Agto',
-'history'           => 'Kasaysayan kang Pahina',
-'history_short'     => 'Kasaysayan',
-'updatedmarker'     => 'ginpabag-o halin kang orihi ko nga pagbisita',
-'printableversion'  => "Bersyon nga sarang ma-''print''",
-'permalink'         => "Permanyente nga ''link''",
-'print'             => 'Printa',
-'edit'              => 'Iislan',
-'editthispage'      => 'Islan ang dya nga pahina',
-'delete'            => 'Para',
-'deletethispage'    => 'Paraun ang dya nga Pahina',
-'protect'           => 'Amlig',
-'protect_change'    => 'islan ang proteksyon',
-'protectthispage'   => 'Amligan ang dya nga pahina',
-'unprotect'         => 'huksun ang proteksyon',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+'errorpagetitle' => 'Sayup',
+'returnto' => 'Balik sa $1.',
+'help' => 'Bolig',
+'search' => 'Sagap',
+'searchbutton' => 'Sagap',
+'go' => 'Agto',
+'searcharticle' => 'Agto',
+'history' => 'Kasaysayan kang Pahina',
+'history_short' => 'Kasaysayan',
+'updatedmarker' => 'ginpabag-o halin kang orihi ko nga pagbisita',
+'printableversion' => "Bersyon nga sarang ma-''print''",
+'permalink' => "Permanyente nga ''link''",
+'print' => 'Printa',
+'edit' => 'Iislan',
+'editthispage' => 'Islan ang dya nga pahina',
+'delete' => 'Para',
+'deletethispage' => 'Paraun ang dya nga Pahina',
+'protect' => 'Amlig',
+'protect_change' => 'islan ang proteksyon',
+'protectthispage' => 'Amligan ang dya nga pahina',
+'unprotect' => 'huksun ang proteksyon',
 'unprotectthispage' => 'Huksun ang proteksyon sa dya nga pahina',
-'newpage'           => 'Bag-o nga pahina',
-'talkpage'          => 'Sogdanunun ang dya nga pahina',
-'talkpagelinktext'  => 'Wakal',
-'specialpage'       => 'Espesyal nga Pahina',
-'postcomment'       => 'Togro Komento',
-'articlepage'       => 'Turukun ang pahina kasudlan',
-'talk'              => 'Sugilanon',
-'views'             => 'Manga paglantaw',
-'toolbox'           => 'Pangbolig',
-'otherlanguages'    => 'Sa iban nga lingwahe',
-'redirectpagesub'   => 'Idaho ang pahina',
-'protectedpage'     => 'Protektado nga pahina',
-'jumpto'            => 'Lompat sa:',
-'jumptosearch'      => 'sagap',
+'newpage' => 'Bag-o nga pahina',
+'talkpage' => 'Sogdanunun ang dya nga pahina',
+'talkpagelinktext' => 'Wakal',
+'specialpage' => 'Espesyal nga Pahina',
+'postcomment' => 'Togro Komento',
+'articlepage' => 'Turukun ang pahina kasudlan',
+'talk' => 'Sugilanon',
+'views' => 'Manga paglantaw',
+'toolbox' => 'Pangbolig',
+'otherlanguages' => 'Sa iban nga lingwahe',
+'redirectpagesub' => 'Idaho ang pahina',
+'protectedpage' => 'Protektado nga pahina',
+'jumpto' => 'Lompat sa:',
+'jumptosearch' => 'sagap',
 
 # 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'            => 'Tunggəd sa {{SITENAME}}',
-'aboutpage'            => 'Project:Tunggəd',
-'disclaimers'          => 'Mga Panginwala',
-'disclaimerpage'       => 'Project:Panginwala nga Pangtanan',
-'edithelp'             => 'Panoytoy sa Pag-ilis',
-'edithelppage'         => 'Help:Pag-ilis',
-'mainpage'             => 'Pono nga Pahina',
+'aboutsite' => 'Tunggəd sa {{SITENAME}}',
+'aboutpage' => 'Project:Tunggəd',
+'disclaimers' => 'Mga Panginwala',
+'disclaimerpage' => 'Project:Panginwala nga Pangtanan',
+'edithelp' => 'Panoytoy sa Pag-ilis',
+'edithelppage' => 'Help:Pag-ilis',
+'mainpage' => 'Pono nga Pahina',
 'mainpage-description' => 'Pono nga Pahina',
-'privacy'              => 'Surundun sa Privacy',
-'privacypage'          => 'Project:Surundun sa Privacy',
+'privacy' => 'Surundun sa Privacy',
+'privacypage' => 'Project:Surundun sa Privacy',
 
-'badaccess'        => 'Sayup sa lisensya',
+'badaccess' => 'Sayup sa lisensya',
 'badaccess-group0' => 'Indi kaw ginpasogtan nga himoon ang lihuk nga ginalaum mo.',
 'badaccess-groups' => 'Ang imo ginpangayo nga lihuk ay para lang sa mga users sa {{PLURAL:$2|nga grupo|sara sa mga grupo}}: $1.',
 
-'versionrequired'     => 'Version $1 kang MediaWiki kinahanglan',
+'versionrequired' => 'Version $1 kang MediaWiki kinahanglan',
 'versionrequiredtext' => 'Version $1 of MediaWiki kinahanglan para magamit ang page nga ja.
 Lantawa sa [[Special:Version|version kang page]].',
 
-'ok'                      => 'OK dun',
-'youhavenewmessages'      => 'May rudyan kaw nga $1 ($2).',
-'newmessageslink'         => 'bag-o nga manga mensahe',
-'newmessagesdifflink'     => 'orihi nga ilis',
+'ok' => 'OK dun',
+'youhavenewmessages' => 'May rudyan kaw nga $1 ($2).',
+'newmessageslink' => 'bag-o nga manga mensahe',
+'newmessagesdifflink' => 'orihi nga ilis',
 'youhavenewmessagesmulti' => 'May rudyan kaw nga manga bag-o nga mensahe sa $1',
-'editsection'             => 'iislan',
-'editold'                 => 'iislan',
-'toc'                     => 'Manga Sulud',
-'showtoc'                 => 'ipakita',
-'hidetoc'                 => 'itago',
+'editsection' => 'iislan',
+'editold' => 'iislan',
+'toc' => 'Manga Sulud',
+'showtoc' => 'ipakita',
+'hidetoc' => 'itago',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Pahina',
-'nstab-media'     => 'Pahina kang Midya',
-'nstab-special'   => 'Espesyal',
-'nstab-project'   => 'Pahina kang Proyekto',
-'nstab-image'     => 'Inayap',
+'nstab-main' => 'Pahina',
+'nstab-media' => 'Pahina kang Midya',
+'nstab-special' => 'Espesyal',
+'nstab-project' => 'Pahina kang Proyekto',
+'nstab-image' => 'Inayap',
 'nstab-mediawiki' => 'Mensahe',
-'nstab-template'  => "''Template''",
-'nstab-help'      => 'Pahina kang Panoytoy',
-'nstab-category'  => 'Kategorya',
+'nstab-template' => "''Template''",
+'nstab-help' => 'Pahina kang Panoytoy',
+'nstab-category' => 'Kategorya',
 
 # General errors
-'error'                => 'Sayup',
-'databaseerror'        => 'Sayup sa database',
-'readonly'             => "Napintalan ang ''database''",
-'internalerror'        => 'Sayup internal',
-'internalerror_info'   => 'Sayup internal: $1',
-'filecopyerror'        => 'Indi makopya ang \'\'file\'\' halin sa "$1" paagto sa "$2".',
-'filerenameerror'      => 'Indi maislan ang ngaran kang \'\'file\'\' halin sa "$1" paagto sa "$2".',
-'filedeleteerror'      => "Indi mapara ang ''file'' nga \"\$1\".",
+'error' => 'Sayup',
+'databaseerror' => 'Sayup sa database',
+'readonly' => "Napintalan ang ''database''",
+'internalerror' => 'Sayup internal',
+'internalerror_info' => 'Sayup internal: $1',
+'filecopyerror' => 'Indi makopya ang \'\'file\'\' halin sa "$1" paagto sa "$2".',
+'filerenameerror' => 'Indi maislan ang ngaran kang \'\'file\'\' halin sa "$1" paagto sa "$2".',
+'filedeleteerror' => "Indi mapara ang ''file'' nga \"\$1\".",
 'directorycreateerror' => "Indi mahimo ang ''directory'' nga \"\$1\".",
-'filenotfound'         => "Indi makita ang ''file'' nga \"\$1\".",
-'fileexistserror'      => "Indi makasolat sa ''file'' nga \"\$1\": may amo kadya run nga ''file''",
-'viewsource'           => 'Turukun ang ginhalinan',
+'filenotfound' => "Indi makita ang ''file'' nga \"\$1\".",
+'fileexistserror' => "Indi makasolat sa ''file'' nga \"\$1\": may amo kadya run nga ''file''",
+'viewsource' => 'Turukun ang ginhalinan',
 
 # Login and logout pages
 'remembermypassword' => "Tandaan ang akun nga ''log-in'' sa dya nga ''computer'' (for a maximum of $1 {{PLURAL:$1|day|days}})",
-'nologinlink'        => "Himo ka sangka ''account''",
-'createaccount'      => "Himo ka ''account''",
+'nologinlink' => "Himo ka sangka ''account''",
+'createaccount' => "Himo ka ''account''",
 
 # Edit pages
 'preview' => 'Bilid',
 
 # Preferences page
-'skin-preview'      => 'Bilid',
+'skin-preview' => 'Bilid',
 'searchresultshead' => 'Sagap',
-'youremail'         => 'E-mail:',
-'email'             => 'E-mail',
+'youremail' => 'E-mail:',
+'email' => 'E-mail',
 
 # Recent changes
 'hide' => 'Itago',
@@ -240,7 +239,7 @@ Lantawa sa [[Special:Version|version kang page]].',
 # File deletion
 'filedelete-submit' => 'Para',
 
-'brokenredirects-edit'   => 'Iislan',
+'brokenredirects-edit' => 'Iislan',
 'brokenredirects-delete' => 'para',
 
 'withoutinterwiki-submit' => 'Ipakita',
@@ -269,32 +268,32 @@ Lantawa sa [[Special:Version|version kang page]].',
 # Undelete
 'undelete-search-submit' => 'Sagap',
 
-'sp-contributions-talk'   => 'Wakal',
+'sp-contributions-talk' => 'Wakal',
 'sp-contributions-submit' => 'Sagap',
 
 # What links here
 'whatlinkshere-page' => 'Pahina:',
-'isredirect'         => 'idaho ang pahina',
+'isredirect' => 'idaho ang pahina',
 
 # Block/unblock
 'ipblocklist-submit' => 'Sagap',
 
 # Tooltip help for the actions
-'tooltip-ca-protect'            => 'Amligan ang dya nga pahina',
-'tooltip-ca-delete'             => 'Paraun ang dya nga Pahina',
-'tooltip-p-logo'                => 'Pono nga Pahina',
-'tooltip-n-mainpage'            => 'Agtoni ang Main Page',
-'tooltip-n-portal'              => 'Tunggəd sa project, ano pwede mo mahimo, diin mo makita ang mga bagay bagay',
-'tooltip-n-currentevents'       => 'Pangita-a ang mga ginhalinan sa mga nagakaratabo sa tulad',
-'tooltip-n-recentchanges'       => 'Listahan kang mga bag-o lang na-ilis sa wiki.',
-'tooltip-n-randompage'          => 'Magkarga kang random nga page',
-'tooltip-n-help'                => 'Lugar kun diin mo masagap.',
-'tooltip-t-whatlinkshere'       => 'Listahan kang tanan nga mga wiki pages nga naga-link paagto ja',
+'tooltip-ca-protect' => 'Amligan ang dya nga pahina',
+'tooltip-ca-delete' => 'Paraun ang dya nga Pahina',
+'tooltip-p-logo' => 'Pono nga Pahina',
+'tooltip-n-mainpage' => 'Agtoni ang Main Page',
+'tooltip-n-portal' => 'Tunggəd sa project, ano pwede mo mahimo, diin mo makita ang mga bagay bagay',
+'tooltip-n-currentevents' => 'Pangita-a ang mga ginhalinan sa mga nagakaratabo sa tulad',
+'tooltip-n-recentchanges' => 'Listahan kang mga bag-o lang na-ilis sa wiki.',
+'tooltip-n-randompage' => 'Magkarga kang random nga page',
+'tooltip-n-help' => 'Lugar kun diin mo masagap.',
+'tooltip-t-whatlinkshere' => 'Listahan kang tanan nga mga wiki pages nga naga-link paagto ja',
 'tooltip-t-recentchangeslinked' => 'Mga bag-o lng ilis nga mga page nga naka-link halin sa page nga ja',
-'tooltip-feed-rss'              => 'RSS feed para sa page nga ja',
-'tooltip-feed-atom'             => 'Atom feed para sa page nga ja',
-'tooltip-t-contributions'       => 'Lantawa ang listahan kang mga ginbulig kang user nga ja',
-'tooltip-t-emailuser'           => 'Padarhi kang e-mail ang user nga ja',
+'tooltip-feed-rss' => 'RSS feed para sa page nga ja',
+'tooltip-feed-atom' => 'Atom feed para sa page nga ja',
+'tooltip-t-contributions' => 'Lantawa ang listahan kang mga ginbulig kang user nga ja',
+'tooltip-t-emailuser' => 'Padarhi kang e-mail ang user nga ja',
 
 # Special:NewFiles
 'ilsubmit' => 'Sagap',
index 4cd9339..9f9eefa 100644 (file)
 
 $rtl = true;
 
+$namespaceNames = array(
+       NS_MEDIA            => 'میڈیا',
+       NS_SPECIAL          => 'خاص',
+       NS_MAIN             => '',
+       NS_TALK             => 'بَحَژ',
+       NS_USER             => 'رُکُن',
+       NS_USER_TALK        => 'رُکُن_بَحَژ',
+       NS_PROJECT_TALK     => '$1_بَحَژ',
+       NS_FILE             => 'فَیِل',
+       NS_FILE_TALK        => 'فَیِل_بَحَژ',
+       NS_MEDIAWIKI        => 'میڈیاوکی',
+       NS_MEDIAWIKI_TALK   => 'میڈیاوکی_بَحَژ',
+       NS_HELP             => 'پَلزُن',
+       NS_HELP_TALK        => 'پَلزُن_بَحَژ',
+       NS_CATEGORY         => 'زٲژ',
+       NS_CATEGORY_TALK    => 'زٲژ_بَحَژ',
+);
+
 $digitTransformTable = array(
        '0' => '٠', # &#x0660;
        '1' => '١', # &#x0661;
@@ -32,15 +50,15 @@ $separatorTransformTable = array(
 
 $messages = array(
 # Dates
-'monday'    => 'ژِنٛدٕروار',
-'february'  => 'فرؤری',
-'april'     => 'اپریٖل',
-'may_long'  => 'مٔی',
-'june'      => 'جوٗن',
-'august'    => 'اَگست',
+'monday' => 'ژِنٛدٕروار',
+'february' => 'فرؤری',
+'april' => 'اپریٖل',
+'may_long' => 'مٔی',
+'june' => 'جوٗن',
+'august' => 'اَگست',
 'september' => 'سیٚپٹَمبَر',
-'november'  => 'نَوَمبَر',
-'december'  => 'ڈیٚسَمبَر',
+'november' => 'نَوَمبَر',
+'december' => 'ڈیٚسَمبَر',
 
 'about' => 'مُتعلِق',
 
@@ -48,22 +66,22 @@ $messages = array(
 'vector-view-edit' => 'تَرتیٖب دِیُن',
 'vector-view-view' => 'پَرُن',
 
-'help'             => 'مدد',
-'search'           => 'ژھارُن',
-'searchbutton'     => 'ژھارُن',
-'history_short'    => 'توٲریٖخ',
+'help' => 'مدد',
+'search' => 'ژھارُن',
+'searchbutton' => 'ژھارُن',
+'history_short' => 'توٲریٖخ',
 'talkpagelinktext' => 'بَحَژ',
-'talk'             => 'بَحَژ',
-'toolbox'          => 'اَوزار',
-'otherlanguages'   => 'باقیَن زَبانَن منٛز',
-'jumptosearch'     => 'ژھارُن',
+'talk' => 'بَحَژ',
+'toolbox' => 'اَوزار',
+'otherlanguages' => 'باقیَن زَبانَن منٛز',
+'jumptosearch' => 'ژھارُن',
 
 # 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}}',
-'mainpage'  => 'گَرٕ',
+'mainpage' => 'گَرٕ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'صَفہٕ',
+'nstab-main' => 'صَفہٕ',
 'nstab-category' => 'زٲژ',
 
 # Edit pages
@@ -75,7 +93,7 @@ $messages = array(
 # Upload
 'filedesc' => 'خُلاسہٕ',
 
-'sp-contributions-talk'   => 'بَحَژ',
+'sp-contributions-talk' => 'بَحَژ',
 'sp-contributions-submit' => 'ژھارُن',
 
 # Namespace 8 related
index 73beeb4..d1e9fb0 100644 (file)
@@ -165,7 +165,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Neuste_Änderunge', 'Änderunge' ),
        'Recentchangeslinked'       => array( 'Änderungen_an_verlinkte_Sigge' ),
        'Revisiondelete'            => array( 'Version_fottschmieße' ),
-       'RevisionMove'              => array( 'VersioneÖmnänne', 'Versione_Ömnänne', 'VersioneÖmnenne', 'Versione_Ömnenne' ),
        'Search'                    => array( 'Sök', 'Söök', 'Söke', 'Sööke' ),
        'Shortpages'                => array( 'Koote_Atikelle' ),
        'Specialpages'              => array( 'Sondersigge', 'Söndersigge' ),
@@ -300,7 +299,7 @@ $messages = array(
 'february-gen' => 'Febrewar',
 'march-gen' => 'Määz',
 'april-gen' => 'Aprel',
-'may-gen' => 'Mei',
+'may-gen' => 'Mai',
 'june-gen' => 'Juni',
 'july-gen' => 'Juli',
 'august-gen' => 'Aujuss',
@@ -345,8 +344,8 @@ $messages = array(
 'newwindow' => '(Mäht e neu Finster op, wann Dinge Brauser dat kann)',
 'cancel' => 'Stopp! Avbreche!',
 'moredotdotdot' => 'Mieh&nbsp;…',
-'mypage' => 'ming Metmaacher-Sigg',
-'mytalk' => 'ming Klaafsigg',
+'mypage' => 'Metmaachersigg',
+'mytalk' => 'Klaafsigg',
 'anontalk' => 'Klaaf för de IP-Adress',
 'navigation' => 'Jangk noh de',
 'and' => ', un',
@@ -356,7 +355,6 @@ $messages = array(
 'qbbrowse' => 'Aanluure',
 'qbedit' => 'Ändere',
 'qbpageoptions' => 'Sigge Enstellunge',
-'qbpageinfo' => 'Üvver de Sigg',
 'qbmyoptions' => 'Ming Sigge',
 'qbspecialpages' => 'Spezial Sigge',
 'faq' => 'FAQ',
@@ -369,7 +367,7 @@ $messages = array(
 'vector-action-protect' => 'Schöze!',
 'vector-action-undelete' => 'Zerökholle!',
 'vector-action-unprotect' => 'Schoz ändere!',
-'vector-simplesearch-preference' => 'Donn de verbäßerte Vörschlääsch beim Söke aanschallde (bloß mem Ußsinn „Vektor“ zesamme ze hann)',
+'vector-simplesearch-preference' => 'Donn et eijfachere Söke aanschallde (bloß mem Ußsinn „Vektor“ zesamme ze hann)',
 'vector-view-create' => 'Neu Schriive!',
 'vector-view-edit' => 'Ändere!',
 'vector-view-history' => 'Versione zeije!',
@@ -635,12 +633,11 @@ Dä Wiki_Köbes dovun hät beim Deeschmaache als Jrond aanjejovve: „$3“',
 # Login and logout pages
 'logouttext' => "'''Jetz bes de usjelogg'''
 
-Do künnts heh em Wiki wigger maache, als ene namelose Metmaacher. Do kanns De ävver och [[Special:UserLogin|widder enlogge]], als däselve oder och ene andere Metmaacher.
+Do künnts heh em Wiki wigger maache, als ene namelose Metmaacher. Do kanns De ävver och <span class='plainlinks'>[\$1 widder enlogge]</span>, als däselve oder och ene andere Metmaacher.
 Künnt sin, dat De de ein oder ander Sigg immer wigger aanjezeich kriss, wie wann de noch enjelogg wörs. Dun Dingem Brauser singe <i lang=\"en\">Cache</i> fottschmieße oder leddich maache, öm us dä Nummer erus ze kumme!",
-'welcomecreation' => '== Dach, $1! ==
-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]].',
+'welcomeuser' => 'Wellkumme $1!',
+'welcomecreation-msg' => 'Dinge Zohjang es enjerescht.
+Wann De wells, künnts De Ding [[Special:Preferences|Enschtällonge aanpaße]].',
 'yourname' => 'Metmaacher_Naame:',
 'yourpassword' => 'Paßwoot:',
 'yourpasswordagain' => 'Noch ens dat Passwood',
@@ -1092,6 +1089,15 @@ Ene Jrond weße mer nit.',
 'edit-no-change' => 'Do häs ja nix aan dä Sigg jeändert, do dom_mer och nix domet.',
 'edit-already-exists' => 'Kunnt kei neu Sigg aanlääje. Di Sigg jidd_et ald.',
 'defaultmessagetext' => 'Dä standaadmäßije Tex',
+'content-failed-to-parse' => 'Et wohr nit müjjelesch, dä Enhalld met däm <i lang="en">MIME-Typ</i> $2 för en Dattei met $1 dren ze verwooschte: $3.',
+'invalid-content-data' => 'Di Daate en dä Sigg sen onjöltesch.',
+'content-not-allowed-here' => 'Ene Enhalld vun dä Zoot „$1“ es op dä Sigg „[[$2]]“ nit zohjelohße.',
+
+# Content models
+'content-model-wikitext' => 'Wikitäx',
+'content-model-text' => 'Eijnfache Tex',
+'content-model-javascript' => 'JavaSkrepp',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Opjepaß:''' Die Sigg heh määt zovill Opwand met Paaser-Funkßjohne.
@@ -1346,8 +1352,6 @@ Mieh doh drövver fengk mer em [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAG
 'search-interwiki-caption' => 'Schwesterprojekte',
 'search-interwiki-default' => '$1 hät heh di Träffer jefonge:',
 'search-interwiki-more' => '(mieh)',
-'search-mwsuggest-enabled' => 'met Vürschläsh',
-'search-mwsuggest-disabled' => 'ohne Vürschläsh',
 'search-relatedarticle' => 'Ähnlesch',
 'mwsuggest-disable' => 'Kein automatische Hölp-Liss per Ajax beim Tippe em Feld för et Söke',
 'searcheverything-enable' => 'En alle Appachtemangs söhke',
@@ -1392,7 +1396,7 @@ dat dänne ihr Daate topaktuell sin,
 
 # Preferences page
 'preferences' => 'ming Enstellunge',
-'mypreferences' => 'ming Enstellunge',
+'mypreferences' => 'Enstellunge',
 'prefs-edits' => 'Aanzahl Änderunge am Wiki:',
 'prefsnologin' => 'Nit enjelogg',
 'prefsnologintext' => 'Do mööts ald <span class="plainlinks">[{{fullurl:{{#special:UserLogin}}|returnto=$1}} enjelogg]</span> sin, öm Ding Enstellunge ze ändere.',
@@ -1483,7 +1487,7 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'yourgender' => 'Do bes *',
 'gender-unknown' => 'wesse mer nit',
 'gender-male' => 'Kääl odder Jung',
-'gender-female' => 'Möhn, Weech odder Mädche',
+'gender-female' => 'Möhn, Weesch odder Mädsche',
 'prefs-help-gender' => '* Moß mer nit aanjevve, un wann et aanjejovve eß, dann kallt et Wiki övver Desch als „dä Pitter“ udder „dat Tiina“, sönß uns „Metmaacher Pütz“. Dat kritt de janne Welt ze sinn, nit nur Do allein.',
 'email' => '<i lang="en">e-mail</i>',
 'prefs-help-realname' => '* Dinge richtije Name — kanns De fott looße — wann De en ävver nenne wells, dann weed dä jebruch, öm Ding Beidräch domet ze schmöcke.',
@@ -1542,11 +1546,11 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'group-suppress' => 'Kontrollettis',
 'group-all' => '(jeede)',
 
-'group-user-member' => '{{GENDER:$1|Metmaacher|Metmaacherin}}',
+'group-user-member' => '{{GENDER:$1|Metmaacher|Metmaacherėn}}',
 'group-autoconfirmed-member' => 'automattesch beshtääteshte {{GENDER:$1|Metmaacher|Metmaacherėn}}',
 '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-bureaucrat-member' => '{{GENDER:$1|Bürrokraad|Bürrokraadefrou}}',
 'group-suppress-member' => '{{GENDER:$1|Kontrolletti}}',
 
 'grouppage-user' => '{{ns:project}}:Metmaacher',
@@ -1623,6 +1627,9 @@ Ene zohfällesch ußjewörfelte Schlößel, dää De nämme künnß, wöhr: <cod
 'rightslogtext' => 'Hee sin de Änderunge an Metmaacher ehre Räächde opjeliss. Op de Sigge üvver Metmaacher, Wiki-Köbesse, Bürrokrade, Stewards, un esu, kanns De nohlese, wat domet es.',
 'rightslogentry' => 'hät däm Metmaacher „$1“ sing Räächde vun „$2“ op „$3“ ömjestallt.',
 'rightslogentry-autopromote' => 'wood automattesch vun $2 zohm $3 jemaat.',
+'logentry-rights-rights' => '{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} „$1“ hät däm Metmaacher „$3“ sing Jroppe-Räächde vun „$4“ op „$5“ ömjestallt.',
+'logentry-rights-rights-legacy' => '{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 hät däm Metmaacher $3 sing Räääschte-Jroppe verändert.',
+'logentry-rights-autopromote' => '{{GENDER:$1|Dä|Et|Dä Metmaacher|De|Dat}} $1 wood automattesch vum $4 zom $5 jemaat.',
 'rightsnone' => '(nix)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1887,6 +1894,7 @@ Wann et nit flupp, verzäll et enem [[Special:ListUsers/sysop|Wiki-Köbes]].',
 'backend-fail-notsame' => 'En Dattei mem Name $1 jidd et ald, di es ävver ongerscheidlesch.',
 'backend-fail-invalidpath' => '„$1“ es keine jölteje Pahd för et Speischere.',
 'backend-fail-delete' => 'Mer kunnte di Dattei $1 nit fottschmiiße.',
+'backend-fail-describe' => 'Mer kunnte de Metta_Daate för di Dattei $1 nit ändere.',
 'backend-fail-alreadyexists' => 'En Dattei $1 jidd et ald.',
 'backend-fail-store' => 'Mer kunnte di Dattei $1 nit onger $2 affschpeischere.',
 'backend-fail-copy' => 'Mer kunnte di Dattei $1 nit noh $2 koppėėere.',
@@ -1904,7 +1912,7 @@ Als Jrond es aanjejovve: „$2“',
 'backend-fail-internal' => 'Ene onklohre Fähler es opjetrodde met däm Schpeischersysteem „$1“.',
 'backend-fail-contenttype' => 'Mer kunnte de Zoot Enhalt nit eruß krijje, di en dä Dattei „$1“ faßjehallde wääde sull.',
 'backend-fail-batchsize' => 'Dat Schpeischersysteem hät ene Pöngel met {{PLURAL:$1|einem Befähl|$1 Befähle|keinem Befähl}} krääje, ävver et kann bloß {{PLURAL:$2|eine Befähl|$2 Befähle|keine Befähl}} op eijmohl.',
-'backend-fail-usable' => 'Mer kunnte di Dattei $1 nit schrieve, weil e Verzeischnes udder ene container fählt, udder et Rääsch, dren ze schrieve.',
+'backend-fail-usable' => 'Mer kunnte di Dattei $1 nit lässe udder schrieve, weil e Verzeischnes udder ene container fählt, udder et Rääsch, dren ze lässe udder ze schrieve.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Mer kunnte kein Verbendong opnämme met dä Daatebangk för et Logbooch vum Schpeischersysteem „$1“.',
@@ -2040,7 +2048,7 @@ Velleisch sullts De dä [$2 Täx övver se doh]  aanpasse.',
 'shared-repo-from' => 'uß $1',
 'shared-repo' => 'ene jemeinsame Beshtand',
 'filepage.css' => '/* Heh dat CSS küdd op Sigge övver Dateije, och di vun ander Wikis jehollt woode sin. */',
-'upload-disallowed-here' => 'Onjlöklescherwies kanns De heh dat Beld nit övverschriive.',
+'upload-disallowed-here' => 'Do kanns heh di Dattei nit övverschriive.',
 
 # File reversion
 'filerevert' => '„$1“ zerök holle',
@@ -2309,7 +2317,7 @@ eins vun all däm op eimol.',
 
 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: <code>$1</code>es',
+De Brauserprotokolle, di beim Söke aanjejovve wäde künne, sen: <code>$1</code> un der Schtandatt es <code>http://</code> wann nix aanjejovve es.',
 'linksearch-line' => '„$2“ hät ene Link op $1',
 'linksearch-error' => 'Shternshe kam_mer nor aam Aanfang fum Domain-Name bruche.',
 
@@ -2361,11 +2369,10 @@ schecke.',
 'emailuser-title-target' => '<i lang="en">E-mail</i> aan {{GENDER:$1|dä Metmaacher|di Metmaacherėn|dä Metmaacher|di Metmaacherėn|dä Metmaacher}} $1',
 'emailuser-title-notarget' => 'Verschegg en <i lang="en">e-mail</i> aan ene Metmaacher',
 'emailpage' => 'Verscheck <i lang="en">e-mail</i> aan ene Metmaacher',
-'emailpagetext' => 'Wann 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.
+'emailpagetext' => 'Wann {{GENDER:$1|dä Metmaacher heh|dat heh|heh dä Metmaacher|sei|dat heh}} 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 heh unge en einzel <i lang="en">e-mail</i> aan {{GENDER:$1|inn|it|dä Metmaacher|heh di Metmaacherėn|et}} schecke.
 
 Ding <i lang="en">e-mail</i>-Adräß, di De en [[Special:Preferences|Ding eije Enstellunge]] aanjejovve häs,
-di weed als em Afsender sing Adräß en Ding <i lang="en">e-mail</i> enjedrage.
+di weed als em Afsender sing Adräß enjedrare.
 Domet kann, wä di <i lang="en">e-mail</i> kritt, drop antwoote, un di Antwood jeiht tirek aan Desch.
 Alles klor?',
 'usermailererror' => 'Dat E-Mail-Objek jov ene Fähler us:',
@@ -2383,7 +2390,7 @@ Alles klor?',
 'email-legend' => 'Scheck en<i lang="en"> e-mail</i> aan ene andere Metmaacher fum Wiki',
 'emailfrom' => 'Vun:',
 'emailto' => 'Aan:',
-'emailsubject' => 'Ã\9cvverschreff:',
+'emailsubject' => 'Ã\96vverschreff:',
 'emailmessage' => 'Dä Tex fun Dinge Nohreesch:',
 'emailsend' => 'Avschecke',
 'emailccme' => 'Scheck mer en Kopie vun dä E-Mail.',
@@ -2398,7 +2405,7 @@ Alles klor?',
 
 # Watchlist
 'watchlist' => 'ming Oppassliss',
-'mywatchlist' => 'ming Oppassliss',
+'mywatchlist' => 'Oppaßleß',
 'watchlistfor2' => 'För dä $1 $2',
 'nowatchlist' => 'En Ding Oppassliss es nix dren.',
 'watchlistanontext' => 'Do muss $1, domet de en Ding Oppassliss erenluure kanns, oder jet dran ändere.',
@@ -2438,11 +2445,7 @@ dann klick op „Nimieh drop oppasse“ wann De die Sigg om Schirm häs.",
 
 'enotif_mailer' => '{{ucfirst:{{GRAMMAR:Genitive singe male|{{SITENAME}}}}}} Nohreechte-Versand',
 'enotif_reset' => 'Setz all Änderunge op „Aanjeluurt“ un Erledich.',
-'enotif_newpagetext' => 'Dat es en neu aanjelahte Sigg.',
 'enotif_impersonal_salutation' => 'Metmaacher {{GRAMMAR:Genitiv vun|{{SITENAME}}}}',
-'changed' => 'jeändert',
-'created' => 'neu aanjelaht',
-'enotif_subject' => 'De Sigg "$PAGETITLE" wood $CHANGEDORCREATED vum "$PAGEEDITOR" {{GRAMMAR:em|{{SITENAME}}}}',
 'enotif_lastvisited' => 'Luur unger „$1“ - do fings de all die Änderunge zick Dingem letzte Besoch hee.',
 'enotif_lastdiff' => 'Loor op $1 för heh di Änderung aan_ze_loore.',
 'enotif_anon_editor' => 'Dä namelose Metmaacher $1',
@@ -2623,7 +2626,9 @@ Versione för die neu Sigg enjerich. Die neu Sigg weed nit ersetz.',
 'undeletedrevisions' => '{{PLURAL:$1|ein Version|$1 Versione}} zeröckjehollt',
 'undeletedrevisions-files' => 'Zesammejenomme {{PLURAL:$1|Ein Version|<strong>$1</strong> Versione|<strong>Kein</strong> Version}} vun {{PLURAL:$2|eine Datei|<strong>$2</strong> Dateie|<strong>nix</strong>}} zeröckjehollt',
 'undeletedfiles' => '{{PLURAL:$1|Ein Datei|<strong>$1</strong> Dateie|<strong>Kein</strong> Dateie}} zeröckjehollt',
-'cannotundelete' => '<strong>Dä.</strong> Dat Zeröckholle jing donevve. Mach sinn, dat ene andere Metmaacher flöcker wor, un et ald et eets jedon hät, un jetz es die Sigg ald widder do jewäse.',
+'cannotundelete' => '<strong>Dä.</strong> Et Zeröckholle jing donävve.
+
+$1',
 'undeletedpage' => '<strong>De Sigg „$1“ es jetz widder do</strong>
 Luur Der et [[Special:Log/delete|Logboch met de fottjeschmesse Sigge]] aan, do häs De de Neuste fottjeschmesse
 un widder herjehollte Sigge.',
@@ -2656,7 +2661,7 @@ $1',
 # Contributions
 'contributions' => 'Däm Metmaacher sing Beidräch',
 'contributions-title' => 'Beidräsch fum  $1',
-'mycontris' => 'ming Beidräch',
+'mycontris' => 'Beidrähch',
 'contribsub2' => 'För dä Metmaacher: $1 ($2)',
 'nocontribs' => 'Mer han kein Änderunge jefonge, en de Logböcher, die do passe däte.',
 'uctop' => ' (Neuste)',
@@ -2936,6 +2941,7 @@ Di Sigg „[[:$1]]“ jitt et ald. Wollts De se fottschmieße, öm heh di Sigg 
 'immobile-target-namespace-iw' => 'Ene Ingerwikilink es nix, woh mer en Sigg hen ömnenne künnt!',
 'immobile-source-page' => 'Di Sigg kann nit ömjenannt wääde.',
 'immobile-target-page' => 'Op dä Tittel kann kei Sigg ömjenannt wääde.',
+'bad-target-model' => 'De Zielsigg moß uß en ander Zoot Daate beschtonn, un vun „$1“ noh „$2“ künne mer nit ömwandele.',
 'imagenocrossnamespace' => 'Dateije kam_mer nor in et Appachtemang „{{ns:file}}“ donn, noh woanders hen kam_mer se och nit ömnemme!',
 'nonfile-cannot-move-to-file' => 'Mer kann nix uußer Datteije esu ömnänne, dat et em Appachtemang „{{ns:file}}“ landt',
 'imagetypemismatch' => 'De neu Datei-Endong moß met däm Datei-Tüp zesamme passe',
@@ -3066,7 +3072,6 @@ Bes esu joot, un versök et noch ens.',
 
 # JavaScriptTest
 'javascripttest' => ' JavaSkrepte ußprobeere.',
-'javascripttest-disabled' => 'Di Funxjon es en heh dämm Wiki ußjeschalldt.',
 'javascripttest-title' => 'De Prööfunge „$1“ loufe.',
 'javascripttest-pagetext-noframework' => 'Heh di Sigg es för JavaSkrepte ußzeprobeere.',
 'javascripttest-pagetext-unknownframework' => 'Dä Prööfrahme „$1“ es onbikannt.',
@@ -3207,6 +3212,7 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 
 # Info page
 'pageinfo-title' => 'Övver di Sigg: „$1“',
+'pageinfo-not-current' => 'Esu en Aanjaabe künne mer övver ällder Versione vun Sigge nit maache.',
 'pageinfo-header-basic' => 'Jrundlääje Aanjabe',
 'pageinfo-header-edits' => 'De Änderonge',
 'pageinfo-header-restrictions' => 'Siggeschoz',
@@ -3215,6 +3221,7 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-default-sort' => 'Shtandattmääßesch zottiere met däm Schlößel',
 'pageinfo-length' => 'Bytes en dä Sigg',
 'pageinfo-article-id' => 'Dä Sigg ier Nommer en dä Daatebangk',
+'pageinfo-language' => 'De Schprooch vum Sigge-Enhallt',
 'pageinfo-robot-policy' => 'Eijeschaffte för de Söhkmaschiine',
 'pageinfo-robot-index' => 'kammer opnämme',
 'pageinfo-robot-noindex' => 'kammer nit opnämme',
@@ -3231,10 +3238,17 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'pageinfo-authors' => 'De Aanzahl ongerscheidleje Schriever',
 'pageinfo-recent-edits' => 'De Aanzahl Änderonge en dä läzde Zik, ennerhallf vun $1',
 'pageinfo-recent-authors' => 'De Aanzahl ongerscheidleje Schriever en dä läzde Zik',
-'pageinfo-restriction' => 'Siggeschoz ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Ei Zauberwoot|$1 Zauberwööter|Kein Zauberwööter}}',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Ein verstoche Saachjropp|$1 verstoche Saachjroppe|Kein verstoche Saachjropp}}',
 'pageinfo-templates' => '{{PLURAL:$1|Ein Schablohn|$1 Schablohne|Kein Schablohn}} opjerohfe',
+'pageinfo-toolboxlink' => 'Övver heh di Sigg',
+'pageinfo-redirectsto' => 'Leidt öm op',
+'pageinfo-redirectsto-info' => 'Aanjaabe övver di Sigg',
+'pageinfo-contentpage' => 'Zällt als en Sigg vom Enhalld vum Wiki',
+'pageinfo-contentpage-yes' => 'Joh',
+'pageinfo-protect-cascading' => 'Ene Siggeschoz weed vun heh verärf',
+'pageinfo-protect-cascading-yes' => 'Joh',
+'pageinfo-protect-cascading-from' => 'Ene Siggeschoz weed jeärf vun',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -3257,6 +3271,8 @@ Esu kam_mer noch en Aanmerkung en „{{int:summary}}“ maache.',
 'markedaspatrollederror' => 'Dat Kennzeiche „Nohjeluurt“ kunnt ich nit avspeichere.',
 'markedaspatrollederrortext' => 'Do muss en bestemmte Version ussöke.',
 'markedaspatrollederror-noautopatrol' => 'Do darrefs Ding eije Änderunge nit op „Nohjeloort“ setze!',
+'markedaspatrollednotify' => 'Di Änderong an $1 es jäz nohjekik.',
+'markedaspatrollederrornotify' => 'Dat di Sigg nohjekik es, kunnte mer nit faßhalde.',
 
 # Patrol log
 'patrol-log-page' => 'Logboch vun de nohjeloorte Änderunge',
@@ -3844,7 +3860,8 @@ Domet deiß De tirek sare, dat De di Adress nit bestätije wells.',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[Et Enbinge per Interwiki es avjeschalt]',
-'scarytranscludefailed' => '[De Schablon „$1“ enzebinge hät nit jeflupp]',
+'scarytranscludefailed' => '[De Schablon „$1“ enzebenge hät nit jeflupp]',
+'scarytranscludefailed-httpstatus' => '[De Schablon „$1“ enzebenge hät nit jeflupp. Dä HTTP-Fähler es: $2]',
 'scarytranscludetoolong' => '[Schad, de URL es ze lang]',
 
 # Delete conflict
@@ -4006,6 +4023,7 @@ Dä Shtanndat-Zoot-Schlößel „$1“ övverschriif dä älldere Zoot-Schlöße
 'version-license' => 'Lizänz',
 'version-poweredby-credits' => "Dat Wiki heh löp met '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001–$1 $2.",
 'version-poweredby-others' => 'sönß wää',
+'version-credits-summary' => 'Mer bedanke ons för iehr Beidrähsch zom [[Special:Version|MediaWiki]] bei:',
 'version-license-info' => 'MediaWiki es e frei Projramm. Mer kann et unmolesteet wigger verdeile, un mer kann et verändere, wi mer löstich es, wam_mer sesch dobei aan de <i lang="en">GNU General Public License</i> (jenerälle öffentlesche Lizänz noh GNU) hallde deiht, wi se vun der <i lang="en">Free Software Foundation</i> (Steftung för frei Soffwäer) veröffentlesch woode es. Dobei kam_mer sesch ußsöhke of mer sesch aan de Version 2 dovun hallde deiht, udder öhnz en späädere Fassung.
 
 MediaWiki weed verdeilt met dä Hoffnung, dat et för jet jood es, ävver <span style="text-transform:uppercase">der ohne jeede Jarantie</span>, un esujaa ohne ene unjesaate Jedangke, et künnt <span style="text-transform:uppercase">ze verkoufe</span> sin udder <span style="text-transform:uppercase;">för öhndsene bestemmpte Zweck ze jebruche</span>. Loor Der de jenannte Lizänz aan, wann De mieh Einzelheite weße wells.
@@ -4170,6 +4188,10 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'feedback-bugcheck' => 'Joot. Donn op jeede Vall nohlooer, dat dat bes jäz noch nit [$1 bikannt wohr].',
 'feedback-bugnew' => 'Hann esch nohjelooert. Esch jävven ene neue Fähler enn.',
 
+# Search suggestions
+'searchsuggest-search' => 'Söhke',
+'searchsuggest-containing' => 'dren änthallde…',
+
 # API errors
 'api-error-badaccess-groups' => 'Do häs nit et Rääsch, Datteije en heh dat Wiki huhzelaade.',
 'api-error-badtoken' => 'Fähler: et Kännzeijsche (<i lang="en">token</i>) es kappott.',
@@ -4216,7 +4238,7 @@ Wat De doh enjiß, kütt met Dingem Metmaachername un Dingem Brauser op die Sigg
 'duration-minutes' => '{{PLURAL:$1|ein Menutt|$1 Menutte|kein Menutt}}',
 'duration-hours' => '{{PLURAL:$1|en Stund|$1 Stunde|kein Shtund}}',
 'duration-days' => '{{PLURAL:$1|ene Daach|$1 Dääsch|keine Daach}}',
-'duration-weeks' => '{{PLURAL: $1|en Woch|§1 Woche|kein Woch}}',
+'duration-weeks' => '{{PLURAL: $1|en Woch|$1 Woche|kein Woch}}',
 'duration-years' => '{{PLURAL:$1|e Johr|$1 Johre|kei Johr}}',
 'duration-decades' => '{{PLURAL:$1|zehn Johre|$1 Johrzehnte|kei Johrzehnt}}',
 'duration-centuries' => '{{PLURAL:$1|e Johrhondert|$1 Johrhonderte|kei Johrhondert}}',
index a17741f..9680f2a 100644 (file)
  * @author Marmzok
  */
 
-$rtl = true;
-
 $fallback = 'ckb';
 
+$rtl = true;
+
 $digitTransformTable = array(
        '0' => '٠', # &#x0660;
        '1' => '١', # &#x0661;
index f7c0735..301704a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Kurdish (Latin script) (‪Kurdî (latînî)‬)
+/** Kurdish (Latin script) (Kurdî (latînî)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -51,6 +51,8 @@ $namespaceAliases = array(
        'Kategorî_nîqaş'   => NS_CATEGORY_TALK,
 );
 
+$separatorTransformTable = array( ',' => '.', '.' => ',' );
+
 $specialPageAliases = array(
        'Categories'                => array( 'Dara_kategoriyan' ),
        'DoubleRedirects'           => array( 'Redirect\'ên_ducarî' ),
@@ -74,7 +76,6 @@ $magicWords = array(
        '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' ),
@@ -88,7 +89,7 @@ $magicWords = array(
        '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' ),
+       'img_link'                  => array( '1', 'girêdan=$1', 'link=$1' ),
        'sitename'                  => array( '1', 'NAVÊ_PROJEYÊ', 'SITENAME' ),
        'grammar'                   => array( '0', 'RÊZIMAN.', 'GRAMMAR:' ),
        'gender'                    => array( '0', 'ZAYEND.', 'GENDER:' ),
@@ -219,6 +220,7 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|Di vê kategoriyê de tenê ev dane heye:|Di vê kategoriyê de {{PLURAL:$2|daneyek heye|$2 dane hene}}. Jêr {{PLURAL:$1|daneyek tê|$1 dane tên}} nîşandan.}}',
 'category-file-count-limited' => 'Ev {{PLURAL:$1|daneya|$1 daneyên}} jêr di vê kategoriyê de ne.',
 'listingcontinuesabbrev' => 'dewam',
+'noindex-category' => 'Rûpelên bênimînok',
 'broken-file-category' => 'Rûpelên bi girêdanên xerabûyî',
 
 'about' => 'Der barê',
@@ -237,7 +239,6 @@ $messages = array(
 'qbbrowse' => 'Bigere',
 'qbedit' => 'Biguherîne',
 'qbpageoptions' => 'Ev rûpel',
-'qbpageinfo' => 'Naverok',
 'qbmyoptions' => 'Rûpelên min',
 'qbspecialpages' => 'Rûpelên taybet',
 'faq' => 'PGP',
@@ -305,7 +306,7 @@ $messages = array(
 'categorypage' => 'Li rûpela kategoriyê binêre',
 'viewtalkpage' => 'Li gotûbêjê binêre',
 'otherlanguages' => 'Zimanên din',
-'redirectedfrom' => '(ji $1 hate beralîkirin)',
+'redirectedfrom' => '(Ji $1 hate beralîkirin)',
 'redirectpagesub' => 'Rûpelê beralî bike',
 'lastmodifiedat' => 'Ev rûpel cara dawî di $2, $1 de hate guherandin.',
 'viewcount' => 'Ev rûpel {{PLURAL:$1|carekê|caran}} tê xwestin.',
@@ -348,6 +349,9 @@ $messages = array(
 'youhavenewmessages' => '$1 yên te hene ($2).',
 'newmessageslink' => 'Peyamên nû',
 'newmessagesdifflink' => 'cudayî ji guhertoya berê',
+'youhavenewmessagesfromusers' => 'Ji {{PLURAL:$3|bikarhênerekê/î|$3 bikarhêneran}}, ji bo te {{PLURAL:$1|peyameke nû heye|peyamên nû hene}} ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|peyameke nû|peyamên nû}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|guherandin|guherandinên dawî}}',
 'youhavenewmessagesmulti' => 'Peyamên nû li $1 ji te re hene.',
 'editsection' => 'biguherîne',
 'editold' => 'biguherîne',
@@ -451,11 +455,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Tu niha derketî.'''
 
-Tu dikarî {{SITENAME}} niha weke bikarhênerekî nediyarkirî bikarbînî, yan jî tu dikarî dîsa bi vî navê xwe yan navekî din wek bikarhêner [[Special:UserLogin|dîsa têkevî]].
+Tu dikarî {{SITENAME}} niha weke bikarhênerekî nediyarkirî bikarbînî, yan jî tu dikarî dîsa bi vî navê xwe yan navekî din wek bikarhêner <span class='plainlinks'>[$1 dîsa têkevî]</span>.
 Bila di bîra te de be ku gengaz e hin rûpel mîna ku tu hîn bi navê xwe qeyd kiriyî werin nîşandan, heta ku tu nîşanên çavlêgerandina (browser) xwe jênebî.",
-'welcomecreation' => '== Tu bi xêr hatî, $1! ==
-
-Hesabê te hate afirandin. Tu dikarî niha [[Special:Preferences|tercîhên xwe di {{SITENAME}}]] de biguherînî.',
 'yourname' => 'Navê bikarhêner:',
 'yourpassword' => 'Şîfre:',
 'yourpasswordagain' => 'Şîfreyê dîsa binivîse:',
@@ -735,8 +736,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'last' => 'berê',
 'page_first' => 'ya pêşîn',
 'page_last' => 'ya paşîn',
-'histlegend' => 'Rênîşan: (cudahî) = cudahiya nav vê û versiyona niha,
-(berê) = cudahiya nav vê û ya berî vê, B = guhertina biçûk',
+'histlegend' => "Rênîşan: ({{int:cur}}) = cudahiya nav vê û versiyona niha, ({{int:last}}) = cudahiya nav vê û ya berî vê, '''{{int:minoreditletter}}''' = guhertina biçûk",
 'history-fieldset-title' => 'Li dîrokê bigere',
 'history-show-deleted' => 'Tenê yên jêbirî',
 'histfirst' => 'Kevintirîn',
@@ -838,8 +838,6 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'search-interwiki-caption' => 'Projeyên hevçeng',
 'search-interwiki-default' => '$1 encam:',
 'search-interwiki-more' => '(bêhtir)',
-'search-mwsuggest-enabled' => 'bi pêşniyazan',
-'search-mwsuggest-disabled' => 'pêşniyaz tune',
 'search-relatedarticle' => 'Pêwendîdar',
 'searchrelated' => 'pêwendîdar',
 'searchall' => 'hemû',
@@ -1039,7 +1037,7 @@ Sedema qedexekirina $3 ev e: ''$2''",
 'rcshowhidebots' => "Bot'an $1",
 'rcshowhideliu' => 'Bikarhênerên qeydkirî $1',
 'rcshowhideanons' => 'Bikarhênerên neqeydkirî (IP) $1',
-'rcshowhidepatr' => '$1 guherandinên kontrolkirî',
+'rcshowhidepatr' => 'Guherandinên kontrolkirî $1',
 'rcshowhidemine' => 'Guherandinên min $1',
 'rclinks' => '$1 guherandinên di $2 rojên dawî de nîşan bide<br />$3',
 'diff' => 'cudahî',
@@ -1423,11 +1421,7 @@ Gava tu bixwazî wê rûpelê ji nav lîsteya xwe ya şopandinê derbixî, li se
 'unwatching' => 'Neşopîne…',
 
 'enotif_reset' => 'Hemû rûpelan wek lêsekirî nîşanbide',
-'enotif_newpagetext' => 'Ev rûpeleke nû ye.',
 'enotif_impersonal_salutation' => 'Bikarhênerî {{SITENAME}}',
-'changed' => 'hate guhertin',
-'created' => 'hate afirandin',
-'enotif_subject' => '[{{SITENAME}}] Rûpelê "$PAGETITLE" ji $PAGEEDITOR hate $CANGEDORCREATED',
 'enotif_anon_editor' => 'Bikarhênerê/a neqeydkirî $1',
 'enotif_body' => 'Birêz $WATCHINGUSERNAME,
 
@@ -1601,8 +1595,9 @@ Ji bo jêbirinan û çêkirinên nû, ji kerema xwe li [[{{ns:special}}:Log/dele
 'whatlinkshere-prev' => '{{PLURAL:$1|yê|$1 yên}} berê',
 'whatlinkshere-next' => '{{PLURAL:$1|yê|$1 yên}} din',
 'whatlinkshere-links' => '← girêdan',
-'whatlinkshere-hideredirs' => '$1 beralîkirin',
-'whatlinkshere-hidelinks' => '$1 lînkan',
+'whatlinkshere-hideredirs' => 'Beralîkirinan $1',
+'whatlinkshere-hidetrans' => 'Naverokan $1',
+'whatlinkshere-hidelinks' => 'Lînkan $1',
 'whatlinkshere-hideimages' => '$1 lînkên wêneyan',
 'whatlinkshere-filters' => 'Parzûn',
 
@@ -1871,6 +1866,10 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'pageinfo-views' => 'Hejmara dîtinê',
 'pageinfo-watchers' => 'Hejmara kesên dişopînin',
 'pageinfo-edits' => 'Hejmara guherandinan',
+'pageinfo-toolboxlink' => 'Agahiya rûpelê',
+'pageinfo-redirectsto-info' => 'agahî',
+'pageinfo-contentpage-yes' => 'Erê',
+'pageinfo-protect-cascading-yes' => 'Erê',
 
 # Patrolling
 'markaspatrolleddiff' => 'Wek serrastkirî nîşan bide',
@@ -1905,7 +1904,7 @@ Ji ber ku girêdaneke derve di wê rûpelê de heye ev pirsgirêk pêk hat.',
 'imagelisttext' => "Jêr lîsteyek ji $1 file'an heye, duxrekirin $2.",
 'newimages-summary' => 'Ev rûpela taybet dosyeyên ku herî dawî hatine barkirin, nîşan dide.',
 'newimages-legend' => 'Parzûn',
-'showhidebots' => '($1 bot)',
+'showhidebots' => "(Bot'an $1)",
 'noimages' => 'Ne tiştek tê dîtin.',
 'ilsubmit' => 'Lêgerîn',
 'bydate' => 'li gor dîrokê',
@@ -2049,7 +2048,7 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 # Auto-summaries
 'autosumm-blank' => 'Rûpel hate vala kirin',
 'autosumm-replace' => "'$1' ket şûna rûpelê.",
-'autoredircomment' => 'ji bo [[$1]] hate beralîkirin',
+'autoredircomment' => 'Ji bo [[$1]] hate beralîkirin',
 'autosumm-new' => 'Rûpela nû: "$1"',
 
 # Live preview
@@ -2149,4 +2148,8 @@ Ji kerema xwe zanibe ku tu bi rastî dixwazî vê rûpelê dîsa çêkî.",
 'feedback-message' => 'Peyam:',
 'feedback-cancel' => 'Betal bike',
 
+# Search suggestions
+'searchsuggest-search' => 'Lêgerîn',
+'searchsuggest-containing' => 'dihundirîne...',
+
 );
index 9e17935..b54ba16 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Komi (Ð\9aоми)
+/** Komi (коми)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -48,44 +48,44 @@ $namespaceAliases = array(
 
 $messages = array(
 # Dates
-'sunday'        => 'вежалун',
-'monday'        => 'выльлун',
-'tuesday'       => 'воторник',
-'wednesday'     => 'середа',
-'thursday'      => 'четверг',
-'friday'        => 'пекнича',
-'saturday'      => 'субöта',
-'january'       => 'тӧв шӧр тӧлысь',
-'february'      => 'урасьӧм тӧлысь',
-'march'         => 'рака тӧлысь',
-'april'         => 'кос му тӧлысь',
-'may_long'      => 'ода кора тӧлысь',
-'june'          => 'лӧддза-номъя тӧлысь',
-'july'          => 'сора тӧлысь',
-'august'        => 'моз тӧлысь',
-'september'     => 'кӧч тӧлысь',
-'october'       => 'йирым тӧлысь',
-'november'      => 'вӧльгым тӧлысь',
-'december'      => 'ӧшым тӧлысь',
-'january-gen'   => 'тӧв шӧр',
-'february-gen'  => 'урасьӧм',
-'march-gen'     => 'рака',
-'april-gen'     => 'кос му',
-'may-gen'       => 'ода кора',
-'june-gen'      => 'лӧддза-номъя',
-'july-gen'      => 'сора',
-'august-gen'    => 'моз',
+'sunday' => 'вежалун',
+'monday' => 'выльлун',
+'tuesday' => 'воторник',
+'wednesday' => 'середа',
+'thursday' => 'четверг',
+'friday' => 'пекнича',
+'saturday' => 'субöта',
+'january' => 'тӧв шӧр тӧлысь',
+'february' => 'урасьӧм тӧлысь',
+'march' => 'рака тӧлысь',
+'april' => 'кос му тӧлысь',
+'may_long' => 'ода кора тӧлысь',
+'june' => 'лӧддза-номъя тӧлысь',
+'july' => 'сора тӧлысь',
+'august' => 'моз тӧлысь',
+'september' => 'кӧч тӧлысь',
+'october' => 'йирым тӧлысь',
+'november' => 'вӧльгым тӧлысь',
+'december' => 'ӧшым тӧлысь',
+'january-gen' => 'тӧв шӧр',
+'february-gen' => 'урасьӧм',
+'march-gen' => 'рака',
+'april-gen' => 'кос му',
+'may-gen' => 'ода кора',
+'june-gen' => 'лӧддза-номъя',
+'july-gen' => 'сора',
+'august-gen' => 'моз',
 'september-gen' => 'кӧч',
-'october-gen'   => 'йирым',
-'november-gen'  => 'вӧльгым',
-'december-gen'  => 'ӧшым',
+'october-gen' => 'йирым',
+'november-gen' => 'вӧльгым',
+'december-gen' => 'ӧшым',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|Категория|Категория}}',
 
 'article' => 'Гижӧд',
-'cancel'  => 'Дугӧдны',
-'mytalk'  => 'Сёрнитан лист бокӧй',
+'cancel' => 'Дугӧдны',
+'mytalk' => 'Сёрнитан лист бокӧй',
 
 # Cologne Blue skin
 'qbfind' => 'Корсьысьӧм',
@@ -93,60 +93,60 @@ $messages = array(
 
 # Vector skin
 'vector-action-move' => 'Ним вежны',
-'vector-view-edit'   => 'Вежны',
-'vector-view-view'   => 'Лыддьыны',
-'namespaces'         => 'Ним пространствояс',
-
-'search'           => 'Корсьысьӧм',
-'searchbutton'     => 'Аддзыны',
-'searcharticle'    => 'Вуджны',
-'history_short'    => 'Важвылӧм',
+'vector-view-edit' => 'Вежны',
+'vector-view-view' => 'Лыддьыны',
+'namespaces' => 'Ним пространствояс',
+
+'search' => 'Корсьысьӧм',
+'searchbutton' => 'Аддзыны',
+'searcharticle' => 'Вуджны',
+'history_short' => 'Важвылӧм',
 'printableversion' => 'Лэдзӧм версия',
-'permalink'        => 'Вежласьтӧм ыстӧд',
-'edit'             => 'Вежны',
-'delete'           => 'Бырӧдны',
-'protect'          => 'Дорйыны',
-'newpage'          => 'Выль лист бок',
+'permalink' => 'Вежласьтӧм ыстӧд',
+'edit' => 'Вежны',
+'delete' => 'Бырӧдны',
+'protect' => 'Дорйыны',
+'newpage' => 'Выль лист бок',
 'talkpagelinktext' => 'сёрнитанін',
-'talk'             => 'Сёрнитанін',
-'toolbox'          => 'Инструментъяс',
-'otherlanguages'   => 'Мӧд кывъясӧн',
-'jumptosearch'     => 'корсьысьӧм',
+'talk' => 'Сёрнитанін',
+'toolbox' => 'Инструментъяс',
+'otherlanguages' => 'Мӧд кывъясӧн',
+'jumptosearch' => 'корсьысьӧм',
 
 # 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}} йылысь',
-'currentevents'        => 'Быд лунся лоӧмтор',
-'mainpage'             => 'Медшӧр лист бок',
+'aboutsite' => '{{SITENAME}} йылысь',
+'currentevents' => 'Быд лунся лоӧмтор',
+'mainpage' => 'Медшӧр лист бок',
 'mainpage-description' => 'Медшӧр лист бок',
-'portal'               => 'Йитчӧм',
-'portal-url'           => 'Project:Йитчӧм портал',
+'portal' => 'Йитчӧм',
+'portal-url' => 'Project:Йитчӧм портал',
 
 'newmessageslink' => 'выль юӧртӧмъяс',
-'editsection'     => 'веськӧдны',
-'editold'         => 'веськӧдны',
-'editlink'        => 'вежны',
+'editsection' => 'веськӧдны',
+'editold' => 'веськӧдны',
+'editlink' => 'вежны',
 'editsectionhint' => '«$1» секция веськӧдны',
-'red-link-title'  => '$1 (гижӧд абу)',
+'red-link-title' => '$1 (гижӧд абу)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Гижӧд',
-'nstab-user'     => 'Пырысь',
-'nstab-project'  => 'Проект йылысь',
+'nstab-main' => 'Гижӧд',
+'nstab-user' => 'Пырысь',
+'nstab-project' => 'Проект йылысь',
 'nstab-category' => 'Категория',
 
 # Login and logout pages
-'yourname'                => 'Пырысьлӧн ним:',
-'login'                   => 'Висьтасьны',
+'yourname' => 'Пырысьлӧн ним:',
+'login' => 'Висьтасьны',
 'nav-login-createaccount' => 'Висьтасьны / гижсьыны',
-'userlogin'               => 'Висьтасьны али гижсьыны',
-'logout'                  => 'Сеанс эштӧдӧм',
-'userlogout'              => 'Сеанс эштӧдӧм',
-'gotaccountlink'          => 'Висьтасьӧй',
-'loginlanguagelabel'      => 'Кыв: $1',
+'userlogin' => 'Висьтасьны али гижсьыны',
+'logout' => 'Сеанс эштӧдӧм',
+'userlogout' => 'Сеанс эштӧдӧм',
+'gotaccountlink' => 'Висьтасьӧй',
+'loginlanguagelabel' => 'Кыв: $1',
 
 # Edit pages
 'savearticle' => 'Лист бокӧс гижны',
-'newarticle'  => '(Выль)',
+'newarticle' => '(Выль)',
 
 # History pages
 'currentrev' => 'Быд лунся версия',
@@ -159,7 +159,7 @@ $messages = array(
 
 # Recent changes
 'recentchanges' => 'Выль веськӧдӧмъяс',
-'hide'          => 'Дзебны',
+'hide' => 'Дзебны',
 'newpageletter' => 'В',
 'boteditletter' => 'б',
 
@@ -167,24 +167,24 @@ $messages = array(
 'recentchangeslinked-page' => 'Гижӧдлӧн ним:',
 
 # Upload
-'upload'    => 'Файл сӧвтны',
+'upload' => 'Файл сӧвтны',
 'uploadbtn' => 'Файл сӧвтны',
 
 # File description page
 'filehist-datetime' => 'Кадпас/кад',
-'filehist-user'     => 'Пырысь',
-'filehist-comment'  => 'Пасйӧд',
+'filehist-user' => 'Пырысь',
+'filehist-comment' => 'Пасйӧд',
 
 # Random page
 'randompage' => 'Кӧсйытӧг гижӧд',
 
 # Miscellaneous special pages
 'newpages' => 'Выль лист бокъяс',
-'move'     => 'Ним вежны',
+'move' => 'Ним вежны',
 
 # Special:Log
 'specialloguserlabel' => 'Пырысь:',
-'log'                 => 'Журналъяс',
+'log' => 'Журналъяс',
 
 # Special:AllPages
 'allarticles' => 'Став гижӧдъяс',
@@ -193,7 +193,7 @@ $messages = array(
 'mywatchlist' => 'Видзӧдӧм лыддьӧгӧй',
 
 # Delete
-'deletepage'            => 'Лист бокӧс бырӧдны',
+'deletepage' => 'Лист бокӧс бырӧдны',
 'deletereason-dropdown' => '* Типовые причины удаления
 ** вандализм
 ** по запросу автора
@@ -209,7 +209,7 @@ $messages = array(
 
 # Contributions
 'contributions' => 'Вӧлысьлӧн чӧжӧс',
-'mycontris'     => 'Чӧжӧсӧй',
+'mycontris' => 'Чӧжӧсӧй',
 
 # What links here
 'whatlinkshere' => 'Ыстӧдъяс татчӧ',
@@ -218,7 +218,7 @@ $messages = array(
 'contribslink' => 'чӧжӧс',
 
 # Move page
-'newtitle'    => 'Выль ним',
+'newtitle' => 'Выль ним',
 'movepagebtn' => 'Лист бокӧс ним вежны',
 
 # Namespace 8 related
@@ -226,8 +226,8 @@ $messages = array(
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Пырысьлӧн лист бокӧй',
-'tooltip-ca-talk'     => 'Гижӧдлӧн сёрнитӧм лист бокӧй али Википедиялӧн дӧнъялӧм лист бокӧй',
-'tooltip-ca-move'     => 'Лист боклӧн ним вежны',
+'tooltip-ca-talk' => 'Гижӧдлӧн сёрнитӧм лист бокӧй али Википедиялӧн дӧнъялӧм лист бокӧй',
+'tooltip-ca-move' => 'Лист боклӧн ним вежны',
 
 # Special:SpecialPages
 'specialpages' => 'Торъя лист бокъяс',
index f22569b..5ee9fd2 100644 (file)
@@ -12,6 +12,7 @@
  * @author MF-Warburg
  * @author Malafaya
  * @author Mongvras
+ * @author Nemo bis
  * @author Nicky.ker
  * @author Nrowe
  * @author Scryfer
@@ -109,27 +110,41 @@ $specialPageAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-hideminor' => 'Kudha chanjyow bian en chanjyow a-dhiwedhes',
-'tog-watchcreations' => "Keworra folednow gwruthys genev dhe'm rol golyas",
-'tog-watchdefault' => "Keworra folednow chanjys genev dhe'm rol golyas",
-'tog-watchmoves' => "Keworra folednow gwayes genev dhe'm rol golyas",
-'tog-watchdeletion' => "Keworra folednow dileys genev dhe'm rol golyas",
-
-'underline-always' => 'Pub pres',
-'underline-never' => 'Nevra',
-'underline-default' => 'Defowt an beurel',
+'tog-underline' => 'Islinenna kevrennow:',
+'tog-hideminor' => 'Cudha chanjyow bian yn chanjyow a-dhiwedhes',
+'tog-showtoolbar' => 'Disqwedhes an toulvar chanjya (res yw JavaScript)',
+'tog-rememberpassword' => "Perthy cov a'm omgelmy war'n beurel-ma (rag $1 {{PLURAL:$1|dedh}} dhe'n moyha)",
+'tog-watchcreations' => "Keworra folennow gwruthys genev ha restrennow ughkergys genev dhe'm rol golyas",
+'tog-watchdefault' => "Keworra folennow ha restrennow chanjys genev dhe'm rol golyas",
+'tog-watchmoves' => "Keworra folennow ha restrennow gwayys genev dhe'm rol golyas",
+'tog-watchdeletion' => "Keworra folennow ha restrennow dileys genev dhe'm rol golyas",
+'tog-minordefault' => 'Merkya pub chanj avel bian dre dhefowt',
+'tog-showjumplinks' => 'Galosegy kevrennow hedhadowder "lamma dhe"',
+'tog-watchlisthideown' => "Cudha ow chanjyow vy y'n rol golyas",
+'tog-watchlisthidebots' => "Cudha chanjyow gans bottow y'n rol golyas",
+'tog-watchlisthideminor' => "Cudha chanjyow bian y'n rol golyas",
+'tog-watchlisthideliu' => "Cudha chanjyow gans devnydhyoryon omgelmys y'n rol golyas",
+'tog-watchlisthideanons' => "Cudha chanjyow gans devnydhyoryon heb hanow y'n rol golyas",
+'tog-showhiddencats' => 'Disqwedhes classys cudhys',
+
+'underline-always' => 'Puppres',
+'underline-never' => 'Jammes',
+'underline-default' => 'Defowt an beurel po an grohen',
 
 # Font style option in Special:Preferences
 'editfont-default' => 'Defowt an beurel',
+'editfont-monospace' => 'Font unnspasys',
+'editfont-sansserif' => 'Font sans-serif',
+'editfont-serif' => 'Font serif',
 
 # Dates
-'sunday' => "Dy' Sul",
-'monday' => "Dy' Lun",
-'tuesday' => "Dy' Meurth",
-'wednesday' => "Dy' Merher",
-'thursday' => "Dy' Yow",
-'friday' => "Dy' Gwener",
-'saturday' => "Dy' Sadorn",
+'sunday' => "De'Sul",
+'monday' => "De'Lun",
+'tuesday' => "De'Meurth",
+'wednesday' => "De'Merher",
+'thursday' => "De'Yow",
+'friday' => "De'Gwener",
+'saturday' => "De'Sadorn",
 'sun' => 'Sul',
 'mon' => 'Lun',
 'tue' => 'Meu',
@@ -138,31 +153,31 @@ $messages = array(
 'fri' => 'Gwe',
 'sat' => 'Sad',
 'january' => 'Genver',
-'february' => 'Hwevrel',
+'february' => 'Whevrel',
 'march' => 'Meurth',
 'april' => 'Ebrel',
 'may_long' => 'Me',
 'june' => 'Metheven',
 'july' => 'Gortheren',
 'august' => 'Est',
-'september' => 'Gwydngala',
+'september' => 'Gwynngala',
 'october' => 'Hedra',
 'november' => 'Du',
 'december' => 'Kevardhu',
 'january-gen' => 'Genver',
-'february-gen' => 'Hwevrel',
+'february-gen' => 'Whevrel',
 'march-gen' => 'Meurth',
 'april-gen' => 'Ebrel',
 'may-gen' => 'Me',
 'june-gen' => 'Metheven',
 'july-gen' => 'Gortheren',
 'august-gen' => 'Est',
-'september-gen' => 'Gwydngala',
+'september-gen' => 'Gwynngala',
 'october-gen' => 'Hedra',
 'november-gen' => 'Du',
 'december-gen' => 'Kevardhu',
 'jan' => 'Gen',
-'feb' => 'Hwe',
+'feb' => 'Whe',
 'mar' => 'Meu',
 'apr' => 'Ebr',
 'may' => 'Me',
@@ -175,42 +190,42 @@ $messages = array(
 'dec' => 'Kev',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|Klass|Klassys}}',
-'category_header' => 'Folednow e\'n klass "$1"',
+'pagecategories' => '{{PLURAL:$1|Class|Classys}}',
+'category_header' => 'Folennow y\'n class "$1"',
 'subcategories' => 'Isglassys',
-'category-media-header' => 'Media e\'n klass "$1"',
-'category-empty' => "''Nyns eus na folednow na media e'n klass-ma.''",
-'hidden-categories' => '{{PLURAL:$1|Klass kovys|Klass kovys}}',
-'hidden-category-category' => 'Klassys kovys',
-'category-subcat-count' => "{{PLURAL:$2|Nyns eus dhe'n klass-ma marnas an isglass a sew.|Yma dhe'n klass-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew, dhyworth sobm a $2.}}",
-'category-subcat-count-limited' => "Yma dhe'n klass-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew.",
-'category-article-count' => "{{PLURAL:$2|Nyns eus dhe'n klass-ma marnas an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folednow}} a sew e'n klass-ma, dhyworth sobm a $2.}}",
-'category-article-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew e'n klass-ma.",
-'category-file-count' => "{{PLURAL:$2|Nyns eus dhe'n klass-ma marnas an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folen}} a sew e'n klass-ma, dhyworth sobm a $2.}}",
-'category-file-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew e'n klass-ma.",
+'category-media-header' => 'Media y\'n class "$1"',
+'category-empty' => "''Nyns eus na folennow na media y'n class-ma.''",
+'hidden-categories' => '{{PLURAL:$1|Class cudhys|Classys cudhys}}',
+'hidden-category-category' => 'Classys cudhys',
+'category-subcat-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an isglass a sew.|Yma dhe'n class-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew, dhyworth somm a $2.}}",
+'category-subcat-count-limited' => "Yma dhe'n class-ma an {{PLURAL:$1|isglass|$1 isglass}} a sew.",
+'category-article-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma marnas an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folennow}} a sew y'n class-ma, dhyworth somm a $2.}}",
+'category-article-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma.",
+'category-file-count' => "{{PLURAL:$2|Nyns eus dhe'n class-ma an folen a sew.|Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma, dhyworth somm a $2.}}",
+'category-file-count-limited' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew y'n class-ma.",
 'listingcontinuesabbrev' => 'pes.',
 
 'about' => 'A-dro dhe',
-'newwindow' => '(y hwra egeri en fenester nowyth)',
-'cancel' => 'Hedhi',
+'newwindow' => '(y whra egery yn fenester noweth)',
+'cancel' => 'Hedhy',
 'moredotdotdot' => 'Moy...',
-'mypage' => 'Ow folen',
-'mytalk' => 'Ow hows',
-'anontalk' => 'Keskows rag an drigva IP-ma',
+'mypage' => 'Folen',
+'mytalk' => 'Kescows',
+'anontalk' => 'Kescows rag an drigva IP-ma',
 'navigation' => 'Lewyans',
 'and' => '&#32;ha(g)',
 
 # Cologne Blue skin
-'qbfind' => 'Kavos',
-'qbbrowse' => 'Peuri',
+'qbfind' => 'Cavos',
+'qbbrowse' => 'Peury',
 'qbedit' => 'Chanjya',
 'qbpageoptions' => 'An folen-ma',
-'qbmyoptions' => 'Ow folednow',
-'qbspecialpages' => 'Folednow arbednek',
+'qbmyoptions' => 'Ow folennow',
+'qbspecialpages' => 'Folennow arbennek',
 'faq' => 'FAQ',
 
 # Vector skin
-'vector-action-addsection' => 'Keworra mater',
+'vector-action-addsection' => 'Keworra testen',
 'vector-action-delete' => 'Dilea',
 'vector-action-move' => 'Gwaya',
 'vector-action-protect' => 'Difres',
@@ -218,22 +233,25 @@ $messages = array(
 'vector-action-unprotect' => 'Chanjya difresans',
 'vector-view-create' => 'Gwruthyl',
 'vector-view-edit' => 'Chanjya',
-'vector-view-history' => 'Gweles an istori',
+'vector-view-history' => 'Gweles an istory',
 'vector-view-view' => 'Redya',
-'vector-view-viewsource' => 'Gweles an bednfenten',
+'vector-view-viewsource' => 'Gweles an bennfenten',
 'actions' => 'Gwriansow',
 'namespaces' => 'Spasys hanow',
+'variants' => 'Dyffransow',
 
+'navigation-heading' => 'Rol lewyans',
 'errorpagetitle' => 'Gwall',
-'returnto' => 'Dehweles dhe $1.',
+'returnto' => 'Dewheles dhe $1.',
 'tagline' => 'Dhyworth {{SITENAME}}',
 'help' => 'Gweres',
-'search' => 'Hwilas',
-'searchbutton' => 'Hwilas',
+'search' => 'Whilas',
+'searchbutton' => 'Whilas',
 'go' => 'Ke',
-'searcharticle' => 'Ke',
-'history' => 'Istori an folen',
-'history_short' => 'Istori',
+'searcharticle' => 'Mos',
+'history' => 'Istory an folen',
+'history_short' => 'Istory',
+'updatedmarker' => 'nowedhys a-ban ow vysytyans diwettha',
 'printableversion' => 'Versyon pryntyadow',
 'permalink' => 'Kevren fast',
 'print' => 'Pryntya',
@@ -244,79 +262,91 @@ $messages = array(
 'create-this-page' => 'Gwruthyl an folen-ma',
 'delete' => 'Dilea',
 'deletethispage' => 'Dilea an folen-ma',
-'undelete_short' => 'Disdhilea {{PLURAL:$1|udn janj|$1 chanj}}',
-'viewdeleted_short' => 'Gweles {{PLURAL:$1|udn janj diles|$1 chanj diles}}',
+'undelete_short' => 'Disdhilea {{PLURAL:$1|unn janj|$1 chanj}}',
+'viewdeleted_short' => 'Gweles {{PLURAL:$1|unn janj diles|$1 chanj diles}}',
 'protect' => 'Difres',
 'protect_change' => 'chanjya',
 'protectthispage' => 'Difres an folen-ma',
 'unprotect' => 'Chanjya difresans',
 'unprotectthispage' => 'Chanjya difresans an folen-ma',
-'newpage' => 'Folen nowyth',
+'newpage' => 'Folen noweth',
 'talkpage' => "Dadhelva a-dro dhe'n folen-ma",
-'talkpagelinktext' => 'keskows',
-'specialpage' => 'Folen arbednek',
+'talkpagelinktext' => 'Kescows',
+'specialpage' => 'Folen arbennek',
 'personaltools' => 'Toulys personel',
-'postcomment' => 'Radn nowyth',
-'talk' => 'Keskows',
+'postcomment' => 'Rann noweth',
+'articlepage' => 'Gweles an folen',
+'talk' => 'Kescows',
 'views' => 'Gwelow',
-'toolbox' => 'Boks toulys',
+'toolbox' => 'Box toulys',
 'userpage' => 'Folen devnydhyer',
 'projectpage' => 'Folen meta',
 'imagepage' => 'Gweles folen an restren',
 'mediawikipage' => 'Gweles folen an messajys',
-'templatepage' => 'Gweles folen an skantlyn',
+'templatepage' => 'Gweles folen an scantlyn',
 'viewhelppage' => 'Gweles an folen gweres',
-'categorypage' => 'Gweles folen an klass',
-'viewtalkpage' => 'Gweles an keskows',
-'otherlanguages' => 'En yethow erel',
+'categorypage' => 'Gweles folen an class',
+'viewtalkpage' => 'Gweles an kescows',
+'otherlanguages' => 'Yn yethow erel',
 'redirectedfrom' => '(Daswedyes dhyworth $1)',
 'redirectpagesub' => 'Folen daswedyans',
-'lastmodifiedat' => 'An folen-ma a veu kens chanjys an $1, dhe $2.',
-'jumpto' => 'Labma dhe:',
+'lastmodifiedat' => 'An folen-ma a veu chanjys an $1, dhe $2.',
+'protectedpage' => 'Folen dhifresys',
+'jumpto' => 'Lamma dhe:',
 'jumptonavigation' => 'lewyans',
-'jumptosearch' => 'hwilas',
+'jumptosearch' => 'whilas',
+'view-pool-error' => 'Drog yw genen, gorgargys yw an servyers orth an termyn-ma.
+Yma re a dhevnydhyoryon owth assaya gweles an folen-ma.
+Gortowgh pols kens why dhe assaya hedhes an folen-ma arta, mar pleg.
+
+$1',
+'pool-errorunknown' => 'Gwall ancoth',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'A-dro dhe {{SITENAME}}',
 'aboutpage' => 'Project:Kedhlow',
-'copyright' => 'Kavadow yw an dalgh en-dadn $1.',
+'copyright' => 'Cavadow yw an dalgh yn-dann $1.',
 'copyrightpage' => '{{ns:project}}:Gwirbryntyansow',
-'currentevents' => 'Darvosow a-lebmyn',
-'currentevents-url' => 'Project:Darvosow a-lebmyn',
+'currentevents' => 'Darvosow a-lemmyn',
+'currentevents-url' => 'Project:Darvosow a-lemmyn',
 'disclaimers' => 'Avisyansow',
-'disclaimerpage' => 'Project:Avisyans ollgebmyn',
+'disclaimerpage' => 'Project:Avisyans ollgemmyn',
 'edithelp' => 'Gweres gans chanjya',
 'edithelppage' => 'Help:Chanjya',
 'helppage' => 'Help:Gweres',
 'mainpage' => 'Folen dre',
 'mainpage-description' => 'Folen dre',
-'policy-url' => 'Project:Polici',
+'policy-url' => 'Project:Policy',
 'portal' => 'Porth an gemeneth',
 'portal-url' => 'Project:Porth an gemeneth',
-'privacy' => 'Polici privetter',
-'privacypage' => 'Project:Polici privetter',
+'privacy' => 'Policy privetter',
+'privacypage' => 'Project:Policy privetter',
 
-'badaccess' => 'Gwall kubmyes',
+'badaccess' => 'Gwall cummyes',
 
 'ok' => 'Sur',
 'retrievedfrom' => 'Daskevys dhyworth "$1"',
 'youhavenewmessages' => 'Yma $1 genowgh ($2).',
-'newmessageslink' => 'messajys nowyth',
-'newmessagesdifflink' => 'chanj kens',
-'youhavenewmessagesmulti' => 'Yma messajys nowyth genowgh war $1',
+'newmessageslink' => 'messajys noweth',
+'newmessagesdifflink' => 'chanj diwettha',
+'youhavenewmessagesfromusers' => 'Yma $1 dhywgh dhyworth {{PLURAL:$3|devnydhyer aral|$3 devnydhyer}} ($2).',
+'youhavenewmessagesmanyusers' => 'Yma $1 dhywgh dhyworth lies devnydhyer ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|messach noweth}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|chanj diwettha}}',
+'youhavenewmessagesmulti' => 'Yma messajys noweth genowgh war $1',
 'editsection' => 'chanjya',
 'editold' => 'chanjya',
-'viewsourceold' => 'gweles an bednfenten',
+'viewsourceold' => 'gweles an bennfenten',
 'editlink' => 'chanjya',
-'viewsourcelink' => 'gweles an bednfenten',
-'editsectionhint' => 'Chanjya an radn: $1',
+'viewsourcelink' => 'gweles an bennfenten',
+'editsectionhint' => 'Chanjya an rann: $1',
 'toc' => 'Rol an folen',
-'showtoc' => 'diskwedhes',
-'hidetoc' => 'kudha',
-'collapsible-expand' => 'Efani',
+'showtoc' => 'disqwedhes',
+'hidetoc' => 'cudha',
+'collapsible-expand' => 'Efany',
 'thisisdeleted' => 'Gweles po restorya $1?',
 'viewdeleted' => 'Gweles $1?',
-'restorelink' => '{{PLURAL:$1|udn janj diles|$1 chanj diles}}',
+'restorelink' => '{{PLURAL:$1|unn janj diles|$1 chanj diles}}',
 'feedlinks' => 'Feed:',
 'site-rss-feed' => '$1 RSS feed',
 'site-atom-feed' => '$1 Atom feed',
@@ -328,273 +358,354 @@ $messages = array(
 'nstab-main' => 'Erthygel',
 'nstab-user' => 'Folen devnydhyer',
 'nstab-media' => 'Folen media',
-'nstab-special' => 'Folen arbednek',
-'nstab-project' => 'Folen towl',
+'nstab-special' => 'Folen arbennek',
+'nstab-project' => 'Folen ragdres',
 'nstab-image' => 'Restren',
 'nstab-mediawiki' => 'Messach',
-'nstab-template' => 'Skantlyn',
+'nstab-template' => 'Scantlyn',
 'nstab-help' => 'Gweres',
-'nstab-category' => 'Klass',
+'nstab-category' => 'Class',
 
 # General errors
 'error' => 'Gwall',
 'databaseerror' => 'Gwall database',
-'readonly' => 'Alhwedhys yw an database',
+'readonly' => 'Alwhedhys yw an database',
 'missingarticle-rev' => '(amendyans#: $1)',
 'missingarticle-diff' => '(Dyffrans: $1, $2)',
 'internalerror' => 'Gwall a-bervedh',
 'internalerror_info' => 'Gwall a-bervedh: $1',
-'filecopyerror' => 'Ny ylles kopia an restren "$1" war-tu "$2".',
-'filerenameerror' => 'Ny ylles dashenwel an restren "$1" dhe "$2".',
-'filedeleteerror' => 'Ny ylles dilea an restren "$1".',
-'filenotfound' => 'Ny ylles kavos an restren "$1".',
+'filecopyerror' => 'Ny veu possybyl copia an restren "$1" dhe "$2".',
+'filerenameerror' => 'Ny veu possybyl dashenwel an restren "$1" dhe "$2".',
+'filedeleteerror' => 'Ny veu possybyl dilea an restren "$1".',
+'filenotfound' => 'Ny veu kevys an restren "$1".',
+'cannotdelete-title' => 'Ny yllir dilea an folen "$1"',
 'badtitle' => 'Titel drog',
-'viewsource' => 'Gweles an bednfenten',
+'viewsource' => 'Gweles an bennfenten',
 
 # Login and logout pages
-'welcomecreation' => '== Dynnargh, $1! ==
-Gwruthys yw agas akont.
-Na wrewgh ankevi dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]].',
+'logouttext' => "'''Digelmys owgh why lemmyn.'''
+
+Why a yll pesya usya {{SITENAME}} heb hanow, po why a yll <span class='plainlinks'>[$1 omgelmy arta]</span> avel an keth devnydhyer po avel devnydhyer aral.
+Notyowgh: Neb folennow a alsa bos disqwedhys kepar del owgh why omgelmys whath, erna wryllowgh why clerhe cache agas peurel.",
+'welcomeuser' => 'Dynnargh, $1!',
+'welcomecreation-msg' => 'Gwruthys yw agas acont.
+Na wrewgh ankevy dhe janjya agas [[Special:Preferences|dowisyansow {{SITENAME}}]].',
 'yourname' => 'Hanow usyer:',
 'yourpassword' => 'Ger tremena:',
-'yourpasswordagain' => 'Jynnskrifowgh agas ger tremena arta:',
-'remembermypassword' => "Porth kov a'm ger tremena war'n amontyer-ma (rag $1 {{PLURAL:$1|dydh|dydh}} dhe'n moyha)",
-'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmi',
+'yourpasswordagain' => 'Jynnscrifowgh agas ger tremena arta:',
+'remembermypassword' => "Perthy cov a'm omgelmy war'n jynn amontya-ma (rag $1 {{PLURAL:$1|dedh}} dhe'n moyha)",
+'securelogin-stick-https' => 'Gwitha junyes gans HTTPS wosa omgelmy',
 'yourdomainname' => 'Agas tiredh:',
-'login' => 'Omgelmi',
-'nav-login-createaccount' => 'Omgelmi / Formya akont nowyth',
-'loginprompt' => 'Res yw dhewgh galosegi cookies rag omgelmi orth {{SITENAME}}.',
-'userlogin' => 'Omgelmi / formya akont nowyth',
-'userloginnocreate' => 'Omgelmi',
-'logout' => 'Digelmi',
-'userlogout' => 'Digelmi',
+'login' => 'Omgelmy',
+'nav-login-createaccount' => 'Omgelmy / Formya acont noweth',
+'loginprompt' => 'Res yw dhywgh galosegy cookies rag omgelmy orth {{SITENAME}}.',
+'userlogin' => 'Omgelmy / formya acont noweth',
+'userloginnocreate' => 'Omgelmy',
+'logout' => 'Digelmy',
+'userlogout' => 'Digelmy',
 'notloggedin' => 'Digelmys',
-'nologin' => "A nyns eus akont dhewgh? '''$1'''.",
-'nologinlink' => 'Formyowgh akont',
-'createaccount' => 'Formya akont nowyth',
-'gotaccount' => "Eus akont genowgh seulabres? '''$1'''.",
-'gotaccountlink' => 'Omgelmi',
-'userlogin-resetlink' => 'Eus ankevys genowgh agas manylyon omgelmi?',
+'nologin' => "A nyns eus acont dhywgh? '''$1'''.",
+'nologinlink' => 'Formyowgh acont',
+'createaccount' => 'Formya acont noweth',
+'gotaccount' => "Eus acont dhis seulabres? '''$1'''.",
+'gotaccountlink' => 'Omgelmy',
+'userlogin-resetlink' => 'Eus ankevys genowgh agas manylyon omgelmy?',
 'createaccountmail' => 'der e-bost',
-'createaccountreason' => 'Cheson:',
-'badretype' => 'Ny wra parya an geryow-tremena an eyl gans y gila.',
+'createaccountreason' => 'Acheson:',
+'badretype' => 'Ny wrug omdhesedhes an geryow tremena entrys genowgh.',
 'userexists' => "Yma'n hanow usyer entrys genowgh ow pos usys seulabres.
 Dowisowgh hanow aral mar pleg.",
-'loginerror' => 'Gwall omgelmi',
-'createaccounterror' => 'Ny ylles formya an akont: $1',
-'nocookiesnew' => 'An akont yw formys, mes nyns owgh hwi omgelmys.
-Yma {{SITENAME}} owth usya cookies rag omgelmi devnydhyoryon.
+'loginerror' => 'Gwall omgelmy',
+'createaccounterror' => 'Ny veu possybyl formya an acont: $1',
+'nocookiesnew' => 'Formys yw an acont, mes nyns owgh why omgelmys.
+Yma {{SITENAME}} owth usya cookies rag omgelmy devnydhyoryon.
 Dialosegys yw cookies war agas jynn amontya.
-Gwrewgh aga galosegi, hag omgelmi dre usya agas hanow usyer ha ger tremena nowyth.',
+Gwrewgh aga galosegy, hag omgelmowgh dre usya agas hanow usyer ha ger tremena noweth.',
 'nocookieslogin' => 'Yma {{SITENAME}} owth usya cookies rag omgelmi devnydhyoryon.
 Dialosegys yw cookies war agas jynn amontya.
 Gwrewgh aga galosegi hag assaya arta.',
-'noname' => 'Ny wrussowgh hwi ri hanow usyer da.',
-'loginsuccess' => "'''Omgelmys owgh hwi lebmyn orth {{SITENAME}} avel \"\$1\".'''",
-'nouserspecified' => 'Res yw dhewgh ri hanow usyer.',
-'wrongpassword' => 'Kabm o an ger tremena.
+'noname' => 'Ny wrussowgh why ry hanow usyer da.',
+'loginsuccesstitle' => 'Omgelmy a sowenas',
+'loginsuccess' => "'''Omgelmys owgh why lemmyn orth {{SITENAME}} avel \"\$1\".'''",
+'nouserspecified' => 'Res yw dhywgh ry hanow usyer.',
+'wrongpassword' => 'Camm o an ger tremena.
 Assayowgh arta mar pleg.',
 'wrongpasswordempty' => 'Gwag o an ger-tremena res. Assayowgh arta mar pleg.',
+'passwordtooshort' => "Res yw dhe eryow tremena bos {{PLURAL:$1|1 lytheren|$1 lytheren}} dhe'n lyha.",
+'password-name-match' => "Ny yll agas ger tremena bos an keth ha'gas hanow usyer.",
+'password-login-forbidden' => 'Difennys yw usya an hanow usyer-ma hag an ger tremena-ma.',
 'mailmypassword' => 'E-bostya ger tremena nowyth',
-'noemailcreate' => 'Res yw dhewgh ri trigva ebost da',
-'accountcreated' => 'Formys yw an akont',
-'accountcreatedtext' => 'Formys yw an akont rag $1.',
+'passwordremindertitle' => 'Ger tremena noweth rag {{SITENAME}}',
+'passwordremindertext' => 'Nebonen (why martesen, dhyworth an drigva IP $1) a wovynnas ger tremena noweth rag {{SITENAME}} ($4). Ger tremena termynyel rag an devnydhyer
+"$2" re beu gwruthys hag a veu settyes dhe "$3". Mars o henna agas bodh, y fedh res dhywgh omgelmy ha dowis ger tremena noweth lemmyn.
+Agas ger tremena termynyel a wra diwedha yn {{PLURAL:$5|unn jedh|$5 dedh}}.
+
+Mar qwrug nebonen aral govyn hemma, po yma cov dhywgh a\'gas ger tremena ha nyns yw whans dhywgh y janjya namoy, why a yll sconya aswon an messach-ma ha pesya usya agas ger tremena coth.',
+'noemail' => 'Nyns eus trigva ebost recordyes rag an devnydhyer "$1".',
+'noemailcreate' => 'Res yw dhewgh ry trigva ebost da',
+'passwordsent' => 'Ger tremena noweth re beu danvenys dhe\'n drigva ebost covscrifys rag "$1".
+Gwrewgh omgelmy arta mar pleg wosa why dh\'y receva.',
+'emailauthenticated' => 'Afydhyes veu agas trigva ebost an $2 dhe $3.',
+'emailconfirmlink' => 'Afydhyowgh agas trigva ebost',
+'invalidemailaddress' => 'Ny yllir alowa an drigva ebost drefen bos furv drog dhedhy.
+Entrowgh trigva da y furv po gwakhowgh an furvlen-na.',
+'accountcreated' => 'Acont formys',
+'accountcreatedtext' => 'Formys re beu an acont rag $1.',
+'createaccount-title' => 'Formya acont war {{SITENAME}}',
+'createaccount-text' => 'Nebonan a wrug gwruthyl acont rag agas trigva ebost war {{SITENAME}} ($4) henwys "$2", "$3" y er tremena.
+Why a dalvia omgelmy ha chanjya agas ger tremena lemmyn.
+
+Why a yll sconya aswon an messach-ma, mar peu an acont-ma formyes yn gwall.',
+'usernamehasherror' => "Ny yllowgh why usya lytherennow hash y'gas ger tremena",
 'loginlanguagelabel' => 'Yeth: $1',
 
 # Change password dialog
 'resetpass' => 'Chanjya ger-tremena',
-'resetpass_header' => 'Chanjya ger tremena an akont',
-'oldpassword' => 'Ger tremena koth:',
-'newpassword' => 'Ger tremena nowyth:',
+'resetpass_announce' => 'Why a wrug omgelmy yn unn usya coden ebostyes termynyel.
+Rag gorfenna omgelmy, res yw dhywgh settya ger tremena noweth omma:',
+'resetpass_header' => 'Chanjya ger tremena an acont',
+'oldpassword' => 'Ger tremena coth:',
+'newpassword' => 'Ger tremena noweth:',
+'retypenew' => 'Jynnscrifowgh an ger tremena noweth arta:',
+'resetpass_submit' => 'Settya an ger tremena hag omgelmy',
+'resetpass_success' => 'Chanjyes re beu agas ger tremena yn soweny!
+Orth agas omgelmy lemmyn...',
+'resetpass_forbidden' => 'Ny yllir chanjya geryow tremena',
 'resetpass-submit-loggedin' => 'Chanjya an ger-tremena',
 'resetpass-submit-cancel' => 'Hedhi',
+'resetpass-temp-password' => 'Ger tremena termynyel:',
 
 # Special:PasswordReset
+'passwordreset' => 'Dassettya ger tremena',
+'passwordreset-text' => 'Gwrewgh lenwel an furvlen-ma rag receva ebost ynno manylyon agas acont.',
+'passwordreset-legend' => 'Dassettya ger tremena',
+'passwordreset-disabled' => "Dialosegys yw dassettya geryow tremena war'n wiki ma.",
+'passwordreset-pretext' => "{{PLURAL:$1||Entrowgh onen a'n tymmyn a dhata a-woles}}",
 'passwordreset-username' => 'Hanow usyer:',
+'passwordreset-domain' => 'Tiredh:',
 'passwordreset-email' => 'Trigva ebost:',
+'passwordreset-emailtitle' => 'Manylyon agas acont war {{SITENAME}}',
+
+# Special:ChangeEmail
+'changeemail' => 'Chanjya trigva ebost',
+'changeemail-header' => 'Chanjya trigva ebost an acont',
+'changeemail-text' => 'Grewgh lenwel an furvlen-ma rag chanjya agas trigva ebost. Y fedh res dhywgh entra agas ger tremena rag afydhya an chanj-ma.',
 
 # Edit page toolbar
-'bold_sample' => 'Tekst tew',
-'bold_tip' => 'Tekst tew',
-'italic_sample' => 'Tekst italek',
-'italic_tip' => 'Tekst italek',
+'bold_sample' => 'Text tew',
+'bold_tip' => 'Text tew',
+'italic_sample' => 'Text italek',
+'italic_tip' => 'Text italek',
 'link_sample' => 'Titel an gevren',
 'link_tip' => 'Kevren bervedhel',
 'extlink_sample' => 'http://www.example.com titel an gevren',
 'extlink_tip' => 'Kevren a-ves (na ankevowgh an rager http://)',
-'headline_sample' => 'Tekst an titel',
-'headline_tip' => 'Pednlinen nivel 2',
-'nowiki_sample' => 'Keworrowgh tekst heb furvyans obma',
-'nowiki_tip' => 'Skonya ajon furvyans wiki',
+'headline_sample' => 'Text an titel',
+'headline_tip' => 'Pennlinen nivel 2',
+'nowiki_sample' => 'Keworrowgh text heb furvyans omma',
+'nowiki_tip' => 'Sconya aswon furvyans wiki',
 'image_tip' => 'Restren neythys',
 'media_tip' => 'Kevren restren',
 'sig_tip' => 'Agas sinans gans stampa-termyn',
 
 # Edit pages
-'summary' => 'Derivas kot:',
-'subject' => 'Testen/Pednlinen:',
-'minoredit' => 'Chanj bian yw hebma',
+'summary' => 'Derivas cot:',
+'subject' => 'Testen/Pennlinen:',
+'minoredit' => 'Chanj bian yw hemma',
 'watchthis' => 'Golyas an folen-ma',
 'savearticle' => 'Gwitha',
 'preview' => 'Ragwel',
 'showpreview' => 'Ragweles',
-'showdiff' => 'Diskwedhes an chanjyow',
-'anoneditwarning' => "'''Gwarnyans:''' Nyns owgh hwi omgelmys.
-Agas trigva IP a vedh rekordys en istori chanjyow an folen-ma.",
+'showdiff' => 'Disqwedhes an chanjyow',
+'anoneditwarning' => "'''Gwarnyans:''' Nyns owgh why omgelmys.
+Recordys a vedh agas trigva IP yn istory an folen-ma.",
+'anonpreviewwarning' => "''Nyns owgh why omgelmys. Dre witha, agas trigva IP a vedh recordyes yn istory chanjya an folen-ma.''",
 'summary-preview' => "Ragwel a'n derivas kot:",
-'loginreqlink' => 'omgelmi',
+'loginreqtitle' => 'Res yw omgelmy',
+'loginreqlink' => 'omgelmy',
 'accmailtitle' => 'Danvenys yw an ger-tremena.',
-'newarticle' => '(Nowyth)',
-'noarticletext' => 'Nyns eus tekst war an folen-ma.
-Hwi a ell [[Special:Search/{{PAGENAME}}|hwilas titel an folen-ma]] en folednow erel,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hwilas e\'n kovnotednow kelmys],
+'newarticle' => '(Noweth)',
+'newarticletext' => "Why a wrug sewya kevren dhe folen nag yw gwruthys whath.
+Rag gwruthyl an folen, dalethowgh jynnscrifa y'n gist a-woles (gwelowgh an [[{{MediaWiki:Helppage}}|folen weres]] rag moy kedhlow).
+Mar qwrussowgh why dos omma yn camm, clyckyowgh boton '''war-dhelergh''' agas peurel.",
+'noarticletext' => 'Nyns eus text y\'n folen-ma.
+Why a yll [[Special:Search/{{PAGENAME}}|whilas titel an folen-ma]] yn folennow erel,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} whilas y\'n covnotennow kelmys],
 po [{{fullurl:{{FULLPAGENAME}}|action=edit}} chanjya an folen-ma]</span>.',
+'noarticletext-nopermission' => 'Nyns eus text y\'n folen-ma a-lemmyn.
+Why a yll [[Special:Search/{{PAGENAME}}|whilas titel an folen-ma]] yn folennow erel, po <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} whilas y\'n covnotennow kelmys]</span>, mes nyns eus cummyes dhywgh a wruthyl an folen-ma.',
+'userpage-userdoesnotexist' => 'Nyns yw covscrifys an acont devnydhyer "$1".
+Gwrewgh checkya mars yw whans dhywgh gwruthyl/chanjya an folen-ma.',
+'userpage-userdoesnotexist-view' => 'Nyns yw covscrifys an acont devnydher "$1".',
 'updated' => '(Nowedhys)',
 'note' => "'''Noten:'''",
-'previewnote' => "'''Gwrewgh perthi kov, nyns yw hebma marnas ragwel.''' Nyns yw agas chanjyow gwithys hwath!",
-'editing' => 'ow chanjya $1',
-'editingsection' => 'ow chanjya $1 (radn)',
-'editingcomment' => 'ow chanjya $1 (radn nowyth)',
-'yourtext' => 'Agas tekst',
+'previewnote' => "Gwrewgh perthy cov, nyns yw hemma marnas ragwel.''' Nyns yw gwithys agas chanjyow whath!",
+'continue-editing' => "Mos dhe'n teller chanjya",
+'editing' => 'Ow chanjya $1',
+'creating' => 'Ow qwruthyl $1',
+'editingsection' => 'Ow chanjya $1 (rann)',
+'editingcomment' => 'Ow chanjya $1 (rann noweth)',
+'yourtext' => 'Agas text',
 'yourdiff' => 'Dyffransow',
-'templatesused' => '{{PLURAL:$1|Skantlyn|Skantlyns}} usys war an folen-ma:',
-'templatesusedpreview' => "{{PLURAL:$1|Skantlyn|Skantlyns}} usys e'n ragwel-ma:",
+'templatesused' => '{{PLURAL:$1|Scantlyn|Scantlyns}} usys war an folen-ma:',
+'templatesusedpreview' => "{{PLURAL:$1|Scantlyn|Scantlyns}} usys y'n ragwel-ma:",
 'template-protected' => '(gwithys)',
 'template-semiprotected' => '(hanter-difresys)',
-'hiddencategories' => 'Esel a {{PLURAL:$1|1 glass kovys|$1 klass kovys}} yw an folen-ma:',
-'permissionserrorstext-withaction' => 'Nyns eus kubmyes dhewgh dhe $2, rag an {{PLURAL:$1|cheson|chesonys}} a sew:',
+'hiddencategories' => 'Esel a {{PLURAL:$1|1 glass cudhys|$1 class cudhys}} yw an folen-ma:',
+'permissionserrorstext-withaction' => 'Nyns eus cummyes dhywgh dhe $2, rag an {{PLURAL:$1|acheson|achesonys}} a sew:',
+'moveddeleted-notice' => 'Diles yw an folen-ma.
+Yma covnoten dhileans ha gwayans an folen a-woles.',
 'log-fulllog' => 'Gweles an govnoten dien',
 
 # "Undo" feature
-'undo-summary' => 'Diswul amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|keskows]])',
+'undo-summary' => 'Diswul amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|kescows]])',
 
 # Account creation failure
-'cantcreateaccounttitle' => 'Ny ellir formya an akont',
+'cantcreateaccounttitle' => 'Nyns yw possybyl formya an acont',
 
 # History pages
-'viewpagelogs' => 'Gweles kovnotednow an folen-ma',
+'viewpagelogs' => 'Gweles covnotennow an folen-ma',
 'currentrev' => 'Amendyans diwettha',
-'currentrev-asof' => 'An chanj diwettha dhyworth $1',
-'revisionasof' => 'Amendyans wosa $1',
-'revision-info' => 'Amendyans wosa $1 gans $2',
-'previousrevision' => '← Amendyans kottha',
-'nextrevision' => 'Amendyans nowyttha →',
+'currentrev-asof' => 'An chanj diwettha a-ban $1',
+'revisionasof' => 'Versyon an folen a-ban $1',
+'revision-info' => 'Amendyans a-ban $1 gans $2',
+'previousrevision' => '← Amendyans cottha',
+'nextrevision' => 'Amendyans nowettha →',
 'currentrevisionlink' => 'An amendyans diwettha',
-'cur' => 'lebmyn',
+'cur' => 'lemmyn',
 'next' => 'nessa',
 'last' => 'kens',
 'page_first' => 'kensa',
 'page_last' => 'kens',
-'histlegend' => "Dowis dyffransow: Merkyowgh kistednow radyo an amendyansow dhe geheveli, ha gwaskowgh 'entra' po an boton orth goles an folen.<br />
-Alhwedh: '''({{int:cur}})''' = dyffrans gans an amendyans diwettha, '''({{int:last}})''' = dyffrans gans amendyans kens, '''{{int:minoreditletter}}''' = chanj bian.",
-'history-fieldset-title' => 'Peuri an istori',
-'history-show-deleted' => 'Diles hep ken',
+'histlegend' => "Dowis dyffransow: Merkyowgh kistennow radyo a'n amendyansow dhe gehevely, ha gwascowgh 'entra' po an boton orth goles an folen.<br />
+Alwhedh: '''({{int:cur}})''' = an dyffrans dhyworth an amendyans diwettha, '''({{int:last}})''' = an dyffrans dhyworth an amendyans kens, '''{{int:minoreditletter}}''' = chanj bian.",
+'history-fieldset-title' => 'Peury an istory',
+'history-show-deleted' => 'Diles hepken',
 'histfirst' => 'An moyha a-varr',
 'histlast' => 'An diwettha',
+'historysize' => '({{PLURAL:$1|1 bayt}})',
 'historyempty' => '(gwag)',
 
 # Revision feed
+'history-feed-title' => 'Istory chanjya',
+'history-feed-description' => 'Istory chanjya rag an folen-ma war an wiki',
 'history-feed-item-nocomment' => '$1 dhe $2',
 
 # Revision deletion
-'rev-delundel' => 'diskwedhes/kudha',
+'rev-delundel' => 'disqwedhes/cudha',
+'rev-showdeleted' => 'disqwedhes',
 'revdel-restore' => 'chanjya an hewelder',
 'revdel-restore-deleted' => 'amendyansow diles',
 'revdel-restore-visible' => 'amendyansow gweladow',
-'pagehist' => 'Istori an folen',
+'pagehist' => 'Istory an folen',
 
 # History merging
-'mergehistory-reason' => 'Cheson:',
+'mergehistory-reason' => 'Acheson:',
 
 # Merge log
 'revertmerge' => 'Disworunya',
 
 # Diffs
-'history-title' => 'Istori an folen "$1"',
-'difference-multipage' => '(Dyffrans ynter an folednow)',
+'history-title' => 'Istory an folen "$1"',
+'difference-title' => 'Dyffransow ynter amendyansow a "$1"',
+'difference-multipage' => '(Dyffrans ynter an folennow)',
 'lineno' => 'Linen $1:',
-'compareselectedversions' => 'Keheveli an amendyansow dowisyes',
-'showhideselectedversions' => 'Diskwedhes/kudha amendyansow dowisyes',
+'compareselectedversions' => 'Kehevely an amendyansow dowisyes',
+'showhideselectedversions' => 'Disqwedhes/cudha amendyansow dowisyes',
 'editundo' => 'diswul',
 
 # Search results
-'searchresults' => 'Sewyansow an hwilans',
-'searchresults-title' => 'Sewyansow an hwilans rag "$1"',
-'searchresulttext' => 'Rag moy kedhlow a-dro dhe hwilas en {{SITENAME}}, gwelowgh [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle' => 'Hwi a wrug hwilas \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|keniver folen ow talleth gans "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|keniver folen ow kevredna dhe "$1"]])',
-'searchsubtitleinvalid' => "Hwi a wrug hwilas '''$1'''",
+'searchresults' => 'Sewyansow whilas',
+'searchresults-title' => 'Sewyansow whilas rag "$1"',
+'searchresulttext' => 'Rag moy kedhlow a-dro dhe whilas yn {{SITENAME}}, gwelowgh [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => 'Why a wrug whilas \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|keniver folen ow talleth gans "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|keniver folen ow kevrenna dhe "$1"]])',
+'searchsubtitleinvalid' => "Why a wrug whilas '''$1'''",
 'notitlematches' => 'Nyns eus titel folen ow machya',
-'notextmatches' => 'Nyns eus tekst folen ow machya',
+'notextmatches' => 'Nyns eus text folen ow machya',
 'prevn' => 'kens {{PLURAL:$1|$1}}',
 'nextn' => 'nessa {{PLURAL:$1|$1}}',
 'prevn-title' => '$1 {{PLURAL:$1|sewyans|sewyans}} kens',
 'nextn-title' => '$1 {{PLURAL:$1|sewyans|sewyans}} nessa',
 'viewprevnext' => 'Gweles ($1 {{int:pipe-separator}} $2) ($3)',
-'searchmenu-legend' => 'Etholyow hwilans',
+'searchmenu-legend' => 'Etholyow whilans',
 'searchmenu-exists' => "''Yma folen henwys \"[[:\$1]]\" war an wiki-ma'''",
 'searchmenu-new' => "'''Gwruthyl an folen \"[[:\$1]]\" war an wiki-ma!'''",
 'searchhelp-url' => 'Help:Gweres',
-'searchprofile-articles' => 'Folednow dalhen',
-'searchprofile-project' => 'Folednow gweres ha ragdres',
+'searchprofile-articles' => 'Folennow dhalhen',
+'searchprofile-project' => 'Folennow gweres ha ragdres',
 'searchprofile-images' => 'Liesmedia',
 'searchprofile-everything' => 'Puptra',
-'searchprofile-advanced' => 'Avoncys',
-'searchprofile-articles-tooltip' => 'Hwilas en $1',
-'searchprofile-project-tooltip' => 'Hwilas en $1',
-'searchprofile-images-tooltip' => 'Hwilas restrednow',
-'searchprofile-everything-tooltip' => 'Hwilas en pub teller (en folednow keskows ynwedh)',
+'searchprofile-advanced' => 'Avonsys',
+'searchprofile-articles-tooltip' => 'Whilas yn $1',
+'searchprofile-project-tooltip' => 'Whilas yn $1',
+'searchprofile-images-tooltip' => 'Whilas restrennow',
+'searchprofile-everything-tooltip' => 'Whilas yn pub teller (yn folennow kescows ynwedh)',
+'searchprofile-advanced-tooltip' => 'Whilas yn spassow hanow personelhes',
 'search-result-size' => '$1 ({{PLURAL:$2|1 ger|$2 ger}})',
 'search-result-category-size' => '{{PLURAL:$1|1 esel|$1 esel}} ({{PLURAL:$2|1 isglass|$2 isglass}}, {{PLURAL:$3|1 restren|$3 restren}})',
 'search-redirect' => '(daswedyans $1)',
-'search-section' => '(radn $1)',
-'search-suggest' => 'A wrussowgh hwi menya: $1',
-'search-interwiki-caption' => 'Ragdresow hwor',
+'search-section' => '(rann $1)',
+'search-suggest' => 'A wrussowgh why menya: $1',
+'search-interwiki-caption' => 'Ragdresow whor',
 'search-interwiki-default' => '$1 sewyansow:',
 'search-interwiki-more' => '(moy)',
-'search-mwsuggest-enabled' => 'gans profyansow',
-'search-mwsuggest-disabled' => 'heb profyansow',
 'search-relatedarticle' => 'Kelmys',
-'mwsuggest-disable' => 'Dialosegi profyansow AJAX',
-'searcheverything-enable' => 'Hwilas en keniver spas-hanow',
+'mwsuggest-disable' => 'Dialosegy profyansow AJAX',
+'searcheverything-enable' => 'Whilas yn keniver spas-hanow',
 'searchrelated' => 'kelmys',
 'searchall' => 'oll',
 'showingresultsheader' => "{{PLURAL:$5|Sewyans '''$1''' dhyworth '''$3'''|Sewyansow '''$1 - $2''' dhyworth '''$3'''}} rag '''$4'''",
-'nonefound' => "'''Noten''': Nyns yw hwilys marnas radn a'n spasys-hanow dre dhefowt.
-Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag hwilas en pub teller (a-barth an folednow keskows, skantlyns, etc), po usyowgh an spas-hanow hwensys avel rag-gorrans.",
+'nonefound' => "'''Noten''': Nyns yw marnas rann a'n spasys-hanow whilys dre dhefowt.
+Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag whilas yn pub teller (ynnans an folennow kescows, scantlyns, etc), po usyowgh an spas-hanow whensys avel rag-gorrans.",
 'search-nonefound' => 'Nyns esa sewyansow ow machya an govyn.',
-'powersearch' => 'Hwilans avoncys',
-'powersearch-legend' => 'Hwilans avoncys',
-'powersearch-ns' => 'Hwilas en spasys-hanow:',
-'powersearch-redir' => 'Gorra an daswedyansow en rol',
-'powersearch-field' => 'Hwilas',
+'powersearch' => 'Whilans avonsys',
+'powersearch-legend' => 'Whilans avonsys',
+'powersearch-ns' => 'Whilas yn spasys-hanow:',
+'powersearch-redir' => 'Gorra an daswedyansow yn rol',
+'powersearch-field' => 'Whilas',
 'powersearch-togglelabel' => 'Dowis:',
 'powersearch-toggleall' => 'Oll',
 'powersearch-togglenone' => 'Nagonen',
-'search-external' => 'Hwilans a-ves',
+'search-external' => 'Whilans a-ves',
 
 # Preferences page
 'preferences' => 'Dowisyansow',
-'mypreferences' => 'Ow dowisyansow',
+'mypreferences' => 'Dowisyansow',
 'changepassword' => 'Chanjya an ger-tremena',
-'prefs-skin' => 'Krohen',
+'prefs-skin' => 'Crohen',
+'skin-preview' => 'Ragweles',
 'prefs-datetime' => 'Dedhyans hag eur',
+'prefs-user-pages' => 'Folennow devnydhyer',
+'prefs-personal' => 'Profil devnydhyer',
 'prefs-rc' => 'Chanjyow a-dhiwedhes',
 'prefs-watchlist' => 'Rol golyas',
+'prefs-watchlist-days' => "Niver a dhedhyow dhe dhisqwedhes y'n rol golyas:",
 'prefs-resetpass' => 'Chanjya ger-tremena',
+'prefs-changeemail' => 'Chanjya an drigva ebost',
+'prefs-setemail' => 'Settya trigva ebost',
 'prefs-email' => 'Etholyow e-bost',
 'saveprefs' => 'Gwitha',
-'searchresultshead' => 'Hwilas',
-'timezoneregion-africa' => 'Afrika',
-'timezoneregion-america' => 'Amerika',
-'timezoneregion-antarctica' => 'Antarktika',
-'timezoneregion-arctic' => 'Arktek',
-'timezoneregion-asia' => 'Asi',
+'resetprefs' => 'Clerhe chanjyow nag yw gwithys',
+'restoreprefs' => 'Restorya pub settyans defowt',
+'prefs-editing' => 'Chanjya',
+'prefs-edit-boxsize' => 'Mens an fenester chanjya.',
+'rows' => 'Rewyow:',
+'columns' => 'Colovennow:',
+'searchresultshead' => 'Whilas',
+'savedprefs' => 'Gwithys re beu agas dowisyansow.',
+'servertime' => 'Eur an servyer:',
+'guesstimezone' => 'Lenwel dhyworth an beurel',
+'timezoneregion-africa' => 'Africa',
+'timezoneregion-america' => 'America',
+'timezoneregion-antarctica' => 'Antarctica',
+'timezoneregion-arctic' => 'Arctek',
+'timezoneregion-asia' => 'Asya',
 'timezoneregion-atlantic' => 'Mor Atlantek',
-'timezoneregion-australia' => 'Ostrali',
+'timezoneregion-australia' => 'Awstralya',
 'timezoneregion-europe' => 'Europa',
 'timezoneregion-indian' => 'Mor Eyndek',
-'timezoneregion-pacific' => 'Mor Kosel',
-'prefs-searchoptions' => 'Etholyow hwilas',
+'timezoneregion-pacific' => 'Mor Cosel',
+'prefs-searchoptions' => 'Whilas',
 'prefs-files' => 'Restrednow',
 'youremail' => 'E-bost:',
 'username' => 'Hanow-usyer:',
@@ -602,55 +713,63 @@ Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag hwilas en pub teller (a-ba
 'prefs-memberingroups' => "Esel a'n {{PLURAL:$1|bagas|bagasow}}:",
 'yourrealname' => 'Hanow gwir:',
 'yourlanguage' => 'Yeth:',
-'yournick' => 'Sinans nowyth:',
+'yournick' => 'Sinans noweth:',
 'yourgender' => 'Reyth:',
 'gender-male' => 'Gorow',
 'gender-female' => 'Benow',
 'email' => 'E-bost',
+'prefs-help-email' => 'A-dhowis yw ry trigva ebost, mes res yw y sensy rag dassettya agas ger tremena mars yw ankevys.',
+'prefs-help-email-others' => 'Why a yll dowis gasa dhe re erel kestava dhywgh der ebost yn unn glyckya kevren war agas folen devnydhyer po kescows.
+Nyns yw disqwedhys agas trigva ebost pan wrella devnydhyoryon erel kestava dhywgh.',
+'prefs-help-email-required' => 'Res yw trigva ebost.',
 'prefs-signature' => 'Sinans',
-'prefs-advancedediting' => 'Etholyow avoncys',
-'prefs-advancedrc' => 'Etholyow avoncys',
-'prefs-advancedrendering' => 'Etholyow avoncys',
-'prefs-advancedsearchoptions' => 'Etholyow avoncys',
-'prefs-advancedwatchlist' => 'Etholyow avoncys',
+'prefs-advancedediting' => 'Etholyow avonsys',
+'prefs-advancedrc' => 'Etholyow avonsys',
+'prefs-advancedrendering' => 'Etholyow avonsys',
+'prefs-advancedsearchoptions' => 'Etholyow avonsys',
+'prefs-advancedwatchlist' => 'Etholyow avonsys',
+'prefs-displayrc' => 'Etholyow disqwedhes',
+'prefs-displaysearchoptions' => 'Etholyow disqwedhes',
+'prefs-displaywatchlist' => 'Etholyow disqwedhes',
 
 # User rights
+'userrights-user-editname' => 'Entrowgh hanow usyer:',
 'userrights-groupsmember' => 'Esel a:',
-'userrights-reason' => 'Cheson:',
+'userrights-reason' => 'Acheson:',
 
 # Groups
 'group' => 'Bagas:',
 'group-user' => 'Devnydhyoryon',
-'group-bot' => 'Botow',
-'group-sysop' => 'Menystoryon',
+'group-bot' => 'Bottow',
+'group-sysop' => 'Menystroryon',
 'group-all' => '(oll)',
 
 'group-user-member' => '{{GENDER:$1|Devnydhyer}}',
-'group-bot-member' => '{{GENDER:$1|bot}}',
-'group-sysop-member' => '{{GENDER:$1|menyster}}',
+'group-bot-member' => '{{GENDER:$1|bott}}',
+'group-sysop-member' => '{{GENDER:$1|menystrer}}',
 
 'grouppage-user' => '{{ns:project}}:Devnydhyoryon',
-'grouppage-bot' => '{{ns:project}}:Botow',
-'grouppage-sysop' => '{{ns:project}}:Menystoryon',
+'grouppage-bot' => '{{ns:project}}:Bottow',
+'grouppage-sysop' => '{{ns:project}}:Menystroryon',
 
 # Rights
-'right-read' => 'Redya folednow',
-'right-edit' => 'Chanjya folednow',
-'right-createtalk' => 'Gwruthyl folednow keskows',
-'right-createaccount' => 'Formya akontow devnydhyer nowyth',
-'right-move' => 'Gwaya folednow',
-'right-movefile' => 'Gwaya restrednow',
-'right-upload' => 'Ughkarga restrednow',
-'right-delete' => 'Dilea folednow',
+'right-read' => 'Redya folennow',
+'right-edit' => 'Chanjya folennow',
+'right-createtalk' => 'Gwruthyl folennow kescows',
+'right-createaccount' => 'Formya acontow devnydhyer noweth',
+'right-move' => 'Gwaya folennow',
+'right-movefile' => 'Gwaya restrennow',
+'right-upload' => 'Ughcarga restrennow',
+'right-delete' => 'Dilea folennow',
 
 # User rights log
-'rightslog' => 'Kovnoten gwiryow an devnydhyer',
+'rightslog' => 'Covnoten wiryow an devnydhyer',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'chanjya an folen-ma',
-'action-move' => 'gwaya an folen ma',
-'action-movefile' => 'gwaya an restren ma',
-'action-upload' => 'ughkarga an restren-ma',
+'action-move' => 'gwaya an folen-ma',
+'action-movefile' => 'gwaya an restren-ma',
+'action-upload' => 'ughcarga an restren-ma',
 'action-delete' => 'dilea an folen-ma',
 
 # Recent changes
@@ -658,72 +777,92 @@ Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag hwilas en pub teller (a-ba
 'recentchanges' => 'Chanjyow a-dhiwedhes',
 'recentchanges-legend' => 'Etholyow an chanjyow a-dhiwedhes',
 'recentchanges-summary' => "Sewya an chanjyow diwettha eus dhe'n wiki war'n folen-ma.",
-'recentchanges-feed-description' => "Sewya an chanjyow diwettha dhe'n wiki e'n feed-ma.",
-'recentchanges-label-newpage' => 'An chanj-ma a wrug gwruthyl folen nowyth',
-'recentchanges-label-minor' => 'Chanj bian yw hebma',
-'recentchanges-label-bot' => 'An chanj-ma a veu gwres gans bot',
-'rclistfrom' => 'Diskwedhes chanjyow nowyth ow talleth a-dhia $1.',
+'recentchanges-feed-description' => "Helerhy an chanjyow diwettha dhe'n wiki y'n feed-ma.",
+'recentchanges-label-newpage' => 'Y feu gwres folen noweth gans an chanj-ma',
+'recentchanges-label-minor' => 'Chanj bian yw hemma',
+'recentchanges-label-bot' => 'An chanj-ma a veu gwres gans bott',
+'rcnote' => "A-woles yma'n {{PLURAL:$1|'''1''' chanj}} y'n {{PLURAL:$2|jedh|'''$2''' dedh}} diwettha, a-ban $5, $4.",
+'rclistfrom' => 'Disqwedhes chanjyow noweth ow talleth a-ban $1.',
 'rcshowhideminor' => '$1 chanjyow bian',
 'rcshowhidebots' => '$1 botow',
 'rcshowhideliu' => '$1 devnydhoryon omgelmys',
 'rcshowhideanons' => '$1 devnydhyoryon dihanow',
 'rcshowhidemine' => '$1 ow chanjyow',
-'rclinks' => "Diskwedhes an $1 chanj a-dhiwedhes gwres e'n $2 dydh a-dhiwedhes<br />$3",
+'rclinks' => "Disqwedhes an $1 chanj diwettha gwres y'n $2 dedh diwettha<br />$3",
 'diff' => 'dyffrans',
-'hist' => 'istori',
-'hide' => 'Kudha',
-'show' => 'Diskwedhes',
+'hist' => 'istory',
+'hide' => 'Cudha',
+'show' => 'Disqwedhes',
 'minoreditletter' => 'B',
 'newpageletter' => 'N',
-'boteditletter' => 'bot',
-'newsectionsummary' => '/* $1 */ radn nowyth',
-'rc-enhanced-expand' => 'Diskwedhes an manylyon (res yw JavaScript)',
-'rc-enhanced-hide' => 'Kudha manylyon',
+'boteditletter' => 'bott',
+'newsectionsummary' => '/* $1 */ rann noweth',
+'rc-enhanced-expand' => 'Disqwedhes an manylyon (res yw JavaScript)',
+'rc-enhanced-hide' => 'Cudha manylyon',
 
 # Recent changes linked
 'recentchangeslinked' => 'Chanjyow kelmys',
 'recentchangeslinked-feed' => 'Chanjyow kelmys',
 'recentchangeslinked-toolbox' => 'Chanjyow kelmys',
 'recentchangeslinked-title' => 'Chanjyow kelmys dhe "$1"',
-'recentchangeslinked-summary' => "Hemm yw rol a janjyow a-dhiwedhes gwres war folednow kevrednys dhyworth folen res (po dhe eseli a glass res).
-'''Tew''' yw folednow eus war agas [[Special:Watchlist|rol golyas]].",
+'recentchangeslinked-noresult' => 'Nyns esa chanj veth war folennow kevrennys dres an termyn res.',
+'recentchangeslinked-summary' => "Hemm yw rol a janjyow a-dhiwedhes gwres dhe folennow yw kevrennys dhyworth folen res (po dhe esely a glass res).
+'''Tew''' yw folennow eus war agas [[Special:Watchlist|rol golyas]].",
 'recentchangeslinked-page' => 'Hanow an folen:',
+'recentchangeslinked-to' => "Disqwedhes chanjyow dhe folennow kevennys dhe'n folen res yn le",
 
 # Upload
-'upload' => 'Ughkarga restren',
-'uploadbtn' => 'Ughkarga restren',
-'uploadlogpage' => 'Kovnoten ughkarga',
-'filename' => 'Hanow-restren',
-'filedesc' => 'Derivas kot',
-'filesource' => 'Pednfenten:',
+'upload' => 'Ughcarga restren',
+'uploadbtn' => 'Ughcarga restren',
+'reuploaddesc' => "Hedhy ughcarga ha dewheles dhe'n furvlen ughcarga",
+'uploadnologin' => 'Digelmys',
+'uploadnologintext' => 'Res yw bos [[Special:UserLogin|omgelmys]] rag ughcarga restrennow.',
+'uploaderror' => 'Gwall ughcarga',
+'uploadlogpage' => 'Covnoten ughcarga',
+'filename' => 'Hanow an restren',
+'filedesc' => 'Derivas cot',
+'fileuploadsummary' => 'Derivas cot:',
+'filesource' => 'Pennfenten:',
 'savefile' => 'Gwitha restren',
 'uploadedimage' => '"[[$1]]" ughkergys',
 'watchthisupload' => 'Golya an folen-ma',
 
 # Special:ListFiles
 'imgfile' => 'restren',
-'listfiles_date' => 'Dedhyas',
+'listfiles_date' => 'Dedhyans',
 'listfiles_name' => 'Hanow',
 'listfiles_user' => 'Devnydhyer',
+'listfiles_size' => 'Mens',
+'listfiles_description' => 'Descrifans',
+'listfiles_count' => 'Versyons',
 
 # File description page
 'file-anchor-link' => 'Restren',
-'filehist' => 'Istori an folen',
-'filehist-help' => 'Klyckyowgh war dedhyans/eur rag gweles an folen del veu hi nena.',
+'filehist' => 'Istory an restren',
+'filehist-help' => 'Clyckyowgh war dedhyans/eur rag gweles an folen del veu nena.',
 'filehist-deleteall' => 'dilea oll',
 'filehist-deleteone' => 'dilea',
-'filehist-current' => 'a-lebmyn',
+'filehist-revert' => 'trebuchya',
+'filehist-current' => 'a-lemmyn',
 'filehist-datetime' => 'Dedhyans/Eur',
-'filehist-thumb' => 'Skeusednik',
-'filehist-thumbtext' => 'Skeusednik rag an versyon wosa $1',
+'filehist-thumb' => 'Skeusennik',
+'filehist-thumbtext' => 'Skeusennik rag an versyon a-ban $1',
+'filehist-nothumb' => 'Nyns eus skeudennik',
 'filehist-user' => 'Devnydhyer',
 'filehist-dimensions' => 'Mensow',
+'filehist-filesize' => 'Mens an restren',
 'filehist-comment' => 'Ger',
 'imagelinks' => 'Devnydh an restren',
-'linkstoimage' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew ow kevredna dhe'n restren-ma:",
-'nolinkstoimage' => "Nyns eus folen ow kevredna dhe'n restren-ma.",
-'sharedupload' => 'Yma an folen-ma ow tos dhyworth $1 ha hi a ell bos usys gans ragdresow erel.',
-'uploadnewversion-linktext' => "Ughkarga versyon nowyth a'n restren-ma",
+'linkstoimage' => "Yma'n {{PLURAL:$1|folen|$1 folen}} a sew ow kevrenna dhe'n restren-ma:",
+'linkstoimage-more' => "Yma moy es $1 {{PLURAL:$1|folen}} ow kevrenna dhe'n restren-ma.
+Yma an rol a sew ow tisqwedhes an {{PLURAL:$1|an kensa kevren folen|kensa $1 kevren folen}} dhe'n restren-ma hepken.
+Yma [[Special:WhatLinksHere/$2|rol leun]] cavadow.",
+'nolinkstoimage' => "Nyns eus folen ow kevrenna dhe'n restren-ma.",
+'morelinkstoimage' => "Gweles [[Special:WhatLinksHere/$1|moy kevrennow]] dhe'n restren-ma.",
+'sharedupload' => 'Yma an folen-ma ow tos dhyworth $1 ha hy a alsa bos yn-dann devnydh gans ragdresow erel.',
+'sharedupload-desc-here' => "Yma'n restren-ma ow tos dhyworth $1 ha hy a alsa bos yn-dann devnydh gans ragdresow erel.
+Yma'n descrifans war y [$2 folen dhescrifans] disqwedhys a-woles.",
+'uploadnewversion-linktext' => "Ughcarga versyon noweth a'n restren-ma",
 
 # File deletion
 'filedelete' => 'Dilea $1',
@@ -731,92 +870,95 @@ Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag hwilas en pub teller (a-ba
 'filedelete-submit' => 'Dilea',
 
 # MIME search
-'download' => 'iskarga',
+'download' => 'iscarga',
 
 # Unwatched pages
-'unwatchedpages' => 'Folednow nag eus ow pos golyes',
+'unwatchedpages' => 'Folennow nag eus den veth ow colyas',
 
 # List redirects
 'listredirects' => 'Rol an daswedyansow',
 
 # Unused templates
-'unusedtemplates' => 'Skantlyns heb devnydh',
-'unusedtemplateswlh' => 'kevrednow erel',
+'unusedtemplates' => 'Scantlyns heb devnydh',
+'unusedtemplateswlh' => 'kevrennow erel',
 
 # Random page
 'randompage' => 'Folen dre jons',
 
 # Statistics
-'statistics-pages' => 'Folednow',
+'statistics' => 'Statystygyon',
+'statistics-pages' => 'Folennow',
 
 'brokenredirects-edit' => 'chanjya',
 'brokenredirects-delete' => 'dilea',
 
-'withoutinterwiki' => 'Folednow heb kevrednow yeth',
-'withoutinterwiki-submit' => 'Diskwedhes',
+'withoutinterwiki' => 'Folennow heb kevrennow yeth',
+'withoutinterwiki-submit' => 'Disqwedhes',
 
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bayt|bayt}}',
 'nmembers' => '$1 {{PLURAL:$1|esel|esel}}',
-'uncategorizedpages' => 'Folednow heb klass',
-'uncategorizedcategories' => 'Klassys heb klass',
-'uncategorizedimages' => 'Restrednow heb klass',
-'uncategorizedtemplates' => 'Skantlyns heb klass',
-'unusedcategories' => 'Klassys gwag',
-'unusedimages' => 'Restrednow heb devnydh',
-'shortpages' => 'Folednow berr',
-'longpages' => 'Folednow hir',
-'protectedpages' => 'Folednow difresys',
+'uncategorizedpages' => 'Folennow heb class',
+'uncategorizedcategories' => 'Classys heb class',
+'uncategorizedimages' => 'Restrennow heb class',
+'uncategorizedtemplates' => 'Scantlyns heb class',
+'unusedcategories' => 'Classys gwag',
+'unusedimages' => 'Restrennow heb devnydh',
+'prefixindex' => 'Keniver folen gans an rager',
+'shortpages' => 'Folennow cot',
+'longpages' => 'Folennow hir',
+'protectedpages' => 'Folennow difresys',
 'protectedtitles' => 'Titlys difresys',
-'usercreated' => '{{GENDER:$3|Formyes}} war $1 dhe $2',
-'newpages' => 'Folednow nowyth',
+'usercreated' => '{{GENDER:$3|Formyes}} an $1 dhe $2',
+'newpages' => 'Folennow noweth',
 'newpages-username' => 'Hanow-usyer:',
-'ancientpages' => 'Folednow kottha',
+'ancientpages' => 'An cottha folennow',
 'move' => 'Gwaya',
 'movethispage' => 'Gwaya an folen-ma',
-'pager-newer-n' => '{{PLURAL:$1|1 nowyttha|$1 nowyttha}}',
-'pager-older-n' => '{{PLURAL:$1|1 kottha|$1 kottha}}',
+'pager-newer-n' => '{{PLURAL:$1|1 nowettha|$1 nowettha}}',
+'pager-older-n' => '{{PLURAL:$1|1 cottha|$1 cottha}}',
 
 # Book sources
-'booksources' => 'Pednfentynyow lyver',
-'booksources-search-legend' => 'Hwilas pednfentynyow lyver',
+'booksources' => 'Pennfentynyow lyver',
+'booksources-search-legend' => 'Whilas pennfentynyow lyver',
 'booksources-go' => 'Mos',
 
 # Special:Log
-'specialloguserlabel' => 'Devnydhyer:',
+'specialloguserlabel' => 'Awtour:',
 'speciallogtitlelabel' => 'Titel:',
-'log' => 'Kovnotednow',
+'log' => 'Covnotennow',
 
 # Special:AllPages
 'allpages' => 'Keniver folen',
 'alphaindexline' => '$1 dhe $2',
 'prevpage' => 'Folen gens ($1)',
-'allpagesfrom' => 'Diskwedhes folednow ow talleth orth:',
-'allpagesto' => 'Diskwedhes folednow ow tiwedha orth:',
+'allpagesfrom' => 'Disqwedhes folennow ow talleth orth:',
+'allpagesto' => 'Disqwedhes folennow ow tiwedha orth:',
 'allarticles' => 'Keniver folen',
 'allpagesprev' => 'Kens',
 'allpagesnext' => 'Nessa',
 'allpagessubmit' => 'Mos',
+'allpages-hide-redirects' => 'Cudha daswedyansow',
 
 # Special:Categories
-'categories' => 'Klassys',
+'categories' => 'Classys',
 
 # Special:DeletedContributions
 'sp-deletedcontributions-contribs' => 'kevrohow',
 
 # Special:LinkSearch
-'linksearch' => 'Hwilas kevrednow a-ves',
-'linksearch-ok' => 'Hwilas',
-'linksearch-line' => '$1 yw kevrednys dhyworth $2',
+'linksearch' => 'Whilas kevrennow a-ves',
+'linksearch-ok' => 'Whilas',
+'linksearch-line' => 'Kevrennys yw $1 dhyworth $2',
 
 # Special:ListUsers
-'listusers-submit' => 'Diskwedhes',
+'listusers-submit' => 'Disqwedhes',
 
 # Special:Log/newusers
-'newuserlogpage' => 'Kovnoten formya akontow devnydhyer',
+'newuserlogpage' => 'Covnoten formya acontow devnydhyer',
 
 # Special:ListGroupRights
-'listgrouprights-members' => '(rol an eseli)',
+'listgrouprights-members' => '(rol esely)',
 
 # E-mail user
 'emailuser' => 'E-bostya an devnydhyer-ma',
@@ -834,227 +976,235 @@ Gwrewgh assaya rag-gorra agas govyn gans ''all:'' rag hwilas en pub teller (a-ba
 'watch' => 'Golyas',
 'watchthispage' => 'Golyas an folen-ma',
 'unwatch' => 'Diswolyas',
-'watchlist-details' => 'Yma {{PLURAL:$1|$1 folen|$1 folen}} war agas rol golyas, heb ynkludya folednow kows.',
+'watchlist-details' => 'Yma {{PLURAL:$1|$1 folen}} war agas rol golyas, marnas folennow kescows.',
+'wlshowlast' => 'Disqwedhes an $1 our $2 dedh $3 diwettha',
 'watchlist-options' => 'Etholyow an rol golyas',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching' => 'Ow kolyas...',
+'watching' => 'Ow colyas...',
 'unwatching' => 'Ow tisgolyas...',
 
 # Delete
 'deletepage' => 'Dilea an folen',
 'delete-confirm' => 'Dilea "$1"',
 'delete-legend' => 'Dilea',
-'actioncomplete' => 'Kowlwres yw an gwrians',
+'actioncomplete' => 'Cowlwres yw an gwrians',
 'actionfailed' => 'An gwrians a fyllas',
 'deletedtext' => '"$1" yw dileys.
-Gwelowgh $2 rag kovadh a dhileansow a-dhiwedhes.',
-'dellogpage' => 'Kovnoten dhilea',
-'deletecomment' => 'Cheson:',
-'deleteotherreason' => 'Cheson aral/keworansel:',
-'deletereasonotherlist' => 'Cheson aral',
+Gwelowgh $2 rag covadh a dhileansow a-dhiwedhes.',
+'dellogpage' => 'Covnoten dhilea',
+'deletecomment' => 'Acheson:',
+'deleteotherreason' => 'Acheson aral/keworansel:',
+'deletereasonotherlist' => 'Acheson aral',
 
 # Rollback
 'rollbacklink' => 'restorya',
 
 # Protect
-'protectlogpage' => 'Kovnoten difres',
+'protectlogpage' => 'Covnoten dhifres',
 'protectedarticle' => 'a dhifresas "[[$1]]"',
-'protectcomment' => 'Cheson:',
+'protectcomment' => 'Acheson:',
 'protectexpiry' => 'Ow tiwedha:',
-'protect_expiry_invalid' => 'Drog yw termyn an diwedh.',
-'protect_expiry_old' => "Yma'n termyn diwedh e'n termyn eus passyes.",
+'protect_expiry_invalid' => 'Drog yw an termyn diwedha.',
+'protect_expiry_old' => "Yma'n termyn diwedha y'n termyn eus passyes.",
 'protect-level-sysop' => 'Menystroryon hepken',
-'protect-summary-cascade' => 'ow froslabma',
-'protect-expiring' => 'y hwra diwedha $1 (UTC)',
-'restriction-type' => 'Kubmyas:',
+'protect-summary-cascade' => 'ow froslamma',
+'protect-expiring' => 'y whra diwedha $1 (UTC)',
+'restriction-type' => 'Cummyas:',
 'pagesize' => '(bayt)',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Chanjya',
 'restriction-move' => 'Gwaya',
 'restriction-create' => 'Gwruthyl',
-'restriction-upload' => 'Ughkarga',
+'restriction-upload' => 'Ughcarga',
 
 # Undelete
-'undeletelink' => 'gweles/daswul',
+'undeletelink' => 'gweles/restorya',
 'undeleteviewlink' => 'gweles',
-'undelete-search-submit' => 'Hwilas',
+'undelete-search-submit' => 'Whilas',
 'undelete-show-file-submit' => 'Ya',
 
 # Namespace form on various pages
-'namespace' => 'Spas-hanow:',
+'namespace' => 'Spas hanow:',
 'invert' => 'Trebuchya an dowisyans',
-'blanknamespace' => '(Pedn)',
+'namespace_association' => 'Spas hanow kelmys',
+'blanknamespace' => '(Penn)',
 
 # Contributions
 'contributions' => 'Kevrohow an devnydhyer',
 'contributions-title' => 'Kevrohow $1',
-'mycontris' => 'Ow hevrohow',
+'mycontris' => 'Kevrohow',
 'contribsub2' => 'Rag $1 ($2)',
 'uctop' => '(gwartha)',
-'month' => 'A-dhia mis (ha moy a-varr):',
-'year' => 'A-dhia bledhen (ha moy a-varr):',
-
-'sp-contributions-newbies' => 'Diskwedhes hepken kevrohow akontow nowyth',
-'sp-contributions-blocklog' => 'kovnoten lettya',
-'sp-contributions-uploads' => 'ughkargansow',
-'sp-contributions-logs' => 'kovnotednow',
-'sp-contributions-talk' => 'keskows',
-'sp-contributions-search' => 'Hwilas kevrohow',
+'month' => 'Dhyworth an mis (ha moy a-varr):',
+'year' => 'Dhyworth an vledhen (ha moy a-varr):',
+
+'sp-contributions-newbies' => 'Disqwedhes yn unnik kevrohow acontow noweth',
+'sp-contributions-blocklog' => 'covnoten lettya',
+'sp-contributions-uploads' => 'ughcargansow',
+'sp-contributions-logs' => 'covnotennow',
+'sp-contributions-talk' => 'kescows',
+'sp-contributions-search' => 'Whilas kevrohow',
 'sp-contributions-username' => 'Trigva IP po hanow-usyer:',
-'sp-contributions-submit' => 'Hwilas',
+'sp-contributions-toponly' => 'Disqwedhes yn unnik chanjyow yw amendyansow diwettha',
+'sp-contributions-submit' => 'Whilas',
 
 # What links here
-'whatlinkshere' => "Pandr'eus ow kevredna obma",
-'whatlinkshere-title' => 'Folednow ow kevredna bys "$1"',
+'whatlinkshere' => "Pandr'eus ow kevrenna omma",
+'whatlinkshere-title' => 'Folennow ow kevrenna dhe "$1"',
 'whatlinkshere-page' => 'Folen:',
-'linkshere' => "Yma'n folednow a sew ow kevredna dhe '''[[:$1]]''':",
-'nolinkshere' => "Nyns eus folen ow kevredna dhe '''[[:$1]]'''.",
+'linkshere' => "Yma'n folennow a sew ow kevrenna dhe '''[[:$1]]''':",
+'nolinkshere' => "Nyns eus folen ow kevrenna dhe '''[[:$1]]'''.",
 'isredirect' => 'folen daswedyans',
-'istemplate' => 'treuskludyans',
+'istemplate' => 'treuscludyans',
 'isimage' => 'kevren an restren',
 'whatlinkshere-prev' => '{{PLURAL:$1|kens|kens $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|nessa|nessa $1}}',
-'whatlinkshere-links' => '← kevrednow',
+'whatlinkshere-links' => '← kevrennow',
 'whatlinkshere-hideredirs' => '$1 daswedyansow',
-'whatlinkshere-hidetrans' => '$1 treuskludyans',
-'whatlinkshere-hidelinks' => '$1 kevrednow',
-'whatlinkshere-hideimages' => '$1 kevrednow imach',
+'whatlinkshere-hidetrans' => '$1 treuscludyans',
+'whatlinkshere-hidelinks' => '$1 kevrennow',
+'whatlinkshere-hideimages' => '$1 kevrennow restren',
 'whatlinkshere-filters' => 'Sidhlow',
 
 # Block/unblock
 'blockip' => 'Lettya devnydhyer',
 'ipadressorusername' => 'Trigva IP po hanow-usyer:',
-'ipbreason' => 'Cheson:',
-'ipbreasonotherlist' => 'Cheson aral',
+'ipbreason' => 'Acheson:',
+'ipbreasonotherlist' => 'Acheson aral',
+'ipboptions' => '2 our:2 hours,1 dhedh:1 day,3 dedh:3 days,1 seythen:1 week,2 seythen:2 weeks,1 vis:1 month,3 mis:3 months,6 mis:6 months,1 vledhen:1 year,heb diwedh:infinite',
 'ipb-blocklist-contribs' => 'Kevrohow rag $1',
 'ipblocklist' => 'Devnydhyoryon lettyes',
-'ipblocklist-submit' => 'Hwilas',
+'ipblocklist-submit' => 'Whilas',
 'blocklink' => 'lettya',
 'unblocklink' => 'dislettya',
 'change-blocklink' => 'chanjya an lettyans',
 'contribslink' => 'kevrohow',
-'blocklogpage' => 'Kovnoten lettya',
-'blocklogentry' => 'a lettyas [[$1]], $2 $3 y/hy termyn diwedh',
+'blocklogpage' => 'Covnoten lettya',
+'blocklogentry' => 'a lettyas [[$1]], bys dhe $2 $3',
 'unblocklogentry' => 'dislettyas $1',
 'block-log-flags-anononly' => 'devnydhyoryon dihanow hepken',
-'block-log-flags-nocreate' => 'dialosegys yw formya akontow',
-'block-log-flags-hiddenname' => 'hanow-usyer kovys',
+'block-log-flags-nocreate' => 'dialosegys yw formya acontow',
+'block-log-flags-hiddenname' => 'hanow usyer cudhys',
 
 # Move page
 'move-page' => 'Gwaya $1',
 'move-page-legend' => 'Gwaya folen',
 'movearticle' => 'Gwaya an folen:',
-'newtitle' => 'Dhe ditel nowyth:',
+'newtitle' => 'Dhe ditel noweth:',
 'move-watch' => 'Golya an folen-ma',
 'movepagebtn' => 'Gwaya an folen',
 'pagemovedsub' => 'An gwarnyans a sowenas',
 'movepage-moved' => '\'\'\'Gwayes yw "$1" war-tu "$2"\'\'\'',
 'movedto' => 'gwayes war-tu',
-'movelogpage' => 'Kovnoten gwaya',
-'movereason' => 'Cheson:',
+'movelogpage' => 'Covnoten waya',
+'movereason' => 'Acheson:',
 'revertmove' => 'trebuchya',
 
 # Export
-'export' => 'Esperthi folednow',
+'export' => 'Esperthy folennow',
 'export-addcat' => 'Keworra',
 'export-addns' => 'Keworra',
 
 # Namespace 8 related
 'allmessagesname' => 'Hanow',
+'allmessagesdefault' => 'Text messach defowt',
 
 # Thumbnails
 'thumbnail-more' => 'Brashe',
-'thumbnail_error' => 'Gwall ow formya skeusednik: $1',
+'thumbnail_error' => 'Gwall ow formya skeusennik: $1',
 
 # Special:Import
-'import' => 'Ymperthi folednow',
-'import-interwiki-submit' => 'Ymperthi',
+'import' => 'Ymperthy folennow',
+'import-interwiki-submit' => 'Ymperthy',
 'import-upload-filename' => 'Hanow-restren:',
-'importstart' => 'Owth ymperthi folednow...',
-'import-noarticle' => 'Nyns eus folen veth dhe ymperthi!',
+'importstart' => 'Owth ymperthy folennow...',
+'import-noarticle' => 'Nyns eus folen veth dhe ymperthy!',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Agas folen dhevnydhyer',
 'tooltip-pt-mytalk' => 'Agas folen gows',
 'tooltip-pt-preferences' => 'Agas dowisyansow',
-'tooltip-pt-watchlist' => 'Rol a folednow erowgh hwi ow kolyas',
+'tooltip-pt-watchlist' => 'Rol a folennow esowgh why ow colyas rag chanjyow',
 'tooltip-pt-mycontris' => "Rol a'gas kevrohow",
-'tooltip-pt-login' => 'Gwell via dhewgh mar tewgh hag omgelmi, mes nyns yw besi',
-'tooltip-pt-logout' => 'Digelmi',
-'tooltip-ca-talk' => "Dadhelva a-dro dhe'n dalgh",
-'tooltip-ca-edit' => 'Hwi a ell chanjya an folen-ma. Gwrewgh usya an boton ragwel kens gwitha mar pleg.',
-'tooltip-ca-addsection' => 'Dalleth radn nowyth',
-'tooltip-ca-viewsource' => 'Alhwedhys yw an folen-ma.
-Y hellir gweles hy fednfenten.',
-'tooltip-ca-history' => 'Amendyansow koth an folen-ma',
+'tooltip-pt-login' => 'Gwell via dhywgh mar tewgh why hag omgelmy, mes nyns yw besy',
+'tooltip-pt-logout' => 'Digelmy',
+'tooltip-ca-talk' => "Dadhel a-dro dhe'n folen",
+'tooltip-ca-edit' => "Why a yll chanjya an folen-ma. Gwrewgh usya an boton 'ragweles' kens gwitha mar pleg.",
+'tooltip-ca-addsection' => 'Dalleth rann noweth',
+'tooltip-ca-viewsource' => 'Alwhedhys yw an folen-ma.
+Why a yll gweles hy fennfenten.',
+'tooltip-ca-history' => "Amendyansow coth a'n folen-ma",
 'tooltip-ca-protect' => 'Difres an folen-ma',
 'tooltip-ca-delete' => 'Dilea an folen-ma',
 'tooltip-ca-move' => 'Gwaya an folen-ma',
 'tooltip-ca-watch' => "Keworra an folen-ma dhe'gas rol golyas",
 'tooltip-ca-unwatch' => 'Dilea an folen-ma dhyworth agas rol golyas',
-'tooltip-search' => 'Hwilas en {{SITENAME}}',
+'tooltip-search' => 'Whilas yn {{SITENAME}}',
 'tooltip-search-go' => 'Mos dhe folen gans an keth hanow-ma, mars eus',
-'tooltip-search-fulltext' => "Hwilas an tekst-ma e'n folednow",
+'tooltip-search-fulltext' => "Whilas an text-ma y'n folennow",
 'tooltip-p-logo' => "Mos dhe'n folen dre",
 'tooltip-n-mainpage' => "Mos dhe'n folen dre",
 'tooltip-n-mainpage-description' => "Mos dhe'n folen dre",
-'tooltip-n-portal' => "A-dro dhe'n ragdres, an peth a ellowgh hwi gwul, ple kavos taklow",
-'tooltip-n-currentevents' => 'Kavos kedhlow a-dro dhe dharvosow a-lebmyn',
-'tooltip-n-recentchanges' => "Rol an chanjyow a-dhiwedhes e'n wiki",
-'tooltip-n-randompage' => 'Karga folen dre jons',
+'tooltip-n-portal' => "A-dro dhe'n ragdres, an peth a yllowgh why gwul, ple dhe gavos taclow",
+'tooltip-n-currentevents' => 'Cavos kedhlow a-dro dhe dharvosow a-lemmyn',
+'tooltip-n-recentchanges' => "Rol a janjyow a-dhiwedhes y'n wiki",
+'tooltip-n-randompage' => 'Carga folen dre jons',
 'tooltip-n-help' => 'Gweres',
-'tooltip-t-whatlinkshere' => 'Rol a bub folen wiki ow kevredna bys obma',
-'tooltip-t-recentchangeslinked' => 'Chanjyow a-dhiwedhes en folednow eus kevrednys dhyworth an folen-ma',
+'tooltip-t-whatlinkshere' => 'Rol a bub folen wiki ow kevrenna dhe omma',
+'tooltip-t-recentchangeslinked' => 'Chanjyow a-dhiwedhes yn folennow eus kevrennys dhyworth an folen-ma',
 'tooltip-feed-rss' => 'Feed RSS rag an folen-ma',
 'tooltip-feed-atom' => 'Feed Atom rag an folen-ma',
 'tooltip-t-contributions' => 'Gweles rol a gevrohow an devnydhyer-ma',
 'tooltip-t-emailuser' => "Danvon e-bost dhe'n devnydhyer-ma",
-'tooltip-t-upload' => 'Ughkarga restrednow',
-'tooltip-t-specialpages' => 'Rol a geniver folen arbednek',
+'tooltip-t-upload' => 'Ughcarga restrennow',
+'tooltip-t-specialpages' => 'Rol a geniver folen arbennek',
 'tooltip-t-print' => "Versyon pryntyadow a'n folen-ma",
 'tooltip-t-permalink' => "Kevren fast dhe'n amendyans-ma a'n folen",
 'tooltip-ca-nstab-main' => 'Gweles an folen',
 'tooltip-ca-nstab-user' => 'Gweles an folen devnydhyer',
-'tooltip-ca-nstab-special' => 'Folen arbednek yw hebma; ny ellowgh hwi chanjya an folen hy honen.',
+'tooltip-ca-nstab-special' => 'Folen arbennek yw hemma; ny yllowgh why chanjya an folen hy honen.',
 'tooltip-ca-nstab-project' => 'Gweles folen an wiki',
 'tooltip-ca-nstab-image' => 'Gweles folen an restren',
-'tooltip-ca-nstab-template' => 'Gweles an skantlyn',
-'tooltip-ca-nstab-category' => 'Gweles folen an klass',
-'tooltip-minoredit' => 'Merkya hebma avel chanj bian',
+'tooltip-ca-nstab-template' => 'Gweles an scantlyn',
+'tooltip-ca-nstab-category' => 'Gweles folen an class',
+'tooltip-minoredit' => 'Merkya hemma avel chanj bian',
 'tooltip-save' => 'Gwitha agas chanjyow',
-'tooltip-preview' => 'Ragweles agas chanjyow; gwrewgh usya hebma kens gwitha mar pleg!',
-'tooltip-diff' => "Diskwedhes an chanjyow eus gwres genowgh dhe'n tekst",
-'tooltip-compareselectedversions' => 'Gweles an dyffransow ynter dew janjyow dowisyes an folen-ma',
+'tooltip-preview' => 'Ragweles agas chanjyow; gwrewgh usya hemma kens gwitha mar pleg!',
+'tooltip-diff' => "Disqwedhes an chanjyow eus gwres genowgh dhe'n text",
+'tooltip-compareselectedversions' => "Gweles an dyffransow ynter an dhew janjyow dowisyes a'n folen-ma",
 'tooltip-watch' => "Keworra an folen-ma dhe'gas rol golyas",
-'tooltip-rollback' => '"Restorya" a wra trebuchya chanjyow gwres dhe\'n folen-ma gans an kens devnydhyer dre udn glyck',
-'tooltip-undo' => '"Diswul" a wra trebuchya an chanj-ma hag egeri an furvlen chanjya e\'n modh ragweles. Cheson a ell bos keworrys e\'n derivas kot.',
-'tooltip-summary' => 'Entrowgh derivas kot',
+'tooltip-rollback' => '"Restorya" a wra trebuchya chanjyow gwres dhe\'n folen-ma gans an diwettha devnydhyer yn unn glyck',
+'tooltip-undo' => '"Diswul" a wra trebuchya an chanj-ma hag egery an furvlen janjya y\'n modh ragweles. Y hyllir keworra acheson y\'n derivas cot.',
+'tooltip-summary' => 'Entrowgh derivas cot',
 
 # Attribution
 'siteuser' => 'devnydhyer {{SITENAME}} $1',
 'lastmodifiedatby' => 'An folen-ma a veu kens chanjys dhe $2, $1 gans $3.',
 'siteusers' => '{{PLURAL:$2|devnydhyer|devnydhyoryon}} {{SITENAME}} $1',
 
+# Info page
+'pageinfo-toolboxlink' => 'Kedhlow an folen',
+
 # Browsing diffs
-'previousdiff' => '← Chanj kottha',
-'nextdiff' => 'Chanj nowyttha →',
+'previousdiff' => '← Chanj cottha',
+'nextdiff' => 'Chanj nowettha →',
 
 # Media information
-'file-info-size' => '$1 × $2 piksel, mens an restren: $3, sort MIME : $4',
-'file-nohires' => 'Nyns eus klerder uhella kavadow.',
-'svg-long-desc' => 'Restren SVG, $1 × $2 piksel en hanow, mens an restren: $3',
-'show-big-image' => 'Klerder leun',
+'file-info-size' => '$1 × $2 pixel, mens an restren: $3, sort MIME: $4',
+'file-nohires' => 'Nyns eus clerder uhella cavadow.',
+'svg-long-desc' => 'Restren SVG, $1 × $2 pixel yn hanow, mens an restren: $3',
+'show-big-image' => 'Clerder leun',
 
 # Special:NewFiles
-'ilsubmit' => 'Hwilas',
+'ilsubmit' => 'Whilas',
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => "Yma dhe'n restren-ma kedhlow keworansel, dres lycklod keworrys dhyworth an kamera besyel po an skanyer usys rag hy gwruthyl po hy besya. Mar veu an folen chanjys dhyworth hy studh gwredhek, possybyl yw na veu radn a'n manylyon-ma nowedhys.",
-'metadata-expand' => 'Diskwedhes manylyon ystydnys',
-'metadata-collapse' => 'Kudha manylyon ystydnys',
+'metadata-help' => "Yma dhe'n restren-ma kedhlow keworansel, dres lycklod keworrys dhyworth an camera besyel po an scanyer usys rag hy gwruthyl po hy besya. Mars yw chanjys an restren dhyworth hy studh gwredhek, possybyl yw na veu nebes manylyon nowedhys.",
+'metadata-expand' => 'Disqwedhes manylyon ystynnys',
+'metadata-collapse' => 'Cudha manylyon ystynnys',
 
 # EXIF tags
 'exif-imagewidth' => 'Les',
@@ -1063,8 +1213,17 @@ Y hellir gweles hy fednfenten.',
 
 'exif-meteringmode-255' => 'Aral',
 
+'exif-contrast-0' => 'Usadow',
 'exif-contrast-1' => 'Medhel',
-'exif-contrast-2' => 'Kales',
+'exif-contrast-2' => 'Cales',
+
+'exif-saturation-0' => 'Usadow',
+
+'exif-sharpness-0' => 'Usadow',
+'exif-sharpness-1' => 'Medhes',
+'exif-sharpness-2' => 'Cales',
+
+'exif-subjectdistancerange-0' => 'Ancoth',
 
 # External editor support
 'edit-externally' => 'Chanjya an restren-ma dre dowlen a-ves',
@@ -1073,24 +1232,58 @@ Y hellir gweles hy fednfenten.',
 'watchlistall2' => 'oll',
 'namespacesall' => 'oll',
 'monthsall' => 'oll',
+'limitall' => 'oll',
+
+# E-mail address confirmation
+'confirmemail' => 'Afydhya an drigva ebost',
+'confirmemail_noemail' => "Nyns eus trigva ebost da settyes y'gas [[Special:Preferences|dowisyansow devnydhyer]].",
 
 # Multipage image navigation
 'imgmultipageprev' => '← folen kens',
 'imgmultipagenext' => 'folen nessa →',
-'imgmultigo' => 'Ke!',
+'imgmultigo' => 'Mos!',
 
 # Table pager
 'table_pager_limit_submit' => 'Mos',
 
 # Auto-summaries
+'autosumm-blank' => 'Gwakhes an folen',
 'autoredircomment' => 'Daswedyas an folen war-tu [[$1]]',
 'autosumm-new' => "Folen formyes gans: '$1'",
 
+# Live preview
+'livepreview-loading' => 'Ow carga...',
+'livepreview-ready' => 'Ow carga... Parys!',
+
+# Watchlist editor
+'watchlistedit-noitems' => "Nyns eus titel veth y'gas rol golyas.",
+'watchlistedit-normal-title' => 'Chanjya an rol golyas',
+'watchlistedit-normal-legend' => 'Dilea titlys dhyworth agas rol golyas',
+'watchlistedit-normal-explain' => 'Yma disqwedhys a-woles titlys war agas rol golyas.
+Rag dilea titel, checkyowgh an gisten rebdho, ha clyckyowgh "{{int:Watchlistedit-normal-submit}}".
+Why a yll [[Special:EditWatchlist/raw|chanjya restren an rol golyas]] ynwedh.',
+'watchlistedit-normal-submit' => 'Dilea titlys',
+'watchlistedit-normal-done' => 'Diles veu {{PLURAL:$1|$1 titel}} dhyworth agas rol golyas',
+'watchlistedit-raw-title' => 'Chanjya restren an rol golyas',
+'watchlistedit-raw-legend' => 'Chanjya restren an rol golyas',
+'watchlistedit-raw-explain' => 'Yma disqwedhys a-woles titlys war agas rol golyas, hag y hyllir hy chanjya dre geworra dhedhy ha dilea dhyworty;
+unn ditel war linen.
+Pan vo diwedh dhywgh, clyckyowgh "{{int:Watchlistedit-raw-submit}}".
+Why a yll [[Special:EditWatchlist|usya an janjyel usadow]] ynwedh.',
+'watchlistedit-raw-titles' => 'Titlys:',
+'watchlistedit-raw-submit' => 'Nowedhy an rol golyas',
+'watchlistedit-raw-done' => 'Nowedhys re beu agas rol golyas.',
+'watchlistedit-raw-added' => 'Keworrys veu {{PLURAL:$1|$1 titel}}:',
+'watchlistedit-raw-removed' => 'Diles veu {{PLURAL:$1|$1 titel}}:',
+
 # Watchlist editing tools
 'watchlisttools-view' => 'Gweles chanjyow longus',
 'watchlisttools-edit' => 'Gweles ha chanjya an rol golyas',
 'watchlisttools-raw' => 'Chanjya restren an rol golyas',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kescows]])',
+
 # Special:Version
 'version' => 'Versyon',
 'version-other' => 'Aral',
@@ -1100,13 +1293,29 @@ Y hellir gweles hy fednfenten.',
 'filepath-page' => 'Restren:',
 
 # Special:FileDuplicateSearch
-'fileduplicatesearch-filename' => 'Hanow-restren:',
-'fileduplicatesearch-submit' => 'Hwilas',
+'fileduplicatesearch-filename' => 'Hanow an restren:',
+'fileduplicatesearch-submit' => 'Whilas',
 
 # Special:SpecialPages
-'specialpages' => 'Folednow arbednek',
+'specialpages' => 'Folennow arbennek',
+'specialpages-group-login' => 'Omgelmy / formya acont',
+
+# Special:BlankPage
+'blankpage' => 'Folen wag',
 
 # Special:Tags
 'tags-edit' => 'chanjya',
 
+# Database error messages
+'dberr-header' => "Yma cudyn dhe'n wiki-ma",
+'dberr-problems' => "Drog yw genen!
+Yma caletter teknogel dhe'n wiasva-ma.",
+'dberr-again' => 'Assayowgh gortos pols ha dascarga.',
+'dberr-info' => '(Ny yllir kestava orth servyer an database: $1)',
+'dberr-usegoogle' => 'Why a yll assaya whilas dre Google.',
+
+# Search suggestions
+'searchsuggest-search' => 'Whilas',
+'searchsuggest-containing' => 'ynno...',
+
 );
index 726c146..2dc8f29 100644 (file)
@@ -11,6 +11,7 @@
  * @author Aidabishkek
  * @author Amire80
  * @author Chorobek
+ * @author Growingup
  * @author Muratjumashev
  * @author Ztimur
  */
@@ -39,14 +40,15 @@ $messages = array(
 'tog-showtoolbar' => 'Оңдоо учурунда аспаптар тактасын көрсөтүү (JavaScript талап кылынат)',
 'tog-editondblclick' => 'Эки басып баракты оңдоо (JavaScript талап кылынат)',
 'tog-editsection' => 'Ар бир секция үчүн «оңдоо» шилтемеси',
+'tog-oldsig' => 'Кезектеги кол:',
 
-'underline-always' => 'Дайым',
+'underline-always' => 'Дайыма',
 'underline-never' => 'Эч качан',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Оңдоо талаасынын арибинин стили:',
-'editfont-default' => 'СеÑ\80епÑ\87инин Ð°Ñ\80ибин ÐºÐ¾Ð»Ð´Ð¾Ð½',
-'editfont-monospace' => 'Моножазы ариби',
+'editfont-default' => 'Ð\91Ñ\80аÑ\83зеÑ\80дин Ñ\88Ñ\80иÑ\84Ñ\82и',
+'editfont-monospace' => 'Моножазы шрифт',
 
 # Dates
 'sunday' => 'Жекшемби',
@@ -56,13 +58,13 @@ $messages = array(
 'thursday' => 'Бейшемби',
 'friday' => 'Жума',
 'saturday' => 'Ишемби',
-'sun' => 'Жкшмб',
-'mon' => 'Дшмб',
-'tue' => 'Шшмб',
-'wed' => 'Шршмб',
-'thu' => 'Бшмб',
+'sun' => 'Жк',
+'mon' => 'Дш',
+'tue' => 'Ше',
+'wed' => 'Ша',
+'thu' => 'Бш',
 'fri' => 'Жм',
-'sat' => 'Ишмб',
+'sat' => 'Иш',
 'january' => 'Январь (Үчтүн айы)',
 'february' => 'Февраль (Бирдин айы)',
 'march' => 'Март (Жалган куран)',
@@ -111,7 +113,7 @@ $messages = array(
 'category-subcat-count' => '{{PLURAL:$2|Бул категория төмөнкү көмөк категорияны камтыйт.|Бул категорияда жалпы $2, {{PLURAL:$1|көмөк категория|$1 көмөк категория}} бар.}}',
 'category-subcat-count-limited' => 'Бул категорияда {{PLURAL:$1|$1|$1|$1}} ички категория бар.',
 'category-article-count' => '{{PLURAL:$2|Бул категория төмөнкү баракты камтыйт.|Бул категорияда жалпы $2, төмөнкү {{PLURAL:$1|барак|$1 барак}} бар.}}',
-'category-article-count-limited' => 'Бул категорияда $1 барак бар.',
+'category-article-count-limited' => 'Бул категорияда {{PLURAL:$1|$1 барак}} бар.',
 'category-file-count' => '{{PLURAL:$2|Бул категория төмөнкү файлды камтыйт.|Бул категорияда жалпы $2, төмөнкү {{PLURAL:$1|файл|$1 файл}} бар.}}',
 'category-file-count-limited' => 'Бул категорияда {{PLURAL:$1|$1|$1|$1}} файл бар.',
 'listingcontinuesabbrev' => 'уланд.',
@@ -122,75 +124,75 @@ $messages = array(
 'about' => 'Тууралуу',
 'article' => 'Макала',
 'newwindow' => '(жаңы терезеде ачылат)',
-'cancel' => 'Жокко чыгар',
+'cancel' => 'Жокко чыгаруу',
 'moredotdotdot' => 'Уландысы...',
-'mypage' => 'Ð\91аÑ\80агÑ\8bм',
-'mytalk' => 'ТалкÑ\83Ñ\83лаÑ\80Ñ\8bм',
+'mypage' => 'Ð\91аÑ\80ак',
+'mytalk' => 'ТалкÑ\83Ñ\83лоо',
 'anontalk' => 'Бул IP дарек үчүн талкуу',
-'navigation' => 'Ð\91агÑ\8bÑ\82 Ð°Ð»Ñ\83Ñ\83',
+'navigation' => 'Ð\9dавигаÑ\86иÑ\8f',
 'and' => '&#32;жана',
 
 # Cologne Blue skin
-'qbfind' => 'Ð\98зде',
-'qbbrowse' => 'СеÑ\80еп Ñ\81ал',
+'qbfind' => 'ТабÑ\83Ñ\83',
+'qbbrowse' => 'Ð\9aаÑ\80ап Ñ\87Ñ\8bгÑ\83Ñ\83',
 'qbedit' => 'Оңдоо',
 'qbpageoptions' => 'Бул барак',
-'qbpageinfo' => 'Контекст',
 'qbmyoptions' => 'Барактарым',
 'qbspecialpages' => 'Атайын барактар',
 'faq' => 'КБС',
 'faqpage' => 'Project:КБС',
 
 # Vector skin
-'vector-action-addsection' => 'Тема ÐºÐ¾Ñ\88Ñ\83мÑ\87ала',
-'vector-action-delete' => 'Өчүр',
-'vector-action-move' => 'Аталышын өзгөрт',
-'vector-action-protect' => 'Корго',
+'vector-action-addsection' => 'Тема ÐºÐ¾Ñ\88Ñ\83мÑ\87алоо',
+'vector-action-delete' => 'Өчүрүү',
+'vector-action-move' => 'Аталышын өзгөртуу',
+'vector-action-protect' => 'Коргоо',
 'vector-action-undelete' => 'Калыбына келтирүү',
 'vector-action-unprotect' => 'Коргоону өзгөртүү',
-'vector-view-create' => 'Ð\91аÑ\88Ñ\82а',
-'vector-view-edit' => 'Оңдо',
-'vector-view-history' => 'ТаÑ\80Ñ\8bÑ\85Ñ\8bн ÐºÐ°Ñ\80а',
-'vector-view-view' => 'Оку',
-'vector-view-viewsource' => 'Ð\9aайнаÑ\80Ñ\8bн ÐºÐ°Ñ\80а',
+'vector-view-create' => 'Ð\96аÑ\80аÑ\82Ñ\83Ñ\83',
+'vector-view-edit' => 'Оңдоо',
+'vector-view-history' => 'ТаÑ\80Ñ\8bÑ\85Ñ\8bн ÐºÐ°Ñ\80оо',
+'vector-view-view' => 'Окуу',
+'vector-view-viewsource' => 'Ð\9aайнаÑ\80Ñ\8bн ÐºÐ°Ñ\80оо',
 'actions' => 'Аракеттер',
 'namespaces' => 'Аталыш топтому',
 'variants' => 'Варианттар',
 
+'navigation-heading' => 'Навигация менюсу',
 'errorpagetitle' => 'Ката',
-'returnto' => '$1 барагына кайт.',
+'returnto' => '$1 барагына кайтуу.',
 'tagline' => '{{SITENAME}} дан',
 'help' => 'Жардам',
-'search' => 'Изде',
-'searchbutton' => 'Изде',
-'go' => 'Таап бер',
+'search' => 'Издөө',
+'searchbutton' => 'Издөө',
+'go' => 'Өтүү',
 'searcharticle' => 'Алга',
 'history' => 'Барактын тарыхы',
-'history_short' => 'Тарыхы',
+'history_short' => 'Тарых',
 'printableversion' => 'Басма үлгүсү',
 'permalink' => 'Туруктуу шилтеме',
 'print' => 'Басып чыгаруу',
 'view' => 'Кароо',
 'edit' => 'Оңдоо',
-'create' => 'Ð\91аÑ\88Ñ\82а',
-'editthispage' => 'Бул баракты оңдо',
+'create' => 'Ð\96аÑ\80аÑ\82Ñ\83Ñ\83',
+'editthispage' => 'Бул баракты оңдоо',
 'create-this-page' => 'Бул баракты түзүү',
 'delete' => 'Өчүрүү',
-'deletethispage' => 'Бул баракты өчүрүп кой',
+'deletethispage' => 'Бул баракты өчүрүү',
 'protect' => 'Коргоо',
-'protect_change' => 'өзгөрт',
+'protect_change' => 'өзгөртүү',
 'protectthispage' => 'Бул баракты коргоо',
 'unprotect' => 'Коргоону өзгөртүү',
 'newpage' => 'Жаңы барак',
 'talkpage' => 'Бул баракты талкууга алуу',
-'talkpagelinktext' => 'Талкуу',
+'talkpagelinktext' => 'талкуулоо',
 'specialpage' => 'Атайын барак',
 'personaltools' => 'Жеке аспаптар',
 'postcomment' => 'Жаңы бөлүм',
 'articlepage' => 'Макаланы кароо',
-'talk' => 'Талкуу',
+'talk' => 'Талкуулоо',
 'views' => 'Көрсөтүүлөр',
-'toolbox' => 'Аспап кутусу',
+'toolbox' => 'Аспаптар',
 'userpage' => 'Катышуучунун барагын кароо',
 'projectpage' => 'Долбоор барагын кароо',
 'imagepage' => 'Файлдын барагын кароо',
@@ -205,9 +207,10 @@ $messages = array(
 'lastmodifiedat' => 'Бул барак соңку жолу $1, $2 өзгөртүлгөн.',
 'viewcount' => 'Бул барак {{PLURAL:$1|$1|$1}} жолу ачылды.',
 'protectedpage' => 'Корголгон барак',
-'jumpto' => 'Атта:',
+'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}} тууралуу',
@@ -219,28 +222,32 @@ $messages = array(
 'disclaimerpage' => 'Project:Жалпы жоопкерчиликтен баш тартуу',
 'edithelp' => 'Оңдоого жардам',
 'edithelppage' => 'Help:Оңдоо',
-'helppage' => 'Help:Мазмуну',
+'helppage' => 'Help:Мазмун',
 'mainpage' => 'Башбарак',
 'mainpage-description' => 'Башбарак',
+'policy-url' => 'Project:Эрежелер',
 'portal' => 'Жамаат порталы',
 'portal-url' => 'Project:Жамаат порталы',
 'privacy' => 'Маалыматты купуя сактоо саясаты',
 'privacypage' => 'Project:Маалыматты купуя сактоо саясаты',
 
+'badaccess' => 'Кирүү катасы',
+
+'ok' => 'OK',
 'retrievedfrom' => '"$1" булагындан алынды',
 'youhavenewmessages' => 'Сизге $1 ($2) бар.',
 'newmessageslink' => 'жаңы билдирүүлөр',
 'newmessagesdifflink' => 'соңку өзгөрүү',
 'youhavenewmessagesmulti' => 'Сизге $1 жаңы кат бар.',
-'editsection' => 'оңдо',
-'editold' => 'оңдо',
+'editsection' => 'оңдоо',
+'editold' => 'оңдоо',
 'viewsourceold' => 'байкоо',
-'editlink' => 'оңдо',
+'editlink' => 'оңдоо',
 'viewsourcelink' => 'Байкоо',
-'editsectionhint' => '$1 бөлүмүн оңдо',
-'toc' => 'Мазмуну',
-'showtoc' => 'Ð\9aÓ©Ñ\80Ñ\81Ó©Ñ\82',
-'hidetoc' => 'Жашыр',
+'editsectionhint' => '$1 бөлүмүн оңдоо',
+'toc' => 'Мазмун',
+'showtoc' => 'көÑ\80Ñ\81Ó©Ñ\82Ò¯Ò¯',
+'hidetoc' => 'Жашыруу',
 'site-rss-feed' => '$1 RSS тилкеси',
 'site-atom-feed' => '$1 Atom агымы',
 'page-atom-feed' => '"$1" Atom агымы',
@@ -249,16 +256,18 @@ $messages = array(
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Макала',
 'nstab-user' => 'Колдонуучунун барагы',
+'nstab-media' => 'Мультимедиа',
 'nstab-special' => 'Атайын барак',
 'nstab-project' => 'Долбоордун барагы',
 'nstab-image' => 'Файл',
-'nstab-mediawiki' => 'Билдирүү',
-'nstab-template' => 'Ð\9aалÑ\8bп',
+'nstab-mediawiki' => 'Билдирме',
+'nstab-template' => 'Шаблон',
 'nstab-help' => 'Жардам',
 'nstab-category' => 'Категория',
 
 # General errors
-'error' => 'Жаңылыш',
+'error' => 'Ката',
+'databaseerror' => 'Маалымат базасынын катасы',
 'missing-article' => 'Табылууга тийиш «$1» $2 деп аталган баракта текст маалыматтар базасында табылган жок.
 
 Бул сыяктуу абал өчүрүлгөн барактын өзгөрүүлөрдүн тарыхына эски шилтеме менен өткөндө учурайт.
@@ -272,7 +281,7 @@ $messages = array(
 'filecopyerror' => '"$1" файлы "$2" файлына көчүрүлбөдү.',
 'filedeleteerror' => '"$1" файлын өчүрүүгө болбоду.',
 'directorycreateerror' => '"$1" каталогун түзүүгө болбоду.',
-'filenotfound' => '"$1" файлы табылбады.',
+'filenotfound' => '"$1" файлын табууга мүмкүн эмес.',
 'fileexistserror' => '"$1" файлына жазууга болбоду: Мурдатан бар.',
 'unexpected' => 'Күтүлбөгөн маани: "$1"="$2".',
 'formerror' => 'Ката: Форманы жөнөтүүгө болбоду.',
@@ -281,13 +290,13 @@ $messages = array(
 'badtitle' => 'Ыксыз аталыш',
 'badtitletext' => 'Талап кылынган барак аталышы туура эмес, бош, же тилдер-аралык же уики-аралык аталышы туура эмес шилтемеленген.
 Балким аталышта колдонулбай турган бир же андан көп белги камтылган.',
-'viewsource' => 'Кайнарын кара',
+'viewsource' => 'Кароо',
 
-# Login and logout pages
-'welcomecreation' => '== Кош келиңиз, $1! ==
+# Virus scanner
+'virus-unknownscanner' => 'белгисиз антивирус:',
 
-Сиз катоодон өттүңүз. {{SITENAME}} түзөө киргизүүнү унутпаңыз.',
-'yourname' => 'Колдонуучунун аты',
+# Login and logout pages
+'yourname' => 'Колдонуучу аты',
 'yourpassword' => 'Сырсөз',
 'yourpasswordagain' => 'Сырсөздү кайра жазыңыз',
 'remembermypassword' => 'Бул браузерде каттоо маалыматтарымды эске тут (эң көп $1 {{PLURAL:$1|күн|күн}})',
@@ -300,9 +309,9 @@ $messages = array(
 'logout' => 'Чыгуу',
 'userlogout' => 'Чыгуу',
 'notloggedin' => 'Сиз системага кире элексиз',
-'nologin' => 'Ð\9aаÑ\82Ñ\82ала элексизби? $1.',
-'nologinlink' => 'Ð\9aаÑ\82Ñ\82оонÑ\83 Ð±Ð°Ñ\88Ñ\82а',
-'createaccount' => 'Ð\96аңÑ\8b ÐºÐ¾Ð»Ð´Ð¾Ð½Ñ\83Ñ\83Ñ\87Ñ\83нÑ\83 ÐºÐ°Ñ\82Ñ\82а',
+'nologin' => 'Ð\9aаÑ\82Ñ\82ай элексизби? $1.',
+'nologinlink' => 'Ð\9aаÑ\82Ñ\82оонÑ\83 Ð±Ð°Ñ\88Ñ\82оо',
+'createaccount' => 'ЭÑ\81еп Ð¶Ð°Ð·Ñ\83Ñ\83Ñ\81Ñ\83н Ð¶Ð°Ñ\80аÑ\82Ñ\83Ñ\83',
 'gotaccount' => 'Катталгансызбы? $1.',
 'gotaccountlink' => 'Кирүү',
 'userlogin-resetlink' => 'Кирүүчү маалыматарыңызды унутуп калдыңызбы?',
@@ -315,28 +324,52 @@ $messages = array(
 'loginsuccesstitle' => 'Сиз ийгиликтүү кирдиңиз',
 'wrongpassword' => 'Ката сырсөз киргизилди. Кайтадан аракет кылып көрүңүз.',
 'wrongpasswordempty' => 'Сырсөз киргизилген жок. Кайтадан аракет кылып көрүңүз.',
-'mailmypassword' => 'Жаңы сырсөздү электрондук дарекке жибер',
+'mailmypassword' => 'Жаңы сырсөздү e-mail аркылуу жиберүү',
 'emailconfirmlink' => 'Электрондук дарегиңизди ырастаңыз',
-'accountcreated' => 'Ð\9aаÑ\82Ñ\82алды',
+'accountcreated' => 'ЭÑ\81еп Ð¶Ð°Ð·Ñ\83Ñ\83Ñ\81Ñ\83 Ð¶Ð°Ñ\80аÑ\82Ñ\8bлды',
 'loginlanguagelabel' => 'Тил: $1',
 
 # Change password dialog
+'resetpass' => 'Сырсөздү өзгөртүү',
+'resetpass_header' => 'Эсеп жазуусунун сырсөзүн өзгөртүү',
 'oldpassword' => 'Эски сырсөз:',
 'newpassword' => 'Жаңы сырсөз:',
+'retypenew' => 'Жаңы сырсөздү кайта киргизиңиз:',
+'resetpass_forbidden' => 'Сырсөздү өзгөртүүгө мүмкүн эмес',
+'resetpass-submit-loggedin' => 'Сырсөздү өзгөртүү',
+'resetpass-submit-cancel' => 'Жокко чыгаруу',
+'resetpass-temp-password' => 'Убактылуу сырсөз:',
+
+# Special:PasswordReset
+'passwordreset' => 'Сырсөздү түшүрүү',
+'passwordreset-legend' => 'Сырсөздү түшүрүү',
+'passwordreset-username' => 'Колдонуучу аты:',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-email' => 'E-mail дарек:',
+'passwordreset-emailelement' => 'Колдонуучу аты: $1
+Убактылуу сырсөз: $2',
+
+# Special:ChangeEmail
+'changeemail' => 'E-mail даректи өзгөртүү',
+'changeemail-oldemail' => 'Кезектеги e-mail дарек:',
+'changeemail-newemail' => 'Жаңы e-mail дарек:',
+'changeemail-none' => '(жок)',
+'changeemail-submit' => "E-mail'ди өзгөртүү",
+'changeemail-cancel' => 'Жокко чыгаруу',
 
 # Edit page toolbar
-'bold_sample' => 'Калың тамга',
-'bold_tip' => 'Калың тамга',
-'italic_sample' => 'Ð\96анÑ\82Ñ\8bк Ñ\82амга',
-'italic_tip' => 'Ð\96анÑ\82Ñ\8bк Ñ\82амга',
-'link_sample' => 'Шилтеменин аталышы',
+'bold_sample' => 'Кара текст',
+'bold_tip' => 'Кара текст',
+'italic_sample' => 'Ð\9aÑ\83Ñ\80Ñ\81ив Ñ\82екÑ\81Ñ\82',
+'italic_tip' => 'Ð\9aÑ\83Ñ\80Ñ\81ив Ñ\82екÑ\81Ñ\82',
+'link_sample' => 'Шилтеме аты',
 'link_tip' => 'Ички шилтеме',
 'extlink_sample' => 'http://www.example.com шилтеме аталышы',
 'extlink_tip' => 'Сырткы шилтемелерге (http:// префиксин койгонду унутпаңыз)',
-'headline_sample' => 'Аталыштын тексти',
+'headline_sample' => 'Ат тексти',
 'headline_tip' => '2-деңгээлдеги баш аты',
 'nowiki_sample' => 'Форматталбаган текстти бул жерге киргизиңиз',
-'nowiki_tip' => 'Уики-форматтоого көңүл бөлбө',
+'nowiki_tip' => 'Уики-форматтоого көңүл бурбоо',
 'image_tip' => 'Кыстарылган файл',
 'media_tip' => 'Файлга шилтеме',
 'sig_tip' => 'Кол тамгаңыз жана убакыт мөөрү',
@@ -345,16 +378,17 @@ $messages = array(
 # Edit pages
 'summary' => 'Кыска түшүндүрүү:',
 'minoredit' => 'Майда оңдоо',
-'watchthis' => 'Бул баракты көзөмөлдө',
-'savearticle' => 'Ð\91аÑ\80акÑ\82Ñ\8b Ñ\81акÑ\82ап ÐºÐ¾Ð¹',
+'watchthis' => 'Бул баракты көзөмөлдөө',
+'savearticle' => 'Ð\91аÑ\80акÑ\82Ñ\8b Ñ\81акÑ\82оо',
 'preview' => 'Алдын ала көрүү',
-'showpreview' => 'Алдын ала көрсөт',
+'showpreview' => 'Алдын ала көрсөтүү',
 'showlivepreview' => 'Ылдам карап чыгуу',
-'showdiff' => 'Өзгөртүүлөрдү көрсөт',
+'showdiff' => 'Өзгөртүүлөрдү көрсөтүү',
 'anoneditwarning' => "'''Эскертүү:''' Сиз каттоодон өткөн жоксуз.
 IP дарегиңиз бул барактын оңдоо тарыхына жазылат.",
+'blockedtitle' => 'Катышуучу тосмолонгон',
 'blockedtext' => 'Сиздин колдонуучу атыңыз же IP дарегиңиз тосмолонгон',
-'blockednoreason' => 'себеби көрсөтүлгөн эмес',
+'blockednoreason' => 'себеби көрсөтүлгөн жок',
 'loginreqtitle' => 'Колдонуучунун аты талап кылынат',
 'loginreqlink' => 'Кирүү',
 'accmailtitle' => 'Сырсөз жөнөтүлдү.',
@@ -371,6 +405,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 Сиз башка барактардан [[Special:Search/{{PAGENAME}}|ушул аталыш менен баракты издөө]] салып,
 же <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тийиштүү жазууларды таба аласыз]</span>.',
 'userpage-userdoesnotexist' => '"$1" Мындай колдонуучу катталган эмес. Ушул баракты түзүүнү же оңдогонду каалганыңыз анык болсун',
+'updated' => '(Жаңыртылды)',
 'previewnote' => "'''Бул алдын ала көрүнүшү гана болгонун эсиңизге алыңыз.'''
 Өзгөртүүлөрүңүз сактала элек!",
 'continue-editing' => 'Өзгөртүүүлөрдү улантабыз',
@@ -395,6 +430,10 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'edit-conflict' => 'Өзгөртүүлөрдүн конфликти',
 'edit-already-exists' => 'Жаңы барак түзүү мүмкүн эмес. Мындай барак бар',
 
+# Content models
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Эскертүү:''' Камтылган калыптардын өлчөмү өтө чоң.
 Кээ бир калыптар камтылбайт.",
@@ -405,7 +444,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'parser-template-loop-warning' => 'Калыптарда айланма бар:[[$1]]',
 
 # History pages
-'viewpagelogs' => 'Бул барак үчүн тизмелерди кара',
+'viewpagelogs' => 'Бул барак үчүн журналды көрсөтүү',
 'nohistory' => 'Бул барактын өзгөртүүлөр тарыхы жок',
 'currentrev' => 'Акыркы версиясы',
 'currentrev-asof' => '$1 -га соңку версиясы',
@@ -421,7 +460,7 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'page_last' => 'акыркы',
 'histlegend' => "Айырмаларды тандоо: Салыштырыла турган версияларлын тушундагы тегеректерди белгилеп туруп \"Enter\"-ди же астындагы баскычты бас.<br />
 Түшүндүрүү: '''({{int:cur}})''' = соңку версиясынан айырма, '''({{int:last}})''' = мурунку версиясынан айырма, '''{{int:minoreditletter}}''' = майда оңдоо.",
-'history-fieldset-title' => 'ТаÑ\80Ñ\8bÑ\85Ñ\8bн ÐºÐ°Ñ\80а',
+'history-fieldset-title' => 'ТаÑ\80Ñ\8bÑ\85Ñ\8bн ÐºÐ°Ñ\80оо',
 'history-show-deleted' => 'Өчүрүлгөндөрдү гана',
 'histfirst' => 'Эң эски',
 'histlast' => 'Соңку',
@@ -432,95 +471,145 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'history-feed-item-nocomment' => '$1, $2 карата',
 
 # Revision deletion
-'rev-delundel' => 'көрсөт/жашыр',
-'rev-showdeleted' => 'көрсөт',
-'revdel-restore' => 'көрүнүшүн өзгөрт',
+'rev-delundel' => 'көрсөтүү/жашыруу',
+'rev-showdeleted' => 'көрсөтүү',
+'revdel-restore' => 'көрүнүшүн өзгөртүү',
 'revdel-restore-deleted' => 'өчүрүлгөн версиялар',
 'revdel-restore-visible' => 'көрүнүүчү версиялары',
+'revdelete-reasonotherlist' => 'Башка себеп',
+'revdelete-offender' => 'Барак версиясынын автору:',
+
+# History merging
+'mergehistory-from' => 'Баштапкы барак:',
+'mergehistory-submit' => 'Версияларды бириктирүү',
+'mergehistory-reason' => 'Себеп',
 
 # Merge log
-'revertmerge' => 'Бөл',
+'revertmerge' => 'Бөлүү',
 
 # Diffs
 'history-title' => '"$1" өзгөрүүлөр тарыхы',
 'lineno' => '$1 -сап:',
-'compareselectedversions' => 'Тандалган версияларды салыштыр',
-'editundo' => 'жокко чыгар',
+'compareselectedversions' => 'Тандалган версияларды салыштыруу',
+'editundo' => 'жокко чыгаруу',
 'diff-multi' => '({{PLURAL:$2|колдонуучу|$2 колдонуучу}} тарабынан жасалган {{PLURAL:$1|аралык версия|$1 аралык версия}} көрсөтүлгөн жок)',
 
 # Search results
 'searchresults' => 'Издөө жыйынтыктары',
 'searchresults-title' => '"$1" үчүн издөө жыйынтыктары',
-'prevn' => 'мÑ\83Ñ\80Ñ\83нкÑ\83 {{PLURAL:$1|$1}}',
+'prevn' => 'абалкÑ\8b {{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) кара',
+'prevn-title' => 'Мурунку $1 {{PLURAL:$1|жыйынтык}}',
+'nextn-title' => 'Кийинки $1 {{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:Мазмун',
 'searchprofile-articles' => 'Негизги барактар',
-'searchprofile-project' => 'Ð\96аÑ\80дам Ð¶Ð°Ð½Ð° Ð\94олбоор барактары',
+'searchprofile-project' => 'Ð\96аÑ\80дам Ð¶Ð°Ð½Ð° Ð´олбоор барактары',
 'searchprofile-images' => 'Мултимедиа',
 'searchprofile-everything' => 'Баары',
 'searchprofile-advanced' => 'Кеңейтилген',
-'searchprofile-articles-tooltip' => '$1 -де изде',
-'searchprofile-project-tooltip' => '$1 -де изде',
-'searchprofile-images-tooltip' => 'Файлдарды изде',
-'searchprofile-everything-tooltip' => 'Бардык барактарда (талкуу барактарды кошо) изде',
-'searchprofile-advanced-tooltip' => 'Ð\91елгиленген Ð°Ñ\82алÑ\8bÑ\88 Ñ\82опÑ\82омдоÑ\80Ñ\83нда Ð¸Ð·Ð´Ðµ',
+'searchprofile-articles-tooltip' => '$1 -де издөө',
+'searchprofile-project-tooltip' => '$1 -де издөө',
+'searchprofile-images-tooltip' => 'Файлдарды издөө',
+'searchprofile-everything-tooltip' => 'Баардык барактардан (талкуу барактарды кошо) издөө',
+'searchprofile-advanced-tooltip' => 'Ð\91елгиленген Ð°Ñ\82алÑ\8bÑ\88 Ñ\82опÑ\82омдоÑ\80Ñ\83нан Ð¸Ð·Ð´Ó©Ó©',
 'search-result-size' => '$1 ({{PLURAL:$2|1 сөз|$2 сөз}})',
 'search-result-category-size' => '{{PLURAL:$1|1 мүчө|$1 мүчө}} ({{PLURAL:$2|1 көмөк категория|$2 көмөк категория}}, {{PLURAL:$3|1 файл|$3 файл}})',
 'search-redirect' => '($1 кайра багыттоо)',
 'search-section' => '($1 бөлүмү)',
 'search-suggest' => 'Ушуну кааладыңызбы: $1',
-'search-mwsuggest-enabled' => 'сунуштар менен',
-'search-mwsuggest-disabled' => 'сунушсуз',
 'searchrelated' => 'байланыштуу',
 'searchall' => 'баары',
 'showingresultsheader' => "'''$4''' үчүн {{PLURAL:$5|'''$3''' жыйынтыктан '''$1'''-и|'''$1 - $2''' -дан '''$3''' жыйынтык}}",
 'search-nonefound' => 'Талапка төп маалымат табылган жок.',
-'powersearch' => 'Издөө',
-'powersearch-legend' => 'Кеңиртип изде',
+'powersearch' => 'Кеңейтилген издөө',
+'powersearch-legend' => 'Кеңейтилген издөө',
+'powersearch-toggleall' => 'Баары',
+'powersearch-togglenone' => 'Эчтеке',
+
+# Quickbar
+'qbsettings' => 'Навигация панели',
+'qbsettings-none' => 'Көрсөтпөө',
 
 # Preferences page
-'preferences' => 'Ыңгайлаштыруу',
-'mypreferences' => 'Ырастоолорум',
+'preferences' => 'Ырастоолор',
+'mypreferences' => 'Ырастоолор',
 'prefs-edits' => 'Өзгөртүүлөрдүн саны',
 'changepassword' => 'Сырсөздү өзгөртүү',
+'skin-preview' => 'Алдын ала көрүү',
 'prefs-datetime' => 'Дата жана убакыт',
+'prefs-user-pages' => 'Катышуучунун барактары',
 'prefs-rc' => 'Соңку өзгөрүүлөр',
-'prefs-watchlist' => 'Байкоо тизме',
-'saveprefs' => 'Сактап кой',
-'prefs-editing' => 'Оңдоо',
+'prefs-watchlist' => 'Байкоо тизмеси',
+'prefs-resetpass' => 'Сырсөздү өзгөртүү',
+'saveprefs' => 'Сактоо',
+'prefs-editing' => 'Редакторлоо',
 'searchresultshead' => 'Издөө',
 'localtime' => 'Жергиликтүү убакыт',
+'servertime' => 'Сервер убагы:',
+'timezoneregion-africa' => 'Африка',
+'timezoneregion-america' => 'Америка',
+'timezoneregion-antarctica' => 'Антарктика',
+'timezoneregion-arctic' => 'Арктика',
+'timezoneregion-asia' => 'Азия',
+'timezoneregion-atlantic' => 'Атлантика океаны',
+'timezoneregion-australia' => 'Австралия',
+'timezoneregion-europe' => 'Европа',
+'timezoneregion-indian' => 'Индий океаны',
+'timezoneregion-pacific' => 'Тынч океаны',
+'prefs-searchoptions' => 'Издөө',
+'default' => 'жарыяланбасча',
 'prefs-files' => 'Файлдар',
 'youremail' => 'Электрондук дарек:',
-'username' => 'Ð\9aолдонуучунун аты:',
+'username' => 'Ð\9aаÑ\82Ñ\8bÑ\88уучунун аты:',
 'uid' => 'Колдонуучунун ID си:',
 'yourrealname' => 'Анык атыңыз:',
 'yourlanguage' => 'Тил:',
 'yourvariant' => 'Вариант:',
-'yournick' => 'Такма атыңыз:',
+'yournick' => 'Жаңы колуңуз:',
+'yourgender' => 'Жыныс:',
+'gender-male' => 'Эркек',
+'gender-female' => 'Аял',
+'email' => 'Электрондук дарек',
 'prefs-help-email' => 'Электрондук дарек милдетүү эмес, бирок сырсөздү унутуп калсаңыз ал сырсөздү жиберүүгө керек.',
 'prefs-help-email-others' => 'Ошондой эле башкалар сиз менен колдонуучу же талкуу барактарыңыздагы шилтеме аркылуу байланыш түзүүгө уруксат берүүнү тандай аласыз.
 Электрондук дарегиңиз башка кодонуучуларга байланыш түзгөндө көрүнбөйт.',
-'prefs-advancedediting' => 'Кеңейтилген',
-'prefs-advancedrc' => 'Кеңейтилген',
-'prefs-advancedrendering' => 'Кеңейтилген',
-'prefs-advancedsearchoptions' => 'Кеңейтилген',
-'prefs-advancedwatchlist' => 'Кеңейтилген',
-'prefs-displayrc' => 'Көрсөтүүнү тууралоо',
+'prefs-info' => 'Негизги маалыматтары',
+'prefs-dateformat' => 'Дата форматы',
+'prefs-advancedediting' => 'Кеңейтилген ырастоолор',
+'prefs-advancedrc' => 'Кеңейтилген ырастоолор',
+'prefs-advancedrendering' => 'Кеңейтилген ырастоолор',
+'prefs-advancedsearchoptions' => 'Кеңейтилген ырастоолор',
+'prefs-advancedwatchlist' => 'Кеңейтилген ырастоолор',
+'prefs-displayrc' => 'Көрсөтүүнүн ырастоолору',
+
+# User rights
+'userrights-reason' => 'Себеп:',
 
 # Groups
 'group' => 'Топ:',
+'group-user' => 'Катышуучулар',
+'group-sysop' => 'Администраторлор',
 'group-bureaucrat' => 'Бюрократтар',
 
 'group-bureaucrat-member' => 'Бюрократ',
 
+# Rights
+'right-upload' => 'Файлдарды жүктөө',
+'right-delete' => 'Барактарды өчүрүү',
+
+# User rights log
+'rightsnone' => '(жок)',
+
 # Associated actions - in the sentence "You do not have permission to X"
-'action-edit' => 'бул баракты оңдо',
+'action-read' => 'бул баракты окуу',
+'action-edit' => 'бул баракты оңдоо',
+'action-createpage' => 'барактарды жаратуу',
+'action-delete' => 'бул баракты өчүрүү',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|өзгөрүү|өзгөрүү}}',
@@ -528,29 +617,29 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'recentchanges-legend' => 'Соңку өзгөртүүлөрдүн ырастоолору',
 'recentchanges-summary' => 'Уикидеги соңку өзгөрүүлөрдү ушул барактан көзөмөлдө.',
 'recentchanges-feed-description' => 'Ушул агымдагы уикидеги соңку өзгөрүүлөрдү көзөмөлдө.',
-'recentchanges-label-newpage' => 'Ð\91Ñ\83л Ð¾Ò£Ð´Ð¾Ð¾ Ð¶Ð°Ò£Ñ\8b Ð±Ð°Ñ\80акÑ\82Ñ\8b Ð°Ñ\87ты',
+'recentchanges-label-newpage' => 'Ð\91Ñ\83л Ð¾Ò£Ð´Ð¾Ð¾ Ð¶Ð°Ò£Ñ\8b Ð±Ð°Ñ\80акÑ\82Ñ\8b Ð¶Ð°Ñ\80аÑ\82ты',
 'recentchanges-label-minor' => 'Бул майда оңдоо',
 'recentchanges-label-bot' => 'Бул оңдоо бот тарабынан жасалды',
 'recentchanges-label-unpatrolled' => 'Бул оңдоо көзөмөлдөн өтө элек.',
 'rcnote' => "Ылдый жакта $5, $4 карата соңку {{PLURAL:$2|күндө|'''$2''' күндө}} жасалган {{PLURAL:$1| '''1''' өзгөрүү| '''$1''' өзгөрүү}}.",
 'rcnotefrom' => "'''$2''' -тан өзгөрүүлөр ылдый жакта ('''$1''' чейин көрсөтүлдү).",
-'rclistfrom' => '$1 күнүнөн баштап жаңы өзгөртүүлөрдү көрсөт',
+'rclistfrom' => '$1 күнүнөн баштап жаңы өзгөртүүлөрдү көрсөтүү',
 'rcshowhideminor' => 'Майда оңдоолорду $1',
 'rcshowhidebots' => 'ботторду $1',
 'rcshowhideliu' => '$1 катталган колдонуучу',
 'rcshowhideanons' => 'Жашыруун колдонуучулар $1',
 'rcshowhidepatr' => 'Көзөмөл алдындагы оңдоолорду $1',
 'rcshowhidemine' => 'Оңдоолорумду $1',
-'rclinks' => 'Соңку $2 кундө жасалган акыркы $1 өзгөртүүлөрдү көрсөт<br />$3',
+'rclinks' => 'Соңку $2 күндө жасалган акыркы $1 өзгөртүүлөрдү көрсөтүү<br />$3',
 'diff' => 'айырма',
-'hist' => 'тарыхы',
-'hide' => 'Жашыр',
-'show' => 'Көрсөт',
+'hist' => 'тарых',
+'hide' => 'Жашыруу',
+'show' => 'Көрсөтүү',
 'minoreditletter' => 'м',
 'newpageletter' => 'Ж',
 'boteditletter' => 'б',
-'rc-enhanced-expand' => 'Ð\91өлүкÑ\82Ó©Ñ\80үн ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82 (JavaScript талап кылынат)',
-'rc-enhanced-hide' => 'Ð\91өлүкÑ\82Ó©Ñ\80үн Ð¶Ð°Ñ\88Ñ\8bÑ\80',
+'rc-enhanced-expand' => 'Ð\9aоÑ\88Ñ\83мÑ\87а Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82Ñ\82аÑ\80дÑ\8b ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82Ò¯Ò¯ (JavaScript талап кылынат)',
+'rc-enhanced-hide' => 'Ð\9aоÑ\88Ñ\83мÑ\87а Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82Ñ\82аÑ\80дÑ\8b Ð¶Ð°Ñ\88Ñ\8bÑ\80Ñ\83Ñ\83',
 
 # Recent changes linked
 'recentchangeslinked' => 'Тиешелүү өзгөрүүлөр',
@@ -561,298 +650,397 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 'recentchangeslinked-summary' => 'Бул көрсөтүлгөн (же көрсөтүлгөн категорияга кирген) барактан шилтемеленген барактардагы жакын арада жасалган өзгөрүүлөрдүн тизмеси.
 [[Special:Watchlist|Байкоо тизмеңиз]]деги барактар калын арип менен белгиленген.',
 'recentchangeslinked-page' => 'Барактын аталышы',
-'recentchangeslinked-to' => 'Белгиленген барактан шилтемеленген барактардын ордуна өзгөртүулөрдү көрсөт',
+'recentchangeslinked-to' => 'Белгиленген барактан шилтемеленген барактардын ордуна өзгөртүулөрдү көрсөтүү',
 
 # Upload
-'upload' => 'Файл жүктөө',
-'uploadbtn' => 'Файл жүктөө',
+'upload' => 'Файлды жүктөө',
+'uploadbtn' => 'Файлды жүктөө',
+'uploaderror' => 'Жүктөө катасы',
+'uploadlog' => 'жүктөө журналы',
 'uploadlogpage' => 'Жүктөөлөрдүн тизмеси',
 'filedesc' => 'Кыска түшүндүрмө',
-'fileuploadsummary' => 'Кыска түшүндүрмө:',
+'fileuploadsummary' => 'Кыскача баяндама:',
 'uploadedfiles' => 'Жүктөлгөн файлдар',
-'savefile' => 'ФайлдÑ\8b Ñ\81акÑ\82ап ÐºÐ¾Ð¹',
+'savefile' => 'ФайлдÑ\8b Ñ\81акÑ\82оо',
 'uploadedimage' => '"[[$1]]" жүктөлдү',
+'upload-source' => 'Баштапкы файл',
+'upload-description' => 'Файл баяндамасы',
 'upload-success-subj' => 'Ийгиликтүү жүктөлдү',
 
+'upload-file-error' => 'Ички ката',
+'upload-unknown-size' => 'Белгисиз өлчөм',
+
+# File backend
+'backend-fail-closetemp' => 'Убактылуу файлды жабуу оңунан чыкпай жатат.',
+
+# HTTP errors
+'http-invalid-url' => 'Туура эмес URL: $1',
+
 'license' => 'Лицензиялоо:',
-'license-header' => 'Лицензиялоо:',
+'license-header' => 'Лицензиялоо',
 
 # Special:ListFiles
+'imgfile' => 'файл',
 'listfiles' => 'Файлдар тизмеси',
+'listfiles_date' => 'Дата',
+'listfiles_name' => 'Ат',
+'listfiles_user' => 'Катышуучу',
+'listfiles_size' => 'Өлчөм',
+'listfiles_description' => 'Баяндама',
+'listfiles_count' => 'Версиялар',
 
 # File description page
 'file-anchor-link' => 'Файл',
 'filehist' => 'Файлдын тарыхы',
 'filehist-help' => 'Файлдын ошол учурдагы көрүнүшүн кароо үчүн күнү/сааты бөлүмүнө басыңыз',
-'filehist-revert' => 'кайтарып ал',
-'filehist-current' => 'учурдагы',
-'filehist-datetime' => 'Күн/Саат',
-'filehist-thumb' => 'Кичирейтилген сүрөт',
+'filehist-deleteall' => 'баарын өчүрүү',
+'filehist-deleteone' => 'өчүрүү',
+'filehist-revert' => 'кайтаруу',
+'filehist-current' => 'кезектеги',
+'filehist-datetime' => 'Дата/Убакыт',
+'filehist-thumb' => 'Миниатюра',
 'filehist-thumbtext' => '$1 -дагы версиясы үчүн кичирейтилген сүрөтү',
 'filehist-user' => 'Катышуучу',
-'filehist-dimensions' => 'Өлчөмдөрү',
+'filehist-dimensions' => 'Өлчөмдөр',
+'filehist-filesize' => 'Файл өлчөмү',
 'filehist-comment' => 'Эскертүү',
-'imagelinks' => 'Файл пайдалануу',
+'filehist-missing' => 'Файл жок болот',
+'imagelinks' => 'Файлды колдонуу',
 'linkstoimage' => 'Бул файлга болгон {{PLURAL:$1|шилтеме|$1 шилтеме}} :',
 'nolinkstoimage' => 'Бул файлга шилтеме берген барак жок.',
 'sharedupload-desc-here' => 'Бул файл $1 -дан  жана башка долбоорлордо пайдаланылышы мүмкүн.
 Төмөндө анын [$2 файлды сыпаттоо барагы]нан сыпаттамасы көрсөтүлгөн.',
 
+# File reversion
+'filerevert-comment' => 'Себеп:',
+
+# File deletion
+'filedelete' => '$1 — өчүрүү',
+'filedelete-legend' => 'Файлды өчүрүү',
+'filedelete-comment' => 'Себеп:',
+'filedelete-submit' => 'Өчүрүү',
+
+# MIME search
+'download' => 'жүктөп алуу',
+
 # Unused templates
-'unusedtemplates' => 'Колдонулбаган нускалар',
-'unusedtemplateswlh' => 'Ð\91ашка шилтемелер',
+'unusedtemplates' => 'Колдонулбаган шаблондор',
+'unusedtemplateswlh' => 'башка шилтемелер',
 
 # Random page
 'randompage' => 'Тушкелди макала',
 
 # Statistics
 'statistics' => 'Статистика',
-'statistics-header-users' => 'Колдонуучулардын статистикасы',
+'statistics-header-users' => 'Катышуучулар боюнча статистика',
+'statistics-pages' => 'Барак',
 
 'disambiguationspage' => 'Template:көп маанилүү',
 
+'brokenredirects-edit' => 'оңдоо',
+'brokenredirects-delete' => 'өчүрүү',
+
+'withoutinterwiki-submit' => 'Көрсөтүү',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|байт|байт}}',
 'nmembers' => '$1{{PLURAL:$1|мүчө|мүчө}}',
 'unusedcategories' => 'Колдонулбаган категориялар',
 'unusedimages' => 'Колдонулбаган файлдар',
+'popularpages' => 'Популярдуу барактар',
 'prefixindex' => 'Префикс менен бардык барактар',
 'shortpages' => 'Кыска макалалар',
 'listusers' => 'Колдонуучулар тизмеси',
 'usercreated' => "$1 күнү $2'да {{GENDER:$3|катталды}}.",
 'newpages' => 'Жаңы барактар',
+'newpages-username' => 'Колдонуучу аты:',
 'ancientpages' => 'Эң эски барактар',
 'move' => 'Аталышын өзгөртүү',
+'movethispage' => 'Бул баракты ташуу',
 'pager-newer-n' => '{{PLURAL:$1|жаңыраак 1|жаңыраак $1}}',
 'pager-older-n' => '{{PLURAL:$1|эскирээк 1|эскирээк $1}}',
 
 # Book sources
 'booksources' => 'Китеп тууралуу маалыматтар',
-'booksources-search-legend' => 'Китеп тууралуу маалыматтарды изде',
-'booksources-go' => 'Ð\90лга',
+'booksources-search-legend' => 'Китеп тууралуу маалыматтарды издөө',
+'booksources-go' => 'ТабÑ\83Ñ\83',
 
 # Special:Log
-'specialloguserlabel' => 'Ð\9aолдонуучу:',
+'specialloguserlabel' => 'Ð\90Ñ\82каÑ\80уучу:',
 'speciallogtitlelabel' => 'Аталышы:',
-'log' => 'Тизмелер',
+'log' => 'Ð\96Ñ\83Ñ\80налдар',
 
 # Special:AllPages
 'allpages' => 'Бардык барактар',
 'alphaindexline' => '$1 -дан $2 чейин',
 'nextpage' => 'Кийинки барак ($1)',
-'allpagesfrom' => '-дан башталган барактарды көрсөт:',
-'allarticles' => 'Бардык макалалар',
-'allpagesprev' => 'Ð\9cÑ\83Ñ\80Ñ\83нкÑ\83',
+'allpagesfrom' => '-дан башталган барактарды көрсөтүү:',
+'allarticles' => 'Бүт барактар',
+'allpagesprev' => 'Ð\90балкÑ\8b',
 'allpagesnext' => 'Кийинки',
-'allpagessubmit' => 'Алга',
-'allpagesprefix' => '- префикси менен барактарды көрсөт',
+'allpagessubmit' => 'Аткаруу',
+'allpagesprefix' => '- префикси менен барактарды көрсөтүү',
 
 # Special:Categories
 'categories' => 'Категориялар',
 
 # Special:LinkSearch
+'linksearch-ok' => 'Издөө',
 'linksearch-line' => '$1-га $2-дан шилтеме берилди',
 
+# Special:ListUsers
+'listusers-submit' => 'Көрсөтүү',
+'listusers-noresult' => 'Колдонуучу табылган жок.',
+'listusers-blocked' => '(блоктолду)',
+
+# Special:ActiveUsers
+'activeusers' => 'Активдүү колдонуучулардын тизмеси',
+'activeusers-hidebots' => 'Ботторду жашыруу',
+'activeusers-noresult' => 'Колдонуучулар табылган жок.',
+
 # Special:Log/newusers
 'newuserlogpage' => 'Жаңы колдонуучулардын тизмеси',
 
 # Special:ListGroupRights
+'listgrouprights-group' => 'Топ',
+'listgrouprights-rights' => 'Укутар',
 'listgrouprights-members' => '(мүчөлөрдүн тизмеси)',
 
 # E-mail user
-'emailuser' => 'Бул колдонуучуга кат жибер',
+'emailuser' => 'Бул колдонуучуга кат жиберүү',
+'emailusername' => 'Колдонуучу аты:',
+'emailusernamesubmit' => 'Жөнөтүү',
 'emailfrom' => '- дан',
-'emailmessage' => 'Кат',
+'emailto' => 'Кимге:',
+'emailsubject' => 'Тема:',
+'emailmessage' => 'Билдирме',
+'emailsend' => 'Жөнөтүү',
 
 # Watchlist
 'watchlist' => 'Көзөмөл тизмем',
-'mywatchlist' => 'Көзөмөл тизмем',
+'mywatchlist' => 'Көзөмөл тизме',
 'watchlistfor2' => '$1 үчүн $2',
 'watchnologin' => 'Катталган жок',
-'watch' => 'Көзөмөлдө',
-'unwatch' => 'Көзөлдөбө',
+'watch' => 'Көзөмөлдөө',
+'unwatch' => 'Көзөлдөбөө',
 'watchlist-details' => 'Талкуу барактарын эсепке албаганда көзөмөл тизмеңизде {{PLURAL:$1|$1 барак|$1 барак}} бар.',
 'watchlistcontains' => 'Байкоо тизмеңизде $1 {{PLURAL:$1|барак бар|барак бар}}.',
-'wlshowlast' => 'Соңку $1 саат $2 күн $3 көрсөт.',
+'wlshowlast' => 'Соңку $1 саат $2 күн $3 көрсөтүү.',
 'watchlist-options' => 'Көзөмөл тизменин ырастоолору',
 
-'changed' => 'өзгөртүлдү',
-'created' => 'түзүлдү',
-
 # Delete
-'deletepage' => 'Баракты өчүрүп кой',
-'confirm' => 'Ырастоо',
+'deletepage' => 'Баракты өчүрүү',
+'confirm' => 'Аныктоо',
+'delete-legend' => 'Өчүрүү',
 'actioncomplete' => 'Иш-аракет жыйынтыкталды',
 'actionfailed' => 'Аракет натыйжасыз болду',
-'dellogpage' => 'Өчүрүлгөндөрдүн тизмеси',
-'deletecomment' => 'Себеп',
+'dellogpage' => 'Өчүрүүлөрдүн журналы',
+'deletecomment' => 'Себеп:',
+'deletereasonotherlist' => 'Башка себеп',
 
 # Rollback
-'rollbacklink' => 'кайтар',
+'rollbacklink' => 'кайтаруу',
 
 # Protect
 'protectlogpage' => 'Коргоо тизмеси',
 'protectedarticle' => '"[[$1]]" корголгон',
+'protectcomment' => 'Себеп:',
+'restriction-type' => 'Укуктар:',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Оңдоо',
+'restriction-move' => 'Ташуу',
+'restriction-create' => 'Жаратуу',
+'restriction-upload' => 'Жүктөө',
 
 # Undelete
-'undeletebtn' => 'Калыбына келтир',
-'undeletelink' => 'көрсөт/калыбына келтир',
-'undeleteviewlink' => 'көрсөт',
-'undeletecomment' => 'Түшүндүрмө:',
+'undeletebtn' => 'Калыбына келтирүү',
+'undeletelink' => 'кароо/калыбына келтирүү',
+'undeleteviewlink' => 'кароо',
+'undeletereset' => 'Түшүрүү',
+'undeletecomment' => 'Себеп:',
+'undelete-search-submit' => 'Издөө',
 
 # Namespace form on various pages
 'namespace' => 'Аталыштар мейкиндиги:',
-'invert' => 'Белгиленгенди кайтар',
+'invert' => 'Белгиленгенди текскерилетүү',
 'blanknamespace' => '(Негизги)',
 
 # Contributions
 'contributions' => 'Колдонуучунун салымдары',
 'contributions-title' => '$1 үчүн колдонуучунун салымдары',
-'mycontris' => 'Салымдарым',
+'mycontris' => 'Салымдар',
 'contribsub2' => '$1 үчүн ($2)',
 'uctop' => '(соңку)',
 'month' => 'Айынан (же андан мурун):',
 'year' => 'Жылынан (жана андан мурун):',
 
 'sp-contributions-newbies' => 'Жаңы колдонуучулардын гана салымдарын көрсөт',
-'sp-contributions-blocklog' => 'тосмолордун тизмеси',
+'sp-contributions-blocklog' => 'тосмолоолордун журналы',
 'sp-contributions-uploads' => 'жүктөөлөр',
-'sp-contributions-logs' => 'тизме',
-'sp-contributions-talk' => 'талкуу',
-'sp-contributions-search' => 'СалÑ\8bмдаÑ\80Ñ\8bн Ð¸Ð·Ð´Ðµ',
-'sp-contributions-username' => 'IP дареги же колдонуучунун аты:',
-'sp-contributions-toponly' => 'Соңку версиялары болгон оңдоолорду гана көрсөт',
-'sp-contributions-submit' => 'Изде',
+'sp-contributions-logs' => 'журналдар',
+'sp-contributions-talk' => 'талкуулоо',
+'sp-contributions-search' => 'СалÑ\8bмдаÑ\80Ñ\8bмдÑ\8b Ð¸Ð·Ð´Ó©Ó©',
+'sp-contributions-username' => 'IP-дарек же катышуучунун аты:',
+'sp-contributions-toponly' => 'Соңку версиялары болгон оңдоолорду гана көрсөтүү',
+'sp-contributions-submit' => 'Издөө',
 
 # What links here
-'whatlinkshere' => 'Ð\96еÑ\82елеме Ñ\88илÑ\82емелеÑ\80',
+'whatlinkshere' => 'ШилÑ\82емелеÑ\80ди Ð±Ñ\83л Ð¶Ð°ÐºÐºÐ°',
 'whatlinkshere-title' => '"$1" -га шилтеме берген барактар',
 'whatlinkshere-page' => 'Барак:',
 'linkshere' => "'''[[:$1]]''' барагына шилтеме берген барактар:",
 'nolinkshere' => "'''[[:$1]]''' барагына шилтеме берген барак жок.",
 'isredirect' => 'кайра багыттоо барагы',
-'istemplate' => 'кошкуч',
+'istemplate' => 'кошуу',
 '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' => 'ЧÑ\8bпкалар',
+'whatlinkshere-filters' => 'ФилÑ\8cÑ\82Ñ\80лер',
 
 # Block/unblock
-'ipbreason' => 'Себеп',
+'block' => 'Катышуучуну блокко салуу',
+'blockip' => 'Катышуучуну блокко салуу',
+'blockip-title' => 'Катышуучуну блокко салуу',
+'blockip-legend' => 'Катышуучуну блокко салуу',
+'ipadressorusername' => 'IP дарек же колдонуучу аты:',
+'ipbreason' => 'Себеп:',
+'ipbreasonotherlist' => 'Башка себеп',
+'ipbother' => 'Башка убакыт:',
 'ipboptions' => '2 саат:2 hours,1 күн:1 day,3 күн:3 days,1 жума:1 week,2 жума:2 weeks,1 ай:1 month,3 ай:3 months,6 ай:6 months,1 жыл:1 year,мөөнөтсүз:infinite',
 'ipbotheroption' => 'башка',
-'ipblocklist' => 'Тосмолонгон колдонуучулар',
-'blocklink' => 'тосмоло',
-'unblocklink' => 'тосмолоону алып сал',
-'change-blocklink' => 'тосмолоону өзгөрт',
-'contribslink' => 'салымдары',
-'blocklogpage' => 'Тосмоолордун тизмеси',
+'ipblocklist' => 'Тосмолонгон катышуучулар',
+'blocklist-reason' => 'Себеп',
+'ipblocklist-submit' => 'Издөө',
+'blocklink' => 'блокко салуу',
+'unblocklink' => 'блоктон алуу',
+'change-blocklink' => 'блоктоону өзгөртүү',
+'contribslink' => 'салым',
+'emaillink' => 'кат жиберүү',
+'blocklogpage' => 'Тосмолоолордун журналы',
 'blocklogentry' => '[[$1]] тосмолонду, тосмолоо мөөнөтү: $2 $3',
-'block-log-flags-nocreate' => 'Каттоо мүмкүн эмес',
+'block-log-flags-nocreate' => 'эсеп жазуусун жаратуу өчүрүлгөн',
 
 # Move page
-'movelogpage' => 'Өзгөртүлгөн аталыштардын тизмеси',
-'movereason' => 'Себеп',
-'revertmove' => 'кайÑ\82аÑ\80Ñ\8bп Ð°Ð»',
-'delete_and_move_confirm' => 'Ооба, бул баракты өчүр',
+'movelogpage' => 'Өзгөртүлгөн аттардын журналы',
+'movereason' => 'Себеп:',
+'revertmove' => 'кайÑ\82аÑ\80Ñ\83Ñ\83',
+'delete_and_move_confirm' => 'Ооба, бул баракты өчүрөм',
 
 # Export
-'export' => 'Барактарды чыгар',
+'export' => 'Барактарды экспорттоо',
+'export-addcat' => 'Кошуу',
+'export-addns' => 'Кошуу',
 
 # Namespace 8 related
-'allmessages' => 'Система билдирүүлөрү',
-'allmessagesname' => 'Аталышы',
+'allmessages' => 'Системалык билдирмелер',
+'allmessagesname' => 'Ат',
 'allmessagesdefault' => 'Белгиленген билдирүүнүн тексти',
 'allmessagescurrent' => 'Учурдагы текст',
-'allmessages-filter-all' => 'Бардыгы',
+'allmessages-filter-legend' => 'Фильтр',
+'allmessages-filter-all' => 'Баары',
 'allmessages-language' => 'Тил:',
-'allmessages-filter-submit' => 'Алга',
+'allmessages-filter-submit' => 'Өтүү',
 
 # Thumbnails
-'thumbnail-more' => 'Чоңойт',
+'thumbnail-more' => 'Чоңойтуу',
 'thumbnail_error' => 'Кичирейтилген сүрөттү түзүүдө ката: $1',
 
+# Special:Import
+'import-interwiki-submit' => 'Импорттоо',
+'import-upload-filename' => 'Файл аты:',
+'import-comment' => 'Эскертүү:',
+
+# Import log
+'importlogpage' => 'Импорт журналы',
+
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Ð\9aолдонуучу барагыңыз',
-'tooltip-pt-mytalk' => 'Талкуу барагыңыз',
+'tooltip-pt-userpage' => 'Ð\9aаÑ\82Ñ\8bÑ\88уучу барагыңыз',
+'tooltip-pt-mytalk' => 'Талкуулоо барагыңыз',
 'tooltip-pt-preferences' => 'Ырастоолоруңуз',
 'tooltip-pt-watchlist' => 'Өзгөрүүлөрүн көзөмөлгө алган барактардын тизмеси',
 'tooltip-pt-mycontris' => 'Салымдарыңыздын тизмеси',
 'tooltip-pt-login' => 'Сизге системада катталууга сунуш кылынат, бирок милдеттүү эмес',
 'tooltip-pt-logout' => 'Чыгуу',
-'tooltip-ca-talk' => 'Барактын мазмуну боюнча талкуу',
+'tooltip-ca-talk' => 'Барактын мазмуну боюнча талкуулоо',
 'tooltip-ca-edit' => 'Сиз бул баракты оңдой аласыз. Кичи пейилдикке, сактоодон мурда алдын ала көрсөтүү нукуурун колдонуңуз.',
-'tooltip-ca-addsection' => 'Жаңы бөлүм башта',
+'tooltip-ca-addsection' => 'Жаңы бөлүмдү баштөө',
 'tooltip-ca-viewsource' => 'Бул барак корголгон.
 Сиз анын кайнарын көрө аласыз',
 'tooltip-ca-history' => 'Бул барактын мурунку оңдоолору',
-'tooltip-ca-protect' => 'Бул баракты корго',
-'tooltip-ca-delete' => 'Бул баракты өчүр',
-'tooltip-ca-move' => 'Барак аталышын өзгөрт',
+'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' => 'Ð\94олбооÑ\80 Ñ\82Ñ\83Ñ\83Ñ\80алÑ\83Ñ\83, Ñ\8dмне Ð¶Ð°Ñ\81ай Ð°Ð»Ð°Ñ\81Ñ\8bз, ÐºÐ°Ð¹Ñ\81Ñ\8b Ð¶ÐµÑ\80де Ñ\82абÑ\8bлаÑ\82',
-'tooltip-n-currentevents' => 'УÑ\87Ñ\83Ñ\80дагÑ\8b Ð¾ÐºÑ\83Ñ\8fлаÑ\80 Ñ\82Ñ\83Ñ\83Ñ\80алÑ\83Ñ\83 ÐºÐ¾Ñ\88Ñ\83мÑ\87а Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82 Ñ\82ап',
+'tooltip-search' => '{{SITENAME}} издөө',
+'tooltip-search-go' => 'Так ушундай аталыштагы баракты көрсөтүү',
+'tooltip-search-fulltext' => 'Ушул текст менен барактарды издөө',
+'tooltip-p-logo' => 'Башбаракка өтүү',
+'tooltip-n-mainpage' => 'Башбаракка өтүү',
+'tooltip-n-mainpage-description' => 'Башбаракка өтүү',
+'tooltip-n-portal' => 'Ð\94олбооÑ\80 Ñ\82Ñ\83Ñ\83Ñ\80алÑ\83Ñ\83, Ñ\8dмне Ð¶Ð°Ñ\81ай Ð°Ð»Ð°Ñ\81Ñ\8bз, ÐºÐ°Ð¹Ñ\81Ñ\8b Ð¶ÐµÑ\80де Ñ\8dмне Ð±Ð°Ñ\80 Ð¶Ó©Ð½Ò¯Ð½Ð´Ó©',
+'tooltip-n-currentevents' => 'УÑ\87Ñ\83Ñ\80дагÑ\8b Ð¾ÐºÑ\83Ñ\8fлаÑ\80 Ñ\82Ñ\83Ñ\83Ñ\80алÑ\83Ñ\83 ÐºÐ¾Ñ\88Ñ\83мÑ\87а Ð¼Ð°Ð°Ð»Ñ\8bмаÑ\82 Ñ\82абÑ\83Ñ\83',
 'tooltip-n-recentchanges' => 'Уикидеги соңку өзгөртүүлөрдүн тизмеси',
-'tooltip-n-randompage' => 'ТÑ\83Ñ\88 ÐºÐµÐ»Ð´Ð¸ Ð±Ð°Ñ\80акÑ\82Ñ\8b Ð¶Ò¯ÐºÑ\82Ó©',
+'tooltip-n-randompage' => 'Ð\98Ñ\80еÑ\82Ñ\81из Ñ\82Ò¯Ñ\80дө Ð±Ð¸Ñ\80 Ð±Ð°Ñ\80акÑ\82Ñ\8b Ð°Ñ\87Ñ\83Ñ\83',
 'tooltip-n-help' => 'Маалымат алуу үчүн',
 'tooltip-t-whatlinkshere' => 'Ушул жерге шилтемеси бар бардык уики барактардын тизмеси',
 'tooltip-t-recentchangeslinked' => 'Бул барактан шилтеме берилген барактардагы соңку өзгөрүүлөр',
 'tooltip-feed-atom' => 'Бул барак үчүн Atom агымы',
 'tooltip-t-contributions' => 'Бул колдонуучунун салымдарынын тизмеси',
-'tooltip-t-emailuser' => 'Бул колдонуучуга кат жибер',
-'tooltip-t-upload' => 'Файлдарды жүктө',
+'tooltip-t-emailuser' => 'Бул колдонуучуга кат жиберүү',
+'tooltip-t-upload' => 'Файлдарды жүктөө',
 'tooltip-t-specialpages' => 'Бардык атайын барактардын тизмеси',
 'tooltip-t-print' => 'Бул барактын басып чыгарууга ылайыктуу түрү',
 'tooltip-t-permalink' => 'Барактын бул версиясына туруктуу шилтеме',
-'tooltip-ca-nstab-main' => 'Ð\91аÑ\80акÑ\82Ñ\8bн Ð¼Ð°Ð·Ð¼Ñ\83нÑ\83н ÐºÐ°Ñ\80а',
-'tooltip-ca-nstab-user' => 'Ð\9aолдонÑ\83Ñ\83Ñ\87Ñ\83нÑ\83н Ð¶ÐµÐºÐµ Ð±Ð°Ñ\80агÑ\8bн ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82',
+'tooltip-ca-nstab-main' => 'Ð\91аÑ\80акÑ\82Ñ\8bн Ð¼Ð°Ð·Ð¼Ñ\83нÑ\83н ÐºÐ°Ñ\80оо',
+'tooltip-ca-nstab-user' => 'Ð\9aаÑ\82Ñ\8bÑ\88Ñ\83Ñ\83Ñ\87Ñ\83нÑ\83н Ð±Ð°Ñ\80агÑ\8bн ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82Ò¯Ò¯',
 'tooltip-ca-nstab-special' => 'Бул атайын барак, аны оңдой албайсыз',
-'tooltip-ca-nstab-project' => 'Долбоор барагын кара',
-'tooltip-ca-nstab-image' => 'Файл барагын көрсөт',
-'tooltip-ca-nstab-template' => 'Ð\9aалÑ\8bпÑ\82Ñ\8b ÐºÓ©Ñ\80Ñ\81Ó©Ñ\82',
-'tooltip-ca-nstab-category' => 'Категория барагын көрсөт',
-'tooltip-minoredit' => 'Муну майда оңдоо деп белгиле',
-'tooltip-save' => 'ӨзгөÑ\80Ñ\82үүлөÑ\80дү Ñ\81акÑ\82ап ÐºÐ¾Ð¹',
+'tooltip-ca-nstab-project' => 'Долбоор барагын көрүү',
+'tooltip-ca-nstab-image' => 'Файл барагын көрүү',
+'tooltip-ca-nstab-template' => 'ШаблондÑ\83 ÐºÓ©Ñ\80Ò¯Ò¯',
+'tooltip-ca-nstab-category' => 'Категория барагын көрүү',
+'tooltip-minoredit' => 'Муну майда оңдоо деп белгилөө',
+'tooltip-save' => 'ӨзгөÑ\80Ñ\82үүлөÑ\80дү Ñ\81акÑ\82оо',
 'tooltip-preview' => 'Кичи пейлдикке, өзгөртүүлөрдү алдын ала көрсөтүүнү сактоодон мурун колдонуңуз!',
-'tooltip-diff' => 'Тексттке киргизген өзгөртүүлөрдү көрсөт',
-'tooltip-compareselectedversions' => 'Ð\91Ñ\83л Ð±Ð°Ñ\80акÑ\82Ñ\8bн Ñ\82андалган Ñ\8dки Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\81Ñ\8bнÑ\8bн Ð°Ð¹Ñ\8bÑ\80малаÑ\80Ñ\8bн ÐºÐ°Ñ\80а',
+'tooltip-diff' => 'Тексттке киргизген өзгөртүүлөрдү көрсөтүү',
+'tooltip-compareselectedversions' => 'Ð\91Ñ\83л Ð±Ð°Ñ\80акÑ\82Ñ\8bн Ñ\82андалган Ñ\8dки Ð²ÐµÑ\80Ñ\81иÑ\8fÑ\81Ñ\8bнÑ\8bн Ð°Ð¹Ñ\8bÑ\80малаÑ\80Ñ\8bн ÐºÐ°Ñ\80оо',
 'tooltip-watch' => 'Бул баракты көзөмөл тизмеңизге кошуңуз',
 'tooltip-rollback' => '"Кайтар" бир баскыч менен бул барактын соңку оңдоочусунун өзгөртүүлөрүн алып салат',
 'tooltip-undo' => 'Киргизилген оңдоону алып салат жана жокко чыгаруунун себебин белгилөөгө мүмкүнчүлүк берип алдын ала көрсөтүүнү ачат',
-'tooltip-summary' => 'Кыска корутунду киргиз',
+'tooltip-preferences-save' => 'Ырастоолорду сактоо',
+'tooltip-summary' => 'Кыска баяндаманы киргизиңиз',
 
 # Attribution
 'others' => 'башкалар',
+'creditspage' => 'Алкыштар',
+
+# Info page
+'pageinfo-header-edits' => 'Оңдоо тарыхы',
+'pageinfo-toolboxlink' => 'Барак жөнүндө маалымат',
+'pageinfo-contentpage-yes' => 'Ооба',
+'pageinfo-protect-cascading-yes' => 'Ооба',
 
 # Browsing diffs
-'previousdiff' => 'â\86\90 Ð\9cÑ\83Ñ\80Ñ\83нкÑ\83 оңдоо',
-'nextdiff' => 'Жаңы түзөтүү →',
+'previousdiff' => 'â\86\90 Ð­Ñ\81киÑ\81ин оңдоо',
+'nextdiff' => 'Жаңысын оңдоо →',
 
 # Media information
-'file-info-size' => '$1 × $2 пиксел, файлдын көлөмү: $3, MIME тиби: $4',
-'file-nohires' => 'Мындан дагы толук чечилиши жок.',
+'file-info-size' => '$1 × $2 пиксель, файлдын көлөмү: $3, MIME түрү: $4',
+'file-nohires' => 'Мындан чоңураак чечим жок.',
 'svg-long-desc' => 'SVG файл, шарттуу түрдө $1 × $2 пиксел, файлдын көлөмү: $3',
-'show-big-image' => 'ТолÑ\83к Ñ\87еÑ\87илиÑ\88и',
+'show-big-image' => 'ТолÑ\83к Ñ\87еÑ\87ими',
 
 # Special:NewFiles
-'newimages' => 'Жаңы файлдардын галлереясы',
+'newimages' => 'Жаңы файлдардын галереясы',
+'newimages-legend' => 'Фильтр',
 'ilsubmit' => 'Издөө',
-'bydate' => 'Ð\9aүнү боюнча',
+'bydate' => 'даÑ\82а боюнча',
 
 # Bad image list
 'bad_image_list' => 'Төмөнкү калыпта болуш керек:
@@ -883,51 +1071,113 @@ IP дарегиңиз бул барактын оңдоо тарыхына жаз
 
 # EXIF tags
 'exif-artist' => 'Автор',
-'exif-contrast' => 'Контраст',
+'exif-filesource' => 'Файл булагы',
+'exif-contrast' => 'Карама-каршылык',
+'exif-keywords' => 'Ачкыч сөздөр',
+'exif-source' => 'Булак',
+'exif-languagecode' => 'Тил',
 
 'exif-meteringmode-0' => 'Белгисиз',
 'exif-meteringmode-255' => 'Башка',
 
 'exif-focalplaneresolutionunit-2' => 'дюйм',
 
+'exif-gaincontrol-0' => 'Жок',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Километр',
+
+'exif-dc-rights' => 'Укутар',
+
 # External editor support
-'edit-externally' => 'Бул файлды сырткы программа колдонуу аркылуу оңдо',
+'edit-externally' => 'Бул файлды сырткы программа колдонуу аркылуу оңдоо',
 'edit-externally-help' => '(Толук маалымат алуу үчүн [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] барагына кайрылсаңыз болот)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'баары',
 'namespacesall' => 'баары',
 'monthsall' => 'баары',
+'limitall' => 'баары',
 
 # E-mail address confirmation
-'confirmemail' => 'Электрондук даректи ырастоо',
-'confirmemail_loggedin' => 'Электрондук дарегиңиз ырасталды.',
+'confirmemail' => 'Электрондук даректи аныктоо',
+'confirmemail_loggedin' => 'Электрондук дарегиңиз аныкталды.',
+
+# Delete conflict
+'recreate' => 'Кайтадан жаратуу',
+
+# action=purge
+'confirm_purge_button' => 'OK',
+
+# action=watch/unwatch
+'confirm-watch-button' => 'ОК',
+'confirm-unwatch-button' => 'ОК',
+
+# Live preview
+'livepreview-loading' => 'Жүктөө...',
 
 # Watchlist editing tools
-'watchlisttools-view' => 'Тийиштүү өзгөрүүлөрдү көрсөт',
-'watchlisttools-edit' => 'Көзөмөл тизмени кара жана оңдо',
-'watchlisttools-raw' => 'Жетиле элек көзөмөл тизмени оңдо',
+'watchlisttools-view' => 'Тийиштүү өзгөрүүлөрдү көрсөтүү',
+'watchlisttools-edit' => 'Көзөмөл тизмесин кароо жана оңдоо',
+'watchlisttools-raw' => 'Жетиле элек көзөмөл тизмени оңдоо',
 
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'Эскертүү:\'\'\' "$2" белгиленген ылгоочу ачкыч "$1" мурунку белгиленген ылгоочу ачкычты жокко чыгарат.',
 
 # Special:Version
 'version' => 'Версия',
+'version-other' => 'Башка',
+'version-license' => 'Лицензия',
+'version-software' => 'Орнотулган программалык камсыздоо',
+'version-software-product' => 'Продукт',
+'version-software-version' => 'Версия',
+'version-entrypoints-header-url' => 'URL',
+
+# Special:FilePath
+'filepath' => 'Файл жолу',
+'filepath-page' => 'Файл:',
 
 # Special:SpecialPages
 'specialpages' => 'Атайын барактар',
+'specialpages-group-pagetools' => 'Барак аспаптары',
+
+# Special:BlankPage
+'blankpage' => 'Бош барак',
 
 # External image whitelist
-'external_image_whitelist' => ' #Бул сапты болгондой калтыр<pre>
-#Туруктуу айтылыштардын бөлүмдөрүн (// арасындагы бөлүмүн гана) астына жайгаштыр 
+'external_image_whitelist' => ' #Бул сапты болгондой калтыруу<pre>
+#Туруктуу айтылыштардын бөлүмдөрүн (// арасындагы бөлүмүн гана) астына жайгаштыру 
 #Алар сырткы сүрөттөрдүн URL менен байланыштырылат
 #Ылайыктуулары сүрөт болуп көрсөтүлөт, калгандары сүрөттөргө шилтеме болуп көрсөтүлөт
 ## менен башталган саптар, түшүндүрмө болуп эсептелет
 #Баш же кичине тамга айырмасыз
 
-#Туруктуу айтылыштардын бөлүмдөрүн ушул саптын үстүнө жайгаштыр. Бул сапты болгондой калтыр.</pre>',
+#Туруктуу айтылыштардын бөлүмдөрүн ушул саптын үстүнө жайгаштыр. Бул сапты болгондой калтыруу.</pre>',
 
 # Special:Tags
-'tag-filter' => '[[Special:Tags|Энбелги]] чыпкасы:',
+'tag-filter' => '[[Special:Tags|Белги]] фильтри:',
+'tag-filter-submit' => 'Фильтрдөө',
+'tags-title' => 'Белгилер',
+'tags-edit' => 'оңдоо',
+
+# Special:ComparePages
+'compare-submit' => 'Салыштыруу',
+
+# HTML forms
+'htmlform-submit' => 'Жөнөтүү',
+'htmlform-selectorother-other' => 'Башка',
+
+# Feedback
+'feedback-subject' => 'Тема:',
+'feedback-message' => 'Билдирме:',
+'feedback-cancel' => 'Жокко чыгаруу',
+'feedback-close' => 'Даяр',
+
+# Search suggestions
+'searchsuggest-search' => 'Издөө',
+
+# API errors
+'api-error-unknown-code' => 'Белгисиз ката: "$1".',
+'api-error-unknownerror' => 'Белгисиз ката: «$1».',
 
 );
index 961b81f..e0e7ba7 100644 (file)
@@ -279,8 +279,8 @@ $messages = array(
 'newwindow' => '(in fenestra nova aperietur)',
 'cancel' => 'Abrogare',
 'moredotdotdot' => 'Plus...',
-'mypage' => 'Pagina mea',
-'mytalk' => 'Disputatio mea',
+'mypage' => 'Pagina',
+'mytalk' => 'Disputatio',
 'anontalk' => 'Disputatio huius IP',
 'navigation' => 'Navigatio',
 'and' => '&#32;et',
@@ -290,7 +290,6 @@ $messages = array(
 'qbbrowse' => 'Perspicere',
 'qbedit' => 'Recensere',
 'qbpageoptions' => 'Optiones paginae',
-'qbpageinfo' => 'Contextus',
 'qbmyoptions' => 'Paginae meae',
 'qbspecialpages' => 'Paginae speciales',
 'faq' => 'Quaestiones frequentes',
@@ -494,11 +493,11 @@ Ratio data est "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Conventum tuum conclusum est.'''
 
-Ignote continues {{grammar:ablative|{{SITENAME}}}} uti, aut conventum novum vel sub eodem vel novo nomine [[Special:UserLogin|aperias]].
+Ignote continues {{grammar:ablative|{{SITENAME}}}} uti, aut conventum novum vel sub eodem vel novo nomine <span class='plainlinks'>[$1 aperias]</span>.
 Nota bene paginas fortasse videantur quasi tuum conventum esset apertum, priusquam navigatrum purgaveris.",
-'welcomecreation' => '== Salve, $1! ==
-Ratio tua iam creata est.
-Noli oblivisci [[Special:Preferences|praeferentias tuas]] apud {{grammar:accusative|{{SITENAME}}}} mutare.',
+'welcomeuser' => 'Salve, $1!',
+'welcomecreation-msg' => 'Ratio tua creata est.
+Noli oblivisci [[Special:Preferences|praeferentias]] tuas apud {{grammar:accusative|{{SITENAME}}}} mutare.',
 'yourname' => 'Nomen usoris:',
 'yourpassword' => 'Tessera:',
 'yourpasswordagain' => 'Tesseram adfirmare:',
@@ -849,8 +848,6 @@ Titulus: '''({{int:cur}})''' = dissimilis ab emendatione novissima,
 'search-interwiki-caption' => 'Alia incepta',
 'search-interwiki-default' => '$1 eventus:',
 'search-interwiki-more' => '(plus)',
-'search-mwsuggest-enabled' => 'cum suggestionibus',
-'search-mwsuggest-disabled' => 'sine suggestionibus',
 'search-relatedarticle' => 'Relata',
 'mwsuggest-disable' => 'Prohibere suggestiones AJAX',
 'searcheverything-enable' => 'Quaerere in omnibus spatiis nominalibus',
@@ -881,7 +878,7 @@ Conare praefixare tua inquisitionem cum ''all:'' ut quaeras contenta omnia (pagi
 
 # Preferences page
 'preferences' => 'Praeferentiae',
-'mypreferences' => 'Praeferentiae meae',
+'mypreferences' => 'Praeferentiae',
 'prefs-edits' => 'Numerus recensionum:',
 'prefsnologin' => 'Conventum non est apertum',
 'prefsnologintext' => '<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} Conventum aperire]</span> debes ad praeferentias tuas modificandum.',
@@ -1497,11 +1494,7 @@ Si paginam ex indice paginarum custoditarum removere vis, imprime \"decustodire\
 'unwatching' => 'Decustodiens...',
 
 'enotif_reset' => 'Indicare omnes paginas visitatas',
-'enotif_newpagetext' => 'Haec pagina nova est.',
 'enotif_impersonal_salutation' => 'Usor {{grammar:genitive|{{SITENAME}}}}',
-'changed' => 'mutata',
-'created' => 'creata',
-'enotif_subject' => 'Pagina {{grammar:genitive|{{SITENAME}}}} $PAGETITLE ab $PAGEEDITOR $CHANGEDORCREATED est',
 'enotif_lastdiff' => 'Vide $1 ad hanc recensionem inspiciendum.',
 'enotif_anon_editor' => 'usor ignotus $1',
 'enotif_body' => '
@@ -1660,7 +1653,7 @@ Si pagina nova cum ipso nomine post deletionem creata est, emendationes restitut
 # Contributions
 'contributions' => 'Conlationes usoris',
 'contributions-title' => 'Conlationes usoris $1',
-'mycontris' => 'Conlationes meae',
+'mycontris' => 'Conlationes',
 'contribsub2' => 'Pro $1 ($2)',
 'nocontribs' => 'Nullae mutationes inventae sunt ex his indiciis.',
 'uctop' => ' (vertex)',
@@ -1910,7 +1903,7 @@ Paginae nomen petitum "[[:$1]]" iam existit. Vin tu eam delere ut pagina illic m
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Pagina usoris tua',
 'tooltip-pt-mytalk' => 'Pagina disputationis tua',
-'tooltip-pt-preferences' => 'Praeferentiae meae',
+'tooltip-pt-preferences' => 'Praeferentiae tuae',
 'tooltip-pt-watchlist' => 'Paginae quae custodis ut eorum mutationes facilius vides',
 'tooltip-pt-mycontris' => 'Index conlationum tuarum',
 'tooltip-pt-login' => 'Te conventum aperire hortamur, non autem requisitum',
@@ -2378,10 +2371,13 @@ Quaesumus, adfirma ut iterum hanc paginam crees.",
 'logentry-move-move-noredirect' => '$1 movit paginam $3 ad $4 sine redirectione',
 'logentry-move-move_redir' => '$1 movit paginam $3 ad $4 praeter redirectionem',
 'logentry-move-move_redir-noredirect' => '$1 movit paginam $3 ad $4 praeter redirectionem sine redirectione',
-'logentry-newusers-newusers' => '$1 creavit rationem usoris',
-'logentry-newusers-create' => '$1 creavit rationem usoris',
-'logentry-newusers-create2' => '$1 creavit rationem usoris $3',
+'logentry-newusers-newusers' => 'Ratio usoris $1 creata est',
+'logentry-newusers-create' => 'Ratio usoris $1 creata est',
+'logentry-newusers-create2' => 'Ratio usoris $3 creata est ab usore $1',
 'logentry-newusers-autocreate' => 'Ratio $1 automatice creata est',
 'newuserlog-byemail' => 'tessera missa litteris electronicis',
 
+# Search suggestions
+'searchsuggest-search' => 'Quaerere',
+
 );
index f2bccbf..a3ec90d 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author ILVI
  * @author Jewbask
+ * @author Maor X
  * @author Remember the dot
  * @author Runningfridgesrule
  * @author Taichi
@@ -139,7 +140,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'TrocamientosFreskos' ),
        'Recentchangeslinked'       => array( 'TrocamientosÈnterassados' ),
        'Revisiondelete'            => array( 'EfassarRēvizyón' ),
-       'RevisionMove'              => array( 'TaxireaRēvizyón' ),
        'Search'                    => array( 'Buscar' ),
        'Shortpages'                => array( 'HojasKurtas' ),
        'Specialpages'              => array( 'HojasEspesyales' ),
@@ -315,7 +315,7 @@ $messages = array(
 'cancel' => 'Anular',
 'moredotdotdot' => 'Más...',
 'mypage' => 'Mi hoja',
-'mytalk' => 'Mi diskusyón',
+'mytalk' => 'La mi diskusyon',
 'anontalk' => 'Diskusyón para este adresso de IP',
 'navigation' => 'Navigación',
 'and' => '&#32;y',
@@ -325,7 +325,6 @@ $messages = array(
 'qbbrowse' => 'Navigar',
 'qbedit' => 'Trocar',
 'qbpageoptions' => 'Esta hoja',
-'qbpageinfo' => 'Enformasyón de hoja',
 'qbmyoptions' => 'Mis hojas',
 'qbspecialpages' => 'Hojas especiales',
 'faq' => 'DAD',
@@ -568,9 +567,9 @@ Si venites aquí por yerro, torna a la hoja de antes.',
 Puedes [[Special:Search/{{PAGENAME}}|buscar el títůlo de esta hoja]] en otras hojas,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los rējistros relatados],
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} trocar esta hoja]</span>.',
-'noarticletext-nopermission' => 'No ay teksto oy día en esta hoja.
-Puedes [[Special:Search/{{PAGENAME}}|buscar este títůlo de hoja]] en otras hojas,
-o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar en los rejistros relasyonados]</span>.',
+'noarticletext-nopermission' => 'No ay teksto en esta oja.
+Puedes [[Special:Search/{{PAGENAME}}|bushkar este titolo de oja]] en otras pajinas,
+o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} bushkar en los rejistros relasyonados]</span>.',
 'userpage-userdoesnotexist-view' => 'El cuento del usador $1 no está enrejistrado.',
 'note' => "'''Nota:'''",
 'previewnote' => "¡Akórdate ke esto es sólo una previsualizasion i aínda no se enrejistró!'''
@@ -692,8 +691,6 @@ Leyenda: (act) = diferencias con la versión actual,
 'search-interwiki-caption' => 'Proyectos hermanos',
 'search-interwiki-default' => 'Los resultados de $1:',
 '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'''",
@@ -712,7 +709,7 @@ Las búsquedas producen más o munco a buscar biervos comunes como «la» o «de
 
 # Preferences page
 'preferences' => 'Preferencias',
-'mypreferences' => 'Mis preferencias',
+'mypreferences' => 'Las mis preferensias',
 'changepassword' => 'Trocar el kóddiche',
 'prefs-skin' => 'Vista',
 'skin-preview' => 'Previstear',
@@ -896,7 +893,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',
+'mywatchlist' => 'La 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.
 
@@ -969,7 +966,7 @@ A continuación se mostran las opciones actuales de la hoja '''$1''':",
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Ajustamientos del empleador',
+'contributions' => 'Ajustamientos {{GENDER:$1|del usador|de la usadora}}',
 'contributions-title' => 'Ajustamientos {{GENDER:$1|del usuario|de la usuaria}} $1',
 'mycontris' => 'Mis ajustamientos',
 'contribsub2' => '$1 ($2)',
index f52d705..1fcc5e5 100644 (file)
@@ -92,6 +92,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'No_MIME-Zorte_sichen' ),
        'Mostcategories'            => array( 'Säite_mat_de_meeschte_Kategorien' ),
        'Mostimages'                => array( 'Dacks_benotzte_Biller' ),
+       'Mostinterwikis'            => array( 'Meescht_Interwikien' ),
        'Mostlinked'                => array( 'Dacks_verlinkte_Säiten' ),
        'Mostlinkedcategories'      => array( 'Dacks_benotzte_Kategorien' ),
        'Mostlinkedtemplates'       => array( 'Dacks_benotzte_Schablounen' ),
@@ -115,7 +116,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Rezent_Ännerungen' ),
        'Recentchangeslinked'       => array( 'Ännerungen_op_verlinkte_Säiten' ),
        'Revisiondelete'            => array( 'Versioun_läschen' ),
-       'RevisionMove'              => array( 'Versioun_réckelen' ),
        'Search'                    => array( 'Sichen' ),
        'Shortpages'                => array( 'Kuerz_Säiten' ),
        'Specialpages'              => array( 'Spezialsäiten' ),
@@ -229,7 +229,7 @@ $messages = array(
 
 'underline-always' => 'Ëmmer',
 'underline-never' => 'Ni',
-'underline-default' => 'vun der Browserastellung ofhängeg',
+'underline-default' => 'Skin oder Standard vum Browser',
 
 # Font style option in Special:Preferences
 'editfont-style' => "Schrëftfamill fir d'Ännerungsfënster:",
@@ -314,8 +314,8 @@ $messages = array(
 'newwindow' => '(geet an enger neier Fënster op)',
 'cancel' => 'Zréck',
 'moredotdotdot' => 'Méi …',
-'mypage' => 'Meng Säit',
-'mytalk' => 'Meng Diskussioun',
+'mypage' => 'Säit',
+'mytalk' => 'Diskussioun',
 'anontalk' => 'Diskussioun fir dës IP Adress',
 'navigation' => 'Navigatioun',
 'and' => '&#32;a(n)',
@@ -325,7 +325,6 @@ $messages = array(
 'qbbrowse' => 'Duerchsichen',
 'qbedit' => 'Änneren',
 'qbpageoptions' => 'Säitenoptiounen',
-'qbpageinfo' => 'Kontext',
 'qbmyoptions' => 'Meng Säiten',
 'qbspecialpages' => 'Spezialsäiten',
 'faq' => 'FAQ',
@@ -338,7 +337,7 @@ $messages = array(
 'vector-action-protect' => 'Spären',
 'vector-action-undelete' => 'Restauréieren',
 'vector-action-unprotect' => 'Spär änneren',
-'vector-simplesearch-preference' => 'Verbessert Sichvirschléi aktiviéieren (nëmme beim Ausgesinn Vector)',
+'vector-simplesearch-preference' => 'Vereinfacht Sichleescht aktivéieren (nëmme beim Ausgesinn Vector)',
 'vector-view-create' => 'Uleeën',
 'vector-view-edit' => 'Änneren',
 'vector-view-history' => 'Versioune weisen',
@@ -348,6 +347,7 @@ $messages = array(
 'namespaces' => 'Nummraim',
 'variants' => 'Varianten',
 
+'navigation-heading' => 'Navigatiounsmenü',
 'errorpagetitle' => 'Feeler',
 'returnto' => 'Zréck op $1.',
 'tagline' => 'Vu {{SITENAME}}',
@@ -556,7 +556,7 @@ Ufro: $2',
 'viewsource-title' => 'Quelltext vun der Säit $1 weisen',
 'actionthrottled' => 'Dës Aktioun gouf gebremst',
 'actionthrottledtext' => 'Fir géint de Spam virzegoen, ass dës Aktioun esou programméiert datt Dir se an enger kuerzer Zäit nëmme limitéiert dacks maache kënnt. Dir hutt dës Limite iwwerschratt. Versicht et w.e.g. an e puer Minutten nach eng Kéier.',
-'protectedpagetext' => 'Dës Säit ass fir Ännerunge gespaart.',
+'protectedpagetext' => 'Dës Säit ass fir Ännerungen an aner Aktioune gespaart.',
 'viewsourcetext' => 'Dir kënnt de Quelltext vun dëser Säit kucken a kopéieren:',
 'viewyourtext' => "Dir kënnt de Quelltext vun '''Ären Ännerungen''' op dëser Säit kucken a kopéieren:",
 'protectedinterface' => "Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software op dëser Wiki an dofir ass si gespaart fir Mëssbrauch ze verhënneren.
@@ -586,12 +586,12 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Dir sidd elo ausgeloggt.'''
 
-Dir kënnt {{SITENAME}} elo anonym benotzen, oder Iech [[Special:UserLogin|erëm aloggen]].
+Dir kënnt {{SITENAME}} elo anonym benotzen, oder Iech <span class='plainlinks'>[$1 erëm aloggen]</span>.
 
 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.',
+'welcomeuser' => 'Wëllkomm $1!',
+'welcomecreation-msg' => "Äre Benotzerkont gouf ugeluecht.
+Vergiesst net fir Är [[Special:Preferences|{{SITENAME}} Astellungen]] z'änneren",
 'yourname' => 'Benotzernumm:',
 'yourpassword' => 'Passwuert:',
 'yourpasswordagain' => 'Passwuert nach eemol antippen:',
@@ -722,6 +722,12 @@ Vläicht hutt Dir Äert Passwuert scho geännert oder en neit temporäert Passwu
 'passwordreset-capture-help' => 'Wann Dir dës Këscht ukräizt, gëtt de Mail (mam temporäre Passwuert) Iech gewisen an dem Benotzer geschéckt.',
 'passwordreset-email' => 'E-Mailadress:',
 'passwordreset-emailtitle' => 'Detailer vum Benotzerkont op{{SITENAME}}',
+'passwordreset-emailtext-ip' => "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet eng Erënnerung fir Är Benotzerkonteninformatiounen op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:
+
+$2
+
+{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.
+Dir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
 'passwordreset-emailelement' => 'Benotzernumm: $1
 Temporärt Passwuert: $2',
 'passwordreset-emailsent' => 'Eng Erënnerungs-Mail gouf geschéckt.',
@@ -835,6 +841,10 @@ Dir kënnt op anere Säiten no [[Special:Search/{{PAGENAME}}|dësem Säitentitel
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} esou eng Säit uleeën]</span>.',
 'noarticletext-nopermission' => 'Elo ass keen Text op dëser Säit.
 Dir kënnt op anere Säiten [[Special:Search/{{PAGENAME}}|no dësem Sàitentitel sichen]], oder <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an de Logbicher sichen]</span>, mä Dir hutt net déi néideg Rechter fir dës Säit unzeleeën.',
+'missing-revision' => 'D\'Versioun #$1 vun der Säit mam Numm "{{PAGENAME}}" gëtt et net.
+
+Dat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.
+Detailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].',
 'userpage-userdoesnotexist' => 'De Benotzerkont "<nowiki>$1</nowiki>" ass net registréiert.
 Iwwerpréift w.e.g. op Dir dës Säit uleeën/ännere wëllt.',
 'userpage-userdoesnotexist-view' => 'De Benotzerkont "$1" ass net registréiert.',
@@ -861,7 +871,7 @@ Denkt drun datt eegen .css an .js Säiten e kleng geschriwwenen Titel benotzen,
 'note' => "'''Notiz:'''",
 'previewnote' => "'''Denkt drun datt dëst nëmmen eng net gespäichert Versioun ass.'''
 Är Ännerunge sinn nach net gespäichert!",
-'continue-editing' => 'Weider änneren',
+'continue-editing' => "Gitt weider an de Beräich fir z'änneren",
 'previewconflict' => 'Dir gesitt an dem ieweschten Textfeld wéi den Text ausgesi wäert, wann Dir späichert.',
 'session_fail_preview' => "'''Är Ännerung konnt net gespäichert gi well d'Date vun Ärer Sessioun verluergaange sinn.
 Versicht et w.e.g. nach eng Kéier.
@@ -934,6 +944,14 @@ Si gouf anscheinend geläscht.",
 'edit-no-change' => 'Är ännerung gouf ignoréiert, well Dir näischt um Text geännert hutt.',
 'edit-already-exists' => 'Déi nei Säit konnt net ugeluecht ginn, well et se scho gëtt.',
 'defaultmessagetext' => 'Standardtext',
+'invalid-content-data' => 'Donnéeë vum Inhalt sinn net valabel',
+'content-not-allowed-here' => '"$1"-Inhalt ass op der Säit [[$2]] net erlaabt',
+
+# Content models
+'content-model-wikitext' => 'Wikitext',
+'content-model-text' => 'Kloertext',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Opgepasst:'' Dës Säit huet ze vill Ufroe vu komplexe Parserfunktiounen.
@@ -947,6 +965,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)",
+'parser-unstrip-loop-warning' => 'Endlos Schleef entdeckt',
 'converter-manual-rule-error' => 'An der Regel iwwer déi manuell Ëmwandlung vun der Sprooch gouf e Feeler fonnt',
 
 # "Undo" feature
@@ -1182,8 +1201,6 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 'search-interwiki-caption' => 'Schwësterprojeten',
 'search-interwiki-default' => '$1 Resultater:',
 'search-interwiki-more' => '(méi)',
-'search-mwsuggest-enabled' => 'mat Virschléi',
-'search-mwsuggest-disabled' => 'keng Virschléi',
 'search-relatedarticle' => 'A Verbindung',
 'mwsuggest-disable' => 'Ajax-Virschléi ausschalten',
 'searcheverything-enable' => 'An allen Nummraim sichen',
@@ -1216,7 +1233,7 @@ Denkt w.e.g drunn datt d'Navigatiounslinken d'Wiel vun de Versiounen nees zréck
 
 # Preferences page
 'preferences' => 'Astellungen',
-'mypreferences' => 'Meng Astellungen',
+'mypreferences' => 'Astellungen',
 'prefs-edits' => 'Zuel vun den Ännerungen:',
 'prefsnologin' => 'Net ageloggt',
 'prefsnologintext' => 'Dir musst <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}}ageloggt]</span> sinn, fir Är Astellungen änneren ze kënnen.',
@@ -1446,6 +1463,7 @@ Si muss manner wéi $1 {{PLURAL:$1|Zeechen|Zeechen}} hunn.',
 'rightslogtext' => "Dëst ass d'Lëscht vun den Ännerunge vu Benotzerrechter.",
 'rightslogentry' => "huet d'Benotzerrechter vum $1 vun $2 op $3 geännert.",
 'rightslogentry-autopromote' => 'gouf automatesch aus dem Grupp $2 an de Grupp $3 gesat',
+'logentry-rights-autopromote' => "De Benotzer $1 huet d'Benotzerrechter automatesch vu(n) $4 op $5 geännert",
 'rightsnone' => '(keen)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1553,7 +1571,7 @@ Fir e '''Bild''' op enger Säit zu benotzen, schreift amplaz vum Bild eng vun d
 * '''<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-permitted' => 'Erlaabt Formater vun de Fichieren: $1.',
 'upload-preferred' => 'Fichierszorten déi am beschte funktionéieren: $1.',
 'upload-prohibited' => 'Verbuede Fichiers Formater: $1.',
 'uploadlog' => 'Lëscht vun den eropgeluedene Fichieren',
@@ -1674,6 +1692,7 @@ Wann de Problem weider besteet, dann un de [[Special:ListUsers/sysop|Administrat
 'backend-fail-notsame' => 'Et gëtt schonn en net-identesche Fichier op $1.',
 'backend-fail-invalidpath' => '$1 ass keng valabel Plaz fir ze späicheren.',
 'backend-fail-delete' => 'De Fichier $1 konnt net geläscht ginn.',
+'backend-fail-describe' => 'D\'Metadate fir de Fichier "$1" konten net geännert ginn.',
 'backend-fail-alreadyexists' => 'De Fichier $1 gëtt et schonn.',
 'backend-fail-store' => 'De Fichier $1 konnt net op $2 gespäichert ginn.',
 'backend-fail-copy' => 'De Fichier $1 konnt net op $2 kopéiert ginn.',
@@ -1760,7 +1779,7 @@ Kuckt w.e.g. no op kee Feeler an der URL ass an op de Site och online ass.',
 # Special:ListFiles
 'listfiles-summary' => 'Op dëser Spezialsäit stinn all déi eropgeluede Fichieren.
 
-Wann se pro Benotzer gefiltert sinn, ginn nëmmen déi Fichiere gewise wou dee Benotzer déi lescht Versioun vum Fichier eropgelueden huet.',
+Wa se pro Benotzer gefiltert sinn, ginn nëmmen déi Fichiere gewise wou dee Benotzer déi lescht Versioun vum Fichier eropgelueden huet.',
 'listfiles_search_for' => 'Sicht nom Fichier:',
 'imgfile' => 'Fichier',
 'listfiles' => 'Lëscht vun de Fichieren',
@@ -1813,7 +1832,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.',
+'upload-disallowed-here' => 'Dir kënnt Dir dëse Fichier net iwwerschreiwen.',
 
 # File reversion
 'filerevert' => '"$1" zrécksetzen',
@@ -1875,7 +1894,7 @@ Dir musst ëmmer de Medien- a Subtyp aginn: z. Bsp. <code>image/jpeg</code>.",
 'statistics' => 'Statistik',
 'statistics-header-pages' => 'Säitestatistiken',
 'statistics-header-edits' => 'Statistik vun den Ännerungen',
-'statistics-header-views' => "Sttistiken iwwert d'Visiten",
+'statistics-header-views' => "Statistiken iwwert d'Visiten",
 'statistics-header-users' => 'Benotzerstatistik',
 'statistics-header-hooks' => 'Aner Statistiken',
 'statistics-articles' => 'Säite mat Inhalt',
@@ -1943,6 +1962,7 @@ An all Rei sti Linken zur éischter an zweeter Viruleedung, souwéi d\'Zil vun d
 'wantedpages-badtitle' => 'Net valabelen Titel am Resultat: $1',
 'wantedfiles' => 'Gewënschte Fichieren',
 'wantedfiletext-cat' => 'Dës Fichiere gi benotzt awer et gëtt se net. Fichiere aus frieme Repositorie kënnen hei gewise ginn och wann et se gëtt. All esou falsch Positiver ginn <del>duerchgestrach</del>. Zousätzlech gi Säiten an deene Fichieren dra sinn déi et net gëtt op [[:$1]] gewisen.',
+'wantedfiletext-nocat' => 'Dës Fichiere gi benotzt existéieren awer net. Fichieren aus frieme Repertoiren kënnen trotzdeem opgelëscht ginn. All dës positiv Fichiere ginn <del>duergestrach</del>.',
 'wantedtemplates' => 'Gewënschte Schablounen',
 'mostlinked' => 'Dacks verlinkte Säiten',
 'mostlinkedcategories' => 'Dacks benotzte Kategorien',
@@ -2003,6 +2023,7 @@ Denkt w.e.g. drunn datt aner Internetsäiten dëse Fichier mat enger direkter UR
 Dir kënnt d'Siche limitéieren wann Dir e Log-Typ, e Benotzernumm (case-senisitive) oder déi gefrote Säit (och case-senisitive) agitt.",
 'logempty' => 'Näischt fonnt.',
 'log-title-wildcard' => 'Titel fänkt mat dësem Text un',
+'showhideselectedlogentries' => 'Déi erausgesichte Entréeën am Logbuch weisen/verstoppen',
 
 # Special:AllPages
 'allpages' => 'All Säiten',
@@ -2046,9 +2067,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 <code>*.example.com</code> kënne benotzt ginn.
+'linksearch-text' => '"Wildcards" wéi zum Beispill "*.example.com" kënne benotzt ginn.
 Et muss mindestens en Top-Level-Domaine ugi ginn, wéi z. Bsp. ".org".<br />
-Ënnerstëtzte Protekoller: <code>$1</code>',
+Ënnerstëtzte Protekoller: <code>$1</code> (http:// gëtt benotzt wann näischt spezifizéiert gëtt).',
 'linksearch-line' => '$1 verlinkt vun $2',
 'linksearch-error' => 'Wildcards (*,?) kënnen nëmmen am Ufank vum Host-Numm benotzt ginn.',
 
@@ -2097,7 +2118,7 @@ Et ginn [[{{MediaWiki:Listgrouprights-helppage}}|zousätzlech Informatiounen]] i
 '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.
+'emailpagetext' => 'Dir kënnt mat dësem Formulaire {{GENDER:$1|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.',
 'usermailererror' => 'E-Mail-Objet mellt deen heite Feeler:',
 'defemailsubject' => '{{SITENAME}} E-Mail vum Benotzer "$1"',
@@ -2129,7 +2150,7 @@ D\'E-Mailadress, déi Dir an [[Special:Preferences|Ären Astellungen]] aginn hut
 
 # Watchlist
 'watchlist' => 'Meng Iwwerwaachungslëscht',
-'mywatchlist' => 'Meng Iwwerwaachungslëscht',
+'mywatchlist' => 'Iwwerwaachungslëscht',
 'watchlistfor2' => 'Vum $1 $2',
 'nowatchlist' => 'Är Iwwerwaachungslëscht ass eidel.',
 'watchlistanontext' => "Dir musst $1 fir Säiten op ärer Iwwerwaachungslëscht ze gesinn oder z'änneren.",
@@ -2166,11 +2187,13 @@ Wann dir dës Säit net méi iwwerwaache wëllt, klickt op \"Net méi iwwerwaach
 
 'enotif_mailer' => '{{SITENAME}} E-Mail-Informatiounssystem',
 'enotif_reset' => 'All Säiten als besicht markéieren',
-'enotif_newpagetext' => 'Dëst ass eng nei Säit.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-Benotzer',
-'changed' => 'geännert',
-'created' => 'gemaach',
-'enotif_subject' => '[{{SITENAME}}] D\'Säit "$PAGETITLE" gouf vum $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} geläscht",
+'enotif_subject_created' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} ugeluecht",
+'enotif_subject_moved' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} geréckelt",
+'enotif_subject_restored' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} restauréiert",
+'enotif_subject_changed' => "D'{{SITENAME}}-Säit $1 gouf vum {{gender:$2|$2}} geännert",
+'enotif_body_intro_deleted' => 'D\'{{SITENAME}}-Säit $1 gouf de(n) $PAGEEDITDATE {{gender:$2|vum $2|vun der $2}} geläscht, kuckt $3 fir déi aktuell Versioun.',
 'enotif_lastvisited' => 'All Ännerungen op ee Bléck: $1',
 'enotif_lastdiff' => 'Kuckt $1 fir dës Ännerung.',
 'enotif_anon_editor' => 'Anonyme Benotzer $1',
@@ -2357,7 +2380,8 @@ An esou Fäll däerf déi neiste Versioun net markéiert ginn oder déi neiste g
 'undeletedrevisions' => '$1 {{PLURAL:$1|Versioun gouf|$1 Versioune goufe}} restauréiert',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 Versioun|$1 Versiounen}} a(n) {{PLURAL:$2|1 Fichier|$2 Fichiere}} goufe restauréiert',
 'undeletedfiles' => '$1 {{PLURAL:$1|Fichier gouf|Fichiere goufe}} restauréiert',
-'cannotundelete' => "D'Restauratioun huet net fonktionéiert. Een anere Benotzer huet déi Säit warscheinlech scho virun iech restauréiert.",
+'cannotundelete' => "D'Restauratioun huet net fonctionnéiert:
+$1",
 'undeletedpage' => "'''$1''' gouf restauréiert.
 
 Am [[Special:Log/delete|Läsch-Logbuch]] fannt Dir déi geläscht a restauréiert Säiten.",
@@ -2388,9 +2412,9 @@ $1',
 'blanknamespace' => '(Haapt)',
 
 # Contributions
-'contributions' => 'Kontributioune vum Benotzer',
+'contributions' => 'Kontributioune vum Benotzer $1',
 'contributions-title' => 'Kontributioune vum $1',
-'mycontris' => 'Meng Kontributiounen',
+'mycontris' => 'Kontributiounen',
 'contribsub2' => 'Fir $1 ($2)',
 'nocontribs' => 'Et goufe keng Ännerunge fonnt, déi dëse Kritèren entspriechen.',
 'uctop' => '(aktuell)',
@@ -2430,7 +2454,7 @@ $1',
 'whatlinkshere-hideredirs' => 'Viruleedunge $1',
 'whatlinkshere-hidetrans' => 'Agebonne Schabloune $1',
 'whatlinkshere-hidelinks' => 'Linken $1',
-'whatlinkshere-hideimages' => '$1 Linken op de Fichier',
+'whatlinkshere-hideimages' => 'Linken op Fichiere $1',
 'whatlinkshere-filters' => 'Filteren',
 
 # Block/unblock
@@ -2769,6 +2793,8 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 '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-rootpage-invalid' => 'Déi Basis-Säit déi Dir uginn hutt ass kee valabelen Titel.',
+'import-rootpage-nosubpage' => 'Am Nummraum "$1" vun der Basis-Säit si keng Ënnersäiten erlaabt.',
 
 # Import log
 'importlogpage' => 'Lëscht vun den Säitenimporten',
@@ -2780,7 +2806,6 @@ Späichert en op Ärem Computer of a luet en hei nees erop.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-Test',
-'javascripttest-disabled' => 'Dës Funktioun gouf an dëser Wiki net aktivéiert.',
 'javascripttest-title' => '$1-Tester ginn elo gemaach',
 'javascripttest-pagetext-noframework' => 'Dës Säit ass fir Java-Script-Tester reservéiert.',
 'javascripttest-pagetext-unknownframework' => 'Onbekannten Test-Framework "$1".',
@@ -2897,18 +2922,23 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 
 # Info page
 'pageinfo-title' => 'Informatioun iwwer "$1"',
+'pageinfo-not-current' => 'Pardon, et ass onméiglech dës Informatioun fir al Versiounen ze weisen.',
 'pageinfo-header-basic' => 'Basisinformatiounen',
 'pageinfo-header-edits' => 'Historique vun den Ännerungen',
 'pageinfo-header-restrictions' => 'Spär vun der Säit',
 'pageinfo-header-properties' => 'Eegeschafte vun der Säit',
 'pageinfo-display-title' => 'Titel dee gewise gëtt',
+'pageinfo-default-sort' => 'Standard-Zortéierschlëssel',
 'pageinfo-length' => 'Gréisst vun der Säit (a Bytes)',
 'pageinfo-article-id' => 'ID (Nummer) vun der Säit',
+'pageinfo-language' => 'Sprooch vum Inhalt vun der Säit',
+'pageinfo-robot-noindex' => 'Net indexéierbar',
 'pageinfo-views' => 'Zuel vun de Kéieren déi dës Säit gekuckt gouf',
 '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-subpages-value' => '$1 ($2 {{PLURAL:$2|Viruleedung|Viruleedungen}}; $3 {{PLURAL:$3|Ënnersäit|Ënnersäiten}})',
+'pageinfo-firstuser' => '1. Auteur vun der 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',
@@ -2916,10 +2946,15 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'pageinfo-authors' => 'Gesamtzuel vun de verschiddenen Auteuren',
 'pageinfo-recent-edits' => 'Zuel vun de rezenten Ännerungen (an de leschten $1)',
 'pageinfo-recent-authors' => 'Zuel vun de verschiddenen Auteuren',
-'pageinfo-restriction' => 'Protectioun vun der Säit ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magescht Wuert|Magesch Wierder}} ($1)',
 'pageinfo-hidden-categories' => 'Verstoppte {{PLURAL:$1|Kategorie|Kategorien}} ($1)',
 'pageinfo-templates' => 'Agebonne {{PLURAL:$1|Schabloun|Schabloune}} ($1)',
+'pageinfo-toolboxlink' => "Informatiounen iwwert d'Säit",
+'pageinfo-redirectsto' => 'Viruleedung op',
+'pageinfo-redirectsto-info' => 'Informatioun',
+'pageinfo-contentpage' => 'Als Säit mat Inhalt gezielt',
+'pageinfo-contentpage-yes' => 'Jo',
+'pageinfo-protect-cascading-yes' => 'Jo',
 
 # Skin names
 'skinname-standard' => 'Klassesch',
@@ -2941,6 +2976,7 @@ Dëst warscheinlech duerch en externe Link den op der schwaarzer Lëscht (blackl
 'markedaspatrollederror' => 'Kann net als "nogekuckt" markéiert ginn.',
 'markedaspatrollederrortext' => 'Dir musst eng Säitenännerung auswielen.',
 'markedaspatrollederror-noautopatrol' => 'Dir däerft Är eegen Ännerungen net als nogekuckt markéieren.',
+'markedaspatrollednotify' => 'Dës Ännerung vu(n) $1 gouf als nogekuckt markéiert.',
 
 # Patrol log
 'patrol-log-page' => 'Logbuch vun den iwwerkuckte Versiounen',
@@ -3003,6 +3039,7 @@ Duerch d'Opmaache vum Fichier kann Äre System beschiedegt ginn.",
 'hours' => '{{PLURAL:$1|enger Stonn|$1 Stonnen}}',
 'days' => '{{PLURAL:$1|engem Dag|$1 Deeg}}',
 'ago' => 'viru(n) $1',
+'just-now' => 'grad elo',
 
 # Bad image list
 'bad_image_list' => 'Format:
@@ -3176,6 +3213,7 @@ Déi aner sinn am Standard verstoppt.
 'exif-iimsupplementalcategory' => 'Zousätzlech Kategorien',
 'exif-datetimeexpires' => 'Net benotzen nom',
 'exif-datetimereleased' => 'Erausginn den',
+'exif-originaltransmissionref' => "Geo-Code vun der Plaz vu wou d'Foto iwwermëttelt gouf",
 'exif-identifier' => 'Identifiant',
 'exif-lens' => 'Objektiv dat benotzt gouf',
 'exif-serialnumber' => 'Seriennummer vun der Kamera',
@@ -3479,6 +3517,7 @@ Dëse Confirmatiouns-Code leeft den $4 of.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-Abannung ass ausgeschalt]',
 'scarytranscludefailed' => "[D'Siche no der Schabloun fir $1 huet net funktionéiert]",
+'scarytranscludefailed-httpstatus' => "[D'Oprufe vun der Schabloun $1: HTTP $2 huet net fonctionnéiert]",
 'scarytranscludetoolong' => "[D'URL ass ze laang]",
 
 # Delete conflict
@@ -3523,7 +3562,7 @@ Dëse Confirmatiouns-Code leeft den $4 of.',
 'autosumm-new' => "Säit ugeluecht mat: '$1'",
 
 # Live preview
-'livepreview-loading' => 'Lueden',
+'livepreview-loading' => 'Lueden...',
 'livepreview-ready' => 'Lueden … Fäerdeg!',
 'livepreview-failed' => "Live-Preview huet net fonctionéiert! Benotzt w.e.g. d'Fonctioun ''Kucken ouni ofzespäicheren''.",
 'livepreview-error' => "Verbindung net méiglech: $1 „$2“.
@@ -3586,6 +3625,7 @@ Dir kënnt och [[Special:EditWatchlist|de Standard Editeur benotzen]].",
 'version-license' => 'Lizenz',
 'version-poweredby-credits' => "Dës Wiki fonctionnéiert mat '''[//www.mediawiki.org/ MediaWiki]''', Copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'anerer',
+'version-credits-summary' => "Mir soen dëse Persoune 'Merci' fir hir Mataarbecht u [[Special:Version|MediaWiki]].",
 'version-license-info' => "MediaWiki ass fräi Software; Dir kënnt se weiderginn an/oder s'änneren ënnert de Bedingungen vun der GNU-General Public License esou wéi se vun der Free Softare Foundation publizéiert ass; entweder ënner der Versioun 2 vun der Lizenz, oder (no Ärem Choix) enger spéiderer Versioun.
 
 MediaWiki gëtt verdeelt an der Hoffnung datt se nëtzlech ass, awer OUNI IERGENDENG GARANTIE; ouni eng implizit Garantie vu Commercialisatioun oder Eegnung fir e bestëmmte Gebrauch. Kuckt d'GPU Geral Public License fir méi Informatiounen.
@@ -3722,9 +3762,9 @@ Den ugefrote Fichier gëtt direkt gewise respektiv mat enger verbonner Applikati
 'logentry-move-move_redir-noredirect' => "$1 huet d'Säit $3 op $4 geréckelt an dobäi gouf eng Viruleedung iwwerschriwwen an et et gouf keng nei Viruleedung ugeluecht",
 'logentry-patrol-patrol' => "$1 huet d'Versioun $4 vun der Säit $3 als nogekuckt markéiert",
 'logentry-patrol-patrol-auto' => "$1 huet d'Versioun $4 vun der Säit $3 automatesch als nogekuckt markéiert",
-'logentry-newusers-newusers' => '$1  huet e Benotzerkont ugeluecht',
-'logentry-newusers-create' => '$1  huet e Benotzerkont ugeluecht',
-'logentry-newusers-create2' => '$1 huet ee Benotzerkont ugeluecht $3',
+'logentry-newusers-newusers' => 'De Benotzerkont $1 gouf ugeluecht',
+'logentry-newusers-create' => 'De Benotzerkont $1 gouf ugeluecht',
+'logentry-newusers-create2' => 'De Benotzerkont $3 gouf vum $1 ugeluecht',
 'logentry-newusers-autocreate' => 'De Benotzerkont $1 gouf automatesch ugeluecht',
 'newuserlog-byemail' => "d'Passwuert gouf per E-Mail geschéckt",
 
@@ -3744,6 +3784,10 @@ Soss kënnt Dir den einfache Formulär hei drënner benotzen. Är Bemierkung gë
 'feedback-bugcheck' => 'Super! Kuckt just no ob et net ee vun de schonns [$1 bekannte Feeler] ass.',
 'feedback-bugnew' => 'Ech hunn et nogekuckt. Den neie Bug mellen',
 
+# Search suggestions
+'searchsuggest-search' => 'Sichen',
+'searchsuggest-containing' => 'mat ...',
+
 # API errors
 'api-error-badaccess-groups' => 'Et ass Iech net erlaabt fir Fichieren op dës Wiki eropzelueden.',
 'api-error-badtoken' => 'Interne Feeler: falschen Token.',
index abc9e2c..ae90ef0 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Ð\9bаккÑ\83 (Ð\9bакку)
+/** Ð»Ð°ÐºÐºÑ\83 (лакку)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -46,44 +46,44 @@ $linkTrail = '/^([a-zабвгдеёжзийклмнопрстуфхцчшщъы
 
 $messages = array(
 'article' => 'Тарих',
-'mytalk'  => 'На цӀухху-бусу байсса интернетрал лажин',
+'mytalk' => 'На цӀухху-бусу байсса интернетрал лажин',
 
 # Cologne Blue skin
 'qbedit' => 'Дакьин дуван',
 
-'history'          => 'Тарих',
-'history_short'    => 'Тарих',
-'edit'             => 'Дакьин дуван',
+'history' => 'Тарих',
+'history_short' => 'Тарих',
+'edit' => 'Дакьин дуван',
 'talkpagelinktext' => 'Ихтилат',
-'talk'             => 'Ихтилат',
+'talk' => 'Ихтилат',
 
 # 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).
-'currentevents'        => 'Нанисса ишру',
-'currentevents-url'    => 'Project:Нанисса ишру',
-'mainpage'             => 'Агьаммур лажин',
+'currentevents' => 'Нанисса ишру',
+'currentevents-url' => 'Project:Нанисса ишру',
+'mainpage' => 'Агьаммур лажин',
 'mainpage-description' => 'Агьаммур лажин',
 
 'editsection' => 'дакьин дуван',
-'editold'     => 'дакьин дуван',
+'editold' => 'дакьин дуван',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Тарих',
-'nstab-user'     => 'Гьуртту хьума',
-'nstab-special'  => 'Къуллугъирал лажин',
-'nstab-image'    => 'Сурат',
+'nstab-main' => 'Тарих',
+'nstab-user' => 'Гьуртту хьума',
+'nstab-special' => 'Къуллугъирал лажин',
+'nstab-image' => 'Сурат',
 'nstab-template' => 'Шаблон',
 'nstab-category' => 'Категория',
 
 # Login and logout pages
-'userlogin'  => 'Системалухь цу уссарав бусан',
-'logout'     => 'Уккаву',
+'userlogin' => 'Системалухь цу уссарав бусан',
+'logout' => 'Уккаву',
 'userlogout' => 'Уккаву',
 
 # Edit pages
-'minoredit'   => 'Мюрщсса дахханашиву',
-'watchthis'   => 'Ва лажин ябитаврил сияхӀравун ххи дан',
+'minoredit' => 'Мюрщсса дахханашиву',
+'watchthis' => 'Ва лажин ябитаврил сияхӀравун ххи дан',
 'savearticle' => 'Лажин ядан',
-'preview'     => 'Цалсса ххалбаву',
+'preview' => 'Цалсса ххалбаву',
 'showpreview' => 'Цалсса ххалбаву',
 
 # Recent changes
@@ -91,7 +91,7 @@ $messages = array(
 
 # File description page
 'file-anchor-link' => 'Сурат',
-'filehist-user'    => 'Гьурттучув',
+'filehist-user' => 'Гьурттучув',
 
 # Miscellaneous special pages
 'move' => 'ЦӀа даххана дан',
@@ -104,12 +104,12 @@ $messages = array(
 
 # Watchlist
 'watchlist' => 'Ябитаврил сияхӀ',
-'watch'     => 'Хъирив агьан',
-'unwatch'   => 'Хъирив къаагьан',
+'watch' => 'Хъирив агьан',
+'unwatch' => 'Хъирив къаагьан',
 
 # Contributions
 'contributions' => 'Гьурттучунал бутӀа',
-'mycontris'     => 'Ттул даву',
+'mycontris' => 'Ттул даву',
 
 'sp-contributions-talk' => 'Ихтилат',
 
index ffe54c2..b6980d7 100644 (file)
@@ -148,7 +148,6 @@ $messages = array(
 'qbbrowse' => 'Килигун',
 'qbedit' => 'Дегишарун',
 'qbpageoptions' => 'Ччинин низамарунар',
-'qbpageinfo' => 'Ччиникай малумат',
 'qbmyoptions' => 'Зи ччинар',
 'qbspecialpages' => 'Кьетlен хъувун',
 'faq' => 'Фад-фад гузвай жузунар (ФГЖ)',
@@ -304,6 +303,7 @@ $messages = array(
 'missingarticle-rev' => '(жуьре#: $1)',
 'internalerror' => 'КЪенепатан гъалатI',
 'internalerror_info' => 'КЪенепатан гъалатI $1',
+'filecopyerror' => 'Kopi aqudiz jezach fail "$1"  "$2" - diz.',
 'filerenameerror' => '«$1» файл  «$2» -з тIвар эхцигиз жезвач..',
 'badarticleerror' => 'И ччина и кар кьилиз акъудиз мумкин ттуш.',
 'cannotdelete-title' => ' "$1" ччин алудиз жезвач',
@@ -421,8 +421,8 @@ $messages = array(
 <span class="plainlinks"> [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затIар жугъуриз],
 ва я [{{fullurl:{{FULLPAGENAME}}|action=edit}} и тlвар алай ччин туькIуьриз жеда] </span>.',
 'noarticletext-nopermission' => 'Исятда и  ччина са текстни авач.
-Квевай [[Special:Search/{{PAGENAME}}| и тlвар алай ччин]] муькуь ччинра жугъуриз ва я
-<span class="plainlinks"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затIар жугъуриз] жеда.',
+Квевай [[Special:Search/{{PAGENAME}}| и тӀвар алай ччин]] муькуь ччинра жугъуриз ва я
+<span class="plainlinks"> [{{fullurl: {{# Special:Log}} | page = {{FULLPAGENAMEE}}}} журналрин талукь тир кхьей затӀар жугъуриз] жеда.',
 'blocked-notice-logextract' => 'И уртах алайчIава блокарнава.
 Агъадихъ блокарунин журналдикай эхиримжи кхьинар къалурнава:',
 'previewnote' => "'''Рикlел хуьх хьи, им анжах сифтедин килигун я.'''  
@@ -523,7 +523,7 @@ $messages = array(
 'revertmerge' => 'Ччара авун',
 
 # Diffs
-'history-title' => '$1  -  масакIавилерин тарих',
+'history-title' => 'Masak\'avilerin q\'isa "$1"',
 'lineno' => 'ЦIар $1:',
 'compareselectedversions' => 'Хкягъай жуьреяр гекъигун',
 'editundo' => 'гьич авун',
@@ -567,8 +567,6 @@ $messages = array(
 'search-interwiki-caption' => 'Мукьва проект',
 'search-interwiki-default' => '$1(жавабар)',
 'search-interwiki-more' => '(мадни)',
-'search-mwsuggest-enabled' => 'меслятар галаз',
-'search-mwsuggest-disabled' => 'меслятар галачиз',
 'search-relatedarticle' => 'Галкlанавай',
 'searchrelated' => 'Галкlанавай',
 'searchall' => 'вири',
@@ -595,7 +593,7 @@ $messages = array(
 
 # Preferences page
 'preferences' => 'Туькlуьрун',
-'mypreferences' => 'Зи низамарунар',
+'mypreferences' => 'Zi tïķïrunar',
 'prefs-edits' => 'Дьузар хъувунрин кьадар',
 'prefsnologin' => 'Куьне гьахьнавач',
 'changepassword' => 'Парол дегишарун',
@@ -954,9 +952,6 @@ $messages = array(
 'watching' => 'Килигун...',
 'unwatching' => 'Амма клигнай',
 
-'changed' => 'дегишнава',
-'created' => 'туькIуьрнава',
-
 # Delete
 'deletepage' => 'Къакъудун хъувун',
 'confirm' => 'Тестикьун',
@@ -1057,7 +1052,7 @@ $messages = array(
 'whatlinkshere-hideredirs' => '$1 рахкъурунар',
 'whatlinkshere-hidetrans' => '$1 кутунар',
 'whatlinkshere-hidelinks' => '$1 элячlунар',
-'whatlinkshere-hideimages' => '$1 шикилриз элячIунар',
+'whatlinkshere-hideimages' => '$1 шикилриз элячӀунар',
 'whatlinkshere-filters' => 'Куьзунагар',
 
 # Block/unblock
index 024c56a..6fe00d0 100644 (file)
@@ -152,7 +152,6 @@ $messages = array(
 'qbbrowse' => 'Surfa',
 'qbedit' => 'Edita',
 'qbpageoptions' => 'Esta paje',
-'qbpageinfo' => 'Situa',
 'qbmyoptions' => 'Me pajes',
 'qbspecialpages' => 'Pajes spesial',
 
@@ -443,8 +442,6 @@ La arcivo de sutraes per esta paje es asi per conveni:",
 'search-section' => '(sesion $1)',
 'search-interwiki-default' => 'Resultas de $1:',
 'search-interwiki-more' => '(plu)',
-'search-mwsuggest-enabled' => 'con sujestes',
-'search-mwsuggest-disabled' => 'zero sujestes',
 'searchall' => 'tota',
 'powersearch' => 'Xerca avansada',
 
@@ -690,9 +687,6 @@ Si tu vole sutrae la paje de tu lista de pajes oservada en la futur, clica a \"n
 'watching' => 'Oserva...',
 'unwatching' => 'No oserva...',
 
-'enotif_newpagetext' => 'Esta es un paje nova',
-'created' => 'Creada',
-
 # Delete
 'deletepage' => 'Sutrae la paje',
 'confirm' => 'Aproba',
index 88b41b4..eff69e3 100644 (file)
@@ -400,11 +400,8 @@ Ensonga gy\'awadde eri nti "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Kati ovuddemu.'''
 
-Osobola okusigala nga okozesa {{SITENAME}} nga at'eyanjudde, ate osobola [[Special:UserLogin|n'okuddamu okuyingira]] nga bw'obadde oba nga okozesezza ery'obwa memba eddala.
+Osobola okusigala nga okozesa {{SITENAME}} nga at'eyanjudde, ate osobola <span class='plainlinks'>[$1 n'okuddamu okuyingira]</span> nga bw'obadde oba nga okozesezza ery'obwa memba eddala.
 Wekkaanye, empapula ezimu ziyinza okukweyolekera nga bwe zibadde nga oyingidde - okutuusa lw'okunkumula eggwanika ezzibizi erya kalambula-neti yo.",
-'welcomecreation' => "== $1 tukwanirizza! == <br />
-Akawunti yo ekoledwa.<br />
-Tewerabira kwetereereza [[Special:Preferences|enteekateeka yo ey'oku {{SITENAME}}]].",
 'yourname' => "Ery'obwa memba",
 'yourpassword' => 'Ekigambo ekikuumi',
 'yourpasswordagain' => 'Ddamu ekigambo ekikuumi',
@@ -844,8 +841,6 @@ oba ku gano agali ku lupapula luno.<br />
 'search-interwiki-caption' => "Pulojekiti ezikolagana n'eno",
 'search-interwiki-default' => 'ebizuulidwa ku $1:',
 'search-interwiki-more' => '(ebikyaliyo)',
-'search-mwsuggest-enabled' => 'mpeeraako amagezi',
-'search-mwsuggest-disabled' => "sisitemu ereme okuteebereza ky'onoonya",
 'searchall' => '',
 'nonefound' => "'''Wekkaanye''': Okunoonya kuno kukoma mu makuŋaanyizo amalondemu okugyako nga okulagidde okweyonera awalala.
 W'owandikira by'onoonya bw'osoosawo akagambo ''all:'', okunoonya kubuna Wikipediya yonna. Bw'obanga olina ekkuŋaanyizo limu lyokka lyoyagala okunoonyezamu, soosawo erinnya lyalyo w'owandikira by'onoonya.",
index 2487b54..cd3c801 100644 (file)
@@ -301,7 +301,6 @@ $messages = array(
 'qbbrowse' => 'Bladere',
 'qbedit' => 'Bewirke',
 'qbpageoptions' => 'Pagina-opties',
-'qbpageinfo' => 'Pagina-informatie',
 'qbmyoptions' => 'mien opties',
 'qbspecialpages' => "Speciaal pagina's",
 'faq' => 'FAQ (väölgesjtèlde vraoge)',
@@ -558,11 +557,8 @@ d\'n Opgegaeve raej vanne sloetendje admin waar "\'\'$3\'\'".',
 # Login and logout pages
 'logouttext' => "'''De bis noe aafgemeld.'''
 
-De kèns {{SITENAME}} noe anoniem (mit vermeljing van IP-adres) gebroeke, of [[Special:UserLogin|opnuuj aanmelde]] ónger dezelfde of 'ne angere naam.
+De kèns {{SITENAME}} noe anoniem (mit vermeljing van IP-adres) gebroeke, of <span class='plainlinks'>[$1 opnuuj aanmelde]</span> ónger dezelfde of 'ne angere naam.
 Mäögelik waert nog 'n deil pagina's getuind esofs te nog aangemeld bis pès te de cache van diene browser laeg maaks.",
-'welcomecreation' => '== Wèlkóm, $1! ==
-Diene gebroeker is noe vaerdig.
-Vergaet neet dien [[Special:Preferences|veurkäöre veur {{SITENAME}}]] aan te passe.',
 'yourname' => 'Diene gebroekersnaam',
 'yourpassword' => 'Die wachwaord',
 'yourpasswordagain' => 'Wachwaord opnuuj intype',
@@ -1147,8 +1143,6 @@ Wees zeker det deze wieziging de gesjiedenisdoorloupendheid van de pagina zal be
 'search-interwiki-caption' => 'Zösterprojecte',
 'search-interwiki-default' => '$1 resultate:',
 'search-interwiki-more' => '(meer)',
-'search-mwsuggest-enabled' => 'mit suggesties',
-'search-mwsuggest-disabled' => 'gein suggesties',
 'search-relatedarticle' => 'Gerelateerd',
 'mwsuggest-disable' => 'Suggesties via AJAX oetsjakele',
 'searcheverything-enable' => 'Zeuke in alle naamruumdes',
@@ -2139,11 +2133,7 @@ Toekomstige verangeringe aan dees pagina en de biebehurende euverlèkpagina weur
 
 'enotif_mailer' => '{{SITENAME}} notificatiemail',
 'enotif_reset' => "Mèrk alle bezochde pazjena's aan.",
-'enotif_newpagetext' => "DIt is 'n nuuj pazjena.",
 'enotif_impersonal_salutation' => '{{SITENAME}} gebroeker',
-'changed' => 'verangerd',
-'created' => 'aangemaak',
-'enotif_subject' => 'De {{SITENAME}}pagina $PAGETITLE is $CHANGEDORCREATED door $PAGEEDITOR',
 'enotif_lastvisited' => 'Zuug $1 veur al verangeringe saer dien lèste bezeuk.',
 'enotif_lastdiff' => 'Zuug $1 om deze wieziging te zeen.',
 'enotif_anon_editor' => 'anonieme gebroeker $1',
@@ -2730,7 +2720,6 @@ Slaon de oetveur op dien eige systeem op, en voeg dae dao nao hiej toe.',
 
 # JavaScriptTest
 'javascripttest' => 'Tes JavaScript',
-'javascripttest-disabled' => 'Dees funksje steit oet op deze wiki.',
 'javascripttest-title' => 'Veur tes oet veur $1',
 'javascripttest-pagetext-noframework' => "Dees pagina is gerizzerveerd veur 't oetveure van JavaScriptteste.",
 'javascripttest-pagetext-unknownframework' => 'Ónbekèndje testframework "$1".',
@@ -3678,6 +3667,10 @@ Anges kin se-n ouch \'t einvawdig formeleer hieónger gebroeke. Dien commentaar
 'feedback-bugcheck' => "Good! Kónterleer ef of 't neet al ein vanne [$1 bekèndje bugs] is.",
 'feedback-bugnew' => "Gekónterleerdj. Mèlj 'ne nuuj bug.",
 
+# Search suggestions
+'searchsuggest-search' => 'Zeuke',
+'searchsuggest-containing' => 'bevat...',
+
 # API errors
 'api-error-badaccess-groups' => 'Doe moogs gein bestenj uploade óp deze wiki.',
 'api-error-badtoken' => 'Intern fout: toke is slech.',
index 04cfd83..18a6cd8 100644 (file)
@@ -232,7 +232,6 @@ $messages = array(
 'qbfind' => 'Attrêuva',
 'qbedit' => 'Cangia',
 'qbpageoptions' => "Opsioîn de 'sta paggina",
-'qbpageinfo' => 'Informassion inscia paggina',
 'qbmyoptions' => 'E mæ paggine',
 'qbspecialpages' => 'Pagine speçiä',
 'faq' => 'Domande frequenti',
@@ -379,9 +378,6 @@ Pe favô ti peu segnalâ quello che l'é sucesso a in [[Special:ListUsers/sysop|
 'viewsourcetext' => "O l'è poscibbile vedde e copiâ o còddice sorgente de 'sta paggina:",
 
 # Login and logout pages
-'welcomecreation' => "== Benvegnûo, $1! ==
-
-O teu account o l'è stæto creòu bén. No te ascordâ de cangiâ e teu {{SITENAME}}.[[Special:Preferences|preferençe de {{SITENAME}}]].",
 'yourname' => 'Nomme',
 'yourpassword' => 'Pòula segretta:',
 'yourpasswordagain' => 'Scrivi tórna a pòula segrétta:',
@@ -908,7 +904,6 @@ Ti te peu strinza a vista se ti te çerni un tipo de registro, un nomme de un ut
 'watching' => 'Inti osservæ speçiâli...',
 'unwatching' => 'Scassâ da-i osservæ speçiâli',
 
-'changed' => 'cangiâ',
 'enotif_anon_editor' => 'ûtente anònnimo $1',
 
 # Delete
index 67e530b..a76dd63 100644 (file)
@@ -348,8 +348,6 @@ Legend: '''({{int:cur}})''' = vaiţīd līdzinţõmizõks lǟndz redaktsijõks,,
 'search-interwiki-caption' => 'Sõzār-projektõd',
 'search-interwiki-default' => '$1 rezultātõd:',
 'search-interwiki-more' => ' (vel)',
-'search-mwsuggest-enabled' => 'jeddõpandõkstõks',
-'search-mwsuggest-disabled' => 'jeddõpandõkši äb ūo',
 'searchrelated' => 'sidtõd',
 'searchall' => 'tikkiž',
 'showingresultsheader' => "{{PLURAL:$5|'''$1''' '''$3'''-st rezultātõst|Rezultātõd '''$1–$2''' '''$3'''-st}} kizzimizõn '''$4'''",
index 5c281d7..9a48f44 100644 (file)
@@ -235,7 +235,6 @@ süi titul dai sezziún (JavaScript)',
 'qbbrowse' => 'Sföja',
 'qbedit' => 'Mudifega',
 'qbpageoptions' => 'Opzión de la pagina',
-'qbpageinfo' => 'Infurmazión revard a la pagina',
 'qbmyoptions' => 'I mè paginn',
 'qbspecialpages' => 'Paginn special',
 'faq' => 'FAQ',
@@ -420,10 +419,8 @@ Per piasè, fa raport a 'n'[[Special:ListUsers/sysop|aministradur]], cun la nota
 # Login and logout pages
 'logouttext' => "'''Adess a sii descuness.'''
 
-A pudé andà inanz a druvà la {{SITENAME}} in manera anònima, o a pudé [[Special:UserLogin|cunètev anmò]] cun l'istess suranomm o cun un suranomm diferent.
+A pudé andà inanz a druvà la {{SITENAME}} in manera anònima, o a pudé <span class='plainlinks'>[$1 cunètev anmò]</span> cun l'istess suranomm o cun un suranomm diferent.
 Tegné cünt che certi paginn pödass che i seguiten a vedess tant 'me se a füdìssuv anmò cuness, fin quand che hii nò vudaa 'l ''cache'' del voster browser.",
-'welcomecreation' => "== Benvegnüü, $1! ==
-'L to cünt l'è staa pruntaa. Desmenteghet mía de mudifegà i to [[Special:Preferences|preferenz de {{SITENAME}}]].",
 'yourname' => 'El to suranóm:',
 'yourpassword' => "Parola d'urdin",
 'yourpasswordagain' => "Mett dent ammò la parola d'urdin",
@@ -628,8 +625,6 @@ Per infurmazion, varda ind el [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGE
 'search-interwiki-caption' => 'Pruget fredej',
 'search-interwiki-default' => '$1 resültaa',
 'search-interwiki-more' => '(püssee)',
-'search-mwsuggest-enabled' => 'cun sügeriment',
-'search-mwsuggest-disabled' => 'senza sügeriment',
 'nonefound' => "''''Tenzión''': la ricerca la vegn fada in utumategh dumà per un quaj namespace.
 Pröa a giuntagh denanz a la tò ricerca ''all:'' per cercà in tücc i namespace (cumpres i discüssión, i mudel, etc...) o dupra el namespace vursüü 'me prefiss.",
 'powersearch' => 'Truvá',
@@ -977,9 +972,6 @@ i vegnarann segnalaa chichinscì e la pagina la se vedarà cun caràter '''grev'
 'watching' => "Giuntà ai pagin da ten d'ögg...",
 'unwatching' => "Eliminà dai pagin da ten d'ögg...",
 
-'enotif_newpagetext' => "Chesta-chí l'è una pàgina növa.",
-'changed' => 'cambiaa',
-'enotif_subject' => 'La pagina $PAGETITLE de {{SITENAME}} l\'è stada $CHANGEDORCREATED da $PAGEEDITOR',
 'enotif_lastvisited' => 'Varda $1 per vedè tüt i mudifegh da la tua ültema vìsita.',
 'enotif_body' => 'Cara $WATCHINGUSERNAME,
 
index bf0b9d6..3d0999f 100644 (file)
@@ -96,7 +96,6 @@ $messages = array(
 'qbfind' => 'Koluka',
 'qbbrowse' => 'Kolúka',
 'qbedit' => 'Kobɔngisa',
-'qbpageinfo' => 'Context',
 'qbspecialpages' => 'Nkásá gudi',
 'faq' => 'Mitúná Mizóngelaka (MM)',
 
@@ -231,6 +230,7 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'viewsource' => 'Komɔ́nisa mosólo',
 
 # Login and logout pages
+'welcomeuser' => 'Mbɔ́tɛ na Wikipedia, $1',
 'yourname' => 'Nkómbó ya mosáleli:',
 'yourpassword' => 'Banda nayó:',
 'yourpasswordagain' => 'Banda naíno:',
@@ -259,6 +259,10 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'passwordreset-username' => 'Nkómbó ya mosáleli:',
 'passwordreset-email' => 'Adɛlɛ́sɛ-ímɛ́lɛ:',
 
+# Special:ChangeEmail
+'changeemail-none' => '(mɔ́kɔ́ tɛ́)',
+'changeemail-cancel' => 'Kozóngela',
+
 # Edit page toolbar
 'bold_sample' => 'Nkomá ya mbinga',
 'bold_tip' => 'Nkomá ya mbinga',
@@ -282,6 +286,7 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'preview' => 'Botáli',
 'showpreview' => 'Kotála yambo',
 'showdiff' => 'Komɔ́nisa mbóngwana',
+'loginreqlink' => 'komíkitola (log in)',
 'newarticle' => '(Sika)',
 'editing' => 'Kokoma «$1»',
 'editingsection' => 'Bobɔngisi ya «$1» (sɛksió)',
@@ -292,6 +297,10 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'template-protected' => '(na bobáteli)',
 'template-semiprotected' => '(na bobáteli ya ndámbo)',
 
+# Content models
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # History pages
 'viewpagelogs' => 'Komɔ́nisa zuluná ya lonkásá loye',
 'currentrev' => 'Lizóngeli na mosálá',
@@ -304,9 +313,17 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'last' => 'ya nsúka',
 'histfirst' => 'ya yambo',
 'histlast' => 'ya nsúka',
+'historyempty' => '(mpámba)',
+
+# Revision feed
+'history-feed-item-nocomment' => '$1 o $2',
 
 # Revision deletion
 'rev-delundel' => 'komɔ́nisa/kobomba',
+'rev-showdeleted' => 'komɔ́nisa',
+'revdelete-show-file-submit' => 'Ɛɛ',
+'revdelete-radio-set' => 'Ɛɛ',
+'revdelete-radio-unset' => 'Tɛ́',
 'revdel-restore' => 'kobóngola emɔnanela',
 
 # Merge log
@@ -340,8 +357,6 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'search-suggest' => 'Ómeka na lokomá : $1',
 'search-interwiki-default' => 'Bozwi bwa $1 :',
 'search-interwiki-more' => '(elekí)',
-'search-mwsuggest-enabled' => 'na bokáni',
-'search-mwsuggest-disabled' => 'na bokáni tɛ́',
 'searchall' => 'nyɔ́nsɔ',
 'nonefound' => "'''Notí''' : Boluki bwa likwá bosálí na ndámbo ya ntáká ya nkómbó.
 Ómeka kobakisa ''all:'' o libóso lya esɛ́ngi mpɔ̂ na koluka maloba ma nkomá mánsɔ (ekɔ́tí ntembe, bimekisele, b.n.b.), tǒ kobakisa ntáka ya nkómbó eye olingí o libóso.",
@@ -350,17 +365,36 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'powersearch-ns' => 'Koluka o ntáká ya nkómbó :',
 'powersearch-redir' => 'Kotíya molɔngɔ́ mwa mayendisi',
 'powersearch-field' => 'Koluka',
+'powersearch-toggleall' => 'Nyɔ́nsɔ',
+'powersearch-togglenone' => 'Mɔ́kɔ́ tɛ́',
+
+# Quickbar
+'qbsettings-none' => 'Mɔ́kɔ́ tɛ́',
 
 # Preferences page
 'preferences' => 'Malúli',
 'mypreferences' => 'Malúli ma ngáí',
+'skin-preview' => 'Botáli',
 'prefs-datetime' => 'Mokɔlɔ mpé ntángo',
 'prefs-rc' => 'Mbóngwana ya nsúka',
 'saveprefs' => 'kobómbisa',
+'rows' => 'Mikɔlɔ́tɔ:',
+'columns' => 'Makonzí:',
 'searchresultshead' => 'Boluki',
+'timezonelegend' => 'Ndámbo ya ngonga:',
+'localtime' => "Ngonga y'epái:",
+'timezoneregion-africa' => 'Afríka',
+'timezoneregion-america' => 'Ameríka',
+'timezoneregion-antarctica' => 'Antarktíka',
+'timezoneregion-arctic' => 'Arktíka',
+'timezoneregion-asia' => 'Azía',
+'timezoneregion-atlantic' => 'Atlantíki (lombú monɛ́nɛ)',
+'timezoneregion-europe' => 'Erópa',
+'timezoneregion-indian' => 'India (lombú monɛ́nɛ)',
+'timezoneregion-pacific' => 'Pasifíki (lombú monɛ́nɛ)',
 'allowemail' => 'Enable mokánda from other users',
 'youremail' => 'Mokandá (e-mail) *',
-'username' => 'Nkómbó ya mosáleli :',
+'username' => 'Nkómbó ya mosáleli:',
 'yourrealname' => 'nkómbó ya sɔ̂lɔ́',
 'yourlanguage' => 'Lokótá',
 'email' => 'Mokánda',
@@ -457,7 +491,7 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'shortpages' => 'Nkásá ya mokúsé',
 'longpages' => 'Nkásá ya molaí',
 'newpages' => 'Ekakoli ya sika',
-'newpages-username' => 'Nkómbó ya mosáleli :',
+'newpages-username' => 'Nkómbó ya mosáleli:',
 'move' => 'Kobóngola nkómbó',
 'movethispage' => 'Kobóngola nkómbó ya lonkásá loye',
 
@@ -508,8 +542,6 @@ Ezalí listɛ́ ya nkásá gudi bizalí  na [[Special:SpecialPages|{{int:special
 'watching' => 'Kolanda...',
 'unwatching' => 'Kolanda tɛ́...',
 
-'created' => 'ekomákí',
-
 # Delete
 'deletepage' => 'Kolímwisa lonkásá loye',
 'dellogpage' => 'zuluná ya bolímwisi',
index 9669b31..75de322 100644 (file)
@@ -345,9 +345,6 @@ $messages = array(
 
 ທ່ານ ສາມາດສືບຕໍ່ໃຊ້ {{SITENAME}} ແບບບໍ່ສະແດງຊື່, ຫຼື ທ່ານ ສາມາດ ເຊັນເຂົ້າ ອີກ ໂດຍ ຊື່ຜູ້ໃຊ້ ເກົ່າ ຫຼື ໃໝ່ ກໍ່ໄດ້.
 ກະລຸນາ ຮັບຊາບວ່າ ບາງໜ້າ ອາດຈະສືບຕໍ່ ສະແດງ ຄືວ່າ ທ່ານ ຍັງເຊັນເຂົ້າຢູ່ ຈົນກວ່າ ທ່ານ ຂໍ້ມູນບັນທຶກຊົ່ວຄາວ ໃນ ໂປຣແກຣມທ່ອງເວັບ ຂອງ ທ່ານ ຈະຖືກລຶບ.",
-'welcomecreation' => '== ຍິນດີຕ້ອນຮັບ, $1! ==
-
-ບັນຊີ ຂອງທ່ານ ຖືກສ້າງຂຶ້ນແລ້ວ. ຢ່າລືມ ຕັ້ງຄ່າ ທ່ານ ຢູ່ {{SITENAME}}.',
 'yourname' => 'ຊື່ຜູ້ໃຊ້',
 'yourpassword' => 'ລະຫັດຜ່ານ',
 'yourpasswordagain' => 'ພິມລະຫັດຜ່ານອີກ',
@@ -483,8 +480,6 @@ $messages = array(
 'search-result-size' => '$1 ({{PLURAL:$2|1 ຄຳ|$2 ຄຳ}})',
 'search-result-score' => 'ຄວາມກ່ຽວຂ້ອງ: $1%',
 'search-redirect' => '(ໂອນ $1)',
-'search-mwsuggest-enabled' => 'ແບບມີຄຳແນະນຳ',
-'search-mwsuggest-disabled' => 'ແບບບໍ່ມີຄຳແນະນຳ',
 'search-relatedarticle' => 'ກ່ຽວຂ້ອງ',
 'mwsuggest-disable' => 'ບໍ່ໃຊ້ການແນະນຳ ໂດຍ AJAX',
 'searchrelated' => 'ກ່ຽວຂ້ອງ',
@@ -726,9 +721,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'watching' => 'ພວມຕິດຕາມ...',
 'unwatching' => 'ພວມເຊົາຕິດຕາມ...',
 
-'enotif_newpagetext' => 'ນີ້ແມ່ນໜ້າໃໝ່.',
-'changed' => 'ປ່ຽນແລ້ວ',
-'created' => 'ສ້າງແລ້ວ',
 'enotif_lastvisited' => 'ເບິ່ງ $1 ເພື່ອ ທຸກໆການປ່ຽນແປງ ຕັ້ງແຕ່ເທື່ອສຸດທ້າຍ ທີ່ ທ່ານເຂົ້າຫາ.',
 
 # Delete
index 762c1e8..44fcc3d 100644 (file)
@@ -41,7 +41,6 @@ $messages = array(
 'tog-uselivepreview' => 'Sebelize live PendiBe (bulukezi JavaScript) (yem nca)',
 'tog-watchlisthideown' => 'Cwankekile zwa afina di zwa mukoloko di kentezi',
 'tog-watchlisthidebots' => 'Cwankekile roboti di zwa mukoloko di kentezi',
-'tog-nolangconversion' => 'Dinyembulisize selti konfesyoni',
 'tog-ccmeonemails' => 'Afi di zwa dubina di melina a afi di xetewi sebelu',
 'tog-diffonly' => 'Ni sa kamukile petulo selt pre petuho',
 
@@ -125,7 +124,6 @@ $messages = array(
 'qbbrowse' => 'Nepile',
 'qbedit' => "Hloli ye ng'i",
 'qbpageoptions' => 'Bye petulo',
-'qbpageinfo' => 'Petulo tuto',
 'qbmyoptions' => 'Zwa petulona',
 'qbspecialpages' => 'Petulo zwenti',
 'faq' => 'Alabile',
@@ -735,10 +733,7 @@ A sa afi kulobala di zwa mukoloko di kentezi, tampi \"ngambu kentezi\".",
 'watching' => 'Kentezi...',
 'unwatching' => 'Dikentezi...',
 
-'enotif_newpagetext' => 'Bye sa nca petulo.',
 'enotif_impersonal_salutation' => '{{SITENAME}} sebelu',
-'changed' => 'petuhoni',
-'created' => 'hlolini',
 
 # Delete
 'deletepage' => 'Afi kulobala petulo',
index 0e446f3..d1914ab 100644 (file)
@@ -315,7 +315,7 @@ $messages = array(
 'newwindow' => '(atsidaro naujame lange)',
 'cancel' => 'Atšaukti',
 'moredotdotdot' => 'Daugiau...',
-'mypage' => 'Mano puslapis',
+'mypage' => 'Naudotojo puslapis',
 'mytalk' => 'Mano aptarimas',
 'anontalk' => 'Šio IP aptarimas',
 'navigation' => 'Naršymas',
@@ -326,7 +326,6 @@ $messages = array(
 'qbbrowse' => 'Naršymas',
 'qbedit' => 'Taisyti',
 'qbpageoptions' => 'Šis puslapis',
-'qbpageinfo' => 'Kontekstas',
 'qbmyoptions' => 'Mano puslapiai',
 'qbspecialpages' => 'Specialieji puslapiai',
 'faq' => 'DUK',
@@ -588,11 +587,8 @@ Ją užrakinęs administratorius pateikė šį paaiškinimą: "$3".',
 # Login and logout pages
 'logouttext' => "'''Dabar jūs esate atsijungęs.'''
 
-Galite toliau naudoti {{SITENAME}} anonimiškai arba [[Special:UserLogin|prisijunkite]] iš naujo tuo pačiu ar kitu naudotoju.
+Galite toliau naudoti {{SITENAME}} anonimiškai arba <span class='plainlinks'>[$1 prisijunkite]</span> iš naujo tuo pačiu ar kitu naudotoju.
 Pastaba: kai kuriuose puslapiuose ir toliau gali rodyti, kad esate prisijungęs iki tol, kol išvalysite savo naršyklės podėlį.",
-'welcomecreation' => '== Sveiki, $1! ==
-
-Jūsų paskyra buvo sukurta. Nepamirškite pakeisti savo [[Special:Preferences|{{SITENAME}} nustatymų]].',
 'yourname' => 'Naudotojo vardas:',
 'yourpassword' => 'Slaptažodis:',
 'yourpasswordagain' => 'Pakartokite slaptažodį:',
@@ -1178,8 +1174,6 @@ Prašome patikrinti sąrašus.',
 'search-interwiki-caption' => 'Dukteriniai projektai',
 'search-interwiki-default' => '$1 rezultatai:',
 'search-interwiki-more' => '(daugiau)',
-'search-mwsuggest-enabled' => 'su pasiūlymais',
-'search-mwsuggest-disabled' => 'nėra pasiūlymų',
 'search-relatedarticle' => 'Susiję',
 'mwsuggest-disable' => 'Slėpti AJAX pasiūlymus',
 'searcheverything-enable' => 'Ieškoti visose vardų srityse',
@@ -2151,11 +2145,7 @@ taip pat bus '''paryškinti''' [[Special:RecentChanges|naujausių keitimų sąra
 
 'enotif_mailer' => '{{SITENAME}} Pranešimų sistema',
 'enotif_reset' => 'Pažymėti visus puslapius kaip aplankytus',
-'enotif_newpagetext' => 'Tai naujas puslapis.',
 'enotif_impersonal_salutation' => '{{SITENAME}} naudotojau',
-'changed' => 'pakeitė',
-'created' => 'sukurė',
-'enotif_subject' => '{{SITENAME}} projekte $PAGEEDITOR $CHANGEDORCREATED $PAGETITLE',
 'enotif_lastvisited' => 'Užeikite į $1, jei norite matyti pakeitimus nuo paskutiniojo apsilankymo.',
 'enotif_lastdiff' => 'Užeikite į $1, jei norite pamatyti šį pakeitimą.',
 'enotif_anon_editor' => 'anoniminis naudotojas $1',
@@ -2778,7 +2768,6 @@ Išsaugokite jį savo kompiuteryje ir įkelkite jį čia.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript testavimas',
-'javascripttest-disabled' => 'Ši funkcija šiame wiki projekte neįjungta.',
 'javascripttest-title' => 'Vykdomas $1 testavimas',
 'javascripttest-pagetext-noframework' => 'Šis puslapis yra skirtas vykdyti JavaScript testavimus.',
 'javascripttest-pagetext-unknownframework' => 'Nežinoma "$1" testavimo struktūra.',
@@ -3751,6 +3740,9 @@ Kitu atveju, galite naudotis žemiau esančia paprastesne forma. Jūsų komentar
 'feedback-bugcheck' => 'Puiku! Tiesiog patikrinkite, ar tai ne viena [$1 jau žinomų klaidų].',
 'feedback-bugnew' => 'Patikrinau. Pranešti apie naują klaidą',
 
+# Search suggestions
+'searchsuggest-search' => 'Ieškoti',
+
 # API errors
 'api-error-badaccess-groups' => 'Jums neleidžiama įkelti failus į šią wiki.',
 'api-error-badtoken' => 'Vidinė klaida: blogai atpažinimo ženklas.',
index 69f914d..b400758 100644 (file)
@@ -395,8 +395,6 @@ n = nasvareigs lobuojums.',
 'search-interwiki-caption' => 'Citi projekti',
 'search-interwiki-default' => 'Rezuļtati nu $1',
 'search-interwiki-more' => '(vaira)',
-'search-mwsuggest-enabled' => 'Ar īsacejumim',
-'search-mwsuggest-disabled' => 'Bez īsacejumim',
 'searchall' => 'vysi',
 'nonefound' => "'''Pīzeime:''' bīži vin mekliešona ir naveiksmeiga, meklejūt plaši izplateitus vuordus, pīvadumam, \"kai\" voi \"ir\", deļ tam ka tī nateik īkļauti mekliešonys datu bazā, voi ari meklejūt vairuok par vīnu vuordu (deļ tam ka rezuļtatūs pasaruodeis tikai lopys, kuramuos ir visi meklietī vuordi). Vēļ, piec nūklusiejuma, puormeklej tikai dažys ''namespaces''. Lai meklētu vysuos, mekliešonys pīprasejumam prīškā juolīkn ''all:'', voi ari analogā veidā juonūruoda puormekliejamuo ''namespace''.",
 'powersearch' => 'Smolkuo mekliešona',
index 2af1c67..52ba89f 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Lushai (Mizo ţawng)
+/** Mizo (Mizo ţawng)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -156,7 +156,6 @@ $messages = array(
 'qbbrowse' => 'Fangvêl rawh',
 'qbedit' => 'Siamţhatna',
 'qbpageoptions' => 'He phêk hi',
-'qbpageinfo' => 'Thukhawchang',
 'qbmyoptions' => 'Ka phêkte',
 'qbspecialpages' => 'Phêk vohbîkte',
 'faq' => 'Zawhzin',
@@ -394,11 +393,8 @@ $2',
 
 # Login and logout pages
 'logouttext' => "'''I chhuak fel ta.'''
-Inziaklût kher lovin {{SITENAME}} hi i hmang chhunzawm thei ang, a nih loh vëk pawhin hmangtu hming pangngai emaw, a hming dang emawin [[Special:UserLogin|lût leh]] thei ang.
+Inziaklût kher lovin {{SITENAME}} hi i hmang chhunzawm thei ang, a nih loh vëk pawhin hmangtu hming pangngai emaw, a hming dang emawin <span class='plainlinks'>[$1 lût leh]</span> thei ang.
 I fangtu cache i thenfai hma chu phêk ţhenkhat intar lang a awm reng mai thei, i la  chhuak lo emaw tih mai tùrin.",
-'welcomecreation' => '==Kan lo lawm a che, $1!==
-I siangchan siam a ni ta.
-I [[Special:Preferences|{{SITENAME}}duhdàn]] siam danglam theihnghilh suh ang che.',
 'yourname' => 'Hmangtuhming:',
 'yourpassword' => 'Thurûk:',
 'yourpasswordagain' => 'Thurûk ziak nawn leh rawh le:',
@@ -731,8 +727,6 @@ Lamtawi hmante: '''({{int:cur}})'''= ennawnna thar ber nena danglamna, '''({{int
 'search-interwiki-caption' => 'Hmachhawppuite',
 'search-interwiki-default' => 'Chhuak $1:',
 'search-interwiki-more' => '(tam)',
-'search-mwsuggest-enabled' => 'rawtna telin',
-'search-mwsuggest-disabled' => 'rawtna tel lovin',
 'search-relatedarticle' => 'Laichin',
 'mwsuggest-disable' => 'AJAX rawtna tithi rawh',
 'searcheverything-enable' => 'Hminghmun zawng zawngah zawng rawh',
@@ -1153,7 +1147,7 @@ Hmangtu azira i thliarhran erawh chuan a hmangtuina a hlankai hnuhnüng ber taks
 Ahnuaih hian {{PLURAL:$1|zawmtu hmasa ber|zawmtu hmasa $1-te}} kan rawn tlar chhuak e.
 Zawmtu zawng zawng [[Special:WhatLinksHere/$2|tlarchhuahna hetah hian a awm]] e.',
 'nolinkstoimage' => 'He taksa zawmtu/hmanna phêk pakhat mah a awm lo.',
-'morelinkstoimage' => 'Hemi taksa zawmpui dang [[Special:WhatLinksHere/$1|enna}}.',
+'morelinkstoimage' => 'Hemi taksa zawmpui dang [[Special:WhatLinksHere/$1|enna]].',
 'linkstoimage-redirect' => '$1 (taksa hruailuhna) $2',
 'duplicatesoffile' => 'A hnuaia taksa{{PLURAL:$1||te}} khu hë taksa nihpui{{PLURAL:$1||te}} a{{PLURAL:$1||n}} ni ([[Special:FileDuplicateSearch/$2|chanchin kimchang]]):',
 'sharedupload' => 'Hë taksa hi $1-a mi a ni a, hna-hmachhawp dangin a hmang vè mai thei.',
@@ -1422,11 +1416,7 @@ Hetah hian [[Special:UnusedCategories|pawl hman lohho]] pholan tel a ni lo.
 'watchlist-options' => 'Ralvèn duhdàn',
 
 'enotif_reset' => 'Phêk zawng zawng tlawh tawh vek angin chhinchhiah rawh.',
-'enotif_newpagetext' => 'Hei hi phêk thar a ni.',
 'enotif_impersonal_salutation' => '{{SITENAME}} hmangtu',
-'changed' => 'tihdanglam a ni ta',
-'created' => 'siam a ni ta',
-'enotif_subject' => '{{SITENAME}} phêk $PAGETITLE tih hi $CHANGEDORCREATED,  $PAGEEDITOR bultum a ni.',
 'enotif_lastvisited' => 'I tlawh hnuhnùn ber hnu lama tihdanglam zawng zawng en i duh chuan $1 en rawh.',
 'enotif_lastdiff' => 'Hë tihdanglamna hi en tùrin $1 thlír rawh.',
 'enotif_anon_editor' => 'hmangtu hriat loh $1',
@@ -1934,4 +1924,8 @@ A bak zawng chu thuhrûk sa vek a ni ang.
 'feedback-message' => 'Thu',
 'feedback-cancel' => 'Sûtna',
 
+# Search suggestions
+'searchsuggest-search' => 'Zawnna',
+'searchsuggest-containing' => 'hemi thu telna hi...',
+
 );
index af20cc9..e119fd1 100644 (file)
@@ -183,7 +183,7 @@ $messages = array(
 'cancel' => 'Atcelt',
 'moredotdotdot' => 'Vairāk...',
 'mypage' => 'Mana lapa',
-'mytalk' => 'Mana diskusiju lapa',
+'mytalk' => 'Diskusijas',
 'anontalk' => 'Šīs IP adreses diskusija',
 'navigation' => 'Navigācija',
 'and' => '&#32;un',
@@ -193,7 +193,6 @@ $messages = array(
 'qbbrowse' => 'Navigācija',
 'qbedit' => 'Izmainīšana',
 'qbpageoptions' => 'Šī lapa',
-'qbpageinfo' => 'Konteksts',
 'qbmyoptions' => 'Manas lapas',
 'qbspecialpages' => 'Īpašās lapas',
 'faq' => 'BUJ',
@@ -307,9 +306,10 @@ $1',
 
 'ok' => 'Labi',
 'retrievedfrom' => 'Saturs iegūts no "$1"',
-'youhavenewmessages' => 'Tev ir $1 (skat. $2).',
+'youhavenewmessages' => 'Tev ir $1 (skatīt $2).',
 'newmessageslink' => 'jauns vēstījums',
 'newmessagesdifflink' => 'pēdējā izmaiņa',
+'newmessageslinkplural' => '{{PLURAL:$1|jauns vēstījums|jauni vēstījumi}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|pēdējā izmaiņa|pēdējās izmaiņas}}',
 'youhavenewmessagesmulti' => 'Tev ir jauns ziņojums: $1',
 'editsection' => 'labot',
@@ -428,11 +428,8 @@ Norādītais iemesls bija ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Tu esi izgājis no {{grammar:ģenitīvs|{{SITENAME}}}}.'''
 
-Vari turpināt to izmantot anonīmi, vari [[Special:UserLogin|atgriezties]] kā cits lietotājs vai varbūt tas pats.
+Vari turpināt to izmantot anonīmi, vari <span class='plainlinks'>[$1 atgriezties]</span> kā cits lietotājs vai varbūt tas pats.
 Ņem vērā, ka arī pēc iziešanas, dažas lapas var tikt parādītas tā, it kā tu vēl būtu iekšā, līdz tiks iztīrīta pārlūka kešatmiņa.",
-'welcomecreation' => '== Laipni lūdzam, $1! ==
-
-Tavs lietotāja konts ir izveidots. Neaizmirsti, ka ir iespējams mainīt [[Special:Preferences|{{grammar:ģenitīvs|{{SITENAME}}}} izmantošanas izvēles]].',
 'yourname' => 'Tavs lietotājvārds',
 'yourpassword' => 'Tava parole:',
 'yourpasswordagain' => 'Atkārto paroli',
@@ -932,8 +929,6 @@ $1",
 'search-interwiki-caption' => 'Citi projekti',
 'search-interwiki-default' => 'Rezultāti no $1:',
 'search-interwiki-more' => '(vairāk)',
-'search-mwsuggest-enabled' => 'ar ieteikumiem',
-'search-mwsuggest-disabled' => 'bez ieteikumiem',
 'search-relatedarticle' => 'Saistītais',
 'mwsuggest-disable' => 'Atslēgt AJAX ieteikumus',
 'searcheverything-enable' => 'Meklēt visās nosaukumvietās',
@@ -966,7 +961,7 @@ Pagaidām vari meklēt, izmantojot Google vai Yahoo.
 
 # Preferences page
 'preferences' => 'Izvēles',
-'mypreferences' => 'Mani uzstādījumi',
+'mypreferences' => 'Izvēles',
 'prefs-edits' => 'Izmaiņu skaits:',
 'prefsnologin' => 'Neesi iegājis',
 'prefsnologintext' => 'Tev jābūt <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} iegājušam]</span>, lai mainītu lietotāja izvēles.',
@@ -1782,7 +1777,7 @@ Tā e-pasta adrese, kuru tu esi norādījis [[Special:Preferences|savā izvēļu
 
 # Watchlist
 'watchlist' => 'Mani uzraugāmie raksti',
-'mywatchlist' => 'Mani uzraugāmie raksti',
+'mywatchlist' => 'Uzraugāmie raksti',
 'nowatchlist' => 'Tavā uzraugāmo rakstu sarakstā nav neviena raksta.',
 'watchlistanontext' => 'Lūdzu $1, lai apskatītu vai labotu savu uzraugāmo rakstu saraksta saturu.',
 'watchnologin' => 'Neesi iegājis',
@@ -1814,11 +1809,7 @@ Ja vēlāk pārdomāsi un nevēlēsies vairs uzraudzīt šo lapu, klikšķini uz
 
 'enotif_mailer' => '{{SITENAME}} paziņojumu izsūtīšana',
 'enotif_reset' => 'Atzīmēt visas lapas kā apskatītas',
-'enotif_newpagetext' => 'Šī ir jauna lapa.',
 'enotif_impersonal_salutation' => '{{SITENAME}} lietotājs',
-'changed' => 'izmainīja',
-'created' => 'izveidoja',
-'enotif_subject' => '{{grammar:ģenitīvs|{{SITENAME}}}} lapu $PAGETITLE $CHANGEDORCREATED lietotājs $PAGEEDITOR',
 'enotif_lastvisited' => '$1 lai apskatītos visas izmaiņas kopš tava pēdējā apmeklējuma.',
 'enotif_lastdiff' => '$1 lai apskatītos šo izmaiņu.',
 'enotif_anon_editor' => 'anonīms lietotājs $1',
@@ -2012,9 +2003,9 @@ $1',
 'blanknamespace' => '(Pamatlapa)',
 
 # Contributions
-'contributions' => 'Lietotāja devums',
+'contributions' => '{{GENDER:$1|Lietotāja|Lietotājas|Lietotāja}} devums',
 'contributions-title' => 'Lietotāja $1 devums',
-'mycontris' => 'Mans devums',
+'mycontris' => 'Devums',
 'contribsub2' => 'Lietotājs: $1 ($2)',
 'nocontribs' => 'Netika atrastas izmaiņas, kas atbilstu šiem kritērijiem.',
 'uctop' => '(pēdējā izmaiņa)',
@@ -2054,7 +2045,7 @@ Pēdējais bloķēšanas reģistra ieraksts ir apskatāms zemāk:',
 'whatlinkshere-hideredirs' => '$1 pāradresācijas',
 'whatlinkshere-hidetrans' => '$1 lapas, kurās šī lapa izmantota kā veidne',
 'whatlinkshere-hidelinks' => '$1 saites',
-'whatlinkshere-hideimages' => '$1 attēlu saites',
+'whatlinkshere-hideimages' => '$1 failu saites',
 'whatlinkshere-filters' => 'Filtri',
 
 # Block/unblock
@@ -3099,6 +3090,10 @@ Var arī lietot [[Special:EditWatchlist|standarta izmainīšanas lapu]].',
 'feedback-close' => 'Gatavs',
 'feedback-bugnew' => 'Es pārbaudīju. Ziņot par jaunu kļūdu',
 
+# Search suggestions
+'searchsuggest-search' => 'Meklēt',
+'searchsuggest-containing' => 'Meklējamā frāze:',
+
 # API errors
 'api-error-filename-tooshort' => 'Faila nosaukums ir pārāk īss.',
 'api-error-http' => 'Iekšēja kļūda: Nevar izveidot savienojumu ar serveri.',
index e9a3a25..b2d5ade 100644 (file)
@@ -11,6 +11,7 @@
  * @author Justincheng12345
  * @author Omnipaedista
  * @author Shinjiman
+ * @author Simon Shek
  * @author Super Wang
  */
 
@@ -164,7 +165,7 @@ $messages = array(
 'tog-watchcreations' => '哨己撰',
 'tog-watchdefault' => '哨己纂',
 'tog-watchmoves' => '派哨予吾遷之頁',
-'tog-watchdeletion' => '派哨吾除之頁',
+'tog-watchdeletion' => '派哨吾除之頁',
 'tog-minordefault' => '慣為校',
 'tog-previewontop' => '頂草覽',
 'tog-previewonfirst' => '覽首修',
@@ -291,7 +292,6 @@ $messages = array(
 'qbbrowse' => '覽',
 'qbedit' => '纂',
 'qbpageoptions' => '此頁',
-'qbpageinfo' => '內文',
 'qbmyoptions' => '吾好',
 'qbspecialpages' => '非凡',
 'faq' => '頻答問',
@@ -521,10 +521,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''子去簿矣'''
 
-子可匿名還覽{{SITENAME}},或[[Special:UserLogin|復登]]同簿、異簿。
+子可匿名還覽{{SITENAME}},或<span class='plainlinks'>[$1 復登]</span>同簿、異簿。
 未清謄本,覽器文舊,且慎之。",
-'welcomecreation' => '== $1大駕光臨! ==
-子簿增矣,敬更[[Special:Preferences|簿註]]。',
 'yourname' => '名',
 'yourpassword' => '符節',
 'yourpasswordagain' => '復核節',
@@ -952,8 +950,10 @@ $1",
 
 # Diffs
 'history-title' => '$1之誌',
+'difference-title' => '$1各本之异',
+'difference-title-multipage' => '$1、$2之异',
 'difference-multipage' => '(辨頁)',
-'lineno' => '列$1:',
+'lineno' => '第$1行:',
 'compareselectedversions' => '辨二擇',
 'showhideselectedversions' => '示/藏之擇',
 'editundo' => '悔',
@@ -998,8 +998,6 @@ $1",
 'search-interwiki-caption' => '結義金蘭',
 'search-interwiki-default' => '結果有$1:',
 'search-interwiki-more' => '(多)',
-'search-mwsuggest-enabled' => '有議',
-'search-mwsuggest-disabled' => '無議',
 'search-relatedarticle' => '關',
 'mwsuggest-disable' => '停AJAX議',
 'searcheverything-enable' => '尋全名集',
@@ -1837,11 +1835,7 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}}報',
 'enotif_reset' => '令為盡閱',
-'enotif_newpagetext' => '新灶',
 'enotif_impersonal_salutation' => '貴客',
-'changed' => '易',
-'created' => '撰',
-'enotif_subject' => '{{SITENAME}}簿{$PAGEEDITOR}{$CHANGEDORCREATED}{$PAGETITLE}',
 'enotif_lastvisited' => '自子出簿,有易見$1。',
 'enotif_lastdiff' => '欲閱此易,見$1。',
 'enotif_anon_editor' => '過客$1',
index cbc2a32..4c12a97 100644 (file)
@@ -261,6 +261,7 @@ Dudicoxopes oxmaruşi yasaği na ren ar, varna daha dido kʼarakʼtʼeri uğun.'
 'userlogout' => 'Siteşen Kogamaxti',
 'nologin' => "Hesabi va giğuni? '''$1'''",
 'nologinlink' => 'Hesabi dokʼidi.',
+'gotaccountlink' => 'Sitʼeşa amaxti',
 'mailmypassword' => 'Ağne pʼarola-çkimi moncğoni',
 
 # Change password dialog
@@ -344,7 +345,7 @@ Oxo3ʼonapape: (a3ʼineri) = a3ʼineri versiyoni kʼala na ren farkʼi,
 'revertmerge' => 'Artikʼartişen okʼo3ʼkʼi',
 
 # Diffs
-'history-title' => '"$1" butʼkʼaşi tarixi',
+'history-title' => 'Butʼkʼaşi tarixi "$1"',
 'lineno' => '$1. satʼiri:',
 'compareselectedversions' => 'Na goşiğen versiyonepe okʼo3ʼiri',
 'editundo' => 'ukʼuni',
@@ -367,8 +368,6 @@ Oxo3ʼonapape: (a3ʼineri) = a3ʼineri versiyoni kʼala na ren farkʼi,
 'search-interwiki-caption' => 'Cuma projepe',
 'search-interwiki-default' => '$1 sonucepe:',
 'search-interwiki-more' => '(çkva)',
-'search-mwsuggest-enabled' => 'okʼvandupete',
-'search-mwsuggest-disabled' => 'okʼvandu varen',
 'searchall' => 'mteli',
 'nonefound' => "'''Notʼi''': Xvala, namtini svacoxope maartani oqʼopinot igoren.
 Ogoruşi dudis '''all:''' pʼrefiksi okʼatute doloçʼareli na ren iri şeyi (oğarğaluşi butʼkʼape, şablonepe, doçkva şeyepeti iqʼvasen) mgori varna pʼrefiksi oqʼopinot na igoren svacoxo ixmarit.",
@@ -619,7 +618,7 @@ Am butʼkʼaşi oçvuşi sinori gaktirinen; ama am oktiroba, kʼademoni oçvalu
 # Block/unblock
 'blockip' => 'Maxmares bloği qʼvi',
 'ipboptions' => '2 saatʼi:2 hours,1 ndğa:1 day,3 ndğa:3 days,1 doloni:1 week,2 doloni:2 weeks,1 tuta:1 month,3 tuta:3 months,6 tuta:6 months,1 3ʼana:1 year,pʼanda:infinite',
-'ipblocklist' => 'Bloği xveneri na renan IP adresepe do maxmareş coxope',
+'ipblocklist' => 'Bloği do maxmareş',
 'blocklink' => 'bloği qʼvi',
 'unblocklink' => 'bloği kezdi',
 'change-blocklink' => 'bloği doktiri',
index b9e2f49..100f6c7 100644 (file)
@@ -170,7 +170,6 @@ $messages = array(
 'qbbrowse' => 'गवेषण करू',
 'qbedit' => 'सम्पादन करू',
 'qbpageoptions' => 'ई पन्ना',
-'qbpageinfo' => 'विषय',
 'qbmyoptions' => 'हमर पन्ना सभ',
 'qbspecialpages' => 'विशेष पन्ना सभ',
 'faq' => 'त्वरित प्रश्नोत्तरी',
@@ -422,11 +421,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''अहाँ निष्क्रमण कऽ गेल छी।'''
 
-अहाँ {{अन्तर्जाल}} प्रयोग अनाम भऽ कऽ सकै छी, वा अहाँ [[Special:UserLogin|log in again]] वएह आकि कोनो आन प्रयोक्ताक रूपमे सेहू प्रयोक कऽ सकै छी।
+अहाँ {{अन्तर्जाल}} प्रयोग अनाम भऽ कऽ सकै छी, वा अहाँ <span class='plainlinks'>[$1 log in again]</span> वएह आकि कोनो आन प्रयोक्ताक रूपमे सेहू प्रयोक कऽ सकै छी।
 ई मोन राखू जे किछु पन्ना एना देखा पड़ि सकैए जेना अहाँ अखनो सम्प्रवेशित होइ, जावत अहाँ अपन गवेषकक उपस्मृति मेटा नै दै छी।",
-'welcomecreation' => '== स्वागत अछि, $1! ==
-अहाँक खाता खुजि गेल अछि।
-अपन [[Special:Preferences|{{अन्तर्जाल}} preferences]] बदलब नै बिसरू।',
 'yourname' => 'प्रयोक्ता:',
 'yourpassword' => 'कूटशब्द:',
 'yourpasswordagain' => 'कूटशब्द फेरसँ टाइप करू:',
@@ -1018,8 +1014,6 @@ $3 द्वारा देल कारण अछि ''$2''",
 'search-interwiki-caption' => 'सम्बन्धित परियोजना सभ',
 'search-interwiki-default' => '$1 सभटा परिणाम:',
 'search-interwiki-more' => '(आर)',
-'search-mwsuggest-enabled' => 'सलाहक संग',
-'search-mwsuggest-disabled' => 'कोनो सलाह नै',
 'search-relatedarticle' => 'सम्बन्धी',
 'mwsuggest-disable' => 'AJAX सलाह अमान्य करू',
 'searcheverything-enable' => 'सभ नामस्थान सभमे ताकू',
@@ -1971,11 +1965,7 @@ $1',
 
 'enotif_mailer' => '{{जालस्थल}} सूचना पत्रक',
 'enotif_reset' => 'सभ पन्नाकेँ देखल चिन्हित करू',
-'enotif_newpagetext' => 'ई एकटा नव पन्ना छी।',
 'enotif_impersonal_salutation' => '{{अन्तर्जाल}} प्रयोक्ता',
-'changed' => 'बदलल गेल',
-'created' => 'बनाएल गेल',
-'enotif_subject' => '{{अन्तर्जाल}} पन्ना $PAGETITLE भेल $CHANGEDORCREATED द्वारा $PAGEEDITOR',
 'enotif_lastvisited' => 'देखू $1 अपन अन्तिम बेर अएलाक बादक परिवर्तन लेल।',
 'enotif_lastdiff' => 'ऐ परिवर्तनकेँ देखबा लेल $1 देखू।',
 'enotif_anon_editor' => 'गुप्त प्रयोक्ता $1',
index 1e462df..b3fdf9a 100644 (file)
@@ -159,7 +159,6 @@ $messages = array(
 'qbbrowse' => 'Jelajahi',
 'qbedit' => 'Sunting',
 'qbpageoptions' => 'Kaca kiye',
-'qbpageinfo' => 'Konteks kaca',
 'qbmyoptions' => 'Kaca-ne inyong',
 'qbspecialpages' => 'Kaca-kaca astamiwa',
 'faq' => 'FAQ (Pitakonan sing sering ditakokna)',
@@ -409,11 +408,8 @@ Alesane yakuwe "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Rika uwis metu log sekang sistem.'''
 
-Rika teyeng terus nggunakna {{SITENAME}} kanthi anonim, utawa Rika teyeng [[Special:UserLogin|mlebu log maning]] nganggo jeneng panganggo sing padha utawa sejene.
+Rika teyeng terus nggunakna {{SITENAME}} kanthi anonim, utawa Rika teyeng <span class='plainlinks'>[$1 mlebu log maning]</span> nganggo jeneng panganggo sing padha utawa sejene.
 Digatekna ya, nek ana kaca sing esih terus nidokna nek rika esih mlebu log nnganti Rika mbusak singgahan nang panjelajah web-e Rika.",
-'welcomecreation' => '== Sugeng rawuh, $1! ==
-
-Akun Rika uwis digawe. Aja kelalen nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Rika.',
 'yourname' => 'Jeneng panganggo:',
 'yourpassword' => 'Tembung sandhi:',
 'yourpasswordagain' => 'Balèni tembung sandhi:',
@@ -885,8 +881,6 @@ Gatèkna, angger nganggo pranala navigasi kuwe bakalan nge-reset kolom kiye.',
 'search-interwiki-caption' => 'Proyek liyane',
 'search-interwiki-default' => 'Hasil $1:',
 'search-interwiki-more' => '(terusane)',
-'search-mwsuggest-enabled' => 'nganggo saran',
-'search-mwsuggest-disabled' => 'ora ana saran',
 'search-relatedarticle' => 'Kagandhèng',
 'mwsuggest-disable' => 'Non-aktifna saran AJAX',
 'searcheverything-enable' => 'Goleti nang kabeh bilik jeneng',
index 4c4697c..4ed2b93 100644 (file)
@@ -147,31 +147,34 @@ $messages = array(
 'tog-underline' => 'Сюлмафкснень алга китькстамс:',
 'tog-justify' => 'Тиемс сёрматфть фкакс ушедоматнень лопать кувалмова',
 'tog-hideminor' => 'Од полафтоматнень эса кяшемс ёмланя видептематне',
+'tog-hidepatrolled' => 'Кяшемс лувонь кирдихнень видептемаснон мекольце полафнематнень эса',
+'tog-newpageshidepatrolled' => 'Кяшемс лувонь кирдихнень эса видептьф лопат од лопань лувса',
 'tog-extendwatchlist' => 'Келептемс мельгеваномать сембе полафтоматнень няфтемга, аф аньцек мекольценнет',
-'tog-usenewrc' => 'Ð\9dолдак Ñ\82евÑ\81 Ñ\86ебÑ\8fÑ\80Ñ\8cгоÑ\84Ñ\82Ñ\84 Ð¾Ð´ Ð¸Ð»Ñ\8fкÑ\81Ñ\82опÑ\82омаÑ\82 (Ñ\8dÑ\80Ñ\8fви JavaScript)',
+'tog-usenewrc' => 'Ð\9fолгаÑ\8fÑ\84Ñ\82омÑ\81 Ð¸Ð»Ñ\8fкÑ\81Ñ\82опÑ\82омаÑ\82ненÑ\8c Ð»Ð¾Ð¿Ð°Ð½Ñ\8c ÐºÐ¾Ñ\80Ñ\8fÑ\81 Ð¼ÐµÐºÐ¾Ð»Ñ\8cÑ\86е Ð¿Ð¾Ð»Ð°Ñ\84немаÑ\82ненÑ\8c Ñ\8dÑ\81а Ð´Ð¸ Ð¼ÐµÐ»Ñ\8cгеваномаÑ\81а (веÑ\88и JavaScript)',
 'tog-numberheadings' => 'Сёрмадома коняксс лувомтяшксне эслек путовихть',
 'tog-showtoolbar' => 'Кядьёнкс седяфксть няфтемс сёрмадомбачк (JavaScript)',
 'tog-editondblclick' => 'Кафксть люпштазь сувамс сёрматфть петнема (JavaScript)',
 'tog-editsection' => 'Няфтемс сюлмафксть [петемс] эрь пяльксонди',
 'tog-editsectiononrightclick' => 'Петнемс пялькстне: люпштамс сёрмадомбяльксть лемонц лангс видешире пуняса (JavaScript)',
 'tog-showtoc' => 'Няфтемс сёрматфть потмакс (лопатнень, конатнень эса 3 сёрмадома конякста лама)',
-'tog-rememberpassword' => 'Ð\92анÑ\84Ñ\82омÑ\81 Ð¼Ð¾Ð½Ñ\8c Ñ\81Ñ\83вама Ð»ÐµÐ¼Ð¾Ð·Ðµ Ñ\82Ñ\8f Ñ\81одама Ð¼Ð°Ñ\88инаÑ\81а (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations' => 'СÑ\83ваÑ\84Ñ\82омÑ\81 Ð¼Ð¾Ð½Ñ\8c Ñ\82еÑ\84Ñ\82Ñ\8c Ð»Ð¾Ð¿Ð°Ñ\82не Ð¼Ð¾Ð½Ñ\8c мельгеваномазон',
-'tog-watchdefault' => 'СÑ\83ваÑ\84Ñ\82омÑ\81 Ð¼Ð¾Ð½Ñ\8c Ð¿ÐµÑ\82нема Ð»Ð¾Ð¿Ð°Ð½Ðµ Ð¼Ð¾Ð½Ñ\8c мельгеваномазон',
-'tog-watchmoves' => 'Ð\9bопаÑ\82ненÑ\8c Ñ\88аÑ\88Ñ\84Ñ\82омÑ\81Ñ\82а Ñ\81Ñ\83ваÑ\84Ñ\82омÑ\81 Ñ\81инÑ\8c Ð¼Ð¾Ð½Ñ\8c мельгеваномазон',
-'tog-watchdeletion' => 'Ð\9bопаÑ\82ненÑ\8c Ð½Ð°Ñ\80дамÑ\81Ñ\82а Ñ\81Ñ\83ваÑ\84Ñ\82омÑ\81 Ñ\81инÑ\8c Ð¼Ð¾Ð½Ñ\8c мельгеваномазон',
+'tog-rememberpassword' => 'Ð\92анÑ\84Ñ\82омÑ\81 Ð¼Ð¾Ð½Ñ\8c Ñ\81Ñ\83вама Ð»ÐµÐ¼Ð¾Ð·Ðµ Ñ\82Ñ\8f Ñ\81одаммаÑ\88инаÑ\81а (Ñ\81Ñ\8fда ÐºÑ\83ваÑ\82Ñ\8c $1 {{PLURAL:$1|Ñ\88и|Ñ\88иÑ\82}})',
+'tog-watchcreations' => 'СÑ\83ваÑ\84Ñ\82омÑ\81 Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c, ÐºÐ¾Ð½Ð°Ñ\82ненÑ\8c Ñ\82иине Ð´Ð¸ Ñ\84айлаÑ\82, ÐºÐ¾Ð½Ð°Ñ\82ненÑ\8c Ñ\82онгине мельгеваномазон',
+'tog-watchdefault' => 'СÑ\83ваÑ\84Ñ\82омÑ\81 Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ð´Ð¸ Ñ\84айлаÑ\82ненÑ\8c, ÐºÐ¾Ð½Ð°Ñ\82ненÑ\8c Ð¿ÐµÑ\82неÑ\81айне мельгеваномазон',
+'tog-watchmoves' => 'СÑ\83ваÑ\84Ñ\82омÑ\81 Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ð´Ð¸ Ñ\84айлаÑ\82ненÑ\8c, ÐºÐ¾Ð½Ð°Ñ\82ненÑ\8c Ñ\88аÑ\88Ñ\84Ñ\82Ñ\8bне мельгеваномазон',
+'tog-watchdeletion' => 'СÑ\83ваÑ\84Ñ\82омÑ\81 Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ð´Ð¸ Ñ\84айлаÑ\82ненÑ\8c, ÐºÐ¾Ð½Ð°Ñ\82ненÑ\8c Ð½Ð°Ñ\80дÑ\8bне мельгеваномазон',
 'tog-minordefault' => 'Тяшксемс сембе петема анцяйнятне мъзярс илякс изь мярьгов',
 'tog-previewontop' => 'Няфтемс сёрматфть васень няфтемать петемань седяфксть инголе',
 'tog-previewonfirst' => 'Васень няфтема васенце петнемада меле',
-'tog-nocache' => 'Ð\90Ñ\84 Ð¼Ñ\8fÑ\80Ñ\8cгома Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c Ñ\8dÑ\81лек Ð²Ð°Ð½Ñ\84неви Ñ\84айлÑ\81нон Ñ\82иемÑ\81',
-'tog-enotifwatchlistpages' => 'Кучемс электрононь сёрма монь ванома лопать илякстоптомада меле',
+'tog-nocache' => 'Ð\9aаÑ\80дамÑ\81 Ð¸Ð½Ñ\82еÑ\80неÑ\82Ñ\81 Ð²Ñ\8fÑ\82иенди Ñ\8dÑ\81лек Ð²Ð°Ð½Ñ\84неви Ñ\84айлÑ\85ненÑ\8c Ñ\82иема',
+'tog-enotifwatchlistpages' => 'Кучт тейне е-сёрма мзярда монь мельгеваномаста лопат илякстоптовихть',
 'tog-enotifusertalkpages' => 'Кучемс электрононь сёрма монь тиить корхтама лопанц илякстоптомада меле',
-'tog-enotifminoredits' => 'Кучемс электрононь сёрма нъльне петема анцяйняда меле',
+'tog-enotifminoredits' => 'Кучт тейне е-сёрма нъльне мъзярда лопат эди файлхт аф ламне видептевихть',
 'tog-enotifrevealaddr' => 'Штафтомс монь электрононь адресозе пачфтема сёрмаса',
 'tog-shownumberswatching' => 'Няфтемс мъзяра сувсида конат арафтозь лопать эсь мельгеваномазост',
+'tog-oldsig' => 'Афкуксонь кядьтяшкс',
 'tog-fancysig' => 'Кядьтяшкст улихть викитекстокс (эслек тиеви сюлмафксфтома)',
-'tog-externaleditor' => 'Нолдамс тевс ушеширень петнить мъзярс илякс изь мярьгов (аньцек тевонь содайхненди, сяс мес эрявихть башка кядьёнкст-арафнемат содама машинаса)',
-'tog-externaldiff' => 'Нолдамс тевс ушеширень програм верзиень ваксс путоманкса мъзярс илякс изь мярьгов (аньцек тевонь содайхненди, сяс мес эрявихть башка кядьёнкст-арафнемат содама машинаса)',
+'tog-externaleditor' => 'Нолдамс тевс ушеширень петнить мъзярс илякс изь мярьгов (аньцек тевонь содайхненди, сяс мес эрявихть башка кядьёнкст-арафнемат содама машинаса [//www.mediawiki.org/wiki/Manual:External_editors сяда тов.])',
+'tog-externaldiff' => 'Нолдамс тевс ушеширень програм верзиень ваксс путоманкса мъзярс илякс изь мярьгов (аньцек тевонь содайхненди, сяс мес эрявихть башка кядьёнкст-арафнемат содама машинаса[//www.mediawiki.org/wiki/Manual:External_editors сяда тов.])',
 'tog-showjumplinks' => 'Мярьгомс "юпадемс" сатовома сюлмафкстненди',
 'tog-uselivepreview' => 'Максомс эряй васень няфтемась (JavaScript) (Варжамань)',
 'tog-forceeditsummary' => 'Няфтемс мондине мезе сёрмадомс шава петнема вальмас сувамста',
@@ -180,6 +183,7 @@ $messages = array(
 'tog-watchlisthideminor' => 'Кяшемс петнема анцяйнятне ванома лопаста',
 'tog-watchlisthideliu' => 'Кяшемс сёрматфтф тиихнень петнемаснон мельгеваномаса',
 'tog-watchlisthideanons' => 'Кяшемс лемфтома тиихнень петнемаснон мельгеваномаса',
+'tog-watchlisthidepatrolled' => 'Кяшемс лувонь кирдихнень видептемаснон мельгеваномаса',
 'tog-ccmeonemails' => 'Кучт тейне копия электрононь сермане конатнень кучсайне иля тиихненди.',
 'tog-diffonly' => 'Тят няфте лопань потмоц кафта верзиятнень ваксс путомать ала',
 'tog-showhiddencats' => 'Няфтемс кяшф категориет',
@@ -189,6 +193,13 @@ $messages = array(
 'underline-never' => 'Мъзярдонга',
 'underline-default' => 'Интернет полатксть кадомс апак полафтт',
 
+# Font style option in Special:Preferences
+'editfont-style' => 'Полафтомс тя паксянь сёрмадома стиленц',
+'editfont-default' => 'Интернетс вятись апак полафтт',
+'editfont-monospace' => 'Фкя келеса сёрмадома',
+'editfont-sansserif' => 'Сёрмадома Sans-serif',
+'editfont-serif' => 'Serif сёрмадома',
+
 # Dates
 'sunday' => 'Таргоши (Недляши)',
 'monday' => 'Одговши (Панедельник)',
@@ -256,7 +267,9 @@ $messages = array(
 'category-file-count' => '{{PLURAL:$2|Тя категориеса аньцек фкя файл.|Вага {{PLURAL:$1|файл|$1 файлхт}} тя категориеса $2-нь эста.}}',
 'category-file-count-limited' => 'Вага {{PLURAL:$1|файл|$1 файлхт}} тя категориеса.',
 'listingcontinuesabbrev' => 'полатксоц',
+'index-category' => 'Индексыяф лопат',
 'noindex-category' => '↓Индексфтома лопатне',
+'broken-file-category' => 'Лопат колаф сюлмафкснень мархта',
 
 'about' => 'Колганза',
 'article' => 'Сёрматфть потмонц лопац',
@@ -274,18 +287,19 @@ $messages = array(
 'qbbrowse' => 'Ванондома',
 'qbedit' => 'Петнема',
 'qbpageoptions' => 'Тя лопась',
-'qbpageinfo' => 'Контекстсь',
 'qbmyoptions' => 'Монь лопане',
 'qbspecialpages' => 'Башка тевонь лопат',
 'faq' => 'Сидеста Кеподеви Кизефксне',
 'faqpage' => 'Project:Сидеста Кеподеви Кизефксне',
 
 # Vector skin
+'vector-action-addsection' => 'Поладомс мезень колга корхтамс',
 'vector-action-delete' => 'Нардамс',
 'vector-action-move' => 'Шашфтомс',
 'vector-action-protect' => 'Араламс',
 'vector-action-undelete' => 'Мърдафтомс',
-'vector-action-unprotect' => 'Аралама лоткамс',
+'vector-action-unprotect' => 'Араламать полафтомс',
+'vector-simplesearch-preference' => 'Нодамс тевс тёждялгтотф кядьёнксонь седяфксть (аньцек векторонь лангакс)',
 'vector-view-create' => 'Тиемс',
 'vector-view-edit' => 'Петнемс',
 'vector-view-history' => 'История няфтемс',
@@ -309,6 +323,7 @@ $messages = array(
 'printableversion' => 'Лихтеви верзие',
 'permalink' => 'Ялань сюлмафкс',
 'print' => 'Нолдамс',
+'view' => 'Ваномс',
 'edit' => 'Петнеме',
 'create' => 'Тиемс',
 'editthispage' => 'Петнемс тя лопать',
@@ -316,11 +331,12 @@ $messages = array(
 'delete' => 'Нардамс',
 'deletethispage' => 'Нардамс тя лопать',
 'undelete_short' => 'Мърдафтомс {{PLURAL:$1|петнема|$1 петнемат}}',
+'viewdeleted_short' => 'Ваномс {{PLURAL:$1|фкя нардаф видептема|$1 нардаф видептемат}}',
 'protect' => 'Араламс',
 'protect_change' => 'полафтомс прянь араламать',
 'protectthispage' => 'Араламс тя лопать',
-'unprotect' => 'Ð\92алÑ\85Ñ\82омÑ\81 Ð°Ñ\80аламаÑ\82Ñ\8c',
-'unprotectthispage' => 'Ð\92алÑ\85Ñ\82омÑ\81 Ñ\82Ñ\8f Ð»Ð¾Ð¿Ð°Ñ\82Ñ\8c Ð°Ñ\80аламац',
+'unprotect' => 'Ð\90Ñ\80аламаÑ\82Ñ\8c Ð¿Ð¾Ð»Ð°Ñ\84Ñ\82омÑ\81',
+'unprotectthispage' => 'Ð\9fолаÑ\84Ñ\82омÑ\81 Ñ\82Ñ\8f Ð»Ð¾Ð¿Ð°Ñ\82Ñ\8c Ð°Ñ\80аламанц',
 'newpage' => 'Од лопа',
 'talkpage' => 'Корхтамс тя лопать колга',
 'talkpagelinktext' => 'Корхтама',
@@ -348,6 +364,13 @@ $messages = array(
 'jumpto' => 'Юпадемс тязк:',
 'jumptonavigation' => 'навигацие',
 'jumptosearch' => 'вешендема',
+'view-pool-error' => 'Ужяль, тя пингть серверхнень вийсна аф сатовихть.
+Вельф лама тиихть тяряфнихть ваномс тя лопать.
+Эняльттяма учт аф ламос тя лопанди одукс сама инголе.
+$1',
+'pool-timeout' => 'Пигонь кирдемась учи пякстаманц',
+'pool-queuefull' => 'Тяряфнемада вельф лама',
+'pool-errorunknown' => 'Аф содаф эльбятькс',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => '{{SITENAME}} колга',
@@ -381,6 +404,10 @@ $messages = array(
 'youhavenewmessages' => 'Тонь ули $1 ($2).',
 'newmessageslink' => 'Од сёрмат',
 'newmessagesdifflink' => 'мекольце полафтома',
+'youhavenewmessagesfromusers' => 'Тонь $1 {{PLURAL:$3|тага фкя тиить эзда|$3 тиихнень эзда}} ($2).',
+'youhavenewmessagesmanyusers' => 'Тонь $1 лама тиихнень эзда ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|од сёрма|од сёрмат}}',
+'newmessagesdifflinkplural' => 'мекольце {{PLURAL:$1|полафнема|полафнемат}}',
 'youhavenewmessagesmulti' => 'Тонь улихть од сёрмат $1-са',
 'editsection' => 'петнемс',
 'editold' => 'петнемс',
@@ -391,6 +418,8 @@ $messages = array(
 'toc' => 'Лопань потмоц',
 'showtoc' => 'няфтемс',
 'hidetoc' => 'кяшемс',
+'collapsible-collapse' => 'Ёмлалгофтомс',
+'collapsible-expand' => 'Келептемс',
 'thisisdeleted' => 'Ваномс эли мърдафтомс $1?',
 'viewdeleted' => 'Ваномс $1?',
 'restorelink' => '{{PLURAL:$1|нардаф петнема|$1 нардаф петнемат}}',
@@ -402,6 +431,8 @@ $messages = array(
 'page-rss-feed' => '"$1" RSS линия',
 'page-atom-feed' => '"$1" Atom линия',
 'red-link-title' => '$1 (стама лопась аш)',
+'sort-descending' => 'Арафтомс алу',
+'sort-ascending' => 'Арафтомс вяри',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Лопа',
@@ -428,12 +459,12 @@ $messages = array(
 # General errors
 'error' => 'Эльбятькс',
 'databaseerror' => 'Датабаза эльбятькс',
-'dberrortext' => 'Ð\94аÑ\82абазанÑ\8c Ð²ÐµÑ\88ендембаÑ\87к Ð»Ð¸Ñ\81Ñ\81Ñ\8c Ñ\81инÑ\82акÑ\81 эльбятькс.
-ТÑ\8f, Ñ\83лема, Ð¿Ñ\80огÑ\80амонÑ\8c Ñ\8dлÑ\8cбÑ\8fÑ\82Ñ\8cкÑ\81.
-Мекольце датабазонь вешендема ульсь:
-<blockquote><tt>$1</tt></blockquote>
-функциеста "<tt>$2</tt>".
\94аÑ\82абазаÑ\81Ñ\8c Ð¼Ñ\8aÑ\80даÑ\84Ñ\82озе Ñ\8dлÑ\8cбÑ\8fÑ\82Ñ\8cкÑ\81Ñ\82Ñ\8c "<tt>$3: $4</tt>".',
+'dberrortext' => 'СодамоÑ\88инÑ\8c Ð¿Ð°Ñ\80ганÑ\8c Ð²ÐµÑ\88ендембаÑ\87к Ð»Ð¸Ñ\81Ñ\81Ñ\8c Ñ\81инÑ\82акÑ\81онÑ\8c эльбятькс.
+ТÑ\8f, Ñ\83лема, Ð¿Ñ\80огÑ\80амгÑ\8fÑ\80Ñ\8cкÑ\81онÑ\8c Ñ\81и.
+Мекольце содамошинь паргань вешема:
+<blockquote><code>$1</code></blockquote>
+функциеста "<code>$2</code>".
¡Ð¾Ð´Ð°Ð¼Ð¾Ñ\88инÑ\8c Ð¿Ð°Ñ\80гаÑ\81Ñ\8c Ð¿Ð°Ñ\87Ñ\84Ñ\82еÑ\81Ñ\8c Ñ\8dлÑ\8cбÑ\8fÑ\82Ñ\8cкÑ\81 "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Датабазонь вешендембачк лиссь синтакс эльбятькс.
 Мекольце датабазонь вешендема ульсь:
 "$1"
@@ -445,7 +476,7 @@ $messages = array(
 'readonlytext' => 'Датабазась тяни пякстаф од сёрмадоматненди эли полафнематненди, шятьта нежедематненди, меле сон мърдай эрьшинь покаманцты.
 
 Оцюнясь кона сонь пякстазе арьсезе сонь шарьхкотьфтемац: $1',
-'missing-article' => 'Ð\94аÑ\82абазаÑ\81а Ð°Ñ\84 Ð¼Ñ\83ви Ñ\82екÑ\81Ñ\82 конань эряви мумс, сонь лемоц "$1" $2.
+'missing-article' => 'СодамоÑ\88инÑ\8c Ð¿Ð°Ñ\80гÑ\81а Ð°Ñ\84 Ð¼Ñ\83ви Ñ\82екÑ\81Ñ\82Ñ\81Ñ\8c конань эряви мумс, сонь лемоц "$1" $2.
 
 Тя сидеста лиси мъзярда молят сирелготф верзиева эли историянь сюлмафксова, кона вяти нардаф лопас.
 
@@ -456,6 +487,8 @@ $messages = array(
 'readonly_lag' => 'Датабазась эслек пякстась мъзярс кядяла датабаза серверхт сотни прясерверть мархта',
 'internalerror' => 'Потмонь эльбятькс',
 'internalerror_info' => 'Потмонь эльбятькс: $1',
+'fileappenderrorread' => '"$1" файлась аф лувови поладома пингста.',
+'fileappenderror' => '"$1" файлась изь поладов "$2" файлти.',
 'filecopyerror' => 'Аш кода копиямс файл "$1" файл "$2"с.',
 'filerenameerror' => 'Аш кода "$1" файлти максомс од лем "$2".',
 'filedeleteerror' => 'Файл "$1" аф нардави.',
@@ -467,28 +500,43 @@ $messages = array(
 'badarticleerror' => 'Тя лопаса тя аф тиеви.',
 'cannotdelete' => 'Лопась эли кочкаф "$1" файлсь аф нардави.
 Сонь, улема, кинге нардазе ни.',
+'cannotdelete-title' => '"$1" лопась аф нардави',
+'delete-hook-aborted' => 'Туворкс програм петнемать лоткафтозе.
+Пачфтемат тянь коряс аш.',
 'badtitle' => 'Аф кондясти лем',
 'badtitletext' => 'Вешф лопань лемоц аф тяфтама эли шава, шятьта кялень-ётка эли викинь-ётка лемсна аф лац сюлмафт. Сонь эса, улема ащи фкя эли сяда лама башка тяштькстт конат коняксонди аф кондястихть.',
-'perfcached' => 'Вешф програмонь информациесь сёрматфоль эслек ванфневи файлхнень эса ди, улема, сирелгодсь. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'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' => 'Тя лопать одонзапне тяни аф тиевихть. Информациесь тяса тяни аф одонзави.',
 'wrong_wfQuery_params' => 'Аф кондясти параметратне функцияса wfQuery()<br />
 Функцие: $1<br />
 Вешфкс: $2',
 'viewsource' => 'Ваномс лисьмоть',
+'viewsource-title' => 'Ванк $1 лисьмаста',
 'actionthrottled' => 'Куроксшись кирьфтаф',
 'actionthrottledtext' => 'Лудна мархта тюрема туфталонкса тя тевть ламоксть тиемась нюрьхконя ётка пингста кардаф. Эняльттяма мърдамс тя тевти мъзярошка минутода меле.',
 'protectedpagetext' => 'Тя лопас сувама пякстаф лопань петнема кардамать сюнеда.',
 'viewsourcetext' => 'Тейть ули кода ваномс эди копиямс тя лопать лисьмоц:',
-'protectedinterface' => 'Тя лопаса ащи лопать ванфонц програмонь текстоц, сон пякстаф кальдяв тевда араламать сюнеда.',
-'editinginterface' => "'''Инголе кардама:''' Тон петнесак лопать конань эса ащи лопать ванфонц програмонь текстоц. Петнематне полафтсазь сонь ванфоц кода сон няеви иля тиихненди. Ётафтома тиеманкса эняльттяма ваномс [//translatewiki.net/wiki/Main_Page?setlang=mdf translatewiki.net] МедиаВикить локализациеть проектть.",
+'viewyourtext' => "Тондейть ули кода тя лопань '''петнематнень''' ваномс ди тиемс копиянснон:",
+'protectedinterface' => 'Тя лопать эса интерфейс текстсь тя викить програмгярксти, сон аралаф кальдяв тиемада.
+Вики ётафтоматнень поладоманди полафнемандивок сувак [//translatewiki.net/ translatewiki.net], MediaWiki локализациень проектти.',
+'editinginterface' => "'''Инголи кардама:''' Тон петнесак лопать конань эса ащи интерфейс текст програмкярьксонди. Петнематне полафтсазь сонь ванфоц, кода сон няеви иля тиихненди. Вики ётафтоматнень поладоманди, полафтомандивок сувак [//translatewiki.net/ translatewiki.net] MediaWiki локализациень проектти.",
 'sqlhidden' => '(SQL вешфкс кяшф)',
 'cascadeprotected' => 'Тя лопать аралазь петнемада сяс мес сон сувафни {{PLURAL:$1|сай лопас, кона путфоль|сай лопас, конат путфольхть}} каскад араламас:
 $2',
 'namespaceprotected' => "Тондейть аф мярьгови петнемс лопатне '''$1''' лепнень мархта.",
+'customcssprotected' => 'Тейть аф мярьгови петнемс CSS лопать, сяс мес потмосонза иля тиить латцеманза.',
+'customjsprotected' => 'Тейть аф мярьгови петнемс JavaScript лопать, сяс мес потмосонза иля тиить латцеманза.',
 'ns-specialprotected' => '{{ns:special}} лепнень мархта лопатне аф петневихть.',
 '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''",
@@ -498,21 +546,21 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Тон лисеть.'''
 
-Тондейть ули кода ащемс {{SITENAME}}са апак содак эли [[Special:UserLogin|сувак тага весть]] кода сяка эли иля тиись.
+Тондейть ули кода ащемс {{SITENAME}}са апак содак эли <span class='plainlinks'>[$1 сувак тага весть]</span> кода сяка эли иля тиись.
 Кой-кона лопатне илядсть стамкс кодамкс синь ульсть тонь лисемада инголе мъзярс тонь интернет полатксце изь аруяфтов эсь ванфневи файлхнень эзда.",
-'welcomecreation' => '== Сувак, $1! ==
-
-Тонь сёрматфтомаце анок. Тят юкста полафнемс эсь [[Special:Preferences|{{SITENAME}} латцематне]].',
 'yourname' => 'Тиить лемоц:',
 'yourpassword' => 'Сувама валце:',
 'yourpasswordagain' => 'Сёрматк сувама валце омбоцекс:',
 'remembermypassword' => 'Ванфтомс монь сувама лемозе тя содам машинаса (максимум $1 {{PLURAL:$1|шис|шис}})',
+'securelogin-stick-https' => 'Кадовомс сотфокс HTTPS вельде сувамада меле',
 'yourdomainname' => 'Тонь доменце:',
+'password-change-forbidden' => 'Сувама валхне тя викить эса аф полафтовихть',
 'externaldberror' => 'Лиссь эльбятькс ушеширень датабазонь вельде кемокстакшнембачк эли тондейть аф мярьгови полафнемс тонь ушеширень сёрматфтомацень.',
 'login' => 'Сувама',
 'nav-login-createaccount' => 'Сувама / сёрматфтома',
 'loginprompt' => 'Тондейть эряви нолдамс тевс cookies {{SITENAME}}с суваманди.',
 'userlogin' => 'Сувама / сёрматфтома',
+'userloginnocreate' => 'Сувамс',
 'logout' => 'Лисема',
 'userlogout' => 'Лисема',
 'notloggedin' => 'Апак сувак',
@@ -521,12 +569,18 @@ $2',
 'createaccount' => 'Тиемс од сёрматфтомась',
 'gotaccount' => "Сёрматфтыть ни? '''$1'''.",
 'gotaccountlink' => 'Сувамс',
+'userlogin-resetlink' => 'Сувама эрявикснень юкстайть?',
 'createaccountmail' => 'электрононь сёрма вельде',
+'createaccountreason' => 'Туфтал:',
 'badretype' => 'Сувама валхне тон путыть аф фкат.',
-'userexists' => 'Тя лемсь кой-кие сявозь ни. Эняльттяма, арьсек иля лемсь.',
+'userexists' => 'Тя лемть сявозь ни. 
+Эняльттяма, арьсек эстейть иля.',
 'loginerror' => 'Сувама эльбятькс',
+'createaccounterror' => 'Сёрматфтомась аф тиеви: $1',
 'nocookiesnew' => 'Тиить сёрматфтомаце анок, аньцек тон изеть сува. {{SITENAME}}-са тиихнень содафтоманкса функцие cookies эряви. Тяни тонь содама машинаса функцие cookies кардаф. Эняльттяма нолдамс тевс cookies, меле сувак од эсь тиить лемцень эди сувама валцень мархта.',
 'nocookieslogin' => '{{SITENAME}} лопаса тиихнень содафтоманкса функцие cookies эряви. Тяни тонь содама машинаса функцие cookies кардаф. Эняльттяма нолдамс тевс cookies, меле сувак тага весть.',
+'nocookiesfornew' => 'Тиить сёрматфтомась апак тик сяс мес лисьмонц аф кемокстави.
+Варжак cookies нолдафт эли аф, одонзафтк лопать ди тяряфтт одукс.',
 'noname' => 'Тон изеть пута кемокстаф тиить лемоц.',
 'loginsuccesstitle' => 'Сувамась ётась лац',
 'loginsuccess' => "'''Тон сувать {{SITENAME}}-с кода \"\$1\".'''",
@@ -535,9 +589,12 @@ $2',
 Илякс тондейть эряви [[Special:UserLogin/signup|сёрматфтомс одукс]].',
 'nosuchusershort' => 'Тиись "$1" лемса аш. Ванк, улема, тон сёрмадыть лемть аф лац.',
 'nouserspecified' => 'Тиить лемсь эряви.',
+'login-userblocked' => 'Тиись перяф. Сувама кардаф.',
 'wrongpassword' => 'Сувама валсь сёрматф аф лац. Варжак тага весть.',
 'wrongpasswordempty' => 'Сувама валсь кадовсь апак сёрматк. Сёрматк одукс.',
 'passwordtooshort' => 'Тонь сувама валценди эряви улемс аф {{PLURAL:$1|1 тяшкста|$1 тяшкста}} кържа',
+'password-name-match' => 'Сувама лемце ди сувама сувама валце улемат аф фкат.',
+'password-login-forbidden' => 'Тя сувама лемсь эди сувама валсь кардафт.',
 'mailmypassword' => 'Кучт од сувама вал',
 'passwordremindertitle' => 'Од ёткопингонь сувама валсь {{SITENAME}}с суваманди',
 'passwordremindertext' => 'Кивок (улема, тон IP адресста $1) вешсь од сувама валсь {{SITENAME}} ($4)с суваманди.
@@ -545,6 +602,7 @@ $2',
 
 Улендяряй киге иля кучсь тя вешфксть эли тон мяляфтсак тонь сувама валцень эди тонь тяни аш мяльце сонь полафтома, тят тие мезеге тя пачфтемась самда меле ди киртть тонь ингольдень сувама валцень.',
 'noemail' => '"$1" тиить электрононь адресоц аш.',
+'noemailcreate' => 'Эряви тяштемс афкукс е-парга',
 'passwordsent' => 'Од сувама валсь кучфоль "$1" тиить электрононь адресонцты.
 Сувак сонь кундамда меле.',
 'blocked-mailpassword' => 'Петнемат тиемась тонь IP адрестот кардаф. Сувама валть кемокстама функциес кундама аф мярьгови кальдяв тиемада аралама туфталонкса.',
@@ -560,15 +618,24 @@ $2',
 'noemailprefs' => 'Мъзярс тон ашеть пута тонь электрононь адресце Викить сёрматнень коряс програмсь кодамога сёрмат аф кучсыне.',
 'emailconfirmlink' => 'Кемокстак тонь электрононь адресце',
 'invalidemailaddress' => 'Электрононь адресть аф пьрьняндави сяс сонь аф кондясти электрононь адресоц. Путт кондясти электрононь адресонц эли катк тя паксянять шавакс.',
+'cannotchangeemail' => 'Сёрматфтомать е-паргоц аф полафтови тя викить эса',
+'emaildisabled' => 'Тя лопанди аш кода кучемс е-сёрмат.',
 'accountcreated' => 'Сёрматфтомась тиф',
 'accountcreatedtext' => '$1 тиить сёрматфтомась тиф.',
 'createaccount-title' => 'Сёрматфнемась {{SITENAME}}-с',
 'createaccount-text' => 'Кати-кие тизе сёрматфтомась $2 {{SITENAME}} ($4)-са. "$2" -ть сувама валсь "$3". Тондейть эряви сувамс тозк эди арафтомс од сувама валть.
 
 Улендяряль тя сёрматфтомась эльбятьксокс мезеге тят тие.',
+'usernamehasherror' => 'Тиить лемозонза тяфтама тяшкст аф мярьговихть',
 'login-throttled' => 'Тон улхкомба вельф ламос тяряфнеть сувамс тя сувама валть вельде.
 Эняльттяма, учт аф ламос тага весть тяряфтома инголе.',
+'login-abort-generic' => 'Сувамацень апак тиевсь лац - Валхтф',
 'loginlanguagelabel' => 'Кяль: $1',
+'suspicious-userlogout' => 'Вешфксце лисемс кардафоль сяс мес няеви тянь кучезь колаф интернетс вятиень эли ётка ёкамань сервер вельде.',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Аф содаф эльбятькс PHP сёрмавятемань функциеса.',
+'user-mail-no-addy' => 'Тяряфтыхть кучемс е-сёрма е-паргафтома',
 
 # Change password dialog
 'resetpass' => 'Полафтомс сувама валцень',
@@ -582,10 +649,23 @@ $2',
 '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-pretext' => '{{PLURAL:$1||Тяштьк содама пялькснень эзда фкя алу}}',
+'passwordreset-username' => 'Тиить лемоц',
+'passwordreset-domain' => 'Домен:',
+'passwordreset-capture' => 'Ваномс мекольце е-сёрма?',
+'passwordreset-capture-help' => 'Путондярят тяшкс тя паксять эса е-сёрма (пингонь сувама вал мархта) кармай няфтевома кодак кучф тиенди.',
+'passwordreset-emailtitle' => 'Серматфтомать колга {{SITENAME}}са',
+
 # Edit page toolbar
 'bold_sample' => 'Эчке сёрмадома',
 'bold_tip' => 'Эчке сёрмадома',
@@ -675,6 +755,9 @@ $2',
 Тондейть ули кода [[Special:Search/{{PAGENAME}}|вешендемс тя лопать коняксонц]] иля лопава,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} вешендемс малады лувомава],
 эли [{{fullurl:{{FULLPAGENAME}}|action=edit}} петнемс тя лопать]</span>.',
+'noarticletext-nopermission' => 'Тяни аш текст тя лопаса.
+Тондейть ули кода [[Special:Search/{{PAGENAME}}|вешендемс тя лопать коняксонц]] иля лопава,
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} вешендемс малады лувомава]</span>, аньцек тонь аш мярьговомаце тя лопать ушедомс.',
 'userpage-userdoesnotexist' => 'Сёрматфтомась «<nowiki>$1</nowiki>» лемса аш. Арьсек лацкаста, афкукс тонь улендяряй мяльце тиемс эли полафтомс тя лопать.',
 'clearyourcache' => "'''Шарфтк мяльце:''' Ванфтомада меле од полафнематнень ваноманкса тондейть эряви нардамс эслек ванфневи файлхнень тонь интернет полатксонь вальмастонза. '''Mozilla / Firefox / Safari:''' ''Shift'' кирдезь, люпштак ''Reload'', эли люпштак ''Ctrl-Shift-F5'' эли ''Ctrl-R'' (''Command-Shift-R'' Mac машинаса); '''Konqueror: '''люпштак ''Reload'' эли люпштак ''F5;'' '''Opera:''' програмса тондейть эрявксты нардамс сембе эслек ванфневи файлхт  ''Tools→Preferences'' вельде; '' '''Internet Explorer:''' ''Ctrl'' кирдезь люпштакшнек ''Refresh'' эли люпштак ''Ctrl-F5.''",
 'usercssyoucanpreview' => "'''Мялень максома:''' Ванфтомада инголе нолдак тевс 'Васень няфтема' пунять тонь од CSS эли JS файлть варжаманкса.",
@@ -684,7 +767,7 @@ $2',
 'userinvalidcssjstitle' => "'''Инголе мярьгома:''' Аш тема файл \"\$1\" мазопнеманкса. Киртть мяльсот .css эди .js лопас путови аньцек ёмла тяшкса коняксне, кепотьксонди {{ns:user}}:Foo/лем.css афи {{ns:user}}:Foo/Лем.css.",
 'updated' => '(Одонзаф)',
 'note' => "'''Шарфтк мяльце:'''",
-'previewnote' => "'''ТÑ\8f Ð°Ð½Ñ\8cÑ\86ек Ð²Ð°Ñ\81енÑ\8c Ð½Ñ\8fÑ\84Ñ\82емаÑ\81Ñ\8c; Ð¿Ð¾Ð»Ð°Ñ\84немаÑ\82не Ð½Ð¸Ð½Ð³Ðµ Ð¸Ñ\81Ñ\82Ñ\8c Ð²Ð°Ð½Ñ\84Ñ\82ов!'''",
+'previewnote' => "'''Ð\9aиÑ\80Ñ\82Ñ\82Ñ\8c Ð¼Ñ\8fлÑ\8cÑ\81оÑ\82, Ñ\82Ñ\8f Ð°Ð½Ñ\8cÑ\86ек Ð²Ð°Ñ\81енÑ\8c Ð½Ñ\8fÑ\84Ñ\82емаÑ\81Ñ\8c.''' Ð¢Ð¾Ð½Ñ\8c Ð¿Ð¾Ð»Ð°Ñ\84Ñ\82омаÑ\82не Ð½Ð¸Ð½Ð³Ðµ Ð¸Ñ\81Ñ\82Ñ\8c Ð²Ð°Ð½Ñ\84Ñ\82ов!",
 'previewconflict' => 'Текстсь тя васень няфтемаса няфтеви вярдень петнема паксяса стамкс кодамкс сон няеволь ванфтомада меле.',
 'session_fail_preview' => "'''Аш кода тонь петнемаце сувафтомс мекольце информациень юмафтомать сюнеда.
 Тик одукс.
@@ -756,6 +839,7 @@ $2',
 'edit-no-change' => 'Тонь петнемацень тевс изь нолда, сяс мес тон текстть ашеть полафта.',
 'edit-already-exists' => 'Аш кода од лопа ушедомс.
 Тя лопась ульсь ни.',
+'content-failed-to-parse' => 'Аш кода $2 сёрматфть нолдамс тевс $1 моделень коряс: $3',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Инголе кардама: Тя лопаса пяк лама питни синтаксонь анализаторхнень тяшкста.
@@ -801,6 +885,7 @@ $3 макссь туфталсь - ''$2''",
 Шарьхкотьфтема: (тян.) = тяниень верзиеда явомась,
 (сяд.) = сядынгольдень верзияда явомась, Ё = ёмла петнема.',
 'history-fieldset-title' => 'Вешентть история',
+'history-show-deleted' => 'Аньцек нардаф',
 'histfirst' => 'Кунардонь',
 'histlast' => 'Мекольце',
 'historysize' => '({{PLURAL:$1|1 байт|$1 байтт}})',
@@ -847,6 +932,8 @@ $3 макссь туфталсь - ''$2''",
 'revdelete-success' => "'''Верзиеть няевоманц одонзафозь лац.'''",
 'logdelete-success' => "'''Сёрматфть няевомац арафтовсь лац.'''",
 'revdel-restore' => 'Полафтомс няевомац',
+'revdel-restore-deleted' => 'нардаф верзиет',
+'revdel-restore-visible' => 'няеви верзиет',
 'pagehist' => 'Лопать историяц',
 'deletedhist' => 'Нардаф историяц',
 'revdelete-edit-reasonlist' => 'Петнемс нардамань туфталхне',
@@ -888,12 +975,12 @@ $3 макссь туфталсь - ''$2''",
 'mergelogpagetext' => 'Ванк ала сяда мекольдень лопатнень фкя фкянь мархта шоворемаснон историясна.',
 
 # Diffs
-'history-title' => '"$1"-нь верзиетнень историясна',
+'history-title' => '"$1"нь полафнематнень историясна',
 'difference-multipage' => 'Явомась лопаланготнень ёткова',
 'lineno' => 'Кикссь $1:',
 'compareselectedversions' => 'Путомс кочкаф верзиетнень ваксс',
 'editundo' => 'валхтомс',
-'diff-multi' => '({{PLURAL:$1|$1-нь ётконь верзиец изь няфтев|$1-нь ётконь верзиенза исть няфтев}}.)',
+'diff-multi' => '({{PLURAL:$1|ёткопингонь верзие, конась|$1 ёткопингонь верзиет, конатне}} {{PLURAL:$2|тии тизе|$2 тиихть тизь}} апак няфтек)',
 
 # Search results
 'searchresults' => 'Мезе мувсь',
@@ -908,6 +995,9 @@ $3 макссь туфталсь - ''$2''",
 'notextmatches' => 'Лопаса сёрматфсь изь мув',
 '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-legend' => 'Вешендема арафнематне',
 'searchmenu-exists' => "'''Тя Викиса ули лопась \"[[:\$1]]\" лем мархта'''",
@@ -925,6 +1015,7 @@ $3 макссь туфталсь - ''$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)',
@@ -932,14 +1023,13 @@ $3 макссь туфталсь - ''$2''",
 'search-interwiki-caption' => 'Сазоронь проекттне',
 'search-interwiki-default' => '$1 муфкст:',
 'search-interwiki-more' => '(сяда лама)',
-'search-mwsuggest-enabled' => 'мяль максоматнень мархта',
-'search-mwsuggest-disabled' => 'мяль максоматнень ашет',
 'search-relatedarticle' => 'Мала',
 'mwsuggest-disable' => 'Лоткак AJAX мяль максоматне тевс нолдама',
 'searchrelated' => 'мала',
 'searchall' => 'сембе',
 'showingresults' => "Ала няфтеви {{PLURAL:$1|мувсь '''1'''|мувсть '''$1'''}} '''$2'''-ста ушедомс.",
 'showingresultsnum' => "Ала няфтеви {{PLURAL:$3|мувсь '''1'''|мувсть '''$3'''}} '''$2'''-ста ушедомс.",
+'showingresultsheader' => "{{PLURAL:$5|'''$1''' сафкс '''$3'''-ста|'''$1 - $2''' сафкст '''$3'''-ста}} '''$4'''нди",
 'nonefound' => "'''Шарфтк мяльце''': Аньцек мъзярошка лемботмат вешендевихть инголе апак полафтт. Тяряфтт вешендема валда инголе путомс ''all:'' сембе потмонь вешендеманди (корхнема лопат ди шаблотт сявомок, ди с. т) эли кундак эрявикс лемботмос кода валынгольксс.",
 'search-nonefound' => 'Аш вешфксонди малады муфкст.',
 'powersearch' => 'Сядонга вешендемс',
@@ -1032,6 +1122,7 @@ $3 макссь туфталсь - ''$2''",
 'email' => 'Электрононь адресце',
 'prefs-help-realname' => 'Афкуксонь лемце путомась аф лувови эрявикс. Афкуксонь лемцень тязк путомада меле тонь лемце кармай эвондама лопаса тонь петнемацень ала.',
 'prefs-help-email' => 'Электрононь адресце тяса аф лувови эрявикс, интай юкстандярят сувама валце адресце путомась лезды сонь полафтоманди.',
+'prefs-help-email-others' => 'Тондейть ули кода путомс корхнема лопазот е-паргцень, конань вельде иля ломатне сёрмадовихть тейть. Е-паргце аф кармай няеви мзярда иля тиихне тяшнелихть тейть.',
 'prefs-help-email-required' => 'Эряви электрононь адресце.',
 
 # User rights
@@ -1182,6 +1273,10 @@ $3 макссь туфталсь - ''$2''",
 'recentchanges-legend' => 'Мекольце полафнематнень арафнемасна',
 'recentchanges-summary' => 'Ваномс сяда мекольце Викиса полафнематнень мельге тя лопаса.',
 'recentchanges-feed-description' => 'Ваномс сяда мекольце Викиса полафнематнень мельге тя шудемаса.',
+'recentchanges-label-newpage' => 'Тя видептемась од лопа тись',
+'recentchanges-label-minor' => 'Тя ёмланя видептема',
+'recentchanges-label-bot' => 'Тя видептемась тизе кона-бди робот програм',
+'recentchanges-label-unpatrolled' => 'Тя видептемась ашесь пова патруль ала ни',
 'rcnote' => "Ала {{PLURAL:$1|мекольце '''1''' полафнема|мекольце '''$1''' полафнемат}} '''$2''' ётай  {{PLURAL:$2|шис|шис}}, $5, $4ста.",
 'rcnotefrom' => "Ала няфтезь полафнематне '''$2'''-ста ('''$1'''-с).",
 'rclistfrom' => 'Няфтемс од полафнематне $1-ста ушедомс',
@@ -1346,7 +1441,7 @@ $3 макссь туфталсь - ''$2''",
 'filehist-dimensions' => 'Кувалма',
 'filehist-filesize' => 'Файлонь кувалмоц',
 'filehist-comment' => 'Мяльполаткс',
-'imagelinks' => 'Файл сюлмафкст',
+'imagelinks' => 'Файлань тевс нолнема',
 'linkstoimage' => 'Сай {{PLURAL:$1|лопась сюлмаф|$1 лопатне сюлмафт}} вага тя файлть мархта:',
 'linkstoimage-more' => '$1-да лама {{PLURAL:$1|лопа сюлмаф|лопат сюлмафт}} тя файлть мархта.
 Тя лувомаса няфневихть {{PLURAL:$1|васенце лопань сюлмафксоц|васенце $1 лопань сюлмафкссна}} аньцек тя файлть мархта.
@@ -1355,6 +1450,8 @@ $3 макссь туфталсь - ''$2''",
 'morelinkstoimage' => 'Ванк [[Special:WhatLinksHere/$1|сяда лама сюлмафкст]] тя файлонди.',
 'duplicatesoffile' => 'Сай {{PLURAL:$1|файлсь ащи кафонзафксокс|$1 файлхне ащихть кафонзафксокс}} тя файлонди ([[Special:FileDuplicateSearch/$2|сяда лама информацие]]):',
 'sharedupload' => 'Тя файлсь $1ста ди сонь ули кода сувафтомс иля проектс.',
+'sharedupload-desc-here' => 'Тя файлась $1ста ди сонь ули кода сувафтомс иля проектс.
+Колганза тяштьф [$2 файлать азондома лопазонза] конась няфтеви ала.',
 'uploadnewversion-linktext' => 'Тонгодемс тя файлонь од верзиенц',
 
 # File reversion
@@ -1495,6 +1592,7 @@ $3 макссь туфталсь - ''$2''",
 'listusers' => 'Тиихне',
 'listusers-editsonly' => 'Няфтемс аньцек петнематнень мархта тиихнень',
 'usereditcount' => '$1 {{PLURAL:$1|петнема|петнемат}}',
+'usercreated' => '{{GENDER:$3|Шкаф}} $1 шиста $2 пингста',
 'newpages' => 'Од лопат',
 'newpages-username' => 'Тиить лемоц:',
 'ancientpages' => 'Сембода сире лопат',
@@ -1619,6 +1717,7 @@ $3 макссь туфталсь - ''$2''",
 # Watchlist
 'watchlist' => 'Монь мельгеваномазе',
 'mywatchlist' => 'Монь мельгеваномазе',
+'watchlistfor2' => '$1 $2-нди',
 'nowatchlist' => 'Мезеге аш тонь мельгеваномасот.',
 'watchlistanontext' => '$1 тонь ванома мельгеваномаста лопат ваноманкса эли петнеманкса.',
 'watchnologin' => 'Апак сувак',
@@ -1652,11 +1751,7 @@ $3 макссь туфталсь - ''$2''",
 
 'enotif_mailer' => '{{SITENAME}} Пачфнематнень Кучи',
 'enotif_reset' => 'Путомс тяшкс сембе суваф лопатнень лангс',
-'enotif_newpagetext' => 'Тя од лопа.',
 'enotif_impersonal_salutation' => '{{SITENAME}} тиись',
-'changed' => 'полафтсь',
-'created' => 'тиф',
-'enotif_subject' => '{{SITENAME}} page $PAGETITLE has been $CHANGEDORCREATED by $PAGEEDITOR',
 'enotif_lastvisited' => 'Ванк $1 тонь мекольце самдот меле сембе поланематнень няфтеманкса.',
 'enotif_lastdiff' => 'Ванк $1 тя полафнемать няфтеманкса.',
 'enotif_anon_editor' => 'лемфтома тиись $1',
@@ -1700,6 +1795,7 @@ $UNWATCHURL
 'confirmdeletetext' => 'Тон сърхкать нардамс лопать сембе сонь историянц мархта.
 Эняльттяма, кемокстак тон афкукс ёрат тянь тиемс, эди тон шарьхкодьсак мезе лиси тяда меле, ди тон сембе тянь тисак [[{{MediaWiki:Policy-url}}|политик]] коряс.',
 'actioncomplete' => 'Тевонь тиемась анок',
+'actionfailed' => 'Тиемась изь лисе',
 'deletedtext' => 'Лопась "$1" нардафоль. Ванк $2 мекольце нардаматнень няфтеманкса.',
 'dellogpage' => 'Нардамань лувома',
 'dellogpagetext' => 'Ватт сяда мекольце нардаматнень лувомась ала.',
@@ -1812,6 +1908,7 @@ $UNWATCHURL
 'undelete-nodiff' => 'Сядынгольдень верзиет исть мув.',
 'undeletebtn' => 'Мърдафтомс',
 'undeletelink' => 'ваномс/мърдафтомс',
+'undeleteviewlink' => 'ваномс',
 'undeletereset' => 'Валхтомс',
 'undeleteinvert' => 'Валхтомс кочкама',
 'undeletecomment' => 'Мяльполаткс:',
@@ -1858,10 +1955,13 @@ $1',
 'sp-contributions-newbies-title' => 'Тиить путксонза од сёрматфтоматненди',
 'sp-contributions-blocklog' => 'Сёлгомань лувомась',
 'sp-contributions-deleted' => 'нардаф тиинь путксонза',
+'sp-contributions-uploads' => 'Тонгодемат',
+'sp-contributions-logs' => 'Сувама лувомат',
 'sp-contributions-talk' => 'корхтама',
 'sp-contributions-userrights' => 'тиинь видекснень вятема',
 'sp-contributions-search' => 'Вешендемс путкст',
 'sp-contributions-username' => 'IP адрес эли тиить лемоц:',
+'sp-contributions-toponly' => 'Няфтемс аньцек мекольце верзиетнень ёткса видептематне',
 'sp-contributions-submit' => 'Вешендема',
 
 # What links here
@@ -2089,6 +2189,8 @@ $1',
 'allmessagestext' => 'Тя MediaWiki-са васьфневи системонь пачфтематнень лувомась.
 Эняльттяма, сувак [//www.mediawiki.org/wiki/Localisation MediaWiki Локализациес] ди [//translatewiki.net translatewiki.net-с] кда тонь мяльце тиемс эсь путксце марстонь MediaWiki локализациес.',
 'allmessagesnotsupportedDB' => "Тя лопас аш кода кунцемс сяс мес '''\$wgUseDatabaseMessages'''лоткафоль.",
+'allmessages-language' => 'Кяль:',
+'allmessages-filter-submit' => 'Ётамс',
 
 # Thumbnails
 'thumbnail-more' => 'Оцюлгофтомс',
@@ -2096,8 +2198,11 @@ $1',
 'thumbnail_error' => 'Миниатюр тиема эльбятькс: $1',
 'djvu_page_error' => 'DjVu лопась аф сатови',
 'djvu_no_xml' => 'Аш кода латцемс XML DjVu файлти',
+'thumbnail-temp-create' => 'Пингонь миниатюрац аф тиеви',
+'thumbnail-dest-create' => 'Миниатюрась аф ванфтови коза эряви',
 'thumbnail_invalid_params' => 'Аф кондясти миниатюронь арафнеманза',
 'thumbnail_dest_directory' => 'Аш кода ушедомс од вастонь директориесь',
+'thumbnail_image-type' => 'Тя няйфкс форматсь аф нежедеви',
 
 # Special:Import
 'import' => 'Таргамс лопат',
@@ -2107,14 +2212,17 @@ $1',
 Сембе ётковикинь таргама тефне тяшневихть [[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|вима лезкссь]] тевс нолдазь, ванфтт тянь тонь содама машинаса ди тонк тязк.',
+'importtext' => 'Эняльттяма таргак файлать Вики лисьмостонза [[Special:Export|вима лезкссь]]. Ванфтк содама машиназот ди тонк тяза.',
 'importstart' => 'Лопатне тарксевихть...',
 'import-revision-count' => '$1 {{PLURAL:$1|илякстоптома|илякстоптомат}}',
 'importnopages' => 'Ашет лопат таргаманди.',
+'imported-log-entries' => 'Таргак $1 {{PLURAL:$1|лувонь тяштема|лувонь тяштемат}}.',
 'importfailed' => 'Таргамась колавсь: <nowiki>$1</nowiki>',
 'importunknownsource' => 'Аф содаф таргама лисьмоть сортоц',
 'importcantopen' => 'Аш кода панжемс таргама файлть',
@@ -2134,6 +2242,12 @@ $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-invalid' => '"$1" лопась апак тонк сяс мес лемоц аф кондясти.',
+'import-options-wrong' => 'Аф виде {{PLURAL:$2|кочкама|кочкамат}}: <nowiki>$1</nowiki>',
 
 # Import log
 'importlogpage' => 'Таргамань лувома',
@@ -2207,6 +2321,7 @@ $1',
 'tooltip-rollback' => '"Потафтфкс" мърдафтсыне петнематне мекольце тиинь путксонц лопазонза фкя люпштамас.',
 'tooltip-undo' => '"Каряньфтема" мърдафтсыне тя петнемать эди панжесы петнема форм васень няфтемаса.
 Лезни поладомс туфталхт лихтемать эс.',
+'tooltip-summary' => 'Тяштьк нюрьхкяняста сувафтфть колга',
 
 # Metadata
 'notacceptable' => 'Вики серверонди аш кода максомс информациесь стама форматса конань эса тонь клиентти ули кода сонь морафтомс.',
@@ -2767,6 +2882,9 @@ $5
 
 #Путт сембе васу валзюлмафксонь пакшензон тя луфть (строкать) вельфке. Катт тя луфть (строкать) стамкс кодамкс сон ульсь</pre>',
 
+# Special:Tags
+'tag-filter' => '[[Special:Tags|Tag]] педямась:',
+
 # New logging system
 'revdelete-restricted' => 'нолдаф тевс кардафксне системонь вятиксненди',
 'revdelete-unrestricted' => 'системонь вятиксненди кардафксне валхтфт',
index 752f7ec..918cb26 100644 (file)
@@ -185,7 +185,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Fanovàna_farany' ),
        'Recentchangeslinked'       => array( 'Fanarahana_ny_rohy' ),
        'Revisiondelete'            => array( 'Santiôna_voafafa' ),
-       'RevisionMove'              => array( 'Fanalana_santiôna' ),
        'Search'                    => array( 'Fikarohana' ),
        'Shortpages'                => array( 'Pejy_fohy' ),
        'Specialpages'              => array( 'Pejy_manokana' ),
@@ -351,7 +350,7 @@ $messages = array(
 'cancel' => 'Aoka ihany',
 'moredotdotdot' => 'Tohiny...',
 'mypage' => 'Pejiko',
-'mytalk' => 'Ny diniko',
+'mytalk' => 'Dinika',
 'anontalk' => "Resaka ho an'io adiresy IP io",
 'navigation' => 'Fikarohana',
 'and' => '&#32;sy',
@@ -361,7 +360,6 @@ $messages = array(
 'qbbrowse' => 'Tadiavina',
 'qbedit' => 'Hanova',
 'qbpageoptions' => 'Ity pejy ity',
-'qbpageinfo' => 'Pejy fanoroana',
 'qbmyoptions' => 'Ny pejiko',
 'qbspecialpages' => 'Pejy manokana',
 'faq' => 'FMM',
@@ -482,6 +480,10 @@ Mitaky version $1-n'i MediaWiki",
 'youhavenewmessages' => 'Manana $1 ($2).',
 'newmessageslink' => 'hafatra vaovao',
 'newmessagesdifflink' => 'fanovana farany',
+'youhavenewmessagesfromusers' => "Manana $1 avy amin'ny mpikambana {{PLURAL:$3|hafa|$3}} ($2).",
+'youhavenewmessagesmanyusers' => "Manana $1 avy amin'ny mpikambana maro ($2).",
+'newmessageslinkplural' => '{{PLURAL:$1|hafatra iray|hafatra maro}}',
+'newmessagesdifflinkplural' => 'fanovana farany{{PLURAL:$1}}',
 'youhavenewmessagesmulti' => "Manana hafatra vaovao ianao eo amin'ny $1.",
 'editsection' => 'hanova',
 'editold' => 'hanova',
@@ -601,6 +603,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'' ».",
+'invalidtitle-knownnamespace' => 'Lohateny tsy miady amin\'ny fepetra miaraka amin\'ny anaram-balam-pejy "$2" ary soratra "$3"',
 'exception-nologin' => 'Tsy tafiditra',
 
 # Virus scanner
@@ -611,18 +614,15 @@ Ny antony napetraka dia : « ''$2'' ».",
 # Login and logout pages
 'logouttext' => "'''Tafavoaka ianao ankehitriny.'''
 
-Mbola afaka mampiasa ny {{SITENAME}} ianao na dia ef anivoaka aza, na afaka [[Special:UserLogin|miverina mihiditra]] ianao ambanin'ny anaranao na anaram-pikambana hafa.
+Mbola afaka mampiasa ny {{SITENAME}} ianao na dia ef anivoaka aza, na afaka <span class='plainlinks'>[$1 miverina mihiditra]</span> ianao ambanin'ny anaranao na anaram-pikambana hafa.
 Fantaro fa ny endriky ny pejy sasany dia mety mitovy amin'ny endrika nahitanao azy tamin' ianao mbola niditra tato, ho toy izany ny endri-pejy raha tsy nofafanao ny cache.",
-'welcomecreation' => '== Tonga soa, $1! ==
-
-Voaforona soa aman-tsara ny kaontinao.
-Aza hadino ny manova ny [[Special:Preferences|safidinao]]',
 'yourname' => 'Solonanarana',
 'yourpassword' => 'Tenimiafina',
 'yourpasswordagain' => 'Avereno ampidirina eto ny tenimiafina',
 'remembermypassword' => '{{PLURAL:}}Tadidio ny tenimiafiko (mandritry ny $1 andro fara-fahabetsany)',
 'securelogin-stick-https' => "Mijanona tafiditra amin'i HTTPS rehefa tafiditra",
 'yourdomainname' => 'faritra (domaine) misy anao',
+'password-change-forbidden' => "Tsy afaka manova ny tenimiafina ianao eto amin'ity wiki ity.",
 'externaldberror' => "Nisy tsy fetezana angamba teo amin'ny fanamarinana anao tamin'ny sehatra ivelan'ity wiki ity, na tsy manana alalana hanova ny kaontinao ivelany ianao.",
 'login' => 'Midira',
 'nav-login-createaccount' => 'Ampidiro ny solonanarana',
@@ -697,6 +697,7 @@ mba hanaporofoana fa anao io kaonty io.",
 '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.",
+'emaildisabled' => 'Tsy afaka mandefa imailaka ity tranonkala ity.',
 'accountcreated' => 'Kaonty voaforona',
 'accountcreatedtext' => "Voasokatra ilay kaonty hoan'i $1.",
 'createaccount-title' => "Fanokafana kaonty ho an'ny/i {{SITENAME}}",
@@ -862,7 +863,7 @@ Azonao atao ny [[Special:Search/{{PAGENAME}}||Tadiavo ny momba ny {{PAGENAME}}]]
 * '''[{{SERVER}}{{localurl:{{NAMESPACE}}:{{PAGENAME}}|action=edit}} Na forony eto ny lahatsoratra momba ny {{PAGENAME}}]'''.",
 'noarticletext-nopermission' => "Mbola tsy misy lahatsoratra ao amin'io pejy io.
 
-Azonao atao ny [[Special:Search/{{PAGENAME}}|Mikaroka momba ny lohatenin'io pejy io]] ao amin'ny pejy hafa, mitady <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} anatin'ny laogy mikasika azy]</span>",
+Azonao atao ny [[Special:Search/{{PAGENAME}}|mikaroka ity lohateny ity]] eny amin'ny pejy hafa na <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mitady ao amin'ny laogy misy fifandraisana]</span>, fa tsy azonao atao ny mamorona ity pejy ity.",
 'userpage-userdoesnotexist' => 'Mbola tsy nisoratra anarana ato i « <nowiki>$1</nowiki> ». Marino raha tena hamorona ity pejy ity ianao.',
 'userpage-userdoesnotexist-view' => 'Tsy nisoratra anarana ato i « $1 ».',
 'blocked-notice-logextract' => "Ankehitriny ity mpikambana ity dia voasakana.
@@ -887,7 +888,7 @@ Tadidio fa mampiasa soramadinika ny lohatenin'ny pejinao manan-tovana *.css sy *
 'note' => "'''Fanamarihana:'''",
 'previewnote' => "'''Fantaro fa topi-maso fotsiny ity.'''
 Mbola tsy voatahiry ny fanovanao !",
-'continue-editing' => 'Tohizana ny fanovana',
+'continue-editing' => 'Hanohy ny fanovàna',
 '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.",
@@ -966,6 +967,7 @@ Mety voafafa angamba izy.',
 'edit-already-exists' => 'Tsy afaka amboarina ilay pejy vaovao.
 Efa misy izy.',
 'defaultmessagetext' => 'Hafatra raha tsy misy',
+'invalid-content-data' => "Data anaty votoatiny tsy miady amin'ny fepetra",
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Tandremo : Betsaka loatra ny fanantsoana ny tao parser.
@@ -1214,8 +1216,6 @@ $3 santiôna{{PLURAL:}} natsonika tamin'ny [[:$2]]",
 'search-interwiki-caption' => 'zandri-tetikasa',
 'search-interwiki-default' => "Valiny amin'ny $1 :",
 'search-interwiki-more' => '(be kokoa)',
-'search-mwsuggest-enabled' => 'misy hevitra',
-'search-mwsuggest-disabled' => 'tsy misy hevitra',
 'search-relatedarticle' => 'voadinika',
 'mwsuggest-disable' => 'Aza atao ny toro-hevitra AJAX',
 'searcheverything-enable' => "Hitady anatin'ny anaran-tsehatra rehetra:",
@@ -1247,10 +1247,11 @@ ihany no miseho amin'ny vokatry ny karoka).",
 'qbsettings-fixedright' => 'Ankavanana',
 'qbsettings-floatingleft' => 'Mitsingevaheva any ankavanana',
 'qbsettings-floatingright' => 'Mitsigevaheva any ankavanana',
+'qbsettings-directionality' => "Tsy mihetsika, arakaraky ny fizotran'ny soratra amin'ny teninao (avy any havanana miankavia, na avy any havia miankavanana)",
 
 # Preferences page
 'preferences' => 'Ny momba anao',
-'mypreferences' => 'Ny safidiko',
+'mypreferences' => 'Safidy',
 'prefs-edits' => 'isa ny fanovàna :',
 'prefsnologin' => 'Tsy tafiditra',
 'prefsnologintext' => 'Mila <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} misoratra ary tafiditra]</span> amin\'ny kaontinao ianao vao afaka manova ny safidinao.',
@@ -1314,7 +1315,7 @@ Fenoy araka ny datin'ny solosainan'ny mpitsidika",
 'timezoneregion-indian' => 'Ranomasimbe Indianina',
 'timezoneregion-pacific' => 'Ranomasimbe Pasifika',
 'allowemail' => "Ekeo ny handraisana imailaka avy amin'ny mpikambana hafa",
-'prefs-searchoptions' => 'Safidy mikasika ny fikarohana',
+'prefs-searchoptions' => 'Karoka',
 'prefs-namespaces' => "Toeran'anarana",
 'defaultns' => "Fikarohana tsipalotra anatin'ireo anaran-tsehatra ireo :",
 'default' => 'tsipalotra',
@@ -1481,6 +1482,9 @@ Tsy haseho ny adiresy imailakao rehefa manoratra any aminao ny mpikambana hafa."
 'rightslogtext' => "Ity ny laogy momban'ny fanovana ny zom-pikambana.",
 'rightslogentry' => "nanova ny fahefan'ny mpikambana « $1 », avy amin'ny $2 izy lasa $3",
 'rightslogentry-autopromote' => '$2 navadika $3 ho azy',
+'logentry-rights-rights' => "$1 dia nanova ny sokajim-pikambana isian'i $3 avy amin'ny $4 lasa $5",
+'logentry-rights-rights-legacy' => "$1 nanova ny vonodrom-pikambana isian'i $3",
+'logentry-rights-autopromote' => 'Lasa $5 ho azy i $1 izay $4 taloha',
 'rightsnone' => '(tsy misy)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1683,6 +1687,7 @@ Misafidia anaran-drakitra mambangovango.",
 
 $1",
 'upload-warning-subj' => 'Fampitandremana rehefa mampiditra',
+'upload-warning-msg' => "Nisy olana nitranga tam-pampidirana avy amin'i [$2] afaka miverina any amin'ny [[Special:Upload/stash/$1|formiolera fampidirana]] ianao hamahana izany olana izany.",
 
 'upload-proto-error' => 'Protokolina diso',
 'upload-proto-error-text' => "Mila URL manomboka amin'ny <code>http://</code> na <code>ftp://</code> ny fampidiran-drakitra.",
@@ -1695,10 +1700,12 @@ Raha mbola misy foana ilay  olana, manorata any amin'ny [[Special:ListUsers/syso
 'upload-too-many-redirects' => "Be loatra ny fihodinan'ny URL.",
 'upload-unknown-size' => 'tsy fantatra ny habe',
 'upload-http-error' => 'Nisy tsy fetezana HTTP nitranga : $1',
+'upload-copy-upload-invalid-domain' => "Tsy misy eto amin'ity dômenina ity ny tahaky ny upload.",
 
 # File backend
 'backend-fail-stream' => 'Tsy afaka mamaky ilay rakitra $1.',
 'backend-fail-backup' => 'Tsy afaka mitahiry ilay rakitra $1.',
+'backend-fail-notexists' => 'Tsy misy ilay rakitra $1.',
 'backend-fail-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.',
@@ -1748,9 +1755,9 @@ Avereno fanindroany.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Tsy afa-mankao',
-'img-auth-nopathinfo' => "Tsy misy ny PATH_INFO.
+'img-auth-nopathinfo' => "Tsy misy PATH_INFO.
 Tsy voaparametatra ny lohamilinao hampita io fampahalalàna io.
-Mety mifototra amin'ny CGI izy ka mety tsy mahazaka img_auth
+Mety mampiasa CGI angamba ilay lohamilina ka tsy mahazaka an'i img_auth
 Vangio ny https://www.mediawiki.org/wiki/Manual:Image_Authorization.",
 'img-auth-notindir' => 'Ny lalana nangatahana dia tsy ny petra-drakitra nokaonfigiorena.',
 'img-auth-badtitle' => "Tsy afaka mamorona lohateny azo ampiasaina avy amin'ny « $1 ».",
@@ -1907,7 +1914,7 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'statistics-views-total' => 'Tsidika',
 'statistics-views-peredit' => 'Tsidika isaky ny fanovana',
 'statistics-users' => '[[Special:ListUsers|Mpikambana]] nisoratra anarana',
-'statistics-users-active' => 'Mpikambana manova matetika',
+'statistics-users-active' => 'Mpikambana mavitrika',
 'statistics-users-active-desc' => "Mpikambana nanao zavatra teto tanatin'ny $1 andro{{PLURAL:}}.",
 'statistics-mostpopular' => 'Pejy voatsidika',
 
@@ -1959,6 +1966,7 @@ Aza manadino manamarina raha tsy misy rohy makany amin'ny endrika hafa alohan'ny
 'mostlinkedtemplates' => "Misy firohizana betsaka amin'ny endrika",
 'mostcategories' => 'Lahatsoratra misy sokajy betsaka indrindra',
 'mostimages' => "Misy firohizana betsaka amin'ny sary",
+'mostinterwikis' => 'Pejy be interwiki indrindra',
 'mostrevisions' => 'Lahatsoratra niova im-betsaka indrindra',
 'prefixindex' => "Pejy manomboka amin'ny...",
 'prefixindex-namespace' => 'Ny pejy rehetra mitondra ny tovona (anaran-tsehatra $1)',
@@ -2012,6 +2020,7 @@ wiki ity aza izy.</p>",
 Azonao ferana ny fahitana ny tao amin'ny fisafidianana karazana laogy iray, anaram-pikambana iray na pejy iray (samihafa ny sorabaventy sy soramadinika).",
 'logempty' => 'Tsy nahitana.',
 'log-title-wildcard' => "Hitady amin'ny lohateny manomboka amin'io soratra io",
+'showhideselectedlogentries' => 'Haneho/Hanafina ny iditry ny laogy nofidiana',
 
 # Special:AllPages
 'allpages' => 'Pejy rehetra',
@@ -2029,6 +2038,10 @@ Azonao ferana ny fahitana ny tao amin'ny fisafidianana karazana laogy iray, anar
 'allpagesprefix' => "Asehoy ny pejy miantomboka amin'ny:",
 'allpagesbadtitle' => 'Tsy mety ny anaram-pejy : misy tovona iraisam-piteny na interwiki natokana, na misy soratra iray na maro tsy azo ampiasaina anaty anaram-pejy.',
 'allpages-bad-ns' => '{{SITENAME}} dia tsy manana anaran-tsehatra mitondra anarana « $1 ».',
+'allpages-hide-redirects' => 'Haneho ny fihodinana',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Hijery ny farany indrindra',
 
 # Special:Categories
 'categories' => 'Sokajy',
@@ -2084,6 +2097,8 @@ Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
 'listgrouprights-removegroup' => "Manala ny mpikambana {{PLURAL:$2}}amin'ny gropy : $1",
 'listgrouprights-addgroup-all' => 'Manampy mpikambana anaty vondrona rehetra',
 'listgrouprights-removegroup-all' => 'Manala mpikambana anaty gropy rehetra',
+'listgrouprights-addgroup-self' => "Afaka manampy ny tenany amin'ny vondrona{{PLURAL:$2}}: $1",
+'listgrouprights-removegroup-self' => "Afaka manala ny tenany amin'ny vondrona{{PLURAL:$2}} : $1",
 'listgrouprights-addgroup-self-all' => "Manampy ny vondrom-pikambana rehetra amin'ny kaontiny",
 'listgrouprights-removegroup-self-all' => "Manala ny vondrom-pikambana rehetra amin'ny kaontiny",
 
@@ -2091,6 +2106,8 @@ Protokoly zaka <code>$1</code> aza ampiana ao amin'ny karokao izy ireo.",
 'mailnologin' => 'Tsy misy adiresy handefasana ny tenimiafina',
 'mailnologintext' => "Mila [[Special:UserLogin|miditra]] ianao sady manana imailaka mandeha sy voamarina ao amin'ny [[Special:Preferences|mombamomba anao]] vao afaka mandefa imailaka amin'ny mpikambana hafa.",
 'emailuser' => 'Andefaso imailaka io mpikambana io',
+'emailuser-title-target' => "Handefa mailaka any amin'ity mpikambana ity{{GENDER:$1}}",
+'emailuser-title-notarget' => "Handefa imailaka an'ilay mpikambana",
 'emailpage' => 'Andefaso imailaka io mpikambana io',
 'emailpagetext' => "Raha nametraka adiresy tena miasa tao amin'ny [[Special:Preferences|mombamomba azy io mpikambana io]],
 dia ahafahana mandefa hafatra tokana ho any aminy ity fisy eto ambany ity.
@@ -2127,7 +2144,7 @@ na tsy maniry handray imailaka avy amin'ny mpikambana hafa izy.",
 
 # Watchlist
 'watchlist' => 'Narahiko maso',
-'mywatchlist' => 'Pejy arahako',
+'mywatchlist' => 'Pejy arahana',
 'watchlistfor2' => "Ho an'i $1 $2",
 'nowatchlist' => 'Tsy manaraka pejy ianao.',
 'watchlistanontext' => "Andana $1 hahafahanao mijery na manova zavatra ao amin'ny pejy arahanao.",
@@ -2166,11 +2183,7 @@ Aoriana, raha irinao ny hanaisotra azy ao amin'ny pejy arahanao maso, dia tsindr
 
 'enotif_mailer' => "Fomba fampandrenesana amin'ny alalan'ny imailaka an'i {{SITENAME}}",
 'enotif_reset' => 'Marihana ho efa voavaky ny pejy rehetra',
-'enotif_newpagetext' => 'Pejy vaovao ity pejy ity.',
 'enotif_impersonal_salutation' => "Mpikamban'i {{SITENAME}}",
-'changed' => 'voaova',
-'created' => 'voaforona',
-'enotif_subject' => '$CHANGEDORCREATED $PAGEEDITOR ny pejy $PAGETITLE tao amin\'ny {{SITENAME}}',
 'enotif_lastvisited' => "Jereo eto $1 ny niova rehetra hatramin'ny fitsidihanao farany.",
 'enotif_lastdiff' => 'Jereo $1 mba ahitana ireo fanovana ireo.',
 'enotif_anon_editor' => 'mpikambana tsy nisoratra anarana $1',
@@ -2238,6 +2251,7 @@ ataovy am-pitandremana ity tao ity.",
 'rollback' => 'Foano indray ilay fanovana',
 'rollback_short' => 'Aza ovaina indray',
 'rollbacklink' => 'foano',
+'rollbacklinkcount' => 'hamoana fanovana{{PLURAL:$1}} $1',
 'rollbackfailed' => "Tsy voaverina amin'ny teo aloha",
 'cantrollback' => "Tsy afaka iverenana ny fanovana; ny mpanova farany ihany no tompon'ny pejy.",
 'alreadyrolled' => "Tsy afaka foanana ny fanovana ny pejy « [[:$1]] » nataon'i [[User:$2|$2]] ([[User talk:$2|Dinika]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])
@@ -2373,12 +2387,13 @@ $1',
 'namespace' => 'Anaran-tsehatra :',
 'invert' => 'Ampifamadiho ny safidy',
 'namespace_association' => 'Anaran-tsehatra nampiarahana',
+'tooltip-namespace_association' => 'Mariho ity boaty ity mba hampiditra ny pejin-dresaky ny anaran-tsehatra voafidy',
 'blanknamespace' => '(fotony)',
 
 # Contributions
 'contributions' => "Fandraisan'anjaran'ny mpikambana",
 'contributions-title' => "Fandraisan'anjaran'i $1",
-'mycontris' => 'Ny nosoratako',
+'mycontris' => "Fandraisan'anjara",
 'contribsub2' => "ho an'ny $1 ($2)",
 'nocontribs' => "Tsy misy fanovana mifanaraka amin'ireo critères ireo.",
 'uctop' => ' (loha)',
@@ -2419,7 +2434,7 @@ Aseho eo ambany ny iditra farany ao amin'ny laogim-panakanana  mba hampahalala :
 'whatlinkshere-hideredirs' => '$1 ny fihodinana',
 'whatlinkshere-hidetrans' => '$1 ny tsofo-pejy',
 'whatlinkshere-hidelinks' => '$1 ny rohy',
-'whatlinkshere-hideimages' => '$1 rakitra mirohy',
+'whatlinkshere-hideimages' => '$1 ny rakitra mirohy',
 'whatlinkshere-filters' => 'sivana',
 
 # Block/unblock
@@ -2457,6 +2472,7 @@ Fenoy etsy ambany ny antony manokana (ohatra, mitanisà pejy nosomparana).",
 'blockipsuccesstext' => 'Voasakana i [[Special:Contributions/$1|$1]].
 <br />Jereo ny [[Special:BlockList|lisitry ny IP voasakana]] raha hanala ny sakana efa misy.',
 'ipb-blockingself' => 'Hanakana ny kaontinao ianao ! Tena hanao izany ve ?',
+'ipb-confirmhideuser' => "Eo ampanakanana mpikambana miaraka amin'ny \"fanakonana mpikambana\" ampiasaina. Izany dia mamafa ny anaran'ilay mpikambana amin'ny listra ary amin'ny iditra laogy. Tena hanao izany ve ianao?",
 'ipb-edit-dropdown' => 'Hanova ny antony fanakanana tsipalotra',
 'ipb-unblock-addr' => "Hanala ny sakan' i $1",
 'ipb-unblock' => "Hanala ny sakan'ny mpikambana na adiresy IP",
@@ -2572,6 +2588,7 @@ Azafady mba antero fa izay tokoa no tena irinao.",
 'lockfilenotwritable' => "Tsy azo soratana ny rakitra fanidiana ny banky angona.
 Mba hahafahany manidy na mamoha ny banky angona, mila azo soratan'ny lohamilin-tranonkala izy.",
 'databasenotlocked' => 'Tsy voaidy ny banky angona.',
+'lockedbyandtime' => "(nataon'i $1 ny $2 tamin'ny $3)",
 
 # Move page
 'move-page' => "Hanova anarana an'i $1",
@@ -2914,6 +2931,13 @@ Raha alefanao ilay izy, mety ho simban'io renifango io ny solosainao.",
 'bydate' => 'araka ny daty',
 'sp-newimages-showfrom' => "Aseho ny rakitra vaovao manomboka amin'ny $1 tamin'ny $2",
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds' => 'segondra{{PLURAL:$1}}',
+'minutes' => 'minitra{{PLURAL:$1}}',
+'hours' => 'ora{{PLURAL:$1}}',
+'days' => 'andro{{PLURAL:$1}}',
+'ago' => '$1 lasa izay',
+
 # Bad image list
 'bad_image_list' => "Ity ny andrefiny :
 
@@ -2968,8 +2992,8 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 '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-pixelydimension' => 'Haavon-tsary',
+'exif-pixelxdimension' => 'Halala-tsary',
 'exif-usercomment' => 'Diniky ny mpikambana',
 'exif-relatedsoundfile' => 'Rakitra audio miaraka',
 'exif-datetimeoriginal' => 'Daty fangalana niaviana',
@@ -2980,7 +3004,7 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'exif-fnumber' => 'Isa F',
 'exif-exposureprogram' => 'Fomba famakiana',
 'exif-isospeedratings' => 'ISO',
-'exif-aperturevalue' => 'Sanasana',
+'exif-aperturevalue' => 'Fisanasana APEX',
 'exif-lightsource' => 'Loharanon-kazavana',
 'exif-flashenergy' => "Angôvon'akonkazavana",
 'exif-filesource' => 'Fangon-drakitra',
@@ -3001,9 +3025,17 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 'exif-gpsareainformation' => 'Anaram-paritra GPS',
 'exif-gpsdatestamp' => 'Daty GPS',
 'exif-countrycreated' => 'Firenena nangalana ilay sary',
+'exif-cameraownername' => "Tompon'ilay mpaka sary",
+'exif-licenseurl' => "URl an'ilay lisansa",
+'exif-pngfilecomment' => "Famoahan-kevitra momban'ilay rakitra PNG",
+
+'exif-copyrighted-true' => "Iharan'ny zom-pamorona",
+'exif-copyrighted-false' => 'Valam-bahoaka',
 
 'exif-unknowndate' => 'Daty tsy fantatra',
 
+'exif-orientation-1' => 'Tsotra',
+
 'exif-componentsconfiguration-0' => 'tsy nahitana',
 
 'exif-exposureprogram-0' => 'Tsy nolazaina',
@@ -3012,6 +3044,9 @@ Tokony sary tsy misy na sary tsy izy ny rohy voalohany anaty andalana iray .
 
 'exif-meteringmode-0' => 'Tsy fantatra',
 'exif-meteringmode-1' => 'Elanelana',
+'exif-meteringmode-3' => 'Spot',
+'exif-meteringmode-5' => 'Modely',
+'exif-meteringmode-255' => 'Hafa',
 
 # Flash modes
 'exif-flash-mode-3' => 'Toetra aotômatika',
@@ -3264,6 +3299,11 @@ Aseho amin'ny tena habeny ny sary aseho, ny hafa dia alefa miaraka amin'ny rindr
 'logentry-suppress-delete' => "nofafan'i $1 ny pejy $3",
 'revdelete-restricted' => "nametraka fanerena ho an'ny mpandrindra",
 'revdelete-unrestricted' => "fanerena nesorina tamin'ny mpandrindra",
-'newuserlog-byemail' => 'tenimiafina nalefa imailaka',
+'logentry-move-move' => "nanova ny anaran'i $3 ho $4 i $1",
+'logentry-newusers-newusers' => 'Noforonina ny kaontim-pikambana $1',
+'logentry-newusers-create' => 'Noforonina ny kaontim-pikambana $1',
+'logentry-newusers-create2' => "Noforonin'i $1 ny kaomtim-pikambana $3",
+'logentry-newusers-autocreate' => 'Noforonina ho azy ny kaontim-pikambana $&',
+'newuserlog-byemail' => "tenimiafina nalefa tamin'ny imailaka",
 
 );
index 2e6cc29..53b0097 100644 (file)
@@ -515,8 +515,6 @@ $messages = array(
 'search-interwiki-caption' => 'Родо проект-влак',
 'search-interwiki-default' => "$1'ште мумо:",
 'search-interwiki-more' => '(эше)',
-'search-mwsuggest-enabled' => 'темлымаш дене',
-'search-mwsuggest-disabled' => 'темлымаш деч посна',
 'searchall' => 'чыла',
 'nonefound' => "'''Ешартыш''':  Посна каласыме огыл дык, кычалмаш южо лӱм-влакын кумдыкышто эрта. Уло лӱм-влакын кумдыкышто кычалашлан(чӱктен каҥашымаш лаштык-влакым, ямдылык-влакым и туге молат) шке йодмашыштет ''all:'' префиксым кучылт, але кӱлешан лӱм-влакын кумдыкым ончыкто.",
 'search-nonefound' => 'Тыйын йодышлан нимом кычален мумо уке.',
@@ -664,7 +662,7 @@ $messages = array(
 'filehist-dimensions' => 'Кугытшо',
 'filehist-filesize' => 'Файлын кугытшо',
 'filehist-comment' => 'Файл нерген:',
-'imagelinks' => 'Файл деке кылвер-влак',
+'imagelinks' => 'Файлым кучылтмаш',
 'linkstoimage' => 'Тиде {{PLURAL:$1|$1 лаштык саде файл дене кылдалтын|$1 лаштык-влак саде файл дене кылдалтыныт}}:',
 'nolinkstoimage' => 'Тиде файл дене кылдалтше ик лаштыкат уке.',
 'sharedupload' => 'Тиде файлын верже: $1, туге гынат, тудым моло веренат кучылташ лиеш.',
@@ -721,6 +719,7 @@ $messages = array(
 'shortpages' => 'Кӱчык лаштык-влак',
 'longpages' => 'Кужу лаштык-влак',
 'protectedpages' => 'Тӧрлатымаш деч аралыме лаштык-влак',
+'usercreated' => '$1, $2 шагатлан {{GENDER:$3|регистрацийым эртен|регистрацийым эртен}}',
 'newpages' => 'У лаштык-влак',
 'newpages-username' => 'Пайдаланышын лӱмжӧ:',
 'move' => 'Кусараш',
@@ -792,8 +791,6 @@ $messages = array(
 'watching' => 'Эскерымаш лӱмерыш ешарымаш...',
 'unwatching' => 'Эскерымаш лӱмер гыч шӧрымаш...',
 
-'enotif_newpagetext' => 'Тиде у лаштык.',
-
 # Delete
 'deletepage' => 'Лаштыкым шӧраш',
 'delete-confirm' => 'Шӧраш "$1"',
@@ -879,6 +876,7 @@ $messages = array(
 'whatlinkshere-hideredirs' => 'вес вере колтымаш-влакым $1',
 'whatlinkshere-hidetrans' => 'пуртымашым $1',
 'whatlinkshere-hidelinks' => 'кылвер-влакым $1',
+'whatlinkshere-hideimages' => 'сӱрет деке кылвер-влакым $1',
 'whatlinkshere-filters' => 'Фильтр-влак',
 
 # Block/unblock
@@ -937,6 +935,7 @@ $messages = array(
 'export' => 'Лаштык-влакым келыштараш',
 
 # Namespace 8 related
+'allmessagesname' => 'Лӱм',
 'allmessages-filter-all' => 'Чыла',
 
 # Thumbnails
index a5ea00d..0ac1ac6 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'    => 'Rātapu',
-'monday'    => 'Rāhina',
-'tuesday'   => 'Rātū',
+'sunday' => 'Rātapu',
+'monday' => 'Rāhina',
+'tuesday' => 'Rātū',
 'wednesday' => 'Rāapa',
-'thursday'  => 'Rāpare',
-'friday'    => 'Rāmere',
-'saturday'  => 'Rāhoroi',
-'january'   => 'Kohi-tātea',
-'february'  => 'Hui-tanguru',
-'march'     => 'Poutū-te-rangi',
-'april'     => 'Paenga-whāwhā',
-'may_long'  => 'Haratua',
-'june'      => 'Pipiri',
-'july'      => 'Hōngongoi',
-'august'    => 'Here-turi-kōkā',
+'thursday' => 'Rāpare',
+'friday' => 'Rāmere',
+'saturday' => 'Rāhoroi',
+'january' => 'Kohi-tātea',
+'february' => 'Hui-tanguru',
+'march' => 'Poutū-te-rangi',
+'april' => 'Paenga-whāwhā',
+'may_long' => 'Haratua',
+'june' => 'Pipiri',
+'july' => 'Hōngongoi',
+'august' => 'Here-turi-kōkā',
 'september' => 'Mahuru',
-'october'   => 'Whiringa-ā-nuku',
-'november'  => 'Whiringa-ā-rangi',
-'december'  => 'Hakihea',
+'october' => 'Whiringa-ā-nuku',
+'november' => 'Whiringa-ā-rangi',
+'december' => 'Hakihea',
 
-'cancel'     => 'Whakakore',
-'mytalk'     => 'Karere mōku',
+'cancel' => 'Whakakore',
+'mytalk' => 'Karere mōku',
 'navigation' => 'Huarahi',
 
 # Cologne Blue skin
@@ -44,39 +44,39 @@ $messages = array(
 # Vector skin
 'vector-view-view' => 'Rīti',
 
-'help'             => 'Whakamārama',
-'search'           => 'Rapua',
-'go'               => 'Haere',
-'history'          => 'Kōrero Nehe',
-'history_short'    => 'Tuhinga/kaituhi',
+'help' => 'Whakamārama',
+'search' => 'Rapua',
+'go' => 'Haere',
+'history' => 'Kōrero Nehe',
+'history_short' => 'Tuhinga/kaituhi',
 'printableversion' => 'Tāia',
-'permalink'        => 'Hononga toitū',
-'edit'             => 'Whakatika',
-'delete'           => 'tangohia',
-'protect'          => 'Whakangungua',
+'permalink' => 'Hononga toitū',
+'edit' => 'Whakatika',
+'delete' => 'tangohia',
+'protect' => 'Whakangungua',
 'talkpagelinktext' => 'Kōrerohia',
-'talk'             => 'Kōrerorero',
-'toolbox'          => 'Pouaka utauta',
+'talk' => 'Kōrerorero',
+'toolbox' => 'Pouaka utauta',
 
 # 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'            => 'Mo {{SITENAME}}',
-'currentevents'        => 'Kōrero',
-'currentevents-url'    => 'Project:Kōrero',
-'mainpage'             => 'Hau Kāinga',
+'aboutsite' => 'Mo {{SITENAME}}',
+'currentevents' => 'Kōrero',
+'currentevents-url' => 'Project:Kōrero',
+'mainpage' => 'Hau Kāinga',
 'mainpage-description' => 'Hau Kāinga',
-'portal'               => 'Tomokanga hapori',
-'portal-url'           => 'Project:Tomokanga hapori',
-'privacy'              => 'Tikanga tūmataiti',
-'privacypage'          => 'Project:Tikanga tūmataiti',
+'portal' => 'Tomokanga hapori',
+'portal-url' => 'Project:Tomokanga hapori',
+'privacy' => 'Tikanga tūmataiti',
+'privacypage' => 'Project:Tikanga tūmataiti',
 
-'toc'     => 'Rārangi kōrero',
+'toc' => 'Rārangi kōrero',
 'showtoc' => 'whakakite',
 'hidetoc' => 'hunaia',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'tuhi pānui',
+'nstab-main' => 'tuhi pānui',
 'nstab-template' => 'papa tauira',
-'nstab-help'     => 'Āwhina',
+'nstab-help' => 'Āwhina',
 'nstab-category' => 'Wāhanga',
 
 # Login and logout pages
@@ -84,19 +84,19 @@ $messages = array(
 
 # Edit pages
 'savearticle' => 'Tiaki',
-'showdiff'    => 'Tiro rerekētanga',
+'showdiff' => 'Tiro rerekētanga',
 
 # Preferences page
 'preferences' => 'Kōwhiringa',
 
 # Recent changes
 'recentchanges' => 'Rerekētanga hōu',
-'hide'          => 'Hunaia',
-'show'          => 'Whakaaturia',
+'hide' => 'Hunaia',
+'show' => 'Whakaaturia',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Rerekētanga pū tahi',
-'recentchangeslinked-feed'    => 'Rerekētanga pū tahi',
+'recentchangeslinked' => 'Rerekētanga pū tahi',
+'recentchangeslinked-feed' => 'Rerekētanga pū tahi',
 'recentchangeslinked-toolbox' => 'Rerekētanga pū tahi',
 
 # Upload
@@ -109,18 +109,18 @@ $messages = array(
 'move' => 'Nekehia',
 
 # Special:AllPages
-'allpages'       => 'Ngā whārangi katoa',
+'allpages' => 'Ngā whārangi katoa',
 'allpagessubmit' => 'Haere',
 
 # Watchlist
-'watchlist'   => 'Rārangi mātaki',
+'watchlist' => 'Rārangi mātaki',
 'mywatchlist' => 'Rārangi mātaki',
-'watch'       => 'Mātaki',
-'unwatch'     => 'kāti te mātaki',
+'watch' => 'Mātaki',
+'unwatch' => 'kāti te mātaki',
 
 # Contributions
 'contributions' => 'Ngā mahi a tēnei mema',
-'mycontris'     => 'āku mahi',
+'mycontris' => 'āku mahi',
 
 # What links here
 'whatlinkshere' => 'Ngā hononga mai',
index 483f77e..ca0b296 100644 (file)
@@ -8,9 +8,11 @@
  * @file
  *
  * @author Bennylin
+ * @author Iwan Novirion
  * @author Luthfi94
  * @author Naval Scene
  * @author Rahmatdenas
+ * @author SpartacksCompatriot
  * @author VoteITP
  */
 
@@ -24,7 +26,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Suruakkan suntingan nan lah dijago di parubahan tabaru',
 'tog-newpageshidepatrolled' => 'Suruakkan halaman nan lah dijago dari senarai halaman baru',
 'tog-extendwatchlist' => 'Kambangkan senarai pantauan untuak malihek sado parubahan, indak nan baru se',
-'tog-usenewrc' => 'Gunoan parubahan terkini tingkek lanjut (perlu JavaScript)',
+'tog-usenewrc' => 'Kalompok parubahan dek laman dalam parubahan tabaru jo daftar pantauan (paralu JavaScript)',
 'tog-numberheadings' => 'Agiah nomor judua sacaro otomatis',
 'tog-showtoolbar' => 'Tampilkan bilah suntiang (paralu JavaScript)',
 'tog-editondblclick' => 'Suntiang laman jo klik ganda (JavaScript)',
@@ -32,20 +34,20 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Hiduikan bagian panyuntiangan jo mangklik kanan pado judul bagian (JavaScript)',
 'tog-showtoc' => 'Caliakkan dafta isi (untuak laman nan mampunyoi labiah dari 3 subbagian)',
 'tog-rememberpassword' => 'Kana log masuak denai di peramban ko (salamo $1 {{PLURAL:$1|hari|hari}})',
-'tog-watchcreations' => 'Tambahkan halaman nan denai buek ka senarai pantauan',
-'tog-watchdefault' => 'Tambahkan halaman yang denai sunting ka senarai pantauan',
-'tog-watchmoves' => 'Tambahkan halaman yang denai pindahkan ka senarai pantauan',
-'tog-watchdeletion' => 'Tambahkan halaman yang denai hapuih ka senarai pantauan',
+'tog-watchcreations' => 'Tambahkan laman nan den buek jo gambar nan den unggah ka daftar pantauan',
+'tog-watchdefault' => 'Tambahkan laman jo gambar nan den suntiang ka daftar pantauan',
+'tog-watchmoves' => 'Tambahkan laman jo gambar nan den pindah ka daftar pantauan',
+'tog-watchdeletion' => 'Tambahkan laman jo gambar nan den hapuih ka daftar pantauan',
 'tog-minordefault' => 'Tandoi sadoalah suntiangan sabagai suntiangan ketek sacaro baku',
 'tog-previewontop' => 'Tampilkan pratonton sabalun kotak suntiang',
 'tog-previewonfirst' => 'Caliakkan pratayang pado suntiangan patamo',
 'tog-nocache' => 'Matikan panyinggahan laman peramban',
-'tog-enotifwatchlistpages' => 'E-mail ambo jiko laman nan denai jago lah barubah',
+'tog-enotifwatchlistpages' => 'Kirimkan surel kalau laman atau gambar pado daftar pantauan lah barubah',
 'tog-enotifusertalkpages' => 'E-mail ambo jiko laman barundiang denai lah barubah',
-'tog-enotifminoredits' => 'E-mail ambo walau hanyo ado parubahan saketek',
+'tog-enotifminoredits' => 'Kirimkan surel juo untuk saketek suntingan pado laman jo gambar',
 'tog-enotifrevealaddr' => 'Cogokan alamaik e-mail den pado e-mail notifikasi',
 'tog-shownumberswatching' => 'Tujuakkan jumlah pamantau',
-'tog-oldsig' => 'Pratayang tando tangan:',
+'tog-oldsig' => 'Tando tangan kini:',
 'tog-fancysig' => 'Palakuan tando tangan sabagai teks wiki (tanpa suatu tautan otomatis)',
 'tog-externaleditor' => 'Gunokan editor eksternal sacaro bawaan (untuak nan ahli sajo, kabutuahan pangaturan khusus pado komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.].)',
 'tog-externaldiff' => 'Gunokan diff eksternal sacaro bawaan (untuak nan ahli sajo, kabutuahan pangaturan khusus pado komputer Sanak [//www.mediawiki.org/wiki/Manual:External_editors Informasi labiah lanjuik.].)',
@@ -65,7 +67,7 @@ $messages = array(
 
 'underline-always' => 'Taruih',
 'underline-never' => 'Indak pernah',
-'underline-default' => 'Bawaan panjalajah web',
+'underline-default' => 'Kulik atau panjalajah web bawaan',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Gaya tulisan komputer pado kotak panyuntiangan:',
@@ -82,18 +84,18 @@ $messages = array(
 'thursday' => 'Kamih',
 'friday' => 'Jumek',
 'saturday' => 'Sabtu',
-'sun' => 'Aha',
+'sun' => 'Min',
 'mon' => 'Sin',
 'tue' => 'Sal',
 'wed' => 'Rab',
 'thu' => 'Kam',
 'fri' => 'Jum',
-'sat' => 'Sab',
+'sat' => 'Sat',
 'january' => 'Januari',
-'february' => 'Februari',
+'february' => 'Pebruari',
 'march' => 'Maret',
 'april' => 'April',
-'may_long' => 'Mei',
+'may_long' => 'Mai',
 'june' => 'Juni',
 'july' => 'Juli',
 'august' => 'Agustus',
@@ -102,10 +104,10 @@ $messages = array(
 'november' => 'November',
 'december' => 'Desember',
 'january-gen' => 'Januari',
-'february-gen' => 'Februari',
+'february-gen' => 'Pebruari',
 'march-gen' => 'Maret',
 'april-gen' => 'April',
-'may-gen' => 'Mei',
+'may-gen' => 'Mai',
 'june-gen' => 'Juni',
 'july-gen' => 'Juli',
 'august-gen' => 'Agustus',
@@ -114,10 +116,10 @@ $messages = array(
 'november-gen' => 'November',
 'december-gen' => 'Desember',
 'jan' => 'Jan',
-'feb' => 'Feb',
+'feb' => 'Peb',
 'mar' => 'Mar',
 'apr' => 'Apr',
-'may' => 'Mei',
+'may' => 'Mai',
 'jun' => 'Jun',
 'jul' => 'Jul',
 'aug' => 'Agu',
@@ -140,7 +142,7 @@ $messages = array(
 'category-article-count-limited' => 'Kategori iko mamiliki {{PLURAL:$1|ciek laman|$1 laman}} barikuik.',
 'category-file-count' => '{{PLURAL:$2|Kategori iko hanyo mamiliki ciek laman barikuik.|Kategori iko mamiliki {{PLURAL:$1|laman|$1 laman}} barikuik, dari total $2.}}',
 'category-file-count-limited' => 'Kategori iko mamiliki {{PLURAL:$1|laman|$1 laman}} barikuik.',
-'listingcontinuesabbrev' => 'cont.',
+'listingcontinuesabbrev' => 'lanjuik',
 'index-category' => 'Laman nan diindeks',
 'noindex-category' => 'Laman nan indak diindeks',
 'broken-file-category' => 'Laman jo gambar rusak',
@@ -150,10 +152,10 @@ $messages = array(
 'newwindow' => '(buka di jendela baru)',
 'cancel' => 'Batalkan',
 'moredotdotdot' => 'Lainnyo...',
-'mypage' => 'Laman ambo',
-'mytalk' => 'Ota denai',
+'mypage' => 'Laman',
+'mytalk' => 'Maota',
 'anontalk' => 'Ota IP iko',
-'navigation' => 'Navigasi',
+'navigation' => 'Pinteh',
 'and' => '&#32;jo',
 
 # Cologne Blue skin
@@ -161,7 +163,6 @@ $messages = array(
 'qbbrowse' => 'Browse',
 'qbedit' => 'Suntiang',
 'qbpageoptions' => 'Laman ko',
-'qbpageinfo' => 'Konteks',
 'qbmyoptions' => 'Laman denai',
 'qbspecialpages' => 'Halaman istimewa',
 'faq' => 'FAQ',
@@ -173,17 +174,18 @@ $messages = array(
 'vector-action-move' => 'Pindahkan',
 'vector-action-protect' => 'Lindungi',
 'vector-action-undelete' => 'Pambatalan panghapusan',
-'vector-action-unprotect' => 'Palinduangan',
-'vector-simplesearch-preference' => 'Aktifkan pancarian saran nan disampurnokan (hanyo kulik Vector)',
+'vector-action-unprotect' => 'Tuka palinduangan',
+'vector-simplesearch-preference' => 'Aktifkan kotak pancarian sadarano (hanyo kulik Vector)',
 'vector-view-create' => 'Buek',
 'vector-view-edit' => 'Suntiang',
-'vector-view-history' => 'Caliak riwayat nan lalu',
+'vector-view-history' => 'Caliak riwayaik nan lalu',
 'vector-view-view' => 'Baco',
 'vector-view-viewsource' => 'Caliak sumber',
 'actions' => 'Tindakan',
 'namespaces' => 'Ruang namo:',
 'variants' => 'Variasi:',
 
+'navigation-heading' => 'Menu navigasi',
 'errorpagetitle' => 'Kesalahan',
 'returnto' => 'Baliak ka $1',
 'tagline' => 'Dari {{SITENAME}}',
@@ -193,10 +195,10 @@ $messages = array(
 'go' => 'Tuju',
 'searcharticle' => 'Tuju',
 'history' => 'Riwayat halaman',
-'history_short' => 'Riwayat',
+'history_short' => 'Riwayaik',
 'updatedmarker' => 'diubah sajak kunjuangan tarakhir ambo',
 'printableversion' => 'Versi cetak',
-'permalink' => 'Pranala permanen',
+'permalink' => 'Pranala parmanen',
 'print' => 'Cetak',
 'view' => 'Tampilkan',
 'edit' => 'Suntiang',
@@ -210,17 +212,17 @@ $messages = array(
 'protect' => 'Lindungi',
 'protect_change' => 'ubah',
 'protectthispage' => 'Lindungi laman iko',
-'unprotect' => 'Palinduangan',
-'unprotectthispage' => 'Bukak palindungan laman iko',
+'unprotect' => 'Tuka palinduangan',
+'unprotectthispage' => 'Tuka palindungan laman ko',
 'newpage' => 'Laman baru',
 'talkpage' => 'Musyawarahkan laman ko',
 'talkpagelinktext' => 'Maota',
 'specialpage' => 'Laman istimewa',
-'personaltools' => 'Peralatan pribadi',
+'personaltools' => 'Pakakeh paribadi',
 'postcomment' => 'Bagian baru',
 'articlepage' => 'Liek isi laman',
-'talk' => 'Ota',
-'views' => 'Tampilan',
+'talk' => 'Rundiang',
+'views' => 'Caliak',
 'toolbox' => 'Kotak pakakeh',
 'userpage' => 'Liek laman pangguno',
 'projectpage' => 'Caliak laman proyek',
@@ -233,11 +235,11 @@ $messages = array(
 'otherlanguages' => 'Dalam baso lain',
 'redirectedfrom' => '(Dialiahkan dari $1)',
 'redirectpagesub' => 'Laman pengalihan',
-'lastmodifiedat' => 'Laman ko tarakhir diubah pado $1, maso $2.',
+'lastmodifiedat' => 'Laman ko tarakhir diubah pado $2, $1.',
 'viewcount' => 'Laman iko alah diakses sabanyak {{PLURAL:$1|ciek kali|$1 kali}}.<br />',
 'protectedpage' => 'Laman nan dilindungi',
 'jumpto' => 'Lompek ka:',
-'jumptonavigation' => 'navigasi',
+'jumptonavigation' => 'pinteh',
 'jumptosearch' => 'cari',
 'view-pool-error' => 'Maaf, server sadang sibuak pado kini ko.
 Talalu banyak pangguno barusaho mancaliak laman iko.
@@ -249,24 +251,24 @@ $1',
 'pool-errorunknown' => 'Kasalahan nan indak dikatahui',
 
 # 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' => 'Tentang {{SITENAME}}',
-'aboutpage' => 'Project:Perihal',
+'aboutsite' => 'Tantang {{SITENAME}}',
+'aboutpage' => 'Project:Tantang',
 'copyright' => 'Kandungan tasadio dalam $1',
 'copyrightpage' => '{{ns:project}}:Hak cipta',
-'currentevents' => 'Paristiwa takini',
-'currentevents-url' => 'Project:Paristiwa takini',
-'disclaimers' => 'Penyangkalan',
-'disclaimerpage' => 'Project:Penyangkalan umum',
+'currentevents' => 'Kajadian kini ko',
+'currentevents-url' => 'Project:Kajadian kini ko',
+'disclaimers' => 'Sanggah',
+'disclaimerpage' => 'Project:Sanggahan umum',
 'edithelp' => 'Bantuan suntingan',
 'edithelppage' => 'Help:Suntingan',
-'helppage' => 'Help:Kandungan',
-'mainpage' => 'Halaman Utamo',
-'mainpage-description' => 'Laman Utamo',
+'helppage' => 'Help:Takadia',
+'mainpage' => 'Laman Utamo',
+'mainpage-description' => 'Laman utamo',
 'policy-url' => 'Project:Kabijakan',
 'portal' => 'Portal komunitas',
 'portal-url' => 'Project:Portal komunitas',
-'privacy' => 'Kebijakan privasi',
-'privacypage' => 'Project:Kebijakan privasi',
+'privacy' => 'Kecipehan privasi',
+'privacypage' => 'Project:Kecipehan privasi',
 
 'badaccess' => 'Kesalahan hak akses',
 'badaccess-group0' => 'Sanak indak diizinkan untuak malakukan tindakan nan Sanak minta.',
@@ -276,18 +278,22 @@ $1',
 'versionrequiredtext' => 'MediaWiki versi $1 dibutuahkan untuak manggunokan laman ijo. Caliak [[Special:Version|laman versi]]',
 
 'ok' => 'OK',
-'retrievedfrom' => 'Diperoleh dari "$1"',
+'retrievedfrom' => 'Didapek dari "$1"',
 'youhavenewmessages' => 'Awak punyo $1 ($2).',
 'newmessageslink' => 'pasan baru',
 'newmessagesdifflink' => 'parubahan terakhir',
+'youhavenewmessagesfromusers' => 'Sanak mandapek $1 dari {{PLURAL:$3|another user|$3 users}} ($2)',
+'youhavenewmessagesmanyusers' => 'Sanak mandapek $1 dari banyak pangguno ($2)',
+'newmessageslinkplural' => '{{PLURAL:$1|sabuah pasan baru|pasan baru}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|parubahan}} taakhia',
 'youhavenewmessagesmulti' => 'Awak ang mandapek pasan baru pado $1',
 'editsection' => 'suntiang',
 'editold' => 'suntiang',
-'viewsourceold' => 'Caliak sumber',
+'viewsourceold' => 'caliak sumber',
 'editlink' => 'suntiang',
-'viewsourcelink' => 'Lihek sumber',
+'viewsourcelink' => 'caliak sumber',
 'editsectionhint' => 'Suntiang bagian: $1',
-'toc' => 'Kandungan',
+'toc' => 'Daftar isi',
 'showtoc' => 'tampilkan',
 'hidetoc' => 'suruakkan',
 'collapsible-collapse' => 'Ketekan',
@@ -299,15 +305,15 @@ $1',
 'feed-invalid' => 'Tipe pamintaan umpan indak tapek.',
 'feed-unavailable' => 'Umpan sindikasi indak tasadio',
 'site-rss-feed' => '$1 RSS Umpan',
-'site-atom-feed' => '$1 umpan Atom',
+'site-atom-feed' => 'Umpan Atom $1',
 'page-rss-feed' => 'Umpan RSS "$1"',
 'page-atom-feed' => '"$1" umpan Atom',
-'red-link-title' => '$1 (halaman alun babuek)',
+'red-link-title' => '$1 (laman indak ado)',
 'sort-descending' => 'Urutkan manurun',
 'sort-ascending' => 'Urutkan manaik',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Halaman',
+'nstab-main' => 'Laman',
 'nstab-user' => 'Laman pangguno',
 'nstab-media' => 'Laman Media',
 'nstab-special' => 'Laman istimewa',
@@ -329,12 +335,12 @@ Dafta laman istimewa nan sah dapek dicaliak di [[Special:SpecialPages|{{int:spec
 # General errors
 'error' => 'Kasalahan',
 'databaseerror' => 'Kasalahan basis data',
-'dberrortext' => 'Ado kasalahan sintaks pado pamintaan basis data.
-Kasalahan ini mungkin manandokan adonyo sabuah \'\'bug\'\' dalam parangkek lunak.
+'dberrortext' => 'Kasalahan sintaks pado pamintaan basis data lah tajadi.
+Iko mungkin manandokan adonyo bug pado parangkek lunak.
 Pamintaan basis data nan tarakhir adalah:
-<blockquote><tt>$1</tt></blockquote>
-dari dalam fungsi "<tt>$2</tt>".
-Basis data manghasilkan kasalahan "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+dari dalam fungsi "<code>$2</code>".
+Basis data manghasilkan kasalahan "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Ado kasalahan sintaks pado pamintaan basis data.
 Pamintaan basis data nan terakhir adalah:
 "$1"
@@ -344,12 +350,12 @@ Basis data manghasilkan kasalahan "$3: $4".',
 'readonly' => 'Basis data dikunci',
 'enterlockreason' => 'Masuakkan alasan panguncian, tamasuak pakiraan bilo kunci akan dibuka',
 'readonlytext' => 'Basis data sadang dikunci tahadok masuakan baru. Panguruih nan malakukan panguncian mamberikan panjalehan sabagai berikut: <p>$1',
-'missing-article' => 'Basis data indak dapek manamukan teks dari laman yang seharusnyo ado, namo "$1" $2.
+'missing-article' => 'Basis data indak dapek manamukan teks dari laman nan saharuihnyo ado, yaitu "$1" $2.
 
-Hal ko biasonyo disebabkan dek pranala usang ka riwayat terdahulu dari laman yang lah dihapuih.
+Hal ko biasonyo disababkan dek pranala usang ka pabaikkan tadahulu laman nan alah dihapuih.
 
-Jiko bukan iko penyebabnyo, awak mungkin lah manamukan sabuah bug dalam perangkat lunak ko.
-Sila laporkan ka [[Special:ListUsers/sysop|Pengurus]], dengan manandokan alamat URL nan dituju.',
+Jikok bukan iko panyababnyo, Sanak mungkin alah manamukan sabuah bug dalam pakakeh lunak.
+Silakan laporkan hal iko ka [[Special:ListUsers/sysop|Pangurus]], dangan manyabuikkan alamaik URL nan dituju.',
 'missingarticle-rev' => '(revisi#: $1)',
 'missingarticle-diff' => '(Bedo: $1, $2)',
 'readonly_lag' => 'Basis data alah dikunci otomatis salagi basis data sakunder malakukan sinkronisasi jo basis data utamo',
@@ -368,18 +374,24 @@ Sila laporkan ka [[Special:ListUsers/sysop|Pengurus]], dengan manandokan alamat
 'badarticleerror' => 'Tindakan iko indak dapek dilaksanakan di laman iko.',
 'cannotdelete' => 'Laman atau berkas "$1" indak dapek dihapuih.
 Mungkin alah dihapuih jo urang lain.',
+'cannotdelete-title' => 'Indak bisa mangapuih halaman "$1"',
+'delete-hook-aborted' => 'Pengapusan batal jo hook.
+Indak ado keterangan.',
 'badtitle' => 'Judul indak sah',
 'badtitletext' => 'Permintaan judul laman indak sah, kosong, atau antarbaso atau antarwiki yang salah sambuang. Mungkin juo ado kandungan karakter yang indak buliah digunoan untuak judul.',
-'perfcached' => 'Data barikuik iko diambiak dari singgahan dan mungkin indak data nan baharu. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Data barikut iko diambiak dari singgahan dan tarakhir dipabaharui pado $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Data barikuik ko diambiak dari singgahan dan mungkin indak data nan baru. Nan tabanyak dari {{PLURAL:$1|suatu hasil dari|$1 hasilnyo}} ado di singgahan.',
+'perfcachedts' => 'Data barikuik ko singgahan, dan tarakhir diperbarui $1. Nan tabanyak dari {{PLURAL:$1|suatu hasil dari|$1 hasilnyo}} ado di singgahan.',
 'querypage-no-updates' => 'Pamutakhiran dari laman iko sadang dimatian. Data nan ado di siko saat iko indak akan dimuaik ulang.',
 'wrong_wfQuery_params' => 'Parameter salah ka wfQuery()<br />Fungsi: $1<br />Pamintaan: $2',
-'viewsource' => 'Lihek sumber',
+'viewsource' => 'Caliak sumber',
+'viewsource-title' => 'Caliak sumber untuak $1',
 'actionthrottled' => 'Tindakan dibatasi',
 'actionthrottledtext' => 'Anda dibatasi untuak malakuan tindakan iko talalu banyak dalam waktu singkek. Sila mancubo laik satalah bara menit.',
 'protectedpagetext' => 'Laman iko alah dikunci untuak manghindari panyuntiangan.',
 'viewsourcetext' => 'Sanak dapek malihek atau manyalin sumber laman iko:',
-'protectedinterface' => 'Laman iko barisi teks antarmuko untuak digunoan oleh parangkaik lunak dan alah dikunci untuak manghindari kasalahan.',
+'viewyourtext' => 'Sanak bisa mancaliak dan mangopi sumber untuak "editan sanak" ka halaman iko',
+'protectedinterface' => 'Laman iko barisi teks antarmuko untuak digunoan oleh parangkaik lunak di wiki iko sajo, dan alah dikunci untuak manghindari kasalahan. 
+Untuak manambah atau mangubah tarjemahan di sadonyo wiki, tolong digunoan [//translatewiki.net/ translatewiki.net], yaitu proyek lokalisasi dari MediaWiki.',
 'editinginterface' => "'''Paringatan:''' Sanak manyuntiang suatu laman nan digunoan untuak manyediakan teks antarmuko untuak parangkaik lunak situs iko. Parubahan teks iko akan mampangaruhi tampilan pado antarmuko pangguno untuak pangguno lain.
 Untuak tarjamahan, harap gunokan [//translatewiki.net/wiki/Main_Page?setlang=id translatewiki.net], proyek palokalan MediaWiki.",
 'sqlhidden' => '(Pamintaan SQL disuruakkan)',
@@ -391,6 +403,12 @@ $2',
 'ns-specialprotected' => 'Laman istimewa indak dapek disuntiang.',
 'titleprotected' => "Judul iko alah dilindungi dari pambantuakan oleh [[User:$1|$1]].
 Alasan nan diberikan adolah ''$2''.",
+'filereadonlyerror' => 'Indak bisa mangubah berkas "$1" karano repositori berkas "$2" dalam moda baco-sajo.
+
+Pangurus nan manguncinyo manawarkan penjelasan: "$3"',
+'invalidtitle-knownnamespace' => '↓Judul nan indak sah jo ruangnamo "$2" dan teks "$3"',
+'exception-nologin' => 'Indak log masuak',
+'exception-nologin-text' => 'Halaman ko hanyo bisa disuntiang dek pangguno badaftar.',
 
 # Virus scanner
 'virus-badscanner' => "Kasalahan konfigurasi: pamindai virus indak dikenal: ''$1''",
@@ -400,17 +418,17 @@ Alasan nan diberikan adolah ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Sanak alah kalua log dari sistem.'''
 
-Sanak dapek taruih manggunoan {{SITENAME}} sacaro anonim, atau Sanak dapek [[Special:UserLogin|masuak log liak]] sabagai pangguno nan samo atau pangguno nan lain.
+Sanak dapek taruih manggunoan {{SITENAME}} sacaro anonim, atau Sanak dapek <span class='plainlinks'>[$1 masuak log liak]</span> sabagai pangguno nan samo atau pangguno nan lain.
 Parhatian bahawa bara laman mungkin masih taruih manunjukkan bahawa Sanak masih masuak log sampai Sanak mambarasihan singgahan panjelajah web Sanak.",
-'welcomecreation' => '== Salamaik datang, $1! ==
-
-Akun Sanak alah dibuek. Jan lupo maatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Sanak.',
+'welcomeuser' => 'Salamaik datang, $1!',
+'welcomecreation-msg' => 'Akun Sanak alah dibuek. Jan lupo maatur konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] Sanak.',
 'yourname' => 'Namo pangguno:',
 'yourpassword' => 'Kato sandi:',
 'yourpasswordagain' => 'Ulang baliak kato sandi:',
 'remembermypassword' => 'Kana log masuak denai di komputer ko (salamo $1 {{PLURAL:$1|hari|hari}})',
 'securelogin-stick-https' => 'Tetap tahubuang ka HTTPS sasudah masuk log',
 'yourdomainname' => 'Domain Sanak:',
+'password-change-forbidden' => 'Sanak indak bisa mengubah kato kunci di wiki ko.',
 'externaldberror' => 'Alah tajadi kasalahan otentikasi basis data eksternal atau Sanak indak diizinan malakuan kamaskini tahadok akun eksternal Sanak.',
 'login' => 'Masuak log',
 'nav-login-createaccount' => 'Masuak log / buek akun',
@@ -480,6 +498,8 @@ Karanonyo, pangunjuang jo alamaik IP iko indak dapek baliak mambuek akun lain un
 'emailconfirmlink' => 'Konfirmasikan alamaik surel Sanak',
 'invalidemailaddress' => 'Alamaik surel iko indak dapek ditarimo karano formatnyo indak sasuai.
 Harap masuakan alamaik surel dalam format nan batua atau kosoangan isian tasabuik.',
+'cannotchangeemail' => 'Alamat e-mail sanak indak bisa diubah di wiki ko.',
+'emaildisabled' => 'Situs iko indak bisa mangirim e-mail.',
 'accountcreated' => 'Akun dibuek',
 'accountcreatedtext' => 'Akun pangguno untuak $1 alah dibuek.',
 'createaccount-title' => 'Pambuekan akun untuak {{SITENAME}}',
@@ -495,6 +515,7 @@ Sila manunggu sabalun mancubo baliak.',
 
 # E-mail sending
 'php-mail-error-unknown' => 'Kasalahan nan indak dikana dalam fungsi mail() PHP',
+'user-mail-no-addy' => 'Mancubo mangirim e-mail tanpa alamat e-mail nan sah.',
 
 # Change password dialog
 'resetpass' => 'Tuka kato sandi',
@@ -521,6 +542,9 @@ Sanak mungkin alah berhasil mangganti kato sandi Sanak atau alah maminto kato sa
 'passwordreset-disabled' => 'Panukaran baliak kato sandi alah dimatian di wiki iko.',
 'passwordreset-pretext' => '{{PLURAL:$1||Masuakan ciek data di bawah iko}}',
 'passwordreset-username' => 'Namo pangguno:',
+'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => 'Caliak kaputusannyo?',
+'passwordreset-capture-help' => 'Kalau sanak meancek boks iko, e-mail (jo kato kunci samantaro) akan dicaliakkan ka sanak.',
 'passwordreset-email' => 'Alamaik surel:',
 'passwordreset-emailtitle' => 'Detail akun di {{SITENAME}}',
 'passwordreset-emailtext-ip' => 'Sasaurang (mungkin Sanak, dari alamaik IP $1) maminta pangingek
@@ -545,6 +569,18 @@ ingin maubahnyo, Sanak dapek maabaikan pasan iko dan taruih manggunokan sandi la
 'passwordreset-emailelement' => 'Namo pangguno: $1
 Sandi samantaro: $2',
 'passwordreset-emailsent' => 'Surel pangingek alah dikiriman.',
+'passwordreset-emailsent-capture' => 'E-mail paringatan alah dikirim, nan tacaliak di bawah ko.',
+
+# Special:ChangeEmail
+'changeemail' => 'Tuka alamat e-mail.',
+'changeemail-header' => 'Ganti alamat e-mail.',
+'changeemail-text' => 'Panuahan formulir iko untuak mangganti alamat e-mail. Sanak harus mamasuakkan kato kunci untuak mangonfirmasi.',
+'changeemail-no-info' => 'Sanak harus masuak log untuak mangakses halaman ko.',
+'changeemail-oldemail' => 'Alamat e-mail kini:',
+'changeemail-newemail' => 'Alamat e-mail baharu:',
+'changeemail-none' => '(indak ado)',
+'changeemail-submit' => 'Ganti e-mail.',
+'changeemail-cancel' => 'Batalkan',
 
 # Edit page toolbar
 'bold_sample' => 'Teks dicetak taba',
@@ -633,12 +669,15 @@ Jiko awak indak sangajo sampai ka laman ko, klik tombol '''back''' pado penjelaj
 'anontalkpagetext' => "----''Iko adolah laman pambicaraan saurang pangguno anonim nan alun mambuek akun atau indak manggunoannyo.
 Jadi, kami tapaso harus mamakai alamat IP nan basangkutan untuak maidentifikasikannyo.
 Jikok Sanak adolah saurang pangguno anonim dan marasa mandapekkan komentar-komentar nan indak relevan nan ditujuan langsung kapado Sanak, sila [[Special:UserLogin/signup|mambuek akun]] atau [[Special:UserLogin|masuak log]] untuak mahindari karancuan jo pangguno anonim lainnya di lain wakatu.''",
-'noarticletext' => 'Kini ko indak ado teks dalam laman ko.
-Awak dapek [[Special:Search/{{PAGENAME}}|mancari judul laman ko]] pado laman lain,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log nan bakaik],
-atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} suntiang laman ko]</span>.',
+'noarticletext' => 'Kini ko indak ada teks di laman iko.
+Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancarian untuak judul laman iko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
 'noarticletext-nopermission' => 'Kini ko indak ado teks dalam laman iko.
-Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancaharian untuak judul laman iko]] di laman-laman lain, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancahari log takaik], atau [{{fullurl:{{FULLPAGENAME}}|action=edit}} manyuntiang laman iko]</span>.',
+
+Sanak dapek [[Special:Search/{{PAGENAME}}|malakukan pancahari untuak judul laman iko]] di laman lain, atau <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancahari log takaik] </span>, tapi Sanak indak punyo izin untuak mambuek laman iko.',
+'missing-revision' => 'Revisi $1 di halaman ko nan banamo "{{PAGENAME}}" indak ado.
+
+Hal iko biasonyo disababkan dek pranala sajarah nan alah kadaluarsa ka halaman ko nan alah dihapuih.
+Rinciannyo dapek dicaliak di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log panghapuihan].',
 'userpage-userdoesnotexist' => 'Akun pangguno "<nowiki>$1</nowiki>" indak tadafta.',
 'userpage-userdoesnotexist-view' => 'Pangguno "$1" indak tadafta.',
 'blocked-notice-logextract' => 'Pangguno iko sadang diblokir.
@@ -659,8 +698,9 @@ Pratayang iko alun disimpan!'''",
 'userinvalidcssjstitle' => "'''Paringatan:''' Kulik \"\$1\" indak ditamuan. Harap diingek bahawa laman .css dan .js manggunokan huruf kecil, contoh {{ns:user}}:Foo/vector.css dan bukannyo {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Dipabaharui)',
 'note' => "'''Catatan:'''",
-'previewnote' => "'''Iko hanyo tampilan pratonton.'''
-Parubahan yang awak lakukan alun disimpan!",
+'previewnote' => "'''Ingek bahasonyo iko hanyo pratonton'''
+Parubahan Sanak alun disimpan!",
+'continue-editing' => 'Pai ka area mangedit.',
 'previewconflict' => 'Pratayang iko mancaminan teks pado bagian ateh kotak suntiangan teks sabagaimano akan taliek bilo Sanak manyimpannyo.',
 'session_fail_preview' => "'''Maaf, kami ndak dapek mangolah suntiangan Sanak akibat tahapuihnyo data sesi.
 Sila cubo sakali lai.
@@ -676,6 +716,7 @@ Suntiangan tasabuik ditolak untuak mancegah kasalahan pado teks laman.
 Hal iko kadang tajadi jikok Sanak manggunokan layanan proxy anonim babasis web nan bamasalah.",
 'edit_form_incomplete' => "'''Babarapo bagian dari formulir suntiangan indak mancapai server; pariso baliak apokah suntiangan Sanak tatap utuah dan cubo lai.'''",
 'editing' => 'Manyuntiang $1',
+'creating' => 'Mambuek $!',
 'editingsection' => 'Suntiang $1 (bagian)',
 'editingcomment' => 'Manyuntiang $1 (bahagian baharu)',
 'editconflict' => 'Konflik panyuntiangan: $1',
@@ -731,6 +772,20 @@ Barikuik adolah log panghapuihan dan pamindahan dari laman iko:",
 'moveddeleted-notice' => 'Laman iko alah dihapuih.
 Sabagai referensi, barikuik adolah log panghapusan dan pamindahan laman iko.',
 'log-fulllog' => 'Liek saluruah log',
+'edit-gone-missing' => 'Indak bisa mamperbarui halaman.
+Mungkin alah dihapuih.',
+'edit-conflict' => 'Konflik suntingan.',
+'edit-no-change' => 'Suntiangan sanak ditulak, karano indak ado parubahan nan tajadi ka teks.',
+'edit-already-exists' => 'Indak bisa mambuek halaman baru.
+Alah ado.',
+'defaultmessagetext' => 'Teks pasan default.',
+'invalid-content-data' => 'Data kanduangan indak valid.',
+
+# Content models
+'content-model-wikitext' => 'Teks wiki',
+'content-model-text' => 'Teks kosong',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Peringatan:''' Ukuran templat talalu gadang.
@@ -743,9 +798,9 @@ Uraian-uraian tu alah diabaikan.',
 # History pages
 'viewpagelogs' => 'Lihek log untuak laman ko',
 'currentrev-asof' => 'Revisi terkini pado $1',
-'revisionasof' => 'Revisi per $1',
+'revisionasof' => 'Pabaikkan per $1',
 'revision-info' => 'Revisi sajak $1 dek $2',
-'previousrevision' => '← Revisi sabalunnyo',
+'previousrevision' => '← Pabaikkan sabalunnyo',
 'nextrevision' => 'Revisi selanjutnyo →',
 'currentrevisionlink' => 'Revisi terkini',
 'cur' => 'kini',
@@ -762,18 +817,18 @@ Legend: '''({{int:kini}})''' = perbedaan jo revisi terakhir, '''({{int:dulu}})''
 
 # Revision deletion
 'rev-delundel' => 'tampilkan/suruakkan',
-'revdel-restore' => 'Ganti tampilan',
-'revdel-restore-deleted' => 'revisi nan lah tahapuih',
+'revdel-restore' => 'ganti tampilan',
+'revdel-restore-deleted' => 'suntiangan nan alah dihapuih',
 'revdel-restore-visible' => 'tampilan revisi',
 
 # Merge log
-'revertmerge' => 'Batal bergabung',
+'revertmerge' => 'Bata bagabuang',
 
 # Diffs
-'history-title' => 'Riwayat revisi dari "$1"',
+'history-title' => 'Riwayaik pabaiakkan dari "$1"',
 'lineno' => 'Barih $1:',
 'compareselectedversions' => 'Bandingkan revisi pilihan',
-'editundo' => 'batalkan',
+'editundo' => 'batalan',
 'diff-multi' => '({{PLURAL:$1|ciek |$1 revisi antaro}} oleh {{PLURAL:$2|ciek|$2 pangguno}} indak ditampilkan)',
 
 # Search results
@@ -784,36 +839,34 @@ Legend: '''({{int:kini}})''' = perbedaan jo revisi terakhir, '''({{int:dulu}})''
 'searchsubtitleinvalid' => "Awak mancari '''$1'''",
 'notitlematches' => 'Indak ado judul nan pas',
 'notextmatches' => 'Indak ado judul nan pas',
-'prevn' => 'sabalunnyo {{PLURAL:$1|$1}}',
-'nextn' => 'salanjuiknyo {{PLURAL:$1|$1}}',
-'prevn-title' => 'Sabalunnyo $1 {{PLURAL:$1|hasil|hasil}}',
-'nextn-title' => 'Barikuiknyo $1 {{PLURAL:$1|hasil|hasil}}',
-'shown-title' => '↓ Tampilkan $1 {{PLURAL:$1|hasil|hasil}} per lama',
-'viewprevnext' => 'Tampilkan ($1 {{int:pipe-separator}} $2) ($3)',
+'prevn' => '{{PLURAL:$1|$1}} sabalunnyo',
+'nextn' => '{{PLURAL:$1|$1}} salanjuknyo',
+'prevn-title' => '$1 {{PLURAL:$1|Hasil|Hasil-hasil}} sabalunnyo',
+'nextn-title' => '$1 {{PLURAL:$1|Hasil|Hasil-hasil}} barikuiknyo',
+'shown-title' => 'Tampilkan $1 {{PLURAL:$1|hasil|hasil-hasil}} per laman',
+'viewprevnext' => 'Caliakkan ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Ado laman nan banamo \"[[:\$1]]\" pado wiki ko.'''",
 'searchmenu-new' => "'''Buek laman \"[[:\$1]]\" di wiki ko!'''",
-'searchprofile-articles' => 'Artikel',
-'searchprofile-project' => '↓ Laman Bantuan dan Proyek',
-'searchprofile-images' => '↓ Multimedia',
-'searchprofile-everything' => '↓ Sadonyo',
-'searchprofile-advanced' => 'Lanjuikan',
-'searchprofile-articles-tooltip' => '↓ Cari di $1',
+'searchprofile-articles' => 'Laman isi',
+'searchprofile-project' => 'Laman Bantuan jo Proyek',
+'searchprofile-images' => 'Multimedia',
+'searchprofile-everything' => 'Sadonyo',
+'searchprofile-advanced' => 'Lanjukkan',
+'searchprofile-articles-tooltip' => 'Cari di $1',
 'searchprofile-project-tooltip' => 'Cari di $1',
-'searchprofile-images-tooltip' => '↓ Cari untuak berkas',
-'searchprofile-everything-tooltip' => '↓ Cari sadoalahnyo (tamasuak laman maota)',
-'searchprofile-advanced-tooltip' => 'Pacaharian di ruang namo tatantu',
+'searchprofile-images-tooltip' => 'Cari untuak berkas',
+'searchprofile-everything-tooltip' => 'Cari sadoalahnyo (tamasuak laman maota)',
+'searchprofile-advanced-tooltip' => 'Pacarian di ruang namo tatantu',
 'search-result-size' => '$1 ({{PLURAL:$2|1 kato|$2 kato}})',
 'search-result-category-size' => '{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})',
-'search-redirect' => '(pengalihan $1)',
+'search-redirect' => '(pangaliahan $1)',
 'search-section' => '(bagian $1)',
 'search-suggest' => 'Mungkin maksud awak: $1',
 'search-interwiki-caption' => 'Proyek badunsanak',
 'search-interwiki-default' => 'Hasil $1:',
 'search-interwiki-more' => '(selanjutnyo)',
-'search-mwsuggest-enabled' => 'dengan saran',
-'search-mwsuggest-disabled' => 'indak ado saran',
 'searchrelated' => 'bakaitan',
-'searchall' => 'Sadonyo',
+'searchall' => 'sado',
 'showingresultsheader' => "{{PLURAL:$5|Hasil '''$1''' dari '''$3'''|Hasil '''$1 - $2''' dari '''$3'''}} untuak '''$4'''",
 'nonefound' => "'''Catatan''': hanyo babarapo ruangnamo yang dicari sacaro default.
 Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasuak laman ota, templat, dll), atau gunoan ruangnamo yang diinginkan sabagai awalan.",
@@ -826,7 +879,7 @@ Cubo awali permintaan awak tu jo ''all:'' untuak mancari sado kandungan (tamasua
 
 # Preferences page
 'preferences' => 'Preferensi',
-'mypreferences' => 'Preferensi denai',
+'mypreferences' => 'Preferensi',
 'prefs-beta' => 'Corak Beta',
 'prefs-labs' => 'Corak Uji',
 'youremail' => 'Surek Elektronik:',
@@ -866,8 +919,8 @@ Alamaik surek elektronik awak ang tu indak kan katahuan dek urang lain nan mangh
 'rcshowhidepatr' => '$1 suntiangan nan tajago',
 'rcshowhidemine' => '$1 suntingan denai',
 'rclinks' => 'Tampilkan $1 parubahan baru dalam $2 hari terakhir<br />$3',
-'diff' => 'beda',
-'hist' => 'versi',
+'diff' => 'bedo',
+'hist' => 'sajarah',
 'hide' => 'Suruakkan',
 'show' => 'Tampilkan',
 'minoreditletter' => 'k',
@@ -878,16 +931,16 @@ Alamaik surek elektronik awak ang tu indak kan katahuan dek urang lain nan mangh
 
 # Recent changes linked
 'recentchangeslinked' => 'Parubahan takaik',
-'recentchangeslinked-toolbox' => '↓ Parubahan takaik',
+'recentchangeslinked-toolbox' => 'Parubahan takaik',
 'recentchangeslinked-title' => 'Parubahan nan takaik jo "$1"',
 'recentchangeslinked-noresult' => 'Indak ado parubahan pado laman nan tapauik salamo periode nan ditantuan',
-'recentchangeslinked-summary' => "Iko adolah senarai parubahan terakhir pado laman yang takaik jo laman tartantu (atau pado kalompok kategori tartantu).
-Laman pado [[Special:Watchlist|Senarai pantauan]] ditandoi '''cetak taba'''.",
+'recentchangeslinked-summary' => "Iko adolah daftar parubahan tarakhir pado laman nan tahubuang dari laman tatantu (atau anggota dari suatu kategori tatantu).
+Halaman pada [[Special:Watchlist|your watchlist]] ditondai dangan '''cetak taba''",
 'recentchangeslinked-page' => 'Namo laman:',
 'recentchangeslinked-to' => 'Tampilkan parubahan dari laman yang takaik jo laman yang disajikan',
 
 # Upload
-'upload' => 'Unggah berkas',
+'upload' => 'Muek berkas',
 'uploadlogpage' => 'Log unggah',
 'filedesc' => 'Ringkasan',
 'uploadedimage' => 'unggah "[[$1]]"',
@@ -897,7 +950,7 @@ Laman pado [[Special:Watchlist|Senarai pantauan]] ditandoi '''cetak taba'''.",
 
 # File description page
 'file-anchor-link' => 'Berkas',
-'filehist' => 'Riwayat berkas',
+'filehist' => 'Riwayaik berkas',
 'filehist-help' => 'Klik pado tanggal/waktu untuak malihek berkas pado maso tu',
 'filehist-revert' => 'kembalikan',
 'filehist-current' => 'kini ko',
@@ -907,7 +960,7 @@ Laman pado [[Special:Watchlist|Senarai pantauan]] ditandoi '''cetak taba'''.",
 'filehist-user' => 'Pangguno',
 'filehist-dimensions' => 'Dimensi',
 'filehist-comment' => 'Ulasan',
-'imagelinks' => 'Pranala berkas',
+'imagelinks' => 'Panggunoan berkas',
 'linkstoimage' => 'Berikut ko ado {{PLURAL:$1|laman nan takaik|$1 laman nan takaik}} jo berkas ko:',
 'nolinkstoimage' => 'Indak ado laman nan ado batauik ka berkas ko.',
 'sharedupload' => 'Berkas ko barasal dari $1 dan mungkin digunoan oleh berbagai proyek lain.',
@@ -916,7 +969,7 @@ Deskripsi dari [$2 laman deskripsi berkas] ditampilkan di bawah.',
 'uploadnewversion-linktext' => 'Unggah versi baru dari berkas ko',
 
 # Random page
-'randompage' => '↓ Laman sumbarang',
+'randompage' => 'Laman sambarangan',
 
 # Statistics
 'statistics' => 'Statistik',
@@ -927,7 +980,7 @@ Deskripsi dari [$2 laman deskripsi berkas] ditampilkan di bawah.',
 'nbytes' => '$1 {{PLURAL:$1|bait|bait}}',
 'nmembers' => '$1 {{PLURAL:$1|anggota|anggota}}',
 'prefixindex' => 'Semua laman jo awalan',
-'usercreated' => 'Dibuek pado $1 waktu $2',
+'usercreated' => '{{GENDER:$3|Dibuek}} pado $1 pukua $2',
 'newpages' => 'Laman baru',
 'move' => 'Pindahkan',
 'movethispage' => 'Pindahkan laman ko',
@@ -969,7 +1022,7 @@ Deskripsi dari [$2 laman deskripsi berkas] ditampilkan di bawah.',
 
 # Watchlist
 'watchlist' => 'Senarai pantauan denai',
-'mywatchlist' => 'Senarai pantauan den',
+'mywatchlist' => 'Daftar pantauan denai',
 'watchlistfor2' => 'Untuak $1 $2',
 'addedwatchtext' => "Laman \"[[:\$1]]\" lah ditambahkan ka [[Special:Watchlist|senarai pantauan awak]].
 Parubahan laman ko tamasuak laman otanyo akan ditampilkan dalam '''cetak taba''' pado [[Special:RecentChanges|senarai parubahan]] agar lebih mudah manjagonyo.",
@@ -1026,8 +1079,8 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'restriction-level' => 'Tingkek larangan:',
 
 # Undelete
-'undeletelink' => 'tampilkan/pulihkan',
-'undeleteviewlink' => 'liek',
+'undeletelink' => 'caliak/cegakkan',
+'undeleteviewlink' => 'caliak',
 
 # Namespace form on various pages
 'namespace' => 'Ruangnamo:',
@@ -1068,17 +1121,17 @@ Awak dapek maubah tingkek perlindungannyo, walaupun indak pangaruah pado perlind
 'whatlinkshere-hideredirs' => '$1 pengalihan',
 'whatlinkshere-hidetrans' => '$1 transklusi',
 'whatlinkshere-hidelinks' => '$1 pranala',
-'whatlinkshere-hideimages' => '$1 pahubuang gambar',
+'whatlinkshere-hideimages' => '$1 pahubuang berkas',
 'whatlinkshere-filters' => 'Penapis',
 
 # Block/unblock
 'blockip' => 'Blokir pangguno',
 'ipboptions' => '2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,salamonyo:infinite',
 'ipblocklist' => 'Pangguno tablokir',
-'blocklink' => 'blokir',
-'unblocklink' => 'hilangkan blokir',
-'change-blocklink' => 'ubah blokir',
-'contribslink' => 'kontrib',
+'blocklink' => 'balokir',
+'unblocklink' => 'hilangkan balokir',
+'change-blocklink' => 'ubah balokir',
+'contribslink' => 'jariah',
 'blocklogpage' => 'Log pemblokiran',
 'blocklogentry' => 'memblokir [[$1]] dalam maso berlaku $2 $3',
 'unblocklogentry' => 'mahilangkan blokir $1',
@@ -1108,7 +1161,7 @@ Dalam kasus tu, apobilo diinginkan, awak dapek mamindahkan atau manggabuangkan l
 'movetalk' => 'Pindahkan laman ota yang takaik',
 'movelogpage' => 'Log pemindahan',
 'movereason' => 'Alasan:',
-'revertmove' => 'kembalikan',
+'revertmove' => 'baliakkan',
 
 # Export
 'export' => 'Ekspor laman',
@@ -1122,46 +1175,46 @@ Dalam kasus tu, apobilo diinginkan, awak dapek mamindahkan atau manggabuangkan l
 'thumbnail_error' => 'Gagal mambuek thumbnail : $1',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage' => 'Halaman pangguno awak',
-'tooltip-pt-mytalk' => 'Halaman ota awak',
+'tooltip-pt-userpage' => 'Laman pangguno sanak',
+'tooltip-pt-mytalk' => 'Laman ota sanak',
 'tooltip-pt-preferences' => 'Preferensi denai',
-'tooltip-pt-watchlist' => 'Senarai laman nan denai pantau',
-'tooltip-pt-mycontris' => 'Senarai jariah denai',
-'tooltip-pt-login' => 'Awak disarankan untuak masuak log; meskipun, hal tu indak diwajibkan',
+'tooltip-pt-watchlist' => 'Daftar laman nan denai pantau.',
+'tooltip-pt-mycontris' => 'Daftar jariah Sanak',
+'tooltip-pt-login' => 'Sanak disarankan untuak masuak log; musiki, hal tu indak diwajibkan',
 'tooltip-pt-logout' => 'Kalua log',
-'tooltip-ca-talk' => 'Pembicaraan tentang isi halaman',
-'tooltip-ca-edit' => 'Awak buliah suntiang laman ko. Gunokan tombol pratonton sabalun manyimpan',
+'tooltip-ca-talk' => 'Parudiangan tantang isi laman',
+'tooltip-ca-edit' => 'Sanak dapek manyuntiang laman iko. Silakan gunokan tombol pratonton sabalun manyimpan',
 'tooltip-ca-addsection' => 'Mulai bagian baru',
 'tooltip-ca-viewsource' => 'Laman ko dilinduangi.
-Awak hanyo buliah lihek sumber se',
-'tooltip-ca-history' => 'Revisi sabalunnyo laman ko',
+Sanak hanyo buliah lihek sumbernyo sajo',
+'tooltip-ca-history' => 'Pabaiakkan sabalunnyo dari laman ko',
 'tooltip-ca-protect' => 'Lindungi laman ko',
 'tooltip-ca-delete' => 'Hapuih laman iko',
 'tooltip-ca-move' => 'Pindahkan laman ko',
-'tooltip-ca-watch' => 'Tambahkan laman ko ka senarai pantauan awak',
+'tooltip-ca-watch' => 'Tambahkan laman ko ka daftar pantauan sanak',
 'tooltip-ca-unwatch' => 'Kaluaan laman ko dari senarai pantauan awak',
 'tooltip-search' => 'Cari {{SITENAME}}',
 'tooltip-search-go' => 'Cari suatu laman dengan namo yang samo jiko tasadio',
-'tooltip-search-fulltext' => 'Cari halaman nan mamuek teks ko',
-'tooltip-p-logo' => '↓ Kunjungi laman utamo',
-'tooltip-n-mainpage' => 'Kunjungi Halaman Utamo',
-'tooltip-n-mainpage-description' => 'Kunjungi halaman utamo',
-'tooltip-n-portal' => 'Tentang proyek, apo yang dapek awak lakukan, di mano mancari sasuatu',
-'tooltip-n-currentevents' => 'Temukan informasi latar dari peristiwa kini ko',
+'tooltip-search-fulltext' => 'Cari laman untuak teks iko',
+'tooltip-p-logo' => 'Kunjuangi laman utamo',
+'tooltip-n-mainpage' => 'Kunjuangi laman Utamo',
+'tooltip-n-mainpage-description' => 'Kunjuangi laman utamo',
+'tooltip-n-portal' => 'Tantang proyek, apa nan dapek Sanak lakukan, dima untuak manamukan sasuatu',
+'tooltip-n-currentevents' => 'Tamukan informasi manganai latar balakang kajadian kini ko',
 'tooltip-n-recentchanges' => 'Daftar panyuntiangan baru dalam wiki',
-'tooltip-n-randompage' => 'Tampilkan sembarang halaman',
+'tooltip-n-randompage' => 'Muek sambarang laman',
 'tooltip-n-help' => 'Tampek mancari bantuan',
-'tooltip-t-whatlinkshere' => 'Senarai sado halaman wiki yang punyo pranala ka halaman ko',
+'tooltip-t-whatlinkshere' => 'Daftar dari kasado laman wiki nan tahubuang kasiko',
 'tooltip-t-recentchangeslinked' => 'Parubahan baru halaman nan bakaik jo laman ko',
 'tooltip-feed-rss' => 'Umpan RSS untuak laman ko',
 'tooltip-feed-atom' => 'Umpan Atom untuak laman ko',
 'tooltip-t-contributions' => 'Lihek senarai jariah pangguno ko',
 'tooltip-t-emailuser' => 'Kirimkan e-mail ka pangguno ko',
-'tooltip-t-upload' => 'Unggah berkas',
-'tooltip-t-specialpages' => 'Sadoalah halaman istimewa',
-'tooltip-t-print' => 'Versi cetak halaman ko',
-'tooltip-t-permalink' => 'Pranala permanen untuak revisi laman ko',
-'tooltip-ca-nstab-main' => 'Lihek isi laman',
+'tooltip-t-upload' => 'Muek berkas',
+'tooltip-t-specialpages' => 'Daftar dari kasado laman istimewa',
+'tooltip-t-print' => 'Versi cetak dari laman ko',
+'tooltip-t-permalink' => 'Pranala parmanen untuak pabaiakkan laman ko',
+'tooltip-ca-nstab-main' => 'Caliak isi laman',
 'tooltip-ca-nstab-user' => 'Caliak laman pangguno',
 'tooltip-ca-nstab-special' => 'Iko adolah laman istimewa, awak indak buliah manyuntiangnyo',
 'tooltip-ca-nstab-project' => 'Lihek laman proyek',
@@ -1177,8 +1230,8 @@ Awak hanyo buliah lihek sumber se',
 'tooltip-watch' => 'Tambahkan laman ko ka senarai pantauan awak',
 'tooltip-recreate' => 'Buek baliak laman walaupun sabananyo pernah dihapuih',
 'tooltip-upload' => 'Mulai mamuek',
-'tooltip-rollback' => '"Baliakkan" baraliah suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
-'tooltip-undo' => '"Indak jadi" suntiangan ko dibaliakkan dan mambuka kotak suntiang dalam mode pratonton. Alasan dapek ditambah pado kotak ringkasan.',
+'tooltip-rollback' => '"Baliakkan" uruangkan suntiang laman ko pado kontribusi tarakhir dalam sakali klik',
+'tooltip-undo' => '"Batalan" uruangkan panyuntiangan iko jo mambukak bantuak suntiang dalam bantuak pratonton. Hal ko mamungkinkan manambahkan alasan pado kotak ringkasan.',
 'tooltip-preferences-save' => 'Simpan preferensi',
 'tooltip-summary' => 'Masuakan sabuah ringkasan pendek',
 
@@ -1196,11 +1249,11 @@ Awak hanyo buliah lihek sumber se',
 'show-big-image' => 'Resolusi penuh',
 
 # Bad image list
-'bad_image_list' => 'Formatnyo sabagai berikut:
+'bad_image_list' => 'Ukurannyo adolah sabagai barikuik:
 
-Hanyo butir senarai (barih diawali jo tando *) yang dihituang.
-Pranala partamo pado barih tu mesti bakaik ka berkas nan buruak.
-Pranala-pranala salanjuiknyo pado barih nan samo dianggap sabagai pengecualian, yaitu laman nan dapek manampilkan berkas tu.',
+Hanyo daftar butia (barih nan dimulai jo tando *) nan dianggap.
+Pranala patamo pado barih musiti pranala ka berkas buruak.
+Satiok pranala salanjuiknyo pado barih nan samo dianggap pangacualian, yaitu laman dima berkas tasabuik bisa tajadi sajajar.',
 
 # Metadata
 'metadata' => 'Metadata',
@@ -1230,7 +1283,7 @@ Nan lainnyo akan tasuruak sacaro default.
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'semua',
 'namespacesall' => 'semua',
-'monthsall' => 'semua',
+'monthsall' => 'sado',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Tampilkan parubahan takaik',
@@ -1259,4 +1312,11 @@ Nan lainnyo akan tasuruak sacaro default.
 # Special:Tags
 'tag-filter' => '[[Special:Tags|Tag]] bateh:',
 
+# Search suggestions
+'searchsuggest-search' => 'Cari',
+'searchsuggest-containing' => 'Barisi...',
+
+# Durations
+'duration-millennia' => '$1 {{PLURAL:$1|millennium|millenia}}',
+
 );
index 4bc913f..bf6f3ee 100644 (file)
@@ -163,7 +163,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'СкорешниПромени' ),
        'Recentchangeslinked'       => array( 'ПоврзаниПромени' ),
        'Revisiondelete'            => array( 'БришењеРевизија' ),
-       'RevisionMove'              => array( 'ПреместиРевизија' ),
        'Search'                    => array( 'Барај' ),
        'Shortpages'                => array( 'КраткиСтраници' ),
        'Specialpages'              => array( 'СпецијалниСтраници' ),
@@ -202,7 +201,6 @@ $magicWords = array(
        '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' ),
@@ -241,6 +239,7 @@ $magicWords = array(
        'basepagename'              => array( '1', 'ИМЕНАОСНОВНАСТРАНИЦА', 'BASEPAGENAME' ),
        'talkpagename'              => array( '1', 'СТРАНИЦАЗАРАЗГОВОР', 'TALKPAGENAME' ),
        'subjectpagename'           => array( '1', 'ИМЕНАСТАТИЈА', 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ),
+       'msg'                       => array( '0', 'ПОР:', 'MSG:' ),
        'subst'                     => array( '0', 'ЗАМЕНИ:', 'SUBST:' ),
        'safesubst'                 => array( '0', 'БЕЗБЗАМЕНИ', 'SAFESUBST:' ),
        'msgnw'                     => array( '0', 'ИЗВЕШТNW:', 'MSGNW:' ),
@@ -294,6 +293,9 @@ $magicWords = array(
        'revisionuser'              => array( '1', 'КОРИСНИКНАНАРЕВИЗИЈА', 'REVISIONUSER' ),
        'plural'                    => array( '0', 'МНОЖИНА:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'ПОЛНАURL:', 'FULLURL:' ),
+       'fullurle'                  => array( '0', 'ПОЛНАURLE:', 'FULLURLE:' ),
+       'canonicalurl'              => array( '0', 'КАНОНСКАURL:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'КАНОНСКАURLE:', 'CANONICALURLE:' ),
        'lcfirst'                   => array( '0', 'ПРВОМБ', 'LCFIRST:' ),
        'ucfirst'                   => array( '0', 'ПРВОГБ', 'UCFIRST:' ),
        'lc'                        => array( '0', 'МБ', 'LC:' ),
@@ -385,7 +387,7 @@ $messages = array(
 'tog-watchlisthideliu' => 'Скриј ги уредувањата на најавените корисници во списокот на набљудувања',
 'tog-watchlisthideanons' => 'Скриј ги уредувањата од анонимни корисници во списокот на набљудувања',
 'tog-watchlisthidepatrolled' => 'Скриј испатролирани уредувања од мојот список на набљудувања',
-'tog-ccmeonemails' => 'Ð\98Ñ\81пÑ\80аÑ\9cаÑ\98 Ð¼Ð¸ ÐºÐ¾Ð¿Ð¸Ð¸ Ð¾Ð´ Ðµ-поÑ\80акиÑ\82е Ñ\88Ñ\82о Ð³Ð¸ Ð¿Ñ\80аÑ\9cам Ð´Ð¾ Ð´Ñ\80Ñ\83ги корисници',
+'tog-ccmeonemails' => 'Ð\98Ñ\81пÑ\80аÑ\9cаÑ\98 Ð¼Ð¸ Ð¼Ð¾Ð¸ Ð¿Ñ\80имеÑ\80оÑ\86и Ð¾Ð´ Ð¿Ð¸Ñ\81маÑ\82а Ñ\88Ñ\82о Ð³Ð¸ Ð¿Ñ\80аÑ\9cам Ð½Ð° Ð´Ñ\80Ñ\83гиÑ\82е корисници',
 'tog-diffonly' => 'Не ја покажувај содржината на страницата под разликите',
 'tog-showhiddencats' => 'Прикажи скриени категории',
 'tog-noconvertlink' => 'Оневозможи претворање на наслов на врска',
@@ -393,7 +395,7 @@ $messages = array(
 
 'underline-always' => 'Секогаш',
 'underline-never' => 'Никогаш',
-'underline-default' => 'Според нагодувањата на прелистувачот',
+'underline-default' => 'Според рувото или прелистувачот',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Фонт во полето за уредување:',
@@ -480,8 +482,8 @@ $messages = array(
 'newwindow' => '(се отвора во нов прозорец)',
 'cancel' => 'Откажи',
 'moredotdotdot' => 'Повеќе...',
-'mypage' => 'Ð\9cоÑ\98а Ñ\81траница',
-'mytalk' => 'мои Ñ\80азговоÑ\80и',
+'mypage' => 'Страница',
+'mytalk' => 'РазговоÑ\80',
 'anontalk' => 'Разговор за оваа IP-адреса',
 'navigation' => 'Навигација',
 'and' => '&#32;и',
@@ -491,7 +493,6 @@ $messages = array(
 'qbbrowse' => 'Прелистај',
 'qbedit' => 'Уреди',
 'qbpageoptions' => 'Оваа страница',
-'qbpageinfo' => 'Содржина на страница',
 'qbmyoptions' => 'Мои страници',
 'qbspecialpages' => 'Специјални страници',
 'faq' => 'ЧПП',
@@ -504,7 +505,7 @@ $messages = array(
 'vector-action-protect' => 'Заштити',
 'vector-action-undelete' => 'Врати',
 'vector-action-unprotect' => 'Измени заштита',
-'vector-simplesearch-preference' => 'Овозможи збогатени предлози при пребарување (само за рувото „Векторско“)',
+'vector-simplesearch-preference' => 'Овозможи упростено поле за пребарување (само за рувото „Векторско“)',
 'vector-view-create' => 'Создај',
 'vector-view-edit' => 'Уреди',
 'vector-view-history' => 'Историја',
@@ -514,6 +515,7 @@ $messages = array(
 'namespaces' => 'Именски простори',
 'variants' => 'Варијанти',
 
+'navigation-heading' => 'Навигационо мени',
 'errorpagetitle' => 'Грешка',
 'returnto' => 'Назад на $1.',
 'tagline' => 'Од {{SITENAME}}',
@@ -566,7 +568,7 @@ $messages = array(
 'lastmodifiedat' => 'Оваа страница последен пат е изменета на $1 во $2 ч.',
 'viewcount' => 'Оваа страница била посетена {{PLURAL:$1|еднаш|$1 пати}}.',
 'protectedpage' => 'Заштитена страница',
-'jumpto' => 'Скокни на:',
+'jumpto' => 'Ð\9fÑ\80еÑ\98ди на:',
 'jumptonavigation' => 'содржини',
 'jumptosearch' => 'барај',
 'view-pool-error' => 'За жал во моментов опслужувачите се преоптоварени.
@@ -659,10 +661,10 @@ $1',
 'nstab-category' => 'Категорија',
 
 # Main script and global functions
-'nosuchaction' => 'Не постои таа функција',
-'nosuchactiontext' => 'Дејството наведено во URL-низата е грешно.
-Можеби има грешка во пишувањето на URL или сте следеле погрешна врска.
\9eва Ð¼Ð¾Ð¶Ðµ Ð¸Ñ\81Ñ\82о Ñ\82ака Ð´Ð° Ð±Ð¸Ð´Ðµ Ð¸ грешка во програмската опрема на {{SITENAME}}.',
+'nosuchaction' => 'Нема такво дејство',
+'nosuchactiontext' => 'Дејството укажано во URL-адресата е погрешно.
+Можеби имате грешка во пишувањето на адресата, или пак имате проследено погрешна врска.
\9eва Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð´Ð¾Ð»Ð¶Ð¸ Ð¸ Ð½Ð° грешка во програмската опрема на {{SITENAME}}.',
 'nosuchspecialpage' => 'Не постои таква специјална страница',
 'nospecialpagetext' => '<strong>Побаравте непостоечка специјална страница.</strong>
 
@@ -728,7 +730,7 @@ $1',
 'actionthrottled' => 'Дејството е успорено',
 'actionthrottledtext' => 'Како анти-спам мерка, ограничени сте од вршење на ова дејство премногу пати во краток временски период, а го преминавте ограничувањето.
 Ве молиме обидете се повторно за неколку минути.',
-'protectedpagetext' => 'Оваа страница е заклучена за уредувања.',
+'protectedpagetext' => 'Оваа страница е заклучена за уредувања и други дејства.',
 'viewsourcetext' => 'Можете да го погледнете и копирате кодот на оваа страница:',
 'viewyourtext' => "Можете да го погледнете и копирате кодот на '''вашите уредувања''' на оваа страница:",
 'protectedinterface' => 'Оваа страница содржи текст од посредникот на софтверот на ова вики и е превентивно заштитена поради можна злоупотреба.
@@ -761,11 +763,11 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Сега сте одјавени.'''
 
-Можете да продолжите со користење на {{SITENAME}} анонимно или можете [[Special:UserLogin|повторно да се најавите]] под исто или различно корисничко име.
+Можете да продолжите со користење на {{SITENAME}} анонимно или можете <span class='plainlinks'>[$1 повторно да се најавите]</span> под исто или различно корисничко име.
 Да напоменеме дека некои страници може да продолжат да се прикажуваат како да сте најавени, се додека не го исчистите кешот на вашиот прелистувач.",
-'welcomecreation' => '== Добредојдовте, $1! ==
-Вашата корисничка сметка е создадена.
-Не заборавајте да ги [[Special:Preferences|наместите вашите нагодувања]].',
+'welcomeuser' => 'Добредојдовте, $1!',
+'welcomecreation-msg' => 'Вашата корисничка сметка е создадена.
+Не заборавајте да ги измените вашите [[Special:Preferences|{{SITENAME}} нагодувања]].',
 'yourname' => 'Корисничко име:',
 'yourpassword' => 'Лозинка:',
 'yourpasswordagain' => 'Повторете ја лозинката:',
@@ -970,7 +972,7 @@ $2
 'missingsummary' => "'''Потсетник:''' Не внесовте опис на измените. Ако притиснете Зачувај повторно, вашите измени ќе се зачуваат без опис.",
 'missingcommenttext' => 'Ве молиме внесете коментар подолу.',
 'missingcommentheader' => "'''Потсетување:''' Не внесовте наслов за овој коментар.
-Ако повторно кликнете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
+Ако повторно стиснете на „{{int:savearticle}}“, уредувањето ќе биде зачувано без наслов.",
 'summary-preview' => 'Изглед на описот:',
 'subject-preview' => 'Преглед на предметот/насловот:',
 'blockedtitle' => 'Корисникот е блокиран',
@@ -1058,7 +1060,7 @@ $2
 'note' => "'''Напомена:'''",
 'previewnote' => "'''Имајте предвид дека ова е само преглед.'''
 Промените сè уште не се зачувани!",
-'continue-editing' => 'Ð\9fÑ\80одолжеÑ\82е Ñ\81о уредување',
+'continue-editing' => 'Ð\9eди Ð½Ð° Ð¿Ð¾Ð»ÐµÑ\82о Ð·Ð° уредување',
 'previewconflict' => 'Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.',
 'session_fail_preview' => "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на сесиски податоци.'''
 Обидете се повторно.
@@ -1142,6 +1144,15 @@ $2
 'edit-already-exists' => 'Не може да се создаде нова страница.
 Истата веќе постои.',
 'defaultmessagetext' => 'Текст на пораката по основно',
+'content-failed-to-parse' => 'Не успеав да ја предадам содржината од типот $2 за моделот $1: $3',
+'invalid-content-data' => 'Неважечки податоци од содржината',
+'content-not-allowed-here' => 'Содржините од моделот „$1“ не се допуштени на страницата [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'викитекст',
+'content-model-text' => 'прост текст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Предупредување: Оваа страница користи премногу повикувања на parser функции.
@@ -1193,7 +1204,7 @@ $2
 'last' => 'посл',
 'page_first' => 'прв',
 'page_last' => 'последен',
-'histlegend' => "Разлика Ð¿Ð¾Ð¼ÐµÑ\93Ñ\83 Ñ\80евизии: Ð¾Ð·Ð½Ð°Ñ\87еÑ\82е Ð³Ð¸ Ñ\80евизииÑ\82е ÐºÐ¾Ð¸ Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¸ Ñ\81поÑ\80едиÑ\82е Ð¸ Ð¿Ñ\80иÑ\82иÑ\81неÑ\82е Enter или копчето на дното од страницата.<br />
+'histlegend' => "Разлика Ð¿Ð¾Ð¼ÐµÑ\93Ñ\83 Ñ\80евизии: Ð\9eзнаÑ\87еÑ\82е Ð³Ð¸ Ñ\80евизииÑ\82е Ñ\88Ñ\82о Ñ\81акаÑ\82е Ð´Ð° Ð³Ð¸ Ñ\81поÑ\80едиÑ\82е Ð¸ Ð¿Ñ\80иÑ\82иÑ\81неÑ\82е Ð½Ð° Enter или копчето на дното од страницата.<br />
 Легенда: '''({{int:cur}})''' = разлика со последна ревизија, '''({{int:last}})''' = разлика со претходна ревизија, '''{{int:minoreditletter}}''' = ситна промена.",
 'history-fieldset-title' => 'Прелистување на историја',
 'history-show-deleted' => 'Само избришани',
@@ -1395,8 +1406,6 @@ $1",
 'search-interwiki-caption' => 'Збратимени проекти',
 'search-interwiki-default' => 'Најдено на $1:',
 'search-interwiki-more' => '(уште)',
-'search-mwsuggest-enabled' => 'со предлози',
-'search-mwsuggest-disabled' => 'без предлози',
 'search-relatedarticle' => 'Поврзано',
 'mwsuggest-disable' => 'Оневозможи AJAX-предлози',
 'searcheverything-enable' => 'Барај во сите именски простори',
@@ -1432,7 +1441,7 @@ $1",
 
 # Preferences page
 'preferences' => 'Нагодувања',
-'mypreferences' => 'мои Ð½агодувања',
+'mypreferences' => 'Ð\9dагодувања',
 'prefs-edits' => 'Број на уредувања:',
 'prefsnologin' => 'Не сте најавени',
 'prefsnologintext' => 'Мора да бидете <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} најавени]</span> за да ги менувате вашите кориснички нагодувања.',
@@ -1446,7 +1455,7 @@ $1",
 'prefs-user-pages' => 'Кориснички страници',
 'prefs-personal' => 'Кориснички профил',
 'prefs-rc' => 'Скорешни промени',
-'prefs-watchlist' => 'СпиÑ\81ок Ð½Ð° Ð½абљудувања',
+'prefs-watchlist' => 'Ð\9dабљудувања',
 'prefs-watchlist-days' => 'Број на денови за приказ во списокот на набљудувања:',
 'prefs-watchlist-days-max' => 'Највеќе $1 {{PLURAL:$1|ден|дена}}',
 'prefs-watchlist-edits' => 'Максимален број на прикажани промени во проширениот список на набљудувања:',
@@ -1666,6 +1675,9 @@ $1",
 'rightslogtext' => 'Ова е дневник на промени на кориснички права.',
 'rightslogentry' => 'Променето членство во група за $1 од $2 во $3',
 'rightslogentry-autopromote' => 'е автоматски унапреден од $2 во $3',
+'logentry-rights-rights' => '$1 го смени групното членство за $3 од $4 во $5',
+'logentry-rights-rights-legacy' => '$1 го смени групното членство за $3',
+'logentry-rights-autopromote' => '$1 е автоматски унапреден од $4 во $5',
 'rightsnone' => '(нема)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1913,6 +1925,7 @@ $1',
 'backend-fail-notsame' => 'Веќе постои неистоветна податотека - $1.',
 'backend-fail-invalidpath' => '$1 не е важечка патека за складирање.',
 'backend-fail-delete' => 'Не можев да ја избришам податотеката $1.',
+'backend-fail-describe' => 'Не можев да ги изменам метаподатоците за податотеката „$1“.',
 'backend-fail-alreadyexists' => 'Податотеката $1 веќе постои.',
 'backend-fail-store' => 'Не можев да ја складирам податотеката $1 во $2.',
 'backend-fail-copy' => 'Не можев да ја ископирам податотеката $1 во $2.',
@@ -2027,7 +2040,7 @@ $1',
 # File description page
 'file-anchor-link' => 'Податотека',
 'filehist' => 'Историја на податотеката',
-'filehist-help' => 'Ð\9aликнете на датум/време за да ја видите податотеката како изгледала тогаш.',
+'filehist-help' => 'СÑ\82иÑ\81нете на датум/време за да ја видите податотеката како изгледала тогаш.',
 'filehist-deleteall' => 'избриши ги сите',
 'filehist-deleteone' => 'избриши',
 'filehist-revert' => 'врати',
@@ -2066,7 +2079,7 @@ $1',
 'shared-repo' => 'заедничко складиште',
 'shared-repo-name-wikimediacommons' => 'Заедничката Ризница',
 'filepage.css' => '/* Тука поставените каскадни стилски страници (CSS) се вклучени во страницата за опис на податотеката, како и на клиентските викија */',
-'upload-disallowed-here' => 'Нажалост, не можете да ја замените сликава со нова.',
+'upload-disallowed-here' => 'Нажалост, не можете да презапишете врз сликава.',
 
 # File reversion
 'filerevert' => 'Врати $1',
@@ -2306,13 +2319,13 @@ $1',
 'linksearch-ns' => 'Именски простор:',
 'linksearch-ok' => 'Барај',
 'linksearch-text' => 'Може да се користат џокери, како на „*.wikipedia.org“.
-Бара највисок домен, како на пр. „*.org“.<br />
\9fоддÑ\80жани Ð¿Ñ\80оÑ\82околи: <code>$1</code> (не Ð³Ð¸ Ñ\81Ñ\82аваÑ\98Ñ\82е Ð²Ð¾ Ð¿Ñ\80ебаÑ\80Ñ\83ваÑ\9aеÑ\82о).',
\91аÑ\80а Ð±Ð°Ñ\80ем Ð½Ð°Ñ\98виÑ\81ок Ð´Ð¾Ð¼ÐµÐ½, ÐºÐ°ÐºÐ¾ Ð½Ð° Ð¿Ñ\80. â\80\9e*.orgâ\80\9c.<br />
\9fоддÑ\80жани Ð¿Ñ\80оÑ\82околи: <code>$1</code> (задава http:// Ð°ÐºÐ¾ Ð½Ðµ Ñ\83кажеÑ\82е Ð¿Ñ\80оÑ\82окол).',
 'linksearch-line' => '$1 врска во $2',
 'linksearch-error' => 'Џокер-знаците може да се користат само на почетокот во името на домаќинот.',
 
 # Special:ListUsers
-'listusersfrom' => 'Ð\9fÑ\80икажни ÐºÐ¾Ñ\80иÑ\81ниÑ\86и Ð¿Ð¾Ñ\87нÑ\83ваÑ\98Ñ\9cи Ð¾Ð´:',
+'listusersfrom' => 'Прикажи корисници почнувајќи од:',
 'listusers-submit' => 'Прикажи',
 'listusers-noresult' => 'Не е пронајден корисник.',
 'listusers-blocked' => '(блокиран)',
@@ -2321,7 +2334,7 @@ $1',
 'activeusers' => 'Список на активни корисници',
 'activeusers-intro' => 'Ова е список на корисници кои биле на некој начин активни во последните $1 {{PLURAL:$1|ден|дена}}.',
 'activeusers-count' => '$1 {{PLURAL:$1|уредување|уредувања}} {{PLURAL:$3|денес|во последните $3 дена}}',
-'activeusers-from' => 'Прикажува корисници кои почнуваат на:',
+'activeusers-from' => 'Прикажи корисници почнувајќи од:',
 'activeusers-hidebots' => 'Скриј ботови',
 'activeusers-hidesysops' => 'Скриј администратори',
 'activeusers-noresult' => 'Нема пронајдено корисници.',
@@ -2356,8 +2369,8 @@ $1',
 'emailuser-title-target' => 'Составување на е-пошта за {{GENDER:$1|корисникот}}',
 'emailuser-title-notarget' => 'Е-пошта за корисникот',
 'emailpage' => 'Е-пошта',
-'emailpagetext' => 'Можете да го користите следниов образец за праќање на е-поштенска порака до овој корисник.
\95-поÑ\88Ñ\82енÑ\81каÑ\82а Ð°Ð´Ñ\80еÑ\81а ÐºÐ¾Ñ\98а Ñ\98а Ð¸Ð¼Ð°Ñ\82е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾ Ð²Ð¾ [[Special:Preferences|ваÑ\88иÑ\82е Ð½Ð°Ð³Ð¾Ð´Ñ\83ваÑ\9aа]] Ñ\9cе Ñ\81е Ð¿Ñ\80икаже Ð²Ð¾ â\80\9eÐ\9eдâ\80\9c Ð¿Ð¾Ð»ÐµÑ\82о Ð½Ð° Ðµ-пораката, со што примачот ќе може да ви одговори директно вам.',
+'emailpagetext' => 'Можете да го употребите следниов образец за да му испратите е-пошта на овој {{GENDER:$1|корисник}}.
\90дÑ\80еÑ\81а ÐºÐ¾Ñ\98а Ñ\98а Ð¸Ð¼Ð°Ñ\82е Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾ Ð²Ð¾ [[Special:Preferences|ваÑ\88иÑ\82е Ð½Ð°Ð³Ð¾Ð´Ñ\83ваÑ\9aа]] Ñ\9cе Ñ\81е Ð¿Ñ\80икаже Ð²Ð¾ Ð¿Ð¾Ð»ÐµÑ\82о â\80\9eÐ\9eдâ\80\9c Ð½Ð° пораката, со што примачот ќе може да ви одговори директно вам.',
 'usermailererror' => 'Настана следната грешка при праќање е-пошта:',
 'defemailsubject' => '{{SITENAME}} — писмо од корисникот „$1“',
 'usermaildisabled' => 'Корисничката е-пошта е оневозможена',
@@ -2388,7 +2401,7 @@ $1',
 
 # Watchlist
 'watchlist' => 'мои набљудувања',
-'mywatchlist' => 'мои Ð½абљудувања',
+'mywatchlist' => 'Ð\9dабљудувања',
 'watchlistfor2' => 'За $1 $2',
 'nowatchlist' => 'Немате ништо во списокот на набљудувања.',
 'watchlistanontext' => 'Се бара $1 за да можете да го прегледувате и уредувате списокот на набљудувања.',
@@ -2424,18 +2437,23 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} Систем за известување',
 'enotif_reset' => 'Означи ги сите страници како посетени',
-'enotif_newpagetext' => 'Ова е нова страница.',
 'enotif_impersonal_salutation' => 'Википедија корисник',
-'changed' => 'изменета',
-'created' => 'создадена',
-'enotif_subject' => 'Страницата $PAGETITLE на {{SITENAME}} беше $CHANGEDORCREATED од $PAGEEDITOR',
+'enotif_subject_deleted' => 'Страницата $1 на {{SITENAME}} е избришана од {{gender:$2|$2}}',
+'enotif_subject_created' => 'Страницата $1 на {{SITENAME}} е создадена од {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Страницата $1 на {{SITENAME}} е преместена од {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Страницата $1 на {{SITENAME}} е повратена од {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Страницата $1 на {{SITENAME}} е изменета од {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Страницата $1 на {{SITENAME}} е избришана на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
+'enotif_body_intro_created' => 'Страницата $1 на {{SITENAME}} е создадена на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
+'enotif_body_intro_moved' => 'Страницата $1 на {{SITENAME}} е преместена на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
+'enotif_body_intro_restored' => 'Страницата $1 на {{SITENAME}} е повратена на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
+'enotif_body_intro_changed' => 'Страницата $1 на {{SITENAME}} е изменета на $PAGEEDITDATE од {{gender:$2|$2}}. Тековната ревизија ќе ја најдете на $3.',
 'enotif_lastvisited' => 'Видете $1 за сите промени од вашата последна посета.',
 'enotif_lastdiff' => 'Видете $1 за да ја видите оваа промена.',
 'enotif_anon_editor' => 'анонимен корисник $1',
 'enotif_body' => 'Почитуван(а) $WATCHINGUSERNAME,
 
-
-На $PAGEEDITDATE е $CHANGEDORCREATED страницата „$PAGETITLE“ на проектот {{SITENAME}}. Измената ја изврши $PAGEEDITOR. Погледајте ја тековната верзија на $PAGETITLE_URL.
+$PAGEINTRO $NEWPAGE
 
 $NEWPAGE
 
@@ -2448,7 +2466,7 @@ $NEWPAGE
 Повеќе нема да добивате известувања во случај на други понатамошни промени, освен ако не ја посетите оваа страница.
 Можете и да ги поништите ознаките за известување за сите набљудувани страници на вашиот список на набљудувања.
 
-             Системот за известување на {{SITENAME}}
+Известителниот систем на {{SITENAME}}
 
 --
 Ако сакате да ги измените нагодувањата за известување по е-пошта, посетете ја страницата
@@ -2460,7 +2478,7 @@ $NEWPAGE
 За да ја избришете страницата од списокот на набљудувања, посетете ја страницата
 $UNWATCHURL
 
\9fовÑ\80аÑ\82ни Ð¸Ð½Ñ\84оÑ\80маÑ\86ии Ð¸ помош:
\92аÑ\88и Ð¼Ð¸Ñ\81леÑ\9aа, Ð¿Ñ\80аÑ\88аÑ\9aа Ð¸ Ð¿Ð¾Ð²ÐµÑ\9cе помош:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -2619,7 +2637,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|1 измена е обновена|$1 измени се обновени}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 измена|$1 измени}} и {{PLURAL:$2|1 податотека|$2 податотеки}} се вратени',
 'undeletedfiles' => '{{PLURAL:$1|1 податотека е вратена|$1 податотеки се вратени}}',
-'cannotundelete' => 'Враќањето не успеа. Можеби некој друг веќе ја вратил страницата.',
+'cannotundelete' => 'Враќањето не успеа:
+$1',
 'undeletedpage' => "'''$1 беше обновена'''
 
 Погледнете го [[Special:Log/delete|дневникот на бришења]] за попис на претходни бришења и обновувања.",
@@ -2651,9 +2670,9 @@ $1',
 'blanknamespace' => '(Главен)',
 
 # Contributions
-'contributions' => 'Кориснички придонеси',
+'contributions' => '{{GENDER:$1|Кориснички}} придонеси',
 'contributions-title' => 'Придонеси на корисникот $1',
-'mycontris' => 'мои Ð¿ридонеси',
+'mycontris' => 'Ð\9fридонеси',
 'contribsub2' => 'За $1 ($2)',
 'nocontribs' => 'Не се пронајдени промени што одговараат на овој критериум.',
 'uctop' => ' (врв)',
@@ -2693,7 +2712,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 пренасочувања',
 'whatlinkshere-hidetrans' => '$1 превметнувања',
 'whatlinkshere-hidelinks' => '$1 врски',
-'whatlinkshere-hideimages' => '$1 врски кон слика',
+'whatlinkshere-hideimages' => '$1 врски кон податотека',
 'whatlinkshere-filters' => 'Филтри',
 
 # Block/unblock
@@ -2928,6 +2947,7 @@ $1',
 'immobile-target-namespace-iw' => 'Меѓувики-врска не може да се користи за преименување на страници.',
 'immobile-source-page' => 'Оваа страница не може да се преместува.',
 'immobile-target-page' => 'Не може да се премести под бараниот наслов.',
+'bad-target-model' => 'Саканата одредница користи друг содржински модел. Не можам да претворам од $1 во $2.',
 'imagenocrossnamespace' => 'Не може да се премести податотека во неподатотечен именски простор',
 'nonfile-cannot-move-to-file' => 'Не можам да преместам неподатотека во податотечен именски простор',
 'imagetypemismatch' => 'Новата наставка на податотеката не соодветствува на нејзиниот тип',
@@ -3057,7 +3077,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Проба на JavaScript',
-'javascripttest-disabled' => 'Функцијата не е овозможена на ова вики.',
 'javascripttest-title' => 'Вршам $1 проби',
 'javascripttest-pagetext-noframework' => 'Оваа страница е резервирана за вршење на проби со JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Непозната рамка „$1“.',
@@ -3197,6 +3216,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Информации за „$1“',
+'pageinfo-not-current' => 'Информациите може да се прикажат само за тековната ревизија.',
 'pageinfo-header-basic' => 'Основни информации',
 'pageinfo-header-edits' => 'Историја на уредувања',
 'pageinfo-header-restrictions' => 'Заштита на страницата',
@@ -3205,6 +3225,7 @@ $1',
 'pageinfo-default-sort' => 'Основен подредбен клуч',
 'pageinfo-length' => 'Должина на страницата (во бајти)',
 'pageinfo-article-id' => 'Назнака на страницата',
+'pageinfo-language' => 'Јазик на содржината на страницата',
 'pageinfo-robot-policy' => 'Статус на прелистувачот',
 'pageinfo-robot-index' => 'Се индексира',
 'pageinfo-robot-noindex' => 'Не се индексира',
@@ -3222,10 +3243,17 @@ $1',
 'pageinfo-authors' => 'Број на засебни автори',
 'pageinfo-recent-edits' => 'Број на скорешни уредувања (во последните $1)',
 'pageinfo-recent-authors' => 'Број на скорешни засебни автори',
-'pageinfo-restriction' => 'Заштита на страницата ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Волшебен збор|Волшебни зборови}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Скриена категорија|Скриени категории}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Превметнат шаблон|Превметнати шаблони}} ($1)',
+'pageinfo-toolboxlink' => 'Информации за страницата',
+'pageinfo-redirectsto' => 'Пренасочува кон',
+'pageinfo-redirectsto-info' => 'инфо',
+'pageinfo-contentpage' => 'Се вбројува во содржински страници',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading' => 'Каскадната заштита на страниците важи од тука',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-protect-cascading-from' => 'Страници со каскадна заштита од',
 
 # Skin names
 'skinname-standard' => 'Класично',
@@ -3248,6 +3276,8 @@ $1',
 'markedaspatrollederror' => 'Не можам да означам како проверена',
 'markedaspatrollederrortext' => 'Морате да внесете верзија за да ја означите како проверена.',
 'markedaspatrollederror-noautopatrol' => 'Не можете да ги означите своите промени како проверени.',
+'markedaspatrollednotify' => 'Оваа измена на $1 е означена како испатролирана.',
+'markedaspatrollederrornotify' => 'Означувањето како испатролирано не успеа.',
 
 # Patrol log
 'patrol-log-page' => 'Дневник на патролирања',
@@ -3317,6 +3347,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 час|$1 часа}}',
 'days' => '{{PLURAL:$1|$1 ден|$1 дена}}',
 'ago' => 'пред $1',
+'just-now' => 'Штотуку',
 
 # Bad image list
 'bad_image_list' => 'Форматот е следниот:
@@ -3879,6 +3910,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Превметнувањето помеѓу викијата е оневозможено]',
 'scarytranscludefailed' => '[Преземањето на шаблонот за $1 не успеа]',
+'scarytranscludefailed-httpstatus' => '[Преземањето на шаблонот не успеа за $1: HTTP $2]',
 'scarytranscludetoolong' => '[Премногу долго URL]',
 
 # Delete conflict
@@ -4077,6 +4109,7 @@ $5
 'version-license' => 'Лиценца',
 'version-poweredby-credits' => "Ова вики работи на '''[//www.mediawiki.org/ МедијаВики]''', авторски права © 2001-$1 $2.",
 'version-poweredby-others' => 'други',
+'version-credits-summary' => 'Би сакале да им се заблагодариме на следниве лица за нивните придонеси кон [[Special:Version|МедијаВики]].',
 'version-license-info' => 'МедијаВики е слободна програмска опрема; можете да ја редистрибуирате и/или менувате под условите на ГНУ-овата општа јавна лиценца на Фондацијата за слободна програмска опрема; или верзија 2 на Лиценцата, или некоја понова верзија (по ваш избор).
 
 МедијаВики се нуди со надеж дека ќе биде од корист, но БЕЗ БИЛО КАКВА ГАРАНЦИЈА; дури и без подразбраната гаранција за ПРОДАЖНА ВРЕДНОСТ или ПОГОДНОСТ ЗА ДАДЕНА ЦЕЛ. За повеќе информации, погледајте ја ГНУ-овата општа јавна лиценца.
@@ -4124,7 +4157,7 @@ $5
 'specialpages-group-highuse' => 'Најкористени страници',
 'specialpages-group-pages' => 'Списоци на страници',
 'specialpages-group-pagetools' => 'Алатки за страници',
-'specialpages-group-wiki' => 'Википодатоци и алатки',
+'specialpages-group-wiki' => 'Вики-податоци и алатки',
 'specialpages-group-redirects' => 'Пренасочување на специјални страници',
 'specialpages-group-spam' => 'Алатки против спам',
 
@@ -4176,8 +4209,8 @@ $5
 'dberr-cachederror' => 'Следнава содржина е кеширана копија на бараната страница, која може да е застарена.',
 
 # HTML forms
-'htmlform-invalid-input' => 'Ð\98ма Ð¿Ñ\80облеми Ñ\81о Ð´ÐµÐ» Ð¾Ð´ Ð²Ð°Ñ\88иоÑ\82 Ð²Ð½Ðµс',
-'htmlform-select-badoption' => 'Ð\92Ñ\80едноÑ\81Ñ\82а ÐºÐ¾Ñ\98а Ñ\98а Ð½Ð°Ð²ÐµÐ´Ð¾Ð²Ñ\82е Ð½Ðµ Ðµ Ð²Ð°Ð¶ÐµÑ\87ка.',
+'htmlform-invalid-input' => 'Ð\98ма Ð¿Ñ\80облеми Ñ\81о Ð´ÐµÐ» Ð¾Ð´ Ð²Ð°Ñ\88иоÑ\82 Ð²Ð½Ð¾с',
+'htmlform-select-badoption' => 'УкажанаÑ\82а Ð²Ñ\80едноÑ\81Ñ\82 Ðµ Ð½ÐµÐ²Ð°Ð¶ÐµÑ\87ка ÐºÐ°ÐºÐ¾ Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82.',
 'htmlform-int-invalid' => 'Вредноста која ја наведовте не е цел број.',
 'htmlform-float-invalid' => 'Вредноста која ја наведовте не е број.',
 'htmlform-int-toolow' => 'Вредноста која ја наведовте е под минимумот од $1',
@@ -4217,9 +4250,9 @@ $5
 '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-newusers' => 'Направена е корисничката сметка $1',
+'logentry-newusers-create' => 'Направена е корисничката сметка $1',
+'logentry-newusers-create2' => 'Направена е корисничката сметка $3; создавач: $1',
 'logentry-newusers-autocreate' => 'Сметката $1 е создадена автоматски',
 'newuserlog-byemail' => 'испратена лозинка по е-пошта',
 
@@ -4239,6 +4272,10 @@ $5
 'feedback-bugcheck' => 'Одлично! Само проверете да не е една од [$1 веќе познатите грешки].',
 'feedback-bugnew' => 'Проверив. Пријави ја како нова грешка.',
 
+# Search suggestions
+'searchsuggest-search' => 'Пребарување',
+'searchsuggest-containing' => 'содржи...',
+
 # API errors
 'api-error-badaccess-groups' => 'Не ви е дозволено да подигате податотеки на ова вики.',
 'api-error-badtoken' => 'Внатрешна грешка: неисправен жетон.',
@@ -4291,4 +4328,6 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|век|века}}',
 'duration-millennia' => '$1 {{PLURAL:$1|милениум|милениуми}}',
 
+# Unknown messages
+'svg-long-error' => 'Неважечка SVG-податотека: $1',
 );
index a657896..ab1d33b 100644 (file)
@@ -120,12 +120,13 @@ $specialPageAliases = array(
        'Listusers'                 => array( 'ഉപയോക്താക്കളുടെ_പട്ടിക' ),
        'Lockdb'                    => array( 'ഡി.ബി.ബന്ധിക്കുക' ),
        'Log'                       => array( 'രേഖ', 'രേഖകൾ' ),
-       'Lonelypages'               => array( 'അനാഥ_താളുകൾ' ),
-       'Longpages'                 => array( 'വലിയ_താളുകൾ' ),
+       'Lonelypages'               => array( 'അനാഥതാളുകൾ' ),
+       'Longpages'                 => array( 'വലിയതാളുകൾ' ),
        'MergeHistory'              => array( 'നാൾവഴിലയിപ്പിക്കുക' ),
        'MIMEsearch'                => array( 'മൈംതിരയൽ' ),
        'Mostcategories'            => array( 'കൂടുതൽ_വർഗ്ഗങ്ങൾ' ),
        'Mostimages'                => array( 'കൂടുതൽ_കണ്ണികളുള്ള_പ്രമാണങ്ങൾ', 'കൂടുതൽ_പ്രമാണങ്ങൾ', 'കൂടുതൽ_ചിത്രങ്ങൾ' ),
+       'Mostinterwikis'            => array( 'ഏറ്റവുമധികമന്തർവിക്കികൾ' ),
        'Mostlinked'                => array( 'കൂടുതൽ_കണ്ണികളുള്ള_താളുകൾ', 'കൂടുതൽ_കണ്ണികളുള്ളവ' ),
        'Mostlinkedcategories'      => array( 'കൂടുതൽ_കണ്ണികളുള്ള_വർഗ്ഗങ്ങൾ', 'കൂടുതൽ_ഉപയോഗിച്ചിട്ടുള്ള_വർഗ്ഗങ്ങൾ' ),
        'Mostlinkedtemplates'       => array( 'കൂടുതൽ_കണ്ണികളുള്ള_ഫലകങ്ങൾ', 'കൂടുതൽ_ഉപയോഗിച്ചിട്ടുള്ള_ഫലകങ്ങൾ' ),
@@ -149,7 +150,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'സമീപകാലമാറ്റങ്ങൾ' ),
        'Recentchangeslinked'       => array( 'ബന്ധപ്പെട്ട_മാറ്റങ്ങൾ' ),
        'Revisiondelete'            => array( 'നാൾപ്പതിപ്പ്_മായ്ക്കൽ' ),
-       'RevisionMove'              => array( 'നാൾപ്പതിപ്പ്മാറ്റൽ' ),
        'Search'                    => array( 'അന്വേഷണം' ),
        'Shortpages'                => array( 'ചെറിയ_താളുകൾ' ),
        'Specialpages'              => array( 'പ്രത്യേകതാളുകൾ' ),
@@ -188,7 +188,6 @@ $magicWords = array(
        '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' ),
@@ -268,6 +267,7 @@ $magicWords = array(
        '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' ),
@@ -309,7 +309,7 @@ $magicWords = array(
        'special'                   => array( '0', 'പ്രത്യേകം', 'special' ),
        'defaultsort'               => array( '1', 'സ്വതവേയുള്ളക്രമപ്പെടുത്തൽ:', 'സ്വതവേയുള്ളക്രമപ്പെടുത്തൽചാവി:', 'സ്വതവേയുള്ളവർഗ്ഗക്രമപ്പെടുത്തൽ:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
        'filepath'                  => array( '0', 'പ്രമാണപഥം:', 'FILEPATH:' ),
-       'tag'                       => array( '0', 'റ്റാഗ്', 'tag' ),
+       'tag'                       => array( '0', 'റ്റാഗ്', 'ടാഗ്', 'tag' ),
        'hiddencat'                 => array( '1', '‌‌__മറഞ്ഞിരിക്കുംവർഗ്ഗം__', '__HIDDENCAT__' ),
        'pagesincategory'           => array( '1', 'വർഗ്ഗത്തിലുള്ളതാളുകൾ', 'PAGESINCATEGORY', 'PAGESINCAT' ),
        'pagesize'                  => array( '1', 'താൾവലിപ്പം', 'PAGESIZE' ),
@@ -323,6 +323,10 @@ $magicWords = array(
        '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' ),
 );
 
 $digitGroupingPattern = "##,##,###";
@@ -376,7 +380,7 @@ $messages = array(
 
 'underline-always' => 'എല്ലായ്പ്പോഴും',
 'underline-never' => 'ഒരിക്കലും അരുത്',
-'underline-default' => 'à´¬àµ\8dà´°àµ\97സറിലàµ\87à´¤àµ\81 à´ªàµ\8bà´²àµ\86',
+'underline-default' => 'à´¦àµ\83à´¶àµ\8dയരàµ\82പതàµ\8dതിൽ à´\85ഥവാ à´¬àµ\8dà´°àµ\97സറിൽ à´¸àµ\8dവതàµ\87à´¯àµ\81à´³àµ\8dà´³ à´¸àµ\8dവഭാവà´\82',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'തിരുത്തൽ മേഖലയിലെ ഫോണ്ടിന്റെ ശൈലി:',
@@ -461,8 +465,8 @@ $messages = array(
 'newwindow' => '(പുതിയ ജാലകത്തിൽ തുറന്നു വരും)',
 'cancel' => 'റദ്ദാക്കുക',
 'moredotdotdot' => 'കൂടുതൽ...',
-'mypage' => 'à´\8eà´¨àµ\8dà´±àµ\86 à´¤à´¾àµ¾',
-'mytalk' => 'à´\8eà´¨àµ\8dà´±àµ\86 à´¸à´\82വാദതàµ\8dതാൾ',
+'mypage' => 'താൾ',
+'mytalk' => 'സംവാദത്താൾ',
 'anontalk' => 'ഈ ഐ.പി.യുടെ സം‌വാദം താൾ',
 'navigation' => 'ഉള്ളടക്കം',
 'and' => '&#32;ഒപ്പം',
@@ -472,7 +476,6 @@ $messages = array(
 'qbbrowse' => 'ബ്രൗസ്',
 'qbedit' => 'തിരുത്തുക',
 'qbpageoptions' => 'ഈ താൾ',
-'qbpageinfo' => 'സന്ദർഭം',
 'qbmyoptions' => 'എന്റെ താളുകൾ',
 'qbspecialpages' => 'പ്രത്യേക താളുകൾ',
 'faq' => 'പതിവുചോദ്യങ്ങൾ',
@@ -485,7 +488,7 @@ $messages = array(
 'vector-action-protect' => 'സം‌രക്ഷിക്കുക',
 'vector-action-undelete' => 'മായ്ക്കപ്പെട്ടത് പുനഃസ്ഥാപിക്കുക',
 'vector-action-unprotect' => 'സംരക്ഷണത്തിൽ മാറ്റംവരുത്തുക',
-'vector-simplesearch-preference' => 'à´®àµ\86à´\9aàµ\8dà´\9aà´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9f à´¤à´¿à´°à´\9aàµ\8dà´\9aിൽ à´¨à´¿àµ¼à´¦àµ\8dà´¦àµ\87à´¶à´\99àµ\8dà´\99ൾ à´¤à´°à´¿ക (വെക്റ്റർ ദൃശ്യരൂപത്തിൽ മാത്രം)',
+'vector-simplesearch-preference' => 'ലളിതമായ à´¤à´¿à´°à´\9aàµ\8dà´\9aിൽ à´¸àµ\97à´\95à´°àµ\8dà´¯à´\82 à´¸à´\9càµ\8dà´\9cമാà´\95àµ\8dà´\95àµ\81ക (വെക്റ്റർ ദൃശ്യരൂപത്തിൽ മാത്രം)',
 'vector-view-create' => 'സൃഷ്ടിക്കുക',
 'vector-view-edit' => 'തിരുത്തുക',
 'vector-view-history' => 'നാൾവഴി കാണുക',
@@ -495,6 +498,7 @@ $messages = array(
 'namespaces' => 'നാമമേഖല',
 'variants' => 'രൂപഭേദങ്ങൾ',
 
+'navigation-heading' => 'ഗമന വഴികാട്ടി',
 'errorpagetitle' => 'പിഴവ്',
 'returnto' => '$1 എന്ന താളിലേക്ക് തിരിച്ചുപോവുക.',
 'tagline' => '{{SITENAME}} സംരംഭത്തിൽ നിന്ന്',
@@ -591,7 +595,7 @@ $1',
 'youhavenewmessages' => 'താങ്കൾക്ക് $1 ഉണ്ട് ($2).',
 'newmessageslink' => 'പുതിയ സന്ദേശങ്ങൾ',
 'newmessagesdifflink' => 'അവസാന മാറ്റം',
-'youhavenewmessagesfromusers' => 'താà´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95àµ\8d {{PLURAL:$3|മറàµ\8dà´±àµ\8aà´°àµ\81 à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d|മറàµ\8dà´±àµ\8d $3 ഉപയോക്താക്കൾ}} $1 ചേർത്തിട്ടുണ്ട് ($2).',
+'youhavenewmessagesfromusers' => 'താà´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95àµ\8d {{PLURAL:$3|à´\92à´°àµ\81 à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d|$3 ഉപയോക്താക്കൾ}} $1 ചേർത്തിട്ടുണ്ട് ($2).',
 'youhavenewmessagesmanyusers' => 'താങ്കൾക്ക് പലർ $1 ചേർത്തിട്ടുണ്ട് ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|പുതിയ സന്ദേശം|പുതിയ സന്ദേശങ്ങൾ}}',
 'newmessagesdifflinkplural' => 'അവസാന {{PLURAL:$1|മാറ്റം|മാറ്റങ്ങൾ}}',
@@ -703,7 +707,7 @@ $1',
 'viewsource-title' => '$1 എന്ന താളിന്റെ മൂലരൂപം കാണുക',
 'actionthrottled' => 'പ്രവൃത്തി നടത്തിയിരിക്കുന്നു',
 'actionthrottledtext' => 'പാഴെഴുത്തിനെതിരെയുള്ള മുൻകരുതൽ എന്ന നിലയിൽ ഒരേ പ്രവൃത്തി കുറഞ്ഞ സമയത്തിനുള്ളിൽ നിരവധി തവണ ആവർത്തിക്കുന്നതു പരിമിതപ്പെടുത്തിയിരിക്കുന്നു. താങ്കൾ ആ പരിധി ലംഘിച്ചിരിക്കുന്നു. കുറച്ച് മിനിറ്റുകൾക്കു ശേഷം വീണ്ടും ശ്രമിക്കുക.',
-'protectedpagetext' => 'à´\88 à´¤à´¾àµ¾ à´¤à´¿à´°àµ\81à´¤àµ\8dà´¤àµ\81വാൻ à´¸à´¾à´§à´¿à´\95àµ\8dà´\95ാതàµ\8dà´¤ വിധം സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്.',
+'protectedpagetext' => 'à´\88 à´¤à´¾àµ¾ à´¤à´¿à´°àµ\81à´¤àµ\8dതലàµ\8b à´®à´±àµ\8dà´±àµ\81 à´ªàµ\8dà´°à´µàµ\83à´¤àµ\8dതിà´\95à´³àµ\8b à´¤à´\9fയാനാà´\95àµ\81à´\82 വിധം സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്.',
 'viewsourcetext' => 'താങ്കൾക്ക് ഈ താളിന്റെ മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും:',
 'viewyourtext' => "താങ്കൾക്ക് ഈ താളിലെ '''താങ്കളുടെ തിരുത്തലുകളുടെ''' മൂലരൂപം കാണാനും പകർത്താനും സാധിക്കും:",
 'protectedinterface' => 'ഈ താൾ ഈ വിക്കിയുടെ സോഫ്റ്റ്‌വെയറിന്റെ സമ്പർക്കമുഖ എഴുത്തുകൾ നൽകുന്നു, അതുകൊണ്ട് ദുരുപയോഗം തടയാൻ ബന്ധിക്കപ്പെട്ടിരിക്കുന്നു. എല്ലാ വിക്കികൾക്കുമായി പരിഭാഷ കൂട്ടിച്ചേർക്കാനോ, പരിഭാഷയിൽ മാറ്റം വരുത്താനോ, ദയവായി മീഡിയവിക്കി പ്രാദേശീകരണ പദ്ധതിയായ [//translatewiki.net/ translatewiki.net] ഉപയോഗിക്കുക.',
@@ -736,11 +740,11 @@ $2',
 'logouttext' => "'''താങ്കൾ ഇപ്പോൾ {{SITENAME}} സംരംഭത്തിൽനിന്നും ലോഗൗട്ട് ചെയ്തിരിക്കുന്നു'''
 
 അജ്ഞാതമായിരുന്നു കൊണ്ട് {{SITENAME}} സം‌രംഭം താങ്കൾക്കു തുടർന്നും ഉപയോഗിക്കാവുന്നതാണ്‌.
-അല്ലെങ്കിൽ  [[Special:UserLogin|ലോഗിൻ സൗകര്യം ഉപയോഗിച്ച്]] വീണ്ടും ലോഗിൻ ചെയ്യാവുന്നതും ആണ്‌.
+അല്ലെങ്കിൽ  <span class='plainlinks'>[$1 ലോഗിൻ സൗകര്യം ഉപയോഗിച്ച്]</span> വീണ്ടും ലോഗിൻ ചെയ്യാവുന്നതും ആണ്‌.
 താങ്കൾ വെബ് ബ്രൌസറിന്റെ ക്യാഷെ ശൂന്യമാക്കിയിട്ടില്ലെങ്കിൽ ചില താളുകളിൽ താങ്കൾ ലോഗിൻ ചെയ്തിരിക്കുന്നതായി കാണിക്കാൻ സാധ്യതയുണ്ട്.",
-'welcomecreation' => '== സ്വാഗതം, $1! ==
-താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.
-താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 [[Special:Preferences|{{SITENAME}} à´\95àµ\8dà´°à´®àµ\80à´\95à´°à´£à´\99àµ\8dà´\99ളിൽ]] à´\86വശàµ\8dയമായ à´®à´¾à´±àµ\8dà´±à´\82 à´µà´°àµ\81à´¤àµ\8dà´¤àµ\81വാൻ à´®à´±à´\95àµ\8dà´\95à´°àµ\81à´¤àµ\87.',
+'welcomeuser' => 'സ്വാഗതം, $1!',
+'welcomecreation-msg' => 'താങ്കളുടെ അംഗത്വം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.
+താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 [[Special:Preferences|{{SITENAME}} à´\95àµ\8dà´°à´®àµ\80à´\95à´°à´£à´\99àµ\8dà´\99ളിൽ]] à´®à´¾à´±àµ\8dà´±à´\82 à´µà´°àµ\81à´¤àµ\8dതാൻ à´®à´±à´\95àµ\8dà´\95à´°àµ\81à´¤àµ\8d.',
 'yourname' => 'ഉപയോക്തൃനാമം:',
 'yourpassword' => 'രഹസ്യവാക്ക്:',
 'yourpasswordagain' => 'രഹസ്യവാക്ക് ഒരിക്കൽക്കൂടി:',
@@ -1002,7 +1006,7 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'note' => "'''പ്രത്യേക ശ്രദ്ധയ്ക്ക്:'''",
 'previewnote' => "'''ഇതൊരു പ്രിവ്യൂ മാത്രമാണെന്ന് ഓർക്കുക.'''
 താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഇതുവരെ സേവ് ചെയ്തിട്ടില്ല!",
-'continue-editing' => 'തിരàµ\81à´¤àµ\8dതൽ à´¤àµ\81à´\9fà´°ുക',
+'continue-editing' => 'തിരàµ\81à´¤àµ\8dതൽ à´®àµ\87à´\96ലയിലàµ\87à´¯àµ\8dà´\95àµ\8dà´\95àµ\8d à´ªàµ\8bà´µുക',
 'previewconflict' => 'ഈ പ്രിവ്യൂവിൽ മുകളിലെ ടെക്സ്റ്റ് ഏരിയയിലുള്ള എഴുത്ത് മാത്രമാണ് കാട്ടുന്നത്, സേവ്‌ ചെയ്യാൻ താങ്കൾ തീരുമാനിച്ചാൽ അത് സേവ് ആകുന്നതാണ്.',
 'session_fail_preview' => "'''ക്ഷമിക്കണം! സെഷൻ ഡാറ്റ നഷ്ടപ്പെട്ടതിനാൽ താങ്കളുടെ തിരുത്തലിന്റെ തുടർപ്രക്രിയ നടത്തുവാൻ സാധിച്ചില്ല.''' 
 ദയവായി വീണ്ടും ശ്രമിക്കൂ.
@@ -1076,6 +1080,15 @@ $1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്ന
 'edit-already-exists' => 'പുതിയ താൾ സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല.
 താൾ ഇപ്പോൾ തന്നെ നിലവിലുണ്ട്.',
 'defaultmessagetext' => 'സ്വതേയുള്ള സന്ദേശ എഴുത്ത്',
+'content-failed-to-parse' => '$2 ഉള്ളടക്കം $1 മാതൃകയിൽ പാഴ്സ് ചെയ്യൽ പരാജയപ്പെട്ടു: $3',
+'invalid-content-data' => 'അസാധുവായ ഉള്ളടക്ക ഡേറ്റ',
+'content-not-allowed-here' => '"$1" ഉള്ളടക്കം [[$2]] താളിൽ അനുവദിക്കുന്നില്ല',
+
+# Content models
+'content-model-wikitext' => 'വിക്കിഎഴുത്ത്',
+'content-model-text' => 'വെറും എഴുത്ത്',
+'content-model-javascript' => 'ജാവാസ്ക്രിപ്റ്റ്',
+'content-model-css' => 'സി.എസ്.എസ്.',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''മുന്നറിയിപ്പ്:''' ഈ താളിൽ വളരെക്കൂടുതൽ പാഴ്സർ ഫങ്ഷനുകൾ വിളിച്ചിരിക്കുന്നു.
@@ -1332,8 +1345,6 @@ $1",
 'search-interwiki-caption' => 'സഹോദര സംരംഭങ്ങൾ',
 'search-interwiki-default' => '$1 ഫലങ്ങൾ:',
 'search-interwiki-more' => '(കൂടുതൽ)',
-'search-mwsuggest-enabled' => 'നിർദ്ദേശങ്ങൾ വേണം',
-'search-mwsuggest-disabled' => 'നിർദ്ദേശങ്ങൾ വേണ്ട',
 'search-relatedarticle' => 'ബന്ധപ്പെട്ടവ',
 'mwsuggest-disable' => 'അജാക്സ് നിർദ്ദേശങ്ങൾ വേണ്ട',
 'searcheverything-enable' => 'എല്ലാ നാമമേഖലകളും തിരയുക',
@@ -1366,7 +1377,7 @@ $1",
 
 # Preferences page
 'preferences' => 'ക്രമീകരണങ്ങൾ',
-'mypreferences' => 'à´\8eà´¨àµ\8dà´±àµ\86 à´\95àµ\8dà´°à´®àµ\80à´\95à´°à´£à´\99àµ\8dà´\99ൾ',
+'mypreferences' => 'ക്രമീകരണങ്ങൾ',
 'prefs-edits' => 'ആകെ തിരുത്തലുകൾ:',
 'prefsnologin' => 'ലോഗിൻ ചെയ്തിട്ടില്ല',
 'prefsnologintext' => 'ഉപയോക്തൃക്രമീകരണങ്ങൾ മാറ്റാൻ താങ്കൾ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ലോഗിൻ]</span> ചെയ്തിരിക്കണം.',
@@ -1599,6 +1610,9 @@ $1",
 'rightslogtext' => 'ഈ പ്രവർത്തനരേഖ ഉപയോക്തൃ അവകാശങ്ങൾക്കുണ്ടായ മാറ്റങ്ങളുടേതാണ്.',
 'rightslogentry' => '$1 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $2 എന്നതിൽ നിന്നു $3 എന്നതിലേക്കു മാറ്റിയിരിക്കുന്നു',
 'rightslogentry-autopromote' => '$2 എന്നതിൽ നിന്ന് $3 എന്നതിലേയ്ക്ക് സ്വയം ഉയർത്തിയിരിക്കുന്നു',
+'logentry-rights-rights' => '$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1, $4 എന്നതിൽ നിന്നു $5 എന്നതിലേക്കു മാറ്റിയിരിക്കുന്നു',
+'logentry-rights-rights-legacy' => '$3 എന്ന ഉപയോക്താവിന്റെ സംഘ അംഗത്വം $1 മാറ്റിയിരിക്കുന്നു',
+'logentry-rights-autopromote' => '$1 എന്ന ഉപയോക്താവ് $4 എന്നതിൽ നിന്നും $5 എന്നതിലേയ്ക്ക് സ്വയം ഉയർത്തിയിരിക്കുന്നു',
 'rightsnone' => '(ഒന്നുമില്ല)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1769,7 +1783,7 @@ $2 {{PLURAL:$3|തരത്തിലുള്ള പ്രമാണം|തരങ
 'fileexists-forbidden' => 'ഈ പേരിൽ ഒരു പ്രമാണം നിലവിലുണ്ട്, അതു മാറ്റി സൃഷ്ടിക്കുക സാദ്ധ്യമല്ല.
 താങ്കൾക്ക് ഈ ചിത്രം അപ്‌ലോഡ് ചെയ്തേ മതിയാവുയെങ്കിൽ, ദയവു ചെയ്തു വേറൊരു പേരിൽ ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക. [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'ഈ പേരിൽ ഒരു പ്രമാണം പങ്ക് വെയ്ക്കപ്പെട്ടുപയോഗിക്കുന്ന ശേഖരത്തിലുണ്ട്. താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്തേ മതിയാവുയെങ്കിൽ, ദയവായി തിരിച്ചു പോയി പുതിയ ഒരു പേരിൽ ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക.[[File:$1|thumb|center|$1]]',
-'file-exists-duplicate' => 'à´\88 à´ªàµ\8dരമാണà´\82 à´\87നി à´ªà´±à´¯àµ\81à´¨àµ\8dà´¨ {{PLURAL:$1|à´ªàµ\8dരമാണതàµ\8dതിനàµ\8dà´±àµ\86|à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\86}} à´\85പരനാണ്‌:',
+'file-exists-duplicate' => 'à´\88 à´ªàµ\8dരമാണà´\82 à´\87നി à´ªà´±à´¯àµ\81à´¨àµ\8dà´¨ {{PLURAL:$1|à´ªàµ\8dരമാണതàµ\8dതിനàµ\8dà´±àµ\86|à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\86}} à´ªà´\95ർപàµ\8dà´ªാണ്‌:',
 'file-deleted-duplicate' => 'ഈ പ്രമാണത്തിനു സദൃശമായ പ്രമാണം ([[:$1]]) മുമ്പ് മായ്ക്കപ്പെട്ടിട്ടുണ്ട്.
 ആ പ്രമാണത്തിന്റെ മായ്ക്കൽ ചരിത്രം എടുത്തു പരിശോധിച്ച ശേഷം മാത്രം വീണ്ടും അപ്‌‌ലോഡ് ചെയ്യുക.',
 'uploadwarning' => 'അപ്‌ലോഡ് മുന്നറിയിപ്പ്',
@@ -1827,6 +1841,7 @@ $1',
 'backend-fail-notsame' => '$1 എന്ന് സമാനമല്ലാത്ത ഒരു പ്രമാണം നിലവിലുണ്ട്.',
 'backend-fail-invalidpath' => '$1 എന്നത് സാധുവായ ഒരു ശേഖരണ പഥം അല്ല.',
 'backend-fail-delete' => '$1 എന്ന പ്രമാണം മായ്ക്കാൻ കഴിഞ്ഞില്ല.',
+'backend-fail-describe' => '"$1" എന്ന പ്രമാണത്തിന്റെ മെറ്റഡേറ്റ മാറ്റാൻ കഴിയില്ല.',
 'backend-fail-alreadyexists' => '$1 എന്ന പ്രമാണം നിലവിലുണ്ട്.',
 'backend-fail-store' => '$1 എന്ന പ്രമാണം $2 എന്നതിൽ ശേഖരിക്കാൻ കഴിഞ്ഞില്ല.',
 'backend-fail-copy' => '$1 എന്ന പ്രമാണം $2 എന്നതിലേയ്ക്ക് പകർത്താൻ കഴിഞ്ഞില്ല.',
@@ -1961,7 +1976,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'nolinkstoimage' => 'ഈ ചിത്രം/പ്രമാണം വിക്കിയിലെ താളുകളിലൊന്നിലും ഉപയോഗിക്കുന്നില്ല.',
 'morelinkstoimage' => 'ഈ പ്രമാണത്തിലേയ്ക്കുള്ള [[Special:WhatLinksHere/$1|കൂടുതൽ കണ്ണികൾ]] കാണുക.',
 'linkstoimage-redirect' => '$1 (പ്രമാണ തിരിച്ചുവിടൽ) $2',
-'duplicatesoffile' => 'à´\88 à´ªàµ\8dരമാണതàµ\8dതിനàµ\8dà´±àµ\86 {{PLURAL:$1|à´\92à´°àµ\81 à´\85പര à´ªàµ\8dരമാണതàµ\8dà´¤àµ\86|$1 à´\85പര പ്രമാണങ്ങളെ}} താഴെ കൊടുത്തിരിക്കുന്നു ([[Special:FileDuplicateSearch/$2|കൂടുതൽ വിവരങ്ങൾ]]):',
+'duplicatesoffile' => 'à´\88 à´ªàµ\8dരമാണതàµ\8dതിനàµ\8dà´±àµ\86 {{PLURAL:$1|à´\92à´°àµ\81 à´ªà´\95ർപàµ\8dà´ªàµ\8d à´ªàµ\8dരമാണതàµ\8dà´¤àµ\86|$1 à´ªà´\95ർപàµ\8dà´ªàµ\8d പ്രമാണങ്ങളെ}} താഴെ കൊടുത്തിരിക്കുന്നു ([[Special:FileDuplicateSearch/$2|കൂടുതൽ വിവരങ്ങൾ]]):',
 'sharedupload' => 'ഇത് $1 സം‌രംഭത്തിൽ നിന്നുള്ള പ്രമാണമാണ്‌, മറ്റു സം‌രംഭങ്ങളും ഇതുപയോഗിക്കുന്നുണ്ടാകാം.',
 'sharedupload-desc-there' => 'ഈ പ്രമാണം $1 സംരംഭത്തിൽ നിന്നുമുള്ളതാണ്, മറ്റു പദ്ധതികൾ ഇതുപയോഗിക്കുന്നുണ്ടാകാം.
 കൂടുതൽ വിവരങ്ങൾക്ക് ദയവായി [$2 പ്രമാണത്തിന്റെ വിവരണ താൾ] കാണുക.',
@@ -1978,7 +1993,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'shared-repo' => 'ഒരു പങ്കുവെക്കപ്പെട്ട സംഭരണി',
 'shared-repo-name-wikimediacommons' => 'വിക്കിമീഡിയ കോമൺസ്',
 'filepage.css' => '/* ഇവിടെ നൽകുന്ന സി.എസ്.എസ്. പ്രമാണ വിവരണ താളുകളിൽ ഉൾപ്പെടുത്തപ്പെടുന്നതായിരിക്കും, ബാഹ്യ ക്ലൈന്റ് വിക്കികളിലും അത് ലഭ്യമായിരിക്കും */',
-'upload-disallowed-here' => 'നിർഭാà´\97àµ\8dയവശാൽ à´\88 à´\9aà´¿à´¤àµ\8dà´°à´¤àµ\8dതിനàµ\81 à´®àµ\81à´\95ളിൽ à´®à´±àµ\8dà´±àµ\8aà´°àµ\81 à´\9aà´¿à´¤àµ\8dà´°ം ചേർക്കാൻ താങ്കൾക്ക് കഴിയില്ല.',
+'upload-disallowed-here' => 'à´\88 à´ªàµ\8dരമാണതàµ\8dതിനàµ\81 à´®àµ\81à´\95ളിൽ à´®à´±àµ\8dà´±àµ\8aà´°àµ\81 à´ªàµ\8dരമാണം ചേർക്കാൻ താങ്കൾക്ക് കഴിയില്ല.',
 
 # File reversion
 'filerevert' => '$1 തിരസ്ക്കരിക്കുക',
@@ -2215,8 +2230,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'linksearch-ns' => 'നാമമേഖല:',
 'linksearch-ok' => 'തിരയൂ',
 'linksearch-text' => '"*.wikipedia.org" പോലുള്ള വൈൽഡ് കാർഡുകൾ ഉപയോഗിക്കാവുന്നതാണ്‌.
-കുറഞ്ഞത് "*.org" പോലുള്ള ടോപ്-ലെവൽ ഡൊമൈൻ എങ്കിലും ഉണ്ടായിരിക്കണം.<br />
-പിനàµ\8dതാà´\99àµ\8dà´\99àµ\81à´¨àµ\8dà´¨ à´ªàµ\8dà´°àµ\8bà´\9fàµ\8dà´\9fàµ\8bà´\95àµ\8dà´\95àµ\8bà´³àµ\81à´\95ൾ: <code>$1</code> (താà´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´¤à´¿à´°à´\9aàµ\8dà´\9aിലിൽ à´\87à´µ à´\9aàµ\87ർà´\95àµ\8dà´\95à´°àµ\81à´¤്).',
+à´\95àµ\81à´±à´\9eàµ\8dà´\9eà´¤àµ\8d "*.org" à´ªàµ\8bà´²àµ\81à´³àµ\8dà´³ à´\92à´°àµ\81 à´\9fàµ\8bà´ªàµ\8d-à´²àµ\86വൽ à´¡àµ\8aà´®àµ\88ൻ à´\8eà´\99àµ\8dà´\95à´¿à´²àµ\81à´\82 à´\89à´£àµ\8dà´\9fായിരിà´\95àµ\8dà´\95à´£à´\82.<br />
+പിനàµ\8dà´¤àµ\81ണയàµ\81à´³àµ\8dà´³ à´ªàµ\8dà´°àµ\8bà´\9fàµ\8dà´\9fàµ\8bà´\95àµ\8dà´\95àµ\8bà´³àµ\81à´\95ൾ: <code>$1</code> (à´\92à´¨àµ\8dà´¨àµ\81à´\82 à´¨àµ½à´\95ിയിലàµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¸àµ\8dവതàµ\87à´¯àµ\81à´³àµ\8dà´³ http:// à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dനതാണ്).',
 'linksearch-line' => '$1,  $2ൽ നിന്നു കണ്ണി ചേർക്കപ്പെട്ടിരിക്കുന്നു.',
 'linksearch-error' => 'ഹോസ്റ്റ്നെയിമിന്റെ തുടക്കത്തിൽ മാത്രമേ വൈൽഡ് കാർഡുകൾ വരാവൂ.',
 
@@ -2265,7 +2280,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 'emailuser-title-target' => 'ഈ {{GENDER:$1|ഉപയോക്താവിന്}} ഇമെയിൽ അയയ്ക്കുക',
 'emailuser-title-notarget' => 'ഉപയോക്താവിന് ഇമെയിൽ അയക്കുക',
 'emailpage' => 'ഉപയോക്താവിന് ഇമെയിൽ അയക്കുക',
-'emailpagetext' => 'താഴàµ\86 à´\95ാണàµ\81à´¨àµ\8dà´¨ à´«àµ\8bà´\82 à´®à´±àµ\8dà´±àµ\8aà´°àµ\81 à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8dâ\80\8c ഇമെയിൽ അയക്കാൻ ഉപയോഗിക്കാവുന്നതാണ്.
+'emailpagetext' => 'താഴàµ\86 à´\95ാണàµ\81à´¨àµ\8dà´¨ à´«àµ\8bà´\82 à´\88 {{GENDER:$1|à´\89പയàµ\8bà´\95àµ\8dതാവിനàµ\8dâ\80\8c}} ഇമെയിൽ അയക്കാൻ ഉപയോഗിക്കാവുന്നതാണ്.
 [[Special:Preferences|ഉപയോക്താവിന്റെ ക്രമീകരണങ്ങളിൽ]] കൊടുത്തിട്ടുള്ള ഇമെയിൽ വിലാസം "ദാതാവ്" ആയി വരുന്നതാണ്‌, അതുകൊണ്ട് സ്വീകർത്താവിന്‌ താങ്കൾക്ക് നേരിട്ട് മറുപടി അയക്കാൻ കഴിയും.',
 'usermailererror' => 'മെയിലുണ്ടായ പിഴവ് തിരിച്ചയച്ചിരിക്കുന്നു:',
 'defemailsubject' => '"$1" എന്ന ഉപയോക്താവ് അയച്ച {{SITENAME}} ഇമെയിൽ',
@@ -2297,7 +2312,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 
 # Watchlist
 'watchlist' => 'ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക',
-'mywatchlist' => 'à´\9eാൻ à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവ',
+'mywatchlist' => 'ശ്രദ്ധിക്കുന്നവ',
 'watchlistfor2' => 'ഉപയോക്താവ്:$1 $2',
 'nowatchlist' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽ ഇനങ്ങളൊന്നുമില്ല.',
 'watchlistanontext' => 'താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക കാണുവാനോ തിരുത്തുവാനോ $1.',
@@ -2332,16 +2347,23 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization കാണുക.',
 
 'enotif_mailer' => '{{SITENAME}} വിജ്ഞാപന മെയിലർ',
 'enotif_reset' => 'എല്ലാ താളുകളും സന്ദർശിച്ചതായി രേഖപ്പെടുത്തുക',
-'enotif_newpagetext' => 'ഇതൊരു പുതിയ താളാണ്‌',
 'enotif_impersonal_salutation' => '{{SITENAME}} ഉപയോക്താവ്',
-'changed' => 'മാറ്റിയിരിക്കുന്നു',
-'created' => 'സൃഷ്ടിച്ചു',
-'enotif_subject' => '{{SITENAME}} സംരംഭത്തിലെ $PAGETITLE എന്ന താൾ $PAGEEDITOR $CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ {{gender:$2|$2}} മായ്ച്ചിരിക്കുന്നു',
+'enotif_subject_created' => '{{SITENAME}} സംരംഭത്തിl $1 എന്ന താൾ {{gender:$2|$2}} സൃഷ്ടിച്ചിരിക്കുന്നു',
+'enotif_subject_moved' => '{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ {{gender:$2|$2}} മാറ്റിയിരിക്കുന്നു',
+'enotif_subject_restored' => '{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ {{gender:$2|$2}} പുനഃസ്ഥാപിച്ചിരിക്കുന്നു',
+'enotif_subject_changed' => '{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താളിൽ {{gender:$2|$2}} മാറ്റം വരുത്തിയിരിക്കുന്നു',
+'enotif_body_intro_deleted' => '{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ $PAGEEDITDATE-നു {{gender:$2|$2}} മായ്ച്ചിരിക്കുന്നു, ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിനായി $3 കാണുക.',
+'enotif_body_intro_created' => '{{SITENAME}} സംരംഭത്തിൽ $1 എന്ന താൾ $PAGEEDITDATE-നു {{gender:$2|$2}} സൃഷ്ടിച്ചിരിക്കുന്നു, ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിനായി $3 കാണുക.',
+'enotif_body_intro_moved' => '{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ $PAGEEDITDATE-നു {{gender:$2|$2}} മാറ്റിയിരിക്കുന്നു, ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിനായി $3 കാണുക.',
+'enotif_body_intro_restored' => '{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താൾ $PAGEEDITDATE-നു {{gender:$2|$2}} പുനഃസ്ഥാപിച്ചിരിക്കുന്നു, ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിനായി $3 കാണുക.',
+'enotif_body_intro_changed' => '{{SITENAME}} സംരംഭത്തിലെ $1 എന്ന താളിൽ $PAGEEDITDATE-നു {{gender:$2|$2}} മാറ്റം വരുത്തിയിരിക്കുന്നു, ഇപ്പോഴത്തെ നാൾപ്പതിപ്പിനായി $3 കാണുക.',
 'enotif_lastvisited' => 'താങ്കളുടെ അവസാന സന്ദർശനത്തിനു ശേഷമുണ്ടായ മാറ്റങ്ങൾ കാണുവാൻ  $1 സന്ദർശിക്കുക.',
 'enotif_lastdiff' => 'ഈ മാറ്റം ദർശിക്കാൻ $1 കാണുക.',
 'enotif_anon_editor' => 'അജ്ഞാത ഉപയോക്താവ് $1',
 'enotif_body' => 'പ്രിയ $WATCHINGUSERNAME,
 
+$PAGEINTRO $NEWPAGE
 
 {{SITENAME}} സം‌രംഭത്തിലെ $PAGETITLE എന്ന താൾ $PAGEEDITDATE-ൽ $PAGEEDITOR എന്ന ഉപയോക്താവ് $CHANGEDORCREATED, ഇപ്പോഴുള്ള പതിപ്പിനായി $PAGETITLE_URL കാണുക.
 
@@ -2353,8 +2375,7 @@ $NEWPAGE
 മെയിൽ: $PAGEEDITOR_EMAIL
 വിക്കി: $PAGEEDITOR_WIKI
 
-താങ്കൾ ഈ താൾ സന്ദർശിക്കുന്നില്ലങ്കിൽ മറ്റ് അറിയിപ്പുകൾ ഒന്നുമുണ്ടാകുന്നതല്ല.
-ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക സന്ദർശിച്ചും ഉൾപ്പെട്ട താളുകളിലെ അറിയിപ്പ് മുദ്രകൾ താങ്കൾക്ക് പുനഃക്രമീകരിക്കാവുന്നതാണ്‌.
+താങ്കൾ ഈ താൾ സന്ദർശിക്കുന്നില്ലങ്കിൽ മറ്റ് അറിയിപ്പുകൾ ഒന്നുമുണ്ടാകുന്നതല്ല. ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക സന്ദർശിച്ചും ഉൾപ്പെട്ട താളുകളിലെ അറിയിപ്പ് മുദ്രകൾ താങ്കൾക്ക് പുനഃക്രമീകരിക്കാവുന്നതാണ്‌.
              താങ്കളുടെ {{SITENAME}} സുഹൃദ് അറിയിപ്പ് സജ്ജീകരണം
 
 --
@@ -2517,7 +2538,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|ഒരു പതിപ്പ്|$1 പതിപ്പുകൾ}} പുനഃസ്ഥാപിച്ചിരിക്കുന്നു',
 'undeletedrevisions-files' => '{{PLURAL:$1|ഒരു പതിപ്പും|$1 പതിപ്പുകളും}} {{PLURAL:$2|ഒരു പ്രമാണവും|$2 പ്രമാണങ്ങളും}} പുനഃസ്ഥാപിച്ചിരിക്കുന്നു',
 'undeletedfiles' => '{{PLURAL:$1|ഒരു പ്രമാണം|$1 പ്രമാണങ്ങൾ}} പുനഃസ്ഥാപിച്ചു',
-'cannotundelete' => 'മായ്ക്കൽ തിരസ്ക്കരിക്കാനുള്ള ശ്രമം പരാജയപ്പെട്ടു. മറ്റാരെങ്കിലും ഇതിനു മുൻപ് മായ്ക്കൽ തിരസ്ക്കരിച്ചിരിക്കാം.',
+'cannotundelete' => 'മായ്ക്കൽ തിരസ്കരണം പരാജയപ്പെട്ടു:
+$1',
 'undeletedpage' => "'''$1 പുനഃസ്ഥാപിച്ചിരിക്കുന്നു'''
 
 പുതിയതായി നടന്ന ഒഴിവാക്കലുകളുടേയും പുനഃസ്ഥാപനങ്ങളുടേയും വിവരങ്ങൾ കാണാൻ [[Special:Log/delete|മായ്ക്കൽ ലോഗ്]] കാണുക.",
@@ -2548,9 +2570,9 @@ $1',
 'blanknamespace' => '(മുഖ്യം)',
 
 # Contributions
-'contributions' => 'ഉപയോക്താവിന്റെ സംഭാവനകൾ',
+'contributions' => '{{GENDER:$1|ഉപയോക്താവിന്റെ}} സംഭാവനകൾ',
 'contributions-title' => '$1 എന്ന ഉപയോക്താവിന്റെ സംഭാവനകൾ',
-'mycontris' => 'à´\8eà´¨àµ\8dà´±àµ\86 à´¸à´\82ഭാവനà´\95ൾ',
+'mycontris' => 'സംഭാവനകൾ',
 'contribsub2' => '$1 എന്ന ഉപയോക്താവിന്റെ $2.',
 'nocontribs' => 'ഈ മാനദണ്ഡങ്ങളുമായി യോജിക്കുന്ന മാറ്റങ്ങൾ ഒന്നും കണ്ടില്ല.',
 'uctop' => '(അവസാനത്തെ തിരുത്തൽ)',
@@ -2590,7 +2612,7 @@ $1',
 'whatlinkshere-hideredirs' => 'തിരിച്ചുവിടലുകൾ $1',
 'whatlinkshere-hidetrans' => 'ഉൾപ്പെടുത്തലുകൾ $1',
 'whatlinkshere-hidelinks' => 'കണ്ണികൾ $1',
-'whatlinkshere-hideimages' => 'à´\9aà´¿à´¤àµ\8dà´°à´\99àµ\8dà´\99ളിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\8d $1 à´\95à´£àµ\8dണിà´\95ൾ',
+'whatlinkshere-hideimages' => 'à´ªàµ\8dരമാണà´\99àµ\8dà´\99ളിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\81à´³àµ\8dà´³ à´\95à´£àµ\8dണിà´\95ൾ $1',
 'whatlinkshere-filters' => 'അരിപ്പകൾ',
 
 # Block/unblock
@@ -2823,6 +2845,7 @@ $1',
 'immobile-target-namespace-iw' => 'അന്തർവിക്കി കണ്ണി താൾ മാറ്റാനുള്ള സാധുവായ ലക്ഷ്യമല്ല.',
 'immobile-source-page' => 'ഈ താൾ മാറ്റാൻ സാദ്ധ്യമല്ല',
 'immobile-target-page' => 'ലക്ഷ്യമാക്കിയ തലക്കെട്ടിലേക്ക് മാറ്റാൻ സാധിക്കില്ല.',
+'bad-target-model' => 'ആഗ്രഹിക്കുന്ന ലക്ഷ്യം മറ്റൊരു ഉള്ളടക്ക മാതൃകയാണ് ഉപയോഗിക്കുന്നത്. $1 എന്നതിനെ $2 ആക്കി മാറ്റാൻ കഴിയില്ല.',
 'imagenocrossnamespace' => 'പ്രമാണം അതിനായി അല്ലാത്ത നാമമേഖലയിലേയ്ക്ക് മാറ്റാൻ കഴിയില്ല',
 'nonfile-cannot-move-to-file' => 'പ്രമാണമല്ലാത്തവ പ്രമാണം നാമമേഖലയിലേയ്ക്ക് മാറ്റാൻ കഴിയില്ല.',
 'imagetypemismatch' => 'പുതിയ പ്രമാണത്തിന്റെ എക്സ്റ്റെൻഷൻ അതിന്റെ തരവുമായി ഒത്തുപോകുന്നില്ല.',
@@ -2950,7 +2973,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണം',
-'javascripttest-disabled' => 'ഈ വിക്കിയിൽ ഈ പ്രക്രിയ സജ്ജമാക്കിയിട്ടില്ല.',
 'javascripttest-title' => '$1 പരീക്ഷണങ്ങൾ നടക്കുന്നുണ്ട്',
 'javascripttest-pagetext-noframework' => 'ഈ താൾ ജാവാസ്ക്രിപ്റ്റ് പരീക്ഷണങ്ങൾ നടത്താനായി മാറ്റിവെച്ചിരിക്കുന്നതാണ്.',
 'javascripttest-pagetext-unknownframework' => 'അപരിചിതമായ പരീക്ഷണ ചട്ടക്കൂട് "$1".',
@@ -3080,6 +3102,7 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" എന്ന താളിന്റെ വിവരങ്ങൾ',
+'pageinfo-not-current' => 'ക്ഷമിക്കുക, പഴയ നാൾപ്പതിപ്പുകളിൽ ഈ വിവരം പ്രദർശിപ്പിക്കുക അസാദ്ധ്യമാണ്.',
 'pageinfo-header-basic' => 'അടിസ്ഥാനവിവരങ്ങൾ',
 'pageinfo-header-edits' => 'തിരുത്തൽചരിത്രം',
 'pageinfo-header-restrictions' => 'സംരക്ഷണം',
@@ -3088,6 +3111,7 @@ $1',
 'pageinfo-default-sort' => 'സ്വതേയുള്ള ക്രമപ്പെടുത്തൽ ചാവി',
 'pageinfo-length' => 'താളിന്റെ നീളം (ബൈറ്റിൽ)',
 'pageinfo-article-id' => 'താളിന്റെ ഐ.ഡി.',
+'pageinfo-language' => 'താളിന്റെ ഉള്ളടക്കത്തിന്റെ ഭാഷ',
 'pageinfo-robot-policy' => 'തിരച്ചിൽ പ്രവർത്തനത്തിന്റെ സ്ഥിതി',
 'pageinfo-robot-index' => 'സൂചികാവത്കരിക്കാവുന്നത്',
 'pageinfo-robot-noindex' => 'സൂചികാവത്കരിക്കാനാവാത്തത്',
@@ -3099,15 +3123,22 @@ $1',
 'pageinfo-firstuser' => 'താളിന്റെ നിർമ്മാതാവ്',
 'pageinfo-firsttime' => 'താൾ നിർമ്മിച്ച ദിവസം',
 'pageinfo-lastuser' => 'ഏറ്റവും പുതിയ രചയിതാവ്',
-'pageinfo-lasttime' => 'അവസാനത്തെ തിരുത്തുനടന്ന ദിവസം',
+'pageinfo-lasttime' => 'അവസാനത്തെ തിരുത്തു നടന്ന ദിവസം',
 'pageinfo-edits' => 'മൊത്തം തിരുത്തുകളുടെ എണ്ണം',
 'pageinfo-authors' => 'ആകെ വ്യത്യസ്തരചയിതാക്കളുടെ എണ്ണം',
 'pageinfo-recent-edits' => 'സമീപകാലത്തെ തിരുത്തുകൾ (കഴിഞ്ഞ $1 കാലയളവിനുള്ളിൽ)',
 'pageinfo-recent-authors' => 'സമീപകാലത്തെ വ്യത്യസ്തരചയിതാക്കളുടെ എണ്ണം',
-'pageinfo-restriction' => 'താൾ സംരക്ഷണം ($1)',
 'pageinfo-magic-words' => 'മാന്ത്രിക{{PLURAL:$1|വാക്ക്|വാക്കുകൾ}} ($1)',
 'pageinfo-hidden-categories' => 'മറഞ്ഞിരിക്കുന്ന {{PLURAL:$1|വർഗ്ഗം|വർഗ്ഗങ്ങൾ}} ($1)',
 'pageinfo-templates' => 'ഉൾപ്പെടുത്തിയിട്ടുള്ള {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}} ($1)',
+'pageinfo-toolboxlink' => 'താളിന്റെ വിവരങ്ങൾ',
+'pageinfo-redirectsto' => 'തിരിച്ചുവിടുന്നു',
+'pageinfo-redirectsto-info' => 'വിവരം',
+'pageinfo-contentpage' => 'ഉള്ളടക്ക താളായി എണ്ണുന്നവ',
+'pageinfo-contentpage-yes' => 'അതെ',
+'pageinfo-protect-cascading' => 'സംരക്ഷണങ്ങൾ ഇവിടെ നിന്ന് നിർഝരിതപ്പെടുത്തുന്നു',
+'pageinfo-protect-cascading-yes' => 'അതെ',
+'pageinfo-protect-cascading-from' => 'സംരക്ഷണങ്ങൾ നിർഝരിതപ്പെടുത്തുന്നത്',
 
 # Skin names
 'skinname-standard' => 'സാർവത്രികം',
@@ -3130,6 +3161,8 @@ $1',
 'markedaspatrollederror' => 'റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക സാധ്യമല്ല',
 'markedaspatrollederrortext' => 'റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തേണ്ട നാൾപ്പതിപ്പ താങ്കൾ വ്യക്തമാക്കേണ്ടതാണ്.',
 'markedaspatrollederror-noautopatrol' => 'സ്വന്തം മാറ്റങ്ങൾ റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക അനുവദനീയമല്ല.',
+'markedaspatrollednotify' => '$1 എന്ന താളിൽ നടത്തിയ ഈ മാറ്റം റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തിയിരിക്കുന്നു.',
+'markedaspatrollederrornotify' => 'റോന്തുചുറ്റിയതെന്ന് അടയാളപ്പെടുത്തൽ പരാജയപ്പെട്ടു.',
 
 # Patrol log
 'patrol-log-page' => 'റോന്തുചുറ്റൽ പ്രവർത്തനരേഖ',
@@ -3164,7 +3197,7 @@ $1',
 'svg-long-desc-animated' => 'ചലിക്കുന്ന എസ്.വി.ജി. പ്രമാണം, നാമമാത്രമായ $1 × $2 പിക്സലുകൾ, പ്രമാണത്തിന്റെ വലിപ്പം: $3',
 'show-big-image' => 'പൂർണ്ണ റെസലൂഷൻ',
 'show-big-image-preview' => 'ഈ പ്രിവ്യൂവിന്റെ വലിപ്പം: $1.',
-'show-big-image-other' => 'മറàµ\8dà´±àµ\8d {{PLURAL:$2|à´±àµ\86സലàµ\82ഷൻ|à´±àµ\86സലàµ\82à´·à´¨àµ\81à´\95ൾ}}: $1.',
+'show-big-image-other' => 'à´\95àµ\82à´\9fàµ\81തൽ {{PLURAL:$2|à´±àµ\86സലàµ\82ഷൻ}}: $1.',
 'show-big-image-size' => '$1 × $2 പിക്സലുകൾ',
 'file-info-gif-looped' => 'പുനരാവർത്തിതം',
 'file-info-gif-frames' => '{{PLURAL:$1|ഒരു ചട്ടം|$1 ചട്ടങ്ങൾ}}',
@@ -3196,6 +3229,7 @@ $1',
 'hours' => '{{PLURAL:$1|ഒരു മണിക്കൂർ|$1 മണിക്കൂർ}}',
 'days' => '{{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസം}}',
 'ago' => '$1 മുമ്പ്',
+'just-now' => 'ഇപ്പോൾ',
 
 # Bad image list
 'bad_image_list' => 'എഴുത്ത് രീതി താഴെ കൊടുത്തിരിക്കുന്നു:
@@ -3248,7 +3282,7 @@ $1',
 'exif-software' => 'ഉപയോഗിച്ച സോഫ്റ്റ്‌വെയർ',
 'exif-artist' => 'ഛായാഗ്രാഹകൻ',
 'exif-copyright' => 'പകർപ്പവകാശ ഉടമ',
-'exif-exifversion' => 'Exif പതിപ്പ്',
+'exif-exifversion' => 'എക്സിഫ് (Exif) പതിപ്പ്',
 'exif-flashpixversion' => 'പിന്തുണയുള്ള ഫ്ലാഷ്‌‌പിക്സ് പതിപ്പ്',
 'exif-colorspace' => 'കളർ സ്പേസ്',
 'exif-componentsconfiguration' => 'ഓരോ ഘടകത്തിന്റേയും അർത്ഥം',
@@ -3308,13 +3342,13 @@ $1',
 'exif-gpslongitude' => 'രേഖാംശം',
 'exif-gpsaltituderef' => 'ഉന്നതിയുടെ അവലംബം',
 'exif-gpsaltitude' => 'ഉന്നതി',
-'exif-gpstimestamp' => 'GPS സമയം (ആറ്റോമിക് ക്ലോക്ക്)',
+'exif-gpstimestamp' => 'ജി.പി.എസ്. സമയം (ആറ്റോമിക് ഘടികാരം)',
 'exif-gpssatellites' => 'അളക്കാൻ ഉപയോഗിച്ച കൃത്രിമോപഗ്രഹങ്ങൾ',
 'exif-gpsstatus' => 'സ്വീകരണിയുടെ സ്ഥിതി',
 'exif-gpsmeasuremode' => 'അളവെടുക്കൽ രീതി',
 'exif-gpsdop' => 'അളവുകളുടെ കൃത്യത',
 'exif-gpsspeedref' => 'വേഗതയുടെ ഏകകം',
-'exif-gpsspeed' => 'GPS പരിഗ്രാഹിയുടെ ഗതിവേഗം (Speed of GPS receiver)',
+'exif-gpsspeed' => 'ജി.പി.എസ്. പരിഗ്രാഹിയുടെ ഗതിവേഗം',
 'exif-gpstrackref' => 'ചലനത്തിന്റെ ദിശയ്ക്കുള്ള അവലംബം',
 'exif-gpstrack' => 'ചലനത്തിന്റെ ദിശ',
 'exif-gpsimgdirectionref' => 'ചിത്രത്തിന്റെ ദിശയ്ക്കുള്ള അവലംബം',
@@ -3329,8 +3363,8 @@ $1',
 'exif-gpsdestdistanceref' => 'ലക്ഷ്യം വച്ചതിലേയ്ക്കുള്ള ദൂരത്തിനുള്ള അവലംബം',
 'exif-gpsdestdistance' => 'ലക്ഷ്യം വച്ചതിലേയ്ക്കുള്ള ദൂരം',
 'exif-gpsprocessingmethod' => 'ജി.പി.എസ്. പ്രക്രിയയുടെ പേര്',
-'exif-gpsareainformation' => 'GPS പ്രദേശത്തിന്റെ പേര്‌',
-'exif-gpsdatestamp' => 'GPS തീയതി',
+'exif-gpsareainformation' => 'ജി.പി.എസ്. പ്രദേശത്തിന്റെ പേര്‌',
+'exif-gpsdatestamp' => 'ജി.പി.എസ്. തീയതി',
 'exif-gpsdifferential' => 'ജി.പി.എസ്. വ്യത്യാസം ശരിയാക്കൽ',
 'exif-jpegfilecomment' => 'ജെപെഗ് പ്രമാണക്കുറിപ്പ്',
 'exif-keywords' => 'അടയാളവാക്കുകൾ',
@@ -3362,7 +3396,7 @@ $1',
 'exif-languagecode' => 'ഭാഷ',
 'exif-iimversion' => 'ഐ.ഐ.എം. പതിപ്പ്',
 'exif-iimcategory' => 'വർഗ്ഗം',
-'exif-iimsupplementalcategory' => 'പൂരക വർഗ്ഗങ്ങൾ',
+'exif-iimsupplementalcategory' => 'പൂരകവർഗ്ഗങ്ങൾ',
 'exif-datetimeexpires' => 'ഇതിനു ശേഷമുപയോഗിക്കരുത്',
 'exif-datetimereleased' => 'പ്രസിദ്ധീകരിച്ചത്',
 'exif-originaltransmissionref' => 'യഥാർത്ഥ പ്രസരണ പ്രദേശത്തിന്റെ കോഡ്',
@@ -3420,6 +3454,8 @@ $1',
 'exif-planarconfiguration-1' => 'ചങ്കി ഫോർമാറ്റ്',
 'exif-planarconfiguration-2' => 'പ്ലാനാർ ഫോർമാറ്റ്',
 
+'exif-colorspace-65535' => 'അളവ് നിർണ്ണയിക്കാത്ത',
+
 'exif-componentsconfiguration-0' => 'നിലവിലില്ല',
 
 'exif-exposureprogram-0' => 'നിർവചിക്കപ്പെട്ടിട്ടില്ല',
@@ -3427,10 +3463,10 @@ $1',
 'exif-exposureprogram-2' => 'സാധാരണ പ്രോഗ്രാം',
 'exif-exposureprogram-3' => 'അപ്പെർച്ചർ മുൻഗണന',
 'exif-exposureprogram-4' => 'ഷട്ടർ മുൻഗണന',
-'exif-exposureprogram-5' => 'ക്രിയേറ്റീവ് പ്രോഗ്രാം (biased toward depth of field)',
-'exif-exposureprogram-6' => 'ആക്ഷൻ പ്രോഗ്രാം (biased toward fast shutter speed)',
-'exif-exposureprogram-7' => 'പോർട്ടറൈറ്റ് മോഡ് (for closeup photos with the background out of focus)',
-'exif-exposureprogram-8' => 'ലാൻഡ് സ്കേപ്പ് മോഡ് (for landscape photos with the background in focus)',
+'exif-exposureprogram-5' => 'ക്രിയേറ്റീവ് പ്രോഗ്രാം (മണ്ഡലത്തിന്റെ ആഴം കാണിക്കാൻ അനുയോജ്യം)',
+'exif-exposureprogram-6' => 'ആക്ഷൻ പ്രോഗ്രാം (വേഗത്തിലുള്ള ഷട്ടർ വേഗത്തിന് അനുയോജ്യം)',
+'exif-exposureprogram-7' => 'പോർട്ടറൈറ്റ് മോഡ് (പശ്ചാത്തലം ഫോക്കസിനു വെളിയിലുള്ള സമീപ ഫോട്ടോകൾക്ക്)',
+'exif-exposureprogram-8' => 'ലാൻഡ് സ്കേപ്പ് മോഡ് (പശ്ചാത്തലവും ഫോക്കസിലുള്ള വിശാല ഫോട്ടോകൾക്ക്)',
 
 'exif-subjectdistance-value' => '$1 മീറ്റർ',
 
@@ -3452,9 +3488,9 @@ $1',
 'exif-lightsource-10' => 'മൂടിക്കെട്ടിയ കാലാവസ്ഥ',
 'exif-lightsource-11' => 'തണൽ',
 'exif-lightsource-12' => 'പകൽവെളിച്ച ഫ്ലൂറോസെന്റ് (D 5700 – 7100K)',
-'exif-lightsource-13' => 'à´ªà´\95ൽ à´µàµ\86à´³àµ\8dà´³ ഫ്ലൂറോസെന്റ് (N 4600 – 5400K)',
-'exif-lightsource-14' => 'à´¶àµ\80à´¤ à´µàµ\86à´³àµ\8dà´³ ഫ്ലൂറോസെന്റ് (W 3900 – 4500K)',
-'exif-lightsource-15' => 'à´µàµ\86à´³àµ\8dà´³ ഫ്ലൂറോസെന്റ് (WW 3200 – 3700K)',
+'exif-lightsource-13' => 'à´ªà´\95ൽ à´µàµ\86à´³àµ\81à´ªàµ\8dà´ªàµ\8d ഫ്ലൂറോസെന്റ് (N 4600 – 5400K)',
+'exif-lightsource-14' => 'à´¶àµ\80à´¤ à´µàµ\86à´³àµ\81à´ªàµ\8dà´ªàµ\8d ഫ്ലൂറോസെന്റ് (W 3900 – 4500K)',
+'exif-lightsource-15' => 'à´µàµ\86à´³àµ\81à´ªàµ\8dà´ªàµ\8d ഫ്ലൂറോസെന്റ് (WW 3200 – 3700K)',
 'exif-lightsource-17' => 'മാതൃകാ വെളിച്ചം A',
 'exif-lightsource-18' => 'മാതൃകാ വെളിച്ചം B',
 'exif-lightsource-19' => 'മാതൃകാ വെളിച്ചം C',
@@ -3676,6 +3712,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[അന്തർവിക്കി ഉൾപ്പെടുത്തൽ സജ്ജമല്ല]',
 'scarytranscludefailed' => '[$1-നു ഫലകം കണ്ടുപിടിക്കാൻ പറ്റിയില്ല]',
+'scarytranscludefailed-httpstatus' => '[$1-നു ഫലകം എടുക്കാൻ കഴിഞ്ഞില്ല: എച്ച്.റ്റി.റ്റി.പി. $2]',
 'scarytranscludetoolong' => '[വളരെ നീളക്കൂടുതലുള്ള യൂ.ആർ.എൽ.]',
 
 # Delete conflict
@@ -3798,6 +3835,7 @@ $5
 'version-license' => 'അനുമതി',
 'version-poweredby-credits' => "ഈ വിക്കി പ്രവർത്തിക്കാൻ '''[//www.mediawiki.org/ മീഡിയവിക്കി]''' ഉപയോഗിക്കുന്നു. പകർപ്പവകാശം © 2001-$1 $2.",
 'version-poweredby-others' => 'മറ്റുള്ളവർ',
+'version-credits-summary' => '[[Special:Version|മീഡിയവിക്കിയ്ക്ക്]] നൽകിയ സംഭാവനകളുടെ പേരിൽ താഴെക്കൊടുക്കുന്നവർക്ക് ഞങ്ങൾ നന്ദി പറയുന്നു.',
 'version-license-info' => 'മീഡിയവിക്കി ഒരു സ്വതന്ത്ര സോഫ്റ്റ്‌വേറാണ്; സ്വതന്ത്ര സോഫ്റ്റ്‌വേർ ഫൗണ്ടേഷൻ പ്രസിദ്ധീകരിച്ചിട്ടുള്ള ഗ്നു സാർവ്വജനിക അനുവാദപത്രത്തിന്റെ പതിപ്പ് 2 പ്രകാരമോ, അല്ലെങ്കിൽ (താങ്കളുടെ ഇച്ഛാനുസരണം) പിന്നീട് പ്രസിദ്ധീകരിച്ച ഏതെങ്കിലും പതിപ്പ് പ്രകാരമോ താങ്കൾക്കിത് പുനർവിതരണം ചെയ്യാനും ഒപ്പം/അല്ലെങ്കിൽ മാറ്റങ്ങൾ വരുത്താനും സാധിക്കുന്നതാണ്.
 
 മീഡിയവിക്കി താങ്കൾക്കുപകരിക്കുമെന്ന പ്രതീക്ഷയോടെയാണ് വിതരണം ചെയ്യുന്നത്, പക്ഷേ യാതൊരു ഗുണമേന്മോത്തരവാദിത്തവും വഹിക്കുന്നില്ല; വ്യാപാരയോഗ്യമെന്നോ പ്രത്യേക ഉപയോഗത്തിന് അനുയോജ്യമെന്നോ ഉള്ള യാതൊരു ഗുണമേന്മോത്തരവാദിത്തവും ഇത് ഉൾക്കൊള്ളുന്നില്ല. കൂടുതൽ വിവരങ്ങൾക്ക് ഗ്നു സാർവ്വജനിക അനുവാദപത്രം കാണുക.
@@ -3821,13 +3859,13 @@ $5
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'ഒരേ പ്രമാണത്തിന്റെ പലപകർപ്പുകളുണ്ടോയെന്നു തിരയുക',
-'fileduplicatesearch-summary' => 'ഒരേ പ്രമാണം തന്നെ വിവിധപേരിലുണ്ടോയെന്നു ഹാഷ് വാല്യൂവധിഷ്ഠിതമായി തിരയുക.',
-'fileduplicatesearch-legend' => 'à´\85പരനàµ\86 തിരയുക',
+'fileduplicatesearch-summary' => 'ഒരേ പ്രമാണം തന്നെ വിവിധ പേരിലുണ്ടോയെന്നു ഹാഷ് വാല്യൂവധിഷ്ഠിതമായി തിരയുക.',
+'fileduplicatesearch-legend' => 'à´ªà´\95ർപàµ\8dà´ªàµ\81à´£àµ\8dà´\9fàµ\8bà´¯àµ\86à´¨àµ\8dà´¨àµ\8d തിരയുക',
 'fileduplicatesearch-filename' => 'പ്രമാണത്തിന്റെ പേര്:',
 'fileduplicatesearch-submit' => 'തിരയൂ',
 'fileduplicatesearch-info' => '$1 × $2 ബിന്ദു<br /> പ്രമാണത്തിന്റെ വലിപ്പം: $3<br />മൈം തരം: $4',
-'fileduplicatesearch-result-1' => '"$1" à´\8eà´¨àµ\8dà´¨ à´ªàµ\8dരമാണതàµ\8dതിനàµ\8d à´¸à´¦àµ\83à´¶ à´\85പരനില്ല.',
-'fileduplicatesearch-result-n' => '"$1" à´\8eà´¨àµ\8dà´¨ à´ªàµ\8dരമാണതàµ\8dതിനàµ\8d {{PLURAL:$2|à´\92à´°àµ\81 à´¸à´¦àµ\83à´¶ à´\85പരൻ|$2 à´¸à´¦àµ\83à´¶ à´\85പരർ}} ഉണ്ട്.',
+'fileduplicatesearch-result-1' => '"$1" à´\8eà´¨àµ\8dà´¨ à´ªàµ\8dരമാണതàµ\8dതിനàµ\8d à´¸à´¦àµ\83à´¶ à´ªà´\95ർപàµ\8dà´ªàµ\8d à´\87ല്ല.',
+'fileduplicatesearch-result-n' => '"$1" à´\8eà´¨àµ\8dà´¨ à´ªàµ\8dരമാണതàµ\8dതിനàµ\8d {{PLURAL:$2|à´\92à´°àµ\81 à´¸à´¦àµ\83à´¶ à´ªà´\95ർപàµ\8dà´ªàµ\8d|$2 à´¸à´¦àµ\83à´¶ à´ªà´\95ർപàµ\8dà´ªàµ\81à´\95ൾ}} ഉണ്ട്.',
 'fileduplicatesearch-noresults' => '"$1" എന്ന പേരിൽ ഒരു പ്രമാണവും കണ്ടെത്താനായില്ല.',
 
 # Special:SpecialPages
@@ -3940,15 +3978,15 @@ $5
 'logentry-move-move_redir-noredirect' => '$1, $3 എന്ന താൾ $4 എന്ന താളിനുമുകളിലേയ്ക്ക്, തിരിച്ചുവിടൽ ഇല്ലാതെ മാറ്റിയിരിക്കുന്നു',
 'logentry-patrol-patrol' => '$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി $1 അടയാളപ്പെടുത്തിയിരിക്കുന്നു',
 'logentry-patrol-patrol-auto' => '$3 എന്ന താളിന്റെ $4 എന്ന നാൾപ്പതിപ്പ് റോന്തുചുറ്റിയതായി $1 സ്വതേ അടയാളപ്പെടുത്തിയിരിക്കുന്നു',
-'logentry-newusers-newusers' => '$1 à´\92à´°àµ\81 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´\82à´\97à´¤àµ\8dà´µà´\82 à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\9aàµ\8dà´\9aിരിക്കുന്നു',
-'logentry-newusers-create' => '$1 à´\92à´°àµ\81 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´\82à´\97à´¤àµ\8dà´µà´\82 à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\9aàµ\8dà´\9aിരിക്കുന്നു',
+'logentry-newusers-newusers' => '$1 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´\82à´\97à´¤àµ\8dà´µà´\82 à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fിരിക്കുന്നു',
+'logentry-newusers-create' => '$1 à´\8eà´¨àµ\8dà´¨ à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\85à´\82à´\97à´¤àµ\8dà´µà´\82 à´¸àµ\83à´·àµ\8dà´\9fà´¿à´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fിരിക്കുന്നു',
 'logentry-newusers-create2' => '$3 എന്ന ഉപയോക്തൃ അംഗത്വം $1 സൃഷ്ടിച്ചിരിക്കുന്നു',
 'logentry-newusers-autocreate' => '$1 എന്ന അംഗത്വം സ്വയം സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു',
 'newuserlog-byemail' => 'രഹസ്യവാക്ക് ഇ-മെയിൽ വഴി അയച്ചിരിക്കുന്നു',
 
 # Feedback
 'feedback-bugornote' => 'സാങ്കേതിക പ്രശ്നം എന്താണെന്ന് വിവരിച്ചെഴുതാൻ താങ്കൾ തയ്യാറാണെങ്കിൽ [$1 ബഗ് അറിയിക്കുക].
-à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¤à´¾à´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95àµ\8d à´¤à´¾à´´àµ\86 à´\8eà´³àµ\81à´ªàµ\8dപതàµ\8dതിനായി à´¨àµ½à´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´«àµ\8bà´\82 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95à´¾à´\82. à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\95àµ\81റിപàµ\8dà´ªàµ\8d "[$3 $2]" à´¤à´¾à´³à´¿àµ½, à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83നാമവàµ\81à´\82 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¬àµ\8dà´°àµ\97സറിനàµ\8dà´±àµ\86 à´ªàµ\87à´°àµ\8bà´\9fàµ\81à´\82 à´\95àµ\82à´\9fà´¿ ചേർക്കുന്നതായിരിക്കും.',
+à´\85à´²àµ\8dà´²àµ\86à´\99àµ\8dà´\95ിൽ à´¤à´¾à´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95àµ\8d à´¤à´¾à´´àµ\86 à´\8eà´³àµ\81à´ªàµ\8dപതàµ\8dതിനായി à´¨àµ½à´\95ിയിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´«àµ\8bà´\82 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95à´¾à´\82. à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\95àµ\81റിപàµ\8dà´ªàµ\8d "[$3 $2]" à´¤à´¾à´³à´¿àµ½, à´¤à´¾à´\99àµ\8dà´\95à´³àµ\81à´\9fàµ\86 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83നാമതàµ\8dതിനàµ\8dà´±àµ\86à´¯àµ\81à´\82 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ à´¬àµ\8dà´°àµ\97സറിനàµ\8dà´±àµ\86 à´ªàµ\87à´°à´¿à´¨àµ\8dà´±àµ\86à´¯àµ\81à´\82 à´\92à´ªàµ\8dà´ªà´\82 ചേർക്കുന്നതായിരിക്കും.',
 'feedback-subject' => 'വിഷയം:',
 'feedback-message' => 'സന്ദേശം:',
 'feedback-cancel' => 'റദ്ദാക്കുക',
@@ -3962,6 +4000,10 @@ $5
 'feedback-bugcheck' => 'കൊള്ളാം! [$1 അറിയാവുന്ന ബഗുകളിൽ] ഒന്നല്ല എന്ന് ഒന്നു പരിശോധിച്ചേക്കുക.',
 'feedback-bugnew' => 'ഞാൻ പരിശോധിച്ചു. പുതിയൊരു ബഗ് ചേർക്കുക',
 
+# Search suggestions
+'searchsuggest-search' => 'തിരയുക',
+'searchsuggest-containing' => 'ഉൾപ്പെടുന്നവ...',
+
 # API errors
 'api-error-badaccess-groups' => 'ഈ വിക്കിയിൽ പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യാൻ താങ്കൾക്കനുവാദമില്ല.',
 'api-error-badtoken' => 'ആന്തരിക പിഴവ്: ഗുണകരമല്ലാത്ത ചീട്ട്.',
@@ -3969,7 +4011,7 @@ $5
 'api-error-duplicate' => 'വിക്കിയിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|[$2 മറ്റൊരു പ്രമാണം]|[$2 മറ്റ് പ്രമാണങ്ങൾ]}} മുമ്പേയുണ്ട്.',
 'api-error-duplicate-archive' => 'സൈറ്റിൽ ഇതേ ഉള്ളടക്കമുള്ള {{PLURAL:$1|[$2 മറ്റൊരു പ്രമാണം]|[$2 മറ്റ് പ്രമാണങ്ങൾ]}} ഉണ്ടായിരുന്നു, പക്ഷേ {{PLURAL:$1|അത്|അവ}} മായ്ക്കപ്പെട്ടിട്ടുണ്ട്.',
 'api-error-duplicate-archive-popup-title' => 'പകർപ്പ് {{PLURAL:$1|പ്രമാണം|പ്രമാണങ്ങൾ}} മുമ്പേതന്നെ മായ്ക്കപ്പെട്ടു',
-'api-error-duplicate-popup-title' => 'à´\85പര{{PLURAL:$1|പ്രമാണം|പ്രമാണങ്ങൾ}}',
+'api-error-duplicate-popup-title' => 'à´ªà´\95ർപàµ\8dà´ªàµ\8d {{PLURAL:$1|പ്രമാണം|പ്രമാണങ്ങൾ}}',
 'api-error-empty-file' => 'താങ്കൾ സമർപ്പിച്ച പ്രമാണം ശൂന്യമാണ്.',
 'api-error-emptypage' => 'ശൂന്യമായ പുതിയ താളുകൾ സൃഷ്ടിക്കുന്നത് അനുവദിക്കുന്നില്ല.',
 'api-error-fetchfileerror' => 'ആന്തരിക പിഴവ്: പ്രമാണം ശേഖരിച്ചുകൊണ്ടിരുന്നപ്പോൾ എന്തോ പിഴവുണ്ടായി.',
@@ -4014,4 +4056,6 @@ $5
 'duration-centuries' => '{{PLURAL:$1|ഒരു നൂറ്റാണ്ട്|$1 നൂറ്റാണ്ട്}}',
 'duration-millennia' => '{{PLURAL:$1|ഒരു സഹസ്രാബ്ദം|$1 സഹസ്രാബ്ദം}}',
 
+# Unknown messages
+'svg-long-error' => 'അസാധുവായ എസ്.വി.ജി. പ്രമാണം: $1',
 );
index 1ddb365..4c8bcb4 100644 (file)
@@ -67,7 +67,7 @@ $messages = array(
 'tog-nocache' => 'Вэб хөтөчийн хуудасны кешингийг болиулах',
 'tog-enotifwatchlistpages' => 'Миний хянах жагсаалт дахь хуудас өөрчлөгдсөн бол и-мэйл явуулах',
 'tog-enotifusertalkpages' => 'Миний хэлэлцүүлгийн хуудас өөрчлөгдөхөд и-мэйл явуулах',
-'tog-enotifminoredits' => 'Хуудсууд бага зэргээр засварлагдахад ч и-мэйл явуулах',
+'tog-enotifminoredits' => 'Хуудасны өнгөц өөрчлөлтийг мөн и-мейлээр явуул.',
 'tog-enotifrevealaddr' => 'Мэдэгдлийн и-мэйлд миний мэйл хаягийг илчлэх',
 'tog-shownumberswatching' => 'Харж буй хэрэглэгчдийн тоог үзүүлэх',
 'tog-oldsig' => 'Одоогийн гарын үсэг:',
@@ -90,7 +90,7 @@ $messages = array(
 
 'underline-always' => 'Байнга',
 'underline-never' => 'Хэзээ ч үгүй',
-'underline-default' => 'Вэб хөтөчийн анхны тохиргоо',
+'underline-default' => 'Вэб хөтөчийн үндсэн тохиргоо',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Засварлах талбарын фонт хэв маяг:',
@@ -175,8 +175,8 @@ $messages = array(
 'newwindow' => '(шинэ цонх нээгдэнэ)',
 'cancel' => 'Цуцлах',
 'moredotdotdot' => 'Дэлгэрэнгүй...',
-'mypage' => 'Ð\9cиний хуудас',
-'mytalk' => 'Ð\9cиний Ñ\8fÑ\80иа',
+'mypage' => 'Ð¥Ñ\8dÑ\80Ñ\8dглÑ\8dгÑ\87ийн хуудас',
+'mytalk' => 'Ð\9cиний Ñ\85Ñ\8dлÑ\8dлÑ\86үүлÑ\8dг',
 'anontalk' => 'Энэ IP-н яриа',
 'navigation' => 'Залуурдлага',
 'and' => '&#32;ба',
@@ -186,7 +186,6 @@ $messages = array(
 'qbbrowse' => 'Дэлгэх',
 'qbedit' => 'Засварлах',
 'qbpageoptions' => 'Энэ хуудас',
-'qbpageinfo' => 'Агуулга',
 'qbmyoptions' => 'Миний хуудсууд',
 'qbspecialpages' => 'Тусгай хуудсууд',
 'faq' => 'Тогтмол тавигддаг асуултууд',
@@ -199,7 +198,7 @@ $messages = array(
 'vector-action-protect' => 'Хамгаалах',
 'vector-action-undelete' => 'Үл устгах',
 'vector-action-unprotect' => 'Хамгаалалтаа солих',
-'vector-simplesearch-preference' => 'Хайлтын сайжруулсан саналыг идэвхижүүлэх (зөвхөн Вектор скин)',
+'vector-simplesearch-preference' => 'Хялбарчилсан хайлтын талбарыг идэвхижүүлэх (зөвхөн Вектор скин)',
 'vector-view-create' => 'Үүсгэх',
 'vector-view-edit' => 'Засварлах',
 'vector-view-history' => 'Түүхийг үзэх',
@@ -437,11 +436,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Та одоо гарлаа.'''
 
-Та ямар нэг хэрэглэгчийн бүртгэлгүйгээр {{SITENAME}}-г ашиглах боломжтой, эсвэл саяынхаа болон өөр хэрэглэгчийн бүртгэлээ ашиглан [[Special:UserLogin|дахин нэвтэрч]] болно.
+Та ямар нэг хэрэглэгчийн бүртгэлгүйгээр {{SITENAME}}-г ашиглах боломжтой, эсвэл саяынхаа болон өөр хэрэглэгчийн бүртгэлээ ашиглан <span class='plainlinks'>[$1 дахин нэвтэрч]</span> болно.
 Броузерийнхаа хийсвэр санах ойг цэвэрлэх хүртэл зарим нэг хуудсууд нь таны холбогдсон байдлаар харагдаж болзошгүйг анхааруулъя.",
-'welcomecreation' => '= $1, тавтай морилно уу! ==
-Та амжилттай бүртгэгдлээ.
-[[Special:Preferences|{{SITENAME}}-н тохиргоогоо]] өөрчлөхөө мартуузай.',
 'yourname' => 'Хэрэглэгчийн нэр:',
 'yourpassword' => 'Нууц үг:',
 'yourpasswordagain' => 'Нууц үгээ дахин оруулах:',
@@ -679,8 +675,8 @@ $2',
 'noarticletext' => 'Одоогийн байдлаар энэ хуудсанд текст алга.
 Та нэг бол энэ хуудасны нэрээр бусад хуудсуудад [[Special:Search/{{PAGENAME}}|хайлт хийх]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} холбоотой логуудад хайлт хийх],
 эсвэл [{{fullurl:{{FULLPAGENAME}}|action=edit}} энэ хуудсыг засварлаж болно]</span>.',
-'noarticletext-nopermission' => 'Ð\9eдоогийн Ð±Ð°Ð¹Ð´Ð»Ð°Ð°Ñ\80 Ñ\8dнÑ\8d хуудсанд текст алга.
-Та энэхүү [[Special:Search/{{PAGENAME}}|гарчигийг бусад хуудсуудаас хайх]],  эсвэл <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} холбогдох логуудаас хайж болно]</span>.',
+'noarticletext-nopermission' => 'Яг Ð¾Ð´Ð¾Ð¾Ð³Ð¾Ð¾Ñ\80 Ñ\83г хуудсанд текст алга.
+Та бусад хуудсан уг хуудасны [[Special:Search/{{PAGENAME}}| гарчигаар хайлт хийх]], эсвэл <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} холбоотой логоор хайлт]</span> хийж болно, гэхдээ танд уг хуудсыг үүсгэх зөвшөөрөл алга.',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" хэрэглэгчийн бүртгэл бүртгэгдээгүй байна. Та энэ хуудсыг үүсгэх/засварлах тухайгаа дахин тунгааж бодно уу.',
 'userpage-userdoesnotexist-view' => '"$1" гэсэн хэрэглэгч бүртгэгдээгүй байна.',
 'blocked-notice-logextract' => 'Энэхүү хэрэглэгч одоогоор түгжигдсэн байна.
@@ -1031,8 +1027,6 @@ $1",
 'search-interwiki-caption' => 'Ах дүү төслүүд',
 'search-interwiki-default' => '$1 үр дүн:',
 'search-interwiki-more' => '(илүү их)',
-'search-mwsuggest-enabled' => 'санаачлагатай',
-'search-mwsuggest-disabled' => 'санаачлага байхгүй',
 'search-relatedarticle' => 'Холбоотой',
 'mwsuggest-disable' => 'AJAX саналуудыг болиулах',
 'searcheverything-enable' => 'Бүх нэрний зайнуудад хайх',
@@ -1128,7 +1122,7 @@ $1",
 'timezoneregion-indian' => 'Энэтхэгийн далай',
 'timezoneregion-pacific' => 'Номхон далай',
 'allowemail' => 'Бусад хэрэглэгчдээс ирэх мэйлийг зөвшөөрөх',
-'prefs-searchoptions' => 'Хайх сонголтууд',
+'prefs-searchoptions' => 'Хайлт',
 'prefs-namespaces' => 'Нэрний зайнууд',
 'defaultns' => 'Үгүй бол эдгээр нэрний зайнуудад хайх:',
 'default' => 'анхны байдал',
@@ -1368,6 +1362,7 @@ $1 тэмдэгтээс богино байх ёстой.',
 'newsectionsummary' => '/* $1 */ шинэ хэсэг',
 'rc-enhanced-expand' => 'Дэлгэрэнгүй мэдээллийг үзүүлэх (ЖаваСкрипт хэрэглэгдэнэ)',
 'rc-enhanced-hide' => 'Дэлгэрэнгүй мэдээллийг нуух (ЖаваСкрипт хэрэглэгдэнэ)',
+'rc-old-title' => 'Анх өгсөн гарчиг нь "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Холбогдох өөрчлөлтүүд',
@@ -1558,6 +1553,31 @@ URL нь хүчинтэй, мөн түүн руу орж болж байгаа 
 'backend-fail-contenttype' => '"$1" дахь файлын агуулгын төрлийг таньж чадсангүй.',
 'backend-fail-usable' => '$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-release' => '$1 сервер дээрх түгжээг авч чадсангүй.',
+
+# ZipDirectoryReader
+'zip-file-open-error' => 'Файлыг зип шалгалт хийхэд алдаа гарлаа.',
+'zip-wrong-format' => 'Өгсөн файл зип файл биш байна.',
+'zip-bad' => 'Зип файлыг уншиж чадсангүй. Эвдэрсэн эсвэл унших боломжгүй файл байна.
+Аюулгүй байлыг хангасангүй.',
+'zip-unsupported' => 'MediaWiki -н дэмжигдсэн Зип файл биш тул уншиж болохгүй байна.
+Аюулгүй байдлыг хангасангүй.',
+
+# Special:UploadStash
+'uploadstash' => 'stash файл илгээх',
+'uploadstash-summary' => 'Уг хуудсанд вики-д нийтлээгүй боловч байршуулсан эсвэл байршуулж буй файлд нэвтрэх боломж олгож байна. Эдгээр байршуулсан эзнээс бусад хүнд харагдахгүй болно.',
+'uploadstash-errclear' => 'Файлыг цэвэрлэхэд саад учирлаа.',
+'uploadstash-refresh' => 'Харагдаж буй файлуудыг сэргээн харах',
+
 # img_auth script messages
 'img-auth-accessdenied' => 'Хандах эрхгүй байна',
 'img-auth-nopathinfo' => 'PATH_INFO байхгүй байна.
@@ -1947,7 +1967,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 
 # Watchlist
 'watchlist' => 'Миний хянаж буй хуудсууд',
-'mywatchlist' => 'Ð\9cиний Ñ\85Ñ\8fнаж Ð±Ñ\83й Ñ\85Ñ\83Ñ\83дÑ\81Ñ\83Ñ\83дын жагсаалт',
+'mywatchlist' => 'Ð¥Ñ\8fналÑ\82Ñ\8bн Ñ\85Ñ\83Ñ\83дÑ\81ын жагсаалт',
 'watchlistfor2' => 'Хэрэглэгч: $1 $2',
 'nowatchlist' => 'Танд хянаж буй зүйл байхгүй.',
 'watchlistanontext' => 'Та өөрийн хянах листийг өөрчлөх буюу үзэхийг хүсвэл $1 хэрэгтэй.',
@@ -1980,11 +2000,7 @@ URL нь зөв болон сайт ажиллагаатай байгаа эсэ
 
 'enotif_mailer' => '{{SITENAME}}-н мэйл сонордуулга',
 'enotif_reset' => 'Бүх хуудсыг үзсэн гэж тэмдэглэх',
-'enotif_newpagetext' => 'Энэ бол шинэ хуудас.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-н хэрэглэгч',
-'changed' => 'өөрчлөгдсөн',
-'created' => 'үүсгэсэн',
-'enotif_subject' => '{{SITENAME}}-н $PAGETITLE хуудсыг $PAGEEDITOR нь $CHANGEDORCREATED',
 'enotif_lastvisited' => '$1-н хамгийн сүүлд зочилсноос хойших өөрчлөлтүүдийг харуул.',
 'enotif_lastdiff' => '$1-г харж энэ өөрчлөлтийг үзнэ үү.',
 'enotif_anon_editor' => '$1 бүртгэлгүй хэрэглэгч',
@@ -2198,9 +2214,9 @@ $1',
 'blanknamespace' => '(Гол)',
 
 # Contributions
-'contributions' => 'Хэрэглэгчийн хувь нэмэр',
+'contributions' => '{{GENDER:$1|Хэрэглэгчийн }} оруулсан хувь нэмэр',
 'contributions-title' => '$1 хэрэглэгчийн хувь нэмэр',
-'mycontris' => 'Ð\9cиний Ð¾руулсан хувь нэмэр',
+'mycontris' => 'Ð\9eруулсан хувь нэмэр',
 'contribsub2' => 'Хэрэглэгч: $1 ($2)',
 'nocontribs' => 'Энэ шалгуурт тохирох өөрчилсөн зүйлүүд олдсонгүй.',
 'uctop' => '(дээд)',
@@ -2241,7 +2257,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 чиглүүлэгч',
 'whatlinkshere-hidetrans' => '$1 оруулалт',
 'whatlinkshere-hidelinks' => 'Линкүүдийг $1',
-'whatlinkshere-hideimages' => 'зургийн холбоосыг $1',
+'whatlinkshere-hideimages' => '$1 файлын холбоос',
 'whatlinkshere-filters' => 'Шүүлтүүрүүд',
 
 # Block/unblock
@@ -2278,10 +2294,12 @@ $1',
 'ipbwatchuser' => 'Энэ хэрэглэгчийн хэрэглэгчийн ба ярианы хуудсуудыг хянах',
 'ipb-disableusertalk' => 'Энэ хэрэглэгчийг блоклогдсон үедээ өөрийн ярианы хуудсыг янзлахаас зайлс хийлгэх',
 'ipb-change-block' => 'Эдгээр тохиргоотойгоор энэ хэрэглэгчийг дахин түгжих',
+'ipb-confirm' => 'Блоклоход бэлэн',
 'badipaddress' => 'Хүчингүй IP хаяг',
 'blockipsuccesssub' => 'Түгжээ амжилттай боллоо.',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] түгжигдсэн байна.
 <br />Түгжсэн тоймыг [[Special:BlockList|түгжигдсэн IP-ийн жагсаалт]] аас харна уу.',
+'ipb-blockingself' => 'Та өөрийгөө блоклох гэж байна. Тэгэх үү?',
 'ipb-edit-dropdown' => 'Түгжих шалтгаануудыг засварлах',
 'ipb-unblock-addr' => '$1-н түгжээг тайлах',
 'ipb-unblock' => 'Хэрэглэгчийн нэр эсвэл IP хаягийн түгжээг тайлах',
@@ -2292,9 +2310,15 @@ $1',
 'ipusubmit' => 'Энэ түгжээг цуцлах',
 'unblocked' => '[[User:$1|$1]]-ийн хориг цуцлагдсан (идэвхижсэн) байна.',
 'unblocked-id' => '$1 түгжээг авч хаялаа',
+'blocklist' => 'Блоклогдсон хэрэглэгчид',
 'ipblocklist' => 'Түгжигдсэн хэрэглэгчид',
 'ipblocklist-legend' => 'Түгжигдсэн хэрэглэгчийг хайх',
+'blocklist-userblocks' => 'бүртгэгдсэн блок-г нуух',
+'blocklist-tempblocks' => 'Түр зуурын блокыг нуух',
+'blocklist-addressblocks' => 'Ганц IP блокыг нуух',
+'blocklist-target' => 'Бай',
 'blocklist-expiry' => 'Цуцлагдана',
+'blocklist-params' => 'Блоклох параметрүүд',
 'blocklist-reason' => 'Шалтгаан',
 'ipblocklist-submit' => 'Хайх',
 'ipblocklist-localblock' => 'Дотоодын түгжилт',
@@ -2466,6 +2490,7 @@ $1',
 Хуудсыг гаргахын тулд доорх бичих талбарын мөр бүрт нэг гарчигийг оруулан, одоогийн болон хуучин бүх засварууд ба хуудасны түүхийн мөрүүд, эсвэл одоогийн засвар болон сүүлийн засварын талаарх мэдээллийн алиныг авах тухай сонголт хийнэ.
 
 Хоёр дахь сонголтын хувьд мөн холбоос ашиглах боломжтой; жишээ нь "[[{{MediaWiki:Mainpage}}]]" хуудаст [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] гэх холбоосыг ашиглаж болно.',
+'exportall' => 'Бүх хуудсыг экпортлох',
 'exportcuronly' => 'Бүх түүхийг биш, зөвхөн одоогийн өөрчлөлтийг багтаа',
 'exportnohistory' => "----
 '''Анхаар:''' Энэ маягтын дагуу хуудсуудын бүтэн түүхийг экспортлох үйлдэл гүйцэтгэлийн шалтгаануудын улмаас зогсоогдсон байна.",
@@ -2554,6 +2579,9 @@ $1',
 'import-logentry-interwiki' => '$1-г транс-викидлээ',
 'import-logentry-interwiki-detail' => '$2-с авсан $1 засвар',
 
+# JavaScriptTest
+'javascripttest' => 'JavaScript туршилт',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Таны хэрэглэгчийн хуудас',
 'tooltip-pt-anonuserpage' => 'Таны хэрэглэж буй IP хаягийн хэрэглэгчийн хуудас',
@@ -2655,11 +2683,11 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" - хуудасны мэдээлэл',
-'pageinfo-header-edits' => 'Өөрчлөлтүүд',
+'pageinfo-header-edits' => 'Өөрчлөлтийн түүх',
 'pageinfo-views' => 'Харагдацуудын тоо',
-'pageinfo-watchers' => 'Хянагчдын тоо',
+'pageinfo-watchers' => 'Ð¥Ñ\83Ñ\83даÑ\81 Ñ\85Ñ\8fнагÑ\87дÑ\8bн Ñ\82оо',
 'pageinfo-edits' => 'Засваруудын тоо',
-'pageinfo-authors' => 'ТÑ\83Ñ\81 Ñ\82Ñ\83Ñ\81Ñ\8bн зохиогчидын тоо',
+'pageinfo-authors' => 'Ð\9dийÑ\82 зохиогчидын тоо',
 
 # Patrolling
 'markaspatrolleddiff' => 'Хяналтанд авъя',
@@ -2702,6 +2730,9 @@ $1',
 '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' => 'эргэлдсэн',
@@ -2721,6 +2752,10 @@ $1',
 'sp-newimages-showfrom' => '$2, $1-с эхлэж шинэ файлуудыг үзүүлэх',
 
 # 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 -ын өмнө',
 
 # Bad image list
@@ -2864,14 +2899,42 @@ $1',
 'exif-gpsareainformation' => 'GPS бүсийн нэр',
 'exif-gpsdatestamp' => 'GPS огноо',
 'exif-gpsdifferential' => 'GPS дифференциал засвар',
+'exif-jpegfilecomment' => 'JPEG файлын тэмдэглэгээ',
+'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-source' => 'Эх сурвалж',
+'exif-writer' => 'Бичсэн',
 'exif-languagecode' => 'Хэл',
+'exif-iimversion' => 'IIM хувилбар',
 'exif-iimcategory' => 'Ангилал',
+'exif-datetimeexpires' => 'түүний дараа бүү хэрэглэ',
+'exif-datetimereleased' => 'Гарсан өдөр',
+'exif-originaltransmissionref' => '',
+'exif-identifier' => 'Дэлгэрүүлэгч',
+'exif-lens' => 'Ашигласан линз',
+'exif-serialnumber' => 'Камерны серын дугаар',
 'exif-cameraownername' => 'Камерын эзэн',
 'exif-label' => 'Шошго',
 'exif-datetimemetadata' => 'метадатаг хамгийн сүүлд өөрчилсөн огноо',
+'exif-nickname' => 'Зурганд өгсөн албан бус нэр',
+'exif-rating' => 'Зэрэглэл (5 хүртэл)',
 'exif-copyrighted' => 'Зохиогчийн эрхийн байдал',
 'exif-copyrightowner' => 'Зохиогчийн эрх эзэмшигч',
+'exif-usageterms' => 'Хэрэглээний нөхцөл, шаардлага',
 'exif-originaldocumentid' => 'Ориг баримтын ID',
 
 # EXIF attributes
@@ -3309,4 +3372,7 @@ $5
 'revdelete-unrestricted' => 'системийн операторуудаас авч хаясан хязгаарлалтууд',
 'newuserlog-byemail' => 'мэйлээр явуулсан нууц үг',
 
+# Search suggestions
+'searchsuggest-search' => 'Хайх',
+
 );
index caeb5ca..ef8797a 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Moldavian (Ð\9cолдовеняскэ)
+/** Moldavian (молдовеняскэ)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -22,132 +22,132 @@ $specialPageAliases = array(
 
 $messages = array(
 # Dates
-'sun'           => 'Дум',
-'january'       => 'януарие',
-'february'      => 'фебруарие',
-'march'         => 'мартие',
-'april'         => 'априлие',
-'may_long'      => 'май',
-'june'          => 'юние',
-'july'          => 'юлие',
-'august'        => 'аугуст',
-'september'     => 'септембрие',
-'october'       => 'октомбрие',
-'november'      => 'ноембрие',
-'december'      => 'дечембрие',
-'january-gen'   => 'януарие',
-'february-gen'  => 'фебруарие',
-'march-gen'     => 'мартие',
-'april-gen'     => 'априлие',
-'may-gen'       => 'май',
-'june-gen'      => 'юние',
-'july-gen'      => 'юлие',
-'august-gen'    => 'аугуст',
+'sun' => 'Дум',
+'january' => 'януарие',
+'february' => 'фебруарие',
+'march' => 'мартие',
+'april' => 'априлие',
+'may_long' => 'май',
+'june' => 'юние',
+'july' => 'юлие',
+'august' => 'аугуст',
+'september' => 'септембрие',
+'october' => 'октомбрие',
+'november' => 'ноембрие',
+'december' => 'дечембрие',
+'january-gen' => 'януарие',
+'february-gen' => 'фебруарие',
+'march-gen' => 'мартие',
+'april-gen' => 'априлие',
+'may-gen' => 'май',
+'june-gen' => 'юние',
+'july-gen' => 'юлие',
+'august-gen' => 'аугуст',
 'september-gen' => 'септембрие',
-'october-gen'   => 'октомбрие',
-'november-gen'  => 'ноембрие',
-'december-gen'  => 'дечембрие',
-'jan'           => 'яну',
-'feb'           => 'феб',
-'mar'           => 'мар',
-'apr'           => 'апр',
-'may'           => 'май',
-'jun'           => 'юни',
-'jul'           => 'юли',
-'aug'           => 'ауг',
-'sep'           => 'сеп',
-'oct'           => 'окт',
-'nov'           => 'ное',
-'dec'           => 'деч',
+'october-gen' => 'октомбрие',
+'november-gen' => 'ноембрие',
+'december-gen' => 'дечембрие',
+'jan' => 'яну',
+'feb' => 'феб',
+'mar' => 'мар',
+'apr' => 'апр',
+'may' => 'май',
+'jun' => 'юни',
+'jul' => 'юли',
+'aug' => 'ауг',
+'sep' => 'сеп',
+'oct' => 'окт',
+'nov' => 'ное',
+'dec' => 'деч',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Категоирие|Категорий}}',
-'category_header'        => 'Паӂинь дин категория «$1»',
-'subcategories'          => 'Субкатегорий',
-'hidden-categories'      => '{{PLURAL:$1|категорие аскунсэ|категорий аскунсе}}',
-'category-subcat-count'  => "{{PLURAL:$2|Ачастэ категорие концине доар урмэтоаря субкатегорие.|Ачастэ категорие концине {{PLURAL:$1|урмэтоаря субкатегорие|урмэтоареле $1 субкатегорий}}, динтр'ун тотал де $2.}}",
+'pagecategories' => '{{PLURAL:$1|Категоирие|Категорий}}',
+'category_header' => 'Паӂинь дин категория «$1»',
+'subcategories' => 'Субкатегорий',
+'hidden-categories' => '{{PLURAL:$1|категорие аскунсэ|категорий аскунсе}}',
+'category-subcat-count' => "{{PLURAL:$2|Ачастэ категорие концине доар урмэтоаря субкатегорие.|Ачастэ категорие концине {{PLURAL:$1|урмэтоаря субкатегорие|урмэтоареле $1 субкатегорий}}, динтр'ун тотал де $2.}}",
 'category-article-count' => "{{PLURAL:$2|Ачастэ категорие концине доар урмэтоаря паӂинэ.|{{PLURAL:$1|Урмэтоаря паӂинэ|Урмэтоареле $1 паӂинь}} се афлэ ын ачастэ категорие, динтр'ун тотал де $2.}}",
 
-'newwindow'  => "(се дескиде ынтр'о ферястрэ ноуэ)",
-'cancel'     => 'Анулязэ',
-'mytalk'     => 'Дискуцииле меле',
+'newwindow' => "(се дескиде ынтр'о ферястрэ ноуэ)",
+'cancel' => 'Анулязэ',
+'mytalk' => 'Дискуцииле меле',
 'navigation' => 'Навигаре',
 
 # Cologne Blue skin
 'qbfind' => 'Гэсеште',
 
-'errorpagetitle'   => 'Ероаре',
-'returnto'         => 'Ынапой ла $1.',
-'tagline'          => 'Де ла {{SITENAME}}',
-'help'             => 'Ажутор',
-'search'           => 'Каутэ',
-'searchbutton'     => 'Каутэ',
-'searcharticle'    => 'Ду-те',
-'history'          => 'Историкул паӂиний',
-'history_short'    => 'Историк',
+'errorpagetitle' => 'Ероаре',
+'returnto' => 'Ынапой ла $1.',
+'tagline' => 'Де ла {{SITENAME}}',
+'help' => 'Ажутор',
+'search' => 'Каутэ',
+'searchbutton' => 'Каутэ',
+'searcharticle' => 'Ду-те',
+'history' => 'Историкул паӂиний',
+'history_short' => 'Историк',
 'printableversion' => 'Версиуне де типэрит',
-'permalink'        => 'Легэтурэ неынчетатэ',
-'edit'             => 'Едитязэ',
-'create'           => 'Креязэ',
-'editthispage'     => 'Едитязэ ачастэ паӂинэ',
-'delete'           => 'Штерӂе',
-'protect'          => 'Протежязэ',
-'protect_change'   => 'скимбэ',
-'newpage'          => 'Паӂина ноуэ',
-'talkpage'         => 'Дискутэ ачастэ паӂинэ',
+'permalink' => 'Легэтурэ неынчетатэ',
+'edit' => 'Едитязэ',
+'create' => 'Креязэ',
+'editthispage' => 'Едитязэ ачастэ паӂинэ',
+'delete' => 'Штерӂе',
+'protect' => 'Протежязэ',
+'protect_change' => 'скимбэ',
+'newpage' => 'Паӂина ноуэ',
+'talkpage' => 'Дискутэ ачастэ паӂинэ',
 'talkpagelinktext' => 'Дискуций',
-'personaltools'    => 'Унелте персонале',
-'talk'             => 'Дискуций',
-'views'            => 'Визуализэрь',
-'toolbox'          => 'Кутие де унелте',
-'otherlanguages'   => 'Ын алте лимбь',
-'redirectedfrom'   => '(Редирекционат де ла $1)',
-'redirectpagesub'  => 'Паӂинэ де редирекционаре',
-'lastmodifiedat'   => 'Ултима модификаре $2, $1.',
-'jumpto'           => 'Салт ла:',
+'personaltools' => 'Унелте персонале',
+'talk' => 'Дискуций',
+'views' => 'Визуализэрь',
+'toolbox' => 'Кутие де унелте',
+'otherlanguages' => 'Ын алте лимбь',
+'redirectedfrom' => '(Редирекционат де ла $1)',
+'redirectpagesub' => 'Паӂинэ де редирекционаре',
+'lastmodifiedat' => 'Ултима модификаре $2, $1.',
+'jumpto' => 'Салт ла:',
 'jumptonavigation' => 'навигацие',
-'jumptosearch'     => 'кэутаре',
+'jumptosearch' => 'кэутаре',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => 'Деспре {{SITENAME}}',
-'aboutpage'            => 'Project:Деспре',
-'copyright'            => 'Концинутул есте диспонибил суб $1.',
-'copyrightpage'        => '{{ns:project}}:Дрептурь де аутор',
-'disclaimers'          => 'Деклараций',
-'disclaimerpage'       => 'Project:Декларацие ӂенералэ',
-'edithelp'             => 'Ажутор пентру едитаре',
-'edithelppage'         => 'Help:Едитаре',
-'helppage'             => 'Help:Купринс',
-'mainpage'             => 'Прима паӂина',
+'aboutsite' => 'Деспре {{SITENAME}}',
+'aboutpage' => 'Project:Деспре',
+'copyright' => 'Концинутул есте диспонибил суб $1.',
+'copyrightpage' => '{{ns:project}}:Дрептурь де аутор',
+'disclaimers' => 'Деклараций',
+'disclaimerpage' => 'Project:Декларацие ӂенералэ',
+'edithelp' => 'Ажутор пентру едитаре',
+'edithelppage' => 'Help:Едитаре',
+'helppage' => 'Help:Купринс',
+'mainpage' => 'Прима паӂина',
 'mainpage-description' => 'Прима паӂина',
-'privacy'              => 'Политика де интимитате',
-'privacypage'          => 'Project:Политика де интимитате',
+'privacy' => 'Политика де интимитате',
+'privacypage' => 'Project:Политика де интимитате',
 
 'badaccess' => 'Ероаре пермисиуне',
 
-'retrievedfrom'      => 'Адус де ла «$1»',
+'retrievedfrom' => 'Адус де ла «$1»',
 'youhavenewmessages' => 'Ай $1 ($2).',
-'newmessageslink'    => 'месаже ной',
-'editsection'        => 'едитязэ',
-'editold'            => 'едитязэ',
-'editlink'           => 'едитязэ',
-'viewsourcelink'     => 'везь сурса',
-'editsectionhint'    => 'Едитязэ секциуня: $1',
-'toc'                => 'Таблэ де материй',
-'showtoc'            => 'аратэ',
-'hidetoc'            => 'аскунде',
-'site-rss-feed'      => '$1 Агрегат RSS',
-'site-atom-feed'     => '$1 Агрегат Atom',
-'page-rss-feed'      => '«$1» Агрегат RSS',
-'page-atom-feed'     => '«$1» Агрегат Atom',
-'red-link-title'     => '$1 (паӂина ну егзистэ)',
+'newmessageslink' => 'месаже ной',
+'editsection' => 'едитязэ',
+'editold' => 'едитязэ',
+'editlink' => 'едитязэ',
+'viewsourcelink' => 'везь сурса',
+'editsectionhint' => 'Едитязэ секциуня: $1',
+'toc' => 'Таблэ де материй',
+'showtoc' => 'аратэ',
+'hidetoc' => 'аскунде',
+'site-rss-feed' => '$1 Агрегат RSS',
+'site-atom-feed' => '$1 Агрегат Atom',
+'page-rss-feed' => '«$1» Агрегат RSS',
+'page-atom-feed' => '«$1» Агрегат Atom',
+'red-link-title' => '$1 (паӂина ну егзистэ)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Паӂинэ',
-'nstab-user'     => 'Паӂина утилизаторулуй',
-'nstab-special'  => 'Сервичий',
-'nstab-project'  => 'Паӂина проектулуй',
-'nstab-image'    => 'Фишиер',
+'nstab-main' => 'Паӂинэ',
+'nstab-user' => 'Паӂина утилизаторулуй',
+'nstab-special' => 'Сервичий',
+'nstab-project' => 'Паӂина проектулуй',
+'nstab-image' => 'Фишиер',
 'nstab-template' => 'Шаблон',
 'nstab-category' => 'Категорие',
 
@@ -158,118 +158,115 @@ $messages = array(
 
 Дакэ ну ачеста е мотивул, с-ар путя сэ фи гэсит ун буг ын програм.
 Те рог анунцэ ачест аспект унуй [[Special:ListUsers/sysop|администратор]], индикынду-ь адреса УРЛ.',
-'viewsource'      => 'Везь сурса',
+'viewsource' => 'Везь сурса',
 
 # Login and logout pages
-'yourname'                => 'Нуме де утилизатор:',
-'yourpassword'            => 'Паролэ:',
+'yourname' => 'Нуме де утилизатор:',
+'yourpassword' => 'Паролэ:',
 'nav-login-createaccount' => 'Креязэ конт / Аутентификаре',
-'userlogin'               => 'Креязэ конт / Аутентификаре',
-'logout'                  => 'Ынкиде сесиуня',
-'userlogout'              => 'Ынкиде сесиуня',
-'nologinlink'             => 'Креязэ конт',
+'userlogin' => 'Креязэ конт / Аутентификаре',
+'logout' => 'Ынкиде сесиуня',
+'userlogout' => 'Ынкиде сесиуня',
+'nologinlink' => 'Креязэ конт',
 
 # Edit page toolbar
-'bold_sample'     => 'Текст алдин',
-'bold_tip'        => 'Текст алдин',
-'italic_sample'   => 'Текст курсив',
-'italic_tip'      => 'Текст курсив',
-'link_sample'     => 'Титлул легэтурий',
-'link_tip'        => 'Легэтурэ интернэ',
-'extlink_sample'  => 'http://www.example.com титлул легэтурий',
-'extlink_tip'     => 'Легэтурэ екстернэ (ну уита префиксул http://)',
+'bold_sample' => 'Текст алдин',
+'bold_tip' => 'Текст алдин',
+'italic_sample' => 'Текст курсив',
+'italic_tip' => 'Текст курсив',
+'link_sample' => 'Титлул легэтурий',
+'link_tip' => 'Легэтурэ интернэ',
+'extlink_sample' => 'http://www.example.com титлул легэтурий',
+'extlink_tip' => 'Легэтурэ екстернэ (ну уита префиксул http://)',
 'headline_sample' => 'Текст де титлу',
-'headline_tip'    => 'Титлу де нивел 2',
-'nowiki_sample'   => 'Интроду текст неформатат аичь',
-'nowiki_tip'      => 'Игнорэ форматаря вики',
-'image_tip'       => 'Фишиер инсерат',
-'media_tip'       => 'Легэтурэ ла фишиер',
-'sig_tip'         => 'Семнэтура та дататэ',
-'hr_tip'          => 'Линие оризонталэ (фолосеште-о кумпэтат)',
+'headline_tip' => 'Титлу де нивел 2',
+'nowiki_sample' => 'Интроду текст неформатат аичь',
+'nowiki_tip' => 'Игнорэ форматаря вики',
+'image_tip' => 'Фишиер инсерат',
+'media_tip' => 'Легэтурэ ла фишиер',
+'sig_tip' => 'Семнэтура та дататэ',
+'hr_tip' => 'Линие оризонталэ (фолосеште-о кумпэтат)',
 
 # Edit pages
-'summary'                          => 'Резумат:',
-'subject'                          => 'Субьект/титлу:',
-'minoredit'                        => 'Ачаста есте о едитаре минорэ',
-'watchthis'                        => 'Привеште ачастэ паӂинэ',
-'savearticle'                      => 'Салвязэ паӂина',
-'preview'                          => 'Превизуализязэ',
-'showpreview'                      => 'Аратэ превизуализаре',
-'showdiff'                         => 'Аратэ диференце',
-'anoneditwarning'                  => "'''Атенцие:''' Ну ць-ай аутентификат.
+'summary' => 'Резумат:',
+'subject' => 'Субьект/титлу:',
+'minoredit' => 'Ачаста есте о едитаре минорэ',
+'watchthis' => 'Привеште ачастэ паӂинэ',
+'savearticle' => 'Салвязэ паӂина',
+'preview' => 'Превизуализязэ',
+'showpreview' => 'Аратэ превизуализаре',
+'showdiff' => 'Аратэ диференце',
+'anoneditwarning' => "'''Атенцие:''' Ну ць-ай аутентификат.
 Адреса IP та ва фи ынреӂистратэ ын историкул ачестей паӂинь.",
-'newarticle'                       => '(Ноу)',
-'noarticletext'                    => 'Ын ачест момент ну есте ничь ун текст ын ачастэ паӂинэ.
+'newarticle' => '(Ноу)',
+'noarticletext' => 'Ын ачест момент ну есте ничь ун текст ын ачастэ паӂинэ.
 Поць [[Special:Search/{{PAGENAME}}|кэута ачест титлу]] ын алте паӂинь,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} кэута ынреӂистрэрь ын журнале], сау [{{fullurl:{{FULLPAGENAME}}|action=edit}} креа ачастэ паӂинэ]</span>.',
-'editing'                          => 'Едитынд $1',
-'editingsection'                   => 'Едитынд $1 (секциуне)',
-'copyrightwarning'                 => "Рецине кэ тоате контрибуцииле ла {{SITENAME}} сынт дистрибуите суб личенца $2 (везь $1 пентру деталий).
+'editing' => 'Едитынд $1',
+'editingsection' => 'Едитынд $1 (секциуне)',
+'copyrightwarning' => "Рецине кэ тоате контрибуцииле ла {{SITENAME}} сынт дистрибуите суб личенца $2 (везь $1 пентру деталий).
 Дакэ ну дорешть ка чея че скрий сэ фие модификат фэрэ милэ ши редистрибуит ын вое, атунчь ну тримите материалеле респективе аичь.<br />
 Де асеменя, не асигурь кэ чея че ай скирс а фост композицие проприе сау копие динтр'о ресурсэ публикэ сау либерэ.
 '''Ну интродуче материале ку дрептурь де аутор фэрэ пермисиуне!'''",
-'templatesused'                    => '{{PLURAL:$1|Шаблон фолосит|Шаблоане фолосите}} ын ачастэ паӂинэ:',
-'templatesusedpreview'             => '{{PLURAL:$1|Шаблон фолосит|Шаблоане фолосите}} ын ачастэ превизуализаре:',
-'template-protected'               => '(протежат)',
-'template-semiprotected'           => '(семи-протежат)',
-'hiddencategories'                 => 'Ачастэ паӂинэ есте мембрул {{PLURAL:$1|уней категорий аскунсе|а $1 категорий аскунсе}}:',
+'templatesused' => '{{PLURAL:$1|Шаблон фолосит|Шаблоане фолосите}} ын ачастэ паӂинэ:',
+'templatesusedpreview' => '{{PLURAL:$1|Шаблон фолосит|Шаблоане фолосите}} ын ачастэ превизуализаре:',
+'template-protected' => '(протежат)',
+'template-semiprotected' => '(семи-протежат)',
+'hiddencategories' => 'Ачастэ паӂинэ есте мембрул {{PLURAL:$1|уней категорий аскунсе|а $1 категорий аскунсе}}:',
 'permissionserrorstext-withaction' => 'Ну ай пермисиуня сэ $2, дин {{PLURAL:$1|урмэторул мотивул|урмэтоареле мотиве}}:',
 
 # History pages
-'viewpagelogs'           => 'Везь журналеле пентру ачастэ паӂинэ',
-'currentrev-asof'        => 'Версиуня курентэ дин $1',
-'revisionasof'           => 'Версиуня де ла дата $1',
-'previousrevision'       => 'Версиуня антериоарэ',
-'cur'                    => 'акт',
-'last'                   => 'преч',
+'viewpagelogs' => 'Везь журналеле пентру ачастэ паӂинэ',
+'currentrev-asof' => 'Версиуня курентэ дин $1',
+'revisionasof' => 'Версиуня де ла дата $1',
+'previousrevision' => 'Версиуня антериоарэ',
+'cur' => 'акт',
+'last' => 'преч',
 'history-fieldset-title' => 'Рэсфоеште историкул',
-'histfirst'              => 'Примеле',
-'histlast'               => 'Ултимеле',
+'histfirst' => 'Примеле',
+'histlast' => 'Ултимеле',
 
 # Revision deletion
-'rev-delundel'   => 'аратэ/аскунде',
+'rev-delundel' => 'аратэ/аскунде',
 'revdel-restore' => 'скимбэ визибилитатя',
 
 # Merge log
 'revertmerge' => 'Анулязэ ымбинаря',
 
 # Diffs
-'history-title'           => 'Историкул ревизиилор пентру «$1»',
-'difference'              => '(Диференца динтре версиунь)',
-'lineno'                  => 'Линия $1:',
+'history-title' => 'Историкул ревизиилор пентру «$1»',
+'lineno' => 'Линия $1:',
 'compareselectedversions' => 'Компарэ версиуниле селектате',
-'editundo'                => 'десфаче',
+'editundo' => 'десфаче',
 
 # Search results
-'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'''",
-'notitlematches'            => 'Ничь ун резултат ын титлуриле артиколелор',
-'notextmatches'             => 'Ничь ун резултат ын текстеле артиколелор',
-'prevn'                     => 'антериоареле {{PLURAL:$1|$1}}',
-'nextn'                     => 'урмэтоареле {{PLURAL:$1|$1}}',
-'viewprevnext'              => 'Везь ($1 {{int:pipe-separator}} $2) ($3).',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 кувынт|$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' => 'фэрэ суӂестий',
-'nonefound'                 => "'''Нотэ''': Нумай унеле спаций де нуме сынт кэутате импличит.
+'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'''",
+'notitlematches' => 'Ничь ун резултат ын титлуриле артиколелор',
+'notextmatches' => 'Ничь ун резултат ын текстеле артиколелор',
+'prevn' => 'антериоареле {{PLURAL:$1|$1}}',
+'nextn' => 'урмэтоареле {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Везь ($1 {{int:pipe-separator}} $2) ($3).',
+'search-result-size' => '$1 ({{PLURAL:$2|1 кувынт|$2 кувинте}})',
+'search-redirect' => '(редирекционаре кэтре $1)',
+'search-section' => '(секциуня $1)',
+'search-suggest' => 'Аць дорит сэ скриець: $1',
+'search-interwiki-caption' => 'Проекте ынрудите',
+'search-interwiki-default' => '$1 резултате:',
+'search-interwiki-more' => '(май мулт)',
+'nonefound' => "'''Нотэ''': Нумай унеле спаций де нуме сынт кэутате импличит.
 Ынчеркэ сэ пуй ка ши префикс ал кэутэрий ''all:'' пентру а кэута ын тот концинутул (инклузынд ши паӂиниле де дискуций, формате, етч), сау фолосеште спациул де нуме дорит ка ши префикс.",
-'powersearch'               => 'Кэутаре авансатэ',
-'powersearch-legend'        => 'Кэутаре авансатэ',
-'powersearch-ns'            => 'Кэутаре ын спацииле де нуме:',
-'powersearch-redir'         => 'Афишазэ редиректэриле',
-'powersearch-field'         => 'Каутэ дупэ',
+'powersearch' => 'Кэутаре авансатэ',
+'powersearch-legend' => 'Кэутаре авансатэ',
+'powersearch-ns' => 'Кэутаре ын спацииле де нуме:',
+'powersearch-redir' => 'Афишазэ редиректэриле',
+'powersearch-field' => 'Каутэ дупэ',
 
 # Preferences page
-'preferences'   => 'Преферинце',
+'preferences' => 'Преферинце',
 'mypreferences' => 'Преферинцеле меле',
 
 # Groups
@@ -284,83 +281,83 @@ $messages = array(
 'action-edit' => 'едитязэ ачастэ паӂинэ',
 
 # Recent changes
-'recentchanges'                  => 'Скимбэрь реченте',
-'recentchanges-legend'           => 'Опциунь скимбэрь реченте',
+'recentchanges' => 'Скимбэрь реченте',
+'recentchanges-legend' => 'Опциунь скимбэрь реченте',
 'recentchanges-feed-description' => 'Привеште челе май реченте скимбэрь фолосинд ачест агрегат.',
-'rclistfrom'                     => 'Аратэ модификэриле ынчепынд де ла $1',
-'rcshowhideminor'                => '$1 модификэриле миноре',
-'rcshowhidebots'                 => '$1 ботурь',
-'rcshowhideliu'                  => '$1 утилизаторь аутентификаць',
-'rcshowhideanons'                => '$1 утилизаторь анонимь',
-'rcshowhidemine'                 => '$1 едитэриле меле',
-'rclinks'                        => 'Аратэ ултимеле $1 модификэрь дин ултимеле $2 зиле.<br />$3',
-'diff'                           => 'диф',
-'hist'                           => 'ист',
-'hide'                           => 'аскунде',
-'show'                           => 'аратэ',
-'minoreditletter'                => 'м',
-'newpageletter'                  => 'Н',
-'boteditletter'                  => 'б',
-'rc-enhanced-expand'             => 'Аратэ деталий (нечеситэ JavaScript)',
-'rc-enhanced-hide'               => 'Аскунде деталииле',
+'rclistfrom' => 'Аратэ модификэриле ынчепынд де ла $1',
+'rcshowhideminor' => '$1 модификэриле миноре',
+'rcshowhidebots' => '$1 ботурь',
+'rcshowhideliu' => '$1 утилизаторь аутентификаць',
+'rcshowhideanons' => '$1 утилизаторь анонимь',
+'rcshowhidemine' => '$1 едитэриле меле',
+'rclinks' => 'Аратэ ултимеле $1 модификэрь дин ултимеле $2 зиле.<br />$3',
+'diff' => 'диф',
+'hist' => 'ист',
+'hide' => 'аскунде',
+'show' => 'аратэ',
+'minoreditletter' => 'м',
+'newpageletter' => 'Н',
+'boteditletter' => 'б',
+'rc-enhanced-expand' => 'Аратэ деталий (нечеситэ JavaScript)',
+'rc-enhanced-hide' => 'Аскунде деталииле',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Скимбарь корелате',
-'recentchangeslinked-feed'    => 'Скимбарь корелате',
+'recentchangeslinked' => 'Скимбарь корелате',
+'recentchangeslinked-feed' => 'Скимбарь корелате',
 'recentchangeslinked-toolbox' => 'Скимбарь корелате',
-'recentchangeslinked-title'   => 'Скимбэрь легате де «$1»',
+'recentchangeslinked-title' => 'Скимбэрь легате де «$1»',
 'recentchangeslinked-summary' => "Ачаста есте о листэ а скимбэрилор ефектуате речент асупра паӂинилор ку легэтурь де ла о анумитэ паӂинэ (сау асупра мембрилор уней анумите категорий).
 Паӂиниле пе каре ле [[Special:Watchlist|привь]] апар ын '''алдине'''.",
-'recentchangeslinked-page'    => 'Нумеле паӂиний:',
-'recentchangeslinked-to'      => 'Афишазэ скимбэриле ын паӂиниле каре се лягэ де паӂина датэ',
+'recentchangeslinked-page' => 'Нумеле паӂиний:',
+'recentchangeslinked-to' => 'Афишазэ скимбэриле ын паӂиниле каре се лягэ де паӂина датэ',
 
 # Upload
-'upload'        => 'Тримите фишиер',
+'upload' => 'Тримите фишиер',
 'uploadedimage' => 'а ынкэркат «[[$1]]»',
 
 # File description page
-'file-anchor-link'          => 'Фишиер',
-'filehist'                  => 'Историкул фишиерулуй',
-'filehist-help'             => "Апасэ пе '''Дата ши ора''' пентру а ведя версиуня тримисэ атунчь.",
-'filehist-current'          => 'актуалэ',
-'filehist-datetime'         => 'Дата/Ора',
-'filehist-thumb'            => 'Миниатурэ',
-'filehist-thumbtext'        => 'Миниатурэ пентру версиуня дин $1',
-'filehist-user'             => 'Утилизатор',
-'filehist-dimensions'       => 'Дименсиунь',
-'filehist-comment'          => 'Коментариу',
-'imagelinks'                => 'Легэтурь',
-'linkstoimage'              => '{{PLURAL:$1|Урмэтоаря паӂинэ тримите спре|Урмэтоареле $1 паӂинь тримит спре}} ачест фишиер:',
-'sharedupload'              => 'Ачест фишиер провине де ла $1 ши поате фи фолосит ши де алте проекте.',
+'file-anchor-link' => 'Фишиер',
+'filehist' => 'Историкул фишиерулуй',
+'filehist-help' => "Апасэ пе '''Дата ши ора''' пентру а ведя версиуня тримисэ атунчь.",
+'filehist-current' => 'актуалэ',
+'filehist-datetime' => 'Дата/Ора',
+'filehist-thumb' => 'Миниатурэ',
+'filehist-thumbtext' => 'Миниатурэ пентру версиуня дин $1',
+'filehist-user' => 'Утилизатор',
+'filehist-dimensions' => 'Дименсиунь',
+'filehist-comment' => 'Коментариу',
+'imagelinks' => 'Легэтурь',
+'linkstoimage' => '{{PLURAL:$1|Урмэтоаря паӂинэ тримите спре|Урмэтоареле $1 паӂинь тримит спре}} ачест фишиер:',
+'sharedupload' => 'Ачест фишиер провине де ла $1 ши поате фи фолосит ши де алте проекте.',
 'uploadnewversion-linktext' => 'Ынкаркэ о версиуне ноуэ а ачестуй фишиер',
 
 # Statistics
 'statistics' => 'Статистичь',
 
 # Miscellaneous special pages
-'nbytes'        => '{{PLURAL:$1|ун октет|$1 октець}}',
-'nmembers'      => '$1 {{PLURAL:$1|ун мембру|мембрь}}',
-'prefixindex'   => 'Тоате паӂиниле ку префикс',
-'newpages'      => 'Паӂинь ной',
-'move'          => 'Депласязэ',
-'movethispage'  => 'Депласязэ ачастэ паӂинэ',
+'nbytes' => '{{PLURAL:$1|ун октет|$1 октець}}',
+'nmembers' => '$1 {{PLURAL:$1|ун мембру|мембрь}}',
+'prefixindex' => 'Тоате паӂиниле ку префикс',
+'newpages' => 'Паӂинь ной',
+'move' => 'Депласязэ',
+'movethispage' => 'Депласязэ ачастэ паӂинэ',
 'pager-newer-n' => '{{PLURAL:$1|1 май ноу|$1 май ной}}',
 'pager-older-n' => '{{PLURAL:$1|1|$1}} май векь',
 
 # Book sources
-'booksources'    => 'Сурсе де кэрць',
+'booksources' => 'Сурсе де кэрць',
 'booksources-go' => 'Ду-те',
 
 # Special:Log
 'log' => 'Журнале',
 
 # Special:AllPages
-'allpages'       => 'Тоате паӂиниле',
+'allpages' => 'Тоате паӂиниле',
 'alphaindexline' => '$1 пынэ ла $2',
-'prevpage'       => 'Паӂина антериоарэ ($1)',
-'allpagesfrom'   => 'Афишазэ паӂиниле порнинд де ла:',
-'allpagesto'     => 'Афишазэ паӂиниле терминынд де ла:',
-'allarticles'    => 'Тоате паӂиниле',
+'prevpage' => 'Паӂина антериоарэ ($1)',
+'allpagesfrom' => 'Афишазэ паӂиниле порнинд де ла:',
+'allpagesto' => 'Афишазэ паӂиниле терминынд де ла:',
+'allarticles' => 'Тоате паӂиниле',
 'allpagessubmit' => 'Ду-те',
 
 # Special:LinkSearch
@@ -376,110 +373,110 @@ $messages = array(
 'emailuser' => 'Тримите прин поштэ електроникэ ун месаж ачестуй утилизатор',
 
 # Watchlist
-'watchlist'         => 'Паӂинь привите',
-'mywatchlist'       => 'Паӂинь привите',
-'watch'             => 'Привеште',
-'watchthispage'     => 'Привеште ачастэ паӂинэ',
-'unwatch'           => 'Ну май привеште',
-'wlshowlast'        => 'Аратэ ултимеле $1 оре $2 зиле $3',
+'watchlist' => 'Паӂинь привите',
+'mywatchlist' => 'Паӂинь привите',
+'watch' => 'Привеште',
+'watchthispage' => 'Привеште ачастэ паӂинэ',
+'unwatch' => 'Ну май привеште',
+'wlshowlast' => 'Аратэ ултимеле $1 оре $2 зиле $3',
 'watchlist-options' => 'Опциуниле листей де паӂинь привите',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Привинд...',
+'watching' => 'Привинд...',
 'unwatching' => 'Ну май привинд...',
 
 # Delete
-'deletepage'            => 'Штерӂе паӂина',
-'actioncomplete'        => 'Акциуне комплетэ',
-'deletedtext'           => 'Паӂина «$1» а фост штярсэ.
+'deletepage' => 'Штерӂе паӂина',
+'actioncomplete' => 'Акциуне комплетэ',
+'deletedtext' => 'Паӂина «$1» а фост штярсэ.
 Везь $2 пентру о листэ а елементелор штерсе речент.',
-'dellogpage'            => 'Журнал штерӂерь',
-'deletecomment'         => 'Мотив:',
-'deleteotherreason'     => 'Мотив диферит/суплиментар:',
+'dellogpage' => 'Журнал штерӂерь',
+'deletecomment' => 'Мотив:',
+'deleteotherreason' => 'Мотив диферит/суплиментар:',
 'deletereasonotherlist' => 'Алт мотив',
 
 # Rollback
 'rollbacklink' => 'ревино',
 
 # Protect
-'protectlogpage'              => 'Журнал протекций',
-'protectedarticle'            => 'а протежат «[[$1]]»',
-'modifiedarticleprotection'   => 'а скимбат нивелул де протекцие пентру «[[$1]]»',
-'protectcomment'              => 'Мотив:',
-'protectexpiry'               => 'Експирэ:',
-'protect_expiry_invalid'      => 'Тимпул де експираре ну есте валид.',
-'protect_expiry_old'          => 'Тимпул де експираре есте ын трекут.',
-'protect-text'                => "Поць визуализа сау модифика нивелул де протекцие пентру паӂина '''$1'''.",
-'protect-locked-access'       => "Контул тэу ну аре пермисиуня де а скимба нивелуриле де протежаре а паӂиний.
+'protectlogpage' => 'Журнал протекций',
+'protectedarticle' => 'а протежат «[[$1]]»',
+'modifiedarticleprotection' => 'а скимбат нивелул де протекцие пентру «[[$1]]»',
+'protectcomment' => 'Мотив:',
+'protectexpiry' => 'Експирэ:',
+'protect_expiry_invalid' => 'Тимпул де експираре ну есте валид.',
+'protect_expiry_old' => 'Тимпул де експираре есте ын трекут.',
+'protect-text' => "Поць визуализа сау модифика нивелул де протекцие пентру паӂина '''$1'''.",
+'protect-locked-access' => "Контул тэу ну аре пермисиуня де а скимба нивелуриле де протежаре а паӂиний.
 Аичь сынт сетэриле куренте пентру паӂина '''$1''':",
-'protect-cascadeon'           => 'Ачастэ паӂинэ есте протежатэ деоарече есте инклусэ ын {{PLURAL:$1|урмэтоаря паӂинэ, че аре|урмэтоареле паӂинь, че ау}} активитатэ протежаря ла модификаре ын каскадэ.
+'protect-cascadeon' => 'Ачастэ паӂинэ есте протежатэ деоарече есте инклусэ ын {{PLURAL:$1|урмэтоаря паӂинэ, че аре|урмэтоареле паӂинь, че ау}} активитатэ протежаря ла модификаре ын каскадэ.
 Поць скимба нивелул де протежаре ал ачестей паӂинь, дар аста ну ва афекта протекция ын каскадэ.',
-'protect-default'             => 'Пермите тоць утилизаторий',
+'protect-default' => 'Пермите тоць утилизаторий',
 'protect-level-autoconfirmed' => 'Блокязэ утилизаторий ной ши неынреӂистраць',
-'protect-level-sysop'         => 'Нумай администраторий',
-'protect-summary-cascade'     => 'ын каскадэ',
-'protect-expiring'            => 'експирэ $1 (UTC)',
-'protect-cantedit'            => 'Ну поць скимба нивелул де протекцие а ачестей паӂинь, деоарече ну ай пермисиуня де а о модифика.',
-'restriction-type'            => 'Пермисиуне:',
-'restriction-level'           => 'Нивел де рестрикцие:',
+'protect-level-sysop' => 'Нумай администраторий',
+'protect-summary-cascade' => 'ын каскадэ',
+'protect-expiring' => 'експирэ $1 (UTC)',
+'protect-cantedit' => 'Ну поць скимба нивелул де протекцие а ачестей паӂинь, деоарече ну ай пермисиуня де а о модифика.',
+'restriction-type' => 'Пермисиуне:',
+'restriction-level' => 'Нивел де рестрикцие:',
 
 # Undelete
 'undeletelink' => 'визуализязэ/рестаурязэ',
 
 # Namespace form on various pages
-'namespace'      => 'Спациу де нуме:',
-'invert'         => 'Инверсязэ селекция',
+'namespace' => 'Спациу де нуме:',
+'invert' => 'Инверсязэ селекция',
 'blanknamespace' => '(Принчиал)',
 
 # Contributions
-'contributions'       => 'Контрибуцииле утилизаторулуй',
+'contributions' => 'Контрибуцииле утилизаторулуй',
 'contributions-title' => 'Контрибуцииле утилизаторулуй $1',
-'mycontris'           => 'Контрибуцииле меле',
-'contribsub2'         => 'Пентру $1 ($2)',
-'month'               => 'Дин луна (ши май ынаинте):',
-'year'                => 'Дин анул (ши май ынаинте):',
+'mycontris' => 'Контрибуцииле меле',
+'contribsub2' => 'Пентру $1 ($2)',
+'month' => 'Дин луна (ши май ынаинте):',
+'year' => 'Дин анул (ши май ынаинте):',
 
-'sp-contributions-newbies'  => 'Аратэ доар контрибуцииле контурилор ной',
+'sp-contributions-newbies' => 'Аратэ доар контрибуцииле контурилор ной',
 'sp-contributions-blocklog' => 'журнал блокэрь',
-'sp-contributions-talk'     => 'Дискуций',
-'sp-contributions-search'   => 'Каутэ контрибуций',
+'sp-contributions-talk' => 'Дискуций',
+'sp-contributions-search' => 'Каутэ контрибуций',
 'sp-contributions-username' => 'Адресэ IP сау нуме де утилизатор:',
-'sp-contributions-submit'   => 'Каутэ',
+'sp-contributions-submit' => 'Каутэ',
 
 # What links here
-'whatlinkshere'            => 'Че се лягэ аичь',
-'whatlinkshere-title'      => 'Паӂинь каре концин легэтурь спре «$1»',
-'whatlinkshere-page'       => 'Паӂинэ:',
-'linkshere'                => "Урмэтоареле паӂинь концин легэтурь кэтре '''[[:$1]]''':",
-'isredirect'               => 'паӂинэ де редирекционаре',
-'istemplate'               => 'трансклудере',
-'isimage'                  => 'легэтура фишиерулуй',
-'whatlinkshere-prev'       => '{{PLURAL:$1|антериоара|антериоареле $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|урмэтоаря|урматоареле $1}}',
-'whatlinkshere-links'      => '← легэтурь',
+'whatlinkshere' => 'Че се лягэ аичь',
+'whatlinkshere-title' => 'Паӂинь каре концин легэтурь спре «$1»',
+'whatlinkshere-page' => 'Паӂинэ:',
+'linkshere' => "Урмэтоареле паӂинь концин легэтурь кэтре '''[[:$1]]''':",
+'isredirect' => 'паӂинэ де редирекционаре',
+'istemplate' => 'трансклудере',
+'isimage' => 'легэтура фишиерулуй',
+'whatlinkshere-prev' => '{{PLURAL:$1|антериоара|антериоареле $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|урмэтоаря|урматоареле $1}}',
+'whatlinkshere-links' => '← легэтурь',
 'whatlinkshere-hideredirs' => '$1 редирекционарь',
-'whatlinkshere-hidetrans'  => '$1 трансклудериле',
-'whatlinkshere-hidelinks'  => '$1 легэтурь',
-'whatlinkshere-filters'    => 'Филтре',
+'whatlinkshere-hidetrans' => '$1 трансклудериле',
+'whatlinkshere-hidelinks' => '$1 легэтурь',
+'whatlinkshere-filters' => 'Филтре',
 
 # Block/unblock
-'blockip'                  => 'Блокязэ утилизатор',
-'ipboptions'               => '2 оре:2 hours,1 зи:1 day,3 зиле:3 days,1 сэптэмынэ:1 week,2 сэптэмынь:2 weeks,1 лунэ:1 month,3 лунь:3 months,6 лунь:6 months,1 ан:1 year,инфинит:infinite',
-'blocklink'                => 'блокязэ',
-'unblocklink'              => 'деблокязэ',
-'change-blocklink'         => 'модификэ блокаря',
-'contribslink'             => 'контрибуций',
-'blocklogpage'             => 'Журнал блокэрь',
-'unblocklogentry'          => 'а деблокат $1',
+'blockip' => 'Блокязэ утилизатор',
+'ipboptions' => '2 оре:2 hours,1 зи:1 day,3 зиле:3 days,1 сэптэмынэ:1 week,2 сэптэмынь:2 weeks,1 лунэ:1 month,3 лунь:3 months,6 лунь:6 months,1 ан:1 year,инфинит:infinite',
+'blocklink' => 'блокязэ',
+'unblocklink' => 'деблокязэ',
+'change-blocklink' => 'модификэ блокаря',
+'contribslink' => 'контрибуций',
+'blocklogpage' => 'Журнал блокэрь',
+'unblocklogentry' => 'а деблокат $1',
 'block-log-flags-nocreate' => 'креаря де контурь дезактиватэ',
 
 # Move page
 'movearticle' => 'Депласязэ паӂина:',
-'newtitle'    => 'Титлул ноу:',
+'newtitle' => 'Титлул ноу:',
 'movepagebtn' => 'Депласязэ паӂина',
 'movelogpage' => 'Журнал депласэрь',
-'movereason'  => 'Мотив:',
-'revertmove'  => 'ревино',
+'movereason' => 'Мотив:',
+'revertmove' => 'ревино',
 
 # Export
 'export' => 'Експортэ паӂинь',
@@ -488,63 +485,63 @@ $messages = array(
 'thumbnail-more' => 'Екстинде',
 
 # 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-logout'               => 'Ынкиде сесиуня',
-'tooltip-ca-talk'                 => 'Дискуцие деспре артикол',
-'tooltip-ca-edit'                 => 'Поате едита ачастэ паӂинэ. Ле ругэм сэ превизуализязэ концинутул ынаинте де салваре.',
-'tooltip-ca-addsection'           => 'Адаугэ о ноуэ секциуне.',
-'tooltip-ca-viewsource'           => 'Ачастэ паӂинэ есте протежатэ.
+'tooltip-pt-userpage' => 'Паӂина та де утилизатор',
+'tooltip-pt-mytalk' => 'Паӂина та де дискуций',
+'tooltip-pt-preferences' => 'Преферинцеле меле',
+'tooltip-pt-watchlist' => 'Листа паӂинилор пе каре ле мониторизезь',
+'tooltip-pt-mycontris' => 'Листэ де контрибуцииле тале',
+'tooltip-pt-login' => 'Есте ынкуражат сэ се аутентификэ, дешь ачест лукру ну есте облигаториу.',
+'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-n-mainpage'              => 'Визитязэ паӂина принчипалэ',
-'tooltip-n-mainpage-description'  => 'Визитязэ паӂина принчипалэ',
-'tooltip-n-portal'                => 'Деспре проект, че поате фаче, унде гэсеште солуций',
-'tooltip-n-currentevents'         => 'Гэсеште информаций деспре ынтымпларе курентэ',
-'tooltip-n-recentchanges'         => 'Листа ултимелор скимбэрь реализате ын ачест вики.',
-'tooltip-n-randompage'            => 'Мерӂе спре о паӂинэ алятоаре',
-'tooltip-n-help'                  => 'Локул ын каре гэсешть ажутор',
-'tooltip-t-whatlinkshere'         => 'Листа тутурор паӂинилор вики каре кондук спре ачастэ паӂинэ',
-'tooltip-t-recentchangeslinked'   => 'Скимбэрь реченте ын легэтурэ ку ачастэ паӂинэ',
-'tooltip-feed-rss'                => 'Агрегат RSS пентру ачастэ паӂинэ',
-'tooltip-feed-atom'               => 'Агрегат Atom пентру ачастэ паӂинэ',
-'tooltip-t-contributions'         => 'Везь листа де контрибуций але ачестуй утилизатор',
-'tooltip-t-emailuser'             => 'Тримите прин поштэ електроникэ ун месаж ачестуй утилизатор',
-'tooltip-t-upload'                => 'Тримите имаӂинь сау фишиере медия',
-'tooltip-t-specialpages'          => 'Листа тутурор паӂинилор де сервичиу',
-'tooltip-t-print'                 => 'Версиуня де типэрит а ачестей паӂинь',
-'tooltip-t-permalink'             => 'Легэтура перманентэ кэтре ачастэ версиуне а паӂиний',
-'tooltip-ca-nstab-main'           => 'Везь паӂина де концинут',
-'tooltip-ca-nstab-user'           => 'Везь паӂина де утилизатор',
-'tooltip-ca-nstab-special'        => 'Ачаста есте о паӂинэ спечиалэ, ну о поць модифика директ.',
-'tooltip-ca-nstab-project'        => 'Везь паӂина проектулуй',
-'tooltip-ca-nstab-image'          => 'Везь паӂина фишиерулуй',
-'tooltip-ca-nstab-template'       => 'Везь шаблон',
-'tooltip-ca-nstab-category'       => 'Везь паӂина категорией',
-'tooltip-minoredit'               => 'Маркязэ ачастэ едитаре ка фиинд минорэ',
-'tooltip-save'                    => 'Салвязэ скимбэриле тале',
-'tooltip-preview'                 => 'Превизуализаря модофикэрилор тале, фолосеште-о те ругэм ынаинте де а салва!',
-'tooltip-diff'                    => 'Аратэ-мь модификэриле ефектуате асупра текстулуй',
+'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-n-mainpage' => 'Визитязэ паӂина принчипалэ',
+'tooltip-n-mainpage-description' => 'Визитязэ паӂина принчипалэ',
+'tooltip-n-portal' => 'Деспре проект, че поате фаче, унде гэсеште солуций',
+'tooltip-n-currentevents' => 'Гэсеште информаций деспре ынтымпларе курентэ',
+'tooltip-n-recentchanges' => 'Листа ултимелор скимбэрь реализате ын ачест вики.',
+'tooltip-n-randompage' => 'Мерӂе спре о паӂинэ алятоаре',
+'tooltip-n-help' => 'Локул ын каре гэсешть ажутор',
+'tooltip-t-whatlinkshere' => 'Листа тутурор паӂинилор вики каре кондук спре ачастэ паӂинэ',
+'tooltip-t-recentchangeslinked' => 'Скимбэрь реченте ын легэтурэ ку ачастэ паӂинэ',
+'tooltip-feed-rss' => 'Агрегат RSS пентру ачастэ паӂинэ',
+'tooltip-feed-atom' => 'Агрегат Atom пентру ачастэ паӂинэ',
+'tooltip-t-contributions' => 'Везь листа де контрибуций але ачестуй утилизатор',
+'tooltip-t-emailuser' => 'Тримите прин поштэ електроникэ ун месаж ачестуй утилизатор',
+'tooltip-t-upload' => 'Тримите имаӂинь сау фишиере медия',
+'tooltip-t-specialpages' => 'Листа тутурор паӂинилор де сервичиу',
+'tooltip-t-print' => 'Версиуня де типэрит а ачестей паӂинь',
+'tooltip-t-permalink' => 'Легэтура перманентэ кэтре ачастэ версиуне а паӂиний',
+'tooltip-ca-nstab-main' => 'Везь паӂина де концинут',
+'tooltip-ca-nstab-user' => 'Везь паӂина де утилизатор',
+'tooltip-ca-nstab-special' => 'Ачаста есте о паӂинэ спечиалэ, ну о поць модифика директ.',
+'tooltip-ca-nstab-project' => 'Везь паӂина проектулуй',
+'tooltip-ca-nstab-image' => 'Везь паӂина фишиерулуй',
+'tooltip-ca-nstab-template' => 'Везь шаблон',
+'tooltip-ca-nstab-category' => 'Везь паӂина категорией',
+'tooltip-minoredit' => 'Маркязэ ачастэ едитаре ка фиинд минорэ',
+'tooltip-save' => 'Салвязэ скимбэриле тале',
+'tooltip-preview' => 'Превизуализаря модофикэрилор тале, фолосеште-о те ругэм ынаинте де а салва!',
+'tooltip-diff' => 'Аратэ-мь модификэриле ефектуате асупра текстулуй',
 'tooltip-compareselectedversions' => 'Везь диференцеле ынтре челе доуэ версиунь селектате де пе ачастэ паӂинэ',
-'tooltip-watch'                   => 'Адаугэ ла листа де паӂинь привите',
-'tooltip-rollback'                => "«Ревино» анулязэ модификаря/модификэриле де пе ачастэ паӂинэ а ултимулуй контрибуитор принтр'о сингурэ апэсаре",
+'tooltip-watch' => 'Адаугэ ла листа де паӂинь привите',
+'tooltip-rollback' => "«Ревино» анулязэ модификаря/модификэриле де пе ачастэ паӂинэ а ултимулуй контрибуитор принтр'о сингурэ апэсаре",
 
 # Media information
 'file-info-size' => '$1 × $2 пиксель, мэриме фишиер: $3, тип MIME: $4',
-'file-nohires'   => 'Резолуций май марь ну сынт диспонибиле.',
-'svg-long-desc'  => 'фишиер SVG, ку дименсиуня номиналэ де $1 × $2 пиксель, мэриме фишиер: $3',
+'file-nohires' => 'Резолуций май марь ну сынт диспонибиле.',
+'svg-long-desc' => 'фишиер SVG, ку дименсиуня номиналэ де $1 × $2 пиксель, мэриме фишиер: $3',
 'show-big-image' => 'Мэреште резолуция имаӂиний',
 
 # Bad image list
@@ -555,24 +552,24 @@ $messages = array(
 Орьче легэтурь че урмязэ пе ачеяшь линие сынт консидерате ексчепций, адикэ паӂинь унде фишиерул поате апэря инклус директ.',
 
 # Metadata
-'metadata-help'     => 'Ачест фишиер концине информаций суплиментаре, интродусе пробабил де апаратул фотографик диӂитал сау сканерул каре л-а ӂенерат.
+'metadata-help' => 'Ачест фишиер концине информаций суплиментаре, интродусе пробабил де апаратул фотографик диӂитал сау сканерул каре л-а ӂенерат.
 Дакэ фишиерул а фост модификат ынтре тимп, есте посибил ка унеле деталий сэ ну май фие валабиле.',
-'metadata-expand'   => 'Афишазэ деталий суплиментаре',
+'metadata-expand' => 'Афишазэ деталий суплиментаре',
 'metadata-collapse' => 'Аскунде деталий суплиментаре',
 
 # External editor support
-'edit-externally'      => 'Едитязэ ачест фишиер фолосинд о апликацие екстернэ',
+'edit-externally' => 'Едитязэ ачест фишиер фолосинд о апликацие екстернэ',
 'edit-externally-help' => '(Везь [//www.mediawiki.org/wiki/Manual:External_editors инструкциунь де инсталаре] пентру май мулте информаций)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'тоате',
 'namespacesall' => 'тоате',
-'monthsall'     => 'тоате',
+'monthsall' => 'тоате',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Везь скимбэриле релеванте',
 'watchlisttools-edit' => 'Везь ши модификэ листа паӂинилор привите',
-'watchlisttools-raw'  => 'Модификэ листа брутэ а паӂинилор привите',
+'watchlisttools-raw' => 'Модификэ листа брутэ а паӂинилор привите',
 
 # Special:SpecialPages
 'specialpages' => 'Сервичий',
index f0ade8f..834d1ff 100644 (file)
@@ -36,6 +36,7 @@
  * @author Tusharpawar1982
  * @author V.narsikar
  * @author Vpnagarkar
+ * @author Ydyashad
  * @author Ynwala
  * @author अभय नातू
  * @author कोलࣿहापࣿरी
@@ -169,7 +170,6 @@ $magicWords = array(
        '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' ),
@@ -464,7 +464,6 @@ $messages = array(
 'qbbrowse' => 'न्याहाळा',
 'qbedit' => 'संपादन',
 'qbpageoptions' => 'हे पान',
-'qbpageinfo' => 'सामग्री',
 'qbmyoptions' => 'माझी पाने',
 'qbspecialpages' => 'विशेष पाने',
 'faq' => 'नेहमीची प्रश्नावली',
@@ -580,6 +579,7 @@ $1',
 'youhavenewmessages' => 'तुमच्यासाठी $1 ($2).',
 'newmessageslink' => 'नवीन संदेश',
 'newmessagesdifflink' => 'ताजा बदल',
+'newmessagesdifflinkplural' => 'मागिल {{PLURAL:$1|बदल}}',
 'youhavenewmessagesmulti' => '$1 वर तुमच्यासाठी नवीन संदेश आहेत.',
 'editsection' => 'संपादन',
 'editold' => 'संपादन',
@@ -708,16 +708,12 @@ $2',
 # Login and logout pages
 'logouttext' => "'''तुम्ही आता अदाखल झाला(logout)आहात.'''
 
-तुम्ही अनामिकपणे {{SITENAME}}चा उपयोग करत राहू शकता, किंवा त्याच अथवा वेगळ्या सदस्य नावाने [[Special:UserLogin| पुन्हा दाखल होऊ शकता]].
+तुम्ही अनामिकपणे {{SITENAME}}चा उपयोग करत राहू शकता, किंवा त्याच अथवा वेगळ्या सदस्य नावाने <span class='plainlinks'>[$1  पुन्हा दाखल होऊ शकता]</span>.
 आपण स्वत:च्या न्याहाळकाची सय (cache) रिकामी करत नाही तो पर्यंत काही पाने आपण अजून दाखल आहात, असे नुसतेच दाखवत राहू शकतील.",
-'welcomecreation' => '== सुस्वागतम, $1! ==
-
-तुमचे खाते उघडण्यात आले आहे.
-आपल्या [[Special:Preferences|{{SITENAME}} पसंती]] बदलण्यास विसरू नका.',
 'yourname' => 'तुमचे नाव',
 'yourpassword' => 'तुमचा परवलीचा शब्द',
 'yourpasswordagain' => 'तुमचा परवलीचा शब्द पुन्हा लिहा',
-'remembermypassword' => 'माझा प्रवेश या संगणकावर लक्षात ठेवा (जास्तीत जास्त $1 {{PLURAL:$1|दिवसासाठी|दिवसांसाठी}})',
+'remembermypassword' => 'माझा प्रवेश या संगणकावर लक्षात ठेवा (जास्तीत जास्त $1 {{PLURAL:$1|दिवस|दिवसांसाठी}})',
 'securelogin-stick-https' => 'प्रवेशानंतर एचटीटीपीएसच्या संपर्कात रहा',
 'yourdomainname' => 'तुमचे क्षेत्र (डॉमेन) :',
 'externaldberror' => 'विदागार ’खातरजमा’ (प्रमाणितीकरण) त्रुटी होती अथवा तुम्हाला तुमचे बाह्य खाते अद्ययावत  करण्याची परवानगी नाही.',
@@ -1193,7 +1189,7 @@ $1",
 
 # History merging
 'mergehistory' => 'पान ईतिहासांचे एकत्रिकरण करा',
-'mergehistory-header' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\8fà¤\95ा à¤¸à¥\8dरà¥\8bत à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤\87तिहास à¤\8fà¤\96ादà¥\8dया à¤¨à¤µà¤¿न पानात समाविष्ट करू देते.
+'mergehistory-header' => 'हà¥\87 à¤ªà¤¾à¤¨ à¤\8fà¤\95ा à¤¸à¥\8dरà¥\8bत à¤ªà¤¾à¤¨à¤¾à¤\9aा à¤\87तिहास à¤\8fà¤\96ादà¥\8dया à¤¨à¤µà¥\80न पानात समाविष्ट करू देते.
 हा बदल पानाचे ऐतिहासिक सातत्य राखेल याची दक्षता घ्या.',
 'mergehistory-box' => 'दोन पानांची आवर्तने संमिलीत करा:',
 'mergehistory-from' => 'स्रोत पान:',
@@ -1273,8 +1269,6 @@ $1",
 'search-interwiki-caption' => 'इतर प्रकल्प',
 'search-interwiki-default' => '$1चे निकाल:',
 'search-interwiki-more' => '(आणखी)',
-'search-mwsuggest-enabled' => 'सजेशन्स सहित',
-'search-mwsuggest-disabled' => 'सजेशन्स नाहीत',
 'search-relatedarticle' => 'जवळील',
 'mwsuggest-disable' => 'AJAX सजेशन्स रद्द करा',
 'searcheverything-enable' => 'सर्वनामविश्वांमध्ये शोधा:',
@@ -1696,7 +1690,7 @@ $1",
 जर तुमच्या कडे पूर्ण रिझोल्यूशनची संचिका असेल तर चढवा अथवा संचिकेचे नाव बदला.',
 'fileexists-forbidden' => 'या नावाची संचिका अगोदरच अस्तित्त्वात आहे; कृपया पुन्हा मागे जाऊन ही संचिका नवीन नावाने चढवा.
 [[File:$1|thumb|center|$1]]',
-'fileexists-shared-forbidden' => 'हà¥\87 à¤¨à¤¾à¤µ à¤\85सलà¥\87लà¥\80 à¤\8fà¤\95 à¤¸à¤\82à¤\9aिà¤\95ा à¤¶à¥\87à¤\85रà¥\8dड à¤¸à¤\82à¤\9aिà¤\95ा à¤\95à¥\8bशात à¤\86धà¥\80 à¤ªà¤¾à¤¸à¥\82न à¤\86हà¥\87; à¤\95à¥\83पया à¤ªà¤°à¤¤ à¤«à¤¿à¤°à¤¾ à¤\86णि à¤¨à¤µà¤¿à¤¨(वà¥\87à¤\97ळà¥\8dया) à¤¨à¤¾à¤µà¤¾à¤¨à¥\87 à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¥\81नà¥\8dहा à¤\9aढवा.[[File:$1|thumb|center|$1]]',
+'fileexists-shared-forbidden' => 'हà¥\87 à¤¨à¤¾à¤µ à¤\85सलà¥\87लà¥\80 à¤\8fà¤\95 à¤¸à¤\82à¤\9aिà¤\95ा à¤¶à¥\87à¤\85रà¥\8dड à¤¸à¤\82à¤\9aिà¤\95ा à¤\95à¥\8bशात à¤\86धà¥\80 à¤ªà¤¾à¤¸à¥\82न à¤\86हà¥\87; à¤\95à¥\83पया à¤ªà¤°à¤¤ à¤®à¤¾à¤\97à¥\87 à¤\9cा à¤\86णि à¤¨à¤µà¥\80न, à¤µà¥\87à¤\97ळà¥\8dया à¤¨à¤¾à¤µà¤¾à¤¨à¥\87 à¤¹à¥\80 à¤¸à¤\82à¤\9aिà¤\95ा à¤ªà¥\81नà¥\8dहा à¤\9aढवा. [[File:$1|thumb|center|$1]]',
 'file-exists-duplicate' => 'ही संचिका खालील {{PLURAL:$1|संचिकेची|संचिकांची}} प्रत आहे:',
 'file-deleted-duplicate' => 'या संचिकेसारखीच् संचिका ([[:$1]]) या आधी वगळण्यात आली आहे.
 हि संचिका पुनः चढवण्यापूर्वी आपण त्या संचिकेची वगळण्याची नोंद तपासावी.',
@@ -2163,6 +2157,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 'mailnologin' => 'पाठविण्याचा पत्ता नाही',
 'mailnologintext' => 'इतर सदस्यांना विपत्र(ई-मेल) पाठवण्याकरिता तुम्ही [[Special:UserLogin|प्रवेश केलेला]] असणे आणि  प्रमाणित (ई-मेल) पत्ता तुमच्या [[Special:Preferences|पसंतीत]] नमुद असणे आवश्यक आहे.',
 'emailuser' => 'या सदस्याला ई-मेल पाठवा',
+'emailuser-title-notarget' => 'विपत्र (ईमेल) उपयोगकर्ता',
 'emailpage' => 'विपत्र (ईमेल) उपयोगकर्ता',
 'emailpagetext' => 'जर या सदस्याने प्रमाणित विपत्र (ईमेल)पत्ता तीच्या अथवा त्याच्या सदस्य पसंतीत नमुद केला असेल,तर खालील सारणी तुम्हाला एक(च) संदेश पाठवेल.तुम्ही तुमच्या [[Special:Preferences|सदस्य पसंतीत]] नमुद केलेला विपत्र पत्ता "कडून" पत्त्यात येईल म्हणजे  प्राप्तकरता आपल्याला उत्तर देऊ शकेल.',
 'usermailererror' => 'पत्र बाब त्रुटी वापस पाठवली:',
@@ -2232,11 +2227,7 @@ Input:contenttype/subtype, e.g. <code>image/jpeg</code>.',
 
 'enotif_mailer' => '{{SITENAME}} सूचना विपत्र',
 'enotif_reset' => 'सर्व पानास भेट दिल्याचे नमुद करा',
-'enotif_newpagetext' => 'हे नवीन पान आहे.',
 'enotif_impersonal_salutation' => '{{SITENAME}} सदस्य',
-'changed' => 'बदलले',
-'created' => 'तयार केले',
-'enotif_subject' => '{{SITENAME}} पान $PAGETITLE $PAGEEDITOR ने $CHANGEDORCREATED आहे',
 'enotif_lastvisited' => 'तुमच्या शेवटच्या भेटीनंतरचे बदल बघणयासाठी पहा - $1.',
 'enotif_lastdiff' => 'हा बदल पहाण्याकरिता $1 पहा.',
 'enotif_anon_editor' => 'अनामिक उपयोगकर्ता $1',
@@ -2829,7 +2820,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'जावा स्क्रिप्ट तपासणी',
-'javascripttest-disabled' => 'हे कार्य अवरूद्ध केले आहे.',
 'javascripttest-title' => '$1 टेस्ट चालू आहेत',
 'javascripttest-pagetext-noframework' => 'हे पान जावा स्क्रिप्ट तपासणी साठी सुरक्षित केले आहे',
 'javascripttest-pagetext-unknownframework' => 'अज्ञात तपासणीचे ठिकाण $1',
@@ -2935,7 +2925,10 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" च्याबद्दल माहिती',
+'pageinfo-not-current' => 'माफ करा, जुन्या अवृतिला माहिती देणे अक्षक्य आहे|',
+'pageinfo-header-basic' => 'मूलभूत माहिती',
 'pageinfo-header-edits' => 'संपादने',
+'pageinfo-header-restrictions' => 'पान सुरक्षा',
 'pageinfo-views' => 'अभिप्रायांची संख्या',
 'pageinfo-watchers' => 'पाहणाऱ्यांची संख्या',
 'pageinfo-edits' => 'संपादनांची संख्या',
@@ -3734,7 +3727,7 @@ $5
 'sqlite-no-fts' => 'पूर्ण-मजकूर शोध समर्थनाविरहित $1',
 
 # New logging system
-'logentry-delete-delete' => '$1 वगळले पान $3',
+'logentry-delete-delete' => '$1 वगळलेले पान $3',
 'logentry-delete-restore' => '$1 restored पृष्ठ  $3',
 'logentry-delete-event' => ' $3: $4 वरील  {{PLURAL:$5|एका नोंद घटने |$5 lनोंद घटनां}} ची दृष्यता $1 बदलली',
 'logentry-delete-revision' => '$3: $4 पानावरील  {{PLURAL:$5|एका आवृत्ती |$5 lआवृत्यां}} ची दृष्यता $1 बदलली',
@@ -3780,6 +3773,10 @@ $5
 'feedback-bugcheck' => 'उत्तम! फक्त एकदा खात्री करा की हा [$1 अगोदरच माहिती असलेला बग] तर नाहीये.',
 'feedback-bugnew' => 'मी तपासले आहे. हा एक नवीन बग म्हणून नोंद करावी',
 
+# Search suggestions
+'searchsuggest-search' => 'शोधा',
+'searchsuggest-containing' => '.......हे असलेले',
+
 # API errors
 'api-error-badaccess-groups' => 'आपणास ह्या विकीवर संचिका चढवण्याची परवानगी नाही',
 'api-error-badtoken' => 'अंतर्गत चूक: अयोग्य टोकन',
index 77a7da9..cefe13a 100644 (file)
@@ -371,8 +371,6 @@ $messages = array(
 'search-interwiki-caption' => 'Техеньок проектвлӓ',
 'search-interwiki-default' => '$1 результ.:',
 'search-interwiki-more' => '(эче)',
-'search-mwsuggest-enabled' => 'согоньвлӓ доно',
-'search-mwsuggest-disabled' => 'согоньвлӓдеок',
 'nonefound' => "'''Шотыш нӓлдӓ.''' Нимат ак лиӓлт гӹнь, керӓл шамакым цилӓ вӓреок кӹчӓлӓш ак тӹнгӓл. Кӹчӓлжӹ манын,   ''all:'' префиксӹм кычылтда.  Тенге тӓ лӹмвлӓм мода (кӱ тишкӹ сирӓ, нӹнӹн Кӓнгӓшӹмӓшвлӓштӹмӓт, шаблонвлӓмӓт дӓ молымат), уке гӹнь, шукырак лӹмӹм анжыктыда",
 'powersearch' => 'Кымдан кӹчӓлмӓш',
 'powersearch-legend' => 'Кымдан кӹчӓлмӓш',
index c4d651e..7ac4d9e 100644 (file)
@@ -160,7 +160,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Perubahan_terkini' ),
        'Recentchangeslinked'       => array( 'Perubahan_berkaitan' ),
        'Revisiondelete'            => array( 'Hapus_semakan' ),
-       'RevisionMove'              => array( 'Pindah_semakan' ),
        'Search'                    => array( 'Gelintar' ),
        'Shortpages'                => array( 'Laman_pendek' ),
        'Specialpages'              => array( 'Laman_khas' ),
@@ -240,7 +239,7 @@ $messages = array(
 
 'underline-always' => 'Sentiasa',
 'underline-never' => 'Jangan',
-'underline-default' => 'Pelayar web utama',
+'underline-default' => 'Tetapan azali kulit/pelayar',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Gaya fon ruang sunting:',
@@ -257,7 +256,7 @@ $messages = array(
 'thursday' => 'Khamis',
 'friday' => 'Jumaat',
 'saturday' => 'Sabtu',
-'sun' => 'Aha',
+'sun' => 'Ahd',
 'mon' => 'Isn',
 'tue' => 'Sel',
 'wed' => 'Rab',
@@ -295,7 +294,7 @@ $messages = array(
 'may' => 'Mei',
 'jun' => 'Jun',
 'jul' => 'Jul',
-'aug' => 'Ogo',
+'aug' => 'Ogs',
 'sep' => 'Sep',
 'oct' => 'Okt',
 'nov' => 'Nov',
@@ -327,8 +326,8 @@ $messages = array(
 'newwindow' => '(dibuka di tetingkap baru)',
 'cancel' => 'Batalkan',
 'moredotdotdot' => 'Lagi...',
-'mypage' => 'Laman saya',
-'mytalk' => 'Perbualan saya',
+'mypage' => 'Halaman',
+'mytalk' => 'Perbualan',
 'anontalk' => 'Perbualan bagi IP ini',
 'navigation' => 'Pandu arah',
 'and' => '&#32;dan',
@@ -338,7 +337,6 @@ $messages = array(
 'qbbrowse' => 'Semak imbas',
 'qbedit' => 'Sunting',
 'qbpageoptions' => 'Laman ini',
-'qbpageinfo' => 'Konteks',
 'qbmyoptions' => 'Laman-laman saya',
 'qbspecialpages' => 'Laman khas',
 'faq' => 'Soalan Lazim',
@@ -351,7 +349,7 @@ $messages = array(
 'vector-action-protect' => 'Lindungi',
 'vector-action-undelete' => 'Batal hapus',
 'vector-action-unprotect' => 'Ubah perlindungan',
-'vector-simplesearch-preference' => 'Bolehkan cadangan carian lanjutan (kulit Vector sahaja)',
+'vector-simplesearch-preference' => 'Bolehkan bar carian ringkas (kulit Vector sahaja)',
 'vector-view-create' => 'Cipta',
 'vector-view-edit' => 'Sunting',
 'vector-view-history' => 'Lihat sejarah',
@@ -361,6 +359,7 @@ $messages = array(
 'namespaces' => 'Ruang nama',
 'variants' => 'Kelainan',
 
+'navigation-heading' => 'Menu pandu arah',
 'errorpagetitle' => 'Ralat',
 'returnto' => 'Kembali ke $1.',
 'tagline' => 'Daripada {{SITENAME}}.',
@@ -603,10 +602,10 @@ Pentadbir yang menguncinya memberikan penjelasan yang berikut: "$3".',
 # Login and logout pages
 'logouttext' => "'''Anda telah log keluar.'''
 
-Anda boleh terus menggunakan {{SITENAME}} sebagai pengguna tanpa nama, atau anda boleh [[Special:UserLogin|log masuk sekali lagi]] sebagai pengguna lain. Anda boleh membersihkan cache pelayar web anda sekiranya terdapat laman yang memaparkan seolah-olah anda masih log masuk.",
-'welcomecreation' => '== Selamat datang, $1! ==
-
-Akaun anda telah dibuka. Jangan lupa untuk mengubah [[Special:Preferences|keutamaan {{SITENAME}}]] anda.',
+Anda boleh terus menggunakan {{SITENAME}} sebagai pengguna tanpa nama, atau anda boleh <span class='plainlinks'>[$1 log masuk sekali lagi]</span> sebagai pengguna lain. Anda boleh membersihkan cache pelayar web anda sekiranya terdapat laman yang memaparkan seolah-olah anda masih log masuk.",
+'welcomeuser' => 'Selamat datang, $1!',
+'welcomecreation-msg' => 'Akaun anda telah dibuka.
+Jangan lupa untuk mengubah [[Special:Preferences|keutamaan anda di {{SITENAME}}]].',
 'yourname' => 'Nama pengguna:',
 'yourpassword' => 'Kata laluan:',
 'yourpasswordagain' => 'Ulangi kata laluan:',
@@ -874,7 +873,7 @@ Masukan log sekatan terakhir disediakan di bawah sebagai rujukan:',
 'note' => "'''Catatan:'''",
 'previewnote' => "'''Ingatlah bahawa ini hanya pralihat.'''
 Perubahan anda belum disimpan!",
-'continue-editing' => 'Teruskan menyunting',
+'continue-editing' => 'Pergi ke tempat menyunting',
 'previewconflict' => 'Paparan ini merupakan teks di bahagian atas dalam kotak sunting teks. Teks ini akan disimpan sekiranya anda memilih berbuat demikian.',
 'session_fail_preview' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi. Sila cuba lagi. Jika masalah ini berlanjutan, [[Special:UserLogout|log keluar]] dahulu, kemudian log masuk sekali lagi.'''",
 'session_fail_preview_html' => "'''Kami tidak dapat memproses suntingan anda kerana kehilangan data sesi.'''
@@ -953,6 +952,15 @@ Log penghapusan bagi laman ini dilampirkan di bawah untuk rujukan.',
 'edit-no-change' => 'Suntingan anda diabaikan kerana tiada perubahan dibuat pada teks tersebut.',
 'edit-already-exists' => 'Tidak dapat mencipta laman baru kerana ia telah wujud.',
 'defaultmessagetext' => 'Teks mesej asal',
+'content-failed-to-parse' => 'Kandungan $2 tidak dapat dihuraikan untuk model $1: $3',
+'invalid-content-data' => 'Data kandungan tidak sah',
+'content-not-allowed-here' => 'Kandungan "$1" tidak dibenarkan di halaman [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikiteks',
+'content-model-text' => 'teks biasa',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Amaran: Laman ini mengandungi terlalu banyak panggilan fungsi penghurai yang intensif.
@@ -1210,8 +1218,6 @@ Butirannya boleh didapati di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGEN
 'search-interwiki-caption' => 'Projek-projek lain',
 'search-interwiki-default' => 'Keputusan daripada $1:',
 'search-interwiki-more' => '(lagi)',
-'search-mwsuggest-enabled' => 'berserta cadangan',
-'search-mwsuggest-disabled' => 'tiada cadangan',
 'search-relatedarticle' => 'Berkaitan',
 'mwsuggest-disable' => 'Matikan ciri cadangan AJAX',
 'searcheverything-enable' => 'Cari dalam semua ruang nama',
@@ -1245,7 +1251,7 @@ Cuba berikan awalan ''all:'' untuk mencari semua kandungan (termasuk laman perbi
 
 # Preferences page
 'preferences' => 'Keutamaan',
-'mypreferences' => 'Keutamaan saya',
+'mypreferences' => 'Keutamaan',
 'prefs-edits' => 'Jumlah suntingan:',
 'prefsnologin' => 'Belum log masuk',
 'prefsnologintext' => 'Anda hendaklah <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} log masuk]</span> terlebih dahulu untuk menetapkan keutamaan.',
@@ -1475,9 +1481,12 @@ Tindakan ini tidak boleh dibatalkan.',
 
 # User rights log
 'rightslog' => 'Log hak pengguna',
-'rightslogtext' => 'Ini ialah log bagi perubahan hak pengguna.',
+'rightslogtext' => 'Ini ialah log perubahan terhadap hak pengguna.',
 'rightslogentry' => 'menukar keahlian kumpulan bagi $1 daripada $2 kepada $3',
 'rightslogentry-autopromote' => 'dinaik pangkat secara automatik dari $2 ke $3',
+'logentry-rights-rights' => '$1 menukar keahlian kumpulan untuk $3 dari $4 ke $5',
+'logentry-rights-rights-legacy' => '$1 menukar keahlian kumpulan untuk $3',
+'logentry-rights-autopromote' => '$1 dinaik pangkat secara automatik dari $4 ke $5',
 'rightsnone' => '(tiada)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1713,6 +1722,7 @@ Sila hubungi [[Special:ListUsers/sysop|pentadbir sistem]].',
 'backend-fail-notsame' => 'Satu fail yang tidak seiras sudah wujud di $1.',
 'backend-fail-invalidpath' => '$1 bukan laluan storan yang sah.',
 'backend-fail-delete' => 'Fail $1 tidak dapat dihapuskan.',
+'backend-fail-describe' => 'Metadata untuk fail "$1" tidak dapat diubah.',
 'backend-fail-alreadyexists' => 'Fail $1 sudah wujud.',
 'backend-fail-store' => 'Fail $1 tidak dapat distorkan di $2.',
 'backend-fail-copy' => 'Fail $1 tidak dapat disalin ke $2.',
@@ -1862,7 +1872,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.',
+'upload-disallowed-here' => 'Anda tidak boleh menggantikan fail ini.',
 
 # File reversion
 'filerevert' => 'Balikkan $1',
@@ -2098,7 +2108,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: <code>$1</code> (jangan bubuh sebarang protokol ini dalam carian anda)',
+Protokol yang disokong: <code>$1</code> (menjadi http:// jika tiada protokol dinyatakan).',
 'linksearch-line' => '$1 dipaut dari $2',
 'linksearch-error' => 'Kad bebas hanya boleh digunakan pada permulaan nama hos.',
 
@@ -2149,7 +2159,7 @@ terlebih dahulu dan mempunyai alamat e-mel yang sah dalam
 '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.
+'emailpagetext' => 'Gunakan borang berikut untuk mengirim pesanan e-mel kepada {{GENDER:$1|pengguna}} ini.
 
 Alamat e-mel yang ditetapkan dalam [[Special:Preferences|keutamaan anda]] akan digunakan sebagai alamat "Daripada" dalam e-mel tersebut supaya si penerima boleh membalasnya.',
 'usermailererror' => 'Objek Mail memulangkan ralat:',
@@ -2182,7 +2192,7 @@ Alamat e-mel yang ditetapkan dalam [[Special:Preferences|keutamaan anda]] akan d
 
 # Watchlist
 'watchlist' => 'Senarai pantau',
-'mywatchlist' => 'Senarai pantau saya',
+'mywatchlist' => 'Senarai pantau',
 'watchlistfor2' => 'Bagi $1 $2',
 'nowatchlist' => 'Tiada item dalam senarai pantau anda.',
 'watchlistanontext' => 'Sila $1 terlebih dahulu untuk melihat atau menyunting senarai pantau anda.',
@@ -2222,11 +2232,7 @@ Jika anda mahu membuang laman tersebut daripada senarai pantau, klik \"Nyahpanta
 
 'enotif_mailer' => 'Sistem Pemberitahuan {{SITENAME}}',
 'enotif_reset' => 'Tandakan semua laman sebagai telah dikunjungi',
-'enotif_newpagetext' => 'Ini adalah sebuah laman baru.',
 'enotif_impersonal_salutation' => 'Pengguna {{SITENAME}}',
-'changed' => 'diubah',
-'created' => 'dicipta',
-'enotif_subject' => 'Laman $PAGETITLE di {{SITENAME}} telah $CHANGEDORCREATED oleh $PAGEEDITOR',
 'enotif_lastvisited' => 'Lihat $1 untuk semua perubahan sejak kunjungan terakhir anda.',
 'enotif_lastdiff' => 'Rujuk $1 untuk melihat perubahan ini.',
 'enotif_anon_editor' => 'pengguna tanpa nama $1',
@@ -2410,7 +2416,7 @@ atau semakan tersebut telah dipulihkan atau dibuang daripada arkib.',
 'undeletedrevisions' => '$1 semakan dipulihkan',
 'undeletedrevisions-files' => '$1 semakan dan $2 fail dipulihkan',
 'undeletedfiles' => '$1 fail dipulihkan',
-'cannotundelete' => 'Penyahhapusan gagal; mungkin orang lain telah pun mengnyahhapuskannya.',
+'cannotundelete' => 'Penyahhapusan gagal: $1',
 'undeletedpage' => "'''$1 telah dipulihkan'''
 
 Sila rujuk [[Special:Log/delete|log penghapusan]] untuk rekod penghapusan terkini.",
@@ -2443,7 +2449,7 @@ $1',
 # Contributions
 'contributions' => 'Sumbangan pengguna',
 'contributions-title' => 'Sumbangan oleh $1',
-'mycontris' => 'Sumbangan saya',
+'mycontris' => 'Sumbangan',
 'contribsub2' => 'Oleh $1 ($2)',
 'nocontribs' => 'Tiada sebarang perubahan yang sepadan dengan kriteria-kriteria ini.',
 'uctop' => '(puncak)',
@@ -2482,7 +2488,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 pelencongan',
 'whatlinkshere-hidetrans' => '$1 penyertaan',
 'whatlinkshere-hidelinks' => '$1 pautan',
-'whatlinkshere-hideimages' => '$1 pautan imej',
+'whatlinkshere-hideimages' => '$1 pautan fail',
 'whatlinkshere-filters' => 'Penapis',
 
 # Block/unblock
@@ -2714,6 +2720,7 @@ Laman destinasi "[[:$1]]" telah pun wujud. Adakah anda mahu menghapuskannya supa
 'immobile-target-namespace-iw' => 'Pautan interwiki tidak boleh dijadikan sasaran untuk pemindahan laman.',
 'immobile-source-page' => 'Anda tidak boleh memindahkan laman ini.',
 'immobile-target-page' => 'Anda tidak boleh memindahkan laman ke tajuk itu.',
+'bad-target-model' => 'Destinasi yang dikehendaki menggunakan model kandungan yang berlainan. $1 tidak dapat ditukar kepada $2.',
 'imagenocrossnamespace' => 'Anda tidak boleh memindahkan fail ke ruang nama bukan fail',
 'nonfile-cannot-move-to-file' => 'Laman bukan fail tidak boleh dipindahkan ke ruang nama fail',
 'imagetypemismatch' => 'Sambungan baru fail tersebut tidak sepadan dengan jenisnya',
@@ -2839,7 +2846,6 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 
 # JavaScriptTest
 'javascripttest' => 'Ujian JavaScript',
-'javascripttest-disabled' => 'Fungsi ini belum dapat dihidupkan di wki ini.',
 'javascripttest-title' => 'Ujian $1 sedang dijalankan',
 'javascripttest-pagetext-noframework' => 'Laman ini ditempah untuk menjalankan ujian JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Kerangka "$1" tidak dikenali.',
@@ -2955,6 +2961,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 
 # Info page
 'pageinfo-title' => 'Maklumat untuk "$1"',
+'pageinfo-not-current' => 'Maaf, maklumat ini tidak dapat disediakan untuk semakan lama.',
 'pageinfo-header-basic' => 'Maklumat asas',
 'pageinfo-header-edits' => 'Sunting sejarah',
 'pageinfo-header-restrictions' => 'Perlindungan halaman',
@@ -2963,6 +2970,7 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'pageinfo-default-sort' => 'Kunci isih azali',
 'pageinfo-length' => 'Kepanjangan halaman (bait)',
 'pageinfo-article-id' => 'ID halaman',
+'pageinfo-language' => 'Bahasa isi kandungan halaman',
 'pageinfo-robot-policy' => 'Status enjin pencarian',
 'pageinfo-robot-index' => 'Boleh diindekskan',
 'pageinfo-robot-noindex' => 'Tidak boleh diindekskan',
@@ -2979,10 +2987,17 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 '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 ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'Kata sakti ($1)',
 'pageinfo-hidden-categories' => 'Kategori tersembunyi ($1)',
 'pageinfo-templates' => 'Templat tertransklusi ($1)',
+'pageinfo-toolboxlink' => 'Maklumat halaman',
+'pageinfo-redirectsto' => 'Melencong ke',
+'pageinfo-redirectsto-info' => 'maklumat',
+'pageinfo-contentpage' => 'Dikira sebagai halaman kandungan',
+'pageinfo-contentpage-yes' => 'Ya',
+'pageinfo-protect-cascading' => 'Perlindungan sedang melata dari sini',
+'pageinfo-protect-cascading-yes' => 'Ya',
+'pageinfo-protect-cascading-from' => 'Perlindungan sedang melata dari',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3005,6 +3020,8 @@ Simpan dalam komputer anda dan muat naiknya di sini.',
 'markedaspatrollederror' => 'Tidak boleh menanda ronda',
 'markedaspatrollederrortext' => 'Anda perlu menyatakan semakan untuk ditanda ronda.',
 'markedaspatrollederror-noautopatrol' => 'Anda tidak dibenarkan menanda ronda perubahan anda sendiri.',
+'markedaspatrollednotify' => 'Perubahan pada $1 ini telah ditandai sebagai dironda.',
+'markedaspatrollederrornotify' => 'Penandaan sebagai dironda gagal.',
 
 # Patrol log
 'patrol-log-page' => 'Log pemeriksaan',
@@ -3562,6 +3579,7 @@ Kod pengesahan ini akan luput pada $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Penyertaan pautan interwiki dilumpuhkan]',
 'scarytranscludefailed' => '[Gagal mendapatkan templat $1]',
+'scarytranscludefailed-httpstatus' => '[Ambilan templat gagal untuk $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL terlalu panjang]',
 
 # Delete conflict
@@ -3684,6 +3702,7 @@ Anda juga boleh [[Special:EditWatchlist|menggunakan penyunting piawai]].',
 'version-license' => 'Lesen',
 'version-poweredby-credits' => "Wiki ini dikuasakan oleh '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
 'version-poweredby-others' => 'penyumbang-penyumbang lain',
+'version-credits-summary' => 'Kami ingin mengucapkan sekalung budi kepada mereka yang berikut atas sumbangan mereka keada [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki adalah perisian bebas; anda boleh mengedarkannya semula dan/atau mengubah suainya di bawah terma-terma Lesen Awam GNU sebagai mana yang telah diterbitkan oleh Yayasan Perisian Bebas, sama ada versi 2 bagi Lesen tersebut, atau (berdasarkan pilihan anda) mana-mana versi selepasnya.
 
 MediaWiki diedarkan dengan harapan bahawa ia berguna, tetapi TANPA SEBARANG WARANTI; hatta waranti yang tersirat bagi KEBOLEHDAGANGAN mahupun KESESUAIAN UNTUK TUJUAN TERTENTU. Sila lihat Lesen Awam GNU untuk butiran lanjut.
@@ -3825,9 +3844,9 @@ Imej ditunjuk dalam leraian penuh, jenis fail yang lain dibuka dengan atur cara
 'logentry-move-move_redir-noredirect' => '$1 mengalihkan laman $3 ke $4 pada satu lencongan tanpa meninggalkan lencongan',
 'logentry-patrol-patrol' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda',
 'logentry-patrol-patrol-auto' => '$1 menandakan semakan $4 daripada laman $3 sebagai dironda secara automatik',
-'logentry-newusers-newusers' => '$1 membuka akaun pengguna',
-'logentry-newusers-create' => '$1 membuka akaun pengguna',
-'logentry-newusers-create2' => '$1 membuka akaun pengguna $3',
+'logentry-newusers-newusers' => 'Akaun pengguna $1 dibuka',
+'logentry-newusers-create' => 'Akaun pengguna $1 dibuka',
+'logentry-newusers-create2' => 'Akaun pengguna $3 dibuka oleh $1',
 'logentry-newusers-autocreate' => 'Akaun $1 dibuka secara automatik',
 'newuserlog-byemail' => 'kata laluan dihantar melalui e-mel',
 
@@ -3847,6 +3866,10 @@ Ataupun, anda boleh menggunakan borang yang mudah di bawah. Ulasan anda akan dic
 'feedback-bugcheck' => 'Bagus! Cuma pastikan itu bukan salah satu [$1 pepijat] yang sedia diketahui.',
 'feedback-bugnew' => 'Saya dah semak. Laporkan pepijat baru',
 
+# Search suggestions
+'searchsuggest-search' => 'Cari',
+'searchsuggest-containing' => 'mengandungi...',
+
 # API errors
 'api-error-badaccess-groups' => 'Anda tidak dibenarkan memuat naik fail di wiki ini.',
 'api-error-badtoken' => 'Ralat dalaman: token tak elok.',
index fd59cc0..6955572 100644 (file)
@@ -418,7 +418,6 @@ $messages = array(
 'qbbrowse' => 'Qalleb',
 'qbedit' => 'Immodifika',
 'qbpageoptions' => 'Din il-paġna',
-'qbpageinfo' => 'Kuntest',
 'qbmyoptions' => 'Il-paġni tiegħi',
 'qbspecialpages' => 'Paġni speċjali',
 'faq' => 'Mistoqsijiet komuni',
@@ -664,11 +663,8 @@ Ir-raġuni li ġiet mogħtija kienet ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Bħalissa tinsab barra mill-kont tiegħek.'''
 
-Tista' tkompli tuża' {{SITENAME}} bħala utent anonimu, jew tista' terġa [[Special:UserLogin|tidħol]] bħala l-istess utent jew wieħed differenti.
+Tista' tkompli tuża' {{SITENAME}} bħala utent anonimu, jew tista' terġa <span class='plainlinks'>[$1 tidħol]</span> bħala l-istess utent jew wieħed differenti.
 Kun af li ċerti paġni jistgħu jkomplu jidhru bħallikieku l-illogjar 'l barra mill-kont qatt ma seħħ, sakemm ma tħassarx il-cache tal-browser.",
-'welcomecreation' => "== Merħba, $1! ==
-Il-kont tiegħek ġie maħluq.<br />
-Tinsiex tippersonalizza l-[[Special:Preferences|preferenzi]] ta' {{SITENAME}}.",
 'yourname' => 'Isem tal-utent:',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => "Erġa' ikteb il-password:",
@@ -1195,7 +1191,7 @@ Nota li l-użu tal-links tan-navigazzjoni jagħmel reset tal-kolonna.",
 'mergehistory-reason' => 'Raġuni:',
 
 # Merge log
-'mergelog' => "Reġistru ta' twaħħid",
+'mergelog' => 'Twaħħid',
 'pagemerge-logentry' => "waħħad [[$1]] ma' [[$2]] (reviżjonijiet sa $3)",
 'revertmerge' => 'Infired',
 'mergelogpagetext' => "Hawn taħt hawn lista ta' l-aktar tgħaqqid riċenti ta' paġna waħda ta' storja f'oħra.",
@@ -1253,8 +1249,6 @@ Nota li l-użu tal-links tan-navigazzjoni jagħmel reset tal-kolonna.",
 'search-interwiki-caption' => 'Proġetti kuġini',
 'search-interwiki-default' => "Riżultati ta' $1:",
 'search-interwiki-more' => '(aktar)',
-'search-mwsuggest-enabled' => 'bis-suġġerimenti',
-'search-mwsuggest-disabled' => 'l-ebda suġġeriment',
 'search-relatedarticle' => 'Relatati',
 'mwsuggest-disable' => 'Neħħi suġġeriment tal-AJAX',
 'searcheverything-enable' => 'Fittex fl-ispazji tal-isem kollha',
@@ -1517,8 +1511,9 @@ Hawnhekk hawn valur iġġenerat b'mod każwali li inti tista' tuża: $1",
 # User rights log
 'rightslog' => 'Drittijiet tal-utenti',
 'rightslogtext' => "Dan huwa r-reġistru tal-modifiki ta' drittijiet tal-utenti.",
-'rightslogentry' => "biddel is-sħubija ta' $1 mill-grupp $2 għall-grupp $3",
+'rightslogentry' => "biddel is-sħubija ta' $1 minn $2 għal $3",
 'rightslogentry-autopromote' => 'ġie awtomatikament promoss minn $2 għal $3',
+'logentry-rights-rights' => "$1 biddel is-sħubija ta' $3 minn $4 għal $5",
 'rightsnone' => '(xejn)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1944,15 +1939,16 @@ Daħħal: tip/sottotip, eż. <code>image/jpeg</code>.",
 '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]]",
 
-'doubleredirects' => 'Riindirizzi doppji',
-'doubleredirectstext' => 'Din il-paġna telenka dawk il-paġni li jindirizzaw lejn paġna oħra ta\' riindirizzament.
-Kull filliera għandha ħolqa għall-ewwel u t-tieni riindirizz, kif ukoll fejn tirrindirizza t-tieni paġna, is-soltu magħrufa bħalha l-paġna "reali" fejn se twassal, fejn suppost l-ewwel riindirizz għandu jipponta.',
+'doubleredirects' => 'Rindirizzi doppji',
+'doubleredirectstext' => 'Din il-paġna telenka dawk il-paġni li jindirizzaw lejn paġna oħra ta\' rindirizzament.
+Kull filliera għandha ħolqa għall-ewwel u t-tieni rindirizz, kif ukoll fejn tirrindirizza t-tieni paġna, is-soltu magħrufa bħalha l-paġna "reali" fejn se twassal, fejn suppost l-ewwel rindirizz għandu jipponta.
+Daħliet <del>maqtugħa</del> saritilhom it-tiswija.',
 'double-redirect-fixed-move' => '[[$1]] ġie mmexxi awtomatikament, issa hu rindirizz għal [[$2]]',
 'double-redirect-fixed-maintenance' => "Tiswija ta' rindirizz doppju minn [[$1]] għal [[$2]].",
 'double-redirect-fixer' => "Tiswija ta' rindirizz",
 
-'brokenredirects' => 'Riindirizzi ħżiena',
-'brokenredirectstext' => 'Ir-riindirizzi segwenti għandhom ħoloq għal paġni ineżistenti:',
+'brokenredirects' => 'Rindirizzi ħżiena',
+'brokenredirectstext' => 'Ir-rindirizzi segwenti għandhom ħoloq lejn paġni li ma jeżistux:',
 'brokenredirects-edit' => 'editja',
 'brokenredirects-delete' => 'ħassar',
 
@@ -2204,11 +2200,7 @@ Jekk f'xi ħin tkun tixtieq tneħħi l-paġna mil-lista ta' osservazzjoni tiegħ
 
 'enotif_mailer' => "Sistema ta' notifikazzjoni bl-użu tal-posta elettronika fuq {{SITENAME}}",
 'enotif_reset' => 'Immarka l-paġni kollha bħala diġà viżitati',
-'enotif_newpagetext' => 'Din hija paġna ġdida.',
 'enotif_impersonal_salutation' => "Utent ta' {{SITENAME}}",
-'changed' => 'modifikata',
-'created' => 'inħolqot',
-'enotif_subject' => 'Il-Paġna $PAGETITLE ta\' {{SITENAME}} ġiet $CHANGEDORCREATED minn $PAGEEDITOR',
 'enotif_lastvisited' => 'Ara $1 għal modifiki kollha mill-aħħar żjara.',
 'enotif_lastdiff' => 'Ara $1 biex tara din l-modifika.',
 'enotif_anon_editor' => 'utent anonimu $1',
@@ -2656,9 +2648,9 @@ Jekk jogħġbok, waħħad iż-żewġ paġni manwalment.'''",
 'move-talk-subpages' => "Mexxi is-sottopaġni kollha tal-paġna ta' diskussjoni (sa $1)",
 '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-page-unmoved' => 'Il-paġna $1 ma setgħetx titmexxa lejn $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.}}",
-'movelogpage' => "Reġistru tat-tmexxija ta' paġni",
+'movelogpage' => "Tmexxija ta' paġni",
 'movelogpagetext' => "Hawn taħt jinsab lista ta' paġni mċaqilqa.",
 'movesubpage' => '{{PLURAL:$1|Sottopaġna|Sottopaġna}}',
 'movesubpagetext' => 'Din il-paġna għandha $1 {{PLURAL:$1|sottopaġna murija|sottopaġni murija}} hawn taħt:',
@@ -2793,7 +2785,6 @@ Kull azzjonijiet ta' importazzjoni tal-transwiki jiġu reġistrati fil-[[Special
 
 # 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:',
@@ -3761,6 +3752,10 @@ 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',
 
+# Search suggestions
+'searchsuggest-search' => 'Fittex',
+'searchsuggest-containing' => 'li tinkludi...',
+
 # 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.',
index ac69cb0..18e0686 100644 (file)
@@ -211,7 +211,6 @@ $messages = array(
 'qbbrowse' => 'Nabegar',
 'qbedit' => 'Eiditar',
 'qbpageoptions' => 'Esta páigina',
-'qbpageinfo' => 'Cuntesto',
 'qbmyoptions' => 'Mies páiginas',
 'qbspecialpages' => 'Páiginas speciales',
 'faq' => 'FAQ',
@@ -567,8 +566,6 @@ Legenda: (atu) = defrénças de la berson atual,
 'search-interwiki-caption' => 'Porjetos armanos',
 'search-interwiki-default' => 'Resultados de $1:',
 'search-interwiki-more' => '(mais)',
-'search-mwsuggest-enabled' => 'cun sugestones',
-'search-mwsuggest-disabled' => 'sien sugestones',
 'searchall' => 'todos',
 'nonefound' => "'''Abiso''': solo alguns spácios nominales son percurados por oumisson. Spurmenta outelizar l perfixo ''all:'' na percura, pa percurar por todos ls cuntenidos desta Biqui (até páiginas de çcusson, modelos etc), ó mesmo, outelizando l spácio nominal que queiras cumo perfixo.",
 'powersearch' => 'Percura Abançada',
@@ -878,9 +875,6 @@ Altaraçones feturas na tal páigina i páiginas de çcusson a eilha associadas
 'watching' => 'A begiar...',
 'unwatching' => 'A deixar de begiar...',
 
-'changed' => 'demudada',
-'created' => 'criada',
-
 # Delete
 'deletepage' => 'Botar fuora páigina',
 'delete-confirm' => 'Botar fuora "$1"',
index 65b112e..2eac463 100644 (file)
@@ -191,7 +191,6 @@ $messages = array(
 'qbbrowse' => 'ရှာဖွေလှန်လှောရန်',
 'qbedit' => 'ပြင်​ဆင်​ရန်​',
 'qbpageoptions' => 'ဤစာမျက်နှာ',
-'qbpageinfo' => 'မာတိကာ',
 'qbmyoptions' => 'ကျွန်ုပ် စာမျက်နှာများ',
 'qbspecialpages' => 'အ​ထူး​စာ​မျက်​နှာ​',
 'faq' => 'မေးလေ့ရှိကြသည်များ',
@@ -376,12 +375,9 @@ $1',
 'virus-unknownscanner' => 'အမည်မသိအန်တီဗိုင်းရပ်စ် -',
 
 # Login and logout pages
-'logouttext' => 'သင်သည် လော့ဂ်အောက် လုပ်လိုက်ပြီဖြစ်သည်။
-သင့်အနေနှင့် ဤ {{SITENAME}} ဝက်ဘ်ဆိုက်ဒ်ကို အမည်မသိ အသုံးပြုသူ အနေနှင့် ဆက်လက် အသုံးပြုနိုင်သည်။ သို့မဟုတ် ယခင် အသုံးပြုသူ အမည် သို့ အသုံးပြုသူ အခြားအမည်တစ်ခုဖြင့် [[Special:UserLogin|နောက်တစ်ကြိမ် လော့ဂ်အင်ပြန်ဝင်]] နိုင်သည်။
-သင်၏ ဘရောက်ဆာမှ cache ကို ရှင်းလင်းသည့် အချိန် အထိ အချို့သော စာမျက်နှာ များသည် သင် လော့ဂ်အင် ဝင်ထားစဉ်က အတိုင်းပင် ဆက်လက် ပြသနေမည်ဖြစ်သည်။',
-'welcomecreation' => '== မင်္ဂလာပါ $1! ==
-သင့်အကောင့်ကို ဖန်တီးပြီးပါပြီ။
-[[Special:Preferences|{{SITENAME}} စိတ်​ကြိုက်​ရွေးချယ်စရာတို့]]ကို ပြောင်းရန် မမေ့ပါနှင့်။',
+'logouttext' => "သင်သည် လော့ဂ်အောက် လုပ်လိုက်ပြီဖြစ်သည်။
+သင့်အနေနှင့် ဤ {{SITENAME}} ဝက်ဘ်ဆိုက်ဒ်ကို အမည်မသိ အသုံးပြုသူ အနေနှင့် ဆက်လက် အသုံးပြုနိုင်သည်။ သို့မဟုတ် ယခင် အသုံးပြုသူ အမည် သို့ အသုံးပြုသူ အခြားအမည်တစ်ခုဖြင့် <span class='plainlinks'>[$1 နောက်တစ်ကြိမ် လော့ဂ်အင်ပြန်ဝင်]</span> နိုင်သည်။
+သင်၏ ဘရောက်ဆာမှ cache ကို ရှင်းလင်းသည့် အချိန် အထိ အချို့သော စာမျက်နှာ များသည် သင် လော့ဂ်အင် ဝင်ထားစဉ်က အတိုင်းပင် ဆက်လက် ပြသနေမည်ဖြစ်သည်။",
 'yourname' => 'အသုံးပြုသူအမည် -',
 'yourpassword' => 'စကားဝှက် -',
 'yourpasswordagain' => 'စကားဝှက် ပြန်​ရိုက်​ပါ -',
@@ -691,8 +687,6 @@ Legend: '''({{int:cur}})''' = နောက်ဆုံးမူနှင့် 
 'search-interwiki-caption' => 'ညီအစ်မ ပရောဂျက်များ',
 'search-interwiki-default' => 'ရလဒ် $1 ခု -',
 'search-interwiki-more' => '(နောက်ထပ်)',
-'search-mwsuggest-enabled' => 'အကြံပြုချက်များနှင့်တကွ',
-'search-mwsuggest-disabled' => 'အကြံပြုချက် မရှိပါ',
 'search-relatedarticle' => 'ဆက်နွယ်သော',
 'mwsuggest-disable' => 'AJAX အကြံပြုချက်များကို ပိတ်ထားရန်',
 'searcheverything-enable' => 'အမည်ညွှန်းအားလုံးတွင် ရှာရန်',
@@ -1324,10 +1318,7 @@ Your e-mail address is not revealed when other users contact you.
 'watching' => 'စောင့်ကြည့်လျက်ရှိ...',
 'unwatching' => 'စောင့်မကြည့်တော့...',
 
-'enotif_newpagetext' => 'ဤသည်မှာ စာမျက်နှာအသစ်ဖြစ်သည်။',
 'enotif_impersonal_salutation' => '{{SITENAME}} အသုံးပြုသူ',
-'changed' => 'ပြောင်းလဲလိုက်သည်',
-'created' => 'ဖန်တီးလိုက်သည်',
 'enotif_anon_editor' => 'အမည်မသိ အသုံးပြုသူ $1',
 
 # Delete
index f908fdc..e429ef2 100644 (file)
@@ -202,16 +202,16 @@ $messages = array(
 'tog-showtoc' => 'Невтемс сёрмадовкс потмокс (лопатненень, конатнесэ 3-до ламо сёрмадовкст)',
 'tog-rememberpassword' => 'Ледстемс совамо валом те бравзерсэнть (сех кувать $1 {{PLURAL:$1|чи|чить}})',
 'tog-watchcreations' => 'Совавтомс ванома лемрисьмезэнь монь теевть лопатнень ды сень, мезе йовкстан',
-'tog-watchdefault' => 'Совавтомс монь витевть лопатнень ванома лем рисьмезэнь',
-'tog-watchmoves' => 'Ð\9bопанÑ\82Ñ\8c Ð»Ð¸Ñ\8fкÑ\81Ñ\82омÑ\82Ñ\81а, Ñ\81овавÑ\82Ñ\8bк Ð²Ð°Ð½Ð¾Ð¼Ð° Ð»ÐµÐ¼ рисьмезэнь',
-'tog-watchdeletion' => 'Ð\9bопанÑ\82Ñ\8c Ð½Ð°Ñ\80даÑ\81а, Ñ\81овавÑ\82Ñ\8bк Ñ\81онзÑ\8d Ð²Ð°Ð½Ð¾Ð¼Ð° Ð»ÐµÐ¼ рисьмезэнь',
+'tog-watchdefault' => 'Совавтомс монь витевть лопатнень ванома лемрисьмезэнь',
+'tog-watchmoves' => 'СовавÑ\82омÑ\81 Ð¼Ð¾Ð½Ñ\8c Ð¾Ð´Ð¾Ð² Ð»ÐµÐ¼Ð´Ñ\8fвÑ\82 Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c-кеÑ\80Ñ\8cмазÑ\82нÑ\8dнÑ\8c Ð²Ð°Ð½Ð¾Ð¼Ð° Ð»ÐµÐ¼рисьмезэнь',
+'tog-watchdeletion' => 'СовавÑ\82омÑ\81 Ð¼Ð¾Ð½Ñ\8c Ð½Ð°Ñ\80давÑ\82 Ð»Ð¾Ð¿Ð°Ñ\82ненÑ\8c-кеÑ\80Ñ\8cмазÑ\82нÑ\8dнÑ\8c Ð²Ð°Ð½Ð¾Ð¼Ð° Ð»ÐµÐ¼рисьмезэнь',
 'tog-minordefault' => 'Тешкстамс витевкстнэнь апокшкэкс, бути лиякс апак ёвта',
 'tog-previewontop' => 'Невтемс сёрмадовксонть васнянь невтевксэнь вальманть витеманьседенть икеле',
 'tog-previewonfirst' => 'Васнянь невтевкс васенцеде витнемстэ-петнемстэ',
 'tog-nocache' => 'Лоткавтомс браузерэнь лопань кешировамонть',
-'tog-enotifwatchlistpages' => 'Ð\9fаÑ\87Ñ\82Ñ\8fмÑ\81 Ðµ-Ñ\81Ñ\91Ñ\80ма, Ð·Ñ\8fÑ\80до Ð²Ð°Ð½Ñ\81Ñ\82нема Ð»Ð¾Ð¿Ð°Ð·Ð¾Ð½ теевить лиякстомтомат',
+'tog-enotifwatchlistpages' => 'Ð\9aÑ\83Ñ\87омÑ\81 Ñ\82енÑ\8c Ñ\91ндол-Ñ\81Ñ\91Ñ\80мине, Ð·Ñ\8fÑ\80до Ð²Ð°Ð½Ñ\81Ñ\82нема Ð»ÐµÐ¼Ñ\80иÑ\81Ñ\8cменÑ\8c Ð»Ð¾Ð¿Ð°Ñ\82неÑ\81-кеÑ\80Ñ\8cмазÑ\82нÑ\8dÑ\81 теевить лиякстомтомат',
 'tog-enotifusertalkpages' => 'Пачтямс е-сёрма теицянь ванома лемрисьмесэнь теезь лиякстомтоматнеде',
-'tog-enotifminoredits' => 'Ð\9fаÑ\87Ñ\82Ñ\8fмÑ\81 Ðµ-Ñ\81Ñ\91Ñ\80маÑ\81о Ð»Ð¸Ñ\8fкÑ\81Ñ\82омÑ\82омаÑ\82неде, Ñ\81еÑ\81Ñ\82Ñ\8dÑ\8fк Ð·Ñ\8fÑ\80до Ð°Ð¿Ð¾ÐºÑ\88кÑ\8bнеÑ\82Ñ\8c',
+'tog-enotifminoredits' => 'Ð\9aÑ\83Ñ\87омÑ\81 Ñ\82енÑ\8c Ñ\91ндол-Ñ\81Ñ\91Ñ\80мине Ñ\81еÑ\81Ñ\82Ñ\8dÑ\8fк, Ð·Ñ\8fÑ\80до Ð°Ð¿Ð¾ÐºÑ\88кÑ\8bне Ð²Ð¸Ñ\82немаÑ\82-пеÑ\82немаÑ\82 Ñ\82еевиÑ\82Ñ\8c Ð¼Ð¾Ð½Ñ\8c Ð²Ð°Ð½Ñ\81Ñ\82евÑ\82Ñ\8c Ð»Ð¾Ð¿Ð°Ñ\82неÑ\81Ñ\8d-кеÑ\80Ñ\8cмазÑ\82нÑ\8dÑ\81Ñ\8d',
 'tog-enotifrevealaddr' => 'Штавтомс е-сёрмань адресэм яволявтомань сёрмадовкстнэсэ',
 'tog-shownumberswatching' => 'Невтемс зяро теицятнеде, конат аравтызь лопанть эсест ванома лемрисьментень',
 'tog-oldsig' => 'Уликс кедьпутовксось:',
@@ -319,7 +319,7 @@ $messages = array(
 'cancel' => 'Саемс мекев',
 'moredotdotdot' => 'Седе ламо...',
 'mypage' => 'Монь лопам',
-'mytalk' => 'Ð\9cонÑ\8c ÐºÐ¾Ñ\80Ñ\82амом',
+'mytalk' => 'Ð\9aоÑ\80Ñ\82немам',
 'anontalk' => 'Кортамс те IP-нть марто',
 'navigation' => 'Навигация',
 'and' => '&#32;ды',
@@ -329,7 +329,6 @@ $messages = array(
 'qbbrowse' => 'Ваномо-тееме',
 'qbedit' => 'Витнеме-петнеме',
 'qbpageoptions' => 'Те лопась',
-'qbpageinfo' => 'Косо-зярдо',
 'qbmyoptions' => 'Монь лопан',
 'qbspecialpages' => 'Башка тевень лопат',
 'faq' => 'Сеедьстэ кепедень кевкстемат',
@@ -509,7 +508,7 @@ $messages = array(
 'badtitletext' => 'Вешезь лопанть лемезэ аволь виде, чаво, эли аволь видестэ сюлмазь келеньйутковань эли интервикинь лем. Паряк, лемсэнть тевс нолдазь анолдавикс тешкст.',
 'viewsource' => 'Ванномс лисьмапрянть',
 'actionthrottled' => 'Тев тееманть курокксчизэ киртязь',
-'protectedpagetext' => 'Те лопась панжома экшсэ, илязо понго витнемс - петнемс киненьгак.',
+'protectedpagetext' => 'Те лопась панжома экшсэ, илязо понго витнемс-петнемс эли лия тевс.',
 'viewsourcetext' => 'Те лопанть лисьмапрясь маштови ваномскак, лангстонзо саемс копияяк:',
 'sqlhidden' => '(SQL вешнемась кекшезь)',
 'ns-specialprotected' => '{{ns:special}} лем марто лопатне а витневить-петневить.',
@@ -521,9 +520,7 @@ $messages = array(
 'virus-unknownscanner' => 'апак содань антивирус:',
 
 # Login and logout pages
-'welcomecreation' => '== Совак, инеськеть, $1! ==
-Совамотаркат теезь.
-Иля стувто полавтнемс эсеть [[Special:Preferences|{{SITENAME}} ладсематнень]].',
+'welcomeuser' => 'Совак, $1, инеськеть!',
 'yourname' => 'Теицянь лем:',
 'yourpassword' => 'Салава валот:',
 'yourpasswordagain' => 'Омбоцеде сёрмадык кирдицянь леметь:',
@@ -689,11 +686,16 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 [{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} вешнемс малавикс журналтнэстэ],
 эли [{{fullurl:
 {{FULLPAGENAME}}|action=edit}} витнемс-петнемс те лопанть]</span>.',
+'noarticletext-nopermission' => 'Те лопасонть сёрмадовкс арась.
+Мусак [[Special:Search/{{PAGENAME}}|вешнемс  файлань те коняксонть]] лия сёрмадовкстнэстэ эли
+<span class="plainlinks">
+[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} вешнемс малавикс журналтнэстэ]</span>. Ялатеке тонеть а мерить шкамс те лопанть.',
 'updated' => '(Одолгавтозь)',
 'note' => "'''Явт мель:'''",
 'previewnote' => "'''Кирдтяя мельсэ, те ансяк васнянь невтевкс.'''
 Полавтоматне зярс апак вансто!",
 'editing' => 'Витнят-петнят $1',
+'creating' => 'Шки-теи «$1»',
 'editingsection' => 'Витнеме-петнеме $1 (секциянть)',
 'editingcomment' => 'Витнят-петнят $1 (од явкс)',
 'editconflict' => 'Витнемадо-петнемадо аладямо: $1',
@@ -774,6 +776,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'rev-showdeleted' => 'невтемс',
 'revisiondelete' => 'Нардамс/вельмевтемс лиякстомтоматнень',
 'revdelete-nologtype-title' => 'Журнал типесь апак максо',
+'revdelete-show-file-confirm' => 'Алкукс ули мелеть ваномс «<nowiki>$1</nowiki>» керьмазонть нардазь ревизиянзо, конась саезь $2-нть эйстэ ды ашти тесэ $3?',
+'revdelete-show-file-submit' => 'Ули',
 'revdelete-selected' => "'''[[:$1]]-нь {{PLURAL:$2|Кочкань лиякстомтомась|Кочкань лиякстомтоматне}}:'''",
 'revdelete-legend' => 'Аравтомс неявомачынь петне',
 'revdelete-hide-text' => 'Кекшемс лиякстомтомань текстэнть',
@@ -815,6 +819,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 
 # Diffs
 'history-title' => '"$1"-нь полавтнемань историязо',
+'difference-multipage' => '(Мейсэ лопатне явовить)',
 'lineno' => 'Киксэсь $1:',
 'compareselectedversions' => 'Кочказь версиятнень аравтомс карадо-каршо',
 'editundo' => 'Велявтомс мекев мезе витнинь-петнинь',
@@ -851,19 +856,18 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 '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-redirect' => '(йутавтт $1-с)',
 'search-section' => '(пелькс $1)',
 'search-suggest' => 'Истя мерикскелить: $1',
 'search-interwiki-caption' => 'Дугакс проектт',
 'search-interwiki-default' => '$1 савкс:',
 'search-interwiki-more' => '(седе ламо)',
-'search-mwsuggest-enabled' => 'ушодкс марто',
-'search-mwsuggest-disabled' => 'ушодкстомо',
 'search-relatedarticle' => 'Малавикс',
 'searcheverything-enable' => 'Вешнемс весе лем потмотнестэ',
 'searchrelated' => 'малавикс',
 'searchall' => 'весе',
-'showingresultsheader' => '',
+'showingresultsheader' => "{{PLURAL:$5|муевсь '''$1''' вана '''$3'''-тнень эйстэ|муевсть '''$1 - $2''' '''$3'''-тнень эйстэ}} '''$4''' вешнеманть лангс",
 'nonefound' => "'''Ванта''': Башка лем потмонь апак аравто ансяк кона-кона лем потмот понгить вешнэма таркакс.
 Аравтта вешнэма икельксэкс ''all:'', зярдо мель саят вешнэмс эрьва кодамо таркасто (сайсынек: кортнема лопатнень, лопа парцунтнэнь, ды седе тов), лиякс аравтыка эрявикс лем потмонть вешнэма икельксэкс.",
 'search-nonefound' => 'Те вешнема лангс мезеяк эзь муеве.',
@@ -886,7 +890,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 
 # Preferences page
 'preferences' => 'Лия ютксто явома',
-'mypreferences' => 'Ð\9cейÑ\81Ñ\8d Ñ\8fвован Ð»Ð¸Ñ\8fÑ\82ненÑ\8c Ñ\8dйÑ\81Ñ\82Ñ\8d',
+'mypreferences' => 'Ð\90Ñ\80авÑ\82омаÑ\82',
 'prefs-edits' => 'Зяроксть витнезь-петнезь:',
 'prefsnologin' => 'Эзить сова',
 'changepassword' => 'Салавань валонь полавтома',
@@ -895,6 +899,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'datedefault' => 'Икелькс вешема арась',
 'prefs-beta' => 'Бета ёнкст-мезть',
 'prefs-datetime' => 'Чи ды шка',
+'prefs-user-pages' => 'Теицянть лопанзо',
 'prefs-personal' => 'Теицядо',
 'prefs-rc' => 'Чиень полавтнемат',
 'prefs-watchlist' => 'Ванома лемрисьме',
@@ -929,7 +934,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'timezoneregion-europe' => 'Эвропа',
 'timezoneregion-indian' => 'Индиянь иневедь',
 'timezoneregion-pacific' => 'Сэтьме иневедь',
-'prefs-searchoptions' => 'Вешнемань аравтомкат',
+'prefs-searchoptions' => 'Вешнем',
 'prefs-namespaces' => 'Лем потмот',
 'default' => 'зярдо лиякс апак йовта',
 'prefs-files' => 'Файлат',
@@ -976,8 +981,9 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'group-bureaucrat' => 'Бюрократт',
 'group-all' => '(весе)',
 
-'group-user-member' => 'cовиця',
-'group-autoconfirmed-member' => 'Сонсь кемекстазь сёрмадыця',
+'group-user-member' => '{{GENDER:$1|теиця}}',
+'group-autoconfirmed-member' => '
+{{GENDER:$1|сонсь кемекставиця теиця}}',
 'group-bot-member' => 'Бот',
 'group-sysop-member' => 'Администратор',
 'group-bureaucrat-member' => 'Бюрократ',
@@ -1150,7 +1156,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'backend-fail-store' => '$1 файлась эзь ванстово $2 янонтень.',
 'backend-fail-move' => '$1 файлась эзь печтевтеве $2 файлакс.',
 'backend-fail-read' => '"$1" файлась эзь ловново.',
-'backend-fail-create' => '"$1" файлась эзь шкаво.',
+'backend-fail-create' => '"$1" керьмазось эзь шкаво.',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Совамось кардазь',
@@ -1199,7 +1205,8 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'linkstoimage' => 'Те файланть марто сюлмавозь вана {{PLURAL:$1|истямо сюлмавома пене|$1 истят сюлмавома пенеть}}:',
 'nolinkstoimage' => 'Арась вейкеяк лопа, кона сюлмавови те файланть марто.',
 'sharedupload' => 'Те файлась саезь "$1" файлань пусмосто, сон нолдави тевс лия проектсэяк.',
-'sharedupload-desc-here' => '',
+'sharedupload-desc-here' => 'Те файлась сась истямо $1 таркасто, паряк сон нолдави тевс лия проектсэ.
+Кувалманзо сёрмадовксось [$2 файладонть ёвтнема лопазо] невтезь ало.',
 'filepage-nofile' => 'Истямо лем марто файла арась.',
 'uploadnewversion-linktext' => 'Йовкстак од версия те файластонть',
 'shared-repo-from' => 'вана теньстэ $1',
@@ -1380,6 +1387,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'listusers-blocked' => '(саймас саезь)',
 
 # Special:ActiveUsers
+'activeusers' => 'Активной теицятнеде списка',
 'activeusers-hidebots' => 'Кекшемс ботатнень',
 'activeusers-hidesysops' => 'Кекшемс администратортнэнь',
 'activeusers-noresult' => 'Якинзэ-пакинзэ арасть',
@@ -1436,10 +1444,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'watching' => 'Ванома...',
 'unwatching' => 'Аванома...',
 
-'enotif_newpagetext' => 'Те од лопа.',
 'enotif_impersonal_salutation' => '{{SITENAME}} теицясь',
-'changed' => 'полавтозь',
-'created' => 'теезь-шказь',
 'enotif_lastdiff' => 'Те полавтоманть ваномга вант $1.',
 'enotif_anon_editor' => 'лемтеме теиця $1',
 
@@ -1546,9 +1551,9 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'blanknamespace' => '(Прявкс)',
 
 # Contributions
-'contributions' => 'Теицянть-кирдицянть путовксозо',
+'contributions' => '{{GENDER:$1|Теицянть}} путовксонзо',
 'contributions-title' => 'Теицянть путовксонзо $1 таркантень',
-'mycontris' => 'Монь путовкст',
+'mycontris' => 'Монь путовкстнэ',
 'contribsub2' => '$1 ($2) туртов',
 'uctop' => '(меельцесь)',
 'month' => 'Ковстонть (ды седе икеле):',
@@ -1580,7 +1585,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'whatlinkshere-hideredirs' => '$1 {{PLURAL:$1|тарка йутавты|таркат йутавтыть}} тей',
 'whatlinkshere-hidetrans' => '$1 сюлмавозь пелькстнэнь',
 'whatlinkshere-hidelinks' => '$1 сюлмавома петь',
-'whatlinkshere-hideimages' => '$1 артовксонь сюлмавома пензэ',
+'whatlinkshere-hideimages' => '$1 файланть сюлмавомапензэ',
 'whatlinkshere-filters' => 'Фильтрат',
 
 # Block/unblock
@@ -1799,6 +1804,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'tooltip-rollback' => '"Мекев кевердема" повнэнть весть лепштямось велявтсынзе те лопасонть меельсекс теезь витнематнень-петнематнень',
 'tooltip-undo' => '"Велявтомс мекев" велявтсы витнемань-петнемань тевенть ды панжсы васнянь невтемань формасо.
 Сонзэ вельде маштови поладомс полавтомадо тувтал.',
+'tooltip-preferences-save' => 'Ванстомс эсень аравтоматнень',
 'tooltip-summary' => 'Сёрмадт нурькинестэ совавтозденть',
 
 # Attribution
@@ -1815,9 +1821,14 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'spambot_username' => 'MediaWiki-нь шукшто ванькскавтома',
 
 # Info page
+'pageinfo-header-basic' => 'Васень информациязо',
+'pageinfo-header-edits' => 'Витнемс-петнемс юронзо-путовксонзо',
+'pageinfo-header-properties' => 'Лопанть уликсчинзэ',
+'pageinfo-display-title' => 'Коняксонть таргамс лангс',
 'pageinfo-views' => 'Зяро ванома потмонзо',
+'pageinfo-subpages-name' => 'Те лопанть явкслопанзо',
 'pageinfo-edits' => 'Зяроксть витнезь-петнезь',
-'pageinfo-authors' => 'Ð\97яро авторонзо',
+'pageinfo-authors' => 'Ð\92еÑ\81емезÑ\8d Ð·яро авторонзо',
 
 # Skin names
 'skinname-standard' => 'Классикань',
@@ -1837,6 +1848,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 
 # Image deletion
 'deletedrevision' => 'Нардань ташто лиякстомтома $1',
+'filedeleteerror-short' => '"$1" керьмазонть нардамсто лиссь ильведевкс',
 
 # Browsing diffs
 'previousdiff' => '← Седе икелень верзиязо',
@@ -1862,6 +1874,9 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'ilsubmit' => 'Вешнэмс',
 'bydate' => 'чинь коряс',
 
+# Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'ago' => '$1-до икеле',
+
 # Bad image list
 'bad_image_list' => 'Лувось-форматось вана истямо:
 
@@ -1910,6 +1925,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'exif-exposuretime' => 'Валдомтомань (Экспозициянь) шка',
 'exif-fnumber' => 'Диафрагмань числась',
 'exif-brightnessvalue' => 'APEX-нть валдоксчизэ',
+'exif-subjectdistance' => 'Объектэнтень зяро тарка',
 'exif-lightsource' => 'Валдонь лисьмапрязо',
 'exif-flash' => 'Кивчкадема',
 'exif-subjectarea' => 'Субъектонть саема тарказо',
@@ -2129,6 +2145,9 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'watchlisttools-edit' => 'Ваномс ды витнемс-петнемс мезе мельга ванстнят',
 'watchlisttools-raw' => 'Витнеме-петнеме верек ваномалопанть',
 
+# Core parser functions
+'duplicate-defaultsort' => '\'\'\'Ванок!\'\'\' Рядс аравтомань те "$2" панжомась саеви те "$1" панжомадо икеле.',
+
 # Special:Version
 'version' => 'Версия',
 'version-specialpages' => 'Башка тевень лопат',
@@ -2158,7 +2177,7 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 # Special:SpecialPages
 'specialpages' => 'Башка тевень лопат',
 'specialpages-group-other' => 'Лия башка тевень лопат',
-'specialpages-group-login' => 'Совамо / прянь сёрмадстомо',
+'specialpages-group-login' => 'Совамс / шкамс совамотарка',
 'specialpages-group-users' => 'Теицятне ды видечыст',
 'specialpages-group-highuse' => 'Пек тевс нолдазь лопат',
 'specialpages-group-pages' => 'Лопа керькст',
@@ -2201,6 +2220,19 @@ IP-тешкстэть — $3, саймас совавтоманть ID-сь —
 'feedback-close' => 'Анок',
 
 # API errors
+'api-error-filename-tooshort' => 'Керьмазлементь а саты кувалмозо',
+'api-error-illegal-filename' => 'Керьмазлемесь а маштови.',
 'api-error-unknownerror' => 'Апак содань ильведевкс: «$1».',
 
+# 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 68482db..7d54b31 100644 (file)
@@ -80,7 +80,6 @@ $magicWords = array(
        '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' ),
@@ -198,9 +197,9 @@ $messages = array(
 'wed' => 'چارشنبه',
 'thu' => 'پنجشنبه',
 'fri' => 'جـومه',
-'sat' => 'Ø´Ù\87â\80\8cÙ\85ه',
+'sat' => 'Ø´Ù\85به',
 'january' => 'جـانـویـه',
-'february' => 'Ù\81Ù\80Ù\87â\80\8cÙ\88رÛ\8cÙ\80ه',
+'february' => 'Ù\81Ù\88رÛ\8cه',
 'march' => 'مـارچ',
 'april' => 'آوریل',
 'may_long' => 'مه',
@@ -208,11 +207,11 @@ $messages = array(
 'july' => 'جـولای',
 'august' => 'ئـوگـه‌سـت',
 'september' => 'سـه‌پـتـه‌مـبـر',
-'october' => 'ئÙ\80Ù\88Ú©Ù\80تÙ\80Ù\88بÙ\80ر',
+'october' => 'اکتبر',
 'november' => 'نـووه‌مـبـر',
-'december' => 'ده‌سـه‌مـبـر',
+'december' => 'دسامبر',
 'january-gen' => 'جـانـویـه',
-'february-gen' => 'Ù\81Ù\80Ù\87â\80\8cÙ\88رÛ\8cÙ\80ه',
+'february-gen' => 'Ù\81Ù\88رÛ\8cه',
 'march-gen' => 'مـارس',
 'april-gen' => 'آوریـل',
 'may-gen' => 'مه',
@@ -220,9 +219,9 @@ $messages = array(
 'july-gen' => 'جـولای',
 'august-gen' => 'ئوگـه‌سـت',
 'september-gen' => 'سـه‌پـتـه‌مـبـر',
-'october-gen' => 'ئÙ\80Ù\88Ú©Ù\80تÙ\80Ù\88بÙ\80ر',
+'october-gen' => 'اکتبر',
 'november-gen' => 'نـووه‌مـبـر',
-'december-gen' => 'ده‌سـه‌مـبـر',
+'december-gen' => 'دسامبر',
 'jan' => 'جانویه',
 'feb' => 'فه‌وریه',
 'mar' => 'مارچ',
@@ -234,7 +233,7 @@ $messages = array(
 'sep' => 'سه‌پته‌مبر',
 'oct' => 'ئوکتوبر',
 'nov' => 'نووه‌مبر',
-'dec' => 'ده‌سه‌مبر',
+'dec' => 'دسامبر',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1|رج|رج‌ئون}}',
@@ -248,6 +247,8 @@ $messages = array(
 'category-subcat-count-limited' => 'اینتا رج {{PLURAL:$1|اتا زیر رج|$1 زبررج}} ره شامل بونه.',
 'category-article-count' => '{{PLURAL:$2|این رج همینتا صفحه ره دانّه.|ای  {{PLURAL:$1صفحه|صفحه|$1 ئون}}، $2 جه اینجه دَرنه.}}',
 'category-article-count-limited' => '{{PLURAL:$1|صفحهٔ|$1 صفحهٔ}} که این بن درنه اینتا رج دله قرار هایتنه.',
+'category-file-count' => '{{PLURAL:$2|این رج دله فقط همینتا عکس دره.|{{PLURAL:$1|این اتا پرونده|این $1تا پرونده}} این رج دله {{PLURAL:$1|دره|درنه}}؛ این رج کلاً $2تا پرونده دانّه.}}',
+'category-file-count-limited' => '{{PLURAL:$1|پرونده|$1 پرونده}} این رج دله درنه.',
 'listingcontinuesabbrev' => '(دمباله)',
 'index-category' => 'صفحه‌ئون نمایه بَیی',
 'noindex-category' => 'صفحه‌ئون نمایه نَیی',
@@ -269,7 +270,6 @@ $messages = array(
 'qbbrowse' => 'چأرخه‌سه‌ن',
 'qbedit' => 'دچی‌ین',
 'qbpageoptions' => 'این صفحه',
-'qbpageinfo' => 'بافت',
 'qbmyoptions' => 'مه صفحه‌ئون',
 'qbspecialpages' => 'شا صفحه‌ئون',
 'faq' => 'معمولی سوالا',
@@ -384,7 +384,11 @@ $2، $1',
 'youhavenewmessages' => 'شما اتا $1 دانّی ($2).',
 'newmessageslink' => 'ترنه پیغوم‌ئون',
 'newmessagesdifflink' => 'پایانی دچی‌یه',
-'youhavenewmessagesmulti' => 'شه مه وسه ترنه پیغوم بی یه موئه ای جه $1',
+'youhavenewmessagesfromusers' => 'شِما {{PLURAL:$3| کارور دیگه| $3  کارور}} $1 دارنی ($2).',
+'youhavenewmessagesmanyusers' => 'شما ات‌سری کارور جه $1 دارنی ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|ترنه پیغوم|ترنه پیغوم}}',
+'newmessagesdifflinkplural' => '{{formatnum:$1}} {{PLURAL:$1|ترنه دچی‌یه|ترنه دچی‌یه‌ئون}}',
+'youhavenewmessagesmulti' => 'شِمه وسّه $1 دله، ترنه پیغوم برسی‌یه.',
 'editsection' => 'دچی‌ین',
 'editold' => 'دچی‌ین',
 'viewsourceold' => 'منبع ره هارشائن',
@@ -392,7 +396,7 @@ $2، $1',
 'viewsourcelink' => 'منبع بدی‌ین',
 'editsectionhint' => 'تیکه: $1 ره دچی‌ین',
 'toc' => 'دله',
-'showtoc' => 'نشون هاده',
+'showtoc' => 'سِراق هاده',
 'hidetoc' => 'فرو بور',
 'collapsible-collapse' => 'دوستن',
 'collapsible-expand' => 'گت هاکردن',
@@ -451,7 +455,16 @@ $2، $1',
 'laggedslavemode' => "'''هشدار:''' صفحه ممکن هسته که جدید ِبه‌روزرسانی‌ئون ره شامل نواشه.",
 'readonly' => 'پایگاه داده زلفن بزه‎بیّه',
 'enterlockreason' => 'دلیلی زلفین بزوئن وسّه بارین، که حاوی تقریبی از زمونی بائه که زلفین بَیته وانه',
-'missingarticle-rev' => '(نسخهٔ شماره: $1)',
+'readonlytext' => 'داده پایگاه هنتا دچی‌ین و صفحه‌ئون بساتن وسّه زلفن بَیی‌ئه؛ این وضعیت احتمالاً معمولی رسیدگیون وسّه هسته که این کارون په، عادی وانه.
+
+مدیری که اینان ره زلفن هاکرده این توضیح ره شمه وسّه بنویشته: $1',
+'missing-article' => 'داده پایگاه صفحه «$1» $2 بنویشته ره که وسّه پیدا هاکرد بوو، پیدا نکارده.
+
+این مشکل معمولاً اون گادِر پیش انه که شمه بخاستی چیون اتا قدیمی یا حذف بَیی تاریخچه‌ی تفاوت بوئن.
+
+اگه غیر این هسته، احتمالاً نرم‌افزار دله موشکل پیدا بیّه.
+این مشکل ره اینترنتی نشونی همراه اتا [[Special:ListUsers/sysop|مدیر]] وسّه برسِنین.',
+'missingarticle-rev' => '(نسخه‌ی شماره: $1)',
 'missingarticle-diff' => '(فرق: $1، $2)',
 'readonly_lag' => 'پایگاه داده به طور خودکار زلفین بزه‌بیّه تا پشتیبون ِنسخه‌ئون با اصلی نسخه هماهنگ بواشِن',
 'internalerror' => 'خطای دله‌یی',
@@ -469,26 +482,33 @@ $2، $1',
 'badarticleerror' => 'ننشنه این کار ره این صفحه دله هاکردن.',
 'cannotdelete' => 'صفحه یا تصویر «$1» ره ننشنه پاک هاکردن.
 ممکنه قبلاً فرد دیگری وه ره پاک هاکردبوئه.',
-'badtitle' => 'نقش عنوان',
-'perfcached' => 'داده‌ئون زیر حافظهٔ موقت جه بَییته بَینه و ممکن هسته کاملاً به‌روز نوائن. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
+'cannotdelete-title' => 'نشنه «$1» ره پاک هاکردِن',
+'delete-hook-aborted' => 'قلاب نتونده حذف هاکنه.
+اینتا وسّه دلیل ننویشتنه.',
+'badtitle' => 'نخاشِ عنوان',
+'badtitletext' => 'بخاستی عنوان نامعتبر، خالی یا میون‌زوونی عنوان یا میون‌ویکیی غلط لینک جه بی‌یه.
+ممکنه ونه دله اتا یا چنتا چی بنویش بو که نَونه عنوان دله بئه.',
+'perfcached' => 'این چیون ثبت بَیی حافظه جه انّه و ممکنه آپدیت نَوائن. حداکثر {{PLURAL:$1|اتا نتیجه|$1تا نتیجه}} قدیمی حافظه دله دره.',
+'querypage-no-updates' => 'این صفحه فعلاً نَونه آپدیت بَواشه.
+همینسه ونه دله بنویشته‌ئون شاید قدیمی بائن.',
 'wrong_wfQuery_params' => 'پارامترون wfQuery()‎ غلطه<br />
 تابع: $1<br />
 پرس‌وجو: $2',
 'viewsource' => 'منبع ره بدی‌ین',
+'viewsource-title' => '$1 مبدأ ره سِراق هدائِن',
 'actionthrottled' => 'شمه پیش ره بیتنه',
 'protectedpagetext' => 'این صفحه دچی‌ین وسّه زلفین بزه بیّه.',
 'viewsourcetext' => 'بتونّی متن مبدأ این صفحه ره هارشین یا ونجه نسخه بَیرین:',
+'viewyourtext' => "بتونّی '''شه بنویشته چیون''' مبدأ ره این صفحه دله هارشین و کپی هاکنین:",
 'protectedinterface' => 'این صفحه ارائه‌دهندهٔ متنی واسط کارور این نرم‌افزار هسته و به منظور پیشگیری از خرابکاری زلفین بزه‌بیّه.',
 'sqlhidden' => '(دستور اس‌کیوال دپوشنی‌یه بیّه)',
 
 # Login and logout pages
-'welcomecreation' => '==$1، خِش بمونی!==
-شِمه حساب بساته بیّه.
-فراموش نکانین که [[Special:Preferences|شه ترجیحات {{SITENAME}}]] ره تنظیم هاکنین.',
 'yourname' => 'شمه کاروری‌نوم:',
 'yourpassword' => 'شمه پسورد',
 'yourpasswordagain' => 'پسورد ره دِباره بنویس',
 'remembermypassword' => 'مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر سر یاد نکان',
+'securelogin-stick-https' => 'HTTPS دله بموئن په، متصل بموند',
 'yourdomainname' => 'شمه کاروری نوم',
 'login' => 'دله بوردن',
 'nav-login-createaccount' => 'دله بوردن / عضو بیّن',
@@ -503,7 +523,8 @@ $2، $1',
 'createaccount' => 'ترنه حساب وا هکاردن',
 'gotaccount' => 'عضو هسنی؟ $1.',
 'gotaccountlink' => 'بورین دله',
-'createaccountmail' => 'ایمیل ِهمراه',
+'userlogin-resetlink' => 'دله بموئن ِجزئیات ره یاد هاکردی؟',
+'createaccountmail' => 'ایمیل جه',
 'createaccountreason' => 'دلیل:',
 'badretype' => 'دِتا پسوردی که بنویشتی اتجور نینه',
 'userexists' => 'کاروری نومی که بخاستنی وجود داشته.
@@ -523,6 +544,18 @@ $2، $1',
 # Change password dialog
 'newpassword' => 'نو پسورد:',
 
+# Special:PasswordReset
+'passwordreset-username' => 'کاروری نوم:',
+'passwordreset-domain' => 'دامنه:',
+'passwordreset-capture' => 'گت ایمیل سِراق هدائه بَواشه؟',
+
+# Special:ChangeEmail
+'changeemail-oldemail' => 'اساء ایمیل:',
+'changeemail-newemail' => 'ترنه ایمیل آدرس:',
+'changeemail-none' => '(هچّی)',
+'changeemail-submit' => 'ایمیل ره عوض هاکردن',
+'changeemail-cancel' => 'ول هاکردن',
+
 # Edit page toolbar
 'bold_sample' => 'ضخیم',
 'bold_tip' => 'ضخیم',
@@ -536,18 +569,28 @@ $2، $1',
 'headline_tip' => 'عنوان بند ۲',
 'nowiki_sample' => 'شه بی فورمت بنویشته ره اینجه دکانین',
 'nowiki_tip' => 'فورمت سر چش ره کوریک بَیره',
-'media_tip' => 'فایل لینک',
+'image_tip' => 'بنویشته‌ی دله‌ی عکس',
+'media_tip' => 'فایل ِلینک',
+'sig_tip' => 'شمه امضا و ونه په‌ی ِتاریخ',
+'hr_tip' => 'افقی خط (ونه کمته کار بکشین)',
 
 # Edit pages
-'summary' => 'Ú¯Ù\88زارش Ú©Ø§Ø±:',
+'summary' => 'کار Ù\90گزارش:',
 'subject' => 'موضوع یا عنوان:',
-'minoredit' => 'اینتا ویرایش خله جزئی بیه',
-'watchthis' => 'این صفحه ره دمبال هـاکاردن',
+'minoredit' => 'اینتا دچی‌یه خله جزئی بی‌یه',
+'watchthis' => 'این صفحه ره دمبال هاکردن',
 'savearticle' => 'جادکتن ِصفحه',
-'preview' => 'پیش نمایش',
-'showpreview' => 'پیش‌نمایش ره سِراق هدائن',
-'showlivepreview' => 'پیش‌نمایش آنلاین',
-'showdiff' => 'نمایش تغییرات',
+'preview' => 'پیش‌پیش سِراق هدائن',
+'showpreview' => 'پیش‌پیش سِراق هدائن',
+'showlivepreview' => 'آنلاین پیش‌پیش سِراق هدائن',
+'showdiff' => 'تغییرات ِسراق هدائن',
+'anoneditwarning' => "'''هشدار:''' شِما هنتا عضو نَیینی.
+شمه آی‌پی آدرِس تاریخچه دله موندنه.",
+'anonpreviewwarning' => "''شما هنتا عضو نَیینی، اگه اتچی بنویسین، شمه آی‌پی ِلینگِ‌رج اینجه موندنه.''",
+'missingcommenttext' => 'ات‌چی اینجه بنویسین که شمه توضیح بوو',
+'summary-preview' => 'خلاصه‌ی پیش‌پیش سِراق هدائن:',
+'subject-preview' => 'موضوع/عنوان ِپیش‌پیش سِراق هدائن:',
+'blockedtitle' => 'کارور دَوسته بیّه',
 'blockedtext' => "'''شمه آی پی دوسته بیّه.'''
 
 این کار ره $1 انجام هدائه.
@@ -562,6 +605,13 @@ $2، $1',
  شمه یاد دواشه که اگه شه ایمیل ره ننوشت بائین نتونی مدیرا وسه ایمیل بزنین اگه ایمیل ره ننوشنی ترجیحات دله بنویسین[[Special:Preferences|اینجه ایمیل ره بنویس]]
 نشونی آی‌پی شما $3 و شماره قطع دسترسی شما $5 هسته. حتما این دِتا شوماره ره گپ بزوئن دله به کار بورین.",
 'blockednoreason' => 'معلوم نی‌یه چچی وسه اینتی بیّه!',
+'loginreqtitle' => 'ونه سامانه دله بئین',
+'loginreqlink' => 'دله بموئن',
+'loginreqpagetext' => 'بقیه‌ی صفحه‌ئون ِبدی‌ین وسّه، ونه $1.',
+'accmailtitle' => 'پسورد ره برسِنیمی.',
+'accmailtext' => "اتا تصادفی پسور بساته بیّه [[User talk:$1|$1]] وسّه $2 سَر برسِنی‌یه بیّه.
+
+این ترنه کاروری حساب ِپسور، سامانه دله بموئن په، ''[[Special:ChangePassword|ات‌تی]]'' بتونده عوض بوو.",
 'newarticle' => '(ترنه)',
 'blocked-notice-logextract' => 'دسترسی اینتا کارور الآن دوستوئه.
 آخرین مورد سیاهه قطع دسترسی زیر بموئه:',
@@ -628,8 +678,6 @@ $2، $1',
 'search-suggest' => 'شما اینتا ره نخاسنی: $1',
 'search-interwiki-caption' => 'خاخر پروژه‌ئون',
 'search-interwiki-more' => '(ویشتر)',
-'search-mwsuggest-enabled' => 'پیشنهاد همرا',
-'search-mwsuggest-disabled' => 'هیچ پیشنهادی دنیه',
 'powersearch' => 'ململ بَیی دور هایتن',
 'powersearch-legend' => 'ململ بَیی دور هایتن',
 'powersearch-ns' => 'بچرخستن اینان دله:',
@@ -813,9 +861,6 @@ $2، $1',
 'watching' => 'ده‌مـبـال هـه‌کـارده‌ن...',
 'unwatching' => 'ده‌مـبـال نـه‌کـارده‌ن...',
 
-'enotif_newpagetext' => 'این صفحه نوبساته هسته',
-'created' => 'بساته بیّه',
-'enotif_subject' => 'صفحه‌ی «$PAGETITLE» {{SITENAME}} به‌دست $PAGEEDITOR $CHANGEDORCREATED‌هسته.',
 'enotif_lastvisited' => 'بدی‌ین همه‌ی تغییرات از آخرین باری که سر بزونی وسّه $1 ره هارشین.',
 'enotif_lastdiff' => 'هارشائن این تغییر وسّه $1 ره بزنین.',
 'enotif_anon_editor' => 'نشناسی‌یه کارور $1',
index d45886f..c029652 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'    => 'Tondak',
-'monday'    => 'Mondak',
-'tuesday'   => 'Dintak',
+'sunday' => 'Tondak',
+'monday' => 'Mondak',
+'tuesday' => 'Dintak',
 'wednesday' => 'Mitwok',
-'thursday'  => 'Donertak',
-'friday'    => 'Preidak',
-'saturday'  => 'Tadurdei',
+'thursday' => 'Donertak',
+'friday' => 'Preidak',
+'saturday' => 'Tadurdei',
 
 'moredotdotdot' => 'Iyuw...',
-'and'           => '&#32;me',
+'and' => '&#32;me',
 
 # Cologne Blue skin
 'qbedit' => 'Kiwiwid',
 
 'errorpagetitle' => 'Dairinaiya',
-'help'           => 'Ipuok',
-'search'         => 'Kanani',
-'go'             => 'Nuwa ko!',
-'history_short'  => 'Ekadaedaenigawae',
-'edit'           => 'Kiwiwid',
-'delete'         => 'Iyababa',
-'unprotect'      => 'Eab oberei',
-'toolbox'        => 'Dabadi n bwait makur',
+'help' => 'Ipuok',
+'search' => 'Kanani',
+'go' => 'Nuwa ko!',
+'history_short' => 'Ekadaedaenigawae',
+'edit' => 'Kiwiwid',
+'delete' => 'Iyababa',
+'unprotect' => 'Eab oberei',
+'toolbox' => 'Dabadi n bwait makur',
 
 # 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).
-'currentevents'        => 'Imwin',
-'currentevents-url'    => 'Project:Imwin',
-'edithelp'             => 'Oomo/edar Ipuok',
-'edithelppage'         => 'Help:Oomo/edar',
-'helppage'             => 'Help:Oangan',
-'mainpage'             => 'Bwiema peij',
+'currentevents' => 'Imwin',
+'currentevents-url' => 'Project:Imwin',
+'edithelp' => 'Oomo/edar Ipuok',
+'edithelppage' => 'Help:Oomo/edar',
+'helppage' => 'Help:Oangan',
+'mainpage' => 'Bwiema peij',
 'mainpage-description' => 'Bwiema peij',
 
 'editsection' => 'Kiwiwid',
-'showtoc'     => 'oduwen',
-'hidetoc'     => 'ewewin',
+'showtoc' => 'oduwen',
+'hidetoc' => 'ewewin',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-help' => 'Ipuok',
@@ -58,35 +58,35 @@ $messages = array(
 'error' => 'Dairinaiya',
 
 # Login and logout pages
-'login'      => 'Metu',
-'logout'     => 'Meta',
+'login' => 'Metu',
+'logout' => 'Meta',
 'userlogout' => 'Meta',
 
 # Edit page toolbar
-'bold_sample'  => 'Eõ mangiyungiy',
-'bold_tip'     => 'Eõ mangiyungiy',
+'bold_sample' => 'Eõ mangiyungiy',
+'bold_tip' => 'Eõ mangiyungiy',
 'image_sample' => 'Ekar.jpg',
 
 # Edit pages
-'savearticle'    => 'Otsimor',
-'newarticle'     => '(Etsimeduw)',
-'editing'        => 'Oomo/edar $1',
+'savearticle' => 'Otsimor',
+'newarticle' => '(Etsimeduw)',
+'editing' => 'Oomo/edar $1',
 'editingsection' => 'Oomo/edar $1 (itubwang)',
 
 # Search results
 'searchhelp-url' => 'Help:Oangan',
-'powersearch'    => 'Anani ko',
+'powersearch' => 'Anani ko',
 
 # Preferences page
-'prefs-skin'        => 'Witsin',
+'prefs-skin' => 'Witsin',
 'searchresultshead' => 'Anani ko',
-'yourlanguage'      => 'Edorer',
+'yourlanguage' => 'Edorer',
 
 # Recent changes
 'recentchanges' => 'Iwiwidit tsimeduw',
-'hist'          => 'eka',
-'hide'          => 'witsit imin gogoro',
-'show'          => 'oduwen',
+'hist' => 'eka',
+'hide' => 'witsit imin gogoro',
+'show' => 'oduwen',
 
 # Random page
 'randompage' => 'Tamo peij',
@@ -100,11 +100,11 @@ $messages = array(
 # E-mail user
 'emailuser' => 'Emaileiy amune',
 'emailfrom' => 'Atsiu',
-'emailto'   => 'Animwen',
+'emailto' => 'Animwen',
 'emailsend' => 'Oiyon',
 
 # Watchlist
-'watch'   => 'Aea',
+'watch' => 'Aea',
 'unwatch' => 'Eab krak',
 
 # Delete
index 9ad4238..239339b 100644 (file)
@@ -96,9 +96,9 @@ $messages = array(
 'tog-minordefault' => 'Ticmachiyōtīz mochīntīn tlapatlalitzintli ic default',
 'tog-previewontop' => 'Tiquittāz achtochīhualiztli achtopa tlapatlaliztli caxitl',
 'tog-previewonfirst' => 'Xiquitta achtochīhualiztli inic cē tlapatlalizpan',
-'tog-enotifwatchlistpages' => 'Timitz-e-mailīzqueh ihcuāc mopatla cē zāzanilli tictlachiya.',
+'tog-enotifwatchlistpages' => 'Notech moēhualtia cē maltzinteyōtl netitlaniztli ihcuāc mopatla zāzanilli in notlachiyaliz.',
 'tog-enotifusertalkpages' => 'Nēchihtoa ihcuāc tlecpatla motēixnāmiquiliz',
-'tog-enotifminoredits' => 'Timitz-e-mailīzqueh nō zāzanilpatlatzintli ītechcopa',
+'tog-enotifminoredits' => 'Notech moēhualtia cē maltzinteyōtl netitlaniztli nō ihcuāc mopatla tepitōn zāzanilli in notlachiyaliz.',
 'tog-enotifrevealaddr' => 'Ticnēxtīz mo e-mailcān āxcāncayōtechcopa āmatlacuilizpan',
 'tog-shownumberswatching' => 'Tiquinttāz tlatequitiltilīlli tlein tlachiyacateh',
 'tog-forceeditsummary' => 'Xinēchnōtzāz ihcuāc ahmo niquihtōz inōn ōnitlapatlac',
@@ -192,7 +192,7 @@ $messages = array(
 'newwindow' => '(Motlapoāz cē yancuīc tlanexillōtl)',
 'cancel' => 'Ticcuepāz',
 'moredotdotdot' => 'Huehca ōmpa...',
-'mypage' => 'Nozāzanil',
+'mypage' => 'Noāmauh',
 'mytalk' => 'Notēixnāmiquiliz',
 'anontalk' => 'Inīn IP ītēixnāmiquiliz',
 'navigation' => 'Nènemòwalistli',
@@ -203,7 +203,6 @@ $messages = array(
 'qbbrowse' => 'Titlatēmōz',
 'qbedit' => 'Ticpatlāz',
 'qbpageoptions' => 'Inīn zāzanilli',
-'qbpageinfo' => 'Tlahcuilōltechcopa',
 'qbmyoptions' => 'Nozāzanil',
 'qbspecialpages' => 'Nònkuâkìskàtlaìxtlapaltìn',
 'faq' => 'Zan īc tētlatlanīliztli',
@@ -377,11 +376,6 @@ Hueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.',
 'virus-unknownscanner' => 'ahmatic antivirus:',
 
 # Login and logout pages
-'welcomecreation' => '== ¡Ximopanōlti, $1! ==
-
-Mocuentah ōmochīuh.
-
-Ye tihuelīti titēchihtoa [[Special:Preferences|motlaēlēhuiliz]].',
 'yourname' => 'Motlatequitiltilīltōca:',
 'yourpassword' => 'Motlahtōlichtacāyo',
 'yourpasswordagain' => 'Motlahtōlichtacāyo occeppa',
@@ -419,7 +413,7 @@ Xiquitta moyēquihcuilōl.',
 Timitztlātlauhtia xicchīhua occeppa.',
 'wrongpasswordempty' => 'Ayāc motlahtōlichtacāyo.
 Timitztlātlauhtia xicchīhua occeppa.',
-'mailmypassword' => 'E-mailīz yancuīc motlahtōlichtacāyo',
+'mailmypassword' => 'Notech moēhualtia maltzinteyōtl netitlaniztica yancuīc ichtacātlahtōlli',
 'noemail' => '"$1" ahmo quipiya īe-mailcān.',
 'passwordsent' => 'Ōmoihuah yancuīc motlahtōlichtacāyo īhuīc mo e-mail ("$1").
 Occeppa xicalaqui niman ticmatīz.',
@@ -572,6 +566,8 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'revdelete-radio-set' => 'Quēmah',
 'revdelete-radio-unset' => 'Ahmo',
 'revdel-restore' => 'Ticpatlāz tlattaliztli',
+'revdel-restore-deleted' => 'tlapohpolōlli tlaceppahuilīztli',
+'revdel-restore-visible' => 'ittaloni tlaceppahuilīztli',
 'pagehist' => 'Zāzanilli tlahcuilōlloh',
 'deletedhist' => 'Ōtlapolo tlahcuilōlloh',
 'revdelete-edit-reasonlist' => 'Tiquimpatlāz īxtlamatiliztli tlapoloaliztechcopa',
@@ -595,10 +591,12 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 
 # Search results
 'searchresults' => 'Tlatēmoliztli',
+'searchresults-title' => '«$1» tlatēmōliztli īmochīhualiz',
 'searchsubtitle' => 'Ōtictēmōz \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|mochīntīn zāzaniltin mopēhua īca "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|mochīntīn zāzaniltin tzonhuilia "$1" īhuīc]])',
 'searchsubtitleinvalid' => "Ōtictēmo '''$1'''",
 'prevn' => '{{PLURAL:$1|$1}} achtopa',
 'nextn' => 'niman {{PLURAL:$1|$1}}',
+'shown-title' => 'Quinēxiltīz $1 {{PLURAL:$|mochīhualiztli}} cece āmac',
 'viewprevnext' => 'Xiquintta ($1 {{int:pipe-separator}} $2) ($3).',
 'searchmenu-exists' => "'''Ye ia zāzanilli ītōca \"[[\$1]]\" inīn huiquipan'''",
 'searchmenu-new' => "'''Tihuelīti ticchīhuāz zāzanilli ītōca \"[[:\$1]]\" inīn huiquipan'''",
@@ -667,12 +665,12 @@ Hueliz ōmopolo huiqui nozo ōmozacac.
 'timezoneregion-europe' => 'Europan',
 'timezoneregion-indian' => 'Índico Ilhuicaātl',
 'timezoneregion-pacific' => 'Pacífico Ilhuicaātl',
-'prefs-searchoptions' => 'Tlatēmoliztli tlaēlēhuiliztli',
+'prefs-searchoptions' => 'Titlatēmōz',
 'prefs-namespaces' => 'Tōcātzin',
 'defaultns' => 'Tlatēmōz inīn tōcātzimpan achtopa:',
 'default' => 'ic default',
 'prefs-files' => 'Tlahcuilōlli',
-'youremail' => 'E-mail:',
+'youremail' => 'Maltzinteyōtl netitlanizyeyāntli:',
 'username' => 'Tlatequitiltilīltōcāitl:',
 'uid' => 'Tlatequitiltilīlli ID:',
 'prefs-memberingroups' => 'Tlācatl {{PLURAL:$1|olōlco|olōlco}}:',
@@ -767,6 +765,8 @@ Intlā ticnequi, tlācah quimatīzqueh motequi.',
 'recentchanges' => 'Yancuīc tlapatlaliztli',
 'recentchanges-legend' => 'Yancuīc tlapatlaliztechcopa tlanequiliztli',
 'recentchanges-summary' => 'Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.',
+'recentchanges-label-newpage' => 'Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl',
+'recentchanges-label-minor' => 'Inīn tlapatlaliztli tepitōn',
 'rcnote' => "Nicān {{PLURAL:$1|cah '''1''' tlapatlaliaztli|cateh in xōcoyōc '''$1''' tlapatlaliztli}} īpan xōcoyōc {{PLURAL:$2|tōnalli|'''$2''' tōnaltin}} īhuīcpa $5, $4.",
 'rclistfrom' => 'Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $1',
 'rcshowhideminor' => '$1 tlapatlalitzintli',
@@ -996,6 +996,7 @@ Nò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
 'linksearch' => 'Calān tzonhuiliztli tlatemoliztli',
 'linksearch-ns' => 'Tōcātzin:',
 'linksearch-ok' => 'Tictēmōz',
+'linksearch-line' => '$1 tzonhuīlo īxquichca $2',
 
 # Special:ListUsers
 'listusers-submit' => 'Tiquittāz',
@@ -1005,7 +1006,7 @@ Nò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
 'listgrouprights-rights' => 'Huelītiliztli',
 
 # E-mail user
-'emailuser' => 'Tique-mailīz inīn tlatequitiltilīlli',
+'emailuser' => 'Tiquēhualtlīz maltzinteyōtl netitlaniztli inīn tlatequitiltilīlli',
 'defemailsubject' => '{{SITENAME}} correo tlatequitiltilīlhuīc $1',
 'emailfrom' => 'Īhuīcpa:',
 'emailto' => 'Īhuīc:',
@@ -1028,10 +1029,7 @@ Nò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlà
 'watching' => 'Tlachiyacah...',
 'unwatching' => 'Ahtlachiyacah...',
 
-'enotif_newpagetext' => 'Inīn cah yancuīc zāzanilli.',
 'enotif_impersonal_salutation' => 'tlatequitiltilīlli īpan {{SITENAME}}',
-'changed' => 'ōmotlacuep',
-'created' => 'ōmochīuh',
 'enotif_anon_editor' => 'ahtōcātlatequitiltilīlli $1',
 'enotif_body' => 'Māhuizzoh $WATCHINGUSERNAME,
 
@@ -1153,7 +1151,7 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'whatlinkshere-links' => '← tzòwilistìn',
 'whatlinkshere-hideredirs' => '$1 tlacuepaliztli',
 'whatlinkshere-hidelinks' => '$1 tzòwilistìn',
-'whatlinkshere-hideimages' => '$1 ìxiptzòwilistli',
+'whatlinkshere-hideimages' => '$1 tlahcuilōltzonhuīliztli',
 
 # Block/unblock
 'blockip' => 'Tiquitzacuilīz tlatequitiltilīlli',
@@ -1173,12 +1171,14 @@ Xiquitta $2 ic yancuīc tlapololiztli.',
 'ipb-unblock-addr' => 'Ahtiquitzacuilīz $1',
 'ipb-unblock' => 'Ahtiquitzacuilīz IP nozo tlatequitiltilīlli',
 'unblockip' => 'Ahtiquitzacuilīz tlatequitiltilīlli',
+'ipblocklist' => 'Tlatequitiltilīltzacualli',
 'ipblocklist-submit' => 'Tlatēmōz',
 'infiniteblock' => 'ahtlamic',
 'expiringblock' => 'tlami īpan $1 īpan $2',
 'anononlyblock' => 'zan ahtōcā',
 'blocklink' => 'tiquitzacuilīz',
 'unblocklink' => 'ahtiquitzacuilīz',
+'change-blocklink' => 'Ticpatlaz tlatzacualli',
 'contribslink' => 'tlapatlaliztli',
 'blocklogpage' => 'Tlatequitiltilīlli ōmotzacuili',
 'blockme' => 'Timitzcuilīz',
@@ -1275,13 +1275,14 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'tooltip-ca-unwatch' => 'Ahtictlachiyāz inīn zāzanilli',
 'tooltip-search' => 'Tlatēmōz īpan {{SITENAME}}',
 'tooltip-search-go' => 'Tiyaz in zāzanilhuīc īca inīn huel melāhuac tōcaitl intlā yez',
+'tooltip-search-fulltext' => 'Tictemōz inīn tlahcuilōlli in āmac',
 'tooltip-p-logo' => 'Calīxatl',
 'tooltip-n-mainpage' => 'Tiquittaz in calīxatl',
 'tooltip-n-mainpage-description' => 'Tiquittaz in calīxatl',
 'tooltip-n-portal' => 'Tlachīhualiztechcopa, inōn tihuelīti titlachīhua, tlatēmoyān',
 'tooltip-n-recentchanges' => 'Yancuīc tlapatlaliztli huiquipan',
 'tooltip-n-randompage' => 'Tiquittāz cē zāzotlein zāzanilli',
-'tooltip-n-help' => 'Tlamachtiyān.',
+'tooltip-n-help' => 'In tēmachtīlōyān',
 'tooltip-t-whatlinkshere' => 'Mochīntīn zāzaniltin huiquipan quitzonhuiliah nicān',
 'tooltip-t-recentchangeslinked' => 'Yancuīc tlapatlaliztli inīn zāzanilhuīcpa moquintzonhuilia',
 'tooltip-feed-rss' => 'RSS tlachicāhualiztli inīn zāzaniltechcopa',
@@ -1307,6 +1308,7 @@ Hueliz cah inīn huēyi tlapatlaliztli. Timitztlātlauhtia ticmatīz cuallōtl a
 'tooltip-compareselectedversions' => 'Tiquinttāz ahneneuhquiliztli ōme zāzanilli tlapatlaliznepantlah.',
 'tooltip-watch' => 'Ticcēntilīz inīn zāzanilli motlachiyalizhuīc',
 'tooltip-upload' => 'Ticpēhua quetzaliztli',
+'tooltip-summary' => 'Xicaquilia tepitōn tlahcuilōltōntli',
 
 # Attribution
 'anonymous' => 'Ahtōcāitl {{PLURAL:$1|tlatequitiltilīlli|tlatequitiltilīlli}} īpan {{SITENAME}}',
@@ -1501,6 +1503,9 @@ Niman tihuelīti [[Special:UserLogin|timocalaqui]] auh ticpactiāz huiquitica.',
 # HTML forms
 'htmlform-selectorother-other' => 'Occē',
 
+# Search suggestions
+'searchsuggest-search' => 'Tlatēmoliztli',
+
 # API errors
 'api-error-ok-but-empty' => 'Tlâtek îtlakawilistli: Âmò tènankilia in tlatèmakani.',
 'api-error-overwrite' => 'Awel motlâkuilnepanòltis sè èwalli tlèn yi katki.',
index 8d3edf6..9ecdd4b 100644 (file)
@@ -167,7 +167,6 @@ $messages = array(
 'qbbrowse' => 'Liū-lám',
 'qbedit' => 'Siu-kái',
 'qbpageoptions' => 'Chit ia̍h',
-'qbpageinfo' => 'Bo̍k-lo̍k',
 'qbmyoptions' => 'Goá ê ia̍h',
 'qbspecialpages' => 'Te̍k-sû-ia̍h',
 'faq' => 'Būn-tah',
@@ -396,8 +395,6 @@ $2',
 
 Lí ē-sái mài kì-miâ kè-siok sú-iōng {{SITENAME}}, mā ē-sái iōng kāng-ê a̍h-sī pa̍t-ê sin-hūn têng teng-ji̍p.
 Chhiaⁿ chù-ì: ū-kóa ia̍h ū khó-lêng khoàⁿ-tio̍h bē-su lí iû-goân teng-ji̍p tiong; che chi-iàu piàⁿ tiāu lí ê browser ê cache chiū ē chèng-siông.",
-'welcomecreation' => '==Hoan-gêng $1!==
-Í-keng khui hó lí ê kháu-chō.  M̄-hó bē-kì-tit chhiâu lí ê iōng-chiá siat-tēng.',
 'yourname' => 'Lí ê iōng-chiá miâ-chheng:',
 'yourpassword' => 'Lí ê bi̍t-bé:',
 'yourpasswordagain' => 'Têng phah bi̍t-bé:',
@@ -499,6 +496,7 @@ Lîm-sî ê bi̍t-bé: $2',
 'subject-preview' => 'Ū-lám tê-bo̍k/piau-tê:',
 'blockednoreason' => '無寫理由',
 'whitelistedittext' => 'Lí ài $1 chiah ē-sái siu-kái.',
+'nosuchsectiontitle' => 'Chhoé bô toān-lo̍h',
 'loginreqtitle' => 'Su-iàu Teng-ji̍p',
 'loginreqlink' => 'Teng-ji̍p',
 'loginreqpagetext' => 'Lí ài $1 chiah thang khoàⁿ pat ia̍h.',
@@ -570,6 +568,9 @@ Lí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê k
 'histfirst' => 'Tùi thâu-chêng',
 'histlast' => 'Tùi āu-piah',
 
+# Revision feed
+'history-feed-item-nocomment' => '$1 tī $2',
+
 # Diffs
 'lineno' => 'Tē $1 chōa:',
 'compareselectedversions' => 'Pí-phēng soán-te̍k ê pán-pún',
@@ -594,6 +595,7 @@ Lí ê kái-piàn tī ē-kha ê bûn-jī-keh. Lí su-iàu chiōng lí chò ê k
 'searchprofile-advanced' => 'chìn-chi̍t-pō͘',
 'searchprofile-articles-tooltip' => 'Tī $1 chhoé',
 'searchprofile-images-tooltip' => 'Chhoé tóng-àn',
+'search-result-size' => '$1 ({{PLURAL:$2|1 jī-goân|$2 jī-goân}})',
 'search-section' => '(toān-lo̍h $1)',
 'searchall' => 'choân-pō·',
 'showingresults' => 'Ē-kha tùi #<b>$2</b> khai-sí hián-sī <b>$1</b> hāng kiat-kó.',
@@ -680,6 +682,7 @@ Tī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--
 'recentchangeslinked-feed' => 'Siong-koan ê kái-piàn',
 'recentchangeslinked-toolbox' => 'Siong-koan ê kái-piàn',
 'recentchangeslinked-noresult' => 'Lí chí-tēng ê tiâu-kiaⁿ lāi-té chhōe bô jīn-hô kái-piàn.',
+'recentchangeslinked-page' => 'Ia̍h ê miâ:',
 
 # Upload
 'upload' => 'Kā tóng-àn chiūⁿ-bāng',
@@ -725,6 +728,7 @@ Tī pat-lâng liân-lo̍k lí ê sî-chūn bē kā e-mail tsū-tsí siá chhut--
 'filehist' => 'Tóng-àn ê le̍k-sú',
 'filehist-current' => 'hiān-chāi',
 'filehist-datetime' => 'Ji̍t-kî/ Sî-kan',
+'filehist-user' => 'Iōng-chiá',
 'imagelinks' => 'Iáⁿ-siōng liân-kiat',
 'linkstoimage' => 'Í-hā ê ia̍h liân kàu chit ê iáⁿ-siōng:',
 'nolinkstoimage' => 'Bô poàⁿ ia̍h liân kàu chit tiuⁿ iáⁿ-siōng.',
@@ -816,6 +820,7 @@ Template:Khu-pia̍t-ia̍h',
 'allpages' => 'Só·-ū ê ia̍h',
 'alphaindexline' => '$1 kàu $2',
 'nextpage' => 'Āu 1 ia̍h ($1)',
+'prevpage' => '前一頁($1)',
 'allpagesfrom' => 'Tùi chit ia̍h khai-sí hián-sī:',
 'allarticles' => 'Só·-ū ê bûn-chiuⁿ',
 'allinnamespace' => 'Só·-ū ê ia̍h ($1 miâ-khong-kan)',
@@ -857,6 +862,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Watchlist
 'watchlist' => 'Kàm-sī-toaⁿ',
 'mywatchlist' => 'Góa ê kàm-sī-toaⁿ',
+'watchlistfor2' => '予$1 $2',
 'nowatchlist' => 'Lí ê kàm-sī-toaⁿ bô pòaⁿ hāng.',
 'watchnologin' => 'Bô teng-ji̍p',
 'watchnologintext' => 'Lí it-tēng ài [[Special:UserLogin|teng-ji̍p]] chiah ē-tàng siu-kái lí ê kàm-sī-toaⁿ.',
@@ -1028,6 +1034,7 @@ Liâu--lo̍h-khì chìn-chêng, chhiáⁿ seng khak-tēng lí ū liáu-kái chia
 'tooltip-ca-viewsource' => 'Chit ia̍h pó-hō͘ tiâu leh.
 Lí ē-sái khoàⁿ i ê goân-sú-bé.',
 'tooltip-ca-history' => 'Chit ia̍h ê chá-chêng pán-pún',
+'tooltip-ca-delete' => 'Thâi chit ia̍h',
 'tooltip-ca-unwatch' => 'Lí ê kàm-sī-toaⁿ soá tiàu chit ia̍h.',
 'tooltip-search' => 'Chhoé {{SITENAME}}',
 'tooltip-search-fulltext' => 'Chhoé ū chia-ê jī ê ia̍h',
@@ -1096,6 +1103,7 @@ Lí ē-sái khoàⁿ i ê goân-sú-bé.',
 'watchlistall2' => 'choân-pō͘',
 'namespacesall' => 'choân-pō·',
 'monthsall' => 'choân-pō͘',
+'limitall' => '全部',
 
 # E-mail address confirmation
 'confirmemail' => 'Khak-jīn e-mail chū-chí',
index c95a5a8..12c44e4 100644 (file)
@@ -54,211 +54,211 @@ $namespaceAliases = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => "Sottolinia 'e jonte:",
-'tog-justify'                 => "Alliniamento d''e paracrafe mpare",
-'tog-hideminor'               => "Annascunne 'e cagne piccirille  'int'a ll'úrdeme cagne",
-'tog-extendwatchlist'         => "Spanne ll'asservate speciale pe fà vedé tutte 'e cagne possíbbele",
-'tog-usenewrc'                => 'Urdeme cagne avanzate (JavaScript)',
-'tog-numberheadings'          => "Annúmmera automatecamente 'e títule",
-'tog-showtoolbar'             => "Aspone 'a barra d''e stromiente 'e cagno (JavaScript)",
-'tog-editondblclick'          => "Cagna 'e pàggene cliccanno ddoje vote (JavaScript)",
-'tog-editsection'             => "Permette 'e cagnà 'e sezzione cu a jonta [cagna]",
+'tog-underline' => "Sottolinia 'e jonte:",
+'tog-justify' => "Alliniamento d''e paracrafe mpare",
+'tog-hideminor' => "Annascunne 'e cagne piccirille  'int'a ll'úrdeme cagne",
+'tog-extendwatchlist' => "Spanne ll'asservate speciale pe fà vedé tutte 'e cagne possíbbele",
+'tog-usenewrc' => 'Urdeme cagne avanzate (JavaScript)',
+'tog-numberheadings' => "Annúmmera automatecamente 'e títule",
+'tog-showtoolbar' => "Aspone 'a barra d''e stromiente 'e cagno (JavaScript)",
+'tog-editondblclick' => "Cagna 'e pàggene cliccanno ddoje vote (JavaScript)",
+'tog-editsection' => "Permette 'e cagnà 'e sezzione cu a jonta [cagna]",
 'tog-editsectiononrightclick' => "Permette 'e cangne 'e sezzione cliccanno p''o tasto destro ncopp 'e titule 'e sezzione (JavaScript)",
-'tog-showtoc'                 => "Mosta ll'innece pe 'e paggene cu cchiù 'e 3 sezzione",
-'tog-rememberpassword'        => "Ricurda 'a registrazzione pe' cchiu sessione (for a maximum of $1 {{PLURAL:$1|day|days}})",
+'tog-showtoc' => "Mosta ll'innece pe 'e paggene cu cchiù 'e 3 sezzione",
+'tog-rememberpassword' => "Ricurda 'a registrazzione pe' cchiu sessione (for a maximum of $1 {{PLURAL:$1|day|days}})",
 
 'underline-always' => 'Sèmpe',
-'underline-never'  => 'Màje',
+'underline-never' => 'Màje',
 
 # Dates
-'sunday'        => 'dumméneca',
-'monday'        => 'lunnerì',
-'tuesday'       => 'marterì',
-'wednesday'     => 'miercurì',
-'thursday'      => 'gioverì',
-'friday'        => 'viernarì',
-'saturday'      => 'sàbbato',
-'sun'           => 'dum',
-'mon'           => 'lun',
-'tue'           => 'mar',
-'wed'           => 'mier',
-'thu'           => 'gio',
-'fri'           => 'ven',
-'sat'           => 'sab',
-'january'       => 'jennaro',
-'february'      => 'frevàro',
-'march'         => 'màrzo',
-'april'         => 'abbrile',
-'may_long'      => 'màjo',
-'june'          => 'giùgno',
-'july'          => 'luglio',
-'august'        => 'aústo',
-'september'     => 'settembre',
-'october'       => 'ottobbre',
-'november'      => 'nuvembre',
-'december'      => 'dicèmbre',
-'january-gen'   => 'jennaro',
-'february-gen'  => 'frevaro',
-'march-gen'     => 'màrzo',
-'april-gen'     => 'abbrile',
-'may-gen'       => 'maggio',
-'june-gen'      => 'giùgno',
-'july-gen'      => 'luglio',
-'august-gen'    => 'aùsto',
+'sunday' => 'dumméneca',
+'monday' => 'lunnerì',
+'tuesday' => 'marterì',
+'wednesday' => 'miercurì',
+'thursday' => 'gioverì',
+'friday' => 'viernarì',
+'saturday' => 'sàbbato',
+'sun' => 'dum',
+'mon' => 'lun',
+'tue' => 'mar',
+'wed' => 'mier',
+'thu' => 'gio',
+'fri' => 'ven',
+'sat' => 'sab',
+'january' => 'jennaro',
+'february' => 'frevàro',
+'march' => 'màrzo',
+'april' => 'abbrile',
+'may_long' => 'màjo',
+'june' => 'giùgno',
+'july' => 'luglio',
+'august' => 'aústo',
+'september' => 'settembre',
+'october' => 'ottobbre',
+'november' => 'nuvembre',
+'december' => 'dicèmbre',
+'january-gen' => 'jennaro',
+'february-gen' => 'frevaro',
+'march-gen' => 'màrzo',
+'april-gen' => 'abbrile',
+'may-gen' => 'maggio',
+'june-gen' => 'giùgno',
+'july-gen' => 'luglio',
+'august-gen' => 'aùsto',
 'september-gen' => 'settembre',
-'october-gen'   => 'ottovre',
-'november-gen'  => 'nuvembre',
-'december-gen'  => 'dicembre',
-'jan'           => 'jen',
-'feb'           => 'fre',
-'mar'           => 'mar',
-'apr'           => 'abb',
-'may'           => 'maj',
-'jun'           => 'giu',
-'jul'           => 'lug',
-'aug'           => 'aus',
-'sep'           => 'set',
-'oct'           => 'ott',
-'nov'           => 'nuv',
-'dec'           => 'dic',
+'october-gen' => 'ottovre',
+'november-gen' => 'nuvembre',
+'december-gen' => 'dicembre',
+'jan' => 'jen',
+'feb' => 'fre',
+'mar' => 'mar',
+'apr' => 'abb',
+'may' => 'maj',
+'jun' => 'giu',
+'jul' => 'lug',
+'aug' => 'aus',
+'sep' => 'set',
+'oct' => 'ott',
+'nov' => 'nuv',
+'dec' => 'dic',
 
 # Categories related messages
 'category_header' => 'Paggene rìnt\'a categurìa "$1"',
-'subcategories'   => 'Categurìe secunnarie',
+'subcategories' => 'Categurìe secunnarie',
 
-'about'     => 'Nfromma',
-'article'   => 'Articulo',
+'about' => 'Nfromma',
+'article' => 'Articulo',
 'newwindow' => "(s'arape n'ata fenèsta)",
-'cancel'    => 'Scancèlla',
-'mypage'    => "'A paggena mia",
-'mytalk'    => "'E mmie chiacchieriàte",
-'anontalk'  => 'Chiacchierate pe chisto IP',
+'cancel' => 'Scancèlla',
+'mypage' => "'A paggena mia",
+'mytalk' => "'E mmie chiacchieriàte",
+'anontalk' => 'Chiacchierate pe chisto IP',
 
 # Cologne Blue skin
-'qbfind'         => 'Truòva',
-'qbedit'         => 'Càgna',
-'qbpageoptions'  => 'Chesta paggena',
-'qbpageinfo'     => "Nfrummazzione ncopp'â paggena",
-'qbmyoptions'    => "'E ppaggene mie",
+'qbfind' => 'Truòva',
+'qbedit' => 'Càgna',
+'qbpageoptions' => 'Chesta paggena',
+'qbpageinfo' => "Nfrummazzione ncopp'â paggena",
+'qbmyoptions' => "'E ppaggene mie",
 'qbspecialpages' => 'Pàggene speciàle',
 
-'errorpagetitle'    => 'Sbaglio',
-'returnto'          => 'Torna a $1.',
-'help'              => 'Ajùto',
-'search'            => 'Truova',
-'searchbutton'      => 'Truova',
-'go'                => 'Vàje',
-'history'           => "Verziune 'e primma",
-'history_short'     => 'Cronologgia',
-'printableversion'  => "Verzione pe' stampa",
-'permalink'         => 'Jonta permanente',
-'edit'              => 'Càgna',
-'editthispage'      => 'Càgna chesta paggena',
-'delete'            => 'Scancèlla',
-'deletethispage'    => 'Scancèlla chésta paggena',
-'protect'           => 'Ferma',
-'protectthispage'   => 'Ferma chesta paggena',
-'unprotect'         => 'Sferma',
+'errorpagetitle' => 'Sbaglio',
+'returnto' => 'Torna a $1.',
+'help' => 'Ajùto',
+'search' => 'Truova',
+'searchbutton' => 'Truova',
+'go' => 'Vàje',
+'history' => "Verziune 'e primma",
+'history_short' => 'Cronologgia',
+'printableversion' => "Verzione pe' stampa",
+'permalink' => 'Jonta permanente',
+'edit' => 'Càgna',
+'editthispage' => 'Càgna chesta paggena',
+'delete' => 'Scancèlla',
+'deletethispage' => 'Scancèlla chésta paggena',
+'protect' => 'Ferma',
+'protectthispage' => 'Ferma chesta paggena',
+'unprotect' => 'Sferma',
 'unprotectthispage' => 'Sferma chesta paggena',
-'newpage'           => 'Paggena nòva',
-'talkpage'          => "Paggena 'e chiàcchiera",
-'talkpagelinktext'  => 'Chiàcchiera',
-'specialpage'       => 'Paggena speciàle',
-'talk'              => 'Chiàcchiera',
-'toolbox'           => 'Strumiente',
-'imagepage'         => 'Paggena fiùra',
-'otherlanguages'    => 'Ate léngue',
-'redirectedfrom'    => "(Redirect 'a $1)",
-'lastmodifiedat'    => "Urdema cagnamiénto pe' a paggena: $2, $1.",
-'viewcount'         => 'Chesta paggena è stata lètta {{PLURAL:$1|una vòta|$1 vòte}}.',
-'jumpto'            => 'Vaje a:',
-'jumptonavigation'  => 'navigazione',
-'jumptosearch'      => 'truova',
+'newpage' => 'Paggena nòva',
+'talkpage' => "Paggena 'e chiàcchiera",
+'talkpagelinktext' => 'Chiàcchiera',
+'specialpage' => 'Paggena speciàle',
+'talk' => 'Chiàcchiera',
+'toolbox' => 'Strumiente',
+'imagepage' => 'Paggena fiùra',
+'otherlanguages' => 'Ate léngue',
+'redirectedfrom' => "(Redirect 'a $1)",
+'lastmodifiedat' => "Urdema cagnamiénto pe' a paggena: $2, $1.",
+'viewcount' => 'Chesta paggena è stata lètta {{PLURAL:$1|una vòta|$1 vòte}}.',
+'jumpto' => 'Vaje a:',
+'jumptonavigation' => 'navigazione',
+'jumptosearch' => 'truova',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => "'Nfrummazione ncòpp'a {{SITENAME}}",
-'aboutpage'            => "Project:'Nfrummazione",
-'disclaimers'          => 'Avvertimiènte',
-'disclaimerpage'       => 'Project:Avvertimiènte generale',
-'edithelp'             => 'Guida',
-'helppage'             => 'Help:Ajùto',
-'mainpage'             => 'Paggena prencepale',
+'aboutsite' => "'Nfrummazione ncòpp'a {{SITENAME}}",
+'aboutpage' => "Project:'Nfrummazione",
+'disclaimers' => 'Avvertimiènte',
+'disclaimerpage' => 'Project:Avvertimiènte generale',
+'edithelp' => 'Guida',
+'helppage' => 'Help:Ajùto',
+'mainpage' => 'Paggena prencepale',
 'mainpage-description' => 'Paggena prencepale',
-'portal'               => "Porta d''a cummunetà",
-'portal-url'           => "Project:Porta d''a cummunetà",
+'portal' => "Porta d''a cummunetà",
+'portal-url' => "Project:Porta d''a cummunetà",
 
 'badaccess' => "Nun haje 'e premmesse abbastante.",
 
-'newmessageslink'         => "nuove 'mmasciàte",
-'newmessagesdifflink'     => "differenze cu 'a revisione precedente",
+'newmessageslink' => "nuove 'mmasciàte",
+'newmessagesdifflink' => "differenze cu 'a revisione precedente",
 'youhavenewmessagesmulti' => 'Tiene nuove mmasciate $1',
-'editsection'             => 'càgna',
-'editold'                 => 'càgna',
-'toc'                     => 'Énnece',
-'showtoc'                 => 'faje vedé',
-'hidetoc'                 => 'annascunne',
-'viewdeleted'             => 'Vire $1?',
+'editsection' => 'càgna',
+'editold' => 'càgna',
+'toc' => 'Énnece',
+'showtoc' => 'faje vedé',
+'hidetoc' => 'annascunne',
+'viewdeleted' => 'Vire $1?',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Articulo',
-'nstab-user'      => 'Paggena utente',
-'nstab-project'   => "Paggena 'e servizio",
-'nstab-image'     => 'Fiura',
+'nstab-main' => 'Articulo',
+'nstab-user' => 'Paggena utente',
+'nstab-project' => "Paggena 'e servizio",
+'nstab-image' => 'Fiura',
 'nstab-mediawiki' => "'Mmasciata",
-'nstab-help'      => 'Ajùto',
-'nstab-category'  => 'Categurìa',
+'nstab-help' => 'Ajùto',
+'nstab-category' => 'Categurìa',
 
 # General errors
 'filedeleteerror' => 'Nun se pô scancellà \'o file "$1"',
-'cannotdelete'    => "Nun è possibbele scassà 'a paggena o 'a fiura addamannata. (Putria éssere stato già scancellato.)",
-'badtitle'        => "'O nnomme nun è jùsto",
+'cannotdelete' => "Nun è possibbele scassà 'a paggena o 'a fiura addamannata. (Putria éssere stato già scancellato.)",
+'badtitle' => "'O nnomme nun è jùsto",
 
 # Login and logout pages
-'logouttext'                 => "'''Site asciùte.'''
+'logouttext' => "'''Site asciùte.'''
 
 Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putite trasì n'ata vota, cu 'o stesso nomme o cu n'ato nomme.",
-'welcomecreation'            => "== Bemmenuto, $1! ==
+'welcomecreation' => "== Bemmenuto, $1! ==
 
 'O cunto è stato criato currettamente.  Nun scurdà 'e perzonalizzà 'e ppreferenze 'e {{SITENAME}}.",
-'remembermypassword'         => 'Allicuordate d"a password (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'yourdomainname'             => "Spiecà 'o dumminio",
-'login'                      => 'Tràse',
-'userlogin'                  => "Tràse o cria n'acciesso nuovo",
-'logout'                     => 'Jèsce',
-'userlogout'                 => 'Jèsce',
-'notloggedin'                => 'Acciesso nun affettuato',
-'nologin'                    => "Nun haje ancora n'acciesso? '''$1'''.",
-'nologinlink'                => 'Crialo mmo',
-'createaccount'              => 'Cria nu cunto nuovo',
-'gotaccount'                 => "Tiene già nu cunto? '''$1'''.",
-'gotaccountlink'             => 'Tràse',
-'loginerror'                 => "Probblema 'e accièsso",
-'loginsuccesstitle'          => 'Acciesso affettuato',
-'nosuchusershort'            => 'Nun ce stanno utente cu o nòmme "$1". Cuntrolla si scrivìste buòno.',
-'nouserspecified'            => "Tiene 'a dìcere nu nomme pricìso.",
+'remembermypassword' => 'Allicuordate d"a password (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'yourdomainname' => "Spiecà 'o dumminio",
+'login' => 'Tràse',
+'userlogin' => "Tràse o cria n'acciesso nuovo",
+'logout' => 'Jèsce',
+'userlogout' => 'Jèsce',
+'notloggedin' => 'Acciesso nun affettuato',
+'nologin' => "Nun haje ancora n'acciesso? '''$1'''.",
+'nologinlink' => 'Crialo mmo',
+'createaccount' => 'Cria nu cunto nuovo',
+'gotaccount' => "Tiene già nu cunto? '''$1'''.",
+'gotaccountlink' => 'Tràse',
+'loginerror' => "Probblema 'e accièsso",
+'loginsuccesstitle' => 'Acciesso affettuato',
+'nosuchusershort' => 'Nun ce stanno utente cu o nòmme "$1". Cuntrolla si scrivìste buòno.',
+'nouserspecified' => "Tiene 'a dìcere nu nomme pricìso.",
 'acct_creation_throttle_hit' => 'Ce dispiace, haje già criato $1 utente. Nun ne pô crià ate.',
-'accountcreated'             => 'Cunto criato',
-'loginlanguagelabel'         => 'Lengua: $1',
+'accountcreated' => 'Cunto criato',
+'loginlanguagelabel' => 'Lengua: $1',
 
 # Edit page toolbar
 'image_sample' => 'Essempio.jpg',
-'image_tip'    => 'Fiura ncuorporata',
+'image_tip' => 'Fiura ncuorporata',
 
 # Edit pages
-'minoredit'        => 'Chisto è nu cagnamiénto piccerillo',
-'watchthis'        => "Tiene d'uocchio chesta paggena",
-'savearticle'      => "Sarva 'a paggena",
-'preview'          => 'Anteprimma',
-'showpreview'      => 'Vere anteprimma',
-'showdiff'         => "Fa veré 'e cagnamiente",
-'loginreqtitle'    => "Pe' cagnà chesta paggena abbesognate aseguì ll'acciesso ô sito.",
-'loginreqlink'     => "aseguì ll'acciesso",
+'minoredit' => 'Chisto è nu cagnamiénto piccerillo',
+'watchthis' => "Tiene d'uocchio chesta paggena",
+'savearticle' => "Sarva 'a paggena",
+'preview' => 'Anteprimma',
+'showpreview' => 'Vere anteprimma',
+'showdiff' => "Fa veré 'e cagnamiente",
+'loginreqtitle' => "Pe' cagnà chesta paggena abbesognate aseguì ll'acciesso ô sito.",
+'loginreqlink' => "aseguì ll'acciesso",
 'loginreqpagetext' => "Pe' veré ate ppaggene abbesognate $1.",
-'accmailtitle'     => "'O password è stato mannato.",
-'accmailtext'      => '\'A password pe ll\'utente "$1" fuje mannata ô nnerizzo $2.',
-'previewnote'      => "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena NUN songo ancora sarvate!'''",
-'editing'          => "Cagnamiento 'e $1",
-'templatesused'    => "Template ausate 'a chesta paggena:",
+'accmailtitle' => "'O password è stato mannato.",
+'accmailtext' => '\'A password pe ll\'utente "$1" fuje mannata ô nnerizzo $2.',
+'previewnote' => "'''Chesta è sola n'anteprimma; 'e cagnamiénte â paggena NUN songo ancora sarvate!'''",
+'editing' => "Cagnamiento 'e $1",
+'templatesused' => "Template ausate 'a chesta paggena:",
 
 # "Undo" feature
 'undo-summary' => "Canciella 'o cagnamiento $1 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|Chiàcchiera]])",
@@ -270,48 +270,48 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'rev-delundel' => 'faje vedé/annascunne',
 
 # Search results
-'searchresults'    => "Risultato d''a recerca",
+'searchresults' => "Risultato d''a recerca",
 'searchresulttext' => "Pe sapé de cchiù ncopp'â comme ascia 'a {{SITENAME}}, vere [[{{MediaWiki:Helppage}}|Ricerca in {{SITENAME}}]].",
-'notitlematches'   => "Voce addemannata nun truvata dint' 'e titule 'e articulo",
-'notextmatches'    => "Voce addemannata nun truvata dint' 'e teste 'e articulo",
-'searchhelp-url'   => 'Help:Ajùto',
-'powersearch'      => 'Truova',
+'notitlematches' => "Voce addemannata nun truvata dint' 'e titule 'e articulo",
+'notextmatches' => "Voce addemannata nun truvata dint' 'e teste 'e articulo",
+'searchhelp-url' => 'Help:Ajùto',
+'powersearch' => 'Truova',
 
 # Preferences page
-'mypreferences'         => "Preferenze d''e mie",
-'changepassword'        => 'Cagna password',
-'prefs-rc'              => 'Urdeme nove',
-'prefs-watchlist'       => 'Asservate speciale',
-'columns'               => 'Culonne:',
+'mypreferences' => "Preferenze d''e mie",
+'changepassword' => 'Cagna password',
+'prefs-rc' => 'Urdeme nove',
+'prefs-watchlist' => 'Asservate speciale',
+'columns' => 'Culonne:',
 'timezoneregion-africa' => 'Afreca',
-'username'              => 'Nomme utente',
-'yourlanguage'          => 'Lengua:',
+'username' => 'Nomme utente',
+'yourlanguage' => 'Lengua:',
 
 # User rights log
 'rightsnone' => '(nisciuno)',
 
 # Recent changes
-'recentchanges'     => 'Urdeme nove',
-'recentchangestext' => "Ncoppa chesta paggena song' appresentate ll'urdeme cagnamiente fatto ê cuntenute d\"o sito.",
-'rcnote'            => "Ccà sotto nce songo ll'urdeme {{PLURAL:$1|cangiamiento|'''$1''' cangiamiente}} 'e ll'urdeme {{PLURAL:$2|juorno|'''$2''' juorne}}, agghiuornate a $3.",
-'rclistfrom'        => "Faje vedé 'e cagnamiénte fatte a partì 'a $1",
-'rcshowhideminor'   => "$1 'e cagnamiénte piccerille",
-'rcshowhidebots'    => "$1 'e bot",
-'rcshowhideliu'     => "$1 ll'utente reggìstrate",
-'rcshowhideanons'   => "$1 ll'utente anonime",
-'rcshowhidemine'    => "$1 'e ffatiche mmee",
-'rclinks'           => "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne<br />$3",
-'hide'              => 'annascunne',
-'show'              => 'faje vedé',
+'recentchanges' => 'Urdeme nove',
+'recentchanges-summary' => "Ncoppa chesta paggena song' appresentate ll'urdeme cagnamiente fatto ê cuntenute d\"o sito.",
+'rcnote' => "Ccà sotto nce songo ll'urdeme {{PLURAL:$1|cangiamiento|'''$1''' cangiamiente}} 'e ll'urdeme {{PLURAL:$2|juorno|'''$2''' juorne}}, agghiuornate a $3.",
+'rclistfrom' => "Faje vedé 'e cagnamiénte fatte a partì 'a $1",
+'rcshowhideminor' => "$1 'e cagnamiénte piccerille",
+'rcshowhidebots' => "$1 'e bot",
+'rcshowhideliu' => "$1 ll'utente reggìstrate",
+'rcshowhideanons' => "$1 ll'utente anonime",
+'rcshowhidemine' => "$1 'e ffatiche mmee",
+'rclinks' => "Faje vedé ll'urdeme $1 cagnamiente dint' ll'urdeme $2 juorne<br />$3",
+'hide' => 'annascunne',
+'show' => 'faje vedé',
 'rc_categories_any' => 'Qualònca',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Cagnamiénte cullegate',
-'recentchangeslinked-feed'    => 'Cagnamiénte cullegate',
+'recentchangeslinked' => 'Cagnamiénte cullegate',
+'recentchangeslinked-feed' => 'Cagnamiénte cullegate',
 'recentchangeslinked-toolbox' => 'Cagnamiénte cullegate',
 
 # Upload
-'upload'        => 'Careca file',
+'upload' => 'Careca file',
 'uploadedimage' => 'ha carecato "[[$1]]"',
 
 # Special:ListFiles
@@ -319,11 +319,11 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 
 # File description page
 'file-anchor-link' => 'Fiura',
-'filehist-user'    => 'Utente',
-'imagelinks'       => 'Jonte ê ffiure',
+'filehist-user' => 'Utente',
+'imagelinks' => 'Jonte ê ffiure',
 
 # Random page
-'randompage'         => 'Na paggena qualsiase',
+'randompage' => 'Na paggena qualsiase',
 'randompage-nopages' => 'Nessuna pagina nel namespace selezionato.',
 
 'disambiguations' => "Paggene 'e disambigua",
@@ -331,24 +331,24 @@ Putite cuntinuà a ausà {{SITENAME}} comme n'utente senza nomme, o si nò putit
 'doubleredirects' => 'Redirect duppie',
 
 # Miscellaneous special pages
-'nbytes'       => '$1 {{PLURAL:$1|byte|byte}}',
-'ncategories'  => '$1 {{PLURAL:$1|categoria|categorie}}',
-'nlinks'       => '$1 {{PLURAL:$1|cullegamiento|cullegamiente}}',
+'nbytes' => '$1 {{PLURAL:$1|byte|byte}}',
+'ncategories' => '$1 {{PLURAL:$1|categoria|categorie}}',
+'nlinks' => '$1 {{PLURAL:$1|cullegamiento|cullegamiente}}',
 'popularpages' => "Paggene cchiù 'speziunate",
-'wantedpages'  => 'Paggene cchiù addemannate',
-'shortpages'   => 'Paggene curte',
-'longpages'    => 'Paggene cchiú longhe',
-'newpages'     => 'Paggene cchiù frische',
-'move'         => 'Spusta',
+'wantedpages' => 'Paggene cchiù addemannate',
+'shortpages' => 'Paggene curte',
+'longpages' => 'Paggene cchiú longhe',
+'newpages' => 'Paggene cchiù frische',
+'move' => 'Spusta',
 'movethispage' => 'Spusta chesta paggena',
 
 # Special:AllPages
-'allpages'       => "Tutte 'e ppaggene",
-'allarticles'    => "Tutt' 'e vvoce",
+'allpages' => "Tutte 'e ppaggene",
+'allarticles' => "Tutt' 'e vvoce",
 'allinnamespace' => "Tutt' 'e ppaggene d''o namespace $1",
 
 # Special:Categories
-'categories'         => 'Categurìe',
+'categories' => 'Categurìe',
 'categoriespagetext' => "Lista cumpleta d\"e categurie presente ncopp' 'o sito.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].",
@@ -357,30 +357,30 @@ Also see [[Special:WantedCategories|wanted categories]].",
 'linksearch-ok' => 'Truova',
 
 # Watchlist
-'watch'        => 'Secuta',
+'watch' => 'Secuta',
 'notanarticle' => 'Chesta paggena nun è na voce',
 
 'enotif_newpagetext' => 'Chesta è na paggena nòva.',
-'changed'            => 'cagnata',
+'changed' => 'cagnata',
 
 # Delete
-'deletepage'      => 'Scancella paggena',
-'excontent'       => "'o cuntenuto era: '$1'",
+'deletepage' => 'Scancella paggena',
+'excontent' => "'o cuntenuto era: '$1'",
 'excontentauthor' => "'o cuntenuto era: '$1' (e ll'unneco cuntribbutore era '[[Special:Contributions/$2|$2]]')",
-'exbeforeblank'   => "'O cuntenuto apprimm' 'a ll'arrevacamento era: '$1'",
-'exblank'         => "'a paggena era vacante",
-'actioncomplete'  => 'Azzione fernuta',
-'deletedtext'     => 'Qauccheruno ha scancellata \'a paggena "$1".  Addumannà \'o $2 pe na lista d"e ppaggene scancellate urdemamente.',
-'dellogpage'      => 'Scancellazione',
-'deletionlog'     => 'Log d"e scancellazione',
-'deletecomment'   => 'Raggióne',
+'exbeforeblank' => "'O cuntenuto apprimm' 'a ll'arrevacamento era: '$1'",
+'exblank' => "'a paggena era vacante",
+'actioncomplete' => 'Azzione fernuta',
+'deletedtext' => 'Qauccheruno ha scancellata \'a paggena "$1".  Addumannà \'o $2 pe na lista d"e ppaggene scancellate urdemamente.',
+'dellogpage' => 'Scancellazione',
+'deletionlog' => 'Log d"e scancellazione',
+'deletecomment' => 'Raggióne',
 
 # Rollback
-'rollback'   => "Ausa na revizione 'e primma",
+'rollback' => "Ausa na revizione 'e primma",
 'revertpage' => "Cangiaje 'e cagnamiénte 'e [[Special:Contributions/$2|$2]] ([[User talk:$2|discussione]]), cu â verzione 'e pprimma 'e  [[User:$1|$1]]",
 
 # Protect
-'prot_1movedto2'         => 'ha spustato [[$1]] a [[$2]]',
+'prot_1movedto2' => 'ha spustato [[$1]] a [[$2]]',
 'protect-expiry-options' => '2 ore:2 hours,1 juorno:1 day,3 juorne:3 days,1 semmana:1 week,2 semmane:2 weeks,1 mise:1 month,3 mese:3 months,6 mese:6 months,1 anno:1 year,infinito:infinite',
 
 # Undelete
@@ -391,45 +391,45 @@ Also see [[Special:WantedCategories|wanted categories]].",
 
 # Contributions
 'contributions' => 'Contribbute utente',
-'mycontris'     => 'Mie contribbute',
+'mycontris' => 'Mie contribbute',
 
 'sp-contributions-talk' => 'Chiàcchiera',
 
 # What links here
-'whatlinkshere'       => 'Paggene ca cullegano a chesta',
+'whatlinkshere' => 'Paggene ca cullegano a chesta',
 'whatlinkshere-title' => 'Paggene ca cullegano a $1',
-'nolinkshere'         => "Nisciuna paggena cuntene jonte ca mpuntano a '''[[:$1]]'''.",
+'nolinkshere' => "Nisciuna paggena cuntene jonte ca mpuntano a '''[[:$1]]'''.",
 
 # Block/unblock
-'blockip'            => 'Ferma utelizzatóre',
+'blockip' => 'Ferma utelizzatóre',
 'ipadressorusername' => 'Nnerizzo IP o nomme utente',
-'ipboptions'         => '2 ore:2 hours,1 juorno:1 day,3 juorne:3 days,1 semmana:1 week,2 semmane:2 weeks,1 mise:1 month,3 mese:3 months,6 mese:6 months,1 anno:1 year,infinito:infinite',
-'blockipsuccesssub'  => 'Blocco aseguito',
-'blocklink'          => 'ferma',
-'blocklogpage'       => 'Blocche',
-'blocklogentry'      => 'ha fermato "[[$1]]" pe\' nu mumento \'e $2 $3',
-'blocklogtext'       => "Chesta è 'a lista d''e azzione 'e blocco e sblocco utente.  'E nnerizze IP bloccate automaticamente nun nce so'. Addumannà 'a [[Special:BlockList|lista IP bloccate]] pp' 'a lista d''e nnerizze e nomme utente 'o ca blocco nce sta.",
+'ipboptions' => '2 ore:2 hours,1 juorno:1 day,3 juorne:3 days,1 semmana:1 week,2 semmane:2 weeks,1 mise:1 month,3 mese:3 months,6 mese:6 months,1 anno:1 year,infinito:infinite',
+'blockipsuccesssub' => 'Blocco aseguito',
+'blocklink' => 'ferma',
+'blocklogpage' => 'Blocche',
+'blocklogentry' => 'ha fermato "[[$1]]" pe\' nu mumento \'e $2 $3',
+'blocklogtext' => "Chesta è 'a lista d''e azzione 'e blocco e sblocco utente.  'E nnerizze IP bloccate automaticamente nun nce so'. Addumannà 'a [[Special:BlockList|lista IP bloccate]] pp' 'a lista d''e nnerizze e nomme utente 'o ca blocco nce sta.",
 
 # Move page
-'movearticle'             => "Spusta 'a paggena",
-'newtitle'                => 'Titulo nuovo:',
-'movepagebtn'             => "Spusta 'a paggena",
-'articleexists'           => "Na paggena cu chisto nomme asiste già, o pure 'o nomme scegliuto nun è buono.  Scegliere n'ato titulo.",
-'movedto'                 => 'spustata a',
-'movereason'              => 'Raggióne',
-'delete_and_move'         => 'Scancèlla e spusta',
+'movearticle' => "Spusta 'a paggena",
+'newtitle' => 'Titulo nuovo:',
+'movepagebtn' => "Spusta 'a paggena",
+'articleexists' => "Na paggena cu chisto nomme asiste già, o pure 'o nomme scegliuto nun è buono.  Scegliere n'ato titulo.",
+'movedto' => 'spustata a',
+'movereason' => 'Raggióne',
+'delete_and_move' => 'Scancèlla e spusta',
 'delete_and_move_confirm' => "Sì, suprascrivi 'a paggena asistente",
 
 # Export
 'export' => "Spurta 'e ppaggene",
 
 # Namespace 8 related
-'allmessages'        => "'Mmasciate d''o sistema",
-'allmessagesname'    => 'Nomme',
+'allmessages' => "'Mmasciate d''o sistema",
+'allmessagesname' => 'Nomme',
 'allmessagescurrent' => "Testo 'e mo",
 
 # Special:Import
-'import'                  => 'Mpurta paggene',
+'import' => 'Mpurta paggene',
 'import-interwiki-submit' => 'Mpurta',
 
 # Import log
@@ -438,8 +438,8 @@ Also see [[Special:WantedCategories|wanted categories]].",
 # Tooltip help for the actions
 'tooltip-pt-logout' => 'Jésce (logout)',
 'tooltip-minoredit' => 'Rénne chìsto cagnamiénto cchiù ppiccirìllo.',
-'tooltip-save'      => "Sàrva 'e cagnamiénte.",
-'tooltip-preview'   => "Primma 'e sarvà, vìre primma chille ca hê cagnàte!",
+'tooltip-save' => "Sàrva 'e cagnamiénte.",
+'tooltip-preview' => "Primma 'e sarvà, vìre primma chille ca hê cagnàte!",
 
 # Attribution
 'others' => 'ate',
@@ -450,10 +450,10 @@ Also see [[Special:WantedCategories|wanted categories]].",
 
 'exif-xyresolution-i' => '$1 punte pe pollice (dpi)',
 
-'exif-meteringmode-0'   => 'Scanusciuto',
+'exif-meteringmode-0' => 'Scanusciuto',
 'exif-meteringmode-255' => 'Ato',
 
-'exif-lightsource-0'  => 'Scanusciuta',
+'exif-lightsource-0' => 'Scanusciuta',
 'exif-lightsource-10' => "'Ntruvulato",
 'exif-lightsource-11' => 'Aumbruso',
 
@@ -469,14 +469,14 @@ Also see [[Special:WantedCategories|wanted categories]].",
 
 # E-mail address confirmation
 'confirmemail_needlogin' => "Abbesognate $1 pe cunfirmà 'o nnerizzo 'e e-mail d''o vuosto.",
-'confirmemail_loggedin'  => "'O nnerizzo 'e e-mail è vàleto",
+'confirmemail_loggedin' => "'O nnerizzo 'e e-mail è vàleto",
 
 # Delete conflict
 'deletedwhileediting' => 'Attenziòne: quaccherùno have scancellàto chesta pàggena prìmma ca tu accuminciàste â scrìvere!',
 
 # Auto-summaries
 'autoredircomment' => 'Redirect â paggena [[$1]]',
-'autosumm-new'     => 'Paggena nuova: $1',
+'autosumm-new' => 'Paggena nuova: $1',
 
 # Special:SpecialPages
 'specialpages' => 'Paggene speciale',
index b84edcf..ee7ee60 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
@@ -11,6 +11,7 @@
  * @author Boivie
  * @author Brik
  * @author Byrial
+ * @author Cocu
  * @author Danmichaelo
  * @author Dittaeva
  * @author Eirik
@@ -32,6 +33,7 @@
  * @author Nghtwlkr
  * @author Njardarlogar
  * @author Nsaa
+ * @author Pladask
  * @author Purodha
  * @author Qaqqalik
  * @author Samuelsen
@@ -39,6 +41,7 @@
  * @author Sjurhamre
  * @author Stigmj
  * @author Teak
+ * @author Wouterkoch
  * @author לערי ריינהארט
  */
 
@@ -161,7 +164,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Siste_endringer' ),
        'Recentchangeslinked'       => array( 'Relaterte_endringer' ),
        'Revisiondelete'            => array( 'Revisjonssletting' ),
-       'RevisionMove'              => array( 'Revisjonsflytting' ),
        'Search'                    => array( 'Søk' ),
        'Shortpages'                => array( 'Korte_sider' ),
        'Specialpages'              => array( 'Spesialsider' ),
@@ -362,7 +364,7 @@ $messages = array(
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldri',
-'underline-default' => 'Bruk nettleserstandard',
+'underline-default' => 'Nettleserens standardinnstillinger',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Skrifttype i redigeringsboksen:',
@@ -447,7 +449,7 @@ $messages = array(
 'newwindow' => '(åpnes i et nytt vindu)',
 'cancel' => 'Avbryt',
 'moredotdotdot' => 'Mer …',
-'mypage' => 'Min side',
+'mypage' => 'Min brukerside',
 'mytalk' => 'Min diskusjonsside',
 'anontalk' => 'Brukerdiskusjon for denne IP-adressen',
 'navigation' => 'Navigasjon',
@@ -458,7 +460,6 @@ $messages = array(
 'qbbrowse' => 'Bla gjennom',
 'qbedit' => 'Rediger',
 'qbpageoptions' => 'Sideinnstillinger',
-'qbpageinfo' => 'Sideinformasjon',
 'qbmyoptions' => 'Egne innstillinger',
 'qbspecialpages' => 'Spesialsider',
 'faq' => 'Ofte stilte spørsmål',
@@ -471,7 +472,7 @@ $messages = array(
 'vector-action-protect' => 'Beskytt',
 'vector-action-undelete' => 'Gjenopprett',
 'vector-action-unprotect' => 'Endre beskyttelse',
-'vector-simplesearch-preference' => 'Aktiver forbedrede søkeforslag (kun for drakten Vector)',
+'vector-simplesearch-preference' => 'Aktiver forenklet søkefelt (kun for drakten Vector)',
 'vector-view-create' => 'Opprett',
 'vector-view-edit' => 'Rediger',
 'vector-view-history' => 'Vis historikk',
@@ -481,6 +482,7 @@ $messages = array(
 'namespaces' => 'Navnerom',
 'variants' => 'Varianter',
 
+'navigation-heading' => 'Navigasjonsmeny',
 'errorpagetitle' => 'Feil',
 'returnto' => 'Tilbake til $1.',
 'tagline' => 'Fra {{SITENAME}}',
@@ -689,12 +691,12 @@ Spørring: $2',
 'viewsource-title' => 'Vis kilden til $1',
 'actionthrottled' => 'Handlingsgrense overskredet',
 'actionthrottledtext' => 'For å beskytte mot spam, kan du ikke utføre denne handlingen for mange ganger i løpet av et kort tidssrom, og du har overskredet denne grensen. Prøv igjen om noen minutter.',
-'protectedpagetext' => 'Denne siden har blitt låst for redigeringer.',
+'protectedpagetext' => 'Denne siden har blitt låst for endringer.',
 'viewsourcetext' => 'Du kan se og kopiere kilden til denne siden:',
 'viewyourtext' => "Du kan se og kopiere kilden til '''dine endringer''' på denne siden:",
-'protectedinterface' => 'Denne siden viser brukergrensesnittet for programvaren, og er låst for å hindre misbruk.',
-'editinginterface' => "'''Advarsel:''' Du redigerer en side som brukes i grensesnittet for programvaren.
-Endringer på denne siden vil påvirke hvordan grensesnittet vil se ut.
+'protectedinterface' => 'Denne siden fremskaffer brukergrensesnittekst for programvaren, og er låst for å hindre misbruk.',
+'editinginterface' => "'''Advarsel:''' Du redigerer en side som brukes for å fremskaffe grensesnittekst for programvaren.
+Endringer av denne siden vil påvirke hvordan grensesnittet vil se ut for andre brukere.
 For oversettelser er det best om du bruker [//translatewiki.net/wiki/Main_Page?setlang=nb translatewiki.net], prosjektet for oversettelse av MediaWiki.",
 'sqlhidden' => '(SQL-spørring skjult)',
 'cascadeprotected' => 'Denne siden er låst for redigering fordi den inkluderes på følgende sider som har dypbeskyttelse slått på:<!--{{PLURAL:$1}}-->
@@ -721,11 +723,11 @@ Administrators nærmere begrunnelse: «$3».',
 # Login and logout pages
 'logouttext' => "'''Du er nå logget ut.'''
 
-Du kan fortsette å bruke {{SITENAME}} anonymt, eller [[Special:UserLogin|logge inn igjen]] som samme eller en annen bruker.
+Du kan fortsette å bruke {{SITENAME}} anonymt, eller <span class='plainlinks'>[$1 logge inn igjen]</span> som samme eller en annen bruker.
 Merk at noen sider kan vise at du fortsatt er logget inn fram til du tømmer mellomlageret i nettleseren.",
-'welcomecreation' => '==Velkommen, $1!==
-Brukerkontoen din har blitt opprettet.
-Ikke glem å endre [[Special:Preferences|innstillingene]] dine.',
+'welcomeuser' => 'Velkommen, $1!',
+'welcomecreation-msg' => 'Kontoen din har blitt opprettet.
+Ikke glem å endre [[Special:Preferences|innstillingene dine]] på {{SITENAME}}.',
 'yourname' => 'Brukernavn:',
 'yourpassword' => 'Passord:',
 'yourpasswordagain' => 'Gjenta passord',
@@ -980,8 +982,8 @@ Hvis du er en uregistrert bruker og synes at du har fått irrelevante kommentare
 Du kan [[Special:Search/{{PAGENAME}}|søke etter denne sidetittelen]] på andre sider,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søke i relaterte logger],
 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>.',
+'noarticletext-nopermission' => 'Det er for tiden ingen tekst på denne siden.
+Du kan [[Special:Search/{{PAGENAME}}|søke etter sidens tittel]] blant 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.
@@ -1009,7 +1011,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',
+'continue-editing' => 'Gå til redigeringsfeltet',
 '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.
@@ -1088,6 +1090,15 @@ Slette- og flytteloggen vises nedenfor.',
 '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',
+'content-failed-to-parse' => 'Klarte ikke å tolke innholdet $2 for innholdsmodellen $1: $3',
+'invalid-content-data' => 'Ugyldig innhold',
+'content-not-allowed-here' => 'Innholdsmodellen «$1» er ikke tillatt på siden [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'WikiTekst',
+'content-model-text' => 'Ren tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Advarsel: Denne siden inneholder for mange prosesskrevende parserfunksjoner.
@@ -1342,8 +1353,6 @@ Detaljer kan finnes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-interwiki-caption' => 'Søsterprosjekter',
 'search-interwiki-default' => '$1-resultater:',
 'search-interwiki-more' => '(mer)',
-'search-mwsuggest-enabled' => 'med forslag',
-'search-mwsuggest-disabled' => 'ingen forslag',
 'search-relatedarticle' => 'Relatert',
 'mwsuggest-disable' => 'Slå av AJAX-forslag',
 'searcheverything-enable' => 'Søk i alle navnerom',
@@ -1609,6 +1618,9 @@ Den kan maks inneholde $1 {{PLURAL:$1|tegn|tegn}}.',
 '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',
+'logentry-rights-rights' => '$1 endret gruppemedlemskap for $3 fra $4 til $5',
+'logentry-rights-rights-legacy' => '$1 endret gruppemedlemskap for $3',
+'logentry-rights-autopromote' => '$1 ble automatisk forfremmet fra $4 til $5',
 'rightsnone' => '(ingen)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1761,7 +1773,7 @@ Se [[Special:NewFiles|galleriet over nye filer]] for en mer visuell visning',
 '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.
+'filepageexists' => 'Beskrivelsessiden for denne filen finnes allerede på <strong>[[:$1]]</strong>, men ingen filer med dette navnet finnes. Sammendraget du skriver inn vil ikke vises på beskrivelsessiden. For at det skal dukke opp der må du skrive det inn manuelt etter å ha lastet opp filen.
 [[$1|thumb]]',
 'fileexists-extension' => 'En fil med et lignende navn finnes: [[$2|thumb]]
 * Navnet på din fil: <strong>[[:$1]]</strong>
@@ -1847,6 +1859,7 @@ Om problemet fortsetter, kontakt en [[Special:ListUsers/sysop|administrator]].',
 'backend-fail-notsame' => 'En ikke-identisk fil finnes allerede på $1.',
 'backend-fail-invalidpath' => '$1 er ikke en gyldig lagringsbane.',
 'backend-fail-delete' => 'Kunne ikke slette filen $1.',
+'backend-fail-describe' => 'Kunne ikke endre metadata for filen «$1».',
 'backend-fail-alreadyexists' => 'Filen $1 finnes allerede.',
 'backend-fail-store' => 'Kunne ikke lagre filen $1 på $2.',
 'backend-fail-copy' => 'Kunne ikke kopiere filen $1 til $2.',
@@ -1894,7 +1907,7 @@ Den kan ikke sikkerhetskontrolleres.',
 'uploadstash-summary' => 'Denne siden gir tilgang til filer som har blitt lastet opp (eller er i ferd med å bli lastet opp) men som ennå ikke er publisert til wikien. Disse filene er ikke synlige for andre enn brukeren som lastet dem opp.',
 'uploadstash-clear' => 'Fjern stashede filer',
 'uploadstash-nofiles' => 'Du har ingen stashede filer.',
-'uploadstash-badtoken' => 'Utføringen av den handlingen var mislykket, kanskje fordi dine redigeringsrettigheter har utløpt. Prøv igjen.',
+'uploadstash-badtoken' => 'Utføringen av den handlingen var mislykket, kanskje fordi redigeringsrettighetene dine har utløpt. Prøv igjen.',
 'uploadstash-errclear' => 'Fjerning av filene var mislykket.',
 'uploadstash-refresh' => 'Oppdater listen over filer',
 'invalid-chunk-offset' => 'Ugyldig delforskyvning',
@@ -1995,7 +2008,7 @@ Kanskje du vil redigere beskrivelsen på dens [$2 filbeskrivelsesside].',
 '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.',
+'upload-disallowed-here' => 'Du kan ikke overskrive denne filen.',
 
 # File reversion
 'filerevert' => 'Tilbakestill $1',
@@ -2229,7 +2242,7 @@ Se også [[Special:WantedCategories|ønskede kategorier]].',
 'linksearch-pat' => 'Søkemønster:',
 'linksearch-ns' => 'Navnerom:',
 'linksearch-ok' => 'Søk',
-'linksearch-text' => 'Jokertegn som «*.wikipedia.org» kan brukes.
+'linksearch-text' => 'Jokertegn slik som i «*.wikipedia.org» kan brukes.
 Det kreves at det oppgis minst et toppnivådomene, for eksempel «*.org».<br />
 Støttede protokoller: <code>$1</code> (ikke legg til noen av disse i søket ditt).',
 'linksearch-line' => '$1 lenkes fra $2',
@@ -2280,8 +2293,8 @@ Mer informasjon om de enkelte rettighetstypene kan finnes [[{{MediaWiki:Listgrou
 '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.',
+'emailpagetext' => 'Du kan bruke skjemaet under for å sende en e-post til denne {{GENDER:$1|brukeren}}.
+E-postadressen du har satt i [[Special:Preferences|innstillingene dine]] vil vises i «Fra»-feltet i e-posten, slik at mottakeren kan svare deg direkte.',
 'usermailererror' => 'E-postobjekt returnerte feilen:',
 'defemailsubject' => 'E-post fra {{SITENAME}}-brukeren «$1»',
 'usermaildisabled' => 'Brukerepost deaktivert',
@@ -2348,20 +2361,23 @@ Fremtidige endringer til denne siden og den tilhørende diskusjonssiden blir lis
 
 'enotif_mailer' => '{{SITENAME}}s påminnelsessystem',
 'enotif_reset' => 'Merk alle sider som besøkt',
-'enotif_newpagetext' => 'Dette er en ny side.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-bruker',
-'changed' => 'endret',
-'created' => 'opprettet',
-'enotif_subject' => '{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED av $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}-siden $1 har blitt slettet av {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}-siden $1 har blitt opprettet av {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}-siden $1 har blitt flyttet av {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}-siden $1 har blitt gjenopprettet av {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}-siden $1 har blitt endret av {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => '{{SITENAME}}-siden $1 ble slettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
+'enotif_body_intro_created' => '{{SITENAME}}-siden $1 ble opprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
+'enotif_body_intro_moved' => '{{SITENAME}}-siden $1 ble flyttet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
+'enotif_body_intro_restored' => '{{SITENAME}}-siden $1 ble gjenopprettet $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
+'enotif_body_intro_changed' => '{{SITENAME}}-siden $1 ble endret $PAGEEDITDATE av {{gender:$2|$2}}. Se $3 for den nåværende versjonen.',
 'enotif_lastvisited' => 'Se $1 for alle endringer siden ditt forrige besøk.',
 'enotif_lastdiff' => 'Se $1 for å se denne endringen.',
 'enotif_anon_editor' => 'anonym bruker $1',
 'enotif_body' => 'Kjære $WATCHINGUSERNAME,
 
-
-{{SITENAME}}-siden $PAGETITLE har blitt $CHANGEDORCREATED den $PAGEEDITDATE av $PAGEEDITOR, se $PAGETITLE_URL for den nåværende revisjonen.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Redigeringssammendrag: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2466,7 +2482,7 @@ Dette er de nåværende innstillingene for siden '''$1''':",
 Du kan endre sidens beskyttelsesnivå, men det vil ikke påvirke dypbeskyttelsen.',
 'protect-default' => 'Tillat alle brukere',
 'protect-fallback' => 'Må ha «$1»-tillatelse',
-'protect-level-autoconfirmed' => 'Blokker nye og uregistrerte brukere',
+'protect-level-autoconfirmed' => 'Blokker uregistrerte og nye brukere',
 'protect-level-sysop' => 'Kun administratorer',
 'protect-summary-cascade' => 'dypbeskyttelse',
 'protect-expiring' => 'utløper $1 (UTC)',
@@ -2529,7 +2545,8 @@ Dersom en ny side ved samme navn har blitt oprettet etter slettingen, vil de gje
 'undeletedrevisions' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} gjenopprettet',
 'undeletedrevisions-files' => '{{PLURAL:$1|Én revisjon|$1 revisjoner}} og {{PLURAL:$2|én fil|$2 filer}} gjenopprettet',
 'undeletedfiles' => '{{PLURAL:$1|Én fil|$1 filer}} gjenopprettet',
-'cannotundelete' => 'Kunne ikke gjenopprette siden (den kan være gjenopprettet av noen andre).',
+'cannotundelete' => 'Gjennoppretting feilet:
+$1',
 'undeletedpage' => "'''$1 ble gjenopprettet'''
 
 Sjekk [[Special:Log/delete|slettingsloggen]] for en liste over nylige slettinger og gjenopprettelser.",
@@ -2562,7 +2579,7 @@ $1',
 # Contributions
 'contributions' => 'Brukerbidrag',
 'contributions-title' => 'Brukerbidrag av $1',
-'mycontris' => 'Mine bidrag',
+'mycontris' => 'Bidrag',
 'contribsub2' => 'For $1 ($2)',
 'nocontribs' => 'Ingen endringer er funnet som passer disse kriteriene.',
 'uctop' => '(siste)',
@@ -2830,6 +2847,7 @@ Målsiden «[[:$1]]» finnes allerede. Vil du slette den så denne siden kan fly
 'immobile-target-namespace-iw' => 'Du kan ikke flytte en side til et navn som er en interwikilenke.',
 'immobile-source-page' => 'Denne siden kan ikke flyttes.',
 'immobile-target-page' => 'Kan ikke flytte til det navnet.',
+'bad-target-model' => 'Det ønskede målet bruker en annen innholdsmodell. Kan ikke konvertere fra $1 til $2.',
 'imagenocrossnamespace' => 'Kan ikke flytte filer til andre navnerom enn filnavnerommet',
 'nonfile-cannot-move-to-file' => 'Kan ikke flytte ikke-filer til filnavnerom',
 'imagetypemismatch' => 'Den nye filendelsen tilsvarer ikke filtypen',
@@ -2954,7 +2972,6 @@ Lagre den på din egen datamaskin og last den opp her.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-testing',
-'javascripttest-disabled' => 'Denne funksjonen er ikke aktivert på denne wikien.',
 'javascripttest-title' => 'Kjører $1 tester',
 'javascripttest-pagetext-noframework' => 'Denne siden er reservert for å kjøre JavaScript-tester.',
 'javascripttest-pagetext-unknownframework' => 'Ukjent testerammeverk "$1".',
@@ -3082,6 +3099,7 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 
 # Info page
 'pageinfo-title' => 'Informasjon om «$1»',
+'pageinfo-not-current' => 'Beklager, det er ikke mulig å vise denne informasjonen for gamle revisjoner.',
 'pageinfo-header-basic' => 'Grunnleggende informasjon',
 'pageinfo-header-edits' => 'Redigeringshistorikk',
 'pageinfo-header-restrictions' => 'Sidebeskyttelse',
@@ -3090,6 +3108,7 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-default-sort' => 'Standardsorteringsnøkkel',
 'pageinfo-length' => 'Sidelengde (i bytes)',
 'pageinfo-article-id' => 'Side-ID',
+'pageinfo-language' => 'Språk for sideinnholdet',
 'pageinfo-robot-policy' => 'Søkemotorstatus',
 'pageinfo-robot-index' => 'Indekserbar',
 'pageinfo-robot-noindex' => 'Ikke indekserbar',
@@ -3106,10 +3125,17 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'pageinfo-authors' => 'Totalt antall forskjellige forfattere',
 'pageinfo-recent-edits' => 'Antall nylige redigeringer (innen siste $1)',
 'pageinfo-recent-authors' => 'Antall nylige forfattere',
-'pageinfo-restriction' => 'Sidebeskyttelse ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Sideinformasjon',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Talt som innholdsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Dypbeskyttelse starter herfra',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Dypbeskyttelse fra',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3130,6 +3156,8 @@ Dette er sannsynligvis forårsaket av en lenke til et svartelistet eksternt nett
 'markedaspatrollederror' => 'Kan ikke merke som godkjent',
 'markedaspatrollederrortext' => 'Du må spesifisere en versjon å merke som godkjent.',
 'markedaspatrollederror-noautopatrol' => 'Du kan ikke merke dine egne endringer som godkjente.',
+'markedaspatrollednotify' => 'Denne endringen av $1 har blitt patruljert.',
+'markedaspatrollederrornotify' => 'Patruljering feilet.',
 
 # Patrol log
 'patrol-log-page' => 'Godkjenningslogg',
@@ -3194,6 +3222,7 @@ Ved å åpne den kan systemet ditt kompromitteres.",
 'hours' => '{{PLURAL:$1|$1 time|$1 timer}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dager}}',
 'ago' => '$1 siden',
+'just-now' => 'nettopp',
 
 # Bad image list
 'bad_image_list' => 'Formatet er som følger:
@@ -3684,6 +3713,7 @@ Denne bekreftelseskoden går ut på dato $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-transkludering er slått av]',
 'scarytranscludefailed' => '[Malen kunne ikke hentes for $1]',
+'scarytranscludefailed-httpstatus' => '[Henting av mal for $1 feilet: HTTP $2]',
 'scarytranscludetoolong' => '[URL-en er for lang]',
 
 # Delete conflict
@@ -3822,6 +3852,7 @@ Du kan også [[Special:EditWatchlist|bruke standardverktøyet]].',
 'version-license' => 'Lisens',
 'version-poweredby-credits' => "Denne wikien er drevet av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andre',
+'version-credits-summary' => 'Vi ønsker å takke følgende personer for deres bidrag til [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuere det og/eller modifisere det under betingelsene i GNU General Public License som publisert av Free Software Foundation; enten versjon 2 av lisensen, eller (etter eget valg) enhver senere versjon.
 
 MediaWiki er distribuert i håp om at det vil være nyttig, men UTEN NOEN GARANTI; ikke engang implisitt garanti av SALGBARHET eller EGNETHET FOR ET BESTEMT FORMÅL. Se GNU General Public License for flere detaljer.
@@ -3961,9 +3992,9 @@ Bilder vises med full oppløsning, mens andre filtyper startes direkte gjennom s
 'logentry-move-move_redir-noredirect' => '$1 flyttet siden $3 til $4 over en omdirigering uten å etterlate en omdirigering',
 'logentry-patrol-patrol' => '$1 markerte revisjon $4 av siden $3 som patruljert',
 'logentry-patrol-patrol-auto' => '$1 markerte automatisk revisjon $4 av siden $3 som patruljert',
-'logentry-newusers-newusers' => '$1 opprettet en brukerkonto',
-'logentry-newusers-create' => '$1 opprettet en brukerkonto',
-'logentry-newusers-create2' => '$1 opprettet en brukerkonto $3',
+'logentry-newusers-newusers' => 'Kontoen $1 ble opprettet',
+'logentry-newusers-create' => 'Kontoen $1 ble opprettet',
+'logentry-newusers-create2' => 'Kontoen $3 ble opprettet av $1',
 'logentry-newusers-autocreate' => 'Konto $1 ble opprettet automatisk',
 'newuserlog-byemail' => 'passord sendt på e-post',
 
@@ -3983,6 +4014,10 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
 'feedback-bugcheck' => 'Suprert! Bare sjekk at den ikke er en av de [$1 kjente feilene]',
 'feedback-bugnew' => 'Jeg sjekket. Rapporter en ny bug.',
 
+# Search suggestions
+'searchsuggest-search' => 'Søk',
+'searchsuggest-containing' => 'inneholder …',
+
 # API errors
 'api-error-badaccess-groups' => 'Du har ikke tillatelse til å laste opp filer til denne wikien.',
 'api-error-badtoken' => 'Intern feil: Ugyldig token.',
@@ -4035,4 +4070,6 @@ Om det ikke er tilfellet, kan du bruke det enkle skjemaet som du finner under. K
 'duration-centuries' => '$1 {{PLURAL:$1|århundre|århundrer}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
 
+# Unknown messages
+'svg-long-error' => 'Ugyldig SVG-fil: $1',
 );
index db850eb..5051116 100644 (file)
@@ -359,7 +359,6 @@ $messages = array(
 'qbbrowse' => 'Blädern',
 'qbedit' => 'Ännern',
 'qbpageoptions' => 'Disse Sied',
-'qbpageinfo' => 'Sietendaten',
 'qbmyoptions' => 'Instellen',
 'qbspecialpages' => 'Spezialsieten',
 'faq' => 'Faken stellte Fragen',
@@ -606,11 +605,8 @@ As Grund is angeven: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Du büst nu afmellt.'''
 
-Du kannst {{SITENAME}} nu anonym wiederbruken oder di ünner dissen oder en annern Brukernaam wedder [[Special:UserLogin|anmellen]].
+Du kannst {{SITENAME}} nu anonym wiederbruken oder di ünner dissen oder en annern Brukernaam wedder <span class='plainlinks'>[$1 anmellen]</span>.
 Denk dor an, dat welk Sieden ünner Ümstänn noch jümmer so wiest warrn köönt, as wenn du anmellt weerst. Dat ännert sik, wenn du den Cache vun dien Browser leddig maakst.",
-'welcomecreation' => '== Willkamen, $1! ==
-Dien Brukerkonto is nu inricht.
-Vergeet nich, de Sied för di persönlich [[Special:Preferences|intostellen]].',
 'yourname' => 'Dien Brukernaam',
 'yourpassword' => 'Dien Passwoort',
 'yourpasswordagain' => 'Passwoort nochmal ingeven',
@@ -809,7 +805,7 @@ Wenn du en anonymen Bruker büst un meenst, dat disse Kommentaren nich an di ric
 oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} disse Sied ännern]</span>.',
 'noarticletext-nopermission' => 'Disse Sied hett opstunns keen Text.
 Du kannst in annere Sieden [[Special:Search/{{PAGENAME}}|na dissen Titel söken]]
-oder <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} in de Logböker söken]</span>.',
+oder <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} in de Logböker söken]</span>, man du hest nich dat Recht, de Sied optostellen.',
 'userpage-userdoesnotexist' => 'Dat Brukerkonto „<nowiki>$1</nowiki>“ gifft dat noch nich. Överlegg, wat du disse Siet würklich nee opstellen/ännern wullt.',
 'userpage-userdoesnotexist-view' => 'Dat Brukerkonto „$1“ gifft dat nich.',
 'blocked-notice-logextract' => 'Disse Bruker is opstunns sperrt.
@@ -827,7 +823,7 @@ De jüngste Indrag in dat Sperr-Logbook wart ünnen wiest:',
 'userinvalidcssjstitle' => "'''Wohrschau:''' Dat gifft keen Skin „$1“. Denk dor an, dat .css- un .js-Sieden  för Brukers mit en lütten Bookstaven anfangen mööt, to’n Bispeel ''{{ns:user}}:Brukernaam/vector.css'' un nich ''{{ns:user}}:Brukernaam/Vector.css''.",
 'updated' => '(Ännert)',
 'note' => "'''Wohrschau:'''",
-'previewnote' => "'''Dit is blots en Vörschau, de Siet is noch nich spiekert!'''",
+'previewnote' => "Dit is bloots en Vörschau, de Sied is noch nich spiekert!'''",
 'previewconflict' => 'Disse Vörschau wiest den Inholt vun dat Textfeld baven; so warrt de Siet utseihn, wenn du nu spiekerst.',
 'session_fail_preview' => "'''Deit uns leed! Wi kunnen dien Ännern nich spiekern. Diene Sitzungsdaten weren weg.
 Versöök dat noch wedder. Wenn dat noch jümmer nich geiht, denn versöök di [[Special:UserLogout|aftomellen]] un denn wedder antomellen.'''",
@@ -927,9 +923,7 @@ De Grund weer: ''$2''",
 'currentrev' => 'Aktuelle Version',
 'currentrev-asof' => 'Aktuelle Version vun’n $1',
 'revisionasof' => 'Version vun $1',
-'revision-info' => '<div id="viewingold-warning" style="background: #ffbdbd; border: 1px solid #BB7979; font-weight: bold; padding: .5em 1em;">
-Dit is en ole Version vun disse Siet, so as $2 de $1 ännert hett. De Version kann temlich stark vun de <a href="{{FULLURL:{{FULLPAGENAME}}}}" title="{{FULLPAGENAME}}">aktuelle Version</a> afwieken.
-</div>',
+'revision-info' => "Verschoon vun'n $4, Klock $5 vun $2",
 'previousrevision' => 'Nächstöllere Version→',
 'nextrevision' => 'Ne’ere Version →',
 'currentrevisionlink' => 'aktuelle Version',
@@ -1055,7 +1049,7 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
 'mergelogpagetext' => 'Dit is dat Logbook över de tohoopföhrten Versionshistorien.',
 
 # Diffs
-'history-title' => 'Versionshistorie vun „$1“',
+'history-title' => 'Verschoonsgeschicht vun „$1“',
 'lineno' => 'Reeg $1:',
 'compareselectedversions' => 'Ünnerscheed twischen den utwählten Versionen wiesen',
 'showhideselectedversions' => 'Utwählt Versionen wiesen/versteken',
@@ -1104,8 +1098,6 @@ Seh to, dat de Versionsgeschicht vun’n Artikel vun de Historie her bi de Reeg
 'search-interwiki-caption' => 'Süsterprojekten',
 'search-interwiki-default' => '$1 Resultaten:',
 'search-interwiki-more' => '(mehr)',
-'search-mwsuggest-enabled' => 'mit Vörslääg',
-'search-mwsuggest-disabled' => 'kene Vörslääg',
 'search-relatedarticle' => 'Verwandt',
 'mwsuggest-disable' => 'Vörslääg per Ajax utstellen',
 'searcheverything-enable' => 'In all Naamrüüm söken',
@@ -1565,7 +1557,7 @@ Kann angahn, dat dat beter geiht, wenn du dat to en Tiet versöchst, to de op de
 'filehist-filesize' => 'Dateigrött',
 'filehist-comment' => 'Kommentar',
 'filehist-missing' => 'Datei fehlt',
-'imagelinks' => 'Dateiverwiesen',
+'imagelinks' => 'Dateibruuk',
 'linkstoimage' => 'Disse {{PLURAL:$1|Sied|Sieden}} bruukt dit Bild:',
 'linkstoimage-more' => 'Mehr as {{PLURAL:$1|ene Sied|$1 Sieden}} wiest na disse Datei.
 Disse List wiest blot {{PLURAL:$1|den eersten Lenk|de eersten $1 Lenken}} op disse Datei.
@@ -1726,7 +1718,7 @@ to den vun den tweeten Wiederleiden wiest warrt, un to den de eerste Wiederleide
 'listusers-editsonly' => 'Blot Brukers mit Bidrääg wiesen',
 'listusers-creationsort' => 'Na Opstelldatum sorteren',
 'usereditcount' => '$1 {{PLURAL:$1|Ännern|Ännern}}',
-'usercreated' => 'Opstellt an’n $1 üm $2',
+'usercreated' => "{{GENDER:$3|Opstellt}} an'n $1 üm Klock $2",
 'newpages' => 'Ne’e Sieden',
 'newpages-username' => 'Brukernaam:',
 'ancientpages' => 'Öllste Sieden',
@@ -1902,11 +1894,7 @@ Mehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgroupr
 
 'enotif_mailer' => '{{SITENAME}} E-Mail-Bescheedgeevdeenst',
 'enotif_reset' => 'All Sieden as besöcht marken',
-'enotif_newpagetext' => 'Dit is en ne’e Siet.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-Bruker',
-'changed' => 'ännert',
-'created' => 'opstellt',
-'enotif_subject' => '[{{SITENAME}}] De Siet „$PAGETITLE“ is vun $PAGEEDITOR $CHANGEDORCREATED worrn',
 'enotif_lastvisited' => 'All Ännern siet dien letzten Besöök op een Blick: $1',
 'enotif_lastdiff' => 'Kiek bi $1 för dit Ännern.',
 'enotif_anon_editor' => 'Anonymen Bruker $1',
index 1e33586..acaca93 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Nedersaksisch (Nedersaksisch)
+/** Nedersaksies (Nedersaksies)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -80,7 +80,6 @@ $magicWords = array(
        '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' ),
@@ -147,7 +146,7 @@ $magicWords = array(
        'img_middle'                => array( '1', 'midden', 'middle' ),
        'img_bottom'                => array( '1', 'benejen', 'beneden', 'bottom' ),
        'img_text_bottom'           => array( '1', 'tekste-benejen', 'tekst-beneden', 'text-bottom' ),
-       'img_link'                  => array( '1', 'verwiezing=$', 'verwijzing=$1', 'link=$1' ),
+       'img_link'                  => array( '1', 'verwiezing=$1', 'verwijzing=$1', 'link=$1' ),
        'sitename'                  => array( '1', 'WEBSTEENAAM', 'SITENAAM', 'SITENAME' ),
        'ns'                        => array( '0', 'NR:', 'NS:' ),
        'localurl'                  => array( '0', 'LOKALEURL', 'LOCALURL:' ),
@@ -274,7 +273,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Leste_wiezigingen' ),
        'Recentchangeslinked'       => array( 'Volg_verwiezingen' ),
        'Revisiondelete'            => array( 'Versie_vortdoon' ),
-       'RevisionMove'              => array( 'Versie_verplaotsen' ),
        'Search'                    => array( 'Zeuken' ),
        'Shortpages'                => array( 'Korte_artikels' ),
        'Specialpages'              => array( 'Spesiale_pagina\'s' ),
@@ -453,7 +451,6 @@ $messages = array(
 'qbbrowse' => 'Blaojen',
 'qbedit' => 'Bewark',
 'qbpageoptions' => 'Disse zied',
-'qbpageinfo' => 'Ziedinformasie',
 'qbmyoptions' => 'Veurkeuren',
 'qbspecialpages' => 'Spesiale ziejen',
 'faq' => 'Vragen die vake esteld wörden',
@@ -714,11 +711,8 @@ De beheerder gaf hierveur de volgende reden: "$3".',
 # Login and logout pages
 'logouttext' => "'''Je bin noen aofemeld.'''
 
-Je kunnen {{SITENAME}} noen anoniem gebruken of je eigen [[Special:UserLogin|opniej anmelden]] onder disse of n aandere gebrukersnaam.
+Je kunnen {{SITENAME}} noen anoniem gebruken of je eigen <span class='plainlinks'>[$1 opniej anmelden]</span> onder disse of n aandere gebrukersnaam.
 t Kan ween dat der wat ziejen bin die weeregeven wörden asof je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
-'welcomecreation' => '== Welkom, $1! ==
-Joew gebrukersnaam is an-emaakt.
-Vergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] in te stellen.',
 'yourname' => 'Gebrukersnaam',
 'yourpassword' => 'Wachtwoord',
 'yourpasswordagain' => 'Opniej invoeren',
@@ -1326,8 +1320,6 @@ Waorschienlik ku'j der meer gegevens over vienen in t [{{fullurl:{{#Special:Log}
 'search-interwiki-caption' => 'Zusterprojekten',
 'search-interwiki-default' => '$1 resultaoten:',
 'search-interwiki-more' => '(meer)',
-'search-mwsuggest-enabled' => 'mit anbevelingen',
-'search-mwsuggest-disabled' => 'gien anbevelingen',
 'search-relatedarticle' => 'Verwaant',
 'mwsuggest-disable' => 'Anbevelingen via AJAX uutschakelen',
 'searcheverything-enable' => 'In alle naamruumten zeuken',
@@ -2325,11 +2317,7 @@ Toekomstige wiezigingen op disse zied en de overlegzied zullen hier vermeld wör
 
 'enotif_mailer' => '{{SITENAME}}-berichgevingssysteem',
 '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}}-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',
@@ -2935,7 +2923,6 @@ De tiedelike map is niet anwezig.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript testen',
-'javascripttest-disabled' => 'Disse funksie steet niet an op disse wiki.',
 'javascripttest-title' => 'Tests uutvoeren veur $1',
 'javascripttest-pagetext-noframework' => 'Disse zied is ereserveerd veur t uutvoeren van JavaScript-testen.',
 'javascripttest-pagetext-unknownframework' => 'Onbekend testraamwark "$1".',
@@ -3065,7 +3052,6 @@ Meestentieds kömp dit deur n uutgaonde verwiezing die op de zwarte lieste steet
 'pageinfo-authors' => 'Totaal antal verschillende auteurs',
 'pageinfo-recent-edits' => 'Antal nieje bewarkingen (in de veurbieje $1).',
 'pageinfo-recent-authors' => 'Leste antal van verschillende auteurs',
-'pageinfo-restriction' => 'Ziedbeveiliging ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magies woord|Magiese woorden}} ($1)',
 'pageinfo-hidden-categories' => 'Verbörgen {{PLURAL:$1|kategorie|kategorieën}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Gebruukten mal|Gebruukten mallen}} ($1)',
@@ -3917,6 +3903,10 @@ Aanders ku\'j oek t eenvoudige formulier hieronder gebruken. Joew opmarkingen zu
 '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',
 
+# Search suggestions
+'searchsuggest-search' => 'Zeuken / zuken / zuiken',
+'searchsuggest-containing' => 'bevat...',
+
 # API errors
 'api-error-badaccess-groups' => 'Je maggen gien bestaanden in disse wiki inlaojen.',
 'api-error-badtoken' => 'Interne fout: t token klopt niet.',
index 0e6ab45..9088513 100644 (file)
@@ -60,7 +60,7 @@ $messages = array(
 'tog-hidepatrolled' => 'गस्ती(patrolled)सम्पादनहरु हालका परिवर्तनहरुमा लुकाउने',
 'tog-newpageshidepatrolled' => 'गस्ती(patrolled) पृष्ठहरु नयाँ पृष्ठ सूचीबाट लुकाउने',
 'tog-extendwatchlist' => 'निगरानी सूचीलाई सबै परिवर्तनहरू देखाउने गरी बढाउने , हालैको  बाहेक',
-'tog-usenewrc' => 'विà¤\95सित à¤¹à¤¾à¤²à¤\95à¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤ªà¥\8dरयà¥\8bà¤\97 à¤\97रà¥\8dनà¥\87 ( जाभास्क्रिप्ट चाहिन्छ)',
+'tog-usenewrc' => 'पà¥\83षà¥\8dठà¤\95ा à¤­à¤°à¥\8dà¤\96रà¤\95ा à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤° à¤\85वलà¥\8bà¤\95न à¤¸à¥\82à¤\9aà¥\80à¤\95à¥\8b à¤\86धारमा à¤¸à¤¾à¤®à¥\82हिà¤\95 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनहरà¥\81 ( जाभास्क्रिप्ट चाहिन्छ)',
 'tog-numberheadings' => 'शीर्षकहरुलाई स्वत:अङ्कित गर्नुहोस्',
 'tog-showtoolbar' => 'सम्पादन औजारबट्टा देखाउने( जाभा स्क्रिप्ट चाहिन्छ)',
 'tog-editondblclick' => 'दोहोरो क्लिकमा पृष्ठ सम्पादन गर्ने (जाभा स्क्रिप्ट चाहिन्छ)',
@@ -68,17 +68,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'शीर्षकमा दाहिने क्लिकद्वारा खण्ड सम्पादन सक्षम पार्ने ( जाभा स्क्रिप्ट चाहिने )',
 'tog-showtoc' => 'सामग्री तालिका हेर्ने (तीन भन्दा बढी शीर्षक भएमा)',
 'tog-rememberpassword' => 'यस ब्राउजरमा मेरो प्रवेशलाई सम्झनुहोस् (अधिकतम $1 {{PLURAL:$1|दिन|दिनहरु}} सम्म)',
-'tog-watchcreations' => 'मà¥\87रà¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मा à¤®à¥\88लà¥\87 à¤¸à¥\83à¤\9cना à¤\97रà¥\87à¤\95à¥\8b à¤ªà¥\83षà¥\8dठ à¤¥à¤ª्ने',
-'tog-watchdefault' => 'मैले सम्पादन गरेको पृष्ठ निगरानी सूचीमा थप्ने',
-'tog-watchmoves' => 'मैले सारेको पृष्ठहरुलाई निगरानी सूचीमा थप्ने',
-'tog-watchdeletion' => 'मैले हटाएको पृष्ठहरुलाई निगरानी सूचीमा थप्ने',
+'tog-watchcreations' => 'मà¥\87रà¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मा à¤®à¥\88लà¥\87 à¤¸à¥\83à¤\9cना à¤\97रà¥\87à¤\95à¥\8b à¤ªà¥\83षà¥\8dठ à¤° à¤\85पलà¥\8bड à¤\9cà¥\8bड्ने',
+'tog-watchdefault' => 'मà¥\88लà¥\87 à¤¸à¤®à¥\8dपादन à¤\97रà¥\87à¤\95à¥\8b à¤ªà¥\83षà¥\8dठ à¤° à¤«à¤¾à¤\87ल à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मा à¤¥à¤ªà¥\8dनà¥\87',
+'tog-watchmoves' => 'मैले सारेको पृष्ठहरु र फाइलहरुलाई निगरानी सूचीमा थप्ने',
+'tog-watchdeletion' => 'मैले हटाएको पृष्ठहरु र फाइलहरुलाई निगरानी सूचीमा थप्ने',
 'tog-minordefault' => 'सबै सम्पादनहरुलाई पूर्वनिर्धारित रुपमा सामान्य चिनो लगाउने',
 'tog-previewontop' => 'सम्पादन सन्दुक अगि पूर्वरुप देखाउने',
 'tog-previewonfirst' => 'पहिलो सम्पादनमा पूर्वरुप देखाउने',
 'tog-nocache' => 'ब्राउजर पृष्ठ क्यासिङ्ग निस्क्रिय पार्ने',
-'tog-enotifwatchlistpages' => 'मà¥\87रà¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मा à¤°à¤¹à¥\87à¤\95à¥\8b à¤ªà¥\83षà¥\8dठ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रिà¤\8f à¤®à¤²à¤¾à¤\88 à¤\88-मà¥\87ल à¤\97रà¥\8dनà¥\87',
+'tog-enotifwatchlistpages' => 'मà¥\87रà¥\8b à¤¨à¤¿à¤\97रानà¥\80 à¤¸à¥\82à¤\9aà¥\80मा à¤°à¤¹à¥\87à¤\95ा à¤ªà¥\83षà¥\8dठ à¤\85थवा à¤«à¤¾à¤\87लहरà¥\81 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रिà¤\8f à¤®à¤²à¤¾à¤\88 à¤\88-मà¥\87ल à¤\97रियà¥\8bसà¥\8d',
 'tog-enotifusertalkpages' => 'मेरो प्रयोगकर्ता वार्ता पृष्ठ परिवर्तन गरिए मलाई ई-मेल गर्ने',
-'tog-enotifminoredits' => 'पृष्ठहरुको सामान्य सम्पादनको लागि पनि मलाई ई-मेल गर्ने',
+'tog-enotifminoredits' => 'पृष्ठहरु र फाइलहरुको सामान्य सम्पादन भएमा पनि मलाई ई-मेल गरियोस्',
 'tog-enotifrevealaddr' => 'जानकारी इ-मेलहरुमा मेरो इ-मेल खुलाउने',
 'tog-shownumberswatching' => 'निगरानी गरिरहेका प्रयोगकर्ताहरुको संख्या देखाउने',
 'tog-oldsig' => 'वर्तमान हस्ताक्षर:',
@@ -102,7 +102,7 @@ $messages = array(
 
 'underline-always' => 'सधैँ',
 'underline-never' => 'कहिल्यै',
-'underline-default' => 'ब्राउजर पूर्वस्थिति',
+'underline-default' => 'सà¥\8dà¤\95à¥\80न à¤\85थवा à¤¬à¥\8dराà¤\89à¤\9cर à¤ªà¥\82रà¥\8dवसà¥\8dथिति',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'फन्ट प्रकार क्षेत्र सम्पादन गर्नुहोस् :',
@@ -189,8 +189,8 @@ $messages = array(
 'newwindow' => '(नयाँ विन्डोमा खुल्छ)',
 'cancel' => 'रद्द',
 'moredotdotdot' => 'थप...',
-'mypage' => 'मà¥\87रà¥\8b à¤ªà¥\83षà¥\8dठ',
-'mytalk' => 'मà¥\87रà¥\8b à¤\95à¥\81रा',
+'mypage' => 'पृष्ठ',
+'mytalk' => 'वारà¥\8dता',
 'anontalk' => 'यस IP को वारेमा वार्तालाप गर्नुहोस्',
 'navigation' => 'अन्वेषण',
 'and' => '&#32;र',
@@ -200,7 +200,6 @@ $messages = array(
 'qbbrowse' => 'ब्राउज गर्ने',
 'qbedit' => 'सम्पादन गर्ने',
 'qbpageoptions' => 'यो पेज',
-'qbpageinfo' => 'सन्दर्भ',
 'qbmyoptions' => 'मेरो पेज',
 'qbspecialpages' => 'विशेष पृष्ठहरु',
 'faq' => 'धैरै सोधिएका प्रश्नहरु',
@@ -213,7 +212,7 @@ $messages = array(
 'vector-action-protect' => 'सुरक्षित गर्ने',
 'vector-action-undelete' => 'हटाएको रद्द गर्ने',
 'vector-action-unprotect' => 'सुरक्षा परिवर्तन गर्ने',
-'vector-simplesearch-preference' => 'विशिषà¥\8dठ खोज सुझावहरु सक्रिय पार्ने (भेक्टर त्वचाको लागि मात्र)',
+'vector-simplesearch-preference' => 'साधारण खोज सुझावहरु सक्रिय पार्ने (भेक्टर त्वचाको लागि मात्र)',
 'vector-view-create' => 'सृजना गर्ने',
 'vector-view-edit' => 'सम्पादन',
 'vector-view-history' => 'इतिहास हेर्ने',
@@ -223,6 +222,7 @@ $messages = array(
 'namespaces' => 'नेमस्पेस',
 'variants' => 'बहुरुपहरु',
 
+'navigation-heading' => 'नेविगेशन मेनू',
 'errorpagetitle' => 'त्रुटि',
 'returnto' => '$1 मा फर्कनुहोस् ।',
 'tagline' => '{{SITENAME}}बाट',
@@ -323,6 +323,7 @@ $1',
 'youhavenewmessages' => 'तपाईंको लागि ($2) मा  $1 छ ।',
 'newmessageslink' => 'नयाँ सन्देशहरू',
 'newmessagesdifflink' => 'आखिरी परिवर्तन',
+'youhavenewmessagesfromusers' => 'तपाईंको लागि  {{PLURAL:$3|प्रयोगकर्ता|$3 प्रयोगकर्ताहरु}} ($2) बाट $1',
 'youhavenewmessagesmulti' => 'तपाईंको लागि $1 मा  नयाँ सन्देशहरू छन्',
 'editsection' => 'सम्पादन',
 'editsection-brackets' => '[$1]',
@@ -435,8 +436,8 @@ $1',
 'viewyourtext' => "यस पृष्ठमा रहेका '''तपाईँका सम्पादनहरु''' हेर्न या प्रतिलिपी गर्न सक्नुहुन्छ :",
 'protectedinterface' => 'यो पृष्ठले सफ्टवेयरको लागि अन्तरमोहडा पाठ प्रदान गर्दछ , र यसलाई दुरुपयोग हुनबाट बचाउन ताल्चा मारिएको छ।',
 'editinginterface' => "'''चेतावनी:''' तपाईं यस्तो पृष्ठलाई सम्पादन गर्नुहुँदैछ, जसले सफ्टवेयरको लागि अन्तरमोहोड़ा (interface) पाठ प्रदान गर्दछ।
-यसको परिवर्तनले अरु प्रयोगकर्ताको अन्तरमोहोड़ाको प्रदर्शनमा प्रभाव पार्छ।
-मà¥\80डियाविà¤\95िà¤\95à¥\8b à¤¸à¥\8dथानà¥\80यà¤\95रण à¤ªà¤°à¤¿à¤¯à¥\8bà¤\9cना à¤¨à¤¿à¤®à¥\8dति à¤\85नà¥\81वाद à¤\97रà¥\8dन à¤\95à¥\83पया à¤¯à¤¹à¤¾à¤\81 à¤\9cानà¥\81हà¥\8bसà¥\8d [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]",
+यसà¤\95à¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनलà¥\87 à¤¯à¤¸ à¤µà¤¿à¤\95िमा à¤\85रà¥\81 à¤ªà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95à¥\8b à¤\85नà¥\8dतरमà¥\8bहà¥\8bड़ाà¤\95à¥\8b à¤ªà¥\8dरदरà¥\8dशनमा à¤ªà¥\8dरभाव à¤ªà¤¾à¤°à¥\8dà¤\9b।
+सबà¥\88 à¤µà¤¿à¤\95िà¤\95ा à¤¨à¤¿à¤®à¥\8dति à¤\85नà¥\81वाद à¤\9cà¥\8bडà¥\8dन à¤\85थवा à¤ªà¤°à¤¿à¤¬à¤°à¥\8dतन à¤\97रà¥\8dन à¤\95à¥\83पया à¤¯à¤¹à¤¾à¤\81 à¤\9cानà¥\81हà¥\8bसà¥\8d [//translatewiki.net/ translatewiki.net], à¤®à¥\80डियाविà¤\95ि à¤¸à¥\8dथानà¥\80यà¤\95रण à¤ªà¤¾à¤°à¤¿à¤¯à¥\8bà¤\9cना।",
 'sqlhidden' => '(SQL क्वेरी लुकाएको)',
 'cascadeprotected' => 'यो पृष्ठ सम्पादन गर्नबाट सुरक्षित गरिएकोछ किनभनें   {{PLURAL:$1|पृष्ठ |पृष्ठहरु}}मा  सुरक्षित गर्नुका साथै प्रपात ("cascading") विकल्प खुल्ला राखिएकोछ:
 $2',
@@ -449,6 +450,7 @@ $2',
 'filereadonlyerror' => 'फाइल "$1" लाई परिवर्तन गर्न सकिंदैन किन भनें फाइल भण्डार  "$2" केवल पढ्ने स्थिति (read-only mode)मा छ।
 
 कारण यो दिएकोछ: "\'\'$3\'\'"।',
+'exception-nologin' => 'प्रवेश (लग ईन) नगरिएको',
 
 # Virus scanner
 'virus-badscanner' => "खराव मिलान: अज्ञात भाइरस स्क्यानर :''$1''",
@@ -457,10 +459,9 @@ $2',
 
 # Login and logout pages
 'logouttext' => "'''तपाईं अहिले बाहिर निस्कनु भएको छ।'''
-तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा प्रयोग गर्न सक्नुहुन्छ, अथवा अघिकै वा अर्कै कुनै नामको खाताबाट [[Special:UserLogin|फेरि प्रवेश गर्न]] पनि सक्नुहुन्छ।
+तपाईंले नाम/खाताविनै पनि {{SITENAME}}मा प्रयोग गर्न सक्नुहुन्छ, अथवा अघिकै वा अर्कै कुनै नामको खाताबाट <span class='plainlinks'>[$1 फेरि प्रवेश गर्न]</span> पनि सक्नुहुन्छ।
 याद राख्नुहोस् तपाईंले ब्राउजरको स्मरण भण्डार खालि नगर्दासम्म कुनै पृष्ठहरूमा तपाईं अझै प्रवेश गरिराखेको देखाउन सक्छ।",
-'welcomecreation' => '== स्वागतम् , $1! ==
-तपाँईको खाता खोलिएको छ। [[Special:Preferences|{{SITENAME}} preferences]]मा आफ्ना अभिरुचिहरू परिवर्तन गर्न नबिर्सिनुहोला।',
+'welcomeuser' => '$1जी स्वागत छ!',
 'yourname' => 'प्रयोगकर्ता नाम:',
 'yourpassword' => 'पासवर्ड',
 'yourpasswordagain' => 'पासवर्ड फेरि टाईप गर्नुहोस्',
@@ -878,9 +879,9 @@ $2
 'rev-deleted-user-contribs' => '[प्रयोगकर्ताको नाम अथवा IP ठेगाना हटाइयो - योगदानहरुबाट सम्पादन लुकाइयो]',
 'rev-deleted-text-permission' => "यस पृष्ठको पुनरावलोकन '''मेटिएकोछ'''।
 यसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटिएको लगमा पाउन सकिन्छ]।",
-'rev-deleted-text-unhide' => "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95न '''मेटिएकोछ'''।
-यसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को मेटिएको लगमा पाउन सकिन्छ]।
-यदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो पुनरावलोकन $1] हेर्न सक्नुहुन्छ।",
+'rev-deleted-text-unhide' => "यस à¤ªà¥\83षà¥\8dठà¤\95à¥\8b à¤¸à¤\82शà¥\8bधन '''मेटिएकोछ'''।
+यसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}} को मेटिएको लगमा पाउन सकिन्छ].
+यदि चाहनु भयो भनें [$1 संशोधन हेर्न] सक्नुहुन्छ।",
 'rev-suppressed-text-unhide' => "यस पृष्ठको पुनरावलोकन '''दबाइएकोछ'''।
 यसको पूर्ण विवरण [{{fullurl:{{#Special:Log}}/delete|पृष्ठ={{FULLPAGENAMEE}}}}को दबाइएको लगमा पाउन सकिन्छ]।
 यदि चाहनु भयो भनें प्रबन्धकको हैसियतमा [यो पुनरावलोकन $1] हेर्न सक्नुहुन्छ।",
@@ -950,9 +951,10 @@ $1",
 'revdelete-concurrent-change' => ' $2, $1 मिति गरिएको वस्तु परिवर्तन गर्न सकिएन: यसको स्थितीले तपाईले परिवर्तन गर्नलाग्नुहुँदा कोहीअरुले न परिवर्तन गरेजस्तो देखाउँछ
 कृपया लगहरु हेर्नुहोला ।',
 'revdelete-only-restricted' => '$2, $1 मिति भएको वस्तु लुकाउदा त्रुटी भएको छ:तपाईले वस्तुहरुलाई प्रवन्धकहरुको दृष्टीबाट दमन गर्न सक्नुहुन्न अझ कुनै पनि अरु दृष्टी विकल्पहरु नछानीकन।',
-'revdelete-reason-dropdown' => '*मेटाउनुका सामान्य कारणहरु
+'revdelete-reason-dropdown' => 'मेटाउनका सामान्य कारणहरु
 ** कपीराइट उल्लंघन
 ** अनुचित व्यक्तिगत जानकारी
+** अनुचित प्रयोगकर्ता नाम
 ** संभावित अपमानजनक जानकारी',
 'revdelete-otherreason' => 'अन्य/थप कारण:',
 'revdelete-reasonotherlist' => 'अरु कारण',
@@ -991,7 +993,7 @@ $1",
 'mergelogpagetext' => 'एउटा पृष्ठको इतिहास अर्कोमा भर्खरै मिलाइएको सूची तल दिइन्छ।',
 
 # Diffs
-'history-title' => '"$1" à¤\95à¥\8b à¤ªà¥\81नरावलà¥\8bà¤\95न इतिहास',
+'history-title' => '"$1" à¤\95à¥\8b à¤ªà¥\81नरावà¥\83तà¥\8dति इतिहास',
 'difference-multipage' => '(पृष्ठहरुमा भिन्नता)',
 'lineno' => 'पंक्ति $1:',
 'compareselectedversions' => 'छानिएका संस्करणहरू दाँज्नुहोस्',
@@ -1041,8 +1043,6 @@ $1",
 'search-interwiki-caption' => 'भगिनी आयोजना',
 'search-interwiki-default' => '$1 नतिजाहरु:',
 'search-interwiki-more' => '(अझै)',
-'search-mwsuggest-enabled' => 'सुझाव सहितको',
-'search-mwsuggest-disabled' => 'सुझाव बाहेकको',
 'search-relatedarticle' => 'सम्बन्धित',
 'mwsuggest-disable' => 'AJAX सुझाव निस्क्रिय पार्नुहोस्',
 'searcheverything-enable' => 'सबै नेमस्पेसेजहरुमा खोज्नुहोस्',
@@ -1078,7 +1078,7 @@ $1",
 
 # Preferences page
 'preferences' => 'रोजाईहरू',
-'mypreferences' => 'मà¥\87रा à¤\85भिरà¥\81à¤\9aिहरà¥\82',
+'mypreferences' => 'पà¥\8dराथमिà¤\95ताहरà¥\81',
 'prefs-edits' => 'सम्पादन संख्या:',
 'prefsnologin' => 'प्रवेश (लग ईन) नगरिएको',
 'prefsnologintext' => 'प्रयोगकर्ता अभिरूचि निर्धारण गर्न <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ]</span>तपाईंले प्रवेश गरेको हुनुपर्छ।',
@@ -1140,7 +1140,7 @@ $1",
 'timezoneregion-indian' => 'हिन्द महासागर',
 'timezoneregion-pacific' => 'प्राशान्त महासागर',
 'allowemail' => 'अरु प्रयोगकर्ताहरुबाट प्राप्त हुने ईमेल enable गर्नुहोस् ।',
-'prefs-searchoptions' => 'खोज विकल्पहरु',
+'prefs-searchoptions' => 'खोज्ने',
 'prefs-namespaces' => 'नेमस्पेसेज',
 'defaultns' => 'अन्यथा यी नेमस्पेसेजमा खोज्ने :',
 'default' => 'पूर्वनिर्धारित',
@@ -1516,7 +1516,7 @@ $1',
 'backend-fail-writetemp' => 'अस्थाइ फाइलमा लेख्न सकिएन',
 'backend-fail-closetemp' => 'अस्थाइ फाइल बन्द गर्न सकिएन',
 'backend-fail-read' => 'फाइल $1 खोल्न सकिएन ।',
-'backend-fail-create' => 'फाà¤\87ल $1 à¤¸à¤¿à¤°à¥\8dà¤\9cना गर्न सकिएन',
+'backend-fail-create' => 'फाà¤\87ल $1 à¤²à¥\87à¤\96à¥\8dन गर्न सकिएन',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'ZIP परीक्षणको लागि फाइल खोल्दा एक त्रुटी भेटीयो ।',
@@ -1906,11 +1906,7 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} जानकारी प्रेषक',
 'enotif_reset' => 'सबै पृष्ठहरु भनी दाग दिने',
-'enotif_newpagetext' => 'यो नयाँ पृष्ठ हो।',
 'enotif_impersonal_salutation' => '{{SITENAME}} प्रयोगकर्ता',
-'changed' => 'परिवर्तन भइसकेको',
-'created' => 'बनाइएको',
-'enotif_subject' => '$PAGEEDITORद्वारा {{SITENAME}} पृष्ठ $PAGETITLE $CHANGEDORCREATED गरिएको',
 'enotif_lastvisited' => 'अघिल्लो हेराइपछिका सबै परिवर्तनहरुको निम्ति हेर्नुहोस्: $1',
 'enotif_lastdiff' => 'यस परिवर्तनको निम्ति यो $1 हेर्नुहोस्',
 'enotif_anon_editor' => 'अज्ञात  प्रयोगकर्ता  $1',
index 715a509..d9cd17d 100644 (file)
@@ -43,304 +43,303 @@ $digitTransformTable = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'लिङ्कतेत अन्दरलाइन यानादिसँ:',
-'tog-justify'                 => 'अनुच्छेद धंकादिसँ',
-'tog-hideminor'               => 'न्हुगु हिलेज्याय् चिधंगु सम्पादन सुचुकादिसँ',
-'tog-extendwatchlist'         => 'वाचलिस्टयात परिमार्जित याना सकल स्वेज्युगु हिलेज्या क्यनादिसँ',
-'tog-usenewrc'                => 'एन्ह्यान्स्ड् न्हुगु हिलेज्या (जाभास्क्रिप्ट)',
-'tog-numberheadings'          => 'अटो-ल्याखँ हेडिङ',
-'tog-showtoolbar'             => 'सम्पादन टुलबार क्यनादिसँ (जाभास्क्रिप्ट)',
-'tog-editondblclick'          => 'दबल क्लिकय् पौ सम्पादन यानादिसँ (जाभास्क्रिप्ट)',
-'tog-editsection'             => '[सम्पादन] लिङ्कं सेक्सन सम्पादन यायेज्युगु यानादिसँ',
+'tog-underline' => 'लिङ्कतेत अन्दरलाइन यानादिसँ:',
+'tog-justify' => 'अनुच्छेद धंकादिसँ',
+'tog-hideminor' => 'न्हुगु हिलेज्याय् चिधंगु सम्पादन सुचुकादिसँ',
+'tog-extendwatchlist' => 'वाचलिस्टयात परिमार्जित याना सकल स्वेज्युगु हिलेज्या क्यनादिसँ',
+'tog-usenewrc' => 'एन्ह्यान्स्ड् न्हुगु हिलेज्या (जाभास्क्रिप्ट)',
+'tog-numberheadings' => 'अटो-ल्याखँ हेडिङ',
+'tog-showtoolbar' => 'सम्पादन टुलबार क्यनादिसँ (जाभास्क्रिप्ट)',
+'tog-editondblclick' => 'दबल क्लिकय् पौ सम्पादन यानादिसँ (जाभास्क्रिप्ट)',
+'tog-editsection' => '[सम्पादन] लिङ्कं सेक्सन सम्पादन यायेज्युगु यानादिसँ',
 'tog-editsectiononrightclick' => 'सेक्सनया छ्यँआखले राइट क्लिक याना सेक्सन सम्पादन यायेज्युगु यानादिसँ (जाभास्क्रिप्ट)',
-'tog-showtoc'                 => 'कन्टेण्टया धलः क्यनादिसँ (३गु स्वया अप्व शिर्षक दुगु पौया निंति)',
-'tog-rememberpassword'        => 'जिगु लग इन थ्व कम्प्युतरय् लुमंकादिसँ (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'tog-watchcreations'          => 'जिं देकागु / न्ह्यथनागु पौयात जिगु दृष्टिधलः(watchlist)य् तयादिसँ',
-'tog-watchdefault'            => 'जिं सम्पादन यानागु पौयात जिगु वाचलिस्टय् तयादिसँ',
-'tog-watchmoves'              => 'जिं संकागु (move) पौयात जिगु वाचलिस्टय् तयादिसँ',
-'tog-watchdeletion'           => 'जिं हुयागु (delete) पौयात जिगु वाचलिस्टय् तयादिसँ',
-'tog-minordefault'            => 'सकल सम्पादनतेत डिफल्टं चीधंगु यानादिसँ',
-'tog-previewontop'            => 'सम्पादन सन्दुक स्वया न्ह्यः प्रिभ्यु क्यनादिसँ',
-'tog-previewonfirst'          => 'न्हापाँगु सम्पादन स्वया न्ह्यः प्रिभ्यु क्यनादिसँ',
-'tog-nocache'                 => 'पौ क्याशिङ (caching) डिजेबल यानादिसँ',
-'tog-enotifwatchlistpages'    => 'जिगु वाचलिस्टया पौ सम्पादन जुइबिले जितः इ-मेल यानादिसँ',
-'tog-enotifusertalkpages'     => 'जिगु खँल्हाबल्हा पौ सम्पादन जुइबिले जितः इ-मेल यानादिसँ',
-'tog-enotifminoredits'        => 'पौया चीधंगु सम्पादनया निंतिं नं जितः इ-मेल यानादिसँ',
-'tog-enotifrevealaddr'        => 'जिगु इ-मेल थाय्‌बाय्‌ नोटिफिकेसन इ-मेलय् क्यनादिसँ',
-'tog-shownumberswatching'     => 'स्वयाच्वंपिं छ्यलामितेगु ल्याखँ क्यनादिसँ',
-'tog-fancysig'                => 'कच्चा हस्ताक्षर (अटोम्याटिक लिङ्क मदेःकः)',
-'tog-externaleditor'          => 'डिफल्टं एक्स्टर्नल एडिटर छ्यलादिसँ (एक्स्पर्टतेगु निंतिं जक्क, छिगु कम्प्युटरय् विषेश सेटिङ माः)',
-'tog-externaldiff'            => 'एक्स्टर्नल डिफ् (diff) डिफल्टं छ्यलादिसँ (एक्स्पर्टतेगु निंतिं जक्क, छिगु कम्प्युटरय् विषेश सेटिङ माः)',
-'tog-showjumplinks'           => '"जम्प टु" एसिसिबिलिटी लिङ्क इनेबल यानादिसँ',
-'tog-uselivepreview'          => 'लाइभ प्रिभ्यु (जाभास्क्रिप्ट) इनेबल यानादिसँ (परिक्षणकाल)',
-'tog-forceeditsummary'        => 'सम्पादन सार खालि त्वतिबिले जित सशंकित यानादिसँ',
-'tog-watchlisthideown'        => 'जिगु सम्पादन वाचलिस्टय् सुचुकादिसँ',
-'tog-watchlisthidebots'       => 'वाचलिस्टं बोत सम्पादन सुचुकादिसँ',
-'tog-watchlisthideminor'      => 'वाचलिस्टं चीधंगु सम्पादन सुचुकादिसँ',
-'tog-watchlisthideliu'        => 'वाचलिस्टं लग्ड इन छ्यलामितेगु सम्पादन सुचुकादिसँ',
-'tog-watchlisthideanons'      => 'वाचलिस्टं अज्ञात छ्यलामिया सम्पादन सुचुकादिसँ',
-'tog-nolangconversion'        => 'भेरियन्ट (variant) कन्भर्जन डिसेबल यानादिसँ',
-'tog-ccmeonemails'            => 'जिं मेपिं छ्यलामितेगु छ्वइगु इ-मेलतेगु कपि जित नं छ्वयादिसँ',
-'tog-diffonly'                => 'पाःगु (diffs) स्वया क्वेया पौया कण्टेण्ट क्यनादिमते',
-'tog-showhiddencats'          => 'सुचुकातगु पुचःत क्यनादिसँ',
-'tog-noconvertlink'           => 'लिङ्क शिर्षक हिलेज्या डिजेबल यानादिसँ',
-
-'underline-always'  => 'न्ह्याबिलें',
-'underline-never'   => 'नेभर',
+'tog-showtoc' => 'कन्टेण्टया धलः क्यनादिसँ (३गु स्वया अप्व शिर्षक दुगु पौया निंति)',
+'tog-rememberpassword' => 'जिगु लग इन थ्व कम्प्युतरय् लुमंकादिसँ (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-watchcreations' => 'जिं देकागु / न्ह्यथनागु पौयात जिगु दृष्टिधलः(watchlist)य् तयादिसँ',
+'tog-watchdefault' => 'जिं सम्पादन यानागु पौयात जिगु वाचलिस्टय् तयादिसँ',
+'tog-watchmoves' => 'जिं संकागु (move) पौयात जिगु वाचलिस्टय् तयादिसँ',
+'tog-watchdeletion' => 'जिं हुयागु (delete) पौयात जिगु वाचलिस्टय् तयादिसँ',
+'tog-minordefault' => 'सकल सम्पादनतेत डिफल्टं चीधंगु यानादिसँ',
+'tog-previewontop' => 'सम्पादन सन्दुक स्वया न्ह्यः प्रिभ्यु क्यनादिसँ',
+'tog-previewonfirst' => 'न्हापाँगु सम्पादन स्वया न्ह्यः प्रिभ्यु क्यनादिसँ',
+'tog-nocache' => 'पौ क्याशिङ (caching) डिजेबल यानादिसँ',
+'tog-enotifwatchlistpages' => 'जिगु वाचलिस्टया पौ सम्पादन जुइबिले जितः इ-मेल यानादिसँ',
+'tog-enotifusertalkpages' => 'जिगु खँल्हाबल्हा पौ सम्पादन जुइबिले जितः इ-मेल यानादिसँ',
+'tog-enotifminoredits' => 'पौया चीधंगु सम्पादनया निंतिं नं जितः इ-मेल यानादिसँ',
+'tog-enotifrevealaddr' => 'जिगु इ-मेल थाय्‌बाय्‌ नोटिफिकेसन इ-मेलय् क्यनादिसँ',
+'tog-shownumberswatching' => 'स्वयाच्वंपिं छ्यलामितेगु ल्याखँ क्यनादिसँ',
+'tog-fancysig' => 'कच्चा हस्ताक्षर (अटोम्याटिक लिङ्क मदेःकः)',
+'tog-externaleditor' => 'डिफल्टं एक्स्टर्नल एडिटर छ्यलादिसँ (एक्स्पर्टतेगु निंतिं जक्क, छिगु कम्प्युटरय् विषेश सेटिङ माः)',
+'tog-externaldiff' => 'एक्स्टर्नल डिफ् (diff) डिफल्टं छ्यलादिसँ (एक्स्पर्टतेगु निंतिं जक्क, छिगु कम्प्युटरय् विषेश सेटिङ माः)',
+'tog-showjumplinks' => '"जम्प टु" एसिसिबिलिटी लिङ्क इनेबल यानादिसँ',
+'tog-uselivepreview' => 'लाइभ प्रिभ्यु (जाभास्क्रिप्ट) इनेबल यानादिसँ (परिक्षणकाल)',
+'tog-forceeditsummary' => 'सम्पादन सार खालि त्वतिबिले जित सशंकित यानादिसँ',
+'tog-watchlisthideown' => 'जिगु सम्पादन वाचलिस्टय् सुचुकादिसँ',
+'tog-watchlisthidebots' => 'वाचलिस्टं बोत सम्पादन सुचुकादिसँ',
+'tog-watchlisthideminor' => 'वाचलिस्टं चीधंगु सम्पादन सुचुकादिसँ',
+'tog-watchlisthideliu' => 'वाचलिस्टं लग्ड इन छ्यलामितेगु सम्पादन सुचुकादिसँ',
+'tog-watchlisthideanons' => 'वाचलिस्टं अज्ञात छ्यलामिया सम्पादन सुचुकादिसँ',
+'tog-ccmeonemails' => 'जिं मेपिं छ्यलामितेगु छ्वइगु इ-मेलतेगु कपि जित नं छ्वयादिसँ',
+'tog-diffonly' => 'पाःगु (diffs) स्वया क्वेया पौया कण्टेण्ट क्यनादिमते',
+'tog-showhiddencats' => 'सुचुकातगु पुचःत क्यनादिसँ',
+'tog-noconvertlink' => 'लिङ्क शिर्षक हिलेज्या डिजेबल यानादिसँ',
+
+'underline-always' => 'न्ह्याबिलें',
+'underline-never' => 'नेभर',
 'underline-default' => 'डिफल्ट ब्राउज यानादिसँ',
 
 # Dates
-'sunday'        => 'आइतबाः',
-'monday'        => 'सोमबाः',
-'tuesday'       => 'मङ्गलबाः',
-'wednesday'     => 'बुधबाः',
-'thursday'      => 'बिहिबाः',
-'friday'        => 'शुक्रबाः',
-'saturday'      => 'शनिबाः',
-'sun'           => 'आइत',
-'mon'           => 'सोम',
-'tue'           => 'मङ्गल',
-'wed'           => 'बुध',
-'thu'           => 'बिहि',
-'fri'           => 'शुक्र',
-'sat'           => 'शनि',
-'january'       => 'ज्यानुवरी',
-'february'      => 'फेब्रुवरी',
-'march'         => 'मार्च',
-'april'         => 'अप्रिल',
-'may_long'      => 'मे',
-'june'          => 'जुन',
-'july'          => 'जुलाइ',
-'august'        => 'अगस्ट',
-'september'     => 'सेप्टेम्बर',
-'october'       => 'अक्टोबर',
-'november'      => 'नोभेम्बर',
-'december'      => 'डिसेम्बर',
-'january-gen'   => 'ज्यानुवरी',
-'february-gen'  => 'फ्रेब्रुवरी',
-'march-gen'     => 'मार्च',
-'april-gen'     => 'अप्रिल',
-'may-gen'       => 'मे',
-'june-gen'      => 'जुन',
-'july-gen'      => 'जुलाइ',
-'august-gen'    => 'अगस्ट',
+'sunday' => 'आइतबाः',
+'monday' => 'सोमबाः',
+'tuesday' => 'मङ्गलबाः',
+'wednesday' => 'बुधबाः',
+'thursday' => 'बिहिबाः',
+'friday' => 'शुक्रबाः',
+'saturday' => 'शनिबाः',
+'sun' => 'आइत',
+'mon' => 'सोम',
+'tue' => 'मङ्गल',
+'wed' => 'बुध',
+'thu' => 'बिहि',
+'fri' => 'शुक्र',
+'sat' => 'शनि',
+'january' => 'ज्यानुवरी',
+'february' => 'फेब्रुवरी',
+'march' => 'मार्च',
+'april' => 'अप्रिल',
+'may_long' => 'मे',
+'june' => 'जुन',
+'july' => 'जुलाइ',
+'august' => 'अगस्ट',
+'september' => 'सेप्टेम्बर',
+'october' => 'अक्टोबर',
+'november' => 'नोभेम्बर',
+'december' => 'डिसेम्बर',
+'january-gen' => 'ज्यानुवरी',
+'february-gen' => 'फ्रेब्रुवरी',
+'march-gen' => 'मार्च',
+'april-gen' => 'अप्रिल',
+'may-gen' => 'मे',
+'june-gen' => 'जुन',
+'july-gen' => 'जुलाइ',
+'august-gen' => 'अगस्ट',
 'september-gen' => 'सेप्टेम्बर',
-'october-gen'   => 'अक्टोबर',
-'november-gen'  => 'नोभेम्बर',
-'december-gen'  => 'डिसेम्बर',
-'jan'           => 'ज्यानु',
-'feb'           => 'फेब्',
-'mar'           => 'मार्',
-'apr'           => 'अप्रि',
-'may'           => 'मे',
-'jun'           => 'जुन',
-'jul'           => 'जुल',
-'aug'           => 'अग',
-'sep'           => 'सेप्',
-'oct'           => 'अक्ट्',
-'nov'           => 'नोभ',
-'dec'           => 'डिस',
+'october-gen' => 'अक्टोबर',
+'november-gen' => 'नोभेम्बर',
+'december-gen' => 'डिसेम्बर',
+'jan' => 'ज्यानु',
+'feb' => 'फेब्',
+'mar' => 'मार्',
+'apr' => 'अप्रि',
+'may' => 'मे',
+'jun' => 'जुन',
+'jul' => 'जुल',
+'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|गुप्त पुचः|गुप्त पुचःतः}}',
-'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 पौस}} थ्व पुचले दु।}}',
+'pagecategories' => '{{PLURAL:$1|पुचः|पुचःतः}}',
+'category_header' => 'पुचः "$1"य् दुगु पौतः',
+'subcategories' => 'उपपुचःतः',
+'category-media-header' => 'पुचः "$1"य् दुगु मिडिया',
+'category-empty' => "''थ्व पुचले आःईले पौ वा मिदिया मदु।''",
+'hidden-categories' => '{{PLURAL:$1|गुप्त पुचः|गुप्त पुचःतः}}',
+'hidden-category-category' => 'गुप्त पुचःतः',
+'category-subcat-count' => '{{PLURAL:$2|थ्व पुचले बियातःगु उपपुचः जक्क दु।|थ्व पुचले $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|थ्व पुचले थ्व जक्क फाइल दु।|सकल $2य् क्वे बियातःगु {{PLURAL:$1|फाइल|$1 फाइलत}} थ्व पुचले दु।}}',
+'category-file-count' => '{{PLURAL:$2|थ्व पुचले थ्व जक्क फाइल दु।|सकल $2य् क्वे बियातःगु {{PLURAL:$1|फाइल|$1 फाइलत}} थ्व पुचले दु।}}',
 
-'about'         => 'विषयक',
-'article'       => 'कण्टेण्ट पौ',
+'about' => 'विषयक',
+'article' => 'कण्टेण्ट पौ',
 'moredotdotdot' => 'अप्व॰॰॰',
-'mypage'        => 'जिगु पौ',
-'mytalk'        => 'जिगु खं',
-'anontalk'      => 'थ्व IPया निंतिं खँल्हाबल्हा',
-'navigation'    => 'परिवहन',
-'and'           => '&#32;व',
+'mypage' => 'जिगु पौ',
+'mytalk' => 'जिगु खं',
+'anontalk' => 'थ्व IPया निंतिं खँल्हाबल्हा',
+'navigation' => 'परिवहन',
+'and' => '&#32;व',
 
 # Cologne Blue skin
-'qbfind'  => 'मालादिसँ',
-'qbedit'  => 'सम्पादन',
-'faq'     => 'आपालं न्यनिगु न्ह्यसः (FAQ)',
+'qbfind' => 'मालादिसँ',
+'qbedit' => 'सम्पादन',
+'faq' => 'आपालं न्यनिगु न्ह्यसः (FAQ)',
 'faqpage' => 'Project:आपालं न्यनिगु न्ह्यसःत (FAQ)',
 
-'returnto'         => '$1य् लिहाँझासँ।',
-'tagline'          => '{{SITENAME}}नं',
-'help'             => 'ग्वहालि',
-'search'           => 'मालादिसँ',
-'searchbutton'     => 'मालादिसँ',
-'go'               => 'झासँ',
-'searcharticle'    => 'झासँ',
-'history'          => 'पौया इतिहास',
-'history_short'    => 'इतिहास',
-'updatedmarker'    => 'जिं दक्ले लिपा पौ स्वे धुंकाया अपडेट',
+'returnto' => '$1य् लिहाँझासँ।',
+'tagline' => '{{SITENAME}}नं',
+'help' => 'ग्वहालि',
+'search' => 'मालादिसँ',
+'searchbutton' => 'मालादिसँ',
+'go' => 'झासँ',
+'searcharticle' => 'झासँ',
+'history' => 'पौया इतिहास',
+'history_short' => 'इतिहास',
+'updatedmarker' => 'जिं दक्ले लिपा पौ स्वे धुंकाया अपडेट',
 'printableversion' => 'ध्वायेज्युगु संस्करण',
-'permalink'        => 'स्थायी लिङ्क',
-'print'            => 'ध्वानादिसँ',
-'edit'             => 'सम्पादन',
-'editthispage'     => 'थ्व पौ सम्पादन यानादिसं',
-'newpage'          => 'न्हुगु पौ',
+'permalink' => 'स्थायी लिङ्क',
+'print' => 'ध्वानादिसँ',
+'edit' => 'सम्पादन',
+'editthispage' => 'थ्व पौ सम्पादन यानादिसं',
+'newpage' => 'न्हुगु पौ',
 'talkpagelinktext' => 'खँल्हाबँल्हा',
-'specialpage'      => 'विषेश पौ',
-'personaltools'    => 'निजी ज्याब्व',
-'talk'             => 'खँलाबँला',
-'toolbox'          => 'ज्याब्व सन्दुक',
-'projectpage'      => 'ज्याखँ पौ क्येनादिसँ',
-'otherlanguages'   => 'मेमेगु भाषाय्',
-'jumptosearch'     => 'मालादिसँ',
+'specialpage' => 'विषेश पौ',
+'personaltools' => 'निजी ज्याब्व',
+'talk' => 'खँलाबँला',
+'toolbox' => 'ज्याब्व सन्दुक',
+'projectpage' => 'ज्याखँ पौ क्येनादिसँ',
+'otherlanguages' => 'मेमेगु भाषाय्',
+'jumptosearch' => 'मालादिसँ',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => '{{SITENAME}}या बारेय्',
-'aboutpage'            => 'Project:बारेय्',
-'copyright'            => 'कण्टेण्ट $1 कथं उपलब्ध दु।',
-'copyrightpage'        => '{{ns:project}}:लेखाधिकार',
-'currentevents'        => 'जुयाच्वँगु घटना',
-'currentevents-url'    => 'Project:जुयाच्वँगु घटना',
-'disclaimers'          => 'डिस्क्लेमर्स',
-'disclaimerpage'       => 'Project:साधारण डिस्क्लेमर्स',
-'edithelp'             => 'सम्पादन ग्वहालि',
-'edithelppage'         => 'Help:सम्पादन',
-'helppage'             => 'Help:धलःपौ',
-'mainpage'             => 'मू पौ',
+'aboutsite' => '{{SITENAME}}या बारेय्',
+'aboutpage' => 'Project:बारेय्',
+'copyright' => 'कण्टेण्ट $1 कथं उपलब्ध दु।',
+'copyrightpage' => '{{ns:project}}:लेखाधिकार',
+'currentevents' => 'जुयाच्वँगु घटना',
+'currentevents-url' => 'Project:जुयाच्वँगु घटना',
+'disclaimers' => 'डिस्क्लेमर्स',
+'disclaimerpage' => 'Project:साधारण डिस्क्लेमर्स',
+'edithelp' => 'सम्पादन ग्वहालि',
+'edithelppage' => 'Help:सम्पादन',
+'helppage' => 'Help:धलःपौ',
+'mainpage' => 'मू पौ',
 'mainpage-description' => 'मू पौ',
-'policy-url'           => 'Project:नीति',
-'portal'               => 'सामाजिक मूलुखा',
-'portal-url'           => 'Project:सामाजिक मूलुखा',
-'privacy'              => 'दुबिस्ता नियम',
-'privacypage'          => 'Project:गुप्तता नियम',
+'policy-url' => 'Project:नीति',
+'portal' => 'सामाजिक मूलुखा',
+'portal-url' => 'Project:सामाजिक मूलुखा',
+'privacy' => 'दुबिस्ता नियम',
+'privacypage' => 'Project:गुप्तता नियम',
 
-'badaccess'        => 'पर्मिसन इरर',
+'badaccess' => 'पर्मिसन इरर',
 'badaccess-group0' => 'छिं अनुरोध यानादिगु ज्या छिं याये मछिं।',
 'badaccess-groups' => 'छिं अनुरोध यानादिगु ज्या {{PLURAL:$2|पुचः|पुचःतः}}: $1या छ्यलामिं जक्क याये दु।',
 
-'versionrequired'     => 'मिडियाविकिया $1 संस्करण माःगु',
+'versionrequired' => 'मिडियाविकिया $1 संस्करण माःगु',
 'versionrequiredtext' => 'थ्व पौ छ्यले यात मिडियाविकिया $1 संस्करण माः।
 स्वयादिसँ [[विशेष:संस्करण|संस्करण पौ]]।',
 
-'ok'                      => 'ज्यु',
-'newmessageslink'         => 'न्हुगु सन्देश',
-'newmessagesdifflink'     => 'न्हापाया हिलेज्या',
+'ok' => 'ज्यु',
+'newmessageslink' => 'न्हुगु सन्देश',
+'newmessagesdifflink' => 'न्हापाया हिलेज्या',
 'youhavenewmessagesmulti' => '$1य् छित न्हुगु सन्देश वगु दु',
-'editsection'             => 'सम्पादन',
-'editold'                 => 'सम्पादन',
-'editsectionhint'         => 'खण्ड सम्पादन: $1',
-'showtoc'                 => 'क्यनादिसँ',
+'editsection' => 'सम्पादन',
+'editold' => 'सम्पादन',
+'editsectionhint' => 'खण्ड सम्पादन: $1',
+'showtoc' => 'क्यनादिसँ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'पौ',
-'nstab-user'      => 'छ्य्‌लामि पौ',
-'nstab-media'     => 'मिडिया पौ',
-'nstab-special'   => 'विशेष',
-'nstab-project'   => 'ज्याझ्वः पौ',
-'nstab-image'     => 'फाइल',
+'nstab-main' => 'पौ',
+'nstab-user' => 'छ्य्‌लामि पौ',
+'nstab-media' => 'मिडिया पौ',
+'nstab-special' => 'विशेष',
+'nstab-project' => 'ज्याझ्वः पौ',
+'nstab-image' => 'फाइल',
 'nstab-mediawiki' => 'सन्देश',
-'nstab-template'  => 'टेम्प्लेट',
-'nstab-help'      => 'ग्वहालि पौ',
-'nstab-category'  => 'पुचः',
+'nstab-template' => 'टेम्प्लेट',
+'nstab-help' => 'ग्वहालि पौ',
+'nstab-category' => 'पुचः',
 
 # Main script and global functions
-'nosuchaction'      => 'थन्यागु ज्या मदु',
-'nosuchactiontext'  => 'URLनं या धाःगु ज्या विकिं मस्यु',
+'nosuchaction' => 'थन्यागु ज्या मदु',
+'nosuchactiontext' => 'URLनं या धाःगु ज्या विकिं मस्यु',
 'nosuchspecialpage' => 'थन्यागु विशेष पौ मदु',
 'nospecialpagetext' => '<strong>छिं मदुगु विशेष पौया माग तयादिल।</strong>
 
 अस्थित्वय् दुगु विशेष पौया धलः [[विशेष:विशेषपौ|{{int:specialpages}}]]य् दु।',
 
 # General errors
-'databaseerror'   => 'डेटाबेस इरर',
-'dberrortext'     => 'छगू डेटाबेस क्वेरी सिन्ट्याक्स इरर जूगु दु।
+'databaseerror' => 'डेटाबेस इरर',
+'dberrortext' => 'छगू डेटाबेस क्वेरी सिन्ट्याक्स इरर जूगु दु।
 थ्व इररं सफ्टवेयरय् bug दूगु इंगीत यायेफु।
 थ्व स्वया न्हः कोशिस जूगु डेटाबेस क्वेरी
 "<tt>$2</tt>" फंक्सनया
 <blockquote><tt>$1</tt></blockquote> ख।
 MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'laggedslavemode' => 'चेतावनी: पतिइ न्हुगु अपदेत मदेफु ।',
-'readonly'        => 'देताबेस संरक्षित',
+'readonly' => 'देताबेस संरक्षित',
 'enterlockreason' => 'पौ कुनातयेगुया निंतिं कारण बियादिसँ, नापं पौ गब्ले चायेकिगु जुइफु उकिया अनुमान नं बियादिसँ',
-'readonlytext'    => 'थ्व डेटाबेस आःया ईले, सम्भवतः नियमित डेटाबेस मेन्टेनेन्सया निंतिं, न्हूगु एन्ट्रि व मेमेगु हिलेज्याया यायेमछिंकः कुनातःगु दु। थ्व धुंका हानं डेटाबेस साधारण जुइ।
+'readonlytext' => 'थ्व डेटाबेस आःया ईले, सम्भवतः नियमित डेटाबेस मेन्टेनेन्सया निंतिं, न्हूगु एन्ट्रि व मेमेगु हिलेज्याया यायेमछिंकः कुनातःगु दु। थ्व धुंका हानं डेटाबेस साधारण जुइ।
 
 थ्व डेटाबेस कुनाःतम्ह प्रबन्धकं थ्व वर्णन ब्यूगु दु: $1',
-'internalerror'   => 'इन्तरनल इरर',
-'viewsource'      => 'स्रोत स्वयादिसँ',
+'internalerror' => 'इन्तरनल इरर',
+'viewsource' => 'स्रोत स्वयादिसँ',
 
 # Login and logout pages
-'welcomecreation'         => '== लसकुस, $1! ==
+'welcomecreation' => '== लसकुस, $1! ==
 छिगु खाता चायेके धुंकल।
 छिगु [[Special:Preferences|{{SITENAME}} प्राथमिकता]] हिलिगु लुमंकादिसँ।',
-'yourname'                => 'छ्य्‌लामि नां:',
-'yourpassword'            => 'दुथखँग्वः (पासवर्द):',
-'yourpasswordagain'       => 'दुथखँग्वः हानं तियादिसँ:',
-'yourdomainname'          => 'छिगु दोमेन:',
-'login'                   => 'दुहां वनेगु',
+'yourname' => 'छ्य्‌लामि नां:',
+'yourpassword' => 'दुथखँग्वः (पासवर्द):',
+'yourpasswordagain' => 'दुथखँग्वः हानं तियादिसँ:',
+'yourdomainname' => 'छिगु दोमेन:',
+'login' => 'दुहां वनेगु',
 'nav-login-createaccount' => 'दुहां वनेगु / खाता चायेकिगु',
-'userlogin'               => 'दुहां वनेगु / खाता चायेकिगु',
-'logout'                  => 'पिने झासँ',
-'userlogout'              => 'पिने झासँ',
-'nologinlink'             => 'खाता न्ह्यथनादिसँ',
-'createaccount'           => 'खाता चायेकादिसँ',
-'gotaccountlink'          => 'दुहां झासँ',
-'loginsuccesstitle'       => 'लग इन सफल जुल',
-'accountcreated'          => 'खाता न्ह्येथन',
-'loginlanguagelabel'      => 'भाषा: $1',
+'userlogin' => 'दुहां वनेगु / खाता चायेकिगु',
+'logout' => 'पिने झासँ',
+'userlogout' => 'पिने झासँ',
+'nologinlink' => 'खाता न्ह्यथनादिसँ',
+'createaccount' => 'खाता चायेकादिसँ',
+'gotaccountlink' => 'दुहां झासँ',
+'loginsuccesstitle' => 'लग इन सफल जुल',
+'accountcreated' => 'खाता न्ह्येथन',
+'loginlanguagelabel' => 'भाषा: $1',
 
 # Edit pages
-'summary'       => 'सारांश:',
-'savearticle'   => 'पौ मुंकादिसं',
-'preview'       => 'स्वयादिसं',
-'newarticle'    => '(न्हु)',
-'note'          => "'''होस यानादिसँ:'''",
-'previewnote'   => "'''थ्व पूर्वालोकन जक्क ख। छिं यानादिगु सम्पादन स्वथंगु मदुनि!'''",
-'editing'       => '$1 सम्पादन जुयाच्वँगु दु',
-'editconflict'  => 'सम्पादन द्वंगु दु: $1',
-'yourtext'      => 'छिगु आखः',
+'summary' => 'सारांश:',
+'savearticle' => 'पौ मुंकादिसं',
+'preview' => 'स्वयादिसं',
+'newarticle' => '(न्हु)',
+'note' => "'''होस यानादिसँ:'''",
+'previewnote' => "'''थ्व पूर्वालोकन जक्क ख। छिं यानादिगु सम्पादन स्वथंगु मदुनि!'''",
+'editing' => '$1 सम्पादन जुयाच्वँगु दु',
+'editconflict' => 'सम्पादन द्वंगु दु: $1',
+'yourtext' => 'छिगु आखः',
 'storedversion' => 'स्वथनातगु संस्करण',
 
 # History pages
-'revisionasof'     => '$1 तक्कया संस्करण',
+'revisionasof' => '$1 तक्कया संस्करण',
 'previousrevision' => '←पुलांगु संस्करण',
 
 # Search results
 'searchhelp-url' => 'Help:धलःपौ',
-'searchrelated'  => 'स्वापू दुःगु',
-'searchall'      => 'सकल',
-'powersearch'    => 'मालादिसँ',
+'searchrelated' => 'स्वापू दुःगु',
+'searchall' => 'सकल',
+'powersearch' => 'मालादिसँ',
 
 # Preferences page
-'mypreferences'  => 'जिगु प्राथमिकता',
+'mypreferences' => 'जिगु प्राथमिकता',
 'changepassword' => 'पासवर्द हिलादिसँ',
 'prefs-datetime' => 'दिं व ई',
 'prefs-personal' => 'छ्य्‌लामि प्रोफाइल',
-'prefs-rc'       => 'न्हुगु हिलेज्या',
-'saveprefs'      => 'स्वथनादिसँ',
-'youremail'      => 'इ-मेल:',
-'username'       => 'छ्य्‌लामि नां:',
-'yourrealname'   => 'वास्तविक नां:',
-'yourlanguage'   => 'भाषा:',
-'email'          => 'इ-मेल',
+'prefs-rc' => 'न्हुगु हिलेज्या',
+'saveprefs' => 'स्वथनादिसँ',
+'youremail' => 'इ-मेल:',
+'username' => 'छ्य्‌लामि नां:',
+'yourrealname' => 'वास्तविक नां:',
+'yourlanguage' => 'भाषा:',
+'email' => 'इ-मेल',
 
 # User rights
 'userrights-user-editname' => 'छपू छ्य्‌लामि नां तयादिसँ:',
 
 # Groups
 'group-user' => 'छ्य्‌लामित',
-'group-bot'  => 'बोत',
+'group-bot' => 'बोत',
 
 # Recent changes
 'recentchanges' => 'न्हुगु हिलेज्या',
-'show'          => 'क्यनादिसँ',
+'show' => 'क्यनादिसँ',
 
 # Upload
 'upload' => 'संचिका चढ़ाएँ',
 
 # File description page
 'file-anchor-link' => 'फाइल',
-'filehist-user'    => 'छ्य्‌लामि',
+'filehist-user' => 'छ्य्‌लामि',
 
 # Random page
 'randompage' => 'छगु च्वसुइ येंकादिसं',
@@ -354,9 +353,9 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'newpages-username' => 'छ्येलेमि नां:',
 
 # Special:AllPages
-'allpages'       => 'सकल पौत',
-'nextpage'       => 'मेगु पौ ($1)',
-'allarticles'    => 'सकल च्वसुत',
+'allpages' => 'सकल पौत',
+'nextpage' => 'मेगु पौ ($1)',
+'allarticles' => 'सकल च्वसुत',
 'allpagessubmit' => 'झासँ',
 
 # Special:Categories
@@ -366,7 +365,7 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'restriction-edit' => 'सम्पादन',
 
 # Namespace form on various pages
-'namespace'      => 'नेमस्पेस:',
+'namespace' => 'नेमस्पेस:',
 'blanknamespace' => '(मू)',
 
 # Contributions
@@ -381,56 +380,56 @@ MySQL नं इरर "<tt>$3: $4</tt>" क्यंगु दु।',
 'movereason' => 'कारण:',
 
 # Tooltip help for the actions
-'tooltip-n-mainpage'              => 'मू पौ भ्रमण यानादिसँ',
-'tooltip-n-portal'                => 'ज्याझ्वःया बारेय्, छिं छु यायेछिं, गन खँ सीकिगु',
-'tooltip-n-currentevents'         => 'जुयाच्वँगु घटनाया लिधँसा तथ्य मालादिसँ',
-'tooltip-n-recentchanges'         => 'थ्व विकिया न्हुगु हिलेज्याया धलः।',
-'tooltip-n-randompage'            => 'न्ह्याःगु छगू पौ क्यनादिसँ',
-'tooltip-n-help'                  => 'खँ सीकिगु थाय्।',
-'tooltip-t-whatlinkshere'         => 'थन स्वाइगु सकल विकिपौया धलः',
-'tooltip-t-recentchangeslinked'   => 'थ्व पौ नाप स्वाःगु पौतेगु न्हुगु हिलेज्या',
-'tooltip-feed-rss'                => 'थ्व पौया RSS फीड',
-'tooltip-feed-atom'               => 'थ्व पौया Atom फीड',
-'tooltip-t-contributions'         => 'थ्व छ्य्‌लामिया योगदानया धलः क्यनादिसँ',
-'tooltip-t-emailuser'             => 'थ्व छ्य्‌लामियात इ-मेल छ्वयादिसँ',
-'tooltip-t-upload'                => 'संचिकाएँ चढ़ाएँ',
-'tooltip-t-specialpages'          => 'सकल विशेष पौस धलः',
-'tooltip-t-print'                 => 'थ्व पौस ध्वायेज्युगु संस्करण',
-'tooltip-t-permalink'             => 'थ्व पौस थ्व संस्करणया पर्मानेन्ट लिङ्क',
-'tooltip-ca-nstab-main'           => 'कन्टेन्ट पौ स्वयादिसँ',
-'tooltip-ca-nstab-user'           => 'छ्य्‌लामिपौ स्वयादिसँ',
-'tooltip-ca-nstab-media'          => 'मिडिया पौ स्वयादिसँ',
-'tooltip-ca-nstab-special'        => 'थ्व छगू विशेष पौ ख ; थ्व पौयात छिं सम्पादन याये मछिं।',
-'tooltip-ca-nstab-project'        => 'ज्याझ्वः पौ स्वयादिसँ',
-'tooltip-ca-nstab-image'          => 'फाइल पौ स्वयादिसँ',
-'tooltip-ca-nstab-mediawiki'      => 'व्यवस्थापन सन्देश स्वयादिसँ',
-'tooltip-ca-nstab-template'       => 'टेम्प्लेट स्वयादिसँ',
-'tooltip-ca-nstab-help'           => 'ग्वहालि पौ स्वयादिसँ',
-'tooltip-ca-nstab-category'       => 'पुचः पौ स्वयादिसँ',
-'tooltip-minoredit'               => 'थ्व छगू चिधंगु सम्पादन ख',
-'tooltip-save'                    => 'छिगु परिवर्तन स्वथनादिसँ',
-'tooltip-preview'                 => 'छिगु परिवर्तन पुर्वालोकन यानादिसँ, कृपया स्वथने न्ह्यः थ्व छ्य्‌लादिसँ!',
-'tooltip-diff'                    => 'छिं पतीइ यानादिगु हिलेज्या क्यनादिसँ।',
+'tooltip-n-mainpage' => 'मू पौ भ्रमण यानादिसँ',
+'tooltip-n-portal' => 'ज्याझ्वःया बारेय्, छिं छु यायेछिं, गन खँ सीकिगु',
+'tooltip-n-currentevents' => 'जुयाच्वँगु घटनाया लिधँसा तथ्य मालादिसँ',
+'tooltip-n-recentchanges' => 'थ्व विकिया न्हुगु हिलेज्याया धलः।',
+'tooltip-n-randompage' => 'न्ह्याःगु छगू पौ क्यनादिसँ',
+'tooltip-n-help' => 'खँ सीकिगु थाय्।',
+'tooltip-t-whatlinkshere' => 'थन स्वाइगु सकल विकिपौया धलः',
+'tooltip-t-recentchangeslinked' => 'थ्व पौ नाप स्वाःगु पौतेगु न्हुगु हिलेज्या',
+'tooltip-feed-rss' => 'थ्व पौया RSS फीड',
+'tooltip-feed-atom' => 'थ्व पौया Atom फीड',
+'tooltip-t-contributions' => 'थ्व छ्य्‌लामिया योगदानया धलः क्यनादिसँ',
+'tooltip-t-emailuser' => 'थ्व छ्य्‌लामियात इ-मेल छ्वयादिसँ',
+'tooltip-t-upload' => 'संचिकाएँ चढ़ाएँ',
+'tooltip-t-specialpages' => 'सकल विशेष पौस धलः',
+'tooltip-t-print' => 'थ्व पौस ध्वायेज्युगु संस्करण',
+'tooltip-t-permalink' => 'थ्व पौस थ्व संस्करणया पर्मानेन्ट लिङ्क',
+'tooltip-ca-nstab-main' => 'कन्टेन्ट पौ स्वयादिसँ',
+'tooltip-ca-nstab-user' => 'छ्य्‌लामिपौ स्वयादिसँ',
+'tooltip-ca-nstab-media' => 'मिडिया पौ स्वयादिसँ',
+'tooltip-ca-nstab-special' => 'थ्व छगू विशेष पौ ख ; थ्व पौयात छिं सम्पादन याये मछिं।',
+'tooltip-ca-nstab-project' => 'ज्याझ्वः पौ स्वयादिसँ',
+'tooltip-ca-nstab-image' => 'फाइल पौ स्वयादिसँ',
+'tooltip-ca-nstab-mediawiki' => 'व्यवस्थापन सन्देश स्वयादिसँ',
+'tooltip-ca-nstab-template' => 'टेम्प्लेट स्वयादिसँ',
+'tooltip-ca-nstab-help' => 'ग्वहालि पौ स्वयादिसँ',
+'tooltip-ca-nstab-category' => 'पुचः पौ स्वयादिसँ',
+'tooltip-minoredit' => 'थ्व छगू चिधंगु सम्पादन ख',
+'tooltip-save' => 'छिगु परिवर्तन स्वथनादिसँ',
+'tooltip-preview' => 'छिगु परिवर्तन पुर्वालोकन यानादिसँ, कृपया स्वथने न्ह्यः थ्व छ्य्‌लादिसँ!',
+'tooltip-diff' => 'छिं पतीइ यानादिगु हिलेज्या क्यनादिसँ।',
 'tooltip-compareselectedversions' => 'निगु ल्ययातःगु संस्करणया दथुइ भिन्नता स्वयादिसँ।',
-'tooltip-watch'                   => 'थ्व पौयात छिगु वाचलिस्टय् तनादिसँ',
-'tooltip-recreate'                => 'थ्व पौ हुयाछ्वेधुंकुगु जुसां पुनर्निर्माण यानादिसँ',
-'tooltip-upload'                  => 'अपलोड न्ह्यथनादिसँ',
-'tooltip-rollback'                => '"रोलब्याकं" छगू क्लिकय् थ्व पौयात न्हापाया छ्य्‌लामिं याःगु परिवर्तनय् हिलाछ्वइ।',
-'tooltip-undo'                    => '"Undo" नं थ्व सम्पादनयात खारेज याना सम्पादन फर्म यात प्रिभ्यु मोडय् चायेकी।
+'tooltip-watch' => 'थ्व पौयात छिगु वाचलिस्टय् तनादिसँ',
+'tooltip-recreate' => 'थ्व पौ हुयाछ्वेधुंकुगु जुसां पुनर्निर्माण यानादिसँ',
+'tooltip-upload' => 'अपलोड न्ह्यथनादिसँ',
+'tooltip-rollback' => '"रोलब्याकं" छगू क्लिकय् थ्व पौयात न्हापाया छ्य्‌लामिं याःगु परिवर्तनय् हिलाछ्वइ।',
+'tooltip-undo' => '"Undo" नं थ्व सम्पादनयात खारेज याना सम्पादन फर्म यात प्रिभ्यु मोडय् चायेकी।
 थुकिलिं सारांशय् कारण तनेछिंकी।',
 
 # Stylesheets
-'common.css'      => '/* थन तःगु CSS सकल स्किनय् छ्य्‌लिगु जुइ */',
-'standard.css'    => '/* थन तःगु CSS नं स्ट्याण्डर्ड स्किनया छ्य्‌लामितेत प्रभावित याइ */',
-'nostalgia.css'   => '/* थन तःगु CSS नं नोस्ट्याल्जिया स्किनया छ्य्‌लामितेत असर याइ */',
+'common.css' => '/* थन तःगु CSS सकल स्किनय् छ्य्‌लिगु जुइ */',
+'standard.css' => '/* थन तःगु CSS नं स्ट्याण्डर्ड स्किनया छ्य्‌लामितेत प्रभावित याइ */',
+'nostalgia.css' => '/* थन तःगु CSS नं नोस्ट्याल्जिया स्किनया छ्य्‌लामितेत असर याइ */',
 'cologneblue.css' => '/* थन तःगु CSS नं कोलोन ब्लु स्किनया छ्य्‌लामितेत असर याइ */',
-'monobook.css'    => '/* थन तःगु CSS नं मोनोबुक स्किनया छ्य्‌लामितेत असर याइ */',
-'myskin.css'      => '/* थन तःगु CSS नं माइस्किन स्किनया छ्य्‌लामितेत असर याइ */',
-'chick.css'       => '/* थन तःगु CSS नं चिक स्किनया छ्य्‌लामितेत असर याइ */',
-'simple.css'      => '/* थन तःगु CSS नं सिम्पल स्किनया छ्य्‌लामितेत असर याइ */',
-'modern.css'      => '/* थन तःगु CSS नं मोडर्न स्किनया छ्य्‌लामितेत असर याइ */',
-'print.css'       => '/* थन तःगु CSS नं प्रिन्ट आउटपुटयात असर याइ */',
-'handheld.css'    => '/* थन तःगु CSS नं $wgHandheldStyle आधारित ह्याण्डहेल्ड यन्त्रयात असर याइ */',
+'monobook.css' => '/* थन तःगु CSS नं मोनोबुक स्किनया छ्य्‌लामितेत असर याइ */',
+'myskin.css' => '/* थन तःगु CSS नं माइस्किन स्किनया छ्य्‌लामितेत असर याइ */',
+'chick.css' => '/* थन तःगु CSS नं चिक स्किनया छ्य्‌लामितेत असर याइ */',
+'simple.css' => '/* थन तःगु CSS नं सिम्पल स्किनया छ्य्‌लामितेत असर याइ */',
+'modern.css' => '/* थन तःगु CSS नं मोडर्न स्किनया छ्य्‌लामितेत असर याइ */',
+'print.css' => '/* थन तःगु CSS नं प्रिन्ट आउटपुटयात असर याइ */',
+'handheld.css' => '/* थन तःगु CSS नं $wgHandheldStyle आधारित ह्याण्डहेल्ड यन्त्रयात असर याइ */',
 
 # Attribution
 'others' => 'मेमेगु',
index 3c14a80..bc49067 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'Aho Tapu',
-'monday'        => 'Aho Gofua',
-'tuesday'       => 'Aho Ua',
-'wednesday'     => 'Aho Lotu',
-'thursday'      => 'Aho Tuloto',
-'friday'        => 'Aho Falaile',
-'saturday'      => 'Aho Faiumu',
-'january'       => 'Ianuali',
-'february'      => 'Fepuali',
-'march'         => 'Masi',
-'april'         => 'Apelila',
-'may_long'      => 'Me',
-'june'          => 'Iuni',
-'july'          => 'Iulai',
-'august'        => 'Aokuso',
-'september'     => 'Sepetema',
-'october'       => 'Oketopa',
-'november'      => 'Novema',
-'december'      => 'Tesemo',
-'january-gen'   => 'Ianuali',
-'february-gen'  => 'Fepuali',
-'march-gen'     => 'Masi',
-'april-gen'     => 'Apelila',
-'may-gen'       => 'Me',
-'june-gen'      => 'Iuni',
-'july-gen'      => 'Iulai',
-'august-gen'    => 'Aokuso',
+'sunday' => 'Aho Tapu',
+'monday' => 'Aho Gofua',
+'tuesday' => 'Aho Ua',
+'wednesday' => 'Aho Lotu',
+'thursday' => 'Aho Tuloto',
+'friday' => 'Aho Falaile',
+'saturday' => 'Aho Faiumu',
+'january' => 'Ianuali',
+'february' => 'Fepuali',
+'march' => 'Masi',
+'april' => 'Apelila',
+'may_long' => 'Me',
+'june' => 'Iuni',
+'july' => 'Iulai',
+'august' => 'Aokuso',
+'september' => 'Sepetema',
+'october' => 'Oketopa',
+'november' => 'Novema',
+'december' => 'Tesemo',
+'january-gen' => 'Ianuali',
+'february-gen' => 'Fepuali',
+'march-gen' => 'Masi',
+'april-gen' => 'Apelila',
+'may-gen' => 'Me',
+'june-gen' => 'Iuni',
+'july-gen' => 'Iulai',
+'august-gen' => 'Aokuso',
 'september-gen' => 'Sepetema',
-'october-gen'   => 'Oketopa',
-'november-gen'  => 'Novema',
-'december-gen'  => 'Tesemo',
-'may'           => 'Me',
-
-'article'    => 'Tohi Tala',
-'cancel'     => 'Tiaki',
-'mytalk'     => 'Haaku tutala',
+'october-gen' => 'Oketopa',
+'november-gen' => 'Novema',
+'december-gen' => 'Tesemo',
+'may' => 'Me',
+
+'article' => 'Tohi Tala',
+'cancel' => 'Tiaki',
+'mytalk' => 'Haaku tutala',
 'navigation' => 'Navikati',
 
 # Cologne Blue skin
-'qbedit'         => 'Fakahakohako',
+'qbedit' => 'Fakahakohako',
 'qbspecialpages' => 'Tau Lau Mahuiga',
 
-'help'             => 'Lagomatai',
-'search'           => 'Kumi',
-'searchbutton'     => 'Kumi',
-'go'               => 'Fano',
-'searcharticle'    => 'Fano',
-'history_short'    => 'Liu onoono atu ki tua',
+'help' => 'Lagomatai',
+'search' => 'Kumi',
+'searchbutton' => 'Kumi',
+'go' => 'Fano',
+'searcharticle' => 'Fano',
+'history_short' => 'Liu onoono atu ki tua',
 'printableversion' => 'Mitaki lolomi',
-'permalink'        => 'Matutakiaga mautumau',
-'edit'             => 'Fakahakohako',
-'delete'           => 'Tamate',
-'protect'          => 'Puipui',
-'talk'             => 'Fakatutala',
-'toolbox'          => 'Puha Mena Gahua',
-'otherlanguages'   => 'Ke he falu vagahau',
+'permalink' => 'Matutakiaga mautumau',
+'edit' => 'Fakahakohako',
+'delete' => 'Tamate',
+'protect' => 'Puipui',
+'talkpagelinktext' => 'Tutala',
+'talk' => 'Fakatutala',
+'toolbox' => 'Puha Mena Gahua',
+'otherlanguages' => 'Ke he falu vagahau',
 'jumptonavigation' => 'navikati',
-'jumptosearch'     => 'kumi',
+'jumptosearch' => 'kumi',
 
 # 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'            => 'Hagaao ke he {{SITENAME}}',
-'currentevents'        => 'Tau Fakaholoaga Mogonei',
-'edithelp'             => 'Lagomatai ke he Fakahakohako',
-'mainpage'             => 'Matapatu Lau',
+'aboutsite' => 'Hagaao ke he {{SITENAME}}',
+'aboutpage' => 'Project: Hagaao',
+'currentevents' => 'Tau Fakaholoaga Mogonei',
+'edithelp' => 'Lagomatai ke he Fakahakohako',
+'helppage' => 'Help: Ke lata mo e tau mena i loto',
+'mainpage' => 'Matapatu Lau',
 'mainpage-description' => 'Matapatu Lau',
-'portal'               => 'Maaga ke Matutaki',
-'privacy'              => 'Ko e puipuiaga ke he tau talahauaga mo e talahauaga fakatagata',
+'portal' => 'Maaga ke Matutaki',
+'portal-url' => 'Project:Ko e lau auloa ma maaga',
+'privacy' => 'Ko e puipuiaga ke he tau talahauaga mo e talahauaga fakatagata',
 
-'youhavenewmessages'      => 'Fai $1 ($2).',
-'newmessageslink'         => 'tau tohi foou',
+'youhavenewmessages' => 'Fai $1 ($2).',
+'newmessageslink' => 'tau tohi foou',
 'youhavenewmessagesmulti' => 'Fai tohi foou a koe he $1',
-'editsection'             => 'fakahakohako',
-'editold'                 => 'fakahakohako',
+'editsection' => 'fakahakohako',
+'editold' => 'fakahakohako',
+'editsectionhint' => 'Hiki e vala e: $1',
+'red-link-title' => '$1 (nakai fai lau pihia i i loto e)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
+'nstab-main' => 'Lau',
 'nstab-user' => 'Lau he tagata',
 
 # General errors
 'viewsource' => 'Kitekite ke mouaga',
 
 # Login and logout pages
-'welcomecreation'         => '== Fakalofa atu, kua fiafia ke hu mai $1 ==
+'welcomecreation' => '== Fakalofa atu, kua fiafia ke hu mai $1 ==
 Kua talaga e haau a poko.
 Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
-'yourname'                => 'Matahigoa he tagata:',
-'yourpassword'            => 'Kupu fufu:',
-'yourpasswordagain'       => 'Liu lolomi e kupu fufu:',
-'remembermypassword'      => 'Manatu e haaku loko ini (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'                   => 'Hu ki loto',
+'yourname' => 'Matahigoa he tagata:',
+'yourpassword' => 'Kupu fufu:',
+'yourpasswordagain' => 'Liu lolomi e kupu fufu:',
+'remembermypassword' => 'Manatu e haaku loko ini (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'login' => 'Hu ki loto',
 'nav-login-createaccount' => 'Hu ki loto / talaga e poko',
-'userlogin'               => 'Hu ki loto / talaga e poko',
-'logout'                  => 'Hu mai ki tua',
-'userlogout'              => 'Hu mai ki tua',
-'notloggedin'             => 'Ai la hu ki loto',
-'createaccount'           => 'Talaga e poko',
-'gotaccountlink'          => 'Hu ki loto',
+'userlogin' => 'Hu ki loto / talaga e poko',
+'logout' => 'Hu mai ki tua',
+'userlogout' => 'Hu mai ki tua',
+'notloggedin' => 'Ai la hu ki loto',
+'createaccount' => 'Talaga e poko',
+'gotaccountlink' => 'Hu ki loto',
 
 # Special:PasswordReset
 'passwordreset-username' => 'Matahigoa he tagata',
 
 # Edit pages
-'summary'      => 'Fakakatoakatoa:',
-'minoredit'    => 'Ko e fakahakohako fakatote',
-'watchthis'    => 'Onoono e lau e',
-'savearticle'  => 'Taofi e lau',
-'showpreview'  => 'Fakakite e foliga',
-'showdiff'     => 'Fakakite e tau hikihiki',
+'summary' => 'Fakakatoakatoa:',
+'minoredit' => 'Ko e fakahakohako fakatote',
+'watchthis' => 'Onoono e lau e',
+'savearticle' => 'Taofi e lau',
+'showpreview' => 'Fakakite e foliga',
+'showdiff' => 'Fakakite e tau hikihiki',
 'loginreqlink' => 'hu ki loto',
 
 # History pages
-'currentrev'          => 'Kitekiteaga mogonei',
+'currentrev' => 'Kitekiteaga mogonei',
 'currentrevisionlink' => 'Kitekiteaga mogonei',
 
+# Diffs
+'editundo' => 'Liuaki',
+
 # Preferences page
-'mypreferences'     => 'Haaku a tau manako',
-'prefsnologin'      => 'Ai la hu ki loto',
-'prefs-rc'          => 'Hikihikiaga mogoia',
+'mypreferences' => 'Haaku a tau manako',
+'prefsnologin' => 'Ai la hu ki loto',
+'prefs-rc' => 'Hikihikiaga mogoia',
 'searchresultshead' => 'Kumi',
-'youremail'         => 'Meli hila:',
-'username'          => 'Matahigoa he tagata:',
-'email'             => 'Meli hila',
+'youremail' => 'Meli hila:',
+'username' => 'Matahigoa he tagata:',
+'email' => 'Meli hila',
 
 # Recent changes
 'recentchanges' => 'Hikihikiaga mogoia',
-'hist'          => 'Liu onoono atu ki tua',
+'hist' => 'Liu onoono atu ki tua',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Falu hikihiki',
-'recentchangeslinked-feed'    => 'Falu hikihiki',
+'recentchangeslinked' => 'Falu hikihiki',
+'recentchangeslinked-feed' => 'Falu hikihiki',
 'recentchangeslinked-toolbox' => 'Falu hikihiki',
 
 # Upload
-'upload'            => 'Fakafano e faila',
-'uploadbtn'         => 'Fakafano e faila',
-'uploadnologin'     => 'Ai la hu ki loto',
-'filedesc'          => 'Fakakatoakatoa',
+'upload' => 'Fakafano e faila',
+'uploadbtn' => 'Fakafano e faila',
+'uploadnologin' => 'Ai la hu ki loto',
+'filedesc' => 'Fakakatoakatoa',
 'fileuploadsummary' => 'Fakakatoakatoa:',
-'watchthisupload'   => 'Onoono e lau e',
+'watchthisupload' => 'Onoono e lau e',
 
 # File description page
 'filehist-deleteone' => 'tamate',
@@ -162,13 +172,13 @@ Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
 # Random page
 'randompage' => 'Lau fifili',
 
-'brokenredirects-edit'   => 'fakahakohako',
+'brokenredirects-edit' => 'fakahakohako',
 'brokenredirects-delete' => 'tamate',
 
 # Miscellaneous special pages
 'newpages-username' => 'Matahigoa he tagata:',
-'move'              => 'Une',
-'movethispage'      => 'Une e lau e',
+'move' => 'Une',
+'movethispage' => 'Une e lau e',
 
 # Book sources
 'booksources-go' => 'Fano',
@@ -177,10 +187,10 @@ Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
 'linksearch-ok' => 'Kumi',
 
 # Watchlist
-'watchlist'     => 'Ko e haaku lau kitekite',
-'mywatchlist'   => 'Ko e haaku lau kitekite',
-'watchnologin'  => 'Ai la hu ki loto',
-'watch'         => 'Kitekite',
+'watchlist' => 'Ko e haaku lau kitekite',
+'mywatchlist' => 'Ko e haaku lau kitekite',
+'watchnologin' => 'Ai la hu ki loto',
+'watch' => 'Kitekite',
 'watchthispage' => 'Onoono e lau e',
 
 # Delete
@@ -198,7 +208,7 @@ Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
 
 # Contributions
 'contributions' => 'Tau lagomatai tagata',
-'mycontris'     => 'Haaku a tau lagomatai',
+'mycontris' => 'Haaku a tau lagomatai',
 
 'sp-contributions-submit' => 'Kumi',
 
@@ -206,26 +216,45 @@ Ua nimo ke hiki e haau tau [[Special:Preferences|manako {{SITENAME}}]].',
 'whatlinkshere' => 'Ko e tau matutakiaga he mena e',
 
 # Block/unblock
-'ipbreason'          => 'Kakano:',
+'ipbreason' => 'Kakano:',
 'ipblocklist-submit' => 'Kumi',
 
 # Move page
 'movenologin' => 'Ai la hu ki loto',
-'move-watch'  => 'Onoono e lau e',
-'movedto'     => 'kua une ke he',
-'movereason'  => 'Kakano:',
+'move-watch' => 'Onoono e lau e',
+'movedto' => 'kua une ke he',
+'movereason' => 'Kakano:',
 
 # Namespace 8 related
 'allmessages' => 'Tau fakailoaga',
 
 # Tooltip help for the actions
 'tooltip-pt-preferences' => 'Haaku a tau manako',
-'tooltip-pt-logout'      => 'Hu mai ki tua',
-'tooltip-p-logo'         => 'Matapatu Lau',
+'tooltip-pt-login' => 'Kua lata ia koe ke loko ini, kae pule ni e a koe, ai pehe ko e masi a koe ke loko ini',
+'tooltip-pt-logout' => 'Hu mai ki tua',
+'tooltip-ca-talk' => 'Tutala ke he tau matapatu lau',
+'tooltip-ca-edit' => 'Maeke ia koe ke hiki, uta kehe mo e lalafi atu falu mena ke he lau nei.  Fakamolemole ti fakaaoga e PREVIEW patani to taofi mau.',
+'tooltip-search' => 'Kumi {{SITENAME}}',
+'tooltip-search-fulltext' => 'Kumi ke he tau lau oti e kupu e',
+'tooltip-p-logo' => 'Matapatu Lau',
+'tooltip-n-mainpage-description' => 'Fano ke he matapatu lau',
+'tooltip-n-portal' => 'Hagao ke he gahua lahi, ko e heigoa kua lata a koe ke taute, mo e moua mai i fe e tau mena',
+'tooltip-n-currentevents' => 'Kumi e tau vala tala kehekehe hagao ke he tau mena tutupu',
+'tooltip-n-recentchanges' => 'Hae e tau hikihiki foou he wiki',
+'tooltip-n-randompage' => 'Tuku mai noa ni e ha lau',
+'tooltip-n-help' => 'Ko e matakavi ke kumi ki ai',
+'tooltip-t-whatlinkshere' => 'Ko e tau lau wiki oti ne fai matutaki mai ke he lau e',
+'tooltip-t-upload' => 'Fakahu ki loto e tau faila',
+'tooltip-t-specialpages' => 'Ko e tau lau oti kua kehekehe',
 
 # Special:NewFiles
 'ilsubmit' => 'Kumi',
 
+# Bad image list
+'bad_image_list' => 'Ko e tau mena ni ne fakakite mai ka onoono ki ai (ko e tau laini ne kamata aki e *).
+Ko e liniki fakamua he laini ko e liniki ke he faila kelea.
+Ko e tau liniki foki i lalo he laini taha ko e tau laini fifili pauaki, i.e. ko e tau lau ne fai faila i loto he laini ia.',
+
 # Multipage image navigation
 'imgmultigo' => 'Fano!',
 
index 291c5b8..67700c4 100644 (file)
@@ -21,6 +21,7 @@
  * @author Hamaryns
  * @author Jens Liebenau
  * @author Kaganer
+ * @author Kippenvlees1
  * @author Krinkle
  * @author MarkvA
  * @author McDutchie
@@ -42,6 +43,7 @@
  * @author Trijnstel
  * @author Troefkaart
  * @author Tvdm
+ * @author Wiki13
  * @author לערי ריינהארט
  */
 
@@ -101,7 +103,6 @@ $magicWords = array(
        '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' ),
@@ -242,6 +243,10 @@ $magicWords = array(
        'url_query'                 => array( '0', 'ZOEKOPDRACHT', 'QUERY' ),
        'defaultsort_noerror'       => array( '0', 'geenfout', 'noerror' ),
        'defaultsort_noreplace'     => array( '0', 'nietvervangen', 'noreplace' ),
+       'pagesincategory_all'       => array( '0', 'alle', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'paginas', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'ondercategorieen', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'bestanden', 'files' ),
 );
 
 $specialPageAliases = array(
@@ -314,7 +319,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'RecenteWijzigingen' ),
        'Recentchangeslinked'       => array( 'RecenteWijzigingenGelinkt', 'VerwanteWijzigingen' ),
        'Revisiondelete'            => array( 'VersieVerwijderen', 'HerzieningVerwijderen', 'RevisieVerwijderen' ),
-       'RevisionMove'              => array( 'VersieVerplaatsen' ),
        'Search'                    => array( 'Zoeken' ),
        'Shortpages'                => array( 'KortePaginas', 'KortePagina’s', 'KortePagina\'s' ),
        'Specialpages'              => array( 'SpecialePaginas', 'SpecialePagina’s', 'SpecialePagina\'s' ),
@@ -398,7 +402,7 @@ $messages = array(
 
 'underline-always' => 'Altijd',
 'underline-never' => 'Nooit',
-'underline-default' => 'Webbrowser-standaard',
+'underline-default' => 'Standaard in uw vormgeving of webbrowser',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Lettertypestijl bewerkingsvenster:',
@@ -483,8 +487,8 @@ $messages = array(
 'newwindow' => '(opent in een nieuw venster)',
 'cancel' => 'Annuleren',
 'moredotdotdot' => 'Meer…',
-'mypage' => 'Mijn gebruikerspagina',
-'mytalk' => 'Mijn overleg',
+'mypage' => 'Gebruikerspagina',
+'mytalk' => 'Overleg',
 'anontalk' => 'Overlegpagina voor dit IP-adres',
 'navigation' => 'Navigatie',
 'and' => '&#32;en',
@@ -494,7 +498,6 @@ $messages = array(
 'qbbrowse' => 'Bladeren',
 'qbedit' => 'Bewerken',
 'qbpageoptions' => 'Deze pagina',
-'qbpageinfo' => 'Pagina-informatie',
 'qbmyoptions' => "Mijn pagina's",
 'qbspecialpages' => 'Speciale pagina’s',
 'faq' => 'Veel gestelde vragen',
@@ -507,7 +510,7 @@ $messages = array(
 'vector-action-protect' => 'Beveiligen',
 'vector-action-undelete' => 'Terugplaatsen',
 'vector-action-unprotect' => 'Beveiliging wijzigen',
-'vector-simplesearch-preference' => 'Verbeterde zoeksuggesties inschakelen (alleen voor het uiterlijk Vector)',
+'vector-simplesearch-preference' => 'Vereenvoudigd zoeken inschakelen (alleen voor het uiterlijk Vector)',
 'vector-view-create' => 'Aanmaken',
 'vector-view-edit' => 'Bewerken',
 'vector-view-history' => 'Geschiedenis weergeven',
@@ -517,6 +520,7 @@ $messages = array(
 'namespaces' => 'Naamruimten',
 'variants' => 'Varianten',
 
+'navigation-heading' => 'Navigatiemenu',
 'errorpagetitle' => 'Fout',
 'returnto' => 'Terug naar $1.',
 'tagline' => 'Uit {{SITENAME}}',
@@ -729,12 +733,11 @@ Zoekopdracht: $2',
 'actionthrottledtext' => 'Als maatregel tegen spam is het aantal keren per tijdseenheid dat u deze handeling kunt verrichten beperkt.
 De limiet is overschreden.
 Probeer het over een aantal minuten opnieuw.',
-'protectedpagetext' => 'Deze pagina is beveiligd.
-Bewerken is niet mogelijk.',
+'protectedpagetext' => 'Deze pagina is beveiligd. Bewerken of andere handelingen zijn niet mogelijk.',
 'viewsourcetext' => 'U kunt de brontekst van deze pagina bekijken en kopiëren:',
 'viewyourtext' => "U kunt '''uw bewerkingen''' aan de brontekst van deze pagina bekijken en kopiëren:",
 'protectedinterface' => "Deze pagina bevat tekst voor berichten van de software op deze wiki en is beveiligd om misbruik te voorkomen.
-Om vertalingen voor alle wiki's toe te voegen of te wijzigen, gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki.",
+Gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki, om vertalingen voor alle wiki's toe te voegen of te wijzigen.",
 'editinginterface' => "'''Waarschuwing:''' u bewerkt een pagina die interfacetekst voor de software bevat.
 Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen op deze wiki.
 Om vertalingen toe te voegen of te wijzigen voor alle wiki's, gebruik [//translatewiki.net/ translatewiki.net], het vertaalproject voor MediaWiki.",
@@ -763,10 +766,10 @@ De opgegeven reden is "\'\'$3\'\'".',
 # Login and logout pages
 'logouttext' => "'''U bent nu afgemeld.'''
 
-U kunt {{SITENAME}} nu anoniem gebruiken of weer [[Special:UserLogin|aanmelden]] als dezelfde of een andere gebruiker.
+U kunt {{SITENAME}} nu anoniem gebruiken of weer <span class='plainlinks'>[$1 aanmelden]</span> als dezelfde of een andere gebruiker.
 Mogelijk worden nog een aantal pagina's weergegeven alsof u aangemeld bent totdat u de cache van uw browser leegt.",
-'welcomecreation' => '== Welkom, $1! ==
-Uw gebruiker is geregistreerd.
+'welcomeuser' => 'Welkom, $1!',
+'welcomecreation-msg' => 'Uw gebruiker is aangemaakt.
 Vergeet niet uw [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
 'yourname' => 'Gebruikersnaam:',
 'yourpassword' => 'Wachtwoord:',
@@ -1068,7 +1071,7 @@ Uw eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns
 'note' => "'''Opmerking:'''",
 'previewnote' => "'''Let op: dit is een controlepagina.'''
 Uw tekst is niet opgeslagen!",
-'continue-editing' => 'Doorgaan met bewerken',
+'continue-editing' => 'Naar het bewerkingsvenster gaan',
 'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als u deze opslaat.',
 'session_fail_preview' => "'''Uw bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
 Probeer het opnieuw.
@@ -1153,6 +1156,15 @@ Deze lijkt verwijderd te zijn.',
 'edit-already-exists' => 'De pagina is niet aangemaakt.
 Deze bestaat al.',
 'defaultmessagetext' => 'Standaardinhoud',
+'content-failed-to-parse' => 'Het was niet mogelijk de inhoud van het MIME-type $2 voor het model $1 te verwerken: $3.',
+'invalid-content-data' => 'Ongeldige inhoudsgegevens',
+'content-not-allowed-here' => 'De inhoud "$1" is niet toegestaan op pagina [[$2]].',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'tekst zonder opmaak',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Waarschuwing:''' deze pagina gebruikt te veel kostbare parserfuncties.
@@ -1412,8 +1424,6 @@ Probeer een andere zoekopdracht.',
 'search-interwiki-caption' => 'Zusterprojecten',
 'search-interwiki-default' => '$1 resultaten:',
 'search-interwiki-more' => '(meer)',
-'search-mwsuggest-enabled' => 'met suggesties',
-'search-mwsuggest-disabled' => 'geen suggesties',
 'search-relatedarticle' => 'Gerelateerd',
 'mwsuggest-disable' => 'Suggesties via AJAX uitschakelen',
 'searcheverything-enable' => 'In alle naamruimten zoeken',
@@ -1450,7 +1460,7 @@ De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 
 # Preferences page
 'preferences' => 'Voorkeuren',
-'mypreferences' => 'Mijn voorkeuren',
+'mypreferences' => 'Voorkeuren',
 'prefs-edits' => 'Aantal bewerkingen:',
 'prefsnologin' => 'Niet aangemeld',
 'prefsnologintext' => 'U moet <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aangemeld]</span> zijn om uw voorkeuren te kunnen instellen.',
@@ -1684,6 +1694,9 @@ Als u deze opgeeft, kan deze naam gebruikt worden om u erkenning te geven voor u
 'rightslogtext' => 'Hieronder staan de wijzigingen in gebruikersrechten.',
 'rightslogentry' => 'heeft de gebruikersrechten voor $1 gewijzigd van $2 naar $3',
 'rightslogentry-autopromote' => 'is automatisch gepromoveerd van de groepen "$2" naar de groepen "$3"',
+'logentry-rights-rights' => '$1 heeft groepslidmaatschap voor $3 gewijzigd van $4 naar $5',
+'logentry-rights-rights-legacy' => '$1 heeft groepslidmaatschap voor $3 gewijzigd',
+'logentry-rights-autopromote' => '$1 is automatisch gepromoveerd van $4 naar $5',
 'rightsnone' => '(geen)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1937,6 +1950,7 @@ Als het probleem aanhoudt, neem dan contact op met een [[Special:ListUsers/sysop
 'backend-fail-notsame' => 'Er staat al een niet-identiek bestand op de plaats $1.',
 'backend-fail-invalidpath' => '$1 is geen geldig opslagpad.',
 'backend-fail-delete' => 'Het bestand $1 kon niet verwijderd worden.',
+'backend-fail-describe' => 'Het was niet mogelijk de metadata aan te passen voor het bestand "$1".',
 'backend-fail-alreadyexists' => 'Het bestand $1 bestaat al.',
 'backend-fail-store' => 'Het was niet mogelijk het bestand $1 op te slaan op locatie $2.',
 'backend-fail-copy' => 'Het was niet mogelijk het bestand $1 te kopiëren naar $2.',
@@ -2090,7 +2104,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.',
+'upload-disallowed-here' => 'U kunt dit bestand niet overschrijven.',
 
 # File reversion
 'filerevert' => '$1 terugdraaien',
@@ -2138,7 +2152,7 @@ Invoer: inhoudstype/subtype, bijvoorbeeld <code>image/jpeg</code>.',
 # Unused templates
 'unusedtemplates' => 'Ongebruikte sjablonen',
 'unusedtemplatestext' => 'Deze pagina geeft alle pagina\'s weer in de naamruimte {{ns:template}} die op geen enkele pagina gebruikt worden.
-Vergeet niet de "Verwijzingen naar deze pagina" te controleren alvorens dit sjabloon te verwijderen.',
+Vergeet niet de "Verwijzingen naar deze pagina" te controleren alvorens deze sjabloon te verwijderen.',
 'unusedtemplateswlh' => 'andere verwijzingen',
 
 # Random page
@@ -2332,8 +2346,8 @@ Zie ook [[Special:WantedCategories|niet-bestaande categorieën met verwijzingen]
 'linksearch-ns' => 'Naamruimte:',
 'linksearch-ok' => 'Zoeken',
 'linksearch-text' => 'Wildcards zoals "*.wikipedia.org" of "*.org" zijn toegestaan.
-Heeft tenminste een topleveldomein, zoals bijvoorbeeld "*.org".<br />
-Ondersteunde protocollen: <code>$1</code> (voeg deze niet toe in uw zoekopdracht).',
+Heeft tenminste een topleveldomein nodig, zoals bijvoorbeeld "*.org".<br />
+Ondersteunde protocollen: <code>$1</code> (wordt "http://"als er geen protocol wordt opgegeven).',
 'linksearch-line' => '$1 heeft een verwijzing in $2',
 'linksearch-error' => 'Wildcards zijn alleen toegestaan aan het begin van een hostnaam.',
 
@@ -2382,7 +2396,7 @@ Er kan [[{{MediaWiki:Listgrouprights-helppage}}|extra informatie]] over individu
 '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.
+'emailpagetext' => 'Via dit formulier kunt u een e-mail aan {{GENDER:$1|deze gebruiker}} verzenden.
 Het e-mailadres dat u hebt opgegeven bij [[Special:Preferences|uw voorkeuren]] wordt als afzender gebruikt.
 De ontvanger kan dus direct naar u reageren.',
 'usermailererror' => 'Foutmelding bij het verzenden:',
@@ -2415,7 +2429,7 @@ De ontvanger kan dus direct naar u reageren.',
 
 # Watchlist
 'watchlist' => 'Volglijst',
-'mywatchlist' => 'Mijn volglijst',
+'mywatchlist' => 'Volglijst',
 'watchlistfor2' => 'Voor $1 $2',
 'nowatchlist' => 'Uw volglijst is leeg.',
 'watchlistanontext' => 'Om uw volglijst te bekijken of te bewerken moet u zich $1.',
@@ -2451,19 +2465,23 @@ Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden
 
 'enotif_mailer' => '{{SITENAME}}-berichtensysteem',
 'enotif_reset' => "Alle pagina's markeren als bezocht",
-'enotif_newpagetext' => 'Dit is een nieuwe pagina.',
 'enotif_impersonal_salutation' => 'gebruiker van {{SITENAME}}',
-'changed' => 'gewijzigd',
-'created' => 'aangemaakt',
-'enotif_subject' => 'Pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED door $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}: pagina $1 is verwijderd door {{GENDER:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}: pagina $1 is aangemaakt door {{GENDER:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}: pagina $1 is hernoemd door {{GENDER:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}: pagina $1 is teruggeplaatst door {{GENDER:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}: pagina $1 is bewerkt door {{GENDER:$2|$2}}',
+'enotif_body_intro_deleted' => 'De pagina $1 op {{SITENAME}} is verwijderd door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
+'enotif_body_intro_created' => 'De pagina $1 op {{SITENAME}} is aangemaakt door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
+'enotif_body_intro_moved' => 'De pagina $1 op {{SITENAME}} is hernoemd door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
+'enotif_body_intro_restored' => 'De pagina $1 op {{SITENAME}} is teruggeplaatst door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
+'enotif_body_intro_changed' => 'De pagina $1 op {{SITENAME}} is bewerkt door {{GENDER:$2|$2}} op $PAGEEDITDATE. Zie $3 voor de huidige versie.',
 'enotif_lastvisited' => 'Zie $1 voor alle wijzigingen sinds uw laatste bezoek.',
 'enotif_lastdiff' => 'Ga naar $1 om deze wijziging te bekijken.',
 'enotif_anon_editor' => 'anonieme gebruiker $1',
 'enotif_body' => 'Beste $WATCHINGUSERNAME,
 
-De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR. Zie $PAGETITLE_URL voor de huidige versie.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Samenvatting van de wijziging: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2643,8 +2661,8 @@ Mogelijk hebt u een verkeerde verwijzing of is de versie hersteld of verwijderd
 'undeletedrevisions' => '$1 {{PLURAL:$1|versie|versies}} teruggeplaatst',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 versie|$1 versies}} en {{PLURAL:$2|1 bestand|$2 bestanden}} teruggeplaatst',
 'undeletedfiles' => '{{PLURAL:$1|1 bestand|$1 bestanden}} teruggeplaatst',
-'cannotundelete' => 'Het terugplaatsen is mislukt.
-Misschien heeft een andere gebruiker de pagina al teruggeplaatst.',
+'cannotundelete' => 'Het terugplaatsen is mislukt:
+$1',
 'undeletedpage' => "'''$1 is teruggeplaatst'''
 
 In het [[Special:Log/delete|verwijderingslogboek]] staan recente verwijderingen en herstelhandelingen.",
@@ -2676,9 +2694,9 @@ $1',
 'blanknamespace' => '(Hoofdnaamruimte)',
 
 # Contributions
-'contributions' => 'Gebruikersbijdragen',
+'contributions' => '{{GENDER:$1|Gebruikersbijdragen}}',
 'contributions-title' => 'Bijdragen van $1',
-'mycontris' => 'Mijn bijdragen',
+'mycontris' => 'Bijdragen',
 'contribsub2' => 'Voor $1 ($2)',
 'nocontribs' => 'Geen wijzigingen gevonden die aan de gestelde criteria voldoen.',
 'uctop' => '(laatste wijziging)',
@@ -2719,7 +2737,7 @@ De laatste regel uit het blokkeerlogboek wordt hieronder ter referentie weergege
 'whatlinkshere-hideredirs' => 'doorverwijzingen $1',
 'whatlinkshere-hidetrans' => 'Transclusies $1',
 'whatlinkshere-hidelinks' => 'verwijzingen $1',
-'whatlinkshere-hideimages' => 'bestandsverwijzingen $1',
+'whatlinkshere-hideimages' => 'Bestandsverwijzingen $1',
 'whatlinkshere-filters' => 'Filters',
 
 # Block/unblock
@@ -2953,6 +2971,7 @@ Wilt u deze verwijderen om plaats te maken voor de te hernoemen pagina?',
 'immobile-target-namespace-iw' => 'Een interwikiverwijzing is geen geldige bestemming voor het hernoemen van een pagina.',
 'immobile-source-page' => 'Deze pagina kan niet hernoemd worden.',
 'immobile-target-page' => 'Het is niet mogelijk te hernoemen naar die paginanaam.',
+'bad-target-model' => 'De gewenste bestemming gebruikt een ander inhoudsmodel. Het is niet mogelijk om te zetten van $1 naar $2.',
 'imagenocrossnamespace' => 'Een mediabestand kan niet naar een andere naamruimte verplaatst worden',
 'nonfile-cannot-move-to-file' => 'Het is niet mogelijk te hernoemen van en naar de bestandsnaamruimte',
 'imagetypemismatch' => 'De nieuwe bestandsextensie is niet gelijk aan het bestandstype',
@@ -3083,7 +3102,6 @@ Een tijdelijke map is niet aanwezig.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript testen',
-'javascripttest-disabled' => 'Deze functie is uitgeschakeld in deze wiki.',
 'javascripttest-title' => 'Tests uitvoeren voor $1',
 'javascripttest-pagetext-noframework' => 'Deze pagina is gereserveerd voor het uitvoeren van JavaScripttesten.',
 'javascripttest-pagetext-unknownframework' => 'Onbekend testframework "$1".',
@@ -3224,6 +3242,7 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 
 # Info page
 'pageinfo-title' => 'Informatie over "$1"',
+'pageinfo-not-current' => 'Deze gegevens zijn alleen beschikbaar voor de huidige versie.',
 'pageinfo-header-basic' => 'Basisgegevens',
 'pageinfo-header-edits' => 'Bewerkingsgeschiedenis',
 'pageinfo-header-restrictions' => 'Paginabeveiliging',
@@ -3232,6 +3251,7 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'pageinfo-default-sort' => 'Standaard sorteerwijze',
 'pageinfo-length' => 'Paginalengte (in bytes)',
 'pageinfo-article-id' => 'Paginanummer',
+'pageinfo-language' => 'Pagina-inhoudstaal',
 'pageinfo-robot-policy' => 'Status voor de zoekmachine',
 'pageinfo-robot-index' => 'Indexeerbaar',
 'pageinfo-robot-noindex' => 'Niet indexeerbaar',
@@ -3248,10 +3268,17 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 '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 ($1)',
 '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)',
+'pageinfo-toolboxlink' => 'Paginagegevens',
+'pageinfo-redirectsto' => 'Verwijst door naar',
+'pageinfo-redirectsto-info' => 'informatie',
+'pageinfo-contentpage' => 'Geteld als pagina met inhoud',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Beveiligingen werken vanaf hier door',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Pagina is beveiligd vanuit een andere pagina',
 
 # Skin names
 'skinname-standard' => 'Klassiek',
@@ -3274,6 +3301,8 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'markedaspatrollederror' => 'Kan niet als gecontroleerd worden aangemerkt',
 'markedaspatrollederrortext' => 'Selecteer een versie om als gecontroleerd aan te merken.',
 'markedaspatrollederror-noautopatrol' => 'U kunt uw eigen wijzigingen niet als gecontroleerd markeren.',
+'markedaspatrollednotify' => 'Deze bewerking op $1 is gemarkeerd als gecontroleerd.',
+'markedaspatrollederrornotify' => 'Markeren als gecontroleerd mislukt.',
 
 # Patrol log
 'patrol-log-page' => 'Markeerlogboek',
@@ -3338,6 +3367,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 uur|$1 uur}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagen}}',
 'ago' => '$1 geleden',
+'just-now' => 'Daarnet',
 
 # Bad image list
 'bad_image_list' => "De opmaak is als volgt:
@@ -3833,7 +3863,8 @@ De bevestigingscode vervalt op $4.',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-invoeging van sjablonen is uitgeschakeld]',
-'scarytranscludefailed' => '[Het sjabloon $1 kon niet opgehaald worden]',
+'scarytranscludefailed' => '[De sjabloon $1 kon niet opgehaald worden]',
+'scarytranscludefailed-httpstatus' => '[De sjabloon $1 kon niet opgehaald worden: HTTP $2]',
 'scarytranscludetoolong' => '[De URL is te lang]',
 
 # Delete conflict
@@ -3964,6 +3995,7 @@ U kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
 'version-license' => 'Licentie',
 'version-poweredby-credits' => "Deze wiki wordt aangedreven door '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'anderen',
+'version-credits-summary' => 'We zouden graag de volgende personen erkennen voor hun bijdrage aan [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki is vrije software; u kunt MediaWiki verspreiden en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation; ofwel versie 2 van de Licentie, of - naar uw wens - enige latere versie.
 
 MediaWiki wordt verspreid in de hoop dat het nuttig is, maar ZONDER ENIGE GARANTIE; zonder zelfs de impliciete garantie van VERKOOPBAARHEID of GESCHIKTHEID VOOR ENIG DOEL IN HET BIJZONDER. Zie de GNU General Public License voor meer informatie.
@@ -4051,7 +4083,7 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'compare-rev1' => 'Versie 1',
 'compare-rev2' => 'Versie 2',
 'compare-submit' => 'Vergelijken',
-'compare-invalid-title' => 'De titel die u hebt opgegeven is ongeldig.',
+'compare-invalid-title' => 'De opgegeven pagina is ongeldig.',
 'compare-title-not-exists' => 'De titel die u hebt opgegeven bestaat niet.',
 'compare-revision-not-exists' => 'De versie die u hebt opgegeven bestaat niet.',
 
@@ -4106,9 +4138,9 @@ Andere bestandstypen worden direct in het met het MIME-type verbonden programma
 'logentry-move-move_redir-noredirect' => '$1 heeft pagina $3 naar $4 hernoemd over een doorverwijzing zonder een doorverwijzing achter te laten',
 'logentry-patrol-patrol' => '$1 heeft versie $4 van pagina $3 als gecontroleerd gemarkeerd',
 'logentry-patrol-patrol-auto' => '$1 heeft versie $4 van pagina $3 automatisch als gecontroleerd gemarkeerd',
-'logentry-newusers-newusers' => '$1 heeft een gebruiker aangemaakt',
-'logentry-newusers-create' => '$1 is als gebruiker aangemaakt',
-'logentry-newusers-create2' => '$1 heeft een gebruiker $3 aangemaakt',
+'logentry-newusers-newusers' => 'Gebruiker $1 is aangemaakt',
+'logentry-newusers-create' => 'Gebruiker $1 is aangemaakt',
+'logentry-newusers-create2' => 'Gebruiker $3 is aangemaakt door $1',
 'logentry-newusers-autocreate' => 'De gebruiker $1 is automatisch aangemaakt',
 'newuserlog-byemail' => 'wachtwoord is verzonden per e-mail',
 
@@ -4128,6 +4160,10 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
 'feedback-bugcheck' => 'Geweldig! Controleer even of het niet al één van de [$1 bekende problemen] is.',
 'feedback-bugnew' => 'Heb ik gecontroleerd; nieuw probleem melden',
 
+# Search suggestions
+'searchsuggest-search' => 'Zoeken',
+'searchsuggest-containing' => 'bevat...',
+
 # API errors
 'api-error-badaccess-groups' => 'U mag geen bestanden uploaden in deze wiki.',
 'api-error-badtoken' => 'Interne fout: het token klopt niet.',
@@ -4180,4 +4216,6 @@ Anders kunt u ook het eenvoudige formulier hieronder gebruiken. Uw reactie wordt
 'duration-centuries' => '$1 {{PLURAL:$1|eeuw|eeuwen}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
+# Unknown messages
+'svg-long-error' => 'Ongeldig SVG-bestand: $1',
 );
index 270bd02..663aa93 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** ‪Nederlands (informeel)‬ (‪Nederlands (informeel)‬)
+/** Nederlands (informeel)‎ (Nederlands (informeel)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -23,11 +23,11 @@ $1',
 
 'badaccess-group0' => 'Je hebt geen rechten om de gevraagde handeling uit te voeren.',
 
-'youhavenewmessages'      => 'Je hebt $1 ($2).',
+'youhavenewmessages' => 'Je hebt $1 ($2).',
 'youhavenewmessagesmulti' => 'Je hebt nieuwe berichten op $1',
 
 # Main script and global functions
-'nosuchactiontext'  => 'De opdracht in de URL is ongeldig.
+'nosuchactiontext' => 'De opdracht in de URL is ongeldig.
 Mogelijk heb je een typefout gemaakt in de URL of een onjuiste verwijzing gevolgd.
 Het kan ook wijzen op een fout in de software van {{SITENAME}}.',
 'nospecialpagetext' => '<strong>Je hebt een onbestaande speciale pagina opgevraagd.</strong>
@@ -35,7 +35,7 @@ Het kan ook wijzen op een fout in de software van {{SITENAME}}.',
 Een lijst met bestaande speciale pagina’s staat op [[Special:SpecialPages|speciale pagina’s]].',
 
 # General errors
-'missing-article'     => 'In de database is geen inhoud aangetroffen voor de pagina "$1" die er wel zou moeten zijn ($2).
+'missing-article' => 'In de database is geen inhoud aangetroffen voor de pagina "$1" die er wel zou moeten zijn ($2).
 
 Dit kan voorkomen als je een verouderde verwijzing naar het verschil tussen twee versies van een pagina volgt of een versie opvraagt die is verwijderd.
 
@@ -44,36 +44,36 @@ Maak hiervan melding bij een [[Special:ListUsers/sysop|systeembeheerder]] van {{
 'actionthrottledtext' => 'Als maatregel tegen spam is het aantal keren per tijdseenheid dat je deze handeling kunt verrichten beperkt.
 De limiet is overschreden.
 Probeer het over een aantal minuten opnieuw.',
-'viewsourcetext'      => 'Je kunt de brontekst van deze pagina bekijken en kopiëren:',
-'editinginterface'    => "'''Waarschuwing:''' Je bewerkt een pagina die gebruikt wordt door de software.
+'viewsourcetext' => 'Je kunt de brontekst van deze pagina bekijken en kopiëren:',
+'editinginterface' => "'''Waarschuwing:''' Je bewerkt een pagina die gebruikt wordt door de software.
 Bewerkingen op deze pagina beïnvloeden de gebruikersinterface van iedereen.
 Overweeg voor vertalingen om [//translatewiki.net/wiki/Main_Page?setlang=nl translatewiki.net] te gebruiken, het vertalingsproject voor MediaWiki.",
-'namespaceprotected'  => "Je hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
+'namespaceprotected' => "Je hebt geen rechten om pagina's in de naamruimte '''$1''' te bewerken.",
 
 # Login and logout pages
-'logouttext'                 => "'''Je bent nu afgemeld.'''
+'logouttext' => "'''Je bent nu afgemeld.'''
 
 Je kunt {{SITENAME}} nu anoniem gebruiken of weer [[Special:UserLogin|aanmelden]] als dezelfde of een andere gebruiker.
 Mogelijk worden nog een aantal pagina's weergegeven alsof je aangemeld bent totdat je de cache van uw browser leegt.",
-'welcomecreation'            => '== Welkom, $1! ==
+'welcomecreation' => '== Welkom, $1! ==
 Je gebruiker is geregistreerd.
 Vergeet niet je [[Special:Preferences|voorkeuren voor {{SITENAME}}]] aan te passen.',
-'yourpasswordagain'          => 'Geef je wachtwoord opnieuw in:',
-'yourdomainname'             => 'Je domein:',
-'externaldberror'            => 'Er is een fout opgetreden bij het aanmelden bij de database of je hebt geen toestemming uw externe gebruiker bij te werken.',
-'loginprompt'                => 'Je moet cookies ingeschakeld hebben om je te kunnen aanmelden bij {{SITENAME}}.',
-'gotaccount'                 => "Heb je al een gebruikersnaam? '''$1'''.",
-'nocookiesnew'               => 'De gebruiker is geregistreerd, maar niet aangemeld.
+'yourpasswordagain' => 'Geef je wachtwoord opnieuw in:',
+'yourdomainname' => 'Je domein:',
+'externaldberror' => 'Er is een fout opgetreden bij het aanmelden bij de database of je hebt geen toestemming uw externe gebruiker bij te werken.',
+'loginprompt' => 'Je moet cookies ingeschakeld hebben om je te kunnen aanmelden bij {{SITENAME}}.',
+'gotaccount' => "Heb je al een gebruikersnaam? '''$1'''.",
+'nocookiesnew' => 'De gebruiker is geregistreerd, maar niet aangemeld.
 {{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
 Schakel die in en meld daarna aan met je nieuwe gebruikersnaam en wachtwoord.',
-'nocookieslogin'             => '{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
+'nocookieslogin' => '{{SITENAME}} gebruikt cookies voor het aanmelden van gebruikers.
 Cookies zijn uitgeschakeld in je browser.
 Schakel deze optie aan en probeer het opnieuw.',
-'noname'                     => 'Je hebt geen geldige gebruikersnaam opgegeven.',
-'loginsuccess'               => "'''Je bent nu aangemeld bij {{SITENAME}} als \"\$1\".'''",
-'nouserspecified'            => 'Je dient een gebruikersnaam op te geven.',
-'password-name-match'        => 'Je wachtwoord en uw gebruikersnaam mogen niet overeenkomen.',
-'passwordremindertext'       => 'Iemand, waarschijnlijk jijzelf, heeft vanaf IP-adres $1 een verzoek
+'noname' => 'Je hebt geen geldige gebruikersnaam opgegeven.',
+'loginsuccess' => "'''Je bent nu aangemeld bij {{SITENAME}} als \"\$1\".'''",
+'nouserspecified' => 'Je dient een gebruikersnaam op te geven.',
+'password-name-match' => 'Je wachtwoord en uw gebruikersnaam mogen niet overeenkomen.',
+'passwordremindertext' => 'Iemand, waarschijnlijk jijzelf, heeft vanaf IP-adres $1 een verzoek
 gedaan tot het toezenden van een nieuw wachtwoord voor {{SITENAME}}
 ($4). Er is een tijdelijk wachtwoord aangemaakt voor gebruiker "$2":
 "$3". Als dat je bedoeling was, meld je dan nu aan en kies een nieuw
@@ -83,36 +83,36 @@ Je tijdelijke wachtwoord vervalt over {{PLURAL:$5|$5 dag|$5 dagen}}.
 Als iemand anders dan jij dit verzoek heeft gedaan of als je zich inmiddels het
 wachtwoord herinnert en het niet langer wilt wijzigen, negeer dit bericht
 dan en blijf je bestaande wachtwoord gebruiken.',
-'noemailcreate'              => 'Je moet een geldig e-mailadres opgeven',
-'passwordsent'               => 'Het wachtwoord is verzonden naar het e-mailadres voor "$1".
+'noemailcreate' => 'Je moet een geldig e-mailadres opgeven',
+'passwordsent' => 'Het wachtwoord is verzonden naar het e-mailadres voor "$1".
 Meld je aan nadat je het hebt ontvangen.',
-'blocked-mailpassword'       => 'Je IP-adres is geblokkeerd voor het maken van wijzigingen.
+'blocked-mailpassword' => 'Je IP-adres is geblokkeerd voor het maken van wijzigingen.
 Om misbruik te voorkomen is het niet mogelijk om een nieuw wachtwoord aan te vragen.',
-'eauthentsent'               => 'Er is een bevestigingse-mail naar het opgegeven e-mailadres gezonden.
+'eauthentsent' => 'Er is een bevestigingse-mail naar het opgegeven e-mailadres gezonden.
 Volg de aanwijzingen in de e-mail om aan te geven dat het jouw e-mailadres is.
 Tot die tijd kunnen er geen e-mails naar het e-mailadres gezonden worden.',
 'acct_creation_throttle_hit' => 'Bezoekers van deze wiki met hetzelfde IP-adres als jij hebben de afgelopen dag {{PLURAL:$1|al 1 gebruiker|al $1 gebruikers}} geregistreerd, wat het maximale aantal in deze periode is.
 Daarom kun je als vanaf jouw IP-adres op dit moment geen nieuwe gebruiker registreren.',
-'emailauthenticated'         => 'Je e-mailadres is bevestigd op $2 om $3.',
-'emailnotauthenticated'      => 'Je e-mailadres is <strong>niet bevestigd</strong>.
+'emailauthenticated' => 'Je e-mailadres is bevestigd op $2 om $3.',
+'emailnotauthenticated' => 'Je e-mailadres is <strong>niet bevestigd</strong>.
 Je ontvangt geen e-mail voor de onderstaande functies.',
-'noemailprefs'               => 'Geef een e-mailadres op in je voorkeuren om deze functies te gebruiken.',
-'emailconfirmlink'           => 'Bevestig je e-mailadres',
-'createaccount-text'         => 'Iemand heeft een gebruiker op {{SITENAME}} ($4) aangemaakt met de naam "$2" en jouw e-mailadres.
+'noemailprefs' => 'Geef een e-mailadres op in je voorkeuren om deze functies te gebruiken.',
+'emailconfirmlink' => 'Bevestig je e-mailadres',
+'createaccount-text' => 'Iemand heeft een gebruiker op {{SITENAME}} ($4) aangemaakt met de naam "$2" en jouw e-mailadres.
 Het wachtwoord voor "$2" is "$3".
 Meld je aan en wijzig je wachtwoord.
 
 Negeer dit bericht als deze gebruiker zonder jouw medeweten is aangemaakt.',
-'login-throttled'            => 'Je hebt recentelijk te vaak geprobeerd aan te melden met een onjuist wachtwoord.
+'login-throttled' => 'Je hebt recentelijk te vaak geprobeerd aan te melden met een onjuist wachtwoord.
 Wacht even voordat je het opnieuw probeert.',
-'suspicious-userlogout'      => 'Je verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.',
+'suspicious-userlogout' => 'Je verzoek om af te melden is genegeerd, omdat het lijkt alsof het verzoek is verzonden door een browser of cacheproxy die stuk is.',
 
 # Change password dialog
-'resetpass_announce'      => 'Je bent aangemeld met een tijdelijke code die je per e-mail is toegezonden.
+'resetpass_announce' => 'Je bent aangemeld met een tijdelijke code die je per e-mail is toegezonden.
 Voer een nieuw wachtwoord in om het aanmelden te voltooien:',
-'resetpass_success'       => 'Je wachtwoord is gewijzigd.
+'resetpass_success' => 'Je wachtwoord is gewijzigd.
 Bezig met aanmelden…',
-'resetpass-no-info'       => 'Je dient aangemeld zijn voordat je deze pagina kunt gebruiken.',
+'resetpass-no-info' => 'Je dient aangemeld zijn voordat je deze pagina kunt gebruiken.',
 'resetpass-wrong-oldpass' => 'Het huidige of tijdelijke wachtwoord is ongeldig.
 Mogelijk heb je je wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aangevraagd.',
 
@@ -120,16 +120,16 @@ Mogelijk heb je je wachtwoord al gewijzigd of een nieuw tijdelijk wachtwoord aan
 'sig_tip' => 'Je handtekening met datum en tijd',
 
 # Edit pages
-'anoneditwarning'                  => "'''Waarschuwing:''' je bent niet aangemeld.
+'anoneditwarning' => "'''Waarschuwing:''' je bent niet aangemeld.
 Je IP-adres wordt opgeslagen als je wijzigingen op deze pagina maakt.",
-'anonpreviewwarning'               => "''Je bent niet aangemeld.''
+'anonpreviewwarning' => "''Je bent niet aangemeld.''
 ''Door je bewerking op te slaan wordt je IP-adres opgeslagen in de paginageschiedenis.''",
-'missingsummary'                   => "'''Herinnering:''' je hebt geen samenvatting opgegeven voor je bewerking.
+'missingsummary' => "'''Herinnering:''' je hebt geen samenvatting opgegeven voor je bewerking.
 Als je nogmaals op ''Pagina opslaan'' klikt wordt de bewerking zonder samenvatting opgeslagen.",
-'missingcommenttext'               => 'Plaats je opmerking hieronder.',
-'missingcommentheader'             => "'''Let op:''' Je hebt geen onderwerp/kop voor deze opmerking opgegeven.
+'missingcommenttext' => 'Plaats je opmerking hieronder.',
+'missingcommentheader' => "'''Let op:''' Je hebt geen onderwerp/kop voor deze opmerking opgegeven.
 Als je opnieuw op \"{{int:savearticle}}\" klikt, wordt je wijziging zonder een onderwerp/kop opgeslagen.",
-'blockedtext'                      => '\'\'\'Je gebruiker of IP-adres is geblokkeerd.\'\'\'
+'blockedtext' => '\'\'\'Je gebruiker of IP-adres is geblokkeerd.\'\'\'
 
 De blokkade is uitgevoerd door $1.
 De opgegeven reden is \'\'$2\'\'.
@@ -142,7 +142,7 @@ Je kunt contact opnemen met $1 of een andere [[{{MediaWiki:Grouppage-sysop}}|beh
 Je kunt geen gebruik maken van de functie "Deze gebruiker e-mailen", tenzij je een geldig e-mailadres hebt opgegeven in uw [[Special:Preferences|voorkeuren]] en het gebruik van deze functie niet geblokkeerd is.
 Je huidige IP-adres is $3 en het blokkadenummer is #$5.
 Vermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.',
-'autoblockedtext'                  => 'Je IP-adres is automatisch geblokkeerd, omdat het is gebruikt door een andere gebruiker, die is geblokkeerd door $1.
+'autoblockedtext' => 'Je IP-adres is automatisch geblokkeerd, omdat het is gebruikt door een andere gebruiker, die is geblokkeerd door $1.
 De opgegeven reden is:
 
 :\'\'$2\'\'
@@ -157,169 +157,168 @@ Je kunt geen gebruik maken van de functie "Deze gebruiker e-mailen", tenzij je e
 
 Je huidige IP-adres is $3 en het blokkadenummer is #$5.
 Vermeld alle bovenstaande gegevens als je ergens op deze blokkade reageert.',
-'whitelistedittext'                => "Je moet $1 om pagina's te bewerken.",
-'confirmedittext'                  => 'Je moet je e-mailadres bevestigen voor je kunt bewerken.
+'whitelistedittext' => "Je moet $1 om pagina's te bewerken.",
+'confirmedittext' => 'Je moet je e-mailadres bevestigen voor je kunt bewerken.
 Voer je e-mailadres in en bevestig het via [[Special:Preferences|je voorkeuren]].',
-'nosuchsectiontext'                => 'Je probeerde een subkopje te bewerken dat niet bestaat.
+'nosuchsectiontext' => 'Je probeerde een subkopje te bewerken dat niet bestaat.
 Wellicht is het verplaatst of verwijderd terwijl je de pagina aan het bekijken was.',
-'loginreqpagetext'                 => "Je moet je $1 om andere pagina's te kunnen bekijken.",
-'newarticletext'                   => "Deze pagina bestaat niet.
+'loginreqpagetext' => "Je moet je $1 om andere pagina's te kunnen bekijken.",
+'newarticletext' => "Deze pagina bestaat niet.
 Typ in het onderstaande veld om de pagina aan te maken (meer informatie staat op de [[{{MediaWiki:Helppage}}|hulppagina]]).
 Gebruik de knop '''vorige''' in je browser als je hier per ongeluk terecht bent gekomen.",
-'anontalkpagetext'                 => "----''Deze overlegpagina hoort bij een anonieme gebruiker die hetzij geen gebruikersnaam heeft, hetzij deze niet gebruikt.
+'anontalkpagetext' => "----''Deze overlegpagina hoort bij een anonieme gebruiker die hetzij geen gebruikersnaam heeft, hetzij deze niet gebruikt.
 Daarom wordt het IP-adres ter identificatie gebruikt.
 Het is mogelijk dat meerdere personen hetzelfde IP-adres gebruiken.
 Mogelijk ontvang je hier berichten die niet voor je bedoeld zijn.
 Als je dat wilt voorkomen, [[Special:UserLogin/signup|registreer je]] of [[Special:UserLogin|meld je aan]] om verwarring met andere anonieme gebruikers te voorkomen.''",
-'noarticletext'                    => 'Deze pagina bevat geen tekst.
+'noarticletext' => 'Deze pagina bevat geen tekst.
 Je kunt [[Special:Search/{{PAGENAME}}|naar deze term zoeken]] in andere pagina\'s, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} de logboeken doorzoeken] of [{{fullurl:{{FULLPAGENAME}}|action=edit}} deze pagina bewerken]</span>.',
-'noarticletext-nopermission'       => 'Deze pagina bevat geen tekst.
+'noarticletext-nopermission' => 'Deze pagina bevat geen tekst.
 Je 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>.',
-'userpage-userdoesnotexist'        => 'Je bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker "<nowiki>$1</nowiki>").
+'userpage-userdoesnotexist' => 'Je bewerkt een gebruikerspagina van een gebruiker die niet bestaat (gebruiker "<nowiki>$1</nowiki>").
 Controleer of je deze pagina wel wilt aanmaken/bewerken.',
-'clearyourcache'                   => "'''Let op! Nadat je de wijzigingen hebt opgeslagen is het wellicht nodig je browsercache te legen.'''
-
-'''Mozilla / Firefox / Safari:''' houd ''Shift'' ingedrukt terwijl je op ''Huidige pagina vernieuwen'' klikt of typ ''Ctrl-F5'' of ''Ctrl-R'' (''Command-R'' op eenMac);
-'''Konqueror: '''klik ''Reload'' of typ ''F5;''
-'''Opera:''' leeg je cache in ''Extra → Voorkeuren;''
-'''Internet Explorer:''' houd ''Ctrl'' ingedrukt terwijl je op ''Vernieuwen'' klikt of type ''Ctrl-F5.''",
-'usercssyoucanpreview'             => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om je nieuwe CSS te testen alvorens op te slaan.",
-'userjsyoucanpreview'              => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om je nieuwe JavaScript te testen alvorens op te slaan.",
-'usercsspreview'                   => "'''Dit is alleen een voorvertoning van je persoonlijke CSS.
+'clearyourcache' => "'''Let op!''' Nadat je de wijzigingen hebt opgeslagen is het wellicht nodig je browsercache te legen.
+* '''Firefox / Safari:''' houd ''Shift'' ingedrukt terwijl je 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 je op ''Vernieuwen'' klikt of druk op ''Ctrl-F5''
+* '''Opera:''' leeg je cache in ''Extra → Voorkeuren''",
+'usercssyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om je nieuwe CSS te testen alvorens op te slaan.",
+'userjsyoucanpreview' => "'''Tip:''' Gebruik de knop \"{{int:showpreview}}\" om je nieuwe JavaScript te testen alvorens op te slaan.",
+'usercsspreview' => "'''Dit is alleen een voorvertoning van je persoonlijke CSS.
 Deze is nog niet opgeslagen!'''",
-'userjspreview'                    => "'''Let op: je test nu je persoonlijke JavaScript.'''
+'userjspreview' => "'''Let op: je test nu je persoonlijke JavaScript.'''
 '''De pagina is niet opgeslagen!'''",
-'userinvalidcssjstitle'            => "'''Waarschuwing:''' er is geen skin \"\$1\".
+'userinvalidcssjstitle' => "'''Waarschuwing:''' er is geen skin \"\$1\".
 Let op: je eigen .css- en .js-pagina's beginnen met een kleine letter, bijvoorbeeld {{ns:user}}:Naam/vector.css in plaats van {{ns:user}}:Naam/Vector.css.",
-'previewnote'                      => "'''Let op: dit is een controlepagina; je tekst is niet opgeslagen!'''",
-'previewconflict'                  => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als je deze opslaat.',
-'session_fail_preview'             => "'''Je bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
+'previewnote' => "'''Let op: dit is een controlepagina; je tekst is niet opgeslagen!'''",
+'previewconflict' => 'Deze voorvertoning geeft aan hoe de tekst in het bovenste veld eruit ziet als je deze opslaat.',
+'session_fail_preview' => "'''Je bewerking is niet verwerkt, omdat de sessiegegevens verloren zijn gegaan.
 Probeer het opnieuw.
 Als het dan nog niet lukt, [[Special:UserLogout|meld jezelf dan af]] en weer aan.'''",
-'session_fail_preview_html'        => "'''Je bewerking is niet verwerkt, omdat sessiegegevens verloren zijn gegaan.'''
+'session_fail_preview_html' => "'''Je bewerking is niet verwerkt, omdat sessiegegevens verloren zijn gegaan.'''
 
 ''Omdat in {{SITENAME}} ruwe HTML is ingeschakeld, is een voorvertoning niet mogelijk als bescherming tegen aanvallen met JavaScript.''
 
 '''Als dit een legitieme bewerking is, probeer het dan opnieuw.
 Als het dan nog niet lukt, [[Special:UserLogout|meld jezelf dan af]] en weer aan.'''",
-'token_suffix_mismatch'            => "'''Je bewerking is geweigerd, omdat je browser de leestekens in het bewerkingstoken onjuist heeft behandeld.
+'token_suffix_mismatch' => "'''Je bewerking is geweigerd, omdat je browser de leestekens in het bewerkingstoken onjuist heeft behandeld.
 De bewerking is geweigerd om verminking van de paginatekst te voorkomen.
 Dit gebeurt soms als er een webgebaseerde proxydienst wordt gebruikt die fouten bevat.'''",
-'explainconflict'                  => "Een andere gebruiker heeft deze pagina bewerkt sinds je met je bewerking bent begonnen.
+'explainconflict' => "Een andere gebruiker heeft deze pagina bewerkt sinds je met je bewerking bent begonnen.
 In het bovenste deel van het venster staat de tekst van de huidige pagina.
 Je bewerking staat in het onderste gedeelte.
 Je dient je bewerkingen in te voegen in de bestaande tekst.
 '''Alleen''' de tekst in het bovenste gedeelte wordt opgeslagen als je op \"{{int:savearticle}}\" klikt.",
-'yourtext'                         => 'Je tekst',
-'nonunicodebrowser'                => "'''WAARSCHUWING: Je browser kan niet goed overweg met unicode.
+'yourtext' => 'Je tekst',
+'nonunicodebrowser' => "'''WAARSCHUWING: Je browser kan niet goed overweg met unicode.
 Hiermee wordt door de MediaWiki-software rekening gehouden zodat je toch zonder problemen pagina's kunt bewerken: niet-ASCII karakters worden in het bewerkingsveld weergegeven als hexadecimale codes.'''",
-'editingold'                       => "'''WAARSCHUWING!
+'editingold' => "'''WAARSCHUWING!
 Je bewerkt een oude versie van deze pagina.
 Als je je bewerking opslaat, gaan alle wijzigingen die na deze versie gemaakt zijn verloren.'''",
-'copyrightwarning'                 => "Opgelet: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de $2 (zie $1 voor details).
+'copyrightwarning' => "Opgelet: alle bijdragen aan {{SITENAME}} worden geacht te zijn vrijgegeven onder de $2 (zie $1 voor details).
 Als je niet wilt dat je tekst door anderen naar believen bewerkt en verspreid kan worden, kies dan niet voor ‘Pagina opslaan’.<br />
 Hierbij beloof je ons tevens dat je deze tekst zelf hebt geschreven of overgenomen uit een vrije, openbare bron.<br />
 '''GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAAR TOESTEMMING VOOR HEBT!'''",
-'copyrightwarning2'                => "Al je bijdragen aan {{SITENAME}} kunnen bewerkt, gewijzigd of verwijderd worden door andere gebruikers.
+'copyrightwarning2' => "Al je bijdragen aan {{SITENAME}} kunnen bewerkt, gewijzigd of verwijderd worden door andere gebruikers.
 Als je niet wilt dat je teksten rigoureus aangepast worden door anderen, plaats ze hier dan niet.<br />
 Je belooft ook dat je de oorspronkelijke auteur bent van dit materiaal of dat je het hebt gekopieerd uit een bron in het publieke domein of een soortgelijke vrije bron (zie $1 voor details).
 '''GEBRUIK GEEN MATERIAAL DAT BESCHERMD WORDT DOOR AUTEURSRECHT, TENZIJ JE DAARVOOR TOESTEMMING HEBT!'''",
-'longpageerror'                    => "'''FOUT: de tekst die je hebt toegevoegd is $1 kilobyte groot, wat groter is dan het maximum van $2 kilobyte.
+'longpageerror' => "'''FOUT: de tekst die je hebt toegevoegd is $1 kilobyte groot, wat groter is dan het maximum van $2 kilobyte.
 Opslaan is niet mogelijk.'''",
-'readonlywarning'                  => "'''WAARSCHUWING: De database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud, dus je kunt deze nu niet opslaan.
+'readonlywarning' => "'''WAARSCHUWING: De database is geblokkeerd voor bewerkingen, waarschijnlijk voor regulier databaseonderhoud, dus je kunt deze nu niet opslaan.
 Het is misschien verstandig om je tekst tijdelijk in een tekstbestand op te slaan om dit te bewaren voor wanneer de blokkering van de database opgeheven is.'''
 
 Een beheerder heeft de database geblokkeerd om de volgende reden: $1",
-'nocreatetext'                     => "{{SITENAME}} heeft de mogelijkheid om nieuwe pagina's te maken beperkt.
+'nocreatetext' => "{{SITENAME}} heeft de mogelijkheid om nieuwe pagina's te maken beperkt.
 Je kunt reeds bestaande pagina's wijzigen of je kunt [[Special:UserLogin|jezelf aanmelden of registreren]].",
-'nocreate-loggedin'                => "Je hebt geen rechten om nieuwe pagina's te maken.",
-'permissionserrorstext'            => 'Je hebt geen rechten om dit te doen om de volgende {{PLURAL:$1|reden|redenen}}:',
+'nocreate-loggedin' => "Je hebt geen rechten om nieuwe pagina's te maken.",
+'permissionserrorstext' => 'Je hebt geen rechten om dit te doen om de volgende {{PLURAL:$1|reden|redenen}}:',
 'permissionserrorstext-withaction' => 'Je hebt geen rechten om $2 om de volgende {{PLURAL:$1|reden|redenen}}:',
-'recreate-moveddeleted-warn'       => "'''Waarschuwing: je bent bezig met het aanmaken van een pagina die in het verleden verwijderd is.'''
+'recreate-moveddeleted-warn' => "'''Waarschuwing: je bent bezig met het aanmaken van een pagina die in het verleden verwijderd is.'''
 
 Overweeg of het terecht is dat je verder werkt aan deze pagina.
 Voor je gemak staan hieronder het verwijderingslogboek en het hernoemingslogboek voor deze pagina:",
-'edit-no-change'                   => 'Je bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.',
+'edit-no-change' => 'Je bewerking is genegeerd, omdat er geen wijziging aan de tekst is gemaakt.',
 
 # Revision deletion
-'rev-deleted-text-unhide'     => "Deze versie van de pagina is '''verwijderd'''.
+'rev-deleted-text-unhide' => "Deze versie van de pagina is '''verwijderd'''.
 Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
 Als beheerder kun je  [$1 deze versie bekijken] als je wil.",
-'rev-suppressed-text-unhide'  => "Deze paginaversie is '''onderdrukt'''.
+'rev-suppressed-text-unhide' => "Deze paginaversie is '''onderdrukt'''.
 Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].
 Als beheerder kun je [$1 de verschillen bekijken] als je wil.",
-'rev-deleted-text-view'       => "Deze bewerking is '''verwijderd'''.
+'rev-deleted-text-view' => "Deze bewerking is '''verwijderd'''.
 Als beheerder kun je deze zien;
 er kunnen details aanwezig zijn in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
-'rev-suppressed-text-view'    => "Deze paginaversie is '''onderdrukt'''.
+'rev-suppressed-text-view' => "Deze paginaversie is '''onderdrukt'''.
 Als beheerder kun je deze bekijken;
 achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} logboek onderdrukte versies].",
-'rev-deleted-no-diff'         => "Je kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.
+'rev-deleted-no-diff' => "Je kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.
 Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
-'rev-suppressed-no-diff'      => "Je kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.",
-'rev-deleted-unhide-diff'     => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd is '''verwijderd'''.
+'rev-suppressed-no-diff' => "Je kunt de verschillen niet bekijken, omdat een van de versies is '''verwijderd'''.",
+'rev-deleted-unhide-diff' => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd is '''verwijderd'''.
 Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].
 Als beheerder kun je [$1 de verschillen bekijken] als je wil.",
-'rev-suppressed-unhide-diff'  => "Een van de versies in deze verschillen is '''onderdrukt'''.
+'rev-suppressed-unhide-diff' => "Een van de versies in deze verschillen is '''onderdrukt'''.
 Achtergronden zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].
 Als beheerder kunt je [$1 deze versie bekijken] als je wil.",
-'rev-deleted-diff-view'       => "Een van de versies voor de verschillen die je hebt opgevraagd, is '''verwijderd'''.
+'rev-deleted-diff-view' => "Een van de versies voor de verschillen die je hebt opgevraagd, is '''verwijderd'''.
 Jij kunt deze verschillen bekijken. Mogelijk zijn details zichtbaar in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderlogboek].",
-'rev-suppressed-diff-view'    => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd, is '''onderdrukt'''.
+'rev-suppressed-diff-view' => "Een van de bewerkingen voor de verschillen die je hebt opgevraagd, is '''onderdrukt'''.
 Als beheerder kun je deze verschillen bekijken. Mogelijk zijn details zichtbaar in het [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} verbergingslogboek].",
-'revdelete-nooldid-text'      => 'Je hebt geen doelversie(s) voor deze handeling opgegeven, de aangegeven versie bestaat niet of je probeert de laatste versie te verbergen.',
-'revdelete-nologtype-text'    => 'Je hebt geen logboektype opgegeven om deze handeling op uit te voeren.',
-'revdelete-nologid-text'      => 'Je hebt ofwel geen doellogboekregel opgegeven of de aangegeven logboekregel bestaat niet.',
+'revdelete-nooldid-text' => 'Je hebt geen doelversie(s) voor deze handeling opgegeven, de aangegeven versie bestaat niet of je probeert de laatste versie te verbergen.',
+'revdelete-nologtype-text' => 'Je hebt geen logboektype opgegeven om deze handeling op uit te voeren.',
+'revdelete-nologid-text' => 'Je hebt ofwel geen doellogboekregel opgegeven of de aangegeven logboekregel bestaat niet.',
 'revdelete-show-file-confirm' => 'Weet je zeker dat u de verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wilt bekijken?',
-'revdelete-confirm'           => 'Bevestig dat je dit wilde doen, dat je de consequenties begrijpt en dat je dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].',
-'revdelete-show-no-access'    => 'Er is een fout opgetreden bij het weergeven van het object van $1 om $2 uur: dit object is gemarkeerd als "beschermd".
+'revdelete-confirm' => 'Bevestig dat je dit wilde doen, dat je de consequenties begrijpt en dat je dit doet in overeenstemming met het geldende [[{{MediaWiki:Policy-url}}|beleid]].',
+'revdelete-show-no-access' => 'Er is een fout opgetreden bij het weergeven van het object van $1 om $2 uur: dit object is gemarkeerd als "beschermd".
 Je hebt geen toegang tot dit object.',
-'revdelete-modify-no-access'  => 'Er is een fout opgetreden bij het wijzigen van het object van $1 om $2 uur: dit object is gemarkeerd als "beschermd".
+'revdelete-modify-no-access' => 'Er is een fout opgetreden bij het wijzigen van het object van $1 om $2 uur: dit object is gemarkeerd als "beschermd".
 Je hebt geen toegang tot dit object.',
-'revdelete-only-restricted'   => 'Er is een fout opgetreden bij het verbergen van het item van $1, $2: je kunt geen items onderdrukken uit het zicht van beheerders zonder ook een van de andere zichtbaarheidsopties te selecteren.',
+'revdelete-only-restricted' => 'Er is een fout opgetreden bij het verbergen van het item van $1, $2: je kunt geen items onderdrukken uit het zicht van beheerders zonder ook een van de andere zichtbaarheidsopties te selecteren.',
 
 # History merging
 'mergehistory-header' => 'Via deze pagina kun je versies van de geschiedenis van een bronpagina naar een nieuwere pagina samenvoegen.
 Zorg dat deze wijziging de geschiedenisdoorlopendheid van de pagina behoudt.',
 
 # Search results
-'searchsubtitle'        => 'Je zocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
+'searchsubtitle' => 'Je zocht naar \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|pagina\'s die beginnen met "$1"]] {{int:pipe-separator}}[[Special:WhatLinksHere/$1|pagina\'s die verwijzen naar "$1"]])',
 'searchsubtitleinvalid' => "Je hebt gezocht naar '''$1'''",
-'search-suggest'        => 'Bedoelde je: $1',
-'nonefound'             => "'''Opmerking''': standaard worden niet alle naamruimten doorzocht.
+'search-suggest' => 'Bedoelde je: $1',
+'nonefound' => "'''Opmerking''': standaard worden niet alle naamruimten doorzocht.
 Als je in uw zoekopdracht als voorvoegsel \"''all:''\" gebruikt worden alle pagina's doorzocht (inclusief overlegpagina's, sjablonen, enzovoort).
 Je kunt ook een naamruimte als voorvoegsel gebruiken.",
-'searchdisabled'        => 'Zoeken in {{SITENAME}} is niet mogelijk.
+'searchdisabled' => 'Zoeken in {{SITENAME}} is niet mogelijk.
 Je kunt gebruik maken van Google.
 De gegevens over {{SITENAME}} zijn mogelijk niet bijgewerkt.',
 
 # Preferences page
-'prefsnologintext'           => 'Je moet <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aangemeld]</span> zijn om je voorkeuren te kunnen instellen.',
+'prefsnologintext' => 'Je moet <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} aangemeld]</span> zijn om je voorkeuren te kunnen instellen.',
 'prefs-help-watchlist-token' => 'Door hier een geheime sleutel in te vullen wordt een RSS-feed voor je volglijst aangemaakt.
 Iedereen die deze sleutel kent kan je volglijst lezen, dus kies een veilige sleutel.
 Hier volgt een willekeurig gegenereerde waarde die je kunt gebruiken: $1',
-'savedprefs'                 => 'Je voorkeuren zijn opgeslagen.',
-'prefs-reset-intro'          => 'Gebruik deze functie om je voorkeuren te herstellen naar de standaardinstellingen.
+'savedprefs' => 'Je voorkeuren zijn opgeslagen.',
+'prefs-reset-intro' => 'Gebruik deze functie om je voorkeuren te herstellen naar de standaardinstellingen.
 Deze handeling kan niet ongedaan gemaakt worden.',
-'youremail'                  => 'Je e-mailadres:',
-'prefs-help-signature'       => 'Reacties op de overlegpagina\'s worden meestal ondertekend met "<nowiki>~~~~</nowiki>".
+'youremail' => 'Je e-mailadres:',
+'prefs-help-signature' => 'Reacties op de overlegpagina\'s worden meestal ondertekend met "<nowiki>~~~~</nowiki>".
 De tildes worden omgezet in je ondertekening en een datum en tijd van de bewerking.',
-'badsiglength'               => 'Uw ondertekening is te lang.
+'badsiglength' => 'Uw ondertekening is te lang.
 Deze moet minder dan $1 {{PLURAL:$1|karakters|karakters}} bevatten.',
-'prefs-help-realname'        => 'Echte naam is optioneel, als je deze opgeeft kan deze naam gebruikt worden om je erkenning te geven voor uw werk.',
-'prefs-help-email'           => 'E-mailadres is optioneel, maar maakt het mogelijk om je jouw wachtwoord te e-mailen als je het bent vergeten.
+'prefs-help-realname' => 'Echte naam is optioneel, als je deze opgeeft kan deze naam gebruikt worden om je erkenning te geven voor uw werk.',
+'prefs-help-email' => 'E-mailadres is optioneel, maar maakt het mogelijk om je jouw wachtwoord te e-mailen als je het bent vergeten.
 Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via een verwijzing op je gebruikers- en overlegpagina zonder dat u uw identiteit prijsgeeft.',
 
 # User rights
-'userrights-groups-help'      => 'Je kunt de groepen wijzigen waar deze gebruiker lid van is.
+'userrights-groups-help' => 'Je kunt de groepen wijzigen waar deze gebruiker lid van is.
 * Een aangekruist vakje betekent dat de gebruiker lid is van de groep.
 * Een niet aangekruist vakje betekent dat de gebruiker geen lid is van de groep.
 * Een "*" betekent dat je een gebruiker niet uit een groep kunt verwijderen nadat je die hebt toegevoegd of vice versa.',
-'userrights-no-interwiki'     => "Je hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
-'userrights-nologin'          => 'Je moet jezelf [[Special:UserLogin|aanmelden]] met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
-'userrights-notallowed'       => 'Je hebt geen rechten om gebruikersrechten toe te wijzen.',
-'userrights-changeable-col'   => 'Groepen die je kunt beheren',
+'userrights-no-interwiki' => "Je hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
+'userrights-nologin' => 'Je moet jezelf [[Special:UserLogin|aanmelden]] met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.',
+'userrights-notallowed' => 'Je hebt geen rechten om gebruikersrechten toe te wijzen.',
+'userrights-changeable-col' => 'Groepen die je kunt beheren',
 'userrights-unchangeable-col' => 'Groepen die je niet kunt beheren',
 
 # Recent changes linked
@@ -327,41 +326,41 @@ Je kunt ook anderen in staat stellen per e-mail contact met je op te nemen via e
 Pagina's die op [[Special:Watchlist|je volglijst]] staan worden '''vet''' weergegeven.",
 
 # Upload
-'uploadnologintext'           => 'Je moet [[Special:UserLogin|aangemeld]] zijn om bestanden te uploaden.',
-'empty-file'                  => 'Het bestand dat je probeerde te uploaden had geen inhoud.',
-'file-too-large'              => 'Het bestand dat je probeerde te uploaden was te groot.',
-'hookaborted'                 => 'De wijziging die je probeerde te maken is afgebroken door een uitbreidingshook.',
-'emptyfile'                   => 'Het bestand dat je hebt geüpload lijkt leeg te zijn.
+'uploadnologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn om bestanden te uploaden.',
+'empty-file' => 'Het bestand dat je probeerde te uploaden had geen inhoud.',
+'file-too-large' => 'Het bestand dat je probeerde te uploaden was te groot.',
+'hookaborted' => 'De wijziging die je probeerde te maken is afgebroken door een uitbreidingshook.',
+'emptyfile' => 'Het bestand dat je hebt geüpload lijkt leeg te zijn.
 Dit zou kunnen komen door een typefout in de bestandsnaam.
 Ga na of je dit bestand werkelijk bedoelde te uploaden.',
-'fileexists'                  => "Er bestaat al een bestand met deze naam.
-Controleer '''<tt>[[:$1]]</tt>''' als je niet zeker weet of je 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 je niet zeker weet of je 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 je hebt opgegeven zal niet op de beschrijvingspagina verschijnen.
-Bewerk de pagina handmatig om je beschrijving daar weer te geven. [[$1|miniatuur]]",
-'file-thumbnail-no'           => "De bestandsnaam begint met '''<tt>$1</tt>'''.
+Bewerk de pagina handmatig om je beschrijving daar weer te geven. [[$1|miniatuur]]',
+'file-thumbnail-no' => "De bestandsnaam begint met <strong>$1</strong>.
 Het lijkt een verkleinde afbeelding te zijn ''(miniatuurafbeelding)''.
 Als je deze afbeelding in volledige resolutie hebt, upload die afbeelding dan.
 Wijzig anders de bestandsnaam.",
-'fileexists-forbidden'        => 'Er bestaat al een bestand met deze naam, en dat kan niet overschreven worden.
+'fileexists-forbidden' => 'Er bestaat al een bestand met deze naam, en dat kan niet overschreven worden.
 Upload je bestand onder een andere naam.
 [[File:$1|thumb|center|$1]]',
 'fileexists-shared-forbidden' => 'Er bestaat al een bestand met deze naam bij de gedeelte bestanden.
 Als je het bestand alsnog wilt uploaden, ga dan terug en kies een andere naam.
 [[File:$1|thumb|center|$1]]',
-'file-deleted-duplicate'      => 'Een bestand dat identiek is aan dit bestand ([[:$1]]) is voorheen verwijderd.
+'file-deleted-duplicate' => 'Een bestand dat identiek is aan dit bestand ([[:$1]]) is voorheen verwijderd.
 Raadpleeg het verwijderingslogboek voordat je verder gaat.',
-'uploadfromurl-queued'        => 'Je upload is in de wachtrij geplaatst.',
-'filewasdeleted'              => 'Er is eerder een bestand met deze naam verwijderd.
+'uploadfromurl-queued' => 'Je upload is in de wachtrij geplaatst.',
+'filewasdeleted' => 'Er is eerder een bestand met deze naam verwijderd.
 Raadpleeg het $1 voordat je het opnieuw toevoegt.',
-'filename-bad-prefix'         => "De naam van het bestand dat je aan het uploaden bent begint met '''\"\$1\"''', wat een niet-beschrijvende naam is die meestal automatisch door een digitale camera wordt gegeven.
+'filename-bad-prefix' => "De naam van het bestand dat je aan het uploaden bent begint met '''\"\$1\"''', wat een niet-beschrijvende naam is die meestal automatisch door een digitale camera wordt gegeven.
 Kies een duidelijke naam voor je bestand.",
-'upload-success-msg'          => 'Je upload van [$2] is geslaagd en is beschikbaar: [[:{{ns:file}}:$1]]',
-'upload-failure-msg'          => 'Er was een probleem met je upload van [$2]:
+'upload-success-msg' => 'Je upload van [$2] is geslaagd en is beschikbaar: [[:{{ns:file}}:$1]]',
+'upload-failure-msg' => 'Er was een probleem met je upload van [$2]:
 
 $1',
-'upload-warning-msg'          => 'Er was een probleem met je upload van [$2].
+'upload-warning-msg' => 'Er was een probleem met je upload van [$2].
 Ga terug naar het [[Special:Upload/stash/$1|uploadformulier]] om dit probleem te verhelpen.',
 
 # img_auth script messages
@@ -370,7 +369,7 @@ Je server is niet ingesteld om deze informatie door te geven.
 Misschien gebruikt deze CGI, en dan wordt img_auth niet ondersteund.
 Zie https://www.mediawiki.org/wiki/Manual:Image_Authorization voor meer informatie.',
 'img-auth-nologinnWL' => 'Je bent niet aangemeld en "$1" staat niet op de witte lijst.',
-'img-auth-isdir'      => 'Je probeert de map "$1" te benaderen.
+'img-auth-isdir' => 'Je probeert de map "$1" te benaderen.
 Alleen toegang tot bestanden is toegestaan.',
 
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
@@ -387,12 +386,12 @@ Je kunt het misschien proberen als het minder druk is.',
 'filerevert-intro' => "Je bent '''[[Media:$1|$1]]''' aan het terugdraaien tot de [$4 versie op $2, $3].",
 
 # File deletion
-'filedelete-intro'     => "Je staat op het punt om het bestand '''[[Media:$1|$1]]''' te verwijderen, inclusief alle eerdere versies.",
+'filedelete-intro' => "Je staat op het punt om het bestand '''[[Media:$1|$1]]''' te verwijderen, inclusief alle eerdere versies.",
 'filedelete-intro-old' => "Je bent de versie van '''[[Media:$1|$1]]''' van [$4 $3, $2] aan het verwijderen.",
 
 # Miscellaneous special pages
 'notargettext' => 'Je hebt niet opgegeven voor welke pagina of gebruiker u deze handeling wilt uitvoeren.',
-'nopagetext'   => 'De pagina die je wilt hernoemen bestaat niet.',
+'nopagetext' => 'De pagina die je wilt hernoemen bestaat niet.',
 
 # Book sources
 'booksources-text' => 'Hieronder staat een lijst met koppelingen naar andere websites die nieuwe of gebruikte boeken verkopen, en die wellicht meer informatie over het boek dat je zoekt hebben:',
@@ -402,28 +401,28 @@ Je kunt het misschien proberen als het minder druk is.',
 Je kunt ook kiezen voor specifieke logboeken en filteren op gebruiker (hoofdlettergevoelig) en paginanaam (hoofdlettergevoelig).',
 
 # E-mail user
-'mailnologintext'      => 'Je moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in je [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
-'emailpagetext'        => 'Via dit formulier kun je een e-mail aan deze gebruiker verzenden.
+'mailnologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn en een geldig e-mailadres in je [[Special:Preferences|voorkeuren]] vermelden om andere gebruikers te kunnen e-mailen.',
+'emailpagetext' => 'Via dit formulier kun je een e-mail aan deze gebruiker verzenden.
 Het e-mailadres dat je hebt opgegeven bij [[Special:Preferences|je voorkeuren]] wordt als afzender gebruikt.
 De ontvanger kan dus direct naar je reageren.',
 'usermaildisabledtext' => 'Je kunt geen e-mail verzenden naar andere gebruikers op deze wiki',
-'emailccsubject'       => 'Kopie van je bericht aan $1: $2',
-'emailsenttext'        => 'Je e-mail is verzonden.',
+'emailccsubject' => 'Kopie van je bericht aan $1: $2',
+'emailsenttext' => 'Je e-mail is verzonden.',
 
 # Watchlist
-'nowatchlist'          => 'Je volglijst is leeg.',
-'watchlistanontext'    => 'Om je volglijst te bekijken of te bewerken moet je je $1.',
-'watchnologintext'     => 'Je dient [[Special:UserLogin|aangemeld]] te zijn om je volglijst te bewerken.',
-'addedwatchtext'       => "De pagina \"[[:\$1]]\" is toegevoegd aan je [[Special:Watchlist|volglijst]].
+'nowatchlist' => 'Je volglijst is leeg.',
+'watchlistanontext' => 'Om je volglijst te bekijken of te bewerken moet je je $1.',
+'watchnologintext' => 'Je dient [[Special:UserLogin|aangemeld]] te zijn om je volglijst te bewerken.',
+'addedwatchtext' => "De pagina \"[[:\$1]]\" is toegevoegd aan je [[Special:Watchlist|volglijst]].
 Toekomstige bewerkingen van deze pagina en de bijbehorende overlegpagina worden op [[Special:Watchlist|je volglijst]] vermeld en worden '''vet''' weergegeven in de [[Special:RecentChanges|lijst van recente wijzigingen]].",
-'removedwatchtext'     => 'De pagina "[[:$1]]" is van [[Special:Watchlist|je volglijst]] verwijderd.',
-'watchnochange'        => "Geen van de pagina's op je volglijst is in deze periode bewerkt.",
-'watchlist-details'    => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op je volglijst, exclusief overlegpagina's.",
+'removedwatchtext' => 'De pagina "[[:$1]]" is van [[Special:Watchlist|je volglijst]] verwijderd.',
+'watchnochange' => "Geen van de pagina's op je volglijst is in deze periode bewerkt.",
+'watchlist-details' => "Er {{PLURAL:$1|staat één pagina|staan $1 pagina's}} op je volglijst, exclusief overlegpagina's.",
 'wlheader-showupdated' => "* Pagina's die zijn bewerkt sinds je laatste bezoek worden '''vet''' weergegeven",
-'watchlistcontains'    => "Er {{PLURAL:$1|staat 1 pagina|staan $1 pagina's}} op je volglijst.",
+'watchlistcontains' => "Er {{PLURAL:$1|staat 1 pagina|staan $1 pagina's}} op je volglijst.",
 
 'enotif_lastvisited' => 'Zie $1 voor alle wijzigingen sinds je laatste bezoek.',
-'enotif_body'        => 'Beste $WATCHINGUSERNAME,
+'enotif_body' => 'Beste $WATCHINGUSERNAME,
 
 De pagina $PAGETITLE op {{SITENAME}} is $CHANGEDORCREATED op $PAGEEDITDATE door $PAGEEDITOR, zie $PAGETITLE_URL voor de huidige versie.
 
@@ -450,7 +449,7 @@ Feedback en andere assistentie:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
-'historywarning'    => "'''Waarschuwing:''' de pagina die je wilt verwijderen heeft ongeveer $1 {{PLURAL:$1|versie|versies}}:",
+'historywarning' => "'''Waarschuwing:''' de pagina die je wilt verwijderen heeft ongeveer $1 {{PLURAL:$1|versie|versies}}:",
 'confirmdeletetext' => 'Je staat op het punt een pagina te verwijderen, inclusief de geschiedenis.
 Bevestig hieronder dat dit inderdaad je bedoeling is, dat je de gevolgen begrijpt en dat de verwijdering overeenstemt met het [[{{MediaWiki:Policy-url}}|beleid]].',
 
@@ -460,47 +459,47 @@ Je handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat u
 Ga een pagina terug, laad die pagina opnieuw en probeer het nog eens.',
 
 # Protect
-'protect-text'           => "Hier kun je het beveiligingsniveau voor de pagina '''$1''' bekijken en wijzigen.",
+'protect-text' => "Hier kun je het beveiligingsniveau voor de pagina '''$1''' bekijken en wijzigen.",
 'protect-locked-blocked' => "Je kunt het beveiligingsniveau niet wijzigen terwijl je geblokkeerd bent.
 Hier zijn de huidige instellingen voor de pagina '''$1''':",
-'protect-locked-access'  => "Je hebt geen rechten om het beveiligingsniveau te wijzigen.
+'protect-locked-access' => "Je hebt geen rechten om het beveiligingsniveau te wijzigen.
 Dit zijn de huidige instellingen voor de pagina '''$1''':",
-'protect-cantedit'       => 'Je kunt het beveiligingsniveau van deze pagina niet wijzigen, omdat je geen rechten hebt om het te bewerken.',
+'protect-cantedit' => 'Je kunt het beveiligingsniveau van deze pagina niet wijzigen, omdat je geen rechten hebt om het te bewerken.',
 
 # Undelete
-'undeletehistory'            => 'Als je een pagina terugplaatst, worden alle versies hersteld.
+'undeletehistory' => 'Als je een pagina terugplaatst, worden alle versies hersteld.
 Als er al een nieuwe pagina met dezelfde naam is aangemaakt sinds de pagina is verwijderd, worden de eerder verwijderde versies teruggeplaatst en blijft de huidige versie intact.',
-'undeleterevision-missing'   => 'Ongeldige of missende versie.
+'undeleterevision-missing' => 'Ongeldige of missende versie.
 Mogelijk heb je een verkeerde verwijzing of is de versie hersteld of verwijderd uit het archief.',
 'undelete-show-file-confirm' => 'Weet je zeker dat je een verwijderde versie van het bestand "<nowiki>$1</nowiki>" van $2 om $3 wil bekijken?',
 
 # Block/unblock
-'ipb-needreblock'             => '$1 is al geblokkeerd.
+'ipb-needreblock' => '$1 is al geblokkeerd.
 Wil je de instellingen wijzigen?',
-'proxyblockreason'            => 'Dit is een automatische preventieve blokkade, omdat je gebruik maakt van een open proxyserver.
+'proxyblockreason' => 'Dit is een automatische preventieve blokkade, omdat je gebruik maakt van een open proxyserver.
 Neem contact op met je Internet-provider of je helpdesk en stel die op de hoogte van dit ernstige beveiligingsprobleem.',
-'sorbsreason'                 => 'Je IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.',
+'sorbsreason' => 'Je IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.',
 'sorbs_create_account_reason' => 'Je IP-adres staat bekend als open proxyserver in de DNS-blacklist die {{SITENAME}} gebruikt.
 Je kunt geen gebruiker registreren.',
-'cant-block-while-blocked'    => 'Je kunt andere gebruikers niet blokkeren terwijl je zelf geblokkeerd bent.',
-'cant-see-hidden-user'        => "De gebruiker die je probeert te blokken is al geblokkeerd en verborgen.
+'cant-block-while-blocked' => 'Je kunt andere gebruikers niet blokkeren terwijl je zelf geblokkeerd bent.',
+'cant-see-hidden-user' => "De gebruiker die je probeert te blokken is al geblokkeerd en verborgen.
 Omdat je het recht 'hideuser' niet hebt, kun je de blokkade van de gebruiker niet bekijken of bewerken.",
-'ipbblocked'                  => 'Je kunt geen andere gebruikers (de)blokkeren, omdat je zelf geblokkeerd bent',
-'ipbnounblockself'            => 'Je mag jezelf niet deblokkeren',
+'ipbblocked' => 'Je kunt geen andere gebruikers (de)blokkeren, omdat je zelf geblokkeerd bent',
+'ipbnounblockself' => 'Je mag jezelf niet deblokkeren',
 
 # Developer tools
-'lockdbtext'        => "Waarschuwing: de database blokkeren heeft tot gevolg dat geen enkele gebruiker meer in staat is pagina's te bewerken, voorkeuren te wijzigen of iets anders te doen waarvoor wijzigingen in de database nodig zijn.
+'lockdbtext' => "Waarschuwing: de database blokkeren heeft tot gevolg dat geen enkele gebruiker meer in staat is pagina's te bewerken, voorkeuren te wijzigen of iets anders te doen waarvoor wijzigingen in de database nodig zijn.
 
 Bevestig dat je deze handeling wilt uitvoeren en dat je de database vrijgeeft nadat het onderhoud is uitgevoerd.",
-'unlockdbtext'      => "Na het vrijgeven van de database kunnen gebruikers weer pagina's bewerken, hun voorkeuren wijzigen of iets anders te doen waarvoor er wijzigingen in de database nodig zijn.
+'unlockdbtext' => "Na het vrijgeven van de database kunnen gebruikers weer pagina's bewerken, hun voorkeuren wijzigen of iets anders te doen waarvoor er wijzigingen in de database nodig zijn.
 
 Bevestig dat je deze handeling wil uitvoeren.",
-'locknoconfirm'     => 'Je hebt je keuze niet bevestigd via het vinkvakje.',
+'locknoconfirm' => 'Je hebt je keuze niet bevestigd via het vinkvakje.',
 'lockdbsuccesstext' => 'De database is afgesloten.<br />
 Vergeet niet de [[Special:UnlockDB|database vrij te geven]] zodra je klaar bent met je onderhoud.',
 
 # Move page
-'movepagetext'            => "Door middel van het onderstaande formulier kun je een pagina hernoemen.
+'movepagetext' => "Door middel van het onderstaande formulier kun je een pagina hernoemen.
 De geschiedenis gaat mee naar de nieuwe pagina.
 * De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.
 * Verwijzingen naar de oude pagina worden niet aangepast.
@@ -512,18 +511,18 @@ Een pagina kan '''alleen''' hernoemd worden als de nieuwe paginanaam niet bestaa
 '''WAARSCHUWING!'''
 Voor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.
 Zorg ervoor dat je die gevolgen overziet voordat je deze handeling uitvoert.",
-'movepagetalktext'        => "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':
+'movepagetalktext' => "De bijbehorende overlegpagina krijgt automatisch een andere naam, '''tenzij''':
 * De overlegpagina onder de nieuwe naam al bestaat;
 * Je het onderstaande vinkje deselecteert.",
-'moveuserpage-warning'    => "'''Waarschuwing:''' Je gaat een gebruikerspagina hernoemen.
+'moveuserpage-warning' => "'''Waarschuwing:''' Je gaat een gebruikerspagina hernoemen.
 Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
-'movenologintext'         => 'Je moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.',
-'movenotallowed'          => "Je hebt geen rechten om pagina's te hernoemen.",
-'movenotallowedfile'      => 'Je hebt geen rechten om bestanden te hernoemen.',
-'cant-move-user-page'     => "Je hebt geen rechten om gebruikerspagina's te hernoemen (met uitzondering van subpagina's).",
-'cant-move-to-user-page'  => 'Je hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk.',
+'movenologintext' => 'Je moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.',
+'movenotallowed' => "Je hebt geen rechten om pagina's te hernoemen.",
+'movenotallowedfile' => 'Je hebt geen rechten om bestanden te hernoemen.',
+'cant-move-user-page' => "Je hebt geen rechten om gebruikerspagina's te hernoemen (met uitzondering van subpagina's).",
+'cant-move-to-user-page' => 'Je hebt geen rechten om een pagina naar een gebruikerspagina te hernoemen. Hernoemen naar een subpagina is wel mogelijk.',
 'cantmove-titleprotected' => 'Je kunt geen pagina naar deze paginaam hernoemen, omdat deze paginanaam beveiligd is tegen het aanmaken ervan.',
-'delete_and_move_text'    => '==Verwijdering nodig==
+'delete_and_move_text' => '==Verwijdering nodig==
 Onder de naam "[[:$1]]" bestaat al een pagina.
 Wil je deze verwijderen om plaats te maken voor de te hernoemen pagina?',
 
@@ -543,20 +542,20 @@ Ga naar [//www.mediawiki.org/wiki/Localisation MediaWiki-lokalisatie] en [//tran
 'importtext' => 'Gebruik de [[Special:Export|exportfunctie]] in de wiki waar de informatie vandaan komt, sla de uitvoer op je eigen systeem op, en voeg die daarna hier toe.',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'      => 'Jouw gebruikerspagina',
-'tooltip-pt-anonuserpage'  => 'Gebruikerspagina voor je IP-adres',
-'tooltip-pt-mytalk'        => 'Jouw overlegpagina',
-'tooltip-pt-watchlist'     => "Overzicht van pagina's die je volgt",
-'tooltip-pt-mycontris'     => 'Overzicht van je bijdragen',
-'tooltip-pt-login'         => 'Je wordt van harte uitgenodigd om je aan te melden als gebruiker, maar dit is niet verplicht',
-'tooltip-pt-anonlogin'     => 'Je wordt van harte uitgenodigd om je aan te melden als gebruiker, maar dit is niet verplicht',
-'tooltip-ca-edit'          => 'Je kunt deze pagina bewerken.
+'tooltip-pt-userpage' => 'Jouw gebruikerspagina',
+'tooltip-pt-anonuserpage' => 'Gebruikerspagina voor je IP-adres',
+'tooltip-pt-mytalk' => 'Jouw overlegpagina',
+'tooltip-pt-watchlist' => "Overzicht van pagina's die je volgt",
+'tooltip-pt-mycontris' => 'Overzicht van je bijdragen',
+'tooltip-pt-login' => 'Je wordt van harte uitgenodigd om je aan te melden als gebruiker, maar dit is niet verplicht',
+'tooltip-pt-anonlogin' => 'Je wordt van harte uitgenodigd om je aan te melden als gebruiker, maar dit is niet verplicht',
+'tooltip-ca-edit' => 'Je kunt deze pagina bewerken.
 Gebruik de voorbeeldweergaveknop alvorens te bewaren.',
-'tooltip-ca-viewsource'    => 'Deze pagina is beveiligd.
+'tooltip-ca-viewsource' => 'Deze pagina is beveiligd.
 Je kunt wel de broncode bekijken.',
 'tooltip-ca-nstab-special' => 'Dit is een speciale pagina, je kunt de pagina zelf niet bewerken',
-'tooltip-save'             => 'Je wijzigingen opslaan',
-'tooltip-watch'            => 'Deze pagina aan je volglijst toevoegen',
+'tooltip-save' => 'Je wijzigingen opslaan',
+'tooltip-watch' => 'Deze pagina aan je volglijst toevoegen',
 
 # Metadata
 'notacceptable' => 'De wikiserver kan de gegevens niet leveren in een vorm die je browser kan lezen.',
@@ -572,25 +571,25 @@ Meestal wordt dit door een externe verwijzing op een zwarte lijst veroorzaakt.',
 'mediawarning' => "'''Waarschuwing''': dit bestandstype bevat mogelijk programmacode die je systeem schade kan berokkenen.",
 
 # E-mail address confirmation
-'confirmemail_noemail'      => 'Je hebt geen geldig e-mailadres ingegeven in je [[Special:Preferences|gebruikersvoorkeuren]].',
-'confirmemail_text'         => '{{SITENAME}} eist bevestiging van je e-mailadres voordat je de e-mailmogelijkheden kunt gebruiken.
+'confirmemail_noemail' => 'Je hebt geen geldig e-mailadres ingegeven in je [[Special:Preferences|gebruikersvoorkeuren]].',
+'confirmemail_text' => '{{SITENAME}} eist bevestiging van je e-mailadres voordat je de e-mailmogelijkheden kunt gebruiken.
 Klik op de onderstaande knop om een bevestigingsbericht te ontvangen.
 Dit bericht bevat een verwijzing met een code.
 Open die verwijzing om je e-mailadres te bevestigen.',
-'confirmemail_pending'      => 'Er is al een bevestigingsbericht aan je verzonden.
+'confirmemail_pending' => 'Er is al een bevestigingsbericht aan je verzonden.
 Als je recentelijk je gebruiker hebt aangemaakt, wacht dan een paar minuten totdat die aankomt voordat je opnieuw een e-mail laat sturen.',
-'confirmemail_oncreate'     => 'Er is een bevestigingscode naar je e-mailadres verzonden.
+'confirmemail_oncreate' => 'Er is een bevestigingscode naar je e-mailadres verzonden.
 Deze code is niet nodig om je aan te melden, maar je dient deze wel te bevestigen voordat je de e-mailmogelijkheden van deze wiki kunt gebruiken.',
-'confirmemail_sendfailed'   => '{{SITENAME}} kon je bevestigingscode niet verzenden.
+'confirmemail_sendfailed' => '{{SITENAME}} kon je bevestigingscode niet verzenden.
 Controleer je e-mailadres op ongeldige tekens.
 
 Het e-mailprogramma meldde: $1',
-'confirmemail_needlogin'    => 'Je moet $1 om je e-mailadres te bevestigen.',
-'confirmemail_success'      => 'Je e-mailadres is bevestigd.
+'confirmemail_needlogin' => 'Je moet $1 om je e-mailadres te bevestigen.',
+'confirmemail_success' => 'Je e-mailadres is bevestigd.
 Je kunt jezelf nu [[Special:UserLogin|aanmelden]] en {{SITENAME}} gebruiken.',
-'confirmemail_loggedin'     => 'Je e-mailadres is nu bevestigd.',
-'confirmemail_error'        => 'Er is iets verkeerd gegaan tijdens het opslaan van je bevestiging.',
-'confirmemail_body'         => 'Iemand, waarschijnlijk jijzelf, met het IP-adres $1,
+'confirmemail_loggedin' => 'Je e-mailadres is nu bevestigd.',
+'confirmemail_error' => 'Er is iets verkeerd gegaan tijdens het opslaan van je bevestiging.',
+'confirmemail_body' => 'Iemand, waarschijnlijk jijzelf, met het IP-adres $1,
 heeft zich met dit e-mailadres geregistreerd als gebruiker "$2" op {{SITENAME}}.
 
 Open de volgende verwijzing in je webbrowser om te bevestigen dat je deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:
@@ -617,23 +616,23 @@ De bevestigingscode vervalt op $4.',
 
 # Delete conflict
 'deletedwhileediting' => "'''Let op''': deze pagina is verwijderd terwijl je bezig was met je bewerking!",
-'confirmrecreate'     => "Nadat je begonnen bent met je wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd met opgave van de volgende reden:
+'confirmrecreate' => "Nadat je begonnen bent met je wijziging heeft [[User:$1|$1]] ([[User talk:$1|overleg]]) deze pagina verwijderd met opgave van de volgende reden:
 : ''$2''
 Bevestig dat je de pagina opnieuw wilt aanmaken.",
 
 # Watchlist editor
-'watchlistedit-numitems'       => 'Je volglijst bevat {{PLURAL:$1|1 pagina|$1 pagina’s}}, zonder overlegpagina’s.',
-'watchlistedit-noitems'        => 'Je volglijst bevat geen pagina’s.',
+'watchlistedit-numitems' => 'Je volglijst bevat {{PLURAL:$1|1 pagina|$1 pagina’s}}, zonder overlegpagina’s.',
+'watchlistedit-noitems' => 'Je volglijst bevat geen pagina’s.',
 'watchlistedit-normal-explain' => 'Hieronder worden de pagina’s op je volglijst weergegeven.
 Klik op het vierkantje ernaast en daarna op "{{int:Watchlistedit-normal-submit}}" om een pagina te verwijderen.
 Je kunt ook de [[Special:EditWatchlist/raw|ruwe lijst bewerken]].',
-'watchlistedit-normal-done'    => 'Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina’s}} verwijderd van je volglijst:',
-'watchlistedit-raw-explain'    => 'Hieronder staan pagina’s op je volglijst.
+'watchlistedit-normal-done' => 'Er {{PLURAL:$1|is 1 pagina|zijn $1 pagina’s}} verwijderd van je volglijst:',
+'watchlistedit-raw-explain' => 'Hieronder staan pagina’s op je volglijst.
 Je kunt de lijst bewerken door pagina’s te verwijderen en toe te voegen.
 Eén pagina per regel.
 Als je klaar bent, klik dan op "{{int:Watchlistedit-raw-submit}}".
 Je kunt ook [[Special:EditWatchlist|het standaard bewerkingsscherm gebruiken]].',
-'watchlistedit-raw-done'       => 'Jr volglijst is bijgewerkt.',
+'watchlistedit-raw-done' => 'Jr volglijst is bijgewerkt.',
 
 # Special:Version
 'version-license-info' => 'MediaWiki is vrije software; je kunt MediaWiki verspreiden en/of aanpassen onder de voorwaarden van de GNU General Public License zoals gepubliceerd door de Free Software Foundation; ofwel versie 2 van de Licentie, of - zo je wilt - enige latere versie.
index 3ba98e8..ad59e1e 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Norwegian Nynorsk (‪norsk (nynorsk)‬)
+/** Norwegian Nynorsk (norsk (nynorsk)‎)
  *
  * 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 Boivie
+ * @author Cocu
  * @author Dittaeva
  * @author Diupwijk
  * @author Eirik
@@ -18,6 +19,7 @@
  * @author Guttorm Flatabø
  * @author H92
  * @author Harald Khan
+ * @author Jeblad
  * @author Jon Harald Søby
  * @author Jorunn
  * @author Kaganer
@@ -360,7 +362,7 @@ $messages = array(
 
 'underline-always' => 'Alltid',
 'underline-never' => 'Aldri',
-'underline-default' => 'Nettlesarstandard',
+'underline-default' => 'Drakt- eller nettlesarstandard',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Endre stilen for skrifttypen i området:',
@@ -448,7 +450,7 @@ $messages = array(
 'cancel' => 'Avbryt',
 'moredotdotdot' => 'Meir …',
 'mypage' => 'Sida mi',
-'mytalk' => 'Diskusjonssida mi',
+'mytalk' => 'Diskusjon',
 'anontalk' => 'Diskusjonside for denne IP-adressa',
 'navigation' => 'Navigering',
 'and' => '&#32;og',
@@ -458,7 +460,6 @@ $messages = array(
 'qbbrowse' => 'Bla gjennom',
 'qbedit' => 'Endre',
 'qbpageoptions' => 'Denne sida',
-'qbpageinfo' => 'Samanheng',
 'qbmyoptions' => 'Sidene mine',
 'qbspecialpages' => 'Spesialsider',
 'faq' => 'OSS',
@@ -471,7 +472,7 @@ $messages = array(
 'vector-action-protect' => 'Vern',
 'vector-action-undelete' => 'Gjenopprett',
 'vector-action-unprotect' => 'Endra vern',
-'vector-simplesearch-preference' => 'Slå på betra søkjeframlegg (einast i Vector-drakta)',
+'vector-simplesearch-preference' => 'Slå på forenkla søkjefelt (berre for Vector-drakta)',
 'vector-view-create' => 'Opprett',
 'vector-view-edit' => 'Endre',
 'vector-view-history' => 'Sjå historikken',
@@ -481,6 +482,7 @@ $messages = array(
 'namespaces' => 'Namnerom',
 'variants' => 'Variantar',
 
+'navigation-heading' => 'Navigasjonsmeny',
 'errorpagetitle' => 'Feil',
 'returnto' => 'Attende til $1.',
 'tagline' => 'Frå {{SITENAME}}',
@@ -577,7 +579,7 @@ $1',
 'youhavenewmessages' => 'Du har $1 ($2).',
 'newmessageslink' => 'nye meldingar',
 'newmessagesdifflink' => 'sjå skilnad',
-'youhavenewmessagesfromusers' => 'Du har $1 frå {{PLURAL:$3|ein annan bruker| $3 brukarar}} ($2).',
+'youhavenewmessagesfromusers' => 'Du har $1 frå {{PLURAL:$3|ein annan brukar| $3 brukarar}} ($2).',
 'youhavenewmessagesmanyusers' => 'Du har $1 frå mange brukarar ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|ei ny melding|nye meldingar}}',
 'newmessagesdifflinkplural' => 'siste {{PLURAL:$1|endringa|endringane}}',
@@ -677,7 +679,7 @@ Funksjonen oppgav inga årsak.',
 'viewsource-title' => 'Sjå kjelda til $1',
 'actionthrottled' => 'Handlinga vart stoppa',
 'actionthrottledtext' => 'For å hindre spamming kan du ikkje utføre denne handlinga for mange gonger på kort tid. Ver venleg og prøv igjen litt seinare.',
-'protectedpagetext' => 'Denne sida er verna for å hindre endring.',
+'protectedpagetext' => 'Sida har vorte verna for å hindra endring eller andre handlingar.',
 'viewsourcetext' => 'Du kan sjå og kopiere kjeldekoden til denne sida:',
 'viewyourtext' => "Du kan sjå og kopiera kjelda til '''endringane dine''' på sida:",
 'protectedinterface' => 'Denne sida inneheld tekst nytta av brukargrensesnittet for programvara på wikien, og er låst for å hindra hærverk.
@@ -710,11 +712,11 @@ Administratoren som låste filsamlinga oppgav den fylgjande årsaka: «$3».',
 # Login and logout pages
 'logouttext' => "'''Du er no utlogga.'''
 
-Du kan no halde fram å bruke {{SITENAME}} anonymt, eller du kan [[Special:UserLogin|logge inn att]]  med same kontoen eller ein annan brukar kan logge inn.
+Du kan no halde fram å bruke {{SITENAME}} anonymt, eller du kan <span class='plainlinks'>[$1 logge inn att]</span>  med same kontoen eller ein annan brukar kan logge inn.
 Ver merksam på at nokre sider framleis kan visast fram som om du er innlogga fram til du slettar mellomlageret til nettlesaren din.",
-'welcomecreation' => '== Hjarteleg velkommen til {{SITENAME}}, $1! ==
-Brukarkontoen din er oppretta.
-Hugs at du kan endre på [[Special:Preferences|innstillingane]] dine.',
+'welcomeuser' => 'Velkomen, $1!',
+'welcomecreation-msg' => 'Brukarkontoen din er oppretta.
+Gløym ikkje å endra [[Special:Preferences|innstillingane dine for {{SITENAME}}]].',
 'yourname' => 'Brukarnamn:',
 'yourpassword' => 'Passord:',
 'yourpasswordagain' => 'Skriv opp att passordet',
@@ -936,11 +938,9 @@ Han kan ha vorten flytta eller sletta medan du såg på sida.',
 
 Passordet for den nye kontoen kan verta endra på ''[[Special:ChangePassword|endra passord]]''-sida etter innlogging.",
 'newarticle' => '(Ny)',
-'newarticletext' => "'''{{SITENAME}} har ikkje noka side med namnet {{PAGENAME}} enno.'''
-* For å opprette ei slik side kan du skrive i boksen under og klikke på «Lagre». Endringane vil vere synlege med det same.
-* Om du er ny her er det tilrådd å sjå på [[{{MediaWiki:Helppage}}|hjelpesida]] først.
-* Om du lagrar ei testside, vil du ikkje kunne slette henne sjølv.
-* Dersom du ikkje ønskjer å endre sida, kan du utan risiko klikke på '''attende'''-knappen i nettlesaren din.",
+'newarticletext' => "Du har følgt ei lenkje til ei side som ikkje finst enno.
+For å opprette sida, kan du skrive i boksen under (sjå [[{{MediaWiki:Helppage}}|hjelpesida]] for meir informasjon).
+Hamna du her ved ein feil, klikk på '''attende'''-knappen i nettlesaren din.",
 'anontalkpagetext' => "----''Dette er ei diskusjonsside for ein anonym brukar som ikkje har oppretta konto eller ikkje har logga inn.
 Vi er difor nøydde til å bruke den numeriske IP-adressa til å identifisere brukaren. Same IP-adresse kan vere knytt til fleire brukarar. Om du er ein anonym brukar og meiner at du har fått irrelevante kommentarar på ei slik side, [[Special:UserLogin/signup|opprett ein brukarkonto]] eller [[Special:UserLogin|logg inn]] slik at vi unngår framtidige forvekslingar med andre anonyme brukarar.''",
 'noarticletext' => 'Det er nett no ikkje noko tekst på denne sida.
@@ -961,7 +961,6 @@ Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
 * '''Firefox og Safari:''' Haldt nede ''Shift'' medan du klikkar på ''Oppdater'', eller trykk anten ''Ctrl-F5'' eller ''Ctrl-R'' (''⌘-R'' på Mac)
 * '''Google Chrome:''' Trykk ''Ctrl-Shift-R'' (''⌘-Shift-R'' på Mac)
 * '''Internet Explorer:''' Haldt nede ''Ctrl'' medan du klikkar ''Oppdater'', eller trykk ''Ctrl-F5.''
-* '''Konqueror:''' Klikk ''Oppdater'' eller trykk ''F5''. 
 * '''Opera:''' Tøm mellomlageret i ''Verktøy → Innstillingar''.",
 'usercssyoucanpreview' => "'''Tips:''' Bruk «{{int:showpreview}}»-knappen for å teste den nye CSS- eller JavaScript-koden din før du lagrar.",
 'userjsyoucanpreview' => "''Tips:''' Bruk «{{int:showpreview}}»-knappen for å teste den nye CSS- eller JavaScript-koden din før du lagrar.",
@@ -976,7 +975,7 @@ Det siste elementet i blokkeringsloggen er oppgjeve nedanfor:',
 'note' => "'''Merk:'''",
 'previewnote' => "'''Hugsa at dette berre er ei førehandsvising.'''
 Endringane dine er ikkje lagra enno!",
-'continue-editing' => 'Endra vidare',
+'continue-editing' => 'Gå til endringsområdet',
 'previewconflict' => 'Dette er ei førehandsvising av teksten i endringsboksen over, slik han vil sjå ut om du lagrar han',
 'session_fail_preview' => "'''Orsak! Endringa di kunne ikkje lagrast. Ver venleg og prøv ein gong til. Dersom det framleis ikkje går, prøv å logge deg ut og inn att.'''",
 'session_fail_preview_html' => "'''Beklagar! Endringa di kunne ikkje lagrast.'''
@@ -1017,14 +1016,14 @@ Teksten må du ha skrive sjølv eller ha kopiert frå ein ressurs som er kompati
 Systemadministratoren som låste databasen gav følgjande årsak: $1",
 'protectedpagewarning' => "'''ÅTVARING: Denne sida er verna, slik at berre administratorar kan endra henne.'''
 Det siste loggelementet er oppgjeve under som referanse:",
-'semiprotectedpagewarning' => "'''Merk:''' Denne sida er verna slik at berre registrerte brukarar kan endra henne.
+'semiprotectedpagewarning' => "'''Merk:''' Denne sida er verna slik at berre registrerte brukarar kan endre henne.
 Det siste loggelementet er oppgjeve under som referanse:",
 'cascadeprotectedwarning' => "'''Åtvaring:''' Denne sida er verna så berre brukarar med administratortilgang kan endre henne. Dette er fordi ho er inkludert i {{PLURAL:$1|denne djupverna sida|desse djupverna sidene}}:",
 'titleprotectedwarning' => "'''Åtvaring: Denne sida er verna, så berre [[Special:ListGroupRights|nokre brukarar]] kan opprette henne.'''
 Det siste loggelementet er oppgjeve under som referanse:",
 'templatesused' => '{{PLURAL:$1|Mal|Malar}} som er brukte på denne sida:',
 'templatesusedpreview' => '{{PLURAL:$1|Mal som er brukt|Malar som er brukte}} i førehandsvisinga:',
-'templatesusedsection' => '{{PLURAL:$1|Mal|Malar}} som er brukte i denne bolken:',
+'templatesusedsection' => '{{PLURAL:$1|Mal som er brukt|Malar som er brukte}} i denne bolken:',
 'template-protected' => '(verna)',
 'template-semiprotected' => '(delvis verna)',
 'hiddencategories' => 'Denne sida er med i {{PLURAL:$1|éin gøymd kategori|$1 gøymde kategoriar}}:',
@@ -1042,7 +1041,7 @@ Du kan gå attende og endre ei eksisterande side, [[Special:UserLogin|logge inn
 
 Du bør tenkje over om det er høveleg å halde fram med å endre denne sida.
 Sletteloggen for sida finn du her:",
-'moveddeleted-notice' => 'Denne sida er vorten sletta. Sletteloggen og flytteloggen er vist nedanfor for referanse.',
+'moveddeleted-notice' => 'Sida er vorten sletta. Sletteloggen og flytteloggen er viste nedanfor for referanse.',
 'log-fulllog' => 'Sjå full loggføring',
 'edit-hook-aborted' => 'Endring avbroten av ein funksjon, utan forklaring.',
 'edit-gone-missing' => 'Kunne ikkje oppdatere sida.
@@ -1051,6 +1050,15 @@ Det ser ut til at ho er sletta.',
 'edit-no-change' => 'Redigeringa di vart ignorert fordi det ikkje vart gjort endringar i teksten.',
 'edit-already-exists' => 'Kunne ikkje opprette ny side fordi ho alt eksisterer.',
 'defaultmessagetext' => 'Standard meldingstekst',
+'content-failed-to-parse' => 'Klarte ikkje å tolke innhaldet «$2» for innhaldsmodellen «$1»: $3',
+'invalid-content-data' => 'Ugyldig innhald',
+'content-not-allowed-here' => 'Innhaldsmodellen «$1» er ikkje tillaten på sida [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'WikiTekst',
+'content-model-text' => 'Rein tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Åtvaring: Denne sida inneheld for mange prosesskrevande parserfunksjonar.
@@ -1202,9 +1210,10 @@ Du har ikkje tilgang til henne.',
 Sjekk gjerne loggføringa.',
 'revdelete-only-restricted' => 'Feil under gøyming av objektet datert $2 $1: du kan ikkje gøyma objekt for administratorar utan å i tillegg velja eit av dei andre visingsvala.',
 'revdelete-reason-dropdown' => '*Vanlege grunnar til sletting
-** Brot på opphavsrettar
-** Ikkje høveleg personleg informasjon
-** Mogleg falskt sladder',
+** Brot på opphavsrett
+** Kommentar eller personleg informasjon som ikkje høver seg
+** Brukarnamn som ikkje høver seg
+** Mogeleg falskt sladder',
 'revdelete-otherreason' => 'Anna årsak, eller tilleggsårsak:',
 'revdelete-reasonotherlist' => 'Annan grunn',
 'revdelete-edit-reasonlist' => 'Endre grunnar til sletting',
@@ -1246,7 +1255,7 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
 
 # Diffs
 'history-title' => '$1: Versjonshistorikk',
-'difference-title' => '$1: Skilnad mellom versjonar',
+'difference-title' => 'Skilnad mellom versjonar av «$1»',
 'difference-title-multipage' => '$1 og $2: Skilnad mellom sidene',
 'difference-multipage' => '(Skilnad mellom sider)',
 'lineno' => 'Line $1:',
@@ -1255,6 +1264,10 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
 '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}})',
+'difference-missing-revision' => '{{PLURAL:$2|Éin versjon|$2 versjonar}} av skilnaden ($1) vart ikkje funne.
+
+Dette skriv seg som oftast frå at ein har fylgd ei forelda versjonslenkje til ei side som er sletta.
+Detaljar kan ein finna i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletteloggen].',
 
 # Search results
 'searchresults' => 'Søkjeresultat',
@@ -1297,8 +1310,6 @@ Pass på at den nye sida også har innhald frå den innfletta sida.',
 'search-interwiki-caption' => 'Systerprosjekt',
 'search-interwiki-default' => '$1-resultat:',
 'search-interwiki-more' => '(meir)',
-'search-mwsuggest-enabled' => 'med forslag',
-'search-mwsuggest-disabled' => 'ingen forslag',
 'search-relatedarticle' => 'Relatert',
 'mwsuggest-disable' => 'Slå av AJAX-forslag',
 'searcheverything-enable' => 'Søk i alle namneroma',
@@ -1334,7 +1345,7 @@ Ver merksam på at registra deira kan vera utdaterte.',
 
 # Preferences page
 'preferences' => 'Innstillingar',
-'mypreferences' => 'Innstillingane mine',
+'mypreferences' => 'Innstillingar',
 'prefs-edits' => 'Tal på endringar:',
 'prefsnologin' => 'Ikkje innlogga',
 'prefsnologintext' => 'Du må vere <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} logga inn]</span> for å endre brukarinnstillingane.',
@@ -1417,6 +1428,7 @@ Dette kan ikkje tilbakestillast.',
 'yourrealname' => 'Verkeleg namn:',
 'yourlanguage' => 'Språk:',
 'yourvariant' => 'Språkvariant for innhald:',
+'prefs-help-variant' => 'Varianten eller ortografien som du føretrekkjer at innhaldet i wikien vert vist på.',
 'yournick' => 'Signatur:',
 'prefs-help-signature' => 'Kommentarar på diskusjonssider bør alltid signerast med «<nowiki>~~~~</nowiki>», som vil konverterast til signaturen din med tidspunkt.',
 'badsig' => 'Ugyldig råsignatur, sjekk HTML-kodinga.',
@@ -1563,6 +1575,9 @@ Dette kan ikkje tilbakestillast.',
 'rightslogtext' => 'Dette er ein logg over endringar av brukartilgang.',
 'rightslogentry' => 'endra brukartilgangen til $1 frå $2 til $3',
 'rightslogentry-autopromote' => '↓vart automatisk forfremja frå $2 til $3',
+'logentry-rights-rights' => '$1 endra gruppemedlemskap for $3 frå $4 til $5',
+'logentry-rights-rights-legacy' => '$1 endra gruppemedlemskap for $3',
+'logentry-rights-autopromote' => '$1 vart automatisk forfremja frå $4 til $5',
 'rightsnone' => '(ingen)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1608,10 +1623,10 @@ Dette kan ikkje 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 endringa oppretta ei ny side',
-'recentchanges-label-minor' => 'Dette er ei mindre endring',
+'recentchanges-label-newpage' => 'Endringa oppretta ei ny side',
+'recentchanges-label-minor' => 'Endringa er småplukk',
 'recentchanges-label-bot' => 'Denne endringa vart gjort av ein bot',
-'recentchanges-label-unpatrolled' => 'Denne endringa er ikkje patruljert enno',
+'recentchanges-label-unpatrolled' => 'Endringa er ikkje patruljert enno',
 'rcnote' => "Nedanfor er {{PLURAL:$1|den siste endringa gjord|dei siste '''$1''' endringane gjorde}} {{PLURAL:$2|den siste dagen|dei siste '''$2''' dagane}}, for $4, kl. $5.",
 'rcnotefrom' => "Nedanfor vert opp til '''$1''' endringar sidan  ''' $2''' viste.",
 'rclistfrom' => 'Vis nye endringar sidan $1',
@@ -1681,7 +1696,7 @@ For å bruke ei fil på ei side, bruk ei lenkje på eit liknande format:
 'filestatus' => 'Opphavsrettsstatus:',
 'filesource' => 'Kjelde:',
 'uploadedfiles' => 'Filer som er opplasta',
-'ignorewarning' => 'Oversjå åtvaringa og lagre fila',
+'ignorewarning' => 'Sjå bort frå åtvaringa og lagre fila likevel',
 'ignorewarnings' => 'Oversjå åtvaringar',
 'minlength1' => 'Filnamn må ha minst eitt teikn.',
 'illegalfilename' => 'Filnamnet «$1» inneheld teikn som ikkje er tillatne i sidetitlar. Skift namn på fila og prøv på nytt.',
@@ -1742,6 +1757,8 @@ Om du framleis ønskjer å laste opp fila, gå tilbake og last ho opp med eit an
 'php-uploaddisabledtext' => 'PHP-filopplasting er deaktivert. Sjå innstillinga for file_uploads.',
 'uploadscripted' => 'Fila inneheld HTML- eller skriptkode som feilaktig kan bli tolka og køyrd av nettlesarar.',
 'uploadvirus' => 'Fila innheld virus! Detaljar: $1',
+'uploadjava' => 'Fila er ei ZIP-fil som inneheld ei Java .class-fil.
+Opplasting av Java-filer er ikkje tillate av di dei kan gå utanom tryggingsavgrensingane.',
 'upload-source' => 'Kjeldefil',
 'sourcefilename' => 'Filsti:',
 'sourceurl' => 'Kjelde-URL:',
@@ -1784,14 +1801,17 @@ $1',
 'upload-too-many-redirects' => 'URL-en inneheldt for mange omdirigeringar',
 'upload-unknown-size' => 'Ukjend storleik',
 'upload-http-error' => 'Ein HTTP-feil oppstod: $1',
+'upload-copy-upload-invalid-domain' => 'Kopiopplastingar er ikkje tilgjengelege frå dette domenet.',
 
 # File backend
 'backend-fail-stream' => 'Kunne ikkje strøyma fila «$1».',
 'backend-fail-backup' => 'Kunne ikkje tryggingskopiera fila «$1».',
 'backend-fail-notexists' => 'Fila $1 finst ikkje.',
+'backend-fail-hashes' => 'Kunne ikkje henta filnummer for samanlikning.',
 'backend-fail-notsame' => 'Ein ikkje-identisk fil finst alt på «$1».',
 'backend-fail-invalidpath' => '$1 er ikkje ein gyldig lagringsstig.',
 'backend-fail-delete' => 'Kunne ikkje sletta fila «$1».',
+'backend-fail-describe' => 'Kunne ikkje endra metadataa for fila «$1».',
 'backend-fail-alreadyexists' => 'Fila $1 finst frå før.',
 'backend-fail-store' => 'Kunne ikkje lagra fila «$1» på «$2».',
 'backend-fail-copy' => 'Kunne ikkje kopiera fila «$1» til «$2».',
@@ -1801,23 +1821,54 @@ $1',
 'backend-fail-closetemp' => 'Kunne ikkje lata att mellombels fil.',
 'backend-fail-read' => 'Kunne ikkje lesa fila «$1».',
 'backend-fail-create' => 'Kunne ikkje oppretta fila «$1».',
+'backend-fail-maxsize' => 'Kunne ikkje skriva fila «$1» av di ho er større enn {{PLURAL:$2|éin byte|$2 byte}}.',
+'backend-fail-readonly' => "Largingsbaksystemet «$1» er for tida skriveverna. Oppgjeven grunn er: «''$2''»",
+'backend-fail-synced' => 'Fila «$1» er i ei inkonsistent stode i dei interne lagringsbaksystema',
+'backend-fail-connect' => 'Kunne ikkje kopla til filbaksystemet «$1».',
+'backend-fail-internal' => 'Ein ukjend feil oppstod i lagringsbaksystemet «$1».',
+'backend-fail-contenttype' => 'Kunne ikkje avgjera innhaldstypen til fila som skulle lagrast på «$1».',
+'backend-fail-batchsize' => 'Baksystemet vart gjeve ei gruppe med $1 {{PLURAL:$1|filoperasjon|filoperasjonar}}; grensa er $2 {{PLURAL:$2|operasjon|operasjonar}}.',
+'backend-fail-usable' => 'Kunne ikkje lesa eller skriva fila «$1» grunna vantande rettar eller mapper/kjerald.',
+
+# File journal errors
+'filejournal-fail-dbconnect' => 'Kunne ikkje kopla til journaldatabasen for lagringsbaksystemet «$1».',
+'filejournal-fail-dbquery' => 'Kunne ikkje oppdatera journaldatabasen for lagringsbaksystemet «$1».',
 
 # Lock manager
+'lockmanager-notlocked' => 'Kunne ikkje låsa opp «$1» av di han ikkje er låst',
+'lockmanager-fail-closelock' => 'Kunne ikkje lata att låsefila for «$1».',
+'lockmanager-fail-deletelock' => 'Kunne ikkje sletta låsefila for «$1».',
+'lockmanager-fail-acquirelock' => 'Kunne ikkje henta lås for «$1».',
+'lockmanager-fail-openlock' => 'Kunne ikkje opna låsefila for «$1».',
 'lockmanager-fail-releaselock' => 'Kunne ikkje løysa låsen for «$1».',
+'lockmanager-fail-db-bucket' => 'Kunne ikkje kontakta nok låsedatabasar i bytta $1.',
+'lockmanager-fail-db-release' => 'Kunne ikkje løysa låsane på databasen $1.',
+'lockmanager-fail-svr-acquire' => 'Kunne ikkje henta låsane på tenaren $1.',
+'lockmanager-fail-svr-release' => 'Kunne ikkje løysa låsane på tenaren $1.',
 
 # ZipDirectoryReader
+'zip-file-open-error' => 'Det oppstod ein feil under opninga av fila for ZIP-undersøking.',
 'zip-wrong-format' => 'Den oppgjevne fila var ikkje ei ZIP-fil',
 'zip-bad' => 'Fila er ei skadd eller på annan måte uleseleg ZIP-fil.
 Ho kan ikkje tryggingskontrollerast.',
+'zip-unsupported' => 'Fila er ei ZIP-fil son nyttar ZIP-funksjonar som ikkje er stødde av MediaWiki.
+Ho kan ikkje tryggingskontrollerast godt nok.',
 
 # Special:UploadStash
+'uploadstash' => 'Lasta opp løynd samling',
+'uploadstash-summary' => 'Denne sida gjev tilgang til filer som er opplasta (eller i ferd med å verta det), men som ikkje er publiserte til wikien. Desse filene er ikkje synlege for andre enn opplastaren.',
+'uploadstash-clear' => 'Fjerna filer i den løynde samlinga',
+'uploadstash-nofiles' => 'Du har ingen filer i den løynde samlinga.',
+'uploadstash-badtoken' => 'Utføringa av handlinga lukkast ikkje; kan henda av di endringsrettane dine har gått ut. Freista om att.',
+'uploadstash-errclear' => 'Fjerning av filene var mislykka.',
 'uploadstash-refresh' => 'Oppdater fillista',
+'invalid-chunk-offset' => 'Ugild delforskuving',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Tilgjenge avslått',
-'img-auth-nopathinfo' => 'PATH_INFO manglar.
-Filtenaren din er ikkje sett opp for å gje denne informasjonen.
-Han kan vera CGI-basert og stør ikkje img_auth.
+'img-auth-nopathinfo' => 'PATH_INFO saknar.
+Filtenaren din er ikkje sett opp for å gjeva denne informasjonen.
+Han kan vera CGI-basert og ikkje stø img_auth.
 Sjå https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'img-auth-notindir' => 'Den ynskte filstien er ikkje i den oppsette opplastingskatalogen',
 'img-auth-badtitle' => 'Kan ikkje laga ein gyldig ttitel ut frå "$1".',
@@ -1830,6 +1881,7 @@ Berre tilgjenge til filer er tillete.',
 Denne wikien er sett opp som ein ålmennt tilgjengeleg wiki.
 For best tryggleik, er img_auth.php sett ut av funksjon.',
 'img-auth-noread' => 'Brukaren har ikkje rettar til å lesa «$1».',
+'img-auth-bad-query-string' => 'URL-en har ein ugild spørjestreng.',
 
 # HTTP errors
 'http-invalid-url' => 'Ugyldig URL: $1',
@@ -1899,12 +1951,16 @@ Ei [[Special:WhatLinksHere/$2|fullstendig liste]] er tilgjengeleg.',
 Sjå [$2 filskildringssida] for meir informasjon.',
 'sharedupload-desc-here' => 'Denne fila er frå $1 og kan verta nytta av andre prosjekt.
 Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
+'sharedupload-desc-edit' => 'Fila er frå $1 og kan vera nytta på andre prosjekt.
+Du vil kan henda endra skildringa på [$2 filskildringssida] hennar der.',
+'sharedupload-desc-create' => 'Fila er frå $1 og kan vera nytta på andre prosjekt.
+Du vil kan henda endra skildringa på [$2 filskildringssida] hennar der.',
 'filepage-nofile' => 'Det finst ikkje noka fil med dette namnet.',
 'filepage-nofile-link' => 'Inga fil med dette namnet finst, men du kan [$1 lasta ho opp].',
 'uploadnewversion-linktext' => 'Last opp ny versjon av denne fila',
 'shared-repo-from' => 'frå $1',
 'shared-repo' => 'eit sams fillager',
-'upload-disallowed-here' => 'Diverre kan du ikkje overskriva dette biletet.',
+'upload-disallowed-here' => 'Du kan ikkje overskriva denne fila.',
 
 # File reversion
 'filerevert' => 'Rulla attende $1',
@@ -1975,6 +2031,7 @@ Skildringa frå [$2 filskildringssida] der er vist nedanfor.',
 'statistics-edits' => 'Endringar sidan {{SITENAME}} vart oppretta',
 'statistics-edits-average' => 'Gjennomsnittleg tal på endringar per side',
 'statistics-views-total' => 'Totalt visningstal',
+'statistics-views-total-desc' => 'Visingar av sider som ikkje finst og spesialsider er ikkje tekne med',
 'statistics-views-peredit' => 'Visingar per endring',
 'statistics-users' => 'Registrerte [[Special:ListUsers|brukarar]]',
 'statistics-users-active' => 'Aktive brukarar',
@@ -2029,6 +2086,8 @@ Ei side vert handsama som ei fleirtydingsside om ho nyttar ein mal som er lenkja
 'wantedpages' => 'Etterspurde sider',
 'wantedpages-badtitle' => 'Ugyldig tittel mellom resultata: $1',
 'wantedfiles' => 'Etterspurde filer',
+'wantedfiletext-cat' => 'Desse filene er nytta men finst ikkje. Filer frå utannettstadlege samlingar kan vera lista opp sjølv om dei finst. Slike falske positivar vert <del>strokne ut</del>. Sider som nyttar filer som ikkje finst vert lista opp i [[:$1]].',
+'wantedfiletext-nocat' => 'Desse filene er nytta men finst ikkje. Filer frå utannettstadlege samlingar kan vera lista opp sjølv om dei finst. Slike falske positivar vert <del>strokne ut</del>.',
 'wantedtemplates' => 'Etterspurde malar',
 'mostlinked' => 'Sidene med flest lenkjer til seg',
 'mostlinkedcategories' => 'Mest brukte kategoriar',
@@ -2086,7 +2145,7 @@ Merk at andre internettsider kan ha direkte lenkjer til filer, og difor kan file
 'log' => 'Loggar',
 'all-logs-page' => 'Alle offentlege loggar',
 '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.',
+'logempty' => 'Ingen element i loggen passar.',
 'log-title-wildcard' => 'Søk i titlar som byrjar med denne teksten',
 'showhideselectedlogentries' => 'Vis/gøym valde loggoppføringar',
 
@@ -2132,7 +2191,9 @@ 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: <code>$1</code>',
+'linksearch-text' => 'Jokerteikn som «*.wikipedia.org» kan nyttast.
+Det er påkravt med eit toppnivådomene, til dømes «*.org».<br />
+Støtta protokollar: <code>$1</code> (nyttar http:// som standard om ingen protokoll er oppgjeven)',
 'linksearch-line' => '$2 lenkjer til $1',
 'linksearch-error' => 'Jokerteikn kan berre nyttast føre tenarnamnet.',
 
@@ -2180,7 +2241,7 @@ Sjå òg [[Special:WantedCategories|ønska kategoriar]].',
 'emailuser-title-target' => 'Send epost åt {{GENDER:$1|brukaren}}',
 'emailuser-title-notarget' => 'Send e-post åt brukar',
 'emailpage' => 'Send e-post åt brukar',
-'emailpagetext' => 'Du kan nytte skjemaet nedanfor til å sende ein e-post til denne brukaren.
+'emailpagetext' => 'Du kan nytte skjemaet nedanfor til å sende ein e-post til denne {{GENDER:$1|brukaren}}.
 E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukke opp i «frå»-feltet på denne e-posten, så mottakaren er i stand til å svare.',
 'usermailererror' => 'E-post systemet gav feilmelding:',
 'defemailsubject' => '{{SITENAME}} epost frå brukar "$1"',
@@ -2212,7 +2273,7 @@ E-postadressa du har sett i [[Special:Preferences|innstillingane dine]] vil dukk
 
 # Watchlist
 'watchlist' => 'Overvakingsliste',
-'mywatchlist' => 'Overvakingslista mi',
+'mywatchlist' => 'Overvakingsliste',
 'watchlistfor2' => 'For $1 $2',
 'nowatchlist' => 'Du har ikkje noko i overvakingslista di.',
 'watchlistanontext' => 'Du lyt $1 for å vise eller endre sider på overvakingslista di.',
@@ -2233,55 +2294,61 @@ 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 har blitt endra sidan du sist såg på dei er '''utheva'''",
+'wlheader-showupdated' => "* Sider som har vorte endra sidan du sist såg på dei er '''utheva'''",
 'watchmethod-recent' => 'sjekkar siste endringar for dei overvaka sidene',
 'watchmethod-list' => 'sjekkar om dei overvaka sidene har blitt endra i det siste',
 'watchlistcontains' => 'Overvakingslista di inneheld {{PLURAL:$1|éi side|$1 sider}}.',
 '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.",
-'wlshowlast' => 'Vis siste $1 timar $2 dagar $3',
+'wlshowlast' => 'Vis siste $1 timane $2 dagane $3',
 'watchlist-options' => 'Alternativ for overvakingslista',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Overvakar...',
 'unwatching' => 'Fjernar frå overvakinglista...',
+'watcherrortext' => 'Det oppstod ein feil under endringa av overvakingsinnstillingane dine for «$1».',
 
 'enotif_mailer' => '{{SITENAME}}-endringsmeldingssendar',
-'enotif_reset' => 'Merk alle sider som vitja',
-'enotif_newpagetext' => 'Dette er ei ny side.',
+'enotif_reset' => 'Merk alle sidene som vitja',
 'enotif_impersonal_salutation' => '{{SITENAME}}-brukar',
-'changed' => 'endra',
-'created' => 'oppretta',
-'enotif_subject' => '{{SITENAME}}-sida $PAGETITLE har vorte $CHANGEDORCREATED av $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}-sida $1 har vorte sletta av {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}-sida $1 har vorte oppretta av {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}-sida $1 har vorte flytta av {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}-sida $1 har vorte attoppretta av {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}-sida $1 har vorte endra av {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => '{{SITENAME}}-sida $1 vart sletta $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
+'enotif_body_intro_created' => '{{SITENAME}}-sida $1 vart oppretta $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
+'enotif_body_intro_moved' => '{{SITENAME}}-sida $1 vart flytt $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
+'enotif_body_intro_restored' => '{{SITENAME}}-sida $1 vart attoppretta $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
+'enotif_body_intro_changed' => '{{SITENAME}}-sida $1 vart endra $PAGEEDITDATE av {{gender:$2|$2}}, sjå $3 for den gjeldande versjonen.',
 'enotif_lastvisited' => 'Sjå $1 for alle endringane sidan siste vitjing.',
 'enotif_lastdiff' => 'Sjå $1 for å sjå denne endringa.',
 'enotif_anon_editor' => 'anonym brukar $1',
 'enotif_body' => 'Kjære $WATCHINGUSERNAME,
 
+$PAGEINTRO $NEWPAGE
 
-{{SITENAME}}-sida $PAGETITLE er vorten $CHANGEDORCREATED $PAGEEDITDATE av $PAGEEDITOR, sjå $PAGETITLE_URL for den gjeldande versjonen.
-
-$NEWPAGE
+Endringssamandraget var: $PAGESUMMARY $PAGEMINOREDIT
 
-Bidragsytaren sitt endringssamandrag: $PAGESUMMARY $PAGEMINOREDIT
-
-Du kan kontakte bidragsytaren gjennom:
-e-post: $PAGEEDITOR_EMAIL , eller
+Kontakta brukaren:
+e-post: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Du får ikkje fleire endringsmeldingar om denne sida før du har vitja henne på nytt.
-Du kan også tilbakestille endringsmeldingsstatus for alle sidene på overvakingslista di.
+Du får ikkje fleire endringsvarsel før du vitjar sida på nytt. Du kan dessutan nullstilla varselflagga for alle sidene på overvakingslista di.
 
-             Helsing det venlege {{SITENAME}}-meldingssystemet ditt
+Helsing det venlege meldingssystemet ditt for {{SITENAME}}
 
 --
-For å endre innstillingane for overvakingslista di, gå til
+For å endra innstillingane dine for e-postvarsling, vitja
+{{canonicalurl:{{#special:Preferences}}}}
+
+For å endra innstillingane for overvakingslista di, vitja
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-For hjelp og meir informasjon:
+For å fjerna sida frå overvakingslista di, vitja
 $UNWATCHURL
 
-Tilbakemeldingar og anna hjelp:
+Attendemelding og hjelp:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -2327,7 +2394,7 @@ Den siste endringa vart gjord av [[User:$3|$3]] ([[User talk:$3|brukardiskusjon]
 'editcomment' => "Samandraget for endringa var: «''$1''».",
 'revertpage' => 'Attenderulla endring gjord av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]]) til siste versjonen av [[User:$1|$1]]',
 'revertpage-nouser' => 'Tilbakestilte endringar av (brukarnamn fjerna) til den siste versjonen av [[User:$1|$1]]',
-'rollback-success' => 'Rulla attende endringane av $1, tilbake til siste versjon av $2.',
+'rollback-success' => 'Rulla attende endringane av $1, attende til siste versjonen av $2.',
 
 # Edit tokens
 'sessionfailure-title' => 'Feil med omgangen.',
@@ -2345,6 +2412,7 @@ Sjå [[Special:ProtectedPages|lista over verna sider]] for lista over vern som n
 'protect-title-notallowed' => 'Sjå vernenivået til «$1»',
 'prot_1movedto2' => '«[[$1]]» flytt til «[[$2]]»',
 'protect-badnamespace-title' => 'Namnerommet kan ikkje vernast',
+'protect-badnamespace-text' => 'Sider i dette namnerommet kan ikkje vernast.',
 'protect-legend' => 'Stadfest vern',
 'protectcomment' => 'Grunngjeving:',
 'protectexpiry' => 'Endar:',
@@ -2423,7 +2491,8 @@ Innhaldet i dei sletta versjonane er berre tilgjengeleg for administratorar.',
 'undeletedrevisions' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} attoppretta.',
 'undeletedrevisions-files' => '{{PLURAL:$1|Éin versjon|$1 versjonar}} og {{PLURAL:$2|éi fil|$2 filer}} er attoppretta',
 'undeletedfiles' => '{{PLURAL:$1|Éi fil|$1 filer}} er attoppretta',
-'cannotundelete' => 'Feil ved attoppretting, andre kan allereie ha attoppretta sida.',
+'cannotundelete' => 'Attopprettinga gjekk ikkje:
+$1',
 'undeletedpage' => "'''$1 er attoppretta'''
 
 Sjå [[Special:Log/delete|sletteloggen]] for eit oversyn over sider som nyleg er sletta eller attoppretta.",
@@ -2454,9 +2523,9 @@ $1',
 'blanknamespace' => '(Hovud)',
 
 # Contributions
-'contributions' => 'Brukarbidrag',
+'contributions' => '{{GENDER:$1|Brukarbidrag}}',
 'contributions-title' => 'Bidrag av $1',
-'mycontris' => 'Eigne bidrag',
+'mycontris' => 'Bidrag',
 'contribsub2' => 'For $1 ($2)',
 'nocontribs' => 'Det vart ikkje funne nokon endringar gjorde av denne brukaren.',
 'uctop' => ' (øvst)',
@@ -2698,7 +2767,7 @@ I desse falla lyt du flytta eller fletta sida manuelt, om ynskeleg.",
 'delete_and_move' => 'Slett og flytt',
 'delete_and_move_text' => '== Sletting påkravd ==
 
-Målsida «[[:$1]]» finst alt. Vil du sletta henne for å gjeva rom for flytting?',
+Målsida «[[:$1]]» finst allereie. Vil du slette ho for å gje 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.',
@@ -2707,6 +2776,7 @@ Målsida «[[:$1]]» finst alt. Vil du sletta henne for å gjeva rom for flyttin
 'immobile-target-namespace-iw' => 'Interwikilenkja er ikkje eit gyldig mål for flytting av sider.',
 'immobile-source-page' => 'Denne sida kan ikkje flyttast.',
 'immobile-target-page' => 'Kan ikkje flytte til det målnamnet.',
+'bad-target-model' => 'Det ynskte målet nyttar ein annan innhaldsmodell. Kan ikkje konvertera frå $1 til $2.',
 'imagenocrossnamespace' => 'Kan ikkje flytte bilete til andre namnerom enn biletnamnerommet',
 'nonfile-cannot-move-to-file' => 'Kan ikkje flytta ikkje-filer til filnamnerommet.',
 'imagetypemismatch' => 'Den nye filendinga høver ikkje til filtypen',
@@ -2784,6 +2854,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'import-interwiki-templates' => 'Inkluder alle malar',
 'import-interwiki-submit' => 'Importer',
 'import-interwiki-namespace' => 'Målnamnerom:',
+'import-interwiki-rootpage' => 'Målrotside (valfri):',
 'import-upload-filename' => 'Filnamn:',
 'import-comment' => 'Kommentar:',
 'importtext' => 'Lagre fila frå kjeldewikien med [[Special:Export|eksporteringsverktøyet]] på din eigen datamaskin, og last henne så opp her.',
@@ -2815,6 +2886,9 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'import-error-interwiki' => 'Sida «$1» vart ikkje importert sidan namnet hennar er reservert for ekstern lenking (interwiki).',
 'import-error-special' => 'Sida «$1» vart ikkje importert sidan ho høyrer til eit spesialnamnerom som ikkje tillèt sider.',
 'import-error-invalid' => 'Sida «$1» vart ikkje importert sidan namnet er ugildt.',
+'import-options-wrong' => '{{PLURAL:$2|Galt val|Gale val}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Den oppgjevne rotsida er ein ugild tittel',
+'import-rootpage-nosubpage' => 'Namnerommet «$1» til rotsida tillèt ikkje undersider.',
 
 # Import log
 'importlogpage' => 'Importeringslogg',
@@ -2826,13 +2900,13 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-utrøyning',
-'javascripttest-disabled' => 'Funksjonen er ikkje påslegen på wikien.',
 'javascripttest-title' => 'Køyrer $1-utrøyningar',
 'javascripttest-pagetext-noframework' => 'Sida er reservert for køyring av JavaScript-utrøyningar.',
 'javascripttest-pagetext-unknownframework' => 'Ukjent utrøyningsrammeverk: «$1».',
 'javascripttest-pagetext-frameworks' => 'Vel eitt av dei fylgjande utrøyningsrammeverka: $1',
 'javascripttest-pagetext-skins' => 'Vel ei drakt som utrøyningane skal køyrast med:',
 'javascripttest-qunit-intro' => 'Sjå [$1 utrøyningsdokumentasjon] på mediawiki.org.',
+'javascripttest-qunit-heading' => 'MediaWiki JavaScript QUnit testsuite',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Brukarsida di',
@@ -2953,6 +3027,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 
 # Info page
 'pageinfo-title' => 'Informasjon om «$1»',
+'pageinfo-not-current' => 'Orsak, det er umogeleg å gjeva denne informasjonen for gamle versjonar.',
 'pageinfo-header-basic' => 'Grunnleggjande informasjon',
 'pageinfo-header-edits' => 'Endringshistorikk',
 'pageinfo-header-restrictions' => 'Sidevern',
@@ -2961,6 +3036,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'pageinfo-default-sort' => 'Standard sorteringsnykel',
 'pageinfo-length' => 'Sidelengd (i byte)',
 'pageinfo-article-id' => 'Side-ID',
+'pageinfo-language' => 'Sideinnhaldsspråk',
 'pageinfo-robot-policy' => 'Søkjemotorstode',
 'pageinfo-robot-index' => 'Kan indekserast',
 'pageinfo-robot-noindex' => 'Kan ikkje indekserast',
@@ -2968,6 +3044,7 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'pageinfo-watchers' => 'Tal på overvakarar av sida',
 'pageinfo-redirects-name' => 'Omdirigeringar til sida',
 'pageinfo-subpages-name' => 'Undersider av sida',
+'pageinfo-subpages-value' => '$1 ({{PLURAL:$2|éi omdirigering|$2 omdirigeringar}}; {{PLURAL:$3|éi ikkje-omdirigering|$3 ikkje-omdirigeringar}})',
 'pageinfo-firstuser' => 'Sideopprettar',
 'pageinfo-firsttime' => 'Dato for opprettinga av sida',
 'pageinfo-lastuser' => 'Siste forfattaren',
@@ -2976,10 +3053,17 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'pageinfo-authors' => 'Totalt tal på ulike forfattarar',
 'pageinfo-recent-edits' => 'Tal på nylege endringar (innan dei siste $1)',
 'pageinfo-recent-authors' => 'Tal på nylege forfattarar',
-'pageinfo-restriction' => 'Sidevern ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Trylleord}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Løynd kategori|Løynde kategoriar}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Inkludert mal|Inkluderte malar}} ($1)',
+'pageinfo-toolboxlink' => 'Sideinformasjon',
+'pageinfo-redirectsto' => 'Omdirigerer til',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Tald som ei innhaldsside',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Djupvern byrjar her',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Djupvern byrjar i',
 
 # Skin names
 'skinname-standard' => 'Klassisk',
@@ -3001,6 +3085,8 @@ Vitja [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] og [//trans
 'markedaspatrollederror' => 'Kan ikkje merke sida som patruljert',
 'markedaspatrollederrortext' => 'Du må markere ein versjon for å kunne godkjenne.',
 'markedaspatrollederror-noautopatrol' => 'Ein har ikkje høve til å merkje sine eigne endringar som godkjende.',
+'markedaspatrollednotify' => 'Denne endringa på $1 har vorte merkt som patruljert.',
+'markedaspatrollederrornotify' => 'Det gjekk ikkje å merkja endringa som patruljert.',
 
 # Patrol log
 'patrol-log-page' => 'Patruljeringslogg',
@@ -3032,6 +3118,7 @@ $1',
 'file-info-size-pages' => '$1 × $2 pikslar, filstorleik: $3, MIME-type: $4, {{PLURAL:$5|éi side|$5 sider}}',
 'file-nohires' => 'Høgare oppløysing er ikkje tilgjengeleg.',
 'svg-long-desc' => 'SVG-fil, standardoppløysing: $1 × $2 pikslar, filstorleik: $3',
+'svg-long-desc-animated' => 'Animert SVG-fil, standardoppløysing $1 × $2 pikslar, filstorleik: $3',
 'show-big-image' => 'Full oppløysing',
 'show-big-image-preview' => 'Storleik på førehandsvising: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Anna oppløysing|Andre oppløysingar}}: $1.',
@@ -3041,6 +3128,8 @@ $1',
 'file-info-png-looped' => '↓oppatteke',
 'file-info-png-repeat' => 'spela av {{PLURAL:$1|éin gong|$1 gonger}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|bilete|bilete}}',
+'file-no-thumb-animation' => "'''Merk: Grunna tekniske avgrensingar vil ikkje miniatyrbilete av fila verta animerte.'''",
+'file-no-thumb-animation-gif' => "'''Merk: Grunna tekniska avgrensingar vil ikkje miniatyrbilete av høgoppløyselege GIF-bilete som dette verta animerte.'''",
 
 # Special:NewFiles
 'newimages' => 'Filgalleri',
@@ -3060,6 +3149,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 time|$1 timar}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
 'ago' => '$1 sidan',
+'just-now' => 'akkurat no',
 
 # Bad image list
 'bad_image_list' => 'Formatet er slik:
@@ -3222,19 +3312,39 @@ Andre er gøymde som standard.
 'exif-headline' => 'Overskrift',
 'exif-credit' => 'Opphavrettseigar/filgjevar',
 'exif-source' => 'Kjelde',
+'exif-editstatus' => 'Den redaksjonelle stoda til biletet',
 'exif-urgency' => 'Prioritet',
+'exif-fixtureidentifier' => 'Namn på tidgjengt emne',
+'exif-locationdest' => 'Avbilda stad',
+'exif-locationdestcode' => 'Koden til staden som er avbilda',
 'exif-objectcycle' => 'Tid på dagen mediet er meint for',
+'exif-contact' => 'Kontaktinformasjon',
 'exif-writer' => 'Forfattar',
 'exif-languagecode' => 'Språk',
 'exif-iimversion' => 'IIM-versjon',
 'exif-iimcategory' => 'Kategori',
+'exif-iimsupplementalcategory' => 'Tilleggskategoriar',
+'exif-datetimeexpires' => 'Skal ikkje nyttast etter',
+'exif-datetimereleased' => 'Frigjeve',
+'exif-originaltransmissionref' => 'Opphavleg stadkode for overføring',
+'exif-identifier' => 'Kjennemerke',
 'exif-lens' => 'Objektiv',
+'exif-serialnumber' => 'Serienummeret på kameraet',
 'exif-cameraownername' => 'Eigar av kameraet',
 'exif-label' => 'Merkelapp',
+'exif-datetimemetadata' => 'Datoen metadata sist vart endra',
+'exif-nickname' => 'Det uformelle namnet på biletet',
 'exif-rating' => 'Vurdering (av 5)',
+'exif-rightscertificate' => 'Retthandsamingssertifikat',
 'exif-copyrighted' => 'Opphavsrettsstode',
 'exif-copyrightowner' => 'Opphavsrettseigar',
 'exif-usageterms' => 'Bruksvilkår',
+'exif-webstatement' => 'Opphavsrettsfråsegn på nett',
+'exif-originaldocumentid' => 'Unik ID til originaldokumentet',
+'exif-licenseurl' => 'URL for opphavsrettsløyve',
+'exif-morepermissionsurl' => 'Alternativ løyveinformasjon',
+'exif-attributionurl' => 'Når dette verket vert nytta, lenkja til',
+'exif-preferredattributionname' => 'Når dette verket vert nytta, godskriv',
 'exif-pngfilecomment' => 'PNG-filkommentar',
 'exif-disclaimer' => 'Atterhald',
 'exif-contentwarning' => 'Innholdsåtvaring',
@@ -3409,6 +3519,7 @@ Andre er gøymde som standard.
 'exif-gpsdop-excellent' => 'Utmerkt ($1)',
 'exif-gpsdop-good' => 'God ($1)',
 'exif-gpsdop-moderate' => 'Moderat ($1)',
+'exif-gpsdop-fair' => 'Medels ($1)',
 'exif-gpsdop-poor' => 'Dårleg ($1)',
 
 'exif-objectcycle-a' => 'Berre morgon',
@@ -3420,8 +3531,10 @@ Andre er gøymde som standard.
 'exif-gpsdirection-m' => 'Magnetisk retning',
 
 'exif-ycbcrpositioning-1' => 'Sentrert',
+'exif-ycbcrpositioning-2' => 'Samanfallande',
 
 'exif-dc-contributor' => 'Bidragsytarar',
+'exif-dc-coverage' => 'Rom- eller tidssutstrekning til medium',
 'exif-dc-date' => 'Dato(ar)',
 'exif-dc-publisher' => 'Utgjevar',
 'exif-dc-relation' => 'Skylde medium',
@@ -3500,6 +3613,30 @@ Dersom dette *ikkje* er deg, følg denne lenkja for avbryte stadfestinga av e-po
 
 $5
 
+Denne stadfestingskoden vert forelda $4.',
+'confirmemail_body_changed' => 'Nokon, truleg deg, frå IP-adressa $1, har endra e-postadressa til kontoen «$2» på {{SITENAME}} til denne e-postadressa.
+
+For å stadfesta at denne kontoen faktisk høyrer til deg, og for å slå på
+funksjonar knytte til e-post på {{SITENAME}}, opna denne lenkja i nettlesaren din:
+
+$3
+
+Om brukarkontoen *ikkje* høyrer til deg, fylg denne lenkja for å bryta av stadfestinga av e-postadressa:
+
+$5
+
+Denne stadfestingskoden vert forelda $4.',
+'confirmemail_body_set' => 'Nokon, truleg deg, frå IP-adressa $1, har sett e-postadressa til kontoen «$2» på {{SITENAME}} til denne e-postadressa.
+
+For å stadfesta at denne kontoen faktisk høyrer til deg, og for å slå på
+funksjonar knytte til e-post på {{SITENAME}}, opna denne lenkja i nettlesaren din:
+
+$3
+
+Om brukarkontoen *ikkje* høyrer til deg, fylg denne lenkja for å bryta av stadfestinga av e-postadressa:
+
+$5
+
 Denne stadfestingskoden vert forelda $4.',
 'confirmemail_invalidated' => 'Stadfestinga av e-postadresse er avbrote',
 'invalidateemail' => 'Avbryt stadfestinga av e-postadressa',
@@ -3507,6 +3644,7 @@ Denne stadfestingskoden vert forelda $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-tilkopling er slått av]',
 'scarytranscludefailed' => '[Henting av mal for $1 gjekk ikkje]',
+'scarytranscludefailed-httpstatus' => '[Henting av mal for $1 gjekk ikkje: HTTP $2]',
 'scarytranscludetoolong' => '[URL-en er for lang]',
 
 # Delete conflict
@@ -3614,8 +3752,14 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
 'version-hook-subscribedby' => 'Brukt av',
 'version-version' => '(versjon $1)',
 'version-license' => 'Lisens',
-'version-poweredby-credits' => "Denne wikien er dreven av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits' => "Denne wikien er driven av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andre',
+'version-credits-summary' => 'Me ynskjer godskriva desse personane for tilskotet deira til [[Special:Version|MediaWiki]].',
+'version-license-info' => 'MediaWiki er fri programvare; du kan redistribuera det og/eller modifisera det under krava i GNU General Public License som publisert av Free Software Foundation; anten versjon 2 av lisensen, eller (om du ynskjer det) ein kvar seinare versjon.
+
+MediaWiki er distribuert i håp om at det vil vera nyttig, men UTAN NOKON GARANTI; ikkje eingong ein implisitt garanti for at det KAN SELJAST eller at det EIGNAR SEG TIL EIT VISST FØREMÅL. Sjå GNU General Public License for fleire detaljar.
+
+Du skal ha motteke [{{SERVER}}{{SCRIPTPATH}}/COPYING ein kopi av GNU General Public License] saman med dette programmet; om ikkje, skriv til Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA eller [//www.gnu.org/licenses/old-licenses/gpl-2.0.html les det på nettet].',
 'version-software' => 'Installert programvare',
 'version-software-product' => 'Produkt',
 'version-software-version' => 'Versjon',
@@ -3627,9 +3771,8 @@ Du kan òg [[Special:EditWatchlist|nytte standardverktøyet]].',
 'filepath' => 'Filsti',
 'filepath-page' => 'Fil:',
 'filepath-submit' => 'Gå',
-'filepath-summary' => 'Denne spesialsida gjev den fullstendige stien for ei fil. Bilete vert vist i oppløysing; andre filtypar vert starta direkte i dei tilknytte programma sine.
-
-Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
+'filepath-summary' => 'Denne spesialsida svarar med den fullstendige stigen til ei fil.
+Bilete vert viste i full oppløysing, andre filtypar vert starta direkte i dei tilknytte programma sine.',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch' => 'Søk etter duplikatfiler',
@@ -3646,7 +3789,7 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 'specialpages' => 'Spesialsider',
 'specialpages-note' => '----
 * Vanlege spesialsider.
-* <strong class="mw-specialpagerestricted">Spesialsider med avgrensa tilgang.</strong>',
+* <span class="mw-specialpagerestricted">Spesialsider med avgrensa tilgang.</span>',
 'specialpages-group-maintenance' => 'Vedlikehaldsrapportar',
 'specialpages-group-other' => 'Andre spesialsider',
 'specialpages-group-login' => 'Logga inn / oppretta brukarkonto',
@@ -3728,10 +3871,14 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 'logentry-delete-delete' => '$1 sletta sida $3',
 'logentry-delete-restore' => '$1 attoppretta sida $3',
 'logentry-delete-event' => '$1 endra synlegdomen av {{PLURAL:$5|éi loggoppføring|$5 loggoppføringar}} på $3: $4',
-'logentry-delete-revision' => '$1 endra synlegdomen av {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
-'logentry-delete-event-legacy' => '$1 endra synlegdomen av loggoppføringar på $3',
-'logentry-delete-revision-legacy' => '$1 endra synlegdomen av versjonar på sida $3',
+'logentry-delete-revision' => '$1 endra synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
+'logentry-delete-event-legacy' => '$1 endra synlegdomen til loggoppføringar på $3',
+'logentry-delete-revision-legacy' => '$1 endra synlegdomen til versjonar på sida $3',
 'logentry-suppress-delete' => '$1 gøymde sida $3',
+'logentry-suppress-event' => '$1 endra i løyndom synlegdomen til {{PLURAL:$5|éi logghending|$5 logghendingar}} på $3: $4',
+'logentry-suppress-revision' => '$1 endra i løyndom synlegdomen til {{PLURAL:$5|éin versjon|$5 versjonar}} på sida $3: $4',
+'logentry-suppress-event-legacy' => '$1 endra i løyndom synlegdomen til logghendingar på $3',
+'logentry-suppress-revision-legacy' => '$1 endra i løyndom synlegdomen til versjonar på sida $3',
 'revdelete-content-hid' => 'innhald gøymt',
 'revdelete-summary-hid' => 'endringsamandrag gøymt',
 'revdelete-uname-hid' => 'brukarnamn gøymt',
@@ -3746,9 +3893,9 @@ Skriv inn filnamnet utan «{{ns:file}}:»-prefikset.',
 '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',
+'logentry-newusers-newusers' => 'Brukarkontoen $1 vart oppretta',
+'logentry-newusers-create' => 'Brukarkontoen $1 vart oppretta',
+'logentry-newusers-create2' => 'Brukarkontoen $3 vart oppretta av $1',
 'logentry-newusers-autocreate' => 'Kontoen $1 vart oppretta av seg sjølv',
 'newuserlog-byemail' => 'passordet er sendt på e-post',
 
@@ -3768,6 +3915,10 @@ Om ikkje kan du nytta det enkle skjemaet under. Merknaden din vert lagd til på
 'feedback-bugcheck' => 'Bra! No lyt du berre sjå etter om han er ein av dei [$1 kjende feila].',
 'feedback-bugnew' => 'Eg såg etter. Rapporter ein ny feil',
 
+# Search suggestions
+'searchsuggest-search' => 'Søk',
+'searchsuggest-containing' => 'som inneheld …',
+
 # API errors
 'api-error-badaccess-groups' => 'Du har ikkje løyve til å lasta opp filer til wikien.',
 'api-error-badtoken' => 'Intern feil: ugild token.',
@@ -3820,4 +3971,6 @@ Om ikkje kan du nytta det enkle skjemaet under. Merknaden din vert lagd til på
 'duration-centuries' => '$1 {{PLURAL:$1|hundreår|hundreår}}',
 'duration-millennia' => '$1 {{PLURAL:$1|tusenår|tusenår}}',
 
+# Unknown messages
+'svg-long-error' => 'Ugild SVG-fil: $1',
 );
index 210e0eb..5a67f1f 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'sundie',
-'monday'        => 'lundie',
-'tuesday'       => 'mardie',
-'wednesday'     => 'merkurdie',
-'thursday'      => 'jodie',
-'friday'        => 'venerdie',
-'saturday'      => 'saturdie',
-'sun'           => 'sun',
-'mon'           => 'lun',
-'tue'           => 'mar',
-'wed'           => 'mer',
-'thu'           => 'jod',
-'fri'           => 'ven',
-'sat'           => 'sat',
-'january'       => 'januare',
-'february'      => 'februare',
-'march'         => 'marte',
-'april'         => 'aprile',
-'may_long'      => 'maye',
-'june'          => 'june',
-'july'          => 'julie',
-'august'        => 'auguste',
-'september'     => 'septembre',
-'october'       => 'oktobre',
-'november'      => 'novembre',
-'december'      => 'desembre',
-'january-gen'   => 'de januare',
-'february-gen'  => 'de februare',
-'march-gen'     => 'de marte',
-'april-gen'     => 'de aprile',
-'may-gen'       => 'de maye',
-'june-gen'      => 'de june',
-'july-gen'      => 'de julie',
-'august-gen'    => 'de auguste',
+'sunday' => 'sundie',
+'monday' => 'lundie',
+'tuesday' => 'mardie',
+'wednesday' => 'merkurdie',
+'thursday' => 'jodie',
+'friday' => 'venerdie',
+'saturday' => 'saturdie',
+'sun' => 'sun',
+'mon' => 'lun',
+'tue' => 'mar',
+'wed' => 'mer',
+'thu' => 'jod',
+'fri' => 'ven',
+'sat' => 'sat',
+'january' => 'januare',
+'february' => 'februare',
+'march' => 'marte',
+'april' => 'aprile',
+'may_long' => 'maye',
+'june' => 'june',
+'july' => 'julie',
+'august' => 'auguste',
+'september' => 'septembre',
+'october' => 'oktobre',
+'november' => 'novembre',
+'december' => 'desembre',
+'january-gen' => 'de januare',
+'february-gen' => 'de februare',
+'march-gen' => 'de marte',
+'april-gen' => 'de aprile',
+'may-gen' => 'de maye',
+'june-gen' => 'de june',
+'july-gen' => 'de julie',
+'august-gen' => 'de auguste',
 'september-gen' => 'de septembre',
-'october-gen'   => 'de oktobre',
-'november-gen'  => 'de novembre',
-'december-gen'  => 'de desembre',
-'jan'           => 'jan',
-'feb'           => 'feb',
-'mar'           => 'mar',
-'apr'           => 'apr',
-'may'           => 'maye',
-'jun'           => 'jun',
-'jul'           => 'jul',
-'aug'           => 'aug',
-'sep'           => 'sep',
-'oct'           => 'okt',
-'nov'           => 'nov',
-'dec'           => 'des',
+'october-gen' => 'de oktobre',
+'november-gen' => 'de novembre',
+'december-gen' => 'de desembre',
+'jan' => 'jan',
+'feb' => 'feb',
+'mar' => 'mar',
+'apr' => 'apr',
+'may' => 'maye',
+'jun' => 'jun',
+'jul' => 'jul',
+'aug' => 'aug',
+'sep' => 'sep',
+'oct' => 'okt',
+'nov' => 'nov',
+'dec' => 'des',
 
 # Categories related messages
-'pagecategories'  => '{{PLURAL:$1|Kategorie|Kategories}}',
+'pagecategories' => '{{PLURAL:$1|Kategorie|Kategories}}',
 'category_header' => 'Artikles in kategorie "$1"',
-'subcategories'   => 'Subkategories',
+'subcategories' => 'Subkategories',
 
-'about'         => 'Pri',
-'article'       => 'Pagine de kontenaje',
-'newwindow'     => '(aperta in novi fenestre)',
-'cancel'        => 'Nihilisa',
+'about' => 'Pri',
+'article' => 'Pagine de kontenaje',
+'newwindow' => '(aperta in novi fenestre)',
+'cancel' => 'Nihilisa',
 'moredotdotdot' => 'Plu...',
-'mypage'        => 'Men pagine',
-'mytalk'        => 'Men parla-pagine',
-'anontalk'      => 'Parlo por disi IP',
-'navigation'    => 'Navigatione',
-'and'           => '&#32;e',
+'mypage' => 'Men pagine',
+'mytalk' => 'Men parla-pagine',
+'anontalk' => 'Parlo por disi IP',
+'navigation' => 'Navigatione',
+'and' => '&#32;e',
 
 # Cologne Blue skin
-'qbfind'         => 'Trova',
-'qbedit'         => 'Modifika',
-'qbpageoptions'  => 'Disi pagine',
-'qbmyoptions'    => 'Men pagines',
+'qbfind' => 'Trova',
+'qbedit' => 'Modifika',
+'qbpageoptions' => 'Disi pagine',
+'qbmyoptions' => 'Men pagines',
 'qbspecialpages' => 'Spesial pagines',
 
 # Vector skin
 'vector-action-delete' => 'Ekarta',
-'vector-view-edit'     => 'Modifika',
-'vector-view-view'     => 'Lekte',
-
-'returnto'         => 'Rivada a $1.',
-'tagline'          => 'Fro {{SITENAME}}',
-'help'             => 'Helpo',
-'search'           => 'Sercha',
-'searchbutton'     => 'Sercha',
-'go'               => 'Vada',
-'searcharticle'    => 'Vada',
-'history'          => 'Historie del pagine',
-'history_short'    => 'Historie',
+'vector-view-edit' => 'Modifika',
+'vector-view-view' => 'Lekte',
+
+'returnto' => 'Rivada a $1.',
+'tagline' => 'Fro {{SITENAME}}',
+'help' => 'Helpo',
+'search' => 'Sercha',
+'searchbutton' => 'Sercha',
+'go' => 'Vada',
+'searcharticle' => 'Vada',
+'history' => 'Historie del pagine',
+'history_short' => 'Historie',
 'printableversion' => 'Printindi versione',
-'permalink'        => 'Permananti linke',
-'print'            => 'Printa',
-'edit'             => 'Immodifika',
-'editthispage'     => 'Modifika disi pagine',
-'delete'           => 'Ekarta',
-'deletethispage'   => 'Ekarta disi pagine',
-'protect'          => 'Protekte',
-'protectthispage'  => 'Protekte disi pagine',
-'newpage'          => 'Novi pagine',
-'talkpage'         => 'Diskuse disi pagine',
+'permalink' => 'Permananti linke',
+'print' => 'Printa',
+'edit' => 'Immodifika',
+'editthispage' => 'Modifika disi pagine',
+'delete' => 'Ekarta',
+'deletethispage' => 'Ekarta disi pagine',
+'protect' => 'Protekte',
+'protectthispage' => 'Protekte disi pagine',
+'newpage' => 'Novi pagine',
+'talkpage' => 'Diskuse disi pagine',
 'talkpagelinktext' => 'Diskusione',
-'specialpage'      => 'Spesial Pagine',
-'articlepage'      => 'Regarda pagine de kontenaje',
-'talk'             => 'Diskusione',
-'toolbox'          => 'Utensiles',
-'userpage'         => 'Vida useren pagine',
-'imagepage'        => 'Regarda imajal pagine',
-'mediawikipage'    => 'Regarda mesajal pagine',
-'templatepage'     => 'Vida shablonal pagine',
-'categorypage'     => 'Regarda kategorial pagine',
-'otherlanguages'   => 'Altri lingues',
-'lastmodifiedat'   => 'Disi pagine blid lastim modifika: $2 ye $1.',
+'specialpage' => 'Spesial Pagine',
+'articlepage' => 'Regarda pagine de kontenaje',
+'talk' => 'Diskusione',
+'toolbox' => 'Utensiles',
+'userpage' => 'Vida useren pagine',
+'imagepage' => 'Regarda imajal pagine',
+'mediawikipage' => 'Regarda mesajal pagine',
+'templatepage' => 'Vida shablonal pagine',
+'categorypage' => 'Regarda kategorial pagine',
+'otherlanguages' => 'Altri lingues',
+'lastmodifiedat' => 'Disi pagine blid lastim modifika: $2 ye $1.',
 'jumptonavigation' => 'navigatione',
-'jumptosearch'     => 'sercha',
+'jumptosearch' => 'sercha',
 
 # 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'            => 'Pri {{SITENAME}}',
-'aboutpage'            => 'Project:Pri',
-'currentevents'        => 'Nuni eventes',
-'currentevents-url'    => 'Project:Nuni eventes',
-'edithelp'             => 'Helpo pri modifiko de pagines',
-'helppage'             => 'Help:Kontenaje',
-'mainpage'             => 'Chefi pagine',
+'aboutsite' => 'Pri {{SITENAME}}',
+'aboutpage' => 'Project:Pri',
+'currentevents' => 'Nuni eventes',
+'currentevents-url' => 'Project:Nuni eventes',
+'edithelp' => 'Helpo pri modifiko de pagines',
+'helppage' => 'Help:Kontenaje',
+'mainpage' => 'Chefi pagine',
 'mainpage-description' => 'Chefi pagine',
-'portal'               => 'Li komun chambre',
-'portal-url'           => 'Project:Li komun chambre',
+'portal' => 'Li komun chambre',
+'portal-url' => 'Project:Li komun chambre',
 
 'badaccess' => 'Permisione erore',
 
-'youhavenewmessages'      => 'Vu have $1 ($2).',
-'newmessageslink'         => 'novi mesajes',
-'newmessagesdifflink'     => 'lasti chanjo',
+'youhavenewmessages' => 'Vu have $1 ($2).',
+'newmessageslink' => 'novi mesajes',
+'newmessagesdifflink' => 'lasti chanjo',
 'youhavenewmessagesmulti' => 'Vu have novi mesajes pri $1',
-'editsection'             => 'modifika',
-'editold'                 => 'modifika',
-'editlink'                => 'modifika',
-'restorelink'             => '{{PLURAL:$1|unu ekartati modifiko|$1 ekartati modifikos}}',
-'red-link-title'          => '$1 (pagine non exista)',
+'editsection' => 'modifika',
+'editold' => 'modifika',
+'editlink' => 'modifika',
+'restorelink' => '{{PLURAL:$1|unu ekartati modifiko|$1 ekartati modifikos}}',
+'red-link-title' => '$1 (pagine non exista)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Artikle',
-'nstab-user'      => 'Useren pagine',
-'nstab-special'   => 'Spesial pagine',
-'nstab-project'   => 'Projetal pagine',
+'nstab-main' => 'Artikle',
+'nstab-user' => 'Useren pagine',
+'nstab-special' => 'Spesial pagine',
+'nstab-project' => 'Projetal pagine',
 'nstab-mediawiki' => 'Mesaje',
-'nstab-template'  => 'Shablone',
-'nstab-help'      => 'Helpo-pagine',
-'nstab-category'  => 'Kategorie',
+'nstab-template' => 'Shablone',
+'nstab-help' => 'Helpo-pagine',
+'nstab-category' => 'Kategorie',
 
 # General errors
-'error'        => 'Erore',
-'badtitle'     => 'Mali title',
+'error' => 'Erore',
+'badtitle' => 'Mali title',
 'badtitletext' => 'Li pregati pagine esed non-valid, vakui, o non-korektim linkat inter-lingue o inter-wiki title. Lu povud kontena un o plusi karakteres kel on non pove usa in titles.',
 
 # Login and logout pages
-'logouttext'                 => "'''Vu es nun eksignatat.'''
+'logouttext' => "'''Vu es nun eksignatat.'''
 
 Vu pove kontinua usa {{SITENAME}} anonimim, o vu pove riensignata kom li sami o altri usere.",
-'yourname'                   => 'Usere-nome:',
-'yourpassword'               => 'Pasa-vorde:',
-'remembermypassword'         => 'Memora men pasa-vorde (kun kuke) (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'                      => 'Ensignata',
-'loginprompt'                => 'Vu mus lasa cookies de ensignata en {{SITENAME}}.',
-'userlogin'                  => 'Ensignata / krea usere-registre',
-'logout'                     => 'Eksignata',
-'userlogout'                 => 'Eksignata',
-'notloggedin'                => 'Non ensignatat',
-'nologin'                    => "Ob vu non have registre? '''$1'''.",
-'nologinlink'                => 'Krea usere-registre',
-'gotaccountlink'             => 'Ensignata',
-'loginerror'                 => 'Erore de ensignato',
-'loginsuccesstitle'          => 'Ensignato suksesosi',
-'loginsuccess'               => "'''Vu es nun ensignatat a {{SITENAME}} nomisat \"\$1\".'''",
-'mailmypassword'             => 'E-posta men pasa-vorde',
+'yourname' => 'Usere-nome:',
+'yourpassword' => 'Pasa-vorde:',
+'remembermypassword' => 'Memora men pasa-vorde (kun kuke) (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'login' => 'Ensignata',
+'loginprompt' => 'Vu mus lasa cookies de ensignata en {{SITENAME}}.',
+'userlogin' => 'Ensignata / krea usere-registre',
+'logout' => 'Eksignata',
+'userlogout' => 'Eksignata',
+'notloggedin' => 'Non ensignatat',
+'nologin' => "Ob vu non have registre? '''$1'''.",
+'nologinlink' => 'Krea usere-registre',
+'gotaccountlink' => 'Ensignata',
+'loginerror' => 'Erore de ensignato',
+'loginsuccesstitle' => 'Ensignato suksesosi',
+'loginsuccess' => "'''Vu es nun ensignatat a {{SITENAME}} nomisat \"\$1\".'''",
+'mailmypassword' => 'E-posta men pasa-vorde',
 'acct_creation_throttle_hit' => 'Visitors to this wiki using your IP address have created {{PLURAL:$1|1 account|$1 accounts}} in the last day, which is the maximum allowed in this time period.
 As a result, visitors using this IP address cannot create any more accounts at the moment.',
-'accountcreated'             => 'Registre kreat',
-'accountcreatedtext'         => 'Li usere-registre por $1 ha bli krea.',
+'accountcreated' => 'Registre kreat',
+'accountcreatedtext' => 'Li usere-registre por $1 ha bli krea.',
 
 # Edit page toolbar
-'bold_sample'  => 'Diki texte',
+'bold_sample' => 'Diki texte',
 'image_sample' => 'Exemple.jpg',
 
 # Edit pages
-'summary'       => 'Resume:',
-'minoredit'     => 'Dise es mikri modifiko',
-'watchthis'     => 'Observa disi pagine',
-'savearticle'   => 'Spara pagine',
-'showpreview'   => 'Montra previdatu',
-'showdiff'      => 'Montra chanjos',
+'summary' => 'Resume:',
+'minoredit' => 'Dise es mikri modifiko',
+'watchthis' => 'Observa disi pagine',
+'savearticle' => 'Spara pagine',
+'showpreview' => 'Montra previdatu',
+'showdiff' => 'Montra chanjos',
 'loginreqtitle' => 'Ensignato Postulat',
-'loginreqlink'  => 'ensignata',
-'accmailtitle'  => 'Pasa-vorde sendat.',
-'accmailtext'   => 'Li pasa-vorde por "$1" ha bli senda a $2.',
-'yourtext'      => 'Vun texte',
+'loginreqlink' => 'ensignata',
+'accmailtitle' => 'Pasa-vorde sendat.',
+'accmailtext' => 'Li pasa-vorde por "$1" ha bli senda a $2.',
+'yourtext' => 'Vun texte',
 
 # History pages
-'currentrev'          => 'Nuni revisione',
+'currentrev' => 'Nuni revisione',
 'currentrevisionlink' => 'Nuni revisione',
-'histfirst'           => 'Maxim frui',
-'histlast'            => 'Maxim resenti',
+'histfirst' => 'Maxim frui',
+'histlast' => 'Maxim resenti',
 
 # Revision feed
-'history-feed-title'       => 'Historie de revisiones',
+'history-feed-title' => 'Historie de revisiones',
 'history-feed-description' => 'Historie de revisiones de disi pagine sur li wiki',
-'history-feed-empty'       => 'Li petit pagine non exista.
+'history-feed-empty' => 'Li petit pagine non exista.
 Forsan lu ha bli ekarta fro li wiki, o rinomat.
 Proba [[Special:Search|sercho sur li wiki]] por relatet pagines.',
 
 # Diffs
-'lineno'                  => 'Linie $1:',
+'lineno' => 'Linie $1:',
 'compareselectedversions' => 'Kompara selektet versiones',
 
 # Search results
-'searchresults'         => 'Resultes de sercho',
-'searchresulttext'      => 'Por plu multi informatione pri sercho {{SITENAME}}, vida [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle'        => "Vu serchad '''[[:$1]]'''",
+'searchresults' => 'Resultes de sercho',
+'searchresulttext' => 'Por plu multi informatione pri sercho {{SITENAME}}, vida [[{{MediaWiki:Helppage}}|{{int:help}}]].',
+'searchsubtitle' => "Vu serchad '''[[:$1]]'''",
 'searchsubtitleinvalid' => "Vu serchad '''$1'''",
-'prevn'                 => 'lasti {{PLURAL:$1|$1}}',
-'nextn'                 => 'sekuenti {{PLURAL:$1|$1}}',
-'viewprevnext'          => 'Vida ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url'        => 'Help:Kontenaje',
-'search-result-size'    => '$1 ({{PLURAL:$2|1 vorde|$2 vordes}})',
-'showingresults'        => "Montrant subu {{PLURAL:$1|'''1''' resulte|'''$1''' resultes}} amaxim komensant fro #'''$2'''.",
-'showingresultsnum'     => "Montrant subu {{PLURAL:$3|'''1''' result|'''$3''' results}} komensant fro #'''$2'''.",
-'powersearch'           => 'Sercha',
+'prevn' => 'lasti {{PLURAL:$1|$1}}',
+'nextn' => 'sekuenti {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Vida ($1 {{int:pipe-separator}} $2) ($3).',
+'searchhelp-url' => 'Help:Kontenaje',
+'search-result-size' => '$1 ({{PLURAL:$2|1 vorde|$2 vordes}})',
+'showingresults' => "Montrant subu {{PLURAL:$1|'''1''' resulte|'''$1''' resultes}} amaxim komensant fro #'''$2'''.",
+'showingresultsnum' => "Montrant subu {{PLURAL:$3|'''1''' result|'''$3''' results}} komensant fro #'''$2'''.",
+'powersearch' => 'Sercha',
 
 # Preferences page
-'preferences'           => 'Preferos',
-'mypreferences'         => 'Men preferos',
-'prefsnologin'          => 'Non ensignatat',
-'prefsnologintext'      => 'Vu mus es <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ensignatat] por determina useren preferos.',
-'prefs-rc'              => 'Resenti chanjos',
-'searchresultshead'     => 'Sercha',
+'preferences' => 'Preferos',
+'mypreferences' => 'Men preferos',
+'prefsnologin' => 'Non ensignatat',
+'prefsnologintext' => 'Vu mus es <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ensignatat] por determina useren preferos.',
+'prefs-rc' => 'Resenti chanjos',
+'searchresultshead' => 'Sercha',
 'timezoneregion-africa' => 'Afrika',
 
 # Recent changes
-'nchanges'        => '$1 {{PLURAL:$1|chanjo|chanjos}}',
-'recentchanges'   => 'Resenti chanjos',
-'rcnote'          => "Subu es {{PLURAL:$1| '''1''' chanje|li lasti '''$1''' chanjes}} in li lasti {{PLURAL:$2|die|'''$2''' dies}}, fro $4, $5.",
+'nchanges' => '$1 {{PLURAL:$1|chanjo|chanjos}}',
+'recentchanges' => 'Resenti chanjos',
+'rcnote' => "Subu es {{PLURAL:$1| '''1''' chanje|li lasti '''$1''' chanjes}} in li lasti {{PLURAL:$2|die|'''$2''' dies}}, fro $4, $5.",
 'rcshowhideminor' => '$1 minori modifikos',
 'rcshowhideanons' => '$1 anonimi useres',
-'rcshowhidemine'  => '$1 men modifikos',
-'rclinks'         => 'Montra lasti $1 chanjes in lasti $2 dies<br />$3',
-'hist'            => 'hist',
-'hide'            => 'Kasha',
-'show'            => 'Montra',
+'rcshowhidemine' => '$1 men modifikos',
+'rclinks' => 'Montra lasti $1 chanjes in lasti $2 dies<br />$3',
+'hist' => 'hist',
+'hide' => 'Kasha',
+'show' => 'Montra',
 'minoreditletter' => 'm',
-'newpageletter'   => 'N',
+'newpageletter' => 'N',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Afini chanjos',
-'recentchangeslinked-feed'    => 'Afini chanjos',
+'recentchangeslinked' => 'Afini chanjos',
+'recentchangeslinked-feed' => 'Afini chanjos',
 'recentchangeslinked-toolbox' => 'Afini chanjos',
 
 # Upload
-'upload'            => 'Enporta',
-'uploadnologin'     => 'Non ensignatat',
-'filedesc'          => 'Resume',
+'upload' => 'Enporta',
+'uploadnologin' => 'Non ensignatat',
+'filedesc' => 'Resume',
 'fileuploadsummary' => 'Resume:',
-'watchthisupload'   => 'Observa disi pagine',
+'watchthisupload' => 'Observa disi pagine',
 
 # Special:ListFiles
-'listfiles_search_for'  => 'Sercha imaje nome:',
-'listfiles_name'        => 'Nome',
-'listfiles_user'        => 'Usere',
-'listfiles_size'        => 'Grandeso (bites)',
+'listfiles_search_for' => 'Sercha imaje nome:',
+'listfiles_name' => 'Nome',
+'listfiles_user' => 'Usere',
+'listfiles_size' => 'Grandeso (bites)',
 'listfiles_description' => 'Deskriptione',
 
 # File description page
 'filehist-user' => 'Usere',
-'imagelinks'    => 'Linkes',
+'imagelinks' => 'Linkes',
 
 # Random page
 'randompage' => 'Arbitriari pagine',
 
-'brokenredirects'      => 'Rupteti ri-adresos',
-'brokenredirectstext'  => 'Li sekuenti ri-adresos linka a non-existanti pagines:',
+'brokenredirects' => 'Rupteti ri-adresos',
+'brokenredirectstext' => 'Li sekuenti ri-adresos linka a non-existanti pagines:',
 'brokenredirects-edit' => 'editja',
 
 'fewestrevisions' => 'Artikles kun minim multi revisiones',
 
 # Miscellaneous special pages
-'ncategories'             => '$1 {{PLURAL:$1|kategorie|kategories}}',
-'lonelypages'             => 'Pagines kel non bli kupla',
-'lonelypagestext'         => 'Disi pagines non es kuplat fro altri pagines in {{SITENAME}}.',
-'uncategorizedpages'      => 'Pagines sin kategorie',
+'ncategories' => '$1 {{PLURAL:$1|kategorie|kategories}}',
+'lonelypages' => 'Pagines kel non bli kupla',
+'lonelypagestext' => 'Disi pagines non es kuplat fro altri pagines in {{SITENAME}}.',
+'uncategorizedpages' => 'Pagines sin kategorie',
 'uncategorizedcategories' => 'Kategories sin kategorie',
-'uncategorizedimages'     => 'Imajes sin kategorie',
-'popularpages'            => 'Popular pagines',
-'mostcategories'          => 'Artikles kun maxim multi kategories',
-'mostrevisions'           => 'Artikles kun maxim multi revisiones',
-'shortpages'              => 'Kurti pagines',
-'longpages'               => 'Longi pagines',
-'deadendpages'            => 'Pagines sin kuplures',
-'listusers'               => 'Liste de useres',
-'newpages'                => 'Novi pagines',
-'ancientpages'            => 'Maxim ansieni pagines',
-'move'                    => 'Mova',
-'movethispage'            => 'Mova (rinomisa) disi pagine',
+'uncategorizedimages' => 'Imajes sin kategorie',
+'popularpages' => 'Popular pagines',
+'mostcategories' => 'Artikles kun maxim multi kategories',
+'mostrevisions' => 'Artikles kun maxim multi revisiones',
+'shortpages' => 'Kurti pagines',
+'longpages' => 'Longi pagines',
+'deadendpages' => 'Pagines sin kuplures',
+'listusers' => 'Liste de useres',
+'newpages' => 'Novi pagines',
+'ancientpages' => 'Maxim ansieni pagines',
+'move' => 'Mova',
+'movethispage' => 'Mova (rinomisa) disi pagine',
 
 # Book sources
-'booksources'               => 'Libral fontes',
+'booksources' => 'Libral fontes',
 'booksources-search-legend' => 'Sercha libral fontes',
-'booksources-go'            => 'Vada',
+'booksources-go' => 'Vada',
 
 # Special:Log
 'specialloguserlabel' => 'Usere:',
 
 # Special:AllPages
-'allpages'          => 'Omni pagines',
-'alphaindexline'    => '$1 a $2',
-'allarticles'       => 'Omni artikles',
-'allinnamespace'    => 'Omni pagines ($1 nome-spatie)',
+'allpages' => 'Omni pagines',
+'alphaindexline' => '$1 a $2',
+'allarticles' => 'Omni artikles',
+'allinnamespace' => 'Omni pagines ($1 nome-spatie)',
 'allnotinnamespace' => 'Omni pagines (non in $1 nome-spatie)',
-'allpagesprev'      => 'Antei',
-'allpagesnext'      => 'Sekuenti',
-'allpagessubmit'    => 'Vada',
+'allpagesprev' => 'Antei',
+'allpagesnext' => 'Sekuenti',
+'allpagessubmit' => 'Vada',
 
 # Special:Categories
-'categories'         => 'Kategories',
+'categories' => 'Kategories',
 'categoriespagetext' => 'Li sekuenti {{PLURAL:$1|kategorie|kategories}} exista in li wiki.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
@@ -345,39 +345,39 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'linksearch-ok' => 'Sercha',
 
 # Watchlist
-'watchlist'       => 'Men liste de observos',
-'mywatchlist'     => 'Men liste de observos',
-'nowatchlist'     => 'Vu have nuli koses in vun liste de observos.',
-'watchnologin'    => 'Non ensignatat',
-'addedwatchtext'  => "Li pagine \"[[:\$1]]\" ha bli adi a vun [[Special:Watchlist|observa-liste]].
+'watchlist' => 'Men liste de observos',
+'mywatchlist' => 'Men liste de observos',
+'nowatchlist' => 'Vu have nuli koses in vun liste de observos.',
+'watchnologin' => 'Non ensignatat',
+'addedwatchtext' => "Li pagine \"[[:\$1]]\" ha bli adi a vun [[Special:Watchlist|observa-liste]].
 Futuri chanjos a disi pagine e lun asosiati Parla-pagine sal bli lista tilok, e li pagine sal apari '''diki''' in li [[Special:RecentChanges|liste de resenti chanjos]] por ke on trova lu plu fasilim.
 
 Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserva\" in li lateral kolumne.",
-'watch'           => 'Observa',
-'watchthispage'   => 'Observa disi pagine',
-'unwatch'         => 'Desobserva',
+'watch' => 'Observa',
+'watchthispage' => 'Observa disi pagine',
+'unwatch' => 'Desobserva',
 'unwatchthispage' => 'Des-observa disi pagine',
 
-'changed'            => 'chanjati',
+'changed' => 'chanjati',
 'enotif_lastvisited' => 'Regarda $1 por vida omni chanjes depos vun lasti visite.',
 
 # Delete
-'confirm'         => 'Konfirma',
-'excontent'       => "kontenaje esed: '$1'",
+'confirm' => 'Konfirma',
+'excontent' => "kontenaje esed: '$1'",
 'excontentauthor' => "kontenaje esed: '$1' (e li soli kontribuere esed '[[Special:Contributions/$2|$2]]')",
-'exblank'         => 'pagine esed vakui',
-'actioncomplete'  => 'Akto kompleti',
-'dellogpage'      => 'Loge de ekartos',
-'dellogpagetext'  => 'Subu es liste del maxim resenti ekartos.',
-'deletionlog'     => 'registre de ekartos',
-'deletecomment'   => 'Resone:',
+'exblank' => 'pagine esed vakui',
+'actioncomplete' => 'Akto kompleti',
+'dellogpage' => 'Loge de ekartos',
+'dellogpagetext' => 'Subu es liste del maxim resenti ekartos.',
+'deletionlog' => 'registre de ekartos',
+'deletecomment' => 'Resone:',
 
 # Rollback
 'revertpage' => 'Riverted modifikos da [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]]); restaurad lasti versione da [[User:$1|$1]]',
 
 # Protect
-'prot_1movedto2'      => '[[$1]] movat a [[$2]]',
-'protect-legend'      => 'Konfirma protektione',
+'prot_1movedto2' => '[[$1]] movat a [[$2]]',
+'protect-legend' => 'Konfirma protektione',
 'protect-level-sysop' => 'Sisopes nur',
 
 # Namespace form on various pages
@@ -385,64 +385,64 @@ Si vu voli plu tardim ekarta li pagine fro vun observa-liste, klikta \"Desobserv
 
 # Contributions
 'contributions' => 'Useren kontributiones',
-'mycontris'     => 'Men kontributiones',
+'mycontris' => 'Men kontributiones',
 
 'sp-contributions-newbies' => 'Montra kontributiones nur de novi useres',
-'sp-contributions-talk'    => 'Diskusione',
-'sp-contributions-search'  => 'Sercha kontributiones',
-'sp-contributions-submit'  => 'Sercha',
+'sp-contributions-talk' => 'Diskusione',
+'sp-contributions-search' => 'Sercha kontributiones',
+'sp-contributions-submit' => 'Sercha',
 
 # What links here
-'whatlinkshere'       => 'Tum kel kupla hir',
-'whatlinkshere-page'  => 'Pagine:',
+'whatlinkshere' => 'Tum kel kupla hir',
+'whatlinkshere-page' => 'Pagine:',
 'whatlinkshere-links' => '← linkes',
 
 # Block/unblock
-'ipbreason'    => 'Resone:',
+'ipbreason' => 'Resone:',
 'badipaddress' => 'Non-valid IP adrese',
 'contribslink' => 'Kontributiones',
 
 # Move page
-'movearticle'             => 'Mova pagine',
-'movenologin'             => 'Non ensignatat',
-'move-watch'              => 'Observa disi pagine',
-'movedto'                 => 'movat a',
-'movereason'              => 'Resone:',
-'delete_and_move'         => 'Ekarta e mova',
+'movearticle' => 'Mova pagine',
+'movenologin' => 'Non ensignatat',
+'move-watch' => 'Observa disi pagine',
+'movedto' => 'movat a',
+'movereason' => 'Resone:',
+'delete_and_move' => 'Ekarta e mova',
 'delete_and_move_confirm' => 'Yes, ekarta li pagine',
-'delete_and_move_reason'  => 'Ekartat por fa spatie por movo "[[$1]]"',
+'delete_and_move_reason' => 'Ekartat por fa spatie por movo "[[$1]]"',
 
 # Namespace 8 related
-'allmessages'        => 'Sisteme mesajes',
-'allmessagesname'    => 'Nome',
+'allmessages' => 'Sisteme mesajes',
+'allmessagesname' => 'Nome',
 'allmessagesdefault' => 'Non-spesifikati texte',
 'allmessagescurrent' => 'Nuni texte',
-'allmessagestext'    => 'Dise es liste de sistemen mesajes obtenabli in li MediaWiki nomal spatie.',
+'allmessagestext' => 'Dise es liste de sistemen mesajes obtenabli in li MediaWiki nomal spatie.',
 
 # Tooltip help for the actions
-'tooltip-pt-mytalk'      => 'Vun parla-pagine',
+'tooltip-pt-mytalk' => 'Vun parla-pagine',
 'tooltip-pt-preferences' => 'Men preferos',
-'tooltip-pt-logout'      => 'Eksignata',
-'tooltip-p-logo'         => 'Chefi pagine',
+'tooltip-pt-logout' => 'Eksignata',
+'tooltip-p-logo' => 'Chefi pagine',
 
 # Special:NewFiles
 'ilsubmit' => 'Sercha',
-'bydate'   => 'segun date',
+'bydate' => 'segun date',
 
 # EXIF tags
-'exif-imagewidth'       => 'Larjeso',
-'exif-imagelength'      => 'Alteso',
+'exif-imagewidth' => 'Larjeso',
+'exif-imagelength' => 'Alteso',
 'exif-imagedescription' => 'Title de imaje',
-'exif-imageuniqueid'    => 'Unik imaje ID',
+'exif-imageuniqueid' => 'Unik imaje ID',
 
 # Auto-summaries
 'autosumm-replace' => "Remplasant pagine kun '$1'",
 'autoredircomment' => 'Ri-adresant a [[$1]]',
-'autosumm-new'     => 'Novi pagine: $1',
+'autosumm-new' => 'Novi pagine: $1',
 
 # Special:Version
-'version'                  => 'Versione',
-'version-specialpages'     => 'Spesial pagines',
+'version' => 'Versione',
+'version-specialpages' => 'Spesial pagines',
 'version-software-version' => 'Versione',
 
 # Special:SpecialPages
index 848131a..0eca8f6 100644 (file)
@@ -60,9 +60,9 @@ $messages = array(
 'tog-previewontop' => 'Bontšha Ponopele pele ga lepokisi la diphetogo',
 'tog-previewonfirst' => 'Bontšha Ponopeleka phetogo ya pele',
 'tog-nocache' => "Thibela go tsenya matlakala go segakolodi (''cache'')",
-'tog-enotifwatchlistpages' => 'Nromele molaetša ge letlaka leo ke le tlhapetšego le eba le diphetogo',
+'tog-enotifwatchlistpages' => 'Nthomele molaetša ge letlaka leo ke le tlhapetšego le eba le diphetogo',
 'tog-enotifusertalkpages' => 'Nromele molaetša ge letlakala la Dipoledišano laka le fetoga',
-'tog-enotifminoredits' => 'Nromele email ge goba le diphetogo tše nnyenyane go matlakala',
+'tog-enotifminoredits' => 'Ethomele e-mail ge goba le diphetogo tše nnyenyane go matlakala',
 'tog-enotifrevealaddr' => 'Bonagatša email atrese go temošo tša poso',
 'tog-shownumberswatching' => 'Laetša palo bašomiši bao ba tlhapetšego',
 'tog-fancysig' => 'Tsaeno ya gose fihliwe',
@@ -195,8 +195,8 @@ $messages = array(
 'protect' => 'Lota',
 'protect_change' => 'Fetola go lotega',
 'protectthispage' => 'Lota letlakala le',
-'unprotect' => 'Tloša go lota',
-'unprotectthispage' => 'Tloša go lota letlakaleng',
+'unprotect' => 'Fetola go lota',
+'unprotectthispage' => 'Fetola go lota letlakaleng',
 'newpage' => 'Letlakala le lempsha',
 'talkpage' => 'Rêrišana ka letlakala le',
 'talkpagelinktext' => 'Bolela',
@@ -224,6 +224,7 @@ $messages = array(
 'jumpto' => 'Taboga go:',
 'jumptonavigation' => 'Tšweletšo',
 'jumptosearch' => 'fetleka',
+'pool-errorunknown' => 'Phošo yago setsebege',
 
 # 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' => 'Mabapi le {{SITENAME}}',
@@ -256,6 +257,7 @@ $messages = array(
 'youhavenewmessages' => 'O na le $1 ($2).',
 'newmessageslink' => 'ya melaetša ye mefsa',
 'newmessagesdifflink' => 'phetogo ya mafelelo',
+'newmessagesdifflinkplural' => 'l{{PLURAL:$1|Phetogo tša|Diphetogo ya}}go feta',
 'youhavenewmessagesmulti' => 'O nale melaetša ye mefsa go $1',
 'editsection' => 'lokiša',
 'editold' => 'fetola',
@@ -317,9 +319,6 @@ Bega se go  [[Special:ListUsers/sysop|administrator]], o fana ka URL.',
 'namespaceprotected' => "Ga ona tokelo ya go fetola matlakala  go  '''$1''' .",
 
 # Login and logout pages
-'welcomecreation' => "Oa amogelwa, $1! ==
-
-Tšhupaleloko (''account'') ya gago e tlhodilwe. O seke wa lebala go fetola [[Special:Preferences|{{SITENAME}} dikgetho/thato tša gago]].",
 'yourname' => 'Leina la mošomiši:',
 'yourpassword' => 'Ditlhaka-tša-siphiri:',
 'yourpasswordagain' => 'Tlanya ditlhaka-tša-siphiri gape:',
@@ -454,7 +453,8 @@ oka [[Special:Search/{{PAGENAME}}|fetleka leina la letlakala]] matlakaleng a man
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} fetleka "logs"],
  goba [{{fullurl:{{FULLPAGENAME}}|action=edit}} wa fetola letlakala le]</span>.',
 'note' => "'''Ela hloko:'''",
-'previewnote' => "'''Ye ke Taetšo ya sebopego sa letlakala fela; diphetogo ga di ya bolokwa!'''",
+'previewnote' => "'''Elelwa gore ye ke taetšo ya sebopego sa letlakala fela.'''
+Diphetogo tša gago ga šetšo di bolokwa!",
 'editing' => 'O fetola $1',
 'editingsection' => 'Phetolo ya $1 (sekgoba)',
 'editingcomment' => 'O fetola $1 (sekgao se sempsha)',
@@ -541,7 +541,7 @@ fetola tshenolo',
 'revertmerge' => 'Tloša kopaganyo',
 
 # Diffs
-'history-title' => 'Histori ya diphetogo tša "$1"',
+'history-title' => 'Poeletšo ya diphetogo tša "$1"',
 'lineno' => 'Mothalo $1:',
 'compareselectedversions' => 'Bapetša diphapang tšeo di kgethilwego',
 'editundo' => 'dirolla',
@@ -582,8 +582,6 @@ fetola tshenolo',
 'search-interwiki-caption' => 'Diprojeke tša moloko',
 'search-interwiki-default' => '$1 diphetho:',
 'search-interwiki-more' => '(gape)',
-'search-mwsuggest-enabled' => 'le dikakanyo',
-'search-mwsuggest-disabled' => 'ga go dikakanyo',
 'searchrelated' => 'tswalana',
 'searchall' => 'tšohle',
 'showingresultsheader' => "{{PLURAL:$5|Sepheto '''$1''' tša '''$3'''|Dipheto '''$1 - $2''' tša '''$3'''}} tša '''$4'''",
@@ -834,10 +832,10 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
 'booksources-go' => 'Sepela',
 
 # Special:Log
-'specialloguserlabel' => 'Mošomiši:',
-'speciallogtitlelabel' => 'Thaetlele:',
+'specialloguserlabel' => 'Modiri:',
+'speciallogtitlelabel' => 'Thaetlele (goba mošumiši):',
 'log' => "Di-''log''",
-'all-logs-page' => "Di-''log'' kamoka",
+'all-logs-page' => "Di-''log'' tša bohle ka moka",
 
 # Special:AllPages
 'allpages' => 'Matlakala ka moka',
@@ -858,7 +856,7 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
 'deletedcontributions-title' => 'Diabe tša mošomiši tšeo di phumutšwego',
 
 # Special:LinkSearch
-'linksearch' => 'Dihlomaganyo tša ntle',
+'linksearch' => 'Fehleka dihlomaganyo tša ntle',
 'linksearch-ok' => 'Fetleka',
 'linksearch-line' => '$1 e kgokaganywa gotšwa $2',
 
@@ -875,9 +873,9 @@ Matlakala ago ba [[Special:Watchlist|lenanong la gago la matlakala ditlhapetšo]
 'emailuser' => 'Romela mošomiši yo molaetša',
 'emailpage' => 'Romela email go mošomiši',
 'noemailtitle' => 'Gago email atrese',
-'emailfrom' => 'Go tšwa go',
-'emailsubject' => 'Sebolelwa',
-'emailmessage' => 'Molaetša',
+'emailfrom' => 'Go tšwa go:',
+'emailsubject' => 'Sebolelwa:',
+'emailmessage' => 'Molaetša:',
 'emailsend' => 'Romela',
 'emailccme' => 'Nromela kopi ya melaetša.',
 'emailccsubject' => 'Kopi ya molaetša wa gago goya go $1: $2',
@@ -905,11 +903,7 @@ Ga eba o nyaka go hloša letlaka le go lenano la ditlhapetšo tša gago, šomiš
 'unwatching' => 'Tlhapetšo eya tlošwa ...',
 
 'enotif_reset' => 'Swaya matlakala kamoka awe oa etetšego',
-'enotif_newpagetext' => 'Le, ke letlakala le lempsha.',
 'enotif_impersonal_salutation' => '{{SITENAME}} mošumiši',
-'changed' => 'fetotšwe',
-'created' => 'tlhodilwe',
-'enotif_subject' => '{{SITENAME}} letkalala $PAGETITLE le $CHANGEDORCREATED ke $PAGEEDITOR',
 'enotif_lastvisited' => 'Lebelela  $1 go bona diphetogo ka moka gotloga ge go tsena la mafelelo.',
 'enotif_lastdiff' => 'Bona $1 go nyakorela phetogo ye.',
 
@@ -931,7 +925,7 @@ Lebelela $2 go hweetša sedi ka diphulo tša bjale.',
 
 # Rollback
 'rollbacklink' => 'bošetša morago',
-'editcomment' => "Ahlaahlo ya phetogo ke : \"''\$1''\".",
+'editcomment' => "Ahlaahlo ya phetogo e bile : \"''\$1''\".",
 
 # Protect
 'protectlogpage' => "''Log'' yago lota",
@@ -955,7 +949,7 @@ Seemo sa go lota ga letlakala '''$1''':",
 'protect-expiring' => 'fetatšatši ke $1 (UTC)',
 'protect-cascade' => 'Lota matlakala, akaretša le letlakala le (go lota ka kakaretšo)',
 'protect-cantedit' => 'Ga o kgone go fetola tekano ya bolotego letlakaleng le, ka ge o sena tumello yago bofetola.',
-'protect-expiry-options' => '2 diiri:2 hours,1 letšatši:1 day,3 matšatši:3 days,1 beke:1 week,2 dibeke:2 weeks,1 kgwedi:1 month,3 digkwedi:3 months,6 dikgwedi:6 months,1 ngwaga:1 year,ga efele:infinite',
+'protect-expiry-options' => 'iri:1 hour, letšatš1:1 day,beke:1 week,dibeke tše 2:2 weeks,kgwedi:1 month,dikgwedi tše 3:3 months,dikgwedi tše 6:6 months,ngwaga:1 year,gosefele (infinite):infinite',
 'restriction-type' => 'Tumello:',
 'restriction-level' => 'Seemo sago Lota:',
 
@@ -991,7 +985,7 @@ Seemo sa go lota ga letlakala '''$1''':",
 'sp-contributions-newbies' => 'Laetša diabe tša bašumiši ba bafsa fela',
 'sp-contributions-newbies-sub' => 'Tša tšhupaleloko tše mphsa',
 'sp-contributions-blocklog' => "''Log'' yago thiba",
-'sp-contributions-deleted' => 'Diabe tša mošomiši tšeo di phumutšwego',
+'sp-contributions-deleted' => 'diabe tša mošomiši tšeo di phumutšwego',
 'sp-contributions-uploads' => 'di-"upload"',
 'sp-contributions-logs' => "Di-''log''",
 'sp-contributions-talk' => 'Poledišano',
index 9ca3c85..5a17c91 100644 (file)
@@ -35,190 +35,190 @@ $datePreferences = false;
 
 $messages = array(
 # Dates
-'sunday'        => 'Damóogo',
-'monday'        => 'Damóo biiskání',
-'tuesday'       => 'Damóodóó naakiską́o',
-'wednesday'     => 'Damóodóó tágí jį́',
-'thursday'      => "Damóodóó dį́į́' yiską́o",
-'friday'        => "Nda'iiníísh",
-'saturday'      => 'Yiską́ damóo',
-'january'       => 'Yas Niłtʼees',
-'february'      => 'Atsá Biyáázh',
-'march'         => 'Wóózhchʼį́į́d',
-'april'         => 'Tʼą́ą́chil',
-'may_long'      => 'Tʼą́ą́tsoh',
-'june'          => 'Yaʼiishjááshchilí',
-'july'          => 'Yaʼiishjáástsoh',
-'august'        => 'Biniʼantʼą́ą́tsʼózí',
-'september'     => 'Biniʼantʼą́ą́tsoh',
-'october'       => 'Ghąąjį',
-'november'      => 'Níłchʼitsʼósí',
-'december'      => 'Níłchʼitsoh',
-'january-gen'   => 'Yas Niłtʼees',
-'february-gen'  => 'Atsá Biyáázh',
-'march-gen'     => 'Wóózhchʼį́į́d',
-'april-gen'     => 'Tʼą́ą́chil',
-'may-gen'       => 'Tʼą́ą́tsoh',
-'june-gen'      => 'Yaʼiishjááshchilí',
-'july-gen'      => 'Yaʼiishjáástsoh',
-'august-gen'    => 'Biniʼantʼą́ą́tsʼózí',
+'sunday' => 'Damóogo',
+'monday' => 'Damóo biiskání',
+'tuesday' => 'Damóodóó naakiską́o',
+'wednesday' => 'Damóodóó tágí jį́',
+'thursday' => "Damóodóó dį́į́' yiską́o",
+'friday' => "Nda'iiníísh",
+'saturday' => 'Yiską́ damóo',
+'january' => 'Yas Niłtʼees',
+'february' => 'Atsá Biyáázh',
+'march' => 'Wóózhchʼį́į́d',
+'april' => 'Tʼą́ą́chil',
+'may_long' => 'Tʼą́ą́tsoh',
+'june' => 'Yaʼiishjááshchilí',
+'july' => 'Yaʼiishjáástsoh',
+'august' => 'Biniʼantʼą́ą́tsʼózí',
+'september' => 'Biniʼantʼą́ą́tsoh',
+'october' => 'Ghąąjį',
+'november' => 'Níłchʼitsʼósí',
+'december' => 'Níłchʼitsoh',
+'january-gen' => 'Yas Niłtʼees',
+'february-gen' => 'Atsá Biyáázh',
+'march-gen' => 'Wóózhchʼį́į́d',
+'april-gen' => 'Tʼą́ą́chil',
+'may-gen' => 'Tʼą́ą́tsoh',
+'june-gen' => 'Yaʼiishjááshchilí',
+'july-gen' => 'Yaʼiishjáástsoh',
+'august-gen' => 'Biniʼantʼą́ą́tsʼózí',
 'september-gen' => 'Biniʼantʼą́ą́tsoh',
-'october-gen'   => 'Ghąąjį',
-'november-gen'  => 'Níłchʼitsʼósí',
-'december-gen'  => 'Níłchʼitsoh',
-'jan'           => 'Ynts',
-'feb'           => 'Atsb',
-'mar'           => 'Wozh',
-'apr'           => 'Tchi',
-'may'           => 'Ttso',
-'jun'           => 'Yjsh',
-'jul'           => 'Yjts',
-'aug'           => 'Btsz',
-'sep'           => 'Btsx',
-'oct'           => 'Ghąj',
-'nov'           => 'Ntss',
-'dec'           => 'Ntsx',
+'october-gen' => 'Ghąąjį',
+'november-gen' => 'Níłchʼitsʼósí',
+'december-gen' => 'Níłchʼitsoh',
+'jan' => 'Ynts',
+'feb' => 'Atsb',
+'mar' => 'Wozh',
+'apr' => 'Tchi',
+'may' => 'Ttso',
+'jun' => 'Yjsh',
+'jul' => 'Yjts',
+'aug' => 'Btsz',
+'sep' => 'Btsx',
+'oct' => 'Ghąj',
+'nov' => 'Ntss',
+'dec' => 'Ntsx',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Naaltsoos biiʼ sinilí|Naaltsoos biiʼ sinilí}}',
-'category_header'        => 'Naaltsoos biiʼ sinilí "$1" biyiʼ dahólónígíí',
-'subcategories'          => 'Hanálzhoʼí',
-'hidden-categories'      => '{{PLURAL:$1|Naaltsoos biiʼ sinilí (doo yitʼínii)|Naaltsoos biiʼ sinilí (doo yitʼínii)}}',
-'category-subcat-count'  => '{{PLURAL:$2|1 Hanálzhoʼí.|{{PLURAL:$1|1 Hanálzhoʼí|$2 Hanálzhoʼí}} - ($1).}}',
+'pagecategories' => '{{PLURAL:$1|Naaltsoos biiʼ sinilí|Naaltsoos biiʼ sinilí}}',
+'category_header' => 'Naaltsoos biiʼ sinilí "$1" biyiʼ dahólónígíí',
+'subcategories' => 'Hanálzhoʼí',
+'hidden-categories' => '{{PLURAL:$1|Naaltsoos biiʼ sinilí (doo yitʼínii)|Naaltsoos biiʼ sinilí (doo yitʼínii)}}',
+'category-subcat-count' => '{{PLURAL:$2|1 Hanálzhoʼí.|{{PLURAL:$1|1 Hanálzhoʼí|$2 Hanálzhoʼí}} - ($1).}}',
 'category-article-count' => "{{PLURAL:$2|'''1 naaltsoos''' díí naaltsoos biiʼ sinilí biyiʼ hólǫ.|{{PLURAL:$2|'''1 naaltsoos''' díí naaltsoos biiʼ sinilí biyiʼ hólǫ|'''$2 naaltsoos''' díí naaltsoos biiʼ sinilí biyiʼ dahólǫ}} - ($1)}}",
 'listingcontinuesabbrev' => 'nááná...',
 
-'cancel'     => 'tʼóó ánássįįh',
-'mytalk'     => 'haneʼ shichʼįʼ ályaaígíí',
+'cancel' => 'tʼóó ánássįįh',
+'mytalk' => 'haneʼ shichʼįʼ ályaaígíí',
 'navigation' => 'naaltsoosígíí',
 
-'errorpagetitle'   => 'adziih',
-'tagline'          => "''{{SITENAME}}'' bitsʼą́ą́dę́ę́ʼ",
-'help'             => 'Anáʼálwoʼ',
-'search'           => 'hanishtá nisin',
-'searchbutton'     => 'tʼáá yíní átʼéegi',
-'searcharticle'    => 'díí saad tʼéiyá',
-'history'          => 'łahgo ályaaígíí',
-'history_short'    => 'łahgo ályaaígíí',
+'errorpagetitle' => 'adziih',
+'tagline' => "''{{SITENAME}}'' bitsʼą́ą́dę́ę́ʼ",
+'help' => 'Anáʼálwoʼ',
+'search' => 'hanishtá nisin',
+'searchbutton' => 'tʼáá yíní átʼéegi',
+'searcharticle' => 'díí saad tʼéiyá',
+'history' => 'łahgo ályaaígíí',
+'history_short' => 'łahgo ályaaígíí',
 'printableversion' => '"Print" áshłééh nisin',
-'permalink'        => 'Díí naaltsoos bi-"url"',
-'edit'             => 'Łahgo áshłééh',
-'create'           => 'áshłééh nisin',
-'editthispage'     => 'díí naaltsoos łahgo áshłééh',
-'delete'           => 'sisxé (delete)',
-'protect'          => "bich'ą́ą́h iishááh nisin (protect)",
-'newpage'          => 'Naaltsoos ániidí',
-'talkpage'         => 'díí kweʼé naaltsoos baa yáshtiʼ nisin',
+'permalink' => 'Díí naaltsoos bi-"url"',
+'edit' => 'Łahgo áshłééh',
+'create' => 'áshłééh nisin',
+'editthispage' => 'díí naaltsoos łahgo áshłééh',
+'delete' => 'sisxé (delete)',
+'protect' => "bich'ą́ą́h iishááh nisin (protect)",
+'newpage' => 'Naaltsoos ániidí',
+'talkpage' => 'díí kweʼé naaltsoos baa yáshtiʼ nisin',
 'talkpagelinktext' => 'bichʼįʼ yáshtiʼ',
-'specialpage'      => 'Naaltsoos spéshelígíí',
-'personaltools'    => 'bee naashnishí',
-'talk'             => 'baa yáshtiʼ nisin',
-'views'            => 'naaltsoosígíí',
-'toolbox'          => 'bee naʼanishí',
-'otherlanguages'   => 'saad',
-'redirectedfrom'   => '("$1"dę́ę́ʼ)',
-'redirectpagesub'  => 'dah astsihígíí',
-'lastmodifiedat'   => 'Díí naaltsoos $1/$2 łahgo ályaa.',
+'specialpage' => 'Naaltsoos spéshelígíí',
+'personaltools' => 'bee naashnishí',
+'talk' => 'baa yáshtiʼ nisin',
+'views' => 'naaltsoosígíí',
+'toolbox' => 'bee naʼanishí',
+'otherlanguages' => 'saad',
+'redirectedfrom' => '("$1"dę́ę́ʼ)',
+'redirectpagesub' => 'dah astsihígíí',
+'lastmodifiedat' => 'Díí naaltsoos $1/$2 łahgo ályaa.',
 
 # 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}} baa haneʼ',
-'aboutpage'            => 'Project: baa haneʼ',
-'copyright'            => 'Díí naaltsoos bikáaʼgi saad shijaaʼígíí "$1" beehazʼą́ąnii bikʼehgo choidííłįįł',
-'edithelp'             => 'anáʼálwoʼ',
-'edithelppage'         => 'Help:Haitʼéegoshąʼ naaltsoos łahgo áshłééh?',
-'helppage'             => 'Help:Bee hadítʼéhígíí',
-'mainpage'             => 'Íiyisíí Naaltsoos',
+'aboutsite' => '{{SITENAME}} baa haneʼ',
+'aboutpage' => 'Project: baa haneʼ',
+'copyright' => 'Díí naaltsoos bikáaʼgi saad shijaaʼígíí "$1" beehazʼą́ąnii bikʼehgo choidííłįįł',
+'edithelp' => 'anáʼálwoʼ',
+'edithelppage' => 'Help:Haitʼéegoshąʼ naaltsoos łahgo áshłééh?',
+'helppage' => 'Help:Bee hadítʼéhígíí',
+'mainpage' => 'Íiyisíí Naaltsoos',
 'mainpage-description' => 'Íiyisíí Naaltsoos',
 
-'retrievedfrom'      => '"$1" bitsʼą́ą́dę́ę́ʼ',
+'retrievedfrom' => '"$1" bitsʼą́ą́dę́ę́ʼ',
 'youhavenewmessages' => 'Háíshį́į́ $1 nichʼįʼ áyiilaa. <small>($2)</small>',
-'newmessageslink'    => 'haneʼ ániidígíí',
-'editsection'        => 'łahgo áshłééh',
-'editold'            => 'łahgo áshłééh',
-'editlink'           => 'łahgo áshłééh',
-'viewsourcelink'     => 'XML yishʼį́ nisin',
-'toc'                => 'bikáaʼgi hólónígíí',
-'showtoc'            => 'yishʼį́ nisin',
-'hidetoc'            => 'doo yishʼį́ nisin da',
-'site-rss-feed'      => '$1 biRSS Feed',
-'site-atom-feed'     => '$1 biAtom Feed',
-'page-rss-feed'      => '"$1" biRSS Feed',
-'page-atom-feed'     => '"$1" biAtom Feed',
-'red-link-title'     => '$1 (ádin)',
+'newmessageslink' => 'haneʼ ániidígíí',
+'editsection' => 'łahgo áshłééh',
+'editold' => 'łahgo áshłééh',
+'editlink' => 'łahgo áshłééh',
+'viewsourcelink' => 'XML yishʼį́ nisin',
+'toc' => 'bikáaʼgi hólónígíí',
+'showtoc' => 'yishʼį́ nisin',
+'hidetoc' => 'doo yishʼį́ nisin da',
+'site-rss-feed' => '$1 biRSS Feed',
+'site-atom-feed' => '$1 biAtom Feed',
+'page-rss-feed' => '"$1" biRSS Feed',
+'page-atom-feed' => '"$1" biAtom Feed',
+'red-link-title' => '$1 (ádin)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'naaltsoos',
-'nstab-user'      => 'choyoołʼįįhí binaaltsoos',
-'nstab-special'   => 'Naaltsoos spéshelígíí',
-'nstab-project'   => 'wikiibíídiiya binaaltsoos',
-'nstab-image'     => 'eʼelyaaígíí',
+'nstab-main' => 'naaltsoos',
+'nstab-user' => 'choyoołʼįįhí binaaltsoos',
+'nstab-special' => 'Naaltsoos spéshelígíí',
+'nstab-project' => 'wikiibíídiiya binaaltsoos',
+'nstab-image' => 'eʼelyaaígíí',
 'nstab-mediawiki' => 'haneʼ',
-'nstab-template'  => 'bee álnééhí',
-'nstab-help'      => 'anáʼálwoʼ',
-'nstab-category'  => 'Naaltsoos biiʼ sinilí',
+'nstab-template' => 'bee álnééhí',
+'nstab-help' => 'anáʼálwoʼ',
+'nstab-category' => 'Naaltsoos biiʼ sinilí',
 
 # General errors
 'missingarticle-rev' => '(łahgo ályaaígíí #$1)',
-'viewsource'         => 'XML yishʼį́ nisin',
+'viewsource' => 'XML yishʼį́ nisin',
 
 # Login and logout pages
-'yourname'                => 'Choyoołʼįįhí bizhiʼ:',
-'yourpassword'            => 'Passwordígíí:',
-'remembermypassword'      => 'shipassword béédíínih (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'yourname' => 'Choyoołʼįįhí bizhiʼ:',
+'yourpassword' => 'Passwordígíí:',
+'remembermypassword' => 'shipassword béédíínih (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'nav-login-createaccount' => 'Log in / accountígíí ádíílííł',
-'nologinlink'             => 'Accountígíí ádíílííł',
-'mailmypassword'          => 'passwordígíí ániidí shichʼįʼ ádíílííł (e-mail)',
+'nologinlink' => 'Accountígíí ádíílííł',
+'mailmypassword' => 'passwordígíí ániidí shichʼįʼ ádíílííł (e-mail)',
 
 # Edit page toolbar
-'link_sample'    => 'Linkígíí',
+'link_sample' => 'Linkígíí',
 'extlink_sample' => 'http://www.example.com linkígíí',
 
 # Edit pages
-'minoredit'              => 'tʼáá áłtsʼíísígo tʼéiyá naaltsoos łahgo áshłaa',
-'watchthis'              => 'shinááł nisin',
-'savearticle'            => '✔ bee lą́ ashłeeh',
-'preview'                => 'dooleełígíí',
-'showpreview'            => 'dooleełígíí yishʼį́ nisin',
-'showdiff'               => 'łahgo áshłaaígíí yishʼį́ nisin',
-'anoneditwarning'        => "<div style=\"background:#aaddff; text-align:center;\">'''Doo \"login\" íinilaa da.''' Éí biniinaa nizhiʼ doo ééhozin da áádóó ni-''IP'' naaltsoos bikááʼ náázhdíyóosoh.<br /><small>('''You are not logged in.''' Your name is thus unknown, and your IP will be recorded.)</small></div>",
-'newarticle'             => '(Naaltsoos ániidí)',
-'previewnote'            => "'''Díí kweʼé éí \"dooleełígíí\" tʼéiyá átʼé!'''
+'minoredit' => 'tʼáá áłtsʼíísígo tʼéiyá naaltsoos łahgo áshłaa',
+'watchthis' => 'shinááł nisin',
+'savearticle' => '✔ bee lą́ ashłeeh',
+'preview' => 'dooleełígíí',
+'showpreview' => 'dooleełígíí yishʼį́ nisin',
+'showdiff' => 'łahgo áshłaaígíí yishʼį́ nisin',
+'anoneditwarning' => "<div style=\"background:#aaddff; text-align:center;\">'''Doo \"login\" íinilaa da.''' Éí biniinaa nizhiʼ doo ééhozin da áádóó ni-''IP'' naaltsoos bikááʼ náázhdíyóosoh.<br /><small>('''You are not logged in.''' Your name is thus unknown, and your IP will be recorded.)</small></div>",
+'newarticle' => '(Naaltsoos ániidí)',
+'previewnote' => "'''Díí kweʼé éí \"dooleełígíí\" tʼéiyá átʼé!'''
 ::<small>'''(This is only a preview.)'''</small>",
-'editing'                => '"$1" łahgo áshłééh...',
-'templatesused'          => '"bee álnééhé" naaltsoos bikáaʼgi hólǫ́:',
-'templatesusedpreview'   => '"bee álnééhé" naaltsoos bikáaʼgi dooleełígíí:',
-'template-protected'     => '(administratorsígíí tʼéiyá)',
+'editing' => '"$1" łahgo áshłééh...',
+'templatesused' => '"bee álnééhé" naaltsoos bikáaʼgi hólǫ́:',
+'templatesusedpreview' => '"bee álnééhé" naaltsoos bikáaʼgi dooleełígíí:',
+'template-protected' => '(administratorsígíí tʼéiyá)',
 'template-semiprotected' => '(chodayoołʼįįhí doo ééhozinii díí naaltsoos doo łahgo ádayóleʼ átʼée da)',
-'hiddencategories'       => 'Díí kweʼé naaltsoos éí {{PLURAL:$1|1 Naaltsoos biiʼ sinilí (doo yitʼínii)|$1 Naaltsoos biiʼ sinilí (doo yitʼínii)}} yiiʼ siʼą́:',
+'hiddencategories' => 'Díí kweʼé naaltsoos éí {{PLURAL:$1|1 Naaltsoos biiʼ sinilí (doo yitʼínii)|$1 Naaltsoos biiʼ sinilí (doo yitʼínii)}} yiiʼ siʼą́:',
 
 # History pages
-'viewpagelogs'        => 'logsígíí yishʼį́ nisin',
-'nohistory'           => '"łahgo ályaaígíí" doo hólǫ́ǫ da/ádin.',
-'currentrev-asof'     => 'kʼadígíí ($1)',
-'revisionasof'        => '$1 yę́ędą́ą́ʼ',
+'viewpagelogs' => 'logsígíí yishʼį́ nisin',
+'nohistory' => '"łahgo ályaaígíí" doo hólǫ́ǫ da/ádin.',
+'currentrev-asof' => 'kʼadígíí ($1)',
+'revisionasof' => '$1 yę́ędą́ą́ʼ',
 'currentrevisionlink' => 'kʼadígíí',
-'cur'                 => 'kʼadígíí',
-'histfirst'           => 'bee hodeeshzhiizh',
-'histlast'            => 'bee nihoolʼá',
+'cur' => 'kʼadígíí',
+'histfirst' => 'bee hodeeshzhiizh',
+'histlast' => 'bee nihoolʼá',
 
 # Revision deletion
 'rev-delundel' => 'yishʼį́ nisin/doo yishʼį́ nisin da',
 
 # Diffs
 'history-title' => 'łahgo ályaaígíí: "$1"',
-'editundo'      => 'ńdíídleeł!',
+'editundo' => 'ńdíídleeł!',
 
 # Search results
-'searchresulttext'      => '{{SITENAME}} bikáaʼgi haʼnitáhígíí bíhoołʼaahgo biniiyé [[{{MediaWiki:Helppage}}|{{int:help}}]] yidíiłtah.',
-'searchsubtitle'        => '\'\'\'[[:$1]]\'\'\' hanínítą́ą́ʼ ([[Special:Prefixindex/$1|naaltsoos "$1" wolyéhígíí tʼáá ałtso]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" baa atiinígíí tʼáá ałtso]])',
+'searchresulttext' => '{{SITENAME}} bikáaʼgi haʼnitáhígíí bíhoołʼaahgo biniiyé [[{{MediaWiki:Helppage}}|{{int:help}}]] yidíiłtah.',
+'searchsubtitle' => '\'\'\'[[:$1]]\'\'\' hanínítą́ą́ʼ ([[Special:Prefixindex/$1|naaltsoos "$1" wolyéhígíí tʼáá ałtso]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|"$1" baa atiinígíí tʼáá ałtso]])',
 'searchsubtitleinvalid' => "'''$1''' hanínítą́ą́ʼ",
-'notitlematches'        => 'naaltsoos ádin',
-'viewprevnext'          => '($1) ($2) ($3) shinááł',
-'search-result-size'    => '$1 ({{PLURAL:$2|1 saad bikáaʼgi hólǫ́|$2 saad bikáaʼgi dahólǫ́}})',
-'search-redirect'       => '("$1"dę́ę́ʼ)',
-'search-suggest'        => '"$1" hainítáásh shį́į́?',
+'notitlematches' => 'naaltsoos ádin',
+'viewprevnext' => '($1) ($2) ($3) shinááł',
+'search-result-size' => '$1 ({{PLURAL:$2|1 saad bikáaʼgi hólǫ́|$2 saad bikáaʼgi dahólǫ́}})',
+'search-redirect' => '("$1"dę́ę́ʼ)',
+'search-suggest' => '"$1" hainítáásh shį́į́?',
 'search-interwiki-more' => '(nááná...)',
-'powersearch-redir'     => 'dah astsihígíí yishʼį́ nisin.',
+'powersearch-redir' => 'dah astsihígíí yishʼį́ nisin.',
 
 # Preferences page
 'mypreferences' => 'siłkidígíí',
@@ -229,51 +229,51 @@ $messages = array(
 'grouppage-sysop' => '{{ns:project}}:Administratorsígíí',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|łahgo ályaaígíí|łahgo ályaaígíí}}',
-'recentchanges'                  => 'Áníídí łahgo ályaaígíí',
+'nchanges' => '$1 {{PLURAL:$1|łahgo ályaaígíí|łahgo ályaaígíí}}',
+'recentchanges' => 'Áníídí łahgo ályaaígíí',
 'recentchanges-feed-description' => 'áníídí łahgo ályaaígíí',
-'rcnote'                         => "{{PLURAL:$2|jį́į́dą́ą́ʼ |}} {{PLURAL:$1|'''1''' łahgo ályaaígíí tʼéiyá|'''$1''' łahgo ályaaígíí}}, {{PLURAL:$2||'''$2di''' yiskánídą́ą́ʼ kojįʼ, }} ($5, $4)",
-'rcshowhideminor'                => 'naaltsoos tʼáá áłtsʼíísígo łahgo ályaaígíí $1',
-'rcshowhidebots'                 => "''bots''ígíí $1",
-'rcshowhideliu'                  => 'chodayoołʼįįhí ééhozinígíí $1',
-'rcshowhideanons'                => 'chodayoołʼįįhí doo ééhozinii (IP) $1',
-'rcshowhidemine'                 => 'akʼeʼshełchínígíí $1',
-'rclinks'                        => '*($1) łahgo ályaaígíí
+'rcnote' => "{{PLURAL:$2|jį́į́dą́ą́ʼ |}} {{PLURAL:$1|'''1''' łahgo ályaaígíí tʼéiyá|'''$1''' łahgo ályaaígíí}}, {{PLURAL:$2||'''$2di''' yiskánídą́ą́ʼ kojįʼ, }} ($5, $4)",
+'rcshowhideminor' => 'naaltsoos tʼáá áłtsʼíísígo łahgo ályaaígíí $1',
+'rcshowhidebots' => "''bots''ígíí $1",
+'rcshowhideliu' => 'chodayoołʼįįhí ééhozinígíí $1',
+'rcshowhideanons' => 'chodayoołʼįįhí doo ééhozinii (IP) $1',
+'rcshowhidemine' => 'akʼeʼshełchínígíí $1',
+'rclinks' => '*($1) łahgo ályaaígíí
 *($2) yiskánídą́ą́ʼ kojįʼ <br />
 $3',
-'hist'                           => 'łgá',
-'hide'                           => 'doo yishʼį́ nisin da.',
-'show'                           => 'yishʼį́ nisin.',
-'minoreditletter'                => 'tʼ',
-'newpageletter'                  => 'NÁ',
+'hist' => 'łgá',
+'hide' => 'doo yishʼį́ nisin da.',
+'show' => 'yishʼį́ nisin.',
+'minoreditletter' => 'tʼ',
+'newpageletter' => 'NÁ',
 
 # Recent changes linked
 'recentchangeslinked-page' => 'naaltsoos:',
 
 # Upload
-'upload'        => 'Eʼelyaaígíí biiʼ hééł áshłééh nisin',
+'upload' => 'Eʼelyaaígíí biiʼ hééł áshłééh nisin',
 'uploadedimage' => '"[[$1]]" biiʼ hééł áyiilaa',
 
 # File description page
-'filehist'            => 'łahgo ályaaígíí',
-'filehist-current'    => 'kʼadígíí',
-'filehist-thumb'      => 'thumbnailígíí',
-'filehist-thumbtext'  => 'thumbnailígíí ($1)',
-'filehist-user'       => 'Choyoołʼįįhí',
+'filehist' => 'łahgo ályaaígíí',
+'filehist-current' => 'kʼadígíí',
+'filehist-thumb' => 'thumbnailígíí',
+'filehist-thumbtext' => 'thumbnailígíí ($1)',
+'filehist-user' => 'Choyoołʼįįhí',
 'filehist-dimensions' => 'naaniigo/náásee',
-'filehist-comment'    => 'haneʼ',
-'imagelinks'          => 'naaltsoos díí kweʼé eʼelyaaígíí chodayoołʼįįhígíí',
-'linkstoimage'        => '{{PLURAL:$1|1 naaltsoos díí eʼelyaaígíí choyoołʼįįh|$1 naaltsoos díí eʼelyaaígíí chodayoołʼįįh}}:',
-'sharedupload'        => 'Díí kweʼé eʼelyaaígíí $1 bitsʼą́ą́dę́ę́ʼ.',
+'filehist-comment' => 'haneʼ',
+'imagelinks' => 'naaltsoos díí kweʼé eʼelyaaígíí chodayoołʼįįhígíí',
+'linkstoimage' => '{{PLURAL:$1|1 naaltsoos díí eʼelyaaígíí choyoołʼįįh|$1 naaltsoos díí eʼelyaaígíí chodayoołʼįįh}}:',
+'sharedupload' => 'Díí kweʼé eʼelyaaígíí $1 bitsʼą́ą́dę́ę́ʼ.',
 
 # Miscellaneous special pages
-'nbytes'       => '$1 {{PLURAL:$1|byte átʼé|bytes átʼé}}',
-'newpages'     => 'Naaltsoos ániidí',
-'move'         => 'hidishnááh nisin',
+'nbytes' => '$1 {{PLURAL:$1|byte átʼé|bytes átʼé}}',
+'newpages' => 'Naaltsoos ániidí',
+'move' => 'hidishnááh nisin',
 'movethispage' => 'díí naaltsoos hidishnááh nisin',
 
 # Special:AllPages
-'allpages'    => 'naaltsoosígíí tʼáá ałtso',
+'allpages' => 'naaltsoosígíí tʼáá ałtso',
 'allarticles' => 'naaltsoosígíí tʼáá ałtso',
 
 # Special:LinkSearch
@@ -283,96 +283,96 @@ $3',
 'emailuser' => 'E-mail bichʼįʼ áshłééh nisin',
 
 # Watchlist
-'watchlist'         => 'bikʼi déshʼį́į́ʼígíí',
-'mywatchlist'       => 'bikʼi déshʼį́į́ʼígíí',
-'addedwatchtext'    => "[[Special:Watchlist|Naaltsoos bikʼi díníʼį́į́ʼígíí]] bíhiniidééh. \"[[:\$1]]\" kʼad bikʼi díníʼį́į́ʼ.<br />Nááná [[Special:RecentChanges|\"áníídí łahgo ályaaígíí\"]] bikáaʼgi díí naaltsoos kʼad kodóó '''ditą́ą''' dooleeł.",
-'removedwatchtext'  => '"[[:$1]]" kʼad doo [[Special:Watchlist|bikʼi díníʼį́į]] da.',
-'watch'             => 'bikʼi déshʼį́į́ʼ nisin',
-'watchthispage'     => 'díí naaltsoos bikʼi déshʼį́į́ʼ nisin',
-'unwatch'           => 'doo bikʼi déshʼį́įʼ nisin da',
+'watchlist' => 'bikʼi déshʼį́į́ʼígíí',
+'mywatchlist' => 'bikʼi déshʼį́į́ʼígíí',
+'addedwatchtext' => "[[Special:Watchlist|Naaltsoos bikʼi díníʼį́į́ʼígíí]] bíhiniidééh. \"[[:\$1]]\" kʼad bikʼi díníʼį́į́ʼ.<br />Nááná [[Special:RecentChanges|\"áníídí łahgo ályaaígíí\"]] bikáaʼgi díí naaltsoos kʼad kodóó '''ditą́ą''' dooleeł.",
+'removedwatchtext' => '"[[:$1]]" kʼad doo [[Special:Watchlist|bikʼi díníʼį́į]] da.',
+'watch' => 'bikʼi déshʼį́į́ʼ nisin',
+'watchthispage' => 'díí naaltsoos bikʼi déshʼį́į́ʼ nisin',
+'unwatch' => 'doo bikʼi déshʼį́įʼ nisin da',
 'watchlist-details' => '{{PLURAL:$1|$1 naaltsoos|$1 naaltsoos}} bikʼi díníʼį́į́ʼ',
-'wlshowlast'        => '<small>
+'wlshowlast' => '<small>
 * ( $1 ) ahééʼílkidę́ędą́ą́ʼ kojįʼ
 * ( $2 ) yiskánídą́ą́ʼ kojįʼ
 * ( $3 )</small>',
 'watchlist-options' => '✔',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => '(...)',
+'watching' => '(...)',
 'unwatching' => '(...)',
 
 # Protect
-'protectedarticle'          => '"[[$1]]" bichʼą́ą́h ííyá.',
+'protectedarticle' => '"[[$1]]" bichʼą́ą́h ííyá.',
 'modifiedarticleprotection' => '"[[$1]]" biprotection level łahgo ályaa',
 
 # Namespace form on various pages
-'namespace'      => 'Naaltsoos bizhiʼ:',
-'invert'         => 'binaashii',
+'namespace' => 'Naaltsoos bizhiʼ:',
+'invert' => 'binaashii',
 'blanknamespace' => '(Íiyisíí)',
 
 # Contributions
-'contributions'       => 'akʼeʼeeshchínígíí',
+'contributions' => 'akʼeʼeeshchínígíí',
 'contributions-title' => '$1 akʼeʼeeshchínígíí',
-'mycontris'           => 'akʼeʼshełchínígíí',
-'contribsub2'         => '$1 akʼeʼeeshchínígíí ($2)',
-'uctop'               => '(← bee nihoolʼá)',
+'mycontris' => 'akʼeʼshełchínígíí',
+'contribsub2' => '$1 akʼeʼeeshchínígíí ($2)',
+'uctop' => '(← bee nihoolʼá)',
 
-'sp-contributions-newbies'  => 'ádaaniidí akʼeʼeeshchínígíí tʼéiyá',
-'sp-contributions-search'   => 'akʼeʼeeshchínígíí hanishtá nisin',
+'sp-contributions-newbies' => 'ádaaniidí akʼeʼeeshchínígíí tʼéiyá',
+'sp-contributions-search' => 'akʼeʼeeshchínígíí hanishtá nisin',
 'sp-contributions-username' => 'IP/Choyoołʼįįhí bizhiʼ:',
-'sp-contributions-submit'   => 'hanishtá',
+'sp-contributions-submit' => 'hanishtá',
 
 # What links here
-'whatlinkshere'            => 'linksígíí díí naaltsoos baa atiin',
-'whatlinkshere-title'      => 'linksígíí "$1" baa atiin',
-'whatlinkshere-page'       => 'Naaltsoos:',
-'linkshere'                => "'''[[:$1]]''' baa atiinígíí:",
-'nolinkshere'              => "'''\"[[:\$1]]\"''' baa atiinígíí doo hólǫ́ǫ da.",
-'nolinkshere-ns'           => "'''\"[[:\$1]]\"''' baa atiinígíí doo hólǫ́ǫ da.",
-'isredirect'               => 'dah astsihígíí',
-'istemplate'               => 'bee álnééhí',
-'isimage'                  => 'eʼelyaaígíí',
-'whatlinkshere-prev'       => '{{PLURAL:$1|←|← $1}}',
-'whatlinkshere-next'       => '{{PLURAL:$1|→|→ $1}}',
-'whatlinkshere-links'      => '← linkígíí',
+'whatlinkshere' => 'linksígíí díí naaltsoos baa atiin',
+'whatlinkshere-title' => 'linksígíí "$1" baa atiin',
+'whatlinkshere-page' => 'Naaltsoos:',
+'linkshere' => "'''[[:$1]]''' baa atiinígíí:",
+'nolinkshere' => "'''\"[[:\$1]]\"''' baa atiinígíí doo hólǫ́ǫ da.",
+'nolinkshere-ns' => "'''\"[[:\$1]]\"''' baa atiinígíí doo hólǫ́ǫ da.",
+'isredirect' => 'dah astsihígíí',
+'istemplate' => 'bee álnééhí',
+'isimage' => 'eʼelyaaígíí',
+'whatlinkshere-prev' => '{{PLURAL:$1|←|← $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|→|→ $1}}',
+'whatlinkshere-links' => '← linkígíí',
 'whatlinkshere-hideredirs' => 'dah astsihígíí $1',
-'whatlinkshere-hidetrans'  => 'transclusions $1',
-'whatlinkshere-hidelinks'  => 'linksígíí $1',
-'whatlinkshere-filters'    => 'bee agháʼníldéhí',
+'whatlinkshere-hidetrans' => 'transclusions $1',
+'whatlinkshere-hidelinks' => 'linksígíí $1',
+'whatlinkshere-filters' => 'bee agháʼníldéhí',
 
 # Block/unblock
-'contribslink'  => 'akʼeʼeeshchínígíí',
+'contribslink' => 'akʼeʼeeshchínígíí',
 'blocklogentry' => '[[$1]] bichʼą́ą́h niiníyá ($2 $3)',
 
 # Move page
-'movearticle'    => 'naaltsoos:',
-'newtitle'       => 'naaltsoos bizhiʼ ániidí:',
-'move-watch'     => 'shinááł',
-'movepagebtn'    => '✔ bee lą́ ashłeeh',
+'movearticle' => 'naaltsoos:',
+'newtitle' => 'naaltsoos bizhiʼ ániidí:',
+'move-watch' => 'shinááł',
+'movepagebtn' => '✔ bee lą́ ashłeeh',
 'movepage-moved' => '\'\'\'"$1" kʼad "$2" wolyé\'\'\'',
-'revertmove'     => 'ńdíídleeł!',
+'revertmove' => 'ńdíídleeł!',
 
 # Skin names
 'skinname-monobook' => "NaaltsoosŁáa'ígíí",
 
 # Metadata
-'metadata'          => 'Metadataígíí',
-'metadata-expand'   => 'yishʼį́ nisin',
+'metadata' => 'Metadataígíí',
+'metadata-expand' => 'yishʼį́ nisin',
 'metadata-collapse' => 'doo yishʼį́ nisin da',
 
 # External editor support
-'edit-externally'      => "''external application''ígíí choinishʼįįhgo díí eʼelyaaígíí łahgo áshłééh nisin.",
+'edit-externally' => "''external application''ígíí choinishʼįįhgo díí eʼelyaaígíí łahgo áshłééh nisin.",
 'edit-externally-help' => '([//www.mediawiki.org/wiki/Manual:External_editors anáʼálwoʼ] (Bilagáanakʼehjí))',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'tʼáá ałtso',
 'namespacesall' => 'tʼáá ałtso',
-'monthsall'     => 'tʼáá ałtso',
+'monthsall' => 'tʼáá ałtso',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'łahgo ályaaígíí yishʼį́ nisin',
 'watchlisttools-edit' => 'naaltsoos bikʼi déshʼį́į́ʼígíí bikáaʼgi hólónígíí yishʼį́ dóó łahgo áshłééh nisin',
-'watchlisttools-raw'  => 'XML yishʼį́ dóó łahgo áshłééh nisin',
+'watchlisttools-raw' => 'XML yishʼį́ dóó łahgo áshłééh nisin',
 
 # Special:SpecialPages
 'specialpages' => 'Naaltsoos spéshelígíí',
index 6b4a774..f02999c 100644 (file)
@@ -13,6 +13,7 @@
  * @author Fryed-peach
  * @author Jfblanc
  * @author Kaganer
+ * @author McDutchie
  * @author Spacebirdy
  * @author Горан Анђелковић
  * @author לערי ריינהארט
@@ -152,7 +153,6 @@ $magicWords = array(
        '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' ),
@@ -436,7 +436,6 @@ $messages = array(
 'qbbrowse' => 'Far desfilar',
 'qbedit' => 'Modificar',
 'qbpageoptions' => 'Opcions de la pagina',
-'qbpageinfo' => 'Pagina d’entresenhas',
 'qbmyoptions' => 'Mas opcions',
 'qbspecialpages' => 'Paginas especialas',
 'faq' => 'FAQ',
@@ -679,11 +678,8 @@ Lo motiu avançat es « ''$2'' ».",
 # Login and logout pages
 'logouttext' => "'''Ara, sètz desconnect{{GENDER:||at|ada}}..'''
 
-Podètz contunhar d'utilizar {{SITENAME}} anonimament, o vos podètz [[Special:UserLogin|tornar connectar]] jol meteis nom o amb un autre nom.
+Podètz contunhar d'utilizar {{SITENAME}} anonimament, o vos podètz <span class='plainlinks'>[$1 tornar connectar]</span> jol meteis nom o amb un autre nom.
 Notatz que d'unas paginas pòdon èsser encara afichadas coma s'eratz encara connect{{GENDER:||at|ada}}, fins al moment qu'escafaretz l'amagatal de vòstre navigador.",
-'welcomecreation' => "== Benvenguda, $1 ! ==
-Vòstre compte d'utilizaire es estat creat.
-Doblidetz pas de personalizar vòstras [[Special:Preferences|{{SITENAME}} preferéncias]].",
 'yourname' => "Vòstre nom d'utilizaire :",
 'yourpassword' => 'Vòstre senhal :',
 'yourpasswordagain' => 'Picatz vòstre senhal tornarmai :',
@@ -1222,8 +1218,6 @@ Asseguratz-vos qu'aqueste cambiament pòsca conservar la continuitat de l'istori
 'search-interwiki-caption' => 'Projèctes fraires',
 'search-interwiki-default' => '$1 resultats :',
 'search-interwiki-more' => '(mai)',
-'search-mwsuggest-enabled' => 'amb suggestions',
-'search-mwsuggest-disabled' => 'sens suggestion',
 'search-relatedarticle' => 'Relatat',
 'mwsuggest-disable' => 'Desactivar las suggestions AJAX',
 'searcheverything-enable' => 'Recercar dins totes los espacis de noms',
@@ -1320,7 +1314,7 @@ Vaquí una valor generada aleatòriament que podètz utilizar : $1',
 'timezoneregion-indian' => 'Ocean Indian',
 'timezoneregion-pacific' => 'Ocean Pacific',
 'allowemail' => 'Autorizar lo mandadís de corrièr electronic venent d’autres utilizaires',
-'prefs-searchoptions' => 'Opcions de recèrca',
+'prefs-searchoptions' => 'Recèrca',
 'prefs-namespaces' => 'Noms d’espacis',
 'defaultns' => 'Autrament recercar dins aquestes espacis de noms :',
 'default' => 'defaut',
@@ -2129,11 +2123,7 @@ Las modificacions venentas d\'aquesta pagina e de la pagina de discussion associ
 
 'enotif_mailer' => 'Sistèma d’expedicion de notificacion de {{SITENAME}}',
 'enotif_reset' => 'Marcar totas las paginas coma visitadas',
-'enotif_newpagetext' => 'Aquò es una pagina novèla.',
 'enotif_impersonal_salutation' => 'Utilizaire de {{SITENAME}}',
-'changed' => 'modificada',
-'created' => 'creada',
-'enotif_subject' => 'La pagina $PAGETITLE de {{SITENAME}} es estada $CHANGEDORCREATED per $PAGEEDITOR',
 'enotif_lastvisited' => 'Consultatz $1 per totes los cambiaments dempuèi vòstra darrièra visita.',
 'enotif_lastdiff' => 'Consultatz $1 per veire aquesta modificacion.',
 'enotif_anon_editor' => 'utilizaire anonim $1',
@@ -3449,4 +3439,8 @@ Picatz lo nom del fichièr sens lo prefix « {{ns:file}}: »",
 'revdelete-unrestricted' => 'restriccions levadas pels administrators',
 'newuserlog-byemail' => 'senhal mandat per corrièr electronic',
 
+# Search suggestions
+'searchsuggest-search' => 'Recercar',
+'searchsuggest-containing' => 'que conten...',
+
 );
index 2d6516a..61c1e36 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'    => 'Dilbata',
-'monday'    => 'Wiixata',
-'tuesday'   => 'Qibxata',
+'sunday' => 'Dilbata',
+'monday' => 'Wiixata',
+'tuesday' => 'Qibxata',
 'wednesday' => 'Roobii',
-'thursday'  => 'Kamiisa',
-'friday'    => 'Jimaata',
-'saturday'  => 'Sanbata',
-'sun'       => 'Dil',
-'mon'       => 'Wix',
-'tue'       => 'Qib',
-'wed'       => 'Rob',
-'thu'       => 'Kam',
-'fri'       => 'Jim',
-'sat'       => 'San',
-'january'   => 'Amajjii',
-'february'  => 'Guraandhala',
-'march'     => 'Bitooteessa',
-'april'     => 'Elba',
-'may_long'  => 'Caamsa',
-'june'      => 'Waxabajjii',
-'july'      => 'Adooleessa',
-'august'    => 'Hagayya',
+'thursday' => 'Kamiisa',
+'friday' => 'Jimaata',
+'saturday' => 'Sanbata',
+'sun' => 'Dil',
+'mon' => 'Wix',
+'tue' => 'Qib',
+'wed' => 'Rob',
+'thu' => 'Kam',
+'fri' => 'Jim',
+'sat' => 'San',
+'january' => 'Amajjii',
+'february' => 'Guraandhala',
+'march' => 'Bitooteessa',
+'april' => 'Elba',
+'may_long' => 'Caamsa',
+'june' => 'Waxabajjii',
+'july' => 'Adooleessa',
+'august' => 'Hagayya',
 'september' => 'Fuulbana',
-'october'   => 'Onkololeessa',
-'november'  => 'Sadaasa',
-'december'  => 'Muddee',
+'october' => 'Onkololeessa',
+'november' => 'Sadaasa',
+'december' => 'Muddee',
 
-'about'   => "Wa'ee",
+'about' => "Wa'ee",
 'article' => 'Kutaa',
-'and'     => '&#32;fi',
+'and' => '&#32;fi',
 
-'help'          => 'Qarqarsa',
-'go'            => 'Fufi',
-'history'       => 'Seena',
+'help' => 'Qarqarsa',
+'go' => 'Fufi',
+'history' => 'Seena',
 'history_short' => 'Seena',
-'edit'          => 'Barressu',
+'edit' => 'Barressu',
 
 # 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'            => "Wa'ee {{SITENAME}}",
-'aboutpage'            => "Project:Wa'ee",
-'currentevents'        => 'Gocha amma',
-'edithelp'             => 'Qarqarsa Barressu',
-'mainpage'             => 'Fuula Dura',
+'aboutsite' => "Wa'ee {{SITENAME}}",
+'aboutpage' => "Project:Wa'ee",
+'currentevents' => 'Gocha amma',
+'edithelp' => 'Qarqarsa Barressu',
+'mainpage' => 'Fuula Dura',
 'mainpage-description' => 'Fuula Dura',
 
 # Login and logout pages
-'yourname'           => 'Maqaa-Tajajilamma:',
-'yourdomainname'     => 'Maqaa domain kankee:',
-'gotaccountlink'     => 'Seenu',
-'accountcreated'     => 'Accountiin banamerra',
+'yourname' => 'Maqaa-Tajajilamma:',
+'yourdomainname' => 'Maqaa domain kankee:',
+'gotaccountlink' => 'Seenu',
+'accountcreated' => 'Accountiin banamerra',
 'loginlanguagelabel' => 'Afaan: $1',
 
 # Edit pages
@@ -74,7 +74,7 @@ $messages = array(
 # Preferences page
 'yourrealname' => 'Maqaa Dhugaa:',
 'yourlanguage' => 'Afaan:',
-'yourvariant'  => 'Jijjirama:',
+'yourvariant' => 'Jijjirama:',
 
 # Upload
 'upload' => 'File Galchu',
@@ -90,7 +90,7 @@ $messages = array(
 
 # Delete
 'actioncomplete' => 'Gochaan dhumattera',
-'deletecomment'  => 'Sababa:',
+'deletecomment' => 'Sababa:',
 
 # Block/unblock
 'ipbreason' => 'Sababa:',
@@ -99,7 +99,7 @@ $messages = array(
 'movereason' => 'Sababa:',
 
 # Namespace 8 related
-'allmessagesname'      => 'Maqaa',
+'allmessagesname' => 'Maqaa',
 'allmessages-language' => 'Afaan:',
 
 );
index a1bd01b..6db7ce9 100644 (file)
@@ -141,7 +141,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'ନଗଦବଦଳ' ),
        'Recentchangeslinked'       => array( 'ଜୋଡ଼ାଥିବାନଗଦବଦଳ', 'ପାଖାପାଖିବଦଳ' ),
        'Revisiondelete'            => array( 'ସଙ୍କଳନଲିଭାଇଦିଅଦେବେ' ),
-       'RevisionMove'              => array( 'ସଙ୍କଳନ' ),
        'Search'                    => array( 'ଖୋଜନ୍ତୁ' ),
        'Shortpages'                => array( 'ଛୋଟପୃଷ୍ଠା' ),
        'Specialpages'              => array( 'ବିଶେଷପୃଷ୍ଠା' ),
@@ -322,13 +321,13 @@ $messages = array(
 'thursday' => 'ଗୁରୁବାର',
 'friday' => 'ଶୁକ୍ରବାର',
 'saturday' => 'ଶନିବାର',
-'sun' => 'ରବିବାର',
-'mon' => 'ସୋମବାର',
-'tue' => 'ମଙ୍ଗଳବାର',
-'wed' => 'ବୁଧବାର',
-'thu' => 'ଗୁରୁବାର',
-'fri' => 'ଶୁକ୍ରବାର',
-'sat' => 'ଶନିବାର',
+'sun' => 'ରବି',
+'mon' => 'ସୋମ',
+'tue' => 'ମଙ୍ଗଳ',
+'wed' => 'ବୁଧ',
+'thu' => 'ଗୁରୁ',
+'fri' => 'ଶୁକ୍ର',
+'sat' => 'ଶନି',
 'january' => 'ଜାନୁଆରୀ',
 'february' => 'ଫେବ୍ରୁଆରୀ',
 'march' => 'ମାର୍ଚ୍ଚ',
@@ -391,7 +390,7 @@ $messages = array(
 'cancel' => 'ନାକଚ',
 'moredotdotdot' => 'ଅଧିକ...',
 'mypage' => 'ମୋ ପୃଷ୍ଠା',
-'mytalk' => 'ମà­\8b à¬\86ଲà­\8bà¬\9aନା',
+'mytalk' => 'ଆଲୋଚନା',
 'anontalk' => 'ଏହି ଆଇ.ପି. ଠିକଣା ଉପରେ ଆଲୋଚନା',
 'navigation' => 'ଦିଗବାରେଣି',
 'and' => '&#32;ଓ',
@@ -401,7 +400,6 @@ $messages = array(
 'qbbrowse' => 'ଖୋଜିବା',
 'qbedit' => 'ଏହାକୁ ବଦଳାନ୍ତୁ',
 'qbpageoptions' => 'ଏହି ପୃଷ୍ଠାଟି',
-'qbpageinfo' => 'ଭିତର ଚିଜ',
 'qbmyoptions' => 'ମୋ ପୃଷ୍ଠାଗୁଡ଼ିକ',
 'qbspecialpages' => 'ବିଶେଷ ପୃଷ୍ଠା',
 'faq' => 'ବାରମ୍ବାର ପଚରାଯାଉଥିବା ପ୍ରଶ୍ନ',
@@ -664,10 +662,9 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ଆପଣ ଲଗାଆଉଟ କରିଦେଲେ'''
 
-ଆପଣ ଅଜଣା ଭାବରେ {{SITENAME}}କୁ ଯାଇପାରିବେ, କିମ୍ବା [[Special:UserLogin|ଆଉଥରେ]] ଆଗର ଇଉଜର ନାଆଁରେ/ଅଲଗା ନାଆଁରେ ଲଗଇନ କରିପାରିବେ ।
+ଆପଣ ଅଜଣା ଭାବରେ {{SITENAME}}କୁ ଯାଇପାରିବେ, କିମ୍ବା <span class='plainlinks'>[$1 ଆଉଥରେ]</span> ଆଗର ଇଉଜର ନାଆଁରେ/ଅଲଗା ନାଆଁରେ ଲଗଇନ କରିପାରିବେ ।
 ଜାଣିରଖନ୍ତୁ, କିଛି ପୃଷ୍ଠା ଲଗାଆଉଟ କଲାପରେ ବି ଆଗପରି ଦେଖାଯାଇପାରେ, ଆପଣ ବ୍ରାଉଜର କାସକୁ ହଟାଇଲା ଯାଏଁ ଏହା ଏମିତି ରହିବ ।",
-'welcomecreation' => '== $1!, ଆପଣଙ୍କ ଖାତାଟି ତିଆରି ହୋଇଗଲା==
-ତେବେ, ନିଜର [[Special:Preferences|{{SITENAME}} ପସନ୍ଦସବୁକୁ]] ବଦଳାଇବାକୁ ଭୁଲିବେ ନାହିଁ ।',
+'welcomeuser' => 'ସ୍ଵାଗତ, $1!',
 'yourname' => 'ବ୍ୟବହାରକାରୀଙ୍କ ନାମ:',
 'yourpassword' => 'ପାସୱାର୍ଡ଼',
 'yourpasswordagain' => 'ପାସୱାର୍ଡ଼ ଆଉଥରେ:',
@@ -930,10 +927,10 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଆପଣ [[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> ।',
+'noarticletext-nopermission' => 'à¬\8fବà­\87 à¬\8fହି à¬ªà­\83ଷà­\8dଠାà¬\9fିରà­\87 à¬\95ିà¬\9bି à¬¬à¬¿ à¬²à­\87à¬\96ା à¬¨à¬¾à¬¹à¬¿à¬\81 à¥¤
+ଆପଣ [[Special:Search/{{PAGENAME}}|ଏହି ଲେଖାଟିର ନାଆଁ]] ବାକି ପୃଷ୍ଠାମାନଙ୍କରେ ଖୋଜି ପାରନ୍ତି, କିମ୍ବା
+<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}ରେ ଯୋଡ଼ାଯାଇଥିବା ବାକି ପୃଷ୍ଠାସବୁକୁ ଖୋଜି ପାରନ୍ତି]
+</span>, କିନ୍ତୁ ଏହି ପୃଷ୍ଠାଟିକୁ ଆପଣ ତିଆରି କରିପାରିବେ ନାହିଁ ।',
 'missing-revision' => '"{{PAGENAME}}" ନାମରେ ଥିବା ପୃଷ୍ଠାଟିର #$1 ପୁନରାବୃତ୍ତି ନାହିଁ ।
 
 ପୁରୁଣା ହୋଇଯାଇଥିବା ଇତିହାସ ଲିଙ୍କ ଯାହା ଏକ ଲିଭାଯାଇଥିବା ପୃଷ୍ଠାକୁ ଦିଆଯାଇଥିବାରୁ ଏହା ସାଧାରଣତଃ ହୋଇଥାଏ ।
@@ -1049,6 +1046,9 @@ $1 ଦ୍ଵାରା ପ୍ରତିରୋଧ କରାଯାଇଛି
 ଏହା ଅଗରୁ ଅଛି ।',
 'defaultmessagetext' => 'ଡିଫଲ୍ଟ ମେସେଜ ଲେଖାଗୁଡିକ',
 
+# Content models
+'content-model-wikitext' => 'ଉଇକିଟେକ୍ସଟ',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ଚେତାବନୀ:''' ଏହି ପୃଷ୍ଠାରେ ଅନେକ ଗୁଡ଼ିଏ ମୂଲ୍ୟବାନ ପାର୍ସର ଫଙ୍କସନ କଲ ଅଛି ।
 
@@ -1300,8 +1300,6 @@ $1",
 'search-interwiki-caption' => 'ସାଙ୍ଗରେ ଚାଲିଥିବା ବାକି ପ୍ରକଳ୍ପସବୁ',
 'search-interwiki-default' => '$1 ଫଳାଫଳ:',
 'search-interwiki-more' => '(ଅଧିକ)',
-'search-mwsuggest-enabled' => 'ମତାମତ ସହ',
-'search-mwsuggest-disabled' => 'ମତାମତ ନାହିଁ',
 'search-relatedarticle' => 'ଯୋଡ଼ା',
 'mwsuggest-disable' => 'AJAX ମତାମତକୁ ଅଚଳ କରାଇବେ',
 'searcheverything-enable' => 'ସବୁଗୁଡ଼ିକ ନେମସ୍ପେସରେ ଖୋଜିବେ',
@@ -1337,7 +1335,7 @@ $1",
 
 # Preferences page
 'preferences' => 'ପସନ୍ଦ',
-'mypreferences' => 'ମà­\8b à¬ªà¬¸à¬¨à­\8dଦ',
+'mypreferences' => 'ପସନ୍ଦ',
 'prefs-edits' => 'ସମ୍ପାଦନା ସଂଖ୍ୟା:',
 'prefsnologin' => 'ଲଗ‌‌ ଇନ କରିନାହାନ୍ତି',
 'prefsnologintext' => 'ବ୍ୟବହାରକାରୀଙ୍କ ପସନ୍ଦସବୁ ବଦଳାଇବା ପାଇଁ ଆପଣଙ୍କୁ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ଲଗ ଇନ]</span> କରିବାକୁ ପଡ଼ିବ ।',
@@ -2251,7 +2249,7 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 
 # Watchlist
 'watchlist' => 'ଦେଖାତାଲିକା',
-'mywatchlist' => 'ମà­\8bର à¬¦à­\87à¬\96ାତାଲିକା',
+'mywatchlist' => 'ଦà­\87à¬\96ଣାତାଲିକା',
 'watchlistfor2' => '$1 $2 ପାଇଁ',
 'nowatchlist' => 'ଆପଣଙ୍କ ଦେଖଣା ତାଲିକାରେ କିଛି ବି ଜିନିଷ ନାହିଁ ।',
 'watchlistanontext' => 'ଆପଣା ଦେଖଣାତାଲିକାରେ କିଛି ସମ୍ପାଦନା କରିବା ନିମନ୍ତେ ଦୟାକରି  $1 କରନ୍ତୁ ।',
@@ -2287,11 +2285,7 @@ URLଟି ଠିକ ଅଚିକି କି ନାଁ ଓ ସାଇଟଟି ସ
 
 'enotif_mailer' => '{{SITENAME}} ସୂଚନା ମେଲ ପ୍ରେରକ',
 'enotif_reset' => 'ସବୁଯାକ ଦେଖାଯାଇଥିବା ପୃଷ୍ଠାକୁ ଚିହ୍ନିତ କରିବେ',
-'enotif_newpagetext' => 'ଏହା ଏକ ନୂଆ ପୃଷ୍ଠା ।',
 'enotif_impersonal_salutation' => '{{SITENAME}} ବ୍ୟବହାରକାରୀ',
-'changed' => 'ବଦଳାଗଲା',
-'created' => 'ତିଆରି କରାଗଲା',
-'enotif_subject' => ' $PAGEEDITORଙ୍କ ଦେଇ {{SITENAME}} ପୃଷ୍ଠାଟି $PAGETITLE  $CHANGEDORCREATED',
 'enotif_lastvisited' => 'ଆପଣଙ୍କ ଶେଷ ଦେଖଣା ପରେ ହୋଇଥିବା ବଦଳସବୁକୁ  ଦେଖିବା ନିମନ୍ତେ $1 ଦେଖନ୍ତୁ ।',
 'enotif_lastdiff' => 'ଏହି ବଦଳ ଦେଖିବା ପାଇଁ $1 ଦେଖନ୍ତୁ ।',
 'enotif_anon_editor' => 'ବେନାମି ସଭ୍ୟ $1',
@@ -2516,7 +2510,7 @@ $1',
 # Contributions
 'contributions' => 'ବ୍ୟବହାରକାରୀଙ୍କ ଦାନ',
 'contributions-title' => '$1 ପାଇଁ ବ୍ୟବହାରକାରୀଙ୍କ ଦାନ',
-'mycontris' => 'ମà­\8b à¬\85ବଦାନ',
+'mycontris' => 'ଅବଦାନ',
 'contribsub2' => '$1 ($2) ପାଇଁ',
 'nocontribs' => 'ଏହି ନିର୍ଣ୍ଣାୟକବଳୀ ନିମନ୍ତେ କିଛି ବି ବଦଳ ମେଳ ଖାଇଲା ନାହିଁ ।',
 'uctop' => '(ଉପର)',
@@ -2557,7 +2551,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 କୁ ଲେଉଟାଣି',
 'whatlinkshere-hidetrans' => '$1 ଆଧାର ସହ ଭିତରେ ରଖିବା',
 'whatlinkshere-hidelinks' => '$1 ଟି ଲିଙ୍କ',
-'whatlinkshere-hideimages' => '$1 à¬\9bବିର ଲିଙ୍କସବୁ',
+'whatlinkshere-hideimages' => '$1 à¬«à¬¾à¬\87ଲର ଲିଙ୍କସବୁ',
 'whatlinkshere-filters' => 'ଛଣା',
 
 # Block/unblock
@@ -2913,9 +2907,6 @@ MediaWiki ବ୍ୟବହାର କରି [[Special:Import|ପୃଷ୍ଠା 
 'import-logentry-interwiki' => '$1 କୁ ଟ୍ରାନ୍ସଉଇକି କରାଗଲା',
 'import-logentry-interwiki-detail' => '$2 ଭିତରୁ $1 ଗୋଟି {{PLURAL:$1|ସଂସ୍କରଣ|ସଂସ୍କରଣ}}',
 
-# JavaScriptTest
-'javascripttest-disabled' => 'ଏହି ଉଇକିରେ ଏହି ବ୍ୟବସ୍ଥାଟିକୁ ସଚଳ କରାଯାଇନାହି ।',
-
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'ଆପଣଙ୍କ ବ୍ୟବହାରକାରୀ ପୃଷ୍ଠା',
 'tooltip-pt-anonuserpage' => 'ଆପଣ ଯେଉଁ IP ଠିକଣାର ବ୍ୟବହାରକାରୀ ପୃଷ୍ଠାଟି ବଦଳାଇବା ପାଇଁ ଚେଷ୍ଟା କରୁଛନ୍ତି',
@@ -3012,12 +3003,15 @@ MediaWiki ବ୍ୟବହାର କରି [[Special:Import|ପୃଷ୍ଠା 
 
 # Info page
 'pageinfo-title' => '"$1"ର ବିବରଣୀ',
+'pageinfo-header-basic' => 'ସାଧାରଣ ଜାଣିବା କଥା',
 'pageinfo-header-edits' => 'ବଦଳସବୁ',
 'pageinfo-article-id' => 'ପୃଷ୍ଠା ଆଇଡ଼ି',
 'pageinfo-views' => 'ଦେଖଣା ସଂଖ୍ୟା',
 'pageinfo-watchers' => 'ଦେଖଣାହାରି ସଂଖ୍ୟା',
-'pageinfo-edits' => 'ସମ୍ପାଦନା ସଂଖ୍ୟା:',
+'pageinfo-edits' => 'ସମ୍ପାଦନା ସଂଖ୍ୟା',
 'pageinfo-authors' => 'ନିଆରା ଲେଖକଙ୍କ ସଂଖ୍ୟା',
+'pageinfo-contentpage-yes' => 'ହଁ',
+'pageinfo-protect-cascading-yes' => 'ହଁ',
 
 # Patrolling
 'markaspatrolleddiff' => 'ଜଗାଯାଇଅଛି ବୋଲି ଚିହ୍ନିତ କରାଗଲା',
@@ -3061,6 +3055,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' => 'Animated SVG ଫାଇଲ, ସାଧାରଣ ମାପ $1 × $2 ପିକ୍ସେଲ, ଫାଇଲ ଆକାର: $3',
 'show-big-image' => 'ପୁରା ବଡ଼ ଆକାରରେ',
 'show-big-image-preview' => 'ଏହି ଦେଖଣାର ଆକାର: $1 ।',
 'show-big-image-other' => 'ବାକି {{PLURAL:$2|ରେଜୋଲୁସନ|ରେଜୋଲୁସନ}}: $1.',
@@ -3855,6 +3850,10 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'feedback-bugcheck' => 'ବହୁତ ଭଲ ! ଖାଲି ଦେଖିଦିଅନ୍ତୁ ଯେ ଏହା ଆଗରୁ ଥିବା [$1 known bugs] ମଧ୍ୟରୁ ନୁହେଁ ତ ।',
 'feedback-bugnew' => 'ମୁଁ ଯାଞ୍ଚ କରିଦେଲି । ନୂତନ ଅସୁବିଧାର ବିବରଣ କରନ୍ତୁ ।',
 
+# Search suggestions
+'searchsuggest-search' => 'ଖୋଜିବା',
+'searchsuggest-containing' => 'ଧାରଣ ହେଉଛି...',
+
 # API errors
 'api-error-badaccess-groups' => 'ଆପଣଙ୍କୁ ଏହି ଉଇକିରେ ଅପଲୋଡ଼ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ ।',
 'api-error-badtoken' => 'ଭିତର ଅସୁବିଧା: ଖରାପ ଟୋକନ ।',
@@ -3901,7 +3900,7 @@ MediaWiki ଉପଯୋଗୀ ହେବା ଲକ୍ଷରେ ବଣ୍ଟାଯ
 'duration-days' => '$1 {{PLURAL:$1|ଦିନ|ଦିନଗୁଡିକ}}',
 'duration-weeks' => '$1 {{PLURAL: $1|ସପ୍ତାହ|ସପ୍ତାହଗୁଡିକ}}',
 'duration-years' => '$1 {{PLURAL:$1|year|years}}',
-'duration-decades' => '$1 {{PLURAL:$1|decade|decades}',
+'duration-decades' => '$1 {{PLURAL:$1|decade|decades}}',
 'duration-centuries' => '$1 {{PLURAL:$1|century|centuries}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennia}}',
 
index 02427e0..cc61f0b 100644 (file)
@@ -27,8 +27,8 @@ $namespaceNames = array(
        NS_FILE_TALK        => 'Файлы_тæрхон',
        NS_MEDIAWIKI        => 'MediaWiki',
        NS_MEDIAWIKI_TALK   => 'MediaWiki-йы_тæрхон',
-       NS_TEMPLATE         => 'Шаблон',
-       NS_TEMPLATE_TALK    => 'Шаблоны_тæрхон',
+       NS_TEMPLATE         => 'Ð¥Ñ\83Ñ\8bзæг',
+       NS_TEMPLATE_TALK    => 'Ð¥Ñ\83Ñ\8bзæджы_тæрхон',
        NS_HELP             => 'Æххуыс',
        NS_HELP_TALK        => 'Æххуысы_тæрхон',
        NS_CATEGORY         => 'Категори',
@@ -44,6 +44,8 @@ $namespaceAliases = array(
        'Нывы_тыххæй_дискусси'        => NS_FILE_TALK,
        'Дискусси_MediaWiki'          => NS_MEDIAWIKI_TALK,
        'Тæрхон_MediaWiki'            => NS_MEDIAWIKI_TALK,
+       'Шаблон'                      => NS_TEMPLATE,
+       'Шаблоны_тæрхон'              => NS_TEMPLATE_TALK,
        'Шаблоны_тыххæй_дискусси'     => NS_TEMPLATE_TALK,
        'Æххуысы_тыххæй_дискусси'     => NS_HELP_TALK,
        'Категорийы_тыххæй_дискусси'  => NS_CATEGORY_TALK,
@@ -98,12 +100,12 @@ $messages = array(
 'tog-newpageshidepatrolled' => 'Басгæрст фæрстæ ног фæрсты номхыгъдæй æмбæхс',
 'tog-extendwatchlist' => 'Стырдæр цæстдард номхыгъд алы ивдимæ дæр, æрмæст фæстагимæ нал.',
 'tog-usenewrc' => 'Фæстаг æмæ цæстдард ивдтытæ фарсмæ гæсгæ иу кæнæт (домы JavaScript)',
-'tog-numberheadings' => 'Сæргæндты автоматикон нумераци',
+'tog-numberheadings' => 'Сæртæн хæдæвзæргæ номыр æвæрын',
 'tog-showtoolbar' => 'Æвдисын ивыны панел (домы JavaScript)',
 'tog-editondblclick' => 'Фæрстæ дыкъæппæй ив (JavaScript)',
 'tog-editsection' => 'Равдис «баив æй» æрвитæн тексты алы хайы дæр',
-'tog-editsectiononrightclick' => 'СæÑ\80гондÑ\8bл Ñ\80аÑ\85из Ã¦Ñ\80кÑ\8aæппæй Ñ\84аÑ\80Ñ\81Ñ\8b Ñ\85æйÑ\82Ñ\82æ Ð¸Ð² (JavaScript)',
-'tog-showtoc' => 'Сæргæндты номхыгъд æвдис (æртæ сæргондæй фылдæр цы фарсы ис, уым)',
+'tog-editsectiononrightclick' => 'ХайÑ\8b Ñ\81æÑ\80Ñ\8bл Ñ\80аÑ\85иÑ\81 Ã¦Ñ\80кÑ\8aæппæй Ð¸Ð²Ñ\8bнÑ\8b Ñ\84адаÑ\82 Ð±Ð°Ð¸Ñ\83 ÐºÃ¦Ð½Ñ\8bн (домÑ\8b JavaScript)',
+'tog-showtoc' => 'Сæрты номхыгъд æвдисын (æртæйæ фылдæрсæр цы фарсы ис, уым)',
 'tog-rememberpassword' => 'Бахъуыды мæ кæнæд ацы браузер ($1 {{PLURAL:$1|бонмæ|бонмæ}})',
 'tog-watchcreations' => 'Æз цы фæрстæ аразын æмæ цы файлтæ бавгæнын, уыдон мæ цæстдард уæт.',
 'tog-watchdefault' => 'Æз цы фæрстæ æмæ цы файлтæ ивын, уыдон мæ цæстдард уæт',
@@ -138,7 +140,7 @@ $messages = array(
 
 'underline-always' => 'Æдзух',
 'underline-never' => 'Никуы',
-'underline-default' => 'Ð\91Ñ\80аÑ\83зеÑ\80Ñ\8b ÐºÑ\83Ñ\8bд Ñ\83',
+'underline-default' => 'ЦÑ\8aаÑ\80 Ã¦Ð²Ð¸ Ñ\81гаÑ\80æнмæ Ð³Ã¦Ñ\81гæ',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Ивæн бынаты шрифты стил:',
@@ -223,8 +225,8 @@ $messages = array(
 'newwindow' => '(кæны ног рудзынджы)',
 'cancel' => 'Ныууадзын',
 'moredotdotdot' => 'Фылдæр…',
-'mypage' => 'Ð\9cæ Ñ\84арс',
-'mytalk' => 'Ð\9cæ Ð½ыхас',
+'mypage' => 'Фарс',
+'mytalk' => 'Ð\9dыхас',
 'anontalk' => 'Ацы IP-адрисы тæрхон',
 'navigation' => 'Навигаци',
 'and' => '&#32;æмæ',
@@ -234,7 +236,6 @@ $messages = array(
 'qbbrowse' => 'Фен',
 'qbedit' => 'Ивын',
 'qbpageoptions' => 'Ацы фарс',
-'qbpageinfo' => 'Фарсы контекст',
 'qbmyoptions' => 'Мæ фæрстæ',
 'qbspecialpages' => 'Сæрмагонд фæрстæ',
 'faq' => 'FAQ',
@@ -247,7 +248,7 @@ $messages = array(
 'vector-action-protect' => 'Сæхгæнын',
 'vector-action-undelete' => 'Рацаразын',
 'vector-action-unprotect' => 'Ивын хъахъхъæд',
-'vector-simplesearch-preference' => 'Баиу кæнын уæрæхгонд агурыны æххуыстæ (Вектор цармæн æрмæст)',
+'vector-simplesearch-preference' => 'Баиу кæнын æнцонгонд агурыны формæ (Вектор цармæн æрмæст)',
 'vector-view-create' => 'Скæнын',
 'vector-view-edit' => 'Ивын',
 'vector-view-history' => 'Истори',
@@ -257,6 +258,7 @@ $messages = array(
 'namespaces' => 'Номдæттæ',
 'variants' => 'Варианттæ',
 
+'navigation-heading' => 'Навигацион меню',
 'errorpagetitle' => 'Рæдыд',
 'returnto' => 'Фæстæмæ $1 фарсмæ.',
 'tagline' => '{{grammar:ablative|{{SITENAME}}}}',
@@ -276,7 +278,7 @@ $messages = array(
 'create' => 'Скæнын',
 'editthispage' => 'Ивын ацы фарс',
 'create-this-page' => 'Ацы фарс скæнын',
-'delete' => 'Ð\90ппаÑ\80',
+'delete' => 'СÑ\85аÑ\84Ñ\8bн',
 'deletethispage' => 'Аппарын ацы фарс',
 'undelete_short' => 'Рацаразын {{PLURAL:$1|иу ивд|$1 ивды}}',
 'viewdeleted_short' => 'Кæсын {{PLURAL:$1|иу хафт ивд|$1 хафт ивдтытæ}}',
@@ -299,7 +301,7 @@ $messages = array(
 'projectpage' => 'Проекты фарс фен',
 'imagepage' => 'Файлы фарс фен',
 'mediawikipage' => 'Фыстæджы фарс фен',
-'templatepage' => 'ШаблонÑ\8b Ñ\84аÑ\80Ñ\81 Ñ\84ен',
+'templatepage' => 'Ð¥Ñ\83Ñ\8bзæджÑ\8b Ñ\84аÑ\80Ñ\81 Ñ\84енÑ\8bн',
 'viewhelppage' => 'Æххуысы фарс фен',
 'categorypage' => 'Категорийы фарс фен',
 'viewtalkpage' => 'Тæрхон фен',
@@ -332,7 +334,7 @@ $1',
 'disclaimerpage' => 'Project:Нæ бæрн исыны тыххæй',
 'edithelp' => 'Ивынæн æххуыс',
 'edithelppage' => 'Help:Ивд',
-'helppage' => 'Help:СæÑ\80гæндÑ\82æ',
+'helppage' => 'Help:Ð\9cидиÑ\81',
 'mainpage' => 'Сæйраг фарс',
 'mainpage-description' => 'Сæйраг фарс',
 'policy-url' => 'Project:Уагæвæрд',
@@ -366,7 +368,7 @@ $1',
 'editlink' => 'ивын',
 'viewsourcelink' => 'Код кæсын',
 'editsectionhint' => 'Ив хай: $1',
-'toc' => 'Сæргæндтæ',
+'toc' => 'Сæртæ',
 'showtoc' => 'равдисын',
 'hidetoc' => 'бамбæхсын',
 'collapsible-collapse' => 'Стухын',
@@ -393,7 +395,7 @@ $1',
 'nstab-project' => 'Проекты тыххæй',
 'nstab-image' => 'Файл',
 'nstab-mediawiki' => 'Фыстæг',
-'nstab-template' => 'Шаблон',
+'nstab-template' => 'Ð¥Ñ\83Ñ\8bзæг',
 'nstab-help' => 'Æххуысы фарс',
 'nstab-category' => 'Категори',
 
@@ -454,11 +456,11 @@ $1',
 'cannotdelete-title' => 'Нæ уайы схафын фарс "$1"',
 'delete-hook-aborted' => 'Хук æй хафын нæ бауагъта.
 Уæлæмхасæн æмбарынгæнæн нæ радта.',
-'badtitle' => 'Ã\86нæмбæлон Ñ\81æÑ\80гонд',
+'badtitle' => 'Ã\86взæÑ\80 Ð½Ð¾Ð¼',
 'badtitletext' => 'Æрдомд фарсы ном уыд рæдыдимæ кæнæ афтид кæнæ та йæ æхсæн-æвзаг æви йæ интервики æрвитæн раст нæ уыд.
 Гæнæн ис Номы ис ахæм дамгъæтæ, кæдон уым æвæрын нæй гæнæн.',
 'perfcached' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ гæнæн ис базæронд сты. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$1|иу фæстиуæг|$1 фæстиуæджы}}.',
-'perfcachedts' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ фæстаг хатт нæуæггонд æрцыдысты $1. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$1|иу фæстиуæг|$1 фæстиуæджы}}.',
+'perfcachedts' => 'Бындæр цы рардтæ ис, уыдон сты кешгонд æмæ фæстаг хатт нæуæггонд æрцыдысты $1. Кешы гæнæн ис уа æппæты фылдæр {{PLURAL:$4|иу фæстиуæг|$4 фæстиуæджы}}.',
 'querypage-no-updates' => 'Ацы фарсы нæуæгкæнын ныртæккæ хицæн у.
 Цы рардтæ дзы ис, уыдон нæуæг нæ кæндзысты.',
 'wrong_wfQuery_params' => 'Рæдыд параметртæ wfQuery() функцийæн<br />
@@ -502,11 +504,11 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Ныр дæ æддæмæ хызт.'''
 
-Дæ бон у дарддæр архайай {{grammar:genitive|{{SITENAME}}}} æнæномæй, æви та [[Special:UserLogin|фæстæмæ бахизын]] раздæры номæй кæнæ та æндæр номæй.
+Дæ бон у дарддæр архайай {{grammar:genitive|{{SITENAME}}}} æнæномæй, æви та <span class='plainlinks'>[$1 фæстæмæ бахизын]</span> раздæры номæй кæнæ та æндæр номæй.
 Дæ сæры дар æмæ иуæй иу фæрстæ гæнæн ис æвдыст цæуой афтæ, цымæ нырмæ дæр нæ рахызтæ. Уый тыххæй дæ браузеры кеш сафтид кæн.",
-'welcomecreation' => '== Ӕгас цу, $1! ==
-Дæ аккаунт арæзт æрцыдис.
\9cа Ð´Ã¦ Ñ\84еÑ\80оÑ\85 Ñ\83æÑ\82 Ã¦Ñ\80кæÑ\81Ñ\8bн Ð´Ã¦ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} Ñ\84адæÑ\82тæм]].',
+'welcomeuser' => 'Æгас цу, $1!',
+'welcomecreation-msg' => 'Дæ аккаунт арæзт æрцыдис.
\9cа Ð´Ã¦ Ñ\84еÑ\80оÑ\85 Ñ\83æÑ\82 Ã¦Ñ\80кæÑ\81Ñ\8bн Ð´Ã¦ [[Special:Preferences|{{grammar:genitive|{{SITENAME}}}} Ñ\83агæвæÑ\80дтæм]].',
 'yourname' => 'Фæсномыг:',
 'yourpassword' => 'Пароль:',
 'yourpasswordagain' => 'Дæ пароль иу хатт ма:',
@@ -582,7 +584,7 @@ $2',
 'emailauthenticated' => 'Дæ e-mail уыд бæлвырдгонд $2 $3 сахатыл.',
 'emailnotauthenticated' => 'Дæ e-mail адрис нырмæ нæу бæлвырдгонд.
 Иу e-mail дæр дæм нæ уыдзæн æрвыст ацы функцитæй.',
-'noemailprefs' => 'Ð\91аÑ\84Ñ\8bÑ\81Ñ\81 e-mail Ð°Ð´Ñ\80иÑ\81 Ð´Ã¦ Ñ\84адæÑ\82ты, цæмæй ацы функцитæ кусой.',
+'noemailprefs' => 'Ð\91аÑ\84Ñ\8bÑ\81Ñ\81 e-mail Ð°Ð´Ñ\80иÑ\81 Ð´Ã¦ Ñ\83агæвæÑ\80дты, цæмæй ацы функцитæ кусой.',
 'emailconfirmlink' => 'Дæ электронон посты адрис сфидар кæн',
 'invalidemailaddress' => 'E-mail нæй гæнæн райсын, уымæн æмæ йæ формат раст нæу.
 Бафысс раст форматы адрис кæнæ та йæ сафтид кæн.',
@@ -682,12 +684,12 @@ $2
 'nowiki_tip' => 'Ницæмæ дарын вики формат',
 'image_tip' => 'Æфтыд файл',
 'media_tip' => 'Файлмæ æрвитæн',
-'sig_tip' => 'Дæ ырфыст рæстæгимæ',
+'sig_tip' => 'Дæ къухæрфыст, рæстæгимæ',
 'hr_tip' => 'Горизонталон хахх (арæх дзы ма пайда кæн)',
 
 # Edit pages
 'summary' => 'Бындур:',
-'subject' => 'Темæ/сæргонд:',
+'subject' => 'Темæ/сæр:',
 'minoredit' => 'Ай чысыл ивд у.',
 'watchthis' => 'Цæст дарын ацы фарсмæ',
 'savearticle' => 'Бавæрын',
@@ -716,7 +718,7 @@ $2
 * Блокы мысан: $7
 
 Дæ бон у бадзурай {{grammar:allative|$1}} кæнæ [[{{MediaWiki:Grouppage-sysop}}|радгæсмæ]], цæмæй блокы тыххæй аныхас кæнай.
\94æ Ð±Ð¾Ð½ Ð½Ã¦Ñ\83 Ñ\8dлекÑ\82Ñ\80онон Ñ\84Ñ\8bÑ\81Ñ\82æг Ã¦Ð¼ Ð°Ñ\80виÑ\82ай, Ñ\86алÑ\8bнмæ Ð´Ã¦ [[Special:Preferences|аккаÑ\83нÑ\82Ñ\8b Ñ\84адæÑ\82ты]] раст e-mail нæ бацамонай æмæ цалынмæ уымæй дæр нæ дæ блокгонд.
\94æ Ð±Ð¾Ð½ Ð½Ã¦Ñ\83 Ñ\8dлекÑ\82Ñ\80онон Ñ\84Ñ\8bÑ\81Ñ\82æг Ã¦Ð¼ Ð°Ñ\80виÑ\82ай, Ñ\86алÑ\8bнмæ Ð´Ã¦ [[Special:Preferences|аккаÑ\83нÑ\82Ñ\8b Ñ\83агæвæÑ\80дты]] раст e-mail нæ бацамонай æмæ цалынмæ уымæй дæр нæ дæ блокгонд.
 Дæ нырыккон IP адрис у $3, æмæ блокы бæрæггæнæн у #$5.
 Дæ хорзæхæй, уæлдæр цы детальтæ ис, уыдон иу дæ домæнмæ бафтау.",
 'autoblockedtext' => "'''Дæ IP адрис йæхæдæг ныблок ис, уымæн æмæ ууылты архайдта æндæр архайæг, кæй ныблок кодта $1.'''
@@ -730,14 +732,14 @@ $2
 
 Дæ бон у бадзурай {{grammar:allative|$1}} кæнæ æндæр [[{{MediaWiki:Grouppage-sysop}}|радгæсмæ]], цæмæй блокы тыххæй аныхас кæнай.
 
\94æ Ð±Ð¾Ð½ Ð½Ã¦Ñ\83 Ñ\8dлекÑ\82Ñ\80онон Ñ\84Ñ\8bÑ\81Ñ\82æг Ã¦Ð¼ Ð°Ñ\80виÑ\82ай, Ñ\86алÑ\8bнмæ Ð´Ã¦ [[Special:Preferences|аккаÑ\83нÑ\82Ñ\8b Ñ\84адæÑ\82ты]] раст e-mail нæ бацамонай æмæ цалынмæ уымæй дæр нæ дæ блокгонд.
\94æ Ð±Ð¾Ð½ Ð½Ã¦Ñ\83 Ñ\8dлекÑ\82Ñ\80онон Ñ\84Ñ\8bÑ\81Ñ\82æг Ã¦Ð¼ Ð°Ñ\80виÑ\82ай, Ñ\86алÑ\8bнмæ Ð´Ã¦ [[Special:Preferences|аккаÑ\83нÑ\82Ñ\8b Ñ\83агæвæÑ\80дты]] раст e-mail нæ бацамонай æмæ цалынмæ уымæй дæр нæ дæ блокгонд.
 
 Дæ нырыккон IP адрис у $3, æмæ блокы бæрæггæнæн у #$5.
 Дæ хорзæхæй, уæлдæр цы детальтæ ис, уыдон иу дæ домæнмæ бафтау.",
 'blockednoreason' => 'аххос амынд не ’рцыд',
 'whitelistedittext' => 'Дæуæн хъæуы $1, цæмæй фæртæ ивай.',
 'confirmedittext' => 'Фæрстæ ивыны размæ ды хъуамæ сбæлвырд кæнай дæ e-mail адрис.
\94æ Ñ\85æÑ\80зæÑ\85æй, Ñ\81æвæÑ\80 Ã¦Ð¼Ã¦ Ñ\81бæлвÑ\8bÑ\80д ÐºÃ¦Ð½ Ð´Ã¦ e-mail Ð°Ð´Ñ\80иÑ\81 Ð´Ã¦ [[Special:Preferences|Ñ\84адæÑ\82ты]].',
\94æ Ñ\85æÑ\80зæÑ\85æй, Ñ\81æвæÑ\80 Ã¦Ð¼Ã¦ Ñ\81бæлвÑ\8bÑ\80д ÐºÃ¦Ð½ Ð´Ã¦ e-mail Ð°Ð´Ñ\80иÑ\81 Ð´Ã¦ [[Special:Preferences|Ñ\83агæвæÑ\80дты]].',
 'nosuchsectiontitle' => 'Хай нæ уард кæны',
 'nosuchsectiontext' => 'Ды фæлвардтай ахæм фарс ивын, кæцы нæй.
 Гæнæн ис, цалынмæ ды фарс кастæ, уый хаст кæнæ хафт æрцыдис.',
@@ -761,16 +763,19 @@ $2
 кæнæ [{{fullurl:{{FULLPAGENAME}}|action=edit}} скæнын ацы фарс]</span>.',
 'noarticletext-nopermission' => 'Ацы фарсы нырмæ текст нæй.
 Дæ бон у [[Special:Search/{{PAGENAME}}|бацагурын ацы фарсы ном]] æндæр фæрсты, кæнæ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} агурын йæ кой логты]</span>, фæлæ дын йæ саразыны бар нæй.',
+'userpage-userdoesnotexist-view' => 'Архайæджы аккаунт "$1" регистрацигонд нæу.',
 'note' => "'''Бафиппай:'''",
 'previewnote' => "'''Зон æй, æмæ ай у æрмæстдæр разбакаст.'''
 Дæ ивдтытæ нырмæ æвæрд не рцыдысты!",
-'continue-editing' => 'Ð\94аÑ\80ддæÑ\80 Ð¸Ð²ын',
+'continue-editing' => 'Ð\98вÑ\8bнÑ\8b Ð±Ñ\8bнаÑ\82мæ Ð°Ñ\86æÑ\83ын',
 'editing' => 'Ивд цæуы $1',
+'creating' => 'Конд цæуы $1',
 'editingsection' => 'Ивыс $1 (фарсы хай)',
+'editingcomment' => 'Ивд цæуы $1 (ног хай)',
 'editconflict' => 'Ивыны конфликт: $1',
 'yourtext' => 'Дæ текст',
 'yourdiff' => 'Хицæндзинæдтæ',
-'templatesused' => 'Ð\90Ñ\86Ñ\8b Ñ\84аÑ\80Ñ\81Ñ\8b Ð¸Ñ\81 {{PLURAL:$1|Ñ\88аблон|Ñ\88аблоны}}:',
+'templatesused' => 'Ð\90Ñ\86Ñ\8b Ñ\84аÑ\80Ñ\81Ñ\8b Ð¸Ñ\81 {{PLURAL:$1|Ñ\85Ñ\83Ñ\8bзæг|Ñ\85Ñ\83Ñ\8bзæджы}}:',
 'template-protected' => '(æхгæд)',
 'template-semiprotected' => '(æрдæг-æхгæд)',
 'hiddencategories' => 'Ацы фарс у {{PLURAL:$1|1 æмбæхст категорийы|$1 æмбæхст категориты}} уæнг:',
@@ -786,12 +791,12 @@ $2
 'edit-already-exists' => 'Ног фарс скæнæн нæй. Ахæм фарс ис.',
 
 # Parser/template warnings
-'post-expand-template-inclusion-warning' => "'''СÑ\8bндæг: ''' Ð¨Ð°Ð±Ð»Ð¾Ð½ы бавæрд бæрц æгæр стыр у.
\9aæÑ\86Ñ\8bдæÑ\80 Ñ\88аблонтæ нæ бавæд уыдзысты.",
-'post-expand-template-inclusion-category' => 'ФæÑ\80Ñ\81Ñ\82æ, ÐºÃ¦Ð¼ Ñ\88аблоны бавæрд бæрц æгæр бирæ у',
-'post-expand-template-argument-warning' => "'''СÑ\8bндæг:''' Ð\90Ñ\86Ñ\8b Ñ\84аÑ\80Ñ\81Ñ\8b Ð¸Ñ\81 Ñ\83æддæÑ\80 Ð¸Ñ\83 Ñ\88аблоны аргумент, кæй райтынг у æгæр стыр.
+'post-expand-template-inclusion-warning' => "'''СÑ\8bндæг: ''' Ð¥Ñ\83Ñ\8bзæджы бавæрд бæрц æгæр стыр у.
\9aæÑ\86Ñ\8bдæÑ\80 Ñ\85Ñ\83Ñ\8bзæгтæ нæ бавæд уыдзысты.",
+'post-expand-template-inclusion-category' => 'ФæÑ\80Ñ\81Ñ\82æ, ÐºÃ¦Ð¼ Ñ\85Ñ\83Ñ\8bзæджы бавæрд бæрц æгæр бирæ у',
+'post-expand-template-argument-warning' => "'''СÑ\8bндæг:''' Ð\90Ñ\86Ñ\8b Ñ\84аÑ\80Ñ\81Ñ\8b Ð¸Ñ\81 Ñ\83æддæÑ\80 Ð¸Ñ\83 Ñ\85Ñ\83Ñ\8bзæджы аргумент, кæй райтынг у æгæр стыр.
 Уыцы аргументтæ уагъд æрцыдысты.",
-'post-expand-template-argument-category' => 'ФæÑ\80Ñ\81Ñ\82æ, ÐºÃ¦Ð´Ð¾Ð½Ñ\8b Ð¸Ñ\81 Ñ\88аблоны уагъд аргумент',
+'post-expand-template-argument-category' => 'ФæÑ\80Ñ\81Ñ\82æ, ÐºÃ¦Ð´Ð¾Ð½Ñ\8b Ð¸Ñ\81 Ñ\85Ñ\83Ñ\8bзæджы уагъд аргумент',
 
 # History pages
 'viewpagelogs' => 'Ацы фарсæн йæ логтæ равдисын',
@@ -826,7 +831,10 @@ $2
 'rev-deleted-user' => '(фæсномыг хафт у)',
 'rev-deleted-event' => '(фыст хафт у)',
 'rev-delundel' => 'равдисын/айсын',
+'rev-showdeleted' => 'равдисын',
 'revisiondelete' => 'Схафын/рацаразын фарсы фæлтæртæ',
+'revdelete-radio-set' => 'О',
+'revdelete-radio-unset' => 'Нæ',
 'revdel-restore' => 'ивын зынæн',
 'revdel-restore-deleted' => 'хафт ивдтытæ',
 'revdel-restore-visible' => 'зынгæ ивдтытæ',
@@ -850,8 +858,8 @@ $2
 # Search results
 'searchresults' => 'Агуырды фæстиуджытæ',
 'searchresults-title' => 'Агуырды фæстиуæг: «$1»',
-'titlematches' => 'УаÑ\86Ñ\82Ñ\8b Ñ\81æÑ\80гæндÑ\82Ñ\8b Ã¦Ð¼Ñ\86аÑ\83Ñ\82æ',
-'notitlematches' => 'ФæÑ\80Ñ\81Ñ\82Ñ\8b Ñ\81æÑ\80гæндÑ\82Ñ\8b Ð½Ã¦Ð¹',
+'titlematches' => 'УаÑ\86Ñ\8b Ð½Ð¾Ð¼ Ã¦Ð¼Ð±Ã¦Ð»Ñ\8b',
+'notitlematches' => 'Ð\9dикæÑ\86Ñ\8b Ñ\84аÑ\80Ñ\81Ñ\8b Ð½Ð¾Ð¼ Ã¦Ð¼Ð±Ã¦Ð»Ñ\8b',
 'textmatches' => 'Уацты æмцаутæ',
 'prevn' => 'рæздæры {{PLURAL:$1|$1}}',
 'nextn' => 'иннæ {{PLURAL:$1|$1}}',
@@ -861,7 +869,8 @@ $2
 'viewprevnext' => 'Кæсын ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Ацы викийы ис фарс \"[[:\$1]]\" номимæ.'''",
 'searchmenu-new' => "'''Сараз фарс \"[[:\$1]]\" ацы викийы!'''",
-'searchprofile-articles' => 'Сæргæндты фæрстæ',
+'searchhelp-url' => 'Help:Мидис',
+'searchprofile-articles' => 'Мидисы фæрстæ',
 'searchprofile-project' => 'Æххуыс æмæ Проекты фæрстæ',
 'searchprofile-images' => 'Мультимеди',
 'searchprofile-everything' => 'Алцыдæр',
@@ -877,9 +886,9 @@ $2
 'search-section' => '(хай $1)',
 'search-suggest' => 'Кæд мыййаг агурыс: $1',
 'search-interwiki-caption' => 'Æфсымæрон проекттæ',
+'search-interwiki-default' => '{{grammar:genitive|$1}} фæстиуджытæ:',
 'search-interwiki-more' => '(нодзы)',
-'search-mwsuggest-enabled' => 'æмбарынгæнæнтимæ',
-'search-mwsuggest-disabled' => 'æнæ æмбарынгæнæнтæ',
+'search-relatedarticle' => 'Хæстæг',
 'searchrelated' => 'хæстæг',
 'searchall' => 'иууылдæр',
 'showingresultsheader' => "{{PLURAL:$5|Фæстиуæг '''$1''' '''$3'''-йæ|Фæстиуджытæ '''$1 - $2''' '''$3'''-йæ}} '''{{grammar:dative|$4}}'''",
@@ -898,15 +907,15 @@ $2
 'qbsettings-floatingleft' => 'Рахизырдыгæй ленккæнгæ',
 
 # Preferences page
-'mypreferences' => 'Ð\9cæ Ñ\84адæÑ\82тæ',
+'mypreferences' => 'УагæвæÑ\80дтæ',
 'prefs-edits' => 'Ивдтыты нымæц:',
 'prefsnologin' => 'Системæйæн дæхи нæ бацамыдтай',
 'changepassword' => 'Пароль ивæн',
 'prefs-skin' => 'Цъар',
 'skin-preview' => 'Разæркаст',
-'prefs-beta' => 'Ð\91еÑ\82а Ñ\84адæÑ\82тæ',
+'prefs-beta' => 'Ð\91еÑ\82а Ñ\83агæвæÑ\80дтæ',
 'prefs-datetime' => 'Датæ æмæ рæстæг',
-'prefs-labs' => 'Ð\9bабоÑ\80аÑ\82оÑ\80он Ñ\84адæÑ\82тæ',
+'prefs-labs' => 'Ð\9bабоÑ\80аÑ\82оÑ\80он Ñ\83агæвæÑ\80дтæ',
 'prefs-personal' => 'Архайæджы профил',
 'prefs-rc' => 'Фæстаг ивдтытæ',
 'prefs-watchlist' => 'Цæстдард',
@@ -935,7 +944,7 @@ $2
 'timezoneregion-europe' => 'Европæ',
 'timezoneregion-indian' => 'Индийы фурд',
 'timezoneregion-pacific' => 'Сабыр Фурд',
-'prefs-searchoptions' => 'Агурыны фадæттæ',
+'prefs-searchoptions' => 'Агурын',
 'prefs-namespaces' => 'Номдæттæ',
 'prefs-files' => 'Файлтæ',
 'prefs-custom-css' => 'Хиæвæрд CSS',
@@ -1061,13 +1070,14 @@ $3',
 'filedesc' => 'Афыст:',
 'minlength1' => 'Файлы номы хъуамæ æппынкъаддæр иу дамгъæ уа.',
 'badfilename' => 'Нывы ном ивд æрцыдис. Ныр хуины «$1».',
-'savefile' => 'Ð\91авæÑ\80 Ã¦Ð¹',
+'savefile' => 'Файл Ð±Ð°Ð²Ã¦Ñ\80Ñ\8bн',
 'uploadedimage' => 'бавгæдта "[[$1]]"',
-'uploadvirus' => 'Файлы разынд вирус! Кæс $1',
-'watchthisupload' => 'Цæст дарын ацы файлмæ',
-'upload-success-subj' => 'Файлы сæвæрд фæрæстмæ',
+'uploadvirus' => 'Файлы ис вирус! 
+Лæмбынæг: $1',
+'watchthisupload' => 'Ацы файлмæ цæст æрдарын',
+'upload-success-subj' => 'Æвгæд æрцыд',
 
-'upload-file-error' => 'Мидæг рæдыд',
+'upload-file-error' => 'Мидæггаг рæдыд',
 
 'license' => 'Лицензи:',
 'license-header' => 'Лицензи',
@@ -1075,11 +1085,19 @@ $3',
 # Special:ListFiles
 'listfiles' => 'Нывты номхыгъд',
 'listfiles_thumb' => 'Къаддæргонд',
+'listfiles_date' => 'Датæ',
+'listfiles_name' => 'Ном',
+'listfiles_user' => 'Архайæг',
+'listfiles_size' => 'Ас',
+'listfiles_description' => 'Амынд',
+'listfiles_count' => 'Фæлтæртæ',
 
 # File description page
 'file-anchor-link' => 'Файл',
 'filehist' => 'Файлы истори',
 'filehist-help' => 'Ныххæц датæ/рæстæг-ыл, цæмæй фенай еуæд куыд фæзындис.',
+'filehist-deleteall' => 'иууылдæр схафын',
+'filehist-deleteone' => 'схафын',
 'filehist-revert' => 'раивын',
 'filehist-current' => 'нырыккон',
 'filehist-datetime' => 'Датæ/рæстæг',
@@ -1090,6 +1108,7 @@ $3',
 'filehist-dimensions' => 'Барæнтæ',
 'filehist-filesize' => 'Файлы бæрцуат',
 'filehist-comment' => 'Фиппаинаг',
+'filehist-missing' => 'Файл нæ зыны',
 'imagelinks' => 'Файлæй архайд',
 'linkstoimage' => 'Ацы нывæй пайда {{PLURAL:$1|кæны иу фарс|кæнынц ахæм фæрстæ}}:',
 'nolinkstoimage' => 'Нæй ахæм фæрстæ, кæдон æрвитынц ацы файлмæ.',
@@ -1100,22 +1119,29 @@ $3',
 [$2 Йæ фарсæй] афыст у æвдыст бындæр',
 
 # File deletion
-'filedelete-submit' => 'Аппар',
+'filedelete-comment' => 'Бындур:',
+'filedelete-submit' => 'Схафын',
+'filedelete-success' => "'''$1''' хафт æрцыд.",
 'filedelete-otherreason' => 'Æндæр кæнæ уæлæмхасæн аххос:',
 'filedelete-reason-otherlist' => 'Æндæр аххос',
 
 # MIME search
-'download' => 'æрбавгæн',
+'download' => 'равгæнын',
 
 # Unused templates
-'unusedtemplates' => 'Ð\9fайда ÐºÃ¦Ð¼Ã¦Ð¹ Ð½Ã¦ Ñ\87Ñ\8bндæÑ\83Ñ\8b, Ð°Ñ\85æм Ñ\88аблонтæ',
+'unusedtemplates' => 'Ð\9fайда ÐºÃ¦Ð¼Ã¦Ð¹ Ð½Ã¦ Ñ\87Ñ\8bндæÑ\83Ñ\8b, Ð°Ñ\85æм Ñ\85Ñ\83Ñ\8bзæгтæ',
 
 # Random page
-'randompage' => 'Халæй ист фарс',
+'randompage' => 'Æрхаугæ фарс',
 
 # Statistics
 'statistics' => 'Статистикæ',
+'statistics-header-pages' => 'Фарсы статистикæ',
+'statistics-header-edits' => 'Ивдтыты статистикæ',
+'statistics-header-views' => 'Бакастыты статистикæ',
 'statistics-header-users' => 'Архайджыты статистикæ',
+'statistics-header-hooks' => 'Æндæр статистикæтæ',
+'statistics-articles' => 'Мидисы фæрстæ',
 
 'disambiguationspage' => 'Template:бирæнысанон',
 
@@ -1130,16 +1156,22 @@ $3',
 
 # 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|фæлтæр|фæлтæры}}',
 'nviews' => '$1 {{PLURAL:$1|æркаст|æркасты}}',
+'nimagelinks' => 'Архайд цæуы $1 {{PLURAL:$1|фарсы}}',
+'ntransclusions' => 'архайд цæуы $1 {{PLURAL:$1|фарсы}}',
 'lonelypages' => 'Сидзæр фæрстæ',
 'uncategorizedpages' => 'Æнæкатегори фæрстæ',
 'uncategorizedimages' => 'Æнæкатегори файлтæ',
-'uncategorizedtemplates' => 'Ã\86нæкаÑ\82егоÑ\80и Ñ\88аблонтæ',
+'uncategorizedtemplates' => 'Ã\86нæкаÑ\82егоÑ\80и Ñ\85Ñ\83Ñ\8bзæгтæ',
 'popularpages' => 'Популярон фæрстæ',
 'wantedcategories' => 'Хъæугæ категоритæ',
 'wantedpages' => 'Хъæугæ фæрстæ',
+'wantedfiles' => 'Хъæугæ файлтæ',
 'mostlinked' => 'Фылдæр æрвитæнтæ кæмæ и, ахæм фæрстæ',
 'mostlinkedcategories' => 'Фылдæр æрвитæнтæ кæмæ и, уыцы категоритæ',
 'mostrevisions' => 'Фылдæр кæй ивынц, ахæм фæрстæ',
@@ -1148,6 +1180,7 @@ $3',
 'longpages' => 'Даргъ фæрстæ',
 'protectedpages' => 'Æхгæд фæрстæ',
 'listusers' => 'Архайджыты номхыгъд',
+'usereditcount' => '$1 {{PLURAL:$1|ивд|ивды}}',
 'usercreated' => '{{GENDER:$3|Фæзындис}} $1, {{grammar:superessive|$2}}',
 'newpages' => 'Ног фæрстæ',
 'newpages-username' => 'Архайæг:',
@@ -1175,7 +1208,7 @@ $3',
 'allarticles' => 'Иууылдæр фæрстæ',
 'allpagesprev' => 'фæстæмæ',
 'allpagesnext' => 'дарддæр',
-'allpagessubmit' => 'Агур',
+'allpagessubmit' => 'Ацæуын',
 
 # Special:Categories
 'categories' => 'Категоритæ',
@@ -1199,6 +1232,7 @@ $3',
 
 # Special:ListGroupRights
 'listgrouprights-group' => 'Къорд',
+'listgrouprights-rights' => 'Бартæ',
 'listgrouprights-members' => '(уæнгты номхыгъд)',
 
 # E-mail user
@@ -1208,7 +1242,7 @@ $3',
 
 # Watchlist
 'watchlist' => 'Мæ цæстдард рæгъ',
-'mywatchlist' => 'Ð\9cæ Ñ\86æÑ\81Ñ\82даÑ\80д Ñ\84æÑ\80Ñ\81Ñ\82æ',
+'mywatchlist' => 'ЦæÑ\81Ñ\82даÑ\80д',
 'watchlistfor2' => 'Архайæг: $1 $2',
 'nowatchlist' => 'Иу уацмæ дæр дæ цæст нæ дарыс.',
 'watchnologin' => 'Системæйæн дæхи нæ бацамыдтай',
@@ -1228,8 +1262,6 @@ $3',
 'watching' => 'Цæстдард фæрсты номхыгъдмæ афтауын...',
 'unwatching' => 'Цæстдард фæрсты номхыгъдæй аиуварс кæнын...',
 
-'enotif_newpagetext' => 'Ай у нæуæг фарс.',
-'changed' => 'ивд æрцыд',
 'enotif_anon_editor' => 'сусæг архайæг $1',
 
 # Delete
@@ -1275,7 +1307,7 @@ $3',
 # Contributions
 'contributions' => 'Архайæджы бавæрд',
 'contributions-title' => 'Архайæджы бавæрд: $1',
-'mycontris' => 'Ð\9cæ Ð±авæрд',
+'mycontris' => 'Ð\91авæрд',
 'contribsub2' => 'Архайæг: $1 ($2)',
 'uctop' => '(фæстаг)',
 'month' => 'Ацы мæйы (æмæ раздæр):',
@@ -1306,7 +1338,7 @@ $3',
 'whatlinkshere-hideredirs' => '$1 рарвыстытæ',
 'whatlinkshere-hidetrans' => '$1 æфтыдтытæ',
 'whatlinkshere-hidelinks' => '$1 æрвитæнтæ',
-'whatlinkshere-hideimages' => '$1 нывмæ æрвитæнтæ',
+'whatlinkshere-hideimages' => 'Файлмæ æрвитæнтæ $1',
 'whatlinkshere-filters' => 'Фильтртæ',
 
 # Block/unblock
@@ -1369,7 +1401,7 @@ $3',
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Дæ архайæджы фарс',
 'tooltip-pt-mytalk' => 'Дæ ныхасы фарс',
-'tooltip-pt-preferences' => 'Ð\94æ Ñ\84адæÑ\82тæ',
+'tooltip-pt-preferences' => 'Ð\94æ Ñ\83агæвæÑ\80дтæ',
 'tooltip-pt-watchlist' => 'Фæрстæ кæй ивдтытæм ды дарыс дæ цæст',
 'tooltip-pt-mycontris' => 'Дæ бавæрд',
 'tooltip-pt-login' => 'Хуыздæр у куы бахизай системæмæ; фæлæ нæмæнг нæу',
@@ -1410,7 +1442,7 @@ $3',
 'tooltip-ca-nstab-special' => 'Ай сæрмагонд фарс у, дæ бон æй нæу ивын',
 'tooltip-ca-nstab-project' => 'Фенын проекты фарс',
 'tooltip-ca-nstab-image' => 'Нывы фарс',
-'tooltip-ca-nstab-template' => 'ФенÑ\8bн Ñ\88аблон',
+'tooltip-ca-nstab-template' => 'Ð¥Ñ\83Ñ\8bзæг Ñ\84енÑ\8bн',
 'tooltip-ca-nstab-category' => 'Категорийы фарс',
 'tooltip-minoredit' => 'Чысыл ивдæй йæ банысан кæнын',
 'tooltip-save' => 'Бавæр дæ ивдтытæ',
@@ -1571,6 +1603,7 @@ $3',
 # Special:FilePath
 'filepath' => 'Файлмæ фæт',
 'filepath-page' => 'Файл:',
+'filepath-submit' => 'Бацæуын',
 
 # Special:FileDuplicateSearch
 'fileduplicatesearch-filename' => 'Файлы ном:',
@@ -1624,7 +1657,7 @@ $3',
 'api-error-unknown-error' => 'Мидæггаг рæдыд: Цыдæр раст нæ ацыдис, файл куы æвгæдтай, уæд.',
 'api-error-unknown-warning' => 'Нæзонгæ фæдзæхст: "$1".',
 'api-error-unknownerror' => 'Нæзонгæ рæдыд: "$1".',
-'api-error-uploaddisabled' => 'Ацы викийы бавгæныны фадат хицæн у.',
+'api-error-uploaddisabled' => 'Ацы викийы, бавгæныны фадат хицæн у.',
 'api-error-verification-error' => 'Ацы файл гæнæн ис хæлд у, кæнæ йæ номы фæстаг хай раст нæу.',
 
 # Durations
index 6e0857c..750bc43 100644 (file)
  * @author Aalam
  * @author Amire80
  * @author Anjalikaushal
+ * @author Babanwalia
  * @author Gman124
  * @author Guglani
  * @author Kaganer
+ * @author Raj Singh
  * @author Sukh
  * @author Surinder.wadhawan
  * @author TariButtar
@@ -57,10 +59,58 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
-       'Activeusers'               => array( 'ਸਰਗਰਮ_ਵਰਤੌਂਕਾਰ' ),
-       'Blankpage'                 => array( 'ਖਾਲੀ_ਸਫ਼ਾ' ),
-       'Block'                     => array( 'ਪਾਬੰਦੀ_ਲਾਉਣਾ', 'ਪਾਬੰਦੀ_ਸ਼ੁਦਾ_ਆਈ_ਪੀ', 'ਪਾਬੰਦੀ_ਸ਼ੁਦਾ_ਵਰਤੌਂਕਾਰ' ),
-       'Listusers'                 => array( 'ਵਰਤੌਂਕਾਰਾਂ_ਦੀ_ਸੂਚੀ' ),
+       'Activeusers'               => array( 'ਸਰਗਰਮ_ਮੈਂਬਰ' ),
+       'Badtitle'                  => array( 'ਖਰਾਬ_ਸਿਰਲੇਖ' ),
+       'Blankpage'                 => array( 'ਖਾਲੀ_ਪੰਨਾ' ),
+       'Block'                     => array( 'ਪਾਬੰਦੀ_ਲਾਓ', 'IP_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ', 'ਮੈਂਬਰ_’ਤੇ_ਪਾਬੰਦੀ_ਲਾਓ' ),
+       'Categories'                => array( 'ਸ਼੍ਰੇਣੀਆਂ' ),
+       'ChangeEmail'               => array( 'ਈ-ਮੇਲ_ਬਦਲੋ' ),
+       'ChangePassword'            => array( 'ਪਾਸਵਰਡ_ਬਦਲੋ', 'ਪਾਸਵਰਡ_ਰੀਸੈੱਟ_ਕਰੋ' ),
+       'Contributions'             => array( 'ਯੋਗਦਾਨ' ),
+       'CreateAccount'             => array( 'ਖਾਤਾ_ਬਣਾਓ' ),
+       'DeletedContributions'      => array( 'ਮਿਟਾਏ_ਯੋਗਦਾਨ' ),
+       'DoubleRedirects'           => array( 'ਦੂਹਰੇ_ਰੀਡਿਰੈਕਟ' ),
+       'EditWatchlist'             => array( 'ਨਿਗਰਾਨੀ-ਲਿਸਟ_ਸੋਧੋ' ),
+       'Emailuser'                 => array( 'ਵਰਤੋਂਕਾਰ_ਨੂੰ_ਈ-ਮੇਲ' ),
+       'JavaScriptTest'            => array( 'ਜਾਵਾਸਕ੍ਰਿਪਟ_ਪਰਖ' ),
+       'Listadmins'                => array( 'ਐਡਮਿਨਾਂ_ਦੀ_ਸੂਚੀ' ),
+       'Listbots'                  => array( 'ਬੋਟਾਂ_ਦੀ_ਲਿਸਟ' ),
+       'Listfiles'                 => array( 'ਫ਼ਾਈਲਾਂ_ਦੀ_ਲਿਸਟ', 'ਤਸਵੀਰਾਂ_ਦੀ_ਲਿਸਟ' ),
+       'Listredirects'             => array( 'ਰੀਡਿਰੈਕਟਾਂ_ਦੀ_ਲਿਸਟ' ),
+       'Listusers'                 => array( 'ਵਰਤੋਂਕਾਰਾਂ_ਦੀ_ਲਿਸਟ' ),
+       'Longpages'                 => array( 'ਲੰਬੇ_ਸਫ਼ੇ' ),
+       'MergeHistory'              => array( 'ਰਲ਼ਾਉਣ_ਦਾ_ਅਤੀਤ' ),
+       'MIMEsearch'                => array( 'MIME_ਖੋਜ' ),
+       'Movepage'                  => array( 'ਸਿਰਲੇਖ_ਬਦਲੋ' ),
+       'Mycontributions'           => array( 'ਮੇਰੇ_ਯੋਗਦਾਨ' ),
+       'Mytalk'                    => array( 'ਮੇਰੀ_ਚਰਚਾ' ),
+       'Myuploads'                 => array( 'ਮੇਰੇ_ਅੱਪਲੋਡ' ),
+       'Newimages'                 => array( 'ਨਵੀਆਂ_ਫ਼ਾਈਲਾਂ', 'ਨਵੀਆਂ_ਤਸਵੀਰਾਂ' ),
+       'Newpages'                  => array( 'ਨਵੇਂ_ਪੰਨੇ' ),
+       'PasswordReset'             => array( 'ਪਾਸਵਰਡ_ਰੀਸੈੱਟ' ),
+       'PermanentLink'             => array( 'ਪੱਕਾ_ਲਿੰਕ' ),
+       'Popularpages'              => array( 'ਮਸ਼ਹੂਰ_ਪੰਨੇ' ),
+       'Preferences'               => array( 'ਪਸੰਦਾਂ' ),
+       'Prefixindex'               => array( 'ਅਗੇਤਰ_ਤਤਕਰਾ' ),
+       'Protectedpages'            => array( 'ਸੁਰੱਖਿਅਤ_ਪੰਨੇ' ),
+       'Protectedtitles'           => array( 'ਸੁਰੱਖਿਅਤ_ਸਿਰਲੇਖ' ),
+       'Randompage'                => array( 'ਰਲ਼ਵਾਂ', 'ਰਲਵਾਂ_ਪੰਨਾ' ),
+       'Randomredirect'            => array( 'ਰਲਵਾਂ_ਰੀਡਿਰੈਕਟ' ),
+       'Recentchanges'             => array( 'ਤਾਜਾ_ਤਬਦੀਲੀਆਂ' ),
+       'Search'                    => array( 'ਖੋਜ' ),
+       'Shortpages'                => array( 'ਛੋਟੇ_ਪੰਨੇ' ),
+       'Specialpages'              => array( 'ਖਾਸ_ਪੰਨੇ' ),
+       'Statistics'                => array( 'ਆਂਕੜੇ' ),
+       'Tags'                      => array( 'ਟੈਗ' ),
+       'Undelete'                  => array( 'ਅਣ-ਮਿਟਾਉਣ' ),
+       'Upload'                    => array( 'ਅੱਪਲੋਡ' ),
+       'Userlogin'                 => array( 'ਮੈਂਬਰ_ਲਾਗਇਨ' ),
+       'Userlogout'                => array( 'ਮੈਂਬਰ_ਲਾਗਆਊਟ' ),
+       'Wantedcategories'          => array( 'ਚਾਹੀਦੀਆਂ_ਸ਼੍ਰੇਣੀਆਂ' ),
+       'Wantedfiles'               => array( 'ਚਾਹੀਦੀਆਂ_ਫ਼ਾਈਲਾਂ' ),
+       'Wantedtemplates'           => array( 'ਚਾਹੀਦੇ_ਫਰਮੇ' ),
+       'Watchlist'                 => array( 'ਨਿਗਰਾਨੀ-ਲਿਸਟ' ),
+       'Withoutinterwiki'          => array( 'ਬਿਨਾਂ_ਇੰਟਰਵਿਕੀਆਂ_ਵਾਲੇ' ),
 );
 
 $digitTransformTable = array(
@@ -95,7 +145,7 @@ $messages = array(
 '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 à¨\85ਤà©\87 à¨\85ੱਪਲà©\8bਡ à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿ਚ ਪਾਓ',
+'tog-watchcreations' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨¬à¨£à¨¾à¨\8f à¨\97à¨\8f à¨ªà©°à¨¨à©\87 à¨\85ਤà©\87 à¨\85ੱਪਲà©\8bਡ à¨\95à©\80ਤà©\80à¨\86à¨\82 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿à©±ਚ ਪਾਓ',
 'tog-watchdefault' => 'ਮੇਰੇ ਵੱਲੋਂ ਸੋਧੇ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
 'tog-watchmoves' => 'ਮੇਰੇ ਵੱਲੋਂ ਬਦਲੇ ਸਿਰਲੇਖਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
 'tog-watchdeletion' => 'ਮੇਰੇ ਵਲੋਂ ਮਿਟਾਏ ਗਏ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਪਾਓ',
@@ -135,7 +185,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 
 'underline-always' => 'ਹਮੇਸ਼ਾਂ',
 'underline-never' => 'ਕਦੇ ਨਹੀਂ',
-'underline-default' => 'ਬਰਾà¨\8aà¨\9c਼ਰ ਡਿਫਾਲਟ',
+'underline-default' => 'ਵਿਸ਼ਾ-ਵਸਤà©\82 à¨\9cਾà¨\82 à¨\87à©°à¨\9fਰਨà©\88ੱà¨\9f-à¨\9aਾਰà¨\95 ਡਿਫਾਲਟ',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'ਸੰਪਾਦਨ ਖੇਤਰ ਦੇ ਅੱਖਰਾਂ ਦੀ ਫ਼ੌਂਟ ਰੀਤੀ',
@@ -167,10 +217,10 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'june' => 'ਜੂਨ',
 'july' => 'ਜੁਲਾਈ',
 'august' => 'ਅਗਸਤ',
-'september' => 'ਸਿਤੰਬਰ',
+'september' => 'ਸਤੰਬਰ',
 'october' => 'ਅਕਤੂਬਰ',
 'november' => 'ਨਵੰਬਰ',
-'december' => 'ਦਿਸੰਬਰ',
+'december' => 'ਦਸੰਬਰ',
 'january-gen' => 'ਜਨਵਰੀ',
 'february-gen' => 'ਫ਼ਰਵਰੀ',
 'march-gen' => 'ਮਾਰਚ',
@@ -191,14 +241,14 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'jun' => 'ਜੂਨ',
 'jul' => 'ਜੁਲਾਈ',
 'aug' => 'ਅਗਸਤ',
-'sep' => 'ਸਿਤੰਬਰ',
+'sep' => 'ਸਤੰਬਰ',
 'oct' => 'ਅਕਤੂਬਰ',
 'nov' => 'ਨਵੰਬਰ',
-'dec' => 'ਦਿਸੰਬਰ',
+'dec' => 'ਦਸੰਬਰ',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|à¨\95à©\88à¨\9fà©\87à¨\97ਰà©\80|à¨\95à©\88à¨\9fà©\87à¨\97ਰੀਆਂ}}',
-'category_header' => 'à¨\95à©\88à¨\9fà©\87à¨\97ਰà©\80 "$1" à¨µà¨¿ਚ ਲੇਖ',
+'pagecategories' => '{{PLURAL:$1|ਸ਼à©\8dਰà©\87ਣà©\80|ਸ਼à©\8dਰà©\87ਣੀਆਂ}}',
+'category_header' => 'ਸ਼à©\8dਰà©\87ਣà©\80 "$1" à¨µà¨¿à©±ਚ ਲੇਖ',
 'subcategories' => 'ਸਬ-ਕੈਟੇਗਰੀਆਂ',
 'category-media-header' => 'ਕੈਟੇਗਰੀ "$1" ਵਿਚ ਮੀਡੀਆ',
 'category-empty' => "''ਇਸ ਕੈਟੇਗਰੀ ਵਿਚ ਇਸ ਵੇਲ਼ੇ ਕੋਈ ਵੀ ਸਫ਼ਾ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ ਹੈ।''",
@@ -206,7 +256,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'hidden-category-category' => 'ਲੁਕੀਆਂ ਕੈਟੇਗਰੀਆਂ',
 'category-subcat-count' => 'ਇਸ ਕੈਟੇਗਰੀ ਵਿਚ, ਕੁੱਲ $2 ਵਿਚੋਂ, {{PLURAL:$2|ਸਿਰਫ਼ ਇਹ ਸਬ-ਕੈਟੇਗਰੀ ਹੈ|ਇਹ {{PLURAL:$1|ਸਬ-ਕੈਟੇਗਰੀ ਹੈ|$1 ਸਬ-ਕੈਟੇਗਰੀਆਂ ਹਨ}}}}।',
 'category-subcat-count-limited' => 'ਇਸ ਕੈਟੇਗਰੀ ਵਿਚ {{PLURAL:$1|ਸਬ-ਕੈਟੇਗਰੀ ਹੈ|$1 ਸਬ-ਕੈਟੇਗਰੀਆਂ ਹਨ}}।',
-'category-article-count' => '{{PLURAL:$2|à¨\87ਸ à¨\95à©\88à¨\9fà©\87à¨\97ਰà©\80 à¨µà¨¿à¨\9a à¨¸à¨¿à¨°à¨«à¨¼ à¨\87ਹ à¨¸à¨«à¨¼à¨¾ à¨¹à©\88|à¨\87ਸ à¨\95à©\88à¨\9fà©\87à¨\97ਰà©\80 à¨µà¨¿à¨\9a, à¨\95à©\81ੱਲ $2 à¨µà¨¿à¨\9aà©\8bà¨\82, à¨\87ਹ {{PLURAL:$1|ਸਫ਼ਾ à¨¹à©\88|$1 à¨¸à¨«à¨¼ੇ ਹਨ}}}}।',
+'category-article-count' => '{{PLURAL:$2|à¨\87ਸ à¨¸à¨¼à©\8dਰà©\87ਣà©\80 à¨µà¨¿à©±à¨\9a à¨¸à¨¿à¨°à¨«à¨¼ à¨\87ਹ à¨ªà©°à¨¨à¨¾ à¨¹à©\88।| à¨\87ਸ à¨¸à¨¼à©\8dਰà©\87ਣà©\80 à¨µà¨¿à©±à¨\9a, à¨\95à©\81ੱਲ $2 à¨µà¨¿à©±à¨\9aà©\8bà¨\82, à¨\87ਹ {{PLURAL:$1|ਪੰਨਾ à¨¹à©\88|$1 à¨ªà©°à¨¨ੇ ਹਨ}}}}।',
 'category-article-count-limited' => 'ਮੌਜੂਦਾ ਕੈਟੇਗਰੀ ਵਿਚ ਇਹ {{PLURAL:$1|ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।',
 'category-file-count' => '{{PLURAL:$2|ਇਸ ਕੈਟੇਗਰੀ ਵਿਚ ਸਿਰਫ਼ ਇਹ ਫ਼ਾਈਲ ਹੈ|ਇਸ ਕੈਟੇਗਰੀ ਵਿਚ {{PLURAL:$1|ਫ਼ਾਈਲ ਹੈ|$1 ਫ਼ਾਈਲਾਂ ਹਨ}}}}।',
 'category-file-count-limited' => 'ਮੌਜੂਦਾ ਕੈਟੇਗਰੀ ਵਿਚ ਇਹ {{PLURAL:$1|ਫ਼ਾਈਲ ਹੈ|$1 ਫ਼ਾਈਲਾਂ ਹਨ}}।',
@@ -220,8 +270,8 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'newwindow' => '(ਨਵੀਂ ਵਿੰਡੋ ਵਿੱਚ ਖੁੱਲ੍ਹਦੀ ਹੈ)',
 'cancel' => 'ਰੱਦ ਕਰੋ',
 'moredotdotdot' => 'ਹੋਰ...',
-'mypage' => 'ਮà©\87ਰਾ à¨¸à¨«à¨¼ਾ',
-'mytalk' => 'ਮà©\87ਰà©\80 à¨\97ੱਲ-ਬਾਤ',
+'mypage' => 'ਪੰਨਾ',
+'mytalk' => 'ਮà©\87ਰà©\80 à¨\9aਰà¨\9aਾ',
 'anontalk' => 'ਇਸ IP ਲਈ ਗੱਲ-ਬਾਤ',
 'navigation' => 'ਰਹਿਨੁਮਾਈ',
 'and' => '&#32;ਅਤੇ',
@@ -230,10 +280,9 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'qbfind' => 'ਖੋਜੋ',
 'qbbrowse' => 'ਬਰਾਊਜ਼',
 'qbedit' => 'ਸੋਧ',
-'qbpageoptions' => 'ਇਹ ਸਫ਼ਾ',
-'qbpageinfo' => 'ਭਾਗ',
-'qbmyoptions' => 'ਮੇਰੇ ਸਫ਼ੇ',
-'qbspecialpages' => 'ਖ਼ਾਸ ਸਫ਼ਾ',
+'qbpageoptions' => 'ਇਹ ਪੰਨਾ',
+'qbmyoptions' => 'ਮੇਰੇ ਪੰਨੇ',
+'qbspecialpages' => 'ਖਾਸ ਪੰਨੇ',
 'faq' => 'ਅਕਸਰ ਪੁੱਛੇ ਜਾਣ ਵਾਲ਼ੇ ਸਵਾਲ',
 'faqpage' => 'Project:ਸਵਾਲ-ਜਵਾਬ',
 
@@ -284,7 +333,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'unprotectthispage' => 'ਇਹ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ',
 'newpage' => 'ਨਵਾਂ ਸਫ਼ਾ',
 'talkpage' => 'ਇਸ ਸਫ਼ੇ ਬਾਰੇ ਚਰਚਾ ਕਰੋ',
-'talkpagelinktext' => 'à¨\97ੱਲ-ਬਾਤ',
+'talkpagelinktext' => 'à¨\9aਰà¨\9aਾ',
 'specialpage' => 'ਖ਼ਾਸ ਸਫ਼ਾ',
 'personaltools' => 'ਨਿੱਜੀ ਸੰਦ',
 'postcomment' => 'ਨਵਾਂ ਸੈਕਸ਼ਨ',
@@ -329,7 +378,7 @@ $1',
 'edithelp' => 'ਮੱਦਦ ਐਡੀਟਿੰਗ',
 'edithelppage' => 'Help:ਐਡਟਿੰਗ',
 'helppage' => 'Help:ਚੀਜ਼ਾਂ',
-'mainpage' => 'ਮà©\81ੱà¨\96 à¨¸à¨«à¨¼ਾ',
+'mainpage' => 'ਮà©\81ੱà¨\96 à¨ªà©°à¨¨ਾ',
 'mainpage-description' => 'ਮੁੱਖ ਸਫ਼ਾ',
 'policy-url' => 'Project:ਪਾਲਸੀ',
 'portal' => 'ਕਮਿਊਨਟੀ ਪੋਰਟਲ',
@@ -355,12 +404,12 @@ $1',
 'newmessageslinkplural' => '{{PLURAL:$1|ਇੱਕ ਨਵਾਂ ਸੁਨੇਹਾ|ਨਵੇਂ ਸੁਨੇਹੇ}} {{PLURAL:$1|ਹੈ|ਹਨ}}',
 'newmessagesdifflinkplural' => 'ਆਖ਼ਰੀ {{PLURAL:$1|ਤਬਦੀਲੀ|ਤਬਦੀਲੀਆਂ}}',
 'youhavenewmessagesmulti' => '$1 ’ਤੇ ਤੁਹਾਡੇ ਲਈ ਨਵੇਂ ਸੁਨੇਹੇ ਹਨ',
-'editsection' => 'ਸੋਧ',
+'editsection' => 'ਸੋਧ',
 'editold' => 'ਸੋਧੋ',
 'viewsourceold' => 'ਸਰੋਤ ਵੇਖੋ',
 'editlink' => 'ਸੋਧੋ',
 'viewsourcelink' => 'ਸਰੋਤ ਵੇਖੋ',
-'editsectionhint' => 'ਸ਼ੈਕਸ਼ਨ ਸੋਧ: $1',
+'editsectionhint' => '$1 ਸੈਕਸ਼ਨ ਸੋਧੋ',
 'toc' => 'ਲਿਸਟ',
 'showtoc' => 'ਵੇਖੋ',
 'hidetoc' => 'ਓਹਲੇ',
@@ -376,7 +425,7 @@ $1',
 'site-atom-feed' => '$1 ਐਟਮ ਫੀਡ',
 'page-rss-feed' => '"$1" RSS ਫੀਡ',
 'page-atom-feed' => '"$1" ਐਟਮ ਫੀਡ',
-'red-link-title' => '$1 (ਸਫ਼ਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ)',
+'red-link-title' => '$1 (ਪੰਨਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ)',
 'sort-descending' => 'ਘੱਟਦਾ ਕ੍ਰਮ',
 'sort-ascending' => 'ਵੱਧਦਾ ਕ੍ਰਮ',
 
@@ -445,6 +494,7 @@ $1',
 'badtitletext' => 'ਤੁਹਾਡਾ ਦਰਖ਼ਾਸਤਸ਼ੁਦਾ ਸਿਰਲੇਖ ਨਾਕਾਬਿਲ, ਖ਼ਾਲੀ ਜਾਂ ਗ਼ਲਤ ਜੁੜਿਆ ਹੋਇਆ inter-languagd ਜਾਂ inter-wiki ਸਿਰਲੇਖ ਹੈ। ਇਹ ਵੀ ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਇਸ ਵਿਚ ਇਕ-ਦੋ ਅੱਖਰ ਐਸੇ ਹੋਣ ਜੋ ਸਿਰਲੇਖ ਵਿਚ ਵਰਤੇ ਨਹੀਂ ਜਾ ਸਕਦੇ।',
 'viewsource' => 'ਸਰੋਤ ਵੇਖੋ',
 'viewsource-title' => '$1 ਲਈ ਸਰੋਤ ਵੇਖੋ',
+'actionthrottled' => 'ਕਾਰਜ ਬੰਦ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ',
 'protectedpagetext' => 'ਇਹ ਸਫ਼ਾ ਫੇਰ-ਬਦਲ ਕਰਨ ਖ਼ਿਲਾਫ਼ ਸੁਰੱਖਿਅਤ ਹੈ।',
 'viewsourcetext' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ਦਾ ਸਰੋਤ ਵੇਖ ਅਤੇ ਨਕਲ ਕਰ ਸਕਦੇ ਹੋ:',
 'viewyourtext' => 'ਤੁਸੀਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਕੀਤੀਆਂ "ਆਪਣੀਆਂ ਸੋਧਾਂ" ਦਾ ਸਰੋਤ ਵੇਖ ਅਤੇ ਨਕਲ ਕਰ ਸਕਦੇ ਹੋ:',
@@ -468,9 +518,8 @@ $1',
 
 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! ==
-
-ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦਾਂ]] ਬਦਲਣੀਆਂ ਨਾ ਭੁੱਲੋ।',
+'welcomeuser' => 'ਸੁਆਗਤ, $1!',
+'welcomecreation-msg' => 'ਤੁਹਾਡਾ ਖਾਤਾ ਬਣ ਚੁੱਕਾ ਹੈ। ਆਪਣੀਆਂ [[Special:Preferences|{{SITENAME}} ਪਸੰਦਾਂ]] ਬਦਲਣੀਆਂ ਨਾ ਭੁੱਲੋ।',
 'yourname' => 'ਮੈਂਬਰ ਨਾਂ:',
 'yourpassword' => 'ਪਾਸਵਰਡ:',
 'yourpasswordagain' => 'ਪਾਸਵਰਡ ਦੁਬਾਰਾ ਲਿਖੋ:',
@@ -679,7 +728,7 @@ sysop}}|administrator]] ਨਾਲ਼ ਰਾਬਤਾ ਕਰ ਸਕਦੇ ਹੋ
 ਇਕ 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' => 'ਫ਼ਿਲਹਾਲ à¨\87ਸ à¨¸à¨«à¨¼à©\87 â\80\99ਤà©\87 à¨\95à©\8bà¨\88 à¨²à¨¿à¨\96ਤ à¨¨à¨¹à©\80à¨\82 à¨¹à©\88। à¨¤à©\81ਸà©\80à¨\82 à¨¦à©\82ਸਰà©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 à¨¤à©\87 [[Special:Search/{{PAGENAME}}|à¨\87ਸ à¨ªà¨¾à¨  à¨¦à©\80 à¨\96à©\8bà¨\9c]] à¨\95ਰ à¨¸à¨\95ਦà©\87 à¨¹à©\8b, à¨¸à¨¬à©°à¨§à¨¤ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¨\9aਿੱਠà©\87] à¨\96à©\8bà¨\9c à¨¸à¨\95ਦà©\87 à¨¹à©\8b, à¨\9cਾà¨\82 [{{fullurl:{{FULLPAGENAME}}|action=edit}} à¨\87ਸ à¨¸à¨«à¨¼à©\87 à¨µà¨¿à¨\9a à¨²à¨¿à¨\96] à¨¸à¨\95ਦà©\87 à¨¹à©\8b</span>।',
+'noarticletext-nopermission' => 'ਫ਼ਿਲਹਾਲ à¨\87ਸ à¨ªà©°à¨¨à©\87 â\80\99ਤà©\87 à¨\95à©\8bà¨\88 à¨²à¨¿à¨\96ਤ à¨¨à¨¹à©\80à¨\82 à¨¹à©\88। à¨¤à©\81ਸà©\80à¨\82 à¨¦à©\82ਸਰà©\87 à¨¸à¨«à¨¼à¨¿à¨\86à¨\82 â\80\99ਤà©\87 [[Special:Search/{{PAGENAME}}|à¨\87ਸ à¨¸à¨¿à¨°à¨²à©\87à¨\96 à¨¦à©\80 à¨\96à©\8bà¨\9c]] à¨\95ਰ à¨¸à¨\95ਦà©\87 à¨¹à©\8b, à¨¸à¨¬à©°à¨§à¨¤ <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} à¨\9aਿੱਠà©\87] à¨\96à©\8bà¨\9c à¨¸à¨\95ਦà©\87 à¨¹à©\8b à¨\9cਾà¨\82 [{{fullurl:{{FULLPAGENAME}}|action=edit}} à¨\87ਸ à¨ªà©°à¨¨à©\87 à¨µà¨¿à©±à¨\9a à¨²à¨¿à¨\96] à¨¸à¨\95ਦà©\87 à¨¹à©\8b।</span>',
 'userpage-userdoesnotexist' => 'ਮੈਂਬਰ ਖਾਤਾ "$1" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।
 ਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਬਣਾਉਣਾ/ਸੋਧਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਮਿਰਬਾਨੀ ਕਰਕੇ ਜਾਂਚ ਕਰ ਲਓ।',
 'userpage-userdoesnotexist-view' => 'ਮੈਂਬਰ ਖਾਤਾ "$1" ਰਜਿਸਟਰ ਨਹੀਂ ਹੈ।',
@@ -932,8 +981,6 @@ page={{FULLPAGENAMEE}}}} ਜ਼ਬਤੀ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵ
 'search-interwiki-caption' => 'ਸਾਥੀ ਪ੍ਰੋਜੈਕਟ',
 'search-interwiki-default' => '$1 ਨਤੀਜੇ:',
 'search-interwiki-more' => '(ਹੋਰ)',
-'search-mwsuggest-enabled' => 'ਸੁਝਾਆਵਾਂ ਨਾਲ',
-'search-mwsuggest-disabled' => 'ਕੋਈ ਸੁਝਾਅ ਨਹੀਂ',
 'search-relatedarticle' => 'ਸਬੰਧਿਤ',
 'mwsuggest-disable' => 'AJAX ਸਲਾਹਾਂ ਬੰਦ ਕਰੋ',
 'searcheverything-enable' => 'ਸਾਰੇ ਥਾਂ-ਨਾਂਵਾਂ ਵਿਚ ਖੋਜੋ',
@@ -961,7 +1008,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 
 # Preferences page
 'preferences' => 'ਮੇਰੀ ਪਸੰਦ',
-'mypreferences' => 'ਮà©\87ਰà©\80à¨\86à¨\82 à¨ªà¨¸à©°à¨¦à¨¾à¨\82',
+'mypreferences' => 'ਪਸੰਦਾਂ',
 'prefs-edits' => 'ਸੋਧਾਂ ਦੀ ਗਿਣਤੀ:',
 'prefsnologin' => 'ਲਾਗਇਨ ਨਹੀਂ',
 'prefsnologintext' => 'ਵਰਤੋਂਕਾਰ ਪਸੰਦਾਂ ਸੈੱਟ ਕਰਨ ਲਈ ਤੁਹਾਨੂੰ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ਲਾਗਇਨ]</span> ਕਰਨਾ ਪਵੇਗਾ।',
@@ -1070,14 +1117,16 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 
 # Groups
 'group' => 'ਗਰੁੱਪ:',
-'group-user' => 'ਵਰਤà©\8bà¨\82à¨\95ਾਰ',
+'group-user' => 'ਮà©\88à¨\82ਬਰ',
 'group-autoconfirmed' => 'ਖ਼ੁਦ-ਤਸਦੀਕਸ਼ੁਦਾ ਮੈਂਬਰ',
 'group-bot' => 'ਬੋਟ',
 'group-all' => '(ਸਭ)',
 
-'group-user-member' => '{{GENDER:$1|ਵਰਤà©\8bà¨\82à¨\95ਾਰ}}',
+'group-user-member' => '{{GENDER:$1|ਮà©\88à¨\82ਬਰ}}',
 'group-bot-member' => 'ਬੋਟ',
 
+'grouppage-user' => '{{ns:project}}:ਮੈਂਬਰ',
+
 # Rights
 'right-read' => 'ਸਫ਼ੇ ਪੜ੍ਹਨਾ',
 'right-edit' => 'ਸਫ਼ੇ ਸੋਧ',
@@ -1134,7 +1183,7 @@ $3|'''1''' ਨਤੀਜਾ|'''$3''' ਨਤੀਜੇ}} ਵਖਾਓ।",
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|ਤਬਦੀਲੀ|
 ਤਬਦੀਲੀਆਂ}}',
-'recentchanges' => 'ਤਾà¨\9c਼ਾ ਤਬਦੀਲੀਆਂ',
+'recentchanges' => 'ਹਾਲ à¨¹à©\80 â\80\99à¨\9a à¨¹à©\8bà¨\88à¨\86à¨\82 ਤਬਦੀਲੀਆਂ',
 'recentchanges-legend' => 'ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਦੇ ਇਖ਼ਤਿਆਰ',
 'recentchanges-summary' => 'ਇਸ ਵਿਕੀ ’ਤੇ ਹੋਈਆਂ ਸਭ ਤੋਂ ਨਵੀਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਸਫ਼ੇ ’ਤੇ ਵੇਖੋ।',
 'recentchanges-feed-description' => 'ਇਸ ਵਿਕੀ ’ਤੇ ਹਾਲ ਹੀ ਵਿਚ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਇਸ ਫ਼ੀਡ ’ਚ ਵੇਖੀਆਂ ਜਾ ਸਕਦੀਆਂ ਹਨ।',
@@ -1514,7 +1563,7 @@ to upload files.',
 
 # Watchlist
 'watchlist' => 'ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ',
-'mywatchlist' => 'ਮà©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f',
+'mywatchlist' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ',
 'watchlistfor2' => '$1 $2 ਲਈ',
 'nowatchlist' => 'ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚ ਕੋਈ ਚੀਜ਼ ਨਹੀਂ ਹੈ।',
 'watchlistanontext' => 'ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚਲੀਆਂ ਚੀਜ਼ਾਂ ਵੇਖਣ ਜਾਂ ਸੋਧਣ ਲਈ ਮਿਹਰਬਾਨੀ ਕਰਕੇ $1।',
@@ -1542,10 +1591,7 @@ $1|ਤਬਦੀਲੀ ਹੋਈ|'''$1''' ਤਬਦੀਲੀਆਂ ਹੋਈਆ
 'watching' => 'ਨਿਗ੍ਹਾ (ਵਾਚ) ਰੱਖੀ ਜਾ ਰਹੀ ਹੈ...',
 'unwatching' => 'ਨਿਗ੍ਹਾ ਰੱਖਣੀ (ਵਾਚ) ਬੰਦ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..',
 
-'enotif_newpagetext' => 'ਇਹ ਨਵਾਂ ਪੇਜ ਹੈ।',
 'enotif_impersonal_salutation' => '{{SITENAME}} ਯੂਜ਼ਰ',
-'changed' => 'ਬਦਲਿਆ',
-'created' => 'ਬਣਾਇਆ',
 'enotif_lastvisited' => 'ਤੁਹਾਡੀ ਆਖ਼ਰੀ ਆਮਦ ਤੋਂ ਲੈ ਕੇ ਹੋਈਆਂ ਤਬਦੀਲੀਆਂ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।',
 'enotif_lastdiff' => 'ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਵੇਖਣ ਲਈ $1 ਵੇਖੋ।',
 'enotif_anon_editor' => 'ਅਗਿਆਤ ਯੂਜ਼ਰ $1',
@@ -1656,7 +1702,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 # Contributions
 'contributions' => 'ਮੈਂਬਰ ਯੋਗਦਾਨ',
 'contributions-title' => '$1 ਦੇ ਯੋਗਦਾਨ',
-'mycontris' => 'ਮà©\87ਰਾ à¨¯à©\8bà¨\97ਦਾਨ',
+'mycontris' => 'ਯੋਗਦਾਨ',
 'contribsub2' => '$1 ($2) ਲਈ',
 'uctop' => '(ਟੀਸੀ)',
 'month' => 'ਇਸ (ਅਤੇ ਪਿਛਲੇ) ਮਹੀਨੇ ਤੋਂ :',
@@ -1692,7 +1738,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'whatlinkshere-hideredirs' => 'ਅਸਿੱਧੇ ਰਾਹ $1',
 'whatlinkshere-hidetrans' => '$1 ਇੱਥੇ ਕੀ ਕੀ ਜੁੜਦਾ ਹੈ।',
 'whatlinkshere-hidelinks' => '$1 ਲਿੰਕ',
-'whatlinkshere-hideimages' => 'ਤਸਵà©\80ਰ à¨²à¨¿à©°à¨\95 $1',
+'whatlinkshere-hideimages' => 'ਫ਼ਾà¨\88ਲ à¨\9cà©\8bà©\9c $1',
 'whatlinkshere-filters' => 'ਛਾਨਣੀਆਂ',
 
 # Block/unblock
@@ -1852,11 +1898,11 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-ca-unwatch' => 'ਇਹ ਸਫ਼ਾ ਆਪਣੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ’ਚੋਂ ਹਟਾਓ',
 'tooltip-search' => '{{SITENAME}} ’ਤੇ ਖੋਜੋ',
 'tooltip-search-go' => 'ਠੀਕ ਇਸ ਨਾਮ ਵਾਲ਼ੇ ਸਫ਼ੇ ’ਤੇ ਜਾਉ, ਜੇ ਮੌਜੂਦ ਹੈ ਤਾਂ',
-'tooltip-search-fulltext' => 'à¨\87ਸ à¨²à¨¿à¨\96ਤ à¨²à¨\88 à¨¸à¨«à¨¼ੇ ਲੱਭੋ',
-'tooltip-p-logo' => 'ਮà©\81ੱà¨\96 à¨¸à¨«à¨¼ੇ ’ਤੇ ਜਾਓ',
+'tooltip-search-fulltext' => 'à¨\87ਸ à¨²à¨¿à¨\96ਤ à¨²à¨\88 à¨ªà©°à¨¨ੇ ਲੱਭੋ',
+'tooltip-p-logo' => 'ਮà©\81ੱà¨\96 à¨ªà©°à¨¨ੇ ’ਤੇ ਜਾਓ',
 'tooltip-n-mainpage' => 'ਮੁੱਖ ਸਫ਼ੇ ’ਤੇ ਜਾਓ',
 'tooltip-n-mainpage-description' => 'ਮੁੱਖ ਸਫ਼ੇ ’ਤੇ ਜਾਓ',
-'tooltip-n-portal' => 'ਪਰà©\8bà¨\9cà©\88à¨\95à¨\9f ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭਣਾ ਹੈ',
+'tooltip-n-portal' => 'ਪਰਿਯà©\8bà¨\9cਨਾ ਬਾਰੇ, ਤੁਸੀਂ ਕੀ ਕਰ ਸਕਦੇ ਹੋ, ਕਿੱਥੇ ਕੁਝ ਲੱਭਣਾ ਹੈ',
 'tooltip-n-currentevents' => 'ਮੌਜੂਦਾ ਸਮਾਗਮ ਬਾਰੇ ਪਿਛਲੀ ਜਾਣਕਾਰੀ ਲੱਭੋ',
 'tooltip-n-recentchanges' => 'ਵਿਕੀ ’ਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ ਦੀ ਲਿਸਟ',
 'tooltip-n-randompage' => 'ਇਕ ਰਲ਼ਵਾਂ ਸਫ਼ਾ ਲੋਡ ਕਰੋ',
@@ -1867,7 +1913,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'tooltip-t-contributions' => 'ਇਸ ਮੈਂਬਰ ਦੇ ਯੋਗਦਾਨ ਦੀ ਲਿਸਟ',
 'tooltip-t-emailuser' => 'ਇਸ ਮੈਂਬਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ',
 'tooltip-t-upload' => 'ਚਿੱਤਰ ਜਾਂ ਮੀਡਿਆ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ',
-'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨\96਼ਾਸ à¨¸à¨«à¨¼ਿਆਂ ਦੀ ਲਿਸਟ',
+'tooltip-t-specialpages' => 'ਸਾਰà©\87 à¨\96ਾਸ à¨ªà©°à¨¨ਿਆਂ ਦੀ ਲਿਸਟ',
 'tooltip-t-print' => 'ਇਹ ਸਫ਼ੇ ਦਾ ਛਪਣਯੋਗ ਵਰਜਨ',
 'tooltip-t-permalink' => 'ਸਫ਼ੇ ਦੇ ਇਸ ਰੀਵਿਜ਼ਨ ਲਈ ਪੱਕਾ ਲਿੰਕ',
 'tooltip-ca-nstab-main' => 'ਸਮੱਗਰੀ ਸਫ਼ਾ ਵੇਖੋ',
@@ -2045,11 +2091,14 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'watchlisttools-edit' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵੇਖੋ ’ਤੇ ਸੋਧੋ',
 'watchlisttools-raw' => 'ਕੱਚੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਸੋਧੋ',
 
+# Core parser functions
+'duplicate-defaultsort' => 'ਪੁਰਾਣੀ ਮੂਲ ਕਰਮਾਂਕਨ ਕੁੰਜੀ $1 ਦੇ ਬਜਾਏ ਹੁਣ ਮੂਲ ਕਰਮਾਂਕਨ ਕੁੰਜੀ $2 ਹੋਵੇਗੀ।',
+
 # Special:Version
 'version' => 'ਵਰਜਨ',
 
 # Special:SpecialPages
-'specialpages' => 'à¨\96਼ਾਸ à¨¸à¨«à¨¼ੇ',
+'specialpages' => 'à¨\96ਾਸ à¨ªà©°à¨¨ੇ',
 'specialpages-group-login' => 'ਲਾਗਇਨ / ਖਾਤਾ ਬਣਾਓ',
 
 # Special:BlankPage
@@ -2073,4 +2122,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'htmlform-reset' => 'ਬਦਲਾਅ ਵਾਪਸ ਲਵੋ',
 'htmlform-selectorother-other' => 'ਹੋਰ',
 
+# Search suggestions
+'searchsuggest-search' => 'ਖੋਜ',
+
 );
index 2e95644..7e4e2a5 100644 (file)
@@ -16,97 +16,97 @@ $messages = array(
 'tog-enotifwatchlistpages' => 'Manpa-awit na e-mail ed siak no abalo may sakey ya bolong ya babantayan ko',
 
 'underline-always' => 'Naynay',
-'underline-never'  => 'Andin-balot',
+'underline-never' => 'Andin-balot',
 
 # Categories related messages
 'category_header' => 'Saray artikulo ed category ya "$1"',
 
-'about'    => 'Nipakar ed',
-'article'  => 'Bolong na laman',
-'cancel'   => 'I-tonda',
-'mypage'   => 'Say bolong ko',
-'mytalk'   => 'Say tongtongan ko',
+'about' => 'Nipakar ed',
+'article' => 'Bolong na laman',
+'cancel' => 'I-tonda',
+'mypage' => 'Say bolong ko',
+'mytalk' => 'Say tongtongan ko',
 'anontalk' => 'Tongtongan para ed sayan IP',
-'and'      => '&#32;san',
+'and' => '&#32;san',
 
 # Cologne Blue skin
-'qbpageoptions'  => 'Ayan bolong',
+'qbpageoptions' => 'Ayan bolong',
 'qbspecialpages' => 'Niduma ran Bolobolong',
 
-'returnto'          => 'Impawel ed $1.',
-'help'              => 'Tolong',
-'search'            => 'Anapen',
-'searchbutton'      => 'Anapen',
-'go'                => 'Ula',
-'searcharticle'     => 'Ula',
-'history'           => 'Awaran na sayan bolong',
-'history_short'     => 'awaran na sayan bolong',
-'printableversion'  => 'Naigalot ya bersion',
-'permalink'         => 'Masiansian gawing',
-'edit'              => 'Baloen o dagdagan',
-'delete'            => 'Buralen',
-'deletethispage'    => 'Buralen so ayan page',
-'protect'           => 'Iyagel',
-'protectthispage'   => 'Iyagel yan bolong',
-'unprotect'         => 'aga la iyagel',
+'returnto' => 'Impawel ed $1.',
+'help' => 'Tolong',
+'search' => 'Anapen',
+'searchbutton' => 'Anapen',
+'go' => 'Ula',
+'searcharticle' => 'Ula',
+'history' => 'Awaran na sayan bolong',
+'history_short' => 'awaran na sayan bolong',
+'printableversion' => 'Naigalot ya bersion',
+'permalink' => 'Masiansian gawing',
+'edit' => 'Baloen o dagdagan',
+'delete' => 'Buralen',
+'deletethispage' => 'Buralen so ayan page',
+'protect' => 'Iyagel',
+'protectthispage' => 'Iyagel yan bolong',
+'unprotect' => 'aga la iyagel',
 'unprotectthispage' => 'Aga la iyagel yan bolong',
-'newpage'           => 'Balon bolong',
-'talkpage'          => 'Pantongtongan yan bolong',
-'specialpage'       => 'Niduman Bolong',
-'articlepage'       => 'Nengnengen so content page',
-'talk'              => 'Tongtongan',
-'userpage'          => 'Basaen so bolong na manag-usar',
-'mediawikipage'     => 'Nengnengen so bolong na pakabat',
-'viewhelppage'      => 'Nengnengen so bolong na tolong',
-'categorypage'      => 'Nengnengen so bolong na saray category',
-'viewtalkpage'      => 'Nengnengen so tongtongan',
-'otherlanguages'    => 'Diad arom ran salita',
-'lastmodifiedat'    => 'Say ayan bolong: otet ya binalo nen $2, $1.',
-'protectedpage'     => 'Iyayagel yan bolong',
-'jumptosearch'      => 'anapen',
+'newpage' => 'Balon bolong',
+'talkpage' => 'Pantongtongan yan bolong',
+'specialpage' => 'Niduman Bolong',
+'articlepage' => 'Nengnengen so content page',
+'talk' => 'Tongtongan',
+'userpage' => 'Basaen so bolong na manag-usar',
+'mediawikipage' => 'Nengnengen so bolong na pakabat',
+'viewhelppage' => 'Nengnengen so bolong na tolong',
+'categorypage' => 'Nengnengen so bolong na saray category',
+'viewtalkpage' => 'Nengnengen so tongtongan',
+'otherlanguages' => 'Diad arom ran salita',
+'lastmodifiedat' => 'Say ayan bolong: otet ya binalo nen $2, $1.',
+'protectedpage' => 'Iyayagel yan bolong',
+'jumptosearch' => 'anapen',
 
 # 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'            => 'Nipakar ed {{SITENAME}}',
-'aboutpage'            => 'Project:Nipaakar',
-'currentevents'        => 'Saray nagagawa natan',
-'currentevents-url'    => 'Project:Saray nagagawa natan',
-'edithelp'             => 'Tolong nipakar ed panagbalo na artikulo',
-'helppage'             => 'Help:Saray Laman',
-'mainpage'             => 'Arapan ya Bolong',
+'aboutsite' => 'Nipakar ed {{SITENAME}}',
+'aboutpage' => 'Project:Nipaakar',
+'currentevents' => 'Saray nagagawa natan',
+'currentevents-url' => 'Project:Saray nagagawa natan',
+'edithelp' => 'Tolong nipakar ed panagbalo na artikulo',
+'helppage' => 'Help:Saray Laman',
+'mainpage' => 'Arapan ya Bolong',
 'mainpage-description' => 'Arapan ya Bolong',
-'portal'               => 'Pwerta na komyunidad',
-'portal-url'           => 'Project:Pwerta na Komyunidad',
+'portal' => 'Pwerta na komyunidad',
+'portal-url' => 'Project:Pwerta na Komyunidad',
 
 'badaccess-group0' => 'Agmo sarag ya gaween so action ya kekerewen mo.',
 
-'youhavenewmessages'      => 'Walay $1 ($2).',
-'newmessageslink'         => 'balo ran pakabat',
-'newmessagesdifflink'     => 'sampot ya binalo',
+'youhavenewmessages' => 'Walay $1 ($2).',
+'newmessageslink' => 'balo ran pakabat',
+'newmessagesdifflink' => 'sampot ya binalo',
 'youhavenewmessagesmulti' => 'Walay balo ran pakabat mo ed $1',
-'viewdeleted'             => 'Nengnengen so $1?',
+'viewdeleted' => 'Nengnengen so $1?',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-user'      => 'Bolong na manag-usar',
+'nstab-user' => 'Bolong na manag-usar',
 'nstab-mediawiki' => 'Pakabat',
 
 # General errors
 'badarticleerror' => 'Aga sarag ya gaween so ayan action ed sayan bolong.',
-'cannotdelete'    => 'Aga nabural so nibagan bolong o file. (Sarag ton abural la na arom.)',
-'badtitle'        => 'Aga sarag ya titulo',
-'viewsource'      => 'Nengnengen so pinanlapuan',
-'viewsourcetext'  => 'Sarag mon nengnengen san kopyaen so pinanlapuan na ayan bolong:',
+'cannotdelete' => 'Aga nabural so nibagan bolong o file. (Sarag ton abural la na arom.)',
+'badtitle' => 'Aga sarag ya titulo',
+'viewsource' => 'Nengnengen so pinanlapuan',
+'viewsourcetext' => 'Sarag mon nengnengen san kopyaen so pinanlapuan na ayan bolong:',
 
 # Login and logout pages
-'yourdomainname'             => 'Say domain mo',
-'login'                      => 'Onloob',
-'logout'                     => 'Paway',
-'userlogout'                 => 'Paway',
-'createaccount'              => 'Mangawa na account',
-'gotaccountlink'             => 'Onloob',
-'badretype'                  => 'Aga parehas so en-type mo ran password.',
+'yourdomainname' => 'Say domain mo',
+'login' => 'Onloob',
+'logout' => 'Paway',
+'userlogout' => 'Paway',
+'createaccount' => 'Mangawa na account',
+'gotaccountlink' => 'Onloob',
+'badretype' => 'Aga parehas so en-type mo ran password.',
 'acct_creation_throttle_hit' => 'Sorry, nangawala ka la na $1 account. Agka la makapangawa na account.',
-'accountcreated'             => 'Agawa so account',
-'accountcreatedtext'         => 'Agawa la so user account para $1.',
+'accountcreated' => 'Agawa so account',
+'accountcreatedtext' => 'Agawa la so user account para $1.',
 
 # Change password dialog
 'newpassword' => 'Balon password:',
@@ -115,23 +115,23 @@ $messages = array(
 'link_tip' => 'Gawing ed loob',
 
 # Edit pages
-'minoredit'         => 'Melag yan edit.',
-'watchthis'         => 'Bantayan yan bolong',
-'preview'           => 'Nengnengen',
-'showdiff'          => 'Ipanengneng so binalo',
-'anoneditwarning'   => "'''Pasakbay:''' Agka ni limmoob. Aka-record so IP address mo ed agawgawa ed bolong.",
-'blockedtitle'      => 'Sebel ed sayan manag-usar',
-'blockednoreason'   => 'anggapon katunungan so inter',
+'minoredit' => 'Melag yan edit.',
+'watchthis' => 'Bantayan yan bolong',
+'preview' => 'Nengnengen',
+'showdiff' => 'Ipanengneng so binalo',
+'anoneditwarning' => "'''Pasakbay:''' Agka ni limmoob. Aka-record so IP address mo ed agawgawa ed bolong.",
+'blockedtitle' => 'Sebel ed sayan manag-usar',
+'blockednoreason' => 'anggapon katunungan so inter',
 'whitelistedittext' => 'Nakaukulan mo ya $1 umpian nabalo o nadagdagan ray bolobolong.',
-'loginreqtitle'     => 'Nakaukulan kan Onloob',
-'loginreqlink'      => 'onloob',
-'loginreqpagetext'  => 'Nakaukulan kan $1 umpian nanengneng so arom ran bolobolong.',
-'accmailtitle'      => 'Say Password impawet la.',
-'accmailtext'       => 'Empawet ed $2 so password para ed $1.',
-'newarticle'        => '(Balo)',
-'editing'           => 'Babaloen so $1',
-'yourdiff'          => 'Saray niduma',
-'copyrightwarning'  => "Tandaan komon ya amin ya contribution para ed {{SITENAME}} et nonoten ya pinaolian onong ed $2 (nengnengen so $1 para ed detalye).
+'loginreqtitle' => 'Nakaukulan kan Onloob',
+'loginreqlink' => 'onloob',
+'loginreqpagetext' => 'Nakaukulan kan $1 umpian nanengneng so arom ran bolobolong.',
+'accmailtitle' => 'Say Password impawet la.',
+'accmailtext' => 'Empawet ed $2 so password para ed $1.',
+'newarticle' => '(Balo)',
+'editing' => 'Babaloen so $1',
+'yourdiff' => 'Saray niduma',
+'copyrightwarning' => "Tandaan komon ya amin ya contribution para ed {{SITENAME}} et nonoten ya pinaolian onong ed $2 (nengnengen so $1 para ed detalye).
 No ag mo labay ya say inkorit mo ed sarag ya baloen odino ibonog ed anggan siopa, ag mo ipapalima dia.<br />
 San ipropromisam met ya insulat mo yan dili o kinopyam ya manlapo ed sakey ya public domain odino parehas ya libren resource.
 '''AG MANPALIMA NA KIMEY YA WALAY COPYRIGHT TO YA ANGGAPOY ABOLOY!'''",
@@ -140,54 +140,51 @@ San ipropromisam met ya insulat mo yan dili o kinopyam ya manlapo ed sakey ya pu
 'cantcreateaccounttitle' => 'Aga makagawa na account',
 
 # History pages
-'last'      => 'sampot',
+'last' => 'sampot',
 'histfirst' => 'Sankaunaan',
-'histlast'  => 'Sankautetan',
-
-# Diffs
-'difference' => '(Say niduma diad saray revision)',
+'histlast' => 'Sankautetan',
 
 # Search results
-'searchsubtitle'        => "'''[[:$1]]''' so inanap mo.",
+'searchsubtitle' => "'''[[:$1]]''' so inanap mo.",
 'searchsubtitleinvalid' => "'''$1''' so inanap mo.",
-'searchhelp-url'        => 'Help:Saray Laman',
-'powersearch'           => 'Anapen',
+'searchhelp-url' => 'Help:Saray Laman',
+'powersearch' => 'Anapen',
 
 # Quickbar
 'qbsettings-none' => 'Anggapo',
 
 # Preferences page
-'mypreferences'     => 'Saray preference ko',
-'changepassword'    => 'Salatan so password',
-'datedefault'       => 'Anggapoy preference',
-'prefs-datetime'    => 'Bilang na agew san oras',
-'prefs-rc'          => 'Sampot ran binalo',
-'prefs-watchlist'   => 'Listaan na babantayan',
-'prefs-editing'     => 'Babaloen',
+'mypreferences' => 'Saray preference ko',
+'changepassword' => 'Salatan so password',
+'datedefault' => 'Anggapoy preference',
+'prefs-datetime' => 'Bilang na agew san oras',
+'prefs-rc' => 'Sampot ran binalo',
+'prefs-watchlist' => 'Listaan na babantayan',
+'prefs-editing' => 'Babaloen',
 'searchresultshead' => 'Anapen',
-'yourrealname'      => 'Tuwan ngaran:',
-'badsiglength'      => 'Andukey ya maong so nickname. Say dukey to dapat mas daiset en say $1 ya character.',
+'yourrealname' => 'Tuwan ngaran:',
+'badsiglength' => 'Andukey ya maong so nickname. Say dukey to dapat mas daiset en say $1 ya character.',
 
 # User rights
 'userrights-user-editname' => 'Isulat so username:',
 
 # Recent changes
 'recentchanges' => 'Sampot ran binalo',
-'hide'          => 'Yamot',
-'show'          => 'Ipanengneng',
+'hide' => 'Yamot',
+'show' => 'Ipanengneng',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Kabiangan ran binalo',
-'recentchangeslinked-feed'    => 'Kabiangan ran binalo',
+'recentchangeslinked' => 'Kabiangan ran binalo',
+'recentchangeslinked-feed' => 'Kabiangan ran binalo',
 'recentchangeslinked-toolbox' => 'Kabiangan ran binalo',
 
 # Upload
-'upload'          => 'Mangisigep na file',
-'uploadlog'       => 'Isigep so log',
-'filesource'      => 'Pinanlapuan:',
-'uploadedfiles'   => 'Insegep ran file',
-'badfilename'     => 'Binalo so ngaran na file, umpian "$1" so balon ngaran to.',
-'sourcefilename'  => 'Filename na pinanlapuan:',
+'upload' => 'Mangisigep na file',
+'uploadlog' => 'Isigep so log',
+'filesource' => 'Pinanlapuan:',
+'uploadedfiles' => 'Insegep ran file',
+'badfilename' => 'Binalo so ngaran na file, umpian "$1" so balon ngaran to.',
+'sourcefilename' => 'Filename na pinanlapuan:',
 'watchthisupload' => 'Bantayan yan bolong',
 
 # Special:ListFiles
@@ -203,127 +200,127 @@ San ipropromisam met ya insulat mo yan dili o kinopyam ya manlapo ed sakey ya pu
 'unusedtemplateswlh' => 'arom ran gawing',
 
 # Random page
-'randompage'         => 'Random ya bolong',
+'randompage' => 'Random ya bolong',
 'randompage-nopages' => 'Anggapoy bolong ya wadya ed ayan namespace.',
 
-'withoutinterwiki'         => 'Saray bolobolong ya anggapoy gawing ya language',
+'withoutinterwiki' => 'Saray bolobolong ya anggapoy gawing ya language',
 'withoutinterwiki-summary' => 'Anggapoy gawin paulad version na arum ran salita so ontombok ran bolobolong:',
 
 # Miscellaneous special pages
-'shortpages'     => 'Antikey ran bolong',
-'longpages'      => 'Andokoy ran bolong',
+'shortpages' => 'Antikey ran bolong',
+'longpages' => 'Andokoy ran bolong',
 'protectedpages' => 'Iyayagel ran bolobolong',
-'newpages'       => 'Balo ran bolong',
-'ancientpages'   => 'Sankadaanan ran bolobolong',
-'move'           => 'Iyales',
-'movethispage'   => 'Iyales yan bolong',
+'newpages' => 'Balo ran bolong',
+'ancientpages' => 'Sankadaanan ran bolobolong',
+'move' => 'Iyales',
+'movethispage' => 'Iyales yan bolong',
 
 # Book sources
-'booksources'               => 'Saray liblibron pinanlapuan',
+'booksources' => 'Saray liblibron pinanlapuan',
 'booksources-search-legend' => 'Mananap na saray libron pinanlapuan',
-'booksources-go'            => 'Ula',
+'booksources-go' => 'Ula',
 
 # Special:Log
 'all-logs-page' => 'Amin ran log',
 
 # Special:AllPages
-'allpages'          => 'Amin ya bolobolong',
-'alphaindexline'    => '$1 anggad $2',
-'nextpage'          => 'Ontombok ya page ($1)',
-'allpagesfrom'      => 'Ipanengneng ray bolobolong ya manlapod:',
-'allarticles'       => 'Amin ran bolobolong',
-'allinnamespace'    => 'Amin ya bolobolong ($1 namespace)',
+'allpages' => 'Amin ya bolobolong',
+'alphaindexline' => '$1 anggad $2',
+'nextpage' => 'Ontombok ya page ($1)',
+'allpagesfrom' => 'Ipanengneng ray bolobolong ya manlapod:',
+'allarticles' => 'Amin ran bolobolong',
+'allinnamespace' => 'Amin ya bolobolong ($1 namespace)',
 'allnotinnamespace' => 'Amin ya bolobolong (anggapo ed namespace ya $1)',
-'allpagesprev'      => 'Enbeneg',
-'allpagesnext'      => 'Ontombok',
-'allpagessubmit'    => 'Ula',
-'allpagesprefix'    => 'Ipanengneng so saray bolobolong ya walay prefix:',
+'allpagesprev' => 'Enbeneg',
+'allpagesnext' => 'Ontombok',
+'allpagessubmit' => 'Ula',
+'allpagesprefix' => 'Ipanengneng so saray bolobolong ya walay prefix:',
 
 # Special:LinkSearch
-'linksearch'     => 'Anapen ramay gawing ed web',
+'linksearch' => 'Anapen ramay gawing ed web',
 'linksearch-pat' => 'Anapen so pattern:',
-'linksearch-ok'  => 'Anapen',
+'linksearch-ok' => 'Anapen',
 
 # E-mail user
-'emailuser'     => 'E-mail so ayan user',
-'emailfrom'     => 'Manlapud',
-'emailto'       => 'Para ed',
-'emailmessage'  => 'Pakabat',
-'emailsend'     => 'Paawit',
-'emailsent'     => 'Say e-mail impawet la',
+'emailuser' => 'E-mail so ayan user',
+'emailfrom' => 'Manlapud',
+'emailto' => 'Para ed',
+'emailmessage' => 'Pakabat',
+'emailsend' => 'Paawit',
+'emailsent' => 'Say e-mail impawet la',
 'emailsenttext' => 'Impawit la so e-mail message mo.',
 
 # Watchlist
-'mywatchlist'    => 'Listaan na babantayan ko',
-'watchnologin'   => 'Agka ni akaloob',
+'mywatchlist' => 'Listaan na babantayan ko',
+'watchnologin' => 'Agka ni akaloob',
 'addedwatchtext' => "Impila so bolong ya \"[[:\$1]]\" diad [[Special:Watchlist|listaan na babantayan]] mo. Isulat diman so saray ontombok ran idagdag o panagbalo ed sayan bolong san diad bolong na tongtongan. San akasulat ran '''mapatnag''' (bolded) ed [[Special:RecentChanges|listaan na saray sampot ran binalo]] umpian mas maganom ya nanengneng.
 
 No labay mon ekalen may bolong diad listaan na babantayan, tapik mo labat so \"ekalen ed babantayan\" (unwatch) diad gilig ya bar.",
-'watch'          => 'bantayan',
-'watchthispage'  => 'Bantayan yan bolong',
+'watch' => 'bantayan',
+'watchthispage' => 'Bantayan yan bolong',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Babantayan...',
 
 'enotif_newpagetext' => 'Balo yan bolong.',
-'changed'            => 'asalatan',
-'created'            => 'agawa',
+'changed' => 'asalatan',
+'created' => 'agawa',
 
 # Delete
-'deletepage'     => 'Buralen so bolong',
-'confirm'        => 'Paletan',
-'exblank'        => 'Anggapoy laman na bolong',
+'deletepage' => 'Buralen so bolong',
+'confirm' => 'Paletan',
+'exblank' => 'Anggapoy laman na bolong',
 'actioncomplete' => 'Asumpal lan agawa',
-'deletedtext'    => 'Abural lay "$1".
+'deletedtext' => 'Abural lay "$1".
 Pinengneng so $2 para ed listaan na saray abural ran balo.',
-'deletecomment'  => 'Katonongan',
+'deletecomment' => 'Katonongan',
 
 # Protect
-'prot_1movedto2'      => 'say [[$1]] enyales paula ed [[$2]]',
-'protect-legend'      => 'Palitaen so pangiyagel',
+'prot_1movedto2' => 'say [[$1]] enyales paula ed [[$2]]',
+'protect-legend' => 'Palitaen so pangiyagel',
 'protect-level-sysop' => 'Sysops labat',
 
 # Undelete
-'undelete'               => 'Nengnengen so inekal ran bolobolong',
-'viewdeletedpage'        => 'Nengnengen so inekal ran bolong',
-'undelete-search-box'    => 'Anapen ramay binural ran bolobolong',
+'undelete' => 'Nengnengen so inekal ran bolobolong',
+'viewdeletedpage' => 'Nengnengen so inekal ran bolong',
+'undelete-search-box' => 'Anapen ramay binural ran bolobolong',
 'undelete-search-prefix' => 'Ipanengneng ray bolobolong ya mangagapo ed:',
 'undelete-search-submit' => 'Anapen',
 
 # Contributions
 'contributions' => 'Saray contribution na user',
-'mycontris'     => 'Saray entolong ko',
-'year'          => 'Taon:',
+'mycontris' => 'Saray entolong ko',
+'year' => 'Taon:',
 
 'sp-contributions-newbies-sub' => 'Para balo ran account',
-'sp-contributions-submit'      => 'Anapen',
+'sp-contributions-submit' => 'Anapen',
 
 # What links here
-'whatlinkshere'       => 'Antoray akaturo dia',
+'whatlinkshere' => 'Antoray akaturo dia',
 'whatlinkshere-title' => 'Saray bolong ya aka-gawing ed $1',
-'whatlinkshere-page'  => 'Bolong:',
+'whatlinkshere-page' => 'Bolong:',
 
 # Block/unblock
-'blockip'            => 'Isara ed para ayan manag-usar',
-'ipbreason'          => 'Katonongan',
+'blockip' => 'Isara ed para ayan manag-usar',
+'ipbreason' => 'Katonongan',
 'ipbreasonotherlist' => 'Arom ya katonongan',
-'ipbsubmit'          => 'Isebel ed sayan manag-usar',
-'badipaddress'       => 'Aga nayarin IP address',
-'ipusubmit'          => 'Aga la isebel so ayan address',
-'ipblocklist'        => 'Listaan na saray sebel ran IP address san username',
+'ipbsubmit' => 'Isebel ed sayan manag-usar',
+'badipaddress' => 'Aga nayarin IP address',
+'ipusubmit' => 'Aga la isebel so ayan address',
+'ipblocklist' => 'Listaan na saray sebel ran IP address san username',
 'ipblocklist-submit' => 'Anapen',
-'expiringblock'      => 'nabalang no $1 $2',
-'blocklink'          => 'isara',
-'contribslink'       => 'saray entolong to',
+'expiringblock' => 'nabalang no $1 $2',
+'blocklink' => 'isara',
+'contribslink' => 'saray entolong to',
 
 # Move page
-'move-page-legend'        => 'Iyales so bolong',
-'movearticle'             => 'Iyales so bolong',
-'movepagebtn'             => 'Iyales so bolong',
-'pagemovedsub'            => 'Asumpal lan inyales',
-'articleexists'           => 'Wala lay bolong to may ngaran ya atan, odino aga valid so pinilim ya ngaran. Pili ka pa na arom ya ngaran.',
-'movereason'              => 'Katonongan',
-'delete_and_move'         => 'Buralen san iyales',
+'move-page-legend' => 'Iyales so bolong',
+'movearticle' => 'Iyales so bolong',
+'movepagebtn' => 'Iyales so bolong',
+'pagemovedsub' => 'Asumpal lan inyales',
+'articleexists' => 'Wala lay bolong to may ngaran ya atan, odino aga valid so pinilim ya ngaran. Pili ka pa na arom ya ngaran.',
+'movereason' => 'Katonongan',
+'delete_and_move' => 'Buralen san iyales',
 'delete_and_move_confirm' => 'On, buralen yan page',
 
 # Export
@@ -331,7 +328,7 @@ Pinengneng so $2 para ed listaan na saray abural ran balo.',
 'export-addcat' => 'Iyarom',
 
 # Namespace 8 related
-'allmessages'     => 'Saray pakabat na oksoy',
+'allmessages' => 'Saray pakabat na oksoy',
 'allmessagesname' => 'Ngaran',
 'allmessagestext' => 'Aya so listaan na amin ya pakabat na oksoy ya naanap ed MediaWiki namespace.',
 
@@ -342,14 +339,14 @@ Pinengneng so $2 para ed listaan na saray abural ran balo.',
 'importnotext' => 'Andilugan odino anggapoy laman ton text',
 
 # Tooltip help for the actions
-'tooltip-pt-logout'          => 'Paway',
-'tooltip-ca-viewsource'      => 'Iya-yagel yan bolong. Sarag mon nengnengen so pinanlapuan to.',
-'tooltip-ca-protect'         => 'Iyagel yan bolong',
-'tooltip-ca-move'            => 'Iyales so ayan bolong',
-'tooltip-search'             => 'Anapen {{SITENAME}}',
-'tooltip-p-logo'             => 'Arapan ya Bolong',
-'tooltip-t-specialpages'     => 'Listaan na amin ran niduman bolobolong',
-'tooltip-ca-nstab-user'      => 'Nengnengen so bolong na manag-usar',
+'tooltip-pt-logout' => 'Paway',
+'tooltip-ca-viewsource' => 'Iya-yagel yan bolong. Sarag mon nengnengen so pinanlapuan to.',
+'tooltip-ca-protect' => 'Iyagel yan bolong',
+'tooltip-ca-move' => 'Iyales so ayan bolong',
+'tooltip-search' => 'Anapen {{SITENAME}}',
+'tooltip-p-logo' => 'Arapan ya Bolong',
+'tooltip-t-specialpages' => 'Listaan na amin ran niduman bolobolong',
+'tooltip-ca-nstab-user' => 'Nengnengen so bolong na manag-usar',
 'tooltip-ca-nstab-mediawiki' => 'Nengnengen so pakabat na oksoy',
 
 # Attribution
@@ -364,14 +361,14 @@ Pinengneng so $2 para ed listaan na saray abural ran balo.',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'amin',
 'namespacesall' => 'amin',
-'monthsall'     => 'amin',
+'monthsall' => 'amin',
 
 # E-mail address confirmation
-'confirmemail'           => 'Kumpirmaen so E-mail address',
-'confirmemail_sent'      => 'Empawet so confirmation e-mail.',
+'confirmemail' => 'Kumpirmaen so E-mail address',
+'confirmemail_sent' => 'Empawet so confirmation e-mail.',
 'confirmemail_needlogin' => 'Nakaukulan mo ya $1 umpian nakompirma so email address mo.',
-'confirmemail_success'   => 'Akompirma so e-mail address mo. Sarag mo lay man-log-in san panliketan so wiki.',
-'confirmemail_loggedin'  => 'Akompira la so e-mail address mo.',
+'confirmemail_success' => 'Akompirma so e-mail address mo. Sarag mo lay man-log-in san panliketan so wiki.',
+'confirmemail_loggedin' => 'Akompira la so e-mail address mo.',
 
 # Delete conflict
 'deletedwhileediting' => 'Pasakbay: Abural yan bolong nen ginapuan mon baloen!',
@@ -381,24 +378,24 @@ Pinengneng so $2 para ed listaan na saray abural ran balo.',
 
 # Multipage image navigation
 'imgmultipagenext' => 'ontombok ya bolong →',
-'imgmultigo'       => 'Ula!',
+'imgmultigo' => 'Ula!',
 
 # Table pager
-'table_pager_next'         => 'Ontombok ya bolong',
-'table_pager_prev'         => 'Embeneg ya bolong',
-'table_pager_first'        => 'Unaan ya bolong',
-'table_pager_last'         => 'Otet ya bolong',
+'table_pager_next' => 'Ontombok ya bolong',
+'table_pager_prev' => 'Embeneg ya bolong',
+'table_pager_first' => 'Unaan ya bolong',
+'table_pager_last' => 'Otet ya bolong',
 'table_pager_limit_submit' => 'Ula',
 
 # Auto-summaries
-'autosumm-blank'   => 'Ekalen so amin ya laman na bolong',
+'autosumm-blank' => 'Ekalen so amin ya laman na bolong',
 'autosumm-replace' => "Salatan yan bolong na '$1'",
 'autoredircomment' => 'Ituturo paulad [[$1]]',
-'autosumm-new'     => 'Balon bolong: $1',
+'autosumm-new' => 'Balon bolong: $1',
 
 # Live preview
 'livepreview-loading' => 'Ilulugan…',
-'livepreview-ready'   => 'Ilulugan… Akaparaan!',
+'livepreview-ready' => 'Ilulugan… Akaparaan!',
 
 # Special:SpecialPages
 'specialpages' => 'Niduma ran bolobolong',
index 3d3d16b..8ed1153 100644 (file)
@@ -21,7 +21,7 @@ $messages = array(
 'tog-hidepatrolled' => "Isalikut la reng edit a babanten (''controlled edits'') kareng bayung mengayalili",
 'tog-newpageshidepatrolled' => "Isalikut la reng bulung a babanten (''patrolled pages'') king listaan king bayung bulung (''new page list'')",
 'tog-extendwatchlist' => 'Dagdagan la reng babanten ba lang palto deng anggang mialilan, aliwa mu deng pekabayu.',
-'tog-usenewrc' => 'Mesanting la reng bayung mengayalili (JavaScript)',
+'tog-usenewrc' => '↓mesanting la reng bayung mengayalili (JavaScript)',
 'tog-numberheadings' => 'Tambing lang dinan nomiru deng pamagat',
 'tog-showtoolbar' => 'Ipakit ya panaliling toolbar (JavaScript)',
 'tog-editondblclick' => 'Alilan la reng bulung kapamilatan ning makataduang pamagpindut (JavaScript)',
@@ -29,7 +29,7 @@ $messages = array(
 Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'tog-editsectiononrightclick' => "Paganan ya ing pamag-edit seksiyon (section editing) kapamilata'ning pamag right click kareng pamagat da reng seksiyon (JavaScript)",
 'tog-showtoc' => 'Pakit ya ing kalamnan [table of contents] (kareng bulung a maki 3 o mas dakal a pamagat)',
-'tog-rememberpassword' => 'Tandanan ya ing kanakung login keng computer a ini (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'tog-rememberpassword' => 'Tandanan ya ing kanakung login keng computer a ini (for a maximum of $1 {{PLURAL:$1|day|days}})',
 'tog-watchcreations' => 'Idagdag la deng bulung a lelengan ku kareng babanten',
 'tog-watchdefault' => 'Idagdag la reng bulung a inalilan ku kareng babanten',
 'tog-watchmoves' => 'Idagdag la reng bulung a inalis ku kareng babanten',
@@ -50,7 +50,7 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'tog-showjumplinks' => 'Salangian la reng suglung a pampabilis (accessibility links) a "luksu king" (jump to)',
 'tog-uselivepreview' => 'Gumamit kang live preview (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Pabaluan mu ku ustung magpalub a blankung edit',
-'tog-watchlisthideown' => 'Isaliut mo reng alili kareng babante',
+'tog-watchlisthideown' => 'Isalikut mo reng alili kareng babanten',
 'tog-watchlisthidebots' => 'Isalikut la reng edit kareng babanten',
 'tog-watchlisthideminor' => 'Isalikut la reng mangalating edits kareng babanten',
 'tog-watchlisthideliu' => "Isalikut la reng elilan da reng talagamit a maka-log in (''edits by logged in users'') king listaan da reng babanten (''watchlist'')",
@@ -147,7 +147,6 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'qbbrowse' => 'Bation (browse)',
 'qbedit' => 'Mag-edit',
 'qbpageoptions' => 'Ining bulung',
-'qbpageinfo' => 'Kontekstu/kabilian',
 'qbmyoptions' => 'Deng kakung bulung',
 'qbspecialpages' => 'Bulung a makabukud',
 'faq' => 'Maralas a Kukutang (MAK)',
@@ -165,6 +164,7 @@ Pabusten ing pamanaliling dake kapamilatan [alilan] ning suglung',
 'vector-view-history' => 'Lawen ya ing amlat',
 'vector-view-view' => 'Basan',
 'vector-view-viewsource' => 'Lawen ya ing pikuanan',
+'actions' => '↓Ding kilus',
 'namespaces' => 'Karinanlagiu',
 'variants' => 'Aliwapa',
 
@@ -368,9 +368,6 @@ Iti ing binie nang sangkan: ''$2''.",
 
 Malyari mung isundu ing pamangamit mu king {{SITENAME}} a e ka papakilala, o malyari kang mag login pasibayu anting pareu o aliwang talagamit.
 Apansingan mung mapalyaring makalto la pa murin deng aliwang bulung a bala mu maka login ka pa murin, anggang e me lilinisan (clear) ing kekang browser cache.",
-'welcomecreation' => '== Malaus ka, $1! ==
-
-Melalang ne ing kekang account. E mo kakalingwan alilan deng kekang piniling {{SITENAME}}',
 'yourname' => 'Lagyung talagamit (Username):',
 'yourpassword' => 'Kekang password:',
 'yourpasswordagain' => 'Pakisulat meng pasibayu ing password:',
@@ -482,9 +479,9 @@ Bang mayari ing kekang pamag-login, kailangan mung mangibiling bayung password k
 'subject' => 'Paksa/pamagat (headline):',
 'minoredit' => 'Malati yang edit ini',
 'watchthis' => 'Banten ya ing bulung a ini',
-'savearticle' => 'I-save ya ing bulung',
-'preview' => 'I-preview',
-'showpreview' => 'Pakit ya ing preview',
+'savearticle' => 'Isikap ya ing bulung',
+'preview' => '↓Ipasinag',
+'showpreview' => 'Pakit ya ing pasinag',
 'showlivepreview' => 'Kasalungsungan (live) a preview',
 'showdiff' => 'Pakit la reng miyalilan',
 'anoneditwarning' => "'''Kapiadian:''' Eka maka-login.  Mitala ya ing kekang IP address king amlat pamanalili (edit history) ning bulung a ini.",
@@ -551,8 +548,8 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} i-edit ing bulung a ini]</span>.',
 Tandanan mung deng pasadiang bulung (custom pages) a .css ampong .js, gagamit lang bansag a mababang letra (lowercase), alm. (alimbawa), {{ns:user}}:Foo/vector.css, at e {{ns:user}}:Foo/Vector.css.",
 'updated' => '(Mibayu)',
 'note' => "'''Kapabaluan:'''",
-'previewnote' => "'''Preview ya mu ini;
-e la pa me-save detang miyalilan!'''",
+'previewnote' => "'''Tandanan mu pasinag ya mu ini.
+Deng elilan mu ela pa misikap!'''",
 'previewconflict' => 'Ing ayus ning makasulat king dake nang babo ning lugal a pipag-edit-an (upper text editing area) ing magi nang itsura ning kekang gagawan nung i-save me iti.',
 'session_fail_preview' => "'''Pasensia na ka! E mi ya apalub ing kekang in-edit uling mewala ing session data.
 Pakisubukan mung pasibayu. Nung ala pa muring miliari, subukan mung mag-logout at mag-login pasibayu.'''",
@@ -622,6 +619,7 @@ Ibie la para king kekang beluan deng kasulatan ning pamagbura ampong pamanalis (
 
 Kailangan, mas ditak la king $2 deti; $1 na la reng atyu ngeni.',
 'expensive-parserfunction-category' => 'Deng bulung a masiadung dakal ing karelang mangamal a parser function call',
+'post-expand-template-inclusion-category' => '↓Bulung nung nu ing ulma kayabe ya ing sukad sinobra ya',
 
 # "Undo" feature
 'undo-success' => 'E maliaring iurung ing pamag-edit a ini. Pakilawe mo reng pikumparang bersion king lalam ba mung akit nung ini pin ing buri mung gawan, at kaibat, i-save mo retang miyalilan bang mayari ing pamanurung king edit.',
@@ -699,7 +697,9 @@ Abusni da pa murin deng aliwang talapanibala (admin) king {{SITENAME}} itang lam
 'revdelete-submit' => 'Ipairal ya kareng mepiling pamanalili (selected revision)',
 'revdelete-success' => "'''Mituldu na ing pamagbayu ning sala/kalinawan.'''",
 'logdelete-success' => "'''Mituldu na ing sala/lino (visibility) ning tala (log).'''",
-'revdel-restore' => 'Alilan ya ing mayaykit',
+'revdel-restore' => 'Alilan ya ing mayayakit',
+'revdel-restore-deleted' => '↓meburang meyalili',
+'revdel-restore-visible' => '↓mayayakit a meyalili',
 'pagehist' => 'Amlat ning bulung',
 'deletedhist' => 'Meburang amlat',
 'revdelete-edit-reasonlist' => 'I-edit la reng sangkan king pamamura',
@@ -739,7 +739,7 @@ Gamitan me ing radio button column bang bukud mung detang miyalilan aniang o bay
 'mergelogpagetext' => 'Makabili la king lalam deng pekabayung pamisanib da reng amlat bulung (page history).',
 
 # Diffs
-'history-title' => 'Amlat ning pamagbayu king "$1"',
+'history-title' => 'Amlat ning pamagbayu king "$1"',
 'lineno' => 'Gulis $1:',
 'compareselectedversions' => 'Pikumpara/piyanti la reng mepiling bersion',
 'editundo' => 'iurung',
@@ -758,9 +758,17 @@ Gamitan me ing radio button column bang bukud mung detang miyalilan aniang o bay
 'notextmatches' => 'Alang tinud/pareu kareng bansag bulung (no page title matches)',
 'prevn' => 'minunang {{PLURAL:$1|$1}}',
 'nextn' => 'tutuking {{PLURAL:$1|$1}}',
+'prevn-title' => '↓Dati $1 {{PLURAL:$1|result|results}}',
+'nextn-title' => '↓
+Tutuking $1 {{PLURAL:$1|result|results}}',
+'shown-title' => '↓Ipakit $1 {{PLURAL:$1|bunga|ding bunga}}balang bulung',
 'viewprevnext' => 'Lon ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-exists' => "'''Atin bulung a mikilagiung \"[[:\$1]]\" keng wiking ini.'''",
+'searchmenu-new' => "↓'''Maglalang kang bulung \"[[:\$1]] keng wiking ini!'''",
 'searchhelp-url' => 'Help:Kalamnan',
+'searchprofile-articles' => '↓Kalamnan bulung',
+'searchprofile-project' => '↓Saup ampong bulung proyectu',
+'searchprofile-images' => '↓Dakalmedia',
 'searchprofile-everything' => 'Eganagana',
 'searchprofile-articles-tooltip' => 'Paintunan king$1',
 'searchprofile-images-tooltip' => 'Manintun makasimpan',
@@ -773,8 +781,6 @@ Gamitan me ing radio button column bang bukud mung detang miyalilan aniang o bay
 'search-interwiki-caption' => 'Kapatad a proyektu',
 'search-interwiki-default' => '$1 linual/resulta:',
 'search-interwiki-more' => '(dakal pa)',
-'search-mwsuggest-enabled' => 'maki munikala',
-'search-mwsuggest-disabled' => 'alang munikala',
 'search-relatedarticle' => 'Kamaganak',
 'mwsuggest-disable' => 'Patdan la reng munikalang AJAX',
 'searchrelated' => 'kaugne',
@@ -801,7 +807,7 @@ Pakitandanan mung maliaring e no makapanaun deng karelang index king kalamnan ni
 
 # Preferences page
 'preferences' => 'Pinili',
-'mypreferences' => 'Deng pinili ku',
+'mypreferences' => 'Deng pinili ku',
 'prefs-edits' => 'Bilang da reng edit:',
 'prefsnologin' => 'ekamaka log',
 'prefsnologintext' => 'Kailangan kang [[Special:UserLogin|maka-login]] ba mong apagana deng pinili ning talagamit (user preferences).',
@@ -990,7 +996,7 @@ Nung ibie me, magamit ya bang kilalanan ing kekang ambag.',
 'recentchangeslinked-toolbox' => 'Miyalilan a makaugne',
 'recentchangeslinked-title' => 'Deng miyalilan a maki kaugnayan king "$1"',
 'recentchangeslinked-noresult' => 'Alang miyalilan kareng bulung a pakasuglung ketang mebanggit a panaun.',
-'recentchangeslinked-summary' => "Makalista la king bulung a iti deng tauling mengayalilan kareng
+'recentchangeslinked-summary' => "↓Makalista la king bulung a iti deng tauling mengayalilan kareng 
 bulung a makasuglung ketang partikular a bulung. '''Makapal la pangasulat''' deng bulung
 king kekang watchlist (tala da reng babanten).",
 'recentchangeslinked-page' => 'Lagyu ning bulung:',
@@ -1093,7 +1099,7 @@ Pakilawe mu nung makasalangi ya iti, manaya ka saguli, at subukan mung pasibayu.
 Mapaliaring mas masanting yang subukan nung mas ditak la reng gagamit.',
 
 'license' => 'Pamamie lisensia:',
-'license-header' => 'Pamamie lisensia:',
+'license-header' => 'Pamamie lisensia',
 'nolicense' => 'Alang mepili',
 'license-nopreview' => '(Alang preview maliaring lon)',
 'upload_source_url' => ' (metung a URL a matatanggap at aluban ding malda)',
@@ -1126,7 +1132,7 @@ Miyalilan ing pamanayus nung i-click ya ing pamagat ning kolum (column header).'
 'filehist-dimensions' => 'Sukad',
 'filehist-filesize' => 'Dagul ning simpan (file size)',
 'filehist-comment' => 'Komentu/Puna',
-'imagelinks' => "Suglung kareng simpan (''file links'')",
+'imagelinks' => "Suglung kareng simpan (''file links'')",
 'linkstoimage' => "Ing tutuking {{PLURAL:$1|page links|$1 pages link}} kaniting simpan (''file''):",
 'nolinkstoimage' => 'Alang bulung a pakasuglung king simpan (file) a ini.',
 'sharedupload' => "Ibat ya king $1 ining simpan (''file'') at maliari yang gamitan kareng aliwang proyectu.",
@@ -1385,11 +1391,7 @@ click me ing \"Tuknangan ing pamagbante\" (Unwatch) king gilid na ning bulung.",
 'unwatching' => 'E ne babanten...',
 
 'enotif_reset' => 'Dinan lang tanda deng eganaganang bulung a pintalan mu',
-'enotif_newpagetext' => 'Bayu yang bulung ini.',
 'enotif_impersonal_salutation' => 'talagamit king {{SITENAME}}',
-'changed' => 'miyalilan',
-'created' => 'melalang',
-'enotif_subject' => 'Ining bulung ning {{SITENAME}} a $PAGETITLE me$CHANGEDORCREATED ya kapamilatan nang $PAGEEDITOR',
 'enotif_lastvisited' => 'Lon me ing $1 para kareng eganaganang miyalilan
 manibat anyang tawli kang linabas.',
 'enotif_lastdiff' => 'Lon me ing $1 ba meng akit ining miyalilan.',
@@ -1541,6 +1543,7 @@ Mapaliaring putut ya ing kekang suglung, o misubli (restored) ya o milako king s
 'undelete-nodiff' => 'Alang meyakit kareng dating meyalili',
 'undeletebtn' => 'Ibálik yang pasibayu',
 'undeletelink' => 'lon/ibalik',
+'undeleteviewlink' => '↓lawen',
 'undeletereset' => 'Isubli king sadia (reset)',
 'undeletecomment' => 'Komentu:',
 'undeletedrevisions' => '{{PLURAL:$1|1 pamagbayung|$1 pamagbayung}} misubli',
@@ -1652,7 +1655,7 @@ mu nung sanu retang bulung a sinira da).',
 'ipusubmit' => 'Ilako ya pangasabat ing address a ini',
 'unblocked' => 'Mesabat ya i [[User:$1|$1]]',
 'unblocked-id' => 'Milako ing Sabat (Block) $1',
-'ipblocklist' => "Deng IP address ampong lagiungtalagamit (''username'') a makasabat",
+'ipblocklist' => 'Deng IP address ampong lagiungtalagamit a makasabat',
 'ipblocklist-legend' => 'Maintun talagamit a makasabat',
 'ipblocklist-submit' => 'Manintun',
 'infiniteblock' => 'alang kapupusan',
@@ -1850,7 +1853,7 @@ Maka-login la reng eganaganang pamaglub a transwiki (transwiki import actions) k
 'tooltip-pt-anonlogin' => 'Pakisabi ming mag-login ka, oneng e sapilitan iti.',
 'tooltip-pt-logout' => 'Mag log out',
 'tooltip-ca-talk' => 'Pamisabi-sabi tungkul king bulung kalamnan (content page)',
-'tooltip-ca-edit' => 'Malyari meng i-edit ing bulung a ini. Pakigamit me pamu ing "preview button" bayu ka mag-save.',
+'tooltip-ca-edit' => 'Malyari meng samasan ing bulung a ini. Pakigamit me pamu ing "pasinag a pipindutan" bayu me isikap.',
 'tooltip-ca-addsection' => "Mangibili kang bayung dake o ''section''.",
 'tooltip-ca-viewsource' => 'Protektadu/makakambil ya ing bulung a ini. Malyari meng lon ing kayang pikuanan (source).',
 'tooltip-ca-history' => 'Deng milabas a bersion ning bulung a ini.',
@@ -1892,16 +1895,17 @@ Maka-login la reng eganaganang pamaglub a transwiki (transwiki import actions) k
 'tooltip-ca-nstab-help' => 'Lon ya ing bulung saup (help page)',
 'tooltip-ca-nstab-category' => 'Lon ya ing bulung pang-kategoriya (category page)',
 'tooltip-minoredit' => 'Markan ya ini antimong malating pamag-edit',
-'tooltip-save' => 'I-save mo reng binayu mu',
-'tooltip-preview' => 'Lon (i-preview) mo pamu detang elilan mu; pakigamit me ini bayu ka mag-save!',
+'tooltip-save' => 'Isikap mo reng binayu mu',
+'tooltip-preview' => 'Lawen mo reng elilan mu keng pasinag. bayu me isikap!',
 'tooltip-diff' => 'Ipakit nung sanu ing inalilan mu ketang makasulat.',
 'tooltip-compareselectedversions' => 'Pakit la reng pamiyaliwa da reng aduang mepiling bersion ning bulung a ini.',
 'tooltip-watch' => 'Idagdag ya ing bulung a ini kareng kekang babanten',
 'tooltip-recreate' => 'Isubli ya ing bulung angiang mebura ne',
 'tooltip-upload' => 'Umpisan ya ing pamaglulan',
-'tooltip-rollback' => "Susubli no ning \"rollback\" deng miyalilan o edit kaniting bulung ning tauling talayambag king metung a ''click''",
-'tooltip-undo' => "Ing \"undo\" susubli ne ing edit at bubusni ne ing edit form king preview mode.
+'tooltip-rollback' => "Susubli no ning \"rollback\" deng miyalilan o edit kaniting bulung ning tauling talayambag king metung a ''pindut (click)''",
+'tooltip-undo' => "Ing \"balikgawan (undo)\" susubli ne ing edit at bubusni ne ing edit form king pasinag mode.
 Paintulutan na ing pamandagdag king sangkan king sampulung (''summary'').",
+'tooltip-summary' => '↓Palub kang makuyad a kabilugan',
 
 # Stylesheets
 'common.css' => '/** CSS mikabit keni maging mabisa ya karing eganaganang pabalat */',
index bcc2e57..45b2e9d 100644 (file)
 
 $messages = array(
 'underline-always' => 'Semper',
-'underline-never'  => 'Niunka',
+'underline-never' => 'Niunka',
 
 # Dates
-'sunday'    => 'djadomingu',
-'monday'    => 'djaluna',
-'tuesday'   => 'djamars',
+'sunday' => 'djadomingu',
+'monday' => 'djaluna',
+'tuesday' => 'djamars',
 'wednesday' => 'djarason',
-'thursday'  => 'djaweps',
-'friday'    => 'djabièrne',
-'saturday'  => 'djasabra',
-'january'   => 'yanüari',
-'february'  => 'febrüari',
-'march'     => 'mart',
-'april'     => 'aprel',
-'may_long'  => 'mei',
-'june'      => 'yüni',
-'july'      => 'yüli',
-'august'    => 'ougùstùs',
+'thursday' => 'djaweps',
+'friday' => 'djabièrne',
+'saturday' => 'djasabra',
+'january' => 'yanüari',
+'february' => 'febrüari',
+'march' => 'mart',
+'april' => 'aprel',
+'may_long' => 'mei',
+'june' => 'yüni',
+'july' => 'yüli',
+'august' => 'ougùstùs',
 'september' => 'sèptèmber',
-'october'   => 'òktober',
-'november'  => 'novèmber',
-'december'  => 'desèmber',
-'jan'       => 'yan',
-'feb'       => 'feb',
-'mar'       => 'mrt',
-'apr'       => 'apr',
-'may'       => 'mei',
-'jun'       => 'yün',
-'jul'       => 'yül',
-'aug'       => 'oug',
-'sep'       => 'sep',
-'oct'       => 'okt',
-'nov'       => 'nov',
-'dec'       => 'des',
+'october' => 'òktober',
+'november' => 'novèmber',
+'december' => 'desèmber',
+'jan' => 'yan',
+'feb' => 'feb',
+'mar' => 'mrt',
+'apr' => 'apr',
+'may' => 'mei',
+'jun' => 'yün',
+'jul' => 'yül',
+'aug' => 'oug',
+'sep' => 'sep',
+'oct' => 'okt',
+'nov' => 'nov',
+'dec' => 'des',
 
 # Categories related messages
 'category_header' => 'Artíkulonan den kategoria "$1"',
-'subcategories'   => 'Supkategorianan',
+'subcategories' => 'Supkategorianan',
 
-'about'         => 'Info',
-'article'       => 'Artíkulo',
-'cancel'        => 'Kanselá',
+'about' => 'Info',
+'article' => 'Artíkulo',
+'cancel' => 'Kanselá',
 'moredotdotdot' => 'Mas...',
-'mypage'        => 'Mi página',
-'mytalk'        => 'Mi diskushon',
-'anontalk'      => 'Diskushon pa e IP aki',
-'navigation'    => 'Nabegashon',
-'and'           => '&#32;i',
+'mypage' => 'Mi página',
+'mytalk' => 'Mi diskushon',
+'anontalk' => 'Diskushon pa e IP aki',
+'navigation' => 'Nabegashon',
+'and' => '&#32;i',
 
 # Cologne Blue skin
-'faq'     => 'Preguntanan mas Puntrá',
+'faq' => 'Preguntanan mas Puntrá',
 'faqpage' => 'Project:Preguntanan mas Puntrá',
 
-'errorpagetitle'    => 'Eror',
-'returnto'          => 'Bai bèk $1.',
-'tagline'           => 'Di {{SITENAME}}',
-'help'              => 'Ayudo',
-'search'            => 'Buska',
-'history'           => 'Historia di página',
-'history_short'     => 'Historia',
-'edit'              => 'Editá',
-'editthispage'      => 'Editá e página aki',
-'delete'            => 'Kita',
-'protect'           => 'Protehá',
-'unprotect'         => 'stop di protehá',
+'errorpagetitle' => 'Eror',
+'returnto' => 'Bai bèk $1.',
+'tagline' => 'Di {{SITENAME}}',
+'help' => 'Ayudo',
+'search' => 'Buska',
+'history' => 'Historia di página',
+'history_short' => 'Historia',
+'edit' => 'Editá',
+'editthispage' => 'Editá e página aki',
+'delete' => 'Kita',
+'protect' => 'Protehá',
+'unprotect' => 'stop di protehá',
 'unprotectthispage' => 'Stop di protehá e página aki',
-'talkpagelinktext'  => 'Papia',
-'specialpage'       => 'Página Spesial',
-'personaltools'     => 'Hèrmèntnan Personal',
-'postcomment'       => 'Sekshon Nobo',
-'articlepage'       => 'Wak página di kontenido',
-'talk'              => 'Diskushon',
-'views'             => 'Kantidat di biaha mirá',
-'toolbox'           => 'Kaha di Hèrmènt',
-'userpage'          => 'Wak página di uzadó',
-'projectpage'       => 'Wak página di e proyekto',
-'imagepage'         => 'Mira página di e dokumento',
-'mediawikipage'     => 'Mira paginanan di mensahe',
-'templatepage'      => 'Mira malchi di e página',
-'viewhelppage'      => 'Mira página di yudansa',
-'categorypage'      => 'Mira e página di kategoria',
-'viewtalkpage'      => 'Wak diskushon',
-'otherlanguages'    => 'Na otro idioma',
-'redirectedfrom'    => '(Bo a yega akinan pa via di e página $1)',
-'redirectpagesub'   => 'Página ku ta sirbi komo portal',
-'lastmodifiedat'    => 'E páginá aki a wòrdu kambiá ultimo biaha riba $1, ora $2.',
-'viewcount'         => 'E paginá aki a wòrdu mirá {{PLURAL:$1|biaha|$1 biaha}}.',
-'protectedpage'     => 'Página Protehá',
-'jumpto'            => 'Bai na:',
-'jumptonavigation'  => 'Nabegashon',
-'jumptosearch'      => 'Buska',
+'talkpagelinktext' => 'Papia',
+'specialpage' => 'Página Spesial',
+'personaltools' => 'Hèrmèntnan Personal',
+'postcomment' => 'Sekshon Nobo',
+'articlepage' => 'Wak página di kontenido',
+'talk' => 'Diskushon',
+'views' => 'Kantidat di biaha mirá',
+'toolbox' => 'Kaha di Hèrmènt',
+'userpage' => 'Wak página di uzadó',
+'projectpage' => 'Wak página di e proyekto',
+'imagepage' => 'Mira página di e dokumento',
+'mediawikipage' => 'Mira paginanan di mensahe',
+'templatepage' => 'Mira malchi di e página',
+'viewhelppage' => 'Mira página di yudansa',
+'categorypage' => 'Mira e página di kategoria',
+'viewtalkpage' => 'Wak diskushon',
+'otherlanguages' => 'Na otro idioma',
+'redirectedfrom' => '(Bo a yega akinan pa via di e página $1)',
+'redirectpagesub' => 'Página ku ta sirbi komo portal',
+'lastmodifiedat' => 'E páginá aki a wòrdu kambiá ultimo biaha riba $1, ora $2.',
+'viewcount' => 'E paginá aki a wòrdu mirá {{PLURAL:$1|biaha|$1 biaha}}.',
+'protectedpage' => 'Página Protehá',
+'jumpto' => 'Bai na:',
+'jumptonavigation' => 'Nabegashon',
+'jumptosearch' => 'Buska',
 
 # 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'            => 'Tokante {{SITENAME}}',
-'aboutpage'            => 'Project:Info',
-'copyright'            => 'E kontenido ta disponibel bou di $1.',
-'copyrightpage'        => '{{ns:project}}:Derechinan di outor',
-'currentevents'        => 'Eventonan aktual',
-'currentevents-url'    => 'Project:Eventonan aktual',
-'disclaimers'          => 'Deklarashon di Liberashon for di Responsabilidatnan',
-'disclaimerpage'       => 'Project:Deklarashon di Liberashon for di Responsabilidat General',
-'edithelp'             => 'Ayudo ku editamentu',
-'edithelppage'         => 'Help:Kon pa editá artíkulo',
-'helppage'             => 'Help:Kontenido',
-'mainpage'             => 'Página Prinsipal',
+'aboutsite' => 'Tokante {{SITENAME}}',
+'aboutpage' => 'Project:Info',
+'copyright' => 'E kontenido ta disponibel bou di $1.',
+'copyrightpage' => '{{ns:project}}:Derechinan di outor',
+'currentevents' => 'Eventonan aktual',
+'currentevents-url' => 'Project:Eventonan aktual',
+'disclaimers' => 'Deklarashon di Liberashon for di Responsabilidatnan',
+'disclaimerpage' => 'Project:Deklarashon di Liberashon for di Responsabilidat General',
+'edithelp' => 'Ayudo ku editamentu',
+'edithelppage' => 'Help:Kon pa editá artíkulo',
+'helppage' => 'Help:Kontenido',
+'mainpage' => 'Página Prinsipal',
 'mainpage-description' => 'Página Prinsipal',
-'policy-url'           => 'Project:Pólisa',
-'portal'               => 'Portal di komunidat',
-'portal-url'           => 'Project:Portal di komunidat',
-'privacy'              => 'Pólisa di Privasidat',
-'privacypage'          => 'Project:Pólisa di Privasidat',
+'policy-url' => 'Project:Pólisa',
+'portal' => 'Portal di komunidat',
+'portal-url' => 'Project:Portal di komunidat',
+'privacy' => 'Pólisa di Privasidat',
+'privacypage' => 'Project:Pólisa di Privasidat',
 
-'badaccess'        => 'Eror di outorisashon',
+'badaccess' => 'Eror di outorisashon',
 'badaccess-group0' => 'Bo no tin outorisashon pa ehekutá e akshon ku bo a skohe.',
 
-'youhavenewmessages'      => 'Bo tin $1 ($2).',
-'newmessageslink'         => 'mensahe nobo',
+'youhavenewmessages' => 'Bo tin $1 ($2).',
+'newmessageslink' => 'mensahe nobo',
 'youhavenewmessagesmulti' => 'Bo tin mensahe nobo riba $1',
-'editsection'             => 'editá',
-'toc'                     => 'Kontenido',
-'showtoc'                 => 'mustra',
-'hidetoc'                 => 'skonde',
+'editsection' => 'editá',
+'toc' => 'Kontenido',
+'showtoc' => 'mustra',
+'hidetoc' => 'skonde',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Artíkulo',
-'nstab-user'      => 'Página personal',
-'nstab-media'     => 'Media',
-'nstab-special'   => 'Spesial',
-'nstab-image'     => 'Imagen',
+'nstab-main' => 'Artíkulo',
+'nstab-user' => 'Página personal',
+'nstab-media' => 'Media',
+'nstab-special' => 'Spesial',
+'nstab-image' => 'Imagen',
 'nstab-mediawiki' => 'Mensahe',
-'nstab-template'  => 'Predefinishon',
-'nstab-help'      => 'Ayudo',
-'nstab-category'  => 'Kategoria',
+'nstab-template' => 'Predefinishon',
+'nstab-help' => 'Ayudo',
+'nstab-category' => 'Kategoria',
 
 # Main script and global functions
 'nosuchspecialpage' => 'E página spesial no ta eksistí',
@@ -156,86 +156,86 @@ $messages = array(
 Bo por haña un lista di tur [[Special:SpecialPages|{{int:specialpages}}]].',
 
 # General errors
-'error'         => 'Eror',
+'error' => 'Eror',
 'internalerror' => 'Eror interno',
-'cannotdelete'  => 'No por a kita e página òf imagen spesifiká. (Por ta e kaso ku un otro hende a kita e kaba.)',
-'badtitle'      => 'Título inválido',
-'badtitletext'  => 'E título di e página ku bo a pidi tabata inválido, bashí, òf un link pa un inter-idioma òf inter-wiki inkorekto.',
-'viewsource'    => 'Wak fuente',
+'cannotdelete' => 'No por a kita e página òf imagen spesifiká. (Por ta e kaso ku un otro hende a kita e kaba.)',
+'badtitle' => 'Título inválido',
+'badtitletext' => 'E título di e página ku bo a pidi tabata inválido, bashí, òf un link pa un inter-idioma òf inter-wiki inkorekto.',
+'viewsource' => 'Wak fuente',
 
 # Login and logout pages
-'welcomecreation'            => '== Bon bini, $1! ==
+'welcomecreation' => '== Bon bini, $1! ==
 Bo kuenta ta trahá.
 No lubidá di kambia bo [[Special:Preferences|{{SITENAME}} preferensianan]].',
-'yourname'                   => 'Nòmber di uzadó',
-'yourpassword'               => 'Kontraseña',
-'yourpasswordagain'          => 'Hinka kontraseña atrobe',
-'remembermypassword'         => 'Kordá mi (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'userlogin'                  => 'Traha un kuenta nobo òf outentiká',
-'userlogout'                 => 'Terminá sesion',
-'badretype'                  => 'E kontraseñanan hinká no ta kuadra.',
-'wrongpassword'              => 'Kontraseña no ta korekto. Por fabor purba atrobe.',
-'wrongpasswordempty'         => 'Kontraseña tabata bashí. Por fabor purba atrobe.',
+'yourname' => 'Nòmber di uzadó',
+'yourpassword' => 'Kontraseña',
+'yourpasswordagain' => 'Hinka kontraseña atrobe',
+'remembermypassword' => 'Kordá mi (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'userlogin' => 'Traha un kuenta nobo òf outentiká',
+'userlogout' => 'Terminá sesion',
+'badretype' => 'E kontraseñanan hinká no ta kuadra.',
+'wrongpassword' => 'Kontraseña no ta korekto. Por fabor purba atrobe.',
+'wrongpasswordempty' => 'Kontraseña tabata bashí. Por fabor purba atrobe.',
 'acct_creation_throttle_hit' => 'Bishitantenan na uzando bo IP adrès a traha $1 kuenta den e último 24 ora, lokual ta e máksimo permití den e periodo aki. Esaki ta nifiká ku hendenan uzando e IP adrès aki no por traha mas kuenta na e momentu aki.',
-'emailauthenticated'         => 'Bo e-mail adrès tabata outentiká riba $1.',
-'emailnotauthenticated'      => 'Bo e-mail adrès no ta outentiká ahinda. Lo siguiente funkshonnan lo no ta disponibel.',
-'emailconfirmlink'           => 'Konfirmá bo e-mail adrès.',
-'accountcreated'             => 'Kuenta trahá',
-'accountcreatedtext'         => 'E kuenta di uzadó pa $1 tabata trahá.',
+'emailauthenticated' => 'Bo e-mail adrès tabata outentiká riba $1.',
+'emailnotauthenticated' => 'Bo e-mail adrès no ta outentiká ahinda. Lo siguiente funkshonnan lo no ta disponibel.',
+'emailconfirmlink' => 'Konfirmá bo e-mail adrès.',
+'accountcreated' => 'Kuenta trahá',
+'accountcreatedtext' => 'E kuenta di uzadó pa $1 tabata trahá.',
 
 # Edit pages
-'watchthis'        => 'Observá e página aki',
-'anoneditwarning'  => 'Bo no a outentiká bo mes.
+'watchthis' => 'Observá e página aki',
+'anoneditwarning' => 'Bo no a outentiká bo mes.
 Bo por kambia página libremente, pero tene kuenta ku lo nota bo IP adrès den e historia di kambionan hasí na e página aki.',
-'blockedtitle'     => 'Uzadó ta blokiá',
-'confirmedittext'  => 'Bo mester konfirmá bo e-mail adrès promé ku bo editá página. Por fabor duna i validá bo e-mail adrès via bo [[Special:Preferences|preferensianan]].',
-'accmailtitle'     => 'Kontraseña mandá.',
-'accmailtext'      => "E kontraseña pa '$1' tabata mandá pa $2.",
-'newarticle'       => '(Nobo)',
+'blockedtitle' => 'Uzadó ta blokiá',
+'confirmedittext' => 'Bo mester konfirmá bo e-mail adrès promé ku bo editá página. Por fabor duna i validá bo e-mail adrès via bo [[Special:Preferences|preferensianan]].',
+'accmailtitle' => 'Kontraseña mandá.',
+'accmailtext' => "E kontraseña pa '$1' tabata mandá pa $2.",
+'newarticle' => '(Nobo)',
 'anontalkpagetext' => "----''Esaki ta e página di diskushon pa un uzadó anonimo ku no a traha un kuenta ahinda, òf no sa uza e. Ta pa e rason aki nos tin ku uza IP adrès pa identifiká e persona. Diferente uzadó por uza e IP adrès aki. Si bo ta un uzadó anonimo i ta sinti ku komentario irelevante tabata mandá pa bo, por fabor [[Special:UserLogin|registrá un kuenta nobo òf outentiká bo mes]] pa evitá konfushon den futuro.''",
-'yourtext'         => 'Bo teksto',
-'yourdiff'         => 'Diferensianan',
+'yourtext' => 'Bo teksto',
+'yourdiff' => 'Diferensianan',
 
 # History pages
-'currentrev'          => 'Revishon aktual',
+'currentrev' => 'Revishon aktual',
 'currentrevisionlink' => 'wak revishon aktual',
-'cur'                 => 'akt',
-'next'                => 'siguiente',
-'last'                => 'prev',
-'histlegend'          => 'Leyenda: (akt) = diferensia ku vershon aktual,
+'cur' => 'akt',
+'next' => 'siguiente',
+'last' => 'prev',
+'histlegend' => 'Leyenda: (akt) = diferensia ku vershon aktual,
 (prev) = diferensia ku vershon previo, m = editashon menor',
-'histfirst'           => 'Promé',
-'histlast'            => 'Último',
+'histfirst' => 'Promé',
+'histlast' => 'Último',
 
 # Search results
-'nextn'          => 'siguiente {{PLURAL:$1|$1}}',
+'nextn' => 'siguiente {{PLURAL:$1|$1}}',
 'searchhelp-url' => 'Help:Kontenido',
 
 # Preferences page
-'preferences'    => 'Preferensianan',
-'mypreferences'  => 'Mi preferensianan',
+'preferences' => 'Preferensianan',
+'mypreferences' => 'Mi preferensianan',
 'changepassword' => 'Kambia kontraseña',
 'timezonelegend' => 'Zona di tempu',
-'allowemail'     => 'Akseptá e-mail di otro uzadó',
-'youremail'      => 'E-mail:',
-'username'       => 'Nòmber di uzadó:',
-'uid'            => 'ID di uzadó:',
-'yourrealname'   => 'Nòmber berdadero:',
-'yourlanguage'   => 'Idioma:',
-'yourvariant'    => 'Variante:',
-'yournick'       => 'Nòmber di kariño:',
-'badsig'         => 'Firma inválido; kontrolá e HTML uzá.',
+'allowemail' => 'Akseptá e-mail di otro uzadó',
+'youremail' => 'E-mail:',
+'username' => 'Nòmber di uzadó:',
+'uid' => 'ID di uzadó:',
+'yourrealname' => 'Nòmber berdadero:',
+'yourlanguage' => 'Idioma:',
+'yourvariant' => 'Variante:',
+'yournick' => 'Nòmber di kariño:',
+'badsig' => 'Firma inválido; kontrolá e HTML uzá.',
 
 # Recent changes
-'recentchanges'     => 'Kambionan resien',
-'recentchangestext' => 'Sigui e kambionan mas resien na {{SITENAME}} riba e página aki.',
-'rclistfrom'        => 'Mustra kambionan nobo kuminsando for di $1',
-'rcshowhideminor'   => '$1 kambionan menor',
-'rcshowhidebots'    => '$1 botnan',
-'rcshowhideanons'   => '$1 uzadónan anonimo',
-'rclinks'           => 'Mustra último $1 kambionan den último $2 dianan<br />$3',
-'hide'              => 'Skonde',
-'show'              => 'Mustra',
+'recentchanges' => 'Kambionan resien',
+'recentchanges-summary' => 'Sigui e kambionan mas resien na {{SITENAME}} riba e página aki.',
+'rclistfrom' => 'Mustra kambionan nobo kuminsando for di $1',
+'rcshowhideminor' => '$1 kambionan menor',
+'rcshowhidebots' => '$1 botnan',
+'rcshowhideanons' => '$1 uzadónan anonimo',
+'rclinks' => 'Mustra último $1 kambionan den último $2 dianan<br />$3',
+'hide' => 'Skonde',
+'show' => 'Mustra',
 
 # File description page
 'file-anchor-link' => 'Imagen',
@@ -244,76 +244,76 @@ Bo por kambia página libremente, pero tene kuenta ku lo nota bo IP adrès den e
 'unwatchedpages' => 'Páginanan no observá',
 
 # Statistics
-'statistics'              => 'Estadístika',
+'statistics' => 'Estadístika',
 'statistics-header-users' => 'Estadístika di uzadónan',
 
 # Miscellaneous special pages
-'ncategories'             => '$1 {{PLURAL:$1|kategoria|kategorianan}}',
-'uncategorizedpages'      => 'Páginanan no kategorisá',
+'ncategories' => '$1 {{PLURAL:$1|kategoria|kategorianan}}',
+'uncategorizedpages' => 'Páginanan no kategorisá',
 'uncategorizedcategories' => 'Kategorianan no kategorisá',
-'unusedcategories'        => 'Kategorianan no uzá',
-'wantedcategories'        => 'Kategorianan deseá',
-'wantedpages'             => 'Páginanan deseá',
-'ancientpages'            => 'Páginanan mas bieu',
-'unusedcategoriestext'    => 'E siguiente kategorianan ta eksistí pero ningun artíkulo òf kategoria ta hasi uzo di nan.',
+'unusedcategories' => 'Kategorianan no uzá',
+'wantedcategories' => 'Kategorianan deseá',
+'wantedpages' => 'Páginanan deseá',
+'ancientpages' => 'Páginanan mas bieu',
+'unusedcategoriestext' => 'E siguiente kategorianan ta eksistí pero ningun artíkulo òf kategoria ta hasi uzo di nan.',
 
 # Special:Log
 'alllogstext' => 'Esaki ta un bista kombiná di registronan.
 Bo por skohe un tipo di registro tambe, òf filtrá e bista ku un nòmber di uzadó òf un título di un artíkulo.',
 
 # Special:AllPages
-'allpages'          => 'Tur página',
-'alphaindexline'    => '$1 pa $2',
-'allpagesfrom'      => 'Mustra páginanan kuminsando na:',
-'allarticles'       => 'Tur artíkulo',
-'allinnamespace'    => 'Tur página (dominio $1)',
+'allpages' => 'Tur página',
+'alphaindexline' => '$1 pa $2',
+'allpagesfrom' => 'Mustra páginanan kuminsando na:',
+'allarticles' => 'Tur artíkulo',
+'allinnamespace' => 'Tur página (dominio $1)',
 'allnotinnamespace' => 'Tur página (no den dominio di $1)',
-'allpagesprev'      => 'Anterior',
-'allpagesnext'      => 'Siguiente',
-'allpagesprefix'    => 'Mustra páginanan kuminsando ku e prefiho:',
+'allpagesprev' => 'Anterior',
+'allpagesnext' => 'Siguiente',
+'allpagesprefix' => 'Mustra páginanan kuminsando ku e prefiho:',
 
 # Special:Categories
-'categories'         => 'Kategorianan',
+'categories' => 'Kategorianan',
 'categoriespagetext' => 'Esaki ta e kategorianan ku ta eksistí den {{SITENAME}}.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
 # E-mail user
-'emailuser'       => 'Manda e-mail pa e uzadó aki',
-'emailpage'       => 'Manda e-mail',
-'emailpagetext'   => 'E formulario aki lo manda un e-mail pa e uzadò aki.
+'emailuser' => 'Manda e-mail pa e uzadó aki',
+'emailpage' => 'Manda e-mail',
+'emailpagetext' => 'E formulario aki lo manda un e-mail pa e uzadò aki.
 Bo e-mail adrès (manera ta pará den bo preferensianan) lo aparesé den e e-mail pa e resipiente por respondé na bo direktamente.',
 'defemailsubject' => 'E-mail di {{SITENAME}}',
-'emailfrom'       => 'Di:',
-'emailto'         => 'Pa:',
-'emailsubject'    => 'Tópiko:',
-'emailmessage'    => 'Mensahe:',
-'emailsend'       => 'Manda',
-'emailsent'       => 'E-mail mandá',
-'emailsenttext'   => 'Bo e-mail tabata mandá.',
+'emailfrom' => 'Di:',
+'emailto' => 'Pa:',
+'emailsubject' => 'Tópiko:',
+'emailmessage' => 'Mensahe:',
+'emailsend' => 'Manda',
+'emailsent' => 'E-mail mandá',
+'emailsenttext' => 'Bo e-mail tabata mandá.',
 
 # Watchlist
-'watchlist'         => 'Mi lista di observashon',
-'nowatchlist'       => 'Bo lista di observashon ta bashí.',
-'watchnologintext'  => 'Bo mester [[Special:UserLogin|outentiká bo mes]] pa modifiká bo lista di observashon.',
-'addedwatchtext'    => "E página \"[[:\$1]]\" tabata añadí na bo [[Special:Watchlist|lista di observashon]].
+'watchlist' => 'Mi lista di observashon',
+'nowatchlist' => 'Bo lista di observashon ta bashí.',
+'watchnologintext' => 'Bo mester [[Special:UserLogin|outentiká bo mes]] pa modifiká bo lista di observashon.',
+'addedwatchtext' => "E página \"[[:\$1]]\" tabata añadí na bo [[Special:Watchlist|lista di observashon]].
 Lo lista kambionan hasí na e página aki i su página di diskushon einan,
 i e página lo aparesé '''vet''' den e [[Special:RecentChanges|lista di kambionan resien]] pa
 e ta mas fásil pa bo mira.
 
 Si despues bo ke kita e página for di bo lista di observashon, primi \"Stop di observá\" den e menú ariba.",
-'watch'             => 'Observá',
-'watchthispage'     => 'Observá e página aki',
-'unwatch'           => 'Stop di observá',
-'unwatchthispage'   => 'Stop di observá',
+'watch' => 'Observá',
+'watchthispage' => 'Observá e página aki',
+'unwatch' => 'Stop di observá',
+'unwatchthispage' => 'Stop di observá',
 'watchlistcontains' => 'Bo lista di observashon tin $1 {{PLURAL:$1|página|páginanan}}.',
-'wlshowlast'        => 'Mustra último $1 oranan $2 dianan $3',
+'wlshowlast' => 'Mustra último $1 oranan $2 dianan $3',
 
 'changed' => 'kambiá',
 'created' => 'trahá',
 
 # Delete
-'confirm'        => 'Konfirmá',
+'confirm' => 'Konfirmá',
 'actioncomplete' => 'Akshon kompletá',
 
 # Protect
@@ -324,28 +324,28 @@ Si despues bo ke kita e página for di bo lista di observashon, primi \"Stop di
 'undelete' => 'Wak páginanan kitá',
 
 # Namespace form on various pages
-'invert'         => 'Invertí selekshon',
+'invert' => 'Invertí selekshon',
 'blanknamespace' => '(Prinsipal)',
 
 # Contributions
 'contributions' => 'Kontribushonnan di uzadó',
-'mycontris'     => 'Mi kontribushonnan',
+'mycontris' => 'Mi kontribushonnan',
 
 # What links here
 'whatlinkshere' => 'Kiko ta link aki',
 
 # Block/unblock
-'blockip'            => 'Blokia uzadó',
-'badipaddress'       => 'IP adrès ta inválido',
-'blockipsuccesssub'  => 'Blokeo eksitoso',
+'blockip' => 'Blokia uzadó',
+'badipaddress' => 'IP adrès ta inválido',
+'blockipsuccesssub' => 'Blokeo eksitoso',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] tabata blokiá.<br />
 Wak e [[Special:BlockList|lista di blokeonan]] pa wak tur blokeo aktivo.',
-'unblockip'          => 'Desblokia uzadó',
-'blocklink'          => 'blokia',
-'unblocklink'        => 'desblokia',
-'contribslink'       => "kontrib'nan",
-'autoblocker'        => 'Bo tabata outomatikamente blokiá pasombra "[[User:$1|$1]]" a uza e IP adrès aki resientemente. E rason ku $1 tabata blokiá ta: "\'\'\'$2\'\'\'"',
-'unblocklogentry'    => 'a desblokia $1',
+'unblockip' => 'Desblokia uzadó',
+'blocklink' => 'blokia',
+'unblocklink' => 'desblokia',
+'contribslink' => "kontrib'nan",
+'autoblocker' => 'Bo tabata outomatikamente blokiá pasombra "[[User:$1|$1]]" a uza e IP adrès aki resientemente. E rason ku $1 tabata blokiá ta: "\'\'\'$2\'\'\'"',
+'unblocklogentry' => 'a desblokia $1',
 
 # Move page
 'articleexists' => 'Tin un página ku e título ei kaba, òf e
@@ -353,37 +353,37 @@ título ku bo a skohe no ta válido.
 Por fabor skohe un otro título.',
 
 # Namespace 8 related
-'allmessages'        => 'Mensahenan di sistema',
-'allmessagesname'    => 'Nòmber',
+'allmessages' => 'Mensahenan di sistema',
+'allmessagesname' => 'Nòmber',
 'allmessagesdefault' => 'Teksto predeterminá',
 'allmessagescurrent' => 'Teksto aktual',
-'allmessagestext'    => 'Esaki ta un lista di mensahe di sistema disponibel den e dominio di MediaWiki.',
+'allmessagestext' => 'Esaki ta un lista di mensahe di sistema disponibel den e dominio di MediaWiki.',
 
 # Attribution
 'anonymous' => 'Uzadó(nan) anonimo di {{SITENAME}}',
 
 # Browsing diffs
 'previousdiff' => '← Diferensia anterior',
-'nextdiff'     => 'Siguiente diferensia →',
+'nextdiff' => 'Siguiente diferensia →',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'tur',
 'namespacesall' => 'tur',
 
 # E-mail address confirmation
-'confirmemail'           => 'Konfirmá e-mail adrès',
-'confirmemail_text'      => 'Bo mester validá bo e-mail adrès pa uza funkshonnan di e-mail.
+'confirmemail' => 'Konfirmá e-mail adrès',
+'confirmemail_text' => 'Bo mester validá bo e-mail adrès pa uza funkshonnan di e-mail.
 Primi e boton abou pa manda un e-mail di konfirmashon pa bo e-mail adrès.
 Ora bo haña e e-mail, bo ta sigui e instrukshonnan aden.
 Pa kontrolá si bo ta konfirmá kaba, wak bo preferensianan.',
-'confirmemail_send'      => 'Manda un kódigo di konfirmashon via e-mail.',
-'confirmemail_sent'      => 'E-mail pa konfirmashon mandá.',
-'confirmemail_invalid'   => 'Kódigo di konfirmashon inválido. Ta posibel ku e kódigo a kaduká.',
+'confirmemail_send' => 'Manda un kódigo di konfirmashon via e-mail.',
+'confirmemail_sent' => 'E-mail pa konfirmashon mandá.',
+'confirmemail_invalid' => 'Kódigo di konfirmashon inválido. Ta posibel ku e kódigo a kaduká.',
 'confirmemail_needlogin' => 'Bo mester $1 pa konfirmá bo e-mail adrès.',
-'confirmemail_success'   => 'Bo e-mail adrès tabata konfirmá. Bo por outentiká bo mes i gosa di {{SITENAME}}.',
-'confirmemail_loggedin'  => 'Bo e-mail adrès ta konfirmá.',
-'confirmemail_subject'   => '{{SITENAME}}: Konfirmashon di e-mail adrès',
-'confirmemail_body'      => 'Un hende, probablemente abo, di IP adrès $1, a registrá e
+'confirmemail_success' => 'Bo e-mail adrès tabata konfirmá. Bo por outentiká bo mes i gosa di {{SITENAME}}.',
+'confirmemail_loggedin' => 'Bo e-mail adrès ta konfirmá.',
+'confirmemail_subject' => '{{SITENAME}}: Konfirmashon di e-mail adrès',
+'confirmemail_body' => 'Un hende, probablemente abo, di IP adrès $1, a registrá e
 kuenta "$2" ku e e-mail adrès aki riba {{SITENAME}}.
 
 Pa konfirmá ku e kuenta aki en berdat ta di bo i pa aktivá
index 4fd4af0..c97a0cc 100644 (file)
@@ -28,20 +28,20 @@ $messages = array(
 'tog-editsectiononrightclick' => "Pérmet l'édichion del sekchion par un droé buke su ch'tite del sekchion (i feut JavaScript)",
 'tog-showtoc' => "Aficher l'tabe ed ches étnus (pou ches paches aveuc plu ed 3 intétes)",
 'tog-rememberpassword' => "Warder min lodjine su chl'ordinateu-lo (pour un maximum éd $1 {{PLURAL:$1|jour|jours}})",
-'tog-watchcreations' => "Ajouter chés paches qu'éj crée dseu em lisse",
-'tog-watchdefault' => "Ajouter chés paches qu'éj édite dseu em lisse.",
-'tog-watchmoves' => "Ajouter chés paches qu'éj déplache dseu m'lisse.",
-'tog-watchdeletion' => "Ajouter chés paches qu'éj déface dseur m'lisse.",
+'tog-watchcreations' => "Ajouter chés paches qu'éj crée et pi chés fichiés qu'éj téléquertche édseur em lisse à suire",
+'tog-watchdefault' => "Ajouter chés paches pi chés fichiés qu'éj cange édseur em lisse à suire.",
+'tog-watchmoves' => "Ajouter chés paches pi chés fichiés qu'éj déplache édseur m'lisse à suire.",
+'tog-watchdeletion' => "Ajouter chés paches pi chés fichiés qu'éj déface édseur m'lisse à suire.",
 'tog-previewontop' => "Aficher l'prévue édvint el bouéte édite",
 'tog-previewonfirst' => "Aficher l'prévue au preumié édite.",
-'tog-enotifwatchlistpages' => "Éspédier din m'boéte un imèle quante eune pache su m'lisse est candgée",
+'tog-enotifwatchlistpages' => "M'éspédier un imèle quante eune pache su m'lisse à suire est cangée",
 'tog-enotifusertalkpages' => 'Éspédier un imèle su em bouéte quante m\'pache "Dvise Uzeu" est candgée.',
-'tog-enotifminoredits' => 'Éspédier à mi étous un imèle pou ches tiots édites éd ches paches',
+'tog-enotifminoredits' => "M'éspédier étou un imèle pou chés tiots canjemints d'chés paches o d'chés fichiés",
 'tog-shownumberswatching' => "Aficher ch'nombe ed gins qu'ont vu.",
-'tog-watchlisthideown' => 'Muche mes édites dseur el lisse',
-'tog-watchlisthidebots' => 'Muche ches robots édites su el lisse',
-'tog-watchlisthideminor' => 'Muche ches tiots édites su el lisse.',
-'tog-watchlisthideliu' => 'Muche ches édites ed ches lodjés gins su el lisse.',
+'tog-watchlisthideown' => 'Muche ems édicions dseur el lisse à suire',
+'tog-watchlisthidebots' => 'Muche chés édicions des robots su el lisse à suire',
+'tog-watchlisthideminor' => 'Muche chés tiotes édicions su el lisse à suire.',
+'tog-watchlisthideliu' => 'Muche chés édicions ed ches lodjés gins su el lisse.',
 'tog-watchlisthideanons' => 'Muche ches édites ed ches gins annonimes su el lisse.',
 'tog-watchlisthidepatrolled' => 'Muche ches édites pormenés su el lisse.',
 'tog-ccmeonemails' => "Éspédier din m'bouéte ches copies ed ches imèles éq j'éspédie à ches autes uzeus",
@@ -121,6 +121,7 @@ $messages = array(
 'category-file-count' => "{{PLURAL:$2|Chol catégorie o seulemint chol fichié-lo.|{{PLURAL:$1|Ech fichier-lo est|$1 Chés fichiés-lo sont}} din l'catégorie-lo, pou un total éd $2 fichiés.}}",
 'category-file-count-limited' => "{{PLURAL:$1|Ech fichié d'apré est|Chés $1 fichiés d'apré sont}} dins l'catégorie-lo.",
 'listingcontinuesabbrev' => 'cont.',
+'noindex-category' => 'Paches nin indécsées',
 'broken-file-category' => "Paches aveuc des loïens d'fichiés bérzillés",
 
 'about' => 'À pérpos',
@@ -128,8 +129,8 @@ $messages = array(
 'newwindow' => '(ouvrir din eune nouvèle fernéte)',
 'cancel' => 'Canchler',
 'moredotdotdot' => 'Plu...',
-'mypage' => 'Em pache',
-'mytalk' => 'Mi bavouér',
+'mypage' => 'Pache',
+'mytalk' => 'Min bavouér',
 'anontalk' => "Bavouér pou chl'IP-lo",
 'navigation' => 'Navigachon',
 'and' => '&#32;pi',
@@ -139,7 +140,6 @@ $messages = array(
 'qbbrowse' => 'Trifouille',
 'qbedit' => 'Editer',
 'qbpageoptions' => 'Chol pache-lo',
-'qbpageinfo' => 'Conteske',
 'qbmyoptions' => 'Mes paches',
 'qbspecialpages' => 'Espéciales paches',
 'faq' => 'FAQ',
@@ -152,7 +152,7 @@ $messages = array(
 'vector-action-protect' => 'Garantir',
 'vector-action-undelete' => "N'poin défacher",
 'vector-action-unprotect' => "Canger l'garantie",
-'vector-simplesearch-preference' => "Déhousser chés avanches d'ércherche améliorées (seulemint pour Vector)",
+'vector-simplesearch-preference' => "Actionner l'barette pour chés traches simpes (seulemint pour l'habillure Vector)",
 'vector-view-create' => 'Créer',
 'vector-view-edit' => 'Éditer',
 'vector-view-history' => "Vir l'histoère",
@@ -318,6 +318,7 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
 'yourpassword' => "Mot d'passe:",
 'yourpasswordagain' => "Intrer à nouvieu ch'mot d'passe:",
 'remembermypassword' => "Intrer oùtonmatiquemint l'prochaine fouos (pour un maximum éd $1 {{PLURAL:$1|jour|jours}})",
+'securelogin-stick-https' => "Réster connécté in HTTPS apré l'connécsion",
 'yourdomainname' => 'Vote donmène:',
 'login' => 'Intrer',
 'nav-login-createaccount' => 'Intrer / créer vote conpte',
@@ -331,6 +332,7 @@ Si s'n'est poin ch'cas-lo, pététe éq ch'est un bogue din ch'businkillache. <b
 'createaccount' => 'Créer un conpte',
 'gotaccount' => "Jou qu'os avez piécha un conpte? '''$1'''.",
 'gotaccountlink' => 'Intrer',
+'userlogin-resetlink' => "Vos avez oblié vous détals d'connécsion ?",
 'createaccountmail' => 'par imèle',
 'badretype' => "Chés mots d'passe intrés, is sont poin bon.",
 'userexists' => "Nom d’utilisateur entré déjà utilisé.
@@ -356,6 +358,12 @@ j'm'escuse mais i feut prinde un aute nom.",
 'resetpass_forbidden' => "Chés mots d'passe is n'peu'te poin ète cangés",
 'resetpass-submit-loggedin' => "Canger ch'mot d'passe",
 
+# Special:PasswordReset
+'passwordreset' => "Ortreuver ch'mot d'passe",
+
+# Special:ChangeEmail
+'changeemail' => "Canger l'adrèche du imèle",
+
 # Edit page toolbar
 'bold_sample' => 'Cros teske',
 'bold_tip' => 'Cros teske',
@@ -395,6 +403,10 @@ Si vos ètes ichi par bérlure, bukez su l'bouton '''értour''' du navigateu.",
 Os povez [[Special:Search/{{PAGENAME}}|foaire eune érchérche du tite del pache]] din chés eutes paches,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} érchércher din chés érliées opéracions]
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer chol pache]</span>.',
+'noarticletext-nopermission' => "Achteure i n’y o autchun teske dseur l'pache-lo.
+Os povez [[Special:Search/{{PAGENAME}}|foaire eune érchérche du tite del pache]] din chés eutes paches,
+o bin <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} érchércher din chés érliées gazètes]</span>
+mais vos n'avez poin l'droué d'créer chol pache.",
 'previewnote' => "'''Afute! ch'teske-lo ch'est seulemint eune prévue.'''
 
 Vos cangemints, is sont poin coèr inrégistrés!",
@@ -409,11 +421,22 @@ Os prométtez auchi éq vos avez écrit ch'teske vous-méme, ou éq vos l’avez
 'template-semiprotected' => '(semi-garanti)',
 'hiddencategories' => '{{PLURAL:$1|Catégorie muchée|Catégories muchées}} pou chol pache:',
 'permissionserrorstext-withaction' => "Vos n’avez poin l'pérmichon éd $2, pou {{PLURAL:$1|ch'motif suivant|chés motifs suivants}}:",
+'recreate-moveddeleted-warn' => "'''Afute ! : Os ètes in route à ércréer eune pache qu'o té abolie édvant.'''
+
+Controler qu'ch'est pértinint d' porsuire chés modificacions édseur chol pache. L'jornal des défacions pi des déplachemints l'est affiké chi-édsous :",
+'moveddeleted-notice' => "Chol pache ale o té abolie. L'jornal des défacions pi des déplachemints il est affiké chi-édsous pour référinche.",
+
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "Affute : Chèle pache ale a trop d’modèles. Des inclusions n'sront poin foaites.",
+'post-expand-template-inclusion-category' => "Paches aveuc granmint d'modèles",
+'post-expand-template-argument-warning' => "Afute : Chol pache ale o au moins un paramète d'modèle dont l'inclusion est rindue impossibe. Apré éstinsion, chti-chi il éroait produit un résultat trop long, i n'a donc poin té inclus.",
+'post-expand-template-argument-category' => "Paches aveuc des paramètes d'modèle mie évalués",
 
 # History pages
 'viewpagelogs' => 'Vir chés gasètes del pache-lo',
 'currentrev-asof' => 'Coursaule vérchon in date du $1',
 'revisionasof' => 'Ércordé conme $1',
+'revision-info' => 'Version du $1 pèr $2',
 'previousrevision' => '← érvue dvant',
 'nextrevision' => 'Cangemint pu nouvieu →',
 'currentrevisionlink' => 'Érvision éd qhére',
@@ -424,22 +447,29 @@ Os prométtez auchi éq vos avez écrit ch'teske vous-méme, ou éq vos l’avez
 'histlegend' => "Diff séléccion: buke chés boétes d'chés canjemints à comparète pi détriquer intrer ou ch'bouton édsou.<br />
 Léginde : ({{MediaWiki:Cur}}) = différinches aveuc el vérchon à ch'momint-chi, ({{MediaWiki:Last}}) = différinches aveuc el vérchon édvant, <b>m</b> = tiot canjemint.",
 'history-fieldset-title' => "S'déplacher din l'historique",
+'history-show-deleted' => 'Défacés seulemint',
 'histfirst' => 'preumières paches',
 'histlast' => 'Darin',
 
+# Revision feed
+'history-feed-item-nocomment' => '$1 à $2',
+
 # Revision deletion
 'rev-delundel' => 'montrer/mucher',
 'revdel-restore' => 'cange écmint vir',
+'revdel-restore-deleted' => 'canjemints abolis',
+'revdel-restore-visible' => 'canjemints visibes',
 'pagehist' => 'Histoère del pache',
 
 # Merge log
 'revertmerge' => "N'poin mélinger",
 
 # Diffs
-'history-title' => 'Histoère des cangemints éd "$1"',
+'history-title' => 'Historike des canjemints éd "$1"',
 'lineno' => 'Line $1:',
 'compareselectedversions' => 'Compérer chés couésies contérbuchons',
 'editundo' => "n'poin foaire",
+'diff-multi' => '({{PLURAL:$1|Un canjemint intarmédiaire|$1 canjemints intarmédiaires}} par {{PLURAL:$2|un uzeu|$2 uzeus}} {{PLURAL:$1|est muché|sont muchées}})',
 
 # Search results
 'searchresults' => 'Tracher chés résultats',
@@ -453,17 +483,34 @@ Léginde : ({{MediaWiki:Cur}}) = différinches aveuc el vérchon à ch'momint-ch
 'prevn' => 'dvant {{PLURAL:$1|$1}}',
 'nextn' => 'apreu {{PLURAL:$1|$1}}',
 'prevn-title' => 'Dvant $1 {{PLURAL:$1|résultat|résultats}}',
+'nextn-title' => "$1 {{PLURAL:$1|résultat d'apré|résultats d'apré}}",
+'shown-title' => 'Montrer $1 résultat{{PLURAL:$1||s}} pèr pache',
 'viewprevnext' => 'Vir ($1 {{int:pipe-separator}} $2) ($3)',
+'searchmenu-exists' => "'''Il y o eune pache lonmée « [[:$1]] » édseur ch'wiki'''",
+'searchmenu-new' => "'''Créer l'pache « [[:$1|$1]] » édseur ech wiki !'''",
+'searchprofile-articles' => "Paches d'étnu",
+'searchprofile-project' => "Paches d’aïude et pi d'prodjé",
+'searchprofile-images' => 'Multimédia',
+'searchprofile-everything' => 'Tout',
+'searchprofile-advanced' => 'Értrache avanchée',
+'searchprofile-articles-tooltip' => 'tracher dins $1',
+'searchprofile-project-tooltip' => 'Tracher dins $1',
+'searchprofile-images-tooltip' => 'Tracher des fichiés multimédias',
+'searchprofile-everything-tooltip' => "Tracher dins tout ch'wikipédia (et ochi dins chés paches éd distchucion)",
+'searchprofile-advanced-tooltip' => "Couésir chés éspaches d'noms pour l'értrache",
 'search-result-size' => '$1 ({{PLURAL:$2|1 mot|$2 mots}})',
+'search-result-category-size' => '$1 mimbe{{PLURAL:$1||s}} ($2 édsous-catégorie{{PLURAL:$2||s}}, $3 fichié{{PLURAL:$3||s}})',
 'search-redirect' => '(érdirection $1)',
 'search-section' => '(sekchon $1)',
 'search-suggest' => 'Cha vo ti dire: $1',
 'search-interwiki-caption' => 'Proujé analocq',
 'search-interwiki-default' => '$1 résultats:',
 'search-interwiki-more' => '(pus)',
-'search-mwsuggest-enabled' => 'aveuc avanches',
-'search-mwsuggest-disabled' => "mie d'avanches",
+'searchrelated' => 'relaté',
+'searchall' => 'tout',
+'showingresultsheader' => "{{PLURAL:$5|Résultat '''$1'''|Résultats '''$1–$2'''}} éd '''$3''' pour '''$4'''",
 'nonefound' => "'''Note''': il y o tasseulemint quéques éspaces éd noms éq sont trachés pèr défeut. <br /> Pou tracher din tous chés contnus (paches éd pérlache, modéles, etc... comprins) insséyer in imploéyant ch'préfixe ''all:'' o bin imploéyer echl éspace éd noms édmindé conme préfixe.",
+'search-nonefound' => 'Y a autchun résultat pour chol dmanne.',
 'powersearch' => 'Érvue avanchée',
 'powersearch-legend' => 'Érvue avanchée',
 'powersearch-ns' => 'Tracher din chés éspaches éd chés noms:',
@@ -485,6 +532,8 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 'gender-male' => 'Marle',
 'gender-female' => 'Femelle',
 'email' => 'Imèle',
+'prefs-help-email' => "L’adrèche du courrièl est facultative, mais ale est nécessaire pour artreuver vote mot d'passe, si vos vnoète à l’oblier.",
+'prefs-help-email-others' => "Os pouvez auchi couésir d'laicher les eutes vos contacter par imèle aveuc un loïen édseur vote pache éd distchussion d'uzeu sans qu'i soèche nécessaire ed révéler vote idintité.",
 'prefs-help-email-required' => 'I feut eune iméle adérche',
 
 # User rights
@@ -505,18 +554,46 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => "Vir l'pache-lo",
 'action-edit' => "édite l'pache-lo",
+'action-createpage' => 'créer des paches',
+'action-createtalk' => 'créer des paches éd dichtchussion',
+'action-createaccount' => "créer ech compte d'uzeu",
+'action-minoredit' => 'mértcher chol canjemint conme mineur',
+'action-move' => "érlonmer l'pache-lo",
+'action-move-subpages' => 'érlonmer chol pache et pi ses dsous-paches',
+'action-move-rootuserpages' => "érlonmer l' pache princhipale d’un uzeu",
+'action-movefile' => "érlonmer ch'fichié-lo",
+'action-upload' => 'téléquértcher ech fichié',
+'action-reupload' => "écatir l'anchien fichié",
+'action-upload_by_url' => "téléquértcher ch' fichié à partir d’eune URL",
+'action-writeapi' => "foaire aveuc l'écrivure API",
+'action-delete' => "Défacer l'pache-lo",
+'action-deleterevision' => "défacer ch'canjemint-lo",
+'action-deletedhistory' => 'vir l’histoère muchée éd chol pache',
+'action-browsearchive' => 'tracher des paches défacées',
+'action-undelete' => "n'poin défacer chol pache",
+'action-suppressrevision' => 'vir pi érfoaire chol version muchée',
+'action-suppressionlog' => 'vir ech jornal privé',
+'action-block' => "blotcher l'écrivure éd chol uzeu-lo",
+'action-import' => 'téléquértcher chol pache à partir d’un eute wiki',
+'action-importupload' => "téléquértcher chol pache à partir d'un fichié",
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|cange|canges}}',
 'recentchanges' => 'Darins canjemints',
 'recentchanges-legend' => 'Opchons éd chés nouvieus canjemints',
 'recentchanges-feed-description' => 'Tracher chés pus darins cangemints du wiki din chol alimintachon.',
+'recentchanges-label-newpage' => 'Chol modificacion ale o créé eune nouvèle pache',
+'recentchanges-label-minor' => "C'est un tiot canjemint",
+'recentchanges-label-bot' => 'Chol modificacion ale o té foaite pèr un robot.',
+'recentchanges-label-unpatrolled' => 'Chol modificacion ale n’o poin coèr té controlée.',
 'rcnote' => "Vlo {{PLURAL:$1|ech darin canjemint foait|chés $1 darins canjemints foaits}} din {{PLURAL:$2|l'darinne jornèe|chés <b>$2</b> darins jours}} dusque  l' $4 à $5.",
+'rcnotefrom' => "Vlo chés modificacions foaites édpuis l' '''$2''' (dousqu'à '''$1''' au plus).",
 'rclistfrom' => "Montrer chés nouvieus cangemints d'puis $1",
 'rcshowhideminor' => '$1 tiotes éditions',
 'rcshowhidebots' => '$1 bots',
 'rcshowhideliu' => '$1 lodjés uzeus',
 'rcshowhideanons' => '$1 uzeus anonimes',
+'rcshowhidepatr' => '$1 chés modificacions wardées',
 'rcshowhidemine' => '$1 ems éditions',
 'rclinks' => 'Afiqher chés $1 darins canjemints din chés $2 darins jours<br />$3',
 'diff' => 'dif',
@@ -531,7 +608,9 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 
 # Recent changes linked
 'recentchangeslinked' => 'Darins canjemints érliés',
+'recentchangeslinked-toolbox' => 'Suivi des paches loïées',
 'recentchangeslinked-title' => 'Cangemints à pérpos éd "$1"',
+'recentchangeslinked-noresult' => "I n’y a poin d' modificacion des paches loïées pindant l'période couésie.",
 'recentchangeslinked-summary' => "Ch'est eune lisse d'chés darins canjemints su chés paches qu'ont un loïen aveuc l'pache-lo. Chés paches din vote [[Special:Watchlist|''lisse à suire'']] il sont in '''cros'''.",
 'recentchangeslinked-page' => 'Nom del pache:',
 'recentchangeslinked-to' => "Vir putot chés canjemints d'chés paches aveuc un loïen su l'pache-lo",
@@ -539,11 +618,20 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 # Upload
 'upload' => 'Quértcher chés fichiés',
 'uploadlogpage' => 'Jornal éd chés quértchémints',
+'filedesc' => 'Résumè',
 'uploadedimage' => '"[[$1]]" quértchée',
 
+'license' => 'Licince',
+'license-header' => 'Licince',
+
+# Special:ListFiles
+'listfiles' => 'Lisse des fichiés',
+
 # File description page
+'file-anchor-link' => 'Fichié',
 'filehist' => 'Histoère dech fichié',
 'filehist-help' => "Buke su eune date/heure pou vir ch'fichié conme il étoait ach momint-lo.",
+'filehist-revert' => 'invérser',
 'filehist-current' => 'courant',
 'filehist-datetime' => 'Date/Tans',
 'filehist-thumb' => 'Tiote image',
@@ -551,22 +639,62 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 'filehist-user' => 'Uzeu',
 'filehist-dimensions' => 'Diminsions',
 'filehist-comment' => 'Fichié éd chés conmints',
-'imagelinks' => 'Loïens dech fichié',
+'imagelinks' => 'Usage dech fichié',
 'linkstoimage' => "{{PLURAL:$1|L'pache d'apreu est liée|Chés $1 paches d'apreu sont liées}} à ch'fichié-lo :",
+'nolinkstoimage' => "Autchune pache n'est loïée aveuc ch'fichié-lo",
 'sharedupload' => "Cht'fichié vient éd $1 pi i put ète imploïé par d'eutes proujés.",
+'sharedupload-desc-here' => "Ch'fichié i vient éd $1. I put ète uzer pèr d’eutes prodjés.
+Vir apré ([$2 pache]).",
 'uploadnewversion-linktext' => 'Quértcher eune novèle vérchion del pache-lo',
 
+# MIME search
+'mimesearch' => 'Tracher pèr type éd contenu MIME',
+
+# List redirects
+'listredirects' => 'Lisse des érdiréccions',
+
+# Unused templates
+'unusedtemplates' => 'Modèles poin implouéyés',
+
 # Random page
 'randompage' => "Pache à l'bérlure",
 
 # Statistics
 'statistics' => 'Éstatistikes',
 
+'disambiguations' => 'Paches aveuc des loïens vers des paches du meume nom',
+'disambiguationspage' => 'Template:Omonymie',
+
+'doubleredirects' => 'Doubes érdireccions',
+
+'brokenredirects' => 'Érdireccions bérzillées',
+
+'withoutinterwiki' => 'Paches sans loïens intar-langues',
+
+'fewestrevisions' => 'Paches les moins canjées',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|octé|octés}}',
 'nmembers' => '$1 {{PLURAL:$1|mimbe|mimbes}}',
+'lonelypages' => 'Paches orfelines',
+'uncategorizedpages' => 'Paches sans catégories',
+'uncategorizedimages' => 'Fichiés sans catégories',
+'unusedcategories' => 'Catégories poin implouéyées',
+'unusedimages' => 'Fichiés orfelins',
+'wantedcategories' => 'Catégories granmint écmindées',
+'wantedpages' => 'Paches les pus écmindés',
+'wantedfiles' => 'Fichiés les pus écmindés',
+'wantedtemplates' => 'Modèles écmindés',
 'prefixindex' => 'Tertous chés paches aveuc préfix',
+'shortpages' => 'Courtes paches',
+'longpages' => 'Paches longues',
+'deadendpages' => "Paches in tchul d'so",
+'protectedpages' => 'Paches défènnées',
+'protectedtitles' => 'Tites défènnés',
+'listusers' => 'Lisse des uzeus',
+'usercreated' => '{{GENDER:$3|Créé}} ech $1 à $2',
 'newpages' => 'Novèles paches',
+'ancientpages' => 'Paches les pus vieilles',
 'move' => 'Déplacher',
 'movethispage' => "Déplacher l'pache-lo",
 'pager-newer-n' => '{{PLURAL:$1|pu nouvieu 1|pu nouvieus $1}}',
@@ -594,13 +722,21 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 'allpagessubmit' => 'Aler',
 'allpagesprefix' => "Foaire vir chés paches aveuc ch'préfix:",
 
+# Special:Categories
+'categories' => 'Lisse des catégories',
+
 # Special:LinkSearch
 'linksearch' => 'Loïens éstérieurs',
+'linksearch-line' => '$1 est loïé édpuis $2',
+
+# Special:ActiveUsers
+'activeusers' => 'Lisse des ouvreus uzeus',
 
 # Special:Log/newusers
 'newuserlogpage' => "Jornal éd chés créachons d'comptes d'uzeu",
 
 # Special:ListGroupRights
+'listgrouprights-summary' => "L'pache-lo ch'est ène lisse d'chés groupes d'uzeus définis édseur ech wiki aveuc chés drouots d'intrèe achuchonnés.<br />I put y avoèr ichi d'eutes [[MediaWiki:Listgrouprights-helppage|informacions]] édseur chés drouots individuèls. ([[{{MediaWiki:Listgrouprights-helppage}}|vir]])",
 'listgrouprights-members' => '(lisse éd chés mimbes)',
 
 # E-mail user
@@ -610,6 +746,7 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 # Watchlist
 'watchlist' => 'Em lisse à suire',
 'mywatchlist' => "M'lisse à suire",
+'watchlistfor2' => 'Pour $1 $2',
 'addedwatchtext' => "L' pache « [[:$1]] » o té rajoutée à vote [[Special:Watchlist|lisse à suire]].<br /> Chés  canjemints à vnir del pache-lo pi del page éd pérlache sront mis din l'lisse. L'pache sro '''in cros''' din el [[Special:RecentChanges|lisse d'chés darins canjemints]] pou les értreuver fachilmint. Pou értirer chol pache del ''lisse à suire'', bukez su « {{MediaWiki:Unwatch}} ».",
 'removedwatchtext' => "L'pache « [[:$1]] » o té értirée éd vote [[Special:Watchlist|lisse à suire]].",
 'watch' => 'Suire',
@@ -627,6 +764,7 @@ Ale doét mie éte pu longue éq $1 {{PLURAL:$1|caracter|caractéres}}.',
 'deletepage' => "Défacer l'pache",
 'confirmdeletetext' => "Vos alez défacer eune pache ou un fichié aveuc toutes chés antieusses vérchons.<br /> Confreumer éq ch'est cho éq vos voulez foaire, éq vos conprindez chés consécanches et pi éq ch'est bin s'lon el [[{{MediaWiki:Policy-url}}|politique éd MédiaWiki]].",
 'actioncomplete' => 'Plònne acchon',
+'actionfailed' => "L’action n'a poin réussi",
 'deletedtext' => "« $1 » o té défacé.
 Vir $2 pou eune lisse d'chés darinnes défachons.",
 'dellogpage' => 'jornal éd chés défacions',
@@ -669,6 +807,7 @@ Vlo chés réglages del pache '''$1''' à ch'momint-chi:",
 
 # Undelete
 'undeletelink' => 'vir/érfoaire',
+'undeleteviewlink' => 'Vir',
 
 # Namespace form on various pages
 'namespace' => 'Éspace du nom:',
@@ -678,7 +817,7 @@ Vlo chés réglages del pache '''$1''' à ch'momint-chi:",
 # Contributions
 'contributions' => 'Contérbuchons dechl uzeu',
 'contributions-title' => 'Contérbuchons dechl uzeu à pérpos éd $1',
-'mycontris' => 'Ems contérbuchons',
+'mycontris' => 'Mes contérbuchons',
 'contribsub2' => 'Pou $1 ($2)',
 'uctop' => '(darin)',
 'month' => "Dpuis ch'moés (pi édvant)",
@@ -686,6 +825,9 @@ Vlo chés réglages del pache '''$1''' à ch'momint-chi:",
 
 'sp-contributions-newbies' => 'Montrer chés contérbuchons éd chés nouvieus conptes seulemint',
 'sp-contributions-blocklog' => 'jornal éd chés blotcåjhes',
+'sp-contributions-uploads' => "téléquértch'mints",
+'sp-contributions-logs' => 'Gasètes',
+'sp-contributions-talk' => 'Dviser',
 'sp-contributions-search' => 'Tracher pou chés contérbuchons',
 'sp-contributions-username' => "Adérche IP ou nom d'uzeu",
 'sp-contributions-toponly' => "n'montrer qu'chés darins canjemints",
@@ -700,7 +842,7 @@ Vlo chés réglages del pache '''$1''' à ch'momint-chi:",
 'nolinkshere-ns' => "i n'y o poin d'pache aveuc un loïen vers '''[[:$1]]''' dins echl'éspace d'noms coési.",
 'isredirect' => 'pache érdirigée',
 'istemplate' => 'transclusion',
-'isimage' => "Loïen aveuc l'imache",
+'isimage' => "Loïen aveuc l'fichié",
 'whatlinkshere-prev' => '{{PLURAL:$1|édvant|édvants $1}}',
 'whatlinkshere-next' => "{{PLURAL:$1|d'apreu|d'apreu $1}}",
 'whatlinkshere-links' => '← loïens',
@@ -719,6 +861,7 @@ I feut l'foaire seleumint pour inréyer ech vindalime et pi i feut ète acordant
 Donner apré ch'motif  (pèr egzimpe chiter chés paches qu'ont té vindalisées).",
 'ipboptions' => '2 heures:2 hours,1 jour:1 day,3 jours:3 days,1 ésminne:1 week,2 ésminnes:2 weeks,1 moés:1 month,3 moés:3 months,6 moés:6 months,1 an:1 year,infini:infinite',
 'ipbotheroption' => 'eute',
+'blocklist' => 'Uzeus blotchés',
 'ipblocklist' => 'Uzeus blotchés',
 'blocklink' => 'blotcher',
 'unblocklink' => 'déblotcher',
@@ -758,8 +901,13 @@ Din chés cas-lo, I feut érlonmer ou ratatouiller l'pache aveuc l'main.",
 # Export
 'export' => 'Ésporter chés paches',
 
+# Namespace 8 related
+'allmessagesname' => 'Nom',
+'allmessagesdefault' => 'Messache pèr défeut',
+
 # Thumbnails
 'thumbnail-more' => 'Pu grand',
+'thumbnail_error' => "Bérlurage tandir l'créachon éd la miniature : $1",
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Vote pache éd uzeu',
@@ -819,6 +967,7 @@ Os pouvez vir l'source",
 'tooltip-rollback' => '« Racacher » cancéle aveuc un clic el (ou chés) modificachon(s) del pache-lo pèr sin darin contérbucheu.',
 'tooltip-undo' => "« Undo » ( ''démangler'' ) értire ch'canjemint-lo pi ouvre l' fénéte d'édichon din ch'mode ''prévir''. <br /> In put mette un motif din ch'résumé.",
 'tooltip-preferences-save' => 'Warder chés préférinches.',
+'tooltip-summary' => 'Intrer un tiot résumè',
 
 # Browsing diffs
 'previousdiff' => '← Pu vieille édition',
@@ -830,6 +979,9 @@ Os pouvez vir l'source",
 'svg-long-desc' => 'Fichié SVG, résoluchon éd $1 × $2 picsels, diminchon: $3',
 'show-big-image' => 'Plinne résoluchon',
 
+# Special:NewFiles
+'newimages' => "Galerie d'chés nouvieus fichiés",
+
 # Bad image list
 'bad_image_list' => "Ch'format ch'est:
 
@@ -878,12 +1030,18 @@ Chés eutes cans is s'ront muchés pèr défeut.
 'watchlisttools-edit' => "Vir pi éditer l'lisse à suire",
 'watchlisttools-raw' => 'Éditer eune brute lisse à suire',
 
+# Core parser functions
+'duplicate-defaultsort' => "Afute : él cleu d'tri pèr défeut « $2 » écrase l'précédinte « $1 ».",
+
 # Special:Version
 'version-specialpages' => 'Paches éspéchiales',
 
 # Special:FilePath
 'filepath-page' => 'Fichié :',
 
+# Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Dénicher chés doublons',
+
 # Special:SpecialPages
 'specialpages' => 'Paches éspéchiales',
 'specialpages-group-users' => 'Uzeus pi leus droués',
@@ -892,6 +1050,20 @@ Chés eutes cans is s'ront muchés pèr défeut.
 # Special:BlankPage
 'blankpage' => 'Blanke pache',
 
+# External image whitelist
+'external_image_whitelist' => " #Laicher chol line egzactemint telle quelle.<pre>
+#Dire chés bérlukes d’éspressions rationnelles (juste l'partie désignée inte chés //) chi-édsous.
+#I correspondront aveuc chés URL des images éstérnes.
+#Chelles qui corresponde'te s’affikeront conme des images, sinon seul un loïen vers l’image i s'ra affiké.
+#Les lines conmençant par un # s'ront considérées conme des conmintaires.
+#Chol lisse n’est mie sensibe à la casse.
+
+#Mettez tous chés bérlukes d’éspressions rationnelles au-d'sus éd chol line. Laichez chol darin.ne line telle quelle.</pre>",
+
+# Special:Tags
+'tags' => 'Balises des canjemints valides',
+'tag-filter' => 'Filtrer chés [[Special:Tags|balises]] :',
+
 # Special:ComparePages
 'compare-page1' => 'Pache 1',
 'compare-page2' => 'Pache 2',
index 9806086..a8d240b 100644 (file)
@@ -138,7 +138,7 @@ $messages = array(
 'cancel' => 'Zerick',
 'moredotdotdot' => 'Mehner…',
 'mypage' => 'Mei Blatt',
-'mytalk' => 'Mei Gschwetz-Blatt',
+'mytalk' => 'Mei Dischbedutt',
 'anontalk' => 'Gschwetz-Blatt fer die IP',
 'navigation' => 'Faahre-Gnepp',
 'and' => '&#32;unn',
@@ -147,7 +147,6 @@ $messages = array(
 'qbfind' => 'Finne',
 'qbedit' => 'Ennere',
 'qbpageoptions' => 'Des Blatt',
-'qbpageinfo' => 'Daade vun dem Blatt',
 'qbmyoptions' => 'Mei Bledder',
 'qbspecialpages' => 'Besunnere Bledder',
 'faq' => 'FAQ',
@@ -188,7 +187,7 @@ $messages = array(
 'protectthispage' => 'Des Blatt schitze',
 'newpage' => 'Neies Blatt',
 'talkpage' => 'Sell Blatt dischbediere',
-'talkpagelinktext' => 'Gschwetz',
+'talkpagelinktext' => 'Dischbedutt',
 'specialpage' => 'Besunneres Blatt',
 'personaltools' => 'Paerseenlich Gscharr',
 'articlepage' => 'Inhalt vun dem Blatt aagucke',
@@ -412,8 +411,6 @@ Paesswatt fer nau: $2',
 'search-interwiki-caption' => 'Schweschder Projects',
 'search-interwiki-default' => '$1 Results:',
 'search-interwiki-more' => '(weidere)',
-'search-mwsuggest-enabled' => 'mit Vorschläch',
-'search-mwsuggest-disabled' => 'kee Vorschläch',
 'searchall' => 'all',
 'powersearch' => 'Guck uff',
 'powersearch-ns' => 'Guck uff in Blatznaame:',
@@ -428,7 +425,7 @@ Paesswatt fer nau: $2',
 
 # Preferences page
 'preferences' => 'Paerseenlich Profil',
-'mypreferences' => 'Mei Uffschtelling',
+'mypreferences' => 'Uffschtellinge',
 'changepassword' => 'Paesswatt ennere',
 'skin-preview' => 'Aagucke',
 'prefs-personal' => 'Yuuser Profile',
@@ -694,7 +691,7 @@ Paesswatt fer nau: $2',
 
 # Watchlist
 'watchlist' => 'Mei Watsch-Lischt',
-'mywatchlist' => 'Mei Watsch-Lischt',
+'mywatchlist' => 'Watsch-Lischt',
 'watchlistfor2' => 'Vun $1 $2',
 'watch' => 'watsche',
 'watchthispage' => 'watsch des Blatt',
@@ -709,9 +706,7 @@ Paesswatt fer nau: $2',
 'watching' => 'Watsche…',
 'unwatching' => 'Nimmi watsche...',
 
-'enotif_newpagetext' => 'Sell iss en neies Blatt.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-Yuuser',
-'changed' => 'gennert',
 
 # Delete
 'deletepage' => 'Blatt lesche',
@@ -767,7 +762,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 'month' => 'unn Munet:',
 'year' => 'bis Yaahr:',
 
-'sp-contributions-talk' => 'Gschwetz',
+'sp-contributions-talk' => 'Dischbedutt',
 'sp-contributions-search' => 'Guck fer Ardickel',
 'sp-contributions-username' => 'IP-Adress odder Yuusernaame:',
 'sp-contributions-submit' => 'Guck uff',
@@ -1020,4 +1015,7 @@ Guck $2 fer e Lischt vun de letscht Leschunge.',
 # Feedback
 'feedback-message' => 'Melding:',
 
+# Search suggestions
+'searchsuggest-search' => 'Uffgucke',
+
 );
index b0e023c..aa4e5f9 100644 (file)
@@ -16,224 +16,224 @@ $fallback = 'de';
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'Links unjastritje:',
-'tog-justify'                 => 'Tatjst em Blocksautz',
-'tog-hideminor'               => 'Tjliene Endarunge ute latste Tiet nich wiese',
-'tog-extendwatchlist'         => 'Moak dee Oppaussied-List jrata en wies aula Endarunge',
-'tog-usenewrc'                => 'Betre Doastalinj (JavaScript es needich)',
-'tog-numberheadings'          => 'Ewaschrefte automatisch numerere',
-'tog-showtoolbar'             => 'Instrumente-Leist wiese (JavaScript)',
-'tog-editondblclick'          => 'Siede mett Dobbeltklick beoabeide (JavaScript)',
-'tog-editsection'             => 'Links tom Beoabeide von eenzelne Aufschnette wiese',
+'tog-underline' => 'Links unjastritje:',
+'tog-justify' => 'Tatjst em Blocksautz',
+'tog-hideminor' => 'Tjliene Endarunge ute latste Tiet nich wiese',
+'tog-extendwatchlist' => 'Moak dee Oppaussied-List jrata en wies aula Endarunge',
+'tog-usenewrc' => 'Betre Doastalinj (JavaScript es needich)',
+'tog-numberheadings' => 'Ewaschrefte automatisch numerere',
+'tog-showtoolbar' => 'Instrumente-Leist wiese (JavaScript)',
+'tog-editondblclick' => 'Siede mett Dobbeltklick beoabeide (JavaScript)',
+'tog-editsection' => 'Links tom Beoabeide von eenzelne Aufschnette wiese',
 'tog-editsectiononrightclick' => 'Eenzelne Aufschnette mett eenem Rajsch-Klick beoabeide (JavaScript)',
-'tog-showtoc'                 => 'Wies dee List mettem Enhault (fe Siede mett meea aus dree Ewaschrefte)',
-'tog-rememberpassword'        => 'Login bewoare, dee Brucka blift aun disem Computer aunjemaldt',
-'tog-previewontop'            => 'Wies Preview bowe em Beoabeide-Fensta',
-'tog-showhiddencats'          => "Wies fe'stoakne Kategorien",
+'tog-showtoc' => 'Wies dee List mettem Enhault (fe Siede mett meea aus dree Ewaschrefte)',
+'tog-rememberpassword' => 'Login bewoare, dee Brucka blift aun disem Computer aunjemaldt',
+'tog-previewontop' => 'Wies Preview bowe em Beoabeide-Fensta',
+'tog-showhiddencats' => "Wies fe'stoakne Kategorien",
 
 'underline-always' => 'Emma',
-'underline-never'  => 'Nienijch',
+'underline-never' => 'Nienijch',
 
 # Dates
-'sunday'        => 'Sindach',
-'monday'        => 'Mondach',
-'tuesday'       => 'Dinjsdach',
-'wednesday'     => 'Medwäakj',
-'thursday'      => 'Donnadach',
-'friday'        => 'Friedach',
-'saturday'      => 'Sinowent',
-'sun'           => 'Sin',
-'mon'           => 'Mon',
-'tue'           => 'Din',
-'wed'           => 'Med',
-'thu'           => 'Don',
-'fri'           => 'Fri',
-'sat'           => 'Sow',
-'january'       => 'Jaunwoa',
-'february'      => 'Feebawoa',
-'march'         => 'Moats',
-'april'         => 'Aprell',
-'may_long'      => 'Mei',
-'june'          => 'Jüni',
-'july'          => 'Jüli',
-'august'        => 'August',
-'september'     => 'Septamba',
-'october'       => 'Oktooba',
-'november'      => 'Nowamba',
-'december'      => 'Deetsamba',
-'january-gen'   => 'Jaunwoa',
-'february-gen'  => 'Feebawoa',
-'march-gen'     => 'Moats',
-'april-gen'     => 'Aprell',
-'may-gen'       => 'Mei',
-'june-gen'      => 'Jüni',
-'july-gen'      => 'Jüli',
-'august-gen'    => 'August',
+'sunday' => 'Sindach',
+'monday' => 'Mondach',
+'tuesday' => 'Dinjsdach',
+'wednesday' => 'Medwäakj',
+'thursday' => 'Donnadach',
+'friday' => 'Friedach',
+'saturday' => 'Sinowent',
+'sun' => 'Sin',
+'mon' => 'Mon',
+'tue' => 'Din',
+'wed' => 'Med',
+'thu' => 'Don',
+'fri' => 'Fri',
+'sat' => 'Sow',
+'january' => 'Jaunwoa',
+'february' => 'Feebawoa',
+'march' => 'Moats',
+'april' => 'Aprell',
+'may_long' => 'Mei',
+'june' => 'Jüni',
+'july' => 'Jüli',
+'august' => 'August',
+'september' => 'Septamba',
+'october' => 'Oktooba',
+'november' => 'Nowamba',
+'december' => 'Deetsamba',
+'january-gen' => 'Jaunwoa',
+'february-gen' => 'Feebawoa',
+'march-gen' => 'Moats',
+'april-gen' => 'Aprell',
+'may-gen' => 'Mei',
+'june-gen' => 'Jüni',
+'july-gen' => 'Jüli',
+'august-gen' => 'August',
 'september-gen' => 'Septamba',
-'october-gen'   => 'Oktooba',
-'november-gen'  => 'Nowamba',
-'december-gen'  => 'Deetsamba',
-'jan'           => 'Jau',
-'feb'           => 'Fee',
-'mar'           => 'Moa',
-'apr'           => 'Apr',
-'may'           => 'Mei',
-'jun'           => 'Jun',
-'jul'           => 'Jul',
-'aug'           => 'Aug',
-'sep'           => 'Sep',
-'oct'           => 'Okt',
-'nov'           => 'Now',
-'dec'           => 'Dez',
+'october-gen' => 'Oktooba',
+'november-gen' => 'Nowamba',
+'december-gen' => 'Deetsamba',
+'jan' => 'Jau',
+'feb' => 'Fee',
+'mar' => 'Moa',
+'apr' => 'Apr',
+'may' => 'Mei',
+'jun' => 'Jun',
+'jul' => 'Jul',
+'aug' => 'Aug',
+'sep' => 'Sep',
+'oct' => 'Okt',
+'nov' => 'Now',
+'dec' => 'Dez',
 
 # Categories related messages
-'pagecategories'           => '{{PLURAL:$1|Kategorie|Kategorien}}',
-'category_header'          => 'Siede in Kategorie "$1"',
-'category-media-header'    => 'Bilda in Kategorie "$1"',
-'hidden-categories'        => "{{PLURAL:$1|Fe'stoakne Kategorie|Fe'stoakne Kategorien}}",
+'pagecategories' => '{{PLURAL:$1|Kategorie|Kategorien}}',
+'category_header' => 'Siede in Kategorie "$1"',
+'category-media-header' => 'Bilda in Kategorie "$1"',
+'hidden-categories' => "{{PLURAL:$1|Fe'stoakne Kategorie|Fe'stoakne Kategorien}}",
 'hidden-category-category' => "Fe'stoakne Kategorien",
 
-'about'         => 'Äwa',
-'newwindow'     => '(got in en nie Fensta op)',
-'cancel'        => 'Aufbräakje',
+'about' => 'Äwa',
+'newwindow' => '(got in en nie Fensta op)',
+'cancel' => 'Aufbräakje',
 'moredotdotdot' => 'Mea...',
-'mypage'        => 'Miene Sied',
-'mytalk'        => 'Miene Beredsied',
-'anontalk'      => 'Beredsied fe dise IP',
-'navigation'    => 'Navigatioon',
-'and'           => '&#32;onn',
+'mypage' => 'Miene Sied',
+'mytalk' => 'Miene Beredsied',
+'anontalk' => 'Beredsied fe dise IP',
+'navigation' => 'Navigatioon',
+'and' => '&#32;onn',
 
 # Cologne Blue skin
-'qbfind'         => 'finje',
-'qbedit'         => 'Endre',
-'qbpageoptions'  => 'Dise Sied',
-'qbmyoptions'    => 'Miene Siede',
+'qbfind' => 'finje',
+'qbedit' => 'Endre',
+'qbpageoptions' => 'Dise Sied',
+'qbmyoptions' => 'Miene Siede',
 'qbspecialpages' => "Opp'poate Siede",
 
-'errorpagetitle'   => 'Fäla',
-'returnto'         => 'Trigj no $1.',
-'tagline'          => 'Fonn {{SITENAME}}',
-'help'             => 'Help',
-'search'           => 'Setje',
-'searchbutton'     => 'Setje',
-'go'               => 'Go',
-'searcharticle'    => 'Sied',
-'history'          => "Siedeje'schijchte",
-'history_short'    => 'Jeschicht',
-'updatedmarker'    => 'fresch jemoakt',
+'errorpagetitle' => 'Fäla',
+'returnto' => 'Trigj no $1.',
+'tagline' => 'Fonn {{SITENAME}}',
+'help' => 'Help',
+'search' => 'Setje',
+'searchbutton' => 'Setje',
+'go' => 'Go',
+'searcharticle' => 'Sied',
+'history' => "Siedeje'schijchte",
+'history_short' => 'Jeschicht',
+'updatedmarker' => 'fresch jemoakt',
 'printableversion' => 'Drekdoastalinj',
-'permalink'        => 'Bestendja Link',
-'print'            => 'Drek',
-'edit'             => 'Endre',
-'create'           => 'Moak',
-'editthispage'     => 'Endre dise Sied',
+'permalink' => 'Bestendja Link',
+'print' => 'Drek',
+'edit' => 'Endre',
+'create' => 'Moak',
+'editthispage' => 'Endre dise Sied',
 'create-this-page' => 'Moak dise Sied',
-'delete'           => 'Lasche',
-'deletethispage'   => 'Dise Sied lasche',
-'protect'          => "be'schutse",
-'newpage'          => 'Nie Sied',
-'talkpage'         => 'Beräd de Sied',
+'delete' => 'Lasche',
+'deletethispage' => 'Dise Sied lasche',
+'protect' => "be'schutse",
+'newpage' => 'Nie Sied',
+'talkpage' => 'Beräd de Sied',
 'talkpagelinktext' => 'Beredsied',
-'specialpage'      => 'Spezialsied',
-'personaltools'    => 'Perseenliche Instrumente',
-'postcomment'      => 'Kommentar moake',
-'talk'             => 'Beredsied',
-'views'            => 'Aunsechte',
-'toolbox'          => 'Instrumente',
-'userpage'         => 'Brucka-Sied',
-'projectpage'      => 'Meta-Sied',
-'imagepage'        => 'Datei-Sied',
-'mediawikipage'    => 'Enhault wiese',
-'templatepage'     => 'Sied mett Dokumentenvorlagen wiese',
-'viewhelppage'     => 'Help-Sied wiese',
-'categorypage'     => 'Kategorie-Sied wiese',
-'viewtalkpage'     => 'Diskussioon',
-'otherlanguages'   => 'In aundre Sproake',
-'redirectedfrom'   => '(wieda jeleidt von $1)',
-'redirectpagesub'  => 'Sied tom Wiedaleide',
-'lastmodifiedat'   => "Dise Sied word aum $1, klock $2 daut latzte Mol je'endat.",
-'protectedpage'    => 'Sied mett besondrem Schutz',
-'jumpto'           => 'Sprinj no:',
+'specialpage' => 'Spezialsied',
+'personaltools' => 'Perseenliche Instrumente',
+'postcomment' => 'Kommentar moake',
+'talk' => 'Beredsied',
+'views' => 'Aunsechte',
+'toolbox' => 'Instrumente',
+'userpage' => 'Brucka-Sied',
+'projectpage' => 'Meta-Sied',
+'imagepage' => 'Datei-Sied',
+'mediawikipage' => 'Enhault wiese',
+'templatepage' => 'Sied mett Dokumentenvorlagen wiese',
+'viewhelppage' => 'Help-Sied wiese',
+'categorypage' => 'Kategorie-Sied wiese',
+'viewtalkpage' => 'Diskussioon',
+'otherlanguages' => 'In aundre Sproake',
+'redirectedfrom' => '(wieda jeleidt von $1)',
+'redirectpagesub' => 'Sied tom Wiedaleide',
+'lastmodifiedat' => "Dise Sied word aum $1, klock $2 daut latzte Mol je'endat.",
+'protectedpage' => 'Sied mett besondrem Schutz',
+'jumpto' => 'Sprinj no:',
 'jumptonavigation' => 'Navigatioon',
-'jumptosearch'     => 'Setje',
+'jumptosearch' => 'Setje',
 
 # 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'            => 'Äwa {{SITENAME}}',
-'aboutpage'            => 'Project:Äwa',
-'copyright'            => 'Enhault es to habe unja $1.',
-'currentevents'        => 'Aktuelle Sache',
-'currentevents-url'    => 'Project:Aktuelle Sache',
-'disclaimers'          => 'Impressum',
-'disclaimerpage'       => 'Project:Impressum',
-'edithelp'             => 'Help tom Beoabeide',
-'edithelppage'         => 'Help:Help tom Beoabeide',
-'helppage'             => 'Help:Enhault',
-'mainpage'             => 'Hauptsied',
+'aboutsite' => 'Äwa {{SITENAME}}',
+'aboutpage' => 'Project:Äwa',
+'copyright' => 'Enhault es to habe unja $1.',
+'currentevents' => 'Aktuelle Sache',
+'currentevents-url' => 'Project:Aktuelle Sache',
+'disclaimers' => 'Impressum',
+'disclaimerpage' => 'Project:Impressum',
+'edithelp' => 'Help tom Beoabeide',
+'edithelppage' => 'Help:Help tom Beoabeide',
+'helppage' => 'Help:Enhault',
+'mainpage' => 'Hauptsied',
 'mainpage-description' => 'Hauptsied',
-'policy-url'           => 'Project:Policy',
-'portal'               => 'Jemeenschauftsportal',
-'portal-url'           => 'Project:Jemeenschauftsportal',
-'privacy'              => 'Doteschutz',
-'privacypage'          => 'Project:Doteschutz',
+'policy-url' => 'Project:Policy',
+'portal' => 'Jemeenschauftsportal',
+'portal-url' => 'Project:Jemeenschauftsportal',
+'privacy' => 'Doteschutz',
+'privacypage' => 'Project:Doteschutz',
 
-'badaccess'        => 'Nich utretjende Rajchte',
+'badaccess' => 'Nich utretjende Rajchte',
 'badaccess-group0' => 'Du hast nich daut needje Rajcht fe dise Aktioon.',
 
 'versionrequired' => 'Versioon $1 von MediaWiki es needich',
 
-'retrievedfrom'           => 'Von "$1"',
-'youhavenewmessages'      => 'Dü hast $1 ($2).',
-'newmessageslink'         => 'Niee Norechte',
-'newmessagesdifflink'     => "Latztet mol je'endat",
+'retrievedfrom' => 'Von "$1"',
+'youhavenewmessages' => 'Dü hast $1 ($2).',
+'newmessageslink' => 'Niee Norechte',
+'newmessagesdifflink' => "Latztet mol je'endat",
 'youhavenewmessagesmulti' => 'Du hast niee Norechte bie $1',
-'editsection'             => 'Beoabeide',
-'editold'                 => 'endre',
-'editsectionhint'         => 'Aufschnett beoabeide: $1',
-'toc'                     => 'Enhault',
-'showtoc'                 => 'wiese',
-'hidetoc'                 => "fe'stäakje",
-'thisisdeleted'           => '$1 seene ooda wada trajchtmoake?',
-'viewdeleted'             => '$1 wiese?',
-'feed-invalid'            => 'Abonnement-Typ es nich rechtich.',
-'feed-unavailable'        => 'Daut jefft tjeene Feeds',
-'site-rss-feed'           => '$1 RSS-Feed',
-'site-atom-feed'          => '$1 Atom-Feed',
-'page-rss-feed'           => 'RSS Feed fe "$1"',
-'page-atom-feed'          => 'Atom-Feed fe "$1"',
-'feed-atom'               => 'Atom',
-'red-link-title'          => '$1 (Sied noch nich jemoakt)',
+'editsection' => 'Beoabeide',
+'editold' => 'endre',
+'editsectionhint' => 'Aufschnett beoabeide: $1',
+'toc' => 'Enhault',
+'showtoc' => 'wiese',
+'hidetoc' => "fe'stäakje",
+'thisisdeleted' => '$1 seene ooda wada trajchtmoake?',
+'viewdeleted' => '$1 wiese?',
+'feed-invalid' => 'Abonnement-Typ es nich rechtich.',
+'feed-unavailable' => 'Daut jefft tjeene Feeds',
+'site-rss-feed' => '$1 RSS-Feed',
+'site-atom-feed' => '$1 Atom-Feed',
+'page-rss-feed' => 'RSS Feed fe "$1"',
+'page-atom-feed' => 'Atom-Feed fe "$1"',
+'feed-atom' => 'Atom',
+'red-link-title' => '$1 (Sied noch nich jemoakt)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Sied',
-'nstab-user'      => 'Bruckasied',
-'nstab-media'     => 'Media',
-'nstab-special'   => 'Besondre Sied
+'nstab-main' => 'Sied',
+'nstab-user' => 'Bruckasied',
+'nstab-media' => 'Media',
+'nstab-special' => 'Besondre Sied
 Spezial',
-'nstab-project'   => 'Portalsied',
-'nstab-image'     => 'Datei',
+'nstab-project' => 'Portalsied',
+'nstab-image' => 'Datei',
 'nstab-mediawiki' => 'Norejcht',
-'nstab-help'      => 'Helpsied',
-'nstab-category'  => 'Kategorie',
+'nstab-help' => 'Helpsied',
+'nstab-category' => 'Kategorie',
 
 # Main script and global functions
-'nosuchaction'      => 'Soone Aktioon jefft et nich',
-'nosuchactiontext'  => 'Dee Aktioon von dise URL woat von MediaWiki nich unjastett.',
+'nosuchaction' => 'Soone Aktioon jefft et nich',
+'nosuchactiontext' => 'Dee Aktioon von dise URL woat von MediaWiki nich unjastett.',
 'nosuchspecialpage' => 'Soone Spezialsied jefft et nich',
 'nospecialpagetext' => '<strong>Dee oppjeroopde Spezialsied jefft et nich.</strong>
 
 Aula bruckboare Spezialsiede send bie [[Special:SpecialPages|{{int:specialpages}}]] to finje.',
 
 # General errors
-'error'           => 'Fehla',
-'databaseerror'   => 'Fehla enne Dotebank',
-'dberrortext'     => 'Daut gauf een Syntaxfehla biem Opproope vonne Dotebank.
+'error' => 'Fehla',
+'databaseerror' => 'Fehla enne Dotebank',
+'dberrortext' => 'Daut gauf een Syntaxfehla biem Opproope vonne Dotebank.
 Doa kaun een Probleem enne Software senne.
 Daut latzte Opproope vonne Dotebank we:
 <blockquote><tt>$1</tt></blockquote>
 ute Funktioon "<tt>$2</tt>".
 MySQL mald dem Fehla "<tt>$3: $4</tt>".',
 'laggedslavemode' => 'Oppjepausst: Dee jewesne Sied es nich onbedinjt dee latzte Versioon.',
-'readonly'        => 'Dotebank es jeschlote',
+'readonly' => 'Dotebank es jeschlote',
 'enterlockreason' => 'Nan bitte een Grunt doafea, wurom dee Dotebank jeschlote saul en saj, woolang daut onjefea diere saul',
 'missing-article' => 'Dee Database haft nich dem Tatjst von eene Sied jefunge, woone hee haud finje sullt, mettem Nome "$1" $2.
 
@@ -241,27 +241,27 @@ Dit tjemm jeweenlich soo, wan een oola nich jelaschda Link jebruckt worde es.
 
 Wan daut nich soo es, dan es doa vleicht een Fehla enne Software.
 Bitte schriew eene Notiz aun [[Special:ListUsers/sysop|administrator]], en lot dem dee URL weete.',
-'badtitle'        => 'Schlajchta Titel',
+'badtitle' => 'Schlajchta Titel',
 
 # Login and logout pages
-'yourname'                => 'Bruckanome:',
-'yourpassword'            => 'Pauswot:',
+'yourname' => 'Bruckanome:',
+'yourpassword' => 'Pauswot:',
 'nav-login-createaccount' => 'Aunmalde',
-'loginprompt'             => 'Tom Aunmalde motte Cookies bie {{SITENAME}} aktiviet senne.',
-'userlogin'               => 'Aunmalde',
-'logout'                  => 'Rut hia',
-'userlogout'              => 'Rut hia',
-'notloggedin'             => 'Nich aunjemaldt',
-'nologin'                 => "Hast tjeen Bruckakonto? '''$1'''.",
-'nologinlink'             => 'Nieet Bruckakonto moake',
-'createaccount'           => 'Bruckakonto moake',
-'gotaccount'              => "Hast aul een Bruckakonto? '''$1'''.",
-'gotaccountlink'          => 'Aunmalde',
-'createaccountmail'       => 'Ewa Email',
-'badretype'               => 'Dee beid Pauswed stemme nich ewaeen.',
-'userexists'              => 'Dem Bruckanome haft aul wea.
+'loginprompt' => 'Tom Aunmalde motte Cookies bie {{SITENAME}} aktiviet senne.',
+'userlogin' => 'Aunmalde',
+'logout' => 'Rut hia',
+'userlogout' => 'Rut hia',
+'notloggedin' => 'Nich aunjemaldt',
+'nologin' => "Hast tjeen Bruckakonto? '''$1'''.",
+'nologinlink' => 'Nieet Bruckakonto moake',
+'createaccount' => 'Bruckakonto moake',
+'gotaccount' => "Hast aul een Bruckakonto? '''$1'''.",
+'gotaccountlink' => 'Aunmalde',
+'createaccountmail' => 'Ewa Email',
+'badretype' => 'Dee beid Pauswed stemme nich ewaeen.',
+'userexists' => 'Dem Bruckanome haft aul wea.
 Bitte nemm eenen aundren.',
-'loginlanguagelabel'      => 'Sproak: $1',
+'loginlanguagelabel' => 'Sproak: $1',
 
 # Special:PasswordReset
 'passwordreset-username' => 'Bruckernome:',
@@ -270,32 +270,32 @@ Bitte nemm eenen aundren.',
 'media_tip' => 'Datei-Link',
 
 # Edit pages
-'summary'              => 'Toofotinj:',
-'subject'              => 'Teema:',
-'minoredit'            => 'Dit es eene tjliene Endanis.',
-'watchthis'            => 'Paus op dise Sied op',
-'savearticle'          => 'Sied bewoare',
-'preview'              => 'Preview',
-'showpreview'          => 'Wies Preview',
-'showlivepreview'      => 'Live-Preview',
-'showdiff'             => 'Endanisse wiese',
-'anoneditwarning'      => "'''Paus opp:''' Du best nich aunjemaldt. Diene IP-Adras woat enne Versioonsjeschicht oppbewoat en es emma to seene.",
-'missingsummary'       => "'''Dentj draun:''' Du hast tjeene Toopfotinj jemoakt. Wan du wada opp Bewoare klickst, woat diene Endanis ohne Toopfotinj ewanohme.",
-'missingcommenttext'   => 'Bitte schriew eene korte Toopfotinj.',
+'summary' => 'Toofotinj:',
+'subject' => 'Teema:',
+'minoredit' => 'Dit es eene tjliene Endanis.',
+'watchthis' => 'Paus op dise Sied op',
+'savearticle' => 'Sied bewoare',
+'preview' => 'Preview',
+'showpreview' => 'Wies Preview',
+'showlivepreview' => 'Live-Preview',
+'showdiff' => 'Endanisse wiese',
+'anoneditwarning' => "'''Paus opp:''' Du best nich aunjemaldt. Diene IP-Adras woat enne Versioonsjeschicht oppbewoat en es emma to seene.",
+'missingsummary' => "'''Dentj draun:''' Du hast tjeene Toopfotinj jemoakt. Wan du wada opp Bewoare klickst, woat diene Endanis ohne Toopfotinj ewanohme.",
+'missingcommenttext' => 'Bitte schriew eene korte Toopfotinj.',
 'missingcommentheader' => "'''Dentj draun:''' Du hast tjeen Teema em Plautz \"Teema\" jeschrewe. Wan du wada opp Sied Bewoare klickst, woat diene Oabeit ohne Teema bewoat.",
-'summary-preview'      => 'Toopfotinj-Preview:',
-'subject-preview'      => 'Teema-Preview:',
-'blockedtitle'         => 'Dis Brucka es jeblockt.',
-'newarticle'           => '(Nie)',
-'template-protected'   => "(be'schutst)",
+'summary-preview' => 'Toopfotinj-Preview:',
+'subject-preview' => 'Teema-Preview:',
+'blockedtitle' => 'Dis Brucka es jeblockt.',
+'newarticle' => '(Nie)',
+'template-protected' => "(be'schutst)",
 
 # History pages
-'revisionasof'  => 'Versioon von $1',
+'revisionasof' => 'Versioon von $1',
 'revision-info' => 'Versioon von $1 von $2',
-'cur'           => 'dise',
-'last'          => 'latste',
-'page_first'    => 'easchte',
-'page_last'     => 'latste',
+'cur' => 'dise',
+'last' => 'latste',
+'page_first' => 'easchte',
+'page_last' => 'latste',
 
 # Revision feed
 'history-feed-item-nocomment' => '$1 omm $2',
@@ -304,79 +304,77 @@ Bitte nemm eenen aundren.',
 'rev-delundel' => 'wies/vestopp',
 
 # Diffs
-'lineno'   => 'Lien $1:',
+'lineno' => 'Lien $1:',
 'editundo' => 'trigjsate',
 
 # Search results
-'searchresults'             => 'Setj Resultaute',
-'searchresults-title'       => 'Setj Resultaute fe "$1"',
-'searchsubtitle'            => 'Du sochst \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|all pages starting with "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|all pages that link to "$1"]])',
-'prevn'                     => '{{PLURAL:$1|$1}} ferhäa',
-'nextn'                     => 'näakjste {{PLURAL:$1|$1}}',
-'viewprevnext'              => 'Tjitj ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url'            => 'Help:Enhault',
-'search-result-size'        => '$1 ({{PLURAL:$2|1 Wot|$2 Wed}})',
-'search-mwsuggest-enabled'  => 'mett Veaschlag',
-'search-mwsuggest-disabled' => 'Tjeen Veaschlag',
-'powersearch'               => 'Bätre Sääk',
-'powersearch-legend'        => 'Betret Setje',
-'powersearch-field'         => 'Setj no',
+'searchresults' => 'Setj Resultaute',
+'searchresults-title' => 'Setj Resultaute fe "$1"',
+'searchsubtitle' => 'Du sochst \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|all pages starting with "$1"]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|all pages that link to "$1"]])',
+'prevn' => '{{PLURAL:$1|$1}} ferhäa',
+'nextn' => 'näakjste {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Tjitj ($1 {{int:pipe-separator}} $2) ($3)',
+'searchhelp-url' => 'Help:Enhault',
+'search-result-size' => '$1 ({{PLURAL:$2|1 Wot|$2 Wed}})',
+'powersearch' => 'Bätre Sääk',
+'powersearch-legend' => 'Betret Setje',
+'powersearch-field' => 'Setj no',
 
 # Preferences page
-'preferences'          => 'Ennstalinje',
-'mypreferences'        => 'Miene Ennstalinje',
-'youremail'            => 'Email:',
-'username'             => 'Bruckanome:',
-'uid'                  => 'Brucka-ID:',
+'preferences' => 'Ennstalinje',
+'mypreferences' => 'Miene Ennstalinje',
+'youremail' => 'Email:',
+'username' => 'Bruckanome:',
+'uid' => 'Brucka-ID:',
 'prefs-memberingroups' => 'Mettjliet von {{PLURAL:$1|group|groups}}:',
-'yourrealname'         => 'Ajchta Nome:',
-'yourlanguage'         => 'Sproak:',
+'yourrealname' => 'Ajchta Nome:',
+'yourlanguage' => 'Sproak:',
 
 # Recent changes
-'nchanges'        => '$1 {{PLURAL:$1|Endaniss|Endanisse}}',
-'recentchanges'   => 'Nieste Endanisse',
+'nchanges' => '$1 {{PLURAL:$1|Endaniss|Endanisse}}',
+'recentchanges' => 'Nieste Endanisse',
 'rcshowhideminor' => '$1 kjleene Endanisse',
 'rcshowhideanons' => '$1 nomeloose Bruckasch',
-'rcshowhidemine'  => '$1 miene Endanisse',
-'rclinks'         => 'Wies de latste $1 Endanisse in de latste $2 Doag<br />$3',
-'diff'            => 'Unjascheet',
-'hist'            => 'Jeschicht',
-'hide'            => "Fe'stäakje",
-'show'            => 'Wiese',
+'rcshowhidemine' => '$1 miene Endanisse',
+'rclinks' => 'Wies de latste $1 Endanisse in de latste $2 Doag<br />$3',
+'diff' => 'Unjascheet',
+'hist' => 'Jeschicht',
+'hide' => "Fe'stäakje",
+'show' => 'Wiese',
 'minoreditletter' => 'k',
-'newpageletter'   => 'N',
-'boteditletter'   => 'b',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 
 # Recent changes linked
-'recentchangeslinked'          => 'Endarunge aun velinkte Siede',
-'recentchangeslinked-feed'     => 'Endarunge aun velinkte Siede',
-'recentchangeslinked-toolbox'  => 'Endarunge aun velinkte Siede',
-'recentchangeslinked-title'    => 'Endarunge aun Siede, woone von "$1" velinkt send',
+'recentchangeslinked' => 'Endarunge aun velinkte Siede',
+'recentchangeslinked-feed' => 'Endarunge aun velinkte Siede',
+'recentchangeslinked-toolbox' => 'Endarunge aun velinkte Siede',
+'recentchangeslinked-title' => 'Endarunge aun Siede, woone von "$1" velinkt send',
 'recentchangeslinked-noresult' => 'Em utjesochten Tietrum es aun dee velinkte Siede nuscht aundasch jemoakt worde.',
-'recentchangeslinked-summary'  => "Dit es eene List mette latzte Endarunge aune velinkte Siede (ooda bie Kategorien von Mettjlieda von dise Kategorie). Dee Siede opp diene [[Special:Watchlist|your watchlist]] woare '''fat''' jewese.",
-'recentchangeslinked-page'     => 'Siednome:',
-'recentchangeslinked-to'       => 'Wies Endarunge opp Siede, woone mett dise Sied velinkt send',
+'recentchangeslinked-summary' => "Dit es eene List mette latzte Endarunge aune velinkte Siede (ooda bie Kategorien von Mettjlieda von dise Kategorie). Dee Siede opp diene [[Special:Watchlist|your watchlist]] woare '''fat''' jewese.",
+'recentchangeslinked-page' => 'Siednome:',
+'recentchangeslinked-to' => 'Wies Endarunge opp Siede, woone mett dise Sied velinkt send',
 
 # Upload
-'upload'                     => 'Nopplode',
-'uploadbtn'                  => 'Datei nopplode',
-'reuploaddesc'               => 'Stopp Nopplode en tridj no dee Nopplode-Sied',
-'uploadnologin'              => 'Nich aunjemaldt',
-'uploadnologintext'          => 'Du mottst [[Special:UserLogin|aunjemaldt senne]], wan Dateie nopplode wellst.',
-'upload_directory_missing'   => 'Dee Nopplode-Vetetjnis ($1) fehlt en kunn vom Webserver nich jemoakt woare.',
+'upload' => 'Nopplode',
+'uploadbtn' => 'Datei nopplode',
+'reuploaddesc' => 'Stopp Nopplode en tridj no dee Nopplode-Sied',
+'uploadnologin' => 'Nich aunjemaldt',
+'uploadnologintext' => 'Du mottst [[Special:UserLogin|aunjemaldt senne]], wan Dateie nopplode wellst.',
+'upload_directory_missing' => 'Dee Nopplode-Vetetjnis ($1) fehlt en kunn vom Webserver nich jemoakt woare.',
 'upload_directory_read_only' => 'Dee Webserver haft tjeene Schriewrajchte fe daut Nopplode-Vetetjnis ($1).',
-'uploaderror'                => 'Fehla biem Nopplode',
+'uploaderror' => 'Fehla biem Nopplode',
 
 # Special:ListFiles
 'listfiles_user' => 'Brucker',
 
 # File description page
-'file-anchor-link'    => 'Datei',
-'filehist'            => 'Dokument-Jeschicht',
-'filehist-datetime'   => 'Tiet',
-'filehist-user'       => 'Brucker',
+'file-anchor-link' => 'Datei',
+'filehist' => 'Dokument-Jeschicht',
+'filehist-datetime' => 'Tiet',
+'filehist-user' => 'Brucker',
 'filehist-dimensions' => 'Moten',
-'imagelinks'          => 'Links',
+'imagelinks' => 'Links',
 
 # MIME search
 'mimesearch' => 'MIME-Säkj',
@@ -395,87 +393,87 @@ Bitte nemm eenen aundren.',
 'brokenredirects' => "Ka'put Wiedawiesinj",
 
 # Miscellaneous special pages
-'nbytes'            => '$1 {{PLURAL:$1|Byte|Bytes}}',
-'nlinks'            => '$1 {{PLURAL:$1|Link|Links}}',
-'wantedpages'       => 'Needijche Siede',
-'shortpages'        => 'Korte Siede',
-'longpages'         => 'Lange Siede',
-'protectedpages'    => "Be'schutste Siede",
-'newpages'          => 'Nie Siede',
+'nbytes' => '$1 {{PLURAL:$1|Byte|Bytes}}',
+'nlinks' => '$1 {{PLURAL:$1|Link|Links}}',
+'wantedpages' => 'Needijche Siede',
+'shortpages' => 'Korte Siede',
+'longpages' => 'Lange Siede',
+'protectedpages' => "Be'schutste Siede",
+'newpages' => 'Nie Siede',
 'newpages-username' => 'Bruckernome:',
-'ancientpages'      => 'Ellste Siede',
+'ancientpages' => 'Ellste Siede',
 
 # Special:Log
-'specialloguserlabel'  => 'Brucker:',
+'specialloguserlabel' => 'Brucker:',
 'speciallogtitlelabel' => 'Tietel:',
-'all-logs-page'        => 'Aule Berejchte',
+'all-logs-page' => 'Aule Berejchte',
 
 # Special:AllPages
-'allpages'       => 'Aule Siede',
+'allpages' => 'Aule Siede',
 'alphaindexline' => '$1 bott $2',
-'allpagesfrom'   => 'Wies Siede fonn auf:',
-'allarticles'    => 'Aule Siede',
+'allpagesfrom' => 'Wies Siede fonn auf:',
+'allarticles' => 'Aule Siede',
 
 # Watchlist
-'mywatchlist'   => 'Miene Oppaussied',
-'watch'         => 'Oppausse',
+'mywatchlist' => 'Miene Oppaussied',
+'watch' => 'Oppausse',
 'watchthispage' => 'Op dise Sied oppausse',
-'unwatch'       => 'Nijch mea oppausse',
+'unwatch' => 'Nijch mea oppausse',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Oppausse...',
+'watching' => 'Oppausse...',
 'unwatching' => 'Nijch mea oppausse......',
 
 # Delete
-'deleteotherreason'     => 'Aundra Grunt:',
+'deleteotherreason' => 'Aundra Grunt:',
 'deletereasonotherlist' => 'Aundre Grunt',
 
 # Rollback
 'rollbacklink' => 'trigj rolle',
 
 # Protect
-'protectexpiry'          => 'Ütgontiet:',
+'protectexpiry' => 'Ütgontiet:',
 'protect-expiry-options' => '2 Stunde:2 hours,1 Dach:1 day,1 Wäakj:1 week,2 Wäakje:2 weeks,1 Moonat:1 month,3 Moonate:3 months,6 Moonate:6 months,1 Joa:1 year,one Enj:infinite',
-'restriction-type'       => "Er'laubniss:",
+'restriction-type' => "Er'laubniss:",
 
 # Namespace form on various pages
-'namespace'      => 'Nomerum:',
+'namespace' => 'Nomerum:',
 'blanknamespace' => '(Haupt)',
 
 # Contributions
 'mycontris' => 'Mien Biedroage',
-'uctop'     => '(bowe)',
-'month'     => 'Fonn Moonat (onn ferdäm):',
-'year'      => 'Fonn Joa (onn ferdäm):',
+'uctop' => '(bowe)',
+'month' => 'Fonn Moonat (onn ferdäm):',
+'year' => 'Fonn Joa (onn ferdäm):',
 
 'sp-contributions-talk' => 'Beredsied',
 
 # What links here
-'whatlinkshere'       => 'Links opp dise Sied',
+'whatlinkshere' => 'Links opp dise Sied',
 'whatlinkshere-title' => 'Siede, woone opp "$1" eenen Link habe',
-'whatlinkshere-page'  => 'Sied:',
-'linkshere'           => "Dee neachste Siede habe eenen Link opp '''[[:$1]]''':",
-'nolinkshere'         => "Tjeene Sied haft eenen Link opp '''[[:$1]]'''.",
-'nolinkshere-ns'      => "Tjeene Siede habe eenen Link opp '''[[:$1]]''' em utjesochten Nomesrum.",
-'isredirect'          => 'Wiedaleid-Sied',
-'istemplate'          => 'Vealoag-Enbinje (Inklusioon)',
-'isimage'             => 'Dotei-Link',
+'whatlinkshere-page' => 'Sied:',
+'linkshere' => "Dee neachste Siede habe eenen Link opp '''[[:$1]]''':",
+'nolinkshere' => "Tjeene Sied haft eenen Link opp '''[[:$1]]'''.",
+'nolinkshere-ns' => "Tjeene Siede habe eenen Link opp '''[[:$1]]''' em utjesochten Nomesrum.",
+'isredirect' => 'Wiedaleid-Sied',
+'istemplate' => 'Vealoag-Enbinje (Inklusioon)',
+'isimage' => 'Dotei-Link',
 'whatlinkshere-links' => '← Links',
 
 # Block/unblock
-'ipboptions'       => '2 Stunde:2 hours,1 Dach:1 day,3 Doag:3 days,1 Wäakj:1 week,2 Wäakje:2 weeks,1 Moonat:1 month,3 Moonate:3 months,6 Moonate:6 months,1 Joa:1 year,one Enj:infinite',
-'blocklink'        => 'blocke',
-'unblocklink'      => 'frie jewe',
+'ipboptions' => '2 Stunde:2 hours,1 Dach:1 day,3 Doag:3 days,1 Wäakj:1 week,2 Wäakje:2 weeks,1 Moonat:1 month,3 Moonate:3 months,6 Moonate:6 months,1 Joa:1 year,one Enj:infinite',
+'blocklink' => 'blocke',
+'unblocklink' => 'frie jewe',
 'change-blocklink' => 'Daut Blocke endre',
-'contribslink'     => 'Biedrachs',
-'autoblocker'      => 'Automatisch jeblockt, wiels diene IP-Adras soo es aus bie "[[User:$1|$1]]".
+'contribslink' => 'Biedrachs',
+'autoblocker' => 'Automatisch jeblockt, wiels diene IP-Adras soo es aus bie "[[User:$1|$1]]".
 Dee Grunt es: "$2"',
-'blocklogpage'     => 'Block-Logbok',
-'blocklogentry'    => 'haft [[$1]] jeblockt fe dee Tiet $2 $3',
+'blocklogpage' => 'Block-Logbok',
+'blocklogentry' => 'haft [[$1]] jeblockt fe dee Tiet $2 $3',
 'reblock-logentry' => "haft dee Block-Enstalinj fe [[$1]] je'endat fe dee Tiet $2 $3",
 
 # Move page
-'newtitle'   => 'No nie Tietel:',
+'newtitle' => 'No nie Tietel:',
 'move-watch' => 'Opp dise Sied oppausse',
 'movereason' => 'Grunt:',
 'revertmove' => 'trigj dreie',
@@ -487,115 +485,115 @@ Dee Grunt es: "$2"',
 'thumbnail-more' => 'Vejratre',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Diene Bruckersied',
-'tooltip-pt-mytalk'               => 'Diene Beredsied',
-'tooltip-pt-preferences'          => 'Miene Ennstalinje',
-'tooltip-pt-watchlist'            => 'List fonn Siede, op de du oppausst, waut sikj endat',
-'tooltip-pt-mycontris'            => 'List fonn diene Biedroage',
-'tooltip-pt-login'                => 'Aunmalde wudd scheen senne, es oba nich onbedinjt needich.',
-'tooltip-pt-anonlogin'            => 'Aunmalde wudd scheen senne, es oba nich onbedinjt needich.',
-'tooltip-pt-logout'               => 'Rut hia',
-'tooltip-ca-talk'                 => 'Diskussioon ewa dem Ennhault vonne Sied',
-'tooltip-ca-edit'                 => 'Du kaunst dise Sied beoabeide. Bitte verrem Bewoare dee Eschtmolseene-Funktioon brucke.',
-'tooltip-ca-addsection'           => 'Eenen Kommentar to dise Diskussioon biedroage.',
-'tooltip-ca-viewsource'           => 'Dise Sied blifft bewoat. Du kaunst die dem Tjwaltatjst aunseene.',
-'tooltip-ca-history'              => 'Ellre Versioone von dise Sied.',
-'tooltip-ca-protect'              => "Dise Sied be'schutse",
-'tooltip-ca-delete'               => 'Dise Sied lasche',
-'tooltip-ca-undelete'             => 'Moak dee Sied wada soo, aus see verrem Lasche utleet.',
-'tooltip-ca-move'                 => 'Dise Sied veschuwe',
-'tooltip-ca-watch'                => 'Dise Sied bie miene Oppaussied-Liste doatoo doone',
-'tooltip-ca-unwatch'              => 'Dise Sied vonne perseenliche Oppaussied-Liste fot nehme',
-'tooltip-search'                  => 'Setje op {{SITENAME}}',
-'tooltip-search-go'               => 'Go opp dee Sied, woone jenau disem Nome haft',
-'tooltip-search-fulltext'         => 'Setj no Siede mett soonem Tatjst',
-'tooltip-n-mainpage'              => 'Besäkj de Hauptsied',
-'tooltip-n-mainpage-description'  => 'Besetj dee Hauptsied',
-'tooltip-n-portal'                => 'Ewa daut Portal, waut du doone kaunst, woo waut to finje es',
-'tooltip-n-currentevents'         => 'Hinjagruntinformatioone ewa aktuelle Sache finje',
-'tooltip-n-recentchanges'         => 'List mette latste Endanisse em Wiki.',
-'tooltip-n-randompage'            => 'Wies eene toofaulje Sied',
-'tooltip-n-help'                  => 'Helpsied wiese',
-'tooltip-t-whatlinkshere'         => 'List mett aula Siede, woone hia han wiese',
-'tooltip-t-recentchangeslinked'   => 'Latste Endanisse aun Siede, woone mett dise eenen Link habe',
-'tooltip-feed-rss'                => 'RSS-Feed fe dise Sied',
-'tooltip-feed-atom'               => 'Atom-Feed fe dise Sied',
-'tooltip-t-contributions'         => 'List mett Biedroag von disem Brucka wiese',
-'tooltip-t-emailuser'             => 'Eene Email aun disem Brucka schetje',
-'tooltip-t-upload'                => 'Dateie nopplode',
-'tooltip-t-specialpages'          => 'List mett aula Spezialsiede',
-'tooltip-t-print'                 => 'Dretjboare Versioon von dise Sied',
-'tooltip-t-permalink'             => 'Bestendja Link no dise Versioon vonne Sied',
-'tooltip-ca-nstab-main'           => 'Sied-Ennhault wiese',
-'tooltip-ca-nstab-user'           => 'Bruckasied wiese',
-'tooltip-ca-nstab-media'          => 'Mediensied wiese',
-'tooltip-ca-nstab-special'        => "Dit es eene Spezialsied. Dee kaun nich je'endat woare.",
-'tooltip-ca-nstab-project'        => 'Portalsied wiese',
-'tooltip-ca-nstab-image'          => 'Datei-Sied wiese',
-'tooltip-ca-nstab-mediawiki'      => 'Systeem-Tatjst wiese',
-'tooltip-ca-nstab-template'       => 'Vorlage/Template wiese',
-'tooltip-ca-nstab-help'           => 'Helpsied wiese',
-'tooltip-ca-nstab-category'       => 'Kategorie-Sied wiese',
-'tooltip-minoredit'               => "Dise Ve'endrung aus tjlien markiere",
-'tooltip-save'                    => 'Endarunge bewoare',
-'tooltip-preview'                 => 'Verut-Aunsecht vonne Endarunge aun dise Sied. Bitte verrem Bewoare brucke!',
-'tooltip-diff'                    => 'Endarunge aum Tajst wiese',
+'tooltip-pt-userpage' => 'Diene Bruckersied',
+'tooltip-pt-mytalk' => 'Diene Beredsied',
+'tooltip-pt-preferences' => 'Miene Ennstalinje',
+'tooltip-pt-watchlist' => 'List fonn Siede, op de du oppausst, waut sikj endat',
+'tooltip-pt-mycontris' => 'List fonn diene Biedroage',
+'tooltip-pt-login' => 'Aunmalde wudd scheen senne, es oba nich onbedinjt needich.',
+'tooltip-pt-anonlogin' => 'Aunmalde wudd scheen senne, es oba nich onbedinjt needich.',
+'tooltip-pt-logout' => 'Rut hia',
+'tooltip-ca-talk' => 'Diskussioon ewa dem Ennhault vonne Sied',
+'tooltip-ca-edit' => 'Du kaunst dise Sied beoabeide. Bitte verrem Bewoare dee Eschtmolseene-Funktioon brucke.',
+'tooltip-ca-addsection' => 'Eenen Kommentar to dise Diskussioon biedroage.',
+'tooltip-ca-viewsource' => 'Dise Sied blifft bewoat. Du kaunst die dem Tjwaltatjst aunseene.',
+'tooltip-ca-history' => 'Ellre Versioone von dise Sied.',
+'tooltip-ca-protect' => "Dise Sied be'schutse",
+'tooltip-ca-delete' => 'Dise Sied lasche',
+'tooltip-ca-undelete' => 'Moak dee Sied wada soo, aus see verrem Lasche utleet.',
+'tooltip-ca-move' => 'Dise Sied veschuwe',
+'tooltip-ca-watch' => 'Dise Sied bie miene Oppaussied-Liste doatoo doone',
+'tooltip-ca-unwatch' => 'Dise Sied vonne perseenliche Oppaussied-Liste fot nehme',
+'tooltip-search' => 'Setje op {{SITENAME}}',
+'tooltip-search-go' => 'Go opp dee Sied, woone jenau disem Nome haft',
+'tooltip-search-fulltext' => 'Setj no Siede mett soonem Tatjst',
+'tooltip-n-mainpage' => 'Besäkj de Hauptsied',
+'tooltip-n-mainpage-description' => 'Besetj dee Hauptsied',
+'tooltip-n-portal' => 'Ewa daut Portal, waut du doone kaunst, woo waut to finje es',
+'tooltip-n-currentevents' => 'Hinjagruntinformatioone ewa aktuelle Sache finje',
+'tooltip-n-recentchanges' => 'List mette latste Endanisse em Wiki.',
+'tooltip-n-randompage' => 'Wies eene toofaulje Sied',
+'tooltip-n-help' => 'Helpsied wiese',
+'tooltip-t-whatlinkshere' => 'List mett aula Siede, woone hia han wiese',
+'tooltip-t-recentchangeslinked' => 'Latste Endanisse aun Siede, woone mett dise eenen Link habe',
+'tooltip-feed-rss' => 'RSS-Feed fe dise Sied',
+'tooltip-feed-atom' => 'Atom-Feed fe dise Sied',
+'tooltip-t-contributions' => 'List mett Biedroag von disem Brucka wiese',
+'tooltip-t-emailuser' => 'Eene Email aun disem Brucka schetje',
+'tooltip-t-upload' => 'Dateie nopplode',
+'tooltip-t-specialpages' => 'List mett aula Spezialsiede',
+'tooltip-t-print' => 'Dretjboare Versioon von dise Sied',
+'tooltip-t-permalink' => 'Bestendja Link no dise Versioon vonne Sied',
+'tooltip-ca-nstab-main' => 'Sied-Ennhault wiese',
+'tooltip-ca-nstab-user' => 'Bruckasied wiese',
+'tooltip-ca-nstab-media' => 'Mediensied wiese',
+'tooltip-ca-nstab-special' => "Dit es eene Spezialsied. Dee kaun nich je'endat woare.",
+'tooltip-ca-nstab-project' => 'Portalsied wiese',
+'tooltip-ca-nstab-image' => 'Datei-Sied wiese',
+'tooltip-ca-nstab-mediawiki' => 'Systeem-Tatjst wiese',
+'tooltip-ca-nstab-template' => 'Vorlage/Template wiese',
+'tooltip-ca-nstab-help' => 'Helpsied wiese',
+'tooltip-ca-nstab-category' => 'Kategorie-Sied wiese',
+'tooltip-minoredit' => "Dise Ve'endrung aus tjlien markiere",
+'tooltip-save' => 'Endarunge bewoare',
+'tooltip-preview' => 'Verut-Aunsecht vonne Endarunge aun dise Sied. Bitte verrem Bewoare brucke!',
+'tooltip-diff' => 'Endarunge aum Tajst wiese',
 'tooltip-compareselectedversions' => 'Unjascheede wiese tweschen dee beid jewehlde Versioone von dise Sied.',
-'tooltip-watch'                   => 'Doo dise Sied bie diene Oobacht-List doatoo',
-'tooltip-recreate'                => 'Moak dee Sied wada fresh, uck wan se wea jelascht haft.',
-'tooltip-upload'                  => 'Nopplode aunfange',
-'tooltip-rollback'                => '"Rollback" dreit dee Endarung(e) von dise Sied mett eenem Klick wada tridj bettem latsten Biedrach.',
-'tooltip-undo'                    => 'Moakt bloos dise eene Endarung tridj en wiest daut Resultaut en eenem Eschtmolseene-Fensta, doamett enne Toopfotinj een Grunt jenant woare kaun.',
+'tooltip-watch' => 'Doo dise Sied bie diene Oobacht-List doatoo',
+'tooltip-recreate' => 'Moak dee Sied wada fresh, uck wan se wea jelascht haft.',
+'tooltip-upload' => 'Nopplode aunfange',
+'tooltip-rollback' => '"Rollback" dreit dee Endarung(e) von dise Sied mett eenem Klick wada tridj bettem latsten Biedrach.',
+'tooltip-undo' => 'Moakt bloos dise eene Endarung tridj en wiest daut Resultaut en eenem Eschtmolseene-Fensta, doamett enne Toopfotinj een Grunt jenant woare kaun.',
 
 # Stylesheets
-'common.css'      => '/* CSS opp dise Sted woat opp aula Skins wirtje */',
-'standard.css'    => '/* CSS opp dise Sted wirtjt opp dem Standard-Skin */',
-'nostalgia.css'   => '/* CSS opp dise Sted wirtjt opp daut Nostalgia-Skin */',
+'common.css' => '/* CSS opp dise Sted woat opp aula Skins wirtje */',
+'standard.css' => '/* CSS opp dise Sted wirtjt opp dem Standard-Skin */',
+'nostalgia.css' => '/* CSS opp dise Sted wirtjt opp daut Nostalgia-Skin */',
 'cologneblue.css' => '/* CSS opp dise Sted wirtjt opp daut Keloonsch-Blau-Skin */',
-'monobook.css'    => '/* CSS opp dise Sted wirtjt opp daut Monobook-Skin */',
-'myskin.css'      => '/* CSS opp dise Sted wirtjt opp daut MySkin-Skin */',
-'chick.css'       => '/* CSS opp dise Sted wirtjt opp daut Chick-Skin */',
-'simple.css'      => '/* CSS opp dise Sted wirtjt opp daut Simple-Skin */',
-'modern.css'      => '/* CSS opp dise Sted wirtjt opp daut Modern-Skin */',
-'print.css'       => '/* CSS opp dise Sted woat daut Utkome vom Dretje aundasch moake */',
+'monobook.css' => '/* CSS opp dise Sted wirtjt opp daut Monobook-Skin */',
+'myskin.css' => '/* CSS opp dise Sted wirtjt opp daut MySkin-Skin */',
+'chick.css' => '/* CSS opp dise Sted wirtjt opp daut Chick-Skin */',
+'simple.css' => '/* CSS opp dise Sted wirtjt opp daut Simple-Skin */',
+'modern.css' => '/* CSS opp dise Sted wirtjt opp daut Modern-Skin */',
+'print.css' => '/* CSS opp dise Sted woat daut Utkome vom Dretje aundasch moake */',
 
 # Scripts
-'common.js'      => '/* Daut neachste JavaScript woat fe aula Brucka jelode. */',
-'standard.js'    => '/* Daut neachste JavaScript woat fe Brucka mett Standard-Skin jelode. */',
-'nostalgia.js'   => '/* Daut neachste JavaScript woat fe Brucka mett Nostalgie-Skin jelode. */',
+'common.js' => '/* Daut neachste JavaScript woat fe aula Brucka jelode. */',
+'standard.js' => '/* Daut neachste JavaScript woat fe Brucka mett Standard-Skin jelode. */',
+'nostalgia.js' => '/* Daut neachste JavaScript woat fe Brucka mett Nostalgie-Skin jelode. */',
 'cologneblue.js' => '/* Daut neachste JavaScript woat fe Brucka mett Keloonsch-Blau-Skin jelode */',
-'monobook.js'    => '/* Daut neachste JavaScript woat fe Brucka mett Monobook-Skin jelode */',
-'myskin.js'      => '/* Daut neachste JavaScript woat fe Brucka mett MySkin-Skin jelode */',
-'chick.js'       => '/* Daut neachste JavaScript woat fe Brucka mett Chick-Skin jelode */',
-'simple.js'      => '/* Daut neachste JavaScript woat fe Brucka mett Eenfach-Skin jelode */',
-'modern.js'      => '/* Daut neachste JavaScript woat fe Brucka mett Modern-Skin jelode. */',
+'monobook.js' => '/* Daut neachste JavaScript woat fe Brucka mett Monobook-Skin jelode */',
+'myskin.js' => '/* Daut neachste JavaScript woat fe Brucka mett MySkin-Skin jelode */',
+'chick.js' => '/* Daut neachste JavaScript woat fe Brucka mett Chick-Skin jelode */',
+'simple.js' => '/* Daut neachste JavaScript woat fe Brucka mett Eenfach-Skin jelode */',
+'modern.js' => '/* Daut neachste JavaScript woat fe Brucka mett Modern-Skin jelode. */',
 
 # Metadata
 'notacceptable' => 'Dee Wiki-Server kaun dee Dote nich soo reedmoake, daut dien Jereetschauft dee lese kaun.',
 
 # Attribution
-'anonymous'        => 'Onbekaunda Brucka {{PLURAL:$1|user|users}} von {{SITENAME}}',
-'siteuser'         => '{{SITENAME}}-Brucka $1',
+'anonymous' => 'Onbekaunda Brucka {{PLURAL:$1|user|users}} von {{SITENAME}}',
+'siteuser' => '{{SITENAME}}-Brucka $1',
 'lastmodifiedatby' => "Dise Sied word daut latste Mol aum $1, Klock $2 von $3 je'endat.",
-'othercontribs'    => 'Oppe Gruntloag vonne Oabeit von $1.',
-'others'           => 'aundre',
-'siteusers'        => '{{SITENAME}}-{{PLURAL:$2|user|users}} $1',
-'creditspage'      => 'Siede-Informatioone',
-'nocredits'        => 'Fe dise Sied send tjeene Informatioone to habe.',
+'othercontribs' => 'Oppe Gruntloag vonne Oabeit von $1.',
+'others' => 'aundre',
+'siteusers' => '{{SITENAME}}-{{PLURAL:$2|user|users}} $1',
+'creditspage' => 'Siede-Informatioone',
+'nocredits' => 'Fe dise Sied send tjeene Informatioone to habe.',
 
 # Spam protection
 'spamprotectiontitle' => 'Spamschutzfilta',
-'spamprotectiontext'  => 'Dee Sied, woone du bewoare wullst, word vom Spamschutzfilta blockiet.
+'spamprotectiontext' => 'Dee Sied, woone du bewoare wullst, word vom Spamschutzfilta blockiet.
 Daut woat aun eenem Link lidje, woona no eene externe Sied wiest.',
 'spamprotectionmatch' => 'Dee foljenda Tatjst word vom Spamfilta jefunge: $1',
-'spambot_username'    => 'MediaWiki Spam-Uborka (Opprieme)',
-'spam_reverting'      => 'Latste Versioon ohne Links no $1 wada trajcht jemoakt.',
-'spam_blanking'       => 'Aule Versioone haude Links no $1, reed jemoakt',
+'spambot_username' => 'MediaWiki Spam-Uborka (Opprieme)',
+'spam_reverting' => 'Latste Versioon ohne Links no $1 wada trajcht jemoakt.',
+'spam_blanking' => 'Aule Versioone haude Links no $1, reed jemoakt',
 
 # Patrolling
-'markaspatrolleddiff'   => 'Aus kontrolliet markere',
-'markaspatrolledtext'   => 'Dise Sied aus kontrolliet markere',
-'markedaspatrolled'     => 'Aus kontrolliet markiet',
+'markaspatrolleddiff' => 'Aus kontrolliet markere',
+'markaspatrolledtext' => 'Dise Sied aus kontrolliet markere',
+'markedaspatrolled' => 'Aus kontrolliet markiet',
 'markedaspatrolledtext' => 'Dee utjewehlde Sied-Versioon es aus kontrolliet markiet.',
 
 # Bad image list
@@ -609,7 +607,7 @@ Bloos items, woone mett eenem * aunfange, woare jenome. Dee eschta Link no dem *
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'aule',
 'namespacesall' => 'aule',
-'monthsall'     => 'aule',
+'monthsall' => 'aule',
 
 # Special:SpecialPages
 'specialpages' => 'Spezialsiede',
index 4e90283..f408505 100644 (file)
@@ -25,6 +25,20 @@ $messages = array(
 'underline-default' => 'Des nemme, was em Broweser gsaacht hoscht.',
 
 # Dates
+'sunday' => 'Sundaach',
+'monday' => 'Mondaach',
+'tuesday' => 'Dienschdaach',
+'wednesday' => 'Midwoch',
+'thursday' => 'Dunnaschdaach',
+'friday' => 'Fraidaach',
+'saturday' => 'Somschdaach',
+'sun' => 'Su',
+'mon' => 'Mo',
+'tue' => 'Di',
+'wed' => 'Mi',
+'thu' => 'Du',
+'fri' => 'Fr',
+'sat' => 'So',
 'january' => 'Jänner',
 'february' => 'Fewwer',
 'march' => 'März',
@@ -32,7 +46,7 @@ $messages = array(
 'may_long' => 'Mai',
 'june' => 'Juni',
 'july' => 'Juli',
-'august' => 'Auguscht',
+'august' => 'Auguschd',
 'september' => 'Sebdember',
 'october' => 'Ogdower',
 'november' => 'November',
@@ -75,22 +89,28 @@ $messages = array(
 'about' => 'Iwwer',
 'newwindow' => '(werd im e naie Fenschter uffgmacht)',
 'cancel' => 'Abbreche',
-'mytalk' => 'Gebabbel mit dir',
-'navigation' => 'Navigation',
+'mytalk' => 'Dischbediere',
+'navigation' => 'Nawigadzion',
 
 # Cologne Blue skin
 'qbfind' => 'Finne',
 'qbedit' => 'Bearwaide',
 'qbmyoptions' => 'Mai Saide',
+'faq' => 'Ofd gschdeldi Froche',
 
 # Vector skin
+'vector-action-delete' => 'Lesche',
 'vector-action-move' => 'Verschiewe',
+'vector-action-protect' => 'Schitze',
 'vector-view-edit' => 'Bearwaide',
+'vector-view-history' => 'Dadaigschischd',
+'vector-view-view' => 'Lese',
+'actions' => 'Agzione',
 
 'errorpagetitle' => 'Fehler',
 'returnto' => 'Zrick zu $1.',
 'tagline' => 'Vun {{SITENAME}}',
-'help' => 'Hilfe',
+'help' => 'Hilf',
 'search' => 'Suche',
 'searchbutton' => 'Suche',
 'go' => 'Adiggel',
@@ -114,11 +134,11 @@ $messages = array(
 'personaltools' => 'Perseenliche Werkzeische',
 'talk' => 'Dischbediere',
 'views' => 'Wievielmol aageguckt',
-'toolbox' => 'Werkzaich',
-'otherlanguages' => 'In annere Sproche',
+'toolbox' => 'Werkzaisch',
+'otherlanguages' => 'In annere Schbroche',
 'redirectedfrom' => '(Wairrerglaidet vun $1)',
 'redirectpagesub' => 'Wairerlaidungssaid',
-'lastmodifiedat' => 'Die Said isch zum ledschde Mol gänneret woore am $1, am $2.',
+'lastmodifiedat' => 'Die Said isch zum ledschde Mol gänneret worre am $1, am $2.',
 'viewcount' => 'Die Seid isch bis jetzerd {{PLURAL:$1|$1|$1}} mol uffgerufe worre.',
 'jumpto' => 'Spring zu:',
 'jumptonavigation' => 'Navigation',
@@ -129,7 +149,8 @@ $messages = array(
 'aboutpage' => 'Project:Iwwer',
 'copyright' => 'Was do drin schdeht isch unner $1 verfiechbar.',
 'copyrightpage' => '{{ns:project}}:Urhewerrecht',
-'currentevents' => 'Was grad so bassiert isch',
+'currentevents' => 'Was grad so bassierd isch',
+'currentevents-url' => 'Project: Leschdi Eraigniss',
 'disclaimers' => 'Hafdungsausschluß',
 'disclaimerpage' => 'Project:Impressum',
 'edithelp' => 'Hilf fer s Bearwaide',
@@ -138,7 +159,7 @@ $messages = array(
 'mainpage' => 'Hääptsaid',
 'mainpage-description' => 'Startseid',
 'portal' => '{{SITENAME}}-Pordal',
-'privacy' => 'Dadeschutz',
+'privacy' => 'Dadeschuds',
 'privacypage' => 'Project:Daadeschutz',
 
 'badaccess' => 'Kää ausraichende Recht',
@@ -151,7 +172,7 @@ $messages = array(
 'editold' => 'bearwaide',
 'editlink' => 'bearwaide',
 'viewsourcelink' => 'Quell aagucke',
-'editsectionhint' => 'Abschnitt ännere: $1',
+'editsectionhint' => 'Abschnidd ännere: $1',
 'toc' => 'Inhald',
 'showtoc' => 'zaiche',
 'hidetoc' => 'versteggeln',
@@ -159,7 +180,7 @@ $messages = array(
 'site-atom-feed' => '$1 Atom Feed',
 'page-rss-feed' => '"$1" RSS Feed',
 'page-atom-feed' => '"$1" Atom Feed',
-'red-link-title' => '$1 (Said gebbs nid)',
+'red-link-title' => '$1 (Said gebbds nid)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Said',
@@ -174,13 +195,14 @@ $messages = array(
 'nstab-category' => 'Kadegorie',
 
 # General errors
-'missing-article' => 'De Text fer „$1“ $2 isch in de Datebank nit gfunne worre.
+'missing-article' => "De Text fer „$1“ $2 isch inde Daadebong'g nit gfunne worre.
 
-Normalerwais hääßt des, dass die Said glescht woore isch.
+Normalerwais hääßd des, dass die Said gleschd worre isch.
 
-Wenn s des nit isch, hoscht villaicht en Fehler in de Datebank gfunne.
-Bitte meld des an e [[Special:ListUsers/sysop|Adminischtrator]], un gebb d URL dezu aa.',
+Wenns des nit isch, hoschd villaischd en Fehler in de Daadebong'g gfunne.
+Bidde meldsm [[Special:ListUsers/sysop|Adminischdrador]], un gebb d URL dezu aa.",
 'missingarticle-rev' => '(Versionsnummer#: $1)',
+'badtitle' => 'Schleschde Didl',
 'badtitletext' => 'De Titel vun de aageforderte Said isch nid giltich, leer, odder e nid giltiche Link vun eme annere Wiki.
 S kann sai, dass es ää odder meh Zaiche drin hot, wu im Titel vun de Said nid gebraucht werre därfe.',
 'viewsource' => 'Quelltekschd betrachde',
@@ -212,7 +234,7 @@ S kann sai, dass es ää odder meh Zaiche drin hot, wu im Titel vun de Said nid
 'nowiki_tip' => 'Wiki-Formatierunge ignoriere',
 'image_tip' => 'Bildverwais',
 'media_tip' => 'Dateilink',
-'sig_tip' => 'Dai Unnerschrift mit ener Zaitaagab',
+'sig_tip' => 'Dai Unnerschrifd mid ener Zaidaagab',
 'hr_tip' => 'Horizontale Linie (sparsam verwenne)',
 
 # Edit pages
@@ -249,11 +271,11 @@ du gebbscht do au zu, dass Du des selwerscht gschriwwe hoscht orrer vun ere effe
 'template-semiprotected' => '(halb-gschitzt)',
 '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.
+'moveddeleted-notice' => 'Die Said isch gleschd worre.
 De Leschaidrach fa die Said isch do unne als Kwell aagewwe.',
 
 # History pages
-'viewpagelogs' => 'D Lochbiecher fer die Said aagucke',
+'viewpagelogs' => 'Lochbicher fer die Said aagucke',
 'currentrev-asof' => 'Aktuelle Version vun $1',
 'revisionasof' => 'Version vun $1',
 'previousrevision' => '← Ältere Versione',
@@ -275,7 +297,9 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'revdelete-radio-set' => 'Ja',
 'revdelete-radio-unset' => 'Nä',
 'revdelete-submit' => 'Uff die aussgewählt {{PLURAL:$1|Version|Versione}} owende',
-'revdel-restore' => 'Sichtbarkeit ännere',
+'revdel-restore' => 'Sischdbakaid ännere',
+'revdel-restore-deleted' => 'gleschdi Änarunge',
+'revdel-restore-visible' => 'sischdbari Änarunge',
 
 # Merge log
 'revertmerge' => 'Zammefiehrung rickgängich mache',
@@ -296,6 +320,8 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'notextmatches' => 'Kää Iwwerainstimmunge mit Inhalde',
 'prevn' => 'voriche {{PLURAL:$1|$1}}',
 'nextn' => 'negschte {{PLURAL:$1|$1}}',
+'prevn-title' => 'Frijari $1 {{PLURAL:$1|result|Ergewnis}}',
+'nextn-title' => 'Negschdi $1 {{PLURAL:$1|result|Ergewnis}}',
 'viewprevnext' => 'Gugg ($1 {{int:pipe-separator}} $2) ($3)',
 'searchprofile-everything' => 'Alles',
 'search-result-size' => '$1 ({{PLURAL:$2|1 Word|$2 Wärder}})',
@@ -305,8 +331,6 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'search-interwiki-caption' => 'Schweschterprojekt',
 'search-interwiki-default' => '$1 Ergebnis:',
 'search-interwiki-more' => '(meh)',
-'search-mwsuggest-enabled' => 'mid Vorschläch',
-'search-mwsuggest-disabled' => 'kää Vorschläch',
 'nonefound' => "'''Hiiwais:''' S werre standardmäßich numme e Dail Namensraim durchsucht. Setz ''all:'' vor Dai Suchbegriff zum alle Saide (mit Dischbediersaide, Voalaache usw.) durchsuche odder direkt de Name vum Namensraum, wu durchsucht werre sell.",
 'powersearch' => 'Erwaiterte Such',
 'powersearch-legend' => 'Erwaiterte Such',
@@ -320,7 +344,7 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 
 # Preferences page
 'preferences' => 'Optione',
-'mypreferences' => 'Mai Aistellunge',
+'mypreferences' => 'Oistellunge',
 'saveprefs' => 'Oischdellunge schbeichere',
 'resetprefs' => 'Oischdellunge verwerfe',
 'guesstimezone' => 'Aus em Browser iwwernemme',
@@ -348,11 +372,12 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|Ännerung|Ännerunge}}',
-'recentchanges' => 'Was zuletschd gemacht worre isch',
+'recentchanges' => 'Was zuletschd gemachd worre isch',
 'recentchanges-legend' => 'Optione vun de Aazaich',
 'recentchanges-feed-description' => 'Di letschte Ännerunge vun {{SITENAME}} in des Feed aigewwe.',
+'recentchanges-label-minor' => "S'ische glänni Beawaidung",
 'rcnote' => "Aagezaicht {{PLURAL:$1|werd '''1''' Ännerung|werre die letschte '''$1''' Ännerunge}} {{PLURAL:$2|vum letschte Dach|in de letschte '''$2''' Dache}} (Stand: $4, $5)",
-'rclistfrom' => 'Zeich die letschte Ännerunge ab $1',
+'rclistfrom' => 'Zeich die ledschde Ännerunge ab $1',
 'rcshowhideminor' => 'Klenne Ännerunge $1',
 'rcshowhidebots' => 'Bots $1',
 'rcshowhideliu' => 'Aagemeldte Benutzer $1',
@@ -361,13 +386,13 @@ Erklärung: '''({{int:cur}})''' = Unnerschied zu jetzert,
 'rclinks' => 'Zeich die letschte $1 Ännerunge in de letschte $2 Dache<br />$3',
 'diff' => 'Unnerschied',
 'hist' => 'Gschicht',
-'hide' => 'versteggeln',
-'show' => 'zaiche',
+'hide' => 'vaschdeggle',
+'show' => 'zaische',
 'minoreditletter' => 'k',
 'newpageletter' => 'N',
 'boteditletter' => 'B',
 'rc-enhanced-expand' => "Details zaische (dodezu braucht's JavaScript)",
-'rc-enhanced-hide' => 'Details versteckeln',
+'rc-enhanced-hide' => 'Dedails versdeckle',
 
 # Recent changes linked
 'recentchangeslinked' => 'Was on verlinkde Saide gemacht worre isch',
@@ -380,9 +405,10 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 'recentchangeslinked-to' => 'Zaisch Ännerunge uff Saide, wu do her verlinkt sinn',
 
 # Upload
-'upload' => 'Hochlade',
+'upload' => 'Nufflade',
 'uploadbtn' => 'Datei hochlade',
 'uploadlogpage' => 'Dateie-Logbuch',
+'filedesc' => 'Zommefassung',
 'savefile' => 'Datei schbeichere',
 'uploadedimage' => 'hot „[[$1]]“ hochglade',
 
@@ -398,14 +424,15 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 'file-anchor-link' => 'Datei',
 'filehist' => 'Dateigschicht',
 'filehist-help' => 'Drick uff e Zaidpunkt zum aazääche, wie s dort ausgsähne hot.',
+'filehist-revert' => 'zuriggsedze',
 'filehist-current' => 'aktuell',
-'filehist-datetime' => 'Zaidpunkt',
+'filehist-datetime' => 'Zaidpungd',
 'filehist-thumb' => 'Vorschaubild',
 'filehist-thumbtext' => 'Vorschaubild fer Version vum $1',
 'filehist-user' => 'Benutzer',
 'filehist-dimensions' => 'Moß',
 'filehist-comment' => 'Kommentar',
-'imagelinks' => 'Dateilinks',
+'imagelinks' => 'Dadaivawendung',
 'linkstoimage' => 'Die {{PLURAL:$1|Said verwaist|$1 Saire verwaise}} uff die Datei:',
 'sharedupload' => 'Die Datei isch vun $1 un s kann sai, dass se ach vun annere Projekt gebraucht werd.',
 'uploadnewversion-linktext' => 'E naiere Version vun derre Datei hochlade',
@@ -433,12 +460,12 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 'pager-older-n' => '{{PLURAL:$1|vorich 1|voriche $1}}',
 
 # Book sources
-'booksources' => 'Buchquelle',
+'booksources' => 'Buchqwelle',
 'booksources-search-legend' => 'No Buchquelle suche',
 'booksources-go' => 'Geh',
 
 # Special:Log
-'log' => 'Logbiecher',
+'log' => 'Logbicher',
 
 # Special:AllPages
 'allpages' => 'Alle Saide',
@@ -466,7 +493,7 @@ Saide uff [[Special:Watchlist|Dainer Beowachdungslischt]] sin '''fett'''.",
 
 # Watchlist
 'watchlist' => 'Beowachdungslischd',
-'mywatchlist' => 'Mai Beowachdungslischd',
+'mywatchlist' => 'Beowachdungslischd',
 'addedwatchtext' => "Die Said \"[[:\$1]]\" isch zu Dainer [[Special:Watchlist|Beowachdungslischt]] zugefiecht worre.
 Zukimftiche Ännerunge an derre Said un de Dischbediersaid, wu dezu ghert, werre doo aagezaicht, un d Said werd '''fett''' aagezaicht in de [[Special:RecentChanges|Letschte Ännerunge]] fer dass es ääfacher isch zum finne.",
 'removedwatchtext' => 'D Said "[[:$1]]" isch aus [[Special:Watchlist|Dainer Beowachdungslischt]] rausgenumme worre.',
@@ -489,7 +516,7 @@ Zukimftiche Ännerunge an derre Said un de Dischbediersaid, wu dezu ghert, werre
 'delete-legend' => 'Lesche',
 'confirmdeletetext' => 'Du bisch debai e Said z lesche mid alle Versione.
 Bitte du bstätiche, dass Du des wllscht du, dass Du verstehsch, was des hääßt, un dass Du des machscht in Iwweraistimmung mit de [[{{MediaWiki:Policy-url}}|Richtline]].',
-'actioncomplete' => 'Aktion fertich',
+'actioncomplete' => 'Agtion ferdisch',
 'deletedtext' => '"$1" isch gelescht worre.
 Guck $2 fer e Lischt vun de letschte Leschunge.',
 'dellogpage' => 'Leschlogbuch',
@@ -532,6 +559,7 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
 'undelete' => 'Widderherschdelle',
 'undeletebtn' => 'Widderherschdelle',
 'undeletelink' => 'aagucke/wirrer herstelle',
+'undeleteviewlink' => 'Ogugge',
 'undeletereset' => 'Zuricksetze',
 'undelete-show-file-submit' => 'Ja',
 
@@ -543,7 +571,7 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
 # Contributions
 'contributions' => 'Was der gemacht hot',
 'contributions-title' => 'Benutzerbaidräch vun $1',
-'mycontris' => 'Was isch gemacht hab',
+'mycontris' => 'Baidräsch',
 'contribsub2' => 'Fer $1 ($2)',
 'uctop' => '(aktuell)',
 'month' => 'un Monet (un frieher):',
@@ -563,7 +591,7 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
 'linkshere' => "Die Saide verlinke zu '''[[:$1]]''':",
 'isredirect' => 'Wairerlaitungsaid',
 'istemplate' => 'Vorlacheaibindung',
-'isimage' => 'Bildlink',
+'isimage' => "Dadailing'g",
 'whatlinkshere-prev' => '{{PLURAL:$1|vorich|voriche $1}}',
 'whatlinkshere-next' => '{{PLURAL:$1|negscht|negschte $1}}',
 'whatlinkshere-links' => '← Links',
@@ -577,9 +605,9 @@ Der Schutzstatus vun derre Said kannscht ännere, awwer des hot kää Aifluss uf
 'ipbsubmit' => 'Benutzer bloggiere',
 'ipboptions' => '2 Stunne:2 hours,1 Dach:1 day,3 Dache:3 days,1 Woch:1 week,2 Woche:2 weeks,1 Monet:1 month,3 Monet:3 months,6 Monet:6 months,1 Johr:1 year,Fer immer:infinite',
 'ipusubmit' => 'Die Adreß freigewwe',
-'ipblocklist' => 'Gsperrte IP-Adresse un Benutzername',
+'ipblocklist' => 'Gschberrdi IP-Adress un Benudzernome',
 'blocklink' => 'sperre',
-'unblocklink' => 'Sperr uffhewwe',
+'unblocklink' => 'Sperr uffhewe',
 'change-blocklink' => 'Sperr ännere',
 'contribslink' => 'Baidräch',
 'blocklogpage' => 'Sperrlogbuch',
@@ -648,8 +676,8 @@ Bitte duu se vun Hand zammefiehre.'''",
 'tooltip-pt-login' => 'Du kannscht Dich aamelde, awwer du muscht s nit',
 'tooltip-pt-logout' => 'Abmelde',
 'tooltip-ca-talk' => 'Iwwer d Inhaltssaid dischbediere',
-'tooltip-ca-edit' => 'Du kannscht die Said bearwaide.
-Bitte brauch de Vorschau-Knopp vor em Schbaichere',
+'tooltip-ca-edit' => 'Du kannschd die Said bearwaide.
+Bidde nemmde Vorschau-Knobb vorm Schbaischere',
 'tooltip-ca-addsection' => 'E naie Abschnitt aaleche',
 'tooltip-ca-viewsource' => 'Die Said isch gschitzt.
 Du kannscht awwer de Quelltext aagucke',
@@ -660,24 +688,24 @@ Du kannscht awwer de Quelltext aagucke',
 'tooltip-ca-watch' => 'Die Said zu Dainere Beowachdungslischt zufieche',
 'tooltip-ca-unwatch' => 'Die Said aus Dainer Beowachdunschlischde rausnemme',
 'tooltip-search' => 'Durchsuch {{SITENAME}}',
-'tooltip-search-go' => 'Geh zu ere Said mit genää dem Namme, wenn s se gebbt',
-'tooltip-search-fulltext' => 'Such in de Said noch dem Text',
+'tooltip-search-go' => 'Geh zu ere Said mid genää dem Namme, wenn s se gebbt',
+'tooltip-search-fulltext' => 'Such in de Said nochm Tegschd',
 'tooltip-p-logo' => 'Haubdsaid',
 'tooltip-n-mainpage' => 'Uff d Hääptsaid geh',
 'tooltip-n-mainpage-description' => 'Haubdsaid aagucke',
-'tooltip-n-portal' => 'Iwwer s Projekt, was de duu kannscht, wo de ebbes finnscht',
+'tooltip-n-portal' => 'Iwwers Brojegd, wude duu kannschd, wu ebbes finne duschd',
 'tooltip-n-currentevents' => 'hinnergundsinformatione finne iwwer naie Eraichnis',
-'tooltip-n-recentchanges' => 'D Lischt vun de letschte Ännerunge in dem Wiki',
+'tooltip-n-recentchanges' => 'D Lischd vun de ledschde Ännerunge in dem Wiki',
 'tooltip-n-randompage' => 'E zufälliche Said lade',
 'tooltip-n-help' => 'De Ort zum rausfinne',
-'tooltip-t-whatlinkshere' => 'Lischt vun alle Wikisaide, wo do her verlinkt sin',
-'tooltip-t-recentchangeslinked' => 'Letschte Ännerunge in Saide, wu vun do verlinkt sin',
+'tooltip-t-whatlinkshere' => 'Lischt vun alle Wikisaide, wu do her verlinkt sinn',
+'tooltip-t-recentchangeslinked' => 'Letschde Ännerunge in Saide, wu vun do verlinkt sin',
 'tooltip-feed-rss' => 'RSS feed fer die Said',
 'tooltip-feed-atom' => 'Atom feed fer die Said',
-'tooltip-t-contributions' => 'Die letschte Baidräch vun däm Benutzer aagucke',
+'tooltip-t-contributions' => 'Die ledschde Baidräch vun däm Benudzer aagucke',
 'tooltip-t-emailuser' => 'Dem Benutzer e E-Mail schicke',
-'tooltip-t-upload' => 'Dateie nuflade',
-'tooltip-t-specialpages' => 'Lischt vun alle Spezialsaide',
+'tooltip-t-upload' => 'Dateije nufflade',
+'tooltip-t-specialpages' => 'Lischd vun alle Schbezialsaide',
 'tooltip-t-print' => 'Druckversion vun derre Said',
 'tooltip-t-permalink' => 'E dauerhafte Link zu derre Version vun de Said',
 'tooltip-ca-nstab-main' => 'D Inhaldssaid aagucke',
@@ -693,7 +721,7 @@ Du kannscht awwer de Quelltext aagucke',
 'tooltip-diff' => 'Guck, welle Ännerunge Du im Text gmacht hoscht',
 'tooltip-compareselectedversions' => 'D Unnerschied zwische denne zwai ausgwehlte Versione aagucke',
 'tooltip-watch' => 'Die Said zu Dainer Beowachdunglischd zufieche',
-'tooltip-rollback' => '„Zericksetze“ maxcht alle Bearwaidunge vum letschte Bearwaider rickgängich',
+'tooltip-rollback' => '„Zericksetze“ machd alle Bearwaidunge vum letschte Bearwaider rickgängich',
 'tooltip-undo' => '„Zerick“ macht numme die Ännerung rickgängich un zaicht d Vorschau aa.
 Du kannscht e Grund in dr Zammfassung aagewwe',
 
@@ -712,20 +740,20 @@ Du kannscht e Grund in dr Zammfassung aagewwe',
 'ilsubmit' => 'Such',
 
 # Bad image list
-'bad_image_list' => 'Format:
+'bad_image_list' => 'Formad:
 
-nur Zaile, die wu mit eme * aafange werre bericksichticht.
-De erscht Link muss e Link zu ere unerwinschte Datei sai.
-Annere Links in der glaiche Zail werre als Ausnahme behannelt, d. h. Saide, wu d Datei drin vorkumme därft.',
+nur Zaile, wu mid eme * aafange werre bericksichdischd.
+De erschd Link muss e Link zu ere unerwinschd Dadei sai.
+Annere Links in der glaiche Zail werre als Ausnahme behanneld, d. h. Saide, wu d Dadei drin vorkumme därfd.',
 
 # Metadata
 'metadata' => 'Metadata',
-'metadata-help' => 'Die Datei hot waitere Informatione, wahrschainlich vun de Digitalkamera oder vum Scanner, mit dem wu sie gmacht worre sinn.
-Wenn die Datei verännert worre isch, dann kann s sai, dass die zusätzlich Information fer die verännert Datei nimmi richtich isch.',
+'metadata-help' => 'Die Dadei hot waidere Informatione, wahrschainlich vun de Digidalkamera oder vum Scanner, mid dem wu sie gmacht worre sinn.
+Wenn die Dadei verännerd worre isch, dann kann s sai, dass die zusädzlich Information fer die verännert Dadei nimmi richdisch isch.',
 'metadata-expand' => 'Erwaiterte Details aazaiche',
 'metadata-collapse' => 'Erwaiterte Details versteckeln',
-'metadata-fields' => 'Die EXIF-Metadate werre in de Bild-Bschraiwung ach aagezeicht, wenn d Metadate-Tabelle versteckelt isch.
-Annere Metadate sinn standardmäßig versteckelt.
+'metadata-fields' => 'Die EXIF-Medadaade werren inde Bild-Bschraiwung a ogzaischd, wonn die Medadaade-Tabelle verschdegld isch.
+Annere Medadaade sinn noamalawais verschdegld.
 * make
 * model
 * datetimeoriginal
@@ -765,4 +793,7 @@ Annere Metadate sinn standardmäßig versteckelt.
 # Feedback
 'feedback-close' => 'Erledischd',
 
+# Search suggestions
+'searchsuggest-search' => 'Suche',
+
 );
index 54a64ee..106b248 100644 (file)
 
 $messages = array(
 # Dates
-'january'      => 'Jaenyuweri',
-'february'     => 'Febyuweri',
-'march'        => 'Maach',
-'april'        => 'Ieprel',
-'may_long'     => 'Mieh',
-'june'         => 'Juun',
-'july'         => 'Juulai',
-'january-gen'  => 'Jaenyuweri',
+'january' => 'Jaenyuweri',
+'february' => 'Febyuweri',
+'march' => 'Maach',
+'april' => 'Ieprel',
+'may_long' => 'Mieh',
+'june' => 'Juun',
+'july' => 'Juulai',
+'january-gen' => 'Jaenyuweri',
 'february-gen' => 'Febyuweri',
-'march-gen'    => 'Maach',
-'april-gen'    => 'Ieprel',
-'may-gen'      => 'Mieh',
-'june-gen'     => 'Juun',
-'july-gen'     => 'Juulai',
-'may'          => 'Mieh',
+'march-gen' => 'Maach',
+'april-gen' => 'Ieprel',
+'may-gen' => 'Mieh',
+'june-gen' => 'Juun',
+'july-gen' => 'Juulai',
+'may' => 'Mieh',
 
-'help'          => 'Hiiwp',
+'help' => 'Hiiwp',
 'history_short' => 'Histrei',
-'edit'          => 'Edet',
-'talk'          => 'diskushun',
+'edit' => 'Edet',
+'talk' => 'diskushun',
 
 # 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).
-'currentevents'        => 'Dem Kurent Iwent',
-'currentevents-url'    => 'Project:Dem Kurent Iwent',
-'helppage'             => 'Help:Dem Kontent',
-'mainpage'             => 'Mien Paij',
+'currentevents' => 'Dem Kurent Iwent',
+'currentevents-url' => 'Project:Dem Kurent Iwent',
+'helppage' => 'Help:Dem Kontent',
+'mainpage' => 'Mien Paij',
 'mainpage-description' => 'Mien Paij',
-'portal'               => "Trii'nohlij",
+'portal' => "Trii'nohlij",
 
 'editold' => 'edet',
 
@@ -57,8 +57,8 @@ $messages = array(
 'recentchanges' => 'Dem Riisent Chayng',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Dem Riilated Chayng',
-'recentchangeslinked-feed'    => 'Dem Riilated Chayng',
+'recentchangeslinked' => 'Dem Riilated Chayng',
+'recentchangeslinked-feed' => 'Dem Riilated Chayng',
 'recentchangeslinked-toolbox' => 'Dem Riilated Chayng',
 
 # Upload
index 73f80a5..0df47ff 100644 (file)
@@ -47,6 +47,8 @@
  * @author Szczepan1990
  * @author Timpul
  * @author ToSter
+ * @author Tsca
+ * @author WTM
  * @author Woytecr
  * @author Wpedzich
  * @author Ymar
@@ -150,6 +152,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'Wyszukiwanie_MIME' ),
        'Mostcategories'            => array( 'Najwięcej_kategorii' ),
        'Mostimages'                => array( 'Najczęściej_linkowane_pliki' ),
+       'Mostinterwikis'            => array( 'Najwięcej_interwiki' ),
        'Mostlinked'                => array( 'Najczęściej_linkowane' ),
        'Mostlinkedcategories'      => array( 'Najczęściej_linkowane_kategorie' ),
        'Mostlinkedtemplates'       => array( 'Najczęściej_linkowane_szablony' ),
@@ -171,9 +174,8 @@ $specialPageAliases = array(
        'Randompage'                => array( 'Losowa_strona', 'Losowa' ),
        'Randomredirect'            => array( 'Losowe_przekierowanie' ),
        'Recentchanges'             => array( 'Ostatnie_zmiany', 'OZ' ),
-       'Recentchangeslinked'       => array( 'Zmiany_w_linkujących' ),
+       'Recentchangeslinked'       => array( 'Zmiany_w_linkowanych', 'Zmiany_w_linkujących' ),
        'Revisiondelete'            => array( 'Usuń_wersję' ),
-       'RevisionMove'              => array( 'Przenoszenie_wersji' ),
        'Search'                    => array( 'Szukaj' ),
        'Shortpages'                => array( 'Najkrótsze_strony' ),
        'Specialpages'              => array( 'Strony_specjalne' ),
@@ -212,7 +214,6 @@ $magicWords = array(
        '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' ),
@@ -342,7 +343,7 @@ $messages = array(
 
 'underline-always' => 'zawsze',
 'underline-never' => 'nigdy',
-'underline-default' => 'według ustawień przeglądarki',
+'underline-default' => 'według ustawień skórki lub przeglądarki',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Styl czcionki w polu edycyjnym',
@@ -427,8 +428,8 @@ $messages = array(
 'newwindow' => '(otwiera się w nowym oknie)',
 'cancel' => 'Anuluj',
 'moredotdotdot' => 'Więcej...',
-'mypage' => 'Moja strona',
-'mytalk' => 'Moja dyskusja',
+'mypage' => 'Strona',
+'mytalk' => 'Dyskusja',
 'anontalk' => 'Dyskusja tego IP',
 'navigation' => 'Nawigacja',
 'and' => '&#32;oraz',
@@ -438,7 +439,6 @@ $messages = array(
 'qbbrowse' => 'Przeglądanie',
 'qbedit' => 'Edycja',
 'qbpageoptions' => 'Ta strona',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Moje strony',
 'qbspecialpages' => 'strony specjalne',
 'faq' => 'FAQ',
@@ -451,7 +451,7 @@ $messages = array(
 'vector-action-protect' => 'Zabezpiecz',
 'vector-action-undelete' => 'Odtwórz',
 'vector-action-unprotect' => 'Zmień zabezpieczenie',
-'vector-simplesearch-preference' => 'Włącz zaawansowane podpowiedzi wyszukiwania (tylko dla skórki Wektor)',
+'vector-simplesearch-preference' => 'Włącz uproszczony pasek wyszukiwania (tylko dla skórki Wektor)',
 'vector-view-create' => 'Utwórz',
 'vector-view-edit' => 'Edytuj',
 'vector-view-history' => 'Wyświetl historię',
@@ -461,6 +461,7 @@ $messages = array(
 'namespaces' => 'Przestrzenie nazw',
 'variants' => 'Warianty',
 
+'navigation-heading' => 'Menu nawigacyjne',
 'errorpagetitle' => 'Błąd',
 'returnto' => 'Wróć do strony $1.',
 'tagline' => 'Z {{GRAMMAR:D.lp|{{SITENAME}}}}',
@@ -558,10 +559,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).',
+'youhavenewmessagesfromusers' => 'Masz $1 od {{PLURAL:$3|innego użytkownika|$3 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}}',
+'newmessageslinkplural' => '{{PLURAL:$1|jedną wiadomość|nowe wiadomości}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ostatnia zmiana|ostatnie zmiany}}',
 'youhavenewmessagesmulti' => 'Masz nowe wiadomości na $1',
 'editsection' => 'edytuj',
 'editold' => 'edytuj',
@@ -701,11 +702,11 @@ Administrator blokujący go podał następujący powód "\'\'$3\'\'".',
 # Login and logout pages
 'logouttext' => "'''Nie jesteś już zalogowany.'''
 
-Możesz kontynuować pracę w {{GRAMMAR:MS.lp|{{SITENAME}}}} jako niezarejestrowany użytkownik albo [[Special:UserLogin|zalogować się ponownie]] jako ten sam lub inny użytkownik.
+Możesz kontynuować pracę w {{GRAMMAR:MS.lp|{{SITENAME}}}} jako niezarejestrowany użytkownik albo <span class='plainlinks'>[$1 zalogować się ponownie]</span> jako ten sam lub inny użytkownik.
 Zauważ, że do momentu wyczyszczenia pamięci podręcznej przeglądarki niektóre strony mogą wyglądać tak, jakbyś wciąż był zalogowany.",
-'welcomecreation' => '== Witaj, $1! ==
-Twoje konto zostało utworzone.
-Nie zapomnij dostosować [[Special:Preferences|preferencji dla {{GRAMMAR:D.lp|{{SITENAME}}}}]].',
+'welcomeuser' => 'Witaj, $1!',
+'welcomecreation-msg' => 'Twoje konto zostało utworzone.
+Nie zapomnij dostosować [[Special:Preferences|preferencji]].',
 'yourname' => 'Nazwa {{GENDER:|użytkownika|użytkowniczki}}',
 'yourpassword' => 'Hasło',
 'yourpasswordagain' => 'Powtórz hasło',
@@ -991,7 +992,7 @@ Strony użytkownika zawierające CSS i JavaScript powinny zaczynać się małą
 'note' => "'''Uwaga:'''",
 'previewnote' => "'''To jest tylko podgląd'''
 Zmiany nie zostały jeszcze zapisane!",
-'continue-editing' => 'Kontynuuj edycję',
+'continue-editing' => 'Przejdź do pola edycji',
 'previewconflict' => 'Podgląd odnosi się do tekstu z górnego pola edycji. Tak będzie wyglądać strona, jeśli zdecydujesz się ją zapisać.',
 'session_fail_preview' => "'''Uwaga! Serwer nie może przetworzyć tej edycji z powodu utraty danych sesji.
 Spróbuj jeszcze raz.
@@ -1073,6 +1074,15 @@ Zdaje się, że została skasowana.',
 'edit-already-exists' => 'Nie udało się stworzyć nowej strony.
 Strona już istnieje.',
 'defaultmessagetext' => 'Domyślny tekst komunikatu',
+'content-failed-to-parse' => 'Format zawartości typu $2 (dla modelu: $1) nieprawidłowy: $3',
+'invalid-content-data' => 'Zawartość strony zawiera nieprawidłowe dane',
+'content-not-allowed-here' => 'Zawartość tego typu ($1) nie jest dozwolona na stronie [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'zwykły tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uwaga! Ta strona zawiera zbyt wiele wywołań złożonych obliczeniowo funkcji parsera.
@@ -1327,8 +1337,6 @@ Zazwyczaj jest to spowodowane przestarzałym linkiem do usuniętej strony. Powó
 'search-interwiki-caption' => 'Projekty siostrzane',
 'search-interwiki-default' => 'Wyniki dla $1:',
 'search-interwiki-more' => '(więcej)',
-'search-mwsuggest-enabled' => 'z dynamicznymi propozycjami',
-'search-mwsuggest-disabled' => 'bez dynamicznych propozycji',
 'search-relatedarticle' => 'Pokrewne',
 'mwsuggest-disable' => 'Wyłącz dynamiczne podpowiedzi',
 'searcheverything-enable' => 'Szukaj we wszystkich przestrzeniach nazw',
@@ -1426,7 +1434,7 @@ Wygenerowany losowo klucz, którego możesz użyć to $1',
 'timezoneregion-indian' => 'Ocean Indyjski',
 'timezoneregion-pacific' => 'Ocean Spokojny',
 'allowemail' => 'Zgadzam się, by inni użytkownicy mogli przesyłać do mnie e‐maile',
-'prefs-searchoptions' => 'Szukaj',
+'prefs-searchoptions' => 'Wyszukiwanie',
 'prefs-namespaces' => 'Przestrzenie nazw',
 'defaultns' => 'Albo przeszukuj przestrzenie nazw:',
 'default' => 'domyślnie',
@@ -1464,7 +1472,7 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'prefs-help-email-others' => 'Możesz również umożliwić innym użytkownikom wysłanie do Ciebie e‐maila poprzez Twoją stronę użytkownika lub stronę dyskusji (bez ujawniania Twojego adresu).',
 'prefs-help-email-required' => 'Wymagany jest adres e‐mail.',
 'prefs-info' => 'Podstawowe informacje',
-'prefs-i18n' => 'Ustawienia międzynarodowe',
+'prefs-i18n' => 'Ustawienia językowe',
 'prefs-signature' => 'Podpis',
 'prefs-dateformat' => 'Format daty',
 'prefs-timeoffset' => 'Różnica czasu',
@@ -1594,7 +1602,10 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'rightslog' => 'Uprawnienia',
 'rightslogtext' => 'Rejestr zmian uprawnień użytkowników.',
 'rightslogentry' => 'zmienił przynależność $1 do grup ($2 → $3)',
-'rightslogentry-autopromote' => 'automatycznie zmienia przynależność ($2 → $3)',
+'rightslogentry-autopromote' => 'automatycznie zmienił przynależność ($2 → $3)',
+'logentry-rights-rights' => '$1 zmienił przynależność $3 do grup ($4 → $5)',
+'logentry-rights-rights-legacy' => '$1 zmienił przynależność $3 do grup',
+'logentry-rights-autopromote' => '$1 automatycznie zmienił przynależność ($4 → $5)',
 'rightsnone' => 'brak',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1671,9 +1682,9 @@ Jeśli zdecydujesz się je podać, zostaną użyte, by udokumentować Twoje auto
 'rc-old-title' => 'oryginalnie utworzono jako "$1"',
 
 # Recent changes linked
-'recentchangeslinked' => 'Zmiany w dolinkowanych',
-'recentchangeslinked-feed' => 'Zmiany w dolinkowanych',
-'recentchangeslinked-toolbox' => 'Zmiany w dolinkowanych',
+'recentchangeslinked' => 'Zmiany w linkowanych',
+'recentchangeslinked-feed' => 'Zmiany w linkowanych',
+'recentchangeslinked-toolbox' => 'Zmiany w linkowanych',
 'recentchangeslinked-title' => 'Zmiany w linkowanych z „$1”',
 'recentchangeslinked-noresult' => 'Nie było żadnych zmian na (zależnie od ustawień) linkowanych lub linkujących stronach w wybranym okresie.',
 'recentchangeslinked-summary' => "Poniżej znajduje się lista ostatnich zmian na stronach linkowanych z podanej strony (lub we wszystkich stronach należących do podanej kategorii).
@@ -1841,6 +1852,7 @@ Jeśli problem będzie się powtarzał, skontaktuj się z [[Special:ListUsers/sy
 'backend-fail-notsame' => 'Plik o podobnej nazwie już istnieje w $1.',
 'backend-fail-invalidpath' => '$1nie jest poprawną ścieżką zapisu.',
 'backend-fail-delete' => 'Nie można usunąć pliku $1.',
+'backend-fail-describe' => 'Nie udało się zmienić metadanych pliku "$1".',
 'backend-fail-alreadyexists' => 'Plik „$1” już istnieje',
 'backend-fail-store' => 'Nie może zapisać pliku  $1  w  $2 .',
 'backend-fail-copy' => 'Nie może skopiować pliku $1 do $2.',
@@ -1990,7 +2002,7 @@ Być może zechcesz zmienić opis na tej [$2 stronie opisu pliku].',
 'uploadnewversion-linktext' => 'Załaduj nowszą wersję tego pliku',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'współdzielone zasoby',
-'upload-disallowed-here' => 'Niestety, nie możesz nadpisać tego pliku.',
+'upload-disallowed-here' => 'Nie możesz nadpisać tego pliku.',
 
 # File reversion
 'filerevert' => 'Przywracanie $1',
@@ -2228,7 +2240,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: <code>$1</code> (nie podawaj ich podczas wyszukiwania).',
+Obsługiwane protokoły: <code>$1</code> (jeśli nie podano, domyślny to http://).',
 'linksearch-line' => '$1 link na stronie $2',
 'linksearch-error' => 'Symbolu wieloznacznego można użyć wyłącznie na początku nazwy hosta.',
 
@@ -2277,7 +2289,7 @@ Sprawdź stronę z [[{{MediaWiki:Listgrouprights-helppage}}|dodatkowymi informac
 '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.
+'emailpagetext' => 'Możesz użyć poniższego formularza, aby wysłać wiadomość e‐mail do {{GENDER:$1|tego użytkownika|tej użytkowniczki}}.
 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ć.',
 'usermailererror' => 'Moduł obsługi poczty zwrócił błąd:',
 'defemailsubject' => '{{SITENAME}} – e‐mail od użytkownika „$1“',
@@ -2345,19 +2357,13 @@ Każda zmiana treści tej strony lub związanej z nią strony dyskusji zostanie
 
 'enotif_mailer' => 'Powiadomienie z {{GRAMMAR:D.lp|{{SITENAME}}}}',
 'enotif_reset' => 'Zaznacz wszystkie strony jako odwiedzone',
-'enotif_newpagetext' => 'To jest nowa strona.',
 'enotif_impersonal_salutation' => 'użytkownik {{GRAMMAR:D.lp|{{SITENAME}}}}',
-'changed' => 'zmieniona',
-'created' => 'utworzona',
-'enotif_subject' => 'Strona $PAGETITLE w {{GRAMMAR:MS.lp|{{SITENAME}}}} została $CHANGEDORCREATED przez użytkownika $PAGEEDITOR',
 'enotif_lastvisited' => 'Zobacz na stronie $1 wszystkie zmiany od Twojej ostatniej wizyty.',
 'enotif_lastdiff' => 'Zobacz na stronie $1 tę zmianę.',
 'enotif_anon_editor' => 'użytkownik anonimowy $1',
 'enotif_body' => 'Szanowny $WATCHINGUSERNAME,
 
-strona $PAGETITLE w {{GRAMMAR:MS.lp|{{SITENAME}}}} została $CHANGEDORCREATED $PAGEEDITDATE przez użytkownika $PAGEEDITOR. Zobacz na stronie $PAGETITLE_URL aktualną wersję.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Opis zmiany: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2365,8 +2371,7 @@ Kontakt do autora:
 mail – $PAGEEDITOR_EMAIL
 wiki – $PAGEEDITOR_WIKI
 
-W przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony.
-Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.
+W przypadku kolejnych zmian nowe powiadomienia nie zostaną wysłane, dopóki nie odwiedzisz tej strony. Możesz także zresetować wszystkie flagi powiadomień na swojej liście stron obserwowanych.
 
        Wiadomość z systemu powiadomień {{GRAMMAR:D.lp|{{SITENAME}}}}
 
@@ -2532,8 +2537,8 @@ Możesz mieć zły link lub wersja mogła zostać odtworzona lub usunięta z arc
 'undeletedrevisions' => 'odtworzono {{PLURAL:$1|1 wersję|$1 wersje|$1 wersji}}',
 'undeletedrevisions-files' => 'odtworzono $1 {{PLURAL:$1|wersję|wersje|wersji}} i $2 {{PLURAL:$2|plik|pliki|plików}}',
 'undeletedfiles' => 'odtworzył $1 {{PLURAL:$1|plik|pliki|plików}}',
-'cannotundelete' => 'Odtworzenie nie powiodło się.
-Ktoś inny prawdopodobnie odtworzył już tę stronę.',
+'cannotundelete' => 'Odtworzenie nie powiodło się:
+$1',
 'undeletedpage' => "'''Odtworzono stronę $1.'''
 
 Zobacz [[Special:Log/delete|rejestr usunięć]], jeśli chcesz przejrzeć ostatnie operacje usuwania i odtwarzania stron.",
@@ -2567,7 +2572,7 @@ $1',
 # Contributions
 'contributions' => 'Wkład użytkownika',
 'contributions-title' => 'Wkład {{GENDER:$1|użytkownika|użytkowniczki}} $1',
-'mycontris' => 'Moje edycje',
+'mycontris' => 'Edycje',
 'contribsub2' => 'Dla użytkownika $1 ($2)',
 'nocontribs' => 'Brak zmian odpowiadających tym kryteriom.',
 'uctop' => ' (jako ostatnia)',
@@ -2607,7 +2612,7 @@ Poniżej znajduje się ostatni wpis w rejestrze blokowania.',
 'whatlinkshere-hideredirs' => '$1 przekierowania',
 'whatlinkshere-hidetrans' => '$1 dołączenia',
 'whatlinkshere-hidelinks' => '$1 linki',
-'whatlinkshere-hideimages' => '$1 linki z grafik',
+'whatlinkshere-hideimages' => '$1 linki z plików',
 'whatlinkshere-filters' => 'Filtry',
 
 # Block/unblock
@@ -2839,6 +2844,7 @@ Strony nie można przenieść na nią samą.',
 'immobile-target-namespace-iw' => 'Link interwiki jest nieprawidłowym tytułem, pod który miałaby być przeniesiona strona.',
 'immobile-source-page' => 'Tej strony nie można przenieść.',
 'immobile-target-page' => 'Nie można przenieść pod wskazany tytuł.',
+'bad-target-model' => 'Strona docelowa używa innego modelu zawartości. Konwersja $1 → $2 nie jest możliwa.',
 'imagenocrossnamespace' => 'Nie można przenieść grafiki do przestrzeni nazw nie przeznaczonej dla grafik',
 'nonfile-cannot-move-to-file' => 'Nie można przenieść obiektu nie będącego plikiem do przestrzeni nazw „{{ns:file}}“',
 'imagetypemismatch' => 'Nowe rozszerzenie nazwy pliku jest innego typu niż zawartość',
@@ -2966,7 +2972,6 @@ Brak katalogu dla plików tymczasowych.',
 
 # JavaScriptTest
 'javascripttest' => 'Testowanie JavaScript',
-'javascripttest-disabled' => 'Ta funkcja nie została włączona na tej wiki.',
 'javascripttest-title' => 'Uruchamianie testów $1',
 'javascripttest-pagetext-noframework' => 'Ta strona jest zarezerwowana dla wykonywania testów JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Nieznany framework testowania „$1”.',
@@ -3099,6 +3104,7 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 
 # Info page
 'pageinfo-title' => 'Informacje o „$1“',
+'pageinfo-not-current' => 'Niestety, te informacje nie są dostępne dla starych wersji stron.',
 'pageinfo-header-basic' => 'Podstawowe informacje',
 'pageinfo-header-edits' => 'Historia edycji',
 'pageinfo-header-restrictions' => 'Zmień zabezpieczenie',
@@ -3107,6 +3113,7 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'pageinfo-default-sort' => 'Domyślny klucz sortowania',
 'pageinfo-length' => 'Długość strony (w bajtach)',
 'pageinfo-article-id' => 'Identyfikator strony',
+'pageinfo-language' => 'Język zawartości strony',
 'pageinfo-robot-policy' => 'Status w wyszukiwarce',
 'pageinfo-robot-index' => 'Indeksowalne',
 'pageinfo-robot-noindex' => 'Nieindeksowalne',
@@ -3123,10 +3130,17 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 '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 – {{lcfirst:$1}}',
 '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' => 'Wykorzystywan{{PLURAL:$1|y szablon|e szablony}} ($1)',
+'pageinfo-toolboxlink' => 'Informacje o tej stronie',
+'pageinfo-redirectsto' => 'Przekierowuje na',
+'pageinfo-redirectsto-info' => 'informacje',
+'pageinfo-contentpage' => 'Liczona jako artykuł',
+'pageinfo-contentpage-yes' => 'Tak',
+'pageinfo-protect-cascading' => 'Zabezpieczona z włączoną opcją dziedziczenia',
+'pageinfo-protect-cascading-yes' => 'Tak',
+'pageinfo-protect-cascading-from' => 'Zabezpieczenie dziedziczone z',
 
 # Skin names
 'skinname-standard' => 'Standardowa',
@@ -3149,6 +3163,8 @@ Najprawdopodobniej zostało to spowodowane przez link do zewnętrznej strony int
 'markedaspatrollederror' => 'Nie można oznaczyć jako „sprawdzone”',
 'markedaspatrollederrortext' => 'Musisz wybrać wersję żeby oznaczyć ją jako „sprawdzoną”.',
 'markedaspatrollederror-noautopatrol' => 'Nie masz uprawnień wymaganych do oznaczania swoich edycji jako „sprawdzone”.',
+'markedaspatrollednotify' => 'Ta zmiana na stronie «$1» została oznaczona jako sprawdzona.',
+'markedaspatrollederrornotify' => 'Oznaczenie strony jako sprawdzonej nie powiodło się.',
 
 # Patrol log
 'patrol-log-page' => 'Rejestr patrolowania',
@@ -3215,6 +3231,7 @@ Jeśli go otworzysz, możesz zarazić swój system.",
 'hours' => '{{PLURAL:$1|$1 godzina|$1 godziny|$1 godzin}}',
 'days' => '{{PLURAL:$1|$1 dzień|$1 dni}}',
 'ago' => '$1 temu',
+'just-now' => 'przed chwilą',
 
 # Bad image list
 'bad_image_list' => 'Dane należy wprowadzić w formacie:
@@ -3722,6 +3739,7 @@ Kod zawarty w linku straci ważność $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Transkluzja przez interwiki jest wyłączona]',
 'scarytranscludefailed' => '[Pobranie szablonu dla $1 nie powiodło się]',
+'scarytranscludefailed-httpstatus' => '[Pobranie szablonu dla $1 nie powiodło się: HTTP $2]',
 'scarytranscludetoolong' => '[zbyt długi adres URL]',
 
 # Delete conflict
@@ -3879,6 +3897,7 @@ Możesz także użyć [[Special:EditWatchlist|standardowego edytora obserwowanyc
 'version-license' => 'Licencja',
 'version-poweredby-credits' => "To wiki korzysta z oprogramowania '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001‐$1 $2.",
 'version-poweredby-others' => 'inni',
+'version-credits-summary' => 'Następujące osoby wniosły istotny wkład w rozwój oprogramowania [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki jest wolnym oprogramowaniem – możesz je dystrybuować i modyfikować zgodnie z warunkami licencji GNU General Public License opublikowanej przez Free Software Foundation w wersji 2 tej licencji lub (jeśli wolisz) dowolnej późniejszej.
 
 MediaWiki jest dystrybuowane w nadziei, że okaże się użyteczne ale BEZ JAKIEJKOLWIEK GWARANCJI – nawet bez domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ lub PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ. Więcej szczegółów znajdziesz w treści licencji GNU General Public License.
@@ -4017,9 +4036,9 @@ Grafiki są pokazywane w pełnej rozdzielczości. Inne typy plików są otwieran
 'logentry-move-move_redir-noredirect' => '$1 przenosi stronę $3 na $4 w miejsce przekierowania i bez pozostawienia przekierowania pod starym tytułem',
 'logentry-patrol-patrol' => '$1 oznacza wersję $4 strony $3 jako sprawdzoną',
 'logentry-patrol-patrol-auto' => '$1 automatycznie oznacza wersję $4 strony $3 jako sprawdzoną',
-'logentry-newusers-newusers' => '$1 tworzy konto użytkownika',
-'logentry-newusers-create' => '$1 tworzy konto użytkownika',
-'logentry-newusers-create2' => '$1 tworzy konto użytkownika $3',
+'logentry-newusers-newusers' => 'Konto użytkownika $1 zostało utworzone',
+'logentry-newusers-create' => 'Konto użytkownika $1 zostało utworzone',
+'logentry-newusers-create2' => 'Konto użytkownika $3 zostało utworzone przez użytkownika $1',
 'logentry-newusers-autocreate' => '$1 automatycznie tworzy konto użytkownika',
 'newuserlog-byemail' => 'hasło zostało wysłane e‐mailem',
 
@@ -4039,6 +4058,10 @@ W przeciwnym wypadku można użyć prostego formularza poniżej. Komentarz zosta
 'feedback-bugcheck' => 'Świetnie! Tylko sprawdź, czy nie jest już jednym ze [$1 znanych błędów].',
 'feedback-bugnew' => '{{GENDER:|Sprawdziłem|Sprawdziłam}}. Zgłoś nowy błąd',
 
+# Search suggestions
+'searchsuggest-search' => 'Szukaj',
+'searchsuggest-containing' => 'zawierające...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nie masz uprawnień aby przesyłać pliki do tej wiki.',
 'api-error-badtoken' => 'Błąd wewnętrzny – żeton wykorzystywany do identyfikacji użytkownika jest nieprawidłowy.',
index eb40fa2..81a9988 100644 (file)
@@ -90,7 +90,7 @@ $messages = array(
 
 'underline-always' => 'Sempe',
 'underline-never' => 'Mai',
-'underline-default' => 'Deuvra lë stàndard dël programma ëd navigassion (browser)',
+'underline-default' => 'Stàndard dël navigator',
 
 # Font style option in Special:Preferences
 'editfont-style' => "Stil dël font ëd l'àrea ëd modìfica:",
@@ -175,8 +175,8 @@ $messages = array(
 'newwindow' => '(as deurb ant na fnestra neuva)',
 'cancel' => 'Scancela',
 'moredotdotdot' => 'Dë pì...',
-'mypage' => 'Mia pàgina',
-'mytalk' => 'Mie ciaciarade',
+'mypage' => 'Pàgina',
+'mytalk' => 'Ciaciarade',
 'anontalk' => "Ciaciarade për st'adrëssa IP-sì",
 'navigation' => 'Navigassion',
 'and' => '&#32;e',
@@ -186,7 +186,6 @@ $messages = array(
 'qbbrowse' => 'Sfeuja',
 'qbedit' => 'Modìfica',
 'qbpageoptions' => 'Opsion dla pàgina',
-'qbpageinfo' => 'Anformassion rësguard a la pàgina',
 'qbmyoptions' => 'Mie opsion',
 'qbspecialpages' => 'Pàgine speciaj',
 'faq' => 'Chestion frequente',
@@ -199,7 +198,7 @@ $messages = array(
 'vector-action-protect' => 'Protegg',
 'vector-action-undelete' => 'Arcùpera',
 'vector-action-unprotect' => 'Cangé la protession',
-'vector-simplesearch-preference' => "Abilité ij sugeriment d'arserca ameliorà (mach për la pel Vector)",
+'vector-simplesearch-preference' => "Abilité la bara d'arserca semplificà (mach për la pel Vector)",
 'vector-view-create' => 'Crea',
 'vector-view-edit' => 'Modìfica',
 'vector-view-history' => 'Varda stòria',
@@ -209,6 +208,7 @@ $messages = array(
 'namespaces' => 'Spassi nominaj',
 'variants' => 'Variant',
 
+'navigation-heading' => 'Lista ëd navigassion',
 'errorpagetitle' => 'Eror',
 'returnto' => 'Torna andré a $1.',
 'tagline' => 'Da {{SITENAME}}.',
@@ -416,11 +416,13 @@ Arcesta: $2',
 'viewsource-title' => 'Vëdde la sorgiss ëd $1',
 'actionthrottled' => 'Assion frenà',
 'actionthrottledtext' => "Për evité che gent ò màchine an carìo dla rumenta, st'assion-sì as peul nen fesse tròp ëd soèns, e chiel/chila a l'ha arpetula tròpe vire. Ch'a sia gentil, ch'a preuva torna antra dontre minute.",
-'protectedpagetext' => "Sta pàgina-sì a l'è stàita blocà për evité che a-j faso dle modìfiche.",
+'protectedpagetext' => "Sta pàgina-sì a l'è stàita blocà për evité 'd modìfiche o d'àutre assion.",
 'viewsourcetext' => 'A peul vardé e copié la sorgiss dë sta pàgina:',
 'viewyourtext' => "A peule vëdde e copié la sorziss ëd '''soe modìfiche''' a costa pàgina-sì:",
-'protectedinterface' => "Costa pàgina-sì a l'ha andrinta un chèich-còs che a fa part d'antërfacia dël programa che a deuvro tùit; donca a l'é proteta për evité che a-i rivo dle ròbe brute.",
-'editinginterface' => "'''Dossman!''' A l'é dapress ch'a-i travaja ansima a na pàgina ch'as deuvra për generé ël test dl'antërfacia dël programa. Le modìfiche fàite ambelessì a-j bogio l'antërfacia a tuti j'utent. Se sò but a l'é col ëd fé na tradussion, për piasì ch'a considerà la possibilità dë dovré [//translatewiki.net/wiki/Main_Page?setlang=pms translatewiki.net], ël proget ëd localisassion ëd MediaWiki.",
+'protectedinterface' => "Costa pàgina-sì a l'ha andrinta un cheicòs che a fa part d'antërfacia dël programa che a deuvro tùit; donca a l'é proteta për evité che a-i rivo dle ròbe brute.",
+'editinginterface' => "'''Dossman!''' A l'é dapress ch'a modìfica na pàgina ch'as deuvra për generé ël test dl'antërfacia dël programa. 
+Le modìfiche a sta pàgina a toco l'aparensa ëd l'antërfacia utent a tuti j'utent dzora a sta wiki. 
+Për gionté o cangé dle tradussion për tute le wiki, për piasì ch'a deuvra [//translatewiki.net/translatewiki.net], ël proget ëd localisassion ëd MediaWiki.",
 'sqlhidden' => "(l'anterogassion SQL a l'é stërmà)",
 'cascadeprotected' => 'Ant sta pàgina-sì as peulo pa fé ëd modìfiche, përché a-i intra ant {{PLURAL:$1|la pàgina|le pàgine}} butà sot a protession con la fonsion "a tombé" viscà ansima a: $2',
 'namespaceprotected' => "A l'ha nen ël përmess dë feje dle modìfiche a le pàgine dlë spassi nominal '''$1'''.",
@@ -443,12 +445,12 @@ L'aministrator ch'a l'ha blocalo a l'ha lassà sta spiegassion: «$3».",
 'virus-unknownscanner' => 'antivìrus nen conossù:',
 
 # Login and logout pages
-'logouttext' => "'''A l'é sortù da 'nt ël sistema.'''
+'logouttext' => "'''A l'é surtì da 'nt ël sistema.'''
 
-A peul tiré anans a dovré {{SITENAME}} coma Utent anonim, ò pura a peul [[Special:UserLogin|rintré torna ant ël sistema]] con l'istess stranòm che a dovrava prima, ò con un diferent.
-Ch'a nòta che chèich pàgine a peulo continué a esse visualisà com s'a fussa ancó ant ël sistema, fin ch'a scancela pa la cache ëd sò navigador.",
-'welcomecreation' => '==Bin ëvnù, $1!==
-Sò cont a l\'é stàit creà.
+A peul tiré anans a dovré {{SITENAME}} coma Utent anònim, ò pura a peul <span class='plainlinks'>[$1 rintré torna ant ël sistema]</span> con l'istess stranòm che a dovrava prima, ò con un diferent.
+Ch'a nòta che chèiche pàgine a peulo continué a esse visualisà com s'a fussa ancor ant ël sistema, fin ch'a scancela nen la memòria local ëd sò navigador.",
+'welcomeuser' => 'Bin ëvnù, $1!',
+'welcomecreation-msg' => 'Sò cont a l\'é stàit creà.
 Che as dësmentia pa ëd cambié ij [[Special:Preferences|"sò gust" an {{SITENAME}}]].',
 'yourname' => 'Sò stranòm',
 'yourpassword' => 'Soa ciav',
@@ -694,9 +696,9 @@ S'it ses sì për eror, sgnaca ël boton '''andaré''' ëd tò navigador.",
 'noarticletext' => 'Al moment costa pàgina a l\'é veuida.
 It peule [[Special:Search/{{PAGENAME}}|sërché costa vos]] andrinta a d\'àutre pàgine, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché ant ij registr colegà],
 o purament [{{fullurl:{{FULLPAGENAME}}|action=edit}} modìfiché la pàgina adess]</span>.',
-'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>.',
+'noarticletext-nopermission' => "Al moment a-i é gnun test ansima a costa pàgina.
+A peul [[Special:Search/{{PAGENAME}}|sërché ës tìtol ëd pàgina]] an d'àutre pàgine,
+o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sërché j'argistrassion colegà]</span>, ma a l'ha pa ël përmess ëd creé costa pàgina.",
 '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}}}}].",
@@ -724,7 +726,7 @@ Sòn a l'é normalment causà da l'andèje dapress a na vej liura stòrica a na
 'note' => "'''NÒTA:'''",
 'previewnote' => "'''Che a ten-a present che costa-sì a l'é mach na preuva.'''
 Ij sò cambi a son anco' pa stàit salvà!",
-'continue-editing' => 'Continua a modifiché',
+'continue-editing' => 'Andé a la zòna ëd modìfica',
 'previewconflict' => "Costa preuva a-j mostra ël test dl'artìcol ambelessì dzora. Se a sërn dë salvelo, a l'é parèj che a lo s-ciairëran ëdcò tuti j'àutri Utent.",
 'session_fail_preview' => "'''Darmagi! I l'oma pa podù processé soa modìfica per via che a son përdusse për la stra ij dat ëd session.
 Për piasì che a preuva n'àutra vira. Se a dovèissa mai torna riveje sossì, che a preuva a seurte dal sistema e peuj torna a rintré.'''",
@@ -804,6 +806,15 @@ A smija che a sia stàita scancelà.',
 'edit-already-exists' => 'As peul nen creesse la pàgina.
 A esist già.',
 'defaultmessagetext' => "Test che a-i sarìa se a-i fusso pa 'd modìfiche",
+'content-failed-to-parse' => "Faliment ëd l'anàlisi dël contnù ëd $2 për ël model $1: $3",
+'invalid-content-data' => 'Dat dël contnù pa bon',
+'content-not-allowed-here' => "Ël contnù «$1» a l'é nen autorisà an sla pàgina [[$2]]",
+
+# Content models
+'content-model-wikitext' => 'test wiki',
+'content-model-text' => 'mach test',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Atension:''' Costa pàgina a l'ha tròpe ciamà costose a le fonsions ëd parser.
@@ -1059,8 +1070,6 @@ Sòn a l'é normalment causà da l'andèje dapress a na veja liura stòrica a na
 'search-interwiki-caption' => 'Proget frej',
 'search-interwiki-default' => 'Arzultà da $1:',
 'search-interwiki-more' => '(ëd pì)',
-'search-mwsuggest-enabled' => 'con sugeriment',
-'search-mwsuggest-disabled' => 'gnun sugeriment',
 'search-relatedarticle' => 'Corelà',
 'mwsuggest-disable' => 'Disabilité ij sugeriment AJAX',
 'searcheverything-enable' => 'Sërché ant tùit jë spassi nominaj',
@@ -1094,7 +1103,7 @@ Ch'a preuva a gionté dnans a soa arserca ël prefiss ''all:'' për sërché an
 
 # Preferences page
 'preferences' => 'Mè gust',
-'mypreferences' => 'mè gust',
+'mypreferences' => 'Gust',
 'prefs-edits' => 'Nùmer ëd modìfiche fàite:',
 'prefsnologin' => "A l'é ancó pa rintrà ant ël sistema",
 'prefsnologintext' => 'A deuv esse <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} intrà ant ël sistema]</span> për amposté ij sò gust.',
@@ -1157,7 +1166,7 @@ Ambelessì a-i é un valor generà a asar che a peul dovré: $1",
 'timezoneregion-indian' => 'Océan Indian',
 'timezoneregion-pacific' => 'Océan Passìfich',
 'allowemail' => "Lassa che j'àutri utent am mando ëd mëssagi ëd pòsta eletrònica",
-'prefs-searchoptions' => "Opsion d'arserca",
+'prefs-searchoptions' => 'Sërca',
 'prefs-namespaces' => 'Spassi nominaj',
 'defaultns' => 'Dësnò, sërché an costi spassi nominaj-sì:',
 'default' => 'stàndard',
@@ -1329,6 +1338,9 @@ Costa anformassion a sarà pùblica.",
 'rightslogtext' => "Costa a l'é na lista dij cambiament aj drit ëd j'utent.",
 'rightslogentry' => "a l'ha tramudà $1 da 'nt la partìa $2 a la partìa $3",
 'rightslogentry-autopromote' => "a l'é stàit automaticament promovù da $2 a $3",
+'logentry-rights-rights' => "$1 a l'ha tramudà l'apartenesa a la partìa për $3 da $4 a $5",
+'logentry-rights-rights-legacy' => "$1 a l'ha tramudà l'apartenensa a la partìa për $3",
+'logentry-rights-autopromote' => "$1 a l'é stàit automaticament promovù da $4 a $5",
 'rightsnone' => '(gnun)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1573,6 +1585,7 @@ Se a-i riva sossì n'àotra vira, ch'as buta an comunicassion con n'[[Special:Li
 'backend-fail-notsame' => "N'archivi nen idéntich a esist già a $1.",
 'backend-fail-invalidpath' => "$1 a l'é pa un përcors ëd memorisassion bon.",
 'backend-fail-delete' => "As peul pa scanselesse l'archivi $1.",
+'backend-fail-describe' => "Impossìbil cangé ij metadat për l'archivi «$1».",
 'backend-fail-alreadyexists' => 'L\'archivi "$1" a esist già.',
 'backend-fail-store' => "As peul pa memorisesse l'archivi $1 a $2.",
 'backend-fail-copy' => "As peul pa copiesse l'archivi $1 su $2.",
@@ -1589,7 +1602,7 @@ Se a-i riva sossì n'àotra vira, ch'as buta an comunicassion con n'[[Special:Li
 'backend-fail-internal' => "N'eror pa conossù a l'é rivaje ant ël dispositiv ëd memòria «$1».",
 'backend-fail-contenttype' => "As peul pa determinesse la sòrt ëd contnù dl'archivi da memorisé a «$1».",
 'backend-fail-batchsize' => "Ël dispositiv ëd memòria a l'ha dàit un total ëd $1 {{PLURAL:$1|operassion|operassion}} d'archivi; ël lìmit a l'é $2 {{PLURAL:$1|operassion|operassion}}.",
-'backend-fail-usable' => "As peul pa scrivse l'archivi $1 a motiv ëd drit insuficent o liste/contnidor mancant.",
+'backend-fail-usable' => 'As peul pa les-se o scrivse l\'archivi "$1" a motiv ëd drit insuficent o liste/contnidor mancant.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Impossìbil coleghesse a la base ëd dàit ëd lë scartari për ël terminal ëd memorisassion «$1».',
@@ -1722,7 +1735,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.',
+'upload-disallowed-here' => 'A peul pa rampiassé cost archivi.',
 
 # File reversion
 'filerevert' => "Buté torna $1 tanme ch'a l'era",
@@ -1960,7 +1973,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: <code>$1</code> (ch\'a gionta gnun ëd costi an soa arserca).',
+Protocòj ch\'as peulo dovresse: <code>$1</code> (predefinì http:// se gnun protocòj a son specificà).',
 '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.',
 
@@ -2010,8 +2023,8 @@ e avèj registrà n'adrëssa ëd pòsta eletrònica vàlida ant ij [[Special:Pre
 '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.",
+'emailpagetext' => "A peul dovré ël formolari sì-sota për mandé un mëssagi ëd pòsta eletrònica a st'{{GENDER:$1|utent}}-sì.
+L'adrëssa ëd pòsta eletrònica ch'a l'ha butà ant ij [[Special:Preferences|sò gust]] a sarà butà ant l'adrëssa «Da» ëd sò mëssagi, parèj chi ch'a l'arsèiv a podrà rësponde diretament a chiel.",
 'usermailererror' => "L'oget che a goèrna la pòsta eletrònica a l'ha dàit eror:",
 'defemailsubject' => 'Mëssagi da l\'utent "$1"',
 'usermaildisabled' => "Pòsta eletrònica dl'utent disabilità",
@@ -2042,7 +2055,7 @@ L'adrëssa ëd pòsta eletrònica ch'a l'ha butà ant ij [[Special:Preferences|I
 
 # Watchlist
 'watchlist' => 'Ròba che im ten-o sot-euj',
-'mywatchlist' => 'Ròba che im ten-o sot-euj',
+'mywatchlist' => 'Ròba che as ten sot euj',
 'watchlistfor2' => 'Për $1 $2',
 'nowatchlist' => "A l'ha ancó pa marcà dj'artìcoj coma ròba da tnì sot-euj.",
 'watchlistanontext' => "Për piasì, $1 për ës-ciairé ò pura modifiché j'element ëd soa lista dla ròba che as ten sot-euj.",
@@ -2079,19 +2092,23 @@ Le modìfiche che a-i vniran ant costa pàgina-sì e ant soa pàgina ëd discuss
 
 'enotif_mailer' => '{{SITENAME}} - Servissi ëd Notìfica Postal',
 'enotif_reset' => 'Marché tute le pàgine tanme visità',
-'enotif_newpagetext' => "Costa-sì a l'é na pàgina neuva",
 'enotif_impersonal_salutation' => 'utent ëd {{SITENAME}}',
-'changed' => 'modificà',
-'created' => 'creà',
-'enotif_subject' => 'La pàgina $PAGETITLE ëd {{SITENAME}} a l\'é staita $CHANGEDORCREATED da $PAGEEDITOR',
+'enotif_subject_deleted' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita scancelà da {{gender:$2|$2}}",
+'enotif_subject_created' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita creà da {{gender:$2|$2}}",
+'enotif_subject_moved' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita tramudà da {{gender:$2|$2}}",
+'enotif_subject_restored' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita ripristinà da {{gender:$2|$2}}",
+'enotif_subject_changed' => "La pàgina $1 ëd {{SITENAME}} a l'é stàita modificà da {{gender:$2|$2}}",
+'enotif_body_intro_deleted' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita scancelà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
+'enotif_body_intro_created' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita creà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
+'enotif_body_intro_moved' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita tramudà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
+'enotif_body_intro_restored' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita ripristinà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
+'enotif_body_intro_changed' => 'La pàgina $1 ëd {{SITENAME}} a l\'é stàita modificà da {{gender:$2|$2}} ël $PAGEEDITDATE, vëdde $3 për la revision corenta.',
 'enotif_lastvisited' => "Che as varda $1 për ës-ciaré tute le modìfiche da 'nt l'ùltima vira che a l'é passà.",
 'enotif_lastdiff' => "Ch'a varda $1 për visioné sta modìfica.",
 'enotif_anon_editor' => 'utent anònim $1',
 'enotif_body' => 'Car $WATCHINGUSERNAME,
 
-La pàgina $PAGETITLE dël sit {{SITENAME}} a l\'é stàita $CHANGEDORCREATED al $PAGEEDITDATE da $PAGEEDITOR, che a varda $PAGETITLE_URL për la version corenta.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Resumé dl\'editor: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2266,7 +2283,8 @@ l'avìa travajaje ansima anans che a la scancelèisso.
 'undeletedrevisions' => '{{PLURAL:$1|Na revision pijàita|$1 revision pijàite}} andré',
 'undeletedrevisions-files' => "{{PLURAL:$1|Na|$1}} revision e {{PLURAL:$2|n'|$2&nbsp;}}archivi pijàit andré",
 'undeletedfiles' => "{{PLURAL:$1|N'|$1&nbsp;}}archivi pijàit andaré",
-'cannotundelete' => "Riprìstin falì; a peul esse che i fusse antra doi a felo ant l'istess temp e l'àutr a sia riva prima.",
+'cannotundelete' => 'Riprìstin falì:
+$1',
 'undeletedpage' => "'''$1 a l'é stàit pijait andaré'''
 
 Che as varda ël [[Special:Log/delete|Registr djë scancelament]] për ës-ciairé j'ùltim scancelament e arcuperassion.",
@@ -2297,9 +2315,9 @@ $1",
 'blanknamespace' => '(Prinsipal)',
 
 # Contributions
-'contributions' => "Contribussion dë st'Utent-sì",
+'contributions' => "Contribussion dë st'{{GENDER:$1|utent}}-sì",
 'contributions-title' => 'Contribussion ëd $1',
-'mycontris' => 'Mie contribussion',
+'mycontris' => 'Contribussion',
 'contribsub2' => 'Për $1 ($2)',
 'nocontribs' => "A l'é pa trovasse gnun-a modìfica che a fussa conforma a costi criteri-sì",
 'uctop' => ' (ùltima dla pàgina)',
@@ -2339,7 +2357,7 @@ L'ùltima intrada dël registr dij blocagi a l'é butà sì-sota për arferiment
 'whatlinkshere-hideredirs' => '$1 le ridiression',
 'whatlinkshere-hidetrans' => '$1 anclusion',
 'whatlinkshere-hidelinks' => '$1 anliura',
-'whatlinkshere-hideimages' => '$1 anliure ëd figure',
+'whatlinkshere-hideimages' => "$1 j'archivi lijà",
 'whatlinkshere-filters' => 'Filtr',
 
 # Block/unblock
@@ -2570,6 +2588,7 @@ L'artìcol ëd destinassion «[[:$1]]» a-i é già. Veul-lo scancelelo për av
 'immobile-target-namespace-iw' => "Na liura interwiki a l'é pa na destinassion vàlida për tramudé na pàgina.",
 'immobile-source-page' => 'Sta pàgina-sì as peul pa tramudesse.',
 'immobile-target-page' => 'As peul pa tramudesse vers cost tìtol ëd destinassion.',
+'bad-target-model' => 'La destinassion vorsùa a deuvra un model ëd contnù diferent. As peul pa convertisse da $1 a $2.',
 'imagenocrossnamespace' => "As peul pa tramudesse n'archivi a në spassi nominal diferent",
 'nonfile-cannot-move-to-file' => "As peul nen tramudesse lòn ch'a l'é pa n'archivi a lë spassi nominal dj'archivi",
 'imagetypemismatch' => "La neuva estension ëd l'archivi a corispond pa a sò tipo",
@@ -2700,7 +2719,6 @@ Për piasì, ch'a preuva torna.",
 
 # JavaScriptTest
 'javascripttest' => 'Preuva ëd JavaScript',
-'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' => 'Strutura ëd preuva pa conossùa «$1».',
@@ -2815,6 +2833,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 
 # Info page
 'pageinfo-title' => 'Anformassion për «$1»',
+'pageinfo-not-current' => "J'anformassion a peulo mach esse smonùe për la revision an cors.",
 'pageinfo-header-basic' => 'Anformassion ëd base',
 'pageinfo-header-edits' => 'Modìfiche',
 'pageinfo-header-restrictions' => 'Protession ëd la pàgina',
@@ -2823,6 +2842,7 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 '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-language' => 'Lenga dël contnù dla pàgina',
 'pageinfo-robot-policy' => "Stat dël motor d'arserca",
 'pageinfo-robot-index' => 'Indesàbil',
 'pageinfo-robot-noindex' => 'Nen indesàbil',
@@ -2839,10 +2859,17 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'pageinfo-authors' => "Nùmer d'autor diferent",
 '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 ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Paròla màgica|Paròle màgiche}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorìa|Categorìe}} stërmà ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|stamp contnù|stamp contnù}} ($1)',
+'pageinfo-toolboxlink' => 'Anformassion an sla pàgina',
+'pageinfo-redirectsto' => 'Ridiression-a a',
+'pageinfo-redirectsto-info' => 'anformassion',
+'pageinfo-contentpage' => 'Contà com na pagina ëd contnù',
+'pageinfo-contentpage-yes' => 'É!',
+'pageinfo-protect-cascading' => 'Le protession a son a cascada da sì',
+'pageinfo-protect-cascading-yes' => 'É!',
+'pageinfo-protect-cascading-from' => 'Le protession a son a cascada da',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marché coma verificà',
@@ -2854,6 +2881,8 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'markedaspatrollederror' => 'As peul pa marché coma verificà',
 'markedaspatrollederrortext' => 'A venta che a spessìfica che version che a veul marchè coma verificà.',
 'markedaspatrollederror-noautopatrol' => "A l'ha nen ël përmess dë marchesse soe modìfiche coma «controlà».",
+'markedaspatrollednotify' => "Ës cambi a $1 a l'é stàit marcà com verificà.",
+'markedaspatrollederrornotify' => 'Marcadura com verificà falìa.',
 
 # Patrol log
 'patrol-log-page' => 'Registr dij contròj',
@@ -2917,6 +2946,7 @@ An fasend-lo marcé ansima a sò ordinator chiel a podrìa porteje ëd dann a s
 'hours' => '{{PLURAL:$1|$1 ora|$1 ore}}',
 'days' => '{{PLURAL:$1|$1 di|$1 di}}',
 'ago' => '$1 fa',
+'just-now' => 'pròpi adess',
 
 # Bad image list
 'bad_image_list' => "La forma a l'é costa-sì:
@@ -2977,12 +3007,12 @@ J'àutri a saran stërmà coma stàndard.
 'exif-exifversion' => 'Version dël formà Exif',
 'exif-flashpixversion' => 'A riva a la version Flashpix',
 'exif-colorspace' => 'Spassi dij color',
-'exif-componentsconfiguration' => 'Sust ëd vira component',
+'exif-componentsconfiguration' => 'Significà ëd minca component',
 'exif-compressedbitsperpixel' => 'Sistema ëd compression dle figure',
 'exif-pixelydimension' => 'Larghëssa dla figura',
 'exif-pixelxdimension' => 'Autëssa dla figura',
 'exif-usercomment' => 'Nòte lìbere',
-'exif-relatedsoundfile' => 'Archivi audio colegà',
+'exif-relatedsoundfile' => 'Archivi sonor colegà',
 'exif-datetimeoriginal' => 'Data e ora dla generassion dij dat',
 'exif-datetimedigitized' => 'Data e ora dla digitalisassion',
 'exif-subsectime' => 'Data, ora e frassion ëd second',
@@ -2990,41 +3020,41 @@ J'àutri a saran stërmà coma stàndard.
 'exif-subsectimedigitized' => 'Data e ora ëd digitalisassion, con frassion ëd second',
 'exif-exposuretime' => "Temp d'esposission",
 'exif-exposuretime-format' => '$1 sec ($2)',
-'exif-fnumber' => "Nùmer d'F",
+'exif-fnumber' => 'Duvertura',
 'exif-exposureprogram' => "Programa d'esposission",
-'exif-spectralsensitivity' => 'Sensibilità dë spetro',
+'exif-spectralsensitivity' => 'Sensibilità spetral',
 'exif-isospeedratings' => 'Sensibilità ISO',
-'exif-shutterspeedvalue' => 'Temp dë scat APEX',
-'exif-aperturevalue' => 'Diaframa APEX',
+'exif-shutterspeedvalue' => "Temp dë scat ëd l'APEX",
+'exif-aperturevalue' => "Diaframa ëd l'APEX",
 'exif-brightnessvalue' => 'Luminosità APEX',
 'exif-exposurebiasvalue' => "Coression dl'esposission",
-'exif-maxaperturevalue' => 'Apertura màssima',
+'exif-maxaperturevalue' => 'Duvertura màssima',
 'exif-subjectdistance' => 'Distansa dël soget',
 'exif-meteringmode' => "Càlcol dl'espossision",
 'exif-lightsource' => "Sorgiss d'anluminassion",
-'exif-flash' => 'Flash',
-'exif-focallength' => 'Lunghëssa focal dle lent',
+'exif-flash' => 'Lòsna',
+'exif-focallength' => 'Longheur focal dle lent',
 'exif-subjectarea' => "Spassi d'anquadratura dël soget",
-'exif-flashenergy' => 'Potensa dël flash',
-'exif-focalplanexresolution' => 'Resolussion dla coordinà X ant sël pian dla focal',
-'exif-focalplaneyresolution' => 'Resolussion dla coordinà Y ant sël pian dla focal',
+'exif-flashenergy' => 'Energìa dla lòsna',
+'exif-focalplanexresolution' => 'Arzolussion dla coordinà X ant sël pian dla focal',
+'exif-focalplaneyresolution' => 'Arzolussion dla coordinà Y ant sël pian dla focal',
 'exif-focalplaneresolutionunit' => "Unità d'amzura për ël pian dla focal",
 'exif-subjectlocation' => 'Posission dël soget',
 'exif-exposureindex' => "Ìndes dl'esposission",
-'exif-sensingmethod' => 'Metod ëd campionament',
+'exif-sensingmethod' => 'Métod ëd campionament',
 'exif-filesource' => "Sorgiss dl'archivi",
 'exif-scenetype' => "Sòrt d'anquadratura",
 'exif-customrendered' => 'Process dla figura particolar',
 'exif-exposuremode' => "Modalità dl'esposission",
 'exif-whitebalance' => 'Balansa dël bianch',
-'exif-digitalzoomratio' => 'Rapòrt ëd lë zoom digital',
-'exif-focallengthin35mmfilm' => 'Lunghëssa focal an film da 35 mm',
+'exif-digitalzoomratio' => "Rapòrt ëd l'avzinament digital",
+'exif-focallengthin35mmfilm' => 'Longheur focal an na pelìcola da 35 mm',
 'exif-scenecapturetype' => 'Sistema ëd campionament',
-'exif-gaincontrol' => 'Contròl ëd sienari',
+'exif-gaincontrol' => 'Contròl dël senari',
 'exif-contrast' => 'Contrast',
 'exif-saturation' => 'Saturassion',
 'exif-sharpness' => 'Definission dij bòrd',
-'exif-devicesettingdescription' => "Nòm dla configurassion dl'aparechiatura",
+'exif-devicesettingdescription' => "Descrission dla configurassion dl'angign",
 'exif-subjectdistancerange' => 'Ragg ëd distansa dël soget',
 'exif-imageuniqueid' => 'Identificator ùnich dla figura',
 'exif-gpsversionid' => 'Version dël GPS',
@@ -3039,7 +3069,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-gpsstatus' => 'Condission dël ricevitor',
 'exif-gpsmeasuremode' => "Sistema d'amzura",
 'exif-gpsdop' => "Precision dl'amzura",
-'exif-gpsspeedref' => "Unità d'amzura për la velocità",
+'exif-gpsspeedref' => "Unità d'amzura për l'andi",
 'exif-gpsspeed' => 'Velocità dël ricevitor GPS',
 'exif-gpstrackref' => 'Arferiment për la diression dël moviment',
 'exif-gpstrack' => 'Diression dël moviment',
@@ -3051,7 +3081,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-gpsdestlongituderef' => 'Arferiment për la longitùdin dla destinassion',
 'exif-gpsdestlongitude' => 'Longitùdin dla destinassion',
 'exif-gpsdestbearingref' => "Arferiment për l'orientament a destinassion",
-'exif-gpsdestbearing' => 'Orientament anvers a la destinassion',
+'exif-gpsdestbearing' => 'Orientament vers la destinassion',
 'exif-gpsdestdistanceref' => "Arferiment për la lontanansa da 'nt la destinassion",
 'exif-gpsdestdistance' => "Lontanansa da 'nt la destinassion",
 'exif-gpsprocessingmethod' => 'Nòm dël sistema ëd process an GPS',
@@ -3062,7 +3092,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-keywords' => 'Paròle ciav',
 'exif-worldregioncreated' => "Region dël mond anté che la fòto a l'é stàita pijà",
 'exif-countrycreated' => "Pais anté che la fòto a l'é stàita fàita",
-'exif-countrycodecreated' => "Còdes dëlpais anté che la fòto a l'é stàita pijà",
+'exif-countrycodecreated' => "Còdes dël pais anté che la fòto a l'é stàita pijà",
 'exif-provinceorstatecreated' => "Provinsa o stat anté che la fòto a l'é stàita pijà",
 'exif-citycreated' => "Sità anté che la fòto a l'é stàita pijà",
 'exif-sublocationcreated' => "Borgh ëd la sità anté che la fòto a l'é stàita pijà",
@@ -3079,7 +3109,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-source' => 'Sorgiss',
 'exif-editstatus' => 'Stat ëd modìfica dla figura',
 'exif-urgency' => 'Pressa',
-'exif-fixtureidentifier' => 'Nòm utiss',
+'exif-fixtureidentifier' => 'Nòm element arcorent',
 'exif-locationdest' => 'Locassion fotografà',
 'exif-locationdestcode' => 'Còdes ëd la locassion fotografà',
 'exif-objectcycle' => "Ora dël di ëd destinassion d'ës mojen",
@@ -3095,7 +3125,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-identifier' => 'Identificator',
 'exif-lens' => 'Lent dovrà',
 'exif-serialnumber' => 'Nùmer serial ëd la màchina fotogràfica',
-'exif-cameraownername' => 'Padron ëd la màchina fotogràfica',
+'exif-cameraownername' => 'Propietari ëd la màchina fotogràfica',
 'exif-label' => 'Tichëtta',
 'exif-datetimemetadata' => "Quand ij metadat a son stàit modificà l'ùltima vira",
 'exif-nickname' => 'Nòm anformal ëd la figura',
@@ -3103,12 +3133,12 @@ J'àutri a saran stërmà coma stàndard.
 'exif-rightscertificate' => 'Sertificà ëd gestion dij drit',
 'exif-copyrighted' => "Stat dël drit d'autor",
 'exif-copyrightowner' => "Titolar dël drit d'autor",
-'exif-usageterms' => "Termo d'usagi",
-'exif-webstatement' => "Diciarassion an linia dël drit d'autor",
-'exif-originaldocumentid' => 'ID unìvoch dël document original',
+'exif-usageterms' => "Condission d'utilisassion",
+'exif-webstatement' => "Diciarassion ëd drit d'autor an linia",
+'exif-originaldocumentid' => 'Identificativ ùnich dël papé original',
 'exif-licenseurl' => "Anliura ëd la licensa dij drit d'autor",
-'exif-morepermissionsurl' => 'Anformassion an sle license alternativa',
-'exif-attributionurl' => "Quand as deuvra torna cost travaj, për piasì ch'a-j buta l'anliura a",
+'exif-morepermissionsurl' => 'Anformassion an sle license alternative',
+'exif-attributionurl' => "An dovrand n'àutra vira cost travaj, për piasì ch'a-j buta l'anliura a",
 'exif-preferredattributionname' => "Quand as deuvra torna cost travaj, për piasì dé l'arconossiment a",
 'exif-pngfilecomment' => "Coment ëd l'archivi PNG",
 'exif-disclaimer' => 'Avis',
@@ -3120,11 +3150,11 @@ J'àutri a saran stërmà coma stàndard.
 'exif-event' => 'Event fotografà',
 'exif-organisationinimage' => 'Organisassion fotografà',
 'exif-personinimage' => 'Përson-a fotografà',
-'exif-originalimageheight' => "Autëssa dla figura prima ch'a sia ritajà",
-'exif-originalimagewidth' => "Larghëssa dla figura prima ch'a sia ritajà",
+'exif-originalimageheight' => "Autëssa dla figura prima ch'a fussa ritajà",
+'exif-originalimagewidth' => "Larghëssa dla figura prima ch'a fussa ritajà",
 
 # EXIF attributes
-'exif-compression-1' => 'Pa compress',
+'exif-compression-1' => 'Nen comprimù',
 'exif-compression-2' => "CCITT Partìa 3 longheur dla codìfica d'esecussion dla codìfica Huffman modificà ëd dimension 1",
 'exif-compression-3' => 'CCITT Partìa 3 codìfica dël fax',
 'exif-compression-4' => 'CCITT Partìa 4 codìfica dël fax',
@@ -3135,15 +3165,15 @@ J'àutri a saran stërmà coma stàndard.
 'exif-unknowndate' => 'Data nen conossùa',
 
 'exif-orientation-1' => 'Normal',
-'exif-orientation-2' => 'Specolar',
+'exif-orientation-2' => 'A specc',
 'exif-orientation-3' => 'Arvirà ëd 180°',
-'exif-orientation-4' => 'Arvirà dzorsuta',
-'exif-orientation-5' => 'Arvirà dzorsota e ëd 90° contramostra',
+'exif-orientation-4' => 'Arvirà dzor-sota',
+'exif-orientation-5' => 'Arvirà dzor-sota e ëd 90° contramostra',
 'exif-orientation-6' => 'Arvirà ëd 90° contramostra',
-'exif-orientation-7' => 'Arvirà dzorsota e ëd 90° ant ël sens dla mostra',
+'exif-orientation-7' => 'Arvirà dzor-sota e ëd 90° ant ël sens dla mostra',
 'exif-orientation-8' => 'Arvirà ëd 90° ant ël sens dla mostra',
 
-'exif-planarconfiguration-1' => 'për blòch (chunky)',
+'exif-planarconfiguration-1' => 'dàit a blòch',
 'exif-planarconfiguration-2' => 'an planar',
 
 'exif-xyresolution-i' => '$1 pont për pòles (dpi)',
@@ -3158,29 +3188,29 @@ J'àutri a saran stërmà coma stàndard.
 'exif-exposureprogram-2' => 'Programa normal',
 'exif-exposureprogram-3' => 'Priorità ëd temp',
 'exif-exposureprogram-4' => 'Priorità ëd diaframa',
-'exif-exposureprogram-5' => "Programa creativ (coregiù për avej pì ëd profondità 'd camp)",
-'exif-exposureprogram-6' => "Programa d'assion (coregiù për avej ël temp pì curt che as peul)",
-'exif-exposureprogram-7' => 'Programa ritrat (për fotografìe pijaite da davsin, con lë sfond fòra feu)',
+'exif-exposureprogram-5' => "Programa creativ (coregiù për avèj pì ëd profondità 'd camp)",
+'exif-exposureprogram-6' => "Programa d'assion (coregiù për avèj ël temp pì curt che as peul)",
+'exif-exposureprogram-7' => 'Programa ritrat (për fotografìe pijàite da davzin, con lë sfond fòra feu)',
 'exif-exposureprogram-8' => 'Panorama (sogèt lontan e con lë sfond a feu)',
 
 'exif-subjectdistance-value' => '$1 méter',
 
-'exif-meteringmode-0' => 'Pa conossù',
+'exif-meteringmode-0' => 'Dësconossù',
 'exif-meteringmode-1' => 'Media',
 'exif-meteringmode-2' => 'Media centrà',
-'exif-meteringmode-3' => 'Quadrèt (Spot)',
-'exif-meteringmode-4' => 'Vàire quadrèt (MultiSpot)',
-'exif-meteringmode-5' => 'Schema (Pattern)',
+'exif-meteringmode-3' => 'Quadrèt',
+'exif-meteringmode-4' => 'Vàire quadrèt',
+'exif-meteringmode-5' => 'Schema',
 'exif-meteringmode-6' => 'Parsial',
 'exif-meteringmode-255' => "n'àutr",
 
-'exif-lightsource-0' => 'Pa conossù',
+'exif-lightsource-0' => 'Dësconossùa',
 'exif-lightsource-1' => 'Lus dël dì',
 'exif-lightsource-2' => 'Fluoressenta',
 'exif-lightsource-3' => 'Lus al tungsten (a incandessensa)',
-'exif-lightsource-4' => 'Flash',
+'exif-lightsource-4' => 'Lòsna',
 'exif-lightsource-9' => 'Temp bel',
-'exif-lightsource-10' => 'Temp an-nivolà',
+'exif-lightsource-10' => 'Temp nìvol',
 'exif-lightsource-11' => 'Ombra',
 'exif-lightsource-12' => 'Fluoressensa tipo lus dël dì (D 5700 – 7100K)',
 'exif-lightsource-13' => 'Fluoressensa bianca për ël dì (N 4600 – 5400K)',
@@ -3193,22 +3223,22 @@ J'àutri a saran stërmà coma stàndard.
 'exif-lightsource-21' => 'Anluminant D65',
 'exif-lightsource-22' => 'Anluminant D75',
 'exif-lightsource-23' => 'Anluminant D50',
-'exif-lightsource-24' => 'Làmpada da studio ISO al tungsten',
-'exif-lightsource-255' => "tra sorgiss d'anluminassion",
+'exif-lightsource-24' => 'Làmpada da studi ISO al tungsten',
+'exif-lightsource-255' => "Àutra sorgiss d'anluminassion",
 
 # Flash modes
-'exif-flash-fired-0' => "Ël flash a l'é pa scatà",
-'exif-flash-fired-1' => 'Flash scatà',
-'exif-flash-return-0' => "Gnun-e fonsion ëd rilevassion dl'artorn ëd lë stroboscòpi",
-'exif-flash-return-2' => "lus stoboscòpica d'artorn pa arlevà",
-'exif-flash-return-3' => "lus stroboscòpica d'artorn arlevà",
-'exif-flash-mode-1' => 'scat dël flash sforsà',
-'exif-flash-mode-2' => 'eliminassion dël flash sforsà',
+'exif-flash-fired-0' => "La lòsna a l'é nen ëscatà",
+'exif-flash-fired-1' => "La lòsna a l'ha scatà",
+'exif-flash-return-0' => "gnun ëstroboscòpi a dà andaré na fonsion d'artrovament",
+'exif-flash-return-2' => "lë stoboscòpi a arleva gnun-a lus d'artorn",
+'exif-flash-return-3' => "lë stroboscòpi a l'ha arlevà n'artorn ëd lus",
+'exif-flash-mode-1' => 'lus dla lòsna obligatòria',
+'exif-flash-mode-2' => 'eliminassion dla lòsna obligatòria',
 'exif-flash-mode-3' => 'manera automàtica',
-'exif-flash-function-1' => 'Gnente fonsion flash',
+'exif-flash-function-1' => 'Gnun-a fonsion ëd lòsna',
 'exif-flash-redeye-1' => "Manera ëd ridussion ëd j'euj ross",
 
-'exif-focalplaneresolutionunit-2' => 'pòles anglèis (inches)',
+'exif-focalplaneresolutionunit-2' => 'pòles anglèis',
 
 'exif-sensingmethod-1' => 'Nen definì',
 'exif-sensingmethod-2' => 'Sensor dlë spassi color a 1 processor',
@@ -3227,7 +3257,7 @@ J'àutri a saran stërmà coma stàndard.
 
 'exif-exposuremode-0' => 'Esposission automàtica',
 'exif-exposuremode-1' => 'Esposission manual',
-'exif-exposuremode-2' => 'Esposission automàtica (auto bracket)',
+'exif-exposuremode-2' => 'Forciolin-a automàtica',
 
 'exif-whitebalance-0' => "Balansa dël bianch n'automàtich",
 'exif-whitebalance-1' => 'Balansa dël bianch an manual',
@@ -3240,11 +3270,11 @@ J'àutri a saran stërmà coma stàndard.
 'exif-gaincontrol-0' => 'Gnun',
 'exif-gaincontrol-1' => 'Sparé ij contrast bass',
 'exif-gaincontrol-2' => 'Sparé ij contrast fòrt',
-'exif-gaincontrol-3' => 'Bassé ij contrast bass',
-'exif-gaincontrol-4' => 'Bassé ij contrast fòrt',
+'exif-gaincontrol-3' => 'Sbassé ij contrast bass',
+'exif-gaincontrol-4' => 'Sbassé ij contrast fòrt',
 
 'exif-contrast-0' => 'Normal',
-'exif-contrast-1' => 'dosman',
+'exif-contrast-1' => 'Doss',
 'exif-contrast-2' => 'contrastà fòrt',
 
 'exif-saturation-0' => 'Normal',
@@ -3255,8 +3285,8 @@ J'àutri a saran stërmà coma stàndard.
 'exif-sharpness-1' => 'dossa',
 'exif-sharpness-2' => 'contrastà',
 
-'exif-subjectdistancerange-0' => 'Pa conossù',
-'exif-subjectdistancerange-1' => 'Macro',
+'exif-subjectdistancerange-0' => 'Dësconossùa',
+'exif-subjectdistancerange-1' => 'Motobin davzin',
 'exif-subjectdistancerange-2' => 'Prim pian',
 'exif-subjectdistancerange-3' => 'Anquadratura a soget lontan',
 
@@ -3281,7 +3311,7 @@ J'àutri a saran stërmà coma stàndard.
 # Pseudotags used for GPSSpeedRef
 'exif-gpsspeed-k' => 'Km/h',
 'exif-gpsspeed-m' => 'mija/h',
-'exif-gpsspeed-n' => 'Grop (marin)',
+'exif-gpsspeed-n' => 'Grop',
 
 # Pseudotags used for GPSDestDistanceRef
 'exif-gpsdestdistance-k' => 'Chilòmeter',
@@ -3299,7 +3329,7 @@ J'àutri a saran stërmà coma stàndard.
 'exif-objectcycle-b' => 'Sia matin che dòp-mesdì',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
-'exif-gpsdirection-t' => 'Diression vèira',
+'exif-gpsdirection-t' => 'Diression vera',
 'exif-gpsdirection-m' => 'Diression magnética',
 
 'exif-ycbcrpositioning-1' => 'Sentrà',
@@ -3337,13 +3367,13 @@ J'àutri a saran stërmà coma stàndard.
 'exif-iimcategory-wea' => 'Temp',
 
 'exif-urgency-normal' => 'Normal ($1)',
-'exif-urgency-low' => 'Bass ($1)',
+'exif-urgency-low' => 'Bassa ($1)',
 'exif-urgency-high' => 'Àuta ($1)',
 'exif-urgency-other' => "Priorità definìa da l'utent ($1)",
 
 # External editor support
 'edit-externally' => "Modifiché st'archivi con un programa estern",
-'edit-externally-help' => "(Varda [//www.mediawiki.org/wiki/Manual:External_editors setup instructions] për avej pì d'anformassion)",
+'edit-externally-help' => "(Lese [//www.mediawiki.org/wiki/Manual:External_editors j'anstrussion d'anstalassion] për avèj pì d'anformassion)",
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'tute',
@@ -3354,90 +3384,91 @@ J'àutri a saran stërmà coma stàndard.
 # E-mail address confirmation
 'confirmemail' => "Confermé l'adrëssa postal",
 'confirmemail_noemail' => "A l'ha pa butà gnun-a adrëssa vàlida ëd pòsta eletrònica ant ij [[Special:Preferences|sò gust]].",
-'confirmemail_text' => "Costa wiki a ciama che chiel a convalida n'adrëssa postal anans che
-dovré lòn che toca la pòsta. Che a sgnaca ël boton ambelessì sota
-për fesse mandé un messa ëd conferma a soa adrëssa eletrònica.
-Andrinta al messagi a-i sara n'anliura (URL) con andrinta un còdes.
-Che a deurba st'anliura andrinta a sò programa ëd navigassion (browser)
+'confirmemail_text' => "Costa wiki a ciama che chiel a convàlida n'adrëssa ëd pòsta eletrònica anans che
+dovré lòn che a toca la pòsta. Che a sgnaca ël boton ambelessì-sota
+për fesse mandé un mëssage ëd conferma a soa adrëssa eletrònica.
+Andrinta al messagi a-i sara n'anliura con andrinta un còdes.
+Che a deurba st'anliura andrinta a sò programa ëd navigassion
 për confermé che soa adrëssa a l'é pròpe cola.",
 'confirmemail_pending' => "I l'oma già mandaje sò còdes ëd conferma;
-se a l'ha pen-a creasse sò cont, miraco a venta che a speta dontre minute che a-j riva ant la pòsta, nopà che ciamene un neuv.",
-'confirmemail_send' => 'Manda un còdes ëd conferma për pòsta eletrònica',
-'confirmemail_sent' => "Ël messagi ëd conferma a l'é stait mandà.",
-'confirmemail_oncreate' => "Un còdes ëd conferma a l'é stait mandà a soa adrëssa ëd pòsta eletrònica.
-D'ës còdes a fa pa dë manca për rintré ant ël sistema, ma a ventrà che a lo mostra al sistema për podej abilité cole funsion dla wiki che a son basà ant sla pòsta eletrònica.",
-'confirmemail_sendfailed' => "{{SITENAME}} a l'ha pa podù mandete l'e-mail ëd conferma.
+se a l'ha pen-a creasse sò cont, miraco a venta che a speta dontré minute che a-j riva ant la pòsta, nopà che ciamene un neuv.",
+'confirmemail_send' => 'Mandé un còdes ëd conferma për pòsta eletrònica',
+'confirmemail_sent' => "Ël mëssagi ëd conferma a l'é stàit mandà.",
+'confirmemail_oncreate' => "Un còdes ëd conferma a l'é stàit mandà a soa adrëssa ëd pòsta eletrònica.
+D'ës còdes a fa pa dë manca për rintré ant ël sistema, ma a ventrà che a lo mostra al sistema për podèj abilité cole funsion dla wiki che a son basà ant sla pòsta eletrònica.",
+'confirmemail_sendfailed' => "{{SITENAME}} a l'ha pa podù mandeje ël mëssagi ëd conferma.
 Che a controla l'adrëssa che a l'ha dane, mai che a-i fusso dij caràter nen vàlid.
 
-Ël programa ëd pòsta a l'ha arspondù: $1",
+Ël programa ëd pòsta a l'ha spondù: $1",
 'confirmemail_invalid' => 'Còdes ëd conferma nen vàlid. A podrìa ëdcò mach esse scadù.',
-'confirmemail_needlogin' => 'A venta che a fasa $1 për confermé soa addrëssa postal eletrònica.',
-'confirmemail_success' => "Soa adrëssa postal a l'é staita confermà, adess a peul rintré ant ël sistema e i-j auguroma da fessla bin ant la wiki!",
+'confirmemail_needlogin' => 'A venta $1 për confermé soa adrëssa ëd pòsta eletrònica.',
+'confirmemail_success' => "Soa adrëssa a l'é stàita confermà, adess a peul [[Special:UserLogin|rintré ant ël sistema]] e i-j auguroma da fessla bin ant la wiki!",
 'confirmemail_loggedin' => "Motobin mersì. Soa adrëssa ëd pòsta eletrònica adess a l'é confermà.",
-'confirmemail_error' => "Cheich-còs a l'é andà mal ën salvand soa conferma.",
+'confirmemail_error' => "Cheicòs a l'é andà mal ën salvand soa conferma.",
 'confirmemail_subject' => "Conferma dl'adrëssa postal da 'nt la {{SITENAME}}",
-'confirmemail_body' => "Cheidun, a l'é belfé che a sia stait pròpe chiel (ò chila), da 'nt l'adrëssa IP \$1,
-a l'ha doertà un cont utent \"\$2\" ansima a {{SITENAME}}, lassand-ne st'adrëssa ëd pòsta eletrònica-sì.
+'confirmemail_body' => "Cheidun, a l'é belfé che a sia stàit pròpe chiel, da 'nt l'adrëssa IP $1,
+a l'ha duvertà un cont utent «$2» ansima a {{SITENAME}}, lassand-ne st'adrëssa ëd pòsta eletrònica-sì.
 
 Për confermé che ës cont a l'é da bon sò e për ativé
-le possibilità corelà a la pòsta eletrònica ansima a {{SITENAME}}, che a deurba st'adrëssa-sì andrinta a sò programa ëd navigassion (browser):
+le possibilità gropà a la pòsta eletrònica ansima a {{SITENAME}}, che a deurba st'adrëssa-sì andrinta a sò programa ëd navigassion:
 
-\$3
+$3
 
-Se a fussa *nen* stait chiel a deurbe ël cont, anlora che a vada daré a sto colegament-sì
-për scanselé la conferma ëd l'adrëssa e-mail:
+Se a fussa *nen* stàit chiel a deurbe ël cont, anlora che a vada dapress a la liura sì-sota
+për scancelé la conferma ëd l'adrëssa ëd pòsta eletrònica:
 
-\$5
+$5
 
-Cost còdes ëd conferma a l'é bon fin-a al \$4.",
-'confirmemail_body_changed' => "Cheidun, a l'é belfé ch'a sia chiel, da l'adrëssa IP \$1,
-a l'ha cangià l'adrëssa ëd pòsta eletrònica dël cont \"\$2\" con st'adrëssa-sì dzora a {{SITENAME}}.
+Cost còdes ëd conferma a l'é bon fin-a al $4.",
+'confirmemail_body_changed' => "Cheidun, a l'é belfé ch'a sia chiel, da l'adrëssa IP $1,
+a l'ha cangià l'adrëssa ëd pòsta eletrònica dël cont «$2» con st'adrëssa-sì dzora a {{SITENAME}}.
 
 Për confirmé che sto cont-sì a l'é pròpi sò e për riativé
-le possibilità ëd pòsta eletrònica dzora a {{SITENAME}}, ch'a deurba sto colegament-sì an sò navigador:
+le fonsion ëd pòsta eletrònica dzora a {{SITENAME}}, ch'a deurba costa liura-sì an sò navigador:
 
-\$3
+$3
 
-Se ël cont a l'é *nen* sò, ch'a vada andré a sto colegament-sì
+Se ël cont a l'é *nen* sò, ch'a-i vada dapress a costa liura-sì
 për scancelé la conferma dl'adrëssa ëd pòsta eletrònica:
 
-\$5
+$5
 
-Ës còdes ëd conferma a scadrà a \$4.",
-'confirmemail_body_set' => "Quaidun, miraco chiel, da l'adrëssa IP \$1,
-a l'ha ampostà l'adrëssa ëd pòsta eletrònica dël cont \"\$2\" con costa adrëssa su {{SITENAME}}.
+Ës còdes ëd conferma a scadrà ël $4.",
+'confirmemail_body_set' => "Quaidun, miraco chiel, da l'adrëssa IP $1,
+a l'ha ampostà l'adrëssa ëd pòsta eletrònica dël cont «$2» con costa adrëssa su {{SITENAME}}.
 
 Për confirmé che sto cont a l'é pròpi sò e ativé torna
 le funsion ëd pòsta eletrònica su {{SITENAME}}, ch'a duverta cost'anliura an sò navigador:
 
-\$3
+$3
 
 Se ël cont a l'é *pa* sò, ch'a-j vada dapress a st'anliura
 për scancelé la conferma ëd l'adrëssa ëd pòsta eletrònica:
 
-\$5
+$5
 
-Cost còdes ëd conferma a scad ai \$4.",
-'confirmemail_invalidated' => "Conferma ëd l'adrëssa e-mail scanselà",
-'invalidateemail' => "Scansela l'e-mail ëd conferma",
+Cost còdes ëd conferma a scad ai $4.",
+'confirmemail_invalidated' => "Conferma ëd l'adrëssa ëd pòsta eletrònica anulà",
+'invalidateemail' => "Anulé la conferma dl'adrëssa ëd pòsta eletrònica",
 
 # Scary transclusion
 'scarytranscludedisabled' => "[L'inclusion ëd pàgine antra wiki diferente a l'é nen abilità]",
 'scarytranscludefailed' => "[Darmagi, ma lë stamp $1 a l'é pa podusse carié]",
-'scarytranscludetoolong' => "[L'URL a l'é tròp longa]",
+'scarytranscludefailed-httpstatus' => '[Letura dlë stamp falìa për $1: HTTP $2]',
+'scarytranscludetoolong' => "[L'adrëssa dl'aragnà a l'é tròp longa]",
 
 # Delete conflict
-'deletedwhileediting' => "'''Avertensa''': sta pàgina-sì a l'é staita scancelà quand che chiel (chila) a l'avìa già anandiasse a modifichela!",
-'confirmrecreate' => "L'utent [[User:$1|$1]] ([[User talk:$1|talk]]) a l'ha scancelà st'articol-sì quand che chiel (chila) a l'avia già anandiasse a modifichelo, dand coma motiv ëd la scancelament:
+'deletedwhileediting' => "'''Avertensa''': sta pàgina-sì a l'é stàita scancelà quand che chiel a l'avìa già anandiasse a modifichela!",
+'confirmrecreate' => "L'utent [[User:$1|$1]] ([[User talk:$1|talk]]) a l'ha scancelà st'articol-sì quand che chiel a l'avia già anandiasse a modifichelo, dasend coma motiv ëd lë scancelament:
 ''$2''
 Për piasì, che an conferma che da bon a veul torna creélo.",
 'confirmrecreate-noreason' => "L'utent [[User:$1|$1]] ([[User talk:$1|ciaciarade]]) a l'ha scancelà sta pàgina apress che chiel a l'ha ancaminà a modifiché.  Për piasì, ch'a confirma ch'a veul pròpi torna creé sta pàgina.",
-'recreate' => "Créa n'àutra vira",
+'recreate' => 'Creé torna',
 
 # action=purge
 'confirm_purge_button' => 'Va bin',
-'confirm-purge-top' => 'Veujdé la memorisassion dë sta pàgina-sì?',
-'confirm-purge-bottom' => 'Spurghé na pàgina a scansela la "cache" e a fà aparì le revision pì neuve.',
+'confirm-purge-top' => 'Dësvujdé la memorisassion dë sta pàgina-sì?',
+'confirm-purge-bottom' => 'Spurghé na pàgina a scancela la memorisassion local e a fà comparì la revision pì neuva.',
 
 # action=watch/unwatch
 'confirm-watch-button' => 'Va bin',
@@ -3448,8 +3479,8 @@ Për piasì, che an conferma che da bon a veul torna creélo.",
 # Multipage image navigation
 'imgmultipageprev' => '← pàgina andré',
 'imgmultipagenext' => 'pàgina anans →',
-'imgmultigo' => 'Va',
-'imgmultigoto' => ' a la pàgina $1',
+'imgmultigo' => 'Andé!',
+'imgmultigoto' => 'Andé a la pàgina $1',
 
 # Table pager
 'ascending_abbrev' => 'a chërse',
@@ -3459,12 +3490,12 @@ Për piasì, che an conferma che da bon a veul torna creélo.",
 'table_pager_first' => 'Prima pàgina',
 'table_pager_last' => 'Ùltima pàgina',
 'table_pager_limit' => 'Smon-me $1 archivi për pàgina',
-'table_pager_limit_label' => 'Oget për pàgina:',
-'table_pager_limit_submit' => 'Va',
-'table_pager_empty' => 'Pa gnun arsultà',
+'table_pager_limit_label' => 'Arzultà për pàgina:',
+'table_pager_limit_submit' => 'Andé',
+'table_pager_empty' => 'Gnun arzultà',
 
 # Auto-summaries
-'autosumm-blank' => 'Pàgina dësveujdà',
+'autosumm-blank' => 'Pàgina dësvujdà',
 'autosumm-replace' => "Pàgina cambià con '$1'",
 'autoredircomment' => 'Ridiression anvers a [[$1]]',
 'autosumm-new' => "Creà la pàgina con '$1'",
@@ -3478,39 +3509,40 @@ Për piasì, che an conferma che da bon a veul torna creélo.",
 # Live preview
 'livepreview-loading' => "Antramentr ch'as caria…",
 'livepreview-ready' => "Antramentr ch'as caria… Carià.",
-'livepreview-failed' => 'La "preuva dal viv" a l\'é falìa!
-Ch\'a preuva an manera sòlita.',
-'livepreview-error' => 'Conession falà: $1 "$2"
-Ch\'a preuva an manera sòlita.',
+'livepreview-failed' => "La preuva dal viv a l'é falìa!
+Ch'a preuva an manera sòlita.",
+'livepreview-error' => "Conession falìa: $1 «$2».
+Ch'a preuva an manera sòlita.",
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Le modìfiche pì neuve ëd $1 {{PLURAL:$1|second|second}} a podrìo nen ess-ie ant sta lista-sì.',
-'lag-warn-high' => "Për via che la màchina serventa a tarda a dene d'arspòsta, le modìfiche pì giovne che $1 {{PLURAL:$1|second|second}} fa
-a podrìo ëdcò nen ess-ie ant sta lista -sì.",
+'lag-warn-normal' => 'Le modìfiche pì neuve ëd $1 {{PLURAL:$1|second}} a podrìo nen ess-ie ant sta lista-sì.',
+'lag-warn-high' => "Për via che la màchina serventa a tarda a dene d'arspòsta, le modìfiche fàite men che $1 {{PLURAL:$1|second}} fa
+a podrìo ëdcò nen ess-ie ant sta lista-sì.",
 
 # Watchlist editor
-'watchlistedit-numitems' => "A l'é antramentr ch'a ten sot ëuj {{PLURAL:$1|1 tìtol|$1 tìtoj}}, nen contand le pàgine ëd discussion.",
-'watchlistedit-noitems' => "A-i é pa gnun tìtol ch'as ten-a sot euj.",
-'watchlistedit-normal-title' => "Modifiché la lista ëd lòn ch'as ten sot euj",
-'watchlistedit-normal-legend' => "Gavé via ij tìtoj da 'nt la lista ëd lòn ch'as ten sot euj",
-'watchlistedit-normal-explain' => "Ij tìtoj ch'a ten sot euj a son ësmonù ambelessì-sota. Për gavene via un ch'a-i fasa la crosëtta ant la casela ch'a l'ha aranda, e peuj ch'ai bata ansima a «{{int:Watchlistedit-normal-submit}}». As peul ëdcò [[Special:EditWatchlist/raw|modifiché la lista ampressa]].",
+'watchlistedit-numitems' => "A l'é antramentr ch'a ten sot-euj {{PLURAL:$1|1 tìtol|$1 tìtoj}}, nen contand le pàgine ëd discussion.",
+'watchlistedit-noitems' => "A-i é pa gnun tìtol ch'as ten-a sot-euj.",
+'watchlistedit-normal-title' => "Modifiché la lista ëd lòn ch'as ten sot-euj",
+'watchlistedit-normal-legend' => "Gavé via ij tìtoj da 'nt la lista ëd lòn ch'as ten sot-euj",
+'watchlistedit-normal-explain' => "Ij tìtoj ch'a ten sot-euj a son ësmonù ambelessì-sota.
+Për gavene via un, ch'a-j fasa la crosëtta ant la casela ch'a l'ha aranda, e peuj ch'ai bata ansima a «{{int:Watchlistedit-normal-submit}}». As peul ëdcò [[Special:EditWatchlist/raw|modifiché la lista ampressa]].",
 'watchlistedit-normal-submit' => 'Gavé via ij tìtoj',
-'watchlistedit-normal-done' => "{{PLURAL:$1|1 tìtol a l'é|$1 tìtoj a son}} stait gavà via da 'nt la lista ëd lòn ch'as ten sot euj:",
-'watchlistedit-raw-title' => "Modifiché ampressa la lista ëd lòn ch'as ten sot euj",
-'watchlistedit-raw-legend' => "Modifiché ampressa la lista ëd lòn ch'as ten sot euj",
-'watchlistedit-raw-explain' => "Ij tìtoj ch'a l'é antramentr ch'as ten sot euj a son ambelessì-sota, e a peulo modifichesse ën giontand-ne e gavand-ne via da 'nt la lista; un tìtol për riga.
-Quand a l'ha finì, ch'a-i bata ansima a \"{{int:Watchlistedit-raw-submit}}\".
+'watchlistedit-normal-done' => "{{PLURAL:$1|Un tìtol a l'é|$1 tìtoj a son}} ëstàit gavà via da 'nt la lista ëd lòn ch'as ten sot-euj:",
+'watchlistedit-raw-title' => "Modifiché ampressa la lista ëd lòn ch'as ten sot-euj",
+'watchlistedit-raw-legend' => "Modìfica lesta ëd la lista ëd lòn ch'as ten sot-euj",
+'watchlistedit-raw-explain' => "Ij tìtoj ch'a l'é antramentr ch'as ten sot-euj a son ambelessì-sota, e a peulo modifichesse ën giontand-ne e gavand-ne via da 'nt la lista; un tìtol për riga.
+Quand a l'ha finì, ch'a-i bata ansima a «{{int:Watchlistedit-raw-submit}}».
 As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
 'watchlistedit-raw-titles' => 'Tìtoj:',
 'watchlistedit-raw-submit' => 'Agiorné la Lista',
-'watchlistedit-raw-done' => "La lista ëd lòn ch'as ten sot euj a l'é staita agiornà.",
-'watchlistedit-raw-added' => "A {{PLURAL:$1|l'é|son}} giontasse {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
-'watchlistedit-raw-removed' => "A {{PLURAL:$1|l'é|son}} gavasse via {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
+'watchlistedit-raw-done' => "La lista ëd lòn ch'as ten sot-euj a l'é stàita agiornà.",
+'watchlistedit-raw-added' => "{{PLURAL:$1|A l'é|As son}} giontasse {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
+'watchlistedit-raw-removed' => "{{PLURAL:$1|A l'é|As son}} gavasse via {{PLURAL:$1|1 tìtol|$1 tìtoj}}:",
 
 # Watchlist editing tools
 'watchlisttools-view' => 'S-ciairé le modifiché amportante',
-'watchlisttools-edit' => "Vardé e modifiché la lista ëd lòn ch'as ten sot euj",
-'watchlisttools-raw' => "Modifiché ampressa la lista ëd lòn ch'as ten sot euj",
+'watchlisttools-edit' => "Vardé e modifiché la lista ëd lòn ch'as ten sot-euj",
+'watchlisttools-raw' => "Modifiché ampressa la lista ëd lòn ch'as ten sot-euj",
 
 # Iranian month names
 'iranian-calendar-m1' => 'Prim mèis Jalāli',
@@ -3530,14 +3562,14 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
 'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ciaciarade]])',
 
 # Core parser functions
-'unknown_extension_tag' => 'Tacolèt d\'estension "$1" pa conossù',
-'duplicate-defaultsort' => "'''Atension:''' La ciav d'ordinament ëd default \"\$2\" a ven al pòst ëd cola ëd prima \"\$1\"",
+'unknown_extension_tag' => "Tichëtta d'estension «$1» pa conossùa",
+'duplicate-defaultsort' => "'''Atension:''' La ciav d'ordinament ëstàndard «$2» a pija ël pòst ëd cola ëd prima «$1».",
 
 # Special:Version
 'version' => 'Version',
 'version-extensions' => 'Estension anstalà',
 'version-specialpages' => 'Pàgine speciaj',
-'version-parserhooks' => 'Gancio dlë scompositor',
+'version-parserhooks' => 'Gancio dël dëscompositor',
 'version-variables' => 'Variàbij',
 'version-antispam' => 'Prevension dla rumenta',
 'version-skins' => 'Pej',
@@ -3545,15 +3577,16 @@ As peul ëdcò [[Special:EditWatchlist|dovré l'editor sòlit]].",
 'version-mediahandlers' => 'Gestor multimojen',
 'version-hooks' => 'Gancio',
 'version-extension-functions' => "Fonsion dj'estension",
-'version-parser-extensiontags' => "Tacolèt dj'estension conossùe da lë scompositor",
-'version-parser-function-hooks' => 'Gancio për le fonsion dlë scompositor',
+'version-parser-extensiontags' => "Tichëtte dj'estension conossùe dal dëscompositor",
+'version-parser-function-hooks' => 'Gancio për le fonsion dël dëscompositor',
 'version-hook-name' => 'Nòm dël gancio',
 'version-hook-subscribedby' => 'A son scrivusse',
 'version-version' => '(Version $1)',
 'version-license' => 'Licensa',
-'version-poweredby-credits' => "Sta wiki-sì a l'é basà su '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-credits' => "Costa wiki-sì a marcia mersì a '''[//www.mediawiki.org/ MediaWiki]''', licensa © 2001-$1 $2.",
 'version-poweredby-others' => 'àutri',
-'version-license-info' => "MediaWiki a l'é un programa lìber; a peul passelo an gir e/o modifichelo sota le condission dla Licensa Pùblica General GNU coma publicà da la Free Software Foundation; o la version 2 dla licensa o (a soa decision) qualsëssìa version apress.
+'version-credits-summary' => 'I tnoma a aringrassié le përson-e sì-dapress për soa contribussion a [[Special:Version|MediaWiki]].',
+'version-license-info' => "MediaWiki a l'é un programa lìber; a peul passelo an gir o modifichelo sota le condission dla Licensa Pùblica General GNU coma publicà da la Free Software Foundation; o la version 2 dla licensa o (a soa decision) qualsëssìa version apress.
 
 MediaWiki a l'é distribuì ant la speransa che a sia ùtil, ma SENSA GNUN-A GARANSÌA; sensa gnanca la garansìa implìcita ëd COMERSIABILITA' o d'ADATAMENT A UN BUT PARTICOLAR. Ch'a lesa la Licensa General Pùblica GNU per pi 'd detaj.
 
@@ -3561,9 +3594,10 @@ A dovrìa avèj arseivù [{{SERVER}}{{SCRIPTPATH}}/COPYING na còpia dla Licensa
 'version-software' => 'Programa anstalà',
 'version-software-product' => 'Prodot',
 'version-software-version' => 'Version',
-'version-entrypoints' => "Anliure ëd pont d'intrada",
+'version-entrypoints' => "Anliure dij pont d'intrada",
 'version-entrypoints-header-entrypoint' => "Pont d'intrada",
 'version-entrypoints-header-url' => "Adrëssa an sl'aragnà",
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Senté d\'artìcol]',
 
 # Special:FilePath
 'filepath' => "Përcors d'archivi",
@@ -3578,10 +3612,10 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
 'fileduplicatesearch-legend' => 'Arsërca ëd na dobia',
 'fileduplicatesearch-filename' => "Nòm dl'archivi:",
 'fileduplicatesearch-submit' => 'Arsërca',
-'fileduplicatesearch-info' => '$1 × $2 pixel<br />Amzure: $3<br />Sòrt MIME: $4',
-'fileduplicatesearch-result-1' => 'Pa gnun-a dobia për l\'archivi "$1".',
-'fileduplicatesearch-result-n' => 'A-i {{PLURAL:$2|é \'n dobion midem|son $2 dobion midem}} ëd l\'archivi "$1".',
-'fileduplicatesearch-noresults' => 'Gnun archivi ciamà "$1" trovà.',
+'fileduplicatesearch-info' => '$1 × $2 pontin<br />Amzure: $3<br />Sòrt MIME: $4',
+'fileduplicatesearch-result-1' => "Pa gnun dobion për l'archivi «$1».",
+'fileduplicatesearch-result-n' => "A-i {{PLURAL:$2|é 'n dobion midem|son $2 dobion midem}} ëd l'archivi «$1».",
+'fileduplicatesearch-noresults' => "Gnun archivi ciamà «$1» a l'é stàit trovà.",
 
 # Special:SpecialPages
 'specialpages' => 'Pàgine Speciaj',
@@ -3593,36 +3627,36 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
 'specialpages-group-other' => 'Àutre pàgine speciaj',
 '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-media' => "Rapòrt e amportassion d'archivi multimojen",
 'specialpages-group-users' => 'Utent e drit',
 'specialpages-group-highuse' => 'Pàgine motobin dovrà',
 'specialpages-group-pages' => 'Liste ëd pàgine',
 'specialpages-group-pagetools' => 'Utiss për le pàgine',
 'specialpages-group-wiki' => 'Dat e utiss ëd la wiki',
-'specialpages-group-redirects' => 'Pàgine speciaj ëd rediression',
-'specialpages-group-spam' => 'Utiss contra lë spam',
+'specialpages-group-redirects' => 'Pàgine speciaj ëd ridiression',
+'specialpages-group-spam' => 'Utiss contra la rumenta',
 
 # Special:BlankPage
 'blankpage' => 'Pàgina bianca',
-'intentionallyblankpage' => "Sta pàgina-sì a l'é lassà antensionalment an bianch.",
+'intentionallyblankpage' => "Costa pàgina a l'é lassà veuida a pòsta.",
 
 # External image whitelist
-'external_image_whitelist' => "  #Lassa sta riga-sì pròpi con a l'é<pre>
-#Buta ij tòch d'espression regolar (mach la part che a va an tra //) sota
-#Ste sì a saran confrontà con le URL dle figure esterne (hotlinked)
-#Cole che as cobio a saran visualisà com figure, dasnò a sarà mach mostà un colegament a la figura
+'external_image_whitelist' => "  #Lassé costa riga-sì pròpi 'me ch'a l'é<pre>
+#Buté ij fragment d'espression regolar (mach la part che a va antra le //) sì-sota
+#Coste-sì a saran confrontà con le liure dle figure esterne
+#Cole che as cobio a saran visualisà com figure, dësnò a sarà mach mostrà na liura a la figura
 #Le linie che a ancamin-o con # a saran tratà com coment
-#Sòn sì a l'é pa sensìbil a minuscol o maiuscol
+#La lista a l'é indiferenta a minùscol o majùscol
 
-#Buta tùit ij tòch ëd regex sota sta linia-sì. Lassa sta linia-sì pròpi com a l'é</pre>",
+#Buté tùit ij fragment d'espression regolar sota sta linia-sì. Lassé costa linia pròpi com a l'é</pre>",
 
 # Special:Tags
-'tags' => 'Tag ëd modìfiche vàlid',
-'tag-filter' => '[[Special:Tags|Tag]] filtror:',
+'tags' => 'Tichëtte ëd le modìfiche vàlide',
+'tag-filter' => 'Filtror ëd le [[Special:Tags|tichëtte]]:',
 'tag-filter-submit' => 'Filtror',
-'tags-title' => 'Tag',
-'tags-intro' => 'Sta pàgina-sì a lista ij tag che ël software a peul dovré për identifiché na modìfica, e ël sò significà.',
-'tags-tag' => 'Nòm dël tag',
+'tags-title' => 'Tichëtte',
+'tags-intro' => 'Costa pàgina a lista le tichëtte che ël programa a peul dovré për marché na modìfica, e sò significà.',
+'tags-tag' => 'Nòm ëd la tichëtta',
 'tags-display-header' => 'Aparensa ant la lista dle modìfiche',
 'tags-description-header' => 'Descrission completa dël significà',
 'tags-hitcount-header' => 'Modìfiche con tag',
@@ -3692,9 +3726,9 @@ Le figure a së smon-o a amzura pijn-a, j'àotre sòrt d'archivi a ven-o fàite
 'logentry-move-move_redir-noredirect' => "$1 a l'ha tramudà la pàgina $3 a $4 ansima a na ridiression sensa lassé na ridiression",
 'logentry-patrol-patrol' => "$1 a l'ha marcà la revision $4 dla pàgina $3 'me controlà",
 'logentry-patrol-patrol-auto' => "$1 a l'ha marcà automaticament la revision $4 dla pàgina $3 'me controlà",
-'logentry-newusers-newusers' => '$1 creà un cont utent',
-'logentry-newusers-create' => '$1 creà un cont utent',
-'logentry-newusers-create2' => '$1 creà un cont utent $3',
+'logentry-newusers-newusers' => "Ël cont utent $1 a l'é stàit creà",
+'logentry-newusers-create' => "Ël cont utent $1 a l'é stàit creà",
+'logentry-newusers-create2' => "Ël cont utent $3 a l'é stàit creà da $1",
 'logentry-newusers-autocreate' => "Ël cont $1 a l'é stàit creà an automàtich",
 'newuserlog-byemail' => 'ciav spedìa për pòsta eletrònica',
 
@@ -3714,6 +3748,10 @@ Dësnò, a peule dovré ël formlari semplificà sì-sota. Sò coment a sarà gi
 'feedback-bugcheck' => "Bin fàit! Ch'a contròla mach ch'a sia pa già un dij [$1 bigat conossù].",
 'feedback-bugnew' => "I l'heu controlà. Arpòrta n'eror neuv.",
 
+# Search suggestions
+'searchsuggest-search' => 'Arserca',
+'searchsuggest-containing' => 'contenent ...',
+
 # API errors
 'api-error-badaccess-groups' => "Chiel a peul pa carié d'archivi su sta wiki.",
 'api-error-badtoken' => 'Eror antern: sìmbol pa bon.',
@@ -3766,4 +3804,6 @@ Dësnò, a peule dovré ël formlari semplificà sì-sota. Sò coment a sarà gi
 'duration-centuries' => '$1 {{PLURAL:$1|sécol|sécoj}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenari|milenari}}',
 
+# Unknown messages
+'svg-long-error' => 'Archivi SVG nen bon: $1',
 );
index 57d9886..be574b4 100644 (file)
@@ -166,7 +166,6 @@ $messages = array(
 'qbbrowse' => 'لبو',
 'qbedit' => 'لکھو',
 'qbpageoptions' => 'اے صفہ',
-'qbpageinfo' => 'محول',
 'qbmyoptions' => 'میرے صفے',
 'qbspecialpages' => 'خاص صفے',
 'faq' => 'FAQ',
@@ -411,12 +410,9 @@ $messages = array(
 
 # Login and logout pages
 'logouttext' => "'''تسی لاگ آؤٹ ہوگۓ او.'''
-تسی   {{SITENAME}} نوں گمنامی چ ورت سکدے او یا تسی [[Special:UserLogin|لاگ ان دوبارہ]] ہوجاؤ اوسے ناں توں یا وکھرے ورتن والے توں۔ اے گل چیتے رکھنا جے کج صفیاں تے تسی لاگ ان دسے جاؤگے جدوں تک تسی اپنے براؤزر دے کاشے نوں صاف ناں کرلو۔
-You can continue to use {{SITENAME}} anonymously, or you can [[Special:UserLogin|log in again]] as the same or as a different user.
+تسی   {{SITENAME}} نوں گمنامی چ ورت سکدے او یا تسی <span class='plainlinks'>[$1 لاگ ان دوبارہ]</span> ہوجاؤ اوسے ناں توں یا وکھرے ورتن والے توں۔ اے گل چیتے رکھنا جے کج صفیاں تے تسی لاگ ان دسے جاؤگے جدوں تک تسی اپنے براؤزر دے کاشے نوں صاف ناں کرلو۔
+You can continue to use {{SITENAME}} anonymously, or you can <span class='plainlinks'>[$1 log in again]</span> as the same or as a different user.
 Note that some pages may continue to be displayed as if you were still logged in, until you clear your browser cache.",
-'welcomecreation' => '== جی آیاں نوں, $1! ==
-تواڈا کھاتا بن گیا اے۔
-اپنیاں [[Special:Preferences|{{SITENAME}} تانگاں]] بدلنا نا پلنا۔',
 'yourname' => 'ورتن والہ:',
 'yourpassword' => 'کنجی:',
 'yourpasswordagain' => 'کنجی دوبارہ لکھو:',
@@ -1002,8 +998,6 @@ $1",
 'search-interwiki-caption' => 'رلدے ویونت',
 'search-interwiki-default' => '$1 نتارے:',
 'search-interwiki-more' => '(اور)',
-'search-mwsuggest-enabled' => 'صلاع دے نال',
-'search-mwsuggest-disabled' => 'کوئی صلاع نئیں',
 'search-relatedarticle' => 'جڑیاں',
 'mwsuggest-disable' => 'اجاکس مشورے نکارہ کرو',
 'searcheverything-enable' => 'ہر ناں چ لبو',
@@ -1993,11 +1987,7 @@ $1",
 
 'enotif_mailer' => '{{سائٹ ناں}} نوٹینیکیشن میلر',
 'enotif_reset' => 'سارے ویکھے گۓ صفحیاں تے نشان لاؤ',
-'enotif_newpagetext' => 'اے نواں صفہ اے۔',
 'enotif_impersonal_salutation' => '{{SITENAME}} ورتن والا',
-'changed' => 'بدلیا',
-'created' => 'بن گیا',
-'enotif_subject' => '{{سائیٹتھاں}} صفہ $صفہ سرخی  $تبدیلی بنائی  $صفہ لکھاری',
 'enotif_lastvisited' => '$1 تبدیلیاں ویکھو اپنے آخری واری آن مکروں',
 'enotif_lastdiff' => '$1 ویکھو ایس تبدیلی نون ویکھن لئی۔',
 'enotif_anon_editor' => 'گم نام ورتن آلا $1',
@@ -2616,7 +2606,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript ٹیسٹنگ',
-'javascripttest-disabled' => 'ایس وکی تے ایہ کم نئیں چلدا۔',
 'javascripttest-title' => 'ٹیسٹ  $1 چلدا اے۔',
 'javascripttest-pagetext-noframework' => 'ایہ صفہ JavaScript  ٹیسٹاں لئی بچایا گیا اے۔',
 'javascripttest-pagetext-unknownframework' => '"$1" انجانا ٹیسٹنگ فریمورک۔',
@@ -3561,6 +3550,10 @@ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 'feedback-bugcheck' => 'بعوت ودیا ! صرف ایہ ویکھو جے کیا ایہ پہلے لبے ہوۓ [$1 known bugs] چو اک تے نئیں۔',
 'feedback-bugnew' => 'میں ویکھیا اے۔ نویں بگ دی رپورٹ کرو۔',
 
+# Search suggestions
+'searchsuggest-search' => 'کھوج',
+'searchsuggest-containing' => 'بند کر ریا اے۔۔۔',
+
 # API errors
 'api-error-badaccess-groups' => 'تھوانوں ایس وکی تے فائلاں چڑھان دی اجازت نئیں۔',
 'api-error-badtoken' => 'اندر دی غلطی: برا ٹوکن',
index 01d87f0..455e78f 100644 (file)
@@ -160,7 +160,6 @@ $messages = array(
 'qbbrowse' => 'Πλοήγησην',
 'qbedit' => 'Άλλαξον',
 'qbpageoptions' => 'Ατή η σελίδαν',
-'qbpageinfo' => 'Συμφραζόμενα',
 'qbmyoptions' => "Τ' εμά τα σελίδας",
 'qbspecialpages' => 'Ειδικά σελίδας',
 'faq' => 'Πολλά ερωτήσεις (FAQ)',
@@ -338,9 +337,6 @@ $messages = array(
 'virus-unknownscanner' => 'αναγνώριμον αντιικόν:',
 
 # Login and logout pages
-'welcomecreation' => "== Καλώς έρθετεν, $1! ==
-Η λογαρίαν εσουν εγέντον.
-Τ' άλλαγμαν τη [[Special:Preferences|{{SITENAME}} προτιμησίων]] εσουν μη νεσπάλετε.",
 'yourname' => 'Όνεμαν χρήστε:',
 'yourpassword' => 'Σημάδι:',
 'yourpasswordagain' => "Ξαν' γράψτεν το σημάδι:",
@@ -607,8 +603,6 @@ $messages = array(
 'search-interwiki-caption' => 'Αδερφικά έργα',
 'search-interwiki-default' => '$1 αποτελέσματα:',
 'search-interwiki-more' => '(πλέα)',
-'search-mwsuggest-enabled' => 'με οδηγίας',
-'search-mwsuggest-disabled' => 'θίχως οδηγίας',
 'searchall' => 'ούλαι',
 'nonefound' => "'''Σημείωση:''' Κανονικά ολίγα περιοχάς ονοματίων αραεύκουνταν μαναχόν. Βαλέστεν ''all:'' ασην λέξην εμπροστά για ίνεται το αράεμαν σ'όλεα τα σελίδας (και σελίδας καλατσεματί, πρότυπα κλπ.) ή βαλέστεν ους πρόθεμαν την περιοχήν ονοματίων π'θέλετε για να αραεύετε εκαικά.",
 'powersearch' => 'Αναλυτικόν αράεμαν',
@@ -983,8 +977,6 @@ $messages = array(
 'unwatching' => "'κ ωριάζω...",
 
 'enotif_impersonal_salutation' => '{{SITENAME}} χρήστες',
-'changed' => 'ελλάγεν',
-'created' => 'έντον',
 'enotif_anon_editor' => 'ανώνυμον χρήστες $1',
 
 # Delete
@@ -1445,4 +1437,7 @@ $messages = array(
 'htmlform-reset' => "Κλώσον τ'αλλαγάς",
 'htmlform-selectorother-other' => 'Άλλον',
 
+# Search suggestions
+'searchsuggest-search' => 'Αράεμαν',
+
 );
index 840efbc..8b1308a 100644 (file)
@@ -152,7 +152,6 @@ Pāusai en kategōrijai "$1"',
 'qbbrowse' => 'Pradirēis',
 'qbedit' => 'Redigīs',
 'qbpageoptions' => 'Šin pāusan',
-'qbpageinfo' => 'Kōnteksts',
 'qbmyoptions' => 'Majāi pāusai',
 'qbspecialpages' => 'Speciālai pāusai',
 'faq' => 'Ukadeznai prasīsenei',
@@ -376,11 +375,8 @@ Drēudisnas pagrintinsna: "$2".',
 # Login and logout pages
 'logouttext' => "'''Tū assei teinū izgūbun.'''
 
-Tū mazzi ēmpirsin sadīntun tērpautun {{SITENAME}} kāigi niengūbuns tērpautajs, anga [[Special:UserLogin|enēitwei etkūmps]] kāigi šis sūbs anga kits tērpautajs.
+Tū mazzi ēmpirsin sadīntun tērpautun {{SITENAME}} kāigi niengūbuns tērpautajs, anga <span class='plainlinks'>[$1 enēitwei etkūmps]</span> kāigi šis sūbs anga kits tērpautajs.
 Endirēis, kāi ainuntai pāusai mazzi būtwei waidīntan ikāigi tū būlai ainatīngi engūbun, ērgi tū wīrst skistinnuns lasātlas rānkas minīsnan.",
-'welcomecreation' => '== Kaīls, $1! ==
-Twājs rekkens pastāi teīktan.
-Ni izmīrstais kitawīdintun Twajjans [[Special:Preferences|pirminiskwans per {{SITENAME}}]].',
 'yourname' => 'Twajā tērpautajas pabilisnā:',
 'yourpassword' => 'Twājs kliptaswīrds:',
 'yourpasswordagain' => 'Āntrinais kliptaswīrdan',
@@ -824,8 +820,6 @@ Nawigaciōnis autengīsenin terpausnā naikinna etrīnksenin en kōlunei.',
 'search-interwiki-caption' => 'Paligwāi prōjaktai',
 'search-interwiki-default' => 'Rezultātai per $1:',
 'search-interwiki-more' => '(tūls)',
-'search-mwsuggest-enabled' => 'sen nadāsnans',
-'search-mwsuggest-disabled' => 'šlāit nadāsnans',
 'search-relatedarticle' => 'Ristan',
 'mwsuggest-disable' => 'Izklaūjais AJAX nadāsnans',
 'searcheverything-enable' => 'Laukīs en wisēimans tītelin plattibins',
@@ -1612,11 +1606,7 @@ Eraīna šisse pāusas ēnturas kitawīdinsna anga diskusiōnis pāusas sēitan
 
 'enotif_mailer' => 'Pawakīsenis iz {{SITENAME}}',
 'enotif_reset' => 'Ebzentlis wissans pāusans per kāimalukitans',
-'enotif_newpagetext' => 'Sta ast nāunan pāusan.',
 'enotif_impersonal_salutation' => 'tērpautajs stesse {{SITENAME}}',
-'changed' => 'kitawīdintan',
-'created' => 'teīktan',
-'enotif_subject' => 'Pāusan $PAGETITLE en {{SITENAME}} pastāi $CHANGEDORCREATED pra $PAGEEDITOR',
 'enotif_lastvisited' => 'Wīdais en $1 wissans kitawīdinsnans ezze Twajjai panzdauman kāimalukisenin.',
 'enotif_lastdiff' => 'Wīdais en $1 šan kitawīdisnan.',
 'enotif_anon_editor' => 'anōnims tērpautajs $1',
index 03e5454..1801ff0 100644 (file)
@@ -12,6 +12,8 @@
  * @author Umherirrender
  */
 
+$rtl = true;
+
 $namespaceNames = array(
        NS_MEDIA            => 'رسنۍ',
        NS_SPECIAL          => 'ځانګړی',
@@ -155,8 +157,6 @@ $magicWords = array(
        'protectionlevel'           => array( '1', 'ژغورکچه', 'PROTECTIONLEVEL' ),
 );
 
-$rtl = true;
-
 $messages = array(
 # User preference toggles
 'tog-underline' => 'کرښنې تړنې:',
@@ -213,9 +213,9 @@ $messages = array(
 'editfont-serif' => 'سېرېف ليکبڼه',
 
 # Dates
-'sunday' => 'اتوار',
-'monday' => 'ګل',
-'tuesday' => 'نهي',
+'sunday' => 'يونۍ',
+'monday' => 'دونۍ',
+'tuesday' => 'درې نۍ',
 'wednesday' => 'شورو',
 'thursday' => 'زيارت',
 'friday' => 'جمعه',
@@ -269,7 +269,7 @@ $messages = array(
 'category_header' => 'د "$1" په وېشنيزه کې شته مخونه',
 'subcategories' => 'څېرمه وېشنيزې',
 'category-media-header' => 'د "$1" په وېشنيزه کې شته رسنۍ',
-'category-empty' => "''تر Ø§Ù\88سÙ\87 Ù¾Ù\88رÛ\90 Ù\87Ù\85دا Ù\88Û\90Ø´Ù\86Ù\8aزÙ\87 Ù\87Û\90Ú\85 Ú©Ù\88Ù\85 Ù\85Ø® Ù\8aا Ú©Ù\88Ù\85Ù\87 رسنيزه دوتنه نلري.''",
+'category-empty' => "''دا Ù\88Û\90Ø´Ù\86Ù\8aزÙ\87 ØªØ± Ø§Ù\88سÙ\87 Ù¾Ù\88رÛ\90 Ú©Ù\88Ù\85 Ù\85Ø® Ù\8aا رسنيزه دوتنه نلري.''",
 'hidden-categories' => '{{PLURAL:$1|پټه وېشنيزه|پټې وېشنيزې}}',
 'hidden-category-category' => 'پټې وېشنيزې',
 'category-subcat-count' => '{{PLURAL:$2|په دې وېشنيزه کې دا لاندې وړه وېشنيزه ده.|په دې وېشنيزه کې له ټولټال $2 نه {{PLURAL:$1|وړه وېشنيزه ده|$1 وړې وېشنيزې دي}}.}}',
@@ -288,9 +288,9 @@ $messages = array(
 'newwindow' => '(په نوې کړکۍ کې پرانيستل کېږي)',
 'cancel' => 'ناګارل',
 'moredotdotdot' => 'نور ...',
-'mypage' => 'زÙ\85ا Ù¾Ø§Ú¼Ù\87',
-'mytalk' => 'زÙ\85ا Ø®Ø¨Ø±Û\90 Ø§ØªØ±Û\90',
-'anontalk' => 'ددې IP لپاره خبرې اترې',
+'mypage' => 'زÙ\85ا Ù\85Ø®',
+'mytalk' => 'خبرې اترې',
+'anontalk' => 'ددې IP خبرې اترې',
 'navigation' => 'ګرځښت',
 'and' => '&#32;او',
 
@@ -299,7 +299,6 @@ $messages = array(
 'qbbrowse' => 'سپړل',
 'qbedit' => 'سمول',
 'qbpageoptions' => 'همدا مخ',
-'qbpageinfo' => 'متن',
 'qbmyoptions' => 'زما پاڼې',
 'qbspecialpages' => 'ځانګړي مخونه',
 'faq' => 'ډ-ځ-پ',
@@ -332,7 +331,7 @@ $messages = array(
 'history' => 'د مخ پېښليک',
 'history_short' => 'پېښليک',
 'updatedmarker' => 'زما د وروستي راتګ نه راپدېخوا اوسمهاله شوی',
-'printableversion' => 'د چاپ بڼه',
+'printableversion' => 'چاپي بڼه',
 'permalink' => 'تلپاتې تړنه',
 'print' => 'چاپ',
 'view' => 'کتل',
@@ -341,7 +340,7 @@ $messages = array(
 'editthispage' => 'همدا مخ سمول',
 'create-this-page' => 'همدا مخ ليکل',
 'delete' => 'ړنګول',
-'deletethispage' => 'دا مخ ړنګ کړه',
+'deletethispage' => 'دا مخ ړنګول',
 'undelete_short' => '{{PLURAL:$1|يو سمون|$1 سمونې}} ناړنګول',
 'viewdeleted_short' => '{{PLURAL:$1|يو ړنګ شوی سمون|$1 ړنګ شوي سمونونه}} کتل',
 'protect' => 'ژغورل',
@@ -362,7 +361,7 @@ $messages = array(
 'userpage' => 'د کارن پاڼه کتل',
 'projectpage' => 'د پروژې مخ کتل',
 'imagepage' => 'د دوتنې مخ کتل',
-'mediawikipage' => 'د پيغامونو مخ کتل',
+'mediawikipage' => 'پيغام مخ کتل',
 'templatepage' => 'د کينډۍ مخ کتل',
 'viewhelppage' => 'د لارښود مخ کتل',
 'categorypage' => 'د وېشنيزې مخ کتل',
@@ -402,7 +401,7 @@ $1',
 'portal' => 'د ټولنې تانبه',
 'portal-url' => 'Project:د ټولنې تانبه',
 'privacy' => 'د پټنتيا تګلاره',
-'privacypage' => 'Project:د Ù\85حرÙ\85Ù\8aت_تګلاره',
+'privacypage' => 'Project:د Ù¾Ù¼Ù\86تÙ\8aا تګلاره',
 
 'badaccess' => 'د لاسرسۍ تېروتنه',
 'badaccess-group0' => 'تاسې د غوښتل شوې کړنې د ترسره کولو اجازه نه لرۍ.',
@@ -417,6 +416,8 @@ $1',
 'youhavenewmessages' => 'تاسې $1 لری  ($2).',
 'newmessageslink' => 'نوي پيغامونه',
 'newmessagesdifflink' => 'وروستی بدلون',
+'youhavenewmessagesfromusers' => 'تاسې د {{PLURAL:$3|يو بل کارن|$3 کارنانو}} لخوا $1 لرۍ ($2).',
+'youhavenewmessagesmanyusers' => 'تاسې د يو شمېر کارنانو لخوا $1 لرۍ ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|يو نوی پيغام|نوي پيغامونه}}',
 'newmessagesdifflinkplural' => 'وروستي {{PLURAL:$1|بدلون|بدلونونه}}',
 'youhavenewmessagesmulti' => 'تاسې په $1 کې نوي پېغامونه لرۍ',
@@ -446,7 +447,7 @@ $1',
 'sort-ascending' => 'مخپورته اوډل',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main' => 'Ù\84Ù\8aÚ©Ù\86Ù\87',
+'nstab-main' => 'Ù\85Ø®',
 'nstab-user' => 'کارن مخ',
 'nstab-media' => 'د رسنۍ مخ',
 'nstab-special' => 'ځانګړی مخ',
@@ -454,7 +455,7 @@ $1',
 'nstab-image' => 'دوتنه',
 'nstab-mediawiki' => 'پيغام',
 'nstab-template' => 'کينډۍ',
-'nstab-help' => 'لارښود',
+'nstab-help' => 'لارښود مخ',
 'nstab-category' => 'وېشنيزه',
 
 # Main script and global functions
@@ -505,12 +506,13 @@ $1',
 'viewsource' => 'سرچينه کتل',
 'viewsource-title' => 'د $1 سرچينه کتل',
 'actionthrottled' => 'د دې کړنې مخنيوی وشو',
-'protectedpagetext' => 'دا Ù\85Ø® Ø¯ Ø¨Ø¯Ù\84Ù\88Ù\86 Ø§Ù\88 Ø³Ù\85Ù\88Ù\86 Ø¯ Ù\85Ø®Ù\86Ù\8aÙ\88Ù\8a Ù¾Ù\87 ØªÚ©Ù\84 ØªÚ\93Ù\84 Ø´Ù\88Û\8c Ø¯ی.',
+'protectedpagetext' => 'دا Ù\85Ø® Ø¯ Ø³Ù\85Ù\88Ù\86 Ø§Ù\88 Ù\86Ù\88رÙ\88 Ú©Ú\93Ù\86Ù\88 Ø¯ ØªØ±Ø³Ø±Ù\87 Ú©Ù\88Ù\84Ù\88 Ù¾Ù\87 ØªÚ©Ù\84 Ú\98غÙ\88رÙ\84 Ø´Ù\88ی.',
 'viewsourcetext' => 'تاسې د دې مخ سرچينه کتلی او لمېسلی شی:',
-'protectedinterface' => 'په همدې مخ کې د پوستکالي د ليدنمخ متن دی او دا متن د ناسمو کارولو د مخنيوي په تکل تړل شوی.',
+'protectedinterface' => 'دا مخ د دې ويکي د ساوترې د ليدنمخ متن لري، او د ورانکارۍ په خاطر ژغورل شوی.
+په ټولو ويکي ګانو کې د ژباړې د ورګډولو او يا هم د ژباړې د سمون او بدلون لپاره د مېډياويکي د ځايتابه پروژه [//translatewiki.net/ translatewiki.net] وکاروۍ.',
 'editinginterface' => "'''ګواښنه:''' تاسو په يوه داسې مخ کې بدلون راولی کوم چې د يوې پوستکالی د ليدنمخ متن په توګه کارېږي.
 په همدې مخ کې بدلون راوستل به د نورو کارنانو د ليدنمخ بڼه اغېزمنه کړي.
-د ژباړې لپاره، مهرباني وکړی د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، وېبځي ته ولاړ شی. دا وېبځی د ميډياويکي د ځايتابه پروژه ده او د همدې پر کارولو غور وکړی.",
+د ژباړې د ورګډولو او بدلون لپاره، مهرباني وکړی د [//translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net]، وېبځي ته ولاړ شی. دا وېبځی د ميډياويکي د ځايتابه پروژه ده.",
 'sqlhidden' => '(د SQL پوښتن پټ دی)',
 'namespaceprotected' => "تاسې د '''$1''' په نوم-تشيال کې د مخونو د سمولو اجازه نه لرۍ.",
 'customcssprotected' => 'تاسې د دې CSS مخ د سمولو اجازه نه لرۍ، دا ځکه چې دا مخ د بل کارن شخصي امستنې لري.',
@@ -518,6 +520,7 @@ $1',
 'ns-specialprotected' => 'ځانګړي مخونو کې سمون او بدلون نه شی راوستلای.',
 'titleprotected' => 'د [[User:$1|$1]] لخوا د دې سرليک د جوړېدلو مخنيوی شوی.
 او د دې کړنې سبب "\'\'$2\'\'" ورکړ شوی.',
+'exception-nologin' => 'غونډال کې نه ياست ننوتي',
 
 # Virus scanner
 'virus-badscanner' => "بده سازېدنه: د ويروس ناڅرګنده ځيرڅار: ''$1''",
@@ -527,11 +530,8 @@ $1',
 # Login and logout pages
 'logouttext' => "'''تاسې اوس د غونډال نه ووتلی.'''
 
-تاسې کولای شی چې د کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په همدې او يا کوم بل کارن-نوم، يو ځل [[Special:UserLogin|بيا غونډال ته ورننوځۍ]].
+تاسې کولای شی چې د کارن-نوم نه پرته په ورکنومي توګه {{SITENAME}} وکاروی، او يا هم په همدې او يا کوم بل کارن-نوم، يو ځل <span class='plainlinks'>[$1 بيا غونډال ته ورننوځۍ]</span>.
 دا په پام کې وساتۍ چې تر څو تاسې د خپل کتنمل حافظه نه وي سپينه کړې، نو ځينې مخونو کې به لا تر اوسه پورې په غونډال کې ننوتي ښکارۍ.",
-'welcomecreation' => '==$1 ښه راغلاست! ==
-
-ستاسې ګڼون جوړ شو. لطفاً د [[Special:Preferences|{{SITENAME}} غوره توبونو]] ټاکل مو مه هېروی.',
 'yourname' => 'کارن-نوم:',
 'yourpassword' => 'پټنوم:',
 'yourpasswordagain' => 'پټنوم بيا وليکه',
@@ -591,7 +591,7 @@ $1',
 که چېرته تاسې نه پرته کوم بل چا دغه غوښتنه کړې وي او يا هم تاسې ته خپل پټنوم در پزړه شوی وي او تاسې خپل اصلي پټنوم بدلول نه غواړۍ، نو تاسې همدا پيغام بابېزه وګڼۍ او د پخوا په څېر خپل اصلي پټنوم وکاروی.',
 'noemail' => 'د "$1" کارن لپاره هېڅ کومه برېښليک پته نه ده ثبته شوې.',
 'noemailcreate' => 'تاسې ته پکار ده چې يوه سمه برېښليک پته وليکۍ',
-'passwordsent' => 'د "$1" لپاره يو نوی پټنوم د هغه/هغې د برېښليک پتې ته ولېږل شو.
+'passwordsent' => 'د "$1" لپاره يو نوی پټنوم د اړونده کارن برېښليک پتې ته ولېږل شو.
 لطفاً کله چې پټنوم مو ترلاسه کړ نو بيا غونډال ته ننوځۍ.',
 'blocked-mailpassword' => 'ستاسې په IP پتې بنديز لګېدلی او تاسې نه شی کولای چې ليکنې وکړی، په همدې توګه تاسې نه شی کولای چې د پټنوم د پرځای کولو کړنې وکاروی دا ددې لپاره چې د وراني مخنيوی وشي.',
 'eauthentsent' => 'ستاسې ورکړ شوې برېښليک پتې ته مو يو تاييدي برېښليک درولېږه.
@@ -606,6 +606,7 @@ $1',
 'invalidemailaddress' => 'دا برېښليک پته نه منل کېږي، دا ځکه چې دا پته يوه ناکره بڼه لري.
 لطفاً د يوې کره بڼې پته وليکۍ او يا هم دا ځای تش پرېږدۍ.',
 'cannotchangeemail' => 'پدې ويکي کې د ګڼون برېښليک پتې نشي بدلېدلی.',
+'emaildisabled' => 'دا وېبځی د برېښليک لېږلو چارو څخه برخمن نه دی.',
 'accountcreated' => 'ګڼون مو جوړ شو.',
 'accountcreatedtext' => 'د $1 لپاره يو ګڼون جوړ شو.',
 'createaccount-title' => 'د {{SITENAME}} د ګڼون جوړېدنه',
@@ -614,8 +615,14 @@ $1',
 
 که چېرته دا کړنه په تېروتنه کې شوی وي نو تاسې کولای شی چې دا پيغام بابېزه وګڼۍ.',
 'usernamehasherror' => 'کارن-نوم نشي کېدلای چې کرښکې لوښې ولري',
+'login-throttled' => 'تاسې څو واره هڅه کړې چې غونډال ته ورننوځۍ.
+لطفاً د بيا هڅې نه مخکې يو څو شېبې تم شۍ.',
+'login-abort-generic' => 'غونډال کې مو ننوتل نابريالی شو - ناڅاپي بند شو',
 'loginlanguagelabel' => 'ژبه: $1',
 
+# E-mail sending
+'user-mail-no-addy' => 'د يوې برېښليک پتې پرته د برېښليک لېږلو هڅه شوې.',
+
 # Change password dialog
 'resetpass' => 'پټنوم بدلول',
 'resetpass_header' => 'د ګڼون پټنوم بدلول',
@@ -626,7 +633,7 @@ $1',
 'resetpass_success' => 'ستاسې پټنوم په برياليتوب سره بدل شو!
 اوس غونډال کې د ورننوتلو په حال کې يو ...',
 'resetpass_forbidden' => 'پټنومونه مو نه شي بدلېدلای',
-'resetpass-no-info' => 'همدې مخ ته د لاسرسي موندلو پخاطر تاسې ته پکار ده چې لومړی غونډال ته ورننوځۍ.',
+'resetpass-no-info' => 'دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.',
 'resetpass-submit-loggedin' => 'پټنوم بدلول',
 'resetpass-submit-cancel' => 'ناګارل',
 'resetpass-wrong-oldpass' => 'لنډمهال او يا هم اوسنی پټنوم مو ناسم دی',
@@ -636,6 +643,7 @@ $1',
 'passwordreset' => 'پټنوم بياپرځايول',
 'passwordreset-text' => 'د دې لپاره چې ستاسې د ګڼون بشپړې څرګندنې دربرېښليک شي نو دا فورمه ډکه کړۍ.',
 'passwordreset-legend' => 'پټنوم بياپرځايول',
+'passwordreset-disabled' => 'په دې ويکي پټنوم بياپرځای کولو کړنه ناچارنه شوې.',
 'passwordreset-pretext' => '{{PLURAL:$1||د لاندې اومتوک يوه برخه مالومات وليکۍ}}',
 'passwordreset-username' => 'کارن-نوم:',
 'passwordreset-domain' => 'شپول:',
@@ -650,6 +658,7 @@ $1',
 # Special:ChangeEmail
 'changeemail' => 'برېښليک پته بدلول',
 'changeemail-header' => 'د ګڼون برېښليک پته بدلول',
+'changeemail-no-info' => 'دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.',
 'changeemail-oldemail' => 'اوسنۍ برېښليک پته:',
 'changeemail-newemail' => 'نوې برېښليک پته:',
 'changeemail-none' => '(هېڅ)',
@@ -659,13 +668,13 @@ $1',
 # Edit page toolbar
 'bold_sample' => 'زغرد متن',
 'bold_tip' => 'زغرد متن',
-'italic_sample' => 'کوږ ليک',
-'italic_tip' => 'کوږ ليک',
+'italic_sample' => 'رېوند متن',
+'italic_tip' => 'رېوند متن',
 'link_sample' => 'د تړن سرليک',
 'link_tip' => 'کورنۍ تړنه',
 'extlink_sample' => 'http://www.example.com د تړنې سرليک',
 'extlink_tip' => 'باندنۍ تړنې (د http:// مختاړی مه هېروی)',
-'headline_sample' => 'سرÙ\84Ù\8aÚ©',
+'headline_sample' => 'د Ø³Ø±Ù\84Ù\8aÚ© Ù\85تÙ\86',
 'headline_tip' => 'د ۲ کچې سرليک',
 'nowiki_sample' => 'دلته دې بې بڼې متن ځای پر ځای شي',
 'nowiki_tip' => 'د ويکي بڼه نيونه بابېزه ګڼل',
@@ -734,9 +743,8 @@ $1',
 تاسې کولای شی چې په نورو مخونو کې [[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-nopermission' => 'دم مهال په دې مخ کې متن نشته.
+تاسې کولای شی چې [[Special:Search/{{PAGENAME}}|همدا سرليک په نورو مخونو کې وپلټۍ]], يا هم <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} اړونده يادښتونه وپلټۍ]</span>، خو تاسې د دې مخ د جوړولو اجازه نه لرۍ.',
 'userpage-userdoesnotexist' => 'د "<nowiki>$1</nowiki>" ګڼون نه دی ثبت شوی.
 لطفاً ځان ډاډه کړۍ چې آيا تاسې په رښتيا همدا مخ جوړول که سمول غواړۍ.',
 'userpage-userdoesnotexist-view' => 'د "$1" ګڼون نه دی ثبت شوی.',
@@ -751,18 +759,21 @@ $1',
 '''تر اوسه پورې لا ستاسې بدلونونه نه دي خوندي شوي!'''",
 'userjspreview' => "'''هېر مو نشي چې دا يوازې ستاسې د کارن د جاوا سکرېپټ آزمېيل/مخليدنه ده.'''
 '''تر اوسه پورې لا ستاسې بدلونونه نه دي خوندي شوي!'''",
+'sitecsspreview' => "'''په پام کې دې وي چې دا يوازې ستاسې د CSS مخليدنه ده.'''
+'''تر اوسه پورې لا ستاسې بدلونونه نه دي خوندي شوي!'''",
 'sitejspreview' => "'''په پام کې مو اوسه چې تاسې يوازې د دغه جاواسکرېپټ کوډ مخليدنه کوۍ.'''
 '''تر اوسه پورې دا نه دی خوندي شوی!'''",
 'updated' => '(تازه)',
 'note' => "'''يادونه:'''",
 'previewnote' => "'''هېر مو نه شي چې دا يواځې يوه مخليدنه ده.'''
 ستاسې لخوا ترسره شوي بدلونونه لا تر اوسه پورې نه دي خوندي شوي!!",
+'continue-editing' => 'د سمولو سيمې ته ورتلل',
 'editing' => 'د $1 سمونه',
 'creating' => '$1 جوړېدنې کې دی',
 'editingsection' => '$1 (برخه) په سمېدنې کې دی',
 'editingcomment' => 'د $1 سمون (نوې برخه)',
 'editconflict' => 'په سمادولو کې خنډ: $1',
-'yourtext' => 'ستاسو متن',
+'yourtext' => 'ستاسې متن',
 'storedversion' => 'زېرمه شوې مخکتنه',
 'yourdiff' => 'توپيرونه',
 'copyrightwarning' => "لطفاً په پام کې وساتۍ چې ټولې هغه ونډې چې تاسې يې {{SITENAME}} کې ترسره کوی هغه د $2 له مخې د خپرولو لپاره ګڼل کېږي (د لانورو تفصيلاتو لپاره $1 وګورۍ). که تاسې نه غواړۍ چې په ليکنو کې مو په بې رحمۍ سره لاسوهنې (سمونې) وشي او د نورو په غوښتنه پسې لانورې هم خپرې شي، نو دلته يې مه ځای پر ځای کوی..<br />
@@ -804,7 +815,12 @@ $1',
 'edit-no-change' => 'ستاسې سمون بابېزه وګڼل شو، دا ځکه چې تاسې په متن کې کوم بدلون نه دی راوستلی.',
 'edit-already-exists' => 'په دې نوم يو نوی مخ جوړ نه شو.
 پدې نوم د پخوا نه يو مخ شته.',
-'defaultmessagetext' => 'تلوالیزه پيغام متن',
+'defaultmessagetext' => 'تلواليزه پيغام متن',
+
+# Content models
+'content-model-wikitext' => 'ويکي متن',
+'content-model-text' => 'ساده متن',
+'content-model-javascript' => 'جاواسکرېپټ',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''ګواښنه:''' دا کينډۍ د خپل ټاکلي بريد نه ډېره لويه ده.
@@ -822,7 +838,7 @@ $1',
 
 # History pages
 'viewpagelogs' => 'د دې مخ يادښتونه کتل',
-'nohistory' => 'ددې مخ لپاره د سمادېدنې هېڅ کوم پېښليک نه شته.',
+'nohistory' => 'ددې مخ د سمون کوم پېښليک نه شته.',
 'currentrev' => 'اوسنۍ بڼه',
 'currentrev-asof' => 'د $1 پورې تازه بڼه',
 'revisionasof' => 'د $1 بڼه',
@@ -948,8 +964,6 @@ $1',
 'search-interwiki-caption' => 'خورلڼې پروژې',
 'search-interwiki-default' => '$1 پايلې:',
 'search-interwiki-more' => '(نور)',
-'search-mwsuggest-enabled' => 'د وړانديزونو سره',
-'search-mwsuggest-disabled' => 'له وړانديزونو نه پرته',
 'search-relatedarticle' => 'اړونده',
 'mwsuggest-disable' => 'د AJAX وړانديزونه ناچارن کول',
 'searcheverything-enable' => 'په ټولو نوم-تشيالونو کې پلټل',
@@ -980,7 +994,7 @@ $1',
 
 # Preferences page
 'preferences' => 'غوره توبونه',
-'mypreferences' => 'زÙ\85ا ØºÙ\88رÙ\87 ØªÙ\88بÙ\88Ù\86Ù\87',
+'mypreferences' => 'غوره توبونه',
 'prefs-edits' => 'د سمونو شمېر:',
 'prefsnologin' => 'غونډال کې نه ياست ننوتي',
 'prefsnologintext' => 'د دې لپاره چې خپل غوره توبونه مو وټاکی، نو پکار ده چې لومړی تاسو غونډال کې <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} ننوځی]</span>.',
@@ -994,7 +1008,7 @@ $1',
 'prefs-personal' => 'د کارن پېژنليک',
 'prefs-rc' => 'وروستي بدلونونه',
 'prefs-watchlist' => 'کتنلړ',
-'prefs-watchlist-days' => 'د Ù\88رÚ\81Ù\88 Ø´Ù\85Û\90ر Ú\86Û\90 Ù¾Ù\87 Ú©ØªÙ\84Ù\8a Ù\84Ú\93Ù\84Ù\8aÚ© کې به ښکاري:',
+'prefs-watchlist-days' => 'د Ù\88رÚ\81Ù\88 Ø´Ù\85Û\90ر Ú\86Û\90 Ù¾Ù\87 Ú©ØªÙ\86Ù\84Ú\93 کې به ښکاري:',
 'prefs-watchlist-days-max' => 'حد اکثر $1 {{PLURAL:$1|ورځ|ورځې}}',
 'prefs-watchlist-edits-max' => 'د شمېر اکثر بريد: 1000',
 'prefs-misc' => 'بېلابېل',
@@ -1017,7 +1031,7 @@ $1',
 'recentchangesdays-max' => 'حد اکثر $1 {{PLURAL:$1|ورځ|ورځې}}',
 'recentchangescount' => 'د هغو سمونو شمېر چې په تلواليزه بڼه ښکاره بايد شي:',
 'prefs-help-recentchangescount' => 'پدې کې د وروستني بدلونونو، د مخونو د پېښليکونو او يادښتونه شامل دي.',
-'savedprefs' => 'ستاسÙ\88 ØºÙ\88رÙ\87 ØªÙ\88بÙ\88Ù\86Ù\87 Ø®Ù\88Ù\86دÙ\8a Ø´Ù\88Ù\87.',
+'savedprefs' => 'غÙ\88رÙ\87 ØªÙ\88بÙ\88Ù\86Ù\87 Ù\85Ù\88 Ø®Ù\88Ù\86دÙ\8a Ø´Ù\88Ù\84.',
 'timezonelegend' => 'د وخت سيمه:',
 'localtime' => 'سيمه ايز وخت:',
 'timezoneuseserverdefault' => 'د ويکي تلواليزه بڼه کارول ($1)',
@@ -1030,13 +1044,13 @@ $1',
 'timezoneregion-antarctica' => 'انټارکټيکا',
 'timezoneregion-arctic' => 'آرکټيک',
 'timezoneregion-asia' => 'آسيا',
-'timezoneregion-atlantic' => 'د Ø§Ø·Ù\84س Ø³Ù\85Ù\86در',
+'timezoneregion-atlantic' => 'اطلس سمندر',
 'timezoneregion-australia' => 'آسټراليا',
 'timezoneregion-europe' => 'اروپا',
 'timezoneregion-indian' => 'هندی سمندر',
 'timezoneregion-pacific' => 'غلی سمندر',
 'allowemail' => 'د نورو کارنانو لخوا د برېښليک رالېږل چارن کړه',
-'prefs-searchoptions' => 'د پلټلو خوښنې',
+'prefs-searchoptions' => 'پلټنه',
 'prefs-namespaces' => 'نوم-تشيالونه',
 'defaultns' => 'او يا هم په دغو نوم-تشيالونو کې پلټل:',
 'default' => 'تلواليز',
@@ -1061,7 +1075,7 @@ $1',
 'gender-male' => 'نارينه',
 'gender-female' => 'ښځه',
 'email' => 'برېښليک',
-'prefs-help-realname' => 'د Ø§ØµÙ\84Ù\8a Ù\86Ù\88Ù\85 Ù\84Ù\8aÚ©Ù\84 Ø³ØªØ§Ø³Ù\88 Ù¾Ù\87 Ø®Ù\88Ú\9aÙ\87 Ø¯Û\8c Ø®Ù\88 Ú©Ù\87 ØªØ§Ø³Ù\88 Ø®Ù¾Ù\84 Ø§ØµÙ\84Ù\8a Ù\86Ù\88Ù\85 Ù\88ټاکÛ\8d Ù¾Ø¯Û\90 Ø³Ø±Ù\87 Ø¨Ù\87 Ø³ØªØ§Ø³Ù\88 Ù¼Ù\88Ù\84 Ú©Ø§Ø±Ù\88Ù\86Ù\87 Ø§Ù\88 Ù\88Ù\86Ú\89Û\90 Ø³ØªØ§Ø³Ù\88 د نوم په اړوندولو کې وکارېږي.',
+'prefs-help-realname' => 'د Ø¢Ø± Ù\86Ù\88Ù\85 Ù\84Ù\8aÚ©Ù\84 Ø³ØªØ§Ø³Û\90 Ù¾Ù\87 Ø®Ù\88Ú\9aÙ\87 Ø¯Û\8c Ø®Ù\88 Ú©Ù\87 ØªØ§Ø³Û\90 Ø®Ù¾Ù\84 Ø¢Ø± Ù\86Ù\88Ù\85 Ù\88ټاکÛ\8d Ù¾Ø¯Û\90 Ø³Ø±Ù\87 Ø¨Ù\87 Ø³ØªØ§Ø³Û\90 Ù¼Ù\88Ù\84 Ú©Ø§Ø±Ù\88Ù\86Ù\87 Ø§Ù\88 Ù\88Ù\86Ú\89Û\90 Ø³ØªØ§Ø³Û\90 د نوم په اړوندولو کې وکارېږي.',
 'prefs-help-email' => 'د برېښليک ورکړه ستاسې په خوښه ده، خو په ورکړې سره به يې د يوه نوي پټنوم د لېږلو چار آسانه کړي هغه هم کله چې تاسې نه خپل پټنوم هېر شوی وي.',
 'prefs-help-email-others' => 'تاسې دا هم کولای شی چې وټاکۍ چې نور کارنان ستاسې د خبرو اترو او يا کارن مخ د يوې تړنې له لارې تاسې سره برېښليکي اړيکه ونيسي.
 د اړيکو ټينګولو په وخت کې به ستاسې برېښليک پته نورو کارنانو ته نه ښکاري.',
@@ -1191,7 +1205,7 @@ $1',
 'recentchanges-label-unpatrolled' => 'دغه سمون تر اوسه پورې نه دی څارل شوی',
 'rcnote' => "دلته لاندې {{PLURAL:$1|وروستی '''1''' بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په  {{PLURAL:$2| يوې ورځ|'''$2''' ورځو}} کې تر $4 نېټې او $5 بجو پېښ شوي.",
 'rcnotefrom' => "په همدې ځای کې لاندې هغه بدلونونه دي چې د '''$2''' نه راپدېخوا پېښ شوي (تر '''$1''' پورې ښکاره شوي).",
-'rclistfrom' => 'هغه بدلونونه ښکاره کړی چې له $1 نه پيلېږي',
+'rclistfrom' => 'هغه نوي بدلونونه ښکاره کول چې له $1 نه پيلېږي',
 'rcshowhideminor' => 'وړې سمونې $1',
 'rcshowhidebots' => 'روباټ $1',
 'rcshowhideliu' => 'غونډال کې ننوتي کارنان $1',
@@ -1227,7 +1241,7 @@ $1',
 'upload' => 'دوتنه پورته کول',
 'uploadbtn' => 'دوتنه پورته کول',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
-'uploadnologintext' => 'د دوتنو د پورته کولو لپاره بايد غونډال کې [[Special:Userlogin|ننوځۍ]].',
+'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].',
 'uploaderror' => 'د پورته کولو ستونزه',
 'uploadtext' => "د دوتنې د پورته کېدو لپاره لاندينی چوکاټ وکاروۍ.
 که چېرته د پخونيو پورته شويو دوتنو کتل او پلټل غواړۍ نو [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشۍ، [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د ړنګېدو يادښتونه]] هم کتلای شی.
@@ -1341,7 +1355,7 @@ $1',
 'filehist' => 'د دوتنې پېښليک',
 'filehist-help' => 'په يوې نېټې/يوه وخت وټوکۍ چې د هماغه وخت او نېټې دوتنه چې په هماغه وخت کې څنګه ښکارېده هماغسې درښکاره شي.',
 'filehist-deleteall' => 'ټول ړنګول',
-'filehist-deleteone' => 'همدا ړنګول',
+'filehist-deleteone' => 'ړنګول',
 'filehist-revert' => 'په څټ ګرځول',
 'filehist-current' => 'اوسنی',
 'filehist-datetime' => 'نېټه/وخت',
@@ -1361,6 +1375,7 @@ $1',
 'sharedupload-desc-here' => 'دا دوتنه د $1 لخوا خپرېږې او کېدای شي چې دا په نورو پروژو هم کارېدلې وي.
 د دوتنې د کارېدنې لا نور مالومات د [$2 دوتنې د څرګندنو په مخ] لاندې ښودل شوی.',
 'filepage-nofile' => 'په دې نوم کومه دوتنه نشته.',
+'filepage-nofile-link' => 'په دې نوم کومه دوتنه نشته، خو تاسې يې [$1 پورته کولی شی].',
 'uploadnewversion-linktext' => 'د همدغې دوتنې نوې بڼه پورته کول',
 'shared-repo-from' => 'د $1 لخوا',
 
@@ -1421,7 +1436,7 @@ $1',
 'statistics-users' => 'ثبت شوي [[Special:ListUsers|کارنان]]',
 'statistics-users-active' => 'فعاله کارنان',
 'statistics-users-active-desc' => 'هغه کارنان چې په {{PLURAL:$1|وروستۍ ورځ|وروستيو $1 ورځو}} کې فعاله ونډه لرلې',
-'statistics-mostpopular' => 'تر ټولو ډېر کتل شوي مخونه',
+'statistics-mostpopular' => 'ډېر کتل شوي مخونه',
 
 'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
 'disambiguationspage' => 'Template:ناجوت',
@@ -1450,15 +1465,15 @@ $1',
 'ntransclusions' => 'په $1 {{PLURAL:$1|مخ|مخونو}} کارېدلی',
 'specialpage-empty' => 'د دې راپور لپاره کومې پايلې نشته.',
 'lonelypages' => 'يتيم مخونه',
-'uncategorizedpages' => 'Ù¾Ù\87 Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 Ù\86اÙ\88Û\90Ø´Ù\84Ù\8a Ù\85Ø®Ù\88Ù\86Ù\87',
-'uncategorizedcategories' => 'Ù¾Ù\87 Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 Ù\86اÙ\88Û\90Ø´Ù\84Û\90 Ù\88Û\90Ø´Ù\86Ù\8aزÛ\90',
-'uncategorizedimages' => 'Ù¾Ù\87 Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 Ù\86اÙ\88Û\90Ø´Ù\84Ù\8a Ø§Ù\86Ú\81Ù\88رÙ\86Ù\87',
-'uncategorizedtemplates' => 'Ù¾Ù\87 Ù\88Û\90Ø´Ù\86Ù\8aزÙ\88 Ù\86اÙ\88Û\90Ø´Ù\84Û\90 Ú©Ù\8aÙ\86Ú\89Û\8d',
+'uncategorizedpages' => 'ناوېشلي مخونه',
+'uncategorizedcategories' => 'ناوېشلې وېشنيزې',
+'uncategorizedimages' => 'ناوېشلي انځورنه',
+'uncategorizedtemplates' => 'ناوېشلې کينډۍ',
 'unusedcategories' => 'ناکارېدلې وېشنيزې',
 'unusedimages' => 'ناکارېدلې دوتنې',
 'popularpages' => 'نامتو مخونه',
 'wantedcategories' => 'غوښتلې وېشنيزې',
-'wantedpages' => 'غوښتل شوې پاڼې',
+'wantedpages' => 'غوښتلي مخونه',
 'wantedfiles' => 'غوښتلې دوتنې',
 'wantedtemplates' => 'غوښتلې کينډۍ',
 'mostlinked' => 'د ډېرو تړنو مخونه',
@@ -1496,7 +1511,7 @@ $1',
 
 # Book sources
 'booksources' => 'د کتاب سرچينې',
-'booksources-search-legend' => 'د Ú©ØªØ§Ø¨Ù\8a Ø³Ø±Ú\86Ù\8aÙ\86Ù\88 Ù\84Ù¼Ù\88Ù\86 Ù\88Ú©Ú\93Û\8d',
+'booksources-search-legend' => 'د Ú©ØªØ§Ø¨Ù\8a Ø³Ø±Ú\86Ù\8aÙ\86Ù\88 Ù¾Ù\84Ù¼Ù\86Ù\87',
 'booksources-go' => 'ورځه',
 'booksources-text' => 'دا لاندې د هغه وېبځايونو د تړنو لړليک دی چېرته چې نوي او زاړه کتابونه پلورل کېږي، او يا هم کېدای شي چې د هغه کتاب په هکله مالومات ولري کوم چې تاسو ورپسې لټېږۍ:',
 
@@ -1509,14 +1524,14 @@ $1',
 
 # Special:AllPages
 'allpages' => 'ټول مخونه',
-'alphaindexline' => '$1 نه تر $2 پورې',
+'alphaindexline' => '$1 تر $2',
 'nextpage' => 'بل مخ ($1)',
 'prevpage' => 'تېر مخ ($1)',
 'allpagesfrom' => 'هغه مخونه کتل چې پېلېږي په:',
 'allpagesto' => 'هغه مخونه کتل چې پای يې وي:',
 'allarticles' => 'ټول مخونه',
 'allinnamespace' => 'ټول مخونه ($1 نوم-تشيال)',
-'allnotinnamespace' => 'ټولې پاڼې (د $1 په نوم-تشيال کې نشته)',
+'allnotinnamespace' => 'ټول مخونه (د $1 نوم-تشيال پرته)',
 'allpagesprev' => 'پخواني',
 'allpagesnext' => 'راتلونکي',
 'allpagessubmit' => 'ورځه',
@@ -1613,9 +1628,9 @@ $1',
 
 # Watchlist
 'watchlist' => 'زما کتنلړ',
-'mywatchlist' => 'زما کتنلړ',
+'mywatchlist' => 'کتنلړ',
 'watchlistfor2' => 'د $1 لپاره $2',
-'nowatchlist' => 'ستاسو په کتلي لړليک کې هېڅ نه شته.',
+'nowatchlist' => 'ستاسې کتنلړ کې څه نه شته.',
 'watchlistanontext' => 'د خپل کتنلړ د توکو د سمولو او کتلو لپاره $1 ترسره کړۍ.',
 'watchnologin' => 'غونډال کې نه ياست ننوتي.',
 'watchnologintext' => 'ددې لپاره چې خپل کتنلړ کې بدلون راولی نو تاسو ته پکار ده چې لومړی غونډال کې [[Special:UserLogin|ورننوځۍ]].',
@@ -1635,6 +1650,8 @@ $1',
 'wlheader-enotif' => 'د برېښليک له لارې خبرول چارن شوی.*',
 'wlheader-showupdated' => "* هغه مخونه چې وروستی ځل ستاسو د کتلو نه وروسته بدلون موندلی په '''روڼ''' ليک نښه شوي.",
 'watchlistcontains' => 'ستاسې کتنلړ $1 {{PLURAL:$1|مخ|مخونه}} لري.',
+'iteminvalidname' => "د '$1' توکي سره ستونزه، ناسم نوم ...",
+'wlnote' => "دلته لاندې {{PLURAL:$1|وروستی بدلون دی|وروستي '''$1''' بدلونونه دي}} چې په {{PLURAL:$2|تېر ساعت|تېرو '''$2''' ساعتونو}} کې تر $3 نېټې او $4 بجو پېښ شوي.",
 'wlshowlast' => 'وروستي $1 ساعتونه $2 ورځې $3 ښکاره کړه',
 'watchlist-options' => 'د کتنلړ خوښنې',
 
@@ -1644,11 +1661,7 @@ $1',
 
 'enotif_mailer' => 'د {{SITENAME}} خبرتيايي برېښليک',
 'enotif_reset' => 'ټول مخونه کتل شوي نخښه کول',
-'enotif_newpagetext' => 'دا يوه نوې پاڼه ده.',
 'enotif_impersonal_salutation' => '{{SITENAME}} کارن',
-'changed' => 'بدلېدلی',
-'created' => 'جوړ شو',
-'enotif_subject' => 'د {{SITENAME}} مخ $PAGETITLE د  $PAGEEDITOR لخوا $CHANGEDORCREATED',
 'enotif_lastvisited' => 'د ټولو هغو بدلونونو د کتلو لپاره چې ستاسو د وروستي ځل راتګ نه وروسته پېښې شوي، $1 وګورۍ.',
 'enotif_lastdiff' => 'د همدغه بدلون د کتلو لپاره $1 وګورۍ.',
 'enotif_anon_editor' => 'ورکنومی کارن $1',
@@ -1683,11 +1696,11 @@ $UNWATCHURL  نه ليدنه وکړۍ
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
-'deletepage' => 'پاڼÙ\87 ړنګول',
+'deletepage' => 'Ù\85Ø® ړنګول',
 'confirm' => 'تاييد',
 'excontent' => 'د مخ مېنځپانګه دا وه: "$1"',
 'excontentauthor' => 'د مخ مېنځپانګه دا وه: "$1" (او يواځينی ونډه وال "[[Special:Contributions/$2|$2]]" وه)',
-'exblank' => 'دا مخ تش وه',
+'exblank' => 'مخ تش وه',
 'delete-confirm' => '"$1" ړنګوول',
 'delete-legend' => 'ړنګول',
 'historywarning' => "ګواښنه:''' تاسې چې د کوم مخ د ړنګېدو تکل لری، هغه د نژدې $1 {{PLURAL:$1|بڼې|بڼو}} يو پېښليک لري:",
@@ -1714,7 +1727,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Protect
 'protectlogpage' => 'د ژغورنې يادښت',
-'protectedarticle' => '"[[$1]]" وژغورلی شو',
+'protectedarticle' => '"[[$1]]" وژغورل شو',
 'modifiedarticleprotection' => 'د "[[$1]]" لپاره د ژغورنې کچه بدله شوه',
 'protect-title' => 'د "$1" لپاره د ژغورنې کچه بدلول',
 'prot_1movedto2' => '[[$1]]، [[$2]] ته ولېږدېده',
@@ -1723,6 +1736,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'protectexpiry' => 'د پای نېټه:',
 'protect_expiry_invalid' => 'د پای وخت ناسم دی.',
 'protect_expiry_old' => 'د پای وخت په تېرمهال کې دی.',
+'protect-unchain-permissions' => 'د لا ژغورلو خوښنې پرانيستل',
 'protect-text' => "تاسې کولای شی چې د '''$1''' مخ لپاره د ژغورلو کچه همدلته وګورۍ او بدلون پکې راولی.",
 'protect-locked-access' => "ستاسې ګڼون دا اجازه نه لري چې د پاڼو د ژغورنې په کچه کې بدلون راولي.
 دلته د '''$1''' مخ لپاره اوسني شته امستنې دي:",
@@ -1756,7 +1770,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'pagesize' => '(بايټونه)',
 
 # Restrictions (nouns)
-'restriction-edit' => 'سÙ\85Ù\88Ù\86',
+'restriction-edit' => 'سÙ\85Ù\88Ù\84',
 'restriction-move' => 'لېږدول',
 'restriction-create' => 'جوړول',
 'restriction-upload' => 'پورته کول',
@@ -1770,7 +1784,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'undelete' => 'ړنګ شوي مخونه کتل',
 'undeletepage' => 'ړنګ شوي مخونه کتل او بېرته پرځای کول',
 'viewdeletedpage' => 'ړنګ شوي مخونه کتل',
-'undeletebtn' => 'بېرته پرځای کول',
+'undeletebtn' => 'بيازېرمل',
 'undeletelink' => 'کتل/بيازېرمل',
 'undeleteviewlink' => 'کتل',
 'undeletereset' => 'بياايښودل',
@@ -1790,9 +1804,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'blanknamespace' => '(آرنی)',
 
 # Contributions
-'contributions' => 'د کارن ونډې',
+'contributions' => '{{GENDER:$1|کارن}} ونډې',
 'contributions-title' => 'د $1 کارن ونډې',
-'mycontris' => 'زما ونډې',
+'mycontris' => 'ونډې',
 'contribsub2' => 'د $1 لپاره ($2)',
 'uctop' => '(سرپاڼه)',
 'month' => 'له مياشتې د (او پخواني):',
@@ -1805,7 +1819,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'sp-contributions-uploads' => 'پورته کېدنې',
 'sp-contributions-logs' => 'يادښتونه',
 'sp-contributions-talk' => 'خبرې اترې',
-'sp-contributions-search' => 'د Ù\88Ù\86Ú\89Ù\88 Ù\84Ù¼Ù\88Ù\86',
+'sp-contributions-search' => 'د Ù\88Ù\86Ú\89Ù\88 Ù¾Ù\84Ù¼Ù\86Ù\87',
 'sp-contributions-username' => 'IP پته يا کارن-نوم:',
 'sp-contributions-toponly' => 'يوازې هغه سمونونه چې تر ټولو تازه بڼې لري ښکاره کول',
 'sp-contributions-submit' => 'پلټل',
@@ -1825,7 +1839,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'whatlinkshere-hideredirs' => 'مخ ګرځونې $1',
 'whatlinkshere-hidetrans' => 'پايلې $1',
 'whatlinkshere-hidelinks' => 'تړنې $1',
-'whatlinkshere-hideimages' => '$1 د انځور تړنې',
+'whatlinkshere-hideimages' => 'د دوتنې تړنې $1',
 'whatlinkshere-filters' => 'چاڼګرونه',
 
 # Block/unblock
@@ -1881,7 +1895,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'ipblocklist-submit' => 'پلټل',
 'ipblocklist-localblock' => 'سيمه ايز بنديز',
 'ipblocklist-otherblocks' => '{{PLURAL:$1|بل بنديز|نور بنديزونه}}',
-'infiniteblock' => 'Ù\84امحدوده',
+'infiniteblock' => 'Ù\86امحدوده',
 'expiringblock' => 'په $1 نېټه، $2 بجو پای ته رسېږي',
 'anononlyblock' => 'يواځې ورکنومی',
 'createaccountblock' => 'په ګڼون جوړولو بنديز لګېدلی',
@@ -1912,8 +1926,10 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'lockdb' => 'توکبنسټ تړل',
 'unlockdb' => 'توکبنسټ پرانيستل',
 'lockconfirm' => 'هو، زه د توکبنسټ تړل غواړم.',
+'unlockconfirm' => 'هو، زه د توکبنسټ پرانيستل غواړم.',
 'lockbtn' => 'توکبنسټ تړل',
 'unlockbtn' => 'توکبنسټ پرانيستل',
+'databasenotlocked' => 'توکبنسټ نه دی تړل شوی.',
 
 # Move page
 'move-page' => '$1 لېږدول',
@@ -1929,6 +1945,16 @@ $UNWATCHURL  نه ليدنه وکړۍ
 '''ګواښنه!'''
 يوه نوي نوم ته د مخونو د نوم بدلون کېدای شي چې په نامتو مخونو کې بنسټيزه او نه اټکل کېدونکی بدلونونه رامېنځ ته کړي;
 مخکې له دې نه چې پرمخ ولاړ شی، لطفاُ لومړی خپل ځان په دې ډاډه کړی چې تاسې ددغې کړنې په پايلو ښه پوهېږۍ.",
+'movepagetext-noredirectfixer' => "د لاندينۍ فورمې په کارولو سره تاسې د يوه مخ نوم بدلولی شی، چې په همدې توګه به د يوه مخ ټول پېښليک د هغه د نوي نوم سرليک ته ولېږدېږي.
+د يوه مخ، پخوانی نوم به د نوي نوم ورګرځونکی مخ وګرځي او نوي سرليک ته به وګرځولی شي.
+
+[[Special:BrokenRedirects|د ماتو مخ ګرځونو]] يا [[Special:DoubleRedirects|دوه ځلي مخ ګرځونو]] د ستونزو د پېښېدو په خاطر ځان ډاډه کړی چې ستاسې مخ ګرځونې ماتې يا دوه ځله نه وي.
+دا ستاسې پازه ده چې ځان په دې هم ډاډمن کړی چې آيا هغه تړنې کوم چې د يو مخ سره پکار دي چې وي، همداسې په پرله پسې توګه پېيلي او خپل د موخې ځايونو سره اړونده دي که نه.
+
+په ياد مو اوسه چې يو مخ به '''هېڅکله''' و نه لېږدېږي که چېرته د پخوا نه په هماغه نوم يو بل مخ شتون ولري، خو که چېرته يو مخ تش وه او يا هم يوه مخ ګرځونه چې پېښليک کې يې بدلون نه وي راغلی. نو دا په دې مانا ده چې تاسې کولای شی چې د يو مخ نوم بېرته هماغه پخواني نوم ته بدل کړی چې د پخوا نه يې درلوده، که چېرته تاسې تېرووځۍ نو په داسې حال کې تاسې نه شی کولای چې د يوه مخ پر سر يو څه وليکۍ.
+
+'''ګواښنه!'''
+يوه نوي نوم ته د مخونو د نوم بدلون کېدای شي چې په نامتو مخونو کې بنسټيزه او نه اټکل کېدونکي بدلونونه رامېنځ ته کړي; مخکې له دې نه چې پرمخ ولاړ شی، لطفاُ لومړی خپل ځان په دې ډاډه کړی چې تاسې ددغې کړنې په پايلو ښه پوهېږۍ.",
 'movepagetalktext' => "همدې مخ ته اړونده د خبرواترو مخ هم په اتوماتيک ډول لېږدول کېږي '''خو که چېرته:'''
 *په نوي نوم د پخوا نه د خبرواترو يو مخ شتون ولري، او يا هم
 *تاسې ته لاندې ورکړ شوی څلورڅنډی په نښه شوی وي.
@@ -1980,10 +2006,10 @@ $UNWATCHURL  نه ليدنه وکړۍ
 # Namespace 8 related
 'allmessages' => 'د غونډال پيغامونه',
 'allmessagesname' => 'نوم',
-'allmessagesdefault' => 'ټاکل شوی متن',
-'allmessagescurrent' => 'اوسنی متن',
+'allmessagesdefault' => 'تلواليزه پيغام متن',
+'allmessagescurrent' => 'اÙ\88سÙ\86Û\8c Ù¾Ù\8aغاÙ\85 Ù\85تÙ\86',
 'allmessagestext' => 'دا د مېډياويکي په نوم-تشيال کې د غونډال د پيغامونو لړليک دی.
-که چېرته تاسو د ميډياويکي په ځايتابه کې ونډې ترسره کول غواړۍ نو لطفاً [//www.mediawiki.org/wiki/Localisation د ويډياويکي ځايتابه] او [//translatewiki.net translatewiki.net] نه ليدنه وکړۍ.',
+که چېرته تاسې د ميډياويکي په ځايتابه کې ونډې ترسره کول غواړۍ نو لطفاً [//www.mediawiki.org/wiki/Localisation د ويډياويکي ځايتابه] او [//translatewiki.net translatewiki.net] نه ليدنه وکړۍ.',
 'allmessagesnotsupportedDB' => "'''Special:Allmessages''' ترېنه کار نه اخيستل کېږي ځکه چې '''\$wgUseDatabaseMessages''' مړ دی.",
 'allmessages-filter-legend' => 'چاڼګر',
 'allmessages-filter-unmodified' => 'نابدلېدلي',
@@ -2000,13 +2026,16 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Special:Import
 'import-interwiki-source' => 'سرچينيز ويکي/مخ:',
+'import-interwiki-history' => 'د دې مخ د پېښليک ټولې بڼې لمېسل',
 'import-interwiki-templates' => 'ټولې کينډۍ نغاړل',
 'import-interwiki-namespace' => 'د موخې نوم-تشيال:',
 'import-upload-filename' => 'د دوتنې نوم:',
 'import-comment' => 'تبصره:',
+'import-revision-count' => '$1 {{PLURAL:$1|بڼه|بڼې}}',
 
 # Import log
 'importlogpage' => 'د واردولو يادښت',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|بڼه|بڼې}}',
 
 # JavaScriptTest
 'javascripttest' => 'د جاوا سکرېپټ آزمېښت',
@@ -2018,7 +2047,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-pt-watchlist' => 'د هغه مخونو لړليک چې تاسې يې د بدلون لپاره څاری',
 'tooltip-pt-mycontris' => 'ستاسې د ونډو لړليک',
 'tooltip-pt-login' => 'تاسې ته په غونډال کې د ننوتلو سپارښتنه کوو، که څه هم چې دا يو اړين کار نه دی.',
-'tooltip-pt-anonlogin' => 'تاسÙ\88 ØªÙ\87 Ù¾Ù\87 ØºÙ\88Ù\86Ú\89اÙ\84 Ú©Û\90 Ø¯ Ù\86Ù\86Ù\88تÙ\86Û\90 سپارښتنه کوو، که څه هم چې دا يو اړين کار نه دی.',
+'tooltip-pt-anonlogin' => 'تاسÙ\88 ØªÙ\87 Ù¾Ù\87 ØºÙ\88Ù\86Ú\89اÙ\84 Ú©Û\90 Ø¯ Ù\86Ù\86Ù\88تÙ\84Ù\88 سپارښتنه کوو، که څه هم چې دا يو اړين کار نه دی.',
 'tooltip-pt-logout' => 'وتل',
 'tooltip-ca-talk' => 'د مخ د مېنځپانګې په اړه خبرې اترې',
 'tooltip-ca-edit' => 'تاسې همدا مخ سمولای شی. لطفاً د ليکنې د خوندي کولو دمخه، د همدې ليکنې مخليدنه وګورۍ.',
@@ -2034,7 +2063,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-search' => '{{SITENAME}} پلټل',
 'tooltip-search-go' => 'په دې نوم د کټ مټ ورته مخ شتون په صورت کې، هماغه مخ ته ورځه',
 'tooltip-search-fulltext' => 'په مخونو کې دا متن وپلټه',
-'tooltip-p-logo' => 'لومړی مخ',
+'tooltip-p-logo' => 'لومړي مخ ته ورتلل',
 'tooltip-n-mainpage' => 'لومړي مخ ته ورتلل',
 'tooltip-n-mainpage-description' => 'آرنی مخ کتل',
 'tooltip-n-portal' => 'د پروژې په اړه، تاسې څه شيان او چېرته کولای شی چې وې مومۍ',
@@ -2058,7 +2087,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-ca-nstab-special' => 'دا يو ځانګړی مخ دی، تاسې په دې مخ کې سمون نه شی کولای.',
 'tooltip-ca-nstab-project' => 'د پروژې مخ کتل',
 'tooltip-ca-nstab-image' => 'د دوتنې مخ کتل',
-'tooltip-ca-nstab-mediawiki' => 'د ØºÙ\88Ù\86Ú\89اÙ\84 Ù¾Ù\8aغاÙ\85Ù\88Ù\86Ù\87 Ú\9aکارÙ\87 Ú©Ù\88ل',
+'tooltip-ca-nstab-mediawiki' => 'د ØºÙ\88Ù\86Ú\89اÙ\84 Ù¾Ù\8aغاÙ\85Ù\88Ù\86Ù\87 Ú©Øªل',
 'tooltip-ca-nstab-template' => 'کينډۍ کتل',
 'tooltip-ca-nstab-help' => 'د لارښود مخ کتل',
 'tooltip-ca-nstab-category' => 'د وېشنيزې مخ ښکاره کول',
@@ -2075,6 +2104,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-preferences-save' => 'غوره توبونه خوندي کول',
 'tooltip-summary' => 'يو لنډ لنډيز کښل',
 
+# Stylesheets
+'vector.css' => '/* د CSS هره بڼه چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */',
+
 # Scripts
 'vector.js' => '/* د جاوا هر يو سکرېپټ چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */',
 
@@ -2090,10 +2122,28 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Info page
 'pageinfo-title' => 'د "$1" مالومات',
+'pageinfo-header-basic' => 'بنسټيز مالومات',
 'pageinfo-header-edits' => 'د سمون پېښليک',
+'pageinfo-header-restrictions' => 'مخ ژغورنه',
+'pageinfo-header-properties' => 'د مخ ځانتياوې',
+'pageinfo-display-title' => 'ښکارېدونکی سرليک',
+'pageinfo-length' => 'مخ اوږدوالی (په بايټونو)',
+'pageinfo-article-id' => 'د مخ پېژند',
+'pageinfo-language' => 'د مخ د مېنځپانګې ژبه',
+'pageinfo-robot-policy' => 'د پلټن ماشين دريځ',
+'pageinfo-robot-index' => 'ليکلړوړ',
+'pageinfo-robot-noindex' => 'ليکلړوړ نه',
 'pageinfo-views' => 'د کتنو شمېر',
 'pageinfo-watchers' => 'د مخ د کتونکو شمېر',
+'pageinfo-redirects-name' => 'دې مخ ته ورګرځونې',
+'pageinfo-subpages-name' => 'دې مخ ته څېرمه مخونه',
+'pageinfo-firstuser' => 'مخ جوړونکی',
+'pageinfo-firsttime' => 'د مخ جوړېدنې نېټه',
+'pageinfo-lastuser' => 'وروستنی سمونګر',
 'pageinfo-edits' => 'د ټولو سمونونو شمېر',
+'pageinfo-toolboxlink' => 'د مخ مالومات',
+'pageinfo-contentpage' => 'مېنځپانګيز مخ کې شمېرل شوی',
+'pageinfo-contentpage-yes' => 'هو',
 
 # Skin names
 'skinname-standard' => 'کلاسيک',
@@ -2111,6 +2161,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # Image deletion
 'filedeleteerror-short' => 'د دوتنې د ړنګولو ستونزه: $1',
+'filedeleteerror-long' => 'د دوتنې په ړنګولو کې تېروتنې پېښې شوې:
+
+$1',
 
 # Browsing diffs
 'previousdiff' => 'تېر توپير ←',
@@ -2180,7 +2233,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'exif-imagewidth' => 'سوروالی',
 'exif-imagelength' => 'لوړوالی',
 'exif-datetime' => 'د دوتنې د بدلون وخت او نېټه',
-'exif-imagedescription' => 'د Ø§Ù\86Ú\81Ù\88ر Ø³Ø±Ù\84Ù\8aÚ©',
+'exif-imagedescription' => 'انځور سرليک',
 'exif-make' => 'د کامرې جوړونکی',
 'exif-model' => 'د کامرې ماډل',
 'exif-software' => 'کارېدلې ساوترۍ',
@@ -2601,8 +2654,9 @@ $5
 'revdelete-content-unhid' => 'مېنځپانګه ښکاره شوی',
 'revdelete-uname-unhid' => 'ښکاره کارن-نوم',
 'logentry-move-move' => '$1 د $3 مخ $4 ته ولېږداوه',
-'logentry-newusers-newusers' => '$1 يو کارن ګڼون جوړ کړ',
-'logentry-newusers-create' => '$1 يو کارن ګڼون جوړ کړ',
+'logentry-newusers-newusers' => 'د $1 کارن ګڼون جوړ شو',
+'logentry-newusers-create' => 'د $1 کارن ګڼون جوړ شو',
+'logentry-newusers-autocreate' => 'د $1 ګڼون په اتوماتيک ډول جوړ شو',
 'newuserlog-byemail' => 'پټنوم مو برېښليک ته درولېږه',
 
 # Feedback
@@ -2611,6 +2665,9 @@ $5
 'feedback-cancel' => 'ناګارل',
 'feedback-close' => 'ترسره شو',
 
+# Search suggestions
+'searchsuggest-search' => 'پلټل',
+
 # API errors
 'api-error-duplicate-popup-title' => 'غبرګونې {{PLURAL:$1|دوتنه|دوتنې}}.',
 'api-error-empty-file' => 'کومه دوتنه چې تاسې دلته سپارلې هغه تشه ده.',
index dc9cd65..672a8a5 100644 (file)
@@ -201,7 +201,6 @@ $magicWords = array(
        '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' ),
@@ -443,7 +442,7 @@ $messages = array(
 'newwindow' => '(abre numa janela nova)',
 'cancel' => 'Cancelar',
 'moredotdotdot' => 'Mais...',
-'mypage' => 'Utilizador',
+'mypage' => 'Página',
 'mytalk' => 'Discussão',
 'anontalk' => 'Discussão para este IP',
 'navigation' => 'Navegação',
@@ -454,7 +453,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Minhas páginas',
 'qbspecialpages' => 'Páginas especiais',
 'faq' => 'FAQ',
@@ -467,7 +465,7 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Alterar protecção',
-'vector-simplesearch-preference' => 'Activar sugestões de busca melhoradas (apenas no tema Vector)',
+'vector-simplesearch-preference' => 'Activar barra de buscas simplificada (apenas no tema Vector)',
 'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver histórico',
@@ -690,7 +688,7 @@ Consulta: $2',
 'protectedpagetext' => 'Esta página foi protegida contra novas edições.',
 'viewsourcetext' => 'Pode ver e copiar o conteúdo desta 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.',
+'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)',
 'cascadeprotected' => 'Esta página foi protegida contra edições por estar incluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de protecção "em cascata" activada):
@@ -717,11 +715,8 @@ O administrador que efetuou o bloqueio deu a seguinte explicação: "$3".',
 # Login and logout pages
 'logouttext' => "'''Já não está autenticado.'''
 
-Pode continuar a utilizar a {{SITENAME}} anonimamente, ou pode [[Special:UserLogin|autenticar-se novamente]] com o mesmo nome de utilizador ou com um nome de utilizador diferente.
+Pode continuar a utilizar a {{SITENAME}} anonimamente, ou pode <span class='plainlinks'>[$1 autenticar-se novamente]</span> com o mesmo nome de utilizador ou com um nome de utilizador diferente.
 Tenha em atenção que algumas páginas poderão continuar a ser apresentadas como se ainda estivesse autenticado até limpar a cache do seu browser.",
-'welcomecreation' => '== Bem-vindo, $1! ==
-A sua conta foi criada.
-Não se esqueça de personalizar as suas [[Special:Preferences|preferências na {{SITENAME}}]].',
 'yourname' => 'Nome de utilizador:',
 'yourpassword' => 'Palavra-chave:',
 'yourpasswordagain' => 'Repita a palavra-chave:',
@@ -976,8 +971,7 @@ Pode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras p
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar registos relacionados]
 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>.',
+Pode [[Special:Search/{{PAGENAME}}|pesquisar o título desta página]] noutras páginas, ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} procurar nos registos relacionados]</span>, mas não tem permissão para criar esta página.',
 '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.
@@ -1007,7 +1001,7 @@ Este ainda não foi gravado!",
 'note' => "'''Nota:'''",
 'previewnote' => "'''Lembre-se que esta é apenas uma antevisão do resultado.'''
 As modificações ainda não foram gravadas!",
-'continue-editing' => 'Continuar a editar',
+'continue-editing' => 'Ir para a área de edição',
 'previewconflict' => 'Esta antevisão do resultado apresenta o texto da caixa de edição acima tal como este aparecerá se escolher gravá-lo.',
 'session_fail_preview' => "'''Não foi possível processar a edição devido à perda dos dados da sua sessão.
 Tente novamente, por favor.
@@ -1093,6 +1087,10 @@ Ela parece ter sido eliminada.',
 Ela já existia.',
 'defaultmessagetext' => 'Texto da mensagem padrão',
 
+# Content models
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Aviso: Esta página contém demasiadas chamadas de funções exigentes do analisador sintáctico.
 
@@ -1353,8 +1351,6 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-caption' => 'Projectos associados',
 'search-interwiki-default' => 'Resultados de $1:',
 'search-interwiki-more' => '(mais)',
-'search-mwsuggest-enabled' => 'com sugestões',
-'search-mwsuggest-disabled' => 'sem sugestões',
 'search-relatedarticle' => 'Relacionado',
 'mwsuggest-disable' => 'Desactivar sugestões AJAX',
 'searcheverything-enable' => 'Pesquisar em todos os espaços nominais',
@@ -1623,6 +1619,7 @@ Esta informação será pública.',
 'rightslogtext' => 'Este é um registo de mudanças nos privilégios dos utilizadores.',
 'rightslogentry' => 'alterou grupos de $1 (de $2 para $3)',
 'rightslogentry-autopromote' => 'foi automaticamente promovido de $2 para $3',
+'logentry-rights-rights' => '$1 modificou os privilégios do utilizador  $3  de  $4  para $5',
 'rightsnone' => '(nenhum)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -2305,6 +2302,7 @@ Encontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações
 '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 correio electrónico a este utilizador',
+'emailuser-title-target' => 'Enviar correio eletrónico a {{GENDER:$1|este utilizador|esta utilizadora}}',
 '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.',
@@ -2375,11 +2373,7 @@ O nome desta página passará a aparecer a '''negrito''' na lista de [[Special:R
 
 'enotif_mailer' => 'Gerador de Notificações da {{SITENAME}}',
 'enotif_reset' => 'Marcar todas as páginas como visitadas',
-'enotif_newpagetext' => 'Esta é uma página nova.',
 'enotif_impersonal_salutation' => 'Utilizador da "{{SITENAME}}"',
-'changed' => 'alterada',
-'created' => 'criada',
-'enotif_subject' => '{{SITENAME}}: A página $PAGETITLE foi $CHANGEDORCREATED por $PAGEEDITOR',
 'enotif_lastvisited' => 'Consulte $1 para todas as alterações efectuadas desde a sua última visita.',
 'enotif_lastdiff' => 'Consulte $1 para ver esta alteração.',
 'enotif_anon_editor' => 'utilizador anónimo $1',
@@ -2597,7 +2591,7 @@ $1',
 'blanknamespace' => '(Principal)',
 
 # Contributions
-'contributions' => 'Contribuições do utilizador',
+'contributions' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}}',
 'contributions-title' => 'Contribuições {{GENDER:$1|do utilizador|da utilizadora}} $1',
 'mycontris' => 'Contribuições',
 'contribsub2' => 'Para $1 ($2)',
@@ -2640,7 +2634,7 @@ Para referência é apresentado abaixo o último registo de bloqueio:',
 'whatlinkshere-hideredirs' => '$1 redireccionamentos',
 'whatlinkshere-hidetrans' => '$1 transclusões',
 'whatlinkshere-hidelinks' => '$1 links',
-'whatlinkshere-hideimages' => '$1 links para imagens',
+'whatlinkshere-hideimages' => '$1 links para ficheiros',
 'whatlinkshere-filters' => 'Filtros',
 
 # Block/unblock
@@ -2994,7 +2988,6 @@ Não há um directório temporário.',
 
 # JavaScriptTest
 'javascripttest' => 'Teste de JavaScript',
-'javascripttest-disabled' => 'Esta função está desabilitada neste wiki.',
 'javascripttest-title' => 'Executando os testes $1',
 'javascripttest-pagetext-noframework' => 'Esta página é reservada para a execução de testes de JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Estrutura de testes "$1" desconhecido.',
@@ -3150,9 +3143,11 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 'pageinfo-authors' => 'Número total de autores distintos',
 'pageinfo-recent-edits' => 'Número de edições recentes (nos últimos $1)',
 'pageinfo-recent-authors' => 'Número recente de autores distintos',
-'pageinfo-restriction' => 'Proteção da página ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Palavra mágica|Palavras mágicas}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}} ($1)',
+'pageinfo-toolboxlink' => 'Informações da página',
+'pageinfo-contentpage-yes' => 'Sim',
+'pageinfo-protect-cascading-yes' => 'Sim',
 
 # Skin names
 'skinname-standard' => 'Clássico',
@@ -4010,6 +4005,10 @@ Caso contrário, pode facilmente usar o formulário abaixo. O seu comentário se
 'feedback-bugcheck' => 'Perfeito! Verifique apenas que não é já um dos [$1 defeitos conhecidos].',
 'feedback-bugnew' => 'Eu verifiquei. Comunicar um novo defeito.',
 
+# Search suggestions
+'searchsuggest-search' => 'Pesquisa',
+'searchsuggest-containing' => 'contendo...',
+
 # API errors
 'api-error-badaccess-groups' => 'Não tem permissão para enviar ficheiros para esta wiki.',
 'api-error-badtoken' => 'Erro interno: Chave incorrecta.',
index f109d93..52ea9a5 100644 (file)
@@ -204,7 +204,6 @@ $magicWords = array(
        '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' ),
@@ -314,7 +313,7 @@ $magicWords = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline' => 'Sublinhar ligação:',
+'tog-underline' => 'Sublinhar links:',
 'tog-justify' => 'Justificar parágrafos',
 'tog-hideminor' => 'Ocultar edições menores nas mudanças recentes',
 'tog-hidepatrolled' => 'Ocultar edições patrulhadas nas mudanças recentes',
@@ -324,7 +323,7 @@ $messages = array(
 '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 ligações [editar]',
+'tog-editsection' => 'Ativar a edição de seções com links [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}})',
@@ -342,10 +341,10 @@ $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 ligação automática)',
+'tog-fancysig' => 'Tratar assinatura como wikitexto (sem link automático)',
 'tog-externaleditor' => 'Utilizar editor externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
 'tog-externaldiff' => 'Utilizar comparador de versões externo por padrão (apenas para usuários avançados; requer configurações adicionais em seu computador. [//www.mediawiki.org/wiki/Manual:External_editors Mais informações.])',
-'tog-showjumplinks' => 'Ativar ligações de acessibilidade "ir para"',
+'tog-showjumplinks' => 'Ativar links de acessibilidade "ir para"',
 'tog-uselivepreview' => 'Utilizar pré-visualização em tempo real (JavaScript) (Experimental)',
 'tog-forceeditsummary' => 'Avisar-me ao introduzir um sumário vazio',
 'tog-watchlisthideown' => 'Ocultar as minhas edições da lista de páginas vigiadas',
@@ -440,15 +439,15 @@ $messages = array(
 'listingcontinuesabbrev' => 'cont.',
 'index-category' => 'Páginas indexadas',
 'noindex-category' => 'Páginas não indexadas',
-'broken-file-category' => 'Páginas com ligações quebradas para arquivos',
+'broken-file-category' => 'Páginas com links inválidos para arquivos',
 
 'about' => 'Sobre',
 'article' => 'Página de conteúdo',
 'newwindow' => '(abre em uma nova janela)',
 'cancel' => 'Cancelar',
 'moredotdotdot' => 'Mais...',
-'mypage' => 'Minha página',
-'mytalk' => 'Minha discussão',
+'mypage' => 'Página',
+'mytalk' => 'Discussão',
 'anontalk' => 'Discussão para este IP',
 'navigation' => 'Navegação',
 'and' => '&#32;e',
@@ -458,7 +457,6 @@ $messages = array(
 'qbbrowse' => 'Navegar',
 'qbedit' => 'Editar',
 'qbpageoptions' => 'Esta página',
-'qbpageinfo' => 'Contexto',
 'qbmyoptions' => 'Minhas páginas',
 'qbspecialpages' => 'Páginas especiais',
 'faq' => 'FAQ',
@@ -471,7 +469,7 @@ $messages = array(
 'vector-action-protect' => 'Proteger',
 'vector-action-undelete' => 'Restaurar',
 'vector-action-unprotect' => 'Alterar a proteção',
-'vector-simplesearch-preference' => 'Ativar sugestões de busca melhoradas (apenas no tema Vector)',
+'vector-simplesearch-preference' => 'Ativar barra simplificada de buscas (apenas no skin Vector)',
 'vector-view-create' => 'Criar',
 'vector-view-edit' => 'Editar',
 'vector-view-history' => 'Ver histórico',
@@ -493,7 +491,7 @@ $messages = array(
 'history_short' => 'Histórico',
 'updatedmarker' => 'atualizado desde a minha última visita',
 'printableversion' => 'Versão para impressão',
-'permalink' => 'Ligação permanente',
+'permalink' => 'Link permanente',
 'print' => 'Imprimir',
 'view' => 'Ver',
 'edit' => 'Editar',
@@ -623,7 +621,7 @@ 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 uma ligação incorreta.
+Você deve ter se enganado ao digitar a URL, ou acessou um link incorreto.
 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>
@@ -633,12 +631,12 @@ Uma lista de páginas especiais válidas poderá ser encontrada em [[Special:Spe
 # General errors
 'error' => 'Erro',
 'databaseerror' => 'Erro no banco de dados',
-'dberrortext' => 'Ocorreu um erro de sintaxe de busca no banco de dados.
-Isto pode indicar um problema com o \'\'software\'\'.
+'dberrortext' => 'Ocorreu um erro de sintaxe na busca no banco de dados.
+Isto pode indicar um bug no software.
 A última tentativa de busca no banco de dados foi:
-<blockquote><tt>$1</tt></blockquote>
-na função "<tt>$2</tt>".
-O banco de dados retornou o erro "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+na função "<code>$2</code>".
+O banco de dados retornou o erro "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Ocorreu um erro de sintaxe de busca no banco de dados.
 A última tentativa de busca no banco de dados foi:
 "$1"
@@ -652,10 +650,10 @@ 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 uma ligação de diferença (diff) desatualizada ou para o histórico de uma página que foi apagada.
+Isso normalmente é causado ao acessar um link de diferença (dif) desatualizado 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]].',
+Se este não for o caso, você pode ter encontrado um defeito (bug) no software.
+Anote a URL e reporte o ocorrido a um [[Special:ListUsers/sysop|administrador]].',
 'missingarticle-rev' => '(revisão#: $1)',
 'missingarticle-diff' => '(Dif.: $1, $2)',
 'readonly_lag' => 'O banco de dados foi automaticamente bloqueado enquanto os servidores secundários se sincronizam com o principal',
@@ -721,11 +719,8 @@ O administrador que bloqueou ofereceu a seguinte explicação: "$3".',
 # Login and logout pages
 'logouttext' => "'''Agora você encontra-se desautenticado.'''
 
-É possível continuar usando {{SITENAME}} anonimamente ou [[Special:UserLogin|autenticar-se novamente]] com o mesmo nome de usuário ou com um nome diferente.
+É possível continuar usando {{SITENAME}} anonimamente ou <span class='plainlinks'>[$1 autenticar-se novamente]</span> com o mesmo nome de usuário ou com um nome diferente.
 Note que algumas páginas podem continuar sendo exibidas como se você ainda estivesse autenticado até que você limpe a ''cache'' do seu navegador.",
-'welcomecreation' => '== Bem-vindo(a), $1! ==
-A sua conta foi criada.
-Não se esqueça de personalizar as suas [[Special:Preferences|preferências no wiki {{SITENAME}}]].',
 'yourname' => 'Nome de usuário:',
 'yourpassword' => 'Senha:',
 'yourpasswordagain' => 'Redigite sua senha',
@@ -850,12 +845,17 @@ 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). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
+'passwordreset-emailtext-ip' => 'Alguém (provavelmente você, a partir do endereço IP $1)
+solicitou um lembrete dos seus 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 na ligação.',
+{{PLURAL:$3|Esta senha temporária vai|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. Caso contrário, prossiga com as instruções
+disponíveis no link.',
 'passwordreset-emailtext-user' => 'O usuário $1 da {{SITENAME}} pediu a recuperação dos detalhes da sua conta na {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:
 
 $2
@@ -883,10 +883,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 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://)',
+'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://)',
 'headline_sample' => 'Conteúdo do cabeçalho',
 'headline_tip' => 'Seção de nível 2',
 'nowiki_sample' => 'Inserir texto não-formatado aqui',
@@ -894,7 +894,7 @@ Senha temporária: $2',
 'image_sample' => 'Exemplo.jpg',
 'image_tip' => 'Arquivo embutido',
 'media_sample' => 'Exemplo.ogg',
-'media_tip' => 'Ligação para o arquivo',
+'media_tip' => 'Link para o arquivo',
 'sig_tip' => 'Sua assinatura, com hora e data',
 'hr_tip' => 'Linha horizontal (use de forma moderada)',
 
@@ -962,7 +962,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 uma ligação para uma página que ainda não existe.
+'newarticletext' => "Você seguiu um link 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.''",
@@ -971,7 +971,7 @@ Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]]
 ou [{{fullurl:{{FULLPAGENAME}}|action=edit}} criar esta página]</span>.',
 'noarticletext-nopermission' => 'No momento, não há conteúdo nesta página
 Você pode [[Special:Search/{{PAGENAME}}|pesquisar pelo título desta página]] em outras páginas,
-ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>.',
+ou <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar por registros relacionados] </span>. Note que, no entanto, você não tem permissão para criar esta página.',
 '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.
@@ -1043,7 +1043,7 @@ A página não pode ser salva.",
 Pode, no entanto, copiar o seu texto num editor externo e guardá-lo para posterior envio.
 
 Quem bloqueou o banco de dados forneceu a seguinte justificativa: $1",
-'protectedpagewarning' => "'''Atenção: Esta página foi protegida para que apenas usuários com privilégios de administrado possam editá-la.'''
+'protectedpagewarning' => "'''Atenção: Esta página foi protegida para que apenas usuários com privilégios de administrador possam editá-la.'''
 A última entrada no histórico é fornecida abaixo como referência:",
 'semiprotectedpagewarning' => "'''Nota:''' Esta página foi protegida, sendo que apenas usuários registrados poderão editá-la.
 A última entrada no histórico é fornecida abaixo para referência:",
@@ -1336,8 +1336,6 @@ Os detalhes podem ser encontrados no [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-caption' => 'Projetos irmãos',
 'search-interwiki-default' => 'Resultados de $1:',
 'search-interwiki-more' => '(mais)',
-'search-mwsuggest-enabled' => 'com sugestões',
-'search-mwsuggest-disabled' => 'sem sugestões',
 'search-relatedarticle' => 'Relacionado',
 'mwsuggest-disable' => 'Desativar sugestões AJAX',
 'searcheverything-enable' => 'Procurar em todos os espaços nominais',
@@ -1373,7 +1371,7 @@ Note que os índices do sistema de busca externo poderão conter referências de
 
 # Preferences page
 'preferences' => 'Preferências',
-'mypreferences' => 'Minhas preferências',
+'mypreferences' => 'Preferências',
 'prefs-edits' => 'Número de edições:',
 'prefsnologin' => 'Não autenticado',
 'prefsnologintext' => 'É necessário estar <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} autenticado]</span> para definir as suas preferências.',
@@ -1436,7 +1434,7 @@ Eis um valor gerado aleatoriamente que você pode usar: $1",
 'timezoneregion-indian' => 'Oceano Índico',
 'timezoneregion-pacific' => 'Oceano Pacífico',
 'allowemail' => 'Permitir que outros usuários me enviem e-mails',
-'prefs-searchoptions' => 'Opções de busca',
+'prefs-searchoptions' => 'Busca',
 'prefs-namespaces' => 'Espaços nominais',
 'defaultns' => 'Caso contrário pesquisar nestes espaços nominais:',
 'default' => 'padrão',
@@ -1605,6 +1603,7 @@ Caso decida fornecê-lo, este será utilizado para dar-lhe crédito pelo seu tra
 'rightslogtext' => 'Este é um registro de mudanças nos privilégios de usuários.',
 'rightslogentry' => 'alterou os grupos de privilégios {{GENDER:$1|do usuário|da usuária|de usuário para}} $1 (de $2 para $3)',
 'rightslogentry-autopromote' => 'foi automaticamente promovido de $2 para $3',
+'logentry-rights-rights' => '$1 alterou os grupos de privilégios a quais pertence $3 de $4 para $5',
 'rightsnone' => '(nenhum)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -2357,11 +2356,7 @@ Modificações futuras em tal página e páginas de discussão a ela associadas
 
 'enotif_mailer' => '{{SITENAME}} Email de Notificação',
 'enotif_reset' => 'Marcar todas páginas como visitadas',
-'enotif_newpagetext' => 'Esta é uma página nova.',
 'enotif_impersonal_salutation' => 'Usuário do projeto "{{SITENAME}}"',
-'changed' => 'alterada',
-'created' => 'criada',
-'enotif_subject' => '{{SITENAME}}: A página $PAGETITLE foi $CHANGEDORCREATED por $PAGEEDITOR',
 'enotif_lastvisited' => 'Consulte $1 para todas as alterações efetuadas desde a sua última visita.',
 'enotif_lastdiff' => 'Acesse $1 para ver esta alteração.',
 'enotif_anon_editor' => 'usuário anônimo $1',
@@ -2579,7 +2574,7 @@ $1',
 # Contributions
 'contributions' => 'Contribuições {{GENDER:{{BASEPAGENAME}}|do usuário|da usuária}}',
 'contributions-title' => 'Contribuições {{GENDER:$1|do usuário|da usuária}} $1',
-'mycontris' => 'Minhas contribuições',
+'mycontris' => 'Contribuições',
 'contribsub2' => 'Para $1 ($2)',
 'nocontribs' => 'Não foram encontradas mudanças com este critério.',
 'uctop' => '(atual)',
@@ -2964,7 +2959,6 @@ Salve o arquivo no seu computador e importe-o aqui.',
 
 # JavaScriptTest
 'javascripttest' => 'Teste de JavaScript',
-'javascripttest-disabled' => 'Essa função não foi habilitada neste wiki.',
 'javascripttest-title' => 'Executando testes para $1',
 'javascripttest-pagetext-noframework' => 'Esta página é exclusiva para testes de JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'A estrutura de testes "$1" é desconhecida.',
@@ -3110,7 +3104,16 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 'pageinfo-authors' => 'Número total de autores distintos',
 'pageinfo-recent-edits' => 'Número de edições recentes (nos últimos $1)',
 'pageinfo-recent-authors' => 'Número recente de autores distintos',
-'pageinfo-restriction' => 'Proteção da página ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '{{PLURAL:$1|Palavra mágica|Palavras mágicas}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|predefinição transcluída|predefinições transcluídas}}',
+'pageinfo-toolboxlink' => 'Informações da página',
+'pageinfo-redirectsto' => 'Redirecionar para',
+'pageinfo-redirectsto-info' => 'informações',
+'pageinfo-contentpage' => 'Contado como uma página de conteúdo',
+'pageinfo-contentpage-yes' => 'Sim',
+'pageinfo-protect-cascading' => 'Proteção em cascata ativada',
+'pageinfo-protect-cascading-yes' => 'Sim',
 
 # Skin names
 'skinname-standard' => 'Clássico',
@@ -3124,7 +3127,7 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 
 # Patrolling
 'markaspatrolleddiff' => 'Marcar como patrulhada',
-'markaspatrolledtext' => 'Marcar esta página como verificada',
+'markaspatrolledtext' => 'Marcar esta página como patrulhada',
 'markedaspatrolled' => 'Marcado como verificado',
 'markedaspatrolledtext' => 'A revisão selecionada de [[:$1]] foi marcada como patrulhada.',
 'rcpatroldisabled' => 'Edições verificadas nas Mudanças Recentes desativadas',
@@ -3964,6 +3967,10 @@ Caso contrário, você poderá usar o formulário simplificado a seguir. Seu com
 'feedback-bugcheck' => 'Perfeito! Apenas verifique se não é um dos [$1 bugs já conhecidos].',
 'feedback-bugnew' => 'Eu verifiquei. Relatar um bug novo',
 
+# Search suggestions
+'searchsuggest-search' => 'Pesquisa',
+'searchsuggest-containing' => 'contendo...',
+
 # API errors
 'api-error-badaccess-groups' => 'Você não tem permissão para enviar arquivos para este wiki.',
 'api-error-badtoken' => 'Erro interno: token inválido.',
index d20b731..9dfe974 100644 (file)
@@ -45,6 +45,7 @@
  * @author Guglani
  * @author Gustronico
  * @author Hamilton Abreu
+ * @author Harsh4101991
  * @author Helix84
  * @author Holek
  * @author Huji
@@ -68,6 +69,7 @@
  * @author MF-Warburg
  * @author Malafaya
  * @author MarkvA
+ * @author Matma Rex
  * @author MaxSem
  * @author McDutchie
  * @author Meno25
@@ -195,13 +197,23 @@ Is only shown if {{msg-mw|tog-enotifusertalkpages}} or/and {{msg-mw|tog-enotifwa
 'tog-norollbackdiff' => "Option in [[Special:Preferences]], 'Misc' tab. Only shown for users with the rollback right. By default a diff is shown below the return screen of a rollback. Checking this preference toggle will suppress that. {{Gender}}
 {{Identical|Rollback}}",
 
-'underline-always' => 'Used in [[Special:Preferences]] (under "Misc"). This option means "always underline links", there are also options "never" and "browser default". {{Gender}}
+'underline-always' => 'Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].
+
+This option means "always underline links", there are also options {{msg-mw|Underline-never}} and {{msg-mw|Underline-default}}.
+
+{{Gender}}
 {{Identical|Always}}',
-'underline-never' => 'Used in [[Special:Preferences]] (under "Misc"). This option means "never underline links", there are also options "always" and "browser default". {{Gender}}
+'underline-never' => 'Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].
 
+This option means "never underline links", there are also options {{msg-mw|Underline-always}} and {{msg-mw|Underline-default}}.
+
+{{Gender}}
 {{Identical|Never}}',
-'underline-default' => 'Used in [[Special:Preferences]] (under "Misc"). This option means "underline links as in your browser", there are also options "never" and "always". {{Gender}}
+'underline-default' => 'Used in [[Special:Preferences#mw-prefsection-rendering|Preferences]].
+
+This option means "underline links as in your user skin or your browser", there are also options {{msg-mw|Underline-never}} and {{msg-mw|Underline-always}}.
 
+{{Gender}}
 {{Identical|Browser default}}',
 
 # Font style option in Special:Preferences
@@ -334,7 +346,10 @@ Possible alternatives to the word 'content' are 'subject matter' or 'wiki subjec
 
 {{Identical|Cancel}}',
 'moredotdotdot' => '{{Identical|More...}}',
-'mytalk' => 'In the personal urls page section - right upper corner.',
+'mypage' => "A text for the link to the user's user page in the links at the top of the page.",
+'mytalk' => 'In the personal urls page section - right upper corner.
+
+Used as link title in "Personal tools" toolbar.',
 'anontalk' => 'Link to the talk page appearing in [[mw:Help:Navigation#User_Links|user links]] for each anonymous users when [[mw:Manual:$wgShowIPinHeader|$wgShowIPinHeader]] is true.',
 'navigation' => 'This is shown as a section header in the sidebar of most skins.
 
@@ -350,7 +365,8 @@ This can also appear in the credits page if the credits feature is enabled,for e
 {{Identical|Find}}',
 'qbbrowse' => '{{Identical|Browse}}',
 'qbedit' => '{{Identical|Edit}}',
-'qbmyoptions' => '{{Identical|My pages}}',
+'qbmyoptions' => 'Heading in the Cologne Blue skin user menu containing links to user (talk) page, preferences, watchlist, etc.
+{{Identical|My pages}}',
 'qbspecialpages' => '{{Identical|Special pages}}',
 'faqpage' => "FAQ is short for ''frequently asked questions''. This page is only linked on some of the old skins, not in Monobook or Modern.
 
@@ -386,6 +402,7 @@ This can also appear in the credits page if the credits feature is enabled,for e
 'namespaces' => '{{Identical|Namespace}}',
 'variants' => 'Used by the Vector skin.',
 
+'navigation-heading' => 'Heading shown above the navigation menu (sidebar) for screen-readers (or in non-standard skins).',
 'errorpagetitle' => 'Message shown in browser title bar when encountering error operation.
 
 {{Identical|Error}}',
@@ -463,6 +480,7 @@ Also used as title of [[Special:Search]] page in [[Special:SpecialPages]].
 \'\'\'Note:\'\'\' This is "views" as in "appearances"/"representations", \'\'\'not\'\'\' as in "visits"/"accesses".
 {{Identical|View}}',
 'toolbox' => 'The title of the toolbox below the search menu.',
+'viewtalkpage' => 'Used in Standard (a.k.a. Classic) skin as a link to talk page for all namespaces, in edit or history mode.',
 'otherlanguages' => 'This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <tt><nowiki>[[</nowiki>en:Interwiki article]]</tt>.
 {{Identical|Otherlanguages}}',
 'redirectedfrom' => 'The text displayed when a certain page is redirected to another page.
@@ -555,9 +573,9 @@ 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 
+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}},
@@ -726,8 +744,10 @@ See also {{msg-mw|protectedinterface}}.',
 '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',
-'welcomecreation' => 'The welcome message users see after registering a user account. $1 is the username of the new user.',
+'logouttext' => 'Log out message
+* $1 is an URL to [[Special:Userlogin]] containing returnto and returntoquery parameters',
+'welcomeuser' => 'Text for a welcome heading that users see after registering a user account. $1 is the username of the new user. See [[bugzilla:42215]]',
+'welcomecreation-msg' => 'A welcome message users see after registering a user account, following a welcomeuser heading. $1 is the username of the new user. Replaces welcomecreation in 1.21wmf5,see [[bugzilla:42215]]',
 'yourname' => "In user preferences
 
 <nowiki>{{</nowiki>[[Gender|GENDER]]<nowiki>}}</nowiki> is '''NOT''' supported.
@@ -1034,7 +1054,9 @@ Example: [http://translatewiki.net/w/i.php?title=Project:News&oldid=9999999 Perm
 'explainconflict' => 'Appears at the top of a page when there is an edit conflict.',
 'storedversion' => 'This is used in an edit conflict as the label for the top revision that has been stored, as opposed to your version that has not been stored which is shown at the bottom of the page.',
 'yourdiff' => '',
-'copyrightwarning' => 'Copyright warning displayed under the edit box in editor',
+'copyrightwarning' => 'Copyright warning displayed under the edit box in editor
+*$1 - ...
+*$2 - ...',
 'longpageerror' => 'Warning displayed when trying to save a text larger than the maximum size allowed',
 'protectedpagewarning' => '{{Related|Semiprotectedpagewarning}}',
 'semiprotectedpagewarning' => '{{Related|Semiprotectedpagewarning}}',
@@ -1059,6 +1081,36 @@ Please report at [[Support]] if you are unable to properly translate this messag
 'moveddeleted-notice' => 'Shown on top of a deleted page in normal view modus ([http://translatewiki.net/wiki/Test example]).',
 'edit-conflict' => "An 'Edit conflict' happens when more than one edit is being made to a page at the same time. This would usually be caused by separate individuals working on the same page. However, if the system is slow, several edits from one individual could back up and attempt to apply simultaneously - causing the conflict.",
 'defaultmessagetext' => 'Caption above the default message text shown on the left-hand side of a diff displayed after clicking “Show changes” when creating a new page in the MediaWiki: namespace',
+'content-failed-to-parse' => "Error message indicating that the page's content can not be saved because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.
+*$1 – content model ({{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}})
+*$2 – content format as MIME type (e.g. <tt>text/css</tt>)
+*$3 – specific error message",
+'invalid-content-data' => "Error message indicating that the page's content can not be saved because it is invalid. This may occurr for content types with internal consistency constraints.",
+'content-not-allowed-here' => 'Error message indicating that the desired content model is not supported in given localtion.
+* $1 is the human readable name of the content model: {{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
+* $2 is the title of the page in question.',
+
+# Content models
+'content-model-wikitext' => 'Name for the wikitext content model, used when decribing what type of content a page contains.
+
+This message is substituted in:
+*{{msg-mw|Bad-target-model}}
+*{{msg-mw|Content-not-allowed-here}}',
+'content-model-text' => 'Name for the plain text content model, used when decribing what type of content a page contains.
+
+This message is substituted in:
+*{{msg-mw|Bad-target-model}}
+*{{msg-mw|Content-not-allowed-here}}',
+'content-model-javascript' => 'Name for the JavaScript content model, used when decribing what type of content a page contains.
+
+This message is substituted in:
+*{{msg-mw|Bad-target-model}}
+*{{msg-mw|Content-not-allowed-here}}',
+'content-model-css' => 'Name for the CSS content model, used when decribing what type of content a page contains.
+
+This message is substituted in:
+*{{msg-mw|Bad-target-model}}
+*{{msg-mw|Content-not-allowed-here}}',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'On some (expensive) [[MetaWikipedia:Help:ParserFunctions|parser functions]] (e.g. <code><nowiki>{{#ifexist:}}</nowiki></code>) there is a limit of how many times it may be used. This is an error message shown when the limit is exceeded.
@@ -1450,7 +1502,7 @@ This is a search result (and I guess search engine) dependent messages. I do not
 'preferences' => 'Title of the Special:Preferences page.
 
 {{Identical|Preferences}}',
-'mypreferences' => 'Action link label that leads to Special:Preferences; appears in the top menu (e.g. "Username My talk My preferences My watchlist My contributions Log out").
+'mypreferences' => 'Action link label that leads to Special:Preferences; appears in the top menu (e.g. "Username Talk Preferences Watchlist Contributions Log out").
 
 {{Identical|My preferences}}',
 'prefs-edits' => 'In user preferences.',
@@ -1605,15 +1657,21 @@ Used in [[Special:Preferences]], tab "Watchlist". The display options refer to:
 'userrights-editusergroup' => '{{Identical|Edit user groups}}. Parameter:
 * $1 is a username - optional, can be used for GENDER',
 'saveusergroups' => 'Button text when editing user groups',
-'userrights-groupsmember' => 'Used when editing user groups in [[Special:Userrights]]. The messsage is followed by a list of group names.
+'userrights-groupsmember' => 'Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.
 
 Parameters:
-* $1 - optional, for PLURAL use, the number of items in the list following the message. Avoid PLURAL, if your language can do without.',
+* $1 - the number of items in the list following the message, for PLURAL.
+* $2 - the user name, for GENDER.',
 'userrights-groupsmember-auto' => 'Used when editing user groups in [[Special:Userrights]]. The messsage is followed by a list of group names.
 "Implicit" is for groups that the user was automatically added to (such as "autoconfirmed"); cf. {{msg-mw|userrights-groupsmember}}
 
+Parameters
+* $1 - the number of items in the list following the message, for PLURAL.
+* $2 - the user name, for GENDER.',
+'userrights-groupsmember-type' => '{{optional}}
 Parameters:
-* $1 - optional, for PLURAL use, the number of items in the list following the message. Please avoid PLURAL, if your language can do without.',
+* $1 is list of group names.
+* $2 is list of group member names. Used with labels {{msg-mw|userrights-groupsmember}} and {{msg-mw|userrights-groupsmember-auto}}',
 'userrights-groups-help' => 'Instructions displayed on [[Special:UserRights]]. Parameters:
 * $1 is a username - optional, can be used for GENDER',
 'userrights-reason' => 'Text beside log field when editing user groups
@@ -1807,6 +1865,25 @@ Similar to {{msg-mw|Gur-rightslog-entry}}',
 Parameters:
 * $2 is a comma separated list of old user groups or {{msg-mw|Rightsnone}}
 * $3 is a comma separated list of new user groups',
+'logentry-rights-rights' => '*$1 - username
+*$2 - (see below)
+*$3 - username
+*$4 - list of user groups or {{msg-mw|Rightsnone}}
+*$5 - list of user groups or {{msg-mw|Rightsnone}}
+----
+{{Logentry}}',
+'logentry-rights-rights-legacy' => '*$1 - username
+*$2 - (see below)
+*$3 - username
+----
+{{Logentry}}',
+'logentry-rights-autopromote' => '*$1 - username
+*$2 - (see below)
+*$3 - (see below)
+*$4 - comma separated list of old user groups or {{msg-mw|Rightsnone}}
+*$5 - comma separated list of new user groups
+----
+{{Logentry}}',
 'rightsnone' => 'Default rights for registered users.
 
 {{Identical|None}}',
@@ -1860,7 +1937,7 @@ This action allows editing of all of the "user rights", not just the rights of t
 'recentchanges-legend' => 'Legend of the fieldset of [[Special:RecentChanges]]',
 'recentchanges-summary' => 'Summary of [[Special:RecentChanges]].',
 'recentchanges-label-newpage' => 'Tooltip for {{msg-mw|newpageletter}}',
-'recentchanges-label-minor' => 'Tooltip for {{msg-mw|newpageletter}}',
+'recentchanges-label-minor' => 'Tooltip for {{msg-mw|minoreditletter}}',
 'recentchanges-label-bot' => 'Tooltip for {{msg-mw|boteditletter}}',
 'recentchanges-label-unpatrolled' => 'Tooltip for {{msg-mw|unpatrolledletter}}',
 'rcnote' => 'Used on [[Special:RecentChanges]].
@@ -2031,6 +2108,8 @@ Extensions making use of it:
 * $1 is a storage path.',
 'backend-fail-delete' => 'Parameters:
 * $1 is a file path.',
+'backend-fail-describe' => 'Parameters:
+* $1 is a file path.',
 'backend-fail-alreadyexists' => 'Parameters:
 * $1 is a filename.',
 'backend-fail-store' => 'Parameters:
@@ -2104,7 +2183,7 @@ Used on [[Special:UploadWizard]].',
 'img-auth-accessdenied' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Access Denied
 {{Identical|Access denied}}',
 'img-auth-nopathinfo' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Missing PATH_INFO - see english description
-* This is plain text. Do not use any wiki syntax.',
+{{Doc-important|This is plain text. Do not use any wiki syntax.}}',
 'img-auth-notindir' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: When the specified path is not in upload directory.',
 'img-auth-badtitle' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Bad title, $1 is the invalid title',
 'img-auth-nologinnWL' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Logged in and file not whitelisted. $1 is the file not in whitelist.',
@@ -2698,10 +2777,16 @@ Similar to {{msg-mw|rcnote}} which is used on [[Special:RecentChanges]].
 'watcherrortext' => 'When a user clicked the watch/unwatch tab and the action did not succeed, this message is displayed. See also {{msg|addedwatchtext}}. and {{msg|addedwatchtext}}. This message is used raw and should not contain wikitext.',
 
 'enotif_reset' => "This should be translated as \"Mark all pages '''as''' visited\".",
-'enotif_newpagetext' => 'Part of text of a notification e-mail sent when a watched page has been created. See [[File:Screenshot_MediaWiki_e-mail_notifier.PNG|150px|right]]',
-'changed' => 'Possible value for $CHANGEDORCREATED in {{msg|enotif_subject}} and {{msg|enotif_body}}.',
-'created' => 'Possible value for $CHANGEDORCREATED in {{msg|enotif_subject}} and {{msg|enotif_body}}.',
-'enotif_subject' => '$CHANGEDORCREATED can be one of {{msg|changed}} and {{msg|created}}. Can also be {{msg-mw|blog-added}} or {{msg-mw|blog-edited}} from Wikia.',
+'enotif_subject_deleted' => 'Email notification subject for deleted pages, $1 is page title, $2 is page editor.',
+'enotif_subject_created' => 'Email notification subject for new pages, $1 is page title, $2 is page editor.',
+'enotif_subject_moved' => 'Email notification subject for pages that get moved, $1 is page title, $2 is page editor.',
+'enotif_subject_restored' => 'Email notification subject for pages that get restored, $1 is page title, $2 is page editor.',
+'enotif_subject_changed' => 'Email notification subject for pages that get changed, $1 is page title, $2 is page editor.',
+'enotif_body_intro_deleted' => 'Email notification body intro text for deleted pages, $1 is the page title, $2 is the page editor, $3 is page url.',
+'enotif_body_intro_created' => 'Email notification body intro text for new pages, $1 is the page title, $2 is the page editor, $3 is page url.',
+'enotif_body_intro_moved' => 'Email notification body intro for pages that get moved, $1 is the page title, $2 is the page editor, $3 is page url.',
+'enotif_body_intro_restored' => 'Email notification body intro for pages that get restored, $1 is the page title, $2 is the page editor, $3 is page url.',
+'enotif_body_intro_changed' => 'Email notification body intro for pages that get changed, $1 is the page title, $2 is the page editor, $3 is page url.',
 'enotif_lastvisited' => '$1 is a URL address.',
 'enotif_lastdiff' => 'E-mail notification text to the latest page differences. Parameters:
 * $1 is a link to a diff, shown as a plain link.',
@@ -2807,7 +2892,18 @@ This message was something like "unlock move protection" in the past.',
 'protect-text' => 'Intro of the protection interface. See [[meta:Protect]] for more information.',
 'protect-default' => '{{Identical|Default}}',
 'protect-fallback' => 'This message is used as an option in the protection form on wikis were extra protection levels have been configured.',
-'protect-summary-cascade' => 'Used in edit summary when cascade protecting a page.',
+'protect-level-autoconfirmed' => 'Used as protect level.
+
+See example: [http://translatewiki.net/w/i.php?title=Main_Page&action=info]',
+'protect-level-sysop' => 'Used as protect level.
+
+See example: [http://translatewiki.net/w/i.php?title=Main_Page&action=info]',
+'protect-summary-cascade' => 'Used in edit summary when cascade protecting a page. Appears in protection log. See [[Special:Log]] and [[m:Special:Log]].
+
+Also used in [[Special:ProtectedPages]] when a page is cascade protected. See example: [[m:Special:ProtectedPages]].<br />
+See also:
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}',
 'protect-expiring' => 'Used in page history, and in [[Special:Protectedtitles]], [[Special:Protectedpages]], and extension FlaggedRevs.
 * $1 is a date and time
 * $2 is a date (optional)
@@ -2855,9 +2951,21 @@ Options for the duration of the page protection. Example: See e.g. [[MediaWiki:P
 {{Identical|Create}}',
 
 # Restriction levels
-'restriction-level-sysop' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level' and in brackets after each page name entry. 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.",
-'restriction-level-autoconfirmed' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. 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.",
-'restriction-level-all' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. 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.",
+'restriction-level-sysop' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level' and in brackets after each page name entry. 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.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
+'restriction-level-autoconfirmed' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level', and in brackets after each page name entry. 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.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
+'restriction-level-all' => "Used on [[Special:ProtectedPages]] and [[Special:ProtectedTitles]]. An option in the drop-down box 'Restriction level'. 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.
+
+*{{msg-mw|Restriction-level-sysop}}
+*{{msg-mw|Restriction-level-autoconfirmed}}
+*{{msg-mw|Restriction-level-all}}",
 
 # Undelete
 'undelete' => 'Name of special page for admins as displayed in [[Special:SpecialPages]].
@@ -2888,6 +2996,8 @@ Options for the duration of the page protection. Example: See e.g. [[MediaWiki:P
 {{Identical|Reset}}',
 'undeleteinvert' => '{{Identical|Invert selection}}',
 'undeletecomment' => '{{Identical|Reason}}',
+'cannotundelete' => 'Message shown when undeletion failed for some reason.
+* <code>$1</code> is the combined wikitext of messages for all errors that caused the failure.',
 'undelete-search-title' => 'Page title when showing the search form in Special:Undelete',
 'undelete-search-submit' => '{{Identical|Search}}',
 'undelete-error' => 'Page title when a page could not be undeleted',
@@ -2909,11 +3019,12 @@ Options for the duration of the page protection. Example: See e.g. [[MediaWiki:P
 
 # Namespace form on various pages
 'namespace' => 'This message is located at [[Special:Contributions]].',
-'invert' => 'Displayed in [[Special:RecentChanges|RecentChanges]], [[Special:RecentChangesLinked|RecentChangesLinked]] and [[Special:Watchlist|Watchlist]]
+'invert' => 'Displayed in [[Special:RecentChanges|RecentChanges]], [[Special:RecentChangesLinked|RecentChangesLinked]] and [[Special:Watchlist|Watchlist]].
 
-{{Identical|Invert selection}}
+This message means "Invert selection of namespace".
 
-This message has a tooltip {{msg-mw|tooltip-invert}}',
+This message has a tooltip {{msg-mw|tooltip-invert}}
+{{Identical|Invert selection}}',
 'tooltip-invert' => 'Used in [[Special:Recentchanges]] as a tooltip for the invert checkbox. See also the message {{msg-mw|invert}}',
 'namespace_association' => 'Used in [[Special:Recentchanges]] with a checkbox which selects the associated namespace to be added to the selected namespace, so that both are searched (or excluded depending on another checkbox selection). The association is between a namespace and its talk namespace.
 
@@ -2996,7 +3107,11 @@ Example line:
 'whatlinkshere-hidelinks' => 'Filter option in [[Special:WhatLinksHere]]. Parameters:
 * $1 is the {{msg-mw|hide}} or {{msg-mw|show}}',
 'whatlinkshere-hideimages' => 'Filter option in [[Special:WhatLinksHere]]. Parameters:
-* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}',
+* $1 is the {{msg-mw|hide}} or {{msg-mw|show}}
+
+See also:
+*{{msg-mw|Isimage}}
+*{{msg-mw|Media_tip}}',
 'whatlinkshere-filters' => '{{Identical|Filter}}',
 
 # Block/unblock
@@ -3191,6 +3306,12 @@ Parameters:
 'immobile-target-namespace-iw' => "This message appears when attempting to move a page, if a person has typed an interwiki link as a namespace prefix in the input box labelled 'To new title'.  The special page 'Movepage' cannot be used to move a page to another wiki.
 
 'Destination' can be used instead of 'target' in this message.",
+'bad-target-model' => 'This message is shown when attempting to move a page, but the move would change the page\'s content model.
+This may be the case when [[mw:Manual:$wgContentHandlerUseDB|$wgContentHandlerUseDB]] is set to false, because then a page\'s content model is derived from the page\'s title.
+* $1: The localized name of the original page\'s content model:
+**{{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}
+* $2: The localized name of the content model used by the destination title:
+**{{msg-mw|Content-model-wikitext}}, {{msg-mw|Content-model-javascript}}, {{msg-mw|Content-model-css}} or {{msg-mw|Content-model-text}}',
 'fix-double-redirects' => 'This is a checkbox in [[Special:MovePage]] which allows to move all redirects from the old title to the new title.',
 'protectedpagemovewarning' => 'Related message: [[MediaWiki:protectedpagewarning/{{#titleparts:{{PAGENAME}}|1|2}}]]
 {{Related|Semiprotectedpagewarning}}',
@@ -3287,7 +3408,6 @@ See also:
 
 # JavaScriptTest
 'javascripttest' => 'Title of [[Special:JavaScriptTest|the special page]]',
-'javascripttest-disabled' => 'Message displayed on [[Special:JavaScriptTest]] if this feature is disabled (it is disabled by default).',
 'javascripttest-title' => 'Title of the special page when running a test suite. Parameters:
 * $1 is the name of the framework, for example QUnit.',
 'javascripttest-pagetext-unknownframework' => 'Error message when given framework id is not found. $1 is the id of the framework.',
@@ -3470,6 +3590,7 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 # Info page
 'pageinfo-title' => 'Page title for action=info. Parameters:
 * $1 is the page name',
+'pageinfo-not-current' => 'Error message displayed when information for an old revision is requested. Example: [{{fullurl:Project:News|oldid=4266597&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.',
@@ -3478,15 +3599,22 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 '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-language' => 'Language in which the page content is written.',
+'pageinfo-robot-policy' => 'The search engine status of the page.
+*{{msg-mw|Pageinfo-robot-index}}
+*{{msg-mw|Pageinfo-robot-noindex}}',
 '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-name' => "The number of redirects to the page.
+
+Used as link text, linked to '{{int:Whatlinkshere-title}}' page ([[Special:WhatLinksHere]]).",
 '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-name' => "The number of subpages of the page.
+
+Used as link text, linked to '{{int:Prefixindex}}' page ([[Special:PrefixIndex]]).",
 '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.
@@ -3499,14 +3627,24 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 '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>$1</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.',
+'pageinfo-toolboxlink' => "Information link for the page (like 'What links here', but to action=info for the current page instead)",
+'pageinfo-redirectsto' => 'Key for the row shown if this page is a redirect.',
+'pageinfo-redirectsto-info' => 'Text to put in parentheses for the link to the action=info of the redirect target.',
+'pageinfo-contentpage' => 'Key for the row shown on [{{fullurl:News|action=info}} action=info] if this page is [[mw:Manual:Article count|counted as a content page]]',
+'pageinfo-contentpage-yes' => 'Yes, this page is a content page',
+'pageinfo-protect-cascading' => 'Key for the row which shows whether this page has cascading protection enabled
+*{{msg-mw|Pageinfo-protect-cascading}}
+*{{msg-mw|Pageinfo-protect-cascading-yes}}',
+'pageinfo-protect-cascading-yes' => 'Yes, protections are cascading from here
+*{{msg-mw|Pageinfo-protect-cascading}}
+*{{msg-mw|Pageinfo-protect-cascading-yes}}',
+'pageinfo-protect-cascading-from' => 'Key for a list of pages where protections are cascading from',
 
 # Skin names
 'skinname-standard' => '{{optional}}
@@ -3522,6 +3660,8 @@ See also {{msg-mw|Anonuser}} and {{msg-mw|Siteusers}}.',
 
 # Patrolling
 'markedaspatrolledtext' => '{{Identical|Markedaspatrolled}}',
+'markedaspatrollednotify' => 'Notification shown after a change has been marked as patrolled, $1 is the page title',
+'markedaspatrollederrornotify' => 'Notification shown after marking a change as patrolled failed',
 
 # Patrol log
 'patrol-log-page' => '{{doc-logpage}}',
@@ -3564,11 +3704,12 @@ Parameters:
 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 the width in pixels
-* $2 is the height in pixels, and 
+* $2 is the height in pixels, and
 * $3 is the file size including a 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-other' => 'Message shown under the image description page thumbnail, next to {{msg-mw|show-big-image-preview}}, if the image is in high resolution.',
 'show-big-image-size' => '
 Parameters:
 * $1 is the width of the image(s) in pixels.
@@ -3647,6 +3788,7 @@ Part of variable $1 in {{msg-mw|Ago}}
 *{{msg-mw|Minutes}}
 *{{msg-mw|Hours}}
 *{{msg-mw|Days}}',
+'just-now' => 'Phrase for indicating something happened just now.',
 
 # Bad image list
 'bad_image_list' => 'This message only appears to guide administrators to add links with the right format. This will not appear anywhere else in MediaWiki.',
@@ -4349,6 +4491,12 @@ See also [[MediaWiki:Confirmemail_body_changed]].
 'confirmemail_invalidated' => 'This is the text of the special page [[Special:InvalidateEmail|InvalidateEmail]] (with the title in {{msg-mw|Invalidateemail}}) where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.',
 'invalidateemail' => "This is the '''name of the special page''' where user goes if he chooses the cancel e-mail confirmation link from the confirmation e-mail.",
 
+# Scary transclusion
+'scarytranscludedisabled' => 'Shown when scary transclusion is disabled.',
+'scarytranscludefailed' => 'Shown when the HTTP request for the template failed.',
+'scarytranscludefailed-httpstatus' => 'Identical to {{msg-mw|scarytranscludefailed}}, but shows the HTTP error which was received.',
+'scarytranscludetoolong' => 'The URL was too long.',
+
 'unit-pixel' => '{{optional}}',
 
 # action=purge
@@ -4606,7 +4754,8 @@ There are no such extensions here, so look at [[wikipedia:Special:Version]] for
 'version-parser-function-hooks' => 'Shown in [[Special:Version]]',
 'version-hook-name' => 'Shown in [[Special:Version]]',
 'version-hook-subscribedby' => 'Shown in [[Special:Version]]',
-'version-version' => '{{Identical|Version}}',
+'version-version' => '*$1 - version number
+{{Identical|Version}}',
 'version-svn-revision' => '{{optional}}
 This is being used in [[Special:Version]], preceeding the subversion revision numbers of the extensions loaded inside brackets, like this: "({{int:version-revision}} r012345")
 
@@ -4616,6 +4765,7 @@ This is being used in [[Special:Version]], preceeding the subversion revision nu
 *$1: the current year
 *$2: a list of selected MediaWiki authors',
 'version-poweredby-others' => 'Used at the very end of {{msg-mw|version-poweredby-credits}} on [[Special:Version]]. First, there\'s a long list of selected MediaWiki authors, then the word "and" (from {{msg-mw|and}}) follows and then this translation, which is supposed to credit the many other people than developer helping with MediaWiki.',
+'version-credits-summary' => 'Summary of the [[Special:Version/Credits]] sub page, which lists all developers etc. who contributed to MediaWiki. Shown at the top.',
 'version-license-info' => '[[wikipedia:GNU GPL|GNU GPL]] notice shown at [[Special:Version]]. See //www.gnu.org/licenses/old-licenses/gpl-2.0-translations.html for available translations.',
 'version-software-product' => 'Shown in [[Special:Version]]',
 'version-software-version' => '{{Identical|Version}}',
@@ -4815,8 +4965,14 @@ Parameter $4, the target page, is also not visible to parser functions.',
 'logentry-patrol-patrol-auto' => '{{Logentry}}
 * $4 is a formatted revision number, maybe linked to the diff.
 "Automatically" refers to users with autopatrol right who mark revisions automatically patrolled when editing.',
+'logentry-newusers-create' => '{{Logentry}}
+
+$4 is the gender of the target user.',
 'logentry-newusers-create2' => '{{Logentry}}
 
+$4 is the name of the target user.',
+'logentry-newusers-autocreate' => '{{Logentry}}
+
 $4 is the gender of the target user.',
 
 # Feedback
@@ -4838,6 +4994,12 @@ $4 is the gender of the target user.',
 'feedback-bugcheck' => 'Message that appears before the user submits a bug, reminding them to check for known bugs.',
 'feedback-bugnew' => 'Button label - asserts that the user has checked for existing bugs. When clicked will launch a bugzilla form to add a new bug in a new tab or window',
 
+# Search suggestions
+'searchsuggest-search' => 'Greyed out default text in the simple search box in the Vector skin. (It disappears and lets the user enter the requested search terms when the search box receives focus.)
+
+{{Identical|Search}}',
+'searchsuggest-containing' => 'Label used in the special item of the search suggestions list which gives the user an option to perform a full text search for the term.',
+
 # API errors
 'api-error-badaccess-groups' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-badtoken' => 'API error message that can be used for client side localisation of API errors.',
@@ -4890,4 +5052,7 @@ $4 is the gender of the target user.',
 'api-error-uploaddisabled' => 'API error message that can be used for client side localisation of API errors.',
 'api-error-verification-error' => '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.',
 
+# Unknown messages
+'svg-long-error' => 'Displayed for invalid SVG file metadata.
+* $1 is the error message.',
 );
index 7c34cfb..d61676f 100644 (file)
@@ -131,12 +131,11 @@ $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__' ),
+       'notoc'                     => array( '0', '__YUYARINANNAQ__', '__NOTDC__', '__SIN_TDC__', '__NOTOC__' ),
+       'nogallery'                 => array( '0', '__RIKCHASUYUNNAQ__', '__NOGALERÍA__', '__NOGALERIA__', '__SIN_GALERÍA__', '__NOGALLERY__' ),
+       'forcetoc'                  => array( '0', '__YUYARINATAATIPACHIY__', '__FORZARTDC__', '__FORZARTOC__', '__FORZAR_TDC__', '__FORCETOC__' ),
        'toc'                       => array( '0', '__YUYARINA__', '__TDC__', '__TOC__' ),
-       'noeditsection'             => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NOEDITSECTION__' ),
-       'noheader'                  => array( '0', '__UMANNAQ__', '__NOTÍTULO__', '__NOTITULO__', '__NOHEADER__' ),
+       'noeditsection'             => array( '0', '__AMARAKITAHUKCHAYCHU__', '__NOEDITARSECCIÓN__', '__NOEDITARSECCION__', '__NO_EDITAR_SECCIÓN__', '__NOEDITSECTION__' ),
        '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' ),
@@ -183,7 +182,7 @@ $magicWords = array(
        '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:' ),
+       'subst'                     => array( '0', 'WAKCHAY:', 'SUST:', 'FIJAR:', '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' ),
@@ -236,7 +235,7 @@ $magicWords = array(
        '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:' ),
+       'raw'                       => array( '0', 'CHAWA:', 'SINFORMATO', 'SINPUNTOS', '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:' ),
@@ -246,7 +245,7 @@ $magicWords = array(
        '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:' ),
+       'pagesinnamespace'          => array( '1', 'SUTIKITIPIPANQAKUNA:', 'PÁGINASENESPACIO', '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' ),
@@ -273,7 +272,7 @@ $messages = array(
 'tog-hidepatrolled' => "Patrullasqa llamk'apusqakunata ñaqha hukchasqapi pakay",
 'tog-newpageshidepatrolled' => "Patrullasqa llamk'apusqakunata musuq p'anqakunapi pakay",
 'tog-extendwatchlist' => "Watiqana sutisuyuta tukuy rurachinalla hukchaykunaman mast'ay, ama lliwmanta aswan ñaqhallachu",
-'tog-usenewrc' => "Sananchasqa ñaqha hukchasqakuna (JavaScript nisqallawanmi llamk'an)",
+'tog-usenewrc' => "Huñu hukchasqakuna p'anqallakama ñaqha hukchasqakunapi watiqasqakunapipas (JavaScript nisqallawanmi llamk'an)",
 'tog-numberheadings' => "Uma siq'ikunata kikinmanta yupay",
 'tog-showtoolbar' => "Llamk'apuna sillwita rikuchiy",
 'tog-editondblclick' => "P'anqakunata llamk'apuy iskaylla ñit'iywan (JavaScript)",
@@ -281,17 +280,17 @@ $messages = array(
 'tog-editsectiononrightclick' => "Rakirilla llamk'apuyta saqillay paña butunta rakirip sutinpi ñit'ispa (JavaScript)",
 'tog-showtoc' => "Yuyarina wachuchasqata rikuchiy (kimsamanta aswan uma siq'iyuq p'anqakunapaq)",
 'tog-rememberpassword' => "Ruraqpa sutiyta yaykuna rimaytapas yuyaykuy kay llika wamp'unapi ({{PLURAL:$1|huk p'unchawkama|$1 p'unchawkama}})",
-'tog-watchcreations' => "Qallarisqay p'anqakunata watiqay.",
-'tog-watchdefault' => "Hukchasqay p'anqakunata watiqay",
-'tog-watchmoves' => "Astasqay p'anqakunata watiqay",
-'tog-watchdeletion' => "Qullusqay p'anqakunata watiqay",
+'tog-watchcreations' => "Qallarisqay p'anqakunata churkusqay willañiqikunatapas watiqay",
+'tog-watchdefault' => "Hukchasqay p'anqakunata willañiqikunatapas watiqay",
+'tog-watchmoves' => "Astasqay p'anqakunata willañiqikunatapas watiqay",
+'tog-watchdeletion' => "Qullusqay p'anqakunata willañiqikunatapas watiqay",
 'tog-minordefault' => 'Tukuy hukchasqakunata kikinmanta aslla nispa sananchay',
 'tog-previewontop' => "Rikch'ay qhawana ñawpaqman, ama qhipanpi kachunchu",
 'tog-previewonfirst' => "Manaraq llamk'apuspa rikch'ayta qhaway",
 'tog-nocache' => "Llika wamp'unap ''cache'' nisqa paki hallch'anman ama niy",
-'tog-enotifwatchlistpages' => "Watiqasqay p'anqa hukchasqa kaptinqa, e-chaskita kachamuway",
+'tog-enotifwatchlistpages' => "Watiqasqay p'anqa icha willañiqi hukchasqa kaptinqa, e-chaskita kachamuway",
 'tog-enotifusertalkpages' => "Rimachinay p'anqa hukchasqa kaptinqa, e-chaskita kachamuway",
-'tog-enotifminoredits' => "P'anqapi uchuy hukchasqamantapas willawaspa e-chaskita kachamuway",
+'tog-enotifminoredits' => "P'anqapi icha willañiqipi uchuy hukchasqamantapas willawaspa e-chaskita kachamuway",
 'tog-enotifrevealaddr' => 'E-chaski imamaytayta rikuchiy willamuwanayki e-chaskikunapi',
 'tog-shownumberswatching' => "Rikuchiy hayk'a watiqaq ruraqkuna",
 'tog-oldsig' => "Kachkaqña silq'uy:",
@@ -411,7 +410,6 @@ $messages = array(
 'qbbrowse' => 'Maskapuy',
 'qbedit' => "Llamk'apuy",
 'qbpageoptions' => "P'anqap akllanankuna",
-'qbpageinfo' => "P'anqamanta willay",
 'qbmyoptions' => 'Akllanaykuna',
 'qbspecialpages' => "Sapaq p'anqakuna",
 'faq' => 'Pasaq tapuykuna',
@@ -424,7 +422,7 @@ $messages = array(
 'vector-action-protect' => 'Amachay',
 'vector-action-undelete' => 'Qullusqata paqarichiy',
 'vector-action-unprotect' => 'Amachayta wakinchay',
-'vector-simplesearch-preference' => 'Maskanapaq kallpachasqa sakumanakunata atichiy (Vector qarallapi)',
+'vector-simplesearch-preference' => 'Maskanapaq sikllallachasqa sinruta atichiy (Vector qarallapi)',
 'vector-view-create' => 'Kamariy',
 'vector-view-edit' => "Llamk'apuy",
 'vector-view-history' => 'Wiñay kawsayta qhaway',
@@ -530,6 +528,10 @@ $1",
 'youhavenewmessages' => '$1 qhawanayki kachkan ($2).',
 'newmessageslink' => 'Musuq willaymi',
 'newmessagesdifflink' => 'qayna hukchasqapi wakin kaynin',
+'youhavenewmessagesfromusers' => '$1 {{PLURAL:$3|huk ruraqmanta|$3 ruraqkunamanta}} qhawanayki kachkan ($2).',
+'youhavenewmessagesmanyusers' => '$1 achka ruraqkunamanta qhawanayki kachkan ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|Musuq willaymi|Musuq willaykunam}}',
+'newmessagesdifflinkplural' => 'qayna {{PLURAL:$1|hukchasqapi|hukchasqakunapi}} wakin kaynin',
 'youhavenewmessagesmulti' => 'Musuq willaykunam qhawanayki kachkan $1-pi',
 'editsection' => 'allichay',
 'editold' => "llamk'apuy",
@@ -583,7 +585,10 @@ Allin sapaq p'anqakunataqa tarinki [[Special:SpecialPages|Sapaq p'anqakuna]] nis
 'databaseerror' => 'Willañiqintin pantasqa',
 'dberrortext' => 'Willañiqimanta mañakuptiyki sintaksis pantasqam tukurqan.
 Llamp\'u kaq wakichipi pantasqachá.
-Qayna willañiqimanta mañakusqaqa karqan kaypacham: <blockquote><tt>$1</tt></blockquote> kay ruraypim: "<tt>$2</tt>". MySQL-pa kutichisqan pantasqaqa karqan "<tt>$3: $4</tt>".',
+Qayna willañiqimanta mañakusqaqa karqan kaypacham:
+<blockquote><code>$1</code></blockquote>
+kay ruraypim: "<code>$2</code>".
+Willañiqintinpa kutichisqan pantasqaqa karqan "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Willañiqimanta mañakuptiyki sintaksis pantasqam tukurqan.
 Qayna willañiqimanta mañakusqaqa karqan kaymi:
 "$1"
@@ -635,9 +640,11 @@ Tapuna: $2',
 'protectedpagetext' => "Kay p'anqaqa llamk'apuymanta amachasqam.",
 'viewsourcetext' => "Kay p'anqap pukyu qillqantam qhawayta iskaychaytapas atinki:",
 'viewyourtext' => "'''Qampa llamk'apusqayki'''p pukyu qillqantam qhawayta iskaychaytapas atinki:",
-'protectedinterface' => "Kay p'anqapiqa wakichintinpa uyapuranpaq qillqam.
-Wandalismu nisqamanta amachasqam kachkan.",
-'editinginterface' => "'''Paqtataq:''' Uyapura p'anqatam llamk'apuchkanki. Hukchaptiykiqa, chay uyapurap rikch'ayninqa hukyanqa huk ruraqkunapaqpas. Uyapurata t'ikrayta munaspaykiqa, [//translatewiki.net/wiki/Main_Page?setlang=qu translatewiki.net] nisqa MediaWiki t'ikrana ruraykamay llika tiyaypi ruranaykimanta hamut'ariy.",
+'protectedinterface' => "Kay p'anqapiqa wakichintinpa uyapuranpaq qillqam. Wandalismu nisqamanta amachasqam kachkan.
+Tukuy wikikunapi uyapuraman t'ikrasqakunata yapayta icha hukchayta munaspaykiqa, [//translatewiki.net/wiki/Main_Page?setlang=qu translatewiki.net] nisqa MediaWiki t'ikrana ruraykamay llika tiyaypi ruray.",
+'editinginterface' => "'''Paqtataq:''' Llamp'u kaqpaq uyapura qillqakuna runanapaq p'anqatam llamk'apuchkanki.
+Hukchaptiykiqa, chay uyapurap rikch'ayninqa hukyanqa kay wikipi huk ruraqkunapaqpas.
+Uyapuraman t'ikrasqakunata yapayta icha hukchayta munaspaykiqa, [//translatewiki.net/wiki/Main_Page?setlang=qu translatewiki.net] nisqa MediaWiki t'ikrana ruraykamay llika tiyaypi ruranaykimanta hamut'ariy.",
 'sqlhidden' => '(SQL tapunaqa pakasqam)',
 'cascadeprotected' => "Kay p'anqaqa amachasqam kachkan, ''phaqcha'' nisqa kamachiwan amachasqa kay {{PLURAL:$1|p'anqapi|p'anqakunapi}} ch'aqtasqa kaspanmi:
 $2",
@@ -651,6 +658,7 @@ $2",
 Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 'invalidtitle-knownnamespace' => '"$2" sutisuyu, "$3" qillqasqayuq mana allin kaq qillqa suti',
 'invalidtitle-unknownnamespace' => 'Mana riqsisqa $1 kaq sutisuyu yupay, "$2" qillqasqayuq mana allin kaq qillqa suti',
+'exception-nologin' => 'Manam yaykurqankichu',
 
 # Virus scanner
 'virus-badscanner' => "Manam allintachu churapusqa: mana riqsisqa añaw maskaq: ''$1''",
@@ -660,10 +668,7 @@ Amachaq kamachiqqa kayrayku amachani nispa nirqanmi: "$3".',
 # Login and logout pages
 'logouttext' => "'''Llamk'apuy tiyayniykiqa puchukasqañam.'''
 
-Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, [[Special:UserLogin|musuqmanta yaykuy]] ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
-'welcomecreation' => '== Allinmi hamusqayki $1! ==
-Rakiqunaykiqa kicharisqañam.
-Ama qunqaychu [[Special:Preferences|{{SITENAME}} allinkachinaykikunata]] kikinchayta.',
+Sutinnaq kaspaykipas {{SITENAME}}pi wamp'uytam atinki. Mana hinataq munaspaykiqa, <span class='plainlinks'>[$1 musuqmanta yaykuy]</span> ñawpaq icha huk sutiwan. Huk p'anqakunaqa kaqllam rikch'akunqa, ''cache'' nisqa pakasqa hallch'ata mana ch'usaqchaptiykiqa.",
 'yourname' => 'Ruraq sutiyki:',
 'yourpassword' => 'Yaykuna rimayki',
 'yourpasswordagain' => 'Yaykuna rimaykita kutipayay',
@@ -893,10 +898,14 @@ Yaykurqaspaqa ''[[Special:ChangePassword|yaykuna rima hukchana]]'' p'anqapi kay
 'newarticle' => '(Musuq)',
 'newarticletext' => "Manaraq kachkaq p'anqatam llamk'apuchkanki. Musuq p'anqata kamariyta munaspaykiqa, qillqarillay. Astawan ñawiriyta munaspaykiqa, [[{{MediaWiki:Helppage}}|yanapana p'anqata]] qhaway. Mana munaspaykitaq, ñawpaq p'anqaman ripuy.",
 'anontalkpagetext' => "---- ''Kayqa huk sutinnaq icha mana sutinta llamk'achiq ruraqpa rimanakuyninmi. IP huchhantam hallch'asunchik payta sutinchanapaq. Achka ruraqkunam huklla IP huchhanta llamk'achiyta atin. Sutinnaq ruraq kaspaykiqa, mana qampa rurasqaykimanta willamusqakunata rikuspaykiqa, ama hina kaspa [[Special:UserLogin/signup|rakiqunaykita kamariy]] icha [[Special:UserLogin|yaykuy]] huk sutinnaq ruraqkunawan ama pantasqa kanaykipaq.''",
-'noarticletext' => "Kunanqa kay p'anqa ch'usaqmi. Kaytam rurayta atinkiman: kay p'anqap sutinta [[Special:Search/{{PAGENAME}}|huk p'anqakunapi maskay]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hallch'ankunapi maskay] icha [{{fullurl:{{FULLPAGENAME}}|action=edit}} kay p'anqata llamk'apuy]</span>.",
-'noarticletext-nopermission' => "Kay p'anqaqa ch'usaqmi.
-Kay p'anqap sutintaqa [[Special:Search/{{PAGENAME}}|huk p'anqakunapi maskaytam atinki]],
-icha payman kapuq <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hallch'akunapi maskaykiman]</span>.",
+'noarticletext' => "Kunanqa kay p'anqa ch'usaqmi kachkan.
+Kaytam rurayta atinkiman: kay p'anqap sutinta [[Special:Search/{{PAGENAME}}|huk p'anqakunapi maskay]],
+<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hallch'ankunapi maskay]
+icha [{{fullurl:{{FULLPAGENAME}}|action=edit}} kay p'anqata llamk'apuy]</span>.",
+'noarticletext-nopermission' => "Kunanqa kay p'anqa ch'usaqmi kachkan.
+Kaytam rurayta atinkiman: kay p'anqap sutinta [[Special:Search/{{PAGENAME}}|huk p'anqakunapi maskay]]
+icha payman kapuq <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hallch'akunapi maskay]</span>,
+ichataq kay p'anqata kamariyta manam saqillasunkichu.",
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" sutiyuq ruraqpa rakiqunanqa manam kanchu. Ama hina kaspa, llanchikuy kay p\'anqata kamarinaykimanta.',
 'userpage-userdoesnotexist-view' => '"$1" sutiyuq rakiqunaqa manam hallch\'asqachu.',
 'blocked-notice-logextract' => "Kay ruraqqa hark'asqam kachkan.
@@ -905,7 +914,6 @@ Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
 * '''Firefox / Safari:''' ''Shift'' yatachkaspa ''Reload'' ñit'iy, ichataq ''Ctrl-F5'' icha ''Ctrl-R'' yatay (''⌘-R'' Mac nisqapi)
 * '''Google Chrome:''' ''Ctrl-Shift-R'' yatay (''⌘-Shift-R'' Mac nisqapi)
 * '''Internet Explorer:''' ''Ctrl'' yatachkaspa ''Refresh'' ñit'iy, icha ''Ctrl-F5'' yatay
-* '''Konqueror: '''''Reload'' ñit'iy icha ''F5'' yatay
 * '''Opera:''' ''cache'' nisqata ch'usaqchay kaypi: ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Kunay:''' \"{{int:showpreview}}\" nisqa ñit'inata llamk'achiy musuq css nisqata qhawanaykipaq, manaraq waqaychaspa.",
 'userjsyoucanpreview' => "'''Kunay:''' \"{{int:showpreview}}\" nisqa ñit'inata llamk'achiy musuq JavaScript nisqata qhawanaykipaq, manaraq waqaychaspa.",
@@ -920,7 +928,7 @@ Hark'ay hallch'api qhipaq hark'asqataqa kaypim rikunki willasunaykipaq:",
 'note' => "'''Musyay:'''",
 'previewnote' => "'''Yuyaykuy: Kayqa qhawariyllam.'''
 Llamk'apusqaykiqa manaraqmi waqaychasqachu!",
-'continue-editing' => "Llamk'apuyta qatiykuy",
+'continue-editing' => "Llamk'apuy millkaman riy",
 'previewconflict' => "Rikuchkanki kay p'anqataqa, ima hinachus waqaychasqa kanqa.",
 'session_fail_preview' => "'''Achachaw! Llamk'apusqaykiqa manam waqaychasqachu, llamk'ana tiyaypa willankuna chinkaptinmi. Ama hina kaspa, musuqmanta ruraykachay. Mana atispaykiqa, [[Special:UserLogout|lluqsispa]] musuqmanta yaykuy.'''",
 'session_fail_preview_html' => "'''Achachaw! Llamk'apusqaykiqa manam waqaychasqachu, llamk'ana tiyaypa willankuna chinkaptinmi.'''
@@ -995,6 +1003,12 @@ Qullusqachá.",
 Kachkañam.",
 'defaultmessagetext' => 'Ñawpaq qillqa',
 
+# Content models
+'content-model-wikitext' => 'wiki qillqa',
+'content-model-text' => 'qillqalla',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Paqtataq: Kay p'anqaqa nisyu achka qullqipaq t'ikrana rurana qayayniyuqmi.
 
@@ -1149,6 +1163,7 @@ Ama hina kaspa, hallch'akunapi qhaway.",
 'revdelete-reason-dropdown' => "*Qulluypaq sapsi raykukuna
 ** Ruraqpa hayñinta k'irisqa
 ** Runamanta mana allin willaykuna
+** Ruraqpa mana allin sutin
 ** Runata k'amiqchá willaykuna",
 'revdelete-otherreason' => 'Huk/aswan rayku:',
 'revdelete-reasonotherlist' => 'Huk rayku',
@@ -1241,8 +1256,6 @@ Takyachikuy kay hukchayqa allin wiñay kawsay ñiqita ama waqllichunchu chaylla.
 'search-interwiki-caption' => 'Ñaña ruraykamaykuna',
 'search-interwiki-default' => '$1 taripasqakuna:',
 'search-interwiki-more' => '(aswan)',
-'search-mwsuggest-enabled' => 'rimapusqakunawan',
-'search-mwsuggest-disabled' => 'mana rimapusqakunawanchu',
 'search-relatedarticle' => 'Apanakuq',
 'mwsuggest-disable' => 'AJAX rimapuykunaman ama niy',
 'searcheverything-enable' => "Tukuy suti k'itikunapi maskay",
@@ -1337,7 +1350,7 @@ Pi kay k'itichapi llawiykita riqsiqpas watiqasqaykikunata ñawiriytam atinqa. Ch
 'timezoneregion-indian' => 'Indiku mama qucha',
 'timezoneregion-pacific' => 'Pasiphiku mama qucha',
 'allowemail' => 'Huk ruraqkunamanta e-chaskita saqillay',
-'prefs-searchoptions' => 'Akllanakunata maskay',
+'prefs-searchoptions' => 'Maskay',
 'prefs-namespaces' => "Suti k'itikuna",
 'defaultns' => "Mana hinaptintaq kay suti k'itikunapi maskay:",
 'default' => 'kikinmanta',
@@ -1735,7 +1748,7 @@ $1',
 'backend-fail-internal' => '"$1" sutiyuq willañiqi hallch\'ana sirwiqpi mana riqsisqa pantasqam tukurqan.',
 'backend-fail-contenttype' => 'Manam atinichu "$1" nisqapi hallch\'ana willañiqip samiqninpa layanta yuqanchayta.',
 'backend-fail-batchsize' => "Willañiqi hallch'ana sirwiqmanqa $1 willañiqi {{PLURAL:$1|ruranayuq|ruranayuq}} tawqam qusqa; saywataq $2 {{PLURAL:$1|ruranam|ruranam}}.",
-'backend-fail-usable' => 'Manam atinichu $1 sutiyuq willañiqita qillqayta, mana aypalla saqillaykuna icha mana churanakuna/qullqakuna kaptinmi.',
+'backend-fail-usable' => 'Manam atinichu "$1" sutiyuq willañiqita ñawiriyta icha qillqayta, mana aypalla saqillaykuna icha mana churanakuna/qullqakuna kaptinmi.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => "Manam atinichu \"\$1\" sutiyuq willañiqi hallch'ana sirwiqpaq p'unchawnintin hallch'awan t'inkiyta.",
@@ -1945,7 +1958,9 @@ Ama hina kaspa, [$2 willañiqi ch'uyanchana p'anqata] qhaway astawan willachikun
 
 'disambiguations' => "Sut'ichana qillqakunaman t'inkimuq p'anqakuna",
 'disambiguationspage' => "Template:Sut'ichana qillqa",
-'disambiguations-text' => "Kay qatiq p'anqakunam t'inkimun '''sut'ichana qillqaman'''. Chiqap, hukchanasqa p'anqaman t'inkichun.<br />Tukuy [[MediaWiki:Disambiguationspage]] plantillayuq p'anqakunaqa sut'ichana qillqam.",
+'disambiguations-text' => "Kay qatiq p'anqakunam t'inkimun '''sut'ichana qillqa''' nisqaman.
+Chay rantiqa chiqap, hukchanasqa p'anqamanmi t'inkichun.<br />
+P'anqa [[MediaWiki:Disambiguationspage]] plantillayuq kaspaqa sut'ichana qillqam kanqa.",
 
 'doubleredirects' => 'Iskaylla pusapunakuna',
 'doubleredirectstext' => "Kay p'anqapiqa huk pusapuna p'anqaman pusapuq p'anqakunap sutinkunatam rikunki. Sapa sinrupiqa ñawpaq ñiqin, iskay ñiqinpas pusapunaman t'inkikunam, iskay ñiqin pusapunap taripananpa qallariyninpas, sapsilla \"chiqap\" allin taripana qillqam, maymanchus ñawpaq ñiqin pusapuna p'anqa pusachun.
@@ -2209,11 +2224,7 @@ Qampa [[Special:Preferences|allinkachinaykikunapi]] qillqakamachisqayki imamayta
 
 'enotif_mailer' => '{{SITENAME}}pa chaski musyachina sirwiqnin',
 'enotif_reset' => "Tukuy p'anqakunata watukusqakama sananchay",
-'enotif_newpagetext' => "Musuq p'anqam.",
 'enotif_impersonal_salutation' => '{{SITENAME}}pa ruraqnin',
-'changed' => 'hukchasqa',
-'created' => 'kamarirqan',
-'enotif_subject' => '{{SITENAME}}pi $PAGETITLE sutiyuq p\'anqaqa $PAGEEDITOR-pa $CHANGEDORCREATED-nñam',
 'enotif_lastvisited' => "$1 sutiyuq p'anqata qhaway qayna watukamusqaykimantapacha tukuy hukchasqakunata rikunaykipaq.",
 'enotif_lastdiff' => "$1 sutiyuq p'anqata qhaway kay hukchasqata rikunaykipaq.",
 'enotif_anon_editor' => 'sutinnaq ruraq $1',
@@ -2386,7 +2397,7 @@ Huklla llamk'apusqakunata paqarichinaykipaqqa, munasqayki llamk'apusqakunata akl
 'undeletedrevisions' => "{{PLURAL:$1|Huk paqarichisqa llamk'apusqa|$1 paqarichisqa llamk'apusqakuna}}",
 'undeletedrevisions-files' => "{{PLURAL:$1|1 llamk'apusqaqa|$1 llamk'apusqakunaqa}} {{PLURAL:$2|1 willañiqipas|$2 willañiqikunapas}} paqarichisqam",
 'undeletedfiles' => '{{PLURAL:$1|1 willañiqiqa|$1 willañiqikunaqa}} paqarichisqam',
-'cannotundelete' => 'Manam atinichu qullusqata paqarichiyta; huk runachá ñawpaqtaña qullusqata paqarichirqan.',
+'cannotundelete' => 'Manam atinichu qullusqata paqarichiyta: $1',
 'undeletedpage' => "'''$1 nisqaqa paqarichisqañam'''
 
 [[Special:Log/delete|Qulluy hallch'api]] qhaway ñaqha qullusqakunata paqarichisqakunatapas rikunaykipaq.",
@@ -2797,7 +2808,6 @@ Tukuy hawa wikimanta chaskisqakunaqa [[Special:Log/import|hawamanta chaskiy hall
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript llanchiy',
-'javascripttest-disabled' => 'Kay ruranaqa kay wikipi manam atichisqachu.',
 'javascripttest-title' => '$1 llanchiykunam richkan',
 'javascripttest-pagetext-noframework' => "Kay p'anqaqa JavaScript llanchina purichinallapaqmi kachun.",
 'javascripttest-pagetext-unknownframework' => 'Mana riqsisqa "$1" nisqa llanchina inchu ruray',
@@ -2924,11 +2934,21 @@ 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-edits' => "Llamk'apusqakunap wiñay kawsaynin",
 'pageinfo-views' => "Hayk'a qhawaykuna",
-'pageinfo-watchers' => "Hayk'a watiqaqkuna",
-'pageinfo-edits' => "Hayk'a hukchasqakuna",
-'pageinfo-authors' => "Hayk'a sapaq kaq ruraqkuna",
+'pageinfo-watchers' => "P'anqata hayk'a watiqaqkuna",
+'pageinfo-firstuser' => "P'anqap kamariqnin",
+'pageinfo-firsttime' => "P'anqa kamariypa p'unchawnin",
+'pageinfo-lastuser' => "Ñaqha llamk'apuqnin",
+'pageinfo-lasttime' => "Ñaqha llamk'apuypa p'unchawnin",
+'pageinfo-edits' => "Tukuymanta hayk'a hukchasqakuna",
+'pageinfo-authors' => "Tukuymanta hayk'a sapaq kaq ruraqkuna",
+'pageinfo-toolboxlink' => "P'anqamanta willakuna",
+'pageinfo-redirectsto' => 'Kayman pusampun:',
+'pageinfo-redirectsto-info' => 'willachikuy',
+'pageinfo-contentpage' => "Samiqniyuq p'anqa hinam chaninchasqa",
+'pageinfo-contentpage-yes' => 'Arí',
+'pageinfo-protect-cascading-yes' => 'Arí',
 
 # Patrolling
 'markaspatrolleddiff' => 'Qhawakipasqaman sananchay',
@@ -3628,7 +3648,7 @@ Rikchakunatataq hunt'a ch'irkukupim rikunki. Huk willañiqi llayakunaqa tantapus
 * <span class="mw-specialpagerestricted">Sapaqkunallapaq sapaq p\'anqakuna.</span>',
 'specialpages-group-maintenance' => 'Hatalliy willaykuna',
 'specialpages-group-other' => "Huk sapaq p'anqakuna",
-'specialpages-group-login' => 'Yaykuy / rakiqunata kichariy',
+'specialpages-group-login' => 'Yaykuy / rakiqunata kamariy',
 'specialpages-group-changes' => "Ñaqha hukchasqa hallch'asqapas",
 'specialpages-group-media' => 'Midya willaykuna churkuykunapas',
 'specialpages-group-users' => 'Ruraqkuna hayñinkunapas',
@@ -3751,6 +3771,10 @@ Mana chayqa, kay qatiqpi kaq hunt'ana p'anqatam llamk'achiyta atinki. Willapuyni
 'feedback-bugcheck' => 'Allillanmi! Llanchirillay [$1 riqsisqapura huk pantasqañachu] mana kanmanchu.',
 'feedback-bugnew' => 'Llanchisqañam. Musuq pantasqamanta willay',
 
+# Search suggestions
+'searchsuggest-search' => 'Maskay',
+'searchsuggest-containing' => 'kaykunayuq: ...',
+
 # API errors
 'api-error-badaccess-groups' => 'Kay wikipiqa willañiqikunata manam churkuyta atinkichu.',
 'api-error-badtoken' => 'Ukhupi pantasqa: Mana allinta sananchasqa.',
index 85a7390..38deb96 100644 (file)
@@ -163,7 +163,6 @@ $messages = array(
 'qbbrowse' => 'Maskana',
 'qbedit' => 'Killkana',
 'qbpageoptions' => 'Pankapak akllanakuna',
-'qbpageinfo' => 'Pankamanta willaykuna',
 'qbmyoptions' => 'Ñukapak pankakuna',
 'qbspecialpages' => 'mans shukkunashina pankakuna',
 'faq' => 'Ashtawan tapushkaka tapunakuna',
@@ -500,8 +499,6 @@ Kay (kaykunachu) kachashkakunaka cunkashkami kashka.",
 'search-interwiki-caption' => 'Ñaña ruraykamaykuna',
 'search-interwiki-default' => '$1 tarishka imakuna:',
 'search-interwiki-more' => '(ashtawan)',
-'search-mwsuggest-enabled' => 'consejoskunawan',
-'search-mwsuggest-disabled' => 'Mana consejoskunawan',
 'searchrelated' => 'tinkishka',
 'searchall' => 'tukuy',
 'showingresultsheader' => "{{PLURAL:$5|Maskashka panka: '''$1''', '''$3'''-manta|Maskashka pankakuna: '''$1 - $2''', '''$3'''-manta}}, '''$4''' maskashpaka",
index 69b06e3..9cc078e 100644 (file)
@@ -157,7 +157,6 @@ $messages = array(
 'qbbrowse' => 'Sföja',
 'qbedit' => 'Mudèfica',
 'qbpageoptions' => 'Upziòn dla pàgina',
-'qbpageinfo' => 'Infurmaziòn sora la pàgina',
 'qbmyoptions' => 'Al mi pàgin',
 'qbspecialpages' => 'Pàgin particulèri',
 'faq' => 'Question frequenti',
@@ -364,8 +363,6 @@ Lezenda: '''({{int:cur}})''' = difarenzi cun la versiòn d'adès; '''({{int:last
 'search-interwiki-caption' => 'I prugèt fradel',
 'search-interwiki-default' => 'Arsultèd da $1:',
 'search-interwiki-more' => '(ad piò)',
-'search-mwsuggest-enabled' => 'cun j sugeriment',
-'search-mwsuggest-disabled' => "'nciòn sugeriment",
 'nonefound' => "'''Oci''': la rizerca l'a vèn fata in automatico sol in zert spàzi di nòm. S't'vù zirchè fra tot al pàgin (cumpresi al pàgin d'cunversaziòn, i template, ecc) próva a metar \"all:\", in inglés, dadnenz a é nòm ch't'é scrètt, piotòst scriv é spàzi di nòm, s't'al sé, e pu é nòm.",
 'powersearch' => 'Scandaja a fònd',
 'powersearch-legend' => 'Scandaja a fònd',
index ff725b6..d5fb568 100644 (file)
@@ -337,8 +337,6 @@ Tasarut: (cur) = imṣebḍiyen ag tunɣilt n ruxa,
 'search-suggest' => 'Ttugha txsd a tinid: $1',
 'search-interwiki-caption' => 'Awmatn n usnfar',
 'search-interwiki-more' => '(ujar)',
-'search-mwsuggest-enabled' => 's isumuren',
-'search-mwsuggest-disabled' => 'walu isumuren',
 'searchall' => 'maṛṛa',
 'powersearch' => 'Tarzzut tanmhazt',
 'powersearch-legend' => 'Tarzzut tanmhazt',
index fa744e3..f6adcaa 100644 (file)
@@ -49,7 +49,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Zuppentar midadas controlladas en las «ultimas midadas»',
 'tog-newpageshidepatrolled' => 'Zuppentar paginas controlladas en las «paginas novas»',
 'tog-extendwatchlist' => "Extender la glista d'observaziun per mussar tut las midadas e betg be las ultimas",
-'tog-usenewrc' => "Duvrar la versiun extendida da las ''Ultimas midadas'' (basegna JavaScript)",
+'tog-usenewrc' => "Gruppar las midadas tenor pagina en las ''ultimas midadas'' ed la ''glista d'observaziun'' (basegna JavaScript)",
 'tog-numberheadings' => 'Numerar automaticamain ils titels',
 'tog-showtoolbar' => "Mussa la trav d'utensils (basegna JavaScript)",
 'tog-editondblclick' => 'Modifitgar paginas cun in clic dubel (basegna JavaScript)',
@@ -57,17 +57,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Activar la pussaivladad da modifitgar secziuns cun in clic dretg (basegna JavaScript)',
 'tog-showtoc' => 'Mussar ina tabla da cuntegn sin paginas cun dapli che trais tetels',
 'tog-rememberpassword' => "S'annunziar permanantamain cun quest navigatur (per maximalmain $1 {{PLURAL:$1|di|dis}})",
-'tog-watchcreations' => "Observar paginas ch'jau hai creà",
-'tog-watchdefault' => "Observar paginas ch'jau hai edità",
-'tog-watchmoves' => "Observar paginas ch'jau hai spustà",
-'tog-watchdeletion' => "Observar paginas ch'jau hai stizzà",
+'tog-watchcreations' => "Agiuntar paginas ch'jeu creesch e datotecas ch'jau transferesch a la glista d'observaziun",
+'tog-watchdefault' => "Agiuntar paginas e datotecas ch'jau modifitgesch a la glista d'observaziun",
+'tog-watchmoves' => "Agiuntar paginas e datotecas ch'jau hai spustà a la glista d'observaziun",
+'tog-watchdeletion' => "Agiuntar paginas e datotecas ch'jau hai stizzà a la glista d'observaziun",
 'tog-minordefault' => 'Marcar tut las modificaziuns per ordinari sco pitschnas',
 'tog-previewontop' => "Mussar la prevista sur il champ d'endatziun",
 'tog-previewonfirst' => "Adina mussar la prevista suenter l'emprima modificaziun",
 'tog-nocache' => 'Impedir che tes navigatur memorisescha las paginas en il cache',
-'tog-enotifwatchlistpages' => "Trametta in e-mail sch'ina pagina sin mia glista d'observaziun vegn midada",
+'tog-enotifwatchlistpages' => "Ma trametter in e-mail sch'ina pagina u ina datoteca sin mia glista d'observaziun vegn midada",
 'tog-enotifusertalkpages' => "Trametta in e-mail sch'i ha dà midadas sin mia pagina da discussiun.",
-'tog-enotifminoredits' => 'Trametta era in e-mail tar pitschnas midadas da las paginas',
+'tog-enotifminoredits' => 'Era ma trametter in e-mail en cas da midadas pitschnas vid paginas u datotecas',
 'tog-enotifrevealaddr' => "Mussar mia adressa dad e-mail en e-mails d'avis",
 'tog-shownumberswatching' => "Mussar il dumber d'utilisaders che obervan questa pagina",
 'tog-oldsig' => 'Signatura actuala:',
@@ -176,7 +176,7 @@ $messages = array(
 'cancel' => 'refusar las midadas',
 'moredotdotdot' => 'Dapli...',
 'mypage' => 'mia pagina',
-'mytalk' => 'Mia pagina da discussiun',
+'mytalk' => 'discussiun',
 'anontalk' => 'Pagina da discussiun da questa IP',
 'navigation' => 'Navigaziun',
 'and' => '&#32;e',
@@ -186,7 +186,6 @@ $messages = array(
 'qbbrowse' => 'Sfegliar',
 'qbedit' => 'Modifitgar',
 'qbpageoptions' => 'Questa pagina',
-'qbpageinfo' => 'Context',
 'qbmyoptions' => 'Mia pagina',
 'qbspecialpages' => 'paginas spezialas',
 'faq' => 'FAQ',
@@ -199,7 +198,7 @@ $messages = array(
 'vector-action-protect' => 'Bloccar',
 'vector-action-undelete' => 'Restituir',
 'vector-action-unprotect' => 'Midar la protecziun',
-'vector-simplesearch-preference' => 'Activar las propostas per tschertgar extendidas (be per il skin Vector)',
+'vector-simplesearch-preference' => 'Activar la trav da tschertgar simplifitgada (be per il skin Vector)',
 'vector-view-create' => 'Crear',
 'vector-view-edit' => 'Modifitgar',
 'vector-view-history' => 'Cronologia',
@@ -305,6 +304,10 @@ $1',
 'youhavenewmessages' => 'Ti has $1 ($2).',
 'newmessageslink' => 'novs messadis',
 'newmessagesdifflink' => "l'ultima midada",
+'youhavenewmessagesfromusers' => 'Ti has $1 da{{PLURAL:$3|d in utilisader| $3 utilisaders}} ($2).',
+'youhavenewmessagesmanyusers' => 'Ti has $1 da divers utilisaders ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|in nov messadi|novs messadis}}',
+'newmessagesdifflinkplural' => 'ultima{{PLURAL:$1| midada|s midadas}}',
 'youhavenewmessagesmulti' => 'Ti as novs messadis en $1',
 'editsection' => 'modifitgar',
 'editold' => 'modifitgar',
@@ -361,9 +364,9 @@ Ina glista da las paginas spezialas existentas chattais vus sut [[Special:Specia
 'dberrortext' => 'In sbagl da la sintaxa da la dumonda a la banca da datas è capità.
 Quai po esser in sbagl en la software.
 L\'ultima dumonda per la banca da datas era:
-<blockquote><tt>$1</tt></blockquote>
-ord la funcziun "<tt>$2</tt>".
-La banca da datas ha rapportà l\'errur "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+ord la funcziun "<code>$2</code>".
+La banca da datas ha rapportà l\'errur "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'In sbagl da la sintaxa da la dumonda a la banca da datas è capità.
 L\'ultima dumonda per la banca da datas era:
 "$1"
@@ -400,6 +403,8 @@ Annunzia per plaschair la URL ad in [[Special:ListUsers/sysop|administratur]].',
 'cannotdelete' => 'Betg pussaivel da stizzar la pagina u datoteca "$1".
 Eventualmain ha gia insatgi auter stizza quest element.',
 'cannotdelete-title' => 'Impussibel da stizzar la pagina "$1"',
+'delete-hook-aborted' => 'Il prozess da stizzar è vegnì interrut dal hook. 
+El ha dà nagina explicaziun.',
 'badtitle' => "Il num da titel endatà n'è betg valid",
 'badtitletext' => 'Il titel da pagina era betg valid, vids u in titel inter-lingua u inter-wiki betg correct.
 El po cuntegnair in u plirs segns che na pon betg vegnir utilisads en titels.',
@@ -417,8 +422,11 @@ Query: $2',
 Emprova danovamain en in per minutas.',
 'protectedpagetext' => "Questa pagina è vegnida bloccada per evitar ch'ella vegn modifitgada.",
 'viewsourcetext' => 'Ti pos guardar e copiar il code-fundamental da questa pagina:',
-'protectedinterface' => "Questa pagina cuntegna text per l'interfatscha da la software ed è protegida per evitar abus.",
-'editinginterface' => "'''Attenziun:''' Questa pagina cuntegna text che vegn duvra da la software MediaWiki. Midadas influenzeschan directamain l'interfatscha da l'utilisader. Sche ti vuls far translaziuns u correcturas: Studegia da far quai sin [//translatewiki.net/wiki/Main_Page?setlang=rm translatewiki.net], per che las midadas pon vegnidas surprendidas da tut ils projects.",
+'viewyourtext' => "Ti pos giardar e copiar la il code da funatuna da '''tias midadas''' vid questa pagina:",
+'protectedinterface' => "Questa pagina cuntegna ils texts per l'interfatscha da la software ed è protegida per evitar abus.",
+'editinginterface' => "'''Attenziun:''' Questa pagina cuntegna text che vegn duvra en la interfatscha da questa software. 
+Midadas influenzeschan directamain l'interfatscha per tut ils utilisaders sin questa vichi. 
+Sche ti vuls far translaziuns u correcturas per tut las vichis, lura utilisescha [//translatewiki.net/ translatewiki.net], il project per translatar MediaWiki.",
 'sqlhidden' => '(Zuppentà la dumonda da SQL)',
 'cascadeprotected' => "Questa pagina è protegida da modificaziuns perquai ch'ella è integrada en suandanta{{PLURAL:$1| pagina, ch'è protegida|s paginas, ch'èn protegidas}} entras l'opziun «protecziun ertada»: 
 $2",
@@ -428,6 +436,13 @@ $2",
 'ns-specialprotected' => 'Paginas spezialas no pon betg vegnir modifitgadas.',
 'titleprotected' => 'Quest titel è vegnì protegì da la creaziun da [[User:$1|$1]].
 Il motiv inditgà è "\'\'$2\'\'".',
+'filereadonlyerror' => 'Impussibel da modifitgar la datoteca "$1" perquai ch\'il repository da datotecas "$2" è en il modus \'be leger\'.
+
+L\'administratur che ha bloccà l\'access da scriva ha dà suandanta explicaziun: "$3".',
+'invalidtitle-knownnamespace' => 'Titel nunvalid cun tip da pagina "$2" e text "$3"',
+'invalidtitle-unknownnamespace' => 'Titel nunvalid cun numer da tip da pagina nunenconuschent $1 e text "$2"',
+'exception-nologin' => "Betg s'annunzià",
+'exception-nologin-text' => "Questa pagina u acziun pretenda che ti es s'annunzià en quest vichi.",
 
 # Virus scanner
 'virus-badscanner' => "Configuraziun fauss: antivirus nunenconuschent: ''$1''",
@@ -437,16 +452,14 @@ Il motiv inditgà è "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Sortì cun success.'''
 
-Ti pos cuntinuar cun utilisar {{SITENAME}} anonimamain, u che ti pos [[Special:UserLogin|t'annunziar]] sco medem u in'auter utilisader. Resguarda che entginas paginas pon anc vesair or tuttina sco sche ti eras annunzià enfin che ti has stizzà il cache da tes navigatur.",
-'welcomecreation' => '==Bainvegni, $1! ==
-Tes conto è vegni creà.
-Betg emblida da midar tias [[Special:Preferences|preferenzas da {{SITENAME}}]].',
+Ti pos cuntinuar cun utilisar {{SITENAME}} anonimamain, u che ti pos <span class='plainlinks'>[$1 t'annunziar]</span> sco medem u in'auter utilisader. Resguarda che entginas paginas pon anc vesair or tuttina sco sche ti eras annunzià enfin che ti has stizzà il cache da tes navigatur.",
 'yourname' => "Num d'utilisader",
 'yourpassword' => 'pled-clav',
 'yourpasswordagain' => 'repeter pled-clav',
 'remembermypassword' => "S'annunziar permanantamain sin quest computer (per maximalmain $1 {{PLURAL:$1|di|dis}})",
 'securelogin-stick-https' => "Restar collià entras HTTPS suenter l'annunzia",
 'yourdomainname' => 'Vossa domain',
+'password-change-forbidden' => 'Ti na pos betg midar pleds-clav sin quest vichi.',
 'externaldberror' => "U ch'i è capità ina errur cun l'autentificaziun externa u che ti na dastgas betg actualisar tes conto extern.",
 'login' => "T'annunziar",
 'nav-login-createaccount' => "T'annunziar / registrar",
@@ -454,7 +467,7 @@ Betg emblida da midar tias [[Special:Preferences|preferenzas da {{SITENAME}}]].'
 'userlogin' => "T'annunziar / registrar",
 'userloginnocreate' => "T'annunziar",
 'logout' => 'Sortir',
-'userlogout' => 'Sortir',
+'userlogout' => 'sortir',
 'notloggedin' => "Betg s'annunzià",
 'nologin' => "Anc nagin conto? '''$1'''.",
 'nologinlink' => "Crear in conto d'utilisader",
@@ -517,6 +530,8 @@ Perquei è anc nagin retschaiver e trametter dad e-mails per las suandantas func
 'emailconfirmlink' => "Confermar l'adressa dad e-mail",
 'invalidemailaddress' => "L'adressa dad e-mail na po betg vegnir acceptada perquai ch'ella para dad avair in format nunvalid. 
 Endatescha per plaschair ina adressa formatada correctamain u svida cumplettamain il champ.",
+'cannotchangeemail' => "L'adressa dad e-mail dal conto na po betg vegnir midada sin questa vichi.",
+'emaildisabled' => 'Questa pagina na sa betg trametter e-mails.',
 'accountcreated' => "Creà il conto d'utilisader",
 'accountcreatedtext' => "Il conto d'utilisader per $1 è vegnì creà.",
 'createaccount-title' => 'Crear in conto per {{SITENAME}}',
@@ -532,6 +547,7 @@ Spetga per plaschair avant ch'empruvar anc ina giada.",
 
 # E-mail sending
 'php-mail-error-unknown' => 'Errur nunenconuschenta en la funcziun mail() da PHP',
+'user-mail-no-addy' => 'Empruvà da trametter in e-mail senza ina adressa dad e-mail.',
 
 # Change password dialog
 'resetpass' => 'Midar il pled-clav',
@@ -560,6 +576,8 @@ Eventualmain has ti gia midà cun success tes pled-clav u dumandà per in nov pl
 'passwordreset-pretext' => '{{PLURAL:$1||Endatescha in dals tocs da data sutvart}}',
 'passwordreset-username' => "Num d'utilisader:",
 'passwordreset-domain' => 'Domain:',
+'passwordreset-capture' => "Mussar l'e-mail che resultescha?",
+'passwordreset-capture-help' => "Sche ti activeschas quest champ vegn l'e-mail (cun il pled-clav temporar) mussà a ti sco era tramess a l'utilisader.",
 'passwordreset-email' => 'Adressa dad e-mail:',
 'passwordreset-emailtitle' => 'Detagls davart il conto sn {{SITENAME}}',
 'passwordreset-emailtext-ip' => "Insatgi (probablamain ti da l'adressa dad IP $1) ha dumandà in nov pled-clav per la pagina {{SITENAME}} ($4). 
@@ -579,12 +597,18 @@ Ti duessas t'annunziar e tscherner ussa in nov pled-clav. Sche ti na levas betg
 'passwordreset-emailelement' => "Num d'utilisader: $1
 Pled-clav temporar: $2",
 'passwordreset-emailsent' => 'In e-mail cun in nov pled-clav è vegnì tramess.',
+'passwordreset-emailsent-capture' => "L'e-mail per far endament, che vegn mussà sutvart, è vegnì tramess.",
+'passwordreset-emailerror-capture' => "L'e-mail per far endament, che vegn mussà sutvart, è vegnì generà, ma ha dentant betg pudì vegnir spedì a l'utilisader: $1",
 
 # Special:ChangeEmail
 'changeemail' => "Midar l'adressa dad e-mail",
+'changeemail-header' => "Midar l'adressa dad e-mail dal conto",
+'changeemail-text' => 'Cumpletescha quest formular per midar tia adressa dad e-mail. Ti stos endatar tes pled-clav per confermar questa midada.',
 'changeemail-no-info' => "Ti stos t'annunziar per acceder directamain questa pagina.",
+'changeemail-oldemail' => 'Adressa dad e-mail actuala:',
 'changeemail-newemail' => ' Nova adressa dad e-mail',
 'changeemail-none' => '(nagina)',
+'changeemail-submit' => "Midar l'adressa dad e-mail",
 'changeemail-cancel' => 'Interrumper',
 
 # Edit page toolbar
@@ -678,8 +702,11 @@ Ti pos [[Special:Search/{{PAGENAME}}|tschertgar il term]] sin in\'autra pagina,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tschertgar en ils logs],
 u [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear questa pagina]</span>.',
 'noarticletext-nopermission' => 'Questa pagina cuntegna actualmain nagin text.
-Ti pos [[Special:Search/{{PAGENAME}}|tschertgar il term]] sin in\'autra pagina,
-<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tschertgar en ils logs]</span>.',
+Ti pos [[Special:Search/{{PAGENAME}}|tschertgar quest titel]] en autras paginas u <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tschertgar en ils protocols correspundents]</span>, ma ti n\'has betg ils dretgs da crear questa pagina.',
+'missing-revision' => 'La versiun #$1 da la pagina cun il num "{{PAGENAME}}" n\'exista betg.
+
+Quai capita savnes sche ti cliccas sin ina colliaziun antiquada en la cronologia per ina pagina ch\'è vegnida stizzada.
+Detagls pon vegnri chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} protocol da stizzar].',
 'userpage-userdoesnotexist' => 'Il conto d\'utilisader "<nowiki>$1</nowiki>" n\'èxista betg.
 Controllescha sch ti vuls propi crear/modiftgar questa pagina.',
 'userpage-userdoesnotexist-view' => 'Il conto d\'utilisader "$1" n\'exista betg.',
@@ -689,7 +716,6 @@ L'ultima endataziun dal log da bloccar vegn mussà sutvart sco referenza:",
 * '''Firefox / Safari:''' Tegnair ''Shift'' durant cliccar ''chargiar danovamain'', u smatgar ''Ctrl-F5'' u ''Ctrl-R'' (''⌘-R'' sin in Mac)
 * '''Google Chrome:''' Smatgar ''Ctrl-Shift-R'' (''⌘-Shift-R'' sin in Mac)
 * '''Internet Explorer:''' Tegnair ''Ctrl'' durant cliccar ''Rechargiar,'' u smatgar ''Ctrl-F5''
-* '''Konqueror:''' Cliccar ''Rechargiar'' ni smatgar ''F5''
 * '''Opera:''' Stizzar il cache sut ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Tip:''' Utilisescha il buttun \"{{int:showpreview}}\" per testar tes nov CSS avant che memorisar.",
 'userjsyoucanpreview' => "'''Tip:''' Utilisescha il buttun \"{{int:showpreview}}\" per testar tes nov JavaScript avant che memorisar.",
@@ -707,6 +733,7 @@ Fa stim che titels da paginas persunalisadas .css u .js vegnan scrits pitschen,
 'note' => "'''Remartga:'''",
 'previewnote' => "'''Fa stim che quai è be ina prevista.'''
 Tias midadas n'èn anc betg vegnidas memorisadas!",
+'continue-editing' => 'Cuntinuar da modifitgar',
 'previewconflict' => "Questa prevista visualisescha il text en il champ d'endataziun sura. Uschia vegn la pagina vesair ora, sche ti la memoriseschas ussa.",
 'session_fail_preview' => "'''Stgisa! Tia modificaziun na pudeva betg vegnir memorisada perquei che las datas da la sesida èn idas a perder.'''
 Emprova per plaschair danovamain.
@@ -722,6 +749,7 @@ La modificaziun è vegnida refusada per evitar ch'il cuntegn da la pagina vegnia
 Quai po capitar sche ti utiliseschas in survetsch da proxy anonim che na funcziuna betg correctamain.",
 'edit_form_incomplete' => "'''Entginas parts dal formular da modifitgar n'èn betg arrivadas cumplattamain al server; controllescha p.pl. che tias midadas èn intactas ed emprova danovamain.'''",
 'editing' => 'Modifitgar $1',
+'creating' => 'Crear $1',
 'editingsection' => 'Modifitgar $1 (secziun)',
 'editingcomment' => 'Modifitgar $1 (nova secziun)',
 'editconflict' => 'Conflict da modifitgar: $1',
@@ -787,6 +815,7 @@ I para sco sch'ella fiss vegnida stizzada.",
 'edit-conflict' => 'Conflict da modifitgar.',
 'edit-no-change' => 'Tia modificaziun è vegnida ignorada perquai che naginas midadas èn vegnidas fatgas en il text.',
 'edit-already-exists' => "Betg pussaivel da crear ina nova pagina perquai ch'ella exista gia.",
+'defaultmessagetext' => 'Text da standard',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Attenziun:''' Questa pagina cuntegna memia bleras funcziuns dal parser cumplitgadas. 
@@ -802,6 +831,13 @@ Quests arguments vegnan ignorads.",
 'parser-template-loop-warning' => 'Chattà cirquit da models: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Surpassa la limita da recursiun da models ($1)',
 'language-converter-depth-warning' => 'Surpassà la limita ($1) dal convertader da linguas',
+'node-count-exceeded-category' => "Paginas, nua ch'il dumber da nufs è surpassà",
+'node-count-exceeded-warning' => 'Questa pagina ha surpassà il dumber da nufs',
+'expansion-depth-exceeded-category' => "Paginas, nua che la porfunditad d'extensiun è surpassada",
+'expansion-depth-exceeded-warning' => "Questa pagina ha surpassà la profunditad d'expansiun",
+'parser-unstrip-loop-warning' => "Chattà circul d'unstrip",
+'parser-unstrip-recursion-limit' => 'Limita da recursiun ($1) per unstrip è surpassà',
+'converter-manual-rule-error' => 'Ina errur è cumparida en la regla manuala da convertir la lingua',
 
 # "Undo" feature
 'undo-success' => 'Questa modificaziun na po betg vegnir revocada.
@@ -866,20 +902,20 @@ Ti pos anc adina [$1 contemplar questa versiun].",
 'rev-deleted-text-view' => "Questa versiun da la pagina è vegnida '''stizzada'''.
 Ti pos la vesair; detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log da stizzar].",
 'rev-suppressed-text-view' => "Questa versiun da la pagina è vegnida '''supprimida'''.
-Sco administratur pos ti la vesair; detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  log da supprimer].",
+Ti pos la vesair; detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  log da supprimer].",
 'rev-deleted-no-diff' => "Ti na pos betg guardar quest diff perquai ch'ina da las versiuns è vegnida '''stizzada'''.
 Detagls pos ti chattar en [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log da stizzar].",
 'rev-suppressed-no-diff' => "Ti na pos betg guardar quest diff perquai ch'ina da las versiuns è vegnida '''stizzada'''.",
 'rev-deleted-unhide-diff' => "Ina da las versiuns da quest diff è vegnida '''stizzada'''.
 Detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log da stizzar].
-Sco administratur pos ti anc adina [$1 contemplar quest diff].",
+Ti pos anc adina [$1 contemplar quest diff] sche ti vuls cuntinuar.",
 'rev-suppressed-unhide-diff' => "Ina da las versiuns da quest diff è vegnida '''supprimida'''.
 Detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log da supprimer].
-Sco administratur pos ti anc adina [$1 contemplar quest diff] sche ti vuls cuntinuar.",
+Ti pos anc adina [$1 contemplar quest diff] sche ti vuls cuntinuar.",
 'rev-deleted-diff-view' => "Ina da las versiuns da quest diff è vegnida '''stizzada'''.
-Sco administratur pos ti vesair quest diff; detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log da stizzar].",
+Ti pos vesair quest diff; detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log da stizzar].",
 'rev-suppressed-diff-view' => "Ina da las versiuns da quest diff è vegnida '''supprimida'''.
-Sco administratur pos ti vesair quest diff; detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  log da supprimer].",
+Ti pos vesair quest diff; detagls pon vegnir chattads en il [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}}  log da supprimer].",
 'rev-delundel' => 'mussar/zuppentar',
 'rev-showdeleted' => 'mussar',
 'revisiondelete' => 'Stizzar/restituir versiuns',
@@ -894,18 +930,62 @@ Sco administratur pos ti vesair quest diff; detagls pon vegnir chattads en il [{
 'revdelete-show-file-submit' => 'Gea',
 'revdelete-selected' => "'''{{PLURAL:$2|Versiun tschernida|Versiuns tschernidas}} da [[:$1]]:'''",
 'logdelete-selected' => "'''{{PLURAL:$1|Elements dal log tschernì|Elements dal log tschernids}}:'''",
+'revdelete-text' => "'''Versiuns ed ocurrenzas stizzadas cumparan era vinavant en la cronologia ed en ils protocols, dentant èn parts dal cuntegn betg accessibels al public.'''
+Auters administraturs sin {{SITENAME}} vegnan tuttina ad avair access al cuntegn zuppentà e pon restaurar puspè la pagina, sch'i na vegnan betg definidas restricziuns supplementaras.",
+'revdelete-confirm' => 'Confermescha che ti vuls far quai, che ti chapeschas las consequenzas e che ti fas quai en accordanza cun [[{{MediaWiki:Policy-url}}|las directivas]].',
+'revdelete-suppress-text' => "Ti duessas '''be''' supprimer en quests cas: 
+* Infurmaziuns offendentas
+* Infurmaziuns persunalas deplazzadas
+*: ''Adressas e numers da telefon, numers d'AVS, etc.''",
+'revdelete-legend' => 'Definir restricziuns da la visibilitad',
+'revdelete-hide-text' => 'Zuppetar il text da la versiun',
+'revdelete-hide-image' => 'Zuppentar il cuntegn da la datoteca',
+'revdelete-hide-name' => "Zuppentar l'acziun ed la destinaziun",
+'revdelete-hide-comment' => 'Zuppentar la resumaziun da la midada',
+'revdelete-hide-user' => "Zuppentar il num d'utilisader/l'adressa IP da l'autur",
+'revdelete-hide-restricted' => 'Supprimer las datas per administraturs sco per auters',
+'revdelete-radio-same' => '(na betg midar)',
 'revdelete-radio-set' => 'Gea',
 'revdelete-radio-unset' => 'Na',
+'revdelete-suppress' => 'Supprimer il motiv per administraturs sco per auters',
+'revdelete-unsuppress' => 'Allontanar las restricziuns per versiuns restauradas',
 'revdelete-log' => 'Motiv:',
+'revdelete-submit' => 'Applitar a {{PLURAL:$1|la versiun tschernida|las versiuns tschernidas}}',
+'revdelete-success' => "'''Actualià cun success la visibilitad da la versiun.'''",
+'revdelete-failure' => "'''Betg pussaivel da midar la visibilitad da la versiun:'''
+$1",
+'logdelete-success' => "'''Definì cun success la visibilitad dal protocol.'''",
+'logdelete-failure' => "'''Betg pussaivel da midar la visibilitad dal protocol:'''
+$1",
 'revdel-restore' => 'midar la visibilitad',
 'revdel-restore-deleted' => 'versiuns stizzadas',
 'revdel-restore-visible' => 'versiuns visiblas',
 'pagehist' => 'Istorgia da las versiuns',
+'deletedhist' => 'Cronologia da stizzar',
+'revdelete-hide-current' => "Errur cun zuppentar l'element datà ils $1 las $2: Quai è la versiun actuala. 
+Ella na po betg vegnir zuppentada.",
+'revdelete-show-no-access' => 'Errur cun mussar l\'element datà ils $1 las $2: Quest element è vegnì marcà sco "restrenschì".
+Ti n\'has nagin access ad ella.',
+'revdelete-modify-no-access' => 'Errur cun modifitgar l\'element datà ils $1 las $2: Quest element è vegnì marcà sco "restrenschì".
+Ti n\'has nagin access ad ella.',
+'revdelete-modify-missing' => "Errur cun modifitgar l'element cun l'ID $1: El manca en la banca da datas!",
+'revdelete-no-change' => "'''Attenziun:''' L'element datà ils $1 las $2 ha gia giu la configuraziun da visibilitad dumandada.",
+'revdelete-concurrent-change' => "Errur cun modifitgar l'element datà ils $1 las $2: Il status para dad avair midà dad insatgi durant che ti has empruvà da modifitgar el. 
+Controllescha per plaschair ils protocols.",
+'revdelete-only-restricted' => "Errur cun zuppentar l'element datà ils $1 las$2: Ti na pos betg zuppentar elements dad administraturs senza era tscherner ina da las autras opziuns da visibilitad.",
+'revdelete-reason-dropdown' => "*Motivs generals per stizzar
+** Violaziun da dretgs d'autur
+** Commentari nunadattà u infurmaziuns persunalas
+** Num d'utilisader betg adattà
+** Infurmaziuns potenzialmain disfamantas",
 'revdelete-otherreason' => 'Auter/ulteriur motiv:',
 'revdelete-reasonotherlist' => 'Auter motiv',
 'revdelete-edit-reasonlist' => 'Modifitgar ils motivs per stizzar',
 'revdelete-offender' => 'Autur da la versiun:',
 
+# Suppression log
+'suppressionlog' => 'Protocol da suppressiuns',
+
 # History merging
 'mergehistory' => 'Unir la cronologia da paginas',
 'mergehistory-header' => "Cun questa pagina speziala pos ti integrar versiuns da la cronologia d'ina pagina originala en ina pagina pli nova. 
@@ -987,8 +1067,6 @@ Fa stim che navigar cun agid da las coalliziuns reinizialisescha tia tscherna.',
 'search-interwiki-caption' => 'Projects sumegliants',
 'search-interwiki-default' => '$1 resultats:',
 'search-interwiki-more' => '(dapli)',
-'search-mwsuggest-enabled' => 'cun propostas',
-'search-mwsuggest-disabled' => 'naginas propostas',
 'search-relatedarticle' => 'Sumegliant',
 'mwsuggest-disable' => 'Deactivar propostas AJAX',
 'searcheverything-enable' => 'Tschertgar en tut ils tips da pagina',
@@ -1023,7 +1101,7 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
 
 # Preferences page
 'preferences' => 'Preferenzas',
-'mypreferences' => 'Mias preferenzas',
+'mypreferences' => 'preferenzas',
 'prefs-edits' => 'Dumber da las modificaziuns:',
 'prefsnologin' => "Betg t'annunzià",
 'prefsnologintext' => 'Ti stos esser <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} t\'annunzià]</span> per midar tias preferenzas.',
@@ -1031,7 +1109,10 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
 'prefs-skin' => 'Skin',
 'skin-preview' => 'Prevista',
 'datedefault' => 'Nagina preferenza',
+'prefs-beta' => 'Funcziuns da Beta',
 'prefs-datetime' => 'Data e temp',
+'prefs-labs' => 'Funcziuns experimentalas',
+'prefs-user-pages' => 'Paginas dad utilisader',
 'prefs-personal' => "Profil da l'utilisader",
 'prefs-rc' => 'Ultimas midadas',
 'prefs-watchlist' => "Glista d'observaziun",
@@ -1042,6 +1123,8 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
 'prefs-watchlist-token' => "Token da la glista d'observaziun",
 'prefs-misc' => 'Different',
 'prefs-resetpass' => 'Midar il pled clav',
+'prefs-changeemail' => "Midar l'adressa dad e-mail",
+'prefs-setemail' => 'Definir ina adressa dad e-mail',
 'prefs-email' => 'Opziuns dad e-mail',
 'prefs-rendering' => 'Cumparsa',
 'saveprefs' => 'memorisar',
@@ -1076,7 +1159,7 @@ Considerescha che lur index da {{SITENAME}} po cuntegnair datas ch'èn betg pli
 'timezoneregion-indian' => 'Ocean Indic',
 'timezoneregion-pacific' => 'Ocean pacific',
 'allowemail' => 'Retschaiver e-mails dad auters utilisaders',
-'prefs-searchoptions' => 'Opziuns da tschertgar',
+'prefs-searchoptions' => 'Tschertgar',
 'prefs-namespaces' => 'Tips da pagina',
 'defaultns' => 'Uschiglio tschertgar en quests tips da pagina:',
 'default' => 'Standard',
@@ -1706,7 +1789,7 @@ I renviescha uss a [[$2]].',
 
 # Special:Log
 'specialloguserlabel' => 'Acziun exequida da:',
-'speciallogtitlelabel' => 'Titel:',
+'speciallogtitlelabel' => 'Destinaziun (titel u utilisader):',
 'log' => 'logs / cudesch da navigaziun',
 'all-logs-page' => 'Tut ils logs publics',
 
@@ -1739,9 +1822,9 @@ I renviescha uss a [[$2]].',
 'linksearch-pat' => 'Muster da tschertgar:',
 'linksearch-ns' => 'Tip da pagina:',
 '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: <code>$1</code>',
+'linksearch-text' => 'Tegnaplazzas sco "*.wikipedia.org" pon vegnir utilisads.
+Dovra almain ina top-level domain, per exempel "*.org".<br />
+Protocols sustegnids: <code>$1</code> (n\'agiunta betg quels a tia tschertga).',
 'linksearch-line' => '$1 è collià davent da la pagina $2',
 'linksearch-error' => "Wildcards pon esser be a l'entschatta dal num da host.",
 
@@ -1787,6 +1870,8 @@ Infurmaziuns supplementaras davart ils singuls dretgs chattas [[{{MediaWiki:List
 'mailnologin' => 'Nagina adressa per trametter',
 'mailnologintext' => "Ti stos [[Special:UserLogin|t'annunziar]] ed avair ina adressa dad e-mail valida en tias [[Special:Preferences|preferenzas]] per trametter e-mails ad auters utilisaders.",
 'emailuser' => 'Trametter in e-mail a quest utilisader',
+'emailuser-title-target' => 'Trametta in e-mail a {{GENDER:$1|quest utilisader|questa utilisadra}}',
+'emailuser-title-notarget' => "Trametter in e-mail a l'utilisader",
 'emailpage' => "Trametter in e-mail a l'utilisader",
 'emailpagetext' => "Ti pos utilisar il formular sutvart per trametter in'e-mail a quest utilisader.
 L'adressa dad e-mail che ti has endatà en [[Special:Preferences|tias preferenzas]] vegn inditgada sco speditur da l'e-mail, uschia ch'il retschavider po rispunder directamain a tai.",
@@ -1819,8 +1904,8 @@ L'adressa dad e-mail che ti has endatà en [[Special:Preferences|tias preferenza
 'usermessage-editor' => 'Messenger dal sistem',
 
 # Watchlist
-'watchlist' => "Mia glista d'observaziun",
-'mywatchlist' => "Mia glista d'observaziun",
+'watchlist' => "glista d'observaziun",
+'mywatchlist' => "glista d'observaziun",
 'watchlistfor2' => 'Per $1 $2',
 'nowatchlist' => "Ti n'has nagins elements sin tia glista d'observaziun.",
 'watchlistanontext' => "Ti stos $1 per vesair u modifitgar elements sin tia glista d'observaziun",
@@ -1845,7 +1930,7 @@ Midadas futuras vid quai artitgel e la pagina da discussiun appertegnenta vegnan
 'watchmethod-list' => 'intercurir las paginas observadas davart novas midadas',
 'watchlistcontains' => "Tia glista d'observaziun cuntegna $1 {{PLURAL:$1|pagina|paginas}}.",
 'iteminvalidname' => "Problem cun endataziun '$1', num nunvalid...",
-'wlnote' => "Sutvart {{PLURAL:$1|è l'ultima midada|èn las ultimas '''$1''' midadas}} entaifer {{PLURAL:$2|l'ultima ura|las ultimas '''$2''' uras}}.",
+'wlnote' => "Sutvart {{PLURAL:$1|è l'ultima midada|èn las ultimas '''$1''' midadas}} entaifer {{PLURAL:$2|l'ultima ura|las ultimas '''$2''' uras}}. Actualisà ils $3 las $4.",
 'wlshowlast' => 'Mussar: las ultimas $1 uras, ils ultims $2 dis u $3.',
 'watchlist-options' => "Opziuns per la glista d'observaziun",
 
@@ -1856,11 +1941,7 @@ Midadas futuras vid quai artitgel e la pagina da discussiun appertegnenta vegnan
 
 'enotif_mailer' => "Servetsch d'infurmaziun per e-mail da {{SITENAME}}",
 'enotif_reset' => 'Marcar tut las paginas sco visitadas.',
-'enotif_newpagetext' => 'Quaii è ina nova pagina.',
 'enotif_impersonal_salutation' => 'Utilisader da {{SITENAME}}',
-'changed' => 'midada',
-'created' => 'creada',
-'enotif_subject' => 'La pagina $PAGETITLE da {{SITENAME}} è vegnida $CHANGEDORCREATED da $PAGEEDITOR',
 'enotif_lastvisited' => 'Visita $1 per vesair tut las midadas dapi tia ultima visita.',
 'enotif_lastdiff' => 'Guarda $1 per vesair questa midada.',
 'enotif_anon_editor' => 'utilisader anonim $1',
@@ -2006,6 +2087,8 @@ L'archiv vegn eventualmain svidà periodicamain.",
 'undeleteextrahelp' => "Per restituir l'entira cronologia d'ina pagina, lascha inactiv tut las chaschettas e cllicca sin '''''{{int:undeletebtn}}'''''.
 Per restituir be tschertgas part, activescha las chaschettas correspundentas per las versiuns che duain vegnir restituidas e clicca sin '''''{{int:undeletebtn}}'''''.",
 'undeleterevisions' => 'Archivà $1 {{PLURAL:$1|versiun|versiuns}} archived',
+'undeletehistory' => "Sche ti restaureschas ina pagina vegnan tut las versiuns en la coronologia era restauradas. 
+Sch'ina nova pagina cun il medem num è vegnida creada dapi che la pagina è vegnida stizzada, vegnan las versiuns restauradas cumparir avant en la cronologia.",
 'undelete-nodiff' => 'Chattà naginas versiuns anteriuras.',
 'undeletebtn' => 'restituir',
 'undeletelink' => 'mussar/restituir',
@@ -2027,7 +2110,7 @@ Per restituir be tschertgas part, activescha las chaschettas correspundentas per
 # Contributions
 'contributions' => "Contribuziuns da l'utilisader",
 'contributions-title' => "Contribuziuns d'utilisader da $1",
-'mycontris' => 'Mias contribuziuns',
+'mycontris' => 'contribuziuns',
 'contribsub2' => 'Per $1 ($2)',
 'nocontribs' => 'Chattà naginas modificaziuns che correspundan a quests criteris.',
 'uctop' => '(actual)',
@@ -2104,7 +2187,7 @@ Inditgescha sutvart in motiv (per exempel pos ti inditgar paginas ch'èn vegnida
 'badipaddress' => "L'adressa IP è nunvalida",
 'blockipsuccesssub' => 'Bloccà cun success',
 'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] è vegnì bloccà.<br />
-Sin [[Special:BlockList|la glista dad IPs bliccadas]] pos ti repassar tut las bloccadas.',
+La [[Special:BlockList|glista da bloccadas]] mussa tut las bloccadas.',
 'ipb-edit-dropdown' => 'Modifitgar ils motivs per bloccar',
 'ipb-unblock-addr' => 'Debloccar $1',
 'ipb-unblock' => 'Debloccar in utilisader u ina adressa IP',
@@ -2398,7 +2481,6 @@ Emprova danovamain.',
 
 # JavaScriptTest
 'javascripttest' => 'Test da JavaScript',
-'javascripttest-disabled' => 'Questa funcziun è deactivada.',
 'javascripttest-title' => 'Exequir tests da $1',
 'javascripttest-pagetext-noframework' => 'Questa pagina è reservada per exequir tests da JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Framework da test nunenconuschent "$1".',
@@ -2510,11 +2592,31 @@ 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-basic' => 'Infurmaziuns da basa',
+'pageinfo-header-edits' => 'Cronologia da las midadas',
+'pageinfo-display-title' => 'Titel mussà',
+'pageinfo-default-sort' => 'Criteri da zavrar da standard',
+'pageinfo-length' => 'Lunghezza da la pagina (en bytes)',
+'pageinfo-article-id' => 'ID da la pagina',
+'pageinfo-robot-policy' => 'Status per maschinas da tschertgar',
+'pageinfo-robot-index' => 'Indexabel',
+'pageinfo-robot-noindex' => 'Betg indexabel',
 'pageinfo-views' => 'Dumber da visitas',
-'pageinfo-watchers' => 'Dumber dad observaturs',
-'pageinfo-edits' => 'Dumber da midadas',
-'pageinfo-authors' => 'Dumber dad auturs differents',
+'pageinfo-watchers' => 'Dumber dad observaturs da la pagina',
+'pageinfo-redirects-name' => 'Renviaments a questa pagina',
+'pageinfo-subpages-name' => 'Sutpaginas da questa pagina',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|renviament|renviaments}}; $3 {{PLURAL:$3|betg in renviament|betg renviaments}})',
+'pageinfo-firstuser' => 'Creatur da la pagina',
+'pageinfo-firsttime' => 'Data da la creaziun da la pagina',
+'pageinfo-lastuser' => 'Ultima midada da',
+'pageinfo-lasttime' => "Data da l'ultima midada",
+'pageinfo-edits' => 'Dumber total da midadas',
+'pageinfo-authors' => 'Dumber total dad auturs differents',
+'pageinfo-recent-edits' => 'Dumber da midadas capitadas dacurt (entaifer ils ultims $1)',
+'pageinfo-recent-authors' => 'Dumber da differents auturs che han midà dacurt la pagina',
+'pageinfo-magic-words' => '{{PLURAL:$1|Pled magic|Pleds magics}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria zuppentada|Categorias zuppentadas}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Template integrà|Templates integrads}} ($1)',
 
 # Patrolling
 'markaspatrolleddiff' => 'Marcar sco controllà',
@@ -2558,6 +2660,7 @@ Cun exequir questa datoteca po tes sistem vegnir donnegià.",
 'file-info-size-pages' => '$1 × $2 pixels, grondezza da datoteca: $3, tip da MIME: $4, $5 {{PLURAL:$5|pagina|paginas}}',
 'file-nohires' => 'Nagina resuluziun pli auta disponibla.',
 'svg-long-desc' => 'datoteca da SVG, grondezza da basa $1 × $2 pixels, grondezza da datoteca: $3',
+'svg-long-desc-animated' => 'Datoteca da SVG animada, dimensiun normala $1 x $2 pixels, grondezza da datoteca: $3',
 'show-big-image' => 'Resoluziun cumplaina',
 'show-big-image-preview' => 'Grondezza da questa prevista: $1.',
 'show-big-image-other' => 'Other {{PLURAL:$2|resoluziun|resoluziuns}}: $1.',
@@ -2567,6 +2670,8 @@ Cun exequir questa datoteca po tes sistem vegnir donnegià.",
 'file-info-png-looped' => 'marscha infinit',
 'file-info-png-repeat' => 'Reprodicì $1 {{PLURAL:$1|giada|giadas}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|frame|frames}}',
+'file-no-thumb-animation' => "'''Avis: Per motivs tecnics n'èn las miniaturas da questa datoteca betg animadas.'''",
+'file-no-thumb-animation-gif' => "'''Avis: Per motivs tecnics n'èn las miniaturas da maletgs da GIF dad auta resoluziun sco quest betg animadas.'''",
 
 # Special:NewFiles
 'newimages' => 'Galleria dals novs maletgs',
@@ -3046,7 +3151,7 @@ sbittar la confermaziun da l\'adressa dad e-mail:
 
 $5
 
-Quai code da confermaziun vegn a scrudar ils $6 las $7.',
+Quai code da confermaziun vegn a scrudar ils $4.',
 'confirmemail_invalidated' => "La confermaziun da l'adressa dad e-mail è vegnida stizzada",
 'invalidateemail' => "Stizzar la confermaziun da l'adressa dad e-mail",
 
@@ -3135,6 +3240,9 @@ Ti pos era utilisar [[Special:EditWatchlist|la pagina da standard]].',
 'watchlisttools-edit' => "Mussar e modifitgar la glista d'observaziun",
 'watchlisttools-raw' => 'Modifitgar il format da la glista (import/export)',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])',
+
 # Core parser functions
 'unknown_extension_tag' => 'Tag d\'extensiun nunenconuschent "$1"',
 'duplicate-defaultsort' => '\'\'\'Attenziun:\'\'\' La clav da zavrar da standard "$2" remplazza la clav da zavrar da standard veglia "$1".',
@@ -3167,6 +3275,9 @@ Ti duessas avair retschavì [{{SERVER}}{{SCRIPTPATH}}/COPYING ina copia da la GN
 'version-software' => 'Software installada',
 'version-software-product' => 'Product',
 'version-software-version' => 'Versiun',
+'version-entrypoints' => "URLs dals puncts d'entrada",
+'version-entrypoints-header-entrypoint' => "Punct d'entrada",
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Percurs da la datoteca',
@@ -3196,7 +3307,7 @@ Endatescha il num da datoteca senza il prefix "{{ns:file}}:".',
 * <span class="mw-specialpagecached">Paginas spezialas en il cache (pon esser antiquadas).</span>',
 'specialpages-group-maintenance' => 'Rapports da mantegnamant',
 'specialpages-group-other' => 'Autras paginas spezialas',
-'specialpages-group-login' => "T'annunziar / registrar",
+'specialpages-group-login' => "S'annunziar / crear in conto",
 'specialpages-group-changes' => 'Ultimas midadas e logs',
 'specialpages-group-media' => 'Rapports ed elements multimedials',
 'specialpages-group-users' => 'Utilisaders e dretgs',
@@ -3275,9 +3386,38 @@ Questa pagina ha actualmain difficultads tecnicas.',
 # New logging system
 'logentry-delete-delete' => '$1 ha stizzà la pagina $3',
 'logentry-delete-restore' => '$1 ha restaurà la pagina $3',
+'logentry-delete-event' => "$1 ha midà la visibilitad da{{PLURAL:$5|d ina occurrenza en il protocol| $5 occurrenzas en il protocol}} da '''$3''': $4",
+'logentry-delete-revision' => '$1 ha midà la visibilitad da{{PLURAL:$5|d ina versiun| $5 versiuns}} da la pagina $3: $4',
+'logentry-delete-event-legacy' => '$1 ha midà la visibilitad dad occurrenzas da protocol sin $3',
+'logentry-delete-revision-legacy' => '$1 ha midà la visibilitad da versiuns sin la pagina $3',
+'logentry-suppress-delete' => '$1 ha supprimì la pagina $3',
+'logentry-suppress-event' => '$1 ha midà secretamain la visibilitad da{{PLURAL:$5|d ina occurrenza da protocol| $5 ocurrenzas da protocol}} sin $3: $4',
+'logentry-suppress-revision' => '$1 ha midà secretamain la visibilitad da{{PLURAL:$5|d ina versiun| $5 versiuns}} da la pagina $3: $4',
+'logentry-suppress-event-legacy' => '$1 ha midà secretamain la visibilitad dad occurrenzas da protocol sin $3',
+'logentry-suppress-revision-legacy' => '$1 ha midà secretamain la visibilitad da versiuns sin la pagina $3',
+'revdelete-content-hid' => 'zuppentà il cuntegn',
+'revdelete-summary-hid' => 'zuppentà la resumaziun da las midadas',
+'revdelete-uname-hid' => "zuppentà il num d'utilisader",
+'revdelete-content-unhid' => 'dà liber il cuntegn',
+'revdelete-summary-unhid' => 'dà liber la resumaziun da las midadas',
+'revdelete-uname-unhid' => "dà liber il num d'utilisader",
+'revdelete-restricted' => 'applitgà restricziuns per administraturs',
+'revdelete-unrestricted' => 'allontanà restricziuns per administraturs',
+'logentry-move-move' => '$1 ha spustà la pagina $3 a $4',
+'logentry-move-move-noredirect' => '$1 ha spustà la pagina $3 a $4 senza crear in renviament',
+'logentry-move-move_redir' => '$1 ha spustà la pagina $3 a $4 e surscrit quatras in renviament',
+'logentry-move-move_redir-noredirect' => '$1 ha spustà la pagina $3 a $4 e surscrit quatras in renviament senza crear in renviament',
+'logentry-patrol-patrol' => '$1 ha marcà la versiun $4 da la pagina $3 sco controllada',
+'logentry-patrol-patrol-auto' => '$1 ha marcà automaticamain la versiun $4 da la pagina $3 sco controllada',
+'logentry-newusers-newusers' => "$1 ha creà in conto d'utilisader",
+'logentry-newusers-create' => "$1 ha creà in conto d'utilisader",
+'logentry-newusers-create2' => "$1 ha creà in conto d'utilisader $3",
+'logentry-newusers-autocreate' => 'Il conto $1 è vegnì creà automaticamain',
 'newuserlog-byemail' => 'tramess il pled-clav per e-mail',
 
 # Feedback
+'feedback-bugornote' => 'Sche ti vuls descriver detagliadamain in problem techic, lura [$1 rapporta in bug].
+Uschiglio pos ti utilisar il formular simpel sutvart. Tes commentari vegn agiuntà a la pagina "[$3 $2]" ensemen cun tes num d\'utilisader.',
 'feedback-subject' => 'Object:',
 'feedback-message' => 'Messadi:',
 'feedback-cancel' => 'Interrumper',
@@ -3291,6 +3431,10 @@ Questa pagina ha actualmain difficultads tecnicas.',
 'feedback-bugcheck' => "Grondius! Controllescha simplamain che quai n'è betg gia in da las [$1 errurs enconuschentas].",
 'feedback-bugnew' => 'Jau hai controllà. Rapportar ina nova errur.',
 
+# Search suggestions
+'searchsuggest-search' => 'Tschertgar',
+'searchsuggest-containing' => 'cuntegna…',
+
 # API errors
 'api-error-badaccess-groups' => 'Ti na dastgas betg chargiar datotecas en quest wiki.',
 'api-error-badtoken' => 'Errur interna: Token fauss.',
@@ -3302,6 +3446,8 @@ Questa pagina ha actualmain difficultads tecnicas.',
 'api-error-empty-file' => 'La datoteca tramessa è vida.',
 'api-error-emptypage' => "Crear paginas novas e vidas n'è betg lubì.",
 'api-error-fetchfileerror' => "Errur interna: Insatge n'ha betg funcziunà durant retschaiver la datoteca.",
+'api-error-fileexists-forbidden' => 'Ina datoteca cun il num "$1" exista gia e na po betg vegnir remplazzada.',
+'api-error-fileexists-shared-forbidden' => 'Ina datoteca cun il num "$1" exista gia en il repository communabel e na po betg vegnir remplazzada.',
 '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à.',
@@ -3330,4 +3476,15 @@ Questa pagina ha actualmain difficultads tecnicas.',
 'api-error-uploaddisabled' => 'La funcziun da chargiar datotecas sin quest vichi è deactivada.',
 'api-error-verification-error' => 'Questa datoteca pudess esser corrupta ni avair ina extensiun faussa.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|secunda|secundas}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuta|minutas}}',
+'duration-hours' => '$1 {{PLURAL:$1|ura|uras}}',
+'duration-days' => '$1 {{PLURAL:$1|di|dis}}',
+'duration-weeks' => '$1 {{PLURAL:$1|emna|emnas}}',
+'duration-years' => '$1 {{PLURAL:$1|onn|onns}}',
+'duration-decades' => '$1 {{PLURAL:$1|decada|decadas}}',
+'duration-centuries' => '$1 {{PLURAL:$1|tschientaner|tschientaners}}',
+'duration-millennia' => '$1 {{PLURAL:$1|millenni|millennis}}',
+
 );
index 6cdafbc..3910671 100644 (file)
@@ -33,183 +33,183 @@ $namespaceNames = array(
 );
 
 $messages = array(
-'underline-always'  => 'Savaxt',
-'underline-never'   => 'Ni ekhvar',
+'underline-always' => 'Savaxt',
+'underline-never' => 'Ni ekhvar',
 'underline-default' => 'Browseresko standardo',
 
 # Dates
-'sunday'    => 'purano kurko',
-'monday'    => 'lui',
-'tuesday'   => 'marci',
+'sunday' => 'purano kurko',
+'monday' => 'lui',
+'tuesday' => 'marci',
 'wednesday' => 'tetradī',
-'thursday'  => 'zhoi',
-'friday'    => 'parashtui',
-'saturday'  => 'savato',
-'january'   => 'pervonai',
-'february'  => 'duitonai',
-'march'     => 'tritonai',
-'april'     => 'shtartonai',
-'may_long'  => 'panjtonai',
-'june'      => 'shovtonai',
-'july'      => 'eftatonai',
-'august'    => 'oxtotonai',
+'thursday' => 'zhoi',
+'friday' => 'parashtui',
+'saturday' => 'savato',
+'january' => 'pervonai',
+'february' => 'duitonai',
+'march' => 'tritonai',
+'april' => 'shtartonai',
+'may_long' => 'panjtonai',
+'june' => 'shovtonai',
+'july' => 'eftatonai',
+'august' => 'oxtotonai',
 'september' => 'enyatonai',
-'october'   => 'deshtonai',
-'november'  => 'deshuekhtonai',
-'december'  => 'deshuduitonai',
-'jan'       => 'perv',
-'feb'       => 'dui',
-'mar'       => 'tri',
-'apr'       => 'shta',
-'may'       => 'panj',
-'jun'       => 'shov',
-'jul'       => 'efta',
-'aug'       => 'oxt',
-'sep'       => 'enya',
-'oct'       => 'desh',
-'nov'       => 'dekh',
-'dec'       => 'ddui',
+'october' => 'deshtonai',
+'november' => 'deshuekhtonai',
+'december' => 'deshuduitonai',
+'jan' => 'perv',
+'feb' => 'dui',
+'mar' => 'tri',
+'apr' => 'shta',
+'may' => 'panj',
+'jun' => 'shov',
+'jul' => 'efta',
+'aug' => 'oxt',
+'sep' => 'enya',
+'oct' => 'desh',
+'nov' => 'dekh',
+'dec' => 'ddui',
 
 # Categories related messages
 'subcategories' => 'Telekategoriye',
 
-'about'      => 'Andar',
-'article'    => 'Lekh',
-'newwindow'  => '(inklel aver filiyastra)',
-'cancel'     => 'Mekh la',
-'mypage'     => 'Miri patrin',
-'mytalk'     => 'Mire vakyarimata',
+'about' => 'Andar',
+'article' => 'Lekh',
+'newwindow' => '(inklel aver filiyastra)',
+'cancel' => 'Mekh la',
+'mypage' => 'Miri patrin',
+'mytalk' => 'Mire vakyarimata',
 'navigation' => 'Phiripen',
-'and'        => '&#32;thai',
+'and' => '&#32;thai',
 
 # Cologne Blue skin
-'qbedit'         => 'Editisar',
-'qbpageinfo'     => 'Patrinyake janglimata',
+'qbedit' => 'Editisar',
+'qbpageinfo' => 'Patrinyake janglimata',
 'qbspecialpages' => 'Uzalutne patrya',
 
-'errorpagetitle'   => 'Dosh',
-'returnto'         => 'Ja palpale kai $1.',
-'help'             => 'Zhutipen',
-'search'           => 'Rod',
-'searchbutton'     => 'Rod',
-'go'               => 'Ja',
-'searcharticle'    => 'Ja',
-'history'          => 'Puraneder versiye',
-'history_short'    => 'Puranipen',
+'errorpagetitle' => 'Dosh',
+'returnto' => 'Ja palpale kai $1.',
+'help' => 'Zhutipen',
+'search' => 'Rod',
+'searchbutton' => 'Rod',
+'go' => 'Ja',
+'searcharticle' => 'Ja',
+'history' => 'Puraneder versiye',
+'history_short' => 'Puranipen',
 'printableversion' => 'Printisaripnaski versiya',
-'permalink'        => 'Savaxtutno phandipen',
-'print'            => 'Printisaripen',
-'edit'             => 'Editisar i patrin',
-'editthispage'     => 'Editisar i patrin',
-'delete'           => 'Khosipen',
-'deletethispage'   => 'Khos i patrin',
-'undelete_short'   => 'Na mai khos le editisarimata $1',
-'protect'          => 'Brakhipen',
-'unprotect'        => 'Na mai brakh',
-'newpage'          => 'Nevi patrin',
-'specialpage'      => 'Uzalutni patrin',
-'personaltools'    => 'Mire labne',
-'articlepage'      => 'Dikh o lekh',
-'talk'             => 'Vakyarimata',
-'toolbox'          => 'Labnengo moxton',
-'userpage'         => 'Dikh i jeneski patrin',
-'viewtalkpage'     => 'Dikh i diskucia',
-'otherlanguages'   => 'Avre ćhibande',
-'lastmodifiedat'   => 'O palutno paruvipen $2, $1.',
-'viewcount'        => 'Kadaya patrin dikhlilyas {{PLURAL:$1|one time|$1var}}.',
-'jumpto'           => 'Ja kai:',
+'permalink' => 'Savaxtutno phandipen',
+'print' => 'Printisaripen',
+'edit' => 'Editisar i patrin',
+'editthispage' => 'Editisar i patrin',
+'delete' => 'Khosipen',
+'deletethispage' => 'Khos i patrin',
+'undelete_short' => 'Na mai khos le editisarimata $1',
+'protect' => 'Brakhipen',
+'unprotect' => 'Na mai brakh',
+'newpage' => 'Nevi patrin',
+'specialpage' => 'Uzalutni patrin',
+'personaltools' => 'Mire labne',
+'articlepage' => 'Dikh o lekh',
+'talk' => 'Vakyarimata',
+'toolbox' => 'Labnengo moxton',
+'userpage' => 'Dikh i jeneski patrin',
+'viewtalkpage' => 'Dikh i diskucia',
+'otherlanguages' => 'Avre ćhibande',
+'lastmodifiedat' => 'O palutno paruvipen $2, $1.',
+'viewcount' => 'Kadaya patrin dikhlilyas {{PLURAL:$1|one time|$1var}}.',
+'jumpto' => 'Ja kai:',
 'jumptonavigation' => 'phiripen',
-'jumptosearch'     => 'rodipen',
+'jumptosearch' => 'rodipen',
 
 # 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'            => 'Andar {{SITENAME}}',
-'aboutpage'            => 'Project:Andar',
-'copyright'            => 'Ander dino tar o $1.',
-'copyrightpage'        => '{{ns:project}}:Autorenge xakaya (chachimata)',
-'currentevents'        => 'Nevimata',
-'currentevents-url'    => 'Project:Nevimata',
-'disclaimers'          => 'Termenurya',
-'disclaimerpage'       => 'Project:Termenurya',
-'edithelp'             => 'Editisaripnasko zhutipen',
-'edithelppage'         => 'Help:Sar te editisares ek patrin',
-'helppage'             => 'Help:Zhutipen',
-'mainpage'             => 'Sherutni patrin',
+'aboutsite' => 'Andar {{SITENAME}}',
+'aboutpage' => 'Project:Andar',
+'copyright' => 'Ander dino tar o $1.',
+'copyrightpage' => '{{ns:project}}:Autorenge xakaya (chachimata)',
+'currentevents' => 'Nevimata',
+'currentevents-url' => 'Project:Nevimata',
+'disclaimers' => 'Termenurya',
+'disclaimerpage' => 'Project:Termenurya',
+'edithelp' => 'Editisaripnasko zhutipen',
+'edithelppage' => 'Help:Sar te editisares ek patrin',
+'helppage' => 'Help:Zhutipen',
+'mainpage' => 'Sherutni patrin',
 'mainpage-description' => 'Sherutni patrin',
-'portal'               => 'Maladipnasko than',
-'portal-url'           => 'Project:Maladipnasko than',
-'privacy'              => 'Pativyako forovipen',
+'portal' => 'Maladipnasko than',
+'portal-url' => 'Project:Maladipnasko than',
+'privacy' => 'Pativyako forovipen',
 
-'retrievedfrom'   => 'Lino katar "$1"',
-'editsection'     => 'editisar',
+'retrievedfrom' => 'Lino katar "$1"',
+'editsection' => 'editisar',
 'editsectionhint' => 'Editisar o kotor: $1',
-'toc'             => 'Ander',
-'showtoc'         => 'dikh',
-'hidetoc'         => 'garav',
+'toc' => 'Ander',
+'showtoc' => 'dikh',
+'hidetoc' => 'garav',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Lekh',
-'nstab-user'      => 'Jeneski patrin',
-'nstab-media'     => 'Mediya patrin',
-'nstab-special'   => 'Uzalutno',
-'nstab-project'   => 'Projekto',
-'nstab-image'     => 'Chitro',
+'nstab-main' => 'Lekh',
+'nstab-user' => 'Jeneski patrin',
+'nstab-media' => 'Mediya patrin',
+'nstab-special' => 'Uzalutno',
+'nstab-project' => 'Projekto',
+'nstab-image' => 'Chitro',
 'nstab-mediawiki' => 'Duma',
-'nstab-template'  => 'Sikavno',
-'nstab-help'      => 'Zhutipen',
-'nstab-category'  => 'Shopni',
+'nstab-template' => 'Sikavno',
+'nstab-help' => 'Zhutipen',
+'nstab-category' => 'Shopni',
 
 # Main script and global functions
 'nospecialpagetext' => 'Manglyas ekh [[Special:SpecialPages|uzalutni patrin]] so na arakhel pes kai {{SITENAME}}.',
 
 # General errors
 'wrong_wfQuery_params' => 'Doshalo gin le parametrengo ko wfQuery()<br />I function: $1<br />Query: $2',
-'viewsource'           => 'Dikh i sursa',
+'viewsource' => 'Dikh i sursa',
 
 # Login and logout pages
-'logouttext'                 => "'''Akana san avryal i {{SITENAME}}.'''
+'logouttext' => "'''Akana san avryal i {{SITENAME}}.'''
 
 Shai te labyares {{SITENAME}} sar ekh bijanglo jeno vai shai te prinjares tut palem sar o jeno le kadale navesa vai le aver navesa.",
-'welcomecreation'            => '== Mishto avilyan, $1! ==
+'welcomecreation' => '== Mishto avilyan, $1! ==
 
 Akana si tuke ekh akont. Te na bistares te paruves, kana trebul tuke, tire kamimata kai {{SITENAME}}.',
-'yourname'                   => 'Tiro anav',
-'yourpassword'               => 'O nakhavipnasko lav',
-'yourpasswordagain'          => 'O nakhavipnasko lav de nevo',
-'externaldberror'            => 'Sas ekh dosh kai datengi baza le avrutne prinjaripnyange vai nai tuke drom te akanutnisares o avrutno akonto.',
-'login'                      => 'Prinjaripen',
-'loginprompt'                => "Trebul te das drom le phandimatenge ''cookie'' te das andre kai {{SITENAME}}.",
-'userlogin'                  => 'Prinjaripen / Ker ek akount',
-'logout'                     => 'De avri',
-'userlogout'                 => 'De avri',
-'nologinlink'                => 'Ker ek akount',
-'createaccount'              => 'Ker ek nevo akount',
-'gotaccount'                 => "Si tuke akana ekh akonto? '''$1'''.",
-'gotaccountlink'             => 'De andre',
-'createaccountmail'          => 'palal o e-mail',
-'badretype'                  => 'Le nakhavipnaske lava so lekhavdyan nai myazutne.',
-'loginerror'                 => 'Prinjaripnaski dosh',
-'nocookiesnew'               => "O tiro akont sas kerdo, pale tu nai prinjardo/i. {{SITENAME}} labyarel ''cookies'' te astarel le manusha prinjarde. O tiro browser na astarel le cookies. Si mishto te das les drom te astarel le ''cookies'' thai, palal kodya, te zumaves vi ekh var, labyarindoi o nav thai o nakhavipnaso lav.",
-'nocookieslogin'             => "{{SITENAME}} labyarel ''cookies'' te prinjaren le manusha so aven kathe. O tiro browser chi astarel len. Si mishto te das les drom te astarel le ''cookies'' thai, palal kodya, te zumaves vi ekh var.",
-'loginsuccesstitle'          => 'Prinjaripen kerdo',
-'loginsuccess'               => 'Akana san prijardo kai {{SITENAME}} sar "$1".',
-'wrongpassword'              => 'O nakhavipnasko lav so thovdyan si doshalo. Mangas tuke te zumaves vi ekvar.',
-'mailmypassword'             => 'Bichhal ma o nakhavipnasko lav e-mail-estar!',
-'passwordremindertitle'      => 'Astaripen le tire nakhavipnaske lavesko kai {{SITENAME}}',
-'passwordremindertext'       => 'Varekon (shai te aves tu, katar i adresa $1)
+'yourname' => 'Tiro anav',
+'yourpassword' => 'O nakhavipnasko lav',
+'yourpasswordagain' => 'O nakhavipnasko lav de nevo',
+'externaldberror' => 'Sas ekh dosh kai datengi baza le avrutne prinjaripnyange vai nai tuke drom te akanutnisares o avrutno akonto.',
+'login' => 'Prinjaripen',
+'loginprompt' => "Trebul te das drom le phandimatenge ''cookie'' te das andre kai {{SITENAME}}.",
+'userlogin' => 'Prinjaripen / Ker ek akount',
+'logout' => 'De avri',
+'userlogout' => 'De avri',
+'nologinlink' => 'Ker ek akount',
+'createaccount' => 'Ker ek nevo akount',
+'gotaccount' => "Si tuke akana ekh akonto? '''$1'''.",
+'gotaccountlink' => 'De andre',
+'createaccountmail' => 'palal o e-mail',
+'badretype' => 'Le nakhavipnaske lava so lekhavdyan nai myazutne.',
+'loginerror' => 'Prinjaripnaski dosh',
+'nocookiesnew' => "O tiro akont sas kerdo, pale tu nai prinjardo/i. {{SITENAME}} labyarel ''cookies'' te astarel le manusha prinjarde. O tiro browser na astarel le cookies. Si mishto te das les drom te astarel le ''cookies'' thai, palal kodya, te zumaves vi ekh var, labyarindoi o nav thai o nakhavipnaso lav.",
+'nocookieslogin' => "{{SITENAME}} labyarel ''cookies'' te prinjaren le manusha so aven kathe. O tiro browser chi astarel len. Si mishto te das les drom te astarel le ''cookies'' thai, palal kodya, te zumaves vi ekh var.",
+'loginsuccesstitle' => 'Prinjaripen kerdo',
+'loginsuccess' => 'Akana san prijardo kai {{SITENAME}} sar "$1".',
+'wrongpassword' => 'O nakhavipnasko lav so thovdyan si doshalo. Mangas tuke te zumaves vi ekvar.',
+'mailmypassword' => 'Bichhal ma o nakhavipnasko lav e-mail-estar!',
+'passwordremindertitle' => 'Astaripen le tire nakhavipnaske lavesko kai {{SITENAME}}',
+'passwordremindertext' => 'Varekon (shai te aves tu, katar i adresa $1)
 manglyas ek nevo nakahvipnasko lav katar {{SITENAME}}.
 O nakhavipnasko lav le jenesko "$2" akana si "$3".
 Mishto si te jas kai {{SITENAME}} thai te paruves tiro lav sigo.',
-'noemail'                    => 'Nai ni ekh adresa e-mail prinjarde le jeneske "$1".',
-'eauthentsent'               => 'Ekh prinjaripnasko e-mail bichhaldo kai tiri e-maileski adresa. Kashte avel tuke e-mailuya le avre jenendar trebul te prinjares tiri adresa (dikh buteder ando bichhaldo e-mail).',
-'mailerror'                  => 'Dosh kana sas bichhaldo o e-mail: $1',
+'noemail' => 'Nai ni ekh adresa e-mail prinjarde le jeneske "$1".',
+'eauthentsent' => 'Ekh prinjaripnasko e-mail bichhaldo kai tiri e-maileski adresa. Kashte avel tuke e-mailuya le avre jenendar trebul te prinjares tiri adresa (dikh buteder ando bichhaldo e-mail).',
+'mailerror' => 'Dosh kana sas bichhaldo o e-mail: $1',
 'acct_creation_throttle_hit' => 'Fal ame nasul, akana si tut $1 akounturya. Nashti te keres aver.',
-'emailauthenticated'         => 'Tiro e-mail sas prinjardo kai $1.',
-'emailnotauthenticated'      => 'Tiri e-maileski adresa <strong>nas prinjardi ji akana</strong>. Ni ekh e-mail nashti te avel tuke ji kana prinjares la.',
-'noemailprefs'               => 'Thov ekh adresa e-mail te keren buti le kadale labne.',
-'emailconfirmlink'           => 'Prinjar o e-mail',
-'invalidemailaddress'        => 'Le e-maileski adresa nas lino anda kodoya ke nas lake ekh lachhi forma. Si mishto te thos ekh e-mail le lachhe formasa vai te khoses so lekhvdyas pe kodo than.',
-'accountcreated'             => 'Akount kerdo',
-'accountcreatedtext'         => 'Kerdo o akonto le jenesko ko $1.',
+'emailauthenticated' => 'Tiro e-mail sas prinjardo kai $1.',
+'emailnotauthenticated' => 'Tiri e-maileski adresa <strong>nas prinjardi ji akana</strong>. Ni ekh e-mail nashti te avel tuke ji kana prinjares la.',
+'noemailprefs' => 'Thov ekh adresa e-mail te keren buti le kadale labne.',
+'emailconfirmlink' => 'Prinjar o e-mail',
+'invalidemailaddress' => 'Le e-maileski adresa nas lino anda kodoya ke nas lake ekh lachhi forma. Si mishto te thos ekh e-mail le lachhe formasa vai te khoses so lekhvdyas pe kodo than.',
+'accountcreated' => 'Akount kerdo',
+'accountcreatedtext' => 'Kerdo o akonto le jenesko ko $1.',
 
 # Change password dialog
 'oldpassword' => 'Purano nakahvipnasko lav',
@@ -219,36 +219,36 @@ Mishto si te jas kai {{SITENAME}} thai te paruves tiro lav sigo.',
 'image_sample' => 'Misal.jpg',
 
 # Edit pages
-'summary'           => 'Xarno xalyaripen:',
-'minoredit'         => 'Kadava si ek tikno editisarimos',
-'watchthis'         => 'Dikh kadaya patrin',
-'savearticle'       => 'Uxtav i patrin',
-'showpreview'       => 'Dikh sar avelas i patrin',
-'showlivepreview'   => 'Jivutno angledikhipen',
-'showdiff'          => 'Dikh le paruvimata',
+'summary' => 'Xarno xalyaripen:',
+'minoredit' => 'Kadava si ek tikno editisarimos',
+'watchthis' => 'Dikh kadaya patrin',
+'savearticle' => 'Uxtav i patrin',
+'showpreview' => 'Dikh sar avelas i patrin',
+'showlivepreview' => 'Jivutno angledikhipen',
+'showdiff' => 'Dikh le paruvimata',
 'whitelistedittext' => 'Trebul te [[Special:UserLogin|autentifikisares]] kashte editisares artikolurya.',
-'accmailtitle'      => 'O nakhavipnasko lav bićhaldo.',
-'accmailtext'       => "O nakhavipnasko lav andar '$1' bićhaldo ko $2.",
-'newarticle'        => '(Nevo)',
-'newarticletext'    => 'Avilyan kai ek patrin so na si.
+'accmailtitle' => 'O nakhavipnasko lav bićhaldo.',
+'accmailtext' => "O nakhavipnasko lav andar '$1' bićhaldo ko $2.",
+'newarticle' => '(Nevo)',
+'newarticletext' => 'Avilyan kai ek patrin so na si.
 Te keres la, shai te shirdes (astares) te lekhaves ando telutno moxton (dikh [[{{MediaWiki:Helppage}}|zhutipnaski patrin]] te janes buteder).
 Kana avilyan kathe doshatar, ja palpale.',
-'noarticletext'     => "Andi '''{{SITENAME}}''' nai ji akana ek lekh kadale anavesa.
+'noarticletext' => "Andi '''{{SITENAME}}''' nai ji akana ek lekh kadale anavesa.
 * Te shirdes (astares) te keres o lekh, ker klik  '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} kathe]'''.",
-'editing'           => 'Editisaripen $1',
-'yourtext'          => 'Tiro teksto',
-'storedversion'     => 'Akanutni versiya',
-'yourdiff'          => 'Ververimata',
+'editing' => 'Editisaripen $1',
+'yourtext' => 'Tiro teksto',
+'storedversion' => 'Akanutni versiya',
+'yourdiff' => 'Ververimata',
 
 # History pages
 'previousrevision' => '← Purano paruvipen',
-'nextrevision'     => 'Nevi paruvipen →',
-'cur'              => 'akanutni',
-'last'             => 'purani',
-'histlegend'       => 'Xalyaripen: (akanutni) = ververimata mamui i akanutni versiya,
+'nextrevision' => 'Nevi paruvipen →',
+'cur' => 'akanutni',
+'last' => 'purani',
+'histlegend' => 'Xalyaripen: (akanutni) = ververimata mamui i akanutni versiya,
 (purani) = ververimata mamui i puraneder versiya, T = tikno editisaripen',
-'histfirst'        => 'O mai purano',
-'histlast'         => 'O mai nevo',
+'histfirst' => 'O mai purano',
+'histlast' => 'O mai nevo',
 
 # Revision deletion
 'revdelete-submit' => 'Ker kadya le alosarde paruvimatenge',
@@ -257,97 +257,97 @@ Kana avilyan kathe doshatar, ja palpale.',
 'compareselectedversions' => 'Dikh ververimata mashkar alosarde versiye',
 
 # Search results
-'prevn'             => 'mai neve {{PLURAL:$1|$1}}',
-'nextn'             => 'mai purane {{PLURAL:$1|$1}}',
-'viewprevnext'      => 'Dikh ($1 {{int:pipe-separator}} $2) ($3).',
-'searchhelp-url'    => 'Help:Zhutipen',
-'showingresults'    => 'Tele si <b>$1</b> rezultaturya shirdindoi le ginestar <b>$2</b>.',
+'prevn' => 'mai neve {{PLURAL:$1|$1}}',
+'nextn' => 'mai purane {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Dikh ($1 {{int:pipe-separator}} $2) ($3).',
+'searchhelp-url' => 'Help:Zhutipen',
+'showingresults' => 'Tele si <b>$1</b> rezultaturya shirdindoi le ginestar <b>$2</b>.',
 'showingresultsnum' => 'Tele si <b>$3</b> rezultaturya shirdindoi le ginestar <b>$2</b>.',
-'powersearch'       => 'Rod',
+'powersearch' => 'Rod',
 
 # Preferences page
-'preferences'    => 'Kamimata',
+'preferences' => 'Kamimata',
 'changepassword' => 'Paruv o nakhavipnasko lav',
-'prefs-skin'     => 'Dikhimos',
-'datedefault'    => 'Ni ekh kamipen',
+'prefs-skin' => 'Dikhimos',
+'datedefault' => 'Ni ekh kamipen',
 'prefs-datetime' => 'Dives thai chaso',
-'prefs-rc'       => 'Neve paruvimata',
-'saveprefs'      => 'Uxtav le kamimata',
-'resetprefs'     => 'Thov le kamimata sar ko shirdipen',
-'columns'        => 'Uche vortorina:',
-'localtime'      => 'Thanutno vaxt',
+'prefs-rc' => 'Neve paruvimata',
+'saveprefs' => 'Uxtav le kamimata',
+'resetprefs' => 'Thov le kamimata sar ko shirdipen',
+'columns' => 'Uche vortorina:',
+'localtime' => 'Thanutno vaxt',
 'timezoneoffset' => 'Ververipen',
-'guesstimezone'  => 'Le les katar o browser',
-'allowemail'     => 'De drom te aven e-mailurya katar aver jene',
-'defaultns'      => 'Rod savaxt vi kai kadale riga:',
-'default'        => 'acharuno',
-'prefs-files'    => 'Failurya',
-'youremail'      => 'Emailesko adress (kana kames)*',
-'yourrealname'   => 'Tiro chacho anav*',
-'yourlanguage'   => 'Ćhib:',
-'yournick'       => 'I xarni versyunya, le semnaturenge',
-'badsig'         => 'Bilachhi semnatura; dikh le tagurya HTML.',
+'guesstimezone' => 'Le les katar o browser',
+'allowemail' => 'De drom te aven e-mailurya katar aver jene',
+'defaultns' => 'Rod savaxt vi kai kadale riga:',
+'default' => 'acharuno',
+'prefs-files' => 'Failurya',
+'youremail' => 'Emailesko adress (kana kames)*',
+'yourrealname' => 'Tiro chacho anav*',
+'yourlanguage' => 'Ćhib:',
+'yournick' => 'I xarni versyunya, le semnaturenge',
+'badsig' => 'Bilachhi semnatura; dikh le tagurya HTML.',
 
 # User rights
 'editinguser' => "Editisaripen '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
 
 # Groups
-'group'            => 'Grupo:',
-'group-bot'        => 'Boturya',
-'group-sysop'      => 'Administratorurya',
+'group' => 'Grupo:',
+'group-bot' => 'Boturya',
+'group-sysop' => 'Administratorurya',
 'group-bureaucrat' => 'Birokraturya:',
-'group-all'        => '(sa)',
+'group-all' => '(sa)',
 
-'group-sysop-member'      => 'Administratoro',
+'group-sysop-member' => 'Administratoro',
 'group-bureaucrat-member' => 'Birokrato',
 
-'grouppage-bot'        => '{{ns:project}}:Boturya',
-'grouppage-sysop'      => '{{ns:project}}:Administratorurya',
+'grouppage-bot' => '{{ns:project}}:Boturya',
+'grouppage-sysop' => '{{ns:project}}:Administratorurya',
 'grouppage-bureaucrat' => '{{ns:project}}:Birokraturya',
 
 # Recent changes
-'recentchanges'                     => 'Neve paruvimata',
-'recentchangestext'                 => 'Andi kadaya patrin shai te dikhes le neve paruvimata andi romani {{SITENAME}}.',
-'rcnote'                            => 'Tele si le palutne <strong>$1</strong> paruvimata andar le palutne <strong>$2</strong> divesa.',
-'rcnotefrom'                        => "Tele si le averutnimata katar '''$2''' (inklen '''$1''' averutnimata, shai te paruves o gin alosarindoi aver tele).",
-'rclistfrom'                        => 'Dikh le paruvimata ji kai $1',
-'rcshowhideminor'                   => '$1 tikne editisaripena',
-'rcshowhidebots'                    => '$1 (ro)boturya',
-'rcshowhideliu'                     => '$1 prinjarde jene',
-'rcshowhideanons'                   => '$1 bijangle jene',
-'rcshowhidepatr'                    => '$1 dikhle paruvimata',
-'rcshowhidemine'                    => '$1 mire editisaripena',
-'rclinks'                           => 'Dikh le palutne $1 paruvimata andar le palutne $2 divesa.<br />$3',
-'diff'                              => 'ververipen',
-'hist'                              => 'puranipen',
-'hide'                              => 'garav',
-'show'                              => 'dikh',
-'minoreditletter'                   => 't',
+'recentchanges' => 'Neve paruvimata',
+'recentchanges-summary' => 'Andi kadaya patrin shai te dikhes le neve paruvimata andi romani {{SITENAME}}.',
+'rcnote' => 'Tele si le palutne <strong>$1</strong> paruvimata andar le palutne <strong>$2</strong> divesa.',
+'rcnotefrom' => "Tele si le averutnimata katar '''$2''' (inklen '''$1''' averutnimata, shai te paruves o gin alosarindoi aver tele).",
+'rclistfrom' => 'Dikh le paruvimata ji kai $1',
+'rcshowhideminor' => '$1 tikne editisaripena',
+'rcshowhidebots' => '$1 (ro)boturya',
+'rcshowhideliu' => '$1 prinjarde jene',
+'rcshowhideanons' => '$1 bijangle jene',
+'rcshowhidepatr' => '$1 dikhle paruvimata',
+'rcshowhidemine' => '$1 mire editisaripena',
+'rclinks' => 'Dikh le palutne $1 paruvimata andar le palutne $2 divesa.<br />$3',
+'diff' => 'ververipen',
+'hist' => 'puranipen',
+'hide' => 'garav',
+'show' => 'dikh',
+'minoreditletter' => 't',
 'number_of_watching_users_pageview' => '[$1 jeno/e kon len vurma e patrinyaki]',
-'rc_categories'                     => 'Numa le shopnya (rigyarde katar "|")',
-'rc_categories_any'                 => 'Savegodi',
+'rc_categories' => 'Numa le shopnya (rigyarde katar "|")',
+'rc_categories_any' => 'Savegodi',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Pashvipnaske paruvimata',
-'recentchangeslinked-feed'    => 'Pashvipnaske paruvimata',
+'recentchangeslinked' => 'Pashvipnaske paruvimata',
+'recentchangeslinked-feed' => 'Pashvipnaske paruvimata',
 'recentchangeslinked-toolbox' => 'Pashvipnaske paruvimata',
 
 # Upload
-'upload'      => 'Bichhal file',
-'uploadbtn'   => 'Bichhal file',
-'filedesc'    => 'Xarno xalyaripen',
+'upload' => 'Bichhal file',
+'uploadbtn' => 'Bichhal file',
+'filedesc' => 'Xarno xalyaripen',
 'badfilename' => 'O chitrosko anav sas paruvdo; o nevo anav si "$1".',
-'savefile'    => 'Uxtav file',
+'savefile' => 'Uxtav file',
 
 # Special:ListFiles
 'listfiles' => 'Patrinipen le chitrengo',
 
 # File description page
 'file-anchor-link' => 'Chitro',
-'imagelinks'       => 'Chitroske phandimata',
+'imagelinks' => 'Chitroske phandimata',
 
 # Unused templates
-'unusedtemplates'    => 'Bilabyarde sikavne',
+'unusedtemplates' => 'Bilabyarde sikavne',
 'unusedtemplateswlh' => 'aver phandimata',
 
 # Random page
@@ -357,173 +357,173 @@ Kana avilyan kathe doshatar, ja palpale.',
 'statistics' => 'Beshimata',
 
 # Miscellaneous special pages
-'wantedpages'  => 'Kamle pajine',
-'shortpages'   => 'Xarne patrya',
+'wantedpages' => 'Kamle pajine',
+'shortpages' => 'Xarne patrya',
 'deadendpages' => 'Biphandimatenge patrya',
-'listusers'    => 'Jenengo patrinipen',
-'newpages'     => 'Neve patrya',
+'listusers' => 'Jenengo patrinipen',
+'newpages' => 'Neve patrya',
 'ancientpages' => 'E puraneder lekha',
-'move'         => 'Ingerdipen',
+'move' => 'Ingerdipen',
 
 # Special:AllPages
-'allpages'       => 'Savore patrya',
-'nextpage'       => 'Anglutni patrin ($1)',
-'allarticles'    => 'Sa le artikolurya',
+'allpages' => 'Savore patrya',
+'nextpage' => 'Anglutni patrin ($1)',
+'allarticles' => 'Sa le artikolurya',
 'allpagessubmit' => 'Ja',
 
 # E-mail user
 'emailuser' => 'Bichhal les/la e-mail',
 'emailfrom' => 'Katar',
-'emailto'   => 'Karing',
+'emailto' => 'Karing',
 'emailsend' => 'Bichhal',
 
 # Watchlist
-'watchlist'        => 'Dikhipnaske lekha',
-'mywatchlist'      => 'Dikhipnaske lekha',
-'addedwatchtext'   => 'I patrin "[[:$1]]" sas thovdi andi tiri lista [[Special:Watchlist|le artikolengi so dikhes len]].
+'watchlist' => 'Dikhipnaske lekha',
+'mywatchlist' => 'Dikhipnaske lekha',
+'addedwatchtext' => 'I patrin "[[:$1]]" sas thovdi andi tiri lista [[Special:Watchlist|le artikolengi so dikhes len]].
 Le neve paruvimata andar kadale patrya thai andar lenge vakyarimatenge patrya thona kathe, vi dikhena pen le <b>thule semnurenca</b> andi patrin le [[Special:RecentChanges|neve paruvimatenge]].
 
 Kana kamesa te khoses kadaya patrin andar tiri lista le patryange so arakhes len ker click kai "Na mai arakh" (opre, kana i patrin dikhel pes).',
 'removedwatchtext' => 'I patrin "[[:$1]]" sas khosli katar o patrinipen le dikhipnaske lekhenca (artikolurya).',
-'watch'            => 'Dikh la',
-'unwatch'          => 'Na mai dikh',
-'unwatchthispage'  => 'Na mai dikh',
-'wlnote'           => 'Tele si le palutne $1 paruvimata ande palutne <b>$2</b> ore.',
+'watch' => 'Dikh la',
+'unwatch' => 'Na mai dikh',
+'unwatchthispage' => 'Na mai dikh',
+'wlnote' => 'Tele si le palutne $1 paruvimata ande palutne <b>$2</b> ore.',
 
-'enotif_reset'       => 'Thov semno kai patrya so dikhlem',
+'enotif_reset' => 'Thov semno kai patrya so dikhlem',
 'enotif_newpagetext' => 'Kadaya si ek nevi patrin.',
 
 # Delete
-'deletepage'      => 'Khos i patrin',
-'confirm'         => 'Ja',
-'excontent'       => "o ander sas: '$1'",
+'deletepage' => 'Khos i patrin',
+'confirm' => 'Ja',
+'excontent' => "o ander sas: '$1'",
 'excontentauthor' => "o ander sas: '$1' (thai o korkoro butyarno sas '$2')",
-'exblank'         => 'i patrin sas chuchi',
-'historywarning'  => 'Dikh! La patrya so kames to khoses la si la puranipen:',
-'actioncomplete'  => 'Agorisardi buti',
-'deletedtext'     => '"$1" sas khosli.
+'exblank' => 'i patrin sas chuchi',
+'historywarning' => 'Dikh! La patrya so kames to khoses la si la puranipen:',
+'actioncomplete' => 'Agorisardi buti',
+'deletedtext' => '"$1" sas khosli.
 Dikh ando $2 ek patrinipen le palutne butyange khosle.',
 
 # Rollback
 'rollback_short' => 'Palemavilipen',
-'rollbacklink'   => 'palemavilipen',
+'rollbacklink' => 'palemavilipen',
 'rollbackfailed' => 'O palemavilipen nashtisardyas te kerel pes.',
 
 # Protect
 'prot_1movedto2' => '[[$1]] bichhaldo kai [[$2]]',
 
 # Undelete
-'undelete'      => 'Dikh le khosle patrya',
-'undeletebtn'   => 'Le palpale',
+'undelete' => 'Dikh le khosle patrya',
+'undeletebtn' => 'Le palpale',
 'undeletereset' => 'Khos le paruvimata',
 
 # Namespace form on various pages
 'namespace' => 'Rig:',
-'invert'    => 'Bi rigyako:',
+'invert' => 'Bi rigyako:',
 
 # Contributions
 'contributions' => 'Jeneske butya',
-'mycontris'     => 'Mire butya',
-'contribsub2'   => 'Katar $1 ($2)',
-'uctop'         => '(opre)',
+'mycontris' => 'Mire butya',
+'contribsub2' => 'Katar $1 ($2)',
+'uctop' => '(opre)',
 
 # What links here
 'whatlinkshere' => 'So phandel pes kathe',
-'nolinkshere'   => 'Ni ek patrin phandel pes (avel) kathe.',
+'nolinkshere' => 'Ni ek patrin phandel pes (avel) kathe.',
 
 # Block/unblock
-'blockip'      => 'De avri jenes/IP',
-'ipbsubmit'    => 'De avri kadava jenes',
-'ipusubmit'    => 'Na mai brakh i adresa',
+'blockip' => 'De avri jenes/IP',
+'ipbsubmit' => 'De avri kadava jenes',
+'ipusubmit' => 'Na mai brakh i adresa',
 'contribslink' => 'butya',
 
 # Developer tools
-'lockbtn'   => 'Brakh i database',
+'lockbtn' => 'Brakh i database',
 'unlockbtn' => 'Na mai brakh i database',
 
 # Move page
-'movearticle'     => 'Inger i patrin',
-'movepagebtn'     => 'Inger i patrin',
-'pagemovedsub'    => 'I patrin sas bićhaldi.',
-'movedto'         => 'ingerdi kai',
+'movearticle' => 'Inger i patrin',
+'movepagebtn' => 'Inger i patrin',
+'pagemovedsub' => 'I patrin sas bićhaldi.',
+'movedto' => 'ingerdi kai',
 'delete_and_move' => 'Khos thai inger',
 
 # Export
 'export-submit' => 'Bichhal avri',
 
 # Namespace 8 related
-'allmessages'     => 'Sistemoske duma',
+'allmessages' => 'Sistemoske duma',
 'allmessagesname' => 'Anav',
 
 # Special:Import
 'import-interwiki-submit' => 'Le andre',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'           => 'Miri labyarneski pajina',
-'tooltip-pt-anonuserpage'       => 'Miri labyarneski pajina ki akanutni IP adress',
-'tooltip-pt-mytalk'             => 'Miri diskuciyaki pajina',
-'tooltip-pt-anontalk'           => 'Diskucie le editisarimatenge ki akanutni IP adress',
-'tooltip-pt-preferences'        => 'Sar kamav te dikhel pes miri pajina',
-'tooltip-pt-watchlist'          => 'I lista le pajinenge so dikhav lendar (monitorizav).',
-'tooltip-pt-mycontris'          => 'Le mire editisarimata',
-'tooltip-pt-login'              => 'Mishto si te identifikares tut, pale na si musai.',
-'tooltip-pt-anonlogin'          => 'Mishto si te identifikares tut, pale na si musai.',
-'tooltip-pt-logout'             => 'Kathe aćhaves i sesiyunya',
-'tooltip-ca-talk'               => 'Diskuciya le artikoleske',
-'tooltip-ca-edit'               => 'Shai te editisares kadaya pajina. Mangas te paledikhes o teksto anglal te uxtaves les.',
-'tooltip-ca-addsection'         => 'Kathe shai te thos ek komentaryo ki kadaya diskuciya.',
-'tooltip-ca-viewsource'         => 'Kadaya pajina si brakhli. Shai numa te dikhes o source-code.',
-'tooltip-ca-history'            => 'Purane versiune le dokumenteske.',
-'tooltip-ca-protect'            => 'Brakh kadava dokumento.',
-'tooltip-ca-delete'             => 'Khos kadava dokumento.',
-'tooltip-ca-undelete'           => 'Palemthav le editisarimata kerdine le kadale dokumenteske sar sas anglal lesko khosipen.',
-'tooltip-ca-move'               => 'Trade kadava dokumento.',
-'tooltip-ca-watch'              => 'Thav kadava dokumento andi monitorizaripnaski lista.',
-'tooltip-ca-unwatch'            => 'Khos kadava dokumento andar i monitorizaripnaski lista.',
-'tooltip-search'                => 'Rod andi kadaya Wiki',
-'tooltip-p-logo'                => 'I sherutni pajina',
-'tooltip-n-mainpage'            => 'Dikh i sherutni pajina',
-'tooltip-n-portal'              => 'O proyekto, so shai te keres, kai arakhes solucie.',
-'tooltip-n-currentevents'       => 'Arakh janglimata le akanutne evenimenturenge',
-'tooltip-n-recentchanges'       => 'I lista le neve paruvimatenge kerdini andi kadaya wiki.',
-'tooltip-n-randompage'          => 'Ja ki ek aleatori pajina',
-'tooltip-n-help'                => 'O than kai arakhes zhutipen.',
-'tooltip-t-whatlinkshere'       => 'I lista sa le wiki pajinenge so aven (si phande) vi kathe',
+'tooltip-pt-userpage' => 'Miri labyarneski pajina',
+'tooltip-pt-anonuserpage' => 'Miri labyarneski pajina ki akanutni IP adress',
+'tooltip-pt-mytalk' => 'Miri diskuciyaki pajina',
+'tooltip-pt-anontalk' => 'Diskucie le editisarimatenge ki akanutni IP adress',
+'tooltip-pt-preferences' => 'Sar kamav te dikhel pes miri pajina',
+'tooltip-pt-watchlist' => 'I lista le pajinenge so dikhav lendar (monitorizav).',
+'tooltip-pt-mycontris' => 'Le mire editisarimata',
+'tooltip-pt-login' => 'Mishto si te identifikares tut, pale na si musai.',
+'tooltip-pt-anonlogin' => 'Mishto si te identifikares tut, pale na si musai.',
+'tooltip-pt-logout' => 'Kathe aćhaves i sesiyunya',
+'tooltip-ca-talk' => 'Diskuciya le artikoleske',
+'tooltip-ca-edit' => 'Shai te editisares kadaya pajina. Mangas te paledikhes o teksto anglal te uxtaves les.',
+'tooltip-ca-addsection' => 'Kathe shai te thos ek komentaryo ki kadaya diskuciya.',
+'tooltip-ca-viewsource' => 'Kadaya pajina si brakhli. Shai numa te dikhes o source-code.',
+'tooltip-ca-history' => 'Purane versiune le dokumenteske.',
+'tooltip-ca-protect' => 'Brakh kadava dokumento.',
+'tooltip-ca-delete' => 'Khos kadava dokumento.',
+'tooltip-ca-undelete' => 'Palemthav le editisarimata kerdine le kadale dokumenteske sar sas anglal lesko khosipen.',
+'tooltip-ca-move' => 'Trade kadava dokumento.',
+'tooltip-ca-watch' => 'Thav kadava dokumento andi monitorizaripnaski lista.',
+'tooltip-ca-unwatch' => 'Khos kadava dokumento andar i monitorizaripnaski lista.',
+'tooltip-search' => 'Rod andi kadaya Wiki',
+'tooltip-p-logo' => 'I sherutni pajina',
+'tooltip-n-mainpage' => 'Dikh i sherutni pajina',
+'tooltip-n-portal' => 'O proyekto, so shai te keres, kai arakhes solucie.',
+'tooltip-n-currentevents' => 'Arakh janglimata le akanutne evenimenturenge',
+'tooltip-n-recentchanges' => 'I lista le neve paruvimatenge kerdini andi kadaya wiki.',
+'tooltip-n-randompage' => 'Ja ki ek aleatori pajina',
+'tooltip-n-help' => 'O than kai arakhes zhutipen.',
+'tooltip-t-whatlinkshere' => 'I lista sa le wiki pajinenge so aven (si phande) vi kathe',
 'tooltip-t-recentchangeslinked' => 'Neve paruvimata andi kadaya pajina',
-'tooltip-feed-rss'              => 'Kathe te pravares o RSS flukso le kadale pajinyako',
-'tooltip-feed-atom'             => 'Kathe te pravares o Atom flukso le kadale pajinyako',
-'tooltip-t-contributions'       => 'Dikh i lista le editisarimatenge le kadale labyaresko',
-'tooltip-t-emailuser'           => 'Bićhal ek emailo le kadale labyareske',
-'tooltip-t-upload'              => 'Bićhal imajine vai media files',
-'tooltip-t-specialpages'        => 'I lista sa le spechiale pajinengi',
-'tooltip-ca-nstab-main'         => 'Dikh o artikolo',
-'tooltip-ca-nstab-user'         => 'Dikh i labyarengi pajina',
-'tooltip-ca-nstab-media'        => 'Dikh i pajina media',
-'tooltip-ca-nstab-special'      => 'Kadaya si ek spechiali pajina, nashti te editisares la.',
-'tooltip-ca-nstab-project'      => 'Dikh i pajina le proyekteski',
-'tooltip-ca-nstab-image'        => 'Dikh i imajinyaki pajina',
-'tooltip-ca-nstab-mediawiki'    => 'Dikh o mesajo le sistemesko',
-'tooltip-ca-nstab-template'     => 'Dikh o formato',
-'tooltip-ca-nstab-help'         => 'Dikh i zhutipnaski pajina',
-'tooltip-ca-nstab-category'     => 'Dikh i kategoriya',
+'tooltip-feed-rss' => 'Kathe te pravares o RSS flukso le kadale pajinyako',
+'tooltip-feed-atom' => 'Kathe te pravares o Atom flukso le kadale pajinyako',
+'tooltip-t-contributions' => 'Dikh i lista le editisarimatenge le kadale labyaresko',
+'tooltip-t-emailuser' => 'Bićhal ek emailo le kadale labyareske',
+'tooltip-t-upload' => 'Bićhal imajine vai media files',
+'tooltip-t-specialpages' => 'I lista sa le spechiale pajinengi',
+'tooltip-ca-nstab-main' => 'Dikh o artikolo',
+'tooltip-ca-nstab-user' => 'Dikh i labyarengi pajina',
+'tooltip-ca-nstab-media' => 'Dikh i pajina media',
+'tooltip-ca-nstab-special' => 'Kadaya si ek spechiali pajina, nashti te editisares la.',
+'tooltip-ca-nstab-project' => 'Dikh i pajina le proyekteski',
+'tooltip-ca-nstab-image' => 'Dikh i imajinyaki pajina',
+'tooltip-ca-nstab-mediawiki' => 'Dikh o mesajo le sistemesko',
+'tooltip-ca-nstab-template' => 'Dikh o formato',
+'tooltip-ca-nstab-help' => 'Dikh i zhutipnaski pajina',
+'tooltip-ca-nstab-category' => 'Dikh i kategoriya',
 
 # Attribution
-'anonymous'        => 'Bijangle labyarne kai {{SITENAME}}',
-'siteuser'         => 'Jeno kai {{SITENAME}} $1',
+'anonymous' => 'Bijangle labyarne kai {{SITENAME}}',
+'siteuser' => 'Jeno kai {{SITENAME}} $1',
 'lastmodifiedatby' => 'Kadaya patrin sas paruvdi agoreste $2, $1 katar $3.',
-'others'           => 'aver',
-'siteusers'        => 'Jeno/e kai {{SITENAME}} $1',
+'others' => 'aver',
+'siteusers' => 'Jeno/e kai {{SITENAME}} $1',
 
 # Image deletion
 'deletedrevision' => 'Khoslo o purano paruvipen $1',
 
 # Browsing diffs
 'previousdiff' => '← Purano ververipen',
-'nextdiff'     => 'Anglutno paruvipen →',
+'nextdiff' => 'Anglutno paruvipen →',
 
 # Special:NewFiles
 'showhidebots' => '($1 boturya)',
-'ilsubmit'     => 'Rod',
+'ilsubmit' => 'Rod',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'savore',
index 5b7afb9..afffc6b 100644 (file)
@@ -37,7 +37,6 @@ $magicWords = array(
        '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' ),
@@ -348,7 +347,7 @@ pe titlul secțiunii (JavaScript)',
 
 'underline-always' => 'Întotdeauna',
 'underline-never' => 'Niciodată',
-'underline-default' => 'Standardul navigatorului',
+'underline-default' => 'Standardul temei sau al navigatorului',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stilul fontului din zona de modificare:',
@@ -435,7 +434,7 @@ pe titlul secțiunii (JavaScript)',
 'newwindow' => '(se deschide într-o fereastră nouă)',
 'cancel' => 'Revocare',
 'moredotdotdot' => 'Mai mult…',
-'mypage' => 'Pagina mea',
+'mypage' => 'Pagină',
 'mytalk' => 'Discuții',
 'anontalk' => 'Discuția pentru această adresă IP',
 'navigation' => 'Navigare',
@@ -446,7 +445,6 @@ pe titlul secțiunii (JavaScript)',
 'qbbrowse' => 'Răsfoiește',
 'qbedit' => 'Modificare',
 'qbpageoptions' => 'Opțiuni ale paginii',
-'qbpageinfo' => 'Informații ale paginii',
 'qbmyoptions' => 'Paginile mele',
 'qbspecialpages' => 'Pagini speciale',
 'faq' => 'Întrebări frecvente',
@@ -459,7 +457,7 @@ pe titlul secțiunii (JavaScript)',
 'vector-action-protect' => 'Protejare',
 'vector-action-undelete' => 'Recuperare',
 'vector-action-unprotect' => 'Modificare protecție',
-'vector-simplesearch-preference' => 'Permite sugestii de căutare superioară (numai interfața Vector)',
+'vector-simplesearch-preference' => 'Activează bara de căutare simplificată (exclusiv pentru interfața Vector)',
 'vector-view-create' => 'Creare',
 'vector-view-edit' => 'Modificare',
 'vector-view-history' => 'Istoric',
@@ -469,6 +467,7 @@ pe titlul secțiunii (JavaScript)',
 'namespaces' => 'Spații de nume',
 'variants' => 'Variante',
 
+'navigation-heading' => 'Meniu de navigare',
 'errorpagetitle' => 'Eroare',
 'returnto' => 'Înapoi la $1.',
 'tagline' => 'De la {{SITENAME}}',
@@ -679,7 +678,7 @@ Interogarea: $2',
 'actionthrottled' => 'Acțiune limitată',
 'actionthrottledtext' => 'Ca o măsură anti-spam, aveți permisiuni limitate în a efectua această acțiune de prea multe ori într-o perioadă scurtă de timp, iar dv. tocmai ați depășit această limită.
 Vă rugăm să încercați din nou în câteva minute.',
-'protectedpagetext' => 'Această pagină este protejată împotriva modificărilor.',
+'protectedpagetext' => 'Această pagină este protejată împotriva modificărilor sau a altor acțiuni.',
 'viewsourcetext' => 'Se poate vizualiza și copia conținutul acestei pagini:',
 'viewyourtext' => "Se poate vizualiza și copia conținutul '''modificărilor dumneavoastră''' efectuate asupra acestei pagini:",
 'protectedinterface' => 'Această pagină asigură textul interfeței pentru software și este protejată pentru a preveni abuzurile.
@@ -712,11 +711,11 @@ Administratorul care a efectuat blocarea a furnizat explicația: „$3”.',
 # Login and logout pages
 'logouttext' => "'''Acum sunteți deconectat.'''
 
-Sesiunea dumneavoastră la {{SITENAME}} a fost închisă. Puteți continua să folosiți {{SITENAME}} ca utilizator anonim, sau puteți să vă [[Special:UserLogin|reautentificați]] ca același sau ca alt utilizator.
+Sesiunea dumneavoastră la {{SITENAME}} a fost închisă. Puteți continua să folosiți {{SITENAME}} ca utilizator anonim, sau puteți să vă <span class='plainlinks'>[$1 reautentificați]</span> ca același sau ca alt utilizator.
 Țineți minte că anumite pagini pot fi în continuare afișate ca și când ați fi autentificat până când curățați memoria cache a navigatorului.",
-'welcomecreation' => '==Bun venit, $1!==
-
-Contul dumneavoatră a fost creat. Nu uitați să vă personalizați [[Special:Preferences|preferințele]] în {{SITENAME}}.',
+'welcomeuser' => 'Bun venit, $1!',
+'welcomecreation-msg' => 'Contul dumneavoastră a fost creat.
+Nu uitați să vă modificați [[Special:Preferences|preferințele]] pentru {{SITENAME}}.',
 'yourname' => 'Nume de utilizator:',
 'yourpassword' => 'Parolă:',
 'yourpasswordagain' => 'Repetați parola:',
@@ -993,7 +992,7 @@ Paginile .css și .js specifice utilizatorilor au titluri care încep cu literă
 'note' => "'''Notă:'''",
 'previewnote' => "'''Țineți cont că aceasta este doar o previzualizare.'''
 Modificările dumneavoastră nu au fost încă salvate!",
-'continue-editing' => 'Continuare editare',
+'continue-editing' => 'Mergi la zona de editare',
 'previewconflict' => 'Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeți să-l salvați acum.',
 'session_fail_preview' => "'''Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.
 Vă rugăm să încercați din nou.
@@ -1066,7 +1065,7 @@ Puteți edita o pagină deja existentă sau puteți să vă [[Special:UserLogin|
 Asigurați-vă că este oportună recrearea acestei pagini.
 Jurnalul ștergerilor și al mutărilor pentru această pagină este disponibil:",
 'moveddeleted-notice' => 'Această pagină a fost ștearsă.
-Jurnalul ștergerilor și al mutărilor este disponibil mai jos.',
+Jurnalul ștergerilor și al redenumirilor este disponibil mai jos.',
 'log-fulllog' => 'Vezi tot jurnalul',
 'edit-hook-aborted' => 'Modificarea a fost abandonată din cauza unui hook.
 Nicio explicație furnizată.',
@@ -1077,6 +1076,15 @@ Se pare că a fost ștearsă.',
 'edit-already-exists' => 'Pagina nouă nu a putut fi creată.
 Ea există deja.',
 'defaultmessagetext' => 'Textul implicit',
+'content-failed-to-parse' => 'Nu s-a putut analiza conținutul de tip $2 pentru modelul $1: $3',
+'invalid-content-data' => 'Date de conținut invalide',
+'content-not-allowed-here' => 'Conținutul de tip „$1” nu este permis pe pagina [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'text simplu',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Atenție: Această pagină conține prea multe apelări costisitoare ale funcțiilor parser.
@@ -1176,7 +1184,7 @@ Ca administrator puteți vedea în continuare această diferență dinte versiun
 Ca administrator puteți vedea în continuare această diferență dinte versiuni; detalii puteți găsi în [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} jurnalul suprimărilor].",
 'rev-delundel' => 'șterge/recuperează',
 'rev-showdeleted' => 'arată',
-'revisiondelete' => 'Șterge/recuperează versiuni',
+'revisiondelete' => 'Ștergere/recuperare versiuni',
 'revdelete-nooldid-title' => 'Versiune invalidă',
 '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ă.',
@@ -1331,8 +1339,6 @@ Detalii se pot găsi în [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE
 'search-interwiki-caption' => 'Proiecte înrudite',
 'search-interwiki-default' => '$1 rezultate:',
 'search-interwiki-more' => '(mai mult)',
-'search-mwsuggest-enabled' => 'cu sugestii',
-'search-mwsuggest-disabled' => 'fără sugestii',
 'search-relatedarticle' => 'Relaționat',
 'mwsuggest-disable' => 'Dezactivează sugestiile AJAX',
 'searcheverything-enable' => 'Caută în toate spațiile de nume',
@@ -1491,15 +1497,15 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'userrights-lookup-user' => 'Administrare grupuri de utilizatori',
 'userrights-user-editname' => 'Introduceți un nume de utilizator:',
 'editusergroup' => 'Modificare grup de utilizatori',
-'editinguser' => "Modificare permisiuni de utilizator pentru '''[[User:$1|$1]]''' $2",
+'editinguser' => "Modificarea permisiunilor de utilizator pentru '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Modificare grup de utilizatori',
 'saveusergroups' => 'Salvează grupul de utilizatori',
 'userrights-groupsmember' => 'Membru al:',
 'userrights-groupsmember-auto' => 'Membru, implicit, al:',
 'userrights-groups-help' => 'Puteți schimba grupul căruia îi aparține utilizatorul:
-*Căsuța bifată înseamnă că utilizatorul este în acel grup.
-*Căsuța nebifată înseamnă că utilizatorul nu este în acel grup.
-*Steluța (*) indică faptul că utilizatorul nu poate fi eliminat din grup odată adăugat, sau invers',
+*Căsuța bifată înseamnă că utilizatorul aparține grupului respectiv.
+*Căsuța nebifată înseamnă că utilizatorul nu aparține grupului respectiv.
+*Steluța (*) indică faptul că utilizatorul nu poate fi eliminat din grup odată adăugat, sau invers.',
 'userrights-reason' => 'Motiv:',
 'userrights-no-interwiki' => 'Nu aveți permisiunea de a modifica permisiunile utilizatorilor pe alte wiki.',
 'userrights-nodatabase' => 'Baza de date $1 nu există sau nu este locală.',
@@ -1515,7 +1521,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'group-bot' => 'Roboți',
 'group-sysop' => 'Administratori',
 'group-bureaucrat' => 'Birocrați',
-'group-suppress' => 'Oversights',
+'group-suppress' => 'Supervizori',
 'group-all' => '(toți)',
 
 'group-user-member' => '{{GENDER:$1|utilizator|utilizatoare|utilizator}}',
@@ -1523,14 +1529,14 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'group-bot-member' => '{{GENDER:$1|robot}}',
 'group-sysop-member' => '{{GENDER:$1|administrator}}',
 'group-bureaucrat-member' => '{{GENDER:$1|birocrat}}',
-'group-suppress-member' => '{{GENDER:$1|supraveghetor}}',
+'group-suppress-member' => '{{GENDER:$1|supervizor}}',
 
 'grouppage-user' => '{{ns:project}}:Utilizatori',
 'grouppage-autoconfirmed' => '{{ns:project}}:Utilizator autoconfirmați',
 'grouppage-bot' => '{{ns:project}}:Boți',
 'grouppage-sysop' => '{{ns:project}}:Administratori',
 'grouppage-bureaucrat' => '{{ns:project}}:Birocrați',
-'grouppage-suppress' => '{{ns:project}}:Oversight',
+'grouppage-suppress' => '{{ns:project}}:Supervizori',
 
 # Rights
 'right-read' => 'Citește pagini',
@@ -1580,7 +1586,7 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'right-rollback' => 'Revocarea rapidă a modificărilor ultimului utilizator care a modificat o pagină particulară',
 'right-markbotedits' => 'Marchează revenirea ca modificare efectuată de robot',
 'right-noratelimit' => 'Neafectat de limitele raportului',
-'right-import' => 'Importă pagini de la alte wiki',
+'right-import' => 'Importă pagini de la alte wikiuri',
 'right-importupload' => 'Importă pagini dintr-o încărcare de fișier',
 'right-patrol' => 'Marchează modificările altora ca patrulate',
 'right-autopatrol' => 'Modificările proprii marcate ca patrulate',
@@ -1599,6 +1605,9 @@ Dacă decideți furnizarea sa, acesta va fi folosit pentru a vă atribui munca.'
 'rightslogtext' => 'Acest jurnal cuprinde modificările permisiunilor utilizatorilor.',
 'rightslogentry' => 'a schimbat permisiunile pentru $1 de la $2 la $3',
 'rightslogentry-autopromote' => 'a fost promovat în mod automat de la $2 la $3',
+'logentry-rights-rights' => '$1 a schimbat apartenența la grup pentru $3 de la $4 la $5',
+'logentry-rights-rights-legacy' => '$1 a schimbat apartenența la grup pentru $3',
+'logentry-rights-autopromote' => '$1 a fost promovat în mod automat de la $4 la $5',
 'rightsnone' => '(niciunul)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1828,6 +1837,7 @@ Dacă problema persistă, contactați un [[Special:ListUsers/sysop|administrator
 'backend-fail-notsame' => 'Un fișier diferit există deja pentru $1.',
 'backend-fail-invalidpath' => '$1 nu este o cale validă de stocare.',
 'backend-fail-delete' => 'Imposibil de șters fișierul $1.',
+'backend-fail-describe' => 'Imposibil de modificat metadatele pentru fișierul „$1”.',
 'backend-fail-alreadyexists' => 'Fișierul $1 există deja.',
 'backend-fail-store' => 'Imposibil de stocat fișierul $1 în $2.',
 'backend-fail-copy' => 'Imposibil de copiat fișierul $1 în $2.',
@@ -1979,7 +1989,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.',
+'upload-disallowed-here' => 'Nu puteți suprascrie acest fișier.',
 
 # File reversion
 'filerevert' => 'Revenire $1',
@@ -2144,7 +2154,7 @@ Intrările <del>tăiate</del> au fost rezolvate.',
 'protectedtitles' => 'Titluri protejate',
 'protectedtitlestext' => 'Următoarele titluri sunt protejate la creare',
 'protectedtitlesempty' => 'Nu există titluri protejate cu acești parametri.',
-'listusers' => 'Lista de utilizatori',
+'listusers' => 'Listă utilizatori',
 'listusers-editsonly' => 'Arată doar utilizatorii cu modificări',
 'listusers-creationsort' => 'Sortează după data creării',
 'usereditcount' => '$1 {{PLURAL:$1|editare|editări}}',
@@ -2228,7 +2238,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: <code>$1</code> (nu adăugați niciunul dintre acestea în câmpul de căutare).',
+Protocoale suportate: <code>$1</code> (se trece implicit la http:// dacă nu este specificat niciun protocol).',
 'linksearch-line' => '$1 este legat de $2',
 'linksearch-error' => 'Metacaracterele pot să apară doar la începutul hostname-ului.',
 
@@ -2277,7 +2287,7 @@ Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații suplimentare]] d
 'emailuser-title-target' => 'E-mail către {{GENDER:$1|acest utilizator|această utilizatoare}}',
 'emailuser-title-notarget' => 'E-mail către utilizator',
 'emailpage' => 'E-mail către utilizator',
-'emailpagetext' => 'Puteți folosi formularul de mai jos pentru a trimite un e-mail acestui utilizator.
+'emailpagetext' => 'Puteți folosi formularul de mai jos pentru a trimite un e-mail {{GENDER:$1|acestui utilizator|acestei utilizatoare}}.
 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”',
@@ -2300,7 +2310,7 @@ Adresa de e-mail specificată de dumneavoastră în [[Special:Preferences|prefer
 'emailccme' => 'Trimite-mi pe e-mail o copie a mesajului meu.',
 'emailccsubject' => 'O copie a mesajului la $1: $2',
 'emailsent' => 'E-mail trimis',
-'emailsenttext' => 'E-mailul tău a fost trimis.',
+'emailsenttext' => 'E-mailul dumneavoastră a fost trimis.',
 'emailuserfooter' => 'Acest mesaj a fost trimis de $1 către $2 prin intermediul funcției „Trimite e-mail” de la {{SITENAME}}.',
 
 # User Messenger
@@ -2311,7 +2321,7 @@ Adresa de e-mail specificată de dumneavoastră în [[Special:Preferences|prefer
 'watchlist' => 'Pagini urmărite',
 'mywatchlist' => 'Pagini urmărite',
 'watchlistfor2' => 'Pentru $1 $2',
-'nowatchlist' => 'Nu ați ales să urmăriți nici o pagină.',
+'nowatchlist' => 'Lista dumneavoastră de pagini urmărite nu conține nici o pagină.',
 '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.',
@@ -2345,19 +2355,22 @@ Modificările viitoare efectuate asupra acestei pagini dar și asupra paginii de
 
 'enotif_mailer' => 'Sistemul de notificare {{SITENAME}}',
 'enotif_reset' => 'Marchează toate paginile vizitate',
-'enotif_newpagetext' => 'Aceasta este o pagină nouă.',
-'enotif_impersonal_salutation' => '{{SITENAME}} utilizator',
-'changed' => 'modificată',
-'created' => 'creată',
-'enotif_subject' => 'Pagina $PAGETITLE de la {{SITENAME}} a fost $CHANGEDORCREATED de $PAGEEDITOR',
+'enotif_impersonal_salutation' => 'Utilizator {{SITENAME}}',
+'enotif_subject_deleted' => 'Pagina $1 de la {{SITENAME}} a fost ștearsă de către {{gender:$2|$2}}',
+'enotif_subject_created' => 'Pagina $1 de la {{SITENAME}} a fost creată de către {{gender:$2|$2}}',
+'enotif_subject_moved' => 'Pagina $1 de la {{SITENAME}} a fost redenumită de către {{gender:$2|$2}}',
+'enotif_subject_restored' => 'Pagina $1 de la {{SITENAME}} a fost restaurată de către {{gender:$2|$2}}',
+'enotif_subject_changed' => 'Pagina $1 de la {{SITENAME}} a fost modificată de către {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => 'Pagina $1 de la {{SITENAME}} a fost ștearsă la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
+'enotif_body_intro_created' => 'Pagina $1 de la {{SITENAME}} a fost creată la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
+'enotif_body_intro_moved' => 'Pagina $1 de la {{SITENAME}} a fost redenumită la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
+'enotif_body_intro_restored' => 'Pagina $1 de la {{SITENAME}} a fost restaurată la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
+'enotif_body_intro_changed' => 'Pagina $1 de la {{SITENAME}} a fost modificată la $PAGEEDITDATE de către {{gender:$2|$2}}; vedeți $3 pentru versiunea actuală.',
 'enotif_lastvisited' => 'Vedeți $1 pentru toate modificările de la ultima dvs. vizită.',
 'enotif_lastdiff' => 'Apasă $1 pentru a vedea această schimbare.',
 'enotif_anon_editor' => 'utilizator anonim $1',
 'enotif_body' => 'Domnule/Doamnă $WATCHINGUSERNAME,
-
-Pagina $PAGETITLE de la {{SITENAME}} a fost $CHANGEDORCREATED în data de $PAGEEDITDATE de către $PAGEEDITOR. Vedeți la $PAGETITLE_URL versiunea curentă.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Descrierea lăsată de utilizator: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2365,8 +2378,7 @@ Puteți contacta utilizatorul:
 e-mail: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Nu veți mai primi notificări în cazul unor viitoare modificări până când nu veți vizitați pagina. 
-Puteți de asemenea reseta notificările pentru toate pagini pe care le urmăriți.
+Nu veți mai primi notificări în cazul unor viitoare modificări până când nu veți vizitați pagina. Puteți de asemenea reseta notificările pentru toate pagini pe care le urmăriți.
 
              Al dumneavoastră amic, sistemul de notificare de la {{SITENAME}}
 
@@ -2531,7 +2543,8 @@ S-ar putea ca legătura să fie greșită, ori versiunea să fi fost restaurată
 '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.',
+'cannotundelete' => 'Recuperarea a eșuat:
+$1',
 'undeletedpage' => "'''$1 a fost recuperat'''
 
 Consultați [[Special:Log/delete|jurnalul ștergerilor]] pentru a vedea toate ștergerile și recuperările recente.",
@@ -2563,7 +2576,7 @@ $1',
 'blanknamespace' => 'Articole',
 
 # Contributions
-'contributions' => 'Contribuții utilizator',
+'contributions' => 'Contribuții {{GENDER:$1|utilizator}}',
 'contributions-title' => 'Contribuțiile utilizatorului $1',
 'mycontris' => 'Contribuții',
 'contribsub2' => 'Pentru $1 ($2)',
@@ -2606,7 +2619,7 @@ Iată aici ultima înregistrare relevantă din jurnalul blocărilor:',
 'whatlinkshere-hideredirs' => '$1 redirecționările',
 'whatlinkshere-hidetrans' => '$1 transcluderile',
 'whatlinkshere-hidelinks' => '$1 legăturile',
-'whatlinkshere-hideimages' => '$1 legăturile către imagine',
+'whatlinkshere-hideimages' => '$1 legăturile către fișier',
 'whatlinkshere-filters' => 'Filtre',
 
 # Block/unblock
@@ -2843,6 +2856,7 @@ Pagina destinație „[[:$1]]” există deja. Doriți să o ștergeți pentru a
 'immobile-target-namespace-iw' => 'Legătura interwiki nu este o țintă validă pentru redenumire.',
 'immobile-source-page' => 'Această pagină nu poate fi redenumită.',
 'immobile-target-page' => 'Imposibil de redenumit pagina la acel titlu.',
+'bad-target-model' => 'Destinația dorită folosește un alt model de conținut. Nu se poate converti $1 în $2.',
 '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',
@@ -2859,7 +2873,7 @@ Ultima intrare în jurnal este afișată mai jos pentru referință:",
 Alegeți un alt nume.',
 
 # Export
-'export' => 'Exportare de pagini',
+'export' => 'Exportare pagini',
 'exporttext' => 'Puteți exporta textul și istoricul unei pagini anume sau ale unui grup de pagini în XML.
 Acesta poate fi apoi importate în alt wiki care rulează software MediaWiki prin [[Special:Import|pagina de importare]].
 
@@ -2911,7 +2925,7 @@ Vă rugăm să vizitați [//www.mediawiki.org/wiki/Localisation MediaWiki Locali
 'thumbnail_image-missing' => 'Fișierul următor nu poate fi găsit: $1',
 
 # Special:Import
-'import' => 'Importă pagini',
+'import' => 'Importare pagini',
 'importinterwiki' => 'Import transwiki',
 'import-interwiki-text' => 'Selectează un wiki și titlul paginii care trebuie importate. Datele reviziilor și numele editorilor vor fi salvate. Toate acțiunile de import transwiki pot fi găsite la [[Special:Log/import|log import]]',
 'import-interwiki-source' => 'Wiki/pagină sursă:',
@@ -2969,7 +2983,6 @@ Un dosar temporar lipsește.',
 
 # JavaScriptTest
 'javascripttest' => 'Testare JavaScript',
-'javascripttest-disabled' => 'Această funcție nu a fost activată pe acest wiki.',
 'javascripttest-title' => 'Rulare teste pentru $1',
 'javascripttest-pagetext-noframework' => 'Această pagină este rezervată rulării testelor JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Cadru de testare „$1” necunoscut.',
@@ -3087,6 +3100,7 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 
 # Info page
 'pageinfo-title' => 'Informații pentru „$1”',
+'pageinfo-not-current' => 'Ne cerem scuze, dar este imposibilă furnizarea acestor informații pentru versiunile mai vechi ale paginii.',
 'pageinfo-header-basic' => 'Informații de bază',
 'pageinfo-header-edits' => 'Istoric modificări',
 'pageinfo-header-restrictions' => 'Protecție pagină',
@@ -3095,6 +3109,7 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'pageinfo-default-sort' => 'Cheie de sortare implicită',
 'pageinfo-length' => 'Lungimea paginii (în octeți)',
 'pageinfo-article-id' => 'ID pagină',
+'pageinfo-language' => 'Limba conținutului paginii',
 'pageinfo-robot-policy' => 'Statut pentru motorul de căutare',
 'pageinfo-robot-index' => 'Indexabilă',
 'pageinfo-robot-noindex' => 'Neindexabilă',
@@ -3111,10 +3126,17 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 '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ă ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Informații despre pagină',
+'pageinfo-redirectsto' => 'Redirecționează către',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Numărată ca pagină cu conținut',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Protecțiile provin în cascadă de aici',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Protecțiile provin în cascadă de la',
 
 # Skin names
 'skinname-standard' => 'Clasic',
@@ -3137,6 +3159,8 @@ Permite adăugarea unui motiv în descrierea modificărilor',
 'markedaspatrollederror' => 'Nu se poate marca ca verificat',
 'markedaspatrollederrortext' => 'Trebuie să specificați o versiune care să fie marcată ca verificată.',
 'markedaspatrollederror-noautopatrol' => 'Nu puteți marca propriile modificări ca verificate.',
+'markedaspatrollednotify' => 'Această modificare la $1 a fost marcată ca patrulată.',
+'markedaspatrollederrornotify' => 'Marcarea ca patrulată a eșuat.',
 
 # Patrol log
 'patrol-log-page' => 'Jurnal verificări',
@@ -3201,6 +3225,7 @@ Executându-l, sistemul dvs. poate fi compromis.",
 'hours' => '{{PLURAL:$1|o oră|$1 ore|$1 de ore}}',
 'days' => '{{PLURAL:$1|o zi|$1 zile|$1 de zile}}',
 'ago' => '$1 în urmă',
+'just-now' => 'Chiar acum',
 
 # Bad image list
 'bad_image_list' => 'Formatul este următorul:
@@ -3694,6 +3719,7 @@ Acest cod de confirmare va expira la $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Transcluderea interwiki este dezactivată]',
 'scarytranscludefailed' => '[Șiretlicul formatului a dat greș pentru $1]',
+'scarytranscludefailed-httpstatus' => '[Șiretlicul formatului a dat greș pentru $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL-ul este prea lung]',
 
 # Delete conflict
@@ -3753,15 +3779,15 @@ Vă rugăm să confirmați faptul că într-adevăr doriți să recreați acest
 # Watchlist editor
 'watchlistedit-numitems' => 'Lista ta de pagini urmărite conține {{PLURAL:$1|1 titlu|$1 titluri}}, excluzând paginile de discuții.',
 'watchlistedit-noitems' => 'Lista de pagini urmărite este goală.',
-'watchlistedit-normal-title' => 'Modificarea listei paginilor urmărite',
+'watchlistedit-normal-title' => 'Modificare listă pagini urmărite',
 'watchlistedit-normal-legend' => 'Ștergere titluri din lista de urmărire',
 'watchlistedit-normal-explain' => 'Lista de mai jos cuprinde paginile pe care le urmăriți.
 Pentru a elimina un titlu, bifați-l și apăsați „{{int:Watchlistedit-normal-submit}}”.
 Puteți modifica și direct [[Special:EditWatchlist/raw|lista brută]].',
 'watchlistedit-normal-submit' => 'Șterge titluri',
 'watchlistedit-normal-done' => '{{PLURAL:$1|1 titlu a fost șters|$1 titluri au fost șterse}} din lista de urmărire:',
-'watchlistedit-raw-title' => 'Modificarea listei brute a paginilor urmărite',
-'watchlistedit-raw-legend' => 'Modifică lista brută de pagini urmărite',
+'watchlistedit-raw-title' => 'Modificarea listă brută de pagini urmărite',
+'watchlistedit-raw-legend' => 'Modificare listă brută de pagini urmărite',
 'watchlistedit-raw-explain' => 'Lista de mai jos cuprinde paginile pe care le urmăriți. O puteți modifica adăugînd sau ștergînd titluri (cîte un titlu pe rînd).
 După ce terminați apăsați „{{int:Watchlistedit-raw-submit}}”.
 Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
@@ -3803,6 +3829,7 @@ Puteți folosi în schimb [[Special:EditWatchlist|editorul standard]].',
 'version-license' => 'Licență',
 'version-poweredby-credits' => "Acest wiki este dezvoltat de '''[//www.mediawiki.org/ MediaWiki]''', drepturi de autor © 2001-$1 $2.",
 'version-poweredby-others' => 'alții',
+'version-credits-summary' => 'Am dori să amintim următoarele persoane pentru contribuțiile aduse proiectului [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki este un software liber pe care îl puteți redistribui și/sau modifica sub termenii Licenței Publice Generale GNU publicată de Free Software Foundation – fie a doua versiune a acesteia, fie, la alegerea dumneavoastră, orice altă versiune ulterioară. 
 
 MediaWiki este distribuit în speranța că va fi folositor, dar FĂRĂ VREO GARANȚIE, nici măcar cea implicită de COMERCIALIZARE sau de ADAPTARE PENTRU UN UN SCOP ANUME. Vedeți Licența Publică Generală GNU pentru mai multe detalii. 
@@ -3942,9 +3969,9 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'logentry-move-move_redir-noredirect' => '$1 a redenumit pagina $3 în $4 înlocuind redirecționarea și fără a lăsa o redirecționare în loc',
 'logentry-patrol-patrol' => '$1 a marcat versiunea $4 a paginii $3 ca patrulată',
 'logentry-patrol-patrol-auto' => '$1 a marcat automat versiunea $4 a paginii $3 ca patrulată',
-'logentry-newusers-newusers' => '$1 a creat un cont de utilizator',
-'logentry-newusers-create' => '$1 a creat un cont de utilizator',
-'logentry-newusers-create2' => '$1 a creat un cont de utilizator $3',
+'logentry-newusers-newusers' => 'Contul de utilizator $1 a fost creat',
+'logentry-newusers-create' => 'Contul de utilizator $1 a fost creat',
+'logentry-newusers-create2' => 'Contul de utilizator $3 a fost creat de către $1',
 'logentry-newusers-autocreate' => 'Contul $1 a fost creat în mod automat',
 'newuserlog-byemail' => 'parola trimisă prin e-mail',
 
@@ -3964,6 +3991,10 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'feedback-bugcheck' => 'Minunat! Trebuie doar să verificați dacă nu cumva problema a fost [$1 deja înregistrată].',
 'feedback-bugnew' => 'Am verificat. O raportez drept o problemă nouă',
 
+# Search suggestions
+'searchsuggest-search' => 'Căutare',
+'searchsuggest-containing' => 'conținând...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nu aveți dreptul să încărcați fișiere pe acest wiki.',
 'api-error-badtoken' => 'Eroare internă: jeton greșit.',
@@ -4016,4 +4047,6 @@ Imaginile sunt afișate la rezoluția lor maximă, în timp ce alte tipuri de fi
 'duration-centuries' => '$1 {{PLURAL:$1|secol|secole|de secole}}',
 'duration-millennia' => '$1 {{PLURAL:$1|mileniu|milenii|de milenii}}',
 
+# Unknown messages
+'svg-long-error' => 'Fișier SVG invalid: $1',
 );
index cfbc010..f11c283 100644 (file)
@@ -162,8 +162,8 @@ $messages = array(
 'newwindow' => "(iapre jndr'à 'na fenestra nova)",
 'cancel' => 'Scangìlle',
 'moredotdotdot' => 'De cchiù...',
-'mypage' => "'A pàgene meje",
-'mytalk' => 'Ngazzaminde mie',
+'mypage' => "'A pàgena meje",
+'mytalk' => "'Ngazzaminde mie",
 'anontalk' => "'Ngazzaminde pe quiste IP",
 'navigation' => 'Naveghesce',
 'and' => '&#32;e',
@@ -173,7 +173,6 @@ $messages = array(
 'qbbrowse' => 'Sfoglie',
 'qbedit' => 'Cange',
 'qbpageoptions' => 'Pàgene currende',
-'qbpageinfo' => 'Condeste',
 'qbmyoptions' => 'Pàggene mije',
 'qbspecialpages' => 'Pàggene speciale',
 'faq' => 'FAQ',
@@ -446,11 +445,8 @@ L\'amministratore ca l\'ha bloccate dèje sta spiegazione: "$3".',
 # Login and logout pages
 'logouttext' => "'''Tu tè scolleghete.'''
 
-Tu puè condinuà a ausà {{SITENAME}} in mode anonime, o tu puè [[Special:UserLogin|collegarte 'n'otra vote]] cumme 'u stesse utende o cumme 'n'otre utende.
+Tu puè condinuà a ausà {{SITENAME}} in mode anonime, o tu puè <span class='plainlinks'>[$1 collegarte 'n'otra vote]</span> cumme 'u stesse utende o cumme 'n'otre utende.
 Note Bbuene ca certe pàggene ponne condinuà a essere viste cumme ce tu ste angore colleghete, fine a quanne a cache d'u browser no se sdeveche.",
-'welcomecreation' => "== Bovegne, $1! ==
-'U cunde tue ha state ccrejete.
-No te sce scurdanne de cangià le [[Special:Preferences|{{SITENAME}} preferenze tue]].",
 'yourname' => 'Nome utende:',
 'yourpassword' => 'Passuord:',
 'yourpasswordagain' => "Scrive 'a passuord notra vote:",
@@ -712,8 +708,8 @@ Ce tu non ge si 'n'utende anonime e pinze ca le commende ca so revolte a te sond
 'noarticletext' => 'Non ge stè scritte ninde jndr\'à sta pàgene.
 Tu puè [[Special:Search/{{PAGENAME}}|cercà pe quiste titele]] jndr\'à otre pàggene, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}] oppure [{{fullurl:{{FULLPAGENAME}}|action=edit}} cange sta pàgene]</span>.',
 '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>.",
+Tu puè [[Special:Search/{{PAGENAME}}|cercà pe stu titole]] jndr'à otre pàggene,
+o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cirche jndr'à l'archivije cullegate]</span>, ma non ge tìne le permesse pe ccrejà sta pàgene.",
 '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.
@@ -830,6 +826,11 @@ Pare proprie ca l'onne scangellete.",
 'edit-already-exists' => "Non ge puè ccrejà 'na pàgene nove purcè esiste già!",
 'defaultmessagetext' => 'Messàgge de teste de base',
 
+# Content models
+'content-model-text' => 'teste semblice',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "Fà attenziò: Sta vosce tène 'nu sbuenne de funziune de chiamate a l'analizzatore.
 
@@ -1089,8 +1090,6 @@ Le dettaglie le puè acchià jndr'à l'[{{fullurl:{{#Special:Log}}/delete|page={
 'search-interwiki-caption' => 'Pruggette sorelle',
 'search-interwiki-default' => '$1 resultete:',
 'search-interwiki-more' => '(de cchiù)',
-'search-mwsuggest-enabled' => 'cu le consiglie',
-'search-mwsuggest-disabled' => 'senza consiglie',
 'search-relatedarticle' => 'Colleghete',
 'mwsuggest-disable' => 'Disabbilete le conziglie in AJAX',
 'searcheverything-enable' => "Cirche jndr'à tutte le namespace",
@@ -1126,7 +1125,7 @@ Però fa attenzione purcè l'indice lore sus a {{SITENAME}} ponne condenè pàgg
 
 # Preferences page
 'preferences' => 'Me piece accussì',
-'mypreferences' => 'Me piece accussì',
+'mypreferences' => 'Me piace accussì',
 'prefs-edits' => 'Numere de cangiaminde:',
 'prefsnologin' => 'Non ge sinde colleghete',
 'prefsnologintext' => 'Tu a essere <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} colleghete]</span> pe \'mbostà le preferenze de l\'utinde.',
@@ -1765,7 +1764,7 @@ Pò essere ca tu vuè cangià 'a descrizione de jidde [$2 pàgene de descrizione
 'shared-repo' => "'nu condenitore de cose condivise",
 'shared-repo-name-wikimediacommons' => 'Wikimedia Commons',
 'filepage.css' => "/* 'U CSS ca se iacchie aqquà jè ingluse sus 'a pàgene de descrizione d'u file, pure ingluse pe le client de le Uicchi furastire */",
-'upload-disallowed-here' => "Sfortunatamende non ge puè sovrascrivere st'immaggine.",
+'upload-disallowed-here' => 'Non ge puè sovrascrivere stu file.',
 
 # File reversion
 'filerevert' => "'Nvirte $1",
@@ -2090,7 +2089,7 @@ L'indirizze e-mail ca tu è 'nzerite jndr'à le [[Special:Preferences|preferenze
 
 # Watchlist
 'watchlist' => 'Pàggene condrollete',
-'mywatchlist' => 'Pàggene condrollete',
+'mywatchlist' => 'Pàggene condrollate',
 'watchlistfor2' => 'Pe $1 $2',
 'nowatchlist' => "Non ge tine pàggene jndr'à liste de le pàggene condrollete.",
 'watchlistanontext' => 'Pe piacere $1 pe vedè o cangià le vosce sus a liste de le pàggene condrollete.',
@@ -2126,11 +2125,7 @@ Le cangiaminde future a sta pàgene e 'a pàgene de le 'ngazzaminde associete le
 
 'enotif_mailer' => '{{SITENAME}} Notificatore de email',
 'enotif_reset' => 'Signe tutte le pàggene cumme visitete',
-'enotif_newpagetext' => "Queste è 'na pàgena nove.",
 'enotif_impersonal_salutation' => 'Utende de {{SITENAME}}',
-'changed' => 'cangete',
-'created' => 'ccrejete',
-'enotif_subject' => '\'A pàgene de {{SITENAME}} $PAGETITLE ha state $CHANGEDORCREATED da $PAGEEDITOR',
 'enotif_lastvisited' => "Vide $1 pe tutte le cangiaminde da l'urtema visita toje.",
 'enotif_lastdiff' => 'Vide $1 pe vedè stu cangiamende.',
 'enotif_anon_editor' => 'Utende anonime $1',
@@ -2322,8 +2317,8 @@ Tu puè avè 'nu collegamende sbagliate o 'a revisione pò essere ca ha state re
 'undeletedrevisions' => '{{PLURAL:$1|1 revisione|$1 revisiune}} ripristinete',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 revisione|$1 revisiune}} e {{PLURAL:$2|1 file|$2 file}} ripristinete',
 'undeletedfiles' => '{{PLURAL:$1|1 file|$1 file}} ripristinete',
-'cannotundelete' => "Repristine fallite;
-quaccheotre pò essere ca ha repristinate 'a pàgene apprime.",
+'cannotundelete' => 'Repristine fallite:
+$1',
 'undeletedpage' => "'''$1 ha state repristinate'''
 
 Ligge l'[[Special:Log/delete|archivije de le scangellaminde]] pe 'nu report de le urteme scangellaminde e repristinaminde.",
@@ -2357,7 +2352,7 @@ $1",
 'blanknamespace' => '(Prengepàle)',
 
 # Contributions
-'contributions' => "Condrebbute de l'utende",
+'contributions' => "Condrebbute de l'{{GENDER:$1|utende}}",
 'contributions-title' => "Condrebbute de l'utende pe $1",
 'mycontris' => 'Condrebbute mie',
 'contribsub2' => 'Pe $1 ($2)',
@@ -2399,7 +2394,7 @@ L'urteme archivije de le bloccaminde se iacche aqquà sotte pe referimende:",
 'whatlinkshere-hideredirs' => '$1 ridirezionaminde',
 'whatlinkshere-hidetrans' => '$1 transclusiune',
 'whatlinkshere-hidelinks' => '$1 collegaminde',
-'whatlinkshere-hideimages' => '$1 collegaminde a immaggine',
+'whatlinkshere-hideimages' => "$1 collegaminde a 'u file",
 'whatlinkshere-filters' => 'Filtre',
 
 # Block/unblock
@@ -2765,7 +2760,6 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 
 # JavaScriptTest
 'javascripttest' => 'Test de JavaScript',
-'javascripttest-disabled' => "Sta funzione non g'à state abbilitate sus a sta Uicchi.",
 'javascripttest-title' => 'Stoche a esegue $1 test',
 'javascripttest-pagetext-noframework' => 'Sta pàgene jè riservate pe le esecuziune de le test de Javascript.',
 'javascripttest-pagetext-unknownframework' => 'Ambiende de teste scanusciute "$1".',
@@ -2932,10 +2926,11 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-authors' => 'Numere Totale de autore diverse',
 'pageinfo-recent-edits' => "Numere de le urteme cangiaminde ('mbonde a $1)",
 'pageinfo-recent-authors' => 'Numere de le urteme autore diverse',
-'pageinfo-restriction' => "Protezione d'a pàgene ({{lcfirst:$1}})",
 'pageinfo-magic-words' => '{{PLURAL:$1|Parole|Parole}} maggiche ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorije|Categorije}} scunnute ($1)',
 'pageinfo-templates' => 'Esclude {{PLURAL:$1|template|template}} ($1)',
+'pageinfo-contentpage-yes' => 'Sine',
+'pageinfo-protect-cascading-yes' => 'Sine',
 
 # Skin names
 'skinname-standard' => 'Classeche',
@@ -3967,8 +3962,8 @@ Le immaggine sonde fatte vedè jndr'à resoluziona megghie, otre tipe de file re
 'logentry-move-move_redir-noredirect' => "$1 pàgena spustate $3 a $4 sus a 'nu redirezionamende senze lassà 'nu redirezionamende",
 'logentry-patrol-patrol' => '$1 revisione marcate $4 de pàgene condrollate $3',
 'logentry-patrol-patrol-auto' => '$1 automaticamende revisione marcate $4 de pàgene condrollate $3',
-'logentry-newusers-newusers' => "$1 ccrejate 'nu cunde utende",
-'logentry-newusers-create' => "$1 ccrejate 'nu cunde utende",
+'logentry-newusers-newusers' => "'U cunde utende $1 ha state ccrejate",
+'logentry-newusers-create' => "'U cunde utende $1 ha state ccrejate",
 'logentry-newusers-create2' => "$1 ccrejate 'nu cunde utende $3",
 'logentry-newusers-autocreate' => "'U cunde utende $1 ha state ccrejate automaticamende",
 'newuserlog-byemail' => 'password mannete pe e-mail',
@@ -3989,6 +3984,10 @@ Ce nò, tu puè ausà 'u module facile aqquà sotte. 'U commende tune avène agg
 'feedback-bugcheck' => "Granne! Appene verificate ca non g'è une de le [$1 bug canusciute].",
 'feedback-bugnew' => "Agghie verificate. Manne 'nu bug nuève",
 
+# Search suggestions
+'searchsuggest-search' => 'Cirche',
+'searchsuggest-containing' => 'tène...',
+
 # API errors
 'api-error-badaccess-groups' => 'Tu non ge puè carecà file sus a sta Uicchi.',
 'api-error-badtoken' => 'Errore inderne: Gettone errate.',
index 1dd909d..63e61e1 100644 (file)
@@ -17,6 +17,7 @@
  * @author Alexandr Efremov
  * @author Amikeco
  * @author Amire80
+ * @author Anonim.one
  * @author Askarmuk
  * @author Assele
  * @author Bouron
@@ -28,6 +29,7 @@
  * @author Dim Grits
  * @author Don Alessandro
  * @author Eleferen
+ * @author Erdemaslancan
  * @author EugeneZelenko
  * @author Eugrus
  * @author Express2000
@@ -40,6 +42,8 @@
  * @author HalanTul
  * @author Huuchin
  * @author Illusion
+ * @author Iltever
+ * @author Incnis Mrsi
  * @author Iniquity
  * @author Innv
  * @author Jackie
@@ -53,6 +57,7 @@
  * @author Lockal
  * @author MaxBioHazard
  * @author MaxSem
+ * @author NBS
  * @author Ola
  * @author Ole Yves
  * @author Putnik
  * @author Sagan
  * @author Shirayuki
  * @author Sk
+ * @author Spider
  * @author TarzanASG
  * @author Temuri rajavi
  * @author Vago
  * @author VasilievVV
+ * @author Volkov
  * @author Ytsukeng Fyvaprol
  * @author Александр Сигачёв
  * @author Гусейн
@@ -196,7 +203,6 @@ $magicWords = array(
        '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' ),
@@ -416,7 +422,7 @@ $messages = array(
 'tog-minordefault' => 'Помечать по умолчанию правки как малозначимые',
 'tog-previewontop' => 'Помещать предпросмотр перед окном редактирования',
 'tog-previewonfirst' => 'Показывать предпросмотр при переходе к редактированию',
-'tog-nocache' => 'Отключить кеширование страниц в браузере',
+'tog-nocache' => 'Отключить кэширование страниц в браузере',
 'tog-enotifwatchlistpages' => 'Уведомлять по эл. почте об изменениях страниц и файлов из списка наблюдения',
 'tog-enotifusertalkpages' => 'Уведомлять по эл. почте об изменении персональной страницы обсуждения',
 'tog-enotifminoredits' => 'Уведомлять даже при незначительных изменениях страниц и файлов',
@@ -512,11 +518,11 @@ $messages = array(
 'category-empty' => "''Эта категория в данный момент пуста.''",
 'hidden-categories' => '{{PLURAL:$1|Скрытая категория|Скрытые категории}}',
 'hidden-category-category' => 'Скрытые категории',
-'category-subcat-count' => '{{PLURAL:$2|Ð\94аннаÑ\8f ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81одеÑ\80жиÑ\82 Ñ\82олÑ\8cко Ñ\81ледÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8e.|{{PLURAL:$1|Ð\9fоказана $1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f\9fоказано $1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80ии|Ð\9fоказано $1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80ий}} Ð¸Ð· $2.}}',
+'category-subcat-count' => '{{PLURAL:$2|ЭÑ\82а ÐºÐ°Ñ\82егоÑ\80иÑ\8f Ñ\81одеÑ\80жиÑ\82 Ñ\82олÑ\8cко Ñ\81ледÑ\83Ñ\8eÑ\89Ñ\83Ñ\8e Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8e.|{{PLURAL:$1|Ð\9fоказана $1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80иÑ\8f\9fоказано $1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80ии|Ð\9fоказано $1 Ð¿Ð¾Ð´ÐºÐ°Ñ\82егоÑ\80ий}} Ð¸Ð· $2 {{PLURAL:$2|имеÑ\8eÑ\89ейÑ\81Ñ\8f|имеÑ\8eÑ\89иÑ\85Ñ\81Ñ\8f}}.}}',
 'category-subcat-count-limited' => 'В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегории|$1 подкатегорий}}.',
-'category-article-count' => '{{PLURAL:$2|Эта категория содержит только одну страницу.|{{PLURAL:$1|Показана $1 страница|Показано $1 страницы|Показано $1 страниц}} этой категории из $2.}}',
+'category-article-count' => '{{PLURAL:$2|Эта категория содержит только одну страницу.|{{PLURAL:$1|Показана $1 страница|Показано $1 страницы|Показано $1 страниц}} из $2 {{PLURAL:$2|имеющейся|имеющихся}}.}}',
 'category-article-count-limited' => 'В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц}}.',
-'category-file-count' => '{{PLURAL:$2|Эта категория содержит только один файл.|{{PLURAL:$1|Показан $1 файл|Показано $1 файла|Показано $1 файлов}} этой категории  из $2.}}',
+'category-file-count' => '{{PLURAL:$2|Эта категория содержит только один файл.|В этой категории {{PLURAL:$1|показан $1 файл|показано $1 файла|показано $1 файлов}} из $2 {{PLURAL:$2|имеющейся|имеющихся}}.}}',
 'category-file-count-limited' => 'В этой категории {{PLURAL:$1|$1 файл|$1 файла|$1 файлов}}.',
 'listingcontinuesabbrev' => '(продолжение)',
 'index-category' => 'Индексируемые страницы',
@@ -528,8 +534,8 @@ $messages = array(
 'newwindow' => '(в новом окне)',
 'cancel' => 'Отменить',
 'moredotdotdot' => 'Далее…',
-'mypage' => 'Ð\9bиÑ\87наÑ\8f Ñ\81траница',
-'mytalk' => 'Ð\9cоÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¾Ð±Ñ\81Ñ\83ждениÑ\8f',
+'mypage' => 'Страница',
+'mytalk' => 'Ð\9eбÑ\81Ñ\83ждение',
 'anontalk' => 'Обсуждение для этого IP-адреса',
 'navigation' => 'Навигация',
 'and' => '&#32;и',
@@ -539,7 +545,6 @@ $messages = array(
 'qbbrowse' => 'Просмотреть',
 'qbedit' => 'Править',
 'qbpageoptions' => 'Настройки страницы',
-'qbpageinfo' => 'Сведения о странице',
 'qbmyoptions' => 'Ваши настройки',
 'qbspecialpages' => 'Специальные страницы',
 'faq' => 'ЧаВО',
@@ -552,16 +557,17 @@ $messages = array(
 'vector-action-protect' => 'Защитить',
 'vector-action-undelete' => 'Восстановить',
 'vector-action-unprotect' => 'Изменить защиту',
-'vector-simplesearch-preference' => 'Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80аÑ\81Ñ\88иÑ\80еннÑ\8bе Ð¿Ð¾Ð¸Ñ\81ковÑ\8bе Ð¿Ð¾Ð´Ñ\81казки (только для оформления «Векторное»)',
+'vector-simplesearch-preference' => 'Ð\92клÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83пÑ\80оÑ\89Ñ\91ннÑ\83Ñ\8e Ñ\81Ñ\82Ñ\80окÑ\83 Ð¿Ð¾Ð¸Ñ\81ка (только для оформления «Векторное»)',
 'vector-view-create' => 'Создание',
 'vector-view-edit' => 'Правка',
 'vector-view-history' => 'История',
-'vector-view-view' => 'Чтение',
+'vector-view-view' => 'Читать',
 'vector-view-viewsource' => 'Просмотр разметки',
 'actions' => 'Действия',
 'namespaces' => 'Пространства имён',
 'variants' => 'Варианты',
 
+'navigation-heading' => 'Навигация',
 'errorpagetitle' => 'Ошибка',
 'returnto' => 'Возврат к странице $1.',
 'tagline' => 'Материал из {{grammar:genitive|{{SITENAME}}}}',
@@ -594,7 +600,7 @@ $messages = array(
 'talkpage' => 'Обсудить эту страницу',
 'talkpagelinktext' => 'обсуждение',
 'specialpage' => 'Служебная страница',
-'personaltools' => 'Ð\9bиÑ\87ные инструменты',
+'personaltools' => 'Ð\9fеÑ\80Ñ\81оналÑ\8cные инструменты',
 'postcomment' => 'Новый раздел',
 'articlepage' => 'Просмотреть статью',
 'talk' => 'Обсуждение',
@@ -630,7 +636,7 @@ $1',
 'aboutsite' => 'Описание {{grammar:genitive|{{SITENAME}}}}',
 'aboutpage' => 'Project:Описание',
 'copyright' => 'Содержимое доступно в соответствии с $1.',
-'copyrightpage' => '{{ns:project}}:Ð\90вÑ\82оÑ\80Ñ\81кое Ð¿Ñ\80аво',
+'copyrightpage' => '{{ns:project}}:Ð\90вÑ\82оÑ\80Ñ\81кие Ð¿Ñ\80ава',
 'currentevents' => 'Текущие события',
 'currentevents-url' => 'Project:Текущие события',
 'disclaimers' => 'Отказ от ответственности',
@@ -641,7 +647,7 @@ $1',
 'mainpage' => 'Заглавная страница',
 'mainpage-description' => 'Заглавная страница',
 'policy-url' => 'Project:Правила',
-'portal' => 'СообÑ\89еÑ\81Ñ\82во',
+'portal' => 'Ð\9fоÑ\80Ñ\82ал Ñ\81ообÑ\89еÑ\81Ñ\82ва',
 'portal-url' => 'Project:Портал сообщества',
 'privacy' => 'Политика конфиденциальности',
 'privacypage' => 'Project:Политика конфиденциальности',
@@ -669,7 +675,7 @@ $1',
 'viewsourceold' => 'просмотреть исходный код',
 'editlink' => 'править',
 'viewsourcelink' => 'просмотреть исходный код',
-'editsectionhint' => 'Ð\9fÑ\80авиÑ\82Ñ\8c Ñ\81екÑ\86иÑ\8e «$1»',
+'editsectionhint' => 'РедакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\80аздел «$1»',
 'toc' => 'Содержание',
 'showtoc' => 'показать',
 'hidetoc' => 'убрать',
@@ -758,7 +764,7 @@ $1',
 'delete-hook-aborted' => 'Правка отменена процедурой-перехватчиком.
 Дополнительных пояснений не приведено.',
 'badtitle' => 'Недопустимое название',
-'badtitletext' => 'Ð\97апÑ\80аÑ\88иваемое Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð½ÐµÐ¿Ñ\80авилÑ\8cно, Ð¿Ñ\83Ñ\81Ñ\82о, Ð»Ð¸Ð±Ð¾ Ð½ÐµÐ¿Ñ\80авилÑ\8cно указано межъязыковое или интервики название. Возможно, в названии используются недопустимые символы.',
+'badtitletext' => 'Ð\97апÑ\80аÑ\88иваемое Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b Ð½ÐµÐ¿Ñ\80авилÑ\8cно, Ð¿Ñ\83Ñ\81Ñ\82о, Ð»Ð¸Ð±Ð¾ Ð½ÐµÐ²ÐµÑ\80но указано межъязыковое или интервики название. Возможно, в названии используются недопустимые символы.',
 'perfcached' => 'Следующие данные взяты из кэша и могут не учитывать последних изменений. В кэше хранится не более $1 {{PLURAL:$1|записи|записей|записей}}.',
 'perfcachedts' => 'Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более $4 {{PLURAL:$4|записи|записей|записей}}.',
 'querypage-no-updates' => 'Обновление этой страницы сейчас отключено.
@@ -770,7 +776,7 @@ $1',
 'viewsource-title' => 'Просмотр исходного текста страницы $1',
 'actionthrottled' => 'Ограничение по скорости',
 'actionthrottledtext' => 'В качестве меры борьбы со спамом, установлено ограничение на многократное применение данного действия в течение короткого промежутка времени. Пожалуйста, повторите попытку через несколько минут.',
-'protectedpagetext' => 'Эта страница закрыта для редактирования.',
+'protectedpagetext' => 'Эта страница защищена для предотвращения её редактирования или совершений других действий.',
 'viewsourcetext' => 'Вы можете просмотреть и скопировать исходный текст этой страницы:',
 'viewyourtext' => "Вы можете просмотреть и скопировать исходный текст '''ваших правок''' на этой странице:",
 'protectedinterface' => 'Эта страница содержит интерфейсное сообщение программного обеспечения. Во избежание вандализма её изменение запрещено.
@@ -803,12 +809,12 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Вы завершили сеанс работы.'''
 
-Вы можете продолжить участие в {{grammar:genitive|{{SITENAME}}}} анонимно или [[Special:UserLogin|представиться заново]] под тем же или другим именем.
-Некоторые страницы могут продолжать отображаться в том виде, как будто вы всё ещё представлены системе. Для борьбы с этим явлением обновите кеш браузера.",
-'welcomecreation' => '== Добро пожаловать, $1! ==
-Ваша учётная запись создана.
-Не забудьте провести [[Special:Preferences|персональную настройку]] сайта.',
-'yourname' => 'Имя участника:',
+Вы можете продолжить участие в {{grammar:genitive|{{SITENAME}}}} анонимно или <span class='plainlinks'>[$1 представиться заново]</span> под тем же или другим именем.
+Некоторые страницы могут продолжать отображаться в том виде, как будто вы всё ещё представлены системе. Для борьбы с этим явлением обновите кэш браузера.",
+'welcomeuser' => 'Добро пожаловать, $1!',
+'welcomecreation-msg' => 'Ваша учётная запись создана.
+Не забудьте провести [[Special:Preferences|персональную настройку]] сайта {{SITENAME}}.',
+'yourname' => 'Имя учётной записи:',
 'yourpassword' => 'Пароль:',
 'yourpasswordagain' => 'Повторный набор пароля:',
 'remembermypassword' => 'Помнить мою учётную запись на этом компьютере (не более $1 {{PLURAL:$1|дня|дней|дней}})',
@@ -824,9 +830,9 @@ $2',
 'logout' => 'Завершение сеанса',
 'userlogout' => 'Завершение сеанса',
 'notloggedin' => 'Вы не представились системе',
-'nologin' => "Нет учётной записи? '''$1'''.",
+'nologin' => 'Нет учётной записи? $1.',
 'nologinlink' => 'Создать учётную запись',
-'createaccount' => 'Ð\97аÑ\80егиÑ\81Ñ\82Ñ\80иÑ\80оваÑ\82Ñ\8c Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ñ\83Ñ\87аÑ\81Ñ\82ника',
+'createaccount' => 'СоздаÑ\82Ñ\8c Ñ\83Ñ\87Ñ\91Ñ\82нÑ\83Ñ\8e Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c',
 'gotaccount' => "Вы уже зарегистрированы? '''$1'''.",
 'gotaccountlink' => 'Представьтесь',
 'userlogin-resetlink' => 'Забыли данные для входа?',
@@ -972,7 +978,7 @@ $2
 'changeemail-oldemail' => 'Текущий адрес электронной почты:',
 'changeemail-newemail' => 'Новый адрес электронной почты:',
 'changeemail-none' => '(нет)',
-'changeemail-submit' => 'Ð\98зменениÑ\82Ñ\8c Ð°Ð´Ñ\80еÑ\81',
+'changeemail-submit' => 'Изменить адрес',
 'changeemail-cancel' => 'Отмена',
 
 # Edit page toolbar
@@ -989,9 +995,9 @@ $2
 'nowiki_sample' => 'Вставьте сюда текст, который не нужно форматировать',
 'nowiki_tip' => 'Игнорировать вики-форматирование',
 'image_tip' => 'Встроенный файл',
-'media_tip' => 'Ссылка на медиа-файл',
+'media_tip' => 'Ссылка на файл',
 'sig_tip' => 'Ваша подпись и момент времени',
-'hr_tip' => 'Горизонтальная линия (не используйте часто)',
+'hr_tip' => 'Ð\93оÑ\80изонÑ\82алÑ\8cнаÑ\8f Ð»Ð¸Ð½Ð¸Ñ\8f (не Ð¸Ñ\81полÑ\8cзÑ\83йÑ\82е Ñ\81лиÑ\88ком Ñ\87аÑ\81Ñ\82о)',
 
 # Edit pages
 'summary' => 'Описание изменений:',
@@ -1003,8 +1009,8 @@ $2
 'showpreview' => 'Предварительный просмотр',
 'showlivepreview' => 'Быстрый предпросмотр',
 'showdiff' => 'Внесённые изменения',
-'anoneditwarning' => "'''Внимание:''' Вы не представились системе.
аш IP-адрес будет записан в историю изменений этой страницы.",
+'anoneditwarning' => "'''Внимание!''' Вы не авторизовались на сайте.
 истории изменений этой страницы будет записан ваш IP-адрес.",
 'anonpreviewwarning' => "''Вы не представились системе. Сохранение приведёт к записи вашего IP-адреса в историю изменений страницы.''",
 'missingsummary' => "'''Напоминание.''' Вы не дали краткого описания изменений. При повторном нажатии на кнопку «{{int:savearticle}}», ваши изменения будут сохранены без комментария.",
 'missingcommenttext' => 'Пожалуйста, введите ниже ваше сообщение.',
@@ -1058,14 +1064,14 @@ $2
 'newarticle' => '(Новая)',
 'newarticletext' => "Вы перешли по ссылке на страницу, которой пока не существует.
 Чтобы её создать, наберите текст в окне, расположенном ниже (подробнее см. [[{{MediaWiki:Helppage}}|справочную страницу]]).
-Если вы оказались здесь по ошибке, просто нажмите кнопку '''назад''' вашего браузера.",
+Если вы оказались здесь по ошибке, просто нажмите кнопку '''назад''' своего браузера.",
 'anontalkpagetext' => "----''Эта страница обсуждения принадлежит анонимному участнику, который ещё не создал учётной записи, или не использует её.
 Поэтому для идентификации используется цифровой IP-адрес.
 Этот же адрес может соответствовать нескольким другим участникам.
 Если вы анонимный участник и полагаете, что получили сообщения, адресованные не вам, пожалуйста, [[Special:UserLogin/signup|создайте учётную запись]] или [[Special:UserLogin|представьтесь системе]], чтобы впредь избежать возможной путаницы с другими анонимными участниками.''",
 'noarticletext' => "В настоящий момент текст на данной странице отсутствует.
 Вы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] в других статьях,
-<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов],
+<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов]
 или '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} создать страницу с таким названием]'''</span>.",
 'noarticletext-nopermission' => 'В настоящее время на этой странице нет текста.
 Вы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] на других страницах,
@@ -1078,11 +1084,11 @@ $2
 'userpage-userdoesnotexist-view' => 'Не зарегистрировано учётной записи «$1».',
 'blocked-notice-logextract' => 'Этот участник в данный момент заблокирован.
 Ниже приведена последняя запись из журнала блокировок:',
-'clearyourcache' => "'''Замечание.''' Возможно, после сохранения вам придётся очистить кеш своего браузера, чтобы увидеть изменения.
-* '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'', или нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)
+'clearyourcache' => "'''Замечание.''' Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.
+* '''Firefox / Safari:''' Удерживая клавишу ''Shift'', нажмите на панели инструментов ''Обновить'' либо нажмите ''Ctrl-F5'' или ''Ctrl-R'' (''⌘-R'' на Mac)
 * '''Google Chrome:''' Нажмите ''Ctrl-Shift-R'' (''⌘-Shift-R'' на Mac)
-* '''Internet Explorer:''' Удерживая ''Ctrl'' нажмите ''Обновить'', или нажмите ''Ctrl-F5''
-* '''Opera:''' Выберите очистку кеша в меню ''Инструменты → Настройки''",
+* '''Internet Explorer:''' Удерживая ''Ctrl'', нажмите ''Обновить'' либо нажмите ''Ctrl-F5''
+* '''Opera:''' Выберите очистку кэша в меню ''Инструменты → Настройки''",
 'usercssyoucanpreview' => "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый CSS-файл перед сохранением.",
 'userjsyoucanpreview' => "'''Подсказка.''' Нажмите кнопку «{{int:showpreview}}», чтобы проверить свой новый JS-файл перед сохранением.",
 'usercsspreview' => "'''Помните, что это только предварительный просмотр вашего CSS-файла, он ещё не сохранён!'''",
@@ -1127,9 +1133,9 @@ $2
 'editingold' => "'''Предупреждение. Вы редактируете устаревшую версию данной страницы.'''
 После сохранения будут потеряны изменения, сделанные в последующих версиях.",
 'yourdiff' => 'Различия',
-'copyrightwarning' => "Обратите внимание, что все добавления и изменения текста статьи рассматриваются, как выпущенные на условиях лицензии $2 (см. $1).
+'copyrightwarning' => "Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии $2 (см. $1).
 Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.<br />
-Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из
+Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из
 источника, допускающего свободное распространение и изменение своего содержимого.<br />
 '''НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!'''",
 'copyrightwarning2' => "Пожалуйста, учтите, что любой ваш вклад в проект «{{SITENAME}}» может быть отредактирован или удалён другими участниками.
@@ -1148,12 +1154,12 @@ $2
 'cascadeprotectedwarning' => "'''Предупреждение:''' Данную страницу могут редактировать только участники группы «Администраторы», поскольку она включена {{PLURAL:$1|в следующую страницу, для которой|в следующие страницы, для которых}} включена каскадная защита:",
 'titleprotectedwarning' => "'''Предупреждение.  Это название защищено. Создать эту страницу могут только участники с [[Special:ListGroupRights|соответствующими правами]].'''
 Ниже для справки приведена последняя запись журнала:",
-'templatesused' => '{{PLURAL:$1|Шаблон, Ð¸Ñ\81полÑ\8cзованнÑ\8bй|ШаблонÑ\8b, Ð¸Ñ\81полÑ\8cзованнÑ\8bе}} Ð½Ð° Ñ\82екÑ\83Ñ\89ей Ð²ÐµÑ\80Ñ\81ии Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b:',
+'templatesused' => '{{PLURAL:$1|Шаблон, Ð¸Ñ\81полÑ\8cзованнÑ\8bй|ШаблонÑ\8b, Ð¸Ñ\81полÑ\8cзованнÑ\8bе}} Ð½Ð° Ñ\8dÑ\82ой Ñ\81Ñ\82Ñ\80аниÑ\86е:',
 'templatesusedpreview' => '{{PLURAL:$1|Шаблон, используемый|Шаблоны, используемые}} в предпросматриваемой странице:',
 'templatesusedsection' => '{{PLURAL:$1|Шаблон, используемый|Шаблоны, использованные}} в этом разделе:',
 'template-protected' => '(защищено)',
 'template-semiprotected' => '(частично защищено)',
-'hiddencategories' => 'Эта страница относится к $1 {{PLURAL:$1|скрытой категории|скрытым категориям|скрытым категориям}}:',
+'hiddencategories' => 'Эта страница относится к $1 {{PLURAL:$1|скрытой категории|скрытым категориям}}:',
 'edittools' => '<!-- Расположенный здесь текст будет показываться под формой редактирования и формой загрузки. -->',
 'nocreatetitle' => 'Создание страниц ограничено',
 'nocreatetext' => 'На этом сайте ограничена возможность создания новых страниц.
@@ -1163,7 +1169,7 @@ $2
 'sectioneditnotsupported-text' => 'На этой странице не поддерживается редактирование разделов',
 'permissionserrors' => 'Ошибки прав доступа',
 'permissionserrorstext' => 'У вас нет прав на выполнение этой операции по {{PLURAL:$1|следующей причине|следующим причинам}}:',
-'permissionserrorstext-withaction' => "У вас нет разрешения на «'''$2'''» по {{PLURAL:$1|следующей причине|следующим причинам}}:",
+'permissionserrorstext-withaction' => 'У вас нет прав на $2 по {{PLURAL:$1|следующей причине|следующим причинам}}:',
 'recreate-moveddeleted-warn' => "'''Внимание. Вы пытаетесь воссоздать страницу, которая ранее удалялась.'''
 
 Проверьте, действительно ли вам нужно воссоздавать эту страницу.
@@ -1180,11 +1186,20 @@ $2
 'edit-already-exists' => 'Невозможно создать новую страницу.
 Она уже существует.',
 'defaultmessagetext' => 'Текст по умолчанию',
+'content-failed-to-parse' => 'Содержимое $2 не соответствует типу $1: $3.',
+'invalid-content-data' => 'Недопустимые данные',
+'content-not-allowed-here' => 'Содержимое "$1" недопустимо на странице [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'вики-текст',
+'content-model-text' => 'обычный текст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
-'expensive-parserfunction-warning' => 'Внимание. Эта страница содержит слишком много вызовов ресурсоёмких функций.
+'expensive-parserfunction-warning' => "'''Внимание!''' Эта страница содержит слишком много вызовов ресурсоёмких функций.
 
\9eгÑ\80аниÑ\87ение Ð½Ð° ÐºÐ¾Ð»Ð¸Ñ\87еÑ\81Ñ\82во Ð²Ñ\8bзовов Ñ\83Ñ\81Ñ\82ановлено Ð½Ð° Ñ\83Ñ\80овне $2 {{PLURAL:$2|вÑ\8bзова|вÑ\8bзовов|вÑ\8bзовов}}, Ð² Ð´Ð°Ð½Ð½Ð¾Ð¼ Ñ\81лÑ\83Ñ\87ае Ñ\82Ñ\80ебÑ\83еÑ\82Ñ\81Ñ\8f Ñ\81делаÑ\82Ñ\8c {{PLURAL:$1|$1 Ð²Ñ\8bзов|$1 Ð²Ñ\8bзова|$1 Ð²Ñ\8bзовов}}.',
\94олжно Ð±Ñ\8bÑ\82Ñ\8c Ð½Ðµ Ð±Ð¾Ð»ÐµÐµ $2 {{PLURAL:$2|вÑ\8bзова|вÑ\8bзовов}}, Ð² Ñ\82о Ð²Ñ\80емÑ\8f ÐºÐ°Ðº Ñ\81ейÑ\87аÑ\81 Ð·Ð´ÐµÑ\81Ñ\8c $1 {{PLURAL:$1|вÑ\8bзов|вÑ\8bзова|вÑ\8bзовов}}.",
 'expensive-parserfunction-category' => 'Страницы со слишком большим количеством вызовов ресурсоёмких функций',
 'post-expand-template-inclusion-warning' => 'Предупреждение: суммарный размер включаемых шаблонов слишком велик.
 Некоторые шаблоны не будут включены.',
@@ -1340,7 +1355,7 @@ $1",
 ** Потенциально клеветнические сведения',
 'revdelete-otherreason' => 'Другая/дополнительная причина:',
 'revdelete-reasonotherlist' => 'Другая причина',
-'revdelete-edit-reasonlist' => 'Ð\9fÑ\80авить список причин',
+'revdelete-edit-reasonlist' => 'РедакÑ\82иÑ\80овать список причин',
 'revdelete-offender' => 'Автор версии страницы:',
 
 # Suppression log
@@ -1390,7 +1405,7 @@ $1",
 'diff-multi-manyusers' => '(не {{PLURAL:$1|показана $1 промежуточная версия|показаны $1 промежуточные версии|показаны $1 промежуточных версий}}, сделанные более чем $2 {{PLURAL:$2|участником|участниками}})',
 'difference-missing-revision' => '{{PLURAL:$2|$2 версия|$2 версии|$2 версий}} для этого сравнения ($1) {{PLURAL:$2|не обнаружена|не обнаружены}}.
 
-ЭÑ\82о Ð¾Ð±Ñ\8bÑ\87но Ð±Ñ\8bваеÑ\82, ÐµÑ\81ли Ð¿Ð¾Ñ\81ледоваÑ\82Ñ\8c Ð¿Ð¾ Ñ\83Ñ\81Ñ\82аÑ\80евÑ\88ей Ñ\81Ñ\81Ñ\8bлке Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83, которая была удалена.
+ЭÑ\82о Ð¾Ð±Ñ\8bÑ\87но Ð±Ñ\8bваеÑ\82, ÐµÑ\81ли Ð¿ÐµÑ\80ейÑ\82и Ð¿Ð¾ Ñ\83Ñ\81Ñ\82аÑ\80евÑ\88ей Ñ\81Ñ\81Ñ\8bлке Ñ\81Ñ\80авнениÑ\8f Ð²ÐµÑ\80Ñ\81ий Ð´Ð»Ñ\8f Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b, которая была удалена.
 Подробности могут быть в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журнале удалений].',
 
 # Search results
@@ -1399,7 +1414,7 @@ $1",
 'searchresulttext' => 'Для получения более подробной информации о поиске на страницах проекта, см. [[{{MediaWiki:Helppage}}|справочный раздел]].',
 'searchsubtitle' => 'По запросу «[[:$1]]» ([[Special:Prefixindex/$1|страницы, начинающиеся с этого названия]]{{int:pipe-separator}}[[Special:WhatLinksHere/$1|ссылающиеся на это название]])',
 'searchsubtitleinvalid' => 'По запросу «$1»',
-'toomanymatches' => 'Найдено слишком много соответствий, пожалуйста, попробуйте другой запрос',
+'toomanymatches' => 'Найдено слишком много соответствий; пожалуйста, попробуйте сформулировать запрос иначе',
 'titlematches' => 'Совпадения в названиях страниц',
 'notitlematches' => 'Нет совпадений в названиях страниц',
 'textmatches' => 'Совпадения в текстах страниц',
@@ -1411,7 +1426,7 @@ $1",
 'shown-title' => 'Показывать $1 {{PLURAL:$1|запись|записи|записей}} на странице',
 'viewprevnext' => 'Просмотреть ($1 {{int:pipe-separator}} $2) ($3)',
 'searchmenu-legend' => 'Настройки поиска',
-'searchmenu-exists' => "'''Ð\92 Ñ\8dÑ\82ом Ð²Ð¸ÐºÐ¸-пÑ\80оекÑ\82е есть страница «[[:$1]]»'''",
+'searchmenu-exists' => "'''Ð\92 Ñ\8dÑ\82ой Ð²Ð¸ÐºÐ¸ есть страница «[[:$1]]»'''",
 'searchmenu-new' => "'''Создать страницу «[[:$1]]» в этом вики-проекте!'''",
 'searchhelp-url' => 'Help:Содержание',
 'searchmenu-prefix' => '[[Special:PrefixIndex/$1|Показать страницы с этим префиксом]]',
@@ -1423,10 +1438,10 @@ $1",
 'searchprofile-articles-tooltip' => 'Поиск в $1',
 'searchprofile-project-tooltip' => 'Поиск в $1',
 'searchprofile-images-tooltip' => 'Поиск файлов',
-'searchprofile-everything-tooltip' => 'Поиск на всех страницах (включая страницы обсуждения)',
+'searchprofile-everything-tooltip' => 'Поиск на всех страницах (включая страницы обсуждений)',
 'searchprofile-advanced-tooltip' => 'Искать в заданных пространствах имён',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 слово|$2 слова|$2 слов}})',
-'search-result-category-size' => '$1 {{PLURAL:$1|член|члена|членов}} ($2 {{PLURAL:$2|подкатегория|подкатегории|подкатегорий}}, $3 {{PLURAL:$3|файл|файла|файлов}}).',
+'search-result-category-size' => '$1 {{PLURAL:$1|вхождение|вхождения|вхождений}} ($2 {{PLURAL:$2|подкатегория|подкатегории|подкатегорий}}, $3 {{PLURAL:$3|файл|файла|файлов}}).',
 'search-result-score' => 'Релевантность: $1%.',
 'search-redirect' => '(перенаправление с $1)',
 'search-section' => '(раздел «$1»)',
@@ -1434,8 +1449,6 @@ $1",
 'search-interwiki-caption' => 'Родственные проекты',
 'search-interwiki-default' => '$1 результ.:',
 'search-interwiki-more' => '(ещё)',
-'search-mwsuggest-enabled' => 'с советами',
-'search-mwsuggest-disabled' => 'без советов',
 'search-relatedarticle' => 'Связанный',
 'mwsuggest-disable' => 'Отключить AJAX-подсказки',
 'searcheverything-enable' => 'Поиск по всем пространствам имён',
@@ -1455,7 +1468,7 @@ $1",
 'powersearch-toggleall' => 'Все',
 'powersearch-togglenone' => 'Ничего',
 'search-external' => 'Внешний поиск',
-'searchdisabled' => 'Извините, но встроенный полнотекстовый поиск выключен. Вы можете воспользоваться поиском по сайту через поисковые системы общего назначения, однако имейте в виду, что копия сайта в их кеше может быть несколько устаревшей.',
+'searchdisabled' => 'Извините, но встроенный полнотекстовый поиск выключен. Вы можете воспользоваться поиском по сайту через поисковые системы общего назначения, однако имейте в виду, что копия сайта в их кэше может быть несколько устаревшей.',
 
 # Quickbar
 'qbsettings' => 'Панель навигации',
@@ -1530,7 +1543,7 @@ $1",
 'timezoneregion-europe' => 'Европа',
 'timezoneregion-indian' => 'Индийский океан',
 'timezoneregion-pacific' => 'Тихий океан',
-'allowemail' => 'Разрешить приём электронной почты от других участников',
+'allowemail' => 'Разрешить получение электронной почты от других участников',
 'prefs-searchoptions' => 'Поиск',
 'prefs-namespaces' => 'Пространства имён',
 'defaultns' => 'Иначе искать в следующих пространствах имён:',
@@ -1544,11 +1557,11 @@ $1",
 'prefs-emailconfirm-label' => 'Подтверждение электронной почты:',
 'prefs-textboxsize' => 'Размер окна редактирования',
 'youremail' => 'Электронная почта:',
-'username' => 'РегиÑ\81Ñ\82Ñ\80аÑ\86ионное Ð¸Ð¼Ñ\8f:',
+'username' => 'Ð\98мÑ\8f Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и:',
 'uid' => 'Идентификатор участника:',
 'prefs-memberingroups' => 'Член {{PLURAL:$1|группы|групп}}:',
 'prefs-registration' => 'Время регистрации:',
-'yourrealname' => 'Ð\92аÑ\88е Ð½астоящее имя:',
+'yourrealname' => 'Ð\9dастоящее имя:',
 'yourlanguage' => 'Язык интерфейса:',
 'yourvariant' => 'Вариант языка содержания:',
 'prefs-help-variant' => 'Предпочитаемый для отображения содержимого страниц вики вариант языка или орфография.',
@@ -1567,7 +1580,7 @@ $1",
 'prefs-help-realname' => 'Настоящее имя (необязательное поле).
 Если вы укажете его, то оно будет использовано для того, чтобы показать, кем была внесена правка страницы.',
 'prefs-help-email' => 'Адрес электронной почты указывать необязательно, но он будет необходим в том случае, если вы забудете пароль.',
-'prefs-help-email-others' => 'Он также позволит другим участникам связаться с вами через ссылку на вашей личной странице без необходимости раскрытия адреса вашей электронной почты.',
+'prefs-help-email-others' => 'Он также позволит другим участникам связаться с вами по электронной почте с помощью ссылки на вашей персональной странице или на вашей странице обсуждения. При этом ваш адрес электронной почты не будет никому раскрыт.',
 'prefs-help-email-required' => 'Необходимо указать адрес электронной почты.',
 'prefs-info' => 'Основные сведения',
 'prefs-i18n' => 'Интернационализация',
@@ -1586,22 +1599,22 @@ $1",
 
 # User preference: e-mail validation using jQuery
 'email-address-validity-valid' => 'Выглядит корректно',
-'email-address-validity-invalid' => 'ТÑ\80ебÑ\83еÑ\82Ñ\81Ñ\8f ÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bй Ð°Ð´Ñ\80еÑ\81!',
+'email-address-validity-invalid' => 'Ð\92ведиÑ\82е ÐºÐ¾Ñ\80Ñ\80екÑ\82нÑ\8bй Ð°Ð´Ñ\80еÑ\81 Ñ\8dлекÑ\82Ñ\80онной Ð¿Ð¾Ñ\87Ñ\82Ñ\8b!',
 
 # User rights
 'userrights' => 'Управление правами участника',
 'userrights-lookup-user' => 'Управление группами участников',
-'userrights-user-editname' => 'Введите имя участника:',
+'userrights-user-editname' => 'Введите имя учётной записи:',
 'editusergroup' => 'Изменить членство в группах',
 'editinguser' => "Изменение прав {{GENDER:$1|участника|участницы}} '''[[User:$1|$1]]''' $2",
 'userrights-editusergroup' => 'Изменение членства в группах',
 'saveusergroups' => 'Сохранить группы участника',
-'userrights-groupsmember' => 'Член Ð³Ñ\80Ñ\83пп:',
-'userrights-groupsmember-auto' => 'Неявный член:',
+'userrights-groupsmember' => 'СоÑ\81Ñ\82оиÑ\82 Ð² Ð³Ñ\80Ñ\83ппаÑ\85:',
+'userrights-groupsmember-auto' => 'Неявно состоит в группах:',
 'userrights-groups-help' => 'Вы можете изменить группы, в которые входит этот участник.
 * Если около названия группы стоит отметка, значит участник входит в эту группу.
 * Если отметка не стоит — участник не относится к соответствующей группе.
-* Знак * отмечает, что вы не можете удалить из группы участника, если добавите его в неё или наоборот.',
+* Знак * отмечает, что вы не сможете удалить участника из группы, если добавите его в неё, или наоборот.',
 'userrights-reason' => 'Причина:',
 'userrights-no-interwiki' => 'У вас нет разрешения изменять права участников на других вики.',
 'userrights-nodatabase' => 'База данных $1 не существует или не является локальной.',
@@ -1651,7 +1664,7 @@ $1",
 'right-reupload-own' => 'перезапись файлов тем же участником',
 'right-reupload-shared' => 'подмена файлов из общих хранилищ локальными',
 'right-upload_by_url' => 'загрузка файлов с адреса URL',
-'right-purge' => 'очистка кеша страниц без страницы подтверждения',
+'right-purge' => 'очистка кэша страниц без страницы подтверждения',
 'right-autoconfirmed' => 'правка частично защищённых страниц',
 'right-bot' => 'считаться автоматическим процессом',
 'right-nominornewtalk' => 'отсутствие малых правок на страницах обсуждений включает режим новых сообщений',
@@ -1667,7 +1680,7 @@ $1",
 'right-undelete' => 'восстановление страниц',
 'right-suppressrevision' => 'просмотр и восстановление скрытых от администраторов версий страниц',
 'right-suppressionlog' => 'просмотр частных журналов',
-'right-block' => 'Ñ\83Ñ\81Ñ\82ановка Ð·Ð°Ð¿Ñ\80еÑ\82а Ð½Ð° Ñ\80едакÑ\82иÑ\80ование Ð´Ñ\80Ñ\83гим Ñ\83Ñ\87аÑ\81Ñ\82никам',
+'right-block' => 'Ñ\83Ñ\81Ñ\82ановка Ð¾Ð³Ñ\80аниÑ\87ений Ð½Ð° Ñ\80едакÑ\82иÑ\80ование Ð´Ð»Ñ\8f Ð´Ñ\80Ñ\83гиÑ\85 Ñ\83Ñ\87аÑ\81Ñ\82ников',
 'right-blockemail' => 'установка запрета на отправку электронной почты',
 'right-hideuser' => 'запрет имени участника и его сокрытие',
 'right-ipblock-exempt' => 'обход блокировок по IP, автоблокировок и блокировок диапазонов',
@@ -1701,6 +1714,9 @@ $1",
 'rightslogtext' => 'Это журнал изменений прав участника.',
 'rightslogentry' => 'изменил членство в группах для $1 с $2 на $3',
 'rightslogentry-autopromote' => 'был автоматически переведён из $2 в $3',
+'logentry-rights-rights' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3 с $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|изменил|изменила}} членство в группах для $3',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|был автоматически переведён|была автоматически переведена}} из $4 в $5',
 'rightsnone' => '(нет)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1708,16 +1724,16 @@ $1",
 'action-edit' => 'редактирование этой страницы',
 'action-createpage' => 'создание страниц',
 'action-createtalk' => 'создание страниц обсуждений',
-'action-createaccount' => 'создание этой учётной записи участника',
-'action-minoredit' => 'оÑ\82меÑ\82ка этой правки как малой',
+'action-createaccount' => 'создание этой учётной записи',
+'action-minoredit' => 'помеÑ\82кÑ\83 этой правки как малой',
 'action-move' => 'переименование этой страницы',
 'action-move-subpages' => 'переименование этой страницы со всеми её подстраницами',
 'action-move-rootuserpages' => 'переименование корневых страниц участников',
 'action-movefile' => 'переименовать этот файл',
-'action-upload' => 'загрузка этого файла',
+'action-upload' => 'загрузку этого файла',
 'action-reupload' => 'перезапись существующего файла',
 'action-reupload-shared' => 'перекрытие файла из общего хранилища',
-'action-upload_by_url' => 'загрузка этого файла с адреса URL',
+'action-upload_by_url' => 'загрузку этого файла с адреса URL',
 'action-writeapi' => 'использование API для правок',
 'action-delete' => 'удаление этой страницы',
 'action-deleterevision' => 'удаление этой версии страницы',
@@ -1726,9 +1742,9 @@ $1",
 'action-undelete' => 'восстановление этой страницы',
 'action-suppressrevision' => 'просмотр и восстановление этой скрытой версии страницы',
 'action-suppressionlog' => 'просмотр этого частного журнала',
-'action-block' => 'блокиÑ\80овка участника',
+'action-block' => 'огÑ\80аниÑ\87иваÑ\82Ñ\8c Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñ\81Ñ\82Ñ\8c Ñ\80едакÑ\82иÑ\80ованиÑ\8f Ð´Ð»Ñ\8f Ñ\8dÑ\82ого участника',
 'action-protect' => 'изменение уровня защиты этой страницы',
-'action-rollback' => 'быстрый откат изменений последнего пользователя, который редактировал страницу',
+'action-rollback' => 'быстрый откат изменений участника, который последним редактировал страницу',
 'action-import' => 'импорт этой страницы из другой вики',
 'action-importupload' => 'импорт этой страницы из загруженного файла',
 'action-patrol' => 'отметка чужих правок как отпатрулированных',
@@ -1745,13 +1761,13 @@ $1",
 'recentchanges' => 'Свежие правки',
 'recentchanges-legend' => 'Настройки свежих правок',
 'recentchanges-summary' => 'Ниже в хронологическом порядке перечислены последние изменения на страницах {{grammar:genitive|{{SITENAME}}}}.',
-'recentchanges-feed-description' => 'Ð\9eÑ\82Ñ\81леживаÑ\82Ñ\8c Ð¿Ð¾Ñ\81ледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ð²Ð¸ÐºÐ¸ Ð² Ñ\8dÑ\82ом Ð¿Ð¾Ñ\82оке.',
+'recentchanges-feed-description' => 'Ð\9eÑ\82Ñ\81леживаÑ\82Ñ\8c Ð² Ñ\8dÑ\82ом Ð¿Ð¾Ñ\82оке Ð¿Ð¾Ñ\81ледние Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f Ð² Ð²Ð¸ÐºÐ¸.',
 'recentchanges-label-newpage' => 'Этой правкой была создана новая страница.',
 'recentchanges-label-minor' => 'Это незначительное изменение',
 'recentchanges-label-bot' => 'Эта правка сделана ботом',
-'recentchanges-label-unpatrolled' => 'Эту правку ещё не отпатрулировали',
+'recentchanges-label-unpatrolled' => 'Эта правку ещё никем не патрулировалась',
 'rcnote' => "{{PLURAL:$1|Последнее '''$1''' изменение|Последние '''$1''' изменения|Последние '''$1''' изменений}} за '''$2''' {{PLURAL:$2|день|дня|дней}}, на момент времени $5 $4.",
-'rcnotefrom' => 'Ниже перечислены изменения с <strong>$2</strong> (по <strong>$1</strong>).',
+'rcnotefrom' => "Ниже перечислены изменения с '''$2''' (не более '''$1''').",
 'rclistfrom' => 'Показать изменения с $1.',
 'rcshowhideminor' => '$1 малые правки',
 'rcshowhidebots' => '$1 ботов',
@@ -1900,7 +1916,7 @@ $1",
 'filename-bad-prefix' => "Имя загружаемого файла начинается с «'''$1'''» и, вероятно, является одним из шаблонных имён, которые цифровые фотокамеры дают снимкам. Пожалуйста, выберите имя, лучше описывающее содержание файла.",
 'filename-prefix-blacklist' => ' #<!-- оставьте эту строчку как есть --> <pre>
 # Синтаксис следующий:
-#   * Всё, что начинается с символа «#» считается комментарием (до конца строки)
+#   * Всё, что начинается с символа «#», считается комментарием (до конца строки)
 #   * Каждая непустая строка — префикс стандартного названия файла, которое обычно даёт цифровая камера
 CIMG # Casio
 DSC_ # Nikon
@@ -1941,6 +1957,7 @@ $1',
 'backend-fail-notsame' => 'Уже есть неидентичный файл $1.',
 'backend-fail-invalidpath' => '$1 не является допустимым путём хранения.',
 'backend-fail-delete' => 'Не удалось удалить файл  $1.',
+'backend-fail-describe' => 'Не удалось изменить метаданные файла «$1».',
 'backend-fail-alreadyexists' => 'Файл $1 уже существует.',
 'backend-fail-store' => 'Не удалось сохранить файл $1 на $2 .',
 'backend-fail-copy' => 'Не удалось скопировать файл $1 в $2 .',
@@ -1978,7 +1995,7 @@ $1',
 # ZipDirectoryReader
 'zip-file-open-error' => 'Произошла ошибка при открытии файла для проверки архива.',
 'zip-wrong-format' => 'Указанный файл не является файлом ZIP.',
-'zip-bad' => 'ZIP-файл повреждён, или не может быть прочитан.
+'zip-bad' => 'ZIP-файл повреждён или не может быть прочитан.
 Он не может быть должным образом проверен.',
 'zip-unsupported' => 'Этот ZIP-файл использует возможности, не поддерживаемые MediaWiki.
 Он не может быть должным образом проверен.',
@@ -2090,7 +2107,7 @@ $1',
 'shared-repo-from' => 'из $1',
 'shared-repo' => 'общего хранилища',
 'shared-repo-name-wikimediacommons' => 'Викисклада',
-'upload-disallowed-here' => 'Ð\9a Ñ\81ожалениÑ\8e, Ð²Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80езапиÑ\81аÑ\82Ñ\8c Ñ\8dÑ\82о Ð¸Ð·Ð¾Ð±Ñ\80ажение.',
+'upload-disallowed-here' => 'Ð\92Ñ\8b Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80езапиÑ\81аÑ\82Ñ\8c Ñ\8dÑ\82оÑ\82 Ñ\84айл.',
 
 # File reversion
 'filerevert' => 'Возврат к старой версии $1',
@@ -2188,9 +2205,9 @@ $1',
 'brokenredirects-edit' => 'править',
 'brokenredirects-delete' => 'удалить',
 
-'withoutinterwiki' => 'СÑ\82Ñ\80аниÑ\86Ñ\8b Ð±ÐµÐ· Ð¼ÐµÐ¶Ñ\8aÑ\8fзÑ\8bковÑ\8bÑ\85 ссылок',
+'withoutinterwiki' => 'СÑ\82Ñ\80аниÑ\86Ñ\8b Ð±ÐµÐ· Ð¸Ð½Ñ\82еÑ\80вики-ссылок',
 'withoutinterwiki-summary' => 'Следующие страницы не имеют интервики-ссылок:',
-'withoutinterwiki-legend' => 'Ð\9fÑ\80иÑ\81Ñ\82авка',
+'withoutinterwiki-legend' => 'Ð\9fÑ\80еÑ\84икÑ\81',
 'withoutinterwiki-submit' => 'Показать',
 
 'fewestrevisions' => 'Страницы с наименьшим количеством версий',
@@ -2227,7 +2244,7 @@ $1',
 'mostlinkedtemplates' => 'Самые используемые шаблоны',
 'mostcategories' => 'Страницы, включённые в большое количество категорий',
 'mostimages' => 'Самые используемые файлы',
-'mostinterwikis' => 'СÑ\82Ñ\80аниÑ\86Ñ\8b Ñ\81 Ð½Ð°Ð¸Ð±Ð¾Ð»Ñ\8cÑ\88им Ñ\87иÑ\81лом Ð¼ÐµÐ¶Ñ\8aÑ\8fзÑ\8bковÑ\8bÑ\85 ссылок',
+'mostinterwikis' => 'СÑ\82Ñ\80аниÑ\86Ñ\8b Ñ\81 Ð½Ð°Ð¸Ð±Ð¾Ð»Ñ\8cÑ\88им Ñ\87иÑ\81лом Ð¸Ð½Ñ\82еÑ\80вики-ссылок',
 'mostrevisions' => 'Наиболее часто редактировавшиеся страницы',
 'prefixindex' => 'Указатель по началу названий страниц',
 'prefixindex-namespace' => 'Указатель по началу страниц (пространство имён «{{ns:$1}}»)',
@@ -2328,7 +2345,7 @@ $1',
 'linksearch-ok' => 'Найти',
 'linksearch-text' => 'Можно использовать подстановочные символы, например, <code>*.wikipedia.org</code>.
 Необходим по крайней мере домен верхнего уровня, например <code>*.org</code><br />
\9fоддеÑ\80живаемÑ\8bе Ð¿Ñ\80оÑ\82околÑ\8b: <code>$1</code> (не Ð´Ð¾Ð±Ð°Ð²Ð»Ñ\8fÑ\82Ñ\8c Ð»Ñ\8eбой Ð¸Ð· Ð½Ð¸Ñ\85 Ð² Ð²Ð°Ñ\88ем Ð¿Ð¾Ð¸Ñ\81ке)',
\9fоддеÑ\80живаемÑ\8bе Ð¿Ñ\80оÑ\82околÑ\8b: <code>$1</code> (по Ñ\83молÑ\87аниÑ\8e Ð¿Ð¾Ð´Ñ\81Ñ\82авлÑ\8fеÑ\82Ñ\81Ñ\8f http://, ÐµÑ\81ли Ð¿Ñ\80оÑ\82окол Ñ\8fвно Ð½Ðµ Ð·Ð°Ð´Ð°Ð½).',
 'linksearch-line' => 'Ссылка на $1 из $2',
 'linksearch-error' => 'Подстановочные символы могут использоваться только в начале адресов.',
 
@@ -2360,7 +2377,7 @@ $1',
 'listgrouprights-group' => 'Группа',
 'listgrouprights-rights' => 'Права',
 'listgrouprights-helppage' => 'Help:Права групп',
-'listgrouprights-members' => '(список группы)',
+'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',
@@ -2379,7 +2396,7 @@ $1',
 'emailuser-title-target' => 'Написание электронного письма {{GENDER:$1|участнику|участнице}}',
 'emailuser-title-notarget' => 'Написание электронного письма участнику',
 'emailpage' => 'Письмо участнику',
-'emailpagetext' => 'С помощью данной формы можно отправить сообщение на адрес электронной почты этого участника.
+'emailpagetext' => 'С помощью данной формы можно отправить сообщение на адрес электронной почты {{GENDER:$1|этого участника|этой участницы}}.
 В качестве обратного адреса будет указан тот адрес, который вы указали в [[Special:Preferences|своих настройках]], таким образом получатель будет иметь возможность ответить непосредственно вам.',
 'usermailererror' => 'При отправке сообщения электронной почты произошла ошибка:',
 'defemailsubject' => '{{SITENAME}} — Письмо от $1',
@@ -2447,19 +2464,23 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} Служба извещений по почте',
 'enotif_reset' => 'Отметить все страницы как просмотренные',
-'enotif_newpagetext' => 'Это новая страница.',
 'enotif_impersonal_salutation' => 'Участник {{grammar:genitive|{{SITENAME}}}}',
-'changed' => 'изменена',
-'created' => 'создана',
-'enotif_subject' => 'Страница проекта «{{SITENAME}}» $PAGETITLE была $CHANGEDORCREATED участником $PAGEEDITOR',
+'enotif_subject_deleted' => 'Страница проекта «{{SITENAME}}» с именем «$1» была удалена {{gender:$2|участником|участницей}} $2',
+'enotif_subject_created' => 'Страница проекта «{{SITENAME}}» с именем «$1» была создана {{gender:$2|участником|участницей}} $2',
+'enotif_subject_moved' => 'Страница проекта «{{SITENAME}}» с именем «$1» была переименована {{gender:$2|участником|участницей}} $2',
+'enotif_subject_restored' => 'Страница проекта «{{SITENAME}}» с именем «$1» была восстановлена {{gender:$2|участником|участницей}} $2',
+'enotif_subject_changed' => 'Страница проекта «{{SITENAME}}» с именем «$1» была изменена {{gender:$2|участником|участницей}} $2',
+'enotif_body_intro_deleted' => '$PAGEEDITDATE {{gender:$2|участником|участницей}} $2 была удалена страница проекта «{{SITENAME}}» с именем «$1», см. текущую версию по ссылке: $3',
+'enotif_body_intro_created' => '$PAGEEDITDATE {{gender:$2|участником|участницей}} $2 была создана страница проекта «{{SITENAME}}» с именем «$1», см. текущую версию по ссылке: $3',
+'enotif_body_intro_moved' => '$PAGEEDITDATE {{gender:$2|участником|участницей}} $2 была переименована страница проекта «{{SITENAME}}» с именем «$1», см. текущую версию по ссылке: $3',
+'enotif_body_intro_restored' => '$PAGEEDITDATE {{gender:$2|участником|участницей}} $2 была восстановлена страница проекта «{{SITENAME}}» с именем «$1», см. текущую версию по ссылке: $3',
+'enotif_body_intro_changed' => '$PAGEEDITDATE {{gender:$2|участником|участницей}} $2 была изменена страница проекта «{{SITENAME}}» с именем «$1», см. текущую версию по ссылке: $3',
 'enotif_lastvisited' => 'См. $1 для просмотра всех изменений, произошедших с вашего последнего посещения.',
 'enotif_lastdiff' => 'См. $1 для ознакомления с изменением.',
 'enotif_anon_editor' => 'анонимный участник $1',
-'enotif_body' => 'Уважаемый(ая) $WATCHINGUSERNAME,
-
-$PAGEEDITDATE страница проекта «{{SITENAME}}» $PAGETITLE была $CHANGEDORCREATED участником $PAGEEDITOR, см. $PAGETITLE_URL для просмотра текущей версии.
+'enotif_body' => 'Здравствуйте, $WATCHINGUSERNAME!
 
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Краткое описание изменения: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2467,8 +2488,7 @@ $NEWPAGE
 эл. почта: $PAGEEDITOR_EMAIL
 вики: $PAGEEDITOR_WIKI
 
-Если вы не посетите эту страницу, то в случае её дальнейших изменений уведомлений больше не будет.
-Вы можете также отключить опцию уведомления для всех страниц в вашем списке наблюдения.
+Если вы не посетите эту страницу, то в случае её дальнейших изменений уведомлений больше не будет. Вы можете также отключить опцию уведомления для всех страниц в вашем списке наблюдения.
 
              Система оповещения {{grammar:genitive|{{SITENAME}}}}
 
@@ -2583,7 +2603,7 @@ $UNWATCHURL
 'protect-otherreason' => 'Другая причина/дополнение:',
 'protect-otherreason-op' => 'Другая причина',
 'protect-dropdown' => '* Типовые причины защиты
-** заядлый вандализм
+** частый вандализм
 ** чрезмерный спам
 ** непродуктивная война правок
 ** популярная страница',
@@ -2611,7 +2631,7 @@ $UNWATCHURL
 'undeletepage' => 'Просмотр и восстановление удалённых страниц',
 'undeletepagetitle' => "'''Ниже перечислены удалённые версии страницы [[:$1]]'''.",
 'viewdeletedpage' => 'Просмотр удалённых страниц',
-'undeletepagetext' => '{{PLURAL:$1|Следующая $1 страница была удалена|Следующие $1 страницы были удалены|Следующие $1 страниц были удалены}}, однако {{PLURAL:$1|она всё ещё находятся в архиве, и поэтому может быть восстановлена|они всё ещё находятся в архиве, и поэтому могут быть восстановлены}}.
+'undeletepagetext' => '{{PLURAL:$1|Следующая $1 страница была удалена|Следующие $1 страницы были удалены|Следующие $1 страниц были удалены}}, однако {{PLURAL:$1|она всё ещё находится в архиве и поэтому может быть восстановлена|они всё ещё находятся в архиве и поэтому могут быть восстановлены}}.
 Архив может периодически очищаться.',
 'undelete-fieldset-title' => 'Восстановить версии',
 'undeleteextrahelp' => "Для полного восстановления истории страницы оставьте все отметки пустыми и нажмите '''«{{int:undeletebtn}}»'''.
@@ -2634,7 +2654,8 @@ $UNWATCHURL
 'undeletedrevisions' => '$1 {{PLURAL:$1|изменение|изменения|изменений}} восстановлено',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|версия|версии|версий}} и $2 {{PLURAL:$2|файл|файла|файлов}} восстановлено',
 'undeletedfiles' => '$1 {{PLURAL:$1|файл восстановлен|файла восстановлено|файлов восстановлено}}',
-'cannotundelete' => 'Ошибка восстановления. Возможно, кто-то другой уже восстановил страницу.',
+'cannotundelete' => 'Ошибка восстановления:
+$1',
 'undeletedpage' => "'''Страница «$1» была восстановлена.'''
 
 Для просмотра списка последних удалений и восстановлений см. [[Special:Log/delete|журнал удалений]].",
@@ -2665,12 +2686,12 @@ $1',
 'blanknamespace' => '(основное)',
 
 # Contributions
-'contributions' => 'Вклад участника',
+'contributions' => 'Вклад {{GENDER:$1|участника|участницы}}',
 'contributions-title' => 'Вклад {{GENDER:$1|участника|участницы}} $1',
-'mycontris' => 'Ð\9cой Ð²клад',
+'mycontris' => 'Ð\92клад',
 'contribsub2' => 'Вклад $1 ($2)',
 'nocontribs' => 'Изменений, соответствующих заданным условиям, найдено не было.',
-'uctop' => ' (последняя)',
+'uctop' => '(последняя)',
 'month' => 'С месяца (и ранее):',
 'year' => 'С года (и ранее):',
 
@@ -2701,13 +2722,13 @@ $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 включения',
 'whatlinkshere-hidelinks' => '$1 ссылки',
-'whatlinkshere-hideimages' => '$1 Ñ\81Ñ\81Ñ\8bлки Ð´Ð»Ñ\8f Ð¸Ð·Ð¾Ð±Ñ\80ажений',
+'whatlinkshere-hideimages' => '$1 Ñ\84айловÑ\8bе Ñ\81Ñ\81Ñ\8bлки',
 'whatlinkshere-filters' => 'Фильтры',
 
 # Block/unblock
@@ -2938,6 +2959,7 @@ $1',
 'immobile-target-namespace-iw' => 'Ссылка интервики не может быть использована для переименования.',
 'immobile-source-page' => 'Эту страницу нельзя переименовать.',
 'immobile-target-page' => 'Нельзя присвоить странице это имя.',
+'bad-target-model' => 'Невозможно преобразовать $1 в $2: несовместимые модели данных.',
 'imagenocrossnamespace' => 'Невозможно дать файлу имя из другого пространства имён',
 'nonfile-cannot-move-to-file' => 'Невозможно переименовывать страницы в файлы',
 'imagetypemismatch' => 'Новое расширение файла не соответствует его типу',
@@ -2987,7 +3009,7 @@ $1',
 'allmessages-filter-unmodified' => 'Неизменённые',
 'allmessages-filter-all' => 'Все',
 'allmessages-filter-modified' => 'Изменённые',
-'allmessages-prefix' => 'ФилÑ\8cÑ\82Ñ\80 Ð¿Ð¾ Ð¿Ñ\80иÑ\81Ñ\82авке:',
+'allmessages-prefix' => 'ФилÑ\8cÑ\82Ñ\80 Ð¿Ð¾ Ð¿Ñ\80еÑ\84икÑ\81Ñ\83:',
 'allmessages-language' => 'Язык:',
 'allmessages-filter-submit' => 'Перейти',
 
@@ -3003,7 +3025,7 @@ $1',
 'thumbnail_dest_directory' => 'Невозможно создать целевую директорию',
 'thumbnail_image-type' => 'Данный тип изображения не поддерживается',
 'thumbnail_gd-library' => 'Неполная конфигурация библиотеки GD, отсутствует функция $1',
-'thumbnail_image-missing' => 'По видимому, отсутствует файл $1',
+'thumbnail_image-missing' => 'По-видимому, отсутствует файл $1',
 
 # Special:Import
 'import' => 'Импортирование страниц',
@@ -3023,7 +3045,7 @@ $1',
 'importstart' => 'Импортирование страниц…',
 'import-revision-count' => '$1 {{PLURAL:$1|версия|версии|версий}}',
 'importnopages' => 'Нет страниц для импортирования.',
-'imported-log-entries' => '{{PLURAL:$1|Импортирована $1 запись журнала|Импортировано $1 записи журнала|Импортировано $1 записей журнала}}.',
+'imported-log-entries' => '{{PLURAL:$1|Импортирована $1 запись|Импортировано $1 записи|Импортировано $1 записей}} журнала.',
 'importfailed' => 'Не удалось импортировать: $1',
 'importunknownsource' => 'Неизвестный тип импортируемой страницы',
 'importcantopen' => 'Невозможно открыть импортируемый файл',
@@ -3062,7 +3084,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Проверка JavaScript',
-'javascripttest-disabled' => 'Эта функция отключена в этой вики.',
 'javascripttest-title' => 'Проводится проверка $1',
 'javascripttest-pagetext-noframework' => 'Эта страница зарезервирована для запуска JavaScript-тестов.',
 'javascripttest-pagetext-unknownframework' => 'Неизвестная среда тестирования «$1».',
@@ -3074,7 +3095,7 @@ $1',
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Ваша страница участника',
 'tooltip-pt-anonuserpage' => 'Страница участника для моего IP',
-'tooltip-pt-mytalk' => 'Ваша страница обсуждений',
+'tooltip-pt-mytalk' => 'Ваша страница обсуждения',
 'tooltip-pt-anontalk' => 'Страница обсуждений для моего IP',
 'tooltip-pt-preferences' => 'Ваши настройки',
 'tooltip-pt-watchlist' => 'Список страниц, изменения в которых вы отслеживаете',
@@ -3082,8 +3103,8 @@ $1',
 'tooltip-pt-login' => 'Здесь можно зарегистрироваться в системе, но это необязательно.',
 'tooltip-pt-anonlogin' => 'Здесь можно зарегистрироваться в системе, но это необязательно.',
 'tooltip-pt-logout' => 'Завершить сеанс работы',
-'tooltip-ca-talk' => 'Обсуждение содержания страницы',
-'tooltip-ca-edit' => 'ЭÑ\82Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¼Ð¾Ð¶Ð½Ð¾ Ð¸Ð·Ð¼ÐµÐ½Ñ\8fÑ\82Ñ\8c. Ð\98Ñ\81полÑ\8cзÑ\83йÑ\82е, Ð¿Ð¾Ð¶Ð°Ð»Ñ\83йÑ\81Ñ\82а, Ð¿Ñ\80едваÑ\80иÑ\82елÑ\8cнÑ\8bй Ð¿Ñ\80оÑ\81моÑ\82Ñ\80 Ð¿ÐµÑ\80ед Ñ\81оÑ\85Ñ\80анением',
+'tooltip-ca-talk' => 'Обсуждение основной страницы',
+'tooltip-ca-edit' => 'Ð\92Ñ\8b Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\80едакÑ\82иÑ\80оваÑ\82Ñ\8c Ñ\8dÑ\82Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83. Ð\9fеÑ\80ед Ñ\82ем, ÐºÐ°Ðº Ð·Ð°Ð¿Ð¸Ñ\81аÑ\82Ñ\8c Ñ\81вои Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ\8f, Ð²Ð¾Ñ\81полÑ\8cзÑ\83йÑ\82еÑ\81Ñ\8c, Ð¿Ð¾Ð¶Ð°Ð»Ñ\83йÑ\81Ñ\82а, ÐºÐ½Ð¾Ð¿ÐºÐ¾Ð¹ Ð¿Ñ\80едваÑ\80иÑ\82елÑ\8cного Ð¿Ñ\80оÑ\81моÑ\82Ñ\80а.',
 'tooltip-ca-addsection' => 'Создать новый раздел',
 'tooltip-ca-viewsource' => 'Эта страница защищена от изменений, но вы можете посмотреть и скопировать её исходный текст',
 'tooltip-ca-history' => 'Журнал изменений страницы',
@@ -3094,28 +3115,28 @@ $1',
 'tooltip-ca-move' => 'Переименовать страницу',
 'tooltip-ca-watch' => 'Добавить эту страницу в ваш список наблюдения',
 'tooltip-ca-unwatch' => 'Удалить эту страницу из вашего списка наблюдения',
-'tooltip-search' => 'Искать это слово',
+'tooltip-search' => 'Искать в {{grammar:genitive|{{SITENAME}}}}',
 'tooltip-search-go' => 'Перейти к странице, имеющей в точности такое название',
 'tooltip-search-fulltext' => 'Найти страницы, содержащие указанный текст',
-'tooltip-p-logo' => 'Ð\97аглавнаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а',
+'tooltip-p-logo' => 'Ð\9fеÑ\80ейÑ\82и Ð½Ð° Ð·Ð°Ð³Ð»Ð°Ð²Ð½Ñ\83Ñ\8e Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83',
 'tooltip-n-mainpage' => 'Перейти на заглавную страницу',
 'tooltip-n-mainpage-description' => 'Перейти на заглавную страницу',
-'tooltip-n-portal' => 'О проекте, о том, что вы можете сделать, где что находится',
-'tooltip-n-currentevents' => 'СпиÑ\81ок Ñ\82екÑ\83Ñ\89иÑ\85 Ñ\81обÑ\8bÑ\82ий',
+'tooltip-n-portal' => 'О проекте, о том, чем здесь можно заниматься, а также — где что находится',
+'tooltip-n-currentevents' => 'Ð\98нÑ\84оÑ\80маÑ\86иÑ\8f Ð¾ Ñ\82екÑ\83Ñ\89иÑ\85 Ñ\81обÑ\8bÑ\82иÑ\8fÑ\85',
 'tooltip-n-recentchanges' => 'Список последних изменений',
-'tooltip-n-randompage' => 'Посмотреть случайную страницу',
-'tooltip-n-help' => 'СпÑ\80авоÑ\87ник Ð¿Ð¾ Ð¿Ñ\80оекÑ\82Ñ\83 Â«{{SITENAME}}»',
-'tooltip-t-whatlinkshere' => 'Список всех страниц, которые ссылаются на эту страницу',
+'tooltip-n-randompage' => 'Посмотреть случайно выбранную страницу',
+'tooltip-n-help' => 'Ð\9cеÑ\81Ñ\82о, Ð³Ð´Ðµ Ð¼Ð¾Ð¶Ð½Ð¾ Ð¿Ð¾Ð»Ñ\83Ñ\87иÑ\82Ñ\8c Ñ\81пÑ\80авкÑ\83',
+'tooltip-t-whatlinkshere' => 'Список всех страниц, ссылающихся на данную',
 'tooltip-t-recentchangeslinked' => 'Последние изменения в страницах, на которые ссылается эта страница',
 'tooltip-feed-rss' => 'Трансляция в RSS для этой страницы',
 'tooltip-feed-atom' => 'Трансляция в Atom для этой страницы',
 'tooltip-t-contributions' => 'Список страниц, которые изменял этот участник',
 'tooltip-t-emailuser' => 'Отправить письмо этому участнику',
-'tooltip-t-upload' => 'Загрузить изображения или мультимедиа-файлы',
+'tooltip-t-upload' => 'Загрузить файлы',
 'tooltip-t-specialpages' => 'Список служебных страниц',
 'tooltip-t-print' => 'Версия этой страницы для печати',
 'tooltip-t-permalink' => 'Постоянная ссылка на эту версию страницы',
-'tooltip-ca-nstab-main' => 'СодеÑ\80жание Ñ\81Ñ\82аÑ\82Ñ\8cи',
+'tooltip-ca-nstab-main' => 'Ð\9fÑ\80оÑ\81моÑ\82Ñ\80 Ð¾Ñ\81новной Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\8b',
 'tooltip-ca-nstab-user' => 'Персональная страница участника',
 'tooltip-ca-nstab-media' => 'Медиа-файл',
 'tooltip-ca-nstab-special' => 'Это служебная страница, она недоступна для редактирования',
@@ -3127,7 +3148,7 @@ $1',
 'tooltip-ca-nstab-category' => 'Страница категории',
 'tooltip-minoredit' => 'Отметить это изменение как незначительное',
 'tooltip-save' => 'Сохранить ваши изменения',
-'tooltip-preview' => 'Предварительный просмотр страницы, пожалуйста, используйте перед сохранением!',
+'tooltip-preview' => 'Предварительный просмотр страницы; пожалуйста, используйте его перед сохранением!',
 'tooltip-diff' => 'Показать изменения, сделанные по отношению к исходному тексту.',
 'tooltip-compareselectedversions' => 'Посмотреть разницу между двумя выбранными версиями этой страницы.',
 'tooltip-watch' => 'Добавить эту страницу в свой список наблюдения',
@@ -3203,6 +3224,7 @@ The wiki server can't provide data in a format your client can read.",
 
 # Info page
 'pageinfo-title' => 'Сведения по «$1»',
+'pageinfo-not-current' => 'К сожалению, невозможно предоставить эту информацию для старых версий.',
 'pageinfo-header-basic' => 'Основные сведения',
 'pageinfo-header-edits' => 'История изменений',
 'pageinfo-header-restrictions' => 'Защита страницы',
@@ -3211,14 +3233,16 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-default-sort' => 'Ключ сортировки по умолчанию',
 'pageinfo-length' => 'Длина страницы (в байтах)',
 'pageinfo-article-id' => 'Идентификатор страницы',
+'pageinfo-language' => 'Язык страницы',
 'pageinfo-robot-policy' => 'Индексация поисковыми службами',
 'pageinfo-robot-index' => 'Индексируется',
 'pageinfo-robot-noindex' => 'Не индексируется',
 'pageinfo-views' => 'Количество просмотров',
 'pageinfo-watchers' => 'Число наблюдающих',
 'pageinfo-redirects-name' => 'Перенаправления на эту страницу',
+'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Подстраницы данной страницы',
-'pageinfo-subpages-value' => '$1($2 {{PLURAL:$2|перенаправление|перенаправления|перенаправлений}}; $3 {{PLURAL:$3|обычная|обычные|обычных}})',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|перенаправление|перенаправления|перенаправлений}}; $3 {{PLURAL:$3|обычная|обычные|обычных}})',
 'pageinfo-firstuser' => 'Создатель страницы',
 'pageinfo-firsttime' => 'Дата создания страницы',
 'pageinfo-lastuser' => 'Последний редактор',
@@ -3227,10 +3251,17 @@ The wiki server can't provide data in a format your client can read.",
 'pageinfo-authors' => 'Общее число различных авторов',
 'pageinfo-recent-edits' => 'Правок за последнее время (в течение $1)',
 'pageinfo-recent-authors' => 'Уникальных авторов за последнее время',
-'pageinfo-restriction' => 'Защита страницы ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Магическое слово|Магические слова}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Скрытая категория|Скрытых категорий}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Шаблон|Шаблонов}} ($1)',
+'pageinfo-toolboxlink' => 'Сведения о странице',
+'pageinfo-redirectsto' => 'Перенаправление',
+'pageinfo-redirectsto-info' => 'сведения',
+'pageinfo-contentpage' => 'Учитывается счётчиком как содержательная страница',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading' => 'Каскадная защита отсюда',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-protect-cascading-from' => 'Каскадная защита от',
 
 # Skin names
 'skinname-standard' => 'Классическое',
@@ -3252,6 +3283,8 @@ The wiki server can't provide data in a format your client can read.",
 'markedaspatrollederror' => 'Невозможно отметить как проверенную',
 'markedaspatrollederrortext' => 'Вы должны указать версию, которая будет отмечена как проверенная.',
 'markedaspatrollederror-noautopatrol' => 'Вам не разрешено отмечать собственные правки как проверенные.',
+'markedaspatrollednotify' => 'Это изменение на странице «$1» было отмечено как проверенное.',
+'markedaspatrollederrornotify' => 'Отметить изменение как проверенное не удалось.',
 
 # Patrol log
 'patrol-log-page' => 'Журнал патрулирования',
@@ -3295,13 +3328,13 @@ $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-изображений высокого разрешения не анимируются.'''",
+'file-no-thumb-animation' => "'''Примечание. По техническим причинам миниатюры этого файла не будет анимироваться.'''",
+'file-no-thumb-animation-gif' => "'''Примечание. По техническим причинам миниатюры подобных GIF-изображений высокого разрешения не анимируются.'''",
 
 # Special:NewFiles
 'newimages' => 'Галерея новых файлов',
 'imagelisttext' => "Ниже представлен список из '''$1''' {{PLURAL:$1|файла|файлов|файлов}}, отсортированных $2.",
-'newimages-summary' => 'ЭÑ\82а Ñ\81лÑ\83жебнаÑ\8f Ñ\81Ñ\82Ñ\80аниÑ\86а Ð¿Ð¾ÐºÐ°Ð·Ñ\8bваеÑ\82 недавно загруженные файлы.',
+'newimages-summary' => 'Ð\9dа Ñ\8dÑ\82ой Ñ\81лÑ\83жебной Ñ\81Ñ\82Ñ\80аниÑ\86е Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ\8b недавно загруженные файлы.',
 'newimages-legend' => 'Фильтр',
 'newimages-label' => 'Имя файла (или его часть):',
 'showhidebots' => '($1 ботов)',
@@ -3321,6 +3354,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 час|$1 часа|$1 часов}}',
 'days' => '{{PLURAL:$1|$1 день|$1 дня|$1 дней}}',
 'ago' => '$1 назад',
+'just-now' => 'только что',
 
 # Bad image list
 'bad_image_list' => 'Формат должен быть следующим:
@@ -3568,7 +3602,7 @@ $1',
 'exif-exposureprogram-7' => 'Портретный режим (для снимков на близком расстоянии, с фоном не в фокусе)',
 'exif-exposureprogram-8' => 'Пейзажный режим (для пейзажных снимков, с фоном в фокусе)',
 
-'exif-subjectdistance-value' => '$1 метров',
+'exif-subjectdistance-value' => '$1 {{PLURAL:$1|метр|метра|метров}}',
 
 'exif-meteringmode-0' => 'Неизвестно',
 'exif-meteringmode-1' => 'Средний',
@@ -3825,6 +3859,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Интервики-включение отключено]',
 'scarytranscludefailed' => '[Ошибка обращения к шаблону $1]',
+'scarytranscludefailed-httpstatus' => '[Не удалось загрузить шаблон для $1: HTTP $2]',
 'scarytranscludetoolong' => '[Слишком длинный URL]',
 
 # Delete conflict
@@ -3840,7 +3875,7 @@ $5
 # action=purge
 'confirm_purge_button' => 'OK',
 'confirm-purge-top' => 'Очистить кэш этой страницы?',
-'confirm-purge-bottom' => 'После очистки кеша страницы будет показана её последняя версия.',
+'confirm-purge-bottom' => 'После очистки кэша страницы будет показана её последняя версия.',
 
 # action=watch/unwatch
 'confirm-watch-button' => 'ОК',
@@ -3922,8 +3957,8 @@ $5
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Изменения на страницах из списка',
-'watchlisttools-edit' => 'Смотреть/править список',
-'watchlisttools-raw' => 'Ð\9fÑ\80авиÑ\82Ñ\8c ÐºÐ°Ðº текст',
+'watchlisttools-edit' => 'Смотреть и редактировать список',
+'watchlisttools-raw' => 'РедакÑ\82иÑ\80оваÑ\82Ñ\8c ÐºÐ°Ðº Ð¾Ð±Ñ\8bÑ\87нÑ\8bй текст',
 
 # Iranian month names
 'iranian-calendar-m1' => 'Фарвардин',
@@ -4010,6 +4045,7 @@ $5
 'version-license' => 'Лицензия',
 'version-poweredby-credits' => "Эта вики работает на движке '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'другие',
+'version-credits-summary' => 'Хотим поблагодарить следующих участников за их вклад в развитие [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki является свободным программным обеспечением, которое вы можете распространять и/или изменять в соответствии с условиями лицензии GNU General Public License, опубликованной фондом свободного программного обеспечения; второй версии, либо любой более поздней версии.
 
 MediaWiki распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ. См. лицензию GNU General Public License для более подробной информации.
@@ -4047,7 +4083,7 @@ MediaWiki распространяется в надежде, что она бу
 'specialpages-note' => '----
 * Обычные служебные страницы.
 * <span class="mw-specialpagerestricted">Служебные страницы с ограниченным доступом.</span>
-* <span class="mw-specialpagecached">Закешированные служебные страницы (могут быть устаревшими).</span>',
+* <span class="mw-specialpagecached">Закэшированные служебные страницы (могут быть устаревшими).</span>',
 'specialpages-group-maintenance' => 'Отчёты технического обслуживания',
 'specialpages-group-other' => 'Другие служебные страницы',
 'specialpages-group-login' => 'Представиться / Зарегистрироваться',
@@ -4126,17 +4162,17 @@ MediaWiki распространяется в надежде, что она бу
 'sqlite-no-fts' => '$1 без поддержки полнотекстового поиска',
 
 # New logging system
-'logentry-delete-delete' => '$1 удалил страницу $3',
-'logentry-delete-restore' => '$1 восстановил страницу $3',
-'logentry-delete-event' => '$1 изменил видимость {{PLURAL:$5|$5 записи журнала|$5 записей журнала|$5 записей журнала}} на $3: $4',
-'logentry-delete-revision' => '$1 изменил видимость {{PLURAL:$5|$5 версии|$5 версий|$5 версий}} на странице $3: $4',
-'logentry-delete-event-legacy' => '$1 изменил видимость записей журнала $3',
-'logentry-delete-revision-legacy' => '$1 изменил видимость версий на странице $3',
-'logentry-suppress-delete' => '$1 подавил страницу $3',
-'logentry-suppress-event' => '$1 скрытно изменил видимость {{PLURAL:$5|$5 записи журнала|$5 записей журнала|$5 записей журнала}} на $3: $4',
-'logentry-suppress-revision' => '$1 скрытно изменил видимость {{PLURAL:$5|$5 версии|$5 версий|$5 версий}} на странице $3: $4',
-'logentry-suppress-event-legacy' => '$1 скрытно изменил видимость записей журнала $3',
-'logentry-suppress-revision-legacy' => '$1 скрытно изменил видимость версий на странице $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|удалил|удалила}} страницу $3',
+'logentry-delete-restore' => '$1 {{GENDER:$1|восстановил|восстановила}} страницу $3',
+'logentry-delete-event' => '$1 {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
+'logentry-delete-revision' => '$1 {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
+'logentry-delete-event-legacy' => '$1 {{GENDER:$1|изменил|изменила}} видимость записей журнала $3',
+'logentry-delete-revision-legacy' => '$1 {{GENDER:$1|изменил|изменила}} видимость версий на странице $3',
+'logentry-suppress-delete' => '$1 {{GENDER:$1|подавил|подавила}} страницу $3',
+'logentry-suppress-event' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей}} журнала на $3: $4',
+'logentry-suppress-revision' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий}} на странице $3: $4',
+'logentry-suppress-event-legacy' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость записей журнала $3',
+'logentry-suppress-revision-legacy' => '$1 скрытно {{GENDER:$1|изменил|изменила}} видимость версий на странице $3',
 'revdelete-content-hid' => 'содержание скрыто',
 'revdelete-summary-hid' => 'описание правки скрыто',
 'revdelete-uname-hid' => 'имя участника скрыто',
@@ -4145,15 +4181,15 @@ MediaWiki распространяется в надежде, что она бу
 'revdelete-uname-unhid' => 'имя участника раскрыто',
 'revdelete-restricted' => 'ограничения применяются к администраторам',
 'revdelete-unrestricted' => 'ограничения сняты для администраторов',
-'logentry-move-move' => '$1 переименовал страницу $3 в $4',
-'logentry-move-move-noredirect' => '$1 переименовал страницу $3 в $4 без оставления перенаправления',
-'logentry-move-move_redir' => '$1 переименовал страницу $3 в $4 поверх перенаправления',
-'logentry-move-move_redir-noredirect' => '$1 переименовал страницу $3 в $4 поверх перенаправления и без оставления перенаправления',
-'logentry-patrol-patrol' => '$1 отпатрулировал версию $4 страницы $3',
-'logentry-patrol-patrol-auto' => '$1 автоматически отпатрулировал версию $4 страницы $3',
-'logentry-newusers-newusers' => '$1 создал учётную запись участника',
-'logentry-newusers-create' => '$1 создал учётную запись',
-'logentry-newusers-create2' => '$1 создал учётную запись участника $3',
+'logentry-move-move' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 без оставления перенаправления',
+'logentry-move-move_redir' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$1|переименовал|переименовала}} страницу $3 в $4 поверх перенаправления и без оставления перенаправления',
+'logentry-patrol-patrol' => '$1 {{GENDER:$1|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
+'logentry-patrol-patrol-auto' => '$1 автоматически {{GENDER:$1|отпатрулировал|отпатрулировала}} версию $4 страницы $3',
+'logentry-newusers-newusers' => 'Создана учётная запись $1',
+'logentry-newusers-create' => 'Создана учётная запись $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|создал|создала}} учётную запись для $3',
 'logentry-newusers-autocreate' => 'Автоматически создана учётная запись $1',
 'newuserlog-byemail' => 'пароль отправлен по эл. почте',
 
@@ -4170,9 +4206,13 @@ MediaWiki распространяется в надежде, что она бу
 'feedback-error3' => 'Ошибка. Нет ответа от API',
 'feedback-thanks' => 'Спасибо! Ваш отзыв размещён на странице «[$2 $1]».',
 'feedback-close' => 'Готово',
-'feedback-bugcheck' => 'Ð\9fÑ\80екÑ\80аÑ\81но! Ð¢Ð¾Ð»Ñ\8cко Ð¿Ñ\80овеÑ\80Ñ\8cÑ\82е, Ñ\87Ñ\82о Ð² Ñ\81пиÑ\81ке [$1 Ð¸Ð·Ð²ÐµÑ\81Ñ\82нÑ\8bÑ\85 Ð¾Ñ\88ибок] ÐµÑ\91 Ð½ÐµÑ\82 Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾Ð¹ Ð·Ð°Ð¿Ð¸Ñ\81и.',
+'feedback-bugcheck' => 'Прекрасно! Только проверьте, что в списке [$1 известных ошибок] нет подобной записи.',
 'feedback-bugnew' => 'Я проверил. Сообщить о новой ошибке',
 
+# Search suggestions
+'searchsuggest-search' => 'Поиск',
+'searchsuggest-containing' => 'содержащие…',
+
 # API errors
 'api-error-badaccess-groups' => 'Вам не разрешено загружать файлы в эту вики.',
 'api-error-badtoken' => 'Внутренняя ошибка:  некорректный токен.',
@@ -4221,8 +4261,10 @@ MediaWiki распространяется в надежде, что она бу
 'duration-days' => '$1 {{PLURAL:$1|день|дня|дней}}',
 'duration-weeks' => '$1 {{PLURAL:$1|неделя|недели|недель}}',
 'duration-years' => '$1 {{PLURAL:$1|год|года|лет}}',
-'duration-decades' => '$1 {{PLURAL:$1|декада|декады|декад}}',
+'duration-decades' => '$1 {{PLURAL:$1|десятилетие|десятилетия|десятилетий}}',
 'duration-centuries' => '$1 {{PLURAL:$1|век|века|веков}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тысячелетие|тысячелетия|тысячелетий}}',
 
+# Unknown messages
+'svg-long-error' => 'неправильный SVG-файл: $1',
 );
index b952907..9808e95 100644 (file)
@@ -132,7 +132,7 @@ $messages = array(
 'tog-editsection' => 'Дозволити едітованя секції сторінкы через одказ [едіт.]',
 'tog-editsectiononrightclick' => 'Дозволити едітованя секції сторінкы через кликаня правов клапков мышкы на надписы сторінок  (JavaScript)',
 'tog-showtoc' => 'Вказовати обсяг (на сторінках з веце як трёма надписами)',
-'tog-rememberpassword' => 'Запамятати моє приголошіня на тім переглядачу (максімално $1 {{PLURAL:$1|день|днів}})',
+'tog-rememberpassword' => 'Запамнятати моє приголошіня на тім переглядачу (максімално $1 {{PLURAL:$1|день|днів}})',
 'tog-watchcreations' => 'Придавати сторінкы створены мнов тай файлы мнов наладованы до мого списку слїдованых',
 'tog-watchdefault' => 'Придавати мнов едітованы сторінкы і файлы до списку слїдованых',
 'tog-watchmoves' => 'Придавати переменованы сторінкы і файлы до мого списку слїдованых',
@@ -166,7 +166,7 @@ $messages = array(
 
 'underline-always' => 'Все',
 'underline-never' => 'Нїґда',
-'underline-default' => 'Хосновати наставлїня переглядача',
+'underline-default' => 'Хосновати наставлїня переглядача або взгляду',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Тіп писма в едітачнім полю:',
@@ -178,7 +178,7 @@ $messages = array(
 # Dates
 'sunday' => 'недїля',
 'monday' => 'понедїлёк',
-'tuesday' => 'віторок',
+'tuesday' => 'вівторок',
 'wednesday' => 'середа',
 'thursday' => 'четверь',
 'friday' => 'пятніця',
@@ -251,8 +251,8 @@ $messages = array(
 'newwindow' => '(отворить ся в новім окнї)',
 'cancel' => 'Зрушыти',
 'moredotdotdot' => 'Детайлнїше…',
-'mypage' => 'Ð\9cоÑ\8f Ñ\81торінка',
-'mytalk' => 'Ð\9cоÑ\8f Ð´іскузія',
+'mypage' => 'Сторінка',
+'mytalk' => 'Ð\94іскузія',
 'anontalk' => 'Діскузія к тїй IP-адресї',
 'navigation' => 'Навіґація',
 'and' => '&#32;і',
@@ -262,7 +262,6 @@ $messages = array(
 'qbbrowse' => 'Переглядати',
 'qbedit' => 'Едітовати',
 'qbpageoptions' => 'Тота сторінка',
-'qbpageinfo' => 'Контекст',
 'qbmyoptions' => 'Мої сторінкы',
 'qbspecialpages' => 'Шпеціалны сторінкы',
 'faq' => 'Часты звідованя',
@@ -275,7 +274,7 @@ $messages = array(
 'vector-action-protect' => 'Всокотити',
 'vector-action-undelete' => 'Обновити',
 'vector-action-unprotect' => 'Змінити замок',
-'vector-simplesearch-preference' => 'Ð\9fоволиÑ\82и Ñ\80оÑ\81Ñ\88Ñ\8bÑ\80енÑ\8b Ð¿Ñ\80опозÑ\96Ñ\86Ñ\96Ñ\97 гляданя (лем взгляд Vector )',
+'vector-simplesearch-preference' => 'Ð\9fоволиÑ\82и Ñ\81пÑ\80оÑ\89ене Ð¿Ð¾Ð»Ðµ гляданя (лем взгляд Vector )',
 'vector-view-create' => 'Створити',
 'vector-view-edit' => 'Едітовати',
 'vector-view-history' => 'Видїти історію',
@@ -285,6 +284,7 @@ $messages = array(
 'namespaces' => 'Просторы назв',
 'variants' => 'Варіанты',
 
+'navigation-heading' => 'Навіґачне меню',
 'errorpagetitle' => 'Хыба',
 'returnto' => 'Навернутя до сторінкы «$1».',
 'tagline' => 'Матеріал з {{grammar:genitive|{{SITENAME}}}}',
@@ -341,7 +341,7 @@ $messages = array(
 'jumptonavigation' => 'навіґація',
 'jumptosearch' => 'Найти',
 'view-pool-error' => 'Перебачте, серверы суть теперь переладованы.
-Тоту сторінку сі теперь пoзерать много хоснователїв.
+Тоту сторінку собі теперь пoзерать много хоснователїв.
 Просиме Вас, почекайте і спробуйте доступность пізнїше.
 
 $1',
@@ -370,7 +370,7 @@ $1',
 'privacypage' => 'Project:Сокочіня пріватных дан',
 
 'badaccess' => 'Брак прав приступу',
-'badaccess-group0' => 'Ð\92ам Ð½Ðµ Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð²Ñ\8bконавати тоту дїю.',
+'badaccess-group0' => 'Ð\92ам Ð½Ðµ Ñ\94 Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ Ð²Ñ\8bконовати тоту дїю.',
 'badaccess-groups' => 'Дїя, яку сьте хотїли зробити, дозволена лем хоснователям з {{PLURAL:$2|ґрупы|ґруп}}: $1.',
 
 'versionrequired' => 'Потрібна MediaWiki верзії $1',
@@ -385,7 +385,7 @@ $1',
 'youhavenewmessagesmanyusers' => 'Мате $1 од много далшых хоснователїв ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|нове повідомлїня|новы повідомлїня}}',
 'newmessagesdifflinkplural' => 'остатня {{PLURAL:$1|зміна|зміны|змін}}',
-'youhavenewmessagesmulti' => 'Ð\9cаÑ\94Ñ\82е Ð½Ð¾Ð²Ñ\8b Ð¾Ð·Ð½Ð°Ð¼Ñ\8b на $1',
+'youhavenewmessagesmulti' => 'Ð\9cаÑ\94Ñ\82е Ð½Ð¾Ð²Ñ\8b Ð¿Ð¾Ð²Ñ\96домлÑ\97нÑ\8f на $1',
 'editsection' => 'едіт.',
 'editold' => 'едіт.',
 'viewsourceold' => 'видїти код',
@@ -492,11 +492,14 @@ $1',
 'viewsource-title' => 'Видїти жрідло сторінкы $1',
 'actionthrottled' => 'Акція была придушена',
 'actionthrottledtext' => 'Взглядом ку протиспамовым крокам не можете жадану акцію провести барз часто в короткім часї. Спробуйте то знову о пару мінут.',
-'protectedpagetext' => 'Тота сторінка была замкнута, также ся не дасть едітовати',
+'protectedpagetext' => 'Тота сторінка была замкнута, жебы не годен быв єй едітовати або інакше мінити.',
 'viewsourcetext' => 'Можете видїти і копіровати код той сторінкы:',
 'viewyourtext' => "Можете собі посмотрити і скопіровати жрідловый текст '''вашых змін''' той сторінкы:",
-'protectedinterface' => 'Тота сторінка є частёв інтрефейсу проґрамового забеспечіня і єй можуть едітовати лем адміністраторы проєкту.',
-'editinginterface' => "'''Увага:''' Едітуєте сторінку,котра є частинов текстового інтерфейсу. Зміны той сторінкы выкличуть зміну інтерфейсу про іншых хоснователїв. Про переклад увідомлїня хоснуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проєкт, што ся занимає локалізаціёв MediaWiki.",
+'protectedinterface' => 'Тота сторінка є частёв інтрефейсу проґрамового забеспечіня той вікі і єй можуть едітовати лем адміністраторы проєкту.
+Жебы придати або змінити переклады, просиме хоснуйте [//translatewiki.net/ translatewiki.net], локалізачный проєкт MediaWiki.',
+'editinginterface' => "'''Позірь:''' Едітуєте сторінку,котра є частинов текстового інтерфейсу.
+Зміны той сторінкы выкличуть зміну інтерфейсу про іншых хоснователїв той вікі. 
+Додати ці змінити переклады на вшыткых вікі просиме хоснуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проєкт, што ся занимать локалізаціов MediaWiki.",
 'sqlhidden' => '(SQL запрос скрытый)',
 'cascadeprotected' => 'Сторінка є замнкута, бо є вложена до  {{PLURAL:$1|наслїдуючой сторінкы замкнуты|наслїдуючіх сторінок замнкнутых|наслїдуючіх сторінок замнкнутых}} каскадовым замком:
 $2',
@@ -521,14 +524,14 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Нынї сьте одголошеный(а).'''
 
-Можете продовжовати в анонімнім перезераню і едітації {{grammar:2sg|{{SITENAME}}}}, або ся можете [[Special:UserLogin|зясь приголосити]] як тот самый або як іншый хоснователь. Даякы сторінкы ся можуть зображовати як кібы сьте были дотеперь приголошены, покы не змажете кеш переглядача.",
-'welcomecreation' => '== Вітаєме вас, $1! ==
-Ваше конто было вытворене.
-Не забудьте змінити свої [[Special:Preferences|наставлїня сайту]].',
+Можете продовжовати в анонімнім перезераню і едітації {{grammar:2sg|{{SITENAME}}}}, або ся можете <span class='plainlinks'>[$1 зясь приголосити]</span> як тот самый або як іншый хоснователь. Даякы сторінкы ся можуть зображовати як кібы сьте были дотеперь приголошены, покы не змажете кеш переглядача.",
+'welcomeuser' => 'Вітайте, $1!',
+'welcomecreation-msg' => 'Ваше конто было вытворене.
+Не забудьте змінити свої [[Special:Preferences|наставлїня {{grammar:2sg|{{SITENAME}}}}]].',
 'yourname' => 'Імя хоснователя:',
 'yourpassword' => 'Гесло:',
 'yourpasswordagain' => 'Повторяйте гесло:',
-'remembermypassword' => 'Запамятати моє приголошіня на тім компютерї (максімално $1 {{PLURAL:$1|день|днів}})',
+'remembermypassword' => 'Запамнятати моє приголошіня на тім компютерї (максімално $1 {{PLURAL:$1|день|днів}})',
 'securelogin-stick-https' => 'Останьте  припоєны через HTTPS по приголошіню',
 'yourdomainname' => 'Ваша домена:',
 'password-change-forbidden' => 'На тій вікі не можете мінити гесла.',
@@ -768,9 +771,8 @@ $2
 Можете [[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-nopermission' => 'Теперь на тій сторінцї тексту не є.
+Можете [[Special:Search/{{PAGENAME}}|глядати тоту назву]] в іншых сторінках, або <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} глядати в лоґах]</span>, но вы не мате права створити тоту сторінку.',
 'missing-revision' => 'Ревізія #$1 сторінкы з назвов „{{PAGENAME}}“ не є.
 
 Гевсе звычайно запрічінене так, же наслїдовали сьте застарїлый історічный одказ на сторінку, котра была уж змазана.
@@ -781,7 +783,6 @@ $2
 Послїднїй запис в лоґах блоковань є такый:',
 'clearyourcache' => "'''Позначка: По уложіню мусите вымазати кеш вашого перезерача, інакше зміны не будете видїти.'''
 '''Mozilla / Firefox / Safari:''' При кликнутю на ''Актуалізовати'' тримайте ''Shift'', або стиснийте ''Ctrl-F5'' або ''Ctrl-R'' (на Macintosh ''Command-R'');
-'''Konqueror''': Кликнийте на ''Актуалізовати'' або стиснийте ''F5'';
 '''Opera:''' Вымажте обсяг кеш в меню ''Інштрументы → Наставлїня'';
 '''Internet Explorer:''' При кликнутю на ''Актуалізовати'' тримайте ''Ctrl'', або стиснийте ''Ctrl-F5''.",
 'usercssyoucanpreview' => "'''Тіп:''' Хоснуйте ґомбічку „{{int:showpreview}}“ про тестованя вашого нового CSS перед уложінём.",
@@ -798,7 +799,7 @@ $2
 'note' => "'''Позначка:'''&nbsp;",
 'previewnote' => "'''Памятайте, же то лем нагляд.'''
 Зміны іщі не суть уложены!",
-'continue-editing' => 'Продовжыти едітованя',
+'continue-editing' => 'Перейти на поле едітованя',
 'previewconflict' => 'Тот нагляд зображує текст так, як буде вызерати по уложіню сторінкы.',
 'session_fail_preview' => "'''Вашу пожадавку ся не удало спрацовати, бо были страчены дата сеансу.
 Просиме, спробуйте то зясь.
@@ -873,6 +874,15 @@ $2
 'edit-no-change' => 'Ваша едітація была іґнорована, бо ся не зробила жадна зміна тексту.',
 'edit-already-exists' => 'Не вдало ся створити нову сторінку, бо она уж існує.',
 'defaultmessagetext' => 'Преднаставленый текст повідомлїня',
+'content-failed-to-parse' => 'Не вдало ся проаналізовати $2 як тіп $1: $3',
+'invalid-content-data' => 'Неприпустны даны',
+'content-not-allowed-here' => 'Обсяг «$1» недозволеный на сторінцї [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'вікітекст',
+'content-model-text' => 'чістый текст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Увага: Тота сторінка обсягує дуже много кликаня выконово тяжкых функцій парсера.
@@ -1029,7 +1039,7 @@ $1",
 'revdelete-only-restricted' => 'Хыба схованя положкы з $2 $1: Не можете положкы сховати лем перед адміністраторами жебы сьте сучасно выбрали і дакотру з далшых можностей затаїня.',
 'revdelete-reason-dropdown' => '*Звыклы причіны змазаня
 ** Порушіня авторьскых прав
-** Невгодны особны дата
+** Ð\9dевгоднÑ\8b ÐºÐ¾Ð¼ÐµÐ½Ñ\82аÑ\80Ñ\97 Ð°Ð±Ð¾ Ð¾Ñ\81обнÑ\8b Ð´Ð°Ñ\82а
 ** Потенціално огварячі дата',
 'revdelete-otherreason' => 'Інша/далша причіна:',
 'revdelete-reasonotherlist' => 'Інша причіна',
@@ -1127,8 +1137,6 @@ $1",
 'search-interwiki-caption' => 'Сестерьскы проєкты',
 'search-interwiki-default' => '$1 резултаты:',
 'search-interwiki-more' => '(веце)',
-'search-mwsuggest-enabled' => 'з порадами',
-'search-mwsuggest-disabled' => 'без порад',
 'search-relatedarticle' => 'Звязаный',
 'mwsuggest-disable' => 'Выпнути пораду AJAX',
 'searcheverything-enable' => 'Глядати во вшыткых просторах назв',
@@ -1225,7 +1233,7 @@ $1",
 'timezoneregion-indian' => 'Індійскый океан',
 'timezoneregion-pacific' => 'Тихый океан',
 'allowemail' => 'Поволити електронічну пошту од іншых хоснователїв',
-'prefs-searchoptions' => 'Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð³ляданя',
+'prefs-searchoptions' => 'Ð\93ляданя',
 'prefs-namespaces' => 'Просторы назв',
 'defaultns' => 'Інакше глядати в такых просторах назв:',
 'default' => 'імпліцітне',
@@ -1395,6 +1403,9 @@ $1",
 'rightslogtext' => 'Тото є протокол зміны прав хоснователїв',
 'rightslogentry' => 'змінив членство в ґрупах про хоснователя $1 з $2 на $3',
 'rightslogentry-autopromote' => 'быв автоматічно повышеный з $2 на $3',
+'logentry-rights-rights' => '$1 {{GENDER:$1|змінив|змінила}} членство в ґрупах про $3 із $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|змінив|змінила}} членство в ґрупах про $3',
+'logentry-rights-autopromote' => '$1 было автоматічно переведено із $4 в $5',
 'rightsnone' => '(жадне)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1615,6 +1626,7 @@ $1',
 'backend-fail-notsame' => 'Неідентичный файл $1 вже існує.',
 'backend-fail-invalidpath' => '$1 є неправилна степка к місцю уложіня.',
 'backend-fail-delete' => 'Не вдало ся вылучіти файл $1.',
+'backend-fail-describe' => 'Не вдало ся змінити метаданы файлу «$1».',
 'backend-fail-alreadyexists' => 'Файл $1 вже існує.',
 'backend-fail-store' => 'Не вдало ся уложыти файл $1 в $2.',
 'backend-fail-copy' => 'Не вдало ся скопіровати файл $1 до $2.',
@@ -1631,7 +1643,7 @@ $1',
 'backend-fail-internal' => 'В кінцёвій уложній сістемі „$1“ ся стала незнама хыба.',
 'backend-fail-contenttype' => 'Не годно было становити тіп обсягу файлу, жебы уложыти го до „$1“.',
 'backend-fail-batchsize' => 'Кінцёве усховище прияло блок з $1 {{PLURAL:файловов операціов|файловыма операціями}};максімум є {{PLURAL:$2|$2}}.',
-'backend-fail-usable' => 'Не вдало ся записати до файлу $1  про брак прав або хыбуючі адресарї/контайнеры.',
+'backend-fail-usable' => 'Не вдало ся чітати з файлу або записати до файлу $1  про брак прав або хыбуючі адресарї/контайнеры.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Не годен ся припоїти к журналовій датабазї усховища «$1».',
@@ -1762,6 +1774,7 @@ $1',
 'uploadnewversion-linktext' => 'Наладовати нову верзію того файлу',
 'shared-repo-from' => 'з $1',
 'shared-repo' => 'здїляного усховіща',
+'upload-disallowed-here' => 'Вы не годны переписовати тот файл.',
 
 # File reversion
 'filerevert' => 'Вернути назад $1',
@@ -1869,6 +1882,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|ревізія|ревізії|ревізій}}',
@@ -1897,6 +1911,7 @@ $1',
 'mostlinkedtemplates' => 'Найужыванїшы шаблоны',
 'mostcategories' => 'Сторінкы з найвекшым чіслом катеґорій',
 'mostimages' => 'Найужыванїшы файлы',
+'mostinterwikis' => 'Сторінкы з найвекшым чіслом міджіязыковых одказів',
 'mostrevisions' => 'Сторінкы з найвеце ревізіями',
 'prefixindex' => 'Вшыткы сторінкы з початком назв',
 'prefixindex-namespace' => 'Вшыткы сторінкы з префіксом (простор назв $1)',
@@ -1996,7 +2011,7 @@ $1',
 'linksearch-ok' => 'Глядати',
 'linksearch-text' => 'Може хосновати заступны сімболы, наприклад „*.wikipedia.org“.<br />
 Повиннов є передовшыткым домена найвысшой уровни, напр. „*.org“.<br />
-Підпорованы протоколы: <code>$1</code>',
+Підпорованы протоколы: <code>$1</code> (кідь не є шпеціфікованый та http://).',
 'linksearch-line' => '$2 одказує на $1',
 'linksearch-error' => 'Заступны сімболы може хосновати лем на початку доменового мена.',
 
@@ -2043,6 +2058,8 @@ $1',
 'mailnologin' => 'Без адресы одосланя',
 'mailnologintext' => 'Кідь хочете посылати ел. пошту іншым хоснователям, мусите ся [[Special:UserLogin|приголосити]] і мати платну адресу ел. пошты в своїм [[Special:Preferences|наставлїню]].',
 'emailuser' => 'Послати імейл тому хоснователёви',
+'emailuser-title-target' => 'Загнати імейл {{GENDER:$1|тому хоснователёви|тій хосновательцї}}',
+'emailuser-title-notarget' => 'Загнати імейл хоснователёви',
 'emailpage' => 'Пошлийте е-пошту',
 'emailpagetext' => 'Помочов ниже зображеного формуларя можете тому хоснователёви послати повідомлїня ел. поштов.
 Адреса ел. пошты, котру мате зазначену в [[Special:Preferences|наставлїня]],ся обявить як адреса одосылателя пошты, жебы вам адресат міг одповісти прямо.',
@@ -2112,11 +2129,7 @@ $1',
 
 'enotif_mailer' => 'Засылач нотіфікацій {{grammar:2sg|{{SITENAME}}}}',
 'enotif_reset' => 'Означіти вшытко як навщівене',
-'enotif_newpagetext' => 'Тото є нова сторінка.',
 'enotif_impersonal_salutation' => 'Хоснователь {{grammar:genitive|{{SITENAME}}}}',
-'changed' => 'змінена',
-'created' => 'створена',
-'enotif_subject' => '$PAGEEDITOR змінив сторінку $PAGETITLE на {{grammar:6sg|{{SITENAME}}}}.',
 'enotif_lastvisited' => 'Видьте $1 про список вшыткых змін од минулой навщівы.',
 'enotif_lastdiff' => 'Тоту зміну видьте на $1',
 'enotif_anon_editor' => 'анонімный хоснователь $1',
@@ -2326,7 +2339,7 @@ $1',
 # Contributions
 'contributions' => 'Приспівок хоснователя',
 'contributions-title' => 'Приспівок хоснователя $1',
-'mycontris' => 'Ð\9cоÑ\97 Ð¿риспівкы',
+'mycontris' => 'Ð\9fриспівкы',
 'contribsub2' => 'Приспівок $1 ($2)',
 'nocontribs' => 'Ненайджены жадны зміны за тыма крітеріями.',
 'uctop' => ' (послїдня)',
@@ -2367,7 +2380,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 напрямлїня',
 'whatlinkshere-hidetrans' => '$1 вложіня',
 'whatlinkshere-hidelinks' => '$1 одказы',
-'whatlinkshere-hideimages' => '$1 Ð²Ð»Ð¾Ð¶Ñ\96нÑ\8f Ñ\84айлÑ\83',
+'whatlinkshere-hideimages' => '$1 Ð¾Ð´ÐºÐ°Ð· Ð½Ð° Ñ\84айл',
 'whatlinkshere-filters' => 'Філтры',
 
 # Block/unblock
@@ -2712,7 +2725,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Тестованя JavaScript',
-'javascripttest-disabled' => 'Тота функція не дозволена на тій вікі.',
 'javascripttest-title' => 'Біжать тест в $1',
 'javascripttest-pagetext-noframework' => 'Тота сторінка є резервована про тестованя JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Незнаный фреймворк тестованя „$1“.',
@@ -2817,11 +2829,18 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Інформація про "$1"',
-'pageinfo-header-edits' => 'Едітованя',
+'pageinfo-header-basic' => 'Основны інформації',
+'pageinfo-header-edits' => 'Історія едітовань',
+'pageinfo-header-restrictions' => 'Замок сторінкы',
+'pageinfo-header-properties' => 'Властности сторінкы',
+'pageinfo-display-title' => 'Вказована назва',
 'pageinfo-views' => 'Чісло переглядів',
-'pageinfo-watchers' => 'Чісло слїдуючіх',
-'pageinfo-edits' => 'Чісло едітовань',
-'pageinfo-authors' => 'Чісло різных авторів',
+'pageinfo-watchers' => 'Кількость слїдуючіх сторінку',
+'pageinfo-redirects-name' => 'Напрямлїня на гевсю сторінку',
+'pageinfo-subpages-name' => 'Підсторінкы гевсёй сторінкы',
+'pageinfo-firstuser' => 'Заснователь сторінкы',
+'pageinfo-edits' => 'Кількость вшыткого едітованя',
+'pageinfo-authors' => 'Вшытка кількость унікатных авторів',
 
 # Patrolling
 'markaspatrolleddiff' => 'Означіти як перевірене',
@@ -3655,6 +3674,10 @@ MediaWiki є дістрібуована в надїї, же буде хосно
 'feedback-bugcheck' => 'Герешнї! Лем перевірьте, ці то не єдна з [$1 уж знамых хыб].',
 'feedback-bugnew' => 'Перевірив(а) єм то. Хочу повідомити нову хыбу.',
 
+# Search suggestions
+'searchsuggest-search' => 'Глядати',
+'searchsuggest-containing' => 'обсягуючій...',
+
 # API errors
 'api-error-badaccess-groups' => 'Не мате дозволено наладововати файлы на тоту вікі.',
 'api-error-badtoken' => 'Внутрїшня хыба: планый знак.',
index 71f24f8..f19be29 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'Dumãnicã',
-'monday'        => 'Lune',
-'tuesday'       => 'Martsã',
-'wednesday'     => 'Njercure',
-'thursday'      => 'Gioia',
-'friday'        => 'Vinirã',
-'saturday'      => 'Sãmbãtã',
-'january'       => 'Yinar',
-'february'      => 'Shcurtu',
-'march'         => 'Martsu',
-'april'         => 'Aprir',
-'may_long'      => 'Mailu',
-'june'          => 'Cirishar',
-'july'          => 'Alunar',
-'august'        => 'Avgustu',
-'september'     => 'Yizmaciunjle',
-'october'       => 'Xumedru',
-'november'      => 'Brumar',
-'december'      => 'Andreulu',
-'january-gen'   => 'Yinar',
-'february-gen'  => 'Shcurtu',
-'march-gen'     => 'Martsu',
-'april-gen'     => 'Aprir',
-'may-gen'       => 'Mailu',
-'june-gen'      => 'Cirishar',
-'july-gen'      => 'Alunar',
-'august-gen'    => 'Avgustu',
+'sunday' => 'Dumãnicã',
+'monday' => 'Lune',
+'tuesday' => 'Martsã',
+'wednesday' => 'Njercure',
+'thursday' => 'Gioia',
+'friday' => 'Vinirã',
+'saturday' => 'Sãmbãtã',
+'january' => 'Yinar',
+'february' => 'Shcurtu',
+'march' => 'Martsu',
+'april' => 'Aprir',
+'may_long' => 'Mailu',
+'june' => 'Cirishar',
+'july' => 'Alunar',
+'august' => 'Avgustu',
+'september' => 'Yizmaciunjle',
+'october' => 'Xumedru',
+'november' => 'Brumar',
+'december' => 'Andreulu',
+'january-gen' => 'Yinar',
+'february-gen' => 'Shcurtu',
+'march-gen' => 'Martsu',
+'april-gen' => 'Aprir',
+'may-gen' => 'Mailu',
+'june-gen' => 'Cirishar',
+'july-gen' => 'Alunar',
+'august-gen' => 'Avgustu',
 'september-gen' => 'Yizmaciunjle',
-'october-gen'   => 'Xumedru',
-'november-gen'  => 'Brumar',
-'december-gen'  => 'Andreulu',
+'october-gen' => 'Xumedru',
+'november-gen' => 'Brumar',
+'december-gen' => 'Andreulu',
 
-'article'    => 'Articlu',
-'cancel'     => 'Alasã',
-'mytalk'     => 'Zburare-a mea',
+'article' => 'Articlu',
+'cancel' => 'Alasã',
+'mytalk' => 'Zburare-a mea',
 'navigation' => 'Navigatsia',
 
 # Cologne Blue skin
-'qbedit'         => 'Alãxiri',
+'qbedit' => 'Alãxiri',
 'qbspecialpages' => 'Frãndzã spetsiale',
 
-'help'             => 'Agiutor',
-'search'           => 'Caftã',
-'searchbutton'     => 'Caftã',
-'go'               => 'Du-vã',
-'searcharticle'    => 'Du-vã',
-'history_short'    => 'Istoria',
+'help' => 'Agiutor',
+'search' => 'Caftã',
+'searchbutton' => 'Caftã',
+'go' => 'Du-vã',
+'searcharticle' => 'Du-vã',
+'history_short' => 'Istoria',
 'printableversion' => 'Verzia ti tipuseare',
-'permalink'        => 'Ligãtura permanentã',
-'edit'             => 'Alãxiri',
-'delete'           => 'Ashcirdzire',
-'protect'          => 'Apurã',
-'talk'             => 'Discusiur',
-'toolbox'          => 'Cutia di hãlate',
-'otherlanguages'   => 'Pi alte limbe',
+'permalink' => 'Ligãtura permanentã',
+'edit' => 'Alãxiri',
+'delete' => 'Ashcirdzire',
+'protect' => 'Apurã',
+'talk' => 'Discusiur',
+'toolbox' => 'Cutia di hãlate',
+'otherlanguages' => 'Pi alte limbe',
 'jumptonavigation' => 'Navigatsia',
-'jumptosearch'     => 'Caftã',
+'jumptosearch' => 'Caftã',
 
 # 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).
-'currentevents'        => 'Evenimente di tora',
-'disclaimers'          => 'Nipricunuschire',
-'edithelp'             => 'Agiutor ti alãxire',
-'mainpage'             => 'Prota frãndzã',
+'currentevents' => 'Evenimente di tora',
+'disclaimers' => 'Nipricunuschire',
+'edithelp' => 'Agiutor ti alãxire',
+'mainpage' => 'Prota frãndzã',
 'mainpage-description' => 'Prota frãndzã',
-'portal'               => 'Portal-a comunitatiljei',
+'portal' => 'Portal-a comunitatiljei',
 
-'newmessageslink'         => 'dimãndare nao',
+'newmessageslink' => 'dimãndare nao',
 'youhavenewmessagesmulti' => 'Avets nãi dimãndãri pi $1',
-'editsection'             => 'Alãxiri',
-'editold'                 => 'Alãxiri',
+'editsection' => 'Alãxiri',
+'editold' => 'Alãxiri',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'     => 'Articlu',
-'nstab-user'     => 'Frãndza-a ufilizitirolui',
+'nstab-main' => 'Articlu',
+'nstab-user' => 'Frãndza-a ufilizitirolui',
 'nstab-template' => 'Shablon',
 
 # General errors
 'viewsource' => 'Videts-u fãntãnã',
 
 # Login and logout pages
-'welcomecreation'    => '== Ghine vinish, $1 ==
+'welcomecreation' => '== Ghine vinish, $1 ==
 
 Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {{SITENAME}}.',
-'yourname'           => 'Numa di ufilizitor:',
-'yourpassword'       => 'Cljao:',
-'yourpasswordagain'  => 'Bãgats-u cljao iara:',
+'yourname' => 'Numa di ufilizitor:',
+'yourpassword' => 'Cljao:',
+'yourpasswordagain' => 'Bãgats-u cljao iara:',
 'remembermypassword' => 'Apurã-u ligãtura-a mea pi compiuterlu aistu (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'              => 'Ligats-vã',
-'userlogin'          => 'Ligats-vã / Fãtsets Isape',
-'logout'             => 'Disligats-vã',
-'userlogout'         => 'Disligats-vã',
-'notloggedin'        => 'Nu hits ligats',
-'createaccount'      => 'Fãtsets Isape',
-'gotaccountlink'     => 'Ligats-vã',
+'login' => 'Ligats-vã',
+'userlogin' => 'Ligats-vã / Fãtsets Isape',
+'logout' => 'Disligats-vã',
+'userlogout' => 'Disligats-vã',
+'notloggedin' => 'Nu hits ligats',
+'createaccount' => 'Fãtsets Isape',
+'gotaccountlink' => 'Ligats-vã',
 
 # Edit pages
-'summary'      => 'Rezime:',
-'minoredit'    => 'Aistã easte alãxire njicã',
-'watchthis'    => 'Mutrits-u frãndzã aistã',
-'savearticle'  => 'Avigljats-u frãndzã',
-'showpreview'  => 'Spuni u-privideare',
-'showdiff'     => 'Spuni le-alãxirle',
+'summary' => 'Rezime:',
+'minoredit' => 'Aistã easte alãxire njicã',
+'watchthis' => 'Mutrits-u frãndzã aistã',
+'savearticle' => 'Avigljats-u frãndzã',
+'showpreview' => 'Spuni u-privideare',
+'showdiff' => 'Spuni le-alãxirle',
 'loginreqlink' => 'Ligats-vã',
 
 # Search results
 'powersearch' => 'Caftã',
 
 # Preferences page
-'preferences'       => 'Alidzerle-a meale',
-'mypreferences'     => 'Alidzerle-a meale',
-'prefsnologin'      => 'Nu hits ligats',
+'preferences' => 'Alidzerle-a meale',
+'mypreferences' => 'Alidzerle-a meale',
+'prefsnologin' => 'Nu hits ligats',
 'searchresultshead' => 'Caftã',
-'youremail'         => 'E-mail:',
-'username'          => 'Numa di ufilizitor:',
+'youremail' => 'E-mail:',
+'username' => 'Numa di ufilizitor:',
 
 # Recent changes
 'recentchanges' => 'Alãxiri',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Alãxiri ligate',
-'recentchangeslinked-feed'    => 'Alãxiri ligate',
+'recentchangeslinked' => 'Alãxiri ligate',
+'recentchangeslinked-feed' => 'Alãxiri ligate',
 'recentchangeslinked-toolbox' => 'Alãxiri ligate',
 
 # Upload
-'upload'          => 'Pitritsets file',
-'uploadbtn'       => 'Pitritsets file',
-'uploadnologin'   => 'Nu hits ligats',
-'filedesc'        => 'Rezime',
+'upload' => 'Pitritsets file',
+'uploadbtn' => 'Pitritsets file',
+'uploadnologin' => 'Nu hits ligats',
+'filedesc' => 'Rezime',
 'watchthisupload' => 'Mutrits-u frãndzã aistã',
 
 # Random page
 'randompage' => 'Frãndzã di nipandicã',
 
-'brokenredirects-edit'   => 'Alãxiri',
+'brokenredirects-edit' => 'Alãxiri',
 'brokenredirects-delete' => 'Ashcirdzire',
 
 # Miscellaneous special pages
 'newpages-username' => 'Numa di ufilizitor:',
-'move'              => 'Tradzets',
-'movethispage'      => 'Tradzets-u frãndza aistã',
+'move' => 'Tradzets',
+'movethispage' => 'Tradzets-u frãndza aistã',
 
 # Book sources
 'booksources-go' => 'Du-vã',
@@ -161,12 +161,12 @@ Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {
 'allpagessubmit' => 'Du-vã',
 
 # Watchlist
-'watchlist'     => 'Lista-a mea di videare',
-'mywatchlist'   => 'Lista-a mea di videare',
-'watchnologin'  => 'Nu hits ligats',
-'watch'         => 'Videts',
+'watchlist' => 'Lista-a mea di videare',
+'mywatchlist' => 'Lista-a mea di videare',
+'watchnologin' => 'Nu hits ligats',
+'watch' => 'Videts',
 'watchthispage' => 'Mutrits-u frãndzã aistã',
-'unwatch'       => 'Azãptãsits videare',
+'unwatch' => 'Azãptãsits videare',
 
 # Protect
 'prot_1movedto2' => '[[$1]] s-trãdzi tu [[$2]]',
@@ -180,7 +180,7 @@ Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {
 
 # Contributions
 'contributions' => 'Ufilizitor:Contributsiur',
-'mycontris'     => 'Contributsiile-a meale',
+'mycontris' => 'Contributsiile-a meale',
 
 'sp-contributions-submit' => 'Caftã',
 
@@ -188,24 +188,24 @@ Isape a vostrã ira adratã. Nu agãrshits s-le alãxits alidzerle-a vostre ti {
 'whatlinkshere' => 'Tsi s-leadze cu aistu',
 
 # Block/unblock
-'ipbreason'          => 'Itia:',
+'ipbreason' => 'Itia:',
 'ipblocklist-submit' => 'Caftã',
 
 # Move page
 'move-page-legend' => 'Tradzets-u frãndzã',
-'movearticle'      => 'Tradzets-u frãndzã:',
-'move-watch'       => 'Mutrits-u frãndzã aistã',
-'movepagebtn'      => 'Tradzets-u frãndzã',
-'movedto'          => 'tradzitã tu',
-'movereason'       => 'Itia:',
+'movearticle' => 'Tradzets-u frãndzã:',
+'move-watch' => 'Mutrits-u frãndzã aistã',
+'movepagebtn' => 'Tradzets-u frãndzã',
+'movedto' => 'tradzitã tu',
+'movereason' => 'Itia:',
 
 # Namespace 8 related
 'allmessages' => 'Dimãndãri systemitse',
 
 # Tooltip help for the actions
 'tooltip-pt-preferences' => 'Alidzerle-a meale',
-'tooltip-pt-logout'      => 'Disligats-vã',
-'tooltip-p-logo'         => 'Prota frãndzã',
+'tooltip-pt-logout' => 'Disligats-vã',
+'tooltip-p-logo' => 'Prota frãndzã',
 
 # Special:NewFiles
 'ilsubmit' => 'Caftã',
index a4d188c..cdc7fbd 100644 (file)
@@ -20,225 +20,225 @@ $messages = array(
 'tog-underline' => 'Сублиниаере легајтулс:',
 
 # Dates
-'sun'           => 'Дум',
-'mon'           => 'Лун',
-'tue'           => 'Мар',
-'wed'           => 'Мие',
-'thu'           => 'Јои',
-'fri'           => 'Вин',
-'sat'           => 'Сам',
-'january'       => 'јануари',
-'february'      => 'февруари',
-'march'         => 'марти',
-'april'         => 'априли',
-'may_long'      => 'мај',
-'june'          => 'јуни',
-'july'          => 'јули',
-'august'        => 'аугуст',
-'september'     => 'септември',
-'october'       => 'октомври',
-'november'      => 'нојември',
-'december'      => 'децембри',
-'january-gen'   => 'јануари',
-'february-gen'  => 'февруари',
-'march-gen'     => 'марти',
-'april-gen'     => 'априли',
-'may-gen'       => 'мај',
-'june-gen'      => 'јуни',
-'july-gen'      => 'јули',
-'august-gen'    => 'аугуст',
+'sun' => 'Дум',
+'mon' => 'Лун',
+'tue' => 'Мар',
+'wed' => 'Мие',
+'thu' => 'Јои',
+'fri' => 'Вин',
+'sat' => 'Сам',
+'january' => 'јануари',
+'february' => 'февруари',
+'march' => 'марти',
+'april' => 'априли',
+'may_long' => 'мај',
+'june' => 'јуни',
+'july' => 'јули',
+'august' => 'аугуст',
+'september' => 'септември',
+'october' => 'октомври',
+'november' => 'нојември',
+'december' => 'децембри',
+'january-gen' => 'јануари',
+'february-gen' => 'февруари',
+'march-gen' => 'марти',
+'april-gen' => 'априли',
+'may-gen' => 'мај',
+'june-gen' => 'јуни',
+'july-gen' => 'јули',
+'august-gen' => 'аугуст',
 'september-gen' => 'септември',
-'october-gen'   => 'октомври',
-'november-gen'  => 'нојември',
-'december-gen'  => 'децември',
-'jan'           => 'јан',
-'feb'           => 'фев',
-'mar'           => 'мар',
-'apr'           => 'апр',
-'may'           => 'мај',
-'jun'           => 'јун',
-'jul'           => 'јул',
-'aug'           => 'ауг',
-'sep'           => 'сеп',
-'oct'           => 'окт',
-'nov'           => 'нов',
-'dec'           => 'дец',
+'october-gen' => 'октомври',
+'november-gen' => 'нојември',
+'december-gen' => 'децември',
+'jan' => 'јан',
+'feb' => 'фев',
+'mar' => 'мар',
+'apr' => 'апр',
+'may' => 'мај',
+'jun' => 'јун',
+'jul' => 'јул',
+'aug' => 'ауг',
+'sep' => 'сеп',
+'oct' => 'окт',
+'nov' => 'нов',
+'dec' => 'дец',
 
 # Categories related messages
-'category_header'        => 'Пажус ен категориа "$1"',
-'subcategories'          => 'Субкатегории',
+'category_header' => 'Пажус ен категориа "$1"',
+'subcategories' => 'Субкатегории',
 'listingcontinuesabbrev' => 'контину',
 
-'about'  => 'Дајпул',
+'about' => 'Дајпул',
 'cancel' => 'ренунтаје',
 'mytalk' => 'Мај дискућу',
 
-'errorpagetitle'   => 'Еру',
-'tagline'          => 'Де {{SITENAME}}',
-'help'             => 'ајутор',
-'search'           => 'каутај',
-'searchbutton'     => 'каутај',
-'searcharticle'    => 'Лие',
-'history'          => 'Хисториа пажус',
+'errorpagetitle' => 'Еру',
+'tagline' => 'Де {{SITENAME}}',
+'help' => 'ајутор',
+'search' => 'каутај',
+'searchbutton' => 'каутај',
+'searcharticle' => 'Лие',
+'history' => 'Хисториа пажус',
 'printableversion' => 'верцион принтаблу',
-'permalink'        => 'Легајтул перманентул',
-'edit'             => 'Едита',
-'editthispage'     => 'Едита це пажу',
-'delete'           => 'Делајре',
-'protect'          => 'Ажатме',
-'newpage'          => 'Пажи нови',
+'permalink' => 'Легајтул перманентул',
+'edit' => 'Едита',
+'editthispage' => 'Едита це пажу',
+'delete' => 'Делајре',
+'protect' => 'Ажатме',
+'newpage' => 'Пажи нови',
 'talkpagelinktext' => 'дискућу',
-'personaltools'    => 'Алатки персоналу',
-'talk'             => 'дискућу',
-'views'            => 'Ви',
-'toolbox'          => 'алатуникул',
-'redirectedfrom'   => '(Редирецћионат де ла $1)',
-'jumpto'           => 'Лиа а:',
+'personaltools' => 'Алатки персоналу',
+'talk' => 'дискућу',
+'views' => 'Ви',
+'toolbox' => 'алатуникул',
+'redirectedfrom' => '(Редирецћионат де ла $1)',
+'jumpto' => 'Лиа а:',
 'jumptonavigation' => 'навигацион',
-'jumptosearch'     => 'каутај',
+'jumptosearch' => 'каутај',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
-'aboutsite'            => 'дајпул {{SITENAME}}',
-'aboutpage'            => 'Project:дајпул {{SITENAME}}',
-'copyrightpage'        => '{{ns:project}}:Права даутору',
-'currentevents'        => 'Тебикору',
-'currentevents-url'    => 'Project:Тебикору',
-'disclaimers'          => 'Тајменулс',
-'disclaimerpage'       => 'Project:тајменул',
-'edithelp'             => 'Ајутор пентре едитаере',
-'edithelppage'         => 'Help:Едитаере',
-'helppage'             => 'Help:Ајутор',
-'mainpage'             => 'Пажу принципу',
+'aboutsite' => 'дајпул {{SITENAME}}',
+'aboutpage' => 'Project:дајпул {{SITENAME}}',
+'copyrightpage' => '{{ns:project}}:Права даутору',
+'currentevents' => 'Тебикору',
+'currentevents-url' => 'Project:Тебикору',
+'disclaimers' => 'Тајменулс',
+'disclaimerpage' => 'Project:тајменул',
+'edithelp' => 'Ајутор пентре едитаере',
+'edithelppage' => 'Help:Едитаере',
+'helppage' => 'Help:Ајутор',
+'mainpage' => 'Пажу принципу',
 'mainpage-description' => 'Пажу принципу',
-'privacy'              => 'Политикмус де лижитул',
-'privacypage'          => 'Project:политикмус де лижитул',
+'privacy' => 'Политикмус де лижитул',
+'privacypage' => 'Project:политикмус де лижитул',
 
-'retrievedfrom'      => 'адусе де "$1"',
+'retrievedfrom' => 'адусе де "$1"',
 'youhavenewmessages' => 'Весес $1 ($2).',
-'newmessageslink'    => 'Месагес новес',
-'editsection'        => 'едитаере',
-'editold'            => 'едита',
-'editsectionhint'    => 'Едитаере ћисецион: $1',
-'toc'                => 'Купринс',
-'showtoc'            => 'аратај',
-'hidetoc'            => 'аскунде',
-'site-rss-feed'      => '$1 RSS фитул',
-'site-atom-feed'     => '$1 Atom фитул',
-'page-rss-feed'      => '"$1" RSS Фитул',
-'page-atom-feed'     => '"$1" Atom Фитул',
+'newmessageslink' => 'Месагес новес',
+'editsection' => 'едитаере',
+'editold' => 'едита',
+'editsectionhint' => 'Едитаере ћисецион: $1',
+'toc' => 'Купринс',
+'showtoc' => 'аратај',
+'hidetoc' => 'аскунде',
+'site-rss-feed' => '$1 RSS фитул',
+'site-atom-feed' => '$1 Atom фитул',
+'page-rss-feed' => '"$1" RSS Фитул',
+'page-atom-feed' => '"$1" Atom Фитул',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-user'     => 'Пажу дутилизатору',
-'nstab-project'  => 'Пројекту',
-'nstab-image'    => 'фиширул',
+'nstab-user' => 'Пажу дутилизатору',
+'nstab-project' => 'Пројекту',
+'nstab-image' => 'фиширул',
 'nstab-category' => 'категориа',
 
 # General errors
 'viewsource' => 'баганаере',
 
 # Login and logout pages
-'yourname'                => 'Ном дутилизатору:',
-'login'                   => 'Приласнаере',
+'yourname' => 'Ном дутилизатору:',
+'login' => 'Приласнаере',
 'nav-login-createaccount' => 'Приласнаере / Нажбе',
-'userlogin'               => 'Приласнаере / креаре нутилизатору',
-'userlogout'              => 'отластаере',
+'userlogin' => 'Приласнаере / креаре нутилизатору',
+'userlogout' => 'отластаере',
 
 # Edit page toolbar
-'bold_sample'     => 'Ескрире алдин',
-'bold_tip'        => 'Ескрире алдин',
-'italic_sample'   => 'Ескрире курсиве',
-'italic_tip'      => 'Ескрире курсиве',
-'link_sample'     => 'Ном с-легајтулс',
-'link_tip'        => 'Легајтул интернул',
-'extlink_sample'  => 'http://www.example.com ном с-легајтулс',
-'extlink_tip'     => 'Легајтул ќстернул (вец префикс http://)',
+'bold_sample' => 'Ескрире алдин',
+'bold_tip' => 'Ескрире алдин',
+'italic_sample' => 'Ескрире курсиве',
+'italic_tip' => 'Ескрире курсиве',
+'link_sample' => 'Ном с-легајтулс',
+'link_tip' => 'Легајтул интернул',
+'extlink_sample' => 'http://www.example.com ном с-легајтулс',
+'extlink_tip' => 'Легајтул ќстернул (вец префикс http://)',
 'headline_sample' => 'Ескрире с-титлус',
-'headline_tip'    => 'Титлу де нивел 2',
-'nowiki_sample'   => 'Интродуца но-Вики иси',
-'nowiki_tip'      => 'Но-Бики клашу',
-'image_tip'       => 'Сантигул инсерат',
-'media_tip'       => 'Легајтул фиширул де медиа',
-'sig_tip'         => 'Утилизаторуном ет дата ет темп',
-'hr_tip'          => 'Линеа оризонтала (еснидивале)',
+'headline_tip' => 'Титлу де нивел 2',
+'nowiki_sample' => 'Интродуца но-Вики иси',
+'nowiki_tip' => 'Но-Бики клашу',
+'image_tip' => 'Сантигул инсерат',
+'media_tip' => 'Легајтул фиширул де медиа',
+'sig_tip' => 'Утилизаторуном ет дата ет темп',
+'hr_tip' => 'Линеа оризонтала (еснидивале)',
 
 # Edit pages
-'summary'                => 'Сумар:',
-'subject'                => 'Субјект / титлур:',
-'minoredit'              => 'Ацеаста есте о едитаре минорај',
-'watchthis'              => 'Клајаере це пажу',
-'showpreview'            => 'Ратај превизуализаре',
-'showdiff'               => 'Аратај шумбајрае',
-'newarticle'             => '(Нова)',
-'editing'                => 'о $1 едитаере',
-'editingsection'         => 'Едитаере $1 (секцион)',
-'copyrightwarning'       => "<!-- Гол деоцамдатај. Вертисментул се флај ен MediaWiki:Summary -->
+'summary' => 'Сумар:',
+'subject' => 'Субјект / титлур:',
+'minoredit' => 'Ацеаста есте о едитаре минорај',
+'watchthis' => 'Клајаере це пажу',
+'showpreview' => 'Ратај превизуализаре',
+'showdiff' => 'Аратај шумбајрае',
+'newarticle' => '(Нова)',
+'editing' => 'о $1 едитаере',
+'editingsection' => 'Едитаере $1 (секцион)',
+'copyrightwarning' => "<!-- Гол деоцамдатај. Вертисментул се флај ен MediaWiki:Summary -->
 Те рог нотари ла дин контрибући ал {{SITENAME}} сунт консидераере релесават супра $2 (суах $1 дин детајс). Аџтеу несав те се тексти сунт едитаере деномерци дет редистрибутаере дин вент, хатае ици.<br /> Ту есте ностре промисаере бонти ус ту скрирсте це се, нега копиаере дин публик домен нега симилари ресорсуе. '''НЕ СУБМИТЕ КОПИЛЕГРУ СКРИЕ САС ПЕРМИћИОН!'''",
-'template-protected'     => '(ажатмат)',
+'template-protected' => '(ажатмат)',
 'template-semiprotected' => '(семи-ажатмат)',
 
 # History pages
-'currentrev'       => 'Верцион куренту',
-'revisionasof'     => 'Верцион де дата $1',
+'currentrev' => 'Верцион куренту',
+'revisionasof' => 'Верцион де дата $1',
 'previousrevision' => '←Версиунеа нтериоарај',
-'cur'              => 'актуалу',
-'last'             => 'прецеденте',
+'cur' => 'актуалу',
+'last' => 'прецеденте',
 
 # Diffs
-'history-title'           => 'Едитаерехисториа пентру "$1"',
-'lineno'                  => 'линиа $1:',
+'history-title' => 'Едитаерехисториа пентру "$1"',
+'lineno' => 'линиа $1:',
 'compareselectedversions' => 'Компара верционс селектус',
-'editundo'                => 'анулизаје',
+'editundo' => 'анулизаје',
 
 # Search results
-'viewprevnext'   => 'Ву ($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => 'Ву ($1 {{int:pipe-separator}} $2) ($3)',
 'searchhelp-url' => 'Help:Ајутор',
-'powersearch'    => 'каутај авансата',
+'powersearch' => 'каутај авансата',
 
 # Preferences page
 'mypreferences' => 'Мај префиренћу',
 
 # Recent changes
-'recentchanges'   => 'шумбајрае рецентае',
-'rcnote'          => "Маи хос се флај {{PLURAL:$|ултима модификаре|ултимеле '''$1''' модификајри}} дин {{PLURAL:$2|ултима зи|ултимеле '''$2''' зиле}}, енцепонд цу $5, $4.",
+'recentchanges' => 'шумбајрае рецентае',
+'rcnote' => "Маи хос се флај {{PLURAL:\$|ултима модификаре|ултимеле '''\$1''' модификајри}} дин {{PLURAL:\$2|ултима зи|ултимеле '''\$2''' зиле}}, енцепонд цу \$5, \$4.",
 'rcshowhideminor' => '$1 модификајриле миноре',
-'rcshowhidebots'  => '$1 роботи',
-'rcshowhideliu'   => '$1 утилизатори приласнаери',
+'rcshowhidebots' => '$1 роботи',
+'rcshowhideliu' => '$1 утилизатори приласнаери',
 'rcshowhideanons' => '$1 утилизатори аноними',
-'rcshowhidemine'  => '$1 мес модификационс',
-'rclinks'         => 'Ратај ултимеле $1 модификајри дин ултимеле $2 зиле.<br />
+'rcshowhidemine' => '$1 мес модификационс',
+'rclinks' => 'Ратај ултимеле $1 модификајри дин ултимеле $2 зиле.<br />
 $3',
-'diff'            => 'диференћу',
-'hist'            => 'хисториа',
-'hide'            => 'аскунде',
-'show'            => 'Аратај',
+'diff' => 'диференћу',
+'hist' => 'хисториа',
+'hide' => 'аскунде',
+'show' => 'Аратај',
 'minoreditletter' => 'м',
-'newpageletter'   => 'Н',
-'boteditletter'   => 'б',
+'newpageletter' => 'Н',
+'boteditletter' => 'б',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Модификајри корелате',
-'recentchangeslinked-feed'    => 'Модификајри корелате',
+'recentchangeslinked' => 'Модификајри корелате',
+'recentchangeslinked-feed' => 'Модификајри корелате',
 'recentchangeslinked-toolbox' => 'Модификајри корелате',
 
 # Upload
 'upload' => 'тримиће фиширул',
 
 # File description page
-'file-anchor-link'    => 'фиширул',
-'filehist'            => 'Хисториа фиширулу',
-'filehist-current'    => 'куренту',
-'filehist-datetime'   => 'Дата/Темп',
-'filehist-user'       => 'Утилизатору',
+'file-anchor-link' => 'фиширул',
+'filehist' => 'Хисториа фиширулу',
+'filehist-current' => 'куренту',
+'filehist-datetime' => 'Дата/Темп',
+'filehist-user' => 'Утилизатору',
 'filehist-dimensions' => 'Дименционс',
-'filehist-comment'    => 'коментарул',
-'imagelinks'          => 'Легајтул фиширул де медиа',
-'linkstoimage'        => 'Цес {{PLURAL:$1|page links||пажи легајтент}} а це фиширул:',
+'filehist-comment' => 'коментарул',
+'imagelinks' => 'Легајтул фиширул де медиа',
+'linkstoimage' => 'Цес {{PLURAL:$1|page links||пажи легајтент}} а це фиширул:',
 
 # Random page
 'randompage' => 'алаећу',
 
 # Miscellaneous special pages
-'nbytes'   => '$1 {{PLURAL:$1|бајтул|бајтулс}}',
+'nbytes' => '$1 {{PLURAL:$1|бајтул|бајтулс}}',
 'nmembers' => '$1 {{PLURAL:$1|мембру|мембри}}',
 'newpages' => 'Пажи нови',
 
@@ -246,46 +246,46 @@ $3',
 'booksources' => 'Сурсе де цајрћи',
 
 # Special:AllPages
-'allpages'       => 'Тоатс пажи',
+'allpages' => 'Тоатс пажи',
 'alphaindexline' => '$1 во $2',
-'allarticles'    => 'Тоат пажи',
+'allarticles' => 'Тоат пажи',
 'allpagessubmit' => 'Треме',
 
 # Watchlist
-'watchlist'   => 'Мај клајаеру',
+'watchlist' => 'Мај клајаеру',
 'mywatchlist' => 'Мај клајаере',
-'watch'       => 'клајаере',
-'unwatch'     => 'Деклајаера',
+'watch' => 'клајаере',
+'unwatch' => 'Деклајаера',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'О клајаере...',
+'watching' => 'О клајаере...',
 'unwatching' => 'О деклајаере...',
 
 # Rollback
 'rollbacklink' => 'ревенире',
 
 # Namespace form on various pages
-'namespace'      => 'лСпаћи:',
-'invert'         => 'Ќсклуда спаћул',
+'namespace' => 'лСпаћи:',
+'invert' => 'Ќсклуда спаћул',
 'blanknamespace' => '(Принципу)',
 
 # Contributions
 'contributions' => 'Контрибући дутилизатори',
-'mycontris'     => 'Мес контрибући',
-'contribsub2'   => 'пентру $1 ($2)',
-'uctop'         => '(сусверф)',
+'mycontris' => 'Мес контрибући',
+'contribsub2' => 'пентру $1 ($2)',
+'uctop' => '(сусверф)',
 
 'sp-contributions-talk' => 'дискућу',
 
 # What links here
-'whatlinkshere'       => 'Легајтул а це пажу',
+'whatlinkshere' => 'Легајтул а це пажу',
 'whatlinkshere-title' => 'Пажус легајтулент а $1',
-'nolinkshere'         => "Пажи не легајтент а '''[[:$1]]'''.",
-'istemplate'          => 'викулабе',
+'nolinkshere' => "Пажи не легајтент а '''[[:$1]]'''.",
+'istemplate' => 'викулабе',
 'whatlinkshere-links' => '← легајтулс',
 
 # Block/unblock
-'blocklink'    => 'блокуапаје',
+'blocklink' => 'блокуапаје',
 'contribslink' => 'контрибући',
 
 # Move page
@@ -295,41 +295,41 @@ $3',
 'export' => 'Ќспорта пажи',
 
 # Thumbnails
-'thumbnail-more'  => 'ќсинде',
+'thumbnail-more' => 'ќсинде',
 'thumbnail_error' => 'Еру вец лкреаре де тумбнел: $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-logout'         => 'отластаере',
-'tooltip-ca-talk'           => 'Дискућие деспре артикол',
-'tooltip-ca-edit'           => 'Поћи едита ацеатај пажинај. Те ругајм се превизуализези конћинутул енаинте де салваре.',
-'tooltip-ca-protect'        => 'Ажатме це пажу',
-'tooltip-ca-delete'         => 'Делајре це пажу',
-'tooltip-search'            => 'Каутај ен {{SITENAME}}',
-'tooltip-n-mainpage'        => 'Вижита лпажу принципу',
-'tooltip-n-portal'          => 'Дајпул лпројецту, љуелљуес путе фараере, о трувес саби.',
-'tooltip-n-currentevents'   => 'Гајсеште информаћии деспре евениментиќ куренте',
-'tooltip-n-recentchanges'   => 'Листа дес шумбајрае рецентае ен лБики.',
-'tooltip-n-randompage'      => 'Донаре нпажу алаетоаре',
-'tooltip-n-help'            => 'Ајутор трувес иси.',
-'tooltip-t-whatlinkshere'   => 'Листа тутурор пажинилор вики царе кондуц спре ацестај пажинај',
-'tooltip-t-contributions'   => 'Ву листа де контрибући де цутилизатору',
-'tooltip-t-upload'          => 'Тремер фиширул',
-'tooltip-t-specialpages'    => 'Листа де тоат пажи специалус',
-'tooltip-ca-nstab-user'     => 'Ву лпажу дутилизатору',
-'tooltip-ca-nstab-project'  => 'Ву лпажу де пројекту',
+'tooltip-pt-userpage' => 'Мој пажу дутилизатору',
+'tooltip-pt-mytalk' => 'Мај пажу дискућус',
+'tooltip-pt-preferences' => 'Мај префиренћу',
+'tooltip-pt-watchlist' => 'Листа пажинилор пе царе ле мониторизез.',
+'tooltip-pt-mycontris' => 'Листа де мес контрибуционс',
+'tooltip-pt-login' => 'Путе приласнаере, не лест доист.',
+'tooltip-pt-logout' => 'отластаере',
+'tooltip-ca-talk' => 'Дискућие деспре артикол',
+'tooltip-ca-edit' => 'Поћи едита ацеатај пажинај. Те ругајм се превизуализези конћинутул енаинте де салваре.',
+'tooltip-ca-protect' => 'Ажатме це пажу',
+'tooltip-ca-delete' => 'Делајре це пажу',
+'tooltip-search' => 'Каутај ен {{SITENAME}}',
+'tooltip-n-mainpage' => 'Вижита лпажу принципу',
+'tooltip-n-portal' => 'Дајпул лпројецту, љуелљуес путе фараере, о трувес саби.',
+'tooltip-n-currentevents' => 'Гајсеште информаћии деспре евениментиќ куренте',
+'tooltip-n-recentchanges' => 'Листа дес шумбајрае рецентае ен лБики.',
+'tooltip-n-randompage' => 'Донаре нпажу алаетоаре',
+'tooltip-n-help' => 'Ајутор трувес иси.',
+'tooltip-t-whatlinkshere' => 'Листа тутурор пажинилор вики царе кондуц спре ацестај пажинај',
+'tooltip-t-contributions' => 'Ву листа де контрибући де цутилизатору',
+'tooltip-t-upload' => 'Тремер фиширул',
+'tooltip-t-specialpages' => 'Листа де тоат пажи специалус',
+'tooltip-ca-nstab-user' => 'Ву лпажу дутилизатору',
+'tooltip-ca-nstab-project' => 'Ву лпажу де пројекту',
 'tooltip-ca-nstab-category' => 'Ву лпажу де категориа',
-'tooltip-minoredit'         => 'Це-ест нмодификацион минару',
-'tooltip-save'              => 'Салваере тес модификационс',
-'tooltip-diff'              => 'Ратај це модификајри аи фајцут текстулуи.',
+'tooltip-minoredit' => 'Це-ест нмодификацион минару',
+'tooltip-save' => 'Салваере тес модификационс',
+'tooltip-diff' => 'Ратај це модификајри аи фајцут текстулуи.',
 
 # Media information
-'file-nohires'   => 'Це-н-ест нресолуцион маи мари.',
+'file-nohires' => 'Це-н-ест нресолуцион маи мари.',
 'show-big-image' => 'Мареште ресолуцион',
 
 # Bad image list
@@ -347,7 +347,7 @@ $3',
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'тоат',
 'namespacesall' => 'тоат',
-'monthsall'     => 'тоат',
+'monthsall' => 'тоат',
 
 # Special:SpecialPages
 'specialpages' => 'Пажи спецалус',
index b17a0cf..d5e23a5 100644 (file)
@@ -20,225 +20,225 @@ $messages = array(
 'tog-underline' => 'Subliniaere legătuls:',
 
 # Dates
-'sun'           => 'Dum',
-'mon'           => 'Lun',
-'tue'           => 'Mar',
-'wed'           => 'Mie',
-'thu'           => 'Joi',
-'fri'           => 'Vin',
-'sat'           => 'Sam',
-'january'       => 'januari',
-'february'      => 'februari',
-'march'         => 'marti',
-'april'         => 'aprili',
-'may_long'      => 'mă',
-'june'          => 'juni',
-'july'          => 'juli',
-'august'        => 'august',
-'september'     => 'septembri',
-'october'       => 'oktombri',
-'november'      => 'nojembri',
-'december'      => 'decembri',
-'january-gen'   => 'januari',
-'february-gen'  => 'februari',
-'march-gen'     => 'marti',
-'april-gen'     => 'aprili',
-'may-gen'       => 'mai',
-'june-gen'      => 'juni',
-'july-gen'      => 'juli',
-'august-gen'    => 'august',
+'sun' => 'Dum',
+'mon' => 'Lun',
+'tue' => 'Mar',
+'wed' => 'Mie',
+'thu' => 'Joi',
+'fri' => 'Vin',
+'sat' => 'Sam',
+'january' => 'januari',
+'february' => 'februari',
+'march' => 'marti',
+'april' => 'aprili',
+'may_long' => 'mă',
+'june' => 'juni',
+'july' => 'juli',
+'august' => 'august',
+'september' => 'septembri',
+'october' => 'oktombri',
+'november' => 'nojembri',
+'december' => 'decembri',
+'january-gen' => 'januari',
+'february-gen' => 'februari',
+'march-gen' => 'marti',
+'april-gen' => 'aprili',
+'may-gen' => 'mai',
+'june-gen' => 'juni',
+'july-gen' => 'juli',
+'august-gen' => 'august',
 'september-gen' => 'septembri',
-'october-gen'   => 'oktombri',
-'november-gen'  => 'nojembri',
-'december-gen'  => 'decembri',
-'jan'           => 'jan',
-'feb'           => 'feb',
-'mar'           => 'mar',
-'apr'           => 'apr',
-'may'           => 'mai',
-'jun'           => 'jun',
-'jul'           => 'jul',
-'aug'           => 'aug',
-'sep'           => 'sep',
-'oct'           => 'okt',
-'nov'           => 'nov',
-'dec'           => 'dec',
+'october-gen' => 'oktombri',
+'november-gen' => 'nojembri',
+'december-gen' => 'decembri',
+'jan' => 'jan',
+'feb' => 'feb',
+'mar' => 'mar',
+'apr' => 'apr',
+'may' => 'mai',
+'jun' => 'jun',
+'jul' => 'jul',
+'aug' => 'aug',
+'sep' => 'sep',
+'oct' => 'okt',
+'nov' => 'nov',
+'dec' => 'dec',
 
 # Categories related messages
-'category_header'        => 'Pažus en kategoria "$1"',
-'subcategories'          => 'Subkategorii',
+'category_header' => 'Pažus en kategoria "$1"',
+'subcategories' => 'Subkategorii',
 'listingcontinuesabbrev' => 'kontinu',
 
-'about'  => 'Dajpul',
+'about' => 'Dajpul',
 'cancel' => 'renuntǎe',
 'mytalk' => 'Maj diskuţu',
 
-'errorpagetitle'   => 'Eru',
-'tagline'          => 'De {{SITENAME}}',
-'help'             => 'ajutor',
-'search'           => 'kaută',
-'searchbutton'     => 'kaută',
-'searcharticle'    => 'Lie',
-'history'          => 'Historia pažus',
+'errorpagetitle' => 'Eru',
+'tagline' => 'De {{SITENAME}}',
+'help' => 'ajutor',
+'search' => 'kaută',
+'searchbutton' => 'kaută',
+'searcharticle' => 'Lie',
+'history' => 'Historia pažus',
 'printableversion' => 'vercion printablu',
-'permalink'        => 'Legătul permanentul',
-'edit'             => 'Edita',
-'editthispage'     => 'Edita ce pažu',
-'delete'           => 'Delăre',
-'protect'          => 'Ažatme',
-'newpage'          => 'Paži novi',
+'permalink' => 'Legătul permanentul',
+'edit' => 'Edita',
+'editthispage' => 'Edita ce pažu',
+'delete' => 'Delăre',
+'protect' => 'Ažatme',
+'newpage' => 'Paži novi',
 'talkpagelinktext' => 'Diskuţu',
-'personaltools'    => 'Alatki personalu',
-'talk'             => 'Diskuţu',
-'views'            => 'Vi',
-'toolbox'          => 'alatunikul',
-'redirectedfrom'   => '(Redirecţionat de la $1)',
-'jumpto'           => 'Lia a:',
+'personaltools' => 'Alatki personalu',
+'talk' => 'Diskuţu',
+'views' => 'Vi',
+'toolbox' => 'alatunikul',
+'redirectedfrom' => '(Redirecţionat de la $1)',
+'jumpto' => 'Lia a:',
 'jumptonavigation' => 'navigacion',
-'jumptosearch'     => 'kaută',
+'jumptosearch' => 'kaută',
 
 # 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'            => 'Dajpul {{SITENAME}}',
-'aboutpage'            => 'Project:Dajpul {{SITENAME}}',
-'copyrightpage'        => "{{ns:project}}:Prava d'autoru",
-'currentevents'        => 'Tebikoru',
-'currentevents-url'    => 'Project:Tebikoru',
-'disclaimers'          => 'tǎmenuls',
-'disclaimerpage'       => 'Project:tǎmenul',
-'edithelp'             => 'Ajutor pentru editaere',
-'edithelppage'         => 'Help:Editaere',
-'helppage'             => 'Help:Ajutor',
-'mainpage'             => 'Pažu principu',
+'aboutsite' => 'Dajpul {{SITENAME}}',
+'aboutpage' => 'Project:Dajpul {{SITENAME}}',
+'copyrightpage' => "{{ns:project}}:Prava d'autoru",
+'currentevents' => 'Tebikoru',
+'currentevents-url' => 'Project:Tebikoru',
+'disclaimers' => 'tǎmenuls',
+'disclaimerpage' => 'Project:tǎmenul',
+'edithelp' => 'Ajutor pentru editaere',
+'edithelppage' => 'Help:Editaere',
+'helppage' => 'Help:Ajutor',
+'mainpage' => 'Pažu principu',
 'mainpage-description' => 'Pažu principu',
-'privacy'              => 'Politikmus de ližitul',
-'privacypage'          => 'Project:Politikmus de ližitul',
+'privacy' => 'Politikmus de ližitul',
+'privacypage' => 'Project:Politikmus de ližitul',
 
-'retrievedfrom'      => 'Aduse de "$1"',
+'retrievedfrom' => 'Aduse de "$1"',
 'youhavenewmessages' => 'Veses $1 ($2).',
-'newmessageslink'    => 'mesages noves',
-'editsection'        => 'Editaere',
-'editold'            => 'edita',
-'editsectionhint'    => 'Editaere ţisecion: $1',
-'toc'                => 'Kuprins',
-'showtoc'            => 'arată',
-'hidetoc'            => 'askunde',
-'site-rss-feed'      => '$1 RSS fitul',
-'site-atom-feed'     => '$1 Atom fitul',
-'page-rss-feed'      => '"$1" RSS Fitul',
-'page-atom-feed'     => '"$1" Atom Fitul',
+'newmessageslink' => 'mesages noves',
+'editsection' => 'Editaere',
+'editold' => 'edita',
+'editsectionhint' => 'Editaere ţisecion: $1',
+'toc' => 'Kuprins',
+'showtoc' => 'arată',
+'hidetoc' => 'askunde',
+'site-rss-feed' => '$1 RSS fitul',
+'site-atom-feed' => '$1 Atom fitul',
+'page-rss-feed' => '"$1" RSS Fitul',
+'page-atom-feed' => '"$1" Atom Fitul',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-user'     => "Pažu d'utilizatoru",
-'nstab-project'  => 'Projektu',
-'nstab-image'    => 'fişirul',
+'nstab-user' => "Pažu d'utilizatoru",
+'nstab-project' => 'Projektu',
+'nstab-image' => 'fişirul',
 'nstab-category' => 'kategoria',
 
 # General errors
 'viewsource' => 'Baganaere',
 
 # Login and logout pages
-'yourname'                => "Nom d'utilizatoru:",
-'login'                   => 'Prilasnaere',
+'yourname' => "Nom d'utilizatoru:",
+'login' => 'Prilasnaere',
 'nav-login-createaccount' => 'Prilasnaere / Nažbe',
-'userlogin'               => 'Prilasnaere / kreare nutilizatoru',
-'userlogout'              => 'otlastaere',
+'userlogin' => 'Prilasnaere / kreare nutilizatoru',
+'userlogout' => 'otlastaere',
 
 # Edit page toolbar
-'bold_sample'     => 'Eskrire aldin',
-'bold_tip'        => 'Eskrire aldin',
-'italic_sample'   => 'Eskrire kursive',
-'italic_tip'      => 'Eskrire kursive',
-'link_sample'     => "Nom s'legătuls",
-'link_tip'        => 'Legătul internul',
-'extlink_sample'  => "http://www.example.com nom s'legătuls",
-'extlink_tip'     => 'Legătul ķsternul (vec prefiks http://)',
+'bold_sample' => 'Eskrire aldin',
+'bold_tip' => 'Eskrire aldin',
+'italic_sample' => 'Eskrire kursive',
+'italic_tip' => 'Eskrire kursive',
+'link_sample' => "Nom s'legătuls",
+'link_tip' => 'Legătul internul',
+'extlink_sample' => "http://www.example.com nom s'legătuls",
+'extlink_tip' => 'Legătul ķsternul (vec prefiks http://)',
 'headline_sample' => "Eskrire s'titlus",
-'headline_tip'    => 'Titlu de nivel 2',
-'nowiki_sample'   => 'Intorduca no-Wiki isi',
-'nowiki_tip'      => 'No-Wiki klaşu',
-'image_tip'       => 'Santigul inserat',
-'media_tip'       => 'Legătul fişirul de media',
-'sig_tip'         => 'Utilizatorunom et data et temp',
-'hr_tip'          => 'Linia orizontala (esnidivale)',
+'headline_tip' => 'Titlu de nivel 2',
+'nowiki_sample' => 'Intorduca no-Wiki isi',
+'nowiki_tip' => 'No-Wiki klaşu',
+'image_tip' => 'Santigul inserat',
+'media_tip' => 'Legătul fişirul de media',
+'sig_tip' => 'Utilizatorunom et data et temp',
+'hr_tip' => 'Linia orizontala (esnidivale)',
 
 # Edit pages
-'summary'                => 'Sumar:',
-'subject'                => 'Subjekt / titlur:',
-'minoredit'              => 'Aceasta este o editare minoră',
-'watchthis'              => 'klăaere ce pažu',
-'showpreview'            => 'Rată previzualizare',
-'showdiff'               => 'Arată şumbărae',
-'newarticle'             => '(Nova)',
-'editing'                => 'o $1 editaere',
-'editingsection'         => 'Editaere $1 (sekcion)',
-'copyrightwarning'       => "<!-- Gol deocamdată. Vertismentul se flă en MediaWiki:Summary -->
+'summary' => 'Sumar:',
+'subject' => 'Subjekt / titlur:',
+'minoredit' => 'Aceasta este o editare minoră',
+'watchthis' => 'klăaere ce pažu',
+'showpreview' => 'Rată previzualizare',
+'showdiff' => 'Arată şumbărae',
+'newarticle' => '(Nova)',
+'editing' => 'o $1 editaere',
+'editingsection' => 'Editaere $1 (sekcion)',
+'copyrightwarning' => "<!-- Gol deocamdată. Vertismentul se flă en MediaWiki:Summary -->
 Te rog notari la din kontribuţi al {{SITENAME}} sunt konsideraere relesavat supra $2 (suah $1 din detăs). Açteu nesav te se teksti sunt editaere denomerci det redistributaere din vent, hatae ici.<br /> Tu este nostre promisaere bonti us tu skrirste ce se, nega kopiaere din publik domen nega similari resorsua. '''NE SUBMITE KOPILEGRU SKRIE SAS PERMIŢION!'''",
-'template-protected'     => '(ažatmat)',
+'template-protected' => '(ažatmat)',
 'template-semiprotected' => '(semi-ažatmat)',
 
 # History pages
-'currentrev'       => 'Vercion kurentu',
-'revisionasof'     => 'Vercion de data $1',
+'currentrev' => 'Vercion kurentu',
+'revisionasof' => 'Vercion de data $1',
 'previousrevision' => '←Versiunea nterioară',
-'cur'              => 'aktualu',
-'last'             => 'precedente',
+'cur' => 'aktualu',
+'last' => 'precedente',
 
 # Diffs
-'history-title'           => 'Editaerehistoria pentru "$1"',
-'lineno'                  => 'Linia $1:',
+'history-title' => 'Editaerehistoria pentru "$1"',
+'lineno' => 'Linia $1:',
 'compareselectedversions' => 'Kompara vercion selektus',
-'editundo'                => 'anulizăe',
+'editundo' => 'anulizăe',
 
 # Search results
-'viewprevnext'   => 'Vu ($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => 'Vu ($1 {{int:pipe-separator}} $2) ($3)',
 'searchhelp-url' => 'Help:Ajutor',
-'powersearch'    => 'kaută avansata',
+'powersearch' => 'kaută avansata',
 
 # Preferences page
 'mypreferences' => 'Maj prefirenţu',
 
 # Recent changes
-'recentchanges'   => 'şumbărae recentae',
-'rcnote'          => "Mai hos se flă {{PLURAL:$|ultima modifikare|ultimele '''$1''' modifikări}} din {{PLURAL:$2|ultima zi|ultimele '''$2''' zile}}, encepând cu $5, $4.",
+'recentchanges' => 'şumbărae recentae',
+'rcnote' => "Mai hos se flă {{PLURAL:\$|ultima modifikare|ultimele '''\$1''' modifikări}} din {{PLURAL:\$2|ultima zi|ultimele '''\$2''' zile}}, encepând cu \$5, \$4.",
 'rcshowhideminor' => '$1 modifikările minore',
-'rcshowhidebots'  => '$1 roboti',
-'rcshowhideliu'   => '$1 utilizatori prilasnaeri',
+'rcshowhidebots' => '$1 roboti',
+'rcshowhideliu' => '$1 utilizatori prilasnaeri',
 'rcshowhideanons' => '$1 utilizatori anonimi',
-'rcshowhidemine'  => '$1 mes modifikacions',
-'rclinks'         => 'Rată ultimele $1 modifikări din ultimele $2 zile.<br />
+'rcshowhidemine' => '$1 mes modifikacions',
+'rclinks' => 'Rată ultimele $1 modifikări din ultimele $2 zile.<br />
 $3',
-'diff'            => 'diferenţu',
-'hist'            => 'historia',
-'hide'            => 'askunde',
-'show'            => 'Arată',
+'diff' => 'diferenţu',
+'hist' => 'historia',
+'hide' => 'askunde',
+'show' => 'Arată',
 'minoreditletter' => 'm',
-'newpageletter'   => 'N',
-'boteditletter'   => 'b',
+'newpageletter' => 'N',
+'boteditletter' => 'b',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Modifikări korelate',
-'recentchangeslinked-feed'    => 'Modifikări korelate',
+'recentchangeslinked' => 'Modifikări korelate',
+'recentchangeslinked-feed' => 'Modifikări korelate',
 'recentchangeslinked-toolbox' => 'Modifikări korelate',
 
 # Upload
 'upload' => 'trimiţe fişirul',
 
 # File description page
-'file-anchor-link'    => 'Fişirul',
-'filehist'            => 'Historia fişirulu',
-'filehist-current'    => 'kurentu',
-'filehist-datetime'   => 'Data/Temp',
-'filehist-user'       => 'Utilizatoru',
+'file-anchor-link' => 'Fişirul',
+'filehist' => 'Historia fişirulu',
+'filehist-current' => 'kurentu',
+'filehist-datetime' => 'Data/Temp',
+'filehist-user' => 'Utilizatoru',
 'filehist-dimensions' => 'Dimencions',
-'filehist-comment'    => 'komentarul',
-'imagelinks'          => 'Legătul fişirul de media',
-'linkstoimage'        => 'Ces {{PLURAL:$1|paži legǎt|paži legǎtent}} a ce fişirul:',
+'filehist-comment' => 'komentarul',
+'imagelinks' => 'Legătul fişirul de media',
+'linkstoimage' => 'Ces {{PLURAL:$1|paži legǎt|paži legǎtent}} a ce fişirul:',
 
 # Random page
 'randompage' => 'alaeţu',
 
 # Miscellaneous special pages
-'nbytes'   => '$1 {{PLURAL:$1|bătul|bătuls}}',
+'nbytes' => '$1 {{PLURAL:$1|bătul|bătuls}}',
 'nmembers' => '$1 {{PLURAL:$1|membru|membri}}',
 'newpages' => 'Paži novi',
 
@@ -246,46 +246,46 @@ $3',
 'booksources' => 'Surse de cărţi',
 
 # Special:AllPages
-'allpages'       => 'Toats paži',
+'allpages' => 'Toats paži',
 'alphaindexline' => '$1 vo $2',
-'allarticles'    => 'Toats paži',
+'allarticles' => 'Toats paži',
 'allpagessubmit' => 'Treme',
 
 # Watchlist
-'watchlist'   => 'Maj klăaeru',
+'watchlist' => 'Maj klăaeru',
 'mywatchlist' => 'Maj klăaere',
-'watch'       => 'klăaere',
-'unwatch'     => 'Deklăaera',
+'watch' => 'klăaere',
+'unwatch' => 'Deklăaera',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'O klăaere...',
+'watching' => 'O klăaere...',
 'unwatching' => 'O deklăaere...',
 
 # Rollback
 'rollbacklink' => 'revenire',
 
 # Namespace form on various pages
-'namespace'      => 'lSpaţi:',
-'invert'         => 'Ķskluda spaţul',
+'namespace' => 'lSpaţi:',
+'invert' => 'Ķskluda spaţul',
 'blanknamespace' => '(Principu)',
 
 # Contributions
 'contributions' => "Kontribuţi d'utilizatori",
-'mycontris'     => 'Mes kontribuţi',
-'contribsub2'   => 'Pentru $1 ($2)',
-'uctop'         => '(susverf)',
+'mycontris' => 'Mes kontribuţi',
+'contribsub2' => 'Pentru $1 ($2)',
+'uctop' => '(susverf)',
 
 'sp-contributions-talk' => 'Diskuţu',
 
 # What links here
-'whatlinkshere'       => 'Legǎtul a ce pažu',
+'whatlinkshere' => 'Legǎtul a ce pažu',
 'whatlinkshere-title' => 'Paži legǎtulent a $1',
-'nolinkshere'         => "Paži ne legǎtent a '''[[:$1]]'''.",
-'istemplate'          => 'vikulabe',
+'nolinkshere' => "Paži ne legǎtent a '''[[:$1]]'''.",
+'istemplate' => 'vikulabe',
 'whatlinkshere-links' => '← legătuls',
 
 # Block/unblock
-'blocklink'    => 'blokuapǎe',
+'blocklink' => 'blokuapǎe',
 'contribslink' => 'kontribuţi',
 
 # Move page
@@ -295,41 +295,41 @@ $3',
 'export' => 'Ķsporta paži',
 
 # Thumbnails
-'thumbnail-more'  => 'ķsinde',
+'thumbnail-more' => 'ķsinde',
 'thumbnail_error' => 'Eru vec kreare de thumbnail: $1',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'       => "Moj pažu d'utilizatoru",
-'tooltip-pt-mytalk'         => 'Maj pažu diskuţus',
-'tooltip-pt-preferences'    => 'Maj prefirenţu',
-'tooltip-pt-watchlist'      => 'Lista pažinilor pe care le monitorizez.',
-'tooltip-pt-mycontris'      => 'Lista de mes kontribucions',
-'tooltip-pt-login'          => "Pute prilasnaere, ne l'est doist.",
-'tooltip-pt-logout'         => 'otlastaere',
-'tooltip-ca-talk'           => 'Diskuţie despre artikol',
-'tooltip-ca-edit'           => 'Poţi edita această pažină. Te rugăm se previzualizezi konţinutul enainte de salvare.',
-'tooltip-ca-protect'        => 'Ažatme ce pažu',
-'tooltip-ca-delete'         => 'Delăre ce pažu',
-'tooltip-search'            => 'Kaută en {{SITENAME}}',
-'tooltip-n-mainpage'        => "Visita l'pažu principu",
-'tooltip-n-portal'          => "Dajpul l'projectu, quelques pote faraere, o truves sabi.",
-'tooltip-n-currentevents'   => 'Găseşte informaţii despre evenimentiķ kurente',
-'tooltip-n-recentchanges'   => "Lista des şumbǎrae recentae en l'wiki.",
-'tooltip-n-randompage'      => 'Donare npažu alaetoare',
-'tooltip-n-help'            => 'Ajutor truves isi.',
-'tooltip-t-whatlinkshere'   => 'Lista tuturor pažinilor wiki care konduc spre această pažină',
-'tooltip-t-contributions'   => "Vu lista de kontribuţi de c'utilizatoru",
-'tooltip-t-upload'          => 'Tremer fişirul',
-'tooltip-t-specialpages'    => 'Lista de toat paži specialus',
-'tooltip-ca-nstab-user'     => "Vu l'pažu d'utilizatoru",
-'tooltip-ca-nstab-project'  => "Vu l'pažu de projektu",
+'tooltip-pt-userpage' => "Moj pažu d'utilizatoru",
+'tooltip-pt-mytalk' => 'Maj pažu diskuţus',
+'tooltip-pt-preferences' => 'Maj prefirenţu',
+'tooltip-pt-watchlist' => 'Lista pažinilor pe care le monitorizez.',
+'tooltip-pt-mycontris' => 'Lista de mes kontribucions',
+'tooltip-pt-login' => "Pute prilasnaere, ne l'est doist.",
+'tooltip-pt-logout' => 'otlastaere',
+'tooltip-ca-talk' => 'Diskuţie despre artikol',
+'tooltip-ca-edit' => 'Poţi edita această pažină. Te rugăm se previzualizezi konţinutul enainte de salvare.',
+'tooltip-ca-protect' => 'Ažatme ce pažu',
+'tooltip-ca-delete' => 'Delăre ce pažu',
+'tooltip-search' => 'Kaută en {{SITENAME}}',
+'tooltip-n-mainpage' => "Visita l'pažu principu",
+'tooltip-n-portal' => "Dajpul l'projectu, quelques pote faraere, o truves sabi.",
+'tooltip-n-currentevents' => 'Găseşte informaţii despre evenimentiķ kurente',
+'tooltip-n-recentchanges' => "Lista des şumbǎrae recentae en l'wiki.",
+'tooltip-n-randompage' => 'Donare npažu alaetoare',
+'tooltip-n-help' => 'Ajutor truves isi.',
+'tooltip-t-whatlinkshere' => 'Lista tuturor pažinilor wiki care konduc spre această pažină',
+'tooltip-t-contributions' => "Vu lista de kontribuţi de c'utilizatoru",
+'tooltip-t-upload' => 'Tremer fişirul',
+'tooltip-t-specialpages' => 'Lista de toat paži specialus',
+'tooltip-ca-nstab-user' => "Vu l'pažu d'utilizatoru",
+'tooltip-ca-nstab-project' => "Vu l'pažu de projektu",
 'tooltip-ca-nstab-category' => "Vu l'pažu de kategoria",
-'tooltip-minoredit'         => "ce-est n'modifikacion minoru",
-'tooltip-save'              => 'Salvaere tes modifikacions',
-'tooltip-diff'              => 'Rată ce modifikări ai făcut tekstului.',
+'tooltip-minoredit' => "ce-est n'modifikacion minoru",
+'tooltip-save' => 'Salvaere tes modifikacions',
+'tooltip-diff' => 'Rată ce modifikări ai făcut tekstului.',
 
 # Media information
-'file-nohires'   => "Ce-n-est n'resolucion mai mari.",
+'file-nohires' => "Ce-n-est n'resolucion mai mari.",
 'show-big-image' => 'Mareşte resolucion',
 
 # Bad image list
@@ -347,7 +347,7 @@ Orice legături ce urmează pe acenaşi linie sunt consideraete excepţii, dică
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'toat',
 'namespacesall' => 'toat',
-'monthsall'     => 'toat',
+'monthsall' => 'toat',
 
 # Special:SpecialPages
 'specialpages' => 'Paži specalus',
index 6e42444..1939488 100644 (file)
@@ -178,7 +178,6 @@ $magicWords = array(
        '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' ),
@@ -424,7 +423,6 @@ The following {{PLURAL:$1|file is|$1 files are}} in the current category.',
 'qbbrowse' => 'ब्राउस् इत्येतत् करोतु।',
 'qbedit' => 'सम्पाद्यताम्',
 'qbpageoptions' => 'इदं पृष्ठम्',
-'qbpageinfo' => 'प्रसंगः',
 'qbmyoptions' => 'मम पृष्ठानि',
 'qbspecialpages' => 'विशेषपृष्ठानि',
 'faq' => 'बहुधा पृच्छ्यमानाः प्रश्नाः',
@@ -679,11 +677,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''भवान् अधुना बहिरागतः ।'''
 
-भवान् {{SITENAME}} इत्येतत् अनामतया प्रयोक्तुं शक्नोति, अथवा भवान् तेनैव प्रयोक्तृनाम्ना, भिन्नप्रयोक्तृनाम्ना वा  [[Special:UserLogin|पुनः प्रवेष्टुं शक्नोति]]
+भवान् {{SITENAME}} इत्येतत् अनामतया प्रयोक्तुं शक्नोति, अथवा भवान् तेनैव प्रयोक्तृनाम्ना, भिन्नप्रयोक्तृनाम्ना वा  <span class='plainlinks'>[$1 पुनः प्रवेष्टुं शक्नोति]</span>
 इदानीमपि कानिचन पृष्ठानि पूर्ववदेव दृश्येरन् । अस्य वारणाय विचरकस्य स्मृतिसञ्चयः रिक्तीक्रियताम् ।",
-'welcomecreation' => '==स्वागतम्‌, $1!==
-भवता सदस्यता प्राप्ता अस्ति।
-भवतः [[Special:Preferences|{{SITENAME}} इष्टतमानि]]  इत्यस्य परिवर्तनं न विस्मर्यताम्।',
 'yourname' => 'योजकनामन्:',
 'yourpassword' => 'कूटशब्दः',
 'yourpasswordagain' => 'कूटशब्दः पुनः लिख्यताम् ।',
@@ -1075,7 +1070,7 @@ $2
 'viewpagelogs' => 'अस्य पृष्ठस्य लॉंग् इत्येतद् दर्शयतु',
 'nohistory' => 'अस्य पृष्ठस्य कृते पृष्ठेतिहासः न वर्तते।',
 'currentrev' => 'सद्यःकालीना आवृत्तिः',
-'currentrev-asof' => 'वरà¥\8dतमतà¥\80 आवृत्तिः $1 इति समये',
+'currentrev-asof' => 'वरà¥\8dतमाना आवृत्तिः $1 इति समये',
 'revisionasof' => '$1 इत्यस्य आवृत्तिः',
 'revision-info' => '$1इति समयस्य आवृत्तिः $2 इत्यनेन',
 'previousrevision' => '← पुरातनानि संस्करणानि',
@@ -1273,8 +1268,6 @@ You can still [$1 view this revision]",
 'search-interwiki-caption' => 'बन्धु-प्रकल्पाः',
 'search-interwiki-default' => '$1 परिणामाः :',
 'search-interwiki-more' => '(अधिकानि)',
-'search-mwsuggest-enabled' => 'उपक्षेपेभ्यः सह',
-'search-mwsuggest-disabled' => 'नात्र उपक्षेपाः',
 'search-relatedarticle' => 'सम्बद्धानि ।',
 'mwsuggest-disable' => 'निष्क्रियाः AJAX सूचनाः ।',
 'searcheverything-enable' => 'सर्वनामावकाशे अन्विषतु ।',
@@ -1891,7 +1884,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 'filehist-current' => 'सद्योजातम्',
 'filehist-datetime' => 'दिनाङ्कः/समयः',
 'filehist-thumb' => 'अंगुष्ठनखाकारम्',
-'filehist-thumbtext' => '$1 à¤¸à¤®à¤¯à¥\87 à¤µà¤¿à¤¦à¥\8dयमतà¥\8dयाः आवृत्तेः अंगुष्ठनखाकारम्',
+'filehist-thumbtext' => '$1 à¤¸à¤®à¤¯à¥\87 à¤µà¤¿à¤¦à¥\8dयमानायाः आवृत्तेः अंगुष्ठनखाकारम्',
 'filehist-nothumb' => 'अङ्गुष्टनखाकारकं नाश्ति ।',
 'filehist-user' => 'योजकः',
 'filehist-dimensions' => 'आयामाः',
@@ -2276,11 +2269,7 @@ See https://www.mediawiki.org/wiki/Manual:Image_Authorization.',
 
 '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',
@@ -2860,7 +2849,6 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 
 # JavaScriptTest
 'javascripttest' => 'जावालिपिपरीक्षणम् ।',
-'javascripttest-disabled' => 'विक्याम् अयं क्रियाकलापः निष्क्रियः ।',
 'javascripttest-title' => '$1 परीक्षाप्रचलति ।',
 'javascripttest-pagetext-noframework' => 'जावलिपिचालनपरीक्षार्थम् एतत्पुटम् आरक्षितम् ।',
 'javascripttest-pagetext-unknownframework' => 'अज्ञातपरीक्षाप्रक्रिया  $1',
@@ -2991,7 +2979,6 @@ $2 इति प्रकारस्य अवरोधं कर्तुं 
 'pageinfo-authors' => 'प्रत्येककर्तॄणां समग्रा सङ्ख्या ।',
 'pageinfo-recent-edits' => 'सद्योजातसम्पादनानां सङ्ख्या (गतेषु $1 दिनेषु)',
 'pageinfo-recent-authors' => 'प्रत्येककर्तॄणां सद्यःकालीना सङ्ख्या ।',
-'pageinfo-restriction' => 'पृष्ठसंरक्षणम्  ({{lcfirst:$1}})',
 'pageinfo-magic-words' => 'मान्त्रिक{{PLURAL:$1|शब्दः|शब्दाः}} ($1)',
 'pageinfo-hidden-categories' => 'गोपित{{PLURAL:$1|वर्गः|वर्गाः}} ($1)',
 'pageinfo-templates' => 'समायोजित{{PLURAL:$1|फलकम्|फलकानि}} ($1)',
@@ -3839,6 +3826,10 @@ $1 इत्यनेन $3 इति पृष्ठम् $4 इत्ये
 'feedback-bugcheck' => 'उत्तमम् परिशीलयतु यत्  [ $1 known bugs] पूर्वमेव नासीत् इति ।',
 'feedback-bugnew' => 'अहं परीक्षितवान् ।  नूतनदोषं सूचयतु ।',
 
+# Search suggestions
+'searchsuggest-search' => 'अन्वेषणम्',
+'searchsuggest-containing' => 'विद्यन्ते......',
+
 # API errors
 'api-error-badaccess-groups' => 'भवान् अस्यां वीक्यां सञ्चिकाः उत्तारयितुम् नानुमतः ।',
 'api-error-badtoken' => 'आन्तरिकदोषः : दुष्टप्रतीकः ।',
index 935f965..ce0eeef 100644 (file)
@@ -91,7 +91,7 @@ $messages = array(
 
 'underline-always' => 'Куруук',
 'underline-never' => 'Аннынан тардыма',
-'underline-default' => 'Браузер настройкатынан',
+'underline-default' => 'Браузер туруоруутунан',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Эрэдээксийэлиир түннүк бичигэ:',
@@ -187,7 +187,6 @@ $messages = array(
 'qbbrowse' => 'Көр',
 'qbedit' => 'Уларыт',
 'qbpageoptions' => 'Бу сирэй',
-'qbpageinfo' => 'Ис хоһооно',
 'qbmyoptions' => 'Мин сирэйдэрим',
 'qbspecialpages' => 'Аналлаах сирэйдэр',
 'faq' => 'FAQ',
@@ -200,7 +199,7 @@ $messages = array(
 'vector-action-protect' => 'Уларыйбат гын',
 'vector-action-undelete' => 'Төннөр',
 'vector-action-unprotect' => 'Көмүскэлин уларыт',
-'vector-simplesearch-preference' => 'Ð\9aÓ©Ñ\80дөбүл Ñ\8dÑ\82Ñ\8dн Ð±Ð¸Ñ\8dÑ\80иилÑ\8dÑ\80ин ÐºÑ\8dÒ¥Ñ\8dÑ\82иллибиÑ\82 барылын туруор («Векторга» эрэ)',
+'vector-simplesearch-preference' => 'Ð\9aÓ©Ñ\80дөбүл Ñ\83Ñ\81Ñ\82Ñ\83Ñ\80Ñ\83окаÑ\82Ñ\8bн Ñ\81Ñ\83дÑ\83Ñ\80гÑ\83 барылын туруор («Векторга» эрэ)',
 'vector-view-create' => 'Ай',
 'vector-view-edit' => 'Уларыт',
 'vector-view-history' => 'Устуоруйатын көрүү',
@@ -308,6 +307,7 @@ $1',
 'newmessagesdifflink' => 'кэлиҥҥи уларытыы',
 'youhavenewmessagesfromusers' => 'Маны $1 {{PLURAL:$3|соҕотох кыттааччыттан|$3 кыттааччыттан}} туппуккун ($2).',
 'youhavenewmessagesmanyusers' => 'Маны $1 элбэх кыттааччыттан туппуккун ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|саҥа этии|саҥа этии}}',
 'newmessagesdifflinkplural' => 'тиһэх {{PLURAL:$1|уларытыы|уларытыылар}}',
 'youhavenewmessagesmulti' => '$1, саҥа суруктар кэллилэр',
 'editsection' => 'уларыт',
@@ -361,9 +361,9 @@ $1',
 'dberrortext' => 'Билии олоҕор ыйытык синтаксииһа сыыһалаах эбит.
 Ол бырагырааммаҕар баар сыыһаттан буолуон сөп.
 Билии олоҕор бүтэһик ыйытык маннык:
-<blockquote><tt>$1</tt></blockquote>
-(бу пуунсуйаттан тахсыбыт "<tt>$2</tt>").
-Билии олоҕо сыыһаны көрдөрдө "<tt>$3: $4</tt>".',
+: <code>$1</code>
+(бу пуунсуйаттан тахсыбыт «<code>$2</code>»).
+Билии олоҕо сыыһаны көрдөрдө «<code>$3: $4</code>».',
 'dberrortextcl' => 'Билии олоҕор ыйытык синтаксииһын сыыһата таҕыста.
 Билии олоҕор бүтэһик ыйытык:
 "$1"
@@ -416,8 +416,11 @@ $1',
 'protectedpagetext' => 'Бу сирэй уларытыллыбат.',
 'viewsourcetext' => 'Эн бу сирэй төрдүн көрүөххүн уонна төгүллүөххүн сөп:',
 'viewyourtext' => "'''Бэйэҥ көннөрүүлэриҥ''' исходнигын бу сирэйгэ көрүөххүн уонна хатылаан ылыаххын сөп:",
-'protectedinterface' => 'Бу сирэй бырагыраамма холбуурун хааччыйар, онон моһуогурууттан халытан хатанан турар',
-'editinginterface' => "'''Болҕой:''' Быраҕыраамма тас көстүүтүн (интерфейсын) хааччыйар тиэкиһи уларытаары гынан эрэҕин. Бу сирэйи уларыттаххына атын кыттааччылар көрөллөрүгэр бырагыраамма көстүүтэ уларыйыа. Тылбаастыыр буоллаххына Медиавики бырайыактарын сахалыы тылбааһын [//translatewiki.net/wiki/Main_Page?setlang=sah translatewiki.net] туһан.",
+'protectedinterface' => 'Бу сирэй бырагыраамма интерфейсын биллэриитин көрдөрөр, онон моһуогурууттан халытан хатанан турар.
+Тылбааһын уларытыаххын баҕарар буоллаххына онно аналлаах тылбаас ситим-сирин туһан: MediaWiki [//translatewiki.net/ translatewiki.net]',
+'editinginterface' => "'''Болҕой:''' Быраҕыраамма тас көстүүтүн (интерфейсын) хааччыйар тиэкиһи уларытаары гынан эрэҕин.
+Бу сирэйи уларыттаххына атын кыттааччылар көрөллөрүгэр бырагыраамма көстүүтэ уларыйыа. 
+Тылбааһын уларытыаххын эбэтэр эбиэххин баҕарар буоллаххына Медиавики бырайыактарын тылбаастыыр сиргэ киир [//translatewiki.net/ translatewiki.net].",
 'sqlhidden' => '(SQL ыйытык кистэммит)',
 'cascadeprotected' => 'Бу сирэй уларыйар кыаҕа суох, тоҕо диэтэххэ уларыйара бобуллубут (каскаднай көмүскэл холбоммут) {{PLURAL:$1|сирэй бөлөҕөр|сирэйдэр бөлөхтөрүгэр}} киирэр:
 $2',
@@ -444,17 +447,15 @@ $2',
 'logouttext' => "'''Эн тиһиликтэн таҕыстыҥ.'''
 
 {{SITENAME}} ситим-сиргэ билигин урукку ааккынан буолбакка IP-аадырыһынан эрэ көстөҕүн.
-Салгыы ааккын ааттаабакка үлэлиэххин сөп, эбэтэр саҥаттан урукку ааккынан дуу, атын аатынан дуу [[Special:UserLogin|киириэххин]] сөп.
+Салгыы ааккын ааттаабакка үлэлиэххин сөп, эбэтэр саҥаттан урукку ааккынан дуу, атын аатынан дуу <span class='plainlinks'>[$1 киириэххин]</span> сөп.
 Сорох сирэйдэр өссө даҕаны эйигин урукку ааккынан көрдөрүөхтэрин сөп, ону суох гыныаххын баҕардаххына интэриниэт көрдөрөөччүҥ кээһин ыраастаа.",
-'welcomecreation' => '== Нөрүөн нөргүй, $1! ==
-Эн манна бэлиэтэнниҥ.
-[[Special:Preferences|{{SITENAME}} туруорууларын]] бэйэҕэр сөп түбэһэр гына уларытаргын умнума.',
 'yourname' => 'Кыттааччы аатыҥ:',
 'yourpassword' => 'Киирии тыла:',
 'yourpasswordagain' => 'Киирии тылгын хатылаа:',
 'remembermypassword' => 'Миигин бу көмпүүтэргэ сигээ ($1 {{PLURAL:$1|күн|күнтэн ордуга суох}})',
 'securelogin-stick-https' => 'Киирэн баран HTTPS нөҥүө холбонууну салгыырга',
 'yourdomainname' => 'Эн дөмүөнүҥ:',
+'password-change-forbidden' => 'Бу биикигэ киирии тылы уоарытар табыллыбат.',
 'externaldberror' => 'Тас киирии билиитин олоҕун сыыһата буолла, эбэтэр тас киирии билииҥ олоҕун саҥардар кыаҕыҥ суох.',
 'login' => 'Киир',
 'nav-login-createaccount' => 'Киир / бэлиэтэн',
@@ -705,8 +706,8 @@ IP-аадырыһа эрэ көстөр.
 <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>',
+Бу [[Special:Search/{{PAGENAME}}|ааты атын сирэйдэргэ көрдөөн көрүөххүн]] сөп,
+эбэтэр <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} сурунаалларга манна сыһыаннаах суруктары булуоххун сөп].</span> Бу сирэйи айар кыаҕыҥ суох.',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" аат бэлиэтэммэтэх. Бу сирэйи оҥорор/уларытар баҕалааххын дуо?',
 'userpage-userdoesnotexist-view' => '"$1" кыттааччы аата бэлиэтэниллибэтэх.',
 'blocked-notice-logextract' => 'Бу кыттааччы билигин бобуллубут.
@@ -1059,8 +1060,6 @@ $1",
 'search-interwiki-caption' => 'Уруулуу бырайыактар',
 'search-interwiki-default' => '$1 түмүгэ:',
 'search-interwiki-more' => '(өссө)',
-'search-mwsuggest-enabled' => 'этиилэрдээх',
-'search-mwsuggest-disabled' => 'этиилэрэ суох',
 'search-relatedarticle' => 'Сигэнэр',
 'mwsuggest-disable' => 'AJAX этэн биэриилэрин араар',
 'searcheverything-enable' => 'Туох баар аат далларыгар көрдөөһүн',
@@ -2055,11 +2054,7 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} Биллэрэр Сулууспата',
 'enotif_reset' => 'Бары сирэйдэри көрбүтүм курдук бэлиэтээ',
-'enotif_newpagetext' => 'Бу саҥа сирэй.',
 'enotif_impersonal_salutation' => '{{SITENAME}} кыттааччыта',
-'changed' => 'уларыппыт (уларытыллыбыт)',
-'created' => 'айыллыбыт',
-'enotif_subject' => '«{{SITENAME}}» $PAGETITLE кыттааччыга сыһыаннаах сирэйи $PAGEEDITOR кыттааччы $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Бутэһик киирииҥ кэнниттэн оҥоһуллубут уларыйыылары барытын көрөргө манна киир: $1.',
 'enotif_lastdiff' => 'Уларытыыны манна көрүҥ: $1.',
 'enotif_anon_editor' => 'ааттамматах кыттааччы $1',
@@ -2271,7 +2266,7 @@ $1',
 # Contributions
 'contributions' => 'Кыттааччы суруйуута (вклад)',
 'contributions-title' => '$1 кыттааччы киллэрбит уларытыылара',
-'mycontris' => 'Суруйуум тиһигэ',
+'mycontris' => 'Суруйуу тиһигэ',
 'contribsub2' => 'Вклад $1 ($2)',
 'nocontribs' => 'Эппит критерийгэр эппиэттиир уларытыылар көстүбэтилэр.',
 'uctop' => '(бүтэһик)',
@@ -2311,7 +2306,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 утаарыы',
 'whatlinkshere-hidetrans' => '$1 киллэриилэр',
 'whatlinkshere-hidelinks' => '$1 сигэ (ыйынньык)',
-'whatlinkshere-hideimages' => '$1 Ð¾Ð¹Ñ\83Ñ\83 сигэтэ',
+'whatlinkshere-hideimages' => '$1 Ð±Ð¸Ð»Ñ\8d сигэтэ',
 'whatlinkshere-filters' => 'Фильтрдар',
 
 # Block/unblock
@@ -2666,7 +2661,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript тургутуу',
-'javascripttest-disabled' => 'Дьайыы бу биикигэ араарыллыбат эбит.',
 'javascripttest-title' => '$1 тургутуу бара турар',
 'javascripttest-pagetext-noframework' => 'Бу сирэй JavaScript тургутууларга анаммыт.',
 'javascripttest-pagetext-unknownframework' => '"$1" тургутуу биллибэт эйгэтэ.',
@@ -3479,6 +3473,7 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'version-software' => 'Туруоруллубут бырагырааммалар',
 'version-software-product' => 'Бородуукта',
 'version-software-version' => 'Барыл (торум)',
+'version-entrypoints' => 'Киирэр аадырыстар (URL)',
 'version-entrypoints-header-entrypoint' => 'Киирии сирэ',
 'version-entrypoints-header-url' => 'URL',
 
@@ -3631,6 +3626,10 @@ MediaWiki туһалаах буоллун диэн тарҕатыллар, ол
 'feedback-bugcheck' => 'Бэрт! Ол гынан баран [$1 биллэр алҕастарын] тиһилигэр майгынныыр сурук суоҕун тургут.',
 'feedback-bugnew' => 'Мин тургуттум. Атын алҕас туһунан',
 
+# Search suggestions
+'searchsuggest-search' => 'Көрдөөһүн',
+'searchsuggest-containing' => 'тыл баар ыстатыйалара...',
+
 # API errors
 'api-error-badaccess-groups' => 'Эн бу биикигэ билэ киллэрэриҥ хааччахтаммыт.',
 'api-error-badtoken' => 'Ис алҕас: Омсолоох токен.',
@@ -3647,7 +3646,8 @@ 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-banned-type' => '$1 — {{PLURAL:$4|билэ бобуллубут көрүҥэ|билэ бобуллубут көрүҥнэрэ}}. 
+Көҥүллэммит билэ {{PLURAL:$3|көрүҥэ маннык|көрүҥнэрэ манныктар}}: $2.',
 'api-error-filetype-missing' => 'Бу билэ тэнитиитэ (расширение) суох эбит.',
 'api-error-hookaborted' => 'Эн киллэрбит уларытыыгын кэҥэтии таҥастааччыта оннугар төннөрбүт.',
 'api-error-http' => 'Ис алҕас: Сиэрбэргэ холбонор табыллыбата.',
index dd50025..8f39ea1 100644 (file)
@@ -163,7 +163,6 @@ $messages = array(
 'qbbrowse' => 'Sendra',
 'qbedit' => 'Tońge',
 'qbpageoptions' => 'Noa sakam',
-'qbpageinfo' => 'Sakam reaḱ thuti',
 'qbmyoptions' => 'In̕anḱ sakamko',
 'qbspecialpages' => 'Asokay teaḱ sakamko',
 'faq' => 'Baḍae kupuliko',
@@ -397,9 +396,6 @@ $2',
 'virus-unknownscanner' => 'Baṅ urum anṭvayras:',
 
 # Login and logout pages
-'welcomecreation' => '== Johar $1! ==
-Amaḱ ekaunṭ do tearena.
-Amaḱ [[Special:Preferance {{SITENAME}} pạsindko]] thir dohoe lạgit́te alom hiṛińa.',
 'yourname' => 'Beoboharicaḱ ńutum',
 'yourpassword' => 'Uku namber',
 'yourpasswordagain' => 'Arhõ oku namber olme',
@@ -650,7 +646,7 @@ Onate noa ạrgumenṭkodo bạgi giḍi hoena.",
 'last' => 'Laha renaḱ',
 'page_first' => 'Pahilaḱ',
 'page_last' => 'Mucạt́aḱ',
-'histlegend' => "Farak bachao: oka nãwã aroeko tulạoem menet́kan, onako cinhạ em kate boloḱ se latar baṭon linmẽ.<br/>
+'histlegend' => "Farak bachao: oka nãwã aroeko tulạoem menet́kan, onako cinhạ em kate boloḱ se latar baṭon linmẽ.<br />
 Unuduḱ: '''({{int:cur}})''' = nahaḱ nãwã aroeko saõte tulạo, '''({{int:last}})''' = laha reaḱ nãwã aroe sãote tulạo, '''{{int:minoreditletter}}''' = huḍiń sompadon.",
 'history-fieldset-title' => 'Sendray jaṛ',
 'history-show-deleted' => 'khạli get giḍiyaḱ koge',
@@ -974,8 +970,6 @@ Noa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena',
 # Displayed when you click the "watch" button and it is in the process of watching
 'watching' => 'Ńeloḱ kana...',
 
-'changed' => 'Bodolena',
-
 # Delete
 'deletepage' => 'Sakam get giḍikam',
 'delete-legend' => 'Get giḍi',
index 560516f..f243f2c 100644 (file)
@@ -195,7 +195,6 @@ $messages = array(
 'qbbrowse' => 'Nàviga',
 'qbedit' => 'Acontza',
 'qbpageoptions' => 'Possibilidades de sa pàgina',
-'qbpageinfo' => 'Cuntestu de sa pàgina',
 'qbmyoptions' => 'Is preferèntzias meas',
 'qbspecialpages' => 'Pàginas spetziales',
 'faq' => 'Pregontas/Respostas (FAQ)',
@@ -392,11 +391,8 @@ Podet èsser stadu burradu dae calicunu àteru.',
 # Login and logout pages
 'logouttext' => "'''As acabadu sa sessione.'''
 
-Immoe podes sighire a impreare {{SITENAME}} in forma anònima, o ti podes [[Special:UserLogin|identificare torra]] comente su de prima o comente usuàriu diferente.
+Immoe podes sighire a impreare {{SITENAME}} in forma anònima, o ti podes <span class='plainlinks'>[$1 identificare torra]</span> comente su de prima o comente usuàriu diferente.
 Tene contu ca is pàginas ki sunt giai abertas in àteras bentanas podent sighire a pàrrer comente cando fias identificadu, fintzas a cando non ddas renfriscas.",
-'welcomecreation' => "== Benènnidu, $1! ==
-S'account tuo est istadu creadu.
-No iscaressa de personalizare sas [[Special:Preferences|preferèntzias de {{SITENAME}}]].",
 'yourname' => 'Nùmene usuàriu',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'Repite sa password:',
@@ -650,8 +646,6 @@ Cosas de ammentare: '''({{int:cur}})''' = diferèntzias cun sa versione currente
 'search-interwiki-caption' => 'Progetos frades',
 'search-interwiki-default' => '$1 resurtados:',
 'search-interwiki-more' => '(àteru)',
-'search-mwsuggest-enabled' => 'cun impostos',
-'search-mwsuggest-disabled' => 'chentza impostos',
 'searcheverything-enable' => 'Chirca in totu is nùmene-logos:',
 'searchall' => 'totu',
 'showingresults' => "Inoghe sighende {{PLURAL:$1|benit ammustradu '''1''' resurtadu|benint ammustrados '''$1''' resurtados}} incumentzende dae su nùmeru '''$2'''.",
@@ -1069,9 +1063,7 @@ Is mudàntzias de custa pàgina e de sa pàgina de cuntierras sua ant a bennere
 'watching' => 'Giunghende a sa watchlist...',
 'unwatching' => 'Boghende dae sa watchlist...',
 
-'enotif_newpagetext' => 'Custa est una pàgina noa.',
 'enotif_impersonal_salutation' => 'Usuàriu de {{SITENAME}}',
-'created' => 'creada',
 
 # Delete
 'deletepage' => 'Fùlia pàgina',
@@ -1560,4 +1552,7 @@ Is acàpius chi sighint in sa matessi lìnia sunt cunsideraus comente eccetzione
 # New logging system
 'newuserlog-byemail' => 'password imbiada via e-mail',
 
+# Search suggestions
+'searchsuggest-search' => 'Chirca',
+
 );
index a74b896..40f50d0 100644 (file)
@@ -10,6 +10,7 @@
  * @author Aushulz
  * @author Gmelfi
  * @author Kaganer
+ * @author Markos90
  * @author Melos
  * @author Omnipaedista
  * @author Santu
@@ -280,7 +281,6 @@ $messages = array(
 'qbbrowse' => 'Sfogghia',
 'qbedit' => 'Cancia',
 'qbpageoptions' => 'Opzioni pàggina',
-'qbpageinfo' => 'Nfurmazzioni supra la pàggina',
 'qbmyoptions' => 'Li mè pàggini',
 'qbspecialpages' => 'Pàggini spiciali',
 'faq' => 'Dumanni cumuni',
@@ -307,7 +307,7 @@ $messages = array(
 'returnto' => 'Ritorna a $1.',
 'tagline' => 'Di {{SITENAME}}',
 'help' => 'Aiutu',
-'search' => 'Trova',
+'search' => 'Arriscedi',
 'searchbutton' => "Va' cerca",
 'go' => 'Trova',
 'searcharticle' => 'Vai',
@@ -520,11 +520,9 @@ La mutivazzioni è chista: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Nisciuta. Ora siti fora.'''
 
-Poi cuntinuari a usari {{SITENAME}} di manera anònima, o poi [[Special:UserLogin|tràsiri n'àutra vota]] cu lu stissu o cu n'àutru nomu d'utenti.
+Poi cuntinuari a usari {{SITENAME}} di manera anònima, o poi <span class='plainlinks'>[$1 tràsiri n'àutra vota]</span> cu lu stissu o cu n'àutru nomu d'utenti.
 Accura chi quarchi pàggina pò cuntinuari a èssiri ammustrata comu si nun avissi nisciutu nzinu a quannu tu nun scancelli tutta la mimoria dû tò browser.",
-'welcomecreation' => "== Bonvinutu, $1! ==
-
-L'account hà statu criatu currettamenti. Nun ti scurdari di pirsunalizzari li [[Special:Preferences|prifirenzi di {{SITENAME}}]].",
+'welcomeuser' => 'Bommegna, $1!',
 'yourname' => "Lu tò nomu d'utenti (''user name'')",
 'yourpassword' => "La tò ''password''",
 'yourpasswordagain' => "Scrivi la password n'àutra vota",
@@ -950,6 +948,7 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 
 # Diffs
 'history-title' => 'Crunoluggìa dî canciamenti di "$1"',
+'difference-title' => '$1: diffirenzi ntra li virsiuni',
 'lineno' => 'Lìnia $1:',
 'compareselectedversions' => 'Fari lu paraguni',
 'showhideselectedversions' => 'Ammustra/ammuccia virsioni silizziunati',
@@ -996,8 +995,6 @@ S'havi accirtari ca la cuntinuità storica di la pàggina nun veni altirata.",
 'search-interwiki-caption' => 'Pruggetti frati',
 'search-interwiki-default' => 'Risultati da $1:',
 'search-interwiki-more' => '(cchiù)',
-'search-mwsuggest-enabled' => 'cu suggirimenti',
-'search-mwsuggest-disabled' => 'senza suggirimenti',
 'search-relatedarticle' => 'Risultati currilati',
 'mwsuggest-disable' => 'Astuta suggirimenti AJAX',
 'searcheverything-enable' => 'Cerca ni tutti li namespace',
@@ -1798,11 +1795,7 @@ Protucolli suppurtati: <code>$1</code>',
 
 'enotif_mailer' => 'Sistema di nutìfica via e-mail di {{SITENAME}}',
 'enotif_reset' => 'Segna tutti li pàggini comu già visitati',
-'enotif_newpagetext' => 'Chista è na pàggina nova.',
 'enotif_impersonal_salutation' => 'Utenti di {{SITENAME}}',
-'changed' => 'canciatu',
-'created' => 'criatu',
-'enotif_subject' => 'La pàggina $PAGETITLE di {{SITENAME}} hà stata $CHANGEDORCREATED di $PAGEEDITOR',
 'enotif_lastvisited' => 'Cunzurta $1 pi vìdiri tutti li canciamenti dâ tò ùrtima vìsita.',
 'enotif_lastdiff' => 'Vìdiri $1 pi visualizzari lu canciamentu.',
 'enotif_anon_editor' => 'utenti anonimu $1',
@@ -2324,8 +2317,8 @@ Visita [//www.mediawiki.org/wiki/Localisation MediaWiki Localisation] e [//trans
 'tooltip-ca-watch' => 'Agghiunci sta pàggina â tò lista di ossirvati spiciali',
 'tooltip-ca-unwatch' => 'Elìmina sta pàggina dâ tò lista di ossirvati spiciali',
 'tooltip-search' => "Cerca 'n {{SITENAME}}",
-'tooltip-search-go' => 'Vai a na pàggina cu chistu nomu esattu si asisti',
-'tooltip-search-fulltext' => 'Attrova pàggini pi chistu testu',
+'tooltip-search-go' => 'Vai a na pàggina cu chistu nomu esattu siddu asisti',
+'tooltip-search-fulltext' => 'Arriscedi pàggini pi chistu testu',
 'tooltip-p-logo' => 'Pàggina principali',
 'tooltip-n-mainpage' => 'Vìsita la pàggina principali',
 'tooltip-n-mainpage-description' => 'Talìa la pàggina principali',
@@ -2986,6 +2979,9 @@ Mèttiri lu nomu dû file senza lu prifissu "{{ns:file}}:"',
 'logentry-newusers-create' => '$1 criau na utenza',
 'newuserlog-byemail' => 'password mannata via mail',
 
+# Search suggestions
+'searchsuggest-search' => 'Ricerca',
+
 # API errors
 'api-error-nomodule' => 'Erruri nternu: nun fu mpustatu lu mòdulu di carricamentu',
 'api-error-ok-but-empty' => 'Erruri ntenru: nudda risposta dû server',
index 95939d5..8fae11a 100644 (file)
@@ -159,7 +159,6 @@ $messages = array(
 'qbbrowse' => 'Brouse',
 'qbedit' => 'Edit',
 'qbpageoptions' => 'This page',
-'qbpageinfo' => 'Context',
 'qbmyoptions' => 'Ma pages',
 'qbspecialpages' => 'Byordinar pages',
 'faq' => 'ASQ',
@@ -372,10 +371,6 @@ The grunds for this are: ''$2''.",
 
 Ye can continue to uise {{SITENAME}} namelessly, or ye can log in again as the same or as a different uiser.
 Mynd that some pages micht continue tae be displayed as if ye war aye loggit in, till ye clear yer brouser cache.",
-'welcomecreation' => '== Guid tae see ye, $1! ==
-
-Yer accoont haes been creatit.
-Mynd an chynge yer [[Special:Preferences|{{SITENAME}} preferences]].',
 'yourname' => 'Yer uiser name',
 'yourpassword' => 'Passwaird:',
 'yourpasswordagain' => 'Retype passwaird:',
@@ -731,8 +726,6 @@ there micht be parteeculars in the [{{fullurl:{{#Special:Log}}/suppress|page={{F
 'search-section' => '(section $1)',
 'search-suggest' => 'Did ye mean: $1',
 'search-interwiki-more' => '(more)',
-'search-mwsuggest-enabled' => 'wi suggestions',
-'search-mwsuggest-disabled' => 'nae propone',
 'searchrelated' => 'related',
 'searchall' => 'aw',
 'showingresults' => "Shawin ablo up tae {{PLURAL:$1|'''1''' result|'''$1''' results}} stertin wi #'''$2'''.",
@@ -1101,9 +1094,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'unwatching' => 'Unwatchin...',
 
 'enotif_reset' => 'Merk aa pages visitit',
-'changed' => 'chynged',
-'created' => 'creatit',
-'enotif_subject' => '{{SITENAME}} page $PAGETITLE haes been $CHANGEDORCREATED bi $PAGEEDITOR',
 'enotif_lastvisited' => 'Hae a leuk at $1 for aa chynges sin yer last visit.',
 
 # Delete
index 13f0764..7b37ec7 100644 (file)
@@ -713,10 +713,6 @@ $1 {{PLURAL:$1|اکر|اکرن}} کان ننڍي هوڻ گھرجي.',
 'watching' => 'ٽيٽيندي...',
 'unwatching' => 'اڻ ٽيٽيندي...',
 
-'enotif_newpagetext' => 'هيءُ هڪ نئون صفحو آهي.',
-'changed' => 'تبديل ٿي ويو',
-'created' => 'ٺهي چڪو',
-
 # Delete
 'deletepage' => 'صفحو ڊاهيو',
 'confirm' => 'پڪ ڪريو',
index 80a7268..b63dd6b 100644 (file)
@@ -230,7 +230,6 @@ $messages = array(
 'qbbrowse' => 'Iffuglia',
 'qbedit' => 'Mudifigga',
 'qbpageoptions' => 'Prifirenzi pàgina',
-'qbpageinfo' => "Infuimmazioni i' la pàgina",
 'qbmyoptions' => "Li me' pàgini",
 'qbspecialpages' => 'Pàgini ippiziari',
 'faq' => 'FAQ (infuimmazioni e aggiuddu)',
@@ -437,9 +436,6 @@ La rasgioni frunidda è ''$2''.",
 
 Si pò sighì a usà {{SITENAME}} cumenti utenti anònimu oppuru eseguì una noba intradda, cu' lu matessi innòmu utenti o un'innòmu dibessu.
 Zerthuni pàgini pudìani continuà a apparì cumenti si la iscidda nò fùssia avvinudda finaghì nò vèni puridda la mimória cache di lu propriu nabiggadori.",
-'welcomecreation' => '== Binvinuddu, $1! ==
-
-La registhrazioni è isthadda criadda currettamenti. No dimintiggà di passunarizzà li prifirenzi di {{SITENAME}}.',
 'yourname' => 'Innòmu utenti',
 'yourpassword' => "Paràura d'órdhini",
 'yourpasswordagain' => "Ripeti la paràura d'órdhini",
@@ -790,8 +786,6 @@ Cunsulthà lu [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} rigi
 'search-interwiki-caption' => 'Prugetti fraddeddi',
 'search-interwiki-default' => 'Risulthaddi da $1:',
 'search-interwiki-more' => '(althru)',
-'search-mwsuggest-enabled' => 'cun suggerimenti',
-'search-mwsuggest-disabled' => 'chena suggerimenti',
 'search-relatedarticle' => 'Risulthaddi curriraddi',
 'searchrelated' => 'curriraddi',
 'searchall' => 'tutti',
@@ -1310,11 +1304,7 @@ Si daboi s'à gana d'eliminà la pàgina da la listha di l'abbaidaddi ippiziarii
 
 'enotif_mailer' => 'Sisthema di nutìfica via postha erettrònica di {{SITENAME}}',
 'enotif_reset' => 'Signa tutti li pàgini cumenti già visitaddi',
-'enotif_newpagetext' => 'Chistha è una pàgina nóba.',
 'enotif_impersonal_salutation' => 'Utenti di {{SITENAME}}',
-'changed' => 'ciambadda',
-'created' => 'criadda',
-'enotif_subject' => 'La pàgina $PAGETITLE di {{SITENAME}} è isthadda $CHANGEDORCREATED da $PAGEEDITOR',
 'enotif_lastvisited' => "Cunsultha $1 pa vidé tutti li mudìfigghi da l'ulthima visita tóia.",
 'enotif_lastdiff' => 'Vidé $1 pa visuarizzà la mudìfigga.',
 'enotif_anon_editor' => 'utenti anònimu $1',
index f25c1fb..6f8b233 100644 (file)
@@ -43,52 +43,81 @@ $namespaceAliases = array(
 
 $specialPageAliases = array(
        'Activeusers'               => array( 'Aktiivvalaš_geavaheaddjit' ),
-       'Allmessages'               => array( 'Buot_systemasánit' ),
+       'Allmessages'               => array( 'Buot_systemadieđáhusat', 'Buot_vuogádatdieđáhusat' ),
        'Allpages'                  => array( 'Buot_siiddut' ),
        'Ancientpages'              => array( 'Dološ_siiddut' ),
-       'Block'                     => array( 'Cagge_geavaheaddji' ),
+       'Badtitle'                  => array( 'Veadjemeahttun_bajilčála' ),
+       'Blankpage'                 => array( 'Guoros_siidu' ),
+       'Block'                     => array( 'Hehtte', 'Hehtte_geavaheaddji', 'Hehtte_IP' ),
+       'Blockme'                   => array( 'Hehtte_mu' ),
        'Booksources'               => array( 'Girjegáldut' ),
+       'BrokenRedirects'           => array( 'Feaillalaš_stivremat', 'Feaillalaš_ođđasitstivremat' ),
        'Categories'                => array( 'Kategoriijat' ),
-       'Contributions'             => array( 'Geavaheaddji_rievdadusat' ),
+       'ComparePages'              => array( 'Veardit_siidduid' ),
+       'Confirmemail'              => array( 'Sihkaraste_e-poastta' ),
+       'Contributions'             => array( 'Rievdadusat' ),
+       'CreateAccount'             => array( 'Ráhkat_dovddaldaga' ),
+       'DeletedContributions'      => array( 'Sihkkojuvvon_rievdadusat' ),
        'Disambiguations'           => array( 'Liŋkkat_dárkonsiidduide' ),
        'DoubleRedirects'           => array( 'Guoktegeardásaš_ođđasitstivremat' ),
-       'Emailuser'                 => array( 'SáddeEpoastta' ),
+       'EditWatchlist'             => array( 'Rievdat_čuovvunlisttu' ),
+       'Emailuser'                 => array( 'Sádde_e-poastta' ),
        'Export'                    => array( 'Olggosfievrrit_siidduid' ),
+       'Import'                    => array( 'Sisafievrrit' ),
+       'BlockList'                 => array( 'Hehttenlistu', 'Listu_hehttemiin' ),
+       'Listadmins'                => array( 'Administráhtorlistu', 'Listu_administráhtoriin' ),
+       'Listbots'                  => array( 'Bohttalistu', 'Listu_bohtain' ),
        'Listfiles'                 => array( 'Fiilalogahallan' ),
-       'Listredirects'             => array( 'Listu_ođđasitstivremiin' ),
-       'Listusers'                 => array( 'Listu_geavaheddjiin' ),
+       'Listgrouprights'           => array( 'Listu_joavkkuid_vuoigavuođain' ),
+       'Listredirects'             => array( 'Stivrenlistu', 'Listu_stivremiin', 'Listu_ođđasitstivremiin' ),
+       'Listusers'                 => array( 'Geavaheaddjelistu', 'Listu_geavaheddjiin' ),
        'Log'                       => array( 'Loggat', 'Logga' ),
        'Lonelypages'               => array( 'Oarbbes_siiddut' ),
        'Longpages'                 => array( 'Guhkes_siiddut' ),
        'MIMEsearch'                => array( 'MIME-ohcan' ),
-       'Newimages'                 => array( 'Ođđa_govat' ),
+       'Movepage'                  => array( 'Sirdde_siiddu' ),
+       'Mycontributions'           => array( 'Mu_rievdadusat' ),
+       'Mypage'                    => array( 'Mu_siidu' ),
+       'Mytalk'                    => array( 'Mu_ságastallan' ),
+       'Newimages'                 => array( 'Ođđa_govat', 'Ođđa_fiillat' ),
        'Newpages'                  => array( 'Ođđa_siiddut' ),
-       'Preferences'               => array( 'Válljemat' ),
+       'Popularpages'              => array( 'Bivnnuhis_siiddut' ),
+       'Preferences'               => array( 'Válljemat', 'Ásahusat' ),
        'Protectedpages'            => array( 'Suodjaluvvon_siiddut' ),
-       'Randompage'                => array( 'Summal_siidu' ),
+       'Protectedtitles'           => array( 'Suodjaluvvon_bajilčállagat', 'Suodjaluvvon_siidonamat' ),
+       'Randompage'                => array( 'Summal', 'Summal_siidu' ),
        'Randomredirect'            => array( 'Summal_ođđasitstivren' ),
        'Recentchanges'             => array( 'Varas_rievdadusat' ),
+       'Revisiondelete'            => array( 'Sihko_veršuvnna' ),
        'Search'                    => array( 'Oza' ),
        'Shortpages'                => array( 'Oanehis_siiddut' ),
-       'Specialpages'              => array( 'Erenoamáš_siiddut' ),
+       'Specialpages'              => array( 'Erenoamáš_siiddut', 'Doaibmasiiddut' ),
        'Statistics'                => array( 'Statistihkat' ),
-       'Uncategorizedcategories'   => array( 'Klassifiserekeahtes_kategoriijat' ),
-       'Uncategorizedimages'       => array( 'Klassifiserekeahtes_govat' ),
-       'Uncategorizedpages'        => array( 'Klassifiserekeahtes_siiddut' ),
-       'Uncategorizedtemplates'    => array( 'Klassifiserekeahtes_mállevuođut' ),
-       'Unusedcategories'          => array( 'Geavatkeahtes_lágit' ),
-       'Unusedimages'              => array( 'Geavatkeahtes_govat' ),
-       'Unusedtemplates'           => array( 'Geavatkeahtes_mállevuođut' ),
-       'Unwatchedpages'            => array( 'Čuovvotkeahtes_siiddut' ),
+       'Unblock'                   => array( 'Sihko_hehttema' ),
+       'Uncategorizedcategories'   => array( 'Kategoriserekeahtes_kategoriijat' ),
+       'Uncategorizedimages'       => array( 'Kategoriserekeahtes_govat', 'Kategoriserekeahtes_fiillat' ),
+       'Uncategorizedpages'        => array( 'Kategoriserekeahtes_siiddut' ),
+       'Uncategorizedtemplates'    => array( 'Kategoriserekeahtes_mállet' ),
+       'Undelete'                  => array( 'Máhccat' ),
+       'Unusedcategories'          => array( 'Geavatkeahtes_kategoriijat' ),
+       'Unusedimages'              => array( 'Geavatkeahtes_govat', 'Geavatkeahtes_fiillat' ),
+       'Unusedtemplates'           => array( 'Geavatkeahtes_mállet' ),
+       'Unwatchedpages'            => array( 'Čuovotkeahtes_siiddut' ),
        'Upload'                    => array( 'Sádde_fiilla' ),
+       'Userlogin'                 => array( 'Logge_sisa' ),
+       'Userlogout'                => array( 'Logge_olggos' ),
+       'Userrights'                => array( 'Geavaheaddjevuoigatvuođat' ),
        'Version'                   => array( 'Veršuvdna' ),
        'Wantedcategories'          => array( 'Kategoriijasávaldagat' ),
-       'Wantedpages'               => array( 'Siidusávaldagat' ),
+       'Wantedfiles'               => array( 'Fiilasávaldagat', 'Govvasávaldagat' ),
+       'Wantedpages'               => array( 'Siidosávaldagat' ),
+       'Wantedtemplates'           => array( 'Mállesávaldagat' ),
        'Watchlist'                 => array( 'Čuovvunlistu' ),
+       'Withoutinterwiki'          => array( 'Interwikihis_siiddut', 'Giellaliŋkkahis_siiddut', 'Giellaleaŋkkahis_siiddut' ),
 );
 
 $magicWords = array(
-       'redirect'                  => array( '0', '#OĐĐASITSTIVREN', '#STIVREN', '#REDIRECT' ),
+       'redirect'                  => array( '0', '#STIVREN', '#OĐĐASITSTIVREN', '#REDIRECT' ),
        'numberofarticles'          => array( '1', 'ARTIHKKALIIDMEARRI', 'NUMBEROFARTICLES' ),
 );
 
@@ -206,7 +235,6 @@ $messages = array(
 'qbbrowse' => 'Bláđe',
 'qbedit' => 'Rievdat',
 'qbpageoptions' => 'Siidoásahusat',
-'qbpageinfo' => 'Siiddu dieđut',
 'qbmyoptions' => 'Ásahusat',
 'qbspecialpages' => 'Doaibmasiiddut',
 
@@ -357,9 +385,6 @@ $messages = array(
 'logouttext' => "'''Don leat dál loggen olggos {{GRAMMAR:elative|{{SITENAME}}}}s.'''
 
 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.',
 'yourname' => 'Geavaheaddjidovddaldat',
 'yourpassword' => 'Suollemassátni:',
 'yourpasswordagain' => 'Čále suollemassáni ođđasit:',
@@ -1016,11 +1041,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => '{{GRAMMAR:genitive|{{SITENAME}}}} siidu lea rievdaduvvon -almmuhus',
 'enotif_reset' => 'Merke buot siidduid gehččojuvvon',
-'enotif_newpagetext' => 'Dát lea ođđa siidu.',
 'enotif_impersonal_salutation' => '{{SITENAME}}-geavaheaddji',
-'changed' => 'rievdadan siiddu',
-'created' => 'álggahan siiddu',
-'enotif_subject' => '$PAGEEDITOR on $CHANGEDORCREATED $PAGETITLE',
 'enotif_lastvisited' => 'Čujuhusas $1 leat buot rievdadusat du maŋimus geavahangearddi maŋŋá.',
 'enotif_lastdiff' => 'Rievdadus lea čujuhusas $1.',
 'enotif_anon_editor' => 'registereretkeahtes geavaheaddji $1',
@@ -1446,4 +1467,7 @@ Siiddus $2 lea listu maŋimus sihkomiin.',
 'logentry-newusers-create' => '$1 ráhkadii dovddaldaga',
 'logentry-newusers-autocreate' => 'Dovddaldat $1 ráhkaduvvui automáhtalaččat',
 
+# Search suggestions
+'searchsuggest-search' => 'Oza',
+
 );
index 6abfc5a..4b19c56 100644 (file)
@@ -133,7 +133,6 @@ $messages = array(
 'qbbrowse' => 'Quetzexal',
 'qbedit' => 'Ticpatlöx',
 'qbpageoptions' => 'Jan páhina',
-'qbpageinfo' => 'Contextua',
 'qbmyoptions' => 'Hepáhinám',
 'qbspecialpages' => 'Páhinám extravám',
 'faq' => 'Cocmíiit cmaa',
@@ -320,9 +319,6 @@ $2',
 
 Mecontinudad usadad {{SITENAME}} anon jïx me caápo dajcaitom ö jömcaitom.
 Páhinám pac continudad displayom dajme caápo, jánclearom mecachede browser.",
-'welcomecreation' => "== Q'$1! ==
-
-Mecaitom coccebj creatöx. Quiix hequáatlaácde {{SITENAME}} pos-poop.",
 'yourname' => 'Caitom ID:',
 'yourpassword' => 'Quimx canj:',
 'yourpasswordagain' => 'Vanquimx canj:',
@@ -890,10 +886,7 @@ iitom e-iitomde diijömde caitóm.',
 'watching' => 'Cáminot...',
 'unwatching' => 'Necáminot...',
 
-'enotif_newpagetext' => 'Jan coccebj hunpáhina.',
 'enotif_impersonal_salutation' => '{{SITENAME}} caitom',
-'changed' => 'quiixöx',
-'created' => 'creacöx',
 'enotif_anon_editor' => 'caitom anoniimom $1',
 
 # Delete
index 84e9ed3..a0cff5a 100644 (file)
@@ -15,237 +15,237 @@ $fallback = 'fr';
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'Gbënëngö-gbê',
-'tog-justify'                 => 'Lôngbi yângâ tî âsurä',
-'tog-hideminor'               => 'Hônde âkêtê lönzïngö-sû sô asï fadê na yâ tî gbâsû',
-'tog-hidepatrolled'           => 'Hônde âlönzïngö-sû sô asï  na hönngö na yâ tî gbâsû',
-'tog-newpageshidepatrolled'   => 'Na pöpö tî âlêmbëtï nî, hônde âla sô a yeke bâa ndo daä.',
-'tog-extendwatchlist'         => 'Gbara molongö tî bängö-pekô sï atanda gï âfinî âsänzëmä pëpe me âsänzëmä kûê kûê.',
-'tog-usenewrc'                => 'Sâra kua na âfinî sänzëmä sô alônzi ângbêre nî (ahûnda Javascript)',
-'tog-numberheadings'          => 'Sû nömörö bîakü bîakü na terê tî âlisurä',
-'tog-showtoolbar'             => 'Fa motarâka tî sepesû (ahûnda Javascript)',
-'tog-editondblclick'          => 'Pîka kpêkê ûse tî sepe lêmbëtï (ahûnda Javascript)',
-'tog-editsection'             => 'Zîngo sëpengö surä na gbê "[Sepe]"',
+'tog-underline' => 'Gbënëngö-gbê',
+'tog-justify' => 'Lôngbi yângâ tî âsurä',
+'tog-hideminor' => 'Hônde âkêtê lönzïngö-sû sô asï fadê na yâ tî gbâsû',
+'tog-hidepatrolled' => 'Hônde âlönzïngö-sû sô asï  na hönngö na yâ tî gbâsû',
+'tog-newpageshidepatrolled' => 'Na pöpö tî âlêmbëtï nî, hônde âla sô a yeke bâa ndo daä.',
+'tog-extendwatchlist' => 'Gbara molongö tî bängö-pekô sï atanda gï âfinî âsänzëmä pëpe me âsänzëmä kûê kûê.',
+'tog-usenewrc' => 'Sâra kua na âfinî sänzëmä sô alônzi ângbêre nî (ahûnda Javascript)',
+'tog-numberheadings' => 'Sû nömörö bîakü bîakü na terê tî âlisurä',
+'tog-showtoolbar' => 'Fa motarâka tî sepesû (ahûnda Javascript)',
+'tog-editondblclick' => 'Pîka kpêkê ûse tî sepe lêmbëtï (ahûnda Javascript)',
+'tog-editsection' => 'Zîngo sëpengö surä na gbê "[Sepe]"',
 'tog-editsectiononrightclick' => 'Pîka kötï kpêkê na ndö tî lisurä sï mo sepe nî (ahûnda Javascript)',
-'tog-showtoc'                 => 'Fa molongö tî münä (tî âlêmbëtï sô ayeke na surä otâ)',
-'tog-rememberpassword'        => 'Da bê na sênyîmbâ tî mbï (asï {{PLURAL:$1|längö|längö}}) $1',
-'tog-watchcreations'          => 'Âlêmbëtï sô mbï sâra, zîa nî kûê na yâ tî molongö tî mbï tî bängö-pekô.',
-'tog-watchdefault'            => 'Âlêmbëtï sô mbï sepe, zîa nî kûê na yâ tî molongö tî mbï tî bängö-pekô.',
-'tog-watchmoves'              => 'Âlêmbëtï sô mbï sanzêe ïrï nî, zîa nî kûê na yâ tî molongö tî mbï tî bängö-pekô.',
-'tog-watchdeletion'           => 'Âlêmbëtï sô mbï woza nî, zîa nî kûê na yâ tî molongö tî mbï tî bängö-pekô.',
-'tog-minordefault'            => 'Tî sêtîa nî, sûngi âsepesû kûê töngana kêtê sepesû',
-'tog-previewontop'            => 'Tanda piabängö-nî na ndöbê tî zuka tî sepesû',
-'tog-previewonfirst'          => 'Fa piabängö kôzo sepesû',
-'tog-nocache'                 => 'Zî höndëngö-lêmbëtï na kpëlidimbä',
-'tog-enotifwatchlistpages'    => '¨To na mbï mbëtïsînga töngana mbênî lêmbetï asanzêe na yâ tî molongö tî mbï tî bängö-pekô.',
-'tog-enotifusertalkpages'     => 'To na mbï mbëtïsînga töngana mbênî lêmbëtë asanzêe na yâ tî dalisoro tî mbï',
-'tog-enotifminoredits'        => 'To na mbï mbëtïsînga lâkûê sô mbênî kêtê sänzëmä asï na yâ tî âlêmbëtï tî mbï.',
-'tog-enotifrevealaddr'        => 'Fa lindosînga tî mbï na yâ tî âmbëtïsînga tî zënngö-zo',
-'tog-shownumberswatching'     => 'Fa wüngö tî ânyîmbâ sô ayeke bâa lêmbëtï sô',
-'tog-oldsig'                  => 'Këkërë sô ayeke daä awe:',
-'tog-fancysig'                => 'Mû kekere nî töngana sêngê gbâsû tî Wïkï (sân taâ gbê)',
-
-'underline-always'  => 'Lâkûê',
-'underline-never'   => 'Lâ ôko pëpe',
+'tog-showtoc' => 'Fa molongö tî münä (tî âlêmbëtï sô ayeke na surä otâ)',
+'tog-rememberpassword' => 'Da bê na sênyîmbâ tî mbï (asï {{PLURAL:$1|längö|längö}}) $1',
+'tog-watchcreations' => 'Âlêmbëtï sô mbï sâra, zîa nî kûê na yâ tî molongö tî mbï tî bängö-pekô.',
+'tog-watchdefault' => 'Âlêmbëtï sô mbï sepe, zîa nî kûê na yâ tî molongö tî mbï tî bängö-pekô.',
+'tog-watchmoves' => 'Âlêmbëtï sô mbï sanzêe ïrï nî, zîa nî kûê na yâ tî molongö tî mbï tî bängö-pekô.',
+'tog-watchdeletion' => 'Âlêmbëtï sô mbï woza nî, zîa nî kûê na yâ tî molongö tî mbï tî bängö-pekô.',
+'tog-minordefault' => 'Tî sêtîa nî, sûngi âsepesû kûê töngana kêtê sepesû',
+'tog-previewontop' => 'Tanda piabängö-nî na ndöbê tî zuka tî sepesû',
+'tog-previewonfirst' => 'Fa piabängö kôzo sepesû',
+'tog-nocache' => 'Zî höndëngö-lêmbëtï na kpëlidimbä',
+'tog-enotifwatchlistpages' => '¨To na mbï mbëtïsînga töngana mbênî lêmbetï asanzêe na yâ tî molongö tî mbï tî bängö-pekô.',
+'tog-enotifusertalkpages' => 'To na mbï mbëtïsînga töngana mbênî lêmbëtë asanzêe na yâ tî dalisoro tî mbï',
+'tog-enotifminoredits' => 'To na mbï mbëtïsînga lâkûê sô mbênî kêtê sänzëmä asï na yâ tî âlêmbëtï tî mbï.',
+'tog-enotifrevealaddr' => 'Fa lindosînga tî mbï na yâ tî âmbëtïsînga tî zënngö-zo',
+'tog-shownumberswatching' => 'Fa wüngö tî ânyîmbâ sô ayeke bâa lêmbëtï sô',
+'tog-oldsig' => 'Këkërë sô ayeke daä awe:',
+'tog-fancysig' => 'Mû kekere nî töngana sêngê gbâsû tî Wïkï (sân taâ gbê)',
+
+'underline-always' => 'Lâkûê',
+'underline-never' => 'Lâ ôko pëpe',
 'underline-default' => 'Ketîa ngbondö tî kpëlisimbä',
 
 # Font style option in Special:Preferences
-'editfont-style'     => 'Fasöon tî gbâgerêsû tî sepesû nî',
-'editfont-default'   => 'Ketîa tî kpëlitondo',
+'editfont-style' => 'Fasöon tî gbâgerêsû tî sepesû nî',
+'editfont-default' => 'Ketîa tî kpëlitondo',
 'editfont-monospace' => 'Gbâgerêsû tî kpengü fündä',
 'editfont-sansserif' => 'Gbâgerêsû tî kûyû garê',
-'editfont-serif'     => 'Gbâgerêsû na kîndâ',
+'editfont-serif' => 'Gbâgerêsû na kîndâ',
 
 # Dates
-'sunday'        => 'lâyenga',
-'monday'        => 'bïkuako',
-'tuesday'       => 'bïkuase',
-'wednesday'     => 'bïkuatâ',
-'thursday'      => 'bïkuasïö',
-'friday'        => 'bïkuakü',
-'saturday'      => 'lâpôsö',
-'sun'           => 'lây',
-'mon'           => 'bk1',
-'tue'           => 'bk2',
-'wed'           => 'bk3',
-'thu'           => 'bk4',
-'fri'           => 'bk5',
-'sat'           => 'lâp',
-'january'       => 'Nyenye',
-'february'      => 'Fulundïgi',
-'march'         => 'Mbängü',
-'april'         => 'Ngubë',
-'may_long'      => 'Bêläwü',
-'june'          => 'Föndo',
-'july'          => 'Lengua',
-'august'        => 'Kükürü',
-'september'     => 'Mvuka',
-'october'       => 'Ngberere',
-'november'      => 'Nabändüru',
-'december'      => 'Kakawuka',
-'january-gen'   => 'Nyenye',
-'february-gen'  => 'Fulundïgi',
-'march-gen'     => 'Mbängü',
-'april-gen'     => 'Ngubä',
-'may-gen'       => 'Bâläwü',
-'june-gen'      => 'Föndo',
-'july-gen'      => 'Lengua',
-'august-gen'    => 'Kükürü',
+'sunday' => 'lâyenga',
+'monday' => 'bïkuako',
+'tuesday' => 'bïkuase',
+'wednesday' => 'bïkuatâ',
+'thursday' => 'bïkuasïö',
+'friday' => 'bïkuakü',
+'saturday' => 'lâpôsö',
+'sun' => 'lây',
+'mon' => 'bk1',
+'tue' => 'bk2',
+'wed' => 'bk3',
+'thu' => 'bk4',
+'fri' => 'bk5',
+'sat' => 'lâp',
+'january' => 'Nyenye',
+'february' => 'Fulundïgi',
+'march' => 'Mbängü',
+'april' => 'Ngubë',
+'may_long' => 'Bêläwü',
+'june' => 'Föndo',
+'july' => 'Lengua',
+'august' => 'Kükürü',
+'september' => 'Mvuka',
+'october' => 'Ngberere',
+'november' => 'Nabändüru',
+'december' => 'Kakawuka',
+'january-gen' => 'Nyenye',
+'february-gen' => 'Fulundïgi',
+'march-gen' => 'Mbängü',
+'april-gen' => 'Ngubä',
+'may-gen' => 'Bâläwü',
+'june-gen' => 'Föndo',
+'july-gen' => 'Lengua',
+'august-gen' => 'Kükürü',
 'september-gen' => 'Mvuka',
-'october-gen'   => 'Ngberere',
-'november-gen'  => 'Nabändüru',
-'december-gen'  => 'Kakawuka',
-'jan'           => 'Nye',
-'feb'           => 'Ful',
-'mar'           => 'Mba',
-'apr'           => 'Ngu',
-'may'           => 'Bêl',
-'jun'           => 'Fön',
-'jul'           => 'Len',
-'aug'           => 'Kük',
-'sep'           => 'Mvu',
-'oct'           => 'Ngb',
-'nov'           => 'Nab',
-'dec'           => 'Kak',
+'october-gen' => 'Ngberere',
+'november-gen' => 'Nabändüru',
+'december-gen' => 'Kakawuka',
+'jan' => 'Nye',
+'feb' => 'Ful',
+'mar' => 'Mba',
+'apr' => 'Ngu',
+'may' => 'Bêl',
+'jun' => 'Fön',
+'jul' => 'Len',
+'aug' => 'Kük',
+'sep' => 'Mvu',
+'oct' => 'Ngb',
+'nov' => 'Nab',
+'dec' => 'Kak',
 
 # Categories related messages
-'pagecategories'           => '{{PLURAL:$1|Fündä|Âfundä}}',
-'category_header'          => 'Âlâmbëtï na yâ tî fündä « $1 »',
-'subcategories'            => 'gbefündä',
-'category-media-header'    => 'Kuru tî kôtevungä na yâ tî fündä "$1"',
-'category-empty'           => '"Fündä sô ayeke na lêmbëtï, wala gbefündä, wala kuru tî kôtevungä, ôko pëpe."',
-'hidden-categories'        => 'Höndëngö {{PLURAL:$1|fündä|âfündä}}',
+'pagecategories' => '{{PLURAL:$1|Fündä|Âfundä}}',
+'category_header' => 'Âlâmbëtï na yâ tî fündä « $1 »',
+'subcategories' => 'gbefündä',
+'category-media-header' => 'Kuru tî kôtevungä na yâ tî fündä "$1"',
+'category-empty' => '"Fündä sô ayeke na lêmbëtï, wala gbefündä, wala kuru tî kôtevungä, ôko pëpe."',
+'hidden-categories' => 'Höndëngö {{PLURAL:$1|fündä|âfündä}}',
 'hidden-category-category' => 'Âhöndëngö âf¨¨undä',
-'listingcontinuesabbrev'   => '(pekô nî)',
-'index-category'           => 'Âlêmbëtï sô akpo nî',
-'noindex-category'         => 'Âlêmbëtï sô a kpö nî pëpe',
-'broken-file-category'     => 'Âlêmbëtï sô ayeke na âfängö gbê tî kuru',
-
-'about'         => 'Na ndö tî...',
-'article'       => 'Lêmbëtï tî münä',
-'newwindow'     => '(avula finî döpulä)',
-'cancel'        => 'Woza',
+'listingcontinuesabbrev' => '(pekô nî)',
+'index-category' => 'Âlêmbëtï sô akpo nî',
+'noindex-category' => 'Âlêmbëtï sô a kpö nî pëpe',
+'broken-file-category' => 'Âlêmbëtï sô ayeke na âfängö gbê tî kuru',
+
+'about' => 'Na ndö tî...',
+'article' => 'Lêmbëtï tî münä',
+'newwindow' => '(avula finî döpulä)',
+'cancel' => 'Woza',
 'moredotdotdot' => 'Mbênî...',
-'mypage'        => 'Lêmbëtï tî mbï',
-'mytalk'        => 'Lisoro tî mbï',
-'anontalk'      => 'Lisoro na lindo IP sô',
-'navigation'    => 'Simba',
-'and'           => '&#32;na',
+'mypage' => 'Lêmbëtï tî mbï',
+'mytalk' => 'Lisoro tî mbï',
+'anontalk' => 'Lisoro na lindo IP sô',
+'navigation' => 'Simba',
+'and' => '&#32;na',
 
 # Cologne Blue skin
-'qbfind'         => 'Gi',
-'qbbrowse'       => 'Hasa',
-'qbedit'         => 'Sepe',
-'qbpageoptions'  => 'Lêmbëtï sô',
-'qbpageinfo'     => 'Ndongoro',
-'qbmyoptions'    => 'Âlêmbëtï tî mbï',
+'qbfind' => 'Gi',
+'qbbrowse' => 'Hasa',
+'qbedit' => 'Sepe',
+'qbpageoptions' => 'Lêmbëtï sô',
+'qbpageinfo' => 'Ndongoro',
+'qbmyoptions' => 'Âlêmbëtï tî mbï',
 'qbspecialpages' => 'Âlêmbëtï ndê',
-'faq'            => 'Âhûnda',
-'faqpage'        => 'Project:Âhûnda',
+'faq' => 'Âhûnda',
+'faqpage' => 'Project:Âhûnda',
 
 # Vector skin
 'vector-action-addsection' => 'Zîa mbênî lilö daä',
-'vector-action-delete'     => 'Lungûla',
-'vector-action-move'       => 'Sanzêe ïrï',
-'vector-action-protect'    => 'Funga',
-'vector-action-undelete'   => 'Kîri na nî',
-'vector-action-unprotect'  => 'Sanzêe fungä',
-'vector-view-create'       => 'Seka',
-'vector-view-edit'         => 'Sepe',
-'vector-view-history'      => 'Tanda mbai nî',
-'vector-view-view'         => 'Dîko',
-'vector-view-viewsource'   => 'Fa ligbî nî',
-'actions'                  => 'Kua',
-'namespaces'               => 'Pöpö tî âïrï',
-'variants'                 => 'Âmbênî marä nî',
-
-'errorpagetitle'    => 'Yûndo',
-'returnto'          => 'Kîri na ndö tî lêmbëtï $1.',
-'tagline'           => 'Alöndö na  {{SITENAME}}',
-'help'              => 'Za mbï',
-'search'            => 'Gi',
-'searchbutton'      => 'Gi',
-'go'                => 'Bâa',
-'searcharticle'     => 'Dîko',
-'history'           => 'Mbai tî lêmbëtï nî',
-'history_short'     => 'mbai',
-'updatedmarker'     => 'afinima ngbêreyê sô mbï sï daä sô',
-'printableversion'  => 'Mbâlê tî pete na sasango',
-'permalink'         => 'Kpengü gbê tî lêmbëtï nî',
-'print'             => 'Pete na sasango',
-'view'              => 'Tändä',
-'edit'              => 'Sepe',
-'create'            => 'Seka',
-'editthispage'      => 'Sepe lêmbëtï sô',
-'create-this-page'  => 'Seka lêmbëtï sô',
-'delete'            => 'Lungûla',
-'deletethispage'    => 'Lungûla lêmbëtï sô',
-'undelete_short'    => 'Kîri na {{PLURAL:$1|sepesû ôko|âsepesû $1}}',
+'vector-action-delete' => 'Lungûla',
+'vector-action-move' => 'Sanzêe ïrï',
+'vector-action-protect' => 'Funga',
+'vector-action-undelete' => 'Kîri na nî',
+'vector-action-unprotect' => 'Sanzêe fungä',
+'vector-view-create' => 'Seka',
+'vector-view-edit' => 'Sepe',
+'vector-view-history' => 'Tanda mbai nî',
+'vector-view-view' => 'Dîko',
+'vector-view-viewsource' => 'Fa ligbî nî',
+'actions' => 'Kua',
+'namespaces' => 'Pöpö tî âïrï',
+'variants' => 'Âmbênî marä nî',
+
+'errorpagetitle' => 'Yûndo',
+'returnto' => 'Kîri na ndö tî lêmbëtï $1.',
+'tagline' => 'Alöndö na  {{SITENAME}}',
+'help' => 'Za mbï',
+'search' => 'Gi',
+'searchbutton' => 'Gi',
+'go' => 'Bâa',
+'searcharticle' => 'Dîko',
+'history' => 'Mbai tî lêmbëtï nî',
+'history_short' => 'mbai',
+'updatedmarker' => 'afinima ngbêreyê sô mbï sï daä sô',
+'printableversion' => 'Mbâlê tî pete na sasango',
+'permalink' => 'Kpengü gbê tî lêmbëtï nî',
+'print' => 'Pete na sasango',
+'view' => 'Tändä',
+'edit' => 'Sepe',
+'create' => 'Seka',
+'editthispage' => 'Sepe lêmbëtï sô',
+'create-this-page' => 'Seka lêmbëtï sô',
+'delete' => 'Lungûla',
+'deletethispage' => 'Lungûla lêmbëtï sô',
+'undelete_short' => 'Kîri na {{PLURAL:$1|sepesû ôko|âsepesû $1}}',
 'viewdeleted_short' => 'Bâa {{PLURAL:$1|sepsesû| âsepesû $1}} sô awoza nî awe sô.',
-'talkpagelinktext'  => 'tene tënë',
-'personaltools'     => 'Âyêkua tî wanî',
-'talk'              => 'Lisoro',
-'views'             => 'Tändä',
-'toolbox'           => 'Gbâyêkua',
-'otherlanguages'    => 'Na mbênî âyângâ',
-'jumpto'            => 'Gue na:',
-'jumptonavigation'  => 'Simba',
-'jumptosearch'      => 'Gi',
+'talkpagelinktext' => 'tene tënë',
+'personaltools' => 'Âyêkua tî wanî',
+'talk' => 'Lisoro',
+'views' => 'Tändä',
+'toolbox' => 'Gbâyêkua',
+'otherlanguages' => 'Na mbênî âyângâ',
+'jumpto' => 'Gue na:',
+'jumptonavigation' => 'Simba',
+'jumptosearch' => 'Gi',
 
 # 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'            => 'Na ndö tî {{SITENAME}}',
-'aboutpage'            => 'Project:Na ndö tî...',
-'currentevents'        => 'Âsango',
-'currentevents-url'    => 'Project:Âsango',
-'disclaimers'          => 'Zïngö-lê',
-'disclaimerpage'       => 'Project:Zïngö-lê',
-'helppage'             => 'Help:Münä',
-'mainpage'             => 'Gä nzönî',
+'aboutsite' => 'Na ndö tî {{SITENAME}}',
+'aboutpage' => 'Project:Na ndö tî...',
+'currentevents' => 'Âsango',
+'currentevents-url' => 'Project:Âsango',
+'disclaimers' => 'Zïngö-lê',
+'disclaimerpage' => 'Project:Zïngö-lê',
+'helppage' => 'Help:Münä',
+'mainpage' => 'Gä nzönî',
 'mainpage-description' => 'Gä nzönî',
-'portal'               => 'Âsëwä',
-'portal-url'           => 'Project:Gä nzönî',
-'privacy'              => 'Ndarä tî bätängö vivîi tënë',
-'privacypage'          => 'Project:Vivîi tënë',
-
-'ok'              => 'Nî laâ!',
-'retrievedfrom'   => 'Awara na yâ tî "$1"',
-'editsection'     => 'Sepe',
-'editold'         => 'sepe',
+'portal' => 'Âsëwä',
+'portal-url' => 'Project:Gä nzönî',
+'privacy' => 'Ndarä tî bätängö vivîi tënë',
+'privacypage' => 'Project:Vivîi tënë',
+
+'ok' => 'Nî laâ!',
+'retrievedfrom' => 'Awara na yâ tî "$1"',
+'editsection' => 'Sepe',
+'editold' => 'sepe',
 'editsectionhint' => 'Sepe surä nî $1',
-'site-atom-feed'  => 'süängö Atom tî $1',
-'red-link-title'  => '$1 (lêmbëtï sô ayeke daä äpe)',
+'site-atom-feed' => 'süängö Atom tî $1',
+'red-link-title' => '$1 (lêmbëtï sô ayeke daä äpe)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'    => 'Lêmbëtï',
-'nstab-user'    => 'Lêmbëtï tî Nyîmbâ',
+'nstab-main' => 'Lêmbëtï',
+'nstab-user' => 'Lêmbëtï tî Nyîmbâ',
 'nstab-special' => 'Lêmbëtï ndê',
 
 # Login and logout pages
-'yourpassword'            => 'Pafungûla',
+'yourpassword' => 'Pafungûla',
 'nav-login-createaccount' => 'Linda wala Zî kônde',
-'userlogin'               => 'Linda wala  Zî kônde',
-'logout'                  => 'Sïgî',
-'userlogout'              => 'Sigî',
+'userlogin' => 'Linda wala  Zî kônde',
+'logout' => 'Sïgî',
+'userlogout' => 'Sigî',
 
 # Edit pages
-'watchthis'       => 'Bâa pekô tî lêmbëtï sô',
+'watchthis' => 'Bâa pekô tî lêmbëtï sô',
 'anoneditwarning' => "'''Ânge:''' Mô de mo linda äpëe. Fade a sû lindosînga IP tî mo na mbai tî lêmbëtï sô.",
-'editing'         => 'Sëpëngö $1',
-'editingsection'  => 'Sëpëngö $1 (surä)',
+'editing' => 'Sëpëngö $1',
+'editingsection' => 'Sëpëngö $1 (surä)',
 
 # Diffs
 'editundo' => 'woza',
 
 # Search results
-'searchresults'       => 'Pendâkua tî gïngö-ndo nî',
+'searchresults' => 'Pendâkua tî gïngö-ndo nî',
 'searchresults-title' => 'Pendâkua tî gïngö-ndo tëtî "$1"',
-'shown-title'         => 'Fa $1 {{PLURAL:$1|pendâkua |âpendâkua}} nî alîngbi na lêmbëtï ôko ôko.',
-'search-result-size'  => '$1 ({{PLURAL:$2|1 mbupa|$2 âmbupa}})',
+'shown-title' => 'Fa $1 {{PLURAL:$1|pendâkua |âpendâkua}} nî alîngbi na lêmbëtï ôko ôko.',
+'search-result-size' => '$1 ({{PLURAL:$2|1 mbupa|$2 âmbupa}})',
 
 # Preferences page
 'mypreferences' => 'tandä tî mbï',
-'prefs-rc'      => 'Tanga ti yé so a gbion ya ni',
-'yournick'      => 'Nyîmbâ:',
+'prefs-rc' => 'Tanga ti yé so a gbion ya ni',
+'yournick' => 'Nyîmbâ:',
 
 # User rights
 'editinguser' => "Mo fa na mbi nyîmbâ '''[[User:$1|$1]]''' $2",
@@ -257,7 +257,7 @@ $messages = array(
 'recentchangeslinked-toolbox' => 'Bängö pekô tî âgbegbêe lêmbëtï',
 
 # Upload
-'upload'          => 'Yâlamû mbênî kuru',
+'upload' => 'Yâlamû mbênî kuru',
 'watchthisupload' => 'bâa lo ânde sô lêmbëtï',
 
 # Random page
@@ -269,8 +269,8 @@ $messages = array(
 'nbytes' => '$1 {{PLURAL:$1|limbe|âlimbe}}',
 
 # Watchlist
-'watchlist'     => 'Molongö tî bängö pekô',
-'watch'         => 'bâa pekô nî',
+'watchlist' => 'Molongö tî bängö pekô',
+'watch' => 'bâa pekô nî',
 'watchthispage' => 'bâa lo ânde sô lêmbëtï',
 
 # Namespace form on various pages
@@ -289,28 +289,28 @@ $messages = array(
 'move-watch' => 'bâa lo ânde sô lêmbëtï',
 
 # Tooltip help for the actions
-'tooltip-pt-login'               => 'Ayeke nzönî mo linda, atâa sô a kambaga mo äpe.',
-'tooltip-pt-logout'              => 'sïgî',
-'tooltip-ca-talk'                => 'Lisoro na ndö tî münä tî lêmbëtï sô',
-'tooltip-ca-edit'                => 'Mo lîngbi tî sepe lêmbëtï sô. Nzönî mo pete kûtu piabâa tîtene mo pia mo bâa nî awe sï mo sûnga nî.',
-'tooltip-ca-history'             => 'Ângbêre mbâlê tî lêmbëtï sô (na ïrï tî âwasüngö-nî)',
-'tooltip-search'                 => 'Gi {{SITENAME}}',
-'tooltip-search-fulltext'        => 'Gi âlêmbëtï sô ayeke na gbâsû sô',
-'tooltip-p-logo'                 => 'Gue na Tölêmbëtï',
-'tooltip-n-mainpage'             => 'Gue na tölêmbëtï Gä nzönî.',
+'tooltip-pt-login' => 'Ayeke nzönî mo linda, atâa sô a kambaga mo äpe.',
+'tooltip-pt-logout' => 'sïgî',
+'tooltip-ca-talk' => 'Lisoro na ndö tî münä tî lêmbëtï sô',
+'tooltip-ca-edit' => 'Mo lîngbi tî sepe lêmbëtï sô. Nzönî mo pete kûtu piabâa tîtene mo pia mo bâa nî awe sï mo sûnga nî.',
+'tooltip-ca-history' => 'Ângbêre mbâlê tî lêmbëtï sô (na ïrï tî âwasüngö-nî)',
+'tooltip-search' => 'Gi {{SITENAME}}',
+'tooltip-search-fulltext' => 'Gi âlêmbëtï sô ayeke na gbâsû sô',
+'tooltip-p-logo' => 'Gue na Tölêmbëtï',
+'tooltip-n-mainpage' => 'Gue na tölêmbëtï Gä nzönî.',
 'tooltip-n-mainpage-description' => 'Gue na tölêmbëtï Gä nzönî.',
-'tooltip-n-portal'               => 'Tënë tî pialö nî',
-'tooltip-n-currentevents'        => 'Wara sango tî âpäsëmä tî fafadësô na gündâ nî.',
-'tooltip-n-recentchanges'        => 'Molongö tî ândângbâ sänzëma tî yâ tî Wïkï nî',
-'tooltip-n-randompage'           => 'Tanda mbênî lêmbëtï waâa',
-'tooltip-n-help'                 => 'Za mbï',
-'tooltip-t-whatlinkshere'        => 'Molongö tî âlêmbëtï sô kûê agbë gbê na lo sô.',
-'tooltip-t-recentchangeslinked'  => 'Molongö tî ândângbâ sänzëmä tî âlêmbëtï sô agbë gbê na lo-sô.',
-'tooltip-t-upload'               => 'To kuru na wavungä',
-'tooltip-t-specialpages'         => 'Molongö tî âlêmbëtï sô kûê ayeke ndê',
-'tooltip-t-print'                => 'Mbâlê tî lêmbëtï sô tî pete na sasango',
-'tooltip-t-permalink'            => 'Kpengü gbê na mbâlê tî lêmbëtï nî sô',
-'tooltip-ca-nstab-main'          => 'Bâa lêmbëtï tî münä nî',
+'tooltip-n-portal' => 'Tënë tî pialö nî',
+'tooltip-n-currentevents' => 'Wara sango tî âpäsëmä tî fafadësô na gündâ nî.',
+'tooltip-n-recentchanges' => 'Molongö tî ândângbâ sänzëma tî yâ tî Wïkï nî',
+'tooltip-n-randompage' => 'Tanda mbênî lêmbëtï waâa',
+'tooltip-n-help' => 'Za mbï',
+'tooltip-t-whatlinkshere' => 'Molongö tî âlêmbëtï sô kûê agbë gbê na lo sô.',
+'tooltip-t-recentchangeslinked' => 'Molongö tî ândângbâ sänzëmä tî âlêmbëtï sô agbë gbê na lo-sô.',
+'tooltip-t-upload' => 'To kuru na wavungä',
+'tooltip-t-specialpages' => 'Molongö tî âlêmbëtï sô kûê ayeke ndê',
+'tooltip-t-print' => 'Mbâlê tî lêmbëtï sô tî pete na sasango',
+'tooltip-t-permalink' => 'Kpengü gbê na mbâlê tî lêmbëtï nî sô',
+'tooltip-ca-nstab-main' => 'Bâa lêmbëtï tî münä nî',
 
 # Attribution
 'others' => 'mbênî',
index d033b2c..bb9a485 100644 (file)
@@ -198,7 +198,6 @@ $messages = array(
 'qbbrowse' => 'Naršītė',
 'qbedit' => 'Taisītė',
 'qbpageoptions' => 'Tas poslapis',
-'qbpageinfo' => 'Konteksts',
 'qbmyoptions' => 'Mona poslapē',
 'qbspecialpages' => 'Specēlė̅jė poslapē',
 'faq' => 'DOK',
@@ -393,11 +392,8 @@ Ožklausėms: $2',
 # Login and logout pages
 'logouttext' => "'''Daba Tamsta esat atsėjongės.'''
 
-Galat ė tuoliau nauduotė {{SITENAME}} anuonimėškā aba [[Special:UserLogin|prisėjonkat]] ėš naujė šėtuo patiu a kėto nauduotuojė vardu.
+Galat ė tuoliau nauduotė {{SITENAME}} anuonimėškā aba <span class='plainlinks'>[$1 prisėjonkat]</span> ėš naujė šėtuo patiu a kėto nauduotuojė vardu.
 Pastebiejims: katruos nekatruos poslapiuos ė tuoliau gal ruodītė būktā būtomiet prisėjongės lėgė tuol, kumet ėšvalīsėt sava naršīklės dietovė (''cache'').",
-'welcomecreation' => '== Svēkė, $1! ==
-
-Tamstas paskīra bova sokorta. Neožmėrškėt pakeistė sava [[Special:Preferences|{{SITENAME}} nustatīmu]].',
 'yourname' => 'Nauduotuojė vards:',
 'yourpassword' => 'Slaptažuodis:',
 'yourpasswordagain' => 'Pakartuoket slaptažuodė:',
@@ -751,8 +747,6 @@ Kėtė admėnėstratuorē šėtom pruojekte vėsdar galės pasėiktė pasliepta
 'search-interwiki-caption' => 'Dokterėnē pruojektā',
 'search-interwiki-default' => '$1 rezoltatā:',
 'search-interwiki-more' => '(daugiau)',
-'search-mwsuggest-enabled' => 'so pasiūlīmās',
-'search-mwsuggest-disabled' => 'nie pasiūlīmu',
 'search-relatedarticle' => 'Sosėjėn',
 'mwsuggest-disable' => 'Kavuotė AJAX pasiūlīmus',
 'searchrelated' => 'sosėjėn',
@@ -1293,9 +1287,6 @@ Jēgo bikumet ožsėnuorietomiet liautėis keravuotė straipsnė, spauskat \"neb
 'unwatching' => 'Šalėnama ėš keravuojamu sāraša...',
 
 'enotif_reset' => 'Pažīmietė vėsus poslapius kāp aplonkītus',
-'enotif_newpagetext' => 'Tas īr naus poslapis.',
-'changed' => 'pakeitė',
-'created' => 'sokūrė',
 'enotif_anon_editor' => 'anuonėminis nauduotuos $1',
 
 # Delete
index a11933a..da72293 100644 (file)
@@ -121,7 +121,6 @@ $magicWords = array(
        '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' ),
@@ -256,7 +255,7 @@ $messages = array(
 
 'underline-always' => 'Uvijek',
 'underline-never' => 'Nikad',
-'underline-default' => 'Po postavkama preglednika',
+'underline-default' => 'prema skinu ili postavkama preglednika',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Stil slova područja uređivanja:',
@@ -341,8 +340,8 @@ $messages = array(
 'newwindow' => '(otvara se u novom prozoru)',
 'cancel' => 'Poništi',
 'moredotdotdot' => 'Još...',
-'mypage' => 'Moja stranica',
-'mytalk' => 'Moj razgovor',
+'mypage' => 'Stranica',
+'mytalk' => 'Razgovor',
 'anontalk' => 'Razgovor za ovu IP adresu',
 'navigation' => 'Navigacija',
 'and' => '&#32;i',
@@ -352,7 +351,6 @@ $messages = array(
 'qbbrowse' => 'Prelistajte',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Opcije stranice',
-'qbpageinfo' => 'Informacije o stranici',
 'qbmyoptions' => 'Moje opcije',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'ČPP',
@@ -365,7 +363,7 @@ $messages = array(
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati obrisano',
 'vector-action-unprotect' => 'Promijeni zaštitu',
-'vector-simplesearch-preference' => 'Omogući napredne sugestije pretrage (samo vector skin)',
+'vector-simplesearch-preference' => 'Omogući traku za pojednostavljenu pretragu (samo Vector skin)',
 'vector-view-create' => 'Napravi',
 'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Pregled historije',
@@ -375,6 +373,7 @@ $messages = array(
 'namespaces' => 'Imenski prostori',
 'variants' => 'Varijante',
 
+'navigation-heading' => 'Navigacijski meni',
 'errorpagetitle' => 'Greška',
 'returnto' => 'Povratak na $1.',
 'tagline' => 'Izvor: {{SITENAME}}',
@@ -584,7 +583,7 @@ Pretraga: $2',
 'viewsource-title' => 'Prikaz izvora stranice $1',
 'actionthrottled' => 'Akcija je usporena',
 'actionthrottledtext' => 'Kao anti-spam mjera, ograničene su vam izmjene u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte ponovo poslije nekoliko minuta.',
-'protectedpagetext' => 'Ova stranica je zaključana da bi se spriječilo uređivanje.',
+'protectedpagetext' => 'Ova stranica je zaključana kako bi se spriječilo uređivanje ili druge akcije.',
 'viewsourcetext' => 'Možete vidjeti i kopirati izvorni tekst ove stranice:',
 'viewyourtext' => "Možete da pogledate i kopirate izvor '''vaših izmjena''' na ovoj stranici:",
 'protectedinterface' => 'Ova stranica sadrži tekst interfejsa za softver na ovoj wiki, pa je zaključana kako bi se spriječile zloupotrebe. Kako bi dodali ili promijenili prijevode za sve wikije, molimo koristite [//translatewiki.net/ translatewiki.net], projekt lokalizacije MediaWikija.',
@@ -616,10 +615,10 @@ Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.'
 # Login and logout pages
 'logouttext' => "'''Sad ste odjavljeni.'''
 
-Možete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo [[Special:UserLogin|prijaviti]] kao isti ili kao drugi korisnik.
+Možete nastaviti da koristite {{SITENAME}} anonimno, ili se ponovo <span class='plainlinks'>[$1 prijaviti]</span> kao isti ili kao drugi korisnik.
 Obratite pažnju da neke stranice mogu nastaviti da se prikazuju kao da ste još uvijek prijavljeni, dok ne očistite keš svog preglednika.",
-'welcomecreation' => '== Dobro došli, $1! ==
-Vaš korisnički račun je napravljen.
+'welcomeuser' => 'Dobro došli, $1!',
+'welcomecreation-msg' => 'Vaš korisnički račun je napravljen.
 Ne zaboravite izmijeniti vlastite [[Special:Preferences|{{SITENAME}} postavke]].',
 'yourname' => 'Korisničko ime:',
 'yourpassword' => 'Lozinka/zaporka:',
@@ -882,7 +881,7 @@ Možete [[Special:Search/{{PAGENAME}}|tražiti naslov ove stranice]] u drugim st
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretraživati srodne registre],
 ili [{{fullurl:{{FULLPAGENAME}}|action=edit}} urediti ovu stranicu]</span>.',
 'noarticletext-nopermission' => 'Trenutno nema teksta na ovoj stranici.
-Možete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane registre]</span>.',
+Možete [[Special:Search/{{PAGENAME}}|tražiti ovaj naslov stranice]] na drugim stranicama ili <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pretražiti povezane registre]</span>. alio nemate dozvolu za stvaranje ove stranice.',
 'missing-revision' => 'Ne mogu da pronađem izmenu br. $1 na stranici pod nazivom „{{PAGENAME}}“.
 
 Ovo se obično dešava kada pratite zastarjelu vezu do stranice koja je obrisana.
@@ -913,7 +912,7 @@ Ne zaboravite da imena stranica s .css i .js kodom počinju malim slovom, npr. {
 'note' => "'''Napomena:'''",
 'previewnote' => "'''Ne zaboravite da je ovo samo pregled'''
 Izmjene stranice nisu još sačuvane!",
-'continue-editing' => 'Nastavak uređivanja',
+'continue-editing' => 'Idi na područje uređivanja',
 'previewconflict' => 'Ovaj pretpregled reflektuje tekst u gornjem polju
 kako će izgledati ako pritisnete "Snimi stranicu".',
 'session_fail_preview' => "'''Izvinjavamo se! Nismo mogli obraditi vašu izmjenu zbog gubitka podataka o prijavi. Molimo pokušajte ponovno. Ako i dalje ne bude radilo, pokušajte se [[Special:UserLogout|odjaviti]] i ponovno prijaviti.'''",
@@ -994,6 +993,15 @@ Izgleda da je obrisana.',
 'edit-already-exists' => 'Stranica nije mogla biti kreirana.
 Izgleda da već postoji.',
 'defaultmessagetext' => 'Uobičajeni tekst poruke',
+'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
+'invalid-content-data' => 'Neispravni podaci sadržaja',
+'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-text' => 'obični tekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozorenje: Ova stranica sadrži previše poziva opterećujućih parserskih funkcija.
@@ -1252,8 +1260,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-caption' => 'Srodni projekti',
 'search-interwiki-default' => '$1 rezultati:',
 'search-interwiki-more' => '(više)',
-'search-mwsuggest-enabled' => 'sa sugestijama',
-'search-mwsuggest-disabled' => 'bez sugestija',
 'search-relatedarticle' => 'Povezano',
 'mwsuggest-disable' => 'Onemogući AJAX prijedloge',
 'searcheverything-enable' => 'Pretraga u svim imenskim prostorima',
@@ -1289,7 +1295,7 @@ Uzmite u obzir da njegovi indeksi za ovu Wiki ne moraju biti ažurirani.',
 
 # Preferences page
 'preferences' => 'Postavke',
-'mypreferences' => 'Moje postavke',
+'mypreferences' => 'Postavke',
 'prefs-edits' => 'Broj izmjena:',
 'prefsnologin' => 'Niste prijavljeni',
 'prefsnologintext' => 'Da biste mogli podešavati korisničke postavke, morate <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} biti prijavljeni]</span>.',
@@ -1352,7 +1358,7 @@ Ovdje su navedene neke nasumično odabrane vrijednosti koje možete koristiti: $
 'timezoneregion-indian' => 'Indijski okean',
 'timezoneregion-pacific' => 'Tihi okean',
 'allowemail' => 'Dozvoli e-mail od ostalih korisnika',
-'prefs-searchoptions' => 'Opcije pretrage',
+'prefs-searchoptions' => 'Pretraga',
 'prefs-namespaces' => 'Imenski prostori',
 'defaultns' => 'Inače tražite u ovim imenskim prostorima:',
 'default' => 'standardno',
@@ -1523,6 +1529,9 @@ Ako izaberete da date ime, biće korišteno za pripisivanje Vašeg rada.',
 'rightslogtext' => 'Ovo je evidencija izmjene korisničkih prava.',
 'rightslogentry' => 'promjena članstva u grupi za $1 sa $2 na $3',
 'rightslogentry-autopromote' => 'je automatski unaprijeđen iz $2 u $3',
+'logentry-rights-rights' => '$1 {{GENDER:$1|je promijenio|je promijenila|je promijenio}} članstvo grupe za $3 iz $4 u $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|je promenio|je promenila|je promenio}} članstvo grupe za $3',
+'logentry-rights-autopromote' => '$1 je automatski {{GENDER:$1|unaprijeđen|unaprijeđena|unaprijeđen}} iz $4 u $5',
 'rightsnone' => '(nema)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1756,6 +1765,7 @@ Ako se problem ne riješi, kontaktirajte [[Special:ListUsers/sysop|administrator
 'backend-fail-notsame' => 'Već postoji neistovetna datoteka – $1.',
 'backend-fail-invalidpath' => '$1 nije ispravna putanja za skladištenje.',
 'backend-fail-delete' => 'Ne može se izbrisati datoteka "$1".',
+'backend-fail-describe' => 'Ne mogu promijeniti metapodatke za datoteku "$1".',
 'backend-fail-alreadyexists' => 'Datoteka $1 već postoji.',
 'backend-fail-store' => 'Ne mogu da smestim datoteku $1 u $2.',
 'backend-fail-copy' => 'Ne može se kopirati "$1" na "$2".',
@@ -1907,7 +1917,7 @@ Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'uploadnewversion-linktext' => 'Postavite novu verziju ove datoteke/fajla',
 'shared-repo-from' => 'iz $1',
 'shared-repo' => 'zajednička ostava',
-'upload-disallowed-here' => 'Nažalost, ne možete da zamenite ovu sliku.',
+'upload-disallowed-here' => 'Ne možete da zamenite ovu datoteku.',
 
 # File reversion
 'filerevert' => 'Vrati $1',
@@ -2145,9 +2155,9 @@ Vidi također [[Special:WantedCategories|zatražene kategorije]].',
 'linksearch-pat' => 'Šema pretrage:',
 'linksearch-ns' => 'Imenski prostor:',
 '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: <code>$1</code> (ne stavljajte u pretragu)',
+'linksearch-text' => 'Mogu se koristiti džokeri poput "*.wikipedia.org".<br />
+Potreban je najviši domen, na primjer "*.org".<br />
+Podržani protokoli: <tt>$1</tt> (zadaje http:// ako ne navedete protokol).',
 'linksearch-line' => '$1 je povezan od $2',
 'linksearch-error' => 'Džokeri se mogu pojavljivati samo na početku naziva servera.',
 
@@ -2196,8 +2206,8 @@ O svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne info
 'emailuser-title-target' => 'Slanje e-maila {{GENDER:$1|korisniku|korisnici|korisniku}}',
 'emailuser-title-notarget' => 'Slanje e-maila korisniku',
 'emailpage' => 'Pošalji e-mail ovom korisniku',
-'emailpagetext' => 'Možete korisiti formu ispod za slanje e-mail poruka ovom korisniku.
-E-mail adresa koju ste unijeli u [[Special:Preferences|Vašim korisničkim postavkama]] će biti prikazana kao adresa pošiljaoca, tako da će primaoc poruke moći da Vam odgovori.',
+'emailpagetext' => 'Možete da koristite donji obrazac da pošaljete e-mail {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.
+E-mail koju ste uneli u vašim [[Special:Preferences|postavkama]] će se prikazati u polju "Od:", tako da će primalac moći da vam odgovori direktno.',
 'usermailererror' => 'Objekat maila je vratio grešku:',
 'defemailsubject' => '{{SITENAME}} e-mail od korisnika "$1"',
 'usermaildisabled' => 'Korisnički e-mail onemogućen',
@@ -2228,7 +2238,7 @@ E-mail adresa koju ste unijeli u [[Special:Preferences|Vašim korisničkim posta
 
 # Watchlist
 'watchlist' => 'Moj spisak praćenja',
-'mywatchlist' => 'Moj spisak praćenja',
+'mywatchlist' => 'Spisak praćenja',
 'watchlistfor2' => 'Za $1 $2',
 'nowatchlist' => 'Nemate ništa na svom spisku praćenih članaka.',
 'watchlistanontext' => 'Molimo da $1 da možete vidjeti ili urediti stavke na Vašem spisku praćenja.',
@@ -2264,20 +2274,23 @@ Buduće promjene ove stranice i njoj pridružene stranice za razgovor će biti n
 
 'enotif_mailer' => '{{SITENAME}} obavještenje o pošti',
 'enotif_reset' => 'Označi sve strane kao posjećene',
-'enotif_newpagetext' => 'Ovo je nova stranica.',
 'enotif_impersonal_salutation' => '{{SITENAME}} korisnik',
-'changed' => 'promijenjena',
-'created' => 'napravljena',
-'enotif_subject' => '{{SITENAME}} strana $PAGETITLE je bila $CHANGEDORCREATED od strane $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} stranicu $1 {{gender:|je izbrisao|je izbrisala|je izbrisao}} $2',
+'enotif_subject_created' => '{{SITENAME}} stranicu $1 {{gender:|je napravio|je napravila|je napravio}} $2',
+'enotif_subject_moved' => '{{SITENAME}} stranicu $1 {{gender:|je premijestio|je premjestila|je premjestio}} $2',
+'enotif_subject_restored' => '{{SITENAME}} stranicu $1 {{gender:|je obnovio|je obnovila|je obnovio}} $2',
+'enotif_subject_changed' => '{{SITENAME}} stranicu $1 {{gender:|je promijenio|je promijenila|je promijenio}} $2',
+'enotif_body_intro_deleted' => '{{SITENAME}} stranica $1 je izbrisana na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_created' => '{{SITENAME}} stranica $1 je stvorena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_moved' => '{{SITENAME}} stranica $1 je premještena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_restored' => '{{SITENAME}} stranica $1 je obnovljena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
+'enotif_body_intro_changed' => '{{SITENAME}} stranica $1 je izmijenjena na $PAGEEDITDATE od {{GENDER:|korisnika|korisnice|korisnika}} $2, v. $3 za trenutnu verziju.',
 'enotif_lastvisited' => 'Pogledajte $1 za sve izmjene od vaše posljednje posjete.',
 'enotif_lastdiff' => 'Vidi $1 da pregledate ovu promjenu.',
 'enotif_anon_editor' => 'anonimni korisnik $1',
 'enotif_body' => 'Poštovani $WATCHINGUSERNAME,
 
-
-Stranica {{SITENAME}} sa naslovom $PAGETITLE je bila $CHANGEDORCREATED dana $PAGEEDITDATE od strane $PAGEEDITOR, pogledajte $PAGETITLE_URL za trenutnu reviziju.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Sažetak urednika: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2457,8 +2470,8 @@ Možda ste unijeli pogrešan link, ili je revizija vraćena ili uklonjena iz arh
 'undeletedrevisions' => '{{PLURAL:$1|$1 revizija vraćena|$1 revizije vraćene|$1 revizija vraćeno}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 revizija|$1 revizije|$1 revizija}} i {{PLURAL:$2|1 datoteka|$2 datoteke|$2 datoteka}} vraćeno',
 'undeletedfiles' => '{{PLURAL:$1|1 datoteka vraćena|$1 datoteke vraćene|$1 datoteka vraćeno}}',
-'cannotundelete' => 'Vraćanje nije uspjelo;
-neko drugi je već vratio ovu stranicu.',
+'cannotundelete' => 'Vraćanje nije uspelo:
+$1',
 'undeletedpage' => "'''$1 je vraćena'''
 
 Provjerite [[Special:Log/delete|evidenciju brisanja]] za zapise najskorijih brisanja i vraćanja.",
@@ -2490,9 +2503,9 @@ $1',
 'blanknamespace' => '(Glavno)',
 
 # Contributions
-'contributions' => 'Doprinosi korisnika',
+'contributions' => 'Doprinosi {{GENDER:|korisnika|korisnice|korisnika}} $1',
 'contributions-title' => 'Korisnički doprinosi od $1',
-'mycontris' => 'Moji doprinosi',
+'mycontris' => 'Doprinosi',
 'contribsub2' => 'Za $1 ($2)',
 'nocontribs' => 'Nisu nađene promjene koje zadovoljavaju ove uslove.',
 'uctop' => '(vrh)',
@@ -2533,7 +2546,7 @@ Posljednje stavke zapisnika blokiranja možete pogledati ispod:',
 'whatlinkshere-hideredirs' => '$1 preusmjerenja',
 'whatlinkshere-hidetrans' => '$1 uključenja',
 'whatlinkshere-hidelinks' => '$1 linkove',
-'whatlinkshere-hideimages' => '$1 linkove slika',
+'whatlinkshere-hideimages' => '$1 veze do datoteke',
 'whatlinkshere-filters' => 'Filteri',
 
 # Block/unblock
@@ -2768,6 +2781,7 @@ Da li je želite obrisati kako bi ste mogli izvršiti premještanje?',
 'immobile-target-namespace-iw' => 'Međuwiki link nije valjano odredište premještanja stranice.',
 'immobile-source-page' => 'Ova stranica se ne može premještati.',
 'immobile-target-page' => 'Ne može se preusmjeriti na taj odredišni naslov.',
+'bad-target-model' => 'Željeno odredište koristi drugačiji model sadržaja. Ne mogu da pretvorim iz $1 u $2.',
 'imagenocrossnamespace' => 'Ne može se premjestiti datoteka u nedatotečni imenski prostor',
 'nonfile-cannot-move-to-file' => 'Ne mogu se premjestiti podaci u datotečni imenski prostor',
 'imagetypemismatch' => 'Ekstenzija nove datoteke ne odgovara njenom tipu',
@@ -2898,7 +2912,6 @@ Molimo pokušajte ponovno.',
 
 # JavaScriptTest
 'javascripttest' => 'Javaskript test',
-'javascripttest-disabled' => 'Ova funkcija je onemogućena na ovom wikiju.',
 'javascripttest-title' => 'Izvršavanje testova za $1',
 'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
 'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
@@ -3006,6 +3019,7 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 
 # Info page
 'pageinfo-title' => 'Informacije za "$1"',
+'pageinfo-not-current' => 'Na žalost, nemoguće je pribaviti ove podatke za starije izmjene.',
 'pageinfo-header-basic' => 'Osnovne informacije',
 'pageinfo-header-edits' => 'Historija izmjena',
 'pageinfo-header-restrictions' => 'Zaštita stranice',
@@ -3014,6 +3028,7 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-default-sort' => 'Podrazumijevani ključ sortiranja',
 'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
+'pageinfo-language' => 'Jezik sadržaja stranice',
 'pageinfo-robot-policy' => 'Status tražilice',
 'pageinfo-robot-index' => 'Stranicu je moguće indeksirati',
 'pageinfo-robot-noindex' => 'Ne može se indeksirati',
@@ -3030,10 +3045,17 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 'pageinfo-authors' => 'Ukupni broj specifičnih autora',
 'pageinfo-recent-edits' => 'Broj nedavnih izmjena (u posljednjih $1)',
 'pageinfo-recent-authors' => 'Broj nedavnih specifičnih autora',
-'pageinfo-restriction' => 'Zaštita stranice ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magična riječ|Magične riječi}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
+'pageinfo-toolboxlink' => 'Informacije o stranici',
+'pageinfo-redirectsto' => 'Preusmjerava na',
+'pageinfo-redirectsto-info' => 'Informacije',
+'pageinfo-contentpage' => 'Računa se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Prenosiva zaštita stranica važi odavde',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označi kao patrolirano',
@@ -3045,6 +3067,8 @@ Ovo je vjerovatno izazvano vezom ka vanjskoj nepoželjnoj stranici.',
 'markedaspatrollederror' => 'Ne može se označiti kao patrolirano',
 'markedaspatrollederrortext' => 'Morate naglasiti reviziju koju treba označiti kao patroliranu.',
 'markedaspatrollederror-noautopatrol' => 'Nije Vam dopušteno da vlastite izmjene označavate patroliranim.',
+'markedaspatrollednotify' => 'Ova izmjena stranice $1 označena je kao patrolirana.',
+'markedaspatrollederrornotify' => 'Nije uspjelo označavanje ove stranice kao patrolirane.',
 
 # Patrol log
 'patrol-log-page' => 'Evidencija patroliranja',
@@ -3108,6 +3132,7 @@ Njegovim izvršavanjem možete da ugrozite Vaš sistem.",
 'hours' => '{{PLURAL:$1|$1 sat|$1 sata|$1 sati}}',
 'days' => '{{PLURAL:$1|$1 dan|$1 dana|$1 dana}}',
 'ago' => 'prije $1',
+'just-now' => 'upravo sada',
 
 # Bad image list
 'bad_image_list' => "Koristi se sljedeći format:
@@ -3609,6 +3634,7 @@ Ovaj kod za potvrdu će isteći u $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Međuwiki umetanje je isključeno]',
 'scarytranscludefailed' => '[Neuspješno preusmjerenje šablona na $1]',
+'scarytranscludefailed-httpstatus' => '[Ne mogu da preuzmem šablon $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL je predugačak]',
 
 # Delete conflict
@@ -3719,6 +3745,7 @@ Također možete [[Special:EditWatchlist|koristiti standardni uređivač]].',
 'version-license' => 'Licenca',
 'version-poweredby-credits' => "Ova wiki je zasnovana na '''[//www.mediawiki.org/ MediaWiki]''', autorska prava zadržana © 2001-$1 $2.",
 'version-poweredby-others' => 'ostali',
+'version-credits-summary' => 'Htjeli bismo da zahvalimo sljedećim osobama na njihovom doprinosu [[Special:Version|MediaWiki]].',
 'version-license-info' => 'Mediawiki je slobodni softver, možete ga redistribuirati i/ili mijenjati pod uslovima GNU opće javne licence kao što je objavljeno od strane Fondacije Slobodnog Softvera, bilo u verziji 2 licence, ili (po vašoj volji) nekoj od kasniji verzija.
 
 Mediawiki se distriburia u nadi da će biti korisna, ali BEZ IKAKVIH GARANCIJA, čak i bez ikakvih posrednih garancija o KOMERCIJALNOSTI ili DOSTUPNOSTI ZA ODREĐENU SVRHU. Pogledajte GNU opću javnu licencu za više detalja.
@@ -3858,9 +3885,9 @@ Slike su prikazane u punoj veličini, ostale vrste datoteka su prikazane direktn
 'logentry-move-move_redir-noredirect' => '$1 premjesti stranicu $3 na $4 preko preusmjerenja bez ostavljanja preusmjerenja',
 'logentry-patrol-patrol' => '$1 označi izmjenu $4 pregledane stranice $3',
 'logentry-patrol-patrol-auto' => '$1 samostalno označi izmjenu $4 pregledane stranice $3',
-'logentry-newusers-newusers' => '$1 otvori korisnički račun',
-'logentry-newusers-create' => '$1 otvori korisnički račun',
-'logentry-newusers-create2' => '$1 otvori korisnički račun $3',
+'logentry-newusers-newusers' => 'Korisnički račun $1 je napravljen',
+'logentry-newusers-create' => 'Korisnički račun $1 je napravljen',
+'logentry-newusers-create2' => 'Korisnički račun $3 {{GENDER:|je napravio|je napravila|je napravio}} $1',
 'logentry-newusers-autocreate' => 'Račun $1 je samostalno otvoren',
 'newuserlog-byemail' => 'lozinka je poslana putem e-maila',
 
@@ -3880,6 +3907,10 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'feedback-bugcheck' => 'Izvrsno! Molimo provjerite da se ne radi o nekom [$1 poznatom "bugu"].',
 'feedback-bugnew' => 'Provereno. Prijavi novu grešku',
 
+# Search suggestions
+'searchsuggest-search' => 'Traži',
+'searchsuggest-containing' => 'sadrži...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nemate ovlasti da postavljate datoteke na ovoj wiki.',
 'api-error-badtoken' => 'Unutrašnja greška: token nije ispravan.',
@@ -3932,4 +3963,6 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'duration-centuries' => '$1 {{PLURAL:$1|vijek|vijekova}}',
 'duration-millennia' => '$1 {{PLURAL:$1|milenijum|milenijuma}}',
 
+# Unknown messages
+'svg-long-error' => 'Nevaljana SVG datoteka: $1',
 );
index cc05670..bc0e71e 100644 (file)
@@ -157,7 +157,6 @@ $messages = array(
 'qbbrowse' => 'Cabba',
 'qbedit' => 'Sbadl',
 'qbpageoptions' => 'Tasnat ad',
-'qbpageinfo' => 'Context',
 'qbmyoptions' => 'Tisnatin inu',
 'qbspecialpages' => 'Tisnatin timzlay',
 'faq' => 'Isqsitn li bdda tsutulnin',
@@ -269,6 +268,8 @@ $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',
@@ -365,9 +366,6 @@ Akks ad iskrt kra yaḍn',
 'virus-unknownscanner' => 'antivirus oritwsan',
 
 # Login and logout pages
-'welcomecreation' => '== Brrkat,  $1! ==
-lcont nek  tuyskar .
- Adur tut atbaddlt [[Special:Preferences|{{SITENAME}} issusmen]]',
 'yourname' => 'smiyt o-msxdam:',
 'yourpassword' => 'awal iḥdan:',
 'yourpasswordagain' => 'Зawd ara awal iḥdan:',
@@ -636,8 +634,6 @@ Tigira n ujbbad ns, ar takka yat tayafut bahra imqqurn,  ɣayan afan ur ttili.',
 'search-interwiki-caption' => 'Tiwuriwin taytmatin',
 'search-interwiki-default' => '$1 imyakkatn',
 'search-interwiki-more' => '(Uggar)',
-'search-mwsuggest-enabled' => 'D mara ittuyskar',
-'search-mwsuggest-disabled' => 'Ur illa marayttuskar',
 'search-relatedarticle' => 'Tzdi',
 'mwsuggest-disable' => 'Asbid AJAX n maryttuynnan ayttuyskar',
 'searcheverything-enable' => 'Cabba ɣ graygat agmmaḍ',
index ae34184..f07257d 100644 (file)
@@ -241,7 +241,7 @@ $messages = array(
 
 'underline-always' => 'සැමවිටම කරන්න',
 'underline-never' => 'කිසිවිටෙක නොකරන්න',
-'underline-default' => 'බà·\8aâ\80\8dරà·\80à·\94à·\83රයà·\99à·\84à·\92 à¶´à·\99රනà·\92මà·\92ය à¶\85නà·\94à·\80ය',
+'underline-default' => 'à·\83ම à·\84à·\9d à¶\9cà·\80à·\9aà·\82à¶\9aයà·\99à·\84à·\92 à¶´à·\99රනà·\92මà·\92ය',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'අකුරු විලාසයන් සංස්කරණ පෙදෙස:',
@@ -328,8 +328,8 @@ $messages = array(
 'newwindow' => '(නව කවුළුවක විවෘතවේ)',
 'cancel' => 'අත් හරින්න',
 'moredotdotdot' => 'තවත්...',
-'mypage' => 'මà¶\9cà·\9a à¶´à·\92ටà·\94à·\80',
-'mytalk' => 'මà¶\9cà·\9a à·\83à·\8fà¶\9aචà·\8aඡà·\8f',
+'mypage' => 'පිටුව',
+'mytalk' => 'à·\83à·\8fà¶\9aචà·\8aඡà·\8fà·\80',
 'anontalk' => 'මෙම අයිපී ලිපිනය සඳහා සාකච්ඡාව',
 'navigation' => 'යාත්‍රණය',
 'and' => '&#32;සහ',
@@ -339,7 +339,6 @@ $messages = array(
 'qbbrowse' => 'පිරික්සන්න',
 'qbedit' => 'සංස්කරණය',
 'qbpageoptions' => 'මෙම පිටුව',
-'qbpageinfo' => 'සන්දර්භය',
 'qbmyoptions' => 'මගේ පිටු',
 'qbspecialpages' => 'විශේෂ පිටු',
 'faq' => 'නිවිප්‍ර',
@@ -352,7 +351,7 @@ $messages = array(
 'vector-action-protect' => 'ආරක්‍ෂණය',
 'vector-action-undelete' => 'මකාදැමීම අවලංගු කරන්න',
 'vector-action-unprotect' => 'ආරක්ෂණ තත්වය වෙනස් කරන්න',
-'vector-simplesearch-preference' => 'à·\80à·\90ඩà·\92දà·\92යà·\94ණà·\94à¶\9aà·\85 à·\83à·\99à·\80à·\94මà·\8a à¶ºà·\9dජනà·\8f à·\83à¶\9aà·\8aâ\80\8dරà·\93ය à¶\9aරනà·\8aන (වෙක්ටර් තීමය සඳහා පමණි)',
+'vector-simplesearch-preference' => 'à·\83à·\94à·\85à·\94 à¶\9aà·\85 à·\83à·\99à·\80à·\94මà·\8a à¶¶à·\8fරය (වෙක්ටර් තීමය සඳහා පමණි)',
 'vector-view-create' => 'තනන්න',
 'vector-view-edit' => 'සංස්කරණය',
 'vector-view-history' => 'ඉතිහාසය නරඹන්න',
@@ -602,12 +601,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ඔබ දැන් ගිණුමෙන් නික්මී ඇත.'''
 
-ඔබට නිර්නාමිකව {{SITENAME}} කටයුතු කරගෙන යාහැක, නැතහොත් පෙර පරිශීලක ලෙස හෝ වෙනත් පරිශීලකයෙකු ලෙස [[Special:UserLogin|නැවත ගිණුමක‍ට පිවිසිය හැක]].
+ඔබට නිර්නාමිකව {{SITENAME}} කටයුතු කරගෙන යාහැක, නැතහොත් පෙර පරිශීලක ලෙස හෝ වෙනත් පරිශීලකයෙකු ලෙස <span class='plainlinks'>[$1 නැවත ගිණුමක‍ට පිවිසිය හැක]</span>.
 ඔබගේ බ්‍රවුසරයෙහි පූර්වාපේක්‍ෂී සංචිතය (කෑෂය) පිරිසිදුකරන තෙක්, සමහරක් පිටු විසින් ඔබ තවදුරටත් පිවිසී ඇති බවක් දිගටම පෙන්නුම් කිරීමට ඉඩ ඇත.",
-'welcomecreation' => '== ආයුබෝවන්, $1! ==
-
-ඔබ‍ගේ ගිණුම තනන ලදී.
-ඔබ‍ගේ [[Special:Preferences|{{SITENAME}} අභිරුචි ]] වෙනස් කිරීම අමතක නොකරන්න.',
 'yourname' => 'පරිශීලක නාමය:',
 'yourpassword' => 'මුරපදය:',
 'yourpasswordagain' => 'මුරපදය යළි ඇතුළු කරන්න:',
@@ -866,7 +861,6 @@ $2
 * '''ෆයර්ෆොක්ස්/ සෆාරි:''' ''Reload'' ඔබන අතරතුර ''Shift'' ඔබන්න, නැතහොත්  ''Ctrl-F5'' හෝ''Ctrl-R'' (මැක්හීදී ''Command-R'' ) ඔබන්න
 * '''ගූගල් ක්‍රෝම්:''' ''Ctrl-Shift-R'' ඔබන්න(මැක්හී ''Command-Shift-R'' )
 * '''ඉන්ටර්නෙට් එක්ස්ප්ලෝර:''' ''Refresh'' ඔබන අතරතුර  ''Ctrl''  ඔබන්න, නැතහොත් ''Ctrl-F5'' ඔබන්න
-* '''කොන්කරර්:''' ''Reload'' ඔබන්න හෝ  ''F5'' ඔබන්න
 * '''ඔපෙරා:''' ''Tools → Preferences'' හි කෑෂය හිස් කරන්න",
 'usercssyoucanpreview' => "'''හෝඩුවාව:'''සුරැකුමට පෙර, ඔබගේ නව  CSS පරික්ෂා කරනු වස්, \"{{int:පෙර-දසුන පෙන්වන්න}}\" බොත්තම භාවිතා කරන්න.",
 'userjsyoucanpreview' => "'''හෝඩුවාව:'''සුරැකුමට පෙර, ඔබගේ නව  ජාවා ස්ක්‍රිප්ට් පරික්ෂා කරනු වස්, \"{{int:පෙර-දසුන පෙන්වන්න}}\" බොත්තම භාවිතා කරන්න.",
@@ -884,7 +878,7 @@ $2
 'note' => "'''සටහන:'''",
 'previewnote' => "'''මෙය පෙරදසුනක් පමණක් බව සිහිතබාගන්න.'''
 ඔබගේ වෙනස්කිරීම් තවමත් සුරැකීමට ලක් කොට නොමැත!",
-'continue-editing' => 'සංස්කරණය කරගෙනයන්න',
+'continue-editing' => 'සංස්කරණ කලාපය වෙත යන්න',
 'previewconflict' => 'ඔබ විසින් සුරැකීම තෝරාගත්තොත්,  ඉහළ පෙළ සංස්කරණ සරියෙහි,  පෙළ දර්ශනය විය හැකි අයුර මෙම පෙර-දසුනෙන් ආවර්ජනය වේ.',
 'session_fail_preview' => "'''කණගාටුයි! සැසි දත්ත හානියක් හේතුවෙන් අප විසින් ඔබගේ  සංස්කරණය ක්‍රියායයනය කිරීමට නොහැකි වී ඇත.
 කරුණාකර නැවත උත්සාහ කරන්න.
@@ -1115,7 +1109,8 @@ $1",
 'revdelete-only-restricted' => '$2 දිනැති අයිතමය සැඟවීමේ දෝෂය , $1:අනෙකුත් සැඟවීම් විකල්පයන් අතුරින් එකක් තෝරාගන්නේ නැතිව, පරිපාලකයන්ගේ දර්ශනයෙන් අයිතමයන් සැඟවීම  ඔබහට සිදුකල නොහැක.',
 'revdelete-reason-dropdown' => '*මකා දැමීමේ පොදු හේතු
 **කතු හිමිකම් උල්ලංඝනය
-**නුසුදුසු පුද්ගලික කොරතුරු
+**නුසුදුසු පරිකථන හෝ පුද්ගලික කොරතුරු
+**නුසුදුසු පරිශීලක නම
 **අපහාසාත්මක විය හැකි තොරතුරු',
 'revdelete-otherreason' => 'වෙනත්/අමතර හේතු:',
 'revdelete-reasonotherlist' => 'වෙනත් හේතු',
@@ -1125,7 +1120,7 @@ $1",
 # Suppression log
 'suppressionlog' => 'යටපත්කිරීම් පිළිබඳ සටහන',
 'suppressionlogtext' => 'පරිපාලකයන්ගෙන් සැඟවුනු අන්තර්ගතය සම්බන්ධ මකාදැමීම් හා වාරණ ලැයිස්තුවක් මෙහි පහත දැක්වේ.
-දà·\90නට à¶\9aà·\8aâ\80\8dරà·\92යà·\8fතà·\8aමà¶\9a à·\80න à¶­à·\84නමà·\8a à·\84à·\8f à·\80à·\8fරණයනà·\8a à¶½à·\90යà·\92à·\83à·\8aතà·\94à·\80à¶\9aà·\8a à·\83ඳà·\84à·\8f [[Special:BlockList|à\85නà·\8aතරà·\8aජà·\8fල à·\80à·\8fරණ à¶½à·\90යà·\92à·\83à·\8aතà·\94à·\80]] à¶¶à¶½à¶±à·\8aන.',
+දැනට ක්‍රියාත්මක වන තහනම් හා වාරණයන් ලැයිස්තුවක් සඳහා [[Special:BlockList|වාරණ ලැයිස්තුව]] බලන්න.',
 
 # History merging
 'mergehistory' => 'පිටු ඉතිහාසයන් ඒකාබද්ධ කරන්න',
@@ -1209,8 +1204,6 @@ $1",
 'search-interwiki-caption' => 'සොයුරු ව්‍යාපෘති',
 'search-interwiki-default' => '$1 වෙතින් ප්‍රතිඵල:',
 'search-interwiki-more' => '(තවත්)',
-'search-mwsuggest-enabled' => 'ඉඟි සමගින්',
-'search-mwsuggest-disabled' => 'ඉඟි නොමැත',
 'search-relatedarticle' => 'සහසම්බන්ධිත',
 'mwsuggest-disable' => 'AJAX ඇඟවිලි අක්‍රීය කරන්න',
 'searcheverything-enable' => 'සියළු නාමඅවකාශයන්හි ගවේෂණය කරන්න',
@@ -1245,7 +1238,7 @@ $1",
 
 # Preferences page
 'preferences' => 'අභිරුචි',
-'mypreferences' => 'මà¶\9cà·\9a à¶\85භà·\92රà·\94චà·\92',
+'mypreferences' => 'à¶\85භà·\92රà·\94චà·\93නà·\8a',
 'prefs-edits' => 'සංස්කරණයන් සංඛ්‍යාව:',
 'prefsnologin' => 'පිවිසී නැත (Not logged in)',
 'prefsnologintext' => 'පරිශීලක අභිරුචි සැකසීමට නම්, ඔබ  <span class="plainlinks">[{{fullurl:Special:Userlogin|returnto=$1}} ප්‍රවිෂ්ටවී]</span> සිටිය යුතුය.',
@@ -1734,7 +1727,7 @@ URLහි නීතික බව හා ප්‍රවේශ්‍ය බව 
 'backend-fail-create' => '$1 ගොනුව ලිවිය නොහැකි විය.',
 'backend-fail-maxsize' => '{{PLURAL:$2|බයිට එකකට|බයිට $2 කට}} වඩා විහාල බැවින්  $1 ගොනුව ලිවිය නොහැකි විය.',
 'backend-fail-readonly' => 'ගබඩා බැක්එන්ඩය "$1" දැනට කියවීම-පමණක් සඳහා වෙයි. දක්වා ඇති හේතුව නම්: "\'\'$2\'\'"',
-'backend-fail-usable' => 'අවසර ප්‍රමාණවත් නොවීම නිසාවෙන් හෝ නාමාවලී/බහාලුම් නොමැති වීම නිසාවෙන් $1 ගොනුව ලිවිය නොහැකි විය.',
+'backend-fail-usable' => 'අවසර ප්‍රමාණවත් නොවීම නිසාවෙන් හෝ නාමාවලී/බහාලුම් නොමැති වීම නිසාවෙන් "$1" ගොනුව කියවිය හෝ ලිවිය හෝ නොහැකි විය.',
 
 # Lock manager
 'lockmanager-notlocked' => '"$1" හී අගුළු ඇරිය නොහැක; එය අගුළු දමාද නොමැත.',
@@ -1940,9 +1933,9 @@ When filtered by user, only files where that user uploaded the most recent versi
 
 'disambiguations' => 'නිරාකරණ පිටු සඳහා සබැදෙන පිටු',
 'disambiguationspage' => 'Template:තේරුම් නිරාකරණය',
-'disambiguations-text' => "à¶\89දà·\92රà·\92 à¶´à·\92ටà·\94 '''à·\80à¶\9aà·\8aâ\80\8dරà·\9dතà·\8aතà·\92à·\84රණ à¶´à·\92ටà·\94à·\80'''à¶\9aට à·\83බà·\90â\80\8dඳà·\9a.
+'disambiguations-text' => "පà·\84ත à¶¯à·\90à¶\9aà·\8aà·\80à·\99න à¶´à·\92ටà·\94 à¶\85තර '''à·\80à¶\9aà·\8aâ\80\8dරà·\9dතà·\8aතà·\92à·\84රණ à¶´à·\92ටà·\94à·\80à¶\9aට''' à·\83බà·\90ඳà·\99න à¶\91à¶\9aà·\8a à·\83බà·\90ඳà·\92යà¶\9aà·\8a à·\84à·\9d à¶\87ත.
 ඒවා ඒ වෙනුවට අනුරූප මාතෘකාවට සබැඳිය යුතුය.<br />
-යම් පිටුවක් වක්‍රෝත්තිහරණ පිටුවක් ලෙස සලකනුයේ එය [[MediaWiki:Disambiguationspage]] වෙතින් සබැඳුනු සැකිල්ලක් භාවිතා කරන්නේ නම්ය",
+යම් පිටුවක් වක්‍රෝත්තිහරණ පිටුවක් ලෙස සලකනුයේ එය [[MediaWiki:Disambiguationspage]] වෙතින් සබැඳුනු සැකිල්ලක් භාවිතා කරන්නේ නම්ය.",
 
 'doubleredirects' => 'ද්විත්ව යළි-යොමුකිරීම්',
 'doubleredirectstext' => 'අනෙකුත් යළි-යොමුවීම් පිටුවලට යළි-යොමුවන පිටුවල ලැයිස්තුවක් මෙම පිටුවේ දැක්වේ.
@@ -2169,7 +2162,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 
 # Watchlist
 'watchlist' => 'මගේ මුර-ලැයිස්තුව',
-'mywatchlist' => 'මà\9cà·\9a à¶¸à·\94ර ලැයිස්තුව',
+'mywatchlist' => 'මà·\94ර-ලැයිස්තුව',
 'watchlistfor2' => '$1 සඳහා ($2)',
 'nowatchlist' => 'ඔබගේ මුර-ලැයිස්තුවේ කිසිදු අයිතමයක් නොමැත.',
 'watchlistanontext' => 'ඔබගේ මුර-ලැයිස්තුවෙහි අයිතම නැරඹීමට හෝ සංස්කරණය කිරීමට හෝ කරුණාකර $1 සපුරන්න.',
@@ -2205,11 +2198,7 @@ When filtered by user, only files where that user uploaded the most recent versi
 
 'enotif_mailer' => '{{SITENAME}}හි නිවේදන යවන්නා',
 'enotif_reset' => 'පිවිසුනු සියළු පිටු සලකුණු කරන්න',
-'enotif_newpagetext' => 'මෙය නව පිටුවකි.',
 'enotif_impersonal_salutation' => '{{SITENAME}} පරිශීලක',
-'changed' => 'වෙනස්කරන ලදි',
-'created' => 'තනන ලදි',
-'enotif_subject' => '{{SITENAME}}හි  $PAGETITLE යන පිටුව  $PAGEEDITOR විසින්  $CHANGEDORCREATED කෙරිණි',
 'enotif_lastvisited' => 'ඔබගේ අවසාන පිවිසුමට පසු සිදුවූ සියළු වෙනස්වීම් නැරඹුමට $1 බලන්න.',
 'enotif_lastdiff' => 'මෙම වෙනස නැරඹීම සඳහා $1 බලන්න.',
 'enotif_anon_editor' => 'නිර්නාමික පරිශීලක $1',
@@ -2430,9 +2419,9 @@ $1',
 'blanknamespace' => '(ප්‍රධාන)',
 
 # Contributions
-'contributions' => 'මෙම පරිශීලකගේ දායකත්වයන්',
+'contributions' => '{{GENDER:$1|පරිශීලකගේ}} දායකත්වයන්',
 'contributions-title' => ' $1 සඳහා පරිශීලක දායකත්වයන්',
-'mycontris' => 'මà¶\9cà·\9a à¶¯à·\8fයà¶\9aතà·\8aà·\80',
+'mycontris' => 'දායකත්ව',
 'contribsub2' => '$1 සඳහා ($2)',
 'nocontribs' => 'මෙම උපමානයන් හා ගැලපෙන වෙනස්වීම් හමුනොවිණි.',
 'uctop' => '(ඉහලම)',
@@ -2473,7 +2462,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 යළි-යොමුකරයි',
 'whatlinkshere-hidetrans' => '$1 අන්තර්ගතයන්',
 'whatlinkshere-hidelinks' => 'සබැඳියන් $1',
-'whatlinkshere-hideimages' => 'රà·\96ප සබැඳි $1',
+'whatlinkshere-hideimages' => 'à¶\9cà·\9cනà·\94 සබැඳි $1',
 'whatlinkshere-filters' => 'පෙරහන්',
 
 # Block/unblock
@@ -2957,11 +2946,29 @@ $1 ගේ වාරණයට හේතුව මෙය වේ: "$2"',
 
 # Info page
 'pageinfo-title' => '"$1" සඳහා තොරතුරු',
+'pageinfo-header-basic' => 'මූලික තොරතුරු',
 'pageinfo-header-edits' => 'සංස්කරණ',
+'pageinfo-header-restrictions' => 'පිටු ආරක්ෂණය',
+'pageinfo-display-title' => 'මාතෘකාව පෙන්වන්න',
+'pageinfo-default-sort' => 'පෙරනිමි තේරීම් යතුර',
+'pageinfo-length' => 'පිටු දිග (බයිට් වලින්)',
+'pageinfo-article-id' => 'පිටු අනන්‍යනාංකය',
+'pageinfo-robot-policy' => 'සෙවුම් එන්ජිම් තත්ත්වය',
 'pageinfo-views' => 'නැරඹුම් සංඛ්‍යාව',
-'pageinfo-watchers' => 'මුරකරන්නන් සංඛ්‍යාව',
-'pageinfo-edits' => 'සංස්කරණයන් සංඛ්‍යාව',
-'pageinfo-authors' => 'ප්‍රභින්න කර්තෘවරුන් සංඛ්‍යාව',
+'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-magic-words' => 'මැජික් {{PLURAL:$1|වචනය|වචන}} ($1)',
+'pageinfo-toolboxlink' => 'පිටු තොරතුරු',
 
 # Patrolling
 'markaspatrolleddiff' => 'පරික්ෂාකර බැලූ ලෙස සලකුණු කරන්න',
@@ -3925,6 +3932,10 @@ MediaWiki බෙදාහැර ඇත්තේ එය ප්‍රයෝජන
 'feedback-bugcheck' => 'කදිමයි! දැන් එය දැනටමත් [$1 හඳුනාගත් දෝෂ]වල තිබේ දැයි පිරික්සන්න.',
 'feedback-bugnew' => 'මම පරික්ෂා කළා. නව දෝෂය වාර්තා කරන්න',
 
+# Search suggestions
+'searchsuggest-search' => 'ගවේශණය කරන්න',
+'searchsuggest-containing' => 'ඇතුළත් වෙමින් පවතී...',
+
 # API errors
 'api-error-badaccess-groups' => 'මෙම විකියට ගොනු උඩුගතකිරීම සඳහා ඔබට අවසර නැත.',
 'api-error-badtoken' => 'අභ්‍යන්තර දෝෂය: නොසුදුසු ටෝකනය.',
index 757c47d..f89fbde 100644 (file)
@@ -325,12 +325,12 @@ $messages = array(
 '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',
-'tog-noconvertlink' => 'Vypnúť konverziu názvov',
+'tog-noconvertlink' => 'Vypnúť konverziu názvov odkazov',
 'tog-norollbackdiff' => 'Vynechať rozdiel po vykonaní rollbacku',
 
 'underline-always' => 'Vždy',
 'underline-never' => 'Nikdy',
-'underline-default' => 'Štandardné nastavenie prehliadača',
+'underline-default' => 'Podľa nastavení prehliadača alebo témy vzhľadu',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Štýl písma oblasti na úpravy:',
@@ -415,8 +415,8 @@ $messages = array(
 'newwindow' => '(otvorí v novom okne)',
 'cancel' => 'Zrušiť',
 'moredotdotdot' => 'Viac...',
-'mypage' => 'Moja stránka',
-'mytalk' => 'Moja diskusia',
+'mypage' => 'Stránka',
+'mytalk' => 'Diskusia',
 'anontalk' => 'Diskusia k tejto IP adrese',
 'navigation' => 'Navigácia',
 'and' => '&#32;a',
@@ -426,7 +426,6 @@ $messages = array(
 'qbbrowse' => 'Prehliadať',
 'qbedit' => 'Upraviť',
 'qbpageoptions' => 'Táto stránka',
-'qbpageinfo' => 'Kontext',
 'qbmyoptions' => 'Moje stránky',
 'qbspecialpages' => 'Špeciálne stránky',
 'faq' => 'Často kladené otázky',
@@ -439,7 +438,7 @@ $messages = array(
 'vector-action-protect' => 'Zamknúť',
 'vector-action-undelete' => 'Obnoviť',
 'vector-action-unprotect' => 'Zmeniť stav ochrany',
-'vector-simplesearch-preference' => 'Povoliť rozšírené návrhy hľadania (iba pre tému Vector)',
+'vector-simplesearch-preference' => 'Povoliť zjednodušené pole hľadania (iba pre tému Vector)',
 'vector-view-create' => 'Vytvoriť',
 'vector-view-edit' => 'Upraviť',
 'vector-view-history' => 'Zobraziť históriu',
@@ -533,7 +532,7 @@ $1',
 'privacy' => 'Ochrana osobných údajov',
 'privacypage' => 'Project:Ochrana osobných údajov',
 
-'badaccess' => 'Chyba povolenia',
+'badaccess' => 'Chyba oprávnenia',
 'badaccess-group0' => 'Nemáte povolenie na vykonanie požadovanej operácie.',
 'badaccess-groups' => 'Činnosť, ktorú požadujete, môže vykonať iba člen {{PLURAL:$2|skupiny|jednej zo skupín}}: $1.',
 
@@ -547,7 +546,7 @@ $1',
 'newmessagesdifflink' => 'posledná zmena',
 'youhavenewmessagesfromusers' => 'Máte $1 od {{PLURAL:$3|iného používateľa|$3 iných používateľov}} ($2).',
 'youhavenewmessagesmanyusers' => 'Máte $1 od viacerých ďalších používateľov ($2).',
-'newmessageslinkplural' => '{{PLURAL:$1|novú správu|nové správy|nových správ}}',
+'newmessageslinkplural' => '{{PLURAL:$1|novú správu|nové správy}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|posledná zmena|posledné zmeny}}',
 'youhavenewmessagesmulti' => 'Máte nové správy na $1',
 'editsection' => 'upraviť',
@@ -641,7 +640,7 @@ Oznámte to prosím [[Special:ListUsers/sysop|správcovi]] a uveďte URL.',
 'badarticleerror' => 'Na tejto stránke túto činnosť nemožno vykonať.',
 '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"',
+'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',
@@ -659,15 +658,18 @@ Požiadavka: $2',
 'protectedpagetext' => 'Táto stránka bola zamknutá aby sa zamedzilo úpravám.',
 'viewsourcetext' => 'Môžete si zobraziť a kopírovať zdroj tejto stránky:',
 'viewyourtext' => "Môžete si prehliadnuť a skopírovať zdrojový kód '''vašich zmien''' tejto stránky:",
-'protectedinterface' => 'Táto stránka poskytuje text používateľského rozhrania a je zamknutá, aby sa predišlo jej zneužitiu.',
-'editinginterface' => "'''Upozornenie:''' Upravujete stránku, ktorá poskytuje text používateľského rozhrania. Zmeny tejto stránky ovplyvnia vzhľad používateľského rozhrania ostatných používateľov. Zmeny prosím vykonávajte prostredníctvom [//translatewiki.net/wiki/Main_Page?setlang=sk translatewiki.net], projektu pre lokalizáciu MediaWiki.",
+'protectedinterface' => 'Táto stránka poskytuje text používateľského rozhrania tejto wiki a je zamknutá, aby sa predišlo jej zneužitiu.
+Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/wiki/Main_Page?setlang=sk translatewiki.net], projekt lokalizácie MediaWiki.',
+'editinginterface' => "'''Upozornenie:''' Upravujete stránku, ktorá poskytuje text používateľského rozhrania.
+Zmeny tejto stránky ovplyvnia vzhľad používateľského rozhrania ostatným používateľom.
+Ak chcete pridať alebo zmeniť preklady pre všetky wiki, prosím, použite [//translatewiki.net/wiki/Main_Page?setlang=sk translatewiki.net], projekt lokalizácie MediaWiki.",
 'sqlhidden' => '(SQL príkaz je skrytý)',
 'cascadeprotected' => 'Táto stránka bola zamknutá proti úpravám, pretože je použitá na {{PLURAL:$1|nasledovnej stránke, ktorá je zamknutá|nasledovných stránkach, ktoré sú zamknuté}} voľbou „kaskádového zamknutia“:
 $2',
 'namespaceprotected' => "Nemáte povolenie upravovať stránky v mennom priestore '''$1'''.",
 'customcssprotected' => 'Nemáte právo upravovať túto CSS stránku, pretože obsahuje osobné nastavenie iného používateľa.',
 'customjsprotected' => 'Nemáte právo upravovať túto JavaScript stránku, pretože obsahuje osobné nastavenie iného používateľa.',
-'ns-specialprotected' => 'Stránky v mennom pristore {{ns:special}} nie je možné upravovať.',
+'ns-specialprotected' => 'Stránky v mennom priestore {{ns:special}} nie je možné upravovať.',
 'titleprotected' => "Používateľ [[User:$1|$1]] zabránil vytváraniu stránky s týmto názvom.
 Udaný dôvod: ''$2''.",
 'filereadonlyerror' => 'Nebolo možné modifikovať súbor „$1“, pretože úložisko „$2“ je momentálne v režime len na čítanie.
@@ -686,12 +688,8 @@ Správca, ktorý ho zamkol ponúkol toto vysvetlenie: „$3“.',
 # Login and logout pages
 'logouttext' => "'''Práve ste sa odhlásili.'''
 
-Odteraz môžete používať {{GRAMMAR:akuzatív|{{SITENAME}}}} ako anonymný používateľ alebo sa môžete opäť [[Special:UserLogin|prihlásiť]] pod rovnakým alebo odlišným používateľským menom.
+Odteraz môžete používať {{GRAMMAR:akuzatív|{{SITENAME}}}} ako anonymný používateľ alebo sa môžete opäť <span class='plainlinks'>[$1 prihlásiť]</span> pod rovnakým alebo odlišným používateľským menom.
 Uvedomte si, že niektoré stránky sa môžu naďalej zobrazovať ako keby ste boli prihlásený, až kým nevymažete vyrovnávaciu pamäť vášho prehliadača.",
-'welcomecreation' => '== Vitaj, $1! ==
-
-Vaše konto je vytvorené.
-Nezabudnite si nastaviť svoje [[Special:Preferences|používateľské nastavenia]].',
 'yourname' => 'Používateľské meno:',
 'yourpassword' => 'Heslo:',
 'yourpasswordagain' => 'Zopakujte heslo:',
@@ -701,9 +699,9 @@ Nezabudnite si nastaviť svoje [[Special:Preferences|používateľské nastaveni
 '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',
+'nav-login-createaccount' => 'Prihlásenie / vytvorenie účtu',
 'loginprompt' => 'Na prihlásenie do {{GRAMMAR:genitív|{{SITENAME}}}} musíte mať zapnuté koláčiky (cookies).',
-'userlogin' => 'Vytvorenie konta / prihlásenie',
+'userlogin' => 'Prihlásenie / vytvorenie účtu',
 'userloginnocreate' => 'Prihlásiť',
 'logout' => 'Odhlásiť',
 'userlogout' => 'Odhlásiť',
@@ -718,7 +716,7 @@ Nezabudnite si nastaviť svoje [[Special:Preferences|používateľské nastaveni
 'createaccountreason' => 'Dôvod:',
 'badretype' => 'Zadané heslá nie sú rovnaké.',
 'userexists' => 'Zadané používateľské meno sa už používa.
-Zvoľte si prosím iné meno.',
+Prosím, zvoľte si iné meno.',
 'loginerror' => 'Chyba pri prihlasovaní',
 'createaccounterror' => 'Nepodarilo sa vytvoriť účet: $1',
 'nocookiesnew' => 'Používateľské konto bolo vytvorené, ale nie ste prihlásený. {{SITENAME}} používa cookies na prihlásenie. Máte cookies vypnuté. Zapnite ich a potom sa prihláste pomocou vášho nového používateľského mena a hesla.',
@@ -734,8 +732,8 @@ Skontrolujte preklepy alebo sa [[Special:UserLogin/signup|zaregistrujte ako nov
 'nosuchusershort' => 'V súčasnosti neexistuje používateľ s menom „$1“. Skontrolujte preklepy.',
 'nouserspecified' => 'Musíte uviesť meno používateľa.',
 'login-userblocked' => 'Tento používateľ je zablokovaný. Nie je mu dovolené prihlásiť sa.',
-'wrongpassword' => 'Zadané heslo je nesprávne. Skúste  znovu.',
-'wrongpasswordempty' => 'Zadané heslo bolo prázdne. Skúste prosím znova.',
+'wrongpassword' => 'Zadané heslo je nesprávne. Prosím, skúste to znova.',
+'wrongpasswordempty' => 'Zadané heslo bolo prázdne. Prosím, skúste to znova.',
 'passwordtooshort' => 'Heslo musí mať dĺžku aspoň $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'password-name-match' => 'Vaše heslo musí byť iné ako vaše používateľské meno.',
 'password-login-forbidden' => 'Použitie tohto používateľského mena a hesla bolo zakázané.',
@@ -765,9 +763,9 @@ Z tohto dôvodu nemôžu návštevníci z tejto IP adresy momentálne vytvoriť
 'emailauthenticated' => 'Vaša emailová adresa bola overená $2 $3.',
 'emailnotauthenticated' => 'Vaša e-mailová adresa ešte nebola overená. Preto nemôžete prijať emaily pre žiadnu z nasledovných funkcií.',
 'noemailprefs' => 'Tieto nástroje budú prístupné po vyplnení emailovej adresy vo vašich nastaveniach.',
-'emailconfirmlink' => 'Potvrďte vašu e-mailovú adresu',
+'emailconfirmlink' => 'Potvrďte svoju e-mailovú adresu',
 'invalidemailaddress' => 'Emailovú adresu nemožno akceptovať, pretože sa zdá, že má neplatný formát. Zadajte adresu v správnom tvare alebo nechajte príslušné políčko prázdne.',
-'cannotchangeemail' => 'Na tejto wiki nie je možné meniť e-mailové adresy používateľského konta.',
+'cannotchangeemail' => 'Na tejto wiki nie je možné meniť e-mailové adresy používateľského účtu.',
 'emaildisabled' => 'Táto lokalita nedokáže posielať emaily.',
 'accountcreated' => 'Účet vytvorený',
 'accountcreatedtext' => 'Používateľský účet $1 bol vytvorený.',
@@ -844,7 +842,7 @@ Dočasné heslo:$2',
 'passwordreset-emailerror-capture' => 'Bol vytvorený pripomienkový e-mail, ktorý je zobrazený nižšie, ale nepodarilo sa ho odoslať používateľovi: $1',
 
 # Special:ChangeEmail
-'changeemail' => 'Zmena e-mailovej adresy',
+'changeemail' => 'Zmeniť emailovú adresu',
 'changeemail-header' => 'Zmena e-mailovej adresy pre účet',
 'changeemail-text' => 'Vyplňte tento formulár na zmenu e-mailovej adresy. Zmenu budete musieť potvrdiť zadaním svojho hesla.',
 'changeemail-no-info' => 'Na prístup k tejto stránke musíte byť prihlásený.',
@@ -950,7 +948,7 @@ Môžete [[Special:Search/{{PAGENAME}}|vyhľadávať názov tejto stránky]] v o
 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>.',
+alebo <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hľadať v súvisiacich záznamoch]</span>, ale nemáte oprávnenie túto stránku vytvoriť.',
 '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á.
@@ -1057,6 +1055,15 @@ Zdá sa, že bola zmazaná.',
 'edit-already-exists' => 'Nebolo možné vytvoriť novú stránku.
 Už existuje.',
 'defaultmessagetext' => 'Predvolený text správy',
+'content-failed-to-parse' => 'Nepodarilo sa spracovať obsah $2 pre model $1: $3',
+'invalid-content-data' => 'Neplatné dáta obsahu',
+'content-not-allowed-here' => 'Obsah „$1“ nie je povolený na stránke [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'čistý text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Upozornenie: Táto stránka obsahuje príliš mnoho volaní funkcií syntaktického analyzátora, ktoré nadmerne zaťažujú server.
@@ -1078,6 +1085,7 @@ Tieto argumenty boli vynechané.',
 'expansion-depth-exceeded-warning' => 'Stránka prekročila povolenú hĺbku expanzie',
 'parser-unstrip-loop-warning' => 'Zistené zacyklenie volania rozširovacej značky',
 'parser-unstrip-recursion-limit' => 'Prektočený limit rekurzie volania rozširovacej značky ($1)',
+'converter-manual-rule-error' => 'Bola zistená chyba v pravidle manuálnej konverzie jazyka',
 
 # "Undo" feature
 'undo-success' => 'Úpravu je možné vrátiť. Prosím skontrolujte tento rozdiel, čím overíte, že táto úprava je tá, ktorú chcete, a následne uložte zmeny, čím ukončíte vrátenie.',
@@ -1311,8 +1319,6 @@ Podrobnosti nájdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}
 'search-interwiki-caption' => 'Sesterské projekty',
 'search-interwiki-default' => '$1 výsledkov:',
 'search-interwiki-more' => '(viac)',
-'search-mwsuggest-enabled' => 's návrhmi',
-'search-mwsuggest-disabled' => 'bez návrhov',
 'search-relatedarticle' => 'Súvisiace',
 'mwsuggest-disable' => 'Vypnúť AJAX návrhy',
 'searcheverything-enable' => 'Vyhľadať vo všetkých menných priestoroch',
@@ -1407,7 +1413,7 @@ Tu je náhodne vytvorená hodnota, ktorú môžete použiť: $1',
 'timezoneregion-indian' => 'Indický oceán',
 'timezoneregion-pacific' => 'Tichý oceán',
 'allowemail' => 'Povoliť prijímanie e-mailov od iných používateľov',
-'prefs-searchoptions' => 'Voľby hľadania',
+'prefs-searchoptions' => 'Hľadanie',
 'prefs-namespaces' => 'Menné priestory',
 'defaultns' => 'Inak vyhľadávať v týchto menných priestoroch:',
 'default' => 'predvolený',
@@ -1575,6 +1581,9 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'rightslogtext' => 'Toto je záznam zmien práv používateľa.',
 'rightslogentry' => 'členstvo v skupine zmenené pre $1 z $2 na $3',
 'rightslogentry-autopromote' => 'bol automaticky povýšený z $2 na $3',
+'logentry-rights-rights' => '$1 {{GENDER:$2|zmenil|zmenila}} členstvo $3 v skupinách z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$2|zmenil|zmenila}} členstvo $3 v skupinách',
+'logentry-rights-autopromote' => '$1 {{GENDER:$2|bol automaticky povýšený|bola automaticky povýšená}} z $4 na $5',
 'rightsnone' => '(žiadne)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1638,7 +1647,7 @@ Musí obsahovať menej ako $1 {{PLURAL:$1|znak|znaky|znakov}}.',
 'hist' => 'história',
 'hide' => 'skryť',
 'show' => 'zobraziť',
-'minoreditletter' => 'D',
+'minoreditletter' => 'd',
 'newpageletter' => 'N',
 'boteditletter' => 'b',
 'number_of_watching_users_pageview' => '[$1 {{PLURAL:$1|sledujúci používateľ|sledujúci používatelia|sledujúcich používateľov}}]',
@@ -1961,7 +1970,7 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'uploadnewversion-linktext' => 'Nahrať novú verziu tohto súboru',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'zdieľané úložisko',
-'upload-disallowed-here' => 'Ľutujeme, tento súbor nie je možné prepísať.',
+'upload-disallowed-here' => 'Tento súbor nemôžete prepísať.',
 
 # File reversion
 'filerevert' => 'Obnoviť $1',
@@ -2198,7 +2207,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: <code>$1</code> (nepridávajte ich do hľadania).',
+Podporované protokoly: <code>$1</code> (ak protokol nie je uvedený, použije sa <code>http://</code>).',
 'linksearch-line' => 'Na $1 odkazuje $2',
 'linksearch-error' => 'Zástupné znaky je možné použiť iba na začiatku názvu domény.',
 
@@ -2247,9 +2256,8 @@ Môžete si prečítať [[{{MediaWiki:Listgrouprights-helppage}}|ďalšie inform
 'emailuser-title-target' => 'E-mail {{GENDER:$1|tomuto používateľovi|tejto používateľke}}',
 'emailuser-title-notarget' => 'E-mail používateľovi',
 'emailpage' => 'E-mail používateľovi',
-'emailpagetext' => 'Ak tento používateľ zadal platnú emailovú adresu vo svojich nastaveniach,
-môžete mu pomocou nasledovného formulára poslať email.
-Emailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach]] sa zobrazí ako adresa odosielateľa emailu, aby vám mohol príjemca priamo odpovedať.',
+'emailpagetext' => 'Pomocou nasledovného formulára môžete {{GENDER:$1|tomuto používateľovi|tejto používateľke}} poslať e-mailovú správu.
+Mailová adresa, ktorú ste zadali vo svojich [[Special:Preferences|nastaveniach]] sa zobrazí ako adresa odosielateľa mailu, aby vám mohol príjemca priamo odpovedať.',
 'usermailererror' => 'Emailový program vrátil chybu:',
 'defemailsubject' => 'email {{GRAMMAR:genitív|{{SITENAME}}}} od používateľa „$1“',
 'usermaildisabled' => 'Používateľ má vypnuté používanie emailu',
@@ -2317,11 +2325,7 @@ Ak budete chcieť neskôr stránku odstrániť zo sledovaných stránok, kliknit
 
 'enotif_mailer' => 'Upozorňovač {{GRAMMAR:genitív|{{SITENAME}}}}',
 'enotif_reset' => 'Označiť všetky stránky ako „navštívené“',
-'enotif_newpagetext' => 'Toto je nová stránka.',
 'enotif_impersonal_salutation' => 'používateľ {{GRAMMAR:genitív|{{SITENAME}}}}',
-'changed' => 'zmene',
-'created' => 'vytvorení',
-'enotif_subject' => '{{SITENAME}} - stránka $PAGETITLE bola $CHANGEDORCREATED $PAGEEDITOR',
 'enotif_lastvisited' => 'Všetky zmeny od vašej poslednej návštevy uvidíte na $1.',
 'enotif_lastdiff' => 'Zmenu uvidíte v $1.',
 'enotif_anon_editor' => 'anonymný používateľ $1',
@@ -2497,7 +2501,8 @@ Ak bola od zmazania vytvorená nová stránka s rovnakým názvom, obnovené rev
 'undeletedrevisions' => '{{PLURAL:$1|jedna verzia bola obnovená|$1 verzie boli obnovené|$1 verzií bolo obnovených}}',
 'undeletedrevisions-files' => '{{PLURAL:$1|Jedna revízia|$1 revízie|$1 revízií}} a {{PLURAL:$2|jeden súbor bol obnovený|$2 súbory boli obnovené|$2 súborov bolo obnovených}}',
 'undeletedfiles' => '{{PLURAL:$1|Jeden súbor bol obnovený|$1 súbory boli obnovené|$1 súborov bolo obnovených}}',
-'cannotundelete' => 'Obnovenie sa nepodarilo; pravdepodobne niekto iný obnovil stránku skôr ako vy.',
+'cannotundelete' => 'Obnovenie sa nepodarilo:
+$1',
 'undeletedpage' => "'''$1 bol obnovený'''
 
 Zoznam posledných mazaní a obnovení nájdete v [[Special:Log/delete|Zázname mazaní]].",
@@ -2530,7 +2535,7 @@ $1',
 # Contributions
 'contributions' => 'Príspevky používateľa',
 'contributions-title' => 'Príspevky používateľa pre $1',
-'mycontris' => 'Moje príspevky',
+'mycontris' => 'Príspevky',
 'contribsub2' => 'Príspevky $1 ($2)',
 'nocontribs' => 'Neboli nájdené úpravy, ktoré by zodpovedali týmto kritériám.',
 'uctop' => '(posledná úprava)',
@@ -2570,7 +2575,7 @@ Nižšie si môžete pozrieť najnovšiu položku záznamu blokovaní:',
 'whatlinkshere-hideredirs' => '$1 presmerovania',
 'whatlinkshere-hidetrans' => '$1 transklúzie',
 'whatlinkshere-hidelinks' => '$1 odkazy',
-'whatlinkshere-hideimages' => '$1 odkazov na obrázok',
+'whatlinkshere-hideimages' => '$1 odkazov na súbor',
 'whatlinkshere-filters' => 'Filtre',
 
 # Block/unblock
@@ -2811,6 +2816,7 @@ Cieľová stránka „[[:$1]]“ už existuje. Chcete ho vymazať a vytvoriť ta
 'immobile-target-namespace-iw' => 'Interwiki odkaz nie je platným cieľom na presun stránky.',
 'immobile-source-page' => 'Túto stránku nemožno presunúť.',
 'immobile-target-page' => 'Nie je možné presunúť na cieľovú stránku z daným názvom.',
+'bad-target-model' => 'Požadovaný cieľ používa iný model obsahu. Nie je možné konvertovať z $1 na $2.',
 'imagenocrossnamespace' => 'Obrázok nemožno presunúť mimo menného priestoru obrázkov',
 'nonfile-cannot-move-to-file' => 'Nie je možné presunúť objekt, ktorý nie je súbor do menného priestoru Súbor',
 'imagetypemismatch' => 'Nová prípona súboru nezodpovedá jeho typu',
@@ -2889,6 +2895,7 @@ Všetky transwiki importy sa zaznamenávajú v [[Special:Log/import|Zázname imp
 'import-interwiki-templates' => 'Vložiť všetky šablóny',
 'import-interwiki-submit' => 'Importovať',
 'import-interwiki-namespace' => 'Cieľový menný priestor:',
+'import-interwiki-rootpage' => 'Koreňová stránka cieľa (nepovinné):',
 'import-upload-filename' => 'Názov súboru:',
 'import-comment' => 'komentár:',
 'importtext' => 'Prosím, exportujte súbor zo zdrojovej wiki použitím [[Special:Export|nástroja na export]].
@@ -2921,6 +2928,9 @@ Uložte ho na svoj disk a nahrajte sem.',
 'import-error-interwiki' => 'Stránka „$1“ nie je importovaná, pretože jej názov je vyhradený pre externé odkazy (interwiki).',
 'import-error-special' => 'Stránka „$1“ nie je importovaná, pretože patrí do špeciálneho menného priestoru, ktorý nepovoľuje stránky.',
 'import-error-invalid' => 'Stránka „$1“ nie je importovaná, pretože jej názov je neplatný.',
+'import-options-wrong' => '{{PLURAL:$2|Nesprávna voľba|Nesprávne voľby}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'Uvedená koreňová stránka nie je platný názov stránky.',
+'import-rootpage-nosubpage' => 'Menný priestor „$1“ koreňovej stránky nepodporuje podstránky.',
 
 # Import log
 'importlogpage' => 'Záznam importov',
@@ -2932,7 +2942,6 @@ Uložte ho na svoj disk a nahrajte sem.',
 
 # JavaScriptTest
 'javascripttest' => 'Testovanie JavaScriptu',
-'javascripttest-disabled' => 'Táto funkcia je vypnutá.',
 'javascripttest-title' => 'Beží $1 testov',
 'javascripttest-pagetext-noframework' => 'Táto stránka je vyhradená pre testy JavaScriptu.',
 'javascripttest-pagetext-unknownframework' => 'Neznáma testovacia platfoma „$1“.',
@@ -3073,14 +3082,43 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 
 # Info page
 'pageinfo-title' => 'Informácie o „$1“',
+'pageinfo-not-current' => 'Ospravedlňujeme sa, túto informáciu nie je možné poskytnúť pre staré revízie.',
 'pageinfo-header-basic' => 'Základné údaje',
 'pageinfo-header-edits' => 'História úprav',
+'pageinfo-header-restrictions' => 'Ochrana stránky',
+'pageinfo-header-properties' => 'Vlastnosti stránky',
+'pageinfo-display-title' => 'Zobraziť názov',
+'pageinfo-default-sort' => 'Predvolený kľúč zoraďovania:',
+'pageinfo-length' => 'Dĺžka stránky (v bajtoch)',
 'pageinfo-article-id' => 'ID stránky',
+'pageinfo-language' => 'Jazyk obsahu stránok',
+'pageinfo-robot-policy' => 'Stav vyhľadávača',
+'pageinfo-robot-index' => 'Indexovať stránku',
+'pageinfo-robot-noindex' => 'Neindexovať stránku',
 'pageinfo-views' => 'Počet zobrazení',
-'pageinfo-watchers' => 'Počet sledovateľov',
+'pageinfo-watchers' => 'Počet používateľov sledujúcich stránku',
+'pageinfo-redirects-name' => 'Presmerovania na túto stránku',
+'pageinfo-subpages-name' => 'Podstránky tejto stránky',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|presmerovanie|presmerovania|presmerovaní}}; $3 {{PLURAL:$3|nie je presmerovanie|nie sú presmerovania}})',
+'pageinfo-firstuser' => 'Tvorca stránky',
+'pageinfo-firsttime' => 'Dátum vytvorenia stránky',
+'pageinfo-lastuser' => 'Naposledy upravil',
 'pageinfo-lasttime' => 'Dátum poslednej úpravy',
 'pageinfo-edits' => 'Celkový počet úprav',
 'pageinfo-authors' => 'Celkový počet autorov',
+'pageinfo-recent-edits' => 'Počet nedávnych úprav (za posledných $1)',
+'pageinfo-recent-authors' => 'Počet nedávnych jedinečných autorov',
+'pageinfo-magic-words' => 'Magické {{PLURAL:$1|slovo|slová}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrytá kategória|Skryté kategórie}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Vložená šablóna|Vložené šablóny}} ($1)',
+'pageinfo-toolboxlink' => 'Informácie o stránke',
+'pageinfo-redirectsto' => 'Presmerovanie na',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Počíta sa ako obsah stránky',
+'pageinfo-contentpage-yes' => 'Áno',
+'pageinfo-protect-cascading' => 'Kaskádové zamknutie',
+'pageinfo-protect-cascading-yes' => 'Áno',
+'pageinfo-protect-cascading-from' => 'Zámky pochádzajú z kaskádových zamknutí',
 
 # Skin names
 'skinname-standard' => 'Klasický',
@@ -3103,6 +3141,8 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 'markedaspatrollederror' => 'Nie je možné označiť ako strážené',
 'markedaspatrollederrortext' => 'Pre označenie ako strážený je potrebné uviesť revíziu, ktorá sa má označiť ako strážená.',
 'markedaspatrollederror-noautopatrol' => 'Nie je vám umožnené označiť vlastné zmeny za strážené.',
+'markedaspatrollednotify' => 'Táto zmena stránky $1 bola označená ako strážená.',
+'markedaspatrollederrornotify' => 'Označenie ako strážená zlyhalo.',
 
 # Patrol log
 'patrol-log-page' => 'Záznam strážení',
@@ -3135,6 +3175,7 @@ Jeho spustením môžete kompromitovať svoj systém.",
 'file-info-size-pages' => '$1 × $2 pixlov, veľkosť súboru: $3, typ MIME: $4, $5 {{PLURAL:$5|stránka|stránky|stránok}}',
 'file-nohires' => 'Nie je dostupné vyššie rozlíšenie.',
 'svg-long-desc' => 'SVG súbor, $1 × $2 pixelov, veľkosť súboru: $3',
+'svg-long-desc-animated' => 'Animovaný súbor SVG, nominálne $1 × $2 pixlov, veľkosť súboru: $3',
 'show-big-image' => 'Obrázok vo vyššom rozlíšení',
 'show-big-image-preview' => 'Veľkosť tohto náhľadu: $1.',
 'show-big-image-other' => 'Iné {{PLURAL:$2|rozlíšenie|rozlíšenia}}: $1 .',
@@ -3144,6 +3185,8 @@ Jeho spustením môžete kompromitovať svoj systém.",
 'file-info-png-looped' => 'opakované',
 'file-info-png-repeat' => 'prehrané $1-krát{{PLURAL:$1|||}}',
 'file-info-png-frames' => '$1 {{PLURAL:$1|rámec|rámce|rámcov}}',
+'file-no-thumb-animation' => "'''Pozn.: Z dôvodu technických obmedzení nebudú náhľady tohto súboru animované.'''",
+'file-no-thumb-animation-gif' => "'''Pozn.: Z dôvodu technických obmedzení nebudú náhľady súborov GIF vo vysokom rozlíšení (ako je tento súbor) animované.'''",
 
 # Special:NewFiles
 'newimages' => 'Galéria nových obrázkov',
@@ -3163,6 +3206,7 @@ Jeho spustením môžete kompromitovať svoj systém.",
 'hours' => '{{PLURAL:$1|$1 hodina|$1 hodiny|$1 hodín}}',
 'days' => '{{PLURAL:$1|$1 deň|$1 dni|$1 dní}}',
 'ago' => 'pred: $1',
+'just-now' => 'Pred chvíľkou',
 
 # Bad image list
 'bad_image_list' => 'Formát je nasledovný:
@@ -3664,6 +3708,7 @@ Platnosť tohto potvrdzovacieho kódu vyprší $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Transklúzia interwiki je vypnutá]',
 'scarytranscludefailed' => '[Nepodarilo sa priniesť šablónu pre $1]',
+'scarytranscludefailed-httpstatus' => '[Stiahnutie šablóny zlyhalo pre $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL je príliš dlhé]',
 
 # Delete conflict
@@ -3718,8 +3763,8 @@ Skúste obyčajný náhľad.',
 Skúste obyčajný náhľad.',
 
 # Friendlier slave lag warnings
-'lag-warn-normal' => 'Zmeny novšie ako $1 {{PLURAL:$1|sekunda|sekundy|sekúnd}} nemožno v tomto zozname zobraziť.',
-'lag-warn-high' => 'Z dôvodu dlhej odozvy databázového servera zmeny novšie ako $1 {{PLURAL:$1|sekunda|sekundy|sekúnd}} nemožno v tomto zozname zobraziť.',
+'lag-warn-normal' => 'Úpravy za {{PLURAL:$1|poslednú sekundu|posledné $1 sekundy|posledných $1 sekúnd}} nemusia byť v tomto zozname zobrazené.',
+'lag-warn-high' => 'Kvôli dlhšej odozve databázového servera nemusia byť úpravy za {{PLURAL:$1|poslednú sekundu|posledné $1 sekundy|posledných $1 sekúnd}} v tomto zozname zobrazené.',
 
 # Watchlist editor
 'watchlistedit-numitems' => 'Váš zoznam sledovaných stránok obsahuje {{PLURAL:$1|jednu stránku|$1 stránky|$1 stránok}} nepočítajúc diskusné stránky.',
@@ -3777,6 +3822,7 @@ Tiež môžete [[Special:EditWatchlist|použiť štandardný editor]].',
 'version-license' => 'Licencia',
 'version-poweredby-credits' => "Táto wiki beží na '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'ďalší',
+'version-credits-summary' => 'Nasledujúcim osobám by sme radi poďakovali za ich príspevky k vývoju [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki je slobodný softvér; môžete ho šíriť a / alebo modifikovať podľa podmienok GNU General Public License, ktorú vydala Free Software Foundation; a to buď verzie 2 tejto licencie alebo (podľa vášho uváženia) ktorejkoľvek neskoršej verzie. 
 
 MediaWiki je šírený v nádeji, že bude užitočný, avšak BEZ AKEJKOĽVEK ZÁRUKY; neposkytujú sa ani implicitné záruky PREDAJNOSTI alebo VHODNOSTI NA URČITÝ ÚČEL. Ďalšie informácie nájdete v GNU General Public License.
@@ -3938,6 +3984,10 @@ V opačnom prípade môžete použiť zjednodušený formulár nižšie. Váš k
 'feedback-bugcheck' => 'Skvelé! Teraz len skontrolujte, či to nie je jedna z už [$1 známych chýb].',
 'feedback-bugnew' => 'Skontroloval som. Poslať nové hlásenie o chybe.',
 
+# Search suggestions
+'searchsuggest-search' => 'Hľadať',
+'searchsuggest-containing' => 'obsahuje...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nemáte oprávnenie nahrávať súbory na tejto wiki.',
 'api-error-badtoken' => 'Vnútorná chyba: Zlý token.',
index e148828..ec9432e 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Dbc334
+ * @author Eleassar
  * @author Freakolowsky
  * @author Irena Plahuta
  * @author McDutchie
@@ -232,7 +233,7 @@ $messages = array(
 
 'underline-always' => 'Vedno',
 'underline-never' => 'Nikoli',
-'underline-default' => 'Privzeto (brskalnik)',
+'underline-default' => 'Koža ali privzeto v brskalniku',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Uredi področni slog pisave:',
@@ -317,7 +318,7 @@ $messages = array(
 'newwindow' => '(odpre se novo okno)',
 'cancel' => 'Prekliči',
 'moredotdotdot' => 'Več ...',
-'mypage' => 'Moja stran',
+'mypage' => 'Stran',
 'mytalk' => 'Pogovor',
 'anontalk' => 'Pogovorna stran IP',
 'navigation' => 'Navigacija',
@@ -328,7 +329,6 @@ $messages = array(
 'qbbrowse' => 'Prebrskaj',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Možnosti strani',
-'qbpageinfo' => 'Podatki o strani',
 'qbmyoptions' => 'Moje možnosti',
 'qbspecialpages' => 'Posebne strani',
 'faq' => 'Najpogostejša vprašanja',
@@ -341,7 +341,7 @@ $messages = array(
 'vector-action-protect' => 'Zaščiti',
 'vector-action-undelete' => 'Vrni',
 'vector-action-unprotect' => 'Spremeni zaščito',
-'vector-simplesearch-preference' => 'Omogoči izboljšane predloge iskanja (samo koža Vector)',
+'vector-simplesearch-preference' => 'Omogoči poenostavljeno vrstico za iskanje (samo koža Vector)',
 'vector-view-create' => 'Ustvari',
 'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Zgodovina',
@@ -351,6 +351,7 @@ $messages = array(
 'namespaces' => 'Imenski prostori',
 'variants' => 'Različice',
 
+'navigation-heading' => 'Navigacijski meni',
 'errorpagetitle' => 'Napaka',
 'returnto' => 'Vrnite se na $1.',
 'tagline' => 'Iz {{GRAMMAR:rodilnik|{{SITENAME}}}}',
@@ -468,12 +469,12 @@ $1',
 'viewdeleted' => 'Prikažem $1?',
 'restorelink' => '$1 {{PLURAL:$1|izbrisano redakcijo|izbrisani redakciji|izbrisane redakcije|izbrisanih redakcij}}',
 'feedlinks' => 'Podajanje:',
-'feed-invalid' => 'Neveljavna vrsta naročniškega dovoda.',
-'feed-unavailable' => 'Živi zaznamki niso na voljo',
-'site-rss-feed' => '$1 RSS vir',
-'site-atom-feed' => '$1 Atom vir',
-'page-rss-feed' => '»$1« RSS vir',
-'page-atom-feed' => '»$1« Atom vir',
+'feed-invalid' => 'Neveljavna vrsta naročniškega vira.',
+'feed-unavailable' => 'Živi zaznamki niso na razpolago.',
+'site-rss-feed' => 'RSS-vir strani »$1«',
+'site-atom-feed' => 'Atom-vir strani »$1«',
+'page-rss-feed' => 'RSS-vir strani »$1«',
+'page-atom-feed' => 'Atom-vir strani »$1«',
 'red-link-title' => '$1 (stran ne obstaja)',
 'sort-descending' => 'Razvrsti padajoče',
 'sort-ascending' => 'Razvrsti naraščajoče',
@@ -550,8 +551,8 @@ 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.',
-'perfcached' => 'Navedeni podatki so shranjeni v predpomnilniku in morda niso popolnoma posodobljeni. V predpomnilniku {{PLURAL:$1|je|sta|so|je}} na voljo največ $1 {{PLURAL:$1|rezultat|rezultata|rezultate|rezultatov}}.',
-'perfcachedts' => 'Prikazani podatki so shranjeni v predpomnilniku in so bili nazadnje osveženi $1. V predpomnilniku {{PLURAL:$4|je|sta|so|je}} na voljo največ $4 {{PLURAL:$4|rezultat|rezultata|rezultate|rezultatov}}.',
+'perfcached' => 'Navedeni podatki so shranjeni v predpomnilniku in morda niso popolnoma posodobljeni. V predpomnilniku {{PLURAL:$1|je|sta|so|je}} na razpolago največ $1 {{PLURAL:$1|rezultat|rezultata|rezultate|rezultatov}}.',
+'perfcachedts' => 'Prikazani podatki so shranjeni v predpomnilniku in so bili zadnjič osveženi $1. V predpomnilniku {{PLURAL:$4|je|sta|so|je}} na razpolago največ $4 {{PLURAL:$4|rezultat|rezultata|rezultate|rezultatov}}.',
 'querypage-no-updates' => 'Posodobitve za to stran so trenutno onemogočene. Tukajšnji podatki se v kratkem ne bodo osvežili.',
 'wrong_wfQuery_params' => 'Nepravilni parametri za wfQuery()<br />
 Funkcija: $1<br />
@@ -561,7 +562,7 @@ Poizvedba: $2',
 'actionthrottled' => 'Dejanje zaustavljeno',
 'actionthrottledtext' => 'Kot ukrep proti smetju, je število izvajanj tega dejanja v časovnem obdobju omejeno, in vi ste ta limit presegli.
 Prosimo, poskusite znova čez nekaj minut.',
-'protectedpagetext' => 'Ta stran je bila zaklenjena za preprečitev urejanja.',
+'protectedpagetext' => 'Ta stran je bila zaklenjena za preprečitev urejanja ali drugih dejanj.',
 'viewsourcetext' => 'Lahko si ogledate in kopirate vsebino te strani:',
 'viewyourtext' => "Lahko si ogledate in kopirate vsebino '''vaših urejanj''' te strani:",
 'protectedinterface' => 'Prikazana stran vsebuje besedilo vmesnika programja na tem wikiju in je zaradi preprečevanja zlorab zaščitena.
@@ -595,10 +596,10 @@ Administrator, ki ga je zaklenil, je podal naslednje pojasnilo: »$3«.',
 # Login and logout pages
 'logouttext' => "'''Odjavili ste se.'''
 
-{{GRAMMAR:tožilnik|{{SITENAME}}}} lahko zdaj uporabljate neprijavljeni ali pa se [[Special:UserLogin|ponovno prijavite]] kot enak ali drug uporabnik.
+{{GRAMMAR:tožilnik|{{SITENAME}}}} lahko zdaj uporabljate neprijavljeni ali pa se <span class='plainlinks'>[$1 ponovno prijavite]</span> kot enak ali drug uporabnik.
 Morda bodo nekatere strani še naprej prikazane, kot da ste prijavljeni, dokler ne boste izpraznili predpomnilnika brskalnika.",
-'welcomecreation' => '== Dobrodošli, $1! ==
-Ustvarili ste račun.
+'welcomeuser' => '$1, dobrodošli!',
+'welcomecreation-msg' => 'Ustvarili ste račun.
 Ne pozabite si prilagoditi vaših [[Special:Preferences|nastavitev {{GRAMMAR:rodilnik|{{SITENAME}}}}]].',
 'yourname' => 'Uporabniško ime:',
 'yourpassword' => 'Geslo:',
@@ -861,6 +862,10 @@ Da bi stran ustvarili, vnesite v spodnji obrazec besedilo
 'noarticletext' => 'Na tej strani ni trenutno nobenega besedila. Naslov strani lahko poskusite [[Special:Search/{{PAGENAME}}|poiskati]] na drugih straneh, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} v dnevniških zapisih] ali pa [{{fullurl:{{FULLPAGENAME}}|action=edit}} stran uredite]</span>.',
 'noarticletext-nopermission' => 'Na strani trenutno ni nobenega besedila.
 Lahko poskusite [[Special:Search/{{PAGENAME}}|poiskati naslov strani]] na drugih straneh ali <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} v povezanih dnevniških zapisih]</span>, vendar za ustvarjanje strani nimate zadostnih dovoljenj.',
+'missing-revision' => 'Redakcija št. $1 strani »{{PAGENAME}}« ne obstaja.
+
+Po navadi se to zgodi, ko sledite zastareli povezavi na zgodovino strani, ki jo je nekdo izbrisal.
+Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].',
 'userpage-userdoesnotexist' => 'Uporabniški račun »<nowiki>$1</nowiki>« ni registriran.
 Prosimo preverite, ali res želite ustvariti/urediti to stran.',
 'userpage-userdoesnotexist-view' => 'Uporabniški račun »$1« ni registriran.',
@@ -887,7 +892,7 @@ Vedite, da .css in .js strani po meri uporabljajo naslov z malo začetnico, npr.
 'note' => "'''Opomba:'''",
 'previewnote' => "'''Pomnite, da stran le predogledujete.'''
 Vaših sprememb še nismo shranili!",
-'continue-editing' => 'Nadaljujte z urejanjem',
+'continue-editing' => 'Pojdi na urejevalno območje',
 'previewconflict' => 'V prikazanem predogledu je v zgornjem predelu urejanja navedeno besedilo, kakor se bo prikazalo, če ga boste shranili.',
 'session_fail_preview' => "'''Oprostite! Zaradi izgube podatkov o seji nam vašega urejanja žal ni uspelo obdelati.'''
 Prosimo, poskusite znova.
@@ -957,8 +962,8 @@ Lahko se vrnete nazaj in urejate že obstoječe strani, ali pa se [[Special:User
 
 Premislite preden nadaljujete s pisanjem, morda bo stran zaradi istih razlogov ponovno odstranjena.
 Spodaj je prikazan dnevnik brisanja in prestavljanja:",
-'moveddeleted-notice' => 'Ta stran je bila izbrisana.
-Dnevnik brisanja in prestavljanja strani je na voljo spodaj.',
+'moveddeleted-notice' => 'Stran je bila izbrisana.
+Spodaj sta za sklicevanje na razpolago dnevnik brisanja in dnevnik prestavljanja strani.',
 'log-fulllog' => 'Ogled celotnih dnevniških zapiskov',
 'edit-hook-aborted' => 'Urejanje je bilo brez obrazložitve prekinjeno zaradi neznane napake.',
 'edit-gone-missing' => 'Strani ni mogoče posodobiti.
@@ -967,6 +972,15 @@ Izgleda, da je bila izbrisana.',
 'edit-no-change' => 'Vaše urejanje je bilo prezrto, saj ni vsebovalo sprememb.',
 'edit-already-exists' => 'Ni bilo mogoče ustvariti nove strani, ker že obstaja.',
 'defaultmessagetext' => 'Prednastavljeno besedilo',
+'content-failed-to-parse' => 'Nisem mogel razčleniti vsebine $2 za obliko $1: $3',
+'invalid-content-data' => 'Neveljavni podatki vsebine',
+'content-not-allowed-here' => 'Vsebina »$1« ni dovoljena na strani [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikibesedilo',
+'content-model-text' => 'golo besedilo',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Opozorilo:''' Ta stran vsebuje preveč klicev funkcije razčlenjevalnika kode.
@@ -1178,6 +1192,10 @@ Upoštevajte, da bo uporaba navigacijskih gumbov ponastavila ta stolpec.',
 'editundo' => 'razveljavi',
 'diff-multi' => '({{PLURAL:$1|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} {{PLURAL:$2|$2 uporabnika|$2 uporabnikov}} {{PLURAL:$1|ni prikazana|nista prikazani|niso prikazane|ni prikazanih}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|$1 vmesna redakcija|$1 vmesni redakciji|$1 vmesne redakcije|$1 vmesnih redakcij}} več kot $2 {{PLURAL:$2|uporabnika|uporabnikov}} {{PLURAL:$1|ni prikazana|nista prikazani|niso prikazane|ni prikazanih}})',
+'difference-missing-revision' => '{{PLURAL:$2|Ene redakcije|$2 redakcij}} razlike ($1) {{PLURAL:$2|nisem}} našel.
+
+Po navadi se to zgodi, ko sledite zastareli povezavi na razliko redakcij strani, ki jo je nekdo izbrisal.
+Podrobnosti lahko najdete v [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dnevniku brisanja].',
 
 # Search results
 'searchresults' => 'Izid iskanja',
@@ -1220,8 +1238,6 @@ Upoštevajte, da bo uporaba navigacijskih gumbov ponastavila ta stolpec.',
 'search-interwiki-caption' => 'Sorodni projekti',
 'search-interwiki-default' => '$1 zadetkov:',
 'search-interwiki-more' => '(več)',
-'search-mwsuggest-enabled' => 's predlogi',
-'search-mwsuggest-disabled' => 'brez predlogov',
 'search-relatedarticle' => 'Podobno',
 'mwsuggest-disable' => 'Onemogoči predloge Ajax',
 'searcheverything-enable' => 'Iskanje po vseh imenskih prostorih',
@@ -1491,6 +1507,9 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'rightslogtext' => 'Prikazan je dnevnik sprememb uporabniških pravic.',
 'rightslogentry' => 'je spremenil(-a) pravice uporabnika $1 iz $2 v $3',
 'rightslogentry-autopromote' => 'je bil(-a) samodejno povišan(-a) z $2 na $3',
+'logentry-rights-rights' => '$1 je spremenil(-a) članstvo skupine $3 z $4 na $5',
+'logentry-rights-rights-legacy' => '$1 je spremenil(-a) članstvo skupine $3',
+'logentry-rights-autopromote' => '$1 je bil(-a) samodejno povišan(-a) z $4 na $5',
 'rightsnone' => '(nobeno)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1535,7 +1554,7 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'recentchanges' => 'Zadnje spremembe',
 'recentchanges-legend' => 'Možnosti zadnjih sprememb',
 'recentchanges-summary' => 'Na tej strani lahko spremljajte najnedavnejše spremembe wikija.',
-'recentchanges-feed-description' => 'Spremljajte najnovejše spremembe wikija prek tega vira.',
+'recentchanges-feed-description' => 'Spremljajte zadnje spremembe wikija prek tega vira.',
 'recentchanges-label-newpage' => 'S tem urejanjem je bila ustvarjena nova stran',
 'recentchanges-label-minor' => 'Manjše urejanje',
 'recentchanges-label-bot' => 'To urejanje je bilo izvedeno z botom',
@@ -1552,7 +1571,7 @@ Ko vas drugi uporabniki kontaktirajo, jim vašega e-poštnega naslova ne bomo ra
 'rclinks' => 'Prikaži zadnjih $1 sprememb v zadnjih $2 dneh<br />$3',
 'diff' => 'prim',
 'hist' => 'zgod',
-'hide' => 'skrij',
+'hide' => 'Skrij',
 'show' => 'Prikaži',
 'minoreditletter' => 'm',
 'newpageletter' => 'N',
@@ -1709,7 +1728,7 @@ MGP # Pentax
 PICT # mešano
  #</pre> <!-- pustite to vrstico takšno, kot je -->',
 'upload-success-subj' => 'Datoteka je bila uspešno naložena',
-'upload-success-msg' => 'Vaša datoteka iz [$2] je bila uspešno naložena. Na voljo je tukaj: [[:{{ns:file}}:$1]]',
+'upload-success-msg' => 'Datoteka s strani [$2] se je uspešno naložila. Na razpolago je tukaj: [[:{{ns:file}}:$1]]',
 'upload-failure-subj' => 'Težava pri nalaganju',
 'upload-failure-msg' => 'Prišlo je do težave z vašo naloženo datoteko iz [$2]:
 
@@ -1727,9 +1746,9 @@ Prosimo, obrnite se na [[Special:ListUsers/sysop|administratorja]].',
 Prosimo, preverite veljavnost in dostopnost naslova URL ter poskusite ponovno.
 Če se težava ponavlja, kontaktirajte [[Special:ListUsers/sysop|administratorja]].',
 'upload-too-many-redirects' => 'URL vsebuje preveč preusmeritev',
-'upload-unknown-size' => 'Neznana velikost',
+'upload-unknown-size' => 'neznana velikost',
 'upload-http-error' => 'Prišlo je do napake HTTP: $1',
-'upload-copy-upload-invalid-domain' => 'Nalaganje kopij s te domene ni na voljo.',
+'upload-copy-upload-invalid-domain' => 'Nalaganje kopij s te domene ni možno.',
 
 # File backend
 'backend-fail-stream' => 'Ne morem pretakati datoteke $1.',
@@ -1739,6 +1758,7 @@ Prosimo, preverite veljavnost in dostopnost naslova URL ter poskusite ponovno.
 'backend-fail-notsame' => 'Različna datoteka že obstaja na $1.',
 'backend-fail-invalidpath' => '$1 ni veljavna skladiščna pot.',
 'backend-fail-delete' => 'Ne morem izbrisati datoteke $1.',
+'backend-fail-describe' => 'Nisem mogel spremeniti metapodatkov datoteke »$1«.',
 'backend-fail-alreadyexists' => 'Datoteka $1 že obstaja.',
 'backend-fail-store' => 'Ne morem shraniti datoteke $1 na $2.',
 'backend-fail-copy' => 'Ne morem kopirati datoteke $1 na $2.',
@@ -1829,8 +1849,8 @@ Prosimo, ponovno preverite pravilnost URL-a in delovanje strani.',
 Prosimo, preverite delovanje strani, počakajte kratek čas in poskusite ponovno.
 Morda želite poskusiti ob času manjše zasedenosti.',
 
-'license' => 'Dovoljenje:',
-'license-header' => 'Dovoljenje',
+'license' => 'Licenciranje:',
+'license-header' => 'Licenca',
 'nolicense' => 'Nobeno',
 'license-nopreview' => '(Predogled ni na voljo)',
 'upload_source_url' => ' (veljaven, javnosti dostopen URL)',
@@ -1853,7 +1873,7 @@ Ko so rezultati filtrirani po uporabniku, so prikazane samo datoteke, pri kateri
 # File description page
 'file-anchor-link' => 'Datoteka',
 'filehist' => 'Zgodovina datoteke',
-'filehist-help' => 'Klikni na datum in čas za ogled datoteke, ki je bila takrat naložena.',
+'filehist-help' => 'Kliknite na datum in čas za ogled datoteke, ki je bila takrat naložena.',
 'filehist-deleteall' => 'izbriši vse',
 'filehist-deleteone' => 'izbriši to',
 'filehist-revert' => 'vrni',
@@ -1870,8 +1890,8 @@ Ko so rezultati filtrirani po uporabniku, so prikazane samo datoteke, pri kateri
 'imagelinks' => 'Uporaba datoteke',
 'linkstoimage' => 'Datoteka je del {{PLURAL:$1|naslednje $1 strani|naslednjih $1 strani}} {{GRAMMAR:rodilnik|{{SITENAME}}}}:',
 'linkstoimage-more' => 'Na to datoteko se {{PLURAL:$1|povezuje več kot $1 stran|povezujeta več kot $1 strani|povezujejo več kot $1 strani|povezuje več kot $1 strani}}.
-Naslednji seznam obsega samo {{PLURAL:$1|prvo stran, ki se povezuje|prvi $1 strani, ki se povezujeta|prve $1 strani, ki se povezujejo|prvih $1 strani, ki se povezujejo}} na to datoteko.
-Na voljo je tudi [[Special:WhatLinksHere/$2|celotni seznam]].',
+Naslednji seznam obsega samo {{PLURAL:$1|prvo stran, ki se povezuje|prvi $1 strani, ki se povezujeta|prve $1 strani, ki se povezujejo|prvih $1 strani, ki se povezujejo}} na datoteko.
+Na razpolago je tudi [[Special:WhatLinksHere/$2|popoln seznam]].',
 'nolinkstoimage' => 'Z datoteko se ne povezuje nobena stran.',
 'morelinkstoimage' => 'Preglejte [[Special:WhatLinksHere/$1|več povezav]] na to datoteko.',
 'linkstoimage-redirect' => '$1 (preusmeritev datoteke) $2',
@@ -1891,14 +1911,14 @@ Morda želite urediti njeno opisno stran na tamkajšnji [$2 opisni strani datote
 'shared-repo-from' => 'iz $1',
 'shared-repo' => 'skupno skladišče',
 'shared-repo-name-wikimediacommons' => 'Wikimedijina Zbirka',
-'upload-disallowed-here' => 'Slike žal ne morete prepisati.',
+'upload-disallowed-here' => 'Datoteke žal ne morete prepisati.',
 
 # File reversion
 'filerevert' => 'Vrni $1',
 'filerevert-legend' => 'Vrni datoteko',
 'filerevert-intro' => "Vračate datoteko '''[[Media:$1|$1]]''' na [$4 različico $3, $2].",
 'filerevert-comment' => 'Razlog:',
-'filerevert-defaultcomment' => 'Vrnjeno na različico $2, $1',
+'filerevert-defaultcomment' => 'Vrnjeno na različico $2, $1.',
 'filerevert-submit' => 'Vrni',
 'filerevert-success' => "Datoteka '''[[Media:$1|$1]]''' je bila vrnjena na [$4 različico $3, $2].",
 'filerevert-badversion' => 'Ne najdem preteklih lokalnih verzij datoteke s podanim časovnim žigom.',
@@ -2128,9 +2148,9 @@ Glej tudi [[Special:WantedCategories|želene kategorije]].',
 'linksearch-pat' => 'Iskalni vzorec:',
 'linksearch-ns' => 'Imenski prostor:',
 'linksearch-ok' => 'Išči',
-'linksearch-text' => 'Nadomestne znake, kot je »*.wikipedia.org«, lahko uporabljate.
+'linksearch-text' => 'Uporabljate lahko nadomestne znake, kot je »*.wikipedia.org«.
 Zahtevana je vsaj najvišja domena, na primer »*.org«.<br />
-Podprti protokoli: <code>$1</code> (teh ne dodajte v svoje iskanje).',
+Podprti protokoli: <code>$1</code> (če protokol ni določen, se privzame http://).',
 'linksearch-line' => '$1 povezano iz $2',
 'linksearch-error' => 'Jokerji se lahko pojavijo le na začetku gostiteljskega imena.',
 
@@ -2155,8 +2175,8 @@ Podprti protokoli: <code>$1</code> (teh ne dodajte v svoje iskanje).',
 
 # Special:ListGroupRights
 'listgrouprights' => 'Pravice uporabniških skupin',
-'listgrouprights-summary' => 'Spodaj se nahaja seznam uporabniških skupin na tem wikiju in njim dodeljene pravice dostopa.
-Na voljo so morda [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o posameznih skupinah.',
+'listgrouprights-summary' => 'Tu je na razpolago seznam uporabniških skupin na tem wikiju z navedbo dodeljenih pravic dostopa.
+Morda so na razpolago tudi [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]] o posameznih skupinah.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Dodeljena pravica</span>
 * <span class="listgrouprights-revoked">Odvzeta pravica</span>',
 'listgrouprights-group' => 'Skupina',
@@ -2179,8 +2199,8 @@ Na voljo so morda [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]]
 'emailuser-title-target' => 'Pošlji {{GENDER:$1|uporabniku|uporabnici}} e-pošto',
 'emailuser-title-notarget' => 'Pošlji uporabniku e-pismo',
 'emailpage' => 'Pošlji uporabniku e-pismo',
-'emailpagetext' => 'S spodnjim obrazcem lahko uporabniku pošljete e-poštno sporočilo.
-E-poštni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniških nastavitvah]], bo v e-sporočilu naveden kot naslov »Od:«, tako da bo prejemnik lahko odgovoril neposredno vam.',
+'emailpagetext' => 'S spodnjim obrazcem lahko {{GENDER:$1|uporabniku|uporabnici}} pošljete e-poštno sporočilo.
+E-poštni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniških nastavitvah]], bo v e-sporočilu naveden kot naslov »Od:«, tako da bo {{GENDER:$1|prejemnik lahko odgovoril|prejemnica lahko odgovorila}} neposredno vam.',
 'usermailererror' => 'Predmet e-pošte je vrnil napako:',
 'defemailsubject' => 'Elektronska pošta {{GRAMMAR:rodilnik|{{SITENAME}}}} od uporabnika »$1«',
 'usermaildisabled' => 'Uporabniška e-pošta je onemogočena',
@@ -2231,7 +2251,7 @@ Morebitne spremembe te strani in pripadajoče pogovorne strani bodo navedene tuk
 'watchnochange' => 'V prikazanem časovnem obdobju ni nihče spremenil nadzorovanih strani.',
 'watchlist-details' => 'Spremljate $1 {{PLURAL:$1|stran|strani|strani|strani|strani}} (pogovorne strani niso vštete).',
 'wlheader-enotif' => '* Obveščanje po elektronski pošti je omogočeno.',
-'wlheader-showupdated' => "* Od vašega zadnjega ogleda spremenjene strani so prikazanje '''krepko'''.",
+'wlheader-showupdated' => "* Strani, spremenjene od vašega zadnjega ogleda, so prikazane '''krepko'''.",
 'watchmethod-recent' => 'med nedavnimi urejanji iščem spremljane strani',
 'watchmethod-list' => 'med spremljanimi stranmi iščem nedavna urejanja',
 'watchlistcontains' => 'Spremljate $1 {{PLURAL:$1|stran|strani}}.',
@@ -2247,20 +2267,23 @@ Morebitne spremembe te strani in pripadajoče pogovorne strani bodo navedene tuk
 
 'enotif_mailer' => 'Obvestilni poštar {{GRAMMAR:rodilnik|{{SITENAME}}}}',
 'enotif_reset' => 'Označi vse strani kot prebrane',
-'enotif_newpagetext' => 'To je nova stran.',
 'enotif_impersonal_salutation' => 'Uporabnik {{GRAMMAR:rodilnik|{{SITENAME}}}}',
-'changed' => 'spremenil',
-'created' => 'ustvaril',
-'enotif_subject' => 'Stran {{GRAMMAR:rodilnik|{{SITENAME}}}} $PAGETITLE je $CHANGEDORCREATED $PAGEEDITOR',
+'enotif_subject_deleted' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|izbrisal|izbrisala}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_subject_created' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|ustvaril|ustvarila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_subject_moved' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|prestavil|prestavila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_subject_restored' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|obnovil|obnovila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_subject_changed' => '{{GENDER:$2|Uporabnik|Uporabnica}} $2 je {{GENDER:$2|spremenil|spremenila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}',
+'enotif_body_intro_deleted' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|izbrisal|izbrisala}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
+'enotif_body_intro_created' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|ustvaril|ustvarila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
+'enotif_body_intro_moved' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|spremenil|spremenila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
+'enotif_body_intro_restored' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|obnovil|obnovila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
+'enotif_body_intro_changed' => '{{GENDER:$2|uporabnik|uporabnica}} $2 je dne $PAGEEDITDATE {{GENDER:$2|spremenil|spremenila}} stran $1 v {{GRAMMAR:dajalnik|{{SITENAME}}}}; za trenutno redakcijo glejte $3.',
 'enotif_lastvisited' => 'Za spremembe po vašem zadnjem obisku glejte $1.',
 'enotif_lastdiff' => 'Glej $1 za to spremembo.',
 'enotif_anon_editor' => 'brezimni uporabnik $1',
 'enotif_body' => '$WATCHINGUSERNAME,
 
-stran v {{GRAMMAR:dajalnik|{{SITENAME}}}} $PAGETITLE je dne $PAGEEDITDATE $CHANGEDORCREATED uporabnik $PAGEEDITOR,
-za trenutno redakcijo glejte $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Urejevalčev povzetek: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2268,8 +2291,7 @@ Navežite stik z urejevalcem:
 e-pošta: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Nadaljnjih obvestil do obiska strani ne boste prejemali.
-Na spisku nadzorov lahko tudi ponastavite zastavice obveščanj za vse spremljane strani.
+Nadaljnjih obvestil do obiska strani ne boste prejemali. Na spisku nadzorov lahko tudi ponastavite zastavice obveščanj za vse spremljane strani.
 
              Vaš opozorilni sistem {{GRAMMAR:rodilnik|{{SITENAME}}}}
 
@@ -2305,7 +2327,7 @@ Za zapise nedavnih brisanj glej $2.',
 'dellogpage' => 'Dnevnik brisanja',
 'dellogpagetext' => 'Spodaj je prikazan seznam nedavnih brisanj.',
 'deletionlog' => 'dnevnik brisanja',
-'reverted' => 'Obnovljeno na prejšnjo redakcijo',
+'reverted' => 'Vrnjeno na prejšnje urejanje.',
 'deletecomment' => 'Razlog:',
 'deleteotherreason' => 'Drugi/dodatni razlogi:',
 'deletereasonotherlist' => 'Drug razlog',
@@ -2440,8 +2462,8 @@ Morda imate napačno povezavo ali pa je bila redakcija obnovljena ali odstranjen
 'undeletedrevisions' => '{{PLURAL:$1|obnovljena $1 redakcija|obnovljeni $1 redakciji|obnovljene $1 redakcije|obnovljenih $1 redakcij}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|redakcija|redakciji|redakcije|redakcij}} in $2 {{PLURAL:$2|datoteka|datoteki|datoteke|datotek}} {{PLURAL:$1+$2|obnovljena|obnovljeni|obnovljene|obnovljenih}}',
 'undeletedfiles' => '{{PLURAL:$1|obnovljena je $1 datoteka|obnovljeni sta $1 datoteki|obnovljene so $1 datoteke|obnovljenih je $1 datotek}}',
-'cannotundelete' => 'Obnova ni uspela;
-morda je stran obnovil že kdo drug.',
+'cannotundelete' => 'Obnova je spodletela:
+$1',
 'undeletedpage' => "'''Obnovili ste stran $1.'''
 
 Nedavna brisanja in obnove so zapisani v [[Special:Log/delete|dnevniku brisanja]].",
@@ -2473,7 +2495,7 @@ $1',
 'blanknamespace' => '(Osnovno)',
 
 # Contributions
-'contributions' => 'Uporabnikovi prispevki',
+'contributions' => '{{GENDER:$1|Uporabnikovi|Uporabničini}} prispevki',
 'contributions-title' => 'Prispevki uporabnika $1',
 'mycontris' => 'Prispevki',
 'contribsub2' => 'Uporabnik: $1 ($2)',
@@ -2516,7 +2538,7 @@ Najnovejši vnos v dnevniku blokad je naveden spodaj:',
 'whatlinkshere-hideredirs' => '$1 preusmeritve',
 'whatlinkshere-hidetrans' => '$1 vključitve',
 'whatlinkshere-hidelinks' => '$1 povezave',
-'whatlinkshere-hideimages' => '$1 povezave slik',
+'whatlinkshere-hideimages' => '$1 povezave datotek',
 'whatlinkshere-filters' => 'Filtri',
 
 # Block/unblock
@@ -2606,7 +2628,7 @@ Oglejte si [[Special:BlockList|seznam blokad]] za pregled blokad.',
 Razlog za blokado uporabnika $1 je: »$2«',
 'blocklogpage' => 'Dnevnik blokiranja',
 'blocklog-showlog' => 'Ta uporabnik je že bil blokiran.
-Dnevnik blokiranja je na voljo spodaj:',
+Za sklicevanje so tule navedeni vnosi v dnevniku blokiranja:',
 'blocklog-showsuppresslog' => 'Ta uporabnik je že bil blokiran in skrit.
 Dnevnik skrivanja je na voljo spodaj:',
 'blocklogentry' => '[[$1]] blokiran s časom poteka blokade $2 $3',
@@ -2749,16 +2771,17 @@ strani ni mogoče prestaviti samo vaše.',
 'immobile-target-namespace-iw' => 'Povezava interwiki ni veljaven cilj za premik strani.',
 'immobile-source-page' => 'Te strani ni mogoče prestaviti.',
 'immobile-target-page' => 'Ne morem premakniti na ta ciljni naslov.',
+'bad-target-model' => 'Želen cilj uporablja drugačno obliko vsebine. Ne morem pretvoriti iz $1 v $2.',
 'imagenocrossnamespace' => 'Ne morem premakniti datoteke izven imenskega prostora datotek',
 'nonfile-cannot-move-to-file' => 'Ne morem premakniti nedatoteko v imenski prostor datotek',
 'imagetypemismatch' => 'Nova končnica datoteke se ne ujema z njeno vrsto',
 'imageinvalidfilename' => 'Ciljno ime datoteke je neveljavno',
 'fix-double-redirects' => 'Posodobi vse preusmeritve, ki kažejo na prvotni naslov',
 'move-leave-redirect' => 'Na prejšnji strani ustvari preusmeritev',
-'protectedpagemovewarning' => "'''Opozorilo:''' Stran je bila zaklenjena, tako da jo lahko prestavljajo samo uporabniki z administratorskimi dovoljenji.
-Najnovejši vnos v dnevniku je na voljo spodaj:",
-'semiprotectedpagemovewarning' => "'''Opomba:''' Stran je bila zaklenjena, tako da jo lahko prestavljajo samo registrirani uporabniki.
-Najnovejši vnos v dnevniku je na voljo spodaj:",
+'protectedpagemovewarning' => "'''Opozorilo:''' Stran je bila zaklenjena in jo lahko prestavljajo samo uporabniki z administratorskimi pravicami.
+Za sklicevanje je naveden zadnji vnos v dnevnik:",
+'semiprotectedpagemovewarning' => "'''Opomba:''' Stran je bila zaklenjena in jo lahko prestavljajo samo registrirani uporabniki.
+Za sklicevanje je naveden zadnji vnos v dnevniku:",
 'move-over-sharedrepo' => '== Datoteka obstaja ==
 [[:$1]] obstaja v deljeni shrambi. Premik datoteke na ta naslov bo prepisalo deljeno datoteko.',
 'file-exists-sharedrepo' => 'Izbrano ime datoteke je že v uporabi v deljeni shrambi.
@@ -2880,7 +2903,6 @@ Prosimo, poskusite znova.',
 
 # JavaScriptTest
 'javascripttest' => 'Preizkušanje JavaScripta',
-'javascripttest-disabled' => 'Funkcija na tem wikiju ni omogočena.',
 'javascripttest-title' => 'Poganjanje $1 preizkusov',
 'javascripttest-pagetext-noframework' => 'Stran je rezervirana za poganjanje preizkusov JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Neznano ogrodje za preizkušanje »$1«.',
@@ -2913,7 +2935,7 @@ Prosimo, poskusite znova.',
 'tooltip-ca-watch' => 'Dodajte stran na spisek nadzorov',
 'tooltip-ca-unwatch' => 'Odstranite stran s spiska nadzorov',
 'tooltip-search' => 'Preiščite wiki',
-'tooltip-search-go' => 'Pojdi na strani z natanko takim imenom, če obstaja',
+'tooltip-search-go' => 'Pojdi na stran z natanko takim imenom, če obstaja',
 'tooltip-search-fulltext' => 'Najde vneseno besedilo po straneh',
 'tooltip-p-logo' => 'Glavna stran',
 'tooltip-n-mainpage' => 'Obiščite Glavno stran',
@@ -2925,8 +2947,8 @@ Prosimo, poskusite znova.',
 'tooltip-n-help' => 'Kraj za pomoč',
 'tooltip-t-whatlinkshere' => 'Seznam vseh s trenutno povezanih strani',
 'tooltip-t-recentchangeslinked' => 'Zadnje spremembe na s trenutno povezanih straneh',
-'tooltip-feed-rss' => 'Dovod strani RSS',
-'tooltip-feed-atom' => 'Dovod strani Atom',
+'tooltip-feed-rss' => 'RSS-vir strani',
+'tooltip-feed-atom' => 'Atom-vir strani',
 'tooltip-t-contributions' => 'Preglejte seznam uporabnikovih prispevkov',
 'tooltip-t-emailuser' => 'Pošljite uporabniku e-pismo',
 'tooltip-t-upload' => 'Naložite slike ali predstavnostne datoteke',
@@ -2953,7 +2975,7 @@ Prosimo, poskusite znova.',
 'tooltip-watchlistedit-raw-submit' => 'Posodobi spisek nadzorov',
 'tooltip-recreate' => 'Ponovno ustvari stran, čeprav je bila izbrisana',
 'tooltip-upload' => 'Pričnite z nalaganjem',
-'tooltip-rollback' => 'Funkcija »Vrni« z enim klikom povrne vsa urejanja zadnjega urejevalca te strani',
+'tooltip-rollback' => 'Možnost »Vrni« z enim klikom povrne vsa urejanja zadnjega urejevalca te strani.',
 'tooltip-undo' => '"Razveljavi" vrne to urejanje in odpre predogled v oknu za urejanje.
 Omogoča vnos pojasnila v povzetku urejanja.',
 'tooltip-preferences-save' => 'Shrani nastavitve',
@@ -2985,6 +3007,7 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 
 # Info page
 'pageinfo-title' => 'Informacije o »$1«',
+'pageinfo-not-current' => 'Oprostite, vendar ne moremo nuditi podatkov starejših redakcij.',
 'pageinfo-header-basic' => 'Osnovni podatki',
 'pageinfo-header-edits' => 'Zgodovina urejanja',
 'pageinfo-header-restrictions' => 'Zaščita strani',
@@ -2993,6 +3016,7 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'pageinfo-default-sort' => 'Privzeti ključ za razvrščanje',
 'pageinfo-length' => 'Dolžina strani (v bajtih)',
 'pageinfo-article-id' => 'ID strani',
+'pageinfo-language' => 'Jezik vsebine strani',
 'pageinfo-robot-policy' => 'Status iskalnega pogona',
 'pageinfo-robot-index' => 'Na voljo za indeksiranje',
 'pageinfo-robot-noindex' => 'Ni na voljo za indeksiranje',
@@ -3009,9 +3033,17 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'pageinfo-authors' => 'Skupno število različnih avtorjev',
 'pageinfo-recent-edits' => 'Nedavno število urejanj (zadnjih $1)',
 'pageinfo-recent-authors' => 'Nedavno število različnih avtorjev',
-'pageinfo-restriction' => 'Zaščita strani ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '{{PLURAL:$1|Čarobna beseda|Čarobni besedi|Čarobne besede}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrita kategorija|Skriti kategoriji|Skrite kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Vključena predloga|Vključeni predlogi|Vključene predloge}} ($1)',
+'pageinfo-toolboxlink' => 'Podatki o strani',
+'pageinfo-redirectsto' => 'Preusmerja na',
+'pageinfo-redirectsto-info' => 'informacije',
+'pageinfo-contentpage' => 'Šteje kot stran s vsebino',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Zaščite se dedujejo od tukaj',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Zaščite se dedujejo od',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označite kot nadzorovano',
@@ -3023,6 +3055,8 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'markedaspatrollederror' => 'Ni mogoče označiti kot pregledano',
 'markedaspatrollederrortext' => 'Določite redakcijo, ki jo želite označiti kot pregledano.',
 'markedaspatrollederror-noautopatrol' => 'Svojih urejanj vam ni dovoljeno označiti kot nadzorovanih.',
+'markedaspatrollednotify' => 'Ta sprememba $1 je bila označena kot nadzorovana.',
+'markedaspatrollederrornotify' => 'Označevanje kot nadzorovano ni uspelo.',
 
 # Patrol log
 'patrol-log-page' => 'Dnevnik patrulje',
@@ -3054,7 +3088,7 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
 'file-info' => 'Velikost datoteke: $1, MIME-vrsta: <code>$2</code>',
 'file-info-size' => '$1 × $2 točk, velikost datoteke: $3, vrsta MIME: $4',
 'file-info-size-pages' => '$1 × $2 točk, velikost datoteke: $3, vrsta MIME: $4, $5 {{PLURAL:$5|stran|strani}}',
-'file-nohires' => 'Slika višje ločljivosti ni na voljo.',
+'file-nohires' => 'Višja ločljivost slike ni na voljo.',
 'svg-long-desc' => 'datoteka SVG, v izvirniku $1 × $2 slikovnih točk, velikost datoteke: $3',
 'svg-long-desc-animated' => 'animirana datoteka SVG, v izvirniku $1 × $2 slikovnih točk, velikost datoteke: $3',
 'show-big-image' => 'Slika v višji ločljivosti',
@@ -3092,6 +3126,7 @@ Z njenim zagonom lahko ogrozite vaš sistem.",
 'hours' => '$1 {{PLURAL:$1|ura|uri|ure|ur}}',
 'days' => '$1 {{PLURAL:$1|dan|dneva|dnevi|dni}}',
 'ago' => 'pred $1',
+'just-now' => 'pravkar',
 
 # Bad image list
 'bad_image_list' => 'Oblika je naslednja:
@@ -3308,7 +3343,7 @@ Druga bodo po privzetem skrita.
 'exif-copyrighted-true' => 'Avtorsko zaščiteno',
 'exif-copyrighted-false' => 'Javna last',
 
-'exif-unknowndate' => 'Neznan datum',
+'exif-unknowndate' => 'neznan datum',
 
 'exif-orientation-1' => 'Navadna',
 'exif-orientation-2' => 'Vodoravno zrcaljeno',
@@ -3592,6 +3627,7 @@ Potrditvena koda poteče $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Prevključevanje med wikiji je onemogočeno]',
 'scarytranscludefailed' => '[Pridobivanje predloge za $1 ni uspelo]',
+'scarytranscludefailed-httpstatus' => '[Pridobivanje predloge za $1 ni uspelo: HTTP $2]',
 'scarytranscludetoolong' => '[Spletni naslov je predolg]',
 
 # Delete conflict
@@ -3701,9 +3737,10 @@ Uporabite lahko tudi [[Special:EditWatchlist|standardni urejevalnik]].',
 'version-hook-name' => 'Ime razširitve',
 'version-hook-subscribedby' => 'Naročen s strani',
 'version-version' => '(Različica $1)',
-'version-license' => 'Dovoljenje',
+'version-license' => 'Licenca',
 'version-poweredby-credits' => "Ta wiki poganja '''[//www.mediawiki.org/ MediaWiki]''', vse pravice pridržave © 2001-$1 $2.",
 'version-poweredby-others' => 'drugi',
+'version-credits-summary' => 'Radi bi priznali prispevek naslednjih oseb k [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki je prosto programje; lahko ga razširjate in / ali spreminjate pod pogoji GNU General Public License, kot ga je objavila Free Software Foundation; bodisi License različice 2 ali (po vaši izbiri) katere koli poznejše različice.
 
 MediaWiki je razširjan v upanju, da bo uporaben, vendar BREZ KAKRŠNEGA KOLI ZAGOTOVILA; tudi brez posrednega jamstva PRODAJNE VREDNOSTI ali PRIMERNOSTI ZA DOLOČEN NAMEN. Oglejte si GNU General Public License za več podrobnosti.
@@ -3870,6 +3907,10 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'feedback-bugcheck' => 'Izvrstno! Samo preverite, da ne gre za enega od [$1 že znanih hroščev].',
 'feedback-bugnew' => 'Sem preveril. Prijavi nov hrošč',
 
+# Search suggestions
+'searchsuggest-search' => 'Iskanje',
+'searchsuggest-containing' => 'vsebujoč ...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nalaganje datotek na ta wiki vam ni dovoljeno.',
 'api-error-badtoken' => 'Notranja napaka: slab žeton.',
@@ -3922,4 +3963,6 @@ V nasprotnem primeru lahko uporabite preprost obrazec spodaj. Vašo pripombo bom
 'duration-centuries' => '$1 {{PLURAL:$1|stoletje|stoletji|stoletja|stoletij}}',
 'duration-millennia' => '$1 {{PLURAL:$1|tisočletje|tisočletji|tisočletja|tisočletij}}',
 
+# Unknown messages
+'svg-long-error' => 'Neveljavna datoteka SVG: $1',
 );
index 440dfd9..0fd3d94 100644 (file)
@@ -160,7 +160,6 @@ $messages = array(
 'qbfind' => 'Fenda',
 'qbedit' => 'Ändern',
 'qbpageoptions' => 'Seytaoptiona',
-'qbpageinfo' => 'Seytadata',
 'qbmyoptions' => 'Menne Seyta',
 'qbspecialpages' => 'Spezialseyta',
 'faq' => 'FAQ',
@@ -363,12 +362,8 @@ De Sperre wurde durch [[User:$1|$1]] miet der Begrindung ''„$2“'' eigerichte
 # Login and logout pages
 'logouttext' => "'''Du best nun obgemeldet.'''
 
-Du koast {{SITENAME}} jitz anonym wetter nutzen, oder diech erneut under damm selba oder a'm andern Nutzernoama [[Special:UserLogin|oamelda]].
+Du koast {{SITENAME}} jitz anonym wetter nutzen, oder diech erneut under damm selba oder a'm andern Nutzernoama <span class='plainlinks'>[$1 oamelda]</span>.
 Beachte, doas einige Seyta noo oazeiga kinna, doas du oagemeldet best, sulange du ne denn Browsercache gelaart host.",
-'welcomecreation' => '== Willkumma, $1! ==
-
-Dei Benutzerkonto wurde eigerichtet.
-Vergiss nä, denne [[Special:Preferences|{{SITENAME}}-Eistellunga]] oazupoassa.',
 'yourname' => 'Benutzernoame:',
 'yourpassword' => 'Passwort:',
 'yourpasswordagain' => 'Passwort wiederhola:',
@@ -798,8 +793,6 @@ Stelle sicher, doaß de Versionsgeschichte anner Seite historisch korrekt ies.',
 'search-section' => '(Obschnitt $1)',
 'search-suggest' => 'Meitest du „$1“?',
 'search-interwiki-caption' => 'Schwasterprujätte',
-'search-mwsuggest-enabled' => 'miet Vurschläga',
-'search-mwsuggest-disabled' => 'kääne Vurschläge',
 'mwsuggest-disable' => 'Vurschläge per Ajax deaktiviern',
 'searchrelated' => 'verwandt',
 'searchall' => 'olle',
@@ -1441,9 +1434,6 @@ Wenn du de Seite wieder vu denner Beobachtungsliste entferna mechtest, klicke uf
 
 'enotif_mailer' => '{{SITENAME}}-E-Mail-Benoachrichtigungsdienst',
 'enotif_reset' => 'Olle Seyta ols besucht markiern',
-'enotif_newpagetext' => 'Doas ies anne neue Seite.',
-'created' => 'erzeugt',
-'enotif_subject' => '[{{SITENAME}}] De Seite "$PAGETITLE" wurde vu $PAGEEDITOR $CHANGEDORCREATED',
 'enotif_lastvisited' => "Olle Änderunga uff a'n Blick: $1",
 'enotif_lastdiff' => 'Siehe $1 noach dieser Änderung.',
 'enotif_anon_editor' => 'Anonymer Nutzer $1',
index 2a46218..137ffc4 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'Aso sa',
-'monday'        => 'Aso-gafua',
-'tuesday'       => '‘O le aso lua',
-'wednesday'     => 'Aso lulu',
-'thursday'      => 'Aso totofi',
-'friday'        => 'Aso falaile',
-'saturday'      => 'Aso to‘ona‘i',
-'sun'           => 'Aso sa',
-'mon'           => 'Aso gafua',
-'wed'           => 'Aso lulu',
-'fri'           => 'Aso falaile',
-'january'       => 'Ianuari',
-'february'      => 'Fepuari',
-'march'         => 'Mati',
-'april'         => 'Aperila',
-'may_long'      => 'Me',
-'june'          => 'Iuni',
-'july'          => 'Iulai',
-'august'        => 'Aokuso',
-'september'     => 'Setema',
-'october'       => 'Oketopa',
-'november'      => 'Novema',
-'december'      => 'Tesema',
-'january-gen'   => 'Ianuari',
-'february-gen'  => 'Fepuari',
-'march-gen'     => 'Mati',
-'april-gen'     => 'Aperila',
-'may-gen'       => 'Me',
-'june-gen'      => 'Iuni',
-'july-gen'      => 'Iulai',
-'august-gen'    => 'Aokuso',
+'sunday' => 'Aso sa',
+'monday' => 'Aso-gafua',
+'tuesday' => '‘O le aso lua',
+'wednesday' => 'Aso lulu',
+'thursday' => 'Aso totofi',
+'friday' => 'Aso falaile',
+'saturday' => 'Aso to‘ona‘i',
+'sun' => 'Aso sa',
+'mon' => 'Aso gafua',
+'wed' => 'Aso lulu',
+'fri' => 'Aso falaile',
+'january' => 'Ianuari',
+'february' => 'Fepuari',
+'march' => 'Mati',
+'april' => 'Aperila',
+'may_long' => 'Me',
+'june' => 'Iuni',
+'july' => 'Iulai',
+'august' => 'Aokuso',
+'september' => 'Setema',
+'october' => 'Oketopa',
+'november' => 'Novema',
+'december' => 'Tesema',
+'january-gen' => 'Ianuari',
+'february-gen' => 'Fepuari',
+'march-gen' => 'Mati',
+'april-gen' => 'Aperila',
+'may-gen' => 'Me',
+'june-gen' => 'Iuni',
+'july-gen' => 'Iulai',
+'august-gen' => 'Aokuso',
 'september-gen' => 'Setema',
-'october-gen'   => 'Oketopa',
-'november-gen'  => 'Novema',
-'december-gen'  => 'Tesema',
-'jan'           => 'Ianuari',
-'feb'           => 'Fepuari',
-'mar'           => 'Mati',
-'apr'           => 'Aperila',
-'may'           => 'Me',
-'jun'           => 'Iuni',
-'jul'           => 'Iulai',
-'aug'           => 'Aokuso',
-'sep'           => 'Setema',
-'oct'           => 'Oketopa',
-'nov'           => 'Novema',
-'dec'           => 'Tesema',
-
-'cancel'     => 'Toe tape',
-'mytalk'     => "La'u talanoa",
+'october-gen' => 'Oketopa',
+'november-gen' => 'Novema',
+'december-gen' => 'Tesema',
+'jan' => 'Ianuari',
+'feb' => 'Fepuari',
+'mar' => 'Mati',
+'apr' => 'Aperila',
+'may' => 'Me',
+'jun' => 'Iuni',
+'jul' => 'Iulai',
+'aug' => 'Aokuso',
+'sep' => 'Setema',
+'oct' => 'Oketopa',
+'nov' => 'Novema',
+'dec' => 'Tesema',
+
+'cancel' => 'Toe tape',
+'mytalk' => "La'u talanoa",
 'navigation' => 'Ulifolau',
 
-'help'             => 'Fesoasoani',
-'search'           => "Su'e",
-'searchbutton'     => "Su'e",
-'go'               => 'Alu',
-'searcharticle'    => 'Alu',
-'history_short'    => "Tala fa'asolopito",
+'help' => 'Fesoasoani',
+'search' => "Su'e",
+'searchbutton' => "Su'e",
+'go' => 'Alu',
+'searcharticle' => 'Alu',
+'history_short' => "Tala fa'asolopito",
 'printableversion' => 'Kopi e lolomi',
-'permalink'        => "So'otaga tumau",
-'print'            => 'Lolomi',
-'edit'             => 'Teuteu',
-'delete'           => 'Tape',
-'protect'          => 'Puipui',
-'unprotect'        => "'Aua le Puipuia",
-'specialpage'      => "Itulau fa'apitoa",
-'talk'             => 'Talanoaga',
-'toolbox'          => 'Meafaigaluega',
-'otherlanguages'   => 'I isi gagana',
+'permalink' => "So'otaga tumau",
+'print' => 'Lolomi',
+'edit' => 'Teuteu',
+'delete' => 'Tape',
+'protect' => 'Puipui',
+'unprotect' => "'Aua le Puipuia",
+'specialpage' => "Itulau fa'apitoa",
+'talk' => 'Talanoaga',
+'toolbox' => 'Meafaigaluega',
+'otherlanguages' => 'I isi gagana',
 'jumptonavigation' => 'Ulifolau',
-'jumptosearch'     => "Su'e",
+'jumptosearch' => "Su'e",
 
 # 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).
-'currentevents'        => 'Tala Fou',
-'currentevents-url'    => 'Project:Tala Fou',
-'edithelp'             => 'Fesoasoani e teuteu',
-'mainpage'             => 'Itulau Muamua',
+'currentevents' => 'Tala Fou',
+'currentevents-url' => 'Project:Tala Fou',
+'edithelp' => 'Fesoasoani e teuteu',
+'mainpage' => 'Itulau Muamua',
 'mainpage-description' => 'Itulau Muamua',
-'portal'               => 'Vaega mo Tagata Lautele',
-'portal-url'           => 'Project:Vaega mo Tagata Lautele',
+'portal' => 'Vaega mo Tagata Lautele',
+'portal-url' => 'Project:Vaega mo Tagata Lautele',
 
-'youhavenewmessages'      => "'Ua iai lau $1 ($2).",
-'newmessageslink'         => "Poloa'i fou",
+'youhavenewmessages' => "'Ua iai lau $1 ($2).",
+'newmessageslink' => "Poloa'i fou",
 'youhavenewmessagesmulti' => "'Ua iai au fe'au fou i le $1",
-'editsection'             => 'Teuteu',
-'editold'                 => 'Teuteu',
+'editsection' => 'Teuteu',
+'editold' => 'Teuteu',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Tusitusiga',
-'nstab-user'      => "Itulau a 'oe",
+'nstab-main' => 'Tusitusiga',
+'nstab-user' => "Itulau a 'oe",
 'nstab-mediawiki' => "Fe'au",
 
 # Login and logout pages
-'yourname'          => "Igoa o le tagata fa'aaoga",
-'yourpassword'      => "'Upu ulufale",
+'yourname' => "Igoa o le tagata fa'aaoga",
+'yourpassword' => "'Upu ulufale",
 'yourpasswordagain' => "Toe lolomi 'upu ulufale",
-'login'             => "Fa'aola",
-'userlogin'         => "Fa'aola / Lesitala le ulufale",
-'logout'            => 'Tape',
-'userlogout'        => 'Tape',
-'notloggedin'       => "Le'i fa'aolaina",
-'nologinlink'       => 'Lesitala le ulufale',
-'createaccount'     => 'Lesitala le ulufale',
-'gotaccountlink'    => "Fa'aola",
+'login' => "Fa'aola",
+'userlogin' => "Fa'aola / Lesitala le ulufale",
+'logout' => 'Tape',
+'userlogout' => 'Tape',
+'notloggedin' => "Le'i fa'aolaina",
+'nologinlink' => 'Lesitala le ulufale',
+'createaccount' => 'Lesitala le ulufale',
+'gotaccountlink' => "Fa'aola",
 
 # Edit pages
-'summary'      => "'Oto'otoga:",
-'minoredit'    => "'O se teuteuga la'itiiti lenei",
-'watchthis'    => 'Matau lenei itulau',
-'savearticle'  => 'Sefe le itulau',
-'showpreview'  => "Fa'aali teuteuga",
-'showdiff'     => "Fa'aali suiga",
+'summary' => "'Oto'otoga:",
+'minoredit' => "'O se teuteuga la'itiiti lenei",
+'watchthis' => 'Matau lenei itulau',
+'savearticle' => 'Sefe le itulau',
+'showpreview' => "Fa'aali teuteuga",
+'showdiff' => "Fa'aali suiga",
 'loginreqlink' => "Fa'aola",
 
 # Search results
 'powersearch' => "Su'e",
 
 # Preferences page
-'mypreferences'     => "Mea 'ou te fiafia i ai",
+'mypreferences' => "Mea 'ou te fiafia i ai",
 'searchresultshead' => "Su'e",
-'youremail'         => "'Imeli:",
-'username'          => "Igoa o le tagata fa'aaoga:",
-'email'             => "'Imeli",
+'youremail' => "'Imeli:",
+'username' => "Igoa o le tagata fa'aaoga:",
+'email' => "'Imeli",
 
 # Groups
 'group-all' => "(mea 'uma)",
 
 # Recent changes
 'recentchanges' => 'Suiga talu ai nei',
-'hist'          => "Tala fa'asolopito",
+'hist' => "Tala fa'asolopito",
 
 # Recent changes linked
 'recentchangeslinked' => "Suiga e a'afia ai",
 
 # Upload
-'upload'            => "Si'i mai le faila",
-'uploadbtn'         => "Si'i mai le faila",
-'uploadnologin'     => "Le'i fa'aolaina",
-'filedesc'          => "'Oto'otoga",
+'upload' => "Si'i mai le faila",
+'uploadbtn' => "Si'i mai le faila",
+'uploadnologin' => "Le'i fa'aolaina",
+'filedesc' => "'Oto'otoga",
 'fileuploadsummary' => "'Oto'otoga:",
-'watchthisupload'   => 'Matau lenei itulau',
+'watchthisupload' => 'Matau lenei itulau',
 
 # Random page
 'randompage' => "Itulau le fa'ailogaina",
 
 # Miscellaneous special pages
 'newpages-username' => "Igoa o le tagata fa'aaoga:",
-'move'              => "Si'itia",
+'move' => "Si'itia",
 
 # Book sources
 'booksources-go' => 'Alu',
@@ -168,13 +168,13 @@ $messages = array(
 'allpagessubmit' => 'Alu',
 
 # E-mail user
-'emailuser'    => "'Imeli mai le tagata lenei",
+'emailuser' => "'Imeli mai le tagata lenei",
 'emailmessage' => "Fe'au",
 
 # Watchlist
-'watchlist'     => "Lo'u lisi va'ava'aia",
-'watchnologin'  => "Le'i fa'aolaina",
-'watch'         => "Va'ai",
+'watchlist' => "Lo'u lisi va'ava'aia",
+'watchnologin' => "Le'i fa'aolaina",
+'watch' => "Va'ai",
 'watchthispage' => 'Matau lenei itulau',
 
 # Restrictions (nouns)
@@ -185,7 +185,7 @@ $messages = array(
 
 # Contributions
 'contributions' => "Sao a tagata fa'aaoga",
-'mycontris'     => "'O la'u saoga",
+'mycontris' => "'O la'u saoga",
 
 # What links here
 'whatlinkshere' => "Nofoaga e soso'o mai",
@@ -195,13 +195,13 @@ $messages = array(
 
 # Move page
 'move-page-legend' => "Si'i le itulau",
-'movearticle'      => "Si'i le itulau",
-'movenologin'      => "Le'i fa'aolaina",
-'newtitle'         => "'I le ulutala fou",
-'move-watch'       => 'Matau lenei itulau',
-'movepagebtn'      => "Si'i le itulau",
-'movetalk'         => 'Sui le itulau e tau i ai',
-'movereason'       => "Mafua'aga",
+'movearticle' => "Si'i le itulau",
+'movenologin' => "Le'i fa'aolaina",
+'newtitle' => "'I le ulutala fou",
+'move-watch' => 'Matau lenei itulau',
+'movepagebtn' => "Si'i le itulau",
+'movetalk' => 'Sui le itulau e tau i ai',
+'movereason' => "Mafua'aga",
 
 # Namespace 8 related
 'allmessagesname' => 'Igoa',
index d59a94d..13ebdf5 100644 (file)
 $messages = array(
 # User preference toggles
 'tog-showtoolbar' => 'Dïrregesïeve vuesehth (JavaScript)',
-'tog-fancysig'    => 'Saajpe singnatuvreh (namhtah jïjtsistie lïenghke)',
+'tog-fancysig' => 'Saajpe singnatuvreh (namhtah jïjtsistie lïenghke)',
 
 'underline-always' => 'Iktesth',
-'underline-never'  => 'Aaltere',
+'underline-never' => 'Aaltere',
 
 # Dates
-'sunday'        => 'Aejlege',
-'monday'        => 'Måanta',
-'tuesday'       => 'Däjsta',
-'wednesday'     => 'Gaske-våhkoe',
-'thursday'      => 'Dåarsta',
-'friday'        => 'Bearjedh',
-'saturday'      => 'Laavadahke',
-'sun'           => 'Aej',
-'mon'           => 'Måa',
-'tue'           => 'Däj',
-'wed'           => 'Gas',
-'thu'           => 'Dåa',
-'fri'           => 'Bea',
-'sat'           => 'Laa',
-'january'       => 'tsiengele',
-'february'      => 'goevte',
-'march'         => 'njoktje',
-'april'         => 'Voerhtje',
-'may_long'      => 'Suehpede',
-'june'          => 'Ruffie',
-'july'          => 'Snjaltje',
-'august'        => 'Mïetske',
-'september'     => 'Gaekere',
-'october'       => 'Golke',
-'november'      => 'Rahka',
-'december'      => 'Goeve',
-'january-gen'   => 'Tsiengele',
-'february-gen'  => 'Goevte',
-'march-gen'     => 'Njoktje',
-'april-gen'     => 'Voerhtje',
-'may-gen'       => 'Suehpede',
-'june-gen'      => 'Ruffie',
-'july-gen'      => 'Snjaltje',
-'august-gen'    => 'Mïetske',
+'sunday' => 'Aejlege',
+'monday' => 'Måanta',
+'tuesday' => 'Däjsta',
+'wednesday' => 'Gaske-våhkoe',
+'thursday' => 'Dåarsta',
+'friday' => 'Bearjedh',
+'saturday' => 'Laavadahke',
+'sun' => 'Aej',
+'mon' => 'Måa',
+'tue' => 'Däj',
+'wed' => 'Gas',
+'thu' => 'Dåa',
+'fri' => 'Bea',
+'sat' => 'Laa',
+'january' => 'tsiengele',
+'february' => 'goevte',
+'march' => 'njoktje',
+'april' => 'Voerhtje',
+'may_long' => 'Suehpede',
+'june' => 'Ruffie',
+'july' => 'Snjaltje',
+'august' => 'Mïetske',
+'september' => 'Gaekere',
+'october' => 'Golke',
+'november' => 'Rahka',
+'december' => 'Goeve',
+'january-gen' => 'Tsiengele',
+'february-gen' => 'Goevte',
+'march-gen' => 'Njoktje',
+'april-gen' => 'Voerhtje',
+'may-gen' => 'Suehpede',
+'june-gen' => 'Ruffie',
+'july-gen' => 'Snjaltje',
+'august-gen' => 'Mïetske',
 'september-gen' => 'Gaekere',
-'october-gen'   => 'Golke',
-'november-gen'  => 'Rahka',
-'december-gen'  => 'Goeve',
-'jan'           => 'Tsi',
-'feb'           => 'Goe',
-'mar'           => 'Njo',
-'apr'           => 'Voe',
-'may'           => 'Sue',
-'jun'           => 'Ruf',
-'jul'           => 'Snj',
-'aug'           => 'Mïe',
-'sep'           => 'Gae',
-'oct'           => 'Gol',
-'nov'           => 'Rah',
-'dec'           => 'Goe',
+'october-gen' => 'Golke',
+'november-gen' => 'Rahka',
+'december-gen' => 'Goeve',
+'jan' => 'Tsi',
+'feb' => 'Goe',
+'mar' => 'Njo',
+'apr' => 'Voe',
+'may' => 'Sue',
+'jun' => 'Ruf',
+'jul' => 'Snj',
+'aug' => 'Mïe',
+'sep' => 'Gae',
+'oct' => 'Gol',
+'nov' => 'Rah',
+'dec' => 'Goe',
 
 # Categories related messages
-'pagecategories'         => '{{PLURAL:$1|Kategorije|Kategorijeh}}',
-'category_header'        => 'Bielie sïjse kategorije "$1"',
-'subcategories'          => 'Subkategorijeh',
-'category-media-header'  => 'Guvvie sïjse karegorije "$1"',
-'category-empty'         => "''Dïhte kategorije sisvege ijje bielieh jallh baalkah.''",
+'pagecategories' => '{{PLURAL:$1|Kategorije|Kategorijeh}}',
+'category_header' => 'Bielie sïjse kategorije "$1"',
+'subcategories' => 'Subkategorijeh',
+'category-media-header' => 'Guvvie sïjse karegorije "$1"',
+'category-empty' => "''Dïhte kategorije sisvege ijje bielieh jallh baalkah.''",
 'listingcontinuesabbrev' => 'jåar.',
 
-'about'         => 'Bïjre',
-'article'       => 'Sisvege bielie',
-'newwindow'     => '(geehpehtidh sïjse orre klaase)',
-'cancel'        => 'Orrijidh',
+'about' => 'Bïjre',
+'article' => 'Sisvege bielie',
+'newwindow' => '(geehpehtidh sïjse orre klaase)',
+'cancel' => 'Orrijidh',
 'moredotdotdot' => 'Jienebe...',
-'mypage'        => 'Mov bielie',
-'mytalk'        => 'Mov dïjveldidh',
-'anontalk'      => 'Dïjveldidh ihke dïhte IP',
-'navigation'    => 'Navigasjovne',
-'and'           => '&#32;jih',
+'mypage' => 'Mov bielie',
+'mytalk' => 'Mov dïjveldidh',
+'anontalk' => 'Dïjveldidh ihke dïhte IP',
+'navigation' => 'Navigasjovne',
+'and' => '&#32;jih',
 
 # Cologne Blue skin
-'qbfind'         => 'Gaavnedh',
-'qbedit'         => 'Värrhtoedimmie',
-'qbpageoptions'  => 'Dïhte bielie',
-'qbmyoptions'    => 'Mov bielieh',
+'qbfind' => 'Gaavnedh',
+'qbedit' => 'Värrhtoedimmie',
+'qbpageoptions' => 'Dïhte bielie',
+'qbmyoptions' => 'Mov bielieh',
 'qbspecialpages' => 'Joekoelaakan bielieh',
-'faq'            => 'FAQ',
-'faqpage'        => 'Project:FAQ',
-
-'errorpagetitle'   => 'Båajhtode',
-'returnto'         => 'Bååstide gåajkoe $1.',
-'tagline'          => '{{SITENAME}}sta',
-'help'             => 'Viehkie',
-'search'           => 'Ohtsedh',
-'searchbutton'     => 'Ohtsedh',
-'go'               => 'Vaadtsa',
-'searcharticle'    => 'Vaadtsa',
-'history'          => 'Histovrije',
-'history_short'    => 'Histovrije',
+'faq' => 'FAQ',
+'faqpage' => 'Project:FAQ',
+
+'errorpagetitle' => 'Båajhtode',
+'returnto' => 'Bååstide gåajkoe $1.',
+'tagline' => '{{SITENAME}}sta',
+'help' => 'Viehkie',
+'search' => 'Ohtsedh',
+'searchbutton' => 'Ohtsedh',
+'go' => 'Vaadtsa',
+'searcharticle' => 'Vaadtsa',
+'history' => 'Histovrije',
+'history_short' => 'Histovrije',
 'printableversion' => 'Tjaelije bielie',
-'permalink'        => 'Permanente lïenghke',
-'print'            => 'Tjaeledh olkese',
-'edit'             => 'Sjiehtedh',
-'editthispage'     => 'Värrhtoedimmie dïhte bielie',
-'delete'           => 'Tjåegkedh',
-'protect'          => 'Vaarjelidh',
-'protectthispage'  => 'Vaarjelidh dïhte bielie',
-'newpage'          => 'Orre bielie',
-'talkpage'         => 'Dïjveldidh dïhte bielie',
+'permalink' => 'Permanente lïenghke',
+'print' => 'Tjaeledh olkese',
+'edit' => 'Sjiehtedh',
+'editthispage' => 'Värrhtoedimmie dïhte bielie',
+'delete' => 'Tjåegkedh',
+'protect' => 'Vaarjelidh',
+'protectthispage' => 'Vaarjelidh dïhte bielie',
+'newpage' => 'Orre bielie',
+'talkpage' => 'Dïjveldidh dïhte bielie',
 'talkpagelinktext' => 'Digkiedimmie',
-'specialpage'      => 'Joekoelaakan Bielie',
-'personaltools'    => 'Persjovne dïrregeh',
-'articlepage'      => 'Vuesehte artihkle bielie',
-'talk'             => 'Dïjveldeme',
-'views'            => 'Vuesehth',
-'toolbox'          => 'Dïrregeborhtje',
-'userpage'         => 'Vuesehte nuhtjienbielie',
-'projectpage'      => 'Vuesehte Wikipedijebielie',
-'imagepage'        => 'Vuesehte guvvie bielie',
-'templatepage'     => 'Vuesehte maale bielie',
-'viewhelppage'     => 'Vuesehte viehkie bielie',
-'categorypage'     => 'Vuesehte kategorije bielie',
-'viewtalkpage'     => 'Vuesehte dïjveldidh',
-'otherlanguages'   => 'jeatjebh gïele',
-'redirectedfrom'   => '(Bïjre-dirisjovne raejeste $1)',
-'redirectpagesub'  => 'Bïjre-dirisjovne bielie',
-'protectedpage'    => 'Vaarjelidh bielie',
-'jumpto'           => 'Vaadtsa gåajkoe:',
+'specialpage' => 'Joekoelaakan Bielie',
+'personaltools' => 'Persjovne dïrregeh',
+'articlepage' => 'Vuesehte artihkle bielie',
+'talk' => 'Dïjveldeme',
+'views' => 'Vuesehth',
+'toolbox' => 'Dïrregeborhtje',
+'userpage' => 'Vuesehte nuhtjienbielie',
+'projectpage' => 'Vuesehte Wikipedijebielie',
+'imagepage' => 'Vuesehte guvvie bielie',
+'templatepage' => 'Vuesehte maale bielie',
+'viewhelppage' => 'Vuesehte viehkie bielie',
+'categorypage' => 'Vuesehte kategorije bielie',
+'viewtalkpage' => 'Vuesehte dïjveldidh',
+'otherlanguages' => 'jeatjebh gïele',
+'redirectedfrom' => '(Bïjre-dirisjovne raejeste $1)',
+'redirectpagesub' => 'Bïjre-dirisjovne bielie',
+'protectedpage' => 'Vaarjelidh bielie',
+'jumpto' => 'Vaadtsa gåajkoe:',
 'jumptonavigation' => 'navigasjovne',
-'jumptosearch'     => 'ohtsedh',
+'jumptosearch' => 'ohtsedh',
 
 # 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}}en bïjre',
-'aboutpage'            => 'Project:Bïjre',
-'copyrightpage'        => '{{ns:project}}:Bäjjesereaktah',
-'currentevents'        => 'Daaletje deahpadimmieh',
-'currentevents-url'    => 'Project:Daaletje deahpadimmieh',
-'disclaimers'          => 'Friijavuohte vastideamis',
-'disclaimerpage'       => 'Project:Bäjjesereaktah',
-'edithelp'             => 'Sjiehtedimmie viehkie',
-'edithelppage'         => 'Help:Sjiehtedimmie',
-'helppage'             => 'Help:Sisvege',
-'mainpage'             => 'Aalkoebielie',
+'aboutsite' => '{{SITENAME}}en bïjre',
+'aboutpage' => 'Project:Bïjre',
+'copyrightpage' => '{{ns:project}}:Bäjjesereaktah',
+'currentevents' => 'Daaletje deahpadimmieh',
+'currentevents-url' => 'Project:Daaletje deahpadimmieh',
+'disclaimers' => 'Friijavuohte vastideamis',
+'disclaimerpage' => 'Project:Bäjjesereaktah',
+'edithelp' => 'Sjiehtedimmie viehkie',
+'edithelppage' => 'Help:Sjiehtedimmie',
+'helppage' => 'Help:Sisvege',
+'mainpage' => 'Aalkoebielie',
 'mainpage-description' => 'Aalkoebielie',
-'portal'               => 'Meatan portaale',
-'portal-url'           => 'Project:Meatan portaale',
-'privacy'              => 'Privaate pålisy',
-'privacypage'          => 'Project:Privaate pålisy',
-
-'retrievedfrom'       => 'Raejeste "$1" vïedtjeme',
-'youhavenewmessages'  => 'Datne åtna $1 ($2).',
-'newmessageslink'     => 'orre bïjre',
+'portal' => 'Meatan portaale',
+'portal-url' => 'Project:Meatan portaale',
+'privacy' => 'Privaate pålisy',
+'privacypage' => 'Project:Privaate pålisy',
+
+'retrievedfrom' => 'Raejeste "$1" vïedtjeme',
+'youhavenewmessages' => 'Datne åtna $1 ($2).',
+'newmessageslink' => 'orre bïjre',
 'newmessagesdifflink' => 'minngemes värrhtoedimmie',
-'editsection'         => 'sjïehtedh',
-'editold'             => 'värrhtoedimmie',
-'editsectionhint'     => 'Sektiovne sjiehtedh: $1',
-'toc'                 => 'Sisvege',
-'showtoc'             => 'vuesehte',
-'hidetoc'             => 'gaptjedh',
-'viewdeleted'         => 'Vuesehte $1?',
-'site-rss-feed'       => '$1 RSS Feed',
-'site-atom-feed'      => '$1 Atom Feed',
-'page-rss-feed'       => '"$1" RSS Feed',
-'page-atom-feed'      => '"$1" Atom Feed',
+'editsection' => 'sjïehtedh',
+'editold' => 'värrhtoedimmie',
+'editsectionhint' => 'Sektiovne sjiehtedh: $1',
+'toc' => 'Sisvege',
+'showtoc' => 'vuesehte',
+'hidetoc' => 'gaptjedh',
+'viewdeleted' => 'Vuesehte $1?',
+'site-rss-feed' => '$1 RSS Feed',
+'site-atom-feed' => '$1 Atom Feed',
+'page-rss-feed' => '"$1" RSS Feed',
+'page-atom-feed' => '"$1" Atom Feed',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Bielie',
-'nstab-user'      => 'Nuhtjien bielie',
-'nstab-media'     => 'Guvvie',
-'nstab-special'   => 'Joekoelaakan',
-'nstab-project'   => 'Prosjekte bielie',
-'nstab-image'     => 'Baalka',
+'nstab-main' => 'Bielie',
+'nstab-user' => 'Nuhtjien bielie',
+'nstab-media' => 'Guvvie',
+'nstab-special' => 'Joekoelaakan',
+'nstab-project' => 'Prosjekte bielie',
+'nstab-image' => 'Baalka',
 'nstab-mediawiki' => 'MediaWiki',
-'nstab-template'  => 'Maale',
-'nstab-help'      => 'Viehke bielie',
-'nstab-category'  => 'Kategorije',
+'nstab-template' => 'Maale',
+'nstab-help' => 'Viehke bielie',
+'nstab-category' => 'Kategorije',
 
 # General errors
-'error'              => 'Båajhtode',
-'databaseerror'      => 'Daatabaase båajhtode',
-'readonly'           => 'Daatabaase steegkeldahkesne',
-'internalerror'      => 'Sjisjnjie båajhtede',
+'error' => 'Båajhtode',
+'databaseerror' => 'Daatabaase båajhtode',
+'readonly' => 'Daatabaase steegkeldahkesne',
+'internalerror' => 'Sjisjnjie båajhtede',
 'internalerror_info' => 'Sjisjnjie båajhtede: $1',
-'badtitle'           => 'Gååre nomme',
-'badtitletext'       => 'Dïhte bielietiitele lea nov sån ijje luhpede, bielie lea gåaroes, jallh lea bielie gåarhmede lïenghke gåajkoe.',
-'viewsource'         => 'Vuesehte tjaalege',
-'viewsourcetext'     => 'Dov dorje vuesehte jih kåpieerae gaaltjie dejstie dïhte bielie:',
+'badtitle' => 'Gååre nomme',
+'badtitletext' => 'Dïhte bielietiitele lea nov sån ijje luhpede, bielie lea gåaroes, jallh lea bielie gåarhmede lïenghke gåajkoe.',
+'viewsource' => 'Vuesehte tjaalege',
+'viewsourcetext' => 'Dov dorje vuesehte jih kåpieerae gaaltjie dejstie dïhte bielie:',
 
 # Login and logout pages
-'yourname'                => 'Nuhtjiennomme:',
-'yourpassword'            => 'Loevesbaakoe:',
-'remembermypassword'      => 'Måjhtije mov loggesïjse nille dïhte daatovre (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'yourdomainname'          => 'Dov domäne:',
-'login'                   => 'Logge sïjse',
+'yourname' => 'Nuhtjiennomme:',
+'yourpassword' => 'Loevesbaakoe:',
+'remembermypassword' => 'Måjhtije mov loggesïjse nille dïhte daatovre (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'yourdomainname' => 'Dov domäne:',
+'login' => 'Logge sïjse',
 'nav-login-createaccount' => 'Logge sïjse / skaepede nuhtjien',
-'loginprompt'             => 'Dov galkedh luhpede cookies ihke logge sïjse nille {{SITENAME}}.',
-'userlogin'               => 'Logge sïjse / skaepede nuhtjien',
-'logout'                  => 'Logge olkese',
-'userlogout'              => 'Logge ålkone',
-'nologin'                 => "Lea dov ijje registreered? '''$1'''.",
-'nologinlink'             => 'Skaepede nuhtjien',
-'createaccount'           => 'Skaepede nuhtjien',
-'gotaccount'              => "Åtna dov joe nuhtjiennomme? '''$1'''.",
-'gotaccountlink'          => 'Logge sïjse',
-'createaccountmail'       => 'meatan e-påaste',
-'loginerror'              => 'Logge sïjse båajhtode',
-'loginsuccesstitle'       => 'Dov lea daelie sïjse logge',
-'loginsuccess'            => "'''Dov lea daelie sïjselogge nille {{SITENAME}} goh \"\$1\".'''",
-'nosuchuser'              => 'Dïhte gååvnese ijje nuhtjien goh nomme "$1". Gïehtjedidh dov baakoehtidh, jallh skaepede orre nuhtjien.',
-'nosuchusershort'         => 'Dïhte gååvnese ijje nuhtjien goh nomme "$1". Gïehtjedidh baakoehtidh.',
-'nouserspecified'         => 'Dov galkedh tjaeledh nuhtjiennomme.',
-'wrongpassword'           => 'Loevesbaakoe lea gåarhmede. Vuejnedh vihth.',
-'wrongpasswordempty'      => 'Loevesbaakoe lea gåaroes. Vuejnedh vihth.',
-'passwordtooshort'        => 'Dov loevesbaakoe lea ov-jiltighe jallh ihke åenehks. Dïhte galkedh åtna unnemes $1 vähta jih sjädta jeatjebe raejeste dov nuhtjiennomme.',
-'mailmypassword'          => 'E-påaste loevesbaakoe',
-'passwordremindertitle'   => 'Orre loevesbaakoe ihke {{SITENAME}}',
-'noemail'                 => 'Dïhte lea ijje e-påaste tjaalesijjie registreeredh ihke nuhtjien "$1".',
-'passwordsent'            => 'Orre loevesbaakoe åtna sjädta seedtie gåajkoe e-påaste tjaalesijjie
+'loginprompt' => 'Dov galkedh luhpede cookies ihke logge sïjse nille {{SITENAME}}.',
+'userlogin' => 'Logge sïjse / skaepede nuhtjien',
+'logout' => 'Logge olkese',
+'userlogout' => 'Logge ålkone',
+'nologin' => "Lea dov ijje registreered? '''$1'''.",
+'nologinlink' => 'Skaepede nuhtjien',
+'createaccount' => 'Skaepede nuhtjien',
+'gotaccount' => "Åtna dov joe nuhtjiennomme? '''$1'''.",
+'gotaccountlink' => 'Logge sïjse',
+'createaccountmail' => 'meatan e-påaste',
+'loginerror' => 'Logge sïjse båajhtode',
+'loginsuccesstitle' => 'Dov lea daelie sïjse logge',
+'loginsuccess' => "'''Dov lea daelie sïjselogge nille {{SITENAME}} goh \"\$1\".'''",
+'nosuchuser' => 'Dïhte gååvnese ijje nuhtjien goh nomme "$1". Gïehtjedidh dov baakoehtidh, jallh skaepede orre nuhtjien.',
+'nosuchusershort' => 'Dïhte gååvnese ijje nuhtjien goh nomme "$1". Gïehtjedidh baakoehtidh.',
+'nouserspecified' => 'Dov galkedh tjaeledh nuhtjiennomme.',
+'wrongpassword' => 'Loevesbaakoe lea gåarhmede. Vuejnedh vihth.',
+'wrongpasswordempty' => 'Loevesbaakoe lea gåaroes. Vuejnedh vihth.',
+'passwordtooshort' => 'Dov loevesbaakoe lea ov-jiltighe jallh ihke åenehks. Dïhte galkedh åtna unnemes $1 vähta jih sjädta jeatjebe raejeste dov nuhtjiennomme.',
+'mailmypassword' => 'E-påaste loevesbaakoe',
+'passwordremindertitle' => 'Orre loevesbaakoe ihke {{SITENAME}}',
+'noemail' => 'Dïhte lea ijje e-påaste tjaalesijjie registreeredh ihke nuhtjien "$1".',
+'passwordsent' => 'Orre loevesbaakoe åtna sjädta seedtie gåajkoe e-påaste tjaalesijjie
 registreered ihke "$1".
 Gïemhpes logge sïjse vihth männgan datne åtna låhka dïhte.',
-'accountcreated'          => 'Nuhtjien skaepede',
-'loginlanguagelabel'      => 'Gïele: $1',
+'accountcreated' => 'Nuhtjien skaepede',
+'loginlanguagelabel' => 'Gïele: $1',
 
 # Change password dialog
 'oldpassword' => 'Båeries loevesbaakoe:',
 'newpassword' => 'Orre loevesbaakoe:',
-'retypenew'   => 'Odhasit orre loevesbaakoe:',
+'retypenew' => 'Odhasit orre loevesbaakoe:',
 
 # Edit page toolbar
-'bold_sample'     => 'Buajtehks tjaalege',
-'bold_tip'        => 'Buajtehks tjaalege',
-'italic_sample'   => 'Kursiive tjaalege',
-'italic_tip'      => 'Kursiive tjaalege',
-'link_sample'     => 'Lïenghke tiitele',
-'link_tip'        => 'Sjisjnjie lïenghke',
-'extlink_sample'  => 'http://www.example.com lïenghke tiitele',
-'extlink_tip'     => 'Ehkstäärne lïenghke (måjhtajidh http:// prefihkse)',
+'bold_sample' => 'Buajtehks tjaalege',
+'bold_tip' => 'Buajtehks tjaalege',
+'italic_sample' => 'Kursiive tjaalege',
+'italic_tip' => 'Kursiive tjaalege',
+'link_sample' => 'Lïenghke tiitele',
+'link_tip' => 'Sjisjnjie lïenghke',
+'extlink_sample' => 'http://www.example.com lïenghke tiitele',
+'extlink_tip' => 'Ehkstäärne lïenghke (måjhtajidh http:// prefihkse)',
 'headline_sample' => 'Rubriike tjaalege',
-'headline_tip'    => 'Daltese 2 rubriike',
-'nowiki_sample'   => 'Bïejedh ijje-hammode tjaalege daesnie',
-'nowiki_tip'      => 'Rievdde wikïhammode',
-'image_tip'       => 'Lååtje guvvie',
-'media_tip'       => 'Meedia baalka lïenghke',
-'sig_tip'         => 'Dov signatuvre meatan tïjjestäämpele',
-'hr_tip'          => 'Horisontele sïeve (nuhtjie bïhteles-laakan)',
+'headline_tip' => 'Daltese 2 rubriike',
+'nowiki_sample' => 'Bïejedh ijje-hammode tjaalege daesnie',
+'nowiki_tip' => 'Rievdde wikïhammode',
+'image_tip' => 'Lååtje guvvie',
+'media_tip' => 'Meedia baalka lïenghke',
+'sig_tip' => 'Dov signatuvre meatan tïjjestäämpele',
+'hr_tip' => 'Horisontele sïeve (nuhtjie bïhteles-laakan)',
 
 # Edit pages
-'summary'                => 'Tjohkehtehteme:',
-'subject'                => 'Ïebne/rubriike:',
-'minoredit'              => 'Dïhte lea ohtje värrhtoedimmie',
-'watchthis'              => 'Sïektjedh dïhte bielie',
-'savearticle'            => 'Spååredh bielie',
-'preview'                => 'Åvte-vuesiehtidh',
-'showpreview'            => 'Vuesehte åvte-vuesiehtidh',
-'showdiff'               => 'Vuesehte värrhtoedimmie',
-'anoneditwarning'        => "'''Vaaroehtidh:''' Dov lea ijje logge sïjse. Dov IP tjaalesijjie båetedh spååredh sïjse dïhte bielie värrhtoedimmie histovrije.",
-'summary-preview'        => 'Tjohkehtehteme åvte-vuesiehtidh:',
-'loginreqlink'           => 'logge sïjse',
-'loginreqpagetext'       => 'Dov galkedh $1 ihke vuesehte jeatjebh bielieh.',
-'accmailtitle'           => 'Loevesbaakoe seedtie.',
-'accmailtext'            => 'Loevesbaakoe ihke ”$1” utnedh seedtedh gåajkoe $2.',
-'newarticle'             => '(Orre)',
-'noarticletext'          => 'Dïhte lea daelie ijje tjaalege sïjse dïhte bielie, dov dorje [[Special:Search/{{PAGENAME}}|ohtsedh ihke dïhte bielie nomme]] sïjse jeatjebh bielieh jallh [{{fullurl:{{FULLPAGENAME}}|action=edit}} värrhtoedimmie dïhte bielie].',
-'usercssyoucanpreview'   => "'''Tiipse:''' Nuhtjie 'Vuesehte åvte-vuesiehtidh' båaloe ihke pryövoe dov orre CSS åvte spååredh.",
-'userjsyoucanpreview'    => "'''Tiipse:''' Nuhtjie 'Vuesehte åvte-vuesiehtidh' båaloe ihke pryövoe dov orre JS åvte spååredh.",
-'updated'                => '(Orrestahteme)',
-'note'                   => "'''Galtege:'''",
-'previewnote'            => "'''Dïhte lea aktegh åvte-vuesiehtidh; värrhtoedimmieh ånta ijje sjïdtedh spååredh!'''",
-'editing'                => 'Sjiehtedimmie $1',
-'editingsection'         => 'Värrhtoedimmie $1 (sektiovne)',
-'yourtext'               => 'Dov tjaalege',
-'copyrightwarning'       => "Tjaeleste gaajhke värrhtoedimmieh gåajkoe {{SITENAME}} lea ahte gïehtjele goh maam buektedh nuelesne $2 (vuajna $1 ihke detaaljeh). Bïjre datne ijje sïjhtedh dov tjaalege galka värrhtoedimmieh jallh kåpieeres minngesne jeatjebh daerpies voete, galka datne ijje tjaala daesnie.<br />
+'summary' => 'Tjohkehtehteme:',
+'subject' => 'Ïebne/rubriike:',
+'minoredit' => 'Dïhte lea ohtje värrhtoedimmie',
+'watchthis' => 'Sïektjedh dïhte bielie',
+'savearticle' => 'Spååredh bielie',
+'preview' => 'Åvte-vuesiehtidh',
+'showpreview' => 'Vuesehte åvte-vuesiehtidh',
+'showdiff' => 'Vuesehte värrhtoedimmie',
+'anoneditwarning' => "'''Vaaroehtidh:''' Dov lea ijje logge sïjse. Dov IP tjaalesijjie båetedh spååredh sïjse dïhte bielie värrhtoedimmie histovrije.",
+'summary-preview' => 'Tjohkehtehteme åvte-vuesiehtidh:',
+'loginreqlink' => 'logge sïjse',
+'loginreqpagetext' => 'Dov galkedh $1 ihke vuesehte jeatjebh bielieh.',
+'accmailtitle' => 'Loevesbaakoe seedtie.',
+'accmailtext' => 'Loevesbaakoe ihke ”$1” utnedh seedtedh gåajkoe $2.',
+'newarticle' => '(Orre)',
+'noarticletext' => 'Dïhte lea daelie ijje tjaalege sïjse dïhte bielie, dov dorje [[Special:Search/{{PAGENAME}}|ohtsedh ihke dïhte bielie nomme]] sïjse jeatjebh bielieh jallh [{{fullurl:{{FULLPAGENAME}}|action=edit}} värrhtoedimmie dïhte bielie].',
+'usercssyoucanpreview' => "'''Tiipse:''' Nuhtjie 'Vuesehte åvte-vuesiehtidh' båaloe ihke pryövoe dov orre CSS åvte spååredh.",
+'userjsyoucanpreview' => "'''Tiipse:''' Nuhtjie 'Vuesehte åvte-vuesiehtidh' båaloe ihke pryövoe dov orre JS åvte spååredh.",
+'updated' => '(Orrestahteme)',
+'note' => "'''Galtege:'''",
+'previewnote' => "'''Dïhte lea aktegh åvte-vuesiehtidh; värrhtoedimmieh ånta ijje sjïdtedh spååredh!'''",
+'editing' => 'Sjiehtedimmie $1',
+'editingsection' => 'Värrhtoedimmie $1 (sektiovne)',
+'yourtext' => 'Dov tjaalege',
+'copyrightwarning' => "Tjaeleste gaajhke värrhtoedimmieh gåajkoe {{SITENAME}} lea ahte gïehtjele goh maam buektedh nuelesne $2 (vuajna $1 ihke detaaljeh). Bïjre datne ijje sïjhtedh dov tjaalege galka värrhtoedimmieh jallh kåpieeres minngesne jeatjebh daerpies voete, galka datne ijje tjaala daesnie.<br />
 Datne luhpede mijjieh aaj datne tjaala tjaalege jïjtje, jallh kåpieeret raejeste gaaltjie goh ijje vaarjele dejstie bäjjesereaktah, jallh plïerehke.<br />
 '''LISSEHTE IJJE OLKESE BÄJJESEREAKTAHVAARJELE ÏEBNE NAMHTAH LUHPIE!'''",
-'templatesused'          => '{{PLURAL:$1|Maal|Maler}}Maaleh nuhtjie nille dïhte bielie:',
-'templatesusedpreview'   => '{{PLURAL:$1|Maal|Maaleh}} nuhtjie sïjse dïhte åvte-vuesiehtidh:',
-'template-protected'     => '(vaarjeleme)',
+'templatesused' => '{{PLURAL:$1|Maal|Maler}}Maaleh nuhtjie nille dïhte bielie:',
+'templatesusedpreview' => '{{PLURAL:$1|Maal|Maaleh}} nuhtjie sïjse dïhte åvte-vuesiehtidh:',
+'template-protected' => '(vaarjeleme)',
 'template-semiprotected' => '(lehkie-vaarjelidh)',
-'nocreatetext'           => '{{SITENAME}} åtna gaertjiedidh nuepieh ahte skaepede orre bielieh.
+'nocreatetext' => '{{SITENAME}} åtna gaertjiedidh nuepieh ahte skaepede orre bielieh.
 Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge sïjse jallh skaepede nuhtjien]].',
 
 # History pages
-'viewpagelogs'        => 'Vuesehte loggeh ihke dïhte bielie',
-'currentrev'          => 'Daaletje gïehtjedamme',
-'revisionasof'        => 'Gïehtjedamme ihke $1',
-'revision-info'       => 'Gïehtjedamme raejeste dïhte $1; $2',
-'previousrevision'    => '←Båarasåabpoe gïehtjedamme',
-'nextrevision'        => 'Minngebe gïehtjedamme→',
+'viewpagelogs' => 'Vuesehte loggeh ihke dïhte bielie',
+'currentrev' => 'Daaletje gïehtjedamme',
+'revisionasof' => 'Gïehtjedamme ihke $1',
+'revision-info' => 'Gïehtjedamme raejeste dïhte $1; $2',
+'previousrevision' => '←Båarasåabpoe gïehtjedamme',
+'nextrevision' => 'Minngebe gïehtjedamme→',
 'currentrevisionlink' => 'Daaletje gïehtjedamme',
-'cur'                 => 'daaletje',
-'next'                => 'minngebe',
-'last'                => 'minngemes',
-'page_first'          => 'voestegh',
-'page_last'           => 'minngemes',
-'histfirst'           => 'Aareh',
-'histlast'            => 'Minngemes',
-'historysize'         => '({{PLURAL:$1|1 byte|$1 byteh}})',
+'cur' => 'daaletje',
+'next' => 'minngebe',
+'last' => 'minngemes',
+'page_first' => 'voestegh',
+'page_last' => 'minngemes',
+'histfirst' => 'Aareh',
+'histlast' => 'Minngemes',
+'historysize' => '({{PLURAL:$1|1 byte|$1 byteh}})',
 
 # Revision feed
-'history-feed-title'          => 'Gïehtjedamme histovrije',
+'history-feed-title' => 'Gïehtjedamme histovrije',
 'history-feed-item-nocomment' => '$1 dïhte $2',
 
 # History merging
 'mergehistory-from' => 'Gaaltjie bielie:',
 
 # Diffs
-'history-title'           => 'Gïehtjedamme histovrije ihke "$1"',
-'difference'              => '(Joekehts gaskesne gïehtjedammeh)',
-'lineno'                  => 'Sïeve $1:',
+'history-title' => 'Gïehtjedamme histovrije ihke "$1"',
+'lineno' => 'Sïeve $1:',
 'compareselectedversions' => 'Mohtedidh veeljeme låhkoeh',
-'editundo'                => 'ov-darjodh',
-'diff-multi'              => '({{PLURAL:$1|Akte gaskese gïehtjedamme|$1 gaskese gïehtjedammeh}} vuesehte ijje.)',
+'editundo' => 'ov-darjodh',
+'diff-multi' => '({{PLURAL:$1|Akte gaskese gïehtjedamme|$1 gaskese gïehtjedammeh}} vuesehte ijje.)',
 
 # Search results
-'searchresults'    => 'Ohtsedh resultaateh',
+'searchresults' => 'Ohtsedh resultaateh',
 'searchresulttext' => 'Ihke jeenjebe bïevnesh bïjre ohtsedh {{SITENAME}}, vuejnedh [[{{MediaWiki:Helppage}}|{{int:help}}]].',
-'searchsubtitle'   => "Dov ohtsedh ihke '''[[:$1]]'''",
-'prevn'            => 'övtebe {{PLURAL:$1|$1}}',
-'nextn'            => 'minngeben {{PLURAL:$1|$1}}',
-'viewprevnext'     => 'Vuesehth ($1 {{int:pipe-separator}} $2) ($3)',
-'searchhelp-url'   => 'Help:Sisvege',
-'powersearch'      => 'Ohtsedh',
+'searchsubtitle' => "Dov ohtsedh ihke '''[[:$1]]'''",
+'prevn' => 'övtebe {{PLURAL:$1|$1}}',
+'nextn' => 'minngeben {{PLURAL:$1|$1}}',
+'viewprevnext' => 'Vuesehth ($1 {{int:pipe-separator}} $2) ($3)',
+'searchhelp-url' => 'Help:Sisvege',
+'powersearch' => 'Ohtsedh',
 
 # Preferences page
-'preferences'         => 'Sïjsestäälningeh',
-'mypreferences'       => 'Mov sïjsesäälningeh',
-'changepassword'      => 'Värrhtoedimmie loevesbaakoe',
-'skin-preview'        => 'Åvte-vuesiehtidh',
-'saveprefs'           => 'Spååredh',
-'searchresultshead'   => 'Ohtsedh',
-'timezonelegend'      => 'Tïjjedajve',
-'localtime'           => 'Byjrehks tïjje',
-'youremail'           => 'E-påaste:',
-'username'            => 'Nuhtjiennomme:',
-'uid'                 => 'Nuhtjien ID:',
-'yourrealname'        => 'Ov nomme:',
-'yourlanguage'        => 'Gïele:',
-'yournick'            => 'Nuhjiennomme:',
-'email'               => 'E-påaste',
+'preferences' => 'Sïjsestäälningeh',
+'mypreferences' => 'Mov sïjsesäälningeh',
+'changepassword' => 'Värrhtoedimmie loevesbaakoe',
+'skin-preview' => 'Åvte-vuesiehtidh',
+'saveprefs' => 'Spååredh',
+'searchresultshead' => 'Ohtsedh',
+'timezonelegend' => 'Tïjjedajve',
+'localtime' => 'Byjrehks tïjje',
+'youremail' => 'E-påaste:',
+'username' => 'Nuhtjiennomme:',
+'uid' => 'Nuhtjien ID:',
+'yourrealname' => 'Ov nomme:',
+'yourlanguage' => 'Gïele:',
+'yournick' => 'Nuhjiennomme:',
+'email' => 'E-påaste',
 'prefs-help-realname' => 'Ov nomme galkedh ijje tjaeledh. Bïjre datne veeljeme tjaeledh dov ov nomme, båetedh dïhte nuhtjie ihke tjaeledh dov barkoe.',
 
 # User rights
 'editinguser' => "Värrhtoedimmie nuhtjien '''[[User:$1|$1]]''' ([[User talk:$1|{{int:talkpagelinktext}}]] | [[Special:Contributions/$1|{{int:contribslink}}]])",
 
 # Groups
-'group'       => 'Tjïerte:',
-'group-bot'   => 'Jïjtjesvïhtjije',
+'group' => 'Tjïerte:',
+'group-bot' => 'Jïjtjesvïhtjije',
 'group-sysop' => 'Reeredh',
 
-'group-bot-member'   => 'Jïjtjesvïhtjije',
+'group-bot-member' => 'Jïjtjesvïhtjije',
 'group-sysop-member' => 'Reerien',
 
 'grouppage-sysop' => '{{ns:project}}:Reeredh',
@@ -370,84 +369,84 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge s
 'rightslog' => 'Nuhtjienreaktah logge',
 
 # Recent changes
-'nchanges'                       => '$1 {{PLURAL:$1|värrhtoedimmie|värrhtoedimmieh}}',
-'recentchanges'                  => 'Männgan värrhtoedimmieh',
+'nchanges' => '$1 {{PLURAL:$1|värrhtoedimmie|värrhtoedimmieh}}',
+'recentchanges' => 'Männgan värrhtoedimmieh',
 'recentchanges-feed-description' => 'Dåeriedidh männgan värrhtoedimmie sïjse wiki meatan dïhte feed.',
-'rcnote'                         => "Vuelen vuesehte {{PLURAL:$1|dïhte männgan värrhtoedimmie|dah männgan '''$1''' värrhtoedimmieh}} nuelesne dah {{PLURAL:$2|männgan biejjie|männgan '''$2''' biejjieh}}, ihke $5, $4.",
-'rcnotefrom'                     => "Vuelelen vuesehte dah männgan '''$1''' värrhtoedimmieh männgan '''$2'''.",
-'rclistfrom'                     => 'Vuesehte orre värrhtoedimmieh aelkedh raejeste $1',
-'rcshowhideminor'                => '$1 ohtje värrhtoedimmie',
-'rcshowhidebots'                 => '$1 jïjtjesvïhtjijeh',
-'rcshowhideliu'                  => '$1 värrhtoedimmie dejstie sïjselogge nuhtjienh',
-'rcshowhideanons'                => '$1 anonyyme nuhtjienh',
-'rcshowhidepatr'                 => '$1 dååhkasjehtedh värrhtoedimmieh',
-'rcshowhidemine'                 => '$1 mov värrhtoedimmieh',
-'rclinks'                        => 'Vuesehte männgan $1 värrhtoedimmieh nuelesne männgan $2 biejjieh<br />$3',
-'diff'                           => 'joekehts',
-'hist'                           => 'hist',
-'hide'                           => 'Gaptjedh',
-'show'                           => 'Vuesehte',
-'minoreditletter'                => 'u',
-'newpageletter'                  => 'O',
-'boteditletter'                  => 'j',
+'rcnote' => "Vuelen vuesehte {{PLURAL:$1|dïhte männgan värrhtoedimmie|dah männgan '''$1''' värrhtoedimmieh}} nuelesne dah {{PLURAL:$2|männgan biejjie|männgan '''$2''' biejjieh}}, ihke $5, $4.",
+'rcnotefrom' => "Vuelelen vuesehte dah männgan '''$1''' värrhtoedimmieh männgan '''$2'''.",
+'rclistfrom' => 'Vuesehte orre värrhtoedimmieh aelkedh raejeste $1',
+'rcshowhideminor' => '$1 ohtje värrhtoedimmie',
+'rcshowhidebots' => '$1 jïjtjesvïhtjijeh',
+'rcshowhideliu' => '$1 värrhtoedimmie dejstie sïjselogge nuhtjienh',
+'rcshowhideanons' => '$1 anonyyme nuhtjienh',
+'rcshowhidepatr' => '$1 dååhkasjehtedh värrhtoedimmieh',
+'rcshowhidemine' => '$1 mov värrhtoedimmieh',
+'rclinks' => 'Vuesehte männgan $1 värrhtoedimmieh nuelesne männgan $2 biejjieh<br />$3',
+'diff' => 'joekehts',
+'hist' => 'hist',
+'hide' => 'Gaptjedh',
+'show' => 'Vuesehte',
+'minoreditletter' => 'u',
+'newpageletter' => 'O',
+'boteditletter' => 'j',
 
 # Recent changes linked
-'recentchangeslinked'          => 'Värrhtoedimmieh nille krïense bielieh',
-'recentchangeslinked-feed'     => 'Värrhtoedimmieh nille krïense bielieh',
-'recentchangeslinked-toolbox'  => 'Värrhtoedimmieh nille krïense bielieh',
-'recentchangeslinked-title'    => 'Värrhtoedimmie laktaseaddji gåajkoe "$1"',
+'recentchangeslinked' => 'Värrhtoedimmieh nille krïense bielieh',
+'recentchangeslinked-feed' => 'Värrhtoedimmieh nille krïense bielieh',
+'recentchangeslinked-toolbox' => 'Värrhtoedimmieh nille krïense bielieh',
+'recentchangeslinked-title' => 'Värrhtoedimmie laktaseaddji gåajkoe "$1"',
 'recentchangeslinked-noresult' => 'Ijje kïrense bielieh värrhtoedimmie nuelesne dïhte veeljeme tïjje-boelhke.',
-'recentchangeslinked-summary'  => "Dïhte joekoelaakan bielie lästoe dah minngemes värrhtoedimmieh nille bielieh goh lea lïenghke. Bielieh [[Special:Watchlist|nille dov]] sïektjedhlästoe lea '''buajtehks'''.",
+'recentchangeslinked-summary' => "Dïhte joekoelaakan bielie lästoe dah minngemes värrhtoedimmieh nille bielieh goh lea lïenghke. Bielieh [[Special:Watchlist|nille dov]] sïektjedhlästoe lea '''buajtehks'''.",
 
 # Upload
-'upload'         => 'Sadde guvvie',
-'uploadbtn'      => 'Sadde baalka',
-'uploadlogpage'  => 'Sadde logge',
-'filename'       => 'Guvvienomme',
-'filesource'     => 'Gaaltjie',
-'savefile'       => 'Spååredh guvvie',
-'uploadedimage'  => 'sadde "[[$1]]"',
-'uploadvirus'    => 'Guvvie tjeekehdidh viirus! Bïevnesh: $1',
+'upload' => 'Sadde guvvie',
+'uploadbtn' => 'Sadde baalka',
+'uploadlogpage' => 'Sadde logge',
+'filename' => 'Guvvienomme',
+'filesource' => 'Gaaltjie',
+'savefile' => 'Spååredh guvvie',
+'uploadedimage' => 'sadde "[[$1]]"',
+'uploadvirus' => 'Guvvie tjeekehdidh viirus! Bïevnesh: $1',
 'sourcefilename' => 'Gaaltjie guvvienomme',
 
 'upload-file-error' => 'Sjisjnjie båajhtode',
 
-'license'        => 'Liseense',
+'license' => 'Liseense',
 'license-header' => 'Liseense',
 
 # Special:ListFiles
 'listfiles_search_for' => 'Ohtsedh ihke guvvie nomme:',
-'imgfile'              => 'guvvie',
-'listfiles'            => 'Guvvie lästoe',
-'listfiles_name'       => 'Nomme',
-'listfiles_user'       => 'Nuhtjien',
-'listfiles_size'       => 'Stoerre',
+'imgfile' => 'guvvie',
+'listfiles' => 'Guvvie lästoe',
+'listfiles_name' => 'Nomme',
+'listfiles_user' => 'Nuhtjien',
+'listfiles_size' => 'Stoerre',
 
 # File description page
-'file-anchor-link'          => 'Baalka',
-'filehist'                  => 'Baalka histovrije',
-'filehist-help'             => 'Diedtedh nille biejjie ihke vuajna man baalkan lij bealese dïhte tïjje.',
-'filehist-current'          => 'daaletje',
-'filehist-datetime'         => 'Biejjie/Tïjje',
-'filehist-user'             => 'Nuhtjien',
-'filehist-dimensions'       => 'Dimisjovneh',
-'filehist-filesize'         => 'Guvvie stoerre',
-'filehist-comment'          => 'Lahtestimmie',
-'imagelinks'                => 'Lïenghkeh',
-'linkstoimage'              => 'Tjuovvovasj {{PLURAL:$1|side|$1 sider}} bielieh lïenghkeh gåajkoe dïhte baalka:',
-'nolinkstoimage'            => 'Dïhte lea ijje bielieh goh nuhtjie dïhte baalka.',
-'sharedupload'              => 'Dïhte baalka lea $1 sadde goh juaka jih dorje sjädta nuhtjie dejstie jeatjebh prosjekte.',
+'file-anchor-link' => 'Baalka',
+'filehist' => 'Baalka histovrije',
+'filehist-help' => 'Diedtedh nille biejjie ihke vuajna man baalkan lij bealese dïhte tïjje.',
+'filehist-current' => 'daaletje',
+'filehist-datetime' => 'Biejjie/Tïjje',
+'filehist-user' => 'Nuhtjien',
+'filehist-dimensions' => 'Dimisjovneh',
+'filehist-filesize' => 'Guvvie stoerre',
+'filehist-comment' => 'Lahtestimmie',
+'imagelinks' => 'Lïenghkeh',
+'linkstoimage' => 'Tjuovvovasj {{PLURAL:$1|side|$1 sider}} bielieh lïenghkeh gåajkoe dïhte baalka:',
+'nolinkstoimage' => 'Dïhte lea ijje bielieh goh nuhtjie dïhte baalka.',
+'sharedupload' => 'Dïhte baalka lea $1 sadde goh juaka jih dorje sjädta nuhtjie dejstie jeatjebh prosjekte.',
 'uploadnewversion-linktext' => 'Sadde orre låhkoe dejstie dïhte baalka',
 
 # MIME search
 'mimesearch' => 'MIME ohtsedh',
-'mimetype'   => 'MIME vuekie:',
+'mimetype' => 'MIME vuekie:',
 
 # List redirects
 'listredirects' => 'Lästoe bïjre-dirisjovneh',
 
 # Unused templates
-'unusedtemplates'    => 'Ov-nuhtjie maaleh',
+'unusedtemplates' => 'Ov-nuhtjie maaleh',
 'unusedtemplateswlh' => 'jeatjebh lïenghkeh',
 
 # Random page
@@ -457,14 +456,14 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge s
 'randomredirect' => 'Summal odhasitstivren',
 
 # Statistics
-'statistics'              => 'Statistiike',
+'statistics' => 'Statistiike',
 'statistics-header-users' => 'Nuhtjien statistiike',
 
 'disambiguations' => 'Disambirgusjovne bielieh',
 
 'doubleredirects' => 'Guektien-gïerth bïjre-dirisjovneh',
 
-'brokenredirects'      => 'Earjohks bïrje-dirisjovneh',
+'brokenredirects' => 'Earjohks bïrje-dirisjovneh',
 'brokenredirects-edit' => '(värrhtoedimmie)',
 
 'withoutinterwiki' => 'Bielieh namhtah gïele lïenghkeh',
@@ -472,59 +471,59 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge s
 'fewestrevisions' => 'Bielieh meatan dah unnebes gïehtjedamme',
 
 # Miscellaneous special pages
-'nbytes'                  => '$1 {{PLURAL:$1|byte|byteh}}',
-'ncategories'             => '$1 {{PLURAL:$1|kategorije|kategorijeh}}',
-'nlinks'                  => '$1 {{PLURAL:$1|lïenghke|lïenghkeh}}',
-'nmembers'                => '$1 {{PLURAL:$1|lihtsege|lihtsegh}}',
-'nrevisions'              => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}}',
-'nviews'                  => '$1 {{PLURAL:$1|vuesehte|vuesehteh}}',
-'lonelypages'             => 'Eejhtegapth bielieh',
-'uncategorizedpages'      => 'Ov-kategorije bielieh',
+'nbytes' => '$1 {{PLURAL:$1|byte|byteh}}',
+'ncategories' => '$1 {{PLURAL:$1|kategorije|kategorijeh}}',
+'nlinks' => '$1 {{PLURAL:$1|lïenghke|lïenghkeh}}',
+'nmembers' => '$1 {{PLURAL:$1|lihtsege|lihtsegh}}',
+'nrevisions' => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}}',
+'nviews' => '$1 {{PLURAL:$1|vuesehte|vuesehteh}}',
+'lonelypages' => 'Eejhtegapth bielieh',
+'uncategorizedpages' => 'Ov-kategorije bielieh',
 'uncategorizedcategories' => 'Ov-kategorije kategorijeh',
-'uncategorizedimages'     => 'Ov-kategorije guvvieh',
-'uncategorizedtemplates'  => 'Ov-kategorije maaleh',
-'unusedcategories'        => 'Ov-nuhtjie kategorije',
-'unusedimages'            => 'Ov-nnuhtjie guvvieh',
-'wantedcategories'        => 'Vaajtelidh kategorijeh',
-'wantedpages'             => 'Vaajtelidh bielieh',
-'mostlinked'              => 'Jeenjebe lïenghkeh gåajkoe bielieh',
-'mostlinkedcategories'    => 'Jeenjebe lïenghke gåajkoe kategorijeh',
-'mostlinkedtemplates'     => 'Jeenjebe lïenghke gåajkoe malleh',
-'mostcategories'          => 'Bielieh meatan jïjnje kategorijeh',
-'mostimages'              => 'Jeenjebe lïenghke gåajkoe guvvieh',
-'mostrevisions'           => 'Bielieh meatan jïjnje gïehtjedammeh',
-'prefixindex'             => 'Prefiikse indeekse',
-'shortpages'              => 'Åenehks bielieh',
-'longpages'               => 'Guhkie bielieh',
-'deadendpages'            => 'Tsuvvedh bielieh',
-'protectedpages'          => 'Sïektjedh bielieh',
-'listusers'               => 'Nuhtjien lästoe',
-'newpages'                => 'Orre bielie',
-'newpages-username'       => 'Nuhtjiennomme:',
-'ancientpages'            => 'Båarasåabpoe bielieh',
-'move'                    => 'Jåhta',
-'movethispage'            => 'Jåhta dïhte bielie',
+'uncategorizedimages' => 'Ov-kategorije guvvieh',
+'uncategorizedtemplates' => 'Ov-kategorije maaleh',
+'unusedcategories' => 'Ov-nuhtjie kategorije',
+'unusedimages' => 'Ov-nnuhtjie guvvieh',
+'wantedcategories' => 'Vaajtelidh kategorijeh',
+'wantedpages' => 'Vaajtelidh bielieh',
+'mostlinked' => 'Jeenjebe lïenghkeh gåajkoe bielieh',
+'mostlinkedcategories' => 'Jeenjebe lïenghke gåajkoe kategorijeh',
+'mostlinkedtemplates' => 'Jeenjebe lïenghke gåajkoe malleh',
+'mostcategories' => 'Bielieh meatan jïjnje kategorijeh',
+'mostimages' => 'Jeenjebe lïenghke gåajkoe guvvieh',
+'mostrevisions' => 'Bielieh meatan jïjnje gïehtjedammeh',
+'prefixindex' => 'Prefiikse indeekse',
+'shortpages' => 'Åenehks bielieh',
+'longpages' => 'Guhkie bielieh',
+'deadendpages' => 'Tsuvvedh bielieh',
+'protectedpages' => 'Sïektjedh bielieh',
+'listusers' => 'Nuhtjien lästoe',
+'newpages' => 'Orre bielie',
+'newpages-username' => 'Nuhtjiennomme:',
+'ancientpages' => 'Båarasåabpoe bielieh',
+'move' => 'Jåhta',
+'movethispage' => 'Jåhta dïhte bielie',
 
 # Book sources
-'booksources'               => 'Gärja gaaltjieh',
+'booksources' => 'Gärja gaaltjieh',
 'booksources-search-legend' => 'Ohtsedh ihke gärja gaaltjieh',
-'booksources-go'            => 'Vaadtsa',
+'booksources-go' => 'Vaadtsa',
 
 # Special:Log
-'specialloguserlabel'  => 'Nuhtjien:',
+'specialloguserlabel' => 'Nuhtjien:',
 'speciallogtitlelabel' => 'Tiitele:',
-'log'                  => 'Loggeh',
-'all-logs-page'        => 'Gaajhke loggeh',
+'log' => 'Loggeh',
+'all-logs-page' => 'Gaajhke loggeh',
 
 # Special:AllPages
-'allpages'       => 'Gaajhke bielieh',
+'allpages' => 'Gaajhke bielieh',
 'alphaindexline' => '$1 ... $2',
-'nextpage'       => 'Minngebe bielie ($1)',
-'prevpage'       => 'Övtebe bielie ($1)',
-'allpagesfrom'   => 'Vuesehte bielieh goh aelkedh meatan:',
-'allarticles'    => 'Gaajhke bielieh',
-'allpagesprev'   => 'Övtebe',
-'allpagesnext'   => 'Minngebe',
+'nextpage' => 'Minngebe bielie ($1)',
+'prevpage' => 'Övtebe bielie ($1)',
+'allpagesfrom' => 'Vuesehte bielieh goh aelkedh meatan:',
+'allarticles' => 'Gaajhke bielieh',
+'allpagesprev' => 'Övtebe',
+'allpagesnext' => 'Minngebe',
 'allpagessubmit' => 'Vaadtsa',
 'allpagesprefix' => 'Vuesehte bielieh meatan prefihkse:',
 
@@ -535,246 +534,246 @@ Dov dorje värrhtoedimmie gååvnese bielieh, jallh [[Special:UserLogin|logge s
 'listusers-submit' => 'Vuesehte',
 
 # E-mail user
-'emailuser'       => 'E-påaste dïhte nuhtjien',
-'emailpage'       => 'E-påaste nuhtjien',
+'emailuser' => 'E-påaste dïhte nuhtjien',
+'emailpage' => 'E-påaste nuhtjien',
 'defemailsubject' => '{{SITENAME}} e-påaste',
-'emailfrom'       => 'Raejeste',
-'emailto'         => 'Gåajkoe',
-'emailsubject'    => 'Ïebne',
-'emailmessage'    => 'Dïjre',
-'emailsend'       => 'Seedtie',
-'emailsent'       => 'E-påaste seedtedh',
+'emailfrom' => 'Raejeste',
+'emailto' => 'Gåajkoe',
+'emailsubject' => 'Ïebne',
+'emailmessage' => 'Dïjre',
+'emailsend' => 'Seedtie',
+'emailsent' => 'E-påaste seedtedh',
 
 # Watchlist
-'watchlist'         => 'Mov sïektjedhlästoe',
-'mywatchlist'       => 'Mov sïektjedhlästoe',
-'removedwatchtext'  => 'Bielie "[[:$1]]" lea sihkojuvvon raejeste [[Special:Watchlist|dov sïektjedhlästoe]].',
-'watch'             => 'Sïektjedh',
-'watchthispage'     => 'Sïektjedh dïhte bielie',
-'unwatch'           => 'Ov-sïektjedh',
+'watchlist' => 'Mov sïektjedhlästoe',
+'mywatchlist' => 'Mov sïektjedhlästoe',
+'removedwatchtext' => 'Bielie "[[:$1]]" lea sihkojuvvon raejeste [[Special:Watchlist|dov sïektjedhlästoe]].',
+'watch' => 'Sïektjedh',
+'watchthispage' => 'Sïektjedh dïhte bielie',
+'unwatch' => 'Ov-sïektjedh',
 'watchlist-details' => '{{PLURAL:$1|$1 bielie|$1 bielieh}} sïektjedh (doekoe dïerhkestidhbielieh).',
-'wlshowlast'        => 'Vuesehte minngemes $1 täjmoeh $2 biejjieh $3',
+'wlshowlast' => 'Vuesehte minngemes $1 täjmoeh $2 biejjieh $3',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Sïektjeminie...',
+'watching' => 'Sïektjeminie...',
 'unwatching' => 'Ov-sïektjedh...',
 
-'enotif_newpagetext'           => 'Dïhte lea orre bielie.',
+'enotif_newpagetext' => 'Dïhte lea orre bielie.',
 'enotif_impersonal_salutation' => '{{SITENAME}} nuhtjien',
-'created'                      => 'skaepede',
+'created' => 'skaepede',
 
 # Delete
-'deletepage'            => 'Tjåegkedh bielie',
-'historywarning'        => 'Vaaroehtidh: Bielie datne gïehtele ahte sihkut åtna histovrije:',
-'actioncomplete'        => 'Deahpadimmie voerkes',
-'deletedtext'           => '"$1" lea sihkojuvvon.
+'deletepage' => 'Tjåegkedh bielie',
+'historywarning' => 'Vaaroehtidh: Bielie datne gïehtele ahte sihkut åtna histovrije:',
+'actioncomplete' => 'Deahpadimmie voerkes',
+'deletedtext' => '"$1" lea sihkojuvvon.
 Vuajna $2 ihke galtege bïjre männgan sihkojuvvonh.',
-'dellogpage'            => 'Sihkkun logge',
-'deletecomment'         => 'Gaavhtan ihke sihkkuma',
-'deleteotherreason'     => 'Jeatjebh/ehkstre gaavhtan:',
+'dellogpage' => 'Sihkkun logge',
+'deletecomment' => 'Gaavhtan ihke sihkkuma',
+'deleteotherreason' => 'Jeatjebh/ehkstre gaavhtan:',
 'deletereasonotherlist' => 'Jeatjebh gaavhtan',
 
 # Rollback
 'rollbacklink' => 'jurrelde bååstede',
 
 # Protect
-'protectlogpage'              => 'Vaarjelidh logge',
-'prot_1movedto2'              => '[[$1]] jåhta gåajkoe [[$2]]',
-'protect-legend'              => 'Skylledh vaarjelidh',
-'protectcomment'              => 'Lahtestimmie:',
-'protectexpiry'               => 'Boarasnuvve:',
-'protect_expiry_invalid'      => 'Ov-jiltiige buaorasjnuvvenaigi.',
-'protect_expiry_old'          => 'Boarasnuvvenaigi lea vaesedh.',
-'protect-text'                => "Daesnie dorje datne vuajna jih värrhtoedimmie vaarjelidhdaltese dejstie bielie '''$1'''.",
-'protect-locked-access'       => "Dov nuhtjien åtna ijje luhpie gåajkoe värrhtoedimmie tjaeleste-vaarjelidh.
+'protectlogpage' => 'Vaarjelidh logge',
+'prot_1movedto2' => '[[$1]] jåhta gåajkoe [[$2]]',
+'protect-legend' => 'Skylledh vaarjelidh',
+'protectcomment' => 'Lahtestimmie:',
+'protectexpiry' => 'Boarasnuvve:',
+'protect_expiry_invalid' => 'Ov-jiltiige buaorasjnuvvenaigi.',
+'protect_expiry_old' => 'Boarasnuvvenaigi lea vaesedh.',
+'protect-text' => "Daesnie dorje datne vuajna jih värrhtoedimmie vaarjelidhdaltese dejstie bielie '''$1'''.",
+'protect-locked-access' => "Dov nuhtjien åtna ijje luhpie gåajkoe värrhtoedimmie tjaeleste-vaarjelidh.
 Daaletje tjaeleste-vaarjelidh sïjsestäälninge ihke bielie '''$1''' lea:",
-'protect-default'             => '(åvte-veeljeme)',
-'protect-fallback'            => 'Luhpie "$1"',
+'protect-default' => '(åvte-veeljeme)',
+'protect-fallback' => 'Luhpie "$1"',
 'protect-level-autoconfirmed' => 'Tjöödtjehtidh ov-registreered nuhtjienh',
-'protect-level-sysop'         => 'Barre reeredh',
-'protect-summary-cascade'     => 'viididuvvon',
-'protect-expiring'            => 'boarasnuvve $1 (UTC)',
-'protect-cascade'             => 'Vaarjelidh bielieh guosket sïjse dïhte bielie (viidit suodjaluse)',
-'protect-cantedit'            => 'Datne dorje ijje värrhtoedimmie vaarjelidhdaltese ihke dïhte bielie, ihke datne ijja åtna luhpie ahte värrhtoedimmie dïhte.',
-'protect-expiry-options'      => '2 täjmoe:2 hours,1 biejjie:1 day,3 biejjie:3 days,1 våhkoe:1 week,2 våhkoe:2 weeks,1 aske:1 month,3 aske:3 months,6 aske:6 months,1 jaepie:1 year,gietjieloeves:infinite',
-'restriction-type'            => 'Permisjovne:',
-'restriction-level'           => 'Restriksjovne daltese:',
+'protect-level-sysop' => 'Barre reeredh',
+'protect-summary-cascade' => 'viididuvvon',
+'protect-expiring' => 'boarasnuvve $1 (UTC)',
+'protect-cascade' => 'Vaarjelidh bielieh guosket sïjse dïhte bielie (viidit suodjaluse)',
+'protect-cantedit' => 'Datne dorje ijje värrhtoedimmie vaarjelidhdaltese ihke dïhte bielie, ihke datne ijja åtna luhpie ahte värrhtoedimmie dïhte.',
+'protect-expiry-options' => '2 täjmoe:2 hours,1 biejjie:1 day,3 biejjie:3 days,1 våhkoe:1 week,2 våhkoe:2 weeks,1 aske:1 month,3 aske:3 months,6 aske:6 months,1 jaepie:1 year,gietjieloeves:infinite',
+'restriction-type' => 'Permisjovne:',
+'restriction-level' => 'Restriksjovne daltese:',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'Värrhtoedimmie',
-'restriction-move'   => 'Jåhta',
+'restriction-edit' => 'Värrhtoedimmie',
+'restriction-move' => 'Jåhta',
 'restriction-create' => 'Skaepiedidh',
 
 # Restriction levels
 'restriction-level-sysop' => 'dïeves-vaarjelidh',
 
 # Undelete
-'undeleterevisions'      => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}} våarhkoe',
-'undeletebtn'            => 'Mahtsat',
+'undeleterevisions' => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}} våarhkoe',
+'undeletebtn' => 'Mahtsat',
 'undelete-search-submit' => 'Ohtsedh',
 
 # Namespace form on various pages
-'namespace'      => 'Nommeïebne:',
-'invert'         => 'Jarkoe veeljeme',
+'namespace' => 'Nommeïebne:',
+'invert' => 'Jarkoe veeljeme',
 'blanknamespace' => '(Bielieh)',
 
 # Contributions
 'contributions' => 'Nuhtjien värrhtoedimmieh',
-'mycontris'     => 'Mov värrhtoedimmieh',
-'contribsub2'   => 'Ihke $1 ($2)',
-'uctop'         => '(gïerege)',
-'month'         => 'Raejeste aske (jih övtebe):',
-'year'          => 'Raejeste jaepie (jih övtebe):',
+'mycontris' => 'Mov värrhtoedimmieh',
+'contribsub2' => 'Ihke $1 ($2)',
+'uctop' => '(gïerege)',
+'month' => 'Raejeste aske (jih övtebe):',
+'year' => 'Raejeste jaepie (jih övtebe):',
 
 'sp-contributions-newbies-sub' => 'Ihke orre nuhtjienh',
-'sp-contributions-blocklog'    => 'Tjöödtjehtidh logge',
-'sp-contributions-talk'        => 'Digkiedimmie',
-'sp-contributions-username'    => 'IP Tjaalesijjie jallh nuhtjiennomme:',
-'sp-contributions-submit'      => 'Ohtsedh',
+'sp-contributions-blocklog' => 'Tjöödtjehtidh logge',
+'sp-contributions-talk' => 'Digkiedimmie',
+'sp-contributions-username' => 'IP Tjaalesijjie jallh nuhtjiennomme:',
+'sp-contributions-submit' => 'Ohtsedh',
 
 # What links here
-'whatlinkshere'       => 'Bilieh goh lïenghkeh diekie',
+'whatlinkshere' => 'Bilieh goh lïenghkeh diekie',
 'whatlinkshere-title' => 'Bielieh goh lïenghke gåajkoe $1',
-'whatlinkshere-page'  => 'Bielie:',
-'linkshere'           => "Tjuovvovasj bielie lïenghke gåajkoe '''[[:$1]]''':",
-'nolinkshere'         => "Ijje bielieh lïenghke gåajkoe '''[[:$1]]'''.",
-'isredirect'          => 'bïjre-dirisjovne bielie',
-'istemplate'          => 'lasihuvvon goh maale',
-'whatlinkshere-prev'  => '{{PLURAL:$1|övtebe|övtebe $1}}',
-'whatlinkshere-next'  => '{{PLURAL:$1|minngebe|minngebe $1}}',
+'whatlinkshere-page' => 'Bielie:',
+'linkshere' => "Tjuovvovasj bielie lïenghke gåajkoe '''[[:$1]]''':",
+'nolinkshere' => "Ijje bielieh lïenghke gåajkoe '''[[:$1]]'''.",
+'isredirect' => 'bïjre-dirisjovne bielie',
+'istemplate' => 'lasihuvvon goh maale',
+'whatlinkshere-prev' => '{{PLURAL:$1|övtebe|övtebe $1}}',
+'whatlinkshere-next' => '{{PLURAL:$1|minngebe|minngebe $1}}',
 'whatlinkshere-links' => '← lïenghkeh',
 
 # Block/unblock
-'blockip'            => 'Tjöödtjehtidh nuhtjien',
+'blockip' => 'Tjöödtjehtidh nuhtjien',
 'ipadressorusername' => 'IP Tjaalesijjie jallh nuhtjiennomme:',
-'ipbother'           => 'Jeatjebh tïjje:',
-'ipboptions'         => '2 täjmoe:2 hours,1 biejjie:1 day,3 biejjie:3 days,1 våhkoe:1 week,2 våhkoe:2 weeks,1 aske:1 month,3 aske:3 months,6 aske:6 months,1 jaepie:1 year,gietjieloeves:infinite',
-'ipbotheroption'     => 'jeatjebh',
-'ipblocklist'        => 'Lästoe bijjelen tjöödtjehtidh IP tjaalesijjieh jih nuhtjiennommeh',
+'ipbother' => 'Jeatjebh tïjje:',
+'ipboptions' => '2 täjmoe:2 hours,1 biejjie:1 day,3 biejjie:3 days,1 våhkoe:1 week,2 våhkoe:2 weeks,1 aske:1 month,3 aske:3 months,6 aske:6 months,1 jaepie:1 year,gietjieloeves:infinite',
+'ipbotheroption' => 'jeatjebh',
+'ipblocklist' => 'Lästoe bijjelen tjöödtjehtidh IP tjaalesijjieh jih nuhtjiennommeh',
 'ipblocklist-submit' => 'Ohtsedh',
-'blocklink'          => 'tjöödtjehtidh',
-'unblocklink'        => 'ov-tjöödtjehtidh',
-'contribslink'       => 'dåarjoeh',
-'blocklogpage'       => 'Tjöödtjehtidh logge',
-'blocklogentry'      => 'blåhkedidh "[[$1]]" $2 $3',
+'blocklink' => 'tjöödtjehtidh',
+'unblocklink' => 'ov-tjöödtjehtidh',
+'contribslink' => 'dåarjoeh',
+'blocklogpage' => 'Tjöödtjehtidh logge',
+'blocklogentry' => 'blåhkedidh "[[$1]]" $2 $3',
 
 # Developer tools
-'lockdb'            => 'Tjuevtedh daatabaase',
-'lockbtn'           => 'Tjuevtedh daatabaase',
+'lockdb' => 'Tjuevtedh daatabaase',
+'lockbtn' => 'Tjuevtedh daatabaase',
 'databasenotlocked' => 'Daatabaase lea ijje tjuevtedh.',
 
 # Move page
 'move-page-legend' => 'Jåhta bielie',
-'movearticle'      => 'Jåhta bielie:',
-'newtitle'         => 'Gåajkoe orre tiitele:',
-'move-watch'       => 'Sïektjedh dïhte bielie',
-'movepagebtn'      => 'Jåhta bielie',
-'pagemovedsub'     => 'Jåhta lähkoe',
-'articleexists'    => 'Bielie meatan dïhte nomme gååvnese joe, jallh
+'movearticle' => 'Jåhta bielie:',
+'newtitle' => 'Gåajkoe orre tiitele:',
+'move-watch' => 'Sïektjedh dïhte bielie',
+'movepagebtn' => 'Jåhta bielie',
+'pagemovedsub' => 'Jåhta lähkoe',
+'articleexists' => 'Bielie meatan dïhte nomme gååvnese joe, jallh
 nome dov åtna veeljeme lea ijje jiiltige.
 Gïemhpes veeljeme jeatjebh nomme.',
-'movedto'          => 'jåhta gåajkoe',
-'movetalk'         => 'Jåhta aaj dïerkestidhbielie, bïjre dïhte gååvnese.',
-'movelogpage'      => 'Jåhta logge',
-'movereason'       => 'Gaavhtan:',
-'revertmove'       => 'jåhta bååstede',
+'movedto' => 'jåhta gåajkoe',
+'movetalk' => 'Jåhta aaj dïerkestidhbielie, bïjre dïhte gååvnese.',
+'movelogpage' => 'Jåhta logge',
+'movereason' => 'Gaavhtan:',
+'revertmove' => 'jåhta bååstede',
 
 # Export
-'export'           => 'Ehksporte bielieh',
-'export-submit'    => 'Ehksporte',
-'export-addcat'    => 'Lissiehtidh',
+'export' => 'Ehksporte bielieh',
+'export-submit' => 'Ehksporte',
+'export-addcat' => 'Lissiehtidh',
 'export-templates' => 'Inkludera mallar',
 
 # Namespace 8 related
-'allmessages'     => 'Systeeme dïrje',
+'allmessages' => 'Systeeme dïrje',
 'allmessagesname' => 'Nomme',
 
 # Thumbnails
-'thumbnail-more'  => 'Vijriedidh',
+'thumbnail-more' => 'Vijriedidh',
 'thumbnail_error' => 'Båajhtode nuelesne skaepede dejstie miniatyvreguvvie: $1',
 
 # Special:Import
-'import'                  => 'Imporhte bielieh',
+'import' => 'Imporhte bielieh',
 'import-interwiki-submit' => 'Imporhte',
-'importstart'             => 'Imporhte bielieh...',
-'import-revision-count'   => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}}',
-'importfailed'            => 'Imporhte steegkeldahkesne: $1',
-'importsuccess'           => 'Imporhte lähkoe!',
+'importstart' => 'Imporhte bielieh...',
+'import-revision-count' => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}}',
+'importfailed' => 'Imporhte steegkeldahkesne: $1',
+'importsuccess' => 'Imporhte lähkoe!',
 
 # Import log
-'importlogpage'                    => 'Imporhte logge',
-'import-logentry-upload-detail'    => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}}',
+'importlogpage' => 'Imporhte logge',
+'import-logentry-upload-detail' => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}}',
 'import-logentry-interwiki-detail' => '$1 {{PLURAL:$1|gïehtjedamme|gïehtjedammeh}} raejeste $2',
 
 # Tooltip help for the actions
-'tooltip-pt-userpage'             => 'Mov nuhtjienbielie',
-'tooltip-pt-mytalk'               => 'Mov dïjveldidh bielie',
-'tooltip-pt-preferences'          => 'Mov sïjsesäälningeh',
-'tooltip-pt-watchlist'            => 'Lästoe bijjelen bielieh goh sïektjedh',
-'tooltip-pt-mycontris'            => 'Lästoe bijjelen mov värrhtoedimmie',
-'tooltip-pt-login'                => 'Dov åådtje logge sïjse, bine dïhte lea ijje daerpies.',
-'tooltip-pt-logout'               => 'Logge ålkone',
-'tooltip-ca-talk'                 => 'Dïjveldidh bïjre sisvege bieliej',
-'tooltip-ca-edit'                 => 'Dov dorje värrhtoedimmie dïhte bielie. Nuhtjie åvte-vuesiehtidh båaloe åvte spååredh.',
-'tooltip-ca-addsection'           => 'Lissiehtidh lahtestimmie gåajkoe dïhte dïjveldidh.',
-'tooltip-ca-viewsource'           => 'Dïhte bielie lea vaarjelidh. Dov dorje vuesehte gaaltjiej.',
-'tooltip-ca-protect'              => 'Vaarjelidh dïhte bielie',
-'tooltip-ca-delete'               => 'Tjåegkedh dïhte bielie',
-'tooltip-ca-move'                 => 'Jåhta dïhte bielie',
-'tooltip-ca-watch'                => 'Lissiehtidh dïhte bielie gåajkoe dov sïektjedhlästoe',
-'tooltip-ca-unwatch'              => 'Sirdde dïhte bielie raejeste dov sïektjedhlästoe',
-'tooltip-search'                  => 'Ohtsedh {{SITENAME}}sne',
-'tooltip-p-logo'                  => 'Åejjiebielie',
-'tooltip-n-mainpage'              => 'Gåajkoe aalkoebielie vaadtsa',
-'tooltip-n-portal'                => 'Bïjre prosjekte, mij dov dorje, lij dov gaavnedh daeverh',
-'tooltip-n-currentevents'         => 'Bïevnesh bïjre daaletje deahpadimmieh',
-'tooltip-n-recentchanges'         => 'Lästoe männganes sjiehtedh bijjelen nille {{SITENAME}}.',
-'tooltip-n-randompage'            => 'Vaadtsa summal bielie',
-'tooltip-n-help'                  => 'Viehkie jih bïevnesh {{SITENAME}} bïjre.',
-'tooltip-t-whatlinkshere'         => 'Lästoe bijjelen gaajhke wiki bielieh goh lïenghke diekie',
-'tooltip-feed-rss'                => 'RSS feed ihke dïhte bielie',
-'tooltip-feed-atom'               => 'Atom feed ihke dïhte bielie',
-'tooltip-t-contributions'         => 'Vuesehte lästoe bijjelen värrhtoedimmieh dejstie dïhte nuhtjien',
-'tooltip-t-emailuser'             => 'Seedtedh e-påaste gåajkoe dïhte nuhtjien',
-'tooltip-t-upload'                => 'Sadde guvvir jallh meedia baalkah',
-'tooltip-t-specialpages'          => 'Lästoe gaajhke joekoen bielieh bijjelen',
-'tooltip-ca-nstab-user'           => 'Vuesehte nuhtjien bieliej',
-'tooltip-ca-nstab-project'        => 'Vuesehte prosjekte bieliej',
-'tooltip-ca-nstab-image'          => 'Vuesehte guvvie bieliej',
-'tooltip-ca-nstab-template'       => 'Vuesehte maalej',
-'tooltip-ca-nstab-help'           => 'Vuesehte viehkie bieliej',
-'tooltip-ca-nstab-category'       => 'Vuesehte kategorije bieliej',
-'tooltip-minoredit'               => 'Mïerhkesjidh dïhte lea ohtje värrhtoedimmie',
-'tooltip-save'                    => 'Spååredh dov värrhtoedimmieh',
-'tooltip-preview'                 => 'Åvte-vuesiehtidh dov värrhtoedimmie, gïemhpes nuhtjie dïhte åvte spååredh!',
-'tooltip-diff'                    => 'Vuesehte guhte värrhtoedimmieh dov åtna dorjeme dejstie tjaalege.',
+'tooltip-pt-userpage' => 'Mov nuhtjienbielie',
+'tooltip-pt-mytalk' => 'Mov dïjveldidh bielie',
+'tooltip-pt-preferences' => 'Mov sïjsesäälningeh',
+'tooltip-pt-watchlist' => 'Lästoe bijjelen bielieh goh sïektjedh',
+'tooltip-pt-mycontris' => 'Lästoe bijjelen mov värrhtoedimmie',
+'tooltip-pt-login' => 'Dov åådtje logge sïjse, bine dïhte lea ijje daerpies.',
+'tooltip-pt-logout' => 'Logge ålkone',
+'tooltip-ca-talk' => 'Dïjveldidh bïjre sisvege bieliej',
+'tooltip-ca-edit' => 'Dov dorje värrhtoedimmie dïhte bielie. Nuhtjie åvte-vuesiehtidh båaloe åvte spååredh.',
+'tooltip-ca-addsection' => 'Lissiehtidh lahtestimmie gåajkoe dïhte dïjveldidh.',
+'tooltip-ca-viewsource' => 'Dïhte bielie lea vaarjelidh. Dov dorje vuesehte gaaltjiej.',
+'tooltip-ca-protect' => 'Vaarjelidh dïhte bielie',
+'tooltip-ca-delete' => 'Tjåegkedh dïhte bielie',
+'tooltip-ca-move' => 'Jåhta dïhte bielie',
+'tooltip-ca-watch' => 'Lissiehtidh dïhte bielie gåajkoe dov sïektjedhlästoe',
+'tooltip-ca-unwatch' => 'Sirdde dïhte bielie raejeste dov sïektjedhlästoe',
+'tooltip-search' => 'Ohtsedh {{SITENAME}}sne',
+'tooltip-p-logo' => 'Åejjiebielie',
+'tooltip-n-mainpage' => 'Gåajkoe aalkoebielie vaadtsa',
+'tooltip-n-portal' => 'Bïjre prosjekte, mij dov dorje, lij dov gaavnedh daeverh',
+'tooltip-n-currentevents' => 'Bïevnesh bïjre daaletje deahpadimmieh',
+'tooltip-n-recentchanges' => 'Lästoe männganes sjiehtedh bijjelen nille {{SITENAME}}.',
+'tooltip-n-randompage' => 'Vaadtsa summal bielie',
+'tooltip-n-help' => 'Viehkie jih bïevnesh {{SITENAME}} bïjre.',
+'tooltip-t-whatlinkshere' => 'Lästoe bijjelen gaajhke wiki bielieh goh lïenghke diekie',
+'tooltip-feed-rss' => 'RSS feed ihke dïhte bielie',
+'tooltip-feed-atom' => 'Atom feed ihke dïhte bielie',
+'tooltip-t-contributions' => 'Vuesehte lästoe bijjelen värrhtoedimmieh dejstie dïhte nuhtjien',
+'tooltip-t-emailuser' => 'Seedtedh e-påaste gåajkoe dïhte nuhtjien',
+'tooltip-t-upload' => 'Sadde guvvir jallh meedia baalkah',
+'tooltip-t-specialpages' => 'Lästoe gaajhke joekoen bielieh bijjelen',
+'tooltip-ca-nstab-user' => 'Vuesehte nuhtjien bieliej',
+'tooltip-ca-nstab-project' => 'Vuesehte prosjekte bieliej',
+'tooltip-ca-nstab-image' => 'Vuesehte guvvie bieliej',
+'tooltip-ca-nstab-template' => 'Vuesehte maalej',
+'tooltip-ca-nstab-help' => 'Vuesehte viehkie bieliej',
+'tooltip-ca-nstab-category' => 'Vuesehte kategorije bieliej',
+'tooltip-minoredit' => 'Mïerhkesjidh dïhte lea ohtje värrhtoedimmie',
+'tooltip-save' => 'Spååredh dov värrhtoedimmieh',
+'tooltip-preview' => 'Åvte-vuesiehtidh dov värrhtoedimmie, gïemhpes nuhtjie dïhte åvte spååredh!',
+'tooltip-diff' => 'Vuesehte guhte värrhtoedimmieh dov åtna dorjeme dejstie tjaalege.',
 'tooltip-compareselectedversions' => 'Vuesehte joekehts gaskesne dah göökte vïhtesjidh låhkoeh dejstie dïhte bielie.',
-'tooltip-watch'                   => 'Lissiehtidh dïhte bielie gåajkoe dov sïektjedhlästoe',
+'tooltip-watch' => 'Lissiehtidh dïhte bielie gåajkoe dov sïektjedhlästoe',
 
 # Attribution
-'siteuser'  => '{{SITENAME}} nuhtjien $1',
+'siteuser' => '{{SITENAME}} nuhtjien $1',
 'siteusers' => '{{SITENAME}} nuhtjien(h) $1',
 
 # Browsing diffs
 'previousdiff' => '← Övtebe joekehts',
-'nextdiff'     => 'Minngebe joekehts →',
+'nextdiff' => 'Minngebe joekehts →',
 
 # Media information
-'file-info'      => 'baalka stoerre: $1, MIME-vuekie: $2',
+'file-info' => 'baalka stoerre: $1, MIME-vuekie: $2',
 'file-info-size' => '$1 × $2 pixel, baalka stoerre: $3, MIME-vuekie: $4',
-'file-nohires'   => 'Ijje jïlle bäjjeselöösninge jaksoes.',
-'svg-long-desc'  => 'SVG baalka, maadth-stoerre $1 × $2 pixel, baalka stoerre: $3',
+'file-nohires' => 'Ijje jïlle bäjjeselöösninge jaksoes.',
+'svg-long-desc' => 'SVG baalka, maadth-stoerre $1 × $2 pixel, baalka stoerre: $3',
 'show-big-image' => 'Dïeves stoerre',
 
 # Special:NewFiles
 'newimages' => 'Gallerije dejstie orre baalkah',
-'ilsubmit'  => 'Ohtsedh',
+'ilsubmit' => 'Ohtsedh',
 
 # Metadata
-'metadata'          => 'Metadaata',
-'metadata-expand'   => 'Vuesehte vijriedidh detaaljeh',
+'metadata' => 'Metadaata',
+'metadata-expand' => 'Vuesehte vijriedidh detaaljeh',
 'metadata-collapse' => 'Gaptjedh vijrede daeverh',
-'metadata-fields'   => 'EXIF-dajve goh lästoe sïjse dïhte dïrje vuesehte nille guvviebielie gåessie metadaatataabelle lea unniedidh.
+'metadata-fields' => 'EXIF-dajve goh lästoe sïjse dïhte dïrje vuesehte nille guvviebielie gåessie metadaatataabelle lea unniedidh.
 Jeatjebh dajveh lea gaptjedh goh sïejhme, bine vuesehte gåessie taabelle stoerre.
 * make
 * model
@@ -791,18 +790,18 @@ Jeatjebh dajveh lea gaptjedh goh sïejhme, bine vuesehte gåessie taabelle stoer
 * gpsaltitude',
 
 # EXIF tags
-'exif-imagewidth'         => 'Gamte',
-'exif-imagelength'        => 'Gåhkoe',
-'exif-model'              => 'Guvviedahke hammohke',
-'exif-software'           => 'Möövhkesvaare nuhtjie',
-'exif-filesource'         => 'Guvvie gaaltjie',
-'exif-gpslatituderef'     => 'Noerhte jallh Åarjetje Laatituude',
-'exif-gpslatitude'        => 'Laatituude',
-'exif-gpslongituderef'    => 'Lulnie jallh Jillege Låångdituude',
-'exif-gpslongitude'       => 'Låångdituude',
+'exif-imagewidth' => 'Gamte',
+'exif-imagelength' => 'Gåhkoe',
+'exif-model' => 'Guvviedahke hammohke',
+'exif-software' => 'Möövhkesvaare nuhtjie',
+'exif-filesource' => 'Guvvie gaaltjie',
+'exif-gpslatituderef' => 'Noerhte jallh Åarjetje Laatituude',
+'exif-gpslatitude' => 'Laatituude',
+'exif-gpslongituderef' => 'Lulnie jallh Jillege Låångdituude',
+'exif-gpslongitude' => 'Låångdituude',
 'exif-gpsareainformation' => 'Nomme ihke GPS davje',
 
-'exif-meteringmode-0'   => 'Ammes',
+'exif-meteringmode-0' => 'Ammes',
 'exif-meteringmode-255' => 'Jeatjebh',
 
 'exif-lightsource-0' => 'Ammes',
@@ -826,13 +825,13 @@ Jeatjebh dajveh lea gaptjedh goh sïejhme, bine vuesehte gåessie taabelle stoer
 'exif-gpslongitude-w' => 'Jillege låångdituude',
 
 # External editor support
-'edit-externally'      => 'Värrhtoedimmie dïhte baalka meatan ehksteerne applikasjovne',
+'edit-externally' => 'Värrhtoedimmie dïhte baalka meatan ehksteerne applikasjovne',
 'edit-externally-help' => 'Vuajna [//www.mediawiki.org/wiki/Manual:External_editors instalasjovne instruksjovne] ihke vielie bïevnesh.',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'gaajhke',
 'namespacesall' => 'gaajhke',
-'monthsall'     => 'gaajhke',
+'monthsall' => 'gaajhke',
 
 # Scary transclusion
 'scarytranscludetoolong' => '[URL lea ihke guhkie; gaatelassjedh]',
@@ -843,13 +842,13 @@ Jeatjebh dajveh lea gaptjedh goh sïejhme, bine vuesehte gåessie taabelle stoer
 # Multipage image navigation
 'imgmultipageprev' => '← övtebe bielie',
 'imgmultipagenext' => 'minngebe bielie →',
-'imgmultigo'       => 'Vaadtsa!',
+'imgmultigo' => 'Vaadtsa!',
 
 # Table pager
-'table_pager_next'         => 'Minngebe bielie',
-'table_pager_prev'         => 'Övtebe bielie',
-'table_pager_first'        => 'Voestemes bielie',
-'table_pager_last'         => 'Minngemes bielie',
+'table_pager_next' => 'Minngebe bielie',
+'table_pager_prev' => 'Övtebe bielie',
+'table_pager_first' => 'Voestemes bielie',
+'table_pager_last' => 'Minngemes bielie',
 'table_pager_limit_submit' => 'Vaadtsa',
 
 # Auto-summaries
@@ -857,12 +856,12 @@ Jeatjebh dajveh lea gaptjedh goh sïejhme, bine vuesehte gåessie taabelle stoer
 
 # Live preview
 'livepreview-loading' => 'Leedtedh…',
-'livepreview-ready'   => 'Leedtedh… Voerkes!',
+'livepreview-ready' => 'Leedtedh… Voerkes!',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Sïektjedhlästoe',
 'watchlisttools-edit' => 'Vuesehte jih värrhtoedimmie sïektjedhlästoe',
-'watchlisttools-raw'  => 'Värrhtordimmie saajpe sïektjedhlästoe',
+'watchlisttools-raw' => 'Värrhtordimmie saajpe sïektjedhlästoe',
 
 # Core parser functions
 'unknown_extension_tag' => 'Ammes ekshtensjovne lissie "$1"',
index 80c7cbe..db4716b 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'Svondo',
-'monday'        => 'Muvhuro',
-'tuesday'       => 'Chipiri',
-'wednesday'     => 'Chitatu',
-'thursday'      => 'China',
-'friday'        => 'Chishanu',
-'saturday'      => 'Mugovera',
-'january'       => 'Ndira',
-'february'      => 'Kukadzi',
-'march'         => 'Kurume',
-'april'         => 'Kubvumbi',
-'may_long'      => 'Chivabvu',
-'june'          => 'Chikumi',
-'july'          => 'Chikunguru',
-'august'        => 'Nyamavhuvhu',
-'september'     => 'Gunyana',
-'october'       => 'Gumiguru',
-'november'      => 'Mbudzi',
-'december'      => 'Zvita',
-'january-gen'   => 'Ndira',
-'february-gen'  => 'Kukadzi',
-'march-gen'     => 'Kurume',
-'april-gen'     => 'Kubvumbi',
-'may-gen'       => 'Chivabvu',
-'june-gen'      => 'Chikumi',
-'july-gen'      => 'Chikunguru',
-'august-gen'    => 'Nyamavhuvhu',
+'sunday' => 'Svondo',
+'monday' => 'Muvhuro',
+'tuesday' => 'Chipiri',
+'wednesday' => 'Chitatu',
+'thursday' => 'China',
+'friday' => 'Chishanu',
+'saturday' => 'Mugovera',
+'january' => 'Ndira',
+'february' => 'Kukadzi',
+'march' => 'Kurume',
+'april' => 'Kubvumbi',
+'may_long' => 'Chivabvu',
+'june' => 'Chikumi',
+'july' => 'Chikunguru',
+'august' => 'Nyamavhuvhu',
+'september' => 'Gunyana',
+'october' => 'Gumiguru',
+'november' => 'Mbudzi',
+'december' => 'Zvita',
+'january-gen' => 'Ndira',
+'february-gen' => 'Kukadzi',
+'march-gen' => 'Kurume',
+'april-gen' => 'Kubvumbi',
+'may-gen' => 'Chivabvu',
+'june-gen' => 'Chikumi',
+'july-gen' => 'Chikunguru',
+'august-gen' => 'Nyamavhuvhu',
 'september-gen' => 'Gunyana',
-'october-gen'   => 'Gumiguru',
-'november-gen'  => 'Mbudzi',
-'december-gen'  => 'Zvita',
+'october-gen' => 'Gumiguru',
+'november-gen' => 'Mbudzi',
+'december-gen' => 'Zvita',
 
-'cancel'     => 'Kanzura',
-'mytalk'     => 'Hurukuro dzangu',
+'cancel' => 'Kanzura',
+'mytalk' => 'Hurukuro dzangu',
 'navigation' => 'Banguranyika',
 
 # Cologne Blue skin
-'qbedit'         => 'Chinja',
+'qbedit' => 'Chinja',
 'qbspecialpages' => 'Mapeji akakosha',
 
-'help'             => 'Rubatsiro',
-'search'           => 'Tsvaga',
-'searchbutton'     => 'Tsvaga',
-'go'               => 'Enda',
-'searcharticle'    => 'Enda',
-'history_short'    => 'Zvemakare',
+'help' => 'Rubatsiro',
+'search' => 'Tsvaga',
+'searchbutton' => 'Tsvaga',
+'go' => 'Enda',
+'searcharticle' => 'Enda',
+'history_short' => 'Zvemakare',
 'printableversion' => 'Rinoita kuprinta',
-'permalink'        => 'Zvikochekero Zvisingachinje',
-'edit'             => 'Chinja',
-'delete'           => 'Bharanura',
-'protect'          => 'Chengetedza',
-'talk'             => 'Hurukuro',
-'toolbox'          => 'Maturuzi',
-'otherlanguages'   => 'Mimwe Mitauro',
+'permalink' => 'Zvikochekero Zvisingachinje',
+'edit' => 'Chinja',
+'delete' => 'Bharanura',
+'protect' => 'Chengetedza',
+'talk' => 'Hurukuro',
+'toolbox' => 'Maturuzi',
+'otherlanguages' => 'Mimwe Mitauro',
 
 # 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).
-'currentevents'        => 'Zvirikuitika',
-'currentevents-url'    => 'Project:Zvirikuitika',
-'disclaimers'          => 'Matandanyadzi',
-'edithelp'             => 'Mashandurirwo',
-'mainpage'             => 'Peji Rekutanga',
+'currentevents' => 'Zvirikuitika',
+'currentevents-url' => 'Project:Zvirikuitika',
+'disclaimers' => 'Matandanyadzi',
+'edithelp' => 'Mashandurirwo',
+'mainpage' => 'Peji Rekutanga',
 'mainpage-description' => 'Peji Rekutanga',
-'portal'               => 'Mukova wegutse',
+'portal' => 'Mukova wegutse',
 
-'newmessageslink'         => 'mashoko matsva',
+'newmessageslink' => 'mashoko matsva',
 'youhavenewmessagesmulti' => 'Une mashoko matsva pa$1',
-'editsection'             => 'chinja',
-'editold'                 => 'chinja',
+'editsection' => 'chinja',
+'editold' => 'chinja',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Gani',
@@ -88,64 +88,64 @@ $messages = array(
 'viewsource' => 'Wona mabviro',
 
 # Login and logout pages
-'welcomecreation'    => '== Tigashire, $1! ==
+'welcomecreation' => '== Tigashire, $1! ==
 Akaunzi yako yagadzirwa.
 Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
-'yourname'           => 'Zita:',
-'yourpassword'       => 'Password:',
-'yourpasswordagain'  => 'Nyorazve password:',
+'yourname' => 'Zita:',
+'yourpassword' => 'Password:',
+'yourpasswordagain' => 'Nyorazve password:',
 'remembermypassword' => 'Ndiyeuke (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'              => 'Gamuchirwa',
-'userlogin'          => 'Gamuchirwa / Gadzira Akaunzi',
-'logout'             => 'Chibuda',
-'userlogout'         => 'Chibuda',
-'notloggedin'        => 'Hauna kugamuchirwa',
-'createaccount'      => 'Gadzira Akaunzi',
+'login' => 'Gamuchirwa',
+'userlogin' => 'Gamuchirwa / Gadzira Akaunzi',
+'logout' => 'Chibuda',
+'userlogout' => 'Chibuda',
+'notloggedin' => 'Hauna kugamuchirwa',
+'createaccount' => 'Gadzira Akaunzi',
 
 # Edit pages
-'summary'     => 'Muchidimbu:',
-'minoredit'   => 'Uku kushandurwa kudiki',
-'watchthis'   => 'Ringa peji rino',
+'summary' => 'Muchidimbu:',
+'minoredit' => 'Uku kushandurwa kudiki',
+'watchthis' => 'Ringa peji rino',
 'savearticle' => 'Kotsa peji',
 'showpreview' => 'Ratidza chipandwa',
-'showdiff'    => 'Ratidza zvasandurwa',
+'showdiff' => 'Ratidza zvasandurwa',
 
 # Search results
 'powersearch' => 'Tsvaga',
 
 # Preferences page
-'mypreferences'     => 'Zvandinosarudza',
-'prefsnologin'      => 'Hauna kugamuchirwa',
-'prefs-rc'          => 'Zvaba Kuchinjwa',
+'mypreferences' => 'Zvandinosarudza',
+'prefsnologin' => 'Hauna kugamuchirwa',
+'prefs-rc' => 'Zvaba Kuchinjwa',
 'searchresultshead' => 'Tsvaga',
-'youremail'         => 'E-mail:',
-'username'          => 'Zita:',
+'youremail' => 'E-mail:',
+'username' => 'Zita:',
 
 # Recent changes
 'recentchanges' => 'Zvaba Kuchinjwa',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Zvinoenderana nezvachinjwa',
-'recentchangeslinked-feed'    => 'Zvinoenderana nezvachinjwa',
+'recentchangeslinked' => 'Zvinoenderana nezvachinjwa',
+'recentchangeslinked-feed' => 'Zvinoenderana nezvachinjwa',
 'recentchangeslinked-toolbox' => 'Zvinoenderana nezvachinjwa',
 
 # Upload
-'upload'          => 'Isa fayera',
-'uploadbtn'       => 'Isa fayera',
-'uploadnologin'   => 'Hauna kugamuchirwa',
+'upload' => 'Isa fayera',
+'uploadbtn' => 'Isa fayera',
+'uploadnologin' => 'Hauna kugamuchirwa',
 'watchthisupload' => 'Ringa peji rino',
 
 # Random page
 'randompage' => 'Peji nhemwa',
 
 # Miscellaneous special pages
-'move'         => 'Chichinura',
+'move' => 'Chichinura',
 'movethispage' => 'Chichinura kupeji iri',
 
 # Watchlist
-'watchlist'     => 'Zvandakarinda',
-'mywatchlist'   => 'Zvandakarinda',
-'watch'         => 'Rinda',
+'watchlist' => 'Zvandakarinda',
+'mywatchlist' => 'Zvandakarinda',
+'watch' => 'Rinda',
 'watchthispage' => 'Ringa peji rino',
 
 # Protect
@@ -160,7 +160,7 @@ Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
 
 # Contributions
 'contributions' => 'Mushandisi Kanzatu',
-'mycontris'     => 'Kanzatu kangu',
+'mycontris' => 'Kanzatu kangu',
 
 'sp-contributions-submit' => 'Tsvaga',
 
@@ -169,18 +169,18 @@ Usakanganwe kuchinga [[Special:Preferences|mapreferences ako {{SITENAME}}]].',
 
 # Move page
 'move-page-legend' => 'Chichinura peji',
-'movepagebtn'      => 'Chichinura peji',
-'movedto'          => 'rachichinurwa ku',
-'movereason'       => 'Chikonzero',
+'movepagebtn' => 'Chichinura peji',
+'movedto' => 'rachichinurwa ku',
+'movereason' => 'Chikonzero',
 
 # Namespace 8 related
 'allmessages' => 'Mashoko esystem',
 
 # Tooltip help for the actions
 'tooltip-pt-preferences' => 'Zvandinosarudza',
-'tooltip-pt-logout'      => 'Chibuda',
-'tooltip-ca-move'        => 'Chichinura kupeji iri',
-'tooltip-p-logo'         => 'Peji Rekutanga',
+'tooltip-pt-logout' => 'Chibuda',
+'tooltip-ca-move' => 'Chichinura kupeji iri',
+'tooltip-p-logo' => 'Peji Rekutanga',
 
 # Table pager
 'table_pager_limit_submit' => 'Enda',
index e92fe25..adf1658 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Abshirdheere
  * @author Maax
  * @author Mimursal
  * @author Yariiska
@@ -154,7 +155,6 @@ $messages = array(
 'qbbrowse' => 'Ka soo raadi',
 'qbedit' => 'Wax ka bedel',
 'qbpageoptions' => 'Boggaan',
-'qbpageinfo' => 'isku xiran',
 'qbmyoptions' => 'Boggageyga',
 'qbspecialpages' => 'Bogaga qaaska ah',
 'faq' => 'SIL',
@@ -338,6 +338,7 @@ Fadlan u sheek [[Special:ListUsers/sysop|maamulaha]], kana digtooneesii URL-ka.'
 'filenotfound' => 'Ma oo san helin  faylka "$1".',
 'fileexistserror' => 'Ma ku qori karin faylka "$1": faylkan wuu jiraa.',
 'unexpected' => 'Qiimo loo maleeneenin: "$1"="$2".',
+'formerror' => 'Qalad: suura gal maaha in la diraa qoraalkaan',
 'badarticleerror' => 'Shaqadaan ma lagu sameyn karo boggaan.',
 'cannotdelete' => 'Boggaan ama file\'ka "$1" mala tirtiri karo.
 waxaa laga yaabaa in oo qof kale tirtiray .',
@@ -366,10 +367,8 @@ Sababta neh waxaa waaye "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Hada waad ka baxday.'''
 
-Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama [[Special:UserLogin|gudaha gal]] adiga oo isticmaalaya magacaagii hore ama mid ka duwan. OGEYSIIS waxaa lagayabaa bogyaasha qaarkood in ay yiraahdaan wali gudaha ayaad ku jirtaa, ilaa inta aad ka nadiifineesid browsahaaga Internetka.",
-'welcomecreation' => "== Soo dhawoow, $1! ==
-Akoon kaada  waa la sameeyay.
-Ha' hilmaamin in aad wax ka bedesho [[Special:Preferences|{{SITENAME}} dooqyadaada]].",
+Waad sii isticmaali kartaa {{SITENAME}} adoona lagu aqoon, ama <span class='plainlinks'>[$1 gudaha gal]</span> adiga oo isticmaalaya magacaagii hore ama mid ka duwan. OGEYSIIS waxaa lagayabaa bogyaasha qaarkood in ay yiraahdaan wali gudaha ayaad ku jirtaa, ilaa inta aad ka nadiifineesid browsahaaga Internetka.",
+'welcomeuser' => 'Soo dhowoow, $1',
 'yourname' => 'Magaca gudagalka:',
 'yourpassword' => 'Eraysir:',
 'yourpasswordagain' => 'Markale qor ereysirka:',
@@ -418,6 +417,7 @@ Sax hingaada, ama  [[Special:UserLogin/signup|samayso magac gudagale ah]].',
 'wrongpasswordempty' => 'Erayga sirta aad qortay wuxuu ahaa ebar. Fadlan iskuday markale.',
 'passwordtooshort' => 'Erayada sirta ah waa in oo ahaadaa ugu yaraan  {{PLURAL:$1|1 xaraf|$1 xarfood}} .',
 'password-name-match' => 'Eraygaaga sirta ah waa in oo ka badalnaadaa magacaaga gudagale',
+'password-login-forbidden' => 'Waxaa laga joojiyey adeegsiga magacaan iyo nambar sirtiisaba.',
 'mailmypassword' => 'E-mail iigu soo dir ereysir cusub',
 'passwordremindertitle' => 'Eraysir ku meelgaar ah oo loogu talagalay {{SITENAME}}',
 'passwordremindertext' => 'Qof (laga yaabo in aad adiga tahay, kana soo galay cinwaanka-IP-ka  $1) ayaa eraysir oo cusub u codsaday  {{SITENAME}}  ($4).
@@ -504,6 +504,7 @@ Ereysirka kumeelgaarka ah: $2',
 'changeemail-newemail' => 'Ciwaan e-mail oo cusub:',
 'changeemail-none' => '(waxna)',
 'changeemail-submit' => 'Bedel e-mailka',
+'changeemail-cancel' => 'Ka noqo',
 
 # Edit page toolbar
 'bold_sample' => 'Far butac ah',
@@ -562,6 +563,7 @@ fadlan ku soo dar faahfaahinta ku qoran kor su'aalo kasto oo sameyso.",
 'whitelistedittext' => 'Waa in aad $1 si aad wax uga bedeshid boggaga.',
 'confirmedittext' => 'Waa in aad xaqiijisaa e-mailkaada inta aadan bogaga wax ka bedelin.
 fadlan ku dar kuna xaqiiji e-mailkaada meesha  [[Special:Preferences|dooqyada gudagalahaaga]].',
+'nosuchsectiontitle' => 'Qaybtaan lama heli karo',
 'nosuchsectiontext' => 'Waxaa baroobeysay in aad wax ka bedesho maqaal jirin.
 Waxaa laga yaabaa in la wareejiyay ama la tirtiray adiga oo fiirinaayo bogga.',
 'loginreqtitle' => 'Waxaa loo baahanyahay gudagalid',
@@ -633,6 +635,7 @@ Tirtiraha iyo wareejinta gudagalaha boggaan waxaad ka arki kartaa meeshaan:",
 'moveddeleted-notice' => 'Boggaan waa la tirtiray.
 Tirtiraha iyo wareejinta gudagalaha boggaan waxaad ka arki kartaa hoostaan.',
 'edit-conflict' => 'Wax bedel isku dhacay',
+'edit-already-exists' => 'Bog cusub lama samayn karo, wuu jiraa bogaan.',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Digniin:''' Aad oo u weyn yahay tusmo'da aad ku dartay.
@@ -737,8 +740,6 @@ sababteeda neh waxaa laga heli kartaa  [{{fullurl:{{#Special:Log}}/delete|page={
 'search-suggest' => 'Waxaa ka waday miyaa: $1',
 'search-interwiki-default' => '$1 natiijooyinka:',
 'search-interwiki-more' => '(wax kale)',
-'search-mwsuggest-enabled' => 'soojeedin',
-'search-mwsuggest-disabled' => 'soojeedin malahan',
 'search-relatedarticle' => 'La xiriiro',
 'searchrelated' => 'La xiriiro',
 'searchall' => 'Dhamaan',
@@ -1392,6 +1393,9 @@ Hadii faylka wax laga badalay sida oo markiisa hore ahaa, waxaa laga yaabaa in e
 'htmlform-reset' => 'Ka noqo wax bedelka',
 'htmlform-selectorother-other' => 'kuwa kale',
 
+# Search suggestions
+'searchsuggest-search' => 'Raadi',
+
 # API errors
 'api-error-copyuploaddisabled' => 'Soo gelinta dhinaca URL-ka waa laga damiyay kombiyuutarkaan',
 'api-error-filename-tooshort' => 'Magaca faylka aad oo u gaabanyahay',
index 2b71faf..4ee00e5 100644 (file)
@@ -360,7 +360,6 @@ $messages = array(
 'qbbrowse' => 'Shfletoni',
 'qbedit' => 'Redaktoni',
 'qbpageoptions' => 'Kjo faqe',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Faqet e mia',
 'qbspecialpages' => 'Faqet speciale',
 'faq' => 'Pyetje që bëhen shpesh',
@@ -383,6 +382,7 @@ $messages = array(
 'namespaces' => 'Hapsirat e emrit',
 'variants' => 'Variante',
 
+'navigation-heading' => 'Menuja e navigimit',
 'errorpagetitle' => 'Gabim',
 'returnto' => 'Kthehuni tek $1',
 'tagline' => 'Nga {{SITENAME}}',
@@ -482,11 +482,11 @@ $1",
 '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}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|ndryshimi i|ndryshimet e}} fundit',
 'youhavenewmessagesmulti' => 'Ju keni mesazhe të reja në $1',
 'editsection' => 'redakto',
-'editold' => 'redaktoni',
-'viewsourceold' => 'Shiko tekstin',
+'editold' => 'redakto',
+'viewsourceold' => 'shiko tekstin',
 'editlink' => 'redakto',
 'viewsourcelink' => 'Shiko tekstin',
 'editsectionhint' => 'Redaktoni seksionin:
@@ -626,11 +626,11 @@ Administratori i cili e mbylli atë e dha këtë shpjegim: "$3".',
 # Login and logout pages
 'logouttext' => "'''Ju keni dalë jashtë.''' 
 
- Ju mund të vazhdoni të përdorni {{SITENAME}} në mënyrë anonime, ose mund të [[Special:UserLogin|identifikoheni përsëri]] si përdoruesi i mëparshëm ose si një përdorues tjetër. 
+ Ju mund të vazhdoni të përdorni {{SITENAME}} në mënyrë anonime, ose mund të <span class='plainlinks'>[$1 identifikoheni përsëri]</span> si përdoruesi i mëparshëm ose si një përdorues tjetër. 
  Kini parasysh që disa faqe mund të shfaqen sikur të ishit i identifikuar derisa të fshini ''cache''-in e shfletuesit tuaj.",
-'welcomecreation' => '== Mirësevini, $1! == 
- Llogaria juaj është krijuar
- Mos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.',
+'welcomeuser' => 'Mirë se vini, $1!',
+'welcomecreation-msg' => 'Llogaria juaj u krijua
+Mos harroni të ndryshoni [[Special:Preferences|{{SITENAME}} preferencat]] tuaja.',
 'yourname' => 'Fusni nofkën tuaj',
 'yourpassword' => 'Fusni fjalëkalimin tuaj',
 'yourpasswordagain' => 'Fusni fjalëkalimin përsëri',
@@ -987,6 +987,9 @@ Duket se është grisur.',
 Ajo tanimë ekziston.',
 'defaultmessagetext' => 'Teksti i porosisë së parazgjedhur',
 
+# Content models
+'content-model-text' => 'tekst i thejshtë',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Kujdes: Kjo faqe ka shumë kërkesa që kërkojnë analizë gramatikore të kushtueshme për sistemin.
 
@@ -1229,8 +1232,6 @@ Kini kujdes se përdorimi i lidhjeve të shfletimit do të ndryshojë përzgjedh
 'search-interwiki-caption' => 'Projekte simotra',
 'search-interwiki-default' => '$1 përfundime:',
 'search-interwiki-more' => '(më shumë)',
-'search-mwsuggest-enabled' => 'me këshilla',
-'search-mwsuggest-disabled' => 'pa këshilla',
 'search-relatedarticle' => 'Të ngjashme',
 'mwsuggest-disable' => 'Çmundësoi sugjerimet AJAX',
 'searcheverything-enable' => 'Kërko në të gjitha hapësirat',
@@ -2218,11 +2219,7 @@ Në qoftë se dëshironi të hiqni një faqe nga lista mbikqyrëse më vonë, sh
 
 'enotif_mailer' => 'Postieri Njoftues i {{SITENAME}}',
 'enotif_reset' => 'Shëno të gjitha faqet e vizituara',
-'enotif_newpagetext' => 'Kjo është një faqe e re.',
 'enotif_impersonal_salutation' => 'Përdorues i {{SITENAME}}',
-'changed' => 'ndryshuar',
-'created' => 'u krijua',
-'enotif_subject' => '{{SITENAME}} faqja $PAGETITLE u $CHANGEDORCREATED prej $PAGEEDITOR',
 'enotif_lastvisited' => 'Shikoni $1 për të gjitha ndryshimet që prej vizitës tuaj të fundit.',
 'enotif_lastdiff' => 'Shikoni $1 për ndryshime.',
 'enotif_anon_editor' => 'përdorues anonim $1',
@@ -2600,7 +2597,7 @@ Regjistri i bllokimeve është poshtë për referncë:',
 'blocklogtext' => 'Ky është një regjistër bllokimesh dhe çbllokimesh të përdoruesve. IP-të e bllokuara automatikisht nuk janë të dhëna. Shikoni dhe [[Special:BlockList|listën e IP-ve të bllokuara]] për një listë të bllokimeve të tanishme.',
 'unblocklogentry' => 'çbllokoi "$1"',
 'block-log-flags-anononly' => 'vetëm anonimët',
-'block-log-flags-nocreate' => 'krijimi i kontove është pamundësuar',
+'block-log-flags-nocreate' => 'krijimi i llogarive është pamundësuar',
 'block-log-flags-noautoblock' => 'vetëbllokimi është pamundësuar',
 'block-log-flags-noemail' => 'posta elektronike është e bllokuar',
 'block-log-flags-nousertalk' => 'nuk mund të redaktojë faqen e tij të diskutimit',
@@ -2853,7 +2850,6 @@ Ju lutemi provoni përsëri.',
 
 # 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".',
@@ -3803,6 +3799,10 @@ Përndryshe, ju mund të formularin e thjeshtë më poshtë. Komenti juaj do të
 'feedback-bugcheck' => 'Shumë mirë! Thjesht kontrolloni që nuk është një nga [$1 problemet e njohura].',
 'feedback-bugnew' => 'E kontrollova. Raporto një problem të ri',
 
+# Search suggestions
+'searchsuggest-search' => 'Kërko',
+'searchsuggest-containing' => 'përmban ...',
+
 # API errors
 'api-error-badaccess-groups' => 'Ju nuk lejoheni të ngarkoni skeda në këtë wiki.',
 'api-error-badtoken' => 'Gabim i brendshëm: Shenjë e keqe.',
index 809a2b5..d4af996 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Serbian (Cyrillic script) (‪српски (ћирилица)‬)
+/** Serbian (Cyrillic script) (српски (ћирилица)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -141,7 +141,6 @@ $specialPageAliases = array(
        'Protectedtitles'           => array( 'Заштићени_наслови' ),
        'Randompage'                => array( 'СлучајнаСтрана', 'Насумична_страница' ),
        'Recentchanges'             => array( 'СкорашњеИзмене', 'Скорашње_измене' ),
-       'RevisionMove'              => array( 'Премести_измену' ),
        'Search'                    => array( 'Претражи' ),
        'Shortpages'                => array( 'КраткиЧланци' ),
        'Specialpages'              => array( 'СпецијалнеСтране', 'Посебне_странице' ),
@@ -252,7 +251,6 @@ $magicWords = array(
        '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' ),
@@ -443,7 +441,7 @@ $messages = array(
 
 'underline-always' => 'увек подвлачи',
 'underline-never' => 'никад не подвлачи',
-'underline-default' => 'по поставкама прегледача',
+'underline-default' => 'према теми или прегледачу',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Изглед фонта у уређивачком оквиру:',
@@ -541,7 +539,6 @@ $messages = array(
 'qbbrowse' => 'Потражи',
 'qbedit' => 'Уреди',
 'qbpageoptions' => 'Поставке странице',
-'qbpageinfo' => 'Садржај странице',
 'qbmyoptions' => 'Моје странице',
 'qbspecialpages' => 'Посебне странице',
 'faq' => 'НПП',
@@ -554,7 +551,7 @@ $messages = array(
 'vector-action-protect' => 'Заштити',
 'vector-action-undelete' => 'Врати',
 'vector-action-unprotect' => 'Промени заштиту',
-'vector-simplesearch-preference' => 'Ð\9fобоÑ\99Ñ\88ани Ð¿Ñ\80едлози Ð¿Ñ\80еÑ\82Ñ\80аге (само за тему „Векторско“)',
+'vector-simplesearch-preference' => 'УпÑ\80оÑ\88Ñ\9bено Ð¿Ð¾Ñ\99е Ð·Ð° Ð¿Ñ\80еÑ\82Ñ\80агÑ\83 (само за тему „Векторско“)',
 'vector-view-create' => 'Направи',
 'vector-view-edit' => 'Уреди',
 'vector-view-history' => 'Историја',
@@ -813,12 +810,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Одјављени сте.'''
 
-Можете да наставите с коришћењем овог викија као гост, или се [[Special:UserLogin|поново пријавите]] као други корисник.
+Можете да наставите с коришћењем овог викија као гост, или се <span class='plainlinks'>[$1 поново пријавите]</span> као други корисник.
 Имајте на уму да неке странице могу наставити да се приказују као да сте још пријављени, све док не очистите привремену меморију свог прегледача.",
-'welcomecreation' => '== Добро дошли, $1! ==
-
-Ваш налог је отворен.
-Не заборавите да прилагодите своја [[Special:Preferences|подешавања]].',
 'yourname' => 'Корисничко име:',
 'yourpassword' => 'Лозинка:',
 'yourpasswordagain' => 'Потврда лозинке:',
@@ -1023,14 +1016,14 @@ $2
 'blockedtitle' => 'Корисник је блокиран',
 'blockedtext' => "'''Ваше корисничко име или ИП адреса је блокирана.'''
 
-Блокирање је {{GENDER:$1|извршио|извршила|извршио}} $1.
+Блокирање је {{GENDER:$4|извршио|извршила|извршио}} $1.
 Разлог: ''$2''.
 
 * Датум блокирања: $8
 * Блокирање истиче: $6
 * Име корисника: $7
 
-Обратите се {{GENDER:$1|кориснику|корисници|кориснику}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.
+Обратите се {{GENDER:$4|кориснику|корисници|кориснику}} $1 или [[{{MediaWiki:Grouppage-sysop}}|администратору]] да разјасните ствар.
 Не можете користити могућност „Пошаљи поруку овом кориснику“ ако нисте унели исправну е-адресу у [[Special:Preferences|подешавањима]].
 Ваша блокирана ИП адреса је $3, а ИБ $5.
 Наведите све податке изнад при стварања било каквих упита.",
@@ -1106,7 +1099,7 @@ $2
 'note' => "'''Напомена:'''",
 'previewnote' => "'''Имајте у виду да је ово само преглед.'''
 Ваше измене још нису сачуване!",
-'continue-editing' => 'Ð\9dаÑ\81Ñ\82ави Ñ\83Ñ\80еÑ\92иваÑ\9aе',
+'continue-editing' => 'Ð\98ди Ð½Ð° Ñ\83Ñ\80еÑ\92иваÑ\87ки Ð¾ÐºÐ²Ð¸Ñ\80',
 'previewconflict' => 'Овај преглед осликава како ће текст у текстуалном оквиру изгледати.',
 'session_fail_preview' => "'''Нисмо могли да обрадимо вашу измену због губитка података сесије.'''
 Покушајте поново.
@@ -1190,6 +1183,15 @@ $2
 'edit-already-exists' => 'Не могу да направим страницу.
 Изгледа да она већ постоји.',
 'defaultmessagetext' => 'Подразумевани текст поруке',
+'content-failed-to-parse' => 'Не могу да рашчланим садржај типа $2 за модел $1: $3',
+'invalid-content-data' => 'Неисправни подаци садржаја',
+'content-not-allowed-here' => 'Садржај модела „$1“ није дозвољен на страници [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'викитекст',
+'content-model-text' => 'чист текст',
+'content-model-javascript' => 'јаваскрипт',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Упозорење:''' ова страница садржи превише позива за рашчлањивање.
@@ -1448,8 +1450,6 @@ $1",
 'search-interwiki-caption' => 'Братски пројекти',
 'search-interwiki-default' => '$1 резултати:',
 'search-interwiki-more' => '(више)',
-'search-mwsuggest-enabled' => 'са предлозима',
-'search-mwsuggest-disabled' => 'без предлога',
 'search-relatedarticle' => 'Повезано',
 'mwsuggest-disable' => 'Онемогући предлоге AJAX',
 'searcheverything-enable' => 'сви именски простори',
@@ -1722,6 +1722,9 @@ $1",
 'rightslogtext' => 'Ово је дневник измена корисничких права.',
 'rightslogentry' => '{{GENDER:|је променио|је променила|је променио}} права за члана $1 из $2 у $3',
 'rightslogentry-autopromote' => 'је унапређен из $2 у $3',
+'logentry-rights-rights' => '$1 {{GENDER:$1|је променио|је променила|је променио}} чланство групе за $3 из $4 у $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|је променио|је променила|је променио}} чланство групе за $3',
+'logentry-rights-autopromote' => '$1 је аутоматски {{GENDER:$1|унапређен|унапређена|унапређен}} из $4 у $5',
 'rightsnone' => '(ништа)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -2128,7 +2131,7 @@ $1',
 'shared-repo' => 'заједничко складиште',
 'shared-repo-name-wikimediacommons' => 'Викимедијина остава',
 'filepage.css' => '/* CSS који је постављен овде се налази на страницама за опис датотека, као и на страним викијима */',
-'upload-disallowed-here' => 'Ð\9dажалоÑ\81Ñ\82, Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ\82е Ð¾Ð²Ñ\83 Ñ\81лику.',
+'upload-disallowed-here' => 'Ð\9dе Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð° Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ\82е Ð¾Ð²Ñ\83 Ð´Ð°Ñ\82оÑ\82еку.',
 
 # File reversion
 'filerevert' => 'Врати $1',
@@ -2369,7 +2372,7 @@ $1',
 'linksearch-ok' => 'Претражи',
 'linksearch-text' => 'Могу се користити џокери попут „*.wikipedia.org“.<br />
 Потребан је највиши домен, као „*.org“.<br />
\9fодÑ\80жани Ð¿Ñ\80оÑ\82околи: <code>$1</code> (не Ñ\81Ñ\82авÑ\99аÑ\98Ñ\82е Ñ\83 Ð¿Ñ\80еÑ\82Ñ\80агÑ\83)',
\9fодÑ\80жани Ð¿Ñ\80оÑ\82околи: <code>$1</code> (задаÑ\98е http:// Ð°ÐºÐ¾ Ð½Ðµ Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð¿Ñ\80оÑ\82окол).',
 'linksearch-line' => '$1 веза у $2',
 'linksearch-error' => 'Џокери се могу појавити само на почетку адресе.',
 
@@ -2420,8 +2423,8 @@ $1',
 'emailuser-title-target' => 'Слање е-поруке {{GENDER:$1|кориснику|корисници|кориснику}}',
 'emailuser-title-notarget' => 'Слање е-поруке кориснику',
 'emailpage' => 'Слање е-порука',
-'emailpagetext' => 'Ð\9aоÑ\80иÑ\81Ñ\82иÑ\82е Ð¾Ð²Ð°Ñ\98 Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83кÑ\83 Ð¾Ð²Ð¾Ð¼ ÐºÐ¾Ñ\80иÑ\81никÑ\83.
-Е-адреса коју сте унели у [[Special:Preferences|подешавањима]] ће бити приказана као адреса пошиљаоца, тако да ће прималац поруке моћи да вам одговори.',
+'emailpagetext' => 'Ð\9cожеÑ\82е Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð´Ð¾Ñ\9aи Ð¾Ð±Ñ\80азаÑ\86 Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99еÑ\82е Ðµ-поÑ\80Ñ\83кÑ\83 {{GENDER:$1|овом ÐºÐ¾Ñ\80иÑ\81никÑ\83|овоÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\86и|овом ÐºÐ¾Ñ\80иÑ\81никÑ\83|}}.
+Е-адреса коју сте унели у вашим [[Special:Preferences|подешавањима]] ће се приказати у пољу „Од“, тако да ће прималац моћи да вам одговори директно.',
 'usermailererror' => 'Дошло је до грешке при слању поруке:',
 'defemailsubject' => '{{SITENAME}} е-адреса {{GENDER:$1|корисника|кориснице|корисника}} $1',
 'usermaildisabled' => 'Корисничка е-пошта је онемогућена',
@@ -2491,11 +2494,7 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} е-обавештење',
 'enotif_reset' => 'Означи све странице као посећене',
-'enotif_newpagetext' => 'Ово је нова страница.',
 'enotif_impersonal_salutation' => '{{SITENAME}} корисник',
-'changed' => 'измењена',
-'created' => 'направљена',
-'enotif_subject' => '{{SITENAME}} страница $PAGETITLE је $CHANGEDORCREATED од стране $PAGEEDITOR',
 'enotif_lastvisited' => 'Погледајте $1 за све измене од ваше последње посете.',
 'enotif_lastdiff' => 'Погледајте $1 да видите ову измену.',
 'enotif_anon_editor' => 'анониман корисник $1',
@@ -2685,7 +2684,8 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|Измена је враћена|$1 измене су враћене|$1 измена је враћено}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|измена|измене|измена}} и $2 {{PLURAL:$2|датотека|датотеке|датотека}} је враћено',
 'undeletedfiles' => '{{PLURAL:$1|Датотека је враћена|$1 датотеке су враћене|$1 датотека је враћено}}',
-'cannotundelete' => 'Неуспешно враћање. Неко други је то урадио пре вас.',
+'cannotundelete' => 'Враћање није успело:
+$1',
 'undeletedpage' => "'''Страница $1 је враћена'''
 
 Погледајте [[Special:Log/delete|историју брисања]] за записе о скорашњим брисањима и враћањима.",
@@ -2752,14 +2752,14 @@ $1',
 'nolinkshere-ns' => "Ниједна страница не води до '''[[:$1]]''' у изабраном именском простору.",
 'isredirect' => 'преусмерење',
 'istemplate' => 'укључивање',
-'isimage' => 'веза ÐºÐ° Ð´Ð°Ñ\82оÑ\82еÑ\86и',
+'isimage' => 'веза Ð´Ð¾ Ð´Ð°Ñ\82оÑ\82еке',
 '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-hideimages' => '$1 везе до датотеке',
 'whatlinkshere-filters' => 'Филтери',
 
 # Block/unblock
@@ -2996,6 +2996,7 @@ $1',
 'immobile-target-namespace-iw' => 'Међувики веза није исправно одредиште за премештање странице.',
 'immobile-source-page' => 'Ова страница се не може преместити.',
 'immobile-target-page' => 'Не могу да преместим на жељени наслов.',
+'bad-target-model' => 'Жељено одредиште користи другачији модел садржаја. Не могу да претворим из $1 у $2.',
 'imagenocrossnamespace' => 'Датотека се не може преместити у именски простор који не припада датотекама.',
 'nonfile-cannot-move-to-file' => 'Не-датотеке не можете преместити у именски простор за датотеке',
 'imagetypemismatch' => 'Екстензија нове датотеке се не поклапа с њеном врстом',
@@ -3126,7 +3127,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Јаваскрипт тест',
-'javascripttest-disabled' => 'Ова функција није омогућена на овом викију.',
 'javascripttest-title' => 'Извршавање тестова за $1',
 'javascripttest-pagetext-noframework' => 'Ова страница је резервисана за извршавање јаваскрипт тестова.',
 'javascripttest-pagetext-unknownframework' => 'Непознати радни оквир „$1“.',
@@ -3266,6 +3266,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'Подаци о „$1“',
+'pageinfo-not-current' => 'Нажалост, немогуће је прибавити ове податке за старије измене.',
 'pageinfo-header-basic' => 'Основни подаци',
 'pageinfo-header-edits' => 'Историја измена',
 'pageinfo-header-restrictions' => 'Заштита странице',
@@ -3274,6 +3275,7 @@ $1',
 'pageinfo-default-sort' => 'Подразумевани кључ сортирања',
 'pageinfo-length' => 'Дужина странице (у бајтовима)',
 'pageinfo-article-id' => 'ИД странице',
+'pageinfo-language' => 'Језик садржаја странице',
 'pageinfo-robot-policy' => 'Статус претраживача',
 'pageinfo-robot-index' => 'Може да се попише',
 'pageinfo-robot-noindex' => 'Не може да се попише',
@@ -3290,10 +3292,17 @@ $1',
 'pageinfo-authors' => 'Број засебних аутора',
 'pageinfo-recent-edits' => 'Број скорашњих измена (у последњих $1)',
 'pageinfo-recent-authors' => 'Број скорашњих засебних аутора',
-'pageinfo-restriction' => 'Заштита странице ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Магична реч|Магичне речи}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Сакривена категорија|Сакривене категорије}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Укључени шаблон|Укључени шаблони}} ($1)',
+'pageinfo-toolboxlink' => 'Подаци о страници',
+'pageinfo-redirectsto' => 'Преусмерава на',
+'pageinfo-redirectsto-info' => 'подаци',
+'pageinfo-contentpage' => 'Рачуна се као страница са садржајем',
+'pageinfo-contentpage-yes' => 'Да',
+'pageinfo-protect-cascading' => 'Преносива заштита страница важи одавде',
+'pageinfo-protect-cascading-yes' => 'Да',
+'pageinfo-protect-cascading-from' => 'Странице са преносивом заштитом од',
 
 # Skin names
 'skinname-standard' => 'Класично',
@@ -3316,6 +3325,8 @@ $1',
 'markedaspatrollederror' => 'Не могу да означим као патролирано',
 'markedaspatrollederrortext' => 'Морате изабрати измену да бисте је означили као прегледану.',
 'markedaspatrollederror-noautopatrol' => 'Не можете да означите своје измене као патролиране.',
+'markedaspatrollednotify' => 'Ова измена на страници $1 је означена као прегледана.',
+'markedaspatrollederrornotify' => 'Није успешно означавање ове страницее као прегледаном.',
 
 # Patrol log
 'patrol-log-page' => 'Дневник патролирања',
@@ -3975,6 +3986,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[Међувики укључивање шаблона је онемогућено]',
 'scarytranscludefailed' => '[Добављање шаблона за $1 није успело]',
+'scarytranscludefailed-httpstatus' => '[Не могу да преузмем шаблон $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL адреса је предугачка]',
 
 # Delete conflict
@@ -4166,6 +4178,7 @@ $5
 'version-license' => 'Лиценца',
 'version-poweredby-credits' => "Овај вики покреће '''[//www.mediawiki.org/ Медијавики]''', ауторска права © 2001-$1 $2.",
 'version-poweredby-others' => 'остали',
+'version-credits-summary' => 'Желели бисмо да захвалимо следећим људима на њиховом доприносу [[Special:Version|Медијавикији]].',
 'version-license-info' => 'Медијавики је слободан софтвер; можете га расподељивати и мењати под условима ГНУ-ове опште јавне лиценце (ОЈЛ) коју је објавила Задужбина за слободан софтвер, било да је у питању друго или новије издање лиценце.
 
 Медијавики се нуди у нади да ће бити од користи, али БЕЗ ИКАКВЕ ГАРАНЦИЈЕ; чак и без подразумеване гаранције о ПРОДАЈНОЈ ВРЕДНОСТИ или ПОГОДНОСТИ ЗА ОДРЕЂЕНЕ НАМЕНЕ. Погледајте ГНУ-ову општу јавну лиценцу за више информација.
@@ -4327,6 +4340,10 @@ $5
 'feedback-bugcheck' => 'Одлично! Проверите да ли је грешка [$1 позната од пре].',
 'feedback-bugnew' => 'Проверено. Пријави нову грешку',
 
+# Search suggestions
+'searchsuggest-search' => 'Претрага',
+'searchsuggest-containing' => 'садржи...',
+
 # API errors
 'api-error-badaccess-groups' => 'Није вам дозвољено да отпремате датотеке на овај вики.',
 'api-error-badtoken' => 'Унутрашња грешка: неисправан жетон.',
index 5190466..06943a5 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Serbian (Latin script) (‪srpski (latinica)‬)
+/** Serbian (Latin script) (srpski (latinica)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -164,7 +164,6 @@ $magicWords = array(
        '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' ),
@@ -352,7 +351,7 @@ $messages = array(
 
 'underline-always' => 'uvek podvlači',
 'underline-never' => 'nikad ne podvlači',
-'underline-default' => 'po postavkama pregledača',
+'underline-default' => 'prema temi ili pregledaču',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Izgled fonta u uređivačkom okviru:',
@@ -450,7 +449,6 @@ $messages = array(
 'qbbrowse' => 'Potraži',
 'qbedit' => 'Uredi',
 'qbpageoptions' => 'Postavke stranice',
-'qbpageinfo' => 'Sadržaj stranice',
 'qbmyoptions' => 'Moje stranice',
 'qbspecialpages' => 'Posebne stranice',
 'faq' => 'NPP',
@@ -463,7 +461,7 @@ $messages = array(
 'vector-action-protect' => 'Zaštiti',
 'vector-action-undelete' => 'Vrati',
 'vector-action-unprotect' => 'Promeni zaštitu',
-'vector-simplesearch-preference' => 'Poboljšani predlozi pretrage (samo za temu „Vektorsko“)',
+'vector-simplesearch-preference' => 'Uprošćeno polje za pretragu (samo za temu „Vektorsko“)',
 'vector-view-create' => 'Napravi',
 'vector-view-edit' => 'Uredi',
 'vector-view-history' => 'Istorija',
@@ -722,12 +720,8 @@ Administrator koji ju je zaključao ponudio je sledeće objašnjenje: „$3“.'
 # Login and logout pages
 'logouttext' => "'''Odjavljeni ste.'''
 
-Možete da nastavite s korišćenjem ovog vikija kao gost, ili se [[Special:UserLogin|ponovo prijavite]] kao drugi korisnik.
+Možete da nastavite s korišćenjem ovog vikija kao gost, ili se <span class='plainlinks'>[$1 ponovo prijavite]</span> kao drugi korisnik.
 Imajte na umu da neke stranice mogu nastaviti da se prikazuju kao da ste još prijavljeni, sve dok ne očistite privremenu memoriju svog pregledača.",
-'welcomecreation' => '== Dobro došli, $1! ==
-
-Vaš nalog je otvoren.
-Ne zaboravite da prilagodite svoja [[Special:Preferences|podešavanja]].',
 'yourname' => 'Korisničko ime:',
 'yourpassword' => 'Lozinka:',
 'yourpasswordagain' => 'Potvrda lozinke:',
@@ -932,14 +926,14 @@ Ako ponovo kliknete na „{{int:savearticle}}“, vaša izmena će biti sačuvan
 'blockedtitle' => 'Korisnik je blokiran',
 'blockedtext' => "'''Vaše korisničko ime ili IP adresa je blokirana.'''
 
-Blokiranje je {{GENDER:$1|izvršio|izvršila|izvršio}} $1.
+Blokiranje je {{GENDER:$4|izvršio|izvršila|izvršio}} $1.
 Razlog: ''$2''.
 
 * Datum blokiranja: $8
 * Blokiranje ističe: $6
 * Ime korisnika: $7
 
-Obratite se {{GENDER:$1|korisniku|korisnici|korisniku}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.
+Obratite se {{GENDER:$4|korisniku|korisnici|korisniku}} $1 ili [[{{MediaWiki:Grouppage-sysop}}|administratoru]] da razjasnite stvar.
 Ne možete koristiti mogućnost „Pošalji poruku ovom korisniku“ ako niste uneli ispravnu e-adresu u [[Special:Preferences|podešavanjima]].
 Vaša blokirana IP adresa je $3, a IB $5.
 Navedite sve podatke iznad pri stvaranja bilo kakvih upita.",
@@ -1015,7 +1009,7 @@ Prilagođene stranice CSS i javaskript počinju malim slovom, npr. {{ns:user}}:F
 'note' => "'''Napomena:'''",
 'previewnote' => "'''Imajte u vidu da je ovo samo pregled.'''
 Vaše izmene još nisu sačuvane!",
-'continue-editing' => 'Nastavi uređivanje',
+'continue-editing' => 'Idi na uređivački okvir',
 'previewconflict' => 'Ovaj pregled oslikava kako će tekst u tekstualnom okviru izgledati.',
 'session_fail_preview' => "'''Nismo mogli da obradimo vašu izmenu zbog gubitka podataka sesije.'''
 Pokušajte ponovo.
@@ -1099,6 +1093,15 @@ Izgleda da je obrisana.',
 'edit-already-exists' => 'Ne mogu da napravim stranicu.
 Izgleda da ona već postoji.',
 'defaultmessagetext' => 'Podrazumevani tekst poruke',
+'content-failed-to-parse' => 'Ne mogu da raščlanim sadržaj tipa $2 za model $1: $3',
+'invalid-content-data' => 'Neispravni podaci sadržaja',
+'content-not-allowed-here' => 'Sadržaj modela „$1“ nije dozvoljen na stranici [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'vikitekst',
+'content-model-text' => 'čist tekst',
+'content-model-javascript' => 'javaskript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Upozorenje:''' ova stranica sadrži previše poziva za raščlanjivanje.
@@ -1357,8 +1360,6 @@ Više informacija možete pronaći u [{{fullurl:{{#Special:Log}}/delete|page={{F
 'search-interwiki-caption' => 'Bratski projekti',
 'search-interwiki-default' => '$1 rezultati:',
 'search-interwiki-more' => '(više)',
-'search-mwsuggest-enabled' => 'sa predlozima',
-'search-mwsuggest-disabled' => 'bez predloga',
 'search-relatedarticle' => 'Povezano',
 'mwsuggest-disable' => 'Onemogući predloge AJAX',
 'searcheverything-enable' => 'svi imenski prostori',
@@ -1631,6 +1632,9 @@ Ako izaberete da ga unesete, ono će biti korišćeno za pripisivanje vašeg rad
 'rightslogtext' => 'Ovo je dnevnik izmena korisničkih prava.',
 'rightslogentry' => '{{GENDER:|je promenio|je promenila|je promenio}} prava za člana $1 iz $2 u $3',
 'rightslogentry-autopromote' => 'je unapređen iz $2 u $3',
+'logentry-rights-rights' => '$1 {{GENDER:$1|je promenio|je promenila|je promenio}} članstvo grupe za $3 iz $4 u $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|je promenio|je promenila|je promenio}} članstvo grupe za $3',
+'logentry-rights-autopromote' => '$1 je automatski {{GENDER:$1|unapređen|unapređena|unapređen}} iz $4 u $5',
 'rightsnone' => '(ništa)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -2037,7 +2041,7 @@ Njen opis možete da izmenite na [$2 odgovarajućoj stranici].',
 'shared-repo' => 'zajedničko skladište',
 'shared-repo-name-wikimediacommons' => 'Vikimedijina ostava',
 'filepage.css' => '/* CSS koji je postavljen ovde se nalazi na stranicama za opis datoteka, kao i na stranim vikijima */',
-'upload-disallowed-here' => 'Nažalost, ne možete da zamenite ovu sliku.',
+'upload-disallowed-here' => 'Ne možete da zamenite ovu datoteku.',
 
 # File reversion
 'filerevert' => 'Vrati $1',
@@ -2278,7 +2282,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: <code>$1</code> (ne stavljajte u pretragu)',
+Podržani protokoli: <code>$1</code> (zadaje http:// ako ne navedete protokol).',
 'linksearch-line' => '$1 veza u $2',
 'linksearch-error' => 'Džokeri se mogu pojaviti samo na početku adrese.',
 
@@ -2329,8 +2333,8 @@ Pogledajte [[{{MediaWiki:Listgrouprights-helppage}}|više detalja]] o pojedinač
 'emailuser-title-target' => 'Slanje e-poruke {{GENDER:$1|korisniku|korisnici|korisniku}}',
 'emailuser-title-notarget' => 'Slanje e-poruke korisniku',
 'emailpage' => 'Slanje e-poruka',
-'emailpagetext' => 'Koristite ovaj obrazac da pošaljete e-poruku ovom korisniku.
-E-adresa koju ste uneli u [[Special:Preferences|podešavanjima]] će biti prikazana kao adresa pošiljaoca, tako da će primalac poruke moći da vam odgovori.',
+'emailpagetext' => 'Možete da koristite donji obrazac da pošaljete e-poruku {{GENDER:$1|ovom korisniku|ovoj korisnici|ovom korisniku|}}.
+E-adresa koju ste uneli u vašim [[Special:Preferences|podešavanjima]] će se prikazati u polju „Od“, tako da će primalac moći da vam odgovori direktno.',
 'usermailererror' => 'Došlo je do greške pri slanju poruke:',
 'defemailsubject' => '{{SITENAME}} e-adresa {{GENDER:$1|korisnika|korisnice|korisnika}} $1',
 'usermaildisabled' => 'Korisnička e-pošta je onemogućena',
@@ -2400,11 +2404,7 @@ Ukoliko budete želeli da uklonite stranicu sa spiska nadgledanja, kliknite opet
 
 'enotif_mailer' => '{{SITENAME}} e-obaveštenje',
 'enotif_reset' => 'Označi sve stranice kao posećene',
-'enotif_newpagetext' => 'Ovo je nova stranica.',
 'enotif_impersonal_salutation' => '{{SITENAME}} korisnik',
-'changed' => 'izmenjena',
-'created' => 'napravljena',
-'enotif_subject' => '{{SITENAME}} stranica $PAGETITLE je $CHANGEDORCREATED od strane $PAGEEDITOR',
 'enotif_lastvisited' => 'Pogledajte $1 za sve izmene od vaše poslednje posete.',
 'enotif_lastdiff' => 'Pogledajte $1 da vidite ovu izmenu.',
 'enotif_anon_editor' => 'anoniman korisnik $1',
@@ -2594,7 +2594,8 @@ Možda ste uneli pogrešnu vezu, ili je izmena vraćena ili uklonjena iz arhive.
 'undeletedrevisions' => '{{PLURAL:$1|Izmena je vraćena|$1 izmene su vraćene|$1 izmena je vraćeno}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|izmena|izmene|izmena}} i $2 {{PLURAL:$2|datoteka|datoteke|datoteka}} je vraćeno',
 'undeletedfiles' => '{{PLURAL:$1|Datoteka je vraćena|$1 datoteke su vraćene|$1 datoteka je vraćeno}}',
-'cannotundelete' => 'Neuspešno vraćanje. Neko drugi je to uradio pre vas.',
+'cannotundelete' => 'Vraćanje nije uspelo:
+$1',
 'undeletedpage' => "'''Stranica $1 je vraćena'''
 
 Pogledajte [[Special:Log/delete|istoriju brisanja]] za zapise o skorašnjim brisanjima i vraćanjima.",
@@ -2668,7 +2669,7 @@ Izveštaj o blokiranim korisnicima se nalazi ispod:',
 'whatlinkshere-hideredirs' => '$1 preusmerenja',
 'whatlinkshere-hidetrans' => '$1 uključivanja',
 'whatlinkshere-hidelinks' => '$1 veze',
-'whatlinkshere-hideimages' => '$1 veze do slika',
+'whatlinkshere-hideimages' => '$1 veze do datoteke',
 'whatlinkshere-filters' => 'Filteri',
 
 # Block/unblock
@@ -2905,6 +2906,7 @@ ne mogu da premestim stranicu preko same sebe.',
 'immobile-target-namespace-iw' => 'Međuviki veza nije ispravno odredište za premeštanje stranice.',
 'immobile-source-page' => 'Ova stranica se ne može premestiti.',
 'immobile-target-page' => 'Ne mogu da premestim na željeni naslov.',
+'bad-target-model' => 'Željeno odredište koristi drugačiji model sadržaja. Ne mogu da pretvorim iz $1 u $2.',
 'imagenocrossnamespace' => 'Datoteka se ne može premestiti u imenski prostor koji ne pripada datotekama.',
 'nonfile-cannot-move-to-file' => 'Ne-datoteke ne možete premestiti u imenski prostor za datoteke',
 'imagetypemismatch' => 'Ekstenzija nove datoteke se ne poklapa s njenom vrstom',
@@ -3035,7 +3037,6 @@ Pokušajte ponovo.',
 
 # JavaScriptTest
 'javascripttest' => 'Javaskript test',
-'javascripttest-disabled' => 'Ova funkcija nije omogućena na ovom vikiju.',
 'javascripttest-title' => 'Izvršavanje testova za $1',
 'javascripttest-pagetext-noframework' => 'Ova stranica je rezervisana za izvršavanje javaskript testova.',
 'javascripttest-pagetext-unknownframework' => 'Nepoznati radni okvir „$1“.',
@@ -3175,6 +3176,7 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 
 # Info page
 'pageinfo-title' => 'Podaci o „$1“',
+'pageinfo-not-current' => 'Nažalost, nemoguće je pribaviti ove podatke za starije izmene.',
 'pageinfo-header-basic' => 'Osnovni podaci',
 'pageinfo-header-edits' => 'Istorija izmena',
 'pageinfo-header-restrictions' => 'Zaštita stranice',
@@ -3183,6 +3185,7 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-default-sort' => 'Podrazumevani ključ sortiranja',
 'pageinfo-length' => 'Dužina stranice (u bajtovima)',
 'pageinfo-article-id' => 'ID stranice',
+'pageinfo-language' => 'Jezik sadržaja stranice',
 'pageinfo-robot-policy' => 'Status pretraživača',
 'pageinfo-robot-index' => 'Može da se popiše',
 'pageinfo-robot-noindex' => 'Ne može da se popiše',
@@ -3199,10 +3202,17 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'pageinfo-authors' => 'Broj zasebnih autora',
 'pageinfo-recent-edits' => 'Broj skorašnjih izmena (u poslednjih $1)',
 'pageinfo-recent-authors' => 'Broj skorašnjih zasebnih autora',
-'pageinfo-restriction' => 'Zaštita stranice ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magična reč|Magične reči}} ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Sakrivena kategorija|Sakrivene kategorije}} ($1)',
 'pageinfo-templates' => '{{PLURAL:$1|Uključeni šablon|Uključeni šabloni}} ($1)',
+'pageinfo-toolboxlink' => 'Podaci o stranici',
+'pageinfo-redirectsto' => 'Preusmerava na',
+'pageinfo-redirectsto-info' => 'podaci',
+'pageinfo-contentpage' => 'Računa se kao stranica sa sadržajem',
+'pageinfo-contentpage-yes' => 'Da',
+'pageinfo-protect-cascading' => 'Prenosiva zaštita stranica važi odavde',
+'pageinfo-protect-cascading-yes' => 'Da',
+'pageinfo-protect-cascading-from' => 'Stranice sa prenosivom zaštitom od',
 
 # Skin names
 'skinname-standard' => 'Klasično',
@@ -3225,6 +3235,8 @@ Ovo je verovatno izazvano vezom do spoljašnjeg sajta koji se nalazi na crnoj li
 'markedaspatrollederror' => 'Ne mogu da označim kao patrolirano',
 'markedaspatrollederrortext' => 'Morate izabrati izmenu da biste je označili kao pregledanu.',
 'markedaspatrollederror-noautopatrol' => 'Ne možete da označite svoje izmene kao patrolirane.',
+'markedaspatrollednotify' => 'Ova izmena na stranici $1 je označena kao pregledana.',
+'markedaspatrollederrornotify' => 'Nije uspešno označavanje ove stranice kao pregledanom.',
 
 # Patrol log
 'patrol-log-page' => 'Dnevnik patroliranja',
@@ -3884,6 +3896,7 @@ Ovaj potvrdni kod ističe $6 u $7.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Međuviki uključivanje šablona je onemogućeno]',
 'scarytranscludefailed' => '[Dobavljanje šablona za $1 nije uspelo]',
+'scarytranscludefailed-httpstatus' => '[Ne mogu da preuzmem šablon $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL adresa je predugačka]',
 
 # Delete conflict
@@ -4075,6 +4088,7 @@ Možete da [[Special:EditWatchlist|koristite i običan uređivač]].',
 'version-license' => 'Licenca',
 'version-poweredby-credits' => "Ovaj viki pokreće '''[//www.mediawiki.org/ Medijaviki]''', autorska prava © 2001-$1 $2.",
 'version-poweredby-others' => 'ostali',
+'version-credits-summary' => 'Želeli bismo da zahvalimo sledećim ljudima na njihovom doprinosu [[Special:Version|Medijavikiji]].',
 'version-license-info' => 'Medijaviki je slobodan softver; možete ga raspodeljivati i menjati pod uslovima GNU-ove opšte javne licence (OJL) koju je objavila Zadužbina za slobodan softver, bilo da je u pitanju drugo ili novije izdanje licence.
 
 Medijaviki se nudi u nadi da će biti od koristi, ali BEZ IKAKVE GARANCIJE; čak i bez podrazumevane garancije o PRODAJNOJ VREDNOSTI ili POGODNOSTI ZA ODREĐENE NAMENE. Pogledajte GNU-ovu opštu javnu licencu za više informacija.
@@ -4236,6 +4250,10 @@ U suprotnom, poslužite se jednostavnim obrascem ispod. Vaš komentar će stajat
 'feedback-bugcheck' => 'Odlično! Proverite da li je greška [$1 poznata od pre].',
 'feedback-bugnew' => 'Provereno. Prijavi novu grešku',
 
+# Search suggestions
+'searchsuggest-search' => 'Pretraga',
+'searchsuggest-containing' => 'sadrži...',
+
 # API errors
 'api-error-badaccess-groups' => 'Nije vam dozvoljeno da otpremate datoteke na ovaj viki.',
 'api-error-badtoken' => 'Unutrašnja greška: neispravan žeton.',
index 9918087..9bcadf5 100644 (file)
@@ -279,7 +279,6 @@ $messages = array(
 'qbbrowse' => 'Browse',
 'qbedit' => 'Kenki',
 'qbpageoptions' => 'A papira disi',
-'qbpageinfo' => 'Abra a papira',
 'qbmyoptions' => 'Mi papira',
 'qbspecialpages' => 'Spesrutu papira',
 'faq' => 'FAQ (Sani di ben aksi furu)',
@@ -443,9 +442,6 @@ Fu san ede: ''$2''.",
 
 Yu kan tan kebroiki {{SITENAME}} sondro nen, noso yu kan psa kon baka leki a srefi noso wan tra kebroikiman.
 Sabi taki a kan gersi leki yu psa kon ete, te leki yu leygi a cache fu yu browser.",
-'welcomecreation' => '== Welkom, $1! ==
-Yu account meki now.
-No fergiti fu kenki den seti fu yu gi {{SITENAME}}.',
 'yourname' => 'Kebroikiman nen:',
 'yourpassword' => 'Psa wortu:',
 'yourpasswordagain' => 'Psa wortu ete wan leysi:',
index 6531481..9cd3dfe 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'LiSontfo',
-'monday'        => 'Msombuluko',
-'tuesday'       => 'Lesibili',
-'wednesday'     => 'Lesitsatfu',
-'thursday'      => 'Lesine',
-'friday'        => 'Lesihlanu',
-'saturday'      => 'Mgcibelo',
-'sun'           => 'LiSontfo',
-'mon'           => 'Msombuluko',
-'tue'           => 'Lesibili',
-'wed'           => 'Lesitsatfu',
-'thu'           => 'Lesine',
-'fri'           => 'Lesihlanu',
-'sat'           => 'Mgcibelo',
-'january'       => 'Bhimbidvwane',
-'february'      => 'iNdlovana',
-'march'         => 'iNdlovu',
-'april'         => 'Mabasa',
-'may_long'      => 'iNkhwekhweti',
-'june'          => 'iNhlaba',
-'july'          => 'Kholwane',
-'august'        => 'iNgci',
-'september'     => 'iNyoni',
-'october'       => 'iMphala',
-'november'      => 'Lweti',
-'december'      => 'iNgongoni',
-'january-gen'   => 'Bhimbidvwane',
-'february-gen'  => 'iNdlovana',
-'march-gen'     => 'iNdlovu',
-'april-gen'     => 'Mabasa',
-'may-gen'       => 'iNkhwekhweti',
-'june-gen'      => 'iNhlaba',
-'july-gen'      => 'Kholwane',
-'august-gen'    => 'iNgci',
+'sunday' => 'LiSontfo',
+'monday' => 'Msombuluko',
+'tuesday' => 'Lesibili',
+'wednesday' => 'Lesitsatfu',
+'thursday' => 'Lesine',
+'friday' => 'Lesihlanu',
+'saturday' => 'Mgcibelo',
+'sun' => 'LiSontfo',
+'mon' => 'Msombuluko',
+'tue' => 'Lesibili',
+'wed' => 'Lesitsatfu',
+'thu' => 'Lesine',
+'fri' => 'Lesihlanu',
+'sat' => 'Mgcibelo',
+'january' => 'Bhimbidvwane',
+'february' => 'iNdlovana',
+'march' => 'iNdlovu',
+'april' => 'Mabasa',
+'may_long' => 'iNkhwekhweti',
+'june' => 'iNhlaba',
+'july' => 'Kholwane',
+'august' => 'iNgci',
+'september' => 'iNyoni',
+'october' => 'iMphala',
+'november' => 'Lweti',
+'december' => 'iNgongoni',
+'january-gen' => 'Bhimbidvwane',
+'february-gen' => 'iNdlovana',
+'march-gen' => 'iNdlovu',
+'april-gen' => 'Mabasa',
+'may-gen' => 'iNkhwekhweti',
+'june-gen' => 'iNhlaba',
+'july-gen' => 'Kholwane',
+'august-gen' => 'iNgci',
 'september-gen' => 'iNyoni',
-'october-gen'   => 'iMphala',
-'november-gen'  => 'Lweti',
-'december-gen'  => 'iNgongoni',
-'jan'           => 'Bhi',
-'feb'           => 'iNdlova',
-'mar'           => 'iNdlovu',
-'apr'           => 'Mab',
-'may'           => 'iNkhwe',
-'jun'           => 'iNhla',
-'jul'           => 'Kho',
-'aug'           => 'iNgci',
-'sep'           => 'iNyo',
-'oct'           => 'iMpha',
-'nov'           => 'Lwe',
-'dec'           => 'iNgo',
+'october-gen' => 'iMphala',
+'november-gen' => 'Lweti',
+'december-gen' => 'iNgongoni',
+'jan' => 'Bhi',
+'feb' => 'iNdlova',
+'mar' => 'iNdlovu',
+'apr' => 'Mab',
+'may' => 'iNkhwe',
+'jun' => 'iNhla',
+'jul' => 'Kho',
+'aug' => 'iNgci',
+'sep' => 'iNyo',
+'oct' => 'iMpha',
+'nov' => 'Lwe',
+'dec' => 'iNgo',
 
 # Categories related messages
-'category_header'          => 'Makhasi lakulomkhakha "$1"',
-'subcategories'            => 'Mikhakha lengaphansi',
-'category-media-header'    => 'i-Media lekulomkhakha "$1"',
-'category-empty'           => "''Lomkhakha ute makhasi nobe i-media lewuphetse.''",
+'category_header' => 'Makhasi lakulomkhakha "$1"',
+'subcategories' => 'Mikhakha lengaphansi',
+'category-media-header' => 'i-Media lekulomkhakha "$1"',
+'category-empty' => "''Lomkhakha ute makhasi nobe i-media lewuphetse.''",
 'hidden-category-category' => 'Mikhakha lefihliwe',
-'listingcontinuesabbrev'   => 'chubeka.',
-'index-category'           => 'Makhasi lacokelelwe',
-'noindex-category'         => 'Makhasi lasabalele',
-
-'about'         => 'Kabanti',
-'article'       => 'Likhasi lentfo',
-'newwindow'     => '(kuvulekela tukweli-window lelisha)',
-'cancel'        => 'Yekela',
+'listingcontinuesabbrev' => 'chubeka.',
+'index-category' => 'Makhasi lacokelelwe',
+'noindex-category' => 'Makhasi lasabalele',
+
+'about' => 'Kabanti',
+'article' => 'Likhasi lentfo',
+'newwindow' => '(kuvulekela tukweli-window lelisha)',
+'cancel' => 'Yekela',
 'moredotdotdot' => 'Lokunyenti...',
-'mypage'        => 'Likhasi lami',
-'mytalk'        => 'Tingcoco tami',
-'anontalk'      => 'Tingcogco letentwe ngulelikheli lale-IP',
+'mypage' => 'Likhasi lami',
+'mytalk' => 'Tingcoco tami',
+'anontalk' => 'Tingcogco letentwe ngulelikheli lale-IP',
 
 # Cologne Blue skin
-'qbfind'         => 'Tfola',
-'qbbrowse'       => 'Browse',
-'qbedit'         => 'Hlela',
-'qbpageoptions'  => 'Lelikhasi',
-'qbmyoptions'    => 'Makhasi ami',
+'qbfind' => 'Tfola',
+'qbbrowse' => 'Browse',
+'qbedit' => 'Hlela',
+'qbpageoptions' => 'Lelikhasi',
+'qbmyoptions' => 'Makhasi ami',
 'qbspecialpages' => 'Emakhasi labalulekile',
 
 # Vector skin
 'vector-action-addsection' => 'Ngeta sihloko',
-'vector-action-move'       => 'Khweshisa',
-'vector-view-create'       => 'Create',
-'vector-view-edit'         => 'Hlela',
-'vector-view-history'      => 'Bona umlandvo',
-'vector-view-view'         => 'Fundza',
-'actions'                  => 'Tento',
-
-'returnto'          => 'Buyela ku $1.',
-'help'              => 'Sita',
-'search'            => 'Sesha',
-'searchbutton'      => 'Sesha',
-'go'                => 'Hamba',
-'searcharticle'     => 'Hamba',
-'history'           => 'Umlandvo walelikhasi',
-'history_short'     => 'Umlandvo',
-'print'             => 'Print',
-'edit'              => 'Hlela',
-'create'            => 'Yakha',
-'editthispage'      => 'Hlela lelikhasi',
-'create-this-page'  => 'Yakha lelikhasi',
-'delete'            => 'Sula',
-'deletethispage'    => 'Sula lelikhasi',
-'protect'           => 'Vikela',
-'protect_change'    => 'gucula',
-'protectthispage'   => 'Vikela lelikhasi',
-'unprotect'         => 'Yekelela',
+'vector-action-move' => 'Khweshisa',
+'vector-view-create' => 'Create',
+'vector-view-edit' => 'Hlela',
+'vector-view-history' => 'Bona umlandvo',
+'vector-view-view' => 'Fundza',
+'actions' => 'Tento',
+
+'returnto' => 'Buyela ku $1.',
+'help' => 'Sita',
+'search' => 'Sesha',
+'searchbutton' => 'Sesha',
+'go' => 'Hamba',
+'searcharticle' => 'Hamba',
+'history' => 'Umlandvo walelikhasi',
+'history_short' => 'Umlandvo',
+'print' => 'Print',
+'edit' => 'Hlela',
+'create' => 'Yakha',
+'editthispage' => 'Hlela lelikhasi',
+'create-this-page' => 'Yakha lelikhasi',
+'delete' => 'Sula',
+'deletethispage' => 'Sula lelikhasi',
+'protect' => 'Vikela',
+'protect_change' => 'gucula',
+'protectthispage' => 'Vikela lelikhasi',
+'unprotect' => 'Yekelela',
 'unprotectthispage' => 'Yekelela lelikhasi',
-'newpage'           => 'Likhasi lelisha',
-'talkpage'          => 'Coca ngalelikhasi',
-'talkpagelinktext'  => 'Ingcoco',
-'specialpage'       => 'Likhasi lelibalulekile',
-'personaltools'     => 'Mathulusi emuntfu',
-'postcomment'       => 'Sihloko lesinsha',
-'articlepage'       => 'Bona likhasi lelicuketse',
-'talk'              => 'Ingcoco',
-'views'             => 'Kubukeka',
-'toolbox'           => 'Libhokisi Lemathulusi',
-'userpage'          => 'Buna likhasi lemuntfu',
-'projectpage'       => 'Bona likhasi leprojekthi',
-'imagepage'         => 'Bona lelifayela likhasi',
-'mediawikipage'     => 'Bona likhasi lemiyaleto',
-'viewhelppage'      => 'Bona likhasi lelusito',
-'categorypage'      => 'Bona likhasi lemikhakha',
-'viewtalkpage'      => 'Bona ingcoco',
-'otherlanguages'    => 'Ngaletinye tilwimi',
-'redirectedfrom'    => '(Utfunyelelwe likhasi $1)',
-'redirectpagesub'   => 'Likhasi lekutfumela',
-'lastmodifiedat'    => 'Lelikhasi ligcine kushintjwa ngetingu $1, ngo $2.',
-'viewcount'         => 'Lelikhasi selibonwe {{PLURAL:$1|kanye|kayi $1}}.',
-'protectedpage'     => 'Likhasi lelivikelekile',
-'jumpto'            => 'Zuba ku:',
-'jumptosearch'      => 'sesha',
-'view-pool-error'   => 'Siyacolisa, maseva etfu agwele kakhulu ngalesikhatsi.
+'newpage' => 'Likhasi lelisha',
+'talkpage' => 'Coca ngalelikhasi',
+'talkpagelinktext' => 'Ingcoco',
+'specialpage' => 'Likhasi lelibalulekile',
+'personaltools' => 'Mathulusi emuntfu',
+'postcomment' => 'Sihloko lesinsha',
+'articlepage' => 'Bona likhasi lelicuketse',
+'talk' => 'Ingcoco',
+'views' => 'Kubukeka',
+'toolbox' => 'Libhokisi Lemathulusi',
+'userpage' => 'Buna likhasi lemuntfu',
+'projectpage' => 'Bona likhasi leprojekthi',
+'imagepage' => 'Bona lelifayela likhasi',
+'mediawikipage' => 'Bona likhasi lemiyaleto',
+'viewhelppage' => 'Bona likhasi lelusito',
+'categorypage' => 'Bona likhasi lemikhakha',
+'viewtalkpage' => 'Bona ingcoco',
+'otherlanguages' => 'Ngaletinye tilwimi',
+'redirectedfrom' => '(Utfunyelelwe likhasi $1)',
+'redirectpagesub' => 'Likhasi lekutfumela',
+'lastmodifiedat' => 'Lelikhasi ligcine kushintjwa ngetingu $1, ngo $2.',
+'viewcount' => 'Lelikhasi selibonwe {{PLURAL:$1|kanye|kayi $1}}.',
+'protectedpage' => 'Likhasi lelivikelekile',
+'jumpto' => 'Zuba ku:',
+'jumptosearch' => 'sesha',
+'view-pool-error' => 'Siyacolisa, maseva etfu agwele kakhulu ngalesikhatsi.
 Kunebantfu labanyenti labatama kubona lelikhasi.
 Sicela ume kancane ngaphambi lwekuphindze ubone lelikhasi.
 
 $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'            => 'Kabanti nge {{SITENAME}}',
-'aboutpage'            => 'Project:Kabanti',
-'copyright'            => 'Lokucuketfwe kungaphansi kwe $1.',
-'copyrightpage'        => '{{ns:project}}:Malungelo ekukhicita',
-'currentevents'        => 'Tentakalo tanyalo',
-'currentevents-url'    => 'Project:Tentakalo tanyalo',
-'edithelp'             => 'Lusito ngekuhlela',
-'edithelppage'         => 'Help:Kuhlela',
-'helppage'             => 'Help:Lokucuketfwe',
-'mainpage'             => 'Likhasi Lelikhulu',
+'aboutsite' => 'Kabanti nge {{SITENAME}}',
+'aboutpage' => 'Project:Kabanti',
+'copyright' => 'Lokucuketfwe kungaphansi kwe $1.',
+'copyrightpage' => '{{ns:project}}:Malungelo ekukhicita',
+'currentevents' => 'Tentakalo tanyalo',
+'currentevents-url' => 'Project:Tentakalo tanyalo',
+'edithelp' => 'Lusito ngekuhlela',
+'edithelppage' => 'Help:Kuhlela',
+'helppage' => 'Help:Lokucuketfwe',
+'mainpage' => 'Likhasi Lelikhulu',
 'mainpage-description' => 'Likhasi lelikhulu',
-'policy-url'           => 'Project:Umtsetfo',
-'portal'               => 'Likhefi le-inthanethi',
-'portal-url'           => 'Project:Likhefi le-inthanethi',
+'policy-url' => 'Project:Umtsetfo',
+'portal' => 'Likhefi le-inthanethi',
+'portal-url' => 'Project:Likhefi le-inthanethi',
 
-'badaccess'        => 'Liphutsa lemalungelo',
+'badaccess' => 'Liphutsa lemalungelo',
 'badaccess-group0' => 'Awukavunyelwa kwenta lesento lobowutama kusenta.',
 'badaccess-groups' => 'Lesento losicelile sincishiselwe bantfu labakule {{PLURAL:$2|ncumbi|labakunobe nguyiphi incumbi}}: $1.',
 
-'ok'                      => 'Kulungile',
-'retrievedfrom'           => 'Kutsatfwe ku "$1"',
-'youhavenewmessages'      => 'Una $1 ($2).',
-'newmessageslink'         => 'milayeto lemisha',
-'newmessagesdifflink'     => 'ingucuko yekugcina',
+'ok' => 'Kulungile',
+'retrievedfrom' => 'Kutsatfwe ku "$1"',
+'youhavenewmessages' => 'Una $1 ($2).',
+'newmessageslink' => 'milayeto lemisha',
+'newmessagesdifflink' => 'ingucuko yekugcina',
 'youhavenewmessagesmulti' => 'Unemilayeto lemisha nge $1',
-'editsection'             => 'hlela',
-'editold'                 => 'hlela',
-'viewsourceold'           => 'Bona kwakheka',
-'editlink'                => 'hlela',
-'viewsourcelink'          => 'Bona kwakheka',
-'editsectionhint'         => 'Hlela sihloko: $1',
-'toc'                     => 'Lokucuketfwe',
-'showtoc'                 => 'khomba',
-'hidetoc'                 => 'fihla',
-'thisisdeleted'           => 'Bona nobe buyisela esimweni $1?',
-'viewdeleted'             => 'Bona $1?',
+'editsection' => 'hlela',
+'editold' => 'hlela',
+'viewsourceold' => 'Bona kwakheka',
+'editlink' => 'hlela',
+'viewsourcelink' => 'Bona kwakheka',
+'editsectionhint' => 'Hlela sihloko: $1',
+'toc' => 'Lokucuketfwe',
+'showtoc' => 'khomba',
+'hidetoc' => 'fihla',
+'thisisdeleted' => 'Bona nobe buyisela esimweni $1?',
+'viewdeleted' => 'Bona $1?',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Likhasi',
@@ -199,27 +199,25 @@ $1',
 'loginlanguagelabel' => 'Lulwimi: $1',
 
 # Search results
-'search-mwsuggest-enabled'  => 'nemibono',
-'search-mwsuggest-disabled' => 'kute mibono',
-'search-relatedarticle'     => 'Lokuhlobene',
-'mwsuggest-disable'         => 'Vala losito/mibono ye AJAX',
-'searcheverything-enable'   => 'Sesha onke ma namespaces',
-'searchrelated'             => 'lokuhlobene',
-'searchall'                 => 'konke',
-'showingresults'            => "Ngaphasi kukhonjiswa kuya ku {{PLURAL:$1|'''1''' umphumela|'''$1''' miphumela}} kucalwa nga #'''$2'''.",
-'showingresultsnum'         => "Ngaphansi kukhonjiswa {{PLURAL:$3|'''1''' umphumela|'''$3''' miphumela}} kucalwa nga #'''$2'''.",
-'showingresultsheader'      => "{{PLURAL:$5|Umphumela '''$1''' of '''$3'''|Imiphumela '''$1 - $2''' ye '''$3'''}} ya '''$4'''",
-'search-nonefound'          => 'Kute umphume lotfolwe/lofanele lesicelo sakho.',
-'powersearch'               => 'Sesha ngalokuphakeme',
-'powersearch-legend'        => 'Sesha ngalokuphakeme',
-'powersearch-ns'            => 'Sesha ku namespaces:',
-'powersearch-redir'         => 'Makhasi latfumelayo',
-'powersearch-field'         => 'Sesha i',
-'powersearch-togglelabel'   => 'Buka:',
-'powersearch-toggleall'     => 'Konke',
-'powersearch-togglenone'    => 'Kute',
-'search-external'           => 'Sesha ngelithulusi langaphandle',
-'searchdisabled'            => '{{SITENAME}} kusesha kuvinjiwe.
+'search-relatedarticle' => 'Lokuhlobene',
+'mwsuggest-disable' => 'Vala losito/mibono ye AJAX',
+'searcheverything-enable' => 'Sesha onke ma namespaces',
+'searchrelated' => 'lokuhlobene',
+'searchall' => 'konke',
+'showingresults' => "Ngaphasi kukhonjiswa kuya ku {{PLURAL:$1|'''1''' umphumela|'''$1''' miphumela}} kucalwa nga #'''$2'''.",
+'showingresultsnum' => "Ngaphansi kukhonjiswa {{PLURAL:$3|'''1''' umphumela|'''$3''' miphumela}} kucalwa nga #'''$2'''.",
+'showingresultsheader' => "{{PLURAL:$5|Umphumela '''$1''' of '''$3'''|Imiphumela '''$1 - $2''' ye '''$3'''}} ya '''$4'''",
+'search-nonefound' => 'Kute umphume lotfolwe/lofanele lesicelo sakho.',
+'powersearch' => 'Sesha ngalokuphakeme',
+'powersearch-legend' => 'Sesha ngalokuphakeme',
+'powersearch-ns' => 'Sesha ku namespaces:',
+'powersearch-redir' => 'Makhasi latfumelayo',
+'powersearch-field' => 'Sesha i',
+'powersearch-togglelabel' => 'Buka:',
+'powersearch-toggleall' => 'Konke',
+'powersearch-togglenone' => 'Kute',
+'search-external' => 'Sesha ngelithulusi langaphandle',
+'searchdisabled' => '{{SITENAME}} kusesha kuvinjiwe.
 Ungasesha nge Google.
 Naka kutsi makhasi abo e {{SITENAME}} angaba sekadlulelwe sikhatsi.',
 
@@ -228,8 +226,8 @@ Naka kutsi makhasi abo e {{SITENAME}} angaba sekadlulelwe sikhatsi.',
 
 # Preferences page
 'searchresultshead' => 'Sesha',
-'uid'               => 'Matisi Wemuntfu:',
-'yourlanguage'      => 'Lulwimi:',
+'uid' => 'Matisi Wemuntfu:',
+'yourlanguage' => 'Lulwimi:',
 
 # Special:ListFiles
 'listfiles_date' => 'Lusuku',
@@ -238,7 +236,7 @@ Naka kutsi makhasi abo e {{SITENAME}} angaba sekadlulelwe sikhatsi.',
 
 # File description page
 'filehist-datetime' => 'Lusuku/Sikhatsi',
-'filehist-user'     => 'Umuntfu',
+'filehist-user' => 'Umuntfu',
 
 'brokenredirects-edit' => 'hlela',
 
@@ -263,23 +261,23 @@ Naka kutsi makhasi abo e {{SITENAME}} angaba sekadlulelwe sikhatsi.',
 'listusers-submit' => 'Khomba',
 
 # Watchlist
-'watch'   => 'Gadza',
+'watch' => 'Gadza',
 'unwatch' => 'Yekela kugadza',
 
 # Restrictions (nouns)
-'restriction-edit'   => 'Hlela',
-'restriction-move'   => 'Khweshisa',
+'restriction-edit' => 'Hlela',
+'restriction-move' => 'Khweshisa',
 'restriction-create' => 'Create',
 
 # Undelete
 'undelete-search-submit' => 'Sesha',
 
-'sp-contributions-talk'   => 'ingcoco',
+'sp-contributions-talk' => 'ingcoco',
 'sp-contributions-submit' => 'Sesha',
 
 # Block/unblock
 'ipblocklist-submit' => 'Sesha',
-'proxyblocksuccess'  => 'Kwentekile.',
+'proxyblocksuccess' => 'Kwentekile.',
 
 # Move page
 'movelogpage' => 'Khweshisa i-log',
index 68e70a3..65d5e96 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'    => 'Sontaha',
-'monday'    => 'Mantaha',
-'tuesday'   => 'Labobedi',
+'sunday' => 'Sontaha',
+'monday' => 'Mantaha',
+'tuesday' => 'Labobedi',
 'wednesday' => 'Laboraro',
-'thursday'  => 'Labone',
-'friday'    => 'Labohlano',
-'saturday'  => 'Moqebelo',
-'january'   => 'Pherekgong',
-'february'  => 'Hlakola',
-'march'     => 'Hlakubele',
-'april'     => 'Mmesa',
-'may_long'  => 'Motsheanong',
-'june'      => 'Phupjane',
-'july'      => 'Phupu',
-'august'    => 'Phato',
+'thursday' => 'Labone',
+'friday' => 'Labohlano',
+'saturday' => 'Moqebelo',
+'january' => 'Pherekgong',
+'february' => 'Hlakola',
+'march' => 'Hlakubele',
+'april' => 'Mmesa',
+'may_long' => 'Motsheanong',
+'june' => 'Phupjane',
+'july' => 'Phupu',
+'august' => 'Phato',
 'september' => 'Lwetse',
-'october'   => 'Mphalane',
-'november'  => 'Pudungwana',
-'december'  => 'Tshitwe',
-'may-gen'   => 'Motsheanong',
-'jan'       => 'Phere',
-'feb'       => 'Hlako',
-'mar'       => 'Hlaku',
-'apr'       => 'Mmesa',
-'may'       => 'Motshe',
-'jun'       => 'Phupjane',
-'jul'       => 'Phupu',
-'aug'       => 'Phato',
-'sep'       => 'Lwetse',
-'oct'       => 'Mphala',
-'nov'       => 'Pudu',
-'dec'       => 'Tshitwe',
+'october' => 'Mphalane',
+'november' => 'Pudungwana',
+'december' => 'Tshitwe',
+'may-gen' => 'Motsheanong',
+'jan' => 'Phere',
+'feb' => 'Hlako',
+'mar' => 'Hlaku',
+'apr' => 'Mmesa',
+'may' => 'Motshe',
+'jun' => 'Phupjane',
+'jul' => 'Phupu',
+'aug' => 'Phato',
+'sep' => 'Lwetse',
+'oct' => 'Mphala',
+'nov' => 'Pudu',
+'dec' => 'Tshitwe',
 
 # Categories related messages
 'category_header' => 'Dingolwa tse mokgeng wa "$1"',
 
-'mypage'     => 'Leqephe la ka',
-'mytalk'     => 'Leqephe la ka la moqoqo',
+'mypage' => 'Leqephe la ka',
+'mytalk' => 'Leqephe la ka la moqoqo',
 'navigation' => 'Eya ho',
 
 # Cologne Blue skin
 'faq' => 'Dipotso-mehla',
 
-'returnto'       => 'Kgutlela ho $1.',
-'tagline'        => 'E tswa ho {{SITENAME}}',
-'search'         => 'Fuputsa',
-'history'        => 'Nalane',
-'history_short'  => 'Nalane',
-'newpage'        => 'Leqephe le letjha',
-'talkpage'       => 'Qoqa ka leqephe lena',
-'talk'           => 'Moqoqo',
-'categorypage'   => 'Mpontshe leqephe la mekga',
+'returnto' => 'Kgutlela ho $1.',
+'tagline' => 'E tswa ho {{SITENAME}}',
+'search' => 'Fuputsa',
+'history' => 'Nalane',
+'history_short' => 'Nalane',
+'newpage' => 'Leqephe le letjha',
+'talkpage' => 'Qoqa ka leqephe lena',
+'talk' => 'Moqoqo',
+'categorypage' => 'Mpontshe leqephe la mekga',
 'otherlanguages' => 'Ka maleme a mang',
-'jumptosearch'   => 'phuputso',
+'jumptosearch' => 'phuputso',
 
 # 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).
-'mainpage'             => 'Leqephe la pele',
+'mainpage' => 'Leqephe la pele',
 'mainpage-description' => 'Leqephe la pele',
-'portal'               => 'Potjho e kopano',
-'portal-url'           => 'Project:Potjho e kopano',
+'portal' => 'Potjho e kopano',
+'portal-url' => 'Project:Potjho e kopano',
 
-'retrievedfrom'   => 'E tswa ho "$1"',
+'retrievedfrom' => 'E tswa ho "$1"',
 'newmessageslink' => 'melaetsa e metjha',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Sengolwa',
+'nstab-main' => 'Sengolwa',
 'nstab-mediawiki' => 'Molaetsa',
-'nstab-help'      => 'Leqephe la thusa',
-'nstab-category'  => 'Mokga',
+'nstab-help' => 'Leqephe la thusa',
+'nstab-category' => 'Mokga',
 
 # Login and logout pages
-'yourpasswordagain'  => 'Ngola lepetjo hape',
+'yourpasswordagain' => 'Ngola lepetjo hape',
 'remembermypassword' => 'O nkgopole (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'nologinlink'        => 'Ingodisetse',
-'createaccount'      => 'Ingodisetse',
-'gotaccount'         => "O se o ingodisitse? '''$1'''.",
-'createaccountmail'  => 'ka e-mail',
-'badretype'          => 'Mapetjo a mabedi o a ngotseng ha a tshwane.',
-'mailmypassword'     => 'Nthomele password ya ka ka email',
+'nologinlink' => 'Ingodisetse',
+'createaccount' => 'Ingodisetse',
+'gotaccount' => "O se o ingodisitse? '''$1'''.",
+'createaccountmail' => 'ka e-mail',
+'badretype' => 'Mapetjo a mabedi o a ngotseng ha a tshwane.',
+'mailmypassword' => 'Nthomele password ya ka ka email',
 
 # Change password dialog
 'oldpassword' => 'Lepetjo la kgale:',
 'newpassword' => 'Lepetjo le letjha:',
-'retypenew'   => 'Ngola lepetjo le letjha hape:',
+'retypenew' => 'Ngola lepetjo le letjha hape:',
 
 # Edit pages
-'savearticle'  => 'Le boloke',
-'showpreview'  => 'Mpontshe hore le tlo ba jwang',
-'showdiff'     => 'Mpontshe hore ho tlo fetoha eng',
+'savearticle' => 'Le boloke',
+'showpreview' => 'Mpontshe hore le tlo ba jwang',
+'showdiff' => 'Mpontshe hore ho tlo fetoha eng',
 'accmailtitle' => 'Lepetjo le rometswe.',
-'accmailtext'  => 'Lepetjo la "$1" le se le rometswe ho $2.',
-'note'         => "'''Ela hloko:'''",
+'accmailtext' => 'Lepetjo la "$1" le se le rometswe ho $2.',
+'note' => "'''Ela hloko:'''",
 
 # Search results
 'powersearch' => 'Fuputsa',
 
 # Preferences page
-'changepassword'    => 'Fetola lepetjo',
+'changepassword' => 'Fetola lepetjo',
 'searchresultshead' => 'Phuputso',
-'allowemail'        => 'Dumella batho ba bang hore ba nthomelle di-email',
+'allowemail' => 'Dumella batho ba bang hore ba nthomelle di-email',
 
 # MIME search
 'download' => 'Jarolla',
@@ -125,39 +125,39 @@ $messages = array(
 
 # Miscellaneous special pages
 'mostcategories' => 'Dingolwa tse mekga e mengata',
-'shortpages'     => 'Maqephe a makgutshwane',
-'longpages'      => 'Maqephe a matelele',
-'newpages'       => 'Maqephe a matjha',
+'shortpages' => 'Maqephe a makgutshwane',
+'longpages' => 'Maqephe a matelele',
+'newpages' => 'Maqephe a matjha',
 
 # Special:AllPages
 'allpages' => 'Maqephe ohle',
 
 # Special:Categories
-'categories'         => 'Mekga',
+'categories' => 'Mekga',
 'categoriespagetext' => 'The following {{PLURAL:$1|category contains|categories contain}} pages or media.
 [[Special:UnusedCategories|Unused categories]] are not shown here.
 Also see [[Special:WantedCategories|wanted categories]].',
 
 # E-mail user
-'emailuser'     => 'Romela motho enwa email',
-'emailfrom'     => 'E tswa ho:',
-'emailto'       => 'Ho:',
-'emailsubject'  => 'Ka:',
-'emailmessage'  => 'O re:',
-'emailsend'     => 'E romele',
-'emailsent'     => 'E rometswe',
+'emailuser' => 'Romela motho enwa email',
+'emailfrom' => 'E tswa ho:',
+'emailto' => 'Ho:',
+'emailsubject' => 'Ka:',
+'emailmessage' => 'O re:',
+'emailsend' => 'E romele',
+'emailsent' => 'E rometswe',
 'emailsenttext' => 'Email ya molaetsa wa hao e se e rometswe.',
 
 # Contributions
 'contributions' => 'Tse ngotsweng ke motho enwa',
-'mycontris'     => 'Tse ngotsweng ke nna',
+'mycontris' => 'Tse ngotsweng ke nna',
 
 # Block/unblock
-'ipbreason'     => 'Lebaka',
+'ipbreason' => 'Lebaka',
 'infiniteblock' => 'ho eya ho ile',
 
 # Namespace 8 related
-'allmessagesname'    => 'Lebitso',
+'allmessagesname' => 'Lebitso',
 'allmessagesdefault' => 'Se neng se ngotswe pele',
 'allmessagescurrent' => 'Se ngotsweng hona jwale',
 
index e5916f4..1b312e5 100644 (file)
@@ -189,7 +189,6 @@ $messages = array(
 'qbbrowse' => 'Bleederje',
 'qbedit' => 'Annerje',
 'qbpageoptions' => 'Disse Siede',
-'qbpageinfo' => 'Siedendoatäie',
 'qbmyoptions' => 'Mien Sieden',
 'qbspecialpages' => 'Spezialsieden',
 'faq' => 'Oafte stoalde Froagen',
@@ -443,12 +442,8 @@ Die Administrator, die dän Skrieuwtougriep speerde, roate foulgjenden Gruund an
 # Login and logout pages
 'logouttext' => "'''Du bäst nu oumälded.'''
 
-Du koast {{SITENAME}} nu anonym fääre benutsje, of die fonnäien unner dänsälge of n uur Benutsernoome wier [[Special:UserLogin|anmäldje]].
+Du koast {{SITENAME}} nu anonym fääre benutsje, of die fonnäien unner dänsälge of n uur Benutsernoome wier <span class='plainlinks'>[$1 anmäldje]</span>.
 Beoachtje, dät eenige Sieden noch anwiese konnen, dät du oumälded bäst, soloange du nit din Browsercache loosmoaked hääst.",
-'welcomecreation' => '== Wäilkuumen, $1 ==
-
-Dien Benutserkonto wuude iengjucht.
-Ferjeet nit, dien [[Special:Preferences|{{SITENAME}}-Ienstaalengen]] antoupaasjen.',
 'yourname' => 'Benutsernoome:',
 'yourpassword' => 'Paaswoud:',
 'yourpasswordagain' => 'Paaswoud wierhoalje:',
@@ -1007,8 +1002,6 @@ Staal deertruch sicher, dät ju Versionsgeskichte fon n Artikkel historisk akroa
 'search-interwiki-caption' => 'Susterprojekte',
 'search-interwiki-default' => '$1 Resultoate:',
 'search-interwiki-more' => '(wiedere)',
-'search-mwsuggest-enabled' => 'mäd Foarsleeke',
-'search-mwsuggest-disabled' => 'neen Foarsleeke',
 'search-relatedarticle' => 'Früünde',
 'mwsuggest-disable' => 'Foarsleeke truch Ajax deaktivierje',
 'searcheverything-enable' => 'Säik in aal Noomensruume',
@@ -1935,11 +1928,7 @@ Wan du die Artikkel wier fon ju Foulgelieste ou hoalje moatest, klik ap ju Siede
 
 'enotif_mailer' => '{{SITENAME}} tält Beskeed uur Email',
 'enotif_reset' => 'Markier aal besoachte Sieden',
-'enotif_newpagetext' => 'Dit is ne näie Siede.',
 'enotif_impersonal_salutation' => '{{SITENAME}} Benutser',
-'changed' => 'annerd',
-'created' => 'näi anlaid',
-'enotif_subject' => '{{SITENAME}} Siede $PAGETITLE wuude $CHANGEDORCREATED fon $PAGEEDITOR',
 'enotif_lastvisited' => 'Aal Annerengen ap aan Blik: $1',
 'enotif_lastdiff' => '$1 wiest alle Annerengen mäd aan Glap.',
 'enotif_anon_editor' => 'Anonyme Benutser $1',
@@ -3301,4 +3290,8 @@ Ne [{{SERVER}}{{SCRIPTPATH}}/COPYING Kopie fon ju ''GNU General Public License''
 'revdelete-unrestricted' => 'Ienskränkengen foar Administratore wächhoald',
 'newuserlog-byemail' => 'dät Paaswoud wuud uur E-Mail fersoand',
 
+# Search suggestions
+'searchsuggest-search' => 'Säik',
+'searchsuggest-containing' => 'Fultextsäike ätter ...',
+
 );
index 6b8b243..5f3c0dc 100644 (file)
@@ -264,7 +264,7 @@ $messages = array(
 'cancel' => 'Bolay',
 'moredotdotdot' => 'Deui...',
 'mypage' => 'Kaca kuring',
-'mytalk' => 'Obrolan kuring',
+'mytalk' => 'Obrolan',
 'anontalk' => 'Obrolan pikeun IP ieu',
 'navigation' => 'Pituduh',
 'and' => '&#32;jeung',
@@ -274,7 +274,6 @@ $messages = array(
 'qbbrowse' => 'Sungsi',
 'qbedit' => 'Édit',
 'qbpageoptions' => 'Kaca ieu',
-'qbpageinfo' => 'Kontéks',
 'qbmyoptions' => 'Kaca kuring',
 'qbspecialpages' => 'Kaca husus',
 'faq' => 'NLD',
@@ -518,11 +517,8 @@ Pikeun alihbasa, mangga sumping ka [//translatewiki.net/wiki/Main_Page?setlang=e
 # Login and logout pages
 'logouttext' => "'''Anjeun ayeuna geus kaluar log.'''
 
-Anjeun bisa tetep migunakeun {{SITENAME}} bari anonim, atawa bisa [[Special:UserLogin|asup log deui]] salaku pamaké nu sarua atawa nu séjén deui.
+Anjeun bisa tetep migunakeun {{SITENAME}} bari anonim, atawa bisa <span class='plainlinks'>[$1 asup log deui]</span> salaku pamaké nu sarua atawa nu séjén deui.
 Mangkahadé, sababaraha kaca bakal tetep némbongkeun saolah-olah anjeun asup log kénéh nepi ka anjeun ngosongkeun ''cache'' panyungsi anjeun.",
-'welcomecreation' => '==Wilujeng sumping, $1!==
-Rekening anjeun geus dijieun.
-Tong hilap ngarobih [[Special:Preferences|{{SITENAME}} préferénsi]] anjeun.',
 'yourname' => 'Sandiasma:',
 'yourpassword' => 'Sandi anjeun',
 'yourpasswordagain' => 'Ketik deui sandi anjeun',
@@ -759,9 +755,8 @@ Mun anjeun ka dieu teu ngahaja, klik baé tombol '''back''' na panyungsi anjeun.
 Anjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali],
 atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} ngédit ieu kaca]</span>.',
-'noarticletext-nopermission' => 'Kiwari ieu kaca euweuh eusian.
-Anjeun bisa [[Special:Search/{{PAGENAME}}|milari judul ieu kaca]] di kaca séjén,
-atawa <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} pilari log nu tumali]</span>.',
+'noarticletext-nopermission' => 'Kiwari can aya téks dina ieu kaca.
+Anjeun bisa [[Special:Search/{{PAGENAME}}|nyusud judul ieu kaca]] dina kaca séjén,atawa <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nyusud log nu tumali]</span>, tapi teu wenang pikeun nyieun ieu kaca.',
 'userpage-userdoesnotexist' => 'Rekening pamaké "<nowiki>$1</nowiki>" tacan kadaptar. Mangga tilikan lamun anjeun hoyong ngadamel/ngédit kaca ieu.',
 'userpage-userdoesnotexist-view' => 'Rekening pamaké "$1" teu aya dina daptar.',
 'blocked-notice-logextract' => 'Ieu pamaké keur dipeungpeuk.
@@ -1073,8 +1068,6 @@ Pastikeun yén ieu parobahan bisa miara jujutan kaca sagemblengna.',
 'search-interwiki-caption' => 'Proyék sawargi',
 'search-interwiki-default' => '$1 hasil:',
 'search-interwiki-more' => '(saterusna)',
-'search-mwsuggest-enabled' => 'jeung bongbolongan',
-'search-mwsuggest-disabled' => 'euweuh bongbolongan',
 'search-relatedarticle' => 'Patula-patali',
 'mwsuggest-disable' => 'Tumpurkeun usulan AJAX',
 'searcheverything-enable' => 'Pilari di sakabéh rohangaran',
@@ -1107,7 +1100,7 @@ Coba susud dimimitian ku ''all:'' pikeun nyusud sakabéh kandunganana (kaasup ka
 
 # Preferences page
 'preferences' => 'Préferénsi',
-'mypreferences' => 'Préferénsi',
+'mypreferences' => 'Préferéns',
 'prefs-edits' => 'Jumlah éditan:',
 'prefsnologin' => 'Can asup log',
 'prefsnologintext' => 'Anjeun kudu <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} asup log]</span> pikeun ngatur préferénsi pamaké.',
@@ -1910,11 +1903,7 @@ Jaga, parobahan na kaca ieu katut kaca obrolanana bakal dibéréndélkeun di din
 
 'enotif_mailer' => 'Surat Émbaran {{SITENAME}}',
 'enotif_reset' => 'Tandaan sadaya kaca nu geus dilongok',
-'enotif_newpagetext' => 'Kaca ieu anyar.',
 'enotif_impersonal_salutation' => 'Pamaké {{SITENAME}}',
-'changed' => 'geus robah',
-'created' => 'geus dijieun',
-'enotif_subject' => 'Kaca $PAGETITLE {{SITENAME}} geus $CHANGEDORCREATED ku $PAGEEDITOR',
 'enotif_lastvisited' => 'Tempo $1 pikeun sadaya parobahan ti saprak anjeun ninggalkeun ieu kaca.',
 'enotif_lastdiff' => 'Buka $1 pikeun nempo ieu parobahan.',
 'enotif_anon_editor' => 'pamaké anonim $1',
@@ -2088,7 +2077,7 @@ $1',
 # Contributions
 'contributions' => 'Kontribusi ti kontributor',
 'contributions-title' => 'Sumbangan tulisan ti $1',
-'mycontris' => 'Tulisan kuring',
+'mycontris' => 'Kontribusi',
 'contribsub2' => 'Pikeun $1 ($2)',
 'nocontribs' => 'Taya robahan nu kapanggih cocog jeung patokan ieu.',
 'uctop' => '(pangluhurna)',
@@ -2126,7 +2115,7 @@ Pikeun rujukan, éntri log panungtung dipidangkeun di handap:',
 'whatlinkshere-hideredirs' => '$1 alihan',
 'whatlinkshere-hidetrans' => '$1 transklusi',
 'whatlinkshere-hidelinks' => '$1 tutumbu',
-'whatlinkshere-hideimages' => '$1 tutumbu gambar',
+'whatlinkshere-hideimages' => '$1 tutumbu berkas',
 'whatlinkshere-filters' => 'Saringan',
 
 # Block/unblock
@@ -3062,6 +3051,10 @@ Coba ku sawangan normal.',
 'feedback-message' => 'Surat:',
 'feedback-cancel' => 'Bolay',
 
+# Search suggestions
+'searchsuggest-search' => 'Sungsi',
+'searchsuggest-containing' => 'ngandung...',
+
 # API errors
 'api-error-file-too-large' => 'Berkas nu dikirim gedé teuing.',
 'api-error-filename-tooshort' => 'Ngaran berkas pondok teuing.',
index c83e826..6ddfc00 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author Ainali
  * @author Boivie
+ * @author Cybjit
  * @author Dafer45
  * @author Diupwijk
  * @author EPO
@@ -40,6 +41,7 @@
  * @author Rotsee
  * @author S.Örvarr.S
  * @author Sannab
+ * @author Sendelbach
  * @author Sertion
  * @author Skalman
  * @author Stefan2
@@ -180,7 +182,6 @@ $magicWords = array(
        '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' ),
@@ -454,7 +455,7 @@ $messages = array(
 'cancel' => 'Avbryt',
 'moredotdotdot' => 'Mer...',
 'mypage' => 'Min sida',
-'mytalk' => 'Min diskussion',
+'mytalk' => 'Diskussion',
 'anontalk' => 'Diskussionssida för denna IP-adress',
 'navigation' => 'Navigering',
 'and' => '&#32;och',
@@ -464,7 +465,6 @@ $messages = array(
 'qbbrowse' => 'Bläddra igenom',
 'qbedit' => 'Redigera',
 'qbpageoptions' => 'Denna sida',
-'qbpageinfo' => 'Sidinformation',
 'qbmyoptions' => 'Mina inställningar',
 'qbspecialpages' => 'Specialsidor',
 'faq' => 'FAQ',
@@ -477,7 +477,7 @@ $messages = array(
 'vector-action-protect' => 'Skrivskydda',
 'vector-action-undelete' => 'Återställ',
 'vector-action-unprotect' => 'Ändra skydd',
-'vector-simplesearch-preference' => 'Aktivera utökade sökförslag (endast Vector-utseendet)',
+'vector-simplesearch-preference' => 'Aktivera förenklat sökfält (endast Vector-utseendet)',
 'vector-view-create' => 'Skapa',
 'vector-view-edit' => 'Redigera',
 'vector-view-history' => 'Visa historik',
@@ -487,6 +487,7 @@ $messages = array(
 'namespaces' => 'Namnrymder',
 'variants' => 'Varianter',
 
+'navigation-heading' => 'Navigeringsmeny',
 'errorpagetitle' => 'Fel',
 'returnto' => 'Tillbaka till $1.',
 'tagline' => 'Från {{SITENAME}}',
@@ -693,12 +694,14 @@ Den kan innehålla ett eller flera tecken som inte får användas i sidtitlar.',
 'viewsource-title' => 'Visa källkod för $1',
 'actionthrottled' => 'Åtgärden stoppades',
 'actionthrottledtext' => 'Som skydd mot spam, finns det en begränsning av hur många gånger du kan utföra den här åtgärden under en viss tid. Du har överskridit den gränsen. Försök igen om några minuter.',
-'protectedpagetext' => 'Den här sidan har skrivskyddats för att förhindra redigering.',
+'protectedpagetext' => 'Den här sidan har skrivskyddats för att förhindra redigering eller andra åtgärder.',
 'viewsourcetext' => 'Du kan se och kopiera denna sidas källtext:',
 'viewyourtext' => "Du kan se och kopiera källan för '''dina redigeringar''' på denna sida:",
-'protectedinterface' => 'Denna sida innehåller text för mjukvarans gränssnitt, och är skrivskyddad för att förebygga missbruk.',
-'editinginterface' => "'''Varning:''' Du redigerar en sida som används till texten i gränssnittet. Ändringar på denna sida kommer att påverka gränssnittets utseende för alla användare.
-För översättningar, använd gärna [//translatewiki.net/wiki/Main_Page?setlang=sv translatewiki.net], översättningsprojektet för MediaWiki.",
+'protectedinterface' => 'Denna sida innehåller text för mjukvarans gränssnitt på denna wiki, och är skrivskyddad för att förebygga missbruk.
+För att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], lokaliseringsprojektet för MediaWiki.',
+'editinginterface' => "'''Varning:''' Du redigerar en sida som används till texten i gränssnittet.
+Ändringar på denna sida kommer att påverka gränssnittets utseende för alla användare på denna wiki.
+För att lägga till eller ändra översättningar för alla wikis, var god använd [//translatewiki.net/ translatewiki.net], översättningsprojektet för MediaWiki.",
 'sqlhidden' => '(gömd SQL-förfrågan)',
 'cascadeprotected' => 'Den här sidan har skyddats från redigering eftersom den inkluderas på följande {{PLURAL:$1|sida|sidor}} som skrivskyddats med "kaskaderande skydd":
 $2',
@@ -724,10 +727,10 @@ Den administratören som låste den gav denna anledning: "\'\'$3\'\'".',
 # Login and logout pages
 'logouttext' => "'''Du är nu utloggad.'''
 
-Du kan fortsätta att använda {{SITENAME}} anonymt, eller så kan du [[Special:UserLogin|logga in igen]] som samma eller som en annan användare.
+Du kan fortsätta att använda {{SITENAME}} anonymt, eller så kan du <span class='plainlinks'>[$1 logga in igen]</span> som samma eller som en annan användare.
 Observera att det, tills du tömmer din webbläsares cache, på vissa sidor kan se ut som att du fortfarande är inloggad.",
-'welcomecreation' => '== Välkommen, $1! ==
-Ditt konto har skapats.
+'welcomeuser' => 'Välkommen, $1!',
+'welcomecreation-msg' => 'Ditt konto har skapats.
 Glöm inte att justera dina [[Special:Preferences|{{SITENAME}}-inställningar]].',
 'yourname' => 'Användarnamn:',
 'yourpassword' => 'Lösenord:',
@@ -773,7 +776,7 @@ Användarnamn är skiftlägeskänsliga.
 Kontrollera din stavning, eller [[Special:UserLogin/signup|skapa ett nytt konto]].',
 'nosuchusershort' => 'Det finns ingen användare som heter "$1". Kontrollera att du stavat rätt.',
 'nouserspecified' => 'Du måste ange ett användarnamn.',
-'login-userblocked' => 'Denna användare är blockerad. Login inte tillåtet.',
+'login-userblocked' => 'Denna användare är blockerad. Inloggning är inte tillåtet.',
 'wrongpassword' => 'Lösenordet du angav är felaktigt. Försök igen.',
 'wrongpasswordempty' => 'Lösenordet som angavs var blankt. Var god försök igen.',
 'passwordtooshort' => 'Lösenord måste innehålla minst {{PLURAL:$1|$1 tecken}}.',
@@ -972,8 +975,8 @@ Om du är en anonym användare och känner att irrelevanta kommentarer har rikta
 'noarticletext' => 'Det finns just nu ingen text på denna sida.
 Du kan [[Special:Search/{{PAGENAME}}|söka efter denna sidtitel]] på andra sidor, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i loggarna], eller [{{fullurl:{{FULLPAGENAME}}|action=edit}} redigera denna sida]</span>.',
 '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>.',
+Du kan [[Special:Search/{{PAGENAME}}|söka efter denna sidas titel]]  andra sidor,
+eller <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i relaterade 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.
@@ -1083,6 +1086,15 @@ Det verkar som att den har raderats.',
 'edit-already-exists' => 'Sidan kunde inte skapas.
 Den finns redan.',
 'defaultmessagetext' => 'Standardtext för meddelande',
+'content-failed-to-parse' => 'Det gick inte att parsa $2 innehåll för $1 modell: $3',
+'invalid-content-data' => 'Ogiltig innehållsdata',
+'content-not-allowed-here' => 'innehåll av "$1" är inte tillåtet på sidan [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikitext',
+'content-model-text' => 'oformaterad text',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Varning: Denna sida innehåller för många anrop av resurskrävande parserfunktioner.
@@ -1340,8 +1352,6 @@ Detaljer kan hittas i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}
 'search-interwiki-caption' => 'Systerprojekt',
 'search-interwiki-default' => 'Resultat i $1:',
 'search-interwiki-more' => '(mer)',
-'search-mwsuggest-enabled' => 'med förslag',
-'search-mwsuggest-disabled' => 'inga förslag',
 'search-relatedarticle' => 'Relaterad',
 'mwsuggest-disable' => 'Avaktivera AJAX-förslag',
 'searcheverything-enable' => 'Sök i alla namnrymder',
@@ -1376,7 +1386,7 @@ Notera dock att deras indexering av {{SITENAME}} kan vara något föråldrad.',
 
 # Preferences page
 'preferences' => 'Inställningar',
-'mypreferences' => 'Mina inställningar',
+'mypreferences' => 'Inställningar',
 'prefs-edits' => 'Antal redigeringar:',
 'prefsnologin' => 'Inte inloggad',
 'prefsnologintext' => 'Du måste vara <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} inloggad]</span> för att kunna ändra dina inställningar.',
@@ -1439,7 +1449,7 @@ Här är ett slumpmässigt genererat värde som du kan använda: $1',
 'timezoneregion-indian' => 'Indiska oceanen',
 'timezoneregion-pacific' => 'Stilla havet',
 'allowemail' => 'Tillåt e-post från andra användare',
-'prefs-searchoptions' => 'Sökalternativ',
+'prefs-searchoptions' => 'Sök',
 'prefs-namespaces' => 'Namnrymder',
 'defaultns' => 'Sök annars i dessa namnrymder:',
 'default' => 'ursprungsinställning',
@@ -1608,6 +1618,9 @@ Om du väljer att ange ditt riktiga namn, kommer det att användas för att till
 'rightslogtext' => 'Detta är en logg över ändringar av användares rättigheter.',
 'rightslogentry' => 'ändrade grupptillhörighet för $1 från $2 till $3',
 'rightslogentry-autopromote' => 'befordrades automatiskt från $2 till $3',
+'logentry-rights-rights' => '$1 ändrade gruppmedlemskap för $3 från $4 till $5',
+'logentry-rights-rights-legacy' => '$1 ändrade gruppmedlemskap för $3',
+'logentry-rights-autopromote' => '$1 befordrades automatiskt från $4 till $5',
 'rightsnone' => '(inga)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1849,6 +1862,7 @@ Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].'
 'backend-fail-notsame' => 'En icke-identisk fil redan finns på $1.',
 'backend-fail-invalidpath' => '$1 är inte en giltig sökväg för att spara.',
 'backend-fail-delete' => 'Kunde inte radera filen $1.',
+'backend-fail-describe' => 'Kunde inte att ändra metadata för filen "$1".',
 'backend-fail-alreadyexists' => 'Filen $1 finns redan.',
 'backend-fail-store' => 'Kunde inte spara filen $1 vid $2.',
 'backend-fail-copy' => 'Det gick inte att kopiera filen $1 till $2.',
@@ -1865,7 +1879,7 @@ Om problemet kvarstår, kontakta en [[Special:ListUsers/sysop|administratör]].'
 '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.',
+'backend-fail-usable' => 'Kunde inte läsa eller skriva filen "$1" på grund av otillräckliga behörigheter eller saknade kataloger/containrar.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Kunde inte ansluta till journaldatabasen för lagringssystemet "$1".',
@@ -1998,7 +2012,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' => 'Du kan inte skriva över denna bild.',
+'upload-disallowed-here' => 'Du kan inte skriva över denna fil.',
 
 # File reversion
 'filerevert' => 'Återställ $1',
@@ -2117,7 +2131,7 @@ En sida anses vara en förgreningssida om den inkluderar en mall som länkas til
 'lonelypagestext' => 'Följande sidor länkas inte till från någon annan sida på {{SITENAME}}.',
 'uncategorizedpages' => 'Ej kategoriserade sidor',
 'uncategorizedcategories' => 'Ej kategoriserade kategorier',
-'uncategorizedimages' => 'Filer utan kategori',
+'uncategorizedimages' => 'Ej kategoriserade filer',
 'uncategorizedtemplates' => 'Ej kategoriserade mallar',
 'unusedcategories' => 'Tomma kategorier',
 'unusedimages' => 'Oanvända filer',
@@ -2233,8 +2247,8 @@ Se även [[Special:WantedCategories|önskade kategorier]].',
 'linksearch-ns' => 'Namnrymd:',
 '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: <code>$1</code> (lägg inte till något av dessa i din sökning).',
+Det krävs åtminstone en toppdomän, t.ex. "*.org".<br />
+Protokoll som stöds: <code>$1</code> (sätts till http:// om inget protokoll anges).',
 'linksearch-line' => '$1 länkas från $2',
 'linksearch-error' => 'Jokertecken kan bara användas i början av domännamnet.',
 
@@ -2283,7 +2297,7 @@ Det kan finnas [[{{MediaWiki:Listgrouprights-helppage}}|ytterligare information]
 '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.
+'emailpagetext' => 'Du kan använda formuläret nedan för att skicka e-post till den här {{GENDER:$1|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.',
 'usermailererror' => 'Fel i hanteringen av mail:',
 'defemailsubject' => '{{SITENAME}} e-post från användare "$1"',
@@ -2315,7 +2329,7 @@ Den e-postadress du har angivit i [[Special:Preferences|dina användarinställni
 
 # Watchlist
 'watchlist' => 'Bevakningslista',
-'mywatchlist' => 'Min bevakningslista',
+'mywatchlist' => 'Bevakningslista',
 'watchlistfor2' => 'För $1 $2',
 'nowatchlist' => 'Du har inga sidor i din bevakningslista.',
 'watchlistanontext' => 'Du måste $1 för att se eller redigera din bevakningslista.',
@@ -2351,19 +2365,23 @@ Framtida ändringar av den här sidan och dess diskussionssida kommer att listas
 
 'enotif_mailer' => '{{SITENAME}}s system för att få meddelanden om förändringar per e-post',
 'enotif_reset' => 'Markera alla sidor som besökta',
-'enotif_newpagetext' => 'Detta är en ny sida.',
 'enotif_impersonal_salutation' => '{{SITENAME}}användare',
-'changed' => 'ändrad',
-'created' => 'skapad',
-'enotif_subject' => '{{SITENAME}}-sidan $PAGETITLE har blivit $CHANGEDORCREATED av $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}}sidan $1 har raderats av {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}}sidan $1 har skapats av {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}}sidan $1 har flyttats av {{gender:$2|$2}}',
+'enotif_subject_restored' => '{{SITENAME}}sidan $1 har återställts av {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}}sidan $1 har ändrats {{gender:$2|$2}}',
+'enotif_body_intro_deleted' => '{{SITENAME}}sidan $1 raderades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
+'enotif_body_intro_created' => '{{SITENAME}}sidan $1 skapades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
+'enotif_body_intro_moved' => '{{SITENAME}}sidan $1 flyttades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
+'enotif_body_intro_restored' => '{{SITENAME}}sidan $1 återställdes den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
+'enotif_body_intro_changed' => '{{SITENAME}}sidan $1 ändrades den $PAGEEDITDATE av {{gender:$2|$2}}, se $3 för den aktuella versionen.',
 'enotif_lastvisited' => 'På $1 återfinner du alla ändringar sedan ditt senaste besök.',
 'enotif_lastdiff' => 'Se denna ändring på $1',
 'enotif_anon_editor' => 'anonym användare $1',
-'enotif_body' => '$WATCHINGUSERNAME,
-
-{{SITENAME}}-sidan $PAGETITLE har blivit $CHANGEDORCREATED $PAGEEDITDATE av $PAGEEDITOR; se $PAGETITLE_URL för den nuvarande versionen.
+'enotif_body' => 'Hej $WATCHINGUSERNAME,
 
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Angiven sammanfattning av redigeringen: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2374,7 +2392,7 @@ wiki: $PAGEEDITOR_WIKI
 Såvida du inte besöker sidan, kommer du inte att få flera meddelanden om ändringar av sidan.
 Du kan också ta bort flaggan för meddelanden om ändringar på alla sidor i din bevakningslista.
 
-             Hälsningar från {{SITENAME}}s meddelandesystem
+Hälsningar från {{SITENAME}}s meddelandesystem
 
 --
 För att ändra inställningarna för dina uppdateringar via e-post, besök
@@ -2536,7 +2554,8 @@ I sådana fall måste du se till att den senaste raderade versionen inte är ikr
 'undeletedrevisions' => '{{PLURAL:$1|en version återställd|$1 versioner återställda}}',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|version|versioner}} och $2 {{PLURAL:$2|fil|filer}} återställda',
 'undeletedfiles' => '{{PLURAL:$1|en fil återställd|$1 filer återställda}}',
-'cannotundelete' => 'Återställning misslyckades; kanske någon redan har återställt sidan.',
+'cannotundelete' => 'Återställning misslyckades:
+$1',
 'undeletedpage' => "'''$1 har återställts'''
 
 Se [[Special:Log/delete|raderingsloggen]] för en förteckning över de senaste raderingarna och återställningarna.",
@@ -2567,9 +2586,9 @@ $1',
 'blanknamespace' => '(Huvudnamnrymden)',
 
 # Contributions
-'contributions' => 'Användarbidrag',
+'contributions' => '{{GENDER:$1|Användarbidrag}}',
 'contributions-title' => 'Bidrag av $1',
-'mycontris' => 'Mina bidrag',
+'mycontris' => 'Bidrag',
 'contribsub2' => 'För $1 ($2)',
 'nocontribs' => 'Inga ändringar som motsvarar dessa kriterier hittades.',
 'uctop' => '(senaste)',
@@ -2615,8 +2634,8 @@ Den senaste posten i blockeringsloggen visas nedan som referens:',
 
 # Block/unblock
 'autoblockid' => 'Autoblockera #$1',
-'block' => 'Blockera användaren',
-'unblock' => 'Avblockera användaren',
+'block' => 'Blockera användare',
+'unblock' => 'Upphäv blockering av användare',
 'blockip' => 'Blockera användare',
 'blockip-title' => 'Blockera användare',
 'blockip-legend' => 'Blockera användare',
@@ -2646,7 +2665,7 @@ Ange orsak nedan (exempelvis genom att nämna sidor som blivit vandaliserade).',
 'ipbotherreason' => 'Annan/ytterligare anledning:',
 'ipbhidename' => 'Dölj användarnamnet från redigeringar och listor',
 'ipbwatchuser' => 'Bevaka användarens användarsida och diskussionssida',
-'ipb-disableusertalk' => 'Hindra denne användare från att redigera sina egna diskussionssida under blockeringen',
+'ipb-disableusertalk' => 'Hindra användaren från att redigera sina egna diskussionssida under blockeringen',
 'ipb-change-block' => 'Återblockera användaren med de här inställningarna',
 'ipb-confirm' => 'Bekräfta blockering',
 'badipaddress' => 'Du har inte skrivit IP-adressen korrekt.',
@@ -2838,6 +2857,7 @@ Den titel du vill flytta sidan till, "[[:$1]]", finns redan. Vill du radera den
 'immobile-target-namespace-iw' => 'Interwikilänk är inte ett giltigt mål för sidflyttar.',
 'immobile-source-page' => 'Denna sida är inte flyttbar.',
 'immobile-target-page' => 'Kan inte flytta till det målnamnet.',
+'bad-target-model' => 'Den önskade destinationen använder en annan innehållsmodell. Kan inte konvertera från $1 till $2.',
 'imagenocrossnamespace' => 'Kan inte flytta filer till andra namnrymder än filnamnrymden',
 'nonfile-cannot-move-to-file' => 'Kan inte flytta icke-fil till filnamnrymden',
 'imagetypemismatch' => 'Den nya filändelsen motsvarar inte filtypen',
@@ -2965,7 +2985,6 @@ Spara den på din dator och ladda upp den här.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript-testning',
-'javascripttest-disabled' => 'Denna funktion har inte aktiverats på denna wiki.',
 'javascripttest-title' => 'Kör $1 tester',
 'javascripttest-pagetext-noframework' => 'Denna sida är reserverat för att köra JavaScript-tester.',
 'javascripttest-pagetext-unknownframework' => 'Okänd testmiljö "$1".',
@@ -3107,6 +3126,7 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 
 # Info page
 'pageinfo-title' => 'Information om "$1"',
+'pageinfo-not-current' => 'Informationen kan endast visas för den aktuella versionen.',
 'pageinfo-header-basic' => 'Grundläggande information',
 'pageinfo-header-edits' => 'Redigeringshistorik',
 'pageinfo-header-restrictions' => 'Sidskydd',
@@ -3115,7 +3135,8 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'pageinfo-default-sort' => 'Standardsorteringsnyckel',
 'pageinfo-length' => 'Sidlängd (i byte)',
 'pageinfo-article-id' => 'Sid-ID',
-'pageinfo-robot-policy' => 'Sökmotorns status',
+'pageinfo-language' => 'Språk för sidinnehåll',
+'pageinfo-robot-policy' => 'Sökmotordirektiv',
 'pageinfo-robot-index' => 'Indexerbar',
 'pageinfo-robot-noindex' => 'Inte indexerbar',
 'pageinfo-views' => 'Antal visningar',
@@ -3131,9 +3152,17 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'pageinfo-authors' => 'Totalt antal olika författare',
 'pageinfo-recent-edits' => 'Antal nyliga redigeringar (inom de senaste $1)',
 'pageinfo-recent-authors' => 'Antal nyliga olika författare',
-'pageinfo-restriction' => 'Sidskydd ({{lcfirst:$1}})',
 'pageinfo-magic-words' => '{{PLURAL:$1|Magiskt|Magiska}} ord ($1)',
 'pageinfo-hidden-categories' => '{{PLURAL:$1|Dold kategori|Dolda kategorier}} ($1)',
+'pageinfo-templates' => '{{PLURAL:$1|Inkluderad mall|Inkluderade mallar}} ($1)',
+'pageinfo-toolboxlink' => 'Sidinformation',
+'pageinfo-redirectsto' => 'Omdirigerar till',
+'pageinfo-redirectsto-info' => 'info',
+'pageinfo-contentpage' => 'Räknas som en innehållssida',
+'pageinfo-contentpage-yes' => 'Ja',
+'pageinfo-protect-cascading' => 'Skrivskydd kaskaderar härifrån',
+'pageinfo-protect-cascading-yes' => 'Ja',
+'pageinfo-protect-cascading-from' => 'Skrivskydd kaskaderar från',
 
 # Skin names
 'skinname-standard' => 'Standard',
@@ -3156,6 +3185,8 @@ Detta orsakades troligen av en länk till en svartlistad webbplats.',
 'markedaspatrollederror' => 'Kan inte markera som patrullerad',
 'markedaspatrollederrortext' => 'Det går inte att markera som patrullerad utan att ange version.',
 'markedaspatrollederror-noautopatrol' => 'Du har inte tillåtelse att markera dina egna redigeringar som patrullerade.',
+'markedaspatrollednotify' => 'Denna ändring till $1 har markerats som patrullerad.',
+'markedaspatrollederrornotify' => 'Markering som patrullerad misslyckades.',
 
 # Patrol log
 'patrol-log-page' => 'Patrulleringslogg',
@@ -3188,7 +3219,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',
+'svg-long-desc-animated' => 'Animerad SVG-fil, standardstorlek $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.',
@@ -3220,6 +3251,7 @@ Om du kör den kan din dator skadas.",
 'hours' => '{{PLURAL:$1|$1 timme|$1 timmar}}',
 'days' => '{{PLURAL:$1|$1 dag|$1 dagar}}',
 'ago' => '$1 sedan',
+'just-now' => 'precis nu',
 
 # Bad image list
 'bad_image_list' => 'Listan fungerar enligt följande:
@@ -3713,6 +3745,7 @@ Denna bekräftelsekod kommer att sluta fungera efter $4.',
 # Scary transclusion
 'scarytranscludedisabled' => '[Interwiki-inklusion är inte aktiverad]',
 'scarytranscludefailed' => '[Hämtning av mall för $1 misslyckades]',
+'scarytranscludefailed-httpstatus' => '[Hämtning av mall för $1 misslyckades: HTTP $2]',
 'scarytranscludetoolong' => '[För lång URL]',
 
 # Delete conflict
@@ -3830,6 +3863,7 @@ Du kan också [[Special:EditWatchlist|använda standardeditorn]].',
 'version-license' => 'Licens',
 'version-poweredby-credits' => "Den här wikin drivs av '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'andra',
+'version-credits-summary' => 'Vi skulle vilja tacka följande personer för deras bidrag till [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki är fri programvara; du kan distribuera det och/eller modifiera det under villkoren i GNU General Public License, publicerad av Free Software Foundation; antingen version 2 av licensen, eller (om du önskar) någon senare version. 
 
 MediaWiki distribueras i hopp om att det ska vara användbart, men UTAN NÅGON GARANTI, även utan underförstådd garanti om SÄLJBARHET eller LÄMPLIGHET FÖR ETT VISST SYFTE. Se GNU General Public License för fler detaljer. 
@@ -3969,9 +4003,9 @@ Bilder visas i full upplösning, andra filtyper öppnas direkt i de program som
 'logentry-move-move_redir-noredirect' => '$1 flyttade sidan $3 till $4 över en omdirigering utan att lämna en omdirigering',
 'logentry-patrol-patrol' => '$1 markerade versionen $4 av sidan $3 som patrullerad',
 'logentry-patrol-patrol-auto' => '$1 markerade automatiskt versionen $4 av sidan $3 som patrullerad',
-'logentry-newusers-newusers' => '$1 skapade ett användarkonto',
-'logentry-newusers-create' => '$1 skapade ett användarkonto',
-'logentry-newusers-create2' => '$1 skapade ett användarkonto $3',
+'logentry-newusers-newusers' => 'Användarkonto $1 skapades',
+'logentry-newusers-create' => 'Användarkonto $1 skapades',
+'logentry-newusers-create2' => 'Användarkonto $3 skapades av $1',
 'logentry-newusers-autocreate' => 'Kontot $1 skapades automatiskt',
 'newuserlog-byemail' => 'lösenord skickat med e-post',
 
@@ -3991,6 +4025,10 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'feedback-bugcheck' => 'Jättebra! Bara kontrollera att det inte är en av de [$1 kända buggarna].',
 'feedback-bugnew' => 'Jag kontrollerade. Rapportera ett nytt fel',
 
+# Search suggestions
+'searchsuggest-search' => 'Sök',
+'searchsuggest-containing' => 'innehåller...',
+
 # API errors
 'api-error-badaccess-groups' => 'Du får inte ladda upp filer till denna wiki.',
 'api-error-badtoken' => 'Internt fel: felaktig token.',
@@ -4043,4 +4081,6 @@ Annars kan du använda det enkla formuläret nedan. Din kommentar kommer att lä
 'duration-centuries' => '$1 {{PLURAL:$1|sekel|sekel}}',
 'duration-millennia' => '$1 {{PLURAL:$1|millennium|millennier}}',
 
+# Unknown messages
+'svg-long-error' => 'Felaktig SVG-fil: $1',
 );
index 9ea67af..c3b74fe 100644 (file)
@@ -259,7 +259,7 @@ $messages = array(
 'cancel' => 'Batilisha',
 'moredotdotdot' => 'Zaidi...',
 'mypage' => 'Ukurasa wangu',
-'mytalk' => 'Majadiliano yangu',
+'mytalk' => 'Majadiliano',
 'anontalk' => 'Majadiliano ya IP hii',
 'navigation' => 'Urambazaji',
 'and' => '&#32;na',
@@ -269,7 +269,6 @@ $messages = array(
 'qbbrowse' => 'Vinjari',
 'qbedit' => 'Hariri',
 'qbpageoptions' => 'Ukurasa huu',
-'qbpageinfo' => 'Muktadha',
 'qbmyoptions' => 'Kurasa zangu',
 'qbspecialpages' => 'Kurasa za pekee',
 'faq' => 'Maswali ya kawaida',
@@ -292,6 +291,7 @@ $messages = array(
 'namespaces' => 'Maeneo ya wiki',
 'variants' => 'Vibadala',
 
+'navigation-heading' => 'Urambazaji',
 'errorpagetitle' => 'Hitilafu',
 'returnto' => 'Rudia $1.',
 'tagline' => 'Kutoka {{SITENAME}}',
@@ -521,16 +521,14 @@ Sababu zilizotolewa ni "\'\'$2\'\'".',
 
 # Virus scanner
 'virus-badscanner' => "Usanidi mbaya: kiskani virusi hakijulikani: ''$1''",
-'virus-scanfailed' => 'skani imeshindwa (kodi $1)',
+'virus-scanfailed' => 'skani imeshindwa (msimbo $1)',
 'virus-unknownscanner' => 'kipambana na virusi haijulikani:',
 
 # Login and logout pages
 'logouttext' => "'''Umetoka kwenye akaunti yako.'''
 
-Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza [[Special:UserLogin|kuingia tena]] kwenye akaunti yako. Kumbuka kwamba kurasa nyingine zitaendelea kuonekana kana kwamba bado hujatoka kwenye akaunti yako, hadi utakaposafisha kache ya kivinjari.",
-'welcomecreation' => '== Karibu, $1! ==
-Ushafunguliwa akaunti yako tayari.
-Usisahau kubadilisha mapendekezo yako ya [[Special:Preferences|{{SITENAME}}]].',
+Unaweza kuendelea kutumia {{SITENAME}} bila kutaja jina lako, au unaweza <span class='plainlinks'>[$1 kuingia tena]</span> kwenye akaunti yako. Kumbuka kwamba kurasa nyingine zitaendelea kuonekana kana kwamba bado hujatoka kwenye akaunti yako, hadi utakaposafisha kache ya kivinjari.",
+'welcomeuser' => 'Karibu, $1!',
 'yourname' => 'Jina la mtumiaji:',
 'yourpassword' => 'Neno la siri:',
 'yourpasswordagain' => 'Andika tena neno la siri',
@@ -633,7 +631,7 @@ Tafadhali subiri kwanza kabla ya kujaribu tena.',
 
 # Change password dialog
 'resetpass' => 'Kubadilisha neno la siri',
-'resetpass_announce' => 'Umeingia na kodi za barua pepe za muda tu.
+'resetpass_announce' => 'Umeingia na msimbo wa barua pepe wa muda tu.
 Kumalizia kuingia ndani, ni lazima urekebishe neno la siri jipya hapa:',
 'resetpass_header' => 'Kubadilisha neno la siri la akaunti',
 'oldpassword' => 'Neno la siri la zamani',
@@ -779,7 +777,7 @@ Labda itakusumbua kwamba kuna maoni mengine yanawekwa hapa na unaamini kwamba ha
 'noarticletext' => 'Ukurasa huu haujaandikwa bado. [[Special:Search/{{PAGENAME}}|tafutia jina hili]] katika kurasa nyingine, <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tafuta kumbukumbu zinazohusika], au [{{fullurl:{{FULLPAGENAME}}|action=edit}} hariri ukurasa huu]</span>.',
 'noarticletext-nopermission' => 'Kwa sasa hakuna maandishi katika ukurasa huu.
 Unaweza [[Special:Search/{{PAGENAME}}|kutafuta jina la ukurasa huu]] katika kurasa nyingine,
-au <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tafuta ingizo linalofanana]</span>.',
+au <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tafuta kumbukumbu zinazohusika]</span>, lakini huruhusiwi kuanzisha ukurasa huu.',
 'userpage-userdoesnotexist' => 'Akaunti ya mtumiaji "<nowiki>$1</nowiki>" haijasajilishwa.
 Ukitaka kuanzisha au kuhariri ukurasa huu tafadhali ucheki jina la akaunti.',
 'userpage-userdoesnotexist-view' => 'Akaunti ya mtumiaji "$1" haijasajilishwa.',
@@ -1098,8 +1096,6 @@ Tazama [[Special:BlockList|IP block orodha ya uzuio wa IP]] kuona orodha ya zuio
 'search-interwiki-caption' => 'Miradi ya jumuia',
 'search-interwiki-default' => 'Matokeo toka $1:',
 'search-interwiki-more' => '(zaidi)',
-'search-mwsuggest-enabled' => 'na mapendekezo',
-'search-mwsuggest-disabled' => 'bila makendekezo',
 'search-relatedarticle' => 'Zingine zinazofanana',
 'mwsuggest-disable' => 'Kutoonyesha mapendekezo ya AJAX',
 'searcheverything-enable' => 'Tafuta katika maeneo yote ya wiki',
@@ -1134,7 +1130,7 @@ Ujue lakini kwamba kumbukumbu za {{SITENAME}} kule Google labda zilipitwa na wak
 
 # Preferences page
 'preferences' => 'Mapendekezo',
-'mypreferences' => 'Mapendekezo yangu',
+'mypreferences' => 'Mapendekezo',
 'prefs-edits' => 'Idadi ya marekebisho:',
 'prefsnologin' => 'Hujaingia',
 'prefsnologintext' => 'Inabidi <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} uingie akaunti yako]</span> ili ubadilishe mapendekezo yako.',
@@ -1983,7 +1979,7 @@ Anwani yako ya barua pepe ulioitaja katika [[Special:Preferences|mapendekezo yak
 
 # Watchlist
 'watchlist' => 'Maangalizi yangu',
-'mywatchlist' => 'Maangalizi yangu',
+'mywatchlist' => 'Maangalizi',
 'watchlistfor2' => 'Kwa ajili ya $1 $2',
 'nowatchlist' => 'Hamna vitu katika maangalizi yako.',
 'watchlistanontext' => 'Tafadhali $1 ili kutazama au kuhariri vitu vilivyopo katika orodha yako ya maangalizi.',
@@ -2023,11 +2019,7 @@ Ukitaka kufuta ukurasa huo kutoka maangalizi yako baadaye, bonyeza \"Acha kufuat
 
 'enotif_mailer' => 'Huduma ya taarifa ya barua pepe kutoka kwa {{SITENAME}}',
 '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 $1 kwa mabadiliko yote tangu ziara yako ya mwisho.',
 'enotif_lastdiff' => 'Tazama badiliko hili hapo $1.',
 'enotif_anon_editor' => 'mtumiaji bila jina $1',
@@ -2204,7 +2196,7 @@ $1',
 # Contributions
 'contributions' => 'Michango ya mtumiaji',
 'contributions-title' => 'Michango ya mtumiaji $1',
-'mycontris' => 'Michango yangu',
+'mycontris' => 'Michango',
 'contribsub2' => 'Kwa $1 ($2)',
 'nocontribs' => 'Mabadiliko yanayolingana na vigezo vilivyoulizwa hayakupatikana.',
 'uctop' => '(juu)',
@@ -2572,6 +2564,8 @@ Tafadhali jaribu tena.',
 'pageinfo-header-edits' => 'Maharirio',
 'pageinfo-watchers' => 'Idadi ya wanaofuatilia',
 'pageinfo-edits' => 'Idadi ya maharirio',
+'pageinfo-contentpage-yes' => 'Ndiyo',
+'pageinfo-protect-cascading-yes' => 'Ndiyo',
 
 # Image deletion
 'deletedrevision' => 'Pitio la awali lililofutwa $1',
@@ -2694,7 +2688,7 @@ likifupishwa. Nyuga zingine zitafichwa kama chaguo-msingi.
 'exif-keywords' => 'Maneno yahusika',
 'exif-worldregioncreated' => 'Eneo la dunia palipopigwa picha',
 'exif-countrycreated' => 'Nchi palipopigwa picha',
-'exif-countrycodecreated' => 'Kodi ya nchi picha palipopigwa',
+'exif-countrycodecreated' => 'Msimbo wa nchi picha palipopigwa',
 'exif-countrydest' => 'Nchi inayoonyeshwa',
 'exif-citydest' => 'Mji umeonyeshwa',
 'exif-objectname' => 'Jina fupi',
@@ -2890,7 +2884,7 @@ na kama *huja* sajili akaunti hii, fuata kiungo hiki ili kubatilisha uthibitisho
 
 $5
 
-Kodi hizi za uthibitisho zitaishia mnamo $4.',
+Msimbo huu wa uthibitisho utaishia mnamo $4.',
 'confirmemail_body_changed' => 'Kuna mtu, huenda ikawa wewe, kutoka anwani ya IP $1, ambaye amebadilisha anwani ya barua pepe ya akaunti "$2" iwe anwani ya barua pepe hii, kule {{SITENAME}}.
 
 Ili kuthibitisha ya kwamba akaunti hii inamilikiwa na wewe, pamoja na kuwezesha upya zana zinazotumia barua pepe kule {{SITENAME}}, ufungue kiungo hiki katika kivinjari chako:
@@ -3157,6 +3151,10 @@ Tovuti hii inapata matatatizo wakati huu.',
 'feedback-thanks' => 'Ahsante! Maoni yako yamewekwa kwenye ukurasa wa "[$2 $1]".',
 'feedback-close' => 'Tayari',
 
+# Search suggestions
+'searchsuggest-search' => 'Kutafuta',
+'searchsuggest-containing' => 'ya maneno...',
+
 # API errors
 'api-error-empty-file' => 'Faili ulilowasilisha ni tupu.',
 'api-error-emptypage' => 'Kutengeneza mpya, kurasa tupu hazikubaliwi',
index c843c68..38e810f 100644 (file)
@@ -208,7 +208,6 @@ $messages = array(
 'qbbrowse' => 'Uoglůndańy',
 'qbedit' => 'Sprowjej',
 'qbpageoptions' => 'Ta zajta',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Moje zajty',
 'qbspecialpages' => 'Szpecyjalne zajty',
 'faq' => 'FAQ',
@@ -451,11 +450,8 @@ Administrator kery zawarł wćepał kůmyntorz: "$3".',
 # Login and logout pages
 'logouttext' => "'''Terozki ježeś wylůgowany'''.
 
-Možeš dali sam sprowjać zajty we {{SITENAME}} kej ńyzalůgowany užytkowńik, abo [[Special:UserLogin|zalůgować śe nazod]] kej tyn som abo inkšy užytkowńik.
+Možeš dali sam sprowjać zajty we {{SITENAME}} kej ńyzalůgowany užytkowńik, abo <span class='plainlinks'>[$1 zalůgować śe nazod]</span> kej tyn som abo inkšy užytkowńik.
 Dej pozůr, co na ńykerych zajtach přeglůndarka može dali pokozywać co ježeś zalůgowany, a bydźe tak aže uodśwjyžyš jeij cache.",
-'welcomecreation' => '== Witej, $1! ==
-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' => 'Hasło:',
 'yourpasswordagain' => 'Naszkryflej ausdruk zaś',
@@ -967,8 +963,6 @@ $1',
 'search-interwiki-caption' => 'Śostřane projekty',
 'search-interwiki-default' => '$1 wyńiki:',
 'search-interwiki-more' => '(wjyncyj)',
-'search-mwsuggest-enabled' => 'ze sůgestyjůma',
-'search-mwsuggest-disabled' => 'ńy mo sůgestyji',
 'search-relatedarticle' => 'Podane',
 'mwsuggest-disable' => 'Wyuůnč sůgestyje AJAX',
 'searcheverything-enable' => 'Sznupej we wszech mjan',
@@ -1718,11 +1712,7 @@ Na tyi liśće bydźeš mjou rejer přišuych sprowjyń tyi zajty i jeji zajty g
 
 'enotif_mailer' => 'Powjadomjyńe s {{GRAMMAR:D.lp|{{SITENAME}}}}',
 'enotif_reset' => 'Uoznoč wšyjstke zajty kej uodwjydzůne',
-'enotif_newpagetext' => 'To je nowo zajta.',
 'enotif_impersonal_salutation' => 'užytkowńik {{GRAMMAR:D.lp|{{SITENAME}}}}',
-'changed' => 'pomjyńono',
-'created' => 'utwořono',
-'enotif_subject' => 'Zajta $PAGETITLE we {{GRAMMAR:MS.lp|{{SITENAME}}}} zostoua $CHANGEDORCREATED bez užytkowńika $PAGEEDITOR',
 'enotif_lastvisited' => 'Uobejřij na zajće $1 wšyjstke půmjyńańo uod Twojej uostatńij wizyty.',
 'enotif_lastdiff' => 'Uobejřij na zajće $1 te pomjyńeńe.',
 'enotif_anon_editor' => 'užytkowńik anůnimowy $1',
index ac40d29..82084bc 100644 (file)
@@ -129,7 +129,7 @@ $messages = array(
 
 'underline-always' => 'எப்பொழுதும்',
 'underline-never' => 'எப்போதுமில்லை',
-'underline-default' => 'உலாவி இயல்பிருப்பு',
+'underline-default' => 'தà¯\8bலà¯\8d à®\85லà¯\8dலதà¯\81 à®\89லாவி à®\87யலà¯\8dபிரà¯\81பà¯\8dபà¯\81',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'தொகுத்தல் பெட்டி எழுத்துரு:',
@@ -214,8 +214,8 @@ $messages = array(
 'newwindow' => '(புதிய சாளரத்துள் திறக்கும்)',
 'cancel' => 'சேமிக்காமல் திரும்பு',
 'moredotdotdot' => 'மேலும்...',
-'mypage' => 'à®\8eனதà¯\81 à®ªà®\95à¯\8dà®\95à®®à¯\8d',
-'mytalk' => 'à®\8eனà¯\8d à®ªà¯\87à®\9aà¯\8dà®\9aà¯\81',
+'mypage' => 'பக்கம்',
+'mytalk' => 'பேச்சு',
 'anontalk' => 'இந்த ஐ.பி. முகவரிக்கான பேச்சு',
 'navigation' => 'வழிசெலுத்தல்',
 'and' => ' மற்றும்',
@@ -225,7 +225,6 @@ $messages = array(
 'qbbrowse' => 'உலவு',
 'qbedit' => 'தொகு',
 'qbpageoptions' => 'பக்க விருப்பத் தேர்வுகள்',
-'qbpageinfo' => 'பக்கத் தகவல்கள்',
 'qbmyoptions' => 'என் விருப்பத்தேர்வுகள்',
 'qbspecialpages' => 'சிறப்புப் பக்கங்கள்',
 'faq' => 'அடிக்கடி கேட்கப்படும் கேள்விகள்',
@@ -346,6 +345,7 @@ $1',
 'youhavenewmessages' => 'உங்களுக்குப் $1 உள்ளன ($2).',
 'newmessageslink' => 'புதிய செய்திகள்',
 'newmessagesdifflink' => 'கடைசி மாற்றம்',
+'youhavenewmessagesfromusers' => 'உங்களுக்கு $1 {{PLURAL:$3|வேறொரு பயனரிடம்|$3 பயனர்களிடம்}} இருந்து உள்ளது ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|ஒரு புதிய செய்தி|புதிய செய்திகள்}}',
 'newmessagesdifflinkplural' => 'கடைசி {{PLURAL:$1|மாற்றம்|மாற்றங்கள்}}',
 'youhavenewmessagesmulti' => '$1 இல் உங்களுக்கு புதிய செய்திகள் காத்திருக்கின்றன',
@@ -479,9 +479,9 @@ MySQL returned error "$3: $4".',
 # Login and logout pages
 'logouttext' => "'''நீங்கள் இப்பொழுது விடுபதிகையில் உள்ளீர்கள்.'''
 
-நீங்கள் தொடர்ந்து {{SITENAME}} தளத்தை அனானியாகப் பயன்படுத்தலாம், அல்லது அதே பயனராகவோ வேறு பயனராகவோ [[Special:UserLogin|மீண்டும் புகுபதிகை]] செய்யலாம். உங்கள் உலாவியின் இடைமாற்று நீக்கப்படும் வரை சில பக்கங்கள் தொடர்ந்தும் புகுபதிகையில் உள்ளது போன்றே காட்சி தரும் என்பதைக் கவனிக்கவும்.",
-'welcomecreation' => '==நல்வரவு, $1!==
-உங்களுக்கான பயனர் கணக்கு உருவாக்கப்பட்டுள்ளது. உங்களுக்கேற்றவாறு [[Special:Preferences|{{SITENAME}} விருப்பத்தேர்வுகளை]] மாற்றிக் கொள்ள மறவாதீர்கள்.',
+நீங்கள் தொடர்ந்து {{SITENAME}} தளத்தை அனானியாகப் பயன்படுத்தலாம், அல்லது அதே பயனராகவோ வேறு பயனராகவோ <span class='plainlinks'>[$1 மீண்டும் புகுபதிகை]</span> செய்யலாம். உங்கள் உலாவியின் இடைமாற்று நீக்கப்படும் வரை சில பக்கங்கள் தொடர்ந்தும் புகுபதிகையில் உள்ளது போன்றே காட்சி தரும் என்பதைக் கவனிக்கவும்.",
+'welcomeuser' => 'வருக $1',
+'welcomecreation-msg' => 'உங்களுக்கான பயனர் கணக்கு உருவாக்கப்பட்டுள்ளது. உங்களுக்கேற்றவாறு [[Special:Preferences|{{SITENAME}} விருப்பத்தேர்வுகளை]] மாற்றிக் கொள்ள மறவாதீர்கள்.',
 'yourname' => 'பயனர் பெயர்:',
 'yourpassword' => 'கடவுச்சொல்:',
 'yourpasswordagain' => 'கடவுச்சொல்லைத் திரும்ப தட்டச்சிடுக:',
@@ -682,7 +682,7 @@ $2
 * தடை செய்யப்பட்டவர்: $7
 
 $1 பயனரையோ அல்லது வேறு [[{{MediaWiki:Grouppage-sysop}}|நிர்வாகி]] ஒருவரையோ அனுகி தடைப் பற்றி கலந்துரையாடலாம். 'இப் பயனருக்கு மின்னஞ்சல் செய்' என்ற வசதியை நீங்கள் பயன்படுத்துவதுலிருந்து தடைச் செய்யப்பட்டிருந்தாலோ அல்லது [[Special:Preferences|என் விருப்பத்தேர்வுகள்]] பக்கத்தில் இயங்குநிலையிலுள்ள மின்னஞ்சல் முகவரியை தராத போதோ பயனருக்கு மின்னஞ்சல் செய்ய முடியாது. உங்களது தற்போதைய ஐ.பி. முகவரி $3 மற்றும் தடை எண்  #$5 என்பவற்றை கேள்விகள் கேட்கும் போது கட்டாயம் குறிப்பிடவும்.",
-'autoblockedtext' => '$1 ஆல் தடைச்செய்யப்பட்ட வேறு பயனரால் பயன்படுத்தபட்டதால், உங்கள் ஐ.பி. முகவரி தானியக்கமாக தடுக்கப்பட்டுள்ளது. அதற்கான காரணம் பின்வருமாறு:
+'autoblockedtext' => 'உங்கள் ஐ.பி. முகவரி தடை செய்யப்பட்டுள்ளது. அதே முகவரியைப் பயன்படுத்தித் தொக்குத்த யாரோ ஒரு பயனர் பின்வரும் காரணங்களுக்காகத் தடை செய்யப்பட்டுள்ளார். அதனால் உங்களால் தொகுக்க முடியவில்லை. அதற்கான காரணம் பின்வருமாறு:
 
 :\'\'$2\'\'
 
@@ -690,11 +690,11 @@ $1 பயனரையோ அல்லது வேறு [[{{MediaWiki:Grouppage
 * தடை முடிவு: $6
 * தடை செய்யப்பட்டவர்: $7
 
-$1 à®ªà®¯à®©à®°à¯\88யà¯\8b à®\85லà¯\8dலதà¯\81 à®µà¯\87à®±à¯\81 [[{{MediaWiki:Grouppage-sysop}}|நிரà¯\8dவாà®\95ி]] à®\92à®°à¯\81வரà¯\88யà¯\8b à®\85னà¯\81à®\95ி à®¤à®\9fைப் பற்றி கலந்துரையாடலாம்.
+$1 à®\8eனà¯\81à®®à¯\8d à®ªà®¯à®©à®°à¯\88யà¯\8b à®µà¯\87à®±à¯\81 [[{{MediaWiki:Grouppage-sysop}}|நிரà¯\8dவாà®\95ி]] à®\92à®°à¯\81வரà¯\88யà¯\8b à®\85னà¯\81à®\95ிதà¯\8d à®¤à®\9fà¯\88யைப் பற்றி கலந்துரையாடலாம்.
 
-"à®\87பà¯\8d à®ªà®¯à®©à®°à¯\81à®\95à¯\8dà®\95à¯\81 à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\9aà¯\86யà¯\8d" à®\8eனà¯\8dà®± à®µà®\9aதியà¯\88 à®¨à¯\80à®\99à¯\8dà®\95ளà¯\8d à®ªà®¯à®©à¯\8dபà®\9fà¯\81தà¯\81வதிலிரà¯\81நà¯\8dதà¯\81 à®¤à®\9fà¯\88à®\9aà¯\8d à®\9aà¯\86யà¯\8dயபà¯\8dபà®\9fà¯\8dà®\9fிரà¯\81நà¯\8dதாலà¯\8b à®\85லà¯\8dலதà¯\81 [[Special:Preferences|à®\8eனà¯\8d à®µà®¿à®°à¯\81பà¯\8dபதà¯\8dதà¯\87à®°à¯\8dவà¯\81à®\95ளà¯\8d]] à®ªà®\95à¯\8dà®\95தà¯\8dதிலà¯\8d à®\87யà®\99à¯\8dà®\95à¯\81நிலà¯\88யிலà¯\81ளà¯\8dள à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®®à¯\81à®\95வரியà¯\88 à®¤à®°à®¾à®¤ போதோ பயனருக்கு மின்னஞ்சல் செய்ய முடியாது.
+"à®\87பà¯\8d à®ªà®¯à®©à®°à¯\81à®\95à¯\8dà®\95à¯\81 à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®\9aà¯\86யà¯\8d" à®\8eனà¯\8dà®± à®µà®\9aதியà¯\88 à®¨à¯\80à®\99à¯\8dà®\95ளà¯\8d à®ªà®¯à®©à¯\8dபà®\9fà¯\81தà¯\8dதà¯\81வதிலிரà¯\81நà¯\8dதà¯\81 à®¤à®\9fà¯\88à®\9aà¯\8d à®\9aà¯\86யà¯\8dயபà¯\8dபà®\9fà¯\8dà®\9fிரà¯\81நà¯\8dதாலà¯\8b à®\85லà¯\8dலதà¯\81 [[Special:Preferences|à®\8eனà¯\8d à®µà®¿à®°à¯\81பà¯\8dபதà¯\8dதà¯\87à®°à¯\8dவà¯\81à®\95ளà¯\8d]] à®ªà®\95à¯\8dà®\95தà¯\8dதிலà¯\8d à®\87யà®\99à¯\8dà®\95à¯\81நிலà¯\88யிலà¯\81ளà¯\8dள à®®à®¿à®©à¯\8dனà®\9eà¯\8dà®\9aலà¯\8d à®®à¯\81à®\95வரியà¯\88தà¯\8d à®¤à®°à®¾à®¤போதோ பயனருக்கு மின்னஞ்சல் செய்ய முடியாது.
 
-à®\89à®\99à¯\8dà®\95ளதà¯\81 à®¤à®±à¯\8dபà¯\8bதà¯\88ய à®\90.பி. à®®à¯\81à®\95வரி $3 à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®¤à®\9fà¯\88 à®\8eணà¯\8d #$5 à®\8eனà¯\8dபவறà¯\8dà®±à¯\88 à®\95à¯\87ளà¯\8dவிà®\95ளà¯\8d à®\95à¯\87à®\9fà¯\8dà®\95à¯\81à®®à¯\8d à®ªà¯\8bதà¯\81 கட்டாயம் குறிப்பிடவும்.',
+à®\87தà¯\88பà¯\8d à®ªà®±à¯\8dறிய à®\89à®\99à¯\8dà®\95ளà¯\8d à®\95à¯\87ளà¯\8dவிà®\95ளà¯\88à®\95à¯\8d à®\95à¯\87à®\9fà¯\8dà®\95à¯\81à®®à¯\8dபà¯\8bதà¯\81 à®\89à®\99à¯\8dà®\95ளதà¯\81 à®¤à®±à¯\8dபà¯\8bதà¯\88ய à®\90.பி. à®®à¯\81à®\95வரி $3 à®®à®±à¯\8dà®±à¯\81à®®à¯\8d à®¤à®\9fà¯\88 à®\8eணà¯\8d #$5 à®\86à®\95ியவறà¯\8dà®±à¯\88à®\95à¯\8d கட்டாயம் குறிப்பிடவும்.',
 'blockednoreason' => 'காரணம் தரப்படவில்லை',
 'whitelistedittext' => 'நீங்கள் பக்கங்களத் தொகுக்க $1 செய்யவேண்டும்.',
 'confirmedittext' => 'நீங்கள் பக்கங்களைத் தொகுக்க முன்னர் மின்னஞ்சல் முகவரியை உறுதிப்படுத்த வேண்டும். உங்கள் [[Special:Preferences|விருப்பத்தேர்வுகள்]] பக்கத்தில் செல்லுபடியான மின்னஞ்சலைக் கொடுத்து அதனை உறுதிப்படுத்துங்கள்.',
@@ -716,7 +716,7 @@ $1 பயனரையோ அல்லது வேறு [[{{MediaWiki:Grouppage
 'noarticletext' => 'இப் பக்கத்தில் தற்பொழுது உள்ளடக்கம் எதுவுமில்லை. நீங்கள் இப்பக்க [[Special:Search/{{PAGENAME}}|தலைப்பை வேறு பக்கங்களில் தேடவோ]] அல்லது [{{fullurl:{{FULLPAGENAME}}|action=edit}} இப்பக்கத்தை தொகுக்கவோ] முடியும்.',
 'noarticletext-nopermission' => 'தற்பொழுது இப்பக்கத்தில் உரை எதுவும் இல்லை.
 நீங்கள் [[Special:Search/{{PAGENAME}}|பக்கத் தலைப்பை வைத்து]] அல்லது மற்ற பக்கங்களில்,
-or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} அல்லது தேடுதல் தொடர்பான பதிவுகளில் தேடவும்.]</span>.',
+அல்லது <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>" என்றக் கணக்கு இன்னமும் பதிவுச் செய்யப்படவில்லை. இதை உருவாக்க/தொகுக்க வேண்டுமா என்பதை உறுதிப்படுத்தவும்.',
@@ -741,7 +741,7 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'updated' => '(இற்றைப்படுத்தப்பட்டது)',
 'note' => "'''குறிப்பு:'''",
 'previewnote' => "'''இது ஒரு முன்தோற்றம் மட்டுமே''', உங்கள் மாற்றங்கள் இன்னும் சேமிக்கப்படவில்லை!",
-'continue-editing' => 'தà¯\8aà®\95à¯\81தà¯\8dதலà¯\88தà¯\8d à®¤à¯\8aà®\9fà®°வும்',
+'continue-editing' => 'தà¯\8aà®\95à¯\81à®\95à¯\8dà®\95à¯\81à®®à¯\8d à®ªà®\95à¯\81திà®\95à¯\8dà®\95à¯\81 à®\9aà¯\86லà¯\8dலவும்',
 'previewconflict' => 'இந்த முன்தோற்றம் உரை தொகுப்புப் பகுதியின் மேற்பகுதியிலுள்ள உரையைப் பிரதிபலிக்கின்றது. நீங்கள் இப்பொழுது சேமித்தால் மேற்படி தோற்றமே கிடைக்கும்.',
 'session_fail_preview' => "'''உங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் உங்கள் தொகுப்பை செயற்படுத்த முடியவில்லை. அருள் கூர்ந்து மீண்டும் முயலவும். அதுவும் பலனளிக்காவிட்டால் விடுபதிகைச் செய்து மீண்டும் புகுபதிகைச் செய்யவும்'''",
 'session_fail_preview_html' => "'''மன்னிக்கவும்! தங்கள் அமர்வுத் தரவுகள் அழிந்துப்போனமையால் தொகுப்பைச் செயற்படுத்த முடியவில்லை.'''
@@ -819,6 +819,10 @@ or <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 இப்பக்கம் ஏற்கனவே உள்ளது.',
 'defaultmessagetext' => 'இயல்பிருப்பு தகவல் உரை',
 
+# Content models
+'content-model-wikitext' => 'விக்கிஉரை',
+'content-model-javascript' => 'ஜாவா ஸ்கிரிப்ட்',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'எச்சரிக்கை: இப்பக்கம் அதிகளவு இலக்கணப் பாகுபடுத்திச் சார்புகளைக் கொண்டுள்ளது.
 
@@ -1070,8 +1074,6 @@ $1",
 'search-interwiki-caption' => 'உறவுத் திட்டங்கள்',
 'search-interwiki-default' => '$1 தளத்தின் முடிவுகள்:',
 'search-interwiki-more' => '(மேலும்)',
-'search-mwsuggest-enabled' => 'பரிந்துரைகளுடன்',
-'search-mwsuggest-disabled' => 'பரிந்துரைகளில்லை',
 'search-relatedarticle' => 'தொடர்புடையவை',
 'mwsuggest-disable' => 'AJAX பரிந்துரைகளை முடக்கு',
 'searcheverything-enable' => 'அனைத்துப் பெயர்வெளிகளிலும் தேடவும்',
@@ -1106,7 +1108,7 @@ $1",
 
 # Preferences page
 'preferences' => 'விருப்பங்கள்',
-'mypreferences' => 'à®\8eனà¯\8d à®µà®¿à®°à¯\81பà¯\8dபதà¯\8dதà¯\87à®°à¯\8dவà¯\81à®\95ளà¯\8d',
+'mypreferences' => 'விருப்பத்தேர்வுகள்',
 'prefs-edits' => 'தொகுப்புகளின் எண்ணிக்கை:',
 'prefsnologin' => 'புகுபதிகை செய்யப்படவில்லை',
 'prefsnologintext' => 'பயனர் விருப்பத்தேர்வுகளை அமைப்பதற்கு நீங்கள் <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} புகுபதிகை ]</span> செய்திருக்க வேண்டும்.',
@@ -1690,6 +1692,7 @@ $1',
 'uploadnewversion-linktext' => 'இப்படிமத்தின் புதிய பதிப்பை பதிவேற்று',
 'shared-repo-from' => '$1-ல் இருந்து',
 'shared-repo' => 'பகிர்ந்து பயன்கொள் வைப்பகம்',
+'upload-disallowed-here' => 'நீங்கள் இந்தக் கோப்பை மேலெழுத முடியாது.',
 
 # File reversion
 'filerevert' => '$1 ஐ முன்நிலையாக்கு',
@@ -1774,6 +1777,7 @@ $1',
 'doubleredirects' => 'இரட்டை வழிமாற்றுகள்',
 'doubleredirectstext' => 'இந்தப் பட்டியல் போலியான நேர்மதிப்புக்களைக் கொண்டிருக்கக்கூடும். இது வழக்கமாக, இணைப்புடன் கூடிய மேலதிக உரை முதலாவது #வழிமாற்றுக்குக் கீழ் இருப்பதைக் குறிக்கும்.ஒவ்வொரு வரியும், முதலாம் இரண்டாம் வழிமாற்றுகளுக்கு இணைப்புகளைக் கொண்டிருப்பதுடன், இரண்டாவது வழிமாற்று உரையின் முதல் வரிக்கும் இணைப்பைக் கொண்டிருக்கும், இது வழக்கமாக முதலாவது வழிமாற்று குறித்துக் காட்ட வேண்டிய "உண்மையான" இலக்குக் கட்டுரையைக் கொடுக்கும்.',
 'double-redirect-fixed-move' => '[[$1]] நகர்த்தப்பட்டுவிட்டது. இப்பொழுது [[$2]] உக்கு வழிமாற்று தருகின்றது.',
+'double-redirect-fixed-maintenance' => '[[$1]] என்பதிலிருந்து [[$2]] என்பதற்கு இரட்டை வழிமாற்றைச் சரிசெய்கிறது',
 'double-redirect-fixer' => '(இரட்டை) வழிமாற்றைத் திருத்தியபயனர்',
 
 'brokenredirects' => 'முறிந்த வழிமாற்றுகள்',
@@ -1955,6 +1959,7 @@ $1',
 'mailnologintext' => 'நீங்கள்[[Special:UserLogin|புகுபதிகை செய்திருப்பதுடன்]]
 ஏனைய பயனர்களுக்கு மின்னஞ்சல் அனுப்பக்கூடியத்தாக செல்லுபடியாகக்கூடிய மின்னஞ்சல் முகவரியொன்றும் உங்களுடைய  [[Special:Preferences|விருப்பத் தெரிவுகளில்]] கொடுபட்டிருக்கவேண்டும்.',
 'emailuser' => 'இப் பயனருக்கு மின்னஞ்சல் செய்',
+'emailuser-title-notarget' => 'பயனருக்கு மின்னஞ்சல் செய்',
 'emailpage' => 'மின்னஞ்சல் பயனர்',
 'emailpagetext' => 'நீங்கள் கீழ்வரும் படிவத்தை உபயோகித்து இந்த பயனருக்கு மின்னஞ்சல் செய்யலாம்.
 
@@ -1989,7 +1994,7 @@ $1',
 
 # Watchlist
 'watchlist' => 'என் கவனிப்புப் பட்டியல்',
-'mywatchlist' => 'à®\8eனà¯\8d à®\95வனிபà¯\8dபà¯\81பà¯\8d à®ªà®\9fà¯\8dà®\9fியலà¯\8d',
+'mywatchlist' => 'கவனிப்புப் பட்டியல்',
 'watchlistfor2' => '$1 பயனரின் ($2)',
 'nowatchlist' => 'உங்களுடைய கவனிப்புப் பட்டியலில் ஒரு விடயமும் இல்லை.',
 'watchlistanontext' => 'உங்கள் கவனிப்புப் பட்டியலைப் பார்க்க அல்லது தொகுக்க அருள் கூர்ந்து $1 செய்யுங்கள்.',
@@ -2024,11 +2029,7 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} தளத்தின் அறிவித்தல் அஞ்சல்காரர்',
 'enotif_reset' => 'எல்லாப் பக்கங்களையும் பார்வையிட்டதாக குறித்துக்கொள்',
-'enotif_newpagetext' => 'இது ஒரு புதிய பக்கமாகும்.',
 'enotif_impersonal_salutation' => '{{SITENAME}} பயனர்',
-'changed' => 'மாற்றப்பட்டது',
-'created' => 'தொடக்கப்பட்டது',
-'enotif_subject' => '{{SITENAME}} தளத்தின் $PAGETITLE என்றத் தலைப்புடையப் பக்கம் $PAGEEDITOR பயனரால் $CHANGEDORCREATED',
 'enotif_lastvisited' => 'உங்கள் கடைசி வருகைக்குப் பின்னர் நடைபெற்றுள்ள மாற்றங்களைக் காண $1 பக்கத்தைப் பார்க்கவும்.',
 'enotif_lastdiff' => 'மாற்றங்களைக் காண  $1 பக்கத்தைப் பார்.',
 'enotif_anon_editor' => 'அடையாளம் காட்டாத பயனர் $1',
@@ -2234,7 +2235,7 @@ $1',
 # Contributions
 'contributions' => 'பயனர் பங்களிப்புக்கள்',
 'contributions-title' => '$1 இற்கான பயனர் பங்களிப்புகள்',
-'mycontris' => 'à®\8eனà¯\8d à®ªà®\99à¯\8dà®\95ளிபà¯\8dபà¯\81à®\95à¯\8dà®\95ளà¯\8d',
+'mycontris' => 'பங்களிப்புக்கள்',
 'contribsub2' => '$1 பயனரின் ($2)',
 'nocontribs' => 'இந்த நிபந்தனையுடன் ஒத்துப்போகும் வகையில் மாற்றங்களெதுவும் காணப்படவில்லை.',
 'uctop' => '(மேல்)',
@@ -2275,7 +2276,7 @@ $1',
 'whatlinkshere-hideredirs' => 'வழிமாற்றுகளை $1',
 'whatlinkshere-hidetrans' => 'உள்ளிடப்பட்டவைகளை $1',
 'whatlinkshere-hidelinks' => 'இணைப்புகள் $1',
-'whatlinkshere-hideimages' => '$1உருவ இணைப்புகள்',
+'whatlinkshere-hideimages' => '$1 கோப்பிணைப்புக்கள்',
 'whatlinkshere-filters' => 'வடிகட்டிகள்',
 
 # Block/unblock
@@ -2612,7 +2613,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'சாவாநிரல் சோதனை நடக்கின்றது',
-'javascripttest-disabled' => 'இந்தச் செயல்பாடு முடக்கப்பட்டுள்ளது.',
 'javascripttest-title' => '$1 சோதனைகள் நடக்கின்றன',
 'javascripttest-pagetext-noframework' => 'இந்த பக்கம் JavaScript பரிசோதனை ஓட்டத்திற்காக ஒதுக்கப்பட்டுள்ளது',
 'javascripttest-pagetext-skins' => 'சோதனைகளை நடத்த முகப்புறை ஒன்றைத் தேர்வுசெய்:',
@@ -2711,11 +2711,25 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" பக்கத்துக்கான தகவல்',
-'pageinfo-header-edits' => 'தொகுப்புகள்',
+'pageinfo-header-basic' => 'அடிப்படைத் தகவல்',
+'pageinfo-header-edits' => 'தொகுப்பு வரலாறு',
+'pageinfo-header-restrictions' => 'பக்கக் காப்பு',
+'pageinfo-header-properties' => 'பக்க இயல்புகள்',
+'pageinfo-display-title' => 'காட்சித் தலைப்பு',
+'pageinfo-length' => 'பக்க நீளம் (எண்ணுண்மிகளில்)',
+'pageinfo-article-id' => 'பக்க அடையாள இலக்கம்',
+'pageinfo-language' => 'பக்க உள்ளடக்க மொழி',
+'pageinfo-robot-policy' => 'தேடற்பொறி நிலைமை',
 'pageinfo-views' => 'காட்சிகள் எண்ணிக்கை',
 'pageinfo-watchers' => 'பார்வையாளர்கள் எண்ணிக்கை',
+'pageinfo-firstuser' => 'பக்க உருவாக்குநர்',
+'pageinfo-firsttime' => 'பக்கம் உருவாக்கப்பட்ட காலம்',
+'pageinfo-lastuser' => 'அண்மைய தொகுப்பாளர்',
 'pageinfo-edits' => 'தொகுப்புகளின் எண்ணிக்கை:',
 'pageinfo-authors' => 'சாதகமான அம்சங்களை பெற்றிருக்கும் எழுத்தாளர்கள் எண்ணிக்கை',
+'pageinfo-redirectsto-info' => 'தகவல்',
+'pageinfo-contentpage-yes' => 'ஆம்',
+'pageinfo-protect-cascading-yes' => 'ஆம்',
 
 # Skin names
 'skinname-standard' => 'இயல்பான',
@@ -3541,6 +3555,10 @@ $5
 'feedback-bugcheck' => 'சிறப்பு! அது ஏற்கனவே  [ $1 தெரிந்த  bugs ] என்பதை மட்டும்  சரிபார்க்கவும்,',
 'feedback-bugnew' => 'நான் சரிபார்த்தாயிற்று. புதிய bug பற்றி கூறு.',
 
+# Search suggestions
+'searchsuggest-search' => 'தேடு',
+'searchsuggest-containing' => 'கொண்டுள்ளது...',
+
 # API errors
 'api-error-badaccess-groups' => 'இந்த விக்கிக்குக் கோப்புகளைப் பதிவேற்றுவதற்கு நீங்கள் அனுமதிக்கப்படவில்லை.',
 'api-error-badtoken' => 'உள்ளகப் பிழை: தவறான அடையாளம்.',
index f0a254e..8dd1913 100644 (file)
@@ -154,7 +154,6 @@ $messages = array(
 'qbbrowse' => 'ಬ್ರೌಸ್',
 'qbedit' => 'ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ',
 'qbpageoptions' => 'ಈ ಪುಟ',
-'qbpageinfo' => 'ಸನ್ನಿವೇಶ',
 'qbmyoptions' => 'ಎನ್ನ ಪುಟೊಲು',
 'qbspecialpages' => 'ವಿಶೇಷ ಪುಟೊಲು',
 'faq' => 'ಸಾಮಾನ್ಯವಾದ್ ಕೇನುನ ಪ್ರಶ್ನೆಲು',
@@ -359,9 +358,6 @@ $messages = array(
 'logouttext' => 'ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಔಟ್ ಆತರ್.
 ಈರ್ {{SITENAME}} ನ್ ಅನಾಮಧೇಯರಾತ್ ಉಪಯೋಗ ಮಲ್ಪೊಲಿ,ಅಥವಾ ಕೂಡ ಉಂದುವೇ ಪುದರ್‘ಡ್ ಯಾ ಬೇತೆ ಪುದರ್‘ಡ್ ಉಪಯೋಗ ಮಲ್ಪೊಲಿ.
 ಗಮನಿಸಾಲೆ: ಈರೆನ ಬ್ರೌಸರ್‘ಡ್ ಮಾಜುನಾಡೆ ಮುಟ್ಟ ಕೆಲವು ಪುಟಕ್‘ಲು ಈರ್ ಇತ್ತೆಲಾ ಲಾಗ್ ಇನ್ ಆಯಿಲೆಕ್ಕನೇ ತೋಜಾವು.',
-'welcomecreation' => '== ಸುಸ್ವಾಗತೊ, $1! ==
-ಈರೆನೆ ಅಕೌಂಟ್‘ನ್  ಶುರು ಮಲ್ತ್‘ಂಡ್.
-ಈರೆನ [[Special:Preferences|{{SITENAME}} ಪ್ರಾಶಸ್ತ್ಯೊಲೆನ್]]  ಬದಲಾವಣೆ ಮಲ್ಪರೆ ಮರಪಡೆ',
 'yourname' => 'ಸದಸ್ಯೆರ್ನ ಪುದರ್:',
 'yourpassword' => 'ಪಾಸ್-ವರ್ಡ್:',
 'yourpasswordagain' => 'ಪಾಸ್ವರ್ಡ್ ಪಿರ ಟೈಪ್ ಮಲ್ಪುಲೆ',
@@ -584,8 +580,6 @@ $messages = array(
 'search-interwiki-caption' => 'ಬಳಗದ ಇತರ ಯೋಜನೆಲು',
 'search-interwiki-default' => '$1 ಫಲಿತಾಂಶೊಲು:',
 'search-interwiki-more' => '(ಮಸ್ತ್)',
-'search-mwsuggest-enabled' => 'ಸಲಹೆದೊಟ್ಟಿಗೆ',
-'search-mwsuggest-disabled' => 'ಓವು ಸಲಹೆಲಾ ಇಜ್ಜಿ',
 'searchrelated' => 'ಸ೦ಬ೦ಧ ಇತ್ತಿನ',
 'searchall' => 'ಮಾತಾ',
 'powersearch' => 'ನಾಡ್’ಲೆ',
index 9cd12cb..fbb6c94 100644 (file)
@@ -12,6 +12,7 @@
  * @author Jprmvnvijay5
  * @author Kaganer
  * @author Kiranmayee
+ * @author Malkum
  * @author Meno25
  * @author Mpradeep
  * @author Praveen Illa
@@ -191,7 +192,7 @@ $messages = array(
 
 'underline-always' => 'ఎల్లప్పుడూ',
 'underline-never' => 'ఎప్పటికీ వద్దు',
-'underline-default' => 'విహారిణి అప్రమేయం',
+'underline-default' => 'à°\85à°²à°\82à°\95ారపà±\81 à°²à±\87దా à°µà°¿à°¹à°¾à°°à°¿à°£à°¿ à°\85à°ªà±\8dà°°à°®à±\87à°¯à°\82',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'దిద్దుబాటు పెట్టె ఫాంటు శైలి:',
@@ -276,8 +277,8 @@ $messages = array(
 'newwindow' => '(కొత్త కిటికీలో వస్తుంది)',
 'cancel' => 'రద్దు',
 'moredotdotdot' => 'ఇంకా...',
-'mypage' => 'నా à°ªà±\87à°\9cà±\80',
-'mytalk' => 'నా à°\97à±\81à°°à°¿à°\82à°\9aà°¿ à°\9aà°°à±\8dà°\9a',
+'mypage' => 'à°ªà±\81à°\9f',
+'mytalk' => 'చర్చ',
 'anontalk' => 'ఈ ఐ.పి.కి సంబంధించిన చర్చ',
 'navigation' => 'మార్గదర్శకం',
 'and' => '&#32;మరియు',
@@ -287,7 +288,6 @@ $messages = array(
 'qbbrowse' => 'విహరించు',
 'qbedit' => 'సవరించు',
 'qbpageoptions' => 'ఈ పేజీ',
-'qbpageinfo' => 'సందర్భం',
 'qbmyoptions' => 'నా పేజీలు',
 'qbspecialpages' => 'ప్రత్యేక పేజీలు',
 'faq' => 'తరచూ అడిగే ప్రశ్నలు',
@@ -300,7 +300,7 @@ $messages = array(
 'vector-action-protect' => 'సంరక్షించు',
 'vector-action-undelete' => 'తిరిగి చేర్చు',
 'vector-action-unprotect' => 'సంరక్షణను మార్చు',
-'vector-simplesearch-preference' => 'à°®à±\86à°°à±\81à°\97à±\88à°¨ à°\85à°¨à±\8dà°µà±\87à°·à°£ à°¸à°²à°¹à°¾à°²ని చేతనంచేయి (వెక్టర్ అలంకారానికి మాత్రమే)',
+'vector-simplesearch-preference' => 'సరళమà±\88à°¨ à°µà±\86à°¤à±\81à°\95à±\81à°¡à±\81 à°ªà°\9fà±\8dà°\9fà±\80ని చేతనంచేయి (వెక్టర్ అలంకారానికి మాత్రమే)',
 'vector-view-create' => 'సృష్టించు',
 'vector-view-edit' => 'సవరించు',
 'vector-view-history' => 'చరిత్రను చూడండి',
@@ -542,12 +542,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ఇప్పుడు మీరు నిష్క్రమించారు.'''
 
-మీరు {{SITENAME}}ని అజ్ఞాతంగా వాడుతూండొచ్చు, లేదా ఇదే వాడుకరిగా కానీ లేదా వేరే వాడుకరిగా కానీ [[Special:UserLogin|మళ్ళీ ప్రవేశించవచ్చు]].
+మీరు {{SITENAME}}ని అజ్ఞాతంగా వాడుతూండొచ్చు, లేదా ఇదే వాడుకరిగా కానీ లేదా వేరే వాడుకరిగా కానీ <span class='plainlinks'>[$1 మళ్ళీ ప్రవేశించవచ్చు]</span>.
 అయితే, మీ విహారిణిలోని కోశాన్ని శుభ్రపరిచే వరకు కొన్ని పేజీలు మీరింకా ప్రవేశించి ఉన్నట్లుగానే చూపించవచ్చని గమనించండి.",
-'welcomecreation' => '== స్వాగతం, $1! ==
-
-మీ ఖాతాని సృష్టించాం.
-మీ [[Special:Preferences|{{SITENAME}} అభిరుచులను]] మార్చుకోవడం మరువకండి.',
 'yourname' => 'వాడుకరి పేరు:',
 'yourpassword' => 'సంకేతపదం:',
 'yourpasswordagain' => 'సంకేతపదాన్ని మళ్ళీ ఇవ్వండి:',
@@ -715,7 +711,7 @@ $2
 'nowiki_sample' => 'ఫార్మాటు చేయకూడని పాఠ్యాన్ని ఇక్కడ చేర్చండి',
 'nowiki_tip' => 'వికీ ఫార్మాటును పట్టించుకోవద్దు',
 'image_tip' => 'పొదిగిన ఫైలు',
-'media_tip' => 'à°«à±\88à°²à±\81 à°²à°¿à°\82à°\95à±\81',
+'media_tip' => 'దసà±\8dà°¤à±\8dà°°à°ªà±\81 à°²à°\82à°\95à±\86',
 'sig_tip' => 'టైంస్టాంపుతో సహా మీ సంతకం',
 'hr_tip' => 'అడ్డగీత (అరుదుగా వాడండి)',
 
@@ -789,8 +785,7 @@ $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>.',
+మీరు ఇతర పేజీలలో [[Special:Search/{{PAGENAME}}|ఈ పేజీ శీర్షిక కోసం వెతకవచ్చు]], లేదా <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} సంబంధిత చిట్టాలలో వెతకవచ్చు]</span>, కానీ ఈ పేజీని సృష్టించడానికి మీకు అనుమతి లేదు.',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" అనే వాడుకరి ఖాతా నమోదయిలేదు. మీరు ఈ పేజీని సృష్టించ/సరిదిద్దాలనుకుంటే, సరిచూసుకోండి.',
 'userpage-userdoesnotexist-view' => 'వాడుకరి ఖాతా "$1" నమోదుకాలేదు.',
 'blocked-notice-logextract' => 'ప్రస్తుతం ఈ వాడుకరిని నిరోధించారు.
@@ -811,7 +806,7 @@ $2
 'note' => "'''గమనిక:'''",
 'previewnote' => "'''ఇది మునుజూపు మాత్రమేనని గుర్తుంచుకోండి.'''
 మీ మార్పులు ఇంకా భద్రమవ్వలేదు!",
-'continue-editing' => 'దిదà±\8dà°¦à±\81బాà°\9fà±\81ని à°\95à±\8aనసాà°\97à°¿à°\82à°\9aండి',
+'continue-editing' => 'సరిదిదà±\8dà°¦à±\87 à°\9aà±\8bà°\9fà±\81à°\95à°¿ à°µà±\86à°³à±\8dà°³ండి',
 'previewconflict' => 'భద్రపరచిన తరువాత పై టెక్స్ట్‌ ఏరియాలోని టెక్స్టు ఇలాగ కనిపిస్తుంది.',
 'session_fail_preview' => "'''క్షమించండి! సెషను డేటా పోవడం వలన మీ మార్పులను స్వీకరించలేకపోతున్నాం.'''
 దయచేసి మళ్ళీ ప్రయత్నించండి.
@@ -885,6 +880,13 @@ $2
 'edit-already-exists' => 'కొత్త పేజీని సృష్టించలేము.
 అది ఇప్పటికే ఉంది.',
 'defaultmessagetext' => 'అప్రమేయ సందేశపు పాఠ్యం',
+'invalid-content-data' => 'తప్పుడు విషయం',
+
+# Content models
+'content-model-wikitext' => 'వికీపాఠ్యం',
+'content-model-text' => 'సాదా పాఠ్యం',
+'content-model-javascript' => 'జావాస్క్రిప్ట్',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'హెచ్చరిక: ఈ పేజీలో ఖరీదైన పార్సరు పిలుపులు చాలా ఉన్నాయి.
@@ -1127,8 +1129,6 @@ $1",
 'search-interwiki-caption' => 'సోదర ప్రాజెక్టులు',
 'search-interwiki-default' => '$1 ఫలితాలు:',
 'search-interwiki-more' => '(మరిన్ని)',
-'search-mwsuggest-enabled' => 'సూచనలతో',
-'search-mwsuggest-disabled' => 'సూచనలు వద్దు',
 'search-relatedarticle' => 'సంబంధించినవి',
 'mwsuggest-disable' => 'AJAX సూచనలను అచేతనంచేయి',
 'searcheverything-enable' => 'అన్ని పేరుబరుల్లో వెతుకు',
@@ -1161,7 +1161,7 @@ $1",
 
 # Preferences page
 'preferences' => 'అభిరుచులు',
-'mypreferences' => 'నా à°\85à°­à°¿à°°à±\81à°\9aà±\81à°²à±\81',
+'mypreferences' => 'అభిరుచులు',
 'prefs-edits' => 'దిద్దుబాట్ల సంఖ్య:',
 'prefsnologin' => 'లాగిన్‌ అయిలేరు',
 'prefsnologintext' => 'వాడుకరి అభిరుచులను మార్చుకోడానికి, మీరు <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} లోనికి ప్రవేశించి]</span> ఉండాలి.',
@@ -1383,6 +1383,7 @@ $1",
 'right-siteadmin' => 'డేటాబేసును లాక్, అన్‌లాక్ చెయ్యి',
 'right-override-export-depth' => '5 లింకుల లోతు వరకు ఉన్న పేజీలతో సహా, పేజీలను ఎగుమతి చెయ్యి',
 'right-sendemail' => 'ఇతర వాడుకరులకు ఈ-మెయిలు పంపించగలగడం',
+'right-passwordreset' => 'సంకేతపదాన్ని పునరుద్ధరించిన ఈ-మెయిళ్ళు',
 
 # User rights log
 'rightslog' => 'వాడుకరుల హక్కుల మార్పుల చిట్టా',
@@ -1607,6 +1608,7 @@ $1',
 'backend-fail-opentemp' => 'తాత్కాలిక దస్త్రాన్ని తెరవలేకపోతున్నాం.',
 'backend-fail-closetemp' => 'తాత్కాలిక దస్త్రాన్ని మూసివేయలేకపోయాం.',
 'backend-fail-read' => '$1 దస్త్రము చదువలేకపోతిమి.',
+'backend-fail-create' => '$1 ఫైలులో రాయలేకున్నాం.',
 
 # ZipDirectoryReader
 'zip-file-open-error' => 'ఈ ఫైలును ZIP పరీక్ష కోసం తెరవబోతే, ఏదో తెలియని లోపం ఎదురైంది.',
@@ -1987,6 +1989,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|మీ వాడుకరి అభిరుచుల]]లో మీరిచ్చిన ఈ-మెయిలు చిరునామా "నుండి" ఆ సందేశం వచ్చినట్లుగా ఉంటుంది, కనుక వేగుని అందుకునేవారు నేరుగా మీకు జవాబివ్వగలుగుతారు.',
 'usermailererror' => 'మెయిలు ఆబ్జెక్టు ఈ లోపాన్ని చూపింది:',
@@ -2018,7 +2022,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 
 # Watchlist
 'watchlist' => 'నా వీక్షణ జాబితా',
-'mywatchlist' => 'నా à°µà±\80à°\95à±\8dà°·à°£ à°\9cాబితా',
+'mywatchlist' => 'వీక్షణ జాబితా',
 'watchlistfor2' => '$1 కొరకు $2',
 'nowatchlist' => 'మీ వీక్షణ జాబితా ఖాళీగా ఉంది.',
 'watchlistanontext' => 'మీ వీక్షణ జాబితా లోని అంశాలను చూసేందుకు లేదా మార్చేందుకు మీరు $1.',
@@ -2053,11 +2057,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization చూడండి.',
 
 'enotif_mailer' => '{{SITENAME}} ప్రకటన మెయిలు పంపునది',
 'enotif_reset' => 'అన్ని పేజీలను చూసినట్లుగా గుర్తించు',
-'enotif_newpagetext' => 'ఇది ఒక కొత్త పేజీ.',
 'enotif_impersonal_salutation' => '{{SITENAME}} వాడుకరి',
-'changed' => 'మార్చారు',
-'created' => 'సృష్టించారు',
-'enotif_subject' => '{{SITENAME}}లో $PAGETITLE అనే పేజీని $PAGEEDITOR $CHANGEDORCREATED',
 'enotif_lastvisited' => 'మీ గత సందర్శన తరువాత జరిగిన మార్పుల కొరకు $1 చూడండి.',
 'enotif_lastdiff' => 'ఈ మార్పు చూసేందుకు  $1 కు వెళ్ళండి.',
 'enotif_anon_editor' => 'అజ్ఞాత వాడుకరి $1',
@@ -2260,7 +2260,7 @@ $UNWATCHURL కి వెళ్ళండి.
 # Contributions
 'contributions' => 'వాడుకరి రచనలు',
 'contributions-title' => '$1 యొక్క మార్పులు-చేర్పులు',
-'mycontris' => 'నా à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81-చేర్పులు',
+'mycontris' => 'మారà±\8dà°ªà±\81à°²à±\81 చేర్పులు',
 'contribsub2' => '$1 ($2) కొరకు',
 'nocontribs' => 'ఈ విధమైన మార్పులేమీ దొరకలేదు.',
 'uctop' => '(పైది)',
@@ -2301,7 +2301,7 @@ $UNWATCHURL కి వెళ్ళండి.
 'whatlinkshere-hideredirs' => 'దారిమార్పులను $1',
 'whatlinkshere-hidetrans' => '$1 ట్రాన్స్‌క్లూజన్లు',
 'whatlinkshere-hidelinks' => 'లింకులను $1',
-'whatlinkshere-hideimages' => '$1 à°¬à±\8aà°®à±\8dమల à°²à°¿à°\82à°\95à±\81లు',
+'whatlinkshere-hideimages' => '$1 à°¦à°¸à±\8dà°¤à±\8dరాల à°²à°\82à°\95à±\86లు',
 'whatlinkshere-filters' => 'వడపోతలు',
 
 # Block/unblock
@@ -2740,6 +2740,9 @@ $UNWATCHURL కి వెళ్ళండి.
 'pageinfo-views' => 'వీక్షణల సంఖ్య',
 'pageinfo-watchers' => 'పేజీ వీక్షకుల సంఖ్య',
 'pageinfo-edits' => 'మొత్తం మార్పుల సంఖ్య',
+'pageinfo-toolboxlink' => 'పేజీ సమాచారం',
+'pageinfo-contentpage-yes' => 'అవును',
+'pageinfo-protect-cascading-yes' => 'అవును',
 
 # Skin names
 'skinname-standard' => 'సంప్రదాయ',
@@ -3423,7 +3426,7 @@ $5
 * <span class="mw-specialpagecached">Cached ప్రత్యేక పుటలు (పాతబడి ఉండొచ్చు).</span>',
 'specialpages-group-maintenance' => 'నిర్వహణా నివేదికలు',
 'specialpages-group-other' => 'ఇతర ప్రత్యేక పేజీలు',
-'specialpages-group-login' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°\82à°¡à°¿ / à°¨à°®à±\8bà°¦à±\81à°\9aà±\87à°¸ుకోండి',
+'specialpages-group-login' => 'à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°\82à°¡à°¿ / à°\96ాతానà±\81 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aుకోండి',
 'specialpages-group-changes' => 'ఇటీవలి మార్పులు మరియు దినచర్యలు',
 'specialpages-group-media' => 'మాధ్యమ నివేదికలు మరియు ఎగుమతులు',
 'specialpages-group-users' => 'వాడుకర్లు మరియు హక్కులు',
@@ -3525,6 +3528,9 @@ $5
 'feedback-bugcheck' => 'అద్భుతం! ఇది ఇప్పటికే [$1 తెలిసిన బగ్గుల]లో లేదని సరిచూసుకోండి.',
 'feedback-bugnew' => 'చూసాను. కొత్త బగ్గును నివేదించు',
 
+# Search suggestions
+'searchsuggest-search' => 'వెతుకు',
+
 # API errors
 'api-error-badaccess-groups' => 'ఈ వికీ లోనికి దస్త్రాలను ఎక్కించే అనుమతి మీకు లేదు.',
 'api-error-duplicate-archive-popup-title' => 'నకిలీ {{PLURAL:$1|దస్త్రాన్ని|దస్త్రాలను}} ఇప్పటికే తొలగించారు.',
index 4ddee10..8eeee27 100644 (file)
@@ -156,7 +156,7 @@ $messages = array(
 'cancel' => 'Para',
 'moredotdotdot' => 'Barak liu...',
 'mypage' => "Ha'u-nia pájina",
-'mytalk' => "Ha'u-nia diskusaun",
+'mytalk' => 'Diskusaun',
 'anontalk' => "Diskusaun ba IP ne'e",
 'navigation' => 'Hatudu-dalan',
 'and' => '&#32;ho',
@@ -297,9 +297,6 @@ Lista ida pájina espesiál nian [[Special:SpecialPages|iha ne'e]].",
 'ns-specialprotected' => 'La ema ida bele edita pájina espesiál sira.',
 
 # Login and logout pages
-'welcomecreation' => "== Loron di'ak, $1! ==
-Agora Ita iha konta iha ne'e.
-La haluha muda Ita-nia [[Special:Preferences|preferénsia]].",
 'yourname' => "Naran uza-na'in:",
 'login' => 'Log in',
 'nav-login-createaccount' => 'Log in / kriar konta ida',
@@ -412,8 +409,6 @@ Ita-nia mudansa la armazenadu seidauk!",
 'search-result-size' => '$1 ({{PLURAL:$2|liafuan ida|liafuan $2}})',
 'search-section' => '(seksaun $1)',
 'search-interwiki-caption' => 'Projetu seluseluk sira',
-'search-mwsuggest-enabled' => 'fó sujestaun',
-'search-mwsuggest-disabled' => 'la hatudu sujestaun',
 'searchall' => 'hotu',
 'powersearch' => 'Buka',
 'powersearch-field' => 'Buka',
@@ -421,7 +416,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 
 # Preferences page
 'preferences' => 'Preferénsia',
-'mypreferences' => "Ha'u-nia preferénsia",
+'mypreferences' => 'Preferénsia',
 'prefs-rc' => 'Mudansa foufoun sira',
 'prefs-watchlist' => 'Lista hateke',
 'prefs-editing' => 'Edita',
@@ -650,7 +645,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 
 # Watchlist
 'watchlist' => "Ha'u-nia lista hateke",
-'mywatchlist' => "Ha'u-nia lista hateke",
+'mywatchlist' => 'Lista hateke',
 'removedwatchtext' => 'La hateke pájina "[[:$1]]" ona (haree [[Special:Watchlist|"lista hateke"]]).',
 'watch' => 'Hateke',
 'watchthispage' => "Hateke pájina ne'e",
@@ -662,11 +657,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 'watching' => 'Hateke...',
 'unwatching' => 'La hateke...',
 
-'enotif_newpagetext' => "Ne'e pájina foun.",
 'enotif_impersonal_salutation' => "Uza-na'in {{SITENAME}} nian",
-'changed' => 'muda ona',
-'created' => 'kria ona',
-'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED pájina $PAGETITLE iha {{SITENAME}}',
 
 # Delete
 'deletepage' => 'Halakon pájina',
@@ -723,7 +714,7 @@ Ita-nia mudansa la armazenadu seidauk!",
 # Contributions
 'contributions' => "Kontribuisaun uza-na'in",
 'contributions-title' => 'Kontribuisaun "$1" nian',
-'mycontris' => "Ha'u-nia kontribuisaun",
+'mycontris' => 'Kontribuisaun',
 'contribsub2' => 'Ba $1 ($2)',
 'uctop' => '(versaun atuál)',
 'month' => 'Fulan (ho molok):',
index 76b0027..65246ac 100644 (file)
@@ -213,7 +213,6 @@ $messages = array(
 'qbbrowse' => 'Мурур',
 'qbedit' => 'Вироиш',
 'qbpageoptions' => 'Ин саҳифа',
-'qbpageinfo' => 'Бофт',
 'qbmyoptions' => 'Саҳифаҳои ман',
 'qbspecialpages' => 'Саҳифаҳои вижа',
 'faq' => 'Саволҳои тез-тез пурсидашуда',
@@ -444,12 +443,8 @@ $1',
 # Login and logout pages
 'logouttext' => "'''Акнун аз систем хориҷ шудаед.'''
 
-Шумо метавонед гумном аз {{SITENAME}} истифодабариро идома диҳед, ё метавонед бо ҳамин номи корбариатон ва ё номи корбарии дигаре [[Special:UserLogin|боз вуруд кунед]].
+Шумо метавонед гумном аз {{SITENAME}} истифодабариро идома диҳед, ё метавонед бо ҳамин номи корбариатон ва ё номи корбарии дигаре <span class='plainlinks'>[$1 боз вуруд кунед]</span>.
 Тавваҷӯҳ кунед, ки баъзе аз саҳифаҳо қаблан чи тавре намоиш шуда будан ҳамин тавр намоиш дода мешаванд, то даме ки шумо ҳофизаи мурургаратонро пок кунед.",
-'welcomecreation' => '== Хуш омадед, $1! ==
-
-Ҳисоби шумо эҷод шуд.
-Танзим кардани [[Special:Preferences|тарҷиҳоти {{SITENAME}}]] худро фаромӯш накунед.',
 'yourname' => 'Номи корбар',
 'yourpassword' => 'Калимаи убур\\пароль',
 'yourpasswordagain' => 'Калимаи убурро боз нависед',
@@ -760,6 +755,7 @@ $1',
 'revdelete-success' => "'''Тағйири намоёнии нусха бо муваффақият анҷом шуд.'''",
 'logdelete-success' => "'''Тағйири намоёнии маврид бо муваффақият анҷом шуд.'''",
 'revdel-restore' => 'Тағйири падидорӣ',
+'revdel-restore-visible' => 'нусхаҳои намоён',
 'pagehist' => 'Таърихи саҳифа',
 'deletedhist' => 'Таърихи ҳазфшуда',
 'revdelete-edit-reasonlist' => 'Вироиш ҳазф далелҳо',
@@ -836,8 +832,6 @@ $1',
 'search-interwiki-caption' => 'Лоиҳаҳои хоҳарӣ',
 'search-interwiki-default' => '$1 натоиҷ:',
 'search-interwiki-more' => '(бештар)',
-'search-mwsuggest-enabled' => 'бо тавзеҳот',
-'search-mwsuggest-disabled' => 'бидуни тавзеҳот',
 'search-relatedarticle' => 'Алоқаманд',
 'searchrelated' => 'алоқаманд',
 'searchall' => 'ҳама',
@@ -1179,7 +1173,7 @@ $1',
 'filehist-dimensions' => 'Андоза',
 'filehist-filesize' => 'Андозаи парванда',
 'filehist-comment' => 'Тавзеҳ',
-'imagelinks' => 'Ð\9fайвандҳои парванда',
+'imagelinks' => 'Ð\98Ñ\81Ñ\82иÑ\84одаи парванда',
 'linkstoimage' => '{{PLURAL:$1|Саҳифаҳои|$1 Саҳифаи}} зерин ба ин акс пайванданд:',
 'nolinkstoimage' => 'Ҳеҷ саҳифае ба ин акс пайванд надорад.',
 'sharedupload' => 'Ин парванда аз $1 мебошад ва шояд аз тарафи дигар лоиҳаҳо истифода шавад.',
@@ -1453,11 +1447,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 'enotif_mailer' => '{{SITENAME}} Иттилорасонӣ почтаи электронӣ',
 'enotif_reset' => 'Аломатрасони ҳамаи саҳифаҳо ба унвони боздидшуда',
-'enotif_newpagetext' => 'Ин саҳифаи нав аст',
 'enotif_impersonal_salutation' => 'Корбари {{SITENAME}}',
-'changed' => 'тағйирёфта',
-'created' => 'эҷод шуд',
-'enotif_subject' => 'Саҳифаи {{SITENAME}} $PAGETITLE аз тарафи $PAGEEDITOR $CHANGEDORCREATED шуд',
 'enotif_lastvisited' => 'Барои дидани ҳамаи тағйирот аз охирин боре, ки сар задаед $1ро бубинед.',
 'enotif_lastdiff' => 'Барои намоиши ин тағйир $1ро бубинед.',
 'enotif_anon_editor' => 'корбари ношинос $1',
index 82d419a..8d0ed14 100644 (file)
@@ -155,7 +155,6 @@ $messages = array(
 'qbbrowse' => 'Murur',
 'qbedit' => 'Viroiş',
 'qbpageoptions' => 'In sahifa',
-'qbpageinfo' => 'Boft',
 'qbmyoptions' => 'Sahifahoi man',
 'qbspecialpages' => 'Sahifahoi viƶa',
 'faq' => 'Savolhoi tez-tez pursidaşuda',
@@ -379,12 +378,8 @@ Daleli zikrşuda az in qaror ast ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Aknun az sistem xoriç şudaed.'''
 
-Şumo metavoned gumnom az {{SITENAME}} istifodabariro idoma dihed, jo metavoned bo hamin nomi korbariaton va jo nomi korbariji digare [[Special:UserLogin|boz vurud kuned]].
+Şumo metavoned gumnom az {{SITENAME}} istifodabariro idoma dihed, jo metavoned bo hamin nomi korbariaton va jo nomi korbariji digare <span class='plainlinks'>[$1 boz vurud kuned]</span>.
 Tavvaçūh kuned, ki ba'ze az sahifaho qablan ci tavre namoiş şuda budan hamin tavr namoiş doda meşavand, to dame ki şumo hofizai mururgaratonro pok kuned.",
-'welcomecreation' => '== Xuş omaded, $1! ==
-
-Hisobi şumo eçod şud.
-Tanzim kardani [[Special:Preferences|tarçihoti {{SITENAME}}]] xudro faromūş nakuned.',
 'yourname' => 'Nomi korbar',
 'yourpassword' => 'Kalimai ubur\\parolь',
 'yourpasswordagain' => 'Kalimai uburro boz navised',
@@ -724,8 +719,6 @@ Itminon hosil kuned, ki in taƣjir davomnokiji ta'rixiji sahifaro nigoh dorad.",
 'search-interwiki-caption' => 'Loihahoi xoharī',
 'search-interwiki-default' => '$1 natoiç:',
 'search-interwiki-more' => '(beştar)',
-'search-mwsuggest-enabled' => 'bo tavzehot',
-'search-mwsuggest-disabled' => 'biduni tavzehot',
 'search-relatedarticle' => 'Aloqamand',
 'searchrelated' => 'aloqamand',
 'searchall' => 'hama',
@@ -1301,11 +1294,7 @@ Agar şumo dertar az fehristi nazarotaton in sahifaro hazv kardan xohed, dar men
 
 'enotif_mailer' => '{{SITENAME}} Ittilorasonī poctai elektronī',
 'enotif_reset' => 'Alomatrasoni hamai sahifaho ba unvoni bozdidşuda',
-'enotif_newpagetext' => 'In sahifai nav ast',
 'enotif_impersonal_salutation' => 'Korbari {{SITENAME}}',
-'changed' => 'taƣjirjofta',
-'created' => 'eçod şud',
-'enotif_subject' => 'Sahifai {{SITENAME}} $PAGETITLE az tarafi $PAGEEDITOR $CHANGEDORCREATED şud',
 'enotif_lastvisited' => 'Baroi didani hamai taƣjirot az oxirin bore, ki sar zadaed $1ro bubined.',
 'enotif_lastdiff' => 'Baroi namoişi in taƣjir $1ro bubined.',
 'enotif_anon_editor' => 'korbari noşinos $1',
index ec4f919..9d83285 100644 (file)
@@ -50,16 +50,20 @@ $namespaceAliases = array(
 );
 
 $specialPageAliases = array(
+       'Activeusers'               => array( 'ผู้ใช้ที่มีความเคลื่อนไหว' ),
        'Allmessages'               => array( 'ข้อความทั้งหมด' ),
        'Allpages'                  => array( 'หน้าทั้งหมด' ),
        'Ancientpages'              => array( 'บทความที่ไม่ได้แก้ไขนานที่สุด' ),
+       'Badtitle'                  => array( 'ชื่อเรื่องไม่เหมาะสม' ),
        'Blankpage'                 => array( 'หน้าว่าง' ),
        'Block'                     => array( 'บล็อกไอพี' ),
        'Blockme'                   => array( 'บล็อกฉัน' ),
        'Booksources'               => array( 'แหล่งหนังสือ' ),
        'BrokenRedirects'           => array( 'เปลี่ยนทางเสีย' ),
        'Categories'                => array( 'หมวดหมู่' ),
-       'ChangePassword'            => array( 'ตั้งรหัสผ่านใหม่' ),
+       'ChangeEmail'               => array( 'เปลี่ยนอีเมล' ),
+       'ChangePassword'            => array( 'เปลี่ยนรหัสผ่าน' ),
+       'ComparePages'              => array( 'เปรียบเทียบหน้า' ),
        'Confirmemail'              => array( 'ยืนยันอีเมล' ),
        'Contributions'             => array( 'เรื่องที่เขียน' ),
        'CreateAccount'             => array( 'สร้างบัญชีผู้ใช้ใหม่' ),
@@ -67,6 +71,7 @@ $specialPageAliases = array(
        'DeletedContributions'      => array( 'การแก้ไขที่ถูกลบ' ),
        'Disambiguations'           => array( 'แก้ความกำกวม' ),
        'DoubleRedirects'           => array( 'เปลี่ยนทางซ้ำซ้อน' ),
+       'EditWatchlist'             => array( 'แก้ไขรายการเฝ้าดู' ),
        'Emailuser'                 => array( 'อีเมลผู้ใช้' ),
        'Export'                    => array( 'ส่งออก' ),
        'Fewestrevisions'           => array( 'บทความที่ถูกแก้ไขน้อยที่สุด' ),
@@ -74,6 +79,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'พาธของไฟล์', 'ตำแหน่งไฟล์' ),
        'Import'                    => array( 'นำเข้า' ),
        'Invalidateemail'           => array( 'ยกเลิกการยืนยันทางอีเมล' ),
+       'JavaScriptTest'            => array( 'ทดสอบจาวาสคริปต์' ),
        'BlockList'                 => array( 'รายชื่อผู้ใช้ที่ถูกบล็อก', 'รายการบล็อก', 'รายชื่อไอพีที่ถูกบล็อก' ),
        'LinkSearch'                => array( 'ค้นหาเว็บลิงก์' ),
        'Listadmins'                => array( 'รายชื่อผู้ดูแล' ),
@@ -98,8 +104,11 @@ $specialPageAliases = array(
        'Mycontributions'           => array( 'เรื่องที่ฉันเขียน' ),
        'Mypage'                    => array( 'หน้าของฉัน' ),
        'Mytalk'                    => array( 'หน้าพูดคุยของฉัน' ),
+       'Myuploads'                 => array( 'ไฟล์ที่อัปโหลดของฉัน' ),
        'Newimages'                 => array( 'ภาพใหม่' ),
        'Newpages'                  => array( 'หน้าใหม่' ),
+       'PasswordReset'             => array( 'ตั้งรหัสผ่านใหม่' ),
+       'PermanentLink'             => array( 'ลิงก์ถาวร' ),
        'Popularpages'              => array( 'หน้าที่ได้รับความนิยม' ),
        'Preferences'               => array( 'การตั้งค่า', 'ตั้งค่า' ),
        'Prefixindex'               => array( 'ดัชนีตามคำขึ้นต้น' ),
@@ -109,11 +118,13 @@ $specialPageAliases = array(
        'Randomredirect'            => array( 'สุ่มหน้าเปลี่ยนทาง' ),
        'Recentchanges'             => array( 'ปรับปรุงล่าสุด' ),
        'Recentchangeslinked'       => array( 'การปรับปรุงที่โยงมา' ),
+       'Revisiondelete'            => array( 'ลบรุ่นการแก้ไข' ),
        'Search'                    => array( 'ค้นหา' ),
        'Shortpages'                => array( 'หน้าที่สั้นที่สุด' ),
        'Specialpages'              => array( 'หน้าพิเศษ' ),
        'Statistics'                => array( 'สถิติ' ),
        'Tags'                      => array( 'ป้ายกำกับ' ),
+       'Unblock'                   => array( 'เลิกบล็อก' ),
        'Uncategorizedcategories'   => array( 'หมวดหมู่ที่ไม่ได้จัดหมวดหมู่' ),
        'Uncategorizedimages'       => array( 'ภาพที่ไม่ได้จัดหมวดหมู่' ),
        'Uncategorizedpages'        => array( 'หน้าที่ไม่ได้จัดหมวดหมู่' ),
@@ -128,7 +139,7 @@ $specialPageAliases = array(
        'Userlogin'                 => array( 'ล็อกอิน' ),
        'Userlogout'                => array( 'ล็อกเอาต์' ),
        'Userrights'                => array( 'สิทธิผู้ใช้' ),
-       'Version'                   => array( 'เวอร์ชั่น' ),
+       'Version'                   => array( 'à¹\80วอรà¹\8cà¸\8aัà¸\99', 'à¹\80วอรà¹\8cà¸\8aัà¹\88à¸\99' ),
        'Wantedcategories'          => array( 'หมวดหมู่ที่ต้องการ' ),
        'Wantedfiles'               => array( 'ไฟล์ที่ต้องการ' ),
        'Wantedpages'               => array( 'หน้าที่ต้องการ', 'การเชื่อมโยงเสีย' ),
@@ -317,8 +328,8 @@ $messages = array(
 'newwindow' => '(เปิดหน้าต่างใหม่)',
 'cancel' => 'ยกเลิก',
 'moredotdotdot' => 'ดูเพิ่ม...',
-'mypage' => 'หน้าของฉัน',
-'mytalk' => 'หà¸\99à¹\89าà¸\9eูà¸\94à¸\84ุยà¸\82อà¸\87à¸\89ัà¸\99',
+'mypage' => 'หน้า',
+'mytalk' => 'à¸\9eูà¸\94à¸\84ุย',
 'anontalk' => 'พูดคุยกับไอพีนี้',
 'navigation' => 'ป้ายบอกทาง',
 'and' => '&#32;และ',
@@ -328,7 +339,6 @@ $messages = array(
 'qbbrowse' => 'สืบค้น',
 'qbedit' => 'แก้ไข',
 'qbpageoptions' => 'หน้านี้',
-'qbpageinfo' => 'บริบท',
 'qbmyoptions' => 'หน้าของฉัน',
 'qbspecialpages' => 'หน้าพิเศษ',
 'faq' => 'คำถามถามบ่อย',
@@ -340,14 +350,14 @@ $messages = array(
 'vector-action-move' => 'ย้าย',
 'vector-action-protect' => 'ป้องกัน',
 'vector-action-undelete' => 'ยกเลิกการลบ',
-'vector-action-unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\84à¹\88าà¸\81ารà¸\9bà¸\81à¸\9bà¹\89อà¸\87à¸\82à¹\89อมูล',
+'vector-action-unprotect' => 'à¹\80à¸\9bลีà¹\88ยà¸\99à¸\84à¹\88าà¸\81ารà¸\9bà¹\89อà¸\87à¸\81ัà¸\99',
 'vector-simplesearch-preference' => 'เปิดใช้งานคำแนะนำการค้นหาขั้นสูง (สำหรับสกิน Vector เท่านั้น)',
 'vector-view-create' => 'สร้าง',
 'vector-view-edit' => 'แก้ไข',
 'vector-view-history' => 'ดูประวัติ',
 'vector-view-view' => 'อ่าน',
 'vector-view-viewsource' => 'ดูโค้ด',
-'actions' => 'à¸\81ารà¸\81ระà¸\97ำ',
+'actions' => 'à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81าร',
 'namespaces' => 'เนมสเปซ',
 'variants' => 'สิ่งที่แตกต่าง',
 
@@ -373,7 +383,7 @@ $messages = array(
 'delete' => 'ลบ',
 'deletethispage' => 'ลบหน้านี้',
 'undelete_short' => 'เรียกคืน {{PLURAL:$1|1 การแก้ไข|$1 การแก้ไข}}',
-'viewdeleted_short' => 'ดู{{PLURAL:$1|1 การแก้ไขที่ถูกลบ|$1 การแก้ไขที่ถูกลบ}}',
+'viewdeleted_short' => 'ดู {{PLURAL:$1|1 การแก้ไขที่ถูกลบ|$1 การแก้ไขที่ถูกลบ}}',
 'protect' => 'ล็อก',
 'protect_change' => 'เปลี่ยน',
 'protectthispage' => 'ล็อกหน้านี้',
@@ -437,7 +447,7 @@ $1',
 
 'badaccess' => 'มีข้อผิดพลาดในการใช้สิทธิ',
 'badaccess-group0' => 'คุณไม่ได้รับอนุญาตให้ดำเนินการตามที่ร้องขอนี้',
-'badaccess-groups' => 'à¸\81ารà¸\81ระà¸\97ำà¸\97ีà¹\88รà¹\89อà¸\87à¸\82อà¸\99ีà¹\89สà¸\87วà¸\99à¹\84วà¹\89à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89{{PLURAL:$2|à¸\88าà¸\81à¸\81ลุà¹\88ม|à¸\88าà¸\81กลุ่มใดกลุ่มหนึ่ง ดังนี้}}: $1',
+'badaccess-groups' => 'à¸\9bà¸\8fิà¸\9aัà¸\95ิà¸\81ารà¸\97ีà¹\88à¸\84ุà¸\93รà¹\89อà¸\87à¸\82อà¸\99ีà¹\89สà¸\87วà¸\99à¹\84วà¹\89à¹\80à¸\89à¸\9eาะà¸\9cูà¹\89à¹\83à¸\8aà¹\89à¹\83à¸\99{{PLURAL:$2|à¸\81ลุà¹\88ม|กลุ่มใดกลุ่มหนึ่ง ดังนี้}}: $1',
 
 'versionrequired' => 'ต้องการมีเดียวิกิรุ่น $1',
 'versionrequiredtext' => 'ต้องการมีเดียวิกิรุ่น $1 สำหรับใช้งานหน้านี้ ดูเพิ่ม [[Special:Version|รุ่นซอฟต์แวร์]]',
@@ -447,6 +457,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,7 +518,7 @@ $1',
 การค้นฐานข้อมูลล่าสุดกระทำเมื่อ:
 <blockquote><tt>$1</tt></blockquote>
 จากฟังก์ชัน "<tt>$2</tt>"
-ฐานข้อมูลแจ้งข้อผิดพลาดว่า "<tt>$3: $4</tt>"',
+ฐานข้อมูลแจ้งข้อผิดพลาดว่า "<samp>$3: $4</samp>"',
 'dberrortextcl' => 'ไวยากรณ์ในการค้นฐานข้อมูลผิดพลาด
 การค้นฐานข้อมูลล่าสุดกระทำเมื่อ:
 "$1"
@@ -540,6 +554,8 @@ $1',
 'cannotdelete' => 'ไม่สามารถลบหน้าหรือไฟล์ "$1" 
 อาจมีผู้อื่นลบไปแล้ว',
 'cannotdelete-title' => "ไม่สามารถลบหน้า ''$1''",
+'delete-hook-aborted' => 'การลบถูกยกเลิกโดยฮุก
+ไม่มีคำอธิบายสำหรับการยกเลิกนี้',
 'badtitle' => 'ชื่อหน้าไม่เหมาะสม',
 'badtitletext' => 'ชื่อหน้าที่ร้องขอไม่ถูกต้อง เป็นชื่อว่าง หรือชื่อที่ผิดพลาดเนื่องจากลิงก์ข้ามมาจากภาษาอื่น ชื่อที่ใช้อาจจะมีตัวอักษรที่ไม่สามารถถูกใช้เป็นชื่อได้',
 'perfcached' => 'ข้อมูลต่อไปนี้อาจเป็นข้อมูลเก่า ที่เก็บไว้ในแคชของระบบ A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
@@ -565,6 +581,8 @@ $1',
 'ns-specialprotected' => 'หน้าพิเศษไม่สามารถแก้ไขได้',
 'titleprotected' => "หัวเรื่องนี้ได้รับการป้องกันไม่ให้สร้างใหม่ โดย [[User:$1|$1]] 
 เหตุผลที่ให้ไว้ คือ ''$2''",
+'exception-nologin' => 'ไม่ได้ล็อกอิน',
+'exception-nologin-text' => 'หน้าหรือปฏิบัติการนี้กำหนดให้คุณล็อกอินเข้าสู่วิกินี้ก่อน',
 
 # Virus scanner
 'virus-badscanner' => "การตั้งค่าผิดพลาด: ไม่รู้จักตัวสแกนไวรัส: ''$1''",
@@ -574,12 +592,8 @@ $1',
 # Login and logout pages
 'logouttext' => "'''ขณะนี้คุณได้ล็อกเอาต์ออกจากระบบ'''
 
-คุณสามารถใช้งาน {{SITENAME}} ได้ต่อในฐานะผู้ใช้นิรนาม หรือคุณสามารถ[[Special:UserLogin|ล็อกอินกลับเข้าไป]]ด้วยชื่อผู้ใช้เดิมหรือชื่อผู้ใช้อื่นๆ
+คุณสามารถใช้งาน {{SITENAME}} ได้ต่อในฐานะผู้ใช้นิรนาม หรือคุณสามารถ<span class='plainlinks'>[$1 ล็อกอินกลับเข้าไป]</span>ด้วยชื่อผู้ใช้เดิมหรือชื่อผู้ใช้อื่นๆ
 อย่างไรก็ตามอาจจะมีบางหน้าที่ยังแสดงข้อความว่าคุณกำลังล็อกอินอยู่ จนกว่าคุณจะล้างแคชออกจากเว็บเบราว์เซอร์",
-'welcomecreation' => '== ยินดีต้อนรับ $1! ==
-
-ชื่อบัญชีผู้ใช้ของคุณถูกสร้างขึ้นแล้ว
-อย่าลืมเข้าไป[[Special:Preferences|ตั้งค่าผู้ใช้สำหรับ {{SITENAME}}]]',
 'yourname' => 'ชื่อผู้ใช้',
 'yourpassword' => 'รหัสผ่าน',
 'yourpasswordagain' => 'พิมพ์รหัสผ่านอีกครั้ง:',
@@ -672,6 +686,7 @@ $1',
 # Change password dialog
 'resetpass' => 'เปลี่ยนรหัสผ่าน',
 'resetpass_announce' => 'คุณล็อกอินผ่านรหัสอีเมลชั่วคราว คุณต้องใส่ค่ารหัสผ่านใหม่เพื่อเสร็จสิ้นขั้นตอนการล็อกอิน:',
+'resetpass_text' => '<!-- เพิ่มข้อความที่นี่ -->',
 'resetpass_header' => 'เปลี่ยนรหัสผ่าน',
 'oldpassword' => 'รหัสผ่านเดิม:',
 'newpassword' => 'รหัสผ่านใหม่:',
@@ -796,8 +811,7 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 คุณสามารถ [[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>',
+คุณสามารถ[[Special:Search/{{PAGENAME}}|ค้นหาชื่อบทความนี้]]ในหน้าอื่น หรือ<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ค้นหาปูมที่เกี่ยวข้อง]</span> แต่คุณไม่มีสิทธิ์สร้างหน้านี้',
 'userpage-userdoesnotexist' => 'ไม่มีบัญชีผู้ใช้ "<nowiki>$1</nowiki>" อยู่ในสารบบ  กรุณาตรวจสอบให้แน่ใจว่าคุณต้องการสร้างหรือแก้ไขหน้านี้จริงๆ',
 'userpage-userdoesnotexist-view' => 'ไม่มีบัญชีผู้ใช้ลงทะเบียนในชื่อ "$1"',
 'blocked-notice-logextract' => 'ปัจจุบันเลขที่อยู่ไอพีนี้ถูกบล็อก
@@ -873,7 +887,7 @@ $1 เป็นผู้ดำเนินการบล็อกในคร
 'template-protected' => '(ล็อก)',
 'template-semiprotected' => '(กึ่งล็อก)',
 'hiddencategories' => 'หน้านี้มี {{PLURAL:$1|1 หมวดหมู่ที่ซ่อนอยู่|$1 หมวดหมู่ที่ซ่อนอยู่}} :',
-'edittools' => '<!-- à¸\82à¹\89อà¸\84วามà¸\99ีà¹\89à¸\88ะà¹\81สà¸\94à¸\87à¸\9cลà¸\94à¹\89าà¸\99à¹\83à¸\95à¹\89à¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\81ละà¸\9fอรà¹\8cมสำหรัà¸\9aอัปโหลด -->',
+'edittools' => '<!-- à¸\82à¹\89อà¸\84วามà¸\99ีà¹\89à¸\88ะà¹\81สà¸\94à¸\87à¸\9cลà¹\83à¸\95à¹\89à¸\9fอรà¹\8cมสำหรัà¸\9aà¸\81ารà¹\81à¸\81à¹\89à¹\84à¸\82à¹\81ละอัปโหลด -->',
 'nocreatetitle' => 'จำกัดการสร้างหน้าใหม่',
 'nocreatetext' => '{{SITENAME}} จำกัดการสร้างหน้าใหม่
 คุณสามารถย้อนกลับไปแก้ไขหน้าที่มีอยู่เดิม หรือ[[Special:UserLogin|ล็อกอินหรือสร้างบัญชีผู้ใช้]]',
@@ -1088,6 +1102,8 @@ $1",
 
 # Diffs
 'history-title' => 'ประวัติรุ่นปรับปรุงของ "$1"',
+'difference-title' => 'ความแตกต่างระหว่างรุ่นของ "$1"',
+'difference-title-multipage' => 'ความแตกต่างระหว่างหน้า "$1" และ "$2"',
 'difference-multipage' => '(ความแตกต่างระหว่างหน้าต่างๆ)',
 'lineno' => 'แถว $1:',
 'compareselectedversions' => 'เปรียบเทียบสองรุ่นที่เลือก',
@@ -1137,8 +1153,6 @@ $1",
 'search-interwiki-caption' => 'โครงการพี่น้อง',
 'search-interwiki-default' => '$1 ผลลัพธ์:',
 'search-interwiki-more' => '(มากกว่า)',
-'search-mwsuggest-enabled' => 'พร้อมคำแนะนำ',
-'search-mwsuggest-disabled' => 'ไม่รวมคำแนะนำ',
 'search-relatedarticle' => 'สัมพันธ์',
 'mwsuggest-disable' => 'ยกเลิกการแนะนำในลักษณะเอแจ็กซ์',
 'searcheverything-enable' => 'สืบค้นในเนมสเปซทั้งหมด',
@@ -1722,6 +1736,8 @@ $1',
 'uploadnewversion-linktext' => 'อัปโหลดรุ่นใหม่ของไฟล์นี้',
 'shared-repo-from' => 'จาก $1',
 'shared-repo' => 'คลังที่ใช้ร่วมกัน',
+'shared-repo-name-wikimediacommons' => 'วิกิมีเดียคอมมอนส์',
+'filepage.css' => '/* สไตล์ชีตในหน้านี้ถูกรวมในหน้าคำอธิบายไฟล์ และถูกรวมในวิกิผู้รับบริการต่างถิ่นด้วย */',
 
 # File reversion
 'filerevert' => 'ย้อน $1',
@@ -1923,6 +1939,7 @@ $1',
 'allpagesprefix' => 'แสดงหน้าที่ขึ้นต้นด้วย:',
 'allpagesbadtitle' => 'ชื่อเรื่องนี้ไม่ถูกต้อง อาจสะกดผิด ลิงก์มาจากภาษาอื่นหรือวิกิอื่น หรือมีตัวอักษรที่ไม่สามารถใช้เป็นชื่อเรื่องได้',
 'allpages-bad-ns' => '{{SITENAME}} ไม่มีเนมสเปซในชื่อ "$1"',
+'allpages-hide-redirects' => 'ซ่อนการเปลี่ยนทาง',
 
 # Special:Categories
 'categories' => 'หมวดหมู่',
@@ -2058,11 +2075,7 @@ $1',
 
 'enotif_mailer' => 'แจ้งการแก้ไขจาก {{SITENAME}}',
 'enotif_reset' => 'กำหนดทุกหน้าว่าผ่านตาแล้ว',
-'enotif_newpagetext' => 'นี่คือหน้าใหม่',
 'enotif_impersonal_salutation' => 'ผู้ใช้งาน {{SITENAME}}',
-'changed' => 'ถูกเปลี่ยนแปลง',
-'created' => 'ถูกสร้าง',
-'enotif_subject' => '{{SITENAME}} หน้า $PAGETITLE ได้ $CHANGEDORCREATED โดย $PAGEEDITOR',
 'enotif_lastvisited' => 'ดู $1 สำหรับการเปลี่ยนแปลงตั้งแต่ครั้งล่าสุดที่แวะมา',
 'enotif_lastdiff' => 'ดู $1 สำหรับดูการเปลี่ยนแปลง',
 'enotif_anon_editor' => 'ผู้ใช้นิรนาม $1',
@@ -2129,6 +2142,7 @@ $UNWATCHURL
 'rollback' => 'ย้อนการแก้ไขกลับฉุกเฉิน',
 'rollback_short' => 'ย้อนกลับฉุกเฉิน',
 'rollbacklink' => 'ย้อนกลับฉุกเฉิน',
+'rollbacklinkcount' => 'ย้อนกลับฉุกเฉิน $1 การแก้ไข',
 'rollbackfailed' => 'ย้อนไม่สำเร็จ',
 'cantrollback' => 'ไม่สามารถย้อนการแก้ไขได้ เนื่องจากหน้านี้ไม่มีผู้แก้ไขรายอื่นอีก',
 'alreadyrolled' => 'ไม่สามารถย้อนรุ่นล่าสุด
@@ -2639,7 +2653,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'การทดสอบจาวาสคริปต์',
-'javascripttest-disabled' => 'ฟังก์ชั่นการทำงานนี้ถูกปิดการใช้งานอยู่',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'หน้าผู้ใช้ของคุณ',
@@ -2722,6 +2735,11 @@ $1',
 'vector.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
 'print.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ข้อมูลส่งออกเป็นสิ่งพิมพ์ */',
 'handheld.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่อุปกรณ์เคลื่อนที่ โดยขึ้นอยู่กับสกินที่ตั้งค่าไว้ใน $wgHandheldStyle */',
+'noscript.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ที่ปิดการใช้งานจาวาสคริปต์ */',
+'group-autoconfirmed.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ใช้ทั่วไปเท่านั้น */',
+'group-bot.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่บอตเท่านั้น */',
+'group-sysop.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลเท่านั้น */',
+'group-bureaucrat.css' => '/* สไตล์ชีตในหน้านี้จะส่งผลแก่ผู้ดูแลสิทธิแต่งตั้งเท่านั้น */',
 
 # Scripts
 'common.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทุกคนในทุกหน้า */',
@@ -2734,6 +2752,10 @@ $1',
 'simple.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินซิมเปิล */',
 'modern.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินโมเดิร์น */',
 'vector.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ที่ใช้สกินเวกเตอร์ */',
+'group-autoconfirmed.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ใช้ทั่วไปเท่านั้น */',
+'group-bot.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่บอตเท่านั้น */',
+'group-sysop.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ดูแลเท่านั้น */',
+'group-bureaucrat.js' => '/* จาวาสคริปต์ใด ๆ ในหน้านี้จะถูกโหลดให้แก่ผู้ดูแลสิทธิแต่งตั้งเท่านั้น */',
 
 # Metadata
 'notacceptable' => 'เซิร์ฟเวอร์ของวิกิไม่สามารถให้ข้อมูลในรูปแบบที่ไคลเอนต์สามารถอ่านได้',
@@ -2840,6 +2862,10 @@ $1',
 'sp-newimages-showfrom' => 'แสดงภาพใหม่เริ่มต้นจาก $2, $1',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
+'seconds-abbrev' => '$1 วินาที',
+'minutes-abbrev' => '$1 นาที',
+'hours-abbrev' => '$1 ชั่วโมง',
+'days-abbrev' => '$1 วัน',
 'ago' => '$1 มาแล้ว',
 
 # Bad image list
@@ -2927,6 +2953,7 @@ $1',
 'exif-lightsource' => 'แสง',
 'exif-flash' => 'แฟลช',
 'exif-focallength' => 'ระยะโฟกัส',
+'exif-focallength-format' => '$1 มม.',
 'exif-subjectarea' => 'จุดวัตถุ',
 'exif-flashenergy' => 'พลังงานแฟลช',
 'exif-focalplanexresolution' => 'ความละเอียระนาบโฟกัส X',
@@ -3273,7 +3300,23 @@ $5
 'size-bytes' => '$1 ไบต์',
 'size-kilobytes' => '$1 กิโลไบต์',
 'size-megabytes' => '$1 เมกะไบต์',
-'size-gigabytes' => '$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' => 'กำลังโหลด…',
@@ -3346,6 +3389,8 @@ $5
 'version-software' => 'ซอฟต์แวร์ที่ติดตั้ง',
 'version-software-product' => 'ชื่อ',
 'version-software-version' => 'รุ่น',
+'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath เส้นทางบทความ]',
+'version-entrypoints-scriptpath' => '[https://www.mediawiki.org/wiki/Manual:$wgScriptPath เส้นทางสคริปต์]',
 
 # Special:FilePath
 'filepath' => 'พาธของไฟล์',
@@ -3449,6 +3494,7 @@ $5
 # New logging system
 'logentry-delete-delete' => '$1 ลบหน้า $3',
 'logentry-delete-restore' => '$1 กู้คืนหน้า $3',
+'logentry-delete-event' => '$1 เปลี่ยนทัศนวิสัยของ $5 รายการปูมใน $3: $4',
 'revdelete-content-hid' => 'เนื้อหาถูกซ่อน',
 'revdelete-summary-hid' => 'คำอธิบายอย่างย่อถูกซ่อน',
 'revdelete-uname-hid' => 'ชื่อผู้ใช้ถูกซ่อน',
@@ -3473,6 +3519,10 @@ $5
 'feedback-adding' => 'เพิ่มคำติชมเข้าไปที่หน้า...',
 'feedback-close' => 'เสร็จสิ้น',
 
+# Search suggestions
+'searchsuggest-search' => 'ค้นหา',
+'searchsuggest-containing' => 'ประกอบไปด้วย...',
+
 # API errors
 'api-error-mustbeloggedin' => 'กรุณาลงชื่อเข้าใช้เพื่ออัปโหลดไฟล์',
 
index 1a62f89..a03f817 100644 (file)
 
 $messages = array(
 'underline-always' => 'ጥራይ',
-'underline-never'  => 'ኣይትግበሩ',
+'underline-never' => 'ኣይትግበሩ',
 
 # Dates
-'sunday'    => 'ሰንበት',
-'monday'    => 'ሰኑይ',
-'tuesday'   => 'ሰሉስ',
+'sunday' => 'ሰንበት',
+'monday' => 'ሰኑይ',
+'tuesday' => 'ሰሉስ',
 'wednesday' => 'ረብዓ',
-'thursday'  => 'ኃሙስ',
-'friday'    => 'ዓርቢ',
-'saturday'  => 'ቀዳም',
-'sun'       => 'ሰንበ',
-'mon'       => 'ሰኑይ',
-'tue'       => 'ሠሉስ',
-'wed'       => 'ረቡዕ',
-'thu'       => 'ኃሙስ',
-'fri'       => 'ዓርቢ',
-'sat'       => 'ቀዳም',
-'january'   => 'ትሪ',
-'february'  => 'ለካቲት',
-'march'     => 'መጋቢት',
-'april'     => 'ሚያዝያ',
-'may_long'  => 'ግንቦት',
-'june'      => 'ሰነ',
-'july'      => 'ሓምለ',
-'august'    => 'ነሓሰ',
+'thursday' => 'ኃሙስ',
+'friday' => 'ዓርቢ',
+'saturday' => 'ቀዳም',
+'sun' => 'ሰንበ',
+'mon' => 'ሰኑይ',
+'tue' => 'ሠሉስ',
+'wed' => 'ረቡዕ',
+'thu' => 'ኃሙስ',
+'fri' => 'ዓርቢ',
+'sat' => 'ቀዳም',
+'january' => 'ትሪ',
+'february' => 'ለካቲት',
+'march' => 'መጋቢት',
+'april' => 'ሚያዝያ',
+'may_long' => 'ግንቦት',
+'june' => 'ሰነ',
+'july' => 'ሓምለ',
+'august' => 'ነሓሰ',
 'september' => 'መስከረም',
-'october'   => 'ጥቅምቲ',
-'november'  => 'ኅዳር',
-'december'  => 'ታኅሣሥ',
-'jan'       => 'ጃንዩ',
-'feb'       => 'ፌብሩ',
-'mar'       => 'ማርች',
-'apr'       => 'ኤፕረ',
-'may'       => 'ሜይ',
-'jun'       => 'ጁን',
-
-'about'  => 'ብዛዕባ ብጠቅላላ',
+'october' => 'ጥቅምቲ',
+'november' => 'ኅዳር',
+'december' => 'ታኅሣሥ',
+'jan' => 'ጃንዩ',
+'feb' => 'ፌብሩ',
+'mar' => 'ማርች',
+'apr' => 'ኤፕረ',
+'may' => 'ሜይ',
+'jun' => 'ጁን',
+
+'about' => 'ብዛዕባ ብጠቅላላ',
 'mypage' => 'ፅሑፈይ',
 
 # Cologne Blue skin
 'qbpageoptions' => 'ፅሑፍዚ',
-'qbmyoptions'   => 'ፅሑፋተይ',
+'qbmyoptions' => 'ፅሑፋተይ',
 
-'help'          => 'ፍንጪ',
-'search'        => 'ድሉይ',
-'searchbutton'  => 'ድሉይ',
-'history'       => 'ናይ ፅሑፍ ታሪኽ',
+'help' => 'ፍንጪ',
+'search' => 'ድሉይ',
+'searchbutton' => 'ድሉይ',
+'history' => 'ናይ ፅሑፍ ታሪኽ',
 'history_short' => 'ታሪኽ',
-'newpage'       => 'ሓዳስ ፅሑፍ',
-'jumptosearch'  => 'ድሉይ',
+'newpage' => 'ሓዳስ ፅሑፍ',
+'jumptosearch' => 'ድሉይ',
 
 # 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'            => 'ብዛዕባ ዊኪፒዲያ ብጠቅላላ',
-'mainpage'             => 'መበገሲ ገጽ',
+'aboutsite' => 'ብዛዕባ ዊኪፒዲያ ብጠቅላላ',
+'mainpage' => 'መበገሲ ገጽ',
 'mainpage-description' => 'መበገሲ ገጽ',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'    => 'ፅሑፍ',
-'nstab-user'    => 'ናይ ፅሑፍ ኣባል',
+'nstab-main' => 'ፅሑፍ',
+'nstab-user' => 'ናይ ፅሑፍ ኣባል',
 'nstab-project' => 'ናይ ፅሑፍ ፕሮጀክት',
-'nstab-image'   => 'ምስሊ',
+'nstab-image' => 'ምስሊ',
 
 # Login and logout pages
-'yourname'           => 'ናይ ኣባል ሽም:',
+'yourname' => 'ናይ ኣባል ሽም:',
 'loginlanguagelabel' => 'ቋንቋ: $1',
 
 # Edit pages
 'savearticle' => 'ፅሑፍ ኣቐምጥ',
-'newarticle'  => '(ሓዳስ)',
+'newarticle' => '(ሓዳስ)',
 
 # History pages
-'next'        => 'ዝቕጽል',
+'next' => 'ዝቕጽል',
 'historysize' => '($1 {{PLURAL:$1|ባይታት|ባይታት}})',
 
 # Search results
-'prevn'       => 'ናይ ቀደም {{PLURAL:$1|$1}}',
-'nextn'       => 'ዝቕጽል {{PLURAL:$1|$1}}',
+'prevn' => 'ናይ ቀደም {{PLURAL:$1|$1}}',
+'nextn' => 'ዝቕጽል {{PLURAL:$1|$1}}',
 'powersearch' => 'ድሉይ',
 
 # Preferences page
-'preferences'       => 'ኣማረጽቲ',
-'mypreferences'     => 'ናተይ ኣማረጽቲ',
-'saveprefs'         => 'ኣቐምጥ',
+'preferences' => 'ኣማረጽቲ',
+'mypreferences' => 'ናተይ ኣማረጽቲ',
+'saveprefs' => 'ኣቐምጥ',
 'searchresultshead' => 'ድሉይ',
-'savedprefs'        => 'ዘቕረብኩሞ መርኣይ ብትክክል ተቀሚጡ ኣሎ።',
-'prefs-files'       => 'ምስልታት',
-'youremail'         => 'ኢ-መይል:',
-'yourlanguage'      => 'ቋንቋ:',
-'email'             => 'ኢ-መይል',
+'savedprefs' => 'ዘቕረብኩሞ መርኣይ ብትክክል ተቀሚጡ ኣሎ።',
+'prefs-files' => 'ምስልታት',
+'youremail' => 'ኢ-መይል:',
+'yourlanguage' => 'ቋንቋ:',
+'email' => 'ኢ-መይል',
 
 # Groups
-'group'       => 'ብሓበር:',
+'group' => 'ብሓበር:',
 'group-sysop' => 'ሲሶፓት',
 
 'group-sysop-member' => '{{GENDER:$1|ሲሶፕ}}',
 
 # Recent changes
-'hist'          => 'ታሪኽ',
+'hist' => 'ታሪኽ',
 'newpageletter' => 'ሓ',
 
 # Upload
 'savefile' => 'ምስሊ ኣቐምጥ',
 
 # Special:ListFiles
-'imgfile'        => 'ምስሊ',
-'listfiles'      => 'ምስልታት',
+'imgfile' => 'ምስሊ',
+'listfiles' => 'ምስልታት',
 'listfiles_name' => 'ሽም',
 'listfiles_user' => 'ኣባል',
 
@@ -127,10 +127,10 @@ $messages = array(
 'file-anchor-link' => 'ምስሊ',
 
 # Miscellaneous special pages
-'nbytes'            => '$1 {{PLURAL:$1|ባይት|ባይታት}}',
-'longpages'         => 'ነዋሕቲ ፅሑፋት',
-'listusers'         => 'ኣባላት',
-'newpages'          => 'ሓደሽቲ ዛዕባታት',
+'nbytes' => '$1 {{PLURAL:$1|ባይት|ባይታት}}',
+'longpages' => 'ነዋሕቲ ፅሑፋት',
+'listusers' => 'ኣባላት',
+'newpages' => 'ሓደሽቲ ዛዕባታት',
 'newpages-username' => 'ናይ ኣባል ሽም:',
 
 # Book sources
@@ -141,11 +141,11 @@ $messages = array(
 
 # Special:AllPages
 'alphaindexline' => '$1 ናብ $2',
-'nextpage'       => 'ዝቕጽል ፅሑፍ ($1)',
-'prevpage'       => 'ናይ ቀደም ፅሑፍ ($1)',
-'allarticles'    => 'ኵሎም ፅሑፋት',
-'allpagesprev'   => 'ናይ ቀደም',
-'allpagesnext'   => 'ዝቕጽል',
+'nextpage' => 'ዝቕጽል ፅሑፍ ($1)',
+'prevpage' => 'ናይ ቀደም ፅሑፍ ($1)',
+'allarticles' => 'ኵሎም ፅሑፋት',
+'allpagesprev' => 'ናይ ቀደም',
+'allpagesnext' => 'ዝቕጽል',
 'allpagessubmit' => 'ኪድ',
 
 # Protect
@@ -179,15 +179,15 @@ $messages = array(
 'imgmultipagenext' => 'ዝቕጽል ፅሑፍ →',
 
 # Table pager
-'table_pager_next'         => 'ዝቕጽል ፅሑፍ',
-'table_pager_prev'         => 'ናይ ቀደም ፅሑፍ',
+'table_pager_next' => 'ዝቕጽል ፅሑፍ',
+'table_pager_prev' => 'ናይ ቀደም ፅሑፍ',
 'table_pager_limit_submit' => 'ኪድ',
 
 # Auto-summaries
 'autosumm-new' => 'ሓዳስ ፅሑፍ: $1',
 
 # Size units
-'size-bytes'     => '$1 ባይታት',
+'size-bytes' => '$1 ባይታት',
 'size-kilobytes' => '$1 ኪሎባይታት',
 'size-megabytes' => '$1 ሜጋባይታት',
 'size-gigabytes' => '$1 ጊጋባይታት',
index 8530ecd..a1aa29f 100644 (file)
@@ -171,8 +171,8 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'newwindow' => '(täze penjirede açylýar)',
 'cancel' => 'Goýbolsun et',
 'moredotdotdot' => 'Has köp...',
-'mypage' => 'Sahypam',
-'mytalk' => 'Pikir alyşma sahypam',
+'mypage' => 'Sahypa',
+'mytalk' => 'Pikir alyşma',
 'anontalk' => 'Bu IP-niň habarlaşyklary',
 'navigation' => 'Nawigasiýa',
 'and' => '&#32;we',
@@ -182,7 +182,6 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'qbbrowse' => 'Göz aýla',
 'qbedit' => 'Redaktirle',
 'qbpageoptions' => 'Bu sahypa',
-'qbpageinfo' => 'Kontekst',
 'qbmyoptions' => 'Meniň sahypalarym',
 'qbspecialpages' => 'Ýörite sahypalar',
 'faq' => 'KSS',
@@ -194,7 +193,7 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'vector-action-move' => 'Adyny üýtget',
 'vector-action-protect' => 'Goraga al',
 'vector-action-undelete' => 'Öçürmäni yzyna al',
-'vector-action-unprotect' => 'Goragy aýyr',
+'vector-action-unprotect' => 'Goragy üýtget',
 'vector-simplesearch-preference' => 'Giňeldilen gözleg tekliplerini aç (Diňe Vector bezegi üçin)',
 'vector-view-create' => 'Döret',
 'vector-view-edit' => 'Redaktirle',
@@ -205,6 +204,7 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'namespaces' => 'At giňişlikleri',
 'variants' => 'Wariantlar',
 
+'navigation-heading' => 'Nawigasiýa menýusy',
 'errorpagetitle' => 'Säwlik',
 'returnto' => '$1.',
 'tagline' => '{{SITENAME}} saýtyndan',
@@ -230,7 +230,7 @@ kiçi kategoriýadan {{PLURAL:$1|sany kiçi kategoriýa|$1 sany kiçi kategoriý
 'protect' => 'Goraga al',
 'protect_change' => 'üýtget',
 'protectthispage' => 'Sahypany gorag astyna al',
-'unprotect' => 'Goragy aýyr',
+'unprotect' => 'Goragy üýtget',
 'unprotectthispage' => 'Sahypanyň goragyny aýyr',
 'newpage' => 'Täze sahypa',
 'talkpage' => 'Sahypany ara alyp maslahatlaş',
@@ -312,6 +312,8 @@ Bu sahypany ulanmak üçin MediaWikiniň $1 wersiýasy talap edilýär. [[Specia
 'toc' => 'Mazmuny',
 'showtoc' => 'görkez',
 'hidetoc' => 'gizle',
+'collapsible-collapse' => 'Ýygna',
+'collapsible-expand' => 'Giňelt',
 'thisisdeleted' => '$1 görmek ýa-da dikeltmek isleýärsiňizmi?',
 'viewdeleted' => '$1 gör?',
 'restorelink' => '{{PLURAL:$1|bir öçürilen özgerdişi|$1 öçürilen özgerdişi}}',
@@ -422,12 +424,9 @@ Görkezilen sebäp: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Sessiýany ýapdyňyz.'''
 
-Indi anonim ýagdaýda {{SITENAME}} saýtyny ulanyp bilersiňiz, ýa-da şol bir ýa-da başga bir at bilen [[Special:UserLogin|sessiýany ýaňadan]] açyp bilersiňiz.
+Indi anonim ýagdaýda {{SITENAME}} saýtyny ulanyp bilersiňiz, ýa-da şol bir ýa-da başga bir at bilen <span class='plainlinks'>[$1 sessiýany ýaňadan]</span> açyp bilersiňiz.
 Web brauzeriňiziň keşini arassalaýançaňyz käbir sahypalar sessiýaňyzyň açyk wagtkysy ýaly görünip biler.",
-'welcomecreation' => '== Hoş geldiňiz, $1! ==
-
-Hasabyňyz açyldy.
-[[Special:Preferences|{{SITENAME}} saýtyndaky ileri tutmalaryňyzy]] üýtgetmegi ýatdan çykarmaň.',
+'welcomeuser' => 'Hoş geldiňiz, $1!',
 'yourname' => 'Ulanyjy adyňyz:',
 'yourpassword' => 'Parolyňyz:',
 'yourpasswordagain' => 'Paroly gaýtadan ýaz:',
@@ -531,10 +530,19 @@ Parolyňyzy eýýäm şowlulyk bilen üýtgeden ýa-da täze wagtlaýyn parol ta
 'resetpass-temp-password' => 'Wagtlaýyn parol:',
 
 # Special:PasswordReset
+'passwordreset' => 'Paroly nol et',
+'passwordreset-legend' => 'Paroly nol et',
 'passwordreset-username' => 'Ulanyjy ady:',
+'passwordreset-domain' => 'Domen:',
+'passwordreset-emailelement' => 'Ulanyjy ady: $1
+Wagtlaýyn parol: $2',
 
 # Special:ChangeEmail
+'changeemail' => 'E-poçta adresini üýtget',
+'changeemail-oldemail' => 'Häzirki e-poçta adresi:',
+'changeemail-newemail' => 'Täze e-poçta adresi:',
 'changeemail-none' => '(hiç biri)',
+'changeemail-submit' => 'E-poçtany üýtget',
 'changeemail-cancel' => 'Goýbolsun et',
 
 # Edit page toolbar
@@ -628,7 +636,7 @@ Bu ady başga sahypalarda [[Special:Search/{{PAGENAME}}|gözläp bilersiňiz]],
 ýa-da bu sahypany [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktirläp bilersiňiz]</span>.',
 'noarticletext-nopermission' => 'Häzirki wagtda bu sahypada tekst ýok.
 Bu sahypa adyny [[Special:Search/{{PAGENAME}}|başga sahypalarda gözläp]]
-ýa-da <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} degişli gündeliklerde gözleg geçirip bilersiňiz].</span>',
+ýa-da <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} degişli gündeliklerde gözleg geçirip bilersiňiz]</span>, ýöne bu sahypany döretmäge rugsadyňyz ýok.',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" ulanyjy hasaby hasaba alynmandyr.
 Bu sahypany döretmek/redaktirlemek isleýän bolsaňyz, onda esewan boluň.',
 'userpage-userdoesnotexist-view' => '"$1" ulanyjy hasaby hasaba alynmandyr.',
@@ -665,6 +673,7 @@ Eger şonda-da bolmasa, onda [[Special:UserLogout|sessiýany ýapyň-da]] gaýta
 Sahypanyň tekstine zeper ýetmeginiň öňüni almak maksady bilen özgerdişiňiz ret edildi.
 Bu ýagdaý kämahal içi ýalňyşly anonim web proksileri ulanylanda ýüze çykýar.",
 'editing' => '$1 sahypasyny redaktirleýärsiňiz',
+'creating' => '"$1" sahypasy döredilýär',
 'editingsection' => '"$1" sahypasynda bölüm redaktirleýärsiňiz',
 'editingcomment' => '$1 redaktirlenýär (täze bölüm)',
 'editconflict' => 'Özgerdiş çaknyşmasy: $1',
@@ -732,6 +741,11 @@ Düşündiriş berilmedi.',
 'edit-already-exists' => 'Täze sahypa döredip bolanok.
 Ol eýýäm bar.',
 
+# Content models
+'content-model-wikitext' => 'wikitekst',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
+
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Duýduryş:''' Bu sahypada resurs talap ediji funksiýalara çakdanaşa köp çagyryş bar.
 
@@ -794,7 +808,7 @@ Wikiden öçürilen ýa-da adynyň üýtgedilen bolmagy ahmal.
 Baglanyşykly täze sahypalar üçin [[Special:Search|wikide gözleg geçirip]] görüň.',
 
 # Revision deletion
-'rev-deleted-comment' => '(teswir aýyryldy)',
+'rev-deleted-comment' => '(özgerdişiň gysgaça düşündirişi aýryldy)',
 'rev-deleted-user' => '(ulanyjy ady aýyryldy)',
 'rev-deleted-event' => '(gündelik işi aýyryldy)',
 'rev-deleted-user-contribs' => '[ulanyjy ady ýa-da IP adresi aýrylypdyr - özgerdiş goşantlardan gizlenildi]',
@@ -925,7 +939,7 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 'mergelogpagetext' => 'Aşakdaky sanaw sahypalaryň geçmişleriniň iň soňky birleşdirmelerini görkezýär.',
 
 # Diffs
-'history-title' => '"$1" sahypasynyň geçmişi',
+'history-title' => '"$1" — sahypa geçmişi',
 'difference-multipage' => '(Sahypalaryň arasyndaky tapawut)',
 'lineno' => 'Setir $1:',
 'compareselectedversions' => 'Saýlanan wersiýalary deňeşdir',
@@ -975,8 +989,6 @@ Nawigasiýa çykgytlaryny ulanmaklygyň bu sütüni başky ýagdaýyna getirjekd
 'search-interwiki-caption' => 'Dogan taslamalar',
 'search-interwiki-default' => '$1 netijeler:',
 'search-interwiki-more' => '(has-da köp)',
-'search-mwsuggest-enabled' => 'teklipler bilen',
-'search-mwsuggest-disabled' => 'teklip ýok',
 'search-relatedarticle' => 'Baglanyşykly',
 'mwsuggest-disable' => 'AJAX tekliplerini ýap',
 'searcheverything-enable' => 'Ähli at giňişliklerinde gözle',
@@ -1011,7 +1023,7 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
 
 # Preferences page
 'preferences' => 'Ileri tutmalar',
-'mypreferences' => 'Ileri tutmalarym',
+'mypreferences' => 'Ileri tutmalar',
 'prefs-edits' => 'Özgerdiş sany:',
 'prefsnologin' => 'Sessiýa açmansyňyz',
 'prefsnologintext' => 'Ulanyjy ileri tutmalaryny üýtgetmek üçin <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} sessiýa açmagyňyz gerek]</span>.',
@@ -1026,12 +1038,13 @@ Emma olaryň {{SITENAME}} indeksleriniň möwriti geçen bolmagy mümkindir.',
 'prefs-rc' => 'Soňky üýtgeşmeler',
 'prefs-watchlist' => 'Gözegçilik sanawy',
 'prefs-watchlist-days' => 'Gözegçilik sanawynda görkeziljek gün sany:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Mmaksimum $1 {{PLURAL:$1|gün}}',
 'prefs-watchlist-edits' => 'Giňeldilen gözegçilik sanawynda görkeziljek üýtgeşmeleriň maksimum sany:',
 'prefs-watchlist-edits-max' => 'Maksimum san: 1000',
 'prefs-watchlist-token' => 'Gözegçilik sanawynyň alamaty:',
 'prefs-misc' => 'Başga',
 'prefs-resetpass' => 'Paroly üýtget',
+'prefs-changeemail' => 'E-poçta adresini üýtget',
 'prefs-email' => 'E-poçta opsiýalary',
 'prefs-rendering' => 'Daşky görnüş',
 'saveprefs' => 'Ýazdyr',
@@ -1071,7 +1084,7 @@ Gabat gelşine görä döredilen şu bahany ulanyp bilersiňiz: $1',
 'timezoneregion-indian' => 'Hindi okeany',
 'timezoneregion-pacific' => 'Ýuwaş okean',
 'allowemail' => 'Başga ulanyjylar maňa e-poçta iberip bilsin',
-'prefs-searchoptions' => 'Gözleg opsiýalary',
+'prefs-searchoptions' => 'Gözleg',
 'prefs-namespaces' => 'At giňişlikleri',
 'defaultns' => 'Bolmasa şu at giňişliklerinde gözleg geçiriň:',
 'default' => 'gaýybana',
@@ -1151,9 +1164,9 @@ $1 {{PLURAL:$1|simwoldan|simwoldan}} köp bolmaly däl.',
 'group-suppress' => 'Esewançylar',
 'group-all' => '(ählisi)',
 
-'group-user-member' => 'Ulanyjy',
+'group-user-member' => '{{GENDER:$1|ulanyjy}}',
 'group-autoconfirmed-member' => 'Awtomatik tassyklanan ulanyjy',
-'group-bot-member' => 'Bot',
+'group-bot-member' => '{{GENDER:$1|bot}}',
 'group-sysop-member' => 'Administrator',
 'group-bureaucrat-member' => 'Býurokrat',
 'group-suppress-member' => 'Esewançy',
@@ -1831,7 +1844,7 @@ Goldanylýan protokollar: <code>$1</code>',
 
 # Watchlist
 'watchlist' => 'Gözegçilik sanawym',
-'mywatchlist' => 'Gözegçilik sanawym',
+'mywatchlist' => 'Gözegçilik sanawy',
 'watchlistfor2' => '$1 üçin  $2',
 'nowatchlist' => 'Gözegçilik sanawyňyzda hiçhili sahypa ýok.',
 'watchlistanontext' => 'Gözegçilik sanawyňyzdaky sahypalary görmek ýa-da redaktirlemek üçin $1.',
@@ -1867,11 +1880,7 @@ Aňsatlyk bilen saýlap almak üçin bolsa, [[Special:RecentChanges|soňky üýt
 
 'enotif_mailer' => '{{SITENAME}} Poçta Gullugy',
 'enotif_reset' => 'Ähli sahypalary barylyp görülen diýip belle',
-'enotif_newpagetext' => 'Bu täze sahypa.',
 'enotif_impersonal_salutation' => '{{SITENAME}} ulanyjysy',
-'changed' => 'üýtgedildi',
-'created' => 'döredildi',
-'enotif_subject' => '{{SITENAME}} sahypasy $PAGETITLE, $PAGEEDITOR tarapyndan $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Iň soňky gezek baryp göreliňiz bäri bolan ähli üýtgeşmeleri görmek üçin serediň: $1',
 'enotif_lastdiff' => 'Bu üýtgeşmäni görmek üçin serediň: $1',
 'enotif_anon_editor' => 'anonim ulanyjy $1',
@@ -2084,7 +2093,7 @@ $1',
 # Contributions
 'contributions' => 'Ulanyjynyň goşantlary',
 'contributions-title' => '$1 üçin ulanyjy goşantlary',
-'mycontris' => 'Goşantlarym',
+'mycontris' => 'Goşantlar',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Bu kriteriýlere gabat gelýän üýtgeşme ýok.',
 'uctop' => '(iň soňky)',
@@ -2125,7 +2134,7 @@ Salgylanmak üçin iň soňky blokirleme gündeligi ýazgysy aşakda berilýär:
 'whatlinkshere-hideredirs' => 'gönükdirmeleri $1',
 'whatlinkshere-hidetrans' => 'Atanaklaýyn girizmeleri $1',
 'whatlinkshere-hidelinks' => 'çykgytlary $1',
-'whatlinkshere-hideimages' => 'surat çykgytlaryny $1',
+'whatlinkshere-hideimages' => 'Faýl çykgytlaryny $1',
 'whatlinkshere-filters' => 'Filtrler',
 
 # Block/unblock
@@ -3146,4 +3155,8 @@ Faýlyň adyny "{{ns:file}}:" pristawkasyz giriziň.',
 'revdelete-unrestricted' => 'administratorlardan aýyrylan çäklendirmeler',
 'newuserlog-byemail' => 'parol e-poçta bilen iberildi',
 
+# Search suggestions
+'searchsuggest-search' => 'Gözleg',
+'searchsuggest-containing' => 'öz içine alýar...',
+
 );
index c15b40b..e5ca777 100644 (file)
@@ -114,7 +114,6 @@ $specialPageAliases = array(
        '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' ),
@@ -196,7 +195,7 @@ $messages = array(
 
 'underline-always' => 'Palagi',
 'underline-never' => 'Hindi magpakailanman',
-'underline-default' => 'Tinakda ng pambasa-basa',
+'underline-default' => 'Tinakda ng pambasa-basa o balat',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Baguhin ang estilong pantitik ng lugar:',
@@ -285,7 +284,7 @@ $messages = array(
 'cancel' => 'Kanselahin',
 'moredotdotdot' => 'Damihan pa...',
 'mypage' => 'Pahina ko',
-'mytalk' => 'Usapan ko',
+'mytalk' => 'Usapan',
 'anontalk' => 'Usapan para sa IP na ito',
 'navigation' => 'Paglilibot (nabigasyon)',
 'and' => ',&#32;at',
@@ -295,7 +294,6 @@ $messages = array(
 'qbbrowse' => 'Basa-basahin',
 'qbedit' => 'Baguhin',
 'qbpageoptions' => 'Itong pahina',
-'qbpageinfo' => 'Konteksto',
 'qbmyoptions' => 'Mga pahina ko',
 'qbspecialpages' => 'Mga natatanging pahina',
 'faq' => "Mga karaniwang itinatanong (''FAQ'')",
@@ -567,11 +565,8 @@ Ang tagapangasiwang nagkandado nito ay nag-alok ng ganitong paliwanag: "$3".',
 # Login and logout pages
 'logouttext' => "'''Nakaalis ka na sa pagkakalagda.'''
 
-Maaari kang tumuloy sa paggamit ng {{SITENAME}} nang hindi nakikilala (anonimo), o maaaring kang [[Special:UserLogin|lumagda/tumala muli]] bilang kapareho o ibang tagagamit.
+Maaari kang tumuloy sa paggamit ng {{SITENAME}} nang hindi nakikilala (anonimo), o maaaring kang <span class='plainlinks'>[$1 lumagda/tumala muli]</span> bilang kapareho o ibang tagagamit.
 Tandaan na may ilang pahinang maaaring magpatuloy na nagpapakitang parang nakalagda ka pa rin, hanggang sa linisin mo ang iyong baunang pambasa-basa (''browser cache'').",
-'welcomecreation' => '== Maligayang pagdating, $1! ==
-Nilikha na ang iyong kuwenta.
-Huwag kalimutang baguhin ang iyong [[Special:Preferences|mga kagustuhan sa {{SITENAME}}]].',
 'yourname' => 'Bansag:',
 'yourpassword' => 'Hudyat:',
 'yourpasswordagain' => 'Hudyat mo uli:',
@@ -867,10 +862,11 @@ Tandaang gumagamit ang pinasadyang mga pahinang .css at .js ng mga pamagat na ma
 'note' => "'''Paunawa:'''",
 'previewnote' => "'''Tandaan na isa lamang itong paunang tingin.'''
 Hindi pa nasasagip ang mga binago mo!",
-'continue-editing' => 'Ipagpatuloy ang pamamatnugot',
+'continue-editing' => 'Pumunta sa pook ng pamamatnugot',
 'previewconflict' => 'Ipinamamalas ng paunang tinging ito ang teksto sa loob ng pangitaas na pook-patnugutan ng teksto ayon sa lilitaw na anyo nito kapag pinili mo ang pagsagip.',
-'session_fail_preview' => "'''Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng sesyon ng datos.
-Paki ulit muli. Kung hindi ito gumana, subukang umalis sa pagkalagda at bumalik muli.'''",
+'session_fail_preview' => "'''Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng datos ng sesyon.'''
+Pakiulit muli.
+Kung hindi ito gumana, subukang [[Special:UserLogout|umalis sa pagkalagda]] at bumalik muli.",
 'session_fail_preview_html' => "'''Paumanhin! Hindi namin maproseso ang iyong pagbabago hinggil sa pagkawala ng datos ng sesyon.'''
 
 ''Dahil naka-andar ang hilaw na HTML sa {{SITENAME}}, nakatago ang paunang tingin bilang pag-iingat sa mga paglusob ng JavaScript.''
@@ -1207,8 +1203,6 @@ Matatagpuan ang mga detalye sa loob ng [{{fullurl:{{#Special:Log}}/delete|page={
 'search-interwiki-caption' => 'Kapatid na mga proyekto',
 'search-interwiki-default' => '$1 mga resulta:',
 'search-interwiki-more' => '(mas marami pa)',
-'search-mwsuggest-enabled' => 'may mga mungkahi',
-'search-mwsuggest-disabled' => 'walang mga mungkahi',
 'search-relatedarticle' => 'Kaugnay',
 'mwsuggest-disable' => 'Huwag paganahin ang mga mungkahi ng AJAX',
 'searcheverything-enable' => 'Maghanap sa lahat ng ngalan-espasyo:',
@@ -1242,7 +1236,7 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 
 # Preferences page
 'preferences' => 'Mga kagustuhan',
-'mypreferences' => 'Mga nais ko',
+'mypreferences' => 'Mga nais',
 'prefs-edits' => 'Bilang ng mga pagbabago:',
 'prefsnologin' => 'Hindi nakalagda/nakatala',
 'prefsnologintext' => 'Kailangan mong <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} lumagda/tumala]</span> para makapagtakda ng mga kagustuhang ng tagagamit.',
@@ -1303,7 +1297,7 @@ Subuking lagyan ng unlapi/paunang ''all:'' upang hanapin ang lahat ng mga nialal
 'timezoneregion-indian' => 'Karagatang Indyano',
 'timezoneregion-pacific' => 'Karagatang Pasipiko',
 'allowemail' => 'Pahintulutan ang e-liham mula sa ibang mga tagagamit',
-'prefs-searchoptions' => 'Mga pagpipilian para sa paghahanap',
+'prefs-searchoptions' => 'Paghahanap',
 'prefs-namespaces' => 'Mga espasyo ng pangalan',
 'defaultns' => 'O kaya maghanap sa mga pangalan ng espasyong ito:',
 'default' => 'Likas na pagtatakda',
@@ -2226,11 +2220,7 @@ Makikita doon ang lahat ng mga susunod na pagbabago sa pahinang ito pati na ang
 
 'enotif_mailer' => 'Tagapagpadala ng mga Pahayag ng {{SITENAME}}',
 'enotif_reset' => 'Tatakan ang lahat ng pahina bilang nadalaw na',
-'enotif_newpagetext' => 'Isa itong bagong pahina.',
 'enotif_impersonal_salutation' => 'Tagagamit ng {{SITENAME}}',
-'changed' => 'binago',
-'created' => 'nilikha',
-'enotif_subject' => 'Ang pahinang $PAGETITLE sa {{SITENAME}} ay $CHANGEDORCREATED ni $PAGEEDITOR',
 'enotif_lastvisited' => 'Tingnan ang $1 para sa lahat ng mga pagbabago magmula noong huling pagdalaw mo.',
 'enotif_lastdiff' => 'Tingnan ang $1 para makita ang pagbabagong ito.',
 'enotif_anon_editor' => 'hindi nakikilalang tagagamit $1',
@@ -2448,9 +2438,9 @@ $1',
 'blanknamespace' => '(Pangunahin)',
 
 # Contributions
-'contributions' => 'Mga ambag ng tagagamit',
+'contributions' => 'Mga ambag ng {{GENDER:$1|tagagamit}}',
 'contributions-title' => 'Mga ambag ng tagagamit na si $1',
-'mycontris' => 'Mga ambag ko',
+'mycontris' => 'Mga ambag',
 'contribsub2' => 'Para kay $1 ($2)',
 'nocontribs' => 'Walang pagbabagong nakita sa binigay na kondisyon.',
 'uctop' => ' (itaas)',
@@ -2492,7 +2482,7 @@ Ang pinakahuling entrada sa talaan  ng pagharang ay ibinigay sa ibaba para sa pa
 'whatlinkshere-hideredirs' => '$1 mga pagturo/pagpapanuto',
 'whatlinkshere-hidetrans' => '$1 paglipat-sali (transklusyon)',
 'whatlinkshere-hidelinks' => '$1 mga kawing',
-'whatlinkshere-hideimages' => '$1 mga kawing ng/sa larawan',
+'whatlinkshere-hideimages' => '$1 kawing ng/sa talaksan',
 'whatlinkshere-filters' => 'Mga pansala',
 
 # Block/unblock
@@ -2849,7 +2839,6 @@ Sagipin mo ito sa iyong kompyuter at papaitaas na ikarga ito rito.',
 
 # JavaScriptTest
 'javascripttest' => 'Pagsubok sa JavaScript',
-'javascripttest-disabled' => 'Hindi gumagana ang tungkuling ito sa wiking ito.',
 'javascripttest-title' => 'Pinatatakbo ang mga pagsubok ng $1',
 'javascripttest-pagetext-noframework' => 'Nakalaan ang pahinang ito para sa pagpapatakbo ng mga pagsubok ng JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Hindi napag-aalamang balangkas ng pagsubok na "$1".',
@@ -2989,6 +2978,7 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 
 # Info page
 'pageinfo-title' => 'Kabatiran para sa "$1"',
+'pageinfo-not-current' => 'Maaari lamang ipakita ang impormasyon para sa kasalukuyang rebisyon.',
 'pageinfo-header-basic' => 'Saligang kabatiran',
 'pageinfo-header-edits' => 'Kasaysayan ng pamamatnugot',
 'pageinfo-header-restrictions' => 'Pruteksiyon ng pahina',
@@ -3014,7 +3004,6 @@ Maaaring dahil ito sa isang kawing sa isang nakatalang hinarang dahil di-kinaisn
 '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 ({{lcfirst:$1}})',
 '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)',
@@ -4046,9 +4035,9 @@ Ipinapakita ang mga larawan sa buong kalinawan, tuwirang sinisimulan ang ibang u
 'logentry-move-move_redir-noredirect' => 'Inilipat ni $1 ang pahinang $3 papunta sa $4 sa ibabaw ng isang pagpapunta sa iba na hindi nag-iiwan ng isang pagpapapunta sa iba',
 'logentry-patrol-patrol' => 'Minarkahan ni $1 ang rebisyong $4 ng pahinang $3 bilang napatrolya na',
 'logentry-patrol-patrol-auto' => 'Kusang minarkahan ni $1 ang rebisyong $4 ng pahinang $3 bilang napatrolya na',
-'logentry-newusers-newusers' => 'Lumikha si $1 ng isang akawnt ng tagagamit',
-'logentry-newusers-create' => 'Lumikha si $1 ng isang akawnt ng tagagamit',
-'logentry-newusers-create2' => 'Lumikha si $1 ng isang akawnt ng tagagamit na $3',
+'logentry-newusers-newusers' => 'Nilikha ang kuwenta ng tagagamit na $1',
+'logentry-newusers-create' => 'Lumikha si $1 ng isang kuwenta ng tagagamit',
+'logentry-newusers-create2' => 'Lumikha si $1 ng isang kuwenta ng tagagamit na $3',
 'logentry-newusers-autocreate' => 'Kusang nalikha ang akawnt na $1',
 'newuserlog-byemail' => 'Ipinadala ang hudyat sa pamamagitan ng e-liham',
 
@@ -4068,6 +4057,10 @@ O kaya, maaari mong gamitin ang maginhawang pormularyo sa ibaba. Ang iyong pagpu
 'feedback-bugcheck' => 'Mahusay! Suriin lang na hindi pa ito isa sa [$1 nalalamang mga depekto].',
 'feedback-bugnew' => 'Sinuri ko na. Mag-ulat ng panibagong sira',
 
+# Search suggestions
+'searchsuggest-search' => 'Maghanap',
+'searchsuggest-containing' => 'naglalaman ng ...',
+
 # API errors
 'api-error-badaccess-groups' => 'Hindi ka pinapayagang makapagkarga ng mga talaksan papunta sa wiking ito.',
 'api-error-badtoken' => 'Panloob na kamalian: masamang kahalip.',
index e68c60b..c56158e 100644 (file)
@@ -71,7 +71,6 @@ $magicWords = array(
        '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' ),
@@ -254,7 +253,7 @@ $messages = array(
 'cancel' => 'Ләғв кардеј',
 'moredotdotdot' => 'Веј...',
 'mypage' => 'Чымы сәһифә',
-'mytalk' => 'ЧÑ\8bмÑ\8b Ð¼Ñ\8bзокиÑ\80Ó\99 Ñ\81Ó\99һиÑ\84Ó\99',
+'mytalk' => 'Ð\9cÑ\8bзокиÑ\80он',
 'anontalk' => 'Бо ын IP-унвони мызокирә',
 'navigation' => 'Навигасијә',
 'and' => '&#32;ијән',
@@ -264,7 +263,6 @@ $messages = array(
 'qbbrowse' => 'Дијә кардеј',
 'qbedit' => 'Сәрост кардеј',
 'qbpageoptions' => 'Ым сәһифә',
-'qbpageinfo' => 'Мәзмун.',
 'qbmyoptions' => 'Чымы сәһифон',
 'qbspecialpages' => 'Хысусијә сәһифон',
 'faq' => 'РАП',
@@ -488,6 +486,7 @@ $messages = array(
 'savearticle' => 'Сәһифә огәтеј',
 'preview' => 'Сыфтәнә нишо дој',
 'showpreview' => 'Сыфтәнә нишо дој',
+'showlivepreview' => 'Товинә сыфтәнә нишо дој',
 'showdiff' => 'Дәғандә быә дәгишон',
 'anoneditwarning' => "'''Дығғәт.''' Шымә ыштәни едәштәнијоне системәдә.
 Шымә IP-унвон бә ым сәһифә дәгишон тарых ғејд бәбе.",
@@ -779,7 +778,7 @@ $messages = array(
 
 # Watchlist
 'watchlist' => 'Чымы ноғо доә сијоһи',
-'mywatchlist' => 'Чымы ноғо доә сијоһи',
+'mywatchlist' => 'Чәшәвәно кардә сијоһи',
 'watchlistfor2' => 'Бо $1 $2',
 'watch' => 'Думотоно егыниеј',
 'unwatch' => 'Думотоно ныегыниеј',
@@ -816,7 +815,7 @@ $messages = array(
 # Contributions
 'contributions' => 'Иштирокәкә гәнҹ',
 'contributions-title' => 'Иштирокәкә гәнҹ $1',
-'mycontris' => 'ЧÑ\8bмÑ\8b Ð³әнҹ',
+'mycontris' => 'Ð\93әнҹ',
 'contribsub2' => 'Гәнҹ $1 ($2)',
 'uctop' => '(охонәни)',
 'month' => 'Че мангику (һәнијән рә):',
@@ -847,7 +846,7 @@ $messages = array(
 'whatlinkshere-hideredirs' => '$1 бә тожә унвон вығандеј',
 'whatlinkshere-hidetrans' => '$1 әловон',
 'whatlinkshere-hidelinks' => '$1 сәбонон',
-'whatlinkshere-hideimages' => '$1 Ñ\81Ó\99бонон Ð±Ð¾ Ñ\88икилон',
+'whatlinkshere-hideimages' => '$1 Ñ\84аÑ\98линÓ\99 Ñ\81Ó\99бонон',
 'whatlinkshere-filters' => 'Филтрон',
 
 # Block/unblock
@@ -946,6 +945,7 @@ $messages = array(
 
 # Info page
 'pageinfo-header-edits' => 'Дәгиш кардә быә чијон тарых',
+'pageinfo-redirects-value' => '$1',
 
 # Browsing diffs
 'previousdiff' => '← Навынәни дәгиши',
index ff23e81..cebf739 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'Tshipi',
-'monday'        => 'Mosupologo',
-'tuesday'       => 'Labobedi',
-'wednesday'     => 'Laboraro',
-'thursday'      => 'Labone',
-'friday'        => 'Labotlhano',
-'saturday'      => 'Matlhatso',
-'january'       => 'Firikgong',
-'february'      => 'Tlhakole',
-'march'         => 'Mopitlo',
-'april'         => 'Moranang',
-'may_long'      => 'Motsheganong',
-'june'          => 'Seetebosigo',
-'july'          => 'Phukwi',
-'august'        => 'Phatwe',
-'september'     => 'Lwetse',
-'october'       => 'Phalane',
-'november'      => 'Ngwanatsele',
-'december'      => 'Sedimonthole',
-'january-gen'   => 'Firikgong',
-'february-gen'  => 'Tlhakole',
-'march-gen'     => 'Mopitlo',
-'april-gen'     => 'Moranang',
-'may-gen'       => 'Motsheganong',
-'june-gen'      => 'Seetebosigo',
-'july-gen'      => 'Phukwi',
-'august-gen'    => 'Phatwe',
+'sunday' => 'Tshipi',
+'monday' => 'Mosupologo',
+'tuesday' => 'Labobedi',
+'wednesday' => 'Laboraro',
+'thursday' => 'Labone',
+'friday' => 'Labotlhano',
+'saturday' => 'Matlhatso',
+'january' => 'Firikgong',
+'february' => 'Tlhakole',
+'march' => 'Mopitlo',
+'april' => 'Moranang',
+'may_long' => 'Motsheganong',
+'june' => 'Seetebosigo',
+'july' => 'Phukwi',
+'august' => 'Phatwe',
+'september' => 'Lwetse',
+'october' => 'Phalane',
+'november' => 'Ngwanatsele',
+'december' => 'Sedimonthole',
+'january-gen' => 'Firikgong',
+'february-gen' => 'Tlhakole',
+'march-gen' => 'Mopitlo',
+'april-gen' => 'Moranang',
+'may-gen' => 'Motsheganong',
+'june-gen' => 'Seetebosigo',
+'july-gen' => 'Phukwi',
+'august-gen' => 'Phatwe',
 'september-gen' => 'Lwetse',
-'october-gen'   => 'Phalane',
-'november-gen'  => 'Ngwanatsele',
-'december-gen'  => 'Sedimonthole',
+'october-gen' => 'Phalane',
+'november-gen' => 'Ngwanatsele',
+'december-gen' => 'Sedimonthole',
 
-'cancel'     => 'Sutlha',
-'mytalk'     => 'Puo yame',
+'cancel' => 'Sutlha',
+'mytalk' => 'Puo yame',
 'navigation' => 'Tsweletso',
 
-'help'             => 'Thuso',
-'search'           => 'Senka',
-'searchbutton'     => 'Senka',
-'go'               => 'Tsamaya',
-'searcharticle'    => 'Tsamaya',
-'history_short'    => 'Ditso',
+'help' => 'Thuso',
+'search' => 'Senka',
+'searchbutton' => 'Senka',
+'go' => 'Tsamaya',
+'searcharticle' => 'Tsamaya',
+'history_short' => 'Ditso',
 'printableversion' => 'Mokwalo o o ka gatisiwang motlhofo',
-'permalink'        => 'Kgolagano ya sennelaruri',
-'edit'             => 'Baakanya',
-'delete'           => 'Sutlha',
-'protect'          => 'Sireletsa',
-'talk'             => 'Puisano',
-'toolbox'          => 'Lebokoso la dithulusu',
-'otherlanguages'   => 'Ka dipuo di sele',
+'permalink' => 'Kgolagano ya sennelaruri',
+'edit' => 'Baakanya',
+'delete' => 'Sutlha',
+'protect' => 'Sireletsa',
+'talk' => 'Puisano',
+'toolbox' => 'Lebokoso la dithulusu',
+'otherlanguages' => 'Ka dipuo di sele',
 
 # 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).
-'currentevents'        => 'Ditiragalo tsa sešeng',
-'disclaimers'          => 'Tlhapa diatla',
-'edithelp'             => 'Thuso ya go fetola',
-'mainpage'             => 'Tsebe ya konokono',
+'currentevents' => 'Ditiragalo tsa sešeng',
+'disclaimers' => 'Tlhapa diatla',
+'edithelp' => 'Thuso ya go fetola',
+'mainpage' => 'Tsebe ya konokono',
 'mainpage-description' => 'Tsebe ya konokono',
-'portal'               => 'Patlelo ya setšhaba',
-'portal-url'           => 'Project:Patlelo ya setšhaba',
-'privacy'              => 'Melawana ya sephiri',
+'portal' => 'Patlelo ya setšhaba',
+'portal-url' => 'Project:Patlelo ya setšhaba',
+'privacy' => 'Melawana ya sephiri',
 
-'youhavenewmessages'      => 'O na le $1 ($2).',
-'newmessageslink'         => 'molaetsa o moša',
+'youhavenewmessages' => 'O na le $1 ($2).',
+'newmessageslink' => 'molaetsa o moša',
 'youhavenewmessagesmulti' => 'O na le molaetsa o moša mo $1',
-'editsection'             => 'baakanya',
-'editold'                 => 'baakanya',
+'editsection' => 'baakanya',
+'editold' => 'baakanya',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Mokwalo',
+'nstab-main' => 'Mokwalo',
 'nstab-mediawiki' => 'Molaetsa',
 
 # General errors
 'viewsource' => 'Lebelela motswedi',
 
 # Login and logout pages
-'welcomecreation'    => '== Amogelesega, $1! ==
+'welcomecreation' => '== Amogelesega, $1! ==
 
 O ipuletse akhaonte. O seka wa lebala go fetola tse o di dikgatlhegelo tsa gago tsa {{SITENAME}}.',
-'yourname'           => 'Leina la modirisi:',
-'yourpassword'       => 'Selotlolo sa sephiri:',
-'yourpasswordagain'  => 'Kwala selotlolo sa gago sa sephiri gape:',
+'yourname' => 'Leina la modirisi:',
+'yourpassword' => 'Selotlolo sa sephiri:',
+'yourpasswordagain' => 'Kwala selotlolo sa gago sa sephiri gape:',
 'remembermypassword' => 'Gakologelwa ikwadiso yame mo khompiutareng e (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'              => 'Ikwadise',
-'userlogin'          => 'Ikwadise / ipulela tsebe',
-'logout'             => 'Tswala',
-'userlogout'         => 'Tswala',
-'notloggedin'        => 'Ga o a ikwadisa',
-'createaccount'      => 'Ipulela tsebe',
+'login' => 'Ikwadise',
+'userlogin' => 'Ikwadise / ipulela tsebe',
+'logout' => 'Tswala',
+'userlogout' => 'Tswala',
+'notloggedin' => 'Ga o a ikwadisa',
+'createaccount' => 'Ipulela tsebe',
 
 # Edit pages
-'summary'     => 'Tshoboko:',
-'minoredit'   => 'Se ke paakanyo e potlana',
-'watchthis'   => 'Lebelela tsebe e',
+'summary' => 'Tshoboko:',
+'minoredit' => 'Se ke paakanyo e potlana',
+'watchthis' => 'Lebelela tsebe e',
 'savearticle' => 'Boloka tsebe',
 'showpreview' => 'Supa gore go tlaa lebega jang',
-'showdiff'    => 'Supa diphetogo',
+'showdiff' => 'Supa diphetogo',
 
 # History pages
-'currentrev'          => 'Dipaakanyo tsa sešeng',
+'currentrev' => 'Dipaakanyo tsa sešeng',
 'currentrevisionlink' => 'Dipaakanyo tsa sešeng',
 
 # Preferences page
 'mypreferences' => 'Dikgatlhegelo tsa me',
-'youremail'     => 'E-mail:',
-'username'      => 'Leina la modirisi:',
+'youremail' => 'E-mail:',
+'username' => 'Leina la modirisi:',
 
 # Recent changes
 'recentchanges' => 'Diphetogo tsa sešeng',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Diphetogo tse di tsamaelanang',
-'recentchangeslinked-feed'    => 'Diphetogo tse di tsamaelanang',
+'recentchangeslinked' => 'Diphetogo tse di tsamaelanang',
+'recentchangeslinked-feed' => 'Diphetogo tse di tsamaelanang',
 'recentchangeslinked-toolbox' => 'Diphetogo tse di tsamaelanang',
 
 # Upload
-'upload'          => 'Tsenya mokwalo o o tswang kwantle',
-'uploadbtn'       => 'Tsenya mokwalo o o tswang kwantle',
+'upload' => 'Tsenya mokwalo o o tswang kwantle',
+'uploadbtn' => 'Tsenya mokwalo o o tswang kwantle',
 'watchthisupload' => 'Lebelela tsebe e',
 
 # Random page
 'randompage' => 'Tsebe e e sa tlhomamang',
 
 # Miscellaneous special pages
-'move'         => 'Suta',
+'move' => 'Suta',
 'movethispage' => 'Sutisa tsebe e',
 
 # Watchlist
-'mywatchlist'   => 'Mafoko a ke a etseng tlhoko',
-'watchnologin'  => 'Ga o a ikwadisa',
-'watch'         => 'Lebelela',
+'mywatchlist' => 'Mafoko a ke a etseng tlhoko',
+'watchnologin' => 'Ga o a ikwadisa',
+'watch' => 'Lebelela',
 'watchthispage' => 'Lebelela tsebe e',
 
 # Protect
@@ -159,11 +159,11 @@ O ipuletse akhaonte. O seka wa lebala go fetola tse o di dikgatlhegelo tsa gago
 
 # Move page
 'move-page-legend' => 'Sutisa tsebe',
-'movearticle'      => 'Sutisa tsebe:',
-'movenologin'      => 'Ga o a ikwadisa',
-'movepagebtn'      => 'Sutisa tsebe',
-'movedto'          => 'sutela kwa',
-'movereason'       => 'Lebaka:',
+'movearticle' => 'Sutisa tsebe:',
+'movenologin' => 'Ga o a ikwadisa',
+'movepagebtn' => 'Sutisa tsebe',
+'movedto' => 'sutela kwa',
+'movereason' => 'Lebaka:',
 
 # Namespace 8 related
 'allmessages' => 'Melaetsa ya maranyane',
index 37356a3..e9d1752 100644 (file)
@@ -262,9 +262,6 @@ For translations, please consider using [//translatewiki.net/wiki/Main_Page?setl
 
 E lava te ke hoko atu ʻo ngāueʻaki he {{SITENAME}} tatau mo e ʻetita taʻehingoa, pe te ke kau-ki-ai mo e hingoa tatau pe hingoa kehe.
 Tokanga, mahalo pē ʻe ʻi ai ha ngaahi peesi ʻoku ʻasi ko koe kei kau-ki-ai aʻu ki he taimi te ke fakaʻatā ʻa e fafaʻo fakapalausa.",
-'welcomecreation' => '== Tali fiefia, $1! ==
-
-Kuo fakatupu hoʻo tohi kau-ki-ai. ʻOua ʻe ngalo ke liliu hoʻo faʻiteliha {{SITENAME}}.',
 'yourname' => 'Hingoa ʻetita',
 'yourpassword' => 'Leatapu',
 'yourpasswordagain' => 'Toe ʻai leatapu',
@@ -438,8 +435,6 @@ Ko e ʻuhinga loka ko e $1 ia.",
 'viewprevnext' => 'Vakai ki he ($1 {{int:pipe-separator}} $2) ($3).',
 'search-suggest' => 'Mahalo pē naʻa ke fiemaʻu: $1',
 'search-interwiki-more' => '(lahi ange)',
-'search-mwsuggest-enabled' => 'mo e fokotuʻu atu',
-'search-mwsuggest-disabled' => 'taʻe fokotuʻu atu',
 'showingresults' => "ʻOku ʻasi ʻi lalo ʻa e ngaahi fua ʻoku kamata mo e #'''$2''' (aʻu ki he '''$1''').",
 'showingresultsnum' => "ʻOku ʻasi ʻi lalo ha fua ʻe '''$3''', ʻoku kamata mo e #'''$2'''.",
 'nonefound' => "Ko e ngaahi kumi naʻe ʻikai ke siaʻa. Mahalo pē te ke fiefeinga kumi ʻi he ngaahi vā hingoa kotoa (kupu, alea, sīpinga, mo e hā fua). Tānaki ''all:'' ʻi muʻa ʻo hoʻo fehuʻi.",
@@ -783,10 +778,6 @@ Kapau ʻaho ʻe taha, te ke fietoʻo ʻa e pēsí mei hoʻo hokohoko leʻo, lomi
 'watching' => 'ʻOku leʻo...',
 'unwatching' => 'ʻOku taʻeleʻo...',
 
-'enotif_newpagetext' => 'Ko e peesi foʻou ia.',
-'changed' => 'ʻosi liliu',
-'created' => 'kuo fakatupu',
-
 # Delete
 'deletepage' => 'Tāmateʻi peesi',
 'confirm' => 'Fakamoʻoniʻi',
index 1169a4d..2982ae2 100644 (file)
 
 $messages = array(
 # Dates
-'january'   => 'tenpo mun pi nanpa wan',
-'february'  => 'tenpo mun pi nanpa tu',
-'march'     => 'tenpo mun pi nanpa tu wan',
-'april'     => 'tenpo mun pi nanpa tu tu',
-'may_long'  => 'tenpo mun pi nanpa luka',
-'june'      => 'tenpo mun pi nanpa luka wan',
-'july'      => 'tenpo mun pi nanpa luka tu',
-'august'    => 'tenpo mun pi nanpa luka tu wan',
+'january' => 'tenpo mun pi nanpa wan',
+'february' => 'tenpo mun pi nanpa tu',
+'march' => 'tenpo mun pi nanpa tu wan',
+'april' => 'tenpo mun pi nanpa tu tu',
+'may_long' => 'tenpo mun pi nanpa luka',
+'june' => 'tenpo mun pi nanpa luka wan',
+'july' => 'tenpo mun pi nanpa luka tu',
+'august' => 'tenpo mun pi nanpa luka tu wan',
 'september' => 'tenpo mun pi nanpa luka tu tu',
-'october'   => 'tenpo mun pi nanpa luka luka',
-'november'  => 'tenpo mun pi nanpa luka luka wan',
-'december'  => 'tenpo mun pi nanpa luka luka tu',
+'october' => 'tenpo mun pi nanpa luka luka',
+'november' => 'tenpo mun pi nanpa luka luka wan',
+'december' => 'tenpo mun pi nanpa luka luka tu',
 
 # Categories related messages
-'category_header'        => 'lipu lon kulupu lipu "$1"',
-'subcategories'          => 'kulupu lipu lili',
+'category_header' => 'lipu lon kulupu lipu "$1"',
+'subcategories' => 'kulupu lipu lili',
 'listingcontinuesabbrev' => ' li awen',
 
-'article'    => 'lipu sona',
-'newwindow'  => '(ona li open e lupa sin)',
-'cancel'     => 'ike',
-'mytalk'     => 'toki mi',
+'article' => 'lipu sona',
+'newwindow' => '(ona li open e lupa sin)',
+'cancel' => 'ike',
+'mytalk' => 'toki mi',
 'navigation' => 'lipu suli',
 
-'help'              => 'mi sona ala',
-'search'            => 'o lukin jo',
-'go'                => 'o tawa',
-'history'           => 'o lukin e lipu ni pi tenpo pini',
-'history_short'     => 'lipu ni pi tenpo pini',
-'printableversion'  => 'lipu ni o kama lipu len',
-'permalink'         => 'nimi open kiwen',
-'edit'              => 'o ante',
-'editthispage'      => 'o ante e lipu ni',
-'delete'            => 'o weka',
-'deletethispage'    => 'o weka e lipu ni',
-'protect'           => 'mi taso o ken ante',
-'protectthispage'   => 'mi taso o ken ante e lipu ni',
-'unprotect'         => 'jan ali o ken ante',
+'help' => 'mi sona ala',
+'search' => 'o lukin jo',
+'go' => 'o tawa',
+'history' => 'o lukin e lipu ni pi tenpo pini',
+'history_short' => 'lipu ni pi tenpo pini',
+'printableversion' => 'lipu ni o kama lipu len',
+'permalink' => 'nimi open kiwen',
+'edit' => 'o ante',
+'editthispage' => 'o ante e lipu ni',
+'delete' => 'o weka',
+'deletethispage' => 'o weka e lipu ni',
+'protect' => 'mi taso o ken ante',
+'protectthispage' => 'mi taso o ken ante e lipu ni',
+'unprotect' => 'jan ali o ken ante',
 'unprotectthispage' => 'jan ale o ken ante e lipu ni',
-'talkpage'          => 'Talk page',
-'specialpage'       => 'lipu suli',
-'talk'              => 'o toki',
-'toolbox'           => 'ilo',
-'otherlanguages'    => 'toki ante',
-'redirectedfrom'    => '(tan $1)',
+'talkpage' => 'Talk page',
+'specialpage' => 'lipu suli',
+'talk' => 'o toki',
+'toolbox' => 'ilo',
+'otherlanguages' => 'toki ante',
+'redirectedfrom' => '(tan $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'            => 'lipu sona pi toki pona li seme?',
-'aboutpage'            => 'Project:lipu sona pi toki pona li seme?',
-'copyright'            => 'lipu ken $1 li lawa e lipu ni.',
-'currentevents'        => 'seme li sin lon ma?',
-'disclaimers'          => 'wile ala',
-'edithelp'             => 'mi sona ala e ante',
-'mainpage'             => 'lipu lawa',
+'aboutsite' => 'lipu sona pi toki pona li seme?',
+'aboutpage' => 'Project:lipu sona pi toki pona li seme?',
+'copyright' => 'lipu ken $1 li lawa e lipu ni.',
+'currentevents' => 'seme li sin lon ma?',
+'disclaimers' => 'wile ala',
+'edithelp' => 'mi sona ala e ante',
+'mainpage' => 'lipu lawa',
 'mainpage-description' => 'lipu lawa',
-'portal'               => 'lipu pi kulupu ni',
-'privacy'              => 'ken pi awen weka',
+'portal' => 'lipu pi kulupu ni',
+'privacy' => 'ken pi awen weka',
 
-'ok'            => 'pona',
+'ok' => 'pona',
 'retrievedfrom' => 'tan $1',
-'editsection'   => 'o ante',
-'toc'           => 'poki lawa',
-'showtoc'       => 'o suli e poki ni.',
-'hidetoc'       => 'o lili e poki ni',
+'editsection' => 'o ante',
+'toc' => 'poki lawa',
+'showtoc' => 'o suli e poki ni.',
+'hidetoc' => 'o lili e poki ni',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'lipu sona',
-'nstab-user'      => 'lipu jan',
-'nstab-special'   => 'suli',
-'nstab-image'     => 'lipu nanpa',
+'nstab-main' => 'lipu sona',
+'nstab-user' => 'lipu jan',
+'nstab-special' => 'suli',
+'nstab-image' => 'lipu nanpa',
 'nstab-mediawiki' => 'nimi',
-'nstab-template'  => 'lipu mama',
-'nstab-help'      => 'pana pona',
-'nstab-category'  => 'kulupu lipu',
+'nstab-template' => 'lipu mama',
+'nstab-help' => 'pana pona',
+'nstab-category' => 'kulupu lipu',
 
 # Login and logout pages
-'logout'     => 'mi o tawa',
+'logout' => 'mi o tawa',
 'userlogout' => 'mi o tawa',
 
 # Edit pages
-'summary'          => 'ante li seme:',
-'minoredit'        => 'ante ni li lili taso',
-'watchthis'        => 'mi wile sona e ante ale pi lipu ni lon tenpo kama',
-'savearticle'      => 'o awen',
-'preview'          => 'lukin taso',
-'showpreview'      => 'mi wile lukin taso e ante',
-'editing'          => 'mi ante e: $1',
-'editingcomment'   => 'mi ante e lipu $1 (wan sin)',
+'summary' => 'ante li seme:',
+'minoredit' => 'ante ni li lili taso',
+'watchthis' => 'mi wile sona e ante ale pi lipu ni lon tenpo kama',
+'savearticle' => 'o awen',
+'preview' => 'lukin taso',
+'showpreview' => 'mi wile lukin taso e ante',
+'editing' => 'mi ante e: $1',
+'editingcomment' => 'mi ante e lipu $1 (wan sin)',
 'copyrightwarning' => "o sona e ni: ken $2 (o lukin e $1) li lawa tawa ante ali lon {{SITENAME}} li. jan li ken ante e toki sina li ken pana e ona tawa jan ante. sina wile ala e ni la, o sitelen ala lon lipu ni.<br />
 kin la sina toki e ni: toki sina ni li tan sina taso anu lipu pi ken ali.
 '''SINA KEN ALA LA, O PANA ALA E TOKI PI KEN LILI TAWA LIPU NI!'''",
-'templatesused'    => '{{PLURAL:$1|Template|Templates}} used on this page:',
+'templatesused' => '{{PLURAL:$1|Template|Templates}} used on this page:',
 
 # History pages
 'histfirst' => 'pini taso',
-'histlast'  => 'sin taso',
+'histlast' => 'sin taso',
 
 # Search results
-'prevn'        => 'nanpa {{PLURAL:$1|$1}} pini',
-'nextn'        => 'nanpa {{PLURAL:$1|$1}} kama',
+'prevn' => 'nanpa {{PLURAL:$1|$1}} pini',
+'nextn' => 'nanpa {{PLURAL:$1|$1}} kama',
 'viewprevnext' => 'o lukin e ($1 {{int:pipe-separator}} $2) ($3).',
 
 # Preferences page
 'preferences' => 'seme li pona tawa mi',
 
 # Recent changes
-'recentchanges'   => 'lipu seme li ante?',
+'recentchanges' => 'lipu seme li ante?',
 'minoreditletter' => 'ante lili',
-'newpageletter'   => 'lipu sin',
+'newpageletter' => 'lipu sin',
 
 # Recent changes linked
-'recentchangeslinked'         => 'ante sama',
-'recentchangeslinked-feed'    => 'ante sama',
+'recentchangeslinked' => 'ante sama',
+'recentchangeslinked-feed' => 'ante sama',
 'recentchangeslinked-toolbox' => 'ante sama',
 
 # Upload
-'upload'            => 'o pana e lipu nanpa',
-'filedesc'          => 'ante li seme',
+'upload' => 'o pana e lipu nanpa',
+'filedesc' => 'ante li seme',
 'fileuploadsummary' => 'ante li seme:',
 
 # File description page
@@ -139,8 +139,8 @@ kin la sina toki e ni: toki sina ni li tan sina taso anu lipu pi ken ali.
 'randompage' => 'mi wile lukin e lipu ante',
 
 # Miscellaneous special pages
-'lonelypages'  => 'lipu ni li jo ala e lipu sama',
-'move'         => 'o tawa',
+'lonelypages' => 'lipu ni li jo ala e lipu sama',
+'move' => 'o tawa',
 'movethispage' => 'o pana e nimi sin',
 
 # Special:AllPages
@@ -150,11 +150,11 @@ kin la sina toki e ni: toki sina ni li tan sina taso anu lipu pi ken ali.
 'categories' => 'kulupu lipu',
 
 # Watchlist
-'watchlist'       => 'mi sona e ante pi lipu seme',
-'watch'           => 'o sona e ante',
-'watchthispage'   => 'mi wile sona e ante ale pi lipu ni lon tenpo kama',
+'watchlist' => 'mi sona e ante pi lipu seme',
+'watch' => 'o sona e ante',
+'watchthispage' => 'mi wile sona e ante ale pi lipu ni lon tenpo kama',
 'unwatchthispage' => 'mi wile ala sona e ante ale pi lipu ni lon tenpo kama',
-'watchnochange'   => 'None of your watched items was edited in the time period displayed.',
+'watchnochange' => 'None of your watched items was edited in the time period displayed.',
 
 # Contributions
 'mycontris' => 'mi ante e lipu seme',
index 216ac48..4126a24 100644 (file)
@@ -388,8 +388,6 @@ Na tu yu tok tru nau olsem yu raitim dispela yu yet, o yu kisim long wanpela hap
 'search-suggest' => 'Yu laik tok: $1',
 'search-interwiki-default' => '$1 ol painim:',
 'search-interwiki-more' => '(moa)',
-'search-mwsuggest-enabled' => 'halivim mi',
-'search-mwsuggest-disabled' => 'nogat halivim mi',
 'searchall' => 'olgeta',
 'powersearch' => 'Mobeta Painim',
 'powersearch-legend' => 'Mobeta Painim',
@@ -655,11 +653,7 @@ Sapos yu laik rausim dispela pes long lukautbuk bilong yu bihain, paitim \"Pinis
 'unwatching' => 'Wet liklik, i raus nau long lukautbuk...',
 
 'enotif_reset' => 'Makim olgeta pes olsem mi lukim pinis',
-'enotif_newpagetext' => 'Dispela emi nupela pes.',
 'enotif_impersonal_salutation' => 'yusa long {{SITENAME}}',
-'changed' => 'i senisim',
-'created' => 'i kirapim',
-'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED pes $PAGETITLE long {{SITENAME}}',
 'enotif_anon_editor' => 'IP yusa $1',
 
 # Delete
@@ -887,4 +881,7 @@ Yu inap lukim as tok bilong em',
 # HTML forms
 'htmlform-selectorother-other' => 'Narapela',
 
+# Search suggestions
+'searchsuggest-search' => 'Painim',
+
 );
index 6aaa52e..18801e4 100644 (file)
@@ -9,6 +9,7 @@
  *
  * @author 82-145
  * @author Bekiroflaz
+ * @author BetelgeuSeginus
  * @author Bilalokms
  * @author Bombola
  * @author Cekli829
@@ -21,6 +22,7 @@
  * @author Goktr001
  * @author Hanberke
  * @author Hcagri
+ * @author Hedda Gabler
  * @author Ijon
  * @author Incelemeelemani
  * @author Joseph
@@ -54,7 +56,7 @@
  */
 
 $namespaceNames = array(
-       NS_MEDIA            => 'Medya',
+       NS_MEDIA            => 'Ortam',
        NS_SPECIAL          => 'Özel',
        NS_TALK             => 'Tartışma',
        NS_USER             => 'Kullanıcı',
@@ -73,9 +75,10 @@ $namespaceNames = array(
 );
 
 $namespaceAliases = array(
-       'Resim' => NS_FILE,
-       'Resim_tartışma' => NS_FILE_TALK,
-       'MedyaViki' => NS_MEDIAWIKI,
+       'Medya'              => NS_MEDIA,
+       'Resim'              => NS_FILE,
+       'Resim_tartışma'     => NS_FILE_TALK,
+       'MedyaViki'          => NS_MEDIAWIKI,
        'MedyaViki_tartışma' => NS_MEDIAWIKI_TALK,
 );
 
@@ -91,7 +94,8 @@ $specialPageAliases = array(
        'Booksources'               => array( 'KitapKaynakları' ),
        'BrokenRedirects'           => array( 'BozukYönlendirmeler' ),
        'Categories'                => array( 'Kategoriler', 'Ulamlar' ),
-       'ChangePassword'            => array( 'ŞifreDeğiştir', 'ParolaDeğiştir', 'ŞifreSıfırla', 'ParolaSıfırla' ),
+       'ChangeEmail'               => array( 'E-postaDeğiştir' ),
+       'ChangePassword'            => array( 'ParolaDeğiştir', 'ParolaSıfırla' ),
        'ComparePages'              => array( 'SayfaKarşılaştır' ),
        'Confirmemail'              => array( 'E-postaDoğrula' ),
        'Contributions'             => array( 'Katkılar' ),
@@ -108,6 +112,7 @@ $specialPageAliases = array(
        'Filepath'                  => array( 'DosyaYolu', 'DosyaKonumu' ),
        'Import'                    => array( 'İçeAktar', 'İçeriAktar' ),
        'Invalidateemail'           => array( 'E-postaDoğrulamaİptal' ),
+       'JavaScriptTest'            => array( 'JavaScriptTesti' ),
        'BlockList'                 => array( 'EngelListesi', 'IPEngelListesi', 'EngelListele' ),
        'LinkSearch'                => array( 'BağArama', 'BağlantıArama' ),
        'Listadmins'                => array( 'HizmetliListele', 'YöneticiListele', 'HizmetliListesi', 'YöneticiListesi' ),
@@ -124,6 +129,7 @@ $specialPageAliases = array(
        'MIMEsearch'                => array( 'MIMEArama' ),
        'Mostcategories'            => array( 'EnFazlaKategorili' ),
        'Mostimages'                => array( 'EnÇokBağlantıVerilenDosyalar' ),
+       'Mostinterwikis'            => array( 'EnFazlaİnterviki' ),
        'Mostlinked'                => array( 'EnÇokBağlantıVerilenSayfalar' ),
        'Mostlinkedcategories'      => array( 'EnÇokBağlantıVerilenKategoriler' ),
        'Mostlinkedtemplates'       => array( 'EnÇokBağlantıVerilenŞablonlar' ),
@@ -147,7 +153,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'SonDeğişiklikler' ),
        'Recentchangeslinked'       => array( 'İlgiliDeğişiklikler' ),
        'Revisiondelete'            => array( 'RevizyonSil' ),
-       'RevisionMove'              => array( 'RevizyonTaşı' ),
        'Search'                    => array( 'Ara', 'Arama' ),
        'Shortpages'                => array( 'KısaSayfalar' ),
        'Specialpages'              => array( 'ÖzelSayfalar' ),
@@ -165,10 +170,11 @@ $specialPageAliases = array(
        'Unusedtemplates'           => array( 'KullanılmayanŞablonlar' ),
        'Unwatchedpages'            => array( 'İzlenmeyenSayfalar' ),
        'Upload'                    => array( 'Yükle' ),
+       'UploadStash'               => array( 'ZulaYükle', 'ZulaYükleme' ),
        'Userlogin'                 => array( 'KullanıcıOturumuAçma', 'KullanıcıGiriş' ),
        'Userlogout'                => array( 'KullanıcıOturumuKapatma', 'KullanıcıÇıkış' ),
        'Userrights'                => array( 'KullanıcıHakları' ),
-       'Version'                   => array( 'Sürüm' ),
+       'Version'                   => array( 'Sürüm', 'Versiyon' ),
        'Wantedcategories'          => array( 'İstenenKategoriler' ),
        'Wantedfiles'               => array( 'İstenenDosyalar' ),
        'Wantedpages'               => array( 'İstenenSayfalar' ),
@@ -185,11 +191,10 @@ $magicWords = array(
        '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' ),
+       'currentmonthnamegen'       => array( '1', 'MEVCUTAYADIİYELİK', 'GÜNCELAYADIİ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' ),
@@ -219,6 +224,7 @@ $magicWords = array(
        'pagenamee'                 => array( '1', 'SAYFAADIU', 'PAGENAMEE' ),
        'namespace'                 => array( '1', 'ADALANI', 'İSİMALANI', 'NAMESPACE' ),
        'namespacee'                => array( '1', 'ADALANIU', 'İSİMALANIU', 'NAMESPACEE' ),
+       'namespacenumber'           => array( '1', 'ADALANINUMARASI', 'NAMESPACENUMBER' ),
        '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' ),
@@ -234,9 +240,9 @@ $magicWords = array(
        '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:' ),
+       'subst'                     => array( '0', 'YK:', 'YERİNEKOY:', 'KOPYALA:', 'AKTAR:', 'YAPIŞTIR:', 'SUBST:' ),
+       'safesubst'                 => array( '0', 'GÜVENLİYERİNEKOY:', 'GÜVENLİKOPYALA:', 'GÜVENLİAKTAR:', 'GÜVENLİYAPIŞTIR:', 'SAFESUBST:' ),
+       'msgnw'                     => array( '0', 'MSJYN:', 'İLTYN:', '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' ),
@@ -258,18 +264,20 @@ $magicWords = array(
        'img_bottom'                => array( '1', 'taban', 'bottom' ),
        'img_text_bottom'           => array( '1', 'metin-taban', 'text-bottom' ),
        'img_link'                  => array( '1', 'bağlantı=$1', 'link=$1' ),
+       'img_class'                 => array( '1', 'sınıf=$1', 'class=$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:' ),
+       'articlepath'               => array( '0', 'MADDEYOLU', 'ARTICLEPATH' ),
        '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:' ),
+       'grammar'                   => array( '0', 'DİLBİLGİSİ:', '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__' ),
@@ -281,13 +289,15 @@ $magicWords = array(
        'revisionday'               => array( '1', 'SÜRÜMGÜNÜ', 'REVISIONDAY' ),
        'revisionday2'              => array( '1', 'SÜRÜMGÜNÜ2', 'REVISIONDAY2' ),
        'revisionmonth'             => array( '1', 'SÜRÜMAYI', 'REVISIONMONTH' ),
+       'revisionmonth1'            => array( '1', 'SÜRÜMAYI1', 'REVISIONMONTH1' ),
        '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:' ),
+       'canonicalurl'              => array( '0', 'KURALLIURL:', 'CANONICALURL:' ),
+       'canonicalurle'             => array( '0', 'KURALLIURLU:', 'CANONICALURLE:' ),
        'lcfirst'                   => array( '0', 'KHİLK:', 'LCFIRST:' ),
        'ucfirst'                   => array( '0', 'BHİLK:', 'UCFIRST:' ),
        'lc'                        => array( '0', 'KH:', 'LC:' ),
@@ -297,15 +307,22 @@ $magicWords = array(
        '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' ),
+       'urlencode'                 => array( '0', 'URLKODLAMA:', 'URLENCODE:' ),
+       'anchorencode'              => array( '0', 'ÇENGELKODLAMA:', 'ANCHORENCODE' ),
        'currenttimestamp'          => array( '1', 'MEVCUTZAMANBİLGİSİ', 'GÜNCELZAMANBİLGİSİ', 'CURRENTTIMESTAMP' ),
        'localtimestamp'            => array( '1', 'YERELZAMANBİLGİSİ', 'LOCALTIMESTAMP' ),
+       'directionmark'             => array( '1', 'YÖNİŞARETİ:', 'DIRECTIONMARK', 'DIRMARK' ),
        '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' ),
+       'formatnum'                 => array( '0', 'BİÇİMNUM', 'FORMATNUM' ),
+       'padleft'                   => array( '0', 'DOLSOL', 'PADLEFT' ),
+       'padright'                  => array( '0', 'DOLSAĞ', 'PADRIGHT' ),
        'special'                   => array( '0', 'özel', 'special' ),
+       'speciale'                  => array( '0', 'özelu', 'speciale' ),
        'defaultsort'               => array( '1', 'VARSAYILANSIRALA:', 'VARSAYILANSIRALAMAANAHTARI:', 'VARSAYILANKATEGORİSIRALA:', 'DEFAULTSORT:', 'DEFAULTSORTKEY:', 'DEFAULTCATEGORYSORT:' ),
-       'filepath'                  => array( '0', 'DOSYA_YOLU:', 'FILEPATH:' ),
+       'filepath'                  => array( '0', 'DOSYAYOLU:', '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' ),
@@ -315,8 +332,15 @@ $magicWords = array(
        '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' ),
+       'formatdate'                => array( '0', 'biçimtarih', 'tarihbiçimi', 'formattarihi', 'tarihformatı', 'formatdate', 'dateformat' ),
+       'url_path'                  => array( '0', 'YOL', 'PATH' ),
        'url_wiki'                  => array( '0', 'VİKİ', 'WIKI' ),
+       'url_query'                 => array( '0', 'SORGU', 'QUERY' ),
+       'defaultsort_noerror'       => array( '0', 'hatayok', 'hatasız', 'noerror' ),
+       'pagesincategory_all'       => array( '0', 'tüm', 'all' ),
+       'pagesincategory_pages'     => array( '0', 'sayfalar', 'pages' ),
+       'pagesincategory_subcats'   => array( '0', 'altkategoriler', 'subcats' ),
+       'pagesincategory_files'     => array( '0', 'dosyalar', 'files' ),
 );
 
 $separatorTransformTable = array( ',' => '.', '.' => ',' );
@@ -372,7 +396,7 @@ $messages = array(
 
 'underline-always' => 'Daima',
 'underline-never' => 'Asla',
-'underline-default' => 'Tarayıcı varsayılanı',
+'underline-default' => 'Tema ya da tarayıcı varsayılanı',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Düzenleme alanının yazı tipi:',
@@ -457,8 +481,8 @@ $messages = array(
 'newwindow' => '(yeni bir pencerede açılır)',
 'cancel' => 'İptal',
 'moredotdotdot' => 'Daha...',
-'mypage' => 'sayfam',
-'mytalk' => 'Mesaj sayfam',
+'mypage' => 'Sayfa',
+'mytalk' => 'Mesaj',
 'anontalk' => "Bu IP'nin iletileri",
 'navigation' => 'Gezinti',
 'and' => '&#32;ve',
@@ -468,7 +492,6 @@ $messages = array(
 'qbbrowse' => 'Tara',
 'qbedit' => 'Değiştir',
 'qbpageoptions' => 'Bu sayfa',
-'qbpageinfo' => 'Bağlam',
 'qbmyoptions' => 'Sayfalarım',
 'qbspecialpages' => 'Özel sayfalar',
 'faq' => 'SSS',
@@ -481,7 +504,7 @@ $messages = array(
 'vector-action-protect' => 'Koru',
 'vector-action-undelete' => 'Silinmeyi geri al',
 'vector-action-unprotect' => 'Korumayı değiştir',
-'vector-simplesearch-preference' => 'Gelişmiş arama önerilerini getir (Sadece Vector görünümü için)',
+'vector-simplesearch-preference' => 'Gelişmiş arama önerilerini etkinleştir (Sadece Vector görünümü için)',
 'vector-view-create' => 'Oluştur',
 'vector-view-edit' => 'Düzenle',
 'vector-view-history' => 'Geçmişi gör',
@@ -491,8 +514,9 @@ $messages = array(
 'namespaces' => 'Ad alanları',
 'variants' => 'Türevler',
 
+'navigation-heading' => 'Dolaşım menüsü',
 'errorpagetitle' => 'Hata',
-'returnto' => '$1 sayfasına dön.',
+'returnto' => '$1 sayfasına geri dön.',
 'tagline' => '{{SITENAME}} sitesinden',
 'help' => 'Yardım',
 'search' => 'Ara',
@@ -504,7 +528,7 @@ $messages = array(
 'updatedmarker' => 'son ziyaretimden sonra güncellenmiş',
 'printableversion' => 'Yazdırılabilir sürüm',
 'permalink' => 'Kalıcı bağlantı',
-'print' => 'Bastır',
+'print' => 'Yazdır',
 'view' => 'Görüntüle',
 'edit' => 'Düzenle',
 'create' => 'Oluştur',
@@ -588,7 +612,9 @@ $1',
 'youhavenewmessages' => 'Yeni $1 var ($2).',
 'newmessageslink' => 'mesajınız',
 'newmessagesdifflink' => 'son değişiklik',
-'newmessageslinkplural' => 'mesajınız',
+'youhavenewmessagesfromusers' => '{{PLURAL:$3|Başka bir kullanıcıdan|$3 kullanıcıdan}} $1 var. ($2)',
+'youhavenewmessagesmanyusers' => 'Birçok kullanıcıdan $1 var. ($2)',
+'newmessageslinkplural' => '{{PLURAL:$1|yeni mesajınız|yeni mesajlarınız}}',
 'newmessagesdifflinkplural' => 'son {{PLURAL:$1|değişiklik|değişiklikler}}',
 'youhavenewmessagesmulti' => "$1'de yeni mesajınız var.",
 'editsection' => 'düzenle',
@@ -641,7 +667,7 @@ Bu, {{SITENAME}} sitesindeki bir hatayı da belirtebilir.",
 # General errors
 'error' => 'Hata',
 'databaseerror' => 'Veritabanı hatası',
-'dberrortext' => 'Veritabanı sorgu sözdizimi hatası oluştu.
+'dberrortext' => 'Bir veritabanı sorgusu sözdizimi hatası oluştu.
 Bu yazılımdaki bir hatadan kaynaklanabilir.
 "<tt>$2</tt>" işlevinden denenen son sorgulama:
 <blockquote><tt>$1</tt></blockquote>.
@@ -700,8 +726,8 @@ Lütfen birkaç dakika sonra yeniden deneyin.',
 'protectedpagetext' => 'Bu sayfa değişiklik yapılmaması için koruma altına alınmıştır.',
 'viewsourcetext' => 'Bu sayfanın kaynağını görebilir ve kopyalayabilirsiniz:',
 'viewyourtext' => "Bu sayfaya '''yaptığınız değişikliklerin''' kaynağını görünteleyip kopyalayabilirsiniz:",
-'protectedinterface' => 'Bu sayfa yazılım için arayüz metni sağlamaktadır ve kötüye kullanımı önlemek için kilitlenmiştir.',
-'editinginterface' => "'''UYARI:''' Yazılım için arayüz sağlamakta kullanılan bir sayfayı değiştirmektesiniz. Bu sayfadaki değişiklikler kullanıcı arayüzünü diğer kullanıcılar için de değiştirecektir. Çeviriler için, lütfen [//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net]'yi kullanarak MediaWiki yerelleştirme projesini dikkate alınız.",
+'protectedinterface' => "Bu sayfa yazılım için arayüz metni sağlamaktadır ve kötüye kullanımı önlemek için korumaya alınmıştır. Eklemek ya da bütün vikilerdeki çevirileri değiştirmek için lütfen MediaWiki yerelleştirme projesi [//translatewiki.net/ translatewiki.net]'i kullanın.",
+'editinginterface' => "'''UYARI:''' Wiki yazılımı için arayüz sağlamakta kullanılan bir sayfayı değiştirmektesiniz. Bu sayfadaki değişiklikler kullanıcı arayüzünü diğer kullanıcılar için de değiştirecektir. Çeviriler için, lütfen [//translatewiki.net/wiki/Main_Page?setlang=tr translatewiki.net]'yi kullanarak MediaWiki yerelleştirme projesini dikkate alınız.",
 'sqlhidden' => '(SQL gizli sorgu)',
 'cascadeprotected' => 'Bu sayfa değişiklik yapılması engellenmiştir, çünkü  "kademeli" seçeneği aktif hale getirilerek koruma altına alınan {{PLURAL:$1|sayfada|sayfada}} kullanılmaktadır:
 $2',
@@ -723,11 +749,10 @@ Verilen sebep: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Oturumu kapattınız.'''
 
-Ş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]].
+Ş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 <span class='plainlinks'>[$1 yeniden oturum açabilirsiniz]</span>.
 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ı.
+'welcomeuser' => 'Hoş geldin $1!',
+'welcomecreation-msg' => 'Hesabınız açıldı.
 [[Special:Preferences|{{SITENAME}} tercihlerinizi]] değiştirmeyi unutmayın.',
 'yourname' => 'Kullanıcı adı:',
 'yourpassword' => 'Parola:',
@@ -974,9 +999,8 @@ Buraya yanlışlıkla geldiyseniz tarayıcınızın '''geri''' tuşuna tıklayı
 Bu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]],
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları arayabilir],
 ya da bu sayfayı [{{fullurl:{{FULLPAGENAME}}|action=edit}} değiştirebilirsiniz]</span>.',
-'noarticletext-nopermission' => 'Bu sayfa şu anda boştur.
-Bu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]]
-ya da <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz].</span>',
+'noarticletext-nopermission' => 'Bu sayfa şu anda boştur. 
+Bu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]] ya da <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz].</span>',
 'userpage-userdoesnotexist' => '"<nowiki>$1</nowiki>" kullanıcı hesabı kayıtlı değil. Bu sayfayı oluşturmak/değiştirmek istiyorsanız lütfen kontrol edin.',
 'userpage-userdoesnotexist-view' => '"$1" kullanıcı hesabı kayıtlı değil.',
 'blocked-notice-logextract' => 'Bu kullanıcı şuanda engellenmiş.
@@ -985,7 +1009,6 @@ Son engelleme günlüğü girdisi referans için aşağıda sağlanmıştır:',
 * '''Firefox / Safari:''' ''Shift'' tuşuna basılıyken \"Yeniden yükle\"'ye tıklayın ya da \"Ctrl-F5\" ya da ''Ctrl-R'' yapın (Mac için '⌘-R'').
 * '''Google Chrome:''' ''Ctrl-Shift-R'''ye basın. (Mac için ''⌘-Shift-R'')
 * '''Internet Explorer:''' ''Ctrl'' basılıyken ''Yenile'''ye tıklayın ya da ''Ctrl-F5'' yapın.
-* '''Konqueror:''' 'Yeniden yükle'''ye ya da ''F5'''e basın.
 * '''Opera:''' ''Araçlar → Tercihler'''den önbelliği temizleyin.",
 'usercssyoucanpreview' => "'''İpucu:''' Kaydetmeden önce \"{{int:showpreview}}\"e tıklayarak yeni CSSinizi deneyin.",
 'userjsyoucanpreview' => "'''İpucu:''' Kaydetmeden önce \"{{int:showpreview}}\"e tıklayarak yeni JavaScript'inizi test edin.",
@@ -1077,6 +1100,14 @@ Silinmiş görünüyor.',
 'edit-already-exists' => 'Yeni sayfa oluşturulamıyor.
 Sayfa zaten mevcut.',
 'defaultmessagetext' => 'Varsayılan mesaj metni',
+'invalid-content-data' => 'Geçersiz içerik verisi',
+'content-not-allowed-here' => '"$1" içeriğine, [[$2]] sayfasında izin verilmemekte.',
+
+# Content models
+'content-model-wikitext' => 'vikimetin',
+'content-model-text' => 'düz metin',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Uyarı: Bu sayfa çok fazla zengin derleyici fonksiyonu çağrısı içeriyor.
@@ -1092,6 +1123,11 @@ Bu değişkenler atlandı.",
 'parser-template-loop-warning' => 'Şablon düğümü tespit edildi: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Şablon özyineleme yoğunluğu sınırı aşıldı ($1)',
 'language-converter-depth-warning' => 'Dil çevirici derinlik sınırı aşıldı ($1)',
+'node-count-exceeded-category' => 'Düğüm sayısı aşılan sayfalar',
+'node-count-exceeded-warning' => 'Sayfa düğüm sayımı aşıldı',
+'expansion-depth-exceeded-category' => 'Genişleme derinliği aşılan sayfalar',
+'expansion-depth-exceeded-warning' => 'Sayfa genişletme derinliği aşıldı',
+'parser-unstrip-loop-warning' => 'Yineleme döngüsü algılandı',
 
 # "Undo" feature
 'undo-success' => 'Bu değişiklik geri alınabilir. Lütfen aşağıdaki karşılaştırmayı kontrol edin, gerçekten bu değişikliği yapmak istediğinizden emin olun ve sayfayı kaydederek bir önceki değişikliği geriye alın.',
@@ -1223,9 +1259,11 @@ Erişiminiz yok.',
 'revdelete-concurrent-change' => '$2 $1 tarihli öğe değiştirilirken hata: öğenin durumu siz değiştirmeye çalışırken bir başkası tarafından değiştirilmiş görünüyor.
 Lütfen günlükleri kontrol edin.',
 'revdelete-only-restricted' => '$2 $1 tarihli öğe gizlenirken hata: Öğeleri, diğer gizleme seçeneklerinden birini seçmeden, hizmetli görünümden bastıramazsınız.',
-'revdelete-reason-dropdown' => '*Genel silme sebepleri
-** Telif ihlali
-** Uygunsuz kişisel bilgi',
+'revdelete-reason-dropdown' => '*Genel silme nedenleri
+** Telif hakkı ihlali
+** Sakıncalı yorum veya kişisel bilgi 
+** Sakıncalı kullanıcı adı
+** Muhtemel iftira niteliğinde bilgiler',
 'revdelete-otherreason' => 'Diğer/ek sebep:',
 'revdelete-reasonotherlist' => 'Diğer sebep',
 'revdelete-edit-reasonlist' => 'Silme nedenlerini değiştir',
@@ -1270,6 +1308,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-title-multipage' => '"$1" ile "$2" sayfaları arasındaki fark',
 'difference-multipage' => '(Sayfalar arasındaki fark)',
 'lineno' => '$1. satır:',
 'compareselectedversions' => 'Seçilen sürümleri karşılaştır',
@@ -1319,8 +1358,6 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 'search-interwiki-caption' => 'Kardeş projeler',
 'search-interwiki-default' => '$1 sonuçlar:',
 'search-interwiki-more' => '(daha çok)',
-'search-mwsuggest-enabled' => 'önerilerle',
-'search-mwsuggest-disabled' => 'öneri yok',
 'search-relatedarticle' => 'ilgili',
 'mwsuggest-disable' => 'AJAX önerilerini devre dışı bırak',
 'searcheverything-enable' => 'Tüm ad alanlarında ara',
@@ -1354,7 +1391,7 @@ Aramanızın başına '''all:''' önekini ekleyerek tüm içeriği aramayı (tar
 
 # Preferences page
 'preferences' => 'Tercihler',
-'mypreferences' => 'Tercihlerim',
+'mypreferences' => 'Tercihler',
 'prefs-edits' => 'Değişiklik sayısı:',
 'prefsnologin' => 'Oturum açık değil',
 'prefsnologintext' => 'Kullanıcı tercihlerinizi ayarlamak için <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} giriş yapmalısınız]</span>.',
@@ -1417,7 +1454,7 @@ Kullanabileceğiniz rastgele-üretilmiş bir değer: $1',
 'timezoneregion-indian' => 'Hint Okyanusu',
 'timezoneregion-pacific' => 'Pasifik Okyanusu',
 'allowemail' => 'Diğer kullanıcılar bana e-posta atabilsin',
-'prefs-searchoptions' => 'Arama seçenekleri',
+'prefs-searchoptions' => 'Arama',
 'prefs-namespaces' => 'İsim alanları',
 'defaultns' => 'Aksi halde bu ad alanlarında ara:',
 'default' => 'varsayılan',
@@ -1816,9 +1853,15 @@ Eğer sorun tekrarlanırsa, bir [[Special:ListUsers/sysop|hizmetli]] ile temasa
 'upload-http-error' => 'Bir HTTP hatası oluştu: $1',
 
 # File backend
+'backend-fail-stream' => '$1 dosyası okunamadı.',
 'backend-fail-notexists' => '$1 dosyası mevcut değil.',
+'backend-fail-invalidpath' => '"$1" geçerli bir depolama yolu değil.',
 'backend-fail-delete' => '"$1" dosyası silinemedi.',
+'backend-fail-alreadyexists' => '"$1" dosyası zaten mevcut.',
+'backend-fail-copy' => '"$1" dosyası, "$2" dosyasına kopyalanamadı.',
+'backend-fail-move' => '"$1" dosyası, "$2" dosyasına taşınamadı.',
 'backend-fail-opentemp' => 'Geçici dosya açılamadı.',
+'backend-fail-writetemp' => 'Geçici dosya oluşturulamadı.',
 'backend-fail-closetemp' => 'Geçici dosya kapanamadı.',
 'backend-fail-read' => '$1 dosyası okunamadı.',
 'backend-fail-create' => '$1 dosyası yazılamadı.',
@@ -2065,6 +2108,7 @@ Her satırın içerdiği bağlantılar; birinci ve ikinci yönlendirme, ayrıca
 'mostlinkedtemplates' => 'En çok kullanılan şablonlar',
 'mostcategories' => 'En fazla kategoriye bağlanmış sayfalar',
 'mostimages' => 'En çok bağlantı verilmiş dosyalar',
+'mostinterwikis' => "En çok interwiki'ye sahip sayfalar",
 'mostrevisions' => 'En çok değişikliğe uğramış sayfalar',
 'prefixindex' => 'Önek ile tüm sayfalar',
 'shortpages' => 'Kısa sayfalar',
@@ -2136,6 +2180,9 @@ Günlük tipini, kullanıcı adını (büyük-küçük harf duyarlı), ya da etk
 'allpages-bad-ns' => '{{SITENAME}} sitesinde "$1" ad alanı yok.',
 'allpages-hide-redirects' => 'Yönlendirmeleri gizle',
 
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'En son görünüm.',
+
 # Special:Categories
 'categories' => 'Kategoriler',
 'categoriespagetext' => "Aşağıdaki {{PLURAL:$1|kategori|kategoriler}} sayfa veya ortam içerir.
@@ -2203,6 +2250,8 @@ Bireysel haklarla ilgili [[{{MediaWiki:Listgrouprights-helppage}}|daha fazla bil
 'mailnologin' => 'Gönderi adresi yok.',
 'mailnologintext' => 'Diğer kullanıcılara e-posta gönderebilmeniz için [[Special:UserLogin|oturum aç]]malısınız ve [[Special:Preferences|tercihler]] sayfasında geçerli bir e-posta adresiniz olmalı.',
 'emailuser' => 'Bu kullanıcıya e-posta gönder',
+'emailuser-title-target' => 'Bu {{GENDER:$1|kullanıcıya}} e-posta gönder',
+'emailuser-title-notarget' => 'Kullanıcı e-posta',
 'emailpage' => 'Kullanıcıya e-posta gönder',
 'emailpagetext' => 'Bu kullanıcıya e-posta mesajı göndermek için aşağıdaki formu kullanabilirsiniz.
 [[Special:Preferences|Kullanıcı tercihlerinizde]] girdiğiniz e-posta adresiniz, e-postanın "From (Kimden)" adresinde görünecektir, bu yüzden alıcı size direk cevap verebilecektir.',
@@ -2236,7 +2285,7 @@ Bireysel haklarla ilgili [[{{MediaWiki:Listgrouprights-helppage}}|daha fazla bil
 
 # Watchlist
 'watchlist' => 'İzleme listem',
-'mywatchlist' => 'İzleme listem',
+'mywatchlist' => 'İzleme listesi',
 'watchlistfor2' => '$1 için $2',
 'nowatchlist' => 'İzleme listesinde hiçbir madde bulunmuyor.',
 'watchlistanontext' => 'Lütfen izleme listenizdeki maddeleri görmek ya da değiştirmek için $1.',
@@ -2277,11 +2326,7 @@ Sayfayı izleme listenizden çıkarmak istediğinizde "sayfayı izlemeyi durdur"
 
 'enotif_mailer' => '{{SITENAME}} Bildirim Postası',
 'enotif_reset' => 'Tüm sayfaları ziyaret edilmiş olarak işaretle',
-'enotif_newpagetext' => 'Yeni bir sayfa.',
 'enotif_impersonal_salutation' => '{{SITENAME}} kullanıcı',
-'changed' => 'değiştirildi',
-'created' => 'oluşturuldu',
-'enotif_subject' => '{{SITENAME}} sayfası $PAGETITLE, $PAGEEDITOR tarafından $CHANGEDORCREATED',
 'enotif_lastvisited' => "Son ziyaretinizden bu yana olan tüm değişiklikleri görmek için $1'e bakın.",
 'enotif_lastdiff' => 'Bu değişikliği görmek için, $1 sayfasına bakınız.',
 'enotif_anon_editor' => 'anonim kullanıcı $1',
@@ -2476,6 +2521,7 @@ Revizyon onarılmış veya arşivden silinmiş olabilir ya da sahip olduğunuz b
 'undelete-cleanup-error' => 'Kullanılmayan "$1" arşiv dosyasını silerken hata.',
 'undelete-missing-filearchive' => 'Dosya arşiv IDsi $1 geri getirilemiyor çünkü veritabanında değil.
 Daha önceden silinmesi geri alınmış olabilir.',
+'undelete-error' => 'Sayfa silinemiyor hatası',
 'undelete-error-short' => 'Bu dosyanın silinmesini geri alırken hata çıktı: $1',
 'undelete-error-long' => 'Bu dosyanın silinmesini geri alırken hatalar çıktı:
 
@@ -2490,9 +2536,9 @@ $1',
 'blanknamespace' => '(Ana)',
 
 # Contributions
-'contributions' => 'Kullanıcının katkıları',
+'contributions' => '{{GENDER:$1|Kullanıcı}} katkıları',
 'contributions-title' => '$1 için kullanıcı katkıları',
-'mycontris' => 'Katkılarım',
+'mycontris' => 'Katkılar',
 'contribsub2' => '$1 ($2)',
 'nocontribs' => 'Bu kriterlere uyan değişiklik bulunamadı',
 'uctop' => '(son)',
@@ -2532,7 +2578,7 @@ Son engelleme günlüğü girdisi kaynak amacıyla aşağıda verilmiştir:',
 'whatlinkshere-hideredirs' => 'Yönlendirmeleri $1',
 'whatlinkshere-hidetrans' => 'Dönüştürmeleri $1',
 'whatlinkshere-hidelinks' => 'Bağlantıları $1',
-'whatlinkshere-hideimages' => 'Resim bağlantılarını $1',
+'whatlinkshere-hideimages' => 'Dosya bağlantılarını $1',
 'whatlinkshere-filters' => 'Süzgeçler',
 
 # Block/unblock
@@ -2571,8 +2617,8 @@ Son engelleme günlüğü girdisi kaynak amacıyla aşağıda verilmiştir:',
 'ipb-confirm' => 'Engeli onayla',
 'badipaddress' => 'Geçersiz IP adresi',
 'blockipsuccesssub' => 'IP adresi engelleme işlemi başarılı oldu',
-'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] engellendi.
-<br />Engellemeleri gözden geçirmek için [[Special:BlockList|IP adresi engellenenler]] listesine bakınız.',
+'blockipsuccesstext' => '[[Special:Contributions/$1|$1]] engellendi.<br />
+Engellemeleri gözden geçirmek için [[Special:BlockList|engel listesine]] bakınız.',
 'ipb-blockingself' => 'Kendinizi engellemek üzeresiniz! Bunu yapmak istediğinizden emin misiniz?',
 'ipb-confirmhideuser' => '"Kullanıcıyı gizle" seçiliyken bir kullanıcı engellemek üzeresiniz. Bu, kullanıcının adını tüm listeler ile günlük girişlerinde bastıracaktır. Bunu yapmak istediğinizden emin misiniz?',
 'ipb-edit-dropdown' => 'Engelleme nedenleri düzenle',
@@ -2831,6 +2877,7 @@ Bütün vikilerarası içe aktarım eylemleri [[Special:Log/import|içe aktarım
 'import-interwiki-templates' => 'Tüm şablonları içer',
 'import-interwiki-submit' => 'Import',
 'import-interwiki-namespace' => 'Hedef ad alanı:',
+'import-interwiki-rootpage' => 'Hedeflenen kaynak sayfası (isteğe bağlı):',
 'import-upload-filename' => 'Dosya adı:',
 'import-comment' => 'Yorum:',
 'importtext' => 'Lütfen dosyayı [[Special:Export|dışa aktarım yardımcı yazılımıyla]] kaynak vikiden dışa aktarın.
@@ -2872,7 +2919,6 @@ Geçici dosya kayıp.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript denemesi',
-'javascripttest-disabled' => 'Bu işlev, bu viki üzerinde etkinleştirilmedi.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Kullanıcı sayfanız',
@@ -2975,10 +3021,39 @@ Geçici dosya kayıp.',
 
 # Info page
 'pageinfo-title' => 'Bilgi için "$1"',
-'pageinfo-header-edits' => 'Değişiklikler',
+'pageinfo-header-basic' => 'Temel bilgiler',
+'pageinfo-header-edits' => 'Düzenleme geçmişi',
+'pageinfo-header-restrictions' => 'Sayfa koruması',
+'pageinfo-header-properties' => 'Sayfa özellikleri',
+'pageinfo-display-title' => 'Görüntülenen başlık',
+'pageinfo-default-sort' => 'Varsayılan sıralama anahtarı',
+'pageinfo-length' => 'Sayfa uzunluğu (bayt cinsinden)',
+'pageinfo-article-id' => 'Sayfa ID',
+'pageinfo-robot-policy' => 'Arama motoru durumu',
+'pageinfo-robot-index' => 'İndekslenebilir',
+'pageinfo-robot-noindex' => 'İndekslenemez',
 'pageinfo-views' => 'Görüntülenme sayısı',
-'pageinfo-watchers' => 'İzleyen sayısı',
-'pageinfo-edits' => 'Değişiklik sayısı',
+'pageinfo-watchers' => 'Sayfanın izleyici sayısı',
+'pageinfo-redirects-name' => 'Bu sayfaya yönlendirmeler',
+'pageinfo-redirects-value' => '$1',
+'pageinfo-subpages-name' => 'Bu sayfanın alt sayfaları',
+'pageinfo-firstuser' => 'Sayfa oluşturucu',
+'pageinfo-firsttime' => 'Sayfa oluşturulma tarihi',
+'pageinfo-lastuser' => 'En son düzenleyici',
+'pageinfo-lasttime' => 'Son düzenleme tarihi',
+'pageinfo-edits' => 'Düzenleme sayısı',
+'pageinfo-authors' => 'Farklı yazar sayısı',
+'pageinfo-recent-edits' => 'Son zamanlardaki düzenlemeler (son $1)',
+'pageinfo-recent-authors' => 'Farklı yazarların son sayısı',
+'pageinfo-magic-words' => 'Sihirli {{PLURAL:$1|kelimeler|kelimeler}} ($1)',
+'pageinfo-hidden-categories' => 'Gizli {{PLURAL:$1|kategori|kategoriler}} ($1)',
+'pageinfo-templates' => 'Görüntülenen {{PLURAL:$1|şablon|şablonlar}} ($1)',
+'pageinfo-toolboxlink' => 'Sayfa bilgisi',
+'pageinfo-redirectsto' => 'Yönlendirilen',
+'pageinfo-redirectsto-info' => 'bilgi',
+'pageinfo-contentpage' => 'Bir içerik sayfası sayılır',
+'pageinfo-contentpage-yes' => 'Evet',
+'pageinfo-protect-cascading-yes' => 'Evet',
 
 # Skin names
 'skinname-standard' => 'Klasik',
@@ -3061,6 +3136,7 @@ Bunu çalıştırmak, sisteminizi tehlikeye atabilir.",
 'hours' => '{{PLURAL:$1|$1 saat|$1 saat}}',
 'days' => '{{PLURAL:$1|$1 gün|$1 gün}}',
 'ago' => '$1 önce',
+'just-now' => 'Hemen şimdi',
 
 # Bad image list
 'bad_image_list' => 'Biçim aşağıdaki gibidir:
@@ -3219,6 +3295,7 @@ Diğerleri varsayılan olarak gizlenecektir.
 'exif-objectname' => 'Kısa başlık',
 'exif-specialinstructions' => 'Özel talimatlar',
 'exif-headline' => 'Başlık',
+'exif-credit' => 'Sağlayıcı',
 'exif-source' => 'Kaynak',
 'exif-urgency' => 'Aciliyet',
 'exif-fixtureidentifier' => 'Fikstür adı',
@@ -3233,6 +3310,7 @@ Diğerleri varsayılan olarak gizlenecektir.
 'exif-serialnumber' => 'Kameranın seri numarası',
 'exif-cameraownername' => 'Kameranın sahibi',
 'exif-label' => 'Etiket',
+'exif-nickname' => 'Görüntünün resmî olmayan adı',
 'exif-rating' => 'Oylama (5 üzerinden)',
 'exif-copyrighted' => 'Telif hakkı durumu',
 'exif-copyrightowner' => 'Telif hakkı sahibi',
@@ -3240,12 +3318,15 @@ Diğerleri varsayılan olarak gizlenecektir.
 'exif-webstatement' => 'Çevrimiçi telif hakkı bildirimi',
 'exif-licenseurl' => 'Telif hakkı lisansı için URL',
 'exif-morepermissionsurl' => 'Alternatif lisans bilgileri',
+'exif-attributionurl' => 'Bu çalışmayı yeniden kullanırken lütfen bağlantı verin',
 'exif-pngfilecomment' => 'PNG dosyası yorumu',
 'exif-disclaimer' => 'Sorumluluk reddi',
 'exif-contentwarning' => 'İçerik uyarısı',
 'exif-giffilecomment' => 'GIF dosyası yorumu',
+'exif-intellectualgenre' => 'Öğe türü',
 'exif-subjectnewscode' => 'Konu kodu',
 'exif-event' => 'Adı geçen olay',
+'exif-organisationinimage' => 'Organizasyon gösterilmiştir',
 'exif-personinimage' => 'Adı geçen kişi',
 'exif-originalimageheight' => 'Resmin kırpılmadan önceki yükseliği',
 'exif-originalimagewidth' => 'Resmin kırpılmadan önceki genişliği',
@@ -3680,6 +3761,9 @@ Bu programla birlikte [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU Genel Kamu Lisansın
 'version-software' => 'Yüklü yazılım',
 'version-software-product' => 'Ürün',
 'version-software-version' => 'Versiyon',
+'version-entrypoints' => "Giriş noktası URL'leri",
+'version-entrypoints-header-entrypoint' => 'Giriş noktası',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
 'filepath' => 'Dosyanın konumu',
@@ -3801,8 +3885,8 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'logentry-move-move-noredirect' => '$1 $3 sayfasını $4 sayfasına yönlendirme olmaksızın taşıdı',
 'logentry-move-move_redir' => '$1 $3 sayfasını $4 sayfasına yönlendirme üzerinden taşıdı',
 'logentry-patrol-patrol-auto' => '$1 $3 sayfasını $4 sürümü ile kontrol etti',
-'logentry-newusers-newusers' => '$1 kullanıcı hesabı oluşturdu',
-'logentry-newusers-create' => '$1 kullanıcı hesabı oluşturdu',
+'logentry-newusers-newusers' => 'Kullanıcı hesabı $1 oluşturdu',
+'logentry-newusers-create' => 'Kullanıcı hesabı $1 oluşturdu',
 'logentry-newusers-create2' => '$1 kullanıcı hesabı oluşturdu $3',
 'logentry-newusers-autocreate' => '$1 hesabı otomatik olarak oluşturuldu',
 'newuserlog-byemail' => 'e-posta yoluyla şifre gönderilmiştir',
@@ -3813,6 +3897,7 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'feedback-cancel' => 'İptal',
 'feedback-submit' => 'Geribildirimi Gönder',
 'feedback-adding' => 'Sayfaya geribildirim ekleniyor...',
+'feedback-error1' => 'Hata: Bilinmeyen API sonucu',
 'feedback-error2' => 'Hata: Düzenleme başarısız oldu',
 'feedback-error3' => "Hata: API'den yanıt yok",
 'feedback-thanks' => 'Teşekkürler! Görüşleriniz "[$2 $1]" sayfasında paylaşılmıştır.',
@@ -3820,26 +3905,38 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'feedback-bugcheck' => 'Harika! Sadece [bilinen $1 hatalarından] olmadığını kontrol et.',
 'feedback-bugnew' => 'Kontrol ettim. Yeni hata bildir',
 
+# Search suggestions
+'searchsuggest-search' => 'Ara',
+'searchsuggest-containing' => 'içeren...',
+
 # API errors
 'api-error-badaccess-groups' => 'Bu wiki için dosya yüklemenize izin verilmiyor.',
 'api-error-badtoken' => 'İç hata: Bozuk simge.',
 'api-error-duplicate-popup-title' => 'Çift {{PLURAL:$1|dosya|dosya}}',
 'api-error-empty-file' => 'Gönderdiğiniz dosya boş.',
 'api-error-emptypage' => 'Yeni, boş bir sayfa oluşturmaya izin verilmez.',
+'api-error-fetchfileerror' => 'İç hata: Dosya alınırken bir hata oluştu.',
+'api-error-fileexists-forbidden' => '"$1" adıyla bir dosya zaten mevcut dolayısıyla üzerine yazamazsınız.',
 '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-hookaborted' => 'Yapmaya çalıştığınız değişiklik bir eklenti tarafından iptal edildi.',
 'api-error-http' => 'İç hata: sunucu ile bağlantı kurulamıyor.',
 'api-error-illegal-filename' => 'Bu dosya adına izin verilmiyor.',
+'api-error-internal-error' => "İç hata: Wiki'ye yükleme yapma işleminizde bir şeyler ters gitti.",
 'api-error-invalid-file-key' => 'İç hata: geçici depolama dosyası bulunamadı.',
+'api-error-missingparam' => 'İç hata: İstenilen parametreler eksik.',
+'api-error-missingresult' => 'İç hata: Kopyalamanın başarılı olup olmadığı belirlenemedi.',
 'api-error-mustbeloggedin' => 'Dosya yükleyebilmek için oturum açmanız gereklidir.',
 'api-error-mustbeposted' => 'İç hata: İstek HTTP POST gerektiriyor.',
+'api-error-noimageinfo' => 'Yükleme başarılı oldu, ancak sunucu, bize dosya hakkında herhangi bir bilgi vermedi.',
 'api-error-nomodule' => 'İç hata: Yükleme modülü ayarı yapılmadı.',
 'api-error-ok-but-empty' => 'İç hata: Sunucu yanıt vermiyor.',
 'api-error-overwrite' => 'Varolan dosyanın üzerine yazmaya izin verilmiyor.',
 'api-error-stashfailed' => 'İç hata: Sunucu, geçici dosyaları kaybetti.',
+'api-error-timeout' => 'Sunucu beklenen süre içinde yanıt vermedi.',
 'api-error-unclassified' => 'Bilinmeyen bir hata oluştu.',
 'api-error-unknown-code' => 'Bilinmeyen hata: "$1"',
 'api-error-unknown-error' => 'İç hata: Dosya yüklemeye çalışırken bir şeyler ters gitti.',
@@ -3848,4 +3945,17 @@ Resimler tam çözünürlükte görüntülenir, diğer dosya tipleri ilgili prog
 'api-error-uploaddisabled' => 'Yükleme bu vikide devre dışı bırakılmıştır.',
 'api-error-verification-error' => 'Dosya bozuk veya yanlış uzantıya sahip olabilir.',
 
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|saniye|saniye}}',
+'duration-minutes' => '$1 {{PLURAL:$1|dakika|dakika}}',
+'duration-hours' => '$1 {{PLURAL:$1|saat|saat}}',
+'duration-days' => '$1 {{PLURAL:$1|gün|gün}}',
+'duration-weeks' => '$1 {{PLURAL:$1|hafta|hafta}}',
+'duration-years' => '$1 {{PLURAL:$1|yıl|yıl}}',
+'duration-decades' => '$1 {{PLURAL:$1|on yıl|on yıl}}',
+'duration-centuries' => '$1 {{PLURAL:$1|yüzyıl|yüzyıl}}',
+'duration-millennia' => '$1 {{PLURAL:$1|bin yıl|bin yıl}}',
+
+# Unknown messages
+'svg-long-error' => 'Geçersiz SVG dosyası: $1',
 );
index 9076890..3e9b3aa 100644 (file)
@@ -865,6 +865,9 @@ iFaṭaṭe u3do kitla Qaṫre.',
 'feedback-message' => 'Ṫebo:',
 'feedback-cancel' => 'Mbaṫel',
 
+# Search suggestions
+'searchsuggest-search' => 'Kruxyo',
+
 # API errors
 'api-error-unknownerror' => 'Fawdo nuxroyo: $1',
 
index 726ecba..56aab08 100644 (file)
@@ -138,7 +138,6 @@ $messages = array(
 'qbfind' => 'Kuma',
 'qbedit' => 'Lulamisa',
 'qbpageoptions' => 'Tluka leri',
-'qbpageinfo' => 'mongo',
 'qbmyoptions' => 'Matluka ya mina',
 'qbspecialpages' => 'Matluka yohlawuleka',
 'faq' => 'FAQ',
@@ -372,11 +371,8 @@ Hikwlaho ka xivangelo xa "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Uhumile eka wiki leyi.'''
 
-Ungaya emahlweni utirhisa {{SITENAME}} handle ko tipaluxa, kumbe unga [[Special:UserLogin|pfula unghena nakambe]] tani hi mutirhisa un'wana kumbe kumbe hivuxokoxoko bya wena.
+Ungaya emahlweni utirhisa {{SITENAME}} handle ko tipaluxa, kumbe unga <span class='plainlinks'>[$1 pfula unghena nakambe]</span> tani hi mutirhisa un'wana kumbe kumbe hivuxokoxoko bya wena.
 Tsundzuka leswaku matluka man'wana mangaha komba onge upfule unghena eka wiki, loko ungasi sula tluka rakhompuyuta leri tsundzukaka matluka lawa uma vhakeleke.",
-'welcomecreation' => '== Hoyohoyo, eka Wena $1 ! ==
-Akhawunti yawena yitumbuluxiwile.
-Unda rivali ku cinca [[Special:Preferences|{{SITENAME}} minhlawulo ya wena]].',
 'yourname' => 'Vito ra vutirhisi',
 'yourpassword' => 'Vito-mpfungulo:',
 'yourpasswordagain' => 'Thlela u hoxa ritompfungulo ra wena:',
index c4b7190..fcf2b51 100644 (file)
@@ -345,7 +345,7 @@ $messages = array(
 'cancel' => 'Баш тарту',
 'moredotdotdot' => 'Дәвамы…',
 'mypage' => 'Шәхси битем',
-'mytalk' => 'Бәхәсем',
+'mytalk' => 'Бәхәс',
 'anontalk' => 'Бу IP адресы өчен бәхәс бите',
 'navigation' => 'Күчү',
 'and' => '&#32;һәм',
@@ -355,7 +355,6 @@ $messages = array(
 'qbbrowse' => 'Карау',
 'qbedit' => 'Үзгәртү',
 'qbpageoptions' => 'Бу бит',
-'qbpageinfo' => 'Бит турында мәгълүматлар',
 'qbmyoptions' => 'Битләрем',
 'qbspecialpages' => 'Махсус битләр',
 'faq' => 'ЕБС',
@@ -606,11 +605,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Сез хисап язмагыздан чыктыгыз.'''
 
-Сез {{SITENAME}} проектында аноним рәвештә кала яисә шул ук яки башка исем белән яңадан [[Special:UserLogin|керә]] аласыз.
+Сез {{SITENAME}} проектында аноним рәвештә кала яисә шул ук яки башка исем белән яңадан <span class='plainlinks'>[$1 керә]</span> аласыз.
 Кайбер битләр Сез кергән кебек күрсәтелергә мөмкин. Моны бетерү өчен браузер кэшын чистартыгыз.",
-'welcomecreation' => '== Рәхим итегез, $1! ==
-Сез теркәлдегез.
-Сайтның шәхси [[Special:Preferences|көйләнмәләрен]] карарга онытмагыз.',
 'yourname' => 'Кулланучы исеме:',
 'yourpassword' => 'Серсүз:',
 'yourpasswordagain' => 'Серсүзне кабат кертү:',
@@ -851,8 +847,8 @@ $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>',
+Сез [[Special:Search/{{PAGENAME}}|бу исем кергән башка мәкаләләрне]] башка битләрдә,
+яисә <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} көндәлекләрдәге язмаларны] таба аласыз.</span> Сезнең бу битне ясарга хакыгыз юк.',
 'userpage-userdoesnotexist' => '«<nowiki>$1</nowiki>» исемле хисап язмасы юк. Сез чынлап та бу битне ясарга яисә үзгәртергә телисезме?',
 'userpage-userdoesnotexist-view' => '"$1" исемле хисап язмасы юк.',
 'blocked-notice-logextract' => 'Бу кулланучы хәзергә тыелды.
@@ -1150,8 +1146,6 @@ $1",
 'search-interwiki-caption' => 'Тугандаш проектлар',
 'search-interwiki-default' => '$1 нәтиҗә:',
 'search-interwiki-more' => '(тагын)',
-'search-mwsuggest-enabled' => 'киңәшләр белән',
-'search-mwsuggest-disabled' => 'киңәшсез',
 'search-relatedarticle' => 'Бәйләнгән',
 'mwsuggest-disable' => 'AJAX-ярдәмне ябу',
 'searcheverything-enable' => 'Барлык исемнәр мәйданында эзләү',
@@ -1183,7 +1177,7 @@ $1",
 
 # Preferences page
 'preferences' => 'Көйләнмәләр',
-'mypreferences' => 'Көйләнмәләрем',
+'mypreferences' => 'Көйләнмәләр',
 'prefs-edits' => 'Үзгәртүләр исәбе:',
 'prefsnologin' => 'Кермәгәнсез',
 'prefsnologintext' => 'Кулланучы көйләнмәләрене үзгәртү өчен, сез <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} керергә]</span> тиешсез.',
@@ -1745,7 +1739,7 @@ PICT # төрле
 
 # Watchlist
 'watchlist' => 'Күзәтү исемлегем',
-'mywatchlist' => 'Күзәтү исемлегем',
+'mywatchlist' => 'Күзәтү исемлеге',
 'watchlistfor2' => '$1 $2 өчен',
 'nowatchlist' => 'Күзәтү исемлегегездә битләр юк.',
 'watchnologin' => 'Кермәдегез',
@@ -1766,11 +1760,7 @@ PICT # төрле
 'watching' => 'Күзәтү исемлегемә өстәүе…',
 'unwatching' => 'Күзәтү исемлегемнән чыгаруы…',
 
-'enotif_newpagetext' => 'Бу яңа бит.',
 'enotif_impersonal_salutation' => '{{SITENAME}} кулланучы',
-'changed' => 'үзгәртелде',
-'created' => 'төзергән',
-'enotif_subject' => '{{SITENAME}} проектының $PAGETITLE бите $PAGEEDITOR тарафыннан $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Соңгы керүегездән соң булган барлык үзгәртүләрне күрер өчен, бу сылтама аша узыгыз: $1',
 'enotif_body' => 'Хөрмәтле $WATCHINGUSERNAME,
 
@@ -1917,7 +1907,7 @@ $1',
 # Contributions
 'contributions' => 'Кулланучының кертеме',
 'contributions-title' => '$1 исемле кулланучының кертеме',
-'mycontris' => 'Кертемем',
+'mycontris' => 'Кертем',
 'contribsub2' => '$1 ($2) өчен',
 'uctop' => '(ахыргы)',
 'month' => 'Айдан башлап (һәм элегрәк):',
@@ -1949,7 +1939,7 @@ $1',
 'whatlinkshere-hideredirs' => 'юнәлтүләрне $1',
 'whatlinkshere-hidetrans' => 'кертүләрне $1',
 'whatlinkshere-hidelinks' => 'сылтамаларны $1',
-'whatlinkshere-hideimages' => 'рәсем сылтамаларын $1',
+'whatlinkshere-hideimages' => '$1 файл сылтамалары',
 'whatlinkshere-filters' => 'Фильтрлар',
 
 # Block/unblock
@@ -2556,6 +2546,10 @@ $1',
 'feedback-close' => 'Әзер',
 'feedback-bugnew' => 'Мин тикшердем. Яңа хата турында хәбәр итү',
 
+# Search suggestions
+'searchsuggest-search' => 'Эзләү',
+'searchsuggest-containing' => 'эчтәлек...',
+
 # API errors
 'api-error-badaccess-groups' => 'Сезгә бу викигә файллар өстәү рөхсәт ителмәгән',
 'api-error-badtoken' => 'Эчке хата: дөрес булмаган токен.',
index db0507f..dbb8b1f 100644 (file)
@@ -237,7 +237,6 @@ $messages = array(
 'qbbrowse' => 'Qaraw',
 'qbedit' => 'Üzgärtü',
 'qbpageoptions' => 'Bu bit',
-'qbpageinfo' => 'Bit turında mäğlümatlar',
 'qbmyoptions' => 'Bitlärem',
 'qbspecialpages' => 'Maxsus bitlär',
 'faq' => 'YBS',
@@ -477,11 +476,8 @@ Ul kürsätkän säbäp: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Sez xisap yazmağızdan çıqtığız.'''
 
-Sez {{SITENAME}} proyektında anonim räweştä qala yäisä şul uq yäki başqa isem belän yañadan [[Special:UserLogin|kerä]] alasız.
+Sez {{SITENAME}} proyektında anonim räweştä qala yäisä şul uq yäki başqa isem belän yañadan <span class='plainlinks'>[$1 kerä]</span> alasız.
 Qayber bitlär Sez kergän kebek kürsätelergä mömkin. Monı beterü öçen brauzer keşın çistartığız.",
-'welcomecreation' => '== Räxim itegez, $1! ==
-Sez terkäldegez.
-Saytnıñ şäxsi [[Special:Preferences|köylänmälären]] qararğa onıtmağız.',
 'yourname' => 'Qullanuçı iseme:',
 'yourpassword' => 'Sersüz:',
 'yourpasswordagain' => 'Sersüzne qabat kertü:',
@@ -924,8 +920,6 @@ Sez idaräçe bulu säbäple, [$1 yäşerelgän yuramanı qarıy alasız]",
 'search-interwiki-caption' => 'Tuğandaş proyektlar',
 'search-interwiki-default' => '$1 näticä:',
 'search-interwiki-more' => '(tağın)',
-'search-mwsuggest-enabled' => 'kiñäşlär belän',
-'search-mwsuggest-disabled' => 'kiñäşsez',
 'search-relatedarticle' => 'Bäylängän',
 'mwsuggest-disable' => 'AJAX-yärdämne yabu',
 'searcheverything-enable' => 'Barlıq isemnär mäydanında ezläw',
@@ -1517,11 +1511,7 @@ Bu bittä häm anıñ bäxäslegendä barlıq bulaçaq üzgärtülär şunda kü
 'watching' => 'Küzätü isemlegemä östäwe…',
 'unwatching' => 'Küzätü isemlegemnän çığaruı…',
 
-'enotif_newpagetext' => 'Bu yaña bit.',
 'enotif_impersonal_salutation' => '{{SITENAME}} qullanuçı',
-'changed' => 'üzgärtelde',
-'created' => 'tözergän',
-'enotif_subject' => '{{SITENAME}} proyektınıñ $PAGETITLE bite $PAGEEDITOR tarafınnan $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Soñğı kerüegezdän soñ bulğan barlıq üzgärtülärne kürer öçen, bu sıltama aşa uzığız: $1',
 'enotif_body' => 'Xörmätle $WATCHINGUSERNAME,
 
index 9854cb8..e12c76d 100644 (file)
@@ -16,101 +16,101 @@ $fallback = 'fr';
 
 $messages = array(
 # Dates
-'sunday'        => 'tāpati',
-'monday'        => 'monirē',
-'tuesday'       => 'mahana piti',
-'wednesday'     => 'mahana toru',
-'thursday'      => 'mahana maha',
-'friday'        => 'mahana pae',
-'saturday'      => 'mahana mā’a',
-'sun'           => 'tāpati',
-'mon'           => 'monirē',
-'tue'           => 'mahana piti',
-'wed'           => 'mahana toru',
-'thu'           => 'mahana maha',
-'fri'           => 'mahana pae',
-'sat'           => 'mahana mā’a',
-'january'       => 'nō tēnuare',
-'february'      => 'nō fepuare',
-'march'         => 'nō māti',
-'april'         => 'nō ’ēperēra',
-'may_long'      => 'nō mē',
-'june'          => 'nō tiunu',
-'july'          => 'nō tiurai',
-'august'        => 'nō tiurai',
-'september'     => 'nō tetepa',
-'october'       => 'nō ’ātopa',
-'november'      => 'nō novema',
-'december'      => 'nō tītema',
-'january-gen'   => 'nō tēnuare',
-'february-gen'  => 'nō fepuare',
-'march-gen'     => 'nō māti',
-'april-gen'     => 'nō ’ēperēra',
-'may-gen'       => 'nō mē',
-'june-gen'      => 'nō tiunu',
-'july-gen'      => 'nō tiurai',
-'august-gen'    => 'nō tiurai',
+'sunday' => 'tāpati',
+'monday' => 'monirē',
+'tuesday' => 'mahana piti',
+'wednesday' => 'mahana toru',
+'thursday' => 'mahana maha',
+'friday' => 'mahana pae',
+'saturday' => 'mahana mā’a',
+'sun' => 'tāpati',
+'mon' => 'monirē',
+'tue' => 'mahana piti',
+'wed' => 'mahana toru',
+'thu' => 'mahana maha',
+'fri' => 'mahana pae',
+'sat' => 'mahana mā’a',
+'january' => 'nō tēnuare',
+'february' => 'nō fepuare',
+'march' => 'nō māti',
+'april' => 'nō ’ēperēra',
+'may_long' => 'nō mē',
+'june' => 'nō tiunu',
+'july' => 'nō tiurai',
+'august' => 'nō tiurai',
+'september' => 'nō tetepa',
+'october' => 'nō ’ātopa',
+'november' => 'nō novema',
+'december' => 'nō tītema',
+'january-gen' => 'nō tēnuare',
+'february-gen' => 'nō fepuare',
+'march-gen' => 'nō māti',
+'april-gen' => 'nō ’ēperēra',
+'may-gen' => 'nō mē',
+'june-gen' => 'nō tiunu',
+'july-gen' => 'nō tiurai',
+'august-gen' => 'nō tiurai',
 'september-gen' => 'nō tetepa',
-'october-gen'   => 'nō ’ātopa',
-'november-gen'  => 'nō novema',
-'december-gen'  => 'nō tītema',
-'jan'           => 'nō tēnuare',
-'feb'           => 'nō fepuare',
-'mar'           => 'nō māti',
-'apr'           => 'nō ’ēperēra',
-'may'           => 'nō mē',
-'jun'           => 'nō tiunu',
-'jul'           => 'nō tiurai',
-'aug'           => 'nō tiurai',
-'sep'           => 'nō tetepa',
-'oct'           => 'nō ’ātopa',
-'nov'           => 'nō novema',
-'dec'           => 'nō tītema',
-
-'about'      => 'Nō',
-'article'    => 'Parau pāpa’i',
+'october-gen' => 'nō ’ātopa',
+'november-gen' => 'nō novema',
+'december-gen' => 'nō tītema',
+'jan' => 'nō tēnuare',
+'feb' => 'nō fepuare',
+'mar' => 'nō māti',
+'apr' => 'nō ’ēperēra',
+'may' => 'nō mē',
+'jun' => 'nō tiunu',
+'jul' => 'nō tiurai',
+'aug' => 'nō tiurai',
+'sep' => 'nō tetepa',
+'oct' => 'nō ’ātopa',
+'nov' => 'nō novema',
+'dec' => 'nō tītema',
+
+'about' => 'Nō',
+'article' => 'Parau pāpa’i',
 'navigation' => 'Arata’i',
 
 # Cologne Blue skin
-'qbedit'         => 'Fa’ahuru ’ē',
-'qbmyoptions'    => 'ta’u ’api',
+'qbedit' => 'Fa’ahuru ’ē',
+'qbmyoptions' => 'ta’u ’api',
 'qbspecialpages' => 'Te mau ’api ta’a ’ē',
 
-'help'             => 'Tauturu',
-'search'           => 'Roromā’imi',
-'searchbutton'     => 'Roromā’imi',
-'searcharticle'    => 'Haere',
-'history_short'    => 'Parau tuatāpapa',
-'edit'             => 'Fa’ahuru ’ē',
-'delete'           => 'Fa’a’ore',
-'protect'          => 'Pāruru',
-'specialpage'      => '’Api ta’a ’ē',
-'talk'             => 'Paraparaura’a',
+'help' => 'Tauturu',
+'search' => 'Roromā’imi',
+'searchbutton' => 'Roromā’imi',
+'searcharticle' => 'Haere',
+'history_short' => 'Parau tuatāpapa',
+'edit' => 'Fa’ahuru ’ē',
+'delete' => 'Fa’a’ore',
+'protect' => 'Pāruru',
+'specialpage' => '’Api ta’a ’ē',
+'talk' => 'Paraparaura’a',
 'jumptonavigation' => 'arata’i',
-'jumptosearch'     => 'haere',
+'jumptosearch' => 'haere',
 
 # 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'            => 'Nō {{SITENAME}}',
-'aboutpage'            => 'Project:Nō',
-'edithelp'             => 'Tauturu',
-'mainpage'             => 'Fa’ari’ira’a',
+'aboutsite' => 'Nō {{SITENAME}}',
+'aboutpage' => 'Project:Nō',
+'edithelp' => 'Tauturu',
+'mainpage' => 'Fa’ari’ira’a',
 'mainpage-description' => 'Fa’ari’ira’a',
-'portal'               => 'Fare auhoa',
+'portal' => 'Fare auhoa',
 
-'newmessageslink'     => 'Te mau poro’i ’āpī',
+'newmessageslink' => 'Te mau poro’i ’āpī',
 'newmessagesdifflink' => 'fa’ahuru-’ē-ra’a hope’a',
-'editsection'         => 'fa’ahuru ’ē',
-'editold'             => 'fa’ahuru ’ē',
+'editsection' => 'fa’ahuru ’ē',
+'editold' => 'fa’ahuru ’ē',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Parau pāpa’i',
-'nstab-user'      => 'Ta’ata',
-'nstab-special'   => 'Ta’a ’ē',
-'nstab-image'     => 'Hōho’a',
+'nstab-main' => 'Parau pāpa’i',
+'nstab-user' => 'Ta’ata',
+'nstab-special' => 'Ta’a ’ē',
+'nstab-image' => 'Hōho’a',
 'nstab-mediawiki' => 'Poro’i',
-'nstab-template'  => 'Hōho’a fāito',
-'nstab-help'      => 'Tauturu',
-'nstab-category'  => 'Huru',
+'nstab-template' => 'Hōho’a fāito',
+'nstab-help' => 'Tauturu',
+'nstab-category' => 'Huru',
 
 # Revision feed
 'history-feed-title' => 'Parau tuatāpapa',
@@ -119,11 +119,11 @@ $messages = array(
 'powersearch' => 'Roromā’imi',
 
 # Preferences page
-'prefs-rc'     => 'Te mau fa’ahuru-’ē-ra’a ’āpī',
-'prefs-files'  => 'Te mau putu’ite',
-'youremail'    => 'Tā’u ’āfata rata uira',
+'prefs-rc' => 'Te mau fa’ahuru-’ē-ra’a ’āpī',
+'prefs-files' => 'Te mau putu’ite',
+'youremail' => 'Tā’u ’āfata rata uira',
 'yourlanguage' => 'Te reo:',
-'email'        => '’Imere',
+'email' => '’Imere',
 
 # Recent changes
 'recentchanges' => 'Te mau fa’ahuru-’ē-ra’a ’āpī',
@@ -133,7 +133,7 @@ $messages = array(
 
 # File description page
 'file-anchor-link' => 'Hōho’a',
-'filehist-user'    => 'Ta’ata',
+'filehist-user' => 'Ta’ata',
 
 # Random page
 'randompage' => '’Api mā’iti-haere-noa',
index a759d0d..7ebbfb3 100644 (file)
@@ -83,7 +83,7 @@ $messages = array(
 
 'underline-always' => 'Кезээде',
 'underline-never' => 'Кажан-даа',
-'underline-default' => 'Ð\92еб-браузерниң ниити үнези',
+'underline-default' => 'Ð\9aеÑ\88Ñ\82иң Ð°Ð·Ñ\8b Ð²еб-браузерниң ниити үнези',
 
 # Font style option in Special:Preferences
 'editfont-default' => 'Веб-браузерниң ниити үнези',
@@ -148,7 +148,10 @@ $messages = array(
 'category-empty' => "''Амгы бо бөлүкте медиа база арыннар чок.''",
 'hidden-categories' => '{{PLURAL:$1|Чажыт бөлүк|Чажыт бөлүктер}}',
 'hidden-category-category' => 'Чажыт бөлүктер',
+'category-subcat-count' => '{{PLURAL:$2|Бо бөлүк чүгле дараазында адыр-бөлүклүг.|Бо бөлүктүң шупту $2 адыр-бөлүүнүң аразындан дараазында $1 адыр-бөлүктү көргүскен.}}',
 'category-subcat-count-limited' => 'Бо бөлүк {{PLURAL:$1|бир|$1}} адаккы бөлүктүү.',
+'category-article-count' => '{{PLURAL:$2|Бо бөлүк чүгле дараазында арыннарлыг.|Бо бөлүктүң шупту $2 арыннарының аразындан дараазында $1 арынын көргүскен.}}',
+'category-file-count' => '{{PLURAL:$2|Бо бөлүк чүгле чаңгыс файлдыг.|Бо бөлүктүң ниити $2 файлының $1 файлын көргүскен.}}',
 'listingcontinuesabbrev' => '(уланчы)',
 'noindex-category' => 'Индекстелбес арынар',
 'broken-file-category' => 'Ажылдавайн турар файл-шөлүлгелиг арыннар',
@@ -158,8 +161,8 @@ $messages = array(
 'newwindow' => '(чаа көзенээ ажыытынар)',
 'cancel' => 'Соксаары',
 'moredotdotdot' => 'Артык...',
-'mypage' => 'Ð\9cÑ\8dÑ\8dÒ£ Ð°Ñ\80Ñ\8bнÑ\8bм',
-'mytalk' => 'Ð\9cÑ\8dÑ\8dÒ£ Ñ\87Ñ\83гаам',
+'mypage' => 'Ð\90Ñ\80Ñ\8bн',
+'mytalk' => 'ЧÑ\83гаа',
 'anontalk' => 'Бо ИП-адрестиң чугаазы',
 'navigation' => 'Навигация',
 'and' => '&#32;болгаш',
@@ -169,7 +172,6 @@ $messages = array(
 'qbbrowse' => 'Каралаары',
 'qbedit' => 'Өскертири',
 'qbpageoptions' => 'Бо арын',
-'qbpageinfo' => 'Арын дугайында медээ',
 'qbmyoptions' => 'Мээң арыннарым',
 'qbspecialpages' => 'Тускай арыннар',
 'faq' => 'Бо-ла салыр айтырыглар (БлСА)',
@@ -209,7 +211,7 @@ $messages = array(
 'create' => 'Чогаадыры',
 'editthispage' => 'Бо арынны өскертири',
 'create-this-page' => 'Бо арынны чогаадыры',
-'delete' => 'ЫÑ\80адÑ\8bры',
+'delete' => 'ЫÑ\80аары',
 'deletethispage' => 'Бо арынны ырадыры',
 'undelete_short' => '$1 {{PLURAL:$1|эдигни|эдиглерни}} катап үндүрери',
 'viewdeleted_short' => '{{PLURAL:$1|Бир ыраткан өскерлиишкинни|$1 ыраткан өскерлиишкиннерни}} көөрү',
@@ -317,31 +319,33 @@ $messages = array(
 'databaseerror' => 'Медээ шыгжамыры алдаг',
 'laggedslavemode' => "'''Оваарымчалыг:''' Бо арында чаартыышкыннар чок болуп болур.",
 'readonly' => 'шоочалаарынга медээ шыгжамыры',
-'missing-article' => 'Ð\9cедÑ\8dÑ\8d Ñ\87Ñ\8bÑ\8bндÑ\8bзÑ\8b did not find the Ð°Ñ\80Ñ\8bннÑ\8bÒ£ Ñ\81өзүглели that it should have found, named "$1" $2.
+'missing-article' => 'Ð\94аннÑ\8bйлаÑ\80 Ð±Ð°Ð·Ð°Ð·Ñ\8bнда Ñ\82Ñ\8bваÑ\80 Ñ\83жÑ\83Ñ\80лÑ\83г Â«$1» $2 Ð´ÐµÐ¿ Ð°Ñ\80Ñ\8bннÑ\8bÒ£ Ð½ÐµÐ³ÐµÑ\82Ñ\82инип Ñ\82Ñ\83Ñ\80аÑ\80 Ñ\81өзүглели Ñ\82Ñ\8bвÑ\8bлбаан.
 
-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.',
+А шынында ындыг эвес болза, Силер программа хандырылгазының алдаанга душканыңар хөңнү.
+
+Ооң дугайында кайы-бир [[Special:ListUsers/sysop|удуртукчуларга]], мүн URL-ин айытпышаан, дамчыдыңарам.',
 'missingarticle-rev' => '(үндүрериниң саны: $1)',
 'missingarticle-diff' => '(Ылгал: $1, $2)',
 'internalerror' => 'Иштики алдаг',
 'internalerror_info' => 'Иштики алдаг: $1',
 'badtitle' => 'Багай ат',
+'badtitletext' => 'Негеттинип турар арын ады меге, куруг, чок болза дылдар аразында азы интервики ады шын эвес.
+Адында таарышпас демдектер бары чадапчок.',
 'viewsource' => 'Дөзүн көөрү',
 'actionthrottled' => 'Шеглээн дүрген',
 'sqlhidden' => '(SQL айтырыгны чажырган)',
+'exception-nologin' => 'Кирбес',
 
 # Login and logout pages
-'welcomecreation' => '== Кирип моорлаңар, $1! ==
-Силер бүрүткел бижик 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' => 'Кирери / бүрүткел бижикти чогаадыры',
+'loginprompt' => '{{SITENAME}} сайтче кирерде, баштай «cookies»-ти чөшпээрээр ужурлуг Силер.',
 'userlogin' => 'Кирери / бүрүткел бижикти чогаадыры',
 'userloginnocreate' => 'Кирери',
 'logout' => 'Үнери',
@@ -352,6 +356,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'createaccount' => 'Бүрүткел бижикти бүдүрери',
 'gotaccount' => "Силер бүрүтекнип алдыңар де? '''$1'''.",
 'gotaccountlink' => 'Кирер',
+'userlogin-resetlink' => 'Кирер бижик-саныңар уттуп алдыңар бе?',
 'createaccountmail' => 'Э-чагаадан',
 'createaccountreason' => 'Чылдагаан:',
 'badretype' => 'Силерниң парлаан чажыт сөзүңер таарышпас.',
@@ -384,6 +389,7 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'resetpass-temp-password' => 'Түр чажыт сөс:',
 
 # Special:PasswordReset
+'passwordreset' => 'Чажыт сөстү дүжүрү',
 'passwordreset-legend' => 'Чажыт атты дүжүр',
 'passwordreset-username' => 'Aжыглакчының ады:',
 'passwordreset-domain' => 'Домен:',
@@ -417,7 +423,8 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'image_tip' => 'Киир туткан файл',
 'media_sample' => 'Чижек.ogg',
 'media_tip' => 'Файлдың холбаазы',
-'hr_tip' => 'Доора шугум (use sparingly)',
+'sig_tip' => 'Шак-биле хол үжүңер',
+'hr_tip' => 'Доора шугум (көвей ажыглаваңар)',
 
 # Edit pages
 'summary' => 'Түңнел:',
@@ -428,6 +435,8 @@ Do not forget to change your [[Special:Preferences|{{SITENAME}} preferences]].',
 'preview' => 'Чижеглей көөрү',
 'showpreview' => 'Чижеглей көөрү',
 'showdiff' => 'Өскерлиишкиннерни көргүзери',
+'anoneditwarning' => "'''Кичээңгейлиг!''' Силер сайтче авторжуттунмаан силер.
+Бо арынның өскертилге төөгүзүнче Силерниң IP-адрезиңер бижитинип каар.",
 'missingcommenttext' => 'Тайылбырни адаанда чогаадыңар.',
 'summary-preview' => 'Түңнелдү чижеглей көөрү:',
 'subject-preview' => 'Кол сөс чижеглей көөрү:',
@@ -453,10 +462,19 @@ Please check if you want to create/edit this page.',
 'templatesused' => 'Бо арында {{PLURAL:$1|Майык|Майыктар}} ажыглаттырган:',
 'template-protected' => '(камгалаан)',
 'template-semiprotected' => '(четпес камгалаан)',
+'hiddencategories' => 'Бо арын {{PLURAL:$1|$1 чажыт бөлүкке}} хамааржыр:',
 'permissionserrorstext-withaction' => "Мында «'''$2'''» силерниң эргеңер чок, {{PLURAL:$1|чылдагааны|чылдагааннары}}:",
 'moveddeleted-notice' => 'Бо арын ап каавыткан.
 Адаанда ап каавыткан биле өскээр адаан бижиктер шынзылгазын көргүскен.',
 
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => 'Сагындырыг: Кошкан майыктарның ниити хемчээли дендии улуг.
+Чамдык майыктар коштунмаан боор.',
+'post-expand-template-inclusion-category' => 'Кожар майыктарга чөшпээрээн хемчээлин ашкан арыннар',
+'post-expand-template-argument-warning' => "'''Кичээнгейлиг:''' бо арында тоң дора дээрге (по крайней мере) чаңгыс майыктыг, а ооң аргументизи эмин эрттир улуг калбаяр хемчээлдиг.
+Ындыг чергелиг аргументилерни эрттирип каан.",
+'post-expand-template-argument-category' => "Аргументилери салдынмаан майыктарлыг '''арыннар'''",
+
 # History pages
 'viewpagelogs' => 'Бо арынның журналын көргүзери',
 'nohistory' => 'Бо арынның өскерлиишкин төөгүзү чок.',
@@ -510,10 +528,11 @@ Please check if you want to create/edit this page.',
 'revertmerge' => 'Чарары',
 
 # Diffs
-'history-title' => '«$1» деп арынның үндүрери төөгүзү',
+'history-title' => '«$1» деп арынның эдилге төөгүзү',
 'lineno' => 'Одуруг $1:',
 'compareselectedversions' => 'Шилип алган хевирлери деңнээри',
 'editundo' => 'чөрчүүрү',
+'diff-multi' => '({{PLURAL:$2|$2 киржикчиниң}} {{PLURAL:$1|$1 түр хевирин көргүспээн}})',
 
 # Search results
 'searchresults' => 'Түңнелдер',
@@ -531,22 +550,22 @@ Please check if you want to create/edit this page.',
 'searchprofile-project' => 'Төлевилел биле дуза арыннары',
 'searchprofile-images' => 'Мультимедиа',
 'searchprofile-everything' => 'Бүгүде',
-'searchprofile-advanced' => 'Калбартыры',
+'searchprofile-advanced' => 'Калбайтыр',
 'searchprofile-articles-tooltip' => '$1 иштинден дилээри',
 'searchprofile-project-tooltip' => '$1 иштинде дилээри',
 'searchprofile-images-tooltip' => 'Файлдар дилээри',
 'searchprofile-everything-tooltip' => 'Шупту арыннардан дилээри (сумележиишкиннерден база)',
 'searchprofile-advanced-tooltip' => 'Айыткан аттар делгемнеринден дилээри',
 'search-result-size' => '$1 ({{PLURAL:$2|$2 сөс}})',
-'search-redirect' => '(шигледир $1)',
+'search-result-category-size' => '{{PLURAL:$1|1 кежигүн|$1 кежигүн}} ({{PLURAL:$2|1 aдаккы бөлүк|$2 aдаккы бөлүк}}, {{PLURAL:$3|1 файл|$3 файл}})',
+'search-redirect' => '($1-н шиглелге)',
 'search-section' => '(«$1» деп салбыр)',
 'search-suggest' => 'Силер «$1» деп бодадыңар чадавас',
 'search-interwiki-more' => '(артык)',
-'search-mwsuggest-enabled' => 'саналдар',
-'search-mwsuggest-disabled' => 'саналдар чок',
 'searcheverything-enable' => 'Шупту аттар делгемнеринден дилээри',
 'searchrelated' => 'холбаалыг',
 'searchall' => 'шупту',
+'showingresultsheader' => "«'''$4'''» дилээниниң {{PLURAL:$5|'''$3''' одуругдан '''$1''' түңнели|'''$3''' одуругдан '''$1—$2''' түңнелдери}}",
 'search-nonefound' => 'Айыткан негелдениң түңнели чок',
 'powersearch' => 'Advanced search',
 'powersearch-ns' => 'Аттар делгемнеринден дилээри:',
@@ -554,7 +573,7 @@ Please check if you want to create/edit this page.',
 
 # Preferences page
 'preferences' => 'Шилилгелер',
-'mypreferences' => 'Ð\9cÑ\8dÑ\8dÒ£ Ñ\88илилгелеÑ\80им',
+'mypreferences' => 'ШилилгелеÑ\80',
 'prefs-edits' => 'Өскерлиишкиннериңерниң саны:',
 'changepassword' => 'Чажыт сөстү өскертири',
 'prefs-skin' => 'Кеш',
@@ -604,6 +623,8 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'gender-male' => 'Эр',
 'gender-female' => 'Кыс',
 'email' => 'Э-чагаа',
+'prefs-help-email' => 'Э-шуудаң адрезин айтыры албан эвес, ынчалза-даа, уруңуңар (парольуңар) чиде бээрге, ол херек апаар.',
+'prefs-help-email-others' => 'Ол харылзаа медээлели база өске киржикчилерге хуу азы чугаалажылга арныңарга э-шуудаңыңар (e-mail) таварыштыр Силерниң-биле харылзажырынга ажыктыг. Ооң кадында Силерниң э-шуудаң адрезиңер кымга-даа көзүлбес.',
 'prefs-info' => 'Кол медээлер',
 'prefs-signature' => 'Хол үжүү',
 'prefs-diffs' => 'Ылгалдар',
@@ -670,9 +691,11 @@ 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 чаа өскерлиишкиннерни көргүзери',
+'recentchanges-label-bot' => 'Бо эдилгени робот күүсеткен.',
+'recentchanges-label-unpatrolled' => 'Бо өскертилге истетинмээн (патрульдаттынмаан)',
+'rcnote' => "$4 $5 өйде соңгу '''$2''' {{PLURAL:$2|хонуктуң}} {{PLURAL:$1|сөөлгү '''$1''' '''өскерилгелери'''}} .",
+'rcnotefrom' => 'Адаанда <strong>$2</strong> тура (<strong>$1</strong> чедир) өскертилгелерни санаан.',
+'rclistfrom' => '$1 тура чаа өскерилгелерни көргүзер',
 'rcshowhideminor' => 'Бичии өскерлиишкиннерни $1',
 'rcshowhidebots' => 'Роботтарну $1',
 'rcshowhideliu' => 'Кирер ажыглакчыларны $1',
@@ -696,7 +719,11 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'recentchangeslinked' => 'Хамааржыр өскерлиишкиннер',
 'recentchangeslinked-toolbox' => 'Хамааржыр өскерлиишкиннер',
 'recentchangeslinked-title' => '«$1» деп арынга хамаарыштырган өскерлиишкиннер',
+'recentchangeslinked-noresult' => 'Холбаштырган арыннарда айыткан үе иштинде кандыг-даа өскертилге турбаан.',
+'recentchangeslinked-summary' => "Айыткан арынның (азы айыткан бөлүкке хамаарышкан) шөлүлүглериниң чедер арыннарнының чаа өскерилгер даңзызы.
+[[Special:Watchlist|Силерниң хайгаарал даңзызынче]] кирип турар арыннарны '''ылгап каан'''.",
 'recentchangeslinked-page' => 'Арынның ады:',
+'recentchangeslinked-to' => 'Айыткан арынче шөлүп турар арыннарга өскерилгелерни көргүзер',
 
 # Upload
 'upload' => 'Файлды салыры',
@@ -735,18 +762,23 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 # File description page
 'file-anchor-link' => 'Файл',
 'filehist' => 'Файлдың төөгүзү',
+'filehist-help' => 'Ол үеде файлдың көстүрүн көөрде, дата/үеже базыптыңар.',
 'filehist-deleteall' => 'шуптуну ырадыры',
 'filehist-deleteone' => 'ырадыры',
 'filehist-revert' => 'эгидип тургузары',
 'filehist-current' => 'амгы',
 'filehist-datetime' => 'Ай, Хүн/Шак',
 'filehist-thumb' => 'Бичии чурумал',
-'filehist-thumbtext' => 'Бичии чурумал for version as of $1',
+'filehist-thumbtext' => '$1 хамааржыр хевириниң биче чурумалы (миниатюразы)',
 'filehist-user' => 'Ажыглакчы',
 'filehist-dimensions' => 'Хемчээлдери',
 'filehist-filesize' => 'Файл хемчээли',
 'filehist-comment' => 'Тайылбыр',
 'imagelinks' => 'Файлдың ажыглаашкыны',
+'linkstoimage' => 'Бердинген файлче дараазында {{PLURAL:$1|арын шөлүдүп тур|$1 арын шөлүдүп тур}}:',
+'nolinkstoimage' => 'Бердинген файлче шөлүп турар арыннар чок.',
+'sharedupload-desc-here' => 'Моон $1 алган файл өске төлевилелдерге ажыглаттынып болур.
+Ооң [$2 допчу тайылбыр арынындан] медеглели адаанда бердинген.',
 
 # File reversion
 'filerevert' => '$1 эгидип тургузары',
@@ -819,6 +851,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'protectedpages' => 'Камгалаган арыннар',
 'listusers' => 'Ажыглакчылар даңзызы',
 'usereditcount' => '$1 {{PLURAL:$1|эдилге}}',
+'usercreated' => '$1 хүнде $2 {{GENDER:$3|бүрүткенип алган}}',
 'newpages' => 'Чаа арыннар',
 'newpages-username' => 'Ажыглакчының ады:',
 'ancientpages' => 'Эң эрги арыннар',
@@ -885,15 +918,15 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 # Watchlist
 'watchlist' => 'Мээң хайгаарал даңзым',
-'mywatchlist' => 'Ð\9cÑ\8dÑ\8dÒ£ Ñ\85айгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bм',
+'mywatchlist' => 'ХайгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8b',
 'watchlistfor2' => '$1, силерге $2',
-'nowatchlist' => 'Чүү-даа Ñ\81илеÑ\80ниң Ñ\85айгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bзÑ\8bнда Ñ\87ок.',
+'nowatchlist' => 'СилеÑ\80ниң Ñ\85айгааÑ\80ал Ð´Ð°Ò£Ð·Ñ\8bңаÑ\80 ÐºÑ\83Ñ\80Ñ\83г.',
 'watchnologin' => 'Кирбес',
 'watch' => 'Хайгаараары',
 'watchthispage' => 'Бо арынны хайгаараары',
 'unwatch' => 'Хайгааравас',
 'unwatchthispage' => 'Бо арынны хайгаарабас',
-'watchlist-details' => 'Not counting talk pages, хайгаарал даңзыңарда {{PLURAL:$1|$1 арын}} бар.',
+'watchlist-details' => 'Чугаалажылга арыннарын санаваска, хайгаарал даңзыңарда {{PLURAL:$1|$1 арын}} бар.',
 'wlshowlast' => 'Сөөлү $1 шак болгаш $2 хүн иштинде $3 көргүзери',
 'watchlist-options' => 'Хайгаарал даңзының эдиглери',
 
@@ -901,9 +934,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'watching' => 'Хайгаарап турар...',
 'unwatching' => 'Хайгааравайн турар...',
 
-'enotif_newpagetext' => 'Бо чаа арын-дыр.',
 'enotif_impersonal_salutation' => '{{grammar:genitive|{{SITENAME}}}} ажыглакчызы',
-'changed' => 'өскертти',
 'enotif_anon_editor' => 'ат эвес ажыглакчы $1',
 
 # Delete
@@ -947,12 +978,13 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 # Namespace form on various pages
 'namespace' => 'Аттар делгеми:',
+'invert' => 'Шилээнин аңдарар. (Обратить выбранное)',
 'blanknamespace' => '(Кол)',
 
 # Contributions
 'contributions' => 'Ажыглакчыниң салыышкыннары',
 'contributions-title' => '«$1» деп ажыглакчының салыышкыннары',
-'mycontris' => 'Ð\9cÑ\8dÑ\8dÒ£ Ñ\81алÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80Ñ\8bм',
+'mycontris' => 'СалÑ\8bÑ\8bÑ\88кÑ\8bннаÑ\80',
 'contribsub2' => '$1 ($2)',
 'uctop' => '(баш)',
 'month' => 'Айдан:',
@@ -965,13 +997,15 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'sp-contributions-talk' => 'чугаалажыры',
 'sp-contributions-search' => 'Салыышкыннарын дилээри',
 'sp-contributions-username' => 'ИП-адрес азы ажыглачының ады:',
+'sp-contributions-toponly' => 'Чазалгаларның чүгле сөөлгү хевирлерин көргүзер',
 'sp-contributions-submit' => 'Дилээри',
 
 # What links here
 'whatlinkshere' => 'Шөлүлгелерни бээр',
 'whatlinkshere-title' => '«$1» деп арынга шөлүтген арыннар',
 'whatlinkshere-page' => 'Арын:',
-'nolinkshere' => "'''[[:$1]]''' деп арынга шөлүтген арыннар чок.",
+'linkshere' => "Адаандагы арыннар бээр «'''[[:$1]]'''» шөлүдүп турарлар:",
+'nolinkshere' => "'''[[:$1]]''' деп арынче шөлүтткен арыннар чок.",
 'isredirect' => 'шиглидер арын',
 'istemplate' => 'киирткен арыннар',
 'isimage' => 'файлдың холбаазы',
@@ -981,7 +1015,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'whatlinkshere-hideredirs' => '$1-че шиглиглер',
 'whatlinkshere-hidetrans' => '$1 даңзылааннар',
 'whatlinkshere-hidelinks' => 'холбааларны $1',
-'whatlinkshere-hideimages' => 'ЧÑ\83Ñ\80Ñ\83малдың холбааларын $1',
+'whatlinkshere-hideimages' => 'Файлдың холбааларын $1',
 'whatlinkshere-filters' => 'Шүүрлер',
 
 # Block/unblock
@@ -1044,7 +1078,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 
 # Thumbnails
 'thumbnail-more' => 'Улгаттыр',
-'thumbnail_error' => 'Error creating бичии чурумал: $1',
+'thumbnail_error' => 'Биче чурумал (миниатюра) чаяарының алдаа: $1',
 
 # Special:Import
 'import-comment' => 'Тайылбыр:',
@@ -1056,6 +1090,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'tooltip-pt-userpage' => 'Силерниң ажыглакчы арыныңнар',
 'tooltip-pt-mytalk' => 'Силерниң чугаалажыр арыныңар',
 'tooltip-pt-preferences' => 'Силерниң шилилгеңер',
+'tooltip-pt-watchlist' => 'Карактап (хынап) турар өскертилгелерге хамааржыр арыннарның даңзызы',
 'tooltip-pt-mycontris' => 'Силерниң салыышкыннарыңарның даңзызы',
 'tooltip-pt-login' => 'Маңаа системаже киир бүрүткенип болур, ынчалза-даа ол албан эвес.',
 'tooltip-pt-logout' => 'Үнери',
@@ -1071,6 +1106,7 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'tooltip-ca-watch' => 'Силерниң хайгаарал даңзызынга бо арынны немерелээри',
 'tooltip-ca-unwatch' => 'Силерниң хайгаарал даңзызындан бо арынны ырадыры',
 'tooltip-search' => '{{grammar:locative|{{SITENAME}}}} дилээри',
+'tooltip-search-go' => 'Шак ындыг аттыг арынче щилчиир',
 'tooltip-search-fulltext' => 'Бо бижике арыннардан дилээри',
 'tooltip-p-logo' => 'Кол Арын',
 'tooltip-n-mainpage' => 'Кол Арынны баары',
@@ -1093,15 +1129,20 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 '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-template' => 'Майыкты көөрү',
 'tooltip-ca-nstab-help' => 'Дуза арынын көөрү',
 'tooltip-ca-nstab-category' => 'Бөлүктүң арынын көөрү',
+'tooltip-minoredit' => 'Бо өскертилгени "биче" деп демдеглээр',
 'tooltip-save' => 'Силерниң өскерлиишкиннериңерни шыгжаары',
 'tooltip-preview' => 'Шыгжаар мурнунда силерниң өскерлиишкиннерин чижеглеп көрем!',
+'tooltip-diff' => 'Бо сөзүглелге хамаарыштыр кандыг өскертилгелерни кылган Силер - ону көргүзер.',
+'tooltip-compareselectedversions' => 'Бо арынның шилиттинген ийи хевиринниң ылгалын көөр.',
 'tooltip-watch' => 'Силерниң хайгаарал даңзызынга бо арынны немерелээри',
 'tooltip-rollback' => 'Сөөлгү киржикчиниң өскерилгелерин чаңгыс баскаш, ойталаар',
+'tooltip-undo' => 'Киирген эдигни казааш, ойталалдың чылдагаанын айтыр аргалыг мурнай көргүзүүн көргүзер.',
 'tooltip-summary' => 'Кысказы-биле бижиңер',
 
 # Attribution
@@ -1149,10 +1190,18 @@ It must not be more than $1 {{PLURAL:$1|character|characters}} long.',
 'days' => '{{PLURAL:$1|$1 хүн|$1 хүн}}',
 'ago' => '$1 бурунгаар',
 
+# Bad image list
+'bad_image_list' => 'Формады мындыг боор ужурлуг:
+
+Чүгле даңзының идегеттери (элементилери) санатынар боор (* деп демдектен эгелээн одуруглар).
+Одуругнуң бирги шөлүдүү салдынмас чурумалче шөлүдүг болуру албан.
+Ол-ла одуругнуң арткан шөлүдүглери онзагай кылдыр азы чурумал капсырып болур чүүлдер кылдыр санаттынар.',
+
 # Metadata
 'metadata' => 'Чурумал дугайында медээлер',
-'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.
+'metadata-help' => 'Бо файл немелде данныйларлыг:санныг камералар азы сканнерлер дугайында медеглел. Файл чаяанының соонда эдидип турган болза, чамдык параметрлери амгы чурумалга меге кылдыр хамааржып болур.',
+'metadata-fields' => 'Бо даңзыда айыткан чурумалдар метаданныйларның кезектери чурумалдың арынынга көстүп кээр, метаданныйлар таблицазын дүрүп каан болур. 
+Арткан кезектер аайлаан ёзугаар чажыт көстүр.
 * make
 * model
 * datetimeoriginal
@@ -1189,7 +1238,8 @@ Others will be hidden by default.
 'exif-iimcategory-wea' => 'Агаар',
 
 # External editor support
-'edit-externally' => 'Бо файлды даштыки application-биле эдер',
+'edit-externally' => 'Бо файлды даштыкы капсырылга-биле эдер',
+'edit-externally-help' => '(Улаштыр тодарадырда бо [//www.mediawiki.org/wiki/Manual:External_editors кыстып алыр саавырны] көрүңер)',
 
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'шупту',
@@ -1235,6 +1285,9 @@ Others will be hidden by default.
 'watchlisttools-edit' => 'Хайгаарал даңзыны көөрү/эдери',
 'watchlisttools-raw' => 'Чиг хайгаарал даңзыны өскертири',
 
+# Core parser functions
+'duplicate-defaultsort' => 'Кичээнгейлиг! Үндезин сорттаашкын дүлгүүрү «$2» биеэги үндезин сорттаашкын дүлгүүрүн «$1» ажыр тодарадып турар.',
+
 # Special:Version
 'version' => 'Үндүрери',
 'version-specialpages' => 'Тускай арыннар',
@@ -1260,7 +1313,7 @@ Others will be hidden by default.
 'blankpage' => 'Куруг арын',
 
 # Special:Tags
-'tag-filter' => '[[Special:Tags|Tag]] шүүр:',
+'tag-filter' => '[[Special:Tags|демдек]] шүүрү:',
 'tag-filter-submit' => 'Шүүрү',
 'tags-title' => 'Демдеглелдер',
 'tags-edit' => 'өскертири',
index 1c5a17c..74e0783 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Udmurt (Удмурт)
+/** Udmurt (удмурт)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -44,215 +44,215 @@ $separatorTransformTable = array( ',' => "\xc2\xa0", '.' => ',' );
 
 $messages = array(
 # User preference toggles
-'tog-underline'               => 'Линкъёс ултӥз гожен сызоно',
-'tog-hideminor'               => 'Берпуметӥ тупатонъёслэн списоксэс ичи воштонъёстэк возьматыны',
-'tog-hidepatrolled'           => 'Берпуметӥ тупатонъёслэн списоксэс партрулировать каремын воштонъёстэк возьматыны',
-'tog-newpageshidepatrolled'   => 'Выль бамъёслэн списоксэс партрулировать каремын бамъёстэк возьматыны',
-'tog-extendwatchlist'         => 'Чаклан списокын вань тупатонъёсты возьматыны (озьытэк берпуметӥоссэс гинэ)',
-'tog-usenewrc'                => 'Выль тупатонъёслэн списоксэс умояллям сямен возьматыны (JavsScript кулэ)',
-'tog-numberheadings'          => 'Заголовокъёсты автоматически нумеровать карыны',
-'tog-showtoolbar'             => 'Тупатон тӥрлыкъёслэн панельзэс возьматыны (JavaScript кулэ)',
-'tog-editondblclick'          => 'Бамъёсты шырлэн валтӥсь зӥбонэз кык пол ӝог зӥбиськыкуз тупатыны (JavaScript кулэ)',
-'tog-editsection'             => 'Котькуд секциез [тапатоно] чӧлсконэн возьматыны',
+'tog-underline' => 'Линкъёс ултӥз гожен сызоно',
+'tog-hideminor' => 'Берпуметӥ тупатонъёслэн списоксэс ичи воштонъёстэк возьматыны',
+'tog-hidepatrolled' => 'Берпуметӥ тупатонъёслэн списоксэс партрулировать каремын воштонъёстэк возьматыны',
+'tog-newpageshidepatrolled' => 'Выль бамъёслэн списоксэс партрулировать каремын бамъёстэк возьматыны',
+'tog-extendwatchlist' => 'Чаклан списокын вань тупатонъёсты возьматыны (озьытэк берпуметӥоссэс гинэ)',
+'tog-usenewrc' => 'Выль тупатонъёслэн списоксэс умояллям сямен возьматыны (JavsScript кулэ)',
+'tog-numberheadings' => 'Заголовокъёсты автоматически нумеровать карыны',
+'tog-showtoolbar' => 'Тупатон тӥрлыкъёслэн панельзэс возьматыны (JavaScript кулэ)',
+'tog-editondblclick' => 'Бамъёсты шырлэн валтӥсь зӥбонэз кык пол ӝог зӥбиськыкуз тупатыны (JavaScript кулэ)',
+'tog-editsection' => 'Котькуд секциез [тапатоно] чӧлсконэн возьматыны',
 'tog-editsectiononrightclick' => 'Cекциосты шырлэн бур кнопкаез заголовок вылын зӥбиськыкуз тупатыны (JavaScript кулэ)',
-'tog-showtoc'                 => 'Пуштросэз возьматоно (2-лэсь трос заголовокъем бамъёс понна)',
-'tog-rememberpassword'        => 'Мынам пыроннимме та браузерлэн тодаз возьыны ($1 яке $1-лэсь ӧжытгес нунал ӵоже гинэ)',
-'tog-watchcreations'          => 'Бамъёсты, кудъёстэс мон кылдытӥсько, мынам чаклкан списокам пыртыны',
-'tog-watchdefault'            => 'Бамъёсты, кудъёстэс мон тупатӥсько, мынам чаклкан списокам пыртыны',
-'tog-watchmoves'              => 'Бамъёсты, кудъёстэс мон мукет интые выжтӥсько, мынам чаклкан списокам пыртыны',
-'tog-watchdeletion'           => 'Бамъёсты, кудъёстэс мон ӵушисько, мынам чаклкан списоке пыртыны',
-'tog-minordefault'            => 'Вань воштонъёсты «ичи воштон» пусэн пусйыны',
-'tog-previewontop'            => 'Утён азьвыл учконлэсь укнозэ тупатон укнолэсь азьвылгес возьматыны',
-'tog-previewonfirst'          => 'Бам нырысьсэ утиськыкуз уётн азьвыл учконэз возьматыны',
-
-'underline-always'  => 'Котьку',
-'underline-never'   => 'Ноку',
+'tog-showtoc' => 'Пуштросэз возьматоно (2-лэсь трос заголовокъем бамъёс понна)',
+'tog-rememberpassword' => 'Мынам пыроннимме та браузерлэн тодаз возьыны ($1 яке $1-лэсь ӧжытгес нунал ӵоже гинэ)',
+'tog-watchcreations' => 'Бамъёсты, кудъёстэс мон кылдытӥсько, мынам чаклкан списокам пыртыны',
+'tog-watchdefault' => 'Бамъёсты, кудъёстэс мон тупатӥсько, мынам чаклкан списокам пыртыны',
+'tog-watchmoves' => 'Бамъёсты, кудъёстэс мон мукет интые выжтӥсько, мынам чаклкан списокам пыртыны',
+'tog-watchdeletion' => 'Бамъёсты, кудъёстэс мон ӵушисько, мынам чаклкан списоке пыртыны',
+'tog-minordefault' => 'Вань воштонъёсты «ичи воштон» пусэн пусйыны',
+'tog-previewontop' => 'Утён азьвыл учконлэсь укнозэ тупатон укнолэсь азьвылгес возьматыны',
+'tog-previewonfirst' => 'Бам нырысьсэ утиськыкуз уётн азьвыл учконэз возьматыны',
+
+'underline-always' => 'Котьку',
+'underline-never' => 'Ноку',
 'underline-default' => 'Браузерысь настройкаосты уже кутоно',
 
 # Font style option in Special:Preferences
-'editfont-style'     => 'Тупатон бусыысь шрифтлэн стилез',
-'editfont-default'   => 'Браузерлэн настройкаосысьтыз шрифтэз уже кутоно',
+'editfont-style' => 'Тупатон бусыысь шрифтлэн стилез',
+'editfont-default' => 'Браузерлэн настройкаосысьтыз шрифтэз уже кутоно',
 'editfont-monospace' => 'Огпасьтала пусъёсын шрифт',
 'editfont-sansserif' => 'Засечкатэк шрифт',
-'editfont-serif'     => 'Засечкаен шрифт',
+'editfont-serif' => 'Засечкаен шрифт',
 
 # Dates
-'sunday'        => 'арнянунал',
-'monday'        => 'вордӥськон',
-'tuesday'       => 'пуксён',
-'wednesday'     => 'вирнунал',
-'thursday'      => 'покчиарня',
-'friday'        => 'удмуртарня',
-'saturday'      => 'кӧснунал',
-'sun'           => 'Арн',
-'mon'           => 'Врд',
-'tue'           => 'Пкс',
-'wed'           => 'Врн',
-'thu'           => 'Пкч',
-'fri'           => 'Удм',
-'sat'           => 'Ксн',
-'january'       => 'толшор',
-'february'      => 'тулыспал',
-'march'         => 'южтолэзь',
-'april'         => 'оштолэзь',
-'may_long'      => 'куартолэзь',
-'june'          => 'инвожо',
-'july'          => 'пӧсьтолэзь',
-'august'        => 'гудырикошкон',
-'september'     => 'куарусён',
-'october'       => 'коньывуон',
-'november'      => 'шуркынмон',
-'december'      => 'толсур',
-'january-gen'   => 'толшоре',
-'february-gen'  => 'тулыспалэ',
-'march-gen'     => 'южтолэзе',
-'april-gen'     => 'оштолэзе',
-'may-gen'       => 'куартолэзе',
-'june-gen'      => 'инвожое',
-'july-gen'      => 'пӧсьтолэзе',
-'august-gen'    => 'гудырикошконэ',
+'sunday' => 'арнянунал',
+'monday' => 'вордӥськон',
+'tuesday' => 'пуксён',
+'wednesday' => 'вирнунал',
+'thursday' => 'покчиарня',
+'friday' => 'удмуртарня',
+'saturday' => 'кӧснунал',
+'sun' => 'Арн',
+'mon' => 'Врд',
+'tue' => 'Пкс',
+'wed' => 'Врн',
+'thu' => 'Пкч',
+'fri' => 'Удм',
+'sat' => 'Ксн',
+'january' => 'толшор',
+'february' => 'тулыспал',
+'march' => 'южтолэзь',
+'april' => 'оштолэзь',
+'may_long' => 'куартолэзь',
+'june' => 'инвожо',
+'july' => 'пӧсьтолэзь',
+'august' => 'гудырикошкон',
+'september' => 'куарусён',
+'october' => 'коньывуон',
+'november' => 'шуркынмон',
+'december' => 'толсур',
+'january-gen' => 'толшоре',
+'february-gen' => 'тулыспалэ',
+'march-gen' => 'южтолэзе',
+'april-gen' => 'оштолэзе',
+'may-gen' => 'куартолэзе',
+'june-gen' => 'инвожое',
+'july-gen' => 'пӧсьтолэзе',
+'august-gen' => 'гудырикошконэ',
 'september-gen' => 'куарусёнэ',
-'october-gen'   => 'коньывуонэ',
-'november-gen'  => 'шуркынмонэ',
-'december-gen'  => 'толсурэ',
-'jan'           => 'тшт',
-'feb'           => 'тпт',
-'mar'           => 'южт',
-'apr'           => 'ошт',
-'may'           => 'южт',
-'jun'           => 'ивт',
-'jul'           => 'пст',
-'aug'           => 'гкт',
-'sep'           => 'кст',
-'oct'           => 'квт',
-'nov'           => 'шкт',
-'dec'           => 'тст',
+'october-gen' => 'коньывуонэ',
+'november-gen' => 'шуркынмонэ',
+'december-gen' => 'толсурэ',
+'jan' => 'тшт',
+'feb' => 'тпт',
+'mar' => 'южт',
+'apr' => 'ошт',
+'may' => 'южт',
+'jun' => 'ивт',
+'jul' => 'пст',
+'aug' => 'гкт',
+'sep' => 'кст',
+'oct' => 'квт',
+'nov' => 'шкт',
+'dec' => 'тст',
 
 # Categories related messages
-'pagecategories'                 => '$1 категория',
-'category_header'                => '«$1» категориысь бамъёс',
-'subcategories'                  => 'Подкатегориос',
-'category-media-header'          => '«$1» категориысь файлъёс',
-'category-empty'                 => "''Та категориын али бамъёс но, файлъёс но ӧвӧл.''",
-'hidden-categories'              => '{{PLURAL:$1|Ватэм категория|Ватэм категориос}}',
-'hidden-category-category'       => 'Ватэм категориос',
-'category-subcat-count'          => '{{PLURAL:$2|Со категориын одӥг подкатегория гинэ.|Возьматэмын $1 подкатегория $2 пӧлысь.}}',
-'category-subcat-count-limited'  => 'Со категориын $1 подкатегория.',
-'category-article-count'         => '{{PLURAL:$2|Со категориын одӥг бам гинэ.|Возьматэмын $1 бам $2 пӧлысь.}}',
+'pagecategories' => '$1 категория',
+'category_header' => '«$1» категориысь бамъёс',
+'subcategories' => 'Подкатегориос',
+'category-media-header' => '«$1» категориысь файлъёс',
+'category-empty' => "''Та категориын али бамъёс но, файлъёс но ӧвӧл.''",
+'hidden-categories' => '{{PLURAL:$1|Ватэм категория|Ватэм категориос}}',
+'hidden-category-category' => 'Ватэм категориос',
+'category-subcat-count' => '{{PLURAL:$2|Со категориын одӥг подкатегория гинэ.|Возьматэмын $1 подкатегория $2 пӧлысь.}}',
+'category-subcat-count-limited' => 'Со категориын $1 подкатегория.',
+'category-article-count' => '{{PLURAL:$2|Со категориын одӥг бам гинэ.|Возьматэмын $1 бам $2 пӧлысь.}}',
 'category-article-count-limited' => 'Со категориын $1 бам.',
-'category-file-count'            => '{{PLURAL:$2|Со категориын одӥг файл гинэ.|Возьматэмын $1 файл $2 пӧлысь.}}',
-'category-file-count-limited'    => 'Со категориын $1 файл.',
-'listingcontinuesabbrev'         => 'азьлань',
-'index-category'                 => 'Индексировать кароно бамъёс',
-'noindex-category'               => 'Индексировать каронтэм бамъёс',
+'category-file-count' => '{{PLURAL:$2|Со категориын одӥг файл гинэ.|Возьматэмын $1 файл $2 пӧлысь.}}',
+'category-file-count-limited' => 'Со категориын $1 файл.',
+'listingcontinuesabbrev' => 'азьлань',
+'index-category' => 'Индексировать кароно бамъёс',
+'noindex-category' => 'Индексировать каронтэм бамъёс',
 
 'linkprefix' => '/^(.*?)(„|«)$/sDu',
 
-'about'      => 'Та сярысь',
-'article'    => 'Статья',
-'mypage'     => 'Ас бам',
-'mytalk'     => 'викиавтор сярысь вераськон',
-'anontalk'   => 'Со IP-адрес сярысь вераськон',
+'about' => 'Та сярысь',
+'article' => 'Статья',
+'mypage' => 'Ас бам',
+'mytalk' => 'викиавтор сярысь вераськон',
+'anontalk' => 'Со IP-адрес сярысь вераськон',
 'navigation' => 'Навигация',
 
 # Cologne Blue skin
-'qbpageoptions'  => 'Бамлэн настройкаосыз',
+'qbpageoptions' => 'Бамлэн настройкаосыз',
 'qbspecialpages' => 'Ваньмыз панельёс',
-'faq'            => 'Юан-веран',
-'faqpage'        => 'Project:Юан-веран',
+'faq' => 'Юан-веран',
+'faqpage' => 'Project:Юан-веран',
 
 # Vector skin
 'vector-action-addsection' => 'Выль темаез ватсано',
-'vector-action-delete'     => 'Быдтоно',
-'vector-action-move'       => 'Мукет интые выжтыны',
-'vector-action-protect'    => 'Утьыны',
-'vector-view-create'       => 'Кылдытоно',
-'vector-view-edit'         => 'Тупатоно',
-'vector-view-history'      => 'История',
-'vector-view-view'         => 'Лыдӟоно',
-'vector-view-viewsource'   => 'Кодзэ учкыны',
-
-'errorpagetitle'   => 'Янгыш',
-'tagline'          => '{{SITENAME}}-ысь материал',
-'help'             => 'Валэктонъёс',
-'search'           => 'Утчан',
-'searchbutton'     => 'Утчано',
-'searcharticle'    => 'Мыноно',
-'history'          => 'Бамлэн историез',
-'history_short'    => 'история',
+'vector-action-delete' => 'Быдтоно',
+'vector-action-move' => 'Мукет интые выжтыны',
+'vector-action-protect' => 'Утьыны',
+'vector-view-create' => 'Кылдытоно',
+'vector-view-edit' => 'Тупатоно',
+'vector-view-history' => 'История',
+'vector-view-view' => 'Лыдӟоно',
+'vector-view-viewsource' => 'Кодзэ учкыны',
+
+'errorpagetitle' => 'Янгыш',
+'tagline' => '{{SITENAME}}-ысь материал',
+'help' => 'Валэктонъёс',
+'search' => 'Утчан',
+'searchbutton' => 'Утчано',
+'searcharticle' => 'Мыноно',
+'history' => 'Бамлэн историез',
+'history_short' => 'история',
 'printableversion' => 'Печатламон версия',
-'permalink'        => 'Ӵапак та версиезлы линк',
-'print'            => 'Печатлано',
-'edit'             => 'тупатыны',
-'delete'           => 'Быдтыны',
-'protect'          => 'Утьыны',
+'permalink' => 'Ӵапак та версиезлы линк',
+'print' => 'Печатлано',
+'edit' => 'тупатыны',
+'delete' => 'Быдтыны',
+'protect' => 'Утьыны',
 'talkpagelinktext' => 'Вераськон',
-'talk'             => 'Вераськон',
-'toolbox'          => 'Инструментъёс',
+'talk' => 'Вераськон',
+'toolbox' => 'Инструментъёс',
 'jumptonavigation' => 'навигация',
-'jumptosearch'     => 'утчан',
+'jumptosearch' => 'утчан',
 
 # 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).
-'currentevents'        => 'Выль иворъёс',
-'currentevents-url'    => 'Project:Выль иворъёс',
-'helppage'             => 'Help:Валэктон',
-'mainpage'             => 'Кутскон бам',
+'currentevents' => 'Выль иворъёс',
+'currentevents-url' => 'Project:Выль иворъёс',
+'helppage' => 'Help:Валэктон',
+'mainpage' => 'Кутскон бам',
 'mainpage-description' => 'Кутскон бам',
-'portal'               => 'Сообщество',
-'portal-url'           => 'Project:Портал сообщества',
+'portal' => 'Сообщество',
+'portal-url' => 'Project:Портал сообщества',
 
-'retrievedfrom'   => '«$1»-лэсь басьтэмын',
-'editsection'     => 'тупатыны',
+'retrievedfrom' => '«$1»-лэсь басьтэмын',
+'editsection' => 'тупатыны',
 'editsectionhint' => '$1 секциез тупатоно',
-'site-rss-feed'   => '$1 — RSS-лента',
-'site-atom-feed'  => '$1 — Atom-лента',
-'red-link-title'  => '$1 (со бам ӧвӧл на)',
+'site-rss-feed' => '$1 — RSS-лента',
+'site-atom-feed' => '$1 — Atom-лента',
+'red-link-title' => '$1 (со бам ӧвӧл на)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-user'      => 'Викиавтор',
+'nstab-user' => 'Викиавтор',
 'nstab-mediawiki' => 'Ивортон',
 
 # General errors
 'viewsource' => 'Кодзэ учкыны',
 
 # Login and logout pages
-'login'                   => 'Википедие пырон',
+'login' => 'Википедие пырон',
 'nav-login-createaccount' => 'Нимдэс вераны / Регистрациез ортчытыны',
-'userlogin'               => 'Регистрациез ортчытыны яке Википедие пырыны',
-'logout'                  => 'Кошкыны',
-'userlogout'              => 'Кошкыны',
-'createaccount'           => 'выль вики-авторлэн регистрациез',
+'userlogin' => 'Регистрациез ортчытыны яке Википедие пырыны',
+'logout' => 'Кошкыны',
+'userlogout' => 'Кошкыны',
+'createaccount' => 'выль вики-авторлэн регистрациез',
 
 # Edit pages
-'summary'       => 'Мар но малы тупатэмын? (вакчияк):',
-'minoredit'     => 'Ичи воштон',
+'summary' => 'Мар но малы тупатэмын? (вакчияк):',
+'minoredit' => 'Ичи воштон',
 'noarticletext' => "В настоящий момент текст на данной странице отсутствует.
 Вы можете [[Special:Search/{{PAGENAME}}|найти упоминание данного названия]] на других страницах,
 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} найти соответствующие записи журналов],
 или '''[{{fullurl:{{FULLPAGENAME}}|action=edit}} создать страницу с таким названием]'''</span>.",
 
 # Revision deletion
-'revdelete-radio-set'   => 'Бен',
+'revdelete-radio-set' => 'Бен',
 'revdelete-radio-unset' => 'Ӧвӧл',
 
 # Search results
-'searchresults'      => 'Шедьтэмын',
-'searchresulttext'   => 'Проектлэн бамъёстӥз утчан сярысь тыро-быдогес тодэмды потӥз ке, учке [[{{MediaWiki:Helppage}}|«Юан-веран» люкетэз]].',
-'searchhelp-url'     => 'Help:Валэктон',
+'searchresults' => 'Шедьтэмын',
+'searchresulttext' => 'Проектлэн бамъёстӥз утчан сярысь тыро-быдогес тодэмды потӥз ке, учке [[{{MediaWiki:Helppage}}|«Юан-веран» люкетэз]].',
+'searchhelp-url' => 'Help:Валэктон',
 'search-result-size' => '$1 кыл({{PLURAL:$2|1 word|$2 words}})',
 
 # Preferences page
-'preferences'     => 'настройкаос',
-'mypreferences'   => 'Настройкаос',
+'preferences' => 'настройкаос',
+'mypreferences' => 'Настройкаос',
 'prefs-watchlist' => 'Чаклан список',
 
 # Recent changes
 'recentchanges' => 'Выль тупатонъёс',
-'hist'          => 'история',
+'hist' => 'история',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Герӟаськем тупатонъёс',
-'recentchangeslinked-feed'    => 'Герӟаськем тупатонъёс',
+'recentchangeslinked' => 'Герӟаськем тупатонъёс',
+'recentchangeslinked-feed' => 'Герӟаськем тупатонъёс',
 'recentchangeslinked-toolbox' => 'Герӟаськем тупатонъёс',
 
 # Upload
@@ -266,16 +266,16 @@ $messages = array(
 
 # Miscellaneous special pages
 'nbytes' => '$1 байт',
-'move'   => 'Мукет интые выжтыны',
+'move' => 'Мукет интые выжтыны',
 
 # E-mail user
 'emailmessage' => 'Ивортон:',
 
 # Watchlist
-'watchlist'   => 'Чаклано статьяос',
+'watchlist' => 'Чаклано статьяос',
 'mywatchlist' => 'Чаклан список',
-'watch'       => 'Чаклано',
-'unwatch'     => 'Чакламысь дугдыны',
+'watch' => 'Чаклано',
+'unwatch' => 'Чакламысь дугдыны',
 
 # Contributions
 'mycontris' => 'Мынам гожтэмъёсы',
@@ -284,23 +284,23 @@ $messages = array(
 'whatlinkshere' => 'Татчы линкъёс',
 
 # Move page
-'movearticle'     => 'Статьяез мукет интые выжтыны',
-'move-watch'      => 'Та бамез чаклан списоке пыртыны',
+'movearticle' => 'Статьяез мукет интые выжтыны',
+'move-watch' => 'Та бамез чаклан списоке пыртыны',
 'delete_and_move' => 'Быдтыны но мукет интые выжтыны',
 
 # Namespace 8 related
 'allmessagesname' => 'Ивортон',
 
 # Tooltip help for the actions
-'tooltip-ca-talk'                => 'Бамлэн контентэз сярысь вераськон',
-'tooltip-search'                 => 'Утчано {{SITENAME}}',
-'tooltip-n-mainpage'             => 'Кутскон баме мыноно',
+'tooltip-ca-talk' => 'Бамлэн контентэз сярысь вераськон',
+'tooltip-search' => 'Утчано {{SITENAME}}',
+'tooltip-n-mainpage' => 'Кутскон баме мыноно',
 'tooltip-n-mainpage-description' => 'Кутскон баме мыноно',
-'tooltip-n-portal'               => 'Проект сярысь, мар карыны быгатоды, ужлы кулэ луэмзэ кытысь шедьтоно',
-'tooltip-n-recentchanges'        => 'Берпуметӥ тупатонъёслэн списоксы',
-'tooltip-n-randompage'           => 'Олокыӵе бамез учконо',
-'tooltip-t-whatlinkshere'        => 'Ваньмыз бамъёс, кудъёсаз та бамлы линксы вань',
-'tooltip-t-specialpages'         => 'Специальной бамъёслэн списоксы',
+'tooltip-n-portal' => 'Проект сярысь, мар карыны быгатоды, ужлы кулэ луэмзэ кытысь шедьтоно',
+'tooltip-n-recentchanges' => 'Берпуметӥ тупатонъёслэн списоксы',
+'tooltip-n-randompage' => 'Олокыӵе бамез учконо',
+'tooltip-t-whatlinkshere' => 'Ваньмыз бамъёс, кудъёсаз та бамлы линксы вань',
+'tooltip-t-specialpages' => 'Специальной бамъёслэн списоксы',
 
 # Special:SpecialPages
 'specialpages' => 'Ваньмыз панельёс',
index bf2740e..736b311 100644 (file)
@@ -8,6 +8,7 @@
  * @file
  *
  * @author Alfredie
+ * @author Arlin
  * @author Kaganer
  * @author Reedy
  * @author Sahran
@@ -108,45 +109,45 @@ $messages = array(
 'thu' => 'پ',
 'fri' => 'ج',
 'sat' => 'ش',
-'january' => 'Ù\82Û\95ھرÙ\89تاÙ\86',
-'february' => 'ھۇت',
-'march' => 'Ù\86Û\95Û\8bرÛ\87ز',
-'april' => 'ئۇمۇت',
-'may_long' => 'باھار',
-'june' => 'سÛ\95Ù¾Û\95ر',
-'july' => 'چىللە',
-'august' => 'تÙ\88Ù\85Û\87ز',
-'september' => 'مىزان',
-'october' => 'ئوغۇز',
-'november' => 'ئوغلاق',
-'december' => 'كۆنەك',
-'january-gen' => 'Ù\82Û\95ھرÙ\89تاÙ\86',
-'february-gen' => 'ھۇت',
-'march-gen' => 'Ù\86Û\95Û\8bرÛ\87ز',
-'april-gen' => 'ئۇمۇت',
-'may-gen' => 'باھار',
-'june-gen' => 'سÛ\95Ù¾Û\95ر',
-'july-gen' => 'چىللە',
-'august-gen' => 'تÙ\88Ù\85Û\87ز',
-'september-gen' => 'مىزان',
-'october-gen' => 'ئوغۇز',
-'november-gen' => 'ئوغلاق',
-'december-gen' => 'كۆنەك',
-'jan' => 'Ù\82Û\95ھرÙ\89تاÙ\86',
-'feb' => 'ھۇت',
-'mar' => 'Ù\86Û\95Û\8bرÛ\87ز',
-'apr' => 'ئۇمۇت',
-'may' => 'باھار',
-'jun' => 'سÛ\95Ù¾Û\95ر',
-'jul' => 'چىللە',
-'aug' => 'تÙ\88Ù\85Û\87ز',
-'sep' => 'مىزان',
-'oct' => 'ئوغۇز',
-'nov' => 'ئوغلاق',
-'dec' => 'كۆنەك',
+'january' => 'Ù\8aاÙ\86Û\8bار',
+'february' => 'فېۋرال',
+'march' => 'Ù\85ارت',
+'april' => 'ئاپرېل',
+'may_long' => 'ماي',
+'june' => 'ئÙ\89Ù\8aÛ\87Ù\86',
+'july' => 'ئىيۇل',
+'august' => 'ئاÛ\8bغÛ\87ست',
+'september' => 'سىنتەبىر',
+'october' => 'ئۆكتەبىر',
+'november' => 'نويابىر',
+'december' => 'دېكابىر',
+'january-gen' => 'Ù\8aاÙ\86Û\8bار',
+'february-gen' => 'فېۋرال',
+'march-gen' => 'Ù\85ارت',
+'april-gen' => 'ئاپرېل',
+'may-gen' => 'ماي',
+'june-gen' => 'ئÙ\89Ù\8aÛ\87Ù\86',
+'july-gen' => 'ئىيۇل',
+'august-gen' => 'ئاÛ\8bغÛ\87ست',
+'september-gen' => 'سىنتەبىر',
+'october-gen' => 'ئۆكتەبىر',
+'november-gen' => 'نويابىر',
+'december-gen' => 'دېكابىر',
+'jan' => 'Ù\8aاÙ\86Û\8bار',
+'feb' => 'فېۋرال',
+'mar' => 'Ù\85ارت',
+'apr' => 'ئاپرېل',
+'may' => 'ماي',
+'jun' => 'ئÙ\89Ù\8aÛ\87Ù\86',
+'jul' => 'ئىيۇل',
+'aug' => 'ئاÛ\8bغÛ\87ست',
+'sep' => 'سىنتەبىر',
+'oct' => 'ئۆكتەبىر',
+'nov' => 'نويابىر',
+'dec' => 'دېكابىر',
 
 # Categories related messages
-'pagecategories' => '{{PLURAL:$1|تۈر|تۈر}}',
+'pagecategories' => '{{PLURAL:$1|تۈر|تۈرلەر}}',
 'category_header' => '"$1" تۈردىكى بەتلەر',
 'subcategories' => 'تارماق تۈر',
 'category-media-header' => '"$1" تۈردىكى ۋاسىتە',
@@ -168,7 +169,7 @@ $messages = array(
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
 'about' => 'ھەققىدە',
-'article' => 'Ù\85Û\95زÙ\85Û\87Ù\86 Ø¨Û\90تÙ\89',
+'article' => 'Ù\85Û\87Ù\86دÛ\95رÙ\89جÛ\95',
 'newwindow' => '(يېڭى كۆزنەكتە ئاچ)',
 'cancel' => 'ۋاز كەچ',
 'moredotdotdot' => 'تەپسىلىي…',
@@ -183,7 +184,6 @@ $messages = array(
 'qbbrowse' => 'كۆز يۈگۈرت',
 'qbedit' => 'تەھرىر',
 'qbpageoptions' => 'بۇ بەت',
-'qbpageinfo' => 'كونتېكست',
 'qbmyoptions' => 'بەتلەرىم',
 'qbspecialpages' => 'ئالاھىدە بەتلەر',
 'faq' => 'كۆپ كۆرۈلىدىغان مەسىلىلەر',
@@ -196,7 +196,7 @@ $messages = array(
 'vector-action-protect' => 'قوغدا',
 'vector-action-undelete' => 'ئەسلىگە قايتۇر',
 'vector-action-unprotect' => 'قوغداش ئۆزگەرت',
-'vector-simplesearch-preference' => 'ئالىي ئىزدەش تەكلىپىنى ئاچ (Vector تېرىدىلا)',
+'vector-simplesearch-preference' => 'ئاددىي ئىزدەش ئىستون ئاچ (پەقەت ۋېكتور قېلىپ)',
 'vector-view-create' => 'قۇر',
 'vector-view-edit' => 'تەھرىر',
 'vector-view-history' => 'تارىخ كۆرسەت',
@@ -300,6 +300,7 @@ $1',
 [[Special:Version|نەشر بېتى]] نى كۆرۈڭ.',
 
 'ok' => 'ماقۇل',
+'pagetitle' => '$1 - {{SITENAME}}',
 'pagetitle-view-mainpage' => '{{SITENAME}}',
 'backlinksubtitle' => '← $1',
 'retrievedfrom' => '"$1" دىن ئېرىشكەن',
@@ -333,7 +334,7 @@ $1',
 'site-atom-feed' => '$1 نىڭ Atom قانالى',
 'page-rss-feed' => '"$1" نىڭ RSS قانىلى',
 'page-atom-feed' => '"$1" نىڭ Atom قانىلى',
-'feed-atom' => 'ئاتوم',
+'feed-atom' => 'Atom',
 'feed-rss' => 'RSS',
 'red-link-title' => '$1 (بەت مەۋجۇد ئەمەس)',
 'sort-descending' => 'كېمەيگۈچى تەرتىپ',
@@ -370,9 +371,9 @@ URL نى خاتا كىرگۈزۈپ قالدىڭىز ياكى خاتا ئۇلان
 'dberrortext' => 'ساندان سۈرۈشتۈرۈشتە گرامماتىكىلىق خاتالىق يۈز بەردى.
 يۇمشاق دېتالنىڭ ئۆزىدىكى خاتالىقتىن كېلىپ چىققان بولۇشى مۇمكىن.
 ئاخىرقى قېتىملىق ساندان سۈرۈشتۈرۈش بۇيرۇقى:
-<blockquote><tt>$1</tt></blockquote>
\\"<tt>$2</tt>\\"فۇنكسىيىدىن كەلگەن.
-MySQL قايتۇرغان خاتالىق \\"<tt>$3: $4</tt>\\".',
+<blockquote><code>$1</code></blockquote>
"<code>$2</code>"فۇنكسىيىدىن كەلگەن.
+ساندان قايتۇرغان خاتالىق "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'ساندان سۈرۈشتۈرۈشتە گرامماتىكىلىق خاتالىق يۈز بەردى.
 ئاخىرقى قېتىملىق ساندان سۈرۈشتۈرۈش بۇيرۇقى:
 "$1"
@@ -435,7 +436,8 @@ MySQL قايتۇرغان خاتالىقى"$3: $4"',
 'protectedpagetext' => 'بۇ بەت تەھرىرلەشنىڭ ئالدىنى ئېلىش ئۈچۈن قۇلۇپلانغان.',
 'viewsourcetext' => 'سىز بۇ بەتنى ئەسلى كودىنى كۆرەلەيسىز ۋە كۆچۈرەلەيسىز:',
 'viewyourtext' => "بۇ بەتتىكى '''تەھرىرلىگەنلىرىڭىز'''نىڭ ئەسلى كودىنى كۆرۈپ كۆچۈرەلەيسىز.",
-'protectedinterface' => 'بۇ بەت يۇمشاق دېتالنىڭ كۆرۈنۈش تېكستىنى تەمىنلىگەن، خالىغانچە تەھرىرلەشتىن ساقلىنىش ئۈچۈن قۇلۇپلانغان.',
+'protectedinterface' => 'بۇ بەت يۇمشاق دېتالنىڭ كۆرۈنۈش تېكستىنى تەمىنلىگەن، خالىغانچە تەھرىرلەشتىن ساقلىنىش ئۈچۈن قۇلۇپلانغان.
+مەسىلەن ئەگەر تەرجىمە قىلسىڭىز [//translatewiki.net/wiki/Main_Page?setlang=ug translatewiki.net] ئۇنداقتا MediaWiki يەرلىكلەشتۈرۈش پىلانىنى ئىشلىتىشنى ئويلىشىڭ.',
 'editinginterface' => "'''ئاگاھلاندۇرۇش:''' سىز تەھرىرلەۋاتقان بەت يۇمشاق دېتالنىڭ كۆرۈنۈش تېكستىگە ئىشلىتىلىدۇ.
 
 بۇ بەت ئۆزگەرتىلسە باشقا ئىشلەتكۈچىلەرنىڭ كۆرۈنۈش ئۇسلۇبىغا تەسىر كۆرسىتىدۇ.
@@ -468,13 +470,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''ھازىر تىزىمدىن چىقتىڭىز.'''
 
-سىز نامسىز ھالەتتە {{SITENAME}} نى ئىشلىتەلەيسىز ياكى ئوخشاش ۋە ياكى ئوخشاش بولمىغان ئىشلەتكۈچى سالاھىيىتىدە [[Special:UserLogin|تىزىمغا كىر]]ەلەيسىز.
+سىز نامسىز ھالەتتە {{SITENAME}} نى ئىشلىتەلەيسىز ياكى ئوخشاش ۋە ياكى ئوخشاش بولمىغان ئىشلەتكۈچى سالاھىيىتىدە <span class='plainlinks'>[$1 تىزىمغا كىر]</span>ەلەيسىز.
 دىققەت، بەزى بەتلەر توركۆرگۈنىڭ غەملىكى تازىلانمىغۇچە يەنىلا سىزنى تىزىمغا كىرگەن ھالەتتە كۆرسىتىشى مۇمكىن.",
-'welcomecreation' => '==  $1! خۇش كەپسىز ==
-
-ھېساباتىڭىز قۇرۇلدى.
-
-[[Special:Preferences|{{SITENAME}} تەڭشىكىڭىزنى تەڭشەشنى ئۇنتۇپ قالماڭ]].',
 'yourname' => 'ئىشلەتكۈچى ئاتى:',
 'yourpassword' => 'ئىم:',
 'yourpasswordagain' => 'ئاچقۇچنى قايتا بەسىڭ:',
@@ -745,7 +742,7 @@ $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>',
+ سىز باشقا بەتتە [[Special:Search/{{PAGENAME}}|بۇ بەتنىڭ ماۋزۇسىنى ئىزدىيەلەيسىز]] ياكى <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}] مۇناسىۋەتلىك خاتىرىسىنى ئىزدىيەلەيسىز،</span>لىكىن سزنىڭ بەت قۇرۇش ھوقوقىڭز يوق.',
 'missing-revision' => '"{{PAGENAME}}" ئاتلىق بەتنىڭ تۈزىتىلگەن نەشرى #$1 مەۋجۇت ئەمەس.
 
 ئادەتتە بۇ ئۆچۈرۈلگەن بىر بەتنىڭ ئۇلانمىسىغا كىرگەنلىك سەۋەبىدىن بولىدۇ.
@@ -759,7 +756,6 @@ $2
 * '''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:''' دا ''قورال → مايىللىق''؛ نى بېسىپ غەملەكنى تازىلاڭ.",
 'usercssyoucanpreview' => "ئەسكەرتىش:''' ساقلاشتىن ئىلگىرى  \"{{int:showpreview}}\" توپچىنى ئىشلىتىپ يېڭى CSS نى سىناڭ.",
 'userjsyoucanpreview' => "ئەسكەرتىش:''' ساقلاشتىن ئىلگىرى  \"{{int:showpreview}}\" توپچىنى ئىشلىتىپ يېڭى JS نى سىناڭ.",
@@ -862,6 +858,7 @@ $2
 'edit-already-exists' => 'يېڭى بەت قۇرالمىدى
 ئۇ مەۋجۇد.',
 'defaultmessagetext' => 'كۆڭۈلدىكى ئۇچۇر تېكستى',
+'content-failed-to-parse' => '$2 نى $1 گە ئانالىز قلش مەغلۇپ بولدى: $3',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''ئاگاھلاندۇرۇش:''' بۇ بەت ناھايىتى كۆپ يۇقىرى سەرپىياتتىكى گىرامماتىكىلىق ئىقتىدارنى چاقىرغان.\\n
@@ -1113,8 +1110,6 @@ $1",
 'search-interwiki-caption' => 'ھەمشىرە قۇرۇلۇشلار',
 'search-interwiki-default' => '$1 نەتىجە:',
 'search-interwiki-more' => '(تېخىمۇ كۆپ)',
-'search-mwsuggest-enabled' => 'تەكلىپ بار',
-'search-mwsuggest-disabled' => 'تەكلىپ يوق',
 'search-relatedarticle' => 'ئالاقىدار',
 'mwsuggest-disable' => 'AJAX تەكلىپىنى چەكلە',
 'searcheverything-enable' => 'ھەممە ئات بوشلۇقىدىن ئىزدە',
@@ -1227,7 +1222,9 @@ $1",
 'username' => 'ئىشلەتكۇچى ئىسمى:',
 'uid' => 'ئىشلەتكۈچى كىملىك:',
 'prefs-memberingroups' => '{{PLURAL:$1|بىر|كۆپ}} گۇرۇپپا ئەزاسى:',
+'prefs-memberingroups-type' => '$1',
 'prefs-registration' => 'خەتلەتكەن ۋاقىت:',
+'prefs-registration-date-time' => '$1',
 'yourrealname' => 'ﺗﻮﻟﯘﻕ ئىسىم:',
 'yourlanguage' => 'تىل:',
 'yourvariant' => 'مەزمۇن تىل شالغۇتى:',
@@ -1293,6 +1290,7 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'userrights-notallowed' => 'ھېساباتىڭىزنىڭ ئىشلەتكۈچى ھوقۇقىنى قوشۇش ياكى ئۆزگەرتىش ھوقۇقى يوق.',
 'userrights-changeable-col' => 'سىز ئۆزگەرتەلەيدىغان گۇرۇپپا',
 'userrights-unchangeable-col' => 'سىز ئۆزگەرتەلمەيدىغان گۇرۇپپا',
+'userrights-irreversible-marker' => '$1*',
 
 # Groups
 'group' => 'گۇرۇپپا:',
@@ -1447,9 +1445,11 @@ HTML بەلگىسىنى تەكشۈرۈڭ.',
 'minoreditletter' => 'ئازراقلا',
 'newpageletter' => 'يېڭى',
 'boteditletter' => 'ماشىنا ئادەم',
+'unpatrolledletter' => '!',
 'number_of_watching_users_pageview' => '[$1  {{PLURAL:$1|ئىشلەتكۈچى|ئىشلەتكۈچى}}كۆزىتىۋاتىدۇ]',
 'rc_categories' => 'تۈر چېگرىسى ("|" بىلەن ئايرىلىدۇ )',
 'rc_categories_any' => 'خالىغان',
+'rc-change-size' => '$1',
 'newsectionsummary' => '* $1 * يېڭى ئابزاس',
 'rc-enhanced-expand' => 'تەپسىلاتىنى كۆرسەت (JavaScript قوللىشى زۆرۈر)',
 'rc-enhanced-hide' => 'تەپسىلاتىنى يوشۇر',
@@ -1887,6 +1887,7 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 # Book sources
 'booksources' => 'كىتاب مەنبەسى',
 'booksources-search-legend' => 'كىتاب مەنبەسى ئىزدە',
+'booksources-isbn' => 'ISBN:',
 'booksources-go' => 'يۆتكەل',
 'booksources-text' => 'تۆۋەندىكىسى بىر قىسىم تور كىتابخانىلىرىنىڭ تىزىملىكى، ئىچىدە سىز ئىزدىمەكچى بولغان كىتابلارنىڭ تېخىمۇ كۆپ ئۇچۇرى بولۇشى مۇمكىن:',
 'booksources-invalid-isbn' => 'تەمىنلىگەن ISBN نومۇرى توغرا ئەمەس. ئەسلى كۆچۈرگەن مەنبەدىكى نومۇردا خاتالىق بار يوقلۇقىنى تەكشۈرۈڭ.',
@@ -1972,6 +1973,7 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 'listgrouprights-rights' => 'ھوقۇق',
 'listgrouprights-helppage' => 'Help: گۇرۇپپا ھوقۇقى',
 'listgrouprights-members' => '(ئەزالار تىزىملىكى)',
+'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' => 'ھەممە گۇرۇپپىغا قوش',
@@ -2055,11 +2057,7 @@ URL نىڭ توغرىلىقى ۋە تور بېكەتنى زىيارەت قىلى
 
 'enotif_mailer' => '{{SITENAME}} ئېلخەت ئۇقتۇرغۇچ',
 'enotif_reset' => 'ھەممە بەتكە ئوقۇلدى بەلگىسى سال',
-'enotif_newpagetext' => 'بۇ يېڭى بەت.',
 'enotif_impersonal_salutation' => '{{SITENAME}} ئىشلەتكۈچى',
-'changed' => 'ئۆزگەردى',
-'created' => 'قۇرغان',
-'enotif_subject' => '{{SITENAME}} نىڭ $PAGETITLE بېتىنى $CHANGEDORCREATED ئۆزگەرتكۈچى$PAGEEDITOR',
 'enotif_lastvisited' => 'ئالدىنقى قېتىملىق زىيارەتتىن كېيىنكى ھەممە ئۆزگەرتىشنى $1 كۆرۈڭ.',
 'enotif_lastdiff' => 'بۇ ئۆزگەرتىشنى كۆرمەكچى بولسىڭىز $1 كۆرۈڭ.',
 'enotif_anon_editor' => '$1 ئاتسىز ئىشلەتكۈچى',
@@ -2248,6 +2246,7 @@ $2 نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئۆزگەرتىل
 
  [[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دىن پايدىلىنىپ ئۆچۈر ۋە ئەسلىگە كەلتۈر خاتىرىسىنى كۆرۈڭ.",
 'undelete-header' => 'يېقىنقى خاتىرىنى سۈرۈشتۈرمەكچى بولسىڭىز [[Special:Log/delete|ئۆچۈرۈش خاتىرىسى]]دىن پايدىلىنىڭ.',
+'undelete-search-title' => 'ئۆچۈرۈئتلگەن بەتنى ئزدەش',
 'undelete-search-box' => 'ئۆچۈرۈلگەن بەتنى ئىزدە',
 'undelete-search-prefix' => 'باشلانغان بەتنى كۆرسەت:',
 'undelete-search-submit' => 'ئىزدەش',
@@ -2263,6 +2262,7 @@ $2 نىڭ ئاخىرقى تۈزىتىلگەن نەشرىگە ئۆزگەرتىل
 $1',
 'undelete-show-file-confirm' => '$2 $3 دىكى \\"<nowiki>$1</nowiki>\\" نىڭ ئۆچۈرۈلگەن تۈزىتىلگەن نەشرىنى راستىنلا كۆرەمسىز؟',
 'undelete-show-file-submit' => 'ھەئە',
+'undelete-revisionrow' => '$1 $2 ($3) $4 . . $5 $6 $7',
 
 # Namespace form on various pages
 'namespace' => 'ئات بوشلۇقى',
@@ -2443,6 +2443,7 @@ $1',
 'proxyblockreason' => 'IP ئادرېسىڭىز ئوچۇق ۋاكالەتچى، ئۇ ئاللىبۇرۇن چەكلەنگەن.
 ئىنتېرنېت مۇلازىمىتى تەمىنلىگۈچى سودىگەر ياكى تېخنىكىلىق قوللىغۇچى بىلەن ئالاقىلىشىڭ ھەمدە ئۇلارغا بۇ ئېغىر بىخەتەرلىك مەسىلىسىنى ئۇقتۇرۇڭ.',
 'proxyblocksuccess' => 'تامام',
+'sorbs' => 'DNSBL',
 'sorbsreason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.',
 'sorbs_create_account_reason' => 'IP ئادرېسىڭىز {{SITENAME}} دا DNSBL تەرىپىدىن ئوچۇق ۋاكالەتچى تىزىملىكىگە قوشۇلغان.
 شۇڭا سىز يېڭى ھېسابات قۇرالمايسىز.',
@@ -2578,6 +2579,7 @@ $1',
 بەت چىقىرىشتا، تۆۋەندىكى تېكست رامكىسىغا بەت ماۋزۇسىنى  كىرگۈزۈپ، ھەر بىر قۇردا بىر ماۋزۇ، ھەمدە بەت تارىخ بار  ئىلگىرىكى تۈزىتىلگەن نەشرىنى تاللامسىز يوق، ياكى پەقەت  ئاخىرقى قېتىملىق تەھرىر ئۇچۇرى بار نۆۋەتتىكى تۈزىتىلگەن  نەشرىنى چىقىرىشنى تاللاڭ.
 
 ئۇنىڭدىن باشقا ئۇلانمىدىن پايدىلىنىپ ھۆججەت چىقىرالايسىز،  مەسىلەن سىز [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] دىن پايدىلىنىپ  "[[{{MediaWiki:Mainpage}}]]"بەت چىقىرالايسىز.',
+'exportall' => 'بارلىق بەتنى چىقىرىش',
 'exportcuronly' => 'ھەممە تارىخنى ئەمەس بەلكى نۆۋەتتىكى تۈزىتىلگەن نەشرىنىلا ئۆز ئىچىگە ئالىدۇ.',
 'exportnohistory' => "----
 '''دىققەت:''' ئىقتىدار سەۋەبلىك بۇ جەدۋەلدىن ھەممە تارىخنى چىقىرىش چەكلەنگەن.",
@@ -2613,6 +2615,7 @@ $1',
 'thumbnail_error' => 'كىچىك رەسىم قۇرۇش خاتالىقى: $1',
 'djvu_page_error' => 'DjVu بېتى دائىرىدىن ھالقىپ كەتتى',
 'djvu_no_xml' => 'DjVu ھۆججىتىدىن XML گە ئېرىشەلمىدى',
+'thumbnail-dest-create' => 'قارار ھۈجەتتە ۋاقتلىق كىچىك ھۈجەت ساقلىغل بولمدى',
 'thumbnail_invalid_params' => 'ئىناۋەتسىز كىچىك رەسىم پارامېتىرى',
 'thumbnail_dest_directory' => 'نىشان مۇندەرىجە قۇرالمىدى',
 'thumbnail_image-type' => 'سۈرەت فورماتىنى قوللىمايدۇ',
@@ -2742,6 +2745,40 @@ $1',
 'tooltip-preferences-save' => 'مايىللىق ساقلا',
 'tooltip-summary' => 'قىسقىچە ئۈزۈندە كىرگۈزۈڭ',
 
+# Stylesheets
+'common.css' => '/* CSS placed here will be applied to all skins */',
+'standard.css' => '/* CSS placed here will affect users of the Standard skin */',
+'nostalgia.css' => '/* CSS placed here will affect users of the Nostalgia skin */',
+'cologneblue.css' => '/* CSS placed here will affect users of the Cologne Blue skin */',
+'monobook.css' => '/* CSS placed here will affect users of the Monobook skin */',
+'myskin.css' => '/* CSS placed here will affect users of the MySkin skin */',
+'chick.css' => '/* CSS placed here will affect users of the Chick skin */',
+'simple.css' => '/* CSS placed here will affect users of the Simple skin */',
+'modern.css' => '/* CSS placed here will affect users of the Modern skin */',
+'vector.css' => '/* CSS placed here will affect users of the Vector skin */',
+'print.css' => '/* CSS placed here will affect the print output */',
+'noscript.css' => '/* CSS placed here will affect users with JavaScript disabled */',
+'group-autoconfirmed.css' => '/* CSS placed here will affect autoconfirmed users only */',
+'group-bot.css' => '/* CSS placed here will affect bots only */',
+'group-sysop.css' => '/* CSS placed here will affect sysops only */',
+'group-bureaucrat.css' => '/* CSS placed here will affect bureaucrats only */',
+
+# Scripts
+'common.js' => '/* Any JavaScript here will be loaded for all users on every page load. */',
+'standard.js' => '/* Any JavaScript here will be loaded for users using the Standard skin */',
+'nostalgia.js' => '/* Any JavaScript here will be loaded for users using the Nostalgia skin */',
+'cologneblue.js' => '/* Any JavaScript here will be loaded for users using the Cologne Blue skin */',
+'monobook.js' => '/* Any JavaScript here will be loaded for users using the MonoBook skin */',
+'myskin.js' => '/* Any JavaScript here will be loaded for users using the MySkin skin */',
+'chick.js' => '/* Any JavaScript here will be loaded for users using the Chick skin */',
+'simple.js' => '/* Any JavaScript here will be loaded for users using the Simple skin */',
+'modern.js' => '/* Any JavaScript here will be loaded for users using the Modern skin */',
+'vector.js' => '/* Any JavaScript here will be loaded for users using the Vector skin */',
+'group-autoconfirmed.js' => '/* Any JavaScript here will be loaded for autoconfirmed users only */',
+'group-bot.js' => '/* Any JavaScript here will be loaded for bots only */',
+'group-sysop.js' => '/* Any JavaScript here will be loaded for sysops only */',
+'group-bureaucrat.js' => '/* Any JavaScript here will be loaded for bureaucrats only */',
+
 # Metadata
 'notacceptable' => 'wiki مۇلازىمىتىرى سىزنىڭ خېرىدار تەرىپىڭىز ئوقۇيالايدىغان سانلىق مەلۇمات فورماتى بىلەن تەمىنلىيەلمەيدۇ.',
 
@@ -2768,12 +2805,29 @@ $1',
 
 # Info page
 'pageinfo-title' => '"$1" نىڭ ئۇچۇرى',
-'pageinfo-header-edits' => 'تەھرىر',
+'pageinfo-header-basic' => 'ئاساسىي ئۇچۇر',
+'pageinfo-header-edits' => 'تەھرىر خاتىرىسى',
+'pageinfo-header-restrictions' => 'بەت  قوغداش',
+'pageinfo-header-properties' => 'بەت خاراكتېرى',
+'pageinfo-display-title' => 'كۆرسىتىدغان نام',
+'pageinfo-article-id' => 'بەت ID',
 'pageinfo-views' => 'كۆرۈنۈش سانى',
-'pageinfo-watchers' => 'كۆزەتكۈچىلەر سانى',
+'pageinfo-watchers' => 'بەت كۆزەتكۈچىلەر سانى',
+'pageinfo-redirects-value' => '$1',
 'pageinfo-edits' => 'تەھرىر سانى',
 'pageinfo-authors' => 'يازغۇچىلار سانى',
 
+# Skin names
+'skinname-standard' => 'Classic',
+'skinname-nostalgia' => 'Nostalgia',
+'skinname-cologneblue' => 'Cologne Blue',
+'skinname-monobook' => 'MonoBook',
+'skinname-myskin' => 'MySkin',
+'skinname-chick' => 'Chick',
+'skinname-simple' => 'Simple',
+'skinname-modern' => 'Modern',
+'skinname-vector' => 'Vector',
+
 # Patrolling
 'markaspatrolleddiff' => 'چارلاش بەلگىسى قوي',
 'markaspatrolledtext' => 'بۇ بەتكە چارلاش بەلگىسى قوي',
@@ -2809,6 +2863,7 @@ $1',
 'mediawarning' => "'''ئاگاھلاندۇرۇش''': بۇ ھۆججەتتە زەھەرخەندە كود بولۇشى مۇمكىن، ئۇنى ئىجرا قىلسىڭىز سىستېمىڭىزغا خەۋپ ئېلىپ كېلىشى مۇمكىن.",
 'imagemaxsize' => "سۈرەت چوڭلۇق چەكلىمىسى: <br />''(ھۆججەت چۈشەندۈرۈش بېتى ئۈچۈن)''",
 'thumbsize' => 'كىچىك سۈرەت چوڭلۇقى:',
+'widthheight' => '$1 × $2',
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|بەت|بەت}}',
 'file-info' => 'ھۆججەت چوڭلۇقى: $1, MIME تىپى: $2',
 'file-info-size' => '$1 × $2 پىكسېل، ھۆججەت چوڭلۇقى: $3، MIME تىپى: $4',
@@ -2837,6 +2892,13 @@ $1',
 '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',
+'days-abbrev' => '$1d',
+
 # Bad image list
 'bad_image_list' => 'تۆۋەندىكى فورماتتا يېزىڭ:
 
@@ -2845,6 +2907,40 @@ $1',
  بۇ ھۆججەت قايسى بەتلەردە كۆرسىتىلىشىدىن قەتئىي نەزەر،
  ئوخشاش بىر قۇرنىڭ ئاخىرىدىكى ئۇلانما مۇستەسنا دەپ قارىلىدۇ،',
 
+/*
+Short names for language variants used for language conversion links.
+To disable showing a particular link, set it to 'disable', e.g.
+'variantname-zh-sg' => 'disable',
+Variants for Chinese language
+*/
+'variantname-zh-hans' => 'hans',
+'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-arab' => 'kk-arab',
+'variantname-kk' => 'kk',
+
 # Metadata
 'metadata' => 'مېتا سانلىق مەلۇماتى',
 'metadata-help' => 'بۇ ھۆججەت كېڭەيتىلگەن تەپسىلاتنى ئۆز ئىچىگە ئالغان. بۇ ئۇچۇرلارنى رەقەملىك ئاپپارات ياكى سكاننېر قۇرغان ياكى رەقەملەشتۈرۈش جەريانىدا قوشۇلغان بولۇشى مۇمكىن.
index 2be90f1..1653977 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Uyghur (Latin script) (Uyghurche)
+/** Uyghur (Latin script) (Uyghurche)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
 
 $messages = array(
 # Dates
-'sunday'        => 'Yekshenbe',
-'monday'        => 'Düshenbe',
-'tuesday'       => 'Seyshenbe',
-'wednesday'     => 'Charshenbe',
-'thursday'      => 'Peyshenbe',
-'friday'        => 'Jüme',
-'saturday'      => 'Shenbe',
-'january'       => 'Yanwar',
-'february'      => 'Féwral',
-'march'         => 'Mart',
-'april'         => 'Aprél',
-'may_long'      => 'May',
-'june'          => 'Iyun',
-'july'          => 'Iyul',
-'august'        => 'Awghust',
-'september'     => 'Séntebr',
-'october'       => 'Öktebir',
-'november'      => 'Noyabr',
-'december'      => 'Dékabr',
-'may-gen'       => 'May',
+'sunday' => 'Yekshenbe',
+'monday' => 'Düshenbe',
+'tuesday' => 'Seyshenbe',
+'wednesday' => 'Charshenbe',
+'thursday' => 'Peyshenbe',
+'friday' => 'Jüme',
+'saturday' => 'Shenbe',
+'january' => 'Yanwar',
+'february' => 'Féwral',
+'march' => 'Mart',
+'april' => 'Aprél',
+'may_long' => 'May',
+'june' => 'Iyun',
+'july' => 'Iyul',
+'august' => 'Awghust',
+'september' => 'Séntebr',
+'october' => 'Öktebir',
+'november' => 'Noyabr',
+'december' => 'Dékabr',
+'may-gen' => 'May',
 'september-gen' => 'Séntebr',
-'october-gen'   => 'Öktebir',
-'november-gen'  => 'Noyabr',
-'december-gen'  => 'Dékabr',
-'jan'           => '1-Ay',
-'feb'           => '2-Ay',
-'mar'           => '3-Ay',
-'apr'           => '4-Ay',
-'may'           => 'May',
-'jun'           => '6-Ay',
-'jul'           => '7-Ay',
-'aug'           => '8-Ay',
-'sep'           => '9-Ay',
-'oct'           => '10-Ay',
-'nov'           => '11-Ay',
-'dec'           => '12-Ay',
-
-'mypage'     => 'Mening beti',
+'october-gen' => 'Öktebir',
+'november-gen' => 'Noyabr',
+'december-gen' => 'Dékabr',
+'jan' => '1-Ay',
+'feb' => '2-Ay',
+'mar' => '3-Ay',
+'apr' => '4-Ay',
+'may' => 'May',
+'jun' => '6-Ay',
+'jul' => '7-Ay',
+'aug' => '8-Ay',
+'sep' => '9-Ay',
+'oct' => '10-Ay',
+'nov' => '11-Ay',
+'dec' => '12-Ay',
+
+'mypage' => 'Mening beti',
 'navigation' => 'Körüsh',
 
 # Cologne Blue skin
-'qbedit'         => 'Uzgartish',
+'qbedit' => 'Uzgartish',
 'qbspecialpages' => 'Alahida tor batleri',
 
-'help'             => 'Yardem',
-'search'           => 'Izdash',
-'searchbutton'     => 'Izdash',
-'go'               => 'Kuchush',
-'searcharticle'    => 'Kuchush',
-'history_short'    => 'Tarih',
+'help' => 'Yardem',
+'search' => 'Izdash',
+'searchbutton' => 'Izdash',
+'go' => 'Kuchush',
+'searcharticle' => 'Kuchush',
+'history_short' => 'Tarih',
 'printableversion' => 'Basma Nushisi',
-'permalink'        => 'Menggülük bet',
-'edit'             => 'Uzgartish',
-'delete'           => 'Yukhutush',
-'protect'          => 'Koghdash',
+'permalink' => 'Menggülük bet',
+'edit' => 'Uzgartish',
+'delete' => 'Yukhutush',
+'protect' => 'Koghdash',
 'talkpagelinktext' => 'Monazire',
-'talk'             => 'Monazire',
-'toolbox'          => 'Qural sanduqlari',
-'otherlanguages'   => 'Bashqa tillarda',
-'jumptosearch'     => 'izdash',
+'talk' => 'Monazire',
+'toolbox' => 'Qural sanduqlari',
+'otherlanguages' => 'Bashqa tillarda',
+'jumptosearch' => 'izdash',
 
 # 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).
-'currentevents'        => 'Hazirqi weqeler',
-'edithelp'             => 'Uzgartish yardemi',
-'mainpage'             => 'Bash Bet',
+'currentevents' => 'Hazirqi weqeler',
+'edithelp' => 'Uzgartish yardemi',
+'mainpage' => 'Bash Bet',
 'mainpage-description' => 'Bash Bet',
-'portal'               => 'Tor Jemiyiti',
+'portal' => 'Tor Jemiyiti',
 
-'ok'             => 'MAQUL',
-'editsection'    => 'uzgartish',
-'editold'        => 'uzgartish',
+'ok' => 'MAQUL',
+'editsection' => 'uzgartish',
+'editold' => 'uzgartish',
 'red-link-title' => '$1 (bet yoq)',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'    => 'Bet',
-'nstab-user'    => 'Ishletkuqi tor beti',
+'nstab-main' => 'Bet',
+'nstab-user' => 'Ishletkuqi tor beti',
 'nstab-special' => 'Alahide betleri',
-'nstab-help'    => 'Yardem beti',
+'nstab-help' => 'Yardem beti',
 
 # Login and logout pages
-'yourname'           => 'Ishletkuqi ismi:',
-'yourpassword'       => 'Achkuch:',
-'yourpasswordagain'  => 'Achkuchni khayta besing:',
-'login'              => 'Kirish',
-'logout'             => 'Chiqish',
-'userlogout'         => 'Chikish',
-'gotaccountlink'     => 'Kirish',
+'yourname' => 'Ishletkuqi ismi:',
+'yourpassword' => 'Achkuch:',
+'yourpasswordagain' => 'Achkuchni khayta besing:',
+'login' => 'Kirish',
+'logout' => 'Chiqish',
+'userlogout' => 'Chikish',
+'gotaccountlink' => 'Kirish',
 'loginlanguagelabel' => 'Til: $1',
 
 # Special:PasswordReset
 'passwordreset-username' => 'Ishletkuchi ismi:',
 
 # Edit pages
-'summary'      => 'Hulasa:',
-'minoredit'    => 'Bu Kichik Uzgartish',
-'watchthis'    => 'Bu Batka Kharang',
-'savearticle'  => 'Betni saqlang',
-'showpreview'  => 'Aldinala kurux',
-'showdiff'     => 'Uzgurushlerni kursutung',
+'summary' => 'Hulasa:',
+'minoredit' => 'Bu Kichik Uzgartish',
+'watchthis' => 'Bu Batka Kharang',
+'savearticle' => 'Betni saqlang',
+'showpreview' => 'Aldinala kurux',
+'showdiff' => 'Uzgurushlerni kursutung',
 'loginreqlink' => 'kirish',
-'newarticle'   => '(Yéngi)',
+'newarticle' => '(Yéngi)',
 
 # Search results
-'prevn'       => 'aldinqi {{PLURAL:$1|$1}}',
-'nextn'       => 'kéyinki {{PLURAL:$1|$1}}',
+'prevn' => 'aldinqi {{PLURAL:$1|$1}}',
+'nextn' => 'kéyinki {{PLURAL:$1|$1}}',
 'powersearch' => 'Izdash',
 
 # Preferences page
-'prefs-rc'              => 'Yengi uzgurush',
-'searchresultshead'     => 'Izdash',
-'timezoneregion-asia'   => 'Asiya',
+'prefs-rc' => 'Yengi uzgurush',
+'searchresultshead' => 'Izdash',
+'timezoneregion-asia' => 'Asiya',
 'timezoneregion-europe' => 'Yawropa',
-'youremail'             => 'Élxet:',
-'username'              => 'Ishletkuqi ismi:',
-'yourlanguage'          => 'Til:',
-'email'                 => 'Élxet:',
+'youremail' => 'Élxet:',
+'username' => 'Ishletkuqi ismi:',
+'yourlanguage' => 'Til:',
+'email' => 'Élxet:',
 
 # Recent changes
 'recentchanges' => 'Yéngi özgirish',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Yéqinqi özgirishler',
-'recentchangeslinked-feed'    => 'Yéqinqi özgirishler',
+'recentchangeslinked' => 'Yéqinqi özgirishler',
+'recentchangeslinked-feed' => 'Yéqinqi özgirishler',
 'recentchangeslinked-toolbox' => 'Yéqinqi özgirishler',
-'recentchangeslinked-page'    => 'Betning ismi:',
+'recentchangeslinked-page' => 'Betning ismi:',
 
 # Upload
-'upload'          => 'Yéngi höjjet kirgüzush',
-'uploadbtn'       => 'Yengi Hujjat Kirguzush',
-'filedesc'        => 'Hulasa',
+'upload' => 'Yéngi höjjet kirgüzush',
+'uploadbtn' => 'Yengi Hujjat Kirguzush',
+'filedesc' => 'Hulasa',
 'watchthisupload' => 'Bu Batka Kharang',
 
 # File description page
@@ -155,29 +155,29 @@ $messages = array(
 # Random page
 'randompage' => 'Halighan Tor Beti',
 
-'brokenredirects-edit'   => 'uzgartish',
+'brokenredirects-edit' => 'uzgartish',
 'brokenredirects-delete' => 'yukhutush',
 
 # Miscellaneous special pages
-'newpages'          => 'Yéngi betler',
+'newpages' => 'Yéngi betler',
 'newpages-username' => 'Ishletkuqi ismi:',
-'move'              => 'Yotkash',
-'movethispage'      => 'Bu batni yotkang',
+'move' => 'Yotkash',
+'movethispage' => 'Bu batni yotkang',
 
 # Book sources
 'booksources-go' => 'Kuchush',
 
 # Special:AllPages
-'nextpage'       => 'Kéyinki bet ($1)',
-'prevpage'       => 'Aldinqi bet ($1)',
+'nextpage' => 'Kéyinki bet ($1)',
+'prevpage' => 'Aldinqi bet ($1)',
 'allpagessubmit' => 'Kuchush',
 
 # Special:LinkSearch
 'linksearch-ok' => 'Izdash',
 
 # Watchlist
-'watchlist'     => 'Men kharawatkhan tor betleri',
-'watch'         => 'Karang',
+'watchlist' => 'Men kharawatkhan tor betleri',
+'watch' => 'Karang',
 'watchthispage' => 'Bu Batka Kharang',
 
 # Restrictions (nouns)
@@ -187,11 +187,11 @@ $messages = array(
 # Undelete
 'undelete-search-submit' => 'Izdash',
 
-'sp-contributions-talk'   => 'Monazire',
+'sp-contributions-talk' => 'Monazire',
 'sp-contributions-submit' => 'Izdash',
 
 # What links here
-'whatlinkshere'      => 'Bashqa tor betler',
+'whatlinkshere' => 'Bashqa tor betler',
 'whatlinkshere-page' => 'Bet:',
 
 # Block/unblock
@@ -199,7 +199,7 @@ $messages = array(
 
 # Move page
 'movearticle' => 'Yotkigen beti:',
-'move-watch'  => 'Bu Batka Kharang',
+'move-watch' => 'Bu Batka Kharang',
 'movepagebtn' => 'Yotkigen beti',
 
 # Namespace 8 related
@@ -207,9 +207,9 @@ $messages = array(
 
 # Tooltip help for the actions
 'tooltip-pt-logout' => 'Chikish',
-'tooltip-ca-move'   => 'Bu batni yotkang',
-'tooltip-search'    => 'Izdash {{SITENAME}}',
-'tooltip-p-logo'    => 'Bash Bet',
+'tooltip-ca-move' => 'Bu batni yotkang',
+'tooltip-search' => 'Izdash {{SITENAME}}',
+'tooltip-p-logo' => 'Bash Bet',
 
 # Special:NewFiles
 'ilsubmit' => 'Izdash',
@@ -220,13 +220,13 @@ $messages = array(
 # Multipage image navigation
 'imgmultipageprev' => '← aldinqi bet',
 'imgmultipagenext' => 'kéyinki bet →',
-'imgmultigo'       => 'Kuchush!',
+'imgmultigo' => 'Kuchush!',
 
 # Table pager
-'table_pager_next'         => 'Kéyinki bet',
-'table_pager_prev'         => 'Aldinqi bet',
-'table_pager_first'        => 'Birinchi bet',
-'table_pager_last'         => 'Eng axirqi bet',
+'table_pager_next' => 'Kéyinki bet',
+'table_pager_prev' => 'Aldinqi bet',
+'table_pager_first' => 'Birinchi bet',
+'table_pager_last' => 'Eng axirqi bet',
 'table_pager_limit_submit' => 'Kuchush',
 
 # Special:SpecialPages
index fc56655..0bccb10 100644 (file)
@@ -37,6 +37,7 @@
  * @author VolodymyrF
  * @author Vox
  * @author Yuriy Apostol
+ * @author Ата
  * @author Дар'я Козлова
  * @author Тест
  */
@@ -206,7 +207,6 @@ $magicWords = array(
        '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' ),
@@ -305,7 +305,7 @@ $magicWords = array(
        'revisionmonth1'            => array( '1', 'МІСЯЦЬ_ВЕРСІЇ_1', 'МЕСЯЦ_ВЕРСИИ_1', 'REVISIONMONTH1' ),
        'revisionyear'              => array( '1', 'РІК_ВЕРСІЇ', 'ГОД_ВЕРСИИ', 'REVISIONYEAR' ),
        'revisiontimestamp'         => array( '1', 'МІТКА_ЧАСУ_ВЕРСІЇ', 'ОТМЕТКА_ВРЕМЕНИ_ВЕРСИИ', 'REVISIONTIMESTAMP' ),
-       'revisionuser'              => array( '1', 'ВЕРСІЯ_КОРИСТУВАЧА', 'ВЕРСИЯ_УЧАСНИКА', 'REVISIONUSER' ),
+       'revisionuser'              => array( '1', 'ВЕРСІЯ_КОРИСТУВАЧА', 'ВЕРСИЯ_УЧАСНИКА', 'ВЕРСИЯ_УЧАСТНИКА', 'REVISIONUSER' ),
        'plural'                    => array( '0', 'МНОЖИНА:', 'МНОЖЕСТВЕННОЕ_ЧИСЛО:', 'PLURAL:' ),
        'fullurl'                   => array( '0', 'ПОВНА_АДРЕСА:', 'ПОЛНЫЙ_АДРЕС:', 'FULLURL:' ),
        'fullurle'                  => array( '0', 'ПОВНА_АДРЕСА_2:', 'ПОЛНЫЙ_АДРЕС_2:', 'FULLURLE:' ),
@@ -379,7 +379,7 @@ $messages = array(
 'tog-enotifusertalkpages' => 'Повідомляти електронною поштою про зміну моєї сторінки обговорення',
 'tog-enotifminoredits' => 'Надсилати мені електронного листа навіть при незначних редагуваннях сторінок та файлів',
 'tog-enotifrevealaddr' => 'Показувати мою поштову адресу в повідомленнях',
-'tog-shownumberswatching' => 'Показувати кількість користувачів, які додали сторінку до свого списку спостереження',
+'tog-shownumberswatching' => 'Показувати число користувачів, які додали сторінку до свого списку спостереження',
 'tog-oldsig' => 'Існуючий підпис:',
 'tog-fancysig' => 'Власна вікі-розмітка підпису (без автоматичного посилання)',
 'tog-externaleditor' => "Використовувати зовнішній редактор за умовчанням (тільки для досвідчених користувачів, вимагає спеціальних налаштувань вашого комп'ютера [//www.mediawiki.org/wiki/Manual:External_editors Детальніше.])",
@@ -401,7 +401,7 @@ $messages = array(
 
 'underline-always' => 'Завжди',
 'underline-never' => 'Ніколи',
-'underline-default' => 'Використати налаштування браузера',
+'underline-default' => 'Ð\92икоÑ\80иÑ\81Ñ\82овÑ\83ваÑ\82и Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83ваннÑ\8f Ð±Ñ\80аÑ\83зеÑ\80а',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Тип шрифту в полі редагування:',
@@ -480,6 +480,7 @@ $messages = array(
 'index-category' => 'Індексовані сторінки',
 'noindex-category' => 'Неіндексовані сторінки',
 'broken-file-category' => 'Сторінки, що посилаються на неіснуючі файли',
+'categoryviewer-pagedlinks' => '($1) ($2)',
 
 'linkprefix' => '/^(.*?)(„|«)$/sD',
 
@@ -488,8 +489,8 @@ $messages = array(
 'newwindow' => '(відкривається в новому вікні)',
 'cancel' => 'Скасувати',
 'moredotdotdot' => 'Детальніше…',
-'mypage' => 'Ð\9cоÑ\8f Ð¾Ñ\81обиÑ\81Ñ\82а Ñ\81торінка',
-'mytalk' => 'Ð\9cоÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нка Ð¾бговорення',
+'mypage' => 'Сторінка',
+'mytalk' => 'Ð\9eбговорення',
 'anontalk' => 'Обговорення для цієї IP-адреси',
 'navigation' => 'Навігація',
 'and' => '&#32;і',
@@ -499,7 +500,6 @@ $messages = array(
 'qbbrowse' => 'Переглянути',
 'qbedit' => 'Редагувати',
 'qbpageoptions' => 'Налаштування сторінки',
-'qbpageinfo' => 'Інформація про сторінку',
 'qbmyoptions' => 'Мої налаштування',
 'qbspecialpages' => 'Спеціальні сторінки',
 'faq' => 'Часті питання',
@@ -512,7 +512,7 @@ $messages = array(
 'vector-action-protect' => 'Захистити',
 'vector-action-undelete' => 'Відновити',
 'vector-action-unprotect' => 'Зміна захисту',
-'vector-simplesearch-preference' => 'УвÑ\96мкнÑ\83Ñ\82и Ñ\80озÑ\88иÑ\80енÑ\96 Ð¿Ð¾Ñ\88Ñ\83ковÑ\96 Ð¿Ñ\96дказки (лише для оформлення "Векторне")',
+'vector-simplesearch-preference' => 'УвÑ\96мкнÑ\83Ñ\82и Ñ\81пÑ\80оÑ\89ене Ð¿Ð¾Ð»Ðµ Ð¿Ð¾Ñ\88Ñ\83кÑ\83 (лише для оформлення "Векторне")',
 'vector-view-create' => 'Створити',
 'vector-view-edit' => 'Редагувати',
 'vector-view-history' => 'Переглянути історію',
@@ -522,6 +522,7 @@ $messages = array(
 'namespaces' => 'Простори назв',
 'variants' => 'Варіанти',
 
+'navigation-heading' => 'Навігаційне меню',
 'errorpagetitle' => 'Помилка',
 'returnto' => 'Повернення до сторінки «$1».',
 'tagline' => 'Матеріал з {{grammar:genitive|{{SITENAME}}}}',
@@ -620,6 +621,8 @@ $1',
 'youhavenewmessages' => 'Ви отримали $1 ($2).',
 'newmessageslink' => 'нові повідомлення',
 'newmessagesdifflink' => 'остання зміна',
+'youhavenewmessagesfromusers' => 'Ви отримали $1 від {{PLURAL:$3|іншого дописувача|$3 інших дописувачів}} ($2).',
+'youhavenewmessagesmanyusers' => 'Ви отримали $1 від багатьох дописувачів ($2).',
 'newmessageslinkplural' => '{{PLURAL:$1|нове повідомлення|нові повідомлення|нових повідомлень}}',
 'newmessagesdifflinkplural' => '{{PLURAL:$1|остання зміна|останні зміни|останніх змін}}',
 'youhavenewmessagesmulti' => 'Ви отримали нові повідомлення на $1',
@@ -679,9 +682,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»
@@ -724,7 +727,7 @@ $1',
 'badtitletext' => 'Запитана назва сторінки неправильна, порожня, або неправильно зазначена міжмовна чи міжвікі назва.
 Можливо, в назві використовуються недопустимі символи.',
 'perfcached' => 'Наступні дані взяті з кешу і можуть бути застарілими. В кеші зберігається не більше  {{PLURAL:$1| запису| записів}}.',
-'perfcachedts' => 'Ð\9dаÑ\81Ñ\82Ñ\83пнÑ\96 Ð´Ð°Ð½Ñ\96 Ð²Ð·Ñ\8fÑ\82Ñ\96 Ð· ÐºÐµÑ\88Ñ\83, Ð²Ð¾Ñ\81Ñ\82аннÑ\94 Ð²Ñ\96н Ð¾Ð½Ð¾Ð²Ð»Ñ\8eвавÑ\81Ñ\8f Ð¾ $1. Ð\92 ÐºÐµÑ\88Ñ\96 Ð·Ð±ÐµÑ\80Ñ\96гаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ðµ Ð±Ñ\96лÑ\8cÑ\88е {{PLURAL:$4|запису|записів}}.',
+'perfcachedts' => 'Ð\9dаÑ\81Ñ\82Ñ\83пнÑ\96 Ð´Ð°Ð½Ñ\96 Ð²Ð·Ñ\8fÑ\82Ñ\96 Ð· ÐºÐµÑ\88Ñ\83, Ð²Ð¾Ñ\81Ñ\82аннÑ\94 Ð²Ñ\96н Ð¾Ð½Ð¾Ð²Ð»Ñ\8eвавÑ\81Ñ\8f Ð¾ $1. Ð£ ÐºÐµÑ\88Ñ\96 Ð·Ð±ÐµÑ\80Ñ\96гаÑ\94Ñ\82Ñ\8cÑ\81Ñ\8f Ð½Ðµ Ð±Ñ\96лÑ\8cÑ\88е $4 {{PLURAL:$4|запису|записів}}.',
 'querypage-no-updates' => 'Зміни цієї сторінки зараз заборонені. Дані тут не можуть бути оновлені зараз.',
 'wrong_wfQuery_params' => 'Неприпустима параметри функцій wfQuery()<br />
 Функція: $1<br />
@@ -733,10 +736,10 @@ $1',
 'viewsource-title' => 'Перегляд вихідного коду сторінки $1',
 'actionthrottled' => 'Обмеження за швидкістю',
 'actionthrottledtext' => 'Як захід боротьби зі спамом, установлено обмеження на багаторазове застосування цієї дії протягом короткого проміжку часу. Будь ласка, повторіть спробу через кілька хвилин.',
-'protectedpagetext' => 'Ця сторінка закрита для редагування.',
+'protectedpagetext' => 'Ця сторінка захищена від редагування та інших дій.',
 'viewsourcetext' => 'Ви можете переглянути та скопіювати початковий текст цієї сторінки:',
 'viewyourtext' => "Ви можете переглянути та скопіювати текст '''ваших редагувань''' на цій сторінці:",
-'protectedinterface' => 'ЦÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нка Ñ\94 Ñ\87аÑ\81Ñ\82иноÑ\8e Ñ\96нÑ\82еÑ\80Ñ\84ейÑ\81Ñ\83 Ð¿Ñ\80огÑ\80амного Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ\87еннÑ\8f Ñ\96 Ñ\97Ñ\97 Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ñ\80едагÑ\83ваÑ\82и Ð»Ð¸Ñ\88е Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80и Ð¿Ñ\80оекÑ\82Ñ\83.',
+'protectedinterface' => 'ЦÑ\8f Ñ\81Ñ\82оÑ\80Ñ\96нка Ñ\94 Ñ\87аÑ\81Ñ\82иноÑ\8e Ñ\96нÑ\82еÑ\80Ñ\84ейÑ\81Ñ\83 Ð¿Ñ\80огÑ\80амного Ð·Ð°Ð±ÐµÐ·Ð¿ÐµÑ\87еннÑ\8f Ñ\86Ñ\96Ñ\94Ñ\97 Ð²Ñ\96кÑ\96 Ñ\96 Ñ\97Ñ\97 Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ñ\80едагÑ\83ваÑ\82и Ð»Ð¸Ñ\88е Ð°Ð´Ð¼Ñ\96нÑ\96Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80и Ð¿Ñ\80оекÑ\82Ñ\83. Ð©Ð¾Ð± Ð´Ð¾Ð´Ð°Ñ\82и Ð°Ð±Ð¾ Ð·Ð¼Ñ\96ниÑ\82и Ð¿ÐµÑ\80еклади Ð´Ð»Ñ\8f Ñ\83Ñ\81Ñ\96Ñ\85 Ð²Ñ\96кÑ\96, Ð²Ñ\96двÑ\96дайÑ\82е [//translatewiki.net/ translatewiki.net], Ð¿Ñ\80оекÑ\82 Ð»Ð¾ÐºÐ°Ð»Ñ\96заÑ\86Ñ\96Ñ\97 MediaWiki.',
 'editinginterface' => "'''Увага:''' Ви редагуєте сторінку, що є частиною текстового інтерфейсу. Зміни цієї сторінки спричинять зміну інтерфейсу для інших користувачів. Для перекладу повідомлення використовуйте [//translatewiki.net/wiki/Main_Page?setlang=uk translatewiki.net] — проект, що займається локалізацією MediaWiki.",
 'sqlhidden' => '(SQL запит приховано)',
 'cascadeprotected' => 'Сторінка захищена від змін, оскільки її включено до {{PLURAL:$1|сторінки, для якої|наступних сторінок, для яких}} установлено каскадний захист: $2',
@@ -761,16 +764,17 @@ $1',
 # Login and logout pages
 'logouttext' => "'''Тепер ви працюєте в тому ж режимі, який був до вашого входу до системи.'''
 
-Ви можете продовжувати використовувати {{grammar:accusative|{{SITENAME}}}} анонімно або знову [[Special:UserLogin|ввійти до системи]] як той самий або інший користувач. Деякі сторінки можуть відображатися, ніби ви ще представлені системі під іменем, щоб уникнути цього, оновіть кеш браузера.",
-'welcomecreation' => '== Вітаємо вас, $1! ==
-Ваш обліковий запис створено.
-Не забудьте змінити свої [[Special:Preferences|налаштування для сайту]].',
+Ви можете продовжувати використовувати {{grammar:accusative|{{SITENAME}}}} анонімно або знову <span class='plainlinks'>[$1 ввійти до системи]</span> як той самий або інший користувач. Деякі сторінки можуть відображатися, ніби ви ще представлені системі під іменем, щоб уникнути цього, оновіть кеш браузера.",
+'welcomeuser' => 'Вітаємо, $1!',
+'welcomecreation-msg' => 'Ваш акаунт було створено.
+Не забудьте змінити свої [[Special:Preferences|налаштування у {{GRAMMAR:genitive|{{SITENAME}}}}]].',
 'yourname' => "Ім'я користувача:",
 'yourpassword' => 'Пароль:',
 'yourpasswordagain' => 'Повторний набір пароля:',
 'remembermypassword' => "Запам'ятати мій обліковий запис на цьому комп'ютері (на строк не більше $1 {{PLURAL:$1|дня|днів}})",
 'securelogin-stick-https' => 'Залишайтись підключенним через HTTPS після входу',
 'yourdomainname' => 'Ваш домен:',
+'password-change-forbidden' => 'Ви не можна змінити пароль на цій вікі.',
 'externaldberror' => 'Сталася помилка при автентифікації за допомогою зовнішньої бази даних, або у вас недостатньо прав для внесення змін до свого зовнішнього облікового запису.',
 'login' => 'Вхід до системи',
 'nav-login-createaccount' => 'Вхід / реєстрація',
@@ -1016,12 +1020,16 @@ $2
 Одна IP-адреса може використовуватися декількома користувачами.
 Якщо ви — анонімний користувач і вважаєте, що отримали коментарі, адресовані не вам, будь ласка [[Special:UserLogin/signup|зареєструйтесь]] або [[Special:UserLogin|увійдіть до системи]], щоб у майбутньому уникнути можливої плутанини з іншими анонімними користувачами.''",
 'noarticletext' => 'Зараз на цій сторінці нема тексту.
\92и Ð¼Ð¾Ð¶ÐµÑ\82е [[Special:Search/{{PAGENAME}}|поÑ\88Ñ\83каÑ\82и Ñ\86Ñ\8e Ð½Ð°Ð·Ð²Ñ\83]] Ð² інших сторінках,
\92и Ð¼Ð¾Ð¶ÐµÑ\82е [[Special:Search/{{PAGENAME}}|поÑ\88Ñ\83каÑ\82и Ñ\86Ñ\8e Ð½Ð°Ð·Ð²Ñ\83]] Ð½Ð° інших сторінках,
 <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-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' => 'Цей користувач наразі заблокований.
@@ -1130,6 +1138,15 @@ $2
 'edit-already-exists' => 'Неможливо створити нову сторінку.
 Вона вже існує.',
 'defaultmessagetext' => 'Текст «за замовчування»',
+'content-failed-to-parse' => 'Не вдалось проаналізувати $2 як тип $1: $3',
+'invalid-content-data' => 'Неприпустимі дані',
+'content-not-allowed-here' => 'Вміст «$1» недопустимий на сторінці [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'вікітекст',
+'content-model-text' => 'звичайний текст',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Увага: Ця сторінка містить дуже багато викликів ресурсомістких функцій.
@@ -1151,6 +1168,7 @@ $2
 'expansion-depth-exceeded-warning' => 'На сторінці перевищено межу глибини вкладеності',
 'parser-unstrip-loop-warning' => 'Виявлено незакритий тег (такий, як <pre>)',
 'parser-unstrip-recursion-limit' => 'Перевищено межу вкладеної рекурсії ($1) для парсера.',
+'converter-manual-rule-error' => 'Помилка в ручному правилі перетворення мови',
 
 # "Undo" feature
 'undo-success' => 'Редагування може бути скасовано.
@@ -1285,9 +1303,11 @@ $1",
 'revdelete-concurrent-change' => 'Помилка редагування запису від $2, $1: його стан змінений кимось іншим, поки ви робили свої зміни.
 Будь ласка, перевірте журнал.',
 'revdelete-only-restricted' => 'Помилка приховання запису від $2, $1: ви не можете приховати записи від перегляду адміністраторів без одночасного вибору однієї з інших опцій приховання.',
-'revdelete-reason-dropdown' => '* Типові причини вилучення
+'revdelete-reason-dropdown' => "* Типові причини вилучення
 ** Порушення авторських прав
-** Недоречна особиста інформація',
+** Недоречна особиста інформація
+** Невідповідне ім'я користувача
+** Потенційно наклепна інформація",
 'revdelete-otherreason' => 'Інша/додаткова причина:',
 'revdelete-reasonotherlist' => 'Інша причина',
 'revdelete-edit-reasonlist' => 'Редагувати причини вилучень',
@@ -1338,6 +1358,10 @@ $1",
 'editundo' => 'скасувати',
 'diff-multi' => '({{PLURAL:$1|Одна проміжна версія одного користувача не показана|$1 проміжні версії {{PLURAL:$2|одного користувача|$2 користувачів}} не показані|$1 проміжних версій {{PLURAL:$2|одного користувача|$2 користувачів}} не показані}})',
 'diff-multi-manyusers' => '({{PLURAL:$1|не показана $1 проміжна я версія|не показані $1 проміжні версії|не показано $1 проміжних версій}}, зроблених більш, ніж {{PLURAL:$2|$1 користувачем|$2 користувачами}})',
+'difference-missing-revision' => '{{PLURAL:$2|$2 версія|$2 версії|$2 версій}} для цього порівняння ($1) не {{PLURAL:$2|знайдене|знайдені}}.
+
+Імовірно, ви перейшли за застарілим посиланням на порівняння версій вилученої сторінки.
+Подробиці можна дізнатися з [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} журналу вилучень].',
 
 # Search results
 'searchresults' => 'Результати пошуку',
@@ -1380,8 +1404,6 @@ $1",
 'search-interwiki-caption' => 'Братні проекти',
 'search-interwiki-default' => '$1 результати:',
 'search-interwiki-more' => '(більше)',
-'search-mwsuggest-enabled' => 'з порадами',
-'search-mwsuggest-disabled' => 'без порад',
 'search-relatedarticle' => "Пов'язаний",
 'mwsuggest-disable' => 'Вимкнути поради AJAX',
 'searcheverything-enable' => 'Пошук у всіх просторах назв',
@@ -1477,7 +1499,7 @@ $1",
 'timezoneregion-indian' => 'Індійський океан',
 'timezoneregion-pacific' => 'Тихий океан',
 'allowemail' => 'Дозволити електронну пошту від інших користувачів',
-'prefs-searchoptions' => 'Ð\9fаÑ\80амеÑ\82Ñ\80и Ð¿Ð¾Ñ\88Ñ\83кÑ\83',
+'prefs-searchoptions' => 'Ð\9fоÑ\88Ñ\83к',
 'prefs-namespaces' => 'Простори назв',
 'defaultns' => 'Інакше шукати в таких просторах назв:',
 'default' => 'за умовчанням',
@@ -1651,6 +1673,9 @@ $1",
 'rightslogtext' => 'Це протокол зміни прав користувачів.',
 'rightslogentry' => 'змінив права доступу для користувача $1 з $2 на $3',
 'rightslogentry-autopromote' => 'був автоматично переведений з $2 до $3',
+'logentry-rights-rights' => '$1 {{GENDER:$1|змінив|змінила}} членство в групах для $3 із $4 на $5',
+'logentry-rights-rights-legacy' => '$1 {{GENDER:$1|змінив|змінила}} членство в групах для $3',
+'logentry-rights-autopromote' => '$1 було автоматично переведено із $4 в $5',
 'rightsnone' => '(нема)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1899,6 +1924,7 @@ $1',
 'backend-fail-notsame' => 'Неідентичний файл $1 вже існує.',
 'backend-fail-invalidpath' => 'Шлях для збереження $1 є недійсним.',
 'backend-fail-delete' => 'Не вдалося вилучити файл $1.',
+'backend-fail-describe' => 'Не вдалося змінити метадані для файлу «$1».',
 'backend-fail-alreadyexists' => 'Файл $1 вже існує.',
 'backend-fail-store' => 'Не вдалося зберегти файл $1 у $2.',
 'backend-fail-copy' => 'Не вдалося скопіювати файл $1 в $2.',
@@ -2052,7 +2078,7 @@ $1',
 'shared-repo' => 'спільного сховища',
 'shared-repo-name-wikimediacommons' => 'Вікісховища',
 'filepage.css' => '/* Розміщений тут CSS-код розміщений на сторінці опису файла, також і для іноземних користувачів вікі */',
-'upload-disallowed-here' => 'Ð\9dа Ð¶Ð°Ð»Ñ\8c, Ð\92и Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80езапиÑ\81аÑ\82и Ñ\86е Ð·Ð¾Ð±Ñ\80аженнÑ\8f',
+'upload-disallowed-here' => 'Ð\92и Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ\82е Ð¿ÐµÑ\80езапиÑ\81аÑ\82и Ñ\86ей Ñ\84айл',
 
 # File reversion
 'filerevert' => 'Повернення до старої версії $1',
@@ -2121,7 +2147,7 @@ $1',
 'statistics-pages-desc' => 'Усі сторінки у вікі, включаючи сторінки обговорень, перенаправлення тощо.',
 'statistics-files' => 'Завантажено файлів',
 'statistics-edits' => 'Кількість редагувань з моменту установки {{grammar:genitive|{{SITENAME}}}}',
-'statistics-edits-average' => 'СеÑ\80еднÑ\8f ÐºÑ\96лÑ\8cкÑ\96Ñ\81Ñ\82Ñ\8c редагувань на сторінку',
+'statistics-edits-average' => 'СеÑ\80еднÑ\94 Ñ\87иÑ\81ло редагувань на сторінку',
 'statistics-views-total' => 'Усього переглядів',
 'statistics-views-total-desc' => 'Перегляди неіснуючих та спеціальних сторінок не враховані',
 'statistics-views-peredit' => 'Переглядів на редагування',
@@ -2132,7 +2158,9 @@ $1',
 
 'disambiguations' => 'Сторінки, що посилаються на сторінки неоднозначності.',
 'disambiguationspage' => 'Template:disambig',
-'disambiguations-text' => "Наступні сторінки посилаються на '''багатозначні сторінки'''. Однак вони, ймовірно, повинні вказувати на відповідну конкретну статтю.<br />Сторінка вважається багатозначною, якщо на ній розміщений шаблон, назва якого є на сторінці [[MediaWiki:Disambiguationspage]].",
+'disambiguations-text' => "Наступні сторінки посилаються на '''багатозначні сторінки'''. 
+Ймовірно, вони повинні вказувати на відповідну конкретну статтю.<br />
+Сторінка вважається багатозначною, якщо на ній розміщений шаблон, назва якого є на сторінці [[MediaWiki:Disambiguationspage]].",
 
 'doubleredirects' => 'Подвійні перенаправлення',
 'doubleredirectstext' => 'На цій сторінці наведено список перенаправлень на інші перенаправлення.
@@ -2157,6 +2185,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|версія|версії|версій}}',
@@ -2196,7 +2225,7 @@ $1',
 'protectedpages' => 'Захищені сторінки',
 'protectedpages-indef' => 'Тільки безстроково захищені',
 'protectedpages-cascade' => 'Тільки каскадний захист',
-'protectedpagestext' => 'Ð\9dаÑ\81Ñ\82Ñ\83пні сторінки захищені від перейменування або зміни.',
+'protectedpagestext' => 'Такі сторінки захищені від перейменування або зміни.',
 'protectedpagesempty' => 'Зараз нема захищених сторінок із зазначеними параметрами',
 'protectedtitles' => 'Заборонені назви',
 'protectedtitlestext' => 'Наступні назви не дозволено використовувати',
@@ -2285,8 +2314,8 @@ $1',
 'linksearch-ns' => 'Простір назв:',
 'linksearch-ok' => 'Знайти',
 'linksearch-text' => 'Можна використовувати підстановочні символи (шаблони), наприклад, "*.wikipedia.org".
-Необхідний домен якнайменше верхнього рівня, наприклад "*.org"<br />
\9fÑ\96дÑ\82Ñ\80имÑ\83ванÑ\96 Ð¿Ñ\80оÑ\82околи: <code>$1</code> (не Ð´Ð¾Ð´Ð°Ð²Ð°Ð¹Ñ\82е Ð¶Ð¾Ð´ÐµÐ½ Ð· Ð½Ð¸Ñ\85 Ñ\83 Ð²Ð°Ñ\88омÑ\83 Ð¿Ð¾Ñ\88Ñ\83кÑ\83)',
+Необхідний домен принаймні верхнього рівня, наприклад "*.org"<br />
\9fÑ\96дÑ\82Ñ\80имÑ\83ванÑ\96 Ð¿Ñ\80оÑ\82околи: <code>$1</code> (за Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм http:// Ñ\8fкÑ\89о Ð¶Ð¾Ð´ÐµÐ½ Ð¿Ñ\80оÑ\82окол Ð½Ðµ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾)',
 'linksearch-line' => 'Посилання на $1 із $2',
 'linksearch-error' => 'Підстановочні знаки можуть використовуватися лише на початку адрес.',
 
@@ -2334,11 +2363,11 @@ $1',
 'mailnologin' => 'Відсутня адреса для відправки',
 'mailnologintext' => 'Ви повинні [[Special:UserLogin|ввійти до системи]] і мати підтверджену адресу електронної пошти у ваших [[Special:Preferences|налаштуваннях]], щоб мати змогу надсилати електронну пошту іншим користувачам.',
 'emailuser' => 'Надіслати листа',
-'emailuser-title-target' => 'Надіслати електронного листа користувачеві',
+'emailuser-title-target' => 'Надіслати електронного листа {{GENDER:$1|користувачеві|користувачці}}',
 'emailuser-title-notarget' => 'Надіслати електронного листа користувачеві',
 'emailpage' => 'Лист користувачеві',
-'emailpagetext' => 'Заповнивши наведену нижче форму, можна надіслати повідомлення цьому користувачу.
\95лекÑ\82Ñ\80онна Ð°Ð´Ñ\80еÑ\81а, Ñ\8fкÑ\83 Ð²и зазначили у [[Special:Preferences|своїх налаштуваннях]], буде зазначена в полі «Від кого» листа, тому одержувач матиме можливість відповісти безпосередньо вам.',
+'emailpagetext' => 'Заповнивши наведену нижче форму, можна надіслати повідомлення {{GENDER:$1|цьому користувачу|цій користувачці}}.
\95лекÑ\82Ñ\80онна Ð°Ð´Ñ\80еÑ\81а, Ñ\8fкÑ\83 Ð\92и зазначили у [[Special:Preferences|своїх налаштуваннях]], буде зазначена в полі «Від кого» листа, тому одержувач матиме можливість відповісти безпосередньо вам.',
 'usermailererror' => 'При відправці повідомлення електронної пошти сталася помилка:',
 'defemailsubject' => '{{SITENAME}} - електронний лист від користувача " $1 "',
 'usermaildisabled' => 'Електронне листування між користувачами вимкнене',
@@ -2406,20 +2435,23 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}} Служба сповіщення поштою',
 'enotif_reset' => 'Позначити всі сторінки як переглянуті',
-'enotif_newpagetext' => 'Це нова сторінка.',
 'enotif_impersonal_salutation' => 'Користувач {{grammar:genitive|{{SITENAME}}}}',
-'changed' => 'змінена',
-'created' => 'створена',
-'enotif_subject' => 'Сторінка проекту «{{SITENAME}}» $PAGETITLE була $CHANGEDORCREATED користувачем $PAGEEDITOR',
+'enotif_subject_deleted' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було вилучено {{GENDER:$2|користувачем|користувачкою}} $2',
+'enotif_subject_created' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було створено {{GENDER:$2|користувачем|користувачкою}} $2',
+'enotif_subject_moved' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було перейменовано {{GENDER:$2|користувачем|користувачкою}} $2',
+'enotif_subject_restored' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було відновлено {{GENDER:$2|користувачем|користувачкою}} $2',
+'enotif_subject_changed' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було змінено {{GENDER:$2|користувачем|користувачкою}} $2',
+'enotif_body_intro_deleted' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було вилучено $PAGEEDITDATE {{GENDER:$2|користувачем|користувачкою}} $2, див. поточну версію $3.',
+'enotif_body_intro_created' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було створено $PAGEEDITDATE {{GENDER:$2|користувачем|користувачкою}} $2, див. поточну версію $3.',
+'enotif_body_intro_moved' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було перейменовано $PAGEEDITDATE {{GENDER:$2|користувачем|користувачкою}} $2, див. поточну версію $3.',
+'enotif_body_intro_restored' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було відновлено $PAGEEDITDATE {{GENDER:$2|користувачем|користувачкою}} $2, див. поточну версію $3.',
+'enotif_body_intro_changed' => 'Сторінку {{GRAMMAR:genitive|{{SITENAME}}}} «$1» було змінено $PAGEEDITDATE {{GENDER:$2|користувачем|користувачкою}} $2, див. поточну версію $3.',
 'enotif_lastvisited' => 'Див. $1 для перегляду всіх змін, що відбулися після вашого останнього перегляду.',
 'enotif_lastdiff' => 'Див. $1 для ознайомлення з цією зміною.',
 'enotif_anon_editor' => 'анонімний користувач $1',
 'enotif_body' => 'Шановний $WATCHINGUSERNAME,
 
-
-$PAGEEDITDATE сторінка проекту «{{SITENAME}}» $PAGETITLE була $CHANGEDORCREATED користувачем $PAGEEDITOR, дивіться $PAGETITLE_URL як поточну версію.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Короткий опис змін: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2592,7 +2624,8 @@ $UNWATCHURL
 'undeletedrevisions' => '$1 {{PLURAL:$1|редагування|редагування|редагувань}} відновлено',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|версія|версії|версій}} та $2 {{PLURAL:$2|файл|файли|файлів}} відновлено',
 'undeletedfiles' => '$1 {{PLURAL:$1|файл|файли|файлів}} відновлено',
-'cannotundelete' => 'Не вдалося скасувати видалення, хтось інший вже міг відмінити видалення сторінки.',
+'cannotundelete' => 'Помилка відновлення:
+$1',
 'undeletedpage' => "'''Сторінка «$1» відновлена'''
 
 Див. [[Special:Log/delete|список вилучень]], щоб дізнатися про останні вилучення та відновлення.",
@@ -2623,9 +2656,9 @@ $1',
 'blanknamespace' => '(Основний)',
 
 # Contributions
-'contributions' => 'Внесок користувача',
+'contributions' => 'Внесок {{GENDER:$1|користувача|користувачки}}',
 'contributions-title' => 'Внесок користувача $1',
-'mycontris' => 'Ð\9cÑ\96й Ð²несок',
+'mycontris' => 'Ð\92несок',
 'contribsub2' => 'Внесок $1 ($2)',
 'nocontribs' => 'Редагувань, що задовольняють заданим умовам не знайдено.',
 'uctop' => ' (остання)',
@@ -2635,7 +2668,7 @@ $1',
 'sp-contributions-newbies' => 'Показати лише внесок з нових облікових записів',
 'sp-contributions-newbies-sub' => 'Внесок новачків',
 'sp-contributions-newbies-title' => 'Внесок з нових облікових записів',
-'sp-contributions-blocklog' => 'пÑ\80оÑ\82окол блокувань',
+'sp-contributions-blocklog' => 'жÑ\83Ñ\80нал блокувань',
 'sp-contributions-deleted' => 'вилучені редагування користувача',
 'sp-contributions-uploads' => 'завантаження',
 'sp-contributions-logs' => 'журнали',
@@ -2893,6 +2926,7 @@ $1',
 'immobile-target-namespace-iw' => 'Інтервікі-посилання не підходить для перейменування сторінки.',
 'immobile-source-page' => 'Цю сторінку не можна перейменувати.',
 'immobile-target-page' => 'Не можна присвоїти сторінці цю назву.',
+'bad-target-model' => 'Неможливо перетворити $1 на $2: несумісні моделі даних.',
 'imagenocrossnamespace' => 'Неможливо дати файлові назву з іншого простору назв',
 'nonfile-cannot-move-to-file' => 'Не можна перейменовувати сторінки з інших просторів назв на файли',
 'imagetypemismatch' => 'Нове розширення файлу не співпадає з його типом',
@@ -2971,6 +3005,7 @@ $1',
 'import-interwiki-templates' => 'Включити всі шаблони',
 'import-interwiki-submit' => 'Імпортувати',
 'import-interwiki-namespace' => 'Цільовий простір назв:',
+'import-interwiki-rootpage' => "Коренева сторінка (необов'язково):",
 'import-upload-filename' => 'Назва файлу:',
 'import-comment' => 'Примітка:',
 'importtext' => 'Будь ласка, експортуйте сторінку з іншої вікі, використовуючи [[Special:Export|засіб експорту]], збережіть файл, а потім завантажте його сюди.',
@@ -3002,6 +3037,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' => 'Журнал імпорту',
@@ -3013,7 +3051,6 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'Тестування JavaScript',
-'javascripttest-disabled' => 'Цю функцію відключено.',
 'javascripttest-title' => 'Працює  $1  випробувань',
 'javascripttest-pagetext-noframework' => 'Ця сторінка призначений для тестування JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Невідоме середовище тестування " $1 ".',
@@ -3028,7 +3065,7 @@ $1',
 'tooltip-pt-mytalk' => 'Ваша сторінка обговорення',
 'tooltip-pt-anontalk' => 'Обговорення редагувань з цієї IP-адреси',
 'tooltip-pt-preferences' => 'Ваші налаштування',
-'tooltip-pt-watchlist' => 'Список сторінок, за якими я спостерігаю',
+'tooltip-pt-watchlist' => 'Список сторінок, за змінами в яких Ви спостерігаєте',
 'tooltip-pt-mycontris' => 'Ваш внесок',
 'tooltip-pt-login' => "Тут можна зареєструватися в системі, але це не обов'язково.",
 'tooltip-pt-anonlogin' => "Тут можна зареєструватися в системі, але це не обов'язково.",
@@ -3045,10 +3082,10 @@ $1',
 'tooltip-ca-move' => 'Перейменувати цю сторінку',
 'tooltip-ca-watch' => 'Додати цю сторінку до вашого списку спостереження',
 'tooltip-ca-unwatch' => 'Вилучити цю сторінку з вашого списку спостереження',
-'tooltip-search' => 'Шукати',
+'tooltip-search' => 'Шукати у {{GRAMMAR:genitive|{{SITENAME}}}}',
 'tooltip-search-go' => 'Перейти до сторінки, що має точно таку назву (якщо вона існує)',
 'tooltip-search-fulltext' => 'Знайти сторінки, що містять зазначений текст',
-'tooltip-p-logo' => 'Ð\93оловна Ñ\81Ñ\82оÑ\80Ñ\96нка',
+'tooltip-p-logo' => 'Ð\9fеÑ\80ейÑ\82и Ð½Ð° Ð³Ð¾Ð»Ð¾Ð²Ð½Ñ\83 Ñ\81Ñ\82оÑ\80Ñ\96нкÑ\83',
 'tooltip-n-mainpage' => 'Перейти на Головну сторінку',
 'tooltip-n-mainpage-description' => 'Перейти на головну сторінку',
 'tooltip-n-portal' => 'Про проект, про те, що ви можете зробити, і що де знаходиться',
@@ -3166,14 +3203,43 @@ The wiki server can't provide data in a format your client can read.",
 
 # Info page
 'pageinfo-title' => 'Інформація про " $1 "',
+'pageinfo-not-current' => 'Вибачте, неможливо переглянути цю інформацію для старих версій.',
+'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-language' => 'Мова вмісту сторінки',
+'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-recent-edits' => 'Кількість поточних редагувань в історії (протягом $1)',
+'pageinfo-recent-authors' => 'Кількість авторів за останній час',
+'pageinfo-magic-words' => '{{PLURAL:$1|Магічне слово|Магічні слова}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Прихована категорія|Приховані категорії}} ($1)',
+'pageinfo-templates' => 'Включено {{PLURAL:$1|шаблон|шаблонів}} ($1)',
+'pageinfo-toolboxlink' => 'Інформація про сторінку',
+'pageinfo-redirectsto' => 'Перенаправляє на',
+'pageinfo-redirectsto-info' => 'інформація',
+'pageinfo-contentpage' => 'Рахується як стаття',
+'pageinfo-contentpage-yes' => 'Так',
+'pageinfo-protect-cascading' => 'Звідси розпочинається каскадний захист',
+'pageinfo-protect-cascading-yes' => 'Так',
+'pageinfo-protect-cascading-from' => 'Каскадний захист починається тут',
 
 # Skin names
 'skinname-standard' => 'Стандартне',
@@ -3196,6 +3262,8 @@ The wiki server can't provide data in a format your client can read.",
 'markedaspatrollederror' => 'Неможливо позначити як перевірену',
 'markedaspatrollederrortext' => 'Ви повинні зазначити версію, яка буде позначена як перевірена.',
 'markedaspatrollederror-noautopatrol' => 'Вам не дозволено позначати власні редагування як перевірені.',
+'markedaspatrollednotify' => 'Цю зміну у «$1» було позначено як відпатрульовану.',
+'markedaspatrollederrornotify' => 'Не вдалося поставити позначку про патрулювання.',
 
 # Patrol log
 'patrol-log-page' => 'Журнал патрулювання',
@@ -3228,6 +3296,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 {{PLURAL:$2|піксель|пікселі|пікселів}}, розмір файлу: $3',
 'show-big-image' => 'Повна роздільність',
 'show-big-image-preview' => 'Розмір при попередньому перегляді: $1.',
 'show-big-image-other' => '{{PLURAL:$2|Інша роздільність|Інші роздільності}}: $1.',
@@ -3237,6 +3306,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' => 'Галерея нових файлів',
@@ -3261,6 +3332,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 година|$1 години|$1 годин}}',
 'days' => '{{PLURAL:$1|$1 день|$1 дні|$1 днів}}',
 'ago' => '$1 тому',
+'just-now' => 'щойно',
 
 # Bad image list
 'bad_image_list' => 'Формат має бути наступним:
@@ -3847,6 +3919,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[«Interwiki transcluding» вимкнено]',
 'scarytranscludefailed' => '[Помилка звертання до шаблону $1]',
+'scarytranscludefailed-httpstatus' => '[Не вдалось завантажити шаблон для $1: HTTP $2]',
 'scarytranscludetoolong' => '[URL дуже довгий]',
 
 # Delete conflict
@@ -4034,6 +4107,7 @@ $5
 'version-license' => 'Ліцензія',
 'version-poweredby-credits' => "Ця Вікі працює на системі управління вмістом '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
 'version-poweredby-others' => 'інші',
+'version-credits-summary' => 'Нам хотілося б відзначити наступних осіб, що зробили внесок у [[Special:Version|MediaWiki]].',
 'version-license-info' => 'MediaWiki є вільним програмним забезпеченням, ви можете розповсюджувати та/або модифікувати його відповідно до умов GNU General Public License, яка опублікованя фондом вільного програмного забезпечення; або версії 2 Ліцензії, або (на Ваш розсуд) будь-якої наступної версії. 
 
 MediaWiki поширюється в надії, що вона буде корисною, але БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ, навіть без неявної гарантії КОМЕРЦІЙНОЇ ПРИДАТНОСТІ чи ПРИДАТНОСТІ ДЛЯ ПЕВНОЇ МЕТИ. Дивіться GNU General Public License для більш докладної інформації. 
@@ -4148,8 +4222,8 @@ MediaWiki поширюється в надії, що вона буде кори
 'sqlite-no-fts' => '$1 без підтримки повнотекстового пошуку',
 
 # New logging system
-'logentry-delete-delete' => '$1 вилучив сторінку $3',
-'logentry-delete-restore' => '$1 відновив сторінку $3',
+'logentry-delete-delete' => '$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3',
+'logentry-delete-restore' => '$1 {{GENDER:$2|відновив|відновила}} сторінку $3',
 'logentry-delete-event' => '$1 змінив видимість {{PLURAL:$5 запису журнала|$5 записів журналу}} на $3: $4',
 'logentry-delete-revision' => '$1 змінив видимість {{PLURAL:$5 версії|$5 версій}} на сторінці $3: $4',
 'logentry-delete-event-legacy' => '$1 змінив видимість записів журналу подій $3',
@@ -4167,15 +4241,15 @@ MediaWiki поширюється в надії, що вона буде кори
 'revdelete-uname-unhid' => "ім'я користувача відкрито",
 'revdelete-restricted' => 'застосовані обмеження для адміністраторів',
 'revdelete-unrestricted' => 'зняті обмеження для адміністраторів',
-'logentry-move-move' => '$1 перейменував сторінку з $3 на $4',
-'logentry-move-move-noredirect' => '$1 перейменував сторінку з $3 на $4 без створення перенаправлення',
-'logentry-move-move_redir' => '$1 перейменував сторінку з $3 на $4 поверх перенаправлення',
-'logentry-move-move_redir-noredirect' => '$1 перейменував сторінку з $3 на $4 поверх перенаправлення без залишення самого перенаправлення',
+'logentry-move-move' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4',
+'logentry-move-move-noredirect' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4 без створення перенаправлення',
+'logentry-move-move_redir' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку з $3 на $4 поверх перенаправлення',
+'logentry-move-move_redir-noredirect' => '$1 {{GENDER:$2|перейменував|перейменувала}} сторінку $3 на $4 поверх перенаправлення і без залишення перенаправлення',
 'logentry-patrol-patrol' => '$1 відпатрулював версію $4 сторінки $3',
 'logentry-patrol-patrol-auto' => '$1 автоматично відпатрулював версію $4 сторінки $3',
-'logentry-newusers-newusers' => '$1 створив обліковий запис користувача',
-'logentry-newusers-create' => '$1 — створений обліковий запис',
-'logentry-newusers-create2' => '$1 створив обліковий запис користувача $3',
+'logentry-newusers-newusers' => 'Створено обліковий запис $1',
+'logentry-newusers-create' => 'Створено обліковий запис $1',
+'logentry-newusers-create2' => '$1 {{GENDER:$2|створив|створила}} обліковий запис {{GENDER:$4|користувача|користувачки}} $3',
 'logentry-newusers-autocreate' => '$1 — автоматично створений обліковий запис',
 'newuserlog-byemail' => 'пароль надісланий електронною поштою',
 
@@ -4195,6 +4269,10 @@ MediaWiki поширюється в надії, що вона буде кори
 'feedback-bugcheck' => 'Чудово! Просто перевірте, що це не одна з вже [$1 відомих помилок].',
 'feedback-bugnew' => 'Я перевірив. Повідомити про нову помилку',
 
+# Search suggestions
+'searchsuggest-search' => 'Пошук',
+'searchsuggest-containing' => 'що містять...',
+
 # API errors
 'api-error-badaccess-groups' => 'Вам не дозволено завантажувати файли до цього вікіпроекту.',
 'api-error-badtoken' => 'Внутрішня помилка: некоректний токен.',
@@ -4247,4 +4325,6 @@ MediaWiki поширюється в надії, що вона буде кори
 'duration-centuries' => '$1 {{PLURAL:$1|століття|століття|століть}}',
 'duration-millennia' => '$1 {{PLURAL:$1|тисячоліття|тисячоліття|тисячоліть}}',
 
+# Unknown messages
+'svg-long-error' => 'неправильний SVG-файл: $1',
 );
index b726e80..2b844ae 100644 (file)
@@ -14,6 +14,7 @@
  * @author O.bangash
  * @author Rachitrali
  * @author Reedy
+ * @author Tahir mq
  * @author Wisesabre
  * @author ZxxZxxZ
  * @author לערי ריינהארט
@@ -184,7 +185,6 @@ $messages = array(
 'qbbrowse' => 'تصفّح',
 'qbedit' => 'ترمیم',
 'qbpageoptions' => 'صفحۂ ہٰذا',
-'qbpageinfo' => 'مفہوم',
 'qbmyoptions' => 'میرے صفحات',
 'qbspecialpages' => 'خاص صفحات',
 'faq' => 'معلوماتِ عامہ',
@@ -195,6 +195,7 @@ $messages = array(
 'vector-action-delete' => 'حذف کرو',
 'vector-action-move' => 'منتقل کرو',
 'vector-action-protect' => 'محفوظ کرو',
+'vector-action-undelete' => 'بحال',
 'vector-action-unprotect' => 'تحفظ میں تبدیلی',
 'vector-view-create' => 'تخلیق',
 'vector-view-edit' => 'ترمیم',
@@ -215,6 +216,7 @@ $messages = array(
 'searcharticle' => 'چلو',
 'history' => 'تاریخچہ ء صفحہ',
 'history_short' => 'تاریخچہ',
+'updatedmarker' => 'میری آخری آمد تک جدید',
 'printableversion' => 'قابل طبع نسخہ',
 'permalink' => 'مستقل کڑی',
 'print' => 'طباعت',
@@ -233,7 +235,7 @@ $messages = array(
 'unprotectthispage' => 'اِسے صفحے کی تحفظ تبدیل کریں',
 'newpage' => 'نیا صفحہ',
 'talkpage' => 'اس صفحہ پر تبادلۂ خیال کریں',
-'talkpagelinktext' => 'گفتگو',
+'talkpagelinktext' => 'تبادلۂ خیال',
 'specialpage' => 'خصوصی صفحہ',
 'personaltools' => 'ذاتی اوزار',
 'postcomment' => 'اگلا حصّہ',
@@ -263,6 +265,7 @@ $messages = array(
 برائے مہربانی! صفحہ دیکھنے کیلئے دوبارہ کوشش کرنے سے پہلے ذرا انتظار فرمالیجئے.
 
 $1',
+'pool-errorunknown' => 'نامعلوم خطا',
 
 # All link text and link target definitions of links into project namespace that get used by other message strings, with the exception of user group pages (see grouppage) and the disambiguation template definition (see disambiguations).
 'aboutsite' => 'کا تعارف {{SITENAME}}',
@@ -276,8 +279,8 @@ $1',
 'edithelp' => 'معاونت براۓ ترمیم',
 'edithelppage' => 'Help:ترمیم',
 'helppage' => 'Help:فہرست',
-'mainpage' => 'سرÙ\88رÙ\82',
-'mainpage-description' => 'سرÙ\88رÙ\82',
+'mainpage' => 'صÙ\81Ø­Û\81 Ø§Ù\88Ù\84',
+'mainpage-description' => 'صÙ\81Ø­Û\81 Ø§Ù\88Ù\84',
 'policy-url' => 'Project:حکمتِ عملی',
 'portal' => 'دیوان عام',
 'portal-url' => 'Project:دیوان عام',
@@ -300,6 +303,7 @@ $1',
 'youhavenewmessages' => 'آپکے لیۓ ایک $1 ہے۔ ($2)',
 'newmessageslink' => 'نئے پیغامات',
 'newmessagesdifflink' => 'تـجـدیـد مـاقـبل آخـر سے فـرق',
+'newmessagesdifflinkplural' => 'آخری {{PLURAL:$1|تبدیلی|تبدیلیاں}}',
 'youhavenewmessagesmulti' => 'ء$1 پر آپ کیلئے نئے پیغامات ہیں',
 'editsection' => 'ترمیم',
 'editsection-brackets' => '[$1]',
@@ -311,6 +315,7 @@ $1',
 'toc' => 'فہرست',
 'showtoc' => 'دکھائیں',
 'hidetoc' => 'چھپائیں',
+'collapsible-expand' => 'توسیع',
 'thisisdeleted' => 'دیکھیں یا بحال کریں $1؟',
 'viewdeleted' => 'دیکھیں $1؟',
 'restorelink' => '{{PLURAL:$1|ایک ترمیم حذف ہوچکی|$1 ترامیم حذف ہوچکیں}}',
@@ -320,10 +325,12 @@ $1',
 'site-rss-feed' => '$1 آر.ایس.ایس فیڈ',
 'site-atom-feed' => '$1 اٹوم فیڈ',
 'page-rss-feed' => '"$1" آر.ایس.ایس فیڈ',
-'page-atom-feed' => '"$1" اٹوم فیڈ',
+'page-atom-feed' => '"$1" اٹوم خورد',
 'feed-atom' => 'اٹوم',
 'feed-rss' => 'آر ایس ایس',
 'red-link-title' => '$1 (صفحہ موجود نہیں)',
+'sort-descending' => 'ترتیب نزولی',
+'sort-ascending' => 'ترتیب صعودی',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'صفحہ',
@@ -389,6 +396,7 @@ Warning: Page may not contain recent updates.',
 'badarticleerror' => 'اس صفحہ پر یہ عمل انجام نہیں دیا جاسکتا۔',
 'cannotdelete' => 'صفحہ یا ملف $1 کو حذف نہیں کیا جاسکتا.
 ہوسکتا ہے کہ اسے پہلے ہی کسی نے حذف کردیا ہو.',
+'cannotdelete-title' => 'صفحہ ھذف نہیں کیا جا سکتا "$1"',
 'badtitle' => 'خراب عنوان',
 'badtitletext' => 'درخواست شدہ صفحہ کا عنوان ناقص، خالی، یا کوئی غلط ربط شدہ بین لسانی یا بین ویکی عنوان ہے.
 شاید اِس میں ایک یا زیادہ ایسے حروف موجود ہوں جو عنوانات میں استعمال نہیں ہوسکتے.',
@@ -409,6 +417,7 @@ Warning: Page may not contain recent updates.',
 'ns-specialprotected' => 'خاص صفحات کی تدوین نہیں کی جاسکتی.',
 'titleprotected' => 'اس عنوان کو [[User:$1|$1]] نے تخلیق سے محفوظ کیا ہے.
 وجہ یہ بتائی گئی ہے: "\'\'$2\'\'"',
+'exception-nologin' => 'غیر داخل نوشتہ',
 
 # Virus scanner
 'virus-badscanner' => "خراب وضعیت: انجان وائرسی مفراس: ''$1''",
@@ -418,14 +427,13 @@ Warning: Page may not contain recent updates.',
 # Login and logout pages
 'logouttext' => "'''اب آپ خارج ہوچکے ہیں'''
 
-آپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے [[Special:UserLogin|دوبارہ داخلِ نوشتہ]] بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
-'welcomecreation' => '== خوش آمدید، $1 ! ==
-آپ کا کھاتہ بنا دیا گیا ہے۔ اپنی [[Special:Preferences|{{SITENAME}} ترجیحات]] مرتب کرنا مت بھولئے گا.',
+آپ گمنام طور پر {{SITENAME}}  کا استعمال جاری رکھ سکتے ہیں، یا دوبارہ اسی نام یا مختلف نام سے <span class='plainlinks'>[$1 دوبارہ داخلِ نوشتہ]</span> بھی ہو سکتے ہیں۔  یہ یاد آوری کرلیجیۓ کہ کچھ صفحات ایسے نظر آتے رہیں گے کہ جیسے ابھی آپ خارج نہیں ہوئے ، جب تک آپ اپنے متصفح کا ابطن صاف نہ کردیں۔",
 'yourname' => 'اسمِ رکنیت',
 'yourpassword' => 'کلمۂ شناخت',
 'yourpasswordagain' => 'کلمۂ شناخت دوبارہ لکھیں',
 'remembermypassword' => 'اِس متصفح پر میرے داخلِ نوشتگی معلومات یاد رکھو (زیادہ سے زیادہ $1 {{PLURAL:$1|دِن|ایام}} کیلئے)',
 'yourdomainname' => 'آپکا ڈومین',
+'password-change-forbidden' => 'آپ اس ویکی پر پارلفظ (پاس روڈ) تبدیل نہیں کر سکتے',
 'externaldberror' => 'یا تو توثیقی ڈیٹابیس میں خطا واقع ہوئی اور یا آپ کو بیرونی کھاتہ بتاریخ کرنے کی اِجازت نہیں ہے.',
 'login' => 'داخل ہوں',
 'nav-login-createaccount' => 'کھاتہ کھولیں یا اندراج کریں',
@@ -511,6 +519,9 @@ Warning: Page may not contain recent updates.',
 دوبارہ کوشش کرنے سے پہلے انتظار فرمائیے.',
 'loginlanguagelabel' => 'زبان: $1',
 
+# E-mail sending
+'user-mail-no-addy' => 'برقی ڈاک بھیجنے کی کوشش بغیر برقی ڈاک پتہ',
+
 # Change password dialog
 'resetpass' => 'پارلفظ تبدیل کریں',
 'resetpass_announce' => 'آپ ایک برقی ارسال کردہ عارضی رمز کے ساتھ داخل ہوئے ہیں.
@@ -533,6 +544,15 @@ Warning: Page may not contain recent updates.',
 # Special:PasswordReset
 'passwordreset' => 'پارلفظ کی بازتعینی',
 'passwordreset-username' => 'اسمِ صارف:',
+'passwordreset-domain' => 'ساحہ:',
+'passwordreset-email' => 'برقی ڈاک پتہ:',
+
+# Special:ChangeEmail
+'changeemail-oldemail' => 'حالیہ برقی ڈاک پتہ:',
+'changeemail-newemail' => 'نیا برقی ڈاک پتہ:',
+'changeemail-none' => '(کوئی نہیں)',
+'changeemail-submit' => 'برقی ڈاک تبدیل کریں',
+'changeemail-cancel' => 'منسوخ',
 
 # Edit page toolbar
 'bold_sample' => 'دبیز متن',
@@ -606,7 +626,7 @@ $1 نے پابندی لگائی تھی.
 'noarticletext' => 'اِس صفحہ میں فی الحال کوئی متن موجود نہیں ہے.
 آپ دیگں صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کیلئے تلاش کرسکتے ہیں]]، <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں],
 یا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اِس صفحہ میں ترمیم کرسکتے ہیں]</span>',
-'noarticletext-nopermission' => 'اِس صفحہ میں فی الحال کوئی متن موجود نہیں ہے.
+'noarticletext-nopermission' => 'اس صفحہ میں فی الحال کوئی متن موجود نہیں ہے.
 آپ دیگں صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کیلئے]] یا <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں]</span>',
 'updated' => '(اپ ڈیٹڈ)',
 'note' => "'''نوٹ:'''",
@@ -625,6 +645,7 @@ $1 نے پابندی لگائی تھی.
 \"محفوظ\" کا بٹن ٹک کرنے سے '''صرف''' بالائی متن محفوظ ہوگا.",
 'yourtext' => 'آپ کی تحریر',
 'storedversion' => 'ذخیرہ شدہ نظرثانی',
+'nonunicodebrowser' => '"انتباہ: آپ کا براؤزر یونی کوڈ کے مطابق نہیں ہے."',
 'editingold' => "'''انتباہ: آپ اس صفحے کا ایک پرانا مسودہ مرتب کررہے ہیں۔ اگر آپ اسے محفوظ کرتے ہیں تو اس صفحے کے اس پرانے مسودے سے اب تک کی جانے والی تمام تدوین ضائع ہو جاۓ گی۔'''",
 'yourdiff' => 'تضادات',
 'copyrightwarning' => "یہ یادآوری کرلیجیۓ کہ {{SITENAME}} میں تمام تحریری شراکت جی این یو آزاد مسوداتی اجازہ ($2)کے تحت تصور کی جاتی ہے (مزید تفصیل کیلیۓ $1 دیکھیۓ)۔ اگر آپ اس بات سے متفق نہیں کہ آپکی تحریر میں ترمیمات کری جائیں اور اسے آزادانہ (جیسے ضرورت ہو) استعمال کیا جاۓ تو براۓ کرم اپنی تصانیف یہاں داخل نہ کیجیۓ۔ اگر آپ یہاں اپنی تحریر جمع کراتے ہیں تو آپ اس بات کا بھی اقرار کر رہے ہیں کہ، اسے آپ نے خود تصنیف کیا ہے یا دائرہ ءعام (پبلک ڈومین) سے حاصل کیا ہے یا اس جیسے کسی اور آذاد وسیلہ سے۔'''بلااجازت ایسا کام داخل نہ کیجیۓ جسکا حق ِطبع و نشر محفوظ ہو!'''",
@@ -655,6 +676,10 @@ $1 نے پابندی لگائی تھی.
 'edit-already-exists' => 'نیا صفحہ تخلیق نہیں کیا جاسکتا.
 یہ پہلے سے موجود ہے.',
 
+# Content models
+'content-model-text' => 'سادہ متن',
+'content-model-javascript' => 'جاوا اسکرپٹ',
+
 # History pages
 'viewpagelogs' => 'اس صفحہ کیلیے نوشتہ جات دیکھیے',
 'nohistory' => 'اِس صفحہ کیلئے کوئی تدوینی تاریخچہ موجود نہیں ہے.',
@@ -749,6 +774,7 @@ $1",
 
 # Diffs
 'history-title' => '"$1" کا نظرثانی تاریخچہ',
+'difference-multipage' => '(فرق مابین صفحات)',
 'lineno' => 'لکیر $1:',
 'compareselectedversions' => 'منتخب متـن کا موازنہ',
 'editundo' => 'استرجع',
@@ -790,8 +816,6 @@ $1",
 'search-interwiki-caption' => 'ساتھی منصوبے',
 'search-interwiki-default' => '$1 نتائج:',
 'search-interwiki-more' => '(مزید)',
-'search-mwsuggest-enabled' => 'بمع تجاویز',
-'search-mwsuggest-disabled' => 'تجاویز نہیں',
 'search-relatedarticle' => 'متعلقہ',
 'mwsuggest-disable' => 'AJAX تجاویز غیرفعال',
 'searchrelated' => 'متعلقہ',
@@ -804,6 +828,7 @@ $1",
 'powersearch-ns' => 'جائے نام میں تلاش:',
 'powersearch-redir' => 'فہرستِ رجوع مکرر',
 'powersearch-field' => 'تلاش برائے',
+'powersearch-togglelabel' => 'جانچ',
 'powersearch-toggleall' => 'تمام',
 'powersearch-togglenone' => 'کوئی نہیں',
 'search-external' => 'بیرونی تلاش',
@@ -826,6 +851,7 @@ $1",
 'skin-preview' => 'پیش منظر',
 'datedefault' => 'کوئی ترجیحات نہیں',
 'prefs-datetime' => 'تاریخ و وقت',
+'prefs-user-pages' => 'صارف صفحات',
 'prefs-personal' => 'نمایۂ صارف',
 'prefs-rc' => 'حالیہ تبدیلیاں',
 'prefs-watchlist' => 'زیرِنظر فہرست',
@@ -845,6 +871,7 @@ $1",
 'rows' => 'صفیں:',
 'columns' => 'قطاریں:',
 'searchresultshead' => 'تلاش',
+'stub-threshold-disabled' => 'غیر فعال',
 'recentchangesdays' => 'حالیہ تبدیلیوں میں دکھائی جانے والے ایّام:',
 'recentchangesdays-max' => '(زیادہ سے زیادہ $1 {{PLURAL:$1|دن|ایام}})',
 'recentchangescount' => 'دکھائی جانے والی ترامیم کی تعداد:',
@@ -900,13 +927,27 @@ HTML tags جانچئے.',
 'prefs-i18n' => 'بین الاقوامیت',
 'prefs-signature' => 'دستخط',
 'prefs-dateformat' => 'شکلبندِ تاریخ',
+'prefs-advancedediting' => 'اعلی اختیارات',
+'prefs-advancedrc' => 'اعلی اختیارات',
+'prefs-advancedrendering' => 'اعلی اختیارات',
+'prefs-advancedsearchoptions' => 'اعلی اختیارات',
+'prefs-advancedwatchlist' => 'اعلی اختیارات',
+'prefs-diffs' => 'فروق',
 
 # User rights
 'userrights' => 'حقوقِ صارف کی نظامت',
 'userrights-lookup-user' => 'گروہائے صارف کا انتظام',
 'userrights-user-editname' => 'کوئی اسم‌صارف داخل کیجئے:',
+'editusergroup' => 'ترمیم گروہائے صارف',
 'editinguser' => "تبدیلئ حقوق برائے صارف '''[[صارف:$1|$1]]''' $2",
+'userrights-editusergroup' => 'ترمیم گروہائے صارف',
+'saveusergroups' => 'گروہائے صارف محفوظ',
 'userrights-groupsmember' => 'رکنِ:',
+'userrights-groupsmember-auto' => 'اعتباری صارف در',
+'userrights-groups-help' => 'آپ ان گروہان میں تبدیلی کرسکتے ہیں جن سے صارف متعلق ہے: 
+* نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے ہے۔ 
+* غیر نشان زد خانہ کا مطلب یہ ہے کہ صارف کا تعلق اس گروہ سے نہیں ہے۔ 
+* یہ * علامت اس بات کا اشارہ ہے کہ آپ اس گروہ کو نہیں ہٹا سکتے جسے ایک مرتبہ آپ نے شامل کردیا ہو، یا اس کے بر عکس۔',
 'userrights-reason' => 'وجہ:',
 'userrights-no-interwiki' => 'دوسرے ویکیوں پر حقوقِ صارف میں ترمیم کی آپ کو اجازت نہیں ہے.',
 'userrights-changeable-col' => 'مجموعات جو آپ تبدیل کرسکتے ہیں',
@@ -915,17 +956,36 @@ HTML tags جانچئے.',
 # Groups
 'group' => 'گروہ:',
 'group-user' => 'صارفین',
+'group-autoconfirmed' => 'خود توثیق شدہ صارفین',
 'group-bot' => 'روبالات',
 'group-sysop' => 'منتظمین',
+'group-bureaucrat' => 'مامورین اداری',
+'group-suppress' => 'نگران',
 'group-all' => '(تمام)',
 
 'group-user-member' => 'صارف',
 'group-autoconfirmed-member' => 'خودتصدیق شدہ صارف',
 'group-bot-member' => 'خودکار صارف',
 'group-sysop-member' => 'منتظم',
+'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}}:منتظمین',
 
+# Rights
+'right-upload' => 'ملفات زبراثقال (اپ لوڈ) کریں',
+'right-delete' => 'صفحات حذف کریں',
+'right-sendemail' => 'دیگر صارفین کو برقی ڈاک بھیجیں',
+
+# User rights log
+'rightslog' => 'نوشتہ صارفی اختیارات',
+'rightslogtext' => 'یہ صارفی اختیارات میں تبدیلیوں کا نوشتہ ہے۔',
+'rightslogentry' => 'گروہ رکنیت میں برائے $1 از $2 تا $3 تبدیلی ہوئی',
+'rightsnone' => '(کچھ نہیں)',
+
 # Associated actions - in the sentence "You do not have permission to X"
 'action-edit' => 'اس صفحہ میں ترمیم کریں',
 
@@ -956,7 +1016,7 @@ HTML tags جانچئے.',
 'minoreditletter' => 'م',
 'newpageletter' => 'نیا ..',
 'boteditletter' => ' خودکار',
-'rc-enhanced-expand' => 'تÙ\81صÛ\8cÙ\84ات Ø¯Ù\90کھاؤ (JavaScript Ú\86اÛ\81ئÛ\92)',
+'rc-enhanced-expand' => 'تÙ\81صÛ\8cÙ\84ات Ø¯Ù\90کھائÛ\8cÚº (JavaScript Ø¯Ø±Ú©Ø§Ø±)',
 'rc-enhanced-hide' => 'تفصیلات چھپائیے',
 
 # Recent changes linked
@@ -1063,6 +1123,7 @@ HTML tags جانچئے.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|لکمہ|لکمہ جات}}',
 'ncategories' => '{{PLURAL:$1|زمرہ|زمرہ جات}} $1',
+'nmembers' => '{{PLURAL:$1|رکن|اراکین}}',
 'lonelypages' => 'يتيم صفحات',
 'lonelypagestext' => 'مندرجہ ذیل صفحات وہ صفحات ہیں جنھیں اس وکی میں موجود صفحوں سے کوئی ربط حاصل نہیں ہوپارہا۔',
 'uncategorizedpages' => 'بے زمرہ صفحات',
@@ -1152,10 +1213,6 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'wlshowlast' => 'دکھائیں آخری $1 گھنٹے $2 دن $3',
 'watchlist-options' => 'اختیارات برائے زیرِنظرفہرست',
 
-'enotif_newpagetext' => 'یہ نیا صفحہ ہے.',
-'changed' => 'تبدیل کردیاگیا',
-'created' => 'بنا دیا گیا',
-
 # Delete
 'deletepage' => 'صفحہ ضائع کریں',
 'confirm' => 'یقین',
@@ -1194,10 +1251,17 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Undelete
 'undelete' => 'ضائع کردہ صفحات دیکھیں',
 'undeletepage' => 'معائنہ خذف شدہ صفحات',
+'undeletepagetitle' => "'''ذیل میں [[:$1|$1]] کے حذف شدہ ترامیم درج ہیں۔'''",
 'viewdeletedpage' => 'حذف شدہ صفحات دیکھیے',
+'undelete-fieldset-title' => 'ترامیم بحال کریں',
+'undeletehistory' => 'اگر آپ اس صفحہ کو بحال کرتے ہیں، تو اس صفحہ کے تاریخچہ میں تمام ترامیم بھی بحال ہوجائیگی۔
+اگر حذف شدگی کے بعد کوئی نیا صفحہ اسی نام سے تخلیق کیا گیا ہو، تو تمام بحال شدہ ترامیم گذشتہ تاریخچہ میں ظاہر ہوگی۔',
+'undeleterevdel' => 'بحالیٔ صفحہ کا اقدام مکمل نہیں ہوگا اگر اس کا تنیجہ صفحہ کے اوپر کے حصہ کی ترمیم یا ملف کا اعادہ جزوی طور پر حذف کیا جارہا ہو۔
+ایسی صورت میں لازمی طور آپ حالیہ حذف شدہ اعادے کو ظاہر کریں۔',
 'undeletebtn' => 'بحال',
 'undeletelink' => 'دیکھو/بحال کرو',
 'undeleteviewlink' => 'دکھاؤ',
+'undeleteinvert' => 'انتخاب بالعکس',
 'undeletecomment' => 'وجہ:',
 
 # Namespace form on various pages
@@ -1232,11 +1296,13 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'linkshere' => "'''[[:$1]]''' سے درج ذیل صفحات مربوط ہیں:",
 'nolinkshere' => "'''[[:$1]]''' سے کوئی روابط نہیں۔",
 'isredirect' => 'لوٹایا گیا صفحہ',
+'istemplate' => 'شامل شدہ',
 'isimage' => 'ربطِ ملف',
 'whatlinkshere-links' => 'روابط',
 'whatlinkshere-hideredirs' => 'رجوع مکررات $1',
+'whatlinkshere-hidetrans' => 'تضمینات',
 'whatlinkshere-hidelinks' => 'روابط $1',
-'whatlinkshere-hideimages' => 'روابطِ تصویر $1',
+'whatlinkshere-hideimages' => 'روابطِ تصاویر $1',
 'whatlinkshere-filters' => 'فلٹرذ',
 
 # Block/unblock
@@ -1254,6 +1320,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'proxyblocksuccess' => 'کردیا.',
 
 # Move page
+'move-page' => 'منتقلی',
 'move-page-legend' => 'منتقلئ صفحہ',
 'movepagetext' => "نیچے دیا گیا تشکیلہ (فـارم) استعمال کرکے اس صفحہ کا عنوان دوبارہ منتخب کیا جاسکتا ہے، ساتھ ہی اس سے منسلک تاریخچہ بھی نۓ نام پر منتقل ہوجاۓ گا۔ اسکے بعد سے اس صفحے کا پرانا نام ، نۓ نام کی جانب -- لوٹایا گیا صفحہ -- کی حیثیت اختیار کرلے گا۔ لیکن یادآوری کرلیجیۓ دیگر صفحات پر ، پرانے صفحہ کی جانب دیۓ گۓ روابط (لنکس) تبدیل نہیں ہونگے؛ اس بات کو یقینی بنانا ضروری ہے کہ کوئی دوہرا یا شکستہ -- پلٹایا گیا ربط -- نہ رہ جاۓ۔
 
@@ -1263,6 +1330,18 @@ Also see [[Special:WantedCategories|wanted categories]].',
 
 ''' انـتـبـاہ !'''
  کسی اہم اور مقبول صفحہ کی منتقلی ، غیرمتوقع اور پریشان کن بھی ہی ہوسکتی ہے اس لیۓ ؛ منتقلی سے قبل براہ کرم یقین کرلیجۓ کہ آپ اسکے منطقی نتائج سے باخبر ہیں۔",
+'movepagetext-noredirectfixer' => "درج ذیل ورقہ کے ذریعہ صفحہ کو نیا نام دیا جاسکتا ہے، اس کے ساتھ صفحہ کا تاریخچہ بھی منتقل ہوجائیگا۔
+نئے عنوان کے جانب قدیم عنوان کو رجوع مکرر کردیا جائیگا۔
+
+یقین کرلیں کہ [[Special:DoubleRedirects|مکرر]] یا [[Special:BrokenRedirects|شکستہ رجوع مکررات]] موجود نہیں ہیں۔
+آپ اس بات کو یقینی بنانے کے ذمہ دار ہیں کہ روابط انہیں جگہوں سے مربوط ہیں جن کو فرض کیا گیا ہے۔
+
+خیال رہے کہ یہ صفحہ منتقل '''نہیں''' ہوگا اگر نئے عنوان کے ساتھ صفحہ پہلے سے موجود ہو، سوائے اس کے کہ صفحہ خالی ہو اور اس کا گذشتہ ترمیمی تاریخچہ موجود نہ ہو۔
+اس کا مطلب ہے آپ سے اگر غلطی ہوجائے تو آپ صفحہ کو اسی جگہ لوٹا سکتے ہیں، تاہم موجود صفحہ پر برتحریر (overwrite) نہیں کرسکتے۔
+
+'''انتباہ!'''
+کسی اہم اور مقبول صفحہ کی منتقلی، غیرمتوقع اور پریشان کن بھی ہی ہوسکتی ہے اس لیۓ؛ 
+منتقلی سے قبل براہ کرم یقین کرلیجۓ کہ آپ اسکے منطقی نتائج سے باخبر ہیں۔",
 'movearticle' => 'مـنـتـقـل کـریں',
 'newtitle' => 'نـیــا عـنــوان',
 'move-watch' => 'صفحہ زیر نظر',
@@ -1301,7 +1380,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'tooltip-pt-mytalk' => 'آپ کا صفحۂ گفتگو',
 'tooltip-pt-preferences' => 'آپ کی ترجیحات',
 'tooltip-pt-watchlist' => 'اُن صفحات کی فہرست جن کی تبدیلیاں آپ کی زیرِنظر ہیں',
-'tooltip-pt-mycontris' => 'آپ Ú©Û\92 Ù\85ساÛ\81Ù\85ات کی فہرست',
+'tooltip-pt-mycontris' => 'آپ Ú©Û\8c Ø´Ø±Ø§Ú©ت کی فہرست',
 'tooltip-pt-login' => 'آپ کیلئے داخلِ نوشتہ ہونا اچھا ہے؛ تاہم، یہ ضروری نہیں',
 'tooltip-pt-logout' => 'خارجِ نوشتہ ہوجائیں',
 'tooltip-ca-talk' => 'مضمون بارے تبادلۂ خیال',
@@ -1357,6 +1436,9 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'anonymous' => '{{SITENAME}} گمنام صارف',
 'others' => 'دیگر',
 
+# Patrolling
+'markaspatrolledtext' => 'اس صفحہ کو بطور مراجعت شدہ نشان زد کریں',
+
 # Image deletion
 'deletedrevision' => 'حذف شدہ پرانی ترمیم $1۔',
 
@@ -1365,6 +1447,8 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'nextdiff' => 'صفحہ کا نام:',
 
 # Media information
+'file-info-size' => '
+$1 × $2 عکصر (پکسلز)، حجم ملف: $3، MIME قسم: $4',
 'file-nohires' => 'اس سے بڑی تصمیم دستیاب نہیں۔',
 'show-big-image' => 'مکمل تصمیم',
 
@@ -1442,4 +1526,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 # Special:SpecialPages
 'specialpages' => 'خصوصی صفحات',
 
+# Search suggestions
+'searchsuggest-search' => 'تلاش',
+
 );
index 7ed810b..abd15bf 100644 (file)
@@ -12,6 +12,7 @@
  * @author Casual
  * @author CoderSI
  * @author Lyncos
+ * @author Nataev
  * @author Sociologist
  * @author Urhixidur
  * @author Xexdof
@@ -61,6 +62,8 @@ $messages = array(
 'tog-newpageshidepatrolled' => "Yangi sahifalar ro'yxatida patrullangan sahifalarni yashirish",
 'tog-numberheadings' => 'Sarlavhalarni avtomatik tarzda raqamlash',
 'tog-showtoolbar' => "Tahrirlash vaqtida yuqorigi unsurlar darchasini ko'rsatish (JavaScript)",
+'tog-editsection' => "[tahrir] havolasini har bir seksiyada ko'rsatish",
+'tog-showtoc' => "Mundarijani ko'rsatish (3 ta sarlavhadan ko'p bo'lgan sahifalar uchun)",
 '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',
@@ -68,12 +71,15 @@ $messages = array(
 'tog-watchdeletion' => 'Men yoʻqotgan sahifa va fayllarni kuzatuv roʻyxatimga qoʻsh',
 'tog-minordefault' => "Boshlang'ich holatga barcha tahrirlarni kamahamiyatli qilib belgilash",
 'tog-previewontop' => "Oldindan ko'rishni tahrirlash oynasi oldiga joylashtirish",
+'tog-previewonfirst' => "Tahrirlashga o'tishda batafsil ko'rinishni ko'rsatish",
+'tog-nocache' => "Brauzerda sahifalarni keshda saqlashni o'chirish",
 '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' => 'Joriy imzo:',
 'tog-fancysig' => 'Imzoni wikimatn sifatida qara (avtomatik ishoratsiz)',
+'tog-showjumplinks' => '"ga o\'tish" yordamchi havolalarini yoqish',
 'tog-ccmeonemails' => 'Men boshqa foydalanuvchilarga yuborayotgan xatnig nusxasi oʻzimning e-pochtamga ham yuborilsin',
-'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsat',
+'tog-showhiddencats' => 'Yashirin turkumlarni koʻrsatish',
 'tog-noconvertlink' => "Sarlavhaga aylantirish dastagini o'chirib qo'yish",
 
 'underline-always' => 'Har doim',
@@ -81,7 +87,11 @@ $messages = array(
 'underline-default' => 'Brauzer moslamari boʻyicha',
 
 # Font style option in Special:Preferences
+'editfont-style' => 'Tahrirlash maydoni bosma harflari turi',
 'editfont-default' => 'Brauzer moslamari boʻyicha',
+'editfont-monospace' => 'Monoenli bosma harflar',
+'editfont-sansserif' => 'Sans-serif bosma harflari',
+'editfont-serif' => 'Serif bosma harflari',
 
 # Dates
 'sunday' => 'Yakshanba',
@@ -158,7 +168,7 @@ $messages = array(
 'newwindow' => '(yangi oynada ochiladi)',
 'cancel' => 'Bekor qilish',
 'moredotdotdot' => 'Batafsil...',
-'mypage' => 'Shaxsiy sahifa',
+'mypage' => 'Sahifa',
 'mytalk' => 'Suhbatim',
 'anontalk' => 'Bu IP uchun suhbat',
 'navigation' => 'Saytda harakatlanish',
@@ -169,11 +179,10 @@ $messages = array(
 'qbbrowse' => "Ko'rish",
 'qbedit' => 'Tahrirlash',
 'qbpageoptions' => 'Ushbu sahifa',
-'qbpageinfo' => "Sahifa haqida ma'lumot",
 'qbmyoptions' => 'Mening sahifalarim',
 'qbspecialpages' => 'Maxsus sahifalar',
 'faq' => 'TSS',
-'faqpage' => 'Project:FAQ',
+'faqpage' => 'Project:TSS',
 
 # Vector skin
 'vector-action-addsection' => 'Mavzu qoʻshish',
@@ -182,12 +191,12 @@ $messages = array(
 'vector-action-protect' => 'Himoyalash',
 'vector-action-undelete' => 'Tiklash',
 'vector-action-unprotect' => "Himoyani o'zgartirish",
-'vector-simplesearch-preference' => 'Kengaytirilgan qidiruv takliflarini yoqish (Faqat Vektor rasmiylashtirish uchun)',
-'vector-view-create' => 'Yarat',
+'vector-simplesearch-preference' => 'Soddalashtirilgan qidiruv uskunasini yoqish (faqat "Vektor" tashqi ko\'rinishi uchun)',
+'vector-view-create' => 'Yaratish',
 'vector-view-edit' => 'Tahrirlash',
 'vector-view-history' => 'Tarix',
 'vector-view-view' => 'Mutolaa',
-'vector-view-viewsource' => 'Manbasini koʻrsat',
+'vector-view-viewsource' => "Manbasini ko'rish",
 'actions' => 'Amallar',
 'namespaces' => 'Nomfazolar',
 'variants' => 'Variantlar',
@@ -210,11 +219,11 @@ $messages = array(
 'edit' => 'Tahrirlash',
 'create' => 'Yaratish',
 'editthispage' => 'Sahifani tahrirlash',
-'create-this-page' => 'Bu sahifani yarat',
+'create-this-page' => 'Ushbu sahifani yaratish',
 'delete' => 'O‘chirish',
-'deletethispage' => 'Bu sahifani oʻchir',
+'deletethispage' => 'Ushbu sahifani o‘chirish',
 'undelete_short' => '{{PLURAL:$1|tahrir|$1 tahrirlar}}ni tiklash',
-'viewdeleted_short' => "{{PLURAL:$1|o'chirilgan tahrir|$1 o'chirilgan tahrirlar}}ni ko'rish",
+'viewdeleted_short' => "{{PLURAL:$1|o'chirilgan tahrir|$1 ta o'chirilgan tahrirlar}}ni ko'rish",
 'protect' => 'Himoyalash',
 'protect_change' => 'o‘zgartirish',
 'protectthispage' => 'Ushbu sahifani himoyalash',
@@ -245,7 +254,7 @@ $messages = array(
 'viewcount' => 'Bu sahifaga {{PLURAL:$1|bir marta|$1 marta}} murojaat qilingan.',
 'protectedpage' => 'Himoyalangan sahifa',
 'jumpto' => 'Oʻtish:',
-'jumptonavigation' => 'foydalanish',
+'jumptonavigation' => 'saytda harakatlanish',
 'jumptosearch' => 'qidiruv',
 'pool-timeout' => "Muhosara (to'sish) ni kutish vaqti tugadi",
 'pool-queuefull' => "So'rovlar jamlanmasi to'ldi",
@@ -272,13 +281,21 @@ $messages = array(
 'privacypage' => 'Project:Konfidensiallik siyosati',
 
 'badaccess' => 'Ruxsatlilik xatosi',
+'badaccess-group0' => "Siz so'ralgan amallarni bajara olmaysiz",
 'badaccess-groups' => "So'ralgan amallarni kamida $1 {{PLURAL:$2|guruhi|guruhlari}} foydalanuvchilarigina amalga oshirishi mumkin.",
 
+'versionrequired' => '$1 versiyasidagi MediaWiki talab etiladi',
+'versionrequiredtext' => "Ushbu sahifani bilan ishlash uchun $1 versiyasidagi MediaWiki talab etiladi.
+[[Special:Version|Dasturiy ta'minot haqida axborot]]ni ko'ring.",
+
 'ok' => 'OK',
 'retrievedfrom' => ' "$1" dan olindi',
 'youhavenewmessages' => 'Sizga $1 keldi ($2).',
 'newmessageslink' => 'yangi xabarlar',
 'newmessagesdifflink' => 'soʻnggi oʻzgarish',
+'youhavenewmessagesfromusers' => 'Siz {{PLURAL:$3|$3 ta foydalanuvchidan}} $1 oldingiz ($2).',
+'youhavenewmessagesmanyusers' => "Siz ko'p foydalanuvchilardan $1 oldingiz ($2).",
+'newmessageslinkplural' => '{{PLURAL:$1|yangi xabar|yangi xabarlar}}',
 'newmessagesdifflinkplural' => "oxirgi {{PLURAL:$1|o'zgarish|o'zgarishlar}}",
 'youhavenewmessagesmulti' => 'Siz $1ga yangi xat oldingiz',
 'editsection' => 'tahrirlash',
@@ -292,7 +309,15 @@ $messages = array(
 'hidetoc' => 'yashirish',
 'collapsible-collapse' => "Yig'ish",
 'collapsible-expand' => 'Yoyish',
+'thisisdeleted' => "$1ni ko'rib chiqasizmi yoki tiklaysizmi?",
+'viewdeleted' => "$1ni ko'rib chiqasizmi?",
+'restorelink' => "{{PLURAL:$1|o'chirilgan tahrir|$1 ta o'chirilgan tahrirlar}}ni",
+'feedlinks' => "Ko'rinishida:",
+'feed-invalid' => "Obuna uchun no'tog'ri turdagi kanal",
+'feed-unavailable' => "Sindikatsiya tasmalariga yo'lashning imkoni yo'q",
+'site-rss-feed' => '$1 — RSS-tasmasi',
 'site-atom-feed' => '$1 — Atom-tasma',
+'page-rss-feed' => '"$1" — RSS-tasmasi',
 'page-atom-feed' => '«$1» — Atom-lenta',
 'red-link-title' => '$1 (sahifa yaratilmagan)',
 'sort-descending' => "Kamayish bo'yicha tartiblash",
@@ -303,7 +328,7 @@ $messages = array(
 'nstab-user' => 'Foydalanuvchi sahifasi',
 'nstab-media' => 'Media sahifasi',
 'nstab-special' => 'Maxsus sahifa',
-'nstab-project' => 'Vikipediya',
+'nstab-project' => 'Loyiha sahifasi',
 'nstab-image' => 'Fayl',
 'nstab-mediawiki' => 'Xabar',
 'nstab-template' => 'Andoza',
@@ -319,19 +344,23 @@ $messages = array(
 'laggedslavemode' => "'''Diqqat:''' sahifa oxirgi yangilashlarga ega bo'lmasligi mumkin.",
 'readonly' => "Ma'lumotlar bazasiga yozish to'sildi",
 'missingarticle-rev' => '(versiya №: $1)',
+'missingarticle-diff' => '(Farq: $1, $2)',
 'internalerror' => 'Ichki xato',
 'internalerror_info' => 'Ichki xato: $1',
 'badtitle' => 'Notoʻgʻri sarlavha',
-'viewsource' => 'Manbasini koʻrish',
+'viewsource' => "Manbasini ko'rish",
 'viewsource-title' => "$1 sahifasining manbasini ko'rish",
 'actionthrottled' => "Tezlik bo'yicha cheklov",
 'protectedpagetext' => 'Bu sahifa tahrirlashdan saqlanish maqsadida qulflangan.',
 'viewsourcetext' => "Siz bu sahifaning manbasini ko'rishingiz va uni nusxasini olishingiz mumkin:",
+'editinginterface' => "'''Diqqat:''' Siz dasturiy ta'minot interfeysi matni mavjud bo'lgan sahifani tahrirlamoqdasiz.
+Uning o'zgartirilishi ushbu vikidagi boshqa foydalanuvchilar uchun ham interfeysning tashqi ko'rinishiga ta'sir qiladi.
+Ushbu xabar tarjimasini qo'shish yoki o'zgartirish uchun, iltimos, MediaWikining [//translatewiki.net/ translatewiki.net] lokalizatsiya saytidan foydalaning.",
 'namespaceprotected' => "Sizda '''$1''' nomfazosi sahifalarini tahrirlash huquqi yoʻq",
 'customcssprotected' => 'Sizda uchbu CSS sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.',
 'customjsprotected' => 'Sizda uchbu JavaScript sahifani tahrirlash huquqi yoʻq, chunki bu yerda boshqa foydalanuvchining shaxsiy moslamalari saqlanadi.',
 'ns-specialprotected' => '"{{ns:special}}" nomfazosi sahifalari tahrirlanishi mumkin emas.',
-'exception-nologin' => "Siz tizimda o'zingizni tanitmadingiz",
+'exception-nologin' => "Siz tizimda o'zingizni tanishtirmadingiz",
 'exception-nologin-text' => "Bu sahifani ko'rish yoki so'ralgan amalni bajarish uchun o'zingizni tizimda tanitishingiz zarur.",
 
 # Virus scanner
@@ -344,9 +373,6 @@ $messages = array(
 
 {{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:',
@@ -371,7 +397,7 @@ Siz yangi hisob yaratdingiz.
 'createaccountmail' => "E-mail orqali maxfiy so'zni jo'natish",
 'createaccountreason' => 'Sabab:',
 'badretype' => "Siz tomondan kiritilgan maxfiy so'zlar mos kelmayapti.",
-'loginerror' => 'Foydalanuvchini aniqlashda xato',
+'loginerror' => 'Foydalanuvchini aniqlashda xatolik',
 'createaccounterror' => "Hisob yozuvini yaratishning iloji yo'q: $1",
 'loginsuccesstitle' => 'Kirish muvaffaqiyatli amalga oshdi',
 'loginsuccess' => "'''{{SITENAME}}ga \"\$1\" foydalanuvchi nomi bilan kirdingiz.'''",
@@ -384,7 +410,7 @@ Xatosiz yozishga urinib koʻring.',
 'mailmypassword' => "Elektron pochta orqali yangi maxfiy so'zni jo'natish",
 'passwordremindertitle' => "{{SITENAME}} uchun vaqtinchalik yangi maxfiy so'z",
 'emailauthenticated' => 'Sizning e-mail manzilingiz $2, $3 da tasdiqlangan.',
-'emailconfirmlink' => 'Sizning elektron pochtangizni tasdiqlash',
+'emailconfirmlink' => 'Sizning elektron pochta manzilingizni tasdiqlash',
 'emaildisabled' => 'Bu sayt elektron pochta xatlarini yubora olmaydi.',
 'accountcreated' => 'Hisob yozuvi yaratildi',
 'login-abort-generic' => 'Tizimga kirishga mufavvaqiyatsiz urinish',
@@ -421,8 +447,8 @@ Vaqtinchalik maxfiy so'z: $2",
 # Edit page toolbar
 'bold_sample' => 'Qalin matn',
 'bold_tip' => 'Qalin matn',
-'italic_sample' => 'Kursiv',
-'italic_tip' => 'Kursiv',
+'italic_sample' => 'Yotiq matn',
+'italic_tip' => 'Yotiq matn',
 'link_sample' => 'Ishorat nomi',
 'link_tip' => 'Ichki ishorat',
 'extlink_sample' => 'http://www.example.com ishorat nomi',
@@ -447,13 +473,16 @@ Vaqtinchalik maxfiy so'z: $2",
 'showlivepreview' => "Tezkor ko'rib chiqish",
 'showdiff' => 'O‘zgarishlarni ko‘rsatish',
 'anoneditwarning' => "'''Diqqat:''' Siz tizimga kirmagansiz. Ushbu sahifa tarixida Sizning IP manzilingiz yozib qolinadi.",
-'blockedtitle' => 'Foydalanuvchi muhosara qilindi',
+'summary-preview' => "Tavsif shunday bo'ladi:",
+'subject-preview' => "Sarlavha shunday bo'ladi:",
+'blockedtitle' => 'Foydalanuvchi chetlashtirildi',
 'blockedtext' => "'''Siz (foydalanuvchi ismingiz yoki IP manzilingiz) tahrir qilishdan chetlashtirildingiz.'''
 
 Sizni $1 chetlashtirdi. Bunga sabab: ''$2''.
 
 * Chetlashtirish muddati boshi: $8
 * Chetlashtirish muddati yakuni: $6
+* Chetlashtirish maqsadi: $7
 
 Siz $1 yoki boshqa [[{{MediaWiki:Grouppage-sysop}}|administrator]] bilan bogʻlanib, arz qilishingiz mumkin.
 You cannot use the 'e-mail this user' feature unless a valid e-mail address is specified in your [[Special:Preferences|account preferences]] and you have not been blocked from using it.
@@ -470,12 +499,16 @@ Sizning hozirgi IP manzilingiz - $3, chetlashtirish raqamingiz - #$5. Arizaga bu
 Sahifani yaratish uchun quyida matn kiritishingiz mumkin (qo'shimcha axborot uchun [[{{MediaWiki:Helppage}}|yordam sahifasini]] ko'ring).
 Agar bu sahifaga xatolik sabab kelgan bo'lsangiz brauzeringizning '''orqaga''' tugmasini bosing.",
 'noarticletext' => 'Bu sahifada hozircha hech qanday matn yoʻq. Siz bu sarlavhani boshqa sahifalardan [[Special:Search/{{PAGENAME}}|qidirishingiz]], <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} tegishli loglarga qarashingiz] yoki bu sahifani [{{fullurl:{{FULLPAGENAME}}|action=edit}} tahrirlashingiz]</span> mumkin.',
-'clearyourcache' => "'''Etibor bering:''' O'zgartirishlaringiz ko'rish uchun, yangi moslamalaringizning saqlashdan keyin, brauser keshini tozalash kerak:<br />
-'''Mozilla / Firefox:''' ''Ctrl+Shift+R'', '''IE:''' ''Ctrl+F5'', '''Safari:''' ''Cmd+Shift+R'', '''Konqueror:''' ''F5'', '''Opera:''' ''Tools → Preferences'' orqali keshni tozalang.",
+'clearyourcache' => "'''Eslatma.''' Saqlaganingizdan so'ng o'zgarishlarni ko'rish uchun siz o'z brauzeringiz keshini tozalashingizga to'gri kelishi mumkin.
+* '''Firefox / Safari:''' ''Shift'' tugmasini bosgan holda, ''Yangilash'' unsurlar darchasini bosing, yoki ''Ctrl-F5'' yoki ''Ctrl-R'' (Macda ''⌘-R'') ni bosing
+* '''Google Chrome:''' ''Ctrl-Shift-R'' (Macda ''⌘-Shift-R'') ni bosing
+* '''Internet Explorer:''' ''Ctrl''ni bosgan holda, ''Yangilash''ni bosing, yoki ''Ctrl-F5''ni bosing
+* '''Opera:''' ''Asboblar → Moslamalar'' menyusidan keshni tozalashni tanlang",
 'updated' => '(Yangilandi)',
 'note' => "'''Izoh:'''",
 'previewnote' => "'''Bu shunchaki ko‘rib chiqish. O‘zgartirishlar hali saqlangani yo‘q!'''",
 'editing' => '$1 tahrirlanmoqda',
+'creating' => '«$1» sahifasini yaratish',
 'editingsection' => '$1 (boʻlim) tahrirlanmoqda',
 'copyrightwarning' => "Iltimos, {{SITENAME}}ga yuklangan har qanday axborot $2 ostida tarqatilishiga diqqat qiling (batafsil ma'lumot uchun $1ni ko'ring).
 Agar yozganlaringiz keyinchalik tahrir qilinishi va qayta tarqatilishiga rozi bo'lmasangiz, u holda bu yerga yozmang.<br />
@@ -519,7 +552,7 @@ Ayrim andozalar qo'shilmaydi.",
 
 # History pages
 'viewpagelogs' => 'Ushbu sahifaga doir qaydlarni koʻrsat',
-'nohistory' => "Ushbu sahifa uchun o'zgarishlar tarixi mavjud emas.",
+'nohistory' => 'Ushbu sahifa uchun oʻzgarishlar tarixi mavjud emas.',
 'currentrev' => 'Hozirgi koʻrinishi',
 'currentrev-asof' => '$1dagi, joriy koʻrinishi',
 'revisionasof' => '$1 paytdagi koʻrinishi',
@@ -535,7 +568,7 @@ Ayrim andozalar qo'shilmaydi.",
 '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-fieldset-title' => 'Tarixni koʻrish',
 'history-show-deleted' => 'Faqat o‘chirilganlari',
 'histfirst' => 'Eng avvalgi',
 'histlast' => 'Eng soʻnggi',
@@ -543,11 +576,14 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'historyempty' => '(boʻsh)',
 
 # Revision feed
-'history-feed-title' => "O'zgarishlar tarixi",
-'history-feed-description' => "Vikidagi mazkur sahifaning o'zgarishlar tarixi",
+'history-feed-title' => 'Oʻzgarishlar tarixi',
+'history-feed-description' => 'Vikidagi mazkur sahifaning oʻzgarishlar tarixi',
 'history-feed-item-nocomment' => '$1 $2 da',
 
 # Revision deletion
+'rev-deleted-comment' => "(tahrir izohi o'chirildi)",
+'rev-deleted-user' => "(ishtirokchi ismi o'chirildi)",
+'rev-deleted-event' => "(qayd yozuvi o'chirildi)",
 'rev-delundel' => 'koʻrsatish/yashirish',
 'rev-showdeleted' => 'koʻrsatish',
 'revdelete-show-file-submit' => 'Ha',
@@ -573,12 +609,12 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'mergehistory-reason' => 'Sabab:',
 
 # Merge log
-'mergelog' => 'Birlashtirishlar qaydlari',
+'mergelog' => 'Birlashtirish qaydlari',
 'pagemerge-logentry' => "[[$1]] va [[$2]]lar birlashtirildi ($3 gacha bo'lgan versiyalar)",
 'revertmerge' => "Bo'lish",
 
 # Diffs
-'history-title' => "$1 - o'zgarishlar tarixi",
+'history-title' => '$1 - oʻzgarishlar tarixi',
 'difference-title' => '$1 — versiyalar orasidagi farq',
 'difference-title-multipage' => '"$1" va "$2" sahifalar orasidagi farq',
 'difference-multipage' => '(Sahifalar orasidagi farq)',
@@ -611,10 +647,10 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'searchhelp-url' => 'Help:Mundarija',
 'searchmenu-prefix' => "[[Special:PrefixIndex/$1|Ushbu prefiks mavjud bo'lgan sahifalarni ko'rsatish]]",
 'searchprofile-articles' => 'Asosiy sahifalar',
-'searchprofile-project' => 'Yordam va Loyiha sahifalari',
+'searchprofile-project' => 'Yordam va loyiha sahifalari',
 'searchprofile-images' => 'Multimediya',
 'searchprofile-everything' => 'Har yerda',
-'searchprofile-advanced' => 'Kengaytirilgan',
+'searchprofile-advanced' => "Qo'shimcha",
 'searchprofile-articles-tooltip' => '$1da qidirish',
 'searchprofile-project-tooltip' => '$1da qidirish',
 'searchprofile-images-tooltip' => 'Fayllarni qidir',
@@ -629,8 +665,6 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'search-interwiki-caption' => 'Aloqador loyihalar',
 'search-interwiki-default' => '$1 natijalar:',
 'search-interwiki-more' => '(yana)',
-'search-mwsuggest-enabled' => 'takliflar bilan',
-'search-mwsuggest-disabled' => 'takliflarsiz',
 'search-relatedarticle' => "Bog'liq",
 'mwsuggest-disable' => "AJAX-takliflarini o'chirish",
 'searcheverything-enable' => 'Barcha nomfazolarda qidir',
@@ -643,7 +677,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'powersearch' => 'Qidiruv',
 'powersearch-legend' => 'Kengaytirilgan qidiruv',
 'powersearch-ns' => 'Bu nom-fazolarda izla:',
-'powersearch-redir' => 'Yoʻnaltirishlarni koʻrsat',
+'powersearch-redir' => 'Qayta yoʻnaltirishlarni koʻrsatish',
 'powersearch-field' => 'Qidiruv',
 'powersearch-togglelabel' => 'Belgilash:',
 'powersearch-toggleall' => 'Hammasini',
@@ -690,6 +724,8 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'rows' => 'Qatorlar soni:',
 'columns' => 'Ustunlar soni:',
 'searchresultshead' => 'Qidiruv',
+'resultsperpage' => 'Sahifaga topilgan yozuvlar miqdori',
+'stub-threshold' => '<a href="#" class="stub">Tayyorlanmaga havolalar</a>ni rasmiylashtirish uchun boshlash ostonasi (baytlarda).',
 'stub-threshold-disabled' => "O'chirib qo'yilgan",
 'recentchangesdays-max' => 'Eng koʻpi $1 kun',
 'recentchangescount' => 'Sukut boʻyicha koʻrsatiladigan tahrirlar soni',
@@ -716,6 +752,9 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'defaultns' => 'Aks holda quyidagi nomfazolardan qidirish:',
 'default' => "boshlang'ich",
 'prefs-files' => 'Fayllar',
+'prefs-custom-css' => 'Shaxsiy CSS',
+'prefs-custom-js' => 'Shaxsiy JavaScript',
+'prefs-common-css-js' => "Barcha tashqi ko'rinishlar uchun umumiy CSS/JavaScript:",
 'prefs-emailconfirm-label' => 'Elektron pochta manzilini tasdiqlash:',
 'prefs-textboxsize' => 'Tahrir oynasining oʻlchami',
 'youremail' => 'E-mail:',
@@ -726,6 +765,7 @@ Bu yerda: (joriy) = hozirgi koʻrinish bilan farq,
 'yourrealname' => 'Haqiqiy ism *:',
 'yourlanguage' => 'Til:',
 'yourvariant' => 'Tarkib tili varianti',
+'prefs-help-variant' => "Viki sahifalari matnini tasvirlash uchun ma'qul ko'rilgan til varianti",
 'yournick' => 'Yangi imzo',
 'prefs-help-signature' => 'Munozara sahifalarida imzo "<nowiki>~~~~</nowiki>" orqali qoʻyiladi (u sizning imzoingiz va joriy vaqtga aylantiriladi).',
 'yourgender' => 'Jinsi:',
@@ -738,6 +778,7 @@ Ushbu axborot ommaviy xususiyatga ega bo'ladi.",
 'prefs-help-realname' => "Haqiqiy ism (ixtiyoriy maydon).
 Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini ko'rsatish uchun foydalaniladi.",
 'prefs-help-email' => "Elektron pochta manzilini ko'rsatish majburiy emas, lekin u siz maxfiy so'zni unutib qo'ysangiz kerak bo'lishi mumkin.",
+'prefs-help-email-others' => "U shuningdek, sizning elektron pochtangiz manzilini oshkora qilmasdan, boshqa ishtirokchilar bilan shaxsiy sahifangiz orqali bog'lanish imkonini ham beradi.",
 'prefs-help-email-required' => 'E-mail manzilni koʻrsatish shart emas',
 'prefs-info' => 'Asosiy maʼlumot',
 'prefs-i18n' => 'Internatsionallashtirish',
@@ -759,6 +800,7 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'userrights-groupsmember-auto' => "Noaniq a'zo",
 'userrights-reason' => 'Sabab:',
 'userrights-changeable-col' => "Siz o'zgartirishingiz mumkin bo'lgan guruhlar",
+'userrights-unchangeable-col' => "Siz o'zgartira olmaydigan guruhlar",
 
 # Groups
 'group' => 'Guruh',
@@ -770,6 +812,13 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'group-suppress' => 'Tekshiruvchilar',
 'group-all' => '(hamma)',
 
+'group-user-member' => '{{GENDER:$1|ishtirokchi}}',
+'group-autoconfirmed-member' => '{{GENDER:$1|avtotasdiqlangan ishtirokchi}}',
+'group-bot-member' => '{{GENDER:$1|bot}}',
+'group-sysop-member' => '{{GENDER:$1|administrator}}',
+'group-bureaucrat-member' => '{{GENDER:$1|rasmiyatchi}}',
+'group-suppress-member' => '{{GENDER:$1|tekshiruvchi}}',
+
 'grouppage-user' => '{{ns:project}}:Foydalanuvchilar',
 'grouppage-autoconfirmed' => '{{ns:project}}:Tasdiqlangan foydalanuvchilar',
 'grouppage-bot' => '{{ns:project}}:Botlar',
@@ -777,14 +826,18 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'grouppage-bureaucrat' => '{{ns:project}}:Rasmiyatchilar',
 'grouppage-suppress' => '{{ns:project}}:Tekshiruvchilar',
 
+# Rights
+'right-read' => "Sahifalarni o'qish",
+'right-edit' => 'Sahifalarni tahrirlash',
+
 # User rights log
 'rightslog' => "Ishtirokchi huquqlari bo'yicha qaydlar",
 'rightslogentry' => "ishtirokchi $1ning guruhlardagi a'zoligini $2dan $3ga o'zgartirdi",
 
 # 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',
+'action-move' => 'bu sahifani koʻchirish',
+'action-move-subpages' => 'Bu sahifani va uning ostsahifalarini koʻchirish',
 'action-sendemail' => "elektron xatlar jo'natish",
 
 # Recent changes
@@ -809,13 +862,14 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 'rclinks' => "Oxirgi $2 kun davomida sodir bo'lgan $1 o'zgartirishlarni ko'rsat.<br />$3",
 'diff' => 'farq',
 'hist' => 'tarix',
-'hide' => 'yashirish',
-'show' => 'koʻrsat',
+'hide' => 'Yashirish',
+'show' => 'Koʻrsatish',
 'minoreditletter' => 'k',
 'newpageletter' => 'Y',
 'boteditletter' => 'b',
-'rc-enhanced-expand' => 'Tasfilotlarni koʻrsat (JavaScript talab qilinadi)',
-'rc-enhanced-hide' => 'Tafsilotlolarni yashir',
+'rc-enhanced-expand' => 'Tasfilotlarni koʻrsatish (JavaScript talab qilinadi)',
+'rc-enhanced-hide' => 'Tafsilotlolarni yashirish',
+'rc-old-title' => 'dastlab "$1" sifatida yaratilgan',
 
 # Recent changes linked
 'recentchangeslinked' => 'Bogʻlangan oʻzgarishlar',
@@ -829,13 +883,18 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 
 # Upload
 'upload' => 'Fayl yuklash',
-'uploadbtn' => 'Fayl yukla',
+'uploadbtn' => 'Fayl yuklash',
 'uploaderror' => 'Yuklashda xatolik',
 'uploadlogpage' => 'Yuklash qaydlari',
+'filename' => 'Fayl nomi',
 'filedesc' => 'Qisqa izoh',
+'fileuploadsummary' => 'Qisqa izoh:',
 'filereuploadsummary' => 'Fayldagi oʻzgarishlar:',
+'filestatus' => 'Tarqatish shartlari:',
 'filesource' => 'Manba:',
-'uploadedimage' => '"[[$1]]" yuklandi',
+'uploadedfiles' => 'Yuklangan fayllar',
+'uploadedimage' => '"[[$1]]"ni yukladi',
+'overwroteimage' => '"[[$1]]"ning yangi versiyasini yukladi',
 
 'license' => 'Litsenziyalash:',
 'license-header' => 'Litsenziyalash',
@@ -843,38 +902,49 @@ Agar siz uni ko'rsatsangiz, undan sahifa tahriri kim tomonidan kiritilganligini
 # Special:ListFiles
 'imgfile' => 'fayl',
 'listfiles' => 'Fayllar roʻyxati',
+'listfiles_thumb' => 'Miniatura',
 'listfiles_date' => 'Sana',
+'listfiles_name' => 'Nomi',
 'listfiles_user' => 'Foydalanuvchi',
 'listfiles_size' => 'Oʻlchami',
 'listfiles_description' => 'Taʻrif',
+'listfiles_count' => 'Versiyalar',
 
 # File description page
 'file-anchor-link' => 'Fayl',
 'filehist' => 'Fayl tarixi',
 'filehist-help' => 'Faylning biror paytdagi holatini koʻrish uchun tegishli sana/vaqtga bosingiz.',
+'filehist-deleteall' => "barini o'chirish",
 'filehist-deleteone' => 'o‘chirish',
 'filehist-revert' => 'qaytarish',
 'filehist-current' => 'joriy',
 'filehist-datetime' => 'Sana/Vaqt',
-'filehist-thumb' => 'Miniatyura',
+'filehist-thumb' => 'Miniatura',
 'filehist-thumbtext' => '$1 dagi versiya uchun tasvir',
+'filehist-nothumb' => "Miniatura yo'q",
 'filehist-user' => 'Foydalanuvchi',
 'filehist-dimensions' => 'Oʻlchamlari',
 'filehist-filesize' => 'Fayl hajmi',
 'filehist-comment' => 'Izoh',
+'filehist-missing' => 'Fayl mavjud emas',
 'imagelinks' => 'Fayllarga ishoratlar',
 'linkstoimage' => 'Bu faylga quyidagi {{PLURAL:$1|sahifa|$1 sahifalar}} bogʻlangan:',
 'nolinkstoimage' => 'Bu faylga bogʻlangan sahifalar yoʻq.',
-'sharedupload' => 'This file is from $1 and may be used by other projects.',
+'sharedupload' => "Ushbu fayl $1dan va boshqa loyihalarda ham qo'llanilishi mumkin.",
 'sharedupload-desc-here' => 'Ushbu fayl $1dan boʻlib, boshqa loyihalarda ham ishlatilishi mumkin.
 Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
-'uploadnewversion-linktext' => 'Bu faylning yangi versiyasini yukla',
+'uploadnewversion-linktext' => 'Bu faylning yangi versiyasini yuklash',
 
 # File reversion
 'filerevert-comment' => 'Sabab:',
 
 # File deletion
 'filedelete-comment' => 'Sabab:',
+'filedelete-submit' => 'O‘chirish',
+
+# MIME search
+'mimetype' => 'MIME-tur:',
+'download' => 'yuklash',
 
 # Unused templates
 'unusedtemplates' => 'Ishlatilinmagan andozalar',
@@ -895,7 +965,7 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'lonelypages' => 'Yetim sahifalar',
 'uncategorizedpages' => 'Turkumlashtirilmagan sahifalar',
 'uncategorizedcategories' => 'Turkumlashtirilmagan turkumlar',
-'uncategorizedimages' => 'Kategoriyasiz tasvirlar',
+'uncategorizedimages' => 'Turkumlashtirilmagan fayllar',
 'uncategorizedtemplates' => 'Turkumlashtirilmagan andozalar',
 'unusedcategories' => 'Ishlatilinmagan turkumlar',
 'unusedimages' => 'Ishlatilinmagan fayllar',
@@ -907,12 +977,13 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'usercreated' => "$1 $2da {{GENDER:$3|ro'yxatdan o'tdi}}",
 'newpages' => 'Yangi sahifalar',
 'move' => 'Ko‘chirish',
-'movethispage' => 'Bu sahifani koʻchir',
+'movethispage' => 'Bu sahifani koʻchirish',
 'pager-newer-n' => '{{PLURAL:$1|yangiroq 1|yangiroq $1}}',
 'pager-older-n' => '{{PLURAL:$1|eskiroq 1|eskiroq $1}}',
+'suppress' => 'Bekitish',
 
 # Book sources
-'booksources' => 'Kitob manbaʻlar',
+'booksources' => 'Kitob manbalari',
 'booksources-search-legend' => "Kitob haqida ma'lumot qidirish",
 'booksources-go' => 'O‘tish',
 
@@ -928,11 +999,15 @@ Uning [$2 fayl tavsifi sahifasidan] olingan tavsifi quyida keltirilgan.',
 'alphaindexline' => '$1 dan $2 ga',
 'nextpage' => 'Keyingi sahifa ($1)',
 'prevpage' => 'Avvalgi sahifa ($1)',
-'allpagesfrom' => 'Sahifalarni koʻrsat:',
+'allpagesfrom' => 'Quyidagidan boshlanuvchi sahifalarni koʻrsatish:',
 'allarticles' => 'Barcha sahifalar',
+'allpagesprev' => 'Oldingi',
 'allpagesnext' => 'Keyingi',
 'allpagessubmit' => 'Oʻtish',
-'allpagesprefix' => 'Bunday prefiksli sahifalarni koʻrsat:',
+'allpagesprefix' => 'Shunday prefiksli sahifalarni koʻrsatish:',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => "Oxirgi versiyasini ko'rish",
 
 # Special:Categories
 'categories' => 'Turkumlar',
@@ -949,7 +1024,7 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'linksearch-line' => '$2 ichidan $1 ga havola',
 
 # Special:ListUsers
-'listusers-submit' => 'Koʻrsat',
+'listusers-submit' => 'Koʻrsatish',
 
 # Special:Log/newusers
 'newuserlogpage' => "Ishtirokchilarni ro'yxatga olish qaydlari",
@@ -960,45 +1035,113 @@ Also see [[Special:WantedCategories|wanted categories]].',
 'listgrouprights-members' => '(a’zolar ro‘yxati)',
 
 # E-mail user
-'emailuser' => 'Bu foydalanuvchiga e-maktub joʻnat',
+'emailuser' => 'Foydalanuvchiga maktub',
+'defemailsubject' => '{{SITENAME}} — $1 tomonidan maktub',
+'noemailtitle' => 'Elektron pochta manzili mavjud emas',
 'noemailtext' => "Bu foydalanuvchi e-mail manzil ko'rsatgani yo'q.",
+'emailtarget' => 'Oluvchi ishtirokchining ismini kiriting',
+'emailusername' => 'Ishtirokchi nomi:',
+'emailusernamesubmit' => "Jo'natish",
+'email-legend' => "Boshqa {{SITENAME}} ishtirokchisiga xat jo'natish",
+'emailfrom' => 'Kimdan:',
+'emailto' => 'Kimga:',
+'emailsubject' => 'Sarlavha:',
+'emailmessage' => 'Xabar',
 'emailsend' => 'Joʻnatish',
+'emailccsubject' => '$1ga maktubingizning nusxasi: $2',
+'emailsent' => "Xat jo'natildi",
+'emailsenttext' => "Sizning elektron maktubingiz jo'natildi.",
+
+# User Messenger
+'usermessage-summary' => 'Tizimli xabar qoldirish.',
+'usermessage-editor' => 'Tizimli etkazish',
 
 # Watchlist
 'watchlist' => 'Kuzatuv roʻyxatim',
 'mywatchlist' => 'Kuzatuv roʻyxatim',
 'watchlistfor2' => '$1 $2 uchun',
 'nowatchlist' => "Kuzatuv ro'yxatingizda hech narsa yo'q.",
+'watchnologin' => "Siz tizimda o'zingizni tanishtirmadingiz",
+'addwatch' => "Kuzatuv ro'yxatiga qo'shish",
 'addedwatchtext' => "\"[[:\$1]]\" sahifasi sizning [[Special:Watchlist|kuzatuv ro'yxatingizga]] qo'shildi. Bu sahifada va unga mos munozara sahifasida bo'ladigan kelajakdagi o'zgarishlar bu yerda ro'yxatga olinadi, hamda bu sahifa topish qulay bo'lishi uchun [[Special:RecentChanges|yangi o'zgarishlar ro'yxati]]da '''qalin''' harflar bilan ko'rsatiladi.
 
 Agar siz bu sahifani kuzatuv ro'yxatingizdan o'chirmoqchi bo'lsangiz \"Kuzatmaslik\" yozuvini bosing.",
+'removewatch' => "Kuzatuv ro'yxatidan o'chirish",
 'removedwatchtext' => '"[[:$1]]" sahifasi kuzatuv ro\'yxatingizdan o\'chirildi.',
-'watch' => 'kuzatish',
+'watch' => 'Kuzatish',
 'watchthispage' => 'Sahifani kuzatish',
-'unwatch' => 'kuzatmaslik',
+'unwatch' => 'Kuzatmaslik',
+'unwatchthispage' => "Kuzatuvni to'xtatish",
+'notanarticle' => 'Maqola emas',
 'watchlist-details' => "Sizning kuzatuv ro'yxatingizda $1 {{PLURAL:$1|ta sahifa}} (munozara sahifalarini hisobga olmaganda)",
 'wlnote' => "Below {{PLURAL:$1|is the last change|are the last '''$1''' changes}} in the last {{PLURAL:$2|hour|'''$2''' hours}}, as of $3, $4.",
 'wlshowlast' => 'Oxirgi $1 soatdagi $2 kundagi tahrirlarni ko‘rsatish. $3 tahrirlarni ko‘rsatish',
 'watchlist-options' => "Kuzatuv ro'yxati moslamalari",
 
+# Displayed when you click the "watch" button and it is in the process of watching
+'watching' => 'Kuzatish...',
+'unwatching' => "Kuzatuv ro'yxatidan o'chirish...",
+
+'enotif_mailer' => "{{SITENAME}} Pochta orqali e'lon qilish xizmati",
+'enotif_reset' => "Hamma sahifalarni ko'rib chiqilgan deb belgilash",
+'enotif_impersonal_salutation' => '{{SITENAME}} ishtirokchisi',
+'enotif_lastvisited' => "Oxirgi tashrifingizdan buyon sodir bo'lgan barcha o'zgarishlarni ko'rish uchun $1 ga qarang.",
+'enotif_lastdiff' => "O'zgarishlar bilan tanishish uchun $1 ga qarang.",
+'enotif_anon_editor' => 'anonim ishtirokchi $1',
+'enotif_body' => "Hurmatli \$WATCHINGUSERNAME,
+
+\$PAGEEDITDATE kuni \"{{SITENAME}}\" loyihasining \$PAGETITLE sahifasi ishtirokchi \$PAGEEDITOR tomonidan \$CHANGEDORCREATED, joriy versiyani ko'rish uchun \$PAGETITLE_URL havolasi bo'yicha o'ting.
+
+\$NEWPAGE
+
+O'zgarish bo'yicha qisqacha izoh: \$PAGESUMMARY \$PAGEMINOREDIT
+
+Tahrirlovchiga murojaat qilish:
+el. pochta: \$PAGEEDITOR_EMAIL
+viki: \$PAGEEDITOR_WIKI
+
+Agar siz sahifaga o'tib ko'rmasangiz, u holda uning keyingi o'zgarishlari bo'yicha boshqa bildirish xabarlari kelmaydi.
+Siz shuningdek o'zingizning kuzatuv ro'yxatingizda barcha sahifalar uchun bildirish moslamasini o'chirishingiz mumkin.
+
+             {{grammar:genitive|{{SITENAME}}}}ning axborot berish tizimi
+
+--
+Bildirishlar moslamalarini o'zgartirish
+{{canonicalurl:{{#special:Preferences}}}}
+
+O'zingizning kuzatuv ro'yxatingiz moslamalarini o'zgartirish
+{{canonicalurl:{{#special:EditWatchlist}}}}
+
+Sizning kuzatuv ro'yxatingizdagi sahifalarni o'chirish
+\$UNWATCHURL
+
+Qayta aloqa va yordam
+{{canonicalurl:{{MediaWiki:Helppage}}}}",
+
 # Delete
+'deletepage' => "Sahifani o'chirish",
+'confirm' => 'Tasdiqlash',
 'actioncomplete' => 'Bajarildi',
 'actionfailed' => 'Jarayon amalga oshmadi',
 'deletedtext' => '"$1" yoʻqotildi.
 Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'dellogpage' => 'Yoʻqotish qaydlari',
+'deletionlog' => 'yoʻqotish qaydlari',
 'deletecomment' => 'Sabab:',
 'deleteotherreason' => 'Boshqa/qoʻshimcha sabab:',
 'deletereasonotherlist' => 'Boshqa sabab',
 
 # Rollback
-'rollbacklink' => 'eski holiga keltir',
+'rollbacklink' => 'eski holiga keltirish',
 'revertpage' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|munozara]]) tahrirlari [[User:$1|$1]] versiyasiga qaytarildi',
 
 # Protect
 'protectlogpage' => 'Himoyalash qaydlari',
 'protectedarticle' => '"[[$1]]" sahifasi himoyalandi',
+'modifiedarticleprotection' => '"[[$1]]" uchun himoyalash darajasini o\'zgartirdi',
+'movedarticleprotection' => 'himoyalash moslamalarini "[[$2]]"dan "[[$1]]"ga o\'tkazdi',
 'protect-level-sysop' => 'Faqat administratorlar uchun',
+'protect-expiry-indefinite' => 'muddatsiz',
 'protect-edit-reasonlist' => "Sabablar ro'yxatini tahrirlash",
 'protect-expiry-options' => '1 soat:1 hours,1 kun:1 day,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
 'restriction-type' => 'Huquqlar:',
@@ -1036,7 +1179,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'undelete-show-file-submit' => 'Ha',
 
 # Namespace form on various pages
-'namespace' => 'Soha:',
+'namespace' => 'Nomfazo:',
 'invert' => 'Tanlash tartibini almashtirish',
 'namespace_association' => "Bog'liq nomfazo",
 'blanknamespace' => '(asosiy)',
@@ -1063,7 +1206,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'sp-contributions-search' => 'Hissalarni qidirish',
 'sp-contributions-username' => 'IP-manzil yoki foydalanuvchi nomi:',
 'sp-contributions-toponly' => "Faqat oxirgi versiya hisoblangan tahrirlarni ko'rsatish",
-'sp-contributions-submit' => 'Qidir',
+'sp-contributions-submit' => 'Qidirish',
 
 # What links here
 'whatlinkshere' => "Bu sahifaga bog'langan sahifalar",
@@ -1080,10 +1223,11 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'whatlinkshere-hideredirs' => "$1 qayta yo'naltirishlar",
 'whatlinkshere-hidetrans' => '$1 kiritmalar',
 'whatlinkshere-hidelinks' => '$1 havolalar',
-'whatlinkshere-hideimages' => '$1 rasmlar uchun havolalar',
+'whatlinkshere-hideimages' => '$1 fayllar uchun havolalar',
 'whatlinkshere-filters' => 'Filtrlar',
 
 # Block/unblock
+'autoblockid' => 'Avtochetlashtirish #$1',
 'block' => 'Foydalanuvchini muhosara qilish',
 'unblock' => "Foydalanuvchiga yo'l ochish",
 'blockip' => 'Foydalanuvchini chetlashtir',
@@ -1104,35 +1248,52 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'ipbother' => 'Boshqa vaqt:',
 'ipboptions' => '2 soat:2 hours,1 kun:1 day,3 kun:3 days,1 hafta:1 week,2 hafta:2 weeks,1 oy:1 month,3 oy:3 months,6 oy:6 months,1 yil:1 year,cheksiz:infinite',
 'ipblocklist' => 'Chetlashtirilgan IP manzillari va foydalanuvchilar',
-'blocklink' => 'chetlashtir',
+'emailblock' => "xatlar jo'natish taqiqlandi",
+'blocklink' => 'chetlashtirish',
 'unblocklink' => "muhosarani (to'sishni) bekor qilish",
 'change-blocklink' => "Muhosarani (to'siqni) o'zgartirmoq",
 'contribslink' => 'hissasi',
 'blocklogpage' => 'Chetlashtirish qaydlari',
-'blocklogentry' => '$2 $3 davrga [[$1]]ni chetlashtirdi',
+'blocklogentry' => '$2 davrga [[$1]]ni chetlashtirdi $3',
 'block-log-flags-nocreate' => 'hisob ochish toʻxtatilgan',
+'block-log-flags-nousertalk' => "o'zining munozara sahifasini tahrirlay olmaydi",
 
 # Move page
 'movearticle' => "Sahifani ko'chirish",
-'movepagebtn' => 'Sahifani koʻchir',
+'movepagebtn' => 'Sahifani koʻchirish',
 'pagemovedsub' => 'Koʻchirildi',
 'movepage-moved' => '\'\'\'"$1" nomli sahifa "$2" nomli sahifaga koʻchirildi\'\'\'',
 'movelogpage' => 'Koʻchirish qaydlari',
 'movereason' => 'Sabab:',
-'revertmove' => 'qaytar',
+'revertmove' => 'qaytarish',
 
 # Export
 'export' => 'Sahifalar eksporti',
+'export-submit' => 'Eksport',
+'export-addcattext' => "Shu turkumdan sahifalarni qo'shish:",
+'export-addcat' => "Qo'shish",
+'export-addnstext' => "Shu nomfazodan sahifalarni qo'shish:",
+'export-addns' => "Qo'shish",
+'export-download' => 'Fayl sifatida saqlash',
+'export-templates' => 'Andozalarni kiritish',
 
 # Namespace 8 related
-'allmessagesname' => 'Ism',
+'allmessages' => 'Tizim xabarlari',
+'allmessagesname' => 'Nomi',
 'allmessagesdefault' => "Boshlang'ich matn",
 'allmessagescurrent' => 'Joriy xabar matni',
+'allmessages-filter-all' => 'Barcha',
+'allmessages-language' => 'Til:',
+'allmessages-filter-submit' => 'Oʻtish',
 
 # Thumbnails
 'thumbnail-more' => 'Kattalashtir',
 'thumbnail_error' => 'Tasvir yaratishda xatolik: $1',
 
+# Import log
+'importlogpage' => 'Import qilish qaydlari',
+'import-logentry-upload' => '"[[$1]]"ni yuklash yo\'li bilan import qildi',
+
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'Foydalanuvchi sahifangiz',
 'tooltip-pt-anonuserpage' => 'Siznig ip manzilingiz foydalanuvchi sahifasi',
@@ -1146,11 +1307,12 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'tooltip-pt-logout' => 'Chiqish',
 'tooltip-ca-talk' => 'Sahifa matni borasida munozara',
 'tooltip-ca-edit' => "Siz bu sahifani tahrirlashingiz mumkin. Iltimos, saqlashdan oldim ko'rib chiqish tugmasidan foydalaning.",
-'tooltip-ca-addsection' => 'Yangi boʻlim och',
+'tooltip-ca-addsection' => 'Yangi boʻlim ochish',
 'tooltip-ca-viewsource' => "Bu sahifa himoyalangan. Siz uning manbasini ko'rishingiz mumkin.",
 'tooltip-ca-history' => 'Bu sahifaning oldingi versiyalari.',
 'tooltip-ca-protect' => 'Bu sahifani himoyalash',
-'tooltip-ca-delete' => 'Ushbu sahifani o‘chirib tashlash',
+'tooltip-ca-unprotect' => "Ushbu sahifaning himoyasini o'zgaritish",
+'tooltip-ca-delete' => 'Ushbu sahifani o‘chirish',
 'tooltip-ca-undelete' => "Bu sahifa o'chirilmasdan oldin qilingan tahrirlarni tiklash",
 'tooltip-ca-move' => 'Bu sahifani koʻchir',
 'tooltip-ca-watch' => "Bu sahifani kuzatuv ro'yxatingizga qo'shish",
@@ -1200,29 +1362,48 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 
 # Info page
 'pageinfo-title' => '"$1" sahifasi haqida maʼlumot',
-'pageinfo-header-edits' => 'Tahrirlar',
-'pageinfo-watchers' => 'Kuzatuvchilar soni',
-'pageinfo-edits' => 'Tahrirlar soni',
+'pageinfo-header-basic' => 'Asosiy maʼlumot',
+'pageinfo-header-edits' => "O'zgarishlar tarixi",
+'pageinfo-display-title' => "Ko'rsatiladigan sarlavha",
+'pageinfo-article-id' => 'Sahifa identifikatori',
+'pageinfo-watchers' => 'Sahifa kuzatuvchilari soni',
+'pageinfo-edits' => 'Jami tahrirlar soni',
+'pageinfo-toolboxlink' => 'Sahifa haqida maʼlumot',
+
+# Skin names
+'skinname-standard' => 'Klassik',
+'skinname-nostalgia' => "Sog'inch",
+'skinname-cologneblue' => "Kyolncha sog'inch",
+'skinname-myskin' => "O'zimniki",
+'skinname-chick' => "Jo'ja",
+'skinname-simple' => 'Oddiy',
+'skinname-modern' => 'Zamonaviy',
+'skinname-vector' => 'Vektor',
+
+# Patrol log
+'patrol-log-page' => 'Patrullash qaydlari',
 
 # Browsing diffs
 'previousdiff' => '← Avvalgi tahrir',
 'nextdiff' => 'Keyingi tahrir →',
 
 # Media information
-'imagemaxsize' => 'Tasvir taʼrifi sahifasidagi tasvirning oʻlchami:',
+'imagemaxsize' => "Tasvir oʻlchamining chegarasi:<br />
+''(fayl taʼrifi sahifasi uchun)''",
 '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',
-'show-big-image' => 'Asl hajmdagi tasvir',
+'show-big-image' => "To'liq hajmdagi tasvir",
 
 # Special:NewFiles
+'noimages' => 'Tasvir mavjud emas.',
 'ilsubmit' => 'Qidirish',
 
 # Metadata
 'metadata' => 'Metama’lumot',
-'metadata-expand' => 'Batafsil axborot koʻrsat',
-'metadata-collapse' => 'Batafsil axborotni yashir',
+'metadata-expand' => 'Batafsil axborot koʻrsatisg',
+'metadata-collapse' => 'Batafsil axborotni yashirish',
 
 # EXIF tags
 'exif-imagewidth' => 'Eni',
@@ -1266,7 +1447,7 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 'namespacesall' => 'Barchasi',
 'monthsall' => 'barchasi',
 
-'unit-pixel' => 'piksel',
+'unit-pixel' => ' piksel',
 
 # Multipage image navigation
 'imgmultipageprev' => '← oldingi sahifa',
@@ -1308,13 +1489,20 @@ Yaqinda sodir etilgan yoʻqotishlar uchun $2ni koʻring.',
 
 # HTML forms
 'htmlform-reset' => 'Oʻzgarishlarni bekor qilish',
+'htmlform-selectorother-other' => 'Boshqa',
 
 # New logging system
 'logentry-move-move' => '$1 $3 sahifasini $4ga koʻchirdi',
+'logentry-patrol-patrol-auto' => '$1 $3 sahifasining $4 versiyasini avtomatik patrulladi',
+'logentry-newusers-newusers' => '$1 ishtirokchisining hisob yozuvi yaratildi',
+'logentry-newusers-create' => '$1 ishtirokchisining hisob yozuvi yaratildi',
 
 # Feedback
 'feedback-close' => 'Bajarildi',
 
+# Search suggestions
+'searchsuggest-search' => 'Qidiruv',
+
 # API errors
 'api-error-unknown-code' => 'Noaniq xato: "$1".',
 'api-error-unknownerror' => 'Noaniq xato: "$1".',
index 5a924c6..cd0dc6c 100644 (file)
@@ -119,7 +119,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'ÙltimiCanbiamenti' ),
        'Recentchangeslinked'       => array( 'CanbiamentiLigà' ),
        'Revisiondelete'            => array( 'ScancelaRevision' ),
-       'RevisionMove'              => array( 'SpostaRevision' ),
        'Search'                    => array( 'Serca' ),
        'Shortpages'                => array( 'PaginePiCurte' ),
        'Specialpages'              => array( 'PagineSpeciali' ),
@@ -294,7 +293,6 @@ $messages = array(
 'qbbrowse' => 'Sfoja',
 'qbedit' => 'Canbia',
 'qbpageoptions' => 'Opsion pajina',
-'qbpageinfo' => 'Informasion so ła pajina',
 'qbmyoptions' => 'Łe me pajine',
 'qbspecialpages' => 'Pagine speciali',
 'faq' => 'Domande frequenti',
@@ -548,12 +546,8 @@ L\'aministradore che ło ga blocà ga fornìo sta spiegasion: "$3".',
 # Login and logout pages
 'logouttext' => "'''Te sì 'ndà fora da la to utensa.'''
 
-Te poli 'ndar vanti doparando {{SITENAME}} come utente anonimo o se nò [[Special:UserLogin|entrar da novo]], col stesso nome utente o uno difarente.
+Te poli 'ndar vanti doparando {{SITENAME}} come utente anonimo o se nò <span class='plainlinks'>[$1 entrar da novo]</span>, col stesso nome utente o uno difarente.
 Ocio che serte pagine podarìa èssar che ti 'e vedi come se te fussi 'ncora drento col to nome de prima, fin che no te neti la ''cache'' del to browser.",
-'welcomecreation' => '== Benvegnù, $1! ==
-
-El to nome utente el xe stà creà.
-Te poli sistemarte come te vol le to [[Special:Preferences|prefarense de {{SITENAME}}]].',
 'yourname' => 'Nome utente:',
 'yourpassword' => 'Password:',
 'yourpasswordagain' => 'De novo la password:',
@@ -1139,8 +1133,6 @@ Assicùrete che la continuità storica de la pagina no la vegna alterà.',
 'search-interwiki-caption' => 'Projeti fradei',
 'search-interwiki-default' => 'Risultati da $1:',
 'search-interwiki-more' => '(altro)',
-'search-mwsuggest-enabled' => 'con sujerimenti',
-'search-mwsuggest-disabled' => 'sensa sujerimenti',
 'search-relatedarticle' => 'Ligà',
 'mwsuggest-disable' => 'Disabilita sugerimenti AJAX',
 'searcheverything-enable' => 'Serca in tuti quanti i namespace',
@@ -2060,11 +2052,7 @@ I futuri canbiamenti a sta pagina e a la so pagina de discussion i se vedarà fo
 
 'enotif_mailer' => 'Sistema de notifica via e-mail de {{SITENAME}}',
 'enotif_reset' => 'Segna tute le pagine come zà viste',
-'enotif_newpagetext' => 'Sta qua la xe na nova pàxena.',
 'enotif_impersonal_salutation' => 'Utente de {{SITENAME}}',
-'changed' => 'canbià',
-'created' => 'creà',
-'enotif_subject' => 'La pagina $PAGETITLE de {{SITENAME}} la xe stà $CHANGEDORCREATED da $PAGEEDITOR',
 'enotif_lastvisited' => 'Varda $1 par tute le modifiche da la to ultima visita.',
 'enotif_lastdiff' => 'Varda $1 par visualizar la modifica.',
 'enotif_anon_editor' => 'utente anonimo $1',
@@ -3378,4 +3366,8 @@ Le imagini le vien mostrà a la risoluzion pi granda che se pol, par i altri tip
 'logentry-newusers-autocreate' => "L'utensa $1 xè stà creà automategamente",
 'newuserlog-byemail' => 'password spedìa par e-mail',
 
+# Search suggestions
+'searchsuggest-search' => 'Serca',
+'searchsuggest-containing' => 'che contien...',
+
 );
index 6e7d406..ed1f390 100644 (file)
@@ -7,6 +7,7 @@
  * @ingroup Language
  * @file
  *
+ * @author Aig mest ei varasta
  * @author Andrijko Z.
  * @author Kaganer
  * @author Sura
@@ -221,7 +222,7 @@ $messages = array(
 'cancel' => 'Heitta pätand',
 'moredotdotdot' => 'Edeleze...',
 'mypage' => "Minun lehtpol'",
-'mytalk' => 'Minun lodud',
+'mytalk' => 'Lodud',
 'anontalk' => 'Lodud neciš IP-adresas',
 'navigation' => 'Navigacii',
 'and' => '&#32;da',
@@ -231,7 +232,6 @@ $messages = array(
 'qbbrowse' => 'Kacelta',
 'qbedit' => 'Redaktiruida',
 'qbpageoptions' => 'Necen lehtpolen järgendused',
-'qbpageinfo' => 'Andmused lehtpoles',
 'qbmyoptions' => 'Minun järgendused',
 'qbspecialpages' => 'Specialižed lehtpoled',
 'faq' => 'PPK',
@@ -471,11 +471,8 @@ Sü om "\'\'$2\'\'".',
 # Login and logout pages
 'logouttext' => "'''Tö olet lähtnuded sistemaspäi.'''
 
-Sab jatkta rad {{SITENAME}}-saital anonimižikš, vai [[Special:UserLogin|kirjutagatoiš udes]] sil-žo vai toižel kävutajan nimel.
+Sab jatkta rad {{SITENAME}}-saital anonimižikš, vai <span class='plainlinks'>[$1 kirjutagatoiš udes]</span> sil-žo vai toižel kävutajan nimel.
 Otkat sil'mnägubale, miše erasid lehtpolid ozutaškatas mugažo, kut i edel teiden lähtendad sistemaspäi. Miše vajehtada niiden nägu, puhtastagat teiden kaclimen keš.",
-'welcomecreation' => '== Tulgat tervhen, $1! ==
-Teiden registracii om loptud.
-Algat unohtagoi [[Special:Preferences|järgeta personaližikš]] sait.',
 'yourname' => 'Kävutajan nimi:',
 'yourpassword' => 'Peitsana:',
 'yourpasswordagain' => 'Kirjutagat peitsana udes:',
@@ -954,8 +951,6 @@ Tö ei voigoi kävutada sidä.',
 'search-interwiki-caption' => 'Heimolaižed projektad',
 'search-interwiki-default' => "$1 rezul'tatad:",
 'search-interwiki-more' => '(völ)',
-'search-mwsuggest-enabled' => 'ozuta taričendad',
-'search-mwsuggest-disabled' => 'taričendoita',
 'search-relatedarticle' => 'Sidotud lehtpoled',
 'mwsuggest-disable' => 'Ala ozuta AJAX-taričendoid',
 'searcheverything-enable' => 'Ectä kaikiš nimiavarusiš',
@@ -990,7 +985,7 @@ Otkat sil'mnägubale üks-se, miše {{SITENAME}}-saitan sädäimišt voib olda v
 
 # Preferences page
 'preferences' => 'Järgendused',
-'mypreferences' => 'Minun järgendused',
+'mypreferences' => 'Järgendused',
 'prefs-edits' => 'Redaktiruindoiden lugu:',
 'prefsnologin' => 'Tö et olgoi kirjutanus sistemha.',
 'prefsnologintext' => 'Teile pidab <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} kirjutadas sistemha]</span>, miše toižetada järgendusid.',
@@ -1388,7 +1383,7 @@ Ku problem jäb jäl'ghepäi-ki, säkat pagin [[Special:ListUsers/sysop|sistemad
 'backend-fail-writetemp' => 'Ei voi toižetada pordaigašt failad.',
 'backend-fail-closetemp' => 'Ei voi saubata pordaigašt failad.',
 'backend-fail-read' => 'Ei voi lugeda "$1"-failad.',
-'backend-fail-create' => 'Ei voi säta "$1"-failad.',
+'backend-fail-create' => 'Ei voi kirjutada "$1"-failad.',
 
 # ZipDirectoryReader
 'zip-wrong-format' => 'Valitud fail ei ole ZIP-fail.',
@@ -1742,7 +1737,7 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
 
 # Watchlist
 'watchlist' => 'Kaclendnimikirjutez',
-'mywatchlist' => 'Minun kaclendnimikirjutez',
+'mywatchlist' => 'Kaclendnimikirjutez',
 'watchlistfor2' => 'Kävutajale $1 $2',
 'nowatchlist' => "Teiden kaclendnimikirjutez om pall'az.",
 'watchlistanontext' => 'Olgat hüväd, $1, miše lugeda vai redaktiruida teiden kaclendnimikirjutez.',
@@ -1771,11 +1766,7 @@ Kc. mugažo [[Special:WantedCategories|ectud kategorijoiden nimikirjutez]].',
 
 'enotif_mailer' => "{{SITENAME}}-saitan lehtpol' om toižetadud - tedotuz",
 'enotif_reset' => 'Znamoita kaik lehtpoled kut kactud',
-'enotif_newpagetext' => 'Nece om uz’ lehtpol’',
 'enotif_impersonal_salutation' => '{{SITENAME}}-saitan kävutai',
-'changed' => 'om toižetadud',
-'created' => 'om sätud',
-'enotif_subject' => '$PAGEEDITOR om $CHANGEDORCREATED $PAGETITLE',
 'enotif_lastvisited' => "Kc. $1, miše nähta kaik teiden jäl'gmäižen vizitan jäl'ghe tehtud toižetused.",
 'enotif_lastdiff' => 'Kc. $1, miše kacelta toižetusid.',
 'enotif_anon_editor' => 'anonimine kävutai $1',
@@ -2282,7 +2273,6 @@ Ei ole pordaigašt failhodrad.',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScriptan kodvmine',
-'javascripttest-disabled' => 'Nece funkcii ei ole kävutamas neciš vikiš.',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => "Teiden kävutajan lehtpol'",
@@ -2374,9 +2364,10 @@ Voib olda, necil lehtpolel om kosketuz irdsaitale, kudamb om mustas nimikirjutes
 'spambot_username' => 'MediaWikid puhtastadas spamaspäi',
 
 # Info page
-'pageinfo-header-edits' => 'Redakcijad',
+'pageinfo-header-edits' => 'Redakcijoiden istorii',
+'pageinfo-article-id' => 'Lehtpolen ID',
 'pageinfo-views' => 'Kacundoiden lugu',
-'pageinfo-watchers' => 'Kaclijoiden lugu',
+'pageinfo-watchers' => 'Lehtpolen kaclijoiden lugu',
 'pageinfo-edits' => 'Redakcijoiden lugumär',
 'pageinfo-authors' => 'Erazvuiččiden avtoroiden lugu',
 
@@ -2785,17 +2776,26 @@ Ku fail redaktiruidihe sändan polhe, erased parametrad voidas erineda nügüdl
 'exif-dc-publisher' => 'Pästai',
 'exif-dc-rights' => 'Oiktused',
 
+'exif-iimcategory-clj' => 'Ogerantegend da käskuz',
+'exif-iimcategory-dis' => 'Katastrofad da avarijad',
+'exif-iimcategory-fin' => 'Ekonomik da biznes',
 'exif-iimcategory-edu' => 'Openduzmär',
+'exif-iimcategory-evn' => 'Ümbrišt',
 'exif-iimcategory-hth' => 'Tervhuz',
+'exif-iimcategory-hum' => "Mel'hetartujad istorijad",
 'exif-iimcategory-lab' => 'Tö',
+'exif-iimcategory-lif' => 'Elonmahtuz da joudai aig',
 'exif-iimcategory-pol' => 'Politik',
 'exif-iimcategory-rel' => 'Religii da uskonduz',
 'exif-iimcategory-sci' => 'Tedo da tehnologii',
 'exif-iimcategory-soi' => 'Socialižed küzundad',
 'exif-iimcategory-spo' => 'Sport',
+'exif-iimcategory-war' => 'Voinad, konfliktad da kundanholdundad',
 'exif-iimcategory-wea' => 'Sä',
 
 'exif-urgency-normal' => 'Normaline ($1)',
+'exif-urgency-low' => 'Madal ($1)',
+'exif-urgency-high' => 'Korged ($1)',
 
 # External editor support
 'edit-externally' => 'Redaktiruida nece fail irdprogrammal',
@@ -2938,6 +2938,7 @@ Kävutagat normaline ezikacund.',
 'version-specialpages' => 'Specialižed lehtpoled',
 'version-parserhooks' => 'Sintaksižen analizatoran sabustajad',
 'version-variables' => 'Vajehtujad lugud',
+'version-antispam' => 'Antispam',
 'version-skins' => 'Nägutemad',
 'version-other' => 'Toine',
 'version-mediahandlers' => 'Median radimed',
@@ -3061,6 +3062,10 @@ Kävutagat normaline ezikacund.',
 'feedback-error3' => 'Petuz. API ei anda vastust',
 'feedback-close' => 'Vaumiž',
 
+# Search suggestions
+'searchsuggest-search' => 'Ectä',
+'searchsuggest-containing' => 'mülütajad...',
+
 # API errors
 'api-error-empty-file' => "Teil oigetud fail om pall'az.",
 'api-error-filename-tooshort' => 'Lühudahk failannimi.',
index 0484319..a6b9a44 100644 (file)
@@ -124,7 +124,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( 'Thay_đổi_gần_đây' ),
        'Recentchangeslinked'       => array( 'Thay_đổi_liên_quan' ),
        'Revisiondelete'            => array( 'Xóa_phiên_bản' ),
-       'RevisionMove'              => array( 'Di_chuyển_phiên_bản' ),
        'Search'                    => array( 'Tìm_kiếm' ),
        'Shortpages'                => array( 'Trang_ngắn' ),
        'Specialpages'              => array( 'Trang_đặc_biệt' ),
@@ -345,7 +344,7 @@ $messages = array(
 
 'underline-always' => 'Luôn luôn',
 'underline-never' => 'Không bao giờ',
-'underline-default' => 'Mặc định của trình duyệt',
+'underline-default' => 'Mặc định của hình dạng hoặc trình duyệt',
 
 # Font style option in Special:Preferences
 'editfont-style' => 'Kiểu phông chữ trong khung sửa đổi:',
@@ -430,8 +429,8 @@ $messages = array(
 'newwindow' => '(mở cửa sổ mới)',
 'cancel' => 'Hủy bỏ',
 'moredotdotdot' => 'Thêm nữa…',
-'mypage' => 'Trang của tôi',
-'mytalk' => 'Thảo luận với tôi',
+'mypage' => 'Trang cá nhân',
+'mytalk' => 'Thảo luận',
 'anontalk' => 'Thảo luận với IP này',
 'navigation' => 'Xem nhanh',
 'and' => '&#32;và',
@@ -441,7 +440,6 @@ $messages = array(
 'qbbrowse' => 'Duyệt',
 'qbedit' => 'Sửa đổi',
 'qbpageoptions' => 'Trang này',
-'qbpageinfo' => 'Ngữ cảnh',
 'qbmyoptions' => 'Trang cá nhân',
 'qbspecialpages' => 'Trang đặc biệt',
 'faq' => 'Câu hỏi thường gặp',
@@ -454,7 +452,7 @@ $messages = array(
 'vector-action-protect' => 'Khóa',
 'vector-action-undelete' => 'Phục hồi',
 'vector-action-unprotect' => 'Đổi mức khóa',
-'vector-simplesearch-preference' => 'Gợi ý tìm kiếm nâng cao (cần bề ngoài Vectơ)',
+'vector-simplesearch-preference' => 'Hộp tìm kiếm đơn giản (cần bề ngoài Vectơ)',
 'vector-view-create' => 'Tạo',
 'vector-view-edit' => 'Sửa',
 'vector-view-history' => 'Xem lịch sử',
@@ -464,6 +462,7 @@ $messages = array(
 'namespaces' => 'Không gian tên',
 'variants' => 'Biến thể',
 
+'navigation-heading' => 'Trình đơn chuyển hướng',
 'errorpagetitle' => 'Lỗi',
 'returnto' => 'Quay lại $1.',
 'tagline' => 'Từ {{SITENAME}}',
@@ -671,7 +670,7 @@ Truy vấn: $2',
 'viewsource-title' => 'Xem mã nguồn của $1',
 'actionthrottled' => 'Thao tác bị giới hạn',
 'actionthrottledtext' => 'Để nhằm tránh spam, bạn không thể thực hiện thao tác này quá nhiều lần trong một thời gian ngắn.  Xin hãy chờ vài phút trước khi thực hiện lại.',
-'protectedpagetext' => 'Trang này đã bị khóa không cho sửa đổi.',
+'protectedpagetext' => 'Trang này đã bị khóa không cho sửa đổi hoặc tác động khác.',
 'viewsourcetext' => 'Bạn vẫn có thể xem và chép xuống mã nguồn của trang này:',
 'viewyourtext' => "Bạn vẫn có thể xem và chép xuống mã nguồn '''các sửa đổi của bạn''' tại trang này:",
 'protectedinterface' => 'Trang này cung cấp một thông báo trong giao diện phần mềm, và bị khóa để tránh phá hoại. Để bổ sung hoặc thay đổi bản dịch ở bất cứ wiki nào, xin vui lòng đóng góp vào [//translatewiki.net/wiki/Main_Page?setlang=vi translatewiki.net], dự án bản địa hóa của MediaWiki.',
@@ -701,10 +700,10 @@ Bảo quản viên khóa nó đưa lý do là: “$3”.',
 # Login and logout pages
 'logouttext' => "'''Bạn đã đăng xuất.'''
 
-Bạn có thể tiếp tục dùng {{SITENAME}} một cách vô danh, hoặc bạn có thể [[Special:UserLogin|đăng nhập lại]] dưới cùng tên người dùng này hoặc một tên người dùng khác. Xin lưu ý rằng một vài trang có thể vẫn hiển thị như khi bạn còn đăng nhập, cho đến khi bạn xóa vùng nhớ đệm (''cache'') của trình duyệt.",
-'welcomecreation' => '== Chào mừng, $1! ==
-Tài khoản của bạn đã mở.
-Đừng quên thay đổi [[Special:Preferences|tùy chọn cá nhân của bạn tại {{SITENAME}}]].',
+Bạn có thể tiếp tục dùng {{SITENAME}} một cách vô danh, hoặc bạn có thể <span class='plainlinks'>[$1 đăng nhập lại]</span> dưới cùng tên người dùng này hoặc một tên người dùng khác. Xin lưu ý rằng một vài trang có thể vẫn hiển thị như khi bạn còn đăng nhập, cho đến khi bạn xóa vùng nhớ đệm (''cache'') của trình duyệt.",
+'welcomeuser' => 'Hoan nghênh, $1!',
+'welcomecreation-msg' => 'Tài khoản của bạn đã được mở.
+Hãy nhớ thay đổi [[Special:Preferences|tùy chọn cá nhân {{SITENAME}}]] của bạn.',
 'yourname' => 'Tên người dùng:',
 'yourpassword' => 'Mật khẩu:',
 'yourpasswordagain' => 'Gõ lại mật khẩu',
@@ -745,7 +744,7 @@ Hãy chắc chắn bạn đã bật lên cookie, làm mới trang này, và th
 Tên người dùng có phân biệt chữ hoa chữ thường.
 Hãy kiểm tra lại chính tả, hoặc [[Special:UserLogin/signup|mở tài khoản mới]].',
 'nosuchusershort' => 'Không có thành viên nào có tên “$1”. Xin hãy kiểm tra lại chính tả.',
-'nouserspecified' => 'Bạn phải đưa ra tên đăng ký.',
+'nouserspecified' => 'Bạn phải chỉ định một tên người dùng.',
 'login-userblocked' => 'Thành viên này đã bị cấm. Không cho phép đăng nhập.',
 'wrongpassword' => 'Mật khẩu sai. Xin vui lòng nhập lại.',
 'wrongpasswordempty' => 'Bạn chưa gõ vào mật khẩu. Xin thử lần nữa.',
@@ -757,7 +756,7 @@ Hãy kiểm tra lại chính tả, hoặc [[Special:UserLogin/signup|mở tài k
 'passwordremindertext' => 'Ai đó (có thể là bạn, có địa chỉ IP $1) đã yêu cầu chúng tôi gửi mật khẩu mới của {{SITENAME}} ($4). Chúng tôi đã tạo một mật khẩu tạm “$3” cho thành viên “$2”. Nếu bạn chính là người đã yêu cầu mật khẩu, bạn cần phải đăng nhập và thay đổi mật khẩu ngay bây giờ. Mật khẩu tạm sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}.
 
 Nếu bạn không yêu cầu gửi mật khẩu mới, hoặc bạn đã nhớ ra mật khẩu cũ của mình và không còn muốn đổi nó nữa, bạn có thể bỏ qua bức thư này và tiếp tục sử dụng mật khẩu cũ của bạn.',
-'noemail' => 'Thành viên “$1” không đăng ký thư điện tử.',
+'noemail' => 'Thành viên “$1” không ghi thư điện tử.',
 'noemailcreate' => 'Bạn cần cung cấp một địa chỉ thư điện tử hợp lệ',
 'passwordsent' => 'Mật khẩu mới đã được gửi tới thư điện tử của thành viên “$1”. Xin đăng nhập lại sau khi nhận thư.',
 'blocked-mailpassword' => 'Địa chỉ IP của bạn bị cấm không được sửa đổi, do đó cũng không được phép dùng chức năng phục hồi mật khẩu để tránh lạm dụng.',
@@ -909,7 +908,7 @@ Lý do được cung cấp là ''$2''.
 * Mục tiêu cấm: $7
 
 Bạn có thể liên hệ với $1 hoặc một [[{{MediaWiki:Grouppage-sysop}}|bảo quản viên]] khác để thảo luận về việc cấm.
-Bạn không thể sử dụng tính năng “gửi thư cho người này” trừ khi bạn đã đăng ký một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn tài khoản]] và bạn không bị khóa chức năng đó.
+Bạn không thể sử dụng tính năng “gửi thư cho người này” trừ khi bạn đã ghi một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn tài khoản]] và bạn không bị khóa chức năng đó.
 Địa chỉ IP hiện tại của bạn là $3, và mã số cấm là #$5.
 Xin hãy ghi kèm tất cả các thông tin trên vào thư yêu cầu của bạn.",
 'autoblockedtext' => "Địa chỉ IP của bạn đã bị tự động cấm vì một người nào đó đã sử dụng nó, $1 là thành viên đã thực hiện cấm.
@@ -924,7 +923,7 @@ Lý do được cung cấp là:
 Bạn có thể liên hệ với $1 hoặc một trong số các
 [[{{MediaWiki:Grouppage-sysop}}|bảo quản viên]] khác để thảo luận về việc cấm.
 
-Chú ý rằng bạn sẽ không dùng được chức năng “gửi thư cho người này” trừ khi bạn đã đăng ký một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn]] và bạn không bị cấm dùng chức năng đó.
+Chú ý rằng bạn sẽ không dùng được chức năng “gửi thư cho người này” trừ khi bạn đã ghi một địa chỉ thư điện tử hợp lệ trong [[Special:Preferences|tùy chọn]] và bạn không bị cấm dùng chức năng đó.
 
 Địa chỉ IP hiện tại của bạn là $3, mã số cấm là $5.
 Xin hãy ghi kèm tất cả các chi tiết trên vào thư yêu cầu của bạn.",
@@ -956,14 +955,14 @@ Bạn có thể [[Special:Search/{{PAGENAME}}|tìm kiếm tựa trang này]] t
 
 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ý.',
+'userpage-userdoesnotexist' => 'Đây chưa có tài khoản với tên “<nowiki>$1</nowiki>”. Xin hãy kiểm tra lại nếu bạn muốn tạo hay sửa trang này.',
+'userpage-userdoesnotexist-view' => 'Chưa có tài khoản với tên “$1”.',
 '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:',
 'clearyourcache' => "'''Chú ý:''' Sau khi lưu trang, có thể bạn sẽ phải xóa bộ nhớ đệm của trình duyệt để xem các thay đổi.
-* '''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)
+* '''Firefox / Safari:''' Giữ phím ''Shift'' trong khi nhấn ''Tải lại'' (''Reload''), 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''
-* '''Opera:''' Xóa bộ nhớ đệm trong ''Tools → Preferences''",
+* '''Internet Explorer:''' Giữ phím ''Ctrl'' trong khi nhấn ''Làm tươi'' (''Refresh''), hoặc nhấn tổ hợp ''Ctrl-F5''
+* '''Opera:''' Xóa bộ nhớ đệm trong ''Công cụ → Sở thích'' (''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.",
 'usercsspreview' => "'''Hãy nhớ rằng bạn chỉ đang xem thử trang CSS cá nhân của bạn.
@@ -978,7 +977,7 @@ Nó chưa được lưu!'''",
 'note' => "'''Ghi chú:'''",
 'previewnote' => "'''Đây chỉ mới là xem thử.'''
 Các thay đổi của bạn vẫn chưa được lưu!",
-'continue-editing' => 'Sửa tiếp',
+'continue-editing' => 'Đi đến hộp sửa đổi',
 'previewconflict' => 'Phần xem thử này là kết quả của văn bản trong vùng soạn thảo phía trên và nó sẽ xuất hiện như vậy nếu bạn chọn lưu trang.',
 'session_fail_preview' => "'''Những sửa đổi của bạn chưa được lưu giữ do mất dữ liệu về phiên làm việc.
 Xin hãy thử lần nữa.
@@ -1021,7 +1020,7 @@ Không thể lưu trang.",
 Bảo quản viên khi khóa dữ liệu đã đưa ra lý do: $1",
 'protectedpagewarning' => "'''Cảnh báo: Trang này đã bị khóa và chỉ có các thành viên có quyền quản lý mới có thể sửa được.'''
 Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
-'semiprotectedpagewarning' => "'''Lưu ý:''' Trang này đã bị khóa và chỉ có các thành viên đã đăng ký mới có thể sửa đổi được.
+'semiprotectedpagewarning' => "'''Lưu ý:''' Trang này đã bị khóa nên chỉ có các thành viên có tài khoản mới có thể sửa đổi được.
 Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
 'cascadeprotectedwarning' => "'''Cảnh báo:''' Trang này đã bị khóa, chỉ có thành viên có quyền quản lý mới có thể sửa đổi được, vì nó được nhúng vào {{PLURAL:$1|trang|những trang}} bị khóa theo tầng sau:",
 'titleprotectedwarning' => "'''Cảnh báo:  Trang này đã bị khóa và bạn phải có một số [[Special:ListGroupRights|quyền nhất định]] mới có thể tạo trang.'''
@@ -1058,6 +1057,15 @@ Dường như trang này đã bị xóa.',
 'edit-already-exists' => 'Không thể tạo trang mới.
 Nó đã tồn tại.',
 'defaultmessagetext' => 'Nội dung mặc định',
+'content-failed-to-parse' => 'Thất bại phân tích nội dung $2 cho mô hình $1: $3',
+'invalid-content-data' => 'Dữ liệu nội dung không hợp lệ',
+'content-not-allowed-here' => 'Không cho phép đưa nội dung “$1” vào trang [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'mã wiki',
+'content-model-text' => 'văn bản thuần',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => 'Cảnh báo: Trang này có quá nhiều lần gọi hàm cú pháp cần mức độ xử lý cao.
@@ -1314,8 +1322,6 @@ Xem chi tiết trong [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}
 'search-interwiki-caption' => 'Các dự án liên quan',
 'search-interwiki-default' => '$1 kết quả:',
 'search-interwiki-more' => '(thêm)',
-'search-mwsuggest-enabled' => 'có gợi ý',
-'search-mwsuggest-disabled' => 'không có gợi ý',
 'search-relatedarticle' => 'Liên quan',
 'mwsuggest-disable' => 'Tắt gợi ý bằng AJAX',
 'searcheverything-enable' => 'Tìm trong tất cả không gian tên',
@@ -1427,7 +1433,7 @@ Không có thể lùi lại tác động này.',
 'username' => 'Tên người dùng:',
 'uid' => 'Số thứ tự thành viên:',
 'prefs-memberingroups' => 'Thành viên của {{PLURAL:$1|nhóm|nhóm}}:',
-'prefs-registration' => 'Thời điểm đăng ký:',
+'prefs-registration' => 'Lúc mở tài khoản:',
 'yourrealname' => 'Tên thật:',
 'yourlanguage' => 'Ngôn ngữ:',
 'yourvariant' => 'Dạng chữ của nội dung:',
@@ -1579,8 +1585,11 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 # User rights log
 'rightslog' => 'Nhật trình cấp quyền thành viên',
 'rightslogtext' => 'Đây là nhật trình lưu những thay đổi đối với các quyền hạn thành viên.',
-'rightslogentry' => 'đã đổi cấp của thành viên $1 từ $2 thành $3',
+'rightslogentry' => 'đã đổi các nhóm liên kết của thành viên $1 từ $2 thành $3',
 'rightslogentry-autopromote' => 'được tự động phong cấp từ $2 đến $3',
+'logentry-rights-rights' => '$1 đã đổi các nhóm liên kết của $3 từ $4 đến $5',
+'logentry-rights-rights-legacy' => '$1 đã đổi các nhóm liên kết của $3',
+'logentry-rights-autopromote' => '$1 đã được tự động phong cấp từ $4 đến $5',
 'rightsnone' => '(không có)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1642,8 +1651,8 @@ Nếu bạn đồng ý cung cấp, nó sẽ dùng để ghi nhận công lao c
 'rclinks' => 'Xem $1 sửa đổi gần đây nhất trong $2 ngày qua; $3.',
 'diff' => 'khác',
 'hist' => 'sử',
-'hide' => 'ẩn',
-'show' => 'hiện',
+'hide' => 'Ẩn',
+'show' => 'Hiện',
 'minoreditletter' => 'n',
 'newpageletter' => 'M',
 'boteditletter' => 'b',
@@ -1822,6 +1831,7 @@ Nếu vẫn còn bị lỗi, xin hãy liên hệ với một [[Special:ListUsers
 'backend-fail-notsame' => 'Một tập tin khác biệt đã tồn tại ở $1.',
 'backend-fail-invalidpath' => '$1 không phải đường dẫn lưu giữ hợp lệ.',
 'backend-fail-delete' => 'Không thể xóa tập tin $1.',
+'backend-fail-describe' => 'Không thể thay đổi siêu dữ liệu của tập tin “$1”.',
 'backend-fail-alreadyexists' => 'Tập tin $1 đã tồn tại.',
 'backend-fail-store' => 'Không thể lưu tập tin $1 tại $2.',
 'backend-fail-copy' => 'Không thể chép tập tin $1 đến $2.',
@@ -1971,7 +1981,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.',
+'upload-disallowed-here' => 'Bạn không có thể ghi đè lên tập tin này.',
 
 # File reversion
 'filerevert' => 'Lùi lại phiên bản của $1',
@@ -2046,7 +2056,7 @@ Hãy nhớ kiểm tra các liên kết khác đến bản mẫu trước khi xó
 'statistics-views-total' => 'Số lần xem tổng cộng',
 'statistics-views-total-desc' => 'Không bao gồm số lần xem các trang không tồn tại và các trang đặc biệt',
 'statistics-views-peredit' => 'Số lần xem trên một sửa đổi',
-'statistics-users' => 'Số [[Special:ListUsers|thành viên]] đã đăng ký',
+'statistics-users' => 'Số [[Special:ListUsers|thành viên]] có tài khoản',
 'statistics-users-active' => 'Số thành viên tích cực',
 'statistics-users-active-desc' => 'Những thành viên đã hoạt động trong {{PLURAL:$1|ngày|$1 ngày}} qua',
 'statistics-mostpopular' => 'Các trang được xem nhiều nhất',
@@ -2205,7 +2215,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ợ: <code>$1</code>; 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>; mặc định là <code>http://</code> nếu không định rõ giao thức trong 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'').",
 
@@ -2254,7 +2264,7 @@ Có [[{{MediaWiki:Listgrouprights-helppage}}|thông tin thêm]] về từng nhó
 '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.
+'emailpagetext' => '{{GENDER:$1}}Mẫu dưới đây sẽ gửi một bức thư điện tử tới người dùng này.
 Đị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.',
 'usermailererror' => 'Lỗi gửi thư:',
 'defemailsubject' => 'Thư của người dùng "$1" tại {{SITENAME}}',
@@ -2286,7 +2296,7 @@ Có [[{{MediaWiki:Listgrouprights-helppage}}|thông tin thêm]] về từng nhó
 
 # Watchlist
 'watchlist' => 'Trang tôi theo dõi',
-'mywatchlist' => 'Trang tôi theo dõi',
+'mywatchlist' => 'Trang theo dõi',
 'watchlistfor2' => 'Của $1 $2',
 'nowatchlist' => 'Danh sách theo dõi của bạn không có gì.',
 'watchlistanontext' => 'Xin hãy $1 để xem hay sửa đổi các trang được theo dõi.',
@@ -2322,20 +2332,23 @@ Những sửa đổi đối với trang này và trang thảo luận của nó s
 
 'enotif_mailer' => 'Thông báo của {{SITENAME}}',
 'enotif_reset' => 'Đánh dấu đã xem mọi trang',
-'enotif_newpagetext' => 'Trang này mới',
 'enotif_impersonal_salutation' => 'thành viên {{SITENAME}}',
-'changed' => 'thay đổi',
-'created' => 'viết mới',
-'enotif_subject' => '$PAGETITLE tại {{SITENAME}} đã được $CHANGEDORCREATED bởi $PAGEEDITOR',
+'enotif_subject_deleted' => 'Trang $1 tại {{SITENAME}} đã được xóa bởi $2.',
+'enotif_subject_created' => 'Trang $1 tại {{SITENAME}} đã được tạo ra bởi $2.',
+'enotif_subject_moved' => 'Trang $1 tại {{SITENAME}} đã được di chuyển bởi $2.',
+'enotif_subject_restored' => 'Trang $1 tại {{SITENAME}} đã được phục hồi bởi $2.',
+'enotif_subject_changed' => 'Trang $1 tại {{SITENAME}} đã được thay đổi bởi $2.',
+'enotif_body_intro_deleted' => 'Trang $1 tại {{SITENAME}} đã được $2 xóa vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
+'enotif_body_intro_created' => 'Trang $1 tại {{SITENAME}} đã được $2 tạo ra vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
+'enotif_body_intro_moved' => 'Trang $1 tại {{SITENAME}} đã được $2 di chuyển vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
+'enotif_body_intro_restored' => 'Trang $1 tại {{SITENAME}} đã được $2 phục hồi vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
+'enotif_body_intro_changed' => 'Trang $1 tại {{SITENAME}} đã được $2 thay đổi vào $PAGEEDITDATE. Xem phiên bản hiện hành tại $3 .',
 'enotif_lastvisited' => 'Xem $1 để biết các thay đổi diễn ra từ lần xem cuối cùng của bạn.',
 'enotif_lastdiff' => 'Vào $1 để xem sự thay đổi này.',
 'enotif_anon_editor' => 'người dùng vô danh $1',
 'enotif_body' => 'Xin chào $WATCHINGUSERNAME,
 
-
-Trang $PAGETITLE tại {{SITENAME}} đã được $PAGEEDITOR $CHANGEDORCREATED vào $PAGEEDITDATE, xem phiên bản hiện hành tại $PAGETITLE_URL.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 Tóm lược sửa đổi: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2343,8 +2356,7 @@ Liên lạc với người viết trang qua:
 thư: $PAGEEDITOR_EMAIL
 wiki: $PAGEEDITOR_WIKI
 
-Sẽ không có thông báo nào khác nếu có sự thay đổi tiếp theo trừ khi bạn xem trang đó.
-Bạn cũng có thể thiết lập lại việc nhắc nhở cho tất cả các trang nằm trong danh sách theo dõi của bạn.
+Sẽ không có thông báo nào khác nếu có sự thay đổi tiếp theo trừ khi bạn xem trang đó. Bạn cũng có thể thiết lập lại việc nhắc nhở cho tất cả các trang nằm trong danh sách theo dõi của bạn.
 
               Hệ thống báo tin {{SITENAME}} thân thiện của bạn
 
@@ -2444,7 +2456,7 @@ hiện tại của trang '''$1''':",
 'protect-cascadeon' => 'Trang này hiện bị khóa vì nó được nhúng vào {{PLURAL:$1|những trang|trang}} dưới đây bị khóa với tùy chọn “khóa theo tầng” được kích hoạt. Bạn có thể đổi mức độ khóa của trang này, nhưng nó sẽ không ảnh hưởng đến việc khóa theo tầng.',
 'protect-default' => 'Cho phép mọi thành viên',
 'protect-fallback' => 'Cần quyền “$1”',
-'protect-level-autoconfirmed' => 'Cấm thành viên mới và thành viên chưa đăng ký',
+'protect-level-autoconfirmed' => 'Cấm thành viên mới và người dùng chưa mở tài khoản',
 'protect-level-sysop' => 'Cấm mọi thành viên (trừ bảo quản viên)',
 'protect-summary-cascade' => 'khóa theo tầng',
 'protect-expiring' => 'hết hạn $1 (UTC)',
@@ -2511,8 +2523,8 @@ Chỉ có bảo quản viên mới xem được văn bản đầy đủ của nh
 'undeletedrevisions' => '$1 {{PLURAL:$1|bản|bản}} được phục hồi',
 'undeletedrevisions-files' => '$1 {{PLURAL:$1|bản|bản}} và $2 {{PLURAL:$2|tập tin|tập tin}} đã được phục hồi',
 'undeletedfiles' => '$1 {{PLURAL:$1|tập tin|tập tin}} đã được phục hồi',
-'cannotundelete' => 'Phục hồi thất bại;
-một người nào khác đã phục hồi trang này rồi.',
+'cannotundelete' => 'Phục hồi thất bại:
+$1',
 'undeletedpage' => "'''$1 đã được khôi phục'''
 
 Xem nhật trình xóa và phục hồi các trang gần đây tại [[Special:Log/delete|nhật trình xóa]].",
@@ -2543,9 +2555,9 @@ $1',
 'blanknamespace' => '(Chính)',
 
 # Contributions
-'contributions' => 'Đóng góp của thành viên',
+'contributions' => '{{GENDER:$1}}Đóng góp của thành viên',
 'contributions-title' => 'Đóng góp của thành viên $1',
-'mycontris' => 'Đóng góp của tôi',
+'mycontris' => 'Đóng góp',
 'contribsub2' => 'Của $1 ($2)',
 'nocontribs' => 'Không tìm thấy thay đổi nào khớp với yêu cầu.',
 'uctop' => '(mới nhất)',
@@ -2584,7 +2596,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 trang đổi hướng',
 'whatlinkshere-hidetrans' => '$1 trang nhúng',
 'whatlinkshere-hidelinks' => '$1 liên kết',
-'whatlinkshere-hideimages' => '$1 liên kết hình',
+'whatlinkshere-hideimages' => '$1 liên kết tập tin',
 'whatlinkshere-filters' => 'Bộ lọc',
 
 # Block/unblock
@@ -2769,7 +2781,7 @@ Trong những trường hợp đó, bạn phải di chuyển hoặc hợp nhất
 'movearticle' => 'Di chuyển trang:',
 'moveuserpage-warning' => "'''Cảnh báo:''' Bạn sắp di chuyển trang cá nhân của người dùng. Xin lưu ý rằng chỉ có trang này sẽ được di chuyển, còn người dùng sẽ ''không'' đổi tên.",
 'movenologin' => 'Chưa đăng nhập',
-'movenologintext' => 'Bạn phải là thành viên đã đăng ký và [[Special:UserLogin|đăng nhập]] mới di chuyển trang được.',
+'movenologintext' => 'Bạn phải là thành viên đã mở tài khoản và [[Special:UserLogin|đăng nhập]] mới di chuyển trang được.',
 'movenotallowed' => 'Bạn không có quyền di chuyển trang.',
 'movenotallowedfile' => 'Bạn không có đủ quyền để di chuyển tập tin.',
 'cant-move-user-page' => 'Bạn không có quyền di chuyển trang cá nhân (ngoại trừ trang con).',
@@ -2812,15 +2824,16 @@ Trang với tên “[[:$1]]” đã tồn tại. Bạn có muốn xóa nó để
 'immobile-target-namespace-iw' => 'Không cho phép di chuyển trang đến một liên kết liên wiki.',
 'immobile-source-page' => 'Bạn không thể di chuyển trang này.',
 'immobile-target-page' => 'Không thể di chuyển đến tựa đề đích.',
+'bad-target-model' => 'Trang đích sử dụng mô hình nội dung khác. Không thể chuyển đổi nội dung từ $1 đến $2.',
 'imagenocrossnamespace' => 'Không thể di chuyển tập tin ra khỏi không gian tên Tập tin',
 'nonfile-cannot-move-to-file' => 'Không thể di chuyển những gì không phải là tập tin vào không gian tên Tập tin',
 'imagetypemismatch' => 'Phần mở rộng trong tên tập tin mới không hợp dạng của tập tin',
 'imageinvalidfilename' => 'Tên tập tin đích không hợp lệ',
 'fix-double-redirects' => 'Cập nhật tất cả các trang đổi hướng chỉ đến tựa đề cũ',
 'move-leave-redirect' => 'Để lại trang đổi hướng',
-'protectedpagemovewarning' => "'''Cảnh báo:''' Trang này đã bị khóa  chỉ có các thành viên có quyền quản lý mới có thể di chuyển được.
+'protectedpagemovewarning' => "'''Cảnh báo:''' Trang này đã bị khóa nên chỉ có các thành viên có quyền quản lý mới có thể di chuyển được.
 Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
-'semiprotectedpagemovewarning' => "'''Lưu ý:''' Trang này đã bị khóa và chỉ có các thành viên đã đăng ký mới có thể di chuyển được.
+'semiprotectedpagemovewarning' => "'''Lưu ý:''' Trang này đã bị khóa nên chỉ có các thành viên có tài khoản mới có thể di chuyển được.
 Thông tin mới nhất trong nhật trình được ghi dưới đây để tiện theo dõi:",
 'move-over-sharedrepo' => '== Tập tin đã tồn tại ==
 [[:$1]] đã tồn tại trong kho dùng chung. Nếu đổi tên tập tin thành tên này thì sẽ ghi đè lên tập tin dùng chung.',
@@ -2938,7 +2951,6 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 
 # JavaScriptTest
 'javascripttest' => 'Kiểm thử JavaScript',
-'javascripttest-disabled' => 'Chức năng này chưa được kích hoạt trên wiki này.',
 'javascripttest-title' => 'Đang chạy $1 ca kiểm thử',
 'javascripttest-pagetext-noframework' => 'Trang này dành cho việc chạy các ca kiểm thử JavaScript.',
 'javascripttest-pagetext-unknownframework' => 'Nền tảng kiểm thử không rõ “$1”.',
@@ -3078,6 +3090,7 @@ 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-not-current' => 'Rất tiếc, không thể cung cấp các chi tiết này đối với các phiên bản cũ.',
 'pageinfo-header-basic' => 'Thông tin cơ bản',
 'pageinfo-header-edits' => 'Lịch sử sửa đổi',
 'pageinfo-header-restrictions' => 'Mức khóa trang',
@@ -3086,6 +3099,7 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 '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-language' => 'Ngôn ngữ nội dung 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',
@@ -3103,10 +3117,17 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 '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 ({{lcfirst:$1}})',
 '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)',
+'pageinfo-toolboxlink' => 'Thông tin trang',
+'pageinfo-redirectsto' => 'Đổi hướng đến',
+'pageinfo-redirectsto-info' => 'thông tin',
+'pageinfo-contentpage' => 'Tính là một trang nội dung',
+'pageinfo-contentpage-yes' => 'Có',
+'pageinfo-protect-cascading' => 'Khóa theo tầng từ đây',
+'pageinfo-protect-cascading-yes' => 'Có',
+'pageinfo-protect-cascading-from' => 'Khóa theo tầng từ',
 
 # Skin names
 'skinname-standard' => 'Cổ điển',
@@ -3127,6 +3148,8 @@ Lưu nó vào máy tính của bạn rồi tải nó lên đây.',
 'markedaspatrollederror' => 'Không thể đánh dấu tuần tra',
 'markedaspatrollederrortext' => 'Bạn phải chọn phiên bản để đánh dấu tuần tra.',
 'markedaspatrollederror-noautopatrol' => 'Bạn không được đánh dấu tuần tra vào sửa đổi của bạn.',
+'markedaspatrollednotify' => 'Đã được đánh dấu tuần tra vào thay đổi tại $1.',
+'markedaspatrollederrornotify' => 'Đánh dấu tuần tra bị thất bại.',
 
 # Patrol log
 'patrol-log-page' => 'Nhật ký tuần tra',
@@ -3196,6 +3219,7 @@ Nếu thực thi nó máy tính của bạn có thể bị tiếm quyền.",
 'hours' => '$1 giờ',
 'days' => '$1 ngày',
 'ago' => 'cách đây $1',
+'just-now' => 'hồi nãy',
 
 # Bad image list
 'bad_image_list' => 'Định dạng như sau:
@@ -3452,6 +3476,7 @@ Những thông tin khác mặc định sẽ được ẩn đi.
 'exif-compression-3' => 'CCITT Nhóm 3: mã hóa fax',
 'exif-compression-4' => 'CCITT Nhóm 4: mã hóa fax',
 'exif-compression-6' => 'JPEG (cũ)',
+'exif-compression-34712' => 'JPEG 2000',
 
 'exif-copyrighted-true' => 'Dưới bản quyền',
 'exif-copyrighted-false' => 'Phạm vi công cộng',
@@ -3695,19 +3720,19 @@ Chương trình thư báo rằng: $1',
 'confirmemail_error' => 'Có trục trặc khi lưu xác nhận của bạn.',
 'confirmemail_subject' => 'Xác nhận thư điện tử tại {{SITENAME}}',
 'confirmemail_body' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1,
-đã đăng ký tài khoản có tên "$2" với địa chỉ thư điện tử này tại {{SITENAME}}.
+đã mở tài khoản có tên "$2" với địa chỉ thư điện tử này tại {{SITENAME}}.
 
 Để xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt tính năng thư điện tử tại {{SITENAME}}, xin mở liên kết này trong trình duyệt:
 
 $3
 
-Nếu bạn *không* đăng ký tài khoản, hãy nhấn vào liên kết này
+Nếu bạn *không* mở tài khoản, hãy nhấn vào liên kết này
 để hủy thủ tục xác nhận địa chỉ thư điện tử:
 
 $5
 
 Mã xác nhận này sẽ hết hạn vào $4.',
-'confirmemail_body_changed' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1, đã đăng ký tài khoản có
+'confirmemail_body_changed' => 'Ai đó, có thể là bạn, từ địa chỉ IP $1, đã mở tài khoản có
 tên "$2" với địa chỉ thư điện tử này tại {{SITENAME}}.
 
 Để xác nhận rằng tài khoản này thực sự là của bạn và để kích hoạt tính năng
@@ -3740,7 +3765,8 @@ Mã xác nhận này sẽ hết hạn vào $4.',
 
 # Scary transclusion
 'scarytranscludedisabled' => '[Nhúng giữa các wiki bị tắt]',
-'scarytranscludefailed' => '[Truy xuất bản mẫu cho $1 thất bại]',
+'scarytranscludefailed' => '[Truy xuất bản mẫu $1 bị thất bại]',
+'scarytranscludefailed-httpstatus' => '[Truy xuất bản mẫu $1 bị thất bại: HTTP $2]',
 'scarytranscludetoolong' => '[Địa chỉ URL quá dài]',
 
 # Delete conflict
@@ -3909,6 +3935,7 @@ Bạn cũng có thể [[Special:EditWatchlist|dùng trang sửa đổi bình th
 'version-license' => 'Giấy phép bản quyền',
 'version-poweredby-credits' => "Wiki này chạy trên '''[//www.mediawiki.org/ MediaWiki]''', bản quyền © 2001–$1 $2.",
 'version-poweredby-others' => 'những người khác',
+'version-credits-summary' => 'Chúng tôi muốn công nhận những người sau đã đóng góp vào [[Special:Version|MediaWiki]].',
 'version-license-info' => "MediaWiki là phần mềm tự do; bạn được phép tái phân phối và/hoặc sửa đổi nó theo những điều khoản của Giấy phép Công cộng GNU do Quỹ Phần mềm Tự do xuất bản; phiên bản 2 hay bất kỳ phiên bản nào mới hơn nào của Giấy phép.
 
 MediaWiki được phân phối với hy vọng rằng nó sẽ hữu ích, nhưng '''không có bất kỳ một bảo đảm nào cả''', ngay cả những bảo đảm ngụ ý cho '''các mục đích thương mại''' hoặc cho '''một mục đích đặc biệt nào đó'''. Xem Giấy phép Công cộng GNU để biết thêm chi tiết.
@@ -4000,8 +4027,8 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'compare-rev1' => 'Phiên bản 1',
 'compare-rev2' => 'Phiên bản 2',
 'compare-submit' => 'So sánh',
-'compare-invalid-title' => 'Tựa trang chỉ định không hợp lệ.',
-'compare-title-not-exists' => 'Tựa trang chỉ định không tồn tại.',
+'compare-invalid-title' => 'Tên trang chỉ định không hợp lệ.',
+'compare-title-not-exists' => 'Tên trang chỉ định không tồn tại.',
 'compare-revision-not-exists' => 'Phiên bản chỉ định không tồn tại.',
 
 # Database error messages
@@ -4055,8 +4082,8 @@ Các hình ảnh được hiển thị ở kích thước tối đa, còn các l
 'logentry-move-move_redir-noredirect' => '$1 đã đổi $3 thành $4 qua đổi hướng (đã tắt đổi hướng)',
 'logentry-patrol-patrol' => '$1 đã đánh dấu tuần tra phiên bản $4 của trang $3',
 'logentry-patrol-patrol-auto' => '$1 đã tự động đánh dấu tuần tra phiên bản $4 của trang $3',
-'logentry-newusers-newusers' => '$1 đã mở tài khoản mới',
-'logentry-newusers-create' => '$1 đã mở tài khoản mới',
+'logentry-newusers-newusers' => 'Đã mở tài khoản người dùng $1',
+'logentry-newusers-create' => 'Đã mở tài khoản người dùng $1',
 'logentry-newusers-create2' => '$1 đã mở tài khoản người dùng $3',
 'logentry-newusers-autocreate' => 'Tài khoản $1 đã được mở tự động',
 'newuserlog-byemail' => 'gửi mật khẩu qua thư điện tử',
@@ -4077,6 +4104,10 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'feedback-bugcheck' => 'Tuyệt! Chỉ cần kiểm tra nó chưa được [$1 báo cáo trước đây].',
 'feedback-bugnew' => 'Tôi đã kiểm tra – báo cáo lỗi mới',
 
+# Search suggestions
+'searchsuggest-search' => 'Tìm kiếm',
+'searchsuggest-containing' => 'có chứa…',
+
 # API errors
 'api-error-badaccess-groups' => 'Bạn không được phép tải tập tin lên wiki này.',
 'api-error-badtoken' => 'Lỗi nội bộ: Dấu hiệu bị hỏng.',
@@ -4129,4 +4160,6 @@ Nếu không thì bạn có thể điền biểu mẫu đơn giản ở dưới.
 'duration-centuries' => '$1 thế kỷ',
 'duration-millennia' => '$1 thiên niên kỷ',
 
+# Unknown messages
+'svg-long-error' => 'Tập tin SVG có lỗi: $1',
 );
index 9609b6f..44efa56 100644 (file)
@@ -35,125 +35,125 @@ $namespaceNames = array(
 
 $messages = array(
 # User preference toggles
-'tog-underline'           => 'Links ounderstreepn:',
-'tog-hideminor'           => 'Klêne veranderiengn verdukn van juste veranderd',
-'tog-enotifrevealaddr'    => 'Tôog min e-mailadres in e-mails',
+'tog-underline' => 'Links ounderstreepn:',
+'tog-hideminor' => 'Klêne veranderiengn verdukn van juste veranderd',
+'tog-enotifrevealaddr' => 'Tôog min e-mailadres in e-mails',
 'tog-shownumberswatching' => 'Tôog et aantal gebrukers dan et blad volgn',
 
-'underline-always'  => 'Olsan',
-'underline-never'   => 'Noois',
+'underline-always' => 'Olsan',
+'underline-never' => 'Noois',
 'underline-default' => 'Browser standoard',
 
 # Dates
-'sunday'        => 'zundag',
-'monday'        => 'moandag',
-'tuesday'       => 'disndag',
-'wednesday'     => 'woesdag',
-'thursday'      => 'dunderdag',
-'friday'        => 'vrydag',
-'saturday'      => 'zoaterdag',
-'sun'           => 'zu',
-'mon'           => 'moa',
-'tue'           => 'din',
-'wed'           => 'woe',
-'thu'           => 'dun',
-'fri'           => 'vry',
-'sat'           => 'zat',
-'january'       => 'januoari',
-'february'      => 'februoari',
-'march'         => 'moarte',
-'april'         => 'april',
-'may_long'      => 'mei',
-'june'          => 'juni',
-'july'          => 'juli',
-'august'        => 'ogustus',
-'september'     => 'september',
-'october'       => 'oktober',
-'november'      => 'november',
-'december'      => 'december',
-'january-gen'   => 'januari',
-'february-gen'  => 'februoari',
-'march-gen'     => 'moarte',
-'april-gen'     => 'april',
-'may-gen'       => 'mei',
-'june-gen'      => 'juni',
-'july-gen'      => 'juli',
-'august-gen'    => 'ogustus',
+'sunday' => 'zundag',
+'monday' => 'moandag',
+'tuesday' => 'disndag',
+'wednesday' => 'woesdag',
+'thursday' => 'dunderdag',
+'friday' => 'vrydag',
+'saturday' => 'zoaterdag',
+'sun' => 'zu',
+'mon' => 'moa',
+'tue' => 'din',
+'wed' => 'woe',
+'thu' => 'dun',
+'fri' => 'vry',
+'sat' => 'zat',
+'january' => 'januoari',
+'february' => 'februoari',
+'march' => 'moarte',
+'april' => 'april',
+'may_long' => 'mei',
+'june' => 'juni',
+'july' => 'juli',
+'august' => 'ogustus',
+'september' => 'september',
+'october' => 'oktober',
+'november' => 'november',
+'december' => 'december',
+'january-gen' => 'januari',
+'february-gen' => 'februoari',
+'march-gen' => 'moarte',
+'april-gen' => 'april',
+'may-gen' => 'mei',
+'june-gen' => 'juni',
+'july-gen' => 'juli',
+'august-gen' => 'ogustus',
 'september-gen' => 'september',
-'october-gen'   => 'oktober',
-'november-gen'  => 'november',
-'december-gen'  => 'december',
-'jan'           => 'jan',
-'feb'           => 'feb',
-'mar'           => 'mrt',
-'apr'           => 'apr',
-'may'           => 'mei',
-'jun'           => 'jun',
-'jul'           => 'jul',
-'aug'           => 'ogs',
-'sep'           => 'sep',
-'oct'           => 'okt',
-'nov'           => 'nov',
-'dec'           => 'dec',
+'october-gen' => 'oktober',
+'november-gen' => 'november',
+'december-gen' => 'december',
+'jan' => 'jan',
+'feb' => 'feb',
+'mar' => 'mrt',
+'apr' => 'apr',
+'may' => 'mei',
+'jun' => 'jun',
+'jul' => 'jul',
+'aug' => 'ogs',
+'sep' => 'sep',
+'oct' => 'okt',
+'nov' => 'nov',
+'dec' => 'dec',
 
 # Categories related messages
 'listingcontinuesabbrev' => 'vervolg',
 
-'newwindow'     => '(opent in e nieuw veister)',
+'newwindow' => '(opent in e nieuw veister)',
 'moredotdotdot' => 'Mêer…',
-'mypage'        => 'Myn gebrukersblad',
-'mytalk'        => 'Myn discuusjeblad',
-'and'           => '&#32;en',
+'mypage' => 'Myn gebrukersblad',
+'mytalk' => 'Myn discuusjeblad',
+'and' => '&#32;en',
 
 # Cologne Blue skin
-'qbedit'         => 'Bewerkn',
+'qbedit' => 'Bewerkn',
 'qbspecialpages' => 'Specioale bloadn',
 
 # Vector skin
-'vector-action-delete'   => 'Wegdoen',
-'vector-action-move'     => 'Ernoemn',
-'vector-view-create'     => 'Anmoakn',
-'vector-view-edit'       => 'Bewerkn',
-'vector-view-history'    => 'Geschiedenisse bekykn',
-'vector-view-view'       => 'Leezn',
+'vector-action-delete' => 'Wegdoen',
+'vector-action-move' => 'Ernoemn',
+'vector-view-create' => 'Anmoakn',
+'vector-view-edit' => 'Bewerkn',
+'vector-view-history' => 'Geschiedenisse bekykn',
+'vector-view-view' => 'Leezn',
 'vector-view-viewsource' => 'Brontekst bekykn',
 
-'tagline'           => 'Van {{SITENAME}}',
-'help'              => 'Ulpe',
-'search'            => 'Zoekn',
-'searchbutton'      => 'Zoekn',
-'history_short'     => 'Geschiedenisse',
-'updatedmarker'     => 'bygewerkt sinds min latste visite',
-'printableversion'  => 'Drukboare versie',
-'permalink'         => 'Bluuvende link',
-'print'             => 'Drukn',
-'edit'              => "Bewerk'n",
-'create'            => 'Anmoakn',
-'editthispage'      => 'Da blad ier bewerkn',
-'create-this-page'  => 'Da blad ier anmoakn',
-'delete'            => 'Wegdoen',
-'deletethispage'    => 'Da blad ier verwydern',
-'undelete_short'    => '{{PLURAL:$1|êen bewerkinge|$1 bewerkingn}} werekêern',
-'protect'           => 'Beveilign',
-'protectthispage'   => 'Da blad ier beveilign',
-'unprotect'         => 'beveiliginge wegdoen',
+'tagline' => 'Van {{SITENAME}}',
+'help' => 'Ulpe',
+'search' => 'Zoekn',
+'searchbutton' => 'Zoekn',
+'history_short' => 'Geschiedenisse',
+'updatedmarker' => 'bygewerkt sinds min latste visite',
+'printableversion' => 'Drukboare versie',
+'permalink' => 'Bluuvende link',
+'print' => 'Drukn',
+'edit' => "Bewerk'n",
+'create' => 'Anmoakn',
+'editthispage' => 'Da blad ier bewerkn',
+'create-this-page' => 'Da blad ier anmoakn',
+'delete' => 'Wegdoen',
+'deletethispage' => 'Da blad ier verwydern',
+'undelete_short' => '{{PLURAL:$1|êen bewerkinge|$1 bewerkingn}} werekêern',
+'protect' => 'Beveilign',
+'protectthispage' => 'Da blad ier beveilign',
+'unprotect' => 'beveiliginge wegdoen',
 'unprotectthispage' => 'De beveiliginge van da blad ier ofleggn',
-'newpage'           => 'Nieuw blad',
-'talkpagelinktext'  => 'Discuusje',
-'specialpage'       => 'Specioal blad',
-'talk'              => 'Discuusje',
-'toolbox'           => 'Ulpmiddeln',
+'newpage' => 'Nieuw blad',
+'talkpagelinktext' => 'Discuusje',
+'specialpage' => 'Specioal blad',
+'talk' => 'Discuusje',
+'toolbox' => 'Ulpmiddeln',
 
 # 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'   => 'Over {{SITENAME}}',
-'aboutpage'   => 'Project:Info',
+'aboutsite' => 'Over {{SITENAME}}',
+'aboutpage' => 'Project:Info',
 'disclaimers' => 'Aansprakelekeid',
-'mainpage'    => 'Voorblad',
-'privacy'     => 'Privacybeleid',
+'mainpage' => 'Voorblad',
+'privacy' => 'Privacybeleid',
 
-'viewsourceold'  => 'Brontekst bekykn',
+'viewsourceold' => 'Brontekst bekykn',
 'viewsourcelink' => 'Brontekst bekykn',
-'site-rss-feed'  => '$1 RSS-feed',
+'site-rss-feed' => '$1 RSS-feed',
 'site-atom-feed' => '$1 Atom-feed',
 'red-link-title' => '$1 (Blad bestoat nie)',
 
@@ -173,20 +173,20 @@ $messages = array(
 'recentchanges' => 'Juste veranderd',
 
 # Upload
-'upload'            => 'Bestand toevoegn',
-'uploadbtn'         => 'Bestand toevoegn',
-'uploadnologin'     => 'Ge zyt nie angemeld',
-'uploadlog'         => 'logboek upgeloade bestandn',
-'uploadlogpage'     => 'Logboek upgeloade bestandn',
+'upload' => 'Bestand toevoegn',
+'uploadbtn' => 'Bestand toevoegn',
+'uploadnologin' => 'Ge zyt nie angemeld',
+'uploadlog' => 'logboek upgeloade bestandn',
+'uploadlogpage' => 'Logboek upgeloade bestandn',
 'uploadlogpagetext' => 'Hier stoa e lyste met de mêest recente upgeloade bestandn.',
-'uploadedfiles'     => 'Upgeloade bestandn',
-'uploadedimage'     => '"[[$1]]" upgeload',
+'uploadedfiles' => 'Upgeloade bestandn',
+'uploadedimage' => '"[[$1]]" upgeload',
 
 # Unwatched pages
 'unwatchedpages' => "Pagina's die ip niemands volglyste stoan",
 
 # Miscellaneous special pages
-'newpages'          => 'Nieuwe bloadn',
+'newpages' => 'Nieuwe bloadn',
 'newpages-username' => 'Gebrukersnoame:',
 
 # Special:Log/newusers
@@ -194,22 +194,22 @@ $messages = array(
 
 # Watchlist
 'mywatchlist' => 'Myn volglyste',
-'watch'       => 'Volgn',
-'unwatch'     => 'Nie volgn',
+'watch' => 'Volgn',
+'unwatch' => 'Nie volgn',
 
 # Displayed when you click the "watch" button and it is in the process of watching
 'unwatching' => 'Stoppn me volgn...',
 
 # Undelete
-'undelete'               => 'Weggedoane bloadn bekykn',
-'undeletepage'           => 'Weggedoane bloadn erstelln of bekykn',
+'undelete' => 'Weggedoane bloadn bekykn',
+'undeletepage' => 'Weggedoane bloadn erstelln of bekykn',
 'undeletehistorynoadmin' => "'t Artikel is weggedoan. De reden davôorn ku je zien in de soamnvattienge ieronder, tôpe me uutleg over wie dat 't blad bewerkt èt vôorn dat weggedoan es gewist. Den tekst van die weggedoane versies kan allêene door sysops gelezen wordn.",
-'undeletebtn'            => 'Erstelln',
-'undeletedfiles'         => '{{PLURAL:$1|1 bestand|$1 bestandn}} ersteld',
+'undeletebtn' => 'Erstelln',
+'undeletedfiles' => '{{PLURAL:$1|1 bestand|$1 bestandn}} ersteld',
 
 # Contributions
 'mycontris' => 'Myn bydroagn',
-'uctop'     => '(latste veranderienge)',
+'uctop' => '(latste veranderienge)',
 
 # Block/unblock
 'contribslink' => 'bydroagn',
index 3b9e36f..8060c4f 100644 (file)
@@ -462,8 +462,6 @@ Hirmid sagsd, das Du den dhägsd '''selbâr gschriim''' hasd, das däär dhägsd
 'search-interwiki-caption' => 'Schwesder-brojägd',
 'search-interwiki-default' => 'Af $1 gfundn:',
 'search-interwiki-more' => '(noch mäa´)',
-'search-mwsuggest-enabled' => 'mid foorschleech',
-'search-mwsuggest-disabled' => 'ghane foorschlääch',
 'search-relatedarticle' => 'Fârwande',
 'mwsuggest-disable' => 'Foorschlääch iwâr AJAX abschdelâ',
 'searcheverything-enable' => 'In aln naamsrajm suuchn',
index 7f0775d..3126bef 100644 (file)
@@ -248,7 +248,6 @@ $messages = array(
 'qbbrowse' => 'Padön',
 'qbedit' => 'Redakön',
 'qbpageoptions' => 'Pad at',
-'qbpageinfo' => 'Yumed',
 'qbmyoptions' => 'Pads obik',
 'qbspecialpages' => 'Pads patik',
 'faq' => 'Säks suvo pasäköls',
@@ -474,11 +473,8 @@ Kod binon: ''$2''.",
 # Login and logout pages
 'logouttext' => "'''Esenunädol oli.'''
 
-Kanol laigebön {{SITENAME}} nennemiko, u kanol [[Special:UserLogin|nunädön oli dönu]] me gebananem ot u gebenanem votik.
+Kanol laigebön {{SITENAME}} nennemiko, u kanol <span class='plainlinks'>[$1 nunädön oli dönu]</span> me gebananem ot u gebenanem votik.
 Küpälolös, das pads anik ba nog pojenons äsva no esenunädol oli, jüs uklinükol memi no laidüpik bevüresodanaföma olik.",
-'welcomecreation' => '== Benokömö, o $1! ==
-Kal olik pejafon.
-No glömolöd ad votükön [[Special:Preferences|buükamis olik in {{SITENAME}}]].',
 'yourname' => 'Gebananem:',
 'yourpassword' => 'Letavöd:',
 'yourpasswordagain' => 'Klavolös dönu letavödi:',
@@ -931,8 +927,6 @@ Kontrololös, va votükam at okipon fovöfi padajenotema.',
 'search-interwiki-caption' => 'Svistaproyegs',
 'search-interwiki-default' => 'Seks se $1:',
 'search-interwiki-more' => '(pluikos)',
-'search-mwsuggest-enabled' => 'sa mobs',
-'search-mwsuggest-disabled' => 'nen mobs',
 'search-relatedarticle' => 'Tefik',
 'mwsuggest-disable' => 'Nemögükön mobis ela AJAX',
 'searcheverything-enable' => 'Sukolöd in nemaspads valik',
@@ -1695,11 +1689,7 @@ If vilol poso moükön padi de galädalised olik, välolös lä on knopi: „neg
 
 'enotif_mailer' => 'Nunamasit ela {{SITENAME}}',
 'enotif_reset' => 'Malön padis pevisitöl valik',
-'enotif_newpagetext' => 'Atos binon pad nulik.',
 'enotif_impersonal_salutation' => 'Geban {{SITENAME}}-a',
-'changed' => 'pevotüköl',
-'created' => 'pejafon',
-'enotif_subject' => 'In {{SITENAME}}, pad: $PAGETITLE $CHANGEDORCREATED fa el $PAGEEDITOR',
 'enotif_lastvisited' => 'Logolös eli $1 ad tuvön lisedi votükamas valik pos visit lätik ola.',
 'enotif_lastdiff' => 'Logolös eli $1 ad tuvön votükami at.',
 'enotif_anon_editor' => 'geban nennemik: $1',
@@ -2822,4 +2812,8 @@ Magods pajonons ma fomät gudikün, ragivasots votik pamaifükons stedöfo kobü
 'revdelete-unrestricted' => 'miedükams pro guvans pemoükons',
 'newuserlog-byemail' => 'letavöd pesedon me pot leäktronik',
 
+# Search suggestions
+'searchsuggest-search' => 'Suk',
+'searchsuggest-containing' => 'ninädöl...',
+
 );
index 460de6a..5067968 100644 (file)
@@ -87,6 +87,7 @@ $messages = array(
 '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',
+'noindex-category' => 'Ebäindekseeritettäväd lehocülled',
 
 'about' => 'Täätühsed',
 'newwindow' => '(avaub uuvvõza akkunaza)',
@@ -221,9 +222,11 @@ Kui cüsümüssessä ebõõ roocittu cülci, võib õlla õlõttõ löütännü
 # Login and logout pages
 'yourname' => 'Cäüttijänimi:',
 'yourpassword' => 'Salasõna',
+'yourpasswordagain' => 'Tõissaga salain-sõ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',
+'loginprompt' => 'Tüü piättä «cookies» võttamin luvata, štobõ entä sisteema ete esitellä.',
 'userlogin' => 'Cirjut süäme',
 'userloginnocreate' => 'Cirjut süäme',
 'logout' => 'Cirjut uloz',
@@ -231,7 +234,9 @@ Kui cüsümüssessä ebõõ roocittu cülci, võib õlla õlõttõ löütännü
 'nologin' => "Kui Teille veel ebõõ cäüttijänimi, '''$1'''.",
 'nologinlink' => 'võitta loovva luguu',
 'createaccount' => 'Uusi cäüttijää',
+'gotaccount' => 'Tüü õõttõ jo registreerittu? $1.',
 'gotaccountlink' => 'Cirjut süäme',
+'userlogin-resetlink' => 'Vai unõhtittõ õma loginass?',
 'createaccountreason' => 'Süü:',
 'mailmypassword' => 'Lähet uusi salasõna elektropoštiikaa',
 'loginlanguagelabel' => 'Ceeli: $1',
@@ -294,12 +299,16 @@ Tüü võittõ [[Special:Search/{{PAGENAME}}|kaze nime nimettamizõ löütä]] m
 '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:',
+'recreate-moveddeleted-warn' => "'''Tähele-pano. Tüü loottõ taaz lehocülce, kumpa õli eespäi poisõttu.'''
+
+Tarkassaga, vai tarviz teile sitä tehä. Alapallõ õlla kaze lehocülle poissamizije ja nimije muuttamizije žurnaalad esitettü.",
 '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-warning' => "'''Tähele-pano''': kase lehocülci sisältäb vähepält ühs šabloona, kumma argumental on liiga suuri avvamizõ koko. Mokomad argumentad eväd õltu näütettü",
 'post-expand-template-argument-category' => 'Lehocülled, jõgad sisälletä väl’l’ä-jätettü šabloonije argumentad.',
 
 # History pages
@@ -307,6 +316,7 @@ Mõnõd šabloonad eväd lee lizettü.",
 'currentrev' => 'Nücüin verzija',
 'currentrev-asof' => 'Nücüin verzija $1',
 'revisionasof' => 'Verzija $1',
+'revision-info' => '41. Verssija $1-ss; $2',
 'previousrevision' => '← Vanõpi verzija',
 'nextrevision' => 'Uuvvõpi verzija →',
 'currentrevisionlink' => 'Nücüin verzija',
@@ -345,6 +355,7 @@ Mõnõd šabloonad eväd lee lizettü.",
 'lineno' => 'Viiru $1:',
 'compareselectedversions' => 'Võrrõõ valitsõttuit verzijoit',
 'editundo' => 'kummut',
+'diff-multi' => 'Eb õõ näütettü {{PLURAL:$1|õsa-võttaja|õsa-võttajije}} {{PLURAL:$2|$2 väli-verssija $1|väli-verssijad $1}}',
 
 # Search results
 'searchresults' => 'Etsüü tulõmuhsõd',
@@ -373,14 +384,13 @@ Mõnõd šabloonad eväd lee lizettü.",
 '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-result-category-size' => '$1 {{PLURAL:$1|jäse|$1 jäsentä}} ({{PLURAL:$2|1 all-kategoorija|$2 all-kategoorijad}}, {{PLURAL:$3|1 faili|$3 faila}})',
 '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',
 'searchrelated' => 'sittu',
 'searchall' => 'kõik',
 'showingresultsheader' => "{{PLURAL:$5|Tuloz '''$1''' '''$3'''-ss|Tulohsõd '''$1-$2''' '''$3'''-ss}} «$4» vart",
@@ -418,6 +428,8 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
 'gender-male' => 'Mehin',
 'gender-female' => 'Naisin',
 'email' => 'E-mail',
+'prefs-help-email' => 'E-mail eb õõ pakollin, ain se leeb vajallin, kui tüü unõhtattõ salain-sõnass.',
+'prefs-help-email-others' => 'Se lupabci muilõ õsa-võttajilõ võtta ühteüttä tejjeka tejje personaaliss lehocülless viittau kautta, ilma tejje e-mail’a tääotusõ vajaussa.',
 
 # User rights
 'userrights-reason' => 'Süü:',
@@ -425,7 +437,7 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
 # Groups
 'group-user' => 'Сäüttijäd',
 'group-sysop' => 'Praviťeľad',
-'group-all' => '{kõik)',
+'group-all' => '(kõik)',
 
 'group-user-member' => 'cäüttijä',
 
@@ -449,11 +461,13 @@ Proovvi lizät etsün alkuu ''all:'', nii ettsü etsib kõikkõõ sisältoo (taa
 '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.',
+'rcnotefrom' => 'Alapallõ õlla lugõtõltu muuttamizõd $2-lt ($1-lõssaa)',
 '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',
+'rcshowhidepatr' => 'Tarkasõttu kõrjausije $1',
 'rcshowhidemine' => '$1 õmad muutussõd',
 'rclinks' => 'Näüt viimõiss $1 muutuhsõiss viimõizõ $2 päivää ajalt.<br />$3',
 'diff' => 'vahõ',
@@ -543,6 +557,7 @@ Seness [$2 kuvauhsõ lehocülless] informaattsija on alapallõ annõttu.',
 'nbytes' => '$1 {{PLURAL:$1|baitti|baittia}}',
 'nmembers' => '$1 {{PLURAL:$1|selttsilain|selttsilaizõd}}',
 'prefixindex' => 'Kõik cüľľed prefiksiikaa',
+'usercreated' => '33. $3 on entä cirjannu $1 $2-na',
 'newpages' => 'Uuvvõd cüľľed',
 'newpages-username' => 'Cäüttijänimi:',
 'move' => 'Liikut',
@@ -612,8 +627,6 @@ Cülci leeb cirjutõttu '''pimmiässi''' [[Special:RecentChanges|spiizgall viime
 'watching' => 'Kattsõõn…',
 'unwatching' => 'Kattsõõmizõõ lõpõttõmin…',
 
-'enotif_newpagetext' => 'Kase on vassõn cülci.',
-
 # Delete
 'deletepage' => 'Pühi cülci',
 'delete-legend' => 'Pühi',
@@ -685,10 +698,12 @@ Cüľľellä $2 on spiiska viimeiziss pühcimühsiiss.',
 
 'sp-contributions-newbies' => 'Näüt uusijõõ cäüttijee muutuhsõd',
 'sp-contributions-blocklog' => 'piättelemized',
+'sp-contributions-uploads' => 'lassausõd',
 'sp-contributions-logs' => 'logid',
 'sp-contributions-talk' => 'Juttu',
 'sp-contributions-search' => 'Etsi avittamisiit',
 'sp-contributions-username' => 'IP-adressi vai cäüttijänimi',
+'sp-contributions-toponly' => 'Viimeized verssijad näüttä',
 'sp-contributions-submit' => 'Etsi',
 
 # What links here
@@ -696,6 +711,7 @@ Cüľľellä $2 on spiiska viimeiziss pühcimühsiiss.',
 'whatlinkshere-title' => 'Cüľľed, kummad näütellä cüľľelle "$1"',
 'whatlinkshere-page' => 'Cülci:',
 'linkshere' => "Vahtiaavilt cülciilt on linkki cüľľelle '''[[:$1]]''':",
+'nolinkshere' => "Mitäid eb viitata '''[[:$1]]-sõ'''",
 'isredirect' => 'mešaituzcülci',
 'istemplate' => 'sisällütüz šabloonii',
 'isimage' => 'kuvalinkki',
@@ -762,6 +778,7 @@ Neill kõhtoill piättä liikuttaa vai ühissää cüľľee cäzi.",
 
 # Namespace 8 related
 'allmessagesname' => 'Nimi',
+'allmessagesdefault' => 'Standartin teksta',
 'allmessages-language' => 'Ceeli:',
 'allmessages-filter-submit' => 'Mee',
 
@@ -928,6 +945,16 @@ Kui faili on muutõttu, siiz detaaľid võivad õlla kahõllaizõd muutõtull fa
 # Special:SpecialPages
 'specialpages' => 'Osoobenoid cüľľed',
 
+# External image whitelist
+'external_image_whitelist' => '# Jättägä kase rivi mokomassi, minenä-mokomana se on õõmaz.<pre>
+# Sijottaga tänne säännollizije ilmaud’d’e fragmentad (se õsa, kumpa on // väliz)
+# ned leevät võrrõttu ulko-kuvije URL-sõ.
+# Sopivad leeväd näütettü kuvijna, muud leeväd näütettü kuvijsõ viitauina.
+# Rivid, kummad alguta //-ss, pietä kommentaarijina. Rivid eväd õlla tunnuttu registra suhtõsõ.
+# Sijottaga säännollizije ilmaud’d’e fragmentad kaze rivi ülez.
+
+# Jättägä kase rivi mokomassi, minenä-mokomana se on õõmaz.',
+
 # Special:Tags
 'tag-filter' => "[[Special:Tags|Deskriptorije]] fil'tra:",
 'tags-edit' => 'muuttaa',
index a485807..a7ee7e7 100644 (file)
@@ -175,7 +175,7 @@ $messages = array(
 'cancel' => 'Jätäq katski',
 'moredotdotdot' => 'Viil...',
 'mypage' => 'Muq lehekülg',
-'mytalk' => 'Mu arotus',
+'mytalk' => 'Arotus',
 'anontalk' => 'Seo puutri võrgoaadrõsi arotus',
 'navigation' => 'Juhtminõ',
 'and' => '&#32;ja',
@@ -185,7 +185,6 @@ $messages = array(
 'qbbrowse' => 'Kaeq',
 'qbedit' => 'Toimõndaq',
 'qbpageoptions' => 'Leheküle säädmine',
-'qbpageinfo' => 'Leheküle teedüs',
 'qbmyoptions' => 'Mu säädmiseq',
 'qbspecialpages' => 'Tallitusleheküleq',
 'faq' => 'Sagõhõhe küsüdüq küsümiseq',
@@ -423,9 +422,8 @@ $2',
 # Login and logout pages
 'logouttext' => "'''Olõt nime alt vällä lännüq.'''
 
-Võit {{SITENAME}}t ilma nimeldä edesi toimõndaq vai [[Special:UserLogin|vahtsõst sama vai tõõsõ nimega sisse minnäq]].
+Võit {{SITENAME}}t ilma nimeldä edesi toimõndaq vai <span class='plainlinks'>[$1 vahtsõst sama vai tõõsõ nimega sisse minnäq]</span>.
 Tähelepandmisõs: niikavva, ku sa olõ-i tühäs tennüq uma võrgokaeja vaihõmällo, võivaq mõnõq leheküleq iks viil näüdädäq, nigu sa olõsi nimega seen.",
-'welcomecreation' => '<h2>Tereq, $1!</h2><p>Su konto om valmis. Võit taa hindä perrä sisse säädäq.',
 'yourname' => 'Pruukjanimi',
 'yourpassword' => 'Salasõna',
 'yourpasswordagain' => 'Kirodaq viilkõrd salasõna',
@@ -660,6 +658,11 @@ Võit toimõndaq olõmanolõvit lehti vai [[Special:UserLogin|minnäq nimega sis
 Kas tahat taad lehte tõtõstõ toimõndaq? Kaeq ka sissekirotust seo lehe ärqkistutamisõ kotsilõ:",
 'edit-conflict' => 'Samaaignõ toimõndus.',
 
+# Parser/template warnings
+'post-expand-template-inclusion-warning' => "'''Hoiatus:''' Pruugitavidõ näüdüsside maht om pall'o suur.
+Tuuperäst ossa näüdüssit näüdädä-äi.",
+'post-expand-template-inclusion-category' => 'Leheküleq, mil om näüdüsside mahupiir ületet',
+
 # "Undo" feature
 'undo-success' => "Tagasivõtminõ läts' kõrda. Kaeq üle, kas taa om tuu, midä sa tetäq tahtsõt ja pästäq muutusõq.",
 'undo-failure' => 'Tagasivõtminõ lää-s kõrda samal aol tettüide muutmiisi vastaolo peräst. Võit muutusõq käsilde tagasi võttaq.',
@@ -792,8 +795,6 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
 'search-interwiki-caption' => 'Sõsarprojektiq',
 'search-interwiki-default' => '$1 tulõmiq:',
 'search-interwiki-more' => '(viil)',
-'search-mwsuggest-enabled' => 'näütäq soovituisi',
-'search-mwsuggest-disabled' => 'ilma soovituisilda',
 'search-relatedarticle' => 'Otsiq samasugutsit lehti',
 'mwsuggest-disable' => 'Näüdäku-i AJAX-i soovituisi',
 'searchrelated' => 'samasugunõ',
@@ -804,6 +805,7 @@ Lisateedüst või ollaq [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAME
 'nonefound' => "'''Hoiatus''':  Otsitas õnnõ üten jaon nimeruumõn.
 Ku tahat otsiq kõrraga kõigist nimeruumidest (ka arotuskülgi päält, näüdüssist jne) pruugiq
 otsisõna iin edejakku ''all:''. Ütest kimmäst nimeruumist otsmisõs pruugiq edejakus tuu nimeruumi nimme.",
+'search-nonefound' => 'Perräküsümisele löüdä-äs vastust.',
 'powersearch' => 'Otsminõ',
 'powersearch-legend' => 'Laendõt otsminõ',
 'powersearch-ns' => 'Otsminõ nimeruumõst:',
@@ -822,7 +824,7 @@ otsisõna iin edejakku ''all:''. Ütest kimmäst nimeruumist otsmisõs pruugiq e
 
 # Preferences page
 'preferences' => 'Säädmine',
-'mypreferences' => 'Mu säädmiseq',
+'mypreferences' => 'Säädmiseq',
 'prefs-edits' => 'Tõimõndamiisi arv:',
 'prefsnologin' => 'Sa olõ-i nimega sisse lännüq',
 'prefsnologintext' => 'Et säädmiisi tetäq, tulõ sul [[Special:UserLogin|nimega sisse minnäq]].',
@@ -1072,7 +1074,7 @@ Ku ülekaet teedüstü om sama pilt alguperälidsen suurusõn, sis olõ-i vaia e
 'upload-curl-error28-text' => 'Taa aadrõsi päält saa-s ao pääle vastust. Oodaq vähä ja prooviq vahtsõst.',
 
 'license' => 'Litsents:',
-'license-header' => 'Litsents:',
+'license-header' => 'Litsents',
 'nolicense' => 'Olõ-i litsentsi valit',
 'license-nopreview' => '(Saa-i kaiaq)',
 'upload_source_url' => ' (avalik tüütäv võrgoaadrõs)',
@@ -1103,10 +1105,11 @@ Ku ülekaet teedüstü om sama pilt alguperälidsen suurusõn, sis olõ-i vaia e
 'filehist-dimensions' => 'Suurus',
 'filehist-filesize' => 'Teedüstü suurus',
 'filehist-comment' => 'Seletüs:',
-'imagelinks' => 'Teedüstülingiq',
+'imagelinks' => 'Teedüstüpruukminõ',
 'linkstoimage' => 'Taa pildi pääle {{PLURAL:$1|näütäs lehekülg|näütäseq leheküleq}}:',
 'nolinkstoimage' => 'Taa pildi pääle näütä-i ütski lehekülg.',
 'sharedupload' => 'Seo teedüstü om peri lättest $1 ni taad võivaq pruukiq ka tõõsõq vikiq.',
+'sharedupload-desc-here' => 'Seo om jaet teedüstü lättest $1 ja seod saa pruukiq ka tõisin projekten. Teedüstü [$2 seletüs] om ant allpuul.',
 'uploadnewversion-linktext' => 'Laadiq taa teedüstü vahtsõnõ kujo',
 
 # File reversion
@@ -1310,7 +1313,7 @@ ja sul piät umin [[Special:Preferences|säädmiisin]] olõma e-postiaadrõs, et
 
 # Watchlist
 'watchlist' => 'Perräkaemisnimekiri',
-'mywatchlist' => 'mu perräkaemisnimekiri',
+'mywatchlist' => 'Perräkaemisnimekiri',
 'nowatchlist' => 'Perräkaemisnimekiri om tühi.',
 'watchlistanontext' => 'Perräkaemisnimekirä pruukmisõs $1.',
 'watchnologin' => 'Olõ-i nimega sisse mint',
@@ -1340,11 +1343,7 @@ ja sul piät umin [[Special:Preferences|säädmiisin]] olõma e-postiaadrõs, et
 
 'enotif_mailer' => '{{SITENAME}} lehe muutumisteedüs',
 'enotif_reset' => 'Märgiq kõik leheq ülekaetuis',
-'enotif_newpagetext' => 'Taa om vahtsõnõ leht.',
 'enotif_impersonal_salutation' => '{{SITENAME}} pruukja',
-'changed' => 'lehte muutnuq',
-'created' => 'lehe loonuq',
-'enotif_subject' => '$PAGEEDITOR om $CHANGEDORCREATED $PAGETITLE',
 'enotif_lastvisited' => 'Lehel $1 ommaq kõik päält suq perämäst käümist tettüq muutmisõq.',
 'enotif_lastdiff' => 'Taa muutusõ nägemises kaeq: $1.',
 'enotif_anon_editor' => 'nimeldä pruukja $1',
@@ -1488,7 +1487,7 @@ Perämäidsi kistutuisi ja tagasitegemiisi saat kaiaq [[Special:Log/delete|kistu
 # Contributions
 'contributions' => 'Pruukja kirotusõq',
 'contributions-title' => 'Pruukja $1 toimõndusõq',
-'mycontris' => 'Mu kirotusõq',
+'mycontris' => 'Hindä kirotusõq',
 'contribsub2' => 'Pruukja "$1 ($2)" kirotusõq',
 'nocontribs' => 'Sääntsit muutmiisi es lövväq.',
 'uctop' => '(kõgõ vahtsõmb)',
@@ -1559,7 +1558,7 @@ Perämäidsi kistutuisi ja tagasitegemiisi saat kaiaq [[Special:Log/delete|kistu
 'ipusubmit' => 'Lõpõdaq kinniqpidämine ärq',
 'unblocked' => 'Pruukja [[User:$1|$1]] kinniqpidämine om ärq lõpõtõt',
 'unblocked-id' => '$1 kinniqpidämine võeti maaha',
-'ipblocklist' => 'Kinniqpeetüisi IP-aadrõssidõ ja pruukjanimmi nimekiri',
+'ipblocklist' => 'Kinniqpeetüq pruukjaq',
 'ipblocklist-legend' => 'Otsiq kinniqpeetüt pruukjat',
 'ipblocklist-submit' => 'Otsiq',
 'infiniteblock' => 'igäveste',
index adeb032..48e1aee 100644 (file)
@@ -220,7 +220,6 @@ $messages = array(
 'qbbrowse' => 'Foyter',
 'qbedit' => 'Candjî',
 'qbpageoptions' => 'Cisse pådje ci',
-'qbpageinfo' => 'Contecse',
 'qbmyoptions' => 'Mes pådjes',
 'qbspecialpages' => 'Pådjes sipeciåles',
 
@@ -423,12 +422,8 @@ $2",
 # Login and logout pages
 'logouttext' => "'''Vos vs avoz dislodjî.'''
 
-Vos ploz continouwer a naivyî so {{SITENAME}} anonimmint, oudonbén [[Special:UserLogin|vos relodjî]], dizo l' minme uzeu ou dizo èn uzeu diferin.
+Vos ploz continouwer a naivyî so {{SITENAME}} anonimmint, oudonbén <span class='plainlinks'>[$1 vos relodjî]</span>, dizo l' minme uzeu ou dizo èn uzeu diferin.
 Notez ki des pådjes k' i gn a si pôrént continowuer a vey come si vos estîz elodjî, disk' a tant ki vos vudrîz l' muchete di vosse betchteu waibe.",
-'welcomecreation' => '== Bénvnowe, $1! ==
-
-Vosse conte a stî ahivé.
-Èn rovyîz nén di candjî les [[Special:Preferences|preferinces di {{SITENAME}}]] a vosse môde.',
 'yourname' => "Vosse no d' elodjaedje:",
 'yourpassword' => 'Vosse sicret',
 'yourpasswordagain' => 'Ritapez vosse sicret',
@@ -1493,10 +1488,6 @@ Si vos vloz bodjî l' pådje foû di vosse djivêye des shuvous, clitchîz so «
 
 'enotif_mailer' => 'Notifiaedje pa emile di {{SITENAME}}',
 'enotif_reset' => 'Mårker totes les pådjes come vizitêyes',
-'enotif_newpagetext' => "C' est ene nouve pådje.",
-'changed' => 'candjeye',
-'created' => 'ahivêye',
-'enotif_subject' => 'Li pådje «$PAGETITLE» so {{SITENAME}} a stî $CHANGEDORCREATED pa $PAGEEDITOR',
 'enotif_lastvisited' => 'Loukîz $1 po tos les candjmints dispoy vosse dierinne vizite.',
 'enotif_body' => 'Binamé $WATCHINGUSERNAME,
 
@@ -2361,6 +2352,10 @@ Acertinez s' i vs plait ki vos vloz vormint rifé cisse pådje ci.",
 'feedback-error2' => "Aroke : Li candjaedje n' a nén stî",
 'feedback-close' => 'Fwait',
 
+# Search suggestions
+'searchsuggest-search' => 'Cweri',
+'searchsuggest-containing' => 'ki contént...',
+
 # API errors
 'api-error-badaccess-groups' => "Vos n' avoz nén l' droet d' eberweter des fitchîs so ç' wiki cial",
 'api-error-copyuploaddisabled' => "Les eberwetaedjes pa URL ni vont nén so ç' sierveu cial.",
index 887596e..8aa3e50 100644 (file)
@@ -11,6 +11,7 @@
  * @author Harvzsf
  * @author JinJian
  * @author Kaganer
+ * @author Wiki indio
  * @author לערי ריינהארט
  */
 
@@ -78,21 +79,23 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Tugoti in pagliwat hin seksyon ha pag klik-ha-tuo dida hin mga ngaran o titulo hin seksyon (nakinahanglan hin JavaScript)',
 'tog-showtoc' => 'Igpakita in tabla hin sulod (para hin mga pakli nga sobra hin 3 ka titulo o pagngaran)',
 'tog-rememberpassword' => 'Hinumdomi an akon pan-sakob dinhi nga browser (para hin maximum nga $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
-'tog-watchcreations' => 'Igdugang in mga pakli nga akon ginhimo ngadto han akon angay timan-an',
-'tog-watchdefault' => 'Igdugang in mga pakli nga akon ginliwat ngadto han akon angay timan-an',
-'tog-watchmoves' => 'Igdugang in mga pakli nga akon ginpamalhin ngadto han akon angay timan-an',
-'tog-watchdeletion' => 'Igdugang in mga pakli nga akon ginpamara ngadto han akon angay timan-an',
+'tog-watchcreations' => 'Igdugang in mga pakli nga akon ginhimo ngan mga paypay nga akon ginkarga ngadto han akon angay timan-an',
+'tog-watchdefault' => 'Igdugang in mga pakli ngan mga paypay nga akon ginliwat ngadto han akon angay timan-an',
+'tog-watchmoves' => 'Igdugang in mga pakli nga mga paypay nga akon ginpamalhin ngadto han akon angay timan-an',
+'tog-watchdeletion' => 'Igdugang in mga pakli ngan mga paypay nga akon ginpamara ngadto han akon angay timan-an',
 'tog-minordefault' => 'Tigamni an ngatanan nga mga pagliwat nga gudti hin default',
 'tog-previewontop' => 'Igpakita in prevista o pan-ugsa-nga-lantaw ugsa hiton pagliwat nga kahon',
 'tog-previewonfirst' => 'Igpakita in prevista o pan-ugsa-nga-lantaw ha syahan nga pagliwat',
 'tog-nocache' => 'Ayaw patiroka an mga pakli nga pamiling',
-'tog-enotifwatchlistpages' => 'Ig-e-mail ako kun may nagbag-o ha pakli nga akon gintitiman-an (watchlist)',
+'tog-enotifwatchlistpages' => 'Ig-e-mail ako kun may pakli o paypay ha akon gintitiman-an nga gin-iba',
 'tog-enotifusertalkpages' => 'Ig-e-mail ako kun may nagbag-o han akon pakli-himangrawon',
-'tog-enotifminoredits' => 'Ig-e-mail liwat ako ha mga gudti nga mga pagliwat hin mga pakli',
+'tog-enotifminoredits' => 'Ig-e-mail liwat ako hin mga gudti nga mga pagliwat hin mga pakli ngan mga paypay',
 'tog-enotifrevealaddr' => 'Igpakita an akon e-mail nga adres ha mga e-mail hin pagsumat',
 'tog-shownumberswatching' => 'Igpakita an ihap han mga nangingita nga mga nagamit',
 'tog-oldsig' => 'Aada nga pirma:',
 'tog-fancysig' => 'Tratuha it pirma komo uska wikitext (nga waray automatiko nga sumpay)',
+'tog-externaleditor' => 'Gamit hin ha-gawas nga pagliwat ha default (ha mga experto la ini, nakinahanglan hin mga pinaurog nga mga seting ha imo kompyuter. [//www.mediawiki.org/wiki/Manual:External_editors More information.]  )',
+'tog-externaldiff' => 'Gamit hin ha-gawas nga diff ha default (ha mga experto la, nakinahanglan hin mga pinaurog nga mga seting ha imo kompyuter.  [//www.mediawiki.org/wiki/Manual:External_editors More information.])',
 'tog-showjumplinks' => 'Enable "jump to" accessibility links',
 'tog-uselivepreview' => 'Gamita an buhi nga pahiuna nga pagawas (nagkikinahanglan hin JavaScript) (eksperimental)',
 'tog-forceeditsummary' => 'Pasabti ako kun waray ko ginsurat ha dalikyat-nga-tigaman han pagliwat (edit summary)',
@@ -112,6 +115,9 @@ $messages = array(
 'underline-default' => 'An aada-nga-daan nga panngaykayan',
 
 # Font style option in Special:Preferences
+'editfont-style' => 'Estilo hin font ha lugar hin pagliwat',
+'editfont-default' => 'Pandalikyat nga default',
+'editfont-monospace' => 'Monospaced nga font',
 'editfont-sansserif' => 'Sans-serif nga agi',
 'editfont-serif' => 'Serif nga agi',
 
@@ -184,6 +190,7 @@ $messages = array(
 'listingcontinuesabbrev' => 'pdyn.',
 'index-category' => 'Mga nakatudlokan nga pagkli',
 'noindex-category' => 'Mga diri nakatudlokan nga pagkli',
+'broken-file-category' => 'Mga pakli nga mayda utod nga mga sumpay hin paypay',
 
 'linkprefix' => '/^(.*?)([a-zA-Z\\x80-\\xff]+)$/sD',
 
@@ -203,7 +210,6 @@ $messages = array(
 'qbbrowse' => 'Igdalikyat',
 'qbedit' => 'Igliwat',
 'qbpageoptions' => 'Ini nga pakli',
-'qbpageinfo' => 'Kontexto',
 'qbmyoptions' => 'Akon mga pakli',
 'qbspecialpages' => 'Mga pinaurog nga pakli',
 'faq' => 'AGG',
@@ -216,6 +222,7 @@ $messages = array(
 'vector-action-protect' => 'Panalipda',
 'vector-action-undelete' => 'Igbalik an ginpara',
 'vector-action-unprotect' => 'Liwani an panalipod',
+'vector-simplesearch-preference' => 'Ginpadulot an yinano nga pamiling nga kahon (Panit vector la)',
 'vector-view-create' => 'Himo-a',
 'vector-view-edit' => 'Igliwat',
 'vector-view-history' => 'Kitaa an kaagi',
@@ -285,6 +292,7 @@ Damo nga nagamit in gusto sinmulod hini nga pakli.
 Alayon paghulat makadali san-o ka inmutro pagsulod hin nga pakli utro.
 
 $1',
+'pool-timeout' => 'An pagpaundang-hin-oras in naghuhulat hin trangka',
 'pool-queuefull' => 'Puno an katitirok nga pila',
 'pool-errorunknown' => 'Waray kasabti nga kasaypanan',
 
@@ -322,6 +330,10 @@ $1',
 'youhavenewmessages' => 'Mayda ka $1 ($2).',
 'newmessageslink' => 'bag-o nga mga mensahe',
 'newmessagesdifflink' => 'kataposan nga pagbag-o',
+'youhavenewmessagesfromusers' => 'May-ada ka $1 tikang ha {{PLURAL:$3|iba nga gumaramit|$3 mga gumaramit}} ($2).',
+'youhavenewmessagesmanyusers' => 'May-ada ka $1 tikang ha damo nga mga gumaramit ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|uska bag-o nga mensahe|bag-o nga mga mensahe}}',
+'newmessagesdifflinkplural' => '$1 {{PLURAL:$1|nga pagbag-o|nga mga pagbag-o}}',
 'youhavenewmessagesmulti' => 'Mayda ka mga bag-o nga mensahe ha $1',
 'editsection' => 'igliwat',
 'editsection-brackets' => '[$1]',
@@ -339,11 +351,14 @@ $1',
 'viewdeleted' => '¿Kitaa in $1?',
 'restorelink' => '{{PLURAL:$1|usa nga ginpara nga pagliwat|$1 ka ginpara nga mga pagliwat}}',
 'feedlinks' => 'Igsulod:',
+'feed-invalid' => 'Inbalido nga pagpapaabot',
 'site-rss-feed' => '$1 RSS nga feed',
 'site-atom-feed' => '$1 Atom nga feed',
 'page-rss-feed' => '"$1" RSS nga feed',
 'page-atom-feed' => '"$1" Atom nga feed',
 'red-link-title' => '$1 (waray dida ini nga pakli)',
+'sort-descending' => 'Igpasunodsunod paubos',
+'sort-ascending' => 'Igpasunodsunod paigbaw',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Pakli',
@@ -373,9 +388,9 @@ Listahan o talaan hin puyde nga mga pinaurog nga pakli in mabibilngan ha [[Speci
 'dberrortext' => 'Mayda nahinabo nga sayop hin syntax ha database nga kwery.
 Bangin ini nagpapakita hin bug dida han softweyr.
 An kataposan nga ginsari nga database nga kweri amo in:
-<blockquote><tt>$1</tt></blockquote>
-tikang ha sakob han funsyon nga "<tt>$2</tt>".
-Nagbalik an database hin sayop nga "<tt>$3: $4</tt>".',
+<blockquote><code>$1</code></blockquote>
+tikang ha sakob han funsyon nga "<code>$2</code>".
+Nagbalik an database hin sayop nga "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'Mayda nahitabo nga sayop hin syntax ha database nga kwery.
 An kataposan nga ginsari nga kweri han database amo an:
 "$1"
@@ -392,44 +407,70 @@ Kun diri ini an kaso, bangin ka nakabiling hin bug ha software.
 Alayon la igsumat ini ha [[Special:ListUsers/sysop|administrator]], igsurat la an URL.',
 'missingarticle-rev' => '(pagbag-o#: $1)',
 'missingarticle-diff' => '(Kaibhan: $1, $2)',
+'readonly_lag' => 'Ginlugaring pagtranka han database samtang an mga nasunod nga mga database nga server naglalanat pa han agaron',
 'internalerror' => 'Sayop ha sulod',
 'internalerror_info' => 'Sayop ha sulod: $1',
 'fileappenderrorread' => "Diri nababasahan an ''$1'' han pagdugang.",
 'fileappenderror' => "Diri nadudugngan an ''$1'' ha ''$2''.",
-'filecopyerror' => "Diri nakokopya an fayl nga ''$1'' ha ''$2''.",
-'filerenameerror' => "Diri nababalyuan an ngaran han fayl nga ''$1'' ha ''$2''.",
-'filedeleteerror' => "Diri napapara an fayl nga ''$1''.",
-'fileexistserror' => "Diri nasusuratan ha fayl ''$1'': An fayl aada na.",
+'filecopyerror' => "Diri nakokopya an paypay nga ''$1'' ha ''$2''.",
+'filerenameerror' => "Diri nababalyuan an ngaran han paypay nga ''$1'' ha ''$2''.",
+'filedeleteerror' => "Diri napapara an paypay nga ''$1''.",
+'directorycreateerror' => 'Waray makahimo han direktoryo nga "$1".',
+'filenotfound' => 'Diri nabibilngan an paypay nga "$1"',
+'fileexistserror' => "Diri nasusuratan ha paypay nga ''$1'': Aada na an paypay.",
+'unexpected' => 'Diri ginlalauman nga balor: "$1"="$2".',
 'formerror' => 'Sayop: Diri nasusumite an porma.',
 'badarticleerror' => 'Ini nga pagbuhat diri mahihimo dinhi nga pakli',
 'cannotdelete' => 'An pakli o an fayl nga "$1" diri napapara.
 Bangin na ini ginpara hin iba.',
+'cannotdelete-title' => 'diri nakakapara han pakli "$1"',
+'delete-hook-aborted' => 'Pagpara ginpugngan han kawil.  Waray eksplenasyon an ginhatag.',
 'badtitle' => 'Maraot nga titulo',
 'badtitletext' => 'An ginhangyo nga pakli diri puyde, waray sulod, o sayop nga nasumpay nga inter-pinunongan o inter-wiki nga titulo.
 Bangin mayda usa o damo nga mga agi nga diri puyde magamit ha mga titulo.',
-'perfcached' => 'An nasunod nga data gin-cache ngan bangin diri amo an yana. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'An nasunod nga data gin-cache, ngan kataposan ginbag-o dida han $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'An nasunod nga data gin-cache ngan bangin diri amo an yana. In maximum hin {{PLURAL:$1|usa ka resulta|$1 ka mga resulta}} aada hit cache.',
+'perfcachedts' => 'An nasunod nga data gin-cache, ngan kataposan ginbag-o dida han $1. In maximum hin {{PLURAL:$4|usa ka resulta|$4 ka resulta}} aada hit cache.',
 'querypage-no-updates' => 'An mga kabag-ohan para hini nga pakli ha yana diri mahihimo.
 An data dini diri mahihimo nga bag-o.',
+'wrong_wfQuery_params' => 'Sayop nga mga parameter ha wfQuery()<br />
+Funsyon: $1<br />
+Kweri: $2',
 'viewsource' => 'Kitaa an ginkuhaan',
+'viewsource-title' => 'Kitaa an tinikangan para han $1',
+'actionthrottled' => 'Ginpahinay an ginbuhat',
+'actionthrottledtext' => 'Komo uska pangontra ha spam, ikaw in ginlilimitaran paghimo hini nga pagbuhat hin sobra kadamo ha sulod hin gutiay nga oras, ngan ikaw in naglapos hini nga katubtuban.
+Alayon pagutro kahuman hin pipira ka mga minuto.',
+'protectedpagetext' => 'Ini nga pakli in pinasaliporan para mapugngan an mga pagliwat.',
 'viewsourcetext' => 'Puydi ka kinmita ngan kinmopya han gintikangan han pakli:',
+'viewyourtext' => "Puydi nim makit-an ngan makopya an tinikangan han '''imo mga pagliwat''' ha dinhi nga pakli:",
+'protectedinterface' => 'Ini nga pakli in nahatag hin teksto hit interface para han software han hin nga wiki, ngan in pinasasaliporan para makalikay hit pag-abuso.
+Para makadugang o makaliwat hin mga paghubad para han tanan nga mga wiki, alayon paggamit han [//translatewiki.net/ translatewiki.net], an kanan MediaWiki proyekto hin lokalisasyon.',
+'sqlhidden' => '(nakatago an SQL query)',
 'namespaceprotected' => "Diri ka gintutugutan pagliwat han mga pakli ha ngaran-lat'ang nga '''$1'''.",
+'customcssprotected' => 'Diri ka gintutugotan pagliwat hini nga CSS nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
+'customjsprotected' => 'Diri ka gintutugotan pagliwat hini nga JavaScript nga pakli, tungod nga nagsusulod ini hin kanan iba nga tawo personal nga karuyagon.',
 'ns-specialprotected' => 'Diri maliliwat an mga ispisyal nga pakli.',
 'titleprotected' => 'Ini nga titulo pinasalipod ha paghimo ni [[User:$1|$1]].
 An katadungan nga ginhatag amo in "\'\'$2\'\'".',
+'filereadonlyerror' => 'Diri maliliwat ini nga paypay "$1" tungod an ginsusudlan han paypay nga "$2" in aada la ha pagbasa-la nga kahimtang.
+
+An magdudurmara nga nagtrangka hini in naghatag hini nga eksplenasyon: "$3".',
+'invalidtitle-knownnamespace' => 'Titulo nga inbalido nga may pan-ngaran "$2 ngan teksto nga "$3"',
+'exception-nologin' => 'Diri nakalog-in',
+'exception-nologin-text' => 'Ini nga pakli o pagbuhat in nagkikinahanglan nga ikaw in mag-log-in ha dinhi nga wiki.',
 
 # Virus scanner
+'virus-scanfailed' => 'Pakyas an pag-scan (kodigo $1)',
 'virus-unknownscanner' => 'diri-nasasabtan nga antivirus:',
 
 # Login and logout pages
-'welcomecreation' => '== ¡Uswag ngan Dayon, $1! ==
-Ginhimo an imo akawnt.
-Ayaw paghingalimot hin pagbalyo han imo [[Special:Preferences|{{SITENAME}} mga ginpipili]].',
 'yourname' => 'Agnay hit gumaramit:',
 'yourpassword' => 'Tigaman-pagsulod:',
 'yourpasswordagain' => 'Utroha pagbutang an tigaman-han-pagsakob:',
 'remembermypassword' => "Hinumdumi an akon pan-sakob dinhi nga panngaykay ''(browser)'' (para ha pinakamaiha $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
+'securelogin-stick-https' => 'Nagpapabilin nga masumpay ha HTTPS kahuman makalog-in',
 'yourdomainname' => 'Imo dominyo:',
+'password-change-forbidden' => 'Diri ka makakabalyo hin pulong-pagsulod ha dinhi nga wiki.',
 'login' => 'Sakob',
 'nav-login-createaccount' => 'Magpalista nga masakob / paghimo hin bag-o nga akawnt',
 'loginprompt' => "Kinahanglan mo hin mga kuki (''cookie'') para makapag log-in ha {{SITENAME}}.",
@@ -451,7 +492,13 @@ Ayaw paghingalimot hin pagbalyo han imo [[Special:Preferences|{{SITENAME}} mga g
 Alayon pagpili hin lain nga ngaran.',
 'loginerror' => 'Sayop hin pagsakob',
 'createaccounterror' => 'Diri makakahimo hin akawnt: $1',
+'nocookieslogin' => '{{SITENAME}} in nagkikinahanglan hin mga kuki para makapagpalog-in hin mga gumaramit.  An im mga kuki in diri nagana.
+Alayon paganaha hira ngan utro liwat.',
 'loginsuccesstitle' => 'Malinamposon an pagsulod',
+'loginsuccess' => "'''Ikaw in nakalog-in ha {{SITENAME}} komo \"\$1\".'''",
+'nosuchuser' => 'Waray gumaramit an may-ada ngaran nga "$1".
+It mga agnay-hi-gumaramit in case sensitive.
+Panginano-a it imo pagbaybay, o [[Special:UserLogin/signup|paghimo hin bag-o nga akawnt]].',
 'nosuchusershort' => 'Waray nagamit it may ngaran nga "$1".
 Kitaa kun amo it im pagbaybay.',
 'nouserspecified' => 'Dapat nim magbutang hin agnay hit gumaramit.',
@@ -462,6 +509,7 @@ Alayon pagutro pagbutang.',
 Alayon pagutro pagbutang.',
 'passwordtooshort' => 'An tigaman-pagsulod dapat diri maubos hit {{PLURAL:$1|1 nga agi|$1 nga agi}}.',
 'password-name-match' => 'An imo tigaman-pagsulod in kinahanglan iba ha imo agnay-hiton-gumaramit.',
+'password-login-forbidden' => 'An paggamit hini nga agnay-hit-gumaramit ngan tigaman-pagsulod in diri gintutugotan.',
 'mailmypassword' => 'Ig-e-mail an bag-o nga tigaman-pagsulod',
 'passwordremindertitle' => 'Bag-o nga diri-pirmihan nga tigaman-pagsulod para han {{SITENAME}}',
 'noemail' => 'Waray e-mail nga adres nga ginrekord para han nágámit "$1".',
@@ -469,10 +517,16 @@ Alayon pagutro pagbutang.',
 'mailerror' => 'Sayop han pagpadangat hin surat: $1',
 'emailauthenticated' => 'Ginpamatuod an imo e-mail adres han $2 ha $3.',
 'emailconfirmlink' => 'Igkompirma an imo e-mail address',
+'emaildisabled' => 'Ini nga sityo in diri nakakapadangat hin mga e-mail.',
 'accountcreated' => 'Nahimo an akawnt',
 'accountcreatedtext' => 'An akwant han gumaramit para kan $1 in ginhimo.',
 'createaccount-title' => 'Paghimo hin akawnt para han {{SITENAME}}',
-'loginlanguagelabel' => 'Yinaknan: $1',
+'usernamehasherror' => 'Agnay-hin-gumaramit in diri puydi magkamay-ada hin mga hash karakter',
+'login-abort-generic' => 'An imo paglog-in in diri malinamposon - Naundang',
+'loginlanguagelabel' => 'Pinulongan: $1',
+
+# E-mail sending
+'php-mail-error-unknown' => 'Waray kasabti ha kanan PHP mail() function.',
 
 # Change password dialog
 'resetpass' => 'Igliwat an tigaman-pagsulod',
@@ -480,21 +534,38 @@ Alayon pagutro pagbutang.',
 'oldpassword' => 'Daan nga tigaman-pagsulod:',
 'newpassword' => 'Bag-o nga tigaman-pagsulod:',
 'retypenew' => 'Utroha pagbutang an bag-o nga tigaman-pagsulod:',
+'resetpass_success' => 'Malinamposon nga nasalyuan na an imo tigaman-pagsulod!
+Ikaw in naglalog-in yana...',
 'resetpass_forbidden' => 'Diri mababalyoan an mga tigaman-pagsulod',
+'resetpass-no-info' => 'Kinahanglan mo paglog-in para direkta ka makasakob dinhi nga pakli.',
 'resetpass-submit-loggedin' => 'Igbal-iw an tigaman-pagsulod',
 'resetpass-submit-cancel' => 'Pasagdi',
 'resetpass-temp-password' => 'Temporaryo nga tigaman-pagsakob:',
 
 # Special:PasswordReset
+'passwordreset' => 'igreset an tigaman-hit-pagsulod',
+'passwordreset-text' => 'Kompletoha ini nga porma para makakarawat hin email hin pahinumdom han detalye han akawnt.',
+'passwordreset-legend' => 'igreset an tigaman-hit-pagsulod',
 'passwordreset-username' => 'Agnay hiton gumaramit:',
 'passwordreset-domain' => 'Dominyo:',
+'passwordreset-capture' => 'Kikitaon mo an resulta nga e-mail?',
 'passwordreset-email' => 'E-mail adres:',
 'passwordreset-emailtitle' => 'Mga detalye han akawnt ha {{SITENAME}}',
 'passwordreset-emailelement' => 'Agnay han gumaramit: $1
 Temporaryo nga tigaman han pagsakob: $2',
 'passwordreset-emailsent' => 'Ginpadara hin usa ka pahinumdom nga e-mail.',
+'passwordreset-emailsent-capture' => 'Mayda pahinumdom nga ginpadangat ha im e-mail, kun diin ini in ginpapakita ha ubos.',
+'passwordreset-emailerror-capture' => 'Mayda pahinumdom nga e-mail han nahimo, kun diin ini in ginpapakita ha ubos, pero pakyas an pagpadangat ngada ha gumaramit: $1',
 
 # Special:ChangeEmail
+'changeemail' => 'Igliwan an e-mail address',
+'changeemail-header' => 'Igliwan an e-mail address akawnt',
+'changeemail-text' => 'Igkompleto ini nga porma para makapagliwan han imo e-mail address.  Kinahanglanon mo igbutang an imo tigaman-pagsulod para makompirma ini nga pagbag-o.',
+'changeemail-no-info' => 'Kinahanglanon mo mag-log-in para ka direkta makasakob hini nga pakli.',
+'changeemail-oldemail' => 'Yana nga e-mail address:',
+'changeemail-newemail' => 'Bag-o nga e-mail address:',
+'changeemail-none' => '(waray)',
+'changeemail-submit' => 'Igbalyo an e-mail',
 'changeemail-cancel' => 'Pasagdi',
 
 # Edit page toolbar
@@ -510,8 +581,8 @@ Temporaryo nga tigaman han pagsakob: $2',
 'headline_tip' => 'Katupngan 2 nga katukiban',
 'nowiki_sample' => 'Igsuksok an diri-nakaayos nga mga teksto dinhi',
 'nowiki_tip' => 'Pabay-i la an pagfoformat nga wiki',
-'image_tip' => 'Nakatampo nga fayl',
-'media_tip' => 'sumpay han fayl',
+'image_tip' => 'Nakatampo nga paypay',
+'media_tip' => 'sumpay han paypay',
 'sig_tip' => 'Imo pirma nga may-ada marka hin oras',
 'hr_tip' => 'Patumba nga bagis (hinay-hinay la it paggamit)',
 
@@ -527,6 +598,7 @@ Temporaryo nga tigaman han pagsakob: $2',
 'showdiff' => 'Igpakita an mga ginliwat',
 'anoneditwarning' => "'''Pahimatngon:''' Diri ka pa naka log-in.
 An imo IP address in maitatala ha kaagi hinin pakli han pagliwat.",
+'anonpreviewwarning' => "''Diri ka naka-log in.  Mahisusurat an imo IP address ngada ha kanan pakli kaagi hit pagliwat kun igtipig nimo.''",
 'missingsummary' => "'''Pahinumdom:''' Waray ka nagbutang hin dalikyat nga sumat han pagliwat.
 Kun pidliton mo an \"{{int:savearticle}}\" utro, an imo ginliwat in matitipig bisan waray hini.",
 'missingcommenttext' => 'Alayon pagbutang hin komento ha ilarom.',
@@ -536,6 +608,8 @@ Kun pidliton mo an \"{{int:savearticle}}\" utro, an imo ginliwat in matitipig bi
 'blockednoreason' => 'waray katadungan nga ginhatag',
 'whitelistedittext' => 'Kinahanglan mo mag-$1 para makaliwat han mga pakli.',
 'nosuchsectiontitle' => 'Waray kaagi-i an bahin',
+'nosuchsectiontext' => 'Imo ginliwat an seksyon nga waray dida.
+Ini in puydi binmalhin o napara samtang ikaw in nagkikita han pakli.',
 'loginreqtitle' => 'Nagkikinahanglan hin pan-sakob',
 'loginreqlink' => 'Magpasabot nga masakob',
 'loginreqpagetext' => 'Kinahanglan mo mag-$1 para makakita ha iba nga mga pakli.',
@@ -554,6 +628,7 @@ o <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}}
 'note' => "'''Pahibaro:'''",
 'previewnote' => "'''Hinumdumi nga pahiuna-nga-paggawas pa la ini.'''
 ¡Waray pa katipig an imo mga ginbag-o!",
+'continue-editing' => 'Padayon pagliwat',
 'editing' => 'Ginliliwat an $1',
 'creating' => 'Ginhihimo an $1',
 'editingsection' => 'Ginliliwat an $1 (bahin)',
@@ -569,7 +644,10 @@ Nasaad ka liwat nga imo ini kalugaringon nga ginsurat, o ginkopya nimo ini tikan
 'template-protected' => '(pinaliporan)',
 'template-semiprotected' => '(katunga nga pinasaliporan)',
 'hiddencategories' => 'Ini nga pakli in api han {{PLURAL:$1|1 nakatago nga kaarangay|$1 nakatago nga kaarangay}}:',
+'nocreatetitle' => 'Limitado an pahimo hin pakli',
 'nocreate-loggedin' => 'Diri ka gintutugotan paghimo hin mga bag-o nga pakli.',
+'sectioneditnotsupported-title' => 'Diri suportado han pagliwat han seksyon',
+'sectioneditnotsupported-text' => 'Diri suportado an pagliwat han seksyon ha dinhi nga pakli.',
 'permissionserrors' => 'Mga sayop hin mga pagtugot',
 'permissionserrorstext' => 'Diri ka gintutugotan pagbuhat hito, mahitungod han mga nasunod nga {{PLURAL:$1|katadungan|mga katadungan}}:',
 'permissionserrorstext-withaction' => 'Waray ka permiso han $2, tungod han masunod nga {{PLURAL:$1|rason|mga rason}}:',
@@ -584,6 +662,14 @@ An taramdan han pagpara ngan pagbalhin para han pakli in ginhahatag ha ubos para
 'edit-no-change' => 'Ginpabay-an an im pagliwat, mahitungod nga waray pagbalyo nga nabuhat ha nakasurat.',
 'edit-already-exists' => 'Diri nakakahimo hin bag-o nga pakli.
 Aada na ito.',
+'defaultmessagetext' => 'Aada-nga-daan nga teksto han mensahe',
+'content-not-allowed-here' => 'An sulod nga "$1" in diri gintutugotan ha pakli nga [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'wikiteksto',
+'content-model-text' => 'yano nga teksto',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'post-expand-template-inclusion-warning' => "'''Pahimatngon:''' An batakan nga ginlakip in sobra kadako.
@@ -598,6 +684,7 @@ Ini nga mga argumento in ginlaktawan.",
 
 # History pages
 'viewpagelogs' => 'Kitaa an mga log para hini nga pakli',
+'nohistory' => 'Waray kaagi hin pagliwat hin nga pakli.',
 'currentrev' => 'Giurhii nga pagliwat',
 'currentrev-asof' => 'Giuurhii nga pagliwat han $1',
 'revisionasof' => 'Pagbabag-o han $1',
@@ -616,6 +703,7 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'history-show-deleted' => 'Ginpara la',
 'histfirst' => 'Giunhani',
 'histlast' => 'Giurhii',
+'historysize' => '({{PLURAL:$1|1 nga byte|$1 ka mga byte}})',
 'historyempty' => '(waray sulod)',
 
 # Revision feed
@@ -624,11 +712,21 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'history-feed-item-nocomment' => '$1 ha $2',
 
 # Revision deletion
+'rev-deleted-comment' => '(gintanggal an kaagi han dalikyat nga sumat)',
 'rev-deleted-user' => '(gintanggal an agnay hiton gumaramit)',
+'rev-deleted-event' => '(gintanggal an talaan han mga buhat)',
+'rev-deleted-user-contribs' => '[gintanggal an agnay-hit-gumaramit o IP address - an pagliwat in gintago tikang han mga amot]',
+'rev-suppressed-no-diff' => "Diri mo makikita ini nga kaibhan tungod nga usa ha mga rebisyon in '''ginpara'''.",
 'rev-delundel' => 'igpakita/igtago',
 'rev-showdeleted' => 'igpakita',
+'revisiondelete' => 'Pagpara/pagtanggal han pagpara nga mga rebisyon',
+'revdelete-nologtype-title' => 'Waray ginhatag nga klase hit talaan',
 'revdelete-show-file-confirm' => 'Sigurado ka nga gusto mo makita an ginpara nga pagliwat han file "<nowiki>$1</nowiki>" tikang $2 ha $3?',
 'revdelete-show-file-submit' => 'Oo',
+'revdelete-hide-text' => 'Tagoon an rebisyon han teksto',
+'revdelete-hide-image' => 'Tagoon an sulod han paypay',
+'revdelete-hide-name' => 'Tagoon an buhat ngan kakadtoan',
+'revdelete-hide-comment' => 'Tagoon an dalikyat nga sumat han pagliwat',
 'revdelete-radio-same' => '(ayaw balyu-e)',
 'revdelete-radio-set' => 'Oo',
 'revdelete-radio-unset' => 'Ayaw',
@@ -636,6 +734,12 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'revdel-restore' => 'igliwat an nakikit-an',
 'revdel-restore-deleted' => 'napara nga mga pagbag-o',
 'revdel-restore-visible' => 'Mga nakikit-an nga pagbabag-o',
+'pagehist' => 'Kaagi han pakli',
+'deletedhist' => 'Ginpara nga kaagi',
+'revdelete-hide-current' => 'Sayop in natago ha butang nga may petsa $2, $1: Ini an yana nga rebisyon.
+Diri ini matatago.',
+'revdelete-show-no-access' => 'May-ada sayo nga nagpapakita ha butang nga may petsa $2, $1.  Ini nga butang in nakamarka nga "diri malalabtan".
+Diri mo ini malalabtan.',
 'revdelete-otherreason' => 'Lain/dugang nga katadungan:',
 'revdelete-reasonotherlist' => 'Lain nga katadongan',
 'revdelete-edit-reasonlist' => 'Igliwat an mga katadungan han pagpara',
@@ -645,16 +749,21 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'mergehistory' => 'Igtampo an mga kasaysayan han pakli',
 'mergehistory-from' => 'Ginkuhaan nga pakli:',
 'mergehistory-into' => 'Kakadtoan nga pakli:',
+'mergehistory-submit' => 'Igtampo an mga rebisyon',
+'mergehistory-empty' => 'Waray mga rebisyon in puydi matampo.',
 'mergehistory-no-source' => 'Waray pa an tinikangan nga pakli nga $1.',
 'mergehistory-no-destination' => 'Waray pa an kakadtuan nga pakli nga $1.',
+'mergehistory-comment' => 'Gintampo an [[:$1]] ngada ha [[:$2]]: $3',
 'mergehistory-same-destination' => 'An gintikangan ngan kakadtoan nga mga pakli in diri puydi magkaparo',
 'mergehistory-reason' => 'Katadungan:',
 
 # Merge log
+'mergelog' => 'Talaan hin pagtampo',
 'revertmerge' => 'Igbulag an gintampo',
 
 # Diffs
 'history-title' => "Kaagi han pagbag-o han ''$1''",
+'difference-multipage' => '(Kaibhan ha butnga han mga pakli)',
 'lineno' => 'Bagis $1:',
 'compareselectedversions' => 'Igkumpara an mga pinili nga pagbabag-o',
 'editundo' => 'Igpawara an ginbuhat',
@@ -663,6 +772,8 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 # Search results
 'searchresults' => 'Mga nabilingan han pagbiling',
 'searchresults-title' => 'Mga nabilngan han pagbiling para han "$1"',
+'searchsubtitleinvalid' => "Imo ginpamiling an '''$1'''",
+'toomanymatches' => 'Sobra kadamo nga mga igo an ginbalik, alayon pagbuhat hin iba nga pakiana',
 'prevn' => 'naha-una nga {{PLURAL:$1|$1}}',
 'nextn' => 'sunod nga {{PLURAL:$1|$1}}',
 'prevn-title' => 'Nahiuna $1 {{PLURAL:$1|resulta|mga resulta}}',
@@ -690,20 +801,27 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'search-suggest' => 'Buot sidngon mo ba: $1',
 'search-interwiki-caption' => 'Mga bugto nga proyekto',
 'search-interwiki-default' => '$1 nga resulta:',
-'search-mwsuggest-enabled' => 'upod hin mga suhestyon',
-'search-mwsuggest-disabled' => 'waray mga suhestyon',
+'search-interwiki-more' => '(damo pa)',
+'search-relatedarticle' => 'kasumapy',
 'searchrelated' => 'kadugtong',
 'searchall' => 'ngatanan',
 'showingresultsheader' => "{{PLURAL:$5|Resulta '''$1''' han '''$3'''|Mga resulta '''$1 - $2''' han '''$3'''}} para ha '''$4'''",
 'search-nonefound' => 'Waray resulta an nakakabaton han pakiana.',
 'powersearch' => 'Abansado nga pagbiling',
 'powersearch-legend' => 'Abansado nga pagbiling',
+'powersearch-ns' => "Pamiling ha mga ngaran-lat'ang:",
+'powersearch-redir' => 'Talaan hin mga redirect',
 'powersearch-field' => 'Bilnga an',
+'powersearch-togglelabel' => 'Panginano-a:',
 'powersearch-toggleall' => 'Ngatanan',
 'powersearch-togglenone' => 'Waray',
 'search-external' => 'Gawas nga pamiling',
+'searchdisabled' => '{{SITENAME}} nga pamiling in ginparong.
+Pamilnga la anay pinaagi ha Google ha pagkayana.
+Ginpapasabot nga an sulod han mga panudlok han {{SITENAME}} in bangin daan an.',
 
 # Quickbar
+'qbsettings' => 'Quickbar',
 'qbsettings-none' => 'Waray',
 'qbsettings-fixedleft' => 'Ginayad an wala',
 'qbsettings-fixedright' => 'Gin-ayad an to-o',
@@ -714,23 +832,39 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'preferences' => 'Mga karuyag',
 'mypreferences' => 'Akon mga karuyag',
 'prefs-edits' => 'Ihap han mga pagliwat:',
+'prefsnologin' => 'Diri nakalog-in',
 'changepassword' => 'Igliwan an tigaman-pagsulod',
 'prefs-skin' => 'Panit',
 'skin-preview' => 'Pahiuna nga pagawas',
 'datedefault' => 'Waray pinaurog nga karuyag',
 'prefs-datetime' => 'Pitsa ngan oras',
+'prefs-user-pages' => 'Mga pakli hin gumaramit',
 'prefs-personal' => 'Pangilal-an han nagamit',
 'prefs-rc' => 'Kalalabay la nga mga pagbabag-o',
 'prefs-watchlist-days' => 'Mga adlaw nga makikita ha barantayan:',
+'prefs-watchlist-days-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
+'prefs-watchlist-edits-max' => 'Pinakadako nga ihap: 1000',
 'prefs-resetpass' => 'Igliwan an tigaman-pagsulod',
+'prefs-changeemail' => 'Igliwan an e-mail address',
+'prefs-email' => 'Mga pagpipilian han e-mail',
+'prefs-rendering' => 'Hitsura',
+'saveprefs' => 'Igtipig',
+'resetprefs' => 'Pabay-i an diri nakatipig nga mga pagbabag-o',
+'restoreprefs' => 'Igbalik ngatanan ngada ha kahimtang nga aada-nga-daan',
 'prefs-editing' => 'Ginliliwat',
+'prefs-edit-boxsize' => 'Kadako han bintana han pagliwat.',
 'rows' => 'Mga rumbay pahigda:',
 'columns' => 'Mga rumbay patindog:',
 'searchresultshead' => 'Bilnga',
 'resultsperpage' => 'Mga igo kada pakli:',
+'stub-threshold-disabled' => 'Waray ginpagana',
+'recentchangesdays-max' => 'Pinakadamo $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
 'savedprefs' => 'Gintipig an im karuyag.',
 'timezonelegend' => 'Zona hin oras',
 'localtime' => 'Oras nga lokal',
+'timezoneuseserverdefault' => 'Gamita an aada-nga-daan han wiki ($1)',
+'servertime' => 'Oras han serbidor:',
+'guesstimezone' => 'Butanga tikang han panngaykay(browser)',
 'timezoneregion-africa' => 'Aprika',
 'timezoneregion-america' => 'Amerika',
 'timezoneregion-antarctica' => 'Antarktika',
@@ -741,16 +875,22 @@ Leyenda: '''({{int:cur}})''' = kaibhan ha giuurhii nga pag-bag-o, '''({{int:last
 'timezoneregion-europe' => 'Europa',
 'timezoneregion-indian' => 'Kalawdan Indyana',
 'timezoneregion-pacific' => 'Kalawdan Pasipiko',
-'prefs-searchoptions' => 'Mga pagpipilian han pamiling',
+'prefs-searchoptions' => 'Pamilnga',
 'prefs-namespaces' => "Ngaran-lat'ang",
+'default' => 'aada-nga-daan',
+'prefs-files' => 'Mga paypay',
 'youremail' => 'E-mail:',
 'username' => 'Agnay hiton gumaramit:',
 'uid' => 'ID han gumaramit:',
+'prefs-memberingroups' => 'Api han {{PLURAL:$1| nga hugpo|nga mga hugpo}}:',
+'prefs-registration' => 'Oras han pagrehistro:',
 'yourrealname' => 'Tinuod nga ngaran:',
 'yourlanguage' => 'Yinaknan:',
 'yournick' => 'Bag-o nga pirma:',
 'badsiglength' => 'Hilaba hin duro it im pirma.
 Dapat diri malabaw ha $1 {{PLURAL:$1|agi|mga agi}} nga kahilaba.',
+'yourgender' => 'Henero:',
+'gender-unknown' => 'Waray ginpasabot',
 'gender-male' => 'Lalaki',
 'gender-female' => 'Babaye',
 'email' => 'E-mail',
@@ -759,16 +899,42 @@ Dapat diri malabaw ha $1 {{PLURAL:$1|agi|mga agi}} nga kahilaba.',
 An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makontak ha imo.',
 'prefs-help-email-required' => 'Kinahanglanon it e-mail address.',
 'prefs-info' => 'Panguna nga pananabotan',
+'prefs-i18n' => 'Internasyonalisasyon',
 'prefs-signature' => 'Pirma',
+'prefs-dateformat' => 'Batakan han petsa',
+'prefs-advancedediting' => 'Abansado nga mga pagpipilian',
+'prefs-advancedrc' => 'Abansado nga mga pagpipilian',
+'prefs-advancedrendering' => 'Abansado nga mga pagpipilian',
+'prefs-advancedsearchoptions' => 'Abansado nga mga pagpipilian',
+'prefs-advancedwatchlist' => 'Abansado nga mga pagpipilian',
+'prefs-displayrc' => 'Mga pirilion hiunong han ginpapakita',
+'prefs-displaysearchoptions' => 'Mga pirilion hiunong han ginpapakita',
+'prefs-displaywatchlist' => 'Mga pirilion hiunong han ginpapakita',
 'prefs-diffs' => 'Mga kaibhan',
 
+# User preference: e-mail validation using jQuery
+'email-address-validity-valid' => 'E-mail address in baga puydi',
+
 # User rights
+'userrights' => 'Pagdudumara hin mga katungod han gumaramit',
+'userrights-lookup-user' => 'Pagdumaraa han mga hugpo han gumaramit',
+'userrights-user-editname' => 'Igbutang an agnay han gumaramit:',
+'editusergroup' => 'Igliwat han mga hugpo han gumaramit',
+'editinguser' => "Igliliwat an mga katungod han gumaramit han gumaramit '''[[User:$1|$1]]''' $2",
+'userrights-editusergroup' => 'Igliwat an mga hugpo hin gumaramit',
+'saveusergroups' => 'Igtipig an mga hugpo han gumaramit',
 'userrights-groupsmember' => 'Api han:',
 'userrights-reason' => 'Katadungan:',
+'userrights-no-interwiki' => '
+Diri ka gintutugotan pagliwat han mga katungod han gumaramit ha iba nga mga wiki.',
+'userrights-nodatabase' => 'Waray kaaagii an Database $1 o diri ini aada ha lokal.',
+'userrights-changeable-col' => 'Mga hugpo nga puydi mo labtan',
+'userrights-unchangeable-col' => 'Mga hugpo nga diri mo puydi labtan',
 
 # Groups
 'group' => 'Hugpo:',
 'group-user' => 'Mga gumaramit',
+'group-autoconfirmed' => 'Mga gumaramit nga lugaring nakokonpirma',
 'group-bot' => 'Mga bot',
 'group-sysop' => 'Mga magdudumara',
 'group-bureaucrat' => 'Mga burokrata',
@@ -778,9 +944,12 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'group-user-member' => '{{HENERO:$1|gumaramit}}',
 'group-bot-member' => 'bot',
 'group-sysop-member' => 'magdudumara',
+'group-bureaucrat-member' => '{{GENDER:$1|burokrata}}',
 
 'grouppage-user' => '{{ns:project}}:Mga gumaramit',
+'grouppage-bot' => '{{ns:project}}:Mga bot',
 'grouppage-sysop' => '{{ns:project}}:Mga magdudumara',
+'grouppage-bureaucrat' => '{{ns:project}}:Mga burokrata',
 'grouppage-suppress' => '{{ns:project}}:Nanginginano',
 
 # Rights
@@ -788,23 +957,66 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'right-edit' => 'Igliwat an mga pakli',
 'right-createpage' => 'Paghimo hin mga pakli (nga diri an mga hiruhimangraw nga mga pakli)',
 'right-createtalk' => 'Paghimo hin hiruhimangraw nga mga pakli',
+'right-createaccount' => 'Paghimo hin bag-o nga mga akawnt hin gumaramit',
 'right-minoredit' => 'Igmarka an mga ginliwat komo gutiay la',
 'right-move' => 'Igbalhin an mga pakli',
+'right-move-subpages' => 'Igbalhin an pakli lakip an ira mga bahinpakli',
+'right-move-rootuserpages' => 'Igbalhin an gamot nga mga pakli han gumaramit',
 'right-movefile' => 'Balhina an mga paypay',
+'right-upload' => 'Igkarga paigbaw an mga paypay',
+'right-reupload' => 'Sapawa an mga aada nga mga paypay',
+'right-upload_by_url' => 'Igkarga paigbaw an mga paypay tikang ha uska URL',
+'right-bot' => 'Igtrato komo uska naglulugaring nga proseso',
 'right-delete' => 'Igpara an mga pakli',
+'right-bigdelete' => 'Igpara an mga pakli nga may-ada dagko nga mga kaagi',
+'right-browsearchive' => 'Pamiling hin mga ginpara nga mga pakli',
 'right-undelete' => 'Igpawara an pagpara han pakli',
+'right-suppressionlog' => 'Kitaa an mga pribado nga mga talaan',
+'right-block' => 'Pugnga an iba nga mga gumaramit ha pagliwat',
+'right-blockemail' => 'Pugnga an uska gumaramit tikang ha pagpadangat hin e-mail',
+'right-hideuser' => 'Pugnga an uska agnay-hin-gumaramit, tago-a ito tikang ha publiko',
+'right-unblockself' => 'Lugaring nga makakatanggal han pagpugong',
+'right-editusercssjs' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS ngan JavaScript',
+'right-editusercss' => 'Igliwat an kanan iba mga gumaramit nga mga paypay han CSS',
+'right-edituserjs' => 'Iliwat an kanan iba mga gumaramit nga paypay han JavaScript',
+'right-import' => 'Man-aangbit hin mga pakli tikang ha iba nga mga wiki',
+'right-importupload' => 'Man-aangbit hin mga pakli tikang ha uska paypay nga iginkarga-pasaka',
+'right-mergehistory' => 'Igtampo an kaagi han mga pakli',
+'right-userrights' => 'Igliwat an ngatanan nga mga katungod han gumaramit',
+'right-userrights-interwiki' => 'Igliwat an mga katungod han gumaramit han mga gumaramit ha iba nga mga wiki',
+'right-sendemail' => 'Padad-i hin e-mail ngada ha iba nga mga gumaramit',
 
 # User rights log
+'rightslog' => 'Talaan hin mga katungod han gumaramit',
 'rightsnone' => '(waray)',
 
 # Associated actions - in the sentence "You do not have permission to X"
 'action-read' => 'basaha ini nga pakli',
 'action-edit' => 'liwata ini nga pakli',
 'action-createpage' => 'pahimo hin mga pakli',
+'action-createtalk' => 'Paghimo hin hiruhimangraw nga mga pakli',
+'action-createaccount' => 'Himoa ini nga akawnt hin gumaramit',
 'action-minoredit' => 'butanga hin tigaman hinin nga pagliwat komo gutiay',
 'action-move' => 'balhina ini nga pakli',
+'action-move-subpages' => 'igbalhin ini nga pakli, ngan iya mga bahin-pakli',
+'action-move-rootuserpages' => 'Igbalhin an gamot nga mga pakli han gumaramit',
+'action-movefile' => 'igbalhin ini nga paypay',
+'action-upload' => 'igkarga-pasaka ini nga paypay',
+'action-reupload' => 'igsapaw ini nga aanhi nga paypay',
+'action-upload_by_url' => 'igkaraga-pasaka ini nga paypay tikang ha uska URL',
 'action-delete' => 'paraa ini nga pakli',
 'action-deleterevision' => 'igpara ini nga pagbag-o',
+'action-deletedhistory' => 'kitaa an kanan hini nga pakli kaagi han mga ginpara',
+'action-browsearchive' => 'Pamiling hin mga ginpara nga mga pakli',
+'action-undelete' => 'Balika an ginpara hini nga pakli',
+'action-suppressionlog' => 'kitaa an kanan hini pribado nga talaan',
+'action-block' => 'Pugnga ini nga gumaramit ha pagliwat',
+'action-protect' => 'igsaliwan an katupngan han pananalipod para hini nga pakli',
+'action-import' => 'ig-angbit ini nga pakli tikang ha iba nga wiki',
+'action-importupload' => 'ig-angbit ini nga pakli tikang ha uska ginkarga-pasaka nga paypay',
+'action-mergehistory' => 'Igtampo an kaagi hini nga pakli',
+'action-userrights' => 'Igliwat an ngatanan nga mga katungod han gumaramit',
+'action-sendemail' => 'Padara hin mga e-mail',
 
 # Recent changes
 'nchanges' => '$1 {{PLURAL:$1|pagbag-o|mga pagbabag-o}}',
@@ -834,8 +1046,10 @@ An imo e-mail address in diri makikit-an kun an iba nga mga gumaramit in makonta
 'newpageletter' => 'B',
 'boteditletter' => 'b',
 'rc_categories_any' => 'Bisan ano nga',
+'newsectionsummary' => '/* $1 */ bag-o nga bahin',
 'rc-enhanced-expand' => 'Igpakita an detalye (nagkikinahanglan hin JavaScript)',
 'rc-enhanced-hide' => 'Igtago an mga detalye',
+'rc-old-title' => 'orihinal nga ginhimo komo "$1"',
 
 # Recent changes linked
 'recentchangeslinked' => 'Mga may kalabotan nga binag-o',
@@ -851,9 +1065,15 @@ Mga pakli ha [[Special:Watchlist|imo angay timan-an]] in naka-'''bold'''.",
 # Upload
 'upload' => 'Pagkarga hin file',
 'uploadbtn' => 'Igkarga an file',
+'reuploaddesc' => 'Undanga an pagkarga-pasaka ngan balik ngadto ha porma han pagkarga-pasaka',
+'uploadnologin' => 'Diri nakalog-in',
+'uploaderror' => 'Sayop hit pagkarga-pasaka',
 'upload-recreate-warning' => "'''Pahimatngon:  An fayl nga may-ada hiton nga ngaran in ginpara o ginbalhin.'''
 
 An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para han imo kamurayaw:",
+'upload-permitted' => 'Gintutugotan nga mga klase han paypay: $1.',
+'upload-prohibited' => 'Gindidire nga mga klase han paypay: $1.',
+'uploadlog' => 'Talaan hin ginkarga-pasaka',
 'uploadlogpage' => 'Talaan han mga ginkarga-paigbaw',
 'filename' => 'Ngaran han fayl',
 'filedesc' => 'Dalikyat nga pulong',
@@ -861,25 +1081,78 @@ An taramdan han pagpara ngan pagbalhin para hini nga pakli in ginhahatag para ha
 'filereuploadsummary' => 'Mga pagbal-iw ha fayl:',
 'filesource' => 'Tinikangan:',
 'ignorewarning' => 'Pabay-i an pahimatngon ngan igtipig la ngahaw',
+'ignorewarnings' => 'Pasagdi an bisan ano nga mga pahimatngon',
+'filename-toolong' => 'Iton ngaran hin paypay in diri puyde na mas lapos pa ha 240 ka mga byte.',
+'badfilename' => 'An ngaran-han-paypay in ginliwat ngada ha "$1".',
 'filename-tooshort' => 'An ngaran han fayl in halipot hin duro.',
+'filetype-banned' => 'Ini nga klase nga paypay in gindidire.',
 'illegal-filename' => 'An ngaran han fayl in diri gintutugutan.',
 'unknown-error' => 'Nahitabo an waray kasasabti nga sayop.',
+'tmp-create-error' => 'Diri makakahimo hin temporaryo nga paypay.',
+'tmp-write-error' => 'Sayop ha pagsurat hin temporaryo nga paypay.',
+'large-file' => 'Ginrerekomenda nga it mga paypay in diri malapos hin $1;
+ini nga paypay in $2.',
+'largefileserver' => 'Ini nga paypay in durudako kaysa ha ginpapakarawat han serbidor.',
 'uploadwarning' => 'Pahimatngon han pagkarga paigbaw',
+'savefile' => 'Igtipig an paypay',
 'uploadedimage' => 'ginkarga-paigbaw "[[$1]]"',
+'overwroteimage' => 'Ginkaraga an bag-o nga bersyon han "[[$1]]"',
+'uploaddisabled' => 'Waray ginpagana an pagkarga paigbaw',
+'copyuploaddisabled' => 'An pagkarga paigbaw pinaagi hin URL in waray ginpagana',
+'uploadfromurl-queued' => 'An imo ginkarga-paigbaw hin nakapila.',
+'uploaddisabledtext' => 'An mga pagkarga-paigbaw in diri ginpapagana.',
+'php-uploaddisabledtext' => 'An mga pagkarga-paigbaw han paypay in diri ginpapagana ha PHP.
+Alayon panginanoi an kahimtang han file_uploads.',
+'uploadscripted' => 'Ini nga paypay in nagsusulod hin HTML o script code nga puydi masayopan paghubad an web browser.',
 'uploadvirus' => 'Ini nga fayl may-ada sulod nga bayrus!
 Mga detalye: $1',
 'upload-source' => 'Tinikangan nga fayl',
 'sourcefilename' => 'Tinikangan nga ngaran han fayl:',
+'sourceurl' => 'Tinikangan nga URL:',
+'destfilename' => 'Kakadtoan nga ngaran-hin-paypay:',
+'upload-maxfilesize' => 'Pinakadamo nga kadako han paypay: $1',
+'upload-description' => 'Pangilal-an han paypay',
+'upload-options' => 'Mga pirilion han pagkarga paigbaw',
+'watchthisupload' => 'Bantayi ini nga paypay',
+'upload-success-subj' => 'Malinamposan an imo pagkarga-paigbaw.',
+'upload-success-msg' => 'An imo pagkarga-paigbaw tikang ha [$2] in malinamposon.  Ini in aada dinhi: [[:{{ns:file}}:$1]]',
+'upload-failure-subj' => 'May-ada problema an pagkarga-paigbaw',
+'upload-failure-msg' => 'May-ada problema an imo pagkarga-paigbaw tikang ha [$2]:
+
+$1',
 'upload-warning-subj' => 'Pahimatngon han pagkarga paigbaw',
 
+'upload-proto-error' => 'Sayop nga protocol',
+'upload-file-error' => 'Sayop ha sulod',
 'upload-unknown-size' => 'Waray kasabti an kadako',
+'upload-http-error' => 'Mayda nahitabo nga sayop hin HTTP: $1',
+
+# File backend
+'backend-fail-notexists' => 'Waray ngada an paypay nga $1.',
+'backend-fail-delete' => 'Diri nakakapara han paypay nga "$1".',
+'backend-fail-alreadyexists' => 'May-ada na paypay nga "$1".',
+'backend-fail-store' => 'Diri nakakatipig han paypay "$1" ha "$2".',
+'backend-fail-copy' => 'Diri nakakakopya han paypay nga "$1" ngada "$2".',
+'backend-fail-move' => 'Diri nakakabalhin han paypay "$1" ngada "$2".',
+'backend-fail-opentemp' => 'Diri nakakaabre han temporaryo nga paypay.',
+'backend-fail-writetemp' => 'Diri nakakasurat ngada ha temporaryo nga paypay.',
+'backend-fail-closetemp' => 'Diri nasasara an temporaryo nga paypay.',
+'backend-fail-read' => 'Diri nababasahan han paypay nga "$1".',
+'backend-fail-create' => 'Diri nasusuratan an paypay nga "$1".',
+'backend-fail-maxsize' => 'Diri nasusuratan an paypay nga "$1" tungod nga mas dako ini kaysa hin {{PLURAL:"$2|usa nga byte|$2 nga mga byte}}.',
+'backend-fail-readonly' => 'An panluyo nga tiripigan nga "$1" in ha pagkayana in panbasa-la.  An rason nga ginhatag in: "\'\'$2\'\'"',
 
 # img_auth script messages
 'img-auth-accessdenied' => 'Diri gintutugutan makasulod',
+'img-auth-nofile' => 'Waray ngada an paypay nga "$1".',
 
 # HTTP errors
 'http-host-unreachable' => 'Diri nakakaabot ha URL.',
 
+# Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
+'upload-curl-error6' => 'Diri nakakaabot ha URL',
+'upload-curl-error28' => 'Linmapos ha oras an pagkarga-pasaka',
+
 'license' => 'Palilisensya:',
 'license-header' => 'Palilisensya:',
 'nolicense' => 'Waray napili',
@@ -917,7 +1190,9 @@ Mga detalye: $1',
 Alayon pagkita han [$2 nga pakli hin pagpahayag mahitungod hini nga fayl] para hin dugang nga kasayuran.',
 'sharedupload-desc-here' => 'An fayl in tikang ha $1 ngan puydi mahigamitan para han iba nga mga proyekto.
 An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakita ha sirong.',
+'uploadnewversion-linktext' => 'Igkarga-pasaka an ba-o nga bersyon hini nga paypay',
 'shared-repo-from' => 'tikang $1',
+'upload-disallowed-here' => 'Diri nimo masasapaw ini nga paypay.',
 
 # File reversion
 'filerevert-comment' => 'Rason:',
@@ -930,11 +1205,19 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'filedelete-success' => "Napara an '''$1'''",
 'filedelete-otherreason' => 'Lain/dugang nga katadungan:',
 'filedelete-reason-otherlist' => 'Lain nga katadungan',
+'filedelete-edit-reasonlist' => 'Igliwat an mga rason han pagpara',
+'filedelete-maintenance-title' => 'Diri nakakapara han paypay',
 
 # MIME search
+'mimesearch' => 'MIME nga pamiling',
+'mimetype' => 'MIME nga klase:',
 'download' => 'pagkarga paubos',
 
+# List redirects
+'listredirects' => 'Talaan hin mga redirect',
+
 # Unused templates
+'unusedtemplates' => 'Waray kagamiti nga mga batakan',
 'unusedtemplateswlh' => 'iba nga mga sumpay',
 
 # Random page
@@ -963,11 +1246,15 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'disambiguations' => 'Mga pakli nga nasumpay ha mga pansayod nga pakli',
 'disambiguationspage' => 'Template:pansayod',
 
+'brokenredirects' => 'Mga redirect nga utod',
 'brokenredirects-edit' => 'igliwat',
 'brokenredirects-delete' => 'paraa',
 
+'withoutinterwiki' => 'Mga pakli nga waray sumpay nga yinaknan',
 'withoutinterwiki-submit' => 'Igpakita',
 
+'fewestrevisions' => 'Mga pakli nga may pinakagutiay nga mga rebisyon',
+
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|nga byte|nga mga byte}}',
 'ncategories' => '$1 {{PLURAL:$1|nga kaarangay|nga mga kaarangay}}',
@@ -993,7 +1280,11 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'prefixindex' => 'Ngatanan nga pakli nga may-ada pahiuna-nga-sumpay',
 'shortpages' => 'Haglipot nga mga pakli',
 'longpages' => 'Haglaba nga mga pakli',
+'deadendpages' => 'Waray na kakadtoan nga mga pakli',
+'protectedpages' => 'Pinapasaliporan nga mga pakli',
 'listusers' => 'Lista han mga gumaramit',
+'listusers-creationsort' => 'Ginsusunodsunod pinaagi han paghimo nga petsa',
+'usereditcount' => '$1 {{PLURAL:$1|ka pagliwat|ka mga pagliwat}}',
 'usercreated' => '{{GENDER:$3|Ginhimo}} han $1 ha $2',
 'newpages' => 'Bag-o nga mga pakli',
 'newpages-username' => 'Agnay hiton gumaramit:',
@@ -1001,6 +1292,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'move' => 'Balhina',
 'movethispage' => 'Balhina ini nga pakli',
 'notargettitle' => 'Waray iiguon',
+'nopagetitle' => 'Waray sugad hito nga kakadtoan nga pakli',
 'pager-newer-n' => '{{PLURAL:$1|burubag-o 1|burubag-o $1}}',
 'pager-older-n' => '{{PLURAL:$1|durudaan 1|durudaan $1}}',
 
@@ -1013,6 +1305,7 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'specialloguserlabel' => 'Magburuhat:',
 'speciallogtitlelabel' => 'iiguon (titulo o gumarami):',
 'log' => 'Mga talaan',
+'all-logs-page' => 'Ngatanan nga mga talaan panpubliko',
 
 # Special:AllPages
 'allpages' => 'Ngatanan nga mga pakli',
@@ -1027,6 +1320,10 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'allpagesprev' => 'Naha-una',
 'allpagesnext' => 'Sunod',
 'allpagessubmit' => 'Kadto-a',
+'allpages-bad-ns' => '{{SITENAME}} in waray ngaran-lat\'ang nga "$1".',
+
+# SpecialCachedPage
+'cachedspecial-refresh-now' => 'Igkita an pinakaurhi.',
 
 # Special:Categories
 'categories' => 'Mga kaarangay',
@@ -1073,6 +1370,14 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 
 # E-mail user
 'emailuser' => 'Ig-e-mail ini nga gumaramit',
+'emailuser-title-target' => 'Ig-E-mail ini nga {{HENERO:$1|gumaramit}}',
+'emailuser-title-notarget' => 'Gumaramit han e-mail',
+'emailpage' => 'Gumaramit han e-mail',
+'defemailsubject' => '{{SITENAME}} e-mail tikang kan gumaramit na hi "$1"',
+'usermaildisabled' => 'Waray ginpagana an e-mail han gumaramit',
+'usermaildisabledtext' => 'Diri ka makakapadangat hin e-mail ha iba nga mga gumaramit ha dinhi nga wiki',
+'noemailtitle' => 'Waray e-mail address',
+'nowikiemailtitle' => 'Waray gintutugutan nga e-mail',
 'emailusername' => 'Agnay hiton gumaramit:',
 'emailfrom' => 'Tikang kan:',
 'emailto' => 'Para kan:',
@@ -1082,10 +1387,15 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'emailccme' => 'Igemail ako hini nga kopya hit ak buot igpasabot.',
 'emailsent' => 'Napadara an e-mail',
 
+# User Messenger
+'usermessage-summary' => 'Nabilin hin mensahe pansistema',
+'usermessage-editor' => 'Mensahero han sistema',
+
 # Watchlist
 'watchlist' => 'Akon barantayan',
 'mywatchlist' => 'Akon angay timan-an',
 'watchlistfor2' => 'Para ha $1 $2',
+'watchnologin' => 'Diri nakalog-in',
 'watch' => 'Bantayi',
 'watchthispage' => 'Bantayi ini nga pakli',
 'unwatch' => 'Pabay-i an pagbantay',
@@ -1093,12 +1403,12 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'wlshowlast' => 'Igpakita an katapusan nga $1 nga mga oras $2 nga mga adlaw $3',
 'watchlist-options' => 'Mga pirilian han talaan han binabantayan',
 
-'enotif_newpagetext' => 'Ini in bag-o nga pakli.',
-'created' => 'nahimo',
+'enotif_impersonal_salutation' => 'gumaramit han {{SITENAME}}',
 'enotif_anon_editor' => 'waray magpakilala nga gumaramit $1',
 
 # Delete
 'deletepage' => 'Igpara an pakli',
+'confirm' => 'Kompirma',
 'excontent' => "An sulod in: ''$1''",
 'excontentauthor' => 'an sulod in: \'\'$1\'\' (ngan hi "[[Special:Contributions/$2|$2]]" la an nag-amot)',
 'exblank' => 'waray sulod an pakli',
@@ -1109,12 +1419,16 @@ An paglaladawan han iya [$2 fayl han paglaladawan nga pakli] didto in ginpapakit
 'deletedtext' => 'Ginpara an "$1".
 Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'dellogpage' => 'Talaan han mga ginpara',
+'deletionlog' => 'Talaan han mga ginpara',
+'reverted' => 'Ginbalik ha uruuna nga rebisyon',
 'deletecomment' => 'Katadungan:',
+'deleteotherreason' => 'Lain/dugang nga katadungan:',
 'deletereasonotherlist' => 'Lain nga katadungan',
 'deletereason-dropdown' => "*Agsob nga rason hin pagpara
 ** Tugon han manunurat
 ** Pagtalapas ha katungod hin pagtatag-iya (''copyright'')
 ** Bandalismo",
+'delete-edit-reasonlist' => 'Igliwat an mga rason han pagpara',
 
 # Rollback
 'rollback' => 'Mga libot-pabalik nga pagliwat',
@@ -1134,16 +1448,28 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'protect-otherreason' => 'Lain/dugang nga katadongan:',
 'protect-otherreason-op' => 'Lain nga katadongan',
 'restriction-type' => 'Pagtugot:',
+'minimum-size' => 'Pinakaguti nga kadako',
+'maximum-size' => 'Pinakadako nga kadako:',
+'pagesize' => '(mga byte)',
 
 # Restrictions (nouns)
 'restriction-edit' => 'Igliwat',
 'restriction-move' => 'Balhina',
 'restriction-create' => 'Himo-a',
+'restriction-upload' => 'Igkarga-pasaka',
+
+# Restriction levels
+'restriction-level-all' => 'bisan ano nga katupngan',
 
 # Undelete
+'undelete' => 'Igpakita an mga ginpara nga mga pakli',
 'undeletelink' => 'igpakita/igbalik',
 'undeleteviewlink' => 'kitaa',
 'undeletecomment' => 'Katadungan:',
+'cannotundelete' => 'Pakyas an pagpabalik han pinara:
+$1',
+'undelete-search-title' => 'Pamiling hin mga ginpara nga mga pakli',
+'undelete-search-box' => 'Pamiling hin mga ginpara nga mga pakli',
 'undelete-search-submit' => 'Bilnga',
 'undelete-show-file-submit' => 'Oo',
 
@@ -1163,6 +1489,7 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'year' => 'Tikang ha tuig (ngan uruunhan):',
 
 'sp-contributions-newbies' => 'Igpakita an mga amot hin mga bag-o nga akawnt la',
+'sp-contributions-newbies-sub' => 'Para han bag-o nga mga akawnt',
 'sp-contributions-blocklog' => 'Talaan han pagpugong',
 'sp-contributions-uploads' => 'mga ginkarga-paigbaw',
 'sp-contributions-logs' => 'Mga talaan',
@@ -1195,6 +1522,10 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'blockip' => 'Pugngi an gumaramit',
 'blockip-title' => 'Pugngi an gumaramit',
 'blockip-legend' => 'Pugngi an gumaramit',
+'ipadressorusername' => 'IP address o agnay-hit-gumaramit:',
+'ipbexpiry' => 'Matitima an dulot:',
+'ipbreason' => 'Katadungan:',
+'ipbreasonotherlist' => 'Lain nga katadungan',
 'ipbreason-dropdown' => '*Agsob nga mga rason hit pagpugong
 ** Pagsusuksok hin sayop nga pananabutan
 ** Pagtatangtang hin sulod tikang ha mga pakli
@@ -1203,48 +1534,131 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 ** Panhahadlok nga pamatasan/makakalilisang nga pansamok
 ** Pan-abusar hin dirudilain nga mga akawnt
 ** Diri makakarawat nga agnay-hit-gumaramit',
+'ipb-hardblock' => 'Pugnga an mga nakalog-in nga mga gumaramit tikang ha pagliwat ha dinhi nga IP address',
+'ipbcreateaccount' => 'Pugnga paghimo hin akawnt',
+'ipbemailban' => 'Pugnga an uska gumaramit tikang ha pagpadangat hin e-mail',
 'ipbsubmit' => 'Pugngi ini nga gumaramit',
+'ipbother' => 'Iba nga oras:',
 'ipboptions' => '2 ka oras:2 hours,1 ka adlaw:1 day,3 ka adlaw:3 days,1 ka semana:1 week,2 ka semana:2 weeks,1 ka bulan:1 month,3 ka bulan:3 months,6 ka bulan:6 months,1 ka tuig:1 year,waray katapusan:infinite',
 'ipbotheroption' => 'iba',
 'ipbotherreason' => 'Lain/dugang nga katadungan:',
+'ipbhidename' => 'Tagoa an agnay-han-gumaramit tikang ha mga pagliwat ngan mga talaan',
+'ipb-disableusertalk' => 'Ayaw tugota ini nga gumaramit ha pagliwat han iya kalugaringon nga hiruhimangraw nga pakli samtang nakapugong hiya',
+'ipb-change-block' => 'Ig-utro pagpugong an gumaramit upod ini nga mga kahimtang',
+'ipb-confirm' => 'Igkompirma an pagpugong',
+'badipaddress' => 'Diri balido nga IP addres',
 'blockipsuccesssub' => 'Malinamposon an pagpugong',
+'ipb-blockingself' => 'Imo pala pupugngan it imo kalugaringong!  Sigurado ka ba hit imo bubuhaton?',
+'ipb-edit-dropdown' => 'Igliwat an mga rason han pagpugong',
+'ipb-unblock-addr' => '
+Tanggala an pagpugong $1',
+'ipb-unblock' => 'Tanggala an pagpugong ha uska aganay-hit-gumaramit o IP address',
+'ipusubmit' => 'Tanggala ini nga pagpugong',
+'blocklist' => 'Mga gumaramit nga nakapugong',
 'ipblocklist' => 'Mga ginpugngan nga gumaramit',
+'ipblocklist-legend' => 'Pamiling hin uska napugngan nga gumaramit',
+'blocklist-timestamp' => 'Marka-oras',
+'blocklist-target' => 'Gin-iigo',
+'blocklist-expiry' => 'Napan-os',
+'blocklist-by' => 'Ginpupugngan an admin',
+'blocklist-reason' => 'Rason:',
 'ipblocklist-submit' => 'Bilnga',
+'ipblocklist-localblock' => 'Lokal nga pagpugong',
+'ipblocklist-otherblocks' => 'Iba {{PLURAL:$1|ka pagpugong|ka mga pagpugong}}',
+'expiringblock' => 'diri madulot pag $1 han $2',
+'anononlyblock' => 'Waray nagpakilala la',
+'createaccountblock' => 'Diri ginpapagana an paghimo hin akawnt',
+'emailblock' => 'Diri ginpapagana an e-mail',
+'blocklist-nousertalk' => 'diri nakakaliwat hin kalugaringong nga hiruhimangraw nga pakli',
+'ipblocklist-empty' => 'An talaan han pagpugong in waray sulod.',
 'blocklink' => 'igpugong',
 'unblocklink' => 'igtanggal an pagpugong',
 'change-blocklink' => 'igliwan an papugong',
 'contribslink' => 'mga ámot',
+'emaillink' => 'Padara hin e-mail',
 'blocklogpage' => 'Talaan han pagpugong',
 'blocklogentry' => 'ginpugngan hi [[$1]] nga natatapos ha takna hin $2 $3',
+'unblocklogentry' => 'gintanggal an pagpugong $1',
 'block-log-flags-nocreate' => 'diri gintutugutan an paghimo hin akawnt',
+'block-log-flags-noemail' => 'Diri ginpapagana an e-mail',
+'block-log-flags-nousertalk' => 'diri makakaliwat hit kalugaringon nga hiruhimangraw nga pakli',
+'block-log-flags-hiddenname' => 'nakatago an agnay-hit-gumaramit',
+'ipb_already_blocked' => '"$1" in ginpugngan na',
+'blockme' => 'Pugngi ako',
 'proxyblocksuccess' => 'Human na.',
+'ipbnounblockself' => 'Diri ka gintutugotan hin pagtanggal hit pagpugong ha kalugaringon',
 
 # Developer tools
+'lockdb' => 'Trangkaha an database',
+'unlockdb' => 'Abreha an database',
+'lockbtn' => 'Trangkaha an database',
+'unlockbtn' => 'Abreha an database',
+'lockdbsuccesssub' => 'Malinamposon an pagtrangka han database',
+'unlockdbsuccesssub' => '
+Gintanggal an pagtrangka han databae',
+'unlockdbsuccesstext' => 'Natanggal an trangka han database',
+'lockfilenotwritable' => 'An database paypay han trangka in diri mahisusurat.
+Para pagtrangka o pagtanggal han trangka han database, ini in kinahanglanon magin masusuratan han serbidor han web.',
 'databasenotlocked' => 'An database in diri nakatrangka.',
 
 # Move page
 'move-page' => 'Mabalhin an $1',
+'move-page-legend' => 'Balhina an pakli:',
 'movearticle' => 'Balhina an pakli:',
 'moveuserpage-warning' => "'''Pahimatngon:''' Tibalhin ka hin pakli hin gumaramit. Alayon pagtigaman nga an pakli là an mababalhin ngan an gumaramit in ''diri'' mababalyoan hin ngaran.",
+'movenologin' => 'Diri nakalog-in',
+'movenotallowed' => 'Waray ka pagtugot para makabalhin hin mga pakli.',
+'movenotallowedfile' => 'Waray ka pagtugot para makabalhin hin mga paypay.',
+'cant-move-user-page' => 'Diri ka gintutugotan pagbalhin hin mga pakli nga gumaramit (labot la tikang ha mga bahin-pakli).',
+'cant-move-to-user-page' => 'Diri ka gintutugotan pagbalhin hin uska pakli pakada ha uska pakli hin gumaramit (labot la pakadto ha usa nga bahin-pakli han gumaramit).',
 'newtitle' => 'Para ha bag-o nga titulo:',
+'move-watch' => 'Kitaa an tinikangan nga pakli ngan kakadtoan nga pakli',
 'movepagebtn' => 'Igbalhin an pakli',
 'pagemovedsub' => 'Malinamposon an pagbalhin',
+'movepage-moved' => '\'\'\'"$1" in ginbalhin ngadto ha "$2"\'\'\'',
+'movepage-moved-redirect' => 'Nahimo an uska redirect.',
 'movedto' => 'ginbalhin ngadto',
+'move-subpages' => 'Balhina an mga bahin-pakli (tubtob ngadto ha $1)',
+'move-talk-subpages' => 'Balhina an mga bahin-pakli han pakli han hiruhimangraw (tubtob ngadto ha $1)',
+'movepage-page-exists' => 'An pakli nga $1 in aada na ngan diri ini lugaring nga masasapawan pagsurat.',
+'movepage-page-moved' => 'An pakli nga $1 in nabalhin ngadto ha $2.',
+'movepage-page-unmoved' => 'An pakli nga $1 in diri mababalhin ngadto ha $2.',
 'movelogpage' => 'Talaan han pagbalhin',
+'movelogpagetext' => 'Ubos hini in uska talaan han ngatanan nga nabalhin nga pakli',
+'movenosubpage' => 'Ini nga pakli in waray mga bahin-pakli.',
 'movereason' => 'Rason:',
 'revertmove' => 'igbalik',
 'delete_and_move' => 'Igapara ngan igbalhin',
+'delete_and_move_confirm' => 'Oo, paraa an pakli',
+'delete_and_move_reason' => 'Ginpara para makahatag hin aragian para makabalhin tikan "[[$1]]"',
+'selfmove' => 'An tinikangan ngan kakadtoan nga mga titulo in parehas;
+diri makakabalhin ha iya kalugaringon ngahaw.',
+'immobile-source-namespace' => 'Diri nababalhin an mga pakli ha ngaran-lat\'ang nga "$1"',
+'immobile-target-namespace' => 'Diri makakabalhin hin mga pakli ngada ha ngaran-lat\'ang nga "$1"',
+'immobile-target-namespace-iw' => 'An sumpay interwiki in diri balido nga irig-on para han pagbalhin hin pakli.',
+'immobile-source-page' => 'Diri mababalhin ini nga pakli.',
+'immobile-target-page' => 'Diri makakabalhin ha ngada nga kakadtoon nga titulo.',
+'imageinvalidfilename' => 'An kakadtoon nga ngaran-han-paypay in diri balido',
+'move-leave-redirect' => 'Pagbilin hin redirect',
 
 # Export
 'export' => 'Mga pakli hit pagexport',
 'exportall' => 'Ig-export an ngatanan nga mga pakli',
+'exportlistauthors' => 'Lakip an bug-os nga talaan han mga man-aamot para ha kada pakli',
+'export-submit' => 'Ginpapaangbit',
 'export-addcattext' => 'Igdugang an mga pakli tikang ha kaarangay:',
 'export-addcat' => 'Dugngi',
 'export-addnstext' => "Igdugang an mga pakli tikang ha ngaran-lat'ang:",
+'export-addns' => 'Dugngi',
+'export-download' => 'Igtipig komo paypay',
+'export-templates' => 'Iglakip an mga batakan',
 
 # Namespace 8 related
+'allmessages' => 'Mga mensahe han sistema',
 'allmessagesname' => 'Ngaran',
 'allmessagesdefault' => 'Daan aada nga teksto hiton mensahe',
+'allmessagescurrent' => 'Yana nga teksto han mensahe',
+'allmessages-filter-legend' => 'Sara',
 'allmessages-filter-all' => 'Ngatanan',
 'allmessages-language' => 'Yinaknan:',
 'allmessages-filter-submit' => 'Kadto-a',
@@ -1256,7 +1670,37 @@ Kitaa an $2 para hin talaan han mga gibag-ohi nga mga ginpamara.',
 'thumbnail_image-type' => 'An klase han hulagway in diri suportado',
 
 # Special:Import
+'import' => 'Naangbit hit mga pakli',
+'import-interwiki-source' => 'Tinikangan nga wiki/pakli:',
+'import-interwiki-templates' => 'Lakip an ngatanan nga mga batakan',
+'import-interwiki-submit' => 'Naangbit',
+'import-interwiki-namespace' => "Kakadtoan nga ngaran-lat'ang:",
+'import-upload-filename' => 'Ngaran han paypay:',
 'import-comment' => 'Komento:',
+'importstart' => 'Nag-aangbit hin mga pakli...',
+'importnopages' => 'Waray pakli nga ginpapaangbit.',
+'importbadinterwiki' => 'Maraot nga sumpay hit interwiki',
+'importnotext' => 'Waray sulod o waray teksto',
+'importsuccess' => 'Natapos an pag-aangbit!',
+'import-noarticle' => 'Waray pakli nga maaangbit!',
+'import-token-mismatch' => 'Nawara an datos sesyon.
+Alayon utroha.',
+'import-error-edit' => 'An pakli nga "$1" in waray naangbit tungod nga diri ka gintutugotan pagliwat hini.',
+'import-error-create' => 'An pakli nga "$1" in waray naangbit tungod nga diri ka gintutugotan paghimo hini.',
+'import-error-interwiki' => 'An pakli nga "$1" in waray naangbit tungod nga an ngaran in nakareserba para han pagsusumpay ha gawas (interwiki).',
+'import-error-special' => 'An pakli nga "$1" in waray naangbit tungod nga nahihilakip ini ha uska pinaurog nga ngaran-lat\'ang nga diri natugot hin mga pakli.',
+'import-error-invalid' => 'An pakli nga "$1" in waray naangbit tungod nga it iya ngaran in diri balido.',
+'import-options-wrong' => 'Sayop {{PLURAL:$2|nga pirilion|nga mga pirilion}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => 'An ginhatag nga gamot-pakli in uska diri balido nga titulo.',
+'import-rootpage-nosubpage' => 'Ngaran-lat\'ang nga "$1" han gamot-pakli in diri natugot hin mga bahin-pakli.',
+
+# Import log
+'importlogpage' => 'Talaan hin pan-aangbit',
+'import-logentry-upload' => 'ginangbit [[$1]] pinaagi hin pagkarga-pasaka han paypay',
+'import-logentry-interwiki' => 'natranswiki $1',
+
+# JavaScriptTest
+'javascripttest-pagetext-skins' => 'Pagpili hin panit para ha pag-paandar han:',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'An imo pakli hin gumaramit',
@@ -1315,12 +1759,65 @@ Makikit-an nimo an ginkuhaaan',
 'tooltip-compareselectedversions' => 'Kitaa an mga kaibhan ha butnga han duha nga pinili nga mga pagliwat hini nga pakli',
 'tooltip-watch' => 'Dugnga ini nga pakli ngadto han imo talaan hin ginbibinantayan',
 'tooltip-watchlistedit-normal-submit' => 'Igtanggal an mga titulo',
+'tooltip-recreate' => 'Utroha paghimo an pakli bisan ini in ginpara na',
+'tooltip-upload' => 'Tikanga an pagkarga-pasaka',
 'tooltip-rollback' => 'An "libot-pabalik" in nabalik han (mga) pagliwat hini nga pakli ngadto han kataposan nga nag-amot hin usa ka pidlit',
 'tooltip-undo' => '"Igpawara an ginbuhat (undo)" in nagbabalik hinin nga pagliwat ngan nabuklad hin pagliwat nga porma ha pahiuna-nga-paggawas nga kahimtang.  Natugot liwat pagdugang hin katadungan ha dinalikyat nga sumat.',
+'tooltip-preferences-save' => 'Tipiga an mga karuyag',
 'tooltip-summary' => 'Pagbutang hin dalikyat nga sumat',
 
 # Attribution
+'siteuser' => '{{SITENAME}} gumaramit $1',
+'anonuser' => '{{SITENAME}} waray nagpakilala nga gumaramit $1',
 'othercontribs' => 'Ginbasihan ha binuhat ni $1.',
+'others' => 'mga iba',
+'siteusers' => '{{SITENAME}} {{PLURAL:$2|gumaramit|mga gumaramit}} $1',
+
+# Info page
+'pageinfo-title' => 'Impormasyon para "$1"',
+'pageinfo-header-basic' => 'Panguna nga pananabotan',
+'pageinfo-header-edits' => 'Kaagi han pagliwat',
+'pageinfo-header-restrictions' => 'Panalipod han pakli',
+'pageinfo-display-title' => 'Iglatag an titulo',
+'pageinfo-length' => 'Kahilaba han pakli (ha mga byte)',
+'pageinfo-article-id' => 'ID han pakli',
+'pageinfo-robot-policy' => 'Pamilnga an kahimtang han makina',
+'pageinfo-robot-index' => 'Matutudlok',
+'pageinfo-robot-noindex' => 'Diri matutudlok',
+'pageinfo-views' => 'Ihap han mga naglantaw',
+'pageinfo-watchers' => 'Ihap han nangingita hin pakli',
+'pageinfo-redirects-name' => 'Nairedirekta ha dinhi nga pakli',
+'pageinfo-subpages-name' => 'Mga bahinpakli hin nga pakli',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirekta|mga redirekta}}; $3 {{PLURAL:$3|diri redirekta|mga diri redirekta}})',
+'pageinfo-firstuser' => 'Naghimo han pakli',
+'pageinfo-firsttime' => 'Adlaw han pagkahimo han pakli',
+'pageinfo-lastuser' => 'Giurhii nga nagliwat',
+'pageinfo-lasttime' => 'Petsa han kataposan nga pagliwat',
+'pageinfo-edits' => 'Ngatanan nga ihap han mga pakli',
+'pageinfo-toolboxlink' => 'Impormasyon han pakli',
+'pageinfo-redirectsto' => 'Igredirect ngadto ha',
+'pageinfo-contentpage' => 'Ginlakip komo uska unod nga pakli',
+'pageinfo-contentpage-yes' => 'Oo',
+'pageinfo-protect-cascading-yes' => 'Oo',
+
+# Patrolling
+'markaspatrolleddiff' => 'Igmarka komo ginpatrolya na',
+'markaspatrolledtext' => 'Markaha ini nga pakli komo ginpatrolya na',
+'markedaspatrolled' => 'Igmarka komo ginpatrolya na',
+'markedaspatrollederror' => 'Diri nakakamarka komo ginpatrolya na',
+
+# Patrol log
+'patrol-log-page' => 'Talaan han pagpatrolya',
+'patrol-log-header' => 'Ini in uska talaan hin mga ginpatrolya nga mga rebisyon.',
+'log-show-hide-patrol' => '$1 talaan hin pagpatrolya',
+
+# Image deletion
+'deletedrevision' => 'Ginpara an daan nga rebisyon $1',
+'filedeleteerror-short' => 'Nagsayop ha pagpara han paypay: $1',
+'filedeleteerror-long' => 'Mga sayop nga ginengkwentro samtang nagpapara hin paypay:
+
+$1',
+'filedelete-missing' => 'An paypay nga "$1" in diri mapapara, tunogd nga waray ini dida.',
 
 # Browsing diffs
 'previousdiff' => '← Durudaan nga pagliwat',
@@ -1328,15 +1825,23 @@ Makikit-an nimo an ginkuhaaan',
 
 # Media information
 'widthheightpage' => '$1 × $2, $3 {{PLURAL:$3|pakli|mga pakli}}',
+'file-info' => 'Kadako han paypay: $1, klase han MIME: $2',
 'file-info-size' => '$1 × $2 nga pixel, kadako han fayl: $3, MIME nga tipo: $4',
 'file-nohires' => 'Waray mas hiruhitaas nga resolusyon.',
 'svg-long-desc' => 'SVG nga fayl, ginbabanabanahan nga $1 × $2 nga mga pixel, kadako han fayl: $3',
 'show-big-image' => 'Bug-os nga resolusyon',
+'show-big-image-preview' => 'Kadako hin nga pahiuna nga pagawas: $1.',
+'show-big-image-other' => 'Iba {{PLURAL:$2|nga resolusyon|nga mga resolusyon}}: $1.',
+'show-big-image-size' => '$1 × $2 nga mga pixel',
 
 # Special:NewFiles
+'newimages' => 'Galeryia hin mga paypay nga bag-o',
 'newimages-legend' => 'Panara',
+'newimages-label' => 'Ngaran han paypay (o uska bahin hini):',
+'showhidebots' => '($1 ka mga bot)',
 'noimages' => 'Waray makikit-an.',
 'ilsubmit' => 'Bilnga',
+'bydate' => 'pinaagi han petsa',
 
 # Video information, used by Language::formatTimePeriod() to format lengths in the above messages
 'ago' => '$1 an nakalabay',
@@ -1355,8 +1860,8 @@ Kon an paypay ginliwat tikang han orihinal nga kamutangan, mayda mga detalye nga
 '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
-* model
-* datetimeoriginal
+* modelo
+* pitsaorasorihinal
 * exposuretime
 * fnumber
 * isospeedratings
@@ -1364,58 +1869,139 @@ An iba in daan nakatago.
 * artist
 * copyright
 * imagedescription
-* gpslatitude
-* gpslongitude
-* gpsaltitude',
+* gpsngalatitud
+* gpsngalongitud
+* gpsngaaltitud',
 
 # EXIF tags
 'exif-imagewidth' => 'Kahaluag',
 'exif-imagelength' => 'Kahitaas',
 'exif-ycbcrpositioning' => 'Pagpoposisyon han Y ngan C',
+'exif-referenceblackwhite' => 'Padis han itom nga busag nga reperensya hin mga balor',
+'exif-datetime' => 'Pagliwat han petsa ngan oras han paypay',
 'exif-imagedescription' => 'Titulo han hulagway',
+'exif-make' => 'Naghimo han kamera',
+'exif-model' => 'Modelo han kamera',
+'exif-software' => 'Software nga gingamit',
 'exif-artist' => 'Tag-iya',
+'exif-colorspace' => 'Kolor lat-ang',
+'exif-subsectime' => 'Mga bahin-segundo han PetsaOras',
+'exif-exposuretime-format' => '$1 seg ($2)',
+'exif-fnumber' => 'F Numero',
+'exif-lightsource' => 'Ginkuhaan han suga',
+'exif-filesource' => 'Ginkuhaan han paypay',
+'exif-saturation' => 'saturasyon',
 'exif-sharpness' => 'Pagkatarom',
+'exif-gpslatituderef' => 'Amihanan o salatan nga latitud',
+'exif-gpslatitude' => 'Latitud',
+'exif-gpslongituderef' => 'Sinirangan o katundan nga longitud',
+'exif-gpslongitude' => 'Longitud',
+'exif-gpsaltitude' => 'Altitud',
+'exif-gpstimestamp' => 'GPS nga oras (atomiko nga relo)',
+'exif-gpssatellites' => 'Mga satelayt nga gingamit ha pagsukol',
+'exif-gpsstatus' => 'Kahimtang han nagkakarawat',
+'exif-gpsdop' => 'kauntop han pagsukol',
 'exif-gpsspeedref' => 'Sukol han kalaksi',
+'exif-gpstrack' => 'Direksyon han kiwa',
+'exif-gpsimgdirection' => 'Direksyon han imahe',
+'exif-gpsdestlatitude' => 'kakadtoan latitud',
+'exif-gpsdestlongitude' => 'kakadtoan longitud',
+'exif-gpsdestdistance' => 'Distansya ha destinasyon',
+'exif-gpsareainformation' => 'Ngaran han lugar an GPS',
+'exif-gpsdatestamp' => 'petsa han GPS',
+'exif-jpegfilecomment' => 'Komento han JPEG nga paypay',
+'exif-worldregioncreated' => 'Rehiyon han kalibutan kun diin an ritrato ginkuha',
+'exif-countrycreated' => 'Nasod kun diin an ritrato ginkuha',
+'exif-countrycodecreated' => 'Kodigo han nasod kun diin an ritrato ginkuha',
+'exif-provinceorstatecreated' => 'Lalawigan o estado kun diin an ritrato ginkuha',
+'exif-citycreated' => 'An syudad kun diin an ritrato ginkuha',
+'exif-sublocationcreated' => 'Bahin-lokasyon han syudad kun diin an ritrato ginkuha',
+'exif-worldregiondest' => 'Ginpakita an rehiyon han kalibutan',
+'exif-countrydest' => 'Ginpapakita an nasod',
+'exif-countrycodedest' => 'Ginpapakita an kodigo han nasod',
+'exif-provinceorstatedest' => 'Ginpapakita an lalawigan o estado',
+'exif-citydest' => 'Ginpapakita an syudad',
+'exif-sublocationdest' => 'Ginpapakita an bahin-lokasyon han syudad',
+'exif-objectname' => 'Halipot nga titulo',
 'exif-headline' => 'Katukiban',
 'exif-source' => 'Tinikangan',
 'exif-writer' => 'Manunurat',
 'exif-languagecode' => 'Yinaknan',
 'exif-iimcategory' => 'Kaarangay',
+'exif-datetimeexpires' => 'Ayaw gamita kahuman han',
+'exif-datetimereleased' => 'Ginpagawas han',
+'exif-lens' => 'Mga lente nga gingamit',
+'exif-cameraownername' => 'Tag-iya han kamera',
+'exif-usageterms' => 'Mga termino hit paggamit',
+
+'exif-copyrighted-false' => 'Dominyo panpubliko',
+
+'exif-unknowndate' => 'Waray kasabti an petsa',
+
+'exif-orientation-1' => 'Normal',
 
 'exif-exposureprogram-1' => 'Mano-mano',
 
 'exif-subjectdistance-value' => '$1 ka mga metro',
 
+'exif-meteringmode-0' => 'Waray kasabti',
+'exif-meteringmode-255' => 'iba',
+
 'exif-lightsource-0' => 'Waray kasabti',
 'exif-lightsource-9' => 'Maupay nga panahon',
 'exif-lightsource-10' => 'Madampog nga panahon',
 
 'exif-focalplaneresolutionunit-2' => 'pulgadas',
 
+'exif-gaincontrol-0' => 'Waray',
+
+'exif-contrast-0' => 'Normal',
 'exif-contrast-1' => 'Mahumok',
 'exif-contrast-2' => 'Matig-a',
 
+'exif-saturation-0' => 'Normal',
+
+'exif-sharpness-0' => 'Normal',
 'exif-sharpness-1' => 'Mahumok',
 'exif-sharpness-2' => 'Matig-a',
 
 'exif-subjectdistancerange-0' => 'Waray kasabti',
 'exif-subjectdistancerange-1' => 'Macro',
+'exif-subjectdistancerange-2' => 'Harani nga pagkita',
+'exif-subjectdistancerange-3' => 'Harayo nga pagkita',
 
 # Pseudotags used for GPSAltitudeRef
 'exif-gpsaltitude-above-sealevel' => '$1 {{PLURAL:$1|metro|mga metro}} bawbaw han katupngan ha dagat',
 'exif-gpsaltitude-below-sealevel' => '$1 {{PLURAL:$1|metro|mga metro}} ubos han katupngan ha dagat',
 
+# Pseudotags used for GPSSpeedRef
+'exif-gpsspeed-k' => 'Mga kilometro kada oras',
+'exif-gpsspeed-m' => 'Mga milya kada oras',
+
+# Pseudotags used for GPSDestDistanceRef
+'exif-gpsdestdistance-k' => 'Mga kilometro',
+'exif-gpsdestdistance-m' => 'Mga milya',
+
 'exif-objectcycle-a' => 'Aga la',
 'exif-objectcycle-p' => 'Gab-i la',
+'exif-objectcycle-b' => 'Pareho pan-aga ngan pan-gab-i',
 
 # Pseudotags used for GPSTrackRef, GPSImgDirectionRef and GPSDestBearingRef
 'exif-gpsdirection-t' => 'Tinood nga direksyon',
 
+'exif-ycbcrpositioning-1' => 'Nakabutnga',
+
+'exif-dc-contributor' => 'Mga nag-ámot',
 'exif-dc-date' => '(Mga) petsa',
+'exif-dc-relation' => 'Nahisumpay nga medya',
 'exif-dc-rights' => 'Mga katungod',
+'exif-dc-source' => 'Tinikangan nga medya',
+'exif-dc-type' => 'Klase nga medya',
 
 'exif-rating-rejected' => 'Waray karawta',
 
+'exif-isospeedratings-overflow' => 'Lapos han 65535',
+
 'exif-iimcategory-ace' => 'mga arte, kultura ngan panlibang',
 'exif-iimcategory-clj' => 'Krimen ngan balaod',
 'exif-iimcategory-fin' => 'Ekonomiya ngan negosyo',
@@ -1432,6 +2018,10 @@ An iba in daan nakatago.
 'exif-iimcategory-war' => 'Gera, samok ngan diri namumurayawan',
 'exif-iimcategory-wea' => 'panahon',
 
+'exif-urgency-normal' => 'Normal ($1)',
+'exif-urgency-low' => 'Hamubo ($1)',
+'exif-urgency-high' => 'Hataas ($1)',
+
 # External editor support
 'edit-externally' => 'Igliwat ini nga fayl gamit han gawas nga aplikasyon',
 'edit-externally-help' => '(Kitaa an [//www.mediawiki.org/wiki/Manual:External_editors mga pagtutdo hin pag-ayad] para han dugang nga pananabutan)',
@@ -1442,7 +2032,19 @@ An iba in daan nakatago.
 'monthsall' => 'ngatanan',
 'limitall' => 'ngatanan',
 
+# E-mail address confirmation
+'confirmemail' => 'Igkompirma an e-mail address',
+'confirmemail_sent' => 'Ginpadara an kompirmasyon han e-mail.',
+'confirmemail_needlogin' => 'Kinahanglanon mo hin $1 para makakompirma han imo e-mail address.',
+'confirmemail_loggedin' => 'Ginkompirma na yana an imo e-mail address',
+'confirmemail_error' => 'Mayda diri asya nga nahitabo ha pagtipig ha imo kompirmasyon.',
+'confirmemail_subject' => '{{SITENAME}} kompirmasyon han e-mail address',
+
+# Scary transclusion
+'scarytranscludetoolong' => '[Hala hin duro an URL]',
+
 # Delete conflict
+'deletedwhileediting' => "'''Pahimatngon''': Ini nga pakli in ginpara kahuman nim magtikang pagliwat!",
 'recreate' => 'Himo-a utro',
 
 # action=purge
@@ -1450,7 +2052,9 @@ An iba in daan nakatago.
 
 # action=watch/unwatch
 'confirm-watch-button' => 'OK',
+'confirm-watch-top' => 'Dudugngon ini nga pakli ngadto han imo talaan hin ginbibinantayan?',
 'confirm-unwatch-button' => 'OK',
+'confirm-unwatch-top' => 'Tatanggalon ini nga pakli tikang han imo tala hin binabantayan?',
 
 # Multipage image navigation
 'imgmultipageprev' => '← naha-una nga pakli',
@@ -1459,14 +2063,23 @@ An iba in daan nakatago.
 'imgmultigoto' => 'Pakadto ha pakli $1',
 
 # Table pager
+'ascending_abbrev' => 'pasaka',
+'descending_abbrev' => 'paubos',
 'table_pager_next' => 'Sunod nga pakli',
 'table_pager_prev' => 'Naha-una nga pakli',
 'table_pager_first' => 'Una nga pakli',
 'table_pager_last' => 'Kataposan nga pakli',
-'table_pager_limit' => 'Igpakita in $1 nga mga item ha tagsa pakli',
+'table_pager_limit' => 'Igpakita in $1 nga mga butang ha tagsa pakli',
+'table_pager_limit_label' => 'Mga butang ha tagsa pakli:',
 'table_pager_limit_submit' => 'Kadto-a',
 'table_pager_empty' => 'Waray mga resulta',
 
+# Auto-summaries
+'autosumm-blank' => 'Blankoha an pakli',
+'autosumm-replace' => 'Ginsaliwanan an sulod hin "$1"',
+'autoredircomment' => 'Ginredirecta an pakli ngada ha [[$1]]',
+'autosumm-new' => 'Nahimo an pakli nga may "$1"',
+
 # Size units
 'size-bytes' => '$1 nga B',
 'size-kilobytes' => '$1 nga KB',
@@ -1478,8 +2091,18 @@ An iba in daan nakatago.
 'livepreview-ready' => 'Ginkakarga. . . Pag-andam!',
 
 # Watchlist editor
+'watchlistedit-numitems' => 'An imo talaan hin binabantayan hin may sulod nga {{PLURAL:$1|1 ka titulo|$1 ka mga titulo}}, diri lakip an mga pakli nga hiruhimangraw.',
+'watchlistedit-noitems' => 'An imo talaan han binabantayan in waray sulod nga mga titulo.',
+'watchlistedit-normal-title' => 'Igliwat an talaan han binabantayan',
+'watchlistedit-normal-legend' => 'Igtanggal an mga titulo tikang ha talaan hit binabantayan',
 'watchlistedit-normal-submit' => 'Igtanggal an mga titulo',
+'watchlistedit-raw-title' => 'Igliwat an hilaw nga talaan han binabantayan',
+'watchlistedit-raw-legend' => 'Igliwat an hilaw nga talaan han binabantayan',
 'watchlistedit-raw-titles' => 'Mga titulo:',
+'watchlistedit-raw-submit' => 'Igpayana an talaan han binabantayan',
+'watchlistedit-raw-done' => 'Ginpayana an imo talaan han barantayon.',
+'watchlistedit-raw-added' => '{{PLURAL:$1|1 nga titulo|$1 nga mga titulo}} in gindugang:',
+'watchlistedit-raw-removed' => '{{PLURAL:$1|1 nga titulo|$1 nga mga titulo}} in gintanggal:',
 
 # Watchlist editing tools
 'watchlisttools-view' => 'Kitaa an mga nanginginlabot nga mga pagbabag-o',
@@ -1491,19 +2114,49 @@ An iba in daan nakatago.
 
 # Special:Version
 'version' => 'Bersyon',
+'version-specialpages' => 'Mga pinaurog nga pakli',
+'version-parserhooks' => 'Mga kawil parser',
+'version-variables' => 'Mga variable',
+'version-antispam' => 'Pamugong hin spam',
+'version-skins' => 'Mga panit',
+'version-other' => 'iba',
+'version-mediahandlers' => 'Mga nakapot han medya',
+'version-hooks' => 'Mga kawil',
+'version-hook-name' => 'Ngaran han kawil',
+'version-version' => '(Bersion $1)',
 'version-license' => 'Lisensya',
+'version-poweredby-credits' => "Ini nga wiki in pinapaandar han '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+'version-poweredby-others' => 'mga iba',
 'version-software-product' => 'Produkto',
+'version-software-version' => 'Bersyon',
+'version-entrypoints' => 'Surudlan nga mga URL',
+'version-entrypoints-header-entrypoint' => 'Surudlan',
+'version-entrypoints-header-url' => 'URL',
 
 # Special:FilePath
+'filepath' => 'Aragian han paypay',
 'filepath-page' => 'Paypay:',
 'filepath-submit' => 'Kadto-a',
 
 # Special:FileDuplicateSearch
+'fileduplicatesearch' => 'Pamiling hin nadoble nga mga paypay',
+'fileduplicatesearch-legend' => 'Pamiling hin nadoble',
+'fileduplicatesearch-filename' => 'Ngaran han paypay:',
 'fileduplicatesearch-submit' => 'Pamilnga',
+'fileduplicatesearch-noresults' => 'Waray nabilngan nga paypay nga an ngaran in "$1".',
 
 # Special:SpecialPages
 'specialpages' => 'Mga pinaurog nga pakli',
+'specialpages-group-maintenance' => 'Mga sumat han pagmintinar',
+'specialpages-group-other' => 'Mga iba nga pinaurog nga pakli',
+'specialpages-group-login' => 'Magpalista nga masakob / paghimo hin bag-o nga akawnt',
+'specialpages-group-users' => 'Mga gumaramit ngan mga katungod',
+'specialpages-group-highuse' => 'Mga pakli nga damo nagamit',
+'specialpages-group-pages' => 'Talaan hin mga pakli',
 'specialpages-group-pagetools' => 'Mga higamit han pakli',
+'specialpages-group-wiki' => 'Datos ngan mga higamit han Wiki',
+'specialpages-group-redirects' => 'Ginreredirek an mga pakli nga pinaurog',
+'specialpages-group-spam' => 'Mga higamit han spam',
 
 # Special:BlankPage
 'blankpage' => 'Blanko nga pakli',
@@ -1523,6 +2176,7 @@ An iba in daan nakatago.
 'tag-filter' => '[[Special:Tags|Tag]] panara:',
 'tag-filter-submit' => 'Panara',
 'tags-edit' => 'igliwat',
+'tags-hitcount' => '$1 {{PLURAL:$1|nga pagbag-o|nga mga pagbag-o}}',
 
 # Special:ComparePages
 'comparepages' => 'Igkumpara an mga pakli',
@@ -1537,13 +2191,66 @@ An iba in daan nakatago.
 'dberr-header' => 'Ini nga wiki mayda problema',
 
 # HTML forms
+'htmlform-submit' => 'Isumite',
 'htmlform-reset' => 'Igbalik an mga pinamalyuan',
 'htmlform-selectorother-other' => 'iba',
 
 # New logging system
+'revdelete-content-hid' => 'sulod nakatago',
+'revdelete-summary-hid' => 'nakatago an dalikyat nga sumat han pagliwat',
+'revdelete-uname-hid' => 'nakatago an agnay-hit-gumaramit',
+'logentry-newusers-newusers' => '$1 in naghimo hin gumaramit nga akawnt',
+'logentry-newusers-create' => '$1 in naghimo hin gumaramit nga akawnt',
+'logentry-newusers-create2' => '$1 in naghimo hin gumaramit nga akawnt $3',
+'logentry-newusers-autocreate' => 'An akawnt nga $1 in lugaring nga nahimo',
 'newuserlog-byemail' => 'Ginpadangat an tigaman-pagsulod pinaagi han e-mail',
 
 # Feedback
+'feedback-subject' => 'Himangrawon:',
+'feedback-message' => 'Mensahe:',
+'feedback-cancel' => 'Pasagdi',
+'feedback-error2' => 'Sayop: Pakyas an pagliwat',
 'feedback-close' => 'Human na.',
 
+# Search suggestions
+'searchsuggest-search' => 'Pamilnga',
+'searchsuggest-containing' => 'nagsusulod. . .',
+
+# API errors
+'api-error-badaccess-groups' => 'Diri ka gintutugotan pagkarga paigbaw ha dinhi nga wiki.',
+'api-error-badtoken' => 'Sayop ha sulod: Maraot nga token.',
+'api-error-copyuploaddisabled' => 'Pagkarga paigbaw pinaagi han URL in diri mahihimo ha dinhi nga serbidor.',
+'api-error-duplicate-archive-popup-title' => 'An nagdodoble {{PLURAL:$1|nga paypay|nga mga paypay}} in napara na.',
+'api-error-duplicate-popup-title' => 'Nadoble {{PLURAL:$1|nga paypay|nga mga paypay}}.',
+'api-error-empty-file' => 'An paypay nga isinumite nimo in waray sulod.',
+'api-error-emptypage' => 'Naghihimo hin bag-o, diri gintutugotan an waray sulod nga mga pakli.',
+'api-error-filename-tooshort' => 'An ngaran han paypay in halipot hin duro.',
+'api-error-filetype-banned' => 'Diri gintutugotan ini nga klase nga paypay.',
+'api-error-filetype-missing' => 'Ini nga ngaran han paypay in nawawad-an hin ekstensyon.',
+'api-error-http' => 'Sayop ha sulod: Diri nakakasumpay ha serbidor.',
+'api-error-illegal-filename' => 'Diri gintutugotan an ngaran-han-paypay.',
+'api-error-mustbeloggedin' => 'Diri ka nakalog-in para makapagkarga-pasaka hin mga paypay.',
+'api-error-mustbeposted' => 'Sayop ha sulod: Iton paalayon in nagkikinahanglan hin HTTP POST.',
+'api-error-overwrite' => 'Pagsasapaw in aada nga paypay in diri gintutugotan.',
+'api-error-stashfailed' => 'Sayop ha sulod:  An serbidor in waray makatipig han temporaryo nga paypay.',
+'api-error-timeout' => 'An serbidor in diri nabaton ha sulod han ginaasahan nga oras.',
+'api-error-unclassified' => 'Nahitabo an waray kasabti nga sayop.',
+'api-error-unknown-code' => 'Waray kasabti nga sayop: "$1".',
+'api-error-unknown-error' => 'Sayop ha sulod: May-ada nagkasayop han pagkakarga paigbaw han imo paypay.',
+'api-error-unknown-warning' => 'Waray kasabti nga pahimatngon: "$1".',
+'api-error-unknownerror' => 'Waray kasabti nga sayop: "$1".',
+'api-error-uploaddisabled' => 'Diri ginpapakarga paigbaw ha dinhi nga wiki.',
+'api-error-verification-error' => 'Ini nga paypay in bangin naraot, o may-ada iba nga ekstensyon.',
+
+# Durations
+'duration-seconds' => '$1 {{PLURAL:$1|segundo|mga segundo}}',
+'duration-minutes' => '$1 {{PLURAL:$1|minuto|mga minuto}}',
+'duration-hours' => '$1 {{PLURAL:$1|oras|mga oras}}',
+'duration-days' => '$1 {{PLURAL:$1|adlaw|mga adlaw}}',
+'duration-weeks' => '$1 {{PLURAL:$1|semana|mga semana}}',
+'duration-years' => '$1 {{PLURAL:$1|tuig|mga tuig}}',
+'duration-decades' => '$1 {{PLURAL:$1|dekada|mga dekada}}',
+'duration-centuries' => '$1 {{PLURAL:$1|gatostuig|mga gatostuig}}',
+'duration-millennia' => '$1 {{PLURAL:$1|yukottuig|mga yukottuig}}',
+
 );
index 6f079c7..22f6489 100644 (file)
@@ -221,7 +221,6 @@ $messages = array(
 'qbbrowse' => 'Lemmi',
 'qbedit' => 'Soppi',
 'qbpageoptions' => 'Xëtuw tànneef',
-'qbpageinfo' => 'Xëtuw xibaar',
 'qbmyoptions' => 'Samay tànneef',
 'qbspecialpages' => 'Xëti jagleel',
 'faq' => 'Laaj yi ëpp',
@@ -450,10 +449,7 @@ Ngirte li mu joxe mooy ne « ''$2'' ».",
 # Login and logout pages
 'logouttext' => "Fi mu nekk nii génn nga.'''
 
-Man ngaa wéy di jëfandikoo {{SITENAME}} ci anam buñ la dul xamme walla nga  [[Special:UserLogin|duggewaat]] ak wenn tur wi walla ak weneen.",
-'welcomecreation' => '== Dalal-jàmm, $1 ! ==
-Sosees na sa sàq.
-Bul fatte soppi say [[Special:Preferences|{{SITENAME}} tànneef]].',
+Man ngaa wéy di jëfandikoo {{SITENAME}} ci anam buñ la dul xamme walla nga  <span class='plainlinks'>[$1 duggewaat]</span> ak wenn tur wi walla ak weneen.",
 'yourname' => 'Sa turu jëfandikukat',
 'yourpassword' => 'Sa baatujàll',
 'yourpasswordagain' => 'Bindaatal sa baatujàll',
@@ -907,8 +903,6 @@ Soo jëfandikoo lëkkalekaayu joow yi day neenal boyot yi nga jotoon a fal.',
 'search-interwiki-caption' => 'Sémbu niroowaale',
 'search-interwiki-default' => '$1 ngérte :',
 'search-interwiki-more' => '(yeneen)',
-'search-mwsuggest-enabled' => 'ak xelal',
-'search-mwsuggest-disabled' => 'ci lu dul xelal',
 'search-relatedarticle' => 'Yeneeni ngérte',
 'mwsuggest-disable' => 'Doxadil xelal yu AJAX',
 'searcheverything-enable' => 'Seet ci barabi tur yépp',
@@ -1627,11 +1621,7 @@ Coppite yiy ñëw yu xët wi ak xëtu waxtaanuwaay wi mu àndal di nañu leen fa
 'unwatching' => 'Farug toppte gi ...',
 
 'enotif_reset' => 'Fésal xët yépp niki yoo nemmeeku ba noppi',
-'enotif_newpagetext' => 'Lii aw xët wu bees la.',
 'enotif_impersonal_salutation' => 'Jëfandikukat bu {{SITENAME}}',
-'changed' => 'soppi',
-'created' => 'sosu na',
-'enotif_subject' => 'Xët wii di $PAGETITLE wu {{SITENAME}}, $PAGEEDITOR moo ko $CHANGEDORCREATED',
 'enotif_lastvisited' => 'Nemmeekul $1 ngir gis bépp coppite dale ba sa nemmeku gu mujj.',
 'enotif_lastdiff' => 'Xoolal $1 ngir gis gii coppite.',
 'enotif_anon_editor' => 'Jëfandikukat bu binduwul $1',
index a9d7dd5..1e61fbd 100644 (file)
@@ -159,7 +159,6 @@ $messages = array(
 'qbbrowse' => '浏览',
 'qbedit' => '编辑',
 'qbpageoptions' => '迭只页面',
-'qbpageinfo' => '上下文',
 'qbmyoptions' => '我个选项',
 'qbspecialpages' => '特殊页面',
 'faq' => 'FAQs',
@@ -382,11 +381,8 @@ $2',
 # Login and logout pages
 'logouttext' => "侬已经登出哉。'''
 
-侬可以继续匿名使用{{SITENAME}} ,也可以再次以相同或者两样个用户名[[Special:UserLogin|登录]]
+侬可以继续匿名使用{{SITENAME}} ,也可以再次以相同或者两样个用户名<span class='plainlinks'>[$1 登录]</span>
 注意,有眼页面作兴还是会搭侬登出前头一样显示,一脚到侬清除浏览器缓存。",
-'welcomecreation' => '== 欢迎侬, $1! ==
-
-侬个户头已经建立好哉。弗要忘记脱设定侬个[[Special:Preferences|{{SITENAME}}的个人参数]]噢。',
 'yourname' => '用户名:',
 'yourpassword' => '密码:',
 'yourpasswordagain' => '再拍一遍密码:',
@@ -884,8 +880,6 @@ $1",
 'search-interwiki-caption' => '姊妹项目',
 'search-interwiki-default' => '$1项结果:',
 'search-interwiki-more' => '(更多)',
-'search-mwsuggest-enabled' => '与建议',
-'search-mwsuggest-disabled' => ' 呒没建议',
 'search-relatedarticle' => '相关',
 'mwsuggest-disable' => '禁用AJAX建议',
 'searcheverything-enable' => '垃拉所有名字空间里向搜索',
@@ -1231,10 +1225,6 @@ $1",
 'watching' => '监控……',
 'unwatching' => '解除监控……',
 
-'enotif_newpagetext' => '该个是一只新页面。',
-'changed' => '改变哉',
-'created' => '建立哉',
-
 # Delete
 'deletepage' => '删脱页面',
 'confirm' => '确认',
index 8f77bc5..69b64d2 100644 (file)
@@ -199,7 +199,6 @@ $messages = array(
 'qbbrowse' => 'Гүүһәд хәләх',
 'qbedit' => 'Чиклх',
 'qbpageoptions' => 'Тер халх',
-'qbpageinfo' => 'Халхин туск',
 'qbmyoptions' => 'Тана халхс',
 'qbspecialpages' => 'Көдлхнә халхс',
 'faq' => 'Юм би',
@@ -397,11 +396,8 @@ $1',
 # Login and logout pages
 'logouttext' => "'''Та һарад бәәнәт.'''
 
-Та {{SITENAME}} гидг ормиг нертә уга олзлҗ чаднат, аль та [[Special:UserLogin|дәкәд орҗ]] цацу аль талдан нертә чаднат.
+Та {{SITENAME}} гидг ормиг нертә уга олзлҗ чаднат, аль та <span class='plainlinks'>[$1 дәкәд орҗ]</span> цацу аль талдан нертә чаднат.
 Зәрм халхс цааранднь та ода чигн орсн мет үзүлҗ чаддг тускар темдглтн (та хәләчин санлиг цеврлтл).",
-'welcomecreation' => '== Ирхитн эрҗәнәвидн, $1! ==
-Таднар шин бичгдлһн бүтв.
-Тадна [[Special:Preferences|{{SITENAME}} preferences]] сольҗ бичә мартн.',
 'yourname' => 'Демнчна нернь:',
 'yourpassword' => 'Нууц үг:',
 'yourpasswordagain' => 'Нууц үгиг давтн:',
@@ -596,8 +592,6 @@ $1',
 'search-interwiki-caption' => 'Садта проектмуд',
 'search-interwiki-default' => '$1 ашуд:',
 'search-interwiki-more' => '(дәкәд)',
-'search-mwsuggest-enabled' => 'селвгтә',
-'search-mwsuggest-disabled' => 'селвг уга',
 'mwsuggest-disable' => 'AJAX селвг унтрах',
 'searcheverything-enable' => 'Цуг нернә ууд хәәх',
 'searchall' => 'цуг',
@@ -885,8 +879,6 @@ $1',
 'watching' => 'Шинҗллһнә бүтлклд немлһн...',
 'unwatching' => 'Шинҗлһнә бүрткләс һарһлһн...',
 
-'changed' => 'сольв',
-'created' => 'бүтәв',
 'enotif_body' => 'Мендвт, күндтә $WATCHINGUSERNAME,
 
 $PAGEEDITDATE цагт {{SITENAME}} төсвин $PAGETITLE халхиг $PAGEEDITOR $CHANGEDORCREATED. Ода болсн халхна янз үзҗ седхлә, $PAGETITLE_URL хәләтн.
index 4fd23a8..0fb07c3 100644 (file)
 
 $messages = array(
 # Dates
-'sunday'        => 'Icawe',
-'monday'        => 'UMvulo',
-'tuesday'       => 'ULwesibini',
-'wednesday'     => 'ULwesithathu',
-'thursday'      => 'ULwesine',
-'friday'        => 'ULwesihlanu',
-'saturday'      => 'UMgqibelo',
-'january'       => 'EyoMqungu',
-'february'      => 'EyoMdumba',
-'march'         => 'EyoKwindla',
-'april'         => 'EkaTshazimpuzi',
-'june'          => 'EyeSilimela',
-'july'          => 'EyeKhala',
-'august'        => 'EyeThupha',
-'september'     => 'Eyo Msintsi',
-'october'       => 'Eye Dwarha',
-'november'      => 'Eye Nkanga',
-'december'      => 'Eyo Mnga',
-'january-gen'   => 'EyoMqungu',
-'february-gen'  => 'Eyo Mdumba',
-'march-gen'     => 'Eyo Kwindla',
-'april-gen'     => 'Ekatshazimpuzi',
-'may-gen'       => 'EkaCanzibe',
-'june-gen'      => 'Eyesilimela',
-'july-gen'      => 'Eye Khala',
-'august-gen'    => 'Eye Thupha',
+'sunday' => 'Icawe',
+'monday' => 'UMvulo',
+'tuesday' => 'ULwesibini',
+'wednesday' => 'ULwesithathu',
+'thursday' => 'ULwesine',
+'friday' => 'ULwesihlanu',
+'saturday' => 'UMgqibelo',
+'january' => 'EyoMqungu',
+'february' => 'EyoMdumba',
+'march' => 'EyoKwindla',
+'april' => 'EkaTshazimpuzi',
+'june' => 'EyeSilimela',
+'july' => 'EyeKhala',
+'august' => 'EyeThupha',
+'september' => 'Eyo Msintsi',
+'october' => 'Eye Dwarha',
+'november' => 'Eye Nkanga',
+'december' => 'Eyo Mnga',
+'january-gen' => 'EyoMqungu',
+'february-gen' => 'Eyo Mdumba',
+'march-gen' => 'Eyo Kwindla',
+'april-gen' => 'Ekatshazimpuzi',
+'may-gen' => 'EkaCanzibe',
+'june-gen' => 'Eyesilimela',
+'july-gen' => 'Eye Khala',
+'august-gen' => 'Eye Thupha',
 'september-gen' => 'Eyo Msintsi',
-'october-gen'   => 'Eye Dwarha',
-'november-gen'  => 'Eye Nkanga',
-'december-gen'  => 'Eyo Mnga',
-'may'           => 'EkaCanzibe',
+'october-gen' => 'Eye Dwarha',
+'november-gen' => 'Eye Nkanga',
+'december-gen' => 'Eyo Mnga',
+'may' => 'EkaCanzibe',
 
 'article' => 'Inqaku',
-'mypage'  => 'Inqaku yam',
-'mytalk'  => 'Inthetho yam',
+'mypage' => 'Inqaku yam',
+'mytalk' => 'Inthetho yam',
 
 # Cologne Blue skin
 'qbspecialpages' => 'Amaphepha Abalulekileyo',
@@ -55,29 +55,29 @@ $messages = array(
 # Vector skin
 'vector-view-edit' => 'Tshintsha',
 
-'help'             => 'Uncedo',
-'search'           => 'Khangela',
-'searchbutton'     => 'Khangela',
-'go'               => 'Hamba',
-'searcharticle'    => 'Hamba',
-'edit'             => 'Tshintsha',
-'delete'           => 'Cima',
-'protect'          => 'Khusela',
+'help' => 'Uncedo',
+'search' => 'Khangela',
+'searchbutton' => 'Khangela',
+'go' => 'Hamba',
+'searcharticle' => 'Hamba',
+'edit' => 'Tshintsha',
+'delete' => 'Cima',
+'protect' => 'Khusela',
 'talkpagelinktext' => 'Inthetho',
-'talk'             => 'Ingxoxo',
-'otherlanguages'   => 'Kwezinye Ilwimi',
+'talk' => 'Ingxoxo',
+'otherlanguages' => 'Kwezinye Ilwimi',
 
 # 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).
-'currentevents'        => 'Imisebenzi Eyenzekayo',
-'edithelp'             => 'Uncedo ngoTshintsho',
-'mainpage'             => 'Iphepha Elingundoqo',
+'currentevents' => 'Imisebenzi Eyenzekayo',
+'edithelp' => 'Uncedo ngoTshintsho',
+'mainpage' => 'Iphepha Elingundoqo',
 'mainpage-description' => 'Iphepha Elingundoqo',
 
-'newmessageslink'         => 'imiyalezo emitsha',
+'newmessageslink' => 'imiyalezo emitsha',
 'youhavenewmessagesmulti' => 'Unemiyalezo emitsha ku $1',
-'editsection'             => 'tshintsha',
-'editold'                 => 'tshintsha',
-'editlink'                => 'tshintsha',
+'editsection' => 'tshintsha',
+'editold' => 'tshintsha',
+'editlink' => 'tshintsha',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
 'nstab-main' => 'Inqaba',
@@ -86,48 +86,48 @@ $messages = array(
 'viewsource' => 'Jonga i Source',
 
 # Login and logout pages
-'welcomecreation'    => '== Wamkelekile, $1! ==
+'welcomecreation' => '== Wamkelekile, $1! ==
 
 I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENAME}}.',
-'yourname'           => 'Igama lelungu:',
-'yourpassword'       => 'Igama elifihlakeleyo lelungu:',
-'yourpasswordagain'  => 'Faka kwakhona igama elifihlakeleyo:',
+'yourname' => 'Igama lelungu:',
+'yourpassword' => 'Igama elifihlakeleyo lelungu:',
+'yourpasswordagain' => 'Faka kwakhona igama elifihlakeleyo:',
 'remembermypassword' => 'Khumbula igama lam elifihlakeleyo kule Khompyutha (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'createaccount'      => 'Vula I Account',
+'createaccount' => 'Vula I Account',
 'loginlanguagelabel' => 'Ulwimi: $1',
 
 # Edit pages
-'summary'     => 'Isishwankathelo:',
-'minoredit'   => 'Lutshitsho oluncinci olu',
-'watchthis'   => 'Bukela le Page',
+'summary' => 'Isishwankathelo:',
+'minoredit' => 'Lutshitsho oluncinci olu',
+'watchthis' => 'Bukela le Page',
 'savearticle' => 'Gcina eliphepha',
 'showpreview' => 'Bonisa Utshintsho',
-'showdiff'    => 'Gcina Utshitshi',
+'showdiff' => 'Gcina Utshitshi',
 
 # Search results
 'powersearch' => 'Khangela',
 
 # Preferences page
-'mypreferences'     => 'Ezithandwa ndim',
+'mypreferences' => 'Ezithandwa ndim',
 'searchresultshead' => 'Khangela',
-'username'          => 'Igama lelungu:',
+'username' => 'Igama lelungu:',
 
 # Recent changes
-'recentchanges'   => 'Utshitsho olusandokwenziwa',
+'recentchanges' => 'Utshitsho olusandokwenziwa',
 'minoreditletter' => 'nc',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Utsitsho olufana nolu',
-'recentchangeslinked-feed'    => 'Utsitsho olufana nolu',
+'recentchangeslinked' => 'Utsitsho olufana nolu',
+'recentchangeslinked-feed' => 'Utsitsho olufana nolu',
 'recentchangeslinked-toolbox' => 'Utsitsho olufana nolu',
 
 # Upload
-'upload'          => 'Faka Ifile',
-'filedesc'        => 'Isishwankathelo',
+'upload' => 'Faka Ifile',
+'filedesc' => 'Isishwankathelo',
 'watchthisupload' => 'Bukela le Page',
 
 # Miscellaneous special pages
-'move'         => 'Dlulisa',
+'move' => 'Dlulisa',
 'movethispage' => 'Dlulisa eliphepha',
 
 # Special:AllPages
@@ -135,9 +135,9 @@ I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENA
 'allpagessubmit' => 'Hamba',
 
 # Watchlist
-'watchlist'     => 'Endizibukeleyo',
-'mywatchlist'   => 'Endizibukeleyo',
-'watch'         => 'Bukela',
+'watchlist' => 'Endizibukeleyo',
+'mywatchlist' => 'Endizibukeleyo',
+'watch' => 'Bukela',
 'watchthispage' => 'Bukela le Page',
 
 # Protect
@@ -145,9 +145,9 @@ I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENA
 
 # Contributions
 'contributions' => 'Imisebenzi ye lungu',
-'mycontris'     => 'Inkxaso yam',
+'mycontris' => 'Inkxaso yam',
 
-'sp-contributions-talk'   => 'Inthetho',
+'sp-contributions-talk' => 'Inthetho',
 'sp-contributions-submit' => 'Khangela',
 
 # Block/unblock
@@ -155,9 +155,9 @@ I Account yakhgo ivuliwe, ungalibali ukutshitsha izinto ozithandayo ngo {{SITENA
 
 # Move page
 'move-page-legend' => 'Dlulisa eliphepha',
-'movepagebtn'      => 'DLulisa eliphepha',
-'movedto'          => 'Lidluliselwe',
-'movereason'       => 'Isizathu',
+'movepagebtn' => 'DLulisa eliphepha',
+'movedto' => 'Lidluliselwe',
+'movereason' => 'Isizathu',
 
 # Special:NewFiles
 'ilsubmit' => 'Khangela',
index c01c802..d15992a 100644 (file)
@@ -126,7 +126,6 @@ $messages = array(
 'qbfind' => 'დოგორი',
 'qbedit' => 'რედაქტირება',
 'qbpageoptions' => 'თე ხასჷლა',
-'qbpageinfo' => 'კონტექსტი',
 'qbmyoptions' => 'ჩქიმი ხასჷლეფი',
 'qbspecialpages' => 'გჷშაკერძაფილი ხასჷლეფი',
 'faq' => 'ბხშირი კითხვეფი',
@@ -431,8 +430,6 @@ $messages = array(
 'search-interwiki-caption' => 'ჯიმაია პროექტეფ',
 'search-interwiki-default' => 'მოღალირეფი $1-შე:',
 'search-interwiki-more' => '(უმოს)',
-'search-mwsuggest-enabled' => 'ელაჩამეფით',
-'search-mwsuggest-disabled' => 'ელაჩამეფიშ უმუშოთ',
 'searchrelated' => 'მათანგეფ',
 'searchall' => 'არძო',
 'showingresultsheader' => "{{PLURAL:$5|მოღალუ '''$1''' '''$3'''-შე|მოღალუეფ '''$1 - $2''' '''$3'''-შე}} '''$4'''-შო",
@@ -925,4 +922,7 @@ $messages = array(
 # Special:Tags
 'tag-filter' => '[[Special:Tags|ხინტკეფიშ]] ტკიბირი:',
 
+# Search suggestions
+'searchsuggest-search' => 'გორუა',
+
 );
index c8f6948..0e509a9 100644 (file)
@@ -146,7 +146,6 @@ $magicWords = array(
        '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' ),
@@ -318,7 +317,7 @@ $messages = array(
 'cancel' => 'זיי מבטל',
 'moredotdotdot' => 'נאך…',
 'mypage' => 'מײַן בלאט',
-'mytalk' => '×\9eײַ×\9f ×©×\9e×\95עס',
+'mytalk' => 'שמועס',
 'anontalk' => 'דאס רעדן פון דעם IP',
 'navigation' => 'נאַוויגאַציע',
 'and' => '&#32;און',
@@ -328,7 +327,6 @@ $messages = array(
 'qbbrowse' => 'בלעטערט',
 'qbedit' => 'ענדערן',
 'qbpageoptions' => 'דער בלאט',
-'qbpageinfo' => 'קאנטעקסט',
 'qbmyoptions' => 'מיינע בלעטער',
 'qbspecialpages' => 'ספעציעלע בלעטער',
 'faq' => 'מערסטע געפרעגטע פראגעס',
@@ -341,7 +339,7 @@ $messages = array(
 'vector-action-protect' => 'שיצן',
 'vector-action-undelete' => 'מבטל זיין אויסמעקן',
 'vector-action-unprotect' => 'ענדערונג באַשיצונג',
-'vector-simplesearch-preference' => '×\90ַק×\98×\99×\95×\95×\99ר×\9f ×¤Ö¿×\90ַר×\91ר×\99×\99×\98ער×\98×¢ ×\96×\95×\9a ×¤Ö¿×\90רש×\9c×\90Ö¸×\92×\9f (נאר וועקטאר)',
+'vector-simplesearch-preference' => '×\93ער×\9e×¢×\92×\9c×¢×\9b×\9f ×¤Ö¿×\90ַרפש×\95×\98ער×\98×\9f ×\96×\95×\9a ×¤×\90ַס (נאר וועקטאר)',
 'vector-view-create' => 'שאַפֿן',
 'vector-view-edit' => 'רעדאַקטירן',
 'vector-view-history' => 'ווײַזן היסטאָריע',
@@ -351,6 +349,7 @@ $messages = array(
 'namespaces' => 'נאָמענטיילן',
 'variants' => 'װאַריאַנטן',
 
+'navigation-heading' => 'נאוויגאציע מעניו',
 'errorpagetitle' => 'פֿעלער',
 'returnto' => 'צוריקקערן צו $1.',
 'tagline' => 'פֿון {{SITENAME}}',
@@ -563,7 +562,7 @@ $1',
 'viewsource-title' => 'באקוקן מקור פֿון $1',
 'actionthrottled' => 'די אַקציע איז באַגרענעצט',
 'actionthrottledtext' => 'אלס מאָסמיטל קעגן ספאַם, זענט איר באַגרענעצט פֿון דורכפֿירן די פעולה צופֿיל מאל אין א קורצער צײַט. ביטע פרובירט נאכאַמאָל אין א פאר מינוט.',
-'protectedpagetext' => '×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×¤×\90רשפ×\90ר×\98 ×¦×\95 ×\90פ×\94×\90×\9c×\98×\9f ×¢× ×\93ער×\95× ×\92×\9f.',
+'protectedpagetext' => '×\93ער ×\91×\9c×\90×\98 ×\90×\99×\96 ×\92עש×\99צ×\98 ×¦×\95 ×¤×\90ר×\9e×\99×\99×\93×\9f ×¨×¢×\93×\90ק×\98×\99ר×\9f ×\90×\95×\9f ×\90× ×\93ערע ×¤×¢×\95×\9c×\95ת.',
 'viewsourcetext' => 'איר קענט זען און קאפירן דעם מקור פון דעם בלאַט:',
 'viewyourtext' => "איר קענט באקוקן דעם מקור פון '''אייערע רעדאקטירונגען''' צו דעם בלאט:",
 'protectedinterface' => 'דער בלאַט שטעלט צו באניצער־אויבערפלאך טעקסט פֿאַרן װײכװאַרג אויף דער דאזיקער וויקי, און איז פֿאַרשפּאַרט כּדי צו פֿאַרמײַדן װאַנדאַליזם.
@@ -595,9 +594,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''איר האָט זיך ארויסלאָגירט.'''
 
-איר קענט ממשיך זיין ניצן {{SITENAME}} אַנאנים, אדער איר קענט  [[Special:UserLogin|צוריק אריינלאגירן]] מיט דעם זעלבן אדער אן אנדער באַניצער נאָמען. באמערקט אז געוויסע בלעטער קענען זיך ווייטער ארויסשטעלן אזוי ווי ווען איר זענט אריינלאגירט, ביז איר וועט אויסליידיגן דעם בלעטערער זאפאס.",
-'welcomecreation' => '== ברוך הבא, $1! ==
-אייער קאנטע איז באשאפן געווארן. נישט פארגעסן צו ענדערן אייערע [[Special:Preferences|{{SITENAME}} פרעפֿערענצן]].',
+איר קענט ממשיך זיין ניצן {{SITENAME}} אַנאנים, אדער איר קענט  <span class='plainlinks'>[$1 צוריק אריינלאגירן]</span> מיט דעם זעלבן אדער אן אנדער באַניצער נאָמען. באמערקט אז געוויסע בלעטער קענען זיך ווייטער ארויסשטעלן אזוי ווי ווען איר זענט אריינלאגירט, ביז איר וועט אויסליידיגן דעם בלעטערער זאפאס.",
+'welcomeuser' => 'ברוך הבא, $1!',
+'welcomecreation-msg' => "מ'האט געשאפן אייער קאנטע.
+פארגעסט נישט צו ענדערן אייערע [[Special:Preferences|{{SITENAME}} פרעפערענצן]].",
 'yourname' => 'באַניצער נאָמען:',
 'yourpassword' => 'פאסווארט',
 'yourpasswordagain' => 'ווידער אריינקלאפן פאסווארט',
@@ -889,7 +889,7 @@ $2
 'note' => "'''באמערקונג:'''",
 'previewnote' => "'''געדענקט אז דאס איז נאָר אין אַ פֿאָרויסיקע ווייזונג.'''
 אייערע ענדערונגען זענען נאָך נישט געהיט!",
-'continue-editing' => 'רע×\93×\90ק×\98×\99ר×\9f ×\95×\95ײַ×\98ער',
+'continue-editing' => '×\90ר×\99×\91ער ×¦×\95×\9d ×¨×¢×\93×\90ק×\98×\99ר×\9f ×¤Ö¿×¢×\9c×\93',
 'previewconflict' => 'די פֿאראויסיגע ווייזונג רעפלעקטירט דעם טעקסט און דער אויבערשטע טעקסט ענדערונג אָפטיילונג וויאזוי דאס וועט אויסזען אויב וועט איר דאס אָפהיטן.',
 'session_fail_preview' => "'''אנטשולדיגט! מען האט נישט געקענט פראצעסירן אייער ענדערונג צוליב א פארלוסט פון סעסיע דאטע. ביטע פרובירט נאכאמאל. אויב ס'ארבעט נאך אלס ניט, פרובירט [[Special:UserLogout|ארויסלאגירן]] און זיך צוריק אריינלאגירן.",
 'session_fail_preview_html' => "''''''אַנטשולדיקט! מיר קענען נישט פּראָצעסירן אײַער ענדערונג צוליב א פֿאַרלוסט פֿון סעסיע דאַטע.''''''
@@ -969,6 +969,15 @@ $2
 'edit-already-exists' => 'נישט מעגליך צו שאַפֿן נייע בלאט.
 ער עקזיסטירט שוין.',
 'defaultmessagetext' => 'גרונטלעכער מעלדונג טעקסט',
+'content-failed-to-parse' => 'פארזן $2 אינהאלט פאר $1 מאדעל דורכגעפאלן: $3',
+'invalid-content-data' => 'אומגילטיקע אינהאלט דאטן',
+'content-not-allowed-here' => '"$1" אינהאלט נישט דערלויבט אויף בלאט [[$2]]',
+
+# Content models
+'content-model-wikitext' => 'וויקיטעקסט',
+'content-model-text' => 'פשוטער טעקסט',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''אזהרה:''' דער בלאט אנטהאלט צופיל טייערע פארזירער רופן.
@@ -983,6 +992,8 @@ $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' => 'קנופנצאל אויפן בלאט צו הויך',
 'converter-manual-rule-error' => 'געטראפן א גרײַז אין האנטלעכן שפראך־קאנווערטירן כלל',
 
 # "Undo" feature
@@ -1211,8 +1222,6 @@ $1",
 'search-interwiki-caption' => 'שוועסטער פראיעקטן',
 'search-interwiki-default' => '$1 רעזולטאטן:',
 'search-interwiki-more' => '(נאך)',
-'search-mwsuggest-enabled' => 'מיט פארשלאגן',
-'search-mwsuggest-disabled' => 'אן פארשלאגן',
 'search-relatedarticle' => 'פארבינדן',
 'mwsuggest-disable' => 'בטל מאכן פארשלאגן AJAX',
 'searcheverything-enable' => 'זוכן אין אלע נאמענטיילן',
@@ -1424,6 +1433,7 @@ $1",
 'right-upload' => 'ארויפלאדן טעקעס',
 'right-reupload' => 'איבערשרײַבן עקסיסטירנדע טעקע',
 'right-reupload-own' => "איבערשרײַבן עקזיסטירנדע טעקעס וואָס מ'האט אַליין אַרויפֿגעלאָדן",
+'right-reupload-shared' => 'אריבערשרייבן טעקעס אויפן געמיינזאם מעדיע רעפאזיטאריום',
 'right-upload_by_url' => 'ארויפֿלאָדן טעקעס פֿון אַ URL',
 'right-purge' => 'ליידיקן דעם זייטל־זאפאס פאר א בלאט אן באשטעטיקונג',
 'right-autoconfirmed' => 'רעדאקטירן האלב-געשיצטע בלעטער',
@@ -1472,6 +1482,9 @@ $1",
 'rightslogtext' => 'דאָס איז אַ לאג פֿון ענדערונגען צו באַניצער רעכטן.',
 'rightslogentry' => 'געביטן די מיטגלידערשאַפֿט פֿאַר $1 פֿון $2 אויף $3',
 'rightslogentry-autopromote' => 'אויטאמאטיש פראמאווירט פון $2 צו $3',
+'logentry-rights-rights' => '$1 האט געביטן גרופע מיטגלידערשאַפֿט פֿאַר $3 פֿון $4 אויף $5',
+'logentry-rights-rights-legacy' => '$1 האט געביטן גרופע מיטגלידערשאפט פאר $3',
+'logentry-rights-autopromote' => '$1 אויטאמאטיש פראמאווירט פון $4 צו $5',
 'rightsnone' => '(גארנישט)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1601,6 +1614,7 @@ $1",
 '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").',
@@ -1608,6 +1622,8 @@ $1",
 'file-too-large' => 'די טעקע וואָס איר האט אײַנגעגעבן איז צו גרויס.',
 'filename-tooshort' => 'דער טעקענאמען איז צו קורץ',
 'filetype-banned' => 'דער טיפ טעקע איז געאַסרט',
+'verification-error' => 'די טעקע איז נישט אדורכגעגאנגען טעקע פרואוואונג.',
+'hookaborted' => 'די מאדיפיצירונג איר האט פרובירט קען נישט ווערן דורכגעפירט צוליב א פארברייטערונג.',
 'illegal-filename' => 'דער טעקע־נאָמען איז נישט ערלויבט',
 'overwrite' => 'מען טאָר נישט איבערשרײַבן אַן עקזיסטירנדע טעקע.',
 'unknown-error' => 'אַן אומבאַקאַנט טעות איז פֿארגעקומען.',
@@ -1622,10 +1638,17 @@ $1",
 '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>
 זײַט אזוי גוט און קלויבט אן אנדער נאמען.',
+'file-thumbnail-no' => "דער טעקע־נאמען הייבט אן מיט <strong>$1</strong>.
+זי זעט אויס ווי א פארקלענערט בילד ''(מיניאטור)''.
+טאמער האט איר דאס בילד אין פולער רעזאלוציע טוט עס ארויפלאדן, אנדערשט זייט אזוי גוט און ענדערט דעם טעקע־נאמען.",
 'fileexists-forbidden' => 'א טעקע מיט דעם נאָמען עקזיסטירט שוין, און מען קען זי נישט אַריבערשרײַבן. 
 אויב איר ווילט דאך אַרויפֿלאָדן אײַער טעקע, ביטע גיין צוריק און ניצן אַן אַנדער נאָמען. 
 [[File:$1|thumb|center|$1]]',
@@ -1737,6 +1760,7 @@ $1",
 'license-header' => 'ליצענץ:',
 'nolicense' => 'גארנישט',
 'license-nopreview' => '(פֿאראויסקוק נישט פֿאַראַן)',
+'upload_source_url' => ' (א גילטיקע , צוגעגנלעכער URL)',
 'upload_source_file' => '(א טעקע אויף אײַער קאמפיוטער)',
 
 # Special:ListFiles
@@ -1788,7 +1812,7 @@ $1",
 'shared-repo-from' => 'פֿון $1',
 'shared-repo' => 'א געמיינזאַמער זאַפאַס',
 'shared-repo-name-wikimediacommons' => 'וויקימעדיע קאמאנס',
-'upload-disallowed-here' => '×\9c×\99×\99×\93ער ×§×¢× ×\98 ×\90×\99ר × ×\99ש×\98 ×\90×\99×\91ערשר×\99×\99×\91×\9f ×\93×\90ס ×\91×\99×\9c×\93.',
+'upload-disallowed-here' => '×\90×\99ר ×§×¢× ×\98 × ×\99ש×\98 ×\90×\99×\91ערשר×\99×\99×\91×\9f ×\93×\99 ×\98עקע.',
 
 # File reversion
 'filerevert' => 'צוריקדרייען $1',
@@ -1798,6 +1822,7 @@ $1",
 'filerevert-defaultcomment' => 'צוריקגעשטעלט צו דער ווערסיע פֿון $2, $1',
 'filerevert-submit' => 'צוריקדרייען',
 'filerevert-success' => "'''[[Media:$1|$1]]''' צוריקגשטעלט צו דער [$4 ווערסיע פֿון $3, $2].",
+'filerevert-badversion' => 'נישט פאראן קיין פריערדיקע לאקאלע ווערסיע פון דער טעקע מיטן געזוכטן צייטשטעמפל.',
 
 # File deletion
 'filedelete' => 'מעק אויס $1',
@@ -1809,6 +1834,7 @@ $1",
 'filedelete-success' => "'''$1''' איז געווען אויסגעמעקט.",
 'filedelete-success-old' => "די ווערסיע פֿון '''[[Media:$1|$1]]''' פֿון $3, $2 איז געווארן אויסגעמעקט.",
 'filedelete-nofile' => "'''$1''' עקזיסטירט נישט.",
+'filedelete-nofile-old' => "נישט פאראן קיין ארכיווירטע ווערסיע פון '''$1''' מיט די ספעציפירטע אייגנקייטן.",
 'filedelete-otherreason' => 'אנדער/נאך א סיבה:',
 'filedelete-reason-otherlist' => 'אַנדער אורזאַך',
 'filedelete-reason-dropdown' => '*אַלגעמיינע אויסמעקן סיבות
@@ -2062,8 +2088,8 @@ $1",
 'emailuser-title-target' => 'שיקן {{GENDER:$1|דעם באניצער|די באניצערין}} ע־פאסט',
 'emailuser-title-notarget' => 'שיקן א באניצער ע־פאסט',
 'emailpage' => 'שיקן ע-פאסט צו באַניצער',
-'emailpagetext' => '×\90×\99ר ×§×¢× ×\98 × ×\99צ×\9f ×\93×¢×\9d ×¤Ö¿×\90רע×\9d ×\90×\95× ×\98×\9f ×¦×\95 ×©×\99ק×\9f ×\90×\9f ×\91×\9c×\99צ×\91ר×\99×\95×\95 ×¦×\95 ×\93×¢×\9d ×\93×\90×\96×\99×\92×\9f ×\91×\90Ö·× ×\99צער.
-דער ע-פאסט אדרעס וואס איר האט אריינגעלייגט אין [[Special:Preferences| אייערע באניצער פרעפערנעצן]] וועט זיך ווייזן כאילו דאס איז געקומען פון דארטן, בכדי צו דערמעגלעכן א תשובה.',
+'emailpagetext' => '×\90×\99ר ×§×¢× ×\98 × ×\99צ×\9f ×\93×\99 ×¤Ö¿×\90רע×\9d ×\90×\95× ×\98×\9f ×¦×\95 ×©×\99ק×\9f ×\90 ×\91×\9c×\99צ×\91ר×\99×\95×\95 ×¦×\95 {{GENDER:$1|×\93×¢×\9d ×\93×\90×\96×\99×\92×\9f ×\91×\90Ö·× ×\99צער|×\93ער ×\93×\90×\96×\99×\92ער ×\91×\90Ö·× ×\99צער×\99×\9f}}.
+דער ע-פאסט אדרעס וואס איר האט אריינגעלייגט אין [[Special:Preferences| אייערע באַניצער פרעפערנעצן]] וועט זיך ווײַזן כאילו דאס איז געקומען פון דארטן, בכדי צו דערמעגלעכן א תשובה.',
 'usermailererror' => 'בליצבריוו האט צוריקגעשיקט א טעות:',
 'defemailsubject' => 'ע-פאסט פון באַניצער "$1" {{SITENAME}}',
 'usermaildisabled' => 'באַניצער ע־פאסט אומאַקטיוויזירט',
@@ -2095,7 +2121,7 @@ $1",
 
 # Watchlist
 'watchlist' => 'מיין אויפפַּאסונג ליסטע',
-'mywatchlist' => '×\9e×\99×\99×\9f ×\90×\95×\99פפַּ×\90ס×\95× ×\92 ×\9c×\99ס×\98×¢',
+'mywatchlist' => 'אויפפַּאסונג ליסטע',
 'watchlistfor2' => 'פֿאַר $1 $2',
 'nowatchlist' => 'איר האט נישט קיין שום בלעטער אין אייער אויפפַּאסונג ליסטע.',
 'watchlistanontext' => 'ביטע $1 כדי צו זען אדער ענדערן בלעטער אין אייער אַכטגעבן ליסטע.',
@@ -2133,19 +2159,17 @@ $1",
 
 'enotif_mailer' => 'נאטיפאקאציע שיקער {{SITENAME}}',
 'enotif_reset' => 'באַצייכענען אלע בלעטער שוין געזען',
-'enotif_newpagetext' => 'דאס איז א נייער בלאט.',
 'enotif_impersonal_salutation' => '{{SITENAME}} באַניצער',
-'changed' => 'געטוישט',
-'created' => 'געשאַפֿן',
-'enotif_subject' => 'דער בלאט $PAGETITLE אין {{SITENAME}} $CHANGEDORCREATED דורך $PAGEEDITOR',
+'enotif_subject_deleted' => '{{SITENAME}} בלאט $1 איז אויסגעמעקט געווארן דורך {{gender:$2|$2}}',
+'enotif_subject_created' => '{{SITENAME}} בלאט $1 איז געשאפן געווארן דורך {{gender:$2|$2}}',
+'enotif_subject_moved' => '{{SITENAME}} בלאט $1 איז בגאוועגט געווארן דורך {{gender:$2|$2}}',
+'enotif_subject_changed' => '{{SITENAME}} בלאט $1 איז געענדערט געווארן דורך {{gender:$2|$2}}',
 'enotif_lastvisited' => 'זעט $1 פֿאַר אלע ענדערונגען זינט אײַער לעצטן וויזיט.',
 'enotif_lastdiff' => 'זעט $1 פאר דער ענדערונג.',
 'enotif_anon_editor' => 'אַנאנימער באַניצער $1',
 'enotif_body' => 'טײַערער $WATCHINGUSERNAME,
 
-דער {{SITENAME}} בלאט $PAGETITLE איז געווארן $CHANGEDORCREATED אום $PAGEEDITDATE דורך $PAGEEDITOR, זעט $PAGETITLE_URL פאר דער איצטיגער ווערסיע.
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 ענדערערס קורץ ווארט: $PAGESUMMARY $PAGEMINOREDIT
 
@@ -2159,6 +2183,9 @@ $NEWPAGE
 אייער פֿריינטליכע  {{SITENAME}} מעלדונגען סיסטעם
 
 --
+צו ענדערן אייער ע־פאסט נאטיפיקאציע שטעלונגען, באזוכט
+{{canonicalurl:{{#special:Preferences}}}}
+
 צו ענדערן אייער אויפֿפאסונג ליסטע, באזוכט
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
@@ -2316,7 +2343,7 @@ $UNWATCHURL
 'undeletedrevisions' => '{{PLURAL:$1|1 רעוויזיע|$1 רעוויזיעס}} צוריקגעשטעלט',
 'undeletedrevisions-files' => '{{PLURAL:$1|1 רעוויזיע|$1 רעוויזיעס}} און  {{PLURAL:$2|1 טעקע|$2 טעקעס}} צוריקגעשטעלט',
 'undeletedfiles' => '{{PLURAL:$1|1 טעקע|$1 טעקעס}} צוריקגעשטעלט',
-'cannotundelete' => 'צוריקשטעלונג איז דורכגעפאלן; עס איז מעגליך אז אן אנדערע האט דאס שוין צוריקגעשטעלט.',
+'cannotundelete' => 'צוריקשטעלונג איז דורכגעפאלן: $1',
 'undeletedpage' => "'''דער בלאט $1 איז געווארן צוריקגעשטעלט.'''
 
 זעט דעם [[Special:Log/delete| אויסמעקן לאג]] פֿאר א ליסטע פון די לעצטע אויסגעמעקטע און צוריקגעשטעלטע בלעטער.",
@@ -2325,6 +2352,7 @@ $UNWATCHURL
 'undelete-search-box' => 'זוכן אויסגעמעקטע בלעטער',
 'undelete-search-prefix' => 'ווײַז בלעטער וואס הייבן אן מיט:',
 'undelete-search-submit' => 'זוכן',
+'undelete-no-results' => 'נישט געטראפן קיין צוגעפאסטע בלעטער אין אויסמעקונג ארכיוו.',
 'undelete-error' => 'גרייז ביים צוריקשטעלן בלאט',
 'undelete-error-short' => 'טעות ביים צוריקשטעלן טעקע: $1',
 'undelete-error-long' => 'גרײַזן געטראפֿן בײַם ווידערשטעלן די טעקע:
@@ -2338,12 +2366,13 @@ $1',
 'namespace' => 'נאמענטייל:',
 'invert' => 'ווײַז אַלע אויסער די',
 'namespace_association' => 'אָנגעבונדענער נאָמענטייל',
+'tooltip-namespace_association' => 'צייכנט דאס קעסטל כדי איינשליסן דעם שמועס אדער סוביעקט נאמענטייל וואס געהערט צום אויסגעקליבענעם נאמענטייל',
 'blanknamespace' => '(הויפט)',
 
 # Contributions
-'contributions' => "באניצער'ס בײַשטײַערונגען",
+'contributions' => '{{GENDER:$1|באניצער}} בײַשטײַערונגען',
 'contributions-title' => 'בײַשטײַערונגען פֿון באַניצער $1',
-'mycontris' => '×\9eײַנע ×\91ײַש×\98ײַער×\95× ×\92×¢×\9f',
+'mycontris' => 'בײַשטײַערונגען',
 'contribsub2' => 'וועגן $1 ($2)',
 'nocontribs' => 'נישט געטראפן קיין ענדערונגען צוזאמעגעפאסט מיט די קריטעריעס.',
 'uctop' => '(לעצטע)',
@@ -2383,7 +2412,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 ווײַטערפֿירונגען',
 'whatlinkshere-hidetrans' => '$1 אַריבערשליסונגען',
 'whatlinkshere-hidelinks' => '$1 פֿאַרבינדונגען',
-'whatlinkshere-hideimages' => '$1 ×\91×\99×\9c×\93ער פֿאַרבינדונגען',
+'whatlinkshere-hideimages' => '$1 ×\98עקע פֿאַרבינדונגען',
 'whatlinkshere-filters' => 'פֿילטערס',
 
 # Block/unblock
@@ -2620,6 +2649,10 @@ $1',
 'imageinvalidfilename' => 'דער ציל טעקע נאָמען איז נישט גילטיק.',
 'fix-double-redirects' => 'דערהײַנטיקן ווײַטערפֿירונגען צום ארגינעלן טיטל',
 'move-leave-redirect' => 'איבערלאזן א ווײַטערפֿירונג',
+'move-over-sharedrepo' => '== טעקע עקזיסטירט ==
+[[:$1]] עקזיסטירט אויף א געטיילטן רעפאזיטאריום. ווען מען באוועגט א טעקע צו דעם טיטל וועט דאס איבערשרייבן די געטיילטע טעקע.',
+'file-exists-sharedrepo' => "ס'איז שוין פאראן א טעקע מיטן געקליבענעם נאמען אויף א געמיינזאם רעפאזיטאריום.
+זייט אזוי גוט קלייבט אן אנדער נאמען.",
 
 # Export
 'export' => 'עקספארטירן בלעטער',
@@ -2688,6 +2721,7 @@ $1',
 'import-interwiki-templates' => 'איינשילסן אלע מוסטערן',
 'import-interwiki-submit' => 'אימפארט',
 'import-interwiki-namespace' => 'ציל נאמענטייל:',
+'import-interwiki-rootpage' => 'ציל שטאמבלאט (אפציאנאל):',
 'import-upload-filename' => 'טעקע נאמען:',
 'import-comment' => 'הערה:',
 'importtext' => 'ביטע עקספארטירט די טעקע פון דער מקור וויקי ניצנדיג דאס [[Special:Export|עקספארט הילפמיטל]], שפייכלט אײַן אויף אײַער קאמפיוטער און לאדט אַרויף דא.',
@@ -2723,6 +2757,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' => 'אימפארט לאגבוך',
@@ -2734,8 +2771,8 @@ $1',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript טעסט',
-'javascripttest-disabled' => 'די  פֿונקציע איז אומאַקטיווירט אין דער דאזיקער וויקי.',
 'javascripttest-title' => 'דורכפירנדיק $1 בדיקות',
+'javascripttest-pagetext-noframework' => ' דער בלאט איז רעזערווירט פאר JavaScript. פרואוון.',
 'javascripttest-pagetext-skins' => 'קלויבט א באניצער־אייבערפלאך מיט וואס דורכצופירן די בדיקות:',
 'javascripttest-qunit-intro' => 'זעט [$1 דאקומענטאציע פאר טעסטן] בײַ mediawiki.org.',
 'javascripttest-qunit-heading' => 'מעדיעוויקי JavaScript QUnit קאנטראל־פראגראם',
@@ -2846,6 +2883,7 @@ $1',
 
 # Info page
 'pageinfo-title' => 'אינפֿאָרמאַציע פֿאַר "$1"',
+'pageinfo-not-current' => 'קען ווייזן אינפארמאציע נאר פאר דער לויפיקער רעוויזיע.',
 'pageinfo-header-basic' => 'גרונטלעכע אינפֿארמאַציע',
 'pageinfo-header-edits' => '!רעדאַקטירן היסטאריע',
 'pageinfo-header-restrictions' => 'בלאט באַשיצונג',
@@ -2854,7 +2892,10 @@ $1',
 'pageinfo-default-sort' => 'גרונט סארטירן שליסל',
 'pageinfo-length' => 'בלאט לענג (אין בייטן)',
 'pageinfo-article-id' => 'בלאט נומער',
+'pageinfo-language' => 'בלאט אינהאלט שפראך',
 'pageinfo-robot-policy' => 'זוכמאשין סטאטוס',
+'pageinfo-robot-index' => 'אינדעקסירבאר',
+'pageinfo-robot-noindex' => 'נישט אינדעקסירבאר',
 'pageinfo-views' => 'צאַל קוקן',
 'pageinfo-watchers' => '!צאָל בלאט אויפֿפאַסער',
 'pageinfo-redirects-name' => 'ווײַטערפירונגען צו דעם בלאט',
@@ -2868,10 +2909,15 @@ $1',
 'pageinfo-authors' => 'סה"כ צאָל באַזונדערע שרײַבער',
 'pageinfo-recent-edits' => 'לעצטיקע צאל רעדאקטירונגען (במשך די לעצטע $1)',
 'pageinfo-recent-authors' => 'לעצטיקע צאָל באַזונדערע שרײַבער',
-'pageinfo-restriction' => 'בלאט שוץ ($1)',
 'pageinfo-magic-words' => '{{PLURAL:$1|מאגיש ווארט|מאגישע ווערטער}} ($1)',
 'pageinfo-hidden-categories' => 'באהאלטענע {{PLURAL:$1|קאטעגאריע|קאטעגאריעס}} ($1)',
 'pageinfo-templates' => ' {{PLURAL:$1|אריבערגעשלאסענער מוסטער|אריבערגשלאסענע מוסטערן}} ($1)',
+'pageinfo-toolboxlink' => 'בלאַט־אינפֿארמאַציע',
+'pageinfo-redirectsto' => 'פירט ווײַטער צו',
+'pageinfo-redirectsto-info' => 'אינפֿארמאַציע',
+'pageinfo-contentpage' => 'געציילט ווי אן אינהאלט בלאט',
+'pageinfo-contentpage-yes' => 'יאָ',
+'pageinfo-protect-cascading-yes' => 'יאָ',
 
 # Skin names
 'skinname-standard' => 'קלאסיש',
@@ -2894,6 +2940,8 @@ $1',
 'markedaspatrollederror' => 'נישט מעגלעך צו צייכענען אלס פאַטראלירט',
 'markedaspatrollederrortext' => 'איר דארפֿט ספעציפֿירן א ווערזיע צו באַצייכענען אלס פאַטראלירט.',
 'markedaspatrollederror-noautopatrol' => 'איר טאר נישט באַצייכענען די אייגענע ענדערונגען אלס פאַטראלירט.',
+'markedaspatrollednotify' => 'די ענדערונג צו $1 איז געווארן מארקירט ווי קאנטראלירט.',
+'markedaspatrollederrornotify' => 'מארקירן ווי קאנטראלירט דורכגעפאלן.',
 
 # Patrol log
 'patrol-log-page' => 'פאטראלירן לאג-בוך',
@@ -2958,6 +3006,7 @@ $1',
 'hours' => '{{PLURAL:$1|$1 שעה|$1 שעה}}',
 'days' => '{{PLURAL:$1|$1 טאג|$1 טעג}}',
 'ago' => 'פֿאַר $1',
+'just-now' => 'גראדע יעצט',
 
 # Bad image list
 'bad_image_list' => 'דער פֿאָרמאַט איז װי פֿאָלגנדיק:
@@ -3000,6 +3049,11 @@ $1',
 'exif-orientation' => 'אריענטאַציע',
 'exif-samplesperpixel' => 'צאל קאמאפאנענטן',
 'exif-planarconfiguration' => 'דאטן איינארדנונג',
+'exif-xresolution' => 'האריזאנטאלע רעזאלוציע',
+'exif-yresolution' => 'ווערטיקאלע רעזאלוציע',
+'exif-stripoffsets' => 'בילדדאטן פלאציר',
+'exif-rowsperstrip' => 'צאל שורות אין א שטרייף',
+'exif-stripbytecounts' => 'בייטן אין א קאמפרימירטן שטרייף',
 'exif-jpeginterchangeformatlength' => 'בייטן פון JPEG דאטן',
 'exif-datetime' => 'טעקע ענדערונג דאטע און צײַט',
 'exif-imagedescription' => 'בילד טיטל',
@@ -3058,6 +3112,7 @@ $1',
 'exif-saturation' => 'זעטיקונג',
 'exif-sharpness' => 'שארף',
 'exif-devicesettingdescription' => 'אפאראט שטעלונגען אראפמאלונג',
+'exif-imageuniqueid' => 'בילד־ID',
 'exif-gpslatituderef' => 'צפון אדער דרום גארטל־ליניע',
 'exif-gpslatitude' => 'גארטל־ליניע',
 'exif-gpslongituderef' => 'מזרח אדער מערב לענג',
@@ -3066,6 +3121,7 @@ $1',
 'exif-gpsaltitude' => 'הייך',
 'exif-gpstimestamp' => 'GPS צייט (אטאם־זייגער)',
 'exif-gpssatellites' => 'סאטעליטן געניצט פאר מעסטן',
+'exif-gpsstatus' => 'אויפנעמער סטאטוס',
 'exif-gpsdop' => 'מאס פוקנטליכקייט',
 'exif-gpsspeedref' => 'גיך איינהייט',
 'exif-gpsspeed' => 'גיך פון GPS־אויפֿנעמער',
@@ -3087,6 +3143,7 @@ $1',
 'exif-keywords' => 'שליסלווערטער',
 'exif-worldregioncreated' => "וועלטראיאן וואו מ'האט גענומען דאס בילד",
 'exif-countrycreated' => "לאנד וואו מ'האט געמאכט דאס בילד",
+'exif-countrycodecreated' => "קאד פארן לאנד וואו מ'האט געמאכט דאס בילד",
 'exif-provinceorstatecreated' => "פראווינץ אדער שטאַט וואו מ'האט גענומען דאס בילד",
 'exif-citycreated' => "שטאָט וואו מ'האט געמאכט דאס בילד",
 'exif-worldregiondest' => 'וועלטראיאן געוויזן',
@@ -3117,6 +3174,7 @@ $1',
 'exif-cameraownername' => 'אייגנטימער פון קאמערע',
 'exif-label' => 'צעטל',
 'exif-datetimemetadata' => 'דאטע ווען מעטאדאטן זענען געווען לעצט געענדערט',
+'exif-nickname' => 'אויספארמעלער נאמען פון בילד',
 'exif-rating' => 'שאצונג (פֿון 5)',
 'exif-rightscertificate' => 'רעכטן פארוואלטונג צערטיפיקאט',
 'exif-copyrighted' => 'קאפירעכט סטאַטוס',
@@ -3133,6 +3191,9 @@ $1',
 # EXIF attributes
 'exif-compression-1' => 'אומ-צאמגעקוועטשט',
 
+'exif-copyrighted-true' => 'געשיצט מיט קאפירעכט',
+'exif-copyrighted-false' => 'פובליקער געביט',
+
 'exif-unknowndate' => 'אומבאַוואוסטע דאַטע',
 
 'exif-orientation-1' => 'נארמאַל',
@@ -3473,6 +3534,9 @@ $5
 'hebrew-calendar-m11-gen' => 'אב',
 'hebrew-calendar-m12-gen' => 'אלול',
 
+# Signatures
+'signature' => '[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|רעדן]])',
+
 # Core parser functions
 'duplicate-defaultsort' => '\'\'\'ווארענונג:\'\'\' גרונט סארטשליסל "$2" פֿאָרט איבערן פֿריערדיגן גרונט סארטשליסל "$1".',
 
@@ -3619,9 +3683,9 @@ $5
 '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-newusers' => 'באניצער קאנטע $1 געשאפן געווארן',
+'logentry-newusers-create' => 'באניצער קאנטע $1 געשאפן געווארן',
+'logentry-newusers-create2' => 'באניצער קאנטע $1 געשאפן געווארן דורך $3',
 'logentry-newusers-autocreate' => 'קאנטע $1 באשאפן אויטאמאטיש',
 'newuserlog-byemail' => 'פאַסווארט געשיקט דורך ע-פאסט',
 
@@ -3641,6 +3705,10 @@ $5
 'feedback-bugcheck' => 'געוואלדיק! אבער זייט בודק אז עס איז נישט איינער פון די [$1 באוואוסטע באגן].',
 'feedback-bugnew' => "כ'האב בודק געווען. רעפארטירט א נייעם באג.",
 
+# Search suggestions
+'searchsuggest-search' => 'זוכן',
+'searchsuggest-containing' => 'כולל…',
+
 # API errors
 'api-error-badaccess-groups' => 'איר האט נישט קיין רעכטן אַרויפֿלאָדן טעקעס אויף דער וויקי.',
 'api-error-badtoken' => 'אינערלעכער גרײַז: סימן טויג נישט.',
@@ -3693,4 +3761,6 @@ $5
 'duration-centuries' => '$1 {{PLURAL:$1|יארהונדערט|יארהונדערטער}}',
 'duration-millennia' => '$1 {{PLURAL:$1|יארטויזנט|יארטויזנטער}}',
 
+# Unknown messages
+'svg-long-error' => 'אומגילטיקע SVG טעקע: $1',
 );
index de1cf47..cbfabe9 100644 (file)
@@ -186,8 +186,8 @@ $messages = array(
 'newwindow' => '(yíò sí nínú fèrèsè tuntun)',
 'cancel' => 'Fagilé',
 'moredotdotdot' => 'Ẹ̀kúnrẹ́rẹ́...',
-'mypage' => 'Ojúewé mi',
-'mytalk' => 'Ọ̀rọ̀ mi',
+'mypage' => 'Ojúewé',
+'mytalk' => 'Ọ̀rọ̀',
 'anontalk' => 'Ọ̀rọ̀ fún IP yí',
 'navigation' => 'Atọ́ka',
 'and' => '&#32;àti',
@@ -197,7 +197,6 @@ $messages = array(
 'qbbrowse' => 'Ìṣíwò',
 'qbedit' => 'Àtúnṣe',
 'qbpageoptions' => 'Ojúewé yi',
-'qbpageinfo' => 'Àjọwípọ̀',
 'qbmyoptions' => 'Àwọn ojúewé mi',
 'qbspecialpages' => 'Àwọn ojúewé pàtàkì',
 'faq' => 'FAQ',
@@ -448,12 +447,11 @@ Láti ṣ'àfikún tàbí ṣ'àyípadà àwọn ìyédèpadà fún gbogbo àw
 # Login and logout pages
 'logouttext' => "'''Ẹ ti bọ́sọ́de.'''
 
-Ẹ le tẹ̀síwájú sí ní lo {{SITENAME}} láìmorúkọ yín, tàbí kí ẹ [[Special:UserLogin|padà wọlé]] bí ẹnikanan tàbí ẹlòmíràn.
+Ẹ le tẹ̀síwájú sí ní lo {{SITENAME}} láìmorúkọ yín, tàbí kí ẹ <span class='plainlinks'>[$1 padà wọlé]</span> bí ẹnikanan tàbí ẹlòmíràn.
 Àkíyèsí wípé àwọn ojúewé kan le hàn b'ígbà tójẹ́pé ẹ sì wọlé títí tí ẹ ó fi jọ̀wọ́ cache browser yín.",
-'welcomecreation' => "== Ẹ kú àbọ̀, $1! ==
-
-A ti ṣ'èdá àpamọ́ yín.
-Ẹ mọ́ gbàgbé l'áti ṣ'àtúnṣe àwọn [[Special:Preferences|{{SITENAME}} ìfẹ́ràn]] yín.",
+'welcomeuser' => 'Ẹ kú àbọ̀, $1!',
+'welcomecreation-msg' => "A ti ṣ'èdá àpamọ́ yín.
+Ẹ mọ́ gbàgbé l'áti ṣ'àtúnṣe [[Special:Preferences|{{SITENAME}} àwọn ìfẹ́ràn]] yín.",
 'yourname' => 'Orúkọ oníṣe:',
 'yourpassword' => 'Ọ̀rọ̀ìpamọ́:',
 'yourpasswordagain' => 'Kọ ọ̀rọ̀ìpamọ́ lẹ́ẹ̀kansí:',
@@ -1062,8 +1060,6 @@ Kò ṣe é bòmọ́lẹ̀.',
 'search-interwiki-caption' => 'Àwọn iṣẹ́-ọwọ́ mìràn',
 'search-interwiki-default' => 'èsì $1',
 'search-interwiki-more' => '(tókù)',
-'search-mwsuggest-enabled' => 'pẹ̀lú àbá',
-'search-mwsuggest-disabled' => 'láìsí àbá',
 'search-relatedarticle' => 'Tóbáramu',
 'mwsuggest-disable' => 'Ìdálẹ́kun àwọn àbá AJAX',
 'searcheverything-enable' => 'Àwárí nínú gbogbo orúkọàyè:',
@@ -1098,7 +1094,7 @@ Ní báyìí ná ẹ le ṣàwárí lọ́dọ̀ Google.
 
 # Preferences page
 'preferences' => 'Àwọn ìfẹ́ràn',
-'mypreferences' => 'Àwọn ìfẹ́ràn mi',
+'mypreferences' => 'Àwọn ìfẹ́ràn',
 'prefs-edits' => 'Iye àwọn àtúnṣe:',
 'prefsnologin' => 'Ẹ kò tíì wọlé',
 'prefsnologintext' => 'Ẹ gbọ́dọ̀ <span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} wọlé]</span> láti to àwọn ìfẹ́ràn oníṣe.',
@@ -1988,7 +1984,7 @@ Bákannáà ẹ wo [[Special:WantedCategories|àwọn ẹ̀ka wíwá]].',
 
 # Watchlist
 'watchlist' => 'Ìmójútó mi',
-'mywatchlist' => 'Ìmójútó mi',
+'mywatchlist' => 'Ìmójútó',
 'watchlistfor2' => 'Fún $1 $2',
 'nowatchlist' => 'Ẹ kò ní ohun kankan nínú ìmójútó yín.',
 'watchlistanontext' => 'Ẹ jọ̀wọ́ $1 láti wò tàbí ṣàtúnṣe àwọn ohun inú ìmójútó yín.',
@@ -2024,11 +2020,7 @@ A óò ṣ'àkójọ àwọn àtúnṣe ọjọ́wajú sí ojúewé yìí àti o
 
 'enotif_mailer' => 'Olùránṣẹ́ ìfitọ́nilétí {{SITENAME}}',
 'enotif_reset' => 'Fàlà sí gbogbo àwọn ojúewé bíi bíbẹ̀wò',
-'enotif_newpagetext' => 'Ojúewé tuntun nìyí.',
 'enotif_impersonal_salutation' => 'Oníṣe {{SITENAME}}',
-'changed' => 'títúnṣẹ',
-'created' => 'dídá',
-'enotif_subject' => '$PAGEEDITOR $CHANGEDORCREATED ojúewé $PAGETITLE lórí {{SITENAME}}',
 'enotif_lastvisited' => 'Ẹ wo $1 fún gbogbo àwọn àtúnṣe látìgbà ìbẹ̀wò yín gbẹ̀yìn.',
 'enotif_lastdiff' => 'Ẹ wo $1 láti wo àtúnṣe yìí.',
 'enotif_anon_editor' => 'oníṣe aláìlórúkọ $1',
@@ -2229,9 +2221,9 @@ $1',
 'blanknamespace' => '(Gbangba)',
 
 # Contributions
-'contributions' => 'Àwọn àfikún ẹnitínṣe',
+'contributions' => 'Àwọn àfikún {{GENDER:$1|oníṣe}}',
 'contributions-title' => 'Àwọn àfikún oníṣe fún $1',
-'mycontris' => 'Àwọn àfikún mi',
+'mycontris' => 'Àwọn àfikún',
 'contribsub2' => 'Fún $1 ($2)',
 'uctop' => '(lókè)',
 'month' => 'Láti osù (àti sẹ́yìn):',
@@ -2271,7 +2263,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1 àtúnjúwe',
 'whatlinkshere-hidetrans' => '$1 ìkómọ́ra',
 'whatlinkshere-hidelinks' => '$1 ìjápọ̀',
-'whatlinkshere-hideimages' => '$1 àwọn ìjápọ̀ àwòrán',
+'whatlinkshere-hideimages' => '$1 àwọn ìjápọ̀ fáìlì',
 'whatlinkshere-filters' => 'Ajọ̀',
 
 # Block/unblock
@@ -2992,6 +2984,10 @@ Tóbájẹ́pé fáìlì ọ̀hún ti jẹ́ títúnṣe sí bóṣewà ní bẹ
 'feedback-error3' => 'Àsìṣe: Kò sí ìdáhùn látọ̀dọ̀ API',
 'feedback-close' => 'Ṣetán',
 
+# Search suggestions
+'searchsuggest-search' => 'Ṣàwárí',
+'searchsuggest-containing' => 'tó ní...',
+
 # API errors
 'api-error-filename-tooshort' => 'Orúkọ fáílì kéréjú bó ṣe yẹ lọ.',
 'api-error-unknown-code' => 'Àsìṣe aláìlójúùtú: "$1".',
index fe79a49..c161856 100644 (file)
@@ -157,7 +157,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( '最近修改' ),
        'Recentchangeslinked'       => array( '外鏈修改' ),
        'Revisiondelete'            => array( '修訂版本刪除' ),
-       'RevisionMove'              => array( '修訂版本移動' ),
        'Search'                    => array( '搜索' ),
        'Shortpages'                => array( '短版' ),
        'Specialpages'              => array( '特別頁' ),
@@ -375,7 +374,6 @@ $messages = array(
 'qbbrowse' => '瀏覽',
 'qbedit' => '編輯',
 'qbpageoptions' => '呢一頁',
-'qbpageinfo' => '附近文字',
 'qbmyoptions' => '我嘅選項',
 'qbspecialpages' => '特別頁',
 'faq' => 'FAQ',
@@ -613,11 +611,8 @@ $1',
 # Login and logout pages
 'logouttext' => "'''你而家已經登出咗。'''
 
-你重可以用匿名身份用{{SITENAME}},又或者[[Special:UserLogin|重新登入]]
+你重可以用匿名身份用{{SITENAME}},又或者<span class='plainlinks'>[$1 重新登入]</span>
 但係留意某啲頁面可能會繼續話你未登入,除非等你清除瀏覽器嘅快取儲存。",
-'welcomecreation' => '== 歡迎, $1! ==
-
-你個戶口已經起好。唔好唔記得去改改你嘅[[Special:Preferences|{{SITENAME}}喜好設定]]喎。',
 'yourname' => '用戶名:',
 'yourpassword' => '密碼:',
 'yourpasswordagain' => '再輸入密碼:',
@@ -1147,8 +1142,6 @@ $1",
 'search-interwiki-caption' => '姊妹計劃',
 'search-interwiki-default' => '$1項結果:',
 'search-interwiki-more' => '(更多)',
-'search-mwsuggest-enabled' => '有建議',
-'search-mwsuggest-disabled' => '無建議',
 'search-relatedarticle' => '有關',
 'mwsuggest-disable' => '停用AJAX建議',
 'searcheverything-enable' => '搵全部空間名',
@@ -2043,11 +2036,7 @@ Template:搞清楚',
 
 'enotif_mailer' => '{{SITENAME}}通知郵遞員',
 'enotif_reset' => '將所有頁面標成已視察',
-'enotif_newpagetext' => '呢個係一個新頁面。',
 'enotif_impersonal_salutation' => '{{SITENAME}}用戶',
-'changed' => '修改過',
-'created' => '建立過',
-'enotif_subject' => '{{SITENAME}}嘅頁面$PAGETITLE已由$PAGEEDITOR$CHANGEDORCREATED',
 'enotif_lastvisited' => '你上次視察以嚟嘅修改請睇$1。',
 'enotif_lastdiff' => '睇$1去睇吓呢一次更改。',
 'enotif_anon_editor' => '匿名用戶$1',
@@ -3376,4 +3365,8 @@ MediaWiki是基於使用目的而加以發佈,但係就唔會負上任何嘅
 'revdelete-unrestricted' => '已經拎走對於操作員嘅限制',
 'newuserlog-byemail' => '密碼已由電郵寄出',
 
+# Search suggestions
+'searchsuggest-search' => '搵嘢',
+'searchsuggest-containing' => '名單傳送緊...',
+
 );
index 3dc35f0..bf2e700 100644 (file)
@@ -17,193 +17,191 @@ $messages = array(
 'underline-never' => 'coengz mbouj swjyungh',
 
 # Dates
-'sunday'        => 'Swnggeiz Yaet',
-'monday'        => 'Swnggeiz Wtx',
-'tuesday'       => 'Swnggeiz Yeih',
-'wednesday'     => 'Swnggeiz Sam',
-'thursday'      => 'Swnggeiz Seiq',
-'friday'        => 'Swnggeiz Haj',
-'saturday'      => 'Swnggeiz Lokj',
-'sun'           => 'Ngoenz',
-'mon'           => 'It',
-'tue'           => 'Ngeih',
-'wed'           => 'Sam',
-'thu'           => 'Seiq',
-'fri'           => 'Ngux',
-'sat'           => 'Loeg',
-'january'       => 'Nin Wtj',
-'february'      => 'Nin Yeih',
-'march'         => 'Nin Sam',
-'april'         => 'Nin Seiq',
-'may_long'      => 'Nin Haj',
-'june'          => 'Nin Loekj',
-'july'          => 'Nin Caet',
-'august'        => 'Nin Betq',
-'september'     => 'Nin Gouj',
-'october'       => 'Nin Cwbx',
-'november'      => 'Nin Cwbx Wtj',
-'december'      => 'Nin Cwbx Yeih',
-'january-gen'   => 'It nyied',
-'february-gen'  => 'Ngeih nyied',
-'march-gen'     => 'Sam nyied',
-'april-gen'     => 'Seiq nyied',
-'may-gen'       => 'Nin Haj',
-'june-gen'      => 'Loeg nyied',
-'july-gen'      => 'Caet nyied',
-'august-gen'    => 'Bet nyied',
+'sunday' => 'Swnggeiz Yaet',
+'monday' => 'Swnggeiz Wtx',
+'tuesday' => 'Swnggeiz Yeih',
+'wednesday' => 'Swnggeiz Sam',
+'thursday' => 'Swnggeiz Seiq',
+'friday' => 'Swnggeiz Haj',
+'saturday' => 'Swnggeiz Lokj',
+'sun' => 'Ngoenz',
+'mon' => 'It',
+'tue' => 'Ngeih',
+'wed' => 'Sam',
+'thu' => 'Seiq',
+'fri' => 'Ngux',
+'sat' => 'Loeg',
+'january' => 'Nin Wtj',
+'february' => 'Nin Yeih',
+'march' => 'Nin Sam',
+'april' => 'Nin Seiq',
+'may_long' => 'Nin Haj',
+'june' => 'Nin Loekj',
+'july' => 'Nin Caet',
+'august' => 'Nin Betq',
+'september' => 'Nin Gouj',
+'october' => 'Nin Cwbx',
+'november' => 'Nin Cwbx Wtj',
+'december' => 'Nin Cwbx Yeih',
+'january-gen' => 'It nyied',
+'february-gen' => 'Ngeih nyied',
+'march-gen' => 'Sam nyied',
+'april-gen' => 'Seiq nyied',
+'may-gen' => 'Nin Haj',
+'june-gen' => 'Loeg nyied',
+'july-gen' => 'Caet nyied',
+'august-gen' => 'Bet nyied',
 'september-gen' => 'Nin Gouj',
-'october-gen'   => 'Cib nyied',
-'november-gen'  => 'Cibit nyied',
-'december-gen'  => 'Cibngeih nyied',
-'jan'           => 'Itnyied',
-'feb'           => 'Ngeihnyied',
-'mar'           => 'Samnyied',
-'apr'           => 'Seiqnyied',
-'may'           => 'Nguxnyied',
-'jun'           => 'Loegnyied',
-'jul'           => 'Caetnyied',
-'aug'           => 'Batnyied',
-'sep'           => 'Goujnyied',
-'oct'           => 'Cibnyied',
-'nov'           => "Cib'itnyied",
-'dec'           => 'Cibngeihnyied',
+'october-gen' => 'Cib nyied',
+'november-gen' => 'Cibit nyied',
+'december-gen' => 'Cibngeih nyied',
+'jan' => 'Itnyied',
+'feb' => 'Ngeihnyied',
+'mar' => 'Samnyied',
+'apr' => 'Seiqnyied',
+'may' => 'Nguxnyied',
+'jun' => 'Loegnyied',
+'jul' => 'Caetnyied',
+'aug' => 'Batnyied',
+'sep' => 'Goujnyied',
+'oct' => 'Cibnyied',
+'nov' => "Cib'itnyied",
+'dec' => 'Cibngeihnyied',
 
 # Categories related messages
 'pagecategories' => '{{PLURAL:$1$1 aen|faendingz|faendingz}}',
-'subcategories'  => 'Faendingz lwgsai',
+'subcategories' => 'Faendingz lwgsai',
 
-'about'      => 'Gvendaengz',
-'article'    => 'Banjbienj',
-'cancel'     => 'Fwtqfex',
-'mytalk'     => 'Gaeq gou gangj',
+'about' => 'Gvendaengz',
+'article' => 'Banjbienj',
+'cancel' => 'Fwtqfex',
+'mytalk' => 'Gaeq gou gangj',
 'navigation' => 'Dazzaeuh',
 
 # Cologne Blue skin
-'qbfind'         => 'Ra',
-'qbedit'         => 'Gaij',
-'qbmyoptions'    => 'Yieb gou',
+'qbfind' => 'Ra',
+'qbedit' => 'Gaij',
+'qbmyoptions' => 'Yieb gou',
 'qbspecialpages' => 'Doenghmae daegxsei',
-'faq'            => 'Cam caeuq dap',
-'faqpage'        => 'Project:Cam caeuq dap',
+'faq' => 'Cam caeuq dap',
+'faqpage' => 'Project:Cam caeuq dap',
 
 # Vector skin
-'vector-action-delete'  => 'Ca',
-'vector-action-move'    => 'Daen',
+'vector-action-delete' => 'Ca',
+'vector-action-move' => 'Daen',
 'vector-action-protect' => 'Bauj',
-'vector-view-create'    => 'Laeb',
-'vector-view-edit'      => 'gaij',
-'vector-view-history'   => 'Cazyawj lizsij',
-
-'errorpagetitle'   => 'Loengloek',
-'tagline'          => 'okcih {{SITENAME}}',
-'help'             => 'Bangcoh',
-'search'           => 'Cwmh',
-'searchbutton'     => 'Cwmh',
-'go'               => 'Bae',
-'searcharticle'    => 'Bae',
-'history'          => 'Lizsij',
-'history_short'    => 'Lizsij',
+'vector-view-create' => 'Laeb',
+'vector-view-edit' => 'gaij',
+'vector-view-history' => 'Cazyawj lizsij',
+
+'errorpagetitle' => 'Loengloek',
+'tagline' => 'okcih {{SITENAME}}',
+'help' => 'Bangcoh',
+'search' => 'Cwmh',
+'searchbutton' => 'Cwmh',
+'go' => 'Bae',
+'searcharticle' => 'Bae',
+'history' => 'Lizsij',
+'history_short' => 'Lizsij',
 'printableversion' => 'Gojyaenq banj',
-'permalink'        => 'Gaeq-lamh kaemdaengz',
-'edit'             => 'gaij',
-'create'           => 'Laeb',
-'delete'           => 'Duz',
-'protect'          => 'Hahdiuz',
-'protect_change'   => 'gaij',
-'newpage'          => 'Bienj moq',
-'talkpage'         => 'Dunjlun yieb neix',
+'permalink' => 'Gaeq-lamh kaemdaengz',
+'edit' => 'gaij',
+'create' => 'Laeb',
+'delete' => 'Duz',
+'protect' => 'Hahdiuz',
+'protect_change' => 'gaij',
+'newpage' => 'Bienj moq',
+'talkpage' => 'Dunjlun yieb neix',
 'talkpagelinktext' => 'Daujlun',
-'personaltools'    => 'Hongdawz bonjfaenh',
-'talk'             => 'Kwng',
-'views'            => 'Cazyawj',
-'toolbox'          => 'Loengx hong',
-'jumpto'           => 'Diuq bae',
+'personaltools' => 'Hongdawz bonjfaenh',
+'talk' => 'Kwng',
+'views' => 'Cazyawj',
+'toolbox' => 'Loengx hong',
+'jumpto' => 'Diuq bae',
 'jumptonavigation' => 'Dazzaeuh',
-'jumptosearch'     => 'Ra',
+'jumptosearch' => 'Ra',
 
 # 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'            => 'Gvanhyih {{SITENAME}}',
-'aboutpage'            => 'Project:gvanhyih',
-'currentevents'        => 'Saehgienh seizneix',
-'disclaimers'          => 'gangjmingz mienxcwz',
-'disclaimerpage'       => 'Project:Itbuen mienxcwz',
-'edithelp'             => 'Caeuq mungz san-zonz',
-'edithelppage'         => 'Help:gaij',
-'helppage'             => 'Help:moegloeg',
-'mainpage'             => 'Yiebdaeuz',
+'aboutsite' => 'Gvanhyih {{SITENAME}}',
+'aboutpage' => 'Project:gvanhyih',
+'currentevents' => 'Saehgienh seizneix',
+'disclaimers' => 'gangjmingz mienxcwz',
+'disclaimerpage' => 'Project:Itbuen mienxcwz',
+'edithelp' => 'Caeuq mungz san-zonz',
+'edithelppage' => 'Help:gaij',
+'helppage' => 'Help:moegloeg',
+'mainpage' => 'Yiebdaeuz',
 'mainpage-description' => 'Yiebdeauz',
-'policy-url'           => 'Project:fuengcim',
-'portal'               => 'Segih',
-'portal-url'           => 'Project:seqgih',
-'privacy'              => 'Seiyaem cwngcwz',
-'privacypage'          => 'Project:Seiyaem cwngcwz',
+'policy-url' => 'Project:fuengcim',
+'portal' => 'Segih',
+'portal-url' => 'Project:seqgih',
+'privacy' => 'Seiyaem cwngcwz',
+'privacypage' => 'Project:Seiyaem cwngcwz',
 
-'badaccess'        => 'Loengloek gienzhanh',
+'badaccess' => 'Loengloek gienzhanh',
 'badaccess-group0' => 'Cingjgouz mwngz mbouj haengj ciuqguh.',
 'badaccess-groups' => 'Cingjgouz mwngz hanh youq {{PLURAL:$2|neix|gijneix}} bouxyungh: $1',
 
-'versionrequired'     => 'Sihyau MediaWiki $1',
+'versionrequired' => 'Sihyau MediaWiki $1',
 'versionrequiredtext' => 'Sihyau MediaWik $1 caengj daeng sawjyungh.',
 
 'youhavenewmessages' => 'Mungz meiz $1($2)。',
-'editsection'        => 'gaij',
-'editold'            => 'gaij',
-'editlink'           => 'gaij',
-'editsectionhint'    => 'Gaij duenh:$1',
-'showtoc'            => "yienh'ok",
-'hidetoc'            => 'cangz',
+'editsection' => 'gaij',
+'editold' => 'gaij',
+'editlink' => 'gaij',
+'editsectionhint' => 'Gaij duenh:$1',
+'showtoc' => "yienh'ok",
+'hidetoc' => 'cangz',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Feanzcieng',
-'nstab-user'      => 'Yieb bouxsawjyungq',
-'nstab-project'   => 'Yieb giva',
-'nstab-image'     => 'Vwnzgen',
+'nstab-main' => 'Feanzcieng',
+'nstab-user' => 'Yieb bouxsawjyungq',
+'nstab-project' => 'Yieb giva',
+'nstab-image' => 'Vwnzgen',
 'nstab-mediawiki' => 'Siuhsik',
-'nstab-template'  => 'Mozbanj',
-'nstab-help'      => 'Yieb bangcoh',
-'nstab-category'  => 'Faendingz',
+'nstab-template' => 'Mozbanj',
+'nstab-help' => 'Yieb bangcoh',
+'nstab-category' => 'Faendingz',
 
 # General errors
 'viewsource' => 'Liuq lagh mae-nej',
 
 # Login and logout pages
-'yourname'                => 'Ciu bouxdeiz:',
-'yourpassword'            => 'Mizmak:',
-'login'                   => 'Dwnghluz',
+'yourname' => 'Ciu bouxdeiz:',
+'yourpassword' => 'Mizmak:',
+'login' => 'Dwnghluz',
 'nav-login-createaccount' => 'dwngh haeuj/laebbaen canghu',
-'userlogin'               => 'Daengh haeuj/Laeb bouxdeiz',
-'logout'                  => 'Doiq ok',
-'userlogout'              => 'Doiq ok',
-'notloggedin'             => 'Maengx laezhaej',
-'nologinlink'             => 'Laeb bouxdeiz',
+'userlogin' => 'Daengh haeuj/Laeb bouxdeiz',
+'logout' => 'Doiq ok',
+'userlogout' => 'Doiq ok',
+'notloggedin' => 'Maengx laezhaej',
+'nologinlink' => 'Laeb bouxdeiz',
 
 # Edit pages
-'summary'     => 'Saegmangj:',
-'minoredit'   => 'Di-nej gaij noix',
-'watchthis'   => 'Gamyawj yieb neix',
+'summary' => 'Saegmangj:',
+'minoredit' => 'Di-nej gaij noix',
+'watchthis' => 'Gamyawj yieb neix',
 'savearticle' => 'Zonzdiuz mae-nej',
 'showpreview' => 'Okqhaej piu-ngoengx',
-'showdiff'    => 'Okqhaej gaeqgaei',
-'newarticle'  => '(Moq)',
+'showdiff' => 'Okqhaej gaeqgaei',
+'newarticle' => '(Moq)',
 
 # Diffs
 'editundo' => 'siu',
 
 # Search results
-'searchresults'             => 'gietgoj ra',
-'searchresults-title'       => 'doiq "$1" gij gietgoj ra',
-'search-interwiki-more'     => '(more)',
-'search-mwsuggest-enabled'  => 'miz genyi',
-'search-mwsuggest-disabled' => 'mbouj miz genyi',
-'powersearch'               => 'Cwmh goeggiz',
-'powersearch-legend'        => 'Gauhgiz saeu',
-'powersearch-redir'         => 'Cungzdinghyiengq liedbiuj',
+'searchresults' => 'gietgoj ra',
+'searchresults-title' => 'doiq "$1" gij gietgoj ra',
+'search-interwiki-more' => '(more)',
+'powersearch' => 'Cwmh goeggiz',
+'powersearch-legend' => 'Gauhgiz saeu',
+'powersearch-redir' => 'Cungzdinghyiengq liedbiuj',
 
 # Preferences page
-'mypreferences'     => 'Doenghgaeq gou hae',
-'prefsnologin'      => 'Maengx laezhaej',
+'mypreferences' => 'Doenghgaeq gou hae',
+'prefsnologin' => 'Maengx laezhaej',
 'searchresultshead' => 'Cwmh',
-'username'          => 'Ciu bouxdeiz:',
+'username' => 'Ciu bouxdeiz:',
 
 'group-user-member' => '{{GENDER:$1|Bouxsawjyungq}}',
 
@@ -211,33 +209,33 @@ $messages = array(
 'action-edit' => 'gaij yieb neix',
 
 # Recent changes
-'recentchanges'   => 'Gaeqgaij seizneix',
-'diff'            => 'Faenbied',
-'hide'            => 'Cangz',
-'show'            => "Yienh'ok",
+'recentchanges' => 'Gaeqgaij seizneix',
+'diff' => 'Faenbied',
+'hide' => 'Cangz',
+'show' => "Yienh'ok",
 'minoreditletter' => 'n',
-'newpageletter'   => 'M',
-'boteditletter'   => 'g',
+'newpageletter' => 'M',
+'boteditletter' => 'g',
 
 # Recent changes linked
 'recentchangeslinked' => 'Lienh ok gaengaij',
 
 # Upload
-'upload'            => 'Cienz vwnzgen',
-'uploadnologin'     => 'Maengx laezhaej',
-'filedesc'          => 'Saegmangj',
+'upload' => 'Cienz vwnzgen',
+'uploadnologin' => 'Maengx laezhaej',
+'filedesc' => 'Saegmangj',
 'fileuploadsummary' => 'Saegmangj:',
-'uploadedimage'     => 'senq cienz "[[$1]]"',
-'watchthisupload'   => 'Demq mae-nej',
+'uploadedimage' => 'senq cienz "[[$1]]"',
+'watchthisupload' => 'Demq mae-nej',
 
 # Special:ListFiles
 'listfiles_user' => 'Bouxyungh',
 
 # File description page
-'filehist-current'  => 'seizneix',
+'filehist-current' => 'seizneix',
 'filehist-datetime' => 'Ngoenz/Seizgan',
-'filehist-user'     => 'Bouxsawjyungh',
-'filehist-comment'  => 'Gejgangj',
+'filehist-user' => 'Bouxsawjyungh',
+'filehist-comment' => 'Gejgangj',
 
 # Random page
 'randompage' => 'Mae zaihzex',
@@ -246,11 +244,11 @@ $messages = array(
 'statistics-pages' => 'Yieb',
 
 # Miscellaneous special pages
-'nbytes'            => '$1 {{PLURAL:$1|cihciet|cihciet}}',
-'newpages'          => 'Yieb moq',
+'nbytes' => '$1 {{PLURAL:$1|cihciet|cihciet}}',
+'newpages' => 'Yieb moq',
 'newpages-username' => 'Ciu bouxdeiz:',
-'move'              => 'Daen',
-'movethispage'      => 'Caen mae nej',
+'move' => 'Daen',
+'movethispage' => 'Caen mae nej',
 
 # Book sources
 'booksources-go' => 'Bae',
@@ -259,19 +257,19 @@ $messages = array(
 'log' => 'Ngoenzceiq',
 
 # Special:AllPages
-'allpages'       => 'Sojmiz yieb',
-'allarticles'    => 'Sojmiz yieb',
+'allpages' => 'Sojmiz yieb',
+'allarticles' => 'Sojmiz yieb',
 'allpagessubmit' => 'Bae',
 
 # Watchlist
-'watchlist'     => 'Yieb gou yawj',
-'mywatchlist'   => 'Gaeq gou demq',
-'watchnologin'  => 'Maengx laezhaej',
-'watch'         => 'Demq',
+'watchlist' => 'Yieb gou yawj',
+'mywatchlist' => 'Gaeq gou demq',
+'watchnologin' => 'Maengx laezhaej',
+'watch' => 'Demq',
 'watchthispage' => 'Demq mae-nej',
 
 # Displayed when you click the "watch" button and it is in the process of watching
-'watching'   => 'Bawxndu……',
+'watching' => 'Bawxndu……',
 'unwatching' => 'Souma bawxndu……',
 
 # Protect
@@ -281,48 +279,48 @@ $messages = array(
 'restriction-move' => 'Caen',
 
 # Namespace form on various pages
-'namespace'      => 'ndawhoengq mingzcih:',
+'namespace' => 'ndawhoengq mingzcih:',
 'blanknamespace' => '(Cujyau)',
 
 # Contributions
 'contributions' => 'Gaeq bouxdeiz haej',
-'mycontris'     => 'Gaeq gou haej',
-'uctop'         => '(dingz)',
+'mycontris' => 'Gaeq gou haej',
+'uctop' => '(dingz)',
 
 'sp-contributions-submit' => 'Ra',
 
 # What links here
-'whatlinkshere'      => 'Maelaez lamh haenznej',
+'whatlinkshere' => 'Maelaez lamh haenznej',
 'whatlinkshere-page' => 'Yieb:',
 
 # Block/unblock
 'ipblocklist-submit' => 'Cwmh',
-'contribslink'       => "gung'yen",
+'contribslink' => "gung'yen",
 
 # Move page
 'move-page-legend' => 'Caen doengh mae',
-'movearticle'      => 'Caen doengh mae:',
-'movenologin'      => 'Maengx laezhaej',
-'move-watch'       => 'Demq mae-nej',
-'movepagebtn'      => 'Caen doengh mae',
-'movedto'          => 'Caen bei',
-'movereason'       => 'Haujgaemj',
-'revertmove'       => 'siu',
+'movearticle' => 'Caen doengh mae:',
+'movenologin' => 'Maengx laezhaej',
+'move-watch' => 'Demq mae-nej',
+'movepagebtn' => 'Caen doengh mae',
+'movedto' => 'Caen bei',
+'movereason' => 'Haujgaemj',
+'revertmove' => 'siu',
 
 # Tooltip help for the actions
-'tooltip-pt-mytalk'      => 'Yieb daujlun mwngz',
+'tooltip-pt-mytalk' => 'Yieb daujlun mwngz',
 'tooltip-pt-preferences' => 'Doenghgaeq gou hae',
-'tooltip-pt-logout'      => 'Doiq ok',
-'tooltip-ca-talk'        => 'Gvanhyih cingqfaenz yieb gij daojun',
-'tooltip-ca-history'     => 'yieb neix gij banj lizsij',
-'tooltip-ca-move'        => 'Dean yieb neix',
-'tooltip-search'         => 'Ra {{SITENAME}}',
-'tooltip-p-logo'         => 'Mae meh',
-'tooltip-n-mainpage'     => 'Raen Yiebdaeuz',
-'tooltip-n-randompage'   => 'Cang haeuj yieb seizgih',
-'tooltip-n-help'         => 'Cimh gouz bangcoh',
-'tooltip-t-upload'       => 'Cienz vwnzgen',
-'tooltip-ca-nstab-main'  => 'Cazyawj ndawyungz yieb',
+'tooltip-pt-logout' => 'Doiq ok',
+'tooltip-ca-talk' => 'Gvanhyih cingqfaenz yieb gij daojun',
+'tooltip-ca-history' => 'yieb neix gij banj lizsij',
+'tooltip-ca-move' => 'Dean yieb neix',
+'tooltip-search' => 'Ra {{SITENAME}}',
+'tooltip-p-logo' => 'Mae meh',
+'tooltip-n-mainpage' => 'Raen Yiebdaeuz',
+'tooltip-n-randompage' => 'Cang haeuj yieb seizgih',
+'tooltip-n-help' => 'Cimh gouz bangcoh',
+'tooltip-t-upload' => 'Cienz vwnzgen',
+'tooltip-ca-nstab-main' => 'Cazyawj ndawyungz yieb',
 
 # Special:NewFiles
 'ilsubmit' => 'Cwmh',
@@ -330,7 +328,7 @@ $messages = array(
 # 'all' in various places, this might be different for inflected languages
 'watchlistall2' => 'cenzbu',
 'namespacesall' => 'cenzbu',
-'monthsall'     => 'cenzbu',
+'monthsall' => 'cenzbu',
 
 # Multipage image navigation
 'imgmultigo' => 'Bei!',
index a326277..7ce17b5 100644 (file)
@@ -187,7 +187,6 @@ $messages = array(
 'qbbrowse' => 'Blaeren',
 'qbedit' => 'Bewerk',
 'qbpageoptions' => 'Paginaopties',
-'qbpageinfo' => 'Pagina-informaotie',
 'qbmyoptions' => 'Mien opties',
 'qbspecialpages' => 'Speciaole pahina’s',
 'faq' => 'FAQ (veehestelde vraehen)',
@@ -418,9 +417,6 @@ De heheven reeën is ''$2''.",
 
 Je kan {{SITENAME}} noe anoniem gebruken of wee anmelden as dezelven of een aore gebruker.
 Meuhlijk worn nog een antal pagina's weereheven asof a je anemeld bin totda je de cache van je browser leeg.",
-'welcomecreation' => '== Welkom, $1! ==
-Jen account is anemikt.
-Vergeet nie je [[Special:Preferences|vòkeuren voe {{SITENAME}}]] an te passen.',
 'yourname' => 'Gebrukersnaem',
 'yourpassword' => 'Wachtwoôrd',
 'yourpasswordagain' => 'Heef je wachtwoôrd opnieuw in:',
index d5e806d..adfd565 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Simplified Chinese (‪中文(简体)‬)
+/** Simplified Chinese (中文(简体)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -35,6 +35,7 @@
  * @author Kuailong
  * @author Liangent
  * @author Linforest
+ * @author Makecat
  * @author Mark85296341
  * @author MarkAHershberger
  * @author Mys 721tx
@@ -178,7 +179,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( '最近更改' ),
        'Recentchangeslinked'       => array( '链出更改' ),
        'Revisiondelete'            => array( '删除或恢复修订' ),
-       'RevisionMove'              => array( '修订版本移动' ),
        'Search'                    => array( '搜索' ),
        'Shortpages'                => array( '短页面' ),
        'Specialpages'              => array( '特殊页面' ),
@@ -233,7 +233,20 @@ $magicWords = array(
        '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' ),
        'fullpagename'              => array( '1', '完整页面名', 'FULLPAGENAME' ),
+       'fullpagenamee'             => array( '1', '完整页面名E', 'FULLPAGENAMEE' ),
+       'subpagename'               => array( '1', '子页面名', 'SUBPAGENAME' ),
+       'subpagenamee'              => array( '1', '子页面名E', 'SUBPAGENAMEE' ),
+       'talkpagename'              => array( '1', '讨论页面名', 'TALKPAGENAME' ),
+       'talkpagenamee'             => array( '1', '讨论页面名E', 'TALKPAGENAMEE' ),
+       'subst'                     => array( '0', '替代:', 'SUBST:' ),
+       'safesubst'                 => array( '0', '安全替代:', 'SAFESUBST:' ),
        'img_thumbnail'             => array( '1', '缩略图', 'thumbnail', 'thumb' ),
        'img_manualthumb'           => array( '1', '缩略图=$1', 'thumbnail=$1', 'thumb=$1' ),
        'img_right'                 => array( '1', '右', 'right' ),
@@ -241,14 +254,65 @@ $magicWords = array(
        '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_border'                => array( '1', '有边', 'border' ),
        'img_link'                  => array( '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', '名字空间E:', 'NSE:' ),
+       'localurl'                  => array( '0', '本地URL:', 'LOCALURL:' ),
+       'localurle'                 => array( '0', '本地URLE:', 'LOCALURLE:' ),
+       'articlepath'               => array( '0', '条目路径', 'ARTICLEPATH' ),
+       'pageid'                    => array( '0', '页面ID', '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__' ),
+       'lcfirst'                   => array( '0', '小写首字:', 'LCFIRST:' ),
+       'ucfirst'                   => array( '0', '大写首字:', 'UCFIRST:' ),
+       'lc'                        => array( '0', '小写:', 'LC:' ),
+       'uc'                        => array( '0', '大写:', 'UC:' ),
+       'displaytitle'              => array( '1', '显示标题', 'DISPLAYTITLE' ),
        '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' ),
+       'speciale'                  => array( '0', '特殊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' ),
+       'defaultsort_noerror'       => array( '0', '不报错', 'noerror' ),
+       'defaultsort_noreplace'     => array( '0', '不替换', 'noreplace' ),
 );
 
 $linkTrail = '/^()(.*)$/sD';
@@ -327,7 +391,7 @@ $messages = array(
 
 'underline-always' => '总是使用',
 'underline-never' => '从不使用',
-'underline-default' => '浏览器默认',
+'underline-default' => '浏览器默认设置',
 
 # Font style option in Special:Preferences
 'editfont-style' => '编辑区字体样式:',
@@ -405,15 +469,15 @@ $messages = array(
 'listingcontinuesabbrev' => '续',
 'index-category' => '允许索引的页面',
 'noindex-category' => '禁止索引的页面',
-'broken-file-category' => '损坏的文件的链接的页面',
+'broken-file-category' => '包含损坏的文件链接的页面',
 
 'about' => '关于',
 'article' => '内容页面',
 'newwindow' => '(将于新窗口中打开)',
 'cancel' => '取消',
 'moredotdotdot' => '更多',
-'mypage' => '我的页面',
-'mytalk' => '我的讨论',
+'mypage' => '页面',
+'mytalk' => '讨论',
 'anontalk' => '该IP地址的讨论',
 'navigation' => '导航',
 'and' => '和',
@@ -423,7 +487,6 @@ $messages = array(
 'qbbrowse' => '浏览',
 'qbedit' => '编辑',
 'qbpageoptions' => '页面选项',
-'qbpageinfo' => '页面信息',
 'qbmyoptions' => '我的选项',
 'qbspecialpages' => '特殊页面',
 'faq' => '常见问题',
@@ -436,7 +499,7 @@ $messages = array(
 'vector-action-protect' => '保护',
 'vector-action-undelete' => '恢复',
 'vector-action-unprotect' => '更改保护',
-'vector-simplesearch-preference' => '启用增强搜索建议(仅限Vector皮肤)',
+'vector-simplesearch-preference' => '启用简化搜索栏(仅Vector皮肤)',
 'vector-view-create' => '创建',
 'vector-view-edit' => '编辑',
 'vector-view-history' => '查看历史',
@@ -446,6 +509,7 @@ $messages = array(
 'namespaces' => '名字空间',
 'variants' => '变换',
 
+'navigation-heading' => '导航菜单',
 'errorpagetitle' => '错误',
 'returnto' => '返回到$1。',
 'tagline' => '来自{{SITENAME}}',
@@ -456,7 +520,7 @@ $messages = array(
 'searcharticle' => '提交',
 'history' => '页面历史',
 'history_short' => '历史',
-'updatedmarker' => 'æ\88\91ä¸\8a次访é\97®ä»¥æ\9d¥ç\9a\84ä¿®æ\94¹',
+'updatedmarker' => 'æ\88\91ä¸\8a次访é\97®ä¹\8bå\90\8eç\9a\84æ\9b´æ\96°',
 'printableversion' => '打印版本',
 'permalink' => '永久链接',
 'print' => '打印',
@@ -545,7 +609,7 @@ $1',
 'newmessagesdifflink' => '最后更改',
 'youhavenewmessagesfromusers' => '你有来自{{PLURAL:$3| 另一位用户| $3位用户}}的$1($2)。',
 'youhavenewmessagesmanyusers' => '你有来自多位用户的$1($2)。',
-'newmessageslinkplural' => '{{PLURAL:$1|一条新信息|$1条信息}}',
+'newmessageslinkplural' => '{{PLURAL:$1|一条新信息|信息}}',
 'newmessagesdifflinkplural' => '最新$1次更改',
 'youhavenewmessagesmulti' => '你在$1有新信息',
 'editsection' => '编辑',
@@ -553,7 +617,7 @@ $1',
 'viewsourceold' => '查看源代码',
 'editlink' => '编辑',
 'viewsourcelink' => '查看源代码',
-'editsectionhint' => '编辑段落:$1',
+'editsectionhint' => '编辑章节:$1',
 'toc' => '目录',
 'showtoc' => '显示',
 'hidetoc' => '隐藏',
@@ -596,9 +660,12 @@ $1',
 # General errors
 'error' => '错误',
 'databaseerror' => '数据库错误',
-'dberrortext' => '发生了数据库查询语法错误,可能是由于软件自身的错误所引起。最后一次数据库查询指令是:
-<blockquote><tt>$1</tt></blockquote>
-来自函数“<tt>$2</tt>”内。数据库返回错误“<tt>$3: $4</tt>”。',
+'dberrortext' => '发生数据库查询语法错误。
+可能是由于软件自身的错误所引起。
+最后一次数据库查询指令是:
+<blockquote><code>$1</code></blockquote>
+来自于函数“<code>$2</code>”。
+数据库返回错误“<samp>$3: $4</samp>”。',
 'dberrortextcl' => '发生了数据库查询语法错误。最后一次数据库查询指令是:
 “$1”
 来自函数“$2”内。数据库返回错误“$3: $4”。',
@@ -638,7 +705,8 @@ $1',
 'badtitletext' => '所请求页面的标题是无效的、不存在,跨语言或跨wiki链接的标题错误。它可能包含一个或更多的不能用于标题的字符。',
 'perfcached' => '下列数据已缓存,但可能已过时。最高{{PLURAL:$1|一个结果|$1个结果}}在缓存中可用。',
 'perfcachedts' => '下列数据已缓存,最后更新于$1。缓存中最多可有{{PLURAL:$4|1个结果|$4个结果}}。',
-'querypage-no-updates' => '当前禁止对此页面进行更新。此处的数据将不能被立即刷新。',
+'querypage-no-updates' => '当前禁止对此页面进行更新。
+此处的数据将不能被立即刷新。',
 'wrong_wfQuery_params' => '错误的参数被传递到 wfQuery()<br />
 函数:$1<br />
 查询:$2',
@@ -646,11 +714,14 @@ $1',
 'viewsource-title' => '查看$1的源代码',
 'actionthrottled' => '操作被限制',
 'actionthrottledtext' => '基于反垃圾的考量,您被限制在短时间内多次重复该操作,但您已超过此上限。请在数分钟后再尝试。',
-'protectedpagetext' => '该页面已被保护以防止编辑。',
+'protectedpagetext' => '该页面已被保护以防止编辑和其他操作。',
 'viewsourcetext' => '您可以查看并复制此页面的源代码:',
 'viewyourtext' => "您可以查看并复制'''您对此页面作出编辑后'''的源代码:",
-'protectedinterface' => '该页提供了软件的界面文本,它已被保护以防止随意的修改。',
-'editinginterface' => "'''警告:''' 您正在编辑的页面是用于提供软件的界面文本。改变此页将影响其他用户的界面外观。如要翻译,请考虑使用[//translatewiki.net/wiki/Main_Page?setlang=zh-hans translatewiki.net],一个用来为MediaWiki软件本地化的计划。",
+'protectedinterface' => '该页提供此wiki软件的界面文字,它已被保护以防止恶意修改。
+如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。',
+'editinginterface' => "'''警告:'''您正在编辑的页面是用于提供软件的界面文字。
+改变此页将影响其他在此wiki上的用户界面外观。
+如欲修改所有wiki的翻译,请到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化计划。",
 'sqlhidden' => '(SQL查询已隐藏)',
 'cascadeprotected' => '此页面已被保护,因为这个页面被以下已标注“联锁保护”的{{PLURAL:$1|一个|多个}}被保护页面包含:
 $2',
@@ -675,9 +746,10 @@ $2',
 # Login and logout pages
 'logouttext' => "'''您现在已经退出。'''
 
-您可以继续以匿名方式使用{{SITENAME}},或再次以相同或不同用户身份[[Special:UserLogin|登录]]。请注意一些页面可能仍然显示您为登录状态,直到您清空您的浏览器缓存为止。",
-'welcomecreation' => '== 欢迎,$1! ==
-你的账户已创建。请别忘记更改你的[[Special:Preferences|{{SITENAME}}系统设置]]。',
+您可以继续以匿名方式使用{{SITENAME}},或再次以相同或不同用户身份<span class='plainlinks'>[$1 登录]</span>。请注意一些页面可能仍然显示您为登录状态,直到您清空您的浏览器缓存为止。",
+'welcomeuser' => '欢迎,$1!',
+'welcomecreation-msg' => '你的账户已创建。
+请别忘记更改你的[[Special:Preferences|{{SITENAME}}参数设置]]。',
 'yourname' => '用户名:',
 'yourpassword' => '密码:',
 'yourpasswordagain' => '再次输入密码:',
@@ -893,8 +965,8 @@ $2
 如果您误入此页,请点击浏览器中的“返回”按钮。',
 '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}}|搜索此页标题]],
\88\96<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} æ\90\9cç´¢æ\9c\89å\85³æ\97¥å¿\97]</span>。',
+'noarticletext-nopermission' => '此页目前没有内容
\82¨å\8f¯ä»¥å\9c¨å\85¶å®\83页[[Special:Search/{{PAGENAME}}|æ\90\9c寻此页æ \87é¢\98]]ï¼\8cæ\88\96<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} æ\90\9c寻æ\9c\89å\85³æ\97¥å¿\97]</span>ï¼\8cä½\86æ\82¨æ²¡æ\9c\89æ\9d\83é\99\90建ç«\8b此页。',
 'missing-revision' => '“{{PAGENAME}}”的修订#$1不存在。
 
 这通常是因为进入了一个已被删除的页面的历史链接。
@@ -922,7 +994,7 @@ $2
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
 'previewnote' => "'''请记住这仅为预览。'''您的更改还未保存!",
-'continue-editing' => '继续编辑',
+'continue-editing' => '往编辑框',
 'previewconflict' => '这个预览显示了上面文字编辑区中的内容。它将在你选择保存后出现。',
 'session_fail_preview' => "'''抱歉!由于会话数据丢失,我们不能处理你的编辑。'''请重试。如果再次失败,请尝试[[Special:UserLogout|退出]]后重新登录。",
 'session_fail_preview_html' => "'''抱歉!我们不能处理你在进程数据丢失时的编辑。'''
@@ -997,6 +1069,15 @@ $2
 'edit-already-exists' => '不可以建立一个新页面。
 它已经存在。',
 'defaultmessagetext' => '默认消息文本',
+'content-failed-to-parse' => '未能将 $2 内容转换为 $1:$3',
+'invalid-content-data' => '无效的内容数据',
+'content-not-allowed-here' => '[[$2]]页面上不允许“$1”内容',
+
+# Content models
+'content-model-wikitext' => 'wiki语法',
+'content-model-text' => '纯文本',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告:这个页面有太多高昂的语法功能调用。
@@ -1233,8 +1314,6 @@ $1",
 'search-interwiki-caption' => '姊妹项目',
 'search-interwiki-default' => '$1项结果:',
 'search-interwiki-more' => '(更多)',
-'search-mwsuggest-enabled' => '有建议',
-'search-mwsuggest-disabled' => '无建议',
 'search-relatedarticle' => '相关',
 'mwsuggest-disable' => '禁用AJAX建议',
 'searcheverything-enable' => '在所有名字空间中搜索',
@@ -1267,7 +1346,7 @@ $1",
 
 # Preferences page
 'preferences' => '系统设置',
-'mypreferences' => '我的设置',
+'mypreferences' => '系统设置',
 'prefs-edits' => '编辑数量:',
 'prefsnologin' => '尚未登录',
 'prefsnologintext' => '您必须先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登录]</span>才能设置个人参数。',
@@ -1494,6 +1573,9 @@ $1",
 'rightslogtext' => '这是用户权限更改的日志。',
 'rightslogentry' => '将$1的用户组由$2更改为$3',
 'rightslogentry-autopromote' => '被自动提升自$2至$3',
+'logentry-rights-rights' => '$1将$3的用户组从$4改为$5',
+'logentry-rights-rights-legacy' => '$1更改$3的用户组',
+'logentry-rights-autopromote' => '$1的用户组已自动从$4改为$5',
 'rightsnone' => '(无)',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1858,7 +1940,7 @@ $1',
 'shared-repo-from' => '出自$1',
 'shared-repo' => '一个共用文件库',
 'shared-repo-name-wikimediacommons' => '维基共享资源',
-'upload-disallowed-here' => '您不可以覆盖此图像',
+'upload-disallowed-here' => '您不可以覆盖此文件。',
 
 # File reversion
 'filerevert' => '恢复$1',
@@ -1991,7 +2073,7 @@ $1',
 'mostlinkedtemplates' => '最多链接模板',
 'mostcategories' => '最多分类页面',
 'mostimages' => '最多链接文件',
-'mostinterwikis' => '跨语言链接最多的页面',
+'mostinterwikis' => '最多跨语言链接页面',
 'mostrevisions' => '最多版本页面',
 'prefixindex' => '所有有前缀的页面',
 'prefixindex-namespace' => '所有有前缀的页面($1名字空间)',
@@ -2090,7 +2172,7 @@ $1',
 'linksearch-ns' => '名字空间:',
 'linksearch-ok' => '搜索',
 'linksearch-text' => '制作可以使用类似“*.wikipedia.org”的通配符。必须至少是顶级域名,例如“*.org”。<br />
-支持的协议:<code>$1</code>(不要包含在搜索中)。',
+支持的协议:<code>$1</code>(如果没有设置协议则默认为<nowiki>http://</nowiki>)。',
 'linksearch-line' => '$1 链自 $2',
 'linksearch-error' => '通配符仅可在主机名称的开头使用。',
 
@@ -2098,7 +2180,7 @@ $1',
 'listusersfrom' => '给定显示用户条件:',
 'listusers-submit' => '显示',
 'listusers-noresult' => '找不到用户。',
-'listusers-blocked' => '(已封é\94\81ï¼\89',
+'listusers-blocked' => '(已封ç¦\81ï¼\89',
 
 # Special:ActiveUsers
 'activeusers' => '活跃用户列表',
@@ -2139,7 +2221,7 @@ $1',
 'emailuser-title-target' => '电邮联系该{{GENDER:$1|用户}}',
 'emailuser-title-notarget' => '电邮联系',
 'emailpage' => '电邮联系',
-'emailpagetext' => '你可以使用下面的表格向该用户发送电子邮件信息。你在[[Special:Preferences|你的系统设置]]中输入的电子邮件地址将显示为邮件的“发件人”地址,所以该用户将可以直接回复你。',
+'emailpagetext' => '你可以使用下面的表单向该用户发送电子邮件消息。你在[[Special:Preferences|你的系统设置]]中输入的电子邮件地址将显示为该邮件的“发件人”地址,所以该用户将可以直接回复你。',
 'usermailererror' => 'Mail 对象返回错误:',
 'defemailsubject' => '{{SITENAME}}来自用户“$1”的电子邮件',
 'usermaildisabled' => '用户电邮已停用',
@@ -2205,11 +2287,7 @@ $1',
 
 'enotif_mailer' => '{{SITENAME}}通知发送器',
 'enotif_reset' => '标记所有页面为已访问',
-'enotif_newpagetext' => '该页面为新页面。',
 'enotif_impersonal_salutation' => '{{SITENAME}}用户',
-'changed' => '更改',
-'created' => '创建',
-'enotif_subject' => '{{SITENAME}}页面“$PAGETITLE”已被$PAGEEDITOR$CHANGEDORCREATED',
 'enotif_lastvisited' => '请浏览 $1 查看你上次访问后的所有更改。',
 'enotif_lastdiff' => '请浏览 $1 查看该更改。',
 'enotif_anon_editor' => '匿名用户$1',
@@ -2379,7 +2457,8 @@ $UNWATCHURL
 'undeletedrevisions' => '$1个版本已恢复',
 'undeletedrevisions-files' => '$1个版本和$2个文件已恢复',
 'undeletedfiles' => '$1个文件已经被恢复',
-'cannotundelete' => '恢复删除失败;可能已有其他人先行恢复了此页面。',
+'cannotundelete' => '恢复删除失败:
+$1',
 'undeletedpage' => "'''$1已经被恢复'''
 
 参考[[Special:Log/delete|删除日志]]查看删除及恢复记录。",
@@ -2410,9 +2489,9 @@ $1',
 'blanknamespace' => '(主要)',
 
 # Contributions
-'contributions' => '用户贡献',
+'contributions' => '{{GENDER:$1|用户}}贡献',
 'contributions-title' => '$1的用户贡献',
-'mycontris' => '我的贡献',
+'mycontris' => '贡献',
 'contribsub2' => '$1的贡献($2)',
 'nocontribs' => '没有找到符合特征的更改。',
 'uctop' => '(最后更改)',
@@ -2453,7 +2532,7 @@ $1',
 'whatlinkshere-hideredirs' => '$1重定向',
 'whatlinkshere-hidetrans' => '$1包含',
 'whatlinkshere-hidelinks' => '$1链接',
-'whatlinkshere-hideimages' => '$1文件链接',
+'whatlinkshere-hideimages' => '$1文件链接',
 'whatlinkshere-filters' => '过滤器',
 
 # Block/unblock
@@ -2679,6 +2758,7 @@ $1被封禁的理由是:“$2”',
 'immobile-target-namespace-iw' => '在移动页面时,跨wiki链接不是有效的目标。',
 'immobile-source-page' => '此页面不能移动。',
 'immobile-target-page' => '无法移动至该目标标题。',
+'bad-target-model' => '要求的目标使用不同的内容模式。无法从$1转换到$2。',
 'imagenocrossnamespace' => '无法将文件移动到非文件名字空间',
 'nonfile-cannot-move-to-file' => '无法将非文件移动到文件名字空间',
 'imagetypemismatch' => '该新扩展名与其类型不匹配',
@@ -2800,7 +2880,6 @@ $1被封禁的理由是:“$2”',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript测试',
-'javascripttest-disabled' => '该wiki站点上尚未启用此功能。',
 'javascripttest-title' => '运行$1测试',
 'javascripttest-pagetext-noframework' => '此页面被保留用于运行JavaScript测试。',
 'javascripttest-pagetext-unknownframework' => '未知的框架“$1”。',
@@ -2935,35 +3014,44 @@ $1被封禁的理由是:“$2”',
 'spam_deleting' => '正在删除所有包含至$1的版本',
 
 # Info page
-'pageinfo-title' => '"$1" 的信息',
+'pageinfo-title' => '“$1”的信息',
+'pageinfo-not-current' => '只能显示当前修订版本的信息。',
 'pageinfo-header-basic' => '基本信息',
 'pageinfo-header-edits' => '编辑历史',
 'pageinfo-header-restrictions' => '页面保护',
 'pageinfo-header-properties' => '页面属性',
 'pageinfo-display-title' => '显示的标题',
-'pageinfo-default-sort' => '默认排序',
+'pageinfo-default-sort' => '默认排序',
 'pageinfo-length' => '页面长度(字节)',
 'pageinfo-article-id' => '页面ID',
+'pageinfo-language' => '页面内容语言',
 'pageinfo-robot-policy' => '搜索引擎状态',
 'pageinfo-robot-index' => '可索引',
 'pageinfo-robot-noindex' => '不可索引',
-'pageinfo-views' => '视图的数量',
+'pageinfo-views' => '查看次数',
 'pageinfo-watchers' => '页面监视者人数',
 'pageinfo-redirects-name' => '重定向到本页',
 'pageinfo-subpages-name' => '本页的子页面',
 'pageinfo-subpages-value' => '$1 ($2个重定向;$3个非重定向)',
 'pageinfo-firstuser' => '页面创建者',
 'pageinfo-firsttime' => '页面创建日期',
-'pageinfo-lastuser' => '最近的编者',
+'pageinfo-lastuser' => '最后编辑',
 'pageinfo-lasttime' => '最后编辑的日期',
 'pageinfo-edits' => '总编辑次数',
 'pageinfo-authors' => '不同编者总计',
-'pageinfo-recent-edits' => '最近的编辑数 ($1天内)',
+'pageinfo-recent-edits' => '最近的编辑数($1内)',
 'pageinfo-recent-authors' => '最近的不同编者数',
-'pageinfo-restriction' => '页面保护 ({{lcfirst:$1}})',
-'pageinfo-magic-words' => '魔术字 ($1)',
-'pageinfo-hidden-categories' => '隐藏分类 ($1)',
-'pageinfo-templates' => '使用的模板 ($1)',
+'pageinfo-magic-words' => '魔术字($1)',
+'pageinfo-hidden-categories' => '隐藏分类($1)',
+'pageinfo-templates' => '使用的模板($1)',
+'pageinfo-toolboxlink' => '页面信息',
+'pageinfo-redirectsto' => '重定向到',
+'pageinfo-redirectsto-info' => '信息',
+'pageinfo-contentpage' => '计算为内容页',
+'pageinfo-contentpage-yes' => '是',
+'pageinfo-protect-cascading' => '从这里开始连锁保护',
+'pageinfo-protect-cascading-yes' => '是',
+'pageinfo-protect-cascading-from' => '保护级联自',
 
 # Skin names
 'skinname-standard' => '标准',
@@ -2982,6 +3070,8 @@ $1被封禁的理由是:“$2”',
 'markedaspatrollederror' => '不能标志为已检查',
 'markedaspatrollederrortext' => '你需要指定某个版本才能标志为已检查。',
 'markedaspatrollederror-noautopatrol' => '您无法将你自己所作的更改标记为已检查。',
+'markedaspatrollednotify' => '$1的更改已被标记为已巡查。',
+'markedaspatrollederrornotify' => '标记为已巡查失败。',
 
 # Patrol log
 'patrol-log-page' => '巡查日志',
@@ -3004,8 +3094,7 @@ $1',
 'nextdiff' => '下一编辑→',
 
 # Media information
-'mediawarning' => "'''警告''':该文件类型可能包含恶意代码。
-运行它可能对您的系统带来危险。",
+'mediawarning' => "'''警告''':该文件类型可能含有恶意代码。执行后你的系统可能受损。",
 'imagemaxsize' => '图像大小限制:<br /><u>(文件描述页)</u>',
 'thumbsize' => '缩略图大小:',
 'widthheightpage' => '$1×$2,$3页',
@@ -3222,7 +3311,7 @@ Variants for Chinese language
 'exif-worldregiondest' => '世界区域显示',
 'exif-countrydest' => '所示的国家',
 'exif-countrycodedest' => '国家代码',
-'exif-provinceorstatedest' => '省或状态显示',
+'exif-provinceorstatedest' => '省或',
 'exif-citydest' => '所示的城市',
 'exif-sublocationdest' => '显示城市中的详细地点',
 'exif-objectname' => '简称',
@@ -3561,6 +3650,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[跨网站的编码转换不可用]',
 'scarytranscludefailed' => '[提取$1失败]',
+'scarytranscludefailed-httpstatus' => '[模板$1读取失败:HTTP $2]',
 'scarytranscludetoolong' => '[URL过长]',
 
 # Delete conflict
@@ -3676,6 +3766,7 @@ $5
 'version-license' => '授权协议',
 'version-poweredby-credits' => "本Wiki由'''[//www.mediawiki.org/ MediaWiki]'''驱动,版权所有 © 2001-$1 $2。",
 'version-poweredby-others' => '其他',
+'version-credits-summary' => '我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。',
 'version-license-info' => 'MediaWiki为自由软件;您可依据自由软件基金会所发表的GNU通用公共授权条款规定,就本程序再为发布与/或修改;无论您依据的是本授权的第二版或(您自行选择的)任一日后发行的版本。
 
 MediaWiki是基于使用目的而加以发布,然而不负任何担保责任;亦无对适售性或特定目的适用性所为的默示性担保。详情请参照GNU通用公共授权。
@@ -3835,6 +3926,10 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'feedback-bugcheck' => '请检查本bug是否为[$1 已知bug]。',
 'feedback-bugnew' => '我检查了。报告新bug',
 
+# Search suggestions
+'searchsuggest-search' => '搜索',
+'searchsuggest-containing' => '含有...',
+
 # API errors
 'api-error-badaccess-groups' => '你没有将文件上传到此wiki的权限。',
 'api-error-badtoken' => '内部错误:会话无效。',
@@ -3873,8 +3968,8 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'api-error-unknown-error' => '内部错误:尝试上传文件时出错。',
 'api-error-unknown-warning' => '未知的警告:$1',
 'api-error-unknownerror' => '未知错误:$1。',
-'api-error-uploaddisabled' => '此wiki关闭了上传功能。',
-'api-error-verification-error' => '此文件可能已损坏,或有错误的扩展名。',
+'api-error-uploaddisabled' => '该wiki停用上传。',
+'api-error-verification-error' => '该文件可能损坏或扩展名错误。',
 
 # Durations
 'duration-seconds' => '$1秒',
@@ -3887,4 +3982,6 @@ MediaWiki是基于使用目的而加以发布,然而不负任何担保责任
 'duration-centuries' => '$1个世纪',
 'duration-millennia' => '$1千年',
 
+# Unknown messages
+'svg-long-error' => '无效的SVG文件:$1',
 );
index 62f778f..2faea22 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Traditional Chinese (‪中文(繁體)‬)
+/** Traditional Chinese (中文(繁體)‎)
  *
  * See MessagesQqq.php for message documentation incl. usage of parameters
  * To improve a translation please visit http://translatewiki.net
@@ -42,6 +42,7 @@
  * @author Wong128hk
  * @author Wrightbus
  * @author Xiaomingyan
+ * @author Yfdyh000
  * @author Yuyu
  */
 
@@ -170,7 +171,6 @@ $specialPageAliases = array(
        'Recentchanges'             => array( '最近更改' ),
        'Recentchangeslinked'       => array( '鏈出更改' ),
        'Revisiondelete'            => array( '刪除或恢復版本' ),
-       'RevisionMove'              => array( '版本移動' ),
        'Search'                    => array( '搜索' ),
        'Shortpages'                => array( '短頁面' ),
        'Specialpages'              => array( '特殊頁面' ),
@@ -213,9 +213,9 @@ $messages = array(
 # User preference toggles
 'tog-underline' => '連結加底線:',
 'tog-justify' => '段落對齊',
-'tog-hideminor' => '最近更改中隱藏小修改',
-'tog-hidepatrolled' => '最近更改中隱藏巡查過的編輯',
-'tog-newpageshidepatrolled' => '新頁面清單中隱藏巡查過的頁面',
+'tog-hideminor' => '隱藏最近更改中的小修改',
+'tog-hidepatrolled' => '隱藏最近更改中巡查過的編輯',
+'tog-newpageshidepatrolled' => '隱藏新頁面清單中巡查過的頁面',
 'tog-extendwatchlist' => '展開監視清單以顯示所有更改,不只是最近的',
 'tog-usenewrc' => '在最近更改和監視列表中整合同一頁的修改 (需要JavaScript)',
 'tog-numberheadings' => '標題自動編號',
@@ -251,7 +251,7 @@ $messages = array(
 'tog-watchlisthideliu' => '監視列表中隱藏登入用戶',
 'tog-watchlisthideanons' => '監視列表中隱藏匿名用戶',
 'tog-watchlisthidepatrolled' => '監視清單中隱藏已巡查的編輯',
-'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,也寄一份本到我的信箱',
+'tog-ccmeonemails' => '當我寄電子郵件給其他用戶時,也寄一份本到我的信箱',
 'tog-diffonly' => '比較版本差異時不顯示頁面內容',
 'tog-showhiddencats' => '顯示隱藏分類',
 'tog-noconvertlink' => '不轉換連結標題',
@@ -259,7 +259,7 @@ $messages = array(
 
 'underline-always' => '總是使用',
 'underline-never' => '從不使用',
-'underline-default' => '瀏覽器預設',
+'underline-default' => '外觀或瀏覽器預設',
 
 # Font style option in Special:Preferences
 'editfont-style' => '編輯區字型樣式:',
@@ -337,15 +337,15 @@ $messages = array(
 'listingcontinuesabbrev' => '續',
 'index-category' => '已做索引的頁面',
 'noindex-category' => '未做索引的頁面',
-'broken-file-category' => '有連結至已損壞檔案頁的連結之頁面',
+'broken-file-category' => '包含損壞的檔案連結的頁面',
 
 'about' => '關於',
 'article' => '內容頁面',
 'newwindow' => '(以新視窗開啟)',
 'cancel' => '取消',
 'moredotdotdot' => '更多...',
-'mypage' => '我的頁面',
-'mytalk' => '我的對話頁',
+'mypage' => '頁面',
+'mytalk' => '對話頁',
 'anontalk' => '該IP的對話頁',
 'navigation' => '導覽',
 'and' => '和',
@@ -355,7 +355,6 @@ $messages = array(
 'qbbrowse' => '瀏覽',
 'qbedit' => '編輯',
 'qbpageoptions' => '頁面選項',
-'qbpageinfo' => '頁面訊息',
 'qbmyoptions' => '我的選項',
 'qbspecialpages' => '特殊頁面',
 'faq' => '常見問題解答',
@@ -368,7 +367,7 @@ $messages = array(
 'vector-action-protect' => '保護',
 'vector-action-undelete' => '恢復被刪頁面',
 'vector-action-unprotect' => '更改保護',
-'vector-simplesearch-preference' => '啟用加強搜尋建議(僅限 Vector 外觀)',
+'vector-simplesearch-preference' => '啟用簡化搜尋欄(僅限 Vector 外觀)',
 'vector-view-create' => '建立',
 'vector-view-edit' => '編輯',
 'vector-view-history' => '檢視歷史',
@@ -378,6 +377,7 @@ $messages = array(
 'namespaces' => '名字空間',
 'variants' => '變換',
 
+'navigation-heading' => '導航',
 'errorpagetitle' => '錯誤',
 'returnto' => '返回到$1。',
 'tagline' => '出自{{SITENAME}}',
@@ -477,7 +477,7 @@ $1',
 'newmessagesdifflink' => '最後更改',
 'youhavenewmessagesfromusers' => '你有來自{{PLURAL:$3| 另一位用戶| $3位用戶}}的$1 ( $2 )。',
 'youhavenewmessagesmanyusers' => '你有來自多位用戶的$1( $2 )。',
-'newmessageslinkplural' => '$1項新訊息',
+'newmessageslinkplural' => '{{PLURAL:$1|一項新訊息|新訊息}}',
 'newmessagesdifflinkplural' => '最新$1次更改',
 'youhavenewmessagesmulti' => '您在 $1 有一條新訊息',
 'editsection' => '編輯',
@@ -485,7 +485,7 @@ $1',
 'viewsourceold' => '檢視原始碼',
 'editlink' => '編輯',
 'viewsourcelink' => '檢視原始碼',
-'editsectionhint' => '編輯段落:$1',
+'editsectionhint' => '編輯章節:$1',
 'toc' => '目錄',
 'showtoc' => '顯示',
 'hidetoc' => '隱藏',
@@ -532,10 +532,10 @@ $1',
 'databaseerror' => '資料庫錯誤',
 'dberrortext' => '發生資料庫查詢語法錯誤。
 可能是由於軟體自身的錯誤所引起。
-最後一次資料庫查詢指令是:
+最後一次資料庫查詢指令是
 <blockquote><code>$1</code></blockquote>
-來自於函數 "<code>$2</code>"
-數據庫返回錯誤 "<samp>$3: $4</samp>"。',
+來自於函數“<code>$2</code>”
+資料庫返回錯誤“<samp>$3: $4</samp>”。',
 'dberrortextcl' => '發生資料庫查詢語法錯誤。
 最後一次的資料庫查詢是:
 「$1」
@@ -578,7 +578,8 @@ $1',
 'badtitletext' => '所請求頁面的標題是無效的、不存在,跨語言或跨wiki連結的標題錯誤。它可能包含一個或更多的不能用於標題的字符。',
 'perfcached' => '下列是快取資料,因此可能不是最新的。最多{{PLURAL:$1|只有1個結果|$1個結果}}可用。',
 'perfcachedts' => '下列是快取資料,其最後更新時間是$1。只有{{PLURAL:$4|一個結果|$4個結果}}會被顯示。 A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
-'querypage-no-updates' => '目前禁止對此頁面進行更新。此處的資料將不能被立即重新整理。',
+'querypage-no-updates' => '目前禁止對此頁面進行更新。
+此處的資料將不能被立即重新整理。',
 'wrong_wfQuery_params' => '錯誤的參數被傳遞到 wfQuery()<br />
 函數:$1<br />
 查詢:$2',
@@ -586,12 +587,12 @@ $1',
 'viewsource-title' => '查看$1的源代碼',
 'actionthrottled' => '動作已壓制',
 'actionthrottledtext' => '基於反垃圾的考量,您現在於這段短時間之中限制去作這一個動作,而您已經超過這個上限。請在數分鐘後再嘗試。',
-'protectedpagetext' => '該頁面已被保護以防止編輯。',
+'protectedpagetext' => '該頁面已被保護以防止編輯或其他操作。',
 'viewsourcetext' => '{{GENDER:|你|妳|你}}可以檢視並複製本頁面的原始碼。',
 'viewyourtext' => "您可以查看並複製'''您對此頁面作出編輯後'''的源代碼:",
 'protectedinterface' => '該頁提供此wiki軟體的介面文字,它已被保護以防止惡意修改。
 如欲修改所有wiki的翻譯,請到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化計畫。',
-'editinginterface' => "'''警告:''' 您正在編輯的頁面是用於提供軟體的介面文字。
+'editinginterface' => "'''警告:'''您正在編輯的頁面是用於提供軟體的介面文字。
 改變此頁將影響其他在此wiki上的用戶介面外觀。
 如欲修改所有wiki的翻譯,請到[//translatewiki.net/ translatewiki.net]上的MediaWiki本地化計畫。",
 'sqlhidden' => '(隱藏SQL查詢)',
@@ -615,14 +616,14 @@ $2',
 'virus-unknownscanner' => '未知的防病毒:',
 
 # Login and logout pages
-'logouttext' => '您已經登出。
+'logouttext' => "您已經登出。
 
-您可以以匿名方式繼續使用{{SITENAME}},或以相同或不同用戶身份[[Special:UserLogin|登入]]
-請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器緩存。',
-'welcomecreation' => '== 歡迎,$1! ==
-您的賬號已經建立。
+您可以以匿名方式繼續使用{{SITENAME}},或以相同或不同用戶身份<span class='plainlinks'>[$1 登入]</span>
+請注意,如果你再次登入,此頁或會繼續顯示,直到您清除瀏覽器緩存。",
+'welcomeuser' => '歡迎,$1!',
+'welcomecreation-msg' => '您的賬號已經建立。
 不要忘記設置[[Special:Preferences|{{SITENAME}}的個人參數]]。',
-'yourname' => '您的使用者名稱:',
+'yourname' => '用戶名:',
 'yourpassword' => '您的密碼:',
 'yourpasswordagain' => '再次輸入密碼:',
 'remembermypassword' => '在這個瀏覽器上記住我的登入資訊(可維持 $1 {{PLURAL:$1|天|天}})',
@@ -736,7 +737,7 @@ $2',
 'passwordreset-legend' => '重設密碼',
 'passwordreset-disabled' => '此維基上已禁止了重設密碼。',
 'passwordreset-pretext' => '{{PLURAL:$1||輸入下列其中一個}}',
-'passwordreset-username' => '使用者名稱:',
+'passwordreset-username' => '用戶名:',
 'passwordreset-domain' => '域名:',
 'passwordreset-capture' => '查看生成的電子郵件嗎?',
 'passwordreset-capture-help' => '如果您選中此框,電子郵件(包括臨時密碼)將顯示,並發送給用戶。',
@@ -883,8 +884,9 @@ $2
 'userinvalidcssjstitle' => "'''警告:''' 不存在面板\"\$1\"。注意自訂的 .css 和 .js 頁要使用小寫標題,例如,{{ns:user}}:Foo/vector.css 不同於 {{ns:user}}:Foo/Vector.css。",
 'updated' => '(已更新)',
 'note' => "'''注意:'''",
-'previewnote' => "'''請記住這只是預覽,內容尚未儲存!'''",
-'continue-editing' => '繼續編輯',
+'previewnote' => "'''請記住這只是預覽。'''
+您的更改尚未儲存!",
+'continue-editing' => '往編輯框',
 'previewconflict' => '這個預覽顯示了上面文字編輯區中的內容。它將在{{GENDER:|你|妳|你}}選擇保存後出現。',
 'session_fail_preview' => "'''很抱歉!由於部份資料遺失,我們無法處理您的編輯。'''
 請再試一次。
@@ -965,6 +967,15 @@ $2
 'edit-already-exists' => '不可以建立一個新頁面。
 它已經存在。',
 'defaultmessagetext' => '預設訊息文字',
+'content-failed-to-parse' => '未能轉換$2 內容成為$1:$3',
+'invalid-content-data' => '內容資料無效',
+'content-not-allowed-here' => '[[$2]]不允許"$1"頁上的內容',
+
+# Content models
+'content-model-wikitext' => 'wiki語法',
+'content-model-text' => '純文字',
+'content-model-javascript' => 'JavaScript',
+'content-model-css' => 'CSS',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => '警告: 這個頁面有太多耗費的語法功能呼叫。
@@ -1203,8 +1214,6 @@ $1",
 'search-interwiki-caption' => '姊妹計劃',
 'search-interwiki-default' => '$1項結果:',
 'search-interwiki-more' => '(更多)',
-'search-mwsuggest-enabled' => '有建議',
-'search-mwsuggest-disabled' => '無建議',
 'search-relatedarticle' => '相關',
 'mwsuggest-disable' => '停用AJAX建議',
 'searcheverything-enable' => '在所有名字空間中搜尋',
@@ -1237,8 +1246,8 @@ $1",
 
 # Preferences page
 'preferences' => '偏好設定',
-'mypreferences' => '我的偏好設定',
-'prefs-edits' => '編輯æ\95¸é\87\8f:',
+'mypreferences' => '偏好設定',
+'prefs-edits' => '編輯次æ\95¸:',
 'prefsnologin' => '還未登入',
 'prefsnologintext' => '您必須先<span class="plainlinks">[{{fullurl:{{#Special:UserLogin}}|returnto=$1}} 登入]</span>才能設置個人參數。',
 'changepassword' => '更改密碼',
@@ -1268,13 +1277,13 @@ $1",
 'restoreprefs' => '恢復所有預設設定',
 'prefs-editing' => '編輯',
 'prefs-edit-boxsize' => '編輯框尺寸',
-'rows' => '列:',
-'columns' => '欄:',
+'rows' => '行:',
+'columns' => '列:',
 'searchresultshead' => '搜尋',
-'resultsperpage' => '每頁顯示連結數',
+'resultsperpage' => '每頁顯示連結數',
 'stub-threshold' => '<a href="#" class="stub">短頁面連結</a>格式門檻值 (位元組):',
 'stub-threshold-disabled' => '已停用',
-'recentchangesdays' => '最近更改中的顯示日數:',
+'recentchangesdays' => '最近更改中的顯示日數',
 'recentchangesdays-max' => '最多$1{{PLURAL:$1|天}}',
 'recentchangescount' => '預設顯示的編輯數:',
 'prefs-help-recentchangescount' => '這個包括最近更改、頁面歷史以及日誌。',
@@ -1283,11 +1292,11 @@ $1",
 這裡有一個任意生成的值,供您選擇:$1',
 'savedprefs' => '您的個人偏好設定已經儲存。',
 'timezonelegend' => '時區:',
-'localtime' => '當地時間:',
+'localtime' => '當地時間',
 'timezoneuseserverdefault' => '使用預設($1)',
 'timezoneuseoffset' => '其他 (指定偏移)',
 'timezoneoffset' => '時差¹:',
-'servertime' => '伺服器時間:',
+'servertime' => '伺服器時間',
 'guesstimezone' => '從瀏覽器填寫',
 'timezoneregion-africa' => '非洲',
 'timezoneregion-america' => '美洲',
@@ -1311,16 +1320,16 @@ $1",
 'prefs-reset-intro' => '您可以利用這個頁面去重設您的參數設置到網站預設值。這個動作無法復原。',
 'prefs-emailconfirm-label' => '電子郵件確認:',
 'prefs-textboxsize' => '編輯框大小',
-'youremail' => '電子郵件:',
-'username' => '用戶名:',
-'uid' => '用戶ID:',
-'prefs-memberingroups' => '{{PLURAL:$1|群組}}:',
-'prefs-registration' => '註冊時間:',
+'youremail' => '電子郵件',
+'username' => '用戶名',
+'uid' => '用戶ID',
+'prefs-memberingroups' => '{{PLURAL:$1|群組}}',
+'prefs-registration' => '註冊時間',
 'yourrealname' => '真實姓名:',
 'yourlanguage' => '語言:',
 'yourvariant' => '內容語言變體:',
 'prefs-help-variant' => '您希望用於顯示本站內容的語種或拼寫語系。',
-'yournick' => '新簽名:',
+'yournick' => '新簽名',
 'prefs-help-signature' => '在討論頁面上的評論應該要用「<nowiki>~~~~</nowiki>」簽名,這樣便會轉換成{{GENDER:|你|妳|你}}的簽名以及一個時間截記。',
 'badsig' => '錯誤的原始簽名。請檢查HTML標籤。',
 'badsiglength' => '您的簽名過長。
@@ -1468,6 +1477,9 @@ $1",
 'rightslogtext' => '以下記錄了用戶權限的更改記錄。',
 'rightslogentry' => '將 $1 的權限從 $2 改為 $3',
 'rightslogentry-autopromote' => '自動由$2晉升至$3',
+'logentry-rights-rights' => '$1將$3的權限從$4改為$5',
+'logentry-rights-rights-legacy' => '$1更改$3的權限',
+'logentry-rights-autopromote' => '$1的權限自動從$4改為$5',
 'rightsnone' => '無',
 
 # Associated actions - in the sentence "You do not have permission to X"
@@ -1688,6 +1700,7 @@ $1',
 'backend-fail-notsame' => '$1已存在不同的文件。',
 'backend-fail-invalidpath' => '$1不是有效的存儲路徑。',
 'backend-fail-delete' => '無法刪除「$1」檔案。',
+'backend-fail-describe' => '無法修改檔案「$1」的元數據。',
 'backend-fail-alreadyexists' => '“$1”頁面已存在',
 'backend-fail-store' => '無法在$2存儲文件$1。',
 'backend-fail-copy' => '無法複製文件$1到$2。',
@@ -1837,7 +1850,7 @@ $1',
 'shared-repo-from' => '出自$1',
 'shared-repo' => '一個共用檔案庫',
 'shared-repo-name-wikimediacommons' => '維基共享資源',
-'upload-disallowed-here' => '您不可以覆蓋此圖像。',
+'upload-disallowed-here' => '您不可以覆蓋此檔案。',
 
 # File reversion
 'filerevert' => '恢復$1',
@@ -1999,7 +2012,7 @@ Template:消除歧義',
 'usereditcount' => '$1 次編輯',
 'usercreated' => '$1 $2{{GENDER:$3|創建}}',
 'newpages' => '最新頁面',
-'newpages-username' => '用戶名:',
+'newpages-username' => '用戶名',
 'ancientpages' => '最舊頁面',
 'move' => '移動',
 'movethispage' => '移動本頁',
@@ -2075,8 +2088,8 @@ Template:消除歧義',
 'linksearch-pat' => '搜尋網址:',
 'linksearch-ns' => '名字空間:',
 'linksearch-ok' => '搜尋',
-'linksearch-text' => '製作可以使用類似“*.wikipedia.org”的通配符。必須至少是頂級域名,例如“*.org”。<br />
-支持的協議:<code>$1</code>(不要包含在搜索中)。',
+'linksearch-text' => '可使用通配符,如“*.wikipedia.org”。至少需要一個頂級域名,例如“*.org”。<br />
+支持的協議:<code>$1</code>(若沒有指定協議,預設為http://)。',
 'linksearch-line' => '$1 連自 $2',
 'linksearch-error' => '萬用字元僅可在主機名稱的開頭使用。',
 
@@ -2084,7 +2097,7 @@ Template:消除歧義',
 'listusersfrom' => '給定顯示用戶條件:',
 'listusers-submit' => '顯示',
 'listusers-noresult' => '找不到用戶。',
-'listusers-blocked' => '(已封)',
+'listusers-blocked' => '(已封)',
 
 # Special:ActiveUsers
 'activeusers' => '活躍用戶列表',
@@ -2127,7 +2140,7 @@ Template:消除歧義',
 'emailuser-title-target' => '電郵這位{{GENDER:$1|用戶}}',
 'emailuser-title-notarget' => 'E-mail用戶',
 'emailpage' => 'E-mail用戶',
-'emailpagetext' => '您可以用下面的表格去寄一封電郵給這位用戶
+'emailpagetext' => '您可以用下面的表格去寄一封電郵給這位{{Gender:$1|用戶}}
 您在[[Special:Preferences|您的參數設置]]中所輸入的電子郵件地址將出現在郵件「發件人」一欄中,這樣該用戶就可以回覆您。',
 'usermailererror' => '目標郵件地址返回錯誤:',
 'defemailsubject' => '{{SITENAME}}來自用戶“$1”的電子郵件',
@@ -2159,7 +2172,7 @@ Template:消除歧義',
 
 # Watchlist
 'watchlist' => '監視列表',
-'mywatchlist' => '我的監視列表',
+'mywatchlist' => '監視列表',
 'watchlistfor2' => '$1的監視列表 $2',
 'nowatchlist' => '您的監視列表為空。',
 'watchlistanontext' => '請$1以檢視或編輯您的監視列表。',
@@ -2195,20 +2208,23 @@ Template:消除歧義',
 
 'enotif_mailer' => '{{SITENAME}}郵件通知器',
 'enotif_reset' => '將所有頁面標為已閱讀',
-'enotif_newpagetext' => '這是新建頁面。',
 'enotif_impersonal_salutation' => '{{SITENAME}}用戶',
-'changed' => '更改',
-'created' => '建立了',
-'enotif_subject' => '{{SITENAME}}頁面“$PAGETITLE”已被$PAGEEDITOR$CHANGEDORCREATED',
+'enotif_subject_deleted' => '{{SITENAME}}的「$1」頁面被$2刪除',
+'enotif_subject_created' => '{{SITENAME}}的「$1」頁面被$2建立',
+'enotif_subject_moved' => '{{SITENAME}}的「$1」頁面被$2移動',
+'enotif_subject_restored' => '{{SITENAME}}的「$1」頁面被$2恢復',
+'enotif_subject_changed' => '{{SITENAME}}的「$1」頁面被$2修改',
+'enotif_body_intro_deleted' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2刪除,請見$3瀏覽當前版本。',
+'enotif_body_intro_created' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2建立,請見$3瀏覽當前版本。。',
+'enotif_body_intro_moved' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2移動,請見$3瀏覽當前版本。',
+'enotif_body_intro_restored' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2恢復,請見$3瀏覽當前版本。',
+'enotif_body_intro_changed' => '{{SITENAME}}的「$1」頁面於$PAGEEDITDATE被$2修改,請見$3瀏覽當前版本。',
 'enotif_lastvisited' => '請參閱 $1 檢視你上次訪問後的所有更改。',
 'enotif_lastdiff' => '請參閱 $1 檢視該更改。',
 'enotif_anon_editor' => '匿名用戶$1',
-'enotif_body' => '親愛的$WATCHINGUSERNAME:
-
+'enotif_body' => '$WATCHINGUSERNAME:
 
-{{SITENAME}}的頁面$PAGETITLE已經於$PAGEEDITDATE由$PAGEEDITOR$CHANGEDORCREATED,請見 $PAGETITLE_URL 瀏覽現在的版本。
-
-$NEWPAGE
+$PAGEINTRO $NEWPAGE
 
 編輯摘要:$PAGESUMMARY $PAGEMINOREDIT
 
@@ -2217,22 +2233,21 @@ $NEWPAGE
 郵件:$PAGEEDITOR_EMAIL
 本站:$PAGEEDITOR_WIKI
 
-在您訪問此頁之前,將來的更改將不會向您發通知。
-您也可以在監視列表中重設您所有監視頁面的通知標記。
+在您訪問此頁之前,將來的更改將不會向您發出通知。您也可以在監視列表中重設您所有監視頁面的通知標記。
 
-                        友好的{{SITENAME}}通知系統
+{{SITENAME}}通知系統啟
 
 --
-要改變您的電郵設定,請參閱
+更改電郵通知設定:
 {{canonicalurl:{{#special:Preferences}}}}
 
-要改變您的監視列表設定,請參閱
+更改監視列表設定:
 {{canonicalurl:{{#special:EditWatchlist}}}}
 
-要刪除您監視清單中的該頁面,請參閱
+從監視列表中刪除此頁面:
 $UNWATCHURL
 
-回饋和進一步的幫助:
+回饋和其他幫助:
 {{canonicalurl:{{MediaWiki:Helppage}}}}',
 
 # Delete
@@ -2382,7 +2397,7 @@ $UNWATCHURL
 'undeletedrevisions' => '$1個修訂版本已經恢復',
 'undeletedrevisions-files' => '$1 個版本和 $2 個檔案被恢復',
 'undeletedfiles' => '$1 個檔案被恢復',
-'cannotundelete' => 'æ\81¢å¾©å¤±æ\95\97ï¼\9bå\8f¯è\83½ä¹\8bå\89\8då·²ç¶\93被å\85¶ä»\96人æ\81¢å¾©ã\80\82',
+'cannotundelete' => 'æ\81¢å¾©å¤±æ\95\97ï¼\9a$1',
 'undeletedpage' => "'''$1已經被恢復''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除及恢復記錄。",
 'undelete-header' => '如要查詢最近的記錄請參閱[[Special:Log/delete|刪除日誌]]。',
 'undelete-search-title' => '搜索已刪除頁面',
@@ -2411,7 +2426,7 @@ $1',
 'blanknamespace' => '(主)',
 
 # Contributions
-'contributions' => '用戶貢獻',
+'contributions' => '{{GENDER:$1|用戶}}貢獻',
 'contributions-title' => '$1的用戶貢獻',
 'mycontris' => '我的貢獻',
 'contribsub2' => '$1的貢獻 ($2)',
@@ -2685,6 +2700,7 @@ $1被封禁的理由是“$2”',
 'immobile-target-namespace-iw' => '垮維基連結在移動頁面中是無效的目標。',
 'immobile-source-page' => '這個頁面不能移動。',
 'immobile-target-page' => '無法移動至目標標題中。',
+'bad-target-model' => '所需的目的地使用不同的內容模式。不可以從$1轉換到 $2 。',
 'imagenocrossnamespace' => '不可以移動檔案到非檔案名字空間',
 'nonfile-cannot-move-to-file' => '不可以移動非檔案到檔案名字空間',
 'imagetypemismatch' => '該新副檔名不匹配它的類型',
@@ -2810,7 +2826,6 @@ $1被封禁的理由是“$2”',
 
 # JavaScriptTest
 'javascripttest' => 'JavaScript測試',
-'javascripttest-disabled' => '此功能在此Wiki上未被使用。',
 'javascripttest-title' => '運行$1測試。',
 'javascripttest-pagetext-noframework' => '這個頁面預留了作JavaScript測試。',
 'javascripttest-pagetext-unknownframework' => '未知框架"$1"',
@@ -2945,7 +2960,8 @@ $1被封禁的理由是“$2”',
 'spam_deleting' => '所有包含連結至$1的修訂,刪除中',
 
 # Info page
-'pageinfo-title' => '" $1 "的信息',
+'pageinfo-title' => '「$1」的信息',
+'pageinfo-not-current' => '抱歉,無法提供之前修訂版本的資訊。',
 'pageinfo-header-basic' => '基本資料',
 'pageinfo-header-edits' => '編輯歷史',
 'pageinfo-header-restrictions' => '保護頁面',
@@ -2954,6 +2970,7 @@ $1被封禁的理由是“$2”',
 'pageinfo-default-sort' => '預設排序字:',
 'pageinfo-length' => '頁面長度 (以位元組為單位)',
 'pageinfo-article-id' => '頁面編號',
+'pageinfo-language' => '頁面內容語言',
 'pageinfo-robot-policy' => '搜尋引擎狀態',
 'pageinfo-robot-index' => '可索引',
 'pageinfo-robot-noindex' => '不可索引',
@@ -2968,12 +2985,19 @@ $1被封禁的理由是“$2”',
 'pageinfo-lasttime' => '最新編輯日期',
 'pageinfo-edits' => '編輯總次數',
 'pageinfo-authors' => '作者總數',
-'pageinfo-recent-edits' => '最近編輯次數 (過去 $1 內)',
+'pageinfo-recent-edits' => '最近編輯次數 (過去$1內)',
 'pageinfo-recent-authors' => '最近作者數目',
-'pageinfo-restriction' => '保護頁面 ( {{lcfirst:$1}} )',
-'pageinfo-magic-words' => '魔術{{PLURAL:$1|字|字}} ( $1 )',
-'pageinfo-hidden-categories' => '隱藏{{PLURAL:$1|分類|分類}} ( $1 )',
-'pageinfo-templates' => '被引用的{{PLURAL:$1|模版|模版}} ( $1 )',
+'pageinfo-magic-words' => '魔術{{PLURAL:$1|字|字}}($1)',
+'pageinfo-hidden-categories' => '隱藏{{PLURAL:$1|分類|分類}}($1)',
+'pageinfo-templates' => '被引用的{{PLURAL:$1|模版|模版}}($1)',
+'pageinfo-toolboxlink' => '頁面資訊',
+'pageinfo-redirectsto' => '重定向到',
+'pageinfo-redirectsto-info' => '資訊',
+'pageinfo-contentpage' => '計算為內容頁',
+'pageinfo-contentpage-yes' => '是',
+'pageinfo-protect-cascading' => '從此開始連鎖保護',
+'pageinfo-protect-cascading-yes' => '是',
+'pageinfo-protect-cascading-from' => '從此連鎖保護',
 
 # Skin names
 'skinname-standard' => '標準',
@@ -2992,6 +3016,8 @@ $1被封禁的理由是“$2”',
 'markedaspatrollederror' => '不能標誌為已檢查',
 'markedaspatrollederrortext' => '{{GENDER:|你|妳|你}}需要指定某個版本才能標誌為已檢查。',
 'markedaspatrollederror-noautopatrol' => '您無法將{{GENDER:|你|妳|你}}自己所作的更改標記為已檢查。',
+'markedaspatrollednotify' => '$1的更改已標記為已巡查。',
+'markedaspatrollederrornotify' => '標記為巡查失敗。',
 
 # Patrol log
 'patrol-log-page' => '巡查日誌',
@@ -3016,7 +3042,7 @@ $1',
 # Media information
 'mediawarning' => "'''警告''': 該檔案類型可能包含惡意代碼。
 執行它可能對您的系統帶來危險。",
-'imagemaxsize' => "影像大小限制:<br />''(用在檔案描述頁面中)''",
+'imagemaxsize' => "影像大小限制<br />''(用在檔案描述頁面中)''",
 'thumbsize' => '縮略圖大小:',
 'widthheightpage' => '$1 × $2, $3頁',
 'file-info' => '檔案大小: $1, MIME 類型: $2',
@@ -3055,6 +3081,7 @@ $1',
 'hours' => '$1小時',
 'days' => '$1天',
 'ago' => '$1前',
+'just-now' => '剛才',
 
 # Bad image list
 'bad_image_list' => '請按照下列格式編寫:
@@ -3070,7 +3097,7 @@ To disable showing a particular link, set it to 'disable', e.g.
 Variants for Chinese language
 */
 'variantname-zh-hans' => '‪中文(简体)',
-'variantname-zh-hant' => '‪中文(繁體)',
+'variantname-zh-hant' => '‪繁體中文',
 'variantname-zh-cn' => '大陸簡體',
 'variantname-zh-tw' => '台灣正體',
 'variantname-zh-hk' => '香港繁體',
@@ -3569,6 +3596,7 @@ $5
 # Scary transclusion
 'scarytranscludedisabled' => '[跨wiki轉換代碼不可用]',
 'scarytranscludefailed' => '[模板$1讀取失敗]',
+'scarytranscludefailed-httpstatus' => '[模板$1讀取失敗:HTTP$2]',
 'scarytranscludetoolong' => '[URL 地址太長]',
 
 # Delete conflict
@@ -3684,6 +3712,7 @@ $5
 'version-license' => '授權',
 'version-poweredby-credits' => "這個 Wiki 由 '''[//www.mediawiki.org/ MediaWiki]''' 驅動,版權所有 © 2001-$1 $2。",
 'version-poweredby-others' => '其他',
+'version-credits-summary' => '我們感謝以下人士為[[Special:Version|MediaWiki]]作出的貢獻。',
 'version-license-info' => 'MediaWiki為自由軟件;您可依據自由軟件基金會所發表的GNU通用公共授權條款規定,就本程式再為發佈與/或修改;無論您依據的是本授權的第二版或(您自行選擇的)任一日後發行的版本。
 
 MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任;亦無對適售性或特定目的適用性所為的默示性擔保。詳情請參照GNU通用公共授權。
@@ -3823,9 +3852,9 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'logentry-move-move_redir-noredirect' => '$1通過重定向移動$3頁面至$4,不留重定向',
 'logentry-patrol-patrol' => '$1標記頁面$3的版本$4為已巡查',
 'logentry-patrol-patrol-auto' => '$1自動標記頁面$3的版本$4為已巡查',
-'logentry-newusers-newusers' => '$1建立新帳號',
-'logentry-newusers-create' => '$1創建賬戶',
-'logentry-newusers-create2' => '$1創建賬戶$3',
+'logentry-newusers-newusers' => '已建立用戶「$1」',
+'logentry-newusers-create' => '已建立用戶「$1」',
+'logentry-newusers-create2' => '用戶「$1」建立用戶「$3」',
 'logentry-newusers-autocreate' => '帳戶$1被自動創建',
 'newuserlog-byemail' => '密碼已由電子郵件寄出',
 
@@ -3844,6 +3873,10 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'feedback-bugcheck' => '請檢查此bug是否為[$1 已知bug]。',
 'feedback-bugnew' => '我已經檢查過。報告一個新的bug',
 
+# Search suggestions
+'searchsuggest-search' => '搜尋',
+'searchsuggest-containing' => '包含...',
+
 # API errors
 'api-error-badaccess-groups' => '您沒有權限在此維基項目上傳文件。',
 'api-error-badtoken' => '內部錯誤:標記無效。',
@@ -3893,7 +3926,9 @@ MediaWiki是基於使用目的而加以發佈,然而不負任何擔保責任
 'duration-weeks' => '$1週',
 'duration-years' => '$1年',
 'duration-decades' => '$1十年',
-'duration-centuries' => '$1世紀',
+'duration-centuries' => '$1世紀',
 'duration-millennia' => '$1千年',
 
+# Unknown messages
+'svg-long-error' => '無效的SVG檔案:$1',
 );
index 91be2ec..dc28646 100644 (file)
@@ -24,7 +24,6 @@ $fallback8bitEncoding = 'Big5-HKSCS';
 
 $specialPageAliases = array(
        'ComparePages'              => array( '頁面比較' ),
-       'RevisionMove'              => array( '移動版本' ),
        'Unblock'                   => array( '解除封禁' ),
 );
 
index 1fbc434..7d98460 100644 (file)
 
 $fallback = 'zh-hant, zh-hans';
 
+$namespaceNames = array(
+       NS_USER             => '使用者',
+       NS_USER_TALK        => '使用者討論',
+       NS_HELP             => '使用說明',
+       NS_HELP_TALK        => '使用說明討論',
+);
+
+$namespaceAliases = array(
+       'Image' => NS_FILE,
+       'Image_talk' => NS_FILE_TALK,
+       "圖片" => NS_FILE,
+       "圖片討論" => NS_FILE_TALK,
+);
+
 $specialPageAliases = array(
        'Ancientpages'              => array( '最舊頁面' ),
        'Block'                     => array( '查封用戶' ),
@@ -46,20 +60,6 @@ $specialPageAliases = array(
        'Withoutinterwiki'          => array( '沒有跨語言鏈接的頁面' ),
 );
 
-$namespaceNames = array(
-       NS_USER             => '使用者',
-       NS_USER_TALK        => '使用者討論',
-       NS_HELP             => '使用說明',
-       NS_HELP_TALK        => '使用說明討論',
-);
-
-$namespaceAliases = array(
-       'Image' => NS_FILE,
-       'Image_talk' => NS_FILE_TALK,
-       "圖片" => NS_FILE,
-       "圖片討論" => NS_FILE_TALK,
-);
-
 $datePreferences = array(
        'default',
        'minguo',
index a7768fc..5efa16a 100644 (file)
@@ -16,210 +16,210 @@ $messages = array(
 'underline-always' => 'Njalo',
 
 # Dates
-'sunday'        => 'iSonto',
-'monday'        => 'uMsombuluko',
-'tuesday'       => 'uLwesibili',
-'wednesday'     => 'uLwesithathu',
-'thursday'      => 'uLwesine',
-'friday'        => 'uLwesihlanu',
-'saturday'      => 'uMgqibelo',
-'january'       => 'uJanuwali',
-'february'      => 'uFebruwari',
-'march'         => 'uMashi',
-'april'         => 'u-Apreli',
-'may_long'      => 'uMeyi',
-'june'          => 'uJuni',
-'july'          => 'uJulayi',
-'august'        => 'u-Agasti',
-'september'     => 'uSepthemba',
-'october'       => 'u-Okthoba',
-'november'      => 'uNovemba',
-'december'      => 'uDisemba',
-'january-gen'   => 'uJanuwali',
-'february-gen'  => 'uFebruwari',
-'march-gen'     => 'uMashi',
-'april-gen'     => 'u-Apreli',
-'may-gen'       => 'uMeyi',
-'june-gen'      => 'uJuni',
-'july-gen'      => 'uJulayi',
-'august-gen'    => 'u-Agasti',
+'sunday' => 'iSonto',
+'monday' => 'uMsombuluko',
+'tuesday' => 'uLwesibili',
+'wednesday' => 'uLwesithathu',
+'thursday' => 'uLwesine',
+'friday' => 'uLwesihlanu',
+'saturday' => 'uMgqibelo',
+'january' => 'uJanuwali',
+'february' => 'uFebruwari',
+'march' => 'uMashi',
+'april' => 'u-Apreli',
+'may_long' => 'uMeyi',
+'june' => 'uJuni',
+'july' => 'uJulayi',
+'august' => 'u-Agasti',
+'september' => 'uSepthemba',
+'october' => 'u-Okthoba',
+'november' => 'uNovemba',
+'december' => 'uDisemba',
+'january-gen' => 'uJanuwali',
+'february-gen' => 'uFebruwari',
+'march-gen' => 'uMashi',
+'april-gen' => 'u-Apreli',
+'may-gen' => 'uMeyi',
+'june-gen' => 'uJuni',
+'july-gen' => 'uJulayi',
+'august-gen' => 'u-Agasti',
 'september-gen' => 'uSepthemba',
-'october-gen'   => 'u-Okthoba',
-'november-gen'  => 'uNovemba',
-'december-gen'  => 'uDisemba',
-'may'           => 'uMeyi',
+'october-gen' => 'u-Okthoba',
+'november-gen' => 'uNovemba',
+'december-gen' => 'uDisemba',
+'may' => 'uMeyi',
 
-'cancel'        => 'Nqamula',
+'cancel' => 'Nqamula',
 'moredotdotdot' => 'Amanye...',
-'mypage'        => 'Ikhasi lami',
-'mytalk'        => 'Ingxoxo yami',
-'navigation'    => 'Ukuqondiswa kwemikhumbi',
+'mypage' => 'Ikhasi lami',
+'mytalk' => 'Ingxoxo yami',
+'navigation' => 'Ukuqondiswa kwemikhumbi',
 
 # Cologne Blue skin
-'qbfind'        => 'Thola',
-'qbbrowse'      => 'Cinga',
-'qbedit'        => 'Ukuhlela',
+'qbfind' => 'Thola',
+'qbbrowse' => 'Cinga',
+'qbedit' => 'Ukuhlela',
 'qbpageoptions' => 'Leli khasi',
-'qbmyoptions'   => 'Amakhasi ami',
-
-'errorpagetitle'   => 'Icala',
-'help'             => 'Usizo',
-'search'           => 'Sesha',
-'searchbutton'     => 'Sesha',
-'go'               => 'Hamba',
-'searcharticle'    => 'Hamba',
-'history_short'    => 'Umlando',
+'qbmyoptions' => 'Amakhasi ami',
+
+'errorpagetitle' => 'Icala',
+'help' => 'Usizo',
+'search' => 'Sesha',
+'searchbutton' => 'Sesha',
+'go' => 'Hamba',
+'searcharticle' => 'Hamba',
+'history_short' => 'Umlando',
 'printableversion' => 'Inguqulo eshicilelekayo',
-'print'            => 'Shicilela',
-'edit'             => 'Hlela',
-'editthispage'     => 'Hlela leli khasi',
-'delete'           => 'Sula',
-'deletethispage'   => 'Sula lelikhasi',
-'protect'          => 'Londoloza',
-'protectthispage'  => 'Londoloza lelikhasi',
-'newpage'          => 'Ikhasi elisha',
-'talkpage'         => 'Xoxa ngalelikhasi',
-'personaltools'    => 'Amathuluzi kamsebenzisi',
-'talk'             => 'Ingxoxo',
-'toolbox'          => 'Amathuluzi',
-'otherlanguages'   => 'Ngezilimi ezinahlukene',
-'redirectpagesub'  => 'Ikhasi likakuphambukisa',
-'protectedpage'    => 'Ikhasi elilondolozwa',
-'jumpto'           => 'Eqa e:',
+'print' => 'Shicilela',
+'edit' => 'Hlela',
+'editthispage' => 'Hlela leli khasi',
+'delete' => 'Sula',
+'deletethispage' => 'Sula lelikhasi',
+'protect' => 'Londoloza',
+'protectthispage' => 'Londoloza lelikhasi',
+'newpage' => 'Ikhasi elisha',
+'talkpage' => 'Xoxa ngalelikhasi',
+'personaltools' => 'Amathuluzi kamsebenzisi',
+'talk' => 'Ingxoxo',
+'toolbox' => 'Amathuluzi',
+'otherlanguages' => 'Ngezilimi ezinahlukene',
+'redirectpagesub' => 'Ikhasi likakuphambukisa',
+'protectedpage' => 'Ikhasi elilondolozwa',
+'jumpto' => 'Eqa e:',
 'jumptonavigation' => 'Ukuqondiswa kwemikhumbi',
-'jumptosearch'     => 'Sesha',
+'jumptosearch' => 'Sesha',
 
 # 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).
-'currentevents'        => 'Izehlakalo ezimanje',
-'currentevents-url'    => 'Project:Izehlakalo ezimanje',
-'edithelp'             => 'Usizo ngokuhlela',
-'helppage'             => 'Help:Isiqikili',
-'mainpage'             => 'Ikhasi Elikhulu',
+'currentevents' => 'Izehlakalo ezimanje',
+'currentevents-url' => 'Project:Izehlakalo ezimanje',
+'edithelp' => 'Usizo ngokuhlela',
+'helppage' => 'Help:Isiqikili',
+'mainpage' => 'Ikhasi Elikhulu',
 'mainpage-description' => 'Ikhasi Elikhulu',
-'portal'               => 'Umnyango wamgwamanda',
-'portal-url'           => 'Project:Umnyango wamgwamanda',
+'portal' => 'Umnyango wamgwamanda',
+'portal-url' => 'Project:Umnyango wamgwamanda',
 
-'newmessageslink'         => 'Imilayezo emisha',
+'newmessageslink' => 'Imilayezo emisha',
 'youhavenewmessagesmulti' => 'Uyanemilayezo emisha e $1',
-'editsection'             => 'hlela',
-'toc'                     => 'Isiqikili',
-'showtoc'                 => 'Bukisa',
-'hidetoc'                 => 'Fihla',
+'editsection' => 'hlela',
+'toc' => 'Isiqikili',
+'showtoc' => 'Bukisa',
+'hidetoc' => 'Fihla',
 
 # Short words for each namespace, by default used in the namespace tab in monobook
-'nstab-main'      => 'Umlayezo',
-'nstab-user'      => 'Ikhasi lomsebenzisi',
-'nstab-special'   => 'Kukhulu',
-'nstab-image'     => 'Ifayela',
+'nstab-main' => 'Umlayezo',
+'nstab-user' => 'Ikhasi lomsebenzisi',
+'nstab-special' => 'Kukhulu',
+'nstab-image' => 'Ifayela',
 'nstab-mediawiki' => 'Umlayezo',
-'nstab-help'      => 'Usizo',
-'nstab-category'  => 'Uhlobo',
+'nstab-help' => 'Usizo',
+'nstab-category' => 'Uhlobo',
 
 # General errors
-'error'         => 'Icala',
+'error' => 'Icala',
 'databaseerror' => 'Idatabheyisi linecala',
 'internalerror' => 'Icala lingaphakathi',
 
 # Login and logout pages
-'welcomecreation'         => '== Umbingelelo, $1! ==
+'welcomecreation' => '== Umbingelelo, $1! ==
 
 ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}} wakho.',
-'yourname'                => 'Isiga',
-'yourpassword'            => 'Izwi elingenangozi',
-'yourpasswordagain'       => 'Bhala izwi elingenangozi lakho kabusha',
-'remembermypassword'      => 'Ngikhumbule (for a maximum of $1 {{PLURAL:$1|day|days}})',
-'login'                   => 'Ngena',
+'yourname' => 'Isiga',
+'yourpassword' => 'Izwi elingenangozi',
+'yourpasswordagain' => 'Bhala izwi elingenangozi lakho kabusha',
+'remembermypassword' => 'Ngikhumbule (for a maximum of $1 {{PLURAL:$1|day|days}})',
+'login' => 'Ngena',
 'nav-login-createaccount' => 'Ngena / Dala ikhawundi',
-'userlogin'               => 'Ngena / Dala ikhawundi',
-'logout'                  => 'Phuma',
-'userlogout'              => 'Phuma',
-'notloggedin'             => 'Awungenile',
-'nologin'                 => "Awunekhawundi? '''$1'''.",
-'nologinlink'             => 'Dala ikhawundi',
-'createaccount'           => 'Dala ikhawundi',
-'gotaccountlink'          => 'Ngena',
-'loginsuccesstitle'       => 'Ubengena',
-'nosuchuser'              => 'Akukho umsebenzisi unegama "$1". Hlola umbhalo wakho, noma dala ikhawundi elisha.',
-'nosuchusershort'         => 'Akukho umsebenzisi unegama "$1". Hlola umbhalo wakho.',
-'emailconfirmlink'        => 'Qinisekisa ikheli likagesi lakho',
-'loginlanguagelabel'      => 'Ulimi: $1',
+'userlogin' => 'Ngena / Dala ikhawundi',
+'logout' => 'Phuma',
+'userlogout' => 'Phuma',
+'notloggedin' => 'Awungenile',
+'nologin' => "Awunekhawundi? '''$1'''.",
+'nologinlink' => 'Dala ikhawundi',
+'createaccount' => 'Dala ikhawundi',
+'gotaccountlink' => 'Ngena',
+'loginsuccesstitle' => 'Ubengena',
+'nosuchuser' => 'Akukho umsebenzisi unegama "$1". Hlola umbhalo wakho, noma dala ikhawundi elisha.',
+'nosuchusershort' => 'Akukho umsebenzisi unegama "$1". Hlola umbhalo wakho.',
+'emailconfirmlink' => 'Qinisekisa ikheli likagesi lakho',
+'loginlanguagelabel' => 'Ulimi: $1',
 
 # Change password dialog
 'newpassword' => 'Izwi elingenangozi elisha:',
 
 # Edit page toolbar
 'italic_sample' => 'Amazwi ama-italiki',
-'italic_tip'    => 'Amazwi ama-italiki',
-'hr_tip'        => 'Umugqa uhleliwe  (use sparingly)',
+'italic_tip' => 'Amazwi ama-italiki',
+'hr_tip' => 'Umugqa uhleliwe  (use sparingly)',
 
 # Edit pages
-'summary'            => 'Isifinyezo:',
-'minoredit'          => 'Lokho ngukuhlela okuncane',
-'watchthis'          => 'Bukela ngalelikhasi',
-'savearticle'        => 'Ukonga ikhasi',
-'preview'            => 'Isibonakalo',
-'showpreview'        => 'Bukisa isibonakalo',
-'showdiff'           => 'Bukisa izinguquko',
+'summary' => 'Isifinyezo:',
+'minoredit' => 'Lokho ngukuhlela okuncane',
+'watchthis' => 'Bukela ngalelikhasi',
+'savearticle' => 'Ukonga ikhasi',
+'preview' => 'Isibonakalo',
+'showpreview' => 'Bukisa isibonakalo',
+'showdiff' => 'Bukisa izinguquko',
 'missingcommenttext' => 'Ake ubhale uvo ngaphansi.',
-'loginreqtitle'      => 'Lidinga ukuthi uyangena',
-'loginreqlink'       => 'Ngena',
-'noarticletext'      => 'Akukho umbhalo kuleli khasi manje. Unga [[Special:Search/Allmessages|cinga leli bizo lekhasi]] emakhasini amanye noma unga [{{fullurl:{{FULLPAGENAME}}|action=edit}} hlela leli khasi].',
-'yourtext'           => 'Umbhalo wakho',
-'yourdiff'           => 'Izinguquko',
+'loginreqtitle' => 'Lidinga ukuthi uyangena',
+'loginreqlink' => 'Ngena',
+'noarticletext' => 'Akukho umbhalo kuleli khasi manje. Unga [[Special:Search/Allmessages|cinga leli bizo lekhasi]] emakhasini amanye noma unga [{{fullurl:{{FULLPAGENAME}}|action=edit}} hlela leli khasi].',
+'yourtext' => 'Umbhalo wakho',
+'yourdiff' => 'Izinguquko',
 
 # History pages
-'next'      => 'Kulandela',
-'last'      => 'Amagcino',
+'next' => 'Kulandela',
+'last' => 'Amagcino',
 'histfirst' => 'lokuqala',
-'histlast'  => 'ligcinileyo',
+'histlast' => 'ligcinileyo',
 
 # Revision deletion
 'rev-delundel' => 'bukisa/fihla',
 
 # Search results
-'searchresults'  => 'Umphumela wokusesha',
+'searchresults' => 'Umphumela wokusesha',
 'searchhelp-url' => 'Help:Isiqikili',
-'powersearch'    => 'Sesha',
+'powersearch' => 'Sesha',
 
 # Quickbar
 'qbsettings' => 'Imeniyu',
 
 # Preferences page
-'preferences'       => 'Amakhethelo',
-'mypreferences'     => 'Amakhethelo ami',
-'prefsnologin'      => 'Awungenile',
-'changepassword'    => 'Guqula izwi elingenangozi',
-'saveprefs'         => 'Saveprefs',
+'preferences' => 'Amakhethelo',
+'mypreferences' => 'Amakhethelo ami',
+'prefsnologin' => 'Awungenile',
+'changepassword' => 'Guqula izwi elingenangozi',
+'saveprefs' => 'Saveprefs',
 'searchresultshead' => 'Sesha',
-'timezonelegend'    => 'Isifunda sasikhathi',
-'localtime'         => 'Isikhathi siyalapha',
-'username'          => 'Isiga:',
-'yourrealname'      => 'Igama eliqinisileyo',
-'yourlanguage'      => 'Ulimi:',
-'email'             => 'Iposi likagesi',
+'timezonelegend' => 'Isifunda sasikhathi',
+'localtime' => 'Isikhathi siyalapha',
+'username' => 'Isiga:',
+'yourrealname' => 'Igama eliqinisileyo',
+'yourlanguage' => 'Ulimi:',
+'email' => 'Iposi likagesi',
 
 # Recent changes
 'recentchanges' => 'Izinguquko ezimanje',
-'hide'          => 'Fihla',
-'show'          => 'Bukisa',
+'hide' => 'Fihla',
+'show' => 'Bukisa',
 
 # Recent changes linked
-'recentchangeslinked'         => 'Izinguquko ezilandiweyo',
-'recentchangeslinked-feed'    => 'Izinguquko ezilandiweyo',
+'recentchangeslinked' => 'Izinguquko ezilandiweyo',
+'recentchangeslinked-feed' => 'Izinguquko ezilandiweyo',
 'recentchangeslinked-toolbox' => 'Izinguquko ezilandiweyo',
 
 # Upload
-'upload'              => 'Layisha ifayili',
-'uploadbtn'           => 'Layisha ifayili',
-'filesource'          => 'Umthombo:',
-'ignorewarnings'      => 'Duba imiyalo',
+'upload' => 'Layisha ifayili',
+'uploadbtn' => 'Layisha ifayili',
+'filesource' => 'Umthombo:',
+'ignorewarnings' => 'Duba imiyalo',
 'upload-success-subj' => 'Ukulayisha okuchumile',
 
 'nolicense' => 'Ubekhetha lutho',
 
 # File description page
 'file-anchor-link' => 'Ifayela',
-'nolinkstoimage'   => 'Akukho amakhasi akhomba kuleli fayela.',
+'nolinkstoimage' => 'Akukho amakhasi akhomba kuleli fayela.',
 
 # Random page
 'randompage' => 'Ikhasi elingaphandle kokucabanga',
@@ -228,12 +228,12 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
 'statistics-header-users' => 'Ukwaziswa wamsebenzisi',
 
 # Miscellaneous special pages
-'shortpages'        => 'Amakhasi amafishane',
-'longpages'         => 'Amakhasi amade',
-'newpages'          => 'Amakhasi amasha',
+'shortpages' => 'Amakhasi amafishane',
+'longpages' => 'Amakhasi amade',
+'newpages' => 'Amakhasi amasha',
 'newpages-username' => 'Isiga:',
-'move'              => 'Sunduza',
-'movethispage'      => 'Thuthisa leli khasi',
+'move' => 'Sunduza',
+'movethispage' => 'Thuthisa leli khasi',
 
 # Special:Log
 'specialloguserlabel' => 'Umsebenzisi:',
@@ -243,25 +243,25 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
 'allpagessubmit' => 'Hamba',
 
 # E-mail user
-'emailuser'    => 'Thumela umlayezo lo msebenzisi',
+'emailuser' => 'Thumela umlayezo lo msebenzisi',
 'noemailtitle' => 'Akukho ikheli likaposi',
 'emailsubject' => 'Indaba',
 'emailmessage' => 'Umlayezo',
-'emailsend'    => 'Thuma',
-'emailsent'    => 'Umlayezo uthumwa',
+'emailsend' => 'Thuma',
+'emailsent' => 'Umlayezo uthumwa',
 
 # Watchlist
-'watchlist'    => 'Uhlelo ubukelwa wami',
-'watch'        => 'Bukela',
-'unwatch'      => "Mus'ukubukela",
+'watchlist' => 'Uhlelo ubukelwa wami',
+'watch' => 'Bukela',
+'unwatch' => "Mus'ukubukela",
 'notanarticle' => 'Akulona ikhasi elinakho okuqukethwe',
 
 'enotif_newpagetext' => 'Lelikhasi liyasha.',
 
 # Delete
 'deletepage' => 'Sula ikhasi',
-'confirm'    => 'Qinisekisa',
-'exblank'    => 'ikhasi elize',
+'confirm' => 'Qinisekisa',
+'exblank' => 'ikhasi elize',
 
 # Protect
 'protectcomment' => 'Isizathu',
@@ -275,31 +275,31 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
 
 # Contributions
 'contributions' => 'Amanikelo amsebenzisi',
-'mycontris'     => 'Amanikelo ami',
+'mycontris' => 'Amanikelo ami',
 
 # What links here
 'isredirect' => 'Ikhasi silayela',
 
 # Block/unblock
-'blockip'            => 'Vimbela lo msebenzisi',
-'ipbexpiry'          => 'Ukuphela',
-'ipbreason'          => 'Isizathu',
-'ipbsubmit'          => 'Vimbela lo msebenzisi',
-'ipusubmit'          => 'Qeda isivimbelo lo msebenzisi',
+'blockip' => 'Vimbela lo msebenzisi',
+'ipbexpiry' => 'Ukuphela',
+'ipbreason' => 'Isizathu',
+'ipbsubmit' => 'Vimbela lo msebenzisi',
+'ipusubmit' => 'Qeda isivimbelo lo msebenzisi',
 'createaccountblock' => 'Ukudala kwekhawundi kuvimbelwa',
-'proxyblocksuccess'  => 'Kuphelile.',
+'proxyblocksuccess' => 'Kuphelile.',
 
 # Developer tools
 'databasenotlocked' => 'Idatabheyisi alikhiyiwi.',
 
 # Move page
-'move-page-legend'        => 'Thuthisa ikhasi',
-'movearticle'             => 'Thuthisa ikhasi',
-'movenologin'             => 'Awungenile',
-'movepagebtn'             => 'Thuthisa ikhasi',
-'movedto'                 => 'Lithuthiselwe e',
-'movereason'              => 'Isizathu',
-'delete_and_move'         => 'Sula futhi sunduza',
+'move-page-legend' => 'Thuthisa ikhasi',
+'movearticle' => 'Thuthisa ikhasi',
+'movenologin' => 'Awungenile',
+'movepagebtn' => 'Thuthisa ikhasi',
+'movedto' => 'Lithuthiselwe e',
+'movereason' => 'Isizathu',
+'delete_and_move' => 'Sula futhi sunduza',
 'delete_and_move_confirm' => 'Yebo, sula ikhasi',
 
 # Export
@@ -310,7 +310,7 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
 
 # Thumbnails
 'thumbnail-more' => 'Khulisa',
-'filemissing'    => 'Ifayili lilahlekile',
+'filemissing' => 'Ifayili lilahlekile',
 
 # Special:Import
 'import-interwiki-submit' => 'Ngenisa',
@@ -321,27 +321,27 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
 # Patrolling
 'markaspatrolleddiff' => 'Dweba ukuthi lelikhasi liyagadwa',
 'markaspatrolledtext' => 'Dweba ukuthi lelikhasi liyagadwa',
-'markedaspatrolled'   => 'Dweba ukuthi lelikhasi liyagadwa',
+'markedaspatrolled' => 'Dweba ukuthi lelikhasi liyagadwa',
 
 # Special:NewFiles
 'newimages' => 'Uhlelo lwamafayela amasha',
-'noimages'  => 'Awuboni lutho.',
-'ilsubmit'  => 'Sesha',
+'noimages' => 'Awuboni lutho.',
+'ilsubmit' => 'Sesha',
 
 # Metadata
-'metadata-expand'   => 'Bukisa imininingwane yonke',
+'metadata-expand' => 'Bukisa imininingwane yonke',
 'metadata-collapse' => 'Fihla imininingwane yonke',
 
 # EXIF tags
 'exif-orientation' => 'Ukuma okumaqondana nempumalanga',
-'exif-artist'      => 'Umbhali',
-'exif-sharpness'   => 'Ububukhali',
+'exif-artist' => 'Umbhali',
+'exif-sharpness' => 'Ububukhali',
 
 'exif-orientation-1' => 'Kuphelele',
 
 'exif-meteringmode-5' => 'Umhlobiso',
 
-'exif-lightsource-4'  => 'Umbani',
+'exif-lightsource-4' => 'Umbani',
 'exif-lightsource-11' => 'Umthunzi',
 
 'exif-sensingmethod-1' => 'Akucaci',
@@ -362,7 +362,7 @@ ikhawundi lakho liyadalwa. musa ukukhohlwa ukuguqula amakhethelo a-{{SITENAME}}
 'exif-sharpness-2' => 'Kulukhuni',
 
 # E-mail address confirmation
-'confirmemail'          => 'Qinisekisa ikheli likagesi',
+'confirmemail' => 'Qinisekisa ikheli likagesi',
 'confirmemail_loggedin' => 'Ikheli likagesi lakho liqinisekiswa.',
 
 # Delete conflict
index 6b11704..56627f7 100644 (file)
@@ -7,7 +7,25 @@
  * @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
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0
+ * or later
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ *
  * @file
  * @since 1.20
  */
@@ -81,6 +99,7 @@ class CLDRPluralRuleEvaluator {
         * @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
+        * @throws CLDRPluralRuleError
         * @return mixed
         */
        private static function doOperation( $token, $left, $right ) {
@@ -131,7 +150,7 @@ class CLDRPluralRuleEvaluator {
  * Evaluator helper class representing a range list.
  */
 class CLDRPluralRuleEvaluator_Range {
-       var $parts = array();
+       public $parts = array();
 
        function __construct( $start, $end = false ) {
                if ( $end === false ) {
@@ -208,9 +227,9 @@ class CLDRPluralRuleEvaluator_Range {
  * Helper class for converting rules to reverse polish notation (RPN).
  */
 class CLDRPluralRuleConverter {
-       var $rule, $pos, $end;
-       var $operators = array();
-       var $operands = array();
+       public $rule, $pos, $end;
+       public $operators = array();
+       public $operands = array();
 
        /**
         * Precedence levels. Note that there's no need to worry about associativity
@@ -447,7 +466,7 @@ class CLDRPluralRuleConverter {
  * The base class for operators and expressions, describing a region of the input string.
  */
 class CLDRPluralRuleConverter_Fragment {
-       var $parser, $pos, $length, $end;
+       public $parser, $pos, $length, $end;
 
        function __construct( $parser, $pos, $length ) {
                $this->parser = $parser;
@@ -473,7 +492,7 @@ class CLDRPluralRuleConverter_Fragment {
  * validation.
  */
 class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragment {
-       var $type, $rpn;
+       public $type, $rpn;
 
        function __construct( $parser, $type, $rpn, $pos, $length ) {
                parent::__construct( $parser, $pos, $length );
@@ -498,7 +517,7 @@ class CLDRPluralRuleConverter_Expression extends CLDRPluralRuleConverter_Fragmen
  * messages), and the binary operator at that location.
  */
 class CLDRPluralRuleConverter_Operator extends CLDRPluralRuleConverter_Fragment {
-       var $name;
+       public $name;
 
        /**
         * Each op type has three characters: left operand type, right operand type and result type
index b60a196..e6862ac 100644 (file)
@@ -5,7 +5,6 @@
 # {{OUTPUT_DIRECTORY}}
 # {{CURRENT_VERSION}}
 # {{STRIP_FROM_PATH}}
-# {{SVNSTAT}}
 # {{INPUT}}
 #
 # To generate documentation run: php mwdocgen.php --no-extensions
@@ -63,7 +62,8 @@ ALIASES =     "type{1}=<b> \1 </b>:" \
                "protected=\access protected" \
                "public=\access public" \
                "copyright=\note" \
-               "license=\note"
+               "license=\note" \
+               "codeCoverageIgnore="
 OPTIMIZE_OUTPUT_FOR_C  = NO
 OPTIMIZE_OUTPUT_JAVA   = NO
 OPTIMIZE_FOR_FORTRAN   = NO
@@ -114,7 +114,7 @@ SHOW_USED_FILES        = YES
 SHOW_DIRECTORIES       = YES
 SHOW_FILES             = YES
 SHOW_NAMESPACES        = NO
-FILE_VERSION_FILTER    = {{SVNSTAT}}
+FILE_VERSION_FILTER    =
 LAYOUT_FILE            =
 CITE_BIB_FILES         =
 #---------------------------------------------------------------------------
@@ -172,9 +172,10 @@ FILE_PATTERNS          = *.c \
                          *.PHP5 \
                          *.M \
                          *.MM \
-                         *.PY
+                         *.PY \
+                         *.txt \
+                         README
 RECURSIVE              = YES
-EXCLUDE                = {{EXCLUDE}}
 EXCLUDE_SYMLINKS       = YES
 EXCLUDE_PATTERNS       = LocalSettings.php AdminSettings.php StartProfiler.php .svn */.git/* {{EXCLUDE_PATTERNS}}
 EXCLUDE_SYMBOLS        =
index c00d7a6..b0371c0 100644 (file)
@@ -108,6 +108,12 @@ abstract class Maintenance {
         */
        private $mDb = null;
 
+       /**
+        * Used when creating separate schema files.
+        * @var resource
+        */
+       public $fileHandle;
+
        /**
         * List of all the core maintenance scripts. This is added
         * to scripts added by extensions in $wgMaintenanceScripts
@@ -1136,7 +1142,8 @@ abstract class Maintenance {
                        $title = $titleObj->getPrefixedDBkey();
                        $this->output( "$title..." );
                        # Update searchindex
-                       $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getText() );
+                       # TODO: pass the Content object to SearchUpdate, let the search engine decide how to deal with it.
+                       $u = new SearchUpdate( $pageId, $titleObj->getText(), $rev->getContent()->getTextForSearchIndex() );
                        $u->doUpdate();
                        $this->output( "\n" );
                }
index d6e7691..9f95f5d 100644 (file)
@@ -56,15 +56,15 @@ installations.
 
        importDump.php
        XML dump importer
-       
+
        importImages.php
        Import images into the wiki
-       
+
        importTextFile.php
        Import the contents of a text file into a wiki page
 
        moveBatch.php
-       Move a batch of pages 
+       Move a batch of pages
 
        namespaceDupes.php
        Check articles name to see if they conflict with new/existing namespaces
diff --git a/maintenance/archives/patch-archive-ar_content_format.sql b/maintenance/archives/patch-archive-ar_content_format.sql
new file mode 100644 (file)
index 0000000..81f9fca
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/archive
+  ADD ar_content_format varbinary(64) DEFAULT NULL;
diff --git a/maintenance/archives/patch-archive-ar_content_model.sql b/maintenance/archives/patch-archive-ar_content_model.sql
new file mode 100644 (file)
index 0000000..1a8b630
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/archive
+  ADD ar_content_model varbinary(32) DEFAULT NULL;
index 62baa2d..997b4a9 100644 (file)
@@ -1,4 +1,4 @@
 -- Adds a user,timestamp index to the archive table
 -- Used for browsing deleted contributions and renames
-ALTER TABLE /*$wgDBprefix*/archive 
+ALTER TABLE /*$wgDBprefix*/archive
        ADD INDEX usertext_timestamp ( ar_user_text , ar_timestamp );
index 5facd9e..22cc587 100644 (file)
@@ -1,10 +1,10 @@
--- 
+--
 -- patch-backlinkindexes.sql
--- 
+--
 -- Per bug 6440 / http://bugzilla.wikimedia.org/show_bug.cgi?id=6440
 --
 -- Improve performance of the "what links here"-type queries
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/pagelinks
    DROP INDEX pl_namespace,
@@ -13,7 +13,7 @@ ALTER TABLE /*$wgDBprefix*/pagelinks
 ALTER TABLE /*$wgDBprefix*/templatelinks
    DROP INDEX tl_namespace,
    ADD INDEX tl_namespace(tl_namespace, tl_title, tl_from);
-   
+
 ALTER TABLE /*$wgDBprefix*/imagelinks
    DROP INDEX il_to,
    ADD INDEX il_to(il_to, il_from);
index 416500c..97a5690 100644 (file)
@@ -8,7 +8,7 @@ CREATE TABLE /*$wgDBprefix*/category (
   cat_files int signed NOT NULL default 0,
 
   cat_hidden tinyint(1) unsigned NOT NULL default 0,
-  
+
   PRIMARY KEY (cat_id),
   UNIQUE KEY (cat_title),
 
index 02168d7..0af0cf9 100644 (file)
@@ -6,7 +6,7 @@
 CREATE TABLE /*$wgDBprefix*/categorylinks (
   -- Key to page_id of the page defined as a category member.
   cl_from int unsigned NOT NULL default '0',
-  
+
   -- Name of the category.
   -- This is also the page_title of the category's description page;
   -- all such pages are in namespace 14 (NS_CATEGORY).
@@ -17,20 +17,20 @@ CREATE TABLE /*$wgDBprefix*/categorylinks (
   -- isn't always ideal, but collations seem to be an exciting
   -- and dangerous new world in MySQL...
   --
-  -- Truncate so that the cl_sortkey key fits in 1000 bytes 
+  -- Truncate so that the cl_sortkey key fits in 1000 bytes
   -- (MyISAM 5 with server_character_set=utf8)
   cl_sortkey varchar(70) binary NOT NULL default '',
-  
+
   -- This isn't really used at present. Provided for an optional
   -- sorting method by approximate addition time.
   cl_timestamp timestamp NOT NULL,
-  
+
   UNIQUE KEY cl_from(cl_from,cl_to),
-  
+
   -- This key is trouble. It's incomplete, AND it's too big
   -- when collation is set to UTF-8. Bleeeacch!
   KEY cl_sortkey(cl_to,cl_sortkey),
-  
+
   -- Not really used?
   KEY cl_timestamp(cl_to,cl_timestamp)
 
index 8a9ff12..24ad84f 100644 (file)
@@ -1,10 +1,10 @@
--- 
+--
 -- patch-categorylinksindex.sql
--- 
+--
 -- Per bug 10280 / http://bugzilla.wikimedia.org/show_bug.cgi?id=10280
 --
 -- Improve enum continuation performance of the what pages belong to a category query
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/categorylinks
    DROP INDEX cl_sortkey,
diff --git a/maintenance/archives/patch-config.sql b/maintenance/archives/patch-config.sql
deleted file mode 100644 (file)
index 791015e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
--- Table for holding configuration changes
-CREATE TABLE /*_*/config (
-  -- Config var name
-  cf_name varbinary(255) NOT NULL PRIMARY KEY,
-  -- Config var value
-  cf_value blob NOT NULL
-) /*$wgDBTableOptions*/;
--- Should cover *most* configuration - strings, ints, bools, etc.
-CREATE INDEX /*i*/cf_name_value ON /*_*/config (cf_name,cf_value(255));
diff --git a/maintenance/archives/patch-drop-ss_admins.sql b/maintenance/archives/patch-drop-ss_admins.sql
new file mode 100644 (file)
index 0000000..13c3d3b
--- /dev/null
@@ -0,0 +1,2 @@
+-- field is deprecated and no longer updated as of 1.5
+ALTER TABLE /*_*/site_stats DROP COLUMN ss_admins;
\ No newline at end of file
index 0a4768c..fc5017d 100644 (file)
@@ -5,7 +5,7 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
   el_from int(8) unsigned NOT NULL default '0',
   el_to blob NOT NULL,
   el_index blob NOT NULL,
-  
+
   KEY (el_from, el_to(40)),
   KEY (el_to(60), el_from),
   KEY (el_index(60))
index 3483f8c..7ab6523 100644 (file)
@@ -1,3 +1,3 @@
 -- Adding fa_deleted field for additional content suppression
-ALTER TABLE /*$wgDBprefix*/filearchive 
+ALTER TABLE /*$wgDBprefix*/filearchive
   ADD fa_deleted tinyint unsigned NOT NULL default '0';
diff --git a/maintenance/archives/patch-fa_sha1.sql b/maintenance/archives/patch-fa_sha1.sql
new file mode 100644 (file)
index 0000000..931bc44
--- /dev/null
@@ -0,0 +1,4 @@
+-- Add fa_sha1 and related index
+ALTER TABLE /*$wgDBprefix*/filearchive
+  ADD COLUMN fa_sha1 varbinary(32) NOT NULL default '';
+CREATE INDEX /*i*/fa_sha1 ON /*$wgDBprefix*/filearchive (fa_sha1(10));
index c79000a..0d8c3ab 100644 (file)
@@ -1,5 +1,5 @@
 -- Adding index to sort by uploader
-ALTER TABLE /*$wgDBprefix*/filearchive 
+ALTER TABLE /*$wgDBprefix*/filearchive
   ADD INDEX fa_user_timestamp (fa_user_text,fa_timestamp),
   -- Remove useless, incomplete index
   DROP INDEX fa_deleted_user;
index 587a2ab..f75da8b 100644 (file)
@@ -4,30 +4,30 @@
 CREATE TABLE /*$wgDBprefix*/filearchive (
   -- Unique row id
   fa_id int not null auto_increment,
-  
+
   -- Original base filename; key to image.img_name, page.page_title, etc
   fa_name varchar(255) binary NOT NULL default '',
-  
+
   -- Filename of archived file, if an old revision
   fa_archive_name varchar(255) binary default '',
-  
+
   -- Which storage bin (directory tree or object store) the file data
   -- is stored in. Should be 'deleted' for files that have been deleted;
   -- any other bin is not yet in use.
   fa_storage_group varbinary(16),
-  
+
   -- SHA-1 of the file contents plus extension, used as a key for storage.
   -- eg 8f8a562add37052a1848ff7771a2c515db94baa9.jpg
   --
   -- If NULL, the file was missing at deletion time or has been purged
   -- from the archival storage.
   fa_storage_key varbinary(64) default '',
-  
+
   -- Deletion information, if this file is deleted.
   fa_deleted_user int,
   fa_deleted_timestamp binary(14) default '',
   fa_deleted_reason text,
-  
+
   -- Duped fields from image
   fa_size int unsigned default '0',
   fa_width int  default '0',
@@ -41,7 +41,7 @@ CREATE TABLE /*$wgDBprefix*/filearchive (
   fa_user int unsigned default '0',
   fa_user_text varchar(255) binary default '',
   fa_timestamp binary(14) default '',
-  
+
   PRIMARY KEY (fa_id),
   INDEX (fa_name, fa_timestamp),             -- pick out by image name
   INDEX (fa_storage_group, fa_storage_key),  -- pick out dupe files
index 50e56e0..c87c959 100644 (file)
@@ -1,5 +1,5 @@
 --
--- hitcounter table is used to buffer page hits before they are periodically 
+-- hitcounter table is used to buffer page hits before they are periodically
 -- counted and added to the cur_counter column in the cur table.
 -- December 2003
 --
index db56b22..a74d7bd 100644 (file)
@@ -1,8 +1,8 @@
--- 
+--
 -- image-user-index.sql
--- 
+--
 -- Add user/timestamp index to current image versions
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/image
    ADD INDEX img_usertext_timestamp (img_user_text,img_timestamp);
index 857eb98..87b8c2f 100644 (file)
@@ -4,11 +4,11 @@
 ALTER TABLE /*$wgDBprefix*/image ADD (
   -- Media type as defined by the MEDIATYPE_xxx constants
   img_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
-  
+
   -- major part of a MIME media type as defined by IANA
   -- see http://www.iana.org/assignments/media-types/
   img_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart") NOT NULL default "unknown",
-  
+
   -- minor part of a MIME media type as defined by IANA
   -- the minor parts are not required to adher to any standard
   -- but should be consistent throughout the database
index 35950f5..0a375c4 100644 (file)
@@ -1,8 +1,8 @@
 -- Add img_sha1, oi_sha1 and related indexes
 ALTER TABLE /*$wgDBprefix*/image
   ADD COLUMN img_sha1 varbinary(32) NOT NULL default '',
-  ADD INDEX img_sha1 (img_sha1);
+  ADD INDEX img_sha1 (img_sha1(10));
 
 ALTER TABLE /*$wgDBprefix*/oldimage
   ADD COLUMN oi_sha1 varbinary(32) NOT NULL default '',
-  ADD INDEX oi_sha1 (oi_sha1);
+  ADD INDEX oi_sha1 (oi_sha1(10));
index c56838f..c24d995 100644 (file)
@@ -1,8 +1,8 @@
--- 
+--
 -- patch-indexes.sql
--- 
+--
 -- Fix up table indexes; new to stable release in November 2003
--- 
+--
 
 ALTER TABLE IF EXISTS /*$wgDBprefix*/links
    DROP INDEX l_from,
index 321765b..57b7945 100644 (file)
@@ -5,16 +5,16 @@
 CREATE TABLE /*$wgDBprefix*/interwiki (
   -- The interwiki prefix, (e.g. "Meatball", or the language prefix "de")
   iw_prefix varchar(32) NOT NULL,
-  
+
   -- The URL of the wiki, with "$1" as a placeholder for an article name.
   -- Any spaces in the name will be transformed to underscores before
   -- insertion.
   iw_url blob NOT NULL,
-  
+
   -- A boolean value indicating whether the wiki is in this project
   -- (used, for example, to detect redirect loops)
   iw_local BOOL NOT NULL,
-  
+
   UNIQUE KEY iw_prefix (iw_prefix)
 
 ) /*$wgDBTableOptions*/;
index fcd257c..bb39c1d 100644 (file)
@@ -1,9 +1,9 @@
--- Add extra option fields to the ipblocks table, add some extra indexes, 
--- convert infinity values in ipb_expiry to something that sorts better, 
--- extend ipb_address and range fields, add a unique index for block conflict 
+-- Add extra option fields to the ipblocks table, add some extra indexes,
+-- convert infinity values in ipb_expiry to something that sorts better,
+-- extend ipb_address and range fields, add a unique index for block conflict
 -- detection.
 
--- Conflicts in the new unique index can be handled by creating a new 
+-- Conflicts in the new unique index can be handled by creating a new
 -- table and inserting into it instead of doing an ALTER TABLE.
 
 
@@ -22,7 +22,7 @@ CREATE TABLE /*$wgDBprefix*/ipblocks_newunique (
   ipb_expiry varbinary(14) NOT NULL default '',
   ipb_range_start tinyblob NOT NULL,
   ipb_range_end tinyblob NOT NULL,
-  
+
   PRIMARY KEY ipb_id (ipb_id),
   UNIQUE INDEX ipb_address_unique (ipb_address(255), ipb_user, ipb_auto),
   INDEX ipb_user (ipb_user),
@@ -32,8 +32,8 @@ CREATE TABLE /*$wgDBprefix*/ipblocks_newunique (
 
 ) /*$wgDBTableOptions*/;
 
-INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique 
-        (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account) 
+INSERT IGNORE INTO /*$wgDBprefix*/ipblocks_newunique
+        (ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, ipb_anon_only, ipb_create_account)
   SELECT ipb_id, ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry, ipb_range_start, ipb_range_end, 0            , ipb_user=0
   FROM /*$wgDBprefix*/ipblocks;
 
index c0b620d..e809d10 100644 (file)
@@ -4,7 +4,7 @@
 ALTER TABLE /*$wgDBprefix*/ipblocks
        ADD ipb_by_text varchar(255) binary NOT NULL default '';
 
-UPDATE /*$wgDBprefix*/ipblocks 
+UPDATE /*$wgDBprefix*/ipblocks
        JOIN /*$wgDBprefix*/user ON ipb_by = user_id
        SET ipb_by_text = user_name
        WHERE ipb_by != 0;
\ No newline at end of file
index fad9477..b12ddaa 100644 (file)
@@ -1,3 +1,3 @@
 -- Adding ipb_deleted field for hiding usernames
-ALTER TABLE /*$wgDBprefix*/ipblocks 
+ALTER TABLE /*$wgDBprefix*/ipblocks
   ADD ipb_deleted bool NOT NULL default 0;
index 64a906d..84cba8f 100644 (file)
@@ -1,5 +1,5 @@
 -- Add the range handling fields
-ALTER TABLE /*$wgDBprefix*/ipblocks 
+ALTER TABLE /*$wgDBprefix*/ipblocks
   ADD ipb_range_start tinyblob NOT NULL default '',
   ADD ipb_range_end tinyblob NOT NULL default '',
   ADD INDEX ipb_range (ipb_range_start(8), ipb_range_end(8));
@@ -7,15 +7,15 @@ ALTER TABLE /*$wgDBprefix*/ipblocks
 
 -- Initialise fields
 -- Only range blocks match ipb_address LIKE '%/%', this fact is used in the code already
-UPDATE /*$wgDBprefix*/ipblocks 
-  SET 
-    ipb_range_start = LPAD(HEX( 
+UPDATE /*$wgDBprefix*/ipblocks
+  SET
+    ipb_range_start = LPAD(HEX(
         (SUBSTRING_INDEX(ipb_address, '.', 1) << 24)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 2), '.', -1) << 16)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 3), '.', -1) << 24)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '/', 1), '.', -1)) ), 8, '0' ),
 
-    ipb_range_end = LPAD(HEX( 
+    ipb_range_end = LPAD(HEX(
         (SUBSTRING_INDEX(ipb_address, '.', 1) << 24)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 2), '.', -1) << 16)
       + (SUBSTRING_INDEX(SUBSTRING_INDEX(ipb_address, '.', 3), '.', -1) << 24)
index 89b34cb..b7bd3f1 100644 (file)
@@ -1,10 +1,10 @@
--- 
+--
 -- Track inline interwiki links
 --
 CREATE TABLE /*_*/iwlinks (
   -- page_id of the referring page
   iwl_from int unsigned NOT NULL default 0,
-  
+
   -- Interwiki prefix code of the target
   iwl_prefix varbinary(20) NOT NULL default '',
 
index c9199ef..662f5d2 100644 (file)
@@ -1,7 +1,7 @@
 -- Jobs performed by parallel apache threads or a command-line daemon
 CREATE TABLE /*_*/job (
   job_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  
+
   -- Command name
   -- Limited to 60 to prevent key length overflow
   job_cmd varbinary(60) NOT NULL default '',
diff --git a/maintenance/archives/patch-job_attempts.sql b/maintenance/archives/patch-job_attempts.sql
new file mode 100644 (file)
index 0000000..47b73e8
--- /dev/null
@@ -0,0 +1,4 @@
+ALTER TABLE /*_*/job
+    ADD COLUMN job_attempts integer unsigned NOT NULL default 0;
+
+CREATE INDEX /*i*/job_cmd_token_id ON /*_*/job (job_cmd,job_token,job_id);
diff --git a/maintenance/archives/patch-job_token.sql b/maintenance/archives/patch-job_token.sql
new file mode 100644 (file)
index 0000000..080fa97
--- /dev/null
@@ -0,0 +1,9 @@
+ALTER TABLE /*_*/job
+    ADD COLUMN job_random integer unsigned NOT NULL default 0,
+    ADD COLUMN job_token varbinary(32) NOT NULL default '',
+    ADD COLUMN job_token_timestamp varbinary(14) NULL default NULL,
+    ADD COLUMN job_sha1 varbinary(32) NOT NULL default '';
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+
index ffff07c..5594acd 100644 (file)
@@ -1,7 +1,7 @@
 CREATE TABLE /*$wgDBprefix*/langlinks (
   -- page_id of the referring page
   ll_from int unsigned NOT NULL default '0',
-  
+
   -- Language code of the target
   ll_lang varbinary(20) NOT NULL default '',
 
index b15878c..d53d2ea 100644 (file)
@@ -6,13 +6,13 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/links;
 CREATE TABLE /*$wgDBprefix*/links (
   -- Key to the page_id of the page containing the link.
   l_from int unsigned NOT NULL default '0',
-  
+
   -- Key to the page_id of the link target.
   -- An unfortunate consequence of this is that rename
   -- operations require changing the links entries for
   -- all links to the moved page.
   l_to int unsigned NOT NULL default '0',
-  
+
   UNIQUE KEY l_from(l_from,l_to),
   KEY (l_to)
 
@@ -27,7 +27,7 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/brokenlinks;
 CREATE TABLE /*$wgDBprefix*/brokenlinks (
   -- Key to the page_id of the page containing the link.
   bl_from int unsigned NOT NULL default '0',
-  
+
   -- Text of the target page title ("namesapce:title").
   -- Unfortunately this doesn't split the namespace index
   -- key and therefore can't easily be joined to anything.
@@ -46,12 +46,12 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/imagelinks;
 CREATE TABLE /*$wgDBprefix*/imagelinks (
   -- Key to page_id of the page containing the image / media link.
   il_from int unsigned NOT NULL default '0',
-  
+
   -- Filename of target image.
   -- This is also the page_title of the file's description page;
   -- all such pages are in namespace 6 (NS_FILE).
   il_to varchar(255) binary NOT NULL default '',
-  
+
   UNIQUE KEY il_from(il_from,il_to),
   KEY (il_to)
 
index 41e051d..7e1113e 100644 (file)
@@ -1,7 +1,7 @@
 -- Rename the primary unique index from PRIMARY to ls_field_val
 -- This is for MySQL only and is necessary only for databases which were updated
 -- between MW 1.16 development revisions r50567 and r51465.
-ALTER TABLE /*_*/log_search 
-       DROP PRIMARY KEY, 
+ALTER TABLE /*_*/log_search
+       DROP PRIMARY KEY,
        ADD UNIQUE INDEX ls_field_val (ls_field,ls_value,ls_log_id);
 
index 9a783d8..12ca75e 100644 (file)
@@ -1,4 +1,4 @@
-ALTER TABLE /*$wgDBprefix*/logging 
+ALTER TABLE /*$wgDBprefix*/logging
        ADD log_user_text varchar(255) binary NOT NULL default '',
        ADD log_page int unsigned NULL,
        CHANGE log_type log_type varbinary(32) NOT NULL,
index e66ceec..5f24f5c 100644 (file)
@@ -1,8 +1,8 @@
--- 
+--
 -- patch-logging-times-index.sql
--- 
+--
 -- Add a very humble index on logging times
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/logging
    ADD INDEX times (log_timestamp);
index b5cfdf7..79df0dd 100644 (file)
@@ -7,21 +7,21 @@ CREATE TABLE /*$wgDBprefix*/logging (
   -- action field, but only the type controls categorization.
   log_type varbinary(10) NOT NULL default '',
   log_action varbinary(10) NOT NULL default '',
-  
+
   -- Timestamp. Duh.
   log_timestamp binary(14) NOT NULL default '19700101000000',
-  
+
   -- The user who performed this action; key to user_id
   log_user int unsigned NOT NULL default 0,
-  
+
   -- Key to the page affected. Where a user is the target,
   -- this will point to the user page.
   log_namespace int NOT NULL default 0,
   log_title varchar(255) binary NOT NULL default '',
-  
+
   -- Freeform text. Interpreted as edit history comments.
   log_comment varchar(255) NOT NULL default '',
-  
+
   -- LF separated list of miscellaneous parameters
   log_params blob NOT NULL,
 
index 8b63d1f..88dd64c 100644 (file)
@@ -3,8 +3,8 @@ ALTER TABLE /*_*/filearchive
 
 ALTER TABLE /*_*/image
   MODIFY COLUMN img_minor_mime varbinary(100) NOT NULL default "unknown";
-  
+
 ALTER TABLE /*_*/oldimage
   MODIFY COLUMN oi_minor_mime varbinary(100) NOT NULL default "unknown";
-  
+
 INSERT INTO /*_*/updatelog(ul_key) VALUES ('mime_minor_length');
index f4f3533..9fa05d2 100644 (file)
@@ -2,7 +2,7 @@
 CREATE TABLE /*_*/msg_resource (
   -- Resource name
   mr_resource varbinary(255) NOT NULL,
-  -- Language code 
+  -- Language code
   mr_lang varbinary(32) NOT NULL,
   -- JSON blob. This is an incomplete JSON object, i.e. without the wrapping {}
   mr_blob mediumblob NOT NULL,
index bc84887..df043c5 100644 (file)
@@ -1,10 +1,10 @@
--- 
+--
 -- patch-oi_metadata.sql
--- 
+--
 -- Add data to allow for direct reference to old images
 -- Some re-indexing here.
 -- Old images can be included into pages effeciently now.
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/oldimage
    DROP INDEX oi_name,
index 949625e..2c7f807 100644 (file)
@@ -1,8 +1,8 @@
--- 
+--
 -- oldimage-user-index.sql
--- 
+--
 -- Add user/timestamp index to old image versions
--- 
+--
 
 ALTER TABLE /*$wgDBprefix*/oldimage
    ADD INDEX oi_usertext_timestamp (oi_user_text,oi_timestamp);
diff --git a/maintenance/archives/patch-page-page_content_model.sql b/maintenance/archives/patch-page-page_content_model.sql
new file mode 100644 (file)
index 0000000..30434d9
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/page
+  ADD page_content_model varbinary(32) DEFAULT NULL;
index 118592f..cea89b5 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- Create the new pagelinks table to merge links and brokenlinks data,
 -- and populate it.
--- 
+--
 -- Unlike the old links and brokenlinks, these records will not need to be
 -- altered when target pages are created, deleted, or renamed. This should
 -- reduce the amount of severe database frustration that happens when widely-
 CREATE TABLE /*$wgDBprefix*/pagelinks (
   -- Key to the page_id of the page containing the link.
   pl_from int unsigned NOT NULL default '0',
-  
+
   -- Key to page_namespace/page_title of the target page.
   -- The target page may or may not exist, and due to renames
   -- and deletions may refer to different page records as time
   -- goes by.
   pl_namespace int NOT NULL default '0',
   pl_title varchar(255) binary NOT NULL default '',
-  
+
   UNIQUE KEY pl_from(pl_from,pl_namespace,pl_title),
   KEY (pl_namespace,pl_title)
 
index 395a81b..5fe241c 100644 (file)
@@ -1,5 +1,5 @@
 --
--- parsercache table, for cacheing complete parsed articles 
+-- parsercache table, for cacheing complete parsed articles
 -- before they are imbedded in the skin.
 --
 
index 186a203..a356670 100644 (file)
@@ -1,6 +1,6 @@
--- 
+--
 -- patch-pl-tl-il-unique-index.sql
--- 
+--
 -- Make reorderings of UNIQUE indices UNIQUE as well
 
 DROP INDEX /*i*/pl_namespace ON /*_*/pagelinks;
index e6da79c..8e1a518 100644 (file)
@@ -3,14 +3,14 @@
 CREATE TABLE /*$wgDBprefix*/querycache (
   -- A key name, generally the base name of of the special page.
   qc_type varbinary(32) NOT NULL,
-  
+
   -- Some sort of stored value. Sizes, counts...
   qc_value int unsigned NOT NULL default '0',
-  
+
   -- Target namespace+title
   qc_namespace int NOT NULL default '0',
   qc_title varchar(255) binary NOT NULL default '',
-  
+
   KEY (qc_type,qc_value)
 
 ) /*$wgDBTableOptions*/;
index 01623bc..7913131 100644 (file)
@@ -3,14 +3,14 @@
 CREATE TABLE /*$wgDBprefix*/querycachetwo (
   -- A key name, generally the base name of of the special page.
   qcc_type varbinary(32) NOT NULL,
-  
+
   -- Some sort of stored value. Sizes, counts...
   qcc_value int unsigned NOT NULL default '0',
-  
+
   -- Target namespace+title
   qcc_namespace int NOT NULL default '0',
   qcc_title varchar(255) binary NOT NULL default '',
-  
+
   -- Target namespace+title2
   qcc_namespacetwo int NOT NULL default '0',
   qcc_titletwo varchar(255) binary NOT NULL default '',
index 04ead97..f4bbd0f 100644 (file)
@@ -1,6 +1,6 @@
 -- Adding rc_deleted field for revisiondelete
 -- Add rc_logid to match log_id
-ALTER TABLE /*$wgDBprefix*/recentchanges 
+ALTER TABLE /*$wgDBprefix*/recentchanges
   ADD rc_deleted tinyint unsigned NOT NULL default '0',
   ADD rc_logid int unsigned NOT NULL default '0',
   ADD rc_log_type varbinary(255) NULL default NULL,
index 3b02375..28caee0 100644 (file)
@@ -1,6 +1,6 @@
 -- Primary key in recentchanges
 
-ALTER TABLE /*$wgDBprefix*/recentchanges 
+ALTER TABLE /*$wgDBprefix*/recentchanges
   ADD rc_id int NOT NULL auto_increment,
   ADD PRIMARY KEY rc_id (rc_id);
 
index 6b0b053..4d93300 100644 (file)
@@ -1,6 +1,6 @@
 -- Adding the rc_ip field for logging of IP addresses in recentchanges
 
-ALTER TABLE /*$wgDBprefix*/recentchanges 
+ALTER TABLE /*$wgDBprefix*/recentchanges
   ADD rc_ip varbinary(40) NOT NULL default '',
   ADD INDEX rc_ip (rc_ip);
 
diff --git a/maintenance/archives/patch-rc_moved.sql b/maintenance/archives/patch-rc_moved.sql
new file mode 100644 (file)
index 0000000..2fa1de6
--- /dev/null
@@ -0,0 +1,4 @@
+-- rc_moved_to_ns and rc_moved_to_title is no longer used, delete the fields
+
+ALTER TABLE /*$wgDBprefix*/recentchanges DROP COLUMN rc_moved_to_ns,
+                                         DROP COLUMN rc_moved_to_title;
index 5d7218b..d2957df 100644 (file)
@@ -1,7 +1,7 @@
 --
 -- Create the new redirect table.
 -- For each redirect, this table contains exactly one row defining its target
--- 
+--
 CREATE TABLE /*$wgDBprefix*/redirect (
   -- Key to the page_id of the redirect page
   rd_from int unsigned NOT NULL default '0',
index 4b11b36..4a41003 100644 (file)
@@ -1,4 +1,4 @@
--- 
+--
 -- Recreates the iwl_prefix index for the iwlinks table
 --
 CREATE UNIQUE INDEX /*i*/iwl_prefix_title_from ON /*_*/iwlinks (iwl_prefix, iwl_title, iwl_from);
index 7b63848..a5bc3e5 100644 (file)
@@ -38,7 +38,6 @@ CREATE TABLE /*$wgDBprefix*/revision (
   rev_minor_edit tinyint unsigned NOT NULL default '0',
   rev_deleted tinyint unsigned NOT NULL default '0',
 
-  
   PRIMARY KEY rev_page_id (rev_page, rev_id),
   UNIQUE INDEX rev_id (rev_id),
   INDEX rev_timestamp (rev_timestamp),
@@ -53,7 +52,7 @@ CREATE TABLE /*$wgDBprefix*/revision (
 --   old_id int(8) unsigned NOT NULL auto_increment,
 --   old_text mediumtext NOT NULL,
 --   old_flags tinyblob NOT NULL,
---   
+--
 --   PRIMARY KEY old_id (old_id)
 -- );
 
diff --git a/maintenance/archives/patch-revision-rev_content_format.sql b/maintenance/archives/patch-revision-rev_content_format.sql
new file mode 100644 (file)
index 0000000..22aeb8a
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/revision
+  ADD rev_content_format varbinary(64) DEFAULT NULL;
diff --git a/maintenance/archives/patch-revision-rev_content_model.sql b/maintenance/archives/patch-revision-rev_content_model.sql
new file mode 100644 (file)
index 0000000..1ba0572
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/revision
+  ADD rev_content_model varbinary(32) DEFAULT NULL;
index 9b635a8..36507a2 100644 (file)
@@ -10,13 +10,13 @@ DROP TABLE IF EXISTS /*$wgDBprefix*/searchindex;
 CREATE TABLE /*$wgDBprefix*/searchindex (
   -- Key to page_id
   si_page int unsigned NOT NULL,
-  
+
   -- Munged version of title
   si_title varchar(255) NOT NULL default '',
-  
+
   -- Munged version of body text
   si_text mediumtext NOT NULL,
-  
+
   UNIQUE KEY (si_page)
 
 ) ENGINE=MyISAM;
diff --git a/maintenance/archives/patch-sites.sql b/maintenance/archives/patch-sites.sql
new file mode 100644 (file)
index 0000000..8839274
--- /dev/null
@@ -0,0 +1,71 @@
+-- Patch to add the sites and site_identifiers tables.
+-- Licence: GNU GPL v2+
+-- Author: Jeroen De Dauw < jeroendedauw@gmail.com >
+
+
+-- Holds all the sites known to the wiki.
+CREATE TABLE IF NOT EXISTS /*_*/sites (
+-- Numeric id of the site
+  site_id                    INT UNSIGNED        NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+  -- Global identifier for the site, ie 'enwiktionary'
+  site_global_key            varbinary(32)       NOT NULL,
+
+  -- Type of the site, ie 'mediawiki'
+  site_type                  varbinary(32)       NOT NULL,
+
+  -- Group of the site, ie 'wikipedia'
+  site_group                 varbinary(32)       NOT NULL,
+
+  -- Source of the site data, ie 'local', 'wikidata', 'my-magical-repo'
+  site_source                varbinary(32)       NOT NULL,
+
+  -- Language code of the sites primary language.
+  site_language              varbinary(32)       NOT NULL,
+
+  -- Protocol of the site, ie 'http://', 'irc://', '//'
+  -- This field is an index for lookups and is build from type specific data in site_data.
+  site_protocol              varbinary(32)       NOT NULL,
+
+  -- Domain of the site in reverse order, ie 'org.mediawiki.www.'
+  -- This field is an index for lookups and is build from type specific data in site_data.
+  site_domain                VARCHAR(255)        NOT NULL,
+
+  -- Type dependent site data.
+  site_data                  BLOB                NOT NULL,
+
+  -- If site.tld/path/key:pageTitle should forward users to  the page on
+  -- the actual site, where "key" is the local identifier.
+  site_forward              bool                NOT NULL,
+
+  -- Type dependent site config.
+  -- For instance if template transclusion should be allowed if it's a MediaWiki.
+  site_config               BLOB                NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/sites_global_key ON /*_*/sites (site_global_key);
+CREATE INDEX /*i*/sites_type ON /*_*/sites (site_type);
+CREATE INDEX /*i*/sites_group ON /*_*/sites (site_group);
+CREATE INDEX /*i*/sites_source ON /*_*/sites (site_source);
+CREATE INDEX /*i*/sites_language ON /*_*/sites (site_language);
+CREATE INDEX /*i*/sites_protocol ON /*_*/sites (site_protocol);
+CREATE INDEX /*i*/sites_domain ON /*_*/sites (site_domain);
+CREATE INDEX /*i*/sites_forward ON /*_*/sites (site_forward);
+
+
+
+-- Links local site identifiers to their corresponding site.
+CREATE TABLE IF NOT EXISTS /*_*/site_identifiers (
+  -- Key on site.site_id
+  si_site                    INT UNSIGNED        NOT NULL,
+
+  -- local key type, ie 'interwiki' or 'langlink'
+  si_type                    varbinary(32)       NOT NULL,
+
+  -- local key value, ie 'en' or 'wiktionary'
+  si_key                     varbinary(32)       NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/site_ids_type ON /*_*/site_identifiers (si_type, si_key);
+CREATE INDEX /*i*/site_ids_site ON /*_*/site_identifiers (si_site);
+CREATE INDEX /*i*/site_ids_key ON /*_*/site_identifiers (si_key);
\ No newline at end of file
index a545b34..086b6a1 100644 (file)
@@ -4,16 +4,15 @@
 CREATE TABLE /*$wgDBprefix*/templatelinks (
   -- Key to the page_id of the page containing the link.
   tl_from int unsigned NOT NULL default '0',
-  
+
   -- Key to page_namespace/page_title of the target page.
   -- The target page may or may not exist, and due to renames
   -- and deletions may refer to different page records as time
   -- goes by.
   tl_namespace int NOT NULL default '0',
   tl_title varchar(255) binary NOT NULL default '',
-  
+
   UNIQUE KEY tl_from(tl_from,tl_namespace,tl_title),
   KEY (tl_namespace,tl_title)
-
 ) /*$wgDBTableOptions*/;
 
index 8591d81..6699b55 100644 (file)
@@ -12,13 +12,13 @@ drop table if exists /*$wgDBprefix*/testrun;
 
 create table /*$wgDBprefix*/testrun (
   tr_id int not null auto_increment,
-  
+
   tr_date char(14) binary,
   tr_mw_version blob,
   tr_php_version blob,
   tr_db_version blob,
   tr_uname blob,
-  
+
   primary key (tr_id)
 ) engine=InnoDB;
 
@@ -26,10 +26,10 @@ create table /*$wgDBprefix*/testitem (
   ti_run int not null,
   ti_name varchar(255),
   ti_success bool,
-  
+
   unique key (ti_run, ti_name),
   key (ti_run, ti_success),
-  
+
   foreign key (ti_run) references /*$wgDBprefix*/testrun(tr_id)
     on delete cascade
 ) engine=InnoDB;
diff --git a/maintenance/archives/patch-uploadstash-us_props.sql b/maintenance/archives/patch-uploadstash-us_props.sql
new file mode 100644 (file)
index 0000000..d64515a
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE /*$wgDBprefix*/uploadstash
+  ADD COLUMN us_props blob;
index 2512076..14eaeab 100644 (file)
@@ -1,10 +1,10 @@
 --
--- Store information about newly uploaded files before they're 
+-- Store information about newly uploaded files before they're
 -- moved into the actual filestore
 --
 CREATE TABLE /*_*/uploadstash (
        us_id int unsigned NOT NULL PRIMARY KEY auto_increment,
-       
+
        -- the user who uploaded the file.
        us_user int unsigned NOT NULL,
 
@@ -14,16 +14,16 @@ CREATE TABLE /*_*/uploadstash (
 
        -- the original path
        us_orig_path varchar(255) NOT NULL,
-       
+
        -- the temporary path at which the file is actually stored
        us_path varchar(255) NOT NULL,
-       
+
        -- which type of upload the file came from (sometimes)
        us_source_type varchar(50),
-       
+
        -- the date/time on which the file was added
        us_timestamp varbinary(14) not null,
-       
+
        us_status varchar(50) not null,
 
        -- file properties from File::getPropsFromPath.  these may prove unnecessary.
@@ -33,12 +33,11 @@ CREATE TABLE /*_*/uploadstash (
        us_sha1 varchar(31) NOT NULL,
        us_mime varchar(255),
        -- Media type as defined by the MEDIATYPE_xxx constants, should duplicate definition in the image table
-       us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
+       us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
        -- image-specific properties
        us_image_width int unsigned,
        us_image_height int unsigned,
        us_image_bits smallint unsigned
-       
 ) /*$wgDBTableOptions*/;
 
 -- sometimes there's a delete for all of a user's stuff.
index 96edaa4..de7cee7 100644 (file)
@@ -1,5 +1,5 @@
 -- Add a 'real name' field where users can specify the name they want
 -- used for author attribution or other places that real names matter.
 
-ALTER TABLE user 
+ALTER TABLE user
         ADD (user_real_name varchar(255) binary NOT NULL default '');
index ef56db0..591c753 100644 (file)
@@ -1,4 +1,4 @@
--- Stores the groups the user has once belonged to. 
+-- Stores the groups the user has once belonged to.
 -- The user may still belong these groups. Check user_groups.
 CREATE TABLE /*_*/user_former_groups (
   -- Key to user_id
index c374033..1683cf2 100644 (file)
@@ -9,7 +9,7 @@
 CREATE TABLE /*$wgDBprefix*/user_groups (
   -- Key to user_id
   ug_user int unsigned NOT NULL default '0',
-  
+
   -- Group names are short symbolic string keys.
   -- The set of group names is open-ended, though in practice
   -- only some predefined ones are likely to be used.
@@ -19,7 +19,7 @@ CREATE TABLE /*$wgDBprefix*/user_groups (
   -- permissions of any group they're explicitly in, plus
   -- the implicit '*' and 'user' groups.
   ug_group varbinary(16) NOT NULL default '',
-  
+
   PRIMARY KEY (ug_user,ug_group),
   KEY (ug_group)
 ) /*$wgDBTableOptions*/;
index e30e00d..85b0061 100644 (file)
 CREATE TABLE /*_*/user_properties(
   -- Foreign key to user.user_id
   up_user int not null,
-  
+
   -- Name of the option being saved. This is indexed for bulk lookup.
   up_property varbinary(32) not null,
-  
+
   -- Property value as a string.
   up_value blob
 ) /*$wgDBTableOptions*/;
index 9866654..4947cb1 100644 (file)
@@ -8,10 +8,10 @@
 CREATE TABLE /*$wgDBprefix*/user_rights (
   -- Key to user_id
   ur_user int unsigned NOT NULL,
-  
+
   -- Comma-separated list of permission keys
   ur_rights tinyblob NOT NULL,
-  
+
   UNIQUE KEY ur_user (ur_user)
 
 ) /*$wgDBTableOptions*/;
index 2c28011..a957957 100644 (file)
@@ -34,9 +34,9 @@ class UpdateLogging {
        /**
         * @var DatabaseBase
         */
-       var $dbw;
-       var $batchSize = 1000;
-       var $minTs = false;
+       public $dbw;
+       public $batchSize = 1000;
+       public $minTs = false;
 
        function execute() {
                $this->dbw = wfGetDB( DB_MASTER );
index f1f0954..81e61b7 100644 (file)
@@ -169,7 +169,7 @@ class TextPassDumper extends BackupDumper {
                $this->xmlwriterobj = new XmlDumpWriter();
 
                $input = fopen( $this->input, "rt" );
-               $result = $this->readDump( $input );
+               $this->readDump( $input );
 
                if ( $this->spawnProc ) {
                        $this->closeSpawn();
diff --git a/maintenance/checkAutoLoader.php b/maintenance/checkAutoLoader.php
deleted file mode 100644 (file)
index 8d0e442..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-/**
- * Check the autoloader
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-require_once( __DIR__ . '/Maintenance.php' );
-
-/**
- * Maintenance script to check classes definitions in the autoloader.
- *
- * @ingroup Maintenance
- */
-class CheckAutoLoader extends Maintenance {
-       public function __construct() {
-               parent::__construct();
-               $this->mDescription = "AutoLoader sanity checks";
-       }
-       public function execute() {
-               global $wgAutoloadLocalClasses, $IP;
-               $files = array_unique( $wgAutoloadLocalClasses );
-
-               foreach ( $files as $file ) {
-                       if ( function_exists( 'parsekit_compile_file' ) ) {
-                               $parseInfo = parsekit_compile_file( "$IP/$file" );
-                               $classes = array_keys( $parseInfo['class_table'] );
-                       } else {
-                               $contents = file_get_contents( "$IP/$file" );
-                               $m = array();
-                               preg_match_all( '/\n\s*class\s+([a-zA-Z0-9_]+)/', $contents, $m, PREG_PATTERN_ORDER );
-                               $classes = $m[1];
-                       }
-                       foreach ( $classes as $class ) {
-                               if ( !isset( $wgAutoloadLocalClasses[$class] ) ) {
-                                       // printf( "%-50s Unlisted, in %s\n", $class, $file );
-                                       $this->output( "\t'$class' => '$file',\n" );
-                               } elseif ( $wgAutoloadLocalClasses[$class] !== $file ) {
-                                       $this->output( "$class: Wrong file: found in $file, listed in " . $wgAutoloadLocalClasses[$class] . "\n" );
-                               }
-                       }
-               }
-       }
-}
-
-$maintClass = "CheckAutoLoader";
-require_once( RUN_MAINTENANCE_IF_MAIN );
index 670b93d..4ba7e66 100644 (file)
@@ -50,7 +50,7 @@ class CheckBadRedirects extends Maintenance {
                        $title = Title::makeTitle( $row->page_namespace, $row->page_title );
                        $rev = Revision::newFromId( $row->page_latest );
                        if ( $rev ) {
-                               $target = Title::newFromRedirect( $rev->getText() );
+                               $target = $rev->getContent()->getRedirectTarget();
                                if ( !$target ) {
                                        $this->output( $title->getPrefixedText() . "\n" );
                                }
old mode 100755 (executable)
new mode 100644 (file)
index f37af77..c0a526b
@@ -1,52 +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
+<?php
+/**
+ * Remove hidden preferences 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
+ * 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 TyA <tya.wiki@gmail.com>
+ * @see [[bugzilla:30976]]
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script that removes hidden preferences from the database.
+ *
+ * @ingroup Maintenance
+ */
+class CleanupPreferences extends Maintenance {
+       public function execute() {
+               global $wgHiddenPrefs;
+
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->begin( __METHOD__ );
+               foreach( $wgHiddenPrefs as $item ) {
+                       $dbw->delete(
+                               'user_properties',
+                               array( 'up_property' => $item ),
+                               __METHOD__
+                       );
+               };
+               $dbw->commit( __METHOD__ );
+               $this->output( "Finished!\n" );
+       }
+}
+
+$maintClass = 'CleanupPreferences'; // Tells it to run the class
+require_once( RUN_MAINTENANCE_IF_MAIN );
index e20bcd8..9838569 100644 (file)
@@ -103,7 +103,8 @@ class CleanupSpam extends Maintenance {
                $rev = Revision::newFromTitle( $title );
                $currentRevId = $rev->getId();
 
-               while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT ) || LinkFilter::matchEntry( $rev->getText() , $domain ) ) ) {
+               while ( $rev && ( $rev->isDeleted( Revision::DELETED_TEXT )
+                                               || LinkFilter::matchEntry( $rev->getContent( Revision::RAW ), $domain ) ) ) {
                        $rev = $rev->getPrevious();
                }
 
@@ -117,8 +118,10 @@ class CleanupSpam extends Maintenance {
                        $page = WikiPage::factory( $title );
                        if ( $rev ) {
                                // Revert to this revision
+                               $content = $rev->getContent( Revision::RAW );
+
                                $this->output( "reverting\n" );
-                               $page->doEdit( $rev->getText(), wfMessage( 'spam_reverting', $domain )->inContentLanguage()->text(),
+                               $page->doEditContent( $content, wfMessage( 'spam_reverting', $domain )->inContentLanguage()->text(),
                                        EDIT_UPDATE, $rev->getId() );
                        } elseif ( $this->hasOption( 'delete' ) ) {
                                // Didn't find a non-spammy revision, blank the page
@@ -126,8 +129,11 @@ class CleanupSpam extends Maintenance {
                                $page->doDeleteArticle( wfMessage( 'spam_deleting', $domain )->inContentLanguage()->text() );
                        } else {
                                // Didn't find a non-spammy revision, blank the page
+                               $handler = ContentHandler::getForTitle( $title );
+                               $content = $handler->makeEmptyContent();
+
                                $this->output( "blanking\n" );
-                               $page->doEdit( '', wfMessage( 'spam_blanking', $domain )->inContentLanguage()->text() );
+                               $page->doEditContent( $content, wfMessage( 'spam_blanking', $domain )->inContentLanguage()->text() );
                        }
                        $dbw->commit( __METHOD__ );
                }
index cc32946..dc03c34 100644 (file)
@@ -41,18 +41,20 @@ class UploadStashCleanup extends Maintenance {
        }
 
        public function execute() {
+               global $wgUploadStashMaxAge;
+
                $repo = RepoGroup::singleton()->getLocalRepo();
 
                $dbr = $repo->getSlaveDb();
 
                // how far back should this look for files to delete?
-               global $wgUploadStashMaxAge;
+               $cutoff = time() - $wgUploadStashMaxAge;
 
                $this->output( "Getting list of files to clean up...\n" );
                $res = $dbr->select(
                        'uploadstash',
                        'us_key',
-                       'us_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( time() - $wgUploadStashMaxAge ) ),
+                       'us_timestamp < ' . $dbr->addQuotes( $dbr->timestamp( $cutoff ) ),
                        __METHOD__
                );
 
@@ -68,7 +70,7 @@ class UploadStashCleanup extends Maintenance {
                        array_push( $keys, $row->us_key );
                }
 
-               $this->output( 'Removing ' . count($keys) . " file(s)...\n" );
+               $this->output( 'Removing ' . count( $keys ) . " file(s)...\n" );
                // this could be done some other, more direct/efficient way, but using
                // UploadStash's own methods means it's less likely to fall accidentally
                // out-of-date someday
@@ -82,6 +84,25 @@ class UploadStashCleanup extends Maintenance {
                                $stash->removeFileNoAuth( $key );
                        } catch ( UploadStashBadPathException $ex ) {
                                $this->output( "Failed removing stashed upload with key: $key\n"  );
+                       } catch ( UploadStashZeroLengthFileException $ex ) {
+                               $this->output( "Failed removing stashed upload with key: $key\n"  );
+                       }
+                       if ( $i % 100 == 0 ) {
+                               $this->output( "$i\n" );
+                       }
+               }
+               $this->output( "$i done\n" );
+
+               $tempRepo = $repo->getTempRepo();
+               $dir      = $tempRepo->getZonePath( 'thumb' );
+               $iterator = $tempRepo->getBackend()->getFileList( array( 'dir' => $dir ) );
+
+               $this->output( "Deleting old thumbnails...\n" );
+               $i = 0;
+               foreach ( $iterator as $file ) {
+                       $i++;
+                       if ( wfTimestamp( TS_UNIX, $tempRepo->getFileTimestamp( "$dir/$file" ) ) < $cutoff ) {
+                               $tempRepo->quickPurge( "$dir/$file" );
                        }
                        if ( $i % 100 == 0 ) {
                                $this->output( "$i\n" );
index a333717..1f3ac1c 100644 (file)
@@ -114,15 +114,24 @@ class CompareParsers extends DumpIterator {
                $parser1 = new $parser1Name();
                $parser2 = new $parser2Name();
 
-               $output1 = $parser1->parse( $rev->getText(), $title, $this->options );
-               $output2 = $parser2->parse( $rev->getText(), $title, $this->options );
+               $content = $rev->getContent();
+
+               if ( $content->getModel() !== CONTENT_MODEL_WIKITEXT ) {
+                       $this->error( "Page {$title->getPrefixedText()} does not contain wikitext but {$content->getModel()}\n" );
+                       return;
+               }
+
+               $text = strval( $content->getNativeData() );
+
+               $output1 = $parser1->parse( $text, $title, $this->options );
+               $output2 = $parser2->parse( $text, $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());
+                               file_put_contents( $this->saveFailed . '/' . rawurlencode( $title->getPrefixedText() ) . ".txt", $text );
                        }
                        if ( $this->showDiff ) {
                                $this->output( wfDiff( $this->stripParameters( $output1->getText() ), $this->stripParameters( $output2->getText() ), '' ) );
index 7c9ca26..e2223e1 100644 (file)
@@ -56,7 +56,7 @@ class ConvertUserOptions extends Maintenance {
                                array( 'LIMIT' => 50, 'FOR UPDATE' )
                        );
                        $id = $this->convertOptionBatch( $res, $dbw );
-                       $dbw->commit();
+                       $dbw->commit( __METHOD__ );
 
                        wfWaitForSlaves();
 
index 9b92215..1b96d1a 100644 (file)
@@ -8,18 +8,18 @@ Author: `Lindsey Simon <elsigh@google.com>`
 
 CSSJanus is CSS parser utility designed to aid the conversion of a website's
 layout from left-to-right(LTR) to right-to-left(RTL). The script was born out of
-a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL). 
+a need to convert CSS for RTL languages when tables are not being used for layout (since tables will automatically reorder TD's in RTL).
 CSSJanus will change most of the obvious CSS property names and their values as
-well as some not-so-obvious ones (cursor, background-position %, etc...). 
-The script is designed to offer flexibility to account for cases when you do 
+well as some not-so-obvious ones (cursor, background-position %, etc...).
+The script is designed to offer flexibility to account for cases when you do
 not want to change certain rules which exist to account for bidirectional text
 display bugs, as well as situations where you may or may not want to flip annotations inside of the background url string.
-Note that you can disable CSSJanus from running on an entire class or any 
+Note that you can disable CSSJanus from running on an entire class or any
 rule within a class by prepending a /* @noflip */ comment before the rule(s)
 you want CSSJanus to ignore.
 
 CSSJanus itself is not always enough to make a website that works in a LTR
-language context work in a RTL language all the way, but it is a start. 
+language context work in a RTL language all the way, but it is a start.
 
 ==Getting the code==
 
@@ -31,7 +31,7 @@ Check out the latest development version anonymously with:
 
 {{{
   $ svn checkout http://cssjanus.googlecode.com/svn/trunk/ cssjanus
-}}} 
+}}}
 
 ==Using==
 
@@ -41,13 +41,13 @@ Flags:
   --swap_left_right_in_url: Fixes "left"/"right" string within urls.
   Ex: ./cssjanus.py --swap_left_right_in_url < file.css > file_rtl.css
   --swap_ltr_rtl_in_url: Fixes "ltr"/"rtl" string within urls.
-  Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css  
-  
+  Ex: ./cssjanus.py --swap_ltr_rtl_in_url < file.css > file_rtl.css
+
 If you'd like to make use of the webapp version of cssjanus, you'll need to
 download the Google App Engine SDK
   http://code.google.com/appengine/downloads.html
 and also drop a "django" directory into this directory, with the latest svn
-from django. You should be good to go with that setup. Please let me know 
+from django. You should be good to go with that setup. Please let me know
 otherwise.
 
 ==Bugs, Patches==
@@ -76,13 +76,13 @@ Thanks to Jens Meiert for the German translation.
 
 {{{
   Copyright 2008 Google Inc. All Rights Reserved.
-  
+
   Licensed under the Apache License, Version 2.0 (the 'License');
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
-  
+
       http://www.apache.org/licenses/LICENSE-2.0
-  
+
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an 'AS IS' BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index e638b17..cc09703 100644 (file)
@@ -35,14 +35,19 @@ class DeleteArchivedFilesImplementation {
                $repo = RepoGroup::singleton()->getLocalRepo();
                # Get "active" revisions from the filearchive table
                $output->handleOutput( "Searching for and deleting archived files...\n" );
-               $res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key FROM $tbl_arch" );
+               $res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key,fa_sha1 FROM $tbl_arch" );
                $count = 0;
                foreach ( $res as $row ) {
                        $key = $row->fa_storage_key;
                        $group = $row->fa_storage_group;
                        $id = $row->fa_id;
                        $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
-                       $sha1 = substr( $key, 0, strcspn( $key, '.' ) );
+                       if( isset( $row->fa_sha1 ) ) {
+                               $sha1 = $row->fa_sha1;
+                       } else {
+                               // old row, populate from key
+                               $sha1 = LocalRepo::getHashFromKey( $key );
+                       }
                        // Check if the file is used anywhere...
                        $inuse = $dbw->selectField( 'oldimage', '1',
                                array( 'oi_sha1' => $sha1,
index 6a3e211..4f82a63 100644 (file)
@@ -48,48 +48,45 @@ class DeleteOldRevisions extends Maintenance {
                $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
 
-               $tbl_pag = $dbw->tableName( 'page' );
-               $tbl_rev = $dbw->tableName( 'revision' );
-
-               $pageIdClause = '';
-               $revPageClause = '';
+               $pageConds = array();
+               $revConds = array();
 
                # If a list of page_ids was provided, limit results to that set of page_ids
-               if ( sizeof( $args ) > 0 ) {
-                       $pageIdList = implode( ',', $args );
-                       $pageIdClause = " WHERE page_id IN ({$pageIdList})";
-                       $revPageClause = " AND rev_page IN ({$pageIdList})";
-                       $this->output( "Limiting to {$tbl_pag}.page_id IN ({$pageIdList})\n" );
+               if ( count( $args ) > 0 ) {
+                       $pageConds['page_id'] = $args;
+                       $revConds['rev_page'] = $args;
+                       $this->output( "Limiting to page IDs " . implode( ',', $args ) . "\n" );
                }
 
                # Get "active" revisions from the page table
                $this->output( "Searching for active revisions..." );
-               $res = $dbw->query( "SELECT page_latest FROM $tbl_pag{$pageIdClause}" );
-               $cur = array();
+               $res = $dbw->select( 'page', 'page_latest', $pageConds, __METHOD__ );
+               $latestRevs = array();
                foreach ( $res as $row ) {
-                       $cur[] = $row->page_latest;
+                       $latestRevs[] = $row->page_latest;
                }
                $this->output( "done.\n" );
 
                # Get all revisions that aren't in this set
-               $old = array();
                $this->output( "Searching for inactive revisions..." );
-               $set = implode( ', ', $cur );
-               $res = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_id NOT IN ( $set ){$revPageClause}" );
+               if ( count( $latestRevs ) > 0 ) {
+                       $revConds[] = 'rev_id NOT IN (' . $dbw->makeList( $latestRevs ) . ')';
+               }
+               $res = $dbw->select( 'revision', 'rev_id', $revConds, __METHOD__ );
+               $oldRevs = array();
                foreach ( $res as $row ) {
-                       $old[] = $row->rev_id;
+                       $oldRevs[] = $row->rev_id;
                }
                $this->output( "done.\n" );
 
                # Inform the user of what we're going to do
-               $count = count( $old );
+               $count = count( $oldRevs );
                $this->output( "$count old revisions found.\n" );
 
                # Delete as appropriate
                if ( $delete && $count ) {
                        $this->output( "Deleting..." );
-                       $set = implode( ', ', $old );
-                       $dbw->query( "DELETE FROM $tbl_rev WHERE rev_id IN ( $set )" );
+                       $dbw->delete( 'revision', array( 'rev_id' => $oldRevs ), __METHOD__ );
                        $this->output( "done.\n" );
                }
 
index 5dc7567..dcbf739 100644 (file)
@@ -61,7 +61,7 @@ class DeleteOrphanedRevisions extends Maintenance {
 
                # Nothing to do?
                if ( $report || $count == 0 ) {
-                       $dbw->commit();
+                       $dbw->commit( __METHOD__ );
                        exit( 0 );
                }
 
index 3657f96..870d632 100644 (file)
@@ -168,7 +168,7 @@ class SearchDump extends DumpIterator {
         * @param $rev Revision
         */
        public function processRevision( $rev ) {
-               if ( preg_match( $this->getOption( 'regex' ), $rev->getText() ) ) {
+               if ( preg_match( $this->getOption( 'regex' ), $rev->getContent()->getTextForSearchIndex() ) ) {
                        $this->output( $rev->getTitle() . " matches at edit from " . $rev->getTimestamp() . "\n" );
                }
        }
index 59df5e8..ad4c12f 100644 (file)
@@ -68,10 +68,11 @@ class EditCLI extends Maintenance {
 
                # Read the text
                $text = $this->getStdin( Maintenance::STDIN_ALL );
+               $content = ContentHandler::makeContent( $text, $wgTitle );
 
                # Do the edit
                $this->output( "Saving... " );
-               $status = $page->doEdit( $text, $summary,
+               $status = $page->doEditContent( $content, $summary,
                        ( $minor ? EDIT_MINOR : 0 ) |
                        ( $bot ? EDIT_FORCE_BOT : 0 ) |
                        ( $autoSummary ? EDIT_AUTOSUMMARY : 0 ) |
index 5aefe1c..69cf548 100644 (file)
@@ -43,7 +43,7 @@ if ( isset( $options['d'] ) ) {
        }
        if ( $d > 1 ) {
                $lb = wfGetLB();
-               $serverCount = $lb->getServerCount(); 
+               $serverCount = $lb->getServerCount();
                for ( $i = 0; $i < $serverCount; $i++ ) {
                        $server = $lb->getServerInfo( $i );
                        $server['flags'] |= DBO_DEBUG;
index e273c54..9ad4df4 100644 (file)
@@ -64,6 +64,7 @@ class FindHooks extends Maintenance {
                        $IP . '/includes/actions/',
                        $IP . '/includes/api/',
                        $IP . '/includes/cache/',
+                       $IP . '/includes/content/',
                        $IP . '/includes/context/',
                        $IP . '/includes/db/',
                        $IP . '/includes/diff/',
@@ -170,7 +171,7 @@ class FindHooks extends Maintenance {
        private function getHooksFromFile( $file ) {
                $content = file_get_contents( $file );
                $m = array();
-               preg_match_all( '/(?:wfRunHooks|Hooks\:\:run)\(\s*([\'"])(.*?)\1/', $content, $m );
+               preg_match_all( '/(?:wfRunHooks|Hooks\:\:run|ContentHandler\:\:runLegacyHooks)\(\s*([\'"])(.*?)\1/', $content, $m );
                return $m[2];
        }
 
index 6f017ec..d808500 100644 (file)
@@ -55,7 +55,12 @@ class FixDoubleRedirects extends Maintenance {
 
                $dbr = wfGetDB( DB_SLAVE );
 
-               $tables = array( 'redirect', 'pa' => 'page', 'pb' => 'page' );
+               // See also SpecialDoubleRedirects
+               $tables = array(
+                       'redirect',
+                       'pa' => 'page',
+                       'pb' => 'page',
+               );
                $fields = array(
                        'pa.page_namespace AS pa_namespace',
                        'pa.page_title AS pa_title',
@@ -66,6 +71,7 @@ class FixDoubleRedirects extends Maintenance {
                        'rd_from = pa.page_id',
                        'rd_namespace = pb.page_namespace',
                        'rd_title = pb.page_title',
+                       '(rd_interwiki IS NULL OR rd_interwiki = "")', // bug 40352
                        'pb.page_is_redirect' => 1,
                );
 
@@ -83,12 +89,18 @@ class FixDoubleRedirects extends Maintenance {
                }
 
                $jobs = array();
+               $processedTitles = "\n";
                $n = 0;
                foreach ( $res as $row ) {
                        $titleA = Title::makeTitle( $row->pa_namespace, $row->pa_title );
                        $titleB = Title::makeTitle( $row->pb_namespace, $row->pb_title );
 
-                       $job = new DoubleRedirectJob( $titleA, array( 'reason' => 'maintenance', 'redirTitle' => $titleB->getPrefixedDBkey() ) );
+                       $processedTitles .= "* [[$titleA]]\n";
+
+                       $job = new DoubleRedirectJob( $titleA, array(
+                               'reason' => 'maintenance',
+                               'redirTitle' => $titleB->getPrefixedDBkey()
+                       ) );
 
                        if ( !$async ) {
                                $success = ( $dryrun ? true : $job->run() );
@@ -112,7 +124,7 @@ class FixDoubleRedirects extends Maintenance {
                if ( count( $jobs ) ) {
                        $this->queueJobs( $jobs, $dryrun );
                }
-               $this->output( "$n double redirects processed.\n" );
+               $this->output( "$n double redirects processed" . $processedTitles . "\n" );
        }
 
        protected function queueJobs( $jobs, $dryrun = false ) {
index f3a5d87..adea97e 100644 (file)
@@ -44,7 +44,7 @@ class GenerateSitemap extends Maintenance {
         *
         * @var int
         */
-       var $url_limit;
+       public $url_limit;
 
        /**
         * The maximum size of a sitemap file
@@ -53,77 +53,77 @@ class GenerateSitemap extends Maintenance {
         *
         * @var int
         */
-       var $size_limit;
+       public $size_limit;
 
        /**
         * The path to prepend to the filename
         *
         * @var string
         */
-       var $fspath;
+       public $fspath;
 
        /**
         * The URL path to prepend to filenames in the index; should resolve to the same directory as $fspath
         *
         * @var string
         */
-       var $urlpath;
+       public $urlpath;
 
        /**
         * Whether or not to use compression
         *
         * @var bool
         */
-       var $compress;
+       public $compress;
 
        /**
         * Whether or not to include redirection pages
         *
         * @var bool
         */
-       var $skipRedirects;
+       public $skipRedirects;
 
        /**
         * The number of entries to save in each sitemap file
         *
         * @var array
         */
-       var $limit = array();
+       public $limit = array();
 
        /**
         * Key => value entries of namespaces and their priorities
         *
         * @var array
         */
-       var $priorities = array();
+       public $priorities = array();
 
        /**
         * A one-dimensional array of namespaces in the wiki
         *
         * @var array
         */
-       var $namespaces = array();
+       public $namespaces = array();
 
        /**
         * When this sitemap batch was generated
         *
         * @var string
         */
-       var $timestamp;
+       public $timestamp;
 
        /**
         * A database slave object
         *
         * @var object
         */
-       var $dbr;
+       public $dbr;
 
        /**
         * A resource pointing to the sitemap index file
         *
         * @var resource
         */
-       var $findex;
+       public $findex;
 
 
        /**
@@ -131,7 +131,7 @@ class GenerateSitemap extends Maintenance {
         *
         * @var resource
         */
-       var $file;
+       public $file;
 
        /**
         * Identifier to use in filenames, default $wgDBname
index 3e2f854..f6adfe2 100644 (file)
@@ -52,12 +52,12 @@ class GetTextMaint extends Maintenance {
                        $titleText = $title->getPrefixedText();
                        $this->error( "Page $titleText does not exist.\n", true );
                }
-               $text = $rev->getText( $this->hasOption( 'show-private' ) ? Revision::RAW : Revision::FOR_PUBLIC );
-               if ( $text === false ) {
+               $content = $rev->getContent( $this->hasOption( 'show-private' ) ? Revision::RAW : Revision::FOR_PUBLIC );
+               if ( $content === false ) {
                        $titleText = $title->getPrefixedText();
                        $this->error( "Couldn't extract the text from $titleText.\n", true );
                }
-               $this->output( $text );
+               $this->output( $content->serialize() );
        }
 }
 
old mode 100755 (executable)
new mode 100644 (file)
index 2fa70dc..13e3163
@@ -1,4 +1,4 @@
-#!/usr/bin/hphpi -f 
+#!/usr/bin/hphpi -f
 <?php
 
 define( 'MW_CONFIG_CALLBACK', 'MakeHipHop::noConfigNeeded' );
@@ -41,7 +41,7 @@ class MakeHipHop extends Maintenance {
                        unlink( "$buildDir/source" );
                }
 
-               # With the CentOS RPMs, you just get g++44, no g++, so we have to 
+               # With the CentOS RPMs, you just get g++44, no g++, so we have to
                # use the environment
                if ( isset( $_ENV['CXX'] ) ) {
                        $cxx = $_ENV['CXX'];
@@ -49,7 +49,7 @@ class MakeHipHop extends Maintenance {
                        $cxx = 'g++';
                }
 
-               # Create a function that provides the HipHop compiler version, and 
+               # Create a function that provides the HipHop compiler version, and
                # doesn't exist when MediaWiki is invoked in interpreter mode.
                $version = str_replace( PHP_EOL, ' ', trim( `hphp --version` ) );
                file_put_contents(
@@ -94,7 +94,7 @@ class MakeHipHop extends Maintenance {
                $this->checkVolatileClasses( $outDir );
 
                # Copy the generated C++ files into the source directory for cmake
-               $iter = new RecursiveIteratorIterator( 
+               $iter = new RecursiveIteratorIterator(
                        new RecursiveDirectoryIterator( $outDir ),
                        RecursiveIteratorIterator::SELF_FIRST );
                $sourceFiles = array();
@@ -148,14 +148,14 @@ class MakeHipHop extends Maintenance {
                }
 
                # Do our own version of $HPHP_HOME/bin/run.sh, which isn't so broken.
-               # HipHop's RELEASE mode seems to be stuck always on, so symbols get 
-               # stripped. Also we will try keeping the generated .o files instead of 
+               # HipHop's RELEASE mode seems to be stuck always on, so symbols get
+               # stripped. Also we will try keeping the generated .o files instead of
                # throwing away hours of CPU time every time you make a typo.
 
                chdir( $persistentDir );
 
                if ( $regenerateMakefile ) {
-                       copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt', 
+                       copy( $_ENV['HPHP_HOME'] . '/bin/CMakeLists.base.txt',
                                "$persistentDir/CMakeLists.txt" );
 
                        if ( file_exists( "$persistentDir/CMakeCache.txt" ) ) {
@@ -165,7 +165,7 @@ class MakeHipHop extends Maintenance {
                        $cmd = 'cmake' .
                                " -D CMAKE_BUILD_TYPE:string=" . wfEscapeShellArg( $GLOBALS['wgHipHopBuildType'] ) .
                                ' -D PROGRAM_NAME:string=mediawiki-hphp';
-                       
+
                        if ( file_exists( '/usr/bin/ccache' ) ) {
                                $cmd .= ' -D CMAKE_CXX_COMPILER:string=ccache' .
                                        ' -D CMAKE_CXX_COMPILER_ARG1:string=' . wfEscapeShellArg( $cxx );
@@ -179,7 +179,7 @@ class MakeHipHop extends Maintenance {
                # Determine appropriate make concurrency
                # Compilation can take a lot of memory, let's assume that that is limiting.
                $procs = $this->getNumProcs();
-               
+
                # Run make. This is the slow step.
                passthru( 'make -j' . wfEscapeShellArg( $procs ) );
 
old mode 100755 (executable)
new mode 100644 (file)
index 1c4b51f..1adfe29
@@ -33,10 +33,10 @@ class RunHipHopServer extends Maintenance {
                        $sourceBase = realpath( "$IP/.." );
                }
 
-               passthru( 
+               passthru(
                        'cd ' . wfEscapeShellArg( $sourceBase ) . " && " .
                        'MW_INSTALL_PATH=' . wfEscapeShellArg( $IP ) . ' ' .
-                       wfEscapeShellArg( 
+                       wfEscapeShellArg(
                                "$buildDir/persistent/mediawiki-hphp",
                                '-c', "$thisDir/server.conf",
                                '-v', "Server.SourceRoot=$sourceBase",
index 312583a..568d5cd 100644 (file)
@@ -10,7 +10,7 @@ CREATE TABLE categorylinks (
   cl_from       BIGINT      NOT NULL  DEFAULT 0,
   -- REFERENCES page(page_id) ON DELETE CASCADE,
   cl_to         VARCHAR(255)         NOT NULL,
-  -- cl_sortkey has to be at least 86 wide 
+  -- cl_sortkey has to be at least 86 wide
   -- in order to be compatible with the old MySQL schema from MW 1.10
   --cl_sortkey    VARCHAR(86),
   cl_sortkey VARCHAR(230) FOR BIT DATA  NOT NULL ,
index 72dcd79..6798604 100644 (file)
@@ -1,10 +1,10 @@
 CREATE TABLE user_properties (
   -- Foreign key to user.user_id
   up_user BIGINT NOT NULL,
-  
+
   -- Name of the option being saved. This is indexed for bulk lookup.
   up_property VARCHAR(32) FOR BIT DATA NOT NULL,
-  
+
   -- Property value as a string.
   up_value CLOB(64K) INLINE LENGTH 4096
 );
index f5162c9..2edb7f0 100644 (file)
@@ -4,7 +4,7 @@
 -- This is read and executed by the install script; you should
 -- not have to run it by itself unless doing a manual install.
 
--- Notes: 
+-- Notes:
 --  * DB2 will convert all table and column names to all caps internally.
 --  * DB2 has a 32k limit on SQL filesize, so it may be necessary
 --     to split this into two files soon.
@@ -182,7 +182,7 @@ CREATE TABLE page_props (
   -- REFERENCES page (page_id) ON DELETE CASCADE,
   pp_propname  VARCHAR(255) NOT NULL,
   pp_value     CLOB(64K) INLINE LENGTH 4096 NOT NULL,
-  PRIMARY KEY (pp_page, pp_propname) 
+  PRIMARY KEY (pp_page, pp_propname)
 );
 CREATE INDEX page_props_propname
   ON page_props (pp_propname);
@@ -235,7 +235,7 @@ CREATE TABLE pagelinks (
   pl_namespace  SMALLINT NOT NULL,
   pl_title      VARCHAR(255) NOT NULL
 );
-CREATE UNIQUE INDEX pagelink_unique 
+CREATE UNIQUE INDEX pagelink_unique
   ON pagelinks (pl_from, pl_namespace, pl_title);
 
 
@@ -269,7 +269,7 @@ CREATE TABLE categorylinks (
   cl_from           BIGINT NOT NULL DEFAULT 0,
   -- REFERENCES page(page_id) ON DELETE CASCADE,
   cl_to             VARCHAR(255) NOT NULL,
-  -- cl_sortkey has to be at least 86 wide 
+  -- cl_sortkey has to be at least 86 wide
   -- in order to be compatible with the old MySQL schema from MW 1.10
   --cl_sortkey    VARCHAR(86),
   cl_sortkey        VARCHAR(230) FOR BIT DATA NOT NULL,
@@ -378,7 +378,7 @@ CREATE TABLE ipblocks (
 );
 CREATE INDEX ipb_address
   ON ipblocks (ipb_address);
-CREATE INDEX ipb_user 
+CREATE INDEX ipb_user
   ON ipblocks (ipb_user);
 CREATE INDEX ipb_range
   ON ipblocks (ipb_range_start, ipb_range_end);
@@ -507,7 +507,6 @@ CREATE TABLE recentchanges (
   rc_log_type        VARCHAR(255),
   rc_log_action      VARCHAR(255),
   rc_params          CLOB(64K) INLINE LENGTH 4096
-  
 );
 CREATE INDEX rc_timestamp
   ON recentchanges (rc_timestamp);
@@ -868,7 +867,7 @@ CREATE TABLE iwlinks
 
 
 --
--- Store information about newly uploaded files before they're 
+-- Store information about newly uploaded files before they're
 -- moved into the actual filestore
 --
 CREATE TABLE uploadstash (
@@ -920,7 +919,7 @@ CREATE INDEX us_timestamp
 
 
 
--- Stores the groups the user has once belonged to. 
+-- Stores the groups the user has once belonged to.
 -- The user may still belong these groups. Check user_groups.
 CREATE TABLE user_former_groups (
   ufg_user   BIGINT NOT NULL DEFAULT 0,
@@ -928,13 +927,3 @@ CREATE TABLE user_former_groups (
 );
 CREATE UNIQUE INDEX ufg_user_group
   ON user_former_groups (ufg_user, ufg_group);
-
-
-
--- Table for holding configuration changes
-CREATE TABLE config (
-  cf_name   VARCHAR(255) NOT NULL
-    PRIMARY KEY,
-  cf_value  CLOB(64K) INLINE LENGTH 4096 NOT NULL
-);
-
index f51d7ad..904b624 100644 (file)
@@ -32,13 +32,13 @@ require_once( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class BackupReader extends Maintenance {
-       var $reportingInterval = 100;
-       var $pageCount = 0;
-       var $revCount  = 0;
-       var $dryRun    = false;
-       var $uploads   = false;
-       var $imageBasePath = false;
-       var $nsFilter  = false;
+       public $reportingInterval = 100;
+       public $pageCount = 0;
+       public $revCount  = 0;
+       public $dryRun    = false;
+       public $uploads   = false;
+       public $imageBasePath = false;
+       public $nsFilter  = false;
 
        function __construct() {
                parent::__construct();
index 8d92383..d94b948 100644 (file)
  * @author Mij <mij@bitchx.it>
  */
 
-$optionsWithArgs = array( 'extensions', 'comment', 'comment-file', 'comment-ext', 'user', 'license', 'sleep', 'limit', 'from', 'source-wiki-url' );
+$optionsWithArgs = array(
+       'extensions', 'comment', 'comment-file', 'comment-ext', 'summary', 'user',
+       'license', 'sleep', 'limit', 'from', 'source-wiki-url', 'timestamp',
+);
 require_once( __DIR__ . '/commandLine.inc' );
 require_once( __DIR__ . '/importImages.inc' );
 $processed = $added = $ignored = $skipped = $overwritten = $failed = 0;
@@ -98,6 +101,8 @@ if ( $limit ) {
        $limit = (int)$limit;
 }
 
+$timestamp = isset( $options['timestamp'] ) ? $options['timestamp'] : false;
+
 # Get the upload comment. Provide a default one in case there's no comment given.
 $comment = 'Importing image file';
 
@@ -112,6 +117,8 @@ if ( isset( $options['comment-file'] ) ) {
 
 $commentExt = isset( $options['comment-ext'] ) ? $options['comment-ext'] : false;
 
+$summary = isset( $options['summary'] ) ? $options['summary'] : '';
+
 # Get the license specifier
 $license = isset( $options['license'] ) ? $options['license'] : '';
 
@@ -230,9 +237,14 @@ if ( $count > 0 ) {
                        }
                }
 
+               $commentText = SpecialUpload::getInitialPageText( $commentText, $license );
+               if ( !$summary ) {
+                       $summary = $commentText;
+               }
+
                if ( isset( $options['dry'] ) ) {
                        echo( "done.\n" );
-               } elseif ( $image->recordUpload( $archive->value, $commentText, $license ) ) {
+               } elseif ( $image->recordUpload2( $archive->value, $summary, $commentText, false, $timestamp ) ) {
                        # We're done!
                        echo( "done.\n" );
 
@@ -314,25 +326,27 @@ USAGE: php importImages.php [options] <dir>
 <dir> : Path to the directory containing images to be imported
 
 Options:
---extensions=<exts>    Comma-separated list of allowable extensions, defaults to \$wgFileExtensions
---overwrite            Overwrite existing images with the same name (default is to skip them)
---limit=<num>          Limit the number of images to process. Ignored or skipped images are not counted.
---from=<name>          Ignore all files until the one with the given name. Useful for resuming
-                                               aborted imports. <name> should be the file's canonical database form.
---skip-dupes           Skip images that were already uploaded under a different name (check SHA1)
---sleep=<sec>          Sleep between files. Useful mostly for debugging.
---user=<username>      Set username of uploader, default 'Maintenance script'
---check-userblock      Check if the user got blocked during import.
---comment=<text>       Set upload summary comment, default 'Importing image file'.
---comment-file=<file>          Set upload summary comment the the content of <file>.
---comment-ext=<ext>    Causes the comment for each file to be loaded from a file with the same name
-                       but the extension <ext>. If a global comment is also given, it is appended.
---license=<code>       Use an optional license template
---dry                  Dry run, don't import anything
+--extensions=<exts>     Comma-separated list of allowable extensions, defaults to \$wgFileExtensions
+--overwrite             Overwrite existing images with the same name (default is to skip them)
+--limit=<num>           Limit the number of images to process. Ignored or skipped images are not counted.
+--from=<name>           Ignore all files until the one with the given name. Useful for resuming
+                        aborted imports. <name> should be the file's canonical database form.
+--skip-dupes            Skip images that were already uploaded under a different name (check SHA1)
+--sleep=<sec>           Sleep between files. Useful mostly for debugging.
+--user=<username>       Set username of uploader, default 'Maintenance script'
+--check-userblock       Check if the user got blocked during import.
+--comment=<text>        Set file description, default 'Importing image file'.
+--comment-file=<file>   Set description to the content of <file>.
+--comment-ext=<ext>     Causes the description for each file to be loaded from a file with the same name
+                        but the extension <ext>. If a global description is also given, it is appended.
+--license=<code>        Use an optional license template
+--dry                   Dry run, don't import anything
 --protect=<protect>     Specify the protect value (autoconfirmed,sysop)
+--summary=<summary>     Upload summary, description will be used if not provided
+--timestamp=<timestamp> Override upload time/date, all MediaWiki timestamp formats are accepted
 --unprotect             Unprotects all uploaded images
---source-wiki-url   if specified, take User and Comment data for each imported file from this URL.
-                                       For example, --source-wiki-url="http://en.wikipedia.org/"
+--source-wiki-url       If specified, take User and Comment data for each imported file from this URL.
+                        For example, --source-wiki-url="http://en.wikipedia.org/"
 
 TEXT;
        exit( 1 );
index e369cb1..fabc6dc 100644 (file)
@@ -62,7 +62,8 @@ class ImportSiteScripts extends Maintenance {
                        $text = Http::get( $url );
 
                        $wikiPage = WikiPage::factory( $title );
-                       $wikiPage->doEdit( $text, "Importing from $url", 0, false, $user );
+                       $content = ContentHandler::makeContent( $text, $wikiPage->getTitle() );
+                       $wikiPage->doEditContent( $content, "Importing from $url", 0, false, $user );
                }
 
        }
index adb5063..c04989c 100644 (file)
@@ -56,7 +56,8 @@ if ( count( $args ) < 1 || isset( $options['help'] ) ) {
 
                                        echo( "\nPerforming edit..." );
                                        $page = WikiPage::factory( $title );
-                                       $page->doEdit( $text, $comment, $flags, false, $user );
+                                       $content = ContentHandler::makeContent( $text, $title );
+                                       $page->doEditContent( $content, $comment, $flags, false, $user );
                                        echo( "done.\n" );
 
                                } else {
index 762bb94..39e613f 100644 (file)
@@ -45,7 +45,8 @@ 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.', true, true );
+               $this->addOption( 'pass', 'The password for the wiki administrator.', false, true );
+               $this->addOption( 'passfile', 'An alternative way to provide pass option, as the contents of this file', false, 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 );
 
@@ -77,6 +78,9 @@ class CommandLineInstaller extends Maintenance {
 
                $dbpassfile = $this->getOption( 'dbpassfile', false );
                if ( $dbpassfile !== false ) {
+                       if ( $this->getOption( 'dbpass', false ) !== false ) {
+                               $this->error( 'WARNING: You provide the options "dbpass" and "dbpassfile". The content of "dbpassfile" overwrites "dbpass".' );
+                       }
                        wfSuppressWarnings();
                        $dbpass = file_get_contents( $dbpassfile );
                        wfRestoreWarnings();
@@ -86,6 +90,22 @@ class CommandLineInstaller extends Maintenance {
                        $this->mOptions['dbpass'] = trim( $dbpass, "\r\n" );
                }
 
+               $passfile = $this->getOption( 'passfile', false );
+               if ( $passfile !== false ) {
+                       if ( $this->getOption( 'pass', false ) !== false ) {
+                               $this->error( 'WARNING: You provide the options "pass" and "passfile". The content of "passfile" overwrites "pass".' );
+                       }
+                       wfSuppressWarnings();
+                       $pass = file_get_contents( $passfile );
+                       wfRestoreWarnings();
+                       if ( $pass === false ) {
+                               $this->error( "Couldn't open $passfile", true );
+                       }
+                       $this->mOptions['pass'] = str_replace( array( "\n", "\r" ), "", $pass );
+               } elseif ( $this->getOption( 'pass', false ) === false ) {
+                       $this->error( 'You need to provide the option "pass" or "passfile"', true );
+               }
+
                $installer =
                        InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
 
index ceafc39..1a2e121 100644 (file)
@@ -29,7 +29,7 @@ require_once( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class JSParseHelper extends Maintenance {
-       var $errs = 0;
+       public $errs = 0;
 
        public function __construct() {
                parent::__construct();
index d77029e..20fb477 100644 (file)
@@ -60,7 +60,7 @@ class wikiStatsOutput extends statsOutput {
                        echo ', as well as the following languages that are not intended for system message translations, usually because they redirect to other language codes: ' . implode( ', ', $dummyCodes );
                }
                echo ".\n\n"; # dot to end sentence
-               echo '{| class="sortable wikitable" border="2" cellpadding="4" cellspacing="0" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both;" width="100%"' . "\n";
+               echo '{| class="sortable wikitable" border="2" style="background-color: #F9F9F9; border: 1px #AAAAAA solid; border-collapse: collapse; clear:both; width:100%;"' . "\n";
        }
        function footer() {
                echo "|}\n";
@@ -96,7 +96,7 @@ class wikiStatsOutput extends statsOutput {
                $color = $red . $green . $blue;
 
                $percent = parent::formatPercent( $subset, $total, $revert, $accuracy );
-               return 'bgcolor="#' . $color . '"|' . $percent;
+               return 'style="background-color:#' . $color . ';"|' . $percent;
        }
 }
 
index 11b00e1..1860f4a 100644 (file)
@@ -43,7 +43,7 @@ class CheckLanguageCLI {
         * Constructor.
         * @param $options array Options for script.
         */
-       public function __construct( Array $options ) {
+       public function __construct( array $options ) {
                if ( isset( $options['help'] ) ) {
                        echo $this->help();
                        exit(1);
@@ -305,6 +305,7 @@ ENDS;
        /**
         * Check a language.
         * @param $code string The language code.
+        * @throws MWException
         * @return array The results.
         */
        protected function checkLanguage( $code ) {
@@ -484,7 +485,7 @@ class CheckExtensionsCLI extends CheckLanguageCLI {
         * @param $options array Options for script.
         * @param $extension string The extension name (or names).
         */
-       public function __construct( Array $options, $extension ) {
+       public function __construct( array $options, $extension ) {
                if ( isset( $options['help'] ) ) {
                        echo $this->help();
                        exit(1);
@@ -641,6 +642,7 @@ ENDS;
        /**
         * Check a language and show the results.
         * @param $code string The language code.
+        * @throws MWException
         */
        protected function checkLanguage( $code ) {
                foreach( $this->extensions as $extension ) {
index e34d9a1..e2ad6a7 100644 (file)
@@ -30,19 +30,19 @@ require_once( __DIR__ .'/../Maintenance.php' );
  */
 class GenerateCollationData extends Maintenance {
        /** The directory with source data files in it */
-       var $dataDir;
+       public $dataDir;
 
        /** The primary weights, indexed by codepoint */
-       var $weights;
+       public $weights;
 
        /**
         * A hashtable keyed by codepoint, where presence indicates that a character
         * has a decomposition mapping. This makes it non-preferred for group header
         * selection.
         */
-       var $mappedChars;
+       public $mappedChars;
 
-       var $debugOutFile;
+       public $debugOutFile;
 
        /**
         * Important tertiary weights from UTS #10 section 7.2
@@ -285,12 +285,12 @@ class GenerateCollationData extends Maintenance {
 }
 
 class UcdXmlReader {
-       var $fileName;
-       var $callback;
-       var $groupAttrs;
-       var $xml;
-       var $blocks = array();
-       var $currentBlock;
+       public $fileName;
+       public $callback;
+       public $groupAttrs;
+       public $xml;
+       public $blocks = array();
+       public $currentBlock;
 
        function __construct( $fileName ) {
                $this->fileName = $fileName;
index 54dfa39..33163d4 100644 (file)
@@ -32,7 +32,7 @@ require_once( __DIR__ . '/../../includes/normal/UtfNormalUtil.php' );
  * @ingroup MaintenanceLanguage
  */
 class GenerateNormalizerData extends Maintenance {
-       var $dataFile;
+       public $dataFile;
 
        public function __construct() {
                parent::__construct();
index ce1dbb9..d22070f 100644 (file)
@@ -467,6 +467,7 @@ $wgOptionalMessages = array(
        'backlinksubtitle',
        'prefs-registration-date-time',
        'prefs-memberingroups-type',
+       'userrights-groupsmember-type',
        'shared-repo-name-wikimediacommons',
        'usermessage-template',
        'filepage.css',
index b644d8e..2e9ebc2 100644 (file)
@@ -178,7 +178,6 @@ $wgMessageStructure = array(
                'qbbrowse',
                'qbedit',
                'qbpageoptions',
-               'qbpageinfo',
                'qbmyoptions',
                'qbspecialpages',
                'faq',
@@ -204,6 +203,7 @@ $wgMessageStructure = array(
                'variants',
        ),
        'miscellaneous2' => array(
+               'navigation-heading',
                'errorpagetitle',
                'returnto',
                'tagline',
@@ -426,7 +426,8 @@ $wgMessageStructure = array(
        ),
        'login' => array(
                'logouttext',
-               'welcomecreation',
+               'welcomeuser',
+               'welcomecreation-msg',
                'yourname',
                'yourpassword',
                'yourpasswordagain',
@@ -689,6 +690,15 @@ $wgMessageStructure = array(
                'addsection-preload',
                'addsection-editintro',
                'defaultmessagetext',
+               'content-failed-to-parse',
+               'invalid-content-data',
+               'content-not-allowed-here',
+       ),
+       'contentmodels' => array(
+               'content-model-wikitext',
+               'content-model-text',
+               'content-model-javascript',
+               'content-model-css',
        ),
        'parserwarnings' => array(
                'expensive-parserfunction-warning',
@@ -910,8 +920,6 @@ $wgMessageStructure = array(
                'search-interwiki-default',
                'search-interwiki-custom',
                'search-interwiki-more',
-               'search-mwsuggest-enabled',
-               'search-mwsuggest-disabled',
                'search-relatedarticle',
                'mwsuggest-disable',
                'searcheverything-enable',
@@ -1081,6 +1089,7 @@ $wgMessageStructure = array(
                'saveusergroups',
                'userrights-groupsmember',
                'userrights-groupsmember-auto',
+               'userrights-groupsmember-type',
                'userrights-groups-help',
                'userrights-reason',
                'userrights-no-interwiki',
@@ -1184,6 +1193,9 @@ $wgMessageStructure = array(
                'rightslogtext',
                'rightslogentry',
                'rightslogentry-autopromote',
+               'logentry-rights-rights',
+               'logentry-rights-rights-legacy',
+               'logentry-rights-autopromote',
                'rightsnone',
        ),
        'action' => array(
@@ -1389,6 +1401,7 @@ $wgMessageStructure = array(
                'backend-fail-notsame',
                'backend-fail-invalidpath',
                'backend-fail-delete',
+               'backend-fail-describe',
                'backend-fail-alreadyexists',
                'backend-fail-store',
                'backend-fail-copy',
@@ -1936,11 +1949,17 @@ $wgMessageStructure = array(
        'enotif' => array(
                'enotif_mailer',
                'enotif_reset',
-               'enotif_newpagetext',
                'enotif_impersonal_salutation',
-               'changed',
-               'created',
-               'enotif_subject',
+               'enotif_subject_deleted',
+               'enotif_subject_created',
+               'enotif_subject_moved',
+               'enotif_subject_restored',
+               'enotif_subject_changed',
+               'enotif_body_intro_deleted',
+               'enotif_body_intro_created',
+               'enotif_body_intro_moved',
+               'enotif_body_intro_restored',
+               'enotif_body_intro_changed',
                'enotif_lastvisited',
                'enotif_lastdiff',
                'enotif_anon_editor',
@@ -2337,6 +2356,7 @@ $wgMessageStructure = array(
                'immobile-target-namespace-iw',
                'immobile-source-page',
                'immobile-target-page',
+               'bad-target-model',
                'immobile_namespace',
                'imagenocrossnamespace',
                'nonfile-cannot-move-to-file',
@@ -2453,7 +2473,6 @@ $wgMessageStructure = array(
        'javaccripttest' => array(
                'javascripttest',
                'javascripttest-backlink',
-               'javascripttest-disabled',
                'javascripttest-title',
                'javascripttest-pagetext-noframework',
                'javascripttest-pagetext-unknownframework',
@@ -2666,6 +2685,7 @@ $wgMessageStructure = array(
        'info' => array(
                'pageinfo-header',
                'pageinfo-title',
+               'pageinfo-not-current',
                'pageinfo-header-basic',
                'pageinfo-header-edits',
                'pageinfo-header-restrictions',
@@ -2674,6 +2694,7 @@ $wgMessageStructure = array(
                'pageinfo-default-sort',
                'pageinfo-length',
                'pageinfo-article-id',
+               'pageinfo-language',
                'pageinfo-robot-policy',
                'pageinfo-robot-index',
                'pageinfo-robot-noindex',
@@ -2691,11 +2712,18 @@ $wgMessageStructure = array(
                'pageinfo-authors',
                'pageinfo-recent-edits',
                'pageinfo-recent-authors',
-               'pageinfo-restriction',
                'pageinfo-magic-words',
                'pageinfo-hidden-categories',
                'pageinfo-templates',
                'pageinfo-footer',
+               'pageinfo-toolboxlink',
+               'pageinfo-redirectsto',
+               'pageinfo-redirectsto-info',
+               'pageinfo-contentpage',
+               'pageinfo-contentpage-yes',
+               'pageinfo-protect-cascading',
+               'pageinfo-protect-cascading-yes',
+               'pageinfo-protect-cascading-from',
        ),
        'skin' => array(
                'skinname-standard',
@@ -2719,6 +2747,8 @@ $wgMessageStructure = array(
                'markedaspatrollederror',
                'markedaspatrollederrortext',
                'markedaspatrollederror-noautopatrol',
+               'markedaspatrollednotify',
+               'markedaspatrollederrornotify',
        ),
        'patrol-log' => array(
                'patrol-log-page',
@@ -2785,6 +2815,7 @@ $wgMessageStructure = array(
                'hours',
                'days',
                'ago',
+               'just-now',
        ),
        'badimagelist' => array(
                'bad_image_list',
@@ -3345,6 +3376,7 @@ $wgMessageStructure = array(
        'scarytransclusion' => array(
                'scarytranscludedisabled',
                'scarytranscludefailed',
+               'scarytranscludefailed-httpstatus',
                'scarytranscludetoolong',
        ),
        'deleteconflict' => array(
@@ -3554,6 +3586,7 @@ $wgMessageStructure = array(
                'version-license',
                'version-poweredby-credits',
                'version-poweredby-others',
+               'version-credits-summary',
                'version-license-info',
                'version-software',
                'version-software-product',
@@ -3738,6 +3771,10 @@ $wgMessageStructure = array(
                'feedback-bugcheck',
                'feedback-bugnew',
        ),
+       'searchsuggestions' => array(
+               'searchsuggest-search',
+               'searchsuggest-containing',
+       ),
        'apierrors' => array(
                'api-error-badaccess-groups',
                'api-error-badtoken',
@@ -3827,6 +3864,7 @@ XHTML id names.",
        'toolbar'             => 'Edit page toolbar',
        'edit'                => 'Edit pages',
        'parserwarnings'      => 'Parser/template warnings',
+       'contentmodels'       => 'Content models',
        'undo'                => '"Undo" feature',
        'cantcreateaccount'   => 'Account creation failure',
        'history'             => 'History pages',
@@ -4027,6 +4065,7 @@ Variants for Chinese language",
        'logging'               => 'New logging system',
        'logging-irc'           => 'For IRC, see bug 34508. Do not change',
        'feedback'              => 'Feedback',
+       'searchsuggestions'     => 'Search suggestions',
        'apierrors'             => 'API errors',
        'duration'              => 'Durations',
        'cachedspecial'         => 'SpecialCachedPage',
index f45525c..4358989 100644 (file)
@@ -68,6 +68,8 @@ class LockServerDaemon {
 
        /**
         * @params $config Array
+        * @param array $config
+        * @throws Exception
         * @return LockServerDaemon
         */
        public static function init( array $config ) {
@@ -113,6 +115,7 @@ class LockServerDaemon {
        }
 
        /**
+        * @throws Exception
         * @return void
         */
        protected function setupServerSocket() {
@@ -239,7 +242,9 @@ class LockServerDaemon {
                $m = explode( ':', $data ); // <session, key, command, type, values>
                if ( count( $m ) == 5 ) {
                        list( $session, $key, $command, $type, $values ) = $m;
-                       if ( sha1( $session . $command . $type . $values . $this->authKey ) !== $key ) {
+                       $goodKey = hash_hmac( 'sha1',
+                               "{$session}\n{$command}\n{$type}\n{$values}", $this->authKey );
+                       if ( $goodKey !== $key ) {
                                return 'BAD_KEY';
                        } elseif ( strlen( $session ) !== 32 ) {
                                return 'BAD_SESSION';
index 9f5a909..0846a64 100644 (file)
@@ -29,7 +29,7 @@ require_once( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class MinifyScript extends Maintenance {
-       var $outDir;
+       public $outDir;
 
        public function __construct() {
                parent::__construct();
index a0c3d17..ad99617 100644 (file)
@@ -76,10 +76,10 @@ CREATE TABLE /*$wgDBprefix*/user_newtalk (
 CREATE INDEX /*$wgDBprefix*/user_group_id ON /*$wgDBprefix*/user_newtalk([user_id]);
 CREATE INDEX /*$wgDBprefix*/user_ip       ON /*$wgDBprefix*/user_newtalk(user_ip);
 
--- 
+--
 -- User preferences and other fun stuff
 -- replaces old user.user_options BLOB
--- 
+--
 CREATE TABLE /*$wgDBprefix*/user_properties (
        up_user INT NOT NULL,
        up_property NVARCHAR(32) NOT NULL,
@@ -157,7 +157,7 @@ CREATE TABLE /*$wgDBprefix*/text (
 -- The fields generally correspond to the page, revision, and text
 -- fields, with several caveats.
 -- Cannot reasonably create views on this table, due to the presence of TEXT
--- columns. 
+-- columns.
 CREATE TABLE /*$wgDBprefix*/archive (
    ar_namespace SMALLINT NOT NULL DEFAULT 0,
    ar_title NVARCHAR(255) NOT NULL DEFAULT '',
@@ -234,7 +234,7 @@ CREATE INDEX /*$wgDBprefix*/cl_sortkey   ON /*$wgDBprefix*/categorylinks(cl_to,c
 CREATE INDEX /*$wgDBprefix*/cl_timestamp ON /*$wgDBprefix*/categorylinks(cl_to,cl_timestamp);
 --;
 
--- 
+--
 -- Track all existing categories.  Something is a category if 1) it has an en-
 -- try somewhere in categorylinks, or 2) it once did.  Categories might not
 -- have corresponding pages, so they need to be tracked separately.
@@ -279,16 +279,16 @@ CREATE TABLE /*$wgDBprefix*/valid_tag (
   vt_tag varchar(255) NOT NULL PRIMARY KEY
 );
 
--- 
+--
 -- Table for storing localisation data
--- 
+--
 CREATE TABLE /*$wgDBprefix*/l10n_cache (
        -- language code
        lc_lang NVARCHAR(32) NOT NULL,
-       
+
        -- cache key
        lc_key NVARCHAR(255) NOT NULL,
-       
+
        -- Value
        lc_value TEXT NOT NULL DEFAULT '',
 );
@@ -305,9 +305,9 @@ CREATE TABLE /*$wgDBprefix*/externallinks (
 -- Maximum key length ON SQL Server is 900 bytes
 CREATE INDEX /*$wgDBprefix*/externallinks_index   ON /*$wgDBprefix*/externallinks(el_index);
 
--- 
+--
 -- Track external user accounts, if ExternalAuth is used
--- 
+--
 CREATE TABLE /*$wgDBprefix*/external_user (
        -- Foreign key to user_id
        eu_local_id INT NOT NULL PRIMARY KEY,
@@ -327,16 +327,16 @@ CREATE TABLE /*$wgDBprefix*/langlinks (
 );
 CREATE UNIQUE INDEX /*$wgDBprefix*/langlinks_reverse_key ON /*$wgDBprefix*/langlinks(ll_lang,ll_title);
 
--- 
+--
 -- Track inline interwiki links
--- 
+--
 CREATE TABLE /*$wgDBprefix*/iwlinks (
        -- page_id of the referring page
        iwl_from INT NOT NULL DEFAULT 0,
-       
+
        -- Interwiki prefix code of the target
        iwl_prefix NVARCHAR(20) NOT NULL DEFAULT '',
-       
+
        -- Title of the target, including namespace
        iwl_title NVARCHAR(255) NOT NULL DEFAULT '',
 );
@@ -728,7 +728,7 @@ CREATE TABLE /*$wgDBprefix*/updatelog (
   PRIMARY KEY (ul_key)
 );
 
--- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER 
+-- NOTE To enable full text indexing on SQL 2008 you need to create an account FDH$MSSQLSERVER
 -- AND assign a password for the FDHOST process to run under
 -- Once you have assigned a password to that account, you need to run the following stored procedure
 -- replacing XXXXX with the password you used.
index 583249a..6e01291 100644 (file)
@@ -60,9 +60,6 @@ $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';
-
 /** where Phpdoc should output documentation */
 $doxyOutput = $mwPath . 'docs' . DIRECTORY_SEPARATOR ;
 
@@ -104,31 +101,12 @@ function readaline( $prompt = '' ) {
        return $resp;
 }
 
-/**
- * Copied from SpecialVersion::getSvnRevision()
- * @param $dir String
- * @return Mixed: string or false
- */
-function getSvnRevision( $dir ) {
-       // http://svnbook.red-bean.com/nightly/en/svn.developer.insidewc.html
-       $entries = $dir . '/.svn/entries';
-
-       if ( !file_exists( $entries ) ) {
-               return false;
-       }
-
-       $content = file( $entries );
-
-       return intval( $content[3] );
-}
-
 /**
  * Generate a configuration file given user parameters and return the temporary filename.
  * @param $doxygenTemplate String: full path for the template.
  * @param $outputDirectory String: directory where the stuff will be output.
  * @param $stripFromPath String: path that should be stripped out (usually mediawiki base path).
  * @param $currentVersion String: Version number of the software
- * @param $svnstat String: path to the svnstat file
  * @param $input String: Path to analyze.
  * @param $exclude String: Additionals path regex to exclude
  * @param $excludePatterns String: Additionals path regex to exclude
@@ -136,8 +114,7 @@ function getSvnRevision( $dir ) {
  * @param $doxyGenerateMan Boolean
  * @return string
  */
-function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $svnstat, $input, $exclude, $excludePatterns, $doxyGenerateMan ) {
-       global $doxygenInputFilter;
+function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath, $currentVersion, $input, $exclude, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter ) {
 
        $template = file_get_contents( $doxygenTemplate );
        // Replace template placeholders by correct values.
@@ -145,7 +122,6 @@ function generateConfigFile( $doxygenTemplate, $outputDirectory, $stripFromPath,
                '{{OUTPUT_DIRECTORY}}' => $outputDirectory,
                '{{STRIP_FROM_PATH}}'  => $stripFromPath,
                '{{CURRENT_VERSION}}'  => $currentVersion,
-               '{{SVNSTAT}}'          => $svnstat,
                '{{INPUT}}'            => $input,
                '{{EXCLUDE}}'          => $exclude,
                '{{EXCLUDE_PATTERNS}}' => $excludePatterns,
@@ -258,20 +234,14 @@ case 6:
        $excludePatterns = 'extensions';
 }
 
-$versionNumber = getSvnRevision( $input );
-if ( $versionNumber === false ) { # Not using subversion ?
-       $svnstat = ''; # Not really useful if subversion not available
-       # @todo FIXME
-       $version = 'trunk';
-} else {
-       $version = "trunk (r$versionNumber)";
-}
+// @todo FIXME to work on git
+$version = 'master';
 
 // Generate path exclusions
 $excludedPaths = $mwPath . join( " $mwPath", $mwExcludePaths );
 print "EXCLUDE: $excludedPaths\n\n";
 
-$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $version, $svnstat, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan );
+$generatedConf = generateConfigFile( $doxygenTemplate, $doxyOutput, $mwPath, $version, $input, $excludedPaths, $excludePatterns, $doxyGenerateMan, $doxygenInputFilter );
 $command = $doxygenBin . ' ' . $generatedConf;
 
 echo <<<TEXT
index e66e981..17a3f2e 100644 (file)
@@ -38,22 +38,40 @@ class nextJobDB extends Maintenance {
 
        public function execute() {
                global $wgMemc;
-               $type = $this->getOption( 'type', false );
 
-               $memcKey = 'jobqueue:dbs:v2';
-               $pendingDBs = $wgMemc->get( $memcKey );
+               $type = $this->getOption( 'type', false );
 
-               // If the cache entry wasn't present, or in 1% of cases otherwise,
-               // regenerate the cache.
-               if ( !$pendingDBs || mt_rand( 0, 100 ) == 0 ) {
-                       $pendingDBs = $this->getPendingDbs();
-                       $wgMemc->set( $memcKey, $pendingDBs, 300 );
+               $memcKey = 'jobqueue:dbs:v3';
+               $pendingDbInfo = $wgMemc->get( $memcKey );
+
+               // If the cache entry wasn't present, is stale, or in .1% of cases otherwise,
+               // regenerate the cache. Use any available stale cache if another process is
+               // currently regenerating the pending DB information.
+               if ( !is_array( $pendingDbInfo )
+                       || ( time() - $pendingDbInfo['timestamp'] ) > 300 // 5 minutes
+                       || mt_rand( 0, 999 ) == 0
+               ) {
+                       if ( $wgMemc->add( "$memcKey:rebuild", 1, 1800 ) ) { // lock
+                               $pendingDbInfo = array(
+                                       'pendingDBs' => $this->getPendingDbs(),
+                                       'timestamp'  => time()
+                               );
+                               for ( $attempts=1; $attempts <= 25; ++$attempts ) {
+                                       if ( $wgMemc->add( "$memcKey:lock", 1, 60 ) ) { // lock
+                                               $wgMemc->set( $memcKey, $pendingDbInfo );
+                                               $wgMemc->delete( "$memcKey:lock" ); // unlock
+                                               break;
+                                       }
+                               }
+                               $wgMemc->delete( "$memcKey:rebuild" ); // unlock
+                       }
                }
 
-               if ( !$pendingDBs ) {
-                       return;
+               if ( !is_array( $pendingDbInfo ) || !$pendingDbInfo['pendingDBs'] ) {
+                       return; // no DBs with jobs or cache is both empty and locked
                }
 
+               $pendingDBs = $pendingDbInfo['pendingDBs']; // convenience
                do {
                        $again = false;
 
@@ -71,17 +89,25 @@ class nextJobDB extends Maintenance {
                        $candidates = array_values( $candidates );
                        $db = $candidates[ mt_rand( 0, count( $candidates ) - 1 ) ];
                        if ( !$this->checkJob( $type, $db ) ) {
-                               // This job is not available in the current database. Remove it from
-                               // the cache.
                                if ( $type === false ) {
+                                       // There are no jobs available in the current database
                                        foreach ( $pendingDBs as $type2 => $dbs ) {
                                                $pendingDBs[$type2] = array_diff( $pendingDBs[$type2], array( $db ) );
                                        }
                                } else {
+                                       // There are no jobs of this type available in the current database
                                        $pendingDBs[$type] = array_diff( $pendingDBs[$type], array( $db ) );
                                }
-
-                               $wgMemc->set( $memcKey, $pendingDBs, 300 );
+                               // Update the cache to remove the outdated information.
+                               // Make sure that this does not race (especially with full rebuilds).
+                               $pendingDbInfo['pendingDBs'] = $pendingDBs;
+                               if ( $wgMemc->add( "$memcKey:lock", 1, 60 ) ) { // lock
+                                       $curInfo = $wgMemc->get( $memcKey );
+                                       if ( $curInfo && $curInfo['timestamp'] === $pendingDbInfo['timestamp'] ) {
+                                               $wgMemc->set( $memcKey, $pendingDbInfo );
+                                       }
+                                       $wgMemc->delete( "$memcKey:lock" ); // unlock
+                               }
                                $again = true;
                        }
                } while ( $again );
@@ -97,18 +123,17 @@ class nextJobDB extends Maintenance {
         * @return bool
         */
        function checkJob( $type, $dbName ) {
-               $lb = wfGetLB( $dbName );
-               $db = $lb->getConnection( DB_MASTER, array(), $dbName );
+               $group = JobQueueGroup::singleton( $dbName );
                if ( $type === false ) {
-                       $conds = Job::defaultQueueConditions( );
+                       foreach ( $group->getDefaultQueueTypes() as $type ) {
+                               if ( !$group->get( $type )->isEmpty() ) {
+                                       return true;
+                               }
+                       }
+                       return false;
                } else {
-                       $conds = array( 'job_cmd' => $type );
+                       return !$group->get( $type )->isEmpty();
                }
-
-
-               $exists = (bool) $db->selectField( 'job', '1', $conds, __METHOD__ );
-               $lb->reuseConnection( $db );
-               return $exists;
        }
 
        /**
@@ -117,42 +142,15 @@ class nextJobDB extends Maintenance {
         */
        private function getPendingDbs() {
                global $wgLocalDatabases;
-               $pendingDBs = array();
-               # Cross-reference DBs by master DB server
-               $dbsByMaster = array();
-               foreach ( $wgLocalDatabases as $db ) {
-                       $lb = wfGetLB( $db );
-                       $dbsByMaster[$lb->getServerName( 0 )][] = $db;
-               }
-
-               foreach ( $dbsByMaster as $dbs ) {
-                       $dbConn = wfGetDB( DB_MASTER, array(), $dbs[0] );
-
-                       # Padding row for MySQL bug
-                       $pad = str_repeat( '-', 40 );
-                       $sql = "(SELECT '$pad' as db, '$pad' as job_cmd)";
-                       foreach ( $dbs as $wikiId ) {
-                               if ( $sql != '' ) {
-                                       $sql .= ' UNION ';
-                               }
 
-                               list( $dbName, $tablePrefix ) = wfSplitWikiID( $wikiId );
-                               $dbConn->tablePrefix( $tablePrefix );
-                               $jobTable = $dbConn->tableName( 'job' );
-
-                               $sql .= "(SELECT DISTINCT '$wikiId' as db, job_cmd FROM $dbName.$jobTable GROUP BY job_cmd)";
-                       }
-                       $res = $dbConn->query( $sql, __METHOD__ );
-                       $first = true;
-                       foreach ( $res as $row ) {
-                               if ( $first ) {
-                                       // discard padding row
-                                       $first = false;
-                                       continue;
-                               }
-                               $pendingDBs[$row->job_cmd][] = $row->db;
+               $pendingDBs = array(); // (job type => (db list))
+               foreach ( $wgLocalDatabases as $db ) {
+                       $types = JobQueueGroup::singleton( $db )->getQueuesWithJobs();
+                       foreach ( $types as $type ) {
+                               $pendingDBs[$type][] = $db;
                        }
                }
+
                return $pendingDBs;
        }
 }
diff --git a/maintenance/oracle/archives/patch-archive-ar_content_format.sql b/maintenance/oracle/archives/patch-archive-ar_content_format.sql
new file mode 100644 (file)
index 0000000..0c0c0d9
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive ADD ar_content_format VARCHAR2(64);
diff --git a/maintenance/oracle/archives/patch-archive-ar_content_model.sql b/maintenance/oracle/archives/patch-archive-ar_content_model.sql
new file mode 100644 (file)
index 0000000..d18fc9e
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.archive ADD ar_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-cat_hidden.sql b/maintenance/oracle/archives/patch-cat_hidden.sql
new file mode 100644 (file)
index 0000000..d1649c7
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.category DROP COLUMN cat_hidden;
+
diff --git a/maintenance/oracle/archives/patch-config.sql b/maintenance/oracle/archives/patch-config.sql
deleted file mode 100644 (file)
index 66714a7..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-define mw_prefix='{$wgDBprefix}';
-
-CREATE TABLE &mw_prefix.config (
-  cf_name VARCHAR2(255) NOT NULL,
-  cf_value blob NOT NULL
-);
-ALTER TABLE &mw_prefix.config ADD CONSTRAINT &mw_prefix.config_pk PRIMARY KEY (cf_name);
-
diff --git a/maintenance/oracle/archives/patch-page-page_content_model.sql b/maintenance/oracle/archives/patch-page-page_content_model.sql
new file mode 100644 (file)
index 0000000..e5839d9
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.page ADD page_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-rc_moved.sql b/maintenance/oracle/archives/patch-rc_moved.sql
new file mode 100644 (file)
index 0000000..2a71315
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.recentchanges DROP ( rc_moved_to_ns, rc_moved_to_title );
+
diff --git a/maintenance/oracle/archives/patch-revision-rev_content_format.sql b/maintenance/oracle/archives/patch-revision-rev_content_format.sql
new file mode 100644 (file)
index 0000000..ebde71c
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.revision ADD rev_content_format VARCHAR2(64);
diff --git a/maintenance/oracle/archives/patch-revision-rev_content_model.sql b/maintenance/oracle/archives/patch-revision-rev_content_model.sql
new file mode 100644 (file)
index 0000000..dd22642
--- /dev/null
@@ -0,0 +1,3 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.revision ADD rev_content_model VARCHAR2(32);
diff --git a/maintenance/oracle/archives/patch-ss_admins.sql b/maintenance/oracle/archives/patch-ss_admins.sql
new file mode 100644 (file)
index 0000000..c2e9242
--- /dev/null
@@ -0,0 +1,4 @@
+define mw_prefix='{$wgDBprefix}';
+
+ALTER TABLE &mw_prefix.site_stats DROP COLUMN ss_admins;
+
index 6e3e1b7..84facab 100644 (file)
@@ -25,7 +25,7 @@ BEFORE UPDATE FOR EACH ROW
 ON &mw_prefix.testrun
 BEGIN
   SELECT testrun_tr_id_seq.NEXTVAL into :NEW.tr_id FROM dual;
-END; 
+END;
 
 CREATE TABLE /*$wgDBprefix*/testitem (
   ti_run NUMBER NOT NULL REFERENCES &mw_prefix.testrun (tr_id) ON DELETE CASCADE,
index 3f9b376..f28c61f 100644 (file)
@@ -73,7 +73,8 @@ CREATE TABLE &mw_prefix.page (
   page_random        NUMBER(15,14) NOT NULL,
   page_touched       TIMESTAMP(6) WITH TIME ZONE,
   page_latest        NUMBER        DEFAULT 0 NOT NULL, -- FK?
-  page_len           NUMBER        DEFAULT 0 NOT NULL
+  page_len           NUMBER        DEFAULT 0 NOT NULL,
+  page_content_model VARCHAR2(32)
 );
 ALTER TABLE &mw_prefix.page ADD CONSTRAINT &mw_prefix.page_pk PRIMARY KEY (page_id);
 CREATE UNIQUE INDEX &mw_prefix.page_u01 ON &mw_prefix.page (page_namespace,page_title);
@@ -83,7 +84,7 @@ CREATE INDEX &mw_prefix.page_i03 ON &mw_prefix.page (page_is_redirect, page_name
 
 -- Create a dummy page to satisfy fk contraints especially with revisions
 INSERT INTO &mw_prefix.page
-  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, 0, 0);
+  VALUES (0, 0, ' ', NULL, 0, 0, 0, 0, current_timestamp, 0, 0, NULL);
 
 /*$mw$*/
 CREATE TRIGGER &mw_prefix.page_set_random BEFORE INSERT ON &mw_prefix.page
@@ -106,7 +107,9 @@ CREATE TABLE &mw_prefix.revision (
   rev_deleted     CHAR(1)         DEFAULT '0' NOT NULL,
   rev_len         NUMBER          NULL,
   rev_parent_id   NUMBER          DEFAULT NULL,
-  rev_sha1               VARCHAR2(32)    NULL
+  rev_sha1               VARCHAR2(32)    NULL,
+  rev_content_model VARCHAR2(32),
+  rev_content_format VARCHAR2(64)
 );
 ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_pk PRIMARY KEY (rev_id);
 ALTER TABLE &mw_prefix.revision ADD CONSTRAINT &mw_prefix.revision_fk1 FOREIGN KEY (rev_page) REFERENCES &mw_prefix.page(page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED;
@@ -142,7 +145,9 @@ CREATE TABLE &mw_prefix.archive (
   ar_len         NUMBER,
   ar_page_id     NUMBER,
   ar_parent_id   NUMBER,
-  ar_sha1                VARCHAR2(32)    NULL
+  ar_sha1                VARCHAR2(32),
+  ar_content_model VARCHAR2(32),
+  ar_content_format VARCHAR2(64)
 );
 ALTER TABLE &mw_prefix.archive ADD CONSTRAINT &mw_prefix.archive_fk1 FOREIGN KEY (ar_user) REFERENCES &mw_prefix.mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED;
 CREATE INDEX &mw_prefix.archive_i01 ON &mw_prefix.archive (ar_namespace,ar_title,ar_timestamp);
@@ -197,8 +202,7 @@ CREATE TABLE &mw_prefix.category (
   cat_title VARCHAR2(255) NOT NULL,
   cat_pages NUMBER DEFAULT 0 NOT NULL,
   cat_subcats NUMBER DEFAULT 0 NOT NULL,
-  cat_files NUMBER DEFAULT 0 NOT NULL,
-  cat_hidden NUMBER DEFAULT 0 NOT NULL
+  cat_files NUMBER DEFAULT 0 NOT NULL
 );
 ALTER TABLE &mw_prefix.category ADD CONSTRAINT &mw_prefix.category_pk PRIMARY KEY (cat_id);
 CREATE UNIQUE INDEX &mw_prefix.category_u01 ON &mw_prefix.category (cat_title);
@@ -246,7 +250,6 @@ CREATE TABLE &mw_prefix.site_stats (
   ss_total_pages    NUMBER            DEFAULT -1,
   ss_users          NUMBER            DEFAULT -1,
   ss_active_users   NUMBER            DEFAULT -1,
-  ss_admins         NUMBER            DEFAULT -1,
   ss_images         NUMBER            DEFAULT 0
 );
 CREATE UNIQUE INDEX &mw_prefix.site_stats_u01 ON &mw_prefix.site_stats (ss_row_id);
@@ -667,13 +670,6 @@ CREATE TABLE &mw_prefix.module_deps (
 );
 CREATE UNIQUE INDEX &mw_prefix.module_deps_u01 ON &mw_prefix.module_deps (md_module, md_skin);
 
-CREATE TABLE &mw_prefix.config (
-  cf_name VARCHAR2(255) NOT NULL,
-  cf_value blob NOT NULL
-);
-ALTER TABLE &mw_prefix.config ADD CONSTRAINT &mw_prefix.config_pk PRIMARY KEY (cf_name);
--- leaving index out for now ...
-
 -- do not prefix this table as it breaks parserTests
 CREATE TABLE wiki_field_info_full (
 table_name VARCHAR2(35) NOT NULL,
diff --git a/maintenance/populateFilearchiveSha1.php b/maintenance/populateFilearchiveSha1.php
new file mode 100644 (file)
index 0000000..27e692d
--- /dev/null
@@ -0,0 +1,107 @@
+<?php
+/**
+ * Optional upgrade script to populate the fa_sha1 field
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once( dirname( __FILE__ ) . '/Maintenance.php' );
+
+/**
+ * Maintenance script to populate the fa_sha1 field.
+ *
+ * @ingroup Maintenance
+ * @since 1.21
+ */
+class PopulateFilearchiveSha1 extends LoggedUpdateMaintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->mDescription = "Populate the fa_sha1 field from fa_storage_key";
+       }
+
+       protected function getUpdateKey() {
+               return 'populate fa_sha1';
+       }
+
+       protected function updateSkippedMessage() {
+               return 'fa_sha1 column of filearchive table already populated.';
+       }
+
+       public function doDBUpdates() {
+               $startTime = microtime( true );
+               $dbw = wfGetDB( DB_MASTER );
+               $table = 'filearchive';
+               $conds = array( 'fa_sha1' => '', 'fa_storage_key IS NOT NULL' );
+
+               if ( !$dbw->fieldExists( $table, 'fa_sha1', __METHOD__ ) ) {
+                       $this->output( "fa_sha1 column does not exist\n\n", true );
+                       return false;
+               }
+
+               $this->output( "Populating fa_sha1 field from fa_storage_key\n" );
+               $endId = $dbw->selectField( $table, 'MAX(fa_id)', false, __METHOD__ );
+
+               $batchSize = $this->mBatchSize;
+               $done = 0;
+
+               do {
+                       $res = $dbw->select(
+                               $table,
+                               array( 'fa_id', 'fa_storage_key' ),
+                               $conds,
+                               __METHOD__,
+                               array( 'LIMIT' => $batchSize )
+                       );
+
+                       $i = 0;
+                       foreach ( $res as $row ) {
+                               if ( $row->fa_storage_key == '' ) {
+                                       // Revision was missing pre-deletion
+                                       continue;
+                               }
+                               $sha1 = LocalRepo::getHashFromKey( $row->fa_storage_key );
+                               $dbw->update( $table,
+                                       array( 'fa_sha1' => $sha1 ),
+                                       array( 'fa_id' => $row->fa_id ),
+                                       __METHOD__
+                               );
+                               $lastId = $row->fa_id;
+                               $i++;
+                       }
+
+                       $done += $i;
+                       if( $i !== $batchSize ) {
+                               break;
+                       }
+
+                       // print status and let slaves catch up
+                       $this->output( sprintf(
+                               "id %d done (up to %d), %5.3f%%  \r", $lastId, $endId, $lastId / $endId * 100 ) );
+                       wfWaitForSlaves();
+               } while( true );
+
+               $processingTime = microtime( true ) - $startTime;
+               $this->output( sprintf( "\nDone %d files in %.1f seconds\n", $done, $processingTime ) );
+
+               return true; // we only updated *some* files, don't log
+       }
+}
+
+$maintClass = "PopulateFilearchiveSha1";
+require_once( RUN_MAINTENANCE_IF_MAIN );
index 6c835f4..4827642 100644 (file)
@@ -48,7 +48,11 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                $db = $this->getDB( DB_MASTER );
                if ( !$db->tableExists( 'revision' ) ) {
                        $this->error( "revision table does not exist", true );
+               } else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
+                       $this->output( "rev_sha1 column does not exist\n\n", true );
+                       return false;
                }
+
                $this->output( "Populating rev_len column\n" );
 
                $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __METHOD__ );
@@ -74,16 +78,16 @@ class PopulateRevisionLength extends LoggedUpdateMaintenance {
                        # Go through and update rev_len from these rows.
                        foreach ( $res as $row ) {
                                $rev = new Revision( $row );
-                               $text = $rev->getRawText();
-                               if ( !is_string( $text ) ) {
+                               $content = $rev->getContent();
+                               if ( !$content ) {
                                        # This should not happen, but sometimes does (bug 20757)
-                                       $this->output( "Text of revision {$row->rev_id} unavailable!\n" );
+                                       $this->output( "Content of revision {$row->rev_id} unavailable!\n" );
                                        $missing++;
                                }
                                else {
                                        # Update the row...
                                        $db->update( 'revision',
-                                                        array( 'rev_len' => strlen( $text ) ),
+                                                        array( 'rev_len' => $content->getSize() ),
                                                         array( 'rev_id' => $row->rev_id ),
                                                         __METHOD__ );
                                        $count++;
index 2e14d31..113eef4 100644 (file)
@@ -48,6 +48,9 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $this->error( "revision table does not exist", true );
                } elseif ( !$db->tableExists( 'archive' ) ) {
                        $this->error( "archive table does not exist", true );
+               } else if ( !$db->fieldExists( 'revision', 'rev_sha1', __METHOD__ ) ) {
+                       $this->output( "rev_sha1 column does not exist\n\n", true );
+                       return false;
                }
 
                $this->output( "Populating rev_sha1 column\n" );
@@ -143,14 +146,14 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $rev = ( $table === 'archive' )
                                ? Revision::newFromArchiveRow( $row )
                                : new Revision( $row );
-                       $text = $rev->getRawText();
+                       $text = $rev->getSerializedData();
                } catch ( MWException $e ) {
-                       $this->output( "Text of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+                       $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
                        return false; // bug 22624?
                }
                if ( !is_string( $text ) ) {
                        # This should not happen, but sometimes does (bug 20757)
-                       $this->output( "Text of revision with {$idCol}={$row->$idCol} unavailable!\n" );
+                       $this->output( "Data of revision with {$idCol}={$row->$idCol} unavailable!\n" );
                        return false;
                } else {
                        $db->update( $table,
@@ -174,10 +177,10 @@ class PopulateRevisionSha1 extends LoggedUpdateMaintenance {
                        $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
                        return false; // bug 22624?
                }
-               $text = $rev->getRawText();
+               $text = $rev->getSerializedData();
                if ( !is_string( $text ) ) {
                        # This should not happen, but sometimes does (bug 20757)
-                       $this->output( "Text of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
+                       $this->output( "Data of revision with timestamp {$row->ar_timestamp} unavailable!\n" );
                        return false;
                } else {
                        # Archive table as no PK, but (NS,title,time) should be near unique.
diff --git a/maintenance/postgres/archives/patch-config.sql b/maintenance/postgres/archives/patch-config.sql
deleted file mode 100644 (file)
index 2f39ff0..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-CREATE TABLE config (
-  cf_name   TEXT  NOT NULL  PRIMARY KEY,
-  cf_value  TEXT  NOT NULL
-);
-CREATE INDEX cf_name_value ON config (cf_name, cf_value);
\ No newline at end of file
diff --git a/maintenance/postgres/archives/patch-ipb_address_unique.sql b/maintenance/postgres/archives/patch-ipb_address_unique.sql
deleted file mode 100644 (file)
index e69de29..0000000
index c15300b..a131b5d 100644 (file)
@@ -26,5 +26,5 @@ CREATE TABLE testitem (
   ti_run      INTEGER   NOT NULL REFERENCES testrun(tr_id) ON DELETE CASCADE,
   ti_name     TEXT      NOT NULL,
   ti_success  SMALLINT  NOT NULL
-);  
+);
 CREATE UNIQUE INDEX testitem_uniq ON testitem(ti_run, ti_name);
index 1e3eecb..845193d 100644 (file)
@@ -79,7 +79,8 @@ CREATE TABLE page (
   page_random        NUMERIC(15,14) NOT NULL  DEFAULT RANDOM(),
   page_touched       TIMESTAMPTZ,
   page_latest        INTEGER        NOT NULL, -- FK?
-  page_len           INTEGER        NOT NULL
+  page_len           INTEGER        NOT NULL,
+  page_content_model TEXT
 );
 CREATE UNIQUE INDEX page_unique_name ON page (page_namespace, page_title);
 CREATE INDEX page_main_title         ON page (page_title text_pattern_ops) WHERE page_namespace = 0;
@@ -104,18 +105,20 @@ CREATE TRIGGER page_deleted AFTER DELETE ON page
 
 CREATE SEQUENCE revision_rev_id_seq;
 CREATE TABLE revision (
-  rev_id          INTEGER      NOT NULL  UNIQUE DEFAULT nextval('revision_rev_id_seq'),
-  rev_page        INTEGER          NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
-  rev_text_id     INTEGER          NULL, -- FK
-  rev_comment     TEXT,
-  rev_user        INTEGER      NOT NULL  REFERENCES mwuser(user_id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
-  rev_user_text   TEXT         NOT NULL,
-  rev_timestamp   TIMESTAMPTZ  NOT NULL,
-  rev_minor_edit  SMALLINT     NOT NULL  DEFAULT 0,
-  rev_deleted     SMALLINT     NOT NULL  DEFAULT 0,
-  rev_len         INTEGER          NULL,
-  rev_parent_id   INTEGER          NULL,
-  rev_sha1        TEXT         NOT NULL DEFAULT ''
+  rev_id             INTEGER      NOT NULL  UNIQUE DEFAULT nextval('revision_rev_id_seq'),
+  rev_page           INTEGER          NULL  REFERENCES page (page_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
+  rev_text_id        INTEGER          NULL, -- FK
+  rev_comment        TEXT,
+  rev_user           INTEGER      NOT NULL  REFERENCES mwuser(user_id) ON DELETE RESTRICT DEFERRABLE INITIALLY DEFERRED,
+  rev_user_text      TEXT         NOT NULL,
+  rev_timestamp      TIMESTAMPTZ  NOT NULL,
+  rev_minor_edit     SMALLINT     NOT NULL  DEFAULT 0,
+  rev_deleted        SMALLINT     NOT NULL  DEFAULT 0,
+  rev_len            INTEGER          NULL,
+  rev_parent_id      INTEGER          NULL,
+  rev_sha1           TEXT         NOT NULL DEFAULT '',
+  rev_content_model  TEXT,
+  rev_content_format TEXT
 );
 CREATE UNIQUE INDEX revision_unique ON revision (rev_page, rev_id);
 CREATE INDEX rev_text_id_idx        ON revision (rev_text_id);
@@ -153,22 +156,24 @@ ALTER TABLE page_props ADD CONSTRAINT page_props_pk PRIMARY KEY (pp_page,pp_prop
 CREATE INDEX page_props_propname ON page_props (pp_propname);
 
 CREATE TABLE archive (
-  ar_namespace   SMALLINT     NOT NULL,
-  ar_title       TEXT         NOT NULL,
-  ar_text        TEXT, -- technically should be bytea, but not used anymore
-  ar_page_id     INTEGER          NULL,
-  ar_parent_id   INTEGER          NULL,
-  ar_sha1        TEXT         NOT NULL DEFAULT '',
-  ar_comment     TEXT,
-  ar_user        INTEGER          NULL  REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
-  ar_user_text   TEXT         NOT NULL,
-  ar_timestamp   TIMESTAMPTZ  NOT NULL,
-  ar_minor_edit  SMALLINT     NOT NULL  DEFAULT 0,
-  ar_flags       TEXT,
-  ar_rev_id      INTEGER,
-  ar_text_id     INTEGER,
-  ar_deleted     SMALLINT     NOT NULL  DEFAULT 0,
-  ar_len         INTEGER          NULL
+  ar_namespace      SMALLINT     NOT NULL,
+  ar_title          TEXT         NOT NULL,
+  ar_text           TEXT, -- technically should be bytea, but not used anymore
+  ar_page_id        INTEGER          NULL,
+  ar_parent_id      INTEGER          NULL,
+  ar_sha1           TEXT         NOT NULL DEFAULT '',
+  ar_comment        TEXT,
+  ar_user           INTEGER          NULL  REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
+  ar_user_text      TEXT         NOT NULL,
+  ar_timestamp      TIMESTAMPTZ  NOT NULL,
+  ar_minor_edit     SMALLINT     NOT NULL  DEFAULT 0,
+  ar_flags          TEXT,
+  ar_rev_id         INTEGER,
+  ar_text_id        INTEGER,
+  ar_deleted        SMALLINT     NOT NULL  DEFAULT 0,
+  ar_len            INTEGER          NULL,
+  ar_content_model  TEXT,
+  ar_content_format TEXT
 );
 CREATE INDEX archive_name_title_timestamp ON archive (ar_namespace,ar_title,ar_timestamp);
 CREATE INDEX archive_user_text            ON archive (ar_user_text);
@@ -353,12 +358,14 @@ CREATE TABLE filearchive (
   fa_user               INTEGER          NULL  REFERENCES mwuser(user_id) ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED,
   fa_user_text          TEXT         NOT NULL,
   fa_timestamp          TIMESTAMPTZ,
-  fa_deleted            SMALLINT     NOT NULL DEFAULT 0
+  fa_deleted            SMALLINT     NOT NULL DEFAULT 0,
+  fa_sha1               TEXT         NOT NULL DEFAULT ''
 );
 CREATE INDEX fa_name_time ON filearchive (fa_name, fa_timestamp);
 CREATE INDEX fa_dupe      ON filearchive (fa_storage_group, fa_storage_key);
 CREATE INDEX fa_notime    ON filearchive (fa_deleted_timestamp);
 CREATE INDEX fa_nouser    ON filearchive (fa_deleted_user);
+CREATE INDEX fa_sha1      ON filearchive (fa_sha1);
 
 CREATE SEQUENCE uploadstash_us_id_seq;
 CREATE TYPE media_type AS ENUM ('UNKNOWN','BITMAP','DRAWING','AUDIO','VIDEO','MULTIMEDIA','OFFICE','TEXT','EXECUTABLE','ARCHIVE');
@@ -516,13 +523,19 @@ CREATE INDEX ls_log_id ON log_search (ls_log_id);
 
 CREATE SEQUENCE job_job_id_seq;
 CREATE TABLE job (
-  job_id         INTEGER   NOT NULL  PRIMARY KEY DEFAULT nextval('job_job_id_seq'),
-  job_cmd        TEXT      NOT NULL,
-  job_namespace  SMALLINT  NOT NULL,
-  job_title      TEXT      NOT NULL,
-  job_timestamp  TIMESTAMPTZ,
-  job_params     TEXT      NOT NULL
-);
+  job_id              INTEGER   NOT NULL  PRIMARY KEY DEFAULT nextval('job_job_id_seq'),
+  job_cmd             TEXT      NOT NULL,
+  job_namespace       SMALLINT  NOT NULL,
+  job_title           TEXT      NOT NULL,
+  job_timestamp       TIMESTAMPTZ,
+  job_params          TEXT      NOT NULL,
+  job_random          INTEGER   NOT NULL DEFAULT 0,
+  job_token           TEXT      NOT NULL DEFAULT '',
+  job_token_timestamp TIMESTAMPTZ,
+  job_sha1            TEXT NOT NULL DEFAULT ''
+);
+CREATE INDEX job_sha1 ON job (job_sha1);
+CREATE INDEX job_cmd_token ON job (job_cmd, job_token, job_random);
 CREATE INDEX job_cmd_namespace_title ON job (job_cmd, job_namespace, job_title);
 CREATE INDEX job_timestamp_idx ON job (job_timestamp);
 
@@ -684,9 +697,3 @@ CREATE TABLE module_deps (
   md_deps    TEXT  NOT NULL
 );
 CREATE UNIQUE INDEX md_module_skin ON module_deps (md_module, md_skin);
-
-CREATE TABLE config (
-  cf_name   TEXT  NOT NULL  PRIMARY KEY,
-  cf_value  TEXT  NOT NULL
-);
-CREATE INDEX cf_name_value ON config (cf_name, cf_value);
index 5952fd9..87fc997 100644 (file)
@@ -78,8 +78,14 @@ class PreprocessDump extends DumpIterator {
         * @param $rev Revision
         */
        public function processRevision( $rev ) {
+               $content = $rev->getContent( Revision::RAW );
+
+               if ( $content->getModel() !== CONTENT_MODEL_WIKITEXT ) {
+                       return;
+               }
+
                try {
-                       $this->mPreprocessor->preprocessToObj( $rev->getText(), 0 );
+                       $this->mPreprocessor->preprocessToObj( strval( $content->getNativeData() ), 0 );
                }
                catch(Exception $e) {
                        $this->error("Caught exception " . $e->getMessage() . " in " . $rev->getTitle()->getPrefixedText() );
index a53bc88..49c7aee 100644 (file)
@@ -26,7 +26,7 @@ require_once( __DIR__ . '/commandLine.inc' );
 $wgHooks['BeforeParserFetchTemplateAndtitle'][] = 'PPFuzzTester::templateHook';
 
 class PPFuzzTester {
-       var $hairs = array(
+       public $hairs = array(
                '[[', ']]', '{{', '{{', '}}', '}}', '{{{', '}}}',
                '<', '>', '<nowiki', '<gallery', '</nowiki>', '</gallery>', '<nOwIkI>', '</NoWiKi>',
                '<!--' , '-->',
@@ -39,12 +39,12 @@ class PPFuzzTester {
                // extensions
                // '<ref>', '</ref>', '<references/>',
        );
-       var $minLength = 0;
-       var $maxLength = 20;
-       var $maxTemplates = 5;
-       // var $outputTypes = array( 'OT_HTML', 'OT_WIKI', 'OT_PREPROCESS' );
-       var $entryPoints = array( 'testSrvus', 'testPst', 'testPreprocess' );
-       var $verbose = false;
+       public $minLength = 0;
+       public $maxLength = 20;
+       public $maxTemplates = 5;
+       // public $outputTypes = array( 'OT_HTML', 'OT_WIKI', 'OT_PREPROCESS' );
+       public $entryPoints = array( 'testSrvus', 'testPst', 'testPreprocess' );
+       public $verbose = false;
        static $currentTest = false;
 
        function execute() {
@@ -140,7 +140,7 @@ class PPFuzzTester {
 }
 
 class PPFuzzTest {
-       var $templates, $mainText, $title, $entryPoint, $output;
+       public $templates, $mainText, $title, $entryPoint, $output;
 
        function __construct( $tester ) {
                global $wgMaxSigChars;
@@ -219,7 +219,7 @@ class PPFuzzTest {
 }
 
 class PPFuzzUser extends User {
-       var $ppfz_test, $mDataLoaded;
+       public $ppfz_test, $mDataLoaded;
 
        function load() {
                if ( $this->mDataLoaded ) {
index 2f6aa1a..ff13bd6 100644 (file)
@@ -58,6 +58,7 @@ class Protect extends Maintenance {
                        $this->error( "Invalid username", true );
                }
 
+               // @todo FIXME: This is reset 7 lines down.
                $restrictions = array( 'edit' => $protection, 'move' => $protection );
 
                $t = Title::newFromText( $this->getArg() );
index 1c41798..f067dc6 100644 (file)
@@ -30,7 +30,7 @@ require( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class PurgeParserCache extends Maintenance {
-       var $lastProgress;
+       public $lastProgress;
 
        function __construct() {
                parent::__construct();
index 0278f72..bfaaab5 100644 (file)
@@ -218,24 +218,17 @@ class RebuildRecentchanges extends Maintenance {
         * DOCUMENT ME!
         */
        private function rebuildRecentChangesTablePass4() {
-               global $wgGroupPermissions, $wgUseRCPatrol;
+               global $wgUseRCPatrol;
 
                $dbw = wfGetDB( DB_MASTER );
 
                list( $recentchanges, $usergroups, $user ) = $dbw->tableNamesN( 'recentchanges', 'user_groups', 'user' );
 
-               $botgroups = $autopatrolgroups = array();
-               foreach ( $wgGroupPermissions as $group => $rights ) {
-                       if ( isset( $rights['bot'] ) && $rights['bot'] ) {
-                               $botgroups[] = $dbw->addQuotes( $group );
-                       }
-                       if ( $wgUseRCPatrol && isset( $rights['autopatrol'] ) && $rights['autopatrol'] ) {
-                               $autopatrolgroups[] = $dbw->addQuotes( $group );
-                       }
-               }
+               $botgroups = User::getGroupsWithPermission( 'bot' );
+               $autopatrolgroups = $wgUseRCPatrol ? User::getGroupsWithPermission( 'autopatrol' ) : array();
                # Flag our recent bot edits
                if ( !empty( $botgroups ) ) {
-                       $botwhere = implode( ',', $botgroups );
+                       $botwhere = $dbw->makeList( $botgroups );
                        $botusers = array();
 
                        $this->output( "Flagging bot account edits...\n" );
@@ -259,7 +252,7 @@ class RebuildRecentchanges extends Maintenance {
                global $wgMiserMode;
                # Flag our recent autopatrolled edits
                if ( !$wgMiserMode && !empty( $autopatrolgroups ) ) {
-                       $patrolwhere = implode( ',', $autopatrolgroups );
+                       $patrolwhere = $dbw->makeList( $autopatrolgroups );
                        $patrolusers = array();
 
                        $this->output( "Flagging auto-patrolled edits...\n" );
diff --git a/maintenance/refreshFileHeaders.php b/maintenance/refreshFileHeaders.php
new file mode 100644 (file)
index 0000000..74f0f35
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Refresh file headers from metadata.
+ *
+ * Usage: php refreshFileHeaders.php
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @author Aaron Schulz
+ * @ingroup Maintenance
+ */
+
+require_once( __DIR__ . '/Maintenance.php' );
+
+/**
+ * Maintenance script to refresh file headers from metadata
+ *
+ * @ingroup Maintenance
+ */
+class RefreshFileHeaders extends Maintenance {
+       function __construct() {
+               parent::__construct();
+               $this->mDescription = 'Script to update file HTTP headers';
+               $this->addOption( 'verbose', 'Output information about each file.', false, false, 'v' );
+               $this->addOption( 'start', 'Name of file to start with', false, true );
+               $this->addOption( 'end', 'Name of file to end with', false, true );
+               $this->setBatchSize( 200 );
+       }
+
+       public function execute() {
+               $repo = RepoGroup::singleton()->getLocalRepo();
+               $start = str_replace( ' ', '_', $this->getOption( 'start', '' ) ); // page on img_name
+               $end = str_replace( ' ', '_', $this->getOption( 'end', '' ) ); // page on img_name
+
+               $count = 0;
+               $dbr = wfGetDB( DB_SLAVE );
+               do {
+                       $conds = array( "img_name > {$dbr->addQuotes( $start )}" );
+                       if ( strlen( $end ) ) {
+                               $conds[] = "img_name <= {$dbr->addQuotes( $end )}";
+                       }
+                       $res = $dbr->select( 'image', '*', $conds,
+                               __METHOD__, array( 'LIMIT' => $this->mBatchSize, 'ORDER BY' => 'img_name ASC' ) );
+                       foreach ( $res as $row ) {
+                               $file = $repo->newFileFromRow( $row );
+                               $headers = $file->getStreamHeaders();
+                               if ( count( $headers ) ) {
+                                       $this->updateFileHeaders( $file, $headers );
+                               }
+                               // Do all of the older file versions...
+                               foreach ( $file->getHistory() as $oldFile ) {
+                                       $headers = $oldFile->getStreamHeaders();
+                                       if ( count( $headers ) ) {
+                                               $this->updateFileHeaders( $oldFile, $headers );
+                                       }
+                               }
+                               if ( $this->hasOption( 'verbose' ) ) {
+                                       $this->output( "Updated headers for file '{$row->img_name}'.\n" );
+                               }
+                               ++$count;
+                               $start = $row->img_name; // advance
+                       }
+               } while ( $res->numRows() > 0 );
+
+               $this->output( "Done. Updated headers for $count file(s).\n" );
+       }
+
+       protected function updateFileHeaders( File $file, array $headers ) {
+               $status = $file->getRepo()->getBackend()->describe( array(
+                       'src' => $file->getPath(), 'headers' => $headers
+               ) );
+               if ( !$status->isGood() ) {
+                       $this->error( "Encountered error: " . print_r( $status, true ) );
+               }
+       }
+}
+
+$maintClass = 'RefreshFileHeaders';
+require_once( RUN_MAINTENANCE_IF_MAIN );
index 3d9270b..9ba8682 100644 (file)
@@ -206,8 +206,6 @@ class RefreshLinks extends Maintenance {
         * @param $id int The page_id
         */
        public static function fixLinksFromArticle( $id ) {
-               global $wgParser, $wgContLang;
-
                $page = WikiPage::newFromID( $id );
 
                LinkCache::singleton()->clear();
@@ -216,18 +214,16 @@ class RefreshLinks extends Maintenance {
                        return;
                }
 
-               $text = $page->getRawText();
-               if ( $text === false ) {
+               $content = $page->getContent( Revision::RAW );
+               if ( null === false ) {
                        return;
                }
 
                $dbw = wfGetDB( DB_MASTER );
                $dbw->begin( __METHOD__ );
 
-               $options = ParserOptions::newFromUserAndLang( new User, $wgContLang );
-               $parserOutput = $wgParser->parse( $text, $page->getTitle(), $options, true, true, $page->getLatest() );
-               $update = new LinksUpdate( $page->getTitle(), $parserOutput, false );
-               $update->doUpdate();
+               $updates = $content->getSecondaryDataUpdates( $page->getTitle() );
+               DataUpdate::runUpdates( $updates );
 
                $dbw->commit( __METHOD__ );
        }
index 24bedfa..2ba2b3d 100644 (file)
@@ -80,8 +80,6 @@ class DumpRenderer extends Maintenance {
         * @param $rev Revision
         */
        public function handleRevision( $rev ) {
-               global $wgParserConf;
-
                $title = $rev->getTitle();
                if ( !$title ) {
                        $this->error( "Got bogus revision with null title!" );
@@ -100,10 +98,10 @@ class DumpRenderer extends Maintenance {
                $this->output( sprintf( "%s\n", $filename, $display ) );
 
                $user = new User();
-               $parser = new $wgParserConf['class']();
                $options = ParserOptions::newFromUser( $user );
 
-               $output = $parser->parse( $rev->getText(), $title, $options );
+               $content = $rev->getContent();
+               $output = $content->getParserOutput( $title, null, $options );
 
                file_put_contents( $filename,
                        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" " .
index e909bc0..f06e6b0 100644 (file)
@@ -52,6 +52,7 @@ class RunJobs extends Maintenance {
 
        public function execute() {
                global $wgTitle;
+
                if ( $this->hasOption( 'procs' ) ) {
                        $procs = intval( $this->getOption( 'procs' ) );
                        if ( $procs < 1 || $procs > 1000 ) {
@@ -70,26 +71,17 @@ class RunJobs extends Maintenance {
                $dbw = wfGetDB( DB_MASTER );
                $n = 0;
 
-               if ( $type === false ) {
-                       $conds = Job::defaultQueueConditions( );
-               } else {
-                       $conds = array( 'job_cmd' => $type );
-               }
-
-               while ( $dbw->selectField( 'job', 'job_id', $conds, 'runJobs.php' ) ) {
-                       $offset = 0;
-                       for ( ; ; ) {
-                               $job = !$type ? Job::pop( $offset ) : Job::pop_type( $type );
-
-                               if ( !$job ) {
-                                       break;
-                               }
-
-                               wfWaitForSlaves();
+               $group = JobQueueGroup::singleton();
+               do {
+                       $job = ( $type === false )
+                               ? $group->pop() // job from any queue
+                               : $group->get( $type )->pop(); // job from a single queue
+                       if ( $job ) { // found a job
+                               // Perform the job (logging success/failure and runtime)...
                                $t = microtime( true );
-                               $offset = $job->id;
                                $this->runJobsLog( $job->toString() . " STARTING" );
                                $status = $job->run();
+                               $group->ack( $job ); // done
                                $t = microtime( true ) - $t;
                                $timeMs = intval( $t * 1000 );
                                if ( !$status ) {
@@ -97,15 +89,17 @@ class RunJobs extends Maintenance {
                                } else {
                                        $this->runJobsLog( $job->toString() . " t=$timeMs good" );
                                }
-
-                               if ( $maxJobs && ++$n > $maxJobs ) {
-                                       break 2;
+                               // Break out if we hit the job count or wall time limits...
+                               if ( $maxJobs && ++$n >= $maxJobs ) {
+                                       break;
                                }
-                               if ( $maxTime && time() - $startTime > $maxTime ) {
-                                       break 2;
+                               if ( $maxTime && ( time() - $startTime ) > $maxTime ) {
+                                       break;
                                }
+                               // Don't let any slaves/backups fall behind...
+                               $group->get( $type )->waitForBackups();
                        }
-               }
+               } while ( $job ); // stop when there are no jobs
        }
 
        /**
index 04e98d9..72e6775 100644 (file)
@@ -63,24 +63,36 @@ class MwSql extends Maintenance {
                }
 
                $wholeLine = '';
-               while ( ( $line = Maintenance::readconsole() ) !== false ) {
+               $newPrompt = '> ';
+               $prompt    = $newPrompt;
+               while ( ( $line = Maintenance::readconsole( $prompt ) ) !== false ) {
+                       if( !$line ) {
+                               # User simply pressed return key
+                               continue;
+                       }
                        $done = $dbw->streamStatementEnd( $wholeLine, $line );
 
                        $wholeLine .= $line;
 
                        if ( !$done ) {
+                               $wholeLine .= ' ';
+                               $prompt = '    -> ';
                                continue;
                        }
                        if ( $useReadline ) {
-                               readline_add_history( $wholeLine );
+                               # Delimiter is eated by streamStatementEnd, we add it
+                               # up in the history (bug 37020)
+                               readline_add_history( $wholeLine . $dbw->getDelimiter() );
                                readline_write_history( $historyFile );
                        }
                        try{
                                $res = $dbw->query( $wholeLine );
                                $this->sqlPrintResult( $res, $dbw );
+                               $prompt    = $newPrompt;
                                $wholeLine = '';
                        } catch (DBQueryError $e) {
-                               $this->error( $e, true );
+                               $doDie = ! Maintenance::posix_isatty( 0 );
+                               $this->error( $e, $doDie );
                        }
                }
        }
index a8a1fce..16568ac 100644 (file)
@@ -43,6 +43,8 @@ class Sqlite {
         * Checks given files for correctness of SQL syntax. MySQL DDL will be converted to
         * SQLite-compatible during processing.
         * Will throw exceptions on SQL errors
+        * @param $files
+        * @throws MWException
         * @return mixed true if no error or error string in case of errors
         */
        public static function checkSqlSyntax( $files ) {
diff --git a/maintenance/sqlite/archives/patch-drop-ss_admins.sql b/maintenance/sqlite/archives/patch-drop-ss_admins.sql
new file mode 100644 (file)
index 0000000..9951e17
--- /dev/null
@@ -0,0 +1,22 @@
+-- field is deprecated and no longer updated as of 1.5
+CREATE TABLE /*_*/site_stats_tmp (
+  ss_row_id int unsigned NOT NULL,
+  ss_total_views bigint unsigned default 0,
+  ss_total_edits bigint unsigned default 0,
+  ss_good_articles bigint unsigned default 0,
+  ss_total_pages bigint default '-1',
+  ss_users bigint default '-1',
+  ss_active_users bigint default '-1',
+  ss_images int default 0
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/site_stats_tmp
+       SELECT ss_row_id, ss_total_views, ss_total_edits, ss_good_articles,
+               ss_total_pages, ss_users, ss_active_users, ss_images
+               FROM /*_*/site_stats;
+
+DROP TABLE /*_*/site_stats;
+
+ALTER TABLE /*_*/site_stats_tmp RENAME TO /*_*/site_stats;
+
+CREATE UNIQUE INDEX /*i*/ss_row_id ON /*_*/site_stats (ss_row_id);
\ No newline at end of file
diff --git a/maintenance/sqlite/archives/patch-job_token.sql b/maintenance/sqlite/archives/patch-job_token.sql
new file mode 100644 (file)
index 0000000..4e4d28f
--- /dev/null
@@ -0,0 +1,8 @@
+ALTER TABLE /*_*/job ADD COLUMN job_random integer unsigned NOT NULL default 0;
+ALTER TABLE /*_*/job ADD COLUMN job_token varbinary(32) NOT NULL default '';
+ALTER TABLE /*_*/job ADD COLUMN job_sha1 varbinary(32) NOT NULL default '';
+ALTER TABLE /*_*/job ADD COLUMN job_token_timestamp varbinary(14) NULL default NULL;
+
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+
diff --git a/maintenance/sqlite/archives/patch-profiling.sql b/maintenance/sqlite/archives/patch-profiling.sql
new file mode 100644 (file)
index 0000000..4a07283
--- /dev/null
@@ -0,0 +1,12 @@
+-- profiling table
+-- This is optional
+
+CREATE TABLE /*_*/profiling (
+  pf_count int NOT NULL default 0,
+  pf_time float NOT NULL default 0,
+  pf_memory float NOT NULL default 0,
+  pf_name varchar(255) NOT NULL default '',
+  pf_server varchar(30) NOT NULL default ''
+);
+
+CREATE UNIQUE INDEX /*i*/pf_name_server ON /*_*/profiling (pf_name, pf_server);
diff --git a/maintenance/sqlite/archives/patch-rc_moved.sql b/maintenance/sqlite/archives/patch-rc_moved.sql
new file mode 100644 (file)
index 0000000..70248d5
--- /dev/null
@@ -0,0 +1,46 @@
+-- rc_moved_to_ns and rc_moved_to_title is no longer used, delete the fields
+
+CREATE TABLE /*_*/recentchanges_tmp (
+  rc_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  rc_timestamp varbinary(14) NOT NULL default '',
+  rc_cur_time varbinary(14) NOT NULL default '',
+  rc_user int unsigned NOT NULL default 0,
+  rc_user_text varchar(255) binary NOT NULL,
+  rc_namespace int NOT NULL default 0,
+  rc_title varchar(255) binary NOT NULL default '',
+  rc_comment varchar(255) binary NOT NULL default '',
+  rc_minor tinyint unsigned NOT NULL default 0,
+  rc_bot tinyint unsigned NOT NULL default 0,
+  rc_new tinyint unsigned NOT NULL default 0,
+  rc_cur_id int unsigned NOT NULL default 0,
+  rc_this_oldid int unsigned NOT NULL default 0,
+  rc_last_oldid int unsigned NOT NULL default 0,
+  rc_type tinyint unsigned NOT NULL default 0,
+  rc_patrolled tinyint unsigned NOT NULL default 0,
+  rc_ip varbinary(40) NOT NULL default '',
+  rc_old_len int,
+  rc_new_len int,
+  rc_deleted tinyint unsigned NOT NULL default 0,
+  rc_logid int unsigned NOT NULL default 0,
+  rc_log_type varbinary(255) NULL default NULL,
+  rc_log_action varbinary(255) NULL default NULL,
+  rc_params blob NULL
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/recentchanges_tmp
+       SELECT rc_id, rc_timestamp, rc_cur_time, rc_user, rc_user_text, rc_namespace, rc_title, rc_comment,
+               rc_minor, rc_bot, rc_new, rc_cur_id, rc_this_oldid, rc_last_oldid, rc_type, rc_patrolled, rc_ip,
+               rc_old_len, rc_new_len, rc_deleted, rc_logid, rc_log_type, rc_log_action, rc_params
+               FROM /*_*/recentchanges;
+
+DROP TABLE /*_*/recentchanges;
+
+ALTER TABLE /*_*/recentchanges_tmp RENAME TO /*_*/recentchanges;
+
+CREATE INDEX /*i*/rc_timestamp ON /*_*/recentchanges (rc_timestamp);
+CREATE INDEX /*i*/rc_namespace_title ON /*_*/recentchanges (rc_namespace, rc_title);
+CREATE INDEX /*i*/rc_cur_id ON /*_*/recentchanges (rc_cur_id);
+CREATE INDEX /*i*/new_name_timestamp ON /*_*/recentchanges (rc_new,rc_namespace,rc_timestamp);
+CREATE INDEX /*i*/rc_ip ON /*_*/recentchanges (rc_ip);
+CREATE INDEX /*i*/rc_ns_usertext ON /*_*/recentchanges (rc_namespace, rc_user_text);
+CREATE INDEX /*i*/rc_user_text ON /*_*/recentchanges (rc_user_text, rc_timestamp);
index 851a6b3..fd4c9ec 100644 (file)
@@ -1,4 +1,4 @@
--- 
+--
 -- Recreates the iwl_prefix for the iwlinks table
 --
 DROP INDEX IF EXISTS /*i*/iwl_prefix;
diff --git a/maintenance/sqlite/archives/patch-sites.sql b/maintenance/sqlite/archives/patch-sites.sql
new file mode 100644 (file)
index 0000000..8839274
--- /dev/null
@@ -0,0 +1,71 @@
+-- Patch to add the sites and site_identifiers tables.
+-- Licence: GNU GPL v2+
+-- Author: Jeroen De Dauw < jeroendedauw@gmail.com >
+
+
+-- Holds all the sites known to the wiki.
+CREATE TABLE IF NOT EXISTS /*_*/sites (
+-- Numeric id of the site
+  site_id                    INT UNSIGNED        NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+  -- Global identifier for the site, ie 'enwiktionary'
+  site_global_key            varbinary(32)       NOT NULL,
+
+  -- Type of the site, ie 'mediawiki'
+  site_type                  varbinary(32)       NOT NULL,
+
+  -- Group of the site, ie 'wikipedia'
+  site_group                 varbinary(32)       NOT NULL,
+
+  -- Source of the site data, ie 'local', 'wikidata', 'my-magical-repo'
+  site_source                varbinary(32)       NOT NULL,
+
+  -- Language code of the sites primary language.
+  site_language              varbinary(32)       NOT NULL,
+
+  -- Protocol of the site, ie 'http://', 'irc://', '//'
+  -- This field is an index for lookups and is build from type specific data in site_data.
+  site_protocol              varbinary(32)       NOT NULL,
+
+  -- Domain of the site in reverse order, ie 'org.mediawiki.www.'
+  -- This field is an index for lookups and is build from type specific data in site_data.
+  site_domain                VARCHAR(255)        NOT NULL,
+
+  -- Type dependent site data.
+  site_data                  BLOB                NOT NULL,
+
+  -- If site.tld/path/key:pageTitle should forward users to  the page on
+  -- the actual site, where "key" is the local identifier.
+  site_forward              bool                NOT NULL,
+
+  -- Type dependent site config.
+  -- For instance if template transclusion should be allowed if it's a MediaWiki.
+  site_config               BLOB                NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/sites_global_key ON /*_*/sites (site_global_key);
+CREATE INDEX /*i*/sites_type ON /*_*/sites (site_type);
+CREATE INDEX /*i*/sites_group ON /*_*/sites (site_group);
+CREATE INDEX /*i*/sites_source ON /*_*/sites (site_source);
+CREATE INDEX /*i*/sites_language ON /*_*/sites (site_language);
+CREATE INDEX /*i*/sites_protocol ON /*_*/sites (site_protocol);
+CREATE INDEX /*i*/sites_domain ON /*_*/sites (site_domain);
+CREATE INDEX /*i*/sites_forward ON /*_*/sites (site_forward);
+
+
+
+-- Links local site identifiers to their corresponding site.
+CREATE TABLE IF NOT EXISTS /*_*/site_identifiers (
+  -- Key on site.site_id
+  si_site                    INT UNSIGNED        NOT NULL,
+
+  -- local key type, ie 'interwiki' or 'langlink'
+  si_type                    varbinary(32)       NOT NULL,
+
+  -- local key value, ie 'en' or 'wiktionary'
+  si_key                     varbinary(32)       NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/site_ids_type ON /*_*/site_identifiers (si_type, si_key);
+CREATE INDEX /*i*/site_ids_site ON /*_*/site_identifiers (si_site);
+CREATE INDEX /*i*/site_ids_key ON /*_*/site_identifiers (si_key);
\ No newline at end of file
index 28554c0..2a37094 100644 (file)
@@ -1,7 +1,7 @@
 -- Patch that introduces fulltext search capabilities to SQLite schema
 -- Requires that SQLite must be compiled with FTS3 module (comes with core amalgamation).
 -- See http://sqlite.org/fts3.html for details of syntax.
--- Will fail if FTS3 is not present, 
+-- Will fail if FTS3 is not present,
 DROP TABLE IF EXISTS /*_*/searchindex;
 CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
   -- Key to page_id
@@ -10,7 +10,7 @@ CREATE VIRTUAL TABLE /*_*/searchindex USING FTS3(
 
   -- Munged version of title
   si_title,
-  
+
   -- Munged version of body text
   si_text
 );
index bc014b3..16247ff 100644 (file)
@@ -17,7 +17,7 @@ CREATE TABLE /*_*/searchindex (
 
   -- Munged version of title
   si_title TEXT,
-  
+
   -- Munged version of body text
   si_text TEXT
 );
index 5797a6c..fd9393f 100644 (file)
@@ -44,10 +44,10 @@ if ( !defined( 'MEDIAWIKI' ) ) {
  */
 class CheckStorage {
        const CONCAT_HEADER = 'O:27:"concatenatedgziphistoryblob"';
-       var $oldIdMap, $errors;
-       var $dbStore = null;
+       public $oldIdMap, $errors;
+       public $dbStore = null;
 
-       var $errorDescriptions = array(
+       public $errorDescriptions = array(
                'restore text' => 'Damaged text, need to be restored from a backup',
                'restore revision' => 'Damaged revision row, need to be restored from a backup',
                'unfixable' => 'Unexpected errors with no automated fixing method',
diff --git a/maintenance/storage/drop_content_model_info.sql b/maintenance/storage/drop_content_model_info.sql
new file mode 100644 (file)
index 0000000..7bd9aba
--- /dev/null
@@ -0,0 +1,7 @@
+ALTER TABLE /*$wgDBprefix*/archive  DROP COLUMN ar_content_model;
+ALTER TABLE /*$wgDBprefix*/archive  DROP COLUMN ar_content_format;
+
+ALTER TABLE /*$wgDBprefix*/revision  DROP COLUMN rev_content_model;
+ALTER TABLE /*$wgDBprefix*/revision  DROP COLUMN rev_content_format;
+
+ALTER TABLE /*$wgDBprefix*/page  DROP COLUMN page_content_model;
index 21a4957..d394558 100644 (file)
@@ -29,10 +29,10 @@ require_once( __DIR__ . '/../Maintenance.php' );
  * @ingroup Maintenance ExternalStorage
  */
 class FixBug20757 extends Maintenance {
-       var $batchSize = 10000;
-       var $mapCache = array();
-       var $mapCacheSize = 0;
-       var $maxMapCacheSize = 1000000;
+       public $batchSize = 10000;
+       public $mapCache = array();
+       public $mapCacheSize = 0;
+       public $maxMapCacheSize = 1000000;
 
        function __construct() {
                parent::__construct();
old mode 100755 (executable)
new mode 100644 (file)
index 36cf9ce..16dcb67
@@ -6,11 +6,9 @@ if [ -z $2 ];then
 fi
 if [ -z $3 ]; then
        table=blobs
-else 
+else
        table=$3
 fi
 
 echo "CREATE DATABASE $2" | mysql -u wikiadmin -p`wikiadmin_pass` -h $1 && \
 sed "s/blobs\>/$table/" blobs.sql | mysql -u wikiadmin -p`wikiadmin_pass` -h $1 $2
-       
-       
index f770681..fe62ddf 100644 (file)
@@ -49,19 +49,19 @@ $job->execute();
  * @ingroup Maintenance ExternalStorage
  */
 class RecompressTracked {
-       var $destClusters;
-       var $batchSize = 1000;
-       var $orphanBatchSize = 1000;
-       var $reportingInterval = 10;
-       var $numProcs = 1;
-       var $useDiff, $pageBlobClass, $orphanBlobClass;
-       var $slavePipes, $slaveProcs, $prevSlaveId;
-       var $copyOnly = false;
-       var $isChild = false;
-       var $slaveId = false;
-       var $noCount = false;
-       var $debugLog, $infoLog, $criticalLog;
-       var $store;
+       public $destClusters;
+       public $batchSize = 1000;
+       public $orphanBatchSize = 1000;
+       public $reportingInterval = 10;
+       public $numProcs = 1;
+       public $useDiff, $pageBlobClass, $orphanBlobClass;
+       public $slavePipes, $slaveProcs, $prevSlaveId;
+       public $copyOnly = false;
+       public $isChild = false;
+       public $slaveId = false;
+       public $noCount = false;
+       public $debugLog, $infoLog, $criticalLog;
+       public $store;
 
        static $optionsWithArgs = array( 'procs', 'slave-id', 'debug-log', 'info-log', 'critical-log' );
        static $cmdLineOptionMap = array(
@@ -676,10 +676,10 @@ class RecompressTracked {
  * Class to represent a recompression operation for a single CGZ blob
  */
 class CgzCopyTransaction {
-       var $parent;
-       var $blobClass;
-       var $cgz;
-       var $referrers;
+       public $parent;
+       public $blobClass;
+       public $cgz;
+       public $referrers;
 
        /**
         * Create a transaction from a RecompressTracked object
index 58b0847..9487bbf 100644 (file)
@@ -66,7 +66,7 @@ $uncompressedSize = 0;
 $t = -microtime( true );
 foreach ( $res as $row ) {
        $revision = new Revision( $row );
-       $text = $revision->getText();
+       $text = $revision->getSerializedData();
        $uncompressedSize += strlen( $text );
        $hashes[$row->rev_id] = md5( $text );
        $keys[$row->rev_id] = $blob->addItem( $text );
index 214168a..2f3c8c6 100644 (file)
@@ -37,12 +37,12 @@ $tracker->run();
 echo "All done.\n";
 
 class TrackBlobs {
-       var $clusters, $textClause;
-       var $doBlobOrphans;
-       var $trackedBlobs = array();
+       public $clusters, $textClause;
+       public $doBlobOrphans;
+       public $trackedBlobs = array();
 
-       var $batchSize = 1000;
-       var $reportingInterval = 10;
+       public $batchSize = 1000;
+       public $reportingInterval = 10;
 
        function __construct( $clusters ) {
                $this->clusters = $clusters;
index a29647b..e279ccb 100644 (file)
@@ -34,21 +34,44 @@ class SyncFileBackend extends Maintenance {
                parent::__construct();
                $this->mDescription = "Sync one file backend with another using the journal";
                $this->addOption( 'src', 'Name of backend to sync from', true, true );
-               $this->addOption( 'dst', 'Name of destination backend to sync', true, true );
+               $this->addOption( 'dst', 'Name of destination backend to sync', false, true );
                $this->addOption( 'start', 'Starting journal ID', false, true );
                $this->addOption( 'end', 'Ending journal ID', false, true );
                $this->addOption( 'posdir', 'Directory to read/record journal positions', false, true );
+               $this->addOption( 'posdump', 'Just dump current journal position into the position dir.' );
                $this->addOption( 'verbose', 'Verbose mode', false, false, 'v' );
                $this->setBatchSize( 50 );
        }
 
        public function execute() {
                $src = FileBackendGroup::singleton()->get( $this->getOption( 'src' ) );
-               $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
 
                $posDir = $this->getOption( 'posdir' );
                $posFile = $posDir ? $posDir . '/' . wfWikiID() : false;
 
+               if ( $this->hasOption( 'posdump' ) ) {
+                       // Just dump the current position into the specified position dir
+                       if ( !$this->hasOption( 'posdir' ) ) {
+                               $this->error( "Param posdir required!", 1 );
+                       }
+                       $id = (int)$src->getJournal()->getCurrentPosition(); // default to 0
+                       $this->output( "Current journal position is $id.\n" );
+                       if ( file_put_contents( $posFile, $id, LOCK_EX ) !== false ) {
+                               $this->output( "Saved journal position file.\n" );
+                       } else {
+                               $this->output( "Could not save journal position file.\n" );
+                       }
+                       if ( $this->isQuiet() ) {
+                               print $id; // give a single machine-readable number
+                       }
+                       return;
+               }
+
+               if ( !$this->hasOption( 'dst' ) ) {
+                       $this->error( "Param dst required!", 1 );
+               }
+               $dst = FileBackendGroup::singleton()->get( $this->getOption( 'dst' ) );
+
                $start = $this->getOption( 'start', 0 );
                if ( !$start && $posFile && is_dir( $posDir ) ) {
                        $start = is_file( $posFile )
index 062052f..c9a188b 100644 (file)
@@ -260,7 +260,10 @@ CREATE TABLE /*_*/page (
   page_latest int unsigned NOT NULL,
 
   -- Uncompressed length in bytes of the page's current source text.
-  page_len int unsigned NOT NULL
+  page_len int unsigned NOT NULL,
+
+  -- content model, see CONTENT_MODEL_XXX constants
+  page_content_model varbinary(32) DEFAULT NULL
 ) /*$wgDBTableOptions*/;
 
 CREATE UNIQUE INDEX /*i*/name_title ON /*_*/page (page_namespace,page_title);
@@ -316,7 +319,13 @@ CREATE TABLE /*_*/revision (
   rev_parent_id int unsigned default NULL,
 
   -- SHA-1 text content hash in base-36
-  rev_sha1 varbinary(32) NOT NULL default ''
+  rev_sha1 varbinary(32) NOT NULL default '',
+
+  -- content model, see CONTENT_MODEL_XXX constants
+  rev_content_model varbinary(32) DEFAULT NULL,
+
+  -- content format, see CONTENT_FORMAT_XXX constants
+  rev_content_format varbinary(64) DEFAULT NULL
 
 ) /*$wgDBTableOptions*/ MAX_ROWS=10000000 AVG_ROW_LENGTH=1024;
 -- In case tables are created as MyISAM, use row hints for MySQL <5.0 to avoid 4GB limit
@@ -427,7 +436,14 @@ CREATE TABLE /*_*/archive (
   ar_parent_id int unsigned default NULL,
 
   -- SHA-1 text content hash in base-36
-  ar_sha1 varbinary(32) NOT NULL default ''
+  ar_sha1 varbinary(32) NOT NULL default '',
+
+  -- content model, see CONTENT_MODEL_XXX constants
+  ar_content_model varbinary(32) DEFAULT NULL,
+
+  -- content format, see CONTENT_FORMAT_XXX constants
+  ar_content_format varbinary(64) DEFAULT NULL
+
 ) /*$wgDBTableOptions*/;
 
 CREATE INDEX /*i*/name_title_timestamp ON /*_*/archive (ar_namespace,ar_title,ar_timestamp);
@@ -689,9 +705,6 @@ CREATE TABLE /*_*/site_stats (
   -- Number of users that still edit
   ss_active_users bigint default '-1',
 
-  -- Deprecated, no longer updated as of 1.5
-  ss_admins int default '-1',
-
   -- Number of images, equivalent to SELECT COUNT(*) FROM image
   ss_images int default 0
 ) /*$wgDBTableOptions*/;
@@ -846,7 +859,7 @@ CREATE INDEX /*i*/img_size ON /*_*/image (img_size);
 -- Used by Special:Newimages and Special:ListFiles
 CREATE INDEX /*i*/img_timestamp ON /*_*/image (img_timestamp);
 -- Used in API and duplicate search
-CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1);
+CREATE INDEX /*i*/img_sha1 ON /*_*/image (img_sha1(10));
 
 
 --
@@ -884,7 +897,7 @@ CREATE INDEX /*i*/oi_usertext_timestamp ON /*_*/oldimage (oi_user_text,oi_timest
 CREATE INDEX /*i*/oi_name_timestamp ON /*_*/oldimage (oi_name,oi_timestamp);
 -- oi_archive_name truncated to 14 to avoid key length overflow
 CREATE INDEX /*i*/oi_name_archive_name ON /*_*/oldimage (oi_name,oi_archive_name(14));
-CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1);
+CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10));
 
 
 --
@@ -932,7 +945,10 @@ CREATE TABLE /*_*/filearchive (
   fa_timestamp binary(14) default '',
 
   -- Visibility of deleted revisions, bitfield
-  fa_deleted tinyint unsigned NOT NULL default 0
+  fa_deleted tinyint unsigned NOT NULL default 0,
+
+  -- sha1 hash of file content
+  fa_sha1 varbinary(32) NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
 -- pick out by image name
@@ -943,6 +959,8 @@ CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_sto
 CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
 -- sort by uploader
 CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
+-- find file by sha1, 10 bytes will be enough for hashes to be indexed
+CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10));
 
 
 --
@@ -976,8 +994,10 @@ CREATE TABLE /*_*/uploadstash (
   -- chunk counter starts at 0, current offset is stored in us_size
   us_chunk_inx int unsigned NULL,
 
-  -- file properties from File::getPropsFromPath.  these may prove unnecessary.
-  --
+  -- Serialized file properties from File::getPropsFromPath
+  us_props blob,
+
+  -- file size in bytes
   us_size int unsigned NOT NULL,
   -- this hash comes from File::sha1Base36(), and is 31 characters
   us_sha1 varchar(31) NOT NULL,
@@ -1045,10 +1065,6 @@ CREATE TABLE /*_*/recentchanges (
   -- The type of change entry (RC_EDIT,RC_NEW,RC_LOG)
   rc_type tinyint unsigned NOT NULL default 0,
 
-  -- These may no longer be used, with the new move log.
-  rc_moved_to_ns tinyint unsigned NOT NULL default 0,
-  rc_moved_to_title varchar(255) binary NOT NULL default '',
-
   -- If the Recent Changes Patrol option is enabled,
   -- users may mark edits as having been reviewed to
   -- remove a warning flag on the RC list.
@@ -1228,7 +1244,8 @@ CREATE TABLE /*_*/logging (
   -- Freeform text. Interpreted as edit history comments.
   log_comment varchar(255) NOT NULL default '',
 
-  -- LF separated list of miscellaneous parameters
+  -- miscellaneous parameters:
+  -- LF separated list (old system) or serialized PHP array (new system)
   log_params blob NOT NULL,
 
   -- rev_deleted for logs
@@ -1275,9 +1292,27 @@ CREATE TABLE /*_*/job (
 
   -- Any other parameters to the command
   -- Stored as a PHP serialized array, or an empty string if there are no parameters
-  job_params blob NOT NULL
+  job_params blob NOT NULL,
+
+  -- Random, non-unique, number used for job acquisition (for lock concurrency)
+  job_random integer unsigned NOT NULL default 0,
+
+  -- The number of times this job has been locked
+  job_attempts integer unsigned NOT NULL default 0,
+
+  -- Field that conveys process locks on rows via process UUIDs
+  job_token varbinary(32) NOT NULL default '',
+
+  -- Timestamp when the job was locked
+  job_token_timestamp varbinary(14) NULL default NULL,
+
+  -- Base 36 SHA1 of the job parameters relevant to detecting duplicates
+  job_sha1 varbinary(32) NOT NULL default ''
 ) /*$wgDBTableOptions*/;
 
+CREATE INDEX /*i*/job_sha1 ON /*_*/job (job_sha1);
+CREATE INDEX /*i*/job_cmd_token ON /*_*/job (job_cmd,job_token,job_random);
+CREATE INDEX /*i*/job_cmd_token_id ON /*_*/job (job_cmd,job_token,job_id);
 CREATE INDEX /*i*/job_cmd ON /*_*/job (job_cmd, job_namespace, job_title, job_params(128));
 CREATE INDEX /*i*/job_timestamp ON /*_*/job (job_timestamp);
 
@@ -1479,14 +1514,69 @@ CREATE TABLE /*_*/module_deps (
 ) /*$wgDBTableOptions*/;
 CREATE UNIQUE INDEX /*i*/md_module_skin ON /*_*/module_deps (md_module, md_skin);
 
--- Table for holding configuration changes
-CREATE TABLE /*_*/config (
-  -- Config var name
-  cf_name varbinary(255) NOT NULL PRIMARY KEY,
-  -- Config var value
-  cf_value blob NOT NULL
+-- Holds all the sites known to the wiki.
+CREATE TABLE /*_*/sites (
+-- Numeric id of the site
+  site_id                    INT UNSIGNED        NOT NULL PRIMARY KEY AUTO_INCREMENT,
+
+  -- Global identifier for the site, ie 'enwiktionary'
+  site_global_key            varbinary(32)       NOT NULL,
+
+  -- Type of the site, ie 'mediawiki'
+  site_type                  varbinary(32)       NOT NULL,
+
+  -- Group of the site, ie 'wikipedia'
+  site_group                 varbinary(32)       NOT NULL,
+
+  -- Source of the site data, ie 'local', 'wikidata', 'my-magical-repo'
+  site_source                varbinary(32)       NOT NULL,
+
+  -- Language code of the sites primary language.
+  site_language              varbinary(32)       NOT NULL,
+
+  -- Protocol of the site, ie 'http://', 'irc://', '//'
+  -- This field is an index for lookups and is build from type specific data in site_data.
+  site_protocol              varbinary(32)       NOT NULL,
+
+  -- Domain of the site in reverse order, ie 'org.mediawiki.www.'
+  -- This field is an index for lookups and is build from type specific data in site_data.
+  site_domain                VARCHAR(255)        NOT NULL,
+
+  -- Type dependent site data.
+  site_data                  BLOB                NOT NULL,
+
+  -- If site.tld/path/key:pageTitle should forward users to  the page on
+  -- the actual site, where "key" is the local identifier.
+  site_forward              bool                NOT NULL,
+
+  -- Type dependent site config.
+  -- For instance if template transclusion should be allowed if it's a MediaWiki.
+  site_config               BLOB                NOT NULL
 ) /*$wgDBTableOptions*/;
--- Should cover *most* configuration - strings, ints, bools, etc.
-CREATE INDEX /*i*/cf_name_value ON /*_*/config (cf_name,cf_value(255));
+
+CREATE UNIQUE INDEX /*i*/sites_global_key ON /*_*/sites (site_global_key);
+CREATE INDEX /*i*/sites_type ON /*_*/sites (site_type);
+CREATE INDEX /*i*/sites_group ON /*_*/sites (site_group);
+CREATE INDEX /*i*/sites_source ON /*_*/sites (site_source);
+CREATE INDEX /*i*/sites_language ON /*_*/sites (site_language);
+CREATE INDEX /*i*/sites_protocol ON /*_*/sites (site_protocol);
+CREATE INDEX /*i*/sites_domain ON /*_*/sites (site_domain);
+CREATE INDEX /*i*/sites_forward ON /*_*/sites (site_forward);
+
+-- Links local site identifiers to their corresponding site.
+CREATE TABLE /*_*/site_identifiers (
+  -- Key on site.site_id
+  si_site                    INT UNSIGNED        NOT NULL,
+
+  -- local key type, ie 'interwiki' or 'langlink'
+  si_type                    varbinary(32)       NOT NULL,
+
+  -- local key value, ie 'en' or 'wiktionary'
+  si_key                     varbinary(32)       NOT NULL
+) /*$wgDBTableOptions*/;
+
+CREATE UNIQUE INDEX /*i*/site_ids_type ON /*_*/site_identifiers (si_type, si_key);
+CREATE INDEX /*i*/site_ids_site ON /*_*/site_identifiers (si_site);
+CREATE INDEX /*i*/site_ids_key ON /*_*/site_identifiers (si_key);
 
 -- vim: sw=2 sts=2 et
index ca0f95d..1cb97f9 100644 (file)
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @ingroup Testing
+ * @ingroup Maintenance Testing
  * @todo Fixme: Make this more generic
  */
 
 /**
  * Terminal that supports ANSI escape sequences.
+ *
+ * @ingroup Maintenance Testing
  */
 class AnsiTermColorer {
        function __construct() {
@@ -56,6 +58,8 @@ class AnsiTermColorer {
 
 /**
  * A colour-less terminal
+ *
+ * @ingroup Maintenance Testing
  */
 class DummyTermColorer {
        public function color( $color ) {
index 877f136..ba1d8cd 100644 (file)
@@ -40,7 +40,6 @@ require_once( __DIR__ . '/Maintenance.php' );
  * @ingroup Maintenance
  */
 class UpdateMediaWiki extends Maintenance {
-
        function __construct() {
                parent::__construct();
                $this->mDescription = "MediaWiki database updater";
@@ -48,6 +47,8 @@ class UpdateMediaWiki extends Maintenance {
                $this->addOption( 'quick', 'Skip 5 second countdown before starting' );
                $this->addOption( 'doshared', 'Also update shared tables' );
                $this->addOption( 'nopurge', 'Do not purge the objectcache table after updates' );
+               $this->addOption( 'noschema', 'Only do the updates that are not done during schema updates' );
+               $this->addOption( 'schema', 'Output SQL to do the schema updates instead of doing them.  Works even when $wgAllowSchemaUpdates is false', false, true );
                $this->addOption( 'force', 'Override when $wgAllowSchemaUpdates disables this script' );
        }
 
@@ -83,10 +84,24 @@ class UpdateMediaWiki extends Maintenance {
        function execute() {
                global $wgVersion, $wgTitle, $wgLang, $wgAllowSchemaUpdates;
 
-               if( !$wgAllowSchemaUpdates && !$this->hasOption( 'force' ) ) {
+               if( !$wgAllowSchemaUpdates && !( $this->hasOption( 'force' ) || $this->hasOption( 'schema' ) || $this->hasOption( 'noschema' ) ) ) {
                        $this->error( "Do not run update.php on this wiki. If you're seeing this you should\n"
-                               . "probably ask for some help in performing your schema updates.\n\n"
-                               . "If you know what you are doing, you can continue with --force", true );
+                               . "probably ask for some help in performing your schema updates or use\n"
+                               . "the --noschema and --schema options to get an SQL file for someone\n"
+                               . "else to inspect and run.\n\n"
+                               . "If you know what you are doing, you can continue with --force\n", true );
+               }
+
+               $this->fileHandle = null;
+               if( substr( $this->getOption( 'schema' ), 0, 2 ) === "--" ) {
+                       $this->error( "The --schema option requires a file as an argument.\n", true );
+               } else if( $this->hasOption( 'schema' ) ) {
+                       $file = $this->getOption( 'schema' );
+                       $this->fileHandle = fopen( $file, "w" );
+                       if( $this->fileHandle === false ) {
+                               $err = error_get_last();
+                               $this->error( "Problem opening the schema file for writing: $file\n\t{$err['message']}", true );
+                       }
                }
 
                $wgLang = Language::factory( 'en' );
@@ -108,6 +123,9 @@ class UpdateMediaWiki extends Maintenance {
                $db = wfGetDB( DB_MASTER );
 
                $this->output( "Going to run database updates for " . wfWikiID() . "\n" );
+               if( $db->getType() === 'sqlite' ) {
+                       $this->output( "Using SQLite file: '{$db->mDatabaseFile}'\n" );
+               }
                $this->output( "Depending on the size of your database this may take a while!\n" );
 
                if ( !$this->hasOption( 'quick' ) ) {
@@ -117,21 +135,40 @@ class UpdateMediaWiki extends Maintenance {
 
                $shared = $this->hasOption( 'doshared' );
 
-               $updates = array( 'core', 'extensions', 'stats' );
-               if( !$this->hasOption('nopurge') ) {
-                       $updates[] = 'purge';
+               $updates = array( 'core', 'extensions' );
+               if( !$this->hasOption('schema') ) {
+                       if( $this->hasOption('noschema') ) {
+                               $updates[] = 'noschema';
+                       }
+                       $updates[] = 'stats';
+
+                       if( !$this->hasOption('nopurge') ) {
+                               $updates[] = 'purge';
+                       }
                }
 
                $updater = DatabaseUpdater::newForDb( $db, $shared, $this );
                $updater->doUpdates( $updates );
 
                foreach( $updater->getPostDatabaseUpdateMaintenance() as $maint ) {
-                       if ( $updater->updateRowExists( $maint ) ) {
+                       $child = $this->runChild( $maint );
+
+                       // LoggedUpdateMaintenance is checking the updatelog itself
+                       $isLoggedUpdate = ( $child instanceof LoggedUpdateMaintenance );
+
+                       if ( !$isLoggedUpdate && $updater->updateRowExists( $maint ) ) {
                                continue;
                        }
+
                        $child = $this->runChild( $maint );
                        $child->execute();
-                       $updater->insertUpdateRow( $maint );
+                       if ( !$isLoggedUpdate ) {
+                               $updater->insertUpdateRow( $maint );
+                       }
+               }
+
+               if( !$this->hasOption('nopurge') ) {
+                       $updater->purgeCache();
                }
 
                $this->output( "\nDone.\n" );
index b732508..04a2d47 100644 (file)
@@ -38,7 +38,7 @@ 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 $sizeHistogram = array();
 
        public function __construct() {
                parent::__construct();
index 2a71e7e..ac78484 100644 (file)
@@ -96,9 +96,9 @@ class UpdateSearchIndex extends Maintenance {
                $end = $dbw->timestamp( $end );
 
                $page = $dbw->tableName( 'page' );
-               $sql = "SELECT rc_cur_id,rc_type,rc_moved_to_ns,rc_moved_to_title FROM $recentchanges
+               $sql = "SELECT rc_cur_id FROM $recentchanges
                  JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
-                 WHERE rc_timestamp BETWEEN '$start' AND '$end'
+                 WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'
                  ";
                $res = $dbw->query( $sql, __METHOD__ );
 
@@ -108,17 +108,7 @@ class UpdateSearchIndex extends Maintenance {
        }
 
        public function searchIndexUpdateCallback( $dbw, $row ) {
-               if ( $row->rc_type == RC_MOVE || $row->rc_type == RC_MOVE_OVER_REDIRECT ) {
-                       # Rename searchindex entry
-                       $titleObj = Title::makeTitle( $row->rc_moved_to_ns, $row->rc_moved_to_title );
-                       $title = $titleObj->getPrefixedDBkey();
-                       $this->output( "$title..." );
-                       $u = new SearchUpdate( $row->rc_cur_id, $title, false );
-                       $u->doUpdate();
-                       $this->output( "\n" );
-               } elseif ( $row->rc_type !== RC_LOG ) {
-                       $this->updateSearchIndexForPage( $dbw, $row->rc_cur_id );
-               }
+               $this->updateSearchIndexForPage( $dbw, $row->rc_cur_id );
        }
 }
 
index 3f1a90b..f92f67a 100644 (file)
@@ -47,10 +47,10 @@ class UpdateSpecialPages extends Maintenance {
                                $this->error( "Uncallable function $call!" );
                                continue;
                        }
+                       $this->output( sprintf( '%-30s ', $special ) );
                        $t1 = explode( ' ', microtime() );
                        call_user_func( $call, $dbw );
                        $t2 = explode( ' ', microtime() );
-                       $this->output( sprintf( '%-30s ', $special ) );
                        $elapsed = ( $t2[0] - $t1[0] ) + ( $t2[1] - $t1[1] );
                        $hours = intval( $elapsed / 3600 );
                        $minutes = intval( $elapsed % 3600 / 60 );
index 065d187..2823210 100644 (file)
@@ -2,6 +2,21 @@
 /**
  * New version of MediaWiki web-based config/installation
  *
+ * This program is free software; you can redistribute it and/or modify
+ * 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
  */
 
index 8e6ceda..8e9c368 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Version of mw-config/index.php to used in web server requiring .php5
+ * extension to execute scripts with PHP5 egine.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 define('MW_INSTALL_PHP5_EXT', 1);
 require './index.php';
index ae98295..d3d85bb 100644 (file)
@@ -5,6 +5,23 @@
  * Altering it is preferred over changing anything in /includes.
  *
  * Note: this file doesn't gets included from a global scope, don't use globals directly.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * 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
  */
 
 /*
index 16d09ea..58bd351 100644 (file)
@@ -21,4 +21,4 @@
  * @file
  */
 
-require './opensearch_desc.php'; 
+require './opensearch_desc.php';
index bbd5fc8..4787594 100644 (file)
@@ -38,58 +38,127 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) {
 header( 'Content-Type: text/html; charset=utf-8' );
 
 ?>
+<!DOCTYPE html>
 <html>
 <head>
+<meta charset="UTF-8">
 <title>Profiling data</title>
-<style type="text/css">
-       th {
-               text-align: left;
-               border-bottom: solid 1px black;
+<style>
+       /* noc.wikimedia.org/base.css */
+
+       * {
+               margin: 0;
+               padding: 0;
        }
 
-       th, td {
-               padding-left: 0.5em;
-               padding-right: 0.5em;
+       body {
+               padding: 0.5em 1em;
+               background: #fff;
+               font: 14px/1.6 sans-serif;
+               color: #333;
        }
 
-       td.timep, td.memoryp, td.count, td.cpr, td.tpc, td.mpc, td.tpr, td.mpr {
-               text-align: right;
+       p, ul, ol, table {
+               margin: 0.5em 0;
        }
-       td.timep, td.tpc, td.tpr {
-               background-color: #ffff80;
+
+       a {
+               color: #0645AD;
+               text-decoration: none;
        }
-       td.memoryp, td.mpc, td.mpr {
-               background-color: #80f8ff;
+
+       a:hover {
+               text-decoration: underline;
        }
-       td.count, td,cpr {
-               background-color: #80ff80;
+
+       /*!
+        * Bootstrap v2.1.1
+        *
+        * Copyright 2012 Twitter, Inc
+        * Licensed under the Apache License v2.0
+        * http://www.apache.org/licenses/LICENSE-2.0
+        *
+        * Designed and built with all the love in the world @twitter by @mdo and @fat.
+        */
+
+       table {
+               max-width: 100%;
+               background-color: transparent;
+               border-collapse: collapse;
+               border-spacing: 0;
        }
-       td.name {
-               background-color: #89f9f9;
+
+       .table {
+               width: 100%;
+               margin-bottom: 20px;
+       }
+
+       .table th,
+       .table td {
+               padding: 0.1em;
+               text-align: left;
+               vertical-align: top;
+               border-top: 1px solid #ddd;
        }
 
-       tr:hover {
+       .table th {
                font-weight: bold;
        }
+
+       .table thead th {
+               vertical-align: bottom;
+       }
+
+       .table thead:first-child tr:first-child th,
+       .table thead:first-child tr:first-child td {
+               border-top: 0;
+       }
+
+       .table tbody + tbody {
+               border-top: 2px solid #ddd;
+       }
+
+       .table-condensed th,
+       .table-condensed td {
+               padding: 4px 5px;
+       }
+
+       .table-striped tbody tr:nth-child(odd) td,
+       .table-striped tbody tr:nth-child(odd) th {
+               background-color: #f9f9f9;
+       }
+
+       .table-hover tbody tr:hover td,
+       .table-hover tbody tr:hover th {
+               background-color: #f5f5f5;
+       }
+
+       hr {
+               margin: 20px 0;
+               border: 0;
+               border-top: 1px solid #eee;
+               border-bottom: 1px solid #fff;
+       }
+
 </style>
 </head>
 <body>
 <?php
 
 if ( !$wgEnableProfileInfo ) {
-       echo "<p>Disabled</p>\n";
-       echo "</body></html>";
+       echo '<p>Disabled</p>'
+               . '</body></html>';
        exit( 1 );
 }
 
 $dbr = wfGetDB( DB_SLAVE );
 
 if( !$dbr->tableExists( 'profiling' ) ) {
-       echo "<p>No 'profiling' table exists, so we can't show you anything.</p>\n";
-       echo "<p>If you want to log profiling data, create the table using "
-               . "<tt>maintenance/archives/patch-profiling.sql</tt> and enable "
-               . "<tt>\$wgProfileToDatabase</tt>.</p>\n";
-       echo "</body></html>";
+       echo '<p>No <code>profiling</code> table exists, so we can\'t show you anything.</p>'
+               . '<p>If you want to log profiling data, enable <code>$wgProfileToDatabase</code>'
+               . ' in your LocalSettings.php and run <code>maintenance/update.php</code> to'
+               . ' create the profiling table.'
+               . '</body></html>';
        exit( 1 );
 }
 
@@ -123,10 +192,12 @@ class profile_point {
 
                $ex = isset( $expand[$this->name()] );
 
+               $anchor = str_replace( '"', '', $this->name() );
+
                if ( !$ex ) {
                        if ( count( $this->children ) ) {
                                $url = getEscapedProfileUrl( false, false, $expand + array( $this->name() => true ) );
-                               $extet = " <a href=\"$url\">[+]</a>";
+                               $extet = " <a id=\"{$anchor}\" href=\"{$url}#{$anchor}\">[+]</a>";
                        } else {
                                $extet = '';
                        }
@@ -137,22 +208,22 @@ class profile_point {
                                        $e += array( $name => $ep );
                                }
                        }
-
-                       $extet = " <a href=\"" . getEscapedProfileUrl( false, false, $e ) . "\">[–]</a>";
+                       $url = getEscapedProfileUrl( false, false, $e );
+                       $extet = " <a id=\"{$anchor}\" href=\"{$url}#{$anchor}\">[–]</a>";
                }
                ?>
                <tr>
-               <td class="name" style="padding-left: <?php echo $indent ?>em;">
+               <th><div style="margin-left: <?php echo (int)$indent; ?>em;">
                        <?php echo htmlspecialchars( $this->name() ) . $extet ?>
-               </td>
-               <td class="timep"><?php echo @wfPercent( $this->time() / self::$totaltime * 100 ) ?></td>
-               <td class="memoryp"><?php echo @wfPercent( $this->memory() / self::$totalmemory * 100 ) ?></td>
-               <td class="count"><?php echo $this->count() ?></td>
-               <td class="cpr"><?php echo round( sprintf( '%.2f', $this->callsPerRequest() ), 2 ) ?></td>
-               <td class="tpc"><?php echo round( sprintf( '%.2f', $this->timePerCall() ), 2 ) ?></td>
-               <td class="mpc"><?php echo round( sprintf( '%.2f' ,$this->memoryPerCall() / 1024 ), 2 ) ?></td>
-               <td class="tpr"><?php echo @round( sprintf( '%.2f', $this->time() / self::$totalcount ), 2 ) ?></td>
-               <td class="mpr"><?php echo @round( sprintf( '%.2f' ,$this->memory() / self::$totalcount / 1024 ), 2 ) ?></td>
+               </div></th>
+               <td class="mw-profileinfo-timep"><?php echo @wfPercent( $this->time() / self::$totaltime * 100 ); ?></td>
+               <td class="mw-profileinfo-memoryp"><?php echo @wfPercent( $this->memory() / self::$totalmemory * 100 ); ?></td>
+               <td class="mw-profileinfo-count"><?php echo $this->count(); ?></td>
+               <td class="mw-profileinfo-cpr"><?php echo round( sprintf( '%.2f', $this->callsPerRequest() ), 2 ); ?></td>
+               <td class="mw-profileinfo-tpc"><?php echo round( sprintf( '%.2f', $this->timePerCall() ), 2 ); ?></td>
+               <td class="mw-profileinfo-mpc"><?php echo round( sprintf( '%.2f' ,$this->memoryPerCall() / 1024 ), 2 ); ?></td>
+               <td class="mw-profileinfo-tpr"><?php echo @round( sprintf( '%.2f', $this->time() / self::$totalcount ), 2 ); ?></td>
+               <td class="mw-profileinfo-mpr"><?php echo @round( sprintf( '%.2f' ,$this->memory() / self::$totalcount / 1024 ), 2 ); ?></td>
                </tr>
                <?php
                if ( $ex ) {
@@ -173,56 +244,56 @@ class profile_point {
        function time() {
                return $this->time;
        }
-       
+
        function memory() {
                return $this->memory;
        }
-       
+
        function timePerCall() {
                return @( $this->time / $this->count );
        }
-       
+
        function memoryPerCall() {
                return @( $this->memory / $this->count );
        }
-       
+
        function callsPerRequest() {
                return @( $this->count / self::$totalcount );
        }
-       
+
        function timePerRequest() {
                return @( $this->time / self::$totalcount );
        }
-       
+
        function memoryPerRequest() {
                return @( $this->memory / self::$totalcount );
        }
 
        function fmttime() {
-               return sprintf( "%5.02f", $this->time );
+               return sprintf( '%5.02f', $this->time );
        }
 };
 
 function compare_point(profile_point $a, profile_point $b) {
        global $sort;
        switch ( $sort ) {
-       case "name":
+       case 'name':
                return strcmp( $a->name(), $b->name() );
-       case "time":
+       case 'time':
                return $a->time() > $b->time() ? -1 : 1;
-       case "memory":
+       case 'memory':
                return $a->memory() > $b->memory() ? -1 : 1;
-       case "count":
+       case 'count':
                return $a->count() > $b->count() ? -1 : 1;
-       case "time_per_call":
+       case 'time_per_call':
                return $a->timePerCall() > $b->timePerCall() ? -1 : 1;
-       case "memory_per_call":
+       case 'memory_per_call':
                return $a->memoryPerCall() > $b->memoryPerCall() ? -1 : 1;
-       case "calls_per_req":
+       case 'calls_per_req':
                return $a->callsPerRequest() > $b->callsPerRequest() ? -1 : 1;
-       case "time_per_req":
+       case 'time_per_req':
                return $a->timePerRequest() > $b->timePerRequest() ? -1 : 1;
-       case "memory_per_req":
+       case 'memory_per_req':
                return $a->memoryPerRequest() > $b->memoryPerRequest() ? -1 : 1;
        }
 }
@@ -243,25 +314,28 @@ else
 ?>
 <form method="get" action="profileinfo.php">
 <p>
-<input type="text" name="filter" value="<?php echo htmlspecialchars($filter)?>"/>
-<input type="hidden" name="sort" value="<?php echo htmlspecialchars($sort)?>"/>
-<input type="hidden" name="expand" value="<?php echo htmlspecialchars(implode(",", array_keys($expand)))?>"/>
-<input type="submit" value="Filter" />
+<input type="text" name="filter" value="<?php echo htmlspecialchars($filter); ?>">
+<input type="hidden" name="sort" value="<?php echo htmlspecialchars($sort); ?>">
+<input type="hidden" name="expand" value="<?php echo htmlspecialchars(implode(",", array_keys($expand))); ?>">
+<input type="submit" value="Filter">
 </p>
 </form>
 
-<table cellspacing="0" border="1">
-<tr id="top">
-<th><a href="<?php echo getEscapedProfileUrl( false, 'name' ) ?>">Name</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'time' ) ?>">Time (%)</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'memory' ) ?>">Memory (%)</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'count' ) ?>">Count</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'calls_per_req' ) ?>">Calls/req</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_call' ) ?>">ms/call</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_call' ) ?>">kb/call</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_req' ) ?>">ms/req</a></th>
-<th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_req' ) ?>">kb/req</a></th>
-</tr>
+<table class="mw-profileinfo-table table table-striped table-hover">
+       <thead>
+               <tr>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'name' ); ?>">Name</a></th>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'time' ); ?>">Time (%)</a></th>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'memory' ); ?>">Memory (%)</a></th>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'count' ); ?>">Count</a></th>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'calls_per_req' ); ?>">Calls/req</a></th>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_call' ); ?>">ms/call</a></th>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_call' ); ?>">kb/call</a></th>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_req' ); ?>">ms/req</a></th>
+                       <th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_req' ); ?>">kb/req</a></th>
+               </tr>
+       </thead>
+       <tbody>
 <?php
 profile_point::$totaltime = 0.0;
 profile_point::$totalcount = 0;
@@ -274,11 +348,11 @@ function getEscapedProfileUrl( $_filter = false, $_sort = false, $_expand = fals
                $_expand = $expand;
 
        return htmlspecialchars(
-               '?' . 
+               '?' .
                wfArrayToCGI( array(
                        'filter' => $_filter ? $_filter : $filter,
                        'sort' => $_sort ? $_sort : $sort,
-                       'expand' => implode( ',', array_keys( $_expand ) ) 
+                       'expand' => implode( ',', array_keys( $_expand ) )
                ) )
        );
 }
@@ -296,13 +370,13 @@ foreach( $res as $o ) {
                profile_point::$totalmemory = $next->memory();
        }
        if ( $last !== false ) {
-               if ( preg_match( "/^".preg_quote( $last->name(), "/" )."/", $next->name() ) ) {
+               if ( preg_match( '/^'.preg_quote( $last->name(), '/' ).'/', $next->name() ) ) {
                        $last->add_child($next);
                        continue;
                }
        }
        $last = $next;
-       if ( preg_match( "/^query: /", $next->name() ) || preg_match( "/^query-m: /", $next->name() ) ) {
+       if ( preg_match( '/^query: /', $next->name() ) || preg_match( '/^query-m: /', $next->name() ) ) {
                $sqltotal += $next->time();
                $queries[] = $next;
        } else {
@@ -310,12 +384,12 @@ foreach( $res as $o ) {
        }
 }
 
-$s = new profile_point( "SQL Queries", 0, $sqltotal, 0, 0 );
+$s = new profile_point( 'SQL Queries', 0, $sqltotal, 0, 0 );
 foreach ( $queries as $q )
        $s->add_child($q);
 $points[] = $s;
 
-usort( $points, "compare_point" );
+usort( $points, 'compare_point' );
 
 foreach ( $points as $point ) {
        if ( strlen( $filter ) && !strstr( $point->name(), $filter ) )
@@ -324,9 +398,11 @@ foreach ( $points as $point ) {
        $point->display( $expand );
 }
 ?>
+       </tbody>
 </table>
-
-<p>Total time: <tt><?php printf("%5.02f", profile_point::$totaltime) ?></tt></p>
-<p>Total memory: <tt><?php printf("%5.02f", profile_point::$totalmemory / 1024 ) ?></tt></p>
+<hr>
+<p>Total time: <code><?php printf('%5.02f', profile_point::$totaltime); ?></code></p>
+<p>Total memory: <code><?php printf('%5.02f', profile_point::$totalmemory / 1024 ); ?></code></p>
+<hr>
 </body>
 </html>
index a0761fc..80b9a76 100644 (file)
@@ -1,4 +1,24 @@
 <?php
+/**
+ * Definition of core ResourceLoader modules.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * 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
+ */
 
 return array(
 
@@ -88,6 +108,7 @@ return array(
        'jquery' => array(
                'scripts' => 'resources/jquery/jquery.js',
                'debugRaw' => false,
+               'targets' => array( 'desktop', 'mobile' ),
        ),
 
        /* jQuery Plugins */
@@ -125,6 +146,7 @@ return array(
        ),
        'jquery.collapsibleTabs' => array(
                'scripts' => 'resources/jquery/jquery.collapsibleTabs.js',
+               'dependencies' => 'jquery.delayedBind',
        ),
        'jquery.color' => array(
                'scripts' => 'resources/jquery/jquery.color.js',
@@ -158,6 +180,10 @@ return array(
        'jquery.getAttrs' => array(
                'scripts' => 'resources/jquery/jquery.getAttrs.js',
        ),
+       'jquery.hidpi' => array(
+               'scripts' => 'resources/jquery/jquery.hidpi.js',
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'jquery.highlightText' => array(
                'scripts' => 'resources/jquery/jquery.highlightText.js',
                'dependencies' => 'jquery.mwExtension',
@@ -526,6 +552,7 @@ return array(
                'scripts' => 'resources/mediawiki/mediawiki.js',
                'debugScripts' => 'resources/mediawiki/mediawiki.log.js',
                'debugRaw' => false,
+               'targets' => array( 'desktop', 'mobile' ),
        ),
        'mediawiki.api' => array(
                'scripts' => 'resources/mediawiki.api/mediawiki.api.js',
@@ -601,6 +628,13 @@ return array(
                        'feedback-bugnew',
                ),
        ),
+       'mediawiki.hidpi' => array(
+               'scripts' => 'resources/mediawiki/mediawiki.hidpi.js',
+               'dependencies' => array(
+                       'jquery.hidpi',
+               ),
+               'targets' => array( 'desktop', 'mobile' ),
+       ),
        'mediawiki.htmlform' => array(
                'scripts' => 'resources/mediawiki/mediawiki.htmlform.js',
        ),
@@ -614,6 +648,19 @@ return array(
        'mediawiki.notify' => array(
                'scripts' => 'resources/mediawiki/mediawiki.notify.js',
        ),
+       'mediawiki.searchSuggest' => array(
+               'scripts' => 'resources/mediawiki/mediawiki.searchSuggest.js',
+               'messages' => array(
+                       'searchsuggest-search',
+                       'searchsuggest-containing',
+               ),
+               'dependencies' => array(
+                       'jquery.autoEllipsis',
+                       'jquery.client',
+                       'jquery.placeholder',
+                       'jquery.suggestions',
+               ),
+       ),
        'mediawiki.Title' => array(
                'scripts' => 'resources/mediawiki/mediawiki.Title.js',
                'dependencies' => 'mediawiki.util',
@@ -652,6 +699,13 @@ return array(
                ),
                'position' => 'top',
        ),
+       'mediawiki.action.edit.preview' => array(
+               'scripts' => 'resources/mediawiki.action/mediawiki.action.edit.preview.js',
+               'dependencies' => array(
+                       'jquery.form',
+                       'jquery.spinner',
+               ),
+       ),
        'mediawiki.action.history' => array(
                'scripts' => 'resources/mediawiki.action/mediawiki.action.history.js',
                'group' => 'mediawiki.action.history',
@@ -756,6 +810,23 @@ return array(
                ),
                'position' => 'top',
        ),
+       'mediawiki.page.patrol.ajax' => array(
+               'scripts' => 'resources/mediawiki.page/mediawiki.page.patrol.ajax.js',
+               'dependencies' => array(
+                       'mediawiki.page.startup',
+                       'mediawiki.api',
+                       'mediawiki.util',
+                       'mediawiki.Title',
+                       'mediawiki.notify',
+                       'jquery.spinner',
+                       'user.tokens'
+               ),
+               'messages' => array(
+                       'markedaspatrollednotify',
+                       'markedaspatrollederrornotify',
+                       'markedaspatrollederror-noautopatrol'
+               ),
+       ),
        'mediawiki.page.watch.ajax' => array(
                'scripts' => 'resources/mediawiki.page/mediawiki.page.watch.ajax.js',
                'dependencies' => array(
@@ -894,22 +965,6 @@ return array(
                'localBasePath' => $GLOBALS['wgStyleDirectory'],
                'dependencies' => 'mediawiki.legacy.wikibits',
        ),
-       'mediawiki.legacy.mwsuggest' => array(
-               'scripts' => 'common/mwsuggest.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-               'dependencies' => 'mediawiki.legacy.wikibits',
-               'messages' => array( 'search-mwsuggest-enabled', 'search-mwsuggest-disabled' ),
-       ),
-       'mediawiki.legacy.preview' => array(
-               'scripts' => 'common/preview.js',
-               'remoteBasePath' => $GLOBALS['wgStylePath'],
-               'localBasePath' => $GLOBALS['wgStyleDirectory'],
-               'dependencies' => array(
-                       'mediawiki.legacy.wikibits',
-                       'jquery.form',
-               )
-       ),
        'mediawiki.legacy.protect' => array(
                'scripts' => 'common/protect.js',
                'remoteBasePath' => $GLOBALS['wgStylePath'],
index 1e99769..ac25bbd 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Blind 1.8.23
+ * jQuery UI Effects Blind 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 7927a4a..1169d77 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Bounce 1.8.23
+ * jQuery UI Effects Bounce 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index d8b8218..edd51a6 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Clip 1.8.23
+ * jQuery UI Effects Clip 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 91ac575..7fd946f 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects 1.8.23
+ * jQuery UI Effects 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -307,7 +307,7 @@ $.fn.extend({
 /******************************************************************************/
 
 $.extend($.effects, {
-       version: "1.8.23",
+       version: "1.8.24",
 
        // Saves a set of properties in a data storage
        save: function(element, set) {
index 6d25bd3..97e5abd 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Drop 1.8.23
+ * jQuery UI Effects Drop 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 1caeca8..f63e47a 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Explode 1.8.23
+ * jQuery UI Effects Explode 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 6124979..7aa37b1 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Fade 1.8.23
+ * jQuery UI Effects Fade 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 81b15b8..06cc553 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Fold 1.8.23
+ * jQuery UI Effects Fold 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index dee0639..ad9e7bd 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Highlight 1.8.23
+ * jQuery UI Effects Highlight 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 45cdc88..d730bee 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Pulsate 1.8.23
+ * jQuery UI Effects Pulsate 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 44ecee1..52d1871 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Scale 1.8.23
+ * jQuery UI Effects Scale 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index bc1fd19..44b8ea4 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Shake 1.8.23
+ * jQuery UI Effects Shake 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 0a43027..502e6c9 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Slide 1.8.23
+ * jQuery UI Effects Slide 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 64f2a17..4ee4ae8 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Transfer 1.8.23
+ * jQuery UI Effects Transfer 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 6c4883f..83f2825 100644 (file)
@@ -8,8 +8,8 @@ jQuery(function($){
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
-               monthNamesShort: ['一','二','三','四','五','六',
-               '七','八','九','十','十一','十二'],
+               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
                dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
                dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
                dayNamesMin: ['日','一','二','三','四','五','六'],
index 06c4c62..11189d3 100644 (file)
@@ -8,8 +8,8 @@ jQuery(function($){
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
-               monthNamesShort: ['一','二','三','四','五','六',
-               '七','八','九','十','十一','十二'],
+               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
                dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
                dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
                dayNamesMin: ['日','一','二','三','四','五','六'],
index dd51e35..089498b 100644 (file)
@@ -8,8 +8,8 @@ jQuery(function($){
                currentText: '今天',
                monthNames: ['一月','二月','三月','四月','五月','六月',
                '七月','八月','九月','十月','十一月','十二月'],
-               monthNamesShort: ['一','二','三','四','五','六',
-               '七','八','九','十','十一','十二'],
+               monthNamesShort: ['一月','二月','三月','四月','五月','六月',
+               '七月','八月','九月','十月','十一月','十二月'],
                dayNames: ['星期日','星期一','星期二','星期三','星期四','星期五','星期六'],
                dayNamesShort: ['周日','周一','周二','周三','周四','周五','周六'],
                dayNamesMin: ['日','一','二','三','四','五','六'],
index b3340e0..dc1ba60 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Accordion 1.8.23
+ * jQuery UI Accordion 1.8.24
  *
  * 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.23",
+       version: "1.8.24",
        animations: {
                slide: function( options, additions ) {
                        options = $.extend({
index b634cce..8d69be2 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Autocomplete 1.8.23
+ * jQuery UI Autocomplete 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index db2637e..8326262 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Button 1.8.23
+ * jQuery UI Button 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 1285a6d..b36c1ac 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI 1.8.23
+ * jQuery UI 1.8.24
  *
  * 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.23",
+       version: "1.8.24",
 
        keyCode: {
                ALT: 18,
index 7ea5b07..1fcea12 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Datepicker 1.8.23
+ * jQuery UI Datepicker 1.8.24
  *
  * 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.23" } });
+$.extend($.ui, { datepicker: { version: "1.8.24" } });
 
 var PROP_NAME = 'datepicker';
 var dpuuid = new Date().getTime();
@@ -1845,7 +1845,7 @@ $.fn.datepicker = function(options){
 $.datepicker = new Datepicker(); // singleton instance
 $.datepicker.initialized = false;
 $.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.8.23";
+$.datepicker.version = "1.8.24";
 
 // Workaround for #4055
 // Add another global to avoid noConflict issues with inline event handlers
index 082bf2c..06b85f2 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Dialog 1.8.23
+ * jQuery UI Dialog 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -690,7 +690,7 @@ $.widget("ui.dialog", {
 });
 
 $.extend($.ui.dialog, {
-       version: "1.8.23",
+       version: "1.8.24",
 
        uuid: 0,
        maxZ: 0,
index 6da1aaf..149035c 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Draggable 1.8.23
+ * jQuery UI Draggable 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -237,11 +237,10 @@ $.widget("ui.draggable", $.ui.mouse, {
        },
        
        _mouseUp: function(event) {
-               if (this.options.iframeFix === true) {
-                       $("div.ui-draggable-iframeFix").each(function() { 
-                               this.parentNode.removeChild(this); 
-                       }); //Remove frame helpers
-               }
+               //Remove frame helpers
+               $("div.ui-draggable-iframeFix").each(function() { 
+                       this.parentNode.removeChild(this); 
+               });
                
                //If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
                if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
@@ -513,7 +512,7 @@ $.widget("ui.draggable", $.ui.mouse, {
 });
 
 $.extend($.ui.draggable, {
-       version: "1.8.23"
+       version: "1.8.24"
 });
 
 $.ui.plugin.add("draggable", "connectToSortable", {
index 4b98b3a..f17c222 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Droppable 1.8.23
+ * jQuery UI Droppable 1.8.24
  *
  * 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.23"
+       version: "1.8.24"
 });
 
 $.ui.intersect = function(draggable, droppable, toleranceMode) {
@@ -260,7 +260,12 @@ $.ui.ddmanager = {
 
                        var parentInstance;
                        if (this.options.greedy) {
-                               var parent = this.element.parents(':data(droppable):eq(0)');
+                               // find droppable parents with same scope
+                               var scope = this.options.scope;
+                               var parent = this.element.parents(':data(droppable)').filter(function () {
+                                       return $.data(this, 'droppable').options.scope === scope;
+                               });
+
                                if (parent.length) {
                                        parentInstance = $.data(parent[0], 'droppable');
                                        parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
index e051055..52a1786 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Mouse 1.8.23
+ * jQuery UI Mouse 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 03f2606..8b20179 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Position 1.8.23
+ * jQuery UI Position 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c1d9f3c..7cea1ba 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Progressbar 1.8.23
+ * jQuery UI Progressbar 1.8.24
  *
  * 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.23"
+       version: "1.8.24"
 });
 
 })( jQuery );
index f6ce694..6cc6f41 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Resizable 1.8.23
+ * jQuery UI Resizable 1.8.24
  *
  * 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.23"
+       version: "1.8.24"
 });
 
 /*
index ac5bf04..44c6e8c 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Selectable 1.8.23
+ * jQuery UI Selectable 1.8.24
  *
  * 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.23"
+       version: "1.8.24"
 });
 
 })(jQuery);
index 5ea589e..c554e78 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Slider 1.8.23
+ * jQuery UI Slider 1.8.24
  *
  * 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.23"
+       version: "1.8.24"
 });
 
 }(jQuery));
index 1d87f65..9e0cac6 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Sortable 1.8.23
+ * jQuery UI Sortable 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
@@ -296,7 +296,16 @@ $.widget("ui.sortable", $.ui.mouse, {
                        var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
                        if (!intersection) continue;
 
-                       if(itemElement != this.currentItem[0] //cannot intersect with itself
+                       // Only put the placeholder inside the current Container, skip all
+                       // items form other containers. This works because when moving
+                       // an item from one container to another the
+                       // currentContainer is switched before the placeholder is moved.
+                       //
+                       // Without this moving items in "sub-sortables" can cause the placeholder to jitter
+                       // beetween the outer and inner container.
+                       if (item.instance !== this.currentContainer) continue;
+
+                       if (itemElement != this.currentItem[0] //cannot intersect with itself
                                &&      this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
                                &&      !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
                                && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
@@ -1003,15 +1012,16 @@ $.widget("ui.sortable", $.ui.mouse, {
 
                if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
                if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
-               if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
-                       if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
-                       for (var i = this.containers.length - 1; i >= 0; i--){
-                               if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
-                                       delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
-                                       delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
-                               }
-                       };
-               };
+
+               // Check if the items Container has Changed and trigger appropriate
+               // events.
+               if (this !== this.currentContainer) {
+                       if(!noPropagation) {
+                               delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
+                               delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
+                               delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
+                       }
+               }
 
                //Post events to containers
                for (var i = this.containers.length - 1; i >= 0; i--){
@@ -1078,7 +1088,7 @@ $.widget("ui.sortable", $.ui.mouse, {
 });
 
 $.extend($.ui.sortable, {
-       version: "1.8.23"
+       version: "1.8.24"
 });
 
 })(jQuery);
index de453cc..0c47f0e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Tabs 1.8.23
+ * jQuery UI Tabs 1.8.24
  *
  * 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.23"
+       version: "1.8.24"
 });
 
 /*
index befdcc2..66ef013 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Widget 1.8.23
+ * jQuery UI Widget 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 1ce7d5e..cd8f971 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Accordion 1.8.23
+ * jQuery UI Accordion 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index a9817ce..c7eaff2 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Autocomplete 1.8.23
+ * jQuery UI Autocomplete 1.8.24
  *
  * 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.23
+ * jQuery UI Menu 1.8.24
  *
  * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c1f2600..0dc9857 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Button 1.8.23
+ * jQuery UI Button 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c24627e..8b953a2 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI CSS Framework 1.8.23
+ * jQuery UI CSS Framework 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 0282eee..37d3a98 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Datepicker 1.8.23
+ * jQuery UI Datepicker 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index ba50ba5..04515f4 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Dialog 1.8.23
+ * jQuery UI Dialog 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index c775a33..90bf308 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Progressbar 1.8.23
+ * jQuery UI Progressbar 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 420c4af..d17873e 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Resizable 1.8.23
+ * jQuery UI Resizable 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 3320274..9850ee7 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Selectable 1.8.23
+ * jQuery UI Selectable 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 650ad7e..fbfe665 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Slider 1.8.23
+ * jQuery UI Slider 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 64ac9bf..f0bee7a 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Tabs 1.8.23
+ * jQuery UI Tabs 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 536c8e0..b7d2f61 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI CSS Framework 1.8.23
+ * jQuery UI CSS Framework 1.8.24
  *
  * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
  * Dual licensed under the MIT or GPL Version 2 licenses.
index 04bb301..49a932a 100644 (file)
@@ -1,14 +1,15 @@
 /**
- * Plugin that automatically truncates the plain text contents of an element and adds an ellipsis
+ * Plugin that automatically truncates the plain text contents of an element
+ * and adds an ellipsis.
  */
 ( function ( $ ) {
 
 var
        // Cache ellipsed substrings for every string-width-position combination
-       cache = { },
+       cache = {},
 
        // Use a separate cache when match highlighting is enabled
-       matchTextCache = { };
+       matchTextCache = {};
 
 $.fn.autoEllipsis = function ( options ) {
        options = $.extend( {
@@ -18,30 +19,30 @@ $.fn.autoEllipsis = function ( options ) {
                hasSpan: false,
                matchText: null
        }, options );
-       $(this).each( function () {
-               var $container, $trimmableText,
+
+       return this.each( function () {
+               var $trimmableText,
                        text, trimmableText, w, pw,
                        l, r, i, side, m,
-                       $el = $(this);
+                       // container element - used for measuring against
+                       $container = $(this);
+
                if ( options.restoreText ) {
-                       if ( !$el.data( 'autoEllipsis.originalText' ) ) {
-                               $el.data( 'autoEllipsis.originalText', $el.text() );
+                       if ( !$container.data( 'autoEllipsis.originalText' ) ) {
+                               $container.data( 'autoEllipsis.originalText', $container.text() );
                        } else {
-                               $el.text( $el.data( 'autoEllipsis.originalText' ) );
+                               $container.text( $container.data( 'autoEllipsis.originalText' ) );
                        }
                }
 
-               // container element - used for measuring against
-               $container = $el;
-
                // trimmable text element - only the text within this element will be trimmed
                if ( options.hasSpan ) {
-                       $trimmableText = $el.children( options.selector );
+                       $trimmableText = $container.children( options.selector );
                } else {
                        $trimmableText = $( '<span>' )
                                .css( 'whiteSpace', 'nowrap' )
-                               .text( $el.text() );
-                       $el
+                               .text( $container.text() );
+                       $container
                                .empty()
                                .append( $trimmableText );
                }
index 92e7255..7dd2198 100644 (file)
@@ -1,29 +1,23 @@
 .mw-badge {
-       min-width: 8px;
-       height: 14px;
-       border: 1px solid white;
-       -moz-border-radius: 8px;
-       -webkit-border-radius: 8px;
-       border-radius: 8px;
+       min-width: 7px;
+       -moz-border-radius: 2px;
+       -webkit-border-radius: 2px;
+       border-radius: 2px;
        -moz-box-shadow: 0px 1px 4px #ccc;
        -webkit-box-shadow: 0px 1px 4px #ccc;
        box-shadow: 0px 1px 4px #ccc;
-       background-color: #b60a00;
-       background-image: -o-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
-       background-image: -moz-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
-       background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #a70802), color-stop(1, #cf0e00));
-       background-image: -webkit-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
-       background-image: -ms-linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
-       background-image: linear-gradient(bottom, #a70802 0%, #cf0e00 100%);
+       background-color: #cc0000;
        padding: 0 3px;
        text-align: center;
+       font-size: 12px;
+       line-height: 12px;
 }
 
 .mw-badge-content {
-       font-size: 12px;
-       line-height: 14px;
+       font-weight: bold;
        color: white;
-       vertical-align: top;
+       vertical-align: baseline;
+       text-shadow: 0 1px rgba(0, 0, 0, 0.4);
 }
 
 .mw-badge-inline {
index 04495b7..c8073d1 100644 (file)
@@ -1,8 +1,6 @@
 /**
  * jQuery Badge plugin
  *
- * Based on Badger plugin by Daniel Raftery (http://thrivingkings.com/badger).
- *
  * @license MIT
  */
 
  * This program is distributed WITHOUT ANY WARRANTY.
  */
 ( function ( $ ) {
-
        /**
-        * Allows you to put a numeric "badge" on an item on the page.
+        * Allows you to put a "badge" on an item on the page. The badge container
+        * will be appended to the selected element(s).
         * See mediawiki.org/wiki/ResourceLoader/Default_modules#jQuery.badge
         *
-        * @param {string|number} badgeCount An explicit number, or "+n"/ "-n"
-        *  to modify the existing value. If the new value is equal or lower than 0,
-        *  any existing badge will be removed. The badge container will be appended
-        *  to the selected element(s).
-        * @param {Object} options Optional parameters specified below
-        *   type: 'inline' or 'overlay' (default)
-        *   callback: will be called with the number now shown on the badge as a parameter
+        * @param text The value to display in the badge. If the value is falsey (0,
+        *   null, false, '', etc.), any existing badge will be removed.
+        * @param boolean inline True if the badge should be displayed inline, false
+        *   if the badge should overlay the parent element (default is inline)
         */
-       $.fn.badge = function ( badgeCount, options ) {
-               var $badge,
-                       oldBadgeCount,
-                       newBadgeCount,
-                       $existingBadge = this.find( '.mw-badge' );
-
-               options = $.extend( { type : 'overlay' }, options );
-
-               // If there is no existing badge, this will give an empty string
-               oldBadgeCount = Number( $existingBadge.text() );
-               if ( isNaN( oldBadgeCount ) ) {
-                       oldBadgeCount = 0;
-               }
+       $.fn.badge = function ( text, inline ) {
+               var $badge = this.find( '.mw-badge' );
 
-               // If badgeCount is a number, use that as the new badge
-               if ( typeof badgeCount === 'number' ) {
-                       newBadgeCount = badgeCount;
-               } else if ( typeof badgeCount === 'string' ) {
-                       // If badgeCount is "+x", add x to the old badge
-                       if ( badgeCount.charAt(0) === '+' ) {
-                               newBadgeCount = oldBadgeCount + Number( badgeCount.substr(1) );
-                       // If badgeCount is "-x", subtract x from the old badge
-                       } else if ( badgeCount.charAt(0) === '-' ) {
-                               newBadgeCount = oldBadgeCount - Number( badgeCount.substr(1) );
-                       // If badgeCount can be converted into a number, convert it
-                       } else if ( !isNaN( Number( badgeCount ) ) ) {
-                               newBadgeCount = Number( badgeCount );
+               if ( text ) {
+                       // If a badge already exists, reuse it
+                       if ( $badge.length ) {
+                               $badge.find( '.mw-badge-content' ).text( text );
                        } else {
-                               newBadgeCount = 0;
+                               // Otherwise, create a new badge with the specified text and style
+                               $badge = $( '<div class="mw-badge mw-badge-' + ( inline ? 'inline' : 'overlay' ) + '"></div>' )
+                                       .append( $( '<span class="mw-badge-content"></span>' ).text ( text ) )
+                                       .appendTo( this );
                        }
-               // Other types are not supported, fall back to 0.
-               } else {
-                       newBadgeCount = 0;
-               }
-
-               // Badge count must be a whole number
-               newBadgeCount = Math.round( newBadgeCount );
-
-               if ( newBadgeCount <= 0 ) {
-                       // Badges should only exist for values > 0.
-                       $existingBadge.remove();
                } else {
-                       // Don't add duplicates
-                       if ( $existingBadge.length ) {
-                               $badge = $existingBadge;
-                               // Insert the new count into the badge
-                               this.find( '.mw-badge-content' ).text( newBadgeCount );
-                       } else {
-                               // Contruct a new badge with the count
-                               $badge = $( '<div>' )
-                                       .addClass( 'mw-badge' )
-                                       .append(
-                                               $( '<span>' )
-                                                       .addClass( 'mw-badge-content' )
-                                                       .text( newBadgeCount )
-                                       );
-                               this.append( $badge );
-                       }
-
-                       if ( options.type === 'inline' ) {
-                               $badge
-                                       .removeClass( 'mw-badge-overlay' )
-                                       .addClass( 'mw-badge-inline' );
-                       // Default: overlay
-                       } else {
-                               $badge
-                                       .removeClass( 'mw-badge-inline' )
-                                       .addClass( 'mw-badge-overlay' );
-
-                       }
-
-                       // If a callback was specified, call it with the badge count
-                       if ( $.isFunction( options.callback ) ) {
-                               options.callback( newBadgeCount );
-                       }
+                       $badge.remove();
                }
+               return this;
        };
 }( jQuery ) );
index 484651e..f2b98f0 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * jQuery byteLimit plugin
+ * jQuery byteLimit plugin.
  *
  * @author Jan Paul Posma, 2011
  * @author Timo Tijhof, 2011-2012
 ( function ( $ ) {
 
        /**
-        * Enforces a byte limit to a textbox, so that UTF-8 entries are counted as well, when, for example,
-        * a database field has a byte limit rather than a character limit.
-        * Plugin rationale: Browser has native maxlength for number of characters, this plugin exists to
-        * limit number of bytes instead.
+        * Utility function to trim down a string, based on byteLimit
+        * and given a safe start position. It supports insertion anywhere
+        * in the string, so "foo" to "fobaro" if limit is 4 will result in
+        * "fobo", not "foba". Basically emulating the native maxlength by
+        * reconstructing where the insertion occured.
         *
-        * Can be called with a custom limit (to use that limit instead of the maxlength attribute value),
-        * a filter function (in case the limit should apply to something other than the exact input value),
-        * or both. Order of arguments is important!
+        * @param {string} safeVal Known value that was previously returned by this
+        * function, if none, pass empty string.
+        * @param {string} newVal New value that may have to be trimmed down.
+        * @param {number} byteLimit Number of bytes the value may be in size.
+        * @param {Function} fn [optional] See $.fn.byteLimit.
+        * @return {Object} Object with:
+        *  - {string} newVal
+        *  - {boolean} trimmed
+        */
+       function trimValForByteLength( safeVal, newVal, byteLimit, fn ) {
+               var startMatches, endMatches, matchesLen, inpParts,
+                       oldVal = safeVal;
+
+               // Run the hook if one was provided, but only on the length
+               // assessment. The value itself is not to be affected by the hook.
+               if ( $.byteLength( fn ? fn( newVal ) : newVal ) <= byteLimit ) {
+                       // Limit was not reached, just remember the new value
+                       // and let the user continue.
+                       return {
+                               newVal: newVal,
+                               trimmed: false
+                       };
+               }
+
+               // Current input is longer than the active limit.
+               // Figure out what was added and limit the addition.
+               startMatches = 0;
+               endMatches = 0;
+
+               // It is important that we keep the search within the range of
+               // the shortest string's length.
+               // Imagine a user adds text that matches the end of the old value
+               // (e.g. "foo" -> "foofoo"). startMatches would be 3, but without
+               // limiting both searches to the shortest length, endMatches would
+               // also be 3.
+               matchesLen = Math.min( newVal.length, oldVal.length );
+
+               // Count same characters from the left, first.
+               // (if "foo" -> "foofoo", assume addition was at the end).
+               while (
+                       startMatches < matchesLen &&
+                       oldVal.charAt( startMatches ) === newVal.charAt( startMatches )
+               ) {
+                       startMatches += 1;
+               }
+
+               while (
+                       endMatches < ( matchesLen - startMatches ) &&
+                       oldVal.charAt( oldVal.length - 1 - endMatches ) === newVal.charAt( newVal.length - 1 - endMatches )
+               ) {
+                       endMatches += 1;
+               }
+
+               inpParts = [
+                       // Same start
+                       newVal.substring( 0, startMatches ),
+                       // Inserted content
+                       newVal.substring( startMatches, newVal.length - endMatches ),
+                       // Same end
+                       newVal.substring( newVal.length - endMatches )
+               ];
+
+               // Chop off characters from the end of the "inserted content" string
+               // until the limit is statisfied.
+               if ( fn ) {
+                       while ( $.byteLength( fn( inpParts.join( '' ) ) ) > byteLimit ) {
+                               inpParts[1] = inpParts[1].slice( 0, -1 );
+                       }
+               } else {
+                       while ( $.byteLength( inpParts.join( '' ) ) > byteLimit ) {
+                               inpParts[1] = inpParts[1].slice( 0, -1 );
+                       }
+               }
+
+               newVal = inpParts.join( '' );
+
+               return {
+                       newVal: newVal,
+                       trimmed: true
+               };
+       }
+
+       var eventKeys = [
+               'keyup.byteLimit',
+               'keydown.byteLimit',
+               'change.byteLimit',
+               'mouseup.byteLimit',
+               'cut.byteLimit',
+               'paste.byteLimit',
+               'focus.byteLimit',
+               'blur.byteLimit'
+       ].join( ' ' );
+
+       /**
+        * Enforces a byte limit on an input field, so that UTF-8 entries are counted as well,
+        * when, for example, a database field has a byte limit rather than a character limit.
+        * Plugin rationale: Browser has native maxlength for number of characters, this plugin
+        * exists to limit number of bytes instead.
+        *
+        * Can be called with a custom limit (to use that limit instead of the maxlength attribute
+        * value), a filter function (in case the limit should apply to something other than the
+        * exact input value), or both. Order of parameters is important!
         *
         * @context {jQuery} Instance of jQuery for one or more input elements
-        * @param limit {Number} [optional] Limit to enforce, fallsback to maxLength-attribute,
-        * called with fetched value as argument.
-        * @param fn {Function} [optional] Function to call on the input string before assessing the length
+        * @param {Number} limit [optional] Limit to enforce, fallsback to maxLength-attribute,
+        *  called with fetched value as argument.
+        * @param {Function} fn [optional] Function to call on the string before assessing the length.
         * @return {jQuery} The context
         */
        $.fn.byteLimit = function ( limit, fn ) {
                if ( $.isFunction( limit ) ) {
                        fn = limit;
                        limit = undefined;
+               // Either way, verify it is a function so we don't have to call
+               // isFunction again after this.
+               } else if ( !fn || !$.isFunction( fn ) ) {
+                       fn = undefined;
                }
 
-               // The following is specific to each element in the collection
+               // The following is specific to each element in the collection.
                return this.each( function ( i, el ) {
-                       var $el, elLimit;
+                       var $el, elLimit, prevSafeVal;
 
                        $el = $( el );
 
-                       // Default limit to current attribute value
+                       // If no limit was passed to byteLimit(), use the maxlength value.
                        // Can't re-use 'limit' variable because it's in the higher scope
-                       // that affects the next each() iteration as well.
-                       elLimit = limit === undefined ? $el.prop( 'maxLength' ) : limit;
-       
+                       // that would affect the next each() iteration as well.
+                       // Note that we use attribute to read the value instead of property,
+                       // because in Chrome the maxLength property by default returns the
+                       // highest supported value (no indication that it is being enforced
+                       // by choice). We don't want to bind all of this for some ridiculously
+                       // high default number, unless it was explicitly set in the HTML.
+                       // Also cast to a (primitive) number (most commonly because the maxlength
+                       // attribute contains a string, but theoretically the limit parameter
+                       // could be something else as well).
+                       elLimit = Number( limit === undefined ? $el.attr( '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.
                                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").
-                       // Usually this isn't a problem since browsers ignore maxLength when setting
-                       // the value property through JavaScript, but Safari 4 violates that rule, so
-                       // we have to remove or not set the property if we have a callback.
-                       if ( fn === undefined ) {
-                               $el.prop( 'maxLength', elLimit );
+                       if ( fn ) {
+                               // Save function for reference
+                               $el.data( 'byteLimit.callback', fn );
+                       }
+
+                       // Remove old event handlers (if there are any)
+                       $el.off( '.byteLimit' );
+
+                       if ( fn ) {
+                               // Disable the native maxLength (if there is any), because it interferes
+                               // with the (differently calculated) byte limit.
+                               // Aside from being differently calculated (average chars with byteLimit
+                               // is lower), we also support a callback which can make it to allow longer
+                               // values (e.g. count "Foo" from "User:Foo").
+                               // maxLength is a strange property. Removing or setting the property to
+                               // undefined directly doesn't work. Instead, it can only be unset internally
+                               // by the browser when removing the associated attribute (Firefox/Chrome).
+                               // http://code.google.com/p/chromium/issues/detail?id=136004
+                               $el.removeAttr( 'maxlength' );
+
                        } else {
-                               $el.removeProp( 'maxLength' );
+                               // If we don't have a callback the bytelimit can only be lower than the charlimit
+                               // (that is, there are no characters less than 1 byte in size). So lets (re-)enforce
+                               // the native limit for efficiency when possible (it will make the while-loop below
+                               // faster by there being less left to interate over).
+                               $el.attr( 'maxlength', elLimit );
                        }
-       
-                       // Save function for reference
-                       $el.data( 'byteLimitCallback', fn );
-       
-                       // We've got something, go for it:
-                       $el.keypress( function ( e ) {
-                               var val, len, charLen;
-                               // First check to see if this is actually a character key
-                               // being pressed.
-                               // Based on key-event info from http://unixpapa.com/js/key.html
-                               // jQuery should also normalize e.which to be consistent cross-browser,
-                               // however the same check is still needed regardless of jQuery.
-       
-                               // Note: At the moment, for some older opera versions (~< 10.5)
-                               // some special keys won't be recognized (aka left arrow key).
-                               // Backspace will be, so not big issue.
-       
-                               if ( e.which === 0 || e.charCode === 0 || e.which === 8 ||
-                                       e.ctrlKey || e.altKey || e.metaKey )
-                               {
-                                       // A special key (backspace, etc) so don't interfere
-                                       return true;
-                               }
-       
-                               val = fn !== undefined ? fn( $( this ).val() ): $( this ).val();
-                               len = $.byteLength( val );
-                               // Note that keypress returns a character code point, not a keycode.
-                               // However, this may not be super reliable depending on how keys come in...
-                               charLen = $.byteLength( String.fromCharCode( e.which ) );
-       
-                               if ( ( len + charLen ) > elLimit ) {
-                                       e.preventDefault();
+
+
+                       // Safe base value, used to determine the path between the previous state
+                       // and the state that triggered the event handler below - and enforce the
+                       // limit approppiately (e.g. don't chop from the end if text was inserted
+                       // at the beginning of the string).
+                       prevSafeVal = '';
+
+                       // We need to listen to after the change has already happened because we've
+                       // learned that trying to guess the new value and canceling the event
+                       // accordingly doesn't work because the new value is not always as simple as:
+                       // oldValue + String.fromCharCode( e.which ); because of cut, paste, select-drag
+                       // replacements, and custom input methods and what not.
+                       // Even though we only trim input after it was changed (never prevent it), we do
+                       // listen on events that input text, because there are cases where the text has
+                       // changed while text is being entered and keyup/change will not be fired yet
+                       // (such as holding down a single key, fires keydown, and after each keydown,
+                       // we can trim the previous one).
+                       // See http://www.w3.org/TR/DOM-Level-3-Events/#events-keyboard-event-order for
+                       // the order and characteristics of the key events.
+                       $el.on( eventKeys, function () {
+                               var res = trimValForByteLength(
+                                       prevSafeVal,
+                                       this.value,
+                                       elLimit,
+                                       fn
+                               );
+
+                               // Only set value property if it was trimmed, because whenever the
+                               // value property is set, the browser needs to re-initiate the text context,
+                               // which moves the cursor at the end the input, moving it away from wherever it was.
+                               // This is a side-effect of limiting after the fact.
+                               if ( res.trimmed === true ) {
+                                       this.value = res.newVal;
                                }
-                       });
-               });
+                               // Always adjust prevSafeVal to reflect the input value. Not doing this could cause
+                               // trimValForByteLength to compare the new value to an empty string instead of the
+                               // old value, resulting in trimming always from the end (bug 40850).
+                               prevSafeVal = res.newVal;
+                       } );
+               } );
        };
 }( jQuery ) );
index 1990dc0..aced063 100644 (file)
@@ -1,14 +1,16 @@
 /**
  * jQuery checkboxShiftClick
  *
- * This will enable checkboxes to be checked or unchecked in a row by clicking one, holding shift and clicking another one
+ * This will enable checkboxes to be checked or unchecked in a row by clicking one,
+ * holding shift and clicking another one.
  *
- * @author Krinkle <krinklemail@gmail.com>
+ * @author Timo Tijhof, 2011 - 2012
  * @license GPL v2
  */
 ( function ( $ ) {
-       $.fn.checkboxShiftClick = function ( text ) {
-               var prevCheckbox = null, $box = this;
+       $.fn.checkboxShiftClick = function () {
+               var prevCheckbox = null,
+                       $box = this;
                // When our boxes are clicked..
                $box.click( function ( e ) {
                        // And one has been clicked before...
index 24f8959..b35dbbb 100644 (file)
                        // Use the cached version if possible
                        if ( profileCache[nav.userAgent] === undefined ) {
 
-                               /* Configuration */
-
-                               // Name of browsers or layout engines we don't recognize
-                               var uk = 'unknown';
-                               // Generic version digit
-                               var x = 'x';
-                               // Strings found in user agent strings that need to be conformed
-                               var wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'];
-                               // Translations for conforming user agent strings
-                               var userAgentTranslations = [
-                                       // Tons of browsers lie about being something they are not
-                                       [/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
-                                       // Chrome lives in the shadow of Safari still
-                                       ['Chrome Safari', 'Chrome'],
-                                       // KHTML is the layout engine not the browser - LIES!
-                                       ['KHTML', 'Konqueror'],
-                                       // Firefox nightly builds
-                                       ['Minefield', 'Firefox'],
-                                       // This helps keep differnt versions consistent
-                                       ['Navigator', 'Netscape'],
-                                       // This prevents version extraction issues, otherwise translation would happen later
-                                       ['PLAYSTATION 3', 'PS3']
-                               ];
-                               // Strings which precede a version number in a user agent string - combined and used as match 1 in
-                               // version detectection
-                               var versionPrefixes = [
-                                       'camino', 'chrome', 'firefox', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
-                                       'lynx', 'msie', 'safari', 'ps3'
-                               ];
-                               // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
-                               var versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)';
-                               // Names of known browsers
-                               var names = [
-                                       'camino', 'chrome', 'firefox', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
-                                       'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq'
-                               ];
-                               // Tanslations for conforming browser names
-                               var nameTranslations = [];
-                               // Names of known layout engines
-                               var layouts = ['gecko', 'konqueror', 'msie', 'opera', 'webkit'];
-                               // Translations for conforming layout names
-                               var layoutTranslations = [['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto']];
-                               // Names of supported layout engines for version number
-                               var layoutVersions = ['applewebkit', 'gecko'];
-                               // Names of known operating systems
-                               var platforms = ['win', 'mac', 'linux', 'sunos', 'solaris', 'iphone'];
-                               // Translations for conforming operating system names
-                               var platformTranslations = [['sunos', 'solaris']];
-
-                               /* Methods */
-
-                               /**
-                                * Performs multiple replacements on a string
-                                */
-                               var translate = function ( source, translations ) {
-                                       var i;
-                                       for ( i = 0; i < translations.length; i++ ) {
-                                               source = source.replace( translations[i][0], translations[i][1] );
-                                       }
-                                       return source;
-                               };
-
-                               /* Pre-processing */
-
-                               var     ua = nav.userAgent,
+                               var
+                                       versionNumber,
+
+                                       /* Configuration */
+
+                                       // Name of browsers or layout engines we don't recognize
+                                       uk = 'unknown',
+                                       // Generic version digit
+                                       x = 'x',
+                                       // Strings found in user agent strings that need to be conformed
+                                       wildUserAgents = ['Opera', 'Navigator', 'Minefield', 'KHTML', 'Chrome', 'PLAYSTATION 3'],
+                                       // Translations for conforming user agent strings
+                                       userAgentTranslations = [
+                                               // Tons of browsers lie about being something they are not
+                                               [/(Firefox|MSIE|KHTML,\slike\sGecko|Konqueror)/, ''],
+                                               // Chrome lives in the shadow of Safari still
+                                               ['Chrome Safari', 'Chrome'],
+                                               // KHTML is the layout engine not the browser - LIES!
+                                               ['KHTML', 'Konqueror'],
+                                               // Firefox nightly builds
+                                               ['Minefield', 'Firefox'],
+                                               // This helps keep differnt versions consistent
+                                               ['Navigator', 'Netscape'],
+                                               // This prevents version extraction issues, otherwise translation would happen later
+                                               ['PLAYSTATION 3', 'PS3']
+                                       ],
+                                       // Strings which precede a version number in a user agent string - combined and used as match 1 in
+                                       // version detectection
+                                       versionPrefixes = [
+                                               'camino', 'chrome', 'firefox', 'netscape', 'netscape6', 'opera', 'version', 'konqueror',
+                                               'lynx', 'msie', 'safari', 'ps3'
+                                       ],
+                                       // Used as matches 2, 3 and 4 in version extraction - 3 is used as actual version number
+                                       versionSuffix = '(\\/|\\;?\\s|)([a-z0-9\\.\\+]*?)(\\;|dev|rel|\\)|\\s|$)',
+                                       // Names of known browsers
+                                       names = [
+                                               'camino', 'chrome', 'firefox', 'netscape', 'konqueror', 'lynx', 'msie', 'opera',
+                                               'safari', 'ipod', 'iphone', 'blackberry', 'ps3', 'rekonq'
+                                       ],
+                                       // Tanslations for conforming browser names
+                                       nameTranslations = [],
+                                       // Names of known layout engines
+                                       layouts = ['gecko', 'konqueror', 'msie', 'opera', 'webkit'],
+                                       // Translations for conforming layout names
+                                       layoutTranslations = [ ['konqueror', 'khtml'], ['msie', 'trident'], ['opera', 'presto'] ],
+                                       // Names of supported layout engines for version number
+                                       layoutVersions = ['applewebkit', 'gecko'],
+                                       // Names of known operating systems
+                                       platforms = ['win', 'mac', 'linux', 'sunos', 'solaris', 'iphone'],
+                                       // Translations for conforming operating system names
+                                       platformTranslations = [ ['sunos', 'solaris'] ],
+
+                                       /* Methods */
+
+                                       /**
+                                        * Performs multiple replacements on a string
+                                        */
+                                       translate = function ( source, translations ) {
+                                               var i;
+                                               for ( i = 0; i < translations.length; i++ ) {
+                                                       source = source.replace( translations[i][0], translations[i][1] );
+                                               }
+                                               return source;
+                                       },
+
+                                       /* Pre-processing */
+
+                                       ua = nav.userAgent,
                                        match,
                                        name = uk,
                                        layout = uk,
                                if ( name === 'opera' && version >= 9.8) {
                                        version = ua.match( /version\/([0-9\.]*)/i )[1] || 10;
                                }
-                               var versionNumber = parseFloat( version, 10 ) || 0.0;
+                               versionNumber = parseFloat( version, 10 ) || 0.0;
 
                                /* Caching */
 
                 * @return Boolean true if browser known or assumed to be supported, false if blacklisted
                 */
                test: function ( map, profile ) {
-                       /*jshint evil:true */
+                       /*jshint evil: true */
 
                        var conditions, dir, i, op, val;
                        profile = $.isPlainObject( profile ) ? profile : $.client.profile();
index cb25796..9b8f8fc 100644 (file)
                        }
                        return $settings;
                },
-               handleResize: function ( e ) {
+               /**
+                * @param {jQuery.Event} e
+                */
+               handleResize: function () {
                        $.collapsibleTabs.instances.each( function () {
                                var $el = $( this ),
                                        data = $.collapsibleTabs.getSettings( $el );
index c1fe7fe..9c6f9ec 100644 (file)
                 * @return      Array                   The HSL representation
                 */
                rgbToHsl: function ( R, G, B ) {
-                       var r = R / 255,
+                       var d,
+                               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;
+                               b = B / 255,
+                               max = Math.max( r, g, b ), min = Math.min( r, g, b ),
+                               h,
+                               s,
+                               l = (max + min) / 2;
 
                        if ( max === min ) {
                                // achromatic
                                h = s = 0;
                        } else {
-                               var d = max - min;
+                               d = max - min;
                                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
                                switch ( max ) {
                                        case r:
                 * @return      Array                   The RGB representation
                 */
                hslToRgb: function ( h, s, l ) {
-                       var r, g, b;
+                       var r, g, b, hue2rgb, q, p;
 
                        if ( s === 0 ) {
                                r = g = b = l; // achromatic
                        } else {
-                               var hue2rgb = function ( p, q, t ) {
+                               hue2rgb = function ( p, q, t ) {
                                        if ( t < 0 ) {
                                                t += 1;
                                        }
                                        return p;
                                };
 
-                               var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
-                               var p = 2 * l - q;
+                               q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+                               p = 2 * l - q;
                                r = hue2rgb( p, q, h + 1/3 );
                                g = hue2rgb( p, q, h );
                                b = hue2rgb( p, q, h - 1/3 );
index 063f260..9e532e5 100644 (file)
                                context = {
                                        config: {
                                                // callback function for before collapse
-                                               beforeCondense: function ( context ) {},
+                                               beforeCondense: function () {},
 
                                                // callback function for before expand
-                                               beforeExpand: function ( context ) {},
+                                               beforeExpand: function () {},
 
                                                // callback function for after collapse
-                                               afterCondense: function ( context ) {},
+                                               afterCondense: function () {},
 
                                                // callback function for after expand
-                                               afterExpand: function ( context ) {},
+                                               afterExpand: function () {},
 
                                                // Whether the field should expand to the left or the right -- defaults to left
                                                expandToLeft: true
diff --git a/resources/jquery/jquery.hidpi.js b/resources/jquery/jquery.hidpi.js
new file mode 100644 (file)
index 0000000..70bfc4e
--- /dev/null
@@ -0,0 +1,117 @@
+/**
+ * Responsive images based on 'srcset' and 'window.devicePixelRatio' emulation where needed.
+ *
+ * Call $().hidpi() on a document or part of a document to replace image srcs in that section.
+ *
+ * $.devicePixelRatio() can be used to supplement window.devicePixelRatio with support on
+ * some additional browsers.
+ */
+( function ( $ ) {
+
+/**
+ * Detect reported or approximate device pixel ratio.
+ * 1.0 means 1 CSS pixel is 1 hardware pixel
+ * 2.0 means 1 CSS pixel is 2 hardware pixels
+ * etc
+ *
+ * Uses window.devicePixelRatio if available, or CSS media queries on IE.
+ *
+ * @method
+ * @returns {number} Device pixel ratio
+ */
+$.devicePixelRatio = function () {
+       if ( window.devicePixelRatio !== undefined ) {
+               // Most web browsers:
+               // * WebKit (Safari, Chrome, Android browser, etc)
+               // * Opera
+               // * Firefox 18+
+               return window.devicePixelRatio;
+       } else if ( window.msMatchMedia !== undefined ) {
+               // Windows 8 desktops / tablets, probably Windows Phone 8
+               //
+               // IE 10 doesn't report pixel ratio directly, but we can get the
+               // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
+               // simplicity, but you may get different values depending on zoom
+               // factor, size of screen and orientation in Metro IE.
+               if ( window.msMatchMedia( '(min-resolution: 192dpi)' ).matches ) {
+                       return 2;
+               } else if ( window.msMatchMedia( '(min-resolution: 144dpi)' ).matches ) {
+                       return 1.5;
+               } else {
+                       return 1;
+               }
+       } else {
+               // Legacy browsers...
+               // Assume 1 if unknown.
+               return 1;
+       }
+};
+
+/**
+ * Implement responsive images based on srcset attributes, if browser has no
+ * native srcset support.
+ *
+ * @method
+ * @returns {jQuery} This selection
+ */
+$.fn.hidpi = function () {
+       var $target = this,
+               // @todo add support for dpi media query checks on Firefox, IE
+               devicePixelRatio = $.devicePixelRatio(),
+               testImage = new Image();
+
+       if ( devicePixelRatio > 1 && testImage.srcset === undefined ) {
+               // No native srcset support.
+               $target.find( 'img' ).each( function () {
+                       var $img = $( this ),
+                               srcset = $img.attr( 'srcset' ),
+                               match;
+                       if ( typeof srcset === 'string' && srcset !== '' ) {
+                               match = $.matchSrcSet( devicePixelRatio, srcset );
+                               if (match !== null ) {
+                                       $img.attr( 'src', match );
+                               }
+                       }
+               });
+       }
+
+       return $target;
+};
+
+/**
+ * Match a srcset entry for the given device pixel ratio
+ *
+ * @param {number} devicePixelRatio
+ * @param {string} srcset
+ * @return {mixed} null or the matching src string
+ *
+ * Exposed for testing.
+ */
+$.matchSrcSet = function ( devicePixelRatio, srcset ) {
+       var candidates,
+               candidate,
+               bits,
+               src,
+               i,
+               ratioStr,
+               ratio,
+               selectedRatio = 1,
+               selectedSrc = null;
+       candidates = srcset.split( / *, */ );
+       for ( i = 0; i < candidates.length; i++ ) {
+               candidate = candidates[i];
+               bits = candidate.split( / +/ );
+               src = bits[0];
+               if ( bits.length > 1 && bits[1].charAt( bits[1].length - 1 ) === 'x' ) {
+                       ratioStr = bits[1].substr( 0, bits[1].length - 1 );
+                       ratio = parseFloat( ratioStr );
+                       if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
+                               selectedRatio = ratio;
+                               selectedSrc = src;
+                       }
+               }
+       }
+       return selectedSrc;
+};
+
+}( jQuery ) );
index 0844da7..cda2765 100644 (file)
@@ -29,7 +29,7 @@
                                // 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
-                               match = node.data.match( new RegExp( "(^|\\s)" + $.escapeRE( pat ), "i" ) );
+                               match = node.data.match( new RegExp( '(^|\\s)' + $.escapeRE( pat ), 'i' ) );
                                if ( match ) {
                                        pos = match.index + match[1].length; // include length of any matched spaces
                                        // create the span wrapper for the matched text
@@ -58,7 +58,7 @@
        };
 
        $.fn.highlightText = function ( matchString ) {
-               return $( this ).each( function () {
+               return this.each( function () {
                        var $el = $( this );
                        $el.data( 'highlightText', { originalText: $el.text() } );
                        $.highlightText.splitAndHighlight( this, matchString );
index 973ef3d..a86bf79 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v1.8.1
+ * jQuery JavaScript Library v1.8.3
  * http://jquery.com/
  *
  * Includes Sizzle.js
@@ -9,7 +9,7 @@
  * Released under the MIT license
  * http://jquery.org/license
  *
- * Date: Thu Aug 30 2012 17:17:22 GMT-0400 (Eastern Daylight Time)
+ * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time)
  */
 (function( window, undefined ) {
 var
@@ -186,7 +186,7 @@ jQuery.fn = jQuery.prototype = {
        selector: "",
 
        // The current version of jQuery being used
-       jquery: "1.8.1",
+       jquery: "1.8.3",
 
        // The default length of a jQuery object is 0
        length: 0,
@@ -573,7 +573,7 @@ jQuery.extend({
        },
 
        nodeName: function( elem, name ) {
-               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+               return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
        },
 
        // args is for internal usage only
@@ -630,7 +630,7 @@ jQuery.extend({
                function( text ) {
                        return text == null ?
                                "" :
-                               text.toString().replace( rtrim, "" );
+                               ( text + "" ).replace( rtrim, "" );
                },
 
        // results is for internal usage only
@@ -776,7 +776,7 @@ jQuery.extend({
                };
 
                // 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++;
+               proxy.guid = fn.guid = fn.guid || jQuery.guid++;
 
                return proxy;
        },
@@ -999,8 +999,10 @@ jQuery.Callbacks = function( options ) {
                                        (function add( args ) {
                                                jQuery.each( args, function( _, arg ) {
                                                        var type = jQuery.type( arg );
-                                                       if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
-                                                               list.push( arg );
+                                                       if ( type === "function" ) {
+                                                               if ( !options.unique || !self.has( arg ) ) {
+                                                                       list.push( arg );
+                                                               }
                                                        } else if ( arg && arg.length && type !== "string" ) {
                                                                // Inspect recursively
                                                                add( arg );
@@ -1143,7 +1145,7 @@ jQuery.extend({
                                // Get a promise for this deferred
                                // If obj is provided, the promise aspect is added to the object
                                promise: function( obj ) {
-                                       return typeof obj === "object" ? jQuery.extend( obj, promise ) : promise;
+                                       return obj != null ? jQuery.extend( obj, promise ) : promise;
                                }
                        },
                        deferred = {};
@@ -1253,24 +1255,23 @@ jQuery.support = (function() {
                clickFn,
                div = document.createElement("div");
 
-       // Preliminary tests
+       // Setup
        div.setAttribute( "className", "t" );
        div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
 
+       // Support tests won't run in some limited or non-browser environments
        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 ) {
+       if ( !all || !a || !all.length ) {
                return {};
        }
 
-       // First batch of supports tests
+       // First batch of tests
        select = document.createElement("select");
        opt = select.appendChild( document.createElement("option") );
        input = div.getElementsByTagName("input")[ 0 ];
 
+       a.style.cssText = "top:1px;float:left;opacity:.5";
        support = {
                // IE strips leading whitespace when .innerHTML is used
                leadingWhitespace: ( div.firstChild.nodeType === 3 ),
@@ -1312,7 +1313,7 @@ jQuery.support = (function() {
                // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
                getSetAttribute: div.className !== "t",
 
-               // Tests for enctype support on a form(#6743)
+               // Tests for enctype support on a form (#6743)
                enctype: !!document.createElement("form").enctype,
 
                // Makes sure cloning an html5 element does not cause problems
@@ -1513,7 +1514,7 @@ jQuery.extend({
 
        deletedIds: [],
 
-       // Please use with caution
+       // Remove at next major release (1.9/2.0)
        uuid: 0,
 
        // Unique for each copy of jQuery on the page
@@ -1565,7 +1566,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.deletedIds.pop() || ++jQuery.uuid;
+                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
                        } else {
                                id = internalKey;
                        }
@@ -1739,7 +1740,7 @@ jQuery.fn.extend({
                                        for ( l = attr.length; i < l; i++ ) {
                                                name = attr[i].name;
 
-                                               if ( name.indexOf( "data-" ) === 0 ) {
+                                               if ( !name.indexOf( "data-" ) ) {
                                                        name = jQuery.camelCase( name.substring(5) );
 
                                                        dataAttr( elem, name, data[ name ] );
@@ -2049,7 +2050,7 @@ jQuery.fn.extend({
                                                setClass = " " + elem.className + " ";
 
                                                for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                       if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+                                                       if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) {
                                                                setClass += classNames[ c ] + " ";
                                                        }
                                                }
@@ -2082,7 +2083,7 @@ jQuery.fn.extend({
                                        // 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 ) {
+                                               while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) {
                                                        className = className.replace( " " + removes[ c ] + " " , " " );
                                                }
                                        }
@@ -2136,7 +2137,7 @@ jQuery.fn.extend({
                        i = 0,
                        l = this.length;
                for ( ; i < l; i++ ) {
-                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
                                return true;
                        }
                }
@@ -2217,26 +2218,25 @@ jQuery.extend({
                },
                select: {
                        get: function( elem ) {
-                               var value, i, max, option,
-                                       index = elem.selectedIndex,
-                                       values = [],
+                               var value, option,
                                        options = elem.options,
-                                       one = elem.type === "select-one";
-
-                               // Nothing was selected
-                               if ( index < 0 ) {
-                                       return null;
-                               }
+                                       index = elem.selectedIndex,
+                                       one = elem.type === "select-one" || index < 0,
+                                       values = one ? null : [],
+                                       max = one ? index + 1 : options.length,
+                                       i = index < 0 ?
+                                               max :
+                                               one ? index : 0;
 
                                // Loop through all the selected options
-                               i = one ? index : 0;
-                               max = one ? index + 1 : options.length;
                                for ( ; i < max; i++ ) {
                                        option = options[ i ];
 
-                                       // Don't return options that are disabled or in a disabled optgroup
-                                       if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
-                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+                                       // oldIE doesn't update selected after form reset (#2551)
+                                       if ( ( option.selected || i === index ) &&
+                                                       // Don't return options that are disabled or in a disabled optgroup
+                                                       ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+                                                       ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
 
                                                // Get the specific value for the option
                                                value = jQuery( option ).val();
@@ -2251,11 +2251,6 @@ jQuery.extend({
                                        }
                                }
 
-                               // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
-                               if ( one && !values.length && options.length ) {
-                                       return jQuery( options[ index ] ).val();
-                               }
-
                                return values;
                        },
 
@@ -2314,7 +2309,7 @@ jQuery.extend({
                                return ret;
 
                        } else {
-                               elem.setAttribute( name, "" + value );
+                               elem.setAttribute( name, value + "" );
                                return value;
                        }
 
@@ -2578,7 +2573,7 @@ if ( !jQuery.support.style ) {
                        return elem.style.cssText.toLowerCase() || undefined;
                },
                set: function( elem, value ) {
-                       return ( elem.style.cssText = "" + value );
+                       return ( elem.style.cssText = value + "" );
                }
        };
 }
@@ -2711,6 +2706,7 @@ jQuery.event = {
                                handler: handler,
                                guid: handler.guid,
                                selector: selector,
+                               needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
                                namespace: namespaces.join(".")
                        }, handleObjIn );
 
@@ -2946,7 +2942,7 @@ jQuery.event = {
                        }
                        // Note that this is a bare JS function and not a jQuery handler
                        handle = ontype && cur[ ontype ];
-                       if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
                                event.preventDefault();
                        }
                }
@@ -2994,7 +2990,7 @@ jQuery.event = {
                var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
                        handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
                        delegateCount = handlers.delegateCount,
-                       args = [].slice.call( arguments ),
+                       args = core_slice.call( arguments ),
                        run_all = !event.exclusive && !event.namespace,
                        special = jQuery.event.special[ event.type ] || {},
                        handlerQueue = [];
@@ -3023,7 +3019,9 @@ jQuery.event = {
                                                sel = handleObj.selector;
 
                                                if ( selMatch[ sel ] === undefined ) {
-                                                       selMatch[ sel ] = jQuery( sel, this ).index( cur ) >= 0;
+                                                       selMatch[ sel ] = handleObj.needsContext ?
+                                                               jQuery( sel, this ).index( cur ) >= 0 :
+                                                               jQuery.find( sel, this, null, [ cur ] ).length;
                                                }
                                                if ( selMatch[ sel ] ) {
                                                        matches.push( handleObj );
@@ -3230,7 +3228,7 @@ jQuery.removeEvent = document.removeEventListener ?
 
                if ( elem.detachEvent ) {
 
-                       // #8545, #7054, preventing memory leaks for custom events in IE6-8 –
+                       // #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;
@@ -3593,7 +3591,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 ) {
@@ -3664,14 +3662,13 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
 });
 /*!\r
  * Sizzle CSS Selector Engine\r
- *  Copyright 2012 jQuery Foundation and other contributors\r
- *  Released under the MIT license\r
- *  http://sizzlejs.com/\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 dirruns,\r
-       cachedruns,\r
+var cachedruns,\r
        assertGetIdNotName,\r
        Expr,\r
        getText,\r
@@ -3680,21 +3677,36 @@ var dirruns,
        compile,\r
        sortOrder,\r
        hasDuplicate,\r
+       outermostContext,\r
 \r
        baseHasDuplicate = true,\r
        strundefined = "undefined",\r
 \r
        expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
 \r
+       Token = String,\r
        document = window.document,\r
        docElem = document.documentElement,\r
+       dirruns = 0,\r
        done = 0,\r
-       slice = [].slice,\r
+       pop = [].pop,\r
        push = [].push,\r
+       slice = [].slice,\r
+       // Use a stripped-down indexOf if a native one is unavailable\r
+       indexOf = [].indexOf || function( elem ) {\r
+               var i = 0,\r
+                       len = this.length;\r
+               for ( ; i < len; i++ ) {\r
+                       if ( this[i] === elem ) {\r
+                               return i;\r
+                       }\r
+               }\r
+               return -1;\r
+       },\r
 \r
        // Augment a function for special use by Sizzle\r
        markFunction = function( fn, value ) {\r
-               fn[ expando ] = value || true;\r
+               fn[ expando ] = value == null || value;\r
                return fn;\r
        },\r
 \r
@@ -3708,7 +3720,8 @@ var dirruns,
                                delete cache[ keys.shift() ];\r
                        }\r
 \r
-                       return (cache[ key ] = value);\r
+                       // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157)\r
+                       return (cache[ key + " " ] = value);\r
                }, cache );\r
        },\r
 \r
@@ -3741,7 +3754,8 @@ var dirruns,
        pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",\r
 \r
        // For matchExpr.POS and matchExpr.needsContext\r
-       pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\(((?:-\\d)?\\d*)\\)|)(?=[^-]|$)",\r
+       pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +\r
+               "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)",\r
 \r
        // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r
        rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),\r
@@ -3769,10 +3783,10 @@ var dirruns,
                "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),\r
                "ATTR": new RegExp( "^" + attributes ),\r
                "PSEUDO": new RegExp( "^" + pseudos ),\r
-               "CHILD": new RegExp( "^:(only|nth|last|first)-child(?:\\(" + whitespace +\r
+               "POS": new RegExp( pos, "i" ),\r
+               "CHILD": new RegExp( "^:(only|nth|first|last)-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
@@ -3854,7 +3868,8 @@ try {
        slice.call( docElem.childNodes, 0 )[0].nodeType;\r
 } catch ( e ) {\r
        slice = function( i ) {\r
-               var elem, results = [];\r
+               var elem,\r
+                       results = [];\r
                for ( ; (elem = this[i]); i++ ) {\r
                        results.push( elem );\r
                }\r
@@ -3868,14 +3883,14 @@ function Sizzle( selector, context, results, seed ) {
        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
+       if ( nodeType !== 1 && nodeType !== 9 ) {\r
+               return [];\r
+       }\r
+\r
        xml = isXML( context );\r
 \r
        if ( !xml && !seed ) {\r
@@ -3919,7 +3934,7 @@ function Sizzle( selector, context, results, seed ) {
        }\r
 \r
        // All others\r
-       return select( selector, context, results, seed, xml );\r
+       return select( selector.replace( rtrim, "$1" ), context, results, seed, xml );\r
 }\r
 \r
 Sizzle.matches = function( expr, elements ) {\r
@@ -3946,6 +3961,25 @@ function createButtonPseudo( type ) {
        };\r
 }\r
 \r
+// Returns a function to use in pseudos for positionals\r
+function createPositionalPseudo( fn ) {\r
+       return markFunction(function( argument ) {\r
+               argument = +argument;\r
+               return markFunction(function( seed, matches ) {\r
+                       var j,\r
+                               matchIndexes = fn( [], seed.length, argument ),\r
+                               i = matchIndexes.length;\r
+\r
+                       // Match elements found at the specified indexes\r
+                       while ( i-- ) {\r
+                               if ( seed[ (j = matchIndexes[i]) ] ) {\r
+                                       seed[j] = !(matches[j] = seed[j]);\r
+                               }\r
+                       }\r
+               });\r
+       });\r
+}\r
+\r
 /**\r
  * Utility function for retrieving the text value of an array of DOM nodes\r
  * @param {Array|Element} elem\r
@@ -3983,7 +4017,7 @@ getText = Sizzle.getText = function( elem ) {
        return ret;\r
 };\r
 \r
-isXML = Sizzle.isXML = function isXML( elem ) {\r
+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
@@ -4011,23 +4045,23 @@ contains = Sizzle.contains = docElem.contains ?
        };\r
 \r
 Sizzle.attr = function( elem, name ) {\r
-       var attr,\r
+       var val,\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
+       if ( (val = Expr.attrHandle[ name ]) ) {\r
+               return val( elem );\r
        }\r
-       if ( assertAttributes || xml ) {\r
+       if ( xml || assertAttributes ) {\r
                return elem.getAttribute( name );\r
        }\r
-       attr = elem.getAttributeNode( name );\r
-       return attr ?\r
+       val = elem.getAttributeNode( name );\r
+       return val ?\r
                typeof elem[ name ] === "boolean" ?\r
                        elem[ name ] ? name : null :\r
-                       attr.specified ? attr.value : null :\r
+                       val.specified ? val.value : null :\r
                null;\r
 };\r
 \r
@@ -4040,11 +4074,6 @@ Expr = Sizzle.selectors = {
 \r
        match: matchExpr,\r
 \r
-       order: new RegExp( "ID|TAG" +\r
-               (assertUsableName ? "|NAME" : "") +\r
-               (assertUsableClassName ? "|CLASS" : "")\r
-       ),\r
-\r
        // IE6/7 return a modified href\r
        attrHandle: assertHrefNotNormalized ?\r
                {} :\r
@@ -4105,13 +4134,13 @@ Expr = Sizzle.selectors = {
                                return results;\r
                        },\r
 \r
-               "NAME": function( tag, context ) {\r
+               "NAME": assertUsableName && function( tag, context ) {\r
                        if ( typeof context.getElementsByName !== strundefined ) {\r
                                return context.getElementsByName( name );\r
                        }\r
                },\r
 \r
-               "CLASS": function( className, context, xml ) {\r
+               "CLASS": assertUsableClassName && function( className, context, xml ) {\r
                        if ( typeof context.getElementsByClassName !== strundefined && !xml ) {\r
                                return context.getElementsByClassName( className );\r
                        }\r
@@ -4140,7 +4169,7 @@ Expr = Sizzle.selectors = {
                },\r
 \r
                "CHILD": function( match ) {\r
-                       /* matches from matchExpr.CHILD\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
@@ -4170,7 +4199,7 @@ Expr = Sizzle.selectors = {
                        return match;\r
                },\r
 \r
-               "PSEUDO": function( match, context, xml ) {\r
+               "PSEUDO": function( match ) {\r
                        var unquoted, excess;\r
                        if ( matchExpr["CHILD"].test( match[0] ) ) {\r
                                return null;\r
@@ -4182,7 +4211,7 @@ Expr = Sizzle.selectors = {
                                // Only check arguments that contain a pseudo\r
                                if ( rpseudo.test(unquoted) &&\r
                                        // Get excess from tokenize (recursively)\r
-                                       (excess = tokenize( unquoted, context, xml, true )) &&\r
+                                       (excess = tokenize( unquoted, true )) &&\r
                                        // advance to the next closing parenthesis\r
                                        (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {\r
 \r
@@ -4226,86 +4255,65 @@ Expr = Sizzle.selectors = {
                },\r
 \r
                "CLASS": function( className ) {\r
-                       var pattern = classCache[ expando ][ className ];\r
-                       if ( !pattern ) {\r
-                               pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );\r
-                       }\r
-                       return function( elem ) {\r
-                               return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );\r
-                       };\r
+                       var pattern = classCache[ expando ][ className + " " ];\r
+\r
+                       return pattern ||\r
+                               (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&\r
+                               classCache( className, 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
+                       return function( elem, context ) {\r
+                               var result = Sizzle.attr( elem, name );\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
+                               if ( !operator ) {\r
+                                       return true;\r
                                }\r
+\r
+                               result += "";\r
+\r
+                               return operator === "=" ? result === check :\r
+                                       operator === "!=" ? result !== check :\r
+                                       operator === "^=" ? check && result.indexOf( check ) === 0 :\r
+                                       operator === "*=" ? check && result.indexOf( check ) > -1 :\r
+                                       operator === "$=" ? check && result.substr( result.length - check.length ) === check :\r
+                                       operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :\r
+                                       operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" :\r
+                                       false;\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
+                                       var node, diff,\r
+                                               parent = elem.parentNode;\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
+                                       if ( parent ) {\r
+                                               diff = 0;\r
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
                                                        if ( node.nodeType === 1 ) {\r
-                                                               node.sizset = ++count;\r
-                                                               if ( node === elem ) {\r
+                                                               diff++;\r
+                                                               if ( elem === node ) {\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
+                                       // Incorporate the offset (or cast to NaN), then check against cycle size\r
+                                       diff -= last;\r
+                                       return diff === first || ( diff % first === 0 && diff / first >= 0 );\r
                                };\r
                        }\r
 \r
@@ -4340,42 +4348,82 @@ Expr = Sizzle.selectors = {
                        };\r
                },\r
 \r
-               "PSEUDO": function( pseudo, argument, context, xml ) {\r
+               "PSEUDO": function( pseudo, argument ) {\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
+                       // Remember that setFilters inherits from pseudos\r
                        var args,\r
-                               fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];\r
-\r
-                       if ( !fn ) {\r
-                               Sizzle.error( "unsupported pseudo: " + pseudo );\r
-                       }\r
+                               fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\r
+                                       Sizzle.error( "unsupported pseudo: " + pseudo );\r
 \r
                        // The user may use createPseudo to indicate that\r
                        // arguments are needed to create the filter function\r
                        // just as Sizzle does\r
-                       if ( !fn[ expando ] ) {\r
-                               if ( fn.length > 1 ) {\r
-                                       args = [ pseudo, pseudo, "", argument ];\r
-                                       return function( elem ) {\r
+                       if ( fn[ expando ] ) {\r
+                               return fn( argument );\r
+                       }\r
+\r
+                       // But maintain support for old signatures\r
+                       if ( fn.length > 1 ) {\r
+                               args = [ pseudo, pseudo, "", argument ];\r
+                               return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\r
+                                       markFunction(function( seed, matches ) {\r
+                                               var idx,\r
+                                                       matched = fn( seed, argument ),\r
+                                                       i = matched.length;\r
+                                               while ( i-- ) {\r
+                                                       idx = indexOf.call( seed, matched[i] );\r
+                                                       seed[ idx ] = !( matches[ idx ] = matched[i] );\r
+                                               }\r
+                                       }) :\r
+                                       function( elem ) {\r
                                                return fn( elem, 0, args );\r
                                        };\r
-                               }\r
-                               return fn;\r
                        }\r
 \r
-                       return fn( argument, context, xml );\r
+                       return fn;\r
                }\r
        },\r
 \r
        pseudos: {\r
-               "not": markFunction(function( selector, context, xml ) {\r
+               "not": markFunction(function( selector ) {\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
+                       var input = [],\r
+                               results = [],\r
+                               matcher = compile( selector.replace( rtrim, "$1" ) );\r
+\r
+                       return matcher[ expando ] ?\r
+                               markFunction(function( seed, matches, context, xml ) {\r
+                                       var elem,\r
+                                               unmatched = matcher( seed, null, xml, [] ),\r
+                                               i = seed.length;\r
+\r
+                                       // Match elements unmatched by `matcher`\r
+                                       while ( i-- ) {\r
+                                               if ( (elem = unmatched[i]) ) {\r
+                                                       seed[i] = !(matches[i] = elem);\r
+                                               }\r
+                                       }\r
+                               }) :\r
+                               function( elem, context, xml ) {\r
+                                       input[0] = elem;\r
+                                       matcher( input, null, xml, results );\r
+                                       return !results.pop();\r
+                               };\r
+               }),\r
+\r
+               "has": markFunction(function( selector ) {\r
                        return function( elem ) {\r
-                               return !matcher( elem );\r
+                               return Sizzle( selector, elem ).length > 0;\r
+                       };\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
@@ -4425,18 +4473,6 @@ Expr = Sizzle.selectors = {
                        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
@@ -4471,56 +4507,53 @@ Expr = Sizzle.selectors = {
 \r
                "focus": function( elem ) {\r
                        var doc = elem.ownerDocument;\r
-                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);\r
+                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\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
+               // Positional types\r
+               "first": createPositionalPseudo(function() {\r
+                       return [ 0 ];\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
+               "last": createPositionalPseudo(function( matchIndexes, length ) {\r
+                       return [ length - 1 ];\r
+               }),\r
+\r
+               "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
+                       return [ argument < 0 ? argument + length : argument ];\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
+               "even": createPositionalPseudo(function( matchIndexes, length ) {\r
+                       for ( var i = 0; i < length; i += 2 ) {\r
+                               matchIndexes.push( i );\r
                        }\r
-                       return results;\r
-               },\r
+                       return matchIndexes;\r
+               }),\r
 \r
-               "lt": function( elements, argument, not ) {\r
-                       return not ? elements.slice( +argument ) : elements.slice( 0, +argument );\r
-               },\r
+               "odd": createPositionalPseudo(function( matchIndexes, length ) {\r
+                       for ( var i = 1; i < length; i += 2 ) {\r
+                               matchIndexes.push( i );\r
+                       }\r
+                       return matchIndexes;\r
+               }),\r
 \r
-               "gt": function( elements, argument, not ) {\r
-                       return not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );\r
-               },\r
+               "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
+                       for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) {\r
+                               matchIndexes.push( i );\r
+                       }\r
+                       return matchIndexes;\r
+               }),\r
 \r
-               "eq": function( elements, argument, not ) {\r
-                       var elem = elements.splice( +argument, 1 );\r
-                       return not ? elements : elem;\r
-               }\r
+               "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {\r
+                       for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) {\r
+                               matchIndexes.push( i );\r
+                       }\r
+                       return matchIndexes;\r
+               })\r
        }\r
 };\r
 \r
@@ -4622,7 +4655,9 @@ baseHasDuplicate = !hasDuplicate;
 // Document sorting and removing duplicates\r
 Sizzle.uniqueSort = function( results ) {\r
        var elem,\r
-               i = 1;\r
+               duplicates = [],\r
+               i = 1,\r
+               j = 0;\r
 \r
        hasDuplicate = baseHasDuplicate;\r
        results.sort( sortOrder );\r
@@ -4630,9 +4665,12 @@ Sizzle.uniqueSort = function( results ) {
        if ( hasDuplicate ) {\r
                for ( ; (elem = results[i]); i++ ) {\r
                        if ( elem === results[ i - 1 ] ) {\r
-                               results.splice( i--, 1 );\r
+                               j = duplicates.push( i );\r
                        }\r
                }\r
+               while ( j-- ) {\r
+                       results.splice( duplicates[ j ], 1 );\r
+               }\r
        }\r
 \r
        return results;\r
@@ -4642,70 +4680,50 @@ Sizzle.error = function( msg ) {
        throw new Error( "Syntax error, unrecognized expression: " + msg );\r
 };\r
 \r
-function tokenize( selector, context, xml, parseOnly ) {\r
+function tokenize( selector, parseOnly ) {\r
        var matched, match, tokens, type,\r
-               soFar, groups, group, i,\r
-               preFilters, filters,\r
-               checkContext = !xml && context !== document,\r
-               // Token cache should maintain spaces\r
-               key = ( checkContext ? "<s>" : "" ) + selector.replace( rtrim, "$1<s>" ),\r
-               cached = tokenCache[ expando ][ key ];\r
+               soFar, groups, preFilters,\r
+               cached = tokenCache[ expando ][ selector + " " ];\r
 \r
        if ( cached ) {\r
-               return parseOnly ? 0 : slice.call( cached, 0 );\r
+               return parseOnly ? 0 : cached.slice( 0 );\r
        }\r
 \r
        soFar = selector;\r
        groups = [];\r
-       i = 0;\r
        preFilters = Expr.preFilter;\r
-       filters = Expr.filter;\r
 \r
        while ( soFar ) {\r
 \r
                // Comma and first run\r
                if ( !matched || (match = rcomma.exec( soFar )) ) {\r
                        if ( match ) {\r
-                               soFar = soFar.slice( match[0].length );\r
-                               tokens.selector = group;\r
+                               // Don't consume trailing commas as valid\r
+                               soFar = soFar.slice( match[0].length ) || soFar;\r
                        }\r
                        groups.push( tokens = [] );\r
-                       group = "";\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
 \r
                matched = false;\r
 \r
                // Combinators\r
                if ( (match = rcombinators.exec( soFar )) ) {\r
-                       group += match[0];\r
-                       soFar = soFar.slice( match[0].length );\r
+                       tokens.push( matched = new Token( match.shift() ) );\r
+                       soFar = soFar.slice( matched.length );\r
 \r
                        // Cast descendant combinators to space\r
-                       matched = tokens.push({\r
-                               part: match.pop().replace( rtrim, " " ),\r
-                               string: match[0],\r
-                               captures: match\r
-                       });\r
+                       matched.type = match[0].replace( rtrim, " " );\r
                }\r
 \r
                // Filters\r
-               for ( type in filters ) {\r
+               for ( type in Expr.filter ) {\r
                        if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
-                               ( match = preFilters[ type ](match, context, xml) )) ) {\r
-\r
-                               group += match[0];\r
-                               soFar = soFar.slice( match[0].length );\r
-                               matched = tokens.push({\r
-                                       part: type,\r
-                                       string: match.shift(),\r
-                                       captures: match\r
-                               });\r
+                               (match = preFilters[ type ]( match ))) ) {\r
+\r
+                               tokens.push( matched = new Token( match.shift() ) );\r
+                               soFar = soFar.slice( matched.length );\r
+                               matched.type = type;\r
+                               matched.matches = match;\r
                        }\r
                }\r
 \r
@@ -4714,11 +4732,6 @@ function tokenize( selector, context, xml, parseOnly ) {
                }\r
        }\r
 \r
-       // Attach the full group as a selector\r
-       if ( group ) {\r
-               tokens.selector = group;\r
-       }\r
-\r
        // Return the length of the invalid excess\r
        // if we're just parsing\r
        // Otherwise, throw an error or return tokens\r
@@ -4727,43 +4740,33 @@ function tokenize( selector, context, xml, parseOnly ) {
                soFar ?\r
                        Sizzle.error( selector ) :\r
                        // Cache the tokens\r
-                       slice.call( tokenCache(key, groups), 0 );\r
+                       tokenCache( selector, groups ).slice( 0 );\r
 }\r
 \r
-function addCombinator( matcher, combinator, context, xml ) {\r
+function addCombinator( matcher, combinator, base ) {\r
        var dir = combinator.dir,\r
+               checkNonElements = base && combinator.dir === "parentNode",\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 ) {\r
+               // Check against closest ancestor/preceding element\r
+               function( elem, context, xml ) {\r
                        while ( (elem = elem[ dir ]) ) {\r
-                               if ( elem.nodeType === 1 ) {\r
-                                       return matcher( elem ) && elem;\r
+                               if ( checkNonElements || elem.nodeType === 1  ) {\r
+                                       return matcher( elem, context, xml );\r
                                }\r
                        }\r
                } :\r
-               xml ?\r
-                       function( elem ) {\r
-                               while ( (elem = elem[ dir ]) ) {\r
-                                       if ( elem.nodeType === 1 ) {\r
-                                               if ( matcher( elem ) ) {\r
-                                                       return elem;\r
-                                               }\r
-                                       }\r
-                               }\r
-                       } :\r
-                       function( elem ) {\r
+\r
+               // Check against all ancestor/preceding elements\r
+               function( elem, context, xml ) {\r
+                       // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\r
+                       if ( !xml ) {\r
                                var cache,\r
-                                       dirkey = doneName + "." + dirruns,\r
-                                       cachedkey = dirkey + "." + cachedruns;\r
+                                       dirkey = dirruns + " " + doneName + " ",\r
+                                       cachedkey = dirkey + cachedruns;\r
                                while ( (elem = elem[ dir ]) ) {\r
-                                       if ( elem.nodeType === 1 ) {\r
+                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
                                                if ( (cache = elem[ expando ]) === cachedkey ) {\r
                                                        return elem.sizset;\r
                                                } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {\r
@@ -4772,7 +4775,7 @@ function addCombinator( matcher, combinator, context, xml ) {
                                                        }\r
                                                } else {\r
                                                        elem[ expando ] = cachedkey;\r
-                                                       if ( matcher( elem ) ) {\r
+                                                       if ( matcher( elem, context, xml ) ) {\r
                                                                elem.sizset = true;\r
                                                                return elem;\r
                                                        }\r
@@ -4780,254 +4783,394 @@ function addCombinator( matcher, combinator, context, xml ) {
                                                }\r
                                        }\r
                                }\r
-                       };\r
+                       } else {\r
+                               while ( (elem = elem[ dir ]) ) {\r
+                                       if ( checkNonElements || elem.nodeType === 1 ) {\r
+                                               if ( matcher( elem, context, xml ) ) {\r
+                                                       return elem;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               };\r
 }\r
 \r
-function addMatcher( higher, deeper ) {\r
-       return higher ?\r
-               function( elem ) {\r
-                       var result = deeper( elem );\r
-                       return result && higher( result === true ? elem : result );\r
+function elementMatcher( matchers ) {\r
+       return matchers.length > 1 ?\r
+               function( elem, context, xml ) {\r
+                       var i = matchers.length;\r
+                       while ( i-- ) {\r
+                               if ( !matchers[i]( elem, context, xml ) ) {\r
+                                       return false;\r
+                               }\r
+                       }\r
+                       return true;\r
                } :\r
-               deeper;\r
+               matchers[0];\r
 }\r
 \r
-// ["TAG", ">", "ID", " ", "CLASS"]\r
-function matcherFromTokens( tokens, context, xml ) {\r
-       var token, matcher,\r
-               i = 0;\r
+function condense( unmatched, map, filter, context, xml ) {\r
+       var elem,\r
+               newUnmatched = [],\r
+               i = 0,\r
+               len = unmatched.length,\r
+               mapped = map != null;\r
 \r
-       for ( ; (token = tokens[i]); i++ ) {\r
-               if ( Expr.relative[ token.part ] ) {\r
-                       matcher = addCombinator( matcher, Expr.relative[ token.part ], context, xml );\r
-               } else {\r
-                       matcher = addMatcher( matcher, Expr.filter[ token.part ].apply(null, token.captures.concat( context, xml )) );\r
+       for ( ; i < len; i++ ) {\r
+               if ( (elem = unmatched[i]) ) {\r
+                       if ( !filter || filter( elem, context, xml ) ) {\r
+                               newUnmatched.push( elem );\r
+                               if ( mapped ) {\r
+                                       map.push( i );\r
+                               }\r
+                       }\r
                }\r
        }\r
 \r
-       return matcher;\r
+       return newUnmatched;\r
 }\r
 \r
-function matcherFromGroupMatchers( matchers ) {\r
-       return function( elem ) {\r
-               var matcher,\r
-                       j = 0;\r
-               for ( ; (matcher = matchers[j]); j++ ) {\r
-                       if ( matcher(elem) ) {\r
-                               return true;\r
-                       }\r
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\r
+       if ( postFilter && !postFilter[ expando ] ) {\r
+               postFilter = setMatcher( postFilter );\r
+       }\r
+       if ( postFinder && !postFinder[ expando ] ) {\r
+               postFinder = setMatcher( postFinder, postSelector );\r
+       }\r
+       return markFunction(function( seed, results, context, xml ) {\r
+               var temp, i, elem,\r
+                       preMap = [],\r
+                       postMap = [],\r
+                       preexisting = results.length,\r
+\r
+                       // Get initial elements from seed or context\r
+                       elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),\r
+\r
+                       // Prefilter to get matcher input, preserving a map for seed-results synchronization\r
+                       matcherIn = preFilter && ( seed || !selector ) ?\r
+                               condense( elems, preMap, preFilter, context, xml ) :\r
+                               elems,\r
+\r
+                       matcherOut = matcher ?\r
+                               // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\r
+                               postFinder || ( seed ? preFilter : preexisting || postFilter ) ?\r
+\r
+                                       // ...intermediate processing is necessary\r
+                                       [] :\r
+\r
+                                       // ...otherwise use results directly\r
+                                       results :\r
+                               matcherIn;\r
+\r
+               // Find primary matches\r
+               if ( matcher ) {\r
+                       matcher( matcherIn, matcherOut, context, xml );\r
                }\r
-               return false;\r
-       };\r
-}\r
 \r
-compile = Sizzle.compile = function( selector, context, xml ) {\r
-       var group, i, len,\r
-               cached = compilerCache[ expando ][ selector ];\r
+               // Apply postFilter\r
+               if ( postFilter ) {\r
+                       temp = condense( matcherOut, postMap );\r
+                       postFilter( temp, [], context, xml );\r
 \r
-       // Return a cached group function if already generated (context dependent)\r
-       if ( cached && cached.context === context ) {\r
-               return cached;\r
-       }\r
+                       // Un-match failing elements by moving them back to matcherIn\r
+                       i = temp.length;\r
+                       while ( i-- ) {\r
+                               if ( (elem = temp[i]) ) {\r
+                                       matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\r
+                               }\r
+                       }\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, len = group.length; i < len; i++ ) {\r
-               group[i] = matcherFromTokens(group[i], context, xml);\r
-       }\r
+               if ( seed ) {\r
+                       if ( postFinder || preFilter ) {\r
+                               if ( postFinder ) {\r
+                                       // Get the final matcherOut by condensing this intermediate into postFinder contexts\r
+                                       temp = [];\r
+                                       i = matcherOut.length;\r
+                                       while ( i-- ) {\r
+                                               if ( (elem = matcherOut[i]) ) {\r
+                                                       // Restore matcherIn since elem is not yet a final match\r
+                                                       temp.push( (matcherIn[i] = elem) );\r
+                                               }\r
+                                       }\r
+                                       postFinder( null, (matcherOut = []), temp, 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
-       return cached;\r
-};\r
+                               // Move matched elements from seed to results to keep them synchronized\r
+                               i = matcherOut.length;\r
+                               while ( i-- ) {\r
+                                       if ( (elem = matcherOut[i]) &&\r
+                                               (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\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
+                                               seed[temp] = !(results[temp] = elem);\r
+                                       }\r
+                               }\r
+                       }\r
 \r
-function handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {\r
-       var results,\r
-               fn = Expr.setFilters[ posfilter.toLowerCase() ];\r
+               // Add elements to results, through postFinder if defined\r
+               } else {\r
+                       matcherOut = condense(\r
+                               matcherOut === results ?\r
+                                       matcherOut.splice( preexisting, matcherOut.length ) :\r
+                                       matcherOut\r
+                       );\r
+                       if ( postFinder ) {\r
+                               postFinder( null, results, matcherOut, xml );\r
+                       } else {\r
+                               push.apply( results, matcherOut );\r
+                       }\r
+               }\r
+       });\r
+}\r
 \r
-       if ( !fn ) {\r
-               Sizzle.error( posfilter );\r
-       }\r
+function matcherFromTokens( tokens ) {\r
+       var checkContext, matcher, j,\r
+               len = tokens.length,\r
+               leadingRelative = Expr.relative[ tokens[0].type ],\r
+               implicitRelative = leadingRelative || Expr.relative[" "],\r
+               i = leadingRelative ? 1 : 0,\r
+\r
+               // The foundational matcher ensures that elements are reachable from top-level context(s)\r
+               matchContext = addCombinator( function( elem ) {\r
+                       return elem === checkContext;\r
+               }, implicitRelative, true ),\r
+               matchAnyContext = addCombinator( function( elem ) {\r
+                       return indexOf.call( checkContext, elem ) > -1;\r
+               }, implicitRelative, true ),\r
+               matchers = [ function( elem, context, xml ) {\r
+                       return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\r
+                               (checkContext = context).nodeType ?\r
+                                       matchContext( elem, context, xml ) :\r
+                                       matchAnyContext( elem, context, xml ) );\r
+               } ];\r
 \r
-       if ( selector || !(results = seed) ) {\r
-               multipleContexts( selector || "*", contexts, (results = []), seed );\r
+       for ( ; i < len; i++ ) {\r
+               if ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r
+                       matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\r
+               } else {\r
+                       matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\r
+\r
+                       // Return special upon seeing a positional matcher\r
+                       if ( matcher[ expando ] ) {\r
+                               // Find the next relative operator (if any) for proper handling\r
+                               j = ++i;\r
+                               for ( ; j < len; j++ ) {\r
+                                       if ( Expr.relative[ tokens[j].type ] ) {\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               return setMatcher(\r
+                                       i > 1 && elementMatcher( matchers ),\r
+                                       i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ),\r
+                                       matcher,\r
+                                       i < j && matcherFromTokens( tokens.slice( i, j ) ),\r
+                                       j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\r
+                                       j < len && tokens.join("")\r
+                               );\r
+                       }\r
+                       matchers.push( matcher );\r
+               }\r
        }\r
 \r
-       return results.length > 0 ? fn( results, argument, not ) : [];\r
+       return elementMatcher( matchers );\r
 }\r
 \r
-function handlePOS( groups, context, results, seed ) {\r
-       var group, part, j, groupLen, token, selector,\r
-               anchor, elements, match, matched,\r
-               lastIndex, currentContexts, not,\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
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {\r
+       var bySet = setMatchers.length > 0,\r
+               byElement = elementMatchers.length > 0,\r
+               superMatcher = function( seed, context, xml, results, expandContext ) {\r
+                       var elem, j, matcher,\r
+                               setMatched = [],\r
+                               matchedCount = 0,\r
+                               i = "0",\r
+                               unmatched = seed && [],\r
+                               outermost = expandContext != null,\r
+                               contextBackup = outermostContext,\r
+                               // We must always have either seed elements or context\r
+                               elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),\r
+                               // Nested matchers should use non-integer dirruns\r
+                               dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);\r
+\r
+                       if ( outermost ) {\r
+                               outermostContext = context !== document && context;\r
+                               cachedruns = superMatcher.el;\r
                        }\r
-               };\r
 \r
-       for ( ; i < len; i++ ) {\r
-               group = groups[i];\r
-               part = "";\r
-               elements = seed;\r
-               for ( j = 0, groupLen = group.length; j < groupLen; j++ ) {\r
-                       token = group[j];\r
-                       selector = token.string;\r
-                       if ( token.part === "PSEUDO" ) {\r
-                               // Reset regex index to 0\r
-                               rpos.exec("");\r
-                               anchor = 0;\r
-                               while ( (match = rpos.exec( selector )) ) {\r
-                                       matched = true;\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
+                       // Add elements passing elementMatchers directly to results\r
+                       for ( ; (elem = elems[i]) != null; i++ ) {\r
+                               if ( byElement && elem ) {\r
+                                       for ( j = 0; (matcher = elementMatchers[j]); j++ ) {\r
+                                               if ( matcher( elem, context, xml ) ) {\r
+                                                       results.push( elem );\r
+                                                       break;\r
                                                }\r
+                                       }\r
+                                       if ( outermost ) {\r
+                                               dirruns = dirrunsUnique;\r
+                                               cachedruns = ++superMatcher.el;\r
+                                       }\r
+                               }\r
 \r
-                                               if ( (not = rendsWithNot.test( part )) ) {\r
-                                                       part = part.slice( 0, -5 ).replace( rcombinators, "$&*" );\r
-                                                       anchor++;\r
-                                               }\r
+                               // Track unmatched elements for set filters\r
+                               if ( bySet ) {\r
+                                       // They will have gone through all possible matchers\r
+                                       if ( (elem = !matcher && elem) ) {\r
+                                               matchedCount--;\r
+                                       }\r
+\r
+                                       // Lengthen the array for every element, matched or not\r
+                                       if ( seed ) {\r
+                                               unmatched.push( elem );\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Apply set filters to unmatched elements\r
+                       matchedCount += i;\r
+                       if ( bySet && i !== matchedCount ) {\r
+                               for ( j = 0; (matcher = setMatchers[j]); j++ ) {\r
+                                       matcher( unmatched, setMatched, context, xml );\r
+                               }\r
 \r
-                                               if ( match.length > 1 ) {\r
-                                                       match[0].replace( rposgroups, setUndefined );\r
+                               if ( seed ) {\r
+                                       // Reintegrate element matches to eliminate the need for sorting\r
+                                       if ( matchedCount > 0 ) {\r
+                                               while ( i-- ) {\r
+                                                       if ( !(unmatched[i] || setMatched[i]) ) {\r
+                                                               setMatched[i] = pop.call( results );\r
+                                                       }\r
                                                }\r
-                                               elements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );\r
                                        }\r
-                                       part = "";\r
+\r
+                                       // Discard index placeholder values to get only actual matches\r
+                                       setMatched = condense( setMatched );\r
                                }\r
 \r
+                               // Add matches to results\r
+                               push.apply( results, setMatched );\r
+\r
+                               // Seedless set matches succeeding multiple successful matchers stipulate sorting\r
+                               if ( outermost && !seed && setMatched.length > 0 &&\r
+                                       ( matchedCount + setMatchers.length ) > 1 ) {\r
+\r
+                                       Sizzle.uniqueSort( results );\r
+                               }\r
                        }\r
 \r
-                       if ( !matched ) {\r
-                               part += selector;\r
+                       // Override manipulation of globals by nested matchers\r
+                       if ( outermost ) {\r
+                               dirruns = dirrunsUnique;\r
+                               outermostContext = contextBackup;\r
                        }\r
-                       matched = false;\r
-               }\r
 \r
-               if ( part ) {\r
-                       if ( rcombinators.test(part) ) {\r
-                               multipleContexts( part, elements || [ context ], results, seed );\r
+                       return unmatched;\r
+               };\r
+\r
+       superMatcher.el = 0;\r
+       return bySet ?\r
+               markFunction( superMatcher ) :\r
+               superMatcher;\r
+}\r
+\r
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\r
+       var i,\r
+               setMatchers = [],\r
+               elementMatchers = [],\r
+               cached = compilerCache[ expando ][ selector + " " ];\r
+\r
+       if ( !cached ) {\r
+               // Generate a function of recursive functions that can be used to check each element\r
+               if ( !group ) {\r
+                       group = tokenize( selector );\r
+               }\r
+               i = group.length;\r
+               while ( i-- ) {\r
+                       cached = matcherFromTokens( group[i] );\r
+                       if ( cached[ expando ] ) {\r
+                               setMatchers.push( cached );\r
                        } else {\r
-                               Sizzle( part, context, results, seed ? seed.concat(elements) : elements );\r
+                               elementMatchers.push( cached );\r
                        }\r
-               } else {\r
-                       push.apply( results, elements );\r
                }\r
+\r
+               // Cache the compiled function\r
+               cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\r
        }\r
+       return cached;\r
+};\r
 \r
-       // Do not sort if this is a single filter\r
-       return len === 1 ? results : Sizzle.uniqueSort( results );\r
+function multipleContexts( selector, contexts, results ) {\r
+       var i = 0,\r
+               len = contexts.length;\r
+       for ( ; i < len; i++ ) {\r
+               Sizzle( selector, contexts[i], results );\r
+       }\r
+       return results;\r
 }\r
 \r
 function select( selector, context, results, seed, xml ) {\r
-       // Remove excessive whitespace\r
-       selector = selector.replace( rtrim, "$1" );\r
-       var elements, matcher, cached, elem,\r
-               i, tokens, token, lastToken, findContext, type,\r
-               match = tokenize( selector, context, xml ),\r
-               contextNodeType = context.nodeType;\r
-\r
-       // POS handling\r
-       if ( matchExpr["POS"].test(selector) ) {\r
-               return handlePOS( match, context, results, seed );\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.length === 1 ) {\r
-\r
-               // Take a shortcut and set the context if the root selector is an ID\r
-               if ( (tokens = slice.call( match[0], 0 )).length > 2 &&\r
-                               (token = tokens[0]).part === "ID" &&\r
-                               contextNodeType === 9 && !xml &&\r
-                               Expr.relative[ tokens[1].part ] ) {\r
-\r
-                       context = Expr.find["ID"]( token.captures[0].replace( rbackslash, "" ), context, xml )[0];\r
-                       if ( !context ) {\r
-                               return results;\r
-                       }\r
-\r
-                       selector = selector.slice( tokens.shift().string.length );\r
-               }\r
-\r
-               findContext = ( (match = rsibling.exec( tokens[0].string )) && !match.index && context.parentNode ) || context;\r
+       var i, tokens, token, type, find,\r
+               match = tokenize( selector ),\r
+               j = match.length;\r
+\r
+       if ( !seed ) {\r
+               // Try to minimize operations if there is only one group\r
+               if ( match.length === 1 ) {\r
+\r
+                       // Take a shortcut and set the context if the root selector is an ID\r
+                       tokens = match[0] = match[0].slice( 0 );\r
+                       if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&\r
+                                       context.nodeType === 9 && !xml &&\r
+                                       Expr.relative[ tokens[1].type ] ) {\r
+\r
+                               context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0];\r
+                               if ( !context ) {\r
+                                       return results;\r
+                               }\r
 \r
-               // Reduce the set if possible\r
-               lastToken = "";\r
-               for ( i = tokens.length - 1; i >= 0; i-- ) {\r
-                       token = tokens[i];\r
-                       type = token.part;\r
-                       lastToken = token.string + lastToken;\r
-                       if ( Expr.relative[ type ] ) {\r
-                               break;\r
+                               selector = selector.slice( tokens.shift().length );\r
                        }\r
-                       if ( Expr.order.test(type) ) {\r
-                               elements = Expr.find[ type ]( token.captures[0].replace( rbackslash, "" ), findContext, xml );\r
-                               if ( elements == null ) {\r
-                                       continue;\r
-                               } else {\r
-                                       selector = selector.slice( 0, selector.length - lastToken.length ) +\r
-                                               lastToken.replace( matchExpr[ type ], "" );\r
 \r
-                                       if ( !selector ) {\r
-                                               push.apply( results, slice.call(elements, 0) );\r
-                                       }\r
+                       // Fetch a seed set for right-to-left matching\r
+                       for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {\r
+                               token = tokens[i];\r
 \r
+                               // Abort if we hit a combinator\r
+                               if ( Expr.relative[ (type = token.type) ] ) {\r
                                        break;\r
                                }\r
-                       }\r
-               }\r
-       }\r
-\r
-       // Only loop over the given elements once\r
-       if ( selector ) {\r
-               matcher = compile( selector, context, xml );\r
-               dirruns = matcher.dirruns++;\r
-               if ( elements == null ) {\r
-                       elements = Expr.find["TAG"]( "*", (rsibling.test( selector ) && context.parentNode) || context );\r
-               }\r
+                               if ( (find = Expr.find[ type ]) ) {\r
+                                       // Search, expanding context for leading sibling combinators\r
+                                       if ( (seed = find(\r
+                                               token.matches[0].replace( rbackslash, "" ),\r
+                                               rsibling.test( tokens[0].type ) && context.parentNode || context,\r
+                                               xml\r
+                                       )) ) {\r
+\r
+                                               // If seed is empty or no tokens remain, we can return early\r
+                                               tokens.splice( i, 1 );\r
+                                               selector = seed.length && tokens.join("");\r
+                                               if ( !selector ) {\r
+                                                       push.apply( results, slice.call( seed, 0 ) );\r
+                                                       return results;\r
+                                               }\r
 \r
-               for ( i = 0; (elem = elements[i]); i++ ) {\r
-                       cachedruns = matcher.runs++;\r
-                       if ( matcher(elem) ) {\r
-                               results.push( elem );\r
+                                               break;\r
+                                       }\r
+                               }\r
                        }\r
                }\r
        }\r
 \r
+       // Compile and execute a filtering function\r
+       // Provide `match` to avoid retokenization if we modified the selector above\r
+       compile( selector, match )(\r
+               seed,\r
+               context,\r
+               xml,\r
+               results,\r
+               rsibling.test( selector )\r
+       );\r
        return results;\r
 }\r
 \r
@@ -5037,11 +5180,15 @@ if ( document.querySelectorAll ) {
                        oldSelect = select,\r
                        rescape = /'|\\/g,\r
                        rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,\r
-                       rbuggyQSA = [],\r
+\r
+                       // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA\r
+                       // A support test would require too much code (would include document ready)\r
+                       rbuggyQSA = [ ":focus" ],\r
+\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
+                       rbuggyMatches = [ ":active" ],\r
                        matches = docElem.matchesSelector ||\r
                                docElem.mozMatchesSelector ||\r
                                docElem.webkitMatchesSelector ||\r
@@ -5088,44 +5235,46 @@ if ( document.querySelectorAll ) {
                        }\r
                });\r
 \r
-               rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );\r
+               // rbuggyQSA always contains :focus, so no need for a length check\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
+                       if ( !seed && !xml && !rbuggyQSA.test( selector ) ) {\r
+                               var groups, i,\r
+                                       old = true,\r
+                                       nid = expando,\r
+                                       newContext = context,\r
+                                       newSelector = context.nodeType === 9 && selector;\r
+\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 groups, i, len,\r
-                                               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
+                               if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
+                                       groups = tokenize( selector );\r
+\r
+                                       if ( (old = context.getAttribute("id")) ) {\r
+                                               nid = old.replace( rescape, "\\$&" );\r
                                        } else {\r
                                                context.setAttribute( "id", nid );\r
                                        }\r
+                                       nid = "[id='" + nid + "'] ";\r
 \r
-                                       groups = tokenize(selector, context, xml);\r
-                                       // Trailing space is unnecessary\r
-                                       // There is always a context check\r
-                                       nid = "[id='" + nid + "']";\r
-                                       for ( i = 0, len = groups.length; i < len; i++ ) {\r
-                                               groups[i] = nid + groups[i].selector;\r
+                                       i = groups.length;\r
+                                       while ( i-- ) {\r
+                                               groups[i] = nid + groups[i].join("");\r
                                        }\r
+                                       newContext = rsibling.test( selector ) && context.parentNode || context;\r
+                                       newSelector = groups.join(",");\r
+                               }\r
+\r
+                               if ( newSelector ) {\r
                                        try {\r
                                                push.apply( results, slice.call( newContext.querySelectorAll(\r
-                                                       groups.join(",")\r
+                                                       newSelector\r
                                                ), 0 ) );\r
                                                return results;\r
                                        } catch(qsaError) {\r
@@ -5150,11 +5299,11 @@ if ( document.querySelectorAll ) {
                                // Gecko does not error, returns false instead\r
                                try {\r
                                        matches.call( div, "[test!='']:sizzle" );\r
-                                       rbuggyMatches.push( matchExpr["PSEUDO"].source, matchExpr["POS"].source, "!=" );\r
+                                       rbuggyMatches.push( "!=", pseudos );\r
                                } catch ( e ) {}\r
                        });\r
 \r
-                       // rbuggyMatches always contains :active, so no need for a length check\r
+                       // rbuggyMatches always contains :active and :focus, so no need for a length check\r
                        rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );\r
 \r
                        Sizzle.matchesSelector = function( elem, expr ) {\r
@@ -5162,7 +5311,7 @@ if ( document.querySelectorAll ) {
                                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
+                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) {\r
                                        try {\r
                                                var ret = matches.call( elem, expr );\r
 \r
@@ -5183,10 +5332,12 @@ if ( document.querySelectorAll ) {
 }\r
 \r
 // Deprecated\r
-Expr.setFilters["nth"] = Expr.setFilters["eq"];\r
+Expr.pseudos["nth"] = Expr.pseudos["eq"];\r
 \r
 // Back-compat\r
-Expr.filters = Expr.pseudos;\r
+function setFilters() {}\r
+Expr.filters = setFilters.prototype = Expr.pseudos;\r
+Expr.setFilters = new setFilters();\r
 \r
 // Override sizzle attribute retrieval
 Sizzle.attr = jQuery.attr;
@@ -6395,7 +6546,7 @@ var curCSS, iframe, iframeDoc,
        rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
        rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
        rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
-       elemdisplay = {},
+       elemdisplay = { BODY: "block" },
 
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        cssNormalTransform = {
@@ -6676,7 +6827,9 @@ if ( window.getComputedStyle ) {
 
                if ( computed ) {
 
-                       ret = computed[ name ];
+                       // getPropertyValue is only needed for .css('filter') in IE9, see #12537
+                       ret = computed.getPropertyValue( name ) || computed[ name ];
+
                        if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
                                ret = jQuery.style( elem, name );
                        }
@@ -7123,10 +7276,10 @@ function buildParams( prefix, obj, traditional, add ) {
                add( prefix, obj );
        }
 }
-var // Document location
-       ajaxLocation,
-       // Document location segments
+var
+       // Document location
        ajaxLocParts,
+       ajaxLocation,
 
        rhash = /#.*$/,
        rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
@@ -7643,7 +7796,7 @@ jQuery.extend({
 
                        // Set data for the fake xhr object
                        jqXHR.status = status;
-                       jqXHR.statusText = "" + ( nativeStatusText || statusText );
+                       jqXHR.statusText = ( nativeStatusText || statusText ) + "";
 
                        // Success/Error
                        if ( isSuccess ) {
@@ -7703,11 +7856,11 @@ jQuery.extend({
                // Extract dataTypes list
                s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
 
-               // Determine if a cross-domain request is in order
+               // A cross-domain request is in order when we have a protocol:host:port mismatch
                if ( s.crossDomain == null ) {
                        parts = rurl.exec( s.url.toLowerCase() );
                        s.crossDomain = !!( parts &&
-                               ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+                               ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
                                        ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
                                                ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
                        );
@@ -8329,7 +8482,7 @@ if ( jQuery.support.ajax ) {
                                                                        // on any attempt to access responseText (#11426)
                                                                        try {
                                                                                responses.text = xhr.responseText;
-                                                                       } catch( _ ) {
+                                                                       } catch( e ) {
                                                                        }
 
                                                                        // Firefox throws an exception when accessing
@@ -8405,12 +8558,13 @@ var fxNow, timerId,
        animationPrefilters = [ defaultPrefilter ],
        tweeners = {
                "*": [function( prop, value ) {
-                       var end, unit, prevScale,
+                       var end, unit,
                                tween = this.createTween( prop, value ),
                                parts = rfxnum.exec( value ),
                                target = tween.cur(),
                                start = +target || 0,
-                               scale = 1;
+                               scale = 1,
+                               maxIterations = 20;
 
                        if ( parts ) {
                                end = +parts[2];
@@ -8426,17 +8580,15 @@ var fxNow, timerId,
                                        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";
+                                               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 );
+                                       // Update scale, tolerating zero or NaN from tween.cur()
+                                       // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+                                       } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
                                }
 
                                tween.unit = unit;
@@ -8483,7 +8635,9 @@ function Animation( elem, properties, options ) {
                tick = function() {
                        var currentTime = fxNow || createFxNow(),
                                remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-                               percent = 1 - ( remaining / animation.duration || 0 ),
+                               // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+                               temp = remaining / animation.duration || 0,
+                               percent = 1 - temp,
                                index = 0,
                                length = animation.tweens.length;
 
@@ -8635,7 +8789,7 @@ jQuery.Animation = jQuery.extend( Animation, {
 });
 
 function defaultPrefilter( elem, props, opts ) {
-       var index, prop, value, length, dataShow, tween, hooks, oldfire,
+       var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,
                anim = this,
                style = elem.style,
                orig = {},
@@ -8709,6 +8863,7 @@ function defaultPrefilter( elem, props, opts ) {
                value = props[ index ];
                if ( rfxtypes.exec( value ) ) {
                        delete props[ index ];
+                       toggle = toggle || value === "toggle";
                        if ( value === ( hidden ? "hide" : "show" ) ) {
                                continue;
                        }
@@ -8719,6 +8874,14 @@ function defaultPrefilter( elem, props, opts ) {
        length = handled.length;
        if ( length ) {
                dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+               if ( "hidden" in dataShow ) {
+                       hidden = dataShow.hidden;
+               }
+
+               // store state if its toggle - enables .stop().toggle() to "reverse"
+               if ( toggle ) {
+                       dataShow.hidden = !hidden;
+               }
                if ( hidden ) {
                        jQuery( elem ).show();
                } else {
@@ -9015,6 +9178,8 @@ jQuery.fx.tick = function() {
                timers = jQuery.timers,
                i = 0;
 
+       fxNow = jQuery.now();
+
        for ( ; i < timers.length; i++ ) {
                timer = timers[ i ];
                // Checks the timer has not already been removed
@@ -9026,6 +9191,7 @@ jQuery.fx.tick = function() {
        if ( !timers.length ) {
                jQuery.fx.stop();
        }
+       fxNow = undefined;
 };
 
 jQuery.fx.timer = function( timer ) {
@@ -9069,7 +9235,8 @@ jQuery.fn.offset = function( options ) {
                        });
        }
 
-       var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left,
+       var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft,
+               box = { top: 0, left: 0 },
                elem = this[ 0 ],
                doc = elem && elem.ownerDocument;
 
@@ -9083,21 +9250,25 @@ jQuery.fn.offset = function( options ) {
 
        docElem = doc.documentElement;
 
-       // Make sure we're not dealing with a disconnected DOM node
+       // Make sure it's not a disconnected DOM node
        if ( !jQuery.contains( docElem, elem ) ) {
-               return { top: 0, left: 0 };
+               return box;
        }
 
-       box = elem.getBoundingClientRect();
+       // If we don't have gBCR, just use 0,0 rather than error
+       // BlackBerry 5, iOS 3 (original iPhone)
+       if ( typeof elem.getBoundingClientRect !== "undefined" ) {
+               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 };
+       return {
+               top: box.top  + scrollTop  - clientTop,
+               left: box.left + scrollLeft - clientLeft
+       };
 };
 
 jQuery.offset = {
index 0a4d364..ad15607 100644 (file)
@@ -2,13 +2,13 @@
  * jQuery makeCollapsible
  *
  * This will enable collapsible-functionality on all passed elements.
- * Will prevent binding twice to the same element.
- * Initial state is expanded by default, this can be overriden by adding class
- * "mw-collapsed" to the "mw-collapsible" element.
- * Elements made collapsible have class "mw-made-collapsible".
- * Except for tables and lists, the inner content is wrapped in "mw-collapsible-content".
+ * Will prevent binding twice to the same element.
+ * Initial state is expanded by default, this can be overriden by adding class
+ *   "mw-collapsed" to the "mw-collapsible" element.
+ * - Elements made collapsible have jQuery data "mw-made-collapsible" set to true.
+ * - The inner content is wrapped in a "div.mw-collapsible-content" (except for tables and lists).
  *
- * @author Krinkle <krinklemail@gmail.com>
+ * @author Krinkle, 2011-2012
  *
  * Dual license:
  * @license CC-BY 3.0 <http://creativecommons.org/licenses/by/3.0>
@@ -21,17 +21,33 @@ $.fn.makeCollapsible = function () {
        return this.each(function () {
 
                // Define reused variables and functions
-               var $toggle,
-                       lpx = 'jquery.makeCollapsible> ',
-                       $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 ) {
+               var lpx = 'jquery.makeCollapsible> ',
+                       collapsible = this,
+                       // Ensure class "mw-collapsible" is present in case .makeCollapsible()
+                       // is called on element(s) that don't have it yet.
+                       $collapsible = $(collapsible).addClass( 'mw-collapsible' ),
+                       collapsetext = $collapsible.attr( 'data-collapsetext' ),
+                       expandtext = $collapsible.attr( 'data-expandtext' ),
+                       $toggle,
+                       $toggleLink,
+                       $firstItem,
+                       collapsibleId,
+                       $customTogglers,
+                       firstval,
+                       /**
+                        * @param {jQuery} $collapsible
+                        * @param {string} action The action this function will take ('expand' or 'collapse').
+                        * @param {jQuery|null} [optional] $defaultToggle
+                        * @param {Object|undefined} options
+                        */
+                       toggleElement = function ( $collapsible, action, $defaultToggle, options ) {
                                var $collapsibleContent, $containers;
+                               options = options || {};
 
                                // Validate parameters
-                               if ( !$collapsible.jquery ) { // $collapsible must be an instance of jQuery
+
+                               // $collapsible must be an instance of jQuery
+                               if ( !$collapsible.jquery ) {
                                        return;
                                }
                                if ( action !== 'expand' && action !== 'collapse' ) {
@@ -41,7 +57,7 @@ $.fn.makeCollapsible = function () {
                                if ( $defaultToggle === undefined ) {
                                        $defaultToggle = null;
                                }
-                               if ( $defaultToggle !== null && !($defaultToggle instanceof $) ) {
+                               if ( $defaultToggle !== null && !$defaultToggle.jquery ) {
                                        // is optional (may be undefined), but if defined it must be an instance of jQuery.
                                        // If it's not, abort right away.
                                        // After this $defaultToggle is either null or a valid jQuery instance.
@@ -55,12 +71,12 @@ $.fn.makeCollapsible = function () {
                                                // Hide all table rows of this table
                                                // Slide doens't work with tables, but fade does as of jQuery 1.1.3
                                                // http://stackoverflow.com/questions/467336#920480
-                                               $containers = $collapsible.find( '>tbody>tr' );
+                                               $containers = $collapsible.find( '> tbody > tr' );
                                                if ( $defaultToggle ) {
                                                        // Exclude tablerow containing togglelink
                                                        $containers.not( $defaultToggle.closest( 'tr' ) ).stop(true, true).fadeOut();
                                                } else {
-                                                       if ( instantHide ) {
+                                                       if ( options.instantHide ) {
                                                                $containers.hide();
                                                        } else {
                                                                $containers.stop( true, true ).fadeOut();
@@ -73,19 +89,20 @@ $.fn.makeCollapsible = function () {
                                                        // Exclude list-item containing togglelink
                                                        $containers.not( $defaultToggle.parent() ).stop( true, true ).slideUp();
                                                } else {
-                                                       if ( instantHide ) {
+                                                       if ( options.instantHide ) {
                                                                $containers.hide();
                                                        } else {
                                                                $containers.stop( true, true ).slideUp();
                                                        }
                                                }
 
-                                       } else { // <div>, <p> etc.
+                                       } else {
+                                               // <div>, <p> etc.
                                                $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
 
                                                // If a collapsible-content is defined, collapse it
                                                if ( $collapsibleContent.length ) {
-                                                       if ( instantHide ) {
+                                                       if ( options.instantHide ) {
                                                                $collapsibleContent.hide();
                                                        } else {
                                                                $collapsibleContent.slideUp();
@@ -111,7 +128,7 @@ $.fn.makeCollapsible = function () {
                                                        // Exclude tablerow containing togglelink
                                                        $containers.not( $defaultToggle.parent().parent() ).stop(true, true).fadeIn();
                                                } else {
-                                                       $containers.stop(true, true).fadeIn();
+                                                       $containers.stop( true, true ).fadeIn();
                                                }
 
                                        } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
@@ -123,7 +140,8 @@ $.fn.makeCollapsible = function () {
                                                        $containers.stop( true, true ).slideDown();
                                                }
 
-                                       } else { // <div>, <p> etc.
+                                       } else {
+                                               // <div>, <p> etc.
                                                $collapsibleContent = $collapsible.find( '> .mw-collapsible-content' );
 
                                                // If a collapsible-content is defined, collapse it
@@ -142,10 +160,15 @@ $.fn.makeCollapsible = function () {
                                        }
                                }
                        },
-                       // Toggles collapsible and togglelink class and updates text label
-                       toggleLinkDefault = function ( that, e ) {
-                               var $that = $(that),
-                                       $collapsible = $that.closest( '.mw-collapsible.mw-made-collapsible' ).toggleClass( 'mw-collapsed' );
+                       /**
+                        * Toggles collapsible and togglelink class and updates text label.
+                        *
+                        * @param {jQuery} $that
+                        * @param {jQuery.Event} e
+                        * @param {Object|undefined} options
+                        */
+                       toggleLinkDefault = function ( $that, e, options ) {
+                               var $collapsible = $that.closest( '.mw-collapsible' ).toggleClass( 'mw-collapsed' );
                                e.preventDefault();
                                e.stopPropagation();
 
@@ -159,7 +182,7 @@ $.fn.makeCollapsible = function () {
                                                $that.text( expandtext );
                                        }
                                        // Collapse element
-                                       toggleElement( $collapsible, 'collapse', $that );
+                                       toggleElement( $collapsible, 'collapse', $that, options );
 
                                // It's collapsed right now
                                } else {
@@ -171,14 +194,20 @@ $.fn.makeCollapsible = function () {
                                                $that.text( collapsetext );
                                        }
                                        // Expand element
-                                       toggleElement( $collapsible, 'expand', $that );
+                                       toggleElement( $collapsible, 'expand', $that, options );
                                }
                                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' ) ) {
+                       /**
+                        * Toggles collapsible and togglelink class.
+                        *
+                        * @param {jQuery} $that
+                        * @param {jQuery.Event} e
+                        * @param {Object|undefined} options
+                        */
+                       toggleLinkPremade = function ( $that, e, options ) {
+                               var $collapsible = $that.eq( 0 ).closest( '.mw-collapsible' ).toggleClass( 'mw-collapsed' );
+                               if ( $.nodeName( e.target, 'a' ) ) {
                                        return true;
                                }
                                e.preventDefault();
@@ -189,31 +218,45 @@ $.fn.makeCollapsible = function () {
                                        // Change toggle to collapsed
                                        $that.removeClass( 'mw-collapsible-toggle-expanded' ).addClass( 'mw-collapsible-toggle-collapsed' );
                                        // Collapse element
-                                       toggleElement( $collapsible, 'collapse', $that );
+                                       toggleElement( $collapsible, 'collapse', $that, options );
 
                                // It's collapsed right now
                                } else {
                                        // Change toggle to expanded
                                        $that.removeClass( 'mw-collapsible-toggle-collapsed' ).addClass( 'mw-collapsible-toggle-expanded' );
                                        // Expand element
-                                       toggleElement( $collapsible, 'expand', $that );
+                                       toggleElement( $collapsible, 'expand', $that, options );
                                }
                                return;
                        },
-                       // Toggles customcollapsible
-                       toggleLinkCustom = function ( $that, e, $collapsible ) {
+                       /**
+                        * Toggles customcollapsible.
+                        *
+                        * @param {jQuery} $that
+                        * @param {jQuery.Event} e
+                        * @param {Object|undefined} options
+                        * @param {jQuery} $collapsible
+                        */
+                       toggleLinkCustom = function ( $that, e, options, $collapsible ) {
                                // For the initial state call of customtogglers there is no event passed
-                               if (e) {
+                               if ( e ) {
                                        e.preventDefault();
                                        e.stopPropagation();
                                }
                                // Get current state and toggle to the opposite
                                var action = $collapsible.hasClass( 'mw-collapsed' ) ? 'expand' : 'collapse';
                                $collapsible.toggleClass( 'mw-collapsed' );
-                               toggleElement( $collapsible, action, $that );
+                               toggleElement( $collapsible, action, $that, options );
 
                        };
 
+               // Return if it has been enabled already.
+               if ( $collapsible.data( 'mw-made-collapsible' ) ) {
+                       return;
+               } else {
+                       $collapsible.data( 'mw-made-collapsible', true );
+               }
+
                // Use custom text or default ?
                if ( !collapsetext ) {
                        collapsetext = mw.msg( 'collapsible-collapse' );
@@ -223,46 +266,41 @@ $.fn.makeCollapsible = function () {
                }
 
                // Create toggle link with a space around the brackets (&nbsp;[text]&nbsp;)
-               var $toggleLink =
+               $toggleLink =
                        $( '<a href="#"></a>' )
                                .text( collapsetext )
                                .wrap( '<span class="mw-collapsible-toggle"></span>' )
-                               .parent()
-                               .prepend( '&nbsp;[' )
-                               .append( ']&nbsp;' )
-                               .on( 'click.mw-collapse', function ( e ) {
-                                       toggleLinkDefault( this, e );
-                               } );
-
-               // Return if it has been enabled already.
-               if ( $that.hasClass( 'mw-made-collapsible' ) ) {
-                       return;
-               } else {
-                       $that.addClass( 'mw-made-collapsible' );
-               }
+                                       .parent()
+                                       .prepend( '&nbsp;[' )
+                                       .append( ']&nbsp;' )
+                                       .on( 'click.mw-collapse', function ( e, options ) {
+                                               toggleLinkDefault( $(this), e, options );
+                                       } );
 
                // Check if this element has a custom position for the toggle link
                // (ie. outside the container or deeper inside the tree)
                // Then: Locate the custom toggle link(s) and bind them
-               if ( ( $that.attr( 'id' ) || '' ).indexOf( 'mw-customcollapsible-' ) === 0 ) {
+               if ( ( $collapsible.attr( 'id' ) || '' ).indexOf( 'mw-customcollapsible-' ) === 0 ) {
 
-                       var thatId = $that.attr( 'id' ),
-                               $customTogglers = $( '.' + thatId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
-                       mw.log( lpx + 'Found custom collapsible: #' + thatId );
+                       collapsibleId = $collapsible.attr( 'id' );
+                       $customTogglers = $( '.' + collapsibleId.replace( 'mw-customcollapsible', 'mw-customtoggle' ) );
+                       mw.log( lpx + 'Found custom collapsible: #' + collapsibleId );
 
                        // Double check that there is actually a customtoggle link
                        if ( $customTogglers.length ) {
-                               $customTogglers.on( 'click.mw-collapse', function ( e ) {
-                                       toggleLinkCustom( $(this), e, $that );
+                               $customTogglers.on( 'click.mw-collapse', function ( e, options ) {
+                                       toggleLinkCustom( $(this), e, options, $collapsible );
                                } );
                        } else {
-                               mw.log( lpx + '#' + thatId + ': Missing toggler!' );
+                               mw.log( lpx + '#' + collapsibleId + ': Missing toggler!' );
                        }
 
                        // Initial state
-                       if ( $that.hasClass( 'mw-collapsed' ) ) {
-                               $that.removeClass( 'mw-collapsed' );
-                               toggleLinkCustom( $customTogglers, null, $that );
+                       if ( $collapsible.hasClass( 'mw-collapsed' ) ) {
+                               // Remove here so that the toggler goes in the right direction,
+                               // It re-adds the class.
+                               $collapsible.removeClass( 'mw-collapsed' );
+                               toggleLinkCustom( $customTogglers, null, { instantHide: true }, $collapsible );
                        }
 
                // If this is not a custom case, do the default:
@@ -270,23 +308,23 @@ $.fn.makeCollapsible = function () {
                } else {
 
                        // Elements are treated differently
-                       if ( $that.is( 'table' ) ) {
+                       if ( $collapsible.is( 'table' ) ) {
                                // The toggle-link will be in one the the cells (td or th) of the first row
-                               var $firstRowCells = $that.find( 'tr:first th, tr:first td' );
-                               $toggle = $firstRowCells.find( '> .mw-collapsible-toggle' );
+                               $firstItem = $collapsible.find( 'tr:first th, tr:first td' );
+                               $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
 
                                // If theres no toggle link, add it to the last cell
                                if ( !$toggle.length ) {
-                                       $firstRowCells.eq(-1).prepend( $toggleLink );
+                                       $firstItem.eq(-1).prepend( $toggleLink );
                                } else {
-                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
-                                               toggleLinkPremade( $toggle, e );
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, options ) {
+                                               toggleLinkPremade( $toggle, e, options );
                                        } );
                                }
 
-                       } else if ( $that.is( 'ul' ) || $that.is( 'ol' ) ) {
+                       } else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
                                // The toggle-link will be in the first list-item
-                               var $firstItem = $that.find( 'li:first' );
+                               $firstItem = $collapsible.find( 'li:first' );
                                $toggle = $firstItem.find( '> .mw-collapsible-toggle' );
 
                                // If theres no toggle link, add it
@@ -294,46 +332,47 @@ $.fn.makeCollapsible = function () {
                                        // Make sure the numeral order doesn't get messed up, force the first (soon to be second) item
                                        // to be "1". Except if the value-attribute is already used.
                                        // If no value was set WebKit returns "", Mozilla returns '-1', others return null or undefined.
-                                       var firstval = $firstItem.attr( 'value' );
+                                       firstval = $firstItem.attr( 'value' );
                                        if ( firstval === undefined || !firstval || firstval === '-1' || firstval === -1 ) {
                                                $firstItem.attr( 'value', '1' );
                                        }
-                                       $that.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
+                                       $collapsible.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
                                } else {
-                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
-                                               toggleLinkPremade( $toggle, e );
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, options ) {
+                                               toggleLinkPremade( $toggle, e, options );
                                        } );
                                }
 
                        } else { // <div>, <p> etc.
 
                                // The toggle-link will be the first child of the element
-                               $toggle = $that.find( '> .mw-collapsible-toggle' );
+                               $toggle = $collapsible.find( '> .mw-collapsible-toggle' );
 
                                // If a direct child .content-wrapper does not exists, create it
-                               if ( !$that.find( '> .mw-collapsible-content' ).length ) {
-                                       $that.wrapInner( '<div class="mw-collapsible-content"></div>' );
+                               if ( !$collapsible.find( '> .mw-collapsible-content' ).length ) {
+                                       $collapsible.wrapInner( '<div class="mw-collapsible-content"></div>' );
                                }
 
                                // If theres no toggle link, add it
                                if ( !$toggle.length ) {
-                                       $that.prepend( $toggleLink );
+                                       $collapsible.prepend( $toggleLink );
                                } else {
-                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
-                                               toggleLinkPremade( $toggle, e );
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e, options ) {
+                                               toggleLinkPremade( $toggle, e, options );
                                        } );
                                }
                        }
                }
 
-               // Initial state (only for those that are not custom)
-               if ( $that.hasClass( 'mw-collapsed' ) && ( $that.attr( 'id' ) || '').indexOf( 'mw-customcollapsible-' ) !== 0 ) {
-                       $that.removeClass( 'mw-collapsed' );
+               // Initial state (only for those that are not custom,
+               // because the initial state of those has been taken care of already).
+               if ( $collapsible.hasClass( 'mw-collapsed' ) && ( $collapsible.attr( 'id' ) || '').indexOf( 'mw-customcollapsible-' ) !== 0 ) {
+                       $collapsible.removeClass( 'mw-collapsed' );
                        // The collapsible element could have multiple togglers
                        // To toggle the initial state only click one of them (ie. the first one, eq(0) )
                        // Else it would go like: hide,show,hide,show for each toggle link.
-                       toggleElement( $that, 'collapse', $toggleLink.eq(0), /* instantHide = */ true );
-                       $toggleLink.eq(0).click();
+                       // This is just like it would be in reality (only one toggle is clicked at a time).
+                       $toggleLink.eq( 0 ).trigger( 'click', [ { instantHide: true } ] );
                }
        } );
 };
index 36b6690..e286834 100644 (file)
@@ -1,12 +1,12 @@
 /**
  * JavaScript to show jump links to motor-impaired users when they are focused.
  */
-jQuery( function( $ ) {
+jQuery( function ( $ ) {
 
-       $('.mw-jump').delegate( 'a', 'focus blur', function( e ) {
-               // Confusingly jQuery leaves e.type as "focusout" for delegated blur events
-               if ( e.type === "blur" || e.type === "focusout" ) {
-                       $( this ).closest( '.mw-jump' ).css({ height: '0' });
+       $( '.mw-jump' ).on( 'focus blur', 'a', function ( e ) {
+               // Confusingly jQuery leaves e.type as focusout for delegated blur events
+               if ( e.type === 'blur' || e.type === 'focusout' ) {
+                       $( this ).closest( '.mw-jump' ).css({ height: 0 });
                } else {
                        $( this ).closest( '.mw-jump' ).css({ height: 'auto' });
                }
index bbffd7b..de39978 100644 (file)
                        return str.charAt( 0 ).toUpperCase() + str.substr( 1 );
                },
                escapeRE: function ( str ) {
-                       return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, "\\$1" );
+                       return str.replace ( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
                },
                isDomElement: function ( el ) {
                        return !!el && !!el.nodeType;
                },
                isEmpty: function ( v ) {
+                       var key;
                        if ( v === '' || v === 0 || v === '0' || v === null
                                || v === false || v === undefined )
                        {
@@ -32,7 +33,7 @@
                                return true;
                        }
                        if ( typeof v === 'object' ) {
-                               for ( var key in v ) {
+                               for ( key in v ) {
                                        return false;
                                }
                                return true;
index 1475af2..ef28948 100644 (file)
@@ -15,7 +15,7 @@
 /*global jQuery, QUnit */
 /*jshint eqeqeq:false, eqnull:false, forin:false */
 ( function ( $ ) {
-       "use strict";
+       'use strict';
 
        var util,
                hasOwn = Object.prototype.hasOwnProperty,
index 3cbdad2..e0ba647 100644 (file)
        padding: 0;
        margin: -1px -1px 0 0;
 }
+
 /* IGNORED BY IE6 */
 html > body .suggestions {
        margin: -1px 0 0 0;
 }
+
 .suggestions-special {
        position: relative;
        background-color: white;
-       font-size: 0.8em;
        cursor: pointer;
        border: solid 1px #aaaaaa;
        padding: 0;
@@ -28,14 +29,15 @@ html > body .suggestions {
        padding: 0.25em 0.25em;
        line-height: 1.25em;
 }
+
 .suggestions-results {
        background-color: white;
-       font-size: 0.8em;
        cursor: pointer;
        border: solid 1px #aaaaaa;
        padding: 0;
        margin: 0;
 }
+
 .suggestions-result {
        color: black;
        margin: 0;
@@ -43,28 +45,33 @@ html > body .suggestions {
        padding: 0.01em 0.25em;
        text-align: left;
 }
+
 .suggestions-result-current {
        background-color: #4C59A6;
        color: white;
 }
+
 .suggestions-special .special-label {
-       font-size: 0.8em;
        color: gray;
        text-align: left;
 }
+
 .suggestions-special .special-query {
        color: black;
        font-style: italic;
        text-align: left;
 }
+
 .suggestions-special .special-hover {
        background-color: silver;
 }
+
 .suggestions-result-current .special-label,
 .suggestions-result-current .special-query {
        color: white;
 }
+
 .autoellipsis-matched,
 .highlight {
        font-weight: bold;
-}
\ No newline at end of file
+}
index dff5535..edc18a7 100644 (file)
  *
  * Options:
  *
- * fetch(query): Callback that should fetch suggestions and set the suggestions property. Executed in the context of the
- *             textbox
+ * fetch(query): Callback that should fetch suggestions and set the suggestions property.
+ *      Executed in the context of the textbox
  *             Type: Function
- * cancel: Callback function to call when any pending asynchronous suggestions fetches should be canceled.
- *             Executed in the context of the textbox
+ * cancel: Callback function to call when any pending asynchronous suggestions fetches
+ *      should be canceled. Executed in the context of the textbox
  *             Type: Function
  * special: Set of callbacks for rendering and selecting
  *             Type: Object of Functions 'render' and 'select'
  *             Type: Number, Range: 0 - 1200, Default: 120
  * submitOnClick: Whether to submit the form containing the textbox when a suggestion is clicked
  *             Type: Boolean, Default: false
- * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set to e.g. 2, the suggestions box
- *             will never be grown beyond 2 times the width of the textbox.
+ * maxExpandFactor: Maximum suggestions box width relative to the textbox width. If set
+ *      to e.g. 2, the suggestions box will never be grown beyond 2 times the width of the textbox.
  *             Type: Number, Range: 1 - infinity, Default: 3
- * positionFromLeft: Whether to position the suggestion box with the left attribute or the right
+ * expandFrom: Which direction to offset the suggestion box from.
+ *      Values 'start' and 'end' translate to left and right respectively depending on the
+ *      directionality of the current document, according to $( 'html' ).css( 'direction' ).
+ *      Type: String, default: 'auto', options: 'left', 'right', 'start', 'end', 'auto'.
+ * positionFromLeft: Sets expandFrom=left, for backwards compatibility
  *             Type: Boolean, Default: true
  * highlightInput: Whether to hightlight matched portions of the input or not
  *             Type: Boolean, Default: false
@@ -56,18 +60,22 @@ $.suggestions = {
                        context.config.cancel.call( context.data.$textbox );
                }
        },
+
        /**
-        * Restore the text the user originally typed in the textbox, before it was overwritten by highlight(). This
-        * restores the value the currently displayed suggestions are based on, rather than the value just before
+        * Restore the text the user originally typed in the textbox, before it
+        * was overwritten by highlight(). This restores the value the currently
+        * displayed suggestions are based on, rather than the value just before
         * highlight() overwrote it; the former is arguably slightly more sensible.
         */
        restore: function ( context ) {
                context.data.$textbox.val( context.data.prevText );
        },
+
        /**
-        * Ask the user-specified callback for new suggestions. Any previous delayed call to this function still pending
-        * will be canceled. If the value in the textbox is empty or hasn't changed since the last time suggestions were fetched, this
-        * function does nothing.
+        * Ask the user-specified callback for new suggestions. Any previous delayed
+        * call to this function still pending will be canceled. If the value in the
+        * textbox is empty or hasn't changed since the last time suggestions were fetched,
+        * this function does nothing.
         * @param {Boolean} delayed Whether or not to delay this by the currently configured amount of time
         */
        update: function ( context, delayed ) {
@@ -97,6 +105,7 @@ $.suggestions = {
                }
                $.suggestions.special( context );
        },
+
        special: function ( context ) {
                // Allow custom rendering - but otherwise don't do any rendering
                if ( typeof context.config.special.render === 'function' ) {
@@ -108,12 +117,17 @@ $.suggestions = {
                        }, 1 );
                }
        },
+
        /**
         * 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 ) {
+               var newCSS,
+                       $autoEllipseMe, $result, $results, $span,
+                       i, expWidth, matchedText, maxWidth, text;
+
                // Validate creation using fallback values
                switch( property ) {
                        case 'fetch':
@@ -121,6 +135,7 @@ $.suggestions = {
                        case 'special':
                        case 'result':
                        case '$region':
+                       case 'expandFrom':
                                context.config[property] = value;
                                break;
                        case 'suggestions':
@@ -134,36 +149,96 @@ $.suggestions = {
                                                // Rebuild the suggestions list
                                                context.data.$container.show();
                                                // Update the size and position of the list
-                                               var newCSS = {
+                                               newCSS = {
                                                        top: context.config.$region.offset().top + context.config.$region.outerHeight(),
                                                        bottom: 'auto',
                                                        width: context.config.$region.outerWidth(),
                                                        height: 'auto'
                                                };
-                                               if ( context.config.positionFromLeft ) {
+
+                                               // Process expandFrom, after this it is set to left or right.
+                                               context.config.expandFrom = ( function ( expandFrom ) {
+                                                       var regionWidth, docWidth, regionCenter, docCenter,
+                                                               docDir = $( document.documentElement ).css( 'direction' ),
+                                                               $region = context.config.$region;
+
+                                                       // Backwards compatible
+                                                       if ( context.config.positionFromLeft ) {
+                                                               expandFrom = 'left';
+
+                                                       // Catch invalid values, default to 'auto'
+                                                       } else if ( $.inArray( expandFrom, ['left', 'right', 'start', 'end', 'auto'] ) === -1 ) {
+                                                               expandFrom = 'auto';
+                                                       }
+
+                                                       if ( expandFrom === 'auto' ) {
+                                                               if ( $region.data( 'searchsuggest-expand-dir' ) ) {
+                                                                       // If the markup explicitly contains a direction, use it.
+                                                                       expandFrom = $region.data( 'searchsuggest-expand-dir' );
+                                                               } else {
+                                                                       regionWidth = $region.outerWidth();
+                                                                       docWidth = $( document ).width();
+                                                                       if ( ( regionWidth / docWidth  ) > 0.85 ) {
+                                                                               // If the input size takes up more than 85% of the document horizontally
+                                                                               // expand the suggestions to the writing direction's native end.
+                                                                               expandFrom = 'start';
+                                                                       } else {
+                                                                               // Calculate the center points of the input and document
+                                                                               regionCenter = $region.offset().left + regionWidth / 2;
+                                                                               docCenter = docWidth / 2;
+                                                                               if ( Math.abs( regionCenter - docCenter ) / docCenter < 0.10 ) {
+                                                                                       // If the input's center is within 10% of the document center
+                                                                                       // use the writing direction's native end.
+                                                                                       expandFrom = 'start';
+                                                                               } else {
+                                                                                       // Otherwise expand the input from the closest side of the page,
+                                                                                       // towards the side of the page with the most free open space
+                                                                                       expandFrom = regionCenter > docCenter ? 'right' : 'left';
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+
+                                                       if ( expandFrom === 'start' ) {
+                                                               expandFrom = docDir === 'rtl' ? 'right': 'left';
+
+                                                       } else if ( expandFrom === 'end' ) {
+                                                               expandFrom = docDir === 'rtl' ? 'left': 'right';
+                                                       }
+
+                                                       return expandFrom;
+
+                                               }( context.config.expandFrom ) );
+
+                                               if ( context.config.expandFrom === 'left' ) {
+                                                       // Expand from left
                                                        newCSS.left = context.config.$region.offset().left;
                                                        newCSS.right = 'auto';
                                                } else {
+                                                       // Expand from right
                                                        newCSS.left = 'auto';
                                                        newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
                                                }
+
                                                context.data.$container.css( newCSS );
-                                               var $results = context.data.$container.children( '.suggestions-results' );
+                                               $results = context.data.$container.children( '.suggestions-results' );
                                                $results.empty();
-                                               var expWidth = -1;
-                                               var $autoEllipseMe = $( [] );
-                                               var matchedText = null;
-                                               for ( var i = 0; i < context.config.suggestions.length; i++ ) {
+                                               expWidth = -1;
+                                               $autoEllipseMe = $( [] );
+                                               matchedText = null;
+                                               for ( i = 0; i < context.config.suggestions.length; i++ ) {
                                                        /*jshint loopfunc:true */
-                                                       var text = context.config.suggestions[i];
-                                                       var $result = $( '<div>' )
+                                                       text = context.config.suggestions[i];
+                                                       $result = $( '<div>' )
                                                                .addClass( 'suggestions-result' )
                                                                .attr( 'rel', i )
                                                                .data( 'text', context.config.suggestions[i] )
-                                                               .mousemove( function ( e ) {
+                                                               .mousemove( function () {
                                                                        context.data.selectedWithMouse = true;
                                                                        $.suggestions.highlight(
-                                                                               context, $(this).closest( '.suggestions-results div' ), false
+                                                                               context,
+                                                                               $(this).closest( '.suggestions-results div' ),
+                                                                               false
                                                                        );
                                                                } )
                                                                .appendTo( $results );
@@ -182,7 +257,7 @@ $.suggestions = {
 
                                                                // Widen results box if needed
                                                                // New width is only calculated here, applied later
-                                                               var $span = $result.children( 'span' );
+                                                               $span = $result.children( 'span' );
                                                                if ( $span.outerWidth() > $result.width() && $span.outerWidth() > expWidth ) {
                                                                        // factor in any padding, margin, or border space on the parent
                                                                        expWidth = $span.outerWidth() + ( context.data.$container.width() - $span.parent().width());
@@ -192,11 +267,15 @@ $.suggestions = {
                                                }
                                                // Apply new width for results box, if any
                                                if ( expWidth > context.data.$container.width() ) {
-                                                       var maxWidth = context.config.maxExpandFactor*context.data.$textbox.width();
+                                                       maxWidth = context.config.maxExpandFactor*context.data.$textbox.width();
                                                        context.data.$container.width( Math.min( expWidth, maxWidth ) );
                                                }
                                                // autoEllipse the results. Has to be done after changing the width
-                                               $autoEllipseMe.autoEllipsis( { hasSpan: true, tooltip: true, matchText: matchedText } );
+                                               $autoEllipseMe.autoEllipsis( {
+                                                       hasSpan: true,
+                                                       tooltip: true,
+                                                       matchText: matchedText
+                                               } );
                                        }
                                }
                                break;
@@ -216,6 +295,7 @@ $.suggestions = {
                                break;
                }
        },
+
        /**
         * Highlight a result in the results table
         * @param result <tr> to highlight: jQuery object, or 'prev' or 'next'
@@ -274,13 +354,16 @@ $.suggestions = {
                        context.data.$textbox.trigger( 'change' );
                }
        },
+
        /**
         * Respond to keypress event
         * @param key Integer Code of key pressed
         */
        keypress: function ( e, context, key ) {
-               var wasVisible = context.data.$container.is( ':visible' ),
+               var selected,
+                       wasVisible = context.data.$container.is( ':visible' ),
                        preventDefault = false;
+
                switch ( key ) {
                        // Arrow down
                        case 40:
@@ -312,7 +395,7 @@ $.suggestions = {
                        case 13:
                                context.data.$container.hide();
                                preventDefault = wasVisible;
-                               var selected = context.data.$container.find( '.suggestions-result-current' );
+                               selected = context.data.$container.find( '.suggestions-result-current' );
                                if ( selected.length === 0 || context.data.selectedWithMouse ) {
                                        // if nothing is selected OR if something was selected with the mouse,
                                        // cancel any current requests and submit the form
@@ -344,29 +427,30 @@ $.suggestions = {
 $.fn.suggestions = function () {
 
        // Multi-context fields
-       var returnValue;
-       var args = arguments;
+       var returnValue,
+               args = arguments;
 
        $(this).each( function () {
+               var context, key;
 
                /* Construction / Loading */
 
-               var context = $(this).data( 'suggestions-context' );
+               context = $(this).data( 'suggestions-context' );
                if ( context === undefined || context === null ) {
                        context = {
                                config: {
-                                       'fetch' : function () {},
-                                       'cancel': function () {},
-                                       'special': {},
-                                       'result': {},
-                                       '$region': $(this),
-                                       'suggestions': [],
-                                       'maxRows': 7,
-                                       'delay': 120,
-                                       'submitOnClick': false,
-                                       'maxExpandFactor': 3,
-                                       'positionFromLeft': true,
-                                       'highlightInput': false
+                                       fetch: function () {},
+                                       cancel: function () {},
+                                       special: {},
+                                       result: {},
+                                       $region: $(this),
+                                       suggestions: [],
+                                       maxRows: 7,
+                                       delay: 120,
+                                       submitOnClick: false,
+                                       maxExpandFactor: 3,
+                                       expandFrom: 'auto',
+                                       highlightInput: false
                                }
                        };
                }
@@ -377,7 +461,7 @@ $.fn.suggestions = function () {
                if ( args.length > 0 ) {
                        if ( typeof args[0] === 'object' ) {
                                // Apply set of properties
-                               for ( var key in args[0] ) {
+                               for ( key in args[0] ) {
                                        $.suggestions.configure( context, key, args[0][key] );
                                }
                        } else if ( typeof args[0] === 'string' ) {
@@ -409,33 +493,22 @@ $.fn.suggestions = function () {
                                $textbox: $(this),
                                selectedWithMouse: false
                        };
-                       // Setup the css for positioning the results box
-                       var newCSS = {
-                               top: Math.round( context.data.$textbox.offset().top + context.data.$textbox.outerHeight() ),
-                               width: context.data.$textbox.outerWidth(),
-                               display: 'none'
-                       };
-                       if ( context.config.positionFromLeft ) {
-                               newCSS.left = context.config.$region.offset().left;
-                               newCSS.right = 'auto';
-                       } else {
-                               newCSS.left = 'auto';
-                               newCSS.right = $( 'body' ).width() - ( context.config.$region.offset().left + context.config.$region.outerWidth() );
-                       }
 
                        context.data.$container = $( '<div>' )
-                               .css( newCSS )
+                               .css( 'display', 'none' )
                                .addClass( 'suggestions' )
                                .append(
                                        $( '<div>' ).addClass( 'suggestions-results' )
-                                               // Can't use click() because the container div is hidden when the textbox loses focus. Instead,
-                                               // listen for a mousedown followed by a mouseup on the same div
+                                               // Can't use click() because the container div is hidden when the
+                                               // textbox loses focus. Instead, listen for a mousedown followed
+                                               // by a mouseup on the same div.
                                                .mousedown( function ( e ) {
                                                        context.data.mouseDownOn = $( e.target ).closest( '.suggestions-results div' );
                                                } )
                                                .mouseup( function ( e ) {
-                                                       var $result = $( e.target ).closest( '.suggestions-results div' );
-                                                       var $other = context.data.mouseDownOn;
+                                                       var $result = $( e.target ).closest( '.suggestions-results div' ),
+                                                               $other = context.data.mouseDownOn;
+
                                                        context.data.mouseDownOn = $( [] );
                                                        if ( $result.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
@@ -450,14 +523,16 @@ $.fn.suggestions = function () {
                                )
                                .append(
                                        $( '<div>' ).addClass( 'suggestions-special' )
-                                               // Can't use click() because the container div is hidden when the textbox loses focus. Instead,
-                                               // listen for a mousedown followed by a mouseup on the same div
+                                               // Can't use click() because the container div is hidden when the
+                                               // textbox loses focus. Instead, listen for a mousedown followed
+                                               // by a mouseup on the same div.
                                                .mousedown( function ( e ) {
                                                        context.data.mouseDownOn = $( e.target ).closest( '.suggestions-special' );
                                                } )
                                                .mouseup( function ( e ) {
-                                                       var $special = $( e.target ).closest( '.suggestions-special' );
-                                                       var $other = context.data.mouseDownOn;
+                                                       var $special = $( e.target ).closest( '.suggestions-special' ),
+                                                               $other = context.data.mouseDownOn;
+
                                                        context.data.mouseDownOn = $( [] );
                                                        if ( $special.get( 0 ) !== $other.get( 0 ) ) {
                                                                return;
@@ -476,6 +551,7 @@ $.fn.suggestions = function () {
                                                } )
                                )
                                .appendTo( $( 'body' ) );
+
                        $(this)
                                // Stop browser autocomplete from interfering
                                .attr( 'autocomplete', 'off')
@@ -521,6 +597,7 @@ $.fn.suggestions = function () {
                                        $.suggestions.cancel( context );
                                } );
                }
+
                // Store the context for next time
                $(this).data( 'suggestions-context', context );
        } );
index 3ef71d5..6297f9a 100644 (file)
@@ -19,6 +19,9 @@
  * @example $( 'table' ).tablesorter();
  * @desc Create a simple tablesorter interface.
  *
+ * @example $( 'table' ).tablesorter( { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] } );
+ * @desc Create a tablesorter interface initially sorting on the first and second column.
+ *
  * @option String cssHeader ( optional ) A string of the class name to be appended
  *         to sortable tr elements in the thead of the table. Default value:
  *         "header"
  *         tablesorter should cancel selection of the table headers text.
  *         Default value: true
  *
+ * @option Array sortList ( optional ) An array containing objects specifying sorting.
+ *         By passing more than one object, multi-sorting will be applied. Object structure:
+ *         { <Integer column index>: <String 'asc' or 'desc'> }
+ *         Default value: []
+ *
  * @option Boolean debug ( optional ) Boolean flag indicating if tablesorter
  *         should display debuging information usefull for development.
  *
+ * @event sortEnd.tablesorter: Triggered as soon as any sorting has been applied.
+ *
  * @type jQuery
  *
  * @name tablesorter
@@ -57,6 +67,7 @@
  */
 
 ( function ( $, mw ) {
+       /*jshint onevar:false */
 
        /* Local scope */
 
 
                        for ( i = 0; i < len; i++ ) {
                                parser = false;
-                               sortType = $headers.eq( i ).data( 'sort-type' );
+                               sortType = $headers.eq( i ).data( 'sortType' );
                                if ( sortType !== undefined ) {
                                        parser = getParserById( sortType );
                                }
 
                }
                table.tBodies[0].appendChild( fragment );
+
+               $( table ).trigger( 'sortEnd.tablesorter' );
        }
 
        /**
                        }
 
                        if ( !this.sortDisabled ) {
-                               var $th = $( this ).addClass( table.config.cssHeader ).attr( 'title', msg[1] );
+                               $( this ).addClass( table.config.cssHeader ).attr( 'title', msg[1] );
                        }
 
                        // add cell to headerList
                return false;
        }
 
-       function setHeadersCss( table, $headers, list, css, msg ) {
-               // Remove all header information
-               $headers.removeClass( css[0] ).removeClass( css[1] );
-
-               var h = [];
-               $headers.each( function ( offset ) {
-                       if ( !this.sortDisabled ) {
-                               h[this.column] = $( this );
-                       }
-               } );
+       function setHeadersCss( table, $headers, list, css, msg, columnToHeader ) {
+               // Remove all header information and reset titles to default message
+               $headers.removeClass( css[0] ).removeClass( css[1] ).attr( 'title', msg[1] );
 
-               var l = list.length;
-               for ( var i = 0; i < l; i++ ) {
-                       h[ list[i][0] ].addClass( css[ list[i][1] ] ).attr( 'title', msg[ list[i][1] ] );
+               for ( var i = 0; i < list.length; i++ ) {
+                       $headers.eq( columnToHeader[ list[i][0] ] )
+                               .addClass( css[ list[i][1] ] )
+                               .attr( 'title', msg[ list[i][1] ] );
                }
        }
 
                        ts.transformTable = {};
 
                        // Unpack the transform table
-                       var ascii = separatorTransformTable[0].split( "\t" ).concat( digitTransformTable[0].split( "\t" ) );
-                       var localised = separatorTransformTable[1].split( "\t" ).concat( digitTransformTable[1].split( "\t" ) );
+                       var ascii = separatorTransformTable[0].split( '\t' ).concat( digitTransformTable[0].split( '\t' ) );
+                       var localised = separatorTransformTable[1].split( '\t' ).concat( digitTransformTable[1].split( '\t' ) );
 
                        // Construct regex for number identification
                        for ( var i = 0; i < ascii.length; i++ ) {
 
                // We allow a trailing percent sign, which we just strip. This works fine
                // if percents and regular numbers aren't being mixed.
-               ts.numberRegex = new RegExp("^(" + "[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?" + // Fortran-style scientific
-               "|" + "[-+\u2212]?" + digitClass + "+[\\s\\xa0]*%?" + // Generic localised
-               ")$", "i");
+               ts.numberRegex = new RegExp('^(' + '[-+\u2212]?[0-9][0-9,]*(\\.[0-9,]*)?(E[-+\u2212]?[0-9][0-9,]*)?' + // Fortran-style scientific
+               '|' + '[-+\u2212]?' + digitClass + '+[\\s\\xa0]*%?' + // Generic localised
+               ')$', 'i');
        }
 
        function buildDateTable() {
                };
        }
 
+       /**
+        * Converts sort objects [ { Integer: String }, ... ] to the internally used nested array
+        * structure [ [ Integer , Integer ], ... ]
+        *
+        * @param sortObjects {Array} List of sort objects.
+        * @return {Array} List of internal sort definitions.
+        */
+
+       function convertSortList( sortObjects ) {
+               var sortList = [];
+               $.each( sortObjects, function( i, sortObject ) {
+                       $.each ( sortObject, function( columnIndex, order ) {
+                               var orderIndex = ( order === 'desc' ) ? 1 : 0;
+                               sortList.push( [columnIndex, orderIndex] );
+                       } );
+               } );
+               return sortList;
+       }
+
        /* Public scope */
 
        $.tablesorter = {
                        construct: function ( $tables, settings ) {
                                return $tables.each( function ( i, table ) {
                                        // Declare and cache.
-                                       var $document, $headers, cache, config, sortOrder,
+                                       var $headers, cache, config,
+                                               headerToColumns, columnToHeader, colspanOffset,
                                                $table = $( table ),
-                                               shiftDown = 0,
                                                firstTime = true;
 
                                        // Quit if no tbody
                                                        return;
                                                }
                                        }
-                                       $table.addClass( "jquery-tablesorter" );
+                                       $table.addClass( 'jquery-tablesorter' );
 
+                                       // FIXME config should probably not be stored in the plain table node
                                        // New config object.
                                        table.config = {};
 
                                        config = $.extend( table.config, $.tablesorter.defaultOptions, settings );
 
                                        // Save the settings where they read
-                                       $.data( table, 'tablesorter', config );
+                                       $.data( table, 'tablesorter', { config: config } );
 
                                        // Get the CSS class names, could be done else where.
                                        var sortCSS = [ config.cssDesc, config.cssAsc ];
                                        // performance improvements in some browsers.
                                        cacheRegexs();
 
+                                       function setupForFirstSort() {
+                                               firstTime = false;
+
+                                               // Legacy fix of .sortbottoms
+                                               // Wrap them inside inside a tfoot (because that's what they actually want to be) &
+                                               // and put the <tfoot> at the end of the <table>
+                                               var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
+                                               if ( $sortbottoms.length ) {
+                                                       var $tfoot = $table.children( 'tfoot' );
+                                                       if ( $tfoot.length ) {
+                                                               $tfoot.eq(0).prepend( $sortbottoms );
+                                                       } else {
+                                                               $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
+                                                       }
+                                               }
+
+                                               explodeRowspans( $table );
+
+                                               // try to auto detect column type, and store in tables config
+                                               table.config.parsers = buildParserCache( table, $headers );
+                                       }
+
+                                       // as each header can span over multiple columns (using colspan=N),
+                                       // we have to bidirectionally map headers to their columns and columns to their headers
+                                       headerToColumns = [];
+                                       columnToHeader = [];
+                                       colspanOffset = 0;
+                                       $headers.each( function ( headerIndex ) {
+                                               var columns = [];
+                                               for ( var i = 0; i < this.colSpan; i++ ) {
+                                                       columnToHeader[ colspanOffset + i ] = headerIndex;
+                                                       columns.push( colspanOffset + i );
+                                               }
+
+                                               headerToColumns[ headerIndex ] = columns;
+                                               colspanOffset += this.colSpan;
+                                       } );
+
                                        // Apply event handling to headers
                                        // this is too big, perhaps break it out?
-                                       $headers.click( function ( e ) {
+                                       $headers.filter( ':not(.unsortable)' ).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
                                                }
 
                                                if ( firstTime ) {
-                                                       firstTime = false;
-
-                                                       // Legacy fix of .sortbottoms
-                                                       // Wrap them inside inside a tfoot (because that's what they actually want to be) &
-                                                       // and put the <tfoot> at the end of the <table>
-                                                       var $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
-                                                       if ( $sortbottoms.length ) {
-                                                               var $tfoot = $table.children( 'tfoot' );
-                                                               if ( $tfoot.length ) {
-                                                                       $tfoot.eq(0).prepend( $sortbottoms );
-                                                               } else {
-                                                                       $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
-                                                               }
-                                                       }
-
-                                                       explodeRowspans( $table );
-                                                       // try to auto detect column type, and store in tables config
-                                                       table.config.parsers = buildParserCache( table, $headers );
+                                                       setupForFirstSort();
                                                }
 
                                                // Build the cache for the tbody cells
 
                                                var totalRows = ( $table[0].tBodies[0] && $table[0].tBodies[0].rows.length ) || 0;
                                                if ( !table.sortDisabled && totalRows > 0 ) {
-
-                                                       // Cache jQuery object
-                                                       var $cell = $( this );
-
-                                                       // Get current column index
-                                                       var i = this.column;
-
                                                        // Get current column sort order
                                                        this.order = this.count % 2;
                                                        this.count++;
 
-                                                       // User only wants to sort on one column
-                                                       if ( !e[config.sortMultiSortKey] ) {
-                                                               // Flush the sort list
-                                                               config.sortList = [];
-                                                               // Add column to sort list
-                                                               config.sortList.push( [i, this.order] );
+                                                       var cell = this;
+                                                       // Get current column index
+                                                       var columns = headerToColumns[this.column];
+                                                       var newSortList = $.map( columns, function (c) {
+                                                               // jQuery "helpfully" flattens the arrays...
+                                                               return [[c, cell.order]];
+                                                       });
+                                                       // Index of first column belonging to this header
+                                                       var i = columns[0];
 
-                                                       // Multi column sorting
+                                                       if ( !e[config.sortMultiSortKey] ) {
+                                                               // User only wants to sort on one column set
+                                                               // Flush the sort list and add new columns
+                                                               config.sortList = newSortList;
                                                        } else {
-                                                               // The user has clicked on an already sorted column.
+                                                               // Multi column sorting
+                                                               // It is not possible for one column to belong to multiple headers,
+                                                               // so this is okay - we don't need to check for every value in the columns array
                                                                if ( isValueInArray( i, config.sortList ) ) {
+                                                                       // The user has clicked on an already sorted column.
                                                                        // Reverse the sorting direction for all tables.
                                                                        for ( var j = 0; j < config.sortList.length; j++ ) {
                                                                                var s = config.sortList[j],
                                                                                        o = config.headerList[s[0]];
-                                                                               if ( s[0] === i ) {
+                                                                               if ( isValueInArray( s[0], newSortList ) ) {
                                                                                        o.count = s[1];
                                                                                        o.count++;
                                                                                        s[1] = o.count % 2;
                                                                                }
                                                                        }
                                                                } else {
-                                                                       // Add column to sort list array
-                                                                       config.sortList.push( [i, this.order] );
+                                                                       // Add columns to sort list array
+                                                                       config.sortList = config.sortList.concat( newSortList );
                                                                }
                                                        }
 
                                                        // Set CSS for headers
-                                                       setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg );
+                                                       setHeadersCss( $table[0], $headers, config.sortList, sortCSS, sortMsg, columnToHeader );
                                                        appendToTable(
                                                                $table[0], multisort( $table[0], config.sortList, cache )
                                                        );
                                                        return false;
                                                }
                                        } );
+
+                                       /**
+                                        * Sorts the table. If no sorting is specified by passing a list of sort
+                                        * objects, the table is sorted according to the initial sorting order.
+                                        * Passing an empty array will reset sorting (basically just reset the headers
+                                        * making the table appear unsorted).
+                                        *
+                                        * @param sortList {Array} (optional) List of sort objects.
+                                        */
+                                       $table.data( 'tablesorter' ).sort = function( sortList ) {
+
+                                               if ( firstTime ) {
+                                                       setupForFirstSort();
+                                               }
+
+                                               if ( sortList === undefined ) {
+                                                       sortList = config.sortList;
+                                               } else if ( sortList.length > 0 ) {
+                                                       sortList = convertSortList( sortList );
+                                               }
+
+                                               // re-build the cache for the tbody cells
+                                               cache = buildCache( table );
+
+                                               // set css for headers
+                                               setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, columnToHeader );
+
+                                               // sort the table and append it to the dom
+                                               appendToTable( table, multisort( table, sortList, cache ) );
+                                       };
+
+                                       // sort initially
+                                       if ( config.sortList.length > 0 ) {
+                                               setupForFirstSort();
+                                               config.sortList = convertSortList( config.sortList );
+                                               $table.data( 'tablesorter' ).sort();
+                                       }
+
                                } );
                        },
 
                        },
 
                        formatDigit: function ( s ) {
+                               var out, c, p, i;
                                if ( ts.transformTable !== false ) {
-                                       var out = '',
-                                               c;
-                                       for ( var p = 0; p < s.length; p++ ) {
+                                       out = '';
+                                       for ( p = 0; p < s.length; p++ ) {
                                                c = s.charAt(p);
                                                if ( c in ts.transformTable ) {
                                                        out += ts.transformTable[c];
                                        }
                                        s = out;
                                }
-                               var i = parseFloat( s.replace( /[, ]/g, '' ).replace( "\u2212", '-' ) );
-                               return ( isNaN(i)) ? 0 : i;
+                               i = parseFloat( s.replace( /[, ]/g, '' ).replace( '\u2212', '-' ) );
+                               return isNaN( i ) ? 0 : i;
                        },
 
                        formatFloat: function ( s ) {
                                var i = parseFloat(s);
-                               return ( isNaN(i)) ? 0 : i;
+                               return isNaN( i ) ? 0 : i;
                        },
 
                        formatInt: function ( s ) {
                                var i = parseInt( s, 10 );
-                               return ( isNaN(i)) ? 0 : i;
+                               return isNaN( i ) ? 0 : i;
                        },
 
                        clearTableBody: function ( table ) {
-                               if ( $.browser.msie ) {
-                                       var empty = function ( el ) {
-                                               while ( el.firstChild ) {
-                                                       el.removeChild( el.firstChild );
-                                               }
-                                       };
-                                       empty( table.tBodies[0] );
-                               } else {
-                                       table.tBodies[0].innerHTML = '';
-                               }
+                               $( table.tBodies[0] ).empty();
                        }
                };
 
        // Add default parsers
        ts.addParser( {
                id: 'text',
-               is: function ( s ) {
+               is: function () {
                        return true;
                },
                format: 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 ) {
                        var match;
                        s = $.trim( s.toLowerCase() );
 
                                        s = [ match[3], match[1], match[2] ];
                                } else if ( mw.config.get( 'wgDefaultDateFormat' ) === 'dmy' ) {
                                        s = [ match[3], match[2], match[1] ];
+                               } else {
+                                       // If we get here, we don't know which order the dd-dd-dddd
+                                       // date is in. So return something not entirely invalid.
+                                       return '99999999';
                                }
                        } else if ( ( match = s.match( ts.dateRegex[1] ) ) !== null ) {
                                s = [ match[3], '' + ts.monthNames[match[2]], match[1] ];
 
        ts.addParser( {
                id: 'number',
-               is: function ( s, table ) {
+               is: function ( s ) {
                        return $.tablesorter.numberRegex.test( $.trim( s ));
                },
                format: function ( s ) {
index abb0fa3..17fd0cd 100644 (file)
        }
 
        $.fn.textSelection = function ( command, options ) {
+               var fn,
+                       context,
+                       hasIframe,
+                       needSave,
+                       retval;
 
                /**
                 * Helper function to get an IE TextRange object for an element
@@ -52,7 +57,7 @@
                        }
                }
 
-               var fn = {
+               fn = {
                        /**
                         * Get the contents of the textarea
                         */
                                                        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";
+                                                       if ( range2.text !== '\r' && range2.text !== '\n' && range2.text !== '' ) {
+                                                               insertText = '\n' + insertText;
+                                                               pre += '\n';
                                                        }
                                                        range3 = document.selection.createRange();
                                                        range3.collapse( false );
                                                        range3.moveEnd( 'character', 1 );
-                                                       if ( range3.text !== "\r" && range3.text !== "\n" && range3.text !== "" ) {
-                                                               insertText += "\n";
-                                                               post += "\n";
+                                                       if ( range3.text !== '\r' && range3.text !== '\n' && range3.text !== '' ) {
+                                                               insertText += '\n';
+                                                               post += '\n';
                                                        }
                                                }
 
                                                        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 ( 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";
+                                                       if ( this.value.charAt( endPos ) !== '\n' && this.value.charAt( endPos ) !== '\r' ) {
+                                                               insertText += '\n';
+                                                               post += '\n';
                                                        }
                                                }
                                                this.value = this.value.substring( 0, startPos ) + insertText +
                                                // 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" );
+                                                       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;
                         */
                         getCaretPosition: function ( options ) {
                                function getCaret( e ) {
-                                       var caretPos = 0, endPos = 0;
+                                       var caretPos = 0,
+                                               endPos = 0,
+                                               preText, rawPreText, periText,
+                                               rawPeriText, postText, rawPostText,
+                                               // IE Support
+                                               preFinished,
+                                               periFinished,
+                                               postFinished,
+                                               // Range containing text in the selection
+                                               periRange,
+                                               // Range containing text before the selection
+                                               preRange,
+                                               // Range containing text after the selection
+                                               postRange;
+
                                        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
                                                // whatever we do later (bug 31847).
                                                activateElementOnIE( e );
 
-                                               var
-                                                       preText, rawPreText, periText,
-                                                       rawPeriText, postText, rawPostText,
-
-                                                       // IE Support
-                                                       preFinished = false,
-                                                       periFinished = false,
-                                                       postFinished = false,
-                                                       // Range containing text in the selection
-                                                       periRange = document.selection.createRange().duplicate(),
-                                                       // Range containing text before the selection
-                                                       preRange,
-                                                       // Range containing text after the selection
-                                                       postRange;
+                                               preFinished = false;
+                                               periFinished = false;
+                                               postFinished = false;
+                                               periRange = document.selection.createRange().duplicate();
 
                                                preRange = rangeForElementIE( e ),
                                                // Move the end where we need it
                                                                } else {
                                                                        preRange.moveEnd( 'character', -1 );
                                                                        if ( preRange.text === preText ) {
-                                                                               rawPreText += "\r\n";
+                                                                               rawPreText += '\r\n';
                                                                        } else {
                                                                                preFinished = true;
                                                                        }
                                                                } else {
                                                                        periRange.moveEnd( 'character', -1 );
                                                                        if ( periRange.text === periText ) {
-                                                                               rawPeriText += "\r\n";
+                                                                               rawPeriText += '\r\n';
                                                                        } else {
                                                                                periFinished = true;
                                                                        }
                                                                } else {
                                                                        postRange.moveEnd( 'character', -1 );
                                                                        if ( postRange.text === postText ) {
-                                                                               rawPostText += "\r\n";
+                                                                               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;
+                                               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;
                                        return Math.floor( e.scrollWidth / ( $.client.profile().platform === 'linux' ? 7 : 8 ) );
                                }
                                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;
+                                       var i, j,
+                                               nextSpace,
+                                               text = e.value.replace( /\r/g, '' ),
+                                               caret = $( e ).textSelection( 'getCaretPosition' ),
+                                               lineLength = getLineLength( e ),
+                                               row = 0,
+                                               charInLine = 0,
+                                               lastSpaceInLine = 0;
+
                                        for ( i = 0; i < caret; i++ ) {
                                                charInLine++;
                                                if ( text.charAt( i ) === ' ' ) {
                                                        lastSpaceInLine = charInLine;
-                                               } else if ( text.charAt( i ) === "\n" ) {
+                                               } else if ( text.charAt( i ) === '\n' ) {
                                                        lastSpaceInLine = 0;
                                                        charInLine = 0;
                                                        row++;
                                                        }
                                                }
                                        }
-                                       var nextSpace = 0;
+                                       nextSpace = 0;
                                        for ( j = caret; j < caret + lineLength; j++ ) {
                                                if (
                                                        text.charAt( j ) === ' ' ||
-                                                       text.charAt( j ) === "\n" ||
+                                                       text.charAt( j ) === '\n' ||
                                                        caret === text.length
                                                ) {
                                                        nextSpace = j;
                                break;
                }
 
-               var context = $(this).data( 'wikiEditor-context' );
-               var hasIframe = typeof context !== 'undefined' && context && typeof context.$iframe !== 'undefined';
+               context = $(this).data( 'wikiEditor-context' );
+               hasIframe = context !== undefined && context && context.$iframe !== undefined;
 
                // IE selection restore voodoo
-               var needSave = false;
+               needSave = false;
                if ( hasIframe && context.savedSelection !== null ) {
                        context.fn.restoreSelection();
                        needSave = true;
                }
-               var retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
+               retval = ( hasIframe ? context.fn : fn )[command].call( this, options );
                if ( hasIframe && needSave ) {
                        context.fn.saveSelection();
                }
index 1c51c97..2835c9c 100644 (file)
@@ -71,7 +71,7 @@
                 * Apply tagOpen/tagClose to selection in textarea,
                 * use sampleText instead of selection if there is none.
                 */
-               insertTags: function ( tagOpen, tagClose, sampleText, selectText ) {
+               insertTags: function ( tagOpen, tagClose, sampleText ) {
                        if ( currentFocused && currentFocused.length ) {
                                currentFocused.textSelection(
                                        'encapsulateSelection', {
diff --git a/resources/mediawiki.action/mediawiki.action.edit.preview.js b/resources/mediawiki.action/mediawiki.action.edit.preview.js
new file mode 100644 (file)
index 0000000..cddf6cc
--- /dev/null
@@ -0,0 +1,135 @@
+/**
+ * Live edit preview.
+ */
+( function ( mw, $ ) {
+
+       /**
+        * @param {jQuery.Event} e
+        */
+       function doLivePreview( e ) {
+               var $wikiPreview, copySelectors, removeSelectors, $copyElements, $spinner,
+                       targetUrl, postData, $previewDataHolder;
+
+               e.preventDefault();
+
+               $( mw ).trigger( 'LivePreviewPrepare' );
+
+               $wikiPreview = $( '#wikiPreview' );
+
+               // Show #wikiPreview if it's hidden to be able to scroll to it
+               // (if it is hidden, it's also empty, so nothing changes in the rendering)
+               $wikiPreview.show();
+
+               // Jump to where the preview will appear
+               $wikiPreview[0].scrollIntoView();
+
+               // List of selectors matching elements that we will
+               // update from from the ajax-loaded preview page.
+               copySelectors = [
+                       // Main
+                       '#wikiPreview',
+                       '#wikiDiff',
+                       '#catlinks',
+                       '.hiddencats',
+                       '#p-lang',
+                       // Editing-related
+                       '.templatesUsed',
+                       '.mw-summary-preview'
+               ];
+               $copyElements = $( copySelectors.join( ',' ) );
+
+               // Not shown during normal preview, to be removed if present
+               removeSelectors = [
+                       '.mw-newarticletext'
+               ];
+
+               $( removeSelectors.join( ',' ) ).remove();
+
+               $spinner = $.createSpinner( {
+                       size: 'large',
+                       type: 'block'
+               });
+               $wikiPreview.before( $spinner );
+               $spinner.css( {
+                       position: 'absolute',
+                       marginTop: $spinner.height()
+               } );
+               // Make sure preview area is at least as tall as 2x the height of the spinner.
+               // 1x because if its smaller, it will spin behind the edit toolbar.
+               // (this happens on the first preview when editPreview is still empty)
+               // 2x because the spinner has 1x margin top breathing room.
+               $wikiPreview.css( 'minHeight', $spinner.height() * 2 );
+
+               // Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
+               // (e.g. empty #catlinks)
+               $copyElements.animate( {
+                       opacity: 0.4
+               }, 'fast' );
+
+               $previewDataHolder = $( '<div>' );
+               targetUrl = $( '#editform' ).attr( 'action' );
+
+               // Gather all the data from the form
+               postData = $( '#editform' ).formToArray();
+               postData.push( {
+                       name: e.target.name,
+                       value: ''
+               } );
+
+               // Load new preview data.
+               // TODO: This should use the action=parse API instead of loading the entire page
+               // Though that requires figuring out how to conver that raw data into proper HTML.
+               $previewDataHolder.load( targetUrl + ' ' + copySelectors.join( ',' ), postData, function () {
+                       var i, $from;
+                       // Copy the contents of the specified elements from the loaded page to the real page.
+                       // Also copy their class attributes.
+                       for ( i = 0; i < copySelectors.length; i++ ) {
+                               $from = $previewDataHolder.find( copySelectors[i] );
+
+                               $( copySelectors[i] )
+                                       .empty()
+                                       .append( $from.contents() )
+                                       .attr( 'class', $from.attr( 'class' ) );
+                       }
+
+                       $spinner.remove();
+                       $copyElements.animate( {
+                               opacity: 1
+                       }, 'fast' );
+
+                       $( mw ).trigger( 'LivePreviewDone', [copySelectors] );
+               } );
+       }
+
+       $( document ).ready( function () {
+               // The following elements can change in a preview but are not output
+               // by the server when they're empty until the preview reponse.
+               // TODO: Make the server output these always (in a hidden state), so we don't
+               // have to fish and (hopefully) put them in the right place (since skins
+               // can change where they are output).
+
+               if ( !document.getElementById( 'p-lang' ) && document.getElementById( 'p-tb' ) ) {
+                       $( '#p-tb' ).after(
+                               $( '<div>' ).prop( 'id', 'p-lang' )
+                       );
+               }
+
+               if ( !$( '.mw-summary-preview' ).length ) {
+                       $( '.editCheckboxes' ).before(
+                               $( '<div>' ).prop( 'className', 'mw-summary-preview' )
+                       );
+               }
+
+               if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
+                       $( '#wikiPreview' ).after(
+                               $( '<div>' ).prop( 'id', 'wikiDiff')
+                       );
+               }
+
+               // Make sure diff styles are loaded
+               mw.loader.load( 'mediawiki.action.history.diff' );
+
+               $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
+       } );
+
+}( mediaWiki, jQuery ) );
index 10473be..31ca107 100644 (file)
@@ -1,8 +1,36 @@
 /*
 ** Diff rendering
 */
-table.diff, td.diff-otitle, td.diff-ntitle {
+table.diff {
        background-color: white;
+       border: none;
+       border-spacing: 4px;
+       margin: 0;
+       width: 100%;
+       /* Ensure that colums are of equal width */
+       table-layout: fixed;
+}
+
+table.diff td {
+       padding: 0.33em 0.5em;
+}
+
+table.diff td.diff-marker {
+       /* Compensate padding for increased font-size */
+       padding: 0.25em;
+}
+
+table.diff col.diff-marker {
+       width: 2%;
+}
+
+table.diff col.diff-content {
+       width: 48%;
+}
+
+table.diff td div {
+       /* Force-wrap very long lines such as URLs or page-widening char strings */
+       word-wrap: break-word;
 }
 
 td.diff-otitle,
@@ -10,14 +38,14 @@ td.diff-ntitle {
        text-align: center;
 }
 
-td.diff-marker {
-       text-align: right;
+td.diff-lineno {
        font-weight: bold;
-       font-size: 1.25em;
 }
 
-td.diff-lineno {
+td.diff-marker {
+       text-align: right;
        font-weight: bold;
+       font-size: 1.25em;
 }
 
 td.diff-addedline,
@@ -27,10 +55,6 @@ td.diff-context {
        vertical-align: top;
        white-space: -moz-pre-wrap;
        white-space: pre-wrap;
-}
-
-td.diff-addedline,
-td.diff-deletedline {
        border-style: solid;
        border-width: 1px 1px 1px 4px;
        border-radius: 0.33em;
@@ -45,12 +69,9 @@ td.diff-deletedline {
 }
 
 td.diff-context {
-       background: #f3f3f3;
-       color: #333333;
-       border-style: solid;
-       border-width: 1px 1px 1px 4px;
+       background: #f9f9f9;
        border-color: #e6e6e6;
-       border-radius: 0.33em;
+       color: #333333;
 }
 
 .diffchange {
@@ -58,15 +79,6 @@ td.diff-context {
        text-decoration: none;
 }
 
-table.diff {
-       border: none;
-       width: 98%;
-       border-spacing: 4px;
-
-       /* Ensure that colums are of equal width */
-       table-layout: fixed;
-}
-
 td.diff-addedline .diffchange,
 td.diff-deletedline .diffchange {
        border-radius: 0.33em;
@@ -80,25 +92,3 @@ td.diff-addedline .diffchange {
 td.diff-deletedline .diffchange {
        background: #feeec8;
 }
-
-table.diff td {
-       padding: 0.33em 0.66em;
-}
-
-table.diff col.diff-marker {
-       width: 2%;
-}
-
-table.diff col.diff-content {
-       width: 48%;
-}
-
-table.diff td div {
-       /* Force-wrap very long lines such as URLs or page-widening char strings.*/
-       word-wrap: break-word;
-
-       /* As fallback (FF<3.5, Opera <10.5), scrollbars will be added for very wide cells
-          instead of text overflowing or widening
-       */
-       overflow: auto;
-}
index d323442..6cbccbf 100644 (file)
@@ -25,7 +25,7 @@
 
        $.extend( mw.Api.prototype, {
                /**
-                * Convinience method for 'action=watch'.
+                * Convenience method for 'action=watch'.
                 *
                 * @param page {String|mw.Title} Full page name or instance of mw.Title
                 * @param success {Function} Callback to which the watch object will be passed.
@@ -38,7 +38,7 @@
                        return doWatchInternal.call( this, page, success, err );
                },
                /**
-                * Convinience method for 'action=watch&unwatch=1'.
+                * Convenience method for 'action=watch&unwatch=1'.
                 *
                 * @param page {String|mw.Title} Full page name or instance of mw.Title
                 * @param success {Function} Callback to which the watch object will be passed.
index c0c77aa..65eb5a6 100644 (file)
@@ -2,10 +2,10 @@
  * Bosnian (bosanski) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'bs', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'bs', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index a42a8f7..b2c9c08 100644 (file)
@@ -2,10 +2,10 @@
  * Lower Sorbian (Dolnoserbski) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'dsb', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'dsb', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index 374698d..61c6c10 100644 (file)
@@ -3,21 +3,24 @@
  *  @author Santhosh Thottingal
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'fi', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms, aou, origWord;
+
+       grammarForms = mediaWiki.language.getData( 'fi', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
 
        // vowel harmony flag
-       var aou = word.match( /[aou][^äöy]*$/i );
-       var origWord = word;
+       aou = word.match( /[aou][^äöy]*$/i );
+       origWord = word;
        if ( word.match( /wiki$/i ) ) {
                aou = false;
        }
        //append i after final consonant
-       if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) )
+       if ( word.match( /[bcdfghjklmnpqrstvwxz]$/i ) ) {
                word += 'i';
+       }
 
        switch ( form ) {
                case 'genitive':
index a27b489..c13e832 100644 (file)
@@ -2,10 +2,11 @@
  * Irish (Gaeilge) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'ga', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       /*jshint onecase:true */
+       var grammarForms = mediaWiki.language.getData( 'ga', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'ainmlae':
index d35f77e..13d457b 100644 (file)
@@ -3,26 +3,26 @@
  */
 
 mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'he', 'grammarForms' );
+       var grammarForms = mediaWiki.language.getData( 'he', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'prefixed':
                case 'תחילית': // the same word in Hebrew
                        // Duplicate prefixed "Waw", but only if it's not already double
-                       if ( word.substr( 0, 1 ) === "ו" && word.substr( 0, 2 ) !== "וו" ) {
-                               word = "ו" + word;
+                       if ( word.substr( 0, 1 ) === 'ו' && word.substr( 0, 2 ) !== 'וו' ) {
+                               word = 'ו' + word;
                        }
 
                        // Remove the "He" if prefixed
-                       if ( word.substr( 0, 1 ) === "ה" ) {
+                       if ( word.substr( 0, 1 ) === 'ה' ) {
                                word = word.substr( 1, word.length );
                        }
 
                        // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                       if (  word.substr( 0, 1 ) < "א" ||  word.substr( 0, 1 ) > "ת" ) {
-                               word = "־" + word;
+                       if (  word.substr( 0, 1 ) < 'א' ||  word.substr( 0, 1 ) > 'ת' ) {
+                               word = '־' + word;
                        }
        }
        return word;
index 211d67b..77dca75 100644 (file)
@@ -2,10 +2,10 @@
  * Upper Sorbian (Hornjoserbsce) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms =mw.language.getData( 'hsb', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'hsb', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'instrumental': // instrumental
index eb3f1f3..23b0c12 100644 (file)
@@ -3,10 +3,10 @@
  *  @author Santhosh Thottingal
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'hu', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'hu', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'rol':
index 215e750..65081bd 100644 (file)
@@ -2,10 +2,11 @@
  * Armenian (Հայերեն) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'hy', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       /*jshint onecase:true */
+       var grammarForms = mediaWiki.language.getData( 'hy', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
 
        // These rules are not perfect, but they are currently only used for site names so it doesn't
@@ -13,14 +14,15 @@ mediaWiki.language.convertGrammar = function( word, form ) {
 
        switch ( form ) {
                case 'genitive': // սեռական հոլով
-                       if ( word.substr( -1 ) === 'ա' )
+                       if ( word.substr( -1 ) === 'ա' ) {
                                word = word.substr( 0, word.length -1 )  + 'այի';
-                       else if ( word.substr( -1 ) === 'ո' )
+                       } else if ( word.substr( -1 ) === 'ո' ) {
                                word = word.substr( 0, word.length - 1 ) + 'ոյի';
-                       else if ( word.substr( -4 ) === 'գիրք' )
+                       } else if ( word.substr( -4 ) === 'գիրք' ) {
                                word = word.substr( 0, word.length - 4 ) + 'գրքի';
-                       else
+                       } else {
                                word = word + 'ի';
+                       }
                        break;
                }
        return word;
index 313bb1c..2711024 100644 (file)
@@ -3,10 +3,10 @@
  * @author Santhosh Thottingal
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'la', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'la', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'genitive':
index 431e38c..682b390 100644 (file)
@@ -4,23 +4,24 @@
  */
 
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'os', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'os', 'grammarForms' ),
+               // Ending for allative case
+               endAllative = 'мæ',
+               // Variable for 'j' beetwen vowels
+               jot = '',
+               // Variable for "-" for not Ossetic words
+               hyphen = '',
+               // Variable for ending
+               ending = '';
+
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
-       // Ending for allative case
-       var end_allative = 'мæ';
-       // Variable for 'j' beetwen vowels
-       var jot = '';
-       // Variable for "-" for not Ossetic words
-       var hyphen = '';
-       // Variable for ending
-       var ending = '';
        // Checking if the $word is in plural form
        if ( word.match( /тæ$/i ) ) {
                word = word.substring( 0, word.length - 1 );
-               end_allative = 'æм';
+               endAllative = 'æм';
        }
        // Works if word is in singular form.
        // Checking if word ends on one of the vowels: е, ё, и, о, ы, э, ю, я.
@@ -45,10 +46,10 @@ mediaWiki.language.convertGrammar = function( word, form ) {
                        ending = hyphen + jot + 'æн';
                        break;
                case 'allative':
-                       ending = hyphen + end_allative;
+                       ending = hyphen + endAllative;
                        break;
                case 'ablative':
-                       if ( jot == 'й' ) {
+                       if ( jot === 'й' ) {
                                ending = hyphen + jot + 'æ';
                        }
                        else {
index cfdbfc3..b27dea4 100644 (file)
@@ -2,27 +2,28 @@
  * Russian (Русский) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'ru', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       /*jshint noempty:false, onecase:true */
+       var grammarForms = mediaWiki.language.getData( 'ru', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'genitive': // родительный падеж
-                       if ( (  word.substr( word.length - 4 )  == 'вики' ) || (  word.substr( word.length - 4 ) == 'Вики' ) ) {
-                       }
-                       else if ( word.substr( word.length - 1 ) == 'ь' )
+                       if ( (  word.substr( word.length - 4 ) === 'вики' ) || (  word.substr( word.length - 4 ) === 'Вики' ) ) {
+                       } else if ( word.substr( word.length - 1 ) === 'ь' ) {
                                word = word.substr(0, word.length - 1 ) + 'я';
-                       else if ( word.substr( word.length - 2 ) == 'ия' )
+                       } else if ( word.substr( word.length - 2 ) === 'ия' ) {
                                word = word.substr(0, word.length - 2 ) + 'ии';
-                       else if ( word.substr( word.length - 2 ) == 'ка' )
+                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
                                word = word.substr(0, word.length - 2 ) + 'ки';
-                       else if ( word.substr( word.length - 2 )  == 'ти' )
+                       } else if ( word.substr( word.length - 2 )  === 'ти' ) {
                                word = word.substr(0, word.length - 2 ) + 'тей';
-                       else if ( word.substr( word.length - 2 ) == 'ды' )
+                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
                                word = word.substr(0, word.length - 2 ) + 'дов';
-                       else if ( word.substr( word.length - 3 ) == 'ник' )
+                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
                                word = word.substr(0, word.length - 3 ) + 'ника';
+                       }
                        break;
        }
        return word;
index acd00bf..fb335b6 100644 (file)
@@ -2,10 +2,10 @@
  * Slovenian (Slovenščina) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'sl', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mediaWiki.language.getData( 'sl', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'mestnik': // locative
index ee110b0..5e56b66 100644 (file)
@@ -2,33 +2,35 @@
  * Ukrainian (Українська) language functions
  */
 
-mediaWiki.language.convertGrammar = function( word, form ) {
-       var grammarForms = mw.language.getData( 'uk', 'grammarForms' );
+mediaWiki.language.convertGrammar = function ( word, form ) {
+       /*jshint noempty:false */
+       var grammarForms = mediaWiki.language.getData( 'uk', 'grammarForms' );
        if ( grammarForms && grammarForms[form] ) {
-               return grammarForms[form][word] ;
+               return grammarForms[form][word];
        }
        switch ( form ) {
                case 'genitive': // родовий відмінок
-                       if ( ( word.substr( word.length - 4 ) == 'вікі' ) || ( word.substr( word.length - 4 ) == 'Вікі' ) ) {
-                       }
-                       else if ( word.substr( word.length - 1 ) == 'ь' )
+                       if ( ( word.substr( word.length - 4 ) === 'вікі' ) || ( word.substr( word.length - 4 ) === 'Вікі' ) ) {
+                       } else if ( word.substr( word.length - 1 ) === 'ь' ) {
                                word = word.substr(0, word.length - 1 ) + 'я';
-                       else if ( word.substr( word.length - 2 ) == 'ія' )
+                       } else if ( word.substr( word.length - 2 ) === 'ія' ) {
                                word = word.substr(0, word.length - 2 ) + 'ії';
-                       else if ( word.substr( word.length - 2 ) == 'ка' )
+                       } else if ( word.substr( word.length - 2 ) === 'ка' ) {
                                word = word.substr(0, word.length - 2 ) + 'ки';
-                       else if ( word.substr( word.length - 2 ) == 'ти' )
+                       } else if ( word.substr( word.length - 2 ) === 'ти' ) {
                                word = word.substr(0, word.length - 2 ) + 'тей';
-                       else if ( word.substr( word.length - 2 ) == 'ды' )
+                       } else if ( word.substr( word.length - 2 ) === 'ды' ) {
                                word = word.substr(0, word.length - 2 ) + 'дов';
-                       else if ( word.substr( word.length - 3 ) == 'ник' )
+                       } else if ( word.substr( word.length - 3 ) === 'ник' ) {
                                word = word.substr(0, word.length - 3 ) + 'ника';
+                       }
                        break;
                case 'accusative': // знахідний відмінок
-                       if ( ( word.substr( word.length - 4 ) == 'вікі' ) || ( word.substr( word.length - 4 ) == 'Вікі' ) ) {
+                       if ( ( word.substr( word.length - 4 ) === 'вікі' ) || ( word.substr( word.length - 4 ) === 'Вікі' ) ) {
                        }
-                       else if ( word.substr( word.length - 2 ) == 'ія' )
+                       else if ( word.substr( word.length - 2 ) === 'ія' ) {
                                word = word.substr(0, word.length - 2 ) + 'ію';
+                       }
                        break;
        }
        return word;
index 6660eca..c3023cd 100644 (file)
@@ -1,8 +1,8 @@
 /**
- *  CLDR related utility methods
+ *  CLDR related utility methods.
  */
-( function( mw ) {
-       "use strict";
+( function ( mw ) {
+       'use strict';
 
        var cldr = {
                /**
                 * 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
+                * @param {Array} pluralRules
+                * @return {number} plural form index
                 */
-               getPluralForm: function( number, pluralRules ) {
-                       var pluralFormIndex = 0;
-                       for ( pluralFormIndex = 0; pluralFormIndex < pluralRules.length; pluralFormIndex++ ) {
-                               if ( mw.libs.pluralRuleParser( pluralRules[pluralFormIndex], number ) ) {
+               getPluralForm: function ( number, pluralRules ) {
+                       var i;
+                       for ( i = 0; i < pluralRules.length; i++ ) {
+                               if ( mw.libs.pluralRuleParser( pluralRules[i], number ) ) {
                                        break;
                                }
                        }
-                       return pluralFormIndex;
+                       return i;
                }
        };
 
        mw.cldr = cldr;
-} )( mediaWiki );
+
+}( mediaWiki ) );
index 30307a3..937b89b 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;
 
-}( mediaWiki, jQuery ) );
+}( mediaWiki ) );
index 935d4ff..514dbd5 100644 (file)
@@ -43,12 +43,14 @@ var language = {
         * @param forms array List of plural forms
         * @return string Correct form for quantifier in this language
         */
-       convertPlural: function( count, forms ) {
-               var pluralFormIndex = 0;
+       convertPlural: function ( count, forms ) {
+               var pluralRules,
+                       pluralFormIndex = 0;
+
                if ( !forms || forms.length === 0 ) {
                        return '';
                }
-               var pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
+               pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
                if ( !pluralRules ) {
                        // default fallback.
                        return ( count === 1 ) ? forms[0] : forms[1];
@@ -78,8 +80,8 @@ var language = {
         * @param {num} number Value to be converted
         * @param {boolean} integer Convert the return value to an integer
         */
-       convertNumber: function( num, integer ) {
-               var i, tmp, transformTable;
+       convertNumber: function ( num, integer ) {
+               var i, tmp, transformTable, numberString, convertedNumber;
 
                if ( !mw.language.digitTransformTable ) {
                        return num;
@@ -97,8 +99,8 @@ var language = {
                        }
                        transformTable = tmp;
                }
-               var numberString = '' + num;
-               var convertedNumber = '';
+               numberString = '' + num;
+               convertedNumber = '';
                for ( i = 0; i < numberString.length; i++ ) {
                        if ( transformTable[ numberString[i] ] ) {
                                convertedNumber += transformTable[numberString[i]];
@@ -121,7 +123,7 @@ var language = {
         *
         * @return string
         */
-       gender: function( gender, forms ) {
+       gender: function ( gender, forms ) {
                if ( !forms || forms.length === 0 ) {
                        return '';
                }
diff --git a/resources/mediawiki.page/mediawiki.page.patrol.ajax.js b/resources/mediawiki.page/mediawiki.page.patrol.ajax.js
new file mode 100644 (file)
index 0000000..d7a07d7
--- /dev/null
@@ -0,0 +1,63 @@
+/**
+ * Animate patrol links to use asynchronous API requests to
+ * patrol pages, rather than navigating to a different URI.
+ *
+ * @since 1.21
+ * @author Marius Hoch <hoo@online.de>
+ */
+( function ( mw, $ ) {
+       if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
+               // Current user has no patrol right, or an old cached version of user.tokens
+               // that didn't have patrolToken yet.
+               return;
+       }
+       $( document ).ready( function () {
+               var $patrolLinks = $( '.patrollink a' );
+               $patrolLinks.on( 'click', function ( e ) {
+                       var $spinner, href, rcid, apiRequest;
+
+                       // Hide the link and create a spinner to show it inside the brackets.
+                       $spinner = $.createSpinner( {
+                               size: 'small',
+                               type: 'inline'
+                       } );
+                       $( this ).hide().after( $spinner );
+
+                       href = $( this ).attr( 'href' );
+                       rcid = mw.util.getParamValue( 'rcid', href );
+                       apiRequest = new mw.Api();
+
+                       apiRequest.post( {
+                               action: 'patrol',
+                               token: mw.user.tokens.get( 'patrolToken' ),
+                               rcid: rcid
+                       } )
+                       .done( function ( data ) {
+                               // Remove all patrollinks from the page (including any spinners inside).
+                               $patrolLinks.closest( '.patrollink' ).remove();
+                               if ( data.patrol !== undefined ) {
+                                       // Success
+                                       var title = new mw.Title( data.patrol.title );
+                                       mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
+                               } else {
+                                       // This should never happen as errors should trigger fail
+                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
+                               }
+                       } )
+                       .fail( function ( error ) {
+                               $spinner.remove();
+                               // Restore the patrol link. This allows the user to try again
+                               // (or open it in a new window, bypassing this ajax module).
+                               $patrolLinks.show();
+                               if ( error === 'noautopatrol' ) {
+                                       // Can't patrol own
+                                       mw.notify( mw.msg( 'markedaspatrollederror-noautopatrol' ) );
+                               } else {
+                                       mw.notify( mw.msg( 'markedaspatrollederrornotify' ) );
+                               }
+                       } );
+
+                       e.preventDefault();
+               } );
+       } );
+}( mediaWiki, jQuery ) );
index 370c3a1..684f582 100644 (file)
@@ -1,24 +1,28 @@
-jQuery( document ).ready( function( $ ) {
+( function ( mw, $ ) {
+       $( function () {
+               var $sortableTables;
 
-       /* Emulate placeholder if not supported by browser */
-       if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
-               $( 'input[placeholder]' ).placeholder();
-       }
+               /* Emulate placeholder if not supported by browser */
+               if ( !( 'placeholder' in document.createElement( 'input' ) ) ) {
+                       $( 'input[placeholder]' ).placeholder();
+               }
 
-       /* Enable makeCollapsible */
-       $( '.mw-collapsible' ).makeCollapsible();
+               /* Enable makeCollapsible */
+               $( '.mw-collapsible' ).makeCollapsible();
 
-       /* Lazy load jquery.tablesorter */
-       if ( $( 'table.sortable' ).length ) {
-               mw.loader.using( 'jquery.tablesorter', function() {
-                       $( 'table.sortable' ).tablesorter();
-               });
-       }
+               /* Lazy load jquery.tablesorter */
+               $sortableTables = $( 'table.sortable' );
+               if ( $sortableTables.length ) {
+                       mw.loader.using( 'jquery.tablesorter', function () {
+                               $sortableTables.tablesorter();
+                       });
+               }
 
-       /* Enable CheckboxShiftClick */
-       $( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick();
+               /* Enable CheckboxShiftClick */
+               $( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick();
 
-       /* Add accesskey hints to the tooltips */
-       mw.util.updateTooltipAccessKeys();
+               /* Add accesskey hints to the tooltips */
+               mw.util.updateTooltipAccessKeys();
 
-} );
+       } );
+}( mediaWiki, jQuery ) );
index a7e059c..3957493 100644 (file)
                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 ) {
+               if ( state === undefined ) {
                        $li.trigger( 'watchpage.mw', otherAction );
                }
 
@@ -96,7 +97,7 @@
 
        // Expose local methods
        mw.page.watch = {
-               'updateWatchLink': updateWatchLink
+               updateWatchLink: updateWatchLink
        };
 
        $( document ).ready( function () {
                                        otherAction = action === 'watch' ? 'unwatch' : 'watch';
                                        $li = $link.closest( 'li' );
 
-                                       mw.notify( $.parseHTML( watchResponse.message ), { tag: 'watch-self' } );
+                                       mw.notify( $.parseHTML( watchResponse.message ), {
+                                               tag: 'watch-self'
+                                       } );
 
                                        // Set link to opposite
                                        updateWatchLink( $link, otherAction );
                                        if ( watchResponse.watched !== undefined ) {
                                                $( '#wpWatchthis' ).prop( 'checked', true );
                                        } else {
-                                               $( '#wpWatchthis' ).removeProp( 'checked' );
+                                               $( '#wpWatchthis' ).prop( 'checked', false );
                                        }
                                },
                                // Error
 
                                }
                        );
-               });
-       });
+               } );
+       } );
 
 }( mediaWiki, jQuery ) );
index 6f79929..077adcd 100644 (file)
@@ -1,46 +1,49 @@
-/* JavaScript for Special:Block */
+/**
+ * JavaScript for Special:Block
+ */
+( function ( mw, $ ) {
+       $( function ( $ ) {
 
-jQuery( function( $ ) {
+               var $blockTarget = $( '#mw-bi-target' ),
+                       $anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
+                       $enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
+                       $hideUser = $( '#mw-input-wpHideUser' ).closest( 'tr' ),
+                       $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' );
 
-       var     DO_INSTANT = true,
-               $blockTarget = $( '#mw-bi-target' ),
-               $anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
-               $enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
-               $hideUser = $( '#mw-input-wpHideUser' ).closest( 'tr' ),
-               $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' );
+               function updateBlockOptions( instant ) {
+                       if ( !$blockTarget.length ) {
+                               return;
+                       }
 
-       var updateBlockOptions = function( instant ) {
-               if ( !$blockTarget.length ) {
-                       return;
-               }
-
-               var blocktarget = $.trim( $blockTarget.val() );
-               var isEmpty = ( blocktarget === '' );
-               var isIp = mw.util.isIPv4Address( blocktarget, true ) || mw.util.isIPv6Address( blocktarget, true );
-               var isIpRange = isIp && blocktarget.match( /\/\d+$/ );
+                       var blocktarget = $.trim( $blockTarget.val() ),
+                               isEmpty = blocktarget === '',
+                               isIp = mw.util.isIPv4Address( blocktarget, true ) || mw.util.isIPv6Address( blocktarget, true ),
+                               isIpRange = isIp && blocktarget.match( /\/\d+$/ );
 
-               if ( isIp && !isEmpty ) {
-                       $enableAutoblockRow.goOut( instant );
-                       $hideUser.goOut( instant );
-               } else {
-                       $enableAutoblockRow.goIn( instant );
-                       $hideUser.goIn( instant );
-               }
-               if ( !isIp && !isEmpty ) {
-                       $anonOnlyRow.goOut( instant );
-               } else {
-                       $anonOnlyRow.goIn( instant );
+                       if ( isIp && !isEmpty ) {
+                               $enableAutoblockRow.goOut( instant );
+                               $hideUser.goOut( instant );
+                       } else {
+                               $enableAutoblockRow.goIn( instant );
+                               $hideUser.goIn( instant );
+                       }
+                       if ( !isIp && !isEmpty ) {
+                               $anonOnlyRow.goOut( instant );
+                       } else {
+                               $anonOnlyRow.goIn( instant );
+                       }
+                       if ( isIpRange && !isEmpty ) {
+                               $watchUser.goOut( instant );
+                       } else {
+                               $watchUser.goIn( instant );
+                       }
                }
-               if ( isIpRange && !isEmpty ) {
-                       $watchUser.goOut( instant );
-               } else {
-                       $watchUser.goIn( instant );
-               }
-       };
 
-       // Bind functions so they're checked whenever stuff changes
-       $blockTarget.keyup( updateBlockOptions );
+               // Bind functions so they're checked whenever stuff changes
+               $blockTarget.keyup( updateBlockOptions );
+
+               // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
+               updateBlockOptions( /* instant= */ true );
+       } );
+}( mediaWiki, jQuery ) );
 
-       // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
-       updateBlockOptions( DO_INSTANT );
-});
index 8a5421e..3589ea1 100644 (file)
@@ -42,6 +42,7 @@ table.mw-enhanced-rc td.mw-enhanced-rc-nested {
        zoom: 1;
        width: 15px;
        height: 15px;
+       cursor: pointer;
 }
 
 .mw-enhancedchanges-arrow.mw-enhancedchanges-arrow-space {
index 808d5fe..a560ca9 100644 (file)
@@ -8,7 +8,7 @@
                // (only if a framework was found, not on error pages).
                $( '#mw-javascripttest-summary.mw-javascripttest-frameworkfound' ).append( function () {
 
-                       var     $html = $( '<p><label for="useskin">'
+                       var $html = $( '<p><label for="useskin">'
                                        + mw.message( 'javascripttest-pagetext-skins' ).escaped()
                                        + ' '
                                        + '</label></p>' ),
index 3526cef..8edb1cb 100644 (file)
@@ -1 +1,5 @@
-mw.special = {};
+/*
+ * Namespace for mediawiki.special.* modules
+ */
+
+mediaWiki.special = {};
index 68c2ed0..7a55806 100644 (file)
@@ -1,5 +1,7 @@
-/* JavaScript for Special:MovePage */
+/**
+ * JavaScript for Special:MovePage
+ */
 
 jQuery( function( $ ) {
        $( '#wpReason, #wpNewTitleMain' ).byteLimit();
-});
+} );
index 0804825..d8d092b 100644 (file)
  * JavaScript for Special:Preferences
  */
 jQuery( document ).ready( function ( $ ) {
-$( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
-var $preftoc = $('<ul id="preftoc"></ul>');
-var $preferences = $( '#preferences' )
-       .addClass( 'jsprefs' )
-       .before( $preftoc );
-
-var $fieldsets = $preferences.children( 'fieldset' )
-       .hide()
-       .addClass( 'prefsection' );
-
-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();
+       var $preftoc, $preferences, $fieldsets, $legends,
+               hash,
+               $tzSelect, $tzTextbox, $localtimeHolder, servertime;
+
+       $( '#prefsubmit' ).attr( 'id', 'prefcontrol' );
+
+               $preftoc = $('<ul id="preftoc"></ul>'),
+               $preferences = $( '#preferences' )
+                       .addClass( 'jsprefs' )
+                       .before( $preftoc ),
+               $fieldsets = $preferences.children( 'fieldset' )
+                       .hide()
+                       .addClass( 'prefsection' ),
+               $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 ) {
-       var $legend = $(legend);
-       if ( i === 0 ) {
-               $legend.parent().show();
+       // Populate the prefToc
+       $legends.each( function ( i, legend ) {
+               var $legend = $(legend),
+                       ident, $li, $a;
+               if ( i === 0 ) {
+                       $legend.parent().show();
+               }
+               ident = $legend.parent().attr( 'id' );
+
+               $li = $( '<li>' )
+                       .addClass( i === 0 ? 'selected' : '' );
+               $a = $( '<a>' )
+                       .attr( {
+                               id: ident.replace( 'mw-prefsection', 'preftab' ),
+                               href: '#' + ident
+                       } )
+                       .text( $legend.text() );
+               $li.append( $a );
+               $preftoc.append( $li );
+       } );
+
+       // If we've reloaded the page or followed an open-in-new-window,
+       // make the selected tab visible.
+       hash = window.location.hash;
+       if ( hash.match( /^#mw-prefsection-[\w\-]+/ ) ) {
+               switchPrefTab( hash.replace( '#mw-prefsection-' , '' ) );
        }
-       var ident = $legend.parent().attr( 'id' );
-
-       var $li = $( '<li/>', {
-               'class' : ( i === 0 ) ? 'selected' : null
-       });
-       var $a = $( '<a/>', {
-               text : $legend.text(),
-               id : ident.replace( 'mw-prefsection', 'preftab' ),
-               href : '#' + ident
-       });
-       $li.append( $a );
-       $preftoc.append( $li );
-} );
 
-// 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-]+/ ) ) {
-       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.
-* Guesses Timezone from browser and updates fields onchange
-*/
-
-var $tzSelect = $( '#mw-input-wptimecorrection' );
-var $tzTextbox = $( '#mw-input-wptimecorrection-other' );
-
-var $localtimeHolder = $( '#wpLocalTime' );
-var servertime = parseInt( $( 'input[name=wpServerTime]' ).val(), 10 );
-var minuteDiff = 0;
-
-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 +
-               ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
-       return tzString;
-};
-
-var hoursToMinutes = function ( hour ) {
-       var arr = hour.split( ':' );
-       arr[0] = parseInt( arr[0], 10 );
-
-       var minutes;
-       if ( arr.length == 1 ) {
-               // Specification is of the form [-]XX
-               minutes = arr[0] * 60;
+       // In browsers that support the onhashchange event we will not bind click
+       // handlers and instead let the browser do the default behavior (clicking the
+       // <a href="#.."> will naturally set the hash, handled by onhashchange.
+       // But other things that change the hash will also be catched (e.g. using
+       // the Back and Forward browser navigation).
+       // Note the special check for IE "compatibility" mode.
+       if ( 'onhashchange' in window &&
+               ( document.documentMode === undefined || document.documentMode >= 8 )
+       ) {
+               $(window).on( 'hashchange' , function () {
+                       var hash = 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 {
-               // Specification is of the form [-]XX:XX
-               minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 );
-               if ( arr[0] < 0 ) {
-                       minutes *= -1;
-               }
+               $preftoc.on( 'click', 'li a', function ( e ) {
+                       switchPrefTab( $( this ).attr( 'href' ).replace( '#mw-prefsection-', '' ) );
+                       e.preventDefault();
+               });
        }
-       // Gracefully handle non-numbers.
-       if ( isNaN( minutes ) ) {
-               return 0;
-       } else {
-               return minutes;
+
+       /**
+       * Timezone functions.
+       * Guesses Timezone from browser and updates fields onchange
+       */
+
+       $tzSelect = $( '#mw-input-wptimecorrection' );
+       $tzTextbox = $( '#mw-input-wptimecorrection-other' );
+       $localtimeHolder = $( '#wpLocalTime' );
+       servertime = parseInt( $( 'input[name="wpServerTime"]' ).val(), 10 );
+
+       function minutesToHours( min ) {
+               var tzHour = Math.floor( Math.abs( min ) / 60 ),
+                       tzMin = Math.abs( min ) % 60,
+                       tzString = ( ( min >= 0 ) ? '' : '-' ) + ( ( tzHour < 10 ) ? '0' : '' ) + tzHour +
+                               ':' + ( ( tzMin < 10 ) ? '0' : '' ) + tzMin;
+               return tzString;
        }
-};
-
-var updateTimezoneSelection = function () {
-       var type = $tzSelect.val();
-       if ( type == 'guess' ) {
-               // Get browser timezone & fill it in
-               minuteDiff = -new Date().getTimezoneOffset();
-               $tzTextbox.val( minutesToHours( minuteDiff ) );
-               $tzSelect.val( 'other' );
-               $tzTextbox.get( 0 ).disabled = false;
-       } else if ( type == 'other' ) {
-               // Grab data from the textbox, parse it.
-               minuteDiff = hoursToMinutes( $tzTextbox.val() );
-       } else {
-               // Grab data from the $tzSelect value
-               minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0;
-               $tzTextbox.val( minutesToHours( minuteDiff ) );
+
+       function hoursToMinutes( hour ) {
+               var minutes,
+                       arr = hour.split( ':' );
+
+               arr[0] = parseInt( arr[0], 10 );
+
+               if ( arr.length === 1 ) {
+                       // Specification is of the form [-]XX
+                       minutes = arr[0] * 60;
+               } else {
+                       // Specification is of the form [-]XX:XX
+                       minutes = Math.abs( arr[0] ) * 60 + parseInt( arr[1], 10 );
+                       if ( arr[0] < 0 ) {
+                               minutes *= -1;
+                       }
+               }
+               // Gracefully handle non-numbers.
+               if ( isNaN( minutes ) ) {
+                       return 0;
+               } else {
+                       return minutes;
+               }
        }
 
-       // Determine local time from server time and minutes difference, for display.
-       var localTime = servertime + minuteDiff;
+       function updateTimezoneSelection () {
+               var minuteDiff, localTime,
+                       type = $tzSelect.val();
+
+               if ( type === 'guess' ) {
+                       // Get browser timezone & fill it in
+                       minuteDiff = -( new Date().getTimezoneOffset() );
+                       $tzTextbox.val( minutesToHours( minuteDiff ) );
+                       $tzSelect.val( 'other' );
+                       $tzTextbox.prop( 'disabled', false );
+               } else if ( type === 'other' ) {
+                       // Grab data from the textbox, parse it.
+                       minuteDiff = hoursToMinutes( $tzTextbox.val() );
+               } else {
+                       // Grab data from the $tzSelect value
+                       minuteDiff = parseInt( type.split( '|' )[1], 10 ) || 0;
+                       $tzTextbox.val( minutesToHours( minuteDiff ) );
+               }
 
-       // Bring time within the [0,1440) range.
-       while ( localTime < 0 ) {
-               localTime += 1440;
+               // Determine local time from server time and minutes difference, for display.
+               localTime = servertime + minuteDiff;
+
+               // Bring time within the [0,1440) range.
+               while ( localTime < 0 ) {
+                       localTime += 1440;
+               }
+               while ( localTime >= 1440 ) {
+                       localTime -= 1440;
+               }
+               $localtimeHolder.text( minutesToHours( localTime ) );
        }
-       while ( localTime >= 1440 ) {
-               localTime -= 1440;
+
+       if ( $tzSelect.length && $tzTextbox.length ) {
+               $tzSelect.change( updateTimezoneSelection );
+               $tzTextbox.blur( updateTimezoneSelection );
+               updateTimezoneSelection();
        }
-       $localtimeHolder.text( minutesToHours( localTime ) );
-};
-
-if ( $tzSelect.length && $tzTextbox.length ) {
-       $tzSelect.change( function () { updateTimezoneSelection(); } );
-       $tzTextbox.blur( function () { updateTimezoneSelection(); } );
-       updateTimezoneSelection();
-}
 } );
index 7996d93..3cba9d3 100644 (file)
@@ -1,14 +1,12 @@
-/* JavaScript for Special:RecentChanges */
+/**
+ * JavaScript for Special:RecentChanges
+ */
 ( function ( mw, $ ) {
+       var rc,
+               $checkboxes,
+               $select;
 
-       var checkboxes = [ 'nsassociated', 'nsinvert' ];
-
-       /**
-        * @var select {jQuery}
-        */
-       var $select = null;
-
-       var rc = mw.special.recentchanges = {
+       rc = {
 
                /**
                 * Handler to disable/enable the namespace selector checkboxes when the
                 */
                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 ) {
-                               $( '#' + id ).prop( 'disabled', isAllNS );
-                       });
+                       $checkboxes.prop( 'disabled', isAllNS );
                },
 
                init: function () {
-                       // Populate
                        $select = $( '#namespace' );
+                       $checkboxes = $( '#nsassociated, #nsinvert' );
 
                        // Bind to change event, and trigger once to set the initial state of the checkboxes.
-                       $select.change( rc.updateCheckboxes ).change();
+                       rc.updateCheckboxes();
+                       $select.change( rc.updateCheckboxes );
                }
        };
 
-       // Run when document is ready
        $( rc.init );
 
+       mw.special.recentchanges = rc;
+
 }( mediaWiki, jQuery ) );
index 04954e8..0cca26d 100644 (file)
@@ -1,49 +1,53 @@
 /*
  * JavaScript for Special:Search
  */
-( function( $, mw ) { $( function() {
+( function ( $, mw ) {
+       $( function () {
+               var $checkboxes, $headerLinks;
 
-// Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
-if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
-       $( 'input[autofocus]:first' ).focus();
-}
+               // Emulate HTML5 autofocus behavior in non HTML5 compliant browsers
+               if ( !( 'autofocus' in document.createElement( 'input' ) ) ) {
+                       $( 'input[autofocus]' ).eq( 0 ).focus();
+               }
 
-// Create check all/none button
-var $checkboxes = $('#powersearch input[id^=mw-search-ns]');
-$('#mw-search-togglebox').append(
-       $('<label />')
-               .text(mw.msg('powersearch-togglelabel'))
-).append(
-       $('<input type="button" />')
-               .attr('id', 'mw-search-toggleall')
-               .attr('value', mw.msg('powersearch-toggleall'))
-               .click( function() {
-                       $checkboxes.prop('checked', true);
-               } )
-).append(
-       $('<input type="button" />')
-               .attr('id', 'mw-search-togglenone')
-               .attr('value', mw.msg('powersearch-togglenone'))
-               .click( function() {
-                       $checkboxes.prop('checked', false);
-               } )
-);
+               // Create check all/none button
+               $checkboxes = $('#powersearch input[id^=mw-search-ns]');
+               $('#mw-search-togglebox').append(
+                       $('<label>')
+                               .text(mw.msg('powersearch-togglelabel'))
+               ).append(
+                       $('<input type="button" />')
+                               .attr( 'id', 'mw-search-toggleall' )
+                               .prop( 'value', mw.msg('powersearch-toggleall' ) )
+                               .click( function () {
+                                       $checkboxes.prop('checked', true);
+                               } )
+               ).append(
+                       $('<input type="button" />')
+                               .attr( 'id', 'mw-search-togglenone' )
+                               .prop( 'value', mw.msg('powersearch-togglenone' ) )
+                               .click( function() {
+                                       $checkboxes.prop( 'checked', false );
+                               } )
+               );
 
-// Change the header search links to what user entered
-var headerLinks = $('.search-types a');
-$('#searchText, #powerSearchText').change(function() {
-       var searchterm = $(this).val();
-       headerLinks.each( function() {
-               var parts = $(this).attr('href').split( 'search=' );
-               var lastpart = '';
-               var prefix = 'search=';
-               if( parts.length > 1 && parts[1].indexOf('&') >= 0 ) {
-                       lastpart = parts[1].substring( parts[1].indexOf('&') );
-               } else {
-                       prefix = '&search=';
-               }
-               this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
-       });
-}).trigger('change');
+               // Change the header search links to what user entered
+               $headerLinks = $( '.search-types a' );
+               $( '#searchText, #powerSearchText' ).change( function () {
+                       var searchterm = $(this).val();
+                       $headerLinks.each( function () {
+                               var parts = $(this).attr('href').split( 'search=' ),
+                                       lastpart = '',
+                                       prefix = 'search=';
+                               if ( parts.length > 1 && parts[1].indexOf('&') >= 0 ) {
+                                       lastpart = parts[1].substring( parts[1].indexOf('&') );
+                               } else {
+                                       prefix = '&search=';
+                               }
+                               this.href = parts[0] + prefix + encodeURIComponent( searchterm ) + lastpart;
+                       });
+               }).trigger( 'change' );
+
+       } );
 
-} ); } )( jQuery, mediaWiki );
+}( jQuery, mediaWiki ) );
index 33b8027..c6e5d61 100644 (file)
@@ -1,10 +1,11 @@
 /*
  * JavaScript for Specical:Undelete
  */
-jQuery( document ).ready( function( $ ) {
-       $( '#mw-undelete-invert' ).click( function( e ) {
+jQuery( document ).ready( function ( $ ) {
+       $( '#mw-undelete-invert' ).click( function ( e ) {
                e.preventDefault();
-               $( '#undelete' ).find( 'input:checkbox' )
-                       .prop( 'checked', function( i, val ) { return !val; } );
+               $( '#undelete input[type="checkbox"]' ).prop( 'checked', function ( i, val ) {
+                       return !val;
+               } );
        } );
 } );
index 63e8971..b05fd71 100644 (file)
@@ -11,7 +11,7 @@
                 * Is the FileAPI available with sufficient functionality?
                 */
                function hasFileAPI() {
-                       return typeof window.FileReader !== 'undefined';
+                       return window.FileReader !== undefined;
                }
 
                /**
                 * @param {File} file
                 */
                function showPreview( file ) {
-                       var     previewSize = 180,
+                       var $canvas,
+                               ctx,
+                               meta,
+                               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     $canvas = $('<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>'),
-                               ctx = $canvas[0].getContext( '2d' );
+                       $canvas = $('<canvas width="' + previewSize + '" height="' + previewSize + '" ></canvas>');
+                       ctx = $canvas[0].getContext( '2d' );
                        $( '#mw-htmlform-source' ).parent().prepend( thumb );
 
-                       var meta;
-                       fetchPreview( file, function( dataURL ) {
+                       fetchPreview( file, function ( dataURL ) {
                                var     img = new Image(),
                                        rotation = 0;
 
@@ -79,7 +82,8 @@
                                }
 
                                img.onload = function () {
-                                       var width, height, x, y, dx, dy, logicalWidth, logicalHeight;
+                                       var info, width, height, x, y, dx, dy, logicalWidth, logicalHeight;
+
                                        // Fit the image within the previewSizexpreviewSize box
                                        if ( img.width > img.height ) {
                                                width = previewSize;
                                        thumb.find('.mw-small-spinner').replaceWith($canvas);
 
                                        // Image size
-                                       var info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
+                                       info = mw.msg( 'widthheight', logicalWidth, logicalHeight ) +
                                                ', ' + prettySize( file.size );
+
                                        $( '#mw-upload-thumbnail .fileinfo' ).text( info );
                                };
                                img.src = dataURL;
                        }, mw.config.get( 'wgFileCanRotate' ) ? function ( data ) {
+                               /*jshint camelcase: false, nomen: false */
                                try {
                                        meta = mw.libs.jpegmeta( data, file.fileName );
                                        meta._binary_data = null;
                                // 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 ),
+                                       var i,
+                                               buffer = new Uint8Array( reader.result ),
                                                string = '';
-                                       for ( var i = 0; i < buffer.byteLength; i++ ) {
+                                       for ( i = 0; i < buffer.byteLength; i++ ) {
                                                string += String.fromCharCode( buffer[i] );
                                        }
                                        callbackBinary( string );
                        } else {
                                // This ends up decoding the file to base-64 and back again, which
                                // feels horribly inefficient.
-                               reader.onload = function() {
+                               reader.onload = function () {
                                        callback( reader.result );
                                };
                                reader.readAsDataURL( file );
                 * Check if the file does not exceed the maximum size
                 */
                function checkMaxUploadSize( file ) {
+                       var maxSize, $error;
+
                        function getMaxUploadSize( type ) {
                                var sizes = mw.config.get( 'wgMaxUploadSize' );
+
                                if ( sizes[type] !== undefined ) {
                                        return sizes[type];
                                }
                                return sizes['*'];
                        }
+
                        $( '.mw-upload-source-error' ).remove();
 
-                       var maxSize = getMaxUploadSize( 'file' );
+                       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 );
+                               $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
         */
        $( 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 );
-                                       }
-                               };
-                       }() ) );
+               var i, $row,
+                       $rows = $( '.mw-htmlform-field-UploadSourceField' );
+
+               function createHandler( $currentRow ) {
+                       /**
+                        * @param {jQuery.Event}
+                        */
+                       return function () {
+                               $( '.mw-upload-source-error' ).remove();
+                               if ( this.checked ) {
+                                       // Disable all inputs
+                                       $rows.find( 'input[name!="wpSourceType"]' ).prop( 'disabled', true );
+                                       // Re-enable the current one
+                                       $currentRow.find( 'input' ).prop( 'disabled', false );
+                               }
+                       };
+               }
+
+               for ( i = $rows.length; i; i-- ) {
+                       $row = $rows.eq(i - 1);
+                       $row
+                               .find( 'input[name="wpSourceType"]' )
+                               .change( createHandler( $row ) );
                }
        } );
 
index 9e030fa..dad6021 100644 (file)
@@ -132,12 +132,12 @@ var
        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}))?$/ ),
-                       ns_match = getNsIdByName( matches[1] );
+               var matches = s.match( /^(?:([^:]+):)?(.*?)(?:\.(\w+))?$/ ),
+                       nsMatch = getNsIdByName( matches[1] );
 
                // 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;
+               if ( nsMatch && typeof matches[2] === 'string' && matches[2] !== '' ) {
+                       title.ns = nsMatch;
                        title.name = fixName( matches[2] );
                        if ( typeof matches[3] === 'string' && matches[3] !== '' ) {
                                title.ext = fixExt( matches[3] );
@@ -160,7 +160,7 @@ var
        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}))?$/ );
+               var matches = raw.match( /^(?:)?(.*?)(?:\.(\w+))?$/ );
 
                // Title must be a non-empty string.
                if ( typeof matches[1] === 'string' && matches[1] !== '' ) {
index bd12b21..2cb4c3a 100644 (file)
        /**
         * Function that's useful when constructing the URI string -- we frequently encounter the pattern of
         * having to add something to the URI as we go, but only if it's present, and to include a character before or after if so.
-        * @param {String} to prepend, if value not empty
-        * @param {String} value to include, if not empty
-        * @param {String} to append, if value not empty
-        * @param {Boolean} raw -- if true, do not URI encode
-        * @return {String}
+        * @param {string|undefined} pre To prepend.
+        * @param {string} val To include.
+        * @param {string} post To append.
+        * @param {boolean} raw If true, val will not be encoded.
+        * @return {string} Result.
         */
        function cat( pre, val, post, raw ) {
                if ( val === undefined || val === null || val === '' ) {
                /**
                 * Constructs URI object. Throws error if arguments are illegal/impossible, or otherwise don't parse.
                 * @constructor
-                * @param {Object|String} URI string, or an Object with appropriate properties (especially another URI object to clone).
+                * @param {Object|string} uri 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
-                *   convert to an array (false, default).
+                *  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
+                *  - {boolean} strictMode Trigger strict mode parsing of the url. Default: false
+                *  - {boolean} overrideKeys Wether to let duplicate query parameters override eachother (true) or automagically
+                *     convert to an array (false, default).
                 */
                function Uri( uri, options ) {
                        options = typeof options === 'object' ? options : { strictMode: !!options };
                        }
                        if ( this.path && this.path.charAt( 0 ) !== '/' ) {
                                // A real relative URL, relative to defaultUri.path. We can't really handle that since we cannot
-                               // figure out whether the last path compoennt of defaultUri.path is a directory or a file.
+                               // figure out whether the last path component of defaultUri.path is a directory or a file.
                                throw new Error( 'Bad constructor arguments' );
                        }
                        if ( !( this.protocol && this.host && this.path ) ) {
                /**
                 * Standard encodeURIComponent, with extra stuff to make all browsers work similarly and more compliant with RFC 3986
                 * Similar to rawurlencode from PHP and our JS library mw.util.rawurlencode, but we also replace space with a +
-                * @param {String} string
-                * @return {String} encoded for URI
+                * @param {string} s String to encode.
+                * @return {string} Encoded string for URI.
                 */
                Uri.encode = function ( s ) {
                        return encodeURIComponent( s )
                };
 
                /**
-                * Standard decodeURIComponent, with '+' to space
-                * @param {String} string encoded for URI
-                * @return {String} decoded string
+                * Standard decodeURIComponent, with '+' to space.
+                * @param {string} s String encoded for URI.
+                * @return {string} Decoded string.
                 */
                Uri.decode = function ( s ) {
                        return decodeURIComponent( s.replace( /\+/g, '%20' ) );
 
                        /**
                         * Parse a string and set our properties accordingly.
-                        * @param {String} URI
+                        * @param {string} str URI
                         * @param {Object} options
-                        * @return {Boolean} success
+                        * @return {boolean} Success.
                         */
                        parse: function ( str, options ) {
                                var q,
 
                        /**
                         * Returns user and password portion of a URI.
-                        * @return {String}
+                        * @return {string}
                         */
                        getUserInfo: function () {
                                return cat( '', this.user, cat( ':', this.password, '' ) );
 
                        /**
                         * Gets host and port portion of a URI.
-                        * @return {String}
+                        * @return {string}
                         */
                        getHostPort: function () {
                                return this.host + cat( ':', this.port, '' );
                        /**
                         * Returns the userInfo and host and port portion of the URI.
                         * In most real-world URLs, this is simply the hostname, but it is more general.
-                        * @return {String}
+                        * @return {string}
                         */
                        getAuthority: function () {
                                return cat( '', this.getUserInfo(), '@' ) + this.getHostPort();
                        /**
                         * Returns the query arguments of the URL, encoded into a string
                         * Does not preserve the order of arguments passed into the URI. Does handle escaping.
-                        * @return {String}
+                        * @return {string}
                         */
                        getQueryString: function () {
                                var args = [];
                                        var k = Uri.encode( key ),
                                                vals = $.isArray( val ) ? val : [ val ];
                                        $.each( vals, function ( i, v ) {
-                                               args.push( k + ( v === null ? '' : '=' + Uri.encode( v ) ) );
+                                               if ( v === null ) {
+                                                       args.push( k );
+                                               } else if ( k === 'title' ) {
+                                                       args.push( k + '=' + mw.util.wikiUrlencode( v ) );
+                                               } else {
+                                                       args.push( k + '=' + Uri.encode( v ) );
+                                               }
                                        } );
                                } );
                                return args.join( '&' );
 
                        /**
                         * Returns everything after the authority section of the URI
-                        * @return {String}
+                        * @return {string}
                         */
                        getRelativePath: function () {
                                return this.path + cat( '?', this.getQueryString(), '', true ) + cat( '#', this.fragment, '' );
 
                        /**
                         * Gets the entire URI string. May not be precisely the same as input due to order of query arguments.
-                        * @return {String} the URI string
+                        * @return {string} The URI string.
                         */
                        toString: function () {
                                return this.protocol + '://' + this.getAuthority() + this.getRelativePath();
index f0f78c2..1afe51e 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * mediawiki.Feedback
+ * mediawiki.feedback
  *
  * @author Ryan Kaldari, 2010
  * @author Neil Kandalgaonkar, 2010-11
 
        mw.Feedback.prototype = {
                setup: function () {
-                       var fb = this;
-
-                       var $feedbackPageLink = $( '<a>' )
-                               .attr( { 'href': fb.title.getUrl(), 'target': '_blank' } )
-                               .css( { 'white-space': 'nowrap' } );
+                       var $feedbackPageLink,
+                               $bugNoteLink,
+                               $bugsListLink,
+                               fb = this;
+
+                       $feedbackPageLink = $( '<a>' )
+                               .attr( {
+                                       href: fb.title.getUrl(),
+                                       target: '_blank'
+                               } )
+                               .css( {
+                                       whiteSpace: 'nowrap'
+                               } );
 
-                       var $bugNoteLink = $( '<a>' ).attr( { 'href': '#' } ).click( function () {
+                       $bugNoteLink = $( '<a>' ).attr( { href: '#' } ).click( function () {
                                fb.displayBugs();
                        } );
 
-                       var $bugsListLink = $( '<a>' ).attr( { 'href': fb.bugsListLink, 'target': '_blank' } );
+                       $bugsListLink = $( '<a>' ).attr( {
+                               href: fb.bugsListLink,
+                               target: '_blank'
+                       } );
 
                        // TODO: Use a stylesheet instead of these inline styles
                        this.$dialog =
                                        ),
                                        $( '<div class="feedback-mode feedback-submitting" style="text-align: center; margin: 3em 0;"></div>' ).append(
                                                mw.msg( 'feedback-adding' ),
-                                               $( '<br/>' ),
+                                               $( '<br>' ),
                                                $( '<span class="feedback-spinner"></span>' )
                                        ),
                                        $( '<div class="feedback-mode feedback-thanks" style="text-align: center; margin:1em"></div>' ).msg(
                },
 
                displayBugs: function () {
-                       var fb = this;
+                       var fb = this,
+                               bugsButtons = {};
                        this.display( 'bugs' );
-                       var bugsButtons = {};
                        bugsButtons[ mw.msg( 'feedback-bugnew' ) ] = function () {
                                window.open( fb.bugsLink, '_blank' );
                        };
                },
 
                displayThanks: function () {
-                       var fb = this;
+                       var fb = this,
+                               closeButton = {};
                        this.display( 'thanks' );
-                       var closeButton = {};
                        closeButton[ mw.msg( 'feedback-close' ) ] = function () {
                                fb.$dialog.dialog( 'close' );
                        };
                 *      message: {String}
                 */
                displayForm: function ( contents ) {
-                       var fb = this;
+                       var fb = this,
+                               formButtons = {};
                        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 () {
                                fb.submit();
                        };
                },
 
                displayError: function ( message ) {
-                       var fb = this;
+                       var fb = this,
+                               closeButton = {};
                        this.display( 'error' );
                        this.$dialog.find( '.feedback-error-msg' ).msg( message );
-                       var closeButton = {};
                        closeButton[ mw.msg( 'feedback-close' ) ] = function () {
                                fb.$dialog.dialog( 'close' );
                        };
                },
 
                submit: function () {
-                       var fb = this;
+                       var subject, message,
+                               fb = this;
 
-                       // get the values to submit
-                       var subject = this.subjectInput.value;
-
-                       var message = '<small>User agent: ' + mw.html.escape( navigator.userAgent ) + '</small>\n\n'
-                                + this.messageInput.value;
-                       if ( message.indexOf( '~~~' ) === -1 ) {
-                               message += ' ~~~~';
-                       }
-
-                       this.displaySubmitting();
-
-                       var ok = function ( result ) {
+                       function ok( result ) {
                                if ( result.edit !== undefined ) {
                                        if ( result.edit.result === 'Success' ) {
                                                fb.displayThanks();
                                        // edit failed
                                        fb.displayError( 'feedback-error2' );
                                }
-                       };
+                       }
 
-                       var err = function ( code, info ) {
+                       function err() {
                                // ajax request failed
                                fb.displayError( 'feedback-error3' );
-                       };
+                       }
+
+                       // Get the values to submit.
+                       subject = this.subjectInput.value;
+
+                       // We used to include "mw.html.escape( navigator.userAgent )" but there are legal issues
+                       // with posting this without their explicit consent
+                       message = this.messageInput.value;
+                       if ( message.indexOf( '~~~' ) === -1 ) {
+                               message += ' ~~~~';
+                       }
+
+                       this.displaySubmitting();
 
                        this.api.newSection( this.title, subject, message, ok, err );
-               }, // close submit button function
+               },
 
                /**
                 * Modify the display form, and then open it, focusing interface on the subject.
diff --git a/resources/mediawiki/mediawiki.hidpi.js b/resources/mediawiki/mediawiki.hidpi.js
new file mode 100644 (file)
index 0000000..ecee450
--- /dev/null
@@ -0,0 +1,5 @@
+jQuery( function ( $ ) {
+       // Apply hidpi images on DOM-ready
+       // Some may have already partly preloaded at low resolution.
+       $( 'body' ).hidpi();
+} );
index a4753b9..83bf2e3 100644 (file)
@@ -1,64 +1,62 @@
 /**
- * Utility functions for jazzing up HTMLForm elements
+ * Utility functions for jazzing up HTMLForm elements.
  */
 ( function ( $ ) {
 
-/**
- * jQuery plugin to fade or snap to visible state.
- *
- * @param boolean instantToggle (optional)
- * @return jQuery
- */
-$.fn.goIn = function ( instantToggle ) {
-       if ( instantToggle === true ) {
-               return $(this).show();
-       }
-       return $(this).stop( true, true ).fadeIn();
-};
-
-/**
- * jQuery plugin to fade or snap to hiding state.
- *
- * @param boolean instantToggle (optional)
- * @return jQuery
- */
-$.fn.goOut = function ( instantToggle ) {
-       if ( instantToggle === true ) {
-               return $(this).hide();
-       }
-       return $(this).stop( true, true ).fadeOut();
-};
-
-/**
- * Bind a function to the jQuery object via live(), and also immediately trigger
- * the function on the objects with an 'instant' parameter set to true
- * @param callback function taking one parameter, which is Bool true when the event
- *     is called immediately, and the EventArgs object when triggered from an event
- */
-$.fn.liveAndTestAtStart = function ( callback ){
-       $(this)
-               .live( 'change', callback )
-               .each( function ( index, element ){
-                       callback.call( this, true );
-               } );
-};
-
-// Document ready:
-$( function () {
-
-       // Animate the SelectOrOther fields, to only show the text field when
-       // 'other' is selected.
-       $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
-               var $other = $( '#' + $(this).attr( 'id' ) + '-other' );
-               $other = $other.add( $other.siblings( 'br' ) );
-               if ( $(this).val() === 'other' ) {
-                       $other.goIn( instant );
-               } else {
-                       $other.goOut( instant );
+       /**
+        * jQuery plugin to fade or snap to visible state.
+        *
+        * @param {boolean} instantToggle [optional]
+        * @return {jQuery}
+        */
+       $.fn.goIn = function ( instantToggle ) {
+               if ( instantToggle === true ) {
+                       return $(this).show();
                }
-       });
-
-});
-
+               return $(this).stop( true, true ).fadeIn();
+       };
+
+       /**
+        * jQuery plugin to fade or snap to hiding state.
+        *
+        * @param {boolean} instantToggle [optional]
+        * @return jQuery
+        */
+       $.fn.goOut = function ( instantToggle ) {
+               if ( instantToggle === true ) {
+                       return $(this).hide();
+               }
+               return $(this).stop( true, true ).fadeOut();
+       };
+
+       /**
+        * Bind a function to the jQuery object via live(), and also immediately trigger
+        * the function on the objects with an 'instant' parameter set to true.
+        * @param {Function} callback Takes one parameter, which is {true} when the
+        *  event is called immediately, and {jQuery.Event} when triggered from an event.
+        */
+       $.fn.liveAndTestAtStart = function ( callback ){
+               $(this)
+                       .live( 'change', callback )
+                       .each( function () {
+                               callback.call( this, true );
+                       } );
+       };
+
+       $( function () {
+
+               // Animate the SelectOrOther fields, to only show the text field when
+               // 'other' is selected.
+               $( '.mw-htmlform-select-or-other' ).liveAndTestAtStart( function ( instant ) {
+                       var $other = $( '#' + $(this).attr( 'id' ) + '-other' );
+                       $other = $other.add( $other.siblings( 'br' ) );
+                       if ( $(this).val() === 'other' ) {
+                               $other.goIn( instant );
+                       } else {
+                               $other.goOut( instant );
+                       }
+               });
+
+       } );
 
 }( jQuery ) );
index 86af31f..6e2d3b4 100644 (file)
@@ -5,7 +5,8 @@
 * @author neilk@wikimedia.org
 */
 ( function ( mw, $ ) {
-       var slice = Array.prototype.slice,
+       var oldParser,
+               slice = Array.prototype.slice,
                parserDefaults = {
                        magic : {
                                'SITENAME' : mw.config.get( 'wgSiteName' )
@@ -30,8 +31,8 @@
                 * @return {jQuery}
                 */
                return function ( args ) {
-                       var key = args[0];
-                       var argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
+                       var key = args[0],
+                               argsArray = $.isArray( args[1] ) ? args[1] : slice.call( args, 1 );
                        try {
                                return parser.parse( key, argsArray );
                        } catch ( e ) {
                 * 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
+                * @param {string} key Message key.
+                * @param {Array|mixed} replacements Optional variable replacements (variadically or an array).
+                * @return {string} Rendered HTML.
                 */
-               return function ( /* key, replacements */ ) {
+               return function () {
                        return failableParserFn( arguments ).html();
                };
        };
                 *    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)
+                * @param {string} key Message key.
+                * @param {Array|mixed} replacements Optional variable replacements (variadically or an array).
                 * @return {jQuery} this
                 */
-               return function ( /* key, replacements */ ) {
+               return function () {
                        var $target = this.empty();
                        $.each( failableParserFn( arguments ).contents(), function ( i, node ) {
                                $target.append( node );
                 * Where the magic happens.
                 * Parses a message from the key, and swaps in replacements as necessary, wraps in jQuery
                 * If an error is thrown, returns original key, and logs the error
-                * @param {String} message key
-                * @param {Array} replacements for $1, $2... $n
+                * @param {String} key Message key.
+                * @param {Array} replacements Variable replacements for $1, $2... $n
                 * @return {jQuery}
                 */
                parse: function ( key, replacements ) {
                        if ( this.astCache[ key ] === undefined ) {
                                var wikiText = this.settings.messages.get( key );
                                if ( typeof wikiText !== 'string' ) {
-                                       wikiText = "\\[" + key + "\\]";
+                                       wikiText = '\\[' + key + '\\]';
                                }
                                this.astCache[ key ] = this.wikiTextToAst( wikiText );
                        }
                 * @return {Mixed} abstract syntax tree
                 */
                wikiTextToAst: function ( input ) {
+                       var pos,
+                               regularLiteral, regularLiteralWithoutBar, regularLiteralWithoutSpace, backslash, anyCharacter,
+                               escapedOrLiteralWithoutSpace, escapedOrLiteralWithoutBar, escapedOrRegularLiteral,
+                               whitespace, dollar, digits,
+                               openExtlink, closeExtlink, openLink, closeLink, templateName, pipe, colon,
+                               templateContents, openTemplate, closeTemplate,
+                               nonWhitespaceExpression, paramExpression, expression, result;
 
                        // Indicates current position in input as we parse through it.
                        // Shared among all parsing functions below.
-                       var pos = 0;
+                       pos = 0;
+
                        // =========================================================
                        // parsing combinators - could be a library on its own
                        // =========================================================
                        // Try parsers until one works, if none work return null
                        function choice( ps ) {
                                return function () {
-                                       for ( var i = 0; i < ps.length; i++ ) {
-                                               var result = ps[i]();
+                                       var i, result;
+                                       for ( i = 0; i < ps.length; i++ ) {
+                                               result = ps[i]();
                                                if ( result !== null ) {
                                                         return result;
                                                }
                        // try several ps in a row, all must succeed or return null
                        // this is the only eager one
                        function sequence( ps ) {
-                               var originalPos = pos;
-                               var result = [];
-                               for ( var i = 0; i < ps.length; i++ ) {
-                                       var res = ps[i]();
+                               var i, res,
+                                       originalPos = pos,
+                                       result = [];
+                               for ( i = 0; i < ps.length; i++ ) {
+                                       res = ps[i]();
                                        if ( res === null ) {
                                                pos = originalPos;
                                                return null;
                        // must succeed a minimum of n times or return null
                        function nOrMore( n, p ) {
                                return function () {
-                                       var originalPos = pos;
-                                       var result = [];
-                                       var parsed = p();
+                                       var originalPos = pos,
+                                               result = [],
+                                               parsed = p();
                                        while ( parsed !== null ) {
                                                result.push( parsed );
                                                parsed = p();
                        // 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 backslash = makeStringParser( "\\" );
-                       var anyCharacter = makeRegexParser( /^./ );
+                       regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
+                       regularLiteralWithoutBar = makeRegexParser(/^[^{}\[\]$\\|]/);
+                       regularLiteralWithoutSpace = makeRegexParser(/^[^{}\[\]$\s]/);
+                       backslash = makeStringParser( '\\' );
+                       anyCharacter = makeRegexParser( /^./ );
                        function escapedLiteral() {
                                var result = sequence( [
                                        backslash,
                                ] );
                                return result === null ? null : result[1];
                        }
-                       var escapedOrLiteralWithoutSpace = choice( [
+                       escapedOrLiteralWithoutSpace = choice( [
                                escapedLiteral,
                                regularLiteralWithoutSpace
                        ] );
-                       var escapedOrLiteralWithoutBar = choice( [
+                       escapedOrLiteralWithoutBar = choice( [
                                escapedLiteral,
                                regularLiteralWithoutBar
                        ] );
-                       var escapedOrRegularLiteral = choice( [
+                       escapedOrRegularLiteral = choice( [
                                escapedLiteral,
                                regularLiteral
                        ] );
                                 var result = nOrMore( 1, escapedOrRegularLiteral )();
                                 return result === null ? null : result.join('');
                        }
-                       var whitespace = makeRegexParser( /^\s+/ );
-                       var dollar = makeStringParser( '$' );
-                       var digits = makeRegexParser( /^\d+/ );
+                       whitespace = makeRegexParser( /^\s+/ );
+                       dollar = makeStringParser( '$' );
+                       digits = makeRegexParser( /^\d+/ );
 
                        function replacement() {
                                var result = sequence( [
                                }
                                return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
                        }
-                       var openExtlink = makeStringParser( '[' );
-                       var closeExtlink = makeStringParser( ']' );
+                       openExtlink = makeStringParser( '[' );
+                       closeExtlink = makeStringParser( ']' );
                        // this extlink MUST have inner text, e.g. [foo] not allowed; [foo bar] is allowed
                        function extlink() {
-                               var result = null;
-                               var parsedResult = sequence( [
+                               var result, parsedResult;
+                               result = null;
+                               parsedResult = sequence( [
                                        openExtlink,
                                        nonWhitespaceExpression,
                                        whitespace,
                                }
                                return [ 'LINKPARAM', parseInt( result[2], 10 ) - 1, result[4] ];
                        }
-                       var openLink = makeStringParser( '[[' );
-                       var closeLink = makeStringParser( ']]' );
+                       openLink = makeStringParser( '[[' );
+                       closeLink = makeStringParser( ']]' );
                        function link() {
-                               var result = null;
-                               var parsedResult = sequence( [
+                               var result, parsedResult;
+                               result = null;
+                               parsedResult = sequence( [
                                        openLink,
                                        expression,
                                        closeLink
                                }
                                return result;
                        }
-                       var templateName = transform(
+                       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(); }
                        );
                        function templateParam() {
-                               var result = sequence( [
+                               var expr, result;
+                               result = sequence( [
                                        pipe,
                                        nOrMore( 0, paramExpression )
                                ] );
                                if ( result === null ) {
                                        return null;
                                }
-                               var expr = result[1];
-                               // use a "CONCAT" operator if there are multiple nodes, otherwise return the first node, raw.
-                               return expr.length > 1 ? [ "CONCAT" ].concat( expr ) : expr[0];
+                               expr = result[1];
+                               // use a CONCAT operator if there are multiple nodes, otherwise return the first node, raw.
+                               return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
                        }
-                       var pipe = makeStringParser( '|' );
+                       pipe = makeStringParser( '|' );
                        function templateWithReplacement() {
                                var result = sequence( [
                                        templateName,
                                ] );
                                return result === null ? null : [ result[0], result[2] ];
                        }
-                       var colon = makeStringParser(':');
-                       var templateContents = choice( [
+                       colon = makeStringParser(':');
+                       templateContents = choice( [
                                function () {
                                        var res = sequence( [
                                                // templates can have placeholders for dynamic replacement eg: {{PLURAL:$1|one car|$1 cars}}
                                        return [ res[0] ].concat( res[1] );
                                }
                        ] );
-                       var openTemplate = makeStringParser('{{');
-                       var closeTemplate = makeStringParser('}}');
+                       openTemplate = makeStringParser('{{');
+                       closeTemplate = makeStringParser('}}');
                        function template() {
                                var result = sequence( [
                                        openTemplate,
                                ] );
                                return result === null ? null : result[1];
                        }
-                       var nonWhitespaceExpression = choice( [
+                       nonWhitespaceExpression = choice( [
                                template,
                                link,
                                extLinkParam,
                                replacement,
                                literalWithoutSpace
                        ] );
-                       var paramExpression = choice( [
+                       paramExpression = choice( [
                                template,
                                link,
                                extLinkParam,
                                replacement,
                                literalWithoutBar
                        ] );
-                       var expression = choice( [
+                       expression = choice( [
                                template,
                                link,
                                extLinkParam,
                                if ( result === null ) {
                                        return null;
                                }
-                               return [ "CONCAT" ].concat( result );
+                               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();
+                       result = start();
 
                        /*
                         * 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.
                         */
-                       if (result === null || pos !== input.length) {
-                               throw new Error( "Parse error at position " + pos.toString() + " in input: " + input );
+                       if ( result === null || pos !== input.length ) {
+                               throw new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + input );
                        }
                        return result;
                }
                 * @return {Mixed} single-string node or array of nodes suitable for jQuery appending
                 */
                this.emit = function ( node, replacements ) {
-                       var ret = null;
-                       var jmsg = this;
+                       var ret, subnodes, operation,
+                               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 ) {
+                               // typeof returns object for arrays
+                               case 'object':
+                                       // node is an array of nodes
+                                       subnodes = $.map( node.slice( 1 ), function ( n ) {
                                                return jmsg.emit( n, replacements );
                                        } );
-                                       var operation = node[0].toLowerCase();
+                                       operation = node[0].toLowerCase();
                                        if ( typeof jmsg[operation] === 'function' ) {
                                                ret = jmsg[ operation ]( subnodes, replacements );
                                        } else {
                /**
                 * Transform wiki-link
                 * TODO unimplemented
+                * @param nodes
                 */
-               wlink: function ( nodes ) {
+               wlink: function () {
                        return 'unimplemented';
                },
 
                 * @return {jQuery}
                 */
                link: function ( nodes ) {
-                       var arg = nodes[0];
-                       var contents = nodes[1];
-                       var $el;
+                       var $el,
+                               arg = nodes[0],
+                               contents = nodes[1];
                        if ( arg instanceof jQuery ) {
                                $el = arg;
                        } else {
                 * @return {String} selected pluralized form according to current language
                 */
                plural: function ( nodes ) {
-                       var count = parseFloat( this.language.convertNumber( nodes[0], true ) );
-                       var forms = nodes.slice(1);
+                       var forms, count;
+                       count = parseFloat( this.language.convertNumber( nodes[0], true ) );
+                       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} ]
+                * Transform parsed structure according to gender.
+                * Usage {{gender:[ gender | mw.user object ] | masculine form|feminine form|neutral form}}.
+                * The first node is either a string, which can be "male" or "female",
+                * or a User object (not a username).
+                *
+                * @param {Array} of nodes, [ {String|mw.User}, {String}, {String}, {String} ]
                 * @return {String} selected gender form according to current language
                 */
                gender: function ( nodes ) {
-                       var gender;
-                       if  ( nodes[0] && nodes[0].options instanceof mw.Map ){
+                       var gender, forms;
+
+                       if  ( nodes[0] && nodes[0].options instanceof mw.Map ) {
                                gender = nodes[0].options.get( 'gender' );
                        } else {
                                gender = nodes[0];
                        }
-                       var forms = nodes.slice(1);
+
+                       forms = nodes.slice( 1 );
+
                        return this.language.gender( gender, forms );
                },
 
                 * @return {String} selected grammatical form according to current language
                 */
                grammar: function ( nodes ) {
-                       var form = nodes[0];
-                       var word = nodes[1];
+                       var form = nodes[0],
+                               word = nodes[1];
                        return word && form && this.language.convertGrammar( word, form );
                }
        };
        $.fn.msg = mw.jqueryMsg.getPlugin();
 
        // Replace the default message parser with jqueryMsg
-       var oldParser = mw.Message.prototype.parser;
+       oldParser = mw.Message.prototype.parser;
        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
index f0e464d..b0abc9e 100644 (file)
@@ -3,7 +3,7 @@
  */
 
 var mw = ( function ( $, undefined ) {
-       "use strict";
+       'use strict';
 
        /* Private Members */
 
@@ -290,14 +290,14 @@ var mw = ( function ( $, undefined ) {
                 * Gets a message object, similar to wfMessage()
                 *
                 * @param key string Key of message to get
-                * @param parameter_1 mixed First argument in a list of variadic arguments,
+                * @param parameter1 mixed First argument in a list of variadic arguments,
                 *  each a parameter for $N replacement in messages.
                 * @return Message
                 */
-               message: function ( key, parameter_1 /* [, parameter_2] */ ) {
+               message: function ( key, parameter1 ) {
                        var parameters;
                        // Support variadic arguments
-                       if ( parameter_1 !== undefined ) {
+                       if ( parameter1 !== undefined ) {
                                parameters = slice.call( arguments );
                                parameters.shift();
                        } else {
@@ -393,78 +393,94 @@ var mw = ( function ( $, undefined ) {
                         * Create a new style tag and add it to the DOM.
                         *
                         * @param text String: CSS text
-                        * @param $nextnode mixed: [optional] An Element or jQuery object for an element where
+                        * @param nextnode mixed: [optional] An Element or jQuery object for an element where
                         * the style tag should be inserted before. Otherwise appended to the <head>.
                         * @return HTMLStyleElement
                         */
-                       function addStyleTag( text, $nextnode ) {
+                       function addStyleTag( text, nextnode ) {
                                var s = document.createElement( 'style' );
-                               s.type = 'text/css';
-                               s.rel = 'stylesheet';
                                // Insert into document before setting cssText (bug 33305)
-                               if ( $nextnode ) {
-                                       // If a raw element, create a jQuery object, otherwise use directly
-                                       if ( $nextnode.nodeType ) {
-                                               $nextnode = $( $nextnode );
+                               if ( nextnode ) {
+                                       // Must be inserted with native insertBefore, not $.fn.before.
+                                       // When using jQuery to insert it, like $nextnode.before( s ),
+                                       // then IE6 will throw "Access is denied" when trying to append
+                                       // to .cssText later. Some kind of weird security measure.
+                                       // http://stackoverflow.com/q/12586482/319266
+                                       // Works: jsfiddle.net/zJzMy/1
+                                       // Fails: jsfiddle.net/uJTQz
+                                       // Works again: http://jsfiddle.net/Azr4w/ (diff: the next 3 lines)
+                                       if ( nextnode.jquery ) {
+                                               nextnode = nextnode.get( 0 );
                                        }
-                                       $nextnode.before( s );
+                                       nextnode.parentNode.insertBefore( s, nextnode );
                                } else {
-                                       document.getElementsByTagName('head')[0].appendChild( s );
+                                       document.getElementsByTagName( 'head' )[0].appendChild( s );
                                }
                                if ( s.styleSheet ) {
-                                       s.styleSheet.cssText = text; // IE
+                                       // IE
+                                       s.styleSheet.cssText = text;
                                } else {
-                                       // Safari sometimes borks on null
+                                       // Other browsers.
+                                       // (Safari sometimes borks on non-string values,
+                                       // play safe by casting to a string, just in case.)
                                        s.appendChild( document.createTextNode( String( text ) ) );
                                }
                                return s;
                        }
 
-                       function addInlineCSS( css ) {
-                               var $style, style, $newStyle;
+                       /**
+                        * Checks if certain cssText is safe to append to
+                        * a stylesheet.
+                        *
+                        * Right now it only makes sure that cssText containing @import
+                        * rules will end up in a new stylesheet (as those only work when
+                        * placed at the start of a stylesheet; bug 35562).
+                        * This could later be extended to take care of other bugs, such as
+                        * the IE cssRules limit - not the same as the IE styleSheets limit).
+                        */
+                       function canExpandStylesheetWith( $style, cssText ) {
+                               return cssText.indexOf( '@import' ) === -1;
+                       }
+
+                       function addEmbeddedCSS( cssText ) {
+                               var $style, styleEl;
                                $style = getMarker().prev();
-                               // Disable <style> tag recycling/concatenation because of bug 34669
-                               if ( false && $style.is( 'style' ) && $style.data( 'ResourceLoaderDynamicStyleTag' ) === true ) {
-                                       // There's already a dynamic <style> tag present, append to it. This recycling of
-                                       // <style> tags is for bug 31676 (can't have more than 32 <style> tags in IE)
-                                       style = $style.get( 0 );
-                                       if ( style.styleSheet ) {
-                                               style.styleSheet.cssText += css; // IE
+                               // Re-use <style> tags if possible, this to try to stay
+                               // under the IE stylesheet limit (bug 31676).
+                               // Also verify that the the element before Marker actually is one
+                               // that came from ResourceLoader, and not a style tag that some
+                               // other script inserted before our marker, or, more importantly,
+                               // it may not be a style tag at all (could be <meta> or <script>).
+                               if (
+                                       $style.data( 'ResourceLoaderDynamicStyleTag' ) === true &&
+                                       canExpandStylesheetWith( $style, cssText )
+                               ) {
+                                       // There's already a dynamic <style> tag present and
+                                       // canExpandStylesheetWith() gave a green light to append more to it.
+                                       styleEl = $style.get( 0 );
+                                       if ( styleEl.styleSheet ) {
+                                               try {
+                                                       styleEl.styleSheet.cssText += cssText; // IE
+                                               } catch ( e ) {
+                                                       log( 'addEmbeddedCSS fail\ne.message: ' + e.message, e );
+                                               }
                                        } else {
-                                               style.appendChild( document.createTextNode( String( css ) ) );
+                                               styleEl.appendChild( document.createTextNode( String( cssText ) ) );
                                        }
                                } else {
-                                       $newStyle = $( addStyleTag( css, getMarker() ) )
+                                       $( addStyleTag( cssText, getMarker() ) )
                                                .data( 'ResourceLoaderDynamicStyleTag', true );
                                }
                        }
 
-                       function compare( a, b ) {
-                               var i;
-                               if ( a.length !== b.length ) {
-                                       return false;
-                               }
-                               for ( i = 0; i < b.length; i += 1 ) {
-                                       if ( $.isArray( a[i] ) ) {
-                                               if ( !compare( a[i], b[i] ) ) {
-                                                       return false;
-                                               }
-                                       }
-                                       if ( a[i] !== b[i] ) {
-                                               return false;
-                                       }
-                               }
-                               return true;
-                       }
-
                        /**
                         * Generates an ISO8601 "basic" string from a UNIX timestamp
                         */
                        function formatVersionNumber( timestamp ) {
-                               var     pad = function ( a, b, c ) {
-                                               return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
-                                       },
-                                       d = new Date();
+                               var     d = new Date();
+                               function pad( a, b, c ) {
+                                       return [a < 10 ? '0' + a : a, b < 10 ? '0' + b : b, c < 10 ? '0' + c : c].join( '' );
+                               }
                                d.setTime( timestamp * 1000 );
                                return [
                                        pad( d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate() ), 'T',
@@ -678,7 +694,7 @@ var mw = ( function ( $, undefined ) {
                                                j -= 1;
                                                try {
                                                        if ( hasErrors ) {
-                                                               throw new Error ("Module " + module + " failed.");
+                                                               throw new Error( 'Module ' + module + ' failed.');
                                                        } else {
                                                                if ( $.isFunction( job.ready ) ) {
                                                                        job.ready();
@@ -724,16 +740,20 @@ var mw = ( function ( $, undefined ) {
                                // 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.
+                                       // Can't use jQuery.getScript because that only uses <script> for cross-domain,
+                                       // it uses XHR and eval for same-domain scripts, which we don't want because it
+                                       // messes up line numbers.
+                                       // The below is based on jQuery ([jquery@1.8.2]/src/ajax/script.js)
+
+                                       // IE-safe way of getting the <head>. document.head isn't supported
+                                       // in old IE, and doesn't work when in the <head>.
+                                       head = document.getElementsByTagName( 'head' )[0] || document.body;
+
                                        script = document.createElement( 'script' );
-                                       script.setAttribute( 'src', src );
-                                       script.setAttribute( 'type', 'text/javascript' );
+                                       script.async = true;
+                                       script.src = src;
                                        if ( $.isFunction( callback ) ) {
-                                               // Attach handlers for all browsers (based on jQuery.ajax)
                                                script.onload = script.onreadystatechange = function () {
-
                                                        if (
                                                                !done
                                                                && (
@@ -741,24 +761,20 @@ var mw = ( function ( $, undefined ) {
                                                                        || /loaded|complete/.test( script.readyState )
                                                                )
                                                        ) {
-
                                                                done = true;
 
-                                                               callback();
+                                                               // Handle memory leak in IE
+                                                               script.onload = script.onreadystatechange = null;
 
-                                                               // Handle memory leak in IE. This seems to fail in
-                                                               // IE7 sometimes (Permission Denied error when
-                                                               // accessing script.parentNode) so wrap it in
-                                                               // a try catch.
-                                                               try {
-                                                                       script.onload = script.onreadystatechange = null;
-                                                                       if ( script.parentNode ) {
-                                                                               script.parentNode.removeChild( script );
-                                                                       }
-
-                                                                       // Dereference the script
-                                                                       script = undefined;
-                                                               } catch ( e ) { }
+                                                               // Remove the script
+                                                               if ( script.parentNode ) {
+                                                                       script.parentNode.removeChild( script );
+                                                               }
+
+                                                               // Dereference the script
+                                                               script = undefined;
+
+                                                               callback();
                                                        }
                                                };
                                        }
@@ -766,20 +782,17 @@ var mw = ( function ( $, undefined ) {
                                        if ( window.opera ) {
                                                // Appending to the <head> blocks rendering completely in Opera,
                                                // so append to the <body> after document ready. This means the
-                                               // scripts only start loading after  the document has been rendered,
+                                               // 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 ); } );
+                                               // browser makes it impossible.
+                                               $( 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>
-                                               head = document.getElementsByTagName( 'head' )[0];
-                                               ( document.body || head ).appendChild( script );
+                                               head.appendChild( script );
                                        }
                                } else {
-                                       document.write( mw.html.element(
-                                               'script', { 'type': 'text/javascript', 'src': src }, ''
-                                       ) );
+                                       document.write( mw.html.element( 'script', { 'src': src }, '' ) );
                                        if ( $.isFunction( callback ) ) {
                                                // Document.write is synchronous, so this is called when it's done
                                                // FIXME: that's a lie. doc.write isn't actually synchronous
@@ -794,7 +807,7 @@ var mw = ( function ( $, undefined ) {
                         * @param module string module name to execute
                         */
                        function execute( module ) {
-                               var style, media, i, script, markModuleReady, nestedAddScript;
+                               var key, value, media, i, urls, script, markModuleReady, nestedAddScript;
 
                                if ( registry[module] === undefined ) {
                                        throw new Error( 'Module has not been registered yet: ' + module );
@@ -806,28 +819,77 @@ var mw = ( function ( $, undefined ) {
                                        throw new Error( 'Module has already been loaded: ' + module );
                                }
 
-                               // Add styles
+                               /**
+                                * Define loop-function here for efficiency
+                                * and to avoid re-using badly scoped variables.
+                                */
+                               function addLink( media, url ) {
+                                       var el = document.createElement( 'link' );
+                                       getMarker().before( el ); // IE: Insert in dom before setting href
+                                       el.rel = 'stylesheet';
+                                       if ( media && media !== 'all' ) {
+                                               el.media = media;
+                                       }
+                                       el.href = url;
+                               }
+
+                               // Process styles (see also mw.loader.implement)
+                               // * back-compat: { <media>: css }
+                               // * back-compat: { <media>: [url, ..] }
+                               // * { "css": [css, ..] }
+                               // * { "url": { <media>: [url, ..] } }
                                if ( $.isPlainObject( registry[module].style ) ) {
-                                       // 'media' type ignored, see documentation of mw.loader.implement
-                                       for ( media in registry[module].style ) {
-                                               style = registry[module].style[media];
-                                               if ( $.isArray( style ) ) {
-                                                       for ( i = 0; i < style.length; i += 1 ) {
-                                                               getMarker().before( mw.html.element( 'link', {
-                                                                       'type': 'text/css',
-                                                                       'rel': 'stylesheet',
-                                                                       'href': style[i]
-                                                               } ) );
+                                       for ( key in registry[module].style ) {
+                                               value = registry[module].style[key];
+                                               media = undefined;
+
+                                               if ( key !== 'url' && key !== 'css' ) {
+                                                       // Backwards compatibility, key is a media-type
+                                                       if ( typeof value === 'string' ) {
+                                                               // back-compat: { <media>: css }
+                                                               // Ignore 'media' because it isn't supported (nor was it used).
+                                                               // Strings are pre-wrapped in "@media". The media-type was just ""
+                                                               // (because it had to be set to something).
+                                                               // This is one of the reasons why this format is no longer used.
+                                                               addEmbeddedCSS( value );
+                                                       } else {
+                                                               // back-compat: { <media>: [url, ..] }
+                                                               media = key;
+                                                               key = 'bc-url';
+                                                       }
+                                               }
+
+                                               // Array of css strings in key 'css',
+                                               // or back-compat array of urls from media-type
+                                               if ( $.isArray( value ) ) {
+                                                       for ( i = 0; i < value.length; i += 1 ) {
+                                                               if ( key === 'bc-url' ) {
+                                                                       // back-compat: { <media>: [url, ..] }
+                                                                       addLink( media, value[i] );
+                                                               } else if ( key === 'css' ) {
+                                                                       // { "css": [css, ..] }
+                                                                       addEmbeddedCSS( value[i] );
+                                                               }
+                                                       }
+                                               // Not an array, but a regular object
+                                               // Array of urls inside media-type key
+                                               } else if ( typeof value === 'object' ) {
+                                                       // { "url": { <media>: [url, ..] } }
+                                                       for ( media in value ) {
+                                                               urls = value[media];
+                                                               for ( i = 0; i < urls.length; i += 1 ) {
+                                                                       addLink( media, urls[i] );
+                                                               }
                                                        }
-                                               } else if ( typeof style === 'string' ) {
-                                                       addInlineCSS( style );
                                                }
                                        }
                                }
+
                                // Add localizations to message system
                                if ( $.isPlainObject( registry[module].messages ) ) {
                                        mw.messages.set( registry[module].messages );
                                }
+
                                // Execute script
                                try {
                                        script = registry[module].script;
@@ -860,7 +922,7 @@ var mw = ( function ( $, undefined ) {
                                } catch ( e ) {
                                        // This needs to NOT use mw.log because these errors are common in production mode
                                        // and not in debug mode, such as when a symbol that should be global isn't exported
-                                       log('mw.loader::execute> Exception thrown by ' + module + ': ' + e.message, e);
+                                       log( 'Exception thrown by ' + module + ': ' + e.message, e );
                                        registry[module].state = 'error';
                                        handlePending( module );
                                }
@@ -877,7 +939,7 @@ var mw = ( function ( $, undefined ) {
                         *  document ready has not yet occurred
                         */
                        function request( dependencies, ready, error, async ) {
-                               var regItemDeps, regItemDepLen, n;
+                               var n;
 
                                // Allow calling by single module name
                                if ( typeof dependencies === 'string' ) {
@@ -949,7 +1011,7 @@ var mw = ( function ( $, undefined ) {
                         */
                        function doRequest( moduleMap, currReqBase, sourceLoadScript, async ) {
                                var request = $.extend(
-                                       { 'modules': buildModulesString( moduleMap ) },
+                                       { modules: buildModulesString( moduleMap ) },
                                        currReqBase
                                );
                                request = sortQuery( request );
@@ -1044,9 +1106,9 @@ var mw = ( function ( $, undefined ) {
                                                                }
                                                        }
 
-                                                       currReqBase = $.extend( { 'version': formatVersionNumber( maxVersion ) }, reqBase );
+                                                       currReqBase = $.extend( { version: formatVersionNumber( maxVersion ) }, reqBase );
                                                        // For user modules append a user name to the request.
-                                                       if ( group === "user" && mw.config.get( 'wgUserName' ) !== null ) {
+                                                       if ( group === 'user' && mw.config.get( 'wgUserName' ) !== null ) {
                                                                currReqBase.user = mw.config.get( 'wgUserName' );
                                                        }
                                                        currReqBaseLength = $.param( currReqBase ).length;
@@ -1159,15 +1221,15 @@ var mw = ( function ( $, undefined ) {
                                        }
                                        // List the module as registered
                                        registry[module] = {
-                                               'version': version !== undefined ? parseInt( version, 10 ) : 0,
-                                               'dependencies': [],
-                                               'group': typeof group === 'string' ? group : null,
-                                               'source': typeof source === 'string' ? source: 'local',
-                                               'state': 'registered'
+                                               version: version !== undefined ? parseInt( version, 10 ) : 0,
+                                               dependencies: [],
+                                               group: typeof group === 'string' ? group : null,
+                                               source: typeof source === 'string' ? source: 'local',
+                                               state: 'registered'
                                        };
                                        if ( typeof dependencies === 'string' ) {
                                                // Allow dependencies to be given as a single module name
-                                               registry[module].dependencies = [dependencies];
+                                               registry[module].dependencies = [ dependencies ];
                                        } else if ( typeof dependencies === 'object' || $.isFunction( dependencies ) ) {
                                                // Allow dependencies to be given as an array of module names
                                                // or a function which returns an array
@@ -1182,17 +1244,20 @@ var mw = ( function ( $, undefined ) {
                                 *
                                 * All arguments are required.
                                 *
-                                * @param module String: Name of module
-                                * @param script Mixed: Function of module code or String of URL to be used as the src
-                                *  attribute when adding a script element to the body
-                                * @param style Object: Object of CSS strings keyed by media-type or Object of lists of URLs
-                                *  keyed by media-type. Media-type should be "all" or "", actual types are not supported
-                                *  right now due to the way execute() processes the stylesheets (they are concatenated
-                                *  into a single <style> tag). In the past these weren't concatenated together (which is
-                                *  these are keyed by media-type),  but bug 31676 forces us to. In practice this is not a
-                                *  problem because ResourceLoader only generates stylesheets for media-type all (e.g. print
-                                *  stylesheets are wrapped in @media print {} and concatenated with the others).
-                                * @param msgs Object: List of key/value pairs to be passed through mw.messages.set
+                                * @param {String} module Name of module
+                                * @param {Function|Array} script Function with module code or Array of URLs to
+                                *  be used as the src attribute of a new <script> tag.
+                                * @param {Object} style Should follow one of the following patterns:
+                                *  { "css": [css, ..] }
+                                *  { "url": { <media>: [url, ..] } }
+                                *  And for backwards compatibility (needs to be supported forever due to caching):
+                                *  { <media>: css }
+                                *  { <media>: [url, ..] }
+                                *
+                                *  The reason css strings are not concatenated anymore is bug 31676. We now check
+                                *  whether it's safe to extend the stylesheet (see canExpandStylesheetWith).
+                                *
+                                * @param {Object} msgs List of key/value pairs to be passed through mw.messages.set
                                 */
                                implement: function ( module, script, style, msgs ) {
                                        // Validate input
@@ -1245,7 +1310,7 @@ var mw = ( function ( $, undefined ) {
                                        }
                                        // Allow calling with a single dependency as a string
                                        if ( tod === 'string' ) {
-                                               dependencies = [dependencies];
+                                               dependencies = [ dependencies ];
                                        }
                                        // Resolve entire dependency map
                                        dependencies = resolve( dependencies );
@@ -1280,7 +1345,7 @@ var mw = ( function ( $, undefined ) {
                                 *  be assumed if loading a URL, and false will be assumed otherwise.
                                 */
                                load: function ( modules, type, async ) {
-                                       var filtered, m, module;
+                                       var filtered, m, module, l;
 
                                        // Validate input
                                        if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
@@ -1295,11 +1360,13 @@ var mw = ( function ( $, undefined ) {
                                                                async = true;
                                                        }
                                                        if ( type === 'text/css' ) {
-                                                               $( 'head' ).append( $( '<link>', {
-                                                                       rel: 'stylesheet',
-                                                                       type: 'text/css',
-                                                                       href: modules
-                                                               } ) );
+                                                               // IE7-8 throws security warnings when inserting a <link> tag
+                                                               // with a protocol-relative URL set though attributes (instead of
+                                                               // properties) - when on HTTPS. See also bug #.
+                                                               l = document.createElement( 'link' );
+                                                               l.rel = 'stylesheet';
+                                                               l.href = modules;
+                                                               $( 'head' ).append( l );
                                                                return;
                                                        }
                                                        if ( type === 'text/javascript' || type === undefined ) {
@@ -1310,7 +1377,7 @@ var mw = ( function ( $, undefined ) {
                                                        throw new Error( 'invalid type for external url, must be text/css or text/javascript. not ' + type );
                                                }
                                                // Called with single module
-                                               modules = [modules];
+                                               modules = [ modules ];
                                        }
 
                                        // Filter out undefined modules, otherwise resolve() will throw
@@ -1362,7 +1429,7 @@ var mw = ( function ( $, undefined ) {
                                        if ( registry[module] === undefined ) {
                                                mw.loader.register( module );
                                        }
-                                       if ( $.inArray(state, ['ready', 'error', 'missing']) !== -1
+                                       if ( $.inArray( state, ['ready', 'error', 'missing'] ) !== -1
                                                && registry[module].state !== state ) {
                                                // Make sure pending modules depending on this one get executed if their
                                                // dependencies are now fulfilled!
@@ -1428,7 +1495,7 @@ var mw = ( function ( $, undefined ) {
                html: ( function () {
                        function escapeCallback( s ) {
                                switch ( s ) {
-                                       case "'":
+                                       case '\'':
                                                return '&#039;';
                                        case '"':
                                                return '&quot;';
index 5bcbfcc..35cc6d8 100644 (file)
@@ -4,7 +4,8 @@
 ( function ( mw, $ ) {
        'use strict';
 
-       var isPageReady = false,
+       var notification,
+               isPageReady = false,
                isInitialized = false,
                preReadyNotifQueue = [],
                /**
@@ -88,7 +89,9 @@
                        // Other notification elements matching the same tag
                        $tagMatches,
                        outerHeight,
-                       placeholderHeight;
+                       placeholderHeight,
+                       autohideCount,
+                       notif;
 
                if ( this.isOpen ) {
                        return;
                                                }
                                        } );
 
+                       notif = this;
+
                        // Create a clear placeholder we can use to make the notifications around the notification that is being
                        // replaced expand or contract gracefully to fit the height of the new notification.
-                       var self = this;
-                       self.$replacementPlaceholder = $( '<div>' )
+                       notif.$replacementPlaceholder = $( '<div>' )
                                // Set the height to the space the previous notification or placeholder took
                                .css( 'height', outerHeight )
                                // Make sure that this placeholder is at the very end of this tagged notification group
                                                        // Reset the notification position after we've finished the space animation
                                                        // However do not do it if the placeholder was removed because another tagged
                                                        // notification went and closed this one.
-                                                       if ( self.$replacementPlaceholder ) {
+                                                       if ( notif.$replacementPlaceholder ) {
                                                                $notification.css( 'position', '' );
                                                        }
                                                        // Finally, remove the placeholder from the DOM
                // By default a notification is paused.
                // If this notification is within the first {autoHideLimit} notifications then
                // start the auto-hide timer as soon as it's created.
-               var autohideCount = $area.find( '.mw-notification-autohide' ).length;
+               autohideCount = $area.find( '.mw-notification-autohide' ).length;
                if ( autohideCount <= notification.autoHideLimit ) {
                        this.resume();
                }
                        } )
                        // Fix the top/left position to the current computed position from which we
                        // can animate upwards.
-                       .css( this.$notification.position() )
-                       // Animate opacity and top to create fade upwards animation for notification closing
+                       .css( this.$notification.position() );
+
+               // This needs to be done *after* notification's position has been made absolute.
+               if ( options.placeholder ) {
+                       // Insert a placeholder with a height equal to the height of the
+                       // notification plus it's vertical margins in place of the notification
+                       var $placeholder = $( '<div>' )
+                               .css( 'height', this.$notification.outerHeight( true ) )
+                               .insertBefore( this.$notification );
+               }
+
+               // Animate opacity and top to create fade upwards animation for notification closing
+               this.$notification
                        .animate( {
                                opacity: 0,
                                top: '-=35'
                                        }
                                }
                        } );
-
-               if ( options.placeholder ) {
-                       // Insert a placeholder with a height equal to the height of the
-                       // notification plus it's vertical margins in place of the notification
-                       var $placeholder = $( '<div>' )
-                               .css( 'height', this.$notification.outerHeight( true ) )
-                               .insertBefore( this.$notification );
-               }
        };
 
        /**
                }
        }
 
-       var notification = {
+       notification = {
                /**
                 * Pause auto-hide timers for all notifications.
                 * Notifications will not auto-hide until resume is called.
diff --git a/resources/mediawiki/mediawiki.searchSuggest.js b/resources/mediawiki/mediawiki.searchSuggest.js
new file mode 100644 (file)
index 0000000..99a5557
--- /dev/null
@@ -0,0 +1,166 @@
+/**
+ * Add search suggestions to the search form.
+ */
+( function ( mw, $ ) {
+       $( document ).ready( function ( $ ) {
+               var map, searchboxesSelectors,
+                       // Region where the suggestions box will appear directly below
+                       // (using the same width). Can be a container element or the input
+                       // itself, depending on what suits best in the environment.
+                       // For Vector the suggestion box should align with the simpleSearch
+                       // container's borders, in other skins it should align with the input
+                       // element (not the search form, as that would leave the buttons
+                       // vertically between the input and the suggestions).
+                       $searchRegion = $( '#simpleSearch, #searchInput' ).first(),
+                       $searchInput = $( '#searchInput' );
+
+               // Compatibility map
+               map = {
+                       browsers: {
+                               // Left-to-right languages
+                               ltr: {
+                                       // SimpleSearch is broken in Opera < 9.6
+                                       opera: [['>=', 9.6]],
+                                       docomo: false,
+                                       blackberry: false,
+                                       ipod: false,
+                                       iphone: false
+                               },
+                               // Right-to-left languages
+                               rtl: {
+                                       opera: [['>=', 9.6]],
+                                       docomo: false,
+                                       blackberry: false,
+                                       ipod: false,
+                                       iphone: false
+                               }
+                       }
+               };
+
+               if ( !$.client.test( map ) ) {
+                       return;
+               }
+
+               // General suggestions functionality for all search boxes
+               searchboxesSelectors = [
+                       // Primary searchbox on every page in standard skins
+                       '#searchInput',
+                       // Secondary searchbox in legacy skins (LegacyTemplate::searchForm uses id "searchInput + unique id")
+                       '#searchInput2',
+                       // Special:Search
+                       '#powerSearchText',
+                       '#searchText',
+                       // Generic selector for skins with multiple searchboxes (used by CologneBlue)
+                       '.mw-searchInput'
+               ];
+               $( searchboxesSelectors.join(', ') )
+                       .suggestions( {
+                               fetch: function ( query ) {
+                                       var $el, jqXhr;
+
+                                       if ( query.length !== 0 ) {
+                                               $el = $(this);
+                                               jqXhr = $.ajax( {
+                                                       url: mw.util.wikiScript( 'api' ),
+                                                       data: {
+                                                               format: 'json',
+                                                               action: 'opensearch',
+                                                               search: query,
+                                                               namespace: 0,
+                                                               suggest: ''
+                                                       },
+                                                       dataType: 'json',
+                                                       success: function ( data ) {
+                                                               if ( $.isArray( data ) && data.length ) {
+                                                                       $el.suggestions( 'suggestions', data[1] );
+                                                               }
+                                                       }
+                                               });
+                                               $el.data( 'request', jqXhr );
+                                       }
+                               },
+                               cancel: function () {
+                                       var jqXhr = $(this).data( 'request' );
+                                       // If the delay setting has caused the fetch to have not even happened
+                                       // yet, the jqXHR object will have never been set.
+                                       if ( jqXhr && $.isFunction( jqXhr.abort ) ) {
+                                               jqXhr.abort();
+                                               $(this).removeData( 'request' );
+                                       }
+                               },
+                               result: {
+                                       select: function ( $input ) {
+                                               $input.closest( 'form' ).submit();
+                                       }
+                               },
+                               delay: 120,
+                               highlightInput: true
+                       } )
+                       .bind( 'paste cut drop', function () {
+                               // make sure paste and cut events from the mouse and drag&drop events
+                               // trigger the keypress handler and cause the suggestions to update
+                               $( this ).trigger( 'keypress' );
+                       } );
+
+               // Ensure that the thing is actually present!
+               if ( $searchRegion.length === 0 ) {
+                       // Don't try to set anything up if simpleSearch is disabled sitewide.
+                       // The loader code loads us if the option is present, even if we're
+                       // not actually enabled (anymore).
+                       return;
+               }
+
+               // Placeholder text for search box
+               $searchInput
+                       .attr( 'placeholder', mw.msg( 'searchsuggest-search' ) )
+                       .placeholder();
+
+               // Special suggestions functionality for skin-provided search box
+               $searchInput.suggestions( {
+                       result: {
+                               select: function ( $input ) {
+                                       $input.closest( 'form' ).submit();
+                               }
+                       },
+                       special: {
+                               render: function ( query ) {
+                                       var $el = this;
+                                       if ( $el.children().length === 0 ) {
+                                               $el
+                                                       .append(
+                                                               $( '<div>' )
+                                                                       .addClass( 'special-label' )
+                                                                       .text( mw.msg( 'searchsuggest-containing' ) ),
+                                                               $( '<div>' )
+                                                                       .addClass( 'special-query' )
+                                                                       .text( query )
+                                                                       .autoEllipsis()
+                                                       )
+                                                       .show();
+                                       } else {
+                                               $el.find( '.special-query' )
+                                                       .text( query )
+                                                       .autoEllipsis();
+                                       }
+                               },
+                               select: function ( $input ) {
+                                       $input.closest( 'form' ).append(
+                                               $( '<input type="hidden" name="fulltext" value="1"/>' )
+                                       );
+                                       $input.closest( 'form' ).submit();
+                               }
+                       },
+                       $region: $searchRegion
+               } );
+
+               // In most skins (at least Monobook and Vector), the font-size is messed up in <body>.
+               // (they use 2 elements to get a sane font-height). So, instead of making exceptions for
+               // each skin or adding more stylesheets, just copy it from the active element so auto-fit.
+               $searchInput
+                       .data( 'suggestions-context' )
+                       .data.$container
+                               .css( 'fontSize', $searchInput.css( 'fontSize' ) );
+
+       } );
+
+}( mediaWiki, jQuery ) );
index 2928438..05ffcc0 100644 (file)
@@ -62,7 +62,8 @@
 
                        /* Fill $content var */
                        util.$content = ( function () {
-                               var $content, selectors = [
+                               var i, l, $content, selectors;
+                               selectors = [
                                        // The preferred standard for setting $content (class="mw-body")
                                        // You may also use (class="mw-body mw-body-primary") if you use
                                        // mw-body in multiple locations.
@@ -94,7 +95,7 @@
                                        // not inserted bodytext yet. But in any case <body> should always exist
                                        'body'
                                ];
-                               for ( var i = 0, l = selectors.length; i < l; i++ ) {
+                               for ( i = 0, l = selectors.length; i < l; i++ ) {
                                        $content = $( selectors[i] ).first();
                                        if ( $content.length ) {
                                                return $content;
                 * @return mixed Parameter value or null.
                 */
                getParamValue: function ( param, url ) {
-                       url = url || document.location.href;
+                       if ( url === undefined ) {
+                               url = document.location.href;
+                       }
                        // Get last match, stop at hash
                        var     re = new RegExp( '^[^#]*[&?]' + $.escapeRE( param ) + '=([^&#]*)' ),
                                m = re.exec( url );
                        // just add it to the bottom of their 'sidebar' element as a fallback
                        switch ( mw.config.get( 'skin' ) ) {
                        case 'standard':
-                       case 'cologneblue':
                                $( '#quickbar' ).append( $link.after( '<br/>' ) );
                                return $link[0];
                        case 'nostalgia':
                 * is determined by validation.
                 */
                validateEmail: function ( mailtxt ) {
-                       var rfc5322_atext, rfc1034_ldh_str, HTML5_email_regexp;
+                       var rfc5322Atext, rfc1034LdhStr, html5EmailRegexp;
 
                        if ( mailtxt === '' ) {
                                return null;
                                                 "|" / "}" /
                                                 "~"
                        */
-                       rfc5322_atext = "a-z0-9!#$%&'*+\\-/=?^_`{|}~";
+                       rfc5322Atext = 'a-z0-9!#$%&\'*+\\-/=?^_`{|}~';
 
                        /**
                         * Next define the RFC 1034 'ldh-str'
                         *      <let-dig-hyp> ::= <let-dig> | "-"
                         *      <let-dig> ::= <letter> | <digit>
                         */
-                       rfc1034_ldh_str = "a-z0-9\\-";
+                       rfc1034LdhStr = 'a-z0-9\\-';
 
-                       HTML5_email_regexp = new RegExp(
+                       html5EmailRegexp = new RegExp(
                                // start of string
                                '^'
                                +
                                // User part which is liberal :p
-                               '[' + rfc5322_atext + '\\.]+'
+                               '[' + rfc5322Atext + '\\.]+'
                                +
                                // 'at'
                                '@'
                                +
                                // Domain first part
-                               '[' + rfc1034_ldh_str + ']+'
+                               '[' + rfc1034LdhStr + ']+'
                                +
                                // Optional second part and following are separated by a dot
-                               '(?:\\.[' + rfc1034_ldh_str + ']+)*'
+                               '(?:\\.[' + rfc1034LdhStr + ']+)*'
                                +
                                // End of string
                                '$',
                                // RegExp is case insensitive
                                'i'
                        );
-                       return (null !== mailtxt.match( HTML5_email_regexp ) );
+                       return (null !== mailtxt.match( html5EmailRegexp ) );
                },
 
                /**
index 7951af0..deff7e6 100644 (file)
@@ -3,19 +3,22 @@
  * continue loading the jquery and mediawiki modules. This code should work on
  * even the most ancient of browsers, so be very careful when editing.
  */
+
 /**
  * Returns false when run in a black-listed browser
  *
  * This function will be deleted after it's used, so do not expand it to be
- * generally useful beyond startup
+ * generally useful beyond startup.
  *
- * jQuery has minimum requirements of:
- * * Internet Explorer 6.0+
- * * Firefox 3.6+
- * * Safari 5.0+
- * * Opera 11+
- * * Chrome
+ * MediaWiki & jQuery compatibility:
+ * - Internet Explorer 6.0+
+ * - Firefox 10+
+ * - Safari 5.0+
+ * - Opera 11+
+ * - Chrome
  */
+
+/*jshint unused: false */
 function isCompatible() {
        // IE < 6.0
        if ( navigator.appVersion.indexOf( 'MSIE' ) !== -1
@@ -23,11 +26,9 @@ function isCompatible() {
        {
                return false;
        }
-       // @todo FIXME: Firefox < 3.6
-       // @todo FIXME: Safari < 5.0
-       // @todo FIXME: Opera < 11
        return true;
 }
+
 /**
- * The startUp() function will be generated and added here (at the bottom)
+ * The startUp() function will be auto-generated and added below.
  */
index 0e0ce80..0be614a 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Serialize variables found in input file and store the result in the
+ * specified file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
 
 if ( !defined( 'MEDIAWIKI' ) ) {
        $wgNoDBParam = true;
@@ -62,7 +83,7 @@ function unixLineEndings( $var ) {
                fwrite( $stderr, "Error: Recursion limit exceeded. Possible circular reference in array variable.\n" );
                exit( 2 );
        }
-       
+
        if ( is_array( $var ) ) {
                ++$recursionLevel;
                $var = array_map( 'unixLineEndings', $var );
index 1342611..0423f8e 100644 (file)
@@ -30,136 +30,348 @@ if( !defined( 'MEDIAWIKI' ) ) {
  * @todo document
  * @ingroup Skins
  */
-class SkinCologneBlue extends SkinLegacy {
+class SkinCologneBlue extends SkinTemplate {
        var $skinname = 'cologneblue', $stylename = 'cologneblue',
                $template = 'CologneBlueTemplate';
+       var $useHeadElement = true;
 
        /**
         * @param $out OutputPage
         */
        function setupSkinUserCss( OutputPage $out ){
-               parent::setupSkinUserCss( $out );
+               $out->addModuleStyles( 'mediawiki.legacy.shared' );
+               $out->addModuleStyles( 'mediawiki.legacy.oldshared' );
                $out->addModuleStyles( 'skins.cologneblue' );
-
-               $qb = $this->qbSetting();
-               $rules = array();
-
-               if ( 2 == $qb ) { # Right
-                       $rules[] = "/* @noflip */#quickbar { position: absolute; right: 4px; }";
-                       $rules[] = "/* @noflip */#article { margin-left: 4px; margin-right: 148px; }";
-                       $rules[] = "/* @noflip */#footer { margin-right: 152px; }";
-               } elseif ( 1 == $qb ) {
-                       $rules[] = "/* @noflip */#quickbar { position: absolute; left: 4px; }";
-                       $rules[] = "/* @noflip */#article { margin-left: 148px; margin-right: 4px; }";
-                       $rules[] = "/* @noflip */#footer { margin-left: 152px; }";
-               } elseif ( 3 == $qb ) { # Floating left
-                       $rules[] = "/* @noflip */#quickbar { position:absolute; left:4px }";
-                       $rules[] = "/* @noflip */#topbar { margin-left: 148px }";
-                       $rules[] = "/* @noflip */#article { margin-left:148px; margin-right: 4px; }";
-                       $rules[] = "/* @noflip */body>#quickbar { position:fixed; left:4px; top:4px; overflow:auto; bottom:4px;}"; # Hides from IE
-                       $rules[] = "/* @noflip */#footer { margin-left: 152px; }";
-               } elseif ( 4 == $qb ) { # Floating right
-                       $rules[] = "/* @noflip */#quickbar { position: fixed; right: 4px; }";
-                       $rules[] = "/* @noflip */#topbar { margin-right: 148px }";
-                       $rules[] = "/* @noflip */#article { margin-right: 148px; margin-left: 4px; }";
-                       $rules[] = "/* @noflip */body>#quickbar { position: fixed; right: 4px; top: 4px; overflow: auto; bottom:4px;}"; # Hides from IE
-                       $rules[] = "/* @noflip */#footer { margin-right: 152px; }";
-               }
-               $style = implode( "\n", $rules );
-               $out->addInlineStyle( $style, 'flip' );
        }
 
+       /**
+        * Override langlink formatting behavior not to uppercase the language names.
+        * See otherLanguages() in CologneBlueTemplate.
+        */
+       function formatLanguageName( $name ) {
+               return $name;
+       }
 }
 
-class CologneBlueTemplate extends LegacyTemplate {
+class CologneBlueTemplate extends BaseTemplate {
+       function execute() {
+               // Suppress warnings to prevent notices about missing indexes in $this->data
+               wfSuppressWarnings();
+               $this->html( 'headelement' );
+               echo $this->beforeContent();
+               $this->html( 'bodytext' );
+               echo "\n";
+               echo $this->afterContent();
+               $this->html( 'dataAfterContent' );
+               $this->printTrail();
+               echo "\n</body></html>";
+               wfRestoreWarnings();
+       }
 
        /**
+        * Language/charset variant links for classic-style skins
         * @return string
+        *
+        * @fixed
         */
-       function doBeforeContent() {
-               $mainPageObj = Title::newMainPage();
+       function variantLinks() {
+               $s = array();
 
-               $s = "\n<div id='content'>\n<div id='topbar'>" .
-                 '<table style="width: 100%;" cellspacing="0" cellpadding="8"><tr>';
+               $variants = $this->data['content_navigation']['variants'];
 
-               $s .= '<td class="top" nowrap="nowrap">';
-               $s .= '<a href="' . htmlspecialchars( $mainPageObj->getLocalURL() ) . '">';
-               $s .= '<span id="sitetitle">' . wfMessage( 'sitetitle' )->escaped() . '</span></a>';
-
-               $s .= '</td><td class="top" id="top-syslinks" style="width: 100%;">';
-               $s .= $this->sysLinks();
-               $s .= '</td></tr><tr><td class="top-subheader">';
+               foreach ( $variants as $key => $link ) {
+                       $s[] = $this->makeListItem( $key, $link, array( 'tag' => 'span' ) );
+               }
 
-               $s .= '<font size="-1"><span id="sitesub">';
-               $s .= wfMessage( 'sitesubtitle' )->escaped() . '</span></font>';
-               $s .= '</td><td class="top-linkcollection">';
+               return $this->getSkin()->getLanguage()->pipeList( $s );
+       }
 
-               $s .= '<font size="-1"><span id="langlinks">';
-               $s .= str_replace( '<br />', '', $this->otherLanguages() );
+       // @fixed
+       function otherLanguages() {
+               global $wgHideInterlanguageLinks;
+               if ( $wgHideInterlanguageLinks ) {
+                       return "";
+               }
 
-               $s .= $this->getSkin()->getCategories();
+               // We override SkinTemplate->formatLanguageName() in SkinCologneBlue
+               // not to capitalize the language names.
+               $language_urls = $this->data['language_urls'];
+               if ( empty( $language_urls ) ) {
+                       return "";
+               }
 
-               $s .= '<br />' . $this->pageTitleLinks();
-               $s .= '</span></font>';
+               $s = array();
+               foreach ( $language_urls as $key => $data ) {
+                       $s[] = $this->makeListItem( $key, $data, array( 'tag' => 'span' ) );
+               }
 
-               $s .= "</td></tr></table>\n";
+               return wfMessage( 'otherlanguages' )->text()
+                       . wfMessage( 'colon-separator' )->text()
+                       . $this->getSkin()->getLanguage()->pipeList( $s );
+       }
 
-               $s .= "\n</div>\n<div id='article'>";
+       // @fixed
+       function pageTitleLinks() {
+               $s = array();
+               $footlinks = $this->getFooterLinks();
 
-               $notice = $this->getSkin()->getSiteNotice();
-               if( $notice ) {
-                       $s .= "\n<div id='siteNotice'>$notice</div>\n";
+               foreach ( $footlinks['places'] as $item ) {
+                       $s[] = $this->data[$item];
                }
-               $s .= $this->pageTitle();
-               $s .= $this->pageSubtitle() . "\n";
-               return $s;
+
+               return $this->getSkin()->getLanguage()->pipeList( $s );
        }
 
        /**
+        * Used in bottomLinks() to eliminate repetitive code.
+        *
+        * @param $key string Key to be passed to makeListItem()
+        * @param $navlink array Navlink suitable for processNavlinkForDocument()
+        * @param $message string Key of the message to use in place of standard text
+        *
         * @return string
+        * @fixed
         */
-       function doAfterContent(){
-               $s = "\n</div><br clear='all' />\n";
+       function processBottomLink( $key, $navlink, $message=null ) {
+               if ( !$navlink ) {
+                       // Empty navlinks might be passed.
+                       return null;
+               }
 
-               $s .= "\n<div id='footer'>";
-               $s .= '<table style="width: 98%;" cellspacing="0"><tr>';
+               if ( $message ) {
+                       $navlink['text'] = wfMessage( $message )->escaped();
+               }
 
-               $s .= '<td class="bottom">';
+               return $this->makeListItem( $key, $this->processNavlinkForDocument( $navlink ), array( 'tag' => 'span' ) );
+       }
+
+       // @fixed
+       function bottomLinks() {
+               $toolbox = $this->getToolbox();
+               $content_nav = $this->data['content_navigation'];
+
+               $lines = array();
+
+               if ( $this->getSkin()->getOutput()->isArticleRelated() ) {
+                       // First row. Regular actions.
+                       $element = array();
+
+                       $editLinkMessage = $this->getSkin()->getTitle()->exists() ? 'editthispage' : 'create-this-page';
+                       $element[] = $this->processBottomLink( 'edit', $content_nav['views']['edit'], $editLinkMessage );
+                       $element[] = $this->processBottomLink( 'viewsource', $content_nav['views']['viewsource'], 'viewsource' );
+
+                       $element[] = $this->processBottomLink( 'watch', $content_nav['actions']['watch'], 'watchthispage' );
+                       $element[] = $this->processBottomLink( 'unwatch', $content_nav['actions']['unwatch'], 'unwatchthispage' );
+
+                       $element[] = $this->talkLink();
+
+                       $element[] = $this->processBottomLink( 'history', $content_nav['views']['history'], 'history' );
+                       $element[] = $this->processBottomLink( 'info', $toolbox['info'] );
+                       $element[] = $this->processBottomLink( 'whatlinkshere', $toolbox['whatlinkshere'] );
+                       $element[] = $this->processBottomLink( 'recentchangeslinked', $toolbox['recentchangeslinked'] );
+
+                       $element[] = $this->processBottomLink( 'contributions', $toolbox['contributions'] );
+                       $element[] = $this->processBottomLink( 'emailuser', $toolbox['emailuser'] );
+
+                       $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) );
 
-               $s .= $this->bottomLinks();
-               $s .= $this->getSkin()->getLanguage()->pipeList( array(
-                       "\n<br />" . Linker::linkKnown(
-                               Title::newMainPage()
-                       ),
-                       $this->getSkin()->aboutLink(),
-                       $this->searchForm( wfMessage( 'qbfind' )->text() )
-               ) );
 
-               $s .= "\n<br />" . $this->pageStats();
+                       // Second row. Privileged actions.
+                       $element = array();
 
-               $s .= '</td>';
-               $s .= "</tr></table>\n</div>\n</div>\n";
+                       $element[] = $this->processBottomLink( 'delete', $content_nav['actions']['delete'], 'deletethispage' );
+                       $element[] = $this->processBottomLink( 'undelete', $content_nav['actions']['undelete'], 'undeletethispage' );
 
-               if ( $this->getSkin()->qbSetting() != 0 ) {
-                       $s .= $this->quickBar();
+                       $element[] = $this->processBottomLink( 'protect', $content_nav['actions']['protect'], 'protectthispage' );
+                       $element[] = $this->processBottomLink( 'unprotect', $content_nav['actions']['unprotect'], 'unprotectthispage' );
+
+                       $element[] = $this->processBottomLink( 'move', $content_nav['actions']['move'], 'movethispage' );
+
+                       $lines[] = $this->getSkin()->getLanguage()->pipeList( array_filter( $element ) );
+
+
+                       // Third row. Language links.
+                       $lines[] = $this->otherLanguages();
+               }
+
+               return implode( array_filter( $lines ), "<br />\n" ) . "<br />\n";
+       }
+
+       // @fixed
+       function talkLink() {
+               $title = $this->getSkin()->getTitle();
+
+               if ( $title->getNamespace() == NS_SPECIAL ) {
+                       // No discussion links for special pages
+                       return "";
                }
+
+               $companionTitle = $title->isTalkPage() ? $title->getSubjectPage() : $title->getTalkPage();
+               $companionNamespace = $companionTitle->getNamespace();
+
+               // TODO these messages appear to only be used by CologneBlue and legacy skins,
+               // kill and replace with something more sensibly named?
+               $nsToMessage = array(
+                       NS_MAIN => 'articlepage',
+                       NS_USER => 'userpage',
+                       NS_PROJECT => 'projectpage',
+                       NS_FILE => 'imagepage',
+                       NS_MEDIAWIKI => 'mediawikipage',
+                       NS_TEMPLATE => 'templatepage',
+                       NS_HELP => 'viewhelppage',
+                       NS_CATEGORY => 'categorypage',
+                       NS_FILE => 'imagepage',
+               );
+
+               // Find out the message to use for link text. Use either the array above or,
+               // for non-talk pages, a generic "discuss this" message.
+               // Default is the same as for main namespace.
+               if ( isset( $nsToMessage[$companionNamespace] ) ) {
+                       $message = $nsToMessage[$companionNamespace];
+               } else {
+                       $message = $companionTitle->isTalkPage() ? 'talkpage' : 'articlepage';
+               }
+
+               // Obviously this can't be reasonable and just return the key for talk namespace, only for content ones.
+               // Thus we have to mangle it in exactly the same way SkinTemplate does. (bug 40805)
+               $key = $companionTitle->getNamespaceKey( '' );
+               if ( $companionTitle->isTalkPage() ) {
+                       $key = ( $key == 'main' ? 'talk' : $key . "_talk" );
+               }
+
+               // Use the regular navigational link, but replace its text. Everything else stays unmodified.
+               $namespacesLinks = $this->data['content_navigation']['namespaces'];
+               return $this->processBottomLink( $message,  $namespacesLinks[$key], $message );
+       }
+
+       /**
+        * Takes a navigational link generated by SkinTemplate in whichever way
+        * and mangles attributes unsuitable for repeated use. In particular, this modifies the ids
+        * and removes the accesskeys. This is necessary to be able to use the same navlink twice,
+        * e.g. in sidebar and in footer.
+        *
+        * @param $navlink array Navigational link generated by SkinTemplate
+        * @param $idPrefix mixed Prefix to add to id of this navlink. If false, id is removed entirely. Default is 'cb-'.
+        */
+       function processNavlinkForDocument( $navlink, $idPrefix='cb-' ) {
+               if ( $navlink['id'] ) {
+                       $navlink['single-id'] = $navlink['id']; // to allow for tooltip generation
+                       $navlink['tooltiponly'] = true; // but no accesskeys
+
+                       // mangle or remove the id
+                       if ( $idPrefix === false ) {
+                               unset( $navlink['id'] );
+                       } else {
+                               $navlink['id'] =  $idPrefix . $navlink['id'];
+                       }
+               }
+
+               return $navlink;
+       }
+
+       /**
+        * @return string
+        *
+        * @fixed
+        */
+       function beforeContent() {
+               ob_start();
+?>
+<div id="content">
+       <div id="topbar">
+               <p id="sitetitle" role="banner">
+                       <a href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>">
+                               <?php echo wfMessage( 'sitetitle' )->escaped() ?>
+                       </a>
+               </p>
+               <p id="sitesub"><?php echo wfMessage( 'sitesubtitle' )->escaped() ?></p>
+               <div id="linkcollection" role="navigation">
+                       <div id="langlinks"><?php echo str_replace( '<br />', '', $this->otherLanguages() ) ?></div>
+                       <?php echo $this->getSkin()->getCategories() ?>
+                       <div id="titlelinks"><?php echo $this->pageTitleLinks() ?></div>
+                       <?php if ( $this->data['newtalk'] ) { ?>
+                       <div class="usermessage"><strong><?php echo $this->data['newtalk'] ?></strong></div>
+                       <?php } ?>
+               </div>
+       </div>
+       <div id="article" role="main">
+               <?php if ( $this->getSkin()->getSiteNotice() ) { ?>
+               <div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
+               <?php } ?>
+               <h1 id="firstHeading" lang="<?php
+                       $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageLanguage()->getCode();
+                       $this->html( 'pageLanguage' );
+               ?>"><span dir="auto"><?php echo $this->data['title'] ?></span></h1>
+               <?php if ( $this->translator->translate( 'tagline' ) ) { ?>
+               <p class="tagline"><?php echo htmlspecialchars( $this->translator->translate( 'tagline' ) ) ?></p>
+               <?php } ?>
+               <?php if ( $this->getSkin()->getOutput()->getSubtitle() ) { ?>
+               <p class="subtitle"><?php echo $this->getSkin()->getOutput()->getSubtitle() ?></p>
+               <?php } ?>
+               <?php if ( $this->getSkin()->subPageSubtitle() ) { ?>
+               <p class="subpages"><?php echo $this->getSkin()->subPageSubtitle() ?></p>
+               <?php } ?>
+<?php
+               $s = ob_get_contents();
+               ob_end_clean();
+
                return $s;
        }
 
        /**
         * @return string
+        *
+        * @fixed
         */
-       function sysLinks() {
-               $li = SpecialPage::getTitleFor( 'Userlogin' );
-               $lo = SpecialPage::getTitleFor( 'Userlogout' );
+       function afterContent() {
+               ob_start();
+?>
+       </div>
+       <div id="footer" role="contentinfo">
+<?php
+               // Page-related links
+               echo $this->bottomLinks();
+               echo "\n<br />";
 
-               $rt = $this->getSkin()->getTitle()->getPrefixedURL();
-               if ( 0 == strcasecmp( urlencode( $lo ), $rt ) ) {
-                       $q = array();
-               } else {
-                       $q = array( 'returnto' => $rt );
+               // Footer and second searchbox
+               echo $this->getSkin()->getLanguage()->pipeList( array(
+                       $this->getSkin()->mainPageLink(),
+                       $this->getSkin()->aboutLink(),
+                       $this->searchForm( 'footer' )
+               ) );
+               echo "\n<br />";
+
+               // Standard footer info
+               $footlinks = $this->getFooterLinks();
+               if ( $footlinks['info'] ) {
+                       foreach ( $footlinks['info'] as $item ) {
+                               echo $this->data[$item] . ' ';
+                       }
                }
+?>
+       </div>
+</div>
+<div id="mw-navigation">
+       <h2><?php echo wfMessage( 'navigation-heading' )->escaped() ?></h2>
+       <div id="toplinks" role="navigation">
+               <p id="syslinks"><?php echo $this->sysLinks() ?></p>
+               <p id="variantlinks"><?php echo $this->variantLinks() ?></p>
+       </div>
+       <?php echo $this->quickBar() ?>
+</div>
+<?php
+               $s = ob_get_contents();
+               ob_end_clean();
+
+               return $s;
+       }
 
+       /**
+        * @return string
+        *
+        * @fixed
+        */
+       function sysLinks() {
                $s = array(
                        $this->getSkin()->mainPageLink(),
                        Linker::linkKnown(
@@ -174,221 +386,189 @@ class CologneBlueTemplate extends LegacyTemplate {
                                Title::newFromText( wfMessage( 'faqpage' )->inContentLanguage()->text() ),
                                wfMessage( 'faq' )->text()
                        ),
-                       Linker::specialLink( 'Specialpages' )
                );
 
-               /* show links to different language variants */
-               if( $this->variantLinks() ) {
-                       $s[] = $this->variantLinks();
-               }
-               if( $this->extensionTabLinks() ) {
-                       $s[] = $this->extensionTabLinks();
-               }
-               if ( $this->data['loggedin'] ) {
-                       $s[] = Linker::linkKnown(
-                               $lo,
-                               wfMessage( 'logout' )->text(),
-                               array(),
-                               $q
-                       );
-               } else {
-                       $s[] = Linker::linkKnown(
-                               $li,
-                               wfMessage( 'login' )->text(),
-                               array(),
-                               $q
-                       );
+               $personalUrls = $this->getPersonalTools();
+               foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+                       if ( $personalUrls[$key] ) {
+                               $s[] = $this->makeListItem( $key, $personalUrls[$key], array( 'tag' => 'span' ) );
+                       }
                }
 
                return $this->getSkin()->getLanguage()->pipeList( $s );
        }
 
+       /**
+        * Adds CologneBlue-specific items to the sidebar: qbedit, qbpageoptions and qbmyoptions menus.
+        *
+        * @param $bar sidebar data
+        * @return array modified sidebar data
+        *
+        * @fixed
+        */
+       function sidebarAdditions( $bar ) {
+               // "This page" and "Edit" menus
+               // We need to do some massaging here... we reuse all of the items, except for $...['views']['view'],
+               // as $...['namespaces']['main'] and $...['namespaces']['talk'] together serve the same purpose.
+               // We also don't use $...['variants'], these are displayed in the top menu.
+               $content_navigation = $this->data['content_navigation'];
+               $qbpageoptions = array_merge(
+                       $content_navigation['namespaces'],
+                       array(
+                               'history' => $content_navigation['views']['history'],
+                               'watch' => $content_navigation['actions']['watch'],
+                               'unwatch' => $content_navigation['actions']['unwatch'],
+                       )
+               );
+               $content_navigation['actions']['watch'] = null;
+               $content_navigation['actions']['unwatch'] = null;
+               $qbedit = array_merge(
+                       array(
+                               'edit' => $content_navigation['views']['edit'],
+                               'addsection' => $content_navigation['views']['addsection'],
+                       ),
+                       $content_navigation['actions']
+               );
+
+               // Personal tools ("My pages")
+               $qbmyoptions = $this->getPersonalTools();
+               foreach ( array ( 'logout', 'createaccount', 'login', 'anonlogin' ) as $key ) {
+                       $qbmyoptions[$key] = null;
+               }
+
+               // Use the closest reasonable name
+               $bar['cactions'] = $qbedit;
+               $bar['pageoptions'] = $qbpageoptions; // this is a non-standard portlet name, but nothing fits
+               $bar['personal'] = $qbmyoptions;
+
+               return $bar;
+       }
+
        /**
         * Compute the sidebar
         * @access private
         *
         * @return string
+        *
+        * @fixed
         */
-       function quickBar(){
-               $s = "\n<div id='quickbar'>";
-
-               $sep = '<br />';
-               $s .= $this->menuHead( 'qbfind' );
-               $s .= $this->searchForm();
-
-               $s .= $this->menuHead( 'qbbrowse' );
-
-               # Use the first heading from the Monobook sidebar as the "browse" section
-               $bar = $this->getSkin()->buildSidebar();
-               unset( $bar['SEARCH'] );
-               unset( $bar['LANGUAGES'] );
-               unset( $bar['TOOLBOX'] );
-
-               $barnumber = 1;
-               foreach ( $bar as $heading => $browseLinks ) {
-                       if ( $barnumber > 1 ) {
-                               $headingMsg = wfMessage( $heading );
-                               if ( $headingMsg->exists() ) {
-                                       $h = $headingMsg->text();
-                               } else {
-                                       $h = $heading;
-                               }
-                               $s .= "\n<h6>" . htmlspecialchars( $h ) . "</h6>";
+       function quickBar() {
+               // Massage the sidebar. We want to:
+               // * place SEARCH at the beginning
+               // * add new portlets before TOOLBOX (or at the end, if it's missing)
+               // * remove LANGUAGES (langlinks are displayed elsewhere)
+               $orig_bar = $this->data['sidebar'];
+               $bar = array();
+               $hasToolbox = false;
+
+               // Always display search first
+               $bar['SEARCH'] = true;
+               // Copy everything except for langlinks, inserting new items before toolbox
+               foreach ( $orig_bar as $heading => $data ) {
+                       if ( $heading == 'TOOLBOX' ) {
+                               // Insert the stuff
+                               $bar = $this->sidebarAdditions( $bar );
+                               $hasToolbox = true;
                        }
-                       if( is_array( $browseLinks ) ) {
-                               foreach ( $browseLinks as $link ) {
-                                       if ( $link['text'] != '-' ) {
-                                               $s .= "<a href=\"{$link['href']}\">" .
-                                                       htmlspecialchars( $link['text'] ) . '</a>' . $sep;
-                                       }
-                               }
+
+                       if ( $heading != 'LANGUAGES' ) {
+                               $bar[$heading] = $data;
                        }
-                       $barnumber++;
+               }
+               // If toolbox is missing, add our items at the end
+               if ( !$hasToolbox ) {
+                       $bar = $this->sidebarAdditions( $bar );
                }
 
-               $user = $this->getSkin()->getUser();
 
-               if ( $this->data['isarticle'] ) {
-                       $s .= $this->menuHead( 'qbedit' );
-                       $s .= '<strong>' . $this->editThisPage() . '</strong>';
+               // Fill out special sidebar items with content
+               $orig_bar = $bar;
+               $bar = array();
+               foreach ( $orig_bar as $heading => $data ) {
+                       if ( $heading == 'SEARCH' ) {
+                               $bar['search'] = $this->searchForm( 'sidebar' );
+                       } elseif ( $heading == 'TOOLBOX' ) {
+                               $bar['tb'] = $this->getToolbox();
+                       } else {
+                               $bar[$heading] = $data;
+                       }
+               }
 
-                       $s .= $sep . Linker::linkKnown(
-                               Title::newFromText( wfMessage( 'edithelppage' )->inContentLanguage()->text() ),
-                               wfMessage( 'edithelp' )->text()
-                       );
 
-                       if( $this->data['loggedin'] ) {
-                               $s .= $sep . $this->moveThisPage();
-                       }
-                       if ( $user->isAllowed( 'delete' ) ) {
-                               $dtp = $this->deleteThisPage();
-                               if ( $dtp != '' ) {
-                                       $s .= $sep . $dtp;
-                               }
-                       }
-                       if ( $user->isAllowed( 'protect' ) ) {
-                               $ptp = $this->protectThisPage();
-                               if ( $ptp != '' ) {
-                                       $s .= $sep . $ptp;
-                               }
-                       }
-                       $s .= $sep;
-
-                       $s .= $this->menuHead( 'qbpageoptions' );
-                       $s .= $this->talkLink()
-                                       . $sep . $this->commentLink()
-                                       . $sep . $this->printableLink();
-                       if ( $this->data['loggedin'] ) {
-                               $s .= $sep . $this->watchThisPage();
-                       }
+               // Output the sidebar
+               // CologneBlue uses custom messages for some portlets, but we should keep the ids for consistency
+               $idToMessage = array(
+                       'search' => 'qbfind',
+                       'navigation' => 'qbbrowse',
+                       'tb' => 'toolbox',
+                       'cactions' => 'qbedit',
+                       'personal' => 'qbmyoptions',
+                       'pageoptions' => 'qbpageoptions',
+               );
 
-                       $s .= $sep;
-
-                       $s .= $this->menuHead( 'qbpageinfo' )
-                                       . $this->historyLink()
-                                       . $sep . $this->whatLinksHere()
-                                       . $sep . $this->watchPageLinksLink();
-
-                       $title = $this->getSkin()->getTitle();
-                       $tns = $title->getNamespace();
-                       if ( $tns == NS_USER || $tns == NS_USER_TALK ) {
-                               $id = User::idFromName( $title->getText() );
-                               if( $id != 0 ) {
-                                       $s .= $sep . $this->userContribsLink();
-                                       if( $this->getSkin()->showEmailUser( $id ) ) {
-                                               $s .= $sep . $this->emailUserLink();
+               $s = "<div id='quickbar'>\n";
+
+               foreach ( $bar as $heading => $data ) {
+                       $portletId = Sanitizer::escapeId( "p-$heading" );
+                       $headingMsg = wfMessage( $idToMessage[$heading] ? $idToMessage[$heading] : $heading );
+                       $headingHTML = "<h3>" . ( $headingMsg->exists() ? $headingMsg->escaped() : htmlspecialchars( $heading ) ) . "</h3>";
+                       $listHTML = "";
+
+                       if ( is_array( $data ) ) {
+                               // $data is an array of links
+                               foreach ( $data as $key => $link ) {
+                                       // Can be empty due to how the sidebar additions are done
+                                       if ( $link ) {
+                                               $listHTML .= $this->makeListItem( $key, $link );
                                        }
                                }
+                               if ( $listHTML ) {
+                                       $listHTML = "<ul>$listHTML</ul>";
+                               }
+                       } else {
+                               // $data is a HTML <ul>-list string
+                               $listHTML = $data;
                        }
-                       $s .= $sep;
-               }
 
-               $s .= $this->menuHead( 'qbmyoptions' );
-               if ( $this->data['loggedin'] ) {
-                       $tl = Linker::linkKnown(
-                               $user->getTalkPage(),
-                               wfMessage( 'mytalk' )->escaped()
-                       );
-                       if ( $user->getNewtalk() ) {
-                               $tl .= ' *';
+                       if ( $listHTML ) {
+                               $role = ( $heading == 'search' ) ? 'search' : 'navigation';
+                               $s .= "<div class=\"portlet\" id=\"$portletId\" role=\"$role\">\n$headingHTML\n$listHTML\n</div>\n";
                        }
-
-                       $s .= Linker::linkKnown(
-                                       $user->getUserPage(),
-                                       wfMessage( 'mypage' )->escaped()
-                               ) . $sep . $tl . $sep . Linker::specialLink( 'Watchlist' )
-                                       . $sep .
-                               Linker::linkKnown(
-                                       SpecialPage::getSafeTitleFor( 'Contributions', $user->getName() ),
-                                       wfMessage( 'mycontris' )->escaped()
-                               ) . $sep . Linker::specialLink( 'Preferences' )
-                               . $sep . Linker::specialLink( 'Userlogout' );
-               } else {
-                       $s .= Linker::specialLink( 'Userlogin' );
                }
 
-               $s .= $this->menuHead( 'qbspecialpages' )
-                       . Linker::specialLink( 'Newpages' )
-                       . $sep . Linker::specialLink( 'Listfiles' )
-                       . $sep . Linker::specialLink( 'Statistics' );
-               if( UploadBase::isEnabled() && UploadBase::isAllowed( $user ) === true ) {
-                       $s .= $sep . $this->getUploadLink();
-               }
-
-               global $wgSiteSupportPage;
-
-               if( $wgSiteSupportPage ) {
-                       $s .= $sep . '<a href="' . htmlspecialchars( $wgSiteSupportPage ) . '" class="internal">'
-                                       . wfMessage( 'sitesupport' )->escaped() . '</a>';
-               }
-
-               $s .= $sep . Linker::linkKnown(
-                       SpecialPage::getTitleFor( 'Specialpages' ),
-                       wfMessage( 'moredotdotdot' )->text()
-               );
-
-               $s .= $sep . "\n</div>\n";
-               return $s;
-       }
-
-       /**
-        * @param $key string
-        * @return string
-        */
-       function menuHead( $key ) {
-               $s = "\n<h6>" . wfMessage( $key )->text() . "</h6>";
+               $s .= "</div>\n";
                return $s;
        }
 
        /**
         * @param $label string
         * @return string
+        *
+        * @fixed
         */
-       function searchForm( $label = '' ) {
+       function searchForm( $which ) {
                global $wgUseTwoButtonsSearchForm;
 
                $search = $this->getSkin()->getRequest()->getText( 'search' );
                $action = $this->data['searchaction'];
-               $s = "<form id=\"searchform{$this->searchboxes}\" method=\"get\" class=\"inline\" action=\"$action\">";
-               if( $label != '' ) {
-                       $s .= "{$label}: ";
+               $s = "<form id=\"searchform-" . htmlspecialchars($which) . "\" method=\"get\" class=\"inline\" action=\"$action\">";
+               if( $which == 'footer' ) {
+                       $s .= wfMessage( 'qbfind' )->text() . ": ";
                }
 
-               $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=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
+               $s .= "<input type='text' class=\"mw-searchInput\" name=\"search\" size=\"14\" value=\""
+                       . htmlspecialchars( substr( $search, 0, 256 ) ) . "\" />"
+                       . ($which == 'footer' ? " " : "<br />")
+                       . "<input type='submit' class=\"searchButton\" name=\"go\" value=\"" . wfMessage( 'searcharticle' )->escaped() . "\" />";
 
                if( $wgUseTwoButtonsSearchForm ) {
-                       $s .= "<input type='submit' id=\"mw-searchButton{$this->searchboxes}\" class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'search' )->escaped() . "\" />\n";
+                       $s .= " <input type='submit' class=\"searchButton\" name=\"fulltext\" value=\"" . wfMessage( 'searchbutton' )->escaped() . "\" />\n";
                } else {
                        $s .= '<div><a href="' . $action . '" rel="search">' . wfMessage( 'powersearch-legend' )->escaped() . "</a></div>\n";
                }
 
                $s .= '</form>';
 
-               // Ensure unique id's for search boxes made after the first
-               $this->searchboxes = $this->searchboxes == '' ? 2 : $this->searchboxes + 1;
-
                return $s;
        }
 }
index 4211bb8..900bdd8 100644 (file)
@@ -65,7 +65,10 @@ class ModernTemplate extends MonoBookTemplate {
 ?>
 
        <!-- heading -->
-       <div id="mw_header"><h1 id="firstHeading"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
+       <div id="mw_header"><h1 id="firstHeading" lang="<?php
+               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageLanguage()->getCode();
+               $this->html( 'pageLanguage' );
+       ?>"><span dir="auto"><?php $this->html('title') ?></span></h1></div>
 
        <div id="mw_main">
        <div id="mw_contentwrapper">
@@ -73,7 +76,7 @@ class ModernTemplate extends MonoBookTemplate {
 <?php $this->cactions(); ?>
 
        <!-- content -->
-       <div id="mw_content">
+       <div id="mw_content" role="main">
        <!-- contentholder does nothing by default, but it allows users to style the text inside
             the content area without affecting the meaning of 'em' in #mw_content, which is used
             for the margins -->
@@ -103,6 +106,7 @@ class ModernTemplate extends MonoBookTemplate {
        </div><!-- mw_contentwrapper -->
 
        <div id="mw_portlets"<?php $this->html("userlangattributes") ?>>
+       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
 
        <!-- portlets -->
        <?php $this->renderPortals( $this->data['sidebar'] ); ?>
@@ -115,8 +119,8 @@ class ModernTemplate extends MonoBookTemplate {
        <div class="mw_clear"></div>
 
        <!-- personal portlet -->
-       <div class="portlet" id="p-personal">
-               <h5><?php $this->msg('personaltools') ?></h5>
+       <div class="portlet" id="p-personal" role="navigation">
+               <h3><?php $this->msg('personaltools') ?></h3>
                <div class="pBody">
                        <ul>
 <?php          foreach($this->getPersonalTools() as $key => $item) { ?>
@@ -129,7 +133,7 @@ class ModernTemplate extends MonoBookTemplate {
 
 
        <!-- footer -->
-       <div id="footer"<?php $this->html('userlangattributes') ?>>
+       <div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
                        <ul id="f-list">
 <?php
                foreach( $this->getFooterLinks("flat") as $aLink ) {
index 0bd7134..1b262a6 100644 (file)
@@ -80,11 +80,14 @@ class MonoBookTemplate extends BaseTemplate {
 
                $this->html( 'headelement' );
 ?><div id="globalWrapper">
-<div id="column-content"><div id="content" class="mw-body-primary">
+<div id="column-content"><div id="content" class="mw-body-primary" role="main">
        <a id="top"></a>
        <?php if($this->data['sitenotice']) { ?><div id="siteNotice"><?php $this->html('sitenotice') ?></div><?php } ?>
 
-       <h1 id="firstHeading" class="firstHeading"><span dir="auto"><?php $this->html('title') ?></span></h1>
+       <h1 id="firstHeading" class="firstHeading" lang="<?php
+               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageLanguage()->getCode();
+               $this->html( 'pageLanguage' );
+       ?>"><span dir="auto"><?php $this->html('title') ?></span></h1>
        <div id="bodyContent" class="mw-body">
                <div id="siteSub"><?php $this->msg('tagline') ?></div>
                <div id="contentSub"<?php $this->html('userlangattributes') ?>><?php $this->html('subtitle') ?></div>
@@ -104,9 +107,10 @@ class MonoBookTemplate extends BaseTemplate {
        </div>
 </div></div>
 <div id="column-one"<?php $this->html('userlangattributes')  ?>>
+       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
 <?php $this->cactions(); ?>
-       <div class="portlet" id="p-personal">
-               <h5><?php $this->msg('personaltools') ?></h5>
+       <div class="portlet" id="p-personal" role="navigation">
+               <h3><?php $this->msg('personaltools') ?></h3>
                <div class="pBody">
                        <ul<?php $this->html('userlangattributes') ?>>
 <?php          foreach($this->getPersonalTools() as $key => $item) { ?>
@@ -116,7 +120,7 @@ class MonoBookTemplate extends BaseTemplate {
                        </ul>
                </div>
        </div>
-       <div class="portlet" id="p-logo">
+       <div class="portlet" id="p-logo" role="banner">
 <?php
                        echo Html::element( 'a', array(
                                'href' => $this->data['nav_urls']['mainpage']['href'],
@@ -134,7 +138,7 @@ class MonoBookTemplate extends BaseTemplate {
        $validFooterLinks = $this->getFooterLinks( "flat" ); // Additional footer links
 
        if ( count( $validFooterIcons ) + count( $validFooterLinks ) > 0 ) { ?>
-<div id="footer"<?php $this->html('userlangattributes') ?>>
+<div id="footer" role="contentinfo"<?php $this->html('userlangattributes') ?>>
 <?php
                $footerEnd = '</div>';
        } else {
@@ -200,8 +204,8 @@ echo $footerEnd;
        function searchBox() {
                global $wgUseTwoButtonsSearchForm;
 ?>
-       <div id="p-search" class="portlet">
-               <h5><label for="searchInput"><?php $this->msg('search') ?></label></h5>
+       <div id="p-search" class="portlet" role="search">
+               <h3><label for="searchInput"><?php $this->msg('search') ?></label></h3>
                <div id="searchBody" class="pBody">
                        <form action="<?php $this->text('wgScript') ?>" id="searchform">
                                <input type='hidden' name="title" value="<?php $this->text('searchtitle') ?>"/>
@@ -227,8 +231,8 @@ echo $footerEnd;
         */
        function cactions() {
 ?>
-       <div id="p-cactions" class="portlet">
-               <h5><?php $this->msg('views') ?></h5>
+       <div id="p-cactions" class="portlet" role="navigation">
+               <h3><?php $this->msg('views') ?></h3>
                <div class="pBody">
                        <ul><?php
                                foreach($this->data['content_actions'] as $key => $tab) {
@@ -244,8 +248,8 @@ echo $footerEnd;
        /*************************************************************************************************/
        function toolbox() {
 ?>
-       <div class="portlet" id="p-tb">
-               <h5><?php $this->msg('toolbox') ?></h5>
+       <div class="portlet" id="p-tb" role="navigation">
+               <h3><?php $this->msg('toolbox') ?></h3>
                <div class="pBody">
                        <ul>
 <?php
@@ -267,8 +271,8 @@ echo $footerEnd;
        function languageBox() {
                if( $this->data['language_urls'] ) {
 ?>
-       <div id="p-lang" class="portlet">
-               <h5<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h5>
+       <div id="p-lang" class="portlet" role="navigation">
+               <h3<?php $this->html('userlangattributes') ?>><?php $this->msg('otherlanguages') ?></h3>
                <div class="pBody">
                        <ul>
 <?php          foreach($this->data['language_urls'] as $key => $langlink) { ?>
@@ -288,7 +292,7 @@ echo $footerEnd;
         * @param $cont array|string
         */
        function customBox( $bar, $cont ) {
-               $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ) );
+               $portletAttribs = array( 'class' => 'generated-sidebar portlet', 'id' => Sanitizer::escapeId( "p-$bar" ), 'role' => 'navigation' );
                $tooltip = Linker::titleAttrib( "p-$bar" );
                if ( $tooltip !== false ) {
                        $portletAttribs['title'] = $tooltip;
@@ -296,7 +300,7 @@ echo $footerEnd;
                echo '  ' . Html::openElement( 'div', $portletAttribs );
 ?>
 
-               <h5><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h5>
+               <h3><?php $msg = wfMessage( $bar ); echo htmlspecialchars( $msg->exists() ? $msg->text() : $bar ); ?></h3>
                <div class='pBody'>
 <?php   if ( is_array( $cont ) ) { ?>
                        <ul>
index de11639..49a0ad5 100644 (file)
@@ -2,6 +2,22 @@
 /**
  * Standard (a.k.a. Classic) skin: old MediaWiki default skin
  *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ *
  * @file
  * @ingroup Skins
  */
index 6045ed6..8d685bd 100644 (file)
@@ -72,7 +72,7 @@ class SkinVector extends SkinTemplate {
 
        /**
         * Adds classes to the body element.
-        * 
+        *
         * @param $out OutputPage object
         * @param &$bodyAttrs Array of attributes that will be set on the body element
         */
@@ -156,7 +156,7 @@ class VectorTemplate extends BaseTemplate {
                <div id="mw-page-base" class="noprint"></div>
                <div id="mw-head-base" class="noprint"></div>
                <!-- content -->
-               <div id="content" class="mw-body">
+               <div id="content" class="mw-body" role="main">
                        <a id="top"></a>
                        <div id="mw-js-message" style="display:none;"<?php $this->html( 'userlangattributes' ) ?>></div>
                        <?php if ( $this->data['sitenotice'] ): ?>
@@ -165,7 +165,10 @@ class VectorTemplate extends BaseTemplate {
                        <!-- /sitenotice -->
                        <?php endif; ?>
                        <!-- firstHeading -->
-                       <h1 id="firstHeading" class="firstHeading"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
+                       <h1 id="firstHeading" class="firstHeading" lang="<?php
+                               $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageLanguage()->getCode();
+                               $this->html( 'pageLanguage' );
+                       ?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
                        <!-- /firstHeading -->
                        <!-- bodyContent -->
                        <div id="bodyContent">
@@ -224,27 +227,30 @@ class VectorTemplate extends BaseTemplate {
                        <!-- /bodyContent -->
                </div>
                <!-- /content -->
-               <!-- header -->
-               <div id="mw-head" class="noprint">
-                       <?php $this->renderNavigation( 'PERSONAL' ); ?>
-                       <div id="left-navigation">
-                               <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
-                       </div>
-                       <div id="right-navigation">
-                               <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+               <div id="mw-navigation">
+                       <h2><?php $this->msg( 'navigation-heading' ) ?></h2>
+                       <!-- header -->
+                       <div id="mw-head" class="noprint">
+                               <?php $this->renderNavigation( 'PERSONAL' ); ?>
+                               <div id="left-navigation">
+                                       <?php $this->renderNavigation( array( 'NAMESPACES', 'VARIANTS' ) ); ?>
+                               </div>
+                               <div id="right-navigation">
+                                       <?php $this->renderNavigation( array( 'VIEWS', 'ACTIONS', 'SEARCH' ) ); ?>
+                               </div>
                        </div>
-               </div>
-               <!-- /header -->
-               <!-- panel -->
+                       <!-- /header -->
+                       <!-- panel -->
                        <div id="mw-panel" class="noprint">
                                <!-- logo -->
-                                       <div id="p-logo"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div>
+                                       <div id="p-logo" role="banner"><a style="background-image: url(<?php $this->text( 'logopath' ) ?>);" href="<?php echo htmlspecialchars( $this->data['nav_urls']['mainpage']['href'] ) ?>" <?php echo Xml::expandAttributes( Linker::tooltipAndAccesskeyAttribs( 'p-logo' ) ) ?>></a></div>
                                <!-- /logo -->
                                <?php $this->renderPortals( $this->data['sidebar'] ); ?>
                        </div>
-               <!-- /panel -->
+                       <!-- /panel -->
+               </div>
                <!-- footer -->
-               <div id="footer"<?php $this->html( 'userlangattributes' ) ?>>
+               <div id="footer" role="contentinfo"<?php $this->html( 'userlangattributes' ) ?>>
                        <?php foreach( $this->getFooterLinks() as $category => $links ): ?>
                                <ul id="footer-<?php echo $category ?>">
                                        <?php foreach( $links as $link ): ?>
@@ -327,8 +333,8 @@ class VectorTemplate extends BaseTemplate {
                        $msg = $name;
                }
                ?>
-<div class="portal" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?>>
-       <h5<?php $this->html( 'userlangattributes' ) ?>><?php $msgObj = wfMessage( $msg ); echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h5>
+<div class="portal" role="navigation" id='<?php echo Sanitizer::escapeId( "p-$name" ) ?>'<?php echo Linker::tooltip( 'p-' . $name ) ?>>
+       <h3<?php $this->html( 'userlangattributes' ) ?>><?php $msgObj = wfMessage( $msg ); echo htmlspecialchars( $msgObj->exists() ? $msgObj->text() : $msg ); ?></h3>
        <div class="body">
 <?php
                if ( is_array( $content ) ): ?>
@@ -377,8 +383,8 @@ class VectorTemplate extends BaseTemplate {
                        switch ( $element ) {
                                case 'NAMESPACES':
 ?>
-<div id="p-namespaces" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
-       <h5><?php $this->msg( 'namespaces' ) ?></h5>
+<div id="p-namespaces" role="navigation" class="vectorTabs<?php if ( count( $this->data['namespace_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+       <h3><?php $this->msg( 'namespaces' ) ?></h3>
        <ul<?php $this->html( 'userlangattributes' ) ?>>
                <?php foreach ( $this->data['namespace_urls'] as $link ): ?>
                        <li <?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php echo htmlspecialchars( $link['text'] ) ?></a></span></li>
@@ -389,15 +395,15 @@ class VectorTemplate extends BaseTemplate {
                                break;
                                case 'VARIANTS':
 ?>
-<div id="p-variants" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
-       <h4>
+<div id="p-variants" role="navigation" class="vectorMenu<?php if ( count( $this->data['variant_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+       <h3 id="mw-vector-current-variant">
        <?php foreach ( $this->data['variant_urls'] as $link ): ?>
                <?php if ( stripos( $link['attributes'], 'selected' ) !== false ): ?>
                        <?php echo htmlspecialchars( $link['text'] ) ?>
                <?php endif; ?>
        <?php endforeach; ?>
-       </h4>
-       <h5><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h5>
+       </h3>
+       <h3><span><?php $this->msg( 'variants' ) ?></span><a href="#"></a></h3>
        <div class="menu">
                <ul>
                        <?php foreach ( $this->data['variant_urls'] as $link ): ?>
@@ -410,8 +416,8 @@ class VectorTemplate extends BaseTemplate {
                                break;
                                case 'VIEWS':
 ?>
-<div id="p-views" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
-       <h5><?php $this->msg('views') ?></h5>
+<div id="p-views" role="navigation" class="vectorTabs<?php if ( count( $this->data['view_urls'] ) == 0 ) { echo ' emptyPortlet'; } ?>">
+       <h3><?php $this->msg('views') ?></h3>
        <ul<?php $this->html('userlangattributes') ?>>
                <?php foreach ( $this->data['view_urls'] as $link ): ?>
                        <li<?php echo $link['attributes'] ?>><span><a href="<?php echo htmlspecialchars( $link['href'] ) ?>" <?php echo $link['key'] ?>><?php
@@ -427,8 +433,8 @@ class VectorTemplate extends BaseTemplate {
                                break;
                                case 'ACTIONS':
 ?>
-<div id="p-cactions" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
-       <h5><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h5>
+<div id="p-cactions" role="navigation" class="vectorMenu<?php if ( count( $this->data['action_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+       <h3><span><?php $this->msg( 'actions' ) ?></span><a href="#"></a></h3>
        <div class="menu">
                <ul<?php $this->html( 'userlangattributes' ) ?>>
                        <?php foreach ( $this->data['action_urls'] as $link ): ?>
@@ -441,21 +447,23 @@ class VectorTemplate extends BaseTemplate {
                                break;
                                case 'PERSONAL':
 ?>
-<div id="p-personal" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
-       <h5><?php $this->msg( 'personaltools' ) ?></h5>
+<div id="p-personal" role="navigation" class="<?php if ( count( $this->data['personal_urls'] ) == 0 ) echo ' emptyPortlet'; ?>">
+       <h3><?php $this->msg( 'personaltools' ) ?></h3>
        <ul<?php $this->html( 'userlangattributes' ) ?>>
-<?php                  foreach( $this->getPersonalTools() as $key => $item ) { ?>
-               <?php echo $this->makeListItem( $key, $item ); ?>
-
-<?php                  } ?>
+<?php
+                                       $personalTools = $this->getPersonalTools();
+                                       foreach ( $personalTools as $key => $item ) {
+                                               echo $this->makeListItem( $key, $item );
+                                       }
+?>
        </ul>
 </div>
 <?php
                                break;
                                case 'SEARCH':
 ?>
-<div id="p-search">
-       <h5<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h5>
+<div id="p-search" role="search">
+       <h3<?php $this->html( 'userlangattributes' ) ?>><label for="searchInput"><?php $this->msg( 'search' ) ?></label></h3>
        <form action="<?php $this->text( 'wgScript' ) ?>" id="searchform">
                <?php if ( $wgVectorUseSimpleSearch && $this->getSkin()->getUser()->getOption( 'vector-simplesearch' ) ): ?>
                <div id="simpleSearch">
index 57b5410..349638a 100644 (file)
@@ -2,6 +2,7 @@ body {
        margin: 0;
        padding: 0;
        color: black;
+       font-family: serif;
 }
 
 #specialform {
@@ -20,10 +21,6 @@ body {
        font-size: 8pt;
 }
 
-#topbar {
-       padding: 0;
-}
-
 #powersearch {
        background: #DDEEFF;
        border-style: solid;
@@ -61,64 +58,20 @@ textarea {
 }
 
 #footer {
+       margin-right: 2%;
+       margin-top: 1em;
        padding: 4px;
+       font-family: verdana, arial, sans-serif;
+       font-size: 10pt;
+       text-align: center;
 }
 
 #footer form {
        display: inline;
 }
 
-#sitetitle {
-       font-family: Times, serif;
-       color: white;
-       font-weight: normal;
-       font-size: 32pt;
-       line-height: 32pt;
-}
-
-td.top {
-       background-color: #6688AA;
-       color: white;
-       margin-top: 4px;
-       margin-bottom: 4px;
-       padding-top: 0;
-       padding-bottom: 0;
-       text-transform: uppercase;
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 8pt;
-}
-
-td.top a {
-       font-family: Verdana, Arial, sans-serif;
-       background-color: #6688AA;
-       color: white;
-       text-decoration: none;
-       font-size: 10pt;
-}
-
-td#top-syslinks {
-       text-align: right;
-       vertical-align: bottom;
-}
-td.top-linkcollection {
-       text-align: right;
-}
-/**
- * Overrides text justification (user preference)
- * See bug 31990
- */
-td.top-linkcollection #catlinks {
-       text-align: right;
-}
-td.top-subheader {
-       vertical-align: top;
-}
-td.bottom {
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 10pt;
-       padding: 0;
-       text-align: center;
-       vertical-align: bottom;
+#cb-ca-edit {
+       font-weight: bold;
 }
 
 #pagestats {
@@ -127,12 +80,7 @@ td.bottom {
        font-size: 9pt;
 }
 
-#sitesub {
-       font-family: Verdana, Arial, sans-serif;
-       font-size: 9pt; font-weight: bold;
-       color: black;
-       padding-top: 0;
-}
+
 
 #quickbar {
        font-family: Verdana, Arial, sans-serif;
@@ -149,7 +97,13 @@ td.bottom {
        color: #446688;
 }
 
-#quickbar h6 {
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+       position: absolute;
+       top: -9999px;
+}
+
+#quickbar h3 {
        font-family: Verdana, Arial, sans-serif;
        font-size: 10pt;
        font-weight: bold;
@@ -166,6 +120,14 @@ td.bottom {
        margin-top: 0;
 }
 
+#quickbar .portlet ul,
+#quickbar .portlet li {
+       list-style-type: none;
+       margin: 0;
+       padding: 0;
+       line-height: inherit;
+}
+
 h1 {
        color: #666666;
        font-family: Verdana, Arial, sans-serif;
@@ -177,12 +139,12 @@ h1 .editsection {
        font-size: 55.6%;
 }
 
-h1.pagetitle {
+h1#firstHeading {
        padding-bottom: 0;
        margin-bottom: 0;
 }
 
-#article p.subtitle {
+#article p.subtitle, #article p.subpages, #article p.tagline {
        color: #666666;
        font-size: 11pt;
        font-weight: bold;
@@ -212,7 +174,7 @@ a.stub, #quickbar a.stub {
        text-decoration: none;
 }
 
-a.new, #quickbar a.new {
+a.new, #quickbar span.new a, #footer span.new a {
        color: #CC2200;
 }
 
@@ -227,3 +189,82 @@ small {
 input.mw-searchInput {
        width: 106px;
 }
+
+/* Directionality-specific styles */
+#quickbar { position: absolute; left: 4px; }
+#article { margin-left: 148px; margin-right: 4px; }
+#footer { margin-left: 152px; }
+
+
+#sitetitle, #sitesub, #toplinks, #linkcollection {
+       margin-top: 0; 
+       margin-bottom: 0; 
+}
+
+#sitetitle, #toplinks {
+       color: white;
+       text-transform: uppercase;
+       height: 32pt;
+}
+#sitetitle {
+       padding-left: 8px;
+       font-family: Times, serif;
+       font-weight: normal;
+       font-size: 32pt;
+       line-height: 32pt;
+       background-color: #6688AA;
+}
+#sitetitle a, #toplinks a {
+       color: white;
+       text-decoration: none; 
+}
+/* Bring #sitetitle to top. Otherwise #toplinks is overlaid over it, making the link unclickable. */
+#sitetitle a {
+       position: relative;
+       z-index: 10
+}
+
+#toplinks {
+       font-family: Verdana, Arial, sans-serif;
+       position: absolute;
+       top: 0;
+       right: 8px;
+       width: 100%;
+       font-size: 8pt;
+}
+#toplinks a {
+       font-size: 10pt;
+}
+#toplinks p {
+       position: absolute;
+       right: 0;
+       margin: 0;
+       width: 100%;
+       text-align: right;
+}
+#toplinks #syslinks {
+       bottom: 0;
+}
+#toplinks #variantlinks {
+       bottom: 12pt;
+}
+
+#sitesub {
+       float: left;
+       margin-left: 8px;
+       font-family: Verdana, Arial, sans-serif;
+       font-size: 9pt;
+       font-weight: bold;
+       color: black;
+}
+
+#linkcollection {
+       margin-top: 0.5em;
+       font-size: small;
+       margin-right: 8px;
+       text-align: right;
+}
+/* Override text justification (user preference), see bug 31990 */
+#linkcollection * {
+       text-align: right;
+}
index 0fe8489..a550d97 100644 (file)
@@ -1,6 +1,9 @@
-/*
-** MediaWiki style sheet for general styles on complex content
-*/
+/**
+ * MediaWiki style sheet for general styles on complex content
+ *
+ * Styles for complex things which are a standard part of page content
+ * (ie: the CSS classing built into the system), like the TOC.
+ */
 
 /* Table of Contents */
 #toc,
@@ -109,6 +112,16 @@ img.thumbborder {
        border: 1px solid #dddddd;
 }
 
+/**
+ * Edit forms
+ */
+#editform textarea {
+       display: block;
+       -moz-box-sizing: border-box;
+       -webkit-box-sizing: border-box;
+       box-sizing: border-box;
+}
+
 /**
  * Basic styles for the user login and create account forms
  */
index 02fd29f..79911fe 100644 (file)
@@ -1,6 +1,9 @@
 /**
  * MediaWiki style sheet for general styles on basic content elements
- * This style sheet is used by the monobook and vector skins
+ *
+ * Styles for basic elements: links, lists, etc...
+ *
+ * This style sheet is used by the Monobook and Vector skins.
  */
 
 /* Links */
index 60d6436..af6665e 100644 (file)
@@ -1,6 +1,10 @@
-/*
-** MediaWiki style sheet for common core styles on interfaces
-*/
+/**
+ * MediaWiki style sheet for common core styles on interfaces
+ *
+ * Styles for the Monobook/Vector pattern of laying out common interfaces.
+ * These ids/classes are not built into the system,
+ * they are outputted by the actual MonoBook/Vector code by convention.
+ */
 
 /* Categories */
 .catlinks {
index aa982d3..39206c3 100644 (file)
 .config-settings-block {
        list-style-type: none;
        list-style-image: none;
-       float: left;
        margin: 0;
        padding: 0;
 }
diff --git a/skins/common/images/icons/fileicon-psd.png b/skins/common/images/icons/fileicon-psd.png
new file mode 100644 (file)
index 0000000..5bd40cb
Binary files /dev/null and b/skins/common/images/icons/fileicon-psd.png differ
diff --git a/skins/common/mwsuggest.js b/skins/common/mwsuggest.js
deleted file mode 100644 (file)
index dac5954..0000000
+++ /dev/null
@@ -1,1063 +0,0 @@
-/*
- * OpenSearch ajax suggestion engine for MediaWiki
- *
- * uses core MediaWiki open search support to fetch suggestions
- * and show them below search boxes and other inputs
- *
- * by Robert Stojnic (April 2008)
- */
-
-// Make sure wgMWSuggestTemplate is defined
-if ( !mw.config.exists( 'wgMWSuggestTemplate' ) ) {
-       mw.config.set( 'wgMWSuggestTemplate', mw.config.get( 'wgServer' ) + mw.config.get( 'wgScriptPath' )
-                + "/api.php?action=opensearch\x26search={searchTerms}\x26namespace={namespaces}\x26suggest" );
-}
-
-// search_box_id -> Results object
-window.os_map = {};
-// cached data, url -> json_text
-window.os_cache = {};
-// global variables for suggest_keypress
-window.os_cur_keypressed = 0;
-window.os_keypressed_count = 0;
-// type: Timer
-window.os_timer = null;
-// tie mousedown/up events
-window.os_mouse_pressed = false;
-window.os_mouse_num = -1;
-// if true, the last change was made by mouse (and not keyboard)
-window.os_mouse_moved = false;
-// delay between keypress and suggestion (in ms)
-window.os_search_timeout = 250;
-// these pairs of inputs/forms will be autoloaded at startup
-window.os_autoload_inputs = ['searchInput', 'searchInput2', 'powerSearchText', 'searchText'];
-window.os_autoload_forms = ['searchform', 'searchform2', 'powersearch', 'search'];
-// if we stopped the service
-window.os_is_stopped = false;
-// max lines to show in suggest table
-window.os_max_lines_per_suggest = 7;
-// number of steps to animate expansion/contraction of container width
-window.os_animation_steps = 6;
-// num of pixels of smallest step
-window.os_animation_min_step = 2;
-// delay between steps (in ms)
-window.os_animation_delay = 30;
-// max width of container in percent of normal size (1 == 100%)
-window.os_container_max_width = 2;
-// currently active animation timer
-window.os_animation_timer = null;
-// whether MWSuggest is enabled. Set to false when os_MWSuggestDisable() is called
-window.os_enabled = true;
-
-/**
- * <datalist> is a new HTML5 element that allows you to manually
- * supply suggestion lists and have them rendered according to the
- * right platform conventions.  Opera as of version 11 has a fatal
- * problem: the suggestion lags behind what the user types by one
- * keypress.  (Reported as DSK-276870 to Opera's secret bug tracker.)
- * There are also problems with other browsers, including Firefox and
- * Safari: See bug 31602 for details.
- */
-window.os_use_datalist = false;
-
-/** Timeout timer class that will fetch the results */
-window.os_Timer = function( id, r, query ) {
-       this.id = id;
-       this.r = r;
-       this.query = query;
-};
-
-/** Property class for single search box */
-window.os_Results = function( name, formname ) {
-       this.searchform = formname; // id of the searchform
-       this.searchbox = name; // id of the searchbox
-       this.container = name + 'Suggest'; // div that holds results
-       this.resultTable = name + 'Result'; // id base for the result table (+num = table row)
-       this.resultText = name + 'ResultText'; // id base for the spans within result tables (+num)
-       this.toggle = name + 'Toggle'; // div that has the toggle (enable/disable) link
-       this.query = null; // last processed query
-       this.results = null;  // parsed titles
-       this.resultCount = 0; // number of results
-       this.original = null; // query that user entered
-       this.selected = -1; // which result is selected
-       this.containerCount = 0; // number of results visible in container
-       this.containerRow = 0; // height of result field in the container
-       this.containerTotal = 0; // total height of the container will all results
-       this.visible = false; // if container is visible
-       this.stayHidden = false; // don't try to show if lost focus
-};
-
-/** Timer user to animate expansion/contraction of container width */
-window.os_AnimationTimer = function( r, target ) {
-       this.r = r;
-       var current = document.getElementById(r.container).offsetWidth;
-       this.inc = Math.round( ( target - current ) / os_animation_steps );
-       if( this.inc < os_animation_min_step && this.inc >=0 ) {
-               this.inc = os_animation_min_step; // minimal animation step
-       }
-       if( this.inc > -os_animation_min_step && this.inc < 0 ) {
-               this.inc = -os_animation_min_step;
-       }
-       this.target = target;
-};
-
-/******************
- * Initialization
- ******************/
-
-/** Initialization, call upon page onload */
-window.os_MWSuggestInit = function() {
-       if ( !window.os_enabled ) {
-               return;
-       }
-       
-       for( var i = 0; i < os_autoload_inputs.length; i++ ) {
-               var id = os_autoload_inputs[i];
-               var form = os_autoload_forms[i];
-               element = document.getElementById( id );
-               if( element != null ) {
-                       os_initHandlers( id, form, element );
-               }
-       }
-};
-
-/* Teardown, called when things like SimpleSearch need to disable MWSuggest */
-window.os_MWSuggestTeardown = function() {
-       for( var i = 0; i < os_autoload_inputs.length; i++ ) {
-               var id = os_autoload_inputs[i];
-               var form = os_autoload_forms[i];
-               element = document.getElementById( id );
-               if( element != null ) {
-                       os_teardownHandlers( id, form, element );
-               }
-       }
-};
-
-/* Call this to disable MWSuggest. Works regardless of whether MWSuggest has been initialized already. */
-window.os_MWSuggestDisable = function() {
-       window.os_MWSuggestTeardown();
-       window.os_enabled = false;
-}
-       
-
-/** Init Result objects and event handlers */
-window.os_initHandlers = function( name, formname, element ) {
-       var r = new os_Results( name, formname );
-       var formElement = document.getElementById( formname );
-       if( !formElement ) {
-               // Older browsers (Opera 8) cannot get form elements
-               return;
-       }
-       // event handler
-       os_hookEvent( element, 'keyup', os_eventKeyup );
-       os_hookEvent( element, 'keydown', os_eventKeydown );
-       os_hookEvent( element, 'keypress', os_eventKeypress );
-       if ( !os_use_datalist ) {
-               // These are needed for the div hack to hide it if the user blurs.
-               os_hookEvent( element, 'blur', os_eventBlur );
-               os_hookEvent( element, 'focus', os_eventFocus );
-               // We don't want browser auto-suggestions interfering with our div, but
-               // autocomplete must be on for datalist to work (at least in Opera
-               // 10.10).
-               element.setAttribute( 'autocomplete', 'off' );
-       }
-       // stopping handler
-       os_hookEvent( formElement, 'submit', os_eventOnsubmit );
-       os_map[name] = r;
-       // toggle link
-       if( document.getElementById( r.toggle ) == null ) {
-               // TODO: disable this while we figure out a way for this to work in all browsers
-               /* if( name == 'searchInput' ) {
-                       // special case: place above the main search box
-                       var t = os_createToggle( r, 'os-suggest-toggle' );
-                       var searchBody = document.getElementById( 'searchBody' );
-                       var first = searchBody.parentNode.firstChild.nextSibling.appendChild(t);
-               } else {
-                       // default: place below search box to the right
-                       var t = os_createToggle( r, 'os-suggest-toggle-def' );
-                       var top = element.offsetTop + element.offsetHeight;
-                       var left = element.offsetLeft + element.offsetWidth;
-                       t.style.position = 'absolute';
-                       t.style.top = top + 'px';
-                       t.style.left = left + 'px';
-                       element.parentNode.appendChild( t );
-                       // only now width gets calculated, shift right
-                       left -= t.offsetWidth;
-                       t.style.left = left + 'px';
-                       t.style.visibility = 'visible';
-               } */
-       }
-
-};
-
-window.os_teardownHandlers = function( name, formname, element ) {
-       var formElement = document.getElementById( formname );
-       if( !formElement ) {
-               // Older browsers (Opera 8) cannot get form elements
-               return;
-       }
-
-       os_unhookEvent( element, 'keyup', os_eventKeyup );
-       os_unhookEvent( element, 'keydown', os_eventKeydown );
-       os_unhookEvent( element, 'keypress', os_eventKeypress );
-       if ( !os_use_datalist ) {
-               // These are needed for the div hack to hide it if the user blurs.
-               os_unhookEvent( element, 'blur', os_eventBlur );
-               os_unhookEvent( element, 'focus', os_eventFocus );
-               // We don't want browser auto-suggestions interfering with our div, but
-               // autocomplete must be on for datalist to work (at least in Opera
-               // 10.10).
-               element.removeAttribute( 'autocomplete' );
-       }
-       // stopping handler
-       os_unhookEvent( formElement, 'submit', os_eventOnsubmit );
-};
-
-
-window.os_hookEvent = function( element, hookName, hookFunct ) {
-       if ( element.addEventListener ) {
-               element.addEventListener( hookName, hookFunct, false );
-       } else if ( window.attachEvent ) {
-               element.attachEvent( 'on' + hookName, hookFunct );
-       }
-};
-
-window.os_unhookEvent = function( element, hookName, hookFunct ) {
-       if ( element.removeEventListener ) {
-               element.removeEventListener( hookName, hookFunct, false );
-       } else if ( element.detachEvent ) {
-               element.detachEvent( 'on' + hookName, hookFunct );
-       }
-}
-
-/********************
- *  Keyboard events
- ********************/
-
-/** Event handler that will fetch results on keyup */
-window.os_eventKeyup = function( e ) {
-       var targ = os_getTarget( e );
-       var r = os_map[targ.id];
-       if( r == null ) {
-               return; // not our event
-       }
-
-       // some browsers won't generate keypressed for arrow keys, catch it
-       if( os_keypressed_count == 0 ) {
-               os_processKey( r, os_cur_keypressed, targ );
-       }
-       var query = targ.value;
-       os_fetchResults( r, query, os_search_timeout );
-};
-
-/** catch arrows up/down and escape to hide the suggestions */
-window.os_processKey = function( r, keypressed, targ ) {
-       if ( keypressed == 40 && !r.visible && os_timer == null ) {
-               // If the user hits the down arrow, fetch results immediately if none
-               // are already displayed.
-               r.query = '';
-               os_fetchResults( r, targ.value, 0 );
-       }
-       // Otherwise, if we're not using datalist, we need to handle scrolling and
-       // so on.
-       if ( os_use_datalist ) {
-               return;
-       }
-       if ( keypressed == 40 ) { // Arrow Down
-               if ( r.visible ) {
-                       os_changeHighlight( r, r.selected, r.selected + 1, true );
-               }
-       } else if ( keypressed == 38 ) { // Arrow Up
-               if ( r.visible ) {
-                       os_changeHighlight( r, r.selected, r.selected - 1, true );
-               }
-       } else if( keypressed == 27 ) { // Escape
-               document.getElementById( r.searchbox ).value = r.original;
-               r.query = r.original;
-               os_hideResults( r );
-       } else if( r.query != document.getElementById( r.searchbox ).value ) {
-               // os_hideResults( r ); // don't show old suggestions
-       }
-};
-
-/** When keys is held down use a timer to output regular events */
-window.os_eventKeypress = function( e ) {
-       var targ = os_getTarget( e );
-       var r = os_map[targ.id];
-       if( r == null ) {
-               return; // not our event
-       }
-
-       var keypressed = os_cur_keypressed;
-
-       os_keypressed_count++;
-       os_processKey( r, keypressed, targ );
-};
-
-/** Catch the key code (Firefox bug) */
-window.os_eventKeydown = function( e ) {
-       if ( !e ) {
-               e = window.event;
-       }
-       var targ = os_getTarget( e );
-       var r = os_map[targ.id];
-       if( r == null ) {
-               return; // not our event
-       }
-
-       os_mouse_moved = false;
-
-       os_cur_keypressed = ( e.keyCode == undefined ) ? e.which : e.keyCode;
-       os_keypressed_count = 0;
-};
-
-
-/** When the form is submitted hide everything, cancel updates... */
-window.os_eventOnsubmit = function( e ) {
-       var targ = os_getTarget( e );
-
-       os_is_stopped = true;
-       // kill timed requests
-       if( os_timer != null && os_timer.id != null ) {
-               clearTimeout( os_timer.id );
-               os_timer = null;
-       }
-       // Hide all suggestions
-       for( i = 0; i < os_autoload_inputs.length; i++ ) {
-               var r = os_map[os_autoload_inputs[i]];
-               if( r != null ) {
-                       var b = document.getElementById( r.searchform );
-                       if( b != null && b == targ ) {
-                               // set query value so the handler won't try to fetch additional results
-                               r.query = document.getElementById( r.searchbox ).value;
-                       }
-                       os_hideResults( r );
-               }
-       }
-       return true;
-};
-
-
-
-/** Hide results from the user, either making the div visibility=hidden or
- * detaching the datalist from the input. */
-window.os_hideResults = function( r ) {
-       if ( os_use_datalist ) {
-               document.getElementById( r.searchbox ).setAttribute( 'list', '' );
-       } else {
-               var c = document.getElementById( r.container );
-               if ( c != null ) {
-                       c.style.visibility = 'hidden';
-               }
-       }
-       r.visible = false;
-       r.selected = -1;
-};
-
-window.os_decodeValue = function( value ) {
-       if ( decodeURIComponent ) {
-               return decodeURIComponent( value );
-       }
-       if( unescape ) {
-               return unescape( value );
-       }
-       return null;
-};
-
-window.os_encodeQuery = function( value ) {
-       if ( encodeURIComponent ) {
-               return encodeURIComponent( value );
-       }
-       if( escape ) {
-               return escape( value );
-       }
-       return null;
-};
-
-/** Handles data from XMLHttpRequest, and updates the suggest results */
-window.os_updateResults = function( r, query, text, cacheKey ) {
-       os_cache[cacheKey] = text;
-       r.query = query;
-       r.original = query;
-       if( text == '' ) {
-               r.results = null;
-               r.resultCount = 0;
-               os_hideResults( r );
-       } else {
-               try {
-                       var p = eval( '(' + text + ')' ); // simple json parse, could do a safer one
-                       if( p.length < 2 || p[1].length == 0 ) {
-                               r.results = null;
-                               r.resultCount = 0;
-                               os_hideResults( r );
-                               return;
-                       }
-                       if ( os_use_datalist ) {
-                               os_setupDatalist( r, p[1] );
-                       } else {
-                               os_setupDiv( r, p[1] );
-                       }
-               } catch( e ) {
-                       // bad response from server or such
-                       os_hideResults( r );
-                       os_cache[cacheKey] = null;
-               }
-       }
-};
-
-/**
- * Create and populate a <datalist>.
- *
- * @param r       os_Result object
- * @param results Array of the new results to replace existing ones
- */
-window.os_setupDatalist = function( r, results ) {
-       var s = document.getElementById( r.searchbox );
-       var c = document.getElementById( r.container );
-       if ( c == null ) {
-               c = document.createElement( 'datalist' );
-               c.setAttribute( 'id', r.container );
-               document.body.appendChild( c );
-       } else {
-               c.innerHTML = '';
-       }
-       s.setAttribute( 'list', r.container );
-
-       r.results = [];
-       r.resultCount = results.length;
-       r.visible = true;
-       for ( i = 0; i < results.length; i++ ) {
-               var title = os_decodeValue( results[i] );
-               var opt = document.createElement( 'option' );
-               opt.value = title;
-               r.results[i] = title;
-               c.appendChild( opt );
-       }
-};
-
-/** Fetch namespaces from checkboxes or hidden fields in the search form,
-    if none defined use wgSearchNamespaces */
-window.os_getNamespaces = function( r ) {
-       var namespaces = '';
-       var elements = document.forms[r.searchform].elements;
-       for( i = 0; i < elements.length; i++ ) {
-               var name = elements[i].name;
-               if( typeof name != 'undefined' && name.length > 2 && name[0] == 'n' &&
-                       name[1] == 's' && (
-                               ( elements[i].type == 'checkbox' && elements[i].checked ) ||
-                               ( elements[i].type == 'hidden' && elements[i].value == '1' )
-                       )
-               ) {
-                       if( namespaces != '' ) {
-                               namespaces += '|';
-                       }
-                       namespaces += name.substring( 2 );
-               }
-       }
-       if( namespaces == '' ) {
-               namespaces = mw.config.get( 'wgSearchNamespaces' ).join('|');
-       }
-       return namespaces;
-};
-
-/** Update results if user hasn't already typed something else */
-window.os_updateIfRelevant = function( r, query, text, cacheKey ) {
-       var t = document.getElementById( r.searchbox );
-       if( t != null && t.value == query ) { // check if response is still relevant
-               os_updateResults( r, query, text, cacheKey );
-       }
-       r.query = query;
-};
-
-/** Fetch results after some timeout */
-window.os_delayedFetch = function() {
-       if( os_timer == null ) {
-               return;
-       }
-       var r = os_timer.r;
-       var query = os_timer.query;
-       os_timer = null;
-       var path = mw.config.get( 'wgMWSuggestTemplate' ).replace( "{namespaces}", os_getNamespaces( r ) )
-                                                                       .replace( "{dbname}", mw.config.get( 'wgDBname' ) )
-                                                                       .replace( "{searchTerms}", os_encodeQuery( query ) );
-
-       // try to get from cache, if not fetch using ajax
-       var cached = os_cache[path];
-       if( cached != null && cached != undefined ) {
-               os_updateIfRelevant( r, query, cached, path );
-       } else {
-               var xmlhttp = sajax_init_object();
-               if( xmlhttp ) {
-                       try {
-                               xmlhttp.open( 'GET', path, true );
-                               xmlhttp.onreadystatechange = function() {
-                                       if ( xmlhttp.readyState == 4 && typeof os_updateIfRelevant == 'function' ) {
-                                               os_updateIfRelevant( r, query, xmlhttp.responseText, path );
-                                       }
-                               };
-                               xmlhttp.send( null );
-                       } catch ( e ) {
-                               if ( window.location.hostname == 'localhost' ) {
-                                       alert( "Your browser blocks XMLHttpRequest to 'localhost', try using a real hostname for development/testing." );
-                               }
-                               throw e;
-                       }
-               }
-       }
-};
-
-/** Init timed update via os_delayedUpdate() */
-window.os_fetchResults = function( r, query, timeout ) {
-       if( query == '' ) {
-               r.query = '';
-               os_hideResults( r );
-               return;
-       } else if( query == r.query ) {
-               return; // no change
-       }
-
-       os_is_stopped = false; // make sure we're running
-
-       // cancel any pending fetches
-       if( os_timer != null && os_timer.id != null ) {
-               clearTimeout( os_timer.id );
-       }
-       // schedule delayed fetching of results
-       if( timeout != 0 ) {
-               os_timer = new os_Timer( setTimeout( "os_delayedFetch()", timeout ), r, query );
-       } else {
-               os_timer = new os_Timer( null, r, query );
-               os_delayedFetch(); // do it now!
-       }
-};
-
-/** Find event target */
-window.os_getTarget = function( e ) {
-       if ( !e ) {
-               e = window.event;
-       }
-       if ( e.target ) {
-               return e.target;
-       } else if ( e.srcElement ) {
-               return e.srcElement;
-       } else {
-               return null;
-       }
-};
-
-/** Check if x is a valid integer */
-window.os_isNumber = function( x ) {
-       if( x == '' || isNaN( x ) ) {
-               return false;
-       }
-       for( var i = 0; i < x.length; i++ ) {
-               var c = x.charAt( i );
-               if( !( c >= '0' && c <= '9' ) ) {
-                       return false;
-               }
-       }
-       return true;
-};
-
-/** Call this to enable suggestions on input (id=inputId), on a form (name=formName) */
-window.os_enableSuggestionsOn = function( inputId, formName ) {
-       os_initHandlers( inputId, formName, document.getElementById( inputId ) );
-};
-
-/** Call this to disable suggestios on input box (id=inputId) */
-window.os_disableSuggestionsOn = function( inputId ) {
-       r = os_map[inputId];
-       if( r != null ) {
-               // cancel/hide results
-               os_timer = null;
-               os_hideResults( r );
-               // turn autocomplete on !
-               document.getElementById( inputId ).setAttribute( 'autocomplete', 'on' );
-               // remove descriptor
-               os_map[inputId] = null;
-       }
-
-       // Remove the element from the os_autoload_* arrays
-       var index = os_autoload_inputs.indexOf( inputId );
-       if ( index >= 0 ) {
-               os_autoload_inputs[index] = os_autoload_forms[index] = '';
-       }
-};
-
-/************************************************
- * Div-only functions (irrelevant for datalist)
- ************************************************/
-
-/** Event: loss of focus of input box */
-window.os_eventBlur = function( e ) {
-       var targ = os_getTarget( e );
-       var r = os_map[targ.id];
-       if( r == null ) {
-               return; // not our event
-       }
-       if( !os_mouse_pressed ) {
-               os_hideResults( r );
-               // force canvas to stay hidden
-               r.stayHidden = true;
-               // cancel any pending fetches
-               if( os_timer != null && os_timer.id != null ) {
-                       clearTimeout( os_timer.id );
-               }
-               os_timer = null;
-       }
-};
-
-/** Event: focus (catch only when stopped) */
-window.os_eventFocus = function( e ) {
-       var targ = os_getTarget( e );
-       var r = os_map[targ.id];
-       if( r == null ) {
-               return; // not our event
-       }
-       r.stayHidden = false;
-};
-
-/**
- * Create and populate a <div>, for non-<datalist>-supporting browsers.
- *
- * @param r       os_Result object
- * @param results Array of the new results to replace existing ones
- */
-window.os_setupDiv = function( r, results ) {
-       var c = document.getElementById( r.container );
-       if ( c == null ) {
-               c = os_createContainer( r );
-       }
-       c.innerHTML = os_createResultTable( r, results );
-       // init container table sizes
-       var t = document.getElementById( r.resultTable );
-       r.containerTotal = t.offsetHeight;
-       r.containerRow = t.offsetHeight / r.resultCount;
-       os_fitContainer( r );
-       os_trimResultText( r );
-       os_showResults( r );
-};
-
-/** Create the result table to be placed in the container div */
-window.os_createResultTable = function( r, results ) {
-       var c = document.getElementById( r.container );
-       var width = c.offsetWidth - os_operaWidthFix( c.offsetWidth );
-       var html = '<table class="os-suggest-results" id="' + r.resultTable + '" style="width: ' + width + 'px;">';
-       r.results = [];
-       r.resultCount = results.length;
-       for( i = 0; i < results.length; i++ ) {
-               var title = os_decodeValue( results[i] );
-               r.results[i] = title;
-               html += '<tr><td class="os-suggest-result" id="' + r.resultTable + i + '"><span id="' + r.resultText + i + '">' + title + '</span></td></tr>';
-       }
-       html += '</table>';
-       return html;
-};
-
-/** Show results div */
-window.os_showResults = function( r ) {
-       if( os_is_stopped ) {
-               return;
-       }
-       if( r.stayHidden ) {
-               return;
-       }
-       os_fitContainer( r );
-       var c = document.getElementById( r.container );
-       r.selected = -1;
-       if( c != null ) {
-               c.scrollTop = 0;
-               c.style.visibility = 'visible';
-               r.visible = true;
-       }
-};
-
-window.os_operaWidthFix = function( x ) {
-       // For browsers that don't understand overflow-x, estimate scrollbar width
-       if( typeof document.body.style.overflowX != 'string' ) {
-               return 30;
-       }
-       return 0;
-};
-
-/** Brower-dependent functions to find window inner size, and scroll status */
-window.f_clientWidth = function() {
-       return f_filterResults(
-               window.innerWidth ? window.innerWidth : 0,
-               document.documentElement ? document.documentElement.clientWidth : 0,
-               document.body ? document.body.clientWidth : 0
-       );
-};
-
-window.f_clientHeight = function() {
-       return f_filterResults(
-               window.innerHeight ? window.innerHeight : 0,
-               document.documentElement ? document.documentElement.clientHeight : 0,
-               document.body ? document.body.clientHeight : 0
-       );
-};
-
-window.f_scrollLeft = function() {
-       return f_filterResults(
-               window.pageXOffset ? window.pageXOffset : 0,
-               document.documentElement ? document.documentElement.scrollLeft : 0,
-               document.body ? document.body.scrollLeft : 0
-       );
-};
-
-window.f_scrollTop = function() {
-       return f_filterResults(
-               window.pageYOffset ? window.pageYOffset : 0,
-               document.documentElement ? document.documentElement.scrollTop : 0,
-               document.body ? document.body.scrollTop : 0
-       );
-};
-
-window.f_filterResults = function( n_win, n_docel, n_body ) {
-       var n_result = n_win ? n_win : 0;
-       if ( n_docel && ( !n_result || ( n_result > n_docel ) ) ) {
-               n_result = n_docel;
-       }
-       return n_body && ( !n_result || ( n_result > n_body ) ) ? n_body : n_result;
-};
-
-/** Get the height available for the results container */
-window.os_availableHeight = function( r ) {
-       var absTop = document.getElementById( r.container ).style.top;
-       var px = absTop.lastIndexOf( 'px' );
-       if( px > 0 ) {
-               absTop = absTop.substring( 0, px );
-       }
-       return f_clientHeight() - ( absTop - f_scrollTop() );
-};
-
-/** Get element absolute position {left,top} */
-window.os_getElementPosition = function( elemID ) {
-       var offsetTrail = document.getElementById( elemID );
-       var offsetLeft = 0;
-       var offsetTop = 0;
-       while ( offsetTrail ) {
-               offsetLeft += offsetTrail.offsetLeft;
-               offsetTop += offsetTrail.offsetTop;
-               offsetTrail = offsetTrail.offsetParent;
-       }
-       if ( navigator.userAgent.indexOf('Mac') != -1 && typeof document.body.leftMargin != 'undefined' ) {
-               offsetLeft += document.body.leftMargin;
-               offsetTop += document.body.topMargin;
-       }
-       return { left:offsetLeft, top:offsetTop };
-};
-
-/** Create the container div that will hold the suggested titles */
-window.os_createContainer = function( r ) {
-       var c = document.createElement( 'div' );
-       var s = document.getElementById( r.searchbox );
-       var pos = os_getElementPosition( r.searchbox );
-       var left = pos.left;
-       var top = pos.top + s.offsetHeight;
-       c.className = 'os-suggest';
-       c.setAttribute( 'id', r.container );
-       document.body.appendChild( c );
-
-       // dynamically generated style params
-       // IE workaround, cannot explicitely set "style" attribute
-       c = document.getElementById( r.container );
-       c.style.top = top + 'px';
-       c.style.left = left + 'px';
-       c.style.width = s.offsetWidth + 'px';
-
-       // mouse event handlers
-       c.onmouseover = function( event ) { os_eventMouseover( r.searchbox, event ); };
-       c.onmousemove = function( event ) { os_eventMousemove( r.searchbox, event ); };
-       c.onmousedown = function( event ) { return os_eventMousedown( r.searchbox, event ); };
-       c.onmouseup = function( event ) { os_eventMouseup( r.searchbox, event ); };
-       return c;
-};
-
-/** change container height to fit to screen */
-window.os_fitContainer = function( r ) {
-       var c = document.getElementById( r.container );
-       var h = os_availableHeight( r ) - 20;
-       var inc = r.containerRow;
-       h = parseInt( h / inc ) * inc;
-       if( h < ( 2 * inc ) && r.resultCount > 1 ) { // min: two results
-               h = 2 * inc;
-       }
-       if( ( h / inc ) > os_max_lines_per_suggest ) {
-               h = inc * os_max_lines_per_suggest;
-       }
-       if( h < r.containerTotal ) {
-               c.style.height = h + 'px';
-               r.containerCount = parseInt( Math.round( h / inc ) );
-       } else {
-               c.style.height = r.containerTotal + 'px';
-               r.containerCount = r.resultCount;
-       }
-};
-
-/** If some entries are longer than the box, replace text with "..." */
-window.os_trimResultText = function( r ) {
-       // find max width, first see if we could expand the container to fit it
-       var maxW = 0;
-       for( var i = 0; i < r.resultCount; i++ ) {
-               var e = document.getElementById( r.resultText + i );
-               if( e.offsetWidth > maxW ) {
-                       maxW = e.offsetWidth;
-               }
-       }
-       var w = document.getElementById( r.container ).offsetWidth;
-       var fix = 0;
-       if( r.containerCount < r.resultCount ) {
-               fix = 20; // give 20px for scrollbar
-       } else {
-               fix = os_operaWidthFix( w );
-       }
-       if( fix < 4 ) {
-               fix = 4; // basic padding
-       }
-       maxW += fix;
-
-       // resize container to fit more data if permitted
-       var normW = document.getElementById( r.searchbox ).offsetWidth;
-       var prop = maxW / normW;
-       if( prop > os_container_max_width ) {
-               prop = os_container_max_width;
-       } else if( prop < 1 ) {
-               prop = 1;
-       }
-       var newW = Math.round( normW * prop );
-       if( w != newW ) {
-               w = newW;
-               if( os_animation_timer != null ) {
-                       clearInterval( os_animation_timer.id );
-               }
-               os_animation_timer = new os_AnimationTimer( r, w );
-               os_animation_timer.id = setInterval( "os_animateChangeWidth()", os_animation_delay );
-               w -= fix; // this much is reserved
-       }
-
-       // trim results
-       if( w < 10 ) {
-               return;
-       }
-       for( var i = 0; i < r.resultCount; i++ ) {
-               var e = document.getElementById( r.resultText + i );
-               var replace = 1;
-               var lastW = e.offsetWidth + 1;
-               var iteration = 0;
-               var changedText = false;
-               while( e.offsetWidth > w && ( e.offsetWidth < lastW || iteration < 2 ) ) {
-                       changedText = true;
-                       lastW = e.offsetWidth;
-                       var l = e.innerHTML;
-                       e.innerHTML = l.substring( 0, l.length - replace ) + '...';
-                       iteration++;
-                       replace = 4; // how many chars to replace
-               }
-               if( changedText ) {
-                       // show hint for trimmed titles
-                       document.getElementById( r.resultTable + i ).setAttribute( 'title', r.results[i] );
-               }
-       }
-};
-
-/** Invoked on timer to animate change in container width */
-window.os_animateChangeWidth = function() {
-       var r = os_animation_timer.r;
-       var c = document.getElementById( r.container );
-       var w = c.offsetWidth;
-       var normW = document.getElementById( r.searchbox ).offsetWidth;
-       var normL = os_getElementPosition( r.searchbox ).left;
-       var inc = os_animation_timer.inc;
-       var target = os_animation_timer.target;
-       var nw = w + inc;
-       if( ( inc > 0 && nw >= target ) || ( inc <= 0 && nw <= target ) ) {
-               // finished !
-               c.style.width = target + 'px';
-               clearInterval( os_animation_timer.id );
-               os_animation_timer = null;
-       } else {
-               // in-progress
-               c.style.width = nw + 'px';
-               if( document.documentElement.dir == 'rtl' ) {
-                       c.style.left = ( normL + normW + ( target - nw ) - os_animation_timer.target - 1 ) + 'px';
-               }
-       }
-};
-
-/** Change the highlighted row (i.e. suggestion), from position cur to next */
-window.os_changeHighlight = function( r, cur, next, updateSearchBox ) {
-       if ( next >= r.resultCount ) {
-               next = r.resultCount - 1;
-       }
-       if ( next < -1 ) {
-               next = -1;
-       }
-       r.selected = next;
-       if ( cur == next ) {
-               return; // nothing to do.
-       }
-
-       if( cur >= 0 ) {
-               var curRow = document.getElementById( r.resultTable + cur );
-               if( curRow != null ) {
-                       curRow.className = 'os-suggest-result';
-               }
-       }
-       var newText;
-       if( next >= 0 ) {
-               var nextRow = document.getElementById( r.resultTable + next );
-               if( nextRow != null ) {
-                       nextRow.className = os_HighlightClass();
-               }
-               newText = r.results[next];
-       } else {
-               newText = r.original;
-       }
-
-       // adjust the scrollbar if any
-       if( r.containerCount < r.resultCount ) {
-               var c = document.getElementById( r.container );
-               var vStart = c.scrollTop / r.containerRow;
-               var vEnd = vStart + r.containerCount;
-               if( next < vStart ) {
-                       c.scrollTop = next * r.containerRow;
-               } else if( next >= vEnd ) {
-                       c.scrollTop = ( next - r.containerCount + 1 ) * r.containerRow;
-               }
-       }
-
-       // update the contents of the search box
-       if( updateSearchBox ) {
-               os_updateSearchQuery( r, newText );
-       }
-};
-
-window.os_HighlightClass = function() {
-       var match = navigator.userAgent.match(/AppleWebKit\/(\d+)/);
-       if ( match ) {
-               var webKitVersion = parseInt( match[1] );
-               if ( webKitVersion < 523 ) {
-                       // CSS system highlight colors broken on old Safari
-                       // https://bugs.webkit.org/show_bug.cgi?id=6129
-                       // Safari 3.0.4, 3.1 known ok
-                       return 'os-suggest-result-hl-webkit';
-               }
-       }
-       return 'os-suggest-result-hl';
-};
-
-window.os_updateSearchQuery = function( r, newText ) {
-       document.getElementById( r.searchbox ).value = newText;
-       r.query = newText;
-};
-
-
-/********************
- *  Mouse events
- ********************/
-
-/** Mouse over the container */
-window.os_eventMouseover = function( srcId, e ) {
-       var targ = os_getTarget( e );
-       var r = os_map[srcId];
-       if( r == null || !os_mouse_moved ) {
-               return; // not our event
-       }
-       var num = os_getNumberSuffix( targ.id );
-       if( num >= 0 ) {
-               os_changeHighlight( r, r.selected, num, false );
-       }
-};
-
-/* Get row where the event occured (from its id) */
-window.os_getNumberSuffix = function( id ) {
-       var num = id.substring( id.length - 2 );
-       if( !( num.charAt( 0 ) >= '0' && num.charAt( 0 ) <= '9' ) ) {
-               num = num.substring( 1 );
-       }
-       if( os_isNumber( num ) ) {
-               return parseInt( num );
-       } else {
-               return -1;
-       }
-};
-
-/** Save mouse move as last action */
-window.os_eventMousemove = function( srcId, e ) {
-       os_mouse_moved = true;
-};
-
-/** Mouse button held down, register possible click */
-window.os_eventMousedown = function( srcId, e ) {
-       var targ = os_getTarget( e );
-       var r = os_map[srcId];
-       if( r == null ) {
-               return; // not our event
-       }
-       var num = os_getNumberSuffix( targ.id );
-
-       os_mouse_pressed = true;
-       if( num >= 0 ) {
-               os_mouse_num = num;
-               // os_updateSearchQuery( r, r.results[num] );
-       }
-       // keep the focus on the search field
-       document.getElementById( r.searchbox ).focus();
-
-       return false; // prevents selection
-};
-
-/** Mouse button released, check for click on some row */
-window.os_eventMouseup = function( srcId, e ) {
-       var targ = os_getTarget( e );
-       var r = os_map[srcId];
-       if( r == null ) {
-               return; // not our event
-       }
-       var num = os_getNumberSuffix( targ.id );
-
-       if( num >= 0 && os_mouse_num == num ) {
-               os_updateSearchQuery( r, r.results[num] );
-               os_hideResults( r );
-               document.getElementById( r.searchform ).submit();
-       }
-       os_mouse_pressed = false;
-       // keep the focus on the search field
-       document.getElementById( r.searchbox ).focus();
-};
-
-/** Toggle stuff seems to be dead code? */
-
-/** Return the span element that contains the toggle link */
-window.os_createToggle = function( r, className ) {
-       var t = document.createElement( 'span' );
-       t.className = className;
-       t.setAttribute( 'id', r.toggle );
-       var link = document.createElement( 'a' );
-       link.setAttribute( 'href', 'javascript:void(0);' );
-       link.onclick = function() { os_toggle( r.searchbox, r.searchform ); };
-       var msg = document.createTextNode( wgMWSuggestMessages[0] );
-       link.appendChild( msg );
-       t.appendChild( link );
-       return t;
-};
-
-/** Call when user clicks on some of the toggle links */
-window.os_toggle = function( inputId, formName ) {
-       r = os_map[inputId];
-       var msg = '';
-       if( r == null ) {
-               os_enableSuggestionsOn( inputId, formName );
-               r = os_map[inputId];
-               msg = wgMWSuggestMessages[0];
-       } else{
-               os_disableSuggestionsOn( inputId, formName );
-               msg = wgMWSuggestMessages[1];
-       }
-       // change message
-       var link = document.getElementById( r.toggle ).firstChild;
-       link.replaceChild( document.createTextNode( msg ), link.firstChild );
-};
-
-hookEvent( 'load', os_MWSuggestInit );
diff --git a/skins/common/preview.js b/skins/common/preview.js
deleted file mode 100644 (file)
index 5b5a3c6..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Live preview script for MediaWiki
- */
-( function( mw, $ ) {
-       var doLivePreview = function( e ) {
-               e.preventDefault();
-
-               $( mw ).trigger( 'LivePreviewPrepare' );
-
-               var $wikiPreview = $( '#wikiPreview' );
-
-               // this needs to be checked before we unconditionally show the preview
-               var overlaySpinner = false;
-               if ( $wikiPreview.is( ':visible' ) || $( '.mw-newarticletext:visible' ).length > 0 ) {
-                       overlaySpinner = true;
-               }
-
-               // show #wikiPreview if it's hidden to be able to scroll to it
-               // (if it is hidden, it's also empty, so nothing changes in the rendering)
-               $wikiPreview.show();
-               // jump to where the preview will appear
-               $wikiPreview[0].scrollIntoView();
-
-               // list of elements that will be loaded from the preview page
-               // elements absent in the preview page (such as .mw-newarticletext) will be cleared using .empty()
-               var copySelectors = [
-                       '#wikiPreview', '#wikiDiff', '#catlinks', '.hiddencats', '#p-lang', // the meat
-                       '.templatesUsed', '.mw-summary-preview', // editing-related
-                       '.mw-newarticletext' // it is not shown during normal preview, and looks weird with throbber overlaid
-               ];
-               var $copyElements = $( copySelectors.join( ',' ) );
-
-               var $loadSpinner = $( '<div>' ).addClass( 'mw-ajax-loader' );
-               $loadSpinner.css( 'top', '0' ); // move away from header (default is -16px)
-
-               // If the preview is already visible, overlay the spinner on top of it.
-               if ( overlaySpinner ) {
-                       $( '#mw-content-text' ).css( 'position', 'relative' ); // FIXME this seems like a bad idea
-
-                       $loadSpinner.css( {
-                               'position': 'absolute',
-                               'z-index': '3',
-                               'left': '50%',
-                               'margin-left': '-16px'
-                       } );
-               }
-
-               // fade out the elements and display the throbber
-               $( '#mw-content-text' ).prepend( $loadSpinner );
-               // we can't use fadeTo because it calls show(), and we might want to keep some elements hidden
-               // (e.g. empty #catlinks)
-               $copyElements.animate( { 'opacity': 0.4 }, 'fast' );
-
-               var $previewDataHolder = $( '<div>' );
-               var target = $( '#editform' ).attr( 'action' ) || window.location.href;
-
-               // gather all the data from the form
-               var postData = $( '#editform' ).formToArray(); // formToArray: from jquery.form
-               postData.push( { 'name' : e.target.name, 'value' : '1' } );
-
-               // load new preview data
-               // FIXME this should use the action=parse API instead of loading the entire page
-               $previewDataHolder.load( target + ' ' + copySelectors.join( ',' ), postData, function() {
-                       // Copy the contents of the specified elements from the loaded page to the real page.
-                       // Also copy their class attributes.
-                       for ( var i = 0; i < copySelectors.length; i++ ) {
-                               var $from = $previewDataHolder.find( copySelectors[i] );
-                               var $to = $( copySelectors[i] );
-
-                               $to.empty().append( $from.contents() );
-                               $to.attr( 'class', $from.attr( 'class' ) );
-                       }
-
-                       $loadSpinner.remove();
-                       $copyElements.animate( { 'opacity': 1 }, 'fast' );
-
-                       $( mw ).trigger( 'LivePreviewDone', [copySelectors] );
-               } );
-       };
-
-       $( document ).ready( function() {
-               // construct the elements we need if they are missing (usually when action=edit)
-               // we don't need to hide them, because they are empty when created
-
-               // interwiki links
-               if ( !document.getElementById( 'p-lang' ) && document.getElementById( 'p-tb' ) ) {
-                       $( '#p-tb' ).after( $( '<div>' ).attr( 'id', 'p-lang' ) );
-               }
-
-               // summary preview
-               if ( $( '.mw-summary-preview' ).length === 0 ) {
-                       $( '.editCheckboxes' ).before( $( '<div>' ).addClass( 'mw-summary-preview' ) );
-               }
-
-               // diff
-               if ( !document.getElementById( 'wikiDiff' ) && document.getElementById( 'wikiPreview' ) ) {
-                       $( '#wikiPreview' ).after( $( '<div>' ).attr( 'id', 'wikiDiff' ) );
-               }
-
-               // diff styles are usually only loaded during, well, diff, and we might need them
-               // (mw.loader takes care of stuff if they happen to be loaded already)
-               mw.loader.load( 'mediawiki.action.history.diff' );
-
-               $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
-       } );
-} )( mediaWiki, jQuery );
index 8f771e9..34d3357 100644 (file)
        direction: rtl;
 }
 
+/* User-Agent styles for new HTML5 elements */
+mark {
+       background-color: yellow;
+       color: black;
+}
+
 /* Input types that should follow user direction, like buttons */
 /* TODO: What about buttons in wikipage content ? */
 input[type="submit"],
@@ -448,6 +454,11 @@ th.mw-revdel-checkbox {
        text-align: center;
 }
 
+/* red links; see bug 36276 */
+a.new {
+       color: #BA0000;
+}
+
 /* feed links */
 a.feedlink {
        /* @embed */
index cae08af..c2c00db 100644 (file)
@@ -91,10 +91,9 @@ window.importStylesheet = function( page ) {
 
 window.importStylesheetURI = function( url, media ) {
        var l = document.createElement( 'link' );
-       l.type = 'text/css';
        l.rel = 'stylesheet';
        l.href = url;
-       if( media ) {
+       if ( media ) {
                l.media = media;
        }
        document.getElementsByTagName('head')[0].appendChild( l );
index 7149551..f201209 100644 (file)
@@ -58,6 +58,7 @@ body {
        font-variant: small-caps;
 }
 
+#p-personal h3,
 #p-personal h5 {
        display: none;
 }
@@ -125,6 +126,12 @@ body {
        background-color: #f0f0f0;
 }
 
+/* Hide, but keep accessible for screen-readers */
+#mw_portlets h2 {
+       position: absolute;
+       top: -9999px;
+}
+
 #mw_main {
        padding: 0 0 0 0;
        margin: 0 0 0 0;
@@ -150,6 +157,11 @@ textarea {
        width: 100%;
        padding: .1em;
 }
+#editform textarea {
+       -moz-box-sizing: border-box;
+       -webkit-box-sizing: border-box;
+       box-sizing: border-box;
+}
 
 #searchBody {
        text-align: center;
@@ -165,11 +177,13 @@ textarea {
        margin-top: .4em;
 }
 
+.portlet h3,
 .portlet h5 {
        padding: 0.1em 0 0.3em 1em;
        margin: 0 0 0 0;
        background-color: #dddddd;
        font-weight: bold;
+       font-size: 0.83em;
        border-bottom: solid 1px #3c78b5;
        height: 1.1em;
 }
@@ -238,6 +252,7 @@ ul {
        color: white;
 }
 
+#p-cactions h3,
 #p-cactions h5 {
        display: none;
 }
index 5866d97..4cbc093 100644 (file)
@@ -24,6 +24,11 @@ div#content {
 div#column-one {
        padding-top: 160px;
 }
+/* Hide, but keep accessible for screen-readers */
+#column-one h2 {
+       position: absolute;
+       top: -9999px;
+}
 div#content {
        background: white;
        color: black;
@@ -71,6 +76,7 @@ a.new,
 }
 
 ul {
+       list-style-type: square;
        /* @embed */
        list-style-image: url(bullet.gif);
 }
@@ -224,12 +230,7 @@ table.rimage {
        width: 11.6em;
        overflow: hidden;
 }
-.portlet h4 {
-       font-size: 95%;
-       font-weight: normal;
-       white-space: nowrap;
-}
-.portlet h5 {
+.portlet h3 {
        background: transparent;
        padding: 0 1em 0 .5em;
        display: inline;
@@ -239,18 +240,6 @@ table.rimage {
        font-weight: normal;
        white-space: nowrap;
 }
-.portlet h6 {
-       background: #ffae2e;
-       border: 1px solid #2f6fab;
-       border-style: solid solid none solid;
-       padding: 0 1em 0 1em;
-       text-transform: lowercase;
-       display: block;
-       font-size: 1em;
-       height: 1.2em;
-       font-weight: normal;
-       white-space: nowrap;
-}
 .pBody {
        font-size: 95%;
        background-color: white;
@@ -259,18 +248,8 @@ table.rimage {
        border: 1px solid #aaa;
        padding: 0 .8em .3em .5em;
 }
-.portlet h1,
-.portlet h2,
-.portlet h3,
-.portlet h4 {
-       margin: 0;
-       padding: 0;
-}
 .portlet ul {
        line-height: 1.5em;
-       list-style-type: square;
-       /* @embed */
-       list-style-image: url(bullet.gif);
        font-size: 95%;
 }
 .portlet li {
@@ -291,7 +270,7 @@ table.rimage {
        width: 12em;
        overflow: visible;
 }
-#p-logo h5 {
+#p-logo h3 {
        display: none;
 }
 #p-logo a,
@@ -352,7 +331,7 @@ input.searchButton {
        overflow: visible;
        line-height: 1.2em;
 }
-#p-personal h5 {
+#p-personal h3 {
        display: none;
 }
 #p-personal .portlet,
@@ -372,7 +351,8 @@ input.searchButton {
        padding: 0 2em 0 3em;
        margin: 0;
        text-align: right;
-       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
        z-index: 0;
        background: none;
        cursor: default;
@@ -432,11 +412,11 @@ li#pt-login {
        background: none;
        border-collapse: collapse;
        padding-left: 1em;
-       list-style: none;
        font-size: 95%;
 }
 #p-cactions ul {
-       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
 }
 #p-cactions li {
        display: inline;
@@ -474,7 +454,7 @@ li#pt-login {
        text-decoration: none;
        background-color: white;
 }
-#p-cactions h5 {
+#p-cactions h3 {
        display: none;
 }
 #p-cactions li.istalk {
@@ -515,8 +495,7 @@ li#ca-print {
 }
 
 /* Override text-transform on languages where capitalization is significant */
-.capitalize-all-nouns .portlet h5,
-.capitalize-all-nouns .portlet h6,
+.capitalize-all-nouns .portlet h3,
 .capitalize-all-nouns #p-personal ul,
 .capitalize-all-nouns #p-cactions ul li a {
        text-transform: none;
@@ -824,7 +803,8 @@ div#searchTarget {
 }
 
 div#searchTarget ul li {
-       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
 }
 
 div#searchTarget ul li:before {
index 7b4f2ae..edb1d7d 100644 (file)
@@ -84,6 +84,12 @@ a:hover {
        left: 0;
 }
 
+/* Hide, but keep accessible for screen-readers */
+#column-one h2 {
+       position: absolute;
+       top: -9999px;
+}
+
 body {
        margin: 0;
        padding: 0;
index 4069d9e..26967a5 100644 (file)
@@ -37,6 +37,11 @@ div#content {
        color: black;
        direction: ltr;
 }
+/* Hide, but keep accessible for screen-readers */
+#mw-navigation h2 {
+       position: absolute;
+       top: -9999px;
+}
 /* Head */
 #mw-page-base {
        height: 5em;
@@ -61,6 +66,7 @@ div#mw-head {
        right: 0;
        width: 100%;
 }
+div#mw-head h3,
 div#mw-head h5 {
        margin: 0;
        padding: 0;
@@ -74,12 +80,16 @@ div.emptyPortlet {
        position: absolute;
        top: 0.33em;
        right: 0.75em;
+       /* Display on top of page tabs - bug 37158 */
+       z-index: 1;
 }
+#p-personal h3,
 #p-personal h5 {
        display: none;
 }
 #p-personal ul {
-       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
        margin: 0;
        padding-left: 10em; /* Keep from overlapping logo */
 }
@@ -106,7 +116,9 @@ div.emptyPortlet {
        margin-top: 2.5em;
 }
 /* Navigation Labels */
+div.vectorTabs h3,
 div.vectorTabs h5,
+div.vectorMenu h3 span,
 div.vectorMenu h5 span {
        display: none;
 }
@@ -129,7 +141,8 @@ div.vectorTabs ul {
 }
 div.vectorTabs ul {
        height: 100%;
-       list-style: none;
+       list-style-type: none;
+       list-style-image: none;
        margin: 0;
        padding: 0;
 }
@@ -226,6 +239,7 @@ body.rtl div.vectorMenu {
 }
 /* OVERRIDDEN BY COMPLIANT BROWSERS */
 /* @noflip */
+div#mw-head div.vectorMenu h3,
 div#mw-head div.vectorMenu h5 {
        float: left;
        /* @embed */
@@ -233,15 +247,18 @@ div#mw-head div.vectorMenu h5 {
        background-repeat: no-repeat;
 }
 /* This will be flipped - unlike the one above it */
+div#mw-head div.vectorMenu h3,
 div#mw-head div.vectorMenu h5 {
        background-position: bottom left;
        margin-left: -1px;
 }
 /* IGNORED BY IE6 */
+div#mw-head div.vectorMenu > h3,
 div#mw-head div.vectorMenu > h5 {
        background-image: none;
 }
-div#mw-head div.vectorMenu h4 {
+div#mw-head div.vectorMenu h4,
+div.vectorMenu#p-variants #mw-vector-current-variant {
        display: inline-block;
        float: left;
        font-size: 0.8em;
@@ -252,20 +269,23 @@ div#mw-head div.vectorMenu h4 {
 }
 /* OVERRIDDEN BY COMPLIANT BROWSERS */
 /* @noflip */
+div.vectorMenu h3 a,
 div.vectorMenu h5 a {
        display: inline-block;
        width: 24px;
-       height: 2.5em;
+       height: 1.9em;
        text-decoration: none;
        /* @embed */
        background-image: url(images/tab-break.png);
        background-repeat: no-repeat;
 }
 /* This will be flipped - unlike the one above it */
+div.vectorMenu h3 a,
 div.vectorMenu h5 a {
        background-position: bottom right;
 }
 /* IGNORED BY IE6 */
+div.vectorMenu h3 > a,
 div.vectorMenu h5 > a {
        display: block;
 }
@@ -302,9 +322,8 @@ div.vectorMenu ul {
        background-color: white;
        border: solid 1px silver;
        border-top-width: 0;
-       list-style: none;
-       list-style-image: none;
        list-style-type: none;
+       list-style-image: none;
        padding: 0;
        margin: 0;
        margin-left: -1px;
@@ -346,6 +365,7 @@ div.vectorMenu li.selected a:visited {
        text-decoration: none;
 }
 /* Search */
+#p-search h3,
 #p-search h5 {
        display: none;
 }
@@ -399,6 +419,12 @@ div#simpleSearch input.placeholder {
 div#simpleSearch input::-webkit-input-placeholder {
        color: #999;
 }
+div#simpleSearch input:-moz-placeholder {
+       color: #999;
+}
+div#simpleSearch input:-ms-input-placeholder {
+       color: #999;
+}
 div#simpleSearch input#searchInput {
        position: absolute;
        top: 0;
@@ -457,6 +483,7 @@ div#mw-panel div.portal {
        padding-bottom: 1.5em;
        direction: ltr;
 }
+div#mw-panel div.portal h3,
 div#mw-panel div.portal h5 {
        font-weight: normal;
        color: #444;
@@ -477,9 +504,8 @@ div#mw-panel div.portal div.body {
        background-position: top left;
 }
 div#mw-panel div.portal div.body ul {
-       list-style: none;
-       list-style-image: none;
        list-style-type: none;
+       list-style-image: none;
        padding: 0;
        margin: 0;
 }
@@ -509,9 +535,8 @@ div#footer {
        direction: ltr;
 }
 div#footer ul {
-       list-style: none;
-       list-style-image: none;
        list-style-type: none;
+       list-style-image: none;
        margin: 0;
        padding: 0;
 }
@@ -679,6 +704,7 @@ div#content {
 }
 
 ul {
+       list-style-type: disc;
        /* @embed */
        list-style-image: url(images/bullet-icon.png);
 }
index 8b719e5..4427d9a 100644 (file)
@@ -4,7 +4,7 @@
 jQuery( function ( $ ) {
        $( 'div.vectorMenu' ).each( function () {
                var $el = $( this );
-               $el.find( 'h5:first a:first' )
+               $el.find( 'h3:first a:first' )
                        // For accessibility, show the menu when the hidden link in the menu is clicked (bug 24298)
                        .click( function ( e ) {
                                $el.find( '.menu:first' ).toggleClass( 'menuForceShow' );
index 42f5f68..8373b51 100644 (file)
 <?php
+/**
+ * AutoLoader for the testing suite.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * 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 Testing
+ */
 
 global $wgAutoloadClasses;
-$testFolder = __DIR__;
+$testDir = __DIR__;
 
 $wgAutoloadClasses += array(
 
-       //PHPUnit
-       'MediaWikiTestCase' => "$testFolder/phpunit/MediaWikiTestCase.php",
-       'MediaWikiPHPUnitCommand' => "$testFolder/phpunit/MediaWikiPHPUnitCommand.php",
-       'MediaWikiLangTestCase' => "$testFolder/phpunit/MediaWikiLangTestCase.php",
-       'NewParserTest' => "$testFolder/phpunit/includes/parser/NewParserTest.php",
+       # tests
+       'DbTestPreviewer' => "$testDir/testHelpers.inc",
+       'DbTestRecorder' => "$testDir/testHelpers.inc",
+       'DelayedParserTest' => "$testDir/testHelpers.inc",
+       'TestFileIterator' => "$testDir/testHelpers.inc",
+       'TestRecorder' => "$testDir/testHelpers.inc",
 
-       //includes
-       'BlockTest' => "$testFolder/phpunit/includes/BlockTest.php",
+       # tests/phpunit
+       'MediaWikiTestCase' => "$testDir/phpunit/MediaWikiTestCase.php",
+       'MediaWikiPHPUnitCommand' => "$testDir/phpunit/MediaWikiPHPUnitCommand.php",
+       'MediaWikiLangTestCase' => "$testDir/phpunit/MediaWikiLangTestCase.php",
+       'MediaWikiProvide' => "$testDir/phpunit/includes/Providers.php",
+       'TestUser' => "$testDir/phpunit/includes/TestUser.php",
 
-       //API
-       'ApiFormatTestBase' => "$testFolder/phpunit/includes/api/format/ApiFormatTestBase.php",
-       'ApiTestCase' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
-       'TestUser' => "$testFolder/phpunit/includes/TestUser.php",
-       'MockApi' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
-       'RandomImageGenerator' => "$testFolder/phpunit/includes/api/RandomImageGenerator.php",
-       'UserWrapper' => "$testFolder/phpunit/includes/api/ApiTestCase.php",
+       # tests/phpunit/includes
+       'BlockTest' => "$testDir/phpunit/includes/BlockTest.php",
+       'RevisionStorageTest' => "$testDir/phpunit/includes/RevisionStorageTest.php",
+       'WikiPageTest' => "$testDir/phpunit/includes/WikiPageTest.php",
+
+       //db
+       'ORMTableTest' => "$testDir/phpunit/includes/db/ORMTableTest.php",
 
        //Selenium
-       'SeleniumTestConstants' => "$testFolder/selenium/SeleniumTestConstants.php",
+       'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
+
+       # tests/phpunit/includes/api
+       'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
+       'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php",
+       'ApiTestContext' => "$testDir/phpunit/includes/api/ApiTestCase.php",
+       'MockApi' => "$testDir/phpunit/includes/api/ApiTestCase.php",
+       'RandomImageGenerator' => "$testDir/phpunit/includes/api/RandomImageGenerator.php",
+       'UserWrapper' => "$testDir/phpunit/includes/api/ApiTestCase.php",
+
+       # tests/phpunit/includes/content
+       'DummyContentHandlerForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
+       'DummyContentForTesting' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
+       'ContentHandlerTest' => "$testDir/phpunit/includes/content/ContentHandlerTest.php",
+       'JavaScriptContentTest' => "$testDir/phpunit/includes/content/JavaScriptContentTest.php",
+       'TextContentTest' => "$testDir/phpunit/includes/content/TextContentTest.php",
+       'WikitextContentTest' => "$testDir/phpunit/includes/content/WikitextContentTest.php",
+
+       # tests/phpunit/includes/db
+       'ORMRowTest' => "$testDir/phpunit/includes/db/ORMRowTest.php",
+
+       # tests/phpunit/includes/parser
+       'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
+
+       # tests/phpunit/includes/libs
+       'GenericArrayObjectTest' => "$testDir/phpunit/includes/libs/GenericArrayObjectTest.php",
+
+       # tests/phpunit/includes/site
+       'SiteObjectTest' => "$testDir/phpunit/includes/site/SiteObjectTest.php",
+       'TestSites' => "$testDir/phpunit/includes/site/TestSites.php",
+
+       # tests/phpunit/languages
+       'LanguageClassesTestCase' => "$testDir/phpunit/languages/LanguageClassesTestCase.php",
+
+       # tests/phpunit/maintenance
+       'DumpTestCase' => "$testDir/phpunit/maintenance/DumpTestCase.php",
 
-       //maintenance
-       'DumpTestCase' => "$testFolder/phpunit/maintenance/DumpTestCase.php",
-       'BackupDumper' => "$testFolder/../maintenance/backup.inc",
+       # tests/parser
+       'ParserTest' => "$testDir/parser/parserTest.inc",
+       'ParserTestParserHook' => "$testDir/parser/parserTestsParserHook.php",
 
-       //Generic providers
-       'MediaWikiProvide' => "$testFolder/phpunit/includes/Providers.php",
+       # tests/selenium
+       'Selenium' => "$testDir/selenium/Selenium.php",
+       'SeleniumLoader' => "$testDir/selenium/SeleniumLoader.php",
+       'SeleniumTestCase' => "$testDir/selenium/SeleniumTestCase.php",
+       'SeleniumTestConsoleLogger' => "$testDir/selenium/SeleniumTestConsoleLogger.php",
+       'SeleniumTestConstants' => "$testDir/selenium/SeleniumTestConstants.php",
+       'SeleniumTestHTMLLogger' => "$testDir/selenium/SeleniumTestHTMLLogger.php",
+       'SeleniumTestListener' => "$testDir/selenium/SeleniumTestListener.php",
+       'SeleniumTestSuite' => "$testDir/selenium/SeleniumTestSuite.php",
+       'SeleniumConfig' => "$testDir/selenium/SeleniumConfig.php",
 );
 
diff --git a/tests/jasmine/.htaccess b/tests/jasmine/.htaccess
deleted file mode 100644 (file)
index 605d2f4..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Allow from all
diff --git a/tests/jasmine/SpecRunner.html b/tests/jasmine/SpecRunner.html
deleted file mode 100644 (file)
index 63d0fdf..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html>
-<html lang="en" dir="ltr">
-       <head>
-               <title>Jasmine Test Runner</title>
-               <meta charset="UTF-8" />
-               <link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.1/jasmine.css">
-               <script src="lib/jasmine-1.0.1/jasmine.js"></script>
-               <script src="lib/jasmine-1.0.1/jasmine-html.js"></script>
-
-               <!-- include source files here... -->
-               <script src="../../load.php?debug=true&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=vector&amp;*"></script>
-               <script>
-               mw.loader.load( ['mediawiki.jqueryMsg'] );
-               </script>
-
-               <!-- insert test data files here -->
-               <script src="spec/mediawiki.jqueryMsg.spec.data.js"></script>
-
-               <!-- include spec files here... -->
-               <script src="spec/mediawiki.jqueryMsg.spec.js"></script>
-       </head>
-<body>
-       <script>
-               jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );
-               jasmine.getEnv().execute();
-       </script>
-</body>
-</html>
diff --git a/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE b/tests/jasmine/lib/jasmine-1.0.1/MIT.LICENSE
deleted file mode 100644 (file)
index 1eb9b49..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2008-2010 Pivotal Labs
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js b/tests/jasmine/lib/jasmine-1.0.1/jasmine-html.js
deleted file mode 100644 (file)
index 81402b9..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-jasmine.TrivialReporter = function(doc) {
-  this.document = doc || document;
-  this.suiteDivs = {};
-  this.logRunningSpecs = false;
-};
-
-jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
-  var el = document.createElement(type);
-
-  for (var i = 2; i < arguments.length; i++) {
-    var child = arguments[i];
-
-    if (typeof child === 'string') {
-      el.appendChild(document.createTextNode(child));
-    } else {
-      if (child) { el.appendChild(child); }
-    }
-  }
-
-  for (var attr in attrs) {
-    if (attr == "className") {
-      el[attr] = attrs[attr];
-    } else {
-      el.setAttribute(attr, attrs[attr]);
-    }
-  }
-
-  return el;
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
-  var showPassed, showSkipped;
-
-  this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
-      this.createDom('div', { className: 'banner' },
-        this.createDom('div', { className: 'logo' },
-            this.createDom('a', { href: 'http://pivotal.github.com/jasmine/', target: "_blank" }, "Jasmine"),
-            this.createDom('span', { className: 'version' }, runner.env.versionString())),
-        this.createDom('div', { className: 'options' },
-            "Show ",
-            showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
-            this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
-            showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
-            this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
-            )
-          ),
-
-      this.runnerDiv = this.createDom('div', { className: 'runner running' },
-          this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
-          this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
-          this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
-      );
-
-  this.document.body.appendChild(this.outerDiv);
-
-  var suites = runner.suites();
-  for (var i = 0; i < suites.length; i++) {
-    var suite = suites[i];
-    var suiteDiv = this.createDom('div', { className: 'suite' },
-        this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
-        this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
-    this.suiteDivs[suite.id] = suiteDiv;
-    var parentDiv = this.outerDiv;
-    if (suite.parentSuite) {
-      parentDiv = this.suiteDivs[suite.parentSuite.id];
-    }
-    parentDiv.appendChild(suiteDiv);
-  }
-
-  this.startedAt = new Date();
-
-  var self = this;
-  showPassed.onclick = function(evt) {
-    if (showPassed.checked) {
-      self.outerDiv.className += ' show-passed';
-    } else {
-      self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
-    }
-  };
-
-  showSkipped.onclick = function(evt) {
-    if (showSkipped.checked) {
-      self.outerDiv.className += ' show-skipped';
-    } else {
-      self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
-    }
-  };
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
-  var results = runner.results();
-  var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
-  this.runnerDiv.setAttribute("class", className);
-  //do it twice for IE
-  this.runnerDiv.setAttribute("className", className);
-  var specs = runner.specs();
-  var specCount = 0;
-  for (var i = 0; i < specs.length; i++) {
-    if (this.specFilter(specs[i])) {
-      specCount++;
-    }
-  }
-  var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
-  message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
-  this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
-
-  this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
-};
-
-jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
-  var results = suite.results();
-  var status = results.passed() ? 'passed' : 'failed';
-  if (results.totalCount == 0) { // todo: change this to check results.skipped
-    status = 'skipped';
-  }
-  this.suiteDivs[suite.id].className += " " + status;
-};
-
-jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
-  if (this.logRunningSpecs) {
-    this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
-  }
-};
-
-jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
-  var results = spec.results();
-  var status = results.passed() ? 'passed' : 'failed';
-  if (results.skipped) {
-    status = 'skipped';
-  }
-  var specDiv = this.createDom('div', { className: 'spec '  + status },
-      this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
-      this.createDom('a', {
-        className: 'description',
-        href: '?spec=' + encodeURIComponent(spec.getFullName()),
-        title: spec.getFullName()
-      }, spec.description));
-
-
-  var resultItems = results.getItems();
-  var messagesDiv = this.createDom('div', { className: 'messages' });
-  for (var i = 0; i < resultItems.length; i++) {
-    var result = resultItems[i];
-
-    if (result.type == 'log') {
-      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
-    } else if (result.type == 'expect' && result.passed && !result.passed()) {
-      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
-
-      if (result.trace.stack) {
-        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
-      }
-    }
-  }
-
-  if (messagesDiv.childNodes.length > 0) {
-    specDiv.appendChild(messagesDiv);
-  }
-
-  this.suiteDivs[spec.suite.id].appendChild(specDiv);
-};
-
-jasmine.TrivialReporter.prototype.log = function() {
-  var console = jasmine.getGlobal().console;
-  if (console && console.log) {
-    if (console.log.apply) {
-      console.log.apply(console, arguments);
-    } else {
-      console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
-    }
-  }
-};
-
-jasmine.TrivialReporter.prototype.getLocation = function() {
-  return this.document.location;
-};
-
-jasmine.TrivialReporter.prototype.specFilter = function(spec) {
-  var paramMap = {};
-  var params = this.getLocation().search.substring(1).split('&');
-  for (var i = 0; i < params.length; i++) {
-    var p = params[i].split('=');
-    paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
-  }
-
-  if (!paramMap["spec"]) return true;
-  return spec.getFullName().indexOf(paramMap["spec"]) == 0;
-};
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine.css b/tests/jasmine/lib/jasmine-1.0.1/jasmine.css
deleted file mode 100644 (file)
index 6583fe7..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-body {
-  font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
-}
-
-
-.jasmine_reporter a:visited, .jasmine_reporter a {
-  color: #303; 
-}
-
-.jasmine_reporter a:hover, .jasmine_reporter a:active {
-  color: blue; 
-}
-
-.run_spec {
-  float:right;
-  padding-right: 5px;
-  font-size: .8em;
-  text-decoration: none;
-}
-
-.jasmine_reporter {
-  margin: 0 5px;
-}
-
-.banner {
-  color: #303;
-  background-color: #fef;
-  padding: 5px;
-}
-
-.logo {
-  float: left;
-  font-size: 1.1em;
-  padding-left: 5px;
-}
-
-.logo .version {
-  font-size: .6em;
-  padding-left: 1em;
-}
-
-.runner.running {
-  background-color: yellow;
-}
-
-
-.options {
-  text-align: right;
-  font-size: .8em;
-}
-
-
-
-
-.suite {
-  border: 1px outset gray;
-  margin: 5px 0;
-  padding-left: 1em;
-}
-
-.suite .suite {
-  margin: 5px; 
-}
-
-.suite.passed {
-  background-color: #dfd;
-}
-
-.suite.failed {
-  background-color: #fdd;
-}
-
-.spec {
-  margin: 5px;
-  padding-left: 1em;
-  clear: both;
-}
-
-.spec.failed, .spec.passed, .spec.skipped {
-  padding-bottom: 5px;
-  border: 1px solid gray;
-}
-
-.spec.failed {
-  background-color: #fbb;
-  border-color: red;
-}
-
-.spec.passed {
-  background-color: #bfb;
-  border-color: green;
-}
-
-.spec.skipped {
-  background-color: #bbb;
-}
-
-.messages {
-  border-left: 1px dashed gray;
-  padding-left: 1em;
-  padding-right: 1em;
-}
-
-.passed {
-  background-color: #cfc;
-  display: none;
-}
-
-.failed {
-  background-color: #fbb;
-}
-
-.skipped {
-  color: #777;
-  background-color: #eee;
-  display: none;
-}
-
-
-/*.resultMessage {*/
-  /*white-space: pre;*/
-/*}*/
-
-.resultMessage span.result {
-  display: block;
-  line-height: 2em;
-  color: black;
-}
-
-.resultMessage .mismatch {
-  color: black;
-}
-
-.stackTrace {
-  white-space: pre;
-  font-size: .8em;
-  margin-left: 10px;
-  max-height: 5em;
-  overflow: auto;
-  border: 1px inset red;
-  padding: 1em;
-  background: #eef;
-}
-
-.finished-at {
-  padding-left: 1em;
-  font-size: .6em;
-}
-
-.show-passed .passed,
-.show-skipped .skipped {
-  display: block;
-}
-
-
-#jasmine_content {
-  position:fixed;
-  right: 100%;
-}
-
-.runner {
-  border: 1px solid gray;
-  display: block;
-  margin: 5px 0;
-  padding: 2px 0 2px 10px;
-}
diff --git a/tests/jasmine/lib/jasmine-1.0.1/jasmine.js b/tests/jasmine/lib/jasmine-1.0.1/jasmine.js
deleted file mode 100644 (file)
index 964f99e..0000000
+++ /dev/null
@@ -1,2421 +0,0 @@
-/**
- * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
- *
- * @namespace
- */
-var jasmine = {};
-
-/**
- * @private
- */
-jasmine.unimplementedMethod_ = function() {
-  throw new Error("unimplemented method");
-};
-
-/**
- * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just
- * a plain old variable and may be redefined by somebody else.
- *
- * @private
- */
-jasmine.undefined = jasmine.___undefined___;
-
-/**
- * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.
- *
- */
-jasmine.DEFAULT_UPDATE_INTERVAL = 250;
-
-/**
- * Default timeout interval in milliseconds for waitsFor() blocks.
- */
-jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
-
-jasmine.getGlobal = function() {
-  function getGlobal() {
-    return this;
-  }
-
-  return getGlobal();
-};
-
-/**
- * Allows for bound functions to be compared.  Internal use only.
- *
- * @ignore
- * @private
- * @param base {Object} bound 'this' for the function
- * @param name {Function} function to find
- */
-jasmine.bindOriginal_ = function(base, name) {
-  var original = base[name];
-  if (original.apply) {
-    return function() {
-      return original.apply(base, arguments);
-    };
-  } else {
-    // IE support
-    return jasmine.getGlobal()[name];
-  }
-};
-
-jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout');
-jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout');
-jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval');
-jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval');
-
-jasmine.MessageResult = function(values) {
-  this.type = 'log';
-  this.values = values;
-  this.trace = new Error(); // todo: test better
-};
-
-jasmine.MessageResult.prototype.toString = function() {
-  var text = "";
-  for(var i = 0; i < this.values.length; i++) {
-    if (i > 0) text += " ";
-    if (jasmine.isString_(this.values[i])) {
-      text += this.values[i];
-    } else {
-      text += jasmine.pp(this.values[i]);
-    }
-  }
-  return text;
-};
-
-jasmine.ExpectationResult = function(params) {
-  this.type = 'expect';
-  this.matcherName = params.matcherName;
-  this.passed_ = params.passed;
-  this.expected = params.expected;
-  this.actual = params.actual;
-
-  this.message = this.passed_ ? 'Passed.' : params.message;
-  this.trace = this.passed_ ? '' : new Error(this.message);
-};
-
-jasmine.ExpectationResult.prototype.toString = function () {
-  return this.message;
-};
-
-jasmine.ExpectationResult.prototype.passed = function () {
-  return this.passed_;
-};
-
-/**
- * Getter for the Jasmine environment. Ensures one gets created
- */
-jasmine.getEnv = function() {
-  return jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isArray_ = function(value) {
-  return jasmine.isA_("Array", value);  
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isString_ = function(value) {
-  return jasmine.isA_("String", value);
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isNumber_ = function(value) {
-  return jasmine.isA_("Number", value);
-};
-
-/**
- * @ignore
- * @private
- * @param {String} typeName
- * @param value
- * @returns {Boolean}
- */
-jasmine.isA_ = function(typeName, value) {
-  return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';
-};
-
-/**
- * Pretty printer for expecations.  Takes any object and turns it into a human-readable string.
- *
- * @param value {Object} an object to be outputted
- * @returns {String}
- */
-jasmine.pp = function(value) {
-  var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
-  stringPrettyPrinter.format(value);
-  return stringPrettyPrinter.string;
-};
-
-/**
- * Returns true if the object is a DOM Node.
- *
- * @param {Object} obj object to check
- * @returns {Boolean}
- */
-jasmine.isDomNode = function(obj) {
-  return obj['nodeType'] > 0;
-};
-
-/**
- * Returns a matchable 'generic' object of the class type.  For use in expecations of type when values don't matter.
- *
- * @example
- * // don't care about which function is passed in, as long as it's a function
- * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function));
- *
- * @param {Class} clazz
- * @returns matchable object of the type clazz
- */
-jasmine.any = function(clazz) {
-  return new jasmine.Matchers.Any(clazz);
-};
-
-/**
- * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
- *
- * Spies should be created in test setup, before expectations.  They can then be checked, using the standard Jasmine
- * expectation syntax. Spies can be checked if they were called or not and what the calling params were.
- *
- * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs).
- *
- * Spies are torn down at the end of every spec.
- *
- * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.
- *
- * @example
- * // a stub
- * var myStub = jasmine.createSpy('myStub');  // can be used anywhere
- *
- * // spy example
- * var foo = {
- *   not: function(bool) { return !bool; }
- * }
- *
- * // actual foo.not will not be called, execution stops
- * spyOn(foo, 'not');
-
- // foo.not spied upon, execution will continue to implementation
- * spyOn(foo, 'not').andCallThrough();
- *
- * // fake example
- * var foo = {
- *   not: function(bool) { return !bool; }
- * }
- *
- * // foo.not(val) will return val
- * spyOn(foo, 'not').andCallFake(function(value) {return value;});
- *
- * // mock example
- * foo.not(7 == 7);
- * expect(foo.not).toHaveBeenCalled();
- * expect(foo.not).toHaveBeenCalledWith(true);
- *
- * @constructor
- * @see spyOn, jasmine.createSpy, jasmine.createSpyObj
- * @param {String} name
- */
-jasmine.Spy = function(name) {
-  /**
-   * The name of the spy, if provided.
-   */
-  this.identity = name || 'unknown';
-  /**
-   *  Is this Object a spy?
-   */
-  this.isSpy = true;
-  /**
-   * The actual function this spy stubs.
-   */
-  this.plan = function() {
-  };
-  /**
-   * Tracking of the most recent call to the spy.
-   * @example
-   * var mySpy = jasmine.createSpy('foo');
-   * mySpy(1, 2);
-   * mySpy.mostRecentCall.args = [1, 2];
-   */
-  this.mostRecentCall = {};
-
-  /**
-   * Holds arguments for each call to the spy, indexed by call count
-   * @example
-   * var mySpy = jasmine.createSpy('foo');
-   * mySpy(1, 2);
-   * mySpy(7, 8);
-   * mySpy.mostRecentCall.args = [7, 8];
-   * mySpy.argsForCall[0] = [1, 2];
-   * mySpy.argsForCall[1] = [7, 8];
-   */
-  this.argsForCall = [];
-  this.calls = [];
-};
-
-/**
- * Tells a spy to call through to the actual implemenatation.
- *
- * @example
- * var foo = {
- *   bar: function() { // do some stuff }
- * }
- *
- * // defining a spy on an existing property: foo.bar
- * spyOn(foo, 'bar').andCallThrough();
- */
-jasmine.Spy.prototype.andCallThrough = function() {
-  this.plan = this.originalValue;
-  return this;
-};
-
-/**
- * For setting the return value of a spy.
- *
- * @example
- * // defining a spy from scratch: foo() returns 'baz'
- * var foo = jasmine.createSpy('spy on foo').andReturn('baz');
- *
- * // defining a spy on an existing property: foo.bar() returns 'baz'
- * spyOn(foo, 'bar').andReturn('baz');
- *
- * @param {Object} value
- */
-jasmine.Spy.prototype.andReturn = function(value) {
-  this.plan = function() {
-    return value;
-  };
-  return this;
-};
-
-/**
- * For throwing an exception when a spy is called.
- *
- * @example
- * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'
- * var foo = jasmine.createSpy('spy on foo').andThrow('baz');
- *
- * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'
- * spyOn(foo, 'bar').andThrow('baz');
- *
- * @param {String} exceptionMsg
- */
-jasmine.Spy.prototype.andThrow = function(exceptionMsg) {
-  this.plan = function() {
-    throw exceptionMsg;
-  };
-  return this;
-};
-
-/**
- * Calls an alternate implementation when a spy is called.
- *
- * @example
- * var baz = function() {
- *   // do some stuff, return something
- * }
- * // defining a spy from scratch: foo() calls the function baz
- * var foo = jasmine.createSpy('spy on foo').andCall(baz);
- *
- * // defining a spy on an existing property: foo.bar() calls an anonymnous function
- * spyOn(foo, 'bar').andCall(function() { return 'baz';} );
- *
- * @param {Function} fakeFunc
- */
-jasmine.Spy.prototype.andCallFake = function(fakeFunc) {
-  this.plan = fakeFunc;
-  return this;
-};
-
-/**
- * Resets all of a spy's the tracking variables so that it can be used again.
- *
- * @example
- * spyOn(foo, 'bar');
- *
- * foo.bar();
- *
- * expect(foo.bar.callCount).toEqual(1);
- *
- * foo.bar.reset();
- *
- * expect(foo.bar.callCount).toEqual(0);
- */
-jasmine.Spy.prototype.reset = function() {
-  this.wasCalled = false;
-  this.callCount = 0;
-  this.argsForCall = [];
-  this.calls = [];
-  this.mostRecentCall = {};
-};
-
-jasmine.createSpy = function(name) {
-
-  var spyObj = function() {
-    spyObj.wasCalled = true;
-    spyObj.callCount++;
-    var args = jasmine.util.argsToArray(arguments);
-    spyObj.mostRecentCall.object = this;
-    spyObj.mostRecentCall.args = args;
-    spyObj.argsForCall.push(args);
-    spyObj.calls.push({object: this, args: args});
-    return spyObj.plan.apply(this, arguments);
-  };
-
-  var spy = new jasmine.Spy(name);
-
-  for (var prop in spy) {
-    spyObj[prop] = spy[prop];
-  }
-
-  spyObj.reset();
-
-  return spyObj;
-};
-
-/**
- * Determines whether an object is a spy.
- *
- * @param {jasmine.Spy|Object} putativeSpy
- * @returns {Boolean}
- */
-jasmine.isSpy = function(putativeSpy) {
-  return putativeSpy && putativeSpy.isSpy;
-};
-
-/**
- * Creates a more complicated spy: an Object that has every property a function that is a spy.  Used for stubbing something
- * large in one call.
- *
- * @param {String} baseName name of spy class
- * @param {Array} methodNames array of names of methods to make spies
- */
-jasmine.createSpyObj = function(baseName, methodNames) {
-  if (!jasmine.isArray_(methodNames) || methodNames.length == 0) {
-    throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
-  }
-  var obj = {};
-  for (var i = 0; i < methodNames.length; i++) {
-    obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
-  }
-  return obj;
-};
-
-/**
- * All parameters are pretty-printed and concatenated together, then written to the current spec's output.
- *
- * Be careful not to leave calls to <code>jasmine.log</code> in production code.
- */
-jasmine.log = function() {
-  var spec = jasmine.getEnv().currentSpec;
-  spec.log.apply(spec, arguments);
-};
-
-/**
- * Function that installs a spy on an existing object's method name.  Used within a Spec to create a spy.
- *
- * @example
- * // spy example
- * var foo = {
- *   not: function(bool) { return !bool; }
- * }
- * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops
- *
- * @see jasmine.createSpy
- * @param obj
- * @param methodName
- * @returns a Jasmine spy that can be chained with all spy methods
- */
-var spyOn = function(obj, methodName) {
-  return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
-};
-
-/**
- * Creates a Jasmine spec that will be added to the current suite.
- *
- * // TODO: pending tests
- *
- * @example
- * it('should be true', function() {
- *   expect(true).toEqual(true);
- * });
- *
- * @param {String} desc description of this specification
- * @param {Function} func defines the preconditions and expectations of the spec
- */
-var it = function(desc, func) {
-  return jasmine.getEnv().it(desc, func);
-};
-
-/**
- * Creates a <em>disabled</em> Jasmine spec.
- *
- * A convenience method that allows existing specs to be disabled temporarily during development.
- *
- * @param {String} desc description of this specification
- * @param {Function} func defines the preconditions and expectations of the spec
- */
-var xit = function(desc, func) {
-  return jasmine.getEnv().xit(desc, func);
-};
-
-/**
- * Starts a chain for a Jasmine expectation.
- *
- * It is passed an Object that is the actual value and should chain to one of the many
- * jasmine.Matchers functions.
- *
- * @param {Object} actual Actual value to test against and expected value
- */
-var expect = function(actual) {
-  return jasmine.getEnv().currentSpec.expect(actual);
-};
-
-/**
- * Defines part of a jasmine spec.  Used in cominbination with waits or waitsFor in asynchrnous specs.
- *
- * @param {Function} func Function that defines part of a jasmine spec.
- */
-var runs = function(func) {
-  jasmine.getEnv().currentSpec.runs(func);
-};
-
-/**
- * Waits a fixed time period before moving to the next block.
- *
- * @deprecated Use waitsFor() instead
- * @param {Number} timeout milliseconds to wait
- */
-var waits = function(timeout) {
-  jasmine.getEnv().currentSpec.waits(timeout);
-};
-
-/**
- * Waits for the latchFunction to return true before proceeding to the next block.
- *
- * @param {Function} latchFunction
- * @param {String} optional_timeoutMessage
- * @param {Number} optional_timeout
- */
-var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
-  jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
-};
-
-/**
- * A function that is called before each spec in a suite.
- *
- * Used for spec setup, including validating assumptions.
- *
- * @param {Function} beforeEachFunction
- */
-var beforeEach = function(beforeEachFunction) {
-  jasmine.getEnv().beforeEach(beforeEachFunction);
-};
-
-/**
- * A function that is called after each spec in a suite.
- *
- * Used for restoring any state that is hijacked during spec execution.
- *
- * @param {Function} afterEachFunction
- */
-var afterEach = function(afterEachFunction) {
-  jasmine.getEnv().afterEach(afterEachFunction);
-};
-
-/**
- * Defines a suite of specifications.
- *
- * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared
- * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization
- * of setup in some tests.
- *
- * @example
- * // TODO: a simple suite
- *
- * // TODO: a simple suite with a nested describe block
- *
- * @param {String} description A string, usually the class under test.
- * @param {Function} specDefinitions function that defines several specs.
- */
-var describe = function(description, specDefinitions) {
-  return jasmine.getEnv().describe(description, specDefinitions);
-};
-
-/**
- * Disables a suite of specifications.  Used to disable some suites in a file, or files, temporarily during development.
- *
- * @param {String} description A string, usually the class under test.
- * @param {Function} specDefinitions function that defines several specs.
- */
-var xdescribe = function(description, specDefinitions) {
-  return jasmine.getEnv().xdescribe(description, specDefinitions);
-};
-
-
-// Provide the XMLHttpRequest class for IE 5.x-6.x:
-jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
-  try {
-    return new ActiveXObject("Msxml2.XMLHTTP.6.0");
-  } catch(e) {
-  }
-  try {
-    return new ActiveXObject("Msxml2.XMLHTTP.3.0");
-  } catch(e) {
-  }
-  try {
-    return new ActiveXObject("Msxml2.XMLHTTP");
-  } catch(e) {
-  }
-  try {
-    return new ActiveXObject("Microsoft.XMLHTTP");
-  } catch(e) {
-  }
-  throw new Error("This browser does not support XMLHttpRequest.");
-} : XMLHttpRequest;
-/**
- * @namespace
- */
-jasmine.util = {};
-
-/**
- * Declare that a child class inherit it's prototype from the parent class.
- *
- * @private
- * @param {Function} childClass
- * @param {Function} parentClass
- */
-jasmine.util.inherit = function(childClass, parentClass) {
-  /**
-   * @private
-   */
-  var subclass = function() {
-  };
-  subclass.prototype = parentClass.prototype;
-  childClass.prototype = new subclass;
-};
-
-jasmine.util.formatException = function(e) {
-  var lineNumber;
-  if (e.line) {
-    lineNumber = e.line;
-  }
-  else if (e.lineNumber) {
-    lineNumber = e.lineNumber;
-  }
-
-  var file;
-
-  if (e.sourceURL) {
-    file = e.sourceURL;
-  }
-  else if (e.fileName) {
-    file = e.fileName;
-  }
-
-  var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString();
-
-  if (file && lineNumber) {
-    message += ' in ' + file + ' (line ' + lineNumber + ')';
-  }
-
-  return message;
-};
-
-jasmine.util.htmlEscape = function(str) {
-  if (!str) return str;
-  return str.replace(/&/g, '&amp;')
-    .replace(/</g, '&lt;')
-    .replace(/>/g, '&gt;');
-};
-
-jasmine.util.argsToArray = function(args) {
-  var arrayOfArgs = [];
-  for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]);
-  return arrayOfArgs;
-};
-
-jasmine.util.extend = function(destination, source) {
-  for (var property in source) destination[property] = source[property];
-  return destination;
-};
-
-/**
- * Environment for Jasmine
- *
- * @constructor
- */
-jasmine.Env = function() {
-  this.currentSpec = null;
-  this.currentSuite = null;
-  this.currentRunner_ = new jasmine.Runner(this);
-
-  this.reporter = new jasmine.MultiReporter();
-
-  this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;
-  this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;
-  this.lastUpdate = 0;
-  this.specFilter = function() {
-    return true;
-  };
-
-  this.nextSpecId_ = 0;
-  this.nextSuiteId_ = 0;
-  this.equalityTesters_ = [];
-
-  // wrap matchers
-  this.matchersClass = function() {
-    jasmine.Matchers.apply(this, arguments);
-  };
-  jasmine.util.inherit(this.matchersClass, jasmine.Matchers);
-
-  jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass);
-};
-
-
-jasmine.Env.prototype.setTimeout = jasmine.setTimeout;
-jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout;
-jasmine.Env.prototype.setInterval = jasmine.setInterval;
-jasmine.Env.prototype.clearInterval = jasmine.clearInterval;
-
-/**
- * @returns an object containing jasmine version build info, if set.
- */
-jasmine.Env.prototype.version = function () {
-  if (jasmine.version_) {
-    return jasmine.version_;
-  } else {
-    throw new Error('Version not set');
-  }
-};
-
-/**
- * @returns string containing jasmine version build info, if set.
- */
-jasmine.Env.prototype.versionString = function() {
-  if (jasmine.version_) {
-    var version = this.version();
-    return version.major + "." + version.minor + "." + version.build + " revision " + version.revision;
-  } else {
-    return "version unknown";
-  }
-};
-
-/**
- * @returns a sequential integer starting at 0
- */
-jasmine.Env.prototype.nextSpecId = function () {
-  return this.nextSpecId_++;
-};
-
-/**
- * @returns a sequential integer starting at 0
- */
-jasmine.Env.prototype.nextSuiteId = function () {
-  return this.nextSuiteId_++;
-};
-
-/**
- * Register a reporter to receive status updates from Jasmine.
- * @param {jasmine.Reporter} reporter An object which will receive status updates.
- */
-jasmine.Env.prototype.addReporter = function(reporter) {
-  this.reporter.addReporter(reporter);
-};
-
-jasmine.Env.prototype.execute = function() {
-  this.currentRunner_.execute();
-};
-
-jasmine.Env.prototype.describe = function(description, specDefinitions) {
-  var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite);
-
-  var parentSuite = this.currentSuite;
-  if (parentSuite) {
-    parentSuite.add(suite);
-  } else {
-    this.currentRunner_.add(suite);
-  }
-
-  this.currentSuite = suite;
-
-  var declarationError = null;
-  try {
-    specDefinitions.call(suite);
-  } catch(e) {
-    declarationError = e;
-  }
-
-  this.currentSuite = parentSuite;
-
-  if (declarationError) {
-    this.it("encountered a declaration exception", function() {
-      throw declarationError;
-    });
-  }
-
-  return suite;
-};
-
-jasmine.Env.prototype.beforeEach = function(beforeEachFunction) {
-  if (this.currentSuite) {
-    this.currentSuite.beforeEach(beforeEachFunction);
-  } else {
-    this.currentRunner_.beforeEach(beforeEachFunction);
-  }
-};
-
-jasmine.Env.prototype.currentRunner = function () {
-  return this.currentRunner_;
-};
-
-jasmine.Env.prototype.afterEach = function(afterEachFunction) {
-  if (this.currentSuite) {
-    this.currentSuite.afterEach(afterEachFunction);
-  } else {
-    this.currentRunner_.afterEach(afterEachFunction);
-  }
-
-};
-
-jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) {
-  return {
-    execute: function() {
-    }
-  };
-};
-
-jasmine.Env.prototype.it = function(description, func) {
-  var spec = new jasmine.Spec(this, this.currentSuite, description);
-  this.currentSuite.add(spec);
-  this.currentSpec = spec;
-
-  if (func) {
-    spec.runs(func);
-  }
-
-  return spec;
-};
-
-jasmine.Env.prototype.xit = function(desc, func) {
-  return {
-    id: this.nextSpecId(),
-    runs: function() {
-    }
-  };
-};
-
-jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {
-  if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {
-    return true;
-  }
-
-  a.__Jasmine_been_here_before__ = b;
-  b.__Jasmine_been_here_before__ = a;
-
-  var hasKey = function(obj, keyName) {
-    return obj != null && obj[keyName] !== jasmine.undefined;
-  };
-
-  for (var property in b) {
-    if (!hasKey(a, property) && hasKey(b, property)) {
-      mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
-    }
-  }
-  for (property in a) {
-    if (!hasKey(b, property) && hasKey(a, property)) {
-      mismatchKeys.push("expected missing key '" + property + "', but present in actual.");
-    }
-  }
-  for (property in b) {
-    if (property == '__Jasmine_been_here_before__') continue;
-    if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) {
-      mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual.");
-    }
-  }
-
-  if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) {
-    mismatchValues.push("arrays were not the same length");
-  }
-
-  delete a.__Jasmine_been_here_before__;
-  delete b.__Jasmine_been_here_before__;
-  return (mismatchKeys.length == 0 && mismatchValues.length == 0);
-};
-
-jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
-  mismatchKeys = mismatchKeys || [];
-  mismatchValues = mismatchValues || [];
-
-  for (var i = 0; i < this.equalityTesters_.length; i++) {
-    var equalityTester = this.equalityTesters_[i];
-    var result = equalityTester(a, b, this, mismatchKeys, mismatchValues);
-    if (result !== jasmine.undefined) return result;
-  }
-
-  if (a === b) return true;
-
-  if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) {
-    return (a == jasmine.undefined && b == jasmine.undefined);
-  }
-
-  if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) {
-    return a === b;
-  }
-
-  if (a instanceof Date && b instanceof Date) {
-    return a.getTime() == b.getTime();
-  }
-
-  if (a instanceof jasmine.Matchers.Any) {
-    return a.matches(b);
-  }
-
-  if (b instanceof jasmine.Matchers.Any) {
-    return b.matches(a);
-  }
-
-  if (jasmine.isString_(a) && jasmine.isString_(b)) {
-    return (a == b);
-  }
-
-  if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) {
-    return (a == b);
-  }
-
-  if (typeof a === "object" && typeof b === "object") {
-    return this.compareObjects_(a, b, mismatchKeys, mismatchValues);
-  }
-
-  //Straight check
-  return (a === b);
-};
-
-jasmine.Env.prototype.contains_ = function(haystack, needle) {
-  if (jasmine.isArray_(haystack)) {
-    for (var i = 0; i < haystack.length; i++) {
-      if (this.equals_(haystack[i], needle)) return true;
-    }
-    return false;
-  }
-  return haystack.indexOf(needle) >= 0;
-};
-
-jasmine.Env.prototype.addEqualityTester = function(equalityTester) {
-  this.equalityTesters_.push(equalityTester);
-};
-/** No-op base class for Jasmine reporters.
- *
- * @constructor
- */
-jasmine.Reporter = function() {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportRunnerStarting = function(runner) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportRunnerResults = function(runner) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSuiteResults = function(suite) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSpecStarting = function(spec) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSpecResults = function(spec) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.log = function(str) {
-};
-
-/**
- * Blocks are functions with executable code that make up a spec.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {Function} func
- * @param {jasmine.Spec} spec
- */
-jasmine.Block = function(env, func, spec) {
-  this.env = env;
-  this.func = func;
-  this.spec = spec;
-};
-
-jasmine.Block.prototype.execute = function(onComplete) {  
-  try {
-    this.func.apply(this.spec);
-  } catch (e) {
-    this.spec.fail(e);
-  }
-  onComplete();
-};
-/** JavaScript API reporter.
- *
- * @constructor
- */
-jasmine.JsApiReporter = function() {
-  this.started = false;
-  this.finished = false;
-  this.suites_ = [];
-  this.results_ = {};
-};
-
-jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) {
-  this.started = true;
-  var suites = runner.topLevelSuites();
-  for (var i = 0; i < suites.length; i++) {
-    var suite = suites[i];
-    this.suites_.push(this.summarize_(suite));
-  }
-};
-
-jasmine.JsApiReporter.prototype.suites = function() {
-  return this.suites_;
-};
-
-jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) {
-  var isSuite = suiteOrSpec instanceof jasmine.Suite;
-  var summary = {
-    id: suiteOrSpec.id,
-    name: suiteOrSpec.description,
-    type: isSuite ? 'suite' : 'spec',
-    children: []
-  };
-  
-  if (isSuite) {
-    var children = suiteOrSpec.children();
-    for (var i = 0; i < children.length; i++) {
-      summary.children.push(this.summarize_(children[i]));
-    }
-  }
-  return summary;
-};
-
-jasmine.JsApiReporter.prototype.results = function() {
-  return this.results_;
-};
-
-jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) {
-  return this.results_[specId];
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) {
-  this.finished = true;
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) {
-  this.results_[spec.id] = {
-    messages: spec.results().getItems(),
-    result: spec.results().failedCount > 0 ? "failed" : "passed"
-  };
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.log = function(str) {
-};
-
-jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){
-  var results = {};
-  for (var i = 0; i < specIds.length; i++) {
-    var specId = specIds[i];
-    results[specId] = this.summarizeResult_(this.results_[specId]);
-  }
-  return results;
-};
-
-jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){
-  var summaryMessages = [];
-  var messagesLength = result.messages.length;
-  for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {
-    var resultMessage = result.messages[messageIndex];
-    summaryMessages.push({
-      text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined,
-      passed: resultMessage.passed ? resultMessage.passed() : true,
-      type: resultMessage.type,
-      message: resultMessage.message,
-      trace: {
-        stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined
-      }
-    });
-  }
-
-  return {
-    result : result.result,
-    messages : summaryMessages
-  };
-};
-
-/**
- * @constructor
- * @param {jasmine.Env} env
- * @param actual
- * @param {jasmine.Spec} spec
- */
-jasmine.Matchers = function(env, actual, spec, opt_isNot) {
-  this.env = env;
-  this.actual = actual;
-  this.spec = spec;
-  this.isNot = opt_isNot || false;
-  this.reportWasCalled_ = false;
-};
-
-// todo: @deprecated as of Jasmine 0.11, remove soon [xw]
-jasmine.Matchers.pp = function(str) {
-  throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!");
-};
-
-// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw]
-jasmine.Matchers.prototype.report = function(result, failing_message, details) {
-  throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs");
-};
-
-jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) {
-  for (var methodName in prototype) {
-    if (methodName == 'report') continue;
-    var orig = prototype[methodName];
-    matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig);
-  }
-};
-
-jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
-  return function() {
-    var matcherArgs = jasmine.util.argsToArray(arguments);
-    var result = matcherFunction.apply(this, arguments);
-
-    if (this.isNot) {
-      result = !result;
-    }
-
-    if (this.reportWasCalled_) return result;
-
-    var message;
-    if (!result) {
-      if (this.message) {
-        message = this.message.apply(this, arguments);
-        if (jasmine.isArray_(message)) {
-          message = message[this.isNot ? 1 : 0];
-        }
-      } else {
-        var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });
-        message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate;
-        if (matcherArgs.length > 0) {
-          for (var i = 0; i < matcherArgs.length; i++) {
-            if (i > 0) message += ",";
-            message += " " + jasmine.pp(matcherArgs[i]);
-          }
-        }
-        message += ".";
-      }
-    }
-    var expectationResult = new jasmine.ExpectationResult({
-      matcherName: matcherName,
-      passed: result,
-      expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0],
-      actual: this.actual,
-      message: message
-    });
-    this.spec.addMatcherResult(expectationResult);
-    return jasmine.undefined;
-  };
-};
-
-
-
-
-/**
- * toBe: compares the actual to the expected using ===
- * @param expected
- */
-jasmine.Matchers.prototype.toBe = function(expected) {
-  return this.actual === expected;
-};
-
-/**
- * toNotBe: compares the actual to the expected using !==
- * @param expected
- * @deprecated as of 1.0. Use not.toBe() instead.
- */
-jasmine.Matchers.prototype.toNotBe = function(expected) {
-  return this.actual !== expected;
-};
-
-/**
- * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc.
- *
- * @param expected
- */
-jasmine.Matchers.prototype.toEqual = function(expected) {
-  return this.env.equals_(this.actual, expected);
-};
-
-/**
- * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
- * @param expected
- * @deprecated as of 1.0. Use not.toNotEqual() instead.
- */
-jasmine.Matchers.prototype.toNotEqual = function(expected) {
-  return !this.env.equals_(this.actual, expected);
-};
-
-/**
- * Matcher that compares the actual to the expected using a regular expression.  Constructs a RegExp, so takes
- * a pattern or a String.
- *
- * @param expected
- */
-jasmine.Matchers.prototype.toMatch = function(expected) {
-  return new RegExp(expected).test(this.actual);
-};
-
-/**
- * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch
- * @param expected
- * @deprecated as of 1.0. Use not.toMatch() instead.
- */
-jasmine.Matchers.prototype.toNotMatch = function(expected) {
-  return !(new RegExp(expected).test(this.actual));
-};
-
-/**
- * Matcher that compares the actual to jasmine.undefined.
- */
-jasmine.Matchers.prototype.toBeDefined = function() {
-  return (this.actual !== jasmine.undefined);
-};
-
-/**
- * Matcher that compares the actual to jasmine.undefined.
- */
-jasmine.Matchers.prototype.toBeUndefined = function() {
-  return (this.actual === jasmine.undefined);
-};
-
-/**
- * Matcher that compares the actual to null.
- */
-jasmine.Matchers.prototype.toBeNull = function() {
-  return (this.actual === null);
-};
-
-/**
- * Matcher that boolean not-nots the actual.
- */
-jasmine.Matchers.prototype.toBeTruthy = function() {
-  return !!this.actual;
-};
-
-
-/**
- * Matcher that boolean nots the actual.
- */
-jasmine.Matchers.prototype.toBeFalsy = function() {
-  return !this.actual;
-};
-
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was called.
- */
-jasmine.Matchers.prototype.toHaveBeenCalled = function() {
-  if (arguments.length > 0) {
-    throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith');
-  }
-
-  if (!jasmine.isSpy(this.actual)) {
-    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
-  }
-
-  this.message = function() {
-    return [
-      "Expected spy " + this.actual.identity + " to have been called.",
-      "Expected spy " + this.actual.identity + " not to have been called."
-    ];
-  };
-
-  return this.actual.wasCalled;
-};
-
-/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
-jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was not called.
- *
- * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead
- */
-jasmine.Matchers.prototype.wasNotCalled = function() {
-  if (arguments.length > 0) {
-    throw new Error('wasNotCalled does not take arguments');
-  }
-
-  if (!jasmine.isSpy(this.actual)) {
-    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
-  }
-
-  this.message = function() {
-    return [
-      "Expected spy " + this.actual.identity + " to not have been called.",
-      "Expected spy " + this.actual.identity + " to have been called."
-    ];
-  };
-
-  return !this.actual.wasCalled;
-};
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.
- *
- * @example
- *
- */
-jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
-  var expectedArgs = jasmine.util.argsToArray(arguments);
-  if (!jasmine.isSpy(this.actual)) {
-    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
-  }
-  this.message = function() {
-    if (this.actual.callCount == 0) {
-      // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
-      return [
-        "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
-        "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
-      ];
-    } else {
-      return [
-        "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
-        "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
-      ];
-    }
-  };
-
-  return this.env.contains_(this.actual.argsForCall, expectedArgs);
-};
-
-/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
-jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;
-
-/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */
-jasmine.Matchers.prototype.wasNotCalledWith = function() {
-  var expectedArgs = jasmine.util.argsToArray(arguments);
-  if (!jasmine.isSpy(this.actual)) {
-    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
-  }
-
-  this.message = function() {
-    return [
-      "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
-      "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
-    ]
-  };
-
-  return !this.env.contains_(this.actual.argsForCall, expectedArgs);
-};
-
-/**
- * Matcher that checks that the expected item is an element in the actual Array.
- *
- * @param {Object} expected
- */
-jasmine.Matchers.prototype.toContain = function(expected) {
-  return this.env.contains_(this.actual, expected);
-};
-
-/**
- * Matcher that checks that the expected item is NOT an element in the actual Array.
- *
- * @param {Object} expected
- * @deprecated as of 1.0. Use not.toNotContain() instead.
- */
-jasmine.Matchers.prototype.toNotContain = function(expected) {
-  return !this.env.contains_(this.actual, expected);
-};
-
-jasmine.Matchers.prototype.toBeLessThan = function(expected) {
-  return this.actual < expected;
-};
-
-jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
-  return this.actual > expected;
-};
-
-/**
- * Matcher that checks that the expected exception was thrown by the actual.
- *
- * @param {String} expected
- */
-jasmine.Matchers.prototype.toThrow = function(expected) {
-  var result = false;
-  var exception;
-  if (typeof this.actual != 'function') {
-    throw new Error('Actual is not a function');
-  }
-  try {
-    this.actual();
-  } catch (e) {
-    exception = e;
-  }
-  if (exception) {
-    result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
-  }
-
-  var not = this.isNot ? "not " : "";
-
-  this.message = function() {
-    if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
-      return ["Expected function " + not + "to throw", expected ? expected.message || expected : " an exception", ", but it threw", exception.message || exception].join(' ');
-    } else {
-      return "Expected function to throw an exception.";
-    }
-  };
-
-  return result;
-};
-
-jasmine.Matchers.Any = function(expectedClass) {
-  this.expectedClass = expectedClass;
-};
-
-jasmine.Matchers.Any.prototype.matches = function(other) {
-  if (this.expectedClass == String) {
-    return typeof other == 'string' || other instanceof String;
-  }
-
-  if (this.expectedClass == Number) {
-    return typeof other == 'number' || other instanceof Number;
-  }
-
-  if (this.expectedClass == Function) {
-    return typeof other == 'function' || other instanceof Function;
-  }
-
-  if (this.expectedClass == Object) {
-    return typeof other == 'object';
-  }
-
-  return other instanceof this.expectedClass;
-};
-
-jasmine.Matchers.Any.prototype.toString = function() {
-  return '<jasmine.any(' + this.expectedClass + ')>';
-};
-
-/**
- * @constructor
- */
-jasmine.MultiReporter = function() {
-  this.subReporters_ = [];
-};
-jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter);
-
-jasmine.MultiReporter.prototype.addReporter = function(reporter) {
-  this.subReporters_.push(reporter);
-};
-
-(function() {
-  var functionNames = [
-    "reportRunnerStarting",
-    "reportRunnerResults",
-    "reportSuiteResults",
-    "reportSpecStarting",
-    "reportSpecResults",
-    "log"
-  ];
-  for (var i = 0; i < functionNames.length; i++) {
-    var functionName = functionNames[i];
-    jasmine.MultiReporter.prototype[functionName] = (function(functionName) {
-      return function() {
-        for (var j = 0; j < this.subReporters_.length; j++) {
-          var subReporter = this.subReporters_[j];
-          if (subReporter[functionName]) {
-            subReporter[functionName].apply(subReporter, arguments);
-          }
-        }
-      };
-    })(functionName);
-  }
-})();
-/**
- * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults
- *
- * @constructor
- */
-jasmine.NestedResults = function() {
-  /**
-   * The total count of results
-   */
-  this.totalCount = 0;
-  /**
-   * Number of passed results
-   */
-  this.passedCount = 0;
-  /**
-   * Number of failed results
-   */
-  this.failedCount = 0;
-  /**
-   * Was this suite/spec skipped?
-   */
-  this.skipped = false;
-  /**
-   * @ignore
-   */
-  this.items_ = [];
-};
-
-/**
- * Roll up the result counts.
- *
- * @param result
- */
-jasmine.NestedResults.prototype.rollupCounts = function(result) {
-  this.totalCount += result.totalCount;
-  this.passedCount += result.passedCount;
-  this.failedCount += result.failedCount;
-};
-
-/**
- * Adds a log message.
- * @param values Array of message parts which will be concatenated later.
- */
-jasmine.NestedResults.prototype.log = function(values) {
-  this.items_.push(new jasmine.MessageResult(values));
-};
-
-/**
- * Getter for the results: message & results.
- */
-jasmine.NestedResults.prototype.getItems = function() {
-  return this.items_;
-};
-
-/**
- * Adds a result, tracking counts (total, passed, & failed)
- * @param {jasmine.ExpectationResult|jasmine.NestedResults} result
- */
-jasmine.NestedResults.prototype.addResult = function(result) {
-  if (result.type != 'log') {
-    if (result.items_) {
-      this.rollupCounts(result);
-    } else {
-      this.totalCount++;
-      if (result.passed()) {
-        this.passedCount++;
-      } else {
-        this.failedCount++;
-      }
-    }
-  }
-  this.items_.push(result);
-};
-
-/**
- * @returns {Boolean} True if <b>everything</b> below passed
- */
-jasmine.NestedResults.prototype.passed = function() {
-  return this.passedCount === this.totalCount;
-};
-/**
- * Base class for pretty printing for expectation results.
- */
-jasmine.PrettyPrinter = function() {
-  this.ppNestLevel_ = 0;
-};
-
-/**
- * Formats a value in a nice, human-readable string.
- *
- * @param value
- */
-jasmine.PrettyPrinter.prototype.format = function(value) {
-  if (this.ppNestLevel_ > 40) {
-    throw new Error('jasmine.PrettyPrinter: format() nested too deeply!');
-  }
-
-  this.ppNestLevel_++;
-  try {
-    if (value === jasmine.undefined) {
-      this.emitScalar('undefined');
-    } else if (value === null) {
-      this.emitScalar('null');
-    } else if (value === jasmine.getGlobal()) {
-      this.emitScalar('<global>');
-    } else if (value instanceof jasmine.Matchers.Any) {
-      this.emitScalar(value.toString());
-    } else if (typeof value === 'string') {
-      this.emitString(value);
-    } else if (jasmine.isSpy(value)) {
-      this.emitScalar("spy on " + value.identity);
-    } else if (value instanceof RegExp) {
-      this.emitScalar(value.toString());
-    } else if (typeof value === 'function') {
-      this.emitScalar('Function');
-    } else if (typeof value.nodeType === 'number') {
-      this.emitScalar('HTMLNode');
-    } else if (value instanceof Date) {
-      this.emitScalar('Date(' + value + ')');
-    } else if (value.__Jasmine_been_here_before__) {
-      this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>');
-    } else if (jasmine.isArray_(value) || typeof value == 'object') {
-      value.__Jasmine_been_here_before__ = true;
-      if (jasmine.isArray_(value)) {
-        this.emitArray(value);
-      } else {
-        this.emitObject(value);
-      }
-      delete value.__Jasmine_been_here_before__;
-    } else {
-      this.emitScalar(value.toString());
-    }
-  } finally {
-    this.ppNestLevel_--;
-  }
-};
-
-jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
-  for (var property in obj) {
-    if (property == '__Jasmine_been_here_before__') continue;
-    fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) != null) : false);
-  }
-};
-
-jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_;
-
-jasmine.StringPrettyPrinter = function() {
-  jasmine.PrettyPrinter.call(this);
-
-  this.string = '';
-};
-jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter);
-
-jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) {
-  this.append(value);
-};
-
-jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
-  this.append("'" + value + "'");
-};
-
-jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
-  this.append('[ ');
-  for (var i = 0; i < array.length; i++) {
-    if (i > 0) {
-      this.append(', ');
-    }
-    this.format(array[i]);
-  }
-  this.append(' ]');
-};
-
-jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {
-  var self = this;
-  this.append('{ ');
-  var first = true;
-
-  this.iterateObject(obj, function(property, isGetter) {
-    if (first) {
-      first = false;
-    } else {
-      self.append(', ');
-    }
-
-    self.append(property);
-    self.append(' : ');
-    if (isGetter) {
-      self.append('<getter>');
-    } else {
-      self.format(obj[property]);
-    }
-  });
-
-  this.append(' }');
-};
-
-jasmine.StringPrettyPrinter.prototype.append = function(value) {
-  this.string += value;
-};
-jasmine.Queue = function(env) {
-  this.env = env;
-  this.blocks = [];
-  this.running = false;
-  this.index = 0;
-  this.offset = 0;
-  this.abort = false;
-};
-
-jasmine.Queue.prototype.addBefore = function(block) {
-  this.blocks.unshift(block);
-};
-
-jasmine.Queue.prototype.add = function(block) {
-  this.blocks.push(block);
-};
-
-jasmine.Queue.prototype.insertNext = function(block) {
-  this.blocks.splice((this.index + this.offset + 1), 0, block);
-  this.offset++;
-};
-
-jasmine.Queue.prototype.start = function(onComplete) {
-  this.running = true;
-  this.onComplete = onComplete;
-  this.next_();
-};
-
-jasmine.Queue.prototype.isRunning = function() {
-  return this.running;
-};
-
-jasmine.Queue.LOOP_DONT_RECURSE = true;
-
-jasmine.Queue.prototype.next_ = function() {
-  var self = this;
-  var goAgain = true;
-
-  while (goAgain) {
-    goAgain = false;
-    
-    if (self.index < self.blocks.length && !this.abort) {
-      var calledSynchronously = true;
-      var completedSynchronously = false;
-
-      var onComplete = function () {
-        if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) {
-          completedSynchronously = true;
-          return;
-        }
-
-        if (self.blocks[self.index].abort) {
-          self.abort = true;
-        }
-
-        self.offset = 0;
-        self.index++;
-
-        var now = new Date().getTime();
-        if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) {
-          self.env.lastUpdate = now;
-          self.env.setTimeout(function() {
-            self.next_();
-          }, 0);
-        } else {
-          if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) {
-            goAgain = true;
-          } else {
-            self.next_();
-          }
-        }
-      };
-      self.blocks[self.index].execute(onComplete);
-
-      calledSynchronously = false;
-      if (completedSynchronously) {
-        onComplete();
-      }
-      
-    } else {
-      self.running = false;
-      if (self.onComplete) {
-        self.onComplete();
-      }
-    }
-  }
-};
-
-jasmine.Queue.prototype.results = function() {
-  var results = new jasmine.NestedResults();
-  for (var i = 0; i < this.blocks.length; i++) {
-    if (this.blocks[i].results) {
-      results.addResult(this.blocks[i].results());
-    }
-  }
-  return results;
-};
-
-
-/**
- * Runner
- *
- * @constructor
- * @param {jasmine.Env} env
- */
-jasmine.Runner = function(env) {
-  var self = this;
-  self.env = env;
-  self.queue = new jasmine.Queue(env);
-  self.before_ = [];
-  self.after_ = [];
-  self.suites_ = [];
-};
-
-jasmine.Runner.prototype.execute = function() {
-  var self = this;
-  if (self.env.reporter.reportRunnerStarting) {
-    self.env.reporter.reportRunnerStarting(this);
-  }
-  self.queue.start(function () {
-    self.finishCallback();
-  });
-};
-
-jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
-  beforeEachFunction.typeName = 'beforeEach';
-  this.before_.splice(0,0,beforeEachFunction);
-};
-
-jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
-  afterEachFunction.typeName = 'afterEach';
-  this.after_.splice(0,0,afterEachFunction);
-};
-
-
-jasmine.Runner.prototype.finishCallback = function() {
-  this.env.reporter.reportRunnerResults(this);
-};
-
-jasmine.Runner.prototype.addSuite = function(suite) {
-  this.suites_.push(suite);
-};
-
-jasmine.Runner.prototype.add = function(block) {
-  if (block instanceof jasmine.Suite) {
-    this.addSuite(block);
-  }
-  this.queue.add(block);
-};
-
-jasmine.Runner.prototype.specs = function () {
-  var suites = this.suites();
-  var specs = [];
-  for (var i = 0; i < suites.length; i++) {
-    specs = specs.concat(suites[i].specs());
-  }
-  return specs;
-};
-
-jasmine.Runner.prototype.suites = function() {
-  return this.suites_;
-};
-
-jasmine.Runner.prototype.topLevelSuites = function() {
-  var topLevelSuites = [];
-  for (var i = 0; i < this.suites_.length; i++) {
-    if (!this.suites_[i].parentSuite) {
-      topLevelSuites.push(this.suites_[i]);
-    }
-  }
-  return topLevelSuites;
-};
-
-jasmine.Runner.prototype.results = function() {
-  return this.queue.results();
-};
-/**
- * Internal representation of a Jasmine specification, or test.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {jasmine.Suite} suite
- * @param {String} description
- */
-jasmine.Spec = function(env, suite, description) {
-  if (!env) {
-    throw new Error('jasmine.Env() required');
-  }
-  if (!suite) {
-    throw new Error('jasmine.Suite() required');
-  }
-  var spec = this;
-  spec.id = env.nextSpecId ? env.nextSpecId() : null;
-  spec.env = env;
-  spec.suite = suite;
-  spec.description = description;
-  spec.queue = new jasmine.Queue(env);
-
-  spec.afterCallbacks = [];
-  spec.spies_ = [];
-
-  spec.results_ = new jasmine.NestedResults();
-  spec.results_.description = description;
-  spec.matchersClass = null;
-};
-
-jasmine.Spec.prototype.getFullName = function() {
-  return this.suite.getFullName() + ' ' + this.description + '.';
-};
-
-
-jasmine.Spec.prototype.results = function() {
-  return this.results_;
-};
-
-/**
- * All parameters are pretty-printed and concatenated together, then written to the spec's output.
- *
- * Be careful not to leave calls to <code>jasmine.log</code> in production code.
- */
-jasmine.Spec.prototype.log = function() {
-  return this.results_.log(arguments);
-};
-
-jasmine.Spec.prototype.runs = function (func) {
-  var block = new jasmine.Block(this.env, func, this);
-  this.addToQueue(block);
-  return this;
-};
-
-jasmine.Spec.prototype.addToQueue = function (block) {
-  if (this.queue.isRunning()) {
-    this.queue.insertNext(block);
-  } else {
-    this.queue.add(block);
-  }
-};
-
-/**
- * @param {jasmine.ExpectationResult} result
- */
-jasmine.Spec.prototype.addMatcherResult = function(result) {
-  this.results_.addResult(result);
-};
-
-jasmine.Spec.prototype.expect = function(actual) {
-  var positive = new (this.getMatchersClass_())(this.env, actual, this);
-  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
-  return positive;
-};
-
-/**
- * Waits a fixed time period before moving to the next block.
- *
- * @deprecated Use waitsFor() instead
- * @param {Number} timeout milliseconds to wait
- */
-jasmine.Spec.prototype.waits = function(timeout) {
-  var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);
-  this.addToQueue(waitsFunc);
-  return this;
-};
-
-/**
- * Waits for the latchFunction to return true before proceeding to the next block.
- *
- * @param {Function} latchFunction
- * @param {String} optional_timeoutMessage
- * @param {Number} optional_timeout
- */
-jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
-  var latchFunction_ = null;
-  var optional_timeoutMessage_ = null;
-  var optional_timeout_ = null;
-
-  for (var i = 0; i < arguments.length; i++) {
-    var arg = arguments[i];
-    switch (typeof arg) {
-      case 'function':
-        latchFunction_ = arg;
-        break;
-      case 'string':
-        optional_timeoutMessage_ = arg;
-        break;
-      case 'number':
-        optional_timeout_ = arg;
-        break;
-    }
-  }
-
-  var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);
-  this.addToQueue(waitsForFunc);
-  return this;
-};
-
-jasmine.Spec.prototype.fail = function (e) {
-  var expectationResult = new jasmine.ExpectationResult({
-    passed: false,
-    message: e ? jasmine.util.formatException(e) : 'Exception'
-  });
-  this.results_.addResult(expectationResult);
-};
-
-jasmine.Spec.prototype.getMatchersClass_ = function() {
-  return this.matchersClass || this.env.matchersClass;
-};
-
-jasmine.Spec.prototype.addMatchers = function(matchersPrototype) {
-  var parent = this.getMatchersClass_();
-  var newMatchersClass = function() {
-    parent.apply(this, arguments);
-  };
-  jasmine.util.inherit(newMatchersClass, parent);
-  jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass);
-  this.matchersClass = newMatchersClass;
-};
-
-jasmine.Spec.prototype.finishCallback = function() {
-  this.env.reporter.reportSpecResults(this);
-};
-
-jasmine.Spec.prototype.finish = function(onComplete) {
-  this.removeAllSpies();
-  this.finishCallback();
-  if (onComplete) {
-    onComplete();
-  }
-};
-
-jasmine.Spec.prototype.after = function(doAfter) {
-  if (this.queue.isRunning()) {
-    this.queue.add(new jasmine.Block(this.env, doAfter, this));
-  } else {
-    this.afterCallbacks.unshift(doAfter);
-  }
-};
-
-jasmine.Spec.prototype.execute = function(onComplete) {
-  var spec = this;
-  if (!spec.env.specFilter(spec)) {
-    spec.results_.skipped = true;
-    spec.finish(onComplete);
-    return;
-  }
-
-  this.env.reporter.reportSpecStarting(this);
-
-  spec.env.currentSpec = spec;
-
-  spec.addBeforesAndAftersToQueue();
-
-  spec.queue.start(function () {
-    spec.finish(onComplete);
-  });
-};
-
-jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
-  var runner = this.env.currentRunner();
-  var i;
-
-  for (var suite = this.suite; suite; suite = suite.parentSuite) {
-    for (i = 0; i < suite.before_.length; i++) {
-      this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this));
-    }
-  }
-  for (i = 0; i < runner.before_.length; i++) {
-    this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));
-  }
-  for (i = 0; i < this.afterCallbacks.length; i++) {
-    this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this));
-  }
-  for (suite = this.suite; suite; suite = suite.parentSuite) {
-    for (i = 0; i < suite.after_.length; i++) {
-      this.queue.add(new jasmine.Block(this.env, suite.after_[i], this));
-    }
-  }
-  for (i = 0; i < runner.after_.length; i++) {
-    this.queue.add(new jasmine.Block(this.env, runner.after_[i], this));
-  }
-};
-
-jasmine.Spec.prototype.explodes = function() {
-  throw 'explodes function should not have been called';
-};
-
-jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) {
-  if (obj == jasmine.undefined) {
-    throw "spyOn could not find an object to spy upon for " + methodName + "()";
-  }
-
-  if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) {
-    throw methodName + '() method does not exist';
-  }
-
-  if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) {
-    throw new Error(methodName + ' has already been spied upon');
-  }
-
-  var spyObj = jasmine.createSpy(methodName);
-
-  this.spies_.push(spyObj);
-  spyObj.baseObj = obj;
-  spyObj.methodName = methodName;
-  spyObj.originalValue = obj[methodName];
-
-  obj[methodName] = spyObj;
-
-  return spyObj;
-};
-
-jasmine.Spec.prototype.removeAllSpies = function() {
-  for (var i = 0; i < this.spies_.length; i++) {
-    var spy = this.spies_[i];
-    spy.baseObj[spy.methodName] = spy.originalValue;
-  }
-  this.spies_ = [];
-};
-
-/**
- * Internal representation of a Jasmine suite.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {String} description
- * @param {Function} specDefinitions
- * @param {jasmine.Suite} parentSuite
- */
-jasmine.Suite = function(env, description, specDefinitions, parentSuite) {
-  var self = this;
-  self.id = env.nextSuiteId ? env.nextSuiteId() : null;
-  self.description = description;
-  self.queue = new jasmine.Queue(env);
-  self.parentSuite = parentSuite;
-  self.env = env;
-  self.before_ = [];
-  self.after_ = [];
-  self.children_ = [];
-  self.suites_ = [];
-  self.specs_ = [];
-};
-
-jasmine.Suite.prototype.getFullName = function() {
-  var fullName = this.description;
-  for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) {
-    fullName = parentSuite.description + ' ' + fullName;
-  }
-  return fullName;
-};
-
-jasmine.Suite.prototype.finish = function(onComplete) {
-  this.env.reporter.reportSuiteResults(this);
-  this.finished = true;
-  if (typeof(onComplete) == 'function') {
-    onComplete();
-  }
-};
-
-jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
-  beforeEachFunction.typeName = 'beforeEach';
-  this.before_.unshift(beforeEachFunction);
-};
-
-jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
-  afterEachFunction.typeName = 'afterEach';
-  this.after_.unshift(afterEachFunction);
-};
-
-jasmine.Suite.prototype.results = function() {
-  return this.queue.results();
-};
-
-jasmine.Suite.prototype.add = function(suiteOrSpec) {
-  this.children_.push(suiteOrSpec);
-  if (suiteOrSpec instanceof jasmine.Suite) {
-    this.suites_.push(suiteOrSpec);
-    this.env.currentRunner().addSuite(suiteOrSpec);
-  } else {
-    this.specs_.push(suiteOrSpec);
-  }
-  this.queue.add(suiteOrSpec);
-};
-
-jasmine.Suite.prototype.specs = function() {
-  return this.specs_;
-};
-
-jasmine.Suite.prototype.suites = function() {
-  return this.suites_;
-};
-
-jasmine.Suite.prototype.children = function() {
-  return this.children_;
-};
-
-jasmine.Suite.prototype.execute = function(onComplete) {
-  var self = this;
-  this.queue.start(function () {
-    self.finish(onComplete);
-  });
-};
-jasmine.WaitsBlock = function(env, timeout, spec) {
-  this.timeout = timeout;
-  jasmine.Block.call(this, env, null, spec);
-};
-
-jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);
-
-jasmine.WaitsBlock.prototype.execute = function (onComplete) {
-  this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');
-  this.env.setTimeout(function () {
-    onComplete();
-  }, this.timeout);
-};
-/**
- * A block which waits for some condition to become true, with timeout.
- *
- * @constructor
- * @extends jasmine.Block
- * @param {jasmine.Env} env The Jasmine environment.
- * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.
- * @param {Function} latchFunction A function which returns true when the desired condition has been met.
- * @param {String} message The message to display if the desired condition hasn't been met within the given time period.
- * @param {jasmine.Spec} spec The Jasmine spec.
- */
-jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {
-  this.timeout = timeout || env.defaultTimeoutInterval;
-  this.latchFunction = latchFunction;
-  this.message = message;
-  this.totalTimeSpentWaitingForLatch = 0;
-  jasmine.Block.call(this, env, null, spec);
-};
-jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
-
-jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
-
-jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
-  this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
-  var latchFunctionResult;
-  try {
-    latchFunctionResult = this.latchFunction.apply(this.spec);
-  } catch (e) {
-    this.spec.fail(e);
-    onComplete();
-    return;
-  }
-
-  if (latchFunctionResult) {
-    onComplete();
-  } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {
-    var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');
-    this.spec.fail({
-      name: 'timeout',
-      message: message
-    });
-
-    this.abort = true;
-    onComplete();
-  } else {
-    this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
-    var self = this;
-    this.env.setTimeout(function() {
-      self.execute(onComplete);
-    }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
-  }
-};
-// Mock setTimeout, clearTimeout
-// Contributed by Pivotal Computer Systems, www.pivotalsf.com
-
-jasmine.FakeTimer = function() {
-  this.reset();
-
-  var self = this;
-  self.setTimeout = function(funcToCall, millis) {
-    self.timeoutsMade++;
-    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
-    return self.timeoutsMade;
-  };
-
-  self.setInterval = function(funcToCall, millis) {
-    self.timeoutsMade++;
-    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
-    return self.timeoutsMade;
-  };
-
-  self.clearTimeout = function(timeoutKey) {
-    self.scheduledFunctions[timeoutKey] = jasmine.undefined;
-  };
-
-  self.clearInterval = function(timeoutKey) {
-    self.scheduledFunctions[timeoutKey] = jasmine.undefined;
-  };
-
-};
-
-jasmine.FakeTimer.prototype.reset = function() {
-  this.timeoutsMade = 0;
-  this.scheduledFunctions = {};
-  this.nowMillis = 0;
-};
-
-jasmine.FakeTimer.prototype.tick = function(millis) {
-  var oldMillis = this.nowMillis;
-  var newMillis = oldMillis + millis;
-  this.runFunctionsWithinRange(oldMillis, newMillis);
-  this.nowMillis = newMillis;
-};
-
-jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
-  var scheduledFunc;
-  var funcsToRun = [];
-  for (var timeoutKey in this.scheduledFunctions) {
-    scheduledFunc = this.scheduledFunctions[timeoutKey];
-    if (scheduledFunc != jasmine.undefined &&
-        scheduledFunc.runAtMillis >= oldMillis &&
-        scheduledFunc.runAtMillis <= nowMillis) {
-      funcsToRun.push(scheduledFunc);
-      this.scheduledFunctions[timeoutKey] = jasmine.undefined;
-    }
-  }
-
-  if (funcsToRun.length > 0) {
-    funcsToRun.sort(function(a, b) {
-      return a.runAtMillis - b.runAtMillis;
-    });
-    for (var i = 0; i < funcsToRun.length; ++i) {
-      try {
-        var funcToRun = funcsToRun[i];
-        this.nowMillis = funcToRun.runAtMillis;
-        funcToRun.funcToCall();
-        if (funcToRun.recurring) {
-          this.scheduleFunction(funcToRun.timeoutKey,
-              funcToRun.funcToCall,
-              funcToRun.millis,
-              true);
-        }
-      } catch(e) {
-      }
-    }
-    this.runFunctionsWithinRange(oldMillis, nowMillis);
-  }
-};
-
-jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
-  this.scheduledFunctions[timeoutKey] = {
-    runAtMillis: this.nowMillis + millis,
-    funcToCall: funcToCall,
-    recurring: recurring,
-    timeoutKey: timeoutKey,
-    millis: millis
-  };
-};
-
-/**
- * @namespace
- */
-jasmine.Clock = {
-  defaultFakeTimer: new jasmine.FakeTimer(),
-
-  reset: function() {
-    jasmine.Clock.assertInstalled();
-    jasmine.Clock.defaultFakeTimer.reset();
-  },
-
-  tick: function(millis) {
-    jasmine.Clock.assertInstalled();
-    jasmine.Clock.defaultFakeTimer.tick(millis);
-  },
-
-  runFunctionsWithinRange: function(oldMillis, nowMillis) {
-    jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
-  },
-
-  scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
-    jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
-  },
-
-  useMock: function() {
-    if (!jasmine.Clock.isInstalled()) {
-      var spec = jasmine.getEnv().currentSpec;
-      spec.after(jasmine.Clock.uninstallMock);
-
-      jasmine.Clock.installMock();
-    }
-  },
-
-  installMock: function() {
-    jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
-  },
-
-  uninstallMock: function() {
-    jasmine.Clock.assertInstalled();
-    jasmine.Clock.installed = jasmine.Clock.real;
-  },
-
-  real: {
-    setTimeout: jasmine.getGlobal().setTimeout,
-    clearTimeout: jasmine.getGlobal().clearTimeout,
-    setInterval: jasmine.getGlobal().setInterval,
-    clearInterval: jasmine.getGlobal().clearInterval
-  },
-
-  assertInstalled: function() {
-    if (!jasmine.Clock.isInstalled()) {
-      throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
-    }
-  },
-
-  isInstalled: function() {
-    return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer;
-  },
-
-  installed: null
-};
-jasmine.Clock.installed = jasmine.Clock.real;
-
-//else for IE support
-jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
-  if (jasmine.Clock.installed.setTimeout.apply) {
-    return jasmine.Clock.installed.setTimeout.apply(this, arguments);
-  } else {
-    return jasmine.Clock.installed.setTimeout(funcToCall, millis);
-  }
-};
-
-jasmine.getGlobal().setInterval = function(funcToCall, millis) {
-  if (jasmine.Clock.installed.setInterval.apply) {
-    return jasmine.Clock.installed.setInterval.apply(this, arguments);
-  } else {
-    return jasmine.Clock.installed.setInterval(funcToCall, millis);
-  }
-};
-
-jasmine.getGlobal().clearTimeout = function(timeoutKey) {
-  if (jasmine.Clock.installed.clearTimeout.apply) {
-    return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
-  } else {
-    return jasmine.Clock.installed.clearTimeout(timeoutKey);
-  }
-};
-
-jasmine.getGlobal().clearInterval = function(timeoutKey) {
-  if (jasmine.Clock.installed.clearTimeout.apply) {
-    return jasmine.Clock.installed.clearInterval.apply(this, arguments);
-  } else {
-    return jasmine.Clock.installed.clearInterval(timeoutKey);
-  }
-};
-
-
-jasmine.version_= {
-  "major": 1,
-  "minor": 0,
-  "build": 1,
-  "revision": 1286311016
-};
diff --git a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.data.js
deleted file mode 100644 (file)
index a867f72..0000000
+++ /dev/null
@@ -1,488 +0,0 @@
-// This file stores the results from the PHP parser for certain messages and arguments,
-// so we can test the equivalent Javascript libraries.
-// Last generated with makeLanguageSpec.php at 2011-01-28T02:04:09+00:00
-
-mediaWiki.messages.set( {
-       "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
-       "en_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.}}",
-       "fr_undelete_short": "Restaurer $1 modification{{PLURAL:$1||s}}",
-       "fr_category-subcat-count": "Cette cat\u00e9gorie comprend {{PLURAL:$2|la sous-cat\u00e9gorie|$2 sous-cat\u00e9gories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.",
-       "ar_undelete_short": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 {{PLURAL:$1|\u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f|\u062a\u0639\u062f\u064a\u0644\u064a\u0646|$1 \u062a\u0639\u062f\u064a\u0644\u0627\u062a|$1 \u062a\u0639\u062f\u064a\u0644|$1 \u062a\u0639\u062f\u064a\u0644\u0627}}",
-       "ar_category-subcat-count": "{{PLURAL:$2|\u0644\u0627 \u062a\u0635\u0627\u0646\u064a\u0641 \u0641\u0631\u0639\u064a\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 {{PLURAL:$1||\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a|\u0647\u0630\u064a\u0646 \u0627\u0644\u062a\u0635\u0646\u064a\u0641\u064a\u0646 \u0627\u0644\u0641\u0631\u0639\u064a\u064a\u0646|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641\u0627 \u0641\u0631\u0639\u064a\u0627|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641 \u0641\u0631\u0639\u064a}}\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a $2.}}",
-       "jp_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
-       "jp_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.}}",
-       "zh_undelete_short": "\u6062\u590d\u88ab\u5220\u9664\u7684$1\u9879\u4fee\u8ba2",
-       "zh_category-subcat-count": "{{PLURAL:$2|\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002|\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u5217$1\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u6709$2\u4e2a\u5b50\u5206\u7c7b\u3002}}"
-} );
-var jasmineMsgSpec = [
-       {
-               "name": "en undelete_short 0",
-               "key": "en_undelete_short",
-               "args": [
-                       0
-               ],
-               "result": "Undelete 0 edits",
-               "lang": "en"
-       },
-       {
-               "name": "en undelete_short 1",
-               "key": "en_undelete_short",
-               "args": [
-                       1
-               ],
-               "result": "Undelete one edit",
-               "lang": "en"
-       },
-       {
-               "name": "en undelete_short 2",
-               "key": "en_undelete_short",
-               "args": [
-                       2
-               ],
-               "result": "Undelete 2 edits",
-               "lang": "en"
-       },
-       {
-               "name": "en undelete_short 5",
-               "key": "en_undelete_short",
-               "args": [
-                       5
-               ],
-               "result": "Undelete 5 edits",
-               "lang": "en"
-       },
-       {
-               "name": "en undelete_short 21",
-               "key": "en_undelete_short",
-               "args": [
-                       21
-               ],
-               "result": "Undelete 21 edits",
-               "lang": "en"
-       },
-       {
-               "name": "en undelete_short 101",
-               "key": "en_undelete_short",
-               "args": [
-                       101
-               ],
-               "result": "Undelete 101 edits",
-               "lang": "en"
-       },
-       {
-               "name": "en category-subcat-count 0,10",
-               "key": "en_category-subcat-count",
-               "args": [
-                       0,
-                       10
-               ],
-               "result": "This category has the following 0 subcategories, out of 10 total.",
-               "lang": "en"
-       },
-       {
-               "name": "en category-subcat-count 1,1",
-               "key": "en_category-subcat-count",
-               "args": [
-                       1,
-                       1
-               ],
-               "result": "This category has only the following subcategory.",
-               "lang": "en"
-       },
-       {
-               "name": "en category-subcat-count 1,2",
-               "key": "en_category-subcat-count",
-               "args": [
-                       1,
-                       2
-               ],
-               "result": "This category has the following subcategory, out of 2 total.",
-               "lang": "en"
-       },
-       {
-               "name": "en category-subcat-count 3,30",
-               "key": "en_category-subcat-count",
-               "args": [
-                       3,
-                       30
-               ],
-               "result": "This category has the following 3 subcategories, out of 30 total.",
-               "lang": "en"
-       },
-       {
-               "name": "fr undelete_short 0",
-               "key": "fr_undelete_short",
-               "args": [
-                       0
-               ],
-               "result": "Restaurer 0 modification",
-               "lang": "fr"
-       },
-       {
-               "name": "fr undelete_short 1",
-               "key": "fr_undelete_short",
-               "args": [
-                       1
-               ],
-               "result": "Restaurer 1 modification",
-               "lang": "fr"
-       },
-       {
-               "name": "fr undelete_short 2",
-               "key": "fr_undelete_short",
-               "args": [
-                       2
-               ],
-               "result": "Restaurer 2 modifications",
-               "lang": "fr"
-       },
-       {
-               "name": "fr undelete_short 5",
-               "key": "fr_undelete_short",
-               "args": [
-                       5
-               ],
-               "result": "Restaurer 5 modifications",
-               "lang": "fr"
-       },
-       {
-               "name": "fr undelete_short 21",
-               "key": "fr_undelete_short",
-               "args": [
-                       21
-               ],
-               "result": "Restaurer 21 modifications",
-               "lang": "fr"
-       },
-       {
-               "name": "fr undelete_short 101",
-               "key": "fr_undelete_short",
-               "args": [
-                       101
-               ],
-               "result": "Restaurer 101 modifications",
-               "lang": "fr"
-       },
-       {
-               "name": "fr category-subcat-count 0,10",
-               "key": "fr_category-subcat-count",
-               "args": [
-                       0,
-                       10
-               ],
-               "result": "Cette cat\u00e9gorie comprend 10 sous-cat\u00e9gories, dont celle ci-dessous.",
-               "lang": "fr"
-       },
-       {
-               "name": "fr category-subcat-count 1,1",
-               "key": "fr_category-subcat-count",
-               "args": [
-                       1,
-                       1
-               ],
-               "result": "Cette cat\u00e9gorie comprend la sous-cat\u00e9gorie ci-dessous.",
-               "lang": "fr"
-       },
-       {
-               "name": "fr category-subcat-count 1,2",
-               "key": "fr_category-subcat-count",
-               "args": [
-                       1,
-                       2
-               ],
-               "result": "Cette cat\u00e9gorie comprend 2 sous-cat\u00e9gories, dont celle ci-dessous.",
-               "lang": "fr"
-       },
-       {
-               "name": "fr category-subcat-count 3,30",
-               "key": "fr_category-subcat-count",
-               "args": [
-                       3,
-                       30
-               ],
-               "result": "Cette cat\u00e9gorie comprend 30 sous-cat\u00e9gories, dont les 3 ci-dessous.",
-               "lang": "fr"
-       },
-       {
-               "name": "ar undelete_short 0",
-               "key": "ar_undelete_short",
-               "args": [
-                       0
-               ],
-               "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f",
-               "lang": "ar"
-       },
-       {
-               "name": "ar undelete_short 1",
-               "key": "ar_undelete_short",
-               "args": [
-                       1
-               ],
-               "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644\u064a\u0646",
-               "lang": "ar"
-       },
-       {
-               "name": "ar undelete_short 2",
-               "key": "ar_undelete_short",
-               "args": [
-                       2
-               ],
-               "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 2 \u062a\u0639\u062f\u064a\u0644\u0627\u062a",
-               "lang": "ar"
-       },
-       {
-               "name": "ar undelete_short 5",
-               "key": "ar_undelete_short",
-               "args": [
-                       5
-               ],
-               "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 5 \u062a\u0639\u062f\u064a\u0644",
-               "lang": "ar"
-       },
-       {
-               "name": "ar undelete_short 21",
-               "key": "ar_undelete_short",
-               "args": [
-                       21
-               ],
-               "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 21 \u062a\u0639\u062f\u064a\u0644\u0627",
-               "lang": "ar"
-       },
-       {
-               "name": "ar undelete_short 101",
-               "key": "ar_undelete_short",
-               "args": [
-                       101
-               ],
-               "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 101 \u062a\u0639\u062f\u064a\u0644\u0627",
-               "lang": "ar"
-       },
-       {
-               "name": "ar category-subcat-count 0,10",
-               "key": "ar_category-subcat-count",
-               "args": [
-                       0,
-                       10
-               ],
-               "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 10.",
-               "lang": "ar"
-       },
-       {
-               "name": "ar category-subcat-count 1,1",
-               "key": "ar_category-subcat-count",
-               "args": [
-                       1,
-                       1
-               ],
-               "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.",
-               "lang": "ar"
-       },
-       {
-               "name": "ar category-subcat-count 1,2",
-               "key": "ar_category-subcat-count",
-               "args": [
-                       1,
-                       2
-               ],
-               "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 2.",
-               "lang": "ar"
-       },
-       {
-               "name": "ar category-subcat-count 3,30",
-               "key": "ar_category-subcat-count",
-               "args": [
-                       3,
-                       30
-               ],
-               "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0647 \u0627\u06443 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 30.",
-               "lang": "ar"
-       },
-       {
-               "name": "jp undelete_short 0",
-               "key": "jp_undelete_short",
-               "args": [
-                       0
-               ],
-               "result": "Undelete 0 edits",
-               "lang": "jp"
-       },
-       {
-               "name": "jp undelete_short 1",
-               "key": "jp_undelete_short",
-               "args": [
-                       1
-               ],
-               "result": "Undelete one edit",
-               "lang": "jp"
-       },
-       {
-               "name": "jp undelete_short 2",
-               "key": "jp_undelete_short",
-               "args": [
-                       2
-               ],
-               "result": "Undelete 2 edits",
-               "lang": "jp"
-       },
-       {
-               "name": "jp undelete_short 5",
-               "key": "jp_undelete_short",
-               "args": [
-                       5
-               ],
-               "result": "Undelete 5 edits",
-               "lang": "jp"
-       },
-       {
-               "name": "jp undelete_short 21",
-               "key": "jp_undelete_short",
-               "args": [
-                       21
-               ],
-               "result": "Undelete 21 edits",
-               "lang": "jp"
-       },
-       {
-               "name": "jp undelete_short 101",
-               "key": "jp_undelete_short",
-               "args": [
-                       101
-               ],
-               "result": "Undelete 101 edits",
-               "lang": "jp"
-       },
-       {
-               "name": "jp category-subcat-count 0,10",
-               "key": "jp_category-subcat-count",
-               "args": [
-                       0,
-                       10
-               ],
-               "result": "This category has the following 0 subcategories, out of 10 total.",
-               "lang": "jp"
-       },
-       {
-               "name": "jp category-subcat-count 1,1",
-               "key": "jp_category-subcat-count",
-               "args": [
-                       1,
-                       1
-               ],
-               "result": "This category has only the following subcategory.",
-               "lang": "jp"
-       },
-       {
-               "name": "jp category-subcat-count 1,2",
-               "key": "jp_category-subcat-count",
-               "args": [
-                       1,
-                       2
-               ],
-               "result": "This category has the following subcategory, out of 2 total.",
-               "lang": "jp"
-       },
-       {
-               "name": "jp category-subcat-count 3,30",
-               "key": "jp_category-subcat-count",
-               "args": [
-                       3,
-                       30
-               ],
-               "result": "This category has the following 3 subcategories, out of 30 total.",
-               "lang": "jp"
-       },
-       {
-               "name": "zh undelete_short 0",
-               "key": "zh_undelete_short",
-               "args": [
-                       0
-               ],
-               "result": "\u6062\u590d\u88ab\u5220\u9664\u76840\u9879\u4fee\u8ba2",
-               "lang": "zh"
-       },
-       {
-               "name": "zh undelete_short 1",
-               "key": "zh_undelete_short",
-               "args": [
-                       1
-               ],
-               "result": "\u6062\u590d\u88ab\u5220\u9664\u76841\u9879\u4fee\u8ba2",
-               "lang": "zh"
-       },
-       {
-               "name": "zh undelete_short 2",
-               "key": "zh_undelete_short",
-               "args": [
-                       2
-               ],
-               "result": "\u6062\u590d\u88ab\u5220\u9664\u76842\u9879\u4fee\u8ba2",
-               "lang": "zh"
-       },
-       {
-               "name": "zh undelete_short 5",
-               "key": "zh_undelete_short",
-               "args": [
-                       5
-               ],
-               "result": "\u6062\u590d\u88ab\u5220\u9664\u76845\u9879\u4fee\u8ba2",
-               "lang": "zh"
-       },
-       {
-               "name": "zh undelete_short 21",
-               "key": "zh_undelete_short",
-               "args": [
-                       21
-               ],
-               "result": "\u6062\u590d\u88ab\u5220\u9664\u768421\u9879\u4fee\u8ba2",
-               "lang": "zh"
-       },
-       {
-               "name": "zh undelete_short 101",
-               "key": "zh_undelete_short",
-               "args": [
-                       101
-               ],
-               "result": "\u6062\u590d\u88ab\u5220\u9664\u7684101\u9879\u4fee\u8ba2",
-               "lang": "zh"
-       },
-       {
-               "name": "zh category-subcat-count 0,10",
-               "key": "zh_category-subcat-count",
-               "args": [
-                       0,
-                       10
-               ],
-               "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52170\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670910\u4e2a\u5b50\u5206\u7c7b\u3002",
-               "lang": "zh"
-       },
-       {
-               "name": "zh category-subcat-count 1,1",
-               "key": "zh_category-subcat-count",
-               "args": [
-                       1,
-                       1
-               ],
-               "result": "\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002",
-               "lang": "zh"
-       },
-       {
-               "name": "zh category-subcat-count 1,2",
-               "key": "zh_category-subcat-count",
-               "args": [
-                       1,
-                       2
-               ],
-               "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52171\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u67092\u4e2a\u5b50\u5206\u7c7b\u3002",
-               "lang": "zh"
-       },
-       {
-               "name": "zh category-subcat-count 3,30",
-               "key": "zh_category-subcat-count",
-               "args": [
-                       3,
-                       30
-               ],
-               "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52173\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171\u670930\u4e2a\u5b50\u5206\u7c7b\u3002",
-               "lang": "zh"
-       }
-];
diff --git a/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js b/tests/jasmine/spec/mediawiki.jqueryMsg.spec.js
deleted file mode 100644 (file)
index 46dcaa8..0000000
+++ /dev/null
@@ -1,389 +0,0 @@
-/* spec for language & message behaviour in MediaWiki */
-
-mw.messages.set( {
-       "en_empty": "",
-       "en_simple": "Simple message",
-       "en_replace": "Simple $1 replacement",
-       "en_replace2": "Simple $1 $2 replacements",
-       "en_link": "Simple [http://example.com link to example].",
-       "en_link_replace": "Complex [$1 $2] behaviour.",
-       "en_simple_magic": "Simple {{ALOHOMORA}} message",
-       "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
-       "en_undelete_empty_param": "Undelete{{PLURAL:$1|| multiple edits}}",
-       "en_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.}}",
-       "en_escape0": "Escape \\to fantasy island",
-       "en_escape1": "I had \\$2.50 in my pocket",
-       "en_escape2": "I had {{PLURAL:$1|the absolute \\|$1\\| which came out to \\$3.00 in my C:\\\\drive| some stuff}}",
-       "en_fail": "This should fail to {{parse",
-       "en_fail_magic": "There is no such magic word as {{SIETNAME}}",
-       "en_evil": "This has <script type='text/javascript'>window.en_evil = true;</script> tags"
-} );
-
-/**
- * Tests
- */
-( function( mw, $, undefined ) {
-
-       describe( "mediaWiki.jqueryMsg", function() {
-               
-               describe( "basic message functionality", function() {
-
-                       it( "should return identity for empty string", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( parser.parse( 'en_empty' ).html() ).toEqual( '' );
-                       } );
-
-
-                       it( "should return identity for simple string", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( parser.parse( 'en_simple' ).html() ).toEqual( 'Simple message' );
-                       } );
-
-               } );
-
-               describe( "escaping", function() {
-
-                       it ( "should handle simple escaping", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( parser.parse( 'en_escape0' ).html() ).toEqual( 'Escape to fantasy island' );
-                       } );
-
-                       it ( "should escape dollar signs found in ordinary text when backslashed", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( parser.parse( 'en_escape1' ).html() ).toEqual( 'I had $2.50 in my pocket' );
-                       } );
-
-                       it ( "should handle a complicated escaping case, including escaped pipe chars in template args", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( parser.parse( 'en_escape2', [ 1 ] ).html() ).toEqual( 'I had the absolute |1| which came out to $3.00 in my C:\\drive' );
-                       } );
-
-               } );
-
-               describe( "replacing", function() {
-
-                       it ( "should handle simple replacing", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( parser.parse( 'en_replace', [ 'foo' ] ).html() ).toEqual( 'Simple foo replacement' );
-                       } );
-
-                       it ( "should return $n if replacement not there", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( parser.parse( 'en_replace', [] ).html() ).toEqual( 'Simple $1 replacement' );
-                               expect( parser.parse( 'en_replace2', [ 'bar' ] ).html() ).toEqual( 'Simple bar $2 replacements' );
-                       } );
-
-               } );
-
-               describe( "linking", function() {
-
-                       it ( "should handle a simple link", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               var parsed = parser.parse( 'en_link' );
-                               var contents = parsed.contents();
-                               expect( contents.length ).toEqual( 3 );
-                               expect( contents[0].nodeName ).toEqual( '#text' );
-                               expect( contents[0].nodeValue ).toEqual( 'Simple ' );
-                               expect( contents[1].nodeName ).toEqual( 'A' );
-                               expect( contents[1].getAttribute( 'href' ) ).toEqual( 'http://example.com' );
-                               expect( contents[1].childNodes[0].nodeValue ).toEqual( 'link to example' );
-                               expect( contents[2].nodeName ).toEqual( '#text' );
-                               expect( contents[2].nodeValue ).toEqual( '.' );
-                       } );
-
-                       it ( "should replace a URL into a link", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               var parsed = parser.parse( 'en_link_replace', [ 'http://example.com/foo', 'linking' ] );
-                               var contents = parsed.contents();
-                               expect( contents.length ).toEqual( 3 );
-                               expect( contents[0].nodeName ).toEqual( '#text' );
-                               expect( contents[0].nodeValue ).toEqual( 'Complex ' );
-                               expect( contents[1].nodeName ).toEqual( 'A' );
-                               expect( contents[1].getAttribute( 'href' ) ).toEqual( 'http://example.com/foo' );
-                               expect( contents[1].childNodes[0].nodeValue ).toEqual( 'linking' );
-                               expect( contents[2].nodeName ).toEqual( '#text' );
-                               expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
-                       } );
-
-                       it ( "should bind a click handler into a link", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               var clicked = false;
-                               var click = function() { clicked = true; };
-                               var parsed = parser.parse( 'en_link_replace', [ click, 'linking' ] );
-                               var contents = parsed.contents();
-                               expect( contents.length ).toEqual( 3 );
-                               expect( contents[0].nodeName ).toEqual( '#text' );
-                               expect( contents[0].nodeValue ).toEqual( 'Complex ' );
-                               expect( contents[1].nodeName ).toEqual( 'A' );
-                               expect( contents[1].getAttribute( 'href' ) ).toEqual( '#' );
-                               expect( contents[1].childNodes[0].nodeValue ).toEqual( 'linking' );
-                               expect( contents[2].nodeName ).toEqual( '#text' );
-                               expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
-                               // determining bindings is hard in IE
-                               var anchor = parsed.find( 'a' );
-                               if ( ( $.browser.mozilla || $.browser.webkit ) && anchor.click ) {
-                                       expect( clicked ).toEqual( false );
-                                       anchor.click(); 
-                                       expect( clicked ).toEqual( true );
-                               }
-                       } );
-
-                       it ( "should wrap a jquery arg around link contents -- even another element", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               var clicked = false;
-                               var click = function() { clicked = true; };
-                               var button = $( '<button>' ).click( click );
-                               var parsed = parser.parse( 'en_link_replace', [ button, 'buttoning' ] );
-                               var contents = parsed.contents();
-                               expect( contents.length ).toEqual( 3 );
-                               expect( contents[0].nodeName ).toEqual( '#text' );
-                               expect( contents[0].nodeValue ).toEqual( 'Complex ' );
-                               expect( contents[1].nodeName ).toEqual( 'BUTTON' );
-                               expect( contents[1].childNodes[0].nodeValue ).toEqual( 'buttoning' );
-                               expect( contents[2].nodeName ).toEqual( '#text' );
-                               expect( contents[2].nodeValue ).toEqual( ' behaviour.' );
-                               // determining bindings is hard in IE
-                               if ( ( $.browser.mozilla || $.browser.webkit ) && button.click ) {
-                                       expect( clicked ).toEqual( false );
-                                       parsed.find( 'button' ).click();
-                                       expect( clicked ).toEqual( true );
-                               }
-                       } );
-
-
-               } );
-
-
-               describe( "magic keywords", function() {
-                       it( "should substitute magic keywords", function() {
-                               var options = {
-                                       magic: { 
-                                               'alohomora' : 'open'
-                                       }
-                               };
-                               var parser = new mw.jqueryMsg.parser( options );
-                               expect( parser.parse( 'en_simple_magic' ).html() ).toEqual( 'Simple open message' );
-                       } );
-               } );
-               
-               describe( "error conditions", function() {
-                       it( "should return non-existent key in square brackets", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( parser.parse( 'en_does_not_exist' ).html() ).toEqual( '[en_does_not_exist]' );
-                       } );
-
-
-                       it( "should fail to parse", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               expect( function() { parser.parse( 'en_fail' ); } ).toThrow( 
-                                       'Parse error at position 20 in input: This should fail to {{parse'
-                               );
-                       } );
-               } );
-
-               describe( "empty parameters", function() {
-                       it( "should deal with empty parameters", function() {
-                               var parser = new mw.jqueryMsg.parser();
-                               var ast = parser.getAst( 'en_undelete_empty_param' );
-                               expect( parser.parse( 'en_undelete_empty_param', [ 1 ] ).html() ).toEqual( 'Undelete' );
-                               expect( parser.parse( 'en_undelete_empty_param', [ 3 ] ).html() ).toEqual( 'Undelete multiple edits' );
-
-                       } );
-               } );
-
-               describe( "easy message interface functions", function() {
-                       it( "should allow a global that returns strings", function() {
-                               var gM = mw.jqueryMsg.getMessageFunction();
-                               // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
-                               // a surrounding <SPAN> is needed for html() to work right
-                               var expectedHtml = $( '<span>Complex <a href="http://example.com/foo">linking</a> behaviour.</span>' ).html();
-                               var result = gM( 'en_link_replace', 'http://example.com/foo', 'linking' );
-                               expect( typeof result ).toEqual( 'string' );
-                               expect( result ).toEqual( expectedHtml );
-                       } );
-
-                       it( "should allow a jQuery plugin that appends to nodes", function() {
-                               $.fn.msg = mw.jqueryMsg.getPlugin();
-                               var $div = $( '<div>' ).append( $( '<p>' ).addClass( 'foo' ) );
-                               var clicked = false;
-                               var $button = $( '<button>' ).click( function() { clicked = true; } );
-                               $div.find( '.foo' ).msg( 'en_link_replace', $button, 'buttoning' );
-                               // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
-                               // a surrounding <SPAN> is needed for html() to work right
-                               var expectedHtml = $( '<span>Complex <button>buttoning</button> behaviour.</span>' ).html();
-                               var createdHtml = $div.find( '.foo' ).html();
-                               // it is hard to test for clicks with IE; also it inserts or removes spaces around nodes when creating HTML tags, depending on their type.
-                               // so need to check the strings stripped of spaces.
-                               if ( ( $.browser.mozilla || $.browser.webkit ) && $button.click ) {
-                                       expect( createdHtml ).toEqual( expectedHtml );
-                                       $div.find( 'button ').click();
-                                       expect( clicked ).toEqual( true );
-                               } else if ( $.browser.ie ) {
-                                       expect( createdHtml.replace( /\s/, '' ) ).toEqual( expectedHtml.replace( /\s/, '' ) );
-                               }
-                               delete $.fn.msg;
-                       } );
-
-                       it( "jQuery plugin should escape incoming string arguments", function() {
-                               $.fn.msg = mw.jqueryMsg.getPlugin();
-                               var $div = $( '<div>' ).addClass( 'foo' );
-                               $div.msg( 'en_replace', '<p>x</p>' ); // looks like HTML, but as a string, should be escaped.
-                               // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
-                               var expectedHtml = $( '<div class="foo">Simple &lt;p&gt;x&lt;/p&gt; replacement</div>' ).html();
-                               var createdHtml = $div.html();
-                               expect( expectedHtml ).toEqual( createdHtml );
-                               delete $.fn.msg;
-                       } );
-
-
-                       it( "jQuery plugin should never execute scripts", function() {
-                               window.en_evil = false;
-                               $.fn.msg = mw.jqueryMsg.getPlugin();
-                               var $div = $( '<div>' );
-                               $div.msg( 'en_evil' );
-                               expect( window.en_evil ).toEqual( false );
-                               delete $.fn.msg;
-                       } );
-
-
-                       // n.b. this passes because jQuery already seems to strip scripts away; however, it still executes them if they are appended to any element.
-                       it( "jQuery plugin should never emit scripts", function() {
-                               $.fn.msg = mw.jqueryMsg.getPlugin();
-                               var $div = $( '<div>' );
-                               $div.msg( 'en_evil' );
-                               // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
-                               var expectedHtml = $( '<div>This has  tags</div>' ).html();
-                               var createdHtml = $div.html();
-                               expect( expectedHtml ).toEqual( createdHtml );
-                               console.log( 'expected: ' + expectedHtml );
-                               console.log( 'created: ' + createdHtml );
-                               delete $.fn.msg;
-                       } );
-
-
-
-               } );
-
-               // The parser functions can throw errors, but let's not actually blow up for the user -- instead dump the error into the interface so we have
-               // a chance at fixing this
-               describe( "easy message interface functions with graceful failures", function() {
-                       it( "should allow a global that returns strings, with graceful failure", function() {
-                               var gM = mw.jqueryMsg.getMessageFunction();
-                               // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
-                               // a surrounding <SPAN> is needed for html() to work right
-                               var expectedHtml = $( '<span>en_fail: Parse error at position 20 in input: This should fail to {{parse</span>' ).html();
-                               var result = gM( 'en_fail' );
-                               expect( typeof result ).toEqual( 'string' );
-                               expect( result ).toEqual( expectedHtml );
-                       } );
-
-                       it( "should allow a global that returns strings, with graceful failure on missing magic words", function() {
-                               var gM = mw.jqueryMsg.getMessageFunction();
-                               // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
-                               // a surrounding <SPAN> is needed for html() to work right
-                               var expectedHtml = $( '<span>en_fail_magic: unknown operation "sietname"</span>' ).html();
-                               var result = gM( 'en_fail_magic' );
-                               expect( typeof result ).toEqual( 'string' );
-                               expect( result ).toEqual( expectedHtml );
-                       } );
-
-
-                       it( "should allow a jQuery plugin, with graceful failure", function() {
-                               $.fn.msg = mw.jqueryMsg.getPlugin();
-                               var $div = $( '<div>' ).append( $( '<p>' ).addClass( 'foo' ) );
-                               $div.find( '.foo' ).msg( 'en_fail' );
-                               // passing this through jQuery and back to string, because browsers may have subtle differences, like the case of tag names.
-                               // a surrounding <SPAN> is needed for html() to work right
-                               var expectedHtml = $( '<span>en_fail: Parse error at position 20 in input: This should fail to {{parse</span>' ).html();
-                               var createdHtml = $div.find( '.foo' ).html();
-                               expect( createdHtml ).toEqual( expectedHtml );
-                               delete $.fn.msg;
-                       } );
-
-               } );
-
-
-
-
-               describe( "test plurals and other language-specific functions", function() {
-                       /* copying some language definitions in here -- it's hard to make this test fast and reliable 
-                          otherwise, and we don't want to have to know the mediawiki URL from this kind of test either.
-                          We also can't preload the langs for the test since they clobber the same namespace.
-                          In principle Roan said it was okay to change how languages worked so that didn't happen... maybe 
-                          someday. We'd have to the same kind of importing of the default rules for most rules, or maybe 
-                          come up with some kind of subclassing scheme for languages */
-                       var languageClasses = {
-                               ar: {
-                                       /**
-                                        * Arabic (العربية) language functions
-                                        */
-
-                                       convertPlural: function( count, forms ) {
-                                               forms = mw.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];
-                                       },
-
-                                       digitTransformTable: {
-                                           '0': '٠', // &#x0660;
-                                           '1': '١', // &#x0661;
-                                           '2': '٢', // &#x0662;
-                                           '3': '٣', // &#x0663;
-                                           '4': '٤', // &#x0664;
-                                           '5': '٥', // &#x0665;
-                                           '6': '٦', // &#x0666;
-                                           '7': '٧', // &#x0667;
-                                           '8': '٨', // &#x0668;
-                                           '9': '٩', // &#x0669;
-                                           '.': '٫', // &#x066b; wrong table ?
-                                           ',': '٬' // &#x066c;
-                                       }
-
-                               },
-                               en: { },
-                               fr: {
-                                       convertPlural: function( count, forms ) {
-                                               forms = mw.language.preConvertPlural( forms, 2 );
-                                               return ( count <= 1 ) ? forms[0] : forms[1];
-                                       }
-                               },
-                               jp: { },
-                               zh: { }
-                       };
-
-                       /* simulate how the language classes override, or don't, the standard functions in mw.language */
-                       $.each( languageClasses, function( langCode, rules ) { 
-                               $.each( [ 'convertPlural', 'convertNumber' ], function( i, propertyName ) { 
-                                       if ( typeof rules[ propertyName ] === 'undefined' ) {
-                                               rules[ propertyName ] = mw.language[ propertyName ];
-                                       }
-                               } );
-                       } );
-
-                       $.each( jasmineMsgSpec, function( i, test ) { 
-                               it( "should parse " + test.name, function() { 
-                                       // using language override so we don't have to muck with global namespace
-                                       var parser = new mw.jqueryMsg.parser( { language: languageClasses[ test.lang ] } );
-                                       var parsedHtml = parser.parse( test.key, test.args ).html();
-                                       expect( parsedHtml ).toEqual( test.result );
-                               } );
-                       } );
-
-               } );
-
-       } );
-} )( window.mediaWiki, jQuery );
diff --git a/tests/jasmine/spec_makers/makeJqueryMsgSpec.php b/tests/jasmine/spec_makers/makeJqueryMsgSpec.php
deleted file mode 100644 (file)
index 840da96..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-/**
- * This PHP script defines the spec that the Javascript message parser should conform to.
- *
- * It does this by looking up the results of various string kinds of string parsing, with various languages,
- * in the current installation of MediaWiki. It then outputs a static specification, mapping expected inputs to outputs,
- * which can be used with the JasmineBDD framework. This specification can then be used by simply including it into
- * the SpecRunner.html file.
- *
- * This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't look up the
- * API results while doing the test, so the Jasmine run is much faster(at the cost of being out of date in rare
- * circumstances. But mostly the parsing that we are doing in Javascript doesn't change much.)
- *
- */
-
-$maintenanceDir = dirname( dirname( dirname( __DIR__ ) ) ) . '/maintenance';
-
-require( "$maintenanceDir/Maintenance.php" );
-
-class MakeLanguageSpec extends Maintenance {
-
-       static $keyToTestArgs = array(
-               'undelete_short' => array( 
-                       array( 0 ), 
-                       array( 1 ), 
-                       array( 2 ), 
-                       array( 5 ), 
-                       array( 21 ), 
-                       array( 101 ) 
-               ),
-               'category-subcat-count' => array(  
-                       array( 0, 10 ), 
-                       array( 1, 1 ), 
-                       array( 1, 2 ), 
-                       array( 3, 30 ) 
-               )
-       );
-
-       public function __construct() {
-                parent::__construct();
-                $this->mDescription = "Create a JasmineBDD-compatible specification for message parsing";
-                // add any other options here
-        }
-
-       public function execute() {
-               list( $messages, $tests ) = $this->getMessagesAndTests();
-               $this->writeJavascriptFile( $messages, $tests, "spec/mediawiki.language.parser.spec.data.js" );
-       }
-
-       private function getMessagesAndTests() {
-               $messages = array();
-               $tests = array();
-               foreach ( array( 'en', 'fr', 'ar', 'jp', 'zh' ) as $languageCode ) {
-                       foreach ( self::$keyToTestArgs as $key => $testArgs ) {
-                               foreach ($testArgs as $args) {
-                                       // get the raw template, without any transformations
-                                       $template = wfMessage( $key )->inLanguage( $languageCode )->plain();
-
-                                       $result = wfMessage( $key, $args )->inLanguage( $languageCode )->text();
-
-                                       // record the template, args, language, and expected result
-                                       // fake multiple languages by flattening them together
-                                       $langKey = $languageCode . '_' . $key;
-                                       $messages[ $langKey ] = $template;
-                                       $tests[] = array(
-                                               'name' => $languageCode . " " . $key . " " . join( ",", $args ),
-                                               'key' => $langKey,
-                                               'args' => $args,
-                                               'result' => $result,
-                                               'lang' => $languageCode
-                                       );
-                               }
-                       }
-               }
-               return array( $messages, $tests );
-       }
-
-       private function writeJavascriptFile( $messages, $tests, $dataSpecFile ) {
-               global $argv;
-               $arguments = count($argv) ? $argv : $_SERVER[ 'argv' ];
-
-               $json = new Services_JSON;
-               $json->pretty = true;
-               $javascriptPrologue = "// This file stores the results from the PHP parser for certain messages and arguments,\n"
-                                     . "// so we can test the equivalent Javascript libraries.\n"
-                                     . '// Last generated with ' . join(' ', $arguments) . ' at ' . gmdate('c') . "\n\n";
-               $javascriptMessages = "mediaWiki.messages.set( " . $json->encode( $messages, true ) . " );\n";
-               $javascriptTests = 'var jasmineMsgSpec = ' . $json->encode( $tests, true ) . ";\n";
-
-               $fp = fopen( $dataSpecFile, 'w' );
-               if ( !$fp ) {
-                       die( "couldn't open $dataSpecFile for writing" );
-               }
-               $success = fwrite( $fp, $javascriptPrologue . $javascriptMessages . $javascriptTests );
-               if ( !$success ) { 
-                       die( "couldn't write to $dataSpecFile" );
-               }
-               $success = fclose( $fp );
-               if ( !$success ) {
-                       die( "couldn't close $dataSpecFile" );
-               }
-       }
-}
-
-$maintClass = "MakeLanguageSpec";
-require_once( "$maintenanceDir/doMaintenance.php" );
-
-
-
index cd59833..ea1b290 100644 (file)
@@ -1,23 +1,25 @@
 <?php
-# Copyright (C) 2004, 2010 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
-# (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
-
 /**
+ * Helper code for the MediaWiki parser test suite.
+ *
+ * Copyright © 2004, 2010 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
+ * (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
+ *
  * @todo Make this more independent of the configuration (and if possible the database)
  * @todo document
  * @file
@@ -669,7 +671,7 @@ class ParserTest {
                        'wgNoFollowLinks' => true,
                        'wgNoFollowDomainExceptions' => array(),
                        'wgThumbnailScriptPath' => false,
-                       'wgUseImageResize' => false,
+                       'wgUseImageResize' => true,
                        'wgLocaltimezone' => 'UTC',
                        'wgAllowExternalImages' => true,
                        'wgUseTidy' => false,
@@ -690,7 +692,6 @@ class ParserTest {
                        'wgExternalLinkTarget' => false,
                        'wgAlwaysUseTidy' => false,
                        'wgHtml5' => true,
-                       'wgCleanupPresentationalAttributes' => true,
                        'wgWellFormedXml' => true,
                        'wgAllowMicrodataAttributes' => true,
                        'wgAdaptiveMessageCache' => true,
@@ -989,6 +990,16 @@ class ParserTest {
                                "$dir/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
                                "$dir/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
                                "$dir/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
+                               "$dir/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
 
                                "$dir/0/09/Bad.jpg",
 
@@ -1204,7 +1215,7 @@ class ParserTest {
                        }
                }
 
-               $page->doEdit( $text, '', EDIT_NEW );
+               $page->doEditContent( ContentHandler::makeContent( $text, $title ), '', EDIT_NEW );
 
                $wgCapitalLinks = $oldCapitalLinks;
        }
index 43d4271..652fa43 100644 (file)
@@ -36,19 +36,19 @@ Main Page
 blah blah
 !! endarticle
 
-!!article 
+!!article
 Template:Foo
 !!text
 FOO
 !!endarticle
 
-!! article 
+!! article
 Template:Blank
 !! text
 !! endarticle
 
 !! article
-Template:!
+Template:pipe
 !! text
 |
 !! endarticle
@@ -65,6 +65,61 @@ Template:inner list
 * item 1
 !! endarticle
 
+!! article
+Template:tbl-start
+!! text
+{|
+!! endarticle
+
+!! article
+Template:tbl-end
+!! text
+|}
+!! endarticle
+
+!! article
+Template:!
+!! text
+|
+!! endarticle
+
+!! article
+Template:echo
+!! text
+{{{1}}}
+!! endarticle
+
+!! article
+Template:echo_with_span
+!! text
+<span>{{{1}}}</span>
+!! endarticle
+
+!! article
+Template:echo_with_div
+!! text
+<div>{{{1}}}</div>
+!! endarticle
+
+!! article
+Template:attr_str
+!! text
+{{{1}}}="{{{2}}}"
+!! endarticle
+
+!! article
+Template:table_attribs
+!! text
+<noinclude>
+|</noinclude>style="color: red"| Foo
+!! endarticle
+
+!! article
+A?b
+!! text
+Weirdo titles!
+!! endarticle
+
 ###
 ### Basic tests
 ###
@@ -499,14 +554,30 @@ nowiki 3
 ### Comments
 ###
 !! test
-Comment test 1
+Comments and Indent-Pre
 !! input
+<!-- comment 1 --> asdf
+
 <!-- comment 1 --> asdf
 <!-- comment 2 -->
+
+<!-- comment 1 --> asdf
+<!-- comment 2 -->xyz
+
+<!-- comment 1 --> asdf
+<!-- comment 2 --> xyz
 !! result
 <pre>asdf
 </pre>
-
+<pre>asdf
+</pre>
+<pre>asdf
+</pre>
+<p>xyz
+</p>
+<pre>asdf
+xyz
+</pre>
 !! end
 
 !! test
@@ -734,6 +805,17 @@ And a <a href="/wiki/Main_Page" title="Main Page">link</a>
 </pre>
 !! end
 
+!! test
+Ident preformatting with inline content
+!! input
+ a
+ ''b''
+!! result
+<pre>a
+<i>b</i>
+</pre>
+!! end
+
 !! test
 <pre> with <nowiki> inside (compatibility with 1.6 and earlier)
 !! input
@@ -868,667 +950,1186 @@ Bug 6200: Preformatted in <blockquote>
 </p>
 !! end
 
-
-###
-### Definition lists
-###
 !! test
-Simple definition
+</pre> inside nowiki
 !! input
-; name : Definition
+<nowiki></pre></nowiki>
 !! result
-<dl><dt> name&#160;</dt><dd> Definition
-</dd></dl>
-
+<p>&lt;/pre&gt;
+</p>
 !! end
 
-!! test
-Definition list for indentation only
-!! input
-: Indented text
-!! result
-<dl><dd> Indented text
-</dd></dl>
-
-!! end
+!!test
+Templates: Indent-Pre: 1a. Templates that break a line should suppress <pre>
+!!input
+ {{echo|}}
+!!result
 
-!! test
-Definition list with no space
-!! input
-;name:Definition
-!! result
-<dl><dt>name</dt><dd>Definition
-</dd></dl>
+!!end
 
+!!test
+Templates: Indent-Pre: 1b. Templates that break a line should suppress <pre>
+!!input
+ {{echo|
+foo}}
+!!result
+<p>foo
+</p>
 !!end
 
 !! test
-Definition list with URL link
+Templates: Indent-Pre: 1c: Wrapping should be based on expanded content
 !! 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
+ {{echo|a
+b}}
+!!result
+<pre>a
+</pre>
+<p>b
+</p>
+!!end
 
 !! test
-Definition list with bracketed URL link
+Templates: Indent-Pre: 1d: Wrapping should be based on expanded content
 !! 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
+ {{echo|a
+b
+c
+ d
+e
+}}
+!!result
+<pre>a
+</pre>
+<p>b
+c
+</p>
+<pre>d
+</pre>
+<p>e
+</p>
+!!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>
+!!test
+Templates: Indent-Pre: 1e. Wrapping should be based on expanded content
+!!input
+{{echo| foo}}
 
-!! end
+{{echo| foo}}{{echo| bar}}
 
-# 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>
+{{echo| foo}}
+{{echo| bar}}
 
-!! end
+{{echo|<!--cmt--> foo}}
 
-!! 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>
+<!--cmt-->{{echo| foo}}
 
-!! end
+{{echo|{{echo| }}bar}}
+!!result
+<pre>foo
+</pre>
+<pre>foo bar
+</pre>
+<pre>foo
+bar
+</pre>
+<pre>foo
+</pre>
+<pre>foo
+</pre>
+<pre>bar
+</pre>
+!!end
 
 !! test
-Definition lists: colon in external link text
+Templates: Indent-Pre: 1f: Wrapping should be based on expanded content
 !! 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>
+{{echo| }}a
 
-!! end
+{{echo|
+ }}a
 
-!! 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>
+{{echo|
+ b}}
 
-!! end
+{{echo|a
+ }}b
 
+{{echo|a
+}} b
+!!result
+<pre>a
+</pre>
+<p><br />
+</p>
+<pre>a
+</pre>
+<p><br />
+</p>
+<pre>b
+</pre>
+<p>a
+</p>
+<pre>b
+</pre>
+<p>a
+</p>
+<pre>b
+</pre>
+!!end
 
 !! test
-Definition lists: self-closed tag
+Templates: Single-line variant of parameter whitespace stripping test
 !! input
-;one<br/>two : two-line fun
-!! result
-<dl><dt>one<br />two&#160;</dt><dd> two-line fun
-</dd></dl>
+{{echo| a}}
 
-!! end
+{{echo|1= a}}
 
-!! 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>
+{{echo|{{echo| a}}}}
+
+{{echo|1={{echo| a}}}}
 !! 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>
+<pre>a
+</pre>
+<p>a
+</p>
+<pre>a
+</pre>
+<p>a
+</p>
 !! end
 
 !! test
-Definition and unordered list using wiki syntax nested in unordered list using html tags.
+Templates: Strip whitespace from named parameters, but not positional ones
 !! 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>
+{{echo|
+ foo}}
 
-!! end
+{{echo|
+* foo}}
 
-!! test
-Definition list with empty definition and following paragraph
-!! input
-; term:
-Paragraph text
+{{echo| 1 =
+ foo}}
+
+{{echo| 1 =
+* foo}}
 !! result
-<dl><dt> term</dt><dd>
-</dd></dl>
-<p>Paragraph text
+<pre>foo
+</pre>
+<p><br />
+</p>
+<ul><li> foo
+</li></ul>
+<p>foo
 </p>
+<ul><li> foo
+</li></ul>
+
 !! end
 
-!! test
-Definition Lists: No nesting: Multiple dd's
+###
+### Parsoid-centric tests for testing RT edge cases for pre
+###
+
+!!test
+1a. Indent-Pre and Comments
+!!input
+ a
+<!--a-->
+c
+!!result
+<pre>a
+</pre>
+<p>c
+</p>
+!!end
+
+!!test
+1b. Indent-Pre and Comments
+!!input
+ a
+ <!--a-->
+c
+!!result
+<pre>a
+</pre>
+<p>c
+</p>
+!!end
+
+!!test
+1c. Indent-Pre and Comments
+!!input
+<!--a-->  a
+
+ <!--a--> a
+!!result
+<pre> a
+</pre>
+<pre> a
+</pre>
+!!end
+
+!!test
+2a. Indent-Pre and tables
+!!input
+ {|
+ |-
+ !h1!!h2
+ |foo||bar
+ |}
+!!result
+<table>
+
+<tr>
+<th>h1</th>
+<th>h2
+</th>
+<td>foo</td>
+<td>bar
+</td></tr></table>
+
+!!end
+
+!!test
+2b. Indent-Pre and tables
+!!input
+  {|
+ |-
+|foo
+|}
+!!result
+<table>
+
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+3a. Indent-Pre and block tags (single-line html)
+!!input
+ <p> foo </p>
+ <div> foo </div>
+ <span> foo </span>
+!!result
+ <p> foo </p>
+ <div> foo </div>
+<pre><span> foo </span>
+</pre>
+!!end
+
+!!test
+3b. Indent-Pre and block tags (pre-content on separate line)
+!!input
+<p>
+ foo
+</p>
+
+<div>
+ foo
+</div>
+
+<center>
+ foo
+</center>
+
+<blockquote>
+ foo
+</blockquote>
+
+<table><tr><td>
+ foo
+</td></tr></table>
+
+<ul><li>
+  foo
+</li></ul>
+
+!!result
+<p>
+ foo
+</p>
+<div>
+<pre>foo
+</pre>
+</div>
+<center>
+<pre>foo
+</pre>
+</center>
+<blockquote>
+ foo
+</blockquote>
+<table><tr><td>
+<pre>foo
+</pre>
+</td></tr></table>
+<ul><li>
+  foo
+</li></ul>
+
+!!end
+
+!!test
+4. Multiple spaces at start-of-line
+!!input
+    <p> foo </p>
+    foo
+       {|
+|foo
+|}
+!!result
+    <p> foo </p>
+<pre>   foo
+</pre>
+<table>
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
+###
+### HTML-pre (some to spec PHP parser behavior and some Parsoid-RT-centric)
+###
+
+!!test
+HTML-pre: 1. embedded newlines
+!!input
+<pre>foo</pre>
+
+<pre>
+foo
+</pre>
+
+<pre>
+
+foo
+</pre>
+
+<pre>
+
+
+foo
+</pre>
+!!result
+<pre>foo</pre>
+<pre>
+foo
+</pre>
+<pre>
+
+foo
+</pre>
+<pre>
+
+
+foo
+</pre>
+
+!!end
+
+!!test
+HTML-pre: 2: indented text
+!!input
+<pre>
+ foo
+</pre>
+!!result
+<pre>
+ foo
+</pre>
+
+!!end
+
+!!test
+HTML-pre: 3: other wikitext
+!!input
+<pre>
+* foo
+# bar
+= no-h =
+'' no-italic ''
+[[ NoLink ]]
+</pre>
+!!result
+<pre>
+* foo
+# bar
+= no-h =
+'' no-italic ''
+[[ NoLink ]]
+</pre>
+
+!!end
+
+###
+### Definition lists
+###
+!! test
+Simple definition
 !! input
-;x
-:a
-:b
+; name : Definition
 !! result
-<dl><dt>x
-</dt><dd>a
-</dd><dd>b
+<dl><dt> name&#160;</dt><dd> Definition
 </dd></dl>
 
 !! end
 
 !! test
-Definition Lists: Indentation: Regular
+Definition list for indentation only
 !! input
-:i1
-::i2
-:::i3
+: Indented text
 !! result
-<dl><dd>i1
-<dl><dd>i2
-<dl><dd>i3
-</dd></dl>
-</dd></dl>
+<dl><dd> Indented text
 </dd></dl>
 
 !! end
 
 !! test
-Definition Lists: Indentation: Missing 1st level
+Definition list with no space
 !! input
-::i2
-:::i3
+;name:Definition
 !! result
-<dl><dd><dl><dd>i2
-<dl><dd>i3
-</dd></dl>
+<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 Lists: Indentation: Multi-level indent
+Definition list with bracketed URL link
 !! input
-:::i3
+;[http://www.example.com/ Example]:Something about it
 !! result
-<dl><dd><dl><dd><dl><dd>i3
-</dd></dl>
-</dd></dl>
+<dl><dt><a rel="nofollow" class="external text" href="http://www.example.com/">Example</a></dt><dd>Something about it
 </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
+Definition list with wikilink containing colon
 !! input
-;t1 :d1
-;;t2 ::d2
-;;;t3 :::d3
+; [[Help:FAQ]]: The least-read page on Wikipedia
 !! 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>
-
+<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 Lists: Nesting: Test 2 (Parsoid only)
-!! options
-disabled
+Definition list with news link containing colon
 !! input
-;t1
-::d2
+;  news:alt.wikipedia.rox: This isn't even a real newsgroup!
 !! result
-<dl>
-  <dt>t1</dt>
-  <dd>
-    <dl>
-      <dd>d2</dd>
-    </dl>
-  </dd>
-</dl>
+<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
-Definition Lists: Nesting: Test 3 (Parsoid only)
-!! options
-disabled
+Malformed definition list with colon
 !! input
-:;t1
-::::d2
+;  news:alt.wikipedia.rox -- don't crash or enter an infinite loop
 !! result
-<dl>
-  <dd>
-    <dl>
-      <dt>t1</dt>
-      <dd>
-        <dl>
-          <dd>
-            <dl>
-              <dd>d2</dd>
-            </dl>
-          </dd>
-        </dl>
-      </dd>
-    </dl>
-  </dd>
-</dl>
+<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: Nesting: Test 4
+Definition lists: colon in external link text
 !! input
-::;t3
-:::d3
+; [http://www.wikipedia2.org/ Wikipedia : The Next Generation]: OK, I made that up
 !! result
-<dl><dd><dl><dd><dl><dt>t3
-</dt><dd>d3
-</dd></dl>
-</dd></dl>
+<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: Mixed Lists: Test 1
+Definition lists: colon in HTML attribute
 !! input
-:;* foo
-::* bar
-:; baz
+;<b style="display: inline">bold</b>
 !! result
-<dl><dd><dl><dt><ul><li> foo
-</li><li> bar
-</li></ul>
-</dt></dl>
-<dl><dt> baz
+<dl><dt><b style="display: inline">bold</b>
 </dt></dl>
-</dd></dl>
 
 !! end
 
-
 !! test
-Definition Lists: Mixed Lists: Test 2
+Definition lists: self-closed tag
 !! input
-*: d1
-*: d2
+;one<br/>two : two-line fun
 !! result
-<ul><li><dl><dd> d1
-</dd><dd> d2
+<dl><dt>one<br />two&#160;</dt><dd> two-line fun
 </dd></dl>
-</li></ul>
 
 !! end
 
-
 !! test
-Definition Lists: Mixed Lists: Test 3
+Bug 11748: Literal closing tags
 !! input
-*::: d1
-*::: d2
+<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
-<ul><li><dl><dd><dl><dd><dl><dd> d1
-</dd><dd> d2
-</dd></dl>
-</dd></dl>
-</dd></dl>
-</li></ul>
+<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 Lists: Mixed Lists: Test 4
+Definition and unordered list using wiki syntax nested in unordered list using html tags.
 !! input
-*;d1 :d2
-*;d3 :d4
+<ul><li>
+; term : description
+* unordered
+</li>
+</ul>
 !! result
-<ul><li><dl><dt>d1&#160;</dt><dd>d2
-</dd><dt>d3&#160;</dt><dd>d4
+<ul><li>
+<dl><dt> term&#160;</dt><dd> description
 </dd></dl>
+<ul><li> unordered
 </li></ul>
+</li>
+</ul>
 
 !! end
 
-
 !! test
-Definition Lists: Mixed Lists: Test 5
-!! input
-*:d1
-*:: d2
-!! result
-<ul><li><dl><dd>d1
-<dl><dd> d2
-</dd></dl>
-</dd></dl>
-</li></ul>
-
-!! end
 
-
-!! test
-Definition Lists: Mixed Lists: Test 6
+Definition list with empty definition and following paragraph
 !! input
-#*:d1
-#*::: d3
+; term:
+Paragraph text
 !! result
-<ol><li><ul><li><dl><dd>d1
-<dl><dd><dl><dd> d3
-</dd></dl>
-</dd></dl>
+<dl><dt> term</dt><dd>
 </dd></dl>
-</li></ul>
-</li></ol>
-
+<p>Paragraph text
+</p>
 !! end
 
-
 !! test
-Definition Lists: Mixed Lists: Test 7
+Nested definition lists using html syntax
 !! input
-:* d1
-:* d2
-!! result
-<dl><dd><ul><li> d1
-</li><li> d2
-</li></ul>
+<dl><dd>
+<dl>
+<dd>Foo</dd>
+</dl>
 </dd></dl>
-
-!! end
-
-
-!! test
-Definition Lists: Mixed Lists: Test 8
-!! input
-:* d1
-::* d2
 !! result
-<dl><dd><ul><li> d1
-</li></ul>
-<dl><dd><ul><li> d2
-</li></ul>
-</dd></dl>
+<dl><dd>
+<dl>
+<dd>Foo</dd>
+</dl>
 </dd></dl>
 
 !! end
 
-
 !! test
-Definition Lists: Mixed Lists: Test 9
+Definition Lists: No nesting: Multiple dd's
 !! input
-*;foo :bar
+;x
+:a
+:b
 !! result
-<ul><li><dl><dt>foo&#160;</dt><dd>bar
+<dl><dt>x
+</dt><dd>a
+</dd><dd>b
 </dd></dl>
-</li></ul>
 
 !! end
 
-
 !! test
-Definition Lists: Mixed Lists: Test 10
+Definition Lists: Indentation: Regular
 !! input
-*#;foo :bar
+:i1
+::i2
+:::i3
 !! result
-<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
+<dl><dd>i1
+<dl><dd>i2
+<dl><dd>i3
+</dd></dl>
+</dd></dl>
 </dd></dl>
-</li></ol>
-</li></ul>
 
 !! end
 
-
 !! test
-Definition Lists: Mixed Lists: Test 11
+Definition Lists: Indentation: Missing 1st level
 !! input
-*#*#;*;;foo :bar
-*#*#;boo :baz
+::i2
+:::i3
 !! result
-<ul><li><ol><li><ul><li><ol><li><dl><dt>foo&#160;</dt><dd><ul><li><dl><dt><dl><dt>bar
-</dt></dl>
+<dl><dd><dl><dd>i2
+<dl><dd>i3
 </dd></dl>
-</li></ul>
 </dd></dl>
-<dl><dt>boo&#160;</dt><dd>baz
 </dd></dl>
-</li></ol>
-</li></ul>
-</li></ol>
-</li></ul>
 
 !! end
 
-
 !! test
-Definition Lists: Weird Ones: Test 1
+Definition Lists: Indentation: Multi-level indent
 !! input
-*#;*::;; foo : bar (who uses this?)
+:::i3
 !! result
-<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>
+<dl><dd><dl><dd><dl><dd>i3
 </dd></dl>
 </dd></dl>
-</li></ul>
 </dd></dl>
-</li></ol>
-</li></ul>
 
 !! end
 
-###
-### External links
-###
 !! test
-External links: non-bracketed
+Definition Lists: Hacky use to indent tables
 !! input
-Non-bracketed: http://example.com
+::{|
+|foo
+|bar
+|}
+this text
+should be left alone
 !! result
-<p>Non-bracketed: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
-</p>
+<dl><dd><dl><dd><table>
+<tr>
+<td>foo
+</td>
+<td>bar
+</td></tr></table></dd></dl></dd></dl>
+<p>this text
+should be left alone
+</p>
 !! 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
-External links: numbered
+Table / list interaction: indented table with lists in table contents
 !! input
-Numbered: [http://example.com]
-Numbered: [http://example.net]
-Numbered: [http://example.com]
+:{|
+|-
+| a
+* b
+|-
+| c
+* d
+|}
 !! result
-<p>Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a>
-Numbered: <a rel="nofollow" class="external autonumber" href="http://example.net">[2]</a>
-Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[3]</a>
-</p>
+<dl><dd><table>
+
+<tr>
+<td> a
+<ul><li> b
+</li></ul>
+</td></tr>
+<tr>
+<td> c
+<ul><li> d
+</li></ul>
+</td></tr></table></dd></dl>
+
+!! end
+
+!!test
+Table / list interaction: lists nested in tables nested in indented lists
+!!input
+:{|
+|
+:a
+:b
+|
+*c
+*d
+|}
+
+*e
+*f
+!!result
+<dl><dd><table>
+<tr>
+<td>
+<dl><dd>a
+</dd><dd>b
+</dd></dl>
+</td>
+<td>
+<ul><li>c
+</li><li>d
+</li></ul>
+</td></tr></table></dd></dl>
+<ul><li>e
+</li><li>f
+</li></ul>
+
 !!end
 
 !! test
-External links: specified text
+Definition Lists: Nesting: Multi-level (Parsoid only)
+!! options
+disabled
 !! input
-Specified text: [http://example.com link]
+;t1 :d1
+;;t2 ::d2
+;;;t3 :::d3
 !! result
-<p>Specified text: <a rel="nofollow" class="external text" href="http://example.com">link</a>
-</p>
-!!end
+<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
-External links: trail
+Definition Lists: Nesting: Test 2 (Parsoid only)
+!! options
+disabled
 !! input
-Linktrails should not work for external links: [http://example.com link]s
+;t1
+::d2
 !! result
-<p>Linktrails should not work for external links: <a rel="nofollow" class="external text" href="http://example.com">link</a>s
-</p>
+<dl>
+  <dt>t1</dt>
+  <dd>
+    <dl>
+      <dd>d2</dd>
+    </dl>
+  </dd>
+</dl>
+
 !! end
 
+
 !! test
-External links: dollar sign in URL
+Definition Lists: Nesting: Test 3 (Parsoid only)
+!! options
+disabled
 !! input
-http://example.com/1$2345
+:;t1
+::::d2
 !! result
-<p><a rel="nofollow" class="external free" href="http://example.com/1$2345">http://example.com/1$2345</a>
-</p>
+<dl>
+  <dd>
+    <dl>
+      <dt>t1</dt>
+      <dd>
+        <dl>
+          <dd>
+            <dl>
+              <dd>d2</dd>
+            </dl>
+          </dd>
+        </dl>
+      </dd>
+    </dl>
+  </dd>
+</dl>
+
 !! end
 
+
 !! test
-External links: dollar sign in URL (named)
+Definition Lists: Nesting: Test 4
 !! input
-[http://example.com/1$2345]
+::;t3
+:::d3
 !! result
-<p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a>
-</p>
-!!end
+<dl><dd><dl><dd><dl><dt>t3
+</dt><dd>d3
+</dd></dl>
+</dd></dl>
+</dd></dl>
+
+!! end
+
 
 !! test
-External links: open square bracket forbidden in URL (bug 4377)
+Definition Lists: Mixed Lists: Test 1
 !! input
-http://example.com/1[2345
+:;* foo
+::* bar
+:; baz
 !! result
-<p><a rel="nofollow" class="external free" href="http://example.com/1">http://example.com/1</a>[2345
-</p>
+<dl><dd><dl><dt><ul><li> foo
+</li><li> bar
+</li></ul>
+</dt></dl>
+<dl><dt> baz
+</dt></dl>
+</dd></dl>
+
 !! end
 
+
 !! test
-External links: open square bracket forbidden in URL (named) (bug 4377)
+Definition Lists: Mixed Lists: Test 2
 !! input
-[http://example.com/1[2345]
+*: d1
+*: d2
 !! result
-<p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
-</p>
-!!end
+<ul><li><dl><dd> d1
+</dd><dd> d2
+</dd></dl>
+</li></ul>
 
-!! test
-External links: nowiki in URL link text (bug 6230)
-!!input
-[http://example.com/ <nowiki>''example site''</nowiki>]
-!! result
-<p><a rel="nofollow" class="external text" href="http://example.com/">''example site''</a>
-</p>
 !! end
 
+
 !! test
-External links: newline forbidden in text (bug 6230 regression check)
+Definition Lists: Mixed Lists: Test 3
 !! input
-[http://example.com/ first
-second]
+*::: d1
+*::: d2
 !! result
-<p>[<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> first
-second]
-</p>
-!!end
+<ul><li><dl><dd><dl><dd><dl><dd> d1
+</dd><dd> d2
+</dd></dl>
+</dd></dl>
+</dd></dl>
+</li></ul>
+
+!! end
+
 
 !! test
-External links: protocol-relative URL in brackets
+Definition Lists: Mixed Lists: Test 4
 !! input
-[//example.com/ Test]
+*;d1 :d2
+*;d3 :d4
 !! result
-<p><a rel="nofollow" class="external text" href="//example.com/">Test</a>
-</p>
+<ul><li><dl><dt>d1&#160;</dt><dd>d2
+</dd><dt>d3&#160;</dt><dd>d4
+</dd></dl>
+</li></ul>
+
 !! end
 
+
 !! test
-External links: protocol-relative URL in brackets without text
+Definition Lists: Mixed Lists: Test 5
 !! input
-[//example.com]
+*:d1
+*:: d2
 !! result
-<p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a>
-</p>
+<ul><li><dl><dd>d1
+<dl><dd> d2
+</dd></dl>
+</dd></dl>
+</li></ul>
+
 !! end
 
+
 !! test
-External links: protocol-relative URL in free text is left alone
+Definition Lists: Mixed Lists: Test 6
 !! input
-//example.com/Foo
+#*:d1
+#*::: d3
 !! result
-<p>//example.com/Foo
+<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: Mixed Lists: Test 7
+!! input
+:* d1
+:* d2
+!! result
+<dl><dd><ul><li> d1
+</li><li> d2
+</li></ul>
+</dd></dl>
+
+!! end
+
+
+!! test
+Definition Lists: Mixed Lists: Test 8
+!! input
+:* d1
+::* d2
+!! result
+<dl><dd><ul><li> d1
+</li></ul>
+<dl><dd><ul><li> d2
+</li></ul>
+</dd></dl>
+</dd></dl>
+
+!! end
+
+
+!! test
+Definition Lists: Mixed Lists: Test 9
+!! input
+*;foo :bar
+!! result
+<ul><li><dl><dt>foo&#160;</dt><dd>bar
+</dd></dl>
+</li></ul>
+
+!! end
+
+
+!! test
+Definition Lists: Mixed Lists: Test 10
+!! input
+*#;foo :bar
+!! result
+<ul><li><ol><li><dl><dt>foo&#160;</dt><dd>bar
+</dd></dl>
+</li></ol>
+</li></ul>
+
+!! end
+
+
+!! test
+Definition Lists: Mixed Lists: Test 11
+!! input
+*#*#;*;;foo :bar
+*#*#;boo :baz
+!! result
+<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>
+</li></ul>
+</dd></dl>
+<dl><dt>boo&#160;</dt><dd>baz
+</dd></dl>
+</li></ol>
+</li></ul>
+</li></ol>
+</li></ul>
+
+!! end
+
+
+!! test
+Definition Lists: Weird Ones: Test 1
+!! input
+*#;*::;; foo : bar (who uses this?)
+!! result
+<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>
+</dd></dl>
+</dd></dl>
+</li></ul>
+</dd></dl>
+</li></ol>
+</li></ul>
+
+!! end
+
+###
+### External links
+###
+!! test
+External links: non-bracketed
+!! input
+Non-bracketed: http://example.com
+!! result
+<p>Non-bracketed: <a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>
+</p>
+!! end
+
+!! test
+External links: numbered
+!! input
+Numbered: [http://example.com]
+Numbered: [http://example.net]
+Numbered: [http://example.com]
+!! result
+<p>Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[1]</a>
+Numbered: <a rel="nofollow" class="external autonumber" href="http://example.net">[2]</a>
+Numbered: <a rel="nofollow" class="external autonumber" href="http://example.com">[3]</a>
+</p>
+!!end
+
+!! test
+External links: specified text
+!! input
+Specified text: [http://example.com link]
+!! result
+<p>Specified text: <a rel="nofollow" class="external text" href="http://example.com">link</a>
+</p>
+!!end
+
+!! test
+External links: trail
+!! input
+Linktrails should not work for external links: [http://example.com link]s
+!! result
+<p>Linktrails should not work for external links: <a rel="nofollow" class="external text" href="http://example.com">link</a>s
+</p>
+!! end
+
+!! test
+External links: dollar sign in URL
+!! input
+http://example.com/1$2345
+!! result
+<p><a rel="nofollow" class="external free" href="http://example.com/1$2345">http://example.com/1$2345</a>
+</p>
+!! end
+
+!! test
+External links: dollar sign in URL (named)
+!! input
+[http://example.com/1$2345]
+!! result
+<p><a rel="nofollow" class="external autonumber" href="http://example.com/1$2345">[1]</a>
+</p>
+!!end
+
+!! test
+External links: open square bracket forbidden in URL (bug 4377)
+!! input
+http://example.com/1[2345
+!! result
+<p><a rel="nofollow" class="external free" href="http://example.com/1">http://example.com/1</a>[2345
+</p>
+!! end
+
+!! test
+External links: open square bracket forbidden in URL (named) (bug 4377)
+!! input
+[http://example.com/1[2345]
+!! result
+<p><a rel="nofollow" class="external text" href="http://example.com/1">[2345</a>
+</p>
+!!end
+
+!! test
+External links: nowiki in URL link text (bug 6230)
+!!input
+[http://example.com/ <nowiki>''example site''</nowiki>]
+!! result
+<p><a rel="nofollow" class="external text" href="http://example.com/">''example site''</a>
+</p>
+!! end
+
+!! test
+External links: newline forbidden in text (bug 6230 regression check)
+!! input
+[http://example.com/ first
+second]
+!! result
+<p>[<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a> first
+second]
+</p>
+!!end
+
+!! test
+External links: Pipe char between url and text
+!! input
+[http://example.com | link]
+!! result
+<p><a rel="nofollow" class="external text" href="http://example.com">| link</a>
+</p>
+!!end
+
+!! test
+External links: protocol-relative URL in brackets
+!! input
+[//example.com/ Test]
+!! result
+<p><a rel="nofollow" class="external text" href="//example.com/">Test</a>
+</p>
+!! end
+
+!! test
+External links: protocol-relative URL in brackets without text
+!! input
+[//example.com]
+!! result
+<p><a rel="nofollow" class="external autonumber" href="//example.com">[1]</a>
+</p>
+!! end
+
+!! test
+External links: protocol-relative URL in free text is left alone
+!! input
+//example.com/Foo
+!! result
+<p>//example.com/Foo
 </p>
 !!end
 
@@ -1831,6 +2432,15 @@ http:/example.com
 </p>
 !! end
 
+!! test
+Bracketed external links with template-generated invalid target
+!! input
+[{{echo|http:/example.com}} title]
+!! result
+<p>[http:/example.com title]
+</p>
+!! end
+
 !! test
 Bug 2702: Mismatched <i>, <b> and <a> tags are invalid
 !! input
@@ -2002,6 +2612,33 @@ http://[2404:130:0:1000::187:2]/index.php
 </p>
 !! end
 
+!! test
+Non-extlinks in brackets
+!! input
+[foo]
+[foo bar]
+[foo ''bar'']
+[fool's] errand
+[fool's errand]
+[{{echo|foo}}]
+[{{echo|foo}} bar]
+[{{echo|foo}} ''bar'']
+[{{echo|foo}}l's] errand
+[{{echo|foo}}l's errand]
+!! result
+<p>[foo]
+[foo bar]
+[foo <i>bar</i>]
+[fool's] errand
+[fool's errand]
+[foo]
+[foo bar]
+[foo <i>bar</i>]
+[fool's] errand
+[fool's errand]
+</p>
+!! end
+
 ###
 ### Quotes
 ###
@@ -2076,7 +2713,7 @@ A table with no data.
 # this as <p>caption</p>
 !! test
 A table with nothing but a caption
-!! input 
+!! input
 {|
 |+ caption
 |}
@@ -2088,26 +2725,69 @@ A table with nothing but a caption
 !! end
 
 !! test
-Simple table
+Table td-cell syntax variations
 !! input
-{| 
-| 1 || 2
-|- 
-| 3 || 4
+{|
+| foo bar foo | baz
+| foo bar foo || baz
+| style='color:red;' | baz
+| style='color:red;' || baz
 |}
 !! result
 <table>
 <tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
+<td> baz
+</td>
+<td> foo bar foo </td>
+<td> baz
+</td>
+<td style="color:red;"> baz
+</td>
+<td> style='color:red;' </td>
+<td> baz
+</td></tr></table>
+
+!! end
+
+!! test
+Simple table
+!! input
+{|
+| 1 || 2
+|-
+| 3 || 4
+|}
+!! result
+<table>
+<tr>
+<td> 1 </td>
+<td> 2
+</td></tr>
+<tr>
+<td> 3 </td>
 <td> 4
 </td></tr></table>
 
 !! end
 
+!! test
+Simple table but with multiple dashes for row wikitext
+!! input
+{|
+| foo
+|-----
+| bar
+|}
+!! result
+<table>
+<tr>
+<td> foo
+</td></tr>
+<tr>
+<td> bar
+</td></tr></table>
+
+!! end
 !! test
 Multiplication table
 !! input
@@ -2179,16 +2859,118 @@ Multiplication table
 
 !! end
 
+!! test
+Accept "||" in table headings
+!! input
+{|
+!h1 || h2
+|}
+!! result
+<table>
+<tr>
+<th>h1 </th>
+<th> h2
+</th></tr></table>
+
+!! end
+
+!! test
+Accept "||" in indented table headings
+!! input
+:{|
+!h1 || h2
+|}
+!! result
+<dl><dd><table>
+<tr>
+<th>h1 </th>
+<th> h2
+</th></tr></table></dd></dl>
+
+!! end
+
+!! test
+Accept empty attributes in td/th cells (td/th cells starting with leading ||)
+!! input
+{|
+!| h1
+|| a
+|}
+!! result
+<table>
+<tr>
+<th> h1
+</th>
+<td> a
+</td></tr></table>
+
+!! end
+
+!!test
+Accept "| !" at start of line in tables (ignore !-attribute)
+!!input
+{|
+|-
+| !style="color:red" | bar
+|}
+!!result
+<table>
+
+<tr>
+<td> bar
+</td></tr></table>
+
+!!end
+
+!!test
+Allow +/- in 2nd and later cells in a row, in 1st cell when td-attrs are present, or in 1st cell when there is a space between "|" and +/- 
+!!input
+{|
+|-
+|style='color:red;'|+1
+|style='color:blue;'|-1
+|-
+| 1 || 2 || 3
+| 1 ||+2 ||-3
+|-
+| +1
+| -1
+|}
+!!result
+<table>
+
+<tr>
+<td style="color:red;">+1
+</td>
+<td style="color:blue;">-1
+</td></tr>
+<tr>
+<td> 1 </td>
+<td> 2 </td>
+<td> 3
+</td>
+<td> 1 </td>
+<td>+2 </td>
+<td>-3
+</td></tr>
+<tr>
+<td> +1
+</td>
+<td> -1
+</td></tr></table>
+
+!!end
+
 !! test
 Table rowspan
 !! input
 {| border=1
-| Cell 1, row 1 
-|rowspan=2| Cell 2, row 1 (and 2) 
-| Cell 3, row 1 
-|- 
-| Cell 1, row 2 
-| Cell 3, row 2 
+| Cell 1, row 1
+|rowspan=2| Cell 2, row 1 (and 2)
+| Cell 3, row 1
+|-
+| Cell 1, row 2
+| Cell 3, row 2
 |}
 !! result
 <table border="1">
@@ -2293,6 +3075,55 @@ Indented table markup mixed with indented pre content (proposed in bug 6200)
 
 !! end
 
+!! test
+Template-generated table cell attributes and cell content
+!! input
+{|
+|{{table_attribs}}
+|}
+!! result
+<table>
+<tr>
+<td style="color: red"> Foo
+</td></tr></table>
+
+!! end
+
+!! test
+Table with row followed by newlines and table heading
+!! input
+{|
+|-
+
+! foo
+|}
+!! result
+<table>
+
+
+<tr>
+<th> foo
+</th></tr></table>
+
+!! end
+
+# FIXME: Preserve the attribute properly (with an empty string as value) in
+# the PHP parser. Parsoid implements the behavior below.
+!! test
+Table attributes with empty value
+!! options
+disabled
+!! input
+{|
+| style=| hello
+|}
+!! result
+<table>
+<tr>
+<td style=""> hello
+</td></tr></table>
+
+!! end
 
 ###
 ### Internal links
@@ -2378,6 +3209,15 @@ Link with suffix
 </p>
 !! end
 
+!! test
+Link with HTML entity in suffix / tail
+!! input
+[[Main Page]]&quot;, [[Main Page]]&#97;
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>&quot;, <a href="/wiki/Main_Page" title="Main Page">Main Page</a>&#97;
+</p>
+!! end
+
 !! test
 Link with 3 brackets
 !! input
@@ -2574,6 +3414,18 @@ Plain link to protocol-relative URL with link text
 </p>
 !! end
 
+!! test
+Plain link to page with question mark in title
+!! input
+[[A?b]]
+
+[[A?b|Baz]]
+!! result
+<p><a href="/wiki/A%3Fb" title="A?b">A?b</a>
+</p><p><a href="/wiki/A%3Fb" title="A?b">Baz</a>
+</p>
+!! end
+
 
 # I'm fairly sure the expected result here is wrong.
 # We want these to be URL links, not pseudo-pages with URLs for titles....
@@ -2816,6 +3668,16 @@ Blah blah blah
 </p>
 !! end
 
+!! test
+Parsoid-specific test: Wikilinks with &nbsp; should RT properly
+!! options
+language=ln
+!! input
+[[WW&nbsp;II]]
+!!result
+<p><a href="/index.php?title=WW_II&amp;action=edit&amp;redlink=1" class="new" title="WW II (lonkásá  ezalí tɛ̂)">WW&#160;II</a>
+</p>
+!! end
 
 ##
 ## XHTML tidiness
@@ -2830,6 +3692,15 @@ Blah blah blah
 </p>
 !! end
 
+!! test
+Broken br tag sanitization
+!! input
+</br>
+!! result
+<p>&lt;/br&gt;
+</p>
+!! end
+
 !! test
 Incorrecly removing closing slashes from correctly formed XHTML
 !! input
@@ -2839,7 +3710,7 @@ Incorrecly removing closing slashes from correctly formed XHTML
 </p>
 !! end
 
-!! test 
+!! test
 Failing to transform badly formed HTML into correct XHTML
 !! input
 <br style="clear: left;">
@@ -2852,6 +3723,47 @@ Failing to transform badly formed HTML into correct XHTML
 </p>
 !!end
 
+!! test
+Handling html with a div self-closing tag
+!! input
+<div title />
+<div title/>
+<div title/ >
+<div title=bar />
+<div title=bar/>
+<div title=bar/ >
+!! result
+<p>&lt;div title /&gt;
+&lt;div title/&gt;
+</p>
+<div>
+<p>&lt;div title=bar /&gt;
+&lt;div title=bar/&gt;
+</p>
+<div title="bar/"></div>
+</div>
+
+!! end
+
+!! test
+Handling html with a br self-closing tag
+!! input
+<br title />
+<br title/>
+<br title/ >
+<br title=bar />
+<br title=bar/>
+<br title=bar/ >
+!! result
+<p><br title="title" />
+<br title="title" />
+<br />
+<br title="bar" />
+<br title="bar" />
+<br title="bar/" />
+</p>
+!! end
+
 !! test
 Horizontal ruler (should it add that extra space?)
 !! input
@@ -2904,6 +3816,15 @@ Horizontal ruler -- <4 dashes render as plain text
 </p>
 !! end
 
+!! test
+Horizontal ruler -- Supports content following dashes on same line
+!! input
+---- Foo
+!! result
+<hr /> Foo
+
+!! end
+
 ###
 ### Block-level elements
 ###
@@ -3094,6 +4015,31 @@ Nested lists 8 (multiple nesting transitions)
 
 !! end
 
+!! test
+1. Lists with start-of-line-transparent tokens before bullets: Comments
+!! input
+*foo
+*<!--cmt-->bar
+<!--cmt-->*baz
+!! result
+<ul><li>foo
+</li><li>bar
+</li><li>baz
+</li></ul>
+
+!! end
+
+!! test
+2. Lists with start-of-line-transparent tokens before bullets: Template close
+!! input
+*foo {{echo|bar
+}}*baz
+!! result
+<ul><li>foo bar
+</li><li>baz
+</li></ul>
+
+!! end
 
 !! test
 List items are not parsed correctly following a <pre> block (bug 785)
@@ -3159,6 +4105,20 @@ List interrupted by empty line or heading
 
 !!end
 
+!!test
+Multiple list tags generated by templates
+!!input
+{{echo|<li>}}a
+{{echo|<li>}}b
+{{echo|<li>}}c
+!!result
+<li>a
+<li>b
+<li>c</li>
+</li>
+</li>
+
+!!end
 
 ###
 ### Magic Words
@@ -3513,3675 +4473,5198 @@ Namespace File {{ns:Image}}
 !! result
 <p>File
 </p>
-!! end
+!! end
+
+!! test
+Namespace (lang=de) Benutzer {{ns:User}}
+!! options
+language=de
+!! input
+{{ns:User}}
+!! result
+<p>Benutzer
+</p>
+!! end
+
+!! test
+Namespace (lang=de) Benutzer Diskussion {{ns:3}}
+!! options
+language=de
+!! input
+{{ns:3}}
+!! result
+<p>Benutzer Diskussion
+</p>
+!! end
+
+
+!! test
+Urlencode
+!! input
+{{urlencode:hi world?!}}
+{{urlencode:hi world?!|WIKI}}
+{{urlencode:hi world?!|PATH}}
+{{urlencode:hi world?!|QUERY}}
+!! result
+<p>hi+world%3F%21
+hi_world%3F!
+hi%20world%3F%21
+hi+world%3F%21
+</p>
+!! end
+
+###
+### Magic links
+###
+!! test
+Magic links: internal link to RFC (bug 479)
+!! input
+[[RFC 123]]
+!! result
+<p><a href="/index.php?title=RFC_123&amp;action=edit&amp;redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
+</p>
+!! end
+
+!! test
+Magic links: RFC (bug 479)
+!! input
+RFC 822
+!! result
+<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc822">RFC 822</a>
+</p>
+!! end
+
+!! test
+Magic links: ISBN (bug 1937)
+!! input
+ISBN 0-306-40615-2
+!! result
+<p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
+</p>
+!! end
+
+!! test
+Magic links: PMID incorrectly converts space to underscore
+!! input
+PMID 1234
+!! result
+<p><a class="external mw-magiclink-pmid" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
+</p>
+!! end
+
+###
+### Templates
+####
+
+!! test
+Nonexistent template
+!! input
+{{thistemplatedoesnotexist}}
+!! result
+<p><a href="/index.php?title=Template:Thistemplatedoesnotexist&amp;action=edit&amp;redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a>
+</p>
+!! end
+
+!! test
+Template with invalid target containing tags
+!! input
+{{a<b>b</b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
+!! result
+<p>{{a<b>b</b>|foo|a=b|a = b}}
+</p>
+!! end
+
+!! test
+Template with invalid target containing unclosed tag
+!! input
+{{a<b>|{{echo|foo}}|{{echo|a}}={{echo|b}}|a = b}}
+!! result
+<p>{{a<b>|foo|a=b|a = b}}</b>
+</p>
+!! end
+
+!! article
+Template:test
+!! text
+This is a test template
+!! endarticle
+
+!! test
+Simple template
+!! input
+{{test}}
+!! result
+<p>This is a test template
+</p>
+!! end
+
+!! test
+Template with explicit namespace
+!! input
+{{Template:test}}
+!! result
+<p>This is a test template
+</p>
+!! end
+
+
+!! article
+Template:paramtest
+!! text
+This is a test template with parameter {{{param}}}
+!! endarticle
+
+!! test
+Template parameter
+!! input
+{{paramtest|param=foo}}
+!! result
+<p>This is a test template with parameter foo
+</p>
+!! end
+
+!! article
+Template:paramtestnum
+!! text
+[[{{{1}}}|{{{2}}}]]
+!! endarticle
+
+!! test
+Template unnamed parameter
+!! input
+{{paramtestnum|Main Page|the main page}}
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">the main page</a>
+</p>
+!! end
+
+!! article
+Template:templatesimple
+!! text
+(test)
+!! endarticle
+
+!! article
+Template:templateredirect
+!! text
+#redirect [[Template:templatesimple]]
+!! endarticle
+
+!! article
+Template:templateasargtestnum
+!! text
+{{{{{1}}}}}
+!! endarticle
+
+!! article
+Template:templateasargtest
+!! text
+{{template{{{templ}}}}}
+!! endarticle
+
+!! article
+Template:templateasargtest2
+!! text
+{{{{{templ}}}}}
+!! endarticle
+
+!! test
+Template with template name as unnamed argument
+!! input
+{{templateasargtestnum|templatesimple}}
+!! result
+<p>(test)
+</p>
+!! end
+
+!! test
+Template with template name as argument
+!! input
+{{templateasargtest|templ=simple}}
+!! result
+<p>(test)
+</p>
+!! end
+
+!! test
+Template with template name as argument (2)
+!! input
+{{templateasargtest2|templ=templatesimple}}
+!! result
+<p>(test)
+</p>
+!! end
+
+!! article
+Template:templateasargtestdefault
+!! text
+{{{{{templ|templatesimple}}}}}
+!! endarticle
+
+!! article
+Template:templa
+!! text
+'''templ'''
+!! endarticle
+
+!! test
+Template with default value
+!! input
+{{templateasargtestdefault}}
+!! result
+<p>(test)
+</p>
+!! end
+
+!! test
+Template with default value (value set)
+!! input
+{{templateasargtestdefault|templ=templa}}
+!! result
+<p><b>templ</b>
+</p>
+!! end
+
+!! test
+Template redirect
+!! input
+{{templateredirect}}
+!! result
+<p>(test)
+</p>
+!! end
+
+!! test
+Template with argument in separate line
+!! input
+{{ templateasargtest  |
+ templ = simple }}
+!! result
+<p>(test)
+</p>
+!! end
+
+!! test
+Template with complex template as argument
+!! input
+{{paramtest|
+  param ={{ templateasargtest  |
+ templ = simple }}}}
+!! result
+<p>This is a test template with parameter (test)
+</p>
+!! end
+
+!! test
+Template with thumb image (with link in description)
+!! input
+{{paramtest|
+  param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
+!! result
+This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a>  <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
+
+!! end
+
+!! article
+Template:complextemplate
+!! text
+{{{1}}} {{paramtest|
+  param ={{{param}}}}}
+!! endarticle
+
+!! test
+Template with complex arguments
+!! input
+{{complextemplate|
+  param ={{ templateasargtest  |
+ templ = simple }}|[[Template:complextemplate|link]]}}
+!! result
+<p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test)
+</p>
+!! end
+
+!! test
+BUG 553: link with two variables in a piped link
+!! input
+{|
+|[[{{{1}}}|{{{2}}}]]
+|}
+!! result
+<table>
+<tr>
+<td>[[{{{1}}}|{{{2}}}]]
+</td></tr></table>
+
+!! end
+
+!! test
+Magic variable as template parameter
+!! input
+{{paramtest|param={{SITENAME}}}}
+!! result
+<p>This is a test template with parameter MediaWiki
+</p>
+!! end
+
+!! article
+Template:linktest
+!! text
+[[{{{param}}}|link]]
+!! endarticle
+
+!! test
+Template parameter as link source
+!! input
+{{linktest|param=Main Page}}
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">link</a>
+</p>
+!! end
+
+!!test
+Template-generated attribute string (k='v')
+!!input
+<span {{attr_str|id|v1}}>bar</span>
+!!result
+<p><span id="v1">bar</span>
+</p>
+!!end
+
+!!article
+Template:paramtest2
+!! text
+including another template, {{paramtest|param={{{arg}}}}}
+!! endarticle
+
+!! test
+Template passing argument to another template
+!! input
+{{paramtest2|arg='hmm'}}
+!! result
+<p>including another template, This is a test template with parameter 'hmm'
+</p>
+!! end
+
+!! article
+Template:Linktest2
+!! text
+Main Page
+!! endarticle
+
+!! test
+Template as link source
+!! input
+[[{{linktest2}}]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+</p>
+!! end
+
+
+!! article
+Template:loop1
+!! text
+{{loop2}}
+!! endarticle
+
+!! article
+Template:loop2
+!! text
+{{loop1}}
+!! endarticle
+
+!! test
+Template infinite loop
+!! input
+{{loop1}}
+!! result
+<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
+</p>
+!! end
+
+!! test
+Template from main namespace
+!! input
+{{:Main Page}}
+!! result
+<p>blah blah
+</p>
+!! end
+
+!! article
+Template:table
+!! text
+{|
+| 1 || 2
+|-
+| 3 || 4
+|}
+!! endarticle
+
+!! test
+BUG 529: Template with table, not included at beginning of line
+!! input
+foo {{table}}
+!! result
+<p>foo 
+</p>
+<table>
+<tr>
+<td> 1 </td>
+<td> 2
+</td></tr>
+<tr>
+<td> 3 </td>
+<td> 4
+</td></tr></table>
+
+!! end
+
+!! test
+BUG 523: Template shouldn't eat newline (or add an extra one before table)
+!! input
+foo
+{{table}}
+!! result
+<p>foo
+</p>
+<table>
+<tr>
+<td> 1 </td>
+<td> 2
+</td></tr>
+<tr>
+<td> 3 </td>
+<td> 4
+</td></tr></table>
+
+!! end
+
+!! test
+BUG 41: Template parameters shown as broken links
+!! input
+{{{parameter}}}
+!! result
+<p>{{{parameter}}}
+</p>
+!! end
+
+!! test
+Template with targets containing wikilinks
+!! input
+{{[[foo]]}}
+
+{{[[{{echo|foo}}]]}}
+
+{{{{echo|[[foo}}]]}}
+!! result
+<p>{{<a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
+</p><p>{{<a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">foo</a>}}
+</p><p>{{[[foo}}]]
+</p>
+!! end
+
+!! article
+Template:MSGNW test
+!! text
+''None'' of '''this''' should be 
+* interpreted
+ but rather passed unmodified
+{{test}}
+!! endarticle
+
+# hmm, fix this or just deprecate msgnw and document its behavior?
+!! test
+msgnw keyword
+!! options
+disabled
+!! input
+{{msgnw:MSGNW test}}
+!! result
+<p>''None'' of '''this''' should be 
+* interpreted
+ but rather passed unmodified
+{{test}}
+</p>
+!! end
+
+!! test
+int keyword
+!! input
+{{int:youhavenewmessages|lots of money|not!}}
+!! result
+<p>You have lots of money (not!).
+</p>
+!! end
+
+!! article
+Template:Includes
+!! text
+Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
+!! endarticle
+
+!! test
+<includeonly> and <noinclude> being included
+!! input
+{{Includes}}
+!! result
+<p>Foobar
+</p>
+!! end
+
+!! article
+Template:Includes2
+!! text
+<onlyinclude>Foo</onlyinclude>bar
+!! endarticle
+
+!! test
+<onlyinclude> being included
+!! input
+{{Includes2}}
+!! result
+<p>Foo
+</p>
+!! end
+
+
+!! article
+Template:Includes3
+!! text
+<onlyinclude>Foo</onlyinclude>bar<includeonly>zar</includeonly>
+!! endarticle
+
+!! test
+<onlyinclude> and <includeonly> being included
+!! input
+{{Includes3}}
+!! result
+<p>Foo
+</p>
+!! end
+
+!! test
+<includeonly> and <noinclude> on a page
+!! input
+Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
+!! result
+<p>Foozar
+</p>
+!! end
+
+!! test
+Un-closed <noinclude>
+!! input
+<noinclude>
+!! result
+!! end
+
+!! test
+<onlyinclude> on a page
+!! input
+<onlyinclude>Foo</onlyinclude>bar
+!! result
+<p>Foobar
+</p>
+!! end
+
+!! test
+Un-closed <onlyinclude>
+!! input
+<onlyinclude>
+!! result
+!! end
+
+!!test
+Self-closed noinclude, includeonly, onlyinclude tags
+!!input
+<noinclude />
+<includeonly />
+<onlyinclude />
+!!result
+<p><br />
+</p>
+!!end
+
+!!test
+Unbalanced includeonly and noinclude tags
+!!input
+{|
+|a</noinclude>
+|b</noinclude></noinclude>
+|c</noinclude></includeonly>
+|d</includeonly></includeonly>
+|}
+!!result
+<table>
+<tr>
+<td>a
+</td>
+<td>b
+</td>
+<td>c&lt;/includeonly&gt;
+</td>
+<td>d&lt;/includeonly&gt;&lt;/includeonly&gt;
+</td></tr></table>
+
+!!end
+
+!! article
+Template:Includeonly section
+!! text
+<includeonly>
+==Includeonly section==
+</includeonly>
+==Section T-1==
+!!endarticle
+
+!! test
+Bug 6563: Edit link generation for section shown by <includeonly>
+!! input
+{{includeonly section}}
+!! result
+<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Includeonly_section">Includeonly section</span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Section_T-1">Section T-1</span></h2>
+
+!! end
+
+# Uses same input as the contents of [[Template:Includeonly section]]
+!! test
+Bug 6563: Section extraction for section shown by <includeonly>
+!! options
+section=T-2
+!! input
+<includeonly>
+==Includeonly section==
+</includeonly>
+==Section T-2==
+!! result
+==Section T-2==
+!! end
+
+!! test
+Bug 6563: Edit link generation for section suppressed by <includeonly>
+!! input
+<includeonly>
+==Includeonly section==
+</includeonly>
+==Section 1==
+!! result
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
+
+!! end
+
+!! test
+Bug 6563: Section extraction for section suppressed by <includeonly>
+!! options
+section=1
+!! input
+<includeonly>
+==Includeonly section==
+</includeonly>
+==Section 1==
+!! result
+==Section 1==
+!! end
+
+!! test
+Un-closed <includeonly>
+!! input
+<includeonly>
+!! result
+!! end
+
+###
+### <includeonly> and <noinclude> in attributes
+###
+!!test
+0. includeonly around the entire attribute
+!!input
+<span <includeonly>id="v1"</includeonly><noinclude>id="v2"</noinclude>>bar</span>
+!!result
+<p><span id="v2">bar</span>
+</p>
+!!end
+
+!!test
+1. includeonly in html attr key
+!!input
+<span <noinclude>id</noinclude><includeonly>about</includeonly>="foo">bar</span>
+!!result
+<p><span id="foo">bar</span>
+</p>
+!!end
+
+!!test
+2. includeonly in html attr value
+!!input
+<span id="<noinclude>v1</noinclude><includeonly>v2</includeonly>">bar</span>
+<span id=<noinclude>"v1"</noinclude><includeonly>"v2"</includeonly>>bar</span>
+!!result
+<p><span id="v1">bar</span>
+<span id="v1">bar</span>
+</p>
+!!end
+
+!!test
+3. includeonly in part of an attr value
+!!input
+<span style="color:<noinclude>red</noinclude><includeonly>blue</includeonly>;">bar</span>
+!!result
+<p><span style="color:red;">bar</span>
+</p>
+!!end
+
+###
+### Testing parsing of templates where a template arg
+### has the same name as the template itself.
+###
+
+!! article
+Template:quote
+!! text
+{{{quote|{{{1}}}}}}
+!! endarticle
+
+!!test
+Templates: Template Name/Arg clash: 1. Use of positional param
+!!input
+{{quote|foo}}
+!!result
+<p>foo
+</p>
+!!end
+
+!!test
+Templates: Template Name/Arg clash: 2. Use of named param
+!!input
+{{quote|quote=foo}}
+!!result
+<p>foo
+</p>
+!!end
+
+!!test
+Templates: Template Name/Arg clash: 3. Use of named param with empty input
+!!input
+{{quote|quote}}
+!!result
+<p>quote
+</p>
+!!end
+
+###
+### Parsoid-centric tests to stress Parsoid's ability to RT them unchanged
+###
+
+!!test
+Templates: 1. Simple use
+!!input
+{{echo|Foo}}
+!!result
+<p>Foo
+</p>
+!!end
+
+!!test
+Templates: 2. Inside a block tag
+!!input
+<div>{{echo|Foo}}</div>
+!!result
+<div>Foo</div>
+
+!!end
+
+!!test
+Templates: P-wrapping: 1a. Templates on consecutive lines
+!!input
+{{echo|Foo}}
+{{echo|bar}}
+!!result
+<p>Foo
+bar
+</p>
+!!end
+
+!!test
+Templates: P-wrapping: 1b. Templates on consecutive lines
+!!input
+Foo
+
+{{echo|bar}}
+{{echo|baz}}
+!!result
+<p>Foo
+</p><p>bar
+baz
+</p>
+!!end
+
+!!test
+Templates: P-wrapping: 1c. Templates on consecutive lines
+!!input
+{{echo|Foo}}
+{{echo|bar}} <div>baz</div>
+!!result
+<p>Foo
+</p>
+bar <div>baz</div>
+
+!!end
+
+!!test
+Templates: Inline Text: 1. Multiple tmeplate uses
+!!input
+{{echo|Foo}}bar{{echo|baz}}
+!!result
+<p>Foobarbaz
+</p>
+!!end
+
+!!test
+Templates: Inline Text: 2. Back-to-back template uses
+!!input
+{{echo|Foo}}{{echo|bar}}
+!!result
+<p>Foobar
+</p>
+!!end
+
+!!test
+Templates: Block Tags: 1. Multiple template uses
+!!input
+{{echo|<div>Foo</div>}}<div>bar</div>{{echo|<div>baz</div>}}
+!!result
+<div>Foo</div><div>bar</div><div>baz</div>
+
+!!end
+
+!!test
+Templates: Block Tags: 2. Back-to-back template uses
+!!input
+{{echo|<div>Foo</div>}}{{echo|<div>bar</div>}}
+!!result
+<div>Foo</div><div>bar</div>
+
+!!end
+
+!!test
+Templates: Links: 1. Simple example
+!!input
+{{echo|[[Foo|bar]]}}
+!!result
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p>
+!!end
+
+!!test
+Templates: Links: 2. Generation of link href
+!!input
+[[{{echo|Foo}}|bar]]
+!!result
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p>
+!!end
+
+!!test
+Templates: Links: 3. Generation of part of a link href
+!!input
+[[Fo{{echo|o}}|bar]]
+!!result
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p>
+!!end
+
+!!test
+Templates: Links: 4. Multiple templates generating link href
+!!input
+[[{{echo|F}}{{echo|o}}ob{{echo|ar}}]]
+!!result
+<p><a href="/index.php?title=Foobar&amp;action=edit&amp;redlink=1" class="new" title="Foobar (page does not exist)">Foobar</a>
+</p>
+!!end
+
+!!test
+Templates: Links: 5. Generation of link text
+!!input
+[[Foo|{{echo|bar}}]]
+!!result
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p>
+!!end
+
+!!test
+Templates: Links: 5. Nested templates (only outermost template should be marked)
+!!input
+{{echo|[[{{echo|Foo}}|bar]]}}
+!!result
+<p><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">bar</a>
+</p>
+!!end
+
+!!test
+Templates: HTML Tag: 1. Generation of HTML attr. key
+!!input
+<div {{echo|style}}="color:red;">foo</div>
+!!result
+<div style="color:red;">foo</div>
+
+!!end
+
+!!test
+Templates: HTML Tag: 2. Generation of HTML attr. value
+!!input
+<div style={{echo|'color:red;'}}>foo</div>
+!!result
+<div style="color:red;">foo</div>
+
+!!end
+
+!!test
+Templates: HTML Tag: 3. Generation of HTML attr key and value
+!!input
+<div {{echo|style}}={{echo|'color:red;'}}>foo</div>
+!!result
+<div style="color:red;">foo</div>
+
+!!end
+
+!!test
+Templates: HTML Tag: 4. Generation of starting piece of HTML attr value
+!!input
+<div title="{{echo|This is a long title}} with just one piece templated">foo</div>
+!!result
+<div title="This is a long title with just one piece templated">foo</div>
+
+!!end
+
+!!test
+Templates: HTML Tag: 5. Generation of middle piece of HTML attr value
+!!input
+<div title="This is a long title with just {{echo|one piece}} templated">foo</div>
+!!result
+<div title="This is a long title with just one piece templated">foo</div>
+
+!!end
+
+!!test
+Templates: HTML Tag: 6. Generation of end piece of HTML attr value
+!!input
+<div title="This is a long title with just one piece {{echo|templated}}">foo</div>
+!!result
+<div title="This is a long title with just one piece templated">foo</div>
+
+!!end
+
+!!test
+Templates: HTML Tables: 1. Generating start of a HTML table
+!!input
+{{echo|<table><tr><td>foo</td>}}</tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 2a. Generating middle of a HTML table
+!!input
+<table><tr>{{echo|<td>foo</td>}}</tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 2b. Generating middle of a HTML table
+!!input
+<table>{{echo|<tr><td>foo</td></tr>}}</table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 3. Generating end of a HTML table
+!!input
+<table><tr>{{echo|<td>foo</td></tr></table>}}
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4a. Generating a single tag of a HTML table
+!!input
+{{echo|<table>}}<tr><td>foo</td></tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4b. Generating a single tag of a HTML table
+!!input
+<table>{{echo|<tr>}}<td>foo</td></tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4c. Generating a single tag of a HTML table
+!!input
+<table><tr>{{echo|<td>}}foo</td></tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4d. Generating a single tag of a HTML table
+!!input
+<table><tr><td>foo{{echo|</td>}}</tr></table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4e. Generating a single tag of a HTML table
+!!input
+<table><tr><td>foo</td>{{echo|</tr>}}</table>
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: HTML Tables: 4f. Generating a single tag of a HTML table
+!!input
+<table><tr><td>foo</td></tr>{{echo|</table>}}
+!!result
+<table><tr><td>foo</td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 1. Fostering of entire template content
+!!input
+{|
+{{echo|a}}
+|}
+!!result
+<table>
+a
+<tr><td></td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 2. Fostering of partial template content
+!!input
+{|
+{{echo|a
+<div>b</div>}}
+|}
+!!result
+<table>
+a
+<div>b</div>
+<tr><td></td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 3. td-content via multiple templates
+!!input
+{|
+{{echo|{{pipe}}a}}{{echo|b}}
+|}
+!!result
+<table>
+<tr>
+<td>ab
+</td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 4. Templated tags, no content
+!!input
+{{tbl-start}}
+{{tbl-end}}
+!!result
+<table>
+<tr><td></td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 4. Templated tags, regular td-tags
+!!input
+{{tbl-start}}
+|foo
+{{tbl-end}}
+!!result
+<table>
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Templates: Wiki Tables: 4. Templated tags, templated td-tags
+!!input
+{{tbl-start}}
+{{!}}foo
+{{tbl-end}}
+!!result
+<table>
+<tr>
+<td>foo
+</td></tr></table>
+
+!!end
+
+!!test
+Templates: Lists: Multi-line list-items via templates
+!!input
+*{{echo|a {{nonexistent|
+unused}}}}
+*{{echo|b {{nonexistent|
+unused}}}}
+!!result
+<ul><li>a <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
+</li><li>b <a href="/index.php?title=Template:Nonexistent&amp;action=edit&amp;redlink=1" class="new" title="Template:Nonexistent (page does not exist)">Template:Nonexistent</a>
+</li></ul>
+
+!!end
+
+!!test
+Templates: Ugly nesting: 1. Quotes opened/closed across templates (echo)
+!!input
+{{echo|''a}}{{echo|b''c''d}}{{echo|''e}}
+!!result
+<p><i>ab</i>c<i>d</i>e
+</p>
+!!end
 
-!! test
-Namespace (lang=de) Benutzer {{ns:User}}
+!!test
+Templates: Ugly nesting: 2. Quotes opened/closed across templates (echo_with_span)
+(PHP parser generates misnested html)
 !! options
-language=de
-!! input
-{{ns:User}}
-!! result
-<p>Benutzer
-</p>
-!! end
+disabled
+!!input
+{{echo_with_span|''a}}{{echo_with_span|b''c''d}}{{echo_with_span|''e}}
+!!result
+<p><span><i>a</i></span><i><span>b</span></i><span>c</span><i>d</i><span>e</span></p>
+!!end
 
-!! test
-Namespace (lang=de) Benutzer Diskussion {{ns:3}}
+!!test
+Templates: Ugly nesting: 3. Quotes opened/closed across templates (echo_with_div)
+(PHP parser generates misnested html)
 !! options
-language=de
-!! input
-{{ns:3}}
-!! result
-<p>Benutzer Diskussion
-</p>
-!! end
+disabled
+!!input
+{{echo_with_div|''a}}{{echo_with_div|b''c''d}}{{echo_with_div|''e}}
+!!result
+<div><i>a</i></div>
+<div><i>b</i>c<i>d</i></div>
+<div>e</div>
+!!end
 
+!!test
+Templates: Ugly nesting: 4. Divs opened/closed across templates
+!!input
+a<div>b{{echo|c</div>d}}e
+!!result
+a<div>bc</div>de
 
-!! test
-Urlencode
-!! input
-{{urlencode:hi world?!}}
-{{urlencode:hi world?!|WIKI}}
-{{urlencode:hi world?!|PATH}}
-{{urlencode:hi world?!|QUERY}}
-!! result
-<p>hi+world%3F%21
-hi_world%3F!
-hi%20world%3F%21
-hi+world%3F%21
-</p>
-!! end
+!!end
 
-###
-### Magic links
-###
-!! test
-Magic links: internal link to RFC (bug 479)
-!! input
-[[RFC 123]]
-!! result
-<p><a href="/index.php?title=RFC_123&amp;action=edit&amp;redlink=1" class="new" title="RFC 123 (page does not exist)">RFC 123</a>
+!!test
+Templates: Ugly templates: 1. Navbox template parses badly leading to table misnesting
+(Parsoid-centric)
+!! options
+disabled
+!!input
+{|
+|{{echo|foo</table>}}
+|bar
+|}
+!!result
+<table data-parsoid="{&quot;src&quot;:&quot;{|\n|{{echo|foo&lt;/table&gt;}}\n|bar\n|}&quot;}" about="#mwt1" typeof="mw:Object/Template ">
+<tbody><tr><td>foo</td></tr></tbody></table><span about="#mwt1">
+bar</span><span about="#mwt1">
+</span>
+!!end
+
+!!test
+Templates: Ugly templates: 2. Navbox template parses badly leading to table misnesting
+(Parsoid-centric)
+!! options
+disabled
+!!input
+<table>
+  <tr>
+    <td>
+    <table>
+      <tr>
+        <td>1. {{echo|foo </table>}}</td>
+        <td> bar </td>
+        <td>2. {{echo|baz </table>}}</td>
+      </tr>
+      <tr>
+        <td>abc</td>
+      </tr>
+    </table>
+    </td>
+  </tr>
+  <tr>
+    <td>xyz</td>
+  </tr>
+</table>
+!!result
+<table data-parsoid="{&quot;src&quot;:&quot;&lt;table&gt;\n  &lt;tr&gt;\n    &lt;td&gt;\n    &lt;table&gt;\n      &lt;tr&gt;\n        &lt;td&gt;1. {{echo|foo &lt;/table&gt;}}&lt;/td&gt;\n        &lt;td&gt; bar &lt;/td&gt;\n        &lt;td&gt;2. {{echo|baz &lt;/table&gt;}}&lt;/td&gt;\n      &lt;/tr&gt;\n      &lt;tr&gt;\n        &lt;td&gt;abc&lt;/td&gt;\n      &lt;/tr&gt;\n    &lt;/table&gt;\n    &lt;/td&gt;\n  &lt;/tr&gt;\n  &lt;tr&gt;\n    &lt;td&gt;xyz&lt;/td&gt;\n  &lt;/tr&gt;\n&lt;/table&gt;&quot;}" about="#mwt1" typeof="mw:Object/Template">
+  <tbody><tr data-parsoid="{&quot;stx&quot;:&quot;html&quot;}">
+    <td data-parsoid="{&quot;stx&quot;:&quot;html&quot;}">
+    <table data-parsoid="{&quot;stx&quot;:&quot;html&quot;}">
+      <tbody><tr data-parsoid="{&quot;stx&quot;:&quot;html&quot;}">
+        <td data-parsoid="{&quot;stx&quot;:&quot;html&quot;}">1. foo </td></tr></tbody></table></td>
+        <td data-parsoid="{&quot;stx&quot;:&quot;html&quot;}"> bar </td>
+        <td data-parsoid="{&quot;stx&quot;:&quot;html&quot;}">2. baz </td></tr></tbody></table><span about="#mwt1">
+      </span><span about="#mwt1">
+      
+        abc</span><span about="#mwt1">
+      </span><span about="#mwt1">
+    </span><span about="#mwt1">
+    </span><span about="#mwt1">
+  </span><span about="#mwt1">
+  
+    xyz</span><span about="#mwt1">
+  </span><span about="#mwt1">
+</span>
+!!end
+
+!!test
+Parser Functions: 1. Simple example
+!!input
+{{uc:foo}}
+!!result
+<p>FOO
 </p>
-!! end
+!!end
 
-!! test
-Magic links: RFC (bug 479)
-!! input
-RFC 822
-!! result
-<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc822">RFC 822</a>
+!!test
+Parser Functions: 2. Nested use (only outermost should be marked up)
+!!input
+{{uc:{{lc:FOO}}}}
+!!result
+<p>FOO
 </p>
-!! end
+!!end
 
+###
+### Pre-save transform tests
+###
 !! test
-Magic links: ISBN (bug 1937)
+pre-save transform: subst:
+!! options
+PST
 !! input
-ISBN 0-306-40615-2
+{{subst:test}}
 !! result
-<p><a href="/wiki/Special:BookSources/0306406152" class="internal mw-magiclink-isbn">ISBN 0-306-40615-2</a>
-</p>
+This is a test template
 !! end
 
 !! test
-Magic links: PMID incorrectly converts space to underscore
+pre-save transform: normal template
+!! options
+PST
 !! input
-PMID 1234
+{{test}}
 !! result
-<p><a class="external mw-magiclink-pmid" href="//www.ncbi.nlm.nih.gov/pubmed/1234?dopt=Abstract">PMID 1234</a>
-</p>
+{{test}}
 !! end
 
-###
-### Templates
-####
-
 !! test
-Nonexistent template
+pre-save transform: nonexistent template
+!! options
+PST
 !! input
 {{thistemplatedoesnotexist}}
 !! result
-<p><a href="/index.php?title=Template:Thistemplatedoesnotexist&amp;action=edit&amp;redlink=1" class="new" title="Template:Thistemplatedoesnotexist (page does not exist)">Template:Thistemplatedoesnotexist</a>
-</p>
+{{thistemplatedoesnotexist}}
 !! end
 
-!! article
-Template:test
-!! text
-This is a test template
-!! endarticle
-
-!! test
-Simple template
-!! input
-{{test}}
-!! result
-<p>This is a test template
-</p>
-!! end
 
 !! test
-Template with explicit namespace
+pre-save transform: subst magic variables
+!! options
+PST
 !! input
-{{Template:test}}
+{{subst:SITENAME}}
 !! result
-<p>This is a test template
-</p>
+MediaWiki
 !! end
 
-
-!! article
-Template:paramtest
-!! text
-This is a test template with parameter {{{param}}}
-!! endarticle
-
+# This is bug 89, which I fixed. -- wtm
 !! test
-Template parameter
+pre-save transform: subst: templates with parameters
+!! options
+pst
 !! input
-{{paramtest|param=foo}}
+{{subst:paramtest|param="something else"}}
 !! result
-<p>This is a test template with parameter foo
-</p>
+This is a test template with parameter "something else"
 !! end
 
 !! article
-Template:paramtestnum
+Template:nowikitest
 !! text
-[[{{{1}}}|{{{2}}}]]
+<nowiki>'''not wiki'''</nowiki>
 !! endarticle
 
 !! test
-Template unnamed parameter
+pre-save transform: nowiki in subst (bug 1188)
+!! options
+pst
 !! input
-{{paramtestnum|Main Page|the main page}}
+{{subst:nowikitest}}
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">the main page</a>
-</p>
+<nowiki>'''not wiki'''</nowiki>
 !! end
 
-!! article
-Template:templatesimple
-!! text
-(test)
-!! endarticle
-
-!! article
-Template:templateredirect
-!! text
-#redirect [[Template:templatesimple]]
-!! endarticle
-
-!! article
-Template:templateasargtestnum
-!! text
-{{{{{1}}}}}
-!! endarticle
-
-!! article
-Template:templateasargtest
-!! text
-{{template{{{templ}}}}}
-!! endarticle
 
 !! article
-Template:templateasargtest2
+Template:commenttest
 !! text
-{{{{{templ}}}}}
+This template has <!-- a comment --> in it.
 !! endarticle
 
 !! test
-Template with template name as unnamed argument
-!! input
-{{templateasargtestnum|templatesimple}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with template name as argument
-!! input
-{{templateasargtest|templ=simple}}
-!! result
-<p>(test)
-</p>
-!! end
-
-!! test
-Template with template name as argument (2)
+pre-save transform: comment in subst (bug 1936)
+!! options
+pst
 !! input
-{{templateasargtest2|templ=templatesimple}}
+{{subst:commenttest}}
 !! result
-<p>(test)
-</p>
+This template has <!-- a comment --> in it.
 !! end
 
-!! article
-Template:templateasargtestdefault
-!! text
-{{{{{templ|templatesimple}}}}}
-!! endarticle
-
-!! article
-Template:templa
-!! text
-'''templ'''
-!! endarticle
-
 !! test
-Template with default value
+pre-save transform: unclosed tag
+!! options
+pst noxml
 !! input
-{{templateasargtestdefault}}
+<nowiki>'''not wiki'''
 !! result
-<p>(test)
-</p>
+<nowiki>'''not wiki'''
 !! end
 
 !! test
-Template with default value (value set)
+pre-save transform: mixed tag case
+!! options
+pst noxml
 !! input
-{{templateasargtestdefault|templ=templa}}
+<NOwiki>'''not wiki'''</noWIKI>
 !! result
-<p><b>templ</b>
-</p>
+<NOwiki>'''not wiki'''</noWIKI>
 !! end
 
 !! test
-Template redirect
+pre-save transform: unclosed comment in <nowiki>
+!! options
+pst noxml
 !! input
-{{templateredirect}}
+wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
 !! result
-<p>(test)
-</p>
-!! end
+wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
+!!end
 
-!! test
-Template with argument in separate line
+!! article
+Template:dangerous
+!!text
+<span onmouseover="alert('crap')">Oh no</span>
+!!endarticle
+
+!!test
+(confirming safety of fix for subst bug 1936)
 !! input
-{{ templateasargtest  |
- templ = simple }}
+{{Template:dangerous}}
 !! result
-<p>(test)
+<p><span>Oh no</span>
 </p>
 !! end
 
 !! test
-Template with complex template as argument
+pre-save transform: comment containing gallery (bug 5024)
+!! options
+pst
 !! input
-{{paramtest|
-  param ={{ templateasargtest  |
- templ = simple }}}}
-!! result
-<p>This is a test template with parameter (test)
-</p>
-!! end
+<!-- <gallery>data</gallery> -->
+!!result
+<!-- <gallery>data</gallery> -->
+!!end
 
 !! test
-Template with thumb image (with link in description)
+pre-save transform: comment containing extension
+!! options
+pst
 !! input
-{{paramtest|
-  param =[[Image:noimage.png|thumb|[[no link|link]] [[no link|caption]]]]}}
-!! result
-This is a test template with parameter <div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/index.php?title=Special:Upload&amp;wpDestFile=Noimage.png" class="new" title="File:Noimage.png">File:Noimage.png</a>  <div class="thumbcaption"><a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">link</a> <a href="/index.php?title=No_link&amp;action=edit&amp;redlink=1" class="new" title="No link (page does not exist)">caption</a></div></div></div>
-
-!! end
-
-!! article
-Template:complextemplate
-!! text
-{{{1}}} {{paramtest|
-  param ={{{param}}}}}
-!! endarticle
+<!-- <tag>data</tag> -->
+!!result
+<!-- <tag>data</tag> -->
+!!end
 
 !! test
-Template with complex arguments
+pre-save transform: comment containing nowiki
+!! options
+pst
 !! input
-{{complextemplate|
-  param ={{ templateasargtest  |
- templ = simple }}|[[Template:complextemplate|link]]}}
-!! result
-<p><a href="/wiki/Template:Complextemplate" title="Template:Complextemplate">link</a> This is a test template with parameter (test)
-</p>
-!! end
+<!-- <nowiki>data</nowiki> -->
+!!result
+<!-- <nowiki>data</nowiki> -->
+!!end
 
 !! test
-BUG 553: link with two variables in a piped link
+pre-save transform: <noinclude> in subst (bug 3298)
+!! options
+pst
 !! input
-{| 
-|[[{{{1}}}|{{{2}}}]]
-|}
+{{subst:Includes}}
 !! result
-<table>
-<tr>
-<td>[[{{{1}}}|{{{2}}}]]
-</td></tr></table>
-
+Foobar
 !! end
 
 !! test
-Magic variable as template parameter
+pre-save transform: <onlyinclude> in subst (bug 3298)
+!! options
+pst
 !! input
-{{paramtest|param={{SITENAME}}}}
+{{subst:Includes2}}
 !! result
-<p>This is a test template with parameter MediaWiki
-</p>
+Foo
 !! end
 
 !! article
-Template:linktest
+Template:SubstTest
+!!text
+{{<includeonly>subst:</includeonly>Includes}}
+!! endarticle
+
+!! article
+Template:SafeSubstTest
 !! text
-[[{{{param}}}|link]]
+{{<includeonly>safesubst:</includeonly>Includes}}
 !! endarticle
 
 !! test
-Template parameter as link source
+bug 22297: safesubst: works during PST
+!! options
+pst
 !! input
-{{linktest|param=Main Page}}
+{{subst:SafeSubstTest}}{{safesubst:SubstTest}}
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">link</a>
-</p>
+FoobarFoobar
 !! end
 
-
-!!article
-Template:paramtest2
-!! text
-including another template, {{paramtest|param={{{arg}}}}}
-!! endarticle
-
 !! test
-Template passing argument to another template
+bug 22297: safesubst: works during normal parse
 !! input
-{{paramtest2|arg='hmm'}}
+{{SafeSubstTest}}
 !! result
-<p>including another template, This is a test template with parameter 'hmm'
+<p>Foobar
 </p>
 !! end
 
-!! article
-Template:Linktest2
-!! text
-Main Page
-!! endarticle
-
-!! test
-Template as link source
+!! test:
+subst: does not work during normal parse
 !! input
-[[{{linktest2}}]]
+{{SubstTest}}
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+<p>{{subst:Includes}}
 </p>
 !! end
 
-
-!! article
-Template:loop1
-!! text
-{{loop2}}
-!! endarticle
-
-!! article
-Template:loop2
-!! text
-{{loop1}}
-!! endarticle
-
 !! test
-Template infinite loop
+pre-save transform: context links ("pipe trick")
+!! options
+pst
 !! input
-{{loop1}}
+[[Article (context)|]]
+[[Bar:Article|]]
+[[:Bar:Article|]]
+[[Bar:Article (context)|]]
+[[:Bar:Article (context)|]]
+[[|Article]]
+[[|Article (context)]]
+[[Bar:X (Y) Z|]]
+[[:Bar:X (Y) Z|]]
 !! result
-<p><span class="error">Template loop detected: <a href="/wiki/Template:Loop1" title="Template:Loop1">Template:Loop1</a></span>
-</p>
+[[Article (context)|Article]]
+[[Bar:Article|Article]]
+[[:Bar:Article|Article]]
+[[Bar:Article (context)|Article]]
+[[:Bar:Article (context)|Article]]
+[[Article]]
+[[Article (context)]]
+[[Bar:X (Y) Z|X (Y) Z]]
+[[:Bar:X (Y) Z|X (Y) Z]]
 !! end
 
 !! test
-Template from main namespace
+pre-save transform: context links ("pipe trick") with interwiki prefix
+!! options
+pst
 !! input
-{{:Main Page}}
+[[interwiki:Article|]]
+[[:interwiki:Article|]]
+[[interwiki:Bar:Article|]]
+[[:interwiki:Bar:Article|]]
 !! result
-<p>blah blah
-</p>
+[[interwiki:Article|Article]]
+[[:interwiki:Article|Article]]
+[[interwiki:Bar:Article|Bar:Article]]
+[[:interwiki:Bar:Article|Bar:Article]]
 !! end
 
-!! article
-Template:table
-!! text
-{| 
-| 1 || 2
-|- 
-| 3 || 4
-|}
-!! endarticle
+!! test
+pre-save transform: context links ("pipe trick") with parens in title
+!! options
+pst title=[[Somearticle (context)]]
+!! input
+[[|Article]]
+!! result
+[[Article (context)|Article]]
+!! end
 
 !! test
-BUG 529: Template with table, not included at beginning of line
+pre-save transform: context links ("pipe trick") with comma in title
+!! options
+pst title=[[Someplace, Somewhere]]
 !! input
-foo {{table}}
+[[|Otherplace]]
+[[Otherplace, Elsewhere|]]
+[[Otherplace, Elsewhere, Anywhere|]]
 !! result
-<p>foo 
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
+[[Otherplace, Somewhere|Otherplace]]
+[[Otherplace, Elsewhere|Otherplace]]
+[[Otherplace, Elsewhere, Anywhere|Otherplace]]
+!! end
 
+!! test
+pre-save transform: context links ("pipe trick") with parens and comma
+!! options
+pst title=[[Someplace (IGNORED), Somewhere]]
+!! input
+[[|Otherplace]]
+[[Otherplace (place), Elsewhere|]]
+!! result
+[[Otherplace, Somewhere|Otherplace]]
+[[Otherplace (place), Elsewhere|Otherplace]]
 !! end
 
 !! test
-BUG 523: Template shouldn't eat newline (or add an extra one before table)
+pre-save transform: context links ("pipe trick") with comma and parens
+!! options
+pst title=[[Who, me? (context)]]
 !! input
-foo
-{{table}}
+[[|Yes, you.]]
+[[Me, Myself, and I (1937 song)|]]
 !! result
-<p>foo
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-
+[[Yes, you. (context)|Yes, you.]]
+[[Me, Myself, and I (1937 song)|Me, Myself, and I]]
 !! end
 
 !! test
-BUG 41: Template parameters shown as broken links
+pre-save transform: context links ("pipe trick") with namespace
+!! options
+pst title=[[Ns:Somearticle]]
 !! input
-{{{parameter}}}
+[[|Article]]
 !! result
-<p>{{{parameter}}}
-</p>
+[[Ns:Article|Article]]
 !! end
 
-
-!! article
-Template:MSGNW test
-!! text
-''None'' of '''this''' should be 
-* interpreted
- but rather passed unmodified
-{{test}}
-!! endarticle
-
-# hmm, fix this or just deprecate msgnw and document its behavior?
 !! test
-msgnw keyword
+pre-save transform: context links ("pipe trick") with namespace and parens
 !! options
-disabled
+pst title=[[Ns:Somearticle (context)]]
 !! input
-{{msgnw:MSGNW test}}
+[[|Article]]
 !! result
-<p>''None'' of '''this''' should be 
-* interpreted
- but rather passed unmodified
-{{test}}
-</p>
+[[Ns:Article (context)|Article]]
 !! end
 
 !! test
-int keyword
+pre-save transform: context links ("pipe trick") with namespace and comma
+!! options
+pst title=[[Ns:Somearticle, Context, Whatever]]
 !! input
-{{int:youhavenewmessages|lots of money|not!}}
+[[|Article]]
 !! result
-<p>You have lots of money (not!).
-</p>
+[[Ns:Article, Context, Whatever|Article]]
 !! end
 
-!! article
-Template:Includes
-!! text
-Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
-!! endarticle
-
 !! test
-<includeonly> and <noinclude> being included
+pre-save transform: context links ("pipe trick") with namespace, comma and parens
+!! options
+pst title=[[Ns:Somearticle, Context (context)]]
 !! input
-{{Includes}}
+[[|Article]]
 !! result
-<p>Foobar
-</p>
+[[Ns:Article (context)|Article]]
 !! end
 
-!! article
-Template:Includes2
-!! text
-<onlyinclude>Foo</onlyinclude>bar
-!! endarticle
-
 !! test
-<onlyinclude> being included
+pre-save transform: context links ("pipe trick") with namespace, parens and comma
+!! options
+pst title=[[Ns:Somearticle (IGNORED), Context]]
 !! input
-{{Includes2}}
+[[|Article]]
 !! result
-<p>Foo
-</p>
+[[Ns:Article, Context|Article]]
 !! end
 
-
-!! article
-Template:Includes3
-!! text
-<onlyinclude>Foo</onlyinclude>bar<includeonly>zar</includeonly>
-!! endarticle
-
 !! test
-<onlyinclude> and <includeonly> being included
+pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
+!! options
+pst
 !! input
-{{Includes3}}
+[[Article(context)|]]
+[[Bar:Article(context)|]]
+[[:Bar:Article(context)|]]
+[[|Article(context)]]
+[[Bar:X(Y)Z|]]
+[[:Bar:X(Y)Z|]]
 !! result
-<p>Foo
-</p>
+[[Article(context)|Article]]
+[[Bar:Article(context)|Article]]
+[[:Bar:Article(context)|Article]]
+[[Article(context)]]
+[[Bar:X(Y)Z|X(Y)Z]]
+[[:Bar:X(Y)Z|X(Y)Z]]
 !! end
 
 !! test
-<includeonly> and <noinclude> on a page
+pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
+!! options
+pst
 !! input
-Foo<noinclude>zar</noinclude><includeonly>bar</includeonly>
+[[Article (context)|]]
+[[Bar:Article (context)|]]
+[[:Bar:Article (context)|]]
+[[|Article (context)]]
+[[Bar:X (Y) Z|]]
+[[:Bar:X (Y) Z|]]
 !! result
-<p>Foozar
-</p>
+[[Article (context)|Article]]
+[[Bar:Article (context)|Article]]
+[[:Bar:Article (context)|Article]]
+[[Article (context)]]
+[[Bar:X (Y) Z|X (Y) Z]]
+[[:Bar:X (Y) Z|X (Y) Z]]
 !! end
 
 !! test
-<onlyinclude> on a page
+pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
+!! options
+pst
 !! input
-<onlyinclude>Foo</onlyinclude>bar
+[[Article(context)|]]
+[[Bar:Article(context)|]]
+[[:Bar:Article(context)|]]
+[[|Article(context)]]
+[[Bar:X(Y)Z|]]
+[[:Bar:X(Y)Z|]]
 !! result
-<p>Foobar
-</p>
+[[Article(context)|Article]]
+[[Bar:Article(context)|Article]]
+[[:Bar:Article(context)|Article]]
+[[Article(context)]]
+[[Bar:X(Y)Z|X(Y)Z]]
+[[:Bar:X(Y)Z|X(Y)Z]]
 !! end
 
-!! article
-Template:Includeonly section
-!! text
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section T-1==
-!!endarticle
-
 !! test
-Bug 6563: Edit link generation for section shown by <includeonly>
+pre-save transform: context links ("pipe trick") with commas (bug 21660)
+!! options
+pst
 !! input
-{{includeonly section}}
+[[Article (context), context|]]
+[[Article (context),context|]]
+[[Bar:Article (context), context|]]
+[[Bar:Article (context),context|]]
+[[:Bar:Article (context), context|]]
+[[:Bar:Article (context),context|]]
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-1" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Includeonly_section">Includeonly section</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Includeonly_section&amp;action=edit&amp;section=T-2" title="Template:Includeonly section">edit</a>]</span> <span class="mw-headline" id="Section_T-1">Section T-1</span></h2>
+[[Article (context), context|Article]]
+[[Article (context),context|Article]]
+[[Bar:Article (context), context|Article]]
+[[Bar:Article (context),context|Article]]
+[[:Bar:Article (context), context|Article]]
+[[:Bar:Article (context),context|Article]]
+!! end
+
+!! test
+pre-save transform: trim trailing empty lines
+!! options
+pst
+!! input
+Empty lines are trimmed
+
+
 
+
+!! result
+Empty lines are trimmed
 !! end
 
-# Uses same input as the contents of [[Template:Includeonly section]]
 !! test
-Bug 6563: Section extraction for section shown by <includeonly>
+pre-save transform: Signature expansion
 !! options
-section=T-2
+pst
 !! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section T-2==
+* ~~~
+* <noinclude>~~~</noinclude>
+* <includeonly>~~~</includeonly>
+* <onlyinclude>~~~</onlyinclude>
 !! result
-==Section T-2==
+* [[Special:Contributions/127.0.0.1|127.0.0.1]]
+* <noinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</noinclude>
+* <includeonly>[[Special:Contributions/127.0.0.1|127.0.0.1]]</includeonly>
+* <onlyinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</onlyinclude>
 !! end
 
+
 !! test
-Bug 6563: Edit link generation for section suppressed by <includeonly>
+pre-save transform: Signature expansion in nowiki tags (bug 93)
+!! options
+pst disabled
 !! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section 1==
+Shall not expand:
+
+<nowiki>~~~~</nowiki>
+
+<includeonly><nowiki>~~~~</nowiki></includeonly>
+
+<noinclude><nowiki>~~~~</nowiki></noinclude>
+
+<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>
+
+{{subst:Foo}} shall be converted to FOO
+
+As well as inside noinclude/onlyinclude
+<noinclude>{{subst:Foo}}</noinclude>
+<onlyinclude>{{subst:Foo}}</onlyinclude>
+
+But not inside includeonly
+<includeonly>{{subst:Foo}}</includeonly>
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
+Shall not expand:
+
+<nowiki>~~~~</nowiki>
+
+<includeonly><nowiki>~~~~</nowiki></includeonly>
+
+<noinclude><nowiki>~~~~</nowiki></noinclude>
 
-!! end
+<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>
 
-!! test
-Bug 6563: Section extraction for section suppressed by <includeonly>
-!! options
-section=1
-!! input
-<includeonly>
-==Includeonly section==
-</includeonly>
-==Section 1==
-!! result
-==Section 1==
+FOO shall be converted to FOO
+
+As well as inside noinclude/onlyinclude
+<noinclude>FOO</noinclude>
+<onlyinclude>FOO</onlyinclude>
+
+But not inside includeonly
+<includeonly>{{subst:Foo}}</includeonly>
 !! end
 
 ###
-### Pre-save transform tests
+### Message transform tests
 ###
 !! test
-pre-save transform: subst:
+message transform: magic variables
 !! options
-PST
+msg
 !! input
-{{subst:test}}
+{{SITENAME}}
 !! result
-This is a test template
+MediaWiki
 !! end
 
 !! test
-pre-save transform: normal template
+message transform: should not transform wiki markup
 !! options
-PST
+msg
 !! input
-{{test}}
+''test''
 !! result
-{{test}}
+''test''
 !! end
 
 !! test
-pre-save transform: nonexistent template
+message transform: <noinclude> in transcluded template (bug 4926)
 !! options
-PST
+msg
 !! input
-{{thistemplatedoesnotexist}}
+{{Includes}}
 !! result
-{{thistemplatedoesnotexist}}
+Foobar
 !! end
 
-
 !! test
-pre-save transform: subst magic variables
+message transform: <onlyinclude> in transcluded template (bug 4926)
 !! options
-PST
+msg
 !! input
-{{subst:SITENAME}}
+{{Includes2}}
 !! result
-MediaWiki
+Foo
 !! end
 
-# This is bug 89, which I fixed. -- wtm
 !! test
-pre-save transform: subst: templates with parameters
+{{#special:}} page name, known
 !! options
-pst
+msg
 !! input
-{{subst:paramtest|param="something else"}}
+{{#special:Recentchanges}}
 !! result
-This is a test template with parameter "something else"
+Special:RecentChanges
 !! end
 
-!! article
-Template:nowikitest
-!! text
-<nowiki>'''not wiki'''</nowiki>
-!! endarticle
-
 !! test
-pre-save transform: nowiki in subst (bug 1188)
+{{#special:}} page name with subpage, known
 !! options
-pst
+msg
 !! input
-{{subst:nowikitest}}
+{{#special:Recentchanges/param}}
 !! result
-<nowiki>'''not wiki'''</nowiki>
+Special:RecentChanges/param
 !! end
 
-
-!! article
-Template:commenttest
-!! text
-This template has <!-- a comment --> in it.
-!! endarticle
-
 !! test
-pre-save transform: comment in subst (bug 1936)
+{{#special:}} page name, unknown
 !! options
-pst
+msg
 !! input
-{{subst:commenttest}}
+{{#special:foobarnonexistent}}
 !! result
-This template has <!-- a comment --> in it.
+No such special page
 !! end
 
 !! test
-pre-save transform: unclosed tag
+{{#speciale:}} page name, known
 !! options
-pst noxml
+msg
 !! input
-<nowiki>'''not wiki'''
+{{#speciale:Recentchanges}}
 !! result
-<nowiki>'''not wiki'''
+Special:RecentChanges
 !! end
 
 !! test
-pre-save transform: mixed tag case
+{{#speciale:}} page name with subpage, known
 !! options
-pst noxml
+msg
 !! input
-<NOwiki>'''not wiki'''</noWIKI>
+{{#speciale:Recentchanges/param}}
 !! result
-<NOwiki>'''not wiki'''</noWIKI>
+Special:RecentChanges/param
 !! end
 
 !! test
-pre-save transform: unclosed comment in <nowiki>
+{{#speciale:}} page name, unknown
 !! options
-pst noxml
-!! input
-wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
-!! result
-wiki<nowiki>nowiki<!--nowiki</nowiki>wiki
-!!end
-
-!! article
-Template:dangerous
-!!text
-<span onmouseover="alert('crap')">Oh no</span>
-!!endarticle
-
-!!test
-(confirming safety of fix for subst bug 1936)
+msg
 !! input
-{{Template:dangerous}}
+{{#speciale:foobarnonexistent}}
 !! result
-<p><span>Oh no</span>
-</p>
+No_such_special_page
 !! end
 
+###
+### Images
+###
 !! test
-pre-save transform: comment containing gallery (bug 5024)
-!! options
-pst
-!! input
-<!-- <gallery>data</gallery> -->
-!!result
-<!-- <gallery>data</gallery> -->
-!!end
-
-!! test
-pre-save transform: comment containing extension
-!! options
-pst
-!! input
-<!-- <tag>data</tag> -->
-!!result
-<!-- <tag>data</tag> -->
-!!end
-
-!! test
-pre-save transform: comment containing nowiki
-!! options
-pst
-!! input
-<!-- <nowiki>data</nowiki> -->
-!!result
-<!-- <nowiki>data</nowiki> -->
-!!end
-
-!! test
-pre-save transform: <noinclude> in subst (bug 3298)
-!! options
-pst
+Simple image
 !! input
-{{subst:Includes}}
+[[Image:foobar.jpg]]
 !! result
-Foobar
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
 !! test
-pre-save transform: <onlyinclude> in subst (bug 3298)
-!! options
-pst
+Right-aligned image
 !! input
-{{subst:Includes2}}
+[[Image:foobar.jpg|right]]
 !! result
-Foo
-!! end
-
-!! article
-Template:SubstTest
-!!text
-{{<includeonly>subst:</includeonly>Includes}}
-!! endarticle
-
-!! article
-Template:SafeSubstTest
-!! text
-{{<includeonly>safesubst:</includeonly>Includes}}
-!! endarticle
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
-!! test
-bug 22297: safesubst: works during PST
-!! options
-pst
-!! input
-{{subst:SafeSubstTest}}{{safesubst:SubstTest}}
-!! result
-FoobarFoobar
 !! end
 
 !! test
-bug 22297: safesubst: works during normal parse
+Simple image (using File: namespace, now canonical)
 !! input
-{{SafeSubstTest}}
+[[File:foobar.jpg]]
 !! result
-<p>Foobar
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !! end
 
-!! test:
-subst: does not work during normal parse
+!! test
+Image with caption
 !! input
-{{SubstTest}}
+[[Image:foobar.jpg|right|Caption text]]
 !! result
-<p>{{subst:Includes}}
-</p>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick")
-!! options
-pst
+Image with empty attribute
 !! input
-[[Article (context)|]]
-[[Bar:Article|]]
-[[:Bar:Article|]]
-[[Bar:Article (context)|]]
-[[:Bar:Article (context)|]]
-[[|Article]]
-[[|Article (context)]]
-[[Bar:X (Y) Z|]]
-[[:Bar:X (Y) Z|]]
+[[Image:foobar.jpg|right||Caption text]]
 !! result
-[[Article (context)|Article]]
-[[Bar:Article|Article]]
-[[:Bar:Article|Article]]
-[[Bar:Article (context)|Article]]
-[[:Bar:Article (context)|Article]]
-[[Article]]
-[[Article (context)]]
-[[Bar:X (Y) Z|X (Y) Z]]
-[[:Bar:X (Y) Z|X (Y) Z]]
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with interwiki prefix
-!! options
-pst
+Image with link tails
 !! input
-[[interwiki:Article|]]
-[[:interwiki:Article|]]
-[[interwiki:Bar:Article|]]
-[[:interwiki:Bar:Article|]]
+123[[Image:foobar.jpg]]456
+123[[Image:foobar.jpg|right]]456
+123[[Image:foobar.jpg|thumb]]456
 !! result
-[[interwiki:Article|Article]]
-[[:interwiki:Article|Article]]
-[[interwiki:Bar:Article|Bar:Article]]
-[[:interwiki:Bar:Article|Bar:Article]]
+<p>123<a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>456
+</p>
+123<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>456
+123<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div></div></div></div>456
+
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with parens in title
-!! options
-pst title=[[Somearticle (context)]]
+Image with multiple captions -- only last one is accepted
 !! input
-[[|Article]]
+[[Image:foobar.jpg|right|Caption1 - ignored|[[Caption2]] - ignored|Caption3 - accepted]]
 !! result
-[[Article (context)|Article]]
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption3 - accepted"><img alt="Caption3 - accepted" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with comma in title
-!! options
-pst title=[[Someplace, Somewhere]]
+Image with width attribute at different positions
 !! input
-[[|Otherplace]]
-[[Otherplace, Elsewhere|]]
-[[Otherplace, Elsewhere, Anywhere|]]
+[[Image:foobar.jpg|200px|right|Caption]]
+[[Image:foobar.jpg|right|200px|Caption]]
+[[Image:foobar.jpg|right|Caption|200px]]
 !! result
-[[Otherplace, Somewhere|Otherplace]]
-[[Otherplace, Elsewhere|Otherplace]]
-[[Otherplace, Elsewhere, Anywhere|Otherplace]]
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
+<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption"><img alt="Caption" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a></div>
+
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with parens and comma
-!! options
-pst title=[[Someplace (IGNORED), Somewhere]]
+Image with link parameter, wiki target
 !! input
-[[|Otherplace]]
-[[Otherplace (place), Elsewhere|]]
+[[Image:foobar.jpg|link=Target page]]
 !! result
-[[Otherplace, Somewhere|Otherplace]]
-[[Otherplace (place), Elsewhere|Otherplace]]
+<p><a href="/wiki/Target_page" title="Target page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with comma and parens
-!! options
-pst title=[[Who, me? (context)]]
+Image with link parameter, URL target
 !! input
-[[|Yes, you.]]
-[[Me, Myself, and I (1937 song)|]]
+[[Image:foobar.jpg|link=http://example.com/]]
 !! result
-[[Yes, you. (context)|Yes, you.]]
-[[Me, Myself, and I (1937 song)|Me, Myself, and I]]
+<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
 
 !! test
-pre-save transform: context links ("pipe trick") with namespace
-!! options
-pst title=[[Ns:Somearticle]]
+Image with link parameter, wgExternalLinkTarget
 !! input
-[[|Article]]
+[[Image:foobar.jpg|link=http://example.com/]]
+!! config
+wgExternalLinkTarget='foobar'
 !! result
-[[Ns:Article|Article]]
+<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
-pre-save transform: context links ("pipe trick") with namespace and parens
-!! options
-pst title=[[Ns:Somearticle (context)]]
+Image with link parameter, wgNoFollowLinks set to false
 !! input
-[[|Article]]
+[[Image:foobar.jpg|link=http://example.com/]]
+!! config
+wgNoFollowLinks=false
 !! result
-[[Ns:Article (context)|Article]]
+<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
-pre-save transform: context links ("pipe trick") with namespace and comma
-!! options
-pst title=[[Ns:Somearticle, Context, Whatever]]
+Image with link parameter, wgNoFollowDomainExceptions
 !! input
-[[|Article]]
+[[Image:foobar.jpg|link=http://example.com/]]
+!! config
+wgNoFollowDomainExceptions='example.com'
 !! result
-[[Ns:Article, Context, Whatever|Article]]
+<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
-pre-save transform: context links ("pipe trick") with namespace, comma and parens
-!! options
-pst title=[[Ns:Somearticle, Context (context)]]
+Image with link parameter, wgExternalLinkTarget, unnamed parameter
 !! input
-[[|Article]]
+[[Image:foobar.jpg|link=http://example.com/|Title]]
+!! config
+wgExternalLinkTarget='foobar'
 !! result
-[[Ns:Article (context)|Article]]
+<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
 
 !! test
-pre-save transform: context links ("pipe trick") with namespace, parens and comma
-!! options
-pst title=[[Ns:Somearticle (IGNORED), Context]]
+Image with empty link parameter
 !! input
-[[|Article]]
+[[Image:foobar.jpg|link=]]
 !! result
-[[Ns:Article, Context|Article]]
+<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
+</p>
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with full-width parens and no space (Japanese and Chinese style, bug 30149)
-!! options
-pst
+Image with link parameter (wiki target) and unnamed parameter
 !! input
-[[Article(context)|]]
-[[Bar:Article(context)|]]
-[[:Bar:Article(context)|]]
-[[|Article(context)]]
-[[Bar:X(Y)Z|]]
-[[:Bar:X(Y)Z|]]
+[[Image:foobar.jpg|link=Target page|Title]]
 !! result
-[[Article(context)|Article]]
-[[Bar:Article(context)|Article]]
-[[:Bar:Article(context)|Article]]
-[[Article(context)]]
-[[Bar:X(Y)Z|X(Y)Z]]
-[[:Bar:X(Y)Z|X(Y)Z]]
+<p><a href="/wiki/Target_page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with full-width parens and space (Japanese and Chinese style, bug 30149)
-!! options
-pst
+Image with link parameter (URL target) and unnamed parameter
 !! input
-[[Article (context)|]]
-[[Bar:Article (context)|]]
-[[:Bar:Article (context)|]]
-[[|Article (context)]]
-[[Bar:X (Y) Z|]]
-[[:Bar:X (Y) Z|]]
+[[Image:foobar.jpg|link=http://example.com/|Title]]
 !! result
-[[Article (context)|Article]]
-[[Bar:Article (context)|Article]]
-[[:Bar:Article (context)|Article]]
-[[Article (context)]]
-[[Bar:X (Y) Z|X (Y) Z]]
-[[:Bar:X (Y) Z|X (Y) Z]]
+<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
 
 !! test
-pre-save transform: context links ("pipe trick") with parens and no space (Korean style, bug 30149)
-!! options
-pst
+Thumbnail image with link parameter
 !! input
-[[Article(context)|]]
-[[Bar:Article(context)|]]
-[[:Bar:Article(context)|]]
-[[|Article(context)]]
-[[Bar:X(Y)Z|]]
-[[:Bar:X(Y)Z|]]
+[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
 !! result
-[[Article(context)|Article]]
-[[Bar:Article(context)|Article]]
-[[:Bar:Article(context)|Article]]
-[[Article(context)]]
-[[Bar:X(Y)Z|X(Y)Z]]
-[[:Bar:X(Y)Z|X(Y)Z]]
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
+
 !! end
 
 !! test
-pre-save transform: context links ("pipe trick") with commas (bug 21660)
-!! options
-pst
+Image with frame and link
 !! input
-[[Article (context), context|]]
-[[Article (context),context|]]
-[[Bar:Article (context), context|]]
-[[Bar:Article (context),context|]]
-[[:Bar:Article (context), context|]]
-[[:Bar:Article (context),context|]]
+[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
 !! result
-[[Article (context), context|Article]]
-[[Article (context),context|Article]]
-[[Bar:Article (context), context|Article]]
-[[Bar:Article (context),context|Article]]
-[[:Bar:Article (context), context|Article]]
-[[:Bar:Article (context),context|Article]]
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+
 !! end
 
 !! test
-pre-save transform: trim trailing empty lines
-!! options
-pst
+Image with frame and link and explicit alt
 !! input
-Empty lines are trimmed
-
-
+[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
+!! result
+<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
 
+!! end
 
+!! test
+Image with wiki markup in implicit alt
+!! input
+[[Image:Foobar.jpg|testing '''bold''' in alt]]
 !! result
-Empty lines are trimmed
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
 !! test
-pre-save transform: Signature expansion
-!! options
-pst
+Image with wiki markup in explicit alt
 !! input
-* ~~~
-* <noinclude>~~~</noinclude>
-* <includeonly>~~~</includeonly>
-* <onlyinclude>~~~</onlyinclude>
+[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
 !! result
-* [[Special:Contributions/127.0.0.1|127.0.0.1]]
-* <noinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</noinclude>
-* <includeonly>[[Special:Contributions/127.0.0.1|127.0.0.1]]</includeonly>
-* <onlyinclude>[[Special:Contributions/127.0.0.1|127.0.0.1]]</onlyinclude>
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
-
 !! test
-pre-save transform: Signature expansion in nowiki tags (bug 93)
-!! options
-pst disabled
+Link to image page- image page normally doesn't exists, hence edit link
+Add test with existing image page
+#<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
 !! input
-Shall not expand:
+[[:Image:test]]
+!! result
+<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a>
+</p>
+!! end
 
-<nowiki>~~~~</nowiki>
+!! test
+bug 18784  Link to non-existent image page with caption should use caption as link text
+!! input
+[[:Image:test|caption]]
+!! result
+<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">caption</a>
+</p>
+!! end
 
-<includeonly><nowiki>~~~~</nowiki></includeonly>
+!! test
+Frameless image caption with a free URL
+!! input
+[[Image:foobar.jpg|http://example.com]]
+!! result
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! end
 
-<noinclude><nowiki>~~~~</nowiki></noinclude>
+!! test
+Thumbnail image caption with a free URL
+!! input
+[[Image:foobar.jpg|thumb|http://example.com]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
 
-<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>
+!! end
 
-{{subst:Foo}} shall be converted to FOO
+!! test
+Thumbnail image caption with a free URL and explicit alt
+!! input
+[[Image:foobar.jpg|thumb|http://example.com|alt=Alteration]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
 
-As well as inside noinclude/onlyinclude
-<noinclude>{{subst:Foo}}</noinclude>
-<onlyinclude>{{subst:Foo}}</onlyinclude>
+!! end
 
-But not inside includeonly
-<includeonly>{{subst:Foo}}</includeonly>
+!! test
+BUG 1887: A ISBN with a thumbnail
+!! input
+[[Image:foobar.jpg|thumb|ISBN 1235467890]]
 !! result
-Shall not expand:
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
 
-<nowiki>~~~~</nowiki>
+!! end
 
-<includeonly><nowiki>~~~~</nowiki></includeonly>
+!! test
+BUG 1887: A RFC with a thumbnail
+!! input
+[[Image:foobar.jpg|thumb|This is RFC 12354]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
 
-<noinclude><nowiki>~~~~</nowiki></noinclude>
+!! end
 
-<onlyinclude><nowiki>~~~~</nowiki></onlyinclude>
+!! test
+BUG 1887: A mailto link with a thumbnail
+!! input
+[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
 
-FOO shall be converted to FOO
+!! end
 
-As well as inside noinclude/onlyinclude
-<noinclude>FOO</noinclude>
-<onlyinclude>FOO</onlyinclude>
+# Pending resolution to bug 368
+!! test
+BUG 648: Frameless image caption with a link
+!! input
+[[Image:foobar.jpg|text with a [[link]] in it]]
+!! result
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!! end
 
-But not inside includeonly
-<includeonly>{{subst:Foo}}</includeonly>
+!! test
+BUG 648: Frameless image caption with a link (suffix)
+!! input
+[[Image:foobar.jpg|text with a [[link]]foo in it]]
+!! result
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
-###
-### Message transform tests
-###
 !! test
-message transform: magic variables
-!! options
-msg
+BUG 648: Frameless image caption with an interwiki link
 !! input
-{{SITENAME}}
+[[Image:foobar.jpg|text with a [[MeatBall:Link]] in it]]
 !! result
-MediaWiki
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
 !! test
-message transform: should not transform wiki markup
-!! options
-msg
+BUG 648: Frameless image caption with a piped interwiki link
 !! input
-''test''
+[[Image:foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
 !! result
-''test''
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
 !! test
-message transform: <noinclude> in transcluded template (bug 4926)
-!! options
-msg
+Escape HTML special chars in image alt text
 !! input
-{{Includes}}
+[[Image:foobar.jpg|& < > "]]
 !! result
-Foobar
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
 !! test
-message transform: <onlyinclude> in transcluded template (bug 4926)
-!! options
-msg
+BUG 499: Alt text should have &#1234;, not &amp;1234;
 !! input
-{{Includes2}}
+[[Image:foobar.jpg|&#9792;]]
 !! result
-Foo
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
 !! end
 
 !! test
-{{#special:}} page name, known
-!! options
-msg
+Broken image caption with link
 !! input
-{{#special:Recentchanges}}
+[[Image:Foobar.jpg|thumb|This is a broken caption. But [[Main Page|this]] is just an ordinary link.
 !! result
-Special:RecentChanges
+<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
+</p>
 !! end
 
 !! test
-{{#special:}} page name with subpage, known
-!! options
-msg
+Image caption containing another image
 !! input
-{{#special:Recentchanges/param}}
+[[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
 !! result
-Special:RecentChanges/param
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&amp;wpDestFile=Icon.png" class="new" title="File:Icon.png">image</a> inside it!</div></div></div>
+
 !! end
 
 !! test
-{{#special:}} page name, unknown
-!! options
-msg
+Image caption containing a newline
 !! input
-{{#special:foobarnonexistent}}
+[[Image:Foobar.jpg|This
+*is some text]]
 !! result
-No such special page
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+</p>
+!!end
+
+
+!! test
+Bug 3090: External links other than http: in image captions
+!! input
+[[Image:Foobar.jpg|thumb|200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
+!! result
+<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/200px-Foobar.jpg" width="200" height="23" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/300px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/400px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
+
 !! end
 
 !! test
-{{#speciale:}} page name, known
-!! options
-msg
+Custom class
 !! input
-{{#speciale:Recentchanges}}
+[[Image:foobar.jpg|a|class=b]]
 !! result
-Special:RecentChanges
+<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
+#REDIRECT [[File:Barfoo.jpg]]
+!! endarticle
+
 !! test
-{{#speciale:}} page name with subpage, known
-!! options
-msg
+Redirected image
 !! input
-{{#speciale:Recentchanges/param}}
+[[Image:Barfoo.jpg]]
 !! result
-Special:RecentChanges/param
+<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
+</p>
 !! end
 
 !! test
-{{#speciale:}} page name, unknown
+Missing image with uploads disabled
 !! options
-msg
+wgEnableUploads=0
 !! input
-{{#speciale:foobarnonexistent}}
+[[Image:Foobaz.jpg]]
 !! result
-No_such_special_page
+<p><a href="/wiki/File:Foobaz.jpg" title="File:Foobaz.jpg">File:Foobaz.jpg</a>
+</p>
 !! end
 
+
 ###
-### Images
+### Subpages
 ###
+!! article
+Subpage test/subpage
+!! text
+foo
+!! endarticle
+
 !! test
-Simple image
+Subpage link
+!! options
+subpage title=[[Subpage test]]
 !! input
-[[Image:foobar.jpg]]
+[[/subpage]]
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
 </p>
 !! end
 
 !! test
-Right-aligned image
-!! input
-[[Image:foobar.jpg|right]]
+Subpage noslash link
+!! options
+subpage title=[[Subpage test]]
+!!input
+[[/subpage/]]
 !! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
+<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">subpage</a>
+</p>
 !! end
 
 !! test
-Simple image (using File: namespace, now canonical)
+Disabled subpages
 !! input
-[[File:foobar.jpg]]
+[[/subpage]]
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a>
 </p>
 !! end
 
 !! test
-Image with caption
+BUG 561: {{/Subpage}}
+!! options
+subpage title=[[Page]]
 !! input
-[[Image:foobar.jpg|right|Caption text]]
+{{/Subpage}}
 !! result
-<div class="floatright"><a href="/wiki/File:Foobar.jpg" class="image" title="Caption text"><img alt="Caption text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
-
+<p><a href="/index.php?title=Page/Subpage&amp;action=edit&amp;redlink=1" class="new" title="Page/Subpage (page does not exist)">Page/Subpage</a>
+</p>
 !! end
 
+###
+### Categories
+###
+!! article
+Category:MediaWiki User's Guide
+!! text
+blah
+!! endarticle
+
 !! test
-Image with link parameter, wiki target
+Link to category
 !! input
-[[Image:foobar.jpg|link=Target page]]
+[[:Category:MediaWiki User's Guide]]
 !! result
-<p><a href="/wiki/Target_page" title="Target page"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
 </p>
 !! end
 
 !! test
-Image with link parameter, URL target
+Simple category
+!! options
+cat
 !! input
-[[Image:foobar.jpg|link=http://example.com/]]
+[[Category:MediaWiki User's Guide]]
 !! result
-<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>
+<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
 !! test
-Image with link parameter, wgExternalLinkTarget
+PAGESINCATEGORY invalid title fatal (r33546 fix)
 !! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgExternalLinkTarget='foobar'
+{{PAGESINCATEGORY:<bogus>}}
 !! result
-<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>0
 </p>
 !! end
 
 !! test
-Image with link parameter, wgNoFollowLinks set to false
+Category with different sort key
+!! options
+cat
 !! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgNoFollowLinks=false
+[[Category:MediaWiki User's Guide|Foo]]
 !! 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="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
 !! test
-Image with link parameter, wgNoFollowDomainExceptions
+Category with identical sort key
+!! options
+cat
 !! input
-[[Image:foobar.jpg|link=http://example.com/]]
-!! config
-wgNoFollowDomainExceptions='example.com'
+[[Category:MediaWiki User's Guide|MediaWiki User's Guide]]
 !! 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="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
 !! test
-Image with link parameter, wgExternalLinkTarget, unnamed parameter
+Category with empty sort key
+!! options
+cat
+pst
 !! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
-!! config
-wgExternalLinkTarget='foobar'
+[[Category:MediaWiki User's Guide|]]
+!! result
+[[Category:MediaWiki User's Guide|MediaWiki User's Guide]]
+!! end
+
+!! test
+Category with empty sort key and parentheses
+!! options
+cat
+pst
+!! input
+[[Category:Foo (bar)|]]
 !! result
-<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>
+[[Category:Foo (bar)|Foo]]
 !! end
 
 !! test
-Image with empty link parameter
+Category with link tail
+!! options
+cat
+pst
 !! input
-[[Image:foobar.jpg|link=]]
+123[[Category:Foo]]456
 !! result
-<p><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" />
-</p>
+123[[Category:Foo]]456
 !! end
 
 !! test
-Image with link parameter (wiki target) and unnamed parameter
+Category with template
+!! options
+cat
+pst
 !! input
-[[Image:foobar.jpg|link=Target page|Title]]
+[[Category:{{echo|Foo}}]]
 !! result
-<p><a href="/wiki/Target_page" title="Title"><img alt="Title" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
+[[Category:{{echo|Foo}}]]
 !! end
 
 !! test
-Image with link parameter (URL target) and unnamed parameter
+Category with template in sort key
+!! options
+cat
+pst
 !! input
-[[Image:foobar.jpg|link=http://example.com/|Title]]
+[[Category:Foo|{{echo|Bar}}]]
 !! result
-<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>
+[[Category:Foo|{{echo|Bar}}]]
 !! end
 
 !! test
-Thumbnail image with link parameter
+Category with template in sort key and title
+!! options
+cat
+pst
 !! input
-[[Image:foobar.jpg|thumb|link=http://example.com/|Title]]
+[[Category:{{echo|Foo}}|{{echo|Bar}}]]
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="http://example.com/"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Title</div></div></div>
-
+[[Category:{{echo|Foo}}|{{echo|Bar}}]]
 !! end
 
 !! test
-Image with frame and link
+Category / paragraph interactions
 !! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]]]
-!! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+Foo [[Category:Baz]] Bar
+
+Foo [[Category:Baz]]
+Bar
+
+Foo
+[[Category:Baz]]
+Bar
+
+Foo
+[[Category:Baz]] Bar
+
+Foo
+[[Category:Baz]]
+ [[Category:Baz]]
+[[Category:Baz]]
+Bar
 
+[[Category:Baz]]
+ [[Category:Baz]]
+[[Category:Baz]]
+
+[[Category:Baz]]
+ {{echo|[[Category:Baz]]}}
+[[Category:Baz]]
+!! result
+<p>Foo Bar
+</p><p>Foo
+Bar
+</p><p>Foo
+Bar
+</p><p>Foo Bar
+</p><p>Foo
+Bar
+</p>
 !! end
 
+###
+### Inter-language links
+###
 !! test
-Image with frame and link and explicit alt
+Inter-language links
+!! options
+ill
 !! input
-[[Image:Foobar.jpg|frame|left|This is a test image [[Main Page]]|alt=Altitude]]
+[[es:Alimento]]
+[[fr:Nourriture]]
+[[zh:&#39135;&#21697;]]
 !! result
-<div class="thumb tleft"><div class="thumbinner" style="width:1943px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Altitude" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" class="thumbimage" /></a>  <div class="thumbcaption">This is a test image <a href="/wiki/Main_Page" title="Main Page">Main Page</a></div></div></div>
+es:Alimento fr:Nourriture zh:食品
+!! end
 
+!! test
+Duplicate interlanguage links (bug 24502)
+!! options
+ill
+!! input
+[[es:1]]
+[[es:2]]
+[[fr:1]]
+[[fr:2]]
+!! result
+es:1 fr:1
 !! end
 
+###
+### Sections
+###
 !! test
-Image with wiki markup in implicit alt
+Basic section headings
 !! input
-[[Image:Foobar.jpg|testing '''bold''' in alt]]
+== Headline 1 ==
+Some text
+
+==Headline 2==
+More
+===Smaller headline===
+Blah blah
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="testing bold in alt"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
+<p>Some text
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
+<p>More
+</p>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span> <span class="mw-headline" id="Smaller_headline">Smaller headline</span></h3>
+<p>Blah blah
 </p>
 !! end
 
 !! test
-Image with wiki markup in explicit alt
+Section headings with TOC
 !! input
-[[Image:Foobar.jpg|alt=testing '''bold''' in alt]]
+== Headline 1 ==
+=== Subheadline 1 ===
+===== Skipping a level =====
+====== Skipping a level ======
+
+== Headline 2 ==
+Some text
+===Another headline===
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="testing bold in alt" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-2"><a href="#Subheadline_1"><span class="tocnumber">1.1</span> <span class="toctext">Subheadline 1</span></a>
+<ul>
+<li class="toclevel-3 tocsection-3"><a href="#Skipping_a_level"><span class="tocnumber">1.1.1</span> <span class="toctext">Skipping a level</span></a>
+<ul>
+<li class="toclevel-4 tocsection-4"><a href="#Skipping_a_level_2"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Skipping a level</span></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+<li class="toclevel-1 tocsection-5"><a href="#Headline_2"><span class="tocnumber">2</span> <span class="toctext">Headline 2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-6"><a href="#Another_headline"><span class="tocnumber">2.1</span> <span class="toctext">Another headline</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
+<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
+<p>Some text
 </p>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
+
 !! end
 
+# perl -e 'print "="x$_," Level $_ heading","="x$_,"\n" for 1..10'
 !! test
-Link to image page- image page normally doesn't exists, hence edit link
-Add test with existing image page
-#<p><a href="/wiki/File:Test" title="Image:Test">Image:test</a>
+Handling of sections up to level 6 and beyond
 !! input
-[[:Image:test]]
+= Level 1 Heading=
+== Level 2 Heading==
+=== Level 3 Heading===
+==== Level 4 Heading====
+===== Level 5 Heading=====
+====== Level 6 Heading======
+======= Level 7 Heading=======
+======== Level 8 Heading========
+========= Level 9 Heading=========
+========== Level 10 Heading==========
 !! result
-<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">Image:test</a>
-</p>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
+<ul>
+<li class="toclevel-2 tocsection-2"><a href="#Level_2_Heading"><span class="tocnumber">1.1</span> <span class="toctext">Level 2 Heading</span></a>
+<ul>
+<li class="toclevel-3 tocsection-3"><a href="#Level_3_Heading"><span class="tocnumber">1.1.1</span> <span class="toctext">Level 3 Heading</span></a>
+<ul>
+<li class="toclevel-4 tocsection-4"><a href="#Level_4_Heading"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Level 4 Heading</span></a>
+<ul>
+<li class="toclevel-5 tocsection-5"><a href="#Level_5_Heading"><span class="tocnumber">1.1.1.1.1</span> <span class="toctext">Level 5 Heading</span></a>
+<ul>
+<li class="toclevel-6 tocsection-6"><a href="#Level_6_Heading"><span class="tocnumber">1.1.1.1.1.1</span> <span class="toctext">Level 6 Heading</span></a></li>
+<li class="toclevel-6 tocsection-7"><a href="#.3D_Level_7_Heading.3D"><span class="tocnumber">1.1.1.1.1.2</span> <span class="toctext">= Level 7 Heading=</span></a></li>
+<li class="toclevel-6 tocsection-8"><a href="#.3D.3D_Level_8_Heading.3D.3D"><span class="tocnumber">1.1.1.1.1.3</span> <span class="toctext">== Level 8 Heading==</span></a></li>
+<li class="toclevel-6 tocsection-9"><a href="#.3D.3D.3D_Level_9_Heading.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.4</span> <span class="toctext">=== Level 9 Heading===</span></a></li>
+<li class="toclevel-6 tocsection-10"><a href="#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.5</span> <span class="toctext">==== Level 10 Heading====</span></a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</td></tr></table>
+<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
+<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span></h6>
+
 !! end
 
 !! test
-bug 18784  Link to non-existent image page with caption should use caption as link text
+TOC regression (bug 9764)
 !! input
-[[:Image:test|caption]]
+== title 1 ==
+=== title 1.1 ===
+==== title 1.1.1 ====
+=== title 1.2 ===
+== title 2 ==
+=== title 2.1 ===
 !! result
-<p><a href="/index.php?title=File:Test&amp;action=edit&amp;redlink=1" class="new" title="File:Test (page does not exist)">caption</a>
-</p>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a>
+<ul>
+<li class="toclevel-3 tocsection-3"><a href="#title_1.1.1"><span class="tocnumber">1.1.1</span> <span class="toctext">title 1.1.1</span></a></li>
+</ul>
+</li>
+<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+
 !! end
 
 !! test
-Frameless image caption with a free URL
+TOC with wgMaxTocLevel=3 (bug 6204)
+!! options
+wgMaxTocLevel=3
 !! input
-[[Image:foobar.jpg|http://example.com]]
+== title 1 ==
+=== title 1.1 ===
+==== title 1.1.1 ====
+=== title 1.2 ===
+== title 2 ==
+=== title 2.1 ===
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="http://example.com"><img alt="http://example.com" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li>
+<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+
 !! end
 
 !! test
-Thumbnail image caption with a free URL
+TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
+!! options
+wgMaxTocLevel=3
 !! input
-[[Image:foobar.jpg|thumb|http://example.com]]
+==Section 1==
+===Section 1.1===
+====Section 1.1.1====
+====Section 1.1.1.1====
+==Section 2==
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-2"><a href="#Section_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Section 1.1</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1 tocsection-5"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1">Section 1.1</span></h3>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span></h4>
+<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span></h4>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
 
 !! end
 
+
 !! test
-Thumbnail image caption with a free URL and explicit alt
+Resolving duplicate section names
 !! input
-[[Image:foobar.jpg|thumb|http://example.com|alt=Alteration]]
+== Foo bar ==
+== Foo bar ==
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Alteration" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a></div></div></div>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
 
 !! end
 
 !! test
-BUG 1887: A ISBN with a thumbnail
+Resolving duplicate section names with differing case (bug 10721)
 !! input
-[[Image:foobar.jpg|thumb|ISBN 1235467890]]
+== Foo bar ==
+== Foo Bar ==
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div><a href="/wiki/Special:BookSources/1235467890" class="internal mw-magiclink-isbn">ISBN 1235467890</a></div></div></div>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
 
 !! end
 
+!! article
+Template:sections
+!! text
+===Section 1===
+==Section 2==
+!! endarticle
+
 !! test
-BUG 1887: A RFC with a thumbnail
+Template with sections, __NOTOC__
 !! input
-[[Image:foobar.jpg|thumb|This is RFC 12354]]
+__NOTOC__
+==Section 0==
+{{sections}}
+==Section 4==
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc12354">RFC 12354</a></div></div></div>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span> <span class="mw-headline" id="Section_0">Section 0</span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span> <span class="mw-headline" id="Section_4">Section 4</span></h2>
 
 !! end
 
 !! test
-BUG 1887: A mailto link with a thumbnail
+__NOEDITSECTION__ keyword
 !! input
-[[Image:foobar.jpg|thumb|Please mailto:nobody@example.com]]
+__NOEDITSECTION__
+==Section 1==
+==Section 2==
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>Please <a rel="nofollow" class="external free" href="mailto:nobody@example.com">mailto:nobody@example.com</a></div></div></div>
+<h2> <span class="mw-headline" id="Section_1">Section 1</span></h2>
+<h2> <span class="mw-headline" id="Section_2">Section 2</span></h2>
 
 !! end
 
-# Pending resolution to bug 368
 !! test
-BUG 648: Frameless image caption with a link
+Link inside a section heading
 !! input
-[[Image:foobar.jpg|text with a [[link]] in it]]
+==Section with a [[Main Page|link]] in it==
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span> <span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span></h2>
 
-!! test
-BUG 648: Frameless image caption with a link (suffix)
-!! input
-[[Image:foobar.jpg|text with a [[link]]foo in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a linkfoo in it"><img alt="text with a linkfoo in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
 !! end
 
 !! test
-BUG 648: Frameless image caption with an interwiki link
+TOC regression (bug 12077)
 !! input
-[[Image:foobar.jpg|text with a [[MeatBall:Link]] in it]]
+__TOC__
+== title 1 ==
+=== title 1.1 ===
+== title 2 ==
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a MeatBall:Link in it"><img alt="text with a MeatBall:Link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!! end
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
 
-!! test
-BUG 648: Frameless image caption with a piped interwiki link
-!! input
-[[Image:foobar.jpg|text with a [[MeatBall:Link|link]] in it]]
-!! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="text with a link in it"><img alt="text with a link in it" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
 !! end
 
 !! test
-Escape HTML special chars in image alt text
+BUG 1219 URL next to image (good)
 !! input
-[[Image:foobar.jpg|& < > "]]
+http://example.com [[Image:foobar.jpg]]
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="&amp; &lt; &gt; &quot;"><img alt="&amp; &lt; &gt; &quot;" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
-!! end
+!!end
 
 !! test
-BUG 499: Alt text should have &#1234;, not &amp;1234;
+Short headings with trailing space should match behaviour of Parser::doHeadings (bug 19910)
 !! input
-[[Image:foobar.jpg|&#9792;]]
+=== 
+The line above must have a trailing space!
+=== <!--
+--> <!-- -->
+But just in case it doesn't...
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="♀"><img alt="♀" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D">=</span></h1>
+<p>The line above must have a trailing space!
+</p>
+<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D_2">=</span></h1>
+<p>But just in case it doesn't...
 </p>
 !! end
 
 !! test
-Broken image caption with link
+Header with special characters (bug 25462)
 !! input
-[[Image:Foobar.jpg|thumb|This is a broken caption. But [[Main Page|this]] is just an ordinary link.
+The tooltips shall not show entities to the user (ie. be double escaped)
+
+== text > text ==
+section 1
+
+== text < text ==
+section 2
+
+== text & text ==
+section 3
+
+== text ' text ==
+section 4
+
+== text " text ==
+section 5
 !! result
-<p>[[Image:Foobar.jpg|thumb|This is a broken caption. But <a href="/wiki/Main_Page" title="Main Page">this</a> is just an ordinary link.
+<p>The tooltips shall not show entities to the user (ie. be double escaped)
+</p>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#text_.26_text"><span class="tocnumber">3</span> <span class="toctext">text &amp; text</span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#text_.27_text"><span class="tocnumber">4</span> <span class="toctext">text ' text</span></a></li>
+<li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text &gt; text </span></h2>
+<p>section 1
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text &lt; text </span></h2>
+<p>section 2
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text &amp; text </span></h2>
+<p>section 3
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
+<p>section 4
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
+<p>section 5
 </p>
 !! end
 
 !! test
-Image caption containing another image
+Headers with excess '=' characters
+(Are similar tests necessary beyond the 1st level?)
 !! input
-[[Image:Foobar.jpg|thumb|This is a caption with another [[Image:icon.png|image]] inside it!]]
+=foo==
+==foo=
+=''italic'' heading==
+==''italic'' heading=
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This is a caption with another <a href="/index.php?title=Special:Upload&amp;wpDestFile=Icon.png" class="new" title="File:Icon.png">image</a> inside it!</div></div></div>
+<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
-Image caption containing a newline
+BUG 1219 URL next to image (broken)
 !! input
-[[Image:Foobar.jpg|This
-*is some text]]
+http://example.com[[Image:foobar.jpg]]
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="This *is some text"><img alt="This *is some text" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
 </p>
 !!end
 
-
 !! test
-Bug 3090: External links other than http: in image captions
+Bug 1186 news: in the middle of text
 !! input
-[[Image:Foobar.jpg|thumb|200px|This caption has [irc://example.net irc] and [https://example.com Secure] ext links in it.]]
+http://en.wikinews.org/wiki/Wikinews:Workplace
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:202px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="200" height="23" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>This caption has <a rel="nofollow" class="external text" href="irc://example.net">irc</a> and <a rel="nofollow" class="external text" href="https://example.com">Secure</a> ext links in it.</div></div></div>
+<p><a rel="nofollow" class="external free" href="http://en.wikinews.org/wiki/Wikinews:Workplace">http://en.wikinews.org/wiki/Wikinews:Workplace</a>
+</p>
+!!end
 
-!! end
 
 !! test
-Custom class
+Namespaced link must have a title
 !! input
-[[Image:foobar.jpg|a|class=b]]
+[[Project:]]
 !! 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>[[Project:]]
 </p>
-!! end
-
-!! article 
-File:Barfoo.jpg
-!! text
-#REDIRECT [[File:Barfoo.jpg]]
-!! endarticle
+!!end
 
 !! test
-Redirected image
+Namespaced link must have a title (bad fragment version)
 !! input
-[[Image:Barfoo.jpg]]
+[[Project:#fragment]]
 !! result
-<p><a href="/wiki/File:Barfoo.jpg" title="File:Barfoo.jpg">File:Barfoo.jpg</a>
+<p>[[Project:#fragment]]
 </p>
-!! end
+!!end
+
 
 !! test
-Missing image with uploads disabled
-!! options
-wgEnableUploads=0
+div with no attributes
 !! input
-[[Image:Foobaz.jpg]]
+<div>HTML rocks</div>
 !! result
-<p><a href="/wiki/File:Foobaz.jpg" title="File:Foobaz.jpg">File:Foobaz.jpg</a>
-</p>
-!! end
-
-
-###
-### Subpages
-###
-!! article
-Subpage test/subpage
-!! text
-foo
-!! endarticle
+<div>HTML rocks</div>
+
+!! end
 
 !! test
-Subpage link
-!! options
-subpage title=[[Subpage test]]
+div with double-quoted attribute
 !! input
-[[/subpage]]
+<div id="rock">HTML rocks</div>
 !! result
-<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a>
-</p>
+<div id="rock">HTML rocks</div>
+
 !! end
 
 !! test
-Subpage noslash link
-!! options
-subpage title=[[Subpage test]]
-!!input
-[[/subpage/]]
+div with single-quoted attribute
+!! input
+<div id='rock'>HTML rocks</div>
 !! result
-<p><a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">subpage</a>
-</p>
+<div id="rock">HTML rocks</div>
+
 !! end
 
 !! test
-Disabled subpages
+div with unquoted attribute
 !! input
-[[/subpage]]
+<div id=rock>HTML rocks</div>
 !! result
-<p><a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a>
-</p>
+<div id="rock">HTML rocks</div>
+
 !! end
 
 !! test
-BUG 561: {{/Subpage}}
-!! options
-subpage title=[[Page]]
+div with illegal double attributes
 !! input
-{{/Subpage}}
+<div id="a" id="b">HTML rocks</div>
 !! result
-<p><a href="/index.php?title=Page/Subpage&amp;action=edit&amp;redlink=1" class="new" title="Page/Subpage (page does not exist)">Page/Subpage</a>
-</p>
-!! end
+<div id="b">HTML rocks</div>
 
-###
-### Categories
-###
-!! article
-Category:MediaWiki User's Guide
-!! text
-blah
-!! endarticle
+!!end
 
+# FIXME: produce empty string instead of "class" in the PHP parser, following
+# the HTML5 spec.
 !! test
-Link to category
+div with empty attribute value, space before equals
+!! options
+disabled
 !! input
-[[:Category:MediaWiki User's Guide]]
+<div class =>HTML rocks</div>
 !! result
-<p><a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">Category:MediaWiki User's Guide</a>
-</p>
+<div class="">HTML rocks</div>
+
 !! end
 
+# This it very inconsistent in the PHP parser: it returns 
+# class="class" if there is a space between the name and the equal sign (see
+# 'div with empty attribute value, space before equals'), but strips the
+# attribute completely if the space is missing. We hope that not much content
+# depends on this, so are implementing the behavior below in Parsoid for
+# consistencies' sake. Disabled for the PHP parser. 
+# FIXME: fix this behavior in the PHP parser?
 !! test
-Simple category
+div with empty attribute value, no space before equals
 !! options
-cat
+disabled
 !! input
-[[Category:MediaWiki User's Guide]]
+<div class=>HTML rocks</div>
 !! result
-<a href="/wiki/Category:MediaWiki_User%27s_Guide" title="Category:MediaWiki User's Guide">MediaWiki User's Guide</a>
+<div class="">HTML rocks</div>
+
 !! end
 
 !! test
-PAGESINCATEGORY invalid title fatal (r33546 fix)
+HTML multiple attributes correction
 !! input
-{{PAGESINCATEGORY:<bogus>}}
+<p class="error" class="awesome">Awesome!</p>
 !! result
-<p>0
-</p>
-!! end
+<p class="awesome">Awesome!</p>
+
+!!end
 
-###
-### Inter-language links
-###
 !! test
-Inter-language links
-!! options
-ill
+Table multiple attributes correction
 !! input
-[[es:Alimento]]
-[[fr:Nourriture]]
-[[zh:&#39135;&#21697;]]
+{|
+!+ class="error" class="awesome"| status
+|}
 !! result
-es:Alimento fr:Nourriture zh:食品
-!! end
+<table>
+<tr>
+<th class="awesome"> status
+</th></tr></table>
+
+!!end
 
-###
-### Sections
-###
 !! test
-Basic section headings
+DIV IN UPPERCASE
 !! input
-== Headline 1 ==
-Some text
+<DIV ID="x">HTML ROCKS</DIV>
+!! result
+<div id="x">HTML ROCKS</div>
 
-==Headline 2==
-More
-===Smaller headline===
-Blah blah
+!!end
+
+!! test
+Non-ASCII pseudo-tags are rendered as text
+!! input
+<khyô>
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<p>Some text
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2">Headline 2</span></h2>
-<p>More
-</p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Smaller headline">edit</a>]</span> <span class="mw-headline" id="Smaller_headline">Smaller headline</span></h3>
-<p>Blah blah
+<p>&lt;khyô&gt;
 </p>
 !! end
 
 !! test
-Section headings with TOC
+Pseudo-tag with URL 'name' renders as url link
 !! input
-== Headline 1 ==
-=== Subheadline 1 ===
-===== Skipping a level =====
-====== Skipping a level ======
-
-== Headline 2 ==
-Some text
-===Another headline===
+<http://example.com/>
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Headline_1"><span class="tocnumber">1</span> <span class="toctext">Headline 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Subheadline_1"><span class="tocnumber">1.1</span> <span class="toctext">Subheadline 1</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#Skipping_a_level"><span class="tocnumber">1.1.1</span> <span class="toctext">Skipping a level</span></a>
-<ul>
-<li class="toclevel-4 tocsection-4"><a href="#Skipping_a_level_2"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Skipping a level</span></a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#Headline_2"><span class="tocnumber">2</span> <span class="toctext">Headline 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#Another_headline"><span class="tocnumber">2.1</span> <span class="toctext">Another headline</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Headline 1">edit</a>]</span> <span class="mw-headline" id="Headline_1"> Headline 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Subheadline 1">edit</a>]</span> <span class="mw-headline" id="Subheadline_1"> Subheadline 1 </span></h3>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level"> Skipping a level </span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Skipping a level">edit</a>]</span> <span class="mw-headline" id="Skipping_a_level_2"> Skipping a level </span></h6>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Headline 2">edit</a>]</span> <span class="mw-headline" id="Headline_2"> Headline 2 </span></h2>
-<p>Some text
+<p>&lt;<a rel="nofollow" class="external free" href="http://example.com/">http://example.com/</a>&gt;
 </p>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Another headline">edit</a>]</span> <span class="mw-headline" id="Another_headline">Another headline</span></h3>
-
 !! end
 
-# perl -e 'print "="x$_," Level $_ heading","="x$_,"\n" for 1..10'
 !! test
-Handling of sections up to level 6 and beyond
-!! input 
-= Level 1 Heading=
-== Level 2 Heading==
-=== Level 3 Heading===
-==== Level 4 Heading====
-===== Level 5 Heading=====
-====== Level 6 Heading======
-======= Level 7 Heading=======
-======== Level 8 Heading========
-========= Level 9 Heading=========
-========== Level 10 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="#Level_1_Heading"><span class="tocnumber">1</span> <span class="toctext">Level 1 Heading</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Level_2_Heading"><span class="tocnumber">1.1</span> <span class="toctext">Level 2 Heading</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#Level_3_Heading"><span class="tocnumber">1.1.1</span> <span class="toctext">Level 3 Heading</span></a>
-<ul>
-<li class="toclevel-4 tocsection-4"><a href="#Level_4_Heading"><span class="tocnumber">1.1.1.1</span> <span class="toctext">Level 4 Heading</span></a>
-<ul>
-<li class="toclevel-5 tocsection-5"><a href="#Level_5_Heading"><span class="tocnumber">1.1.1.1.1</span> <span class="toctext">Level 5 Heading</span></a>
-<ul>
-<li class="toclevel-6 tocsection-6"><a href="#Level_6_Heading"><span class="tocnumber">1.1.1.1.1.1</span> <span class="toctext">Level 6 Heading</span></a></li>
-<li class="toclevel-6 tocsection-7"><a href="#.3D_Level_7_Heading.3D"><span class="tocnumber">1.1.1.1.1.2</span> <span class="toctext">= Level 7 Heading=</span></a></li>
-<li class="toclevel-6 tocsection-8"><a href="#.3D.3D_Level_8_Heading.3D.3D"><span class="tocnumber">1.1.1.1.1.3</span> <span class="toctext">== Level 8 Heading==</span></a></li>
-<li class="toclevel-6 tocsection-9"><a href="#.3D.3D.3D_Level_9_Heading.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.4</span> <span class="toctext">=== Level 9 Heading===</span></a></li>
-<li class="toclevel-6 tocsection-10"><a href="#.3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D"><span class="tocnumber">1.1.1.1.1.5</span> <span class="toctext">==== Level 10 Heading====</span></a></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Level 1 Heading">edit</a>]</span> <span class="mw-headline" id="Level_1_Heading"> Level 1 Heading</span></h1>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Level 2 Heading">edit</a>]</span> <span class="mw-headline" id="Level_2_Heading"> Level 2 Heading</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Level 3 Heading">edit</a>]</span> <span class="mw-headline" id="Level_3_Heading"> Level 3 Heading</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Level 4 Heading">edit</a>]</span> <span class="mw-headline" id="Level_4_Heading"> Level 4 Heading</span></h4>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Level 5 Heading">edit</a>]</span> <span class="mw-headline" id="Level_5_Heading"> Level 5 Heading</span></h5>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: Level 6 Heading">edit</a>]</span> <span class="mw-headline" id="Level_6_Heading"> Level 6 Heading</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=7" title="Edit section: = Level 7 Heading=">edit</a>]</span> <span class="mw-headline" id=".3D_Level_7_Heading.3D">= Level 7 Heading=</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=8" title="Edit section: == Level 8 Heading==">edit</a>]</span> <span class="mw-headline" id=".3D.3D_Level_8_Heading.3D.3D">== Level 8 Heading==</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=9" title="Edit section: === Level 9 Heading===">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D_Level_9_Heading.3D.3D.3D">=== Level 9 Heading===</span></h6>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=10" title="Edit section: ==== Level 10 Heading====">edit</a>]</span> <span class="mw-headline" id=".3D.3D.3D.3D_Level_10_Heading.3D.3D.3D.3D">==== Level 10 Heading====</span></h6>
-
+text with amp in the middle of nowhere
+!! input
+Remember AT&T?
+!!result
+<p>Remember AT&amp;T?
+</p>
 !! end
 
 !! test
-TOC regression (bug 9764)
+text with character entity: eacute
 !! input
-== title 1 ==
-=== title 1.1 ===
-==== title 1.1.1 ====
-=== title 1.2 ===
-== title 2 ==
-=== title 2.1 ===
+I always thought &eacute; was a cute letter.
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a>
-<ul>
-<li class="toclevel-3 tocsection-3"><a href="#title_1.1.1"><span class="tocnumber">1.1.1</span> <span class="toctext">title 1.1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+<p>I always thought &#233; was a cute letter.
+</p>
+!! end
 
+!! test
+text with undefined character entity: xacute
+!! input
+I always thought &xacute; was a cute letter.
+!! result
+<p>I always thought &amp;xacute; was a cute letter.
+</p>
 !! end
 
+
+###
+### Media links
+###
+
 !! test
-TOC with wgMaxTocLevel=3 (bug 6204)
-!! options
-wgMaxTocLevel=3
+Media link
 !! input
-== title 1 ==
-=== title 1.1 ===
-==== title 1.1.1 ====
-=== title 1.2 ===
-== title 2 ==
-=== title 2.1 ===
+[[Media:Foobar.jpg]]
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li>
-<li class="toclevel-2 tocsection-4"><a href="#title_1.2"><span class="tocnumber">1.2</span> <span class="toctext">title 1.2</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-6"><a href="#title_2.1"><span class="tocnumber">2.1</span> <span class="toctext">title 2.1</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 1.1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1.1"> title 1.1.1 </span></h4>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: title 1.2">edit</a>]</span> <span class="mw-headline" id="title_1.2"> title 1.2 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: title 2.1">edit</a>]</span> <span class="mw-headline" id="title_2.1"> title 2.1 </span></h3>
+<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Media:Foobar.jpg</a>
+</p>
+!! end
 
+!! test
+Media link with text
+!! input
+[[Media:Foobar.jpg|A neat file to look at]]
+!! result
+<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">A neat file to look at</a>
+</p>
 !! end
 
+# FIXME: this is still bad HTML tag nesting
 !! test
-TOC with wgMaxTocLevel=3 and two level four headings (bug 6204)
-!! options
-wgMaxTocLevel=3
+Media link with nasty text
+fixme: doBlockLevels won't wrap this in a paragraph because it contains a div
 !! input
-==Section 1==
-===Section 1.1===
-====Section 1.1.1====
-====Section 1.1.1.1====
-==Section 2==
+[[Media:Foobar.jpg|Safe Link<div style=display:none>" onmouseover="alert(document.cookie)" onfoo="</div>]]
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Section_1"><span class="tocnumber">1</span> <span class="toctext">Section 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#Section_1.1"><span class="tocnumber">1.1</span> <span class="toctext">Section 1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-5"><a href="#Section_2"><span class="tocnumber">2</span> <span class="toctext">Section 2</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 1">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1">Section 1.1</span></h3>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: Section 1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1">Section 1.1.1</span></h4>
-<h4><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: Section 1.1.1.1">edit</a>]</span> <span class="mw-headline" id="Section_1.1.1.1">Section 1.1.1.1</span></h4>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Section 2">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
+<a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link&lt;div style="display:none"&gt;" onmouseover="alert(document.cookie)" onfoo="&lt;/div&gt;</a>
 
 !! end
 
-
 !! test
-Resolving duplicate section names
+Media link to nonexistent file (bug 1702)
 !! input
-== Foo bar ==
-== Foo bar ==
+[[Media:No such.jpg]]
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar_2"> Foo bar </span></h2>
-
+<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="No such.jpg">Media:No such.jpg</a>
+</p>
 !! end
 
 !! test
-Resolving duplicate section names with differing case (bug 10721)
+Image link to nonexistent file (bug 1850 - good)
 !! input
-== Foo bar ==
-== Foo Bar ==
+[[Image:No such.jpg]]
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo bar">edit</a>]</span> <span class="mw-headline" id="Foo_bar"> Foo bar </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> Foo Bar </span></h2>
+<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="File:No such.jpg">File:No such.jpg</a>
+</p>
+!! end
 
+!! test
+:Image link to nonexistent file (bug 1850 - bad)
+!! input
+[[:Image:No such.jpg]]
+!! result
+<p><a href="/index.php?title=File:No_such.jpg&amp;action=edit&amp;redlink=1" class="new" title="File:No such.jpg (page does not exist)">Image:No such.jpg</a>
+</p>
 !! end
 
+
+
+!! test
+Character reference normalization in link text (bug 1938)
+!! input
+[[Main Page|this&that]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">this&amp;that</a>
+</p>
+!!end
+
 !! article
-Template:sections
+אַ
 !! text
-===Section 1===
-==Section 2==
+Test for unicode normalization
+
+The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
 !! endarticle
 
 !! test
-Template with sections, __NOTOC__
+(bug 19451) Links should refer to the normalized form.
 !! input
-__NOTOC__
-==Section 0==
-{{sections}}
-==Section 4==
+[[&#xFB2E;]]
+[[&#x5d0;&#x5b7;]]
+[[&#x5d0;ַ]]
+[[א&#x5b7;]]
+[[אַ]]
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section 0">edit</a>]</span> <span class="mw-headline" id="Section_0">Section 0</span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-1" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_1">Section 1</span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Template:Sections&amp;action=edit&amp;section=T-2" title="Template:Sections">edit</a>]</span> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Section 4">edit</a>]</span> <span class="mw-headline" id="Section_4">Section 4</span></h2>
-
+<p><a href="/wiki/%D7%90%D6%B7" title="אַ">&#xfb2e;</a>
+<a href="/wiki/%D7%90%D6%B7" title="אַ">&#x5d0;&#x5b7;</a>
+<a href="/wiki/%D7%90%D6%B7" title="אַ">&#x5d0;ַ</a>
+<a href="/wiki/%D7%90%D6%B7" title="אַ">א&#x5b7;</a>
+<a href="/wiki/%D7%90%D6%B7" title="אַ">אַ</a>
+</p>
 !! end
 
 !! test
-__NOEDITSECTION__ keyword
+Empty attribute crash test (bug 2067)
 !! input
-__NOEDITSECTION__
-==Section 1==
-==Section 2==
+<font color="">foo</font>
 !! result
-<h2> <span class="mw-headline" id="Section_1">Section 1</span></h2>
-<h2> <span class="mw-headline" id="Section_2">Section 2</span></h2>
-
+<p><font color="">foo</font>
+</p>
 !! end
 
 !! test
-Link inside a section heading
+Empty attribute crash test single-quotes (bug 2067)
 !! input
-==Section with a [[Main Page|link]] in it==
+<font color=''>foo</font>
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Section with a link in it">edit</a>]</span> <span class="mw-headline" id="Section_with_a_link_in_it">Section with a <a href="/wiki/Main_Page" title="Main Page">link</a> in it</span></h2>
+<p><font color="">foo</font>
+</p>
+!! end
 
+!! test
+Attribute test: equals, then nothing
+!! input
+<font color=>foo</font>
+!! result
+<p><font>foo</font>
+</p>
 !! end
 
 !! test
-TOC regression (bug 12077)
+Attribute test: unquoted value
 !! input
-__TOC__
-== title 1 ==
-=== title 1.1 ===
-== title 2 ==
+<font color=x>foo</font>
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#title_1"><span class="tocnumber">1</span> <span class="toctext">title 1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#title_1.1"><span class="tocnumber">1.1</span> <span class="toctext">title 1.1</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-3"><a href="#title_2"><span class="tocnumber">2</span> <span class="toctext">title 2</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: title 1">edit</a>]</span> <span class="mw-headline" id="title_1"> title 1 </span></h2>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: title 1.1">edit</a>]</span> <span class="mw-headline" id="title_1.1"> title 1.1 </span></h3>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: title 2">edit</a>]</span> <span class="mw-headline" id="title_2"> title 2 </span></h2>
+<p><font color="x">foo</font>
+</p>
+!! end
 
+!! test
+Attribute test: unquoted but illegal value (hash)
+!! input
+<font color=#x>foo</font>
+!! result
+<p><font color="#x">foo</font>
+</p>
 !! end
 
 !! test
-BUG 1219 URL next to image (good)
+Attribute test: no value
 !! input
-http://example.com [[Image:foobar.jpg]]
+<font color>foo</font>
 !! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
+<p><font color="color">foo</font>
 </p>
-!!end
+!! end
 
 !! test
-Short headings with trailing space should match behaviour of Parser::doHeadings (bug 19910)
+Bug 2095: link with three closing brackets
 !! input
-=== 
-The line above must have a trailing space!
-=== <!--
---> <!-- -->
-But just in case it doesn't...
+[[Main Page]]]
 !! result
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D">=</span></h1>
-<p>The line above must have a trailing space!
+<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
 </p>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: =">edit</a>]</span> <span class="mw-headline" id=".3D_2">=</span></h1>
-<p>But just in case it doesn't...
+!! end
+
+!! test
+Bug 2095: link with pipe and three closing brackets
+!! input
+[[Main Page|link]]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">link</a>]
 </p>
 !! end
 
 !! test
-Header with special characters (bug 25462)
+Bug 2095: link with pipe and three closing brackets, version 2
 !! input
-The tooltips shall not show entities to the user (ie. be double escaped)
+[[Main Page|[http://example.com/]]]
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">[http://example.com/]</a>
+</p>
+!! end
 
-== text > text ==
-section 1
 
-== text < text ==
-section 2
+###
+### Safety
+###
+
+!! article
+Template:Dangerous attribute
+!! text
+" onmouseover="alert(document.cookie)
+!! endarticle
 
-== text & text ==
-section 3
+!! article
+Template:Dangerous style attribute
+!! text
+border-size: expression(alert(document.cookie))
+!! endarticle
 
-== text ' text ==
-section 4
+!! article
+Template:Div style
+!! text
+<div style="float: right; {{{1}}}">Magic div</div>
+!! endarticle
 
-== text " text ==
-section 5
+!! test
+Bug 2304: HTML attribute safety (safe template; regression bug 2309)
+!! input
+<div title="{{test}}"></div>
 !! result
-<p>The tooltips shall not show entities to the user (ie. be double escaped)
-</p>
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#text_.3E_text"><span class="tocnumber">1</span> <span class="toctext">text &gt; text</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#text_.3C_text"><span class="tocnumber">2</span> <span class="toctext">text &lt; text</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#text_.26_text"><span class="tocnumber">3</span> <span class="toctext">text &amp; text</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#text_.27_text"><span class="tocnumber">4</span> <span class="toctext">text ' text</span></a></li>
-<li class="toclevel-1 tocsection-5"><a href="#text_.22_text"><span class="tocnumber">5</span> <span class="toctext">text " text</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: text > text">edit</a>]</span> <span class="mw-headline" id="text_.3E_text"> text &gt; text </span></h2>
-<p>section 1
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: text &lt; text">edit</a>]</span> <span class="mw-headline" id="text_.3C_text"> text &lt; text </span></h2>
-<p>section 2
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: text &amp; text">edit</a>]</span> <span class="mw-headline" id="text_.26_text"> text &amp; text </span></h2>
-<p>section 3
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: text ' text">edit</a>]</span> <span class="mw-headline" id="text_.27_text"> text ' text </span></h2>
-<p>section 4
-</p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: text &quot; text">edit</a>]</span> <span class="mw-headline" id="text_.22_text"> text " text </span></h2>
-<p>section 5
-</p>
+<div title="This is a test template"></div>
+
 !! end
 
 !! test
-Headers with excess '=' characters
-(Are similar tests necessary beyond the 1st level?)
+Bug 2304: HTML attribute safety (dangerous template; 2309)
 !! input
-=foo==
-==foo=
-=''italic'' heading==
-==''italic'' heading=
+<div title="{{dangerous attribute}}"></div>
 !! 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>
+<div title=""></div>
 
 !! end
 
 !! test
-BUG 1219 URL next to image (broken)
+Bug 2304: HTML attribute safety (dangerous style template; 2309)
 !! input
-http://example.com[[Image:foobar.jpg]]
+<div style="{{dangerous style attribute}}"></div>
 !! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a>
-</p>
-!!end
+<div style="/* insecure input */"></div>
+
+!! end
 
 !! test
-Bug 1186 news: in the middle of text
+Bug 2304: HTML attribute safety (safe parameter; 2309)
 !! input
-http://en.wikinews.org/wiki/Wikinews:Workplace
+{{div style|width: 200px}}
 !! result
-<p><a rel="nofollow" class="external free" href="http://en.wikinews.org/wiki/Wikinews:Workplace">http://en.wikinews.org/wiki/Wikinews:Workplace</a>
-</p>
-!!end
+<div style="float: right; width: 200px">Magic div</div>
 
+!! end
 
 !! test
-Namespaced link must have a title
+Bug 2304: HTML attribute safety (unsafe parameter; 2309)
 !! input
-[[Project:]]
+{{div style|width: expression(alert(document.cookie))}}
 !! result
-<p>[[Project:]]
-</p>
-!!end
+<div style="/* insecure input */">Magic div</div>
+
+!! end
 
 !! test
-Namespaced link must have a title (bad fragment version)
+Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
 !! input
-[[Project:#fragment]]
+{{div style|"><script>alert(document.cookie)</script>}}
 !! result
-<p>[[Project:#fragment]]
-</p>
-!!end
+<div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
 
+!! end
 
 !! test
-div with no attributes
+Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
 !! input
-<div>HTML rocks</div>
+{{div style|" ><script>alert(document.cookie)</script>}}
 !! result
-<div>HTML rocks</div>
+<div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
 
 !! end
 
 !! test
-div with double-quoted attribute
+Bug 2304: HTML attribute safety (link)
 !! input
-<div id="rock">HTML rocks</div>
+<div title="[[Main Page]]"></div>
 !! result
-<div id="rock">HTML rocks</div>
+<div title="&#91;&#91;Main Page]]"></div>
 
 !! end
 
 !! test
-div with single-quoted attribute
+Bug 2304: HTML attribute safety (italics)
 !! input
-<div id='rock'>HTML rocks</div>
+<div title="''foobar''"></div>
 !! result
-<div id="rock">HTML rocks</div>
+<div title="&#39;&#39;foobar&#39;&#39;"></div>
 
 !! end
 
 !! test
-div with unquoted attribute
+Bug 2304: HTML attribute safety (bold)
 !! input
-<div id=rock>HTML rocks</div>
+<div title="'''foobar'''"></div>
 !! result
-<div id="rock">HTML rocks</div>
+<div title="&#39;&#39;&#39;foobar&#39;&#39;&#39;"></div>
 
 !! end
 
+
 !! test
-div with illegal double attributes
+Bug 2304: HTML attribute safety (ISBN)
 !! input
-<div id="a" id="b">HTML rocks</div>
+<div title="ISBN 1234567890"></div>
 !! result
-<div id="b">HTML rocks</div>
+<div title="&#73;SBN 1234567890"></div>
 
-!!end
+!! end
 
 !! test
-HTML multiple attributes correction
+Bug 2304: HTML attribute safety (RFC)
 !! input
-<p class="error" class="awesome">Awesome!</p>
+<div title="RFC 1234"></div>
 !! result
-<p class="awesome">Awesome!</p>
+<div title="&#82;FC 1234"></div>
 
-!!end
+!! end
 
 !! test
-Table multiple attributes correction
+Bug 2304: HTML attribute safety (PMID)
 !! input
-{|
-!+ class="error" class="awesome"| status
-|}
+<div title="PMID 1234567890"></div>
 !! result
-<table>
-<tr>
-<th class="awesome"> status
-</th></tr></table>
+<div title="&#80;MID 1234567890"></div>
 
-!!end
+!! end
 
 !! test
-DIV IN UPPERCASE
+Bug 2304: HTML attribute safety (web link)
 !! input
-<DIV ID="x">HTML ROCKS</DIV>
+<div title="http://example.com/"></div>
 !! result
-<div id="x">HTML ROCKS</div>
-
-!!end
+<div title="http&#58;//example.com/"></div>
 
+!! end
 
 !! test
-text with amp in the middle of nowhere
+Bug 2304: HTML attribute safety (named web link)
 !! input
-Remember AT&T?
-!!result
-<p>Remember AT&amp;T?
-</p>
+<div title="[http://example.com/ link]"></div>
+!! result
+<div title="&#91;http&#58;//example.com/ link]"></div>
+
 !! end
 
 !! test
-text with character entity: eacute
+Bug 3244: HTML attribute safety (extension; safe)
 !! input
-I always thought &eacute; was a cute letter.
+<div style="<nowiki>background:blue</nowiki>"></div>
 !! result
-<p>I always thought &#233; was a cute letter.
-</p>
+<div style="background:blue"></div>
+
 !! end
 
 !! test
-text with undefined character entity: xacute
+Bug 3244: HTML attribute safety (extension; unsafe)
 !! input
-I always thought &xacute; was a cute letter.
+<div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
 !! result
-<p>I always thought &amp;xacute; was a cute letter.
-</p>
-!! end
+<div style="/* insecure input */"></div>
 
+!! end
 
-###
-### Media links
-###
+# More MSIE fun discovered by Tom Gilder
 
 !! test
-Media link
+MSIE CSS safety test: spurious slash
 !! input
-[[Media:Foobar.jpg]]
+<div style="background-image:u\rl(javascript:alert('boo'))">evil</div>
 !! result
-<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Media:Foobar.jpg</a>
-</p>
+<div style="/* insecure input */">evil</div>
+
 !! end
 
 !! test
-Media link with text
+MSIE CSS safety test: hex code
 !! input
-[[Media:Foobar.jpg|A neat file to look at]]
+<div style="background-image:u\72l(javascript:alert('boo'))">evil</div>
 !! result
-<p><a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">A neat file to look at</a>
-</p>
+<div style="/* insecure input */">evil</div>
+
 !! end
 
-# FIXME: this is still bad HTML tag nesting
 !! test
-Media link with nasty text
-fixme: doBlockLevels won't wrap this in a paragraph because it contains a div
+MSIE CSS safety test: comment in url
 !! input
-[[Media:Foobar.jpg|Safe Link<div style=display:none>" onmouseover="alert(document.cookie)" onfoo="</div>]]
+<div style="background-image:u/**/rl(javascript:alert('boo'))">evil</div>
 !! result
-<a href="http://example.com/images/3/3a/Foobar.jpg" class="internal" title="Foobar.jpg">Safe Link&lt;div style="display:none"&gt;" onmouseover="alert(document.cookie)" onfoo="&lt;/div&gt;</a>
+<div style="background-image:u rl(javascript:alert(&#39;boo&#39;))">evil</div>
 
 !! end
 
 !! test
-Media link to nonexistent file (bug 1702)
+MSIE CSS safety test: comment in expression
 !! input
-[[Media:No such.jpg]]
+<div style="background-image:expres/**/sion(alert('boo4'))">evil4</div>
 !! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="No such.jpg">Media:No such.jpg</a>
-</p>
+<div style="background-image:expres sion(alert(&#39;boo4&#39;))">evil4</div>
+
 !! end
 
+
 !! test
-Image link to nonexistent file (bug 1850 - good)
+Table attribute legitimate extension
 !! input
-[[Image:No such.jpg]]
+{|
+!+ style="<nowiki>color:blue</nowiki>"| status
+|}
 !! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=No_such.jpg" class="new" title="File:No such.jpg">File:No such.jpg</a>
-</p>
+<table>
+<tr>
+<th style="color:blue"> status
+</th></tr></table>
+
+!!end
+
+!! test
+Table attribute safety
+!! input
+{|
+!+ style="<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>"| status
+|}
+!! result
+<table>
+<tr>
+<th style="/* insecure input */"> status
+</th></tr></table>
+
 !! end
 
 !! test
-:Image link to nonexistent file (bug 1850 - bad)
+CSS line continuation 1
 !! input
-[[:Image:No such.jpg]]
+<div style="background-image: u\&#10;rl(test.jpg);"></div>
 !! result
-<p><a href="/index.php?title=File:No_such.jpg&amp;action=edit&amp;redlink=1" class="new" title="File:No such.jpg (page does not exist)">Image:No such.jpg</a>
-</p>
-!! end
-
+<div style="/* insecure input */"></div>
 
+!! end
 
 !! test
-Character reference normalization in link text (bug 1938)
+CSS line continuation 2
 !! input
-[[Main Page|this&that]]
+<div style="background-image: u\&#13;rl(test.jpg); "></div>
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">this&amp;that</a>
-</p>
-!!end
+<div style="/* insecure input */"></div>
+
+!! end
 
 !! article
-אַ
+Template:Identity
 !! text
-Test for unicode normalization
-
-The page's name is U+05d0 U+05b7, with non-canonical form U+FB2E
+{{{1}}}
 !! endarticle
 
 !! test
-(bug 19451) Links should refer to the normalized form.
+Expansion of multi-line templates in attribute values (bug 6255)
 !! input
-[[&#xFB2E;]]
-[[&#x5d0;&#x5b7;]]
-[[&#x5d0;ַ]]
-[[א&#x5b7;]]
-[[אַ]]
+<div style="background: {{identity|#00FF00}}">-</div>
 !! result
-<p><a href="/wiki/%D7%90%D6%B7" title="אַ">&#xfb2e;</a>
-<a href="/wiki/%D7%90%D6%B7" title="אַ">&#x5d0;&#x5b7;</a>
-<a href="/wiki/%D7%90%D6%B7" title="אַ">&#x5d0;ַ</a>
-<a href="/wiki/%D7%90%D6%B7" title="אַ">א&#x5b7;</a>
-<a href="/wiki/%D7%90%D6%B7" title="אַ">אַ</a>
-</p>
-!! end
+<div style="background: #00FF00">-</div>
 
-!! test
-Empty attribute crash test (bug 2067)
-!! input
-<font color="">foo</font>
-!! result
-<p><font color="">foo</font>
-</p>
 !! end
 
+
 !! test
-Empty attribute crash test single-quotes (bug 2067)
+Expansion of multi-line templates in attribute values (bug 6255 sanity check)
 !! input
-<font color=''>foo</font>
+<div style="background: 
+#00FF00">-</div>
 !! result
-<p><font color="">foo</font>
-</p>
+<div style="background: #00FF00">-</div>
+
 !! end
 
 !! test
-Attribute test: equals, then nothing
+Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
 !! input
-<font color=>foo</font>
+<div style="background: &#10;#00FF00">-</div>
 !! result
-<p><font>foo</font>
-</p>
+<div style="background: &#10;#00FF00">-</div>
+
 !! end
 
+###
+### Parser hooks (see maintenance/parserTestsParserHook.php for the <tag> extension)
+###
 !! test
-Attribute test: unquoted value
+Parser hook: empty input
 !! input
-<font color=x>foo</font>
+<tag></tag>
 !! result
-<p><font color="x">foo</font>
-</p>
+<pre>
+''
+array (
+)
+</pre>
+
 !! end
 
 !! test
-Attribute test: unquoted but illegal value (hash)
+Parser hook: empty input using terminated empty elements
 !! input
-<font color=#x>foo</font>
+<tag/>
 !! result
-<p><font color="#x">foo</font>
-</p>
+<pre>
+NULL
+array (
+)
+</pre>
+
 !! end
 
 !! test
-Attribute test: no value
+Parser hook: empty input using terminated empty elements (space before)
 !! input
-<font color>foo</font>
+<tag />
 !! result
-<p><font color="color">foo</font>
-</p>
+<pre>
+NULL
+array (
+)
+</pre>
+
 !! end
 
 !! test
-Bug 2095: link with three closing brackets
+Parser hook: basic input
 !! input
-[[Main Page]]]
+<tag>input</tag>
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>]
-</p>
+<pre>
+'input'
+array (
+)
+</pre>
+
 !! end
 
+
 !! test
-Bug 2095: link with pipe and three closing brackets
+Parser hook: case insensitive
 !! input
-[[Main Page|link]]]
+<TAG>input</TAG>
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">link</a>]
-</p>
+<pre>
+'input'
+array (
+)
+</pre>
+
 !! end
 
+
 !! test
-Bug 2095: link with pipe and three closing brackets, version 2
+Parser hook: case insensitive, redux
 !! input
-[[Main Page|[http://example.com/]]]
+<TaG>input</TAg>
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">[http://example.com/]</a>
-</p>
-!! end
-
-
-###
-### Safety
-###
-
-!! article
-Template:Dangerous attribute
-!! text
-" onmouseover="alert(document.cookie)
-!! endarticle
-
-!! article
-Template:Dangerous style attribute
-!! text
-border-size: expression(alert(document.cookie))
-!! endarticle
+<pre>
+'input'
+array (
+)
+</pre>
 
-!! article
-Template:Div style
-!! text
-<div style="float: right; {{{1}}}">Magic div</div>
-!! endarticle
+!! end
 
 !! test
-Bug 2304: HTML attribute safety (safe template; regression bug 2309)
+Parser hook: nested tags
+!! options
+noxml
 !! input
-<div title="{{test}}"></div>
+<tag><tag></tag></tag>
 !! result
-<div title="This is a test template"></div>
+<pre>
+'<tag>'
+array (
+)
+</pre>&lt;/tag&gt;
 
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (dangerous template; 2309)
+Parser hook: basic arguments
 !! input
-<div title="{{dangerous attribute}}"></div>
+<tag width=200 height = "100" depth = '50' square></tag>
 !! result
-<div title=""></div>
+<pre>
+''
+array (
+  'width' => '200',
+  'height' => '100',
+  'depth' => '50',
+  'square' => 'square',
+)
+</pre>
 
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (dangerous style template; 2309)
+Parser hook: argument containing a forward slash (bug 5344)
 !! input
-<div style="{{dangerous style attribute}}"></div>
+<tag filename='/tmp/bla'></tag>
 !! result
-<div style="/* insecure input */"></div>
+<pre>
+''
+array (
+  'filename' => '/tmp/bla',
+)
+</pre>
 
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (safe parameter; 2309)
+Parser hook: empty input using terminated empty elements (bug 2374)
 !! input
-{{div style|width: 200px}}
+<tag foo=bar/>text
 !! result
-<div style="float: right; width: 200px">Magic div</div>
+<pre>
+NULL
+array (
+  'foo' => 'bar',
+)
+</pre>text
 
 !! end
 
+# </tag> should be output literally since there is no matching tag that begins it
 !! test
-Bug 2304: HTML attribute safety (unsafe parameter; 2309)
+Parser hook: basic arguments using terminated empty elements (bug 2374)
 !! input
-{{div style|width: expression(alert(document.cookie))}}
+<tag width=200 height = "100" depth = '50' square/>
+other stuff
+</tag>
 !! result
-<div style="/* insecure input */">Magic div</div>
-
+<pre>
+NULL
+array (
+  'width' => '200',
+  'height' => '100',
+  'depth' => '50',
+  'square' => 'square',
+)
+</pre>
+<p>other stuff
+&lt;/tag&gt;
+</p>
 !! end
 
+###
+### (see maintenance/parserTestsStaticParserHook.php for the <statictag> extension)
+###
+
 !! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter; 2309)
+Parser hook: static parser hook not inside a comment
 !! input
-{{div style|"><script>alert(document.cookie)</script>}}
+<statictag>hello, world</statictag>
+<statictag action=flush/>
 !! result
-<div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
-
+<p>hello, world
+</p>
 !! end
 
+
 !! test
-Bug 2304: HTML attribute safety (unsafe breakout parameter 2; 2309)
+Parser hook: static parser hook inside a comment
 !! input
-{{div style|" ><script>alert(document.cookie)</script>}}
+<!-- <statictag>hello, world</statictag> -->
+<statictag action=flush/>
 !! result
-<div style="float: right;">&lt;script&gt;alert(document.cookie)&lt;/script&gt;"&gt;Magic div</div>
-
+<p><br />
+</p>
 !! end
 
+# Nested template calls; this case was broken by Parser.php rev 1.506,
+# since reverted.
+
+!! article
+Template:One-parameter
+!! text
+(My parameter is: {{{1}}})
+!! endarticle
+
+!! article
+Template:Map-one-parameter
+!! text
+{{{{{1}}}|{{{2}}}}}
+!! endarticle
+
 !! test
-Bug 2304: HTML attribute safety (link)
+Nested template calls
 !! input
-<div title="[[Main Page]]"></div>
+{{Map-one-parameter|One-parameter|param}}
 !! result
-<div title="&#91;&#91;Main Page]]"></div>
-
+<p>(My parameter is: param)
+</p>
 !! end
 
+
+###
+### Sanitizer
+###
 !! test
-Bug 2304: HTML attribute safety (italics)
+Sanitizer: Closing of open tags
 !! input
-<div title="''foobar''"></div>
+<s></s><table></table>
 !! result
-<div title="&#39;&#39;foobar&#39;&#39;"></div>
+<s></s><table></table>
 
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (bold)
+Sanitizer: Closing of open but not closed tags
 !! input
-<div title="'''foobar'''"></div>
+<s>foo
 !! result
-<div title="&#39;&#39;&#39;foobar&#39;&#39;&#39;"></div>
-
+<p><s>foo</s>
+</p>
 !! end
 
-
 !! test
-Bug 2304: HTML attribute safety (ISBN)
+Sanitizer: Closing of closed but not open tags
 !! input
-<div title="ISBN 1234567890"></div>
+</s>
 !! result
-<div title="&#73;SBN 1234567890"></div>
-
+<p>&lt;/s&gt;
+</p>
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (RFC)
+Sanitizer: Closing of closed but not open table tags
 !! input
-<div title="RFC 1234"></div>
+Table not started</td></tr></table>
 !! result
-<div title="&#82;FC 1234"></div>
-
+<p>Table not started&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
+</p>
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (PMID)
+Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=""
 !! input
-<div title="PMID 1234567890"></div>
+<span id="æ: v">byte</span>[[#æ: v|backlink]]
 !! result
-<div title="&#80;MID 1234567890"></div>
-
+<p><span id=".C3.A6:_v">byte</span><a href="#.C3.A6:_v">backlink</a>
+</p>
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (web link)
+Sanitizer: Validating the contents of the id attribute (bug 4515)
+!! options
+disabled
 !! input
-<div title="http://example.com/"></div>
+<br id=9 />
 !! result
-<div title="http&#58;//example.com/"></div>
-
+Something, but definitely not <br id="9" />...
 !! end
 
 !! test
-Bug 2304: HTML attribute safety (named web link)
+Sanitizer: Validating id attribute uniqueness (bug 4515, bug 6301)
+!! options
+disabled
 !! input
-<div title="[http://example.com/ link]"></div>
+<br id="foo" /><br id="foo" />
 !! result
-<div title="&#91;http&#58;//example.com/ link]"></div>
-
+Something need to be done. foo-2 ? 
 !! end
 
 !! test
-Bug 3244: HTML attribute safety (extension; safe)
+Sanitizer: Validating that <meta> and <link> work, but only for Microdata
 !! input
-<div style="<nowiki>background:blue</nowiki>"></div>
+<div itemscope>
+       <meta itemprop="hello" content="world">
+       <meta http-equiv="refresh" content="5">
+       <meta itemprop="hello" http-equiv="refresh" content="5">
+       <link itemprop="hello" href="{{SERVER}}">
+       <link rel="stylesheet" href="{{SERVER}}">
+       <link rel="stylesheet" itemprop="hello" href="{{SERVER}}">
+</div>
 !! result
-<div style="background:blue"></div>
+<div itemscope="itemscope">
+<p>    <meta itemprop="hello" content="world" />
+       &lt;meta http-equiv="refresh" content="5"&gt;
+       <meta itemprop="hello" content="5" />
+</p>
+       <link itemprop="hello" href="http&#58;//Britney-Spears" />
+       &lt;link rel="stylesheet" href="<a rel="nofollow" class="external free" href="http://Britney-Spears">http://Britney-Spears</a>"&gt;
+       <link itemprop="hello" href="http&#58;//Britney-Spears" />
+</div>
 
 !! end
 
 !! test
-Bug 3244: HTML attribute safety (extension; unsafe)
+Language converter: output gets cut off unexpectedly (bug 5757)
+!! options
+language=zh
 !! input
-<div style="<nowiki>border-left:expression(alert(document.cookie))</nowiki>"></div>
-!! result
-<div style="/* insecure input */"></div>
+this bit is safe: }-
 
-!! end
+but if we add a conversion instance: -{zh-cn:xxx;zh-tw:yyy}-
 
-# More MSIE fun discovered by Tom Gilder
+then we get cut off here: }-
+
+all additional text is vanished
+!! result
+<p>this bit is safe: }-
+</p><p>but if we add a conversion instance: xxx
+</p><p>then we get cut off here: }-
+</p><p>all additional text is vanished
+</p>
+!! end
 
 !! test
-MSIE CSS safety test: spurious slash
+Self closed html pairs (bug 5487)
+!! options
 !! input
-<div style="background-image:u\rl(javascript:alert('boo'))">evil</div>
+<center><font id="bug" />Centered text</center>
+<div><font id="bug2" />In div text</div>
 !! result
-<div style="/* insecure input */">evil</div>
+<center>&lt;font id="bug" /&gt;Centered text</center>
+<div>&lt;font id="bug2" /&gt;In div text</div>
 
 !! end
 
+#
+#
+#
+
 !! test
-MSIE CSS safety test: hex code
+Punctuation: nbsp before exclamation
 !! input
-<div style="background-image:u\72l(javascript:alert('boo'))">evil</div>
+C'est grave !
 !! result
-<div style="/* insecure input */">evil</div>
-
+<p>C'est grave&#160;!
+</p>
 !! end
 
 !! test
-MSIE CSS safety test: comment in url
+Punctuation: CSS !important (bug 11874)
 !! input
-<div style="background-image:u/**/rl(javascript:alert('boo'))">evil</div>
+<div style="width:50% !important">important</div>
 !! result
-<div style="background-image:u rl(javascript:alert(&#39;boo&#39;))">evil</div>
+<div style="width:50% !important">important</div>
 
-!! end
+!!end
 
 !! test
-MSIE CSS safety test: comment in expression
+Punctuation: CSS ! important (bug 11874; with space after)
 !! input
-<div style="background-image:expres/**/sion(alert('boo4'))">evil4</div>
+<div style="width:50% ! important">important</div>
 !! result
-<div style="background-image:expres sion(alert(&#39;boo4&#39;))">evil4</div>
+<div style="width:50% ! important">important</div>
 
-!! end
+!!end
 
 
 !! test
-Table attribute legitimate extension
+HTML bullet list, closed tags (bug 5497)
 !! input
-{|
-!+ style="<nowiki>color:blue</nowiki>"| status
-|}
+<ul>
+<li>One</li>
+<li>Two</li>
+</ul>
 !! result
-<table>
-<tr>
-<th style="color:blue"> status
-</th></tr></table>
+<ul>
+<li>One</li>
+<li>Two</li>
+</ul>
 
-!!end
+!! end
 
 !! test
-Table attribute safety
+HTML bullet list, unclosed tags (bug 5497)
+!! options
+disabled
 !! input
-{|
-!+ style="<nowiki>border-width:expression(0+alert(document.cookie))</nowiki>"| status
-|}
+<ul>
+<li>One
+<li>Two
+</ul>
 !! result
-<table>
-<tr>
-<th style="/* insecure input */"> status
-</th></tr></table>
+<ul>
+<li>One
+</li><li>Two
+</li></ul>
 
 !! end
 
 !! test
-CSS line continuation 1
+HTML ordered list, closed tags (bug 5497)
 !! input
-<div style="background-image: u\&#10;rl(test.jpg);"></div>
+<ol>
+<li>One</li>
+<li>Two</li>
+</ol>
 !! result
-<div style="/* insecure input */"></div>
+<ol>
+<li>One</li>
+<li>Two</li>
+</ol>
 
 !! end
 
 !! test
-CSS line continuation 2
+HTML ordered list, unclosed tags (bug 5497)
+!! options
+disabled
 !! input
-<div style="background-image: u\&#13;rl(test.jpg); "></div>
+<ol>
+<li>One
+<li>Two
+</ol>
 !! result
-<div style="/* insecure input */"></div>
+<ol>
+<li>One
+</li><li>Two
+</li></ol>
 
 !! end
 
-!! article
-Template:Identity
-!! text
-{{{1}}}
-!! endarticle
-
 !! test
-Expansion of multi-line templates in attribute values (bug 6255)
+HTML nested bullet list, closed tags (bug 5497)
 !! input
-<div style="background: {{identity|#00FF00}}">-</div>
+<ul>
+<li>One</li>
+<li>Two:
+<ul>
+<li>Sub-one</li>
+<li>Sub-two</li>
+</ul>
+</li>
+</ul>
 !! result
-<div style="background: #00FF00">-</div>
+<ul>
+<li>One</li>
+<li>Two:
+<ul>
+<li>Sub-one</li>
+<li>Sub-two</li>
+</ul>
+</li>
+</ul>
 
 !! end
 
-
 !! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check)
+HTML nested bullet list, open tags (bug 5497)
+!! options
+disabled
 !! input
-<div style="background: 
-#00FF00">-</div>
+<ul>
+<li>One
+<li>Two:
+<ul>
+<li>Sub-one
+<li>Sub-two
+</ul>
+</ul>
 !! result
-<div style="background: #00FF00">-</div>
+<ul>
+<li>One
+</li><li>Two:
+<ul>
+<li>Sub-one
+</li><li>Sub-two
+</li></ul>
+</li></ul>
 
 !! end
 
 !! test
-Expansion of multi-line templates in attribute values (bug 6255 sanity check 2)
+HTML nested ordered list, closed tags (bug 5497)
 !! input
-<div style="background: &#10;#00FF00">-</div>
+<ol>
+<li>One</li>
+<li>Two:
+<ol>
+<li>Sub-one</li>
+<li>Sub-two</li>
+</ol>
+</li>
+</ol>
 !! result
-<div style="background: &#10;#00FF00">-</div>
+<ol>
+<li>One</li>
+<li>Two:
+<ol>
+<li>Sub-one</li>
+<li>Sub-two</li>
+</ol>
+</li>
+</ol>
 
 !! end
 
-###
-### Parser hooks (see maintenance/parserTestsParserHook.php for the <tag> extension)
-###
 !! test
-Parser hook: empty input
+HTML nested ordered list, open tags (bug 5497)
+!! options
+disabled
 !! input
-<tag></tag>
+<ol>
+<li>One
+<li>Two:
+<ol>
+<li>Sub-one
+<li>Sub-two
+</ol>
+</ol>
 !! result
-<pre>
-string(0) ""
-array(0) {
-}
-</pre>
+<ol>
+<li>One
+</li><li>Two:
+<ol>
+<li>Sub-one
+</li><li>Sub-two
+</li></ol>
+</li></ol>
 
 !! end
 
 !! test
-Parser hook: empty input using terminated empty elements
+HTML ordered list item with parameters oddity
 !! input
-<tag/>
+<ol><li id="fragment">One</li></ol>
 !! result
-<pre>
-NULL
-array(0) {
-}
-</pre>
+<ol><li id="fragment">One</li></ol>
 
 !! end
 
-!! test
-Parser hook: empty input using terminated empty elements (space before)
+!!test
+bug 5918: autonumbering
 !! input
-<tag />
-!! result
-<pre>
-NULL
-array(0) {
-}
-</pre>
+[http://first/] [http://second] [ftp://ftp]
+
+ftp://inlineftp
+
+[mailto:enclosed@mail.tld With target]
 
+[mailto:enclosed@mail.tld]
+
+mailto:inline@mail.tld
+!! result
+<p><a rel="nofollow" class="external autonumber" href="http://first/">[1]</a> <a rel="nofollow" class="external autonumber" href="http://second">[2]</a> <a rel="nofollow" class="external autonumber" href="ftp://ftp">[3]</a>
+</p><p><a rel="nofollow" class="external free" href="ftp://inlineftp">ftp://inlineftp</a>
+</p><p><a rel="nofollow" class="external text" href="mailto:enclosed@mail.tld">With target</a>
+</p><p><a rel="nofollow" class="external autonumber" href="mailto:enclosed@mail.tld">[4]</a>
+</p><p><a rel="nofollow" class="external free" href="mailto:inline@mail.tld">mailto:inline@mail.tld</a>
+</p>
 !! end
 
+
+#
+# Security and HTML correctness
+# From Nick Jenkins' fuzz testing
+#
+
 !! test
-Parser hook: basic input
+Fuzz testing: Parser13
 !! input
-<tag>input</tag>
+{| 
+| http://a|
 !! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
+<table>
+<tr>
+<td>
+</td>
+</tr>
+</table>
 
 !! end
 
-
 !! test
-Parser hook: case insensitive
+Fuzz testing: Parser14
 !! input
-<TAG>input</TAG>
+== onmouseover= ==
+http://__TOC__
 !! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
+http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
+</ul>
+</td></tr></table>
 
 !! end
 
-
 !! test
-Parser hook: case insensitive, redux
+Fuzz testing: Parser14-table
 !! input
-<TaG>input</TAg>
+==a==
+{| STYLE=__TOC__
 !! result
-<pre>
-string(5) "input"
-array(0) {
-}
-</pre>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span> <span class="mw-headline" id="a">a</span></h2>
+<table style="&#95;_TOC&#95;_">
+<tr><td></td></tr>
+</table>
 
 !! end
 
+# Known to produce bogus xml (extra </td>)
 !! test
-Parser hook: nested tags
+Fuzz testing: Parser16
 !! options
 noxml
 !! input
-<tag><tag></tag></tag>
+{|
+!https://||||||
 !! result
-<pre>
-string(5) "<tag>"
-array(0) {
-}
-</pre>&lt;/tag&gt;
+<table>
+<tr>
+<th>https://</th>
+<th></th>
+<th></th>
+<th>
+</td>
+</tr>
+</table>
 
 !! end
 
 !! test
-Parser hook: basic arguments
+Fuzz testing: Parser21
 !! input
-<tag width=200 height = "100" depth = '50' square></tag>
+{|
+! irc://{{ftp://a" onmouseover="alert('hello world');"
+|
 !! result
-<pre>
-string(0) ""
-array(4) {
-  ["width"]=>
-  string(3) "200"
-  ["height"]=>
-  string(3) "100"
-  ["depth"]=>
-  string(2) "50"
-  ["square"]=>
-  string(6) "square"
-}
-</pre>
+<table>
+<tr>
+<th> <a rel="nofollow" class="external free" href="irc://{{ftp://a">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
+</th>
+<td>
+</td>
+</tr>
+</table>
 
 !! end
 
 !! test
-Parser hook: argument containing a forward slash (bug 5344)
+Fuzz testing: Parser22
 !! input
-<tag filename='/tmp/bla'></tag>
-!! result
-<pre>
-string(0) ""
-array(1) {
-  ["filename"]=>
-  string(8) "/tmp/bla"
-}
-</pre>
+http://===r:::https://b
+
+{|
+!!result
+<p><a rel="nofollow" class="external free" href="http://===r:::https://b">http://===r:::https://b</a>
+</p>
+<table>
+<tr><td></td></tr>
+</table>
 
 !! end
 
+# Known to produce bad XML for now
 !! test
-Parser hook: empty input using terminated empty elements (bug 2374)
+Fuzz testing: Parser24
+!! options
+noxml
 !! input
-<tag foo=bar/>text
+{|
+{{{|
+<u CLASS=
+| {{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}} >
+<br style="onmouseover='alert(document.cookie);' " />
+
+MOVE YOUR MOUSE CURSOR OVER THIS TEXT
+|
 !! result
-<pre>
-NULL
-array(1) {
-  ["foo"]=>
-  string(3) "bar"
-}
-</pre>text
+<table>
+{{{|
+<u class="&#124;">}}}} &gt;
+<br style="onmouseover=&#39;alert(document.cookie);&#39;" />
+
+MOVE YOUR MOUSE CURSOR OVER THIS TEXT
+<tr>
+<td></u>
+</td>
+</tr>
+</table>
 
 !! end
 
-# </tag> should be output literally since there is no matching tag that begins it
-!! test
-Parser hook: basic arguments using terminated empty elements (bug 2374)
+# Note: the current result listed for this is not what the original one was,
+# but the original bug was JavaScript injection, which is fixed in any case.
+# It's not clear that the original result listed was any more correct than the
+# current one.  Original result:
+# <p>{{{| 
+# </p>
+# <li class="&#124;&#124;">
+# }}}blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
+!!test
+Fuzz testing: Parser25 (bug 6055)
 !! input
-<tag width=200 height = "100" depth = '50' square/>
-other stuff
-</tag>
+{{{
+| 
+<LI CLASS=||
+ >
+}}}blah" onmouseover="alert('hello world');" align="left"'''MOVE MOUSE CURSOR OVER HERE
 !! result
-<pre>
-NULL
-array(4) {
-  ["width"]=>
-  string(3) "200"
-  ["height"]=>
-  string(3) "100"
-  ["depth"]=>
-  string(2) "50"
-  ["square"]=>
-  string(6) "square"
-}
-</pre>
-<p>other stuff
-&lt;/tag&gt;
+<p>&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
 </p>
 !! end
 
-###
-### (see maintenance/parserTestsStaticParserHook.php for the <statictag> extension)
-###
-
-!! test
-Parser hook: static parser hook not inside a comment
+!!test
+Fuzz testing: URL adjacent extension (with space, clean)
+!! options
 !! input
-<statictag>hello, world</statictag>
-<statictag action=flush/>
+http://example.com <nowiki>junk</nowiki>
 !! result
-<p>hello, world
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> junk
 </p>
-!! end
-
+!!end
 
-!! test
-Parser hook: static parser hook inside a comment
+!!test
+Fuzz testing: URL adjacent extension (no space, dirty; nowiki)
+!! options
 !! input
-<!-- <statictag>hello, world</statictag> -->
-<statictag action=flush/>
+http://example.com<nowiki>junk</nowiki>
 !! result
-<p><br />
+<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>junk
 </p>
-!! end
-
-# Nested template calls; this case was broken by Parser.php rev 1.506,
-# since reverted.
-
-!! article
-Template:One-parameter
-!! text
-(My parameter is: {{{1}}})
-!! endarticle
-
-!! article
-Template:Map-one-parameter
-!! text
-{{{{{1}}}|{{{2}}}}}
-!! endarticle
+!!end
 
-!! test
-Nested template calls
+!!test
+Fuzz testing: URL adjacent extension (no space, dirty; pre)
+!! options
 !! input
-{{Map-one-parameter|One-parameter|param}}
+http://example.com<pre>junk</pre>
 !! result
-<p>(My parameter is: param)
-</p>
-!! end
+<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><pre>junk</pre>
 
+!!end
+
+!!test
+Fuzz testing: image with bogus manual thumbnail
+!!input
+[[Image:foobar.jpg|thumbnail= ]]
+!!result
+<div class="thumb tright"><div class="thumbinner" style="width:1943px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
+
+!!end
 
-###
-### Sanitizer
-###
 !! test
-Sanitizer: Closing of open tags
+Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
 !! input
-<s></s><table></table>
+<pre dir="&#10;"></pre>
 !! result
-<s></s><table></table>
+<pre dir="&#10;"></pre>
 
 !! end
 
 !! test
-Sanitizer: Closing of open but not closed tags
+Parsing optional HTML elements (Bug 6171)
+!! options
 !! input
-<s>foo
+<table>
+  <tr>
+    <td> Some tabular data</td>
+    <td> More tabular data ...
+    <td> And yet som tabular data</td>
+  </tr>
+</table>
 !! result
-<p><s>foo</s>
-</p>
+<table>
+  <tr>
+    <td> Some tabular data</td>
+    <td> More tabular data ...
+    </td><td> And yet som tabular data</td>
+  </tr>
+</table>
+
 !! end
 
 !! test
-Sanitizer: Closing of closed but not open tags
+Correct handling of <td>, <tr> (Bug 6171)
+!! options
 !! input
-</s>
+<table>
+  <tr>
+    <td> Some tabular data</td>
+    <td> More tabular data ...</td>
+    <td> And yet som tabular data</td>
+  </tr>
+</table>
 !! result
-<p>&lt;/s&gt;
-</p>
+<table>
+  <tr>
+    <td> Some tabular data</td>
+    <td> More tabular data ...</td>
+    <td> And yet som tabular data</td>
+  </tr>
+</table>
+
 !! end
 
+
 !! test
-Sanitizer: Closing of closed but not open table tags
+Parsing crashing regression (fr:JavaScript)
 !! input
-Table not started</td></tr></table>
+</body></x>
 !! result
-<p>Table not started&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
+<p>&lt;/body&gt;&lt;/x&gt;
 </p>
 !! end
 
 !! test
-Sanitizer: Escaping of spaces, multibyte characters, colons & other stuff in id=""
+Inline wiki vs wiki block nesting
 !! input
-<span id="æ: v">byte</span>[[#æ: v|backlink]]
+'''Bold paragraph
+
+New wiki paragraph
 !! result
-<p><span id=".C3.A6:_v">byte</span><a href="#.C3.A6:_v">backlink</a>
+<p><b>Bold paragraph</b>
+</p><p>New wiki paragraph
 </p>
 !! end
 
 !! test
-Sanitizer: Validating the contents of the id attribute (bug 4515)
+Inline HTML vs wiki block nesting
 !! options
 disabled
 !! input
-<br id=9 />
+<b>Bold paragraph
+
+New wiki paragraph
 !! result
-Something, but definitely not <br id="9" />...
+<p><b>Bold paragraph</b>
+</p><p>New wiki paragraph
+</p>
 !! end
 
-!! test
-Sanitizer: Validating id attribute uniqueness (bug 4515, bug 6301)
+# Original result was this:
+# <p><b>bold</b><b>bold<i>bolditalics</i></b>
+# </p>
+# While that might be marginally more intuitive, maybe, the six-apostrophe
+# construct is clearly pathological and the result stated here (which is what
+# the parser actually does) is about as reasonable as anything.
+!!test
+Mixing markup for italics and bold
 !! options
-disabled
 !! input
-<br id="foo" /><br id="foo" />
+'''bold''''''bold''bolditalics'''''
 !! result
-Something need to be done. foo-2 ? 
+<p>'<i>bold'</i><b>bold<i>bolditalics</i></b>
+</p>
 !! end
 
+
+!! article
+Xyzzyx
+!! text
+Article for special page transclusion test
+!! endarticle
+
 !! test
-Language converter: output gets cut off unexpectedly (bug 5757)
+Special page transclusion
 !! options
-language=zh
 !! input
-this bit is safe: }-
-
-but if we add a conversion instance: -{zh-cn:xxx;zh-tw:yyy}-
-
-then we get cut off here: }-
-
-all additional text is vanished
+{{Special:Prefixindex/Xyzzyx}}
 !! result
-<p>this bit is safe: }-
-</p><p>but if we add a conversion instance: xxx
-</p><p>then we get cut off here: }-
-</p><p>all additional text is vanished
-</p>
+<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+
 !! end
 
 !! test
-Self closed html pairs (bug 5487)
+Special page transclusion twice (bug 5021)
 !! options
 !! input
-<center><font id="bug" />Centered text</center>
-<div><font id="bug2" />In div text</div>
+{{Special:Prefixindex/Xyzzyx}}
+{{Special:Prefixindex/Xyzzyx}}
 !! result
-<center>&lt;font id="bug" /&gt;Centered text</center>
-<div>&lt;font id="bug2" /&gt;In div text</div>
+<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
 
 !! end
 
-#
-#
-#
-
 !! test
-Punctuation: nbsp before exclamation
+Transclusion of default MediaWiki message
 !! input
-C'est grave !
-!! result
-<p>C'est grave&#160;!
+{{MediaWiki:Mainpage}}
+!!result
+<p>Main Page
 </p>
 !! end
 
 !! test
-Punctuation: CSS !important (bug 11874)
+Transclusion of nonexistent MediaWiki message
 !! input
-<div style="width:50% !important">important</div>
-!! result
-<div style="width:50% !important">important</div>
-
-!!end
+{{MediaWiki:Mainpagexxx}}
+!!result
+<p><a href="/index.php?title=MediaWiki:Mainpagexxx&amp;action=edit&amp;redlink=1" class="new" title="MediaWiki:Mainpagexxx (page does not exist)">MediaWiki:Mainpagexxx</a>
+</p>
+!! end
 
 !! test
-Punctuation: CSS ! important (bug 11874; with space after)
+Transclusion of MediaWiki message with underscore
 !! input
-<div style="width:50% ! important">important</div>
+{{MediaWiki:history_short}}
 !! result
-<div style="width:50% ! important">important</div>
-
-!!end
-
+<p>History
+</p>
+!! end
 
 !! test
-HTML bullet list, closed tags (bug 5497)
+Transclusion of MediaWiki message with space
 !! input
-<ul>
-<li>One</li>
-<li>Two</li>
-</ul>
+{{MediaWiki:history short}}
 !! result
-<ul>
-<li>One</li>
-<li>Two</li>
-</ul>
-
+<p>History
+</p>
 !! end
 
 !! test
-HTML bullet list, unclosed tags (bug 5497)
-!! options
-disabled
+Invalid header with following text
 !! input
-<ul>
-<li>One
-<li>Two
-</ul>
+= x = y
 !! result
-<ul>
-<li>One
-</li><li>Two
-</li></ul>
-
+<p>= x = y
+</p>
 !! end
 
+
 !! test
-HTML ordered list, closed tags (bug 5497)
+Section extraction test (section 0)
+!! options
+section=0
 !! input
-<ol>
-<li>One</li>
-<li>Two</li>
-</ol>
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<ol>
-<li>One</li>
-<li>Two</li>
-</ol>
-
+start
 !! end
 
 !! test
-HTML ordered list, unclosed tags (bug 5497)
+Section extraction test (section 1)
 !! options
-disabled
+section=1
 !! input
-<ol>
-<li>One
-<li>Two
-</ol>
-!! result
-<ol>
-<li>One
-</li><li>Two
-</li></ol>
-
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
+!! result
+==a==
+===aa===
+====aaa====
 !! end
 
 !! test
-HTML nested bullet list, closed tags (bug 5497)
+Section extraction test (section 2)
+!! options
+section=2
 !! input
-<ul>
-<li>One</li>
-<li>Two:
-<ul>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ul>
-</li>
-</ul>
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<ul>
-<li>One</li>
-<li>Two:
-<ul>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ul>
-</li>
-</ul>
-
+===aa===
+====aaa====
 !! end
 
 !! test
-HTML nested bullet list, open tags (bug 5497)
+Section extraction test (section 3)
 !! options
-disabled
+section=3
 !! input
-<ul>
-<li>One
-<li>Two:
-<ul>
-<li>Sub-one
-<li>Sub-two
-</ul>
-</ul>
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<ul>
-<li>One
-</li><li>Two:
-<ul>
-<li>Sub-one
-</li><li>Sub-two
-</li></ul>
-</li></ul>
-
+====aaa====
 !! end
 
 !! test
-HTML nested ordered list, closed tags (bug 5497)
+Section extraction test (section 4)
+!! options
+section=4
 !! input
-<ol>
-<li>One</li>
-<li>Two:
-<ol>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ol>
-</li>
-</ol>
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<ol>
-<li>One</li>
-<li>Two:
-<ol>
-<li>Sub-one</li>
-<li>Sub-two</li>
-</ol>
-</li>
-</ol>
-
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
 !! end
 
 !! test
-HTML nested ordered list, open tags (bug 5497)
+Section extraction test (section 5)
 !! options
-disabled
+section=5
 !! input
-<ol>
-<li>One
-<li>Two:
-<ol>
-<li>Sub-one
-<li>Sub-two
-</ol>
-</ol>
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<ol>
-<li>One
-</li><li>Two:
-<ol>
-<li>Sub-one
-</li><li>Sub-two
-</li></ol>
-</li></ol>
-
+===ba===
 !! end
 
 !! test
-HTML ordered list item with parameters oddity
+Section extraction test (section 6)
+!! options
+section=6
 !! input
-<ol><li id="fragment">One</li></ol>
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<ol><li id="fragment">One</li></ol>
-
+===bb===
+====bba====
 !! end
 
-!!test
-bug 5918: autonumbering
+!! test
+Section extraction test (section 7)
+!! options
+section=7
 !! input
-[http://first/] [http://second] [ftp://ftp]
-
-ftp://inlineftp
-
-[mailto:enclosed@mail.tld With target]
-
-[mailto:enclosed@mail.tld]
-
-mailto:inline@mail.tld
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<p><a rel="nofollow" class="external autonumber" href="http://first/">[1]</a> <a rel="nofollow" class="external autonumber" href="http://second">[2]</a> <a rel="nofollow" class="external autonumber" href="ftp://ftp">[3]</a>
-</p><p><a rel="nofollow" class="external free" href="ftp://inlineftp">ftp://inlineftp</a>
-</p><p><a rel="nofollow" class="external text" href="mailto:enclosed@mail.tld">With target</a>
-</p><p><a rel="nofollow" class="external autonumber" href="mailto:enclosed@mail.tld">[4]</a>
-</p><p><a rel="nofollow" class="external free" href="mailto:inline@mail.tld">mailto:inline@mail.tld</a>
-</p>
+====bba====
 !! end
 
-
-#
-# Security and HTML correctness
-# From Nick Jenkins' fuzz testing
-#
-
 !! test
-Fuzz testing: Parser13
+Section extraction test (section 8)
+!! options
+section=8
 !! input
-{| 
-| http://a|
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<table>
-<tr>
-<td>
-</td>
-</tr>
-</table>
-
+===bc===
 !! end
 
 !! test
-Fuzz testing: Parser14
+Section extraction test (section 9)
+!! options
+section=9
 !! input
-== onmouseover= ==
-http://__TOC__
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: onmouseover=">edit</a>]</span> <span class="mw-headline" id="onmouseover.3D"> onmouseover= </span></h2>
-http://<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#onmouseover.3D"><span class="tocnumber">1</span> <span class="toctext">onmouseover=</span></a></li>
-</ul>
-</td></tr></table>
-
+==c==
+===ca===
 !! end
 
 !! test
-Fuzz testing: Parser14-table
+Section extraction test (section 10)
+!! options
+section=10
 !! input
+start
 ==a==
-{| STYLE=__TOC__
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: a">edit</a>]</span> <span class="mw-headline" id="a">a</span></h2>
-<table style="&#95;_TOC&#95;_">
-<tr><td></td></tr>
-</table>
-
+===ca===
 !! end
 
-# Known to produce bogus xml (extra </td>)
 !! test
-Fuzz testing: Parser16
+Section extraction test (nonexistent section 11)
 !! options
-noxml
+section=11
 !! input
-{|
-!https://||||||
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<table>
-<tr>
-<th>https://</th>
-<th></th>
-<th></th>
-<th>
-</td>
-</tr>
-</table>
-
 !! end
 
 !! test
-Fuzz testing: Parser21
+Section extraction test with bogus heading (section 1)
+!! options
+section=1
 !! input
-{|
-! irc://{{ftp://a" onmouseover="alert('hello world');"
-|
+==a==
+==bogus== not a legal section
+==b==
 !! result
-<table>
-<tr>
-<th> <a rel="nofollow" class="external free" href="irc://{{ftp://a">irc://{{ftp://a</a>" onmouseover="alert('hello world');"
-</th>
-<td>
-</td>
-</tr>
-</table>
-
-!! end
-
-!! test
-Fuzz testing: Parser22
-!! input
-http://===r:::https://b
-
-{|
-!!result
-<p><a rel="nofollow" class="external free" href="http://===r:::https://b">http://===r:::https://b</a>
-</p>
-<table>
-<tr><td></td></tr>
-</table>
-
+==a==
+==bogus== not a legal section
 !! end
 
-# Known to produce bad XML for now
 !! test
-Fuzz testing: Parser24
+Section extraction test with bogus heading (section 2)
 !! options
-noxml
-!! input
-{|
-{{{|
-<u CLASS=
-| {{{{SSSll!!!!!!!VVVV)]]][[Special:*xxxxxxx--><noinclude>}}}} >
-<br style="onmouseover='alert(document.cookie);' " />
-
-MOVE YOUR MOUSE CURSOR OVER THIS TEXT
-|
-!! result
-<table>
-{{{|
-<u class="&#124;">}}}} &gt;
-<br style="onmouseover=&#39;alert(document.cookie);&#39;" />
-
-MOVE YOUR MOUSE CURSOR OVER THIS TEXT
-<tr>
-<td></u>
-</td>
-</tr>
-</table>
-
-!! end
-
-# Note: the current result listed for this is not what the original one was,
-# but the original bug was JavaScript injection, which is fixed in any case.
-# It's not clear that the original result listed was any more correct than the
-# current one.  Original result:
-# <p>{{{| 
-# </p>
-# <li class="&#124;&#124;">
-# }}}blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
-!!test
-Fuzz testing: Parser25 (bug 6055)
+section=2
 !! input
-{{{
-| 
-<LI CLASS=||
- >
-}}}blah" onmouseover="alert('hello world');" align="left"'''MOVE MOUSE CURSOR OVER HERE
+==a==
+==bogus== not a legal section
+==b==
 !! result
-<p>&lt;LI CLASS=blah" onmouseover="alert('hello world');" align="left"<b>MOVE MOUSE CURSOR OVER HERE</b>
-</p>
+==b==
 !! end
 
-!!test
-Fuzz testing: URL adjacent extension (with space, clean)
+!! test
+Section extraction test with comment after heading (section 1)
 !! options
+section=1
 !! input
-http://example.com <nowiki>junk</nowiki>
+==a==
+==b== <!-- -->
+==c==
 !! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a> junk
-</p>
-!!end
+==a==
+!! end
 
-!!test
-Fuzz testing: URL adjacent extension (no space, dirty; nowiki)
+!! test
+Section extraction test with comment after heading (section 2)
 !! options
+section=2
 !! input
-http://example.com<nowiki>junk</nowiki>
+==a==
+==b== <!-- -->
+==c==
 !! result
-<p><a rel="nofollow" class="external free" href="http://example.com">http://example.com</a>junk
-</p>
-!!end
+==b== <!-- -->
+!! end
 
-!!test
-Fuzz testing: URL adjacent extension (no space, dirty; pre)
+!! test
+Section extraction test with bogus <nowiki> heading (section 1)
 !! options
+section=1
 !! input
-http://example.com<pre>junk</pre>
+==a==
+==bogus== <nowiki>not a legal section</nowiki>
+==b==
 !! result
-<a rel="nofollow" class="external free" href="http://example.com">http://example.com</a><pre>junk</pre>
-
-!!end
-
-!!test
-Fuzz testing: image with bogus manual thumbnail
-!!input
-[[Image:foobar.jpg|thumbnail= ]]
-!!result
-<div class="thumb tright"><div class="thumbinner" style="width:1943px;">Error creating thumbnail:   <div class="thumbcaption"></div></div></div>
-
-!!end
+==a==
+==bogus== <nowiki>not a legal section</nowiki>
+!! end
 
 !! test
-Fuzz testing: encoded newline in generated HTML replacements (bug 6577)
+Section extraction test with bogus <nowiki> heading (section 2)
+!! options
+section=2
 !! input
-<pre dir="&#10;"></pre>
+==a==
+==bogus== <nowiki>not a legal section</nowiki>
+==b==
 !! result
-<pre dir="&#10;"></pre>
-
+==b==
 !! end
 
+
+# Formerly testing for bug 2587, now resolved by the use of unmarked sections
+# instead of respecting commented sections
 !! test
-Parsing optional HTML elements (Bug 6171)
+Section extraction prefixed by comment (section 1)
 !! options
+section=1
 !! input
-<table>
-  <tr>
-    <td> Some tabular data</td>
-    <td> More tabular data ...
-    <td> And yet som tabular data</td>
-  </tr>
-</table>
-!! result
-<table>
-  <tr>
-    <td> Some tabular data</td>
-    <td> More tabular data ...
-    </td><td> And yet som tabular data</td>
-  </tr>
-</table>
-
-!! end
+<!-- -->==sec1==
+==sec2==
+!!result
+==sec2==
+!!end
 
 !! test
-Correct handling of <td>, <tr> (Bug 6171)
+Section extraction prefixed by comment (section 2)
 !! options
+section=2
 !! input
-<table>
-  <tr>
-    <td> Some tabular data</td>
-    <td> More tabular data ...</td>
-    <td> And yet som tabular data</td>
-  </tr>
-</table>
-!! result
-<table>
-  <tr>
-    <td> Some tabular data</td>
-    <td> More tabular data ...</td>
-    <td> And yet som tabular data</td>
-  </tr>
-</table>
+<!-- -->==sec1==
+==sec2==
+!!result
 
-!! end
+!!end
 
 
+# Formerly testing for bug 2607, now resolved by the use of unmarked sections
+# instead of respecting HTML-style headings
 !! test
-Parsing crashing regression (fr:JavaScript)
+Section extraction, mixed wiki and html (section 1)
+!! options
+section=1
 !! input
-</body></x>
+<h2>unmarked</h2>
+unmarked
+==1==
+one
+==2==
+two
 !! result
-<p>&lt;/body&gt;&lt;/x&gt;
-</p>
+==1==
+one
 !! end
 
 !! test
-Inline wiki vs wiki block nesting
+Section extraction, mixed wiki and html (section 2)
+!! options
+section=2
 !! input
-'''Bold paragraph
-
-New wiki paragraph
+<h2>unmarked</h2>
+unmarked
+==1==
+one
+==2==
+two
 !! result
-<p><b>Bold paragraph</b>
-</p><p>New wiki paragraph
-</p>
+==2==
+two
 !! end
 
+
+# Formerly testing for bug 3342
 !! test
-Inline HTML vs wiki block nesting
+Section extraction, heading surrounded by <noinclude>
 !! options
-disabled
+section=1
 !! input
-<b>Bold paragraph
-
-New wiki paragraph
+<noinclude>==unmarked==</noinclude>
+==marked==
 !! result
-<p><b>Bold paragraph</b>
-</p><p>New wiki paragraph
-</p>
-!! end
+==marked==
+!!end
 
-# Original result was this:
-# <p><b>bold</b><b>bold<i>bolditalics</i></b>
-# </p>
-# While that might be marginally more intuitive, maybe, the six-apostrophe
-# construct is clearly pathological and the result stated here (which is what
-# the parser actually does) is about as reasonable as anything.
-!!test
-Mixing markup for italics and bold
+# Test behaviour of bug 19910
+!! test
+Sectiion with all-equals
 !! options
+section=2
 !! input
-'''bold''''''bold''bolditalics'''''
+=== 
+The line above must have a trailing space
+=== <!--
+--> <!-- -->
+But just in case it doesn't...
 !! result
-<p>'<i>bold'</i><b>bold<i>bolditalics</i></b>
-</p>
+=== <!--
+--> <!-- -->
+But just in case it doesn't...
 !! end
 
-
-!! article
-Xyzzyx
-!! text
-Article for special page transclusion test
-!! endarticle
-
 !! test
-Special page transclusion
+Section replacement test (section 0)
 !! options
+replace=0,"xxx"
 !! input
-{{Special:Prefixindex/Xyzzyx}}
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+xxx
 
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! end
 
 !! test
-Special page transclusion twice (bug 5021)
+Section replacement test (section 1)
 !! options
+replace=1,"xxx"
 !! input
-{{Special:Prefixindex/Xyzzyx}}
-{{Special:Prefixindex/Xyzzyx}}
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
-<table id="mw-prefixindex-list-table"><tr><td><a href="/wiki/Xyzzyx" title="Xyzzyx">Xyzzyx</a></td></tr></table>
+start
+xxx
 
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! end
 
 !! test
-Transclusion of default MediaWiki message
+Section replacement test (section 2)
+!! options
+replace=2,"xxx"
 !! input
-{{MediaWiki:Mainpage}}
-!!result
-<p>Main Page
-</p>
-!! end
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
+!! result
+start
+==a==
+xxx
 
-!! test
-Transclusion of nonexistent MediaWiki message
-!! input
-{{MediaWiki:Mainpagexxx}}
-!!result
-<p><a href="/index.php?title=MediaWiki:Mainpagexxx&amp;action=edit&amp;redlink=1" class="new" title="MediaWiki:Mainpagexxx (page does not exist)">MediaWiki:Mainpagexxx</a>
-</p>
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! end
 
 !! test
-Transclusion of MediaWiki message with underscore
+Section replacement test (section 3)
+!! options
+replace=3,"xxx"
 !! input
-{{MediaWiki:history_short}}
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<p>History
-</p>
+start
+==a==
+===aa===
+xxx
+
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! end
 
 !! test
-Transclusion of MediaWiki message with space
+Section replacement test (section 4)
+!! options
+replace=4,"xxx"
 !! input
-{{MediaWiki:history short}}
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<p>History
-</p>
+start
+==a==
+===aa===
+====aaa====
+xxx
+
+==c==
+===ca===
 !! end
 
 !! test
-Invalid header with following text
+Section replacement test (section 5)
+!! options
+replace=5,"xxx"
 !! input
-= x = y
+start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
 !! result
-<p>= x = y
-</p>
-!! end
+start
+==a==
+===aa===
+====aaa====
+==b==
+xxx
 
+===bb===
+====bba====
+===bc===
+==c==
+===ca===
+!! end
 
 !! test
-Section extraction test (section 0)
+Section replacement test (section 6)
 !! options
-section=0
+replace=6,"xxx"
 !! input
 start
 ==a==
@@ -7196,12 +9679,22 @@ start
 ===ca===
 !! result
 start
+==a==
+===aa===
+====aaa====
+==b==
+===ba===
+xxx
+
+===bc===
+==c==
+===ca===
 !! end
 
 !! test
-Section extraction test (section 1)
+Section replacement test (section 7)
 !! options
-section=1
+replace=7,"xxx"
 !! input
 start
 ==a==
@@ -7215,15 +9708,24 @@ start
 ==c==
 ===ca===
 !! result
+start
 ==a==
 ===aa===
 ====aaa====
+==b==
+===ba===
+===bb===
+xxx
+
+===bc===
+==c==
+===ca===
 !! end
 
 !! test
-Section extraction test (section 2)
+Section replacement test (section 8)
 !! options
-section=2
+replace=8,"xxx"
 !! input
 start
 ==a==
@@ -7237,14 +9739,24 @@ start
 ==c==
 ===ca===
 !! result
+start
+==a==
 ===aa===
 ====aaa====
-!! end
+==b==
+===ba===
+===bb===
+====bba====
+xxx
+
+==c==
+===ca===
+!!end
 
 !! test
-Section extraction test (section 3)
+Section replacement test (section 9)
 !! options
-section=3
+replace=9,"xxx"
 !! input
 start
 ==a==
@@ -7258,13 +9770,22 @@ start
 ==c==
 ===ca===
 !! result
+start
+==a==
+===aa===
 ====aaa====
+==b==
+===ba===
+===bb===
+====bba====
+===bc===
+xxx
 !! end
 
 !! test
-Section extraction test (section 4)
+Section replacement test (section 10)
 !! options
-section=4
+replace=10,"xxx"
 !! input
 start
 ==a==
@@ -7278,3176 +9799,3402 @@ start
 ==c==
 ===ca===
 !! result
+start
+==a==
+===aa===
+====aaa====
 ==b==
 ===ba===
 ===bb===
 ====bba====
 ===bc===
+==c==
+xxx
+!! end
+
+!! test
+Section replacement test with initial whitespace (bug 13728)
+!! options
+replace=2,"xxx"
+!! input
+ Preformatted initial line
+==a==
+===a===
+!! result
+ Preformatted initial line
+==a==
+xxx
+!! end
+
+
+!! test
+Section extraction, heading followed by pre with 20 spaces (bug 6398)
+!! options
+section=1
+!! input
+==a==
+                    a
+!! result
+==a==
+                    a
+!! end
+
+!! test
+Section extraction, heading followed by pre with 19 spaces (bug 6398 sanity check)
+!! options
+section=1
+!! input
+==a==
+                   a
+!! result
+==a==
+                   a
+!! end
+
+
+!! test
+Section extraction, <pre> around bogus header (bug 10309)
+!! options
+noxml section=2
+!! input
+== Section One ==
+<pre>
+=======
+</pre>
+
+== Section Two ==
+stuff
+!! result
+== Section Two ==
+stuff
+!! end
+
+!! test
+Section replacement, <pre> around bogus header (bug 10309)
+!! options
+noxml replace=2,"xxx"
+!! input
+== Section One ==
+<pre>
+=======
+</pre>
+
+== Section Two ==
+stuff
+!! result
+== Section One ==
+<pre>
+=======
+</pre>
+
+xxx
+!! end
+
+
+
+!! test
+Handling of &#x0A; in URLs
+!! input
+**irc://&#x0A;a
+!! result
+<ul><li><ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
+</li></ul>
+</li></ul>
+
+!!end
+
+!! test
+5 quotes, code coverage +1 line
+!! input
+'''''
+!! result
+!! end
+
+!! test
+Special:Search page linking.
+!! input
+{{Special:search}}
+!! result
+<p><a href="/wiki/Special:Search" title="Special:Search">Special:Search</a>
+</p>
+!! end
+
+!! test
+Say the magic word
+!! input
+* {{PAGENAME}}
+* {{BASEPAGENAME}}
+* {{SUBPAGENAME}}
+* {{SUBPAGENAMEE}}
+* {{BASEPAGENAME}}
+* {{BASEPAGENAMEE}}
+* {{TALKPAGENAME}}
+* {{TALKPAGENAMEE}}
+* {{SUBJECTPAGENAME}}
+* {{SUBJECTPAGENAMEE}}
+* {{NAMESPACEE}}
+* {{NAMESPACE}}
+* {{TALKSPACE}}
+* {{TALKSPACEE}}
+* {{SUBJECTSPACE}}
+* {{SUBJECTSPACEE}}
+* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
+!! result
+<ul><li> Parser test
+</li><li> Parser test
+</li><li> Parser test
+</li><li> Parser_test
+</li><li> Parser test
+</li><li> Parser_test
+</li><li> Talk:Parser test
+</li><li> Talk:Parser_test
+</li><li> Parser test
+</li><li> Parser_test
+</li><li> 
+</li><li> 
+</li><li> Talk
+</li><li> Talk
+</li><li> 
+</li><li> 
+</li><li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
+</li></ul>
+
+!! end
+### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
+
+!! test
+Gallery
+!! input
+<gallery>
+image1.png |
+image2.gif|||||
+
+image3|
+image4    |300px| centre
+ image5.svg| http://///////
+[[x|xx]]]]
+* image6
+</gallery>
+!! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Image1.png</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Image2.gif</div>
+                       <div class="gallerytext">
+<p>||||
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Image3</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Image4</div>
+                       <div class="gallerytext">
+<p>300px| centre
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Image5.svg</div>
+                       <div class="gallerytext">
+<p><a rel="nofollow" class="external free" href="http://///////">http://///////</a>
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">* image6</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
 !! test
-Section extraction test (section 5)
-!! options
-section=5
+Gallery (with options)
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+<gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
+File:Nonexistant.jpg|caption
+File:Nonexistant.jpg
+image:foobar.jpg|some '''caption''' [[Main Page]]
+image:foobar.jpg
+image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
+</gallery>
 !! result
-===ba===
+<ul class="gallery" style="max-width: 226px;_width: 226px;">
+       <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div style="height: 70px;">Nonexistant.jpg</div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div style="height: 70px;">Nonexistant.jpg</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" /></a></div></div>
+                       <div class="gallerytext">
+<p>some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
+                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/thumb/3/3a/Foobar.jpg/70px-Foobar.jpg" width="70" height="8" /></a></div></div>
+                       <div class="gallerytext">
+<p>Blabla|blabla.
+</p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
 !! test
-Section extraction test (section 6)
-!! options
-section=6
+Gallery with wikitext inside caption
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+<gallery>
+File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
+File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
+</gallery>
 !! result
-===bb===
-====bba====
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p><a href="/wiki/File:Foobar.jpg" class="image" title="desc"><img alt="inneralt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/20px-Foobar.jpg" width="20" height="2" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/30px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/40px-Foobar.jpg 2x" /></a>
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>This is a test template
+</p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
 !! test
-Section extraction test (section 7)
-!! options
-section=7
+gallery (with showfilename option)
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+<gallery showfilename>
+File:Nonexistant.jpg|caption
+File:Nonexistant.jpg
+image:foobar.jpg|some '''caption''' [[Main Page]]
+File:Foobar.jpg
+</gallery>
 !! result
-====bba====
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Nonexistant.jpg</div>
+                       <div class="gallerytext">
+<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
+caption
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Nonexistant.jpg</div>
+                       <div class="gallerytext">
+<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+</p>
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+</p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
 !! test
-Section extraction test (section 8)
-!! options
-section=8
+Gallery (with namespace-less filenames)
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+<gallery>
+File:Nonexistant.jpg
+Nonexistant.jpg
+image:foobar.jpg
+foobar.jpg
+</gallery>
 !! result
-===bc===
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Nonexistant.jpg</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div style="height: 150px;">Nonexistant.jpg</div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
 !! test
-Section extraction test (section 9)
-!! options
-section=9
+HTML Hex character encoding (spells the word "JavaScript")
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+&#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
 !! result
-==c==
-===ca===
+<p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
+</p>
 !! end
 
 !! test
-Section extraction test (section 10)
-!! options
-section=10
+HTML Hex character encoding bogus encoding (bug 26437 regression check)
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+&#xsee;&#XSEE;
 !! result
-===ca===
+<p>&amp;#xsee;&amp;#XSEE;
+</p>
 !! end
 
 !! test
-Section extraction test (nonexistent section 11)
-!! options
-section=11
+HTML Hex character encoding mixed case
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+&#xEE;&#Xee;
+!! result
+<p>&#xee;&#xee;
+</p>
+!! end
+
+!! test
+__FORCETOC__ override
+!! input
+__NEWSECTIONLINK__
+__FORCETOC__
 !! result
+<p><br />
+</p>
 !! end
 
 !! test
-Section extraction test with bogus heading (section 1)
-!! options
-section=1
+ISBN code coverage
 !! input
-==a==
-==bogus== not a legal section
-==b==
+ISBN  978-0-1234-56&#x20;789
 !! result
-==a==
-==bogus== not a legal section
+<p><a href="/wiki/Special:BookSources/9780123456" class="internal mw-magiclink-isbn">ISBN 978-0-1234-56</a>&#x20;789
+</p>
 !! end
 
 !! test
-Section extraction test with bogus heading (section 2)
-!! options
-section=2
+ISBN followed by 5 spaces
 !! input
-==a==
-==bogus== not a legal section
-==b==
+ISBN    
 !! result
-==b==
+<p>ISBN    
+</p>
 !! end
 
 !! test
-Section extraction test with comment after heading (section 1)
-!! options
-section=1
+Double ISBN
 !! input
-==a==
-==b== <!-- -->
-==c==
+ISBN ISBN 1234567890
 !! result
-==a==
+<p>ISBN <a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
+</p>
 !! end
 
 !! test
-Section extraction test with comment after heading (section 2)
-!! options
-section=2
+Bug 22905: <abbr> followed by ISBN followed by </a>
 !! input
-==a==
-==b== <!-- -->
-==c==
+<abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
 !! result
-==b== <!-- -->
+<p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a rel="nofollow" class="external text" href="http://www.example.com">example.com</a>
+</p>
 !! end
 
 !! test
-Section extraction test with bogus <nowiki> heading (section 1)
-!! options
-section=1
+Double RFC
 !! input
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
-==b==
+RFC RFC 1234
 !! result
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
+<p>RFC <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc1234">RFC 1234</a>
+</p>
 !! end
 
 !! test
-Section extraction test with bogus <nowiki> heading (section 2)
-!! options
-section=2
+Double RFC with a wiki link
 !! input
-==a==
-==bogus== <nowiki>not a legal section</nowiki>
-==b==
+RFC [[RFC 1234]]
 !! result
-==b==
+<p>RFC <a href="/index.php?title=RFC_1234&amp;action=edit&amp;redlink=1" class="new" title="RFC 1234 (page does not exist)">RFC 1234</a>
+</p>
 !! end
 
+!! test
+RFC code coverage
+!! input
+RFC   983&#x20;987
+!! result
+<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc983">RFC 983</a>&#x20;987
+</p>
+!! end
 
-# Formerly testing for bug 2587, now resolved by the use of unmarked sections 
-# instead of respecting commented sections
 !! test
-Section extraction prefixed by comment (section 1)
-!! options
-section=1
+Centre-aligned image
 !! input
-<!-- -->==sec1==
-==sec2==
-!!result
-==sec2==
+[[Image:foobar.jpg|centre]]
+!! result
+<div class="center"><div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div></div>
+
 !!end
 
 !! test
-Section extraction prefixed by comment (section 2)
-!! options
-section=2
+None-aligned image
 !! input
-<!-- -->==sec1==
-==sec2==
-!!result
+[[Image:foobar.jpg|none]]
+!! result
+<div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
 
 !!end
 
-
-# Formerly testing for bug 2607, now resolved by the use of unmarked sections 
-# instead of respecting HTML-style headings
 !! test
-Section extraction, mixed wiki and html (section 1)
-!! options
-section=1
+Width + Height sized image (using px) (height is ignored)
 !! input
-<h2>unmarked</h2>
-unmarked
-==1==
-one
-==2==
-two
+[[Image:foobar.jpg|640x480px]]
 !! result
-==1==
-one
-!! end
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
+</p>
+!!end
 
 !! test
-Section extraction, mixed wiki and html (section 2)
-!! options
-section=2
+Width-sized image (using px, no following whitespace)
 !! input
-<h2>unmarked</h2>
-unmarked
-==1==
-one
-==2==
-two
+[[Image:foobar.jpg|640px]]
 !! result
-==2==
-two
-!! end
-
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
+</p>
+!!end
 
-# Formerly testing for bug 3342
 !! test
-Section extraction, heading surrounded by <noinclude>
-!! options
-section=1
+Width-sized image (using px, with following whitespace - test regression from r39467)
 !! input
-<noinclude>==unmarked==</noinclude>
-==marked==
+[[Image:foobar.jpg|640px ]]
 !! result
-==marked==
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
+</p>
 !!end
 
-# Test behaviour of bug 19910
 !! test
-Sectiion with all-equals
-!! options
-section=2
+Width-sized image (using px, with preceding whitespace - test regression from r39467)
 !! input
-=== 
-The line above must have a trailing space
-=== <!--
---> <!-- -->
-But just in case it doesn't...
+[[Image:foobar.jpg| 640px]]
 !! result
-=== <!--
---> <!-- -->
-But just in case it doesn't...
-!! end
+<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/thumb/3/3a/Foobar.jpg/640px-Foobar.jpg" width="640" height="73" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/960px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg 2x" /></a>
+</p>
+!!end
 
 !! test
-Section replacement test (section 0)
-!! options
-replace=0,"xxx"
+Another italics / bold test
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+ ''' ''x'
 !! result
-xxx
-
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
+<pre>'<i> </i>x'
+</pre>
+!!end
 
+# Note the results may be incorrect, as parserTest output included this:
+# XML error: Mismatched tag at byte 6120:
+# ...<dd> </dt></dl> </dd...
 !! test
-Section replacement test (section 1)
+dt/dd/dl test
 !! options
-replace=1,"xxx"
+disabled
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+:;;;::
 !! result
-start
-xxx
+<dl><dd><dl><dt><dl><dt><dl><dt><dl><dd><dl><dd>
+</dd></dl>
+</dd></dl>
+</dt></dl>
+</dt></dl>
+</dt></dl>
+</dd></dl>
 
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! end
+!!end
 
-!! test
-Section replacement test (section 2)
-!! options
-replace=2,"xxx"
-!! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+
+# Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
+!! test
+Images with the "|" character in the comment
+!! input
+[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
 !! result
-start
-==a==
-xxx
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
 
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+!!end
+
+!! test
+[Before] HTML without raw HTML enabled ($wgRawHtml==false)
+!! input
+<html><script>alert(1);</script></html>
+!! result
+<p>&lt;html&gt;&lt;script&gt;alert(1);&lt;/script&gt;&lt;/html&gt;
+</p>
 !! end
 
 !! test
-Section replacement test (section 3)
+HTML with raw HTML ($wgRawHtml==true)
 !! options
-replace=3,"xxx"
+rawhtml
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+<html><script>alert(1);</script></html>
 !! result
-start
-==a==
-===aa===
-xxx
-
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+<p><script>alert(1);</script>
+</p>
 !! end
 
 !! test
-Section replacement test (section 4)
+Parents of subpages, one level up
 !! options
-replace=4,"xxx"
+subpage title=[[Subpage test/L1/L2/L3]]
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+[[../|L2]]
 !! result
-start
-==a==
-===aa===
-====aaa====
-xxx
-
-==c==
-===ca===
+<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">L2</a>
+</p>
 !! end
 
+
 !! test
-Section replacement test (section 5)
+Parents of subpages, one level up, not named
 !! options
-replace=5,"xxx"
+subpage title=[[Subpage test/L1/L2/L3]]
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+[[../]]
 !! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-xxx
-
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">Subpage test/L1/L2</a>
+</p>
 !! end
 
+
+
 !! test
-Section replacement test (section 6)
+Parents of subpages, two levels up
 !! options
-replace=6,"xxx"
+subpage title=[[Subpage test/L1/L2/L3]]
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
-!! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-xxx
+[[../../|L1]]2
 
-===bc===
-==c==
-===ca===
+[[../../|L1]]l
+!! result
+<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1</a>2
+</p><p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1l</a>
+</p>
 !! end
 
 !! test
-Section replacement test (section 7)
+Parents of subpages, two levels up, without trailing slash or name.
 !! options
-replace=7,"xxx"
+subpage title=[[Subpage test/L1/L2/L3]]
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+[[../..]]
 !! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-xxx
-
-===bc===
-==c==
-===ca===
+<p>[[../..]]
+</p>
 !! end
 
 !! test
-Section replacement test (section 8)
+Parents of subpages, two levels up, with lots of extra trailing slashes.
 !! options
-replace=8,"xxx"
+subpage title=[[Subpage test/L1/L2/L3]]
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+[[../../////]]
 !! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-xxx
-
-==c==
-===ca===
-!!end
+<p><a href="/index.php?title=Subpage_test/L1////&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1//// (page does not exist)">///</a>
+</p>
+!! end
 
 !! test
-Section replacement test (section 9)
-!! options
-replace=9,"xxx"
+Definition list code coverage
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+; title   : def
+; title : def
+;title: def
 !! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-xxx
+<dl><dt> title  &#160;</dt><dd> def
+</dd><dt> title&#160;</dt><dd> def
+</dd><dt>title</dt><dd> def
+</dd></dl>
+
 !! end
 
 !! test
-Section replacement test (section 10)
-!! options
-replace=10,"xxx"
+Don't fall for the self-closing div
 !! input
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-===ca===
+<div>hello world</div/>
 !! result
-start
-==a==
-===aa===
-====aaa====
-==b==
-===ba===
-===bb===
-====bba====
-===bc===
-==c==
-xxx
+<div>hello world</div>
+
 !! end
 
 !! test
-Section replacement test with initial whitespace (bug 13728)
-!! options
-replace=2,"xxx"
+MSGNW magic word
 !! input
- Preformatted initial line
-==a==
-===a===
+{{MSGNW:msg}}
 !! result
- Preformatted initial line
-==a==
-xxx
+<p>&#91;&#91;:Template:Msg&#93;&#93;
+</p>
 !! end
 
+!! test
+RAW magic word
+!! input
+{{RAW:QUERTY}}
+!! result
+<p><a href="/index.php?title=Template:QUERTY&amp;action=edit&amp;redlink=1" class="new" title="Template:QUERTY (page does not exist)">Template:QUERTY</a>
+</p>
+!! end
 
+# This isn't needed for XHTML conformance, but would be handy as a fallback security measure
 !! test
-Section extraction, heading followed by pre with 20 spaces (bug 6398)
-!! options
-section=1
+Always escape literal '>' in output, not just after '<'
 !! input
-==a==
-                    a
+><>
 !! result
-==a==
-                    a
+<p>&gt;&lt;&gt;
+</p>
 !! end
 
 !! test
-Section extraction, heading followed by pre with 19 spaces (bug 6398 sanity check)
-!! options
-section=1
+Template caching
 !! input
-==a==
-                   a
+{{Test}}
+{{Test}}
 !! result
-==a==
-                   a
+<p>This is a test template
+This is a test template
+</p>
 !! end
 
 
+!! article
+MediaWiki:Fake
+!! text
+==header==
+!! endarticle
+
 !! test
-Section extraction, <pre> around bogus header (bug 10309)
-!! options
-noxml section=2
+Inclusion of !userCanEdit() content
 !! input
-== Section One ==
-<pre>
-=======
-</pre>
-
-== Section Two ==
-stuff
+{{MediaWiki:Fake}}
 !! result
-== Section Two ==
-stuff
+<h2><span class="editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a>]</span> <span class="mw-headline" id="header">header</span></h2>
+
 !! end
 
+
 !! test
-Section replacement, <pre> around bogus header (bug 10309)
-!! options
-noxml replace=2,"xxx"
+Out-of-order TOC heading levels
 !! input
-== Section One ==
-<pre>
-=======
-</pre>
-
-== Section Two ==
-stuff
+==2==
+======6======
+===3===
+=1=
+=====5=====
+==2==
 !! result
-== Section One ==
-<pre>
-=======
-</pre>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
+<ul>
+<li class="toclevel-2 tocsection-2"><a href="#6"><span class="tocnumber">1.1</span> <span class="toctext">6</span></a></li>
+<li class="toclevel-2 tocsection-3"><a href="#3"><span class="tocnumber">1.2</span> <span class="toctext">3</span></a></li>
+</ul>
+</li>
+<li class="toclevel-1 tocsection-4"><a href="#1"><span class="tocnumber">2</span> <span class="toctext">1</span></a>
+<ul>
+<li class="toclevel-2 tocsection-5"><a href="#5"><span class="tocnumber">2.1</span> <span class="toctext">5</span></a></li>
+<li class="toclevel-2 tocsection-6"><a href="#2_2"><span class="tocnumber">2.2</span> <span class="toctext">2</span></a></li>
+</ul>
+</li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2">2</span></h2>
+<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span> <span class="mw-headline" id="6">6</span></h6>
+<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span> <span class="mw-headline" id="3">3</span></h3>
+<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span> <span class="mw-headline" id="1">1</span></h1>
+<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span> <span class="mw-headline" id="5">5</span></h5>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2_2">2</span></h2>
 
-xxx
 !! end
 
 
-
 !! test
-Handling of &#x0A; in URLs
+ISBN with a dummy number
 !! input
-**irc://&#x0A;a
+ISBN ---
 !! result
-<ul><li><ul><li><a rel="nofollow" class="external free" href="irc://%0Aa">irc://%0Aa</a>
-</li></ul>
-</li></ul>
+<p>ISBN ---
+</p>
+!! end
 
-!!end
 
 !! test
-5 quotes, code coverage +1 line
+ISBN with space-delimited number
 !! input
-'''''
+ISBN 92 9017 032 8
 !! result
+<p><a href="/wiki/Special:BookSources/9290170328" class="internal mw-magiclink-isbn">ISBN 92 9017 032 8</a>
+</p>
 !! end
 
+
 !! test
-Special:Search page linking.
+ISBN with multiple spaces, no number
 !! input
-{{Special:search}}
+ISBN  foo
 !! result
-<p><a href="/wiki/Special:Search" title="Special:Search">Special:Search</a>
+<p>ISBN  foo
 </p>
 !! end
 
+
 !! test
-Say the magic word
+ISBN length
 !! input
-* {{PAGENAME}}
-* {{BASEPAGENAME}}
-* {{SUBPAGENAME}}
-* {{SUBPAGENAMEE}}
-* {{BASEPAGENAME}}
-* {{BASEPAGENAMEE}}
-* {{TALKPAGENAME}}
-* {{TALKPAGENAMEE}}
-* {{SUBJECTPAGENAME}}
-* {{SUBJECTPAGENAMEE}}
-* {{NAMESPACEE}}
-* {{NAMESPACE}}
-* {{TALKSPACE}}
-* {{TALKSPACEE}}
-* {{SUBJECTSPACE}}
-* {{SUBJECTSPACEE}}
-* {{Dynamic|{{NUMBEROFUSERS}}|{{NUMBEROFPAGES}}|{{CURRENTVERSION}}|{{CONTENTLANGUAGE}}|{{DIRECTIONMARK}}|{{CURRENTTIMESTAMP}}|{{NUMBEROFARTICLES}}}}
-!! result
-<ul><li> Parser test
-</li><li> Parser test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> Talk:Parser test
-</li><li> Talk:Parser_test
-</li><li> Parser test
-</li><li> Parser_test
-</li><li> 
-</li><li> 
-</li><li> Talk
-</li><li> Talk
-</li><li> 
-</li><li> 
-</li><li> <a href="/index.php?title=Template:Dynamic&amp;action=edit&amp;redlink=1" class="new" title="Template:Dynamic (page does not exist)">Template:Dynamic</a>
-</li></ul>
+ISBN 123456789
+
+ISBN 1234567890
 
+ISBN 12345678901
+!! result
+<p>ISBN 123456789
+</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
+</p><p>ISBN 12345678901
+</p>
 !! end
-### Note: Above tests excludes the "{{NUMBEROFADMINS}}" magic word because it generates a MySQL error when included.
+
 
 !! test
-Gallery
+ISBN with trailing year (bug 8110)
 !! input
-<gallery>
-image1.png |
-image2.gif|||||
+ISBN 1-234-56789-0 - 2006
 
-image3|
-image4    |300px| centre
- image5.svg| http://///////
-[[x|xx]]]]
-* image6
-</gallery>
+ISBN 1 234 56789 0 - 2006
 !! result
-<ul class="gallery">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Image1.png</div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Image2.gif</div>
-                       <div class="gallerytext">
-<p>||||
-</p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Image3</div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Image4</div>
-                       <div class="gallerytext">
-<p>300px| centre
-</p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Image5.svg</div>
-                       <div class="gallerytext">
-<p><a rel="nofollow" class="external free" href="http://///////">http://///////</a>
+<p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1-234-56789-0</a> - 2006
+</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1 234 56789 0</a> - 2006
 </p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">* image6</div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-</ul>
+!! end
 
+
+!! test
+anchorencode
+!! input
+{{anchorencode:foo bar©#%n}}
+!! result
+<p>foo_bar.C2.A9.23.25n
+</p>
 !! end
 
 !! test
-Gallery (with options)
+anchorencode trims spaces
 !! input
-<gallery widths='70px' heights='40px' perrow='2' caption='Foo [[Main Page]]' >
-File:Nonexistant.jpg|caption
-File:Nonexistant.jpg
-image:foobar.jpg|some '''caption''' [[Main Page]]
-image:foobar.jpg
-image:foobar.jpg|Blabla|alt=This is a foo-bar.|blabla.
-</gallery>
+{{anchorencode: __pretty__please__}}
 !! result
-<ul class="gallery" style="max-width: 226px;_width: 226px;">
-       <li class='gallerycaption'>Foo <a href="/wiki/Main_Page" title="Main Page">Main Page</a></li>
-               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div style="height: 70px;">Nonexistant.jpg</div>
-                       <div class="gallerytext">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div style="height: 70px;">Nonexistant.jpg</div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
-                       <div class="gallerytext">
-<p>some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 105px"><div style="width: 105px">
-                       <div class="thumb" style="width: 100px;"><div style="margin:31px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="This is a foo-bar." src="http://example.com/images/3/3a/Foobar.jpg" width="70" height="8" /></a></div></div>
-                       <div class="gallerytext">
-<p>Blabla|blabla.
+<p>pretty_please
 </p>
-                       </div>
-               </div></li>
-</ul>
-
 !! end
 
 !! test
-Gallery with wikitext inside caption
+anchorencode deals with links
 !! input
-<gallery>
-File:foobar.jpg|[[File:foobar.jpg|20px|desc|alt=inneralt]]|alt=galleryalt
-File:foobar.jpg|{{Test|unamedParam|alt=param}}|alt=galleryalt
-</gallery>
+{{anchorencode: [[hello|world]] [[hi]]}}
 !! result
-<ul class="gallery">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" class="image" title="desc"><img alt="inneralt" src="http://example.com/images/3/3a/Foobar.jpg" width="20" height="2" /></a>
-</p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-<p>This is a test template
+<p>world_hi
 </p>
-                       </div>
-               </div></li>
-</ul>
-
 !! end
 
 !! test
-gallery (with showfilename option)
+anchorencode deals with templates
 !! input
-<gallery showfilename>
-File:Nonexistant.jpg|caption
-File:Nonexistant.jpg
-image:foobar.jpg|some '''caption''' [[Main Page]]
-File:Foobar.jpg
-</gallery>
+{{anchorencode: {{Foo}} }}
 !! result
-<ul class="gallery">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Nonexistant.jpg</div>
-                       <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
-caption
-</p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Nonexistant.jpg</div>
-                       <div class="gallerytext">
-<p><a href="/wiki/File:Nonexistant.jpg" title="File:Nonexistant.jpg">Nonexistant.jpg</a><br />
-</p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
-some <b>caption</b> <a href="/wiki/Main_Page" title="Main Page">Main Page</a>
-</p>
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-<p><a href="/wiki/File:Foobar.jpg" title="File:Foobar.jpg">Foobar.jpg</a><br />
+<p>FOO
 </p>
-                       </div>
-               </div></li>
-</ul>
-
 !! end
 
 !! test
-Gallery (with namespace-less filenames)
+anchorencode encodes like the TOC generator: (bug 18431)
 !! input
-<gallery>
-File:Nonexistant.jpg
-Nonexistant.jpg
-image:foobar.jpg
-foobar.jpg
-</gallery>
+=== _ +:.3A%3A&&amp;]] ===
+{{anchorencode: _ +:.3A%3A&&amp;]] }}
+__NOEDITSECTION__
 !! result
-<ul class="gallery">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Nonexistant.jpg</div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div style="height: 150px;">Nonexistant.jpg</div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-                       </div>
-               </div></li>
-</ul>
-
+<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&amp;&amp;]] </span></h3>
+<p>.2B:.3A.253A.26.26.5D.5D
+</p>
 !! end
 
+# Expected output in the following test is not necessarily expected (there
+# should probably be <p> tags inside the <blockquote> in the output) -- it's
+# only testing for well-formedness.
 !! test
-HTML Hex character encoding (spells the word "JavaScript")
+Bug 6200: blockquotes and paragraph formatting
 !! input
-&#x4A;&#x061;&#x0076;&#x00061;&#x000053;&#x0000063;&#114;&#x0000069;&#00000112;&#x0000000074;
+<blockquote>
+foo
+</blockquote>
+
+bar
+
+ baz
 !! result
-<p>&#x4a;&#x61;&#x76;&#x61;&#x53;&#x63;&#114;&#x69;&#112;&#x74;
+<blockquote>
+foo
+</blockquote>
+<p>bar
 </p>
+<pre>baz
+</pre>
 !! end
 
 !! test
-HTML Hex character encoding bogus encoding (bug 26437 regression check)
+Bug 8293: Use of center tag ruins paragraph formatting
 !! input
-&#xsee;&#XSEE;
+<center>
+foo
+</center>
+
+bar
+
+ baz
 !! result
-<p>&amp;#xsee;&amp;#XSEE;
+<center>
+<p>foo
+</p>
+</center>
+<p>bar
 </p>
+<pre>baz
+</pre>
 !! end
 
+
+###
+### Language variants related tests
+###
 !! test
-HTML Hex character encoding mixed case
+Self-link in language variants
+!! options
+title=[[Dunav]] language=sr
 !! input
-&#xEE;&#Xee;
+Both [[Dunav]] and [[Дунав]] are names for this river.
 !! result
-<p>&#xee;&#xee;
+<p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
 </p>
-!! end
+!!end
+
 
 !! test
-__FORCETOC__ override
-!! input 
-__NEWSECTIONLINK__
-__FORCETOC__
+Link to pages in language variants
+!! options
+language=sr
+!! input
+Main Page can be written as [[Маин Паге]]
 !! result
-<p><br />
+<p>Main Page can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>
+</p>
+!!end
+
+
+!! test
+Multiple links to pages in language variants
+!! options
+language=sr
+!! input
+[[Main Page]] can be written as [[Маин Паге]] same as [[Маин Паге]].
+!! result
+<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
+</p>
+!!end
+
+
+!! test
+Simple template in language variants
+!! options
+language=sr
+!! input
+{{тест}}
+!! result
+<p>This is a test template
 </p>
 !! end
 
+
 !! test
-ISBN code coverage
+Template with explicit namespace in language variants
+!! options
+language=sr
 !! input
-ISBN  978-0-1234-56&#x20;789
+{{Template:тест}}
 !! result
-<p><a href="/wiki/Special:BookSources/9780123456" class="internal mw-magiclink-isbn">ISBN 978-0-1234-56</a>&#x20;789
+<p>This is a test template
 </p>
 !! end
 
+
 !! test
-ISBN followed by 5 spaces
+Basic test for template parameter in language variants
+!! options
+language=sr
 !! input
-ISBN    
+{{парамтест|param=foo}}
 !! result
-<p>ISBN    
+<p>This is a test template with parameter foo
 </p>
 !! end
 
+
 !! test
-Double ISBN
+Simple category in language variants
+!! options
+language=sr cat
 !! input
-ISBN ISBN 1234567890
+[[Category:МедиаWики Усер'с Гуиде]]
 !! result
-<p>ISBN <a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
-</p>
+<a href="/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:MediaWiki_User%27s_Guide" title="Категорија:MediaWiki User's Guide">MediaWiki User's Guide</a>
 !! end
 
+
 !! test
-Bug 22905: <abbr> followed by ISBN followed by </a>
+Stripping -{}- tags (language variants)
+!! options
+language=sr
 !! input
-<abbr>(fr)</abbr> ISBN 2753300917 [http://www.example.com example.com]
+Latin proverb: -{Ne nuntium necare}-
 !! result
-<p><abbr>(fr)</abbr> <a href="/wiki/Special:BookSources/2753300917" class="internal mw-magiclink-isbn">ISBN 2753300917</a> <a rel="nofollow" class="external text" href="http://www.example.com">example.com</a>
+<p>Latin proverb: Ne nuntium necare
 </p>
 !! end
 
+
 !! test
-Double RFC
+Prevent conversion with -{}- tags (language variants)
+!! options
+language=sr variant=sr-ec
 !! input
-RFC RFC 1234
+Latinski: -{Ne nuntium necare}-
 !! result
-<p>RFC <a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc1234">RFC 1234</a>
+<p>Латински: Ne nuntium necare
 </p>
 !! end
 
+
 !! test
-Double RFC with a wiki link 
+Prevent conversion of text with -{}- tags (language variants)
+!! options
+language=sr variant=sr-ec
 !! input
-RFC [[RFC 1234]]
+Latinski: -{Ne nuntium necare}-
 !! result
-<p>RFC <a href="/index.php?title=RFC_1234&amp;action=edit&amp;redlink=1" class="new" title="RFC 1234 (page does not exist)">RFC 1234</a>
+<p>Латински: Ne nuntium necare
 </p>
 !! end
 
+
 !! test
-RFC code coverage
+Prevent conversion of links with -{}- tags (language variants)
+!! options
+language=sr variant=sr-ec
 !! input
-RFC   983&#x20;987
+-{[[Main Page]]}-
 !! result
-<p><a class="external mw-magiclink-rfc" href="//tools.ietf.org/html/rfc983">RFC 983</a>&#x20;987
+<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
 </p>
 !! end
 
+
 !! test
-Centre-aligned image
+-{}- tags within headlines (within html for parserConvert())
+!! options
+language=sr variant=sr-ec
 !! input
-[[Image:foobar.jpg|centre]]
+== -{Naslov}- ==
 !! result
-<div class="center"><div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div></div>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
+
+!! end
 
-!!end
 
 !! test
-None-aligned image
+Explicit definition of language variant alternatives
+!! options
+language=zh variant=zh-tw
 !! input
-[[Image:foobar.jpg|none]]
+-{zh:China;zh-tw:Taiwan}-, not China
 !! result
-<div class="floatnone"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a></div>
+<p>Taiwan, not China
+</p>
+!! end
 
-!!end
 
 !! test
-Width + Height sized image (using px) (height is ignored)
+Explicit session-wise language variant mapping (A flag and - flag)
+!! options
+language=zh variant=zh-tw
 !! input
-[[Image:foobar.jpg|640x480px]]
+Taiwan is not China.
+But -{A|zh:China;zh-tw:Taiwan}- is China,
+(This-{-|zh:China;zh-tw:Taiwan}- should be stripped!)
+and -{China}- is China.
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
+<p>Taiwan is not China.
+But Taiwan is Taiwan,
+(This should be stripped!)
+and China is China.
 </p>
-!!end
+!! end
 
 !! test
-Width-sized image (using px, no following whitespace)
+Explicit session-wise language variant mapping (H flag for hide)
+!! options
+language=zh variant=zh-tw
 !! input
-[[Image:foobar.jpg|640px]]
+(This-{H|zh:China;zh-tw:Taiwan}- should be stripped!)
+Taiwan is China.
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
+<p>(This should be stripped!)
+Taiwan is Taiwan.
 </p>
-!!end
+!! end
 
 !! test
-Width-sized image (using px, with following whitespace - test regression from r39467)
+Adding explicit conversion rule for title (T flag)
+!! options
+language=zh variant=zh-tw showtitle
 !! input
-[[Image:foobar.jpg|640px ]]
+Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
+Taiwan
+<p>Should be stripped!
 </p>
-!!end
+!! end
 
 !! test
-Width-sized image (using px, with preceding whitespace - test regression from r39467)
+Testing that changing the language variant here in the tests actually works
+!! options
+language=zh variant=zh showtitle
 !! input
-[[Image:foobar.jpg| 640px]]
+Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
 !! result
-<p><a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="640" height="73" /></a>
+China
+<p>Should be stripped!
 </p>
-!!end
+!! end
 
 !! test
-Another italics / bold test
+Bug 24072: more test on conversion rule for title
+!! options
+language=zh variant=zh-tw showtitle
 !! input
- ''' ''x'
+This should be stripped-{T|zh:China;zh-tw:Taiwan}-!
+This won't take interferes with the title rule-{H|zh:Beijing;zh-tw:Taipei}-.
 !! result
-<pre>'<i> </i>x'
-</pre>
-!!end
+Taiwan
+<p>This should be stripped!
+This won't take interferes with the title rule.
+</p>
+!! end
 
-# Note the results may be incorrect, as parserTest output included this:
-# XML error: Mismatched tag at byte 6120:
-# ...<dd> </dt></dl> </dd...
 !! test
-dt/dd/dl test
+Raw output of variant escape tags (R flag)
 !! options
-disabled
+language=zh variant=zh-tw
 !! input
-:;;;::
+Raw: -{R|zh:China;zh-tw:Taiwan}-
 !! result
-<dl><dd><dl><dt><dl><dt><dl><dt><dl><dd><dl><dd>
-</dd></dl>
-</dd></dl>
-</dt></dl>
-</dt></dl>
-</dt></dl>
-</dd></dl>
-
-!!end
-
+<p>Raw: zh:China;zh-tw:Taiwan
+</p>
+!! end
 
-# Images with the "|" character in external URLs in comment tags; Eats half the comment, leaves unmatched "</a>" tag.
 !! test
-Images with the "|" character in the comment
+Nested using of manual convert syntax
+!! options
+language=zh variant=zh-hk
 !! input
-[[image:Foobar.jpg|thumb|An [http://test/?param1=|left|&param2=|x external] URL]]
+Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiwan;zh-hk:H-{ong}- K-{}-ong;}-;}-!
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>An <a rel="nofollow" class="external text" href="http://test/?param1=%7Cleft%7C&amp;param2=%7Cx">external</a> URL</div></div></div>
-
-!!end
+<p>Nested: Hello Hong Kong!
+</p>
+!! end
 
 !! test
-[Before] HTML without raw HTML enabled ($wgRawHtml==false)
+Proper conversion of text in external links
+!! options
+language=sr variant=sr-ec
 !! input
-<html><script>alert(1);</script></html>
+http://www.google.com
+gopher://www.google.com
+[http://www.google.com http://www.google.com]
+[gopher://www.google.com gopher://www.google.com]
+[https://www.google.com irc://www.google.com]
+[ftp://www.google.com www.google.com/ftp://dir]
+[//www.google.com www.google.com]
 !! result
-<p>&lt;html&gt;&lt;script&gt;alert(1);&lt;/script&gt;&lt;/html&gt;
+<p><a rel="nofollow" class="external free" href="http://www.google.com">http://www.google.com</a>
+<a rel="nofollow" class="external free" href="gopher://www.google.com">gopher://www.google.com</a>
+<a rel="nofollow" class="external free" href="http://www.google.com">http://www.google.com</a>
+<a rel="nofollow" class="external free" href="gopher://www.google.com">gopher://www.google.com</a>
+<a rel="nofollow" class="external text" href="https://www.google.com">irc://www.google.com</a>
+<a rel="nofollow" class="external text" href="ftp://www.google.com">www.гоогле.цом/фтп://дир</a>
+<a rel="nofollow" class="external text" href="//www.google.com">www.гоогле.цом</a>
 </p>
 !! end
 
 !! test
-HTML with raw HTML ($wgRawHtml==true)
+Do not convert roman numbers to language variants
 !! options
-rawhtml
+language=sr variant=sr-ec
 !! input
-<html><script>alert(1);</script></html>
+Fridrih IV je car.
 !! result
-<p><script>alert(1);</script>
+<p>Фридрих IV је цар.
 </p>
 !! end
 
 !! test
-Parents of subpages, one level up
+Unclosed language converter markup "-{"
 !! options
-subpage title=[[Subpage test/L1/L2/L3]]
+language=sr
 !! input
-[[../|L2]]
+-{T|hello
 !! result
-<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">L2</a>
+<p>-{T|hello
 </p>
 !! end
 
-
 !! test
-Parents of subpages, one level up, not named
+Don't convert raw rule "-{R|=&gt;}-" to "=>"
 !! options
-subpage title=[[Subpage test/L1/L2/L3]]
+language=sr
 !! input
-[[../]]
+-{R|=&gt;}-
 !! result
-<p><a href="/index.php?title=Subpage_test/L1/L2&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1/L2 (page does not exist)">Subpage test/L1/L2</a>
+<p>=&gt;
 </p>
-!! end
-
+!!end
 
+!!article
+Template:Bullet
+!!text
+* Bar
+!!endarticle
 
 !! test
-Parents of subpages, two levels up
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
+Bug 529: Uncovered bullet
 !! input
-[[../../|L1]]2
-
-[[../../|L1]]l
+* Foo {{bullet}}
 !! result
-<p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1</a>2
-</p><p><a href="/index.php?title=Subpage_test/L1&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1 (page does not exist)">L1l</a>
-</p>
+<ul><li> Foo 
+</li><li> Bar
+</li></ul>
+
 !! end
 
+# Plain MediaWiki does not remove empty lists, but tidy actually does.
+# Templates in Wikipedia rely on this behavior, as tidy has always been
+# enabled there. These tests are normally run *without* tidy, so specify the
+# full output here. 
+# To test realistic parsing behavior, apply a tidy-like transformation to both
+# the expected output and your parser's output.
 !! test
-Parents of subpages, two levels up, without trailing slash or name.
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
+Bug 529: Uncovered bullet leaving empty list, normally removed by tidy
 !! input
-[[../..]]
+******* Foo {{bullet}}
 !! result
-<p>[[../..]]
-</p>
+<ul><li><ul><li><ul><li><ul><li><ul><li><ul><li><ul><li> Foo 
+</li></ul>
+</li></ul>
+</li></ul>
+</li></ul>
+</li></ul>
+</li></ul>
+</li><li> Bar
+</li></ul>
+
 !! end
 
 !! test
-Parents of subpages, two levels up, with lots of extra trailing slashes.
-!! options
-subpage title=[[Subpage test/L1/L2/L3]]
+Bug 529: Uncovered table already at line-start
 !! input
-[[../../////]]
+x
+
+{{table}}
+y
 !! result
-<p><a href="/index.php?title=Subpage_test/L1////&amp;action=edit&amp;redlink=1" class="new" title="Subpage test/L1//// (page does not exist)">///</a>
+<p>x
+</p>
+<table>
+<tr>
+<td> 1 </td>
+<td> 2
+</td></tr>
+<tr>
+<td> 3 </td>
+<td> 4
+</td></tr></table>
+<p>y
 </p>
 !! end
 
 !! test
-Definition list code coverage
+Bug 529: Uncovered bullet in parser function result
 !! input
-; title   : def
-; title : def
-;title: def
+* Foo {{lc:{{bullet}} }}
 !! result
-<dl><dt> title  &#160;</dt><dd> def
-</dd><dt> title&#160;</dt><dd> def
-</dd><dt>title</dt><dd> def
-</dd></dl>
+<ul><li> Foo 
+</li><li> bar
+</li></ul>
 
 !! end
 
 !! test
-Don't fall for the self-closing div
+Bug 5678: Double-parsed template argument
 !! input
-<div>hello world</div/>
+{{lc:{{{1}}}|hello}}
 !! result
-<div>hello world</div>
-
+<p>{{{1}}}
+</p>
 !! end
 
 !! test
-MSGNW magic word
+Bug 5678: Double-parsed template invocation
 !! input
-{{MSGNW:msg}}
+{{lc:{{paramtest {{!}} param = hello }} }}
 !! result
-<p>&#91;&#91;:Template:Msg&#93;&#93;
+<p>{{paramtest | param = hello }}
 </p>
 !! end
 
 !! test
-RAW magic word
+Case insensitivity of parser functions for non-ASCII characters (bug 8143)
+!! options
+language=cs
+title=[[Main Page]]
 !! input
-{{RAW:QUERTY}}
+{{PRVNÍVELKÉ:ěščř}}
+{{prvnívelké:ěščř}}
+{{PRVNÍMALÉ:ěščř}}
+{{prvnímalé:ěščř}}
+{{MALÁ:ěščř}}
+{{malá:ěščř}}
+{{VELKÁ:ěščř}}
+{{velká:ěščř}}
 !! result
-<p><a href="/index.php?title=Template:QUERTY&amp;action=edit&amp;redlink=1" class="new" title="Template:QUERTY (page does not exist)">Template:QUERTY</a>
+<p>Ěščř
+Ěščř
+ěščř
+ěščř
+ěščř
+ěščř
+ĚŠČŘ
+ĚŠČŘ
 </p>
 !! end
 
-# This isn't needed for XHTML conformance, but would be handy as a fallback security measure
 !! test
-Always escape literal '>' in output, not just after '<'
+Morwen/13: Unclosed link followed by heading
 !! input
-><>
+[[link
+==heading==
 !! result
-<p>&gt;&lt;&gt;
+<p>[[link
 </p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
+
 !! end
 
 !! test
-Template caching
+HHP2.1: Heuristics for headings in preprocessor parenthetical structures
 !! input
-{{Test}}
-{{Test}}
+{{foo|
+=heading=
 !! result
-<p>This is a test template
-This is a test template
+<p>{{foo|
 </p>
-!! end
-
+<h1> <span class="mw-headline" id="heading">heading</span></h1>
 
-!! article
-MediaWiki:Fake
-!! text
-==header==
-!! endarticle
+!! end
 
 !! test
-Inclusion of !userCanEdit() content
+HHP2.2: Heuristics for headings in preprocessor parenthetical structures
 !! input
-{{MediaWiki:Fake}}
+{{foo|
+==heading==
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=MediaWiki:Fake&amp;action=edit&amp;section=T-1" title="MediaWiki:Fake">edit</a>]</span> <span class="mw-headline" id="header">header</span></h2>
+<p>{{foo|
+</p>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
 
 !! end
 
-
 !! test
-Out-of-order TOC heading levels
+Tildes in comments
+!! options
+pst
 !! input
-==2==
-======6======
-===3===
-=1=
-=====5=====
-==2==
+<!-- ~~~~ -->
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#2"><span class="tocnumber">1</span> <span class="toctext">2</span></a>
-<ul>
-<li class="toclevel-2 tocsection-2"><a href="#6"><span class="tocnumber">1.1</span> <span class="toctext">6</span></a></li>
-<li class="toclevel-2 tocsection-3"><a href="#3"><span class="tocnumber">1.2</span> <span class="toctext">3</span></a></li>
-</ul>
-</li>
-<li class="toclevel-1 tocsection-4"><a href="#1"><span class="tocnumber">2</span> <span class="toctext">1</span></a>
-<ul>
-<li class="toclevel-2 tocsection-5"><a href="#5"><span class="tocnumber">2.1</span> <span class="toctext">5</span></a></li>
-<li class="toclevel-2 tocsection-6"><a href="#2_2"><span class="tocnumber">2.2</span> <span class="toctext">2</span></a></li>
-</ul>
-</li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2">2</span></h2>
-<h6><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: 6">edit</a>]</span> <span class="mw-headline" id="6">6</span></h6>
-<h3><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: 3">edit</a>]</span> <span class="mw-headline" id="3">3</span></h3>
-<h1><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: 1">edit</a>]</span> <span class="mw-headline" id="1">1</span></h1>
-<h5><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: 5">edit</a>]</span> <span class="mw-headline" id="5">5</span></h5>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=6" title="Edit section: 2">edit</a>]</span> <span class="mw-headline" id="2_2">2</span></h2>
-
+<!-- ~~~~ -->
 !! end
 
-
 !! test
-ISBN with a dummy number
+Paragraphs inside divs (no extra line breaks)
 !! input
-ISBN ---
+<div>Line one
+
+Line two</div>
 !! result
-<p>ISBN ---
-</p>
-!! end
+<div>Line one
+Line two</div>
 
+!! end
 
 !! test
-ISBN with space-delimited number
+Paragraphs inside divs (extra line break on open)
 !! input
-ISBN 92 9017 032 8
+<div>
+Line one
+
+Line two</div>
 !! result
-<p><a href="/wiki/Special:BookSources/9290170328" class="internal mw-magiclink-isbn">ISBN 92 9017 032 8</a>
+<div>
+<p>Line one
 </p>
-!! end
+Line two</div>
 
+!! end
 
 !! test
-ISBN with multiple spaces, no number
+Paragraphs inside divs (extra line break on close)
 !! input
-ISBN  foo
+<div>Line one
+
+Line two
+</div>
 !! result
-<p>ISBN  foo
+<div>Line one
+<p>Line two
 </p>
-!! end
+</div>
 
+!! end
 
 !! test
-ISBN length
+Paragraphs inside divs (extra line break on open and close)
 !! input
-ISBN 123456789
-
-ISBN 1234567890
+<div>
+Line one
 
-ISBN 12345678901
+Line two
+</div>
 !! result
-<p>ISBN 123456789
-</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1234567890</a>
-</p><p>ISBN 12345678901
+<div>
+<p>Line one
+</p><p>Line two
 </p>
-!! end
+</div>
 
+!! end
 
 !! test
-ISBN with trailing year (bug 8110)
+Nesting tags, paragraphs on lines which begin with <div>
+!! options
+disabled
 !! input
-ISBN 1-234-56789-0 - 2006
-
-ISBN 1 234 56789 0 - 2006
+<div></div><strong>A
+B</strong>
 !! result
-<p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1-234-56789-0</a> - 2006
-</p><p><a href="/wiki/Special:BookSources/1234567890" class="internal mw-magiclink-isbn">ISBN 1 234 56789 0</a> - 2006
+<div></div>
+<p><strong>A
+B</strong>
 </p>
 !! end
 
-
+# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
 !! test
-anchorencode
+Bug 6200: paragraphs inside blockquotes (no extra line breaks)
+!! options
+disabled
 !! input
-{{anchorencode:foo bar©#%n}}
+<blockquote>Line one
+
+Line two</blockquote>
 !! result
-<p>foo_bar.C2.A9.23.25n
-</p>
+<blockquote>Line one
+Line two</blockquote>
+
 !! end
 
 !! test
-anchorencode trims spaces
+Bug 6200: paragraphs inside blockquotes (extra line break on open)
+!! options
+disabled
 !! input
-{{anchorencode: __pretty__please__}}
+<blockquote>
+Line one
+
+Line two</blockquote>
 !! result
-<p>pretty_please
+<blockquote>
+<p>Line one
 </p>
+Line two</blockquote>
+
 !! end
 
 !! test
-anchorencode deals with links
+Bug 6200: paragraphs inside blockquotes (extra line break on close)
+!! options
+disabled
 !! input
-{{anchorencode: [[hello|world]] [[hi]]}}
+<blockquote>Line one
+
+Line two
+</blockquote>
 !! result
-<p>world_hi
+<blockquote>Line one
+<p>Line two
 </p>
+</blockquote>
+
 !! end
 
 !! test
-anchorencode deals with templates
+Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
+!! options
+disabled
 !! input
-{{anchorencode: {{Foo}} }}
+<blockquote>
+Line one
+
+Line two
+</blockquote>
 !! result
-<p>FOO
+<blockquote>
+<p>Line one
+</p><p>Line two
 </p>
+</blockquote>
+
 !! end
 
 !! test
-anchorencode encodes like the TOC generator: (bug 18431)
+Paragraphs inside blockquotes/divs (no extra line breaks)
 !! input
-=== _ +:.3A%3A&&amp;]] ===
-{{anchorencode: _ +:.3A%3A&&amp;]] }}
-__NOEDITSECTION__
+<blockquote><div>Line one
+
+Line two</div></blockquote>
 !! result
-<h3> <span class="mw-headline" id=".2B:.3A.253A.26.26.5D.5D"> _ +:.3A%3A&amp;&amp;]] </span></h3>
-<p>.2B:.3A.253A.26.26.5D.5D
-</p>
+<blockquote><div>Line one
+Line two</div></blockquote>
+
 !! end
 
-# Expected output in the following test is not necessarily expected (there
-# should probably be <p> tags inside the <blockquote> in the output) -- it's
-# only testing for well-formedness.
 !! test
-Bug 6200: blockquotes and paragraph formatting
+Paragraphs inside blockquotes/divs (extra line break on open)
 !! input
-<blockquote>
-foo
-</blockquote>
-
-bar
+<blockquote><div>
+Line one
 
- baz
+Line two</div></blockquote>
 !! result
-<blockquote>
-foo
-</blockquote>
-<p>bar
+<blockquote><div>
+<p>Line one
 </p>
-<pre>baz
-</pre>
+Line two</div></blockquote>
+
 !! end
 
 !! test
-Bug 8293: Use of center tag ruins paragraph formatting
+Paragraphs inside blockquotes/divs (extra line break on close)
 !! input
-<center>
-foo
-</center>
-
-bar
+<blockquote><div>Line one
 
- baz
+Line two
+</div></blockquote>
 !! result
-<center>
-<p>foo
-</p>
-</center>
-<p>bar
+<blockquote><div>Line one
+<p>Line two
 </p>
-<pre>baz
-</pre>
-!! end
+</div></blockquote>
 
+!! end
 
-###
-### Language variants related tests
-###
 !! test
-Self-link in language variants
-!! options
-title=[[Dunav]] language=sr
+Paragraphs inside blockquotes/divs (extra line break on open and close)
 !! input
-Both [[Dunav]] and [[Дунав]] are names for this river.
+<blockquote><div>
+Line one
+
+Line two
+</div></blockquote>
 !! result
-<p>Both <strong class="selflink">Dunav</strong> and <strong class="selflink">Дунав</strong> are names for this river.
+<blockquote><div>
+<p>Line one
+</p><p>Line two
 </p>
-!!end
+</div></blockquote>
 
+!! end
 
 !! test
-Link to pages in language variants
+Interwiki links trounced by replaceExternalLinks after early LinkHolderArray expansion
 !! options
-language=sr
+wgLinkHolderBatchSize=0
 !! input
-Main Page can be written as [[Маин Паге]]
+[[meatball:1]]
+[[meatball:2]]
+[[meatball:3]]
 !! result
-<p>Main Page can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>
+<p><a href="http://www.usemod.com/cgi-bin/mb.pl?1" class="extiw" title="meatball:1">meatball:1</a>
+<a href="http://www.usemod.com/cgi-bin/mb.pl?2" class="extiw" title="meatball:2">meatball:2</a>
+<a href="http://www.usemod.com/cgi-bin/mb.pl?3" class="extiw" title="meatball:3">meatball:3</a>
 </p>
-!!end
-
+!! end
 
 !! test
-Multiple links to pages in language variants
-!! options
-language=sr
+Free external link invading image caption
 !! input
-[[Main Page]] can be written as [[Маин Паге]] same as [[Маин Паге]].
+[[Image:Foobar.jpg|thumb|http://x|hello]]
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a> can be written as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a> same as <a href="/wiki/Main_Page" title="Main Page">Маин Паге</a>.
-</p>
-!!end
+<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/thumb/3/3a/Foobar.jpg/180px-Foobar.jpg" width="180" height="20" class="thumbimage" srcset="http://example.com/images/thumb/3/3a/Foobar.jpg/270px-Foobar.jpg 1.5x, http://example.com/images/thumb/3/3a/Foobar.jpg/360px-Foobar.jpg 2x" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>hello</div></div></div>
 
+!! end
 
 !! test
-Simple template in language variants
+Bug 15196: localised external link numbers
 !! options
-language=sr
+language=fa
 !! input
-{{тест}}
+[http://en.wikipedia.org/]
 !! result
-<p>This is a test template
+<p><a rel="nofollow" class="external autonumber" href="http://en.wikipedia.org/">[۱]</a>
 </p>
 !! end
 
-
 !! test
-Template with explicit namespace in language variants
-!! options
-language=sr
+Multibyte character in padleft
 !! input
-{{Template:тест}}
+{{padleft:-Hello|7|Æ}}
 !! result
-<p>This is a test template
+<p>Æ-Hello
 </p>
 !! end
 
-
 !! test
-Basic test for template parameter in language variants
-!! options
-language=sr
+Multibyte character in padright
 !! input
-{{парамтест|param=foo}}
+{{padright:Hello-|7|Æ}}
 !! result
-<p>This is a test template with parameter foo
+<p>Hello-Æ
 </p>
 !! end
 
-
 !! test
-Simple category in language variants
-!! options
-language=sr cat
+Formatted date
+!! config
+wgUseDynamicDates=1
 !! input
-[[Category:МедиаWики Усер'с Гуиде]]
+[[2009-03-24]]
 !! result
-<a href="/wiki/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%98%D0%B0:MediaWiki_User%27s_Guide" title="Категорија:MediaWiki User's Guide">MediaWiki User's Guide</a>
+<p><span class="mw-formatted-date" title="2009-03-24"><a href="/index.php?title=2009&amp;action=edit&amp;redlink=1" class="new" title="2009 (page does not exist)">2009</a>-<a href="/index.php?title=March_24&amp;action=edit&amp;redlink=1" class="new" title="March 24 (page does not exist)">03-24</a></span>
+</p>
+!!end
+
+!!test
+formatdate parser function
+!!input
+{{#formatdate:2009-03-24}}
+!! result
+<p><span class="mw-formatted-date" title="2009-03-24">2009-03-24</span>
+</p>
 !! end
 
+!!test
+formatdate parser function, with default format
+!!input
+{{#formatdate:2009-03-24|mdy}}
+!! result
+<p><span class="mw-formatted-date" title="2009-03-24">March 24, 2009</span>
+</p>
+!! end
 
 !! test
-Stripping -{}- tags (language variants)
-!! options
-language=sr
+Linked date with autoformatting disabled
+!! config
+wgUseDynamicDates=false
 !! input
-Latin proverb: -{Ne nuntium necare}-
+[[2009-03-24]]
 !! result
-<p>Latin proverb: Ne nuntium necare
+<p><a href="/index.php?title=2009-03-24&amp;action=edit&amp;redlink=1" class="new" title="2009-03-24 (page does not exist)">2009-03-24</a>
 </p>
 !! end
 
-
 !! test
-Prevent conversion with -{}- tags (language variants)
-!! options
-language=sr variant=sr-ec
+Spacing of numbers in formatted dates
 !! input
-Latinski: -{Ne nuntium necare}-
+{{#formatdate:January 15}}
 !! result
-<p>Латински: Ne nuntium necare
+<p><span class="mw-formatted-date" title="01-15">January 15</span>
 </p>
 !! end
 
-
 !! test
-Prevent conversion of text with -{}- tags (language variants)
-!! options
-language=sr variant=sr-ec
+Spacing of numbers in formatted dates (linked)
+!! config
+wgUseDynamicDates=true
 !! input
-Latinski: -{Ne nuntium necare}-
+[[January 15]]
 !! result
-<p>Латински: Ne nuntium necare
+<p><span class="mw-formatted-date" title="01-15"><a href="/index.php?title=January_15&amp;action=edit&amp;redlink=1" class="new" title="January 15 (page does not exist)">January 15</a></span>
 </p>
 !! end
 
-
 !! test
-Prevent conversion of links with -{}- tags (language variants)
+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=sr variant=sr-ec
+language=nl title=[[MediaWiki:Common.css]]
 !! input
--{[[Main Page]]}-
+{{#formatdate:2009-03-24|dmy}}
 !! result
-<p><a href="/wiki/Main_Page" title="Main Page">Main Page</a>
+<p><span class="mw-formatted-date" title="2009-03-24">24 March 2009</span>
 </p>
 !! end
 
+#
+#
+#
+
+#
+# Edit comments
+#
 
 !! test
--{}- tags within headlines (within html for parserConvert())
+Edit comment with link
 !! options
-language=sr variant=sr-ec
+comment
 !! input
-== -{Naslov}- ==
+I like the [[Main Page]] a lot
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Уредите одељак „Naslov“">уреди</a>]</span> <span class="mw-headline" id="-.7BNaslov.7D-"> Naslov </span></h2>
-
-!! end
-
+I like the <a href="/wiki/Main_Page" title="Main Page">Main Page</a> a lot
+!!end
 
 !! test
-Explicit definition of language variant alternatives
+Edit comment with link and link text
 !! options
-language=zh variant=zh-tw
+comment
 !! input
--{zh:China;zh-tw:Taiwan}-, not China
+I like the [[Main Page|best pages]] a lot
 !! result
-<p>Taiwan, not China
-</p>
-!! end
-
+I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
+!!end
 
 !! test
-Explicit session-wise language variant mapping (A flag and - flag)
+Edit comment with link and link text with suffix
 !! options
-language=zh variant=zh-tw
+comment
 !! input
-Taiwan is not China.
-But -{A|zh:China;zh-tw:Taiwan}- is China,
-(This-{-|zh:China;zh-tw:Taiwan}- should be stripped!)
-and -{China}- is China.
+I like the [[Main Page|best page]]s a lot
 !! result
-<p>Taiwan is not China.
-But Taiwan is Taiwan,
-(This should be stripped!)
-and China is China.
-</p>
-!! end
+I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
+!!end
 
 !! test
-Explicit session-wise language variant mapping (H flag for hide)
+Edit comment with section link (non-local, eg in history list)
 !! options
-language=zh variant=zh-tw
+comment title=[[Main Page]]
 !! input
-(This-{H|zh:China;zh-tw:Taiwan}- should be stripped!)
-Taiwan is China.
+/* External links */ removed bogus entries
 !! result
-<p>(This should be stripped!)
-Taiwan is Taiwan.
-</p>
-!! end
+<a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
+!!end
+
+!! test
+Edit comment with section link and text before it (non-local, eg in history list)
+!! options
+comment title=[[Main Page]]
+!! input
+pre-comment text /* External links */ removed bogus entries
+!! result
+pre-comment text - <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
+!!end
 
 !! test
-Adding explicit conversion rule for title (T flag)
+Edit comment with section link (local, eg in diff view)
 !! options
-language=zh variant=zh-tw showtitle
+comment local title=[[Main Page]]
 !! input
-Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
+/* External links */ removed bogus entries
 !! result
-Taiwan
-<p>Should be stripped!
-</p>
-!! end
+<a href="#External_links">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
+!!end
 
 !! test
-Testing that changing the language variant here in the tests actually works
+Edit comment with subpage link (bug 14080)
 !! options
-language=zh variant=zh showtitle
+comment
+subpage
+title=[[Subpage test]]
 !! input
-Should be stripped-{T|zh:China;zh-tw:Taiwan}-!
+Poked at a [[/subpage]] here...
 !! result
-China
-<p>Should be stripped!
-</p>
-!! end
+Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a> here...
+!!end
 
 !! test
-Bug 24072: more test on conversion rule for title
+Edit comment with subpage link and link text (bug 14080)
 !! options
-language=zh variant=zh-tw showtitle
+comment
+subpage
+title=[[Subpage test]]
 !! input
-This should be stripped-{T|zh:China;zh-tw:Taiwan}-!
-This won't take interferes with the title rule-{H|zh:Beijing;zh-tw:Taipei}-.
+Poked at a [[/subpage|neat little page]] here...
 !! result
-Taiwan
-<p>This should be stripped!
-This won't take interferes with the title rule.
-</p>
-!! end
+Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">neat little page</a> here...
+!!end
 
 !! test
-Raw output of variant escape tags (R flag)
+Edit comment with bogus subpage link in non-subpage NS (bug 14080)
 !! options
-language=zh variant=zh-tw
+comment
+title=[[Subpage test]]
 !! input
-Raw: -{R|zh:China;zh-tw:Taiwan}-
+Poked at a [[/subpage]] here...
 !! result
-<p>Raw: zh:China;zh-tw:Taiwan
-</p>
-!! end
+Poked at a <a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> here...
+!!end
 
 !! test
-Nested using of manual convert syntax
+Edit comment with bare anchor link (local, as on diff)
 !! options
-language=zh variant=zh-hk
-!! input
-Nested: -{zh-hans:Hi -{zh-cn:China;zh-sg:Singapore;}-;zh-hant:Hello -{zh-tw:Taiwan;zh-hk:H-{ong}- K-{}-ong;}-;}-!
+comment
+local
+title=[[Main Page]]
+!!input
+[[#section]]
 !! result
-<p>Nested: Hello Hong Kong!
-</p>
+<a href="#section">#section</a>
 !! end
 
 !! test
-Do not convert roman numbers to language variants
+Edit comment with bare anchor link (non-local, as on history)
 !! options
-language=sr variant=sr-ec
-!! input
-Fridrih IV je car.
+comment
+title=[[Main Page]]
+!!input
+[[#section]]
 !! result
-<p>Фридрих IV је цар.
-</p>
+<a href="/wiki/Main_Page#section" title="Main Page">#section</a>
 !! end
 
 !! test
-Unclosed language converter markup "-{"
-!! options 
-language=sr
-!! input
--{T|hello
+Anchor starting with underscore
+!!input
+[[#_ref|One]]
 !! result
-<p>-{T|hello
+<p><a href="#_ref">One</a>
 </p>
 !! end
 
 !! test
-Don't convert raw rule "-{R|=&gt;}-" to "=>"
-!! options
-language=sr
-!! input
--{R|=&gt;}-
-!! result 
-<p>=&gt;
-</p>
-!!end
+Id starting with underscore
+!!input
+<div id="_ref"></div>
+!! result
+<div id="_ref"></div>
 
-!!article 
-Template:Bullet
-!!text
-* Bar
-!!endarticle
+!! end
 
 !! test
-Bug 529: Uncovered bullet
-!! input
-* Foo {{bullet}}
+Space normalisation on autocomment (bug 22784)
+!! options
+comment
+title=[[Main Page]]
+!!input
+/* __hello__world__ */
 !! result
-<ul><li> Foo 
-</li><li> Bar
-</li></ul>
-
+<a href="/wiki/Main_Page#hello_world" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">__hello__world__</span></span>
 !! end
 
 !! test
-Bug 529: Uncovered table already at line-start
-!! input
-x
-
-{{table}}
-y
+percent-encoding and + signs in comments (Bug 26410)
+!! options
+comment
+!!input
+[[ABC%33D% ++]] [[ABC%33D% ++|+%20]]
 !! result
-<p>x
-</p>
-<table>
-<tr>
-<td> 1 </td>
-<td> 2
-</td></tr>
-<tr>
-<td> 3 </td>
-<td> 4
-</td></tr></table>
-<p>y
-</p>
+<a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">ABC3D% ++</a> <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">+%20</a>
 !! end
 
 !! test
-Bug 529: Uncovered bullet in parser function result
+Bad images - basic functionality
+!! options
+disabled
 !! input
-* Foo {{lc:{{bullet}} }}
+[[File:Bad.jpg]]
 !! result
-<ul><li> Foo 
-</li><li> bar
-</li></ul>
-
 !! end
 
 !! test
-Bug 5678: Double-parsed template argument
+Bad images - bug 16039: text after bad image disappears
+!! options
+disabled
 !! input
-{{lc:{{{1}}}|hello}}
+Foo bar
+[[File:Bad.jpg]]
+Bar foo
 !! result
-<p>{{{1}}}
+<p>Foo bar
+</p><p>Bar foo
 </p>
 !! end
 
 !! test
-Bug 5678: Double-parsed template invocation
+Verify that displaytitle works (bug #22501) no displaytitle
+!! options
+showtitle
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=false
 !! input
-{{lc:{{paramtest {{!}} param = hello }} }}
+this is not the the title
 !! result
-<p>{{paramtest | param = hello }}
+Parser test
+<p>this is not the the title
 </p>
 !! end
 
 !! test
-Case insensitivity of parser functions for non-ASCII characters (bug 8143)
+Verify that displaytitle works (bug #22501) RestrictDisplayTitle=false
 !! options
-language=cs
-title=[[Main Page]]
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=false
 !! input
-{{PRVNÍVELKÉ:ěščř}}
-{{prvnívelké:ěščř}}
-{{PRVNÍMALÉ:ěščř}}
-{{prvnímalé:ěščř}}
-{{MALÁ:ěščř}}
-{{malá:ěščř}}
-{{VELKÁ:ěščř}}
-{{velká:ěščř}}
+this is not the the title
+{{DISPLAYTITLE:whatever}}
 !! result
-<p>Ěščř
-Ěščř
-ěščř
-ěščř
-ěščř
-ěščř
-ĚŠČŘ
-ĚŠČŘ
+whatever
+<p>this is not the the title
 </p>
 !! end
 
 !! test
-Morwen/13: Unclosed link followed by heading
+Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true mismatch
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=true
 !! input
-[[link
-==heading==
+this is not the the title
+{{DISPLAYTITLE:whatever}}
 !! result
-<p>[[link
+Screen
+<p>this is not the the title
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
-
 !! end
 
 !! test
-HHP2.1: Heuristics for headings in preprocessor parenthetical structures
+Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true matching
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=true
+wgRestrictDisplayTitle=true
 !! input
-{{foo|
-=heading=
+this is not the the title
+{{DISPLAYTITLE:screen}}
 !! result
-<p>{{foo|
+screen
+<p>this is not the the title
 </p>
-<h1> <span class="mw-headline" id="heading">heading</span></h1>
-
 !! end
 
 !! test
-HHP2.2: Heuristics for headings in preprocessor parenthetical structures
+Verify that displaytitle works (bug #22501) AllowDisplayTitle=false
+!! options
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=false
 !! input
-{{foo|
-==heading==
+this is not the the title
+{{DISPLAYTITLE:screen}}
 !! result
-<p>{{foo|
+Screen
+<p>this is not the the title
+<a href="/index.php?title=Template:DISPLAYTITLE:screen&amp;action=edit&amp;redlink=1" class="new" title="Template:DISPLAYTITLE:screen (page does not exist)">Template:DISPLAYTITLE:screen</a>
 </p>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: heading">edit</a>]</span> <span class="mw-headline" id="heading">heading</span></h2>
-
 !! end
 
 !! test
-Tildes in comments
+Verify that displaytitle works (bug #22501) AllowDisplayTitle=false no DISPLAYTITLE
 !! options
-pst
+showtitle
+title=[[Screen]]
+!! config
+wgAllowDisplayTitle=false
 !! input
-<!-- ~~~~ -->
+this is not the the title
 !! result
-<!-- ~~~~ -->
+Screen
+<p>this is not the the title
+</p>
 !! end
 
 !! test
-Paragraphs inside divs (no extra line breaks)
+preload: check <noinclude> and <includeonly>
+!! options
+preload
 !! input
-<div>Line one
-
-Line two</div>
+Hello <noinclude>cruel</noinclude><includeonly>kind</includeonly> world.
 !! result
-<div>Line one
-Line two</div>
-
+Hello kind world.
 !! end
 
 !! test
-Paragraphs inside divs (extra line break on open)
+preload: check <onlyinclude>
+!! options
+preload
 !! input
-<div>
-Line one
-
-Line two</div>
+Goodbye <onlyinclude>Hello world</onlyinclude>
 !! result
-<div>
-<p>Line one
-</p>
-Line two</div>
-
+Hello world
 !! end
 
 !! test
-Paragraphs inside divs (extra line break on close)
+preload: can pass tags through if we want to
+!! options
+preload
 !! input
-<div>Line one
-
-Line two
-</div>
+<includeonly><</includeonly>includeonly>Hello world<includeonly><</includeonly>/includeonly>
 !! result
-<div>Line one
-<p>Line two
-</p>
-</div>
-
+<includeonly>Hello world</includeonly>
 !! end
 
 !! test
-Paragraphs inside divs (extra line break on open and close)
+preload: check that it doesn't try to do tricks
+!! options
+preload
 !! input
-<div>
-Line one
-
-Line two
-</div>
+* <!-- Hello --> ''{{world}}'' {{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
 !! result
-<div>
-<p>Line one
-</p><p>Line two
-</p>
-</div>
-
+* <!-- Hello --> ''{{world}}'' {{subst:How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
 !! end
 
 !! test
-Nesting tags, paragraphs on lines which begin with <div>
+Play a bit with r67090 and bug 3158
 !! options
 disabled
 !! input
-<div></div><strong>A
-B</strong>
+<div style="width:50% !important">&nbsp;</div>
+<div style="width:50%&nbsp;!important">&nbsp;</div>
+<div style="width:50%&#160;!important">&nbsp;</div>
+<div style="border : solid;">&nbsp;</div>
 !! result
-<div></div>
-<p><strong>A
-B</strong>
-</p>
+<div style="width:50% !important">&nbsp;</div>
+<div style="width:50% !important">&nbsp;</div>
+<div style="width:50% !important">&nbsp;</div>
+<div style="border&#160;: solid;">&nbsp;</div>
+
 !! end
 
-# Bug 6200: <blockquote> should behave like <div> with respect to line breaks
 !! test
-Bug 6200: paragraphs inside blockquotes (no extra line breaks)
-!! options
-disabled
+HTML5 data attributes
 !! input
-<blockquote>Line one
-
-Line two</blockquote>
+<span data-foo="bar">Baz</span>
+<p data-abc-def_hij="">Quuz</p>
 !! result
-<blockquote>Line one
-Line two</blockquote>
+<p><span data-foo="bar">Baz</span>
+</p>
+<p data-abc-def_hij="">Quuz</p>
 
 !! end
 
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open)
-!! options
-disabled
+percent-encoding and + signs in internal links (Bug 26410)
 !! input
-<blockquote>
-Line one
-
-Line two</blockquote>
+[[User:+%]] [[Page+title%]]
+[[%+]] [[%+|%20]] [[%+ ]] [[%+r]]
+[[%]] [[+]] [[image:%+abc%39|foo|[[bar]]]]
+[[%33%45]] [[%33%45+]]
 !! result
-<blockquote>
-<p>Line one
+<p><a href="/index.php?title=User:%2B%25&amp;action=edit&amp;redlink=1" class="new" title="User:+% (page does not exist)">User:+%</a> <a href="/index.php?title=Page%2Btitle%25&amp;action=edit&amp;redlink=1" class="new" title="Page+title% (page does not exist)">Page+title%</a>
+<a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%20</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+ </a> <a href="/index.php?title=%25%2Br&amp;action=edit&amp;redlink=1" class="new" title="%+r (page does not exist)">%+r</a>
+<a href="/index.php?title=%25&amp;action=edit&amp;redlink=1" class="new" title="% (page does not exist)">%</a> <a href="/index.php?title=%2B&amp;action=edit&amp;redlink=1" class="new" title="+ (page does not exist)">+</a> <a href="/index.php?title=Special:Upload&amp;wpDestFile=%25%2Babc9" class="new" title="File:%+abc9">bar</a>
+<a href="/index.php?title=3E&amp;action=edit&amp;redlink=1" class="new" title="3E (page does not exist)">3E</a> <a href="/index.php?title=3E%2B&amp;action=edit&amp;redlink=1" class="new" title="3E+ (page does not exist)">3E+</a>
 </p>
-Line two</blockquote>
-
 !! end
 
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on close)
-!! options
-disabled
+Special characters in embedded file links (bug 27679)
 !! input
-<blockquote>Line one
-
-Line two
-</blockquote>
+[[File:Contains & ampersand.jpg]]
+[[File:Does not exist.jpg|Title with & ampersand]]
 !! result
-<blockquote>Line one
-<p>Line two
+<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Contains_%26_ampersand.jpg" class="new" title="File:Contains &amp; ampersand.jpg">File:Contains &amp; ampersand.jpg</a>
+<a href="/index.php?title=Special:Upload&amp;wpDestFile=Does_not_exist.jpg" class="new" title="File:Does not exist.jpg">Title with &amp; ampersand</a>
 </p>
-</blockquote>
-
 !! end
 
+
 !! test
-Bug 6200: paragraphs inside blockquotes (extra line break on open and close)
-!! options
-disabled
+Confirm that 'apos' named character reference doesn't make it to output (not legal in HTML 4)
 !! input
-<blockquote>
-Line one
-
-Line two
-</blockquote>
+Text&apos;s been normalized?
 !! result
-<blockquote>
-<p>Line one
-</p><p>Line two
+<p>Text&#39;s been normalized?
 </p>
-</blockquote>
-
 !! end
 
 !! test
-Paragraphs inside blockquotes/divs (no extra line breaks)
+Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
 !! input
-<blockquote><div>Line one
-
-Line two</div></blockquote>
+http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
 !! result
-<blockquote><div>Line one
-Line two</div></blockquote>
-
+<p><a rel="nofollow" class="external free" href="http://www.example.org/">http://www.example.org/</a> &lt;-- U+3000 (vim: ^Vu3000)
+</p>
 !! end
 
 !! test
-Paragraphs inside blockquotes/divs (extra line break on open)
+Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
 !! input
-<blockquote><div>
-Line one
-
-Line two</div></blockquote>
+[http://www.example.org/ ideograms]
 !! result
-<blockquote><div>
-<p>Line one
+<p><a rel="nofollow" class="external text" href="http://www.example.org/">ideograms</a>
 </p>
-Line two</div></blockquote>
-
 !! end
 
 !! test
-Paragraphs inside blockquotes/divs (extra line break on close)
+Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
 !! input
-<blockquote><div>Line one
-
-Line two
-</div></blockquote>
+http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
 !! result
-<blockquote><div>Line one
-<p>Line two
+<p><img src="http://www.example.org/pic.png" alt="pic.png" /> &lt;-- U+3000 (vim: ^Vu3000)
 </p>
-</div></blockquote>
-
 !! end
 
+!! article
+Mediawiki:loop1
+!! text
+{{Identical|A}}
+!! endarticle
+
+!! article
+Mediawiki:loop2
+!! text
+{{Identical|B}}
+!! endarticle
+
+!! article
+Template:Identical
+!! text
+{{int:loop1}}
+{{int:loop2}}
+!! endarticle
+
 !! test
-Paragraphs inside blockquotes/divs (extra line break on open and close)
+Bug 31098 Template which includes system messages which includes the template
 !! input
-<blockquote><div>
-Line one
-
-Line two
-</div></blockquote>
+{{Identical}}
 !! result
-<blockquote><div>
-<p>Line one
-</p><p>Line two
+<p><span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
+<span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
 </p>
-</div></blockquote>
-
 !! end
 
 !! test
-Interwiki links trounced by replaceExternalLinks after early LinkHolderArray expansion
+Bug31490 Turkish: ucfirst 'blah'
 !! options
-wgLinkHolderBatchSize=0
+language=tr
 !! input
-[[meatball:1]]
-[[meatball:2]]
-[[meatball:3]]
+{{ucfirst:blah}}
 !! result
-<p><a href="http://www.usemod.com/cgi-bin/mb.pl?1" class="extiw" title="meatball:1">meatball:1</a>
-<a href="http://www.usemod.com/cgi-bin/mb.pl?2" class="extiw" title="meatball:2">meatball:2</a>
-<a href="http://www.usemod.com/cgi-bin/mb.pl?3" class="extiw" title="meatball:3">meatball:3</a>
+<p>Blah
 </p>
 !! end
 
 !! test
-Free external link invading image caption
+Bug31490 Turkish: ucfirst 'ix'
+!! options
+language=tr
 !! input
-[[Image:Foobar.jpg|thumb|http://x|hello]]
+{{ucfirst:ix}}
 !! result
-<div class="thumb tright"><div class="thumbinner" style="width:182px;"><a href="/wiki/File:Foobar.jpg" class="image"><img alt="" src="http://example.com/images/3/3a/Foobar.jpg" width="180" height="20" class="thumbimage" /></a>  <div class="thumbcaption"><div class="magnify"><a href="/wiki/File:Foobar.jpg" class="internal" title="Enlarge"><img src="/skins/common/images/magnify-clip.png" width="15" height="11" alt="" /></a></div>hello</div></div></div>
-
+<p>İx
+</p>
 !! end
 
 !! test
-Bug 15196: localised external link numbers
+Bug31490 Turkish: lcfirst 'BLAH'
 !! options
-language=fa
+language=tr
 !! input
-[http://en.wikipedia.org/]
+{{lcfirst:BLAH}}
 !! result
-<p><a rel="nofollow" class="external autonumber" href="http://en.wikipedia.org/">[۱]</a>
+<p>bLAH
 </p>
 !! end
 
 !! test
-Multibyte character in padleft
+Bug31490 Turkish: ucfırst (with a dotless i)
+!! options
+language=tr
 !! input
-{{padleft:-Hello|7|Æ}}
+{{ucfırst:blah}}
 !! result
-<p>Æ-Hello
+<p><a href="/index.php?title=%C5%9Eablon:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Şablon:Ucfırst:blah (sayfa mevcut değil)">Şablon:Ucfırst:blah</a>
 </p>
 !! end
 
 !! test
-Multibyte character in padright
+Bug31490 ucfırst (with a dotless i) with English language
+!! options
+language=en
 !! input
-{{padright:Hello-|7|Æ}}
+{{ucfırst:blah}}
 !! result
-<p>Hello-Æ
+<p><a href="/index.php?title=Template:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Template:Ucfırst:blah (page does not exist)">Template:Ucfırst:blah</a>
 </p>
 !! end
 
 !! test
-Formatted date
-!! config
-wgUseDynamicDates=1
+Bug 26375: TOC with italics
+!! options
+title=[[Main Page]]
 !! input
-[[2009-03-24]]
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24"><a href="/index.php?title=2009&amp;action=edit&amp;redlink=1" class="new" title="2009 (page does not exist)">2009</a>-<a href="/index.php?title=March_24&amp;action=edit&amp;redlink=1" class="new" title="March 24 (page does not exist)">03-24</a></span>
-</p>
-!!end
-
-!!test
-formatdate parser function
-!!input
-{{#formatdate:2009-03-24}}
+__TOC__
+== ''Lost'' episodes ==
 !! result
-<p><span class="mw-formatted-date" title="2009-03-24">2009-03-24</span>
-</p>
-!! end
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
 
-!!test
-formatdate parser function, with default format
-!!input
-{{#formatdate:2009-03-24|mdy}}
-!! result
-<p><span class="mw-formatted-date" title="2009-03-24">March 24, 2009</span>
-</p>
 !! end
 
 !! test
-Linked date with autoformatting disabled
-!! config
-wgUseDynamicDates=false
+Bug 26375: TOC with bold
+!! options
+title=[[Main Page]]
 !! input
-[[2009-03-24]]
+__TOC__
+== '''should be bold''' then normal text ==
 !! result
-<p><a href="/index.php?title=2009-03-24&amp;action=edit&amp;redlink=1" class="new" title="2009-03-24 (page does not exist)">2009-03-24</a>
-</p>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
+
 !! end
 
 !! test
-Spacing of numbers in formatted dates
+Bug 33845: Headings become cursive in TOC when they contain an image
+!! options
+title=[[Main Page]]
 !! input
-{{#formatdate:January 15}}
+__TOC__
+== Image [[Image:foobar.jpg]] ==
 !! result
-<p><span class="mw-formatted-date" title="01-15">January 15</span>
-</p>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
+
 !! end
 
 !! test
-Spacing of numbers in formatted dates (linked)
-!! config
-wgUseDynamicDates=true
+Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
+!! options
+title=[[Main Page]]
 !! input
-[[January 15]]
+__TOC__
+== <blockquote>Quote</blockquote> ==
 !! result
-<p><span class="mw-formatted-date" title="01-15"><a href="/index.php?title=January_15&amp;action=edit&amp;redlink=1" class="new" title="January 15 (page does not exist)">January 15</a></span>
-</p>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
+
 !! 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
+Unclosed tags in TOC
 !! options
-language=nl title=[[MediaWiki:Common.css]]
+title=[[Main Page]]
 !! input
-{{#formatdate:2009-03-24|dmy}}
+__TOC__
+== Proof: 2 < 3 ==
+<small>Hanc marginis exiguitas non caperet.</small>
+QED
 !! result
-<p><span class="mw-formatted-date" title="2009-03-24">24 March 2009</span>
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 &lt; 3 </span></h2>
+<p><small>Hanc marginis exiguitas non caperet.</small>
+QED
 </p>
 !! end
 
-#
-#
-#
-
-#
-# Edit comments
-#
-
 !! test
-Edit comment with link
-!! options
-comment
+Multiple tags in TOC
 !! input
-I like the [[Main Page]] a lot
+__TOC__
+== <i>Foo</i> <b>Bar</b> ==
+
+== <i>Foo</i> <blockquote>Bar</blockquote> ==
 !! result
-I like the <a href="/wiki/Main_Page" title="Main Page">Main Page</a> a lot
-!!end
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Foo_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
+
+!! end
 
 !! test
-Edit comment with link and link text
-!! options
-comment
+Tags with parameters in TOC
 !! input
-I like the [[Main Page|best pages]] a lot
+__TOC__
+== <sup class="in-h2">Hello</sup> ==
+
+== <sup class="a > b">Evilbye</sup> ==
 !! result
-I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
-!!end
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b"&gt;Evilbye</sup> </span></h2>
+
+!! end
 
 !! test
-Edit comment with link and link text with suffix
-!! options
-comment
+span tags with directionality in TOC
 !! input
-I like the [[Main Page|best page]]s a lot
+__TOC__
+== <span dir="ltr">C++</span> ==
+
+== <span dir="rtl">זבנג!</span> ==
+
+== <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> ==
+
+== <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> ==
+
+== <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> ==
 !! result
-I like the <a href="/wiki/Main_Page" title="Main Page">best pages</a> a lot
-!!end
+<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
+<ul>
+<li class="toclevel-1 tocsection-1"><a href="#C.2B.2B"><span class="tocnumber">1</span> <span class="toctext"><span dir="ltr">C++</span></span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#.D7.96.D7.91.D7.A0.D7.92.21"><span class="tocnumber">2</span> <span class="toctext"><span dir="rtl">זבנג!</span></span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">3</span> <span class="toctext"><span>The attributes on these span tags must be deleted from the TOC</span></span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">4</span> <span class="toctext"><span>All attributes on these span tags must be deleted from the TOC</span></span></a></li>
+<li class="toclevel-1 tocsection-5"><a href="#Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"><span class="tocnumber">5</span> <span class="toctext"><span dir="ltr">Attributes after dir on these span tags must be deleted from the TOC</span></span></a></li>
+</ul>
+</td></tr></table>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: C++">edit</a>]</span> <span class="mw-headline" id="C.2B.2B"> <span dir="ltr">C++</span> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: זבנג!">edit</a>]</span> <span class="mw-headline" id=".D7.96.D7.91.D7.A0.D7.92.21"> <span dir="rtl">זבנג!</span> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=3" title="Edit section: The attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="The_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic">The attributes on these span tags must be deleted from the TOC</span> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=4" title="Edit section: All attributes on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="All_attributes_on_these_span_tags_must_be_deleted_from_the_TOC"> <span style="font-style: italic" dir="ltr">All attributes on these span tags must be deleted from the TOC</span> </span></h2>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=5" title="Edit section: Attributes after dir on these span tags must be deleted from the TOC">edit</a>]</span> <span class="mw-headline" id="Attributes_after_dir_on_these_span_tags_must_be_deleted_from_the_TOC"> <span dir="ltr" style="font-style: italic">Attributes after dir on these span tags must be deleted from the TOC</span> </span></h2>
+
+!! end
+
+!! article
+MediaWiki:Bug32057
+!! text
+== {{int:headline_sample}} ==
+!! endarticle
 
 !! test
-Edit comment with section link (non-local, eg in history list)
+Bug 32057: Title needed when expanding <h> nodes.
 !! options
-comment title=[[Main Page]]
+title=[[Main Page]]
 !! input
-/* External links */ removed bogus entries
+{{int:Bug32057}}
 !! result
-<a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
+<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
+
+!! end
 
 !! test
-Edit comment with section link and text before it (non-local, eg in history list)
-!! options
-comment title=[[Main Page]]
+Strip marker in urlencode
 !! input
-pre-comment text /* External links */ removed bogus entries
+{{urlencode:x<nowiki/>y}}
+{{urlencode:x<nowiki/>y|wiki}}
+{{urlencode:x<nowiki/>y|path}}
 !! result
-pre-comment text - <a href="/wiki/Main_Page#External_links" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
+<p>xy
+xy
+xy
+</p>
+!! end
 
 !! test
-Edit comment with section link (local, eg in diff view)
-!! options
-comment local title=[[Main Page]]
+Strip marker in lc
 !! input
-/* External links */ removed bogus entries
+{{lc:x<nowiki/>y}}
 !! result
-<a href="#External_links">→</a>‎<span dir="auto"><span class="autocomment">External links: </span> removed bogus entries</span>
-!!end
+<p>xy
+</p>
+!! end
 
 !! test
-Edit comment with subpage link (bug 14080)
-!! options
-comment
-subpage
-title=[[Subpage test]]
+Strip marker in uc
 !! input
-Poked at a [[/subpage]] here...
+{{uc:x<nowiki/>y}}
 !! result
-Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">/subpage</a> here...
-!!end
+<p>XY
+</p>
+!! end
 
 !! test
-Edit comment with subpage link and link text (bug 14080)
-!! options
-comment
-subpage
-title=[[Subpage test]]
+Strip marker in formatNum
 !! input
-Poked at a [[/subpage|neat little page]] here...
+{{formatnum:1<nowiki/>2}}
+{{formatnum:1<nowiki/>2|R}}
 !! result
-Poked at a <a href="/wiki/Subpage_test/subpage" title="Subpage test/subpage">neat little page</a> here...
-!!end
+<p>12
+12
+</p>
+!! end
 
 !! test
-Edit comment with bogus subpage link in non-subpage NS (bug 14080)
+Strip marker in grammar
 !! options
-comment
-title=[[Subpage test]]
+language=fi
 !! input
-Poked at a [[/subpage]] here...
+{{grammar:elative|foo<nowiki/>bar}}
 !! result
-Poked at a <a href="/index.php?title=/subpage&amp;action=edit&amp;redlink=1" class="new" title="/subpage (page does not exist)">/subpage</a> here...
-!!end
+<p>foobarista
+</p>
+!! end
 
 !! test
-Edit comment with bare anchor link (local, as on diff)
-!! options
-comment
-local
-title=[[Main Page]]
-!!input
-[[#section]]
+Strip marker in padleft
+!! input
+{{padleft:|2|x<nowiki/>y}}
 !! result
-<a href="#section">#section</a>
+<p>xy
+</p>
 !! end
 
 !! test
-Edit comment with bare anchor link (non-local, as on history)
-!! options
-comment
-title=[[Main Page]]
-!!input
-[[#section]]
+Strip marker in padright
+!! input
+{{padright:|2|x<nowiki/>y}}
 !! result
-<a href="/wiki/Main_Page#section" title="Main Page">#section</a>
+<p>xy
+</p>
 !! end
 
 !! test
-Anchor starting with underscore
-!!input
-[[#_ref|One]]
+Strip marker in anchorencode
+!! input
+{{anchorencode:x<nowiki/>y}}
 !! result
-<p><a href="#_ref">One</a>
+<p>xy
 </p>
 !! end
 
 !! test
-Id starting with underscore
-!!input
-<div id="_ref"></div>
+nowiki inside link inside heading (bug 18295)
+!! input
+==[[foo|x<nowiki>y</nowiki>z]]==
 !! result
-<div id="_ref"></div>
+<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a>]</span> <span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span></h2>
 
 !! end
 
 !! test
-Space normalisation on autocomment (bug 22784)
-!! options
-comment
-title=[[Main Page]]
-!!input
-/* __hello__world__ */
+new support for bdi element (bug 31817)
+!! input
+<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
 !! result
-<a href="/wiki/Main_Page#hello_world" title="Main Page">→</a>‎<span dir="auto"><span class="autocomment">__hello__world__</span></span>
-!! end
+<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
+
+!!end
 
 !! test
-percent-encoding and + signs in comments (Bug 26410)
-!! options
-comment
-!!input
-[[ABC%33D% ++]] [[ABC%33D% ++|+%20]]
+Ignore pipe between table row attributes
+!! input
+{|
+| quux
+|- id=foo | style='color: red'
+| bar
+|}
 !! result
-<a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">ABC3D% ++</a> <a href="/index.php?title=ABC3D%25_%2B%2B&amp;action=edit&amp;redlink=1" class="new" title="ABC3D% ++ (page does not exist)">+%20</a>
+<table>
+<tr>
+<td> quux
+</td></tr>
+<tr id="foo" style="color: red">
+<td> bar
+</td></tr></table>
+
 !! end
 
-!! test
-Bad images - basic functionality
-!! options
-disabled
+!!test
+Gallery override link with WikiLink (bug 34852)
 !! input
-[[File:Bad.jpg]]
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
+</gallery>
 !! result
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
+</p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
-!! test
-Bad images - bug 16039: text after bad image disappears
-!! options
-disabled
+!!test
+Gallery override link with absolute external link (bug 34852)
 !! input
-Foo bar
-[[File:Bad.jpg]]
-Bar foo
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
+</gallery>
 !! result
-<p>Foo bar
-</p><p>Bar foo
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
 </p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
-!! test
-Verify that displaytitle works (bug #22501) no displaytitle
-!! options
-showtitle
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=false
+!!test
+Gallery override link with malicious javascript (bug 34852)
 !! input
-this is not the the title
+<gallery>
+File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
+</gallery>
 !! result
-Parser test
-<p>this is not the the title
+<ul class="gallery">
+               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
+                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/thumb/3/3a/Foobar.jpg/120px-Foobar.jpg" width="120" height="14" /></a></div></div>
+                       <div class="gallerytext">
+<p>caption
 </p>
+                       </div>
+               </div></li>
+</ul>
+
 !! end
 
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=false
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=false
+!!test
+Language parser function
 !! input
-this is not the the title
-{{DISPLAYTITLE:whatever}}
+{{#language:ar}}
 !! result
-whatever
-<p>this is not the the title
+<p>العربية
 </p>
 !! end
 
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true mismatch
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=true
+!!test
+Padleft and padright as substr
 !! input
-this is not the the title
-{{DISPLAYTITLE:whatever}}
+{{padleft:|3|abcde}}
+{{padright:|3|abcde}}
 !! result
-Screen
-<p>this is not the the title
+<p>abc
+abc
 </p>
 !! end
 
-!! test
-Verify that displaytitle works (bug #22501) RestrictDisplayTitle=true matching
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=true
-wgRestrictDisplayTitle=true
+!!test
+Bug 34939 - Case insensitive link parsing ([HttP://])
 !! input
-this is not the the title
-{{DISPLAYTITLE:screen}}
+[HttP://MediaWiki.Org/]
 !! result
-screen
-<p>this is not the the title
+<p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
 </p>
 !! end
 
-!! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=false
+!!test
+Bug 34939 - Case insensitive link parsing ([HttP:// title])
 !! input
-this is not the the title
-{{DISPLAYTITLE:screen}}
+[HttP://MediaWiki.Org/ MediaWiki]
 !! result
-Screen
-<p>this is not the the title
-<a href="/index.php?title=Template:DISPLAYTITLE:screen&amp;action=edit&amp;redlink=1" class="new" title="Template:DISPLAYTITLE:screen (page does not exist)">Template:DISPLAYTITLE:screen</a>
+<p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
 </p>
 !! end
 
-!! test
-Verify that displaytitle works (bug #22501) AllowDisplayTitle=false no DISPLAYTITLE
-!! options
-showtitle
-title=[[Screen]]
-!! config
-wgAllowDisplayTitle=false
+!!test
+Bug 34939 - Case insensitive link parsing (HttP://)
 !! input
-this is not the the title
+HttP://MediaWiki.Org/
 !! result
-Screen
-<p>this is not the the title
+<p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
 </p>
 !! end
+
+###
+### Parsoids-specific tests
+### Parsoid-PHP parser incompatibilities
+###
+!!test
+1. SOL-sensitive wikitext tokens as template-args
+!!options
+disabled
+!!input
+{{echo|*a}}
+{{echo|#a}}
+{{echo|:a}}
+!!result
+<p>*a
+#a
+:a
+</p>
+!!end
+
+#### The following section of tests are primarily to test
+#### wikitext escaping capabilities of Parsoid.
+#### A lot of the tests are disabled for the PHP parser either
+#### because of minor newline diffs or other reasons.
+#### As Parsoid serializer can handle newlines and other HTML
+#### more robustly, some of these tests might get reenabled
+#### for the PHP parser.
+
+#### --------------- Headings ---------------
+#### 0. Unnested
+#### 1. Nested inside html <h1>=foo=</h1>
+#### 2. Outside heading nest on a single line <h1>foo</h1>*bar
+#### 3. Nested inside html with wikitext split by html tags
+#### 4. No escape needed
+#### 5. Empty headings <h1></h1>
+#### 6. Heading chars in SOL context
+#### ----------------------------------------
+!! test
+Headings: 0. Unnested
+!! input
+<nowiki>=foo=</nowiki>
+
+<nowiki>=foo</nowiki>''a''=
+!! result
+<p>=foo=
+</p><p>=foo<i>a</i>=
+</p>
+!!end
+
 !! test
-preload: check <noinclude> and <includeonly>
+Headings: 1. Nested inside html
 !! options
-preload
+disabled
 !! input
-Hello <noinclude>cruel</noinclude><includeonly>kind</includeonly> world.
-!! result
-Hello kind world.
-!! end
+=<nowiki>=foo=</nowiki>=
+==<nowiki>=foo=</nowiki>==
+===<nowiki>=foo=</nowiki>===
+====<nowiki>=foo=</nowiki>====
+=====<nowiki>=foo=</nowiki>=====
+======<nowiki>=foo=</nowiki>======
+!! result
+<h1>=foo=</h1>
+<h2>=foo=</h2>
+<h3>=foo=</h3>
+<h4>=foo=</h4>
+<h5>=foo=</h5>
+<h6>=foo=</h6>
+!!end
+
 !! test
-preload: check <onlyinclude>
+Headings: 2. Outside heading nest on a single line <h1>foo</h1>*bar
 !! options
-preload
+disabled
 !! input
-Goodbye <onlyinclude>Hello world</onlyinclude>
+=foo=
+<nowiki>*bar</nowiki>
+=foo=
+=bar
+=foo=
+<nowiki>=bar=</nowiki>
 !! result
-Hello world
-!! end
+<h1>foo</h1>*bar
+<h1>foo</h1>=bar
+<h1>foo</h1>=bar=
+!!end
 
 !! test
-preload: can pass tags through if we want to
+Headings: 3. Nested inside html with wikitext split by html tags
 !! options
-preload
+disabled
 !! input
-<includeonly><</includeonly>includeonly>Hello world<includeonly><</includeonly>/includeonly>
+=<nowiki>=</nowiki>'''bold'''foo==
 !! result
-<includeonly>Hello world</includeonly>
-!! end
+<h1>=<b>bold</b>foo=</h1>
+!!end
 
 !! test
-preload: check that it doesn't try to do tricks
+Headings: 4. No escaping needed (testing just h1 and h2)
 !! options
-preload
+disabled
 !! input
-* <!-- Hello --> ''{{world}}'' {{<includeonly>subst:</includeonly>How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
-!! result
-* <!-- Hello --> ''{{world}}'' {{subst:How are you}}{{ {{{|safesubst:}}} #if:1|2|3}}
-!! end
+==foo=
+=foo==
+===foo==
+==foo===
+=''=''foo==
+===
+!! result
+<h1>=foo</h1>
+<h1>foo=</h1>
+<h2>=foo</h2>
+<h2>foo=</h2>
+<h1><i>=</i>foo=</h1>
+<h1>=</h1>
+!!end
 
 !! test
-Play a bit with r67090 and bug 3158 
+Headings: 5. Empty headings
 !! options
 disabled
 !! input
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50%&nbsp;!important">&nbsp;</div>
-<div style="width:50%&#160;!important">&nbsp;</div>
-<div style="border : solid;">&nbsp;</div>
-!! result
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50% !important">&nbsp;</div>
-<div style="width:50% !important">&nbsp;</div>
-<div style="border&#160;: solid;">&nbsp;</div>
-
-!! end
+=<nowiki></nowiki>=
+==<nowiki></nowiki>==
+===<nowiki></nowiki>===
+====<nowiki></nowiki>====
+=====<nowiki></nowiki>=====
+======<nowiki></nowiki>======
+!! result
+<h1></h1>
+<h2></h2>
+<h3></h3>
+<h4></h4>
+<h5></h5>
+<h6></h6>
+!!end
 
 !! test
-HTML5 data attributes
+Headings: 6. Heading chars in SOL context
+!! options
+disabled
 !! input
-<span data-foo="bar">Baz</span>
-<p data-abc-def_hij="">Quuz</p>
+<!--cmt--><nowiki>=h1=</nowiki>
 !! result
-<p><span data-foo="bar">Baz</span>
+<p><!--cmt-->=h1=
 </p>
-<p data-abc-def_hij="">Quuz</p>
+!!end
 
-!! end
+#### --------------- Lists ---------------
+#### 0. Outside nests (*foo, etc.)
+#### 1. Nested inside html <ul><li>*foo</li></ul>
+#### 2. Inside definition lists
+#### 3. Only bullets at start should be escaped
+#### 4. No escapes needed
+#### 5. No unnecessary escapes
+#### 6. Escape bullets in SOL position
+#### 7. Escape bullets in a multi-line context
+#### ----------------------------------------
 
 !! test
-percent-encoding and + signs in internal links (Bug 26410)
+Lists: 0. Outside nests
 !! input
-[[User:+%]] [[Page+title%]]
-[[%+]] [[%+|%20]] [[%+ ]] [[%+r]]
-[[%]] [[+]] [[image:%+abc%39|foo|[[bar]]]]
-[[%33%45]] [[%33%45+]]
+<nowiki>*foo</nowiki>
+
+<nowiki>#foo</nowiki>
 !! result
-<p><a href="/index.php?title=User:%2B%25&amp;action=edit&amp;redlink=1" class="new" title="User:+% (page does not exist)">User:+%</a> <a href="/index.php?title=Page%2Btitle%25&amp;action=edit&amp;redlink=1" class="new" title="Page+title% (page does not exist)">Page+title%</a>
-<a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%20</a> <a href="/index.php?title=%25%2B&amp;action=edit&amp;redlink=1" class="new" title="%+ (page does not exist)">%+ </a> <a href="/index.php?title=%25%2Br&amp;action=edit&amp;redlink=1" class="new" title="%+r (page does not exist)">%+r</a>
-<a href="/index.php?title=%25&amp;action=edit&amp;redlink=1" class="new" title="% (page does not exist)">%</a> <a href="/index.php?title=%2B&amp;action=edit&amp;redlink=1" class="new" title="+ (page does not exist)">+</a> <a href="/index.php?title=Special:Upload&amp;wpDestFile=%25%2Babc9" class="new" title="File:%+abc9">bar</a>
-<a href="/index.php?title=3E&amp;action=edit&amp;redlink=1" class="new" title="3E (page does not exist)">3E</a> <a href="/index.php?title=3E%2B&amp;action=edit&amp;redlink=1" class="new" title="3E+ (page does not exist)">3E+</a>
+<p>*foo
+</p><p>#foo
 </p>
-!! end
+!!end
 
 !! test
-Special characters in embedded file links (bug 27679)
+Lists: 1. Nested inside html
 !! input
-[[File:Contains & ampersand.jpg]]
-[[File:Does not exist.jpg|Title with & ampersand]]
+*<nowiki>*foo</nowiki>
+
+*<nowiki>#foo</nowiki>
+
+*<nowiki>:foo</nowiki>
+
+*<nowiki>;foo</nowiki>
+
+#<nowiki>*foo</nowiki>
+
+#<nowiki>#foo</nowiki>
+
+#<nowiki>:foo</nowiki>
+
+#<nowiki>;foo</nowiki>
 !! result
-<p><a href="/index.php?title=Special:Upload&amp;wpDestFile=Contains_%26_ampersand.jpg" class="new" title="File:Contains &amp; ampersand.jpg">File:Contains &amp; ampersand.jpg</a>
-<a href="/index.php?title=Special:Upload&amp;wpDestFile=Does_not_exist.jpg" class="new" title="File:Does not exist.jpg">Title with &amp; ampersand</a>
-</p>
-!! end
+<ul><li>*foo
+</li></ul>
+<ul><li>#foo
+</li></ul>
+<ul><li>:foo
+</li></ul>
+<ul><li>;foo
+</li></ul>
+<ol><li>*foo
+</li></ol>
+<ol><li>#foo
+</li></ol>
+<ol><li>:foo
+</li></ol>
+<ol><li>;foo
+</li></ol>
 
+!!end
 
 !! test
-Confirm that 'apos' named character reference doesn't make it to output (not legal in HTML 4)
+Lists: 2. Inside definition lists
 !! input
-Text&apos;s been normalized?
+;<nowiki>;foo</nowiki>
+
+;<nowiki>:foo</nowiki>
+
+;<nowiki>:foo</nowiki>
+:bar
+
+:<nowiki>:foo</nowiki>
 !! result
-<p>Text&#39;s been normalized?
-</p>
-!! end
+<dl><dt>;foo
+</dt></dl>
+<dl><dt>:foo
+</dt></dl>
+<dl><dt>:foo
+</dt><dd>bar
+</dd></dl>
+<dl><dd>:foo
+</dd></dl>
+
+!!end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate free external links
+Lists: 3. Only bullets at start of text should be escaped
 !! input
-http://www.example.org/ <-- U+3000 (vim: ^Vu3000)
+*<nowiki>*foo*bar</nowiki>
+
+*<nowiki>*foo</nowiki>''it''*bar
 !! result
-<p><a rel="nofollow" class="external free" href="http://www.example.org/">http://www.example.org/</a> &lt;-- U+3000 (vim: ^Vu3000)
-</p>
-!! end
+<ul><li>*foo*bar
+</li></ul>
+<ul><li>*foo<i>it</i>*bar
+</li></ul>
+
+!!end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate bracketed external links
+Lists: 4. No escapes needed
+!! options
+disabled
 !! input
-[http://www.example.org/ ideograms]
+*foo*bar
+
+*''foo''*bar
+
+*[[Foo]]: bar
 !! result
-<p><a rel="nofollow" class="external text" href="http://www.example.org/">ideograms</a>
-</p>
-!! end
+<ul><li>foo*bar
+</li></ul>
+<ul><li><i>foo</i>*bar
+</li></ul>
+<ul><li><a href="Foo" rel="mw:WikiLink">Foo</a>: bar
+</li></ul>
+!!end
 
 !! test
-Bug 19052 U+3000 IDEOGRAPHIC SPACE should terminate external images links
+Lists: 5. No unnecessary escapes
 !! input
-http://www.example.org/pic.png <-- U+3000 (vim: ^Vu3000)
-!! result
-<p><img src="http://www.example.org/pic.png" alt="pic.png" /> &lt;-- U+3000 (vim: ^Vu3000)
-</p>
-!! end
+* bar <span><nowiki>[[foo]]</nowiki></span>
 
-!! article
-Mediawiki:loop1
-!! text
-{{Identical|A}}
-!! endarticle
+*=bar <span><nowiki>[[foo]]</nowiki></span>
 
-!! article
-Mediawiki:loop2
-!! text
-{{Identical|B}}
-!! endarticle
+*[[bar <span><nowiki>[[foo]]</nowiki></span>
 
-!! article
-Template:Identical
-!! text
-{{int:loop1}}
-{{int:loop2}}
-!! endarticle
+*<nowiki>]]bar </nowiki><span><nowiki>[[foo]]</nowiki></span>
 
-!! test
-Bug 31098 Template which includes system messages which includes the template
-!! input
-{{Identical}}
+*=bar <span>foo]]</span>=
 !! result
-<p><span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
-<span class="error">Template loop detected: <a href="/wiki/Template:Identical" title="Template:Identical">Template:Identical</a></span>
-</p>
-!! end
+<ul><li> bar <span>[[foo]]</span>
+</li></ul>
+<ul><li>=bar <span>[[foo]]</span>
+</li></ul>
+<ul><li>[[bar <span>[[foo]]</span>
+</li></ul>
+<ul><li>]]bar <span>[[foo]]</span>
+</li></ul>
+<ul><li>=bar <span>foo]]</span>=
+</li></ul>
+
+!!end
 
 !! test
-Deprecated presentational attributes are converted to css
+Lists: 6. Escape bullets in SOL position
+!! options
+disabled
 !! input
-{|
-| valign=top align=left width=100 height=25% | Asdf
-|}
-<ul type="disc"></ul>
+<!--cmt--><nowiki>*foo</nowiki>
 !! result
-<table>
-<tr>
-<td style="text-align: left; height: 25%; vertical-align: top; width: 100px;"> Asdf
-</td></tr></table>
-<ul style="list-style-type: disc;"></ul>
-
-!! end
+<p><!--cmt-->*foo
+</p>
+!!end
 
 !! test
-Bug31490 Turkish: ucfirst 'blah'
-!! options
-language=tr
+Lists: 7. Escape bullets in a multi-line context
 !! input
-{{ucfirst:blah}}
+<nowiki>a
+*b</nowiki>
 !! result
-<p>Blah
+<p>a
+*b
 </p>
-!! end
+!!end
+
+#### --------------- HRs ---------------
+#### 1. Single line
+#### -----------------------------------
 
 !! test
-Bug31490 Turkish: ucfirst 'ix'
+HRs: 1. Single line
 !! options
-language=tr
+disabled
 !! input
-{{ucfirst:ix}}
+----
+<nowiki>----</nowiki>
+----
+<nowiki>=foo=</nowiki>
+----
+<nowiki>*foo</nowiki>
 !! result
-<p>İx
-</p>
+<hr/>----
+<hr/>=foo=
+<hr/>*foo
 !! end
 
+#### --------------- Tables ---------------
+#### 1a. Simple example
+#### 1b. No escaping needed (!foo)
+#### 1c. No escaping needed (|foo)
+#### 1d. No escaping needed (|}foo)
+####
+#### 2a. Nested in td (<td>foo|bar</td>)
+#### 2b. Nested in td (<td>foo||bar</td>)
+#### 2c. Nested in td -- no escaping needed(<td>foo!!bar</td>)
+####
+#### 3a. Nested in th (<th>foo!bar</th>)
+#### 3b. Nested in th (<th>foo!!bar</th>)
+#### 3c. Nested in th -- no escaping needed(<th>foo||bar</th>)
+####
+#### 4a. Escape -
+#### 4b. Escape +
+#### 4c. No escaping needed
+#### --------------------------------------
+
 !! test
-Bug31490 Turkish: lcfirst 'BLAH'
-!! options
-language=tr
+Tables: 1a. Simple example
 !! input
-{{lcfirst:BLAH}}
+<nowiki>{|
+|}</nowiki>
 !! result
-<p>bLAH
+<p>{|
+|}
 </p>
 !! end
 
 !! test
-Bug31490 Turkish: ucfırst (with a dotless i)
-!! options
-language=tr
+Tables: 1b. No escaping needed
 !! input
-{{ucfırst:blah}}
+!foo
 !! result
-<p><a href="/index.php?title=%C5%9Eablon:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Şablon:Ucfırst:blah (sayfa mevcut değil)">Şablon:Ucfırst:blah</a>
+<p>!foo
 </p>
 !! end
 
 !! test
-Bug31490 ucfırst (with a dotless i) with English language
-!! options
-language=en
+Tables: 1c. No escaping needed
 !! input
-{{ucfırst:blah}}
+|foo
 !! result
-<p><a href="/index.php?title=Template:Ucf%C4%B1rst:blah&amp;action=edit&amp;redlink=1" class="new" title="Template:Ucfırst:blah (page does not exist)">Template:Ucfırst:blah</a>
+<p>|foo
 </p>
 !! end
 
 !! test
-Bug 26375: TOC with italics
-!! options
-title=[[Main Page]]
+Tables: 1d. No escaping needed
 !! input
-__TOC__
-== ''Lost'' episodes ==
+|}foo
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Lost_episodes"><span class="tocnumber">1</span> <span class="toctext"><i>Lost</i> episodes</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Lost episodes">edit</a>]</span> <span class="mw-headline" id="Lost_episodes"> <i>Lost</i> episodes </span></h2>
-
+<p>|}foo
+</p>
 !! end
 
 !! test
-Bug 26375: TOC with bold 
+Tables: 2a. Nested in td
 !! options
-title=[[Main Page]]
+disabled
 !! input
-__TOC__
-== '''should be bold''' then normal text ==
+{|
+|<nowiki>foo|bar</nowiki>
+|}
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#should_be_bold_then_normal_text"><span class="tocnumber">1</span> <span class="toctext"><b>should be bold</b> then normal text</span></a></li>
-</ul>
+<table>
+<tr><td>foo|bar
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: should be bold then normal text">edit</a>]</span> <span class="mw-headline" id="should_be_bold_then_normal_text"> <b>should be bold</b> then normal text </span></h2>
 
 !! end
 
 !! test
-Bug 33845: Headings become cursive in TOC when they contain an image
+Tables: 2b. Nested in td
 !! options
-title=[[Main Page]]
+disabled
 !! input
-__TOC__
-== Image [[Image:foobar.jpg]] ==
+{|
+|<nowiki>foo||bar</nowiki>
+|''it''<nowiki>foo||bar</nowiki>
+|}
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Image"><span class="tocnumber">1</span> <span class="toctext">Image</span></a></li>
-</ul>
+<table>
+<tr><td>foo||bar
+</td><td><i>it</i>foo||bar
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Image">edit</a>]</span> <span class="mw-headline" id="Image"> Image <a href="/wiki/File:Foobar.jpg" class="image"><img alt="Foobar.jpg" src="http://example.com/images/3/3a/Foobar.jpg" width="1941" height="220" /></a> </span></h2>
 
 !! end
 
 !! test
-Bug 33845 (2): Headings become bold in TOC when they contain a blockquote
+Tables: 2c. Nested in td -- no escaping needed
 !! options
-title=[[Main Page]]
+disabled
 !! input
-__TOC__
-== <blockquote>Quote</blockquote> ==
+{|
+|foo!!bar
+|}
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Quote"><span class="tocnumber">1</span> <span class="toctext">Quote</span></a></li>
-</ul>
+<table>
+<tr><td>foo!!bar
 </td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Quote">edit</a>]</span> <span class="mw-headline" id="Quote"> <blockquote>Quote</blockquote> </span></h2>
 
 !! end
 
 !! test
-Unclosed tags in TOC
+Tables: 3a. Nested in th
 !! options
-title=[[Main Page]]
+disabled
 !! input
-__TOC__
-== Proof: 2 < 3 ==
-<small>Hanc marginis exiguitas non caperet.</small>
-QED
+{|
+!foo!bar
+|}
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Proof:_2_.3C_3"><span class="tocnumber">1</span> <span class="toctext">Proof: 2 &lt; 3</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Proof: 2 &lt; 3">edit</a>]</span> <span class="mw-headline" id="Proof:_2_.3C_3"> Proof: 2 &lt; 3 </span></h2>
-<p><small>Hanc marginis exiguitas non caperet.</small>
-QED
-</p>
+<table>
+<tr><th>foo!bar
+</th></tr></table>
+
 !! end
 
 !! test
-Multiple tags in TOC
+Tables: 3b. Nested in th
+!! options
+disabled
 !! input
-__TOC__
-== <i>Foo</i> <b>Bar</b> ==
-
-== <i>Foo</i> <blockquote>Bar</blockquote> ==
+{|
+!<nowiki>foo!!bar</nowiki>
+|}
 !! 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_Bar"><span class="tocnumber">1</span> <span class="toctext"><i>Foo</i> <b>Bar</b></span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#Foo_Bar_2"><span class="tocnumber">2</span> <span class="toctext"><i>Foo</i> Bar</span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar"> <i>Foo</i> <b>Bar</b> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: Foo Bar">edit</a>]</span> <span class="mw-headline" id="Foo_Bar_2"> <i>Foo</i> <blockquote>Bar</blockquote> </span></h2>
+<table>
+<tr><th>foo!!bar
+</th></tr></table>
 
 !! end
 
 !! test
-Tags with parameters in TOC
+Tables: 3c. Nested in th -- no escaping needed
+!! options
+disabled
 !! input
-__TOC__
-== <sup class="in-h2">Hello</sup> ==
-
-== <sup class="a > b">Evilbye</sup> ==
+{|
+!foo||bar
+|}
 !! result
-<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
-<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Hello"><span class="tocnumber">1</span> <span class="toctext"><sup>Hello</sup></span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#b.22.3EEvilbye"><span class="tocnumber">2</span> <span class="toctext"><sup> b"&gt;Evilbye</sup></span></a></li>
-</ul>
-</td></tr></table>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: Hello">edit</a>]</span> <span class="mw-headline" id="Hello"> <sup class="in-h2">Hello</sup> </span></h2>
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=2" title="Edit section: b&quot;>Evilbye">edit</a>]</span> <span class="mw-headline" id="b.22.3EEvilbye"> <sup> b"&gt;Evilbye</sup> </span></h2>
+<table>
+<tr><th>foo||bar
+</th></tr></table>
 
 !! end
 
-!! article
-MediaWiki:Bug32057
-!! text
-== {{int:headline_sample}} ==
-!! endarticle
-
 !! test
-Bug 32057: Title needed when expanding <h> nodes.
+Tables: 4a. Escape -
 !! options
-title=[[Main Page]]
+disabled
 !! input
-{{int:Bug32057}}
+{|
+|-
+!-bar
+|-
+|<nowiki>-bar</nowiki>
+|}
 !! result
-<h2><span class="editsection">[<a href="/index.php?title=Main_Page&amp;action=edit&amp;section=1" title="Edit section: Headline text">edit</a>]</span> <span class="mw-headline" id="Headline_text"> Headline text </span></h2>
-
+<table><tbody>
+<tr><th>-bar</th></tr>
+<tr><td>-bar</td></tr>
+</tbody></table>
 !! end
 
 !! test
-Strip marker in urlencode
+Tables: 4b. Escape +
+!! options
+disabled
 !! input
-{{urlencode:x<nowiki/>y}}
-{{urlencode:x<nowiki/>y|wiki}}
-{{urlencode:x<nowiki/>y|path}}
+{|
+|-
+!+bar
+|-
+|<nowiki>+bar</nowiki>
+|}
 !! result
-<p>xy
-xy
-xy
-</p>
+<table><tbody>
+<tr><th>+bar</th></tr>
+<tr><td>+bar</td></tr>
+</tbody></table>
 !! end
 
 !! test
-Strip marker in lc
+Tables: 4c. No escaping needed
+!! options
+disabled
 !! input
-{{lc:x<nowiki/>y}}
+{|
+|-
+|foo-bar
+|foo+bar
+|-
+|''foo''-bar
+|''foo''+bar
+|}
 !! result
-<p>xy
-</p>
+<table><tbody>
+<tr><td>foo-bar</td><td>foo+bar</td></tr>
+<tr><td><i>foo</i>-bar</td><td><i>foo</i>+bar</td></tr>
+</tbody></table>
 !! end
 
+#### --------------- Links ---------------
+#### 1. Quote marks in link text
+#### 2. Wikilinks: Escapes needed
+#### 3. Wikilinks: No escapes needed
+#### 4. Extlinks: Escapes needed
+#### 5. Extlinks: No escapes needed
+#### --------------------------------------
 !! test
-Strip marker in uc
+Links 1. Quote marks in link text
+!! options
+disabled
 !! input
-{{uc:x<nowiki/>y}}
+[[Foo|<nowiki>Foo''boo''</nowiki>]]
 !! result
-<p>XY
-</p>
+<a rel="mw:WikiLink" href="Foo" data-parsoid="{&quot;tsr&quot;:[0,7],&quot;contentPos&quot;:[5,5],&quot;src&quot;:&quot;[[Foo]]&quot;,&quot;bsp&quot;:[0,7],&quot;stx&quot;:&quot;simple&quot;}">Foo''boo''</a>
 !! end
 
 !! test
-Strip marker in formatNum
+Links 2. WikiLinks: Escapes needed
+!! options
+disabled
 !! input
-{{formatnum:1<nowiki/>2}}
-{{formatnum:1<nowiki/>2|R}}
+[[Foo|<nowiki>[Foobar]</nowiki>]]
+[[Foo|<nowiki>Foobar]</nowiki>]]
+[[Foo|<nowiki>x [Foobar] x</nowiki>]]
+[[Foo|<nowiki>x [http://google.com g] x</nowiki>]]
+[[Foo|<nowiki>[[Bar]]</nowiki>]]
+[[Foo|<nowiki>x [[Bar]] x</nowiki>]]
+[[Foo|<nowiki>|Bar</nowiki>]]
 !! result
-<p>12
-12
-</p>
+<a href="Foo" rel="mw:WikiLink">[Foobar]</a>
+<a href="Foo" rel="mw:WikiLink">Foobar]</a>
+<a href="Foo" rel="mw:WikiLink">x [Foobar] x</a>
+<a href="Foo" rel="mw:WikiLink">x [http://google.com g] x</a>
+<a href="Foo" rel="mw:WikiLink">[[Bar]]</a>
+<a href="Foo" rel="mw:WikiLink">x [[Bar]] x</a>
+<a href="Foo" rel="mw:WikiLink">|Bar</a>
 !! end
 
 !! test
-Strip marker in grammar
+Links 3. WikiLinks: No escapes needed
 !! options
-language=fi
+disabled
 !! input
-{{grammar:elative|foo<nowiki/>bar}}
+[[Foo|[Foobar]]
+[[Foo|foo|bar]]
 !! result
-<p>foobarista
-</p>
+<a href="Foo" rel="mw:WikiLink">[Foobar</a>
+<a href="Foo" rel="mw:WikiLink">foo|bar</a>
 !! end
 
 !! test
-Strip marker in padleft
+Links 4. ExtLinks: Escapes needed
+!! options
+disabled
 !! input
-{{padleft:|2|x<nowiki/>y}}
+[http://google.com <nowiki>[google]</nowiki>]
+[http://google.com <nowiki>google]</nowiki>]
 !! result
-<p>xy
-</p>
+<a href="http://google.com" rel="mw:ExtLink">[google]</a>
+<a href="http://google.com" rel="mw:ExtLink">google]</a>
 !! end
 
 !! test
-Strip marker in padright
+Links 5. ExtLinks: No escapes needed
+!! options
+disabled
 !! input
-{{padright:|2|x<nowiki/>y}}
+[http://google.com [google]
 !! result
-<p>xy
-</p>
+<a href="http://google.com" rel="mw:ExtLink">[google</a>
 !! end
 
+#### --------------- Quotes ---------------
+#### 1. Quotes inside <b> and <i>
+#### 2. Link fragments separated by <i> and <b> tags
+#### 3. Link fragments inside <i> and <b>
+#### --------------------------------------
 !! test
-Strip marker in anchorencode
+1. Quotes inside <b> and <i>
 !! input
-{{anchorencode:x<nowiki/>y}}
+''<nowiki>'foo'</nowiki>''
+''<nowiki>''foo''</nowiki>''
+''<nowiki>'''foo'''</nowiki>''
+'''<nowiki>'foo'</nowiki>'''
+'''<nowiki>''foo''</nowiki>'''
+'''<nowiki>'''foo'''</nowiki>'''
+'''<nowiki>foo'</nowiki>''<nowiki>bar'</nowiki>''baz'''
 !! result
-<p>xy
+<p><i>'foo'</i>
+<i>''foo''</i>
+<i>'''foo'''</i>
+<b>'foo'</b>
+<b>''foo''</b>
+<b>'''foo'''</b>
+<b>foo'<i>bar'</i>baz</b>
 </p>
 !! end
 
 !! test
-nowiki inside link inside heading (bug 18295)
+2. Link fragments separated by <i> and <b> tags
 !! input
-==[[foo|x<nowiki>y</nowiki>z]]==
-!! result
-<h2><span class="editsection">[<a href="/index.php?title=Parser_test&amp;action=edit&amp;section=1" title="Edit section: xyz">edit</a>]</span> <span class="mw-headline" id="xyz"><a href="/index.php?title=Foo&amp;action=edit&amp;redlink=1" class="new" title="Foo (page does not exist)">xyz</a></span></h2>
+[[''foo''<nowiki>hello]]</nowiki>
 
+[['''foo'''<nowiki>hello]]</nowiki>
+!! result
+<p>[[<i>foo</i>hello]]
+</p><p>[[<b>foo</b>hello]]
+</p>
 !! end
 
 !! test
-new support for bdi element (bug 31817)
+2. Link fragments inside <i> and <b>
+(FIXME: Escaping one or both of [[ and ]] is also acceptable --
+ this is one of the shortcomings of this format)
 !! input
-<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
+''[[foo''<nowiki>]]</nowiki>
+
+'''[[foo'''<nowiki>]]</nowiki>
 !! result
-<p dir="rtl" lang="he">ולדימיר לנין (ברוסית: <bdi lang="ru">Владимир Ленин</bdi>, 24 באפריל 1870–22 בינואר 1924) הוא מנהיג פוליטי קומוניסטי רוסי.</p>
+<p><i>[[foo</i>]]
+</p><p><b>[[foo</b>]]
+</p>
+!! end
 
-!!end
+#### --------------- Paragraphs ---------------
+#### 1. No unnecessary escapes
+#### --------------------------------------
 
 !! test
-Ignore pipe between table row attributes
+1. No unnecessary escapes
 !! input
-{|
-| quux
-|- id=foo | style='color: red'
-| bar
-|}
-!! result
-<table>
-<tr>
-<td> quux
-</td></tr>
-<tr id="foo" style="color: red">
-<td> bar
-</td></tr></table>
+bar <span><nowiki>[[foo]]</nowiki></span>
 
-!! end
+=bar <span><nowiki>[[foo]]</nowiki></span>
 
-!!test
-Gallery override link with WikiLink (bug 34852)
-!! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=InterWikiLink
-</gallery>
+[[bar <span><nowiki>[[foo]]</nowiki></span>
+
+<nowiki>]]bar </nowiki><span><nowiki>[[foo]]</nowiki></span>
+
+<nowiki>=bar </nowiki><span>foo]]</span>=
 !! result
-<ul class="gallery">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/InterWikiLink"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-<p>caption
+<p>bar <span>[[foo]]</span>
+</p><p>=bar <span>[[foo]]</span>
+</p><p>[[bar <span>[[foo]]</span>
+</p><p>]]bar <span>[[foo]]</span>
+</p><p>=bar <span>foo]]</span>=
 </p>
-                       </div>
-               </div></li>
-</ul>
-
-!! end
+!!end
 
-!!test
-Gallery override link with absolute external link (bug 34852)
+#### --------------- PRE ------------------
+#### 1. Leading space in SOL context should be escaped
+#### --------------------------------------
+!! test
+1. Leading space in SOL context should be escaped
+!! options
+disabled
 !! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=http://www.example.org
-</gallery>
+<nowiki> foo</nowiki>
+<!--cmt--><nowiki> foo</nowiki>
 !! result
-<ul class="gallery">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="http://www.example.org"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-<p>caption
+<p> foo
+<!--cmt--> foo
 </p>
-                       </div>
-               </div></li>
-</ul>
-
 !! end
 
-!!test
-Gallery override link with malicious javascript (bug 34852)
+#### --------------- HTML tags ---------------
+#### 1. a tags
+#### 2. other tags
+#### 3. multi-line html tag
+#### --------------------------------------
+!! test
+1. a tags
+!! options
+disabled
 !! input
-<gallery>
-File:foobar.jpg|caption|alt=galleryalt|link=" onclick="alert('malicious javascript code!');
-</gallery>
+<a href="http://google.com">google</a>
 !! result
-<ul class="gallery">
-               <li class="gallerybox" style="width: 155px"><div style="width: 155px">
-                       <div class="thumb" style="width: 150px;"><div style="margin:68px auto;"><a href="/wiki/%22_onclick%3D%22alert(%27malicious_javascript_code!%27);"><img alt="galleryalt" src="http://example.com/images/3/3a/Foobar.jpg" width="120" height="14" /></a></div></div>
-                       <div class="gallerytext">
-<p>caption
-</p>
-                       </div>
-               </div></li>
-</ul>
-
+&lt;a href=&quot;http://google.com&quot;&gt;google&lt;/a&gt;
 !! end
 
-!!test
-Language parser function
+!! test
+2. other tags
 !! input
-{{#language:ar}}
+<nowiki><div>foo</div>
+<div style="color:red">foo</div></nowiki>
 !! result
-<p>العربية
+<p>&lt;div&gt;foo&lt;/div&gt;
+&lt;div style=&quot;color:red&quot;&gt;foo&lt;/div&gt;
 </p>
 !! end
 
-!!test
-Padleft and padright as substr
+!! test
+3. multi-line html tag
 !! input
-{{padleft:|3|abcde}}
-{{padright:|3|abcde}}
+<nowiki><div
+>foo</div
+></nowiki>
 !! result
-<p>abc
-abc
+<p>&lt;div
+&gt;foo&lt;/div
+&gt;
 </p>
 !! end
 
-!!test
-Bug 34939 - Case insensitive link parsing ([HttP://])
+#### --------------- Others ---------------
+!! test
+Escaping nowikis
 !! input
-[HttP://MediaWiki.Org/]
+&lt;nowiki&gt;foo&lt;/nowiki&gt;
 !! result
-<p><a rel="nofollow" class="external autonumber" href="HttP://MediaWiki.Org/">[1]</a>
+<p>&lt;nowiki&gt;foo&lt;/nowiki&gt;
 </p>
 !! end
 
-!!test
-Bug 34939 - Case insensitive link parsing ([HttP:// title])
+!! test
+Tag-like HTML structures are passed through as text
 !! input
-[HttP://MediaWiki.Org/ MediaWiki]
+<x y>
+
+<x.y>
+
+<x-y>
+
+1>2
+
+x<y
+
+a>b
+
+1<d e>f
 !! result
-<p><a rel="nofollow" class="external text" href="HttP://MediaWiki.Org/">MediaWiki</a>
+<p>&lt;x y&gt;
+</p><p>&lt;x.y&gt;
+</p><p>&lt;x-y&gt;
+</p><p>1&gt;2
+</p><p>x&lt;y
+</p><p>a&gt;b
+</p><p>1&lt;d e&gt;f
 </p>
 !! end
 
-!!test
-Bug 34939 - Case insensitive link parsing (HttP://)
+
+# This fails in the PHP parser (see bug 40670,
+# https://bugzilla.wikimedia.org/show_bug.cgi?id=40670), so disabled for it.
+!! test
+Tag names followed by punctuation should not be recognized as tags
+!! options
+disabled
 !! input
-HttP://MediaWiki.Org/
+<s.ome> text
 !! result
-<p><a rel="nofollow" class="external free" href="HttP://MediaWiki.Org/">HttP://MediaWiki.Org/</a>
+<p>&lt;s.ome&gt text
 </p>
 !! end
 
index 24d852c..f01665c 100644 (file)
@@ -34,14 +34,10 @@ class ParserTestParserHook {
        }
 
        static function dumpHook( $in, $argv ) {
-               ob_start();
-               var_dump(
-                       $in,
-                       $argv
-               );
-               $ret = ob_get_clean();
-
-               return "<pre>\n$ret</pre>";
+               return "<pre>\n" .
+                          var_export( $in, true ) . "\n" .
+                          var_export( $argv, true ) . "\n" .
+                          "</pre>";
        }
 
        static function staticTagHook( $in, $argv, $parser ) {
index 4df9a61..1ef6473 100644 (file)
@@ -28,6 +28,7 @@ $otions = array( 'quick', 'color', 'quiet', 'help', 'show-output', 'record', 'ru
 $optionsWithArgs = array( 'regex', 'filter', 'seed', 'setversion' );
 
 require_once( __DIR__ . '/../maintenance/commandLine.inc' );
+require_once( __DIR__ . '/TestsAutoLoader.php' );
 
 if ( isset( $options['help'] ) ) {
        echo <<<ENDS
diff --git a/tests/phpunit/AutoLoaderTest.php b/tests/phpunit/AutoLoaderTest.php
new file mode 100644 (file)
index 0000000..c8f3868
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+class AutoLoaderTest extends MediaWikiTestCase {
+
+       public function testAutoLoadConfig() {
+               $results = self::checkAutoLoadConf();
+
+               $this->assertEquals(
+                       $results['expected'],
+                       $results['actual']
+               );
+       }
+
+       protected static function checkAutoLoadConf() {
+               global $wgAutoloadLocalClasses, $wgAutoloadClasses, $IP;
+               static $supportsParsekit;
+               $supportsParsekit = function_exists( 'parsekit_compile_file' );
+
+               // wgAutoloadLocalClasses has precedence, just like in includes/AutoLoader.php
+               $expected = $wgAutoloadLocalClasses + $wgAutoloadClasses;
+               $actual = array();
+
+               $files = array_unique( $expected );
+
+               foreach ( $files as $file ) {
+                       // Only prefix $IP if it doesn't have it already.
+                       // Generally local classes don't have it, and those from extensions and test suites do.
+                       if ( substr( $file, 0, 1 ) != '/' && substr( $file, 1, 1 ) != ':' ) {
+                               $filePath = "$IP/$file";
+                       } else {
+                               $filePath = $file;
+                       }
+                       if ( $supportsParsekit ) {
+                               $parseInfo = parsekit_compile_file( "$filePath" );
+                               $classes = array_keys( $parseInfo['class_table'] );
+                       } else {
+                               $contents = file_get_contents( "$filePath" );
+                               $m = array();
+                               preg_match_all( '/\n\s*(?:final)?\s*(?:abstract)?\s*(?:class|interface)\s+([a-zA-Z0-9_]+)/', $contents, $m, PREG_PATTERN_ORDER );
+                               $classes = $m[1];
+                       }
+                       foreach ( $classes as $class ) {
+                               $actual[$class] = $file;
+                       }
+               }
+
+               return array(
+                       'expected' => $expected,
+                       'actual' => $actual,
+               );
+       }
+}
index 6dd8ea3..3034601 100644 (file)
@@ -4,39 +4,26 @@
  * Base class that store and restore the Language objects
  */
 abstract class MediaWikiLangTestCase extends MediaWikiTestCase {
-       private static $oldLang;
-       private static $oldContLang;
-
-       public function setUp() {
-               global $wgLanguageCode, $wgLang, $wgContLang;
 
+       protected function setUp() {
+               global $wgLanguageCode, $wgContLang;
                parent::setUp();
 
-               self::$oldLang = $wgLang;
-               self::$oldContLang = $wgContLang;
-
-               if( $wgLanguageCode != $wgContLang->getCode() ) {
+               if ( $wgLanguageCode != $wgContLang->getCode() ) {
                        throw new MWException("Error in MediaWikiLangTestCase::setUp(): " .
                                "\$wgLanguageCode ('$wgLanguageCode') is different from " .
                                "\$wgContLang->getCode() (" . $wgContLang->getCode() . ")" );
                }
 
-               $wgLanguageCode = 'en'; # For mainpage to be 'Main Page'
+               $langCode = 'en'; # For mainpage to be 'Main Page'
+               $langObj = Language::factory( $langCode );
 
-               $wgContLang = $wgLang = Language::factory( $wgLanguageCode );
-               MessageCache::singleton()->disable();
-
-       }
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => $langCode,
+                       'wgLang' => $langObj,
+                       'wgContLang' => $langObj,
+               ) );
 
-       public function tearDown() {
-               global $wgContLang, $wgLang, $wgLanguageCode;
-               $wgLang = self::$oldLang;
-
-               $wgContLang = self::$oldContLang;
-               $wgLanguageCode = $wgContLang->getCode();
-               self::$oldContLang = self::$oldLang = null;
-
-               parent::tearDown();
+               MessageCache::singleton()->disable();
        }
-
 }
index fca3251..2745c6a 100644 (file)
@@ -53,6 +53,26 @@ class MediaWikiPHPUnitCommand extends PHPUnit_TextUI_Command {
                }
        }
 
+       public function run( array $argv, $exit = true ) {
+               wfProfileIn( __METHOD__ );
+
+               $ret = parent::run( $argv, false );
+
+               wfProfileOut( __METHOD__ );
+
+               // Return to real wiki db, so profiling data is preserved
+               MediaWikiTestCase::teardownTestDB();
+
+               // Log profiling data, e.g. in the database or UDP
+               wfLogProfilingData();
+
+               if ( $exit ) {
+                       exit( $ret );
+               } else {
+                       return $ret;
+               }
+       }
+
        public function showHelp() {
                parent::showHelp();
 
index f9e9f77..cbf9a8e 100644 (file)
@@ -5,6 +5,20 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        public $regex = '';
        public $runDisabled = false;
 
+       /**
+        * $called tracks whether the setUp and tearDown method has been called.
+        * class extending MediaWikiTestCase usually override setUp and tearDown
+        * but forget to call the parent.
+        *
+        * The array format takes a method name as key and anything as a value.
+        * By asserting the key exist, we know the child class has called the
+        * parent.
+        *
+        * This property must be private, we do not want child to override it,
+        * they should call the appropriate parent method instead.
+        */
+       private $called = array();
+
        /**
         * @var Array of TestUser
         */
@@ -14,12 +28,12 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         * @var DatabaseBase
         */
        protected $db;
-       protected $oldTablePrefix;
-       protected $useTemporaryTables = true;
-       protected $reuseDB = false;
        protected $tablesUsed = array(); // tables with data
 
+       private static $useTemporaryTables = true;
+       private static $reuseDB = false;
        private static $dbSetup = false;
+       private static $oldTablePrefix = false;
 
        /**
         * Holds the paths of temporary files/directories created through getNewTempFile,
@@ -29,6 +43,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         */
        private $tmpfiles = array();
 
+       /**
+        * Holds original values of MediaWiki configuration settings
+        * to be restored in tearDown().
+        * See also setMwGlobal().
+        * @var array
+        */
+       private $mwGlobals = array();
 
        /**
         * Table name prefixes. Oracle likes it shorter.
@@ -57,31 +78,48 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                 */
                ObjectCache::$instances[CACHE_DB] = new HashBagOStuff;
 
+               $needsResetDB = false;
+               $logName = get_class( $this ) . '::' . $this->getName( false );
+
                if( $this->needsDB() ) {
-                       global $wgDBprefix;
-                       
-                       $this->useTemporaryTables = !$this->getCliArg( 'use-normal-tables' );
-                       $this->reuseDB = $this->getCliArg('reuse-db');
+                       // set up a DB connection for this test to use
+
+                       self::$useTemporaryTables = !$this->getCliArg( 'use-normal-tables' );
+                       self::$reuseDB = $this->getCliArg('reuse-db');
 
                        $this->db = wfGetDB( DB_MASTER );
 
                        $this->checkDbIsSupported();
 
-                       $this->oldTablePrefix = $wgDBprefix;
-
                        if( !self::$dbSetup ) {
-                               $this->initDB();
-                               self::$dbSetup = true;
+                               wfProfileIn( $logName . ' (clone-db)' );
+
+                               // switch to a temporary clone of the database
+                               self::setupTestDB( $this->db, $this->dbPrefix() );
+
+                               if ( ( $this->db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
+                                       $this->resetDB();
+                               }
+
+                               wfProfileOut( $logName . ' (clone-db)' );
                        }
 
+                       wfProfileIn( $logName . ' (prepare-db)' );
                        $this->addCoreDBData();
                        $this->addDBData();
+                       wfProfileOut( $logName . ' (prepare-db)' );
 
-                       parent::run( $result );
+                       $needsResetDB = true;
+               }
+
+               wfProfileIn( $logName );
+               parent::run( $result );
+               wfProfileOut( $logName );
 
+               if( $needsResetDB ) {
+                       wfProfileIn( $logName . ' (reset-db)' );
                        $this->resetDB();
-               } else {
-                       parent::run( $result );
+                       wfProfileOut( $logName . ' (reset-db)' );
                }
        }
 
@@ -119,7 +157,51 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                return $fname;
        }
 
+       /**
+        * setUp and tearDown should (where significant)
+        * happen in reverse order.
+        */
+       protected function setUp() {
+               wfProfileIn( __METHOD__ );
+               parent::setUp();
+               $this->called['setUp'] = 1;
+
+               /*
+               //@todo: global variables to restore for *every* test
+               array(
+                       'wgLang',
+                       'wgContLang',
+                       'wgLanguageCode',
+                       'wgUser',
+                       'wgTitle',
+               );
+               */
+
+               // Cleaning up temporary files
+               foreach ( $this->tmpfiles as $fname ) {
+                       if ( is_file( $fname ) || ( is_link( $fname ) ) ) {
+                               unlink( $fname );
+                       } elseif ( is_dir( $fname ) ) {
+                               wfRecursiveRemoveDir( $fname );
+                       }
+               }
+
+               if ( $this->needsDB() && $this->db ) {
+                       // Clean up open transactions
+                       while( $this->db->trxLevel() > 0 ) {
+                               $this->db->rollback();
+                       }
+
+                       // don't ignore DB errors
+                       $this->db->ignoreErrors( false );
+               }
+
+               wfProfileOut( __METHOD__ );
+       }
+
        protected function tearDown() {
+               wfProfileIn( __METHOD__ );
+
                // Cleaning up temporary files
                foreach ( $this->tmpfiles as $fname ) {
                        if ( is_file( $fname ) || ( is_link( $fname ) ) ) {
@@ -129,14 +211,114 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        }
                }
 
-               // clean up open transactions
-               if( $this->needsDB() && $this->db ) {
+               if ( $this->needsDB() && $this->db ) {
+                       // Clean up open transactions
                        while( $this->db->trxLevel() > 0 ) {
                                $this->db->rollback();
                        }
+
+                       // don't ignore DB errors
+                       $this->db->ignoreErrors( false );
+               }
+
+               // Restore mw globals
+               foreach ( $this->mwGlobals as $key => $value ) {
+                       $GLOBALS[$key] = $value;
                }
+               $this->mwGlobals = array();
 
                parent::tearDown();
+               wfProfileOut( __METHOD__ );
+       }
+
+       /**
+        * Make sure MediaWikiTestCase extending classes have called their
+        * parent setUp method
+        */
+       final public function testMediaWikiTestCaseParentSetupCalled() {
+               $this->assertArrayHasKey( 'setUp', $this->called,
+                       get_called_class() . "::setUp() must call parent::setUp()"
+               );
+       }
+
+       /**
+        * Individual test functions may override globals (either directly or through this
+        * setMwGlobals() function), however one must call this method at least once for
+        * each key within the setUp().
+        * That way the key is added to the array of globals that will be reset afterwards
+        * in the tearDown(). And, equally important, that way all other tests are executed
+        * with the same settings (instead of using the unreliable local settings for most
+        * tests and fix it only for some tests).
+        *
+        * @example
+        * <code>
+        *     protected function setUp() {
+        *         $this->setMwGlobals( 'wgRestrictStuff', true );
+        *     }
+        *
+        *     function testFoo() {}
+        *
+        *     function testBar() {}
+        *         $this->assertTrue( self::getX()->doStuff() );
+        *
+        *         $this->setMwGlobals( 'wgRestrictStuff', false );
+        *         $this->assertTrue( self::getX()->doStuff() );
+        *     }
+        *
+        *     function testQuux() {}
+        * </code>
+        *
+        * @param array|string $pairs Key to the global variable, or an array
+        *  of key/value pairs.
+        * @param mixed $value Value to set the global to (ignored
+        *  if an array is given as first argument).
+        */
+       protected function setMwGlobals( $pairs, $value = null ) {
+
+               // Normalize (string, value) to an array
+               if( is_string( $pairs ) ) {
+                       $pairs = array( $pairs => $value );
+               }
+
+               foreach ( $pairs as $key => $value ) {
+                       // NOTE: make sure we only save the global once or a second call to
+                       // setMwGlobals() on the same global would override the original
+                       // value.
+                       if ( !array_key_exists( $key, $this->mwGlobals ) ) {
+                               $this->mwGlobals[$key] = $GLOBALS[$key];
+                       }
+
+                       // Override the global
+                       $GLOBALS[$key] = $value;
+               }
+       }
+
+       /**
+        * Merges the given values into a MW global array variable.
+        * Useful for setting some entries in a configuration array, instead of
+        * setting the entire array.
+        *
+        * @param String $name The name of the global, as in wgFooBar
+        * @param Array $values The array containing the entries to set in that global
+        *
+        * @throws MWException if the designated global is not an array.
+        */
+       protected function mergeMwGlobalArrayValue( $name, $values ) {
+               if ( !isset( $GLOBALS[$name] ) ) {
+                       $merged = $values;
+               } else {
+                       if ( !is_array( $GLOBALS[$name] ) ) {
+                               throw new MWException( "MW global $name is not an array." );
+                       }
+
+                       // NOTE: do not use array_merge, it screws up for numeric keys.
+                       $merged = $GLOBALS[$name];
+                       foreach ( $values as $k => $v ) {
+                               $merged[$k] = $v;
+                       }
+               }
+
+               $this->setMwGlobals( $name, $merged );
        }
 
        function dbPrefix() {
@@ -212,34 +394,76 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                //Make 1 page with 1 revision
                $page = WikiPage::factory( Title::newFromText( 'UTPage' ) );
                if ( !$page->getId() == 0 ) {
-                       $page->doEdit( 'UTContent',
-                                                       'UTPageSummary',
-                                                       EDIT_NEW,
-                                                       false,
-                                                       User::newFromName( 'UTSysop' ) );
+                       $page->doEditContent(
+                               new WikitextContent( 'UTContent' ),
+                               'UTPageSummary',
+                               EDIT_NEW,
+                               false,
+                               User::newFromName( 'UTSysop' ) );
+               }
+       }
+
+       /**
+        * Restores MediaWiki to using the table set (table prefix) it was using before
+        * setupTestDB() was called. Useful if we need to perform database operations
+        * after the test run has finished (such as saving logs or profiling info).
+        */
+       public static function teardownTestDB() {
+               if ( !self::$dbSetup ) {
+                       return;
                }
+
+               CloneDatabase::changePrefix( self::$oldTablePrefix );
+
+               self::$oldTablePrefix = false;
+               self::$dbSetup = false;
        }
 
-       private function initDB() {
+       /**
+        * Creates an empty skeleton of the wiki database by cloning its structure
+        * to equivalent tables using the given $prefix. Then sets MediaWiki to
+        * use the new set of tables (aka schema) instead of the original set.
+        *
+        * This is used to generate a dummy table set, typically consisting of temporary
+        * tables, that will be used by tests instead of the original wiki database tables.
+        *
+        * @note: the original table prefix is stored in self::$oldTablePrefix. This is used
+        * by teardownTestDB() to return the wiki to using the original table set.
+        *
+        * @note: this method only works when first called. Subsequent calls have no effect,
+        * even if using different parameters.
+        *
+        * @param DatabaseBase $db The database connection
+        * @param String  $prefix The prefix to use for the new table set (aka schema).
+        *
+        * @throws MWException if the database table prefix is already $prefix
+        */
+       public static function setupTestDB( DatabaseBase $db, $prefix ) {
                global $wgDBprefix;
-               if ( $wgDBprefix === $this->dbPrefix() ) {
-                       throw new MWException( 'Cannot run unit tests, the database prefix is already "unittest_"' );
+               if ( $wgDBprefix === $prefix ) {
+                       throw new MWException( 'Cannot run unit tests, the database prefix is already "' . $prefix . '"' );
                }
 
-               $tablesCloned = $this->listTables();
-               $dbClone = new CloneDatabase( $this->db, $tablesCloned, $this->dbPrefix() );
-               $dbClone->useTemporaryTables( $this->useTemporaryTables );
+               if ( self::$dbSetup ) {
+                       return;
+               }
 
-               if ( ( $this->db->getType() == 'oracle' || !$this->useTemporaryTables ) && $this->reuseDB ) {
-                       CloneDatabase::changePrefix( $this->dbPrefix() );
-                       $this->resetDB();
+               $tablesCloned = self::listTables( $db );
+               $dbClone = new CloneDatabase( $db, $tablesCloned, $prefix );
+               $dbClone->useTemporaryTables( self::$useTemporaryTables );
+
+               self::$dbSetup = true;
+               self::$oldTablePrefix = $wgDBprefix;
+
+               if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
+                       CloneDatabase::changePrefix( $prefix );
                        return;
                } else {
                        $dbClone->cloneTableStructure();
                }
 
-               if ( $this->db->getType() == 'oracle' ) {
-                       $this->db->query( 'BEGIN FILL_WIKI_INFO; END;' );
+               if ( $db->getType() == 'oracle' ) {
+                       $db->query( 'BEGIN FILL_WIKI_INFO; END;' );
                }
        }
 
@@ -249,7 +473,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
        private function resetDB() {
                if( $this->db ) {
                        if ( $this->db->getType() == 'oracle' )  {
-                               if ( $this->useTemporaryTables ) {
+                               if ( self::$useTemporaryTables ) {
                                        wfGetLB()->closeAll();
                                        $this->db = wfGetDB( DB_MASTER );
                                } else {
@@ -298,16 +522,16 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                return strpos( $table, 'unittest_' ) !== 0;
        }
 
-       protected function listTables() {
+       public static function listTables( $db ) {
                global $wgDBprefix;
 
-               $tables = $this->db->listTables( $wgDBprefix, __METHOD__ );
+               $tables = $db->listTables( $wgDBprefix, __METHOD__ );
                $tables = array_map( array( __CLASS__, 'unprefixTable' ), $tables );
 
                // Don't duplicate test tables from the previous fataled run
                $tables = array_filter( $tables, array( __CLASS__, 'isNotUnittest' ) );
 
-               if ( $this->db->getType() == 'sqlite' ) {
+               if ( $db->getType() == 'sqlite' ) {
                        $tables = array_flip( $tables );
                        // these are subtables of searchindex and don't need to be duped/dropped separately
                        unset( $tables['searchindex_content'] );
@@ -368,7 +592,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *         or list the tables under testing in $this->tablesUsed, or override the
         *         needsDB() method.
         */
-       protected function assertSelect( $table, $fields, $condition, Array $expectedRows ) {
+       protected function assertSelect( $table, $fields, $condition, array $expectedRows ) {
                if ( !$this->needsDB() ) {
                        throw new MWException( 'When testing database state, the test cases\'s needDB()' .
                                ' method should return true. Use @group Database or $this->tablesUsed.');
@@ -544,4 +768,125 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                }
        }
 
+       /**
+        * Returns true iff the given namespace defaults to Wikitext
+        * according to $wgNamespaceContentModels
+        *
+        * @param int $ns The namespace ID to check
+        *
+        * @return bool
+        * @since 1.21
+        */
+       protected function isWikitextNS( $ns ) {
+               global $wgNamespaceContentModels;
+
+               if ( isset( $wgNamespaceContentModels[$ns] ) ) {
+                       return $wgNamespaceContentModels[$ns] === CONTENT_MODEL_WIKITEXT;
+               }
+
+               return true;
+       }
+
+       /**
+        * Returns the ID of a namespace that defaults to Wikitext.
+        * Throws an MWException if there is none.
+        *
+        * @return int the ID of the wikitext Namespace
+        * @since 1.21
+        */
+       protected function getDefaultWikitextNS() {
+               global $wgNamespaceContentModels;
+
+               static $wikitextNS = null; // this is not going to change
+               if ( $wikitextNS !== null ) {
+                       return $wikitextNS;
+               }
+
+               // quickly short out on most common case:
+               if ( !isset( $wgNamespaceContentModels[NS_MAIN] ) ) {
+                       return NS_MAIN;
+               }
+
+               // NOTE: prefer content namespaces
+               $namespaces = array_unique( array_merge(
+                       MWNamespace::getContentNamespaces(),
+                       array( NS_MAIN, NS_HELP, NS_PROJECT ), // prefer these
+                       MWNamespace::getValidNamespaces()
+               ) );
+
+               $namespaces = array_diff( $namespaces, array(
+                       NS_FILE, NS_CATEGORY, NS_MEDIAWIKI, NS_USER // don't mess with magic namespaces
+               ));
+
+               $talk = array_filter( $namespaces, function ( $ns ) {
+                       return MWNamespace::isTalk( $ns );
+               } );
+
+               // prefer non-talk pages
+               $namespaces = array_diff( $namespaces, $talk );
+               $namespaces = array_merge( $namespaces, $talk );
+
+               // check default content model of each namespace
+               foreach ( $namespaces as $ns ) {
+                       if ( !isset( $wgNamespaceContentModels[$ns] ) ||
+                               $wgNamespaceContentModels[$ns] === CONTENT_MODEL_WIKITEXT ) {
+
+                               $wikitextNS = $ns;
+                               return $wikitextNS;
+                       }
+               }
+
+               // give up
+               // @todo: Inside a test, we could skip the test as incomplete.
+               //        But frequently, this is used in fixture setup.
+               throw new MWException( "No namespace defaults to wikitext!" );
+       }
+
+       /**
+        * Check, if $wgDiff3 is set and ready to merge
+        * Will mark the calling test as skipped, if not ready
+        *
+        * @since 1.21
+        */
+       protected function checkHasDiff3() {
+               global $wgDiff3;
+
+               # This check may also protect against code injection in
+               # case of broken installations.
+               wfSuppressWarnings();
+               $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
+               wfRestoreWarnings();
+
+               if( !$haveDiff3 ) {
+                       $this->markTestSkipped( "Skip test, since diff3 is not configured" );
+               }
+       }
+
+       /**
+        * Asserts that an exception of the specified type occurs when running
+        * the provided code.
+        *
+        * @since 1.21
+        *
+        * @param callable $code
+        * @param string $expected
+        * @param string $message
+        */
+       protected function assertException( $code, $expected = 'Exception', $message = '' ) {
+               $pokemons = null;
+
+               try {
+                       call_user_func( $code );
+               }
+               catch ( Exception $pokemons ) {
+                       // Gotta Catch 'Em All!
+               }
+
+               if ( $message === '' ) {
+                       $message = 'An exception of type "' . $expected . '" should have been thrown';
+               }
+
+               $this->assertInstanceOf( $expected, $pokemons, $message );
+       }
+
 }
index bedf6c3..b106d2b 100644 (file)
@@ -296,7 +296,7 @@ CREATE TABLE /*_*/uploadstash (
        us_size int unsigned NOT NULL,
        us_sha1 varchar(31) NOT NULL,
        us_mime varchar(255),
-       us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
+       us_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE") default NULL,
        us_image_width int unsigned,
        us_image_height int unsigned,
        us_image_bits smallint unsigned
index ce65d49..211de26 100644 (file)
@@ -26,6 +26,9 @@ class ExportDemoTest extends DumpTestCase {
                $dom = new DomDocument();
                $dom->load( $fname );
 
+               // Ensure, the demo is for the current version
+               $this->assertEquals( $dom->documentElement->getAttribute( 'version' ), $version, 'export-demo.xml should have the current version' );
+
                try {
                        $this->assertTrue( $dom->schemaValidate( "../../docs/export-" . $version . ".xsd" ),
                                "schemaValidate has found an error" );
index 17cee6e..967ffa1 100644 (file)
@@ -16,14 +16,14 @@ class ArticleTablesTest extends MediaWikiLangTestCase {
                $wgContLang = Language::factory( 'es' );
 
                $wgLang = Language::factory( 'fr' );
-               $status = $page->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', 0, false, $user );
+               $status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', 0, false, $user );
                $templates1 = $title->getTemplateLinksFrom();
 
                $wgLang = Language::factory( 'de' );
                $page->mPreparedEdit = false; // In order to force the rerendering of the same wikitext
 
                // We need an edit, a purge is not enough to regenerate the tables
-               $status = $page->doEdit( '{{:{{int:history}}}}', 'Test code for bug 14404', EDIT_UPDATE, false, $user );
+               $status = $page->doEditContent( new WikitextContent( '{{:{{int:history}}}}' ), 'Test code for bug 14404', EDIT_UPDATE, false, $user );
                $templates2 = $title->getTemplateLinksFrom();
 
                $this->assertEquals( $templates1, $templates2 );
index 846d2b8..20952b1 100644 (file)
@@ -2,21 +2,27 @@
 
 class ArticleTest extends MediaWikiTestCase {
 
-       private $title; // holds a Title object
-       private $article; // holds an article
+       /**
+        * @var Title
+        */
+       private $title;
+       /**
+        * @var Article
+        */
+       private $article;
 
        /** creates a title object and its article object */
-       function setUp() {
-               $this->title   = Title::makeTitle( NS_MAIN, 'SomePage' );
+       protected function setUp() {
+               parent::setUp();
+               $this->title = Title::makeTitle( NS_MAIN, 'SomePage' );
                $this->article = new Article( $this->title );
-
        }
 
        /** cleanup title object and its article object */
-       function tearDown() {
-               $this->title   = null;
+       protected function tearDown() {
+               parent::tearDown();
+               $this->title = null;
                $this->article = null;
-
        }
 
        function testImplementsGetMagic() {
@@ -54,6 +60,9 @@ class ArticleTest extends MediaWikiTestCase {
         * Checks for the existence of the backwards compatibility static functions (forwarders to WikiPage class)
         */
        function testStaticFunctions() {
+               $this->hideDeprecated( 'Article::getAutosummary' );
+               $this->hideDeprecated( 'WikiPage::getAutosummary' );
+
                $this->assertEquals( WikiPage::selectFields(), Article::selectFields(),
                        "Article static functions" );
                $this->assertEquals( true, is_callable( "Article::onArticleCreate" ),
index 0c95b8d..29931c8 100644 (file)
@@ -11,17 +11,18 @@ class BlockTest extends MediaWikiLangTestCase {
        /* variable used to save up the blockID we insert in this test suite */
        private $blockId;
 
-       function setUp() {
-               global $wgContLang;
+       protected function setUp() {
                parent::setUp();
-               $wgContLang = Language::factory( 'en' );
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' )
+               ) );
        }
 
        function addDBData() {
-               //$this->dumpBlocks();
 
                $user = User::newFromName( 'UTBlockee' );
-               if( $user->getID() == 0 ) {
+               if ( $user->getID() == 0 ) {
                        $user->addToDatabase();
                        $user->setPassword( 'UTBlockeePassword' );
 
@@ -45,7 +46,7 @@ class BlockTest extends MediaWikiLangTestCase {
                // its value might change depending on the order the tests are run.
                // ApiBlockTest insert its own blocks!
                $newBlockId = $this->block->getId();
-               if ($newBlockId) {
+               if ( $newBlockId ) {
                        $this->blockId = $newBlockId;
                } else {
                        throw new MWException( "Failed to insert block for BlockTest; old leftover block remaining?" );
@@ -88,7 +89,7 @@ class BlockTest extends MediaWikiLangTestCase {
         *
         * This stopped working with r84475 and friends: regression being fixed for bug 29116.
         *
-        * @dataProvider dataBug29116
+        * @dataProvider provideBug29116Data
         */
        function testBug29116LoadWithEmptyIp( $vagueTarget ) {
                $this->hideDeprecated( 'Block::load' );
@@ -108,14 +109,14 @@ class BlockTest extends MediaWikiLangTestCase {
         * because the new function didn't accept empty strings like Block::load()
         * had. Regression bug 29116.
         *
-        * @dataProvider dataBug29116
+        * @dataProvider provideBug29116Data
         */
        function testBug29116NewFromTargetWithEmptyIp( $vagueTarget ) {
                $block = Block::newFromTarget('UTBlockee', $vagueTarget);
                $this->assertTrue( $this->block->equals( $block ), "newFromTarget() returns the same block as the one that was made when given empty vagueTarget param " . var_export( $vagueTarget, true ) );
        }
 
-       function dataBug29116() {
+       public static function provideBug29116Data() {
                return array(
                        array( null ),
                        array( '' ),
index b5418dd..32c84ef 100644 (file)
@@ -6,7 +6,8 @@
 
 class CdbTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
                if ( !CdbReader::haveExtension() ) {
                        $this->markTestSkipped( 'Native CDB support is not available' );
                }
@@ -18,8 +19,11 @@ class CdbTest extends MediaWikiTestCase {
                        $this->markTestSkipped( "Temp dir isn't writable" );
                }
 
-               $w1 = new CdbWriter_PHP( "$dir/php.cdb" );
-               $w2 = new CdbWriter_DBA( "$dir/dba.cdb" );
+               $phpcdbfile = $this->getNewTempFile();
+               $dbacdbfile = $this->getNewTempFile();
+
+               $w1 = new CdbWriter_PHP( $phpcdbfile );
+               $w2 = new CdbWriter_DBA( $dbacdbfile );
 
                $data = array();
                for ( $i = 0; $i < 1000; $i++ ) {
@@ -37,13 +41,13 @@ class CdbTest extends MediaWikiTestCase {
                $w2->close();
 
                $this->assertEquals(
-                       md5_file( "$dir/dba.cdb" ),
-                       md5_file( "$dir/php.cdb" ),
+                       md5_file( $phpcdbfile ),
+                       md5_file( $dbacdbfile ),
                        'same hash'
                );
 
-               $r1 = new CdbReader_PHP( "$dir/php.cdb" );
-               $r2 = new CdbReader_DBA( "$dir/dba.cdb" );
+               $r1 = new CdbReader_PHP( $phpcdbfile );
+               $r2 = new CdbReader_DBA( $dbacdbfile );
 
                foreach ( $data as $key => $value ) {
                        if ( $key === '' ) {
@@ -61,8 +65,6 @@ class CdbTest extends MediaWikiTestCase {
                        $this->cdbAssert( "DBA error", $key, $v2, $value );
                }
 
-               unlink( "$dir/dba.cdb" );
-               unlink( "$dir/php.cdb" );
        }
 
        private function randomString() {
index cdb6ed2..d46e683 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 class DiffHistoryBlobTest extends MediaWikiTestCase {
-       function setUp() {
+       protected function setUp() {
                if ( !extension_loaded( 'xdiff' ) ) {
                        $this->markTestSkipped( 'The xdiff extension is not available' );
                        return;
@@ -28,7 +28,7 @@ class DiffHistoryBlobTest extends MediaWikiTestCase {
                        "Hash of " . addcslashes( $input, "\0..\37!@\@\177..\377" ) );
        }
 
-       function provideXdiffAdler32() {
+       public static function provideXdiffAdler32() {
                return array(
                        array( '', 'Empty string' ),
                        array( "\0", 'Null' ),
index 8ecfd7e..36fde85 100644 (file)
@@ -1,19 +1,25 @@
 <?php
 
 /**
- * @group Editing      
+ * @group Editing
+ *
+ * @group Database
+ *        ^--- tell jenkins this test needs the database
+ *
+ * @group medium
+ *        ^--- tell phpunit that these test cases may take longer than 2 seconds.
  */
 class EditPageTest extends MediaWikiTestCase {
 
        /**
-        * @dataProvider dataExtractSectionTitle
+        * @dataProvider provideExtractSectionTitle
         */
        function testExtractSectionTitle( $section, $title ) {
                $extracted = EditPage::extractSectionTitle( $section );
                $this->assertEquals( $title, $extracted );
        }
 
-       function dataExtractSectionTitle() {
+       public static function provideExtractSectionTitle() {
                return array(
                        array(
                                "== Test ==\n\nJust a test section.",
@@ -37,4 +43,375 @@ class EditPageTest extends MediaWikiTestCase {
                        ),
                );
        }
+
+       protected function forceRevisionDate( WikiPage $page, $timestamp ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $dbw->update( 'revision',
+                       array( 'rev_timestamp' => $timestamp ),
+                       array( 'rev_id' => $page->getLatest() ) );
+
+               $page->clear();
+       }
+
+       /**
+        * User input text is passed to rtrim() by edit page. This is a simple
+        * wrapper around assertEquals() which calls rrtrim() to normalize the
+        * expected and actual texts.
+        */
+       function assertEditedTextEquals( $expected, $actual, $msg='' ) {
+               return $this->assertEquals( rtrim($expected), rtrim($actual), $msg );
+       }
+
+       /**
+        * Performs an edit and checks the result.
+        *
+        * @param String|Title $title The title of the page to edit
+        * @param String|null $baseText Some text to create the page with before attempting the edit.
+        * @param User|String|null $user The user to perform the edit as.
+        * @param array $edit An array of request parameters used to define the edit to perform.
+        *              Some well known fields are:
+        *              * wpTextbox1: the text to submit
+        *              * wpSummary: the edit summary
+        *              * wpEditToken: the edit token (will be inserted if not provided)
+        *              * wpEdittime: timestamp of the edit's base revision (will be inserted if not provided)
+        *              * wpStarttime: timestamp when the edit started (will be inserted if not provided)
+        *              * wpSectionTitle: the section to edit
+        *              * wpMinorEdit: mark as minor edit
+        *              * wpWatchthis: whether to watch the page
+        * @param int|null $expectedCode The expected result code (EditPage::AS_XXX constants).
+        *                  Set to null to skip the check. Defaults to EditPage::AS_OK.
+        * @param String|null $expectedText The text expected to be on the page after the edit.
+        *                  Set to null to skip the check.
+        * @param String|null $message An optional message to show along with any error message.
+        *
+        * @return WikiPage The page that was just edited, useful for getting the edit's rev_id, etc.
+        */
+       protected function assertEdit( $title, $baseText, $user = null, array $edit,
+               $expectedCode = EditPage::AS_OK, $expectedText = null, $message = null
+       ) {
+               if ( is_string( $title ) ) {
+                       $ns = $this->getDefaultWikitextNS();
+                       $title = Title::newFromText( $title, $ns );
+               }
+
+               if ( is_string( $user ) ) {
+                       $user = User::newFromName( $user );
+
+                       if ( $user->getId() === 0 ) {
+                               $user->addToDatabase();
+                       }
+               }
+
+               $page = WikiPage::factory( $title );
+
+               if ( $baseText !== null ) {
+                       $content = ContentHandler::makeContent( $baseText, $title );
+                       $page->doEditContent( $content, "base text for test" );
+                       $this->forceRevisionDate( $page, '20120101000000' );
+
+                       //sanity check
+                       $page->clear();
+                       $currentText = ContentHandler::getContentText( $page->getContent() );
+
+                       # EditPage rtrim() the user input, so we alter our expected text
+                       # to reflect that.
+                       $this->assertEditedTextEquals( $baseText, $currentText );
+               }
+
+               if ( $user == null ) {
+                       $user = $GLOBALS['wgUser'];
+               } else {
+                       $this->setMwGlobals( 'wgUser', $user );
+               }
+
+               if ( !isset( $edit['wpEditToken'] ) ) {
+                       $edit['wpEditToken'] = $user->getEditToken();
+               }
+
+               if ( !isset( $edit['wpEdittime'] ) ) {
+                       $edit['wpEdittime'] = $page->exists() ? $page->getTimestamp() : '';
+               }
+
+               if ( !isset( $edit['wpStarttime'] ) ) {
+                       $edit['wpStarttime'] = wfTimestampNow();
+               }
+
+               $req = new FauxRequest( $edit, true ); // session ??
+
+               $ep = new EditPage( new Article( $title ) );
+               $ep->setContextTitle( $title );
+               $ep->importFormData( $req );
+
+               $bot = isset( $edit['bot'] ) ? (bool)$edit['bot'] : false;
+
+               // this is where the edit happens!
+               // Note: don't want to use EditPage::AttemptSave, because it messes with $wgOut
+               // and throws exceptions like PermissionsError
+               $status = $ep->internalAttemptSave( $result, $bot );
+
+               if ( $expectedCode !== null ) {
+                       // check edit code
+                       $this->assertEquals( $expectedCode, $status->value,
+                               "Expected result code mismatch. $message" );
+               }
+
+               $page = WikiPage::factory( $title );
+
+               if ( $expectedText !== null ) {
+                       // check resulting page text
+                       $content = $page->getContent();
+                       $text = ContentHandler::getContentText( $content );
+
+                       # EditPage rtrim() the user input, so we alter our expected text
+                       # to reflect that.
+                       $this->assertEditedTextEquals( $expectedText, $text,
+                               "Expected article text mismatch. $message" );
+               }
+
+               return $page;
+       }
+
+       public function testCreatePage() {
+               $text = "Hello World!";
+               $edit = array(
+                       'wpTextbox1' => $text,
+                       'wpSummary' => 'just testing',
+               );
+
+               $this->assertEdit( 'EditPageTest_testCreatePafe', null, null, $edit,
+                       EditPage::AS_SUCCESS_NEW_ARTICLE, $text,
+                       "expected successfull creation with given text" );
+       }
+
+       public function testUpdatePage() {
+               $text = "one";
+               $edit = array(
+                       'wpTextbox1' => $text,
+                       'wpSummary' => 'first update',
+               );
+
+               $page = $this->assertEdit( 'EditPageTest_testUpdatePage', "zero", null, $edit,
+                       EditPage::AS_SUCCESS_UPDATE, $text,
+                       "expected successfull update with given text" );
+
+               $this->forceRevisionDate( $page, '20120101000000' );
+
+               $text = "two";
+               $edit = array(
+                       'wpTextbox1' => $text,
+                       'wpSummary' => 'second update',
+               );
+
+               $this->assertEdit( 'EditPageTest_testUpdatePage', null, null, $edit,
+                       EditPage::AS_SUCCESS_UPDATE, $text,
+                       "expected successfull update with given text" );
+       }
+
+       public static function provideSectionEdit() {
+               $text =
+'Intro
+
+== one ==
+first section.
+
+== two ==
+second section.
+';
+
+               $sectionOne =
+'== one ==
+hello
+';
+
+               $newSection =
+'== new section ==
+
+hello
+';
+
+               $textWithNewSectionOne = preg_replace( '/== one ==.*== two ==/ms',
+                                                                               "$sectionOne\n== two ==", $text );
+
+               $textWithNewSectionAdded = "$text\n$newSection";
+
+               return array(
+                       array( #0
+                               $text,
+                               '',
+                               'hello',
+                               'replace all',
+                               'hello'
+                       ),
+
+                       array( #1
+                               $text,
+                               '1',
+                               $sectionOne,
+                               'replace first section',
+                               $textWithNewSectionOne,
+                       ),
+
+                       array( #2
+                               $text,
+                               'new',
+                               'hello',
+                               'new section',
+                               $textWithNewSectionAdded,
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideSectionEdit
+        */
+       public function testSectionEdit( $base, $section, $text, $summary, $expected ) {
+               $edit = array(
+                       'wpTextbox1' => $text,
+                       'wpSummary' => $summary,
+                       'wpSection' => $section,
+               );
+
+               $this->assertEdit( 'EditPageTest_testSectionEdit', $base, null, $edit,
+                       EditPage::AS_SUCCESS_UPDATE, $expected,
+                       "expected successfull update of section" );
+       }
+
+       public static function provideAutoMerge() {
+               $tests = array();
+
+               $tests[] = array( #0: plain conflict
+                       "Elmo", # base edit user
+                       "one\n\ntwo\n\nthree\n",
+                       array( #adam's edit
+                               'wpStarttime' => 1,
+                               'wpTextbox1' => "ONE\n\ntwo\n\nthree\n",
+                       ),
+                       array( #berta's edit
+                               'wpStarttime' => 2,
+                               'wpTextbox1' => "(one)\n\ntwo\n\nthree\n",
+                       ),
+                       EditPage::AS_CONFLICT_DETECTED, # expected code
+                       "ONE\n\ntwo\n\nthree\n", # expected text
+                       'expected edit conflict', # message
+               );
+
+               $tests[] = array( #1: successful merge
+                       "Elmo", # base edit user
+                       "one\n\ntwo\n\nthree\n",
+                       array( #adam's edit
+                               'wpStarttime' => 1,
+                               'wpTextbox1' => "ONE\n\ntwo\n\nthree\n",
+                       ),
+                       array( #berta's edit
+                               'wpStarttime' => 2,
+                               'wpTextbox1' => "one\n\ntwo\n\nTHREE\n",
+                       ),
+                       EditPage::AS_SUCCESS_UPDATE, # expected code
+                       "ONE\n\ntwo\n\nTHREE\n", # expected text
+                       'expected automatic merge', # message
+               );
+
+               $text = "Intro\n\n";
+               $text .= "== first section ==\n\n";
+               $text .= "one\n\ntwo\n\nthree\n\n";
+               $text .= "== second section ==\n\n";
+               $text .= "four\n\nfive\n\nsix\n\n";
+
+               // extract the first section.
+               $section = preg_replace( '/.*(== first section ==.*)== second section ==.*/sm', '$1', $text );
+
+               // generate expected text after merge
+               $expected = str_replace( 'one', 'ONE', str_replace( 'three', 'THREE', $text ) );
+
+               $tests[] = array( #2: merge in section
+                       "Elmo", # base edit user
+                       $text,
+                       array( #adam's edit
+                               'wpStarttime' => 1,
+                               'wpTextbox1' => str_replace( 'one', 'ONE', $section ),
+                               'wpSection' => '1'
+                       ),
+                       array( #berta's edit
+                               'wpStarttime' => 2,
+                               'wpTextbox1' => str_replace( 'three', 'THREE', $section ),
+                               'wpSection' => '1'
+                       ),
+                       EditPage::AS_SUCCESS_UPDATE, # expected code
+                       $expected, # expected text
+                       'expected automatic section merge', # message
+               );
+
+               // see whether it makes a difference who did the base edit
+               $testsWithAdam = array_map( function( $test ) {
+                       $test[0] = 'Adam'; // change base edit user
+                       return $test;
+               }, $tests );
+
+               $testsWithBerta = array_map( function( $test ) {
+                       $test[0] = 'Berta'; // change base edit user
+                       return $test;
+               }, $tests );
+
+               return array_merge( $tests, $testsWithAdam, $testsWithBerta );
+       }
+
+       /**
+        * @dataProvider provideAutoMerge
+        */
+       public function testAutoMerge( $baseUser, $text, $adamsEdit, $bertasEdit,
+                               $expectedCode, $expectedText, $message = null
+       ) {
+               $this->checkHasDiff3();
+
+               //create page
+               $ns = $this->getDefaultWikitextNS();
+               $title = Title::newFromText( 'EditPageTest_testAutoMerge', $ns );
+               $page = WikiPage::factory( $title );
+
+               if ( $page->exists() ) {
+                       $page->doDeleteArticle( "clean slate for testing" );
+               }
+
+               $baseEdit = array(
+                       'wpTextbox1' => $text,
+               );
+
+               $page = $this->assertEdit( 'EditPageTest_testAutoMerge', null,
+                                       $baseUser, $baseEdit, null, null, __METHOD__ );
+
+               $this->forceRevisionDate( $page, '20120101000000' );
+
+               $edittime = $page->getTimestamp();
+
+               // start timestamps for conflict detection
+               if ( !isset( $adamsEdit['wpStarttime'] ) ) {
+                       $adamsEdit['wpStarttime'] = 1;
+               }
+
+               if ( !isset( $bertasEdit['wpStarttime'] ) ) {
+                       $bertasEdit['wpStarttime'] = 2;
+               }
+
+               $starttime = wfTimestampNow();
+               $adamsTime = wfTimestamp( TS_MW, (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$adamsEdit['wpStarttime'] );
+               $bertasTime = wfTimestamp( TS_MW, (int)wfTimestamp( TS_UNIX, $starttime ) + (int)$bertasEdit['wpStarttime'] );
+
+               $adamsEdit['wpStarttime'] = $adamsTime;
+               $bertasEdit['wpStarttime'] = $bertasTime;
+
+               $adamsEdit['wpSummary'] = 'Adam\'s edit';
+               $bertasEdit['wpSummary'] = 'Bertas\'s edit';
+
+               $adamsEdit['wpEdittime'] = $edittime;
+               $bertasEdit['wpEdittime'] = $edittime;
+
+               // first edit
+               $this->assertEdit( 'EditPageTest_testAutoMerge', null, 'Adam', $adamsEdit,
+                       EditPage::AS_SUCCESS_UPDATE, null, "expected successfull update" );
+
+               // second edit
+               $this->assertEdit( 'EditPageTest_testAutoMerge', null, 'Berta', $bertasEdit,
+                       $expectedCode, $expectedText, $message );
+       }
 }
index 92ec734..fe6c60d 100644 (file)
@@ -4,29 +4,78 @@
  */
 
 class ExternalStoreTest extends MediaWikiTestCase {
-       private $saved_wgExternalStores;
 
-       function setUp() {
-               global $wgExternalStores;
-               $this->saved_wgExternalStores = $wgExternalStores ;
-       }
+       function testExternalFetchFromURL() {
+               $this->setMwGlobals( 'wgExternalStores', false );
 
-       function tearDown() {
-               global $wgExternalStores;
-               $wgExternalStores = $this->saved_wgExternalStores ;
-       }
+               $this->assertFalse(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
+                       'Deny if wgExternalStores is not set to a non-empty array'
+               );
 
-       function testExternalStoreDoesNotFetchIncorrectURL() {
-               global $wgExternalStores;
-               $wgExternalStores = true;
+               $this->setMwGlobals( 'wgExternalStores', array( 'FOO' ) );
 
+               $this->assertEquals(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/200' ),
+                       'Hello',
+                       'Allow FOO://cluster1/200'
+               );
+               $this->assertEquals(
+                       ExternalStore::fetchFromURL( 'FOO://cluster1/300/0' ),
+                       'Hello',
+                       'Allow FOO://cluster1/300/0'
+               );
                # Assertions for r68900
                $this->assertFalse(
-                       ExternalStore::fetchFromURL( 'http://' ) );
+                       ExternalStore::fetchFromURL( 'ftp.example.org' ),
+                       'Deny domain ftp.example.org'
+               );
                $this->assertFalse(
-                       ExternalStore::fetchFromURL( 'ftp.wikimedia.org' ) );
+                       ExternalStore::fetchFromURL( '/example.txt' ),
+                       'Deny path /example.txt'
+               );
                $this->assertFalse(
-                       ExternalStore::fetchFromURL( '/super.txt' ) );
+                       ExternalStore::fetchFromURL( 'http://' ),
+                       'Deny protocol http://'
+               );
        }
 }
 
+class ExternalStoreFOO {
+
+       protected $data = array(
+               'cluster1' => array(
+                       '200' => 'Hello',
+                       '300' => array(
+                               'Hello', 'World',
+                       ),
+               ),
+       );
+
+       /**
+        * Fetch data from given URL
+        * @param $url String: an url of the form FOO://cluster/id or FOO://cluster/id/itemid.
+        * @return mixed
+        */
+       function fetchFromURL( $url ) {
+               // Based on ExternalStoreDB
+               $path = explode( '/', $url );
+               $cluster = $path[2];
+               $id = $path[3];
+               if ( isset( $path[4] ) ) {
+                       $itemID = $path[4];
+               } else {
+                       $itemID = false;
+               }
+
+               if ( !isset( $this->data[$cluster][$id] ) ) {
+                       return null;
+               }
+
+               if ( $itemID !== false && is_array( $this->data[$cluster][$id] ) && isset( $this->data[$cluster][$id][$itemID] ) ) {
+                       return $this->data[$cluster][$id][$itemID];
+               }
+
+               return $this->data[$cluster][$id];
+       }
+}
\ No newline at end of file
index 903a6d2..ca1615e 100644 (file)
@@ -5,20 +5,21 @@
  */
 class ExtraParserTest extends MediaWikiTestCase {
 
-       function setUp() {
-               global $wgMemc;
-               global $wgContLang;
-               global $wgShowDBErrorBacktrace;
-               global $wgLanguageCode;
-               global $wgAlwaysUseTidy;
+       protected function setUp() {
+               parent::setUp();
 
-               $wgShowDBErrorBacktrace = true;
-               $wgLanguageCode = 'en';
-               $wgContLang = new Language( 'en' );
-               $wgMemc = new EmptyBagOStuff;
-               $wgAlwaysUseTidy = false;
+               $contLang = Language::factory( 'en' );
+               $this->setMwGlobals( array(
+                       'wgShowDBErrorBacktrace' => true,
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => $contLang,
+                       'wgLang' => Language::factory( 'en' ),
+                       'wgMemc' => new EmptyBagOStuff,
+                       'wgAlwaysUseTidy' => false,
+                       'wgCleanSignatures' => true,
+               ) );
                
-               $this->options = new ParserOptions;
+               $this->options = ParserOptions::newFromUserAndLang( new User, $contLang );
                $this->options->setTemplateCallback( array( __CLASS__, 'statelessFetchTemplate' ) );
                $this->parser = new Parser;
 
@@ -27,11 +28,8 @@ class ExtraParserTest extends MediaWikiTestCase {
 
        // Bug 8689 - Long numeric lines kill the parser
        function testBug8689() {
-               global $wgLang;
                global $wgUser;
                $longLine = '1.' . str_repeat( '1234567890', 100000 ) . "\n";
-
-               if ( $wgLang === null ) $wgLang = new Language;
                
                $t = Title::newFromText( 'Unit test' );
                $options = ParserOptions::newFromUser( $wgUser );
@@ -65,14 +63,8 @@ class ExtraParserTest extends MediaWikiTestCase {
         * cleanSig() makes all templates substs and removes tildes
         */
        function testCleanSig() {
-               global $wgCleanSignatures;
-               $oldCleanSignature = $wgCleanSignatures;
-               $wgCleanSignatures = true;
-
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
-
-               $wgCleanSignatures = $oldCleanSignature;
                
                $this->assertEquals( "{{SUBST:Foo}} ", $outputText );
        }
@@ -82,13 +74,10 @@ class ExtraParserTest extends MediaWikiTestCase {
         */
        function testCleanSigDisabled() {
                global $wgCleanSignatures;
-               $oldCleanSignature = $wgCleanSignatures;
                $wgCleanSignatures = false;
 
                $title = Title::newFromText( __FUNCTION__ );
                $outputText = $this->parser->cleanSig( "{{Foo}} ~~~~" );
-
-               $wgCleanSignatures = $oldCleanSignature;
                
                $this->assertEquals( "{{Foo}} ~~~~", $outputText );
        }
@@ -101,7 +90,7 @@ class ExtraParserTest extends MediaWikiTestCase {
                $this->assertEquals( Parser::cleanSigInSig( $in), $out );
        }
        
-       function provideStringsForCleanSigInSig() {
+       public static function provideStringsForCleanSigInSig() {
                return array(
                        array( "{{Foo}} ~~~~", "{{Foo}} " ),
                        array( "~~~", "" ),
index c042004..56691c9 100644 (file)
@@ -25,7 +25,8 @@
 class FauxResponseTest extends MediaWikiTestCase {
        var $response;
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
                $this->response = new FauxResponse;
        }
 
index d86c95d..af28f79 100644 (file)
@@ -41,8 +41,8 @@ class FormOptionsInitializationTest extends MediaWikiTestCase {
         * with.
         */
        protected function setUp() {
+               parent::setUp();
                $this->object = new FormOptionsExposed();
-               
        }
 
        public function testAddStringOption() {
index 749343e..d4e3c5e 100644 (file)
@@ -23,12 +23,13 @@ class FormOptionsTest extends MediaWikiTestCase {
        protected $object;
 
        /**
-        * Instanciates a FormOptions object to play with.       
+        * Instanciates a FormOptions object to play with.
         * FormOptions::add() is tested by the class FormOptionsInitializationTest
         * so we assume the function is well tested already an use it to create
         * the fixture.
         */
        protected function setUp() {
+               parent::setUp();
                $this->object = new FormOptions;
                $this->object->add( 'string1', 'string one' );
                $this->object->add( 'string2', 'string two' );
index 9097d30..0dc18a2 100644 (file)
@@ -1,22 +1,32 @@
 <?php
 
 class GlobalTest extends MediaWikiTestCase {
-       function setUp() {
-               global $wgReadOnlyFile, $wgUrlProtocols;
-               $this->originals['wgReadOnlyFile'] = $wgReadOnlyFile;
-               $this->originals['wgUrlProtocols'] = $wgUrlProtocols;
-               $wgReadOnlyFile = tempnam( wfTempDir(), "mwtest_readonly" );
-               $wgUrlProtocols[] = 'file://';
-               unlink( $wgReadOnlyFile );
+       protected function setUp() {
+               parent::setUp();
+
+               $readOnlyFile = tempnam( wfTempDir(), "mwtest_readonly" );
+               unlink( $readOnlyFile );
+
+               $this->setMwGlobals( array(
+                       'wgReadOnlyFile' => $readOnlyFile,
+                       'wgUrlProtocols' => array(
+                               'http://',
+                               'https://',
+                               'mailto:',
+                               '//',
+                               'file://', # Non-default
+                       ),
+               ) );
        }
 
-       function tearDown() {
-               global $wgReadOnlyFile, $wgUrlProtocols;
+       protected function tearDown() {
+               global $wgReadOnlyFile;
+
                if ( file_exists( $wgReadOnlyFile ) ) {
                        unlink( $wgReadOnlyFile );
                }
-               $wgReadOnlyFile = $this->originals['wgReadOnlyFile'];
-               $wgUrlProtocols = $this->originals['wgUrlProtocols'];
+
+               parent::tearDown();
        }
 
        /** @dataProvider provideForWfArrayDiff2 */
@@ -27,7 +37,7 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        // @todo Provide more tests
-       public function provideForWfArrayDiff2() {
+       public static function provideForWfArrayDiff2() {
                // $a $b $expected
                return array(
                        array(
@@ -100,7 +110,7 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertTrue( $end > $start, "Time is running backwards!" );
        }
 
-       function dataArrayToCGI() {
+       public static function provideArrayToCGI() {
                return array(
                        array( array(), '' ), // empty
                        array( array( 'foo' => 'bar' ), 'foo=bar' ), // string test
@@ -119,7 +129,7 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataArrayToCGI
+        * @dataProvider provideArrayToCGI
         */
        function testArrayToCGI( $array, $result ) {
                $this->assertEquals( $result, wfArrayToCGI( $array ) );
@@ -134,7 +144,7 @@ class GlobalTest extends MediaWikiTestCase {
                                array( 'foo' => 'bar', 'baz' => 'overridden value' ) ) );
        }
 
-       function dataCgiToArray() {
+       public static function provideCgiToArray() {
                return array(
                        array( '', array() ), // empty
                        array( 'foo=bar', array( 'foo' => 'bar' ) ), // string
@@ -150,13 +160,13 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataCgiToArray
+        * @dataProvider provideCgiToArray
         */
        function testCgiToArray( $cgi, $result ) {
                $this->assertEquals( $result, wfCgiToArray( $cgi ) );
        }
 
-       function dataCgiRoundTrip() {
+       public static function provideCgiRoundTrip() {
                return array(
                        array( '' ),
                        array( 'foo=bar' ),
@@ -170,7 +180,7 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataCgiRoundTrip
+        * @dataProvider provideCgiRoundTrip
         */
        function testCgiRoundTrip( $cgi ) {
                $this->assertEquals( $cgi, wfArrayToCGI( wfCgiToArray( $cgi ) ) );
@@ -307,29 +317,28 @@ class GlobalTest extends MediaWikiTestCase {
                }
                
        }
-       
-       
+
+
        function testDebugFunctionTest() {
-       
+
                global $wgDebugLogFile, $wgDebugTimestamps;
-               
+
                $old_log_file = $wgDebugLogFile;
                $wgDebugLogFile = tempnam( wfTempDir(), 'mw-' );
-               # @todo FIXME: This setting should be tested
+               # @todo FIXME: $wgDebugTimestamps should be tested
+               $old_wgDebugTimestamps = $wgDebugTimestamps;
                $wgDebugTimestamps = false;
-               
-               
-               
+
+
                wfDebug( "This is a normal string" );
                $this->assertEquals( "This is a normal string", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
-               
-               
+
                wfDebug( "This is nöt an ASCII string" );
                $this->assertEquals( "This is nöt an ASCII string", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
-               
-               
+
+
                wfDebug( "\00305This has böth UTF and control chars\003" );
                $this->assertEquals( " 05This has böth UTF and control chars ", file_get_contents( $wgDebugLogFile ) );
                unlink( $wgDebugLogFile );
@@ -337,17 +346,16 @@ class GlobalTest extends MediaWikiTestCase {
                wfDebugMem();
                $this->assertGreaterThan( 5000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
                unlink( $wgDebugLogFile );
-               
+
                wfDebugMem(true);
                $this->assertGreaterThan( 5000000, preg_replace( '/\D/', '', file_get_contents( $wgDebugLogFile ) ) );
                unlink( $wgDebugLogFile );
-               
-               
-               
+
+
                $wgDebugLogFile = $old_log_file;
-               
+               $wgDebugTimestamps = $old_wgDebugTimestamps;
        }
-       
+
        function testClientAcceptsGzipTest() {
                
                $settings = array(
@@ -437,7 +445,7 @@ class GlobalTest extends MediaWikiTestCase {
        }
 
        /** array( shorthand, expected integer ) */
-       public function provideShorthand() {
+       public static function provideShorthand() {
                return array(
                        # Null, empty ... 
                        array(     '', -1),
@@ -480,6 +488,88 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
+       /**
+        * @param String $old: Text as it was in the database
+        * @param String $mine: Text submitted while user was editing
+        * @param String $yours: Text submitted by the user
+        * @param Boolean $expectedMergeResult Whether the merge should be a success
+        * @param String $expectedText: Text after merge has been completed
+        *
+        * @dataProvider provideMerge()
+        */
+       public function testMerge( $old, $mine, $yours, $expectedMergeResult, $expectedText ) {
+               $this->checkHasDiff3();
+
+               $mergedText = null;
+               $isMerged = wfMerge( $old, $mine, $yours, $mergedText );
+
+               $msg = 'Merge should be a ';
+               $msg .= $expectedMergeResult ? 'success' : 'failure';
+               $this->assertEquals( $expectedMergeResult, $isMerged, $msg );
+
+               if( $isMerged ) {
+                       // Verify the merged text
+                       $this->assertEquals( $expectedText, $mergedText,
+                               'is merged text as expected?' );
+               }
+       }
+
+       public static function provideMerge() {
+               $EXPECT_MERGE_SUCCESS = true;
+               $EXPECT_MERGE_FAILURE = false;
+
+               return array(
+
+                       // #0: clean merge
+                       array(
+                               // old:
+                               "one one one\n" . // trimmed
+                               "\n" .
+                               "two two two",
+
+                               // mine:
+                               "one one one ONE ONE\n" .
+                               "\n" .
+                               "two two two\n", // with tailing whitespace
+
+                               // yours:
+                               "one one one\n" .
+                               "\n" .
+                               "two two TWO TWO", // trimmed
+
+                               // ok:
+                               $EXPECT_MERGE_SUCCESS,
+
+                               // result:
+                               "one one one ONE ONE\n" .
+                               "\n" .
+                               "two two TWO TWO\n", // note: will always end in a newline
+                       ),
+
+                       // #1: conflict, fail
+                       array(
+                               // old:
+                               "one one one", // trimmed
+
+                               // mine:
+                               "one one one ONE ONE\n" .
+                               "\n" .
+                               "bla bla\n" .
+                               "\n", // with tailing whitespace
+
+                               // yours:
+                               "one one one\n" .
+                               "\n" .
+                               "two two", // trimmed
+
+                               $EXPECT_MERGE_FAILURE,
+
+                               // result:
+                               null,
+                       ),
+               );
+       }
+
        /**
         * @dataProvider provideMakeUrlIndexes()
         */
index be6c99e..bed435a 100644 (file)
@@ -19,7 +19,7 @@ class wfAssembleUrl extends MediaWikiTestCase {
         *
         * @return array
         */
-       public function provideURLParts() {
+       public static function provideURLParts() {
                $schemes = array(
                        '' => array(),
                        '//' => array(
index f4ec7a5..4a0f406 100644 (file)
@@ -7,7 +7,7 @@ class wfBCP47 extends MediaWikiTestCase {
         * test @see wfBCP47().
         * Please note the BCP explicitly state that language codes are case
         * insensitive, there are some exceptions to the rule :)
-        * This test is used to verify our formatting against all lower and
+        * This test is used to verify our formatting against all lower and
         * all upper cases language code.
         *
         * @see http://tools.ietf.org/html/bcp47
index 192689f..cb6e6c4 100644 (file)
@@ -32,10 +32,20 @@ class wfExpandUrl extends MediaWikiTestCase {
         *
         * @return array
         */
-       public function provideExpandableUrls() {
+       public static function provideExpandableUrls() {
                $modes = array( 'http', 'https' );
-               $servers = array( 'http' => 'http://example.com', 'https' => 'https://example.com', 'protocol-relative' => '//example.com' );
-               $defaultProtos = array( 'http' => PROTO_HTTP, 'https' => PROTO_HTTPS, 'protocol-relative' => PROTO_RELATIVE, 'current' => PROTO_CURRENT, 'canonical' => PROTO_CANONICAL );
+               $servers = array(
+                       'http' => 'http://example.com',
+                       'https' => 'https://example.com',
+                       'protocol-relative' => '//example.com'
+               );
+               $defaultProtos = array(
+                       'http' => PROTO_HTTP,
+                       'https' => PROTO_HTTPS,
+                       'protocol-relative' => PROTO_RELATIVE,
+                       'current' => PROTO_CURRENT,
+                       'canonical' => PROTO_CANONICAL
+               );
 
                $retval = array();
                foreach ( $modes as $mode ) {
@@ -44,13 +54,27 @@ class wfExpandUrl extends MediaWikiTestCase {
                                foreach ( $modes as $canServerMode  ) {
                                        $canServer = "$canServerMode://example2.com";
                                        foreach ( $defaultProtos as $protoDesc => $defaultProto ) {
-                                               $retval[] = array( 'http://example.com', 'http://example.com', $defaultProto, $server, $canServer, $httpsMode, "Testing fully qualified http URLs (no need to expand) (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
-                                               $retval[] = array( 'https://example.com', 'https://example.com', $defaultProto, $server, $canServer, $httpsMode, "Testing fully qualified https URLs (no need to expand) (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
+                                               $retval[] = array(
+                                                       'http://example.com', 'http://example.com',
+                                                       $defaultProto, $server, $canServer, $httpsMode,
+                                                       "Testing fully qualified http URLs (no need to expand) ' .
+                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                               );
+                                               $retval[] = array(
+                                                       'https://example.com', 'https://example.com',
+                                                       $defaultProto, $server, $canServer, $httpsMode,
+                                                       "Testing fully qualified https URLs (no need to expand) ' .
+                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                               );
                                                # Would be nice to support this, see fixme on wfExpandUrl()
-                                               $retval[] = array( "wiki/FooBar", 'wiki/FooBar', $defaultProto, $server, $canServer, $httpsMode, "Test non-expandable relative URLs (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
+                                               $retval[] = array(
+                                                       "wiki/FooBar", 'wiki/FooBar',
+                                                       $defaultProto, $server, $canServer, $httpsMode,
+                                                       "Test non-expandable relative URLs ' .
+                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                               );
 
                                                // Determine expected protocol
-                                               $p = $protoDesc . ':'; // default case
                                                if ( $protoDesc == 'protocol-relative' ) {
                                                        $p = '';
                                                } elseif ( $protoDesc == 'current' ) {
@@ -69,8 +93,18 @@ class wfExpandUrl extends MediaWikiTestCase {
                                                        $srv = $server;
                                                }
 
-                                               $retval[] = array( "$p//wikipedia.org", '//wikipedia.org', $defaultProto, $server, $canServer, $httpsMode, "Test protocol-relative URL (defaultProto: $protoDesc, wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
-                                               $retval[] = array( "$srv/wiki/FooBar", '/wiki/FooBar', $defaultProto, $server, $canServer, $httpsMode, "Testing expanding URL beginning with / (defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )" );
+                                               $retval[] = array(
+                                                       "$p//wikipedia.org", '//wikipedia.org',
+                                                       $defaultProto, $server, $canServer, $httpsMode,
+                                                       "Test protocol-relative URL ' .
+                                                       '(defaultProto: $protoDesc, wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                               );
+                                               $retval[] = array(
+                                                       "$srv/wiki/FooBar", '/wiki/FooBar',
+                                                       $defaultProto, $server, $canServer, $httpsMode,
+                                                       "Testing expanding URL beginning with / ' .
+                                                       '(defaultProto: $protoDesc , wgServer: $server, wgCanonicalServer: $canServer, current request protocol: $mode )"
+                                               );
                                        }
                                }
                        }
index 1cf0e0f..af784bd 100644 (file)
@@ -18,7 +18,7 @@ class wfRemoveDotSegments extends MediaWikiTestCase {
         *
         * @return array
         */
-       public function providePaths() {
+       public static function providePaths() {
                return array(
                        array( '/a/b/c/./../../g', '/a/g' ),
                        array( 'mid/content=5/../6', 'mid/6' ),
index cd1a8db..673702e 100644 (file)
@@ -85,7 +85,7 @@ class wfUrlencodeTest extends MediaWikiTestCase {
         * If you want to add other HTTP server name, you will have to add a new
         * testing method much like the testEncodingUrlWith() method above. 
         */
-       public function provideURLS() {
+       public static function provideURLS() {
                return array(
                ### RFC 1738 chars      
                        // + is not safe
index 2f9d9f8..e455f0f 100644 (file)
@@ -75,27 +75,62 @@ class HooksTest extends MediaWikiTestCase {
 
                $this->assertEquals( 'bah', $foo, 'Standard static method' );
                $foo = 'Foo';
+
+               Hooks::clear( 'MediaWikiHooksTest001' );
+       }
+
+       public function testNewStyleHookInteraction() {
+               global $wgHooks;
+
+               $a = new NothingClass();
+               $b = new NothingClass();
+
+               // make sure to start with a clean slate
+               Hooks::clear( 'MediaWikiHooksTest001' );
+               unset( $wgHooks['MediaWikiHooksTest001'] );
+
+               $wgHooks['MediaWikiHooksTest001'][] = $a;
+               $this->assertTrue( Hooks::isRegistered( 'MediaWikiHooksTest001' ), 'Hook registered via $wgHooks should be noticed by Hooks::isRegistered' );
+
+               Hooks::register( 'MediaWikiHooksTest001', $b );
+               $this->assertEquals( 2, count( Hooks::getHandlers( 'MediaWikiHooksTest001' ) ), 'Hooks::getHandlers() should return hooks registered via wgHooks as well as Hooks::register' );
+
+               $foo = 'quux';
+               $bar = 'qaax';
+
+               Hooks::run( 'MediaWikiHooksTest001', array( &$foo, &$bar ) );
+               $this->assertEquals( 1, $a->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
+               $this->assertEquals( 1, $b->calls, 'Hooks::run() should run hooks registered via wgHooks as well as Hooks::register' );
+
+               // clean up
+               Hooks::clear( 'MediaWikiHooksTest001' );
+               unset( $wgHooks['MediaWikiHooksTest001'] );
        }
 }
 
 class NothingClass {
+       public $calls = 0;
+
        static public function someStatic( &$foo, &$bar ) {
                $foo = 'bah';
                return true;
        }
 
        public function someNonStatic( &$foo, &$bar ) {
+               $this->calls++;
                $foo = 'fOO';
                $bar = 'bAR';
                return true;
        }
 
        public function onMediaWikiHooksTest001( &$foo, &$bar ) {
+               $this->calls++;
                $foo = 'foo';
                return true;
        }
 
        public function someNonStaticWithData( $foo, &$bar ) {
+               $this->calls++;
                $bar = $foo;
                return true;
        }
index a18f792..65dd924 100644 (file)
@@ -2,29 +2,17 @@
 /** tests for includes/Html.php */
 
 class HtmlTest extends MediaWikiTestCase {
-       private static $oldLang;
-       private static $oldContLang;
-       private static $oldLanguageCode;
-       private static $oldNamespaces;
-       private static $oldHTML5;
 
-       public function setUp() {
-               global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
+       protected function setUp() {
+               parent::setUp();
 
-               // 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 );
+               $langCode = 'en';
+               $langObj = Language::factory( $langCode );
 
                // Hardcode namespaces during test runs,
                // so that html output based on existing namespaces
                // can be properly evaluated.
-               $wgContLang->setNamespaces( array(
+               $langObj->setNamespaces( array(
                        -2 => 'Media',
                        -1 => 'Special',
                        0  => '',
@@ -44,77 +32,102 @@ class HtmlTest extends MediaWikiTestCase {
                        100  => 'Custom',
                        101  => 'Custom_talk',
                ) );
+
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => $langCode,
+                       'wgContLang' => $langObj,
+                       'wgLang' => $langObj,
+                       'wgHtml5' => true,
+                       'wgWellFormedXml' => false,
+               ) );
        }
 
-       public function tearDown() {
-               global $wgLang, $wgContLang, $wgLanguageCode, $wgHTML5;
+       public function testElementBasics() {
+               global $wgWellFormedXml;
 
-               // Restore globals
-               $wgContLang->setNamespaces( self::$oldNamespaces );
-               $wgLang = self::$oldLang;
-               $wgContLang = self::$oldContLang;
-               $wgLanguageCode = self::$oldLanguageCode;
-               $wgHTML5 = self::$oldHTML5;
-       }
+               $this->assertEquals(
+                       '<img>',
+                       Html::element( 'img', null, '' ),
+                       'No close tag for short-tag elements'
+               );
 
-       /**
-        * 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;
+               $this->assertEquals(
+                       '<element></element>',
+                       Html::element( 'element', null, null ),
+                       'Close tag for empty element (null, null)'
+               );
+
+               $this->assertEquals(
+                       '<element></element>',
+                       Html::element( 'element', array(), '' ),
+                       'Close tag for empty element (array, string)'
+               );
+
+               $wgWellFormedXml = true;
+
+               $this->assertEquals(
+                       '<img />',
+                       Html::element( 'img', null, '' ),
+                       'Self-closing tag for short-tag elements (wgWellFormedXml = true)'
+               );
        }
 
        public function testExpandAttributesSkipsNullAndFalse() {
-               
+
                ### EMPTY ########
-               $this->AssertEmpty(
+               $this->assertEmpty(
                        Html::expandAttributes( array( 'foo' => null ) ),
                        'skip keys with null value'
                );
-               $this->AssertEmpty(
+               $this->assertEmpty(
                        Html::expandAttributes( array( 'foo' => false ) ),
                        'skip keys with false value'
                );
-               $this->AssertNotEmpty(
+               $this->assertNotEmpty(
                        Html::expandAttributes( array( 'foo' => '' ) ),
                        'keep keys with an empty string'
                );
        }
 
        public function testExpandAttributesForBooleans() {
-               global $wgHtml5;
-               $this->AssertEquals(
+               global $wgHtml5, $wgWellFormedXml;
+
+               $this->assertEquals(
                        '',
                        Html::expandAttributes( array( 'selected' => false ) ),
                        'Boolean attributes do not generates output when value is false'
                );
-               $this->AssertEquals(
+               $this->assertEquals(
                        '',
                        Html::expandAttributes( array( 'selected' => null ) ),
                        'Boolean attributes do not generates output when value is null'
                );
 
-               $this->AssertEquals(
-                       $wgHtml5 ? ' selected=""' : ' selected="selected"',
+               $this->assertEquals(
+                       ' selected',
                        Html::expandAttributes( array( 'selected' => true ) ),
-                       'Boolean attributes skip value output'
+                       'Boolean attributes have no value when value is true'
                );
-               $this->AssertEquals(
-                       $wgHtml5 ? ' selected=""' : ' selected="selected"',
+               $this->assertEquals(
+                       ' selected',
                        Html::expandAttributes( array( 'selected' ) ),
-                       'Boolean attributes (ex: selected) do not need a value'
+                       'Boolean attributes have no value when value is true (passed as numerical array)'
+               );
+
+               $wgWellFormedXml = true;
+
+               $this->assertEquals(
+                       ' selected=""',
+                       Html::expandAttributes( array( 'selected' => true ) ),
+                       'Boolean attributes have empty string value when value is true (wgWellFormedXml)'
+               );
+
+               $wgHtml5 = false;
+
+               $this->assertEquals(
+                       ' selected="selected"',
+                       Html::expandAttributes( array( 'selected' => true ) ),
+                       'Boolean attributes have their key as value when value is true (wgWellFormedXml, wgHTML5 = false)'
                );
        }
 
@@ -123,26 +136,51 @@ class HtmlTest extends MediaWikiTestCase {
         * Please note it output a string prefixed with a space!
         */
        public function testExpandAttributesVariousExpansions() {
+               global $wgWellFormedXml;
+
                ### NOT EMPTY ####
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' empty_string=""',
                        Html::expandAttributes( array( 'empty_string' => '' ) ),
-                       'Value with an empty string'
+                       'Empty string is always quoted'
                );
-               $this->AssertEquals(
+               $this->assertEquals(
+                       ' key=value',
+                       Html::expandAttributes( array( 'key' => 'value' ) ),
+                       'Simple string value needs no quotes'
+               );
+               $this->assertEquals(
+                       ' one=1',
+                       Html::expandAttributes( array( 'one' => 1 ) ),
+                       'Number 1 value needs no quotes'
+               );
+               $this->assertEquals(
+                       ' zero=0',
+                       Html::expandAttributes( array( 'zero' => 0 ) ),
+                       'Number 0 value needs no quotes'
+               );
+
+               $wgWellFormedXml = true;
+
+               $this->assertEquals(
+                       ' empty_string=""',
+                       Html::expandAttributes( array( 'empty_string' => '' ) ),
+                       'Attribtue values are always quoted (wgWellFormedXml): Empty string'
+               );
+               $this->assertEquals(
                        ' key="value"',
                        Html::expandAttributes( array( 'key' => 'value' ) ),
-                       'Value is a string'
+                       'Attribtue values are always quoted (wgWellFormedXml): Simple string'
                );
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' one="1"',
                        Html::expandAttributes( array( 'one' => 1 ) ),
-                       'Value is a numeric one'
+                       'Attribtue values are always quoted (wgWellFormedXml): Number 1'
                );
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' zero="0"',
                        Html::expandAttributes( array( 'zero' => 0 ) ),
-                       'Value is a numeric zero'
+                       'Attribtue values are always quoted (wgWellFormedXml): Number 0'
                );
        }
 
@@ -153,29 +191,29 @@ class HtmlTest extends MediaWikiTestCase {
         */
        public function testExpandAttributesListValueAttributes() {
                ### STRING VALUES
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' class="redundant spaces here"',
                        Html::expandAttributes( array( 'class' => ' redundant  spaces  here  ' ) ),
                        'Normalization should strip redundant spaces'
                );
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' class="foo bar"',
                        Html::expandAttributes( array( 'class' => 'foo bar foo bar bar' ) ),
                        'Normalization should remove duplicates in string-lists'
                );
                ### "EMPTY" ARRAY VALUES
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' class=""',
                        Html::expandAttributes( array( 'class' => array() ) ),
                        'Value with an empty array'
                );
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' class=""',
                        Html::expandAttributes( array( 'class' => array( null, '', ' ', '  ' ) ) ),
                        'Array with null, empty string and spaces'
                );
                ### NON-EMPTY ARRAY VALUES
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' class="foo bar"',
                        Html::expandAttributes( array( 'class' => array(
                                'foo',
@@ -186,7 +224,7 @@ class HtmlTest extends MediaWikiTestCase {
                        ) ) ),
                        'Normalization should remove duplicates in the array'
                );
-               $this->AssertEquals(
+               $this->assertEquals(
                        ' class="foo bar"',
                        Html::expandAttributes( array( 'class' => array(
                                'foo bar',
@@ -239,48 +277,48 @@ class HtmlTest extends MediaWikiTestCase {
 
        function testNamespaceSelector() {
                $this->assertEquals(
-                       '<select>' . "\n" .
-'<option value="0">(Main)</option>' . "\n" .
-'<option value="1">Talk</option>' . "\n" .
-'<option value="2">User</option>' . "\n" .
-'<option value="3">User talk</option>' . "\n" .
-'<option value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'<option value="100">Custom</option>' . "\n" .
-'<option value="101">Custom talk</option>' . "\n" .
+                       '<select id=namespace name=namespace>' . "\n" .
+'<option value=0>(Main)</option>' . "\n" .
+'<option value=1>Talk</option>' . "\n" .
+'<option value=2>User</option>' . "\n" .
+'<option value=3>User talk</option>' . "\n" .
+'<option value=4>MyWiki</option>' . "\n" .
+'<option value=5>MyWiki Talk</option>' . "\n" .
+'<option value=6>File</option>' . "\n" .
+'<option value=7>File talk</option>' . "\n" .
+'<option value=8>MediaWiki</option>' . "\n" .
+'<option value=9>MediaWiki talk</option>' . "\n" .
+'<option value=10>Template</option>' . "\n" .
+'<option value=11>Template talk</option>' . "\n" .
+'<option value=14>Category</option>' . "\n" .
+'<option value=15>Category talk</option>' . "\n" .
+'<option value=100>Custom</option>' . "\n" .
+'<option value=101>Custom talk</option>' . "\n" .
 '</select>',
                        Html::namespaceSelector(),
                        'Basic namespace selector without custom options'
                );
 
                $this->assertEquals(
-                       '<label for="mw-test-namespace">Select a namespace:</label>&#160;' .
-'<select id="mw-test-namespace" name="wpNamespace">' . "\n" .
-'<option value="all">all</option>' . "\n" .
-'<option value="0">(Main)</option>' . "\n" .
-'<option value="1">Talk</option>' . "\n" .
-'<option value="2" selected="">User</option>' . "\n" .
-'<option value="3">User talk</option>' . "\n" .
-'<option value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'<option value="100">Custom</option>' . "\n" .
-'<option value="101">Custom talk</option>' . "\n" .
+                       '<label for=mw-test-namespace>Select a namespace:</label>&#160;' .
+'<select id=mw-test-namespace name=wpNamespace>' . "\n" .
+'<option value=all>all</option>' . "\n" .
+'<option value=0>(Main)</option>' . "\n" .
+'<option value=1>Talk</option>' . "\n" .
+'<option value=2 selected>User</option>' . "\n" .
+'<option value=3>User talk</option>' . "\n" .
+'<option value=4>MyWiki</option>' . "\n" .
+'<option value=5>MyWiki Talk</option>' . "\n" .
+'<option value=6>File</option>' . "\n" .
+'<option value=7>File talk</option>' . "\n" .
+'<option value=8>MediaWiki</option>' . "\n" .
+'<option value=9>MediaWiki talk</option>' . "\n" .
+'<option value=10>Template</option>' . "\n" .
+'<option value=11>Template talk</option>' . "\n" .
+'<option value=14>Category</option>' . "\n" .
+'<option value=15>Category talk</option>' . "\n" .
+'<option value=100>Custom</option>' . "\n" .
+'<option value=101>Custom talk</option>' . "\n" .
 '</select>',
                        Html::namespaceSelector(
                                array( 'selected' => '2', 'all' => 'all', 'label' => 'Select a namespace:' ),
@@ -290,24 +328,24 @@ class HtmlTest extends MediaWikiTestCase {
                );
 
                $this->assertEquals(
-                       '<label>Select a namespace:</label>&#160;' .
-'<select>' . "\n" .
-'<option value="0">(Main)</option>' . "\n" .
-'<option value="1">Talk</option>' . "\n" .
-'<option value="2">User</option>' . "\n" .
-'<option value="3">User talk</option>' . "\n" .
-'<option value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'<option value="100">Custom</option>' . "\n" .
-'<option value="101">Custom talk</option>' . "\n" .
+                       '<label for=namespace>Select a namespace:</label>&#160;' .
+'<select id=namespace name=namespace>' . "\n" .
+'<option value=0>(Main)</option>' . "\n" .
+'<option value=1>Talk</option>' . "\n" .
+'<option value=2>User</option>' . "\n" .
+'<option value=3>User talk</option>' . "\n" .
+'<option value=4>MyWiki</option>' . "\n" .
+'<option value=5>MyWiki Talk</option>' . "\n" .
+'<option value=6>File</option>' . "\n" .
+'<option value=7>File talk</option>' . "\n" .
+'<option value=8>MediaWiki</option>' . "\n" .
+'<option value=9>MediaWiki talk</option>' . "\n" .
+'<option value=10>Template</option>' . "\n" .
+'<option value=11>Template talk</option>' . "\n" .
+'<option value=14>Category</option>' . "\n" .
+'<option value=15>Category talk</option>' . "\n" .
+'<option value=100>Custom</option>' . "\n" .
+'<option value=101>Custom talk</option>' . "\n" .
 '</select>',
                        Html::namespaceSelector(
                                array( 'label' => 'Select a namespace:' )
@@ -318,18 +356,18 @@ class HtmlTest extends MediaWikiTestCase {
 
        function testCanFilterOutNamespaces() {
                $this->assertEquals(
-'<select>' . "\n" .
-'<option value="2">User</option>' . "\n" .
-'<option value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
+'<select id=namespace name=namespace>' . "\n" .
+'<option value=2>User</option>' . "\n" .
+'<option value=4>MyWiki</option>' . "\n" .
+'<option value=5>MyWiki Talk</option>' . "\n" .
+'<option value=6>File</option>' . "\n" .
+'<option value=7>File talk</option>' . "\n" .
+'<option value=8>MediaWiki</option>' . "\n" .
+'<option value=9>MediaWiki talk</option>' . "\n" .
+'<option value=10>Template</option>' . "\n" .
+'<option value=11>Template talk</option>' . "\n" .
+'<option value=14>Category</option>' . "\n" .
+'<option value=15>Category talk</option>' . "\n" .
 '</select>',
                        Html::namespaceSelector(
                                array( 'exclude' => array( 0, 1, 3, 100, 101 ) )
@@ -340,23 +378,23 @@ class HtmlTest extends MediaWikiTestCase {
 
        function testCanDisableANamespaces() {
                $this->assertEquals(
-'<select>' . "\n" .
-'<option disabled="" value="0">(Main)</option>' . "\n" .
-'<option disabled="" value="1">Talk</option>' . "\n" .
-'<option disabled="" value="2">User</option>' . "\n" .
-'<option disabled="" value="3">User talk</option>' . "\n" .
-'<option disabled="" value="4">MyWiki</option>' . "\n" .
-'<option value="5">MyWiki Talk</option>' . "\n" .
-'<option value="6">File</option>' . "\n" .
-'<option value="7">File talk</option>' . "\n" .
-'<option value="8">MediaWiki</option>' . "\n" .
-'<option value="9">MediaWiki talk</option>' . "\n" .
-'<option value="10">Template</option>' . "\n" .
-'<option value="11">Template talk</option>' . "\n" .
-'<option value="14">Category</option>' . "\n" .
-'<option value="15">Category talk</option>' . "\n" .
-'<option value="100">Custom</option>' . "\n" .
-'<option value="101">Custom talk</option>' . "\n" .
+'<select id=namespace name=namespace>' . "\n" .
+'<option disabled value=0>(Main)</option>' . "\n" .
+'<option disabled value=1>Talk</option>' . "\n" .
+'<option disabled value=2>User</option>' . "\n" .
+'<option disabled value=3>User talk</option>' . "\n" .
+'<option disabled value=4>MyWiki</option>' . "\n" .
+'<option value=5>MyWiki Talk</option>' . "\n" .
+'<option value=6>File</option>' . "\n" .
+'<option value=7>File talk</option>' . "\n" .
+'<option value=8>MediaWiki</option>' . "\n" .
+'<option value=9>MediaWiki talk</option>' . "\n" .
+'<option value=10>Template</option>' . "\n" .
+'<option value=11>Template talk</option>' . "\n" .
+'<option value=14>Category</option>' . "\n" .
+'<option value=15>Category talk</option>' . "\n" .
+'<option value=100>Custom</option>' . "\n" .
+'<option value=101>Custom talk</option>' . "\n" .
 '</select>',
                        Html::namespaceSelector( array(
                                'disable' => array( 0, 1, 2, 3, 4 )
@@ -366,13 +404,12 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider providesHtml5InputTypes
+        * @dataProvider provideHtml5InputTypes
         */
        function testHtmlElementAcceptsNewHtml5TypesInHtml5Mode( $HTML5InputType ) {
-               $this->enableHTML5();
                $this->assertEquals(
-                       '<input type="' . $HTML5InputType . '" />',
-                       HTML::element( 'input', array( 'type' => $HTML5InputType ) ),
+                       '<input type=' . $HTML5InputType . '>',
+                       Html::element( 'input', array( 'type' => $HTML5InputType ) ),
                        'In HTML5, HTML::element() should accept type="' . $HTML5InputType . '"'
                );
        }
@@ -381,7 +418,7 @@ class HtmlTest extends MediaWikiTestCase {
         * List of input element types values introduced by HTML5
         * Full list at http://www.w3.org/TR/html-markup/input.html
         */
-       function providesHtml5InputTypes() {
+       function provideHtml5InputTypes() {
                $types = array(
                        'datetime',
                        'datetime-local',
@@ -405,35 +442,31 @@ class HtmlTest extends MediaWikiTestCase {
        }
 
        /**
-        * Test out Html::element drops default value
+        * Test out Html::element drops or enforces default value
         * @cover Html::dropDefaults
         * @dataProvider provideElementsWithAttributesHavingDefaultValues
         */
-       function testDropDefaults( $expected, $element, $message = '' ) {
-               $this->enableHTML5();
-               $this->assertEquals( $expected, $element, $message );
+       function testDropDefaults( $expected, $element, $attribs, $message = '' ) {
+               $this->assertEquals( $expected, Html::element( $element, $attribs ), $message );
        }
 
-       function provideElementsWithAttributesHavingDefaultValues() {
+       public static function provideElementsWithAttributesHavingDefaultValues() {
                # Use cases in a concise format:
                # <expected>, <element name>, <array of attributes> [, <message>]
                # Will be mapped to Html::element()
                $cases = array();
 
                ### Generic cases, match $attribDefault static array
-               $cases[] = array( '<area />',
+               $cases[] = array( '<area>',
                        'area', array( 'shape' => 'rect' )
                );
 
-               $cases[] = array( '<button></button>',
+               $cases[] = array( '<button type=submit></button>',
                        'button', array( 'formaction' => 'GET' )
                );
-               $cases[] = array( '<button></button>',
+               $cases[] = array( '<button type=submit></button>',
                        'button', array( 'formenctype' => 'application/x-www-form-urlencoded' )
                );
-               $cases[] = array( '<button></button>',
-                       'button', array( 'type' => 'submit' )
-               );
 
                $cases[] = array( '<canvas></canvas>',
                        'canvas', array( 'height' => '150' )
@@ -449,7 +482,7 @@ class HtmlTest extends MediaWikiTestCase {
                        'canvas', array( 'width' => 300 )
                );
 
-               $cases[] = array( '<command />',
+               $cases[] = array( '<command>',
                        'command', array( 'type' => 'command' )
                );
 
@@ -463,18 +496,18 @@ class HtmlTest extends MediaWikiTestCase {
                        'form', array( 'enctype' => 'application/x-www-form-urlencoded' )
                );
 
-               $cases[] = array( '<input />',
+               $cases[] = array( '<input>',
                        'input', array( 'formaction' => 'GET' )
                );
-               $cases[] = array( '<input />',
+               $cases[] = array( '<input>',
                        'input', array( 'type' => 'text' )
                );
 
-               $cases[] = array( '<keygen />',
+               $cases[] = array( '<keygen>',
                        'keygen', array( 'keytype' => 'rsa' )
                );
 
-               $cases[] = array( '<link />',
+               $cases[] = array( '<link>',
                        'link', array( 'media' => 'all' )
                );
 
@@ -499,37 +532,44 @@ class HtmlTest extends MediaWikiTestCase {
 
                ### SPECIFIC CASES
 
-               # <link type="text/css" />
-               $cases[] = array( '<link />',
+               # <link type="text/css">
+               $cases[] = array( '<link>',
                        'link', array( 'type' => 'text/css' )
                );
 
-               # <input /> specific handling
-               $cases[] = array( '<input type="checkbox" />',
+               # <input> specific handling
+               $cases[] = array( '<input type=checkbox>',
                        'input', array( 'type' => 'checkbox', 'value' => 'on' ),
                        'Default value "on" is stripped of checkboxes',
                );
-               $cases[] = array( '<input type="radio" />',
+               $cases[] = array( '<input type=radio>',
                        'input', array( 'type' => 'radio', 'value' => 'on' ),
                        'Default value "on" is stripped of radio buttons',
                );
-               $cases[] = array( '<input type="submit" value="Submit" />',
+               $cases[] = array( '<input type=submit value=Submit>',
                        'input', array( 'type' => 'submit', 'value' => 'Submit' ),
                        'Default value "Submit" is kept on submit buttons (for possible l10n issues)',
                );
-               $cases[] = array( '<input type="color" />',
+               $cases[] = array( '<input type=color>',
                        'input', array( 'type' => 'color', 'value' => '' ),
                );
-               $cases[] = array( '<input type="range" />',
+               $cases[] = array( '<input type=range>',
                        'input', array( 'type' => 'range', 'value' => '' ),
                );
 
-               # <select /> specifc handling
-               $cases[] = array( '<select multiple=""></select>',
+               # <button> specific handling
+               # see remarks on http://msdn.microsoft.com/en-us/library/ie/ms535211%28v=vs.85%29.aspx
+               $cases[] = array( '<button type=submit></button>',
+                       'button', array( 'type' => 'submit' ),
+                       'According to standard the default type is "submit". Depending on compatibility mode IE might use "button", instead.',
+               );
+
+               # <select> specifc handling
+               $cases[] = array( '<select multiple></select>',
                        'select', array( 'size' => '4', 'multiple' => true ),
                );
                # .. with numeric value
-               $cases[] = array( '<select multiple=""></select>',
+               $cases[] = array( '<select multiple></select>',
                        'select', array( 'size' => 4, 'multiple' => true ),
                );
                $cases[] = array( '<select></select>',
@@ -553,13 +593,13 @@ class HtmlTest extends MediaWikiTestCase {
                        "dropDefaults accepts values given as an array"
                );
 
-
                # Craft the Html elements
                $ret = array();
                foreach( $cases as $case ) {
                        $ret[] = array(
                                $case[0],
-                               Html::element( $case[1], $case[2] )
+                               $case[1], $case[2],
+                               isset( $case[3] ) ? $case[3] : ''
                        );
                }
                return $ret;
index 263383f..b49de65 100644 (file)
@@ -17,7 +17,7 @@ class HttpTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $ok, $msg );
        }
 
-       function cookieDomains() {
+       public static function cookieDomains() {
                return array(
                        array( false, "org"),
                        array( false, ".org"),
@@ -62,7 +62,7 @@ class HttpTest extends MediaWikiTestCase {
        /**
         * Feeds URI to test a long regular expression in Http::isValidURI
         */
-       function provideURI() {
+       public static function provideURI() {
                /** Format: 'boolean expectation', 'URI to test', 'Optional message' */
                return array(
                        array( false, '¿non sens before!! http://a', 'Allow anything before URI' ),
@@ -133,7 +133,8 @@ class HttpTest extends MediaWikiTestCase {
         * HTTP redirects).
         */
        function testRelativeRedirections() {
-               $h = new MWHttpRequestTester( 'http://oldsite/file.ext' );
+               $h = MWHttpRequestTester::factory( 'http://oldsite/file.ext' );
+
                # Forge a Location header
                $h->setRespHeaders( 'location', array(
                        'http://newsite/file.ext',
@@ -171,10 +172,42 @@ class HttpTest extends MediaWikiTestCase {
 }
 
 /**
- * Class to let us overwrite MWHttpREquest respHeaders variable
+ * Class to let us overwrite MWHttpRequest respHeaders variable
  */
 class MWHttpRequestTester extends MWHttpRequest {
+
+       // function derived from the MWHttpRequest factory function but 
+       // returns appropriate tester class here
+       public static function factory( $url, $options = null ) {
+               if ( !Http::$httpEngine ) {
+                       Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
+               } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
+                       throw new MWException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
+                                       'Http::$httpEngine is set to "curl"' );
+               }
+
+               switch( Http::$httpEngine ) {
+                       case 'curl':
+                               return new CurlHttpRequestTester( $url, $options );
+                       case 'php':
+                               if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
+                                       throw new MWException( __METHOD__ . ': allow_url_fopen needs to be enabled for pure PHP' .
+                                               ' http requests to work. If possible, curl should be used instead. See http://php.net/curl.' );
+                               }
+                               return new PhpHttpRequestTester( $url, $options );
+                       default:
+               }
+       }
+}
+
+class CurlHttpRequestTester extends CurlHttpRequest {
+       function setRespHeaders( $name, $value ) {
+               $this->respHeaders[$name] = $value;
+       }
+}
+
+class PhpHttpRequestTester extends PhpHttpRequest {
        function setRespHeaders( $name, $value ) {
-               $this->respHeaders[$name] = $value ;
+               $this->respHeaders[$name] = $value;
        }
 }
index f50b2fe..c4a6c55 100644 (file)
@@ -405,7 +405,7 @@ class IPTest extends MediaWikiTestCase {
        }
 
        /** Provider for testIPIsInRange() */
-       function provideIPsAndRanges() {
+       public static function provideIPsAndRanges() {
                        # Format: (expected boolean, address, range, optional message)
                return array(
                        # IPv4
@@ -443,7 +443,7 @@ class IPTest extends MediaWikiTestCase {
        /**
         * Provider for IP::splitHostAndPort()
         */
-       function provideSplitHostAndPort() {
+       public static function provideSplitHostAndPort() {
                return array(
                        array( false, '[', 'Unclosed square bracket' ),
                        array( false, '[::', 'Unclosed square bracket 2' ),
@@ -474,7 +474,7 @@ class IPTest extends MediaWikiTestCase {
        /**
         * Provider for IP::combineHostAndPort()
         */
-       function provideCombineHostAndPort() {
+       public static function provideCombineHostAndPort() {
                return array(
                        array( '[::1]', array( '::1', 2, 2 ), 'IPv6 default port' ),
                        array( '[::1]:2', array( '::1', 2, 3 ), 'IPv6 non-default port' ),
@@ -494,7 +494,7 @@ class IPTest extends MediaWikiTestCase {
        /**
         * Provider for IP::testSanitizeRange()
         */
-       function provideIPCIDRs() {
+       public static function provideIPCIDRs() {
                return array(
                        array( '35.56.31.252/16', '35.56.0.0/16', 'IPv4 range' ),
                        array( '135.16.21.252/24', '135.16.21.0/24', 'IPv4 range' ),
@@ -518,7 +518,7 @@ class IPTest extends MediaWikiTestCase {
        /**
         * Provider for IP::testPrettifyIP()
         */
-       function provideIPsToPrettify() {
+       public static function provideIPsToPrettify() {
                return array(
                        array( '0:0:0:0:0:0:0:0', '::' ),
                        array( '0:0:0::0:0:0', '::' ),
index 75dd18d..9b508f7 100644 (file)
@@ -3,31 +3,25 @@
 class JsonTest extends MediaWikiTestCase {
        
        function testPhpBug46944Test() {
-               
                $this->assertNotEquals( 
                        '\ud840\udc00',                 
                        strtolower( FormatJson::encode( "\xf0\xa0\x80\x80" ) ),
                        'Test encoding an broken json_encode character (U+20000)'
                );
-               
-               
+
        }
        
        function testDecodeVarTypes() {
-               
                $this->assertInternalType( 
                        'object',                       
                        FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}' ),
                        'Default to object'
                );
-               
+
                $this->assertInternalType( 
                        'array',                        
                        FormatJson::decode( '{"Name": "Cheeso", "Rank": 7}', true ),
                        'Optional array'
                );
-               
        }
-       
 }
-
index baf28b0..eb8912d 100644 (file)
@@ -4,24 +4,29 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
        protected $lang = null;
        protected $lc = null;
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
-               global $wgMemc, $wgRequest, $wgUser, $wgContLang;
 
-               $wgUser = new User;
-               $wgRequest = new FauxRequest( array() );
-               $wgMemc = new EmptyBagOStuff;
-               $wgContLang = Language::factory( 'tg' );
+               $this->setMwGlobals( array(
+                       'wgContLang' => Language::factory( 'tg' ),
+                       'wgLanguageCode' => 'tg',
+                       'wgDefaultLanguageVariant' => false,
+                       'wgMemc' => new EmptyBagOStuff,
+                       'wgRequest' => new FauxRequest( array() ),
+                       'wgUser' => new User,
+               ) );
+
                $this->lang = new LanguageToTest();
-               $this->lc = new TestConverter( $this->lang, 'tg',
-                                                                          array( 'tg', 'tg-latn' ) );
+               $this->lc = new TestConverter(
+                       $this->lang, 'tg',
+                       array( 'tg', 'tg-latn' )
+               );
        }
 
-       function tearDown() {
-               global $wgMemc;
-               unset( $wgMemc );
+       protected function tearDown() {
                unset( $this->lc );
                unset( $this->lang );
+
                parent::tearDown();
        }
 
@@ -71,7 +76,7 @@ class LanguageConverterTest extends MediaWikiLangTestCase {
        }
 
        function testGetPreferredVariantHeaderUserVsUrl() {
-               global $wgRequest, $wgUser, $wgContLang;
+               global $wgContLang, $wgRequest, $wgUser;
 
                $wgContLang = Language::factory( 'tg-latn' );
                $wgRequest->setVal( 'variant', 'tg' );
diff --git a/tests/phpunit/includes/LinkerTest.php b/tests/phpunit/includes/LinkerTest.php
new file mode 100644 (file)
index 0000000..df8e919
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+
+class LinkerTest extends MediaWikiLangTestCase {
+
+       /**
+        * @dataProvider provideCasesForUserLink
+        * @cover Linker::userLink
+        */
+       function testUserLink( $expected, $userId, $userName, $altUserName = false, $msg='' ) {
+               $this->setMwGlobals( array(
+                       'wgArticlePath' => '/wiki/$1',
+               ) );
+
+               $this->assertEquals( $expected,
+                       Linker::userLink( $userId, $userName, $altUserName, $msg )
+               );
+       }
+
+       function provideCasesForUserLink() {
+               # Format:
+               # - expected
+               # - userid
+               # - username
+               # - optional altUserName
+               # - optional message
+               return array(
+
+                       ### ANONYMOUS USER ########################################
+                       array(
+                               '<a href="/wiki/Special:Contributions/JohnDoe" title="Special:Contributions/JohnDoe" class="mw-userlink">JohnDoe</a>',
+                               0, 'JohnDoe', false,
+                       ),
+                       array(
+                               '<a href="/wiki/Special:Contributions/::1" title="Special:Contributions/::1" class="mw-userlink">::1</a>',
+                               0, '::1', false,
+                               'Anonymous with pretty IPv6'
+                       ),
+                       array(
+                               '<a href="/wiki/Special:Contributions/0:0:0:0:0:0:0:1" title="Special:Contributions/0:0:0:0:0:0:0:1" class="mw-userlink">::1</a>',
+                               0, '0:0:0:0:0:0:0:1', false,
+                               'Anonymous with almost pretty IPv6'
+                       ),
+                       array(
+                               '<a href="/wiki/Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" title="Special:Contributions/0000:0000:0000:0000:0000:0000:0000:0001" class="mw-userlink">::1</a>',
+                               0, '0000:0000:0000:0000:0000:0000:0000:0001', false,
+                               'Anonymous with full IPv6'
+                       ),
+                       array(
+                               '<a href="/wiki/Special:Contributions/::1" title="Special:Contributions/::1" class="mw-userlink">AlternativeUsername</a>',
+                               0, '::1', 'AlternativeUsername',
+                               'Anonymous with pretty IPv6 and an alternative username'
+                       ),
+
+                       # IPV4
+                       array(
+                               '<a href="/wiki/Special:Contributions/127.0.0.1" title="Special:Contributions/127.0.0.1" class="mw-userlink">127.0.0.1</a>',
+                               0, '127.0.0.1', false,
+                               'Anonymous with IPv4'
+                       ),
+                       array(
+                               '<a href="/wiki/Special:Contributions/127.0.0.1" title="Special:Contributions/127.0.0.1" class="mw-userlink">AlternativeUsername</a>',
+                               0, '127.0.0.1', 'AlternativeUsername',
+                               'Anonymous with IPv4 and an alternative username'
+                       ),
+
+                       ### Regular user ##########################################
+                       # TODO!
+               );
+       }
+}
index 4946200..7499272 100644 (file)
@@ -10,30 +10,36 @@ class LinksUpdateTest extends MediaWikiTestCase {
        function  __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
-               $this->tablesUsed = array_merge ( $this->tablesUsed,
-                                                                                       array( 'interwiki',
-
-                                                                                               'page_props',
-                                                                                               'pagelinks',
-                                                                                               'categorylinks',
-                                                                                               'langlinks',
-                                                                                               'externallinks',
-                                                                                               'imagelinks',
-                                                                                               'templatelinks',
-                                                                                               'iwlinks' ) );
+               $this->tablesUsed = array_merge( $this->tablesUsed,
+                       array(
+                               'interwiki',
+                               'page_props',
+                               'pagelinks',
+                               'categorylinks',
+                               'langlinks',
+                               'externallinks',
+                               'imagelinks',
+                               'templatelinks',
+                               'iwlinks'
+                       )
+               );
        }
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
                $dbw = wfGetDB( DB_MASTER );
-               $dbw->replace( 'interwiki',
-                                               array('iw_prefix'),
-                                               array( 'iw_prefix' => 'linksupdatetest',
-                                                      'iw_url' => 'http://testing.com/wiki/$1',
-                                                      'iw_api' => 'http://testing.com/w/api.php',
-                                                      'iw_local' => 0,
-                                                      'iw_trans' => 0,
-                                                      'iw_wikiid' => 'linksupdatetest',
-                                               ) );
+               $dbw->replace(
+                       'interwiki',
+                       array( 'iw_prefix' ),
+                       array(
+                               'iw_prefix' => 'linksupdatetest',
+                               'iw_url' => 'http://testing.com/wiki/$1',
+                               'iw_api' => 'http://testing.com/w/api.php',
+                               'iw_local' => 0,
+                               'iw_trans' => 0,
+                               'iw_wikiid' => 'linksupdatetest',
+                       )
+               );
        }
 
        protected function makeTitleAndParserOutput( $name, $id ) {
@@ -143,10 +149,13 @@ class LinksUpdateTest extends MediaWikiTestCase {
 
        #@todo: test recursive, too!
 
-       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, Array $expectedRows ) {
+       protected function assertLinksUpdate( Title $title, ParserOutput $parserOutput, $table, $fields, $condition, array $expectedRows ) {
                $update = new LinksUpdate( $title, $parserOutput );
 
+               //NOTE: make sure LinksUpdate does not generate warnings when called inside a transaction.
+               $update->beginTransaction();
                $update->doUpdate();
+               $update->commitTransaction();
 
                $this->assertSelect( $table, $fields, $condition, $expectedRows );
        }
index 5b26b89..c5a9dc1 100644 (file)
@@ -6,10 +6,11 @@
  */
 
 class LocalFileTest extends MediaWikiTestCase {
-       function setUp() {
-               global $wgCapitalLinks;
 
-               $wgCapitalLinks = true;
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgCapitalLinks', true );
 
                $info = array(
                        'name'            => 'test',
index ed5e760..f7be59f 100644 (file)
@@ -3,7 +3,6 @@
 class MWFunctionTest extends MediaWikiTestCase {
        
        function testCallUserFuncWorkarounds() {
-               
                $this->assertEquals( 
                        call_user_func( array( 'MWFunctionTest', 'someMethod' ) ),
                        MWFunction::call( 'MWFunctionTest::someMethod' )
@@ -12,9 +11,7 @@ class MWFunctionTest extends MediaWikiTestCase {
                        call_user_func( array( 'MWFunctionTest', 'someMethod' ), 'foo', 'bar', 'baz' ),
                        MWFunction::call( 'MWFunctionTest::someMethod', 'foo', 'bar', 'baz' )
                );
-               
-               
-               
+
                $this->assertEquals( 
                        call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array() ),
                        MWFunction::callArray( 'MWFunctionTest::someMethod', array() )
@@ -23,38 +20,33 @@ class MWFunctionTest extends MediaWikiTestCase {
                        call_user_func_array( array( 'MWFunctionTest', 'someMethod' ), array( 'foo', 'bar', 'baz' ) ),
                        MWFunction::callArray( 'MWFunctionTest::someMethod', array( 'foo', 'bar', 'baz' ) )
                );
-               
        }
        
        function testNewObjFunction() {
-               
                $arg1 = 'Foo';
                $arg2 = 'Bar';
                $arg3 = array( 'Baz' );
                $arg4 = new ExampleObject;
-               
+
                $args = array( $arg1, $arg2, $arg3, $arg4 );
-               
+
                $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
-               
                $this->assertEquals( 
                        MWFunction::newObj( 'MWBlankClass', $args )->args, 
                        $newObject->args
                );
-               
+
                $this->assertEquals( 
                        MWFunction::newObj( 'MWBlankClass', $args, true )->args, 
                        $newObject->args,
                        'Works even with PHP version < 5.1.3'
                );
-               
        }
        
        /**
         * @expectedException MWException
         */
        function testCallingParentFails() {
-               
                MWFunction::call( 'parent::foo' );
        }
        
@@ -62,7 +54,6 @@ class MWFunctionTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        function testCallingSelfFails() {
-               
                MWFunction::call( 'self::foo' );
        }
        
@@ -73,13 +64,12 @@ class MWFunctionTest extends MediaWikiTestCase {
 }
 
 class MWBlankClass {
-       
+
        public $args = array();
-       
+
        function __construct( $arg1, $arg2, $arg3, $arg4 ) {
                $this->args = array( $arg1, $arg2, $arg3, $arg4 );
        }
-       
 }
 
 class ExampleObject {
index 3b05d67..01d406a 100644 (file)
  *
  */
 class MWNamespaceTest extends MediaWikiTestCase {
-       /**
-        * Sets up the fixture, for example, opens a network connection.
-        * This method is called before a test is executed.
-        */
        protected function setUp() {
-       }
+               parent::setUp();
 
-       /**
-        * Tears down the fixture, for example, closes a network connection.
-        * This method is called after a test is executed.
-        */
-       protected function tearDown() {
+               $this->setMwGlobals( array(
+                       'wgContentNamespaces' => array( NS_MAIN ),
+                       'wgNamespacesWithSubpages' => array(
+                               NS_TALK           => true,
+                               NS_USER           => true,
+                               NS_USER_TALK      => true,
+                       ),
+                       'wgCapitalLinks' => true,
+                       'wgCapitalLinkOverrides' => array(),
+                       'wgNonincludableNamespaces' => array(),
+               ) );
        }
 
-
 #### START OF TESTS #########################################################
 
        /**
@@ -268,77 +269,36 @@ class MWNamespaceTest extends MediaWikiTestCase {
        public function testIsContent() {
                // NS_MAIN is a content namespace per DefaultSettings.php
                // and per function definition.
-               $this->assertIsContent( NS_MAIN );
 
-               global $wgContentNamespaces;
-
-               $saved = $wgContentNamespaces;
-
-               $wgContentNamespaces[] = NS_MAIN;
                $this->assertIsContent( NS_MAIN );
 
                // Other namespaces which are not expected to be content
-               if ( isset( $wgContentNamespaces[NS_MEDIA] ) ) {
-                       unset( $wgContentNamespaces[NS_MEDIA] );
-               }
-               $this->assertIsNotContent( NS_MEDIA );
 
-               if ( isset( $wgContentNamespaces[NS_SPECIAL] ) ) {
-                       unset( $wgContentNamespaces[NS_SPECIAL] );
-               }
+               $this->assertIsNotContent( NS_MEDIA );
                $this->assertIsNotContent( NS_SPECIAL );
-
-               if ( isset( $wgContentNamespaces[NS_TALK] ) ) {
-                       unset( $wgContentNamespaces[NS_TALK] );
-               }
                $this->assertIsNotContent( NS_TALK );
-
-               if ( isset( $wgContentNamespaces[NS_USER] ) ) {
-                       unset( $wgContentNamespaces[NS_USER] );
-               }
                $this->assertIsNotContent( NS_USER );
-
-               if ( isset( $wgContentNamespaces[NS_CATEGORY] ) ) {
-                       unset( $wgContentNamespaces[NS_CATEGORY] );
-               }
                $this->assertIsNotContent( NS_CATEGORY );
-
-               if ( isset( $wgContentNamespaces[100] ) ) {
-                       unset( $wgContentNamespaces[100] );
-               }
                $this->assertIsNotContent( 100 );
-
-               $wgContentNamespaces = $saved;
        }
 
        /**
         * Similar to testIsContent() but alters the $wgContentNamespaces
         * global variable.
         */
-       public function testIsContentWithAdditionsInWgContentNamespaces() {
-               // NS_MAIN is a content namespace per DefaultSettings.php
-               // and per function definition.
-               $this->assertIsContent( NS_MAIN );
+       public function testIsContentAdvanced() {
+               global $wgContentNamespaces;
 
-               // Tests that user defined namespace #252 is not content:
+               // Test that user defined namespace #252 is not content
                $this->assertIsNotContent( 252 );
 
-               # @todo FIXME: Is global saving really required for PHPUnit?
                // Bless namespace # 252 as a content namespace
-               global $wgContentNamespaces;
-               $savedGlobal = $wgContentNamespaces;
                $wgContentNamespaces[] = 252;
+
                $this->assertIsContent( 252 );
 
                // Makes sure NS_MAIN was not impacted
                $this->assertIsContent( NS_MAIN );
-
-               // Restore global
-               $wgContentNamespaces = $savedGlobal;
-
-               // Verify namespaces after global restauration
-               $this->assertIsContent( NS_MAIN  );
-               $this->assertIsNotContent( 252 );
        }
 
        public function testIsWatchable() {
@@ -356,31 +316,21 @@ class MWNamespaceTest extends MediaWikiTestCase {
        }
 
        public function testHasSubpages() {
+               global $wgNamespacesWithSubpages;
+
                // Special namespaces:
                $this->assertHasNotSubpages( NS_MEDIA   );
                $this->assertHasNotSubpages( NS_SPECIAL );
 
-               // namespaces without subpages
-               # save up global
-               global $wgNamespacesWithSubpages;
-               $saved = null;
-               if( array_key_exists( NS_MAIN, $wgNamespacesWithSubpages ) ) {
-                       $saved = $wgNamespacesWithSubpages[NS_MAIN];
-                       unset( $wgNamespacesWithSubpages[NS_MAIN] );
-               }
-
+               // Namespaces without subpages
                $this->assertHasNotSubpages( NS_MAIN );
 
                $wgNamespacesWithSubpages[NS_MAIN] = true;
                $this->assertHasSubpages( NS_MAIN );
+
                $wgNamespacesWithSubpages[NS_MAIN] = false;
                $this->assertHasNotSubpages( NS_MAIN );
 
-               # restore global
-               if( $saved !== null ) {
-                       $wgNamespacesWithSubpages[NS_MAIN] = $saved;
-               }
-
                // Some namespaces with subpages
                $this->assertHasSubpages( NS_TALK      );
                $this->assertHasSubpages( NS_USER      );
@@ -390,22 +340,25 @@ class MWNamespaceTest extends MediaWikiTestCase {
        /**
         */
        public function testGetContentNamespaces() {
+               global $wgContentNamespaces;
+
                $this->assertEquals(
                        array( NS_MAIN ),
                        MWNamespace::getcontentNamespaces(),
                        '$wgContentNamespaces is an array with only NS_MAIN by default'
                );
 
-               global $wgContentNamespaces;
 
-               $saved = $wgContentNamespaces;
                # test !is_array( $wgcontentNamespaces )
                $wgContentNamespaces = '';
                $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+
                $wgContentNamespaces = false;
                $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+
                $wgContentNamespaces = null;
                $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
+
                $wgContentNamespaces = 5;
                $this->assertEquals( NS_MAIN, MWNamespace::getcontentNamespaces() );
 
@@ -433,8 +386,6 @@ class MWNamespaceTest extends MediaWikiTestCase {
                        array( NS_MAIN, NS_USER, NS_CATEGORY ),
                        MWNamespace::getcontentNamespaces()
                );
-
-               $wgContentNamespaces = $saved;
        }
 
        /**
@@ -498,30 +449,26 @@ class MWNamespaceTest extends MediaWikiTestCase {
         *   $wgCapitalLinkOverrides = array(); by default
         *   $wgCapitalLinks = true; by default
         * This function test $wgCapitalLinks
-        *
+        *
         * Global setting correctness is tested against the NS_PROJECT and
         * NS_PROJECT_TALK namespaces since they are not hardcoded nor specials
         */
        public function testIsCapitalizedWithWgCapitalLinks() {
                global $wgCapitalLinks;
-               // Save the global to easily reset to MediaWiki default settings
-               $savedGlobal = $wgCapitalLinks;
 
-               $wgCapitalLinks = true;
                $this->assertIsCapitalized( NS_PROJECT      );
                $this->assertIsCapitalized( NS_PROJECT_TALK );
 
                $wgCapitalLinks = false;
+
                // hardcoded namespaces (see above function) are still capitalized:
                $this->assertIsCapitalized( NS_SPECIAL   );
                $this->assertIsCapitalized( NS_USER      );
                $this->assertIsCapitalized( NS_MEDIAWIKI );
+
                // setting is correctly applied
                $this->assertIsNotCapitalized( NS_PROJECT      );
                $this->assertIsNotCapitalized( NS_PROJECT_TALK );
-
-               // reset global state:
-               $wgCapitalLinks = $savedGlobal;
        }
 
        /**
@@ -532,12 +479,11 @@ class MWNamespaceTest extends MediaWikiTestCase {
         */
        public function testIsCapitalizedWithWgCapitalLinkOverrides() {
                global $wgCapitalLinkOverrides;
-               // Save the global to easily reset to MediaWiki default settings
-               $savedGlobal = $wgCapitalLinkOverrides;
 
                // Test default settings
                $this->assertIsCapitalized( NS_PROJECT      );
                $this->assertIsCapitalized( NS_PROJECT_TALK );
+
                // hardcoded namespaces (see above function) are capitalized:
                $this->assertIsCapitalized( NS_SPECIAL   );
                $this->assertIsCapitalized( NS_USER      );
@@ -547,20 +493,19 @@ class MWNamespaceTest extends MediaWikiTestCase {
                $wgCapitalLinkOverrides[NS_SPECIAL]   = false;
                $wgCapitalLinkOverrides[NS_USER]      = false;
                $wgCapitalLinkOverrides[NS_MEDIAWIKI] = false;
+
                $this->assertIsCapitalized( NS_SPECIAL   );
                $this->assertIsCapitalized( NS_USER      );
                $this->assertIsCapitalized( NS_MEDIAWIKI );
 
-               $wgCapitalLinkOverrides = $savedGlobal;
                $wgCapitalLinkOverrides[NS_PROJECT] = false;
                $this->assertIsNotCapitalized( NS_PROJECT );
+
                $wgCapitalLinkOverrides[NS_PROJECT] = true ;
                $this->assertIsCapitalized( NS_PROJECT );
-               unset(  $wgCapitalLinkOverrides[NS_PROJECT] );
-               $this->assertIsCapitalized( NS_PROJECT );
 
-               // reset global state:
-               $wgCapitalLinkOverrides = $savedGlobal;
+               unset( $wgCapitalLinkOverrides[NS_PROJECT] );
+               $this->assertIsCapitalized( NS_PROJECT );
        }
 
        public function testHasGenderDistinction() {
@@ -578,10 +523,10 @@ class MWNamespaceTest extends MediaWikiTestCase {
 
        public function testIsNonincludable() {
                global $wgNonincludableNamespaces;
+
                $wgNonincludableNamespaces = array( NS_USER );
 
                $this->assertTrue( MWNamespace::isNonincludable( NS_USER ) );
-
                $this->assertFalse( MWNamespace::isNonincludable( NS_TEMPLATE ) );
        }
 
index 20181fd..22450dc 100644 (file)
@@ -1,6 +1,14 @@
 <?php
 
 class MessageTest extends MediaWikiLangTestCase {
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgLang' => Language::factory( 'en' ),
+                       'wgForceUIMsgAsContentMsg' => array(),
+               ) );
+       }
 
        function testExists() {
                $this->assertTrue( wfMessage( 'mainpage' )->exists() );
@@ -43,16 +51,11 @@ class MessageTest extends MediaWikiLangTestCase {
 
        function testInContentLanguage() {
                global $wgLang, $wgForceUIMsgAsContentMsg;
-               $oldLang = $wgLang;
                $wgLang = Language::factory( 'fr' );
 
                $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg disabled' );
                $wgForceUIMsgAsContentMsg['testInContentLanguage'] = 'mainpage';
                $this->assertEquals( 'Accueil', wfMessage( 'mainpage' )->inContentLanguage()->plain(), 'ForceUIMsg enabled' );
-
-               /* Restore globals */
-               $wgLang = $oldLang;
-               unset( $wgForceUIMsgAsContentMsg['testInContentLanguage'] );
        }
 
        /**
index 59c955f..5b2adaf 100644 (file)
@@ -5,15 +5,19 @@ class ParserOptionsTest extends MediaWikiTestCase {
        private $popts;
        private $pcache;
 
-       function setUp() {
-               global $wgContLang, $wgUser, $wgLanguageCode;
-               $wgContLang = Language::factory( $wgLanguageCode );
-               $this->popts = ParserOptions::newFromUserAndLang( $wgUser, $wgContLang );
-               $this->pcache = ParserCache::singleton();
-       }
+       protected function setUp() {
+               global $wgLanguageCode, $wgUser;
+               parent::setUp();
+
+               $langObj = Language::factory( $wgLanguageCode );
+
+               $this->setMwGlobals( array(
+                       'wgContLang' => $langObj,
+                       'wgUseDynamicDates' => true,
+               ) );
 
-       function tearDown() {
-               parent::tearDown();
+               $this->popts = ParserOptions::newFromUserAndLang( $wgUser, $langObj );
+               $this->pcache = ParserCache::singleton();
        }
 
        /**
@@ -21,14 +25,12 @@ class ParserOptionsTest extends MediaWikiTestCase {
         * @group Database
         */
        function testGetParserCacheKeyWithDynamicDates() {
-               global $wgUseDynamicDates;
-               $wgUseDynamicDates = true;
-
                $title = Title::newFromText( "Some test article" );
                $page = WikiPage::factory( $title );
 
                $pcacheKeyBefore = $this->pcache->getKey( $page, $this->popts );
                $this->assertNotNull( $this->popts->getDateFormat() );
+
                $pcacheKeyAfter = $this->pcache->getKey( $page, $this->popts );
                $this->assertEquals( $pcacheKeyBefore, $pcacheKeyAfter );
        }
index f627458..910743e 100644 (file)
@@ -5,7 +5,8 @@
 
 class PathRouterTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
                $router = new PathRouter;
                $router->add("/wiki/$1");
                $this->basicRouter = $router;
@@ -182,7 +183,7 @@ class PathRouterTest extends MediaWikiTestCase {
                $this->assertEquals( $matches, array( 'title' => "Title_With Space" ) );
        }
 
-       public function dataRegexpChars() {
+       public static function provideRegexpChars() {
                return array(
                        array( "$" ),
                        array( "$1" ),
@@ -193,7 +194,7 @@ class PathRouterTest extends MediaWikiTestCase {
 
        /**
         * Make sure the router doesn't break on special characters like $ used in regexp replacements
-        * @dataProvider dataRegexpChars
+        * @dataProvider provideRegexpChars
         */
        public function testRegexpChars( $char ) {
                $matches = $this->basicRouter->parse( "/wiki/$char" );
index 0e12317..1a8a4cc 100644 (file)
@@ -7,7 +7,6 @@ class PreferencesTest extends MediaWikiTestCase {
 
        function __construct() {
                parent::__construct();
-               global $wgEnableEmail;
 
                $this->prefUsers['noemail'] = new User;
 
@@ -23,9 +22,12 @@ class PreferencesTest extends MediaWikiTestCase {
 
                $this->context = new RequestContext;
                $this->context->setTitle( Title::newFromText('PreferencesTest') );
+       }
+
+       protected function setUp() {
+               parent::setUp();
 
-               //some tests depends on email setting
-               $wgEnableEmail = true;
+               $this->setMwGlobals( 'wgEnableEmail', true );
        }
 
        /**
index fbf271c..5b99628 100644 (file)
@@ -57,16 +57,18 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @covers LogFormatter::getIRCActionText
         */
        function testIrcMsgForLogTypeBlock() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
                # block/block
                $this->assertIRCComment(
-                       $this->context->msg( 'blocklogentry', 'SomeTitle' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'blocklogentry', 'SomeTitle' )->plain() . $sep .  $this->user_comment,
                        'block', 'block',
                        array(),
                        $this->user_comment
                );
                # block/unblock
                $this->assertIRCComment(
-                       $this->context->msg( 'unblocklogentry', 'SomeTitle' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'unblocklogentry', 'SomeTitle' )->plain() . $sep .  $this->user_comment,
                        'block', 'unblock',
                        array(),
                        $this->user_comment
@@ -77,9 +79,11 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @covers LogFormatter::getIRCActionText
         */
        function testIrcMsgForLogTypeDelete() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
                # delete/delete
                $this->assertIRCComment(
-                       $this->context->msg( 'deletedarticle', 'SomeTitle' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'deletedarticle', 'SomeTitle' )->plain() . $sep .  $this->user_comment,
                        'delete', 'delete',
                        array(),
                        $this->user_comment
@@ -87,7 +91,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # delete/restore
                $this->assertIRCComment(
-                       $this->context->msg( 'undeletedarticle', 'SomeTitle' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'undeletedarticle', 'SomeTitle' )->plain() . $sep .  $this->user_comment,
                        'delete', 'restore',
                        array(),
                        $this->user_comment
@@ -128,10 +132,11 @@ class RecentChangeTest extends MediaWikiTestCase {
                        '4::target'  => $this->target->getPrefixedText(),
                        '5::noredir' => 0,
                );
+               $sep = $this->context->msg( 'colon-separator' )->text();
 
                # move/move
                $this->assertIRCComment(
-                       $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( '1movedto2', 'SomeTitle', 'TestTarget' )->plain() . $sep .  $this->user_comment,
                        'move', 'move',
                        $move_params,
                        $this->user_comment
@@ -139,7 +144,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # move/move_redir
                $this->assertIRCComment(
-                       $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( '1movedto2_redir', 'SomeTitle', 'TestTarget' )->plain() . $sep .  $this->user_comment,
                        'move', 'move_redir',
                        $move_params,
                        $this->user_comment
@@ -169,10 +174,11 @@ class RecentChangeTest extends MediaWikiTestCase {
                $protectParams = array(
                        '[edit=sysop] (indefinite) ‎[move=sysop] (indefinite)'
                );
+               $sep = $this->context->msg( 'colon-separator' )->text();
 
                # protect/protect
                $this->assertIRCComment(
-                       $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'protectedarticle', 'SomeTitle ' . $protectParams[0] )->plain() . $sep .  $this->user_comment,
                        'protect', 'protect',
                        $protectParams,
                        $this->user_comment
@@ -180,7 +186,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # protect/unprotect
                $this->assertIRCComment(
-                       $this->context->msg( 'unprotectedarticle', 'SomeTitle' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'unprotectedarticle', 'SomeTitle' )->plain() . $sep .  $this->user_comment,
                        'protect', 'unprotect',
                        array(),
                        $this->user_comment
@@ -188,7 +194,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # protect/modify
                $this->assertIRCComment(
-                       $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'modifiedarticleprotection', 'SomeTitle ' . $protectParams[0] )->plain() . $sep .  $this->user_comment,
                        'protect', 'modify',
                        $protectParams,
                        $this->user_comment
@@ -199,9 +205,11 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @covers LogFormatter::getIRCActionText
         */
        function testIrcMsgForLogTypeUpload() {
+               $sep = $this->context->msg( 'colon-separator' )->text();
+
                # upload/upload
                $this->assertIRCComment(
-                       $this->context->msg( 'uploadedimage', 'SomeTitle' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'uploadedimage', 'SomeTitle' )->plain() . $sep .  $this->user_comment,
                        'upload', 'upload',
                        array(),
                        $this->user_comment
@@ -209,7 +217,7 @@ class RecentChangeTest extends MediaWikiTestCase {
 
                # upload/overwrite
                $this->assertIRCComment(
-                       $this->context->msg( 'overwroteimage', 'SomeTitle' )->plain() . ': ' .  $this->user_comment,
+                       $this->context->msg( 'overwroteimage', 'SomeTitle' )->plain() . $sep .  $this->user_comment,
                        'upload', 'overwrite',
                        array(),
                        $this->user_comment
@@ -220,7 +228,8 @@ class RecentChangeTest extends MediaWikiTestCase {
         * @todo: Emulate these edits somehow and extract
         * raw edit summary from RecentChange object
         * --
-
+        */
+/*
        function testIrcMsgForBlankingAES() {
                // $this->context->msg( 'autosumm-blank', .. );
        }
@@ -237,8 +246,7 @@ class RecentChangeTest extends MediaWikiTestCase {
                // $this->context->msg( 'undo-summary', .. );
        }
 
-        * --
-        */
+*/
 
        /**
         * @param $expected String Expected IRC text without colors codes
diff --git a/tests/phpunit/includes/RequestContextTest.php b/tests/phpunit/includes/RequestContextTest.php
new file mode 100644 (file)
index 0000000..48cf6dc
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+class RequestContextTest extends MediaWikiTestCase {
+
+       /**
+        * Test the relationship between title and wikipage in RequestContext
+        */
+       public function testWikiPageTitle() {
+               $context = new RequestContext();
+
+               $curTitle = Title::newFromText( "A" );
+               $context->setTitle( $curTitle );
+               $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
+                       "When a title is first set WikiPage should be created on-demand for that title." );
+
+               $curTitle = Title::newFromText( "B" );
+               $context->setWikiPage( WikiPage::factory( $curTitle ) );
+               $this->assertTrue( $curTitle->equals( $context->getTitle() ),
+                       "Title must be updated when a new WikiPage is provided." );
+
+               $curTitle = Title::newFromText( "C" );
+               $context->setTitle( $curTitle );
+               $this->assertTrue( $curTitle->equals( $context->getWikiPage()->getTitle() ),
+                       "When a title is updated the WikiPage should be purged and recreated on-demand with the new title." );
+
+       }
+
+}
index ab70483..893d260 100644 (file)
@@ -15,7 +15,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
        }
 
        /* Provider Methods */
-       public function provideValidModules() {
+       public static function provideValidModules() {
                return array(
                        array( 'TEST.validModule1', new ResourceLoaderTestModule() ),
                );
@@ -61,7 +61,7 @@ class ResourceLoaderTest extends MediaWikiTestCase {
                $this->assertEquals( $modules, ResourceLoaderContext::expandModuleNames( $packed ), $desc );
        }
 
-       public function providePackedModules() {
+       public static function providePackedModules() {
                return array(
                        array(
                                'Example from makePackedModulesString doc comment',
index 8a7face..4fa42f3 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * Test class for Revision storage.
  *
+ * @group ContentHandler
  * @group Database
  * ^--- important, causes temporary tables to be used instead of the real database
  *
@@ -11,6 +12,9 @@
  */
 class RevisionStorageTest extends MediaWikiTestCase {
 
+       /**
+        * @var WikiPage $the_page
+        */
        var $the_page;
 
        function  __construct( $name = null, array $data = array(), $dataName = '' ) {
@@ -35,11 +39,38 @@ class RevisionStorageTest extends MediaWikiTestCase {
        }
 
        public function setUp() {
+               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+               parent::setUp();
+
+               $wgExtraNamespaces[ 12312 ] = 'Dummy';
+               $wgExtraNamespaces[ 12313 ] = 'Dummy_talk';
+
+               $wgNamespaceContentModels[ 12312 ] = 'DUMMY';
+               $wgContentHandlers[ 'DUMMY' ] = 'DummyContentHandlerForTesting';
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
                if ( !$this->the_page ) {
-                       $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page" );
+                       $this->the_page = $this->createPage( 'RevisionStorageTest_the_page', "just a dummy page", CONTENT_MODEL_WIKITEXT );
                }
        }
 
+       public function tearDown() {
+               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+               parent::tearDown();
+
+               unset( $wgExtraNamespaces[ 12312 ] );
+               unset( $wgExtraNamespaces[ 12313 ] );
+
+               unset( $wgNamespaceContentModels[ 12312 ] );
+               unset( $wgContentHandlers[ 'DUMMY' ] );
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
+       }
+
        protected function makeRevision( $props = null ) {
                if ( $props === null ) $props = array();
 
@@ -56,14 +87,27 @@ class RevisionStorageTest extends MediaWikiTestCase {
        }
 
        protected function createPage( $page, $text, $model = null ) {
-               if ( is_string( $page ) ) $page = Title::newFromText( $page );
-               if ( $page instanceof Title ) $page = new WikiPage( $page );
+               if ( is_string( $page ) ) {
+                       if ( !preg_match( '/:/', $page ) &&
+                               ( $model === null || $model === CONTENT_MODEL_WIKITEXT ) ) {
+
+                               $ns = $this->getDefaultWikitextNS();
+                               $page = MWNamespace::getCanonicalName( $ns ) . ':' . $page;
+                       }
+
+                       $page = Title::newFromText( $page );
+               }
+
+               if ( $page instanceof Title ) {
+                       $page = new WikiPage( $page );
+               }
 
                if ( $page->exists() ) {
                        $page->doDeleteArticle( "done" );
                }
 
-               $page->doEdit( $text, "testing", EDIT_NEW );
+               $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
+               $page->doEditContent( $content, "testing", EDIT_NEW );
 
                return $page;
        }
@@ -75,6 +119,8 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $this->assertEquals( $orig->getPage(), $rev->getPage() );
                $this->assertEquals( $orig->getTimestamp(), $rev->getTimestamp() );
                $this->assertEquals( $orig->getUser(), $rev->getUser() );
+               $this->assertEquals( $orig->getContentModel(), $rev->getContentModel() );
+               $this->assertEquals( $orig->getContentFormat(), $rev->getContentFormat() );
                $this->assertEquals( $orig->getSha1(), $rev->getSha1() );
        }
 
@@ -122,7 +168,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testNewFromArchiveRow()
        {
-               $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum' );
+               $page = $this->createPage( 'RevisionStorageTest_testNewFromArchiveRow', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
                $orig = $page->getRevision();
                $page->doDeleteArticle( 'test Revision::newFromArchiveRow' );
 
@@ -155,10 +201,10 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testFetchRevision()
        {
-               $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one' );
+               $page = $this->createPage( 'RevisionStorageTest_testFetchRevision', 'one', CONTENT_MODEL_WIKITEXT );
                $id1 = $page->getRevision()->getId();
 
-               $page->doEdit( 'two', 'second rev' );
+               $page->doEditContent( new WikitextContent( 'two' ), 'second rev' );
                $id2 = $page->getRevision()->getId();
 
                $res = Revision::fetchRevision( $page->getTitle() );
@@ -179,12 +225,21 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testSelectFields()
        {
+               global $wgContentHandlerUseDB;
+
                $fields = Revision::selectFields();
 
                $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
                $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields');
                $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields');
                $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields');
+
+               if ( $wgContentHandlerUseDB ) {
+                       $this->assertTrue( in_array( 'rev_content_model', $fields ),
+                                                               'missing rev_content_model in list of fields');
+                       $this->assertTrue( in_array( 'rev_content_format', $fields ),
+                                                               'missing rev_content_format in list of fields');
+               }
        }
 
        /**
@@ -205,12 +260,44 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testGetText()
        {
+               $this->hideDeprecated( 'Revision::getText' );
+
                $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
                $rev = Revision::newFromId( $orig->getId() );
 
                $this->assertEquals( 'hello hello.', $rev->getText() );
        }
 
+       /**
+        * @covers Revision::getContent
+        */
+       public function testGetContent_failure()
+       {
+               $rev = new Revision( array(
+                       'page'       =>  $this->the_page->getId(),
+                       'content_model' => $this->the_page->getContentModel(),
+                       'text_id' => 123456789, // not in the test DB
+               ) );
+
+               $this->assertNull( $rev->getContent(),
+                       "getContent() should return null if the revision's text blob could not be loaded." );
+
+               //NOTE: check this twice, once for lazy initialization, and once with the cached value.
+               $this->assertNull( $rev->getContent(),
+                       "getContent() should return null if the revision's text blob could not be loaded." );
+       }
+
+       /**
+        * @covers Revision::getContent
+        */
+       public function testGetContent()
+       {
+               $orig = $this->makeRevision( array( 'text' => 'hello hello.' ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( 'hello hello.', $rev->getContent()->getNativeData() );
+       }
+
        /**
         * @covers Revision::revText
         */
@@ -228,17 +315,57 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testGetRawText()
        {
+               $this->hideDeprecated( 'Revision::getRawText' );
+
                $orig = $this->makeRevision( array( 'text' => 'hello hello raw.' ) );
                $rev = Revision::newFromId( $orig->getId() );
 
                $this->assertEquals( 'hello hello raw.', $rev->getRawText() );
        }
+
+       /**
+        * @covers Revision::getContentModel
+        */
+       public function testGetContentModel()
+       {
+               global $wgContentHandlerUseDB;
+
+               if ( !$wgContentHandlerUseDB ) {
+                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
+               }
+
+               $orig = $this->makeRevision( array( 'text' => 'hello hello.',
+                                                                                       'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
+       }
+
+       /**
+        * @covers Revision::getContentFormat
+        */
+       public function testGetContentFormat()
+       {
+               global $wgContentHandlerUseDB;
+
+               if ( !$wgContentHandlerUseDB ) {
+                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
+               }
+
+               $orig = $this->makeRevision( array( 'text' => 'hello hello.',
+                                                                                       'content_model' => CONTENT_MODEL_JAVASCRIPT,
+                                                                                       'content_format' => CONTENT_FORMAT_JAVASCRIPT ) );
+               $rev = Revision::newFromId( $orig->getId() );
+
+               $this->assertEquals( CONTENT_FORMAT_JAVASCRIPT, $rev->getContentFormat() );
+       }
+
        /**
         * @covers Revision::isCurrent
         */
        public function testIsCurrent()
        {
-               $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum' );
+               $page = $this->createPage( 'RevisionStorageTest_testIsCurrent', 'Lorem Ipsum', CONTENT_MODEL_WIKITEXT );
                $rev1 = $page->getRevision();
 
                # @todo: find out if this should be true
@@ -247,7 +374,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $rev1x = Revision::newFromId( $rev1->getId() );
                $this->assertTrue( $rev1x->isCurrent() );
 
-               $page->doEdit( 'Bla bla', 'second rev' );
+               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ), 'second rev' );
                $rev2 = $page->getRevision();
 
                # @todo: find out if this should be true
@@ -265,12 +392,13 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testGetPrevious()
        {
-               $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious' );
+               $page = $this->createPage( 'RevisionStorageTest_testGetPrevious', 'Lorem Ipsum testGetPrevious', CONTENT_MODEL_WIKITEXT );
                $rev1 = $page->getRevision();
 
                $this->assertNull( $rev1->getPrevious() );
 
-               $page->doEdit( 'Bla bla', 'second rev testGetPrevious' );
+               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                                                               'second rev testGetPrevious' );
                $rev2 = $page->getRevision();
 
                $this->assertNotNull( $rev2->getPrevious() );
@@ -282,12 +410,13 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testGetNext()
        {
-               $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext' );
+               $page = $this->createPage( 'RevisionStorageTest_testGetNext', 'Lorem Ipsum testGetNext', CONTENT_MODEL_WIKITEXT );
                $rev1 = $page->getRevision();
 
                $this->assertNull( $rev1->getNext() );
 
-               $page->doEdit( 'Bla bla', 'second rev testGetNext' );
+               $page->doEditContent( ContentHandler::makeContent( 'Bla bla', $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                                                               'second rev testGetNext' );
                $rev2 = $page->getRevision();
 
                $this->assertNotNull( $rev1->getNext() );
@@ -299,18 +428,20 @@ class RevisionStorageTest extends MediaWikiTestCase {
         */
        public function testNewNullRevision()
        {
-               $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text' );
+               $page = $this->createPage( 'RevisionStorageTest_testNewNullRevision', 'some testing text', CONTENT_MODEL_WIKITEXT );
                $orig = $page->getRevision();
 
                $dbw = wfGetDB( DB_MASTER );
                $rev = Revision::newNullRevision( $dbw, $page->getId(), 'a null revision', false );
 
-               $this->assertNotEquals( $orig->getId(), $rev->getId(), 'new null revision shold have a different id from the original revision' );
-               $this->assertEquals( $orig->getTextId(), $rev->getTextId(), 'new null revision shold have the same text id as the original revision' );
-               $this->assertEquals( 'some testing text', $rev->getText() );
+               $this->assertNotEquals( $orig->getId(), $rev->getId(),
+                                                               'new null revision shold have a different id from the original revision' );
+               $this->assertEquals( $orig->getTextId(), $rev->getTextId(),
+                                                               'new null revision shold have the same text id as the original revision' );
+               $this->assertEquals( 'some testing text', $rev->getContent()->getNativeData() );
        }
 
-       public function dataUserWasLastToEdit() {
+       public static function provideUserWasLastToEdit() {
                return array(
                        array( #0
                                3, true, # actually the last edit
@@ -328,7 +459,7 @@ class RevisionStorageTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataUserWasLastToEdit
+        * @dataProvider provideUserWasLastToEdit
         */
        public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
                $userA = \User::newFromName( "RevisionStorageTest_userA" );
@@ -342,18 +473,23 @@ class RevisionStorageTest extends MediaWikiTestCase {
                        $userB = \User::createNew( $userB->getName() );
                }
 
+               $ns = $this->getDefaultWikitextNS();
+
                $dbw = wfGetDB( DB_MASTER );
                $revisions = array();
 
                // create revisions -----------------------------
-               $page = WikiPage::factory( Title::newFromText( 'RevisionStorageTest_testUserWasLastToEdit' ) );
+               $page = WikiPage::factory( Title::newFromText(
+                       'RevisionStorageTest_testUserWasLastToEdit', $ns ) );
 
                # zero
                $revisions[0] = new Revision( array(
                        'page' => $page->getId(),
+                       'title' => $page->getTitle(), // we need the title to determine the page's default content model
                        'timestamp' => '20120101000000',
                        'user' => $userA->getId(),
                        'text' => 'zero',
+                       'content_model' => CONTENT_MODEL_WIKITEXT,
                        'summary' => 'edit zero'
                ) );
                $revisions[0]->insertOn( $dbw );
@@ -361,9 +497,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
                # one
                $revisions[1] = new Revision( array(
                        'page' => $page->getId(),
+                       'title' => $page->getTitle(), // still need the title, because $page->getId() is 0 (there's no entry in the page table)
                        'timestamp' => '20120101000100',
                        'user' => $userA->getId(),
                        'text' => 'one',
+                       'content_model' => CONTENT_MODEL_WIKITEXT,
                        'summary' => 'edit one'
                ) );
                $revisions[1]->insertOn( $dbw );
@@ -371,9 +509,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
                # two
                $revisions[2] = new Revision( array(
                        'page' => $page->getId(),
+                       'title' => $page->getTitle(),
                        'timestamp' => '20120101000200',
                        'user' => $userB->getId(),
                        'text' => 'two',
+                       'content_model' => CONTENT_MODEL_WIKITEXT,
                        'summary' => 'edit two'
                ) );
                $revisions[2]->insertOn( $dbw );
@@ -381,9 +521,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
                # three
                $revisions[3] = new Revision( array(
                        'page' => $page->getId(),
+                       'title' => $page->getTitle(),
                        'timestamp' => '20120101000300',
                        'user' => $userA->getId(),
                        'text' => 'three',
+                       'content_model' => CONTENT_MODEL_WIKITEXT,
                        'summary' => 'edit three'
                ) );
                $revisions[3]->insertOn( $dbw );
@@ -391,9 +533,11 @@ class RevisionStorageTest extends MediaWikiTestCase {
                # four
                $revisions[4] = new Revision( array(
                        'page' => $page->getId(),
+                       'title' => $page->getTitle(),
                        'timestamp' => '20120101000200',
                        'user' => $userA->getId(),
                        'text' => 'zero',
+                       'content_model' => CONTENT_MODEL_WIKITEXT,
                        'summary' => 'edit four'
                ) );
                $revisions[4]->insertOn( $dbw );
diff --git a/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/RevisionStorageTest_ContentHandlerUseDB.php
new file mode 100644 (file)
index 0000000..c372c3e
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class RevisionTest_ContentHandlerUseDB extends RevisionStorageTest {
+       var $saveContentHandlerNoDB = null;
+
+       function setUp() {
+               global $wgContentHandlerUseDB;
+
+               $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
+
+               $wgContentHandlerUseDB = false;
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $page_table = $dbw->tableName( 'page' );
+               $revision_table = $dbw->tableName( 'revision' );
+               $archive_table = $dbw->tableName( 'archive' );
+
+               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
+                       $dbw->query( "alter table $page_table drop column page_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
+               }
+
+               parent::setUp();
+       }
+
+       function tearDown() {
+               global $wgContentHandlerUseDB;
+
+               parent::tearDown();
+
+               $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
+       }
+
+       /**
+        * @covers Revision::selectFields
+        */
+       public function testSelectFields() {
+               $fields = Revision::selectFields();
+
+               $this->assertTrue( in_array( 'rev_id', $fields ), 'missing rev_id in list of fields');
+               $this->assertTrue( in_array( 'rev_page', $fields ), 'missing rev_page in list of fields');
+               $this->assertTrue( in_array( 'rev_timestamp', $fields ), 'missing rev_timestamp in list of fields');
+               $this->assertTrue( in_array( 'rev_user', $fields ), 'missing rev_user in list of fields');
+
+               $this->assertFalse( in_array( 'rev_content_model', $fields ), 'missing rev_content_model in list of fields');
+               $this->assertFalse( in_array( 'rev_content_format', $fields ), 'missing rev_content_format in list of fields');
+       }
+
+       /**
+        * @covers Revision::getContentModel
+        */
+       public function testGetContentModel() {
+               try {
+                       $this->makeRevision( array( 'text' => 'hello hello.',
+                                                   'content_model' => CONTENT_MODEL_JAVASCRIPT ) );
+
+                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+                               . "\$wgContentHandlerUseDB disabled" );
+               } catch ( MWException $ex ) {
+                       $this->assertTrue( true ); // ok
+               }
+       }
+
+
+       /**
+        * @covers Revision::getContentFormat
+        */
+       public function testGetContentFormat() {
+               try {
+                       //@todo: change this to test failure on using a non-standard (but supported) format
+                       //       for a content model supported in the given location. As of 1.21, there are
+                       //       no alternative formats for any of the standard content models that could be
+                       //       used for this though.
+
+                       $this->makeRevision( array( 'text' => 'hello hello.',
+                                                   'content_model' => CONTENT_MODEL_JAVASCRIPT,
+                                                   'content_format' => 'text/javascript' ) );
+
+                       $this->fail( "Creating JavaScript content on a wikitext page should fail with "
+                               . "\$wgContentHandlerUseDB disabled" );
+               } catch ( MWException $ex ) {
+                       $this->assertTrue( true ); // ok
+               }
+       }
+
+}
+
+
index d7654db..9cddbe8 100644 (file)
@@ -1,25 +1,57 @@
 <?php
 
+/**
+ * @group ContentHandler
+ */
 class RevisionTest extends MediaWikiTestCase {
-       var $saveGlobals = array();
-
-       function setUp() {
+       protected function setUp() {
                global $wgContLang;
-               $wgContLang = Language::factory( 'en' );
-               $globalSet = array(
+
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgContLang' => Language::factory( 'en' ),
+                       'wgLanguageCode' => 'en',
                        'wgLegacyEncoding' => false,
                        'wgCompressRevisions' => false,
+
+                       'wgContentHandlerTextFallback' => 'ignore',
+               ) );
+
+               $this->mergeMwGlobalArrayValue(
+                       'wgExtraNamespaces',
+                       array(
+                               12312 => 'Dummy',
+                               12313 => 'Dummy_talk',
+                       )
                );
-               foreach ( $globalSet as $var => $data ) {
-                       $this->saveGlobals[$var] = $GLOBALS[$var];
-                       $GLOBALS[$var] = $data;
-               }
+
+               $this->mergeMwGlobalArrayValue(
+                       'wgNamespaceContentModels',
+                       array(
+                               12312 => 'testing',
+                       )
+               );
+
+               $this->mergeMwGlobalArrayValue(
+                       'wgContentHandlers',
+                       array(
+                               'testing' => 'DummyContentHandlerForTesting',
+                               'RevisionTestModifyableContent' => 'RevisionTestModifyableContentHandler',
+                       )
+               );
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
        }
 
        function tearDown() {
-               foreach ( $this->saveGlobals as $var => $data ) {
-                       $GLOBALS[$var] = $data;
-               }
+               global $wgContLang;
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
+
+               parent::tearDown();
        }
 
        function testGetRevisionText() {
@@ -107,7 +139,10 @@ class RevisionTest extends MediaWikiTestCase {
        }
 
        function testCompressRevisionTextUtf8Gzip() {
-               $GLOBALS['wgCompressRevisions'] = true;
+               global $wgCompressRevisions;
+
+               $wgCompressRevisions = true;
+
                $row = new stdClass;
                $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
                $row->old_flags = Revision::compressRevisionText( $row->old_text );
@@ -120,6 +155,298 @@ class RevisionTest extends MediaWikiTestCase {
                $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
                        Revision::getRevisionText( $row ), "getRevisionText" );
        }
+
+       # =================================================================================================================
+
+       /**
+        * @param string $text
+        * @param string $title
+        * @param string $model
+        * @return Revision
+        */
+       function newTestRevision( $text, $title = "Test", $model = CONTENT_MODEL_WIKITEXT, $format = null ) {
+               if ( is_string( $title ) ) {
+                       $title = Title::newFromText( $title );
+               }
+
+               $content = ContentHandler::makeContent( $text, $title, $model, $format );
+
+               $rev = new Revision(
+                       array(
+                               'id'         => 42,
+                               'page'       => 23,
+                               'title'      => $title,
+
+                               'content'    => $content,
+                               'length'     => $content->getSize(),
+                               'comment'    => "testing",
+                               'minor_edit' => false,
+
+                               'content_format' => $format,
+                       )
+               );
+
+               return $rev;
+       }
+
+       function dataGetContentModel() {
+               //NOTE: we expect the help namespace to always contain wikitext
+               return array(
+                       array( 'hello world', 'Help:Hello', null, null, CONTENT_MODEL_WIKITEXT ),
+                       array( 'hello world', 'User:hello/there.css', null, null, CONTENT_MODEL_CSS ),
+                       array( serialize('hello world'), 'Dummy:Hello', null, null, "testing" ),
+               );
+       }
+
+       /**
+        * @group Database
+        * @dataProvider dataGetContentModel
+        */
+       function testGetContentModel( $text, $title, $model, $format, $expectedModel ) {
+               $rev = $this->newTestRevision( $text, $title, $model, $format );
+
+               $this->assertEquals( $expectedModel, $rev->getContentModel() );
+       }
+
+       function dataGetContentFormat() {
+               //NOTE: we expect the help namespace to always contain wikitext
+               return array(
+                       array( 'hello world', 'Help:Hello', null, null, CONTENT_FORMAT_WIKITEXT ),
+                       array( 'hello world', 'Help:Hello', CONTENT_MODEL_CSS, null, CONTENT_FORMAT_CSS ),
+                       array( 'hello world', 'User:hello/there.css', null, null, CONTENT_FORMAT_CSS ),
+                       array( serialize('hello world'), 'Dummy:Hello', null, null, "testing" ),
+               );
+       }
+
+       /**
+        * @group Database
+        * @dataProvider dataGetContentFormat
+        */
+       function testGetContentFormat( $text, $title, $model, $format, $expectedFormat ) {
+               $rev = $this->newTestRevision( $text, $title, $model, $format );
+
+               $this->assertEquals( $expectedFormat, $rev->getContentFormat() );
+       }
+
+       function dataGetContentHandler() {
+               //NOTE: we expect the help namespace to always contain wikitext
+               return array(
+                       array( 'hello world', 'Help:Hello', null, null, 'WikitextContentHandler' ),
+                       array( 'hello world', 'User:hello/there.css', null, null, 'CssContentHandler' ),
+                       array( serialize('hello world'), 'Dummy:Hello', null, null, 'DummyContentHandlerForTesting' ),
+               );
+       }
+
+       /**
+        * @group Database
+        * @dataProvider dataGetContentHandler
+        */
+       function testGetContentHandler( $text, $title, $model, $format, $expectedClass ) {
+               $rev = $this->newTestRevision( $text, $title, $model, $format );
+
+               $this->assertEquals( $expectedClass, get_class( $rev->getContentHandler() ) );
+       }
+
+       function dataGetContent() {
+               //NOTE: we expect the help namespace to always contain wikitext
+               return array(
+                       array( 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
+                       array( serialize('hello world'), 'Hello', "testing", null, Revision::FOR_PUBLIC, serialize('hello world') ),
+                       array( serialize('hello world'), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, serialize('hello world') ),
+               );
+       }
+
+       /**
+        * @group Database
+        * @dataProvider dataGetContent
+        */
+       function testGetContent( $text, $title, $model, $format, $audience, $expectedSerialization ) {
+               $rev = $this->newTestRevision( $text, $title, $model, $format );
+               $content = $rev->getContent( $audience );
+
+               $this->assertEquals( $expectedSerialization, is_null( $content ) ? null : $content->serialize( $format ) );
+       }
+
+       function dataGetText() {
+               //NOTE: we expect the help namespace to always contain wikitext
+               return array(
+                       array( 'hello world', 'Help:Hello', null, null, Revision::FOR_PUBLIC, 'hello world' ),
+                       array( serialize('hello world'), 'Hello', "testing", null, Revision::FOR_PUBLIC, null ),
+                       array( serialize('hello world'), 'Dummy:Hello', null, null, Revision::FOR_PUBLIC, null ),
+               );
+       }
+
+       /**
+        * @group Database
+        * @dataProvider dataGetText
+        */
+       function testGetText( $text, $title, $model, $format, $audience, $expectedText ) {
+               $this->hideDeprecated( 'Revision::getText' );
+
+               $rev = $this->newTestRevision( $text, $title, $model, $format );
+
+               $this->assertEquals( $expectedText, $rev->getText( $audience ) );
+       }
+
+       /**
+        * @group Database
+        * @dataProvider dataGetText
+        */
+       function testGetRawText( $text, $title, $model, $format, $audience, $expectedText ) {
+               $this->hideDeprecated( 'Revision::getRawText' );
+
+               $rev = $this->newTestRevision( $text, $title, $model, $format );
+
+               $this->assertEquals( $expectedText, $rev->getRawText( $audience ) );
+       }
+
+
+       public function dataGetSize( ) {
+               return array(
+                       array( "hello world.", CONTENT_MODEL_WIKITEXT, 12 ),
+                       array( serialize( "hello world." ), "testing", 12 ),
+               );
+       }
+
+       /**
+        * @covers Revision::getSize
+        * @group Database
+        * @dataProvider dataGetSize
+        */
+       public function testGetSize( $text, $model, $expected_size )
+       {
+               $rev = $this->newTestRevision( $text, 'RevisionTest_testGetSize', $model );
+               $this->assertEquals( $expected_size, $rev->getSize() );
+       }
+
+       public function dataGetSha1( ) {
+               return array(
+                       array( "hello world.", CONTENT_MODEL_WIKITEXT, Revision::base36Sha1( "hello world." ) ),
+                       array( serialize( "hello world." ), "testing", Revision::base36Sha1( serialize( "hello world." ) ) ),
+               );
+       }
+
+       /**
+        * @covers Revision::getSha1
+        * @group Database
+        * @dataProvider dataGetSha1
+        */
+       public function testGetSha1( $text, $model, $expected_hash )
+       {
+               $rev = $this->newTestRevision( $text, 'RevisionTest_testGetSha1', $model );
+               $this->assertEquals( $expected_hash, $rev->getSha1() );
+       }
+
+       public function testConstructWithText() {
+               $this->hideDeprecated( "Revision::getText" );
+
+               $rev = new Revision( array(
+                                         'text' => 'hello world.',
+                                         'content_model' => CONTENT_MODEL_JAVASCRIPT
+                                    ));
+
+               $this->assertNotNull( $rev->getText(), 'no content text' );
+               $this->assertNotNull( $rev->getContent(), 'no content object available' );
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
+       }
+
+       public function testConstructWithContent() {
+               $this->hideDeprecated( "Revision::getText" );
+
+               $title = Title::newFromText( 'RevisionTest_testConstructWithContent' );
+
+               $rev = new Revision( array(
+                                         'content' => ContentHandler::makeContent( 'hello world.', $title, CONTENT_MODEL_JAVASCRIPT ),
+                                    ));
+
+               $this->assertNotNull( $rev->getText(), 'no content text' );
+               $this->assertNotNull( $rev->getContent(), 'no content object available' );
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContent()->getModel() );
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $rev->getContentModel() );
+       }
+
+       /**
+        * Tests whether $rev->getContent() returns a clone when needed.
+        *
+        * @group Database
+        */
+       function testGetContentClone( ) {
+               $content = new RevisionTestModifyableContent( "foo" );
+
+               $rev = new Revision(
+                       array(
+                               'id'         => 42,
+                               'page'       => 23,
+                               'title'      => Title::newFromText( "testGetContentClone_dummy" ),
+
+                               'content'    => $content,
+                               'length'     => $content->getSize(),
+                               'comment'    => "testing",
+                               'minor_edit' => false,
+                       )
+               );
+
+               $content = $rev->getContent( Revision::RAW );
+               $content->setText( "bar" );
+
+               $content2 = $rev->getContent( Revision::RAW );
+               $this->assertNotSame( $content, $content2, "expected a clone" ); // content is mutable, expect clone
+               $this->assertEquals( "foo", $content2->getText() ); // clone should contain the original text
+
+               $content2->setText( "bla bla" );
+               $this->assertEquals( "bar", $content->getText() ); // clones should be independent
+       }
+
+
+       /**
+        * Tests whether $rev->getContent() returns the same object repeatedly if appropriate.
+        *
+        * @group Database
+        */
+       function testGetContentUncloned() {
+               $rev = $this->newTestRevision( "hello", "testGetContentUncloned_dummy", CONTENT_MODEL_WIKITEXT );
+               $content = $rev->getContent( Revision::RAW );
+               $content2 = $rev->getContent( Revision::RAW );
+
+               // for immutable content like wikitext, this should be the same object
+               $this->assertSame( $content, $content2 );
+       }
+
+}
+
+class RevisionTestModifyableContent extends TextContent {
+       public function __construct( $text ) {
+               parent::__construct( $text, "RevisionTestModifyableContent" );
+       }
+
+       public function copy( ) {
+               return new RevisionTestModifyableContent( $this->mText );
+       }
+
+       public function getText() {
+               return $this->mText;
+       }
+
+       public function setText( $text ) {
+               $this->mText = $text;
+       }
+
 }
 
+class RevisionTestModifyableContentHandler extends TextContentHandler {
 
+       public function __construct( ) {
+               parent::__construct( "RevisionTestModifyableContent", array( CONTENT_FORMAT_TEXT ) );
+       }
+
+       public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               return new RevisionTestModifyableContent( $text );
+       }
+
+       public function makeEmptyContent() {
+               return new RevisionTestModifyableContent( '' );
+       }
+}
index 59ba0a0..45ea555 100644 (file)
@@ -5,23 +5,29 @@ class TestSample extends MediaWikiLangTestCase {
        /**
         * Anything that needs to happen before your tests should go here.
         */
-       function setUp() {
-               global $wgContLang;
+       protected function setUp() {
+               // Be sure to do call the parent setup and teardown functions.
+               // This makes sure that all the various cleanup and restorations
+               // happen as they should (including the restoration for setMwGlobals).
                parent::setUp();
 
-               /* For example, we need to set $wgContLang for creating a new Title */
-               $wgContLang = Language::factory( 'en' );
+               // This sets the globals and will restore them automatically
+               // after each test.
+               $this->setMwGlobals( array(
+                       'wgContLang' => Language::factory( 'en' ),
+                       'wgLanguageCode' => 'en',
+               ) );
        }
 
        /**
         * Anything cleanup you need to do should go here.
         */
-       function tearDown() {
+       protected function tearDown() {
                parent::tearDown();
        }
 
        /**
-        * Name tests so that PHPUnit can turn them into sentances when
+        * Name tests so that PHPUnit can turn them into sentences when
         * they run.  While MediaWiki isn't strictly an Agile Programming
         * project, you are encouraged to use the naming described under
         * "Agile Documentation" at
@@ -40,8 +46,10 @@ class TestSample extends MediaWikiLangTestCase {
        /**
         * If you want to run a the same test with a variety of data. use a data provider.
         * see: http://www.phpunit.de/manual/3.4/en/writing-tests-for-phpunit.html
+        *
+        * Note: Data providers are always called statically and outside setUp/tearDown!
         */
-       public function provideTitles() {
+       public static function provideTitles() {
                return array(
                        array( 'Text', NS_MEDIA, 'Media:Text' ),
                        array( 'Text', null, 'Text' ),
@@ -78,6 +86,7 @@ class TestSample extends MediaWikiLangTestCase {
         * example) as arguments to the next method (e.g. $title in
         * testTitleDepends is whatever testInitialCreatiion returned.)
         */
+
        /**
         * @depends testSetUpMainPageTitleForNextTest
         * See http://www.phpunit.de/manual/3.4/en/appendixes.annotations.html#appendixes.annotations.depends
index d67f905..012c49d 100644 (file)
@@ -2,7 +2,9 @@
 
 class SanitizerTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                AutoLoader::loadClass( 'Sanitizer' );
        }
 
@@ -60,6 +62,46 @@ class SanitizerTest extends MediaWikiTestCase {
                $this->assertEquals( UTF8_REPLACEMENT, Sanitizer::decodeCharReferences( "&#88888888888888;" ), 'Invalid numbered entity' );
        }
 
+       /**
+        * @cover Sanitizer::removeHTMLtags
+        * @dataProvider provideHtml5Tags
+        *
+        * @param String $tag Name of an HTML5 element (ie: 'video')
+        * @param Boolean $escaped Wheter sanitizer let the tag in or escape it (ie: '&lt;video&gt;')
+        */
+       function testRemovehtmltagsOnHtml5Tags( $tag, $escaped ) {
+               global $wgHtml5;
+
+               # Enable HTML5 mode
+               $save = $wgHtml5;
+               $wgHtml5 = true;
+
+               if( $escaped ) {
+                       $this->assertEquals( "&lt;$tag&gt;",
+                               Sanitizer::removeHTMLtags( "<$tag>" )
+                       );
+               } else {
+                       $this->assertEquals( "<$tag></$tag>\n",
+                               Sanitizer::removeHTMLtags( "<$tag>" )
+                       );
+               }
+               $wgHtml5 = $save;
+       }
+
+       /**
+        * Provide HTML5 tags
+        */
+       function provideHtml5Tags() {
+               $ESCAPED  = true; # We want tag to be escaped
+               $VERBATIM = false;  # We want to keep the tag
+               return array(
+                       array( 'data', $VERBATIM ),
+                       array( 'mark', $VERBATIM ),
+                       array( 'time', $VERBATIM ),
+                       array( 'video', $ESCAPED ),
+               );
+       }
+
        function testSelfClosingTag() {
                $GLOBALS['wgUseTidy'] = false;
                $this->assertEquals(
@@ -110,52 +152,27 @@ class SanitizerTest extends MediaWikiTestCase {
                $this->assertEquals( Sanitizer::decodeTagAttributes( 'foo=&foobar;' ), array( 'foo' => '&foobar;' ), 'Entity-like items are accepted' );
        }
 
-       function testDeprecatedAttributesDisabled() {
-               $GLOBALS['wgCleanupPresentationalAttributes'] = false;
-               $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 testDeprecatedAttributesUnaltered( $inputAttr, $inputEl ) {
+
+               $this->assertEquals( " $inputAttr", Sanitizer::fixTagAttributes( $inputAttr, $inputEl ) );
        }
 
-       function provideDeprecatedAttributes() {
+       public static 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="text-align: left;"'  , 'align=(left|right) on div elements gets converted to text-align' ),
-                       array( 'align="center"', 'div', ' style="text-align: center;"', 'align="center" on div elements gets converted to text-align' ),
-                       array( 'align="left"'  , 'p',   ' style="text-align: left;"'  , 'align on p elements gets converted to text-align' ),
-                       array( 'align="left"'  , 'h1',  ' style="text-align: left;"'  , 'align on h1 elements gets converted to text-align' ),
-                       array( 'align="left"'  , 'h1',  ' style="text-align: left;"'  , 'align on h1 elements gets converted to text-align' ),
-                       array( 'align="left"'  , 'caption',' style="text-align: left;"','align on caption elements gets converted to text-align' ),
-                       array( 'align="left"'  , 'tfoot',' style="text-align: left;"' , 'align on tfoot elements gets converted to text-align' ),
-                       array( 'align="left"'  , 'tbody',' style="text-align: left;"' , 'align on tbody elements gets converted to text-align' ),
-
-                       # <tr>
-                       array( 'align="right"' , 'tr', ' style="text-align: right;"' , 'align on table row get converted to text-align' ),
-                       array( 'align="center"', 'tr', ' style="text-align: center;"', 'align on table row get converted to text-align' ),
-                       array( 'align="left"'  , 'tr', ' style="text-align: left;"'  , 'align on table row get converted to text-align' ),
-
-                       #table
-                       array( 'align="left"'  , 'table', ' style="float: left;"'    , 'align on table converted to float' ),
-                       array( 'align="center"', 'table', ' style="margin-left: auto; margin-right: auto;"', 'align center on table converted to margins' ),
-                       array( 'align="right"' , 'table', ' style="float: right;"'   , 'align on table converted to float' ),
+                       array( 'clear="left"', 'br' ),
+                       array( 'clear="all"', 'br' ),
+                       array( 'width="100"', 'td' ),
+                       array( 'nowrap="true"', 'td' ),
+                       array( 'nowrap=""', 'td' ),
+                       array( 'align="right"', 'td' ),
+                       array( 'align="center"', 'table' ),
+                       array( 'align="left"', 'tr' ),
+                       array( 'align="center"', 'div' ),
+                       array( 'align="left"', 'h1' ),
+                       array( 'align="left"', 'span' ),
                );
        }
 
@@ -170,7 +187,7 @@ class SanitizerTest extends MediaWikiTestCase {
                );
        }
 
-       function provideCssCommentsFixtures() {
+       public static function provideCssCommentsFixtures() {
                /** array( <expected>, <css>, [message] ) */
                return array(
                        array( ' ', '/**/' ),
@@ -182,6 +199,15 @@ class SanitizerTest extends MediaWikiTestCase {
                                'Remove anything after a comment-start token' ),
                        array( '', "\\2f\\2a unifinished comment'",
                                'Remove anything after a backslash-escaped comment-start token' ),
+                       array( '/* insecure input */', 'filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'asdf.png\',sizingMethod=\'scale\');'),
+                       array( '/* insecure input */', '-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'asdf.png\',sizingMethod=\'scale\')";'),
+                       array( '/* insecure input */', 'width: expression(1+1);'),
+                       array( '/* insecure input */', 'background-image: image(asdf.png);'),
+                       array( '/* insecure input */', 'background-image: -webkit-image(asdf.png);'),
+                       array( '/* insecure input */', 'background-image: -moz-image(asdf.png);'),
+                       array( '/* insecure input */', 'background-image: image-set("asdf.png" 1x, "asdf.png" 2x);'),
+                       array( '/* insecure input */', 'background-image: -webkit-image-set("asdf.png" 1x, "asdf.png" 2x);'),
+                       array( '/* insecure input */', 'background-image: -moz-image-set("asdf.png" 1x, "asdf.png" 2x);'),
                );
        }
 }
index 8589c18..8f6aafa 100644 (file)
@@ -99,7 +99,8 @@ testBrowser           = "firefox"
        private $testSuites1 = null;
 
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
                if ( !defined( 'SELENIUMTEST' ) ) {
                        define( 'SELENIUMTEST', true );
                }
@@ -108,7 +109,7 @@ testBrowser                 = "firefox"
        /**
         * Clean up the temporary file used to store the selenium settings.
         */
-       public function tearDown() {
+       protected function tearDown() {
                if ( strlen( $this->tempFileName ) > 0 ) {
                        unlink( $this->tempFileName );
                        unset( $this->tempFileName );
index 57d3532..27c0bb5 100644 (file)
@@ -25,7 +25,9 @@ function getSiteParams( $conf, $wiki ) {
 class SiteConfigurationTest extends MediaWikiTestCase {
        var $mConf;
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                $this->mConf = new SiteConfiguration;
 
                $this->mConf->suffixes = array( 'wiki' );
@@ -92,7 +94,6 @@ class SiteConfigurationTest extends MediaWikiTestCase {
                $GLOBALS['global'] = array( 'global' => 'global' );
        }
 
-
        function testSiteFromDb() {
                $this->assertEquals(
                        array( 'wikipedia', 'en' ),
index 39ce6e3..03b94ae 100644 (file)
@@ -13,14 +13,14 @@ class TemplateCategoriesTest extends MediaWikiLangTestCase {
                $user = new User();
                $user->mRights = array( 'createpage', 'edit', 'purge' );
 
-               $status = $page->doEdit( '{{Categorising template}}', 'Create a page with a template', 0, false, $user );
+               $status = $page->doEditContent( new WikitextContent( '{{Categorising template}}' ), 'Create a page with a template', 0, false, $user );
                $this->assertEquals(
                        array()
                        , $title->getParentCategories()
                );
 
                $template = WikiPage::factory( Title::newFromText( 'Template:Categorising template' ) );
-               $status = $template->doEdit( '[[Category:Solved bugs]]', 'Add a category through a template', 0, false, $user );
+               $status = $template->doEditContent( new WikitextContent( '[[Category:Solved bugs]]' ), 'Add a category through a template', 0, false, $user );
 
                // Run the job queue
                $jobs = new RunJobs;
index cd027c5..07ce84b 100644 (file)
@@ -1,28 +1,22 @@
 <?php
 
 class TimeAdjustTest extends MediaWikiLangTestCase {
-       static $offset;
-
-       public function setUp() {
+       protected function setUp() {
                parent::setUp();
-               global $wgLocalTZoffset;
-               self::$offset = $wgLocalTZoffset;
 
-               $this->iniSet( 'precision', 15 );
-       }
+               $this->setMwGlobals( array(
+                       'wgLocalTZoffset' => null,
+                       'wgContLang' => Language::factory( 'en' ),
+                       'wgLanguageCode' => 'en',
+               ) );
 
-       public function tearDown() {
-               global $wgLocalTZoffset;
-               $wgLocalTZoffset = self::$offset;
-               parent::tearDown();
+               $this->iniSet( 'precision', 15 );
        }
 
        # Test offset usage for a given language::userAdjust
        function testUserAdjust() {
                global $wgLocalTZoffset, $wgContLang;
 
-               $wgContLang = $en = Language::factory( 'en' );
-
                #  Collection of parameters for Language_t_Offset.
                # Format: date to be formatted, localTZoffset value, expected date
                $userAdjust_tests = array(
@@ -43,7 +37,7 @@ class TimeAdjustTest extends MediaWikiLangTestCase {
 
                        $this->assertEquals(
                                strval( $data[2] ),
-                               strval( $en->userAdjust( $data[0], '' ) ),
+                               strval( $wgContLang->userAdjust( $data[0], '' ) ),
                                "User adjust {$data[0]} by {$data[1]} minutes should give {$data[2]}"
                        );
                }
index 231228f..6352160 100644 (file)
@@ -4,6 +4,16 @@
  * Tests timestamp parsing and output.
  */
 class TimestampTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+                       'wgLang' => Language::factory( 'en' ),
+               ) );
+       }
        /**
         * Test parsing of valid timestamps and outputing to MW format.
         * @dataProvider provideValidTimestamps
@@ -44,14 +54,14 @@ class TimestampTest extends MediaWikiTestCase {
         */
        function testHumanOutput() {
                $timestamp = new MWTimestamp( time() - 3600 );
-               $this->assertEquals( "1 hour ago", $timestamp->getHumanTimestamp()->toString() );
+               $this->assertEquals( "1 hour ago", $timestamp->getHumanTimestamp()->inLanguage( 'en' )->text() );
        }
 
        /**
         * Returns a list of valid timestamps in the format:
         * array( type, timestamp_of_type, timestamp_in_MW )
         */
-       function provideValidTimestamps() {
+       public static function provideValidTimestamps() {
                return array(
                        // Various formats
                        array( TS_UNIX, '1343761268', '20120731190108' ),
index aed658b..d430827 100644 (file)
@@ -1,8 +1,48 @@
 <?php
 
+/**
+ * @group ContentHandler
+ *
+ * @note: We don't make assumptions about the main namespace.
+ *        But we do expect the Help namespace to contain Wikitext.
+ *
+ */
 class TitleMethodsTest extends MediaWikiTestCase {
 
-       public function dataEquals() {
+       public function setup() {
+               global $wgContLang;
+
+               parent::setUp();
+
+               $this->mergeMwGlobalArrayValue(
+                       'wgExtraNamespaces',
+                       array(
+                               12302 => 'TEST-JS',
+                               12303 => 'TEST-JS_TALK',
+                       )
+               );
+
+               $this->mergeMwGlobalArrayValue(
+                       'wgNamespaceContentModels',
+                       array(
+                               12302 => CONTENT_MODEL_JAVASCRIPT,
+                       )
+               );
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
+       }
+
+       public function teardown() {
+               global $wgContLang;
+
+               parent::tearDown();
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
+       }
+
+       public static function provideEquals() {
                return array(
                        array( 'Main Page', 'Main Page', true ),
                        array( 'Main Page', 'Not The Main Page', false ),
@@ -15,7 +55,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataEquals
+        * @dataProvider provideEquals
         */
        public function testEquals( $titleA, $titleB, $expectedBool ) {
                $titleA = Title::newFromText( $titleA );
@@ -25,7 +65,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedBool, $titleB->equals( $titleA ) );
        }
 
-       public function dataInNamespace() {
+       public static function provideInNamespace() {
                return array(
                        array( 'Main Page', NS_MAIN, true ),
                        array( 'Main Page', NS_TALK, false ),
@@ -39,7 +79,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataInNamespace
+        * @dataProvider provideInNamespace
         */
        public function testInNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
@@ -54,7 +94,7 @@ class TitleMethodsTest extends MediaWikiTestCase {
                $this->assertFalse( $mainpage->inNamespaces( array( NS_PROJECT, NS_TEMPLATE ) ) );
        }
 
-       public function dataHasSubjectNamespace() {
+       public static function provideHasSubjectNamespace() {
                return array(
                        array( 'Main Page', NS_MAIN, true ),
                        array( 'Main Page', NS_TALK, true ),
@@ -68,18 +108,59 @@ class TitleMethodsTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataHasSubjectNamespace
+        * @dataProvider provideHasSubjectNamespace
         */
        public function testHasSubjectNamespace( $title, $ns, $expectedBool ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->hasSubjectNamespace( $ns ) );
        }
 
-       public function dataIsCssOrJsPage() {
+       public function dataGetContentModel() {
+               return array(
+                       array( 'Help:Foo', CONTENT_MODEL_WIKITEXT ),
+                       array( 'Help:Foo.js', CONTENT_MODEL_WIKITEXT ),
+                       array( 'Help:Foo/bar.js', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo.js', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo/bar.js', CONTENT_MODEL_JAVASCRIPT ),
+                       array( 'User:Foo/bar.css', CONTENT_MODEL_CSS ),
+                       array( 'User talk:Foo/bar.css', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo/bar.js.xxx', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo/bar.xxx', CONTENT_MODEL_WIKITEXT ),
+                       array( 'MediaWiki:Foo.js', CONTENT_MODEL_JAVASCRIPT ),
+                       array( 'MediaWiki:Foo.css', CONTENT_MODEL_CSS ),
+                       array( 'MediaWiki:Foo/bar.css', CONTENT_MODEL_CSS ),
+                       array( 'MediaWiki:Foo.JS', CONTENT_MODEL_WIKITEXT ),
+                       array( 'MediaWiki:Foo.CSS', CONTENT_MODEL_WIKITEXT ),
+                       array( 'MediaWiki:Foo.css.xxx', CONTENT_MODEL_WIKITEXT ),
+                       array( 'TEST-JS:Foo', CONTENT_MODEL_JAVASCRIPT ),
+                       array( 'TEST-JS:Foo.js', CONTENT_MODEL_JAVASCRIPT ),
+                       array( 'TEST-JS:Foo/bar.js', CONTENT_MODEL_JAVASCRIPT ),
+                       array( 'TEST-JS_TALK:Foo.js', CONTENT_MODEL_WIKITEXT ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetContentModel
+        */
+       public function testGetContentModel( $title, $expectedModelId ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedModelId, $title->getContentModel() );
+       }
+
+       /**
+        * @dataProvider dataGetContentModel
+        */
+       public function testHasContentModel( $title, $expectedModelId ) {
+               $title = Title::newFromText( $title );
+               $this->assertTrue( $title->hasContentModel( $expectedModelId ) );
+       }
+
+       public static function provideIsCssOrJsPage() {
                return array(
-                       array( 'Foo', false ),
-                       array( 'Foo.js', false ),
-                       array( 'Foo/bar.js', false ),
+                       array( 'Help:Foo', false ),
+                       array( 'Help:Foo.js', false ),
+                       array( 'Help:Foo/bar.js', false ),
                        array( 'User:Foo', false ),
                        array( 'User:Foo.js', false ),
                        array( 'User:Foo/bar.js', false ),
@@ -92,11 +173,13 @@ class TitleMethodsTest extends MediaWikiTestCase {
                        array( 'MediaWiki:Foo.JS', false ),
                        array( 'MediaWiki:Foo.CSS', false ),
                        array( 'MediaWiki:Foo.css.xxx', false ),
+                       array( 'TEST-JS:Foo', false ),
+                       array( 'TEST-JS:Foo.js', false ),
                );
        }
 
        /**
-        * @dataProvider dataIsCssOrJsPage
+        * @dataProvider provideIsCssOrJsPage
         */
        public function testIsCssOrJsPage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
@@ -104,11 +187,11 @@ class TitleMethodsTest extends MediaWikiTestCase {
        }
 
 
-       public function dataIsCssJsSubpage() {
+       public static function provideIsCssJsSubpage() {
                return array(
-                       array( 'Foo', false ),
-                       array( 'Foo.js', false ),
-                       array( 'Foo/bar.js', false ),
+                       array( 'Help:Foo', false ),
+                       array( 'Help:Foo.js', false ),
+                       array( 'Help:Foo/bar.js', false ),
                        array( 'User:Foo', false ),
                        array( 'User:Foo.js', false ),
                        array( 'User:Foo/bar.js', true ),
@@ -119,21 +202,23 @@ class TitleMethodsTest extends MediaWikiTestCase {
                        array( 'MediaWiki:Foo.js', false ),
                        array( 'User:Foo/bar.JS', false ),
                        array( 'User:Foo/bar.CSS', false ),
+                       array( 'TEST-JS:Foo', false ),
+                       array( 'TEST-JS:Foo.js', false ),
                );
        }
 
        /**
-        * @dataProvider dataIsCssJsSubpage
+        * @dataProvider provideIsCssJsSubpage
         */
        public function testIsCssJsSubpage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->isCssJsSubpage() );
        }
 
-       public function dataIsCssSubpage() {
+       public static function provideIsCssSubpage() {
                return array(
-                       array( 'Foo', false ),
-                       array( 'Foo.css', false ),
+                       array( 'Help:Foo', false ),
+                       array( 'Help:Foo.css', false ),
                        array( 'User:Foo', false ),
                        array( 'User:Foo.js', false ),
                        array( 'User:Foo.css', false ),
@@ -143,17 +228,17 @@ class TitleMethodsTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataIsCssSubpage
+        * @dataProvider provideIsCssSubpage
         */
        public function testIsCssSubpage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->isCssSubpage() );
        }
 
-       public function dataIsJsSubpage() {
+       public static function provideIsJsSubpage() {
                return array(
-                       array( 'Foo', false ),
-                       array( 'Foo.css', false ),
+                       array( 'Help:Foo', false ),
+                       array( 'Help:Foo.css', false ),
                        array( 'User:Foo', false ),
                        array( 'User:Foo.js', false ),
                        array( 'User:Foo.css', false ),
@@ -163,18 +248,18 @@ class TitleMethodsTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataIsJsSubpage
+        * @dataProvider provideIsJsSubpage
         */
        public function testIsJsSubpage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
                $this->assertEquals( $expectedBool, $title->isJsSubpage() );
        }
 
-       public function dataIsWikitextPage() {
+       public static function provideIsWikitextPage() {
                return array(
-                       array( 'Foo', true ),
-                       array( 'Foo.js', true ),
-                       array( 'Foo/bar.js', true ),
+                       array( 'Help:Foo', true ),
+                       array( 'Help:Foo.js', true ),
+                       array( 'Help:Foo/bar.js', true ),
                        array( 'User:Foo', true ),
                        array( 'User:Foo.js', true ),
                        array( 'User:Foo/bar.js', false ),
@@ -187,11 +272,14 @@ class TitleMethodsTest extends MediaWikiTestCase {
                        array( 'MediaWiki:Foo/bar.css', false ),
                        array( 'User:Foo/bar.JS', true ),
                        array( 'User:Foo/bar.CSS', true ),
+                       array( 'TEST-JS:Foo', false ),
+                       array( 'TEST-JS:Foo.js', false ),
+                       array( 'TEST-JS_TALK:Foo.js', true ),
                );
        }
 
        /**
-        * @dataProvider dataIsWikitextPage
+        * @dataProvider provideIsWikitextPage
         */
        public function testIsWikitextPage( $title, $expectedBool ) {
                $title = Title::newFromText( $title );
index f62ac5d..3a30b12 100644 (file)
@@ -4,31 +4,44 @@
  * @group Database
  */
 class TitlePermissionTest extends MediaWikiLangTestCase {
-       protected $title;
 
        /**
-        * @var User
+        * @var string
         */
-       protected $user, $anonUser, $userUser, $altUser;
+       protected $userName, $altUserName;
 
        /**
-        * @var string
+        * @var Title
         */
-       protected $userName, $altUserName;
+       protected $title;
 
-       function setUp() {
-               global $wgLocaltimezone, $wgLocalTZoffset, $wgMemc, $wgContLang, $wgLang;
-               parent::setUp();
+       /**
+        * @var User
+        */
+       protected $user, $anonUser, $userUser, $altUser;
 
-               if(!$wgMemc) {
-                       $wgMemc = new EmptyBagOStuff;
-               }
-               $wgContLang = $wgLang = Language::factory( 'en' );
+       protected function setUp() {
+               parent::setUp();
 
-               $this->userName = "Useruser";
-               $this->altUserName = "Altuseruser";
-               date_default_timezone_set( $wgLocaltimezone );
-               $wgLocalTZoffset = date( "Z" ) / 60;
+               $langObj = Language::factory( 'en' );
+               $localZone = 'UTC';
+               $localOffset = date( 'Z' ) / 60;
+
+               $this->setMwGlobals( array(
+                       'wgMemc' => new EmptyBagOStuff,
+                       'wgContLang' => $langObj,
+                       'wgLanguageCode' => 'en',
+                       'wgLang' => $langObj,
+                       'wgLocaltimezone' => $localZone,
+                       'wgLocalTZoffset' => $localOffset,
+                       'wgNamespaceProtection' => array(
+                               NS_MEDIAWIKI => 'editinterface',
+                       ),
+               ) );
+
+               $this->userName = 'Useruser';
+               $this->altUserName = 'Altuseruser';
+               date_default_timezone_set( $localZone );
 
                $this->title = Title::makeTitle( NS_MAIN, "Main Page" );
                if ( !isset( $this->userUser ) || !( $this->userUser instanceOf User ) ) {
@@ -53,10 +66,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->user = $this->userUser;
                }
-       }
 
-       function tearDown() {
-               parent::tearDown();
        }
 
        function setUserPerm( $perm ) {
@@ -81,9 +91,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                } else {
                        $this->user = $this->altUser;
                }
-
-               global $wgUser;
-               $wgUser = $this->user;
        }
 
        function testQuickPermissions() {
@@ -225,30 +232,35 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->runGroupPermissions( 'move', array( array( 'movenotallowedfile' ), array( 'movenotallowed' ) ),
                        array( array( 'movenotallowedfile' ), array( 'movenologintext' ) ) );
 
-               $this->setTitle( NS_MAIN );
-               $this->setUser( 'anon' );
-               $this->setUserPerm( "move" );
-               $this->runGroupPermissions( 'move', array(  ) );
+               if ( $this->isWikitextNS( NS_MAIN ) ) {
+                       //NOTE: some content models don't allow moving
+                       //@todo: find a Wikitext namespace for testing
 
-               $this->setUserPerm( "" );
-               $this->runGroupPermissions( 'move', array( array( 'movenotallowed' ) ),
-                       array( array( 'movenologintext' ) ) );
+                       $this->setTitle( NS_MAIN );
+                       $this->setUser( 'anon' );
+                       $this->setUserPerm( "move" );
+                       $this->runGroupPermissions( 'move', array(  ) );
 
-               $this->setUser( $this->userName );
-               $this->setUserPerm( "" );
-               $this->runGroupPermissions( 'move', array( array( 'movenotallowed' ) ) );
+                       $this->setUserPerm( "" );
+                       $this->runGroupPermissions( 'move', array( array( 'movenotallowed' ) ),
+                               array( array( 'movenologintext' ) ) );
 
-               $this->setUserPerm( "move" );
-               $this->runGroupPermissions( 'move', array( ) );
+                       $this->setUser( $this->userName );
+                       $this->setUserPerm( "" );
+                       $this->runGroupPermissions( 'move', array( array( 'movenotallowed' ) ) );
 
-               $this->setUser( 'anon' );
-               $this->setUserPerm( 'move' );
-               $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
-               $this->assertEquals( array( ), $res );
+                       $this->setUserPerm( "move" );
+                       $this->runGroupPermissions( 'move', array( ) );
 
-               $this->setUserPerm( '' );
-               $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
-               $this->assertEquals( array( array( 'movenotallowed' ) ), $res );
+                       $this->setUser( 'anon' );
+                       $this->setUserPerm( 'move' );
+                       $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
+                       $this->assertEquals( array( ), $res );
+
+                       $this->setUserPerm( '' );
+                       $res = $this->title->getUserPermissionsErrors( 'move-target', $this->user );
+                       $this->assertEquals( array( array( 'movenotallowed' ) ), $res );
+               }
 
                $this->setTitle( NS_USER );
                $this->setUser( $this->userName );
@@ -282,8 +294,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                                                                        array( array( 'badaccess-group0' ), array( 'protect-cantedit' ) ),
                                                                                        array( array( 'protect-cantedit' ) ), false ),
                                                '' => array( array( ), array( ), array( ), true ) );
-               global $wgUser;
-               $wgUser = $this->user;
+
                foreach ( array( "edit", "protect", "" ) as $action ) {
                        $this->setUserPerm( null );
                        $this->assertEquals( $check[$action][0],
@@ -303,9 +314,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
 
                        $this->setUserPerm( $action );
                        $this->assertEquals( $check[$action][3],
-                               $this->title->userCan( $action, true ) );
+                               $this->title->userCan( $action, $this->user, true ) );
                        $this->assertEquals( $check[$action][3],
-                               $this->title->quickUserCan( $action ) );
+                               $this->title->quickUserCan( $action, $this->user ) );
 
                        # count( User::getGroupsWithPermissions( $action ) ) < 1
                }
@@ -338,9 +349,8 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        }
 
        function testSpecialsAndNSPermissions() {
+               global $wgNamespaceProtection;
                $this->setUser( $this->userName );
-               global $wgUser;
-               $wgUser = $this->user;
 
                $this->setTitle( NS_SPECIAL );
 
@@ -359,8 +369,8 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array( array( 'badaccess-group0' ) ),
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
-               global $wgNamespaceProtection;
-               $wgNamespaceProtection[NS_USER] = array ( 'bogus' );
+               $wgNamespaceProtection[NS_USER] = array( 'bogus' );
+
                $this->setTitle( NS_USER );
                $this->setUserPerm( '' );
                $this->assertEquals( array( array( 'badaccess-group0' ), array( 'namespaceprotected', 'User' ) ),
@@ -377,23 +387,22 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $wgNamespaceProtection = null;
+
                $this->setUserPerm( 'bogus' );
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'bogus' ) );
+                                                        $this->title->userCan( 'bogus', $this->user ) );
 
                $this->setUserPerm( '' );
                $this->assertEquals( array( array( 'badaccess-group0' ) ),
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'bogus' ) );
+                                                        $this->title->userCan( 'bogus', $this->user ) );
        }
 
        function testCssAndJavascriptPermissions() {
                $this->setUser( $this->userName );
-               global $wgUser;
-               $wgUser = $this->user;
 
                $this->setTitle( NS_USER, $this->altUserName . '/test.js' );
                $this->runCSSandJSPermissions(
@@ -442,11 +451,10 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        }
 
        function testPageRestrictions() {
-               global $wgUser, $wgContLang;
+               global $wgContLang;
 
                $prefix = $wgContLang->getFormattedNsText( NS_PROJECT );
 
-               $wgUser = $this->user;
                $this->setTitle( NS_MAIN );
                $this->title->mRestrictionsLoaded = true;
                $this->setUserPerm( "edit" );
@@ -457,7 +465,7 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                                                                                                                         $this->user ) );
 
                $this->assertEquals( true,
-                                                        $this->title->quickUserCan( 'edit' ) );
+                                                        $this->title->quickUserCan( 'edit', $this->user ) );
                $this->title->mRestrictions = array( "edit" => array( 'bogus', "sysop", "protect", "" ),
                                                                                   "bogus" => array( 'bogus', "sysop", "protect", "" ) );
 
@@ -497,9 +505,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                                                                                                                                         $this->user ) );
                $this->title->mCascadeRestriction = true;
                $this->assertEquals( false,
-                                                        $this->title->quickUserCan( 'bogus' ) );
+                                                        $this->title->quickUserCan( 'bogus', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->quickUserCan( 'edit' ) );
+                                                        $this->title->quickUserCan( 'edit', $this->user ) );
                $this->assertEquals( array( array( 'badaccess-group0' ),
                                                                        array( 'protectedpagetext', 'bogus' ),
                                                                        array( 'protectedpagetext', 'protect' ),
@@ -514,8 +522,6 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
        }
 
        function testCascadingSourcesRestrictions() {
-               global $wgUser;
-               $wgUser = $this->user;
                $this->setTitle( NS_MAIN, "test page" );
                $this->setUserPerm( array( "edit", "bogus" ) );
 
@@ -523,22 +529,19 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->title->mCascadingRestrictions = array( "bogus" => array( 'bogus', "sysop", "protect", "" ) );
 
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'bogus' ) );
+                                                        $this->title->userCan( 'bogus', $this->user ) );
                $this->assertEquals( array( array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ),
                                                                        array( "cascadeprotected", 2, "* [[:Bogus]]\n* [[:UnBogus]]\n" ) ),
                                                         $this->title->getUserPermissionsErrors( 'bogus', $this->user ) );
 
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'edit' ) );
+                                                        $this->title->userCan( 'edit', $this->user ) );
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'edit', $this->user ) );
 
        }
 
        function testActionPermissions() {
-               global $wgUser;
-               $wgUser = $this->user;
-
                $this->setUserPerm( array( "createpage" ) );
                $this->setTitle( NS_MAIN, "test page" );
                $this->title->mTitleProtection['pt_create_perm'] = '';
@@ -550,75 +553,74 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
                                                         $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'create' ) );
+                                                        $this->title->userCan( 'create', $this->user ) );
 
                $this->title->mTitleProtection['pt_create_perm'] = 'sysop';
                $this->setUserPerm( array( 'createpage', 'protect' ) );
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'create' ) );
+                                                        $this->title->userCan( 'create', $this->user ) );
 
 
                $this->setUserPerm( array( 'createpage' ) );
                $this->assertEquals( array( array( 'titleprotected', 'Useruser', 'test' ) ),
                                                         $this->title->getUserPermissionsErrors( 'create', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'create' ) );
+                                                        $this->title->userCan( 'create', $this->user ) );
 
                $this->setTitle( NS_MEDIA, "test page" );
                $this->setUserPerm( array( "move" ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'move' ) );
+                                                        $this->title->userCan( 'move', $this->user ) );
                $this->assertEquals( array( array( 'immobile-source-namespace', 'Media' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move', $this->user ) );
 
-               $this->setTitle( NS_MAIN, "test page" );
+               $this->setTitle( NS_HELP, "test page" );
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'move', $this->user ) );
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'move' ) );
+                                                        $this->title->userCan( 'move', $this->user ) );
 
                $this->title->mInterwiki = "no";
                $this->assertEquals( array( array( 'immobile-source-page' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'move' ) );
+                                                        $this->title->userCan( 'move', $this->user ) );
 
                $this->setTitle( NS_MEDIA, "test page" );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'move-target' ) );
+                                                        $this->title->userCan( 'move-target', $this->user ) );
                $this->assertEquals( array( array( 'immobile-target-namespace', 'Media' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
 
-               $this->setTitle( NS_MAIN, "test page" );
+               $this->setTitle( NS_HELP, "test page" );
                $this->assertEquals( array( ),
                                                         $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $this->assertEquals( true,
-                                                        $this->title->userCan( 'move-target' ) );
+                                                        $this->title->userCan( 'move-target', $this->user ) );
 
                $this->title->mInterwiki = "no";
                $this->assertEquals( array( array( 'immobile-target-page' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $this->assertEquals( false,
-                                                        $this->title->userCan( 'move-target' ) );
+                                                        $this->title->userCan( 'move-target', $this->user ) );
 
        }
 
        function testUserBlock() {
-               global $wgUser, $wgEmailConfirmToEdit, $wgEmailAuthentication;
+               global $wgEmailConfirmToEdit, $wgEmailAuthentication;
                $wgEmailConfirmToEdit = true;
                $wgEmailAuthentication = true;
-               $wgUser = $this->user;
 
                $this->setUserPerm( array( "createpage", "move" ) );
-               $this->setTitle( NS_MAIN, "test page" );
+               $this->setTitle( NS_HELP, "test page" );
 
                # $short
                $this->assertEquals( array( array( 'confirmedittext' ) ),
                                                         $this->title->getUserPermissionsErrors( 'move-target', $this->user ) );
                $wgEmailConfirmToEdit = false;
-               $this->assertEquals( true, $this->title->userCan( 'move-target' ) );
+               $this->assertEquals( true, $this->title->userCan( 'move-target', $this->user ) );
 
                # $wgEmailConfirmToEdit && !$user->isEmailConfirmed() && $action != 'createaccount'
                $this->assertEquals( array( ),
@@ -639,9 +641,9 @@ class TitlePermissionTest extends MediaWikiLangTestCase {
                        $this->title->getUserPermissionsErrors( 'move-target',
                        $this->user ) );
 
-               $this->assertEquals( false, $this->title->userCan( 'move-target' ) );
+               $this->assertEquals( false, $this->title->userCan( 'move-target', $this->user ) );
                // quickUserCan should ignore user blocks
-               $this->assertEquals( true, $this->title->quickUserCan( 'move-target' ) );
+               $this->assertEquals( true, $this->title->quickUserCan( 'move-target', $this->user ) );
 
                global $wgLocalTZoffset;
                $wgLocalTZoffset = -60;
index f61652d..8647954 100644 (file)
@@ -1,7 +1,25 @@
 <?php
 
+/**
+ *
+ * @group Database
+ *        ^--- needed for language cache stuff
+ */
 class TitleTest extends MediaWikiTestCase {
 
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+                       // User language
+                       'wgLang' => Language::factory( 'en' ),
+                       'wgAllowUserJs' => false,
+                       'wgDefaultLanguageVariant' => false,
+               ) );
+       }
+
        function testLegalChars() {
                $titlechars = Title::legalChars();
 
@@ -16,7 +34,7 @@ class TitleTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataBug31100
+        * @dataProvider provideBug31100
         */
        function testBug31100FixSpecialName( $text, $expectedParam ) {
                $title = Title::newFromText( $text );
@@ -30,7 +48,7 @@ class TitleTest extends MediaWikiTestCase {
                $this->assertEquals( $expectedParam, $par, "Bug 31100 regression check: Title->fixSpecialName() should preserve parameter" );
        }
 
-       function dataBug31100() {
+       public static function provideBug31100() {
                return array(
                        array( 'Special:Version', null ),
                        array( 'Special:Version/', '' ),
@@ -45,7 +63,7 @@ class TitleTest extends MediaWikiTestCase {
         * @param string $source
         * @param string $target
         * @param array|string|true $expected Required error
-        * @dataProvider dataTestIsValidMoveOperation
+        * @dataProvider provideTestIsValidMoveOperation
         */
        function testIsValidMoveOperation( $source, $target, $expected ) {
                $title = Title::newFromText( $source );
@@ -69,33 +87,25 @@ class TitleTest extends MediaWikiTestCase {
                return $result;
        }
        
-       function dataTestIsValidMoveOperation() {
+       public static function provideTestIsValidMoveOperation() {
                return array( 
                        array( 'Test', 'Test', 'selfmove' ),
                        array( 'File:Test.jpg', 'Page', 'imagenocrossnamespace' )
                );
        }
-       
-       
+
        /**
         * @dataProvider provideCasesForGetpageviewlanguage
         */
-       function testGetpageviewlanguage( $expected, $titleText, $contLang, $lang, $variant, $msg='' ) {
-               // Save globals
-               global $wgContLang, $wgLang, $wgAllowUserJs, $wgLanguageCode, $wgDefaultLanguageVariant;
-               $save['wgContLang']               = $wgContLang;
-               $save['wgLang']                   = $wgLang;
-               $save['wgAllowUserJs']            = $wgAllowUserJs;
-               $save['wgLanguageCode']           = $wgLanguageCode;
-               $save['wgDefaultLanguageVariant'] = $wgDefaultLanguageVariant;
-
-               // Setup test environnement:
-               $wgContLang = Language::factory( $contLang );
-               $wgLang     = Language::factory( $lang );
-               # To test out .js titles:
-               $wgAllowUserJs = true;
+       function testGetpageviewlanguage( $expected, $titleText, $contLang, $lang, $variant, $msg = '' ) {
+               global $wgLanguageCode, $wgContLang, $wgLang, $wgDefaultLanguageVariant, $wgAllowUserJs;
+
+               // Setup environnement for this test
                $wgLanguageCode = $contLang;
+               $wgContLang = Language::factory( $contLang );
+               $wgLang = Language::factory( $lang );
                $wgDefaultLanguageVariant = $variant;
+               $wgAllowUserJs = true;
 
                $title = Title::newFromText( $titleText );
                $this->assertInstanceOf( 'Title', $title,
@@ -105,13 +115,6 @@ class TitleTest extends MediaWikiTestCase {
                        $title->getPageViewLanguage()->getCode(),
                        $msg
                );
-
-               // Restore globals
-               $wgContLang               = $save['wgContLang'];
-               $wgLang                   = $save['wgLang'];
-               $wgAllowUserJs            = $save['wgAllowUserJs'];
-               $wgLanguageCode           = $save['wgLanguageCode'];
-               $wgDefaultLanguageVariant = $save['wgDefaultLanguageVariant'];
        }
 
        function provideCasesForGetpageviewlanguage() {
@@ -123,11 +126,11 @@ class TitleTest extends MediaWikiTestCase {
                # - wgDefaultLanguageVariant
                # - Optional message
                return array(
-                       array( 'fr', 'Main_page', 'fr', 'fr', false ),
-                       array( 'es', 'Main_page', 'es', 'zh-tw', false ),
-                       array( 'zh', 'Main_page', 'zh', 'zh-tw', false ),
+                       array( 'fr', 'Help:I_need_somebody', 'fr', 'fr', false ),
+                       array( 'es', 'Help:I_need_somebody', 'es', 'zh-tw', false ),
+                       array( 'zh', 'Help:I_need_somebody', 'zh', 'zh-tw', false ),
 
-                       array( 'es',    'Main_page',                 'es', 'zh-tw', 'zh-cn' ),
+                       array( 'es',    'Help:I_need_somebody',      'es', 'zh-tw', 'zh-cn' ),
                        array( 'es',    'MediaWiki:About',           'es', 'zh-tw', 'zh-cn' ),
                        array( 'es',    'MediaWiki:About/',          'es', 'zh-tw', 'zh-cn' ),
                        array( 'de',    'MediaWiki:About/de',        'es', 'zh-tw', 'zh-cn' ),
@@ -136,7 +139,7 @@ class TitleTest extends MediaWikiTestCase {
                        array( 'en',    'User:JohnDoe/Common.js',    'es', 'zh-tw', 'zh-cn' ),
                        array( 'en',    'User:JohnDoe/Monobook.css', 'es', 'zh-tw', 'zh-cn' ),
 
-                       array( 'zh-cn', 'Main_page',                 'zh', 'zh-tw', 'zh-cn' ),
+                       array( 'zh-cn', 'Help:I_need_somebody',      'zh', 'zh-tw', 'zh-cn' ),
                        array( 'zh',    'MediaWiki:About',           'zh', 'zh-tw', 'zh-cn' ),
                        array( 'zh',    'MediaWiki:About/',          'zh', 'zh-tw', 'zh-cn' ),
                        array( 'de',    'MediaWiki:About/de',        'zh', 'zh-tw', 'zh-cn' ),
@@ -152,4 +155,63 @@ class TitleTest extends MediaWikiTestCase {
 
                );
        }
+
+       /**
+        * @dataProvider provideBaseTitleCases
+        */
+       function testExtractingBaseTextFromTitle( $title, $expected, $msg='' ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expected,
+                       $title->getBaseText(),
+                       $msg
+               );
+       }
+
+       function provideBaseTitleCases() {
+               return array(
+                       # Title, expected base, optional message
+                       array('User:John_Doe/subOne/subTwo', 'John Doe/subOne' ),
+                       array('User:Foo/Bar/Baz', 'Foo/Bar' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideRootTitleCases
+        */
+       function testExtractingRootTextFromTitle( $title, $expected, $msg='' ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expected,
+                       $title->getRootText(),
+                       $msg
+               );
+       }
+
+       public static function provideRootTitleCases() {
+               return array(
+                       # Title, expected base, optional message
+                       array('User:John_Doe/subOne/subTwo', 'John Doe' ),
+                       array('User:Foo/Bar/Baz', 'Foo' ),
+               );
+       }
+
+       /**
+        * @todo Handle $wgNamespacesWithSubpages cases
+        * @dataProvider provideSubpageTitleCases
+        */
+       function testExtractingSubpageTextFromTitle( $title, $expected, $msg='' ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expected,
+                       $title->getSubpageText(),
+                       $msg
+               );
+       }
+
+       function provideSubpageTitleCases() {
+               return array(
+                       # Title, expected base, optional message
+                       array('User:John_Doe/subOne/subTwo', 'subTwo' ),
+                       array('User:John_Doe/subOne', 'subOne' ),
+               );
+       }
+
 }
index 7a424ae..e5a014d 100644 (file)
@@ -7,22 +7,26 @@ define( 'NS_UNITTEST_TALK', 5601 );
  * @group Database
  */
 class UserTest extends MediaWikiTestCase {
-       protected $savedGroupPermissions, $savedRevokedPermissions;
 
        /**
         * @var User
         */
        protected $user;
 
-       public function setUp() {
+       protected function setUp() {
                parent::setUp();
 
-               $this->savedGroupPermissions = $GLOBALS['wgGroupPermissions'];
-               $this->savedRevokedPermissions = $GLOBALS['wgRevokePermissions'];
+               $this->setMwGlobals( array(
+                       'wgGroupPermissions' => array(),
+                       'wgRevokePermissions' => array(),
+               ) );
 
                $this->setUpPermissionGlobals();
-               $this->setUpUser();
+
+               $this->user = new User;
+               $this->user->addGroup( 'unittesters' );
        }
+
        private function setUpPermissionGlobals() {
                global $wgGroupPermissions, $wgRevokePermissions;
 
@@ -38,22 +42,12 @@ class UserTest extends MediaWikiTestCase {
                        'writetest' => true,
                        'modifytest' => true,
                );
+
                # Data for regular $wgRevokePermissions test
                $wgRevokePermissions['formertesters'] = array(
                        'runtest' => true,
                );
        }
-       private function setUpUser() {
-               $this->user = new User;
-               $this->user->addGroup( 'unittesters' );
-       }
-
-       public function tearDown() {
-               parent::tearDown();
-
-               $GLOBALS['wgGroupPermissions'] = $this->savedGroupPermissions;
-               $GLOBALS['wgRevokePermissions'] = $this->savedRevokedPermissions;
-       }
 
        public function testGroupPermissions() {
                $rights = User::getGroupPermissions( array( 'unittesters' ) );
@@ -95,7 +89,7 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $result, "Groups with permission $right" );
        }
 
-       public function provideGetGroupsWithPermission() {
+       public static function provideGetGroupsWithPermission() {
                return array(
                        array(
                                array( 'unittesters', 'testwriters' ),
@@ -123,7 +117,7 @@ class UserTest extends MediaWikiTestCase {
                $this->assertEquals( $this->user->isValidUserName( $username ), $result, $message );
        }
 
-       public function provideUserNames() {
+       public static function provideUserNames() {
                return array(
                        array( '', false, 'Empty string' ),
                        array( ' ', false, 'Blank space' ),
@@ -168,4 +162,56 @@ class UserTest extends MediaWikiTestCase {
                        'Each user rights (core/extensions) has a corresponding right- message.'
                );
        }
+
+       /**
+        * Test User::editCount
+        * @group medium
+        */
+       public function testEditCount() {
+               $user = User::newFromName( 'UnitTestUser' );
+               $user->loadDefaults();
+               $user->addToDatabase();
+
+               // let the user have a few (3) edits
+               $page = WikiPage::factory( Title::newFromText( 'Help:UserTest_EditCount' ) );
+               for( $i = 0; $i < 3; $i++ ) {
+                       $page->doEdit( (string) $i, 'test', 0, false, $user );
+               }
+
+               $user->clearInstanceCache();
+               $this->assertEquals( 3, $user->getEditCount(), 'After three edits, the user edit count should be 3' );
+
+               // increase the edit count and clear the cache
+               $user->incEditCount();
+
+               $user->clearInstanceCache();
+               $this->assertEquals( 4, $user->getEditCount(), 'After increasing the edit count manually, the user edit count should be 4' );
+       }
+
+       /**
+        * Test changing user options.
+        */
+       public function testOptions() {
+               $user = User::newFromName( 'UnitTestUser' );
+               $user->addToDatabase();
+
+               $user->setOption( 'someoption', 'test' );
+               $user->setOption( 'cols', 200 );
+               $user->saveSettings();
+
+               $user = User::newFromName( 'UnitTestUser' );
+               $this->assertEquals( 'test', $user->getOption( 'someoption' ) );
+               $this->assertEquals( 200, $user->getOption( 'cols' ) );
+       }
+
+       /**
+        * Bug 37963
+        * Make sure defaults are loaded when setOption is called.
+        */
+       public function testAnonOptions() {
+               global $wgDefaultUserOptions;
+               $this->user->setOption( 'someoption', 'test' );
+               $this->assertEquals( $wgDefaultUserOptions['cols'], $this->user->getOption( 'cols' ) );
+               $this->assertEquals( 'test', $this->user->getOption( 'someoption' ) );
+       }
 }
index 1fc0b4b..153ff78 100644 (file)
@@ -1,14 +1,18 @@
 <?php
 
 class WebRequestTest extends MediaWikiTestCase {
-       static $oldServer;
+       protected $oldServer;
 
-       function setUp() {
-               self::$oldServer = $_SERVER;
+       protected function setUp() {
+               parent::setUp();
+
+               $this->oldServer = $_SERVER;
        }
 
-       function tearDown() {
-               $_SERVER = self::$oldServer;
+       protected function tearDown() {
+               $_SERVER = $this->oldServer;
+
+               parent::tearDown();
        }
 
        /**
@@ -20,7 +24,7 @@ class WebRequestTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $result, $description );
        }
 
-       function provideDetectServer() {
+       public static function provideDetectServer() {
                return array(
                        array(
                                'http://x',
@@ -107,7 +111,7 @@ class WebRequestTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $result, $description );
        }
 
-       function provideGetIP() {
+       public static function provideGetIP() {
                return array(
                        array(
                                '127.0.0.1',
@@ -189,7 +193,7 @@ class WebRequestTest extends MediaWikiTestCase {
                $request->getIP();
        }
 
-       function languageProvider() {
+       public static function provideLanguageData() {
                return array(
                        array( '', array(), 'Empty Accept-Language header' ),
                        array( 'en', array( 'en' => 1 ), 'One language' ),
@@ -206,7 +210,7 @@ class WebRequestTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider languageProvider
+        * @dataProvider provideLanguageData
         */
        function testAcceptLang($acceptLanguageHeader, $expectedLanguages, $description) {
                $_SERVER = array( 'HTTP_ACCEPT_LANGUAGE' => $acceptLanguageHeader );
index 2949a3a..cc23d6d 100644 (file)
@@ -1,7 +1,9 @@
 <?php
 /**
+* @group ContentHandler
 * @group Database
 * ^--- important, causes temporary tables to be used instead of the real database
+* @group medium
 **/
 
 class WikiPageTest extends MediaWikiLangTestCase {
@@ -11,30 +13,33 @@ class WikiPageTest extends MediaWikiLangTestCase {
        function  __construct( $name = null, array $data = array(), $dataName = '' ) {
                parent::__construct( $name, $data, $dataName );
 
-               $this->tablesUsed = array_merge ( $this->tablesUsed,
-                                                 array( 'page',
-                                                      'revision',
-                                                      'text',
+               $this->tablesUsed = array_merge (
+                       $this->tablesUsed,
+                       array( 'page',
+                                       'revision',
+                                       'text',
 
-                                                      'recentchanges',
-                                                      'logging',
+                                       'recentchanges',
+                                       'logging',
 
-                                                      'page_props',
-                                                      'pagelinks',
-                                                      'categorylinks',
-                                                      'langlinks',
-                                                      'externallinks',
-                                                      'imagelinks',
-                                                      'templatelinks',
-                                                      'iwlinks' ) );
+                                       'page_props',
+                                       'pagelinks',
+                                       'categorylinks',
+                                       'langlinks',
+                                       'externallinks',
+                                       'imagelinks',
+                                       'templatelinks',
+                                       'iwlinks' ) );
        }
 
-       public function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->pages_to_delete = array();
+
+               LinkCache::singleton()->clear(); # avoid cached redirect status, etc
        }
 
-       public function tearDown() {
+       protected function tearDown() {
                foreach ( $this->pages_to_delete as $p ) {
                        /* @var $p WikiPage */
 
@@ -49,8 +54,16 @@ class WikiPageTest extends MediaWikiLangTestCase {
                parent::tearDown();
        }
 
-       protected function newPage( $title ) {
-               if ( is_string( $title ) ) $title = Title::newFromText( $title );
+       /**
+        * @param Title $title
+        * @param String $model
+        * @return WikiPage
+        */
+       protected function newPage( $title, $model = null ) {
+               if ( is_string( $title ) ) {
+                       $ns = $this->getDefaultWikitextNS();
+                       $title = Title::newFromText( $title, $ns );
+               }
 
                $p = new WikiPage( $title );
 
@@ -59,30 +72,108 @@ class WikiPageTest extends MediaWikiLangTestCase {
                return $p;
        }
 
+
+       /**
+        * @param String|Title|WikiPage $page
+        * @param String $text
+        * @param int $model
+        *
+        * @return WikiPage
+        */
        protected function createPage( $page, $text, $model = null ) {
-               if ( is_string( $page ) ) $page = Title::newFromText( $page );
-               if ( $page instanceof Title ) $page = $this->newPage( $page );
+               if ( is_string( $page ) || $page instanceof Title ) {
+                       $page = $this->newPage( $page, $model );
+               }
 
-               $page->doEdit( $text, "testing", EDIT_NEW );
+               $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
+               $page->doEditContent( $content, "testing", EDIT_NEW );
 
                return $page;
        }
 
+       public function testDoEditContent() {
+               $page = $this->newPage( "WikiPageTest_testDoEditContent" );
+               $title = $page->getTitle();
+
+               $content = ContentHandler::makeContent( "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
+                                               . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.",
+                                               $title, CONTENT_MODEL_WIKITEXT );
+
+               $page->doEditContent( $content, "[[testing]] 1" );
+
+               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
+               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
+               $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
+               $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
+
+               $id = $page->getId();
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getContent();
+               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
+
+               # ------------------------
+               $content = ContentHandler::makeContent( "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
+                                                                                               . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.",
+                                                                                               $title, CONTENT_MODEL_WIKITEXT );
+
+               $page->doEditContent( $content, "testing 2" );
+
+               # ------------------------
+               $page = new WikiPage( $title );
+
+               $retrieved = $page->getContent();
+               $this->assertTrue( $content->equals( $retrieved ), 'retrieved content doesn\'t equal original' );
+
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 2, $n, 'pagelinks should contain two links from the page' );
+       }
+
        public function testDoEdit() {
-               $title = Title::newFromText( "WikiPageTest_testDoEdit" );
+               $this->hideDeprecated( "WikiPage::doEdit" );
+               $this->hideDeprecated( "WikiPage::getText" );
+               $this->hideDeprecated( "Revision::getText" );
+
+               //NOTE: assume help namespace will default to wikitext
+               $title = Title::newFromText( "Help:WikiPageTest_testDoEdit" );
 
                $page = $this->newPage( $title );
 
                $text = "[[Lorem ipsum]] dolor sit amet, consetetur sadipscing elitr, sed diam "
-                      . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
+                               . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.";
 
-               $page->doEdit( $text, "testing 1" );
+               $page->doEdit( $text, "[[testing]] 1" );
 
+               $this->assertTrue( $title->getArticleID() > 0, "Title object should have new page id" );
+               $this->assertTrue( $page->getId() > 0, "WikiPage should have new page id" );
                $this->assertTrue( $title->exists(), "Title object should indicate that the page now exists" );
                $this->assertTrue( $page->exists(), "WikiPage object should indicate that the page now exists" );
 
                $id = $page->getId();
 
+               # ------------------------
+               $dbr = wfGetDB( DB_SLAVE );
+               $res = $dbr->select( 'pagelinks', '*', array( 'pl_from' => $id ) );
+               $n = $res->numRows();
+               $res->free();
+
+               $this->assertEquals( 1, $n, 'pagelinks should contain one link from the page' );
+
                # ------------------------
                $page = new WikiPage( $title );
 
@@ -91,7 +182,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
 
                # ------------------------
                $text = "At vero eos et accusam et justo duo [[dolores]] et ea rebum. "
-                      . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
+                               . "Stet clita kasd [[gubergren]], no sea takimata sanctus est.";
 
                $page->doEdit( $text, "testing 2" );
 
@@ -113,7 +204,10 @@ class WikiPageTest extends MediaWikiLangTestCase {
        public function testDoQuickEdit() {
                global $wgUser;
 
-               $page = $this->createPage( "WikiPageTest_testDoQuickEdit", "original text" );
+               $this->hideDeprecated( "WikiPage::doQuickEdit" );
+
+               //NOTE: assume help namespace will default to wikitext
+               $page = $this->createPage( "Help:WikiPageTest_testDoQuickEdit", "original text" );
 
                $text = "quick text";
                $page->doQuickEdit( $text, $wgUser, "testing q" );
@@ -123,13 +217,29 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertEquals( $text, $page->getText() );
        }
 
+       public function testDoQuickEditContent() {
+               global $wgUser;
+
+               $page = $this->createPage( "WikiPageTest_testDoQuickEditContent", "original text", CONTENT_MODEL_WIKITEXT );
+
+               $content = ContentHandler::makeContent( "quick text", $page->getTitle(), CONTENT_MODEL_WIKITEXT );
+               $page->doQuickEditContent( $content, $wgUser, "testing q" );
+
+               # ---------------------
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertTrue( $content->equals( $page->getContent() ) );
+       }
+
        public function testDoDeleteArticle() {
-               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo" );
+               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
                $id = $page->getId();
 
                $page->doDeleteArticle( "testing deletion" );
 
+               $this->assertFalse( $page->getTitle()->getArticleID() > 0, "Title object should now have page id 0" );
+               $this->assertFalse( $page->getId() > 0, "WikiPage should now have page id 0" );
                $this->assertFalse( $page->exists(), "WikiPage::exists should return false after page was deleted" );
+               $this->assertNull( $page->getContent(), "WikiPage::getContent should return null after page was deleted" );
                $this->assertFalse( $page->getText(), "WikiPage::getText should return false after page was deleted" );
 
                $t = Title::newFromText( $page->getTitle()->getPrefixedText() );
@@ -145,7 +255,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
        }
 
        public function testDoDeleteUpdates() {
-               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo" );
+               $page = $this->createPage( "WikiPageTest_testDoDeleteArticle", "[[original text]] foo", CONTENT_MODEL_WIKITEXT );
                $id = $page->getId();
 
                $page->doDeleteUpdates( $id );
@@ -166,47 +276,89 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertNull( $rev );
 
                # -----------------
-               $this->createPage( $page, "some text" );
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
 
                $rev = $page->getRevision();
 
                $this->assertEquals( $page->getLatest(), $rev->getId() );
-               $this->assertEquals( "some text", $rev->getText() );
+               $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
+       }
+
+       public function testGetContent() {
+               $page = $this->newPage( "WikiPageTest_testGetContent" );
+
+               $content = $page->getContent();
+               $this->assertNull( $content );
+
+               # -----------------
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
+
+               $content = $page->getContent();
+               $this->assertEquals( "some text", $content->getNativeData() );
        }
 
        public function testGetText() {
+               $this->hideDeprecated( "WikiPage::getText" );
+
                $page = $this->newPage( "WikiPageTest_testGetText" );
 
                $text = $page->getText();
                $this->assertFalse( $text );
 
                # -----------------
-               $this->createPage( $page, "some text" );
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
 
                $text = $page->getText();
                $this->assertEquals( "some text", $text );
        }
 
        public function testGetRawText() {
+               $this->hideDeprecated( "WikiPage::getRawText" );
+
                $page = $this->newPage( "WikiPageTest_testGetRawText" );
 
                $text = $page->getRawText();
                $this->assertFalse( $text );
 
                # -----------------
-               $this->createPage( $page, "some text" );
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
 
                $text = $page->getRawText();
                $this->assertEquals( "some text", $text );
        }
 
-       
+       public function testGetContentModel() {
+               global $wgContentHandlerUseDB;
+
+               if ( !$wgContentHandlerUseDB ) {
+                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
+               }
+
+               $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $page->getContentModel() );
+       }
+
+       public function testGetContentHandler() {
+               global $wgContentHandlerUseDB;
+
+               if ( !$wgContentHandlerUseDB ) {
+                       $this->markTestSkipped( '$wgContentHandlerUseDB is disabled' );
+               }
+
+               $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
+
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( 'JavaScriptContentHandler', get_class( $page->getContentHandler() ) );
+       }
+
        public function testExists() {
                $page = $this->newPage( "WikiPageTest_testExists" );
                $this->assertFalse( $page->exists() );
 
                # -----------------
-               $this->createPage( $page, "some text" );
+               $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
                $this->assertTrue( $page->exists() );
 
                $page = new WikiPage( $page->getTitle() );
@@ -220,7 +372,7 @@ class WikiPageTest extends MediaWikiLangTestCase {
                $this->assertFalse( $page->exists() );
        }
 
-       public function dataHasViewableContent() {
+       public static function provideHasViewableContent() {
                return array(
                        array( 'WikiPageTest_testHasViewableContent', false, true ),
                        array( 'Special:WikiPageTest_testHasViewableContent', false ),
@@ -231,14 +383,14 @@ class WikiPageTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @dataProvider dataHasViewableContent
+        * @dataProvider provideHasViewableContent
         */
        public function testHasViewableContent( $title, $viewable, $create = false ) {
                $page = $this->newPage( $title );
                $this->assertEquals( $viewable, $page->hasViewableContent() );
 
                if ( $create ) {
-                       $this->createPage( $page, "some text" );
+                       $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
                        $this->assertTrue( $page->hasViewableContent() );
 
                        $page = new WikiPage( $page->getTitle() );
@@ -246,18 +398,22 @@ class WikiPageTest extends MediaWikiLangTestCase {
                }
        }
 
-       public function dataGetRedirectTarget() {
+       public static function provideGetRedirectTarget() {
                return array(
-                       array( 'WikiPageTest_testGetRedirectTarget_1', "hello world", null ),
-                       array( 'WikiPageTest_testGetRedirectTarget_2', "#REDIRECT [[hello world]]", "Hello world" ),
+                       array( 'WikiPageTest_testGetRedirectTarget_1', CONTENT_MODEL_WIKITEXT, "hello world", null ),
+                       array( 'WikiPageTest_testGetRedirectTarget_2', CONTENT_MODEL_WIKITEXT, "#REDIRECT [[hello world]]", "Hello world" ),
                );
        }
 
        /**
-        * @dataProvider dataGetRedirectTarget
+        * @dataProvider provideGetRedirectTarget
         */
-       public function testGetRedirectTarget( $title, $text, $target ) {
-               $page = $this->createPage( $title, $text );
+       public function testGetRedirectTarget( $title, $model, $text, $target ) {
+               $page = $this->createPage( $title, $text, $model );
+
+               # sanity check, because this test seems to fail for no reason for some people.
+               $c = $page->getContent();
+               $this->assertEquals( 'WikitextContent', get_class( $c ) );
 
                # now, test the actual redirect
                $t = $page->getRedirectTarget();
@@ -265,143 +421,166 @@ class WikiPageTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @dataProvider dataGetRedirectTarget
+        * @dataProvider provideGetRedirectTarget
         */
-       public function testIsRedirect( $title, $text, $target ) {
-               $page = $this->createPage( $title, $text );
+       public function testIsRedirect( $title, $model, $text, $target ) {
+               $page = $this->createPage( $title, $text, $model );
                $this->assertEquals( !is_null( $target ), $page->isRedirect() );
        }
 
-       public function dataIsCountable() {
+       public static function provideIsCountable() {
                return array(
 
                        // any
                        array( 'WikiPageTest_testIsCountable',
-                              '',
-                              'any',
-                              true
+                                       CONTENT_MODEL_WIKITEXT,
+                                       '',
+                                       'any',
+                                       true
                        ),
                        array( 'WikiPageTest_testIsCountable',
-                              'Foo',
-                              'any',
-                              true
+                                       CONTENT_MODEL_WIKITEXT,
+                                       'Foo',
+                                       'any',
+                                       true
                        ),
 
                        // comma
                        array( 'WikiPageTest_testIsCountable',
-                              'Foo',
-                              'comma',
-                              false
+                                       CONTENT_MODEL_WIKITEXT,
+                                       'Foo',
+                                       'comma',
+                                       false
                        ),
                        array( 'WikiPageTest_testIsCountable',
-                              'Foo, bar',
-                              'comma',
-                              true
+                                       CONTENT_MODEL_WIKITEXT,
+                                       'Foo, bar',
+                                       'comma',
+                                       true
                        ),
 
                        // link
                        array( 'WikiPageTest_testIsCountable',
-                              'Foo',
-                              'link',
-                              false
+                                       CONTENT_MODEL_WIKITEXT,
+                                       'Foo',
+                                       'link',
+                                       false
                        ),
                        array( 'WikiPageTest_testIsCountable',
-                              'Foo [[bar]]',
-                              'link',
-                              true
+                                       CONTENT_MODEL_WIKITEXT,
+                                       'Foo [[bar]]',
+                                       'link',
+                                       true
                        ),
 
                        // redirects
                        array( 'WikiPageTest_testIsCountable',
-                              '#REDIRECT [[bar]]',
-                              'any',
-                              false
+                                       CONTENT_MODEL_WIKITEXT,
+                                       '#REDIRECT [[bar]]',
+                                       'any',
+                                       false
                        ),
                        array( 'WikiPageTest_testIsCountable',
-                              '#REDIRECT [[bar]]',
-                              'comma',
-                              false
+                                       CONTENT_MODEL_WIKITEXT,
+                                       '#REDIRECT [[bar]]',
+                                       'comma',
+                                       false
                        ),
                        array( 'WikiPageTest_testIsCountable',
-                              '#REDIRECT [[bar]]',
-                              'link',
-                              false
+                                       CONTENT_MODEL_WIKITEXT,
+                                       '#REDIRECT [[bar]]',
+                                       'link',
+                                       false
                        ),
 
                        // not a content namespace
                        array( 'Talk:WikiPageTest_testIsCountable',
-                              'Foo',
-                              'any',
-                              false
+                                       CONTENT_MODEL_WIKITEXT,
+                                       'Foo',
+                                       'any',
+                                       false
                        ),
                        array( 'Talk:WikiPageTest_testIsCountable',
-                              'Foo, bar',
-                              'comma',
-                              false
+                                       CONTENT_MODEL_WIKITEXT,
+                                       'Foo, bar',
+                                       'comma',
+                                       false
                        ),
                        array( 'Talk:WikiPageTest_testIsCountable',
-                              'Foo [[bar]]',
-                              'link',
-                              false
+                                       CONTENT_MODEL_WIKITEXT,
+                                       'Foo [[bar]]',
+                                       'link',
+                                       false
                        ),
 
                        // not a content namespace, different model
                        array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                              'Foo',
-                              'any',
-                              false
+                                       null,
+                                       'Foo',
+                                       'any',
+                                       false
                        ),
                        array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                              'Foo, bar',
-                              'comma',
-                              false
+                                       null,
+                                       'Foo, bar',
+                                       'comma',
+                                       false
                        ),
                        array( 'MediaWiki:WikiPageTest_testIsCountable.js',
-                              'Foo [[bar]]',
-                              'link',
-                              false
+                                       null,
+                                       'Foo [[bar]]',
+                                       'link',
+                                       false
                        ),
                );
        }
 
 
        /**
-        * @dataProvider dataIsCountable
+        * @dataProvider provideIsCountable
         */
-       public function testIsCountable( $title, $text, $mode, $expected ) {
-               global $wgArticleCountMethod;
+       public function testIsCountable( $title, $model, $text, $mode, $expected ) {
+               global $wgContentHandlerUseDB;
 
-               $old = $wgArticleCountMethod;
-               $wgArticleCountMethod = $mode;
+               $this->setMwGlobals( 'wgArticleCountMethod', $mode );
+
+               $title = Title::newFromText( $title );
+
+               if ( !$wgContentHandlerUseDB && ContentHandler::getDefaultModelFor( $title ) != $model ) {
+                       $this->markTestSkipped( "Can not use non-default content model $model for "
+                               . $title->getPrefixedDBkey() . " with \wgArticleCountMethod disabled." );
+               }
 
-               $page = $this->createPage( $title, $text );
-               $editInfo = $page->prepareTextForEdit( $page->getText() );
+               $page = $this->createPage( $title, $text, $model );
+               $hasLinks = wfGetDB( DB_SLAVE )->selectField( 'pagelinks', 1,
+                                       array( 'pl_from' => $page->getId() ), __METHOD__ );
+
+               $editInfo = $page->prepareContentForEdit( $page->getContent() );
 
                $v = $page->isCountable();
                $w = $page->isCountable( $editInfo );
-               $wgArticleCountMethod = $old;
 
                $this->assertEquals( $expected, $v, "isCountable( null ) returned unexpected value " . var_export( $v, true )
-                                                   . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+                                                                                       . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
 
                $this->assertEquals( $expected, $w, "isCountable( \$editInfo ) returned unexpected value " . var_export( $v, true )
-                                                   . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+                                                                                       . " instead of " . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
        }
 
-       public function dataGetParserOutput() {
+       public static function provideGetParserOutput() {
                return array(
-                       array("hello ''world''\n", "<p>hello <i>world</i></p>"),
+                       array( CONTENT_MODEL_WIKITEXT, "hello ''world''\n", "<p>hello <i>world</i></p>"),
                        // @todo: more...?
                );
        }
 
        /**
-        * @dataProvider dataGetParserOutput
+        * @dataProvider provideGetParserOutput
         */
-       public function testGetParserOutput( $text, $expectedHtml ) {
-               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text );
+       public function testGetParserOutput( $model, $text, $expectedHtml ) {
+               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', $text, $model );
 
-               $opt = new ParserOptions();
+               $opt = $page->makeParserOptions( 'canonical' );
                $po = $page->getParserOutput( $opt );
                $text = $po->getText();
 
@@ -412,6 +591,29 @@ class WikiPageTest extends MediaWikiLangTestCase {
                return $po;
        }
 
+       public function testGetParserOutput_nonexisting( ) {
+               static $count = 0;
+               $count ++;
+
+               $page = new WikiPage( new Title( "WikiPageTest_testGetParserOutput_nonexisting_$count" ) );
+
+               $opt = new ParserOptions();
+               $po = $page->getParserOutput( $opt );
+
+               $this->assertFalse( $po, "getParserOutput() shall return false for non-existing pages." );
+       }
+
+       public function testGetParserOutput_badrev( ) {
+               $page = $this->createPage( 'WikiPageTest_testGetParserOutput', "dummy", CONTENT_MODEL_WIKITEXT );
+
+               $opt = new ParserOptions();
+               $po = $page->getParserOutput( $opt, $page->getLatest() + 1234 );
+
+               //@todo: would be neat to also test deleted revision
+
+               $this->assertFalse( $po, "getParserOutput() shall return false for non-existing revisions." );
+       }
+
        static $sections =
 
                "Intro
@@ -428,41 +630,49 @@ more stuff
 
 
        public function dataReplaceSection() {
+               //NOTE: assume the Help namespace to contain wikitext
                return array(
-                       array( 'WikiPageTest_testReplaceSection',
-                              WikiPageTest::$sections,
-                              "0",
-                              "No more",
-                              null,
-                              trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
-                       ),
-                       array( 'WikiPageTest_testReplaceSection',
-                              WikiPageTest::$sections,
-                              "",
-                              "No more",
-                              null,
-                              "No more"
-                       ),
-                       array( 'WikiPageTest_testReplaceSection',
-                              WikiPageTest::$sections,
-                              "2",
-                              "== TEST ==\nmore fun",
-                              null,
-                              trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikiPageTest::$sections ) )
-                       ),
-                       array( 'WikiPageTest_testReplaceSection',
-                              WikiPageTest::$sections,
-                              "8",
-                              "No more",
-                              null,
-                              trim( WikiPageTest::$sections )
-                       ),
-                       array( 'WikiPageTest_testReplaceSection',
-                              WikiPageTest::$sections,
-                              "new",
-                              "No more",
-                              "New",
-                              trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                                       CONTENT_MODEL_WIKITEXT,
+                                       WikiPageTest::$sections,
+                                       "0",
+                                       "No more",
+                                       null,
+                                       trim( preg_replace( '/^Intro/sm', 'No more', WikiPageTest::$sections ) )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                                       CONTENT_MODEL_WIKITEXT,
+                                       WikiPageTest::$sections,
+                                       "",
+                                       "No more",
+                                       null,
+                                       "No more"
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                                       CONTENT_MODEL_WIKITEXT,
+                                       WikiPageTest::$sections,
+                                       "2",
+                                       "== TEST ==\nmore fun",
+                                       null,
+                                       trim( preg_replace( '/^== test ==.*== foo ==/sm',
+                                                                               "== TEST ==\nmore fun\n\n== foo ==",
+                                                                               WikiPageTest::$sections ) )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                                       CONTENT_MODEL_WIKITEXT,
+                                       WikiPageTest::$sections,
+                                       "8",
+                                       "No more",
+                                       null,
+                                       trim( WikiPageTest::$sections )
+                       ),
+                       array( 'Help:WikiPageTest_testReplaceSection',
+                                       CONTENT_MODEL_WIKITEXT,
+                                       WikiPageTest::$sections,
+                                       "new",
+                                       "No more",
+                                       "New",
+                                       trim( WikiPageTest::$sections ) . "\n\n== New ==\n\nNo more"
                        ),
                );
        }
@@ -470,26 +680,31 @@ more stuff
        /**
         * @dataProvider dataReplaceSection
         */
-       public function testReplaceSection( $title, $text, $section, $with, $sectionTitle, $expected ) {
-               $page = $this->createPage( $title, $text );
+       public function testReplaceSection( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
+               $this->hideDeprecated( "WikiPage::replaceSection" );
+
+               $page = $this->createPage( $title, $text, $model );
                $text = $page->replaceSection( $section, $with, $sectionTitle );
                $text = trim( $text );
 
                $this->assertEquals( $expected, $text );
        }
 
-       /* @todo FIXME: fix this!
-       public function testGetUndoText() {
-               global $wgDiff3;
+       /**
+        * @dataProvider dataReplaceSection
+        */
+       public function testReplaceSectionContent( $title, $model, $text, $section, $with, $sectionTitle, $expected ) {
+               $page = $this->createPage( $title, $text, $model );
 
-               wfSuppressWarnings();
-               $haveDiff3 = $wgDiff3 && file_exists( $wgDiff3 );
-               wfRestoreWarnings();
+               $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
+               $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
 
-               if( !$haveDiff3 ) {
-                       $this->markTestSkipped( "diff3 not installed or not found" );
-                       return;
-               }
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+       }
+
+       /* @todo FIXME: fix this!
+       public function testGetUndoText() {
+               $this->checkHasDiff3();
 
                $text = "one";
                $page = $this->createPage( "WikiPageTest_testGetUndoText", $text );
@@ -538,19 +753,22 @@ more stuff
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                                                               "section one", EDIT_NEW, false, $admin );
 
                $user1 = new User();
                $user1->setName( "127.0.1.11" );
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
-               $page->doEdit( $text, "adding section two", 0, false, $user1 );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                                                               "adding section two", 0, false, $user1 );
 
                $user2 = new User();
                $user2->setName( "127.0.2.13" );
                $text .= "\n\nthree";
                $page = new WikiPage( $page->getTitle() );
-               $page->doEdit( $text, "adding section three", 0, false, $user2 );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ),
+                                                               "adding section three", 0, false, $user2 );
 
                # we are having issues with doRollback spuriously failing. apparently the last revision somehow goes missing
                # or not committed under some circumstances. so, make sure the last revision has the right user name.
@@ -577,8 +795,9 @@ more stuff
                }
 
                $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one\n\ntwo", $page->getText() );
+               $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
+                                                               "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
        }
 
        /**
@@ -590,14 +809,16 @@ more stuff
 
                $text = "one";
                $page = $this->newPage( "WikiPageTest_testDoRollback" );
-               $page->doEdit( $text, "section one", EDIT_NEW, false, $admin );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                                                               "section one", EDIT_NEW, false, $admin );
                $rev1 = $page->getRevision();
 
                $user1 = new User();
                $user1->setName( "127.0.1.11" );
                $text .= "\n\ntwo";
                $page = new WikiPage( $page->getTitle() );
-               $page->doEdit( $text, "adding section two", 0, false, $user1 );
+               $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle(), CONTENT_MODEL_WIKITEXT ),
+                                                               "adding section two", 0, false, $user1 );
 
                # now, try the rollback
                $admin->addGroup( "sysop" ); #XXX: make the test user a sysop...
@@ -609,11 +830,12 @@ more stuff
                }
 
                $page = new WikiPage( $page->getTitle() );
-               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(), "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one", $page->getText() );
+               $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
+                                                       "rollback did not revert to the correct revision" );
+               $this->assertEquals( "one", $page->getContent()->getNativeData() );
        }
 
-       public function dataGetAutosummary( ) {
+       public static function provideGetAutosummary( ) {
                return array(
                        array(
                                'Hello there, world!',
@@ -655,17 +877,20 @@ more stuff
        }
 
        /**
-        * @dataProvider dataGetAutoSummary
+        * @dataProvider provideGetAutoSummary
         */
        public function testGetAutosummary( $old, $new, $flags, $expected ) {
+               $this->hideDeprecated( "WikiPage::getAutosummary" );
+
                $page = $this->newPage( "WikiPageTest_testGetAutosummary" );
 
                $summary = $page->getAutosummary( $old, $new, $flags );
 
-               $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
+               $this->assertTrue( (bool)preg_match( $expected, $summary ),
+                                                       "Autosummary didn't match expected pattern $expected: $summary" );
        }
 
-       public function dataGetAutoDeleteReason( ) {
+       public static function provideGetAutoDeleteReason( ) {
                return array(
                        array(
                                array(),
@@ -702,10 +927,10 @@ more stuff
                        array(
                                array(
                                        array( "first edit: "
-                                            . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
-                                            . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
-                                            . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
-                                            . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
+                                                . "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam "
+                                                . " nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. "
+                                                . "At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea "
+                                                . "takimata sanctus est Lorem ipsum dolor sit amet.'", null ),
                                ),
                                '/first edit:.*\.\.\."/',
                                false
@@ -724,12 +949,13 @@ more stuff
        }
 
        /**
-        * @dataProvider dataGetAutoDeleteReason
+        * @dataProvider provideGetAutoDeleteReason
         */
        public function testGetAutoDeleteReason( $edits, $expectedResult, $expectedHistory ) {
                global $wgUser;
 
-               $page = $this->newPage( "WikiPageTest_testGetAutoDeleteReason" );
+               //NOTE: assume Help namespace to contain wikitext
+               $page = $this->newPage( "Help:WikiPageTest_testGetAutoDeleteReason" );
 
                $c = 1;
 
@@ -739,7 +965,9 @@ more stuff
                        if ( !empty( $edit[1] ) ) $user->setName( $edit[1] );
                        else $user = $wgUser;
 
-                       $page->doEdit( $edit[0], "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
+                       $content = ContentHandler::makeContent( $edit[0], $page->getTitle(), $page->getContentModel() );
+
+                       $page->doEditContent( $content, "test edit $c", $c < 2 ? EDIT_NEW : 0, false, $user );
 
                        $c += 1;
                }
@@ -747,33 +975,36 @@ more stuff
                $reason = $page->getAutoDeleteReason( $hasHistory );
 
                if ( is_bool( $expectedResult ) || is_null( $expectedResult ) ) $this->assertEquals( $expectedResult, $reason );
-               else $this->assertTrue( (bool)preg_match( $expectedResult, $reason ), "Autosummary didn't match expected pattern $expectedResult: $reason" );
+               else $this->assertTrue( (bool)preg_match( $expectedResult, $reason ),
+                                                               "Autosummary didn't match expected pattern $expectedResult: $reason" );
 
-               $this->assertEquals( $expectedHistory, $hasHistory, "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
+               $this->assertEquals( $expectedHistory, $hasHistory,
+                                                       "expected \$hasHistory to be " . var_export( $expectedHistory, true ) );
 
                $page->doDeleteArticle( "done" );
        }
 
-       public function dataPreSaveTransform() {
+       public static function providePreSaveTransform() {
                return array(
                        array( 'hello this is ~~~',
-                              "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
+                                       "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
                        ),
                        array( 'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
-                              'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
+                                       'hello \'\'this\'\' is <nowiki>~~~</nowiki>',
                        ),
                );
        }
 
        /**
-        * @dataProvider dataPreSaveTransform
+        * @dataProvider providePreSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                $this->hideDeprecated( 'WikiPage::preSaveTransform' );
                $user = new User();
                $user->setName("127.0.0.1");
 
-               $page = $this->newPage( "WikiPageTest_testPreloadTransform" );
+               //NOTE: assume Help namespace to contain wikitext
+               $page = $this->newPage( "Help:WikiPageTest_testPreloadTransform" );
                $text = $page->preSaveTransform( $text, $user );
 
                $this->assertEquals( $expected, $text );
diff --git a/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php b/tests/phpunit/includes/WikiPageTest_ContentHandlerUseDB.php
new file mode 100644 (file)
index 0000000..1af6806
--- /dev/null
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ * ^--- important, causes temporary tables to be used instead of the real database
+ */
+class WikiPageTest_ContentHandlerUseDB extends WikiPageTest {
+       var $saveContentHandlerNoDB = null;
+
+       function setUp() {
+               global $wgContentHandlerUseDB;
+
+               parent::setUp();
+
+               $this->saveContentHandlerNoDB = $wgContentHandlerUseDB;
+
+               $wgContentHandlerUseDB = false;
+
+               $dbw = wfGetDB( DB_MASTER );
+
+               $page_table = $dbw->tableName( 'page' );
+               $revision_table = $dbw->tableName( 'revision' );
+               $archive_table = $dbw->tableName( 'archive' );
+
+               if ( $dbw->fieldExists( $page_table, 'page_content_model' ) ) {
+                       $dbw->query( "alter table $page_table drop column page_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_model" );
+                       $dbw->query( "alter table $revision_table drop column rev_content_format" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_model" );
+                       $dbw->query( "alter table $archive_table drop column ar_content_format" );
+               }
+       }
+
+       function tearDown() {
+               global $wgContentHandlerUseDB;
+
+               $wgContentHandlerUseDB = $this->saveContentHandlerNoDB;
+
+               parent::tearDown();
+       }
+
+       public function testGetContentModel() {
+               $page = $this->createPage( "WikiPageTest_testGetContentModel", "some text", CONTENT_MODEL_JAVASCRIPT );
+
+               $page = new WikiPage( $page->getTitle() );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $page->getContentModel() );
+       }
+
+       public function testGetContentHandler() {
+               $page = $this->createPage( "WikiPageTest_testGetContentHandler", "some text", CONTENT_MODEL_JAVASCRIPT );
+
+               // NOTE: since the content model is not recorded in the database,
+               //       we expect to get the default, namely CONTENT_MODEL_WIKITEXT
+               $page = new WikiPage( $page->getTitle() );
+               $this->assertEquals( 'WikitextContentHandler', get_class( $page->getContentHandler() ) );
+       }
+
+}
+
+
index 2407c15..1b48ad2 100644 (file)
@@ -5,9 +5,11 @@ class XmlSelectTest extends MediaWikiTestCase {
        protected $select;
 
        protected function setUp() {
+               parent::setUp();
                $this->select = new XmlSelect();
        }
        protected function tearDown() {
+               parent::tearDown();
                $this->select = null;
        }
 
@@ -35,7 +37,7 @@ class XmlSelectTest extends MediaWikiTestCase {
         * Provides a fourth parameters representing the expected HTML output
         *
         */
-       public function provideConstructionParameters() {
+       public static function provideConstructionParameters() {
                return array(
                        /**
                         * Values are set following a 3-bit Gray code where two successive
index 7f25f58..3cc5422 100644 (file)
@@ -4,17 +4,11 @@ class XmlTest extends MediaWikiTestCase {
        private static $oldLang;
        private static $oldNamespaces;
 
-       public function setUp() {
-               global $wgLang, $wgContLang;
+       protected function setUp() {
+               parent::setUp();
 
-               self::$oldLang = $wgLang;
-               $wgLang = Language::factory( 'en' );
-
-               // Hardcode namespaces during test runs,
-               // so that html output based on existing namespaces
-               // can be properly evaluated.
-               self::$oldNamespaces = $wgContLang->getNamespaces();
-               $wgContLang->setNamespaces( array(
+               $langObj = Language::factory( 'en' );
+               $langObj->setNamespaces( array(
                        -2 => 'Media',
                        -1 => 'Special',
                        0  => '',
@@ -32,13 +26,10 @@ class XmlTest extends MediaWikiTestCase {
                        100  => 'Custom',
                        101  => 'Custom_talk',
                ) );
-       }
 
-       public function tearDown() {
-               global $wgLang, $wgContLang;
-               $wgLang = self::$oldLang;
-
-               $wgContLang->setNamespaces( self::$oldNamespaces );
+               $this->setMwGlobals( array(
+                       'wgLang' => $langObj,
+               ) );
        }
 
        public function testExpandAttributes() {
index d90a695..9a03d5c 100644 (file)
@@ -3,7 +3,8 @@
 class ZipDirectoryReaderTest extends MediaWikiTestCase {
        var $zipDir, $entries;
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
                $this->zipDir = __DIR__ . '/../data/zip';
        }
 
index 5dfceee..52f1d28 100644 (file)
@@ -6,7 +6,7 @@
  */
 class ApiBlockTest extends ApiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->doLogin();
        }
index 5297d6d..eaab300 100644 (file)
@@ -7,16 +7,44 @@
  *
  * @group API
  * @group Database
+ * @group medium
  */
 class ApiEditPageTest extends ApiTestCase {
 
-       function setUp() {
-               parent::setUp();
+       public function setup() {
+               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+               parent::setup();
+
+               $wgExtraNamespaces[12312] = 'Dummy';
+               $wgExtraNamespaces[12313] = 'Dummy_talk';
+
+               $wgNamespaceContentModels[12312] = "testing";
+               $wgContentHandlers["testing"] = 'DummyContentHandlerForTesting';
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
+
                $this->doLogin();
        }
 
+       public function teardown() {
+               global $wgExtraNamespaces, $wgNamespaceContentModels, $wgContentHandlers, $wgContLang;
+
+               unset( $wgExtraNamespaces[12312] );
+               unset( $wgExtraNamespaces[12313] );
+
+               unset( $wgNamespaceContentModels[12312] );
+               unset( $wgContentHandlers["testing"] );
+
+               MWNamespace::getCanonicalNamespaces( true ); # reset namespace cache
+               $wgContLang->resetNamespaces(); # reset namespace cache
+
+               parent::teardown();
+       }
+
        function testEdit( ) {
-               $name = 'ApiEditPageTest_testEdit';
+               $name = 'Help:ApiEditPageTest_testEdit'; // assume Help namespace to default to wikitext
 
                // -- test new page --------------------------------------------
                $apiResult = $this->doApiRequestWithToken( array(
@@ -25,7 +53,7 @@ class ApiEditPageTest extends ApiTestCase {
                                'text' => 'some text', ) );
                $apiResult = $apiResult[0];
 
-               # Validate API result data
+               // Validate API result data
                $this->assertArrayHasKey( 'edit', $apiResult );
                $this->assertArrayHasKey( 'result', $apiResult['edit'] );
                $this->assertEquals( 'Success', $apiResult['edit']['result'] );
@@ -66,8 +94,100 @@ class ApiEditPageTest extends ApiTestCase {
                );
        }
 
-       function testEditAppend() {
-               $this->markTestIncomplete( "not yet implemented" );
+       function testNonTextEdit( ) {
+               $name = 'Dummy:ApiEditPageTest_testNonTextEdit';
+               $data = serialize( 'some bla bla text' );
+
+               // -- test new page --------------------------------------------
+               $apiResult = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $name,
+                       'text' => $data, ) );
+               $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'] );
+
+               // validate resulting revision
+               $page = WikiPage::factory( Title::newFromText( $name ) );
+               $this->assertEquals( "testing", $page->getContentModel() );
+               $this->assertEquals( $data, $page->getContent()->serialize() );
+       }
+
+       static function provideEditAppend() {
+               return array(
+                       array( #0: append
+                               'foo', 'append', 'bar', "foobar"
+                       ),
+                       array( #1: prepend
+                               'foo', 'prepend', 'bar', "barfoo"
+                       ),
+                       array( #2: append to empty page
+                               '', 'append', 'foo', "foo"
+                       ),
+                       array( #3: prepend to empty page
+                               '', 'prepend', 'foo', "foo"
+                       ),
+                       array( #4: append to non-existing page
+                               null, 'append', 'foo', "foo"
+                       ),
+                       array( #5: prepend to non-existing page
+                               null, 'prepend', 'foo', "foo"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideEditAppend
+        */
+       function testEditAppend( $text, $op, $append, $expected ) {
+               static $count = 0;
+               $count++;
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEditAppend_$count";
+
+               // -- create page (or not) -----------------------------------------
+               if ( $text !== null ) {
+                       if ( $text === '' ) {
+                               // can't create an empty page, so create it with some content
+                               list( $re,, ) = $this->doApiRequestWithToken( array(
+                                       'action' => 'edit',
+                                       'title' => $name,
+                                       'text' => '(dummy)', ) );
+                       }
+
+                       list( $re,, ) = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $name,
+                               'text' => $text, ) );
+
+                       $this->assertEquals( 'Success', $re['edit']['result'] ); // sanity
+               }
+
+               // -- try append/prepend --------------------------------------------
+               list( $re,, ) = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $name,
+                       $op . 'text' => $append, ) );
+
+               $this->assertEquals( 'Success', $re['edit']['result'] );
+
+               // -- validate -----------------------------------------------------
+               $page = new WikiPage( Title::newFromText( $name ) );
+               $content = $page->getContent();
+               $this->assertNotNull( $content, 'Page should have been created' );
+
+               $text = $content->getNativeData();
+
+               $this->assertEquals( $expected, $text );
        }
 
        function testEditSection() {
@@ -78,7 +198,152 @@ class ApiEditPageTest extends ApiTestCase {
                $this->markTestIncomplete( "not yet implemented" );
        }
 
-       function testEditNonText() {
-               $this->markTestIncomplete( "not yet implemented" );
+       function testEditConflict() {
+               static $count = 0;
+               $count++;
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEditConflict_$count";
+               $title = Title::newFromText( $name );
+
+               $page = WikiPage::factory( $title );
+
+               // base edit
+               $page->doEditContent( new WikitextContent( "Foo" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $page, '20120101000000' );
+               $baseTime = $page->getRevision()->getTimestamp();
+
+               // conflicting edit
+               $page->doEditContent( new WikitextContent( "Foo bar" ),
+                       "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+               $this->forceRevisionDate( $page, '20120101020202' );
+
+               // try to save edit, expect conflict
+               try {
+                       list( $re,, ) = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $name,
+                               'text' => 'nix bar!',
+                               'basetimestamp' => $baseTime,
+                               ), null, self::$users['sysop']->user );
+
+                       $this->fail( 'edit conflict expected' );
+               } catch ( UsageException $ex ) {
+                       $this->assertEquals( 'editconflict', $ex->getCodeString() );
+               }
+       }
+
+       function testEditConflict_redirect() {
+               static $count = 0;
+               $count++;
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEditConflict_redirect_$count";
+               $title = Title::newFromText( $name );
+               $page = WikiPage::factory( $title );
+
+               $rname = "Help:ApiEditPageTest_testEditConflict_redirect_r$count";
+               $rtitle = Title::newFromText( $rname );
+               $rpage = WikiPage::factory( $rtitle );
+
+               // base edit for content
+               $page->doEditContent( new WikitextContent( "Foo" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $page, '20120101000000' );
+               $baseTime = $page->getRevision()->getTimestamp();
+
+               // base edit for redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $rpage, '20120101000000' );
+
+               // conflicting edit to redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]\n\n[[Category:Test]]" ),
+                       "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+               $this->forceRevisionDate( $rpage, '20120101020202' );
+
+               // try to save edit; should work, because we follow the redirect
+               list( $re,, ) = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $rname,
+                       'text' => 'nix bar!',
+                       'basetimestamp' => $baseTime,
+                       'redirect' => true,
+               ), null, self::$users['sysop']->user );
+
+               $this->assertEquals( 'Success', $re['edit']['result'],
+                       "no edit conflict expected when following redirect" );
+
+               // try again, without following the redirect. Should fail.
+               try {
+                       list( $re,, ) = $this->doApiRequestWithToken( array(
+                               'action' => 'edit',
+                               'title' => $rname,
+                               'text' => 'nix bar!',
+                               'basetimestamp' => $baseTime,
+                       ), null, self::$users['sysop']->user );
+
+                       $this->fail( 'edit conflict expected' );
+               } catch ( UsageException $ex ) {
+                       $this->assertEquals( 'editconflict', $ex->getCodeString() );
+               }
+       }
+
+       function testEditConflict_bug41990() {
+               static $count = 0;
+               $count++;
+
+               /*
+               * bug 41990: if the target page has a newer revision than the redirect, then editing the
+               * redirect while specifying 'redirect' and *not* specifying 'basetimestamp' erronously
+               * caused an edit conflict to be detected.
+               */
+
+               // assume NS_HELP defaults to wikitext
+               $name = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_$count";
+               $title = Title::newFromText( $name );
+               $page = WikiPage::factory( $title );
+
+               $rname = "Help:ApiEditPageTest_testEditConflict_redirect_bug41990_r$count";
+               $rtitle = Title::newFromText( $rname );
+               $rpage = WikiPage::factory( $rtitle );
+
+               // base edit for content
+               $page->doEditContent( new WikitextContent( "Foo" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $page, '20120101000000' );
+
+               // base edit for redirect
+               $rpage->doEditContent( new WikitextContent( "#REDIRECT [[$name]]" ),
+                       "testing 1", EDIT_NEW, false, self::$users['sysop']->user );
+               $this->forceRevisionDate( $rpage, '20120101000000' );
+               $baseTime = $rpage->getRevision()->getTimestamp();
+
+               // new edit to content
+               $page->doEditContent( new WikitextContent( "Foo bar" ),
+                       "testing 2", EDIT_UPDATE, $page->getLatest(), self::$users['uploader']->user );
+               $this->forceRevisionDate( $rpage, '20120101020202' );
+
+               // try to save edit; should work, following the redirect.
+               list( $re,, ) = $this->doApiRequestWithToken( array(
+                       'action' => 'edit',
+                       'title' => $rname,
+                       'text' => 'nix bar!',
+                       'redirect' => true,
+               ), null, self::$users['sysop']->user );
+
+               $this->assertEquals( 'Success', $re['edit']['result'],
+                       "no edit conflict expected here" );
+       }
+
+       protected function forceRevisionDate( WikiPage $page, $timestamp ) {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $dbw->update( 'revision',
+                       array( 'rev_timestamp' => $timestamp ),
+                       array( 'rev_id' => $page->getLatest() ) );
+
+               $page->clear();
        }
 }
diff --git a/tests/phpunit/includes/api/ApiGeneratorTest.php b/tests/phpunit/includes/api/ApiGeneratorTest.php
new file mode 100644 (file)
index 0000000..60ae608
--- /dev/null
@@ -0,0 +1,76 @@
+<?php
+class ApiGeneratorTest extends MediaWikiTestCase {
+
+       /**
+        * Helper to easily get an ApiQuery object instance
+        */
+       function getApiQuery() {
+               // Initialize an ApiQuery object to play with
+               $main = new ApiMain( new FauxRequest() );
+               return new ApiQuery( $main, 'foo', 'bar' );
+       }
+
+       /**
+        * Test whether all registered query modules which are subclasses of
+        * ApiQueryGeneratorBase are listed as being a generator. Registration is
+        * done:
+        *  - for core: add it to ApiQuery::$mQueryGenerators
+        *  - for extension: by adding to $wgAPIGeneratorModules
+        *
+        * @dataProvider provideApiquerygeneratorbaseChilds
+        */
+       public function testApiquerygeneatorbaseModulesListedAsGenerators(
+               $moduleName, $moduleClass
+       ) {
+               $generators = $this->getApiQuery()->getGenerators();
+               $this->assertArrayHasKey( $moduleName, $generators,
+                       "API module '$moduleName' of class '$moduleClass' (an ApiQueryGeneratorBase subclass) must be listed in ApiQuery::\$mQueryGenerators or added to \$wgAPIGeneratorModules."
+               );
+       }
+
+       /**
+        * Returns API modules which are subclassing ApiQueryGeneratorBase.
+        * Case format is:
+        *      (moduleName, moduleClass)
+        */
+       public function provideApiquerygeneratorbaseChilds() {
+               $cases = array();
+               $modules = $this->getApiQuery()->getModules();
+               foreach( $modules as $moduleName => $moduleClass ) {
+                       if( !is_subclass_of( $moduleClass, 'ApiQueryGeneratorBase' ) ) {
+                               continue;
+                       }
+                       $cases[] = array( $moduleName, $moduleClass );
+               }
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provideListedApiqueryGenerators
+        */
+       public function testGeneratorsAreApiquerygeneratorbaseSubclasses(
+               $generatorName, $generatorClass
+       ) {
+               $modules = $this->getApiQuery()->getModules();
+               $this->assertArrayHasKey( $generatorName, $modules,
+                       "Class '$generatorClass' of generator '$generatorName' must be a subclass of 'ApiQueryGeneratorBase'. Listed either in ApiQuery::\$mQueryGenerators or in \$wgAPIGeneratorModules."
+               );
+
+       }
+
+       /**
+        * Return ApiQuery generators, either listed in ApiQuery or registered
+        * via wgAPIGeneratorModules.
+        * Case format is:
+        *  (moduleName, $moduleClass).
+        */
+       public function provideListedApiqueryGenerators() {
+               $cases = array();
+               $generators = $this->getApiQuery()->getGenerators();
+               foreach( $generators as $generatorName => $generatorClass ) {
+                       $cases[] = array( $generatorName, $generatorClass );
+               }
+               return $cases;
+       }
+
+}
index d54d7df..ac18afe 100644 (file)
@@ -2,22 +2,30 @@
 
 /**
  * @group API
+ * @group Database
  */
 class ApiOptionsTest extends MediaWikiLangTestCase {
 
        private $mTested, $mUserMock, $mContext, $mSession;
 
+       private $mOldGetPreferencesHooks = false;
+
        private static $Success = array( 'options' => 'success' );
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
 
                $this->mUserMock = $this->getMockBuilder( 'User' )
                        ->disableOriginalConstructor()
                        ->getMock();
 
+               // Set up groups
+               $this->mUserMock->expects( $this->any() )
+                       ->method( 'getEffectiveGroups' )->will( $this->returnValue( array( '*', 'user')) );
+
                // Create a new context
                $this->mContext = new DerivativeContext( new RequestContext() );
+               $this->mContext->getContext()->setTitle( Title::newFromText( 'Test' ) );
                $this->mContext->setUser( $this->mUserMock );
 
                $main = new ApiMain( $this->mContext );
@@ -26,6 +34,36 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->mSession = array();
 
                $this->mTested = new ApiOptions( $main, 'options' );
+
+               global $wgHooks;
+               if ( !isset( $wgHooks['GetPreferences'] ) ) {
+                       $wgHooks['GetPreferences'] = array();
+               }
+               $this->mOldGetPreferencesHooks = $wgHooks['GetPreferences'];
+               $wgHooks['GetPreferences'][] = array( $this, 'hookGetPreferences' );
+       }
+
+       protected function tearDown() {
+               global $wgHooks;
+
+               if ( $this->mOldGetPreferencesHooks !== false ) {
+                       $wgHooks['GetPreferences'] = $this->mOldGetPreferencesHooks;
+                       $this->mOldGetPreferencesHooks = false;
+               }
+
+               parent::tearDown();
+       }
+
+       public function hookGetPreferences( $user, &$preferences ) {
+               foreach ( array( 'name', 'willBeNull', 'willBeEmpty', 'willBeHappy' ) as $k ) {
+                       $preferences[$k] = array(
+                               'type' => 'text',
+                               'section' => 'test',
+                               'label' => '&#160;',
+                       );
+               }
+
+               return true;
        }
 
        private function getSampleRequest( $custom = array() ) {
@@ -162,14 +200,23 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        ->method( 'resetOptions' );
 
                $this->mUserMock->expects( $this->at( 1 ) )
+                       ->method( 'getOptions' );
+
+               $this->mUserMock->expects( $this->at( 2 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'willBeNull' ), $this->equalTo( null ) );
 
-               $this->mUserMock->expects( $this->at( 2 ) )
+               $this->mUserMock->expects( $this->at( 3 ) )
+                       ->method( 'getOptions' );
+
+               $this->mUserMock->expects( $this->at( 4 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) );
 
-               $this->mUserMock->expects( $this->at( 3 ) )
+               $this->mUserMock->expects( $this->at( 5 ) )
+                       ->method( 'getOptions' );
+
+               $this->mUserMock->expects( $this->at( 6 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
 
@@ -188,10 +235,16 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        ->method( 'resetOptions' );
 
                $this->mUserMock->expects( $this->at( 2 ) )
+                       ->method( 'getOptions' );
+
+               $this->mUserMock->expects( $this->at( 3 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) );
 
-               $this->mUserMock->expects( $this->at( 3 ) )
+               $this->mUserMock->expects( $this->at( 4 ) )
+                       ->method( 'getOptions' );
+
+               $this->mUserMock->expects( $this->at( 5 ) )
                        ->method( 'setOption' )
                        ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
 
diff --git a/tests/phpunit/includes/api/ApiParseTest.php b/tests/phpunit/includes/api/ApiParseTest.php
new file mode 100644 (file)
index 0000000..b5dabf0
--- /dev/null
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ */
+class ApiParseTest extends ApiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               $this->doLogin();
+       }
+
+       function testParseNonexistentPage() {
+               $somePage = mt_rand();
+
+               try {
+                       $data = $this->doApiRequest( array(
+                               'action' => 'parse',
+                               'page' => $somePage ) );
+
+                       $this->fail( "API did not return an error when parsing a nonexistent page" );
+               } catch(UsageException $ex){
+                       $this->assertEquals( 'missingtitle', $ex->getCodeString(),
+                               "Parse request for nonexistent page must give 'missingtitle' error: " . var_export( $ex->getMessageArray(), true ) );
+               }
+       }
+
+}
index 2566c6c..d903714 100644 (file)
@@ -6,7 +6,7 @@
  */
 class ApiPurgeTest extends ApiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->doLogin();
        }
diff --git a/tests/phpunit/includes/api/ApiQueryRevisionsTest.php b/tests/phpunit/includes/api/ApiQueryRevisionsTest.php
new file mode 100644 (file)
index 0000000..28dcb97
--- /dev/null
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ */
+class ApiQueryRevisionsTest extends ApiTestCase {
+
+       /**
+        * @group medium
+        */
+       function testContentComesWithContentModelAndFormat() {
+
+               $pageName = 'Help:' . __METHOD__ ;
+               $title = Title::newFromText( $pageName );
+               $page = WikiPage::factory( $title );
+               $page->doEdit( 'Some text', 'inserting content' );
+
+               $apiResult = $this->doApiRequest( array(
+                       'action' => 'query',
+                       'prop' => 'revisions',
+                       'titles' => $pageName,
+                       'rvprop' => 'content',
+               ) );
+               $this->assertArrayHasKey( 'query', $apiResult[0] );
+               $this->assertArrayHasKey( 'pages', $apiResult[0]['query'] );
+               foreach( $apiResult[0]['query']['pages'] as $page ) {
+                       $this->assertArrayHasKey( 'revisions', $page );
+                       foreach( $page['revisions'] as $revision ) {
+                               $this->assertArrayHasKey( 'contentformat', $revision,
+                                       'contentformat should be included when asking content so'
+                                       . ' client knows how to interpretate it'
+                               );
+                               $this->assertArrayHasKey( 'contentmodel', $revision,
+                                       'contentmodel should be included when asking content so'
+                                       . ' client knows how to interpretate it'
+                               );
+                       }
+               }
+       }
+}
index a4b9dc7..dbf02f7 100644 (file)
@@ -6,7 +6,7 @@
  */
 class ApiQueryTest extends ApiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->doLogin();
        }
index c3eacd5..9806a1c 100644 (file)
@@ -194,26 +194,6 @@ class ApiTest extends ApiTestCase {
 
                return $cj;
        }
-
-       /**
-        * @todo Finish filling me out...what are we trying to test here?
-        */
-       function testApiListPages() {
-               global $wgServer;
-               if ( !isset( $wgServer ) ) {
-                       $this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
-               }
-
-               $ret = $this->doApiRequest( array(
-                       'action' => 'query',
-                       'prop'   => 'revisions',
-                       'titles' => 'Main Page',
-                       'rvprop' => 'timestamp|user|comment|content',
-               ) );
-
-               $result = $ret[0]['query']['pages'];
-               $this->markTestIncomplete( "Somebody needs to finish loving me" );
-       }
        
        function testRunLogin() {
                $sysopUser = self::$users['sysop'];
index 3cec99a..7e054a4 100644 (file)
@@ -8,7 +8,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         */
        protected $apiContext;
 
-       function setUp() {
+       protected function setUp() {
                global $wgContLang, $wgAuth, $wgMemc, $wgRequest, $wgUser, $wgServer;
 
                parent::setUp();
@@ -41,15 +41,31 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
 
        }
 
-       protected function doApiRequest( Array $params, Array $session = null, $appendModule = false, User $user = null ) {
+       /**
+        * Does the API request and returns the result.
+        *
+        * The returned value is an array containing
+        * - the result data (array)
+        * - the request (WebRequest)
+        * - the session data of the request (array)
+        * - if $appendModule is true, the Api module $module
+        *
+        * @param array $params
+        * @param array|null $session
+        * @param bool $appendModule
+        * @param User|null $user
+        *
+        * @return array
+        */
+       protected function doApiRequest( array $params, array $session = null, $appendModule = false, User $user = null ) {
                global $wgRequest, $wgUser;
 
                if ( is_null( $session ) ) {
-                       # re-use existing global session by default
+                       // re-use existing global session by default
                        $session = $wgRequest->getSessionArray();
                }
 
-               # set up global environment
+               // set up global environment
                if ( $user ) {
                        $wgUser = $user;
                }
@@ -57,21 +73,22 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                $wgRequest = new FauxRequest( $params, true, $session );
                RequestContext::getMain()->setRequest( $wgRequest );
 
-               # set up local environment
+               // set up local environment
                $context = $this->apiContext->newTestContext( $wgRequest, $wgUser );
 
                $module = new ApiMain( $context, true );
 
-               # run it!
+               // run it!
                $module->execute();
 
-               # construct result
+               // construct result
                $results = array(
                        $module->getResultData(),
                        $context->getRequest(),
                        $context->getRequest()->getSessionArray()
                );
-               if( $appendModule ) {
+
+               if ( $appendModule ) {
                        $results[] = $module;
                }
 
@@ -86,7 +103,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         * @param $session Array|null: session array
         * @param $user User|null A User object for the context
         */
-       protected function doApiRequestWithToken( Array $params, Array $session = null, User $user = null ) {
+       protected function doApiRequestWithToken( array $params, array $session = null, User $user = null ) {
                global $wgRequest;
 
                if ( $session === null ) {
index 39c7954..9f281bd 100644 (file)
@@ -8,19 +8,23 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
        /**
         * Fixture -- run before every test
         */
-       public function setUp() {
-               global $wgEnableUploads, $wgEnableAPI;
+       protected function setUp() {
                parent::setUp();
 
-               $wgEnableUploads = true;
-               $wgEnableAPI = true;
+               $this->setMwGlobals( array(
+                       'wgEnableUploads' => true,
+                       'wgEnableAPI' => true,
+               ) );
+
                wfSetupSession();
 
                $this->clearFakeUploads();
        }
 
-       public function tearDown() {
+       protected function tearDown() {
                $this->clearTempUpload();
+
+               parent::tearDown();
        }
 
        /**
@@ -54,7 +58,6 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                return $this->deleteFileByTitle( Title::newFromText( $fileName, NS_FILE ) );
        }
 
-
        /**
         * Helper function -- given a file on the filesystem, find matching content in the db (and associated articles) and remove them.
         * @param $filePath String: path to file on the filesystem
@@ -104,6 +107,7 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                return true;
 
        }
+
        function fakeUploadChunk(  $fieldName, $fileName, $type, & $chunkData ){
                $tmpName = tempnam( wfTempDir(), "" );
                // copy the chunk data to temp location: 
@@ -142,7 +146,4 @@ abstract class ApiTestCaseUpload extends ApiTestCase {
                $_FILES = array();
        }
 
-
-
-
 }
index d2e9815..b7ae292 100644 (file)
@@ -7,7 +7,7 @@
  */
 class ApiWatchTest extends ApiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->doLogin();
        }
@@ -29,7 +29,7 @@ class ApiWatchTest extends ApiTestCase {
 
                $data = $this->doApiRequest( array(
                        'action' => 'edit',
-                       'title' => 'UTPage',
+                       'title' => 'Help:UTPage', // Help namespace is hopefully wikitext
                        'text' => 'new text',
                        'token' => $pageinfo['edittoken'],
                        'watchlist' => 'watch' ) );
@@ -81,7 +81,7 @@ class ApiWatchTest extends ApiTestCase {
                $data = $this->doApiRequest( array(
                        'action' => 'protect',
                        'token' => $pageinfo['protecttoken'],
-                       'title' => 'UTPage',
+                       'title' => 'Help:UTPage',
                        'protections' => 'edit=sysop',
                        'watchlist' => 'unwatch' ) );
 
@@ -97,14 +97,14 @@ class ApiWatchTest extends ApiTestCase {
 
                $pageinfo = $this->getTokens();
 
-               if ( !Title::newFromText( 'UTPage' )->exists() ) {
-                       $this->markTestSkipped( "The article [[UTPage]] does not exist" ); //TODO: just create it?
+               if ( !Title::newFromText( 'Help:UTPage' )->exists() ) {
+                       $this->markTestSkipped( "The article [[Help:UTPage]] does not exist" ); //TODO: just create it?
                }
 
                $data = $this->doApiRequest( array(
                        'action' => 'query',
                        'prop' => 'revisions',
-                       'titles' => 'UTPage',
+                       'titles' => 'Help:UTPage',
                        'rvtoken' => 'rollback' ) );
 
                $this->assertArrayHasKey( 'query', $data[0] );
@@ -113,7 +113,7 @@ class ApiWatchTest extends ApiTestCase {
                $key = array_pop( $keys );
 
                if ( isset( $data[0]['query']['pages'][$key]['missing'] ) ) {
-                       $this->markTestSkipped( "Target page (UTPage) doesn't exist" );
+                       $this->markTestSkipped( "Target page (Help:UTPage) doesn't exist" );
                }
 
                $this->assertArrayHasKey( 'pageid', $data[0]['query']['pages'][$key] );
@@ -139,7 +139,7 @@ class ApiWatchTest extends ApiTestCase {
                try {
                        $data = $this->doApiRequest( array(
                                'action' => 'rollback',
-                               'title' => 'UTPage',
+                               'title' => 'Help:UTPage',
                                'user' => $revinfo['user'],
                                'token' => $pageinfo['rollbacktoken'],
                                'watchlist' => 'watch' ) );
@@ -148,7 +148,7 @@ class ApiWatchTest extends ApiTestCase {
                        $this->assertArrayHasKey( 'title', $data[0]['rollback'] );
                } catch( UsageException $ue ) {
                        if( $ue->getCodeString() == 'onlyauthor' ) {
-                               $this->markTestIncomplete( "Only one author to 'UTPage', cannot test rollback" );
+                               $this->markTestIncomplete( "Only one author to 'Help:UTPage', cannot test rollback" );
                        } else {
                                $this->fail( "Received error '" . $ue->getCodeString() . "'" );
                        }
@@ -163,7 +163,7 @@ class ApiWatchTest extends ApiTestCase {
                $data = $this->doApiRequest( array(
                        'action' => 'delete',
                        'token' => $pageinfo['deletetoken'],
-                       'title' => 'UTPage' ) );
+                       'title' => 'Help:UTPage' ) );
                $this->assertArrayHasKey( 'delete', $data[0] );
                $this->assertArrayHasKey( 'title', $data[0]['delete'] );
 
index a8b987e..52cdc78 100644 (file)
@@ -6,7 +6,7 @@
  */
 class GenderCacheTest extends MediaWikiLangTestCase {
 
-       function setUp() {
+       protected function setUp() {
                global $wgDefaultUserOptions;
                parent::setUp();
                //ensure the correct default gender
@@ -45,7 +45,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
        /**
         * test usernames
         *
-        * @dataProvider dataUserName
+        * @dataProvider provideUserGenders
         */
        function testUserName( $username, $expectedGender ) {
                $genderCache = GenderCache::singleton();
@@ -56,7 +56,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
        /**
         * genderCache should work with user objects, too
         *
-        * @dataProvider dataUserName
+        * @dataProvider provideUserGenders
         */
        function testUserObjects( $username, $expectedGender ) {
                $genderCache = GenderCache::singleton();
@@ -65,7 +65,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
        }
 
-       function dataUserName() {
+       public static function provideUserGenders() {
                return array(
                        array( 'UTMale', 'male' ),
                        array( 'UTFemale', 'female' ),
@@ -81,7 +81,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * test strip of subpages to avoid unnecessary queries
         * against the never existing username
         *
-        * @dataProvider dataStripSubpages
+        * @dataProvider provideStripSubpages
         */
        function testStripSubpages( $pageWithSubpage, $expectedGender ) {
                $genderCache = GenderCache::singleton();
@@ -89,7 +89,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
                $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
        }
 
-       function dataStripSubpages() {
+       public static function provideStripSubpages() {
                return array(
                        array( 'UTMale/subpage', 'male' ),
                        array( 'UTFemale/subpage', 'female' ),
index 30bfb12..1c081b8 100644 (file)
@@ -76,7 +76,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
        /**
         * Value which are forbidden by the constructor
         */
-       function provideInvalidConstructorArg() {
+       public static function provideInvalidConstructorArg() {
                return array(
                        array( null ),
                        array( array() ),
@@ -131,7 +131,7 @@ class ProcessCacheLRUTest extends MediaWikiTestCase {
        /**
         * Provider for testFillingCache
         */
-       function provideCacheFilling() {
+       public static function provideCacheFilling() {
                // ($cacheMaxEntries, $entryToFill, $msg='')
                return array(
                        array( 1,  0 ),
diff --git a/tests/phpunit/includes/content/ContentHandlerTest.php b/tests/phpunit/includes/content/ContentHandlerTest.php
new file mode 100644 (file)
index 0000000..73d0012
--- /dev/null
@@ -0,0 +1,421 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ *
+ * @note Declare that we are using the database, because otherwise we'll fail in the "databaseless" test run.
+ * This is because the LinkHolderArray used by the parser needs database access.
+ *
+ */
+class ContentHandlerTest extends MediaWikiTestCase {
+
+       public function setup() {
+               global $wgContLang;
+               parent::setup();
+
+               $this->setMwGlobals( array(
+                       'wgExtraNamespaces' => array(
+                               12312 => 'Dummy',
+                               12313 => 'Dummy_talk',
+                       ),
+                       // The below tests assume that namespaces not mentioned here (Help, User, MediaWiki, ..)
+                       // default to CONTENT_MODEL_WIKITEXT.
+                       'wgNamespaceContentModels' => array(
+                               12312 => 'testing',
+                       ),
+                       'wgContentHandlers' => array(
+                               CONTENT_MODEL_WIKITEXT => 'WikitextContentHandler',
+                               CONTENT_MODEL_JAVASCRIPT => 'JavaScriptContentHandler',
+                               CONTENT_MODEL_CSS => 'CssContentHandler',
+                               CONTENT_MODEL_TEXT => 'TextContentHandler',
+                               'testing' => 'DummyContentHandlerForTesting',
+                       ),
+               ) );
+
+               // Reset namespace cache
+               MWNamespace::getCanonicalNamespaces( true );
+               $wgContLang->resetNamespaces();
+       }
+
+       public function tearDown() {
+               global $wgContLang;
+
+               // Reset namespace cache
+               MWNamespace::getCanonicalNamespaces( true );
+               $wgContLang->resetNamespaces();
+
+               parent::tearDown();
+       }
+
+       public static function dataGetDefaultModelFor() {
+               return array(
+                       array( 'Help:Foo', CONTENT_MODEL_WIKITEXT ),
+                       array( 'Help:Foo.js', CONTENT_MODEL_WIKITEXT ),
+                       array( 'Help:Foo/bar.js', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo.js', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo/bar.js', CONTENT_MODEL_JAVASCRIPT ),
+                       array( 'User:Foo/bar.css', CONTENT_MODEL_CSS ),
+                       array( 'User talk:Foo/bar.css', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo/bar.js.xxx', CONTENT_MODEL_WIKITEXT ),
+                       array( 'User:Foo/bar.xxx', CONTENT_MODEL_WIKITEXT ),
+                       array( 'MediaWiki:Foo.js', CONTENT_MODEL_JAVASCRIPT ),
+                       array( 'MediaWiki:Foo.css', CONTENT_MODEL_CSS ),
+                       array( 'MediaWiki:Foo.JS', CONTENT_MODEL_WIKITEXT ),
+                       array( 'MediaWiki:Foo.CSS', CONTENT_MODEL_WIKITEXT ),
+                       array( 'MediaWiki:Foo.css.xxx', CONTENT_MODEL_WIKITEXT ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetDefaultModelFor
+        */
+       public function testGetDefaultModelFor( $title, $expectedModelId ) {
+               $title = Title::newFromText( $title );
+               $this->assertEquals( $expectedModelId, ContentHandler::getDefaultModelFor( $title ) );
+       }
+
+       /**
+        * @dataProvider dataGetDefaultModelFor
+        */
+       public function testGetForTitle( $title, $expectedContentModel ) {
+               $title = Title::newFromText( $title );
+               $handler = ContentHandler::getForTitle( $title );
+               $this->assertEquals( $expectedContentModel, $handler->getModelID() );
+       }
+
+       public static function dataGetLocalizedName() {
+               return array(
+                       array( null, null ),
+                       array( "xyzzy", null ),
+
+                       // XXX: depends on content language
+                       array( CONTENT_MODEL_JAVASCRIPT, '/javascript/i' ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetLocalizedName
+        */
+       public function testGetLocalizedName( $id, $expected ) {
+               $name = ContentHandler::getLocalizedName( $id );
+
+               if ( $expected ) {
+                       $this->assertNotNull( $name, "no name found for content model $id" );
+                       $this->assertTrue( preg_match( $expected, $name ) > 0 ,
+                               "content model name for #$id did not match pattern $expected"
+                       );
+               } else {
+                       $this->assertEquals( $id, $name, "localization of unknown model $id should have "
+                               . "fallen back to use the model id directly."
+                       );
+               }
+       }
+
+       public static function dataGetPageLanguage() {
+               global $wgLanguageCode;
+
+               return array(
+                       array( "Main", $wgLanguageCode ),
+                       array( "Dummy:Foo", $wgLanguageCode ),
+                       array( "MediaWiki:common.js", 'en' ),
+                       array( "User:Foo/common.js", 'en' ),
+                       array( "MediaWiki:common.css", 'en' ),
+                       array( "User:Foo/common.css", 'en' ),
+                       array( "User:Foo", $wgLanguageCode ),
+
+                       array( CONTENT_MODEL_JAVASCRIPT, 'javascript' ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetPageLanguage
+        */
+       public function testGetPageLanguage( $title, $expected ) {
+               if ( is_string( $title ) ) {
+                       $title = Title::newFromText( $title );
+               }
+
+               $expected = wfGetLangObj( $expected );
+
+               $handler = ContentHandler::getForTitle( $title );
+               $lang = $handler->getPageLanguage( $title );
+
+               $this->assertEquals( $expected->getCode(), $lang->getCode() );
+       }
+
+       public function testGetContentText_Null( ) {
+               global $wgContentHandlerTextFallback;
+
+               $content = null;
+
+               $wgContentHandlerTextFallback = 'fail';
+               $text = ContentHandler::getContentText( $content );
+               $this->assertEquals( '', $text );
+
+               $wgContentHandlerTextFallback = 'serialize';
+               $text = ContentHandler::getContentText( $content );
+               $this->assertEquals( '', $text );
+
+               $wgContentHandlerTextFallback = 'ignore';
+               $text = ContentHandler::getContentText( $content );
+               $this->assertEquals( '', $text );
+       }
+
+       public function testGetContentText_TextContent( ) {
+               global $wgContentHandlerTextFallback;
+
+               $content = new WikitextContent( "hello world" );
+
+               $wgContentHandlerTextFallback = 'fail';
+               $text = ContentHandler::getContentText( $content );
+               $this->assertEquals( $content->getNativeData(), $text );
+
+               $wgContentHandlerTextFallback = 'serialize';
+               $text = ContentHandler::getContentText( $content );
+               $this->assertEquals( $content->serialize(), $text );
+
+               $wgContentHandlerTextFallback = 'ignore';
+               $text = ContentHandler::getContentText( $content );
+               $this->assertEquals( $content->getNativeData(), $text );
+       }
+
+       public function testGetContentText_NonTextContent( ) {
+               global $wgContentHandlerTextFallback;
+
+               $content = new DummyContentForTesting( "hello world" );
+
+               $wgContentHandlerTextFallback = 'fail';
+
+               try {
+                       $text = ContentHandler::getContentText( $content );
+
+                       $this->fail( "ContentHandler::getContentText should have thrown an exception for non-text Content object" );
+               } catch ( MWException $ex ) {
+                       // as expected
+               }
+
+               $wgContentHandlerTextFallback = 'serialize';
+               $text = ContentHandler::getContentText( $content );
+               $this->assertEquals( $content->serialize(), $text );
+
+               $wgContentHandlerTextFallback = 'ignore';
+               $text = ContentHandler::getContentText( $content );
+               $this->assertNull( $text );
+       }
+
+       /*
+       public static function makeContent( $text, Title $title, $modelId = null, $format = null ) {}
+       */
+
+       public static function dataMakeContent() {
+               return array(
+                       array( 'hallo', 'Help:Test', null, null, CONTENT_MODEL_WIKITEXT, 'hallo', false ),
+                       array( 'hallo', 'MediaWiki:Test.js', null, null, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
+                       array( serialize('hallo'), 'Dummy:Test', null, null, "testing", 'hallo', false ),
+
+                       array( 'hallo', 'Help:Test', null, CONTENT_FORMAT_WIKITEXT, CONTENT_MODEL_WIKITEXT, 'hallo', false ),
+                       array( 'hallo', 'MediaWiki:Test.js', null, CONTENT_FORMAT_JAVASCRIPT, CONTENT_MODEL_JAVASCRIPT, 'hallo', false ),
+                       array( serialize('hallo'), 'Dummy:Test', null, "testing", "testing", 'hallo', false ),
+
+                       array( 'hallo', 'Help:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
+                       array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, 'hallo', false ),
+                       array( serialize('hallo'), 'Dummy:Test', CONTENT_MODEL_CSS, null, CONTENT_MODEL_CSS, serialize('hallo'), false ),
+
+                       array( 'hallo', 'Help:Test', CONTENT_MODEL_WIKITEXT, "testing", null, null, true ),
+                       array( 'hallo', 'MediaWiki:Test.js', CONTENT_MODEL_CSS, "testing", null, null, true ),
+                       array( 'hallo', 'Dummy:Test', CONTENT_MODEL_JAVASCRIPT, "testing", null, null, true ),
+               );
+       }
+
+       /**
+        * @dataProvider dataMakeContent
+        */
+       public function testMakeContent( $data, $title, $modelId, $format, $expectedModelId, $expectedNativeData, $shouldFail ) {
+               $title = Title::newFromText( $title );
+
+               try {
+                       $content = ContentHandler::makeContent( $data, $title, $modelId, $format );
+
+                       if ( $shouldFail ) {
+                               $this->fail( "ContentHandler::makeContent should have failed!" );
+                       }
+
+                       $this->assertEquals( $expectedModelId, $content->getModel(), 'bad model id' );
+                       $this->assertEquals( $expectedNativeData, $content->getNativeData(), 'bads native data' );
+               } catch ( MWException $ex ) {
+                       if ( !$shouldFail ) $this->fail( "ContentHandler::makeContent failed unexpectedly: " . $ex->getMessage() );
+                       else $this->assertTrue( true ); // dummy, so we don't get the "test did not perform any assertions" message.
+               }
+
+       }
+
+       /*
+       public function testSupportsSections() {
+               $this->markTestIncomplete( "not yet implemented" );
+       }
+       */
+
+       public function testRunLegacyHooks() {
+               Hooks::register( 'testRunLegacyHooks', __CLASS__ . '::dummyHookHandler' );
+
+               $content = new WikitextContent( 'test text' );
+               $ok = ContentHandler::runLegacyHooks( 'testRunLegacyHooks', array( 'foo', &$content, 'bar' ), false );
+
+               $this->assertTrue( $ok, "runLegacyHooks should have returned true" );
+               $this->assertEquals( "TEST TEXT", $content->getNativeData() );
+       }
+
+       public static function dummyHookHandler( $foo, &$text, $bar ) {
+               if ( $text === null || $text === false ) {
+                       return false;
+               }
+
+               $text = strtoupper( $text );
+
+               return true;
+       }
+}
+
+class DummyContentHandlerForTesting extends ContentHandler {
+
+       public function __construct( $dataModel ) {
+               parent::__construct( $dataModel, array( "testing" ) );
+       }
+
+       /**
+        * Serializes Content object of the type supported by this ContentHandler.
+        *
+        * @param Content $content the Content object to serialize
+        * @param null $format the desired serialization format
+        * @return String serialized form of the content
+        */
+       public function serializeContent( Content $content, $format = null ) {
+          return $content->serialize();
+       }
+
+       /**
+        * Unserializes a Content object of the type supported by this ContentHandler.
+        *
+        * @param $blob String serialized form of the content
+        * @param null $format the format used for serialization
+        * @return Content the Content object created by deserializing $blob
+        */
+       public function unserializeContent( $blob, $format = null ) {
+               $d = unserialize( $blob );
+               return new DummyContentForTesting( $d );
+       }
+
+       /**
+        * Creates an empty Content object of the type supported by this ContentHandler.
+        *
+        */
+       public function makeEmptyContent() {
+               return new DummyContentForTesting( '' );
+       }
+}
+
+class DummyContentForTesting extends AbstractContent {
+
+       public function __construct( $data ) {
+               parent::__construct( "testing" );
+
+               $this->data = $data;
+       }
+
+       public function serialize( $format = null ) {
+               return serialize( $this->data );
+       }
+
+       /**
+        * @return String a string representing the content in a way useful for building a full text search index.
+        *         If no useful representation exists, this method returns an empty string.
+        */
+       public function getTextForSearchIndex() {
+               return '';
+       }
+
+       /**
+        * @return String the wikitext to include when another page includes this  content, or false if the content is not
+        *  includable in a wikitext page.
+        */
+       public function getWikitextForTransclusion() {
+               return false;
+       }
+
+       /**
+        * Returns a textual representation of the content suitable for use in edit summaries and log messages.
+        *
+        * @param int $maxlength Maximum length of the summary text.
+        * @return string The summary text.
+        */
+       public function getTextForSummary( $maxlength = 250 ) {
+               return '';
+       }
+
+       /**
+        * Returns native represenation of the data. Interpretation depends on the data model used,
+        * as given by getDataModel().
+        *
+        * @return mixed the native representation of the content. Could be a string, a nested array
+        *  structure, an object, a binary blob... anything, really.
+        */
+       public function getNativeData()
+       {
+               return $this->data;
+       }
+
+       /**
+        * returns the content's nominal size in bogo-bytes.
+        *
+        * @return int
+        */
+       public function getSize() {
+               return strlen( $this->data );
+       }
+
+       /**
+        * Return a copy of this Content object. The following must be true for the object returned
+        * if $copy = $original->copy()
+        *
+        * * get_class($original) === get_class($copy)
+        * * $original->getModel() === $copy->getModel()
+        * * $original->equals( $copy )
+        *
+        * If and only if the Content object is imutable, the copy() method can and should
+        * return $this. That is,  $copy === $original may be true, but only for imutable content
+        * objects.
+        *
+        * @return Content. A copy of this object.
+        */
+       public function copy() {
+               return $this;
+       }
+
+       /**
+        * Returns true if this content is countable as a "real" wiki page, provided
+        * that it's also in a countable location (e.g. a current revision in the main namespace).
+        *
+        * @param boolean $hasLinks if it is known whether this content contains links, provide this information here,
+        *  to avoid redundant parsing to find out.
+        * @return boolean
+        */
+       public function isCountable( $hasLinks = null ) {
+               return false;
+       }
+
+       /**
+        * @param Title $title
+        * @param null $revId
+        * @param null|ParserOptions $options
+        * @param boolean $generateHtml whether to generate Html (default: true). If false,
+        *  the result of calling getText() on the ParserOutput object returned by
+        *   this method is undefined.
+        *
+        * @return ParserOutput
+        */
+       public function getParserOutput( Title $title, $revId = null, ParserOptions $options = NULL, $generateHtml = true ) {
+               return new ParserOutput( $this->getNativeData() );
+       }
+}
diff --git a/tests/phpunit/includes/content/CssContentTest.php b/tests/phpunit/includes/content/CssContentTest.php
new file mode 100644 (file)
index 0000000..b08a468
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ *        ^--- needed, because we do need the database to test link updates
+ */
+class CssContentTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Anon user
+               $user = new User();
+               $user->setName( '127.0.0.1' );
+
+               $this->setMwGlobals( array(
+                       'wgUser' => $user,
+                       'wgTextModelsToParse' => array(
+                               CONTENT_MODEL_CSS,
+                       )
+               ) );
+       }
+
+       public function newContent( $text ) {
+               return new CssContent( $text );
+       }
+
+       public static function dataGetParserOutput() {
+               return array(
+                       array(
+                               'MediaWiki:Test.css',
+                               null,
+                               "hello <world>\n",
+                               "<pre class=\"mw-code mw-css\" dir=\"ltr\">\nhello &lt;world&gt;\n\n</pre>"
+                       ),
+                       array(
+                               'MediaWiki:Test.css',
+                               null,
+                               "/* hello [[world]] */\n",
+                               "<pre class=\"mw-code mw-css\" dir=\"ltr\">\n/* hello [[world]] */\n\n</pre>",
+                               array(
+                                       'Links' => array(
+                                               array( 'World' => 0 )
+                                       )
+                               )
+                       ),
+
+                       // TODO: more...?
+               );
+       }
+
+       public function testGetModel() {
+               $content = $this->newContent( 'hello world.' );
+
+               $this->assertEquals( CONTENT_MODEL_CSS, $content->getModel() );
+       }
+
+       public function testGetContentHandler() {
+               $content = $this->newContent( 'hello world.' );
+
+               $this->assertEquals( CONTENT_MODEL_CSS, $content->getContentHandler()->getModelID() );
+       }
+
+       public static function dataEquals( ) {
+               return array(
+                       array( new CssContent( 'hallo' ), null, false ),
+                       array( new CssContent( 'hallo' ), new CssContent( 'hallo' ), true ),
+                       array( new CssContent( 'hallo' ), new WikitextContent( 'hallo' ), false ),
+                       array( new CssContent( 'hallo' ), new CssContent( 'HALLO' ), false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataEquals
+        */
+       public function testEquals( Content $a, Content $b = null, $equal = false ) {
+               $this->assertEquals( $equal, $a->equals( $b ) );
+       }
+
+}
diff --git a/tests/phpunit/includes/content/JavaScriptContentTest.php b/tests/phpunit/includes/content/JavaScriptContentTest.php
new file mode 100644 (file)
index 0000000..18df53f
--- /dev/null
@@ -0,0 +1,273 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ *        ^--- needed, because we do need the database to test link updates
+ */
+class JavaScriptContentTest extends TextContentTest {
+
+       public function newContent( $text ) {
+               return new JavaScriptContent( $text );
+       }
+
+       public static function dataGetParserOutput() {
+               return array(
+                       array(
+                               'MediaWiki:Test.js',
+                               null,
+                               "hello <world>\n",
+                               "<pre class=\"mw-code mw-js\" dir=\"ltr\">\nhello &lt;world&gt;\n\n</pre>"
+                       ),
+                       array(
+                               'MediaWiki:Test.js',
+                               null,
+                               "hello(); // [[world]]\n",
+                               "<pre class=\"mw-code mw-js\" dir=\"ltr\">\nhello(); // [[world]]\n\n</pre>",
+                               array(
+                                       'Links' => array(
+                                               array( 'World' => 0 )
+                                       )
+                               )
+                       ),
+
+                       // TODO: more...?
+               );
+       }
+
+       // XXX: Unused function
+       public static function dataGetSection() {
+               return array(
+                       array( WikitextContentTest::$sections,
+                              '0',
+                              null
+                       ),
+                       array( WikitextContentTest::$sections,
+                              '2',
+                              null
+                       ),
+                       array( WikitextContentTest::$sections,
+                              '8',
+                              null
+                       ),
+               );
+       }
+
+       // XXX: Unused function
+       public static function dataReplaceSection() {
+               return array(
+                       array( WikitextContentTest::$sections,
+                              '0',
+                              'No more',
+                              null,
+                              null
+                       ),
+                       array( WikitextContentTest::$sections,
+                              '',
+                              'No more',
+                              null,
+                              null
+                       ),
+                       array( WikitextContentTest::$sections,
+                              '2',
+                              "== TEST ==\nmore fun",
+                              null,
+                              null
+                       ),
+                       array( WikitextContentTest::$sections,
+                              '8',
+                              'No more',
+                              null,
+                              null
+                       ),
+                       array( WikitextContentTest::$sections,
+                              'new',
+                              'No more',
+                              'New',
+                              null
+                       ),
+               );
+       }
+
+       public function testAddSectionHeader( ) {
+               $content = $this->newContent( 'hello world' );
+               $c = $content->addSectionHeader( 'test' );
+
+               $this->assertTrue( $content->equals( $c ) );
+       }
+
+       // XXX: currently, preSaveTransform is applied to scripts. this may change or become optional.
+       public static 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>',
+                       ),
+                       array( " Foo \n ",
+                               " Foo",
+                       ),
+               );
+       }
+
+       public static function dataPreloadTransform() {
+               return array(
+                       array( 'hello this is ~~~',
+                              'hello this is ~~~',
+                       ),
+                       array( 'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
+                              'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
+                       ),
+               );
+       }
+
+       public static function dataGetRedirectTarget() {
+               return array(
+                       array( '#REDIRECT [[Test]]',
+                              null,
+                       ),
+                       array( '#REDIRECT Test',
+                              null,
+                       ),
+                       array( '* #REDIRECT [[Test]]',
+                              null,
+                       ),
+               );
+       }
+
+       /**
+        * @todo: test needs database!
+        */
+       /*
+       public function getRedirectChain() {
+               $text = $this->getNativeData();
+               return Title::newFromRedirectArray( $text );
+       }
+       */
+
+       /**
+        * @todo: test needs database!
+        */
+       /*
+       public function getUltimateRedirectTarget() {
+               $text = $this->getNativeData();
+               return Title::newFromRedirectRecurse( $text );
+       }
+       */
+
+       public static function dataIsCountable() {
+               return array(
+                       array( '',
+                              null,
+                              'any',
+                              true
+                       ),
+                       array( 'Foo',
+                              null,
+                              'any',
+                              true
+                       ),
+                       array( 'Foo',
+                              null,
+                              'comma',
+                              false
+                       ),
+                       array( 'Foo, bar',
+                              null,
+                              'comma',
+                              false
+                       ),
+                       array( 'Foo',
+                              null,
+                              'link',
+                              false
+                       ),
+                       array( 'Foo [[bar]]',
+                              null,
+                              'link',
+                              false
+                       ),
+                       array( 'Foo',
+                              true,
+                              'link',
+                              false
+                       ),
+                       array( 'Foo [[bar]]',
+                              false,
+                              'link',
+                              false
+                       ),
+                       array( '#REDIRECT [[bar]]',
+                              true,
+                              'any',
+                              true
+                       ),
+                       array( '#REDIRECT [[bar]]',
+                              true,
+                              'comma',
+                              false
+                       ),
+                       array( '#REDIRECT [[bar]]',
+                              true,
+                              'link',
+                              false
+                       ),
+               );
+       }
+
+       public static function dataGetTextForSummary() {
+               return array(
+                       array( "hello\nworld.",
+                              16,
+                              'hello world.',
+                       ),
+                       array( 'hello world.',
+                              8,
+                              'hello...',
+                       ),
+                       array( '[[hello world]].',
+                              8,
+                              '[[hel...',
+                       ),
+               );
+       }
+
+       public function testMatchMagicWord( ) {
+               $mw = MagicWord::get( "staticredirect" );
+
+               $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
+               $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word, since it's not wikitext" );
+       }
+
+       public function testUpdateRedirect( ) {
+               $target = Title::newFromText( "testUpdateRedirect_target" );
+
+               $content = $this->newContent( "#REDIRECT [[Someplace]]" );
+               $newContent = $content->updateRedirect( $target );
+
+               $this->assertTrue( $content->equals( $newContent ), "content should be unchanged since it's not wikitext" );
+       }
+
+       public function testGetModel() {
+               $content = $this->newContent( "hello world." );
+
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getModel() );
+       }
+
+       public function testGetContentHandler() {
+               $content = $this->newContent( "hello world." );
+
+               $this->assertEquals( CONTENT_MODEL_JAVASCRIPT, $content->getContentHandler()->getModelID() );
+       }
+
+       public static function dataEquals( ) {
+               return array(
+                       array( new JavaScriptContent( "hallo" ), null, false ),
+                       array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "hallo" ), true ),
+                       array( new JavaScriptContent( "hallo" ), new CssContent( "hallo" ), false ),
+                       array( new JavaScriptContent( "hallo" ), new JavaScriptContent( "HALLO" ), false ),
+               );
+       }
+
+}
diff --git a/tests/phpunit/includes/content/TextContentTest.php b/tests/phpunit/includes/content/TextContentTest.php
new file mode 100644 (file)
index 0000000..3501aec
--- /dev/null
@@ -0,0 +1,427 @@
+<?php
+
+/**
+ * @group ContentHandler
+ * @group Database
+ *        ^--- needed, because we do need the database to test link updates
+ */
+class TextContentTest extends MediaWikiLangTestCase {
+       protected $context;
+
+       protected function setUp() {
+               parent::setUp();
+
+               // Anon user
+               $user = new User();
+               $user->setName( '127.0.0.1' );
+
+               $this->setMwGlobals( array(
+                       'wgUser' => $user,
+                       'wgTextModelsToParse' => array(
+                               CONTENT_MODEL_WIKITEXT,
+                               CONTENT_MODEL_CSS,
+                               CONTENT_MODEL_JAVASCRIPT,
+                       ),
+                       'wgAlwaysUseTidy' => false,
+               ) );
+
+               $this->context = new RequestContext( new FauxRequest() );
+               $this->context->setTitle( Title::newFromText( 'Test' ) );
+               $this->context->setUser( $user );
+       }
+
+       public function newContent( $text ) {
+               return new TextContent( $text );
+       }
+
+       public static function dataGetParserOutput() {
+               return array(
+                       array(
+                               'TextContentTest_testGetParserOutput',
+                               CONTENT_MODEL_TEXT,
+                               "hello ''world'' & [[stuff]]\n", "hello ''world'' &amp; [[stuff]]",
+                               array(
+                                       'Links' => array()
+                               )
+                       ),
+                       // TODO: more...?
+               );
+       }
+
+       /**
+        * @dataProvider dataGetParserOutput
+        */
+       public function testGetParserOutput( $title, $model, $text, $expectedHtml, $expectedFields = null ) {
+               $title = Title::newFromText( $title );
+               $content = ContentHandler::makeContent( $text, $title, $model );
+
+               $po = $content->getParserOutput( $title );
+
+               $html = $po->getText();
+               $html = preg_replace( '#<!--.*?-->#sm', '', $html ); // strip comments
+
+               $this->assertEquals( $expectedHtml, trim( $html ) );
+
+               if ( $expectedFields ) {
+                       foreach ( $expectedFields as $field => $exp ) {
+                               $f = 'get' . ucfirst( $field );
+                               $v = call_user_func( array( $po, $f ) );
+
+                               if ( is_array( $exp ) ) {
+                                       $this->assertArrayEquals( $exp, $v );
+                               } else {
+                                       $this->assertEquals( $exp, $v );
+                               }
+                       }
+               }
+
+               // TODO: assert more properties
+       }
+
+       public static function dataPreSaveTransform() {
+               return array(
+                       array(
+                               #0: no signature resolution
+                               'hello this is ~~~',
+                               'hello this is ~~~',
+                       ),
+                       array(
+                               #1: rtrim
+                               " Foo \n ",
+                               ' Foo',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataPreSaveTransform
+        */
+       public function testPreSaveTransform( $text, $expected ) {
+               global $wgContLang;
+
+               $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), $wgContLang );
+
+               $content = $this->newContent( $text );
+               $content = $content->preSaveTransform( $this->context->getTitle(), $this->context->getUser(), $options );
+
+               $this->assertEquals( $expected, $content->getNativeData() );
+       }
+
+       public static function dataPreloadTransform() {
+               return array(
+                       array(
+                               'hello this is ~~~',
+                               'hello this is ~~~',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataPreloadTransform
+        */
+       public function testPreloadTransform( $text, $expected ) {
+               global $wgContLang;
+               $options = ParserOptions::newFromUserAndLang( $this->context->getUser(), $wgContLang );
+
+               $content = $this->newContent( $text );
+               $content = $content->preloadTransform( $this->context->getTitle(), $options );
+
+               $this->assertEquals( $expected, $content->getNativeData() );
+       }
+
+       public static function dataGetRedirectTarget() {
+               return array(
+                       array( '#REDIRECT [[Test]]',
+                               null,
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetRedirectTarget
+        */
+       public function testGetRedirectTarget( $text, $expected ) {
+               $content = $this->newContent( $text );
+               $t = $content->getRedirectTarget( );
+
+               if ( is_null( $expected ) ) {
+                       $this->assertNull( $t, "text should not have generated a redirect target: $text" );
+               } else {
+                       $this->assertEquals( $expected, $t->getPrefixedText() );
+               }
+       }
+
+       /**
+        * @dataProvider dataGetRedirectTarget
+        */
+       public function testIsRedirect( $text, $expected ) {
+               $content = $this->newContent( $text );
+
+               $this->assertEquals( !is_null($expected), $content->isRedirect() );
+       }
+
+       /**
+        * @todo: test needs database! Should be done by a test class in the Database group.
+        */
+       /*
+       public function getRedirectChain() {
+               $text = $this->getNativeData();
+               return Title::newFromRedirectArray( $text );
+       }
+       */
+
+       /**
+        * @todo: test needs database! Should be done by a test class in the Database group.
+        */
+       /*
+       public function getUltimateRedirectTarget() {
+               $text = $this->getNativeData();
+               return Title::newFromRedirectRecurse( $text );
+       }
+       */
+
+       public static function dataIsCountable() {
+               return array(
+                       array( '',
+                              null,
+                              'any',
+                              true
+                       ),
+                       array( 'Foo',
+                              null,
+                              'any',
+                              true
+                       ),
+                       array( 'Foo',
+                              null,
+                              'comma',
+                              false
+                       ),
+                       array( 'Foo, bar',
+                              null,
+                              'comma',
+                              false
+                       ),
+               );
+       }
+
+
+       /**
+        * @dataProvider dataIsCountable
+        * @group Database
+        */
+       public function testIsCountable( $text, $hasLinks, $mode, $expected ) {
+               global $wgArticleCountMethod;
+
+               $old = $wgArticleCountMethod;
+               $wgArticleCountMethod = $mode;
+
+               $content = $this->newContent( $text );
+
+               $v = $content->isCountable( $hasLinks, $this->context->getTitle() );
+               $wgArticleCountMethod = $old;
+
+               $this->assertEquals( $expected, $v, 'isCountable() returned unexpected value ' . var_export( $v, true )
+                                                   . ' instead of ' . var_export( $expected, true ) . " in mode `$mode` for text \"$text\"" );
+       }
+
+       public static function dataGetTextForSummary() {
+               return array(
+                       array( "hello\nworld.",
+                              16,
+                              'hello world.',
+                       ),
+                       array( 'hello world.',
+                              8,
+                              'hello...',
+                       ),
+                       array( '[[hello world]].',
+                              8,
+                              '[[hel...',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetTextForSummary
+        */
+       public function testGetTextForSummary( $text, $maxlength, $expected ) {
+               $content = $this->newContent( $text );
+
+               $this->assertEquals( $expected, $content->getTextForSummary( $maxlength ) );
+       }
+
+
+       public function testGetTextForSearchIndex( ) {
+               $content = $this->newContent( 'hello world.' );
+
+               $this->assertEquals( 'hello world.', $content->getTextForSearchIndex() );
+       }
+
+       public function testCopy() {
+               $content = $this->newContent( 'hello world.' );
+               $copy = $content->copy();
+
+               $this->assertTrue( $content->equals( $copy ), 'copy must be equal to original' );
+               $this->assertEquals( 'hello world.', $copy->getNativeData() );
+       }
+
+       public function testGetSize( ) {
+               $content = $this->newContent( 'hello world.' );
+
+               $this->assertEquals( 12, $content->getSize() );
+       }
+
+       public function testGetNativeData( ) {
+               $content = $this->newContent( 'hello world.' );
+
+               $this->assertEquals( 'hello world.', $content->getNativeData() );
+       }
+
+       public function testGetWikitextForTransclusion( ) {
+               $content = $this->newContent( 'hello world.' );
+
+               $this->assertEquals( 'hello world.', $content->getWikitextForTransclusion() );
+       }
+
+       public function testGetModel() {
+               $content = $this->newContent( "hello world." );
+
+               $this->assertEquals( CONTENT_MODEL_TEXT, $content->getModel() );
+       }
+
+       public function testGetContentHandler() {
+               $content = $this->newContent( "hello world." );
+
+               $this->assertEquals( CONTENT_MODEL_TEXT, $content->getContentHandler()->getModelID() );
+       }
+
+       public static function dataIsEmpty( ) {
+               return array(
+                       array( '', true ),
+                       array( '  ', false ),
+                       array( '0', false ),
+                       array( 'hallo welt.', false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsEmpty
+        */
+       public function testIsEmpty( $text, $empty ) {
+               $content = $this->newContent( $text );
+
+               $this->assertEquals( $empty, $content->isEmpty() );
+       }
+
+       public static function dataEquals( ) {
+               return array(
+                       array( new TextContent( "hallo" ), null, false ),
+                       array( new TextContent( "hallo" ), new TextContent( "hallo" ), true ),
+                       array( new TextContent( "hallo" ), new JavaScriptContent( "hallo" ), false ),
+                       array( new TextContent( "hallo" ), new WikitextContent( "hallo" ), false ),
+                       array( new TextContent( "hallo" ), new TextContent( "HALLO" ), false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataEquals
+        */
+       public function testEquals( Content $a, Content $b = null, $equal = false ) {
+               $this->assertEquals( $equal, $a->equals( $b ) );
+       }
+
+       public static function dataGetDeletionUpdates() {
+               return array(
+                       array("TextContentTest_testGetSecondaryDataUpdates_1",
+                               CONTENT_MODEL_TEXT, "hello ''world''\n",
+                               array( )
+                       ),
+                       array("TextContentTest_testGetSecondaryDataUpdates_2",
+                               CONTENT_MODEL_TEXT, "hello [[world test 21344]]\n",
+                               array( )
+                       ),
+                       // TODO: more...?
+               );
+       }
+
+       /**
+        * @dataProvider dataGetDeletionUpdates
+        */
+       public function testDeletionUpdates( $title, $model, $text, $expectedStuff ) {
+               $title = Title::newFromText( $title );
+               $title->resetArticleID( 2342 ); //dummy id. fine as long as we don't try to execute the updates!
+
+               $content = ContentHandler::makeContent( $text, $title, $model );
+
+               $updates = $content->getDeletionUpdates( WikiPage::factory( $title ) );
+
+               // make updates accessible by class name
+               foreach ( $updates as $update ) {
+                       $class = get_class( $update );
+                       $updates[ $class ] = $update;
+               }
+
+               if ( !$expectedStuff ) {
+                       $this->assertTrue( true ); // make phpunit happy
+                       return;
+               }
+
+               foreach ( $expectedStuff as $class => $fieldValues ) {
+                       $this->assertArrayHasKey( $class, $updates, "missing an update of type $class" );
+
+                       $update = $updates[ $class ];
+
+                       foreach ( $fieldValues as $field => $value ) {
+                               $v = $update->$field; #if the field doesn't exist, just crash and burn
+                               $this->assertEquals( $value, $v, "unexpected value for field $field in instance of $class" );
+                       }
+               }
+       }
+
+       public static function provideConvert() {
+               return array(
+                       array( // #0
+                               'Hallo Welt',
+                               CONTENT_MODEL_WIKITEXT,
+                               'lossless',
+                               'Hallo Welt'
+                       ),
+                       array( // #1
+                               'Hallo Welt',
+                               CONTENT_MODEL_WIKITEXT,
+                               'lossless',
+                               'Hallo Welt'
+                       ),
+                       array( // #1
+                               'Hallo Welt',
+                               CONTENT_MODEL_CSS,
+                               'lossless',
+                               'Hallo Welt'
+                       ),
+                       array( // #1
+                               'Hallo Welt',
+                               CONTENT_MODEL_JAVASCRIPT,
+                               'lossless',
+                               'Hallo Welt'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideConvert
+        */
+       public function testConvert( $text, $model, $lossy, $expectedNative ) {
+               $content = $this->newContent( $text );
+
+               $converted = $content->convert( $model, $lossy );
+
+               if ( $expectedNative === false ) {
+                       $this->assertFalse( $converted, "conversion to $model was expected to fail!" );
+               } else {
+                       $this->assertInstanceOf( 'Content', $converted );
+                       $this->assertEquals( $expectedNative, $converted->getNativeData() );
+               }
+       }
+
+}
diff --git a/tests/phpunit/includes/content/WikitextContentHandlerTest.php b/tests/phpunit/includes/content/WikitextContentHandlerTest.php
new file mode 100644 (file)
index 0000000..8121099
--- /dev/null
@@ -0,0 +1,185 @@
+<?php
+
+/**
+ * @group ContentHandler
+ */
+class WikitextContentHandlerTest extends MediaWikiLangTestCase {
+
+       /**
+        * @var ContentHandler
+        */
+       var $handler;
+
+       public function setUp() {
+               parent::setUp();
+
+               $this->handler = ContentHandler::getForModelID( CONTENT_MODEL_WIKITEXT );
+       }
+
+       public function testSerializeContent( ) {
+               $content = new WikitextContent( 'hello world' );
+
+               $this->assertEquals( 'hello world', $this->handler->serializeContent( $content ) );
+               $this->assertEquals( 'hello world', $this->handler->serializeContent( $content, CONTENT_FORMAT_WIKITEXT ) );
+
+               try {
+                       $this->handler->serializeContent( $content, 'dummy/foo' );
+                       $this->fail( "serializeContent() should have failed on unknown format" );
+               } catch ( MWException $e ) {
+                       // ok, as expected
+               }
+       }
+
+       public function testUnserializeContent( ) {
+               $content = $this->handler->unserializeContent( 'hello world' );
+               $this->assertEquals( 'hello world', $content->getNativeData() );
+
+               $content = $this->handler->unserializeContent( 'hello world', CONTENT_FORMAT_WIKITEXT );
+               $this->assertEquals( 'hello world', $content->getNativeData() );
+
+               try {
+                       $this->handler->unserializeContent( 'hello world', 'dummy/foo' );
+                       $this->fail( "unserializeContent() should have failed on unknown format" );
+               } catch ( MWException $e ) {
+                       // ok, as expected
+               }
+       }
+
+       public function testMakeEmptyContent() {
+               $content = $this->handler->makeEmptyContent();
+
+               $this->assertTrue( $content->isEmpty() );
+               $this->assertEquals( '', $content->getNativeData() );
+       }
+
+       public static function dataIsSupportedFormat( ) {
+               return array(
+                       array( null, true ),
+                       array( CONTENT_FORMAT_WIKITEXT, true ),
+                       array( 99887766, false ),
+               );
+       }
+
+       /**
+        * @dataProvider dataIsSupportedFormat
+        */
+       public function testIsSupportedFormat( $format, $supported ) {
+               $this->assertEquals( $supported, $this->handler->isSupportedFormat( $format ) );
+       }
+
+       public static function dataMerge3( ) {
+               return array(
+                       array( "first paragraph
+
+                                       second paragraph\n",
+
+                                       "FIRST paragraph
+
+                                       second paragraph\n",
+
+                                       "first paragraph
+
+                                       SECOND paragraph\n",
+
+                                       "FIRST paragraph
+
+                                       SECOND paragraph\n",
+                       ),
+
+                       array( "first paragraph
+                                       second paragraph\n",
+
+                                  "Bla bla\n",
+
+                                  "Blubberdibla\n",
+
+                                  false,
+                       ),
+
+               );
+       }
+
+       /**
+        * @dataProvider dataMerge3
+        */
+       public function testMerge3( $old, $mine, $yours, $expected ) {
+               $this->checkHasDiff3();
+
+               // test merge
+               $oldContent = new WikitextContent( $old );
+               $myContent = new WikitextContent( $mine );
+               $yourContent = new WikitextContent( $yours );
+
+               $merged = $this->handler->merge3( $oldContent, $myContent, $yourContent );
+
+               $this->assertEquals( $expected, $merged ? $merged->getNativeData() : $merged );
+       }
+
+       public static function dataGetAutosummary( ) {
+               return array(
+                       array(
+                               'Hello there, world!',
+                               '#REDIRECT [[Foo]]',
+                               0,
+                               '/^Redirected page .*Foo/'
+                       ),
+
+                       array(
+                               null,
+                               'Hello world!',
+                               EDIT_NEW,
+                               '/^Created page .*Hello/'
+                       ),
+
+                       array(
+                               'Hello there, world!',
+                               '',
+                               0,
+                               '/^Blanked/'
+                       ),
+
+                       array(
+                               'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
+                               labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et
+                               ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.',
+                               'Hello world!',
+                               0,
+                               '/^Replaced .*Hello/'
+                       ),
+
+                       array(
+                               'foo',
+                               'bar',
+                               0,
+                               '/^$/'
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetAutosummary
+        */
+       public function testGetAutosummary( $old, $new, $flags, $expected ) {
+               $oldContent = is_null( $old ) ? null : new WikitextContent( $old );
+               $newContent = is_null( $new ) ? null : new WikitextContent( $new );
+
+               $summary = $this->handler->getAutosummary( $oldContent, $newContent, $flags );
+
+               $this->assertTrue( (bool)preg_match( $expected, $summary ), "Autosummary didn't match expected pattern $expected: $summary" );
+       }
+
+       /**
+        * @todo Text case requires database, should be done by a test class in the Database group
+        */
+       /*
+       public function testGetAutoDeleteReason( Title $title, &$hasHistory ) {}
+       */
+
+       /**
+        * @todo Text case requires database, should be done by a test class in the Database group
+        */
+       /*
+       public function testGetUndoContent( Revision $current, Revision $undo, Revision $undoafter = null ) {}
+       */
+
+}
diff --git a/tests/phpunit/includes/content/WikitextContentTest.php b/tests/phpunit/includes/content/WikitextContentTest.php
new file mode 100644 (file)
index 0000000..b76e9aa
--- /dev/null
@@ -0,0 +1,385 @@
+<?php
+
+/**
+ * @group ContentHandler
+ *
+ * @group Database
+ *        ^--- needed, because we do need the database to test link updates
+ */
+class WikitextContentTest extends TextContentTest {
+
+       static $sections =
+
+"Intro
+
+== stuff ==
+hello world
+
+== test ==
+just a test
+
+== foo ==
+more stuff
+";
+
+       public function newContent( $text ) {
+               return new WikitextContent( $text );
+       }
+
+       public static function dataGetParserOutput() {
+               return array(
+                       array(
+                               "WikitextContentTest_testGetParserOutput",
+                               CONTENT_MODEL_WIKITEXT,
+                               "hello ''world''\n",
+                               "<p>hello <i>world</i>\n</p>"
+                       ),
+                       // TODO: more...?
+               );
+       }
+
+       public static function dataGetSecondaryDataUpdates() {
+               return array(
+                       array( "WikitextContentTest_testGetSecondaryDataUpdates_1",
+                               CONTENT_MODEL_WIKITEXT, "hello ''world''\n",
+                               array(
+                                       'LinksUpdate' => array(
+                                               'mRecursive' => true,
+                                               'mLinks' => array()
+                                       )
+                               )
+                       ),
+                       array( "WikitextContentTest_testGetSecondaryDataUpdates_2",
+                               CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
+                               array(
+                                       'LinksUpdate' => array(
+                                               'mRecursive' => true,
+                                               'mLinks' => array(
+                                                       array( 'World_test_21344' => 0 )
+                                               )
+                                       )
+                               )
+                       ),
+                       // TODO: more...?
+               );
+       }
+
+       /**
+        * @dataProvider dataGetSecondaryDataUpdates
+        * @group Database
+        */
+       public function testGetSecondaryDataUpdates( $title, $model, $text, $expectedStuff ) {
+               $title = Title::newFromText( $title );
+               $title->resetArticleID( 2342 ); //dummy id. fine as long as we don't try to execute the updates!
+
+               $content = ContentHandler::makeContent( $text, $title, $model );
+
+               $updates = $content->getSecondaryDataUpdates( $title );
+
+               // make updates accessible by class name
+               foreach ( $updates as $update ) {
+                       $class = get_class( $update );
+                       $updates[$class] = $update;
+               }
+
+               foreach ( $expectedStuff as $class => $fieldValues ) {
+                       $this->assertArrayHasKey( $class, $updates, "missing an update of type $class" );
+
+                       $update = $updates[$class];
+
+                       foreach ( $fieldValues as $field => $value ) {
+                               $v = $update->$field; #if the field doesn't exist, just crash and burn
+                               $this->assertEquals( $value, $v, "unexpected value for field $field in instance of $class" );
+                       }
+               }
+       }
+
+       public static function dataGetSection() {
+               return array(
+                       array( WikitextContentTest::$sections,
+                                       "0",
+                                       "Intro"
+                       ),
+                       array( WikitextContentTest::$sections,
+                                       "2",
+"== test ==
+just a test"
+                       ),
+                       array( WikitextContentTest::$sections,
+                                       "8",
+                                       false
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataGetSection
+        */
+       public function testGetSection( $text, $sectionId, $expectedText ) {
+               $content = $this->newContent( $text );
+
+               $sectionContent = $content->getSection( $sectionId );
+               if ( is_object( $sectionContent ) ) {
+                       $sectionText = $sectionContent->getNativeData();
+               } else {
+                       $sectionText = $sectionContent;
+               }
+
+               $this->assertEquals( $expectedText, $sectionText );
+       }
+
+       public static function dataReplaceSection() {
+               return array(
+                       array( WikitextContentTest::$sections,
+                              "0",
+                              "No more",
+                              null,
+                              trim( preg_replace( '/^Intro/sm', 'No more', WikitextContentTest::$sections ) )
+                       ),
+                       array( WikitextContentTest::$sections,
+                              "",
+                              "No more",
+                              null,
+                              "No more"
+                       ),
+                       array( WikitextContentTest::$sections,
+                              "2",
+                              "== TEST ==\nmore fun",
+                              null,
+                              trim( preg_replace( '/^== test ==.*== foo ==/sm', "== TEST ==\nmore fun\n\n== foo ==", WikitextContentTest::$sections ) )
+                       ),
+                       array( WikitextContentTest::$sections,
+                              "8",
+                              "No more",
+                              null,
+                              WikitextContentTest::$sections
+                       ),
+                       array( WikitextContentTest::$sections,
+                              "new",
+                              "No more",
+                              "New",
+                              trim( WikitextContentTest::$sections ) . "\n\n\n== New ==\n\nNo more"
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataReplaceSection
+        */
+       public function testReplaceSection( $text, $section, $with, $sectionTitle, $expected ) {
+               $content = $this->newContent( $text );
+               $c = $content->replaceSection( $section, $this->newContent( $with ), $sectionTitle );
+
+               $this->assertEquals( $expected, is_null( $c ) ? null : $c->getNativeData() );
+       }
+
+       public function testAddSectionHeader( ) {
+               $content = $this->newContent( 'hello world' );
+               $content = $content->addSectionHeader( 'test' );
+
+               $this->assertEquals( "== test ==\n\nhello world", $content->getNativeData() );
+       }
+
+       public static 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>',
+                       ),
+                       array( // rtrim
+                               " Foo \n ",
+                               " Foo",
+                       ),
+               );
+       }
+
+       public static function dataPreloadTransform() {
+               return array(
+                       array( 'hello this is ~~~',
+                              "hello this is ~~~",
+                       ),
+                       array( 'hello \'\'this\'\' is <noinclude>foo</noinclude><includeonly>bar</includeonly>',
+                              'hello \'\'this\'\' is bar',
+                       ),
+               );
+       }
+
+       public static function dataGetRedirectTarget() {
+               return array(
+                       array( '#REDIRECT [[Test]]',
+                              'Test',
+                       ),
+                       array( '#REDIRECT Test',
+                              null,
+                       ),
+                       array( '* #REDIRECT [[Test]]',
+                              null,
+                       ),
+               );
+       }
+
+       public static function dataGetTextForSummary() {
+               return array(
+                       array( "hello\nworld.",
+                               16,
+                               'hello world.',
+                       ),
+                       array( 'hello world.',
+                               8,
+                               'hello...',
+                       ),
+                       array( '[[hello world]].',
+                               8,
+                               'hel...',
+                       ),
+               );
+       }
+
+       /**
+        * @todo: test needs database! Should be done by a test class in the Database group.
+        */
+       /*
+       public function getRedirectChain() {
+               $text = $this->getNativeData();
+               return Title::newFromRedirectArray( $text );
+       }
+       */
+
+       /**
+        * @todo: test needs database! Should be done by a test class in the Database group.
+        */
+       /*
+       public function getUltimateRedirectTarget() {
+               $text = $this->getNativeData();
+               return Title::newFromRedirectRecurse( $text );
+       }
+       */
+
+       public static function dataIsCountable() {
+               return array(
+                       array( '',
+                              null,
+                              'any',
+                              true
+                       ),
+                       array( 'Foo',
+                              null,
+                              'any',
+                              true
+                       ),
+                       array( 'Foo',
+                              null,
+                              'comma',
+                              false
+                       ),
+                       array( 'Foo, bar',
+                              null,
+                              'comma',
+                              true
+                       ),
+                       array( 'Foo',
+                              null,
+                              'link',
+                              false
+                       ),
+                       array( 'Foo [[bar]]',
+                              null,
+                              'link',
+                              true
+                       ),
+                       array( 'Foo',
+                              true,
+                              'link',
+                              true
+                       ),
+                       array( 'Foo [[bar]]',
+                              false,
+                              'link',
+                              false
+                       ),
+                       array( '#REDIRECT [[bar]]',
+                              true,
+                              'any',
+                              false
+                       ),
+                       array( '#REDIRECT [[bar]]',
+                              true,
+                              'comma',
+                              false
+                       ),
+                       array( '#REDIRECT [[bar]]',
+                              true,
+                              'link',
+                              false
+                       ),
+               );
+       }
+
+       public function testMatchMagicWord( ) {
+               $mw = MagicWord::get( "staticredirect" );
+
+               $content = $this->newContent( "#REDIRECT [[FOO]]\n__STATICREDIRECT__" );
+               $this->assertTrue( $content->matchMagicWord( $mw ), "should have matched magic word" );
+
+               $content = $this->newContent( "#REDIRECT [[FOO]]" );
+               $this->assertFalse( $content->matchMagicWord( $mw ), "should not have matched magic word" );
+       }
+
+       public function testUpdateRedirect( ) {
+               $target = Title::newFromText( "testUpdateRedirect_target" );
+
+               // test with non-redirect page
+               $content = $this->newContent( "hello world." );
+               $newContent = $content->updateRedirect( $target );
+
+               $this->assertTrue( $content->equals( $newContent ), "content should be unchanged" );
+
+               // test with actual redirect
+               $content = $this->newContent( "#REDIRECT [[Someplace]]" );
+               $newContent = $content->updateRedirect( $target );
+
+               $this->assertFalse( $content->equals( $newContent ), "content should have changed" );
+               $this->assertTrue( $newContent->isRedirect(), "new content should be a redirect" );
+
+               $this->assertEquals( $target->getFullText(), $newContent->getRedirectTarget()->getFullText() );
+       }
+
+       public function testGetModel() {
+               $content = $this->newContent( "hello world." );
+
+               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getModel() );
+       }
+
+       public function testGetContentHandler() {
+               $content = $this->newContent( "hello world." );
+
+               $this->assertEquals( CONTENT_MODEL_WIKITEXT, $content->getContentHandler()->getModelID() );
+       }
+
+       public static function dataEquals( ) {
+               return array(
+                       array( new WikitextContent( "hallo" ), null, false ),
+                       array( new WikitextContent( "hallo" ), new WikitextContent( "hallo" ), true ),
+                       array( new WikitextContent( "hallo" ), new JavaScriptContent( "hallo" ), false ),
+                       array( new WikitextContent( "hallo" ), new TextContent( "hallo" ), false ),
+                       array( new WikitextContent( "hallo" ), new WikitextContent( "HALLO" ), false ),
+               );
+       }
+
+       public static function dataGetDeletionUpdates() {
+               return array(
+                       array("WikitextContentTest_testGetSecondaryDataUpdates_1",
+                               CONTENT_MODEL_WIKITEXT, "hello ''world''\n",
+                               array( 'LinksDeletionUpdate' => array( ) )
+                       ),
+                       array("WikitextContentTest_testGetSecondaryDataUpdates_2",
+                               CONTENT_MODEL_WIKITEXT, "hello [[world test 21344]]\n",
+                               array( 'LinksDeletionUpdate' => array( ) )
+                       ),
+                       // @todo: more...?
+               );
+       }
+
+}
index e37cd44..51127f8 100644 (file)
@@ -8,15 +8,16 @@
  */
 class DatabaseSQLTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
                // TODO support other DBMS or find another way to do it
-               if( $this->db->getType() !== 'mysql' ) {
+               if ( $this->db->getType() !== 'mysql' ) {
                        $this->markTestSkipped( 'No mysql database' );
                }
        }
 
        /**
-        * @dataProvider dataSelectSQLText
+        * @dataProvider provideSelectSQLText
         */
        function testSelectSQLText( $sql, $sqlText ) {
                $this->assertEquals( trim( $this->db->selectSQLText(
@@ -29,7 +30,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                ) ), $sqlText );
        }
 
-       function dataSelectSQLText() {
+       public static function provideSelectSQLText() {
                return array(
                        array(
                                array(
@@ -106,7 +107,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider dataConditional
+        * @dataProvider provideConditional
         */
        function testConditional( $sql, $sqlText ) {
                $this->assertEquals( trim( $this->db->conditional(
@@ -116,7 +117,7 @@ class DatabaseSQLTest extends MediaWikiTestCase {
                ) ), $sqlText );
        }
 
-       function dataConditional() {
+       public static function provideConditional() {
                return array(
                        array(
                                array(
index d226598..7958a8a 100644 (file)
@@ -20,11 +20,14 @@ class MockDatabaseSqlite extends DatabaseSqliteStandalone {
 /**
  * @group sqlite
  * @group Database
+ * @group medium
  */
 class DatabaseSqliteTest extends MediaWikiTestCase {
        var $db;
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                if ( !Sqlite::isPresent() ) {
                        $this->markTestSkipped( 'No SQLite support detected' );
                }
@@ -52,6 +55,52 @@ class DatabaseSqliteTest extends MediaWikiTestCase {
                $this->assertEquals( count( $expected ), $i, 'Unexpected number of rows' );
        }
 
+       public static function provideAddQuotes() {
+               return array(
+                       array( // #0: empty
+                               '', "''"
+                       ),
+                       array( // #1: simple
+                               'foo bar', "'foo bar'"
+                       ),
+                       array( // #2: including quote
+                               'foo\'bar', "'foo''bar'"
+                       ),
+                       array( // #3: including \0 (must be represented as hex, per https://bugs.php.net/bug.php?id=63419)
+                               "x\0y",
+                               "x'780079'",
+                       ),
+                       array( // #4: blob object (must be represented as hex)
+                               new Blob( "hello" ),
+                               "x'68656c6c6f'",
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideAddQuotes()
+        */
+       public function testAddQuotes( $value, $expected ) {
+               // check quoting
+               $db = new DatabaseSqliteStandalone( ':memory:' );
+               $this->assertEquals( $expected, $db->addQuotes( $value ), 'string not quoted as expected' );
+
+               // ok, quoting works as expected, now try a round trip.
+               $re = $db->query( 'select ' . $db->addQuotes( $value ) );
+
+               $this->assertTrue( $re !== false, 'query failed' );
+
+               if ( $row = $re->fetchRow() ) {
+                       if ( $value instanceof Blob ) {
+                               $value = $value->fetch();
+                       }
+
+                       $this->assertEquals( $value, $row[0], 'string mangled by the database' );
+               } else {
+                       $this->fail( 'query returned no result' );
+               }
+       }
+
        public function testReplaceVars() {
                $this->assertEquals( 'foo', $this->replaceVars( 'foo' ), "Don't break anything accidentally" );
 
index dc12ba5..cbbdc1f 100644 (file)
@@ -7,11 +7,13 @@
 class DatabaseTest extends MediaWikiTestCase {
        var $db, $functionTest = false;
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
                $this->db = wfGetDB( DB_MASTER );
        }
 
-       function tearDown() {
+       protected function tearDown() {
+               parent::tearDown();
                if ( $this->functionTest ) {
                        $this->dropFunctions();
                        $this->functionTest = false;
index 9dcaf2b..8516241 100644 (file)
@@ -136,7 +136,7 @@ abstract class ORMRowTest extends \MediaWikiTestCase {
        /**
         * @dataProvider constructorTestProvider
         */
-       public function testSave( array $data, $loadDefaults ) {
+       public function testSaveAndRemove( array $data, $loadDefaults ) {
                $item = $this->getRowInstance( $data, $loadDefaults );
 
                $this->assertTrue( $item->save() );
@@ -151,15 +151,6 @@ abstract class ORMRowTest extends \MediaWikiTestCase {
                $this->assertEquals( $id, $item->getId() );
 
                $this->verifyFields( $item, $data );
-       }
-
-       /**
-        * @dataProvider constructorTestProvider
-        */
-       public function testRemove( array $data, $loadDefaults ) {
-               $item = $this->getRowInstance( $data, $loadDefaults );
-
-               $this->assertTrue( $item->save() );
 
                $this->assertTrue( $item->remove() );
 
diff --git a/tests/phpunit/includes/db/ORMTableTest.php b/tests/phpunit/includes/db/ORMTableTest.php
new file mode 100644 (file)
index 0000000..2ed3dd3
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Abstract class to construct tests for ORMTable deriving classes.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Test
+ *
+ * @group ORM
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+abstract class ORMTableTest extends MediaWikiTestCase {
+
+       /**
+        * @since 1.21
+        * @return string
+        */
+       protected abstract function getTableClass();
+
+       /**
+        * @since 1.21
+        * @return IORMTable
+        */
+       public function getTable() {
+               $class = $this->getTableClass();
+               return $class::singleton();
+       }
+
+       /**
+        * @since 1.21
+        * @return string
+        */
+       public function getRowClass() {
+               return $this->getTable()->getRowClass();
+       }
+
+       /**
+        * @since 1.21
+        */
+       public function testSingleton() {
+               $class = $this->getTableClass();
+
+               $this->assertInstanceOf( $class, $class::singleton() );
+               $this->assertTrue( $class::singleton() === $class::singleton() );
+       }
+
+}
index afd1cb8..9739f4c 100644 (file)
@@ -58,7 +58,7 @@ class TestORMRowTest extends ORMRowTest {
                return TestORMTable::singleton();
        }
 
-       public function setUp() {
+       protected function setUp() {
                parent::setUp();
 
                $dbw = wfGetDB( DB_MASTER );
@@ -78,15 +78,24 @@ class TestORMRowTest extends ORMRowTest {
                                test_stuff                 BLOB                NOT NULL,
                                test_moarstuff             BLOB                NOT NULL,
                                test_time                  varbinary(14)       NOT NULL
-                       );'
+                       );',
+                       __METHOD__
                );
        }
 
+       protected function tearDown() {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->dropTable( 'orm_test', __METHOD__ );
+
+               parent::tearDown();
+       }
+
        public function constructorTestProvider() {
                return array(
                        array(
                                array(
                                        'name' => 'Foobar',
+                                       'time' => '20120101020202',
                                        'age' => 42,
                                        'height' => 9000.1,
                                        'awesome' => true,
@@ -155,7 +164,7 @@ class TestORMTable extends ORMTable {
                        'awesome' => 'bool',
                        'stuff' => 'array',
                        'moarstuff' => 'blob',
-                       'time' => 'int', // TS_MW
+                       'time' => 'str', // TS_MW
                );
        }
 
index 246b291..bd2c388 100644 (file)
@@ -3,7 +3,8 @@
 class MWDebugTest extends MediaWikiTestCase {
 
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
                // Make sure MWDebug class is enabled
                static $MWDebugEnabled = false;
                if( !$MWDebugEnabled ) {
@@ -15,8 +16,9 @@ class MWDebugTest extends MediaWikiTestCase {
                wfSuppressWarnings();
        }
 
-       function tearDown() {
+       protected function tearDown() {
                wfRestoreWarnings();
+               parent::tearDown();
        }
 
        function testAddLog() {
diff --git a/tests/phpunit/includes/filebackend/FileBackendTest.php b/tests/phpunit/includes/filebackend/FileBackendTest.php
new file mode 100644 (file)
index 0000000..7beb4fe
--- /dev/null
@@ -0,0 +1,2112 @@
+<?php
+
+/**
+ * @group FileRepo
+ * @group FileBackend
+ * @group medium
+ */
+class FileBackendTest extends MediaWikiTestCase {
+       private $backend, $multiBackend;
+       private $filesToPrune = array();
+       private static $backendToUse;
+
+       protected function setUp() {
+               global $wgFileBackends;
+               parent::setUp();
+               $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . time() . '-' . mt_rand();
+               if ( $this->getCliArg( 'use-filebackend=' ) ) {
+                       if ( self::$backendToUse ) {
+                               $this->singleBackend = self::$backendToUse;
+                       } else {
+                               $name = $this->getCliArg( 'use-filebackend=' );
+                               $useConfig = array();
+                               foreach ( $wgFileBackends as $conf ) {
+                                       if ( $conf['name'] == $name ) {
+                                               $useConfig = $conf;
+                                               break;
+                                       }
+                               }
+                               $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;
+                       }
+               } else {
+                       $this->singleBackend = new FSFileBackend( array(
+                               'name'        => 'localtesting',
+                               'lockManager' => 'fsLockManager',
+                               #'parallelize' => 'implicit',
+                               'containerPaths' => array(
+                                       'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
+                                       'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
+                       ) );
+               }
+               $this->multiBackend = new FileBackendMultiWrite( array(
+                       'name'        => 'localtesting',
+                       'lockManager' => 'fsLockManager',
+                       'parallelize' => 'implicit',
+                       'backends'    => array(
+                               array(
+                                       'name'          => 'localmultitesting1',
+                                       'class'         => 'FSFileBackend',
+                                       'lockManager'   => 'nullLockManager',
+                                       'containerPaths' => array(
+                                               'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
+                                               'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
+                                       'isMultiMaster' => false
+                               ),
+                               array(
+                                       'name'          => 'localmultitesting2',
+                                       'class'         => 'FSFileBackend',
+                                       'lockManager'   => 'nullLockManager',
+                                       'containerPaths' => array(
+                                               'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
+                                               'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
+                                       'isMultiMaster' => true
+                               )
+                       )
+               ) );
+               $this->filesToPrune = array();
+       }
+
+       private static function baseStorePath() {
+               return 'mwstore://localtesting';
+       }
+
+       private function backendClass() {
+               return get_class( $this->backend );
+       }
+
+       /**
+        * @dataProvider provider_testIsStoragePath
+        */
+       public function testIsStoragePath( $path, $isStorePath ) {
+               $this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
+                       "FileBackend::isStoragePath on path '$path'" );
+       }
+
+       function provider_testIsStoragePath() {
+               return array(
+                       array( 'mwstore://', true ),
+                       array( 'mwstore://backend', true ),
+                       array( 'mwstore://backend/container', true ),
+                       array( 'mwstore://backend/container/', true ),
+                       array( 'mwstore://backend/container/path', true ),
+                       array( 'mwstore://backend//container/', true ),
+                       array( 'mwstore://backend//container//', true ),
+                       array( 'mwstore://backend//container//path', true ),
+                       array( 'mwstore:///', true ),
+                       array( 'mwstore:/', false ),
+                       array( 'mwstore:', false ),
+               );
+       }
+
+       /**
+        * @dataProvider provider_testSplitStoragePath
+        */
+       public function testSplitStoragePath( $path, $res ) {
+               $this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
+                       "FileBackend::splitStoragePath on path '$path'" );
+       }
+
+       function provider_testSplitStoragePath() {
+               return array(
+                       array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
+                       array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
+                       array( 'mwstore://backend/container/path', array( 'backend', 'container', 'path' ) ),
+                       array( 'mwstore://backend/container//path', array( 'backend', 'container', '/path' ) ),
+                       array( 'mwstore://backend//container/path', array( null, null, null ) ),
+                       array( 'mwstore://backend//container//path', array( null, null, null ) ),
+                       array( 'mwstore://', array( null, null, null ) ),
+                       array( 'mwstore://backend', array( null, null, null ) ),
+                       array( 'mwstore:///', array( null, null, null ) ),
+                       array( 'mwstore:/', array( null, null, null ) ),
+                       array( 'mwstore:', array( null, null, null ) )
+               );
+       }
+
+       /**
+        * @dataProvider provider_normalizeStoragePath
+        */
+       public function testNormalizeStoragePath( $path, $res ) {
+               $this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
+                       "FileBackend::normalizeStoragePath on path '$path'" );
+       }
+
+       function provider_normalizeStoragePath() {
+               return array(
+                       array( 'mwstore://backend/container', 'mwstore://backend/container' ),
+                       array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
+                       array( 'mwstore://backend/container/path', 'mwstore://backend/container/path' ),
+                       array( 'mwstore://backend/container//path', 'mwstore://backend/container/path' ),
+                       array( 'mwstore://backend/container///path', 'mwstore://backend/container/path' ),
+                       array( 'mwstore://backend/container///path//to///obj', 'mwstore://backend/container/path/to/obj',
+                       array( 'mwstore://', null ),
+                       array( 'mwstore://backend', null ),
+                       array( 'mwstore://backend//container/path', null ),
+                       array( 'mwstore://backend//container//path', null ),
+                       array( 'mwstore:///', null ),
+                       array( 'mwstore:/', null ),
+                       array( 'mwstore:', null ), )
+               );
+       }
+
+       /**
+        * @dataProvider provider_testParentStoragePath
+        */
+       public function testParentStoragePath( $path, $res ) {
+               $this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
+                       "FileBackend::parentStoragePath on path '$path'" );
+       }
+
+       function provider_testParentStoragePath() {
+               return array(
+                       array( 'mwstore://backend/container/path/to/obj', 'mwstore://backend/container/path/to' ),
+                       array( 'mwstore://backend/container/path/to', 'mwstore://backend/container/path' ),
+                       array( 'mwstore://backend/container/path', 'mwstore://backend/container' ),
+                       array( 'mwstore://backend/container', null ),
+                       array( 'mwstore://backend/container/path/to/obj/', 'mwstore://backend/container/path/to' ),
+                       array( 'mwstore://backend/container/path/to/', 'mwstore://backend/container/path' ),
+                       array( 'mwstore://backend/container/path/', 'mwstore://backend/container' ),
+                       array( 'mwstore://backend/container/', null ),
+               );
+       }
+
+       /**
+        * @dataProvider provider_testExtensionFromPath
+        */
+       public function testExtensionFromPath( $path, $res ) {
+               $this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
+                       "FileBackend::extensionFromPath on path '$path'" );
+       }
+
+       public static function provider_testExtensionFromPath() {
+               return array(
+                       array( 'mwstore://backend/container/path.txt', 'txt' ),
+                       array( 'mwstore://backend/container/path.svg.png', 'png' ),
+                       array( 'mwstore://backend/container/path', '' ),
+                       array( 'mwstore://backend/container/path.', '' ),
+               );
+       }
+
+       /**
+        * @dataProvider provider_testStore
+        */
+       public function testStore( $op ) {
+               $this->filesToPrune[] = $op['src'];
+
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestStore( $op );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestStore( $op );
+               $this->filesToPrune[] = $op['src']; # avoid file leaking
+               $this->tearDownFiles();
+       }
+
+       private function doTestStore( $op ) {
+               $backendName = $this->backendClass();
+
+               $source = $op['src'];
+               $dest = $op['dst'];
+               $this->prepare( array( 'dir' => dirname( $dest ) ) );
+
+               file_put_contents( $source, "Unit test file" );
+
+               if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
+                       $this->backend->store( $op );
+               }
+
+               $status = $this->backend->doOperation( $op );
+
+               $this->assertGoodStatus( $status,
+                       "Store from $source to $dest succeeded without warnings ($backendName)." );
+               $this->assertEquals( true, $status->isOK(),
+                       "Store from $source to $dest succeeded ($backendName)." );
+               $this->assertEquals( array( 0 => true ), $status->success,
+                       "Store from $source to $dest has proper 'success' field in Status ($backendName)." );
+               $this->assertEquals( true, file_exists( $source ),
+                       "Source file $source still exists ($backendName)." );
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
+                       "Destination file $dest exists ($backendName)." );
+
+               $this->assertEquals( filesize( $source ),
+                       $this->backend->getFileSize( array( 'src' => $dest ) ),
+                       "Destination file $dest has correct size ($backendName)." );
+
+               $props1 = FSFile::getPropsFromPath( $source );
+               $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
+               $this->assertEquals( $props1, $props2,
+                       "Source and destination have the same props ($backendName)." );
+
+               $this->assertBackendPathsConsistent( array( $dest ) );
+       }
+
+       public static function provider_testStore() {
+               $cases = array();
+
+               $tmpName = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+               $toPath = self::baseStorePath() . '/unittest-cont1/e/fun/obj1.txt';
+               $op = array( 'op' => 'store', 'src' => $tmpName, 'dst' => $toPath );
+               $cases[] = array(
+                       $op, // operation
+                       $tmpName, // source
+                       $toPath, // dest
+               );
+
+               $op2 = $op;
+               $op2['overwrite'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       $tmpName, // source
+                       $toPath, // dest
+               );
+
+               $op2 = $op;
+               $op2['overwriteSame'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       $tmpName, // source
+                       $toPath, // dest
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testCopy
+        */
+       public function testCopy( $op ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestCopy( $op );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestCopy( $op );
+               $this->tearDownFiles();
+       }
+
+       private function doTestCopy( $op ) {
+               $backendName = $this->backendClass();
+
+               $source = $op['src'];
+               $dest = $op['dst'];
+               $this->prepare( array( 'dir' => dirname( $source ) ) );
+               $this->prepare( array( 'dir' => dirname( $dest ) ) );
+
+               if ( isset( $op['ignoreMissingSource'] ) ) {
+                       $status = $this->backend->doOperation( $op );
+                       $this->assertGoodStatus( $status,
+                               "Move from $source to $dest succeeded without warnings ($backendName)." );
+                       $this->assertEquals( array( 0 => true ), $status->success,
+                               "Move from $source to $dest has proper 'success' field in Status ($backendName)." );
+                       $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
+                               "Source file $source does not exist ($backendName)." );
+                       $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
+                               "Destination file $dest does not exist ($backendName)." );
+                       return; // done
+               }
+
+               $status = $this->backend->doOperation(
+                       array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+               $this->assertGoodStatus( $status,
+                       "Creation of file at $source succeeded ($backendName)." );
+
+               if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
+                       $this->backend->copy( $op );
+               }
+
+               $status = $this->backend->doOperation( $op );
+
+               $this->assertGoodStatus( $status,
+                       "Copy from $source to $dest succeeded without warnings ($backendName)." );
+               $this->assertEquals( true, $status->isOK(),
+                       "Copy from $source to $dest succeeded ($backendName)." );
+               $this->assertEquals( array( 0 => true ), $status->success,
+                       "Copy from $source to $dest has proper 'success' field in Status ($backendName)." );
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $source ) ),
+                       "Source file $source still exists ($backendName)." );
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
+                       "Destination file $dest exists after copy ($backendName)." );
+
+               $this->assertEquals(
+                       $this->backend->getFileSize( array( 'src' => $source ) ),
+                       $this->backend->getFileSize( array( 'src' => $dest ) ),
+                       "Destination file $dest has correct size ($backendName)." );
+
+               $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
+               $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 static function provider_testCopy() {
+               $cases = array();
+
+               $source = self::baseStorePath() . '/unittest-cont1/e/file.txt';
+               $dest = self::baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
+
+               $op = array( 'op' => 'copy', 'src' => $source, 'dst' => $dest );
+               $cases[] = array(
+                       $op, // operation
+                       $source, // source
+                       $dest, // dest
+               );
+
+               $op2 = $op;
+               $op2['overwrite'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       $source, // source
+                       $dest, // dest
+               );
+
+               $op2 = $op;
+               $op2['overwriteSame'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       $source, // source
+                       $dest, // dest
+               );
+
+               $op2 = $op;
+               $op2['ignoreMissingSource'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       $source, // source
+                       $dest, // dest
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testMove
+        */
+       public function testMove( $op ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestMove( $op );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestMove( $op );
+               $this->tearDownFiles();
+       }
+
+       private function doTestMove( $op ) {
+               $backendName = $this->backendClass();
+
+               $source = $op['src'];
+               $dest = $op['dst'];
+               $this->prepare( array( 'dir' => dirname( $source ) ) );
+               $this->prepare( array( 'dir' => dirname( $dest ) ) );
+
+               if ( isset( $op['ignoreMissingSource'] ) ) {
+                       $status = $this->backend->doOperation( $op );
+                       $this->assertGoodStatus( $status,
+                               "Move from $source to $dest succeeded without warnings ($backendName)." );
+                       $this->assertEquals( array( 0 => true ), $status->success,
+                               "Move from $source to $dest has proper 'success' field in Status ($backendName)." );
+                       $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
+                               "Source file $source does not exist ($backendName)." );
+                       $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $dest ) ),
+                               "Destination file $dest does not exist ($backendName)." );
+                       return; // done
+               }
+
+               $status = $this->backend->doOperation(
+                       array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+               $this->assertGoodStatus( $status,
+                       "Creation of file at $source succeeded ($backendName)." );
+
+               if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
+                       $this->backend->copy( $op );
+               }
+
+               $status = $this->backend->doOperation( $op );
+               $this->assertGoodStatus( $status,
+                       "Move from $source to $dest succeeded without warnings ($backendName)." );
+               $this->assertEquals( true, $status->isOK(),
+                       "Move from $source to $dest succeeded ($backendName)." );
+               $this->assertEquals( array( 0 => true ), $status->success,
+                       "Move from $source to $dest has proper 'success' field in Status ($backendName)." );
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
+                       "Source file $source does not still exists ($backendName)." );
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
+                       "Destination file $dest exists after move ($backendName)." );
+
+               $this->assertNotEquals(
+                       $this->backend->getFileSize( array( 'src' => $source ) ),
+                       $this->backend->getFileSize( array( 'src' => $dest ) ),
+                       "Destination file $dest has correct size ($backendName)." );
+
+               $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
+               $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
+               $this->assertEquals( false, $props1['fileExists'],
+                       "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 static function provider_testMove() {
+               $cases = array();
+
+               $source = self::baseStorePath() . '/unittest-cont1/e/file.txt';
+               $dest = self::baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
+
+               $op = array( 'op' => 'move', 'src' => $source, 'dst' => $dest );
+               $cases[] = array(
+                       $op, // operation
+                       $source, // source
+                       $dest, // dest
+               );
+
+               $op2 = $op;
+               $op2['overwrite'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       $source, // source
+                       $dest, // dest
+               );
+
+               $op2 = $op;
+               $op2['overwriteSame'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       $source, // source
+                       $dest, // dest
+               );
+
+               $op2 = $op;
+               $op2['ignoreMissingSource'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       $source, // source
+                       $dest, // dest
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testDelete
+        */
+       public function testDelete( $op, $withSource, $okStatus ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestDelete( $op, $withSource, $okStatus );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestDelete( $op, $withSource, $okStatus );
+               $this->tearDownFiles();
+       }
+
+       private function doTestDelete( $op, $withSource, $okStatus ) {
+               $backendName = $this->backendClass();
+
+               $source = $op['src'];
+               $this->prepare( array( 'dir' => dirname( $source ) ) );
+
+               if ( $withSource ) {
+                       $status = $this->backend->doOperation(
+                               array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+                       $this->assertGoodStatus( $status,
+                               "Creation of file at $source succeeded ($backendName)." );
+               }
+
+               $status = $this->backend->doOperation( $op );
+               if ( $okStatus ) {
+                       $this->assertGoodStatus( $status,
+                               "Deletion of file at $source succeeded without warnings ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Deletion of file at $source succeeded ($backendName)." );
+                       $this->assertEquals( array( 0 => true ), $status->success,
+                               "Deletion of file at $source has proper 'success' field in Status ($backendName)." );
+               } else {
+                       $this->assertEquals( false, $status->isOK(),
+                               "Deletion of file at $source failed ($backendName)." );
+               }
+
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
+                       "Source file $source does not exist after move ($backendName)." );
+
+               $this->assertFalse(
+                       $this->backend->getFileSize( array( 'src' => $source ) ),
+                       "Source file $source has correct size (false) ($backendName)." );
+
+               $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 static function provider_testDelete() {
+               $cases = array();
+
+               $source = self::baseStorePath() . '/unittest-cont1/e/myfacefile.txt';
+
+               $op = array( 'op' => 'delete', 'src' => $source );
+               $cases[] = array(
+                       $op, // operation
+                       true, // with source
+                       true // succeeds
+               );
+
+               $cases[] = array(
+                       $op, // operation
+                       false, // without source
+                       false // fails
+               );
+
+               $op['ignoreMissingSource'] = true;
+               $cases[] = array(
+                       $op, // operation
+                       false, // without source
+                       true // succeeds
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testDescribe
+        */
+       public function testDescribe( $op, $withSource, $okStatus ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestDescribe( $op, $withSource, $okStatus );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestDescribe( $op, $withSource, $okStatus );
+               $this->tearDownFiles();
+       }
+
+       private function doTestDescribe( $op, $withSource, $okStatus ) {
+               $backendName = $this->backendClass();
+
+               $source = $op['src'];
+               $this->prepare( array( 'dir' => dirname( $source ) ) );
+
+               if ( $withSource ) {
+                       $status = $this->backend->doOperation(
+                               array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
+                       $this->assertGoodStatus( $status,
+                               "Creation of file at $source succeeded ($backendName)." );
+               }
+
+               $status = $this->backend->doOperation( $op );
+               if ( $okStatus ) {
+                       $this->assertGoodStatus( $status,
+                               "Describe of file at $source succeeded without warnings ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Describe of file at $source succeeded ($backendName)." );
+                       $this->assertEquals( array( 0 => true ), $status->success,
+                               "Describe of file at $source has proper 'success' field in Status ($backendName)." );
+               } else {
+                       $this->assertEquals( false, $status->isOK(),
+                               "Describe of file at $source failed ($backendName)." );
+               }
+
+               $this->assertBackendPathsConsistent( array( $source ) );
+       }
+
+       public static function provider_testDescribe() {
+               $cases = array();
+
+               $source = self::baseStorePath() . '/unittest-cont1/e/myfacefile.txt';
+
+               $op = array( 'op' => 'describe', 'src' => $source,
+                       'headers' => array( 'X-Content-Length' => '91.3', 'Content-Old-Header' => '' ),
+                       'disposition' => 'inline' );
+               $cases[] = array(
+                       $op, // operation
+                       true, // with source
+                       true // succeeds
+               );
+
+               $cases[] = array(
+                       $op, // operation
+                       false, // without source
+                       false // fails
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testCreate
+        */
+       public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestCreate( $op, $alreadyExists, $okStatus, $newSize );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestCreate( $op, $alreadyExists, $okStatus, $newSize );
+               $this->tearDownFiles();
+       }
+
+       private function doTestCreate( $op, $alreadyExists, $okStatus, $newSize ) {
+               $backendName = $this->backendClass();
+
+               $dest = $op['dst'];
+               $this->prepare( array( 'dir' => dirname( $dest ) ) );
+
+               $oldText = 'blah...blah...waahwaah';
+               if ( $alreadyExists ) {
+                       $status = $this->backend->doOperation(
+                               array( 'op' => 'create', 'content' => $oldText, 'dst' => $dest ) );
+                       $this->assertGoodStatus( $status,
+                               "Creation of file at $dest succeeded ($backendName)." );
+               }
+
+               $status = $this->backend->doOperation( $op );
+               if ( $okStatus ) {
+                       $this->assertGoodStatus( $status,
+                               "Creation of file at $dest succeeded without warnings ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Creation of file at $dest succeeded ($backendName)." );
+                       $this->assertEquals( array( 0 => true ), $status->success,
+                               "Creation of file at $dest has proper 'success' field in Status ($backendName)." );
+               } else {
+                       $this->assertEquals( false, $status->isOK(),
+                               "Creation of file at $dest failed ($backendName)." );
+               }
+
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
+                       "Destination file $dest exists after creation ($backendName)." );
+
+               $props1 = $this->backend->getFileProps( array( 'src' => $dest ) );
+               $this->assertEquals( true, $props1['fileExists'],
+                       "Destination file $dest exists according to props ($backendName)." );
+               if ( $okStatus ) { // file content is what we saved
+                       $this->assertEquals( $newSize, $props1['size'],
+                               "Destination file $dest has expected size according to props ($backendName)." );
+                       $this->assertEquals( $newSize,
+                               $this->backend->getFileSize( array( 'src' => $dest ) ),
+                               "Destination file $dest has correct size ($backendName)." );
+               } else { // file content is some other previous text
+                       $this->assertEquals( strlen( $oldText ), $props1['size'],
+                               "Destination file $dest has original size according to props ($backendName)." );
+                       $this->assertEquals( strlen( $oldText ),
+                               $this->backend->getFileSize( array( 'src' => $dest ) ),
+                               "Destination file $dest has original size according to props ($backendName)." );
+               }
+
+               $this->assertBackendPathsConsistent( array( $dest ) );
+       }
+
+       /**
+        * @dataProvider provider_testCreate
+        */
+       public static function provider_testCreate() {
+               $cases = array();
+
+               $dest = self::baseStorePath() . '/unittest-cont2/a/myspacefile.txt';
+
+               $op = array( 'op' => 'create', 'content' => 'test test testing', 'dst' => $dest );
+               $cases[] = array(
+                       $op, // operation
+                       false, // no dest already exists
+                       true, // succeeds
+                       strlen( $op['content'] )
+               );
+
+               $op2 = $op;
+               $op2['content'] = "\n";
+               $cases[] = array(
+                       $op2, // operation
+                       false, // no dest already exists
+                       true, // succeeds
+                       strlen( $op2['content'] )
+               );
+
+               $op2 = $op;
+               $op2['content'] = "fsf\n waf 3kt";
+               $cases[] = array(
+                       $op2, // operation
+                       true, // dest already exists
+                       false, // fails
+                       strlen( $op2['content'] )
+               );
+
+               $op2 = $op;
+               $op2['content'] = "egm'g gkpe gpqg eqwgwqg";
+               $op2['overwrite'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       true, // dest already exists
+                       true, // succeeds
+                       strlen( $op2['content'] )
+               );
+
+               $op2 = $op;
+               $op2['content'] = "39qjmg3-qg";
+               $op2['overwriteSame'] = true;
+               $cases[] = array(
+                       $op2, // operation
+                       true, // dest already exists
+                       false, // succeeds
+                       strlen( $op2['content'] )
+               );
+
+               return $cases;
+       }
+
+       public function testDoQuickOperations() {
+               $this->backend = $this->singleBackend;
+               $this->doTestDoQuickOperations();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->doTestDoQuickOperations();
+               $this->tearDownFiles();
+       }
+
+       private function doTestDoQuickOperations() {
+               $backendName = $this->backendClass();
+
+               $base = self::baseStorePath();
+               $files = array(
+                       "$base/unittest-cont1/e/fileA.a",
+                       "$base/unittest-cont1/e/fileB.a",
+                       "$base/unittest-cont1/e/fileC.a"
+               );
+               $ops = array();
+               $purgeOps = array();
+               foreach ( $files as $path ) {
+                       $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
+                       $this->assertGoodStatus( $status,
+                               "Preparing $path succeeded without warnings ($backendName)." );
+                       $ops[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand(0,50000) );
+                       $purgeOps[] = array( 'op' => 'delete', 'src' => $path );
+               }
+               $purgeOps[] = array( 'op' => 'null' );
+               $status = $this->backend->doQuickOperations( $ops );
+               $this->assertGoodStatus( $status,
+                       "Creation of source files succeeded ($backendName)." );
+
+               foreach ( $files as $file ) {
+                       $this->assertTrue( $this->backend->fileExists( array( 'src' => $file ) ),
+                               "File $file exists." );
+               }
+
+               $status = $this->backend->doQuickOperations( $purgeOps );
+               $this->assertGoodStatus( $status,
+                       "Quick deletion of source files succeeded ($backendName)." );
+
+               foreach ( $files as $file ) {
+                       $this->assertFalse( $this->backend->fileExists( array( 'src' => $file ) ),
+                               "File $file purged." );
+               }
+       }
+
+       /**
+        * @dataProvider provider_testConcatenate
+        */
+       public function testConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
+               $this->filesToPrune[] = $op['dst'];
+
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
+               $this->filesToPrune[] = $op['dst']; # avoid file leaking
+               $this->tearDownFiles();
+       }
+
+       private function doTestConcatenate( $params, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
+               $backendName = $this->backendClass();
+
+               $expContent = '';
+               // Create sources
+               $ops = array();
+               foreach ( $srcs as $i => $source ) {
+                       $this->prepare( array( 'dir' => dirname( $source ) ) );
+                       $ops[] = array(
+                               'op'      => 'create', // operation
+                               'dst'     => $source, // source
+                               'content' => $srcsContent[$i]
+                       );
+                       $expContent .= $srcsContent[$i];
+               }
+               $status = $this->backend->doOperations( $ops );
+
+               $this->assertGoodStatus( $status,
+                       "Creation of source files succeeded ($backendName)." );
+
+               $dest = $params['dst'];
+               if ( $alreadyExists ) {
+                       $ok = file_put_contents( $dest, 'blah...blah...waahwaah' ) !== false;
+                       $this->assertEquals( true, $ok,
+                               "Creation of file at $dest succeeded ($backendName)." );
+               } else {
+                       $ok = file_put_contents( $dest, '' ) !== false;
+                       $this->assertEquals( true, $ok,
+                               "Creation of 0-byte file at $dest succeeded ($backendName)." );
+               }
+
+               // Combine the files into one
+               $status = $this->backend->concatenate( $params );
+               if ( $okStatus ) {
+                       $this->assertGoodStatus( $status,
+                               "Creation of concat file at $dest succeeded without warnings ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Creation of concat file at $dest succeeded ($backendName)." );
+               } else {
+                       $this->assertEquals( false, $status->isOK(),
+                               "Creation of concat file at $dest failed ($backendName)." );
+               }
+
+               if ( $okStatus ) {
+                       $this->assertEquals( true, is_file( $dest ),
+                               "Dest concat file $dest exists after creation ($backendName)." );
+               } else {
+                       $this->assertEquals( true, is_file( $dest ),
+                               "Dest concat file $dest exists after failed creation ($backendName)." );
+               }
+
+               $contents = file_get_contents( $dest );
+               $this->assertNotEquals( false, $contents, "File at $dest exists ($backendName)." );
+
+               if ( $okStatus ) {
+                       $this->assertEquals( $expContent, $contents,
+                               "Concat file at $dest has correct contents ($backendName)." );
+               } else {
+                       $this->assertNotEquals( $expContent, $contents,
+                               "Concat file at $dest has correct contents ($backendName)." );
+               }
+       }
+
+       function provider_testConcatenate() {
+               $cases = array();
+
+               $rand = mt_rand( 0, 2000000000 ) . time();
+               $dest = wfTempDir() . "/randomfile!$rand.txt";
+               $srcs = array(
+                       self::baseStorePath() . '/unittest-cont1/e/file1.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file2.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file3.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file4.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file5.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file6.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file7.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file8.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file9.txt',
+                       self::baseStorePath() . '/unittest-cont1/e/file10.txt'
+               );
+               $content = array(
+                       'egfage',
+                       'ageageag',
+                       'rhokohlr',
+                       'shgmslkg',
+                       'kenga',
+                       'owagmal',
+                       'kgmae',
+                       'g eak;g',
+                       'lkaem;a',
+                       'legma'
+               );
+               $params = array( 'srcs' => $srcs, 'dst' => $dest );
+
+               $cases[] = array(
+                       $params, // operation
+                       $srcs, // sources
+                       $content, // content for each source
+                       false, // no dest already exists
+                       true, // succeeds
+               );
+
+               $cases[] = array(
+                       $params, // operation
+                       $srcs, // sources
+                       $content, // content for each source
+                       true, // dest already exists
+                       false, // succeeds
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testGetFileStat
+        */
+       public function testGetFileStat( $path, $content, $alreadyExists ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetFileStat( $path, $content, $alreadyExists );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetFileStat( $path, $content, $alreadyExists );
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetFileStat( $path, $content, $alreadyExists ) {
+               $backendName = $this->backendClass();
+
+               if ( $alreadyExists ) {
+                       $this->prepare( array( 'dir' => dirname( $path ) ) );
+                       $status = $this->create( array( 'dst' => $path, 'content' => $content ) );
+                       $this->assertGoodStatus( $status,
+                               "Creation of file at $path succeeded ($backendName)." );
+
+                       $size = $this->backend->getFileSize( array( 'src' => $path ) );
+                       $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
+                       $stat = $this->backend->getFileStat( array( 'src' => $path ) );
+
+                       $this->assertEquals( strlen( $content ), $size,
+                               "Correct file size of '$path'" );
+                       $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 10,
+                               "Correct file timestamp of '$path'" );
+
+                       $size = $stat['size'];
+                       $time = $stat['mtime'];
+                       $this->assertEquals( strlen( $content ), $size,
+                               "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 ) );
+                       $stat = $this->backend->getFileStat( array( 'src' => $path ) );
+
+                       $this->assertFalse( $size, "Correct file size of '$path'" );
+                       $this->assertFalse( $time, "Correct file timestamp of '$path'" );
+                       $this->assertFalse( $stat, "Correct file stat of '$path'" );
+               }
+       }
+
+       function provider_testGetFileStat() {
+               $cases = array();
+
+               $base = self::baseStorePath();
+               $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;
+       }
+
+       /**
+        * @dataProvider provider_testGetFileContents
+        */
+       public function testGetFileContents( $source, $content ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetFileContents( $source, $content );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetFileContents( $source, $content );
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetFileContents( $source, $content ) {
+               $backendName = $this->backendClass();
+
+               $srcs = (array)$source;
+               $content = (array)$content;
+               foreach ( $srcs as $i => $src ) {
+                       $this->prepare( array( 'dir' => dirname( $src ) ) );
+                       $status = $this->backend->doOperation(
+                               array( 'op' => 'create', 'content' => $content[$i], 'dst' => $src ) );
+                       $this->assertGoodStatus( $status,
+                               "Creation of file at $src succeeded ($backendName)." );
+               }
+
+               if ( is_array( $source ) ) {
+                       $contents = $this->backend->getFileContentsMulti( array( 'srcs' => $source ) );
+                       foreach ( $contents as $path => $data ) {
+                               $this->assertNotEquals( false, $data, "Contents of $path exists ($backendName)." );
+                               $this->assertEquals( current( $content ), $data, "Contents of $path is correct ($backendName)." );
+                               next( $content );
+                       }
+                       $this->assertEquals( $source, array_keys( $contents ), "Contents in right order ($backendName)." );
+                       $this->assertEquals( count( $source ), count( $contents ), "Contents array size correct ($backendName)." );
+               } else {
+                       $data = $this->backend->getFileContents( array( 'src' => $source ) );
+                       $this->assertNotEquals( false, $data, "Contents of $source exists ($backendName)." );
+                       $this->assertEquals( $content[0], $data, "Contents of $source is correct ($backendName)." );
+               }
+       }
+
+       function provider_testGetFileContents() {
+               $cases = array();
+
+               $base = self::baseStorePath();
+               $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" );
+               $cases[] = array(
+                       array( "$base/unittest-cont1/e/a/x.txt", "$base/unittest-cont1/e/a/y.txt",
+                                "$base/unittest-cont1/e/a/z.txt" ),
+                       array( "contents xx", "contents xy", "contents xz" )
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testGetLocalCopy
+        */
+       public function testGetLocalCopy( $source, $content ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetLocalCopy( $source, $content );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetLocalCopy( $source, $content );
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetLocalCopy( $source, $content ) {
+               $backendName = $this->backendClass();
+
+               $srcs = (array)$source;
+               $content = (array)$content;
+               foreach ( $srcs as $i => $src ) {
+                       $this->prepare( array( 'dir' => dirname( $src ) ) );
+                       $status = $this->backend->doOperation(
+                               array( 'op' => 'create', 'content' => $content[$i], 'dst' => $src ) );
+                       $this->assertGoodStatus( $status,
+                               "Creation of file at $src succeeded ($backendName)." );
+               }
+
+               if ( is_array( $source ) ) {
+                       $tmpFiles = $this->backend->getLocalCopyMulti( array( 'srcs' => $source ) );
+                       foreach ( $tmpFiles as $path => $tmpFile ) {
+                               $this->assertNotNull( $tmpFile,
+                                       "Creation of local copy of $path succeeded ($backendName)." );
+                               $contents = file_get_contents( $tmpFile->getPath() );
+                               $this->assertNotEquals( false, $contents, "Local copy of $path exists ($backendName)." );
+                               $this->assertEquals( current( $content ), $contents, "Local copy of $path is correct ($backendName)." );
+                               next( $content );
+                       }
+                       $this->assertEquals( $source, array_keys( $tmpFiles ), "Local copies in right order ($backendName)." );
+                       $this->assertEquals( count( $source ), count( $tmpFiles ), "Local copies array size correct ($backendName)." );
+               } else {
+                       $tmpFile = $this->backend->getLocalCopy( array( 'src' => $source ) );
+                       $this->assertNotNull( $tmpFile,
+                               "Creation of local copy of $source succeeded ($backendName)." );
+                       $contents = file_get_contents( $tmpFile->getPath() );
+                       $this->assertNotEquals( false, $contents, "Local copy of $source exists ($backendName)." );
+                       $this->assertEquals( $content[0], $contents, "Local copy of $source is correct ($backendName)." );
+               }
+
+               $obj = new stdClass();
+               $tmpFile->bind( $obj );
+       }
+
+       function provider_testGetLocalCopy() {
+               $cases = array();
+
+               $base = self::baseStorePath();
+               $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" );
+               $cases[] = array( "$base/unittest-cont1/e/a/\$odd&.txt", "test file contents" );
+               $cases[] = array(
+                       array( "$base/unittest-cont1/e/a/x.txt", "$base/unittest-cont1/e/a/y.txt",
+                                "$base/unittest-cont1/e/a/z.txt" ),
+                       array( "contents xx", "contents xy", "contents xz" )
+               );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testGetLocalReference
+        */
+       public function testGetLocalReference( $source, $content ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetLocalReference( $source, $content );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetLocalReference( $source, $content );
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetLocalReference( $source, $content ) {
+               $backendName = $this->backendClass();
+
+               $srcs = (array)$source;
+               $content = (array)$content;
+               foreach ( $srcs as $i => $src ) {
+                       $this->prepare( array( 'dir' => dirname( $src ) ) );
+                       $status = $this->backend->doOperation(
+                               array( 'op' => 'create', 'content' => $content[$i], 'dst' => $src ) );
+                       $this->assertGoodStatus( $status,
+                               "Creation of file at $src succeeded ($backendName)." );
+               }
+
+               if ( is_array( $source ) ) {
+                       $tmpFiles = $this->backend->getLocalReferenceMulti( array( 'srcs' => $source ) );
+                       foreach ( $tmpFiles as $path => $tmpFile ) {
+                               $this->assertNotNull( $tmpFile,
+                                       "Creation of local copy of $path succeeded ($backendName)." );
+                               $contents = file_get_contents( $tmpFile->getPath() );
+                               $this->assertNotEquals( false, $contents, "Local ref of $path exists ($backendName)." );
+                               $this->assertEquals( current( $content ), $contents, "Local ref of $path is correct ($backendName)." );
+                               next( $content );
+                       }
+                       $this->assertEquals( $source, array_keys( $tmpFiles ), "Local refs in right order ($backendName)." );
+                       $this->assertEquals( count( $source ), count( $tmpFiles ), "Local refs array size correct ($backendName)." );
+               } else {
+                       $tmpFile = $this->backend->getLocalReference( array( 'src' => $source ) );
+                       $this->assertNotNull( $tmpFile,
+                               "Creation of local copy of $source succeeded ($backendName)." );
+                       $contents = file_get_contents( $tmpFile->getPath() );
+                       $this->assertNotEquals( false, $contents, "Local ref of $source exists ($backendName)." );
+                       $this->assertEquals( $content[0], $contents, "Local ref of $source is correct ($backendName)." );
+               }
+       }
+
+       function provider_testGetLocalReference() {
+               $cases = array();
+
+               $base = self::baseStorePath();
+               $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" );
+               $cases[] = array( "$base/unittest-cont1/e/a/\$odd&.txt", "test file contents" );
+               $cases[] = array(
+                       array( "$base/unittest-cont1/e/a/x.txt", "$base/unittest-cont1/e/a/y.txt",
+                                "$base/unittest-cont1/e/a/z.txt" ),
+                       array( "contents xx", "contents xy", "contents xz" )
+               );
+
+               return $cases;
+       }
+
+       public function testGetLocalCopyAndReference404() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetLocalCopyAndReference404();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetLocalCopyAndReference404();
+               $this->tearDownFiles();
+       }
+
+       public function doTestGetLocalCopyAndReference404() {
+               $backendName = $this->backendClass();
+
+               $base = self::baseStorePath();
+
+               $tmpFile = $this->backend->getLocalCopy( array(
+                       'src' => "$base/unittest-cont1/not-there" ) );
+               $this->assertEquals( null, $tmpFile, "Local copy of not existing file is null ($backendName)." );
+
+               $tmpFile = $this->backend->getLocalReference( array(
+                       'src' => "$base/unittest-cont1/not-there" ) );
+               $this->assertEquals( null, $tmpFile, "Local ref of not existing file is null ($backendName)." );
+       }
+
+       /**
+        * @dataProvider provider_testGetFileHttpUrl
+        */
+       public function testGetFileHttpUrl( $source, $content ) {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetFileHttpUrl( $source, $content );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetFileHttpUrl( $source, $content );
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetFileHttpUrl( $source, $content ) {
+               $backendName = $this->backendClass();
+
+               $this->prepare( array( 'dir' => dirname( $source ) ) );
+               $status = $this->backend->doOperation(
+                       array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
+               $this->assertGoodStatus( $status,
+                       "Creation of file at $source succeeded ($backendName)." );
+
+               $url = $this->backend->getFileHttpUrl( array( 'src' => $source ) );
+
+               if ( $url !== null ) { // supported
+                       $data = Http::request( "GET", $url );
+                       $this->assertEquals( $content, $data,
+                               "HTTP GET of URL has right contents ($backendName)." );
+               }
+       }
+
+       function provider_testGetFileHttpUrl() {
+               $cases = array();
+
+               $base = self::baseStorePath();
+               $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" );
+               $cases[] = array( "$base/unittest-cont1/e/a/\$odd&.txt", "test file contents" );
+
+               return $cases;
+       }
+
+       /**
+        * @dataProvider provider_testPrepareAndClean
+        */
+       public function testPrepareAndClean( $path, $isOK ) {
+               $this->backend = $this->singleBackend;
+               $this->doTestPrepareAndClean( $path, $isOK );
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->doTestPrepareAndClean( $path, $isOK );
+               $this->tearDownFiles();
+       }
+
+       function provider_testPrepareAndClean() {
+               $base = self::baseStorePath();
+               return array(
+                       array( "$base/unittest-cont1/e/a/z/some_file1.txt", true ),
+                       array( "$base/unittest-cont2/a/z/some_file2.txt", true ),
+                       # Specific to FS backend with no basePath field set
+                       #array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
+               );
+       }
+
+       private function doTestPrepareAndClean( $path, $isOK ) {
+               $backendName = $this->backendClass();
+
+               $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
+               if ( $isOK ) {
+                       $this->assertGoodStatus( $status,
+                               "Preparing dir $path succeeded without warnings ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Preparing dir $path succeeded ($backendName)." );
+               } else {
+                       $this->assertEquals( false, $status->isOK(),
+                               "Preparing dir $path failed ($backendName)." );
+               }
+
+               $status = $this->backend->clean( array( 'dir' => dirname( $path ) ) );
+               if ( $isOK ) {
+                       $this->assertGoodStatus( $status,
+                               "Cleaning dir $path succeeded without warnings ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Cleaning dir $path succeeded ($backendName)." );
+               } else {
+                       $this->assertEquals( false, $status->isOK(),
+                               "Cleaning dir $path failed ($backendName)." );
+               }
+       }
+
+       public function testRecursiveClean() {
+               $this->backend = $this->singleBackend;
+               $this->doTestRecursiveClean();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->doTestRecursiveClean();
+               $this->tearDownFiles();
+       }
+
+       private function doTestRecursiveClean() {
+               $backendName = $this->backendClass();
+
+               $base = self::baseStorePath();
+               $dirs = array(
+                       "$base/unittest-cont1",
+                       "$base/unittest-cont1/e",
+                       "$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 ) );
+                       $this->assertGoodStatus( $status,
+                               "Preparing dir $dir succeeded without warnings ($backendName)." );
+               }
+
+               if ( $this->backend instanceof FSFileBackend ) {
+                       foreach ( $dirs as $dir ) {
+                               $this->assertEquals( true, $this->backend->directoryExists( array( 'dir' => $dir ) ),
+                                       "Dir $dir exists ($backendName)." );
+                       }
+               }
+
+               $status = $this->backend->clean(
+                       array( 'dir' => "$base/unittest-cont1", 'recursive' => 1 ) );
+               $this->assertGoodStatus( $status,
+                       "Recursive cleaning of dir $dir succeeded without warnings ($backendName)." );
+
+               foreach ( $dirs as $dir ) {
+                       $this->assertEquals( false, $this->backend->directoryExists( array( 'dir' => $dir ) ),
+                               "Dir $dir no longer exists ($backendName)." );
+               }
+       }
+
+       // @TODO: testSecure
+
+       public function testDoOperations() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestDoOperations();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestDoOperations();
+               $this->tearDownFiles();
+       }
+
+       private function doTestDoOperations() {
+               $base = self::baseStorePath();
+
+               $fileA = "$base/unittest-cont1/e/a/b/fileA.txt";
+               $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
+               $fileB = "$base/unittest-cont1/e/a/b/fileB.txt";
+               $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
+               $fileC = "$base/unittest-cont1/e/a/b/fileC.txt";
+               $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
+               $fileD = "$base/unittest-cont1/e/a/b/fileD.txt";
+
+               $this->prepare( array( 'dir' => dirname( $fileA ) ) );
+               $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
+               $this->prepare( array( 'dir' => dirname( $fileB ) ) );
+               $this->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
+               $this->prepare( array( 'dir' => dirname( $fileC ) ) );
+               $this->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
+               $this->prepare( array( 'dir' => dirname( $fileD ) ) );
+
+               $status = $this->backend->doOperations( array(
+                       array( 'op' => 'describe', 'src' => $fileA,
+                               'headers' => array( 'X-Content-Length' => '91.3' ), 'disposition' => 'inline' ),
+                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD, 'overwrite' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<empty>, D:<A>
+                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC ),
+                       // Now: A:<A>, B:<empty>, C:<B>, D:<A>
+                       array( 'op' => 'move', 'src' => $fileD, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       // Now: A:<A>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileA, 'overwrite' => 1 ),
+                       // Now: A:<B>, B:<empty>, C:<empty>, D:<empty>
+                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC ),
+                       // Now: A:<B>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileA, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Now: A:<empty>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'null' ),
+                       // Does nothing
+               ) );
+
+               $this->assertGoodStatus( $status, "Operation batch succeeded" );
+               $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
+               $this->assertEquals( 14, count( $status->success ),
+                       "Operation batch has correct success array" );
+
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileA ) ),
+                       "File does not exist at $fileA" );
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
+                       "File does not exist at $fileB" );
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
+                       "File does not exist at $fileD" );
+
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
+                       "File exists at $fileC" );
+               $this->assertEquals( $fileBContents,
+                       $this->backend->getFileContents( array( 'src' => $fileC ) ),
+                       "Correct file contents of $fileC" );
+               $this->assertEquals( strlen( $fileBContents ),
+                       $this->backend->getFileSize( array( 'src' => $fileC ) ),
+                       "Correct file size of $fileC" );
+               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+                       $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
+                       "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 doTestDoOperationsPipeline() {
+               $base = self::baseStorePath();
+
+               $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
+               $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
+               $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
+
+               $tmpNameA = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+               file_put_contents( $tmpNameA, $fileAContents );
+               $tmpNameB = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+               file_put_contents( $tmpNameB, $fileBContents );
+               $tmpNameC = TempFSFile::factory( "unittests_", 'txt' )->getPath();
+               file_put_contents( $tmpNameC, $fileCContents );
+
+               $this->filesToPrune[] = $tmpNameA; # avoid file leaking
+               $this->filesToPrune[] = $tmpNameB; # avoid file leaking
+               $this->filesToPrune[] = $tmpNameC; # avoid file leaking
+
+               $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 ) );
+               $this->prepare( array( 'dir' => dirname( $fileB ) ) );
+               $this->prepare( array( 'dir' => dirname( $fileC ) ) );
+               $this->prepare( array( 'dir' => dirname( $fileD ) ) );
+
+               $status = $this->backend->doOperations( array(
+                       array( 'op' => 'store', 'src' => $tmpNameA, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       array( 'op' => 'store', 'src' => $tmpNameB, 'dst' => $fileB, 'overwrite' => 1 ),
+                       array( 'op' => 'store', 'src' => $tmpNameC, 'dst' => $fileC, 'overwrite' => 1 ),
+                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD, 'overwrite' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<empty>, D:<A>
+                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC ),
+                       // Now: A:<A>, B:<empty>, C:<B>, D:<A>
+                       array( 'op' => 'move', 'src' => $fileD, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       // Now: A:<A>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileA, 'overwrite' => 1 ),
+                       // Now: A:<B>, B:<empty>, C:<empty>, D:<empty>
+                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC ),
+                       // Now: A:<B>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'move', 'src' => $fileA, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Now: A:<empty>, B:<empty>, C:<B>, D:<empty>
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Does nothing
+                       array( 'op' => 'null' ),
+                       // Does nothing
+               ) );
+
+               $this->assertGoodStatus( $status, "Operation batch succeeded" );
+               $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
+               $this->assertEquals( 16, count( $status->success ),
+                       "Operation batch has correct success array" );
+
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileA ) ),
+                       "File does not exist at $fileA" );
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
+                       "File does not exist at $fileB" );
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
+                       "File does not exist at $fileD" );
+
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
+                       "File exists at $fileC" );
+               $this->assertEquals( $fileBContents,
+                       $this->backend->getFileContents( array( 'src' => $fileC ) ),
+                       "Correct file contents of $fileC" );
+               $this->assertEquals( strlen( $fileBContents ),
+                       $this->backend->getFileSize( array( 'src' => $fileC ) ),
+                       "Correct file size of $fileC" );
+               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+                       $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
+                       "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 = self::baseStorePath();
+
+               $fileA = "$base/unittest-cont2/a/b/fileA.txt";
+               $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
+               $fileB = "$base/unittest-cont2/a/b/fileB.txt";
+               $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
+               $fileC = "$base/unittest-cont2/a/b/fileC.txt";
+               $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
+               $fileD = "$base/unittest-cont2/a/b/fileD.txt";
+
+               $this->prepare( array( 'dir' => dirname( $fileA ) ) );
+               $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
+               $this->prepare( array( 'dir' => dirname( $fileB ) ) );
+               $this->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
+               $this->prepare( array( 'dir' => dirname( $fileC ) ) );
+               $this->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
+
+               $status = $this->backend->doOperations( array(
+                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
+                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty>
+                       array( 'op' => 'copy', 'src' => $fileB, 'dst' => $fileD, 'overwrite' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<B>
+                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (failed)
+                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC, 'overwriteSame' => 1 ),
+                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (failed)
+                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileA, 'overwrite' => 1 ),
+                       // Now: A:<B>, B:<empty>, C:<A>, D:<empty>
+                       array( 'op' => 'delete', 'src' => $fileD ),
+                       // Now: A:<B>, B:<empty>, C:<A>, D:<empty>
+                       array( 'op' => 'null' ),
+                       // Does nothing
+               ), array( 'force' => 1 ) );
+
+               $this->assertNotEquals( array(), $status->errors, "Operation had warnings" );
+               $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
+               $this->assertEquals( 8, count( $status->success ),
+                       "Operation batch has correct success array" );
+
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
+                       "File does not exist at $fileB" );
+               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
+                       "File does not exist at $fileD" );
+
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileA ) ),
+                       "File does not exist at $fileA" );
+               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
+                       "File exists at $fileC" );
+               $this->assertEquals( $fileBContents,
+                       $this->backend->getFileContents( array( 'src' => $fileA ) ),
+                       "Correct file contents of $fileA" );
+               $this->assertEquals( strlen( $fileBContents ),
+                       $this->backend->getFileSize( array( 'src' => $fileA ) ),
+                       "Correct file size of $fileA" );
+               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+                       $this->backend->getFileSha1Base36( array( 'src' => $fileA ) ),
+                       "Correct file SHA-1 of $fileA" );
+       }
+
+       public function testGetFileList() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetFileList();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetFileList();
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetFileList() {
+               $backendName = $this->backendClass();
+               $base = self::baseStorePath();
+
+               // Should have no errors
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont-notexists" ) );
+
+               $files = array(
+                       "$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
+               $ops = array();
+               foreach ( $files as $file ) {
+                       $this->prepare( array( 'dir' => dirname( $file ) ) );
+                       $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
+               }
+               $status = $this->backend->doQuickOperations( $ops );
+               $this->assertGoodStatus( $status,
+                       "Creation of files succeeded ($backendName)." );
+               $this->assertEquals( true, $status->isOK(),
+                       "Creation of files succeeded with OK status ($backendName)." );
+
+               // Expected listing
+               $expected = array(
+                       "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 );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
+
+               // Actual listing (with trailing slash)
+               $list = array();
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
+
+               // Expected listing
+               $expected = array(
+                       "test1.txt",
+                       "test2.txt",
+                       "test3.txt",
+                       "test4.txt",
+                       "test5.txt",
+                       "sub/test0.txt",
+                       "sub/120-px-file.txt",
+               );
+               sort( $expected );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
+
+               // Actual listing (with trailing slash)
+               $list = array();
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
+
+               // Actual listing (using iterator second time)
+               $list = array();
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
+
+               // Expected listing (top files only)
+               $expected = array(
+                       "test1.txt",
+                       "test2.txt",
+                       "test3.txt",
+                       "test4.txt",
+                       "test5.txt"
+               );
+               sort( $expected );
+
+               // Actual listing (top files only)
+               $list = array();
+               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
+
+               foreach ( $files as $file ) { // clean up
+                       $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
+               }
+
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
+               foreach ( $iter as $iter ) {} // no errors
+       }
+
+       public function testGetDirectoryList() {
+               $this->backend = $this->singleBackend;
+               $this->tearDownFiles();
+               $this->doTestGetDirectoryList();
+               $this->tearDownFiles();
+
+               $this->backend = $this->multiBackend;
+               $this->tearDownFiles();
+               $this->doTestGetDirectoryList();
+               $this->tearDownFiles();
+       }
+
+       private function doTestGetDirectoryList() {
+               $backendName = $this->backendClass();
+
+               $base = self::baseStorePath();
+               $files = array(
+                       "$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
+               $ops = array();
+               foreach ( $files as $file ) {
+                       $this->prepare( array( 'dir' => dirname( $file ) ) );
+                       $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
+               }
+               $status = $this->backend->doQuickOperations( $ops );
+               $this->assertGoodStatus( $status,
+                       "Creation of files succeeded ($backendName)." );
+               $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",
+                       "subdir2",
+                       "subdir3",
+                       "subdir4",
+               );
+               sort( $expected );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (with trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Expected listing
+               $expected = array(
+                       "subdir",
+               );
+               sort( $expected );
+
+               // Actual listing (no trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (with trailing slash)
+               $list = array();
+               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
+
+               // Actual listing (using iterator second time)
+               $list = array();
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName), second iteration." );
+
+               // Expected listing (recursive)
+               $expected = array(
+                       "e",
+                       "e/subdir1",
+                       "e/subdir2",
+                       "e/subdir3",
+                       "e/subdir4",
+                       "e/subdir2/subdir",
+                       "e/subdir3/subdir",
+                       "e/subdir4/subdir",
+                       "e/subdir4/subdir/sub",
+               );
+               sort( $expected );
+
+               // Actual listing (recursive)
+               $list = array();
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               // Expected listing (recursive)
+               $expected = array(
+                       "subdir",
+                       "subdir/sub",
+               );
+               sort( $expected );
+
+               // Actual listing (recursive)
+               $list = array();
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir4" ) );
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               // Actual listing (recursive, second time)
+               $list = array();
+               foreach ( $iter as $file ) {
+                       $list[] = $file;
+               }
+               sort( $list );
+
+               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
+
+               foreach ( $files as $file ) { // clean up
+                       $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
+               }
+
+               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
+               foreach ( $iter as $iter ) {} // no errors
+       }
+
+       public function testLockCalls() {
+               $this->backend = $this->singleBackend;
+               $this->doTestLockCalls();
+       }
+
+       private function doTestLockCalls() {
+               $backendName = $this->backendClass();
+
+               for ( $i=0; $i<50; $i++ ) {
+                       $paths = array(
+                               "test1.txt",
+                               "test2.txt",
+                               "test3.txt",
+                               "subdir1",
+                               "subdir1", // duplicate
+                               "subdir1/test1.txt",
+                               "subdir1/test2.txt",
+                               "subdir2",
+                               "subdir2", // duplicate
+                               "subdir2/test3.txt",
+                               "subdir2/test4.txt",
+                               "subdir2/subdir",
+                               "subdir2/subdir/test1.txt",
+                               "subdir2/subdir/test2.txt",
+                               "subdir2/subdir/test3.txt",
+                               "subdir2/subdir/test4.txt",
+                               "subdir2/subdir/test5.txt",
+                               "subdir2/subdir/sub",
+                               "subdir2/subdir/sub/test0.txt",
+                               "subdir2/subdir/sub/120-px-file.txt",
+                       );
+
+                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_SH );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+
+                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_EX );
+                       $this->assertEquals( array(), $status->errors,
+                               "Locking of files succeeded ($backendName)." );
+                       $this->assertEquals( true, $status->isOK(),
+                               "Locking of files succeeded with OK status ($backendName)." );
+               }
+       }
+
+       // test helper wrapper for backend prepare() function
+       private function prepare( array $params ) {
+               return $this->backend->prepare( $params );
+       }
+
+       // test helper wrapper for backend prepare() function
+       private function create( array $params ) {
+               $params['op'] = 'create';
+               return $this->backend->doQuickOperations( array( $params ) );
+       }
+
+       function tearDownFiles() {
+               foreach ( $this->filesToPrune as $file ) {
+                       @unlink( $file );
+               }
+               $containers = array( 'unittest-cont1', 'unittest-cont2' );
+               foreach ( $containers as $container ) {
+                       $this->deleteFiles( $container );
+               }
+               $this->filesToPrune = array();
+       }
+
+       private function deleteFiles( $container ) {
+               $base = self::baseStorePath();
+               $iter = $this->backend->getFileList( array( 'dir' => "$base/$container" ) );
+               if ( $iter ) {
+                       foreach ( $iter as $file ) {
+                               $this->backend->quickDelete( array( 'src' => "$base/$container/$file" ) );
+                       }
+                       // free the directory, to avoid Permission denied under windows on rmdir
+                       unset( $iter );
+               }
+               $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 );
+       }
+}
diff --git a/tests/phpunit/includes/filerepo/FileBackendTest.php b/tests/phpunit/includes/filerepo/FileBackendTest.php
deleted file mode 100644 (file)
index a2dc5c6..0000000
+++ /dev/null
@@ -1,1868 +0,0 @@
-<?php
-
-/**
- * @group FileRepo
- * @group FileBackend
- * @group medium
- */
-class FileBackendTest extends MediaWikiTestCase {
-       private $backend, $multiBackend;
-       private $filesToPrune = array();
-       private static $backendToUse;
-
-       function setUp() {
-               global $wgFileBackends;
-               parent::setUp();
-               $tmpPrefix = wfTempDir() . '/filebackend-unittest-' . time() . '-' . mt_rand();
-               if ( $this->getCliArg( 'use-filebackend=' ) ) {
-                       if ( self::$backendToUse ) {
-                               $this->singleBackend = self::$backendToUse;
-                       } else {
-                               $name = $this->getCliArg( 'use-filebackend=' );
-                               $useConfig = array();
-                               foreach ( $wgFileBackends as $conf ) {
-                                       if ( $conf['name'] == $name ) {
-                                               $useConfig = $conf;
-                                               break;
-                                       }
-                               }
-                               $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;
-                       }
-               } else {
-                       $this->singleBackend = new FSFileBackend( array(
-                               'name'        => 'localtesting',
-                               'lockManager' => 'fsLockManager',
-                               #'parallelize' => 'implicit',
-                               'containerPaths' => array(
-                                       'unittest-cont1' => "{$tmpPrefix}-localtesting-cont1",
-                                       'unittest-cont2' => "{$tmpPrefix}-localtesting-cont2" )
-                       ) );
-               }
-               $this->multiBackend = new FileBackendMultiWrite( array(
-                       'name'        => 'localtesting',
-                       'lockManager' => 'fsLockManager',
-                       'parallelize' => 'implicit',
-                       'backends'    => array(
-                               array(
-                                       'name'          => 'localmutlitesting1',
-                                       'class'         => 'FSFileBackend',
-                                       'lockManager'   => 'nullLockManager',
-                                       'containerPaths' => array(
-                                               'unittest-cont1' => "{$tmpPrefix}-localtestingmulti1-cont1",
-                                               'unittest-cont2' => "{$tmpPrefix}-localtestingmulti1-cont2" ),
-                                       'isMultiMaster' => false
-                               ),
-                               array(
-                                       'name'          => 'localmutlitesting2',
-                                       'class'         => 'FSFileBackend',
-                                       'lockManager'   => 'nullLockManager',
-                                       'containerPaths' => array(
-                                               'unittest-cont1' => "{$tmpPrefix}-localtestingmulti2-cont1",
-                                               'unittest-cont2' => "{$tmpPrefix}-localtestingmulti2-cont2" ),
-                                       'isMultiMaster' => true
-                               )
-                       )
-               ) );
-               $this->filesToPrune = array();
-       }
-
-       private function baseStorePath() {
-               return 'mwstore://localtesting';
-       }
-
-       private function backendClass() {
-               return get_class( $this->backend );
-       }
-
-       /**
-        * @dataProvider provider_testIsStoragePath
-        */
-       public function testIsStoragePath( $path, $isStorePath ) {
-               $this->assertEquals( $isStorePath, FileBackend::isStoragePath( $path ),
-                       "FileBackend::isStoragePath on path '$path'" );
-       }
-
-       function provider_testIsStoragePath() {
-               return array(
-                       array( 'mwstore://', true ),
-                       array( 'mwstore://backend', true ),
-                       array( 'mwstore://backend/container', true ),
-                       array( 'mwstore://backend/container/', true ),
-                       array( 'mwstore://backend/container/path', true ),
-                       array( 'mwstore://backend//container/', true ),
-                       array( 'mwstore://backend//container//', true ),
-                       array( 'mwstore://backend//container//path', true ),
-                       array( 'mwstore:///', true ),
-                       array( 'mwstore:/', false ),
-                       array( 'mwstore:', false ),
-               );
-       }
-
-       /**
-        * @dataProvider provider_testSplitStoragePath
-        */
-       public function testSplitStoragePath( $path, $res ) {
-               $this->assertEquals( $res, FileBackend::splitStoragePath( $path ),
-                       "FileBackend::splitStoragePath on path '$path'" );
-       }
-
-       function provider_testSplitStoragePath() {
-               return array(
-                       array( 'mwstore://backend/container', array( 'backend', 'container', '' ) ),
-                       array( 'mwstore://backend/container/', array( 'backend', 'container', '' ) ),
-                       array( 'mwstore://backend/container/path', array( 'backend', 'container', 'path' ) ),
-                       array( 'mwstore://backend/container//path', array( 'backend', 'container', '/path' ) ),
-                       array( 'mwstore://backend//container/path', array( null, null, null ) ),
-                       array( 'mwstore://backend//container//path', array( null, null, null ) ),
-                       array( 'mwstore://', array( null, null, null ) ),
-                       array( 'mwstore://backend', array( null, null, null ) ),
-                       array( 'mwstore:///', array( null, null, null ) ),
-                       array( 'mwstore:/', array( null, null, null ) ),
-                       array( 'mwstore:', array( null, null, null ) )
-               );
-       }
-
-       /**
-        * @dataProvider provider_normalizeStoragePath
-        */
-       public function testNormalizeStoragePath( $path, $res ) {
-               $this->assertEquals( $res, FileBackend::normalizeStoragePath( $path ),
-                       "FileBackend::normalizeStoragePath on path '$path'" );
-       }
-
-       function provider_normalizeStoragePath() {
-               return array(
-                       array( 'mwstore://backend/container', 'mwstore://backend/container' ),
-                       array( 'mwstore://backend/container/', 'mwstore://backend/container' ),
-                       array( 'mwstore://backend/container/path', 'mwstore://backend/container/path' ),
-                       array( 'mwstore://backend/container//path', 'mwstore://backend/container/path' ),
-                       array( 'mwstore://backend/container///path', 'mwstore://backend/container/path' ),
-                       array( 'mwstore://backend/container///path//to///obj', 'mwstore://backend/container/path/to/obj',
-                       array( 'mwstore://', null ),
-                       array( 'mwstore://backend', null ),
-                       array( 'mwstore://backend//container/path', null ),
-                       array( 'mwstore://backend//container//path', null ),
-                       array( 'mwstore:///', null ),
-                       array( 'mwstore:/', null ),
-                       array( 'mwstore:', null ), )
-               );
-       }
-
-       /**
-        * @dataProvider provider_testParentStoragePath
-        */
-       public function testParentStoragePath( $path, $res ) {
-               $this->assertEquals( $res, FileBackend::parentStoragePath( $path ),
-                       "FileBackend::parentStoragePath on path '$path'" );
-       }
-
-       function provider_testParentStoragePath() {
-               return array(
-                       array( 'mwstore://backend/container/path/to/obj', 'mwstore://backend/container/path/to' ),
-                       array( 'mwstore://backend/container/path/to', 'mwstore://backend/container/path' ),
-                       array( 'mwstore://backend/container/path', 'mwstore://backend/container' ),
-                       array( 'mwstore://backend/container', null ),
-                       array( 'mwstore://backend/container/path/to/obj/', 'mwstore://backend/container/path/to' ),
-                       array( 'mwstore://backend/container/path/to/', 'mwstore://backend/container/path' ),
-                       array( 'mwstore://backend/container/path/', 'mwstore://backend/container' ),
-                       array( 'mwstore://backend/container/', null ),
-               );
-       }
-
-       /**
-        * @dataProvider provider_testExtensionFromPath
-        */
-       public function testExtensionFromPath( $path, $res ) {
-               $this->assertEquals( $res, FileBackend::extensionFromPath( $path ),
-                       "FileBackend::extensionFromPath on path '$path'" );
-       }
-
-       function provider_testExtensionFromPath() {
-               return array(
-                       array( 'mwstore://backend/container/path.txt', 'txt' ),
-                       array( 'mwstore://backend/container/path.svg.png', 'png' ),
-                       array( 'mwstore://backend/container/path', '' ),
-                       array( 'mwstore://backend/container/path.', '' ),
-               );
-       }
-
-       /**
-        * @dataProvider provider_testStore
-        */
-       public function testStore( $op ) {
-               $this->filesToPrune[] = $op['src'];
-
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestStore( $op );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestStore( $op );
-               $this->filesToPrune[] = $op['src']; # avoid file leaking
-               $this->tearDownFiles();
-       }
-
-       private function doTestStore( $op ) {
-               $backendName = $this->backendClass();
-
-               $source = $op['src'];
-               $dest = $op['dst'];
-               $this->prepare( array( 'dir' => dirname( $dest ) ) );
-
-               file_put_contents( $source, "Unit test file" );
-
-               if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
-                       $this->backend->store( $op );
-               }
-
-               $status = $this->backend->doOperation( $op );
-
-               $this->assertGoodStatus( $status,
-                       "Store from $source to $dest succeeded without warnings ($backendName)." );
-               $this->assertEquals( true, $status->isOK(),
-                       "Store from $source to $dest succeeded ($backendName)." );
-               $this->assertEquals( array( 0 => true ), $status->success,
-                       "Store from $source to $dest has proper 'success' field in Status ($backendName)." );
-               $this->assertEquals( true, file_exists( $source ),
-                       "Source file $source still exists ($backendName)." );
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
-                       "Destination file $dest exists ($backendName)." );
-
-               $this->assertEquals( filesize( $source ),
-                       $this->backend->getFileSize( array( 'src' => $dest ) ),
-                       "Destination file $dest has correct size ($backendName)." );
-
-               $props1 = FSFile::getPropsFromPath( $source );
-               $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/e/fun/obj1.txt';
-               $op = array( 'op' => 'store', 'src' => $tmpName, 'dst' => $toPath );
-               $cases[] = array(
-                       $op, // operation
-                       $tmpName, // source
-                       $toPath, // dest
-               );
-
-               $op2 = $op;
-               $op2['overwrite'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       $tmpName, // source
-                       $toPath, // dest
-               );
-
-               $op2 = $op;
-               $op2['overwriteSame'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       $tmpName, // source
-                       $toPath, // dest
-               );
-
-               return $cases;
-       }
-
-       /**
-        * @dataProvider provider_testCopy
-        */
-       public function testCopy( $op ) {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestCopy( $op );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestCopy( $op );
-               $this->tearDownFiles();
-       }
-
-       private function doTestCopy( $op ) {
-               $backendName = $this->backendClass();
-
-               $source = $op['src'];
-               $dest = $op['dst'];
-               $this->prepare( array( 'dir' => dirname( $source ) ) );
-               $this->prepare( array( 'dir' => dirname( $dest ) ) );
-
-               $status = $this->backend->doOperation(
-                       array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
-               $this->assertGoodStatus( $status,
-                       "Creation of file at $source succeeded ($backendName)." );
-
-               if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
-                       $this->backend->copy( $op );
-               }
-
-               $status = $this->backend->doOperation( $op );
-
-               $this->assertGoodStatus( $status,
-                       "Copy from $source to $dest succeeded without warnings ($backendName)." );
-               $this->assertEquals( true, $status->isOK(),
-                       "Copy from $source to $dest succeeded ($backendName)." );
-               $this->assertEquals( array( 0 => true ), $status->success,
-                       "Copy from $source to $dest has proper 'success' field in Status ($backendName)." );
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $source ) ),
-                       "Source file $source still exists ($backendName)." );
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
-                       "Destination file $dest exists after copy ($backendName)." );
-
-               $this->assertEquals(
-                       $this->backend->getFileSize( array( 'src' => $source ) ),
-                       $this->backend->getFileSize( array( 'src' => $dest ) ),
-                       "Destination file $dest has correct size ($backendName)." );
-
-               $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
-               $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/e/file.txt';
-               $dest = $this->baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
-
-               $op = array( 'op' => 'copy', 'src' => $source, 'dst' => $dest );
-               $cases[] = array(
-                       $op, // operation
-                       $source, // source
-                       $dest, // dest
-               );
-
-               $op2 = $op;
-               $op2['overwrite'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       $source, // source
-                       $dest, // dest
-               );
-
-               $op2 = $op;
-               $op2['overwriteSame'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       $source, // source
-                       $dest, // dest
-               );
-
-               return $cases;
-       }
-
-       /**
-        * @dataProvider provider_testMove
-        */
-       public function testMove( $op ) {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestMove( $op );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestMove( $op );
-               $this->tearDownFiles();
-       }
-
-       private function doTestMove( $op ) {
-               $backendName = $this->backendClass();
-
-               $source = $op['src'];
-               $dest = $op['dst'];
-               $this->prepare( array( 'dir' => dirname( $source ) ) );
-               $this->prepare( array( 'dir' => dirname( $dest ) ) );
-
-               $status = $this->backend->doOperation(
-                       array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
-               $this->assertGoodStatus( $status,
-                       "Creation of file at $source succeeded ($backendName)." );
-
-               if ( isset( $op['overwrite'] ) || isset( $op['overwriteSame'] ) ) {
-                       $this->backend->copy( $op );
-               }
-
-               $status = $this->backend->doOperation( $op );
-               $this->assertGoodStatus( $status,
-                       "Move from $source to $dest succeeded without warnings ($backendName)." );
-               $this->assertEquals( true, $status->isOK(),
-                       "Move from $source to $dest succeeded ($backendName)." );
-               $this->assertEquals( array( 0 => true ), $status->success,
-                       "Move from $source to $dest has proper 'success' field in Status ($backendName)." );
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
-                       "Source file $source does not still exists ($backendName)." );
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
-                       "Destination file $dest exists after move ($backendName)." );
-
-               $this->assertNotEquals(
-                       $this->backend->getFileSize( array( 'src' => $source ) ),
-                       $this->backend->getFileSize( array( 'src' => $dest ) ),
-                       "Destination file $dest has correct size ($backendName)." );
-
-               $props1 = $this->backend->getFileProps( array( 'src' => $source ) );
-               $props2 = $this->backend->getFileProps( array( 'src' => $dest ) );
-               $this->assertEquals( false, $props1['fileExists'],
-                       "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/e/file.txt';
-               $dest = $this->baseStorePath() . '/unittest-cont2/a/fileMoved.txt';
-
-               $op = array( 'op' => 'move', 'src' => $source, 'dst' => $dest );
-               $cases[] = array(
-                       $op, // operation
-                       $source, // source
-                       $dest, // dest
-               );
-
-               $op2 = $op;
-               $op2['overwrite'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       $source, // source
-                       $dest, // dest
-               );
-
-               $op2 = $op;
-               $op2['overwriteSame'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       $source, // source
-                       $dest, // dest
-               );
-
-               return $cases;
-       }
-
-       /**
-        * @dataProvider provider_testDelete
-        */
-       public function testDelete( $op, $withSource, $okStatus ) {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestDelete( $op, $withSource, $okStatus );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestDelete( $op, $withSource, $okStatus );
-               $this->tearDownFiles();
-       }
-
-       private function doTestDelete( $op, $withSource, $okStatus ) {
-               $backendName = $this->backendClass();
-
-               $source = $op['src'];
-               $this->prepare( array( 'dir' => dirname( $source ) ) );
-
-               if ( $withSource ) {
-                       $status = $this->backend->doOperation(
-                               array( 'op' => 'create', 'content' => 'blahblah', 'dst' => $source ) );
-                       $this->assertGoodStatus( $status,
-                               "Creation of file at $source succeeded ($backendName)." );
-               }
-
-               $status = $this->backend->doOperation( $op );
-               if ( $okStatus ) {
-                       $this->assertGoodStatus( $status,
-                               "Deletion of file at $source succeeded without warnings ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Deletion of file at $source succeeded ($backendName)." );
-                       $this->assertEquals( array( 0 => true ), $status->success,
-                               "Deletion of file at $source has proper 'success' field in Status ($backendName)." );
-               } else {
-                       $this->assertEquals( false, $status->isOK(),
-                               "Deletion of file at $source failed ($backendName)." );
-               }
-
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $source ) ),
-                       "Source file $source does not exist after move ($backendName)." );
-
-               $this->assertFalse(
-                       $this->backend->getFileSize( array( 'src' => $source ) ),
-                       "Source file $source has correct size (false) ($backendName)." );
-
-               $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/e/myfacefile.txt';
-
-               $op = array( 'op' => 'delete', 'src' => $source );
-               $cases[] = array(
-                       $op, // operation
-                       true, // with source
-                       true // succeeds
-               );
-
-               $cases[] = array(
-                       $op, // operation
-                       false, // without source
-                       false // fails
-               );
-
-               $op['ignoreMissingSource'] = true;
-               $cases[] = array(
-                       $op, // operation
-                       false, // without source
-                       true // succeeds
-               );
-
-               return $cases;
-       }
-
-       /**
-        * @dataProvider provider_testCreate
-        */
-       public function testCreate( $op, $alreadyExists, $okStatus, $newSize ) {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestCreate( $op, $alreadyExists, $okStatus, $newSize );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestCreate( $op, $alreadyExists, $okStatus, $newSize );
-               $this->tearDownFiles();
-       }
-
-       private function doTestCreate( $op, $alreadyExists, $okStatus, $newSize ) {
-               $backendName = $this->backendClass();
-
-               $dest = $op['dst'];
-               $this->prepare( array( 'dir' => dirname( $dest ) ) );
-
-               $oldText = 'blah...blah...waahwaah';
-               if ( $alreadyExists ) {
-                       $status = $this->backend->doOperation(
-                               array( 'op' => 'create', 'content' => $oldText, 'dst' => $dest ) );
-                       $this->assertGoodStatus( $status,
-                               "Creation of file at $dest succeeded ($backendName)." );
-               }
-
-               $status = $this->backend->doOperation( $op );
-               if ( $okStatus ) {
-                       $this->assertGoodStatus( $status,
-                               "Creation of file at $dest succeeded without warnings ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Creation of file at $dest succeeded ($backendName)." );
-                       $this->assertEquals( array( 0 => true ), $status->success,
-                               "Creation of file at $dest has proper 'success' field in Status ($backendName)." );
-               } else {
-                       $this->assertEquals( false, $status->isOK(),
-                               "Creation of file at $dest failed ($backendName)." );
-               }
-
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $dest ) ),
-                       "Destination file $dest exists after creation ($backendName)." );
-
-               $props1 = $this->backend->getFileProps( array( 'src' => $dest ) );
-               $this->assertEquals( true, $props1['fileExists'],
-                       "Destination file $dest exists according to props ($backendName)." );
-               if ( $okStatus ) { // file content is what we saved
-                       $this->assertEquals( $newSize, $props1['size'],
-                               "Destination file $dest has expected size according to props ($backendName)." );
-                       $this->assertEquals( $newSize,
-                               $this->backend->getFileSize( array( 'src' => $dest ) ),
-                               "Destination file $dest has correct size ($backendName)." );
-               } else { // file content is some other previous text
-                       $this->assertEquals( strlen( $oldText ), $props1['size'],
-                               "Destination file $dest has original size according to props ($backendName)." );
-                       $this->assertEquals( strlen( $oldText ),
-                               $this->backend->getFileSize( array( 'src' => $dest ) ),
-                               "Destination file $dest has original size according to props ($backendName)." );
-               }
-
-               $this->assertBackendPathsConsistent( array( $dest ) );
-       }
-
-       /**
-        * @dataProvider provider_testCreate
-        */
-       public function provider_testCreate() {
-               $cases = array();
-
-               $dest = $this->baseStorePath() . '/unittest-cont2/a/myspacefile.txt';
-
-               $op = array( 'op' => 'create', 'content' => 'test test testing', 'dst' => $dest );
-               $cases[] = array(
-                       $op, // operation
-                       false, // no dest already exists
-                       true, // succeeds
-                       strlen( $op['content'] )
-               );
-
-               $op2 = $op;
-               $op2['content'] = "\n";
-               $cases[] = array(
-                       $op2, // operation
-                       false, // no dest already exists
-                       true, // succeeds
-                       strlen( $op2['content'] )
-               );
-
-               $op2 = $op;
-               $op2['content'] = "fsf\n waf 3kt";
-               $cases[] = array(
-                       $op2, // operation
-                       true, // dest already exists
-                       false, // fails
-                       strlen( $op2['content'] )
-               );
-
-               $op2 = $op;
-               $op2['content'] = "egm'g gkpe gpqg eqwgwqg";
-               $op2['overwrite'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       true, // dest already exists
-                       true, // succeeds
-                       strlen( $op2['content'] )
-               );
-
-               $op2 = $op;
-               $op2['content'] = "39qjmg3-qg";
-               $op2['overwriteSame'] = true;
-               $cases[] = array(
-                       $op2, // operation
-                       true, // dest already exists
-                       false, // succeeds
-                       strlen( $op2['content'] )
-               );
-
-               return $cases;
-       }
-
-       public function testDoQuickOperations() {
-               $this->backend = $this->singleBackend;
-               $this->doTestDoQuickOperations();
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->doTestDoQuickOperations();
-               $this->tearDownFiles();
-       }
-
-       private function doTestDoQuickOperations() {
-               $backendName = $this->backendClass();
-
-               $base = $this->baseStorePath();
-               $files = array(
-                       "$base/unittest-cont1/e/fileA.a",
-                       "$base/unittest-cont1/e/fileB.a",
-                       "$base/unittest-cont1/e/fileC.a"
-               );
-               $ops = array();
-               $purgeOps = array();
-               foreach ( $files as $path ) {
-                       $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
-                       $this->assertGoodStatus( $status,
-                               "Preparing $path succeeded without warnings ($backendName)." );
-                       $ops[] = array( 'op' => 'create', 'dst' => $path, 'content' => mt_rand(0,50000) );
-                       $purgeOps[] = array( 'op' => 'delete', 'src' => $path );
-               }
-               $purgeOps[] = array( 'op' => 'null' );
-               $status = $this->backend->doQuickOperations( $ops );
-               $this->assertGoodStatus( $status,
-                       "Creation of source files succeeded ($backendName)." );
-
-               foreach ( $files as $file ) {
-                       $this->assertTrue( $this->backend->fileExists( array( 'src' => $file ) ),
-                               "File $file exists." );
-               }
-
-               $status = $this->backend->doQuickOperations( $purgeOps );
-               $this->assertGoodStatus( $status,
-                       "Quick deletion of source files succeeded ($backendName)." );
-
-               foreach ( $files as $file ) {
-                       $this->assertFalse( $this->backend->fileExists( array( 'src' => $file ) ),
-                               "File $file purged." );
-               }
-       }
-
-       /**
-        * @dataProvider provider_testConcatenate
-        */
-       public function testConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
-               $this->filesToPrune[] = $op['dst'];
-
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestConcatenate( $op, $srcs, $srcsContent, $alreadyExists, $okStatus );
-               $this->filesToPrune[] = $op['dst']; # avoid file leaking
-               $this->tearDownFiles();
-       }
-
-       private function doTestConcatenate( $params, $srcs, $srcsContent, $alreadyExists, $okStatus ) {
-               $backendName = $this->backendClass();
-
-               $expContent = '';
-               // Create sources
-               $ops = array();
-               foreach ( $srcs as $i => $source ) {
-                       $this->prepare( array( 'dir' => dirname( $source ) ) );
-                       $ops[] = array(
-                               'op'      => 'create', // operation
-                               'dst'     => $source, // source
-                               'content' => $srcsContent[$i]
-                       );
-                       $expContent .= $srcsContent[$i];
-               }
-               $status = $this->backend->doOperations( $ops );
-
-               $this->assertGoodStatus( $status,
-                       "Creation of source files succeeded ($backendName)." );
-
-               $dest = $params['dst'];
-               if ( $alreadyExists ) {
-                       $ok = file_put_contents( $dest, 'blah...blah...waahwaah' ) !== false;
-                       $this->assertEquals( true, $ok,
-                               "Creation of file at $dest succeeded ($backendName)." );
-               } else {
-                       $ok = file_put_contents( $dest, '' ) !== false;
-                       $this->assertEquals( true, $ok,
-                               "Creation of 0-byte file at $dest succeeded ($backendName)." );
-               }
-
-               // Combine the files into one
-               $status = $this->backend->concatenate( $params );
-               if ( $okStatus ) {
-                       $this->assertGoodStatus( $status,
-                               "Creation of concat file at $dest succeeded without warnings ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Creation of concat file at $dest succeeded ($backendName)." );
-               } else {
-                       $this->assertEquals( false, $status->isOK(),
-                               "Creation of concat file at $dest failed ($backendName)." );
-               }
-
-               if ( $okStatus ) {
-                       $this->assertEquals( true, is_file( $dest ),
-                               "Dest concat file $dest exists after creation ($backendName)." );
-               } else {
-                       $this->assertEquals( true, is_file( $dest ),
-                               "Dest concat file $dest exists after failed creation ($backendName)." );
-               }
-
-               $contents = file_get_contents( $dest );
-               $this->assertNotEquals( false, $contents, "File at $dest exists ($backendName)." );
-
-               if ( $okStatus ) {
-                       $this->assertEquals( $expContent, $contents,
-                               "Concat file at $dest has correct contents ($backendName)." );
-               } else {
-                       $this->assertNotEquals( $expContent, $contents,
-                               "Concat file at $dest has correct contents ($backendName)." );
-               }
-       }
-
-       function provider_testConcatenate() {
-               $cases = array();
-
-               $rand = mt_rand( 0, 2000000000 ) . time();
-               $dest = wfTempDir() . "/randomfile!$rand.txt";
-               $srcs = array(
-                       $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',
-                       'ageageag',
-                       'rhokohlr',
-                       'shgmslkg',
-                       'kenga',
-                       'owagmal',
-                       'kgmae',
-                       'g eak;g',
-                       'lkaem;a',
-                       'legma'
-               );
-               $params = array( 'srcs' => $srcs, 'dst' => $dest );
-
-               $cases[] = array(
-                       $params, // operation
-                       $srcs, // sources
-                       $content, // content for each source
-                       false, // no dest already exists
-                       true, // succeeds
-               );
-
-               $cases[] = array(
-                       $params, // operation
-                       $srcs, // sources
-                       $content, // content for each source
-                       true, // dest already exists
-                       false, // succeeds
-               );
-
-               return $cases;
-       }
-
-       /**
-        * @dataProvider provider_testGetFileStat
-        */
-       public function testGetFileStat( $path, $content, $alreadyExists ) {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestGetFileStat( $path, $content, $alreadyExists );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestGetFileStat( $path, $content, $alreadyExists );
-               $this->tearDownFiles();
-       }
-
-       private function doTestGetFileStat( $path, $content, $alreadyExists ) {
-               $backendName = $this->backendClass();
-
-               if ( $alreadyExists ) {
-                       $this->prepare( array( 'dir' => dirname( $path ) ) );
-                       $status = $this->create( array( 'dst' => $path, 'content' => $content ) );
-                       $this->assertGoodStatus( $status,
-                               "Creation of file at $path succeeded ($backendName)." );
-
-                       $size = $this->backend->getFileSize( array( 'src' => $path ) );
-                       $time = $this->backend->getFileTimestamp( array( 'src' => $path ) );
-                       $stat = $this->backend->getFileStat( array( 'src' => $path ) );
-
-                       $this->assertEquals( strlen( $content ), $size,
-                               "Correct file size of '$path'" );
-                       $this->assertTrue( abs( time() - wfTimestamp( TS_UNIX, $time ) ) < 10,
-                               "Correct file timestamp of '$path'" );
-
-                       $size = $stat['size'];
-                       $time = $stat['mtime'];
-                       $this->assertEquals( strlen( $content ), $size,
-                               "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 ) );
-                       $stat = $this->backend->getFileStat( array( 'src' => $path ) );
-
-                       $this->assertFalse( $size, "Correct file size of '$path'" );
-                       $this->assertFalse( $time, "Correct file timestamp of '$path'" );
-                       $this->assertFalse( $stat, "Correct file stat of '$path'" );
-               }
-       }
-
-       function provider_testGetFileStat() {
-               $cases = array();
-
-               $base = $this->baseStorePath();
-               $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;
-       }
-
-       /**
-        * @dataProvider provider_testGetFileContents
-        */
-       public function testGetFileContents( $source, $content ) {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestGetFileContents( $source, $content );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestGetFileContents( $source, $content );
-               $this->tearDownFiles();
-       }
-
-       private function doTestGetFileContents( $source, $content ) {
-               $backendName = $this->backendClass();
-
-               $this->prepare( array( 'dir' => dirname( $source ) ) );
-
-               $status = $this->backend->doOperation(
-                       array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
-               $this->assertGoodStatus( $status,
-                       "Creation of file at $source succeeded ($backendName)." );
-               $this->assertEquals( true, $status->isOK(),
-                       "Creation of file at $source succeeded with OK status ($backendName)." );
-
-               $newContents = $this->backend->getFileContents( array( 'src' => $source, 'latest' => 1 ) );
-               $this->assertNotEquals( false, $newContents,
-                       "Read of file at $source succeeded ($backendName)." );
-
-               $this->assertEquals( $content, $newContents,
-                       "Contents read match data at $source ($backendName)." );
-       }
-
-       function provider_testGetFileContents() {
-               $cases = array();
-
-               $base = $this->baseStorePath();
-               $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;
-       }
-
-       /**
-        * @dataProvider provider_testGetLocalCopy
-        */
-       public function testGetLocalCopy( $source, $content ) {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestGetLocalCopy( $source, $content );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestGetLocalCopy( $source, $content );
-               $this->tearDownFiles();
-       }
-
-       private function doTestGetLocalCopy( $source, $content ) {
-               $backendName = $this->backendClass();
-
-               $this->prepare( array( 'dir' => dirname( $source ) ) );
-
-               $status = $this->backend->doOperation(
-                       array( 'op' => 'create', 'content' => $content, 'dst' => $source ) );
-               $this->assertGoodStatus( $status,
-                       "Creation of file at $source succeeded ($backendName)." );
-
-               $tmpFile = $this->backend->getLocalCopy( array( 'src' => $source ) );
-               $this->assertNotNull( $tmpFile,
-                       "Creation of local copy of $source succeeded ($backendName)." );
-
-               $contents = file_get_contents( $tmpFile->getPath() );
-               $this->assertNotEquals( false, $contents, "Local copy of $source exists ($backendName)." );
-       }
-
-       function provider_testGetLocalCopy() {
-               $cases = array();
-
-               $base = $this->baseStorePath();
-               $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;
-       }
-
-       /**
-        * @dataProvider provider_testGetLocalReference
-        */
-       public function testGetLocalReference( $source, $content ) {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestGetLocalReference( $source, $content );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestGetLocalReference( $source, $content );
-               $this->tearDownFiles();
-       }
-
-       private function doTestGetLocalReference( $source, $content ) {
-               $backendName = $this->backendClass();
-
-               $this->prepare( array( 'dir' => dirname( $source ) ) );
-
-               $status = $this->create( array( 'content' => $content, 'dst' => $source ) );
-               $this->assertGoodStatus( $status,
-                       "Creation of file at $source succeeded ($backendName)." );
-
-               $tmpFile = $this->backend->getLocalReference( array( 'src' => $source ) );
-               $this->assertNotNull( $tmpFile,
-                       "Creation of local copy of $source succeeded ($backendName)." );
-
-               $contents = file_get_contents( $tmpFile->getPath() );
-               $this->assertNotEquals( false, $contents, "Local copy of $source exists ($backendName)." );
-       }
-
-       function provider_testGetLocalReference() {
-               $cases = array();
-
-               $base = $this->baseStorePath();
-               $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;
-       }
-
-       /**
-        * @dataProvider provider_testPrepareAndClean
-        */
-       public function testPrepareAndClean( $path, $isOK ) {
-               $this->backend = $this->singleBackend;
-               $this->doTestPrepareAndClean( $path, $isOK );
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->doTestPrepareAndClean( $path, $isOK );
-               $this->tearDownFiles();
-       }
-
-       function provider_testPrepareAndClean() {
-               $base = $this->baseStorePath();
-               return array(
-                       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 ),
-               );
-       }
-
-       private function doTestPrepareAndClean( $path, $isOK ) {
-               $backendName = $this->backendClass();
-
-               $status = $this->prepare( array( 'dir' => dirname( $path ) ) );
-               if ( $isOK ) {
-                       $this->assertGoodStatus( $status,
-                               "Preparing dir $path succeeded without warnings ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Preparing dir $path succeeded ($backendName)." );
-               } else {
-                       $this->assertEquals( false, $status->isOK(),
-                               "Preparing dir $path failed ($backendName)." );
-               }
-
-               $status = $this->backend->clean( array( 'dir' => dirname( $path ) ) );
-               if ( $isOK ) {
-                       $this->assertGoodStatus( $status,
-                               "Cleaning dir $path succeeded without warnings ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Cleaning dir $path succeeded ($backendName)." );
-               } else {
-                       $this->assertEquals( false, $status->isOK(),
-                               "Cleaning dir $path failed ($backendName)." );
-               }
-       }
-
-       public function testRecursiveClean() {
-               $this->backend = $this->singleBackend;
-               $this->doTestRecursiveClean();
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->doTestRecursiveClean();
-               $this->tearDownFiles();
-       }
-
-       private function doTestRecursiveClean() {
-               $backendName = $this->backendClass();
-
-               $base = $this->baseStorePath();
-               $dirs = array(
-                       "$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 ) );
-                       $this->assertGoodStatus( $status,
-                               "Preparing dir $dir succeeded without warnings ($backendName)." );
-               }
-
-               if ( $this->backend instanceof FSFileBackend ) {
-                       foreach ( $dirs as $dir ) {
-                               $this->assertEquals( true, $this->backend->directoryExists( array( 'dir' => $dir ) ),
-                                       "Dir $dir exists ($backendName)." );
-                       }
-               }
-
-               $status = $this->backend->clean(
-                       array( 'dir' => "$base/unittest-cont1", 'recursive' => 1 ) );
-               $this->assertGoodStatus( $status,
-                       "Recursive cleaning of dir $dir succeeded without warnings ($backendName)." );
-
-               foreach ( $dirs as $dir ) {
-                       $this->assertEquals( false, $this->backend->directoryExists( array( 'dir' => $dir ) ),
-                               "Dir $dir no longer exists ($backendName)." );
-               }
-       }
-
-       // @TODO: testSecure
-
-       public function testDoOperations() {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestDoOperations();
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestDoOperations();
-               $this->tearDownFiles();
-       }
-
-       private function doTestDoOperations() {
-               $base = $this->baseStorePath();
-
-               $fileA = "$base/unittest-cont1/e/a/b/fileA.txt";
-               $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
-               $fileB = "$base/unittest-cont1/e/a/b/fileB.txt";
-               $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
-               $fileC = "$base/unittest-cont1/e/a/b/fileC.txt";
-               $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
-               $fileD = "$base/unittest-cont1/e/a/b/fileD.txt";
-
-               $this->prepare( array( 'dir' => dirname( $fileA ) ) );
-               $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
-               $this->prepare( array( 'dir' => dirname( $fileB ) ) );
-               $this->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
-               $this->prepare( array( 'dir' => dirname( $fileC ) ) );
-               $this->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
-               $this->prepare( array( 'dir' => dirname( $fileD ) ) );
-
-               $status = $this->backend->doOperations( array(
-                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
-                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<empty>
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD, 'overwrite' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<empty>, D:<A>
-                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC ),
-                       // Now: A:<A>, B:<empty>, C:<B>, D:<A>
-                       array( 'op' => 'move', 'src' => $fileD, 'dst' => $fileA, 'overwriteSame' => 1 ),
-                       // Now: A:<A>, B:<empty>, C:<B>, D:<empty>
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileA, 'overwrite' => 1 ),
-                       // Now: A:<B>, B:<empty>, C:<empty>, D:<empty>
-                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC ),
-                       // Now: A:<B>, B:<empty>, C:<B>, D:<empty>
-                       array( 'op' => 'move', 'src' => $fileA, 'dst' => $fileC, 'overwriteSame' => 1 ),
-                       // Now: A:<empty>, B:<empty>, C:<B>, D:<empty>
-                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
-                       // Does nothing
-                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
-                       // Does nothing
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
-                       // Does nothing
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
-                       // Does nothing
-                       array( 'op' => 'null' ),
-                       // Does nothing
-               ) );
-
-               $this->assertGoodStatus( $status, "Operation batch succeeded" );
-               $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
-               $this->assertEquals( 13, count( $status->success ),
-                       "Operation batch has correct success array" );
-
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileA ) ),
-                       "File does not exist at $fileA" );
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
-                       "File does not exist at $fileB" );
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
-                       "File does not exist at $fileD" );
-
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
-                       "File exists at $fileC" );
-               $this->assertEquals( $fileBContents,
-                       $this->backend->getFileContents( array( 'src' => $fileC ) ),
-                       "Correct file contents of $fileC" );
-               $this->assertEquals( strlen( $fileBContents ),
-                       $this->backend->getFileSize( array( 'src' => $fileC ) ),
-                       "Correct file size of $fileC" );
-               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
-                       $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
-                       "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 doTestDoOperationsPipeline() {
-               $base = $this->baseStorePath();
-
-               $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
-               $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
-               $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
-
-               $tmpNameA = TempFSFile::factory( "unittests_", 'txt' )->getPath();
-               file_put_contents( $tmpNameA, $fileAContents );
-               $tmpNameB = TempFSFile::factory( "unittests_", 'txt' )->getPath();
-               file_put_contents( $tmpNameB, $fileBContents );
-               $tmpNameC = TempFSFile::factory( "unittests_", 'txt' )->getPath();
-               file_put_contents( $tmpNameC, $fileCContents );
-
-               $this->filesToPrune[] = $tmpNameA; # avoid file leaking
-               $this->filesToPrune[] = $tmpNameB; # avoid file leaking
-               $this->filesToPrune[] = $tmpNameC; # avoid file leaking
-
-               $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 ) );
-               $this->prepare( array( 'dir' => dirname( $fileB ) ) );
-               $this->prepare( array( 'dir' => dirname( $fileC ) ) );
-               $this->prepare( array( 'dir' => dirname( $fileD ) ) );
-
-               $status = $this->backend->doOperations( array(
-                       array( 'op' => 'store', 'src' => $tmpNameA, 'dst' => $fileA, 'overwriteSame' => 1 ),
-                       array( 'op' => 'store', 'src' => $tmpNameB, 'dst' => $fileB, 'overwrite' => 1 ),
-                       array( 'op' => 'store', 'src' => $tmpNameC, 'dst' => $fileC, 'overwrite' => 1 ),
-                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
-                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<empty>
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD, 'overwrite' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<empty>, D:<A>
-                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC ),
-                       // Now: A:<A>, B:<empty>, C:<B>, D:<A>
-                       array( 'op' => 'move', 'src' => $fileD, 'dst' => $fileA, 'overwriteSame' => 1 ),
-                       // Now: A:<A>, B:<empty>, C:<B>, D:<empty>
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileA, 'overwrite' => 1 ),
-                       // Now: A:<B>, B:<empty>, C:<empty>, D:<empty>
-                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC ),
-                       // Now: A:<B>, B:<empty>, C:<B>, D:<empty>
-                       array( 'op' => 'move', 'src' => $fileA, 'dst' => $fileC, 'overwriteSame' => 1 ),
-                       // Now: A:<empty>, B:<empty>, C:<B>, D:<empty>
-                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
-                       // Does nothing
-                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
-                       // Does nothing
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwrite' => 1 ),
-                       // Does nothing
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileC, 'overwriteSame' => 1 ),
-                       // Does nothing
-                       array( 'op' => 'null' ),
-                       // Does nothing
-               ) );
-
-               $this->assertGoodStatus( $status, "Operation batch succeeded" );
-               $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
-               $this->assertEquals( 16, count( $status->success ),
-                       "Operation batch has correct success array" );
-
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileA ) ),
-                       "File does not exist at $fileA" );
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
-                       "File does not exist at $fileB" );
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
-                       "File does not exist at $fileD" );
-
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
-                       "File exists at $fileC" );
-               $this->assertEquals( $fileBContents,
-                       $this->backend->getFileContents( array( 'src' => $fileC ) ),
-                       "Correct file contents of $fileC" );
-               $this->assertEquals( strlen( $fileBContents ),
-                       $this->backend->getFileSize( array( 'src' => $fileC ) ),
-                       "Correct file size of $fileC" );
-               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
-                       $this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
-                       "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();
-
-               $fileA = "$base/unittest-cont2/a/b/fileA.txt";
-               $fileAContents = '3tqtmoeatmn4wg4qe-mg3qt3 tq';
-               $fileB = "$base/unittest-cont2/a/b/fileB.txt";
-               $fileBContents = 'g-jmq3gpqgt3qtg q3GT ';
-               $fileC = "$base/unittest-cont2/a/b/fileC.txt";
-               $fileCContents = 'eigna[ogmewt 3qt g3qg flew[ag';
-               $fileD = "$base/unittest-cont2/a/b/fileD.txt";
-
-               $this->prepare( array( 'dir' => dirname( $fileA ) ) );
-               $this->create( array( 'dst' => $fileA, 'content' => $fileAContents ) );
-               $this->prepare( array( 'dir' => dirname( $fileB ) ) );
-               $this->create( array( 'dst' => $fileB, 'content' => $fileBContents ) );
-               $this->prepare( array( 'dir' => dirname( $fileC ) ) );
-               $this->create( array( 'dst' => $fileC, 'content' => $fileCContents ) );
-
-               $status = $this->backend->doOperations( array(
-                       array( 'op' => 'copy', 'src' => $fileA, 'dst' => $fileC, 'overwrite' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (file:<orginal contents>)
-                       array( 'op' => 'copy', 'src' => $fileC, 'dst' => $fileA, 'overwriteSame' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<empty>
-                       array( 'op' => 'copy', 'src' => $fileB, 'dst' => $fileD, 'overwrite' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<B>
-                       array( 'op' => 'move', 'src' => $fileC, 'dst' => $fileD ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (failed)
-                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileC, 'overwriteSame' => 1 ),
-                       // Now: A:<A>, B:<B>, C:<A>, D:<empty> (failed)
-                       array( 'op' => 'move', 'src' => $fileB, 'dst' => $fileA, 'overwrite' => 1 ),
-                       // Now: A:<B>, B:<empty>, C:<A>, D:<empty>
-                       array( 'op' => 'delete', 'src' => $fileD ),
-                       // Now: A:<B>, B:<empty>, C:<A>, D:<empty>
-                       array( 'op' => 'null' ),
-                       // Does nothing
-               ), array( 'force' => 1 ) );
-
-               $this->assertNotEquals( array(), $status->errors, "Operation had warnings" );
-               $this->assertEquals( true, $status->isOK(), "Operation batch succeeded" );
-               $this->assertEquals( 8, count( $status->success ),
-                       "Operation batch has correct success array" );
-
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileB ) ),
-                       "File does not exist at $fileB" );
-               $this->assertEquals( false, $this->backend->fileExists( array( 'src' => $fileD ) ),
-                       "File does not exist at $fileD" );
-
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileA ) ),
-                       "File does not exist at $fileA" );
-               $this->assertEquals( true, $this->backend->fileExists( array( 'src' => $fileC ) ),
-                       "File exists at $fileC" );
-               $this->assertEquals( $fileBContents,
-                       $this->backend->getFileContents( array( 'src' => $fileA ) ),
-                       "Correct file contents of $fileA" );
-               $this->assertEquals( strlen( $fileBContents ),
-                       $this->backend->getFileSize( array( 'src' => $fileA ) ),
-                       "Correct file size of $fileA" );
-               $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
-                       $this->backend->getFileSha1Base36( array( 'src' => $fileA ) ),
-                       "Correct file SHA-1 of $fileA" );
-       }
-
-       public function testGetFileList() {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestGetFileList();
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestGetFileList();
-               $this->tearDownFiles();
-       }
-
-       private function doTestGetFileList() {
-               $backendName = $this->backendClass();
-               $base = $this->baseStorePath();
-
-               // Should have no errors
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont-notexists" ) );
-
-               $files = array(
-                       "$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
-               $ops = array();
-               foreach ( $files as $file ) {
-                       $this->prepare( array( 'dir' => dirname( $file ) ) );
-                       $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
-               }
-               $status = $this->backend->doQuickOperations( $ops );
-               $this->assertGoodStatus( $status,
-                       "Creation of files succeeded ($backendName)." );
-               $this->assertEquals( true, $status->isOK(),
-                       "Creation of files succeeded with OK status ($backendName)." );
-
-               // Expected listing
-               $expected = array(
-                       "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 );
-
-               // Actual listing (no trailing slash)
-               $list = array();
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
-
-               // Actual listing (with trailing slash)
-               $list = array();
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
-
-               // Expected listing
-               $expected = array(
-                       "test1.txt",
-                       "test2.txt",
-                       "test3.txt",
-                       "test4.txt",
-                       "test5.txt",
-                       "sub/test0.txt",
-                       "sub/120-px-file.txt",
-               );
-               sort( $expected );
-
-               // Actual listing (no trailing slash)
-               $list = array();
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
-
-               // Actual listing (with trailing slash)
-               $list = array();
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir/" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct file listing ($backendName)." );
-
-               // Actual listing (using iterator second time)
-               $list = array();
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct file listing ($backendName), second iteration." );
-
-               // Expected listing (top files only)
-               $expected = array(
-                       "test1.txt",
-                       "test2.txt",
-                       "test3.txt",
-                       "test4.txt",
-                       "test5.txt"
-               );
-               sort( $expected );
-
-               // Actual listing (top files only)
-               $list = array();
-               $iter = $this->backend->getTopFileList( array( 'dir' => "$base/unittest-cont1/e/subdir2/subdir" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct top file listing ($backendName)." );
-
-               foreach ( $files as $file ) { // clean up
-                       $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
-               }
-
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-               foreach ( $iter as $iter ) {} // no errors
-       }
-
-       public function testGetDirectoryList() {
-               $this->backend = $this->singleBackend;
-               $this->tearDownFiles();
-               $this->doTestGetDirectoryList();
-               $this->tearDownFiles();
-
-               $this->backend = $this->multiBackend;
-               $this->tearDownFiles();
-               $this->doTestGetDirectoryList();
-               $this->tearDownFiles();
-       }
-
-       private function doTestGetDirectoryList() {
-               $backendName = $this->backendClass();
-
-               $base = $this->baseStorePath();
-               $files = array(
-                       "$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
-               $ops = array();
-               foreach ( $files as $file ) {
-                       $this->prepare( array( 'dir' => dirname( $file ) ) );
-                       $ops[] = array( 'op' => 'create', 'content' => 'xxy', 'dst' => $file );
-               }
-               $status = $this->backend->doQuickOperations( $ops );
-               $this->assertGoodStatus( $status,
-                       "Creation of files succeeded ($backendName)." );
-               $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",
-                       "subdir2",
-                       "subdir3",
-                       "subdir4",
-               );
-               sort( $expected );
-
-               // Actual listing (no trailing slash)
-               $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
-               // Actual listing (with trailing slash)
-               $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
-               // Expected listing
-               $expected = array(
-                       "subdir",
-               );
-               sort( $expected );
-
-               // Actual listing (no trailing slash)
-               $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
-               // Actual listing (with trailing slash)
-               $list = array();
-               $iter = $this->backend->getTopDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir2/" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName)." );
-
-               // Actual listing (using iterator second time)
-               $list = array();
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct top dir listing ($backendName), second iteration." );
-
-               // Expected listing (recursive)
-               $expected = array(
-                       "e",
-                       "e/subdir1",
-                       "e/subdir2",
-                       "e/subdir3",
-                       "e/subdir4",
-                       "e/subdir2/subdir",
-                       "e/subdir3/subdir",
-                       "e/subdir4/subdir",
-                       "e/subdir4/subdir/sub",
-               );
-               sort( $expected );
-
-               // Actual listing (recursive)
-               $list = array();
-               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
-
-               // Expected listing (recursive)
-               $expected = array(
-                       "subdir",
-                       "subdir/sub",
-               );
-               sort( $expected );
-
-               // Actual listing (recursive)
-               $list = array();
-               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/e/subdir4" ) );
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
-
-               // Actual listing (recursive, second time)
-               $list = array();
-               foreach ( $iter as $file ) {
-                       $list[] = $file;
-               }
-               sort( $list );
-
-               $this->assertEquals( $expected, $list, "Correct dir listing ($backendName)." );
-
-               foreach ( $files as $file ) { // clean up
-                       $this->backend->doOperation( array( 'op' => 'delete', 'src' => $file ) );
-               }
-
-               $iter = $this->backend->getDirectoryList( array( 'dir' => "$base/unittest-cont1/not/exists" ) );
-               foreach ( $iter as $iter ) {} // no errors
-       }
-
-       public function testLockCalls() {
-               $this->backend = $this->singleBackend;
-               $this->doTestLockCalls();
-       }
-
-       private function doTestLockCalls() {
-               $backendName = $this->backendClass();
-
-               for ( $i=0; $i<50; $i++ ) {
-                       $paths = array(
-                               "test1.txt",
-                               "test2.txt",
-                               "test3.txt",
-                               "subdir1",
-                               "subdir1", // duplicate
-                               "subdir1/test1.txt",
-                               "subdir1/test2.txt",
-                               "subdir2",
-                               "subdir2", // duplicate
-                               "subdir2/test3.txt",
-                               "subdir2/test4.txt",
-                               "subdir2/subdir",
-                               "subdir2/subdir/test1.txt",
-                               "subdir2/subdir/test2.txt",
-                               "subdir2/subdir/test3.txt",
-                               "subdir2/subdir/test4.txt",
-                               "subdir2/subdir/test5.txt",
-                               "subdir2/subdir/sub",
-                               "subdir2/subdir/sub/test0.txt",
-                               "subdir2/subdir/sub/120-px-file.txt",
-                       );
-
-                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
-                       $this->assertEquals( array(), $status->errors,
-                               "Locking of files succeeded ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Locking of files succeeded with OK status ($backendName)." );
-
-                       $status = $this->backend->lockFiles( $paths, LockManager::LOCK_SH );
-                       $this->assertEquals( array(), $status->errors,
-                               "Locking of files succeeded ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Locking of files succeeded with OK status ($backendName)." );
-
-                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_SH );
-                       $this->assertEquals( array(), $status->errors,
-                               "Locking of files succeeded ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Locking of files succeeded with OK status ($backendName)." );
-
-                       $status = $this->backend->unlockFiles( $paths, LockManager::LOCK_EX );
-                       $this->assertEquals( array(), $status->errors,
-                               "Locking of files succeeded ($backendName)." );
-                       $this->assertEquals( true, $status->isOK(),
-                               "Locking of files succeeded with OK status ($backendName)." );
-               }
-       }
-
-       // test helper wrapper for backend prepare() function
-       private function prepare( array $params ) {
-               return $this->backend->prepare( $params );
-       }
-
-       // test helper wrapper for backend prepare() function
-       private function create( array $params ) {
-               $params['op'] = 'create';
-               return $this->backend->doQuickOperations( array( $params ) );
-       }
-
-       function tearDownFiles() {
-               foreach ( $this->filesToPrune as $file ) {
-                       @unlink( $file );
-               }
-               $containers = array( 'unittest-cont1', 'unittest-cont2', 'unittest-cont3' );
-               foreach ( $containers as $container ) {
-                       $this->deleteFiles( $container );
-               }
-               $this->filesToPrune = array();
-       }
-
-       private function deleteFiles( $container ) {
-               $base = $this->baseStorePath();
-               $iter = $this->backend->getFileList( array( 'dir' => "$base/$container" ) );
-               if ( $iter ) {
-                       foreach ( $iter as $file ) {
-                               $this->backend->delete( array( 'src' => "$base/$container/$file" ),
-                                       array( 'force' => 1, 'nonLocking' => 1 ) );
-                       }
-               }
-               $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 );
-       }
-
-       function tearDown() {
-               parent::tearDown();
-       }
-}
index 3ab56af..7d815e9 100644 (file)
@@ -5,7 +5,7 @@
  */
 class StoreBatchTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
                global $wgFileBackends;
                parent::setUp();
 
@@ -43,6 +43,17 @@ class StoreBatchTest extends MediaWikiTestCase {
                $this->createdFiles = array();
        }
 
+       protected function tearDown() {
+               $this->repo->cleanupBatch( $this->createdFiles ); // delete files
+               foreach ( $this->createdFiles as $tmp ) { // delete dirs
+                       $tmp = $this->repo->resolveVirtualUrl( $tmp );
+                       while ( $tmp = FileBackend::parentStoragePath( $tmp ) ) {
+                               $this->repo->getBackend()->clean( array( 'dir' => $tmp ) );
+                       }
+               }
+               parent::tearDown();
+       }
+
        /**
         * Store a file or virtual URL source into a media file name.
         *
@@ -109,15 +120,4 @@ class StoreBatchTest extends MediaWikiTestCase {
                $this->storecohort( "Test1.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", false );
                $this->storecohort( "Test2.png", "$IP/skins/monobook/wiki.png", "$IP/skins/monobook/video.png", true );
        }
-
-       public function tearDown() {
-               $this->repo->cleanupBatch( $this->createdFiles ); // delete files
-               foreach ( $this->createdFiles as $tmp ) { // delete dirs
-                       $tmp = $this->repo->resolveVirtualUrl( $tmp );
-                       while ( $tmp = FileBackend::parentStoragePath( $tmp ) ) {
-                               $this->repo->getBackend()->clean( array( 'dir' => $tmp ) );
-                       }
-               }
-               parent::tearDown();
-       }
 }
index a382775..57017a8 100644 (file)
@@ -6,25 +6,16 @@
  */
 
 class CSSMinTest extends MediaWikiTestCase {
-       protected $oldServer = null, $oldCanServer = null;
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
 
-               // Fake $wgServer and $wgCanonicalServer
-               global $wgServer, $wgCanonicalServer;
-               $this->oldServer = $wgServer;
-               $this->oldCanServer = $wgCanonicalServer;
-               $wgServer = $wgCanonicalServer = 'http://wiki.example.org';
-       }
-
-       function tearDown() {
-               // Restore $wgServer and $wgCanonicalServer
-               global $wgServer, $wgCanonicalServer;
-               $wgServer = $this->oldServer;
-               $wgCanonicalServer = $this->oldCanServer;
+               $server = 'http://doc.example.org';
 
-               parent::tearDown();
+               $this->setMwGlobals( array(
+                       'wgServer' => $server,
+                       'wgCanonicalServer' => $server,
+               ) );
        }
 
        /**
@@ -113,7 +104,7 @@ class CSSMinTest extends MediaWikiTestCase {
                        array(
                                'Expand absolute paths',
                                array( 'foo { prop: url(/w/skin/images/bar.png); }', false, 'http://example.org/quux', false ),
-                               'foo { prop: url(http://wiki.example.org/w/skin/images/bar.png); }',
+                               'foo { prop: url(http://doc.example.org/w/skin/images/bar.png); }',
                        ),
                );
        }
index 70fce11..398ad2d 100644 (file)
@@ -58,7 +58,7 @@ abstract class GenericArrayObjectTest extends MediaWikiTestCase {
                $instances = array();
 
                foreach ( $this->elementInstancesProvider() as $elementInstances ) {
-                       $instances[] = $this->getNew( $elementInstances );
+                       $instances[] = $this->getNew( $elementInstances[0] );
                }
 
                return $this->arrayWrap( $instances );
index 88f87ef..cfd75d8 100644 (file)
@@ -1,7 +1,11 @@
 <?php
 class BitmapMetadataHandlerTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgShowEXIF', false );
+
                $this->filePath = __DIR__ . '/../../data/media/';
        }
 
@@ -14,14 +18,15 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * translation (to en) where XMP should win.
         */
        public function testMultilingualCascade() {
+               global $wgShowEXIF;
+
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
                if ( !wfDl( 'xml' ) ) {
                        $this->markTestSkipped( "This test needs the xml extension." );
                }
-               global $wgShowEXIF;
-               $oldExif = $wgShowEXIF;
+
                $wgShowEXIF = true;
 
                $meta = BitmapMetadataHandler::Jpeg( $this->filePath .
@@ -37,8 +42,6 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                        'Did not extract any ImageDescription info?!' );
 
                $this->assertEquals( $expected, $meta['ImageDescription'] );
-
-               $wgShowEXIF = $oldExif;
        }
 
        /**
@@ -73,6 +76,7 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( '2020:07:14 01:36:05', $meta['DateTimeDigitized'] );
                $this->assertEquals( '1997:03:02 00:01:02', $meta['DateTimeOriginal'] );
        }
+
        /**
         * File has an invalid time (+ one valid but really weird time)
         * that shouldn't be included
@@ -131,12 +135,14 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
                );
                $this->assertEquals( $expected, $result ); 
        }
+
        public function testPNGNative() {
                $handler = new BitmapMetadataHandler();
                $result = $handler->png( $this->filePath . 'Png-native-test.png' );
                $expected = 'http://example.com/url';
                $this->assertEquals( $expected, $result['metadata']['Identifier']['x-default'] ); 
        }
+
        public function testTiffByteOrder() {
                $handler = new BitmapMetadataHandler();
                $res = $handler->getTiffByteOrder( $this->filePath . 'test.tiff' );
index 11d9dc4..eb1a536 100644 (file)
@@ -2,18 +2,15 @@
 
 class BitmapScalingTest extends MediaWikiTestCase {
 
-       function setUp() {
-               global $wgMaxImageArea, $wgCustomConvertCommand;
-               $this->oldMaxImageArea = $wgMaxImageArea;
-               $this->oldCustomConvertCommand = $wgCustomConvertCommand;
-               $wgMaxImageArea = 1.25e7; // 3500x3500 
-               $wgCustomConvertCommand = 'dummy'; // Set so that we don't get client side rendering
-       }
-       function tearDown() {
-               global $wgMaxImageArea, $wgCustomConvertCommand;
-               $wgMaxImageArea = $this->oldMaxImageArea;
-               $wgCustomConvertCommand = $this->oldCustomConvertCommand;
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( array(
+                       'wgMaxImageArea' => 1.25e7, // 3500x3500
+                       'wgCustomConvertCommand' => 'dummy', // Set so that we don't get client side rendering
+               ) );
        }
+
        /**
         * @dataProvider provideNormaliseParams
         */
@@ -103,7 +100,8 @@ class BitmapScalingTest extends MediaWikiTestCase {
                                'Bigger than max image size but doesn\'t need scaling',
                        ),
                );
-       } 
+       }
+
        function testTooBigImage() {
                $file = new FakeDimensionFile( array( 4000, 4000 ) );
                $handler = new BitmapHandler;
@@ -111,6 +109,7 @@ class BitmapScalingTest extends MediaWikiTestCase {
                $this->assertEquals( 'TransformParameterError', 
                        get_class( $handler->doTransform( $file, 'dummy path', '', $params ) ) );
        }
+
        function testTooBigMustRenderImage() {
                $file = new FakeDimensionFile( array( 4000, 4000 ) );
                $file->mustRender = true;
index b2f6b7b..dd22321 100644 (file)
@@ -2,43 +2,44 @@
 
 class ExifBitmapTest extends MediaWikiTestCase {
 
-       public function setUp() {
-               global $wgShowEXIF;
-               $this->showExif = $wgShowEXIF;
-               $wgShowEXIF = true;
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgShowEXIF', true );
+
                $this->handler = new ExifBitmapHandler;
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
        }
 
-       public function tearDown() {
-               global $wgShowEXIF;
-               $wgShowEXIF = $this->showExif;
-       }
-
        public function testIsOldBroken() {
                $res = $this->handler->isMetadataValid( null, ExifBitmapHandler::OLD_BROKEN_FILE );
                $this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
        }
+
        public function testIsBrokenFile() {
                $res = $this->handler->isMetadataValid( null, ExifBitmapHandler::BROKEN_FILE );
                $this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
        }
+
        public function testIsInvalid() {
                $res = $this->handler->isMetadataValid( null, 'Something Invalid Here.' );
                $this->assertEquals( ExifBitmapHandler::METADATA_BAD, $res );
        }
+
        public function testGoodMetadata() {
                $meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:2;}';
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_GOOD, $res );
        }
+
        public function testIsOldGood() {
                $meta = 'a:16:{s:10:"ImageWidth";i:20;s:11:"ImageLength";i:20;s:13:"BitsPerSample";a:3:{i:0;i:8;i:1;i:8;i:2;i:8;}s:11:"Compression";i:5;s:25:"PhotometricInterpretation";i:2;s:16:"ImageDescription";s:17:"Created with GIMP";s:12:"StripOffsets";i:8;s:11:"Orientation";i:1;s:15:"SamplesPerPixel";i:3;s:12:"RowsPerStrip";i:64;s:15:"StripByteCounts";i:238;s:11:"XResolution";s:19:"1207959552/16777216";s:11:"YResolution";s:19:"1207959552/16777216";s:19:"PlanarConfiguration";i:1;s:14:"ResolutionUnit";i:2;s:22:"MEDIAWIKI_EXIF_VERSION";i:1;}';
                $res = $this->handler->isMetadataValid( null, $meta );
                $this->assertEquals( ExifBitmapHandler::METADATA_COMPATIBLE, $res );
        }
+
        // Handle metadata from paged tiff handler (gotten via instant commons)
        // gracefully.
        public function testPagedTiffHandledGracefully() {
@@ -55,6 +56,7 @@ class ExifBitmapTest extends MediaWikiTestCase {
                $res = $this->handler->convertMetadataVersion( $metadata, 2 );
                $this->assertEquals( $metadata, $res );
        }
+
        function testConvertMetadataToOld() {
                $metadata = array(
                        'foo' => array( 'First', 'Second', '_type' => 'ol' ),
@@ -73,6 +75,7 @@ class ExifBitmapTest extends MediaWikiTestCase {
                $res = $this->handler->convertMetadataVersion( $metadata, 1 );
                $this->assertEquals( $expected, $res );
        }
+
        function testConvertMetadataSoftware() {
                $metadata = array(
                        'Software' => array( array('GIMP', '1.1' ) ),
@@ -85,6 +88,7 @@ class ExifBitmapTest extends MediaWikiTestCase {
                $res = $this->handler->convertMetadataVersion( $metadata, 1 );
                $this->assertEquals( $expected, $res );
        }
+
        function testConvertMetadataSoftwareNormal() {
                $metadata = array(
                        'Software' => array( "GIMP 1.2", "vim" ),
index 6af52dd..d52fecc 100644 (file)
@@ -1,11 +1,12 @@
 <?php
-
 /**
- * Tests related to auto rotation
+ * Tests related to auto rotation.
+ *
+ * @group medium
  */
 class ExifRotationTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->handler = new BitmapHandler();
                $filePath = __DIR__ . '/../../data/media';
@@ -33,7 +34,7 @@ class ExifRotationTest extends MediaWikiTestCase {
                $wgEnableAutoRotation = true;
        }
 
-       public function tearDown() {
+       protected function tearDown() {
                global $wgShowEXIF, $wgEnableAutoRotation;
                $wgShowEXIF = $this->show;
                $wgEnableAutoRotation = $this->oldAuto;
@@ -43,7 +44,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        /**
         *
-        * @dataProvider providerFiles
+        * @dataProvider provideFiles
         */
        function testMetadata( $name, $type, $info ) {
                if ( !BitmapHandler::canRotate() ) {
@@ -56,7 +57,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        /**
         *
-        * @dataProvider providerFiles
+        * @dataProvider provideFiles
         */
        function testRotationRendering( $name, $type, $info, $thumbs ) {
                if ( !BitmapHandler::canRotate() ) {
@@ -94,12 +95,13 @@ class ExifRotationTest extends MediaWikiTestCase {
                }
        }
 
+       /* Utility function */
        private function dataFile( $name, $type ) {
                return new UnregisteredLocalFile( false, $this->repo,
                        "mwstore://localtesting/data/$name", $type );
        }
 
-       function providerFiles() {
+       public static function provideFiles() {
                return array(
                        array(
                                'landscape-plain.jpg',
@@ -134,7 +136,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        /**
         * Same as before, but with auto-rotation disabled.
-        * @dataProvider providerFilesNoAutoRotate
+        * @dataProvider provideFilesNoAutoRotate
         */
        function testMetadataNoAutoRotate( $name, $type, $info ) {
                global $wgEnableAutoRotation;
@@ -149,7 +151,7 @@ class ExifRotationTest extends MediaWikiTestCase {
 
        /**
         *
-        * @dataProvider providerFilesNoAutoRotate
+        * @dataProvider provideFilesNoAutoRotate
         */
        function testRotationRenderingNoAutoRotate( $name, $type, $info, $thumbs ) {
                global $wgEnableAutoRotation;
@@ -188,7 +190,7 @@ class ExifRotationTest extends MediaWikiTestCase {
                $wgEnableAutoRotation = true;
        }
 
-       function providerFilesNoAutoRotate() {
+       public static function provideFilesNoAutoRotate() {
                return array(
                        array(
                                'landscape-plain.jpg',
index 045777d..7cc56f6 100644 (file)
@@ -1,20 +1,16 @@
 <?php
 class ExifTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                $this->mediaPath = __DIR__ . '/../../data/media/';
 
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
-               global $wgShowEXIF;
-               $this->showExif = $wgShowEXIF;
-               $wgShowEXIF = true;
-       }
 
-       public function tearDown() {
-               global $wgShowEXIF;
-               $wgShowEXIF = $this->showExif;
+               $this->setMwGlobals( 'wgShowEXIF', true );
        }
 
        public function testGPSExtraction() {
index 6ade670..4dadde5 100644 (file)
@@ -1,6 +1,9 @@
 <?php
 class FormatMetadataTest extends MediaWikiTestCase {
-       public function setUp() {
+
+       protected function setUp() {
+               parent::setUp();
+
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
@@ -15,13 +18,8 @@ class FormatMetadataTest extends MediaWikiTestCase {
                        'url'     => 'http://localhost/thumbtest',
                        'backend' => $this->backend
                ) );
-               global $wgShowEXIF;
-               $this->show = $wgShowEXIF;
-               $wgShowEXIF = true;
-       }
-       public function tearDown() {
-               global $wgShowEXIF;
-               $wgShowEXIF = $this->show;
+
+               $this->setMwGlobals( 'wgShowEXIF', true );
        }
 
        public function testInvalidDate() {
index 650fdd5..3a750aa 100644 (file)
@@ -1,20 +1,22 @@
 <?php
 class GIFMetadataExtractorTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                $this->mediaPath = __DIR__ . '/../../data/media/';
        }
        /**
         * Put in a file, and see if the metadata coming out is as expected.
         * @param $filename String
         * @param $expected Array The extracted metadata.
-        * @dataProvider dataGetMetadata
+        * @dataProvider provideGetMetadata
         */
        public function testGetMetadata( $filename, $expected ) {
                $actual = GIFMetadataExtractor::getMetadata( $this->mediaPath . $filename );
                $this->assertEquals( $expected, $actual );
        }
-       public function dataGetMetadata() {
+       public static function provideGetMetadata() {
 
                $xmpNugget = <<<EOF
 <?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
index 5dcbeee..9ffc764 100644 (file)
@@ -1,7 +1,9 @@
 <?php
 class GIFHandlerTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                $this->filePath = __DIR__ .  '/../../data/media';
                $this->backend = new FSFileBackend( array(
                        'name'           => 'localtesting',
@@ -20,17 +22,18 @@ class GIFHandlerTest extends MediaWikiTestCase {
                $res = $this->handler->getMetadata( null, $this->filePath . '/README' );
                $this->assertEquals( GIFHandler::BROKEN_FILE, $res );
        }
+
        /**
         * @param $filename String basename of the file to check
         * @param $expected boolean Expected result.
-        * @dataProvider dataIsAnimated
+        * @dataProvider provideIsAnimated
         */
        public function testIsAnimanted( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/gif' );
                $actual = $this->handler->isAnimatedImage( $file );
                $this->assertEquals( $expected, $actual );
        }
-       public function dataIsAnimated() {
+       public static function provideIsAnimated() {
                return array(
                        array( 'animated.gif', true ),
                        array( 'nonanimated.gif', false ),
@@ -40,14 +43,14 @@ class GIFHandlerTest extends MediaWikiTestCase {
        /**
         * @param $filename String
         * @param $expected Integer Total image area
-        * @dataProvider dataGetImageArea
+        * @dataProvider provideGetImageArea
         */
        public function testGetImageArea( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/gif' );
                $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
                $this->assertEquals( $expected, $actual );
        }
-       public function dataGetImageArea() {
+       public static function provideGetImageArea() {
                return array(
                        array( 'animated.gif', 5400 ),
                        array( 'nonanimated.gif', 1350 ),
@@ -57,13 +60,13 @@ class GIFHandlerTest extends MediaWikiTestCase {
        /**
         * @param $metadata String Serialized metadata
         * @param $expected Integer One of the class constants of GIFHandler
-        * @dataProvider dataIsMetadataValid
+        * @dataProvider provideIsMetadataValid
         */
        public function testIsMetadataValid( $metadata, $expected ) {
                $actual = $this->handler->isMetadataValid( null, $metadata );
                $this->assertEquals( $expected, $actual );
        }
-       public function dataIsMetadataValid() {
+       public static function provideIsMetadataValid() {
                return array(
                        array( GIFHandler::BROKEN_FILE, GIFHandler::METADATA_GOOD ),
                        array( '', GIFHandler::METADATA_BAD ),
@@ -76,7 +79,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
        /**
         * @param $filename String
         * @param $expected String Serialized array
-        * @dataProvider dataGetMetadata
+        * @dataProvider provideGetMetadata
         */
        public function testGetMetadata( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/gif' );
@@ -84,7 +87,7 @@ class GIFHandlerTest extends MediaWikiTestCase {
                $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
        }
 
-       public function dataGetMetadata() {
+       public static function provideGetMetadata() {
                return array(
                        array( 'nonanimated.gif', 'a:4:{s:10:"frameCount";i:1;s:6:"looped";b:0;s:8:"duration";d:0.1000000000000000055511151231257827021181583404541015625;s:8:"metadata";a:2:{s:14:"GIFFileComment";a:1:{i:0;s:35:"GIF test file ⁕ Created with GIMP";}s:15:"_MW_GIF_VERSION";i:1;}}' ),
                        array( 'animated-xmp.gif', 'a:4:{s:10:"frameCount";i:4;s:6:"looped";b:1;s:8:"duration";d:2.399999999999999911182158029987476766109466552734375;s:8:"metadata";a:5:{s:6:"Artist";s:7:"Bawolff";s:16:"ImageDescription";a:2:{s:9:"x-default";s:18:"A file to test GIF";s:5:"_type";s:4:"lang";}s:15:"SublocationDest";s:13:"The interwebs";s:14:"GIFFileComment";a:1:{i:0;s:16:"GIƒ·test·file";}s:15:"_MW_GIF_VERSION";i:1;}}' ),
index 41d8119..6e1c0af 100644 (file)
@@ -8,7 +8,9 @@
  */
 class JpegMetadataExtractorTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                $this->filePath = __DIR__ . '/../../data/media/';
        }
 
@@ -18,13 +20,13 @@ class JpegMetadataExtractorTest extends MediaWikiTestCase {
         *
         * @param $file filename
         *
-        * @dataProvider dataUtf8Comment
+        * @dataProvider provideUtf8Comment
         */
        public function testUtf8Comment( $file ) {
                $res = JpegMetadataExtractor::segmentSplitter( $this->filePath . $file );
                $this->assertEquals( array( 'UTF-8 JPEG Comment — ¼' ), $res['COM'] );
        }
-       public function dataUtf8Comment() {
+       public static function provideUtf8Comment() {
                return array(
                        array( 'jpeg-comment-utf.jpg' ),
                        array( 'jpeg-padding-even.jpg' ),
index ea007f9..05d3661 100644 (file)
@@ -1,18 +1,15 @@
 <?php
 class JpegTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                $this->filePath = __DIR__ . '/../../data/media/';
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestSkipped( "This test needs the exif extension." );
                }
-               global $wgShowEXIF;
-               $this->show = $wgShowEXIF;
-               $wgShowEXIF = true;
-       }
-       public function tearDown() {
-               global $wgShowEXIF;
-               $wgShowEXIF = $this->show;
+
+               $this->setMwGlobals( 'wgShowEXIF', true );
        }
 
        public function testInvalidFile() {
@@ -20,6 +17,7 @@ class JpegTest extends MediaWikiTestCase {
                $res = $jpeg->getMetadata( null, $this->filePath . 'README' );
                $this->assertEquals( ExifBitmapHandler::BROKEN_FILE, $res );
        }
+
        public function testJpegMetadataExtraction() {
                $h = new JpegHandler;
                $res = $h->getMetadata( null, $this->filePath . 'test.jpg' );
index 1b1b2ec..e027668 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 class PNGMetadataExtractorTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
                $this->filePath = __DIR__ . '/../../data/media/';
        }
        /**
@@ -60,6 +61,8 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
        /**
         * Test extraction of pHYs tags, which can tell what the
         * actual resolution of the image is (aka in dots per meter).
+        */
+/*
        function testPngPhysTag () {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
@@ -71,6 +74,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                $this->assertEquals( '2835/100', $meta['YResolution'] );
                $this->assertEquals( 3, $meta['ResolutionUnit'] ); // 3 = cm
        }
+*/
 
        /**
         * Given a normal static PNG, check the animation metadata returned.
index fe73c9c..2075758 100644 (file)
@@ -1,7 +1,9 @@
 <?php
 class PNGHandlerTest extends MediaWikiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
+               parent::setUp();
+
                $this->filePath = __DIR__ .  '/../../data/media';
                $this->backend = new FSFileBackend( array(
                        'name'           => 'localtesting',
@@ -23,14 +25,14 @@ class PNGHandlerTest extends MediaWikiTestCase {
        /**
         * @param $filename String basename of the file to check
         * @param $expected boolean Expected result.
-        * @dataProvider dataIsAnimated
+        * @dataProvider provideIsAnimated
         */
        public function testIsAnimanted( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/png' );
                $actual = $this->handler->isAnimatedImage( $file );
                $this->assertEquals( $expected, $actual );
        }
-       public function dataIsAnimated() {
+       public static function provideIsAnimated() {
                return array(
                        array( 'Animated_PNG_example_bouncing_beach_ball.png', true ),
                        array( '1bit-png.png', false ),
@@ -40,14 +42,14 @@ class PNGHandlerTest extends MediaWikiTestCase {
        /**
         * @param $filename String
         * @param $expected Integer Total image area
-        * @dataProvider dataGetImageArea
+        * @dataProvider provideGetImageArea
         */
        public function testGetImageArea( $filename, $expected ) {
                $file = $this->dataFile($filename, 'image/png' );
                $actual = $this->handler->getImageArea( $file, $file->getWidth(), $file->getHeight() );
                $this->assertEquals( $expected, $actual );
        }
-       public function dataGetImageArea() {
+       public static function provideGetImageArea() {
                return array(
                        array( '1bit-png.png', 2500 ),
                        array( 'greyscale-png.png', 2500 ),
@@ -59,13 +61,13 @@ class PNGHandlerTest extends MediaWikiTestCase {
        /**
         * @param $metadata String Serialized metadata
         * @param $expected Integer One of the class constants of PNGHandler
-        * @dataProvider dataIsMetadataValid
+        * @dataProvider provideIsMetadataValid
         */
        public function testIsMetadataValid( $metadata, $expected ) {
                $actual = $this->handler->isMetadataValid( null, $metadata );
                $this->assertEquals( $expected, $actual );
        }
-       public function dataIsMetadataValid() {
+       public static function provideIsMetadataValid() {
                return array(
                        array( PNGHandler::BROKEN_FILE, PNGHandler::METADATA_GOOD ),
                        array( '', PNGHandler::METADATA_BAD ),
@@ -78,7 +80,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
        /**
         * @param $filename String
         * @param $expected String Serialized array
-        * @dataProvider dataGetMetadata
+        * @dataProvider provideGetMetadata
         */
        public function testGetMetadata( $filename, $expected ) {
                $file = $this->dataFile( $filename, 'image/png' );
@@ -86,7 +88,7 @@ class PNGHandlerTest extends MediaWikiTestCase {
 //             $this->assertEquals( unserialize( $expected ), unserialize( $actual ) );
                $this->assertEquals( ( $expected ), ( $actual ) );
        }
-       public function dataGetMetadata() {
+       public static function provideGetMetadata() {
                return array(
                        array( 'rgb-na-png.png', 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:8;s:9:"colorType";s:10:"truecolour";s:8:"metadata";a:1:{s:15:"_MW_PNG_VERSION";i:1;}}' ),
                        array( 'xmp.png', 'a:6:{s:10:"frameCount";i:0;s:9:"loopCount";i:1;s:8:"duration";d:0;s:8:"bitDepth";i:1;s:9:"colorType";s:14:"index-coloured";s:8:"metadata";a:2:{s:12:"SerialNumber";s:9:"123456789";s:15:"_MW_PNG_VERSION";i:1;}}' ), 
index 2116554..d9a59ca 100644 (file)
@@ -2,19 +2,20 @@
 
 class SVGMetadataExtractorTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
                AutoLoader::loadClass( 'SVGMetadataExtractorTest' );
        }
 
        /**
-        * @dataProvider providerSvgFiles
+        * @dataProvider provideSvgFiles
         */
        function testGetMetadata( $infile, $expected ) {
                $this->assertMetadata( $infile, $expected );
        }
        
        /**
-        * @dataProvider providerSvgFilesWithXMLMetadata
+        * @dataProvider provideSvgFilesWithXMLMetadata
         */
        function testGetXMLMetadata( $infile, $expected ) {
                $r = new XMLReader();
@@ -38,7 +39,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                }
        }
 
-       function providerSvgFiles() {
+       public static function provideSvgFiles() {
                $base = __DIR__ . '/../../data/media';
                return array(
                        array(
@@ -81,7 +82,7 @@ class SVGMetadataExtractorTest extends MediaWikiTestCase {
                );
        }
 
-       function providerSvgFilesWithXMLMetadata() {
+       public static function provideSvgFilesWithXMLMetadata() {
                $base = __DIR__ . '/../../data/media';
                $metadata = 
     '<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
index 4c79f66..91c35c4 100644 (file)
@@ -1,19 +1,15 @@
 <?php
 class TiffTest extends MediaWikiTestCase {
 
-       public function setUp() {
-               global $wgShowEXIF;
-               $this->showExif = $wgShowEXIF;
-               $wgShowEXIF = true;
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgShowEXIF', true );
+
                $this->filePath = __DIR__ . '/../../data/media/';
                $this->handler = new TiffHandler;
        }
 
-       public function tearDown() {
-               global $wgShowEXIF;
-               $wgShowEXIF = $this->showExif;
-       }
-
        public function testInvalidFile() {
                if ( !wfDl( 'exif' ) ) {
                        $this->markTestIncomplete( "This test needs the exif extension." );
index 8198d3b..452016f 100644 (file)
@@ -1,7 +1,8 @@
 <?php
 class XMPTest extends MediaWikiTestCase {
 
-       function setUp() {
+       protected function setUp() {
+               parent::setUp();
                if ( !wfDl( 'xml' ) ) {
                        $this->markTestSkipped( 'Requires libxml to do XMP parsing' );
                }
@@ -14,7 +15,7 @@ class XMPTest extends MediaWikiTestCase {
         * @param $expected Array expected result of parsing the xmp.
         * @param $info String Short sentence on what's being tested.
         *
-        * @dataProvider dataXMPParse
+        * @dataProvider provideXMPParse
         */
        public function testXMPParse( $xmp, $expected, $info ) {
                if ( !is_string( $xmp ) || !is_array( $expected ) ) {
@@ -25,7 +26,7 @@ class XMPTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $reader->getResults(), $info, 0.0000000001 );
        }
 
-       public function dataXMPParse() {
+       public static function provideXMPParse() {
                $xmpPath = __DIR__ . '/../../data/xmp/' ;
                $data = array();
 
index e2bb8d8..a2b4e1c 100644 (file)
@@ -2,7 +2,7 @@
 class XMPValidateTest extends MediaWikiTestCase {
 
        /**
-        * @dataProvider providerDate
+        * @dataProvider provideDates
         */
        function testValidateDate( $value, $expected ) {
                // The method should modify $value.
@@ -10,7 +10,7 @@ class XMPValidateTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $value );
        }
 
-       function providerDate() {
+       public static function provideDates() {
                /* For reference valid date formats are:
                 * YYYY
                 * YYYY-MM
diff --git a/tests/phpunit/includes/mobile/DeviceDetectionTest.php b/tests/phpunit/includes/mobile/DeviceDetectionTest.php
deleted file mode 100644 (file)
index 0e15653..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/**
- * @group Mobile
- */
- class DeviceDetectionTest extends MediaWikiTestCase {
-
-       /**
-        * @dataProvider provideTestFormatName
-        */
-       public function testFormatName( $format, $userAgent ) {
-               $detector = new DeviceDetection();
-               $this->assertEquals( $format, $detector->detectFormatName( $userAgent ) );
-       }
-
-       public function provideTestFormatName() {
-               return array(
-                       array( 'android',   'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17' ),
-                       array( 'iphone2',   'Mozilla/5.0 (ipod: U;CPU iPhone OS 2_2 like Mac OS X: es_es) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3' ),
-                       array( 'iphone',    'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3B48b Safari/419.3' ),
-                       array( 'nokia',     'Mozilla/5.0 (SymbianOS/9.1; U; [en]; SymbianOS/91 Series60/3.0) AppleWebKit/413 (KHTML, like Gecko) Safari/413' ),
-                       array( 'palm_pre',  'Mozilla/5.0 (webOS/1.0; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0' ),
-                       array( 'wii',       'Opera/9.00 (Nintendo Wii; U; ; 1309-9; en)' ),
-                       array( 'operamini', 'Opera/9.50 (J2ME/MIDP; Opera Mini/4.0.10031/298; U; en)' ),
-                       array( 'operamobile',    'Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/1718; U; en)' ),
-                       array( 'kindle',    'Mozilla/4.0 (compatible; Linux 2.6.10) NetFront/3.3 Kindle/1.0 (screen 600x800)' ),
-                       array( 'kindle2',   'Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 824x1200; rotate)' ),
-                       array( 'capable',   'Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1' ),
-                       array( 'netfront',  'Mozilla/4.08 (Windows; Mobile Content Viewer/1.0) NetFront/3.2' ),
-                       array( 'wap2',      'SonyEricssonK608i/R2L/SN356841000828910 Browser/SEMC-Browser/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
-                       array( 'wap2',      'NokiaN73-2/3.0-630.0.2 Series60/3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
-                       array( 'psp',       'Mozilla/4.0 (PSP (PlayStation Portable); 2.00)' ),
-                       array( 'ps3',       'Mozilla/5.0 (PLAYSTATION 3; 1.00)' ),
-                       array( 'ie', 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)' ),
-                       array( 'ie', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)' ),
-                       array( 'blackberry', 'BlackBerry9300/5.0.0.716 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/133' ),
-                       array( 'blackberry-lt5', 'BlackBerry7250/4.0.0 Profile/MIDP-2.0 Configuration/CLDC-1.1' ),
-               );
-       }
-}
index 3164531..5f670fc 100644 (file)
@@ -29,12 +29,17 @@ class MagicVariableTest extends MediaWikiTestCase {
        );
 
        /** setup a basic parser object */
-       function setUp() {
-               global $wgContLang;
-               $wgContLang = Language::factory( 'en' );
+       protected function setUp() {
+               parent::setUp();
+
+               $contLang = Language::factory( 'en' );
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => $contLang,
+               ) );
 
                $this->testParser = new Parser();
-               $this->testParser->Options( new ParserOptions() );
+               $this->testParser->Options( ParserOptions::newFromUserAndLang( new User, $contLang ) );
 
                # initialize parser output
                $this->testParser->clearState();
@@ -47,8 +52,10 @@ class MagicVariableTest extends MediaWikiTestCase {
        }
 
        /** destroy parser (TODO: is it really neded?)*/
-       function tearDown() {
+       protected function tearDown() {
                unset( $this->testParser );
+
+               parent::tearDown();
        }
 
        ############### TESTS #############################################
@@ -74,7 +81,7 @@ class MagicVariableTest extends MediaWikiTestCase {
        function testLocaldaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'localday2', $day );
        }
-       
+
        # month
 
        /** @dataProvider MediaWikiProvide::Months */
@@ -105,7 +112,7 @@ class MagicVariableTest extends MediaWikiTestCase {
        function testRevisiondaytwoIsZeroPadded( $day ) {
                $this->assertZeroPadded( 'revisionday2', $day );
        }
-       
+
        # revision month
 
        /** @dataProvider MediaWikiProvide::Months */
@@ -149,26 +156,26 @@ class MagicVariableTest extends MediaWikiTestCase {
 
        /**
         * Main assertion helper for magic variables padding
-        * @param $magic string Magic variable name 
+        * @param $magic string Magic variable name
         * @param $value mixed Month or day
-        * @param $format string sprintf format for $value 
+        * @param $format string sprintf format for $value
         */
        private function assertMagicPadding( $magic, $value, $format ) {
                # Initialize parser timestamp as year 2010 at 12h34 56s.
                # month and day are given by the caller ($value). Month < 12!
                if( $value > 12 ) { $month = $value % 12; }
                else { $month = $value; }
-       
+
                $this->setParserTS(
                        sprintf( '2010%02d%02d123456', $month, $value )
                );
 
-               # please keep the following commented line of code. It helps debugging. 
+               # please keep the following commented line of code. It helps debugging.
                //print "\nDEBUG (value $value):" . sprintf( '2010%02d%02d123456', $value, $value ) . "\n";
 
                # format expectation and test it
                $expected = sprintf( $format, $value );
-               $this->assertMagic( $expected, $magic ); 
+               $this->assertMagic( $expected, $magic );
        }
 
        /** helper to set the parser timestamp and revision timestamp */
index ff6e472..3e3b141 100644 (file)
@@ -9,7 +9,7 @@
  */
 class NewParserTest extends MediaWikiTestCase {
        static protected $articles = array();   // Array of test articles defined by the tests
-       /* The dataProvider is run on a different instance than the test, so it must be static
+       /* The data provider is run on a different instance than the test, so it must be static
         * When running tests from several files, all tests will see all articles.
         */
        static protected $backendToUse;
@@ -31,9 +31,14 @@ class NewParserTest extends MediaWikiTestCase {
 
        protected $file = false;
 
-       function setUp() {
-               global $wgContLang, $wgNamespaceProtection, $wgNamespaceAliases;
+       protected function setUp() {
+               global $wgContLang, $wgLanguageCode;
+               global $wgNamespaceProtection, $wgNamespaceAliases;
                global $wgHooks, $IP;
+
+               parent::setUp();
+
+               $wgLanguageCode = 'en';
                $wgContLang = Language::factory( 'en' );
 
                //Setup CLI arguments
@@ -100,7 +105,7 @@ class NewParserTest extends MediaWikiTestCase {
                $wgNamespaceAliases['Image_talk'] = NS_FILE_TALK;
        }
 
-       public function tearDown() {
+       protected function tearDown() {
                foreach ( $this->savedInitialGlobals as $var => $val ) {
                        $GLOBALS[$var] = $val;
                }
@@ -114,6 +119,8 @@ class NewParserTest extends MediaWikiTestCase {
                // Restore backends
                RepoGroup::destroySingleton();
                FileBackendGroup::destroySingleton();
+
+               parent::tearDown();
        }
 
        function addDBData() {
@@ -303,7 +310,7 @@ class NewParserTest extends MediaWikiTestCase {
                        'wgNoFollowLinks' => true,
                        'wgNoFollowDomainExceptions' => array(),
                        'wgThumbnailScriptPath' => false,
-                       'wgUseImageResize' => false,
+                       'wgUseImageResize' => true,
                        'wgUseTeX' => isset( $opts['math'] ),
                        'wgMathDirectory' => $uploadDir . '/math',
                        'wgLocaltimezone' => 'UTC',
@@ -326,7 +333,6 @@ class NewParserTest extends MediaWikiTestCase {
                        'wgExternalLinkTarget' => false,
                        'wgAlwaysUseTidy' => false,
                        'wgHtml5' => true,
-                       'wgCleanupPresentationalAttributes' => true,
                        'wgWellFormedXml' => true,
                        'wgAllowMicrodataAttributes' => true,
                        'wgAdaptiveMessageCache' => true,
@@ -466,6 +472,16 @@ class NewParserTest extends MediaWikiTestCase {
                                "$base/local-thumb/3/3a/Foobar.jpg/200px-Foobar.jpg",
                                "$base/local-thumb/3/3a/Foobar.jpg/640px-Foobar.jpg",
                                "$base/local-thumb/3/3a/Foobar.jpg/120px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/1280px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/20px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/270px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/300px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/30px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/360px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/400px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/40px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/70px-Foobar.jpg",
+                               "$base/local-thumb/3/3a/Foobar.jpg/960px-Foobar.jpg",
 
                                "$base/local-public/0/09/Bad.jpg",
                                "$base/local-thumb/0/09/Bad.jpg",
@@ -524,6 +540,14 @@ class NewParserTest extends MediaWikiTestCase {
                        return;
                }
 
+               if ( !$this->isWikitextNS( NS_MAIN ) ) {
+                       // parser tests frequently assume that the main namespace contains wikitext.
+                       // @todo: When setting up pages, force the content model. Only skip if
+                       //        $wgtContentModelUseDB is false.
+                       $this->markTestSkipped( "Main namespace does not support wikitext,"
+                                       . "skipping parser test: $desc" );
+               }
+
                wfDebug( "Running parser test: $desc\n" );
 
                $opts = $this->parseOptions( $opts );
index dea406c..e0f95b6 100644 (file)
@@ -2,7 +2,7 @@
 
 class ParserMethodsTest extends MediaWikiLangTestCase {
 
-       public function dataPreSaveTransform() {
+       public static function providePreSaveTransform() {
                return array(
                        array( 'hello this is ~~~',
                               "hello this is [[Special:Contributions/127.0.0.1|127.0.0.1]]",
@@ -14,7 +14,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
        }
 
        /**
-        * @dataProvider dataPreSaveTransform
+        * @dataProvider providePreSaveTransform
         */
        public function testPreSaveTransform( $text, $expected ) {
                global $wgParser;
diff --git a/tests/phpunit/includes/parser/ParserOutputTest.php b/tests/phpunit/includes/parser/ParserOutputTest.php
new file mode 100644 (file)
index 0000000..2244fdb
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+class ParserOutputTest extends MediaWikiTestCase {
+
+       function dataIsLinkInternal() {
+               return array(
+                       // Different domains
+                       array( false, 'http://example.org', 'http://mediawiki.org' ),
+                       // Same domains
+                       array( true, 'http://example.org', 'http://example.org' ),
+                       array( true, 'https://example.org', 'https://example.org' ),
+                       array( true, '//example.org', '//example.org' ),
+                       // Same domain different cases
+                       array( true, 'http://example.org', 'http://EXAMPLE.ORG' ),
+                       // Paths, queries, and fragments are not relevant
+                       array( true, 'http://example.org', 'http://example.org/wiki/Main_Page' ),
+                       array( true, 'http://example.org', 'http://example.org?my=query' ),
+                       array( true, 'http://example.org', 'http://example.org#its-a-fragment' ),
+                       // Different protocols
+                       array( false, 'http://example.org', 'https://example.org' ),
+                       array( false, 'https://example.org', 'http://example.org' ),
+                       // Protocol relative servers always match http and https links
+                       array( true, '//example.org', 'http://example.org' ),
+                       array( true, '//example.org', 'https://example.org' ),
+                       // But they don't match strange things like this
+                       array( false, '//example.org', 'irc://example.org' ),
+               );
+       }
+
+       /**
+        * Test to make sure ParserOutput::isLinkInternal behaves properly
+        * @dataProvider dataIsLinkInternal
+        */
+       function testIsLinkInternal( $shouldMatch, $server, $url ) {
+
+               $this->assertEquals( $shouldMatch, ParserOutput::isLinkInternal( $server, $url ) );
+       }
+}
index 0e8ef53..8c22c59 100644 (file)
@@ -8,8 +8,11 @@ class ParserPreloadTest extends MediaWikiTestCase {
        private $testParserOptions;
        private $title;
 
-       function setUp() {
-               $this->testParserOptions = new ParserOptions();
+       protected function setUp() {
+               global $wgContLang;
+
+               parent::setUp();
+               $this->testParserOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang );
 
                $this->testParser = new Parser();
                $this->testParser->Options( $this->testParserOptions );
@@ -18,7 +21,9 @@ class ParserPreloadTest extends MediaWikiTestCase {
                $this->title = Title::newFromText( 'Preload Test' );
        }
 
-       function tearDown() {
+       protected function tearDown() {
+               parent::tearDown();
+
                unset( $this->testParser );
                unset( $this->title );
        }
index fee5674..362d9f7 100644 (file)
@@ -5,9 +5,10 @@ class PreprocessorTest extends MediaWikiTestCase {
        var $mPPNodeCount = 0;
        var $mOptions;
 
-       function setUp() {
-               global $wgParserConf;
-               $this->mOptions = new ParserOptions();
+       protected function setUp() {
+               global $wgParserConf, $wgContLang;
+               parent::setUp();
+               $this->mOptions = ParserOptions::newFromUserAndLang( new User, $wgContLang );
                $name = isset( $wgParserConf['preprocessorClass'] ) ? $wgParserConf['preprocessorClass'] : 'Preprocessor_DOM';
 
                $this->mPreprocessor = new $name( $this );
index 713ce84..292f13a 100644 (file)
@@ -12,16 +12,22 @@ class TagHookTest extends MediaWikiTestCase {
        public static function provideBadNames() {
                return array( array( "foo<bar" ), array( "foo>bar" ), array( "foo\nbar" ),  array( "foo\rbar" ) );
        }
-               
+
+       protected function setUp() {
+               parent::setUp();
+
+               $this->setMwGlobals( 'wgAlwaysUseTidy', false );
+       }
+
        /**
         * @dataProvider provideValidNames
         */
        function testTagHooks( $tag ) {
-               global $wgParserConf;
+               global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
                
                $parser->setHook( $tag, array( $this, 'tagCallback' ) );
-               $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
+               $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
                $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
                
                $parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
@@ -32,11 +38,11 @@ class TagHookTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        function testBadTagHooks( $tag ) {
-               global $wgParserConf;
+               global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
                
                $parser->setHook( $tag, array( $this, 'tagCallback' ) );
-               $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
+               $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
                $this->fail('Exception not thrown.');
        }
        
@@ -44,11 +50,11 @@ class TagHookTest extends MediaWikiTestCase {
         * @dataProvider provideValidNames
         */
        function testFunctionTagHooks( $tag ) {
-               global $wgParserConf;
+               global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
                
                $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), 0 );
-               $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
+               $parserOutput = $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
                $this->assertEquals( "<p>FooOneBaz\n</p>", $parserOutput->getText() );
                
                $parser->mPreprocessor = null; # Break the Parser <-> Preprocessor cycle
@@ -59,11 +65,11 @@ class TagHookTest extends MediaWikiTestCase {
         * @expectedException MWException
         */
        function testBadFunctionTagHooks( $tag ) {
-               global $wgParserConf;
+               global $wgParserConf, $wgContLang;
                $parser = new Parser( $wgParserConf );
                
                $parser->setFunctionTagHook( $tag, array( $this, 'functionTagCallback' ), SFH_OBJECT_ARGS );
-               $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), new ParserOptions );
+               $parser->parse( "Foo<$tag>Bar</$tag>Baz", Title::newFromText( 'Test' ), ParserOptions::newFromUserAndLang( new User, $wgContLang ) );
                $this->fail('Exception not thrown.');
        }
        
index 957907c..511166a 100644 (file)
@@ -1,23 +1,19 @@
 <?php
 
 /**
- * This class is not directly tested. Instead it is extended by SearchDbTest.
  * @group Search
  * @group Database
  */
-class SearchEngineTest extends MediaWikiTestCase {
+class SearchEngineTest extends MediaWikiLangTestCase {
        protected $search, $pageList;
 
-       function tearDown() {
-               unset( $this->search );
-       }
-
        /**
         * Checks for database type & version.
         * Will skip current test if DB does not support search.
         */
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
+
                // Search tests require MySQL or SQLite with FTS
                # Get database type and version
                $dbType = $this->db->getType();
@@ -33,6 +29,10 @@ class SearchEngineTest extends MediaWikiTestCase {
                $this->search = new $searchType( $this->db );
        }
 
+       protected function tearDown() {
+               unset( $this->search );
+       }
+
        function pageExists( $title ) {
                return false;
        }
@@ -41,6 +41,12 @@ class SearchEngineTest extends MediaWikiTestCase {
                if ( $this->pageExists( 'Not_Main_Page' ) ) {
                        return;
                }
+
+               if ( !$this->isWikitextNS( NS_MAIN ) ) {
+                       //@todo: cover the case of non-wikitext content in the main namespace
+                       return;
+               }
+
                $this->insertPage( "Not_Main_Page",     "This is not a main page", 0 );
                $this->insertPage( 'Talk:Not_Main_Page',        'This is not a talk page to the main page, see [[smithee]]', 1 );
                $this->insertPage( 'Smithee',   'A smithee is one who smiths. See also [[Alan Smithee]]', 0 );
@@ -61,6 +67,11 @@ class SearchEngineTest extends MediaWikiTestCase {
        }
 
        function fetchIds( $results ) {
+               if ( !$this->isWikitextNS( NS_MAIN ) ) {
+                       $this->markTestIncomplete( __CLASS__ . " does no yet support non-wikitext content "
+                               . "in the main namespace");
+               }
+
                $this->assertTrue( is_object( $results ) );
 
                $matches = array();
@@ -85,7 +96,7 @@ class SearchEngineTest extends MediaWikiTestCase {
         * @param $n Integer: unused
         */
        function insertPage( $pageName, $text, $ns ) {
-               $title = Title::newFromText( $pageName );
+               $title = Title::newFromText( $pageName, $ns );
 
                $user = User::newFromName( 'WikiSysop' );
                $comment = 'Search Test';
@@ -94,7 +105,7 @@ class SearchEngineTest extends MediaWikiTestCase {
                LinkCache::singleton()->clear();
 
                $page = WikiPage::factory( $title );
-               $page->doEdit( $text, $comment, 0, false, $user );
+               $page->doEditContent( ContentHandler::makeContent( $text, $title ), $comment, 0, false, $user );
 
                $this->pageList[] = array( $title, $page->getId() );
 
index 6e49a9a..7d867bc 100644 (file)
@@ -19,7 +19,11 @@ class MockSearch extends SearchEngine {
  * @group Search
  */
 class SearchUpdateTest extends MediaWikiTestCase {
-       static $searchType;
+
+       protected function setUp() {
+               parent::setUp();
+               $this->setMwGlobals( 'wgSearchType', 'MockSearch' );
+       }
 
        function update( $text, $title = 'Test', $id = 1 ) {
                $u = new SearchUpdate( $id, $title, $text );
@@ -33,19 +37,6 @@ class SearchUpdateTest extends MediaWikiTestCase {
                return $resultText;
        }
 
-       function setUp() {
-               global $wgSearchType;
-
-               self::$searchType  = $wgSearchType;
-               $wgSearchType = 'MockSearch';
-       }
-
-       function tearDown() {
-               global $wgSearchType;
-
-               $wgSearchType = self::$searchType;
-       }
-
        function testUpdateText() {
                $this->assertEquals(
                        'test',
diff --git a/tests/phpunit/includes/site/MediaWikiSiteTest.php b/tests/phpunit/includes/site/MediaWikiSiteTest.php
new file mode 100644 (file)
index 0000000..208ab1e
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * Tests for the MediaWikiSite class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class MediaWikiSiteTest extends SiteObjectTest {
+
+       public function setUp() {
+               parent::setUp();
+
+               static $hasSites = false;
+
+               if ( !$hasSites ) {
+                       TestSites::insertIntoDb();
+                       $hasSites = true;
+               }
+       }
+
+       public function testFactoryConstruction() {
+               $this->assertInstanceOf( 'MediaWikiSite', MediaWikiSite::newFromGlobalId( 'enwiki' ) );
+               $this->assertInstanceOf( 'Site', MediaWikiSite::newFromGlobalId( 'enwiki' ) );
+               $this->assertInstanceOf( 'MediaWikiSite', SitesTable::singleton()->newRow( array( 'type' => Site::TYPE_MEDIAWIKI ) ) );
+       }
+
+       public function testNormalizePageTitle() {
+               $site = MediaWikiSite::newFromGlobalId( 'enwiki' );
+
+               //NOTE: this does not actually call out to the enwiki site to perform the normalization,
+               //      but uses a local Title object to do so. This is hardcoded on SiteLink::normalizePageTitle
+               //      for the case that MW_PHPUNIT_TEST is set.
+               $this->assertEquals( 'Foo', $site->normalizePageName( ' foo ' ) );
+       }
+
+       public function fileUrlProvider() {
+               return array(
+                       // url, filepath, path arg, expected
+                       array( 'https://en.wikipedia.org', '/w/$1', 'api.php', 'https://en.wikipedia.org/w/api.php' ),
+                       array( 'https://en.wikipedia.org', '/w/', 'api.php', 'https://en.wikipedia.org/w/' ),
+                       array( 'https://en.wikipedia.org', '/foo/page.php?name=$1', 'api.php', 'https://en.wikipedia.org/foo/page.php?name=api.php' ),
+                       array( 'https://en.wikipedia.org', '/w/$1', '', 'https://en.wikipedia.org/w/' ),
+                       array( 'https://en.wikipedia.org', '/w/$1', 'foo/bar/api.php', 'https://en.wikipedia.org/w/foo/bar/api.php' ),
+               );
+       }
+
+       /**
+        * @dataProvider fileUrlProvider
+        */
+       public function testGetFileUrl( $url, $filePath, $pathArgument, $expected ) {
+               $site = MediaWikiSite::newFromGlobalId( 'enwiki' );
+
+               $site->setFilePath( $url . $filePath );
+
+               $this->assertEquals( $expected, $site->getFileUrl( $pathArgument ) );
+       }
+
+       public function provideGetPageUrl() {
+               return array(
+                       // path, page, expected substring
+                       array( 'http://acme.test/wiki/$1', 'Berlin', '/wiki/Berlin' ),
+                       array( 'http://acme.test/wiki/', 'Berlin', '/wiki/' ),
+                       array( 'http://acme.test/w/index.php?title=$1', 'Berlin', '/w/index.php?title=Berlin' ),
+                       array( 'http://acme.test/wiki/$1', '', '/wiki/' ),
+                       array( 'http://acme.test/wiki/$1', 'Berlin/sub page', '/wiki/Berlin/sub_page' ),
+                       array( 'http://acme.test/wiki/$1', 'Cork (city)   ', '/Cork_(city)' ),
+                       array( 'http://acme.test/wiki/$1', 'M&M', '/wiki/M%26M' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetPageUrl
+        */
+       public function testGetPageUrl( $path, $page, $expected ) {
+               /* @var MediaWikiSite $site */
+               $site = MediaWikiSite::newFromGlobalId( 'enwiki' );
+
+               $site->setLinkPath( $path );
+               $this->assertContains( $path, $site->getPageUrl() );
+               $this->assertContains( $expected, $site->getPageUrl( $page ) );
+       }
+
+}
diff --git a/tests/phpunit/includes/site/SiteArrayTest.php b/tests/phpunit/includes/site/SiteArrayTest.php
new file mode 100644 (file)
index 0000000..021691a
--- /dev/null
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Tests for the SiteArray class.
+ * The tests for methods defined in the SiteList interface are in SiteListTest.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * 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
+ *Both
+ * Bith
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteArrayTest extends GenericArrayObjectTest {
+
+       /**
+        * @see GenericArrayObjectTest::elementInstancesProvider
+        *
+        * @since 1.21
+        *
+        * @return array
+        */
+       public function elementInstancesProvider() {
+               $sites = TestSites::getSites();
+
+               $siteArrays = array();
+
+               $siteArrays[] = $sites;
+
+               $siteArrays[] = array( array_shift( $sites ) );
+
+               $siteArrays[] = array( array_shift( $sites ), array_shift( $sites ) );
+
+               return $this->arrayWrap( $siteArrays );
+       }
+
+       /**
+        * @see GenericArrayObjectTest::getInstanceClass
+        *
+        * @since 1.21
+        *
+        * @return array
+        */
+       public function getInstanceClass() {
+               return 'SiteArray';
+       }
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/site/SiteListTest.php b/tests/phpunit/includes/site/SiteListTest.php
new file mode 100644 (file)
index 0000000..bb8367f
--- /dev/null
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * Tests for the SiteList implementing classes.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteListTest extends MediaWikiTestCase {
+
+       /**
+        * Returns instances of SiteList implementing objects.
+        * @return array
+        */
+       public function siteListProvider() {
+               $sitesArrays = $this->siteArrayProvider();
+
+               $listInstances = array();
+
+               foreach ( $sitesArrays as $sitesArray ) {
+                       $listInstances[] = new SiteArray( $sitesArray[0] );
+               }
+
+               return $this->arrayWrap( $listInstances );
+       }
+
+       /**
+        * Returns arrays with instances of Site implementing objects.
+        * @return array
+        */
+       public function siteArrayProvider() {
+               $sites = TestSites::getSites();
+
+               $siteArrays = array();
+
+               $siteArrays[] = $sites;
+
+               $siteArrays[] = array( array_shift( $sites ) );
+
+               $siteArrays[] = array( array_shift( $sites ), array_shift( $sites ) );
+
+               return $this->arrayWrap( $siteArrays );
+       }
+
+       /**
+        * @dataProvider siteListProvider
+        * @param SiteList $sites
+        */
+       public function testIsEmpty( SiteList $sites ) {
+               $this->assertEquals( count( $sites ) === 0, $sites->isEmpty() );
+       }
+
+       /**
+        * @dataProvider siteListProvider
+        * @param SiteList $sites
+        */
+       public function testGetSiteByGlobalId( SiteList $sites ) {
+               if ( $sites->isEmpty() ) {
+                       $this->assertTrue( true );
+               }
+               else {
+                       /**
+                        * @var Site $site
+                        */
+                       foreach ( $sites as $site ) {
+                               $this->assertEquals( $site, $sites->getSite( $site->getGlobalId() ) );
+                       }
+               }
+       }
+
+       /**
+        * @dataProvider siteListProvider
+        * @param SiteList $sites
+        */
+       public function testGetSiteByInternalId( $sites ) {
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       if ( is_integer( $site->getInternalId() ) ) {
+                               $this->assertEquals( $site, $sites->getSiteByInternalId( $site->getInternalId() ) );
+                       }
+               }
+
+               $this->assertTrue( true );
+       }
+
+       /**
+        * @dataProvider siteListProvider
+        * @param SiteList $sites
+        */
+       public function testHasGlobalId( $sites ) {
+               $this->assertFalse( $sites->hasSite( 'non-existing-global-id' ) );
+               $this->assertFalse( $sites->hasInternalId( 720101010 ) );
+
+               if ( !$sites->isEmpty() ) {
+                       /**
+                        * @var Site $site
+                        */
+                       foreach ( $sites as $site ) {
+                               $this->assertTrue( $sites->hasSite( $site->getGlobalId() ) );
+                       }
+               }
+       }
+
+       /**
+        * @dataProvider siteListProvider
+        * @param SiteList $sites
+        */
+       public function testHasInternallId( $sites ) {
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       if ( is_integer( $site->getInternalId() ) ) {
+                               $this->assertTrue( $site, $sites->hasInternalId( $site->getInternalId() ) );
+                       }
+               }
+
+               $this->assertFalse( $sites->hasInternalId( -1 ) );
+       }
+
+       /**
+        * @dataProvider siteListProvider
+        * @param SiteList $sites
+        */
+       public function testGetGlobalIdentifiers( SiteList $sites ) {
+               $identifiers = $sites->getGlobalIdentifiers();
+
+               $this->assertTrue( is_array( $identifiers ) );
+
+               $expected = array();
+
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       $expected[] = $site->getGlobalId();
+               }
+
+               $this->assertArrayEquals( $expected, $identifiers );
+       }
+
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/site/SiteObjectTest.php b/tests/phpunit/includes/site/SiteObjectTest.php
new file mode 100644 (file)
index 0000000..207f46c
--- /dev/null
@@ -0,0 +1,294 @@
+<?php
+
+/**
+ * Tests for the SiteObject class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SiteObjectTest extends ORMRowTest {
+
+       /**
+        * @see ORMRowTest::getRowClass
+        * @since 1.21
+        * @return string
+        */
+       protected function getRowClass() {
+               return 'SiteObject';
+       }
+
+       /**
+        * @see ORMRowTest::getTableInstance
+        * @since 1.21
+        * @return IORMTable
+        */
+       protected function getTableInstance() {
+               return SitesTable::singleton();
+       }
+
+       /**
+        * @see ORMRowTest::constructorTestProvider
+        * @since 1.21
+        * @return array
+        */
+       public function constructorTestProvider() {
+               $argLists = array();
+
+               $argLists[] = array( 'global_key' => 'foo' );
+
+               $argLists[] = array( 'global_key' => 'bar', 'type' => Site::TYPE_MEDIAWIKI );
+
+               $constructorArgs = array();
+
+               foreach ( $argLists as $argList ) {
+                       $constructorArgs[] = array( $argList, true );
+               }
+
+               return $constructorArgs;
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetInterwikiIds( Site $site ) {
+               $this->assertInternalType( 'array', $site->getInterwikiIds() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetNavigationIds( Site $site ) {
+               $this->assertInternalType( 'array', $site->getNavigationIds() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testAddNavigationId( Site $site ) {
+               $site->addNavigationId( 'foobar' );
+               $this->assertTrue( in_array( 'foobar', $site->getNavigationIds(), true ) );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testAddInterwikiId( Site $site ) {
+               $site->addInterwikiId( 'foobar' );
+               $this->assertTrue( in_array( 'foobar', $site->getInterwikiIds(), true ) );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetLanguageCode( Site $site ) {
+               $this->assertTypeOrFalse( 'string', $site->getLanguageCode() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testSetLanguageCode( Site $site ) {
+               $site->setLanguageCode( 'en' );
+               $this->assertEquals( 'en', $site->getLanguageCode() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testNormalizePageName( Site $site ) {
+               $this->assertInternalType( 'string', $site->normalizePageName( 'Foobar' ) );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetGlobalId( Site $site ) {
+               $this->assertInternalType( 'string', $site->getGlobalId() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testSetGlobalId( Site $site ) {
+               $site->setGlobalId( 'foobar' );
+               $this->assertEquals( 'foobar', $site->getGlobalId() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetType( Site $site ) {
+               $this->assertInternalType( 'string', $site->getType() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetPath( Site $site ) {
+               $this->assertTypeOrFalse( 'string', $site->getPath( 'page_path' ) );
+               $this->assertTypeOrFalse( 'string', $site->getPath( 'file_path' ) );
+               $this->assertTypeOrFalse( 'string', $site->getPath( 'foobar' ) );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testGetAllPaths( Site $site ) {
+               $this->assertInternalType( 'array', $site->getAllPaths() );
+       }
+
+       /**
+        * @dataProvider instanceProvider
+        * @param Site $site
+        */
+       public function testSetAndRemovePath( Site $site ) {
+               $count = count( $site->getAllPaths() );
+
+               $site->setPath( 'spam', 'http://www.wikidata.org/$1' );
+               $site->setPath( 'spam', 'http://www.wikidata.org/foo/$1' );
+               $site->setPath( 'foobar', 'http://www.wikidata.org/bar/$1' );
+
+               $this->assertEquals( $count + 2, count( $site->getAllPaths() ) );
+
+               $this->assertInternalType( 'string', $site->getPath( 'foobar' ) );
+               $this->assertEquals( 'http://www.wikidata.org/foo/$1', $site->getPath( 'spam' ) );
+
+               $site->removePath( 'spam' );
+               $site->removePath( 'foobar' );
+
+               $this->assertEquals( $count, count( $site->getAllPaths() ) );
+
+               $this->assertFalse( $site->getPath( 'foobar' ) );
+               $this->assertFalse( $site->getPath( 'spam' ) );
+       }
+
+       public function testSetLinkPath() {
+               /* @var SiteObject $site */
+               $site = $this->getRowInstance( $this->getMockFields(), false );
+               $path = "TestPath/$1";
+
+               $site->setLinkPath( $path );
+               $this->assertEquals( $path, $site->getLinkPath() );
+       }
+
+       public function testGetLinkPathType() {
+               /* @var SiteObject $site */
+               $site = $this->getRowInstance( $this->getMockFields(), false );
+
+               $path = 'TestPath/$1';
+               $site->setLinkPath( $path );
+               $this->assertEquals( $path, $site->getPath( $site->getLinkPathType() ) );
+
+               $path = 'AnotherPath/$1';
+               $site->setPath( $site->getLinkPathType(), $path );
+               $this->assertEquals( $path, $site->getLinkPath() );
+       }
+
+       public function testSetPath() {
+               /* @var SiteObject $site */
+               $site = $this->getRowInstance( $this->getMockFields(), false );
+
+               $path = 'TestPath/$1';
+               $site->setPath( 'foo', $path );
+
+               $this->assertEquals( $path, $site->getPath( 'foo' ) );
+       }
+
+       public function testProtocolRelativePath() {
+               /* @var SiteObject $site */
+               $site = $this->getRowInstance( $this->getMockFields(), false );
+
+               $type = $site->getLinkPathType();
+               $path = '//acme.com/'; // protocol-relative URL
+               $site->setPath( $type, $path );
+
+               $this->assertEquals( '', $site->getProtocol() );
+       }
+
+       public function provideGetPageUrl() {
+               //NOTE: the assumption that the URL is built by replacing $1
+               //      with the urlencoded version of $page
+               //      is true for SiteObject but not guaranteed for subclasses.
+               //      Subclasses need to override this provider appropriately.
+
+               return array(
+                       array( #0
+                               'http://acme.test/TestPath/$1',
+                               'Foo',
+                               '/TestPath/Foo',
+                       ),
+                       array( #1
+                               'http://acme.test/TestScript?x=$1&y=bla',
+                               'Foo',
+                               'TestScript?x=Foo&y=bla',
+                       ),
+                       array( #2
+                               'http://acme.test/TestPath/$1',
+                               'foo & bar/xyzzy (quux-shmoox?)',
+                               '/TestPath/foo%20%26%20bar%2Fxyzzy%20%28quux-shmoox%3F%29',
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider provideGetPageUrl
+        */
+       public function testGetPageUrl( $path, $page, $expected ) {
+               /* @var SiteObject $site */
+               $site = $this->getRowInstance( $this->getMockFields(), false );
+
+               //NOTE: the assumption that getPageUrl is based on getLinkPath
+               //      is true for SiteObject but not guaranteed for subclasses.
+               //      Subclasses need to override this test case appropriately.
+               $site->setLinkPath( $path );
+               $this->assertContains( $path, $site->getPageUrl() );
+
+               $this->assertContains( $expected, $site->getPageUrl( $page ) );
+       }
+
+       protected function assertTypeOrFalse( $type, $value ) {
+               if ( $value === false ) {
+                       $this->assertTrue( true );
+               }
+               else {
+                       $this->assertInternalType( $type, $value );
+               }
+       }
+
+}
\ No newline at end of file
diff --git a/tests/phpunit/includes/site/SitesTest.php b/tests/phpunit/includes/site/SitesTest.php
new file mode 100644 (file)
index 0000000..7675d42
--- /dev/null
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * Tests for the Sites class.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class SitesTest extends MediaWikiTestCase {
+
+       public function setUp() {
+               parent::setUp();
+               TestSites::insertIntoDb();
+       }
+
+       public function testSingleton() {
+               $this->assertInstanceOf( 'Sites', Sites::singleton() );
+               $this->assertTrue( Sites::singleton() === Sites::singleton() );
+       }
+
+       public function testGetSites() {
+               $this->assertInstanceOf( 'SiteList', Sites::singleton()->getSites() );
+       }
+
+
+       public function testGetSite() {
+               $count = 0;
+               $sites = Sites::singleton()->getSites();
+
+               /**
+                * @var Site $site
+                */
+               foreach ( $sites as $site ) {
+                       $this->assertInstanceOf( 'Site', $site );
+
+                       $this->assertEquals(
+                               $site,
+                               Sites::singleton()->getSite( $site->getGlobalId() )
+                       );
+
+                       if ( ++$count > 100 ) {
+                               break;
+                       }
+               }
+       }
+
+       public function testNewSite() {
+               $this->assertInstanceOf( 'Site', Sites::newSite() );
+               $this->assertInstanceOf( 'Site', Sites::newSite( 'enwiki' ) );
+       }
+
+       public function testGetGroup() {
+               $wikipedias = Sites::singleton()->getSiteGroup( "wikipedia" );
+
+               $this->assertFalse( $wikipedias->isEmpty() );
+
+               /* @var Site $site */
+               foreach ( $wikipedias as $site ) {
+                       $this->assertEquals( 'wikipedia', $site->getGroup() );
+               }
+       }
+
+}
diff --git a/tests/phpunit/includes/site/TestSites.php b/tests/phpunit/includes/site/TestSites.php
new file mode 100644 (file)
index 0000000..6003a8d
--- /dev/null
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * Holds sites for testing purposes.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.21
+ *
+ * @ingroup Site
+ * @ingroup Test
+ *
+ * @group Site
+ *
+ * @licence GNU GPL v2+
+ * @author Jeroen De Dauw < jeroendedauw@gmail.com >
+ */
+class TestSites {
+
+       /**
+        * @since 1.21
+        *
+        * @return array
+        */
+       public static function getSites() {
+               $sites = array();
+
+               $site = Sites::newSite( 'foobar' );
+               $sites[] = $site;
+
+               $site = Sites::newSite( 'enwiktionary' );
+               $site->setGroup( 'wiktionary' );
+               $site->setType( Site::TYPE_MEDIAWIKI );
+               $site->setLanguageCode( 'en' );
+               $site->addNavigationId( 'enwiktionary' );
+               $site->setPath( MediaWikiSite::PATH_PAGE, "https://en.wiktionary.org/wiki/$1" );
+               $site->setPath( MediaWikiSite::PATH_FILE, "https://en.wiktionary.org/w/$1" );
+               $sites[] = $site;
+
+               $site = Sites::newSite( 'dewiktionary' );
+               $site->setGroup( 'wiktionary' );
+               $site->setType( Site::TYPE_MEDIAWIKI );
+               $site->setLanguageCode( 'de' );
+               $site->addInterwikiId( 'dewiktionary' );
+               $site->addInterwikiId( 'wiktionaryde' );
+               $site->setPath( MediaWikiSite::PATH_PAGE, "https://de.wiktionary.org/wiki/$1" );
+               $site->setPath( MediaWikiSite::PATH_FILE, "https://de.wiktionary.org/w/$1" );
+               $sites[] = $site;
+
+               $site = Sites::newSite( 'spam' );
+               $site->setGroup( 'spam' );
+               $site->setType( Site::TYPE_UNKNOWN );
+               $site->setLanguageCode( 'en' );
+               $site->addNavigationId( 'spam' );
+               $site->addNavigationId( 'spamz' );
+               $site->addInterwikiId( 'spamzz' );
+               $site->setLinkPath( "http://spamzz.test/testing/" );
+               $sites[] = $site;
+
+               foreach ( array( 'en', 'de', 'nl', 'sv', 'sr', 'no', 'nn' ) as $langCode ) {
+                       $site = Sites::newSite( $langCode . 'wiki' );
+                       $site->setGroup( 'wikipedia' );
+                       $site->setType( Site::TYPE_MEDIAWIKI );
+                       $site->setLanguageCode( $langCode );
+                       $site->addInterwikiId( $langCode );
+                       $site->addNavigationId( $langCode );
+                       $site->setPath( MediaWikiSite::PATH_PAGE, "https://$langCode.wikipedia.org/wiki/$1" );
+                       $site->setPath( MediaWikiSite::PATH_FILE, "https://$langCode.wikipedia.org/w/$1" );
+                       $sites[] = $site;
+               }
+
+               return $sites;
+       }
+
+       /**
+        * Inserts sites into the database for the unit tests that need them.
+        *
+        * @since 0.1
+        */
+       public static function insertIntoDb() {
+               $dbw = wfGetDB( DB_MASTER );
+
+               $dbw->begin( __METHOD__ );
+
+               $dbw->delete( 'sites', '*', __METHOD__ );
+               $dbw->delete( 'site_identifiers', '*', __METHOD__ );
+
+               /**
+                * @var Site $site
+                */
+               foreach ( TestSites::getSites() as $site ) {
+                       $site->save();
+               }
+
+               $dbw->commit( __METHOD__ );
+
+               Sites::singleton()->getSites( false ); // re-cache
+       }
+
+}
\ No newline at end of file
index 2e4f4b0..82426bd 100644 (file)
@@ -14,9 +14,6 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
         */
        protected $rc;
 
-       function setUp() {
-       }
-
        /** helper to test SpecialRecentchanges::buildMainQueryConds() */
        private function assertConditions( $expected, $requestOptions = null, $message = '' ) {
                $context = new RequestContext;
@@ -120,7 +117,7 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
         * Provides associated namespaces to test recent changes
         * namespaces association filtering.
         */
-       public function provideNamespacesAssociations() {
+       public static function provideNamespacesAssociations() {
                return array( # (NS => Associated_NS)
                        array( NS_MAIN, NS_TALK),
                        array( NS_TALK, NS_MAIN),
index 20e42a6..9d7dc71 100644 (file)
@@ -10,9 +10,6 @@
 class SpecialSearchTest extends MediaWikiTestCase {
        private $search;
 
-       function setUp() { }
-       function tearDown() { }
-
        /**
         * @covers SpecialSearch::load
         * @dataProvider provideSearchOptionsTests
@@ -83,17 +80,15 @@ class SpecialSearchTest extends MediaWikiTestCase {
                                'Web request with specific NS should override user preference'
                        ),
                        array(
-                               $EMPTY_REQUEST, array( 'searchNs2' => 1, 'searchNs14' => 1 ),
-                               'advanced', array( 2, 14 ),
-                               'Bug 33583: search with no option should honor User search preferences'
-                       ),
-                       array(
-                               $EMPTY_REQUEST, array_fill_keys( array_map( function( $ns ) {
+                               $EMPTY_REQUEST, array(
+                                       'searchNs2' => 1,
+                                       'searchNs14' => 1,
+                               ) + array_fill_keys( array_map( function( $ns ) {
                                        return "searchNs$ns";
-                               }, $defaultNS ), 0 ) + array( 'searchNs2' => 1, 'searchNs14' => 1 ),
+                               }, $defaultNS ), 0 ),
                                'advanced', array( 2, 14 ),
                                'Bug 33583: search with no option should honor User search preferences'
-                               . 'and have all other namespace disabled'
+                               . ' and have all other namespace disabled'
                        ),
                );
        }
@@ -112,5 +107,35 @@ class SpecialSearchTest extends MediaWikiTestCase {
                }
                return $u;
        }
+
+       /**
+        * Verify we do not expand search term in <title> on search result page
+        * https://gerrit.wikimedia.org/r/4841
+        */
+       function testSearchTermIsNotExpanded() {
+
+               # Initialize [[Special::Search]]
+               $search = new SpecialSearch();
+               $search->getContext()->setTitle( Title::newFromText('Special:Search' ) );
+               $search->load();
+
+               # Simulate a user searching for a given term
+               $term = '{{SITENAME}}';
+               $search->showResults( $term );
+
+               # Lookup the HTML page title set for that page
+               $pageTitle = $search
+                       ->getContext()
+                       ->getOutput()
+                       ->getHTMLTitle();
+
+               # Compare :-]
+               $this->assertRegExp(
+                       '/' . preg_quote( $term ) . '/',
+                       $pageTitle,
+                       "Search term '{$term}' should not be expanded in Special:Search <title>"
+               );
+
+       }
 }
 
index f66c387..59663ba 100644 (file)
@@ -6,7 +6,7 @@
  */
 class UploadFromUrlTest extends ApiTestCase {
 
-       public function setUp() {
+       protected function setUp() {
                global $wgEnableUploads, $wgAllowCopyUploads, $wgAllowAsyncCopyUploads;
                parent::setUp();
 
@@ -20,7 +20,7 @@ class UploadFromUrlTest extends ApiTestCase {
                }
        }
 
-       protected function doApiRequest( Array $params, Array $unused = null, $appendModule = false, User $user = null ) {
+       protected function doApiRequest( array $params, array $unused = null, $appendModule = false, User $user = null ) {
                $sessionId = session_id();
                session_write_close();
 
index 66fafaa..857aef5 100644 (file)
@@ -8,7 +8,7 @@ class UploadStashTest extends MediaWikiTestCase {
         */
        public static $users;
 
-       public function setUp() {
+       protected function setUp() {
                parent::setUp();
 
                // Setup a file for bug 29408
@@ -31,6 +31,18 @@ class UploadStashTest extends MediaWikiTestCase {
                );
        }
 
+       protected function tearDown() {
+               if ( file_exists( $this->bug29408File . "." ) ) {
+                       unlink( $this->bug29408File . "." );
+               }
+
+               if ( file_exists( $this->bug29408File ) ) {
+                       unlink( $this->bug29408File );
+               }
+
+               parent::tearDown();
+       }
+
        public function testBug29408() {
                global $wgUser;
                $wgUser = self::$users['uploader']->user;
@@ -62,16 +74,4 @@ class UploadStashTest extends MediaWikiTestCase {
                $request = new FauxRequest( array( 'wpFileKey' => 'testkey-test.test', 'wpSessionKey' => 'foo') );
                $this->assertTrue( UploadFromStash::isValidRequest($request), 'Check key precedence' );
        }
-
-       public function tearDown() {
-               parent::tearDown();
-
-               if( file_exists( $this->bug29408File . "." ) ) {
-                       unlink( $this->bug29408File . "." );
-               }
-
-               if( file_exists( $this->bug29408File ) ) {
-                       unlink( $this->bug29408File );
-               }
-       }
 }
index 6948f5b..d757734 100644 (file)
@@ -6,7 +6,7 @@ class UploadTest extends MediaWikiTestCase {
        protected $upload;
 
 
-       function setUp() {
+       protected function setUp() {
                global $wgHooks;
                parent::setUp();
 
@@ -17,7 +17,7 @@ class UploadTest extends MediaWikiTestCase {
                };
        }
 
-       function tearDown() {
+       protected function tearDown() {
                global $wgHooks;
                $wgHooks = $this->hooks;
        }
@@ -27,7 +27,7 @@ class UploadTest extends MediaWikiTestCase {
         * First checks the return code
         * of UploadBase::getTitle() and then the actual returned title
         * 
-        * @dataProvider dataTestTitleValidation
+        * @dataProvider provideTestTitleValidation
         */
        public function testTitleValidation( $srcFilename, $dstFilename, $code, $msg ) {
                /* Check the result code */
@@ -46,7 +46,7 @@ class UploadTest extends MediaWikiTestCase {
        /**
         * Test various forms of valid and invalid titles that can be supplied.
         */
-       public function dataTestTitleValidation() {
+       public static function provideTestTitleValidation() {
                return array(
                        /* Test a valid title */
                        array( 'ValidTitle.jpg', 'ValidTitle.jpg', UploadBase::OK, 
index 3a648de..16215c5 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageAm.php */
-class LanguageAmTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Am' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageAmTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index b23e053..17f7352 100644 (file)
@@ -5,19 +5,11 @@
  */
 
 /** Tests for MediaWiki languages/LanguageAr.php */
-class LanguageArTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Ar' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageArTest extends LanguageClassesTestCase {
 
        function testFormatNum() {
-               $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->lang->formatNum( '1234567' ) );
-               $this->assertEquals( '-١٢٫٨٩', $this->lang->formatNum( -12.89 ) );
+               $this->assertEquals( '١٬٢٣٤٬٥٦٧', $this->getLang()->formatNum( '1234567' ) );
+               $this->assertEquals( '-١٢٫٨٩', $this->getLang()->formatNum( -12.89 ) );
        }
 
        /**
@@ -25,7 +17,7 @@ class LanguageArTest extends MediaWikiTestCase {
         * @dataProvider providerSprintfDate
         */
        function testSprintfDate( $format, $date, $expected ) {
-               $this->assertEquals( $expected, $this->lang->sprintfDate( $format, $date ) );
+               $this->assertEquals( $expected, $this->getLang()->sprintfDate( $format, $date ) );
        }
 
        function providerSprintfDate() {
@@ -55,7 +47,7 @@ class LanguageArTest extends MediaWikiTestCase {
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'zero', 'one', 'two', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
        function providePlural() {
                return array (
index 735ccc6..06ee240 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageBe.php */
-class LanguageBeTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Be' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageBeTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index 765cdb8..ad0ef43 100644 (file)
@@ -1,36 +1,39 @@
 <?php
 
-class LanguageBeTaraskTest extends MediaWikiTestCase {
-       private $lang;
+class LanguageBe_taraskTest extends LanguageClassesTestCase {
 
-       function setUp() {
-               $this->lang = Language::factory( 'Be-tarask' );
-       }
-       function tearDown() {
-               unset( $this->lang );
+       /**
+        * Make sure the language code we are given is indeed
+        * be-tarask. This is to ensure LanguageClassesTestCase
+        * does not give us the wrong language.
+        */
+       function testBeTaraskTestsUsesBeTaraskCode() {
+               $this->assertEquals( 'be-tarask',
+                       $this->getLang()->getCode()
+               );
        }
 
        /** see bug 23156 & r64981 */
        function testSearchRightSingleQuotationMarkAsApostroph() {
                $this->assertEquals(
                        "'",
-                       $this->lang->normalizeForSearch( '’' ),
+                       $this->getLang()->normalizeForSearch( '’' ),
                        'bug 23156: U+2019 conversion to U+0027'
                );
        }
        /** see bug 23156 & r64981 */
        function testCommafy() {
-               $this->assertEquals( '1,234,567', $this->lang->commafy( '1234567' ) );
-               $this->assertEquals(    '12,345', $this->lang->commafy(   '12345' ) );
+               $this->assertEquals( '1,234,567', $this->getLang()->commafy( '1234567' ) );
+               $this->assertEquals(    '12,345', $this->getLang()->commafy(   '12345' ) );
        }
        /** see bug 23156 & r64981 */
        function testDoesNotCommafyFourDigitsNumber() {
-               $this->assertEquals(      '1234', $this->lang->commafy(    '1234' ) );
+               $this->assertEquals(      '1234', $this->getLang()->commafy(    '1234' ) );
        }
        /** @dataProvider providePluralFourForms */
        function testPluralFourForms( $result, $value ) {
                $forms =  array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralFourForms() {
@@ -51,7 +54,7 @@ class LanguageBeTaraskTest extends MediaWikiTestCase {
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
                $forms =  array( 'one', 'several' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
        function providePluralTwoForms() {
                return array (
index e1e2a13..5af7adb 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageBh.php */
-class LanguageBhTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Bh' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageBhTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index b6631c0..dd00428 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageBs.php */
-class LanguageBsTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Bs' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageBsTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
diff --git a/tests/phpunit/languages/LanguageClassesTestCase.php b/tests/phpunit/languages/LanguageClassesTestCase.php
new file mode 100644 (file)
index 0000000..4f0a37f
--- /dev/null
@@ -0,0 +1,100 @@
+<?php
+/**
+ * Helping class to run tests using a clean language instance.
+ *
+ * This is intended for the MediaWiki language class tests under
+ * tests/phpunit/languages. You simply need to extends this test
+ * and set it up with a language code using setUpBeforeClass:
+ *
+ * @par Setting up a language:
+ * @code
+ * class LanguageFooTest extends LanguageClassesTestCase {
+ *   public static function setUpBeforeClass() {
+ *     self::setLang( 'Foo' );
+ *   }
+ * @endcode
+ *
+ * Before each tests, a new language object is build which you
+ * can retrieve in your test using the $this->getLang() method:
+ *
+ * @par Using the crafted language object:
+ * @code
+ * function testHasLanguageObject() {
+ *   $langObject = $this->getLang();
+ *   $this->assertInstanceOf( 'LanguageFoo',
+ *     $langObject
+ *   );
+ * }
+ * @endcode
+ */
+abstract class LanguageClassesTestCase extends MediaWikiTestCase {
+
+       /**
+        * Regex used to find out the language code out of the class name
+        * used by setUpBeforeClass
+       */
+       private static $reExtractLangFromClass = '/Language(.*)Test/';
+
+       /**
+        * Hold the language code we are going to use. This is extracted
+        * directly from the extending class.
+        */
+       private static $LanguageClassCode;
+
+       /**
+        * Internal language object
+        *
+        * A new object is created before each tests thanks to PHPUnit
+        * setUp() method, it is deleted after each test too. To get
+        * this object you simply use the getLang method.
+        *
+        * You must have setup a language code first. See $LanguageClassCode
+        * @code
+        *  function testWeAreTheChampions() {
+        *    $this->getLang();  # language object
+        *  }
+        * @endcode
+        */
+       private $languageObject;
+
+       public static function setUpBeforeClass() {
+               $found = preg_match( self::$reExtractLangFromClass,
+                       get_called_class(), $m );
+               if ( $found ) {
+                       # Normalize language code since classes uses underscores
+                       $m[1] = str_replace( '_', '-', $m[1] );
+               } else {
+                       # Fallback to english language
+                       $m[1] = 'en';
+                       wfDebug(
+                               __METHOD__ . " could not extract a language name "
+                               . "out of " . get_called_class() . " failling back to 'en'\n"
+                       );
+               }
+               // TODO: validate $m[1] which should be a valid language code
+               self::$LanguageClassCode = $m[1];
+       }
+
+       protected function getLang() {
+               return $this->languageObject;
+       }
+
+       /**
+        * Create a new language object before each test.
+        */
+       protected function setUp() {
+               parent::setUp();
+               $this->languageObject = Language::factory(
+                       self::$LanguageClassCode );
+       }
+
+       /**
+        * Delete the internal language object so each test start
+        * out with a fresh language instance.
+        */
+       protected function tearDown() {
+               unset( $this->languageObject );
+               parent::tearDown();
+       }
+
+}
index dda29f9..72c9e79 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/Languagecs.php */
-class LanguageCsTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'cs' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageCsTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index f8186d7..95f8da7 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageCu.php */
-class LanguageCuTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'cu' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageCuTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index e9f9e41..de6ba5c 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageCy.php */
-class LanguageCyTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'cy' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageCyTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'zero', 'one', 'two', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index ab7f931..8fb6024 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageDsb.php */
-class LanguageDsbTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'dsb' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageDsbTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index 8538744..05de960 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageFr.php */
-class LanguageFrTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'fr' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageFrTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index fbd9f11..0a54592 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageGa.php */
-class LanguageGaTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'ga' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageGaTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'two', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 24574bd..7831cd2 100644 (file)
@@ -6,21 +6,13 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageGd.php */
-class LanguageGdTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'gd' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageGdTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                // The CLDR ticket for this plural forms is not same as mw plural forms. See http://unicode.org/cldr/trac/ticket/2883
                $forms =  array( 'Form 1', 'Form 2', 'Form 3', 'Form 4', 'Form 5', 'Form 6' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
        function providerPlural() {
                return array (
index 3d298b9..0edff59 100644 (file)
@@ -6,21 +6,13 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageGv.php */
-class LanguageGvTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'gv' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageGvTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                // This is not compatible with CLDR plural rules http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html#gv
                $forms =  array( 'Form 1', 'Form 2', 'Form 3', 'Form 4' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
        function providerPlural() {
                return array (
index 7833da7..575b277 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageHe.php */
-class LanguageHeTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'he' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageHeTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPluralDual */
        function testPluralDual( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPluralDual() {
@@ -34,7 +26,7 @@ class LanguageHeTest extends MediaWikiTestCase {
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
@@ -45,4 +37,41 @@ class LanguageHeTest extends MediaWikiTestCase {
                        array( 'other', 3 ), // Plural
                );
        }
+
+       /** @dataProvider providerGrammar */
+       function testGrammar( $result, $word, $case ) {
+               $this->assertEquals( $result, $this->getLang()->convertGrammar( $word, $case ) );
+       }
+
+       // The comments in the beginning of the line help avoid RTL problems
+       // with text editors.
+       function providerGrammar() {
+               return array (
+                       array(
+                               /* result */ 'וויקיפדיה',
+                               /* word   */ 'ויקיפדיה',
+                               /* case   */ 'תחילית',
+                       ),
+                       array(
+                               /* result */ 'וולפגנג',
+                               /* word   */ 'וולפגנג',
+                               /* case   */ 'prefixed',
+                       ),
+                       array(
+                               /* result */ 'קובץ',
+                               /* word   */ 'הקובץ',
+                               /* case   */ 'תחילית',
+                       ),
+                       array(
+                               /* result */ '־Wikipedia',
+                               /* word   */ 'Wikipedia',
+                               /* case   */ 'תחילית',
+                       ),
+                       array(
+                               /* result */ '־1995',
+                               /* word   */ '1995',
+                               /* case   */ 'תחילית',
+                       ),
+               );
+       }
 }
index ead9e02..5a780a2 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageHi.php */
-class LanguageHiTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Hi' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageHiTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index 4f1c66b..748aaf4 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageHr.php */
-class LanguageHrTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'hr' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageHrTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 803c772..2d90ef0 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageHsb.php */
-class LanguageHsbTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'hsb' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageHsbTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'two', 'few', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index adbd37e..e01278b 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageHu.php */
-class LanguageHuTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Hu' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageHuTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index 7990bdf..ea6e255 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageHy.php */
-class LanguageHyTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'hy' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageHyTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index ab88946..e92d264 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageKsh.php */
-class LanguageKshTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'ksh' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageKshTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array(  'one', 'other', 'zero' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 0fd9167..8853caa 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageLn.php */
-class LanguageLnTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'ln' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageLnTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index 0d7c7d3..485a090 100644 (file)
@@ -6,26 +6,18 @@
  */
 
 /** Tests for MediaWiki languages/LanguageLt.php */
-class LanguageLtTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Lt' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageLtTest extends LanguageClassesTestCase {
 
        /** @dataProvider provideOneFewOtherCases */
        function testOneFewOtherPlural( $result, $value ) {
                $forms =  array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
        
        /** @dataProvider provideOneFewCases */
        function testOneFewPlural( $result, $value ) {
                $forms =  array( 'one', 'few' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function provideOneFewOtherCases() {
index 0636da5..bf4f793 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageLv.php */
-class LanguageLvTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'lv' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageLvTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 06b5654..d6d3de9 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageMg.php */
-class LanguageMgTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'mg' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageMgTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePlural() {
index cf5ec3d..8cd84b8 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageMk.php */
-class LanguageMkTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'mk' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageMkTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
 
index 8c4b0b2..b7f6182 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/LanguageMl.php */
-class LanguageMlTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Ml' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageMlTest extends LanguageClassesTestCase {
 
        /** see bug 29495 */
        /** @dataProvider providerFormatNum*/
        function testFormatNum( $result, $value ) {
-               $this->assertEquals( $result,  $this->lang->formatNum( $value ) );
+               $this->assertEquals( $result,  $this->getLang()->formatNum( $value ) );
        }
 
        function providerFormatNum() {
index 533e590..491d8ac 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageMo.php */
-class LanguageMoTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'mo' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageMoTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 421bb38..70cd93a 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageMt.php */
-class LanguageMtTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'mt' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageMtTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPluralAllForms */
        function testPluralAllForms( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPluralAllForms() {
@@ -46,7 +38,7 @@ class LanguageMtTest extends MediaWikiTestCase {
        /** @dataProvider providerPluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'many' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPluralTwoForms() {
index cf979cd..f783f2c 100644 (file)
@@ -6,23 +6,15 @@
  */
 
 /** Tests for MediaWiki languages/LanguageNl.php */
-class LanguageNlTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Nl' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageNlTest extends LanguageClassesTestCase {
 
        function testFormatNum() {
-               $this->assertEquals( '1.234.567', $this->lang->formatNum( '1234567' ) );
-               $this->assertEquals( '12.345', $this->lang->formatNum( '12345' ) );
-               $this->assertEquals( '1', $this->lang->formatNum( '1' ) );
-               $this->assertEquals( '123', $this->lang->formatNum( '123' ) );
-               $this->assertEquals( '1.234', $this->lang->formatNum( '1234' ) );
-               $this->assertEquals( '12.345,56', $this->lang->formatNum( '12345.56' ) );
-               $this->assertEquals( ',1234556', $this->lang->formatNum( '.1234556' ) );
+               $this->assertEquals( '1.234.567', $this->getLang()->formatNum( '1234567' ) );
+               $this->assertEquals( '12.345', $this->getLang()->formatNum( '12345' ) );
+               $this->assertEquals( '1', $this->getLang()->formatNum( '1' ) );
+               $this->assertEquals( '123', $this->getLang()->formatNum( '123' ) );
+               $this->assertEquals( '1.234', $this->getLang()->formatNum( '1234' ) );
+               $this->assertEquals( '12.345,56', $this->getLang()->formatNum( '12345.56' ) );
+               $this->assertEquals( ',1234556', $this->getLang()->formatNum( '.1234556' ) );
        }
 }
index ea39362..97146d3 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageNso.php */
-class LanguageNsoTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'nso' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageNsoTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'many' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index e56d4b7..00b7e9e 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguagePl.php */
-class LanguagePlTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'pl' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguagePlTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPluralFourForms */
        function testPluralFourForms( $result, $value ) {
                $forms = array( 'one', 'few', 'many' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPluralFourForms() {
@@ -46,7 +38,7 @@ class LanguagePlTest extends MediaWikiTestCase {
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'many' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 5270f6f..61726bc 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageRo.php */
-class LanguageRoTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'ro' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageRoTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms =  array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 7a1f193..f545a13 100644 (file)
@@ -7,20 +7,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageRu.php */
-class LanguageRuTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'ru' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageRuTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralFourForms */
        function testPluralFourForms( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralFourForms() {
@@ -41,7 +33,7 @@ class LanguageRuTest extends MediaWikiTestCase {
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
                $forms =  array( 'one', 'several' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
        function providePluralTwoForms() {
                return array (
index 065ec29..cf76353 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageSe.php */
-class LanguageSeTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'se' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageSeTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPluralThreeForms */
        function testPluralThreeForms( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPluralThreeForms() {
@@ -34,7 +26,7 @@ class LanguageSeTest extends MediaWikiTestCase {
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 931c82f..e2a56ca 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageSgs.php */
-class LanguageSgsTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Sgs' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageSgsTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralAllForms */
        function testPluralAllForms( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralAllForms() {
@@ -43,7 +35,7 @@ class LanguageSgsTest extends MediaWikiTestCase {
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
                $forms =  array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralTwoForms() {
index b8169ae..25618c4 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageSh.php */
-class LanguageShTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'sh' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageShTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'many' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index 4cfd840..b50f7df 100644 (file)
@@ -7,20 +7,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageSk.php */
-class LanguageSkTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'sk' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageSkTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'few', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index c1f7569..bfb7c7e 100644 (file)
@@ -7,20 +7,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageSl.php */
-class LanguageSlTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'sl' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageSlTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'two', 'few', 'other', 'zero' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index b7e72e9..85fa9fb 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageSma.php */
-class LanguageSmaTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'sma' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageSmaTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPluralThreeForms */
        function testPluralThreeForms( $result, $value ) {
                $forms = array( 'one', 'two', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPluralThreeForms() {
@@ -34,7 +26,7 @@ class LanguageSmaTest extends MediaWikiTestCase {
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index d44ecf8..c88115d 100644 (file)
 require_once dirname( __DIR__ ) . '/bootstrap.php';
 
 /** Tests for MediaWiki languages/LanguageSr.php */
-class LanguageSrTest extends MediaWikiTestCase {
-       /* Language object. Initialized before each test */
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'sr' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageSrTest extends LanguageClassesTestCase {
 
        ##### TESTS #######################################################
 
@@ -125,7 +116,7 @@ class LanguageSrTest extends MediaWikiTestCase {
        /** @dataProvider providePluralFourForms */
        function testPluralFourForms( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralFourForms() {
@@ -146,7 +137,7 @@ class LanguageSrTest extends MediaWikiTestCase {
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'several' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
        function providePluralTwoForms() {
                return array (
@@ -207,8 +198,7 @@ class LanguageSrTest extends MediaWikiTestCase {
 
        /** Wrapper for converter::convertTo() method*/
        function convertTo( $text, $variant ) {
-               return $this
-                       ->lang
+               return $this->getLang()
                        ->mConverter
                        ->convertTo(
                                $text, $variant
index 7025449..94ccfd0 100644 (file)
@@ -1,23 +1,11 @@
 <?php
 
-class LanguageTest extends MediaWikiTestCase {
-
-       /**
-        * @var Language
-        */
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'en' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageTest extends LanguageClassesTestCase {
 
        function testLanguageConvertDoubleWidthToSingleWidth() {
                $this->assertEquals(
                        "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
-                       $this->lang->normalizeForSearch(
+                       $this->getLang()->normalizeForSearch(
                                "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
                        ),
                        'convertDoubleWidth() with the full alphabet and digits'
@@ -28,7 +16,7 @@ class LanguageTest extends MediaWikiTestCase {
         * @dataProvider provideFormattableTimes
         */
        function testFormatTimePeriod( $seconds, $format, $expected, $desc ) {
-               $this->assertEquals( $expected, $this->lang->formatTimePeriod( $seconds, $format ), $desc );
+               $this->assertEquals( $expected, $this->getLang()->formatTimePeriod( $seconds, $format ), $desc );
        }
 
        function provideFormattableTimes() {
@@ -36,7 +24,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                9.45,
                                array(),
-                               '9.5s',
+                               '9.5 s',
                                'formatTimePeriod() rounding (<10s)'
                        ),
                        array(
@@ -48,7 +36,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                9.95,
                                array(),
-                               '10s',
+                               '10 s',
                                'formatTimePeriod() rounding (<10s)'
                        ),
                        array(
@@ -60,7 +48,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                59.55,
                                array(),
-                               '1m 0s',
+                               '1 min 0 s',
                                'formatTimePeriod() rounding (<60s)'
                        ),
                        array(
@@ -72,7 +60,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                119.55,
                                array(),
-                               '2m 0s',
+                               '2 min 0 s',
                                'formatTimePeriod() rounding (<1h)'
                        ),
                        array(
@@ -84,7 +72,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                3599.55,
                                array(),
-                               '1h 0m 0s',
+                               '1 h 0 min 0 s',
                                'formatTimePeriod() rounding (<1h)'
                        ),
                        array(
@@ -96,7 +84,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                array(),
-                               '2h 0m 0s',
+                               '2 h 0 min 0 s',
                                'formatTimePeriod() rounding (>=1h)'
                        ),
                        array(
@@ -108,7 +96,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                'avoidseconds',
-                               '2h 0m',
+                               '2 h 0 min',
                                'formatTimePeriod() rounding (>=1h), avoidseconds'
                        ),
                        array(
@@ -120,7 +108,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                7199.55,
                                'avoidminutes',
-                               '2h 0m',
+                               '2 h 0 min',
                                'formatTimePeriod() rounding (>=1h), avoidminutes'
                        ),
                        array(
@@ -132,7 +120,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                172799.55,
                                'avoidseconds',
-                               '48h 0m',
+                               '48 h 0 min',
                                'formatTimePeriod() rounding (=48h), avoidseconds'
                        ),
                        array(
@@ -144,7 +132,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                259199.55,
                                'avoidminutes',
-                               '3d 0h',
+                               '3 d 0 h',
                                'formatTimePeriod() rounding (>48h), avoidminutes'
                        ),
                        array(
@@ -156,7 +144,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                176399.55,
                                'avoidseconds',
-                               '2d 1h 0m',
+                               '2 d 1 h 0 min',
                                'formatTimePeriod() rounding (>48h), avoidseconds'
                        ),
                        array(
@@ -168,7 +156,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                176399.55,
                                'avoidminutes',
-                               '2d 1h',
+                               '2 d 1 h',
                                'formatTimePeriod() rounding (>48h), avoidminutes'
                        ),
                        array(
@@ -180,7 +168,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                259199.55,
                                'avoidseconds',
-                               '3d 0h 0m',
+                               '3 d 0 h 0 min',
                                'formatTimePeriod() rounding (>48h), avoidseconds'
                        ),
                        array(
@@ -192,7 +180,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                172801.55,
                                'avoidseconds',
-                               '2d 0h 0m',
+                               '2 d 0 h 0 min',
                                'formatTimePeriod() rounding, (>48h), avoidseconds'
                        ),
                        array(
@@ -204,7 +192,7 @@ class LanguageTest extends MediaWikiTestCase {
                        array(
                                176460.55,
                                array(),
-                               '2d 1h 1m 1s',
+                               '2 d 1 h 1 min 1 s',
                                'formatTimePeriod() rounding, recursion, (>48h)'
                        ),
                        array(
@@ -220,31 +208,31 @@ class LanguageTest extends MediaWikiTestCase {
        function testTruncate() {
                $this->assertEquals(
                        "XXX",
-                       $this->lang->truncate( "1234567890", 0, 'XXX' ),
+                       $this->getLang()->truncate( "1234567890", 0, 'XXX' ),
                        'truncate prefix, len 0, small ellipsis'
                );
 
                $this->assertEquals(
                        "12345XXX",
-                       $this->lang->truncate( "1234567890", 8, 'XXX' ),
+                       $this->getLang()->truncate( "1234567890", 8, 'XXX' ),
                        'truncate prefix, small ellipsis'
                );
 
                $this->assertEquals(
                        "123456789",
-                       $this->lang->truncate( "123456789", 5, 'XXXXXXXXXXXXXXX' ),
+                       $this->getLang()->truncate( "123456789", 5, 'XXXXXXXXXXXXXXX' ),
                        'truncate prefix, large ellipsis'
                );
 
                $this->assertEquals(
                        "XXX67890",
-                       $this->lang->truncate( "1234567890", -8, 'XXX' ),
+                       $this->getLang()->truncate( "1234567890", -8, 'XXX' ),
                        'truncate suffix, small ellipsis'
                );
 
                $this->assertEquals(
                        "123456789",
-                       $this->lang->truncate( "123456789", -5, 'XXXXXXXXXXXXXXX' ),
+                       $this->getLang()->truncate( "123456789", -5, 'XXXXXXXXXXXXXXX' ),
                        'truncate suffix, large ellipsis'
                );
        }
@@ -256,7 +244,7 @@ class LanguageTest extends MediaWikiTestCase {
                // Actual HTML...
                $this->assertEquals(
                        $expected,
-                       $this->lang->truncateHTML( $input, $len, $ellipsis )
+                       $this->getLang()->truncateHTML( $input, $len, $ellipsis )
                );
        }
 
@@ -355,7 +343,7 @@ class LanguageTest extends MediaWikiTestCase {
        function testSprintfDate( $format, $ts, $expected, $msg ) {
                $this->assertEquals(
                        $expected,
-                       $this->lang->sprintfDate( $format, $ts ),
+                       $this->getLang()->sprintfDate( $format, $ts ),
                        "sprintfDate('$format', '$ts'): $msg"
                );
        }
@@ -372,7 +360,7 @@ class LanguageTest extends MediaWikiTestCase {
 
                $this->assertEquals(
                        $expected,
-                       $this->lang->sprintfDate( $format, $ts ),
+                       $this->getLang()->sprintfDate( $format, $ts ),
                        "sprintfDate('$format', '$ts'): $msg"
                );
 
@@ -680,7 +668,7 @@ class LanguageTest extends MediaWikiTestCase {
        function testFormatSize( $size, $expected, $msg ) {
                $this->assertEquals(
                        $expected,
-                       $this->lang->formatSize( $size ),
+                       $this->getLang()->formatSize( $size ),
                        "formatSize('$size'): $msg"
                );
        }
@@ -742,7 +730,7 @@ class LanguageTest extends MediaWikiTestCase {
        function testFormatBitrate( $bps, $expected, $msg ) {
                $this->assertEquals(
                        $expected,
-                       $this->lang->formatBitrate( $bps ),
+                       $this->getLang()->formatBitrate( $bps ),
                        "formatBitrate('$bps'): $msg"
                );
        }
@@ -815,7 +803,7 @@ class LanguageTest extends MediaWikiTestCase {
        function testFormatDuration( $duration, $expected, $intervals = array() ) {
                $this->assertEquals(
                        $expected,
-                       $this->lang->formatDuration( $duration, $intervals ),
+                       $this->getLang()->formatDuration( $duration, $intervals ),
                        "formatDuration('$duration'): $expected"
                );
        }
@@ -950,7 +938,7 @@ class LanguageTest extends MediaWikiTestCase {
        function testCheckTitleEncoding( $s ) {
                $this->assertEquals(
                        $s,
-                       $this->lang->checkTitleEncoding($s),
+                       $this->getLang()->checkTitleEncoding($s),
                        "checkTitleEncoding('$s')"
                );
        }
@@ -1065,5 +1053,62 @@ class LanguageTest extends MediaWikiTestCase {
                        array( 10000, 'MMMMMMMMMM' ),
                );
        }
+
+       /**
+        * @dataProvider providePluralData
+        */
+       function testConvertPlural( $expected, $number, $forms ) {
+               $chosen = $this->getLang()->convertPlural( $number, $forms );
+               $this->assertEquals( $expected, $chosen );
+       }
+
+       function providePluralData() {
+               return array(
+                       array( 'explicit zero', 0, array(
+                               '0=explicit zero', 'singular', 'plural'
+                       ) ),
+                       array( 'explicit one', 1, array(
+                               'singular', 'plural', '1=explicit one',
+                       ) ),
+                       array( 'singular', 1, array(
+                               'singular', 'plural', '0=explicit zero',
+                       ) ),
+                       array( 'plural', 3, array(
+                               '0=explicit zero', '1=explicit one', 'singular', 'plural'
+                       ) ),
+               );
+       }
+
+       /**
+        * @covers Language::translateBlockExpiry()
+        * @dataProvider provideTranslateBlockExpiry
+        */
+       function testTranslateBlockExpiry( $expectedData, $str, $desc ) {
+               $lang = $this->getLang();
+               if ( is_array( $expectedData ) ) {
+                       list( $func, $arg ) = $expectedData;
+                       $expected = $lang->$func( $arg );
+               } else {
+                       $expected = $expectedData;
+               }
+               $this->assertEquals( $expected, $lang->translateBlockExpiry( $str ), $desc );
+       }
+
+       function provideTranslateBlockExpiry() {
+               return array(
+                       array( '2 hours', '2 hours', 'simple data from ipboptions' ),
+                       array( 'indefinite', 'infinite', 'infinite from ipboptions' ),
+                       array( 'indefinite', 'infinity', 'alternative infinite from ipboptions' ),
+                       array( 'indefinite', 'indefinite', 'another alternative infinite from ipboptions' ),
+                       array( array( 'formatDuration', 1023 * 60 * 60 ), '1023 hours', 'relative' ),
+                       array( array( 'formatDuration', -1023 ), '-1023 seconds', 'negative relative' ),
+                       array( array( 'formatDuration', 0 ), 'now', 'now' ),
+                       array( array( 'timeanddate', '20120102070000' ), '2012-1-1 7:00 +1 day', 'mixed, handled as absolute' ),
+                       array( array( 'timeanddate', '19910203040506' ), '1991-2-3 4:05:06', 'absolute' ),
+                       array( array( 'timeanddate', '19700101000000' ), '1970-1-1 0:00:00', 'absolute at epoch' ),
+                       array( array( 'timeanddate', '19691231235959' ), '1969-12-31 23:59:59', 'time before epoch' ),
+                       array( 'dummy', 'dummy', 'return garbage as is' ),
+               );
+       }
 }
 
index 4bfaa00..259e007 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageTi.php */
-class LanguageTiTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Ti' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageTiTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'many' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index a1facd1..bf3dafc 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageTl.php */
-class LanguageTlTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Tl' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageTlTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'many' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index bda4c9d..e4859df 100644 (file)
@@ -6,15 +6,7 @@
  */
 
 /** Tests for MediaWiki languages/LanguageTr.php */
-class LanguageTrTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Tr' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageTrTest extends LanguageClassesTestCase {
 
        /**
         * See @bug 28040
@@ -27,9 +19,9 @@ class LanguageTrTest extends MediaWikiTestCase {
         */
        function testDottedAndDotlessI( $func, $input, $inputCase, $expected ) {
                if( $func == 'ucfirst' ) {
-                       $res = $this->lang->ucfirst( $input );
+                       $res = $this->getLang()->ucfirst( $input );
                } elseif( $func == 'lcfirst' ) {
-                       $res = $this->lang->lcfirst( $input );
+                       $res = $this->getLang()->lcfirst( $input );
                } else {
                        throw new MWException( __METHOD__ . " given an invalid function name '$func'" );
                }
index 60fafb0..f29b90b 100644 (file)
@@ -7,20 +7,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageUk.php */
-class LanguageUkTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Uk' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageUkTest extends LanguageClassesTestCase {
 
        /** @dataProvider providePluralFourForms */
        function testPluralFourForms( $result, $value ) {
                $forms = array( 'one', 'few', 'many', 'other' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providePluralFourForms() {
@@ -41,7 +33,7 @@ class LanguageUkTest extends MediaWikiTestCase {
        /** @dataProvider providePluralTwoForms */
        function testPluralTwoForms( $result, $value ) {
                $forms = array( 'one', 'several' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
        function providePluralTwoForms() {
                return array (
index 7238728..99607d1 100644 (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 );
-       }
+class LanguageUzTest extends LanguageClassesTestCase {
 
        /**
         * @author Nikola Smolenski
@@ -109,7 +100,7 @@ class LanguageUzTest extends MediaWikiTestCase {
 
        /** Wrapper for converter::convertTo() method*/
        function convertTo( $text, $variant ) {
-               return $this->lang->mConverter->convertTo( $text, $variant );
+               return $this->getLang()->mConverter->convertTo( $text, $variant );
        }
        function convertToCyrillic( $text ) {
                return $this->convertTo( $text, 'uz-cyrl' );
index 172f19b..4a1c0e7 100644 (file)
@@ -6,20 +6,12 @@
  */
 
 /** Tests for MediaWiki languages/classes/LanguageWa.php */
-class LanguageWaTest extends MediaWikiTestCase {
-       private $lang;
-
-       function setUp() {
-               $this->lang = Language::factory( 'Wa' );
-       }
-       function tearDown() {
-               unset( $this->lang );
-       }
+class LanguageWaTest extends LanguageClassesTestCase {
 
        /** @dataProvider providerPlural */
        function testPlural( $result, $value ) {
                $forms = array( 'one', 'many' );
-               $this->assertEquals( $result, $this->lang->convertPlural( $value, $forms ) );
+               $this->assertEquals( $result, $this->getLang()->convertPlural( $value, $forms ) );
        }
 
        function providerPlural() {
index d134438..0f3a6a1 100644 (file)
@@ -35,7 +35,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @throws MWExcepion
         */
        protected function addRevision( Page $page, $text, $summary ) {
-               $status = $page->doEdit( $text, $summary );
+               $status = $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), $summary );
                if ( $status->isGood() ) {
                        $value = $status->getValue();
                        $revision = $value['revision'];
@@ -72,7 +72,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         *
         * Clears $wgUser, and reports errors from addDBData to PHPUnit
         */
-       public function setUp() {
+       protected function setUp() {
                global $wgUser;
 
                parent::setUp();
@@ -295,9 +295,12 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
         * @param $text_sha1 string: the base36 SHA-1 of the revision's text
         * @param $text string|false: (optional) The revision's string, or false to check for a
         *            revision stub
+        * @param $model String: the expected content model id (default: CONTENT_MODEL_WIKITEXT)
+        * @param $format String: the expected format model id (default: CONTENT_FORMAT_WIKITEXT)
         * @param $parentid int|false: (optional) id of the parent revision
         */
-       protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false ) {
+       protected function assertRevision( $id, $summary, $text_id, $text_bytes, $text_sha1, $text = false, $parentid = false,
+                                               $model = CONTENT_MODEL_WIKITEXT, $format = CONTENT_FORMAT_WIKITEXT ) {
 
                $this->assertNodeStart( "revision" );
                $this->skipWhitespace();
@@ -315,9 +318,33 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                $this->skipWhitespace();
 
                $this->assertTextNode( "comment", $summary );
+               $this->skipWhitespace();
+
+               if ( $this->xml->name == "text" ) {
+                       // note: <text> tag may occur here or at the very end.
+                       $text_found = true;
+                       $this->assertText( $id, $text_id, $text_bytes, $text );
+               } else {
+                       $text_found = false;
+               }
 
                $this->assertTextNode( "sha1", $text_sha1 );
 
+               $this->assertTextNode( "model", $model );
+               $this->skipWhitespace();
+
+               $this->assertTextNode( "format", $format );
+               $this->skipWhitespace();
+
+               if ( !$text_found ) {
+                       $this->assertText( $id, $text_id, $text_bytes, $text );
+               }
+
+               $this->assertNodeEnd( "revision" );
+               $this->skipWhitespace();
+       }
+
+       protected function assertText( $id, $text_id, $text_bytes, $text ) {
                $this->assertNodeStart( "text", false );
                if ( $text_bytes !== false ) {
                        $this->assertEquals( $this->xml->getAttribute( "bytes" ), $text_bytes,
@@ -344,9 +371,5 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                        $this->assertNodeEnd( "text" );
                        $this->skipWhitespace();
                }
-
-               $this->assertNodeEnd( "revision" );
-               $this->skipWhitespace();
        }
-
 }
index 8ff8557..a029c92 100644 (file)
@@ -156,7 +156,7 @@ class BaseDumpTest extends MediaWikiTestCase {
   <siteinfo>
     <sitename>wikisvn</sitename>
     <base>http://localhost/wiki-svn/index.php/Main_Page</base>
-    <generator>MediaWiki 1.20alpha</generator>
+    <generator>MediaWiki 1.21alpha</generator>
     <case>first-letter</case>
     <namespaces>
       <namespace key="-2" case="first-letter">Media</namespace>
@@ -199,6 +199,8 @@ class BaseDumpTest extends MediaWikiTestCase {
       <comment>BackupDumperTestP1Summary1</comment>
       <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
       <text xml:space="preserve">BackupDumperTestP1Text1</text>
+      <model name="wikitext">1</model>
+      <format mime="text/x-wiki">1</format>
     </revision>
   </page>
 ';
@@ -216,6 +218,8 @@ class BaseDumpTest extends MediaWikiTestCase {
       <comment>BackupDumperTestP2Summary1</comment>
       <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
       <text xml:space="preserve">BackupDumperTestP2Text1</text>
+      <model name="wikitext">1</model>
+      <format mime="text/x-wiki">1</format>
     </revision>
     <revision>
       <id>5</id>
@@ -227,6 +231,8 @@ class BaseDumpTest extends MediaWikiTestCase {
       <comment>BackupDumperTestP2Summary4 extra</comment>
       <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
       <text xml:space="preserve">BackupDumperTestP2Text4 some additional Text</text>
+      <model name="wikitext">1</model>
+      <format mime="text/x-wiki">1</format>
     </revision>
   </page>
 ';
@@ -243,6 +249,8 @@ class BaseDumpTest extends MediaWikiTestCase {
       </contributor>
       <comment>Talk BackupDumperTestP1 Summary1</comment>
       <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+      <model name="wikitext">1</model>
+      <format mime="text/x-wiki">1</format>
       <text xml:space="preserve">Talk about BackupDumperTestP1 Text1</text>
     </revision>
   </page>
index a0bbadf..2ebb351 100644 (file)
@@ -26,16 +26,18 @@ class TextPassDumperTest extends DumpTestCase {
                $this->tablesUsed[] = 'revision';
                $this->tablesUsed[] = 'text';
 
+               $ns = $this->getDefaultWikitextNS();
+
                try {
                        // Simple page
-                       $title = Title::newFromText( 'BackupDumperTestP1' );
+                       $title = Title::newFromText( 'BackupDumperTestP1', $ns );
                        $page = WikiPage::factory( $title );
                        list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
                        $this->pageId1 = $page->getId();
 
                        // Page with more than one revision
-                       $title = Title::newFromText( 'BackupDumperTestP2' );
+                       $title = Title::newFromText( 'BackupDumperTestP2', $ns );
                        $page = WikiPage::factory( $title );
                        list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
@@ -49,7 +51,7 @@ class TextPassDumperTest extends DumpTestCase {
                        $this->pageId2 = $page->getId();
 
                        // Deleted page.
-                       $title = Title::newFromText( 'BackupDumperTestP3' );
+                       $title = Title::newFromText( 'BackupDumperTestP3', $ns );
                        $page = WikiPage::factory( $title );
                        list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
@@ -59,6 +61,13 @@ class TextPassDumperTest extends DumpTestCase {
                        $page->doDeleteArticle( "Testing ;)" );
 
                        // Page from non-default namespace
+
+                       if ( $ns === NS_TALK ) {
+                               //@todo: work around this.
+                               throw new MWException( "The default wikitext namespace is the talk namespace. "
+                                       . " We can't currently deal with that.");
+                       }
+
                        $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
                        $page = WikiPage::factory( $title );
                        list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
@@ -74,7 +83,7 @@ class TextPassDumperTest extends DumpTestCase {
 
        }
 
-       public function setUp() {
+       protected function setUp() {
                parent::setUp();
 
                // Since we will restrict dumping by page ranges (to allow
@@ -383,7 +392,7 @@ class TextPassDumperTest extends DumpTestCase {
                $this->assertEmpty( $files, "Remaining unchecked files" );
 
                // ... and have dealt with more than one checkpoint file
-               $this->assertGreaterThan( 1, $checkpointFiles, "# of checkpoint files" );
+               $this->assertGreaterThan( 1, $checkpointFiles, "expected more than 1 checkpoint to have been created. Checkpoint interval is $checkpointAfter seconds, maybe your computer is too fast?" );
 
                $this->expectETAOutput();
        }
@@ -438,7 +447,7 @@ class TextPassDumperTest extends DumpTestCase {
   <siteinfo>
     <sitename>wikisvn</sitename>
     <base>http://localhost/wiki-svn/index.php/Main_Page</base>
-    <generator>MediaWiki 1.20alpha</generator>
+    <generator>MediaWiki 1.21alpha</generator>
     <case>first-letter</case>
     <namespaces>
       <namespace key="-2" case="first-letter">Media</namespace>
@@ -481,6 +490,8 @@ class TextPassDumperTest extends DumpTestCase {
       </contributor>
       <comment>BackupDumperTestP1Summary1</comment>
       <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
       <text id="' . $this->textId1_1 . '" bytes="23" />
     </revision>
   </page>
@@ -497,6 +508,8 @@ class TextPassDumperTest extends DumpTestCase {
       </contributor>
       <comment>BackupDumperTestP2Summary1</comment>
       <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
       <text id="' . $this->textId2_1 . '" bytes="23" />
     </revision>
     <revision>
@@ -508,6 +521,8 @@ class TextPassDumperTest extends DumpTestCase {
       </contributor>
       <comment>BackupDumperTestP2Summary2</comment>
       <sha1>b7vj5ks32po5m1z1t1br4o7scdwwy95</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
       <text id="' . $this->textId2_2 . '" bytes="23" />
     </revision>
     <revision>
@@ -519,6 +534,8 @@ class TextPassDumperTest extends DumpTestCase {
       </contributor>
       <comment>BackupDumperTestP2Summary3</comment>
       <sha1>jfunqmh1ssfb8rs43r19w98k28gg56r</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
       <text id="' . $this->textId2_3 . '" bytes="23" />
     </revision>
     <revision>
@@ -530,6 +547,8 @@ class TextPassDumperTest extends DumpTestCase {
       </contributor>
       <comment>BackupDumperTestP2Summary4 extra</comment>
       <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
       <text id="' . $this->textId2_4 . '" bytes="44" />
     </revision>
   </page>
@@ -548,6 +567,8 @@ class TextPassDumperTest extends DumpTestCase {
       </contributor>
       <comment>Talk BackupDumperTestP1 Summary1</comment>
       <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
+      <model>wikitext</model>
+      <format>text/x-wiki</format>
       <text id="' . $this->textId4_1 . '" bytes="35" />
     </revision>
   </page>
index 925e277..227e04a 100644 (file)
@@ -10,11 +10,13 @@ class BackupDumperPageTest extends DumpTestCase {
        // We'll add several pages, revision and texts. The following variables hold the
        // corresponding ids.
        private $pageId1, $pageId2, $pageId3, $pageId4, $pageId5;
+       private $pageTitle1, $pageTitle2, $pageTitle3, $pageTitle4, $pageTitle5;
        private $revId1_1, $textId1_1;
        private $revId2_1, $textId2_1, $revId2_2, $textId2_2;
        private $revId2_3, $textId2_3, $revId2_4, $textId2_4;
        private $revId3_1, $textId3_1, $revId3_2, $textId3_2;
        private $revId4_1, $textId4_1;
+       private $namespace, $talk_namespace;
 
        function addDBData() {
                $this->tablesUsed[] = 'page';
@@ -22,14 +24,23 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->tablesUsed[] = 'text';
 
                try {
-                       $title = Title::newFromText( 'BackupDumperTestP1' );
-                       $page = WikiPage::factory( $title );
+                       $this->namespace = $this->getDefaultWikitextNS();
+                       $this->talk_namespace = NS_TALK;
+
+                       if ( $this->namespace === $this->talk_namespace ) {
+                               //@todo: work around this.
+                               throw new MWException( "The default wikitext namespace is the talk namespace. "
+                                       . " We can't currently deal with that.");
+                       }
+
+                       $this->pageTitle1 = Title::newFromText( 'BackupDumperTestP1', $this->namespace );
+                       $page = WikiPage::factory( $this->pageTitle1 );
                        list( $this->revId1_1, $this->textId1_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP1Text1", "BackupDumperTestP1Summary1" );
                        $this->pageId1 = $page->getId();
 
-                       $title = Title::newFromText( 'BackupDumperTestP2' );
-                       $page = WikiPage::factory( $title );
+                       $this->pageTitle2 = Title::newFromText( 'BackupDumperTestP2', $this->namespace );
+                       $page = WikiPage::factory( $this->pageTitle2 );
                        list( $this->revId2_1, $this->textId2_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP2Text1", "BackupDumperTestP2Summary1" );
                        list( $this->revId2_2, $this->textId2_2 ) = $this->addRevision( $page,
@@ -41,8 +52,8 @@ class BackupDumperPageTest extends DumpTestCase {
                                "BackupDumperTestP2Summary4 extra " );
                        $this->pageId2 = $page->getId();
 
-                       $title = Title::newFromText( 'BackupDumperTestP3' );
-                       $page = WikiPage::factory( $title );
+                       $this->pageTitle3 = Title::newFromText( 'BackupDumperTestP3', $this->namespace );
+                       $page = WikiPage::factory( $this->pageTitle3 );
                        list( $this->revId3_1, $this->textId3_1 ) = $this->addRevision( $page,
                                "BackupDumperTestP3Text1", "BackupDumperTestP2Summary1" );
                        list( $this->revId3_2, $this->textId3_2 ) = $this->addRevision( $page,
@@ -50,8 +61,8 @@ class BackupDumperPageTest extends DumpTestCase {
                        $this->pageId3 = $page->getId();
                        $page->doDeleteArticle( "Testing ;)" );
 
-                       $title = Title::newFromText( 'BackupDumperTestP1', NS_TALK );
-                       $page = WikiPage::factory( $title );
+                       $this->pageTitle4 = Title::newFromText( 'BackupDumperTestP1', $this->talk_namespace );
+                       $page = WikiPage::factory( $this->pageTitle4 );
                        list( $this->revId4_1, $this->textId4_1 ) = $this->addRevision( $page,
                                "Talk about BackupDumperTestP1 Text1",
                                "Talk BackupDumperTestP1 Summary1" );
@@ -65,9 +76,14 @@ class BackupDumperPageTest extends DumpTestCase {
 
        }
 
-       public function setUp() {
+       protected function setUp() {
                parent::setUp();
 
+               $this->setMwGlobals( array(
+                       'wgLanguageCode' => 'en',
+                       'wgContLang' => Language::factory( 'en' ),
+               ));
+
                // Since we will restrict dumping by page ranges (to allow
                // working tests, even if the db gets prepopulated by a base
                // class), we have to assert, that the page id are consecutively
@@ -95,14 +111,14 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fname );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87",
                        "BackupDumperTestP1Text1" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
                        $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2",
                        "BackupDumperTestP2Text1" );
@@ -121,7 +137,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe",
                        "Talk about BackupDumperTestP1 Text1" );
@@ -146,13 +162,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fname );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
                        $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
                $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
@@ -167,7 +183,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -191,13 +207,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fname );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
                $this->assertPageEnd();
@@ -206,7 +222,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -231,13 +247,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fname );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
                $this->assertPageEnd();
@@ -246,7 +262,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -300,13 +316,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fnameMetaHistory );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_1, "BackupDumperTestP2Summary1",
                        $this->textId2_1, 23, "jprywrymfhysqllua29tj3sc7z39dl2" );
                $this->assertRevision( $this->revId2_2, "BackupDumperTestP2Summary2",
@@ -321,7 +337,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -334,13 +350,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fnameMetaCurrent );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
                $this->assertPageEnd();
@@ -349,7 +365,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               $this->assertPageStart( $this->pageId4, NS_TALK, "Talk:BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId4, $this->talk_namespace, $this->pageTitle4->getPrefixedText() );
                $this->assertRevision( $this->revId4_1, "Talk BackupDumperTestP1 Summary1",
                        $this->textId4_1, 35, "nktofwzd0tl192k3zfepmlzxoax1lpe" );
                $this->assertPageEnd();
@@ -362,13 +378,13 @@ class BackupDumperPageTest extends DumpTestCase {
                $this->assertDumpStart( $fnameArticles );
 
                // Page 1
-               $this->assertPageStart( $this->pageId1, NS_MAIN, "BackupDumperTestP1" );
+               $this->assertPageStart( $this->pageId1, $this->namespace, $this->pageTitle1->getPrefixedText() );
                $this->assertRevision( $this->revId1_1, "BackupDumperTestP1Summary1",
                        $this->textId1_1, 23, "0bolhl6ol7i6x0e7yq91gxgaan39j87" );
                $this->assertPageEnd();
 
                // Page 2
-               $this->assertPageStart( $this->pageId2, NS_MAIN, "BackupDumperTestP2" );
+               $this->assertPageStart( $this->pageId2, $this->namespace, $this->pageTitle2->getPrefixedText() );
                $this->assertRevision( $this->revId2_4, "BackupDumperTestP2Summary4 extra",
                        $this->textId2_4, 44, "6o1ciaxa6pybnqprmungwofc4lv00wv", false, $this->revId2_3 );
                $this->assertPageEnd();
@@ -377,7 +393,7 @@ class BackupDumperPageTest extends DumpTestCase {
                // -> Page is marked deleted. Hence not visible
 
                // Page 4
-               // -> Page is not in NS_MAIN. Hence not visible
+               // -> Page is not in $this->namespace. Hence not visible
 
                $this->assertDumpEnd();
 
index e7ffa01..8041e35 100644 (file)
@@ -111,7 +111,7 @@ class FetchTextTest extends MediaWikiTestCase {
         * @throws MWExcepion
         */
        private function addRevision( $page, $text, $summary ) {
-               $status = $page->doEdit( $text, $summary );
+               $status = $page->doEditContent( ContentHandler::makeContent( $text, $page->getTitle() ), $summary );
                if ( $status->isGood() ) {
                        $value = $status->getValue();
                        $revision = $value['revision'];
@@ -129,12 +129,14 @@ class FetchTextTest extends MediaWikiTestCase {
                $this->tablesUsed[] = 'revision';
                $this->tablesUsed[] = 'text';
 
+               $wikitextNamespace = $this->getDefaultWikitextNS();
+
                try {
-                       $title = Title::newFromText( 'FetchTextTestPage1' );
+                       $title = Title::newFromText( 'FetchTextTestPage1', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
                        $this->textId1 = $this->addRevision( $page, "FetchTextTestPage1Text1", "FetchTextTestPage1Summary1" );
 
-                       $title = Title::newFromText( 'FetchTextTestPage2' );
+                       $title = Title::newFromText( 'FetchTextTestPage2', $wikitextNamespace );
                        $page = WikiPage::factory( $title );
                        $this->textId2 = $this->addRevision( $page, "FetchTextTestPage2Text1", "FetchTextTestPage2Summary1" );
                        $this->textId3 = $this->addRevision( $page, "FetchTextTestPage2Text2", "FetchTextTestPage2Summary2" );
diff --git a/tests/phpunit/resources/ResourcesTest.php b/tests/phpunit/resources/ResourcesTest.php
new file mode 100644 (file)
index 0000000..18db399
--- /dev/null
@@ -0,0 +1,128 @@
+<?php
+/**
+ * Sanity checks for making sure registered resources are sane.
+ *
+ * @file
+ * @author Niklas Laxström, 2012
+ * @author Antoine Musso, 2012
+ * @author Santhosh Thottingal, 2012
+ * @author Timo Tijhof, 2012
+ * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
+ */
+class ResourcesTest extends MediaWikiTestCase {
+
+       /**
+        * @dataProvider provideResourceFiles
+        */
+       public function testFileExistence( $filename, $module, $resource ) {
+               $this->assertFileExists( $filename,
+                       "File '$resource' referenced by '$module' must exist."
+               );
+       }
+
+       /**
+        * This ask the ResouceLoader for all registered files from modules
+        * created by ResourceLoaderFileModule (or one of its descendants).
+        *
+        *
+        * Since the raw data is stored in protected properties, we have to
+        * overrride this through ReflectionObject methods.
+        */
+       public static function provideResourceFiles() {
+               global $wgEnableJavaScriptTest;
+
+               // Test existance of test suite files as well
+               // (can't use setUp or setMwGlobals because providers are static)
+               $live_wgEnableJavaScriptTest = $wgEnableJavaScriptTest;
+               $wgEnableJavaScriptTest = true;
+
+               // Array with arguments for the test function
+               $cases = array();
+
+               // Initialize ResourceLoader
+               $rl = new ResourceLoader();
+
+               // See also ResourceLoaderFileModule::__construct
+               $filePathProps = array(
+                       // Lists of file paths
+                       'lists' => array(
+                               'scripts',
+                               'debugScripts',
+                               'loaderScripts',
+                               'styles',
+                       ),
+
+                       // Collated lists of file paths
+                       'nested-lists' => array(
+                               'languageScripts',
+                               'skinScripts',
+                               'skinStyles',
+                       ),
+               );
+
+               foreach ( $rl->getModuleNames() as $moduleName ) {
+                       $module = $rl->getModule( $moduleName );
+                       if ( ! $module instanceof ResourceLoaderFileModule ) {
+                               continue;
+                       }
+
+                       $reflectedModule = new ReflectionObject( $module );
+
+                       $files = array();
+
+                       foreach ( $filePathProps['lists'] as $propName ) {
+                               $property = $reflectedModule->getProperty( $propName );
+                               $property->setAccessible( true );
+                               $list = $property->getValue( $module );
+                               foreach ( $list as $key => $value ) {
+                                       // 'scripts' are numeral arrays.
+                                       // 'styles' can be numeral or associative.
+                                       // In case of associative the key is the file path
+                                       // and the value is the 'media' attribute.
+                                       if ( is_int( $key ) ) {
+                                               $files[] = $value;
+                                       } else {
+                                               $files[] = $key;
+                                       }
+                               }
+                       }
+
+                       foreach ( $filePathProps['nested-lists'] as $propName ) {
+                               $property = $reflectedModule->getProperty( $propName );
+                               $property->setAccessible( true );
+                               $lists = $property->getValue( $module );
+                               foreach ( $lists as $group => $list ) {
+                                       foreach ( $list as $key => $value ) {
+                                               // We need the same filter as for 'lists',
+                                               // due to 'skinStyles'.
+                                               if ( is_int( $key ) ) {
+                                                       $files[] = $value;
+                                               } else {
+                                                       $files[] = $key;
+                                               }
+                                       }
+                               }
+                       }
+
+                       // Get method for resolving the paths to full paths
+                       $method = $reflectedModule->getMethod( 'getLocalPath' );
+                       $method->setAccessible( true );
+
+                       // Populate cases
+                       foreach ( $files as $file ) {
+                               $cases[] = array(
+                                       $method->invoke( $module, $file ),
+                                       $module->getName(),
+                                       $file,
+                               );
+                       }
+
+               }
+
+               // Restore settings
+               $wgEnableJavaScriptTest = $live_wgEnableJavaScriptTest;
+
+               return $cases;
+       }
+
+}
index 912d760..89337f4 100644 (file)
@@ -33,13 +33,13 @@ class SideBarTest extends MediaWikiLangTestCase {
                }
        }
 
-       function setUp() {
+       protected function setUp() {
                parent::setUp();
                $this->initMessagesHref();
                $this->skin = new SkinTemplate();
                $this->skin->getContext()->setLanguage( Language::factory( 'en' ) );
        }
-       function tearDown() {
+       protected function tearDown() {
                parent::tearDown();
                $this->skin = null;
        }
index f263811..843aaf9 100644 (file)
@@ -15,7 +15,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                return true;
        }
 
-       function setUp() {
+       protected function setUp() {
                global $wgParser, $wgParserConf, $IP, $messageMemc, $wgMemc,
                          $wgUser, $wgLang, $wgOut, $wgRequest, $wgStyleDirectory, $wgEnableParserCache,
                          $wgNamespaceAliases, $wgNamespaceProtection, $parserMemc;
@@ -79,7 +79,7 @@ class UploadFromUrlTestSuite extends PHPUnit_Framework_TestSuite {
                FileBackendGroup::destroySingleton();
        }
 
-       public function tearDown() {
+       protected function tearDown() {
                foreach ( $this->savedGlobals as $var => $val ) {
                        $GLOBALS[$var] = $val;
                }
index 59ae73c..01072d8 100644 (file)
@@ -13,12 +13,14 @@ return array(
                        '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.hidpi.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.highlightText.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.localize.test.js',
                        'tests/qunit/suites/resources/jquery/jquery.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/data/mediawiki.jqueryMsg.data.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',
@@ -40,6 +42,7 @@ return array(
                        'jquery.colorUtil',
                        'jquery.delayedBind',
                        'jquery.getAttrs',
+                       'jquery.hidpi',
                        'jquery.highlightText',
                        'jquery.localize',
                        'jquery.mwExtension',
diff --git a/tests/qunit/data/generateJqueryMsgData.php b/tests/qunit/data/generateJqueryMsgData.php
new file mode 100644 (file)
index 0000000..911dc3a
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+/**
+ * This PHP script defines the spec that the mediawiki.jqueryMsg module should conform to.
+ *
+ * It does this by looking up the results of various kinds of string parsing, with various
+ * languages, in the current installation of MediaWiki. It then outputs a static specification,
+ * mapping expected inputs to outputs, which can be used fed into a unit test framework.
+ * (QUnit, Jasmine, anything, it just outputs an object with key/value pairs).
+ *
+ * This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't
+ * look up the API results while doing the test, so the test run is much faster (at the cost
+ * of being out of date in rare circumstances. But mostly the parsing that we are doing in
+ * Javascript doesn't change much).
+ */
+
+/*
+ * @example QUnit
+ * <code>
+       QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+               mw.messages.set( mw.libs.phpParserData.messages );
+               $.each( mw.libs.phpParserData.tests, function ( i, test ) {
+                       QUnit.stop();
+                       getMwLanguage( test.lang, function ( langClass ) {
+                               var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                               assert.equal(
+                                       parser.parse( test.key, test.args ).html(),
+                                       test.result,
+                                       test.name
+                               );
+                               QUnit.start();
+                       } );
+               } );
+       });
+ * </code>
+ *
+ * @example Jasmine
+ * <code>
+       describe( 'match output to output from PHP parser', function () {
+               mw.messages.set( mw.libs.phpParserData.messages );
+               $.each( mw.libs.phpParserData.tests, function ( i, test ) {
+                       it( 'should parse ' + test.name, function () {
+                               var langClass;
+                               runs( function () {
+                                       getMwLanguage( test.lang, function ( gotIt ) {
+                                               langClass = gotIt;
+                                       });
+                               });
+                               waitsFor( function () {
+                                       return langClass !== undefined;
+                               }, 'Language class should be loaded', 1000 );
+                               runs( function () {
+                                       console.log( test.lang, 'running tests' );
+                                       var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                                       expect(
+                                               parser.parse( test.key, test.args ).html()
+                                       ).toEqual( test.result );
+                               } );
+                       } );
+               } );
+       } );
+ * </code>
+ */
+
+$maintenanceDir = dirname( dirname( dirname( __DIR__ ) ) ) . '/maintenance';
+
+require( "$maintenanceDir/Maintenance.php" );
+
+class GenerateJqueryMsgData extends Maintenance {
+
+       static $keyToTestArgs = array(
+               'undelete_short' => array(
+                       array( 0 ),
+                       array( 1 ),
+                       array( 2 ),
+                       array( 5 ),
+                       array( 21 ),
+                       array( 101 )
+               ),
+               'category-subcat-count' => array(
+                       array( 0, 10 ),
+                       array( 1, 1 ),
+                       array( 1, 2 ),
+                       array( 3, 30 )
+               )
+       );
+
+       public function __construct() {
+                       parent::__construct();
+                       $this->mDescription = 'Create a specification for message parsing ini JSON format';
+                       // add any other options here
+       }
+
+       public function execute() {
+               list( $messages, $tests ) = $this->getMessagesAndTests();
+               $this->writeJavascriptFile( $messages, $tests, __DIR__ . '/mediawiki.jqueryMsg.data.js' );
+       }
+
+       private function getMessagesAndTests() {
+               $messages = array();
+               $tests = array();
+               foreach ( array( 'en', 'fr', 'ar', 'jp', 'zh' ) as $languageCode ) {
+                       foreach ( self::$keyToTestArgs as $key => $testArgs ) {
+                               foreach ($testArgs as $args) {
+                                       // Get the raw message, without any transformations.
+                                       $template = wfMessage( $key )->inLanguage( $languageCode )->plain();
+
+                                       // Get the magic-parsed version with args.
+                                       $result = wfMessage( $key, $args )->inLanguage( $languageCode )->text();
+
+                                       // Record the template, args, language, and expected result
+                                       // fake multiple languages by flattening them together.
+                                       $langKey = $languageCode . '_' . $key;
+                                       $messages[$langKey] = $template;
+                                       $tests[] = array(
+                                               'name' => $languageCode . ' ' . $key . ' ' . join( ',', $args ),
+                                               'key' => $langKey,
+                                               'args' => $args,
+                                               'result' => $result,
+                                               'lang' => $languageCode
+                                       );
+                               }
+                       }
+               }
+               return array( $messages, $tests );
+       }
+
+       private function writeJavascriptFile( $messages, $tests, $dataSpecFile ) {
+               $phpParserData = array(
+                       'messages' => $messages,
+                       'tests' => $tests,
+               );
+
+               $output =
+                       "// This file stores the output from the PHP parser for various messages, arguments,\n"
+                       . "// languages, and parser modes. Intended for use by a unit test framework by looping\n"
+                       . "// through the object and comparing its parser return value with the 'result' property.\n"
+                       . '// Last generated with ' . basename( __FILE__ ) . ' at ' . gmdate( 'r' ) . "\n"
+                       // This file will contain unquoted JSON strings as javascript native object literals,
+                       // flip the quotemark convention for this file.
+                       . "/*jshint quotmark: double */\n"
+                       . "\n"
+                       . 'mediaWiki.libs.phpParserData = ' . FormatJson::encode( $phpParserData, true ) . ";\n";
+
+               $fp = file_put_contents( $dataSpecFile, $output );
+               if ( $fp === false ) {
+                       die( "Couldn't write to $dataSpecFile." );
+               }
+       }
+}
+
+$maintClass = "GenerateJqueryMsgData";
+require_once( "$maintenanceDir/doMaintenance.php" );
diff --git a/tests/qunit/data/mediawiki.jqueryMsg.data.js b/tests/qunit/data/mediawiki.jqueryMsg.data.js
new file mode 100644 (file)
index 0000000..776ee24
--- /dev/null
@@ -0,0 +1,492 @@
+// This file stores the output from the PHP parser for various messages, arguments,
+// languages, and parser modes. Intended for use by a unit test framework by looping
+// through the object and comparing its parser return value with the 'result' property.
+// Last generated with generateJqueryMsgData.php at Sat, 03 Nov 2012 21:32:01 +0000
+/*jshint quotmark: double */
+
+mediaWiki.libs.phpParserData = {
+       "messages": {
+               "en_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+               "en_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.}}",
+               "fr_undelete_short": "Restaurer $1 modification{{PLURAL:$1||s}}",
+               "fr_category-subcat-count": "Cette cat\u00e9gorie comprend {{PLURAL:$2|la sous-cat\u00e9gorie|$2 sous-cat\u00e9gories, dont {{PLURAL:$1|celle|les $1}}}} ci-dessous.",
+               "ar_undelete_short": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 {{PLURAL:$1|\u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f|\u062a\u0639\u062f\u064a\u0644\u064a\u0646|$1 \u062a\u0639\u062f\u064a\u0644\u0627\u062a|$1 \u062a\u0639\u062f\u064a\u0644|$1 \u062a\u0639\u062f\u064a\u0644\u0627}}",
+               "ar_category-subcat-count": "{{PLURAL:$2|\u0644\u0627 \u062a\u0635\u0627\u0646\u064a\u0641 \u0641\u0631\u0639\u064a\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.|\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 {{PLURAL:$1||\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a|\u0647\u0630\u064a\u0646 \u0627\u0644\u062a\u0635\u0646\u064a\u0641\u064a\u0646 \u0627\u0644\u0641\u0631\u0639\u064a\u064a\u0646|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641\u0627 \u0641\u0631\u0639\u064a\u0627|\u0647\u0630\u0647 \u0627\u0644$1 \u062a\u0635\u0646\u064a\u0641 \u0641\u0631\u0639\u064a}}\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a $2.}}",
+               "jp_undelete_short": "Undelete {{PLURAL:$1|one edit|$1 edits}}",
+               "jp_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.}}",
+               "zh_undelete_short": "\u6062\u590d$1\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
+               "zh_category-subcat-count": "{{PLURAL:$2|\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002|\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u5217$1\u4e2a\u5b50\u5206\u7c7b\uff0c\u5171$2\u4e2a\u5b50\u5206\u7c7b\u3002}}"
+       },
+       "tests": [
+               {
+                       "name": "en undelete_short 0",
+                       "key": "en_undelete_short",
+                       "args": [
+                               0
+                       ],
+                       "result": "Undelete 0 edits",
+                       "lang": "en"
+               },
+               {
+                       "name": "en undelete_short 1",
+                       "key": "en_undelete_short",
+                       "args": [
+                               1
+                       ],
+                       "result": "Undelete one edit",
+                       "lang": "en"
+               },
+               {
+                       "name": "en undelete_short 2",
+                       "key": "en_undelete_short",
+                       "args": [
+                               2
+                       ],
+                       "result": "Undelete 2 edits",
+                       "lang": "en"
+               },
+               {
+                       "name": "en undelete_short 5",
+                       "key": "en_undelete_short",
+                       "args": [
+                               5
+                       ],
+                       "result": "Undelete 5 edits",
+                       "lang": "en"
+               },
+               {
+                       "name": "en undelete_short 21",
+                       "key": "en_undelete_short",
+                       "args": [
+                               21
+                       ],
+                       "result": "Undelete 21 edits",
+                       "lang": "en"
+               },
+               {
+                       "name": "en undelete_short 101",
+                       "key": "en_undelete_short",
+                       "args": [
+                               101
+                       ],
+                       "result": "Undelete 101 edits",
+                       "lang": "en"
+               },
+               {
+                       "name": "en category-subcat-count 0,10",
+                       "key": "en_category-subcat-count",
+                       "args": [
+                               0,
+                               10
+                       ],
+                       "result": "This category has the following 0 subcategories, out of 10 total.",
+                       "lang": "en"
+               },
+               {
+                       "name": "en category-subcat-count 1,1",
+                       "key": "en_category-subcat-count",
+                       "args": [
+                               1,
+                               1
+                       ],
+                       "result": "This category has only the following subcategory.",
+                       "lang": "en"
+               },
+               {
+                       "name": "en category-subcat-count 1,2",
+                       "key": "en_category-subcat-count",
+                       "args": [
+                               1,
+                               2
+                       ],
+                       "result": "This category has the following subcategory, out of 2 total.",
+                       "lang": "en"
+               },
+               {
+                       "name": "en category-subcat-count 3,30",
+                       "key": "en_category-subcat-count",
+                       "args": [
+                               3,
+                               30
+                       ],
+                       "result": "This category has the following 3 subcategories, out of 30 total.",
+                       "lang": "en"
+               },
+               {
+                       "name": "fr undelete_short 0",
+                       "key": "fr_undelete_short",
+                       "args": [
+                               0
+                       ],
+                       "result": "Restaurer 0 modification",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr undelete_short 1",
+                       "key": "fr_undelete_short",
+                       "args": [
+                               1
+                       ],
+                       "result": "Restaurer 1 modification",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr undelete_short 2",
+                       "key": "fr_undelete_short",
+                       "args": [
+                               2
+                       ],
+                       "result": "Restaurer 2 modifications",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr undelete_short 5",
+                       "key": "fr_undelete_short",
+                       "args": [
+                               5
+                       ],
+                       "result": "Restaurer 5 modifications",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr undelete_short 21",
+                       "key": "fr_undelete_short",
+                       "args": [
+                               21
+                       ],
+                       "result": "Restaurer 21 modifications",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr undelete_short 101",
+                       "key": "fr_undelete_short",
+                       "args": [
+                               101
+                       ],
+                       "result": "Restaurer 101 modifications",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr category-subcat-count 0,10",
+                       "key": "fr_category-subcat-count",
+                       "args": [
+                               0,
+                               10
+                       ],
+                       "result": "Cette cat\u00e9gorie comprend 10 sous-cat\u00e9gories, dont celle ci-dessous.",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr category-subcat-count 1,1",
+                       "key": "fr_category-subcat-count",
+                       "args": [
+                               1,
+                               1
+                       ],
+                       "result": "Cette cat\u00e9gorie comprend la sous-cat\u00e9gorie ci-dessous.",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr category-subcat-count 1,2",
+                       "key": "fr_category-subcat-count",
+                       "args": [
+                               1,
+                               2
+                       ],
+                       "result": "Cette cat\u00e9gorie comprend 2 sous-cat\u00e9gories, dont celle ci-dessous.",
+                       "lang": "fr"
+               },
+               {
+                       "name": "fr category-subcat-count 3,30",
+                       "key": "fr_category-subcat-count",
+                       "args": [
+                               3,
+                               30
+                       ],
+                       "result": "Cette cat\u00e9gorie comprend 30 sous-cat\u00e9gories, dont les 3 ci-dessous.",
+                       "lang": "fr"
+               },
+               {
+                       "name": "ar undelete_short 0",
+                       "key": "ar_undelete_short",
+                       "args": [
+                               0
+                       ],
+                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644 \u0648\u0627\u062d\u062f",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar undelete_short 1",
+                       "key": "ar_undelete_short",
+                       "args": [
+                               1
+                       ],
+                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 \u062a\u0639\u062f\u064a\u0644\u064a\u0646",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar undelete_short 2",
+                       "key": "ar_undelete_short",
+                       "args": [
+                               2
+                       ],
+                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 2 \u062a\u0639\u062f\u064a\u0644\u0627\u062a",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar undelete_short 5",
+                       "key": "ar_undelete_short",
+                       "args": [
+                               5
+                       ],
+                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 5 \u062a\u0639\u062f\u064a\u0644",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar undelete_short 21",
+                       "key": "ar_undelete_short",
+                       "args": [
+                               21
+                       ],
+                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 21 \u062a\u0639\u062f\u064a\u0644\u0627",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar undelete_short 101",
+                       "key": "ar_undelete_short",
+                       "args": [
+                               101
+                       ],
+                       "result": "\u0627\u0633\u062a\u0631\u062c\u0627\u0639 101 \u062a\u0639\u062f\u064a\u0644\u0627",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar category-subcat-count 0,10",
+                       "key": "ar_category-subcat-count",
+                       "args": [
+                               0,
+                               10
+                       ],
+                       "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 10.",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar category-subcat-count 1,1",
+                       "key": "ar_category-subcat-count",
+                       "args": [
+                               1,
+                               1
+                       ],
+                       "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u0642\u0637.",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar category-subcat-count 1,2",
+                       "key": "ar_category-subcat-count",
+                       "args": [
+                               1,
+                               2
+                       ],
+                       "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 2.",
+                       "lang": "ar"
+               },
+               {
+                       "name": "ar category-subcat-count 3,30",
+                       "key": "ar_category-subcat-count",
+                       "args": [
+                               3,
+                               30
+                       ],
+                       "result": "\u0647\u0630\u0627 \u0627\u0644\u062a\u0635\u0646\u064a\u0641 \u0641\u064a\u0647 \u0647\u0630\u0647 \u0627\u06443 \u062a\u0635\u0627\u0646\u064a\u0641 \u0627\u0644\u0641\u0631\u0639\u064a\u0629\u060c \u0645\u0646 \u0625\u062c\u0645\u0627\u0644\u064a 30.",
+                       "lang": "ar"
+               },
+               {
+                       "name": "jp undelete_short 0",
+                       "key": "jp_undelete_short",
+                       "args": [
+                               0
+                       ],
+                       "result": "Undelete 0 edits",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp undelete_short 1",
+                       "key": "jp_undelete_short",
+                       "args": [
+                               1
+                       ],
+                       "result": "Undelete one edit",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp undelete_short 2",
+                       "key": "jp_undelete_short",
+                       "args": [
+                               2
+                       ],
+                       "result": "Undelete 2 edits",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp undelete_short 5",
+                       "key": "jp_undelete_short",
+                       "args": [
+                               5
+                       ],
+                       "result": "Undelete 5 edits",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp undelete_short 21",
+                       "key": "jp_undelete_short",
+                       "args": [
+                               21
+                       ],
+                       "result": "Undelete 21 edits",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp undelete_short 101",
+                       "key": "jp_undelete_short",
+                       "args": [
+                               101
+                       ],
+                       "result": "Undelete 101 edits",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp category-subcat-count 0,10",
+                       "key": "jp_category-subcat-count",
+                       "args": [
+                               0,
+                               10
+                       ],
+                       "result": "This category has the following 0 subcategories, out of 10 total.",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp category-subcat-count 1,1",
+                       "key": "jp_category-subcat-count",
+                       "args": [
+                               1,
+                               1
+                       ],
+                       "result": "This category has only the following subcategory.",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp category-subcat-count 1,2",
+                       "key": "jp_category-subcat-count",
+                       "args": [
+                               1,
+                               2
+                       ],
+                       "result": "This category has the following subcategory, out of 2 total.",
+                       "lang": "jp"
+               },
+               {
+                       "name": "jp category-subcat-count 3,30",
+                       "key": "jp_category-subcat-count",
+                       "args": [
+                               3,
+                               30
+                       ],
+                       "result": "This category has the following 3 subcategories, out of 30 total.",
+                       "lang": "jp"
+               },
+               {
+                       "name": "zh undelete_short 0",
+                       "key": "zh_undelete_short",
+                       "args": [
+                               0
+                       ],
+                       "result": "\u6062\u590d0\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh undelete_short 1",
+                       "key": "zh_undelete_short",
+                       "args": [
+                               1
+                       ],
+                       "result": "\u6062\u590d1\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh undelete_short 2",
+                       "key": "zh_undelete_short",
+                       "args": [
+                               2
+                       ],
+                       "result": "\u6062\u590d2\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh undelete_short 5",
+                       "key": "zh_undelete_short",
+                       "args": [
+                               5
+                       ],
+                       "result": "\u6062\u590d5\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh undelete_short 21",
+                       "key": "zh_undelete_short",
+                       "args": [
+                               21
+                       ],
+                       "result": "\u6062\u590d21\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh undelete_short 101",
+                       "key": "zh_undelete_short",
+                       "args": [
+                               101
+                       ],
+                       "result": "\u6062\u590d101\u4e2a\u88ab\u5220\u9664\u7684\u7f16\u8f91",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh category-subcat-count 0,10",
+                       "key": "zh_category-subcat-count",
+                       "args": [
+                               0,
+                               10
+                       ],
+                       "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52170\u4e2a\u5b50\u5206\u7c7b\uff0c\u517110\u4e2a\u5b50\u5206\u7c7b\u3002",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh category-subcat-count 1,1",
+                       "key": "zh_category-subcat-count",
+                       "args": [
+                               1,
+                               1
+                       ],
+                       "result": "\u672c\u5206\u7c7b\u53ea\u6709\u4e0b\u5217\u4e00\u4e2a\u5b50\u5206\u7c7b\u3002",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh category-subcat-count 1,2",
+                       "key": "zh_category-subcat-count",
+                       "args": [
+                               1,
+                               2
+                       ],
+                       "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52171\u4e2a\u5b50\u5206\u7c7b\uff0c\u51712\u4e2a\u5b50\u5206\u7c7b\u3002",
+                       "lang": "zh"
+               },
+               {
+                       "name": "zh category-subcat-count 3,30",
+                       "key": "zh_category-subcat-count",
+                       "args": [
+                               3,
+                               30
+                       ],
+                       "result": "\u672c\u5206\u7c7b\u5305\u542b\u4e0b\u52173\u4e2a\u5b50\u5206\u7c7b\uff0c\u517130\u4e2a\u5b50\u5206\u7c7b\u3002",
+                       "lang": "zh"
+               }
+       ]
+};
index 093c71f..1870d5a 100644 (file)
 header( 'Content-Type: text/css; charset=utf-8' );
 
 /**
- * Allows characters in ranges [a-z], [A-Z], [0-9] as well as a dot ("."), dash ("-") and hash ("#").
+ * Allows characters in ranges [a-z], [A-Z] and [0-9],
+ * in addition to a dot ("."), dash ("-"), space (" ") and hash ("#").
  * @since 1.20
  *
- * @param $val string
- * @return string: input with illigal characters removed 
+ * @param string $val
+ * @return string Value with any illegal characters removed.
  */
 function cssfilter( $val ) {
-       return preg_replace( '/[^A-Za-z0-9\.\-#]/', '', $val );
+       return preg_replace( '/[^A-Za-z0-9\.\- #]/', '', $val );
 }
 
 // Do basic sanitization
index efa6549..0c3d364 100644 (file)
-( function ( $, mw, QUnit, undefined ) {
 /*global CompletenessTest */
-/*jshint evil:true */
-'use strict';
-
-var mwTestIgnore, mwTester, addons;
-
-/**
- * Add bogus to url to prevent IE crazy caching
- *
- * @param value {String} a relative path (eg. 'data/foo.js'
- * or 'data/test.php?foo=bar').
- * @return {String} Such as 'data/foo.js?131031765087663960'
- */
-QUnit.fixurl = function ( value ) {
-       return value + (/\?/.test( value ) ? '&' : '?')
-               + String( new Date().getTime() )
-               + String( parseInt( Math.random() * 100000, 10 ) );
-};
-
-/**
- * Configuration
- */
-
-// When a test() indicates asynchronicity with stop(),
-// allow 10 seconds to pass before killing the test(),
-// and assuming failure.
-QUnit.config.testTimeout = 10 * 1000;
-
-// Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
-QUnit.config.urlConfig.push( {
-       id: 'debug',
-       label: 'Enable ResourceLoaderDebug',
-       tooltip: 'Enable debug mode in ResourceLoader'
-} );
-
-/**
- * Load TestSwarm agent
- */
-// Only if the current url indicates that there is a TestSwarm instance watching us
-// (TestSwarm appends swarmURL to the test suites url it loads in iframes).
-// Otherwise this is just a simple view of Special:JavaScriptTest/qunit directly,
-// no point in loading inject.js in that case. Also, make sure that this instance
-// of MediaWiki has actually been configured with the required url to that inject.js
-// script. By default it is false.
-if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) {
-       document.write( "<scr" + "ipt src='" + QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) + "'></scr" + "ipt>" );
-}
-
-/**
- * CompletenessTest
- */
-// Adds toggle checkbox to header
-QUnit.config.urlConfig.push( {
-       id: 'completenesstest',
-       label: 'Run CompletenessTest',
-       tooltip: 'Run the completeness test'
-} );
-
-// Initiate when enabled
-if ( QUnit.urlParams.completenesstest ) {
-
-       // Return true to ignore
-       mwTestIgnore = function ( val, tester, funcPath ) {
-
-               // Don't record methods of the properties of constructors,
-               // to avoid getting into a loop (prototype.constructor.prototype..).
-               // Since we're therefor skipping any injection for
-               // "new mw.Foo()", manually set it to true here.
-               if ( val instanceof mw.Map ) {
-                       tester.methodCallTracker.Map = true;
-                       return true;
-               }
-               if ( val instanceof mw.Title ) {
-                       tester.methodCallTracker.Title = true;
-                       return true;
-               }
-
-               // Don't record methods of the properties of a jQuery object
-               if ( val instanceof $ ) {
-                       return true;
-               }
-
-               return false;
+/*jshint evil: true */
+( function ( $, mw, QUnit, undefined ) {
+       'use strict';
+
+       var mwTestIgnore, mwTester,
+               addons,
+               envExecCount;
+
+       /**
+        * Add bogus to url to prevent IE crazy caching
+        *
+        * @param value {String} a relative path (eg. 'data/foo.js'
+        * or 'data/test.php?foo=bar').
+        * @return {String} Such as 'data/foo.js?131031765087663960'
+        */
+       QUnit.fixurl = function ( value ) {
+               return value + (/\?/.test( value ) ? '&' : '?')
+                       + String( new Date().getTime() )
+                       + String( parseInt( Math.random() * 100000, 10 ) );
        };
 
-       mwTester = new CompletenessTest( mw, mwTestIgnore );
-}
-
-/**
- * Test environment recommended for all QUnit test modules
- */
-// Whether to log environment changes to the console
-QUnit.config.urlConfig.push( 'mwlogenv' );
-
-/**
- * Reset mw.config and others to a fresh copy of the live config for each test(),
- * and restore it back to the live one afterwards.
- * @param localEnv {Object} [optional]
- * @example (see test suite at the bottom of this file)
- * </code>
- */
-QUnit.newMwEnvironment = ( function () {
-       var log, liveConfig, liveMessages;
-
-       liveConfig = mw.config.values;
-       liveMessages = mw.messages.values;
-
-       function freshConfigCopy( custom ) {
-               // "deep=true" is important here.
-               // Otherwise we just create a new object with values referring to live config.
-               // e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
-               // but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
-               // was passed by reference in $.extend's loop.
-               return $.extend( {}, liveConfig, custom, /*deep=*/true );
+       /**
+        * Configuration
+        */
+
+       // When a test() indicates asynchronicity with stop(),
+       // allow 10 seconds to pass before killing the test(),
+       // and assuming failure.
+       QUnit.config.testTimeout = 10 * 1000;
+
+       // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
+       QUnit.config.urlConfig.push( {
+               id: 'debug',
+               label: 'Enable ResourceLoaderDebug',
+               tooltip: 'Enable debug mode in ResourceLoader'
+       } );
+
+       /**
+        * Load TestSwarm agent
+        */
+       // Only if the current url indicates that there is a TestSwarm instance watching us
+       // (TestSwarm appends swarmURL to the test suites url it loads in iframes).
+       // Otherwise this is just a simple view of Special:JavaScriptTest/qunit directly,
+       // no point in loading inject.js in that case. Also, make sure that this instance
+       // of MediaWiki has actually been configured with the required url to that inject.js
+       // script. By default it is false.
+       if ( QUnit.urlParams.swarmURL && mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) {
+               document.write( '<scr' + 'ipt src="' + QUnit.fixurl( mw.config.get( 'QUnitTestSwarmInjectJSPath' ) ) + '"></scr' + 'ipt>' );
        }
 
-       function freshMessagesCopy( custom ) {
-               return $.extend( {}, liveMessages, custom, /*deep=*/true );
+       /**
+        * CompletenessTest
+        */
+       // Adds toggle checkbox to header
+       QUnit.config.urlConfig.push( {
+               id: 'completenesstest',
+               label: 'Run CompletenessTest',
+               tooltip: 'Run the completeness test'
+       } );
+
+       // Initiate when enabled
+       if ( QUnit.urlParams.completenesstest ) {
+
+               // Return true to ignore
+               mwTestIgnore = function ( val, tester ) {
+
+                       // Don't record methods of the properties of constructors,
+                       // to avoid getting into a loop (prototype.constructor.prototype..).
+                       // Since we're therefor skipping any injection for
+                       // "new mw.Foo()", manually set it to true here.
+                       if ( val instanceof mw.Map ) {
+                               tester.methodCallTracker.Map = true;
+                               return true;
+                       }
+                       if ( val instanceof mw.Title ) {
+                               tester.methodCallTracker.Title = true;
+                               return true;
+                       }
+
+                       // Don't record methods of the properties of a jQuery object
+                       if ( val instanceof $ ) {
+                               return true;
+                       }
+
+                       return false;
+               };
+
+               mwTester = new CompletenessTest( mw, mwTestIgnore );
        }
 
-       log = QUnit.urlParams.mwlogenv ? mw.log : function () {};
+       /**
+        * Test environment recommended for all QUnit test modules
+        */
+       // Whether to log environment changes to the console
+       QUnit.config.urlConfig.push( 'mwlogenv' );
+
+       /**
+        * Reset mw.config and others to a fresh copy of the live config for each test(),
+        * and restore it back to the live one afterwards.
+        * @param localEnv {Object} [optional]
+        * @example (see test suite at the bottom of this file)
+        * </code>
+        */
+       QUnit.newMwEnvironment = ( function () {
+               var log, liveConfig, liveMessages;
+
+               liveConfig = mw.config.values;
+               liveMessages = mw.messages.values;
+
+               function freshConfigCopy( custom ) {
+                       // "deep=true" is important here.
+                       // Otherwise we just create a new object with values referring to live config.
+                       // e.g. mw.config.set( 'wgFileExtensions', [] ) would not effect liveConfig,
+                       // but mw.config.get( 'wgFileExtensions' ).push( 'png' ) would as the array
+                       // was passed by reference in $.extend's loop.
+                       return $.extend( {}, liveConfig, custom, /*deep=*/true );
+               }
 
-       return function ( localEnv ) {
-               localEnv = $.extend( {
-                       // QUnit
-                       setup: $.noop,
-                       teardown: $.noop,
-                       // MediaWiki
-                       config: {},
-                       messages: {}
-               }, localEnv );
+               function freshMessagesCopy( custom ) {
+                       return $.extend( {}, liveMessages, custom, /*deep=*/true );
+               }
 
-               return {
-                       setup: function () {
-                               log( 'MwEnvironment> SETUP    for "' + QUnit.config.current.module
-                                       + ': ' + QUnit.config.current.testName + '"' );
+               log = QUnit.urlParams.mwlogenv ? mw.log : function () {};
+
+               return function ( localEnv ) {
+                       localEnv = $.extend( {
+                               // QUnit
+                               setup: $.noop,
+                               teardown: $.noop,
+                               // MediaWiki
+                               config: {},
+                               messages: {}
+                       }, localEnv );
+
+                       return {
+                               setup: function () {
+                                       log( 'MwEnvironment> SETUP    for "' + QUnit.config.current.module
+                                               + ': ' + QUnit.config.current.testName + '"' );
+
+                                       // Greetings, mock environment!
+                                       mw.config.values = freshConfigCopy( localEnv.config );
+                                       mw.messages.values = freshMessagesCopy( localEnv.messages );
+
+                                       localEnv.setup();
+                               },
+
+                               teardown: function () {
+                                       log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
+                                               + ': ' + QUnit.config.current.testName + '"' );
+
+                                       localEnv.teardown();
+
+                                       // Farewell, mock environment!
+                                       mw.config.values = liveConfig;
+                                       mw.messages.values = liveMessages;
+                               }
+                       };
+               };
+       }() );
 
-                               // Greetings, mock environment!
-                               mw.config.values = freshConfigCopy( localEnv.config );
-                               mw.messages.values = freshMessagesCopy( localEnv.messages );
+       // $.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 = [];
 
-                               localEnv.setup();
-                       },
+               $.each( arguments, function ( i, arg ) {
+                       var alt = $.Deferred();
+                       altPromises.push( alt );
 
-                       teardown: function () {
-                               log( 'MwEnvironment> TEARDOWN for "' + QUnit.config.current.module
-                                       + ': ' + QUnit.config.current.testName + '"' );
+                       // Whether this one fails or not, forwards it to
+                       // the 'done' (resolve) callback of the alternative promise.
+                       arg.always( alt.resolve );
+               });
 
-                               localEnv.teardown();
+               return $.when.apply( $, altPromises );
+       };
 
-                               // Farewell, mock environment!
-                               mw.config.values = liveConfig;
-                               mw.messages.values = liveMessages;
-                       }
-               };
+       /**
+        * Add-on assertion helpers
+        */
+       // Define the add-ons
+       addons = {
+
+               // Expect boolean true
+               assertTrue: function ( actual, message ) {
+                       QUnit.push( actual === true, actual, true, message );
+               },
+
+               // Expect boolean false
+               assertFalse: function ( actual, message ) {
+                       QUnit.push( actual === false, actual, false, message );
+               },
+
+               // Expect numerical value less than X
+               lt: function ( actual, expected, message ) {
+                       QUnit.push( actual < expected, actual, 'less than ' + expected, message );
+               },
+
+               // Expect numerical value less than or equal to X
+               ltOrEq: function ( actual, expected, message ) {
+                       QUnit.push( actual <= expected, actual, 'less than or equal to ' + expected, message );
+               },
+
+               // Expect numerical value greater than X
+               gt: function ( actual, expected, message ) {
+                       QUnit.push( actual > expected, actual, 'greater than ' + expected, message );
+               },
+
+               // 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 );
+               }
        };
-}() );
 
-// $.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 = [];
+       $.extend( QUnit.assert, addons );
+
+       /**
+        * Small test suite to confirm proper functionality of the utilities and
+        * initializations defined above in this file.
+        */
+       envExecCount = 0;
+       QUnit.module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment({
+               setup: function () {
+                       envExecCount += 1;
+                       this.mwHtmlLive = mw.html;
+                       mw.html = {
+                               escape: function () {
+                                       return 'mocked-' + envExecCount;
+                               }
+                       };
+               },
+               teardown: function () {
+                       mw.html = this.mwHtmlLive;
+               },
+               config: {
+                       testVar: 'foo'
+               },
+               messages: {
+                       testMsg: 'Foo.'
+               }
+       }) );
 
-       $.each( arguments, function ( i, arg ) {
-               var alt = $.Deferred();
-               altPromises.push( alt );
+       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' );
 
-               // Whether this one fails or not, forwards it to
-               // the 'done' (resolve) callback of the alternative promise.
-               arg.always( alt.resolve );
+               mw.config.set( 'testVar', 'bar' );
+               mw.messages.set( 'testMsg', 'Bar.' );
        });
 
-       return $.when.apply( $, altPromises );
-};
-
-/**
- * Add-on assertion helpers
- */
-// Define the add-ons
-addons = {
-
-       // Expect boolean true
-       assertTrue: function ( actual, message ) {
-               QUnit.push( actual === true, actual, true, message );
-       },
-
-       // Expect boolean false
-       assertFalse: function ( actual, message ) {
-               QUnit.push( actual === false, actual, false, message );
-       },
-
-       // Expect numerical value less than X
-       lt: function ( actual, expected, message ) {
-               QUnit.push( actual < expected, actual, 'less than ' + expected, message );
-       },
-
-       // Expect numerical value less than or equal to X
-       ltOrEq: function ( actual, expected, message ) {
-               QUnit.push( actual <= expected, actual, 'less than or equal to ' + expected, message );
-       },
-
-       // Expect numerical value greater than X
-       gt: function ( actual, expected, message ) {
-               QUnit.push( actual > expected, actual, 'greater than ' + expected, message );
-       },
-
-       // 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 );
-       }
-};
-
-$.extend( QUnit.assert, addons );
-
-/**
- * Small test suite to confirm proper functionality of the utilities and
- * initializations in this file.
- */
-var envExecCount = 0;
-QUnit.module( 'mediawiki.tests.qunit.testrunner', QUnit.newMwEnvironment({
-       setup: function () {
-               envExecCount += 1;
-               this.mwHtmlLive = mw.html;
-               mw.html = {
-                       escape: function () {
-                               return 'mocked-' + envExecCount;
-                       }
-               };
-       },
-       teardown: function () {
-               mw.html = this.mwHtmlLive;
-       },
-       config: {
-               testVar: 'foo'
-       },
-       messages: {
-               testMsg: 'Foo.'
-       }
-}) );
-
-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.' );
-});
-
-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()' );
-});
-
-QUnit.module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
-
-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()' );
-});
+       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()' );
+       });
+
+       QUnit.module( 'mediawiki.tests.qunit.testrunner-after', QUnit.newMwEnvironment() );
+
+       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 ) );
index 0dee2ef..feeec55 100644 (file)
@@ -1,52 +1,58 @@
-( function ( mw, $ ) {
+( function ( $ ) {
 
-QUnit.module( 'jquery.autoEllipsis', QUnit.newMwEnvironment() );
+       QUnit.module( 'jquery.autoEllipsis', QUnit.newMwEnvironment() );
 
-function createWrappedDiv( text, width ) {
-       var $wrapper = $( '<div>' ).css( 'width', width );
-       var $div = $( '<div>' ).text( text );
-       $wrapper.append( $div );
-       return $wrapper;
-}
-
-function findDivergenceIndex( a, b ) {
-       var i = 0;
-       while ( i < a.length && i < b.length && a[i] === b[i] ) {
-               i++;
+       function createWrappedDiv( text, width ) {
+               var $wrapper = $( '<div>' ).css( 'width', width ),
+                       $div = $( '<div>' ).text( text );
+               $wrapper.append( $div );
+               return $wrapper;
        }
-       return i;
-}
-
-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' );
-       $( '#qunit-fixture' ).append( $wrapper );
-       $wrapper.autoEllipsis( { position: 'right' } );
-
-       // Verify that, and only one, span element was created
-       var $span = $wrapper.find( '> span' );
-       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' );
-       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] + '...';
-
-       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 ) {
-               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 {
-               assert.gt( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more)' );
+
+       function findDivergenceIndex( a, b ) {
+               var i = 0;
+               while ( i < a.length && i < b.length && a[i] === b[i] ) {
+                       i++;
+               }
+               return i;
        }
-});
 
-}( mediaWiki, jQuery ) );
+       QUnit.test( 'Position right', 4, function ( assert ) {
+               // We need this thing to be visible, so append it to the DOM
+               var $span, spanText, d, spanTextNew,
+                       origText = 'This is a really long random string and there is no way it fits in 100 pixels.',
+                       $wrapper = createWrappedDiv( origText, '100px' );
+
+               $( '#qunit-fixture' ).append( $wrapper );
+               $wrapper.autoEllipsis( { position: 'right' } );
+
+               // Verify that, and only one, span element was created
+               $span = $wrapper.find( '> span' );
+               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' );
+               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
+               spanText = $span.text();
+               d = findDivergenceIndex( origText, spanText );
+               spanTextNew = spanText.substr( 0, d ) + origText[d] + origText[d] + '...';
+
+               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 ) {
+                       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 {
+                       assert.gt( $span.width(), $span.parent().width(), 'Fit is maximal (adding two characters makes it not fit any more)' );
+               }
+       });
+
+}( jQuery ) );
index 8d4ac03..378ea4b 100644 (file)
@@ -1,33 +1,35 @@
-QUnit.module( 'jquery.byteLength', QUnit.newMwEnvironment() );
+( function ( $ ) {
+       QUnit.module( 'jquery.byteLength', QUnit.newMwEnvironment() );
 
-QUnit.test( 'Simple text', 5, function ( assert ) {
-       var     azLc = 'abcdefghijklmnopqrstuvwxyz',
-               azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
-               num = '0123456789',
-               x = '*',
-               space = '   ';
+       QUnit.test( 'Simple text', 5, function ( assert ) {
+               var     azLc = 'abcdefghijklmnopqrstuvwxyz',
+                       azUc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+                       num = '0123456789',
+                       x = '*',
+                       space = '   ';
 
-       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' );
+               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' );
 
-} );
+       } );
 
-QUnit.test( 'Special text', 5, function ( assert ) {
-       // http://en.wikipedia.org/wiki/UTF-8
-       var     U_0024 = '\u0024',
-               U_00A2 = '\u00A2',
-               U_20AC = '\u20AC',
-               U_024B62 = '\u024B62',
-               // The normal one doesn't display properly, try the below which is the same
-               // according to http://www.fileformat.info/info/unicode/char/24B62/index.htm
-               U_024B62_alt = '\uD852\uDF62';
+       QUnit.test( 'Special text', 5, function ( assert ) {
+               // http://en.wikipedia.org/wiki/UTF-8
+               var u0024 = '$',
+                       u00A2 = '\u00A2',
+                       u20AC = '\u20AC',
+                       u024B62 = '\u024B62',
+                       // The normal one doesn't display properly, try the below which is the same
+                       // according to http://www.fileformat.info/info/unicode/char/24B62/index.htm
+                       u024B62alt = '\uD852\uDF62';
 
-       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' );
-} );
+               assert.strictEqual( $.byteLength( u0024 ), 1, 'U+0024: 1 byte. $ (dollar sign)' );
+               assert.strictEqual( $.byteLength( u00A2 ), 2, 'U+00A2: 2 bytes. \u00A2 (cent sign)' );
+               assert.strictEqual( $.byteLength( u20AC ), 3, 'U+20AC: 3 bytes. \u20AC (euro sign)' );
+               assert.strictEqual( $.byteLength( u024B62 ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character)' );
+               assert.strictEqual( $.byteLength( u024B62alt ), 4, 'U+024B62: 4 bytes. \uD852\uDF62 (a Han character) - alternative method' );
+       } );
+}( jQuery ) );
index 23a93a7..2990de2 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function ( $, mw ) {
        var simpleSample, U_20AC, mbSample;
 
        QUnit.module( 'jquery.byteLimit', QUnit.newMwEnvironment() );
 
        // Basic sendkey-implementation
        function addChars( $input, charstr ) {
-               var len, i, prevVal, code, event;
-               len = charstr.length;
-               for ( i = 0; i < len; i += 1 ) {
-                       // Keep track of the previous value
-                       prevVal = $input.val();
-
-                       // Get the key code
-                       code = charstr.charCodeAt( i );
-
-                       // Trigger event and undo if prevented
-                       event = new jQuery.Event( 'keypress', {
-                               which: code,
-                               keyCode: code,
-                               charCode: code
-                       } );
-                       $input.trigger( event );
-                       if ( !event.isDefaultPrevented() ) {
-                               $input.val( prevVal + charstr.charAt( i ) );
-                       }
+               var c, len;
+               function x( $input, i ) {
+                       // Add character to the value
+                       return $input.val() + charstr.charAt( i );
+               }
+               for ( c = 0, len = charstr.length; c < len; c += 1 ) {
+                       $input
+                               .val( x( $input, c ) )
+                               .trigger( 'change' );
                }
        }
 
                        limit: null
                }, options);
 
-               QUnit.test( opt.description, function ( assert ) {
-                       var rawVal, fn, newVal;
+               QUnit.asyncTest( opt.description, opt.hasLimit ? 3 : 2, function ( assert ) {
+               setTimeout( function () {
+                       var rawVal, fn, effectiveVal;
 
                        opt.$input.appendTo( '#qunit-fixture' );
 
                        // Simulate pressing keys for each of the sample characters
                        addChars( opt.$input, opt.sample );
+
                        rawVal = opt.$input.val();
-                       fn = opt.$input.data( 'byteLimit-callback' );
-                       newVal = $.isFunction( fn ) ? fn( rawVal ) : rawVal;
+                       fn = opt.$input.data( 'byteLimit.callback' );
+                       effectiveVal = fn ? fn( rawVal ) : rawVal;
 
                        if ( opt.hasLimit ) {
-                               QUnit.expect(3);
-
                                assert.ltOrEq(
-                                       $.byteLength( newVal ),
+                                       $.byteLength( effectiveVal ),
                                        opt.limit,
                                        'Prevent keypresses after byteLimit was reached, length never exceeded the limit'
                                );
                                assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
 
                        } else {
-                               QUnit.expect(2);
-                               assert.equal( newVal, opt.expected, 'New value matches the expected string' );
                                assert.equal(
-                                       $.byteLength( newVal ),
+                                       $.byteLength( effectiveVal ),
                                        $.byteLength( opt.expected ),
                                        'Unlimited scenarios are not affected, expected length reached'
                                );
+                               assert.equal( rawVal, opt.expected, 'New value matches the expected string' );
                        }
+                       QUnit.start();
+               }, 10 );
                } );
        }
 
        byteLimitTest({
                description: 'Plain text input',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' ),
+               $input: $( '<input type="text"/>' ),
                sample: simpleSample,
                hasLimit: false,
                expected: simpleSample
        });
 
        byteLimitTest({
-               description: 'Plain text input. Calling byteLimit with no parameters and no maxLength property (bug 36310)',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' )
+               description: 'Plain text input. Calling byteLimit with no parameters and no maxlength attribute (bug 36310)',
+               $input: $( '<input type="text"/>' )
                        .byteLimit(),
                sample: simpleSample,
                hasLimit: false,
 
        byteLimitTest({
                description: 'Limit using the maxlength attribute',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' )
-                       .prop( 'maxLength', '10' )
+               $input: $( '<input type="text"/>' )
+                       .attr( 'maxlength', '10' )
                        .byteLimit(),
                sample: simpleSample,
                hasLimit: true,
 
        byteLimitTest({
                description: 'Limit using a custom value',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' )
+               $input: $( '<input type="text"/>' )
                        .byteLimit( 10 ),
                sample: simpleSample,
                hasLimit: true,
 
        byteLimitTest({
                description: 'Limit using a custom value, overriding maxlength attribute',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' )
-                       .prop( 'maxLength', '10' )
+               $input: $( '<input type="text"/>' )
+                       .attr( 'maxlength', '10' )
                        .byteLimit( 15 ),
                sample: simpleSample,
                hasLimit: true,
 
        byteLimitTest({
                description: 'Limit using a custom value (multibyte)',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' )
+               $input: $( '<input type="text"/>' )
                        .byteLimit( 14 ),
                sample: mbSample,
                hasLimit: true,
 
        byteLimitTest({
                description: 'Limit using a custom value (multibyte) overlapping a byte',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' )
+               $input: $( '<input type="text"/>' )
                        .byteLimit( 12 ),
                sample: mbSample,
                hasLimit: true,
 
        byteLimitTest({
                description: 'Pass the limit and a callback as input filter',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' )
+               $input: $( '<input type="text"/>' )
                        .byteLimit( 6, function ( val ) {
                                // Invalid title
                                if ( val === '' ) {
 
        byteLimitTest({
                description: 'Limit using the maxlength attribute and pass a callback as input filter',
-               $input: $( '<input>' )
-                       .attr( 'type', 'text' )
-                       .prop( 'maxLength', '6' )
+               $input: $( '<input type="text"/>' )
+                       .attr( 'maxlength', '6' )
                        .byteLimit( function ( val ) {
                                // Invalid title
                                if ( val === '' ) {
                expected: 'User:Sample'
        });
 
-       QUnit.test( 'Confirm properties and attributes set', 5, function ( assert ) {
+       QUnit.test( 'Confirm properties and attributes set', 4, function ( assert ) {
                var $el, $elA, $elB;
 
-               $el = $( '<input>' )
-                       .attr( 'type', 'text' )
-                       .prop( 'maxLength', '7' )
+               $el = $( '<input type="text"/>' )
+                       .attr( 'maxlength', '7' )
                        .appendTo( '#qunit-fixture' )
                        .byteLimit();
 
-               assert.strictEqual( $el.prop( 'maxLength' ), 7, 'Pre-set maxLength property unchanged' );
+               assert.strictEqual( $el.attr( 'maxlength' ), '7', 'maxlength attribute unchanged for simple limit' );
 
-               $el = $( '<input>' )
-                       .attr( 'type', 'text' )
-                       .prop( 'maxLength', '7' )
+               $el = $( '<input type="text"/>' )
+                       .attr( 'maxlength', '7' )
                        .appendTo( '#qunit-fixture' )
                        .byteLimit( 12 );
 
-               assert.strictEqual( $el.prop( 'maxLength' ), 12, 'maxLength property updated if value was passed to $.fn.byteLimit' );
+               assert.strictEqual( $el.attr( 'maxlength' ), '12', 'maxlength attribute updated for custom limit' );
+
+               $el = $( '<input type="text"/>' )
+                       .attr( 'maxlength', '7' )
+                       .appendTo( '#qunit-fixture' )
+                       .byteLimit( 12, function ( val ) {
+                               return val;
+                       } );
 
-               $elA = $( '<input>' )
+               assert.strictEqual( $el.attr( 'maxlength' ), undefined, 'maxlength attribute removed for limit with callback' );
+
+               $elA = $( '<input type="text"/>' )
                        .addClass( 'mw-test-byteLimit-foo' )
-                       .attr( 'type', 'text' )
-                       .prop( 'maxLength', '7' )
+                       .attr( 'maxlength', '7' )
                        .appendTo( '#qunit-fixture' );
 
-               $elB = $( '<input>' )
+               $elB = $( '<input type="text"/>' )
                        .addClass( 'mw-test-byteLimit-foo' )
-                       .attr( 'type', 'text' )
-                       .prop( 'maxLength', '12' )
+                       .attr( 'maxlength', '12' )
                        .appendTo( '#qunit-fixture' );
 
                $el = $( '.mw-test-byteLimit-foo' );
                assert.strictEqual( $el.length, 2, 'Verify that there are no other elements clashing with this test suite' );
 
                $el.byteLimit();
+       });
+
+       QUnit.test( 'Trim from insertion when limit exceeded', 2, function ( assert ) {
+               var $el;
+
+               // Use a new <input /> because the bug only occurs on the first time
+               // the limit it reached (bug 40850)
+               $el = $( '<input type="text"/>' )
+                       .appendTo( '#qunit-fixture' )
+                       .byteLimit( 3 )
+                       .val( 'abc' ).trigger( 'change' )
+                       .val( 'zabc' ).trigger( 'change' );
+
+               assert.strictEqual( $el.val(), 'abc', 'Trim from the insertion point (at 0), not the end' );
+
+               $el = $( '<input type="text"/>' )
+                       .appendTo( '#qunit-fixture' )
+                       .byteLimit( 3 )
+                       .val( 'abc' ).trigger( 'change' )
+                       .val( 'azbc' ).trigger( 'change' );
 
-               // Before bug 35294 was fixed, both $elA and $elB had maxLength set to 7,
-               // because $.fn.byteLimit sets:
-               // `limit = limitArg || this.prop( 'maxLength' ); this.prop( 'maxLength', limit )`
-               // and did so outside the each() loop.
-               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)' );
+               assert.strictEqual( $el.val(), 'abc', 'Trim from the insertion point (at 1), not the end' );
        });
 
-}( jQuery ) );
+}( jQuery, mediaWiki ) );
index bf62b39..bbc8852 100644 (file)
-QUnit.module( 'jquery.client', QUnit.newMwEnvironment() );
+( function ( $ ) {
+       var uacount, uas, testMap;
 
-/** Number of user-agent defined */
-var uacount = 0;
+       QUnit.module( 'jquery.client', QUnit.newMwEnvironment() );
 
-var uas = (function () {
+       /** Number of user-agent defined */
+       uacount = 0;
 
-       // Object keyed by userAgent. Value is an array (human-readable name, client-profile object, navigator.platform value)
-       // Info based on results from http://toolserver.org/~krinkle/testswarm/job/174/
-       var uas = {
-               // Internet Explorer 6
-               // Internet Explorer 7
-               'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)': {
-                       title: 'Internet Explorer 7',
-                       platform: 'Win32',
-                       profile: {
-                               "name": "msie",
-                               "layout": "trident",
-                               "layoutVersion": "unknown",
-                               "platform": "win",
-                               "version": "7.0",
-                               "versionBase": "7",
-                               "versionNumber": 7
-                       },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: false
-                       }
-               },
-               // Internet Explorer 8
-               // Internet Explorer 9
-               // Internet Explorer 10
-               'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)': {
-                       title: 'Internet Explorer 10',
-                       platform: 'Win32',
-                       profile: {
-                               "name": "msie",
-                               "layout": "trident",
-                               "layoutVersion": "unknown", // should be able to report 6?
-                               "platform": "win",
-                               "version": "10.0",
-                               "versionBase": "10",
-                               "versionNumber": 10
+       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/
+               var uas = {
+                       // Internet Explorer 6
+                       // Internet Explorer 7
+                       'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)': {
+                               title: 'Internet Explorer 7',
+                               platform: 'Win32',
+                               profile: {
+                                       name: 'msie',
+                                       layout: 'trident',
+                                       layoutVersion: 'unknown',
+                                       platform: 'win',
+                                       version: '7.0',
+                                       versionBase: '7',
+                                       versionNumber: 7
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: false
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               // Firefox 2
-               // Firefox 3.5
-               'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19': {
-                       title: 'Firefox 3.5',
-                       platform: 'MacIntel',
-                       profile: {
-                               "name": "firefox",
-                               "layout": "gecko",
-                               "layoutVersion": 20110420,
-                               "platform": "mac",
-                               "version": "3.5.19",
-                               "versionBase": "3",
-                               "versionNumber": 3.5
+                       // Internet Explorer 8
+                       // Internet Explorer 9
+                       // Internet Explorer 10
+                       'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)': {
+                               title: 'Internet Explorer 10',
+                               platform: 'Win32',
+                               profile: {
+                                       name: 'msie',
+                                       layout: 'trident',
+                                       layoutVersion: 'unknown', // should be able to report 6?
+                                       platform: 'win',
+                                       version: '10.0',
+                                       versionBase: '10',
+                                       versionNumber: 10
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               // Firefox 3.6
-               'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17': {
-                       title: 'Firefox 3.6',
-                       platform: 'Linux i686',
-                       profile: {
-                               "name": "firefox",
-                               "layout": "gecko",
-                               "layoutVersion": 20110422,
-                               "platform": "linux",
-                               "version": "3.6.17",
-                               "versionBase": "3",
-                               "versionNumber": 3.6
+                       // Firefox 2
+                       // Firefox 3.5
+                       'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.19) Gecko/20110420 Firefox/3.5.19': {
+                               title: 'Firefox 3.5',
+                               platform: 'MacIntel',
+                               profile: {
+                                       name: 'firefox',
+                                       layout: 'gecko',
+                                       layoutVersion: 20110420,
+                                       platform: 'mac',
+                                       version: '3.5.19',
+                                       versionBase: '3',
+                                       versionNumber: 3.5
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               // Firefox 4
-               'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1': {
-                       title: 'Firefox 4',
-                       platform: 'Win32',
-                       profile: {
-                               "name": "firefox",
-                               "layout": "gecko",
-                               "layoutVersion": 20100101,
-                               "platform": "win",
-                               "version": "4.0.1",
-                               "versionBase": "4",
-                               "versionNumber": 4
+                       // Firefox 3.6
+                       'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110422 Ubuntu/10.10 (maverick) Firefox/3.6.17': {
+                               title: 'Firefox 3.6',
+                               platform: 'Linux i686',
+                               profile: {
+                                       name: 'firefox',
+                                       layout: 'gecko',
+                                       layoutVersion: 20110422,
+                                       platform: 'linux',
+                                       version: '3.6.17',
+                                       versionBase: '3',
+                                       versionNumber: 3.6
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               // Firefox 10 nightly build
-               'Mozilla/5.0 (X11; Linux x86_64; rv:10.0a1) Gecko/20111103 Firefox/10.0a1': {
-                       title: 'Firefox 10 nightly',
-                       platform: 'Linux',
-                       profile: {
-                               "name": "firefox",
-                               "layout": "gecko",
-                               "layoutVersion": 20111103,
-                               "platform": "linux",
-                               "version": "10.0a1",
-                               "versionBase": "10",
-                               "versionNumber": 10
+                       // Firefox 4
+                       'Mozilla/5.0 (Windows NT 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1': {
+                               title: 'Firefox 4',
+                               platform: 'Win32',
+                               profile: {
+                                       name: 'firefox',
+                                       layout: 'gecko',
+                                       layoutVersion: 20100101,
+                                       platform: 'win',
+                                       version: '4.0.1',
+                                       versionBase: '4',
+                                       versionNumber: 4
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               // Firefox 5
-               // Safari 3
-               // Safari 4
-               'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7': {
-                       title: 'Safari 4',
-                       platform: 'MacIntel',
-                       profile: {
-                               "name": "safari",
-                               "layout": "webkit",
-                               "layoutVersion": 531,
-                               "platform": "mac",
-                               "version": "4.0.5",
-                               "versionBase": "4",
-                               "versionNumber": 4
+                       // Firefox 10 nightly build
+                       'Mozilla/5.0 (X11; Linux x86_64; rv:10.0a1) Gecko/20111103 Firefox/10.0a1': {
+                               title: 'Firefox 10 nightly',
+                               platform: 'Linux',
+                               profile: {
+                                       name: 'firefox',
+                                       layout: 'gecko',
+                                       layoutVersion: 20111103,
+                                       platform: 'linux',
+                                       version: '10.0a1',
+                                       versionBase: '10',
+                                       versionNumber: 10
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7': {
-                       title: 'Safari 4',
-                       platform: 'Win32',
-                       profile: {
-                               "name": "safari",
-                               "layout": "webkit",
-                               "layoutVersion": 533,
-                               "platform": "win",
-                               "version": "4.0.5",
-                               "versionBase": "4",
-                               "versionNumber": 4
+                       // Firefox 5
+                       // Safari 3
+                       // Safari 4
+                       'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; nl-nl) AppleWebKit/531.22.7 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7': {
+                               title: 'Safari 4',
+                               platform: 'MacIntel',
+                               profile: {
+                                       name: 'safari',
+                                       layout: 'webkit',
+                                       layoutVersion: 531,
+                                       platform: 'mac',
+                                       version: '4.0.5',
+                                       versionBase: '4',
+                                       versionNumber: 4
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               // Safari 5
-               // Opera 10
-               // Chrome 5
-               // Chrome 6
-               // Chrome 7
-               // Chrome 8
-               // Chrome 9
-               // Chrome 10
-               // Chrome 11
-               // Chrome 12
-               'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30': {
-                       title: 'Chrome 12',
-                       platform: 'MacIntel',
-                       profile: {
-                               "name": "chrome",
-                               "layout": "webkit",
-                               "layoutVersion": 534,
-                               "platform": "mac",
-                               "version": "12.0.742.112",
-                               "versionBase": "12",
-                               "versionNumber": 12
+                       'Mozilla/5.0 (Windows; U; Windows NT 6.0; cs-CZ) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/4.0.5 Safari/531.22.7': {
+                               title: 'Safari 4',
+                               platform: 'Win32',
+                               profile: {
+                                       name: 'safari',
+                                       layout: 'webkit',
+                                       layoutVersion: 533,
+                                       platform: 'win',
+                                       version: '4.0.5',
+                                       versionBase: '4',
+                                       versionNumber: 4
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30': {
-                       title: 'Chrome 12',
-                       platform: 'Linux i686',
-                       profile: {
-                               "name": "chrome",
-                               "layout": "webkit",
-                               "layoutVersion": 534,
-                               "platform": "linux",
-                               "version": "12.0.742.68",
-                               "versionBase": "12",
-                               "versionNumber": 12
+                       // Safari 5
+                       // Opera 10
+                       // Chrome 5
+                       // Chrome 6
+                       // Chrome 7
+                       // Chrome 8
+                       // Chrome 9
+                       // Chrome 10
+                       // Chrome 11
+                       // Chrome 12
+                       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30': {
+                               title: 'Chrome 12',
+                               platform: 'MacIntel',
+                               profile: {
+                                       name: 'chrome',
+                                       layout: 'webkit',
+                                       layoutVersion: 534,
+                                       platform: 'mac',
+                                       version: '12.0.742.112',
+                                       versionBase: '12',
+                                       versionNumber: 12
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
-                       }
-               },
-               // Bug #34924
-               'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) rekonq Safari/534.34': {
-                       title: 'Rekonq',
-                       platform: 'Linux i686',
-                       profile: {
-                               "name": "rekonq",
-                               "layout": "webkit",
-                               "layoutVersion": 534,
-                               "platform": "linux",
-                               "version": "534.34",
-                               "versionBase": "534",
-                               "versionNumber": 534.34
+                       'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.68 Safari/534.30': {
+                               title: 'Chrome 12',
+                               platform: 'Linux i686',
+                               profile: {
+                                       name: 'chrome',
+                                       layout: 'webkit',
+                                       layoutVersion: 534,
+                                       platform: 'linux',
+                                       version: '12.0.742.68',
+                                       versionBase: '12',
+                                       versionNumber: 12
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        },
-                       wikiEditor: {
-                               ltr: true,
-                               rtl: true
+                       // Bug #34924
+                       'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) rekonq Safari/534.34': {
+                               title: 'Rekonq',
+                               platform: 'Linux i686',
+                               profile: {
+                                       name: 'rekonq',
+                                       layout: 'webkit',
+                                       layoutVersion: 534,
+                                       platform: 'linux',
+                                       version: '534.34',
+                                       versionBase: '534',
+                                       versionNumber: 534.34
+                               },
+                               wikiEditor: {
+                                       ltr: true,
+                                       rtl: true
+                               }
                        }
-               }
-       };
-       $.each( uas, function () {
-               uacount++;
-       });
-       return uas;
-}());
+               };
+               $.each( uas, function () {
+                       uacount++;
+               });
+               return uas;
+       }() );
 
-QUnit.test( 'profile userAgent support', uacount, function ( assert ) {
-       // Generate a client profile object and compare recursively
-       var uaTest = function( rawUserAgent, data ) {
-               var ret = $.client.profile( {
-                       userAgent: rawUserAgent,
-                       platform: data.platform
-               } );
-               assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
-       };
+       QUnit.test( 'profile userAgent support', uacount, function ( assert ) {
+               // Generate a client profile object and compare recursively
+               var uaTest = function( rawUserAgent, data ) {
+                       var ret = $.client.profile( {
+                               userAgent: rawUserAgent,
+                               platform: data.platform
+                       } );
+                       assert.deepEqual( ret, data.profile, 'Client profile support check for ' + data.title + ' (' + data.platform + '): ' + rawUserAgent );
+               };
 
-       // Loop through and run tests
-       $.each( uas, uaTest );
-} );
+               // Loop through and run tests
+               $.each( uas, uaTest );
+       } );
 
-QUnit.test( 'profile return validation for current user agent', 7, function ( assert ) {
-       var p = $.client.profile();
-       function unknownOrType( val, type, summary ) {
-               assert.ok( typeof val === type || val === 'unknown', summary );
-       }
+       QUnit.test( 'profile return validation for current user agent', 7, function ( assert ) {
+               var p = $.client.profile();
+               function unknownOrType( val, type, summary ) {
+                       assert.ok( typeof val === type || val === 'unknown', summary );
+               }
 
-       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")' );
-       assert.equal( typeof p.versionNumber, 'number', 'p.versionNumber is a number' );
-});
+               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")' );
+               assert.equal( typeof p.versionNumber, 'number', 'p.versionNumber is a number' );
+       });
 
-// Example from WikiEditor
-// Make sure to use raw numbers, a string like "7.0" would fail on a
-// version 10 browser since in string comparaison "10" is before "7.0" :)
-var testMap = {
-       'ltr': {
-               'msie': [['>=', 7.0]],
-               'firefox': [['>=', 2]],
-               'opera': [['>=', 9.6]],
-               'safari': [['>=', 3]],
-               'chrome': [['>=', 3]],
-               'netscape': [['>=', 9]],
-               'blackberry': false,
-               'ipod': false,
-               'iphone': false
-       },
-       'rtl': {
-               'msie': [['>=', 8]],
-               'firefox': [['>=', 2]],
-               'opera': [['>=', 9.6]],
-               'safari': [['>=', 3]],
-               'chrome': [['>=', 3]],
-               'netscape': [['>=', 9]],
-               'blackberry': false,
-               'ipod': false,
-               'iphone': false
-       }
-};
+       // Example from WikiEditor
+       // Make sure to use raw numbers, a string like "7.0" would fail on a
+       // version 10 browser since in string comparaison "10" is before "7.0" :)
+       testMap = {
+               'ltr': {
+                       'msie': [['>=', 7.0]],
+                       'firefox': [['>=', 2]],
+                       'opera': [['>=', 9.6]],
+                       'safari': [['>=', 3]],
+                       'chrome': [['>=', 3]],
+                       'netscape': [['>=', 9]],
+                       'blackberry': false,
+                       'ipod': false,
+                       'iphone': false
+               },
+               'rtl': {
+                       'msie': [['>=', 8]],
+                       'firefox': [['>=', 2]],
+                       'opera': [['>=', 9.6]],
+                       'safari': [['>=', 3]],
+                       'chrome': [['>=', 3]],
+                       'netscape': [['>=', 9]],
+                       'blackberry': false,
+                       'ipod': false,
+                       'iphone': false
+               }
+       };
 
-QUnit.test( '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 );
+       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 );
 
-       assert.equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
+               assert.equal( typeof testMatch, 'boolean', 'test returns a boolean value' );
 
-});
+       });
 
-QUnit.test( 'User-agent matches against WikiEditor\'s compatibility map', uacount * 2, function ( assert ) {
-       var     $body = $( 'body' ),
-               bodyClasses = $body.attr( 'class' );
+       QUnit.test( 'User-agent matches against WikiEditor\'s compatibility map', uacount * 2, function ( assert ) {
+               var     $body = $( 'body' ),
+                       bodyClasses = $body.attr( 'class' );
 
-       // Loop through and run tests
-       $.each( uas, function ( agent, data ) {
-               $.each( ['ltr', 'rtl'], function ( i, dir ) {
-                       $body.removeClass( 'ltr rtl' ).addClass( dir );
-                       var profile = $.client.profile( {
-                               userAgent: agent,
-                               platform: data.platform
-                       } );
-                       var testMatch = $.client.test( testMap, profile );
-                       $body.removeClass( dir );
+               // Loop through and run tests
+               $.each( uas, function ( agent, data ) {
+                       $.each( ['ltr', 'rtl'], function ( i, dir ) {
+                               var profile, testMatch;
+                               $body.removeClass( 'ltr rtl' ).addClass( dir );
+                               profile = $.client.profile( {
+                                       userAgent: agent,
+                                       platform: data.platform
+                               } );
+                               testMatch = $.client.test( testMap, profile );
+                               $body.removeClass( dir );
 
-                       assert.equal( testMatch, data.wikiEditor[dir], 'testing comparison based on ' + dir + ', ' + agent );
+                               assert.equal( testMatch, data.wikiEditor[dir], 'testing comparison based on ' + dir + ', ' + agent );
+                       });
                });
-       });
-
-       // Restore body classes
-       $body.attr( 'class', bodyClasses );
-});
 
+               // Restore body classes
+               $body.attr( 'class', bodyClasses );
+       });
+}( jQuery ) );
index 7b37f5a..51a892e 100644 (file)
@@ -1,58 +1,62 @@
-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.
-       assert.strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
-
-       assert.deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 'Color names (lightGreen)' );
-       assert.deepEqual( $.colorUtil.getRGB( 'transparent' ), [255, 255, 255], 'Color names (transparent)' );
-       assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
-});
-
-QUnit.test( 'rgbToHsl', 1, function ( assert ) {
-       var hsl = $.colorUtil.rgbToHsl( 144, 238, 144 );
-
-       // Cross-browser differences in decimals...
-       // Round to two decimals so they can be more reliably checked.
-       var dualDecimals = function(a,b){
-               return Math.round(a*100)/100;
-       };
-       // Re-create the rgbToHsl return array items, limited to two decimals.
-       var ret = [dualDecimals(hsl[0]), dualDecimals(hsl[1]), dualDecimals(hsl[2])];
-
-       assert.deepEqual( ret, [0.33, 0.73, 0.75], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
-});
-
-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])];
-
-       assert.deepEqual( ret ,[183, 240, 168], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
-});
-
-QUnit.test( 'getColorBrightness', 2, function ( assert ) {
-       var a = $.colorUtil.getColorBrightness( 'red', +0.1 );
-       assert.equal( a, 'rgb(255,50,50)', 'Start with named color "red", brighten 10%' );
-
-       var b = $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
-       assert.equal( b, 'rgb(118,29,29)', 'Start with rgb string "rgb(200,50,50)", darken 20%' );
-});
+( function ( $ ) {
+       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.
+               assert.strictEqual( $.colorUtil.getRGB( 'rgba(0,0,0,0)' ), undefined, 'Zero rgba without whitespace' );
+
+               assert.deepEqual( $.colorUtil.getRGB( 'lightGreen' ), [144, 238, 144], 'Color names (lightGreen)' );
+               assert.deepEqual( $.colorUtil.getRGB( 'transparent' ), [255, 255, 255], 'Color names (transparent)' );
+               assert.strictEqual( $.colorUtil.getRGB( 'mediaWiki' ), undefined, 'Inexisting color name' );
+       });
+
+       QUnit.test( 'rgbToHsl', 1, function ( assert ) {
+               var hsl, ret;
+
+               // Cross-browser differences in decimals...
+               // Round to two decimals so they can be more reliably checked.
+               function dualDecimals( a ) {
+                       return Math.round( a * 100 ) / 100;
+               }
+               // Re-create the rgbToHsl return array items, limited to two decimals.
+               hsl = $.colorUtil.rgbToHsl( 144, 238, 144 );
+               ret = [ dualDecimals( hsl[0] ), dualDecimals( hsl[1] ), dualDecimals( hsl[2] ) ];
+
+               assert.deepEqual( ret, [0.33, 0.73, 0.75], 'rgb(144, 238, 144): hsl(0.33, 0.73, 0.75)' );
+       });
+
+       QUnit.test( 'hslToRgb', 1, function ( assert ) {
+               var rgb, ret;
+               rgb = $.colorUtil.hslToRgb( 0.3, 0.7, 0.8 );
+
+               // Re-create the hslToRgb return array items, rounded to whole numbers.
+               ret = [ Math.round(rgb[0]), Math.round(rgb[1]), Math.round(rgb[2]) ];
+
+               assert.deepEqual( ret ,[183, 240, 168], 'hsl(0.3, 0.7, 0.8): rgb(183, 240, 168)' );
+       });
+
+       QUnit.test( 'getColorBrightness', 2, function ( assert ) {
+               var a, b;
+               a = $.colorUtil.getColorBrightness( 'red', +0.1 );
+               assert.equal( a, 'rgb(255,50,50)', 'Start with named color "red", brighten 10%' );
+
+               b = $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
+               assert.equal( b, 'rgb(118,29,29)', 'Start with rgb string "rgb(200,50,50)", darken 20%' );
+       });
+}( jQuery ) );
index a307983..3e7d5ff 100644 (file)
@@ -1,35 +1,37 @@
-QUnit.asyncTest('jquery.delayedBind with data option', 2, function ( assert ) {
-       var $fixture = $('<div>').appendTo('#qunit-fixture'),
-               data = { magic: "beeswax" },
-               delay = 50;
+( 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 ( e ) {
-               QUnit.start(); // continue!
-               assert.ok( true, 'testevent fired');
-               assert.ok( e.data === data, 'data is passed through delayedBind');
+               $fixture.delayedBind(delay, 'testevent', data, function ( e ) {
+                       assert.ok( true, 'testevent fired');
+                       assert.ok( e.data === data, 'data is passed through delayedBind');
+                       QUnit.start();
+               });
+
+               // We'll trigger it thrice, but it should only happen once.
+               $fixture.trigger( 'testevent', {} );
+               $fixture.trigger( 'testevent', {} );
+               $fixture.trigger( 'testevent', {} );
+               $fixture.trigger( 'testevent', {} );
        });
 
-       // We'll trigger it thrice, but it should only happen once.
-       $fixture.trigger( 'testevent', {} );
-       $fixture.trigger( 'testevent', {} );
-       $fixture.trigger( 'testevent', {} );
-       $fixture.trigger( 'testevent', {} );
-});
+       QUnit.asyncTest('jquery.delayedBind without data option', 1, function ( assert ) {
+               var $fixture = $('<div>').appendTo('#qunit-fixture'),
+                       delay = 50;
 
-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 () {
+                       assert.ok(true, 'testevent fired');
+                       QUnit.start();
+               });
 
-       $fixture.delayedBind(delay, 'testevent', function ( e ) {
-               QUnit.start(); // continue!
-               assert.ok(true, 'testevent fired');
+               // We'll trigger it thrice, but it should only happen once.
+               $fixture.trigger( 'testevent', {} );
+               $fixture.trigger( 'testevent', {} );
+               $fixture.trigger( 'testevent', {} );
+               $fixture.trigger( 'testevent', {} );
        });
-
-       // We'll trigger it thrice, but it should only happen once.
-       $fixture.trigger( 'testevent', {} );
-       $fixture.trigger( 'testevent', {} );
-       $fixture.trigger( 'testevent', {} );
-       $fixture.trigger( 'testevent', {} );
-});
-
+}( jQuery ) );
index 6eef1ab..82566c2 100644 (file)
@@ -1,11 +1,13 @@
-QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
+( function ( $ ) {
+       QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
 
-QUnit.test( 'Check', 1, function ( assert ) {
-       var     attrs = {
-                       foo: 'bar',
-                       'class': 'lorem'
-               },
-               $el = jQuery( '<div>', attrs );
+       QUnit.test( 'Check', 1, function ( assert ) {
+               var     attrs = {
+                               foo: 'bar',
+                               'class': 'lorem'
+                       },
+                       $el = $( '<div>' ).attr( attrs );
 
-       assert.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' );
+       } );
+}( jQuery ) );
diff --git a/tests/qunit/suites/resources/jquery/jquery.hidpi.test.js b/tests/qunit/suites/resources/jquery/jquery.hidpi.test.js
new file mode 100644 (file)
index 0000000..d75c378
--- /dev/null
@@ -0,0 +1,22 @@
+( function ( $ ) {
+       QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
+
+       QUnit.test( 'devicePixelRatio', function ( assert ) {
+               var devicePixelRatio = $.devicePixelRatio();
+               assert.equal( typeof devicePixelRatio, 'number', '$.devicePixelRatio() returns a number' );
+       });
+
+       QUnit.test( 'matchSrcSet', function ( assert ) {
+               var srcset = 'onefive.png 1.5x, two.png 2x';
+
+               // Nice exact matches
+               assert.equal( $.matchSrcSet( 1, srcset ), null, '1.0 gives no match' );
+               assert.equal( $.matchSrcSet( 1.5, srcset ), 'onefive.png', '1.5 gives match' );
+               assert.equal( $.matchSrcSet( 2, srcset ), 'two.png', '2 gives match' );
+
+               // Non-exact matches; should return the next-biggest specified
+               assert.equal( $.matchSrcSet( 1.25, srcset ), null, '1.25 gives no match' );
+               assert.equal( $.matchSrcSet( 1.75, srcset ), 'onefive.png', '1.75 gives match to 1.5' );
+               assert.equal( $.matchSrcSet( 2.25, srcset ), 'two.png', '2.25 gives match to 2' );
+       });
+}( jQuery ) );
index a94dca3..e1fb96d 100644 (file)
-QUnit.module( 'jquery.highlightText', QUnit.newMwEnvironment() );
+( function ( $ ) {
+       QUnit.module( 'jquery.highlightText', QUnit.newMwEnvironment() );
 
-QUnit.test( 'Check', function ( assert ) {
-       var $fixture, cases = [
-               {
-                       desc: 'Test 001',
-                       text: 'Blue Öyster Cult',
-                       highlight: 'Blue',
-                       expected: '<span class="highlight">Blue</span> Öyster Cult'
-               },
-               {
-                       desc: 'Test 002',
-                       text: 'Blue Öyster Cult',
-                       highlight: 'Blue ',
-                       expected: '<span class="highlight">Blue</span> Öyster Cult'
-               },
-               {
-                       desc: 'Test 003',
-                       text: 'Blue Öyster Cult',
-                       highlight: 'Blue Ö',
-                       expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
-               },
-               {
-                       desc: 'Test 004',
-                       text: 'Blue Öyster Cult',
-                       highlight: 'Blue Öy',
-                       expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
-               },
-               {
-                       desc: 'Test 005',
-                       text: 'Blue Öyster Cult',
-                       highlight: ' Blue',
-                       expected: '<span class="highlight">Blue</span> Öyster Cult'
-               },
-               {
-                       desc: 'Test 006',
-                       text: 'Blue Öyster Cult',
-                       highlight: ' Blue ',
-                       expected: '<span class="highlight">Blue</span> Öyster Cult'
-               },
-               {
-                       desc: 'Test 007',
-                       text: 'Blue Öyster Cult',
-                       highlight: ' Blue Ö',
-                       expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
-               },
-               {
-                       desc: 'Test 008',
-                       text: 'Blue Öyster Cult',
-                       highlight: ' Blue Öy',
-                       expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
-               },
-               {
-                       desc: 'Test 009: Highlighter broken on starting Umlaut?',
-                       text: 'Österreich',
-                       highlight: 'Österreich',
-                       expected: '<span class="highlight">Österreich</span>'
-               },
-               {
-                       desc: 'Test 010: Highlighter broken on starting Umlaut?',
-                       text: 'Österreich',
-                       highlight: 'Ö',
-                       expected: '<span class="highlight">Ö</span>sterreich'
-               },
-               {
-                       desc: 'Test 011: Highlighter broken on starting Umlaut?',
-                       text: 'Österreich',
-                       highlight: 'Öst',
-                       expected: '<span class="highlight">Öst</span>erreich'
-               },
-               {
-                       desc: 'Test 012: Highlighter broken on starting Umlaut?',
-                       text: 'Österreich',
-                       highlight: 'Oe',
-                       expected: 'Österreich'
-               },
-               {
-                       desc: 'Test 013: Highlighter broken on punctuation mark?',
-                       text: 'So good. To be there',
-                       highlight: 'good',
-                       expected: 'So <span class="highlight">good</span>. To be there'
-               },
-               {
-                       desc: 'Test 014: Highlighter broken on space?',
-                       text: 'So good. To be there',
-                       highlight: 'be',
-                       expected: 'So good. To <span class="highlight">be</span> there'
-               },
-               {
-                       desc: 'Test 015: Highlighter broken on space?',
-                       text: 'So good. To be there',
-                       highlight: ' be',
-                       expected: 'So good. To <span class="highlight">be</span> there'
-               },
-               {
-                       desc: 'Test 016: Highlighter broken on space?',
-                       text: 'So good. To be there',
-                       highlight: 'be ',
-                       expected: 'So good. To <span class="highlight">be</span> there'
-               },
-               {
-                       desc: 'Test 017: Highlighter broken on space?',
-                       text: 'So good. To be there',
-                       highlight: ' be ',
-                       expected: 'So good. To <span class="highlight">be</span> there'
-               },
-               {
-                       desc: 'Test 018: en de Highlighter broken on special character at the end?',
-                       text: 'So good. xbß',
-                       highlight: 'xbß',
-                       expected: 'So good. <span class="highlight">xbß</span>'
-               },
-               {
-                       desc: 'Test 019: en de Highlighter broken on special character at the end?',
-                       text: 'So good. xbß.',
-                       highlight: 'xbß.',
-                       expected: 'So good. <span class="highlight">xbß.</span>'
-               },
-               {
-                       desc: 'Test 020: RTL he Hebrew',
-                       text: 'חסיד אומות העולם',
-                       highlight: 'חסיד אומות העולם',
-                       expected: '<span class="highlight">חסיד</span> <span class="highlight">אומות</span> <span class="highlight">העולם</span>'
-               },
-               {
-                       desc: 'Test 021: RTL he Hebrew',
-                       text: 'חסיד אומות העולם',
-                       highlight: 'חסי',
-                       expected: '<span class="highlight">חסי</span>ד אומות העולם'
-               },
-               {
-                       desc: 'Test 022: ja Japanese',
-                       text: '諸国民の中の正義の人',
-                       highlight: '諸国民の中の正義の人',
-                       expected: '<span class="highlight">諸国民の中の正義の人</span>'
-               },
-               {
-                       desc: 'Test 023: ja Japanese',
-                       text: '諸国民の中の正義の人',
-                       highlight: '諸国',
-                       expected: '<span class="highlight">諸国</span>民の中の正義の人'
-               },
-               {
-                       desc: 'Test 024: fr French text and « french quotes » (guillemets)',
-                       text: "« L'oiseau est sur l’île »",
-                       highlight: "« L'oiseau est sur l’île »",
-                       expected: '<span class="highlight">«</span> <span class="highlight">L\'oiseau</span> <span class="highlight">est</span> <span class="highlight">sur</span> <span class="highlight">l’île</span> <span class="highlight">»</span>'
-               },
-               {
-                       desc: 'Test 025: fr French text and « french quotes » (guillemets)',
-                       text: "« L'oiseau est sur l’île »",
-                       highlight: "« L'oise",
-                       expected: '<span class="highlight">«</span> <span class="highlight">L\'oise</span>au est sur l’île »'
-               },
-               {
-                       desc: 'Test 025a: fr French text and « french quotes » (guillemets) - does it match the single strings "«" and "L" separately?',
-                       text: "« L'oiseau est sur l’île »",
-                       highlight: "« L",
-                       expected: '<span class="highlight">«</span> <span class="highlight">L</span>\'oiseau est sur <span class="highlight">l</span>’île »'
-               },
-               {
-                       desc: 'Test 026: ru Russian',
-                       text: 'Праведники мира',
-                       highlight: 'Праведники мира',
-                       expected: '<span class="highlight">Праведники</span> <span class="highlight">мира</span>'
-               },
-               {
-                       desc: 'Test 027: ru Russian',
-                       text: 'Праведники мира',
-                       highlight: 'Праве',
-                       expected: '<span class="highlight">Праве</span>дники мира'
-               },
-               {
-                       desc: 'Test 028 ka Georgian',
-                       text: 'მთავარი გვერდი',
-                       highlight: 'მთავარი გვერდი',
-                       expected: '<span class="highlight">მთავარი</span> <span class="highlight">გვერდი</span>'
-               },
-               {
-                       desc: 'Test 029 ka Georgian',
-                       text: 'მთავარი გვერდი',
-                       highlight: 'მთა',
-                       expected: '<span class="highlight">მთა</span>ვარი გვერდი'
-               },
-               {
-                       desc: 'Test 030 hy Armenian',
-                       text: 'Նոնա Գափրինդաշվիլի',
-                       highlight: 'Նոնա Գափրինդաշվիլի',
-                       expected: '<span class="highlight">Նոնա</span> <span class="highlight">Գափրինդաշվիլի</span>'
-               },
-               {
-                       desc: 'Test 031 hy Armenian',
-                       text: 'Նոնա Գափրինդաշվիլի',
-                       highlight: 'Նոն',
-                       expected: '<span class="highlight">Նոն</span>ա Գափրինդաշվիլի'
-               },
-               {
-                       desc: 'Test 032: th Thai',
-                       text: 'พอล แอร์ดิช',
-                       highlight: 'พอล แอร์ดิช',
-                       expected: '<span class="highlight">พอล</span> <span class="highlight">แอร์ดิช</span>'
-               },
-               {
-                       desc: 'Test 033: th Thai',
-                       text: 'พอล แอร์ดิช',
-                       highlight: 'พอ',
-                       expected: '<span class="highlight">พอ</span>ล แอร์ดิช'
-               },
-               {
-                       desc: 'Test 034: RTL ar Arabic',
-                       text: 'بول إيردوس',
-                       highlight: 'بول إيردوس',
-                       expected: '<span class="highlight">بول</span> <span class="highlight">إيردوس</span>'
-               },
-               {
-                       desc: 'Test 035: RTL ar Arabic',
-                       text: 'بول إيردوس',
-                       highlight: 'بو',
-                       expected: '<span class="highlight">بو</span>ل إيردوس'
-               }
-       ];
-       QUnit.expect( cases.length );
+       QUnit.test( 'Check', function ( assert ) {
+               var $fixture, cases = [
+                       {
+                               desc: 'Test 001',
+                               text: 'Blue Öyster Cult',
+                               highlight: 'Blue',
+                               expected: '<span class="highlight">Blue</span> Öyster Cult'
+                       },
+                       {
+                               desc: 'Test 002',
+                               text: 'Blue Öyster Cult',
+                               highlight: 'Blue ',
+                               expected: '<span class="highlight">Blue</span> Öyster Cult'
+                       },
+                       {
+                               desc: 'Test 003',
+                               text: 'Blue Öyster Cult',
+                               highlight: 'Blue Ö',
+                               expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
+                       },
+                       {
+                               desc: 'Test 004',
+                               text: 'Blue Öyster Cult',
+                               highlight: 'Blue Öy',
+                               expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
+                       },
+                       {
+                               desc: 'Test 005',
+                               text: 'Blue Öyster Cult',
+                               highlight: ' Blue',
+                               expected: '<span class="highlight">Blue</span> Öyster Cult'
+                       },
+                       {
+                               desc: 'Test 006',
+                               text: 'Blue Öyster Cult',
+                               highlight: ' Blue ',
+                               expected: '<span class="highlight">Blue</span> Öyster Cult'
+                       },
+                       {
+                               desc: 'Test 007',
+                               text: 'Blue Öyster Cult',
+                               highlight: ' Blue Ö',
+                               expected: '<span class="highlight">Blue</span> <span class="highlight">Ö</span>yster Cult'
+                       },
+                       {
+                               desc: 'Test 008',
+                               text: 'Blue Öyster Cult',
+                               highlight: ' Blue Öy',
+                               expected: '<span class="highlight">Blue</span> <span class="highlight">Öy</span>ster Cult'
+                       },
+                       {
+                               desc: 'Test 009: Highlighter broken on starting Umlaut?',
+                               text: 'Österreich',
+                               highlight: 'Österreich',
+                               expected: '<span class="highlight">Österreich</span>'
+                       },
+                       {
+                               desc: 'Test 010: Highlighter broken on starting Umlaut?',
+                               text: 'Österreich',
+                               highlight: 'Ö',
+                               expected: '<span class="highlight">Ö</span>sterreich'
+                       },
+                       {
+                               desc: 'Test 011: Highlighter broken on starting Umlaut?',
+                               text: 'Österreich',
+                               highlight: 'Öst',
+                               expected: '<span class="highlight">Öst</span>erreich'
+                       },
+                       {
+                               desc: 'Test 012: Highlighter broken on starting Umlaut?',
+                               text: 'Österreich',
+                               highlight: 'Oe',
+                               expected: 'Österreich'
+                       },
+                       {
+                               desc: 'Test 013: Highlighter broken on punctuation mark?',
+                               text: 'So good. To be there',
+                               highlight: 'good',
+                               expected: 'So <span class="highlight">good</span>. To be there'
+                       },
+                       {
+                               desc: 'Test 014: Highlighter broken on space?',
+                               text: 'So good. To be there',
+                               highlight: 'be',
+                               expected: 'So good. To <span class="highlight">be</span> there'
+                       },
+                       {
+                               desc: 'Test 015: Highlighter broken on space?',
+                               text: 'So good. To be there',
+                               highlight: ' be',
+                               expected: 'So good. To <span class="highlight">be</span> there'
+                       },
+                       {
+                               desc: 'Test 016: Highlighter broken on space?',
+                               text: 'So good. To be there',
+                               highlight: 'be ',
+                               expected: 'So good. To <span class="highlight">be</span> there'
+                       },
+                       {
+                               desc: 'Test 017: Highlighter broken on space?',
+                               text: 'So good. To be there',
+                               highlight: ' be ',
+                               expected: 'So good. To <span class="highlight">be</span> there'
+                       },
+                       {
+                               desc: 'Test 018: en de Highlighter broken on special character at the end?',
+                               text: 'So good. xbß',
+                               highlight: 'xbß',
+                               expected: 'So good. <span class="highlight">xbß</span>'
+                       },
+                       {
+                               desc: 'Test 019: en de Highlighter broken on special character at the end?',
+                               text: 'So good. xbß.',
+                               highlight: 'xbß.',
+                               expected: 'So good. <span class="highlight">xbß.</span>'
+                       },
+                       {
+                               desc: 'Test 020: RTL he Hebrew',
+                               text: 'חסיד אומות העולם',
+                               highlight: 'חסיד אומות העולם',
+                               expected: '<span class="highlight">חסיד</span> <span class="highlight">אומות</span> <span class="highlight">העולם</span>'
+                       },
+                       {
+                               desc: 'Test 021: RTL he Hebrew',
+                               text: 'חסיד אומות העולם',
+                               highlight: 'חסי',
+                               expected: '<span class="highlight">חסי</span>ד אומות העולם'
+                       },
+                       {
+                               desc: 'Test 022: ja Japanese',
+                               text: '諸国民の中の正義の人',
+                               highlight: '諸国民の中の正義の人',
+                               expected: '<span class="highlight">諸国民の中の正義の人</span>'
+                       },
+                       {
+                               desc: 'Test 023: ja Japanese',
+                               text: '諸国民の中の正義の人',
+                               highlight: '諸国',
+                               expected: '<span class="highlight">諸国</span>民の中の正義の人'
+                       },
+                       {
+                               desc: 'Test 024: fr French text and « french quotes » (guillemets)',
+                               text: '« L\'oiseau est sur l’île »',
+                               highlight: '« L\'oiseau est sur l’île »',
+                               expected: '<span class="highlight">«</span> <span class="highlight">L\'oiseau</span> <span class="highlight">est</span> <span class="highlight">sur</span> <span class="highlight">l’île</span> <span class="highlight">»</span>'
+                       },
+                       {
+                               desc: 'Test 025: fr French text and « french quotes » (guillemets)',
+                               text: '« L\'oiseau est sur l’île »',
+                               highlight: '« L\'oise',
+                               expected: '<span class="highlight">«</span> <span class="highlight">L\'oise</span>au est sur l’île »'
+                       },
+                       {
+                               desc: 'Test 025a: fr French text and « french quotes » (guillemets) - does it match the single strings "«" and "L" separately?',
+                               text: '« L\'oiseau est sur l’île »',
+                               highlight: '« L',
+                               expected: '<span class="highlight">«</span> <span class="highlight">L</span>\'oiseau est sur <span class="highlight">l</span>’île »'
+                       },
+                       {
+                               desc: 'Test 026: ru Russian',
+                               text: 'Праведники мира',
+                               highlight: 'Праведники мира',
+                               expected: '<span class="highlight">Праведники</span> <span class="highlight">мира</span>'
+                       },
+                       {
+                               desc: 'Test 027: ru Russian',
+                               text: 'Праведники мира',
+                               highlight: 'Праве',
+                               expected: '<span class="highlight">Праве</span>дники мира'
+                       },
+                       {
+                               desc: 'Test 028 ka Georgian',
+                               text: 'მთავარი გვერდი',
+                               highlight: 'მთავარი გვერდი',
+                               expected: '<span class="highlight">მთავარი</span> <span class="highlight">გვერდი</span>'
+                       },
+                       {
+                               desc: 'Test 029 ka Georgian',
+                               text: 'მთავარი გვერდი',
+                               highlight: 'მთა',
+                               expected: '<span class="highlight">მთა</span>ვარი გვერდი'
+                       },
+                       {
+                               desc: 'Test 030 hy Armenian',
+                               text: 'Նոնա Գափրինդաշվիլի',
+                               highlight: 'Նոնա Գափրինդաշվիլի',
+                               expected: '<span class="highlight">Նոնա</span> <span class="highlight">Գափրինդաշվիլի</span>'
+                       },
+                       {
+                               desc: 'Test 031 hy Armenian',
+                               text: 'Նոնա Գափրինդաշվիլի',
+                               highlight: 'Նոն',
+                               expected: '<span class="highlight">Նոն</span>ա Գափրինդաշվիլի'
+                       },
+                       {
+                               desc: 'Test 032: th Thai',
+                               text: 'พอล แอร์ดิช',
+                               highlight: 'พอล แอร์ดิช',
+                               expected: '<span class="highlight">พอล</span> <span class="highlight">แอร์ดิช</span>'
+                       },
+                       {
+                               desc: 'Test 033: th Thai',
+                               text: 'พอล แอร์ดิช',
+                               highlight: 'พอ',
+                               expected: '<span class="highlight">พอ</span>ล แอร์ดิช'
+                       },
+                       {
+                               desc: 'Test 034: RTL ar Arabic',
+                               text: 'بول إيردوس',
+                               highlight: 'بول إيردوس',
+                               expected: '<span class="highlight">بول</span> <span class="highlight">إيردوس</span>'
+                       },
+                       {
+                               desc: 'Test 035: RTL ar Arabic',
+                               text: 'بول إيردوس',
+                               highlight: 'بو',
+                               expected: '<span class="highlight">بو</span>ل إيردوس'
+                       }
+               ];
+               QUnit.expect( cases.length );
 
-       $.each( cases, function ( i, item ) {
-               $fixture = $( '<p>' ).text( item.text ).highlightText( item.highlight );
-               assert.equal(
-                       $fixture.html(),
-                       $( '<p>' ).html( item.expected ).html(), // re-parse to normalize!
-                       item.desc || undefined
-               );
+               $.each( cases, function ( i, item ) {
+                       $fixture = $( '<p>' ).text( item.text ).highlightText( item.highlight );
+                       assert.equal(
+                               $fixture.html(),
+                               // Re-parse to normalize
+                               $( '<p>' ).html( item.expected ).html(),
+                               item.desc || undefined
+                       );
+               } );
        } );
-} );
+}( jQuery ) );
index c8e1d9f..3810a04 100644 (file)
-QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
+( function ( $, mw ) {
+       QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
 
-QUnit.test( 'Handle basic replacements', 4, function ( assert ) {
-       var html, $lc;
-       mw.messages.set( 'basic', 'Basic stuff' );
+       QUnit.test( 'Handle basic replacements', 4, function ( assert ) {
+               var html, $lc;
+               mw.messages.set( 'basic', 'Basic stuff' );
 
-       // Tag: html:msg
-       html = '<div><span><html:msg key="basic" /></span></div>';
-       $lc = $( html ).localize().find( 'span' );
+               // Tag: html:msg
+               html = '<div><span><html:msg key="basic" /></span></div>';
+               $lc = $( html ).localize().find( 'span' );
 
-       assert.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>';
-       $lc = $( html ).localize().find( 'span' );
+               // Attribute: title-msg
+               html = '<div><span title-msg="basic"></span></div>';
+               $lc = $( html ).localize().find( 'span' );
 
-       assert.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>';
-       $lc = $( html ).localize().find( 'span' );
+               // Attribute: alt-msg
+               html = '<div><span alt-msg="basic"></span></div>';
+               $lc = $( html ).localize().find( 'span' );
 
-       assert.strictEqual( $lc.attr( 'alt' ), 'Basic stuff', 'Attribute: alt-msg' );
+               assert.strictEqual( $lc.attr( 'alt' ), 'Basic stuff', 'Attribute: alt-msg' );
 
-       // Attribute: placeholder-msg
-       html = '<div><input placeholder-msg="basic" /></div>';
-       $lc = $( html ).localize().find( 'input' );
+               // 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' );
-} );
+               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">' );
+
+               // This is handled by jQuery inside $.fn.localize, just a simple sanity checked
+               // making sure it is actually using text() and attr() (or something with the same effect)
 
-QUnit.test( 'Proper escaping', 2, function ( assert ) {
-       var html, $lc;
-       mw.messages.set( 'properfoo', '<proper esc="test">' );
+               // Text escaping
+               html = '<div><span><html:msg key="properfoo"></span></div>';
+               $lc = $( html ).localize().find( 'span' );
 
-       // This is handled by jQuery inside $.fn.localize, just a simple sanity checked
-       // making sure it is actually using text() and attr() (or something with the same effect)
+               assert.strictEqual( $lc.text(), mw.msg( 'properfoo' ), 'Content is inserted as text, not as html.' );
 
-       // Text escaping
-       html = '<div><span><html:msg key="properfoo"></span></div>';
-       $lc = $( html ).localize().find( 'span' );
+               // Attribute escaping
+               html = '<div><span title-msg="properfoo"></span></div>';
+               $lc = $( html ).localize().find( 'span' );
 
-       assert.strictEqual( $lc.text(), mw.msg( 'properfoo' ), 'Content is inserted as text, not as html.' );
+               assert.strictEqual( $lc.attr( 'title' ), mw.msg( 'properfoo' ), 'Attributes are not inserted raw.' );
+       } );
 
-       // Attribute escaping
-       html = '<div><span title-msg="properfoo"></span></div>';
-       $lc = $( html ).localize().find( 'span' );
+       QUnit.test( 'Options', 7, function ( assert ) {
+               mw.messages.set( {
+                       'foo-lorem': 'Lorem',
+                       'foo-ipsum': 'Ipsum',
+                       'foo-bar-title': 'Read more about bars',
+                       'foo-bar-label': 'The Bars',
+                       'foo-bazz-title': 'Read more about bazz at $1 (last modified: $2)',
+                       'foo-bazz-label': 'The Bazz ($1)',
+                       'foo-welcome': 'Welcome to $1! (last visit: $2)'
+               } );
+               var html, $lc, x, sitename = 'Wikipedia';
+
+               // Message key prefix
+               html = '<div><span title-msg="lorem"><html:msg key="ipsum"></span></div>';
+               $lc = $( html ).localize( {
+                       prefix: 'foo-'
+               } ).find( 'span' );
+
+               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>';
+               $lc = $( html ).localize( {
+                       keys: {
+                               'title': 'foo-' + x + '-title',
+                               'label': 'foo-' + x + '-label'
+                       }
+               } ).find( 'span' );
+
+               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>';
+               $lc = $( html ).localize( {
+                       params: {
+                               'foo-welcome': [sitename, 'yesterday']
+                       }
+               } ).find( 'span' );
+
+               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>';
+               $lc = $( html ).localize( {
+                       prefix: 'foo-',
+                       keys: {
+                               'title': x + '-title',
+                               'label': x + '-label'
+                       },
+                       params: {
+                               'title': [sitename, '3 minutes ago'],
+                               'label': [sitename, '3 minutes ago']
+
+                       }
+               } ).find( 'span' );
+
+               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' );
+       } );
 
-       assert.strictEqual( $lc.attr( 'title' ), mw.msg( 'properfoo' ), 'Attributes are not inserted raw.' );
-} );
+       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( 'Options', 7, function ( assert ) {
-       mw.messages.set( {
-               'foo-lorem': 'Lorem',
-               'foo-ipsum': 'Ipsum',
-               'foo-bar-title': 'Read more about bars',
-               'foo-bar-label': 'The Bars',
-               'foo-bazz-title': 'Read more about bazz at $1 (last modified: $2)',
-               'foo-bazz-label': 'The Bazz ($1)',
-               'foo-welcome': 'Welcome to $1! (last visit: $2)'
+       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' );
        } );
-       var html, $lc, attrs, x, sitename = 'Wikipedia';
-
-       // Message key prefix
-       html = '<div><span title-msg="lorem"><html:msg key="ipsum"></span></div>';
-       $lc = $( html ).localize( {
-               prefix: 'foo-'
-       } ).find( 'span' );
-
-       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>';
-       $lc = $( html ).localize( {
-               keys: {
-                       'title': 'foo-' + x + '-title',
-                       'label': 'foo-' + x + '-label'
-               }
-       } ).find( 'span' );
-
-       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>';
-       $lc = $( html ).localize( {
-               params: {
-                       'foo-welcome': [sitename, 'yesterday']
-               }
-       } ).find( 'span' );
-
-       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>';
-       $lc = $( html ).localize( {
-               prefix: 'foo-',
-               keys: {
-                       'title': x + '-title',
-                       'label': x + '-label'
-               },
-               params: {
-                       'title': [sitename, '3 minutes ago'],
-                       'label': [sitename, '3 minutes ago']
-
-               }
-       } ).find( 'span' );
-
-       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' );
-} );
+}( jQuery, mediaWiki ) ) ;
index 5b566ae..3ffcbf5 100644 (file)
@@ -1,58 +1,60 @@
-QUnit.module( 'jquery.mwExtension', QUnit.newMwEnvironment() );
-
-QUnit.test( 'String functions', function ( assert ) {
-
-       assert.equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
-       assert.equal( $.trimRight( '  foo bar  ' ), '  foo bar', 'trimRight' );
-       assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
-
-       assert.equal( $.escapeRE( '<!-- ([{+mW+}]) $^|?>' ),
-        '<!\\-\\- \\(\\[\\{\\+mW\\+\\}\\]\\) \\$\\^\\|\\?>', 'escapeRE - Escape specials' );
-       assert.equal( $.escapeRE( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ),
-        'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'escapeRE - Leave uppercase alone' );
-       assert.equal( $.escapeRE( 'abcdefghijklmnopqrstuvwxyz' ),
-        'abcdefghijklmnopqrstuvwxyz', 'escapeRE - Leave lowercase alone' );
-       assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
-});
-
-QUnit.test( 'Is functions', function ( assert ) {
-
-       assert.strictEqual( $.isDomElement( document.getElementById( 'qunit-header' ) ), true,
-        'isDomElement: #qunit-header Node' );
-       assert.strictEqual( $.isDomElement( document.getElementById( 'random-name' ) ), false,
-        'isDomElement: #random-name (null)' );
-       assert.strictEqual( $.isDomElement( document.getElementsByTagName( 'div' ) ), false,
-        'isDomElement: getElementsByTagName Array' );
-       assert.strictEqual( $.isDomElement( document.getElementsByTagName( 'div' )[0] ), true,
-        'isDomElement: getElementsByTagName(..)[0] Node' );
-       assert.strictEqual( $.isDomElement( $( 'div' ) ), false,
-        'isDomElement: jQuery object' );
-       assert.strictEqual( $.isDomElement( $( 'div' ).get(0) ), true,
-        'isDomElement: jQuery object > Get node' );
-       assert.strictEqual( $.isDomElement( document.createElement( 'div' ) ), true,
-        'isDomElement: createElement' );
-       assert.strictEqual( $.isDomElement( { foo: 1 } ), false,
-        'isDomElement: Object' );
-
-       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
-       assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmptry: { length: 0 }' );
-});
-
-QUnit.test( 'Comparison functions', function ( assert ) {
-
-       assert.ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, "a", [], [2, "b"] ] ),
-        'compareArray: Two deep arrays that are excactly the same' );
-       assert.ok( !$.compareArray( [1], [2] ), 'compareArray: Two different arrays (false)' );
-
-       assert.ok( $.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)' );
-});
+( function ( $ ) {
+       QUnit.module( 'jquery.mwExtension', QUnit.newMwEnvironment() );
+
+       QUnit.test( 'String functions', function ( assert ) {
+
+               assert.equal( $.trimLeft( '  foo bar  ' ), 'foo bar  ', 'trimLeft' );
+               assert.equal( $.trimRight( '  foo bar  ' ), '  foo bar', 'trimRight' );
+               assert.equal( $.ucFirst( 'foo' ), 'Foo', 'ucFirst' );
+
+               assert.equal( $.escapeRE( '<!-- ([{+mW+}]) $^|?>' ),
+                '<!\\-\\- \\(\\[\\{\\+mW\\+\\}\\]\\) \\$\\^\\|\\?>', 'escapeRE - Escape specials' );
+               assert.equal( $.escapeRE( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' ),
+                'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'escapeRE - Leave uppercase alone' );
+               assert.equal( $.escapeRE( 'abcdefghijklmnopqrstuvwxyz' ),
+                'abcdefghijklmnopqrstuvwxyz', 'escapeRE - Leave lowercase alone' );
+               assert.equal( $.escapeRE( '0123456789' ), '0123456789', 'escapeRE - Leave numbers alone' );
+       });
+
+       QUnit.test( 'Is functions', function ( assert ) {
+
+               assert.strictEqual( $.isDomElement( document.getElementById( 'qunit-header' ) ), true,
+                'isDomElement: #qunit-header Node' );
+               assert.strictEqual( $.isDomElement( document.getElementById( 'random-name' ) ), false,
+                'isDomElement: #random-name (null)' );
+               assert.strictEqual( $.isDomElement( document.getElementsByTagName( 'div' ) ), false,
+                'isDomElement: getElementsByTagName Array' );
+               assert.strictEqual( $.isDomElement( document.getElementsByTagName( 'div' )[0] ), true,
+                'isDomElement: getElementsByTagName(..)[0] Node' );
+               assert.strictEqual( $.isDomElement( $( 'div' ) ), false,
+                'isDomElement: jQuery object' );
+               assert.strictEqual( $.isDomElement( $( 'div' ).get(0) ), true,
+                'isDomElement: jQuery object > Get node' );
+               assert.strictEqual( $.isDomElement( document.createElement( 'div' ) ), true,
+                'isDomElement: createElement' );
+               assert.strictEqual( $.isDomElement( { foo: 1 } ), false,
+                'isDomElement: Object' );
+
+               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
+               assert.strictEqual( $.isEmpty( { length: 0 } ), true, 'isEmptry: { length: 0 }' );
+       });
+
+       QUnit.test( 'Comparison functions', function ( assert ) {
+
+               assert.ok( $.compareArray( [0, 'a', [], [2, 'b'] ], [0, 'a', [], [2, 'b'] ] ),
+                'compareArray: Two deep arrays that are excactly the same' );
+               assert.ok( !$.compareArray( [1], [2] ), 'compareArray: Two different arrays (false)' );
+
+               assert.ok( $.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)' );
+       });
+}( jQuery ) );
index 161f0cd..e31fc63 100644 (file)
@@ -1,33 +1,37 @@
-QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
+( function ( $ ) {
+       QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
 
-QUnit.test( 'firstTabIndex', 2, function ( assert ) {
-       var testEnvironment =
-'<form>' +
-       '<input tabindex="7" />' +
-       '<input tabindex="9" />' +
-       '<textarea tabindex="2">Foobar</textarea>' +
-       '<textarea tabindex="5">Foobar</textarea>' +
-'</form>';
+       QUnit.test( 'firstTabIndex', 2, function ( assert ) {
+               var html, $testA, $testB;
+               html =
+       '<form>' +
+               '<input tabindex="7" />' +
+               '<input tabindex="9" />' +
+               '<textarea tabindex="2">Foobar</textarea>' +
+               '<textarea tabindex="5">Foobar</textarea>' +
+       '</form>';
 
-       var $testA = $( '<div>' ).html( testEnvironment ).appendTo( '#qunit-fixture' );
-       assert.strictEqual( $testA.firstTabIndex(), 2, 'First tabindex should be 2 within this context.' );
+               $testA = $( '<div>' ).html( html ).appendTo( '#qunit-fixture' );
+               assert.strictEqual( $testA.firstTabIndex(), 2, 'First tabindex should be 2 within this context.' );
 
-       var $testB = $( '<div>' );
-       assert.strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
-});
+               $testB = $( '<div>' );
+               assert.strictEqual( $testB.firstTabIndex(), null, 'Return null if none available.' );
+       });
 
-QUnit.test( 'lastTabIndex', 2, function ( assert ) {
-       var testEnvironment =
-'<form>' +
-       '<input tabindex="7" />' +
-       '<input tabindex="9" />' +
-       '<textarea tabindex="2">Foobar</textarea>' +
-       '<textarea tabindex="5">Foobar</textarea>' +
-'</form>';
+       QUnit.test( 'lastTabIndex', 2, function ( assert ) {
+               var html, $testA, $testB;
+               html =
+       '<form>' +
+               '<input tabindex="7" />' +
+               '<input tabindex="9" />' +
+               '<textarea tabindex="2">Foobar</textarea>' +
+               '<textarea tabindex="5">Foobar</textarea>' +
+       '</form>';
 
-       var $testA = $( '<div>' ).html( testEnvironment ).appendTo( '#qunit-fixture' );
-       assert.strictEqual( $testA.lastTabIndex(), 9, 'Last tabindex should be 9 within this context.' );
+               $testA = $( '<div>' ).html( html ).appendTo( '#qunit-fixture' );
+               assert.strictEqual( $testA.lastTabIndex(), 9, 'Last tabindex should be 9 within this context.' );
 
-       var $testB = $( '<div>' );
-       assert.strictEqual( $testB.lastTabIndex(), null, 'Return null if none available.' );
-});
+               $testB = $( '<div>' );
+               assert.strictEqual( $testB.lastTabIndex(), null, 'Return null if none available.' );
+       });
+}( jQuery ) );
index 16d8170..0000f0c 100644 (file)
 ( function ( $, mw ) {
-
-var config = {
-       wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
-       wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-       wgDefaultDateFormat: 'dmy',
-       wgContentLanguage: 'en'
-};
-
-QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment({ config: config }) );
-
-/**
- * Create an HTML table from an array of row arrays containing text strings.
- * First row will be header row. No fancy rowspan/colspan stuff.
- *
- * @param {String[]} header
- * @param {String[][]} data
- * @return jQuery
- */
-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 ) {
-               var $th = $( '<th>' );
-               $th.text( str ).appendTo( $tr );
-       });
-       $tr.appendTo( $thead );
-
-       for ( i = 0; i < data.length; i++ ) {
-               $tr = $( '<tr>' );
-               $.each( data[i], function ( j, str ) {
-                       var $td = $( '<td>' );
-                       $td.text( str ).appendTo( $tr );
+       /*jshint onevar: false */
+
+       var config = {
+               wgMonthNames: ['', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
+               wgMonthNamesShort: ['', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+               wgDefaultDateFormat: 'dmy',
+               wgContentLanguage: 'en'
+       };
+
+       QUnit.module( 'jquery.tablesorter', QUnit.newMwEnvironment({ config: config }) );
+
+       /**
+        * Create an HTML table from an array of row arrays containing text strings.
+        * First row will be header row. No fancy rowspan/colspan stuff.
+        *
+        * @param {String[]} header
+        * @param {String[][]} data
+        * @return jQuery
+        */
+       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 ) {
+                       var $th = $( '<th>' );
+                       $th.text( str ).appendTo( $tr );
                });
-               $tr.appendTo( $tbody );
+               $tr.appendTo( $thead );
+
+               for ( i = 0; i < data.length; i++ ) {
+                       /*jshint loopfunc: true */
+                       $tr = $( '<tr>' );
+                       $.each( data[i], function ( j, str ) {
+                               var $td = $( '<td>' );
+                               $td.text( str ).appendTo( $tr );
+                       });
+                       $tr.appendTo( $tbody );
+               }
+               return $table;
        }
-       return $table;
-}
-
-/**
- * Extract text from table.
- *
- * @param {jQuery} $table
- * @return String[][]
- */
-function tableExtract( $table ) {
-       var data = [];
-
-       $table.find( 'tbody' ).find( 'tr' ).each( function( i, tr ) {
-               var row = [];
-               $( tr ).find( 'td,th' ).each( function( i, td ) {
-                       row.push( $( td ).text() );
+
+       /**
+        * Extract text from table.
+        *
+        * @param {jQuery} $table
+        * @return String[][]
+        */
+       function tableExtract( $table ) {
+               var data = [];
+
+               $table.find( 'tbody' ).find( 'tr' ).each( function( i, tr ) {
+                       var row = [];
+                       $( tr ).find( 'td,th' ).each( function( i, td ) {
+                               row.push( $( td ).text() );
+                       });
+                       data.push( row );
                });
-               data.push( row );
-       });
-       return data;
-}
-
-/**
- * Run a table test by building a table with the given data,
- * running some callback on it, then checking the results.
- *
- * @param {String} msg text to pass on to qunit for the comparison
- * @param {String[]} header cols to make the table
- * @param {String[][]} data rows/cols to make the table
- * @param {String[][]} expected rows/cols to compare against at end
- * @param {function($table)} callback something to do with the table before we compare
- */
-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.
-               callback( $table );
-
-               // 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 );
-               assert.deepEqual( extracted, expected, msg );
-       });
-}
-
-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)'],
-       mercury = [ 'Mercury', '2439.7' ],
-       venus   = [ 'Venus'  , '6051.8' ],
-       earth   = [ 'Earth'  , '6371.0' ],
-       mars    = [ 'Mars'   , '3390.0' ],
-       jupiter = [ 'Jupiter',  '69911' ],
-       saturn  = [ 'Saturn' ,  '58232' ];
-
-// Initial data set
-var planets         = [mercury, venus, earth, mars, jupiter, saturn];
-var ascendingName   = [earth, jupiter, mars, mercury, saturn, venus];
-var ascendingRadius = [mercury, mars, venus, earth, saturn, jupiter];
-
-tableTest(
-       'Basic planet table: ascending by name',
-       header,
-       planets,
-       ascendingName,
-       function ( $table ) {
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
-tableTest(
-       'Basic planet table: ascending by name a second time',
-       header,
-       planets,
-       ascendingName,
-       function ( $table ) {
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
-tableTest(
-       'Basic planet table: descending by name',
-       header,
-       planets,
-       reversed(ascendingName),
-       function ( $table ) {
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click().click();
-       }
-);
-tableTest(
-       'Basic planet table: ascending radius',
-       header,
-       planets,
-       ascendingRadius,
-       function ( $table ) {
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(1)' ).click();
-       }
-);
-tableTest(
-       'Basic planet table: descending radius',
-       header,
-       planets,
-       reversed(ascendingRadius),
-       function ( $table ) {
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(1)' ).click().click();
+               return data;
        }
-);
-
-
-// Regression tests!
-tableTest(
-       'Bug 28775: German-style (dmy) short numeric dates',
-       ['Date'],
-       [ // German-style dates are day-month-year
-               ['11.11.2011'],
-               ['01.11.2011'],
-               ['02.10.2011'],
-               ['03.08.2011'],
-               ['09.11.2011']
-       ],
-       [ // Sorted by ascending date
-               ['03.08.2011'],
-               ['02.10.2011'],
-               ['01.11.2011'],
-               ['09.11.2011'],
-               ['11.11.2011']
-       ],
-       function ( $table ) {
-               mw.config.set( 'wgDefaultDateFormat', 'dmy' );
-               mw.config.set( 'wgContentLanguage', 'de' );
 
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
+       /**
+        * Run a table test by building a table with the given data,
+        * running some callback on it, then checking the results.
+        *
+        * @param {String} msg text to pass on to qunit for the comparison
+        * @param {String[]} header cols to make the table
+        * @param {String[][]} data rows/cols to make the table
+        * @param {String[][]} expected rows/cols to compare against at end
+        * @param {function($table)} callback something to do with the table before we compare
+        */
+       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.
+                       callback( $table );
+
+                       // 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 );
+                       assert.deepEqual( extracted, expected, msg );
+               });
        }
-);
-
-tableTest(
-       'Bug 28775: American-style (mdy) short numeric dates',
-       ['Date'],
-       [ // American-style dates are month-day-year
-               ['11.11.2011'],
-               ['01.11.2011'],
-               ['02.10.2011'],
-               ['03.08.2011'],
-               ['09.11.2011']
-       ],
-       [ // Sorted by ascending date
-               ['01.11.2011'],
-               ['02.10.2011'],
-               ['03.08.2011'],
-               ['09.11.2011'],
-               ['11.11.2011']
-       ],
-       function ( $table ) {
-               mw.config.set( 'wgDefaultDateFormat', 'mdy' );
 
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
-
-var ipv4 = [
-       // Some randomly generated fake IPs
-       ['45.238.27.109'],
-       ['44.172.9.22'],
-       ['247.240.82.209'],
-       ['204.204.132.158'],
-       ['170.38.91.162'],
-       ['197.219.164.9'],
-       ['45.68.154.72'],
-       ['182.195.149.80']
-];
-var ipv4Sorted = [
-       // Sort order should go octet by octet
-       ['44.172.9.22'],
-       ['45.68.154.72'],
-       ['45.238.27.109'],
-       ['170.38.91.162'],
-       ['182.195.149.80'],
-       ['197.219.164.9'],
-       ['204.204.132.158'],
-       ['247.240.82.209']
-];
-
-tableTest(
-       'Bug 17141: IPv4 address sorting',
-       ['IP'],
-       ipv4,
-       ipv4Sorted,
-       function ( $table ) {
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
-tableTest(
-       'Bug 17141: IPv4 address sorting (reverse)',
-       ['IP'],
-       ipv4,
-       reversed(ipv4Sorted),
-       function ( $table ) {
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click().click();
-       }
-);
-
-var umlautWords = [
-       // Some words with Umlauts
-       ['Günther'],
-       ['Peter'],
-       ['Björn'],
-       ['Bjorn'],
-       ['Apfel'],
-       ['Äpfel'],
-       ['Strasse'],
-       ['Sträßschen']
-];
-
-var umlautWordsSorted = [
-       // Some words with Umlauts
-       ['Äpfel'],
-       ['Apfel'],
-       ['Björn'],
-       ['Bjorn'],
-       ['Günther'],
-       ['Peter'],
-       ['Sträßschen'],
-       ['Strasse']
-];
-
-tableTest(
-       'Accented Characters with custom collation',
-       ['Name'],
-       umlautWords,
-       umlautWordsSorted,
-       function ( $table ) {
-               mw.config.set( 'tableSorterCollation', {
-                       'ä': 'ae',
-                       'ö': 'oe',
-                       'ß': 'ss',
-                       'ü':'ue'
-               } );
+       function reversed(arr) {
+               // Clone array
+               var arr2 = arr.slice(0);
 
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
+               arr2.reverse();
+
+               return arr2;
        }
-);
-
-var planetsRowspan = [["Earth","6051.8"], jupiter, ["Mars","6051.8"], mercury, saturn, venus];
-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 ) {
-               // Modify the table to have a multiuple-row-spanning cell:
+
+       // Sample data set using planets named and their radius
+       var header  = [ 'Planet' , 'Radius (km)'],
+               mercury = [ 'Mercury', '2439.7' ],
+               venus   = [ 'Venus'  , '6051.8' ],
+               earth   = [ 'Earth'  , '6371.0' ],
+               mars    = [ 'Mars'   , '3390.0' ],
+               jupiter = [ 'Jupiter',  '69911' ],
+               saturn  = [ 'Saturn' ,  '58232' ];
+
+       // Initial data set
+       var planets         = [mercury, venus, earth, mars, jupiter, saturn];
+       var ascendingName   = [earth, jupiter, mars, mercury, saturn, venus];
+       var ascendingRadius = [mercury, mars, venus, earth, saturn, jupiter];
+
+       tableTest(
+               'Basic planet table: sorting initially - ascending by name',
+               header,
+               planets,
+               ascendingName,
+               function ( $table ) {
+                       $table.tablesorter( { sortList: [ { 0: 'asc' } ] } );
+               }
+       );
+       tableTest(
+               'Basic planet table: sorting initially - descending by radius',
+               header,
+               planets,
+               reversed(ascendingRadius),
+               function ( $table ) {
+                       $table.tablesorter( { sortList: [ { 1: 'desc' } ] } );
+               }
+       );
+       tableTest(
+               'Basic planet table: ascending by name',
+               header,
+               planets,
+               ascendingName,
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+       tableTest(
+               'Basic planet table: ascending by name a second time',
+               header,
+               planets,
+               ascendingName,
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+       tableTest(
+               'Basic planet table: descending by name',
+               header,
+               planets,
+               reversed(ascendingName),
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click().click();
+               }
+       );
+       tableTest(
+               'Basic planet table: ascending radius',
+               header,
+               planets,
+               ascendingRadius,
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(1)' ).click();
+               }
+       );
+       tableTest(
+               'Basic planet table: descending radius',
+               header,
+               planets,
+               reversed(ascendingRadius),
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(1)' ).click().click();
+               }
+       );
+
+       // Sample data set to test multiple column sorting
+       header = [ 'column1' , 'column2'];
+       var
+               a1 = [ 'A', '1' ],
+               a2 = [ 'A', '2' ],
+               a3 = [ 'A', '3' ],
+               b1 = [ 'B', '1' ],
+               b2 = [ 'B', '2' ],
+               b3 = [ 'B', '3' ];
+       var initial = [a2, b3, a1, a3, b2, b1];
+       var asc = [a1, a2, a3, b1, b2, b3];
+       var descasc = [b1, b2, b3, a1, a2, a3];
+
+       tableTest(
+               'Sorting multiple columns by passing sort list',
+               header,
+               initial,
+               asc,
+               function ( $table ) {
+                       $table.tablesorter(
+                               { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+                       );
+               }
+       );
+       tableTest(
+               'Sorting multiple columns by programmatically triggering sort()',
+               header,
+               initial,
+               descasc,
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.data( 'tablesorter' ).sort(
+                               [ { 0: 'desc' }, { 1: 'asc' } ]
+                       );
+               }
+       );
+       tableTest(
+               'Reset to initial sorting by triggering sort() without any parameters',
+               header,
+               initial,
+               asc,
+               function ( $table ) {
+                       $table.tablesorter(
+                               { sortList: [ { 0: 'asc' }, { 1: 'asc' } ] }
+                       );
+                       $table.data( 'tablesorter' ).sort(
+                               [ { 0: 'desc' }, { 1: 'asc' } ]
+                       );
+                       $table.data( 'tablesorter' ).sort();
+               }
+       );
+       QUnit.test( 'Reset sorting making table appear unsorted', 3, function ( assert ) {
+               var $table = tableCreate( header, initial );
+               $table.tablesorter(
+                       { sortList: [ { 0: 'desc' }, { 1: 'asc' } ] }
+               );
+               $table.data( 'tablesorter' ).sort( [] );
+
+               assert.equal(
+                       $table.find( 'th.headerSortUp' ).length + $table.find( 'th.headerSortDown' ).length,
+                       0,
+                       'No sort specific sort classes addign to header cells'
+               );
+
+               assert.equal(
+                       $table.find( 'th' ).first().attr( 'title' ),
+                       mw.msg( 'sort-ascending' ),
+                       'First header cell has default title'
+               );
+
+               assert.equal(
+                       $table.find( 'th' ).first().attr( 'title' ),
+                       $table.find( 'th' ).last().attr( 'title' ),
+                       'Both header cells\' titles match'
+               );
+       } );
+
+       // Sorting with colspans
+       header = [ 'column1a' , 'column1b', 'column1c', 'column2' ];
+       var
+               aaa1 = [ 'A', 'A', 'A', '1' ],
+               aab5 = [ 'A', 'A', 'B', '5' ],
+               abc3 = [ 'A', 'B', 'C', '3' ],
+               bbc2 = [ 'B', 'B', 'C', '2' ],
+               caa4 = [ 'C', 'A', 'A', '4' ];
+       // initial is already declared above
+       initial = [ aab5, aaa1, abc3, bbc2, caa4 ];
+       tableTest( 'Sorting with colspanned headers: spanned column',
+               header,
+               initial,
+               [ aaa1, aab5, abc3, bbc2, caa4 ],
+               function ( $table ) {
+                       // Make colspanned header for test
+                       $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
+                       $table.find( 'tr:eq(0) th:eq(0)' ).prop( 'colspan', '3' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+       tableTest( 'Sorting with colspanned headers: subsequent column',
+               header,
+               initial,
+               [ aaa1, bbc2, abc3, caa4, aab5 ],
+               function ( $table ) {
+                       // Make colspanned header for test
+                       $table.find( 'tr:eq(0) th:eq(1), tr:eq(0) th:eq(2)' ).remove();
+                       $table.find( 'tr:eq(0) th:eq(0)' ).prop( 'colspan', '3' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(1)' ).click();
+               }
+       );
+
+       // Regression tests!
+       tableTest(
+               'Bug 28775: German-style (dmy) short numeric dates',
+               ['Date'],
+               [ // German-style dates are day-month-year
+                       ['11.11.2011'],
+                       ['01.11.2011'],
+                       ['02.10.2011'],
+                       ['03.08.2011'],
+                       ['09.11.2011']
+               ],
+               [ // Sorted by ascending date
+                       ['03.08.2011'],
+                       ['02.10.2011'],
+                       ['01.11.2011'],
+                       ['09.11.2011'],
+                       ['11.11.2011']
+               ],
+               function ( $table ) {
+                       mw.config.set( 'wgDefaultDateFormat', 'dmy' );
+                       mw.config.set( 'wgContentLanguage', 'de' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+
+       tableTest(
+               'Bug 28775: American-style (mdy) short numeric dates',
+               ['Date'],
+               [ // American-style dates are month-day-year
+                       ['11.11.2011'],
+                       ['01.11.2011'],
+                       ['02.10.2011'],
+                       ['03.08.2011'],
+                       ['09.11.2011']
+               ],
+               [ // Sorted by ascending date
+                       ['01.11.2011'],
+                       ['02.10.2011'],
+                       ['03.08.2011'],
+                       ['09.11.2011'],
+                       ['11.11.2011']
+               ],
+               function ( $table ) {
+                       mw.config.set( 'wgDefaultDateFormat', 'mdy' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+
+       var ipv4 = [
+               // Some randomly generated fake IPs
+               ['45.238.27.109'],
+               ['44.172.9.22'],
+               ['247.240.82.209'],
+               ['204.204.132.158'],
+               ['170.38.91.162'],
+               ['197.219.164.9'],
+               ['45.68.154.72'],
+               ['182.195.149.80']
+       ];
+       var ipv4Sorted = [
+               // Sort order should go octet by octet
+               ['44.172.9.22'],
+               ['45.68.154.72'],
+               ['45.238.27.109'],
+               ['170.38.91.162'],
+               ['182.195.149.80'],
+               ['197.219.164.9'],
+               ['204.204.132.158'],
+               ['247.240.82.209']
+       ];
+
+       tableTest(
+               'Bug 17141: IPv4 address sorting',
+               ['IP'],
+               ipv4,
+               ipv4Sorted,
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+       tableTest(
+               'Bug 17141: IPv4 address sorting (reverse)',
+               ['IP'],
+               ipv4,
+               reversed(ipv4Sorted),
+               function ( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click().click();
+               }
+       );
+
+       var umlautWords = [
+               // Some words with Umlauts
+               ['Günther'],
+               ['Peter'],
+               ['Björn'],
+               ['Bjorn'],
+               ['Apfel'],
+               ['Äpfel'],
+               ['Strasse'],
+               ['Sträßschen']
+       ];
+
+       var umlautWordsSorted = [
+               // Some words with Umlauts
+               ['Äpfel'],
+               ['Apfel'],
+               ['Björn'],
+               ['Bjorn'],
+               ['Günther'],
+               ['Peter'],
+               ['Sträßschen'],
+               ['Strasse']
+       ];
+
+       tableTest(
+               'Accented Characters with custom collation',
+               ['Name'],
+               umlautWords,
+               umlautWordsSorted,
+               function ( $table ) {
+                       mw.config.set( 'tableSorterCollation', {
+                               'ä': 'ae',
+                               'ö': 'oe',
+                               'ß': 'ss',
+                               'ü':'ue'
+                       } );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+
+       QUnit.test( 'Rowspan not exploded on init', 1, function ( assert ) {
+               var $table = tableCreate( header, planets );
+
+               // Modify the table to have a multiple-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();
                // - Set rowspan for 2nd cell of 3rd row to 3.
@@ -314,384 +441,444 @@ tableTest(
                $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
 
                $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
-tableTest(
-       'Basic planet table: Same value for multiple rows via rowspan II',
-       header,
-       planets,
-       planetsRowspanII,
-       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();
-               // - Set rowspan for 1st cell of 3rd row to 3.
-               //   This covers the removed cell in the 4th and 5th row.
-               $table.find( 'tr:eq(2) td:eq(0)' ).prop( 'rowspan', '3' );
-
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
-
-var complexMDYDates = [
-       // Some words with Umlauts
-       ['January, 19 2010'],
-       ['April 21 1991'],
-       ['04 22 1991'],
-       ['5.12.1990'],
-       ['December 12 \'10']
-];
-
-var complexMDYSorted = [
-       ['5.12.1990'],
-       ['April 21 1991'],
-       ['04 22 1991'],
-       ['January, 19 2010'],
-       ['December 12 \'10']
-];
-
-tableTest(
-       'Complex date parsing I',
-       ['date'],
-       complexMDYDates,
-       complexMDYSorted,
-       function ( $table ) {
-               mw.config.set( 'wgDefaultDateFormat', 'mdy' );
 
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
-
-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();
-
-tableTest(
-       'Legacy compat with .sortbottom',
-       header,
-       planets,
-       ascendingNameLegacy,
-       function( $table ) {
-               $table.find( 'tr:last' ).addClass( 'sortbottom' );
-               $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
-
-
-/** FIXME: the diff output is not very readeable. */
-QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {
-       var $table;
-       $table = $(
-               '<table class="sortable">' +
-               '<caption>CAPTION</caption>' +
-               '<tr><th>THEAD</th></tr>' +
-               '<tr><td>A</td></tr>' +
-               '<tr><td>B</td></tr>' +
-               '<tr class="sortbottom"><td>TFOOT</td></tr>' +
-               '</table>'
+               assert.equal(
+                       $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan' ),
+                       3,
+                       'Rowspan not exploded'
                );
-       $table.tablesorter();
+       });
 
-       assert.equal(
-               $table.children( ).get( 0 ).nodeName,
-               'CAPTION',
-               'First element after <thead> must be <caption> (bug 32047)'
+       var planetsRowspan = [ [ 'Earth', '6051.8' ], jupiter, [ 'Mars', '6051.8' ], mercury, saturn, venus ];
+       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 ) {
+                       // Modify the table to have a multiple-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();
+                       // - Set rowspan for 2nd cell of 3rd row to 3.
+                       //   This covers the removed cell in the 4th and 5th row.
+                       $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
        );
-});
-
-QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
-       var $table, data;
-
-       // 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>' +
-                       '<tr><td>Cheetah</td></tr>' +
-                       '<tr><td data-sort-value="Apple">Bird</td></tr>' +
-                       '<tr><td data-sort-value="Bananna">Ferret</td></tr>' +
-                       '<tr><td data-sort-value="Drupe">Elephant</td></tr>' +
-                       '<tr><td data-sort-value="Cherry">Dolphin</td></tr>' +
-               '</tbody></table>'
+       tableTest(
+               'Basic planet table: same value for multiple rows via rowspan (sorting initially)',
+               header,
+               planets,
+               planetsRowspan,
+               function ( $table ) {
+                       // Modify the table to have a multiple-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();
+                       // - Set rowspan for 2nd cell of 3rd row to 3.
+                       //   This covers the removed cell in the 4th and 5th row.
+                       $table.find( 'tr:eq(2) td:eq(1)' ).prop( 'rowspan', '3' );
+
+                       $table.tablesorter( { sortList: [ { 0: 'asc' } ] } );
+               }
+       );
+       tableTest(
+               'Basic planet table: Same value for multiple rows via rowspan II',
+               header,
+               planets,
+               planetsRowspanII,
+               function ( $table ) {
+                       // Modify the table to have a multiple-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();
+                       // - Set rowspan for 1st cell of 3rd row to 3.
+                       //   This covers the removed cell in the 4th and 5th row.
+                       $table.find( 'tr:eq(2) td:eq(0)' ).prop( 'rowspan', '3' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
        );
-       $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: 'Apple',
-                       text: 'Bird'
-               }, {
-                       data: 'Bananna',
-                       text: 'Ferret'
-               }, {
-                       data: undefined,
-                       text: 'Cheetah'
-               }, {
-                       data: 'Cherry',
-                       text: 'Dolphin'
-               }, {
-                       data: 'Drupe',
-                       text: 'Elephant'
+       var complexMDYDates = [
+               // Some words with Umlauts
+               ['January, 19 2010'],
+               ['April 21 1991'],
+               ['04 22 1991'],
+               ['5.12.1990'],
+               ['December 12 \'10']
+       ];
+
+       var complexMDYSorted = [
+               ['5.12.1990'],
+               ['April 21 1991'],
+               ['04 22 1991'],
+               ['January, 19 2010'],
+               ['December 12 \'10']
+       ];
+
+       tableTest(
+               'Complex date parsing I',
+               ['date'],
+               complexMDYDates,
+               complexMDYSorted,
+               function ( $table ) {
+                       mw.config.set( 'wgDefaultDateFormat', 'mdy' );
+
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
                }
-       ], 'Order matches expected order (based on data-sort-value attribute values)' );
-
-       // Example 2
-       $table = $(
-               '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
-                       '<tbody>' +
-                       '<tr><td>D</td></tr>' +
-                       '<tr><td data-sort-value="E">A</td></tr>' +
-                       '<tr><td>B</td></tr>' +
-                       '<tr><td>G</td></tr>' +
-                       '<tr><td data-sort-value="F">C</td></tr>' +
-               '</tbody></table>'
        );
-       $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'
+       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();
                }
-       ], '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( 'sortValue' ),
-                               text: $( td ).text()
-                       } );
-               });
-       });
 
-       assert.deepEqual( data, [
-               {
-                       data: 1,
-                       text: "B"
-               }, {
-                       data: 2,
-                       text: "G"
-               }, {
-                       data: 3,
-                       text: "A"
-               }, {
-                       data: undefined,
-                       text: "C"
-               }, {
-                       data: undefined,
-                       text: "D"
+       var ascendingNameLegacy = ascendingName.slice(0);
+       ascendingNameLegacy[4] = ascendingNameLegacy[5];
+       ascendingNameLegacy.pop();
+
+       tableTest(
+               'Legacy compat with .sortbottom',
+               header,
+               planets,
+               ascendingNameLegacy,
+               function( $table ) {
+                       $table.find( 'tr:last' ).addClass( 'sortbottom' );
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
                }
-       ], 'Order matches expected order, using the current sortValue in $.data()' );
-
-});
-
-var numbers = [
-       [ '12'    ],
-       [  '7'    ],
-       [ '13,000'],
-       [  '9'    ],
-       [ '14'    ],
-       [  '8.0'  ]
-];
-var numbersAsc = [
-       [  '7'    ],
-       [  '8.0'  ],
-       [  '9'    ],
-       [ '12'    ],
-       [ '14'    ],
-       [ '13,000']
-];
-
-tableTest( 'bug 8115: sort numbers with commas (ascending)',
-       ['Numbers'], numbers, numbersAsc,
-       function( $table ) {
+       );
+
+       QUnit.test( 'Test detection routine', function ( assert ) {
+               var $table;
+               $table = $(
+                       '<table class="sortable">' +
+                       '<caption>CAPTION</caption>' +
+                       '<tr><th>THEAD</th></tr>' +
+                       '<tr><td>1</td></tr>' +
+                       '<tr class="sortbottom"><td>text</td></tr>' +
+                       '</table>'
+               );
                $table.tablesorter();
                $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
 
-tableTest( 'bug 8115: sort numbers with commas (descending)',
-       ['Numbers'], numbers, reversed(numbersAsc),
-       function( $table ) {
+               assert.equal(
+                       $table.data( 'tablesorter' ).config.parsers[0].id,
+                       'number',
+                       'Correctly detected column content skipping sortbottom'
+               );
+       } );
+
+       /** FIXME: the diff output is not very readeable. */
+       QUnit.test( 'bug 32047 - caption must be before thead', function ( assert ) {
+               var $table;
+               $table = $(
+                       '<table class="sortable">' +
+                       '<caption>CAPTION</caption>' +
+                       '<tr><th>THEAD</th></tr>' +
+                       '<tr><td>A</td></tr>' +
+                       '<tr><td>B</td></tr>' +
+                       '<tr class="sortbottom"><td>TFOOT</td></tr>' +
+                       '</table>'
+                       );
                $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click().click();
-       }
-);
-// TODO add numbers sorting tests for bug 8115 with a different language
-
-QUnit.test( 'bug 32888 - Tables inside a tableheader cell', 2, function ( assert ) {
-       var $table;
-       $table = $(
-               '<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>' +
-               '<tr><td>B</td></tr>' +
-               '</table>'
+
+               assert.equal(
+                       $table.children( ).get( 0 ).nodeName,
+                       'CAPTION',
+                       'First element after <thead> must be <caption> (bug 32047)'
                );
-       $table.tablesorter();
+       });
 
-       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)'
-       );
-       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)'
-       );
-});
+       QUnit.test( 'data-sort-value attribute, when available, should override sorting position', function ( assert ) {
+               var $table, data;
+
+               // 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>' +
+                               '<tr><td>Cheetah</td></tr>' +
+                               '<tr><td data-sort-value="Apple">Bird</td></tr>' +
+                               '<tr><td data-sort-value="Bananna">Ferret</td></tr>' +
+                               '<tr><td data-sort-value="Drupe">Elephant</td></tr>' +
+                               '<tr><td data-sort-value="Cherry">Dolphin</td></tr>' +
+                       '</tbody></table>'
+               );
+               $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: 'Apple',
+                               text: 'Bird'
+                       }, {
+                               data: 'Bananna',
+                               text: 'Ferret'
+                       }, {
+                               data: undefined,
+                               text: 'Cheetah'
+                       }, {
+                               data: 'Cherry',
+                               text: 'Dolphin'
+                       }, {
+                               data: 'Drupe',
+                               text: 'Elephant'
+                       }
+               ], 'Order matches expected order (based on data-sort-value attribute values)' );
+
+               // Example 2
+               $table = $(
+                       '<table class="sortable"><thead><tr><th>Data</th></tr></thead>' +
+                               '<tbody>' +
+                               '<tr><td>D</td></tr>' +
+                               '<tr><td data-sort-value="E">A</td></tr>' +
+                               '<tr><td>B</td></tr>' +
+                               '<tr><td>G</td></tr>' +
+                               '<tr><td data-sort-value="F">C</td></tr>' +
+                       '</tbody></table>'
+               );
+               $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()
+                               } );
+                       });
+               });
 
-var correctDateSorting1 = [
-       ['01 January 2010'],
-       ['05 February 2010'],
-       ['16 January 2010']
-];
+               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();
 
-var correctDateSortingSorted1 = [
-       ['01 January 2010'],
-       ['16 January 2010'],
-       ['05 February 2010']
-];
+               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()
+                               } );
+                       });
+               });
 
-tableTest(
-       'Correct date sorting I',
-       ['date'],
-       correctDateSorting1,
-       correctDateSortingSorted1,
-       function ( $table ) {
-               mw.config.set( 'wgDefaultDateFormat', 'mdy' );
+               assert.deepEqual( data, [
+                       {
+                               data: 1,
+                               text: 'B'
+                       }, {
+                               data: 2,
+                               text: 'G'
+                       }, {
+                               data: 3,
+                               text: 'A'
+                       }, {
+                               data: undefined,
+                               text: 'C'
+                       }, {
+                               data: undefined,
+                               text: 'D'
+                       }
+               ], 'Order matches expected order, using the current sortValue in $.data()' );
 
-               $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' );
+       });
 
+       var numbers = [
+               [ '12'    ],
+               [  '7'    ],
+               [ '13,000'],
+               [  '9'    ],
+               [ '14'    ],
+               [  '8.0'  ]
+       ];
+       var numbersAsc = [
+               [  '7'    ],
+               [  '8.0'  ],
+               [  '9'    ],
+               [ '12'    ],
+               [ '14'    ],
+               [ '13,000']
+       ];
+
+       tableTest( 'bug 8115: sort numbers with commas (ascending)',
+               ['Numbers'], numbers, numbersAsc,
+               function( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click();
+               }
+       );
+
+       tableTest( 'bug 8115: sort numbers with commas (descending)',
+               ['Numbers'], numbers, reversed(numbersAsc),
+               function( $table ) {
+                       $table.tablesorter();
+                       $table.find( '.headerSort:eq(0)' ).click().click();
+               }
+       );
+       // TODO add numbers sorting tests for bug 8115 with a different language
+
+       QUnit.test( 'bug 32888 - Tables inside a tableheader cell', 2, function ( assert ) {
+               var $table;
+               $table = $(
+                       '<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>' +
+                       '<tr><td>B</td></tr>' +
+                       '</table>'
+                       );
                $table.tablesorter();
-               $table.find( '.headerSort:eq(0)' ).click();
-       }
-);
+
+               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)'
+               );
+               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)'
+               );
+       });
+
+
+       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 f0a210f..1795b95 100644 (file)
-QUnit.module( 'jquery.textSelection', QUnit.newMwEnvironment() );
-
-/**
- * Test factory for $.fn.textSelection( 'encapsulateText' )
- *
- * @param options {object} associative array containing:
- *   description {string}
- *   input {string}
- *   output {string}
- *   start {int} starting char for selection
- *   end {int} ending char for selection
- *   params {object} add'l parameters for $().textSelection( 'encapsulateText' )
- */
-function encapsulateTest( options ) {
-       var opt = $.extend({
-               description: '',
-               before: {},
-               after: {},
-               replace: {}
-       }, options);
-
-       opt.before = $.extend({
-               text: '',
-               start: 0,
-               end: 0
-       }, opt.before);
-       opt.after = $.extend({
-               text: '',
-               selected: null
-       }, opt.after);
-
-       QUnit.test( opt.description, function ( assert ) {
-               var tests = 1;
-               if ( opt.after.selected !== null ) {
-                       tests++;
-               }
-               QUnit.expect( tests );
-
-               var $textarea = $( '<textarea>' );
-
-               $( '#qunit-fixture' ).append( $textarea );
-
-               //$textarea.textSelection( 'setContents', opt.before.text); // this method is actually missing atm...
-               $textarea.val( opt.before.text ); // won't work with the WikiEditor iframe?
-
-               var     start = opt.before.start,
-                       end = opt.before.end;
-               if ( window.opera ) {
-                       // Compensate for Opera's craziness converting "\n" to "\r\n" and counting that as two chars
-                       var     newLinesBefore = opt.before.text.substring( 0, start ).split( "\n" ).length - 1,
-                               newLinesInside = opt.before.text.substring( start, end ).split( "\n" ).length - 1;
-                       start += newLinesBefore;
-                       end += newLinesBefore + newLinesInside;
-               }
-
-               var options = $.extend( {}, opt.replace ); // Clone opt.replace
-               options.selectionStart = start;
-               options.selectionEnd = end;
-               $textarea.textSelection( 'encapsulateSelection', options );
-
-               var text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, "\n" );
-
-               assert.equal( text, opt.after.text, 'Checking full text after encapsulation' );
-
-               if (opt.after.selected !== null) {
-                       var selected = $textarea.textSelection( 'getSelection' );
-                       assert.equal( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
-               }
-
-       } );
-}
-
-var sig = {
-       'pre': "--~~~~"
-}, bold = {
-       pre: "'''",
-       peri: 'Bold text',
-       post: "'''"
-}, h2 = {
-       'pre': '== ',
-       'peri': 'Heading 2',
-       'post': ' ==',
-       'regex': /^(\s*)(={1,6})(.*?)\2(\s*)$/,
-       'regexReplace': "$1==$3==$4",
-       'ownline': true
-}, ulist = {
-       'pre': "* ",
-       'peri': 'Bulleted list item',
-       'post': "",
-       'ownline': true,
-       'splitlines': true
-};
-
-encapsulateTest({
-       description: "Adding sig to end of text",
-       before: {
-               text: "Wikilove dude! ",
-               start: 15,
-               end: 15
-       },
-       after: {
-               text: "Wikilove dude! --~~~~",
-               selected: ""
-       },
-       replace: sig
-});
-
-encapsulateTest({
-       description: "Adding bold to empty",
-       before: {
-               text: "",
-               start: 0,
-               end: 0
-       },
-       after: {
-               text: "'''Bold text'''",
-               selected: "Bold text" // selected because it's the default
-       },
-       replace: bold
-});
-
-encapsulateTest({
-       description: "Adding bold to existing text",
-       before: {
-               text: "Now is the time for all good men to come to the aid of their country",
-               start: 20,
-               end: 32
-       },
-       after: {
-               text: "Now is the time for '''all good men''' to come to the aid of their country",
-               selected: "" // empty because it's not the default'
-       },
-       replace: bold
-});
-
-encapsulateTest({
-       description: "ownline option: adding new h2",
-       before: {
-               text:"Before\nAfter",
-               start: 7,
-               end: 7
-       },
-       after: {
-               text: "Before\n== Heading 2 ==\nAfter",
-               selected: "Heading 2"
-       },
-       replace: h2
-});
-
-encapsulateTest({
-       description: "ownline option: turn a whole line into new h2",
-       before: {
-               text:"Before\nMy heading\nAfter",
-               start: 7,
-               end: 17
-       },
-       after: {
-               text: "Before\n== My heading ==\nAfter",
-               selected: ""
-       },
-       replace: h2
-});
-
-
-encapsulateTest({
-       description: "ownline option: turn a partial line into new h2",
-       before: {
-               text:"BeforeMy headingAfter",
-               start: 6,
-               end: 16
-       },
-       after: {
-               text: "Before\n== My heading ==\nAfter",
-               selected: ""
-       },
-       replace: h2
-});
-
-
-encapsulateTest({
-       description: "splitlines option: no selection, insert new list item",
-       before: {
-               text: "Before\nAfter",
-               start: 7,
-               end: 7
-       },
-       after: {
-               text: "Before\n* Bulleted list item\nAfter"
-       },
-       replace: ulist
-});
-
-encapsulateTest({
-       description: "splitlines option: single partial line selection, insert new list item",
-       before: {
-               text: "BeforeMy List ItemAfter",
-               start: 6,
-               end: 18
-       },
-       after: {
-               text: "Before\n* My List Item\nAfter"
-       },
-       replace: ulist
-});
-
-encapsulateTest({
-       description: "splitlines option: multiple lines",
-       before: {
-               text: "Before\nFirst\nSecond\nThird\nAfter",
-               start: 7,
-               end: 25
-       },
-       after: {
-               text: "Before\n* First\n* Second\n* Third\nAfter"
-       },
-       replace: ulist
-});
-
-
-function caretTest( options ) {
-       QUnit.test( options.description, 2, function ( assert ) {
-               var $textarea = $( '<textarea>' ).text( options.text );
-
-               $( '#qunit-fixture' ).append( $textarea );
-
-               if ( options.mode === 'set' ) {
-                       $textarea.textSelection('setSelection', {
-                               start: options.start,
-                               end: options.end
-                       });
-               }
-
-               function among( actual, expected, message ) {
-                       if ( $.isArray( expected ) ) {
-                               assert.ok( $.inArray( actual, expected ) !== -1 , message + ' (got ' + actual + '; expected one of ' + expected.join(', ') + ')' );
-                       } else {
-                               assert.equal( actual, expected, message );
+( function ( $ ) {
+
+       QUnit.module( 'jquery.textSelection', QUnit.newMwEnvironment() );
+
+       /**
+        * Test factory for $.fn.textSelection( 'encapsulateText' )
+        *
+        * @param options {object} associative array containing:
+        *   description {string}
+        *   input {string}
+        *   output {string}
+        *   start {int} starting char for selection
+        *   end {int} ending char for selection
+        *   params {object} add'l parameters for $().textSelection( 'encapsulateText' )
+        */
+       function encapsulateTest( options ) {
+               var opt = $.extend({
+                       description: '',
+                       before: {},
+                       after: {},
+                       replace: {}
+               }, options);
+
+               opt.before = $.extend({
+                       text: '',
+                       start: 0,
+                       end: 0
+               }, opt.before);
+               opt.after = $.extend({
+                       text: '',
+                       selected: null
+               }, opt.after);
+
+               QUnit.test( opt.description, function ( assert ) {
+                       /*jshint onevar: false */
+                       var tests = 1;
+                       if ( opt.after.selected !== null ) {
+                               tests++;
+                       }
+                       QUnit.expect( tests );
+
+                       var $textarea = $( '<textarea>' );
+
+                       $( '#qunit-fixture' ).append( $textarea );
+
+                       //$textarea.textSelection( 'setContents', opt.before.text); // this method is actually missing atm...
+                       $textarea.val( opt.before.text ); // won't work with the WikiEditor iframe?
+
+                       var     start = opt.before.start,
+                               end = opt.before.end;
+                       if ( window.opera ) {
+                               // Compensate for Opera's craziness converting \n to \r\n and counting that as two chars
+                               var     newLinesBefore = opt.before.text.substring( 0, start ).split( '\n' ).length - 1,
+                                       newLinesInside = opt.before.text.substring( start, end ).split( '\n' ).length - 1;
+                               start += newLinesBefore;
+                               end += newLinesBefore + newLinesInside;
+                       }
+
+                       var options = $.extend( {}, opt.replace ); // Clone opt.replace
+                       options.selectionStart = start;
+                       options.selectionEnd = end;
+                       $textarea.textSelection( 'encapsulateSelection', options );
+
+                       var text = $textarea.textSelection( 'getContents' ).replace( /\r\n/g, '\n' );
+
+                       assert.equal( text, opt.after.text, 'Checking full text after encapsulation' );
+
+                       if ( opt.after.selected !== null ) {
+                               var selected = $textarea.textSelection( 'getSelection' );
+                               assert.equal( selected, opt.after.selected, 'Checking selected text after encapsulation.' );
+                       }
+
+               } );
+       }
+
+       var caretSample,
+               sig = {
+                       pre: '--~~~~'
+               },
+               bold = {
+                       pre: '\'\'\'',
+                       peri: 'Bold text',
+                       post: '\'\'\''
+               },
+               h2 = {
+                       pre: '== ',
+                       peri: 'Heading 2',
+                       post: ' ==',
+                       regex: /^(\s*)(={1,6})(.*?)\2(\s*)$/,
+                       regexReplace: '$1==$3==$4',
+                       ownline: true
+               },
+               ulist = {
+                       pre: '* ',
+                       peri: 'Bulleted list item',
+                       post: '',
+                       ownline: true,
+                       splitlines: true
+               };
+
+       encapsulateTest({
+               description: 'Adding sig to end of text',
+               before: {
+                       text: 'Wikilove dude! ',
+                       start: 15,
+                       end: 15
+               },
+               after: {
+                       text: 'Wikilove dude! --~~~~',
+                       selected: ''
+               },
+               replace: sig
+       });
+
+       encapsulateTest({
+               description: 'Adding bold to empty',
+               before: {
+                       text: '',
+                       start: 0,
+                       end: 0
+               },
+               after: {
+                       text: '\'\'\'Bold text\'\'\'',
+                       selected: 'Bold text' // selected because it's the default
+               },
+               replace: bold
+       });
+
+       encapsulateTest({
+               description: 'Adding bold to existing text',
+               before: {
+                       text: 'Now is the time for all good men to come to the aid of their country',
+                       start: 20,
+                       end: 32
+               },
+               after: {
+                       text: 'Now is the time for \'\'\'all good men\'\'\' to come to the aid of their country',
+                       selected: '' // empty because it's not the default'
+               },
+               replace: bold
+       });
+
+       encapsulateTest({
+               description: 'ownline option: adding new h2',
+               before: {
+                       text:'Before\nAfter',
+                       start: 7,
+                       end: 7
+               },
+               after: {
+                       text: 'Before\n== Heading 2 ==\nAfter',
+                       selected: 'Heading 2'
+               },
+               replace: h2
+       });
+
+       encapsulateTest({
+               description: 'ownline option: turn a whole line into new h2',
+               before: {
+                       text:'Before\nMy heading\nAfter',
+                       start: 7,
+                       end: 17
+               },
+               after: {
+                       text: 'Before\n== My heading ==\nAfter',
+                       selected: ''
+               },
+               replace: h2
+       });
+
+
+       encapsulateTest({
+               description: 'ownline option: turn a partial line into new h2',
+               before: {
+                       text:'BeforeMy headingAfter',
+                       start: 6,
+                       end: 16
+               },
+               after: {
+                       text: 'Before\n== My heading ==\nAfter',
+                       selected: ''
+               },
+               replace: h2
+       });
+
+
+       encapsulateTest({
+               description: 'splitlines option: no selection, insert new list item',
+               before: {
+                       text: 'Before\nAfter',
+                       start: 7,
+                       end: 7
+               },
+               after: {
+                       text: 'Before\n* Bulleted list item\nAfter'
+               },
+               replace: ulist
+       });
+
+       encapsulateTest({
+               description: 'splitlines option: single partial line selection, insert new list item',
+               before: {
+                       text: 'BeforeMy List ItemAfter',
+                       start: 6,
+                       end: 18
+               },
+               after: {
+                       text: 'Before\n* My List Item\nAfter'
+               },
+               replace: ulist
+       });
+
+       encapsulateTest({
+               description: 'splitlines option: multiple lines',
+               before: {
+                       text: 'Before\nFirst\nSecond\nThird\nAfter',
+                       start: 7,
+                       end: 25
+               },
+               after: {
+                       text: 'Before\n* First\n* Second\n* Third\nAfter'
+               },
+               replace: ulist
+       });
+
+
+       function caretTest( options ) {
+               QUnit.test( options.description, 2, function ( assert ) {
+                       var pos, $textarea = $( '<textarea>' ).text( options.text );
+
+                       $( '#qunit-fixture' ).append( $textarea );
+
+                       if ( options.mode === 'set' ) {
+                               $textarea.textSelection('setSelection', {
+                                       start: options.start,
+                                       end: options.end
+                               });
+                       }
+
+                       function among( actual, expected, message ) {
+                               if ( $.isArray( expected ) ) {
+                                       assert.ok( $.inArray( actual, expected ) !== -1 , message + ' (got ' + actual + '; expected one of ' + expected.join(', ') + ')' );
+                               } else {
+                                       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.');
-               among(pos[1], options.end, 'Caret end should be where we set it.');
+                       pos = $textarea.textSelection( 'getCaretPosition', { startAndEnd: true });
+                       among(pos[0], options.start, 'Caret start should be where we set it.');
+                       among(pos[1], options.end, 'Caret end should be where we set it.');
+               });
+       }
+
+       caretSample = 'Some big text that we like to work with. Nothing fancy... you know what I mean?';
+
+       /*
+       // @broken: Disabled per bug 34820
+       caretTest({
+               description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
+               text: caretSample,
+               start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
+               end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
+               mode: 'get'
+       });
+       */
+
+       caretTest({
+               description: 'set/getCaretPosition with forced empty selection',
+               text: caretSample,
+               start: 7,
+               end: 7,
+               mode: 'set'
        });
-}
-
-var caretSample = "Some big text that we like to work with. Nothing fancy... you know what I mean?";
-
-/*
- // @broken: Disabled per bug 34820
-caretTest({
-       description: 'getCaretPosition with original/empty selection - bug 31847 with IE 6/7/8',
-       text: caretSample,
-       start: [0, caretSample.length], // Opera and Firefox (prior to FF 6.0) default caret to the end of the box (caretSample.length)
-       end: [0, caretSample.length], // Other browsers default it to the beginning (0), so check both.
-       mode: 'get'
-});
-*/
-
-caretTest({
-       description: 'set/getCaretPosition with forced empty selection',
-       text: caretSample,
-       start: 7,
-       end: 7,
-       mode: 'set'
-});
-
-caretTest({
-       description: 'set/getCaretPosition with small selection',
-       text: caretSample,
-       start: 6,
-       end: 11,
-       mode: 'set'
-});
 
+       caretTest({
+               description: 'set/getCaretPosition with small selection',
+               text: caretSample,
+               start: 6,
+               end: 11,
+               mode: 'set'
+       });
+}( jQuery ) );
index 3d3f630..ec7179e 100644 (file)
@@ -1,26 +1,28 @@
-QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment() );
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment() );
 
-QUnit.asyncTest( 'Hello world', function ( assert ) {
-       var api;
-       QUnit.expect( 6 );
+       QUnit.asyncTest( 'Hello world', function ( assert ) {
+               var api;
+               QUnit.expect( 6 );
 
-       api = new mw.Api();
+               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' );
+               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();
-               });
-});
+                               QUnit.start();
+                       });
+       });
+}( mediaWiki, jQuery ) );
index 79bd730..50bbfd7 100644 (file)
@@ -1,59 +1,61 @@
-QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment() );
+( function ( mw ) {
+       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 ) {
+                               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( 'Basic functionality', function ( assert ) {
-       var api, d1, d2, d3;
-       QUnit.expect( 3 );
+       QUnit.asyncTest( 'Deprecated callback methods', function ( assert ) {
+               var api, d1, d2, d3;
+               QUnit.expect( 3 );
 
-       api = new mw.Api();
+               api = new mw.Api();
 
-       d1 = api.get( {} )
-               .done( function ( data ) {
-                       assert.deepEqual( data, [], 'If request succeeds without errors, resolve deferred' );
+               d1 = api.get( {}, function () {
+                       assert.ok( true, 'Function argument treated as success callback.' );
                });
 
-       d2 = api.get({
-                       action: 'doesntexist'
-               })
-               .fail( function ( errorCode, details ) {
-                       assert.equal( errorCode, 'unknown_action', 'API error (e.g. "unknown_action") should reject the deferred' );
+               d2 = api.get( {}, {
+                       ok: function () {
+                               assert.ok( true, '"ok" property treated as success callback.' );
+                       }
                });
 
-       d3 = api.post( {} )
-               .done( function ( data ) {
-                       assert.deepEqual( data, [], 'Simple POST request' );
+               d3 = api.get({
+                               action: 'doesntexist'
+                       }, {
+                       err: function () {
+                               assert.ok( true, '"err" property treated as error callback.' );
+                       }
                });
 
-       // 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();
+               QUnit.whenPromisesComplete( d1, d2, d3 ).always( function () {
+                       QUnit.start();
+               });
        });
-});
+}( mediaWiki ) );
index 7fe7baf..d7b0cb7 100644 (file)
@@ -1,62 +1,65 @@
-QUnit.module( 'mediawiki.special.recentchanges', QUnit.newMwEnvironment() );
-
-// TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
-
-QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
-
-       // from Special:Recentchanges
-       var select =
-       '<select id="namespace" name="namespace" class="namespaceselector">'
-       + '<option value="" selected="selected">all</option>'
-       + '<option value="0">(Main)</option>'
-       + '<option value="1">Talk</option>'
-       + '<option value="2">User</option>'
-       + '<option value="3">User talk</option>'
-       + '<option value="4">ProjectName</option>'
-       + '<option value="5">ProjectName talk</option>'
-       + '</select>'
-       + '<input name="invert" type="checkbox" value="1" id="nsinvert" title="no title" />'
-       + '<label for="nsinvert" title="no title">Invert selection</label>'
-       + '<input name="associated" type="checkbox" value="1" id="nsassociated" title="no title" />'
-       + '<label for="nsassociated" title="no title">Associated namespace</label>'
-       + '<input type="submit" value="Go" />'
-       + '<input type="hidden" value="Special:RecentChanges" name="title" />'
-       ;
-
-       var $env = $( '<div>' ).html( select ).appendTo( 'body' );
-
-       // TODO abstract the double strictEquals
-
-       // At first checkboxes are enabled
-       assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
-       assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
-
-       // Initiate the recentchanges module
-       mw.special.recentchanges.init();
-
-       // By default
-       assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
-       assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
-
-       // select second option...
-       var $options = $( '#namespace' ).find( 'option' );
-       $options.eq(0).removeProp( 'selected' );
-       $options.eq(1).prop( 'selected', true );
-       $( '#namespace' ).change();
-
-       // ... and checkboxes should be enabled again
-       assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
-       assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
-
-       // select first option ( 'all' namespace)...
-       $options.eq(1).removeProp( 'selected' );
-       $options.eq(0).prop( 'selected', true );
-       $( '#namespace' ).change();
-
-       // ... and checkboxes should now be disabled
-       assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
-       assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
-
-       // DOM cleanup
-       $env.remove();
-});
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.special.recentchanges', QUnit.newMwEnvironment() );
+
+       // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
+
+       QUnit.test( '"all" namespace disable checkboxes', function ( assert ) {
+               var selectHtml, $env, $options;
+
+               // from Special:Recentchanges
+               selectHtml =
+               '<select id="namespace" name="namespace" class="namespaceselector">'
+               + '<option value="" selected="selected">all</option>'
+               + '<option value="0">(Main)</option>'
+               + '<option value="1">Talk</option>'
+               + '<option value="2">User</option>'
+               + '<option value="3">User talk</option>'
+               + '<option value="4">ProjectName</option>'
+               + '<option value="5">ProjectName talk</option>'
+               + '</select>'
+               + '<input name="invert" type="checkbox" value="1" id="nsinvert" title="no title" />'
+               + '<label for="nsinvert" title="no title">Invert selection</label>'
+               + '<input name="associated" type="checkbox" value="1" id="nsassociated" title="no title" />'
+               + '<label for="nsassociated" title="no title">Associated namespace</label>'
+               + '<input type="submit" value="Go" />'
+               + '<input type="hidden" value="Special:RecentChanges" name="title" />'
+               ;
+
+               $env = $( '<div>' ).html( selectHtml ).appendTo( 'body' );
+
+               // TODO abstract the double strictEquals
+
+               // At first checkboxes are enabled
+               assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
+               assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
+
+               // Initiate the recentchanges module
+               mw.special.recentchanges.init();
+
+               // By default
+               assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
+               assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
+
+               // select second option...
+               $options = $( '#namespace' ).find( 'option' );
+               $options.eq(0).removeProp( 'selected' );
+               $options.eq(1).prop( 'selected', true );
+               $( '#namespace' ).change();
+
+               // ... and checkboxes should be enabled again
+               assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), false );
+               assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), false );
+
+               // select first option ( 'all' namespace)...
+               $options.eq(1).removeProp( 'selected' );
+               $options.eq(0).prop( 'selected', true );
+               $( '#namespace' ).change();
+
+               // ... and checkboxes should now be disabled
+               assert.strictEqual( $( '#nsinvert' ).prop( 'disabled' ), true );
+               assert.strictEqual( $( '#nsassociated' ).prop( 'disabled' ), true );
+
+               // DOM cleanup
+               $env.remove();
+       });
+}( mediaWiki, jQuery ) );
index 6360925..52f0538 100644 (file)
@@ -1,58 +1,59 @@
-( function () {
+( function ( mw ) {
 
 // mw.Title relies on these three config vars
 // Restore them after each test run
 var config = {
-       "wgFormattedNamespaces": {
-               "-2": "Media",
-               "-1": "Special",
-               "0": "",
-               "1": "Talk",
-               "2": "User",
-               "3": "User talk",
-               "4": "Wikipedia",
-               "5": "Wikipedia talk",
-               "6": "File",
-               "7": "File talk",
-               "8": "MediaWiki",
-               "9": "MediaWiki talk",
-               "10": "Template",
-               "11": "Template talk",
-               "12": "Help",
-               "13": "Help talk",
-               "14": "Category",
-               "15": "Category talk",
+       wgFormattedNamespaces: {
+               '-2': 'Media',
+               '-1': 'Special',
+               0: '',
+               1: 'Talk',
+               2: 'User',
+               3: 'User talk',
+               4: 'Wikipedia',
+               5: 'Wikipedia talk',
+               6: 'File',
+               7: 'File talk',
+               8: 'MediaWiki',
+               9: 'MediaWiki talk',
+               10: 'Template',
+               11: 'Template talk',
+               12: 'Help',
+               13: 'Help talk',
+               14: 'Category',
+               15: 'Category talk',
                // testing custom / localized namespace
-               "100": "Penguins"
+               100: 'Penguins'
        },
-       "wgNamespaceIds": {
-               "media": -2,
-               "special": -1,
-               "": 0,
-               "talk": 1,
-               "user": 2,
-               "user_talk": 3,
-               "wikipedia": 4,
-               "wikipedia_talk": 5,
-               "file": 6,
-               "file_talk": 7,
-               "mediawiki": 8,
-               "mediawiki_talk": 9,
-               "template": 10,
-               "template_talk": 11,
-               "help": 12,
-               "help_talk": 13,
-               "category": 14,
-               "category_talk": 15,
-               "image": 6,
-               "image_talk": 7,
-               "project": 4,
-               "project_talk": 5,
+       wgNamespaceIds: {
+               /*jshint camelcase: false */
+               media: -2,
+               special: -1,
+               '': 0,
+               talk: 1,
+               user: 2,
+               user_talk: 3,
+               wikipedia: 4,
+               wikipedia_talk: 5,
+               file: 6,
+               file_talk: 7,
+               mediawiki: 8,
+               mediawiki_talk: 9,
+               template: 10,
+               template_talk: 11,
+               help: 12,
+               help_talk: 13,
+               category: 14,
+               category_talk: 15,
+               image: 6,
+               image_talk: 7,
+               project: 4,
+               project_talk: 5,
                /* testing custom / alias */
-               "penguins": 100,
-               "antarctic_waterfowl": 100
+               penguins: 100,
+               antarctic_waterfowl: 100
        },
-       "wgCaseSensitiveNamespaces": []
+       wgCaseSensitiveNamespaces: []
 };
 
 QUnit.module( 'mediawiki.Title', QUnit.newMwEnvironment({ config: config }) );
@@ -78,7 +79,7 @@ QUnit.test( 'Transformation', 8, function ( assert ) {
 
        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
-       assert.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.' );
 });
 
 QUnit.test( 'Main text for filename', 8, function ( assert ) {
@@ -116,7 +117,7 @@ QUnit.test( 'Namespace detection and conversion', 6, function ( assert ) {
 
 QUnit.test( 'Throw error on invalid title', 1, function ( assert ) {
        assert.throws(function () {
-               var title = new mw.Title( '' );
+               return new mw.Title( '' );
        }, 'Throw error on empty string' );
 });
 
@@ -146,7 +147,26 @@ QUnit.test( 'toString / toText', 2, function ( assert ) {
        assert.equal( title.toText(), title.getPrefixedText() );
 });
 
-QUnit.test( 'Exists', 3, function ( assert ) {
+QUnit.test( 'getExtension', 7, function ( assert ) {
+
+       function extTest( pagename, ext, description ) {
+               var title = new mw.Title( pagename );
+               assert.equal( title.getExtension(), ext, description || pagename );
+       }
+
+       extTest( 'MediaWiki:Vector.js', 'js' );
+       extTest( 'User:Example/common.css', 'css' );
+       extTest( 'File:Example.longextension', 'longextension', 'Extension parsing not limited (bug 36151)' );
+       extTest( 'Example/information.json', 'json', 'Extension parsing not restricted from any namespace' );
+       extTest( 'Foo.', null, 'Trailing dot is not an extension' );
+       extTest( 'Foo..', null, 'Trailing dots are not an extension' );
+       extTest( 'Foo.a.', null, 'Page name with dots and ending in a dot does not have an extension' );
+
+       // @broken: Throws an exception
+       // extTest( '.NET', null, 'Leading dot is (or is not?) an extension' );
+});
+
+QUnit.test( 'exists', 3, function ( assert ) {
        var title;
 
        // Empty registry, checks default to null
@@ -165,7 +185,7 @@ QUnit.test( 'Exists', 3, function ( assert ) {
 
 });
 
-QUnit.test( 'Url', 2, function ( assert ) {
+QUnit.test( 'getUrl', 2, function ( assert ) {
        var title;
 
        // Config
@@ -178,4 +198,4 @@ QUnit.test( 'Url', 2, function ( assert ) {
        assert.equal( title.getUrl(), '/wiki/User_talk:John_Doe', 'Escaping in title and namespace for urls' );
 });
 
-}() );
\ No newline at end of file
+}( mediaWiki ) );
\ No newline at end of file
index b2026c1..aba6a0c 100644 (file)
-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 ) {
-       QUnit.test( 'Basic mw.Uri object test in ' + ( strictMode ? '' : 'non-' ) + 'strict mode for a simple HTTP URI', 2, function ( assert ) {
-               var uriString, uri;
-               uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
-               uri = new mw.Uri( uriString, {
-                       strictMode: strictMode
+( function ( mw, $ ) {
+       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 ) {
+               QUnit.test( 'Basic mw.Uri object test in ' + ( strictMode ? '' : 'non-' ) + 'strict mode for a simple HTTP URI', 2, function ( assert ) {
+                       var uriString, uri;
+                       uriString = 'http://www.ietf.org/rfc/rfc2396.txt';
+                       uri = new mw.Uri( uriString, {
+                               strictMode: strictMode
+                       });
+
+                       assert.deepEqual(
+                               {
+                                       protocol: uri.protocol,
+                                       host: uri.host,
+                                       port: uri.port,
+                                       path: uri.path,
+                                       query: uri.query,
+                                       fragment: uri.fragment
+                               }, {
+                                       protocol: 'http',
+                                       host: 'www.ietf.org',
+                                       port: undefined,
+                                       path: '/rfc/rfc2396.txt',
+                                       query: {},
+                                       fragment: undefined
+                               },
+                               'basic object properties'
+                       );
+
+                       assert.deepEqual(
+                               {
+                                       userInfo: uri.getUserInfo(),
+                                       authority: uri.getAuthority(),
+                                       hostPort: uri.getHostPort(),
+                                       queryString: uri.getQueryString(),
+                                       relativePath: uri.getRelativePath(),
+                                       toString: uri.toString()
+                               },
+                               {
+                                       userInfo: '',
+                                       authority: 'www.ietf.org',
+                                       hostPort: 'www.ietf.org',
+                                       queryString: '',
+                                       relativePath: '/rfc/rfc2396.txt',
+                                       toString: uriString
+                               },
+                               'construct composite components of URI on request'
+                       );
+
                });
+       });
+
+       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/' );
 
                assert.deepEqual(
                        {
                                protocol: uri.protocol,
+                               user: uri.user,
+                               password: uri.password,
                                host: uri.host,
                                port: uri.port,
                                path: uri.path,
                                query: uri.query,
                                fragment: uri.fragment
-                       }, {
-                               protocol: 'http',
-                               host: 'www.ietf.org',
+                       },
+                       {
+                               protocol: 'ftp',
+                               user: 'usr',
+                               password: 'pwd',
+                               host: '192.0.2.16',
                                port: undefined,
-                               path: '/rfc/rfc2396.txt',
+                               path: '/',
                                query: {},
                                fragment: undefined
                        },
                        'basic object properties'
                );
+       } );
+
+       QUnit.test( '.getQueryString()', 2, function ( assert ) {
+               var uri = new mw.Uri( 'http://www.google.com/?q=uri' );
 
                assert.deepEqual(
                        {
-                               userInfo: uri.getUserInfo(),
-                               authority: uri.getAuthority(),
-                               hostPort: uri.getHostPort(),
-                               queryString: uri.getQueryString(),
-                               relativePath: uri.getRelativePath(),
-                               toString: uri.toString()
+                               protocol: uri.protocol,
+                               host: uri.host,
+                               port: uri.port,
+                               path: uri.path,
+                               query: uri.query,
+                               fragment: uri.fragment,
+                               queryString: uri.getQueryString()
                        },
                        {
-                               userInfo: '',
-                               authority: 'www.ietf.org',
-                               hostPort: 'www.ietf.org',
-                               queryString: '',
-                               relativePath: '/rfc/rfc2396.txt',
-                               toString: uriString
+                               protocol: 'http',
+                               host: 'www.google.com',
+                               port: undefined,
+                               path: '/',
+                               query: { q: 'uri' },
+                               fragment: undefined,
+                               queryString: 'q=uri'
                        },
-                       'construct composite components of URI on request'
+                       'basic object properties'
                );
 
-       });
-});
-
-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/' );
-
-       assert.deepEqual(
-               {
-                       protocol: uri.protocol,
-                       user: uri.user,
-                       password: uri.password,
-                       host: uri.host,
-                       port: uri.port,
-                       path: uri.path,
-                       query: uri.query,
-                       fragment: uri.fragment
-               },
-               {
-                       protocol: 'ftp',
-                       user: 'usr',
-                       password: 'pwd',
-                       host: '192.0.2.16',
-                       port: undefined,
-                       path: '/',
-                       query: {},
-                       fragment: undefined
-               },
-               'basic object properties'
-       );
-} );
-
-QUnit.test( 'Parse a uri with simple querystring', 1, function ( assert ) {
-       var uri = new mw.Uri( 'http://www.google.com/?q=uri' );
-
-       assert.deepEqual(
-               {
-                       protocol: uri.protocol,
-                       host: uri.host,
-                       port: uri.port,
-                       path: uri.path,
-                       query: uri.query,
-                       fragment: uri.fragment,
-                       queryString: uri.getQueryString()
-               },
-               {
-                       protocol: 'http',
-                       host: 'www.google.com',
-                       port: undefined,
-                       path: '/',
-                       query: { q: 'uri' },
-                       fragment: undefined,
-                       queryString: 'q=uri'
-               },
-               'basic object properties'
-       );
-} );
+               uri = new mw.Uri( 'https://example.org/mw/index.php?title=Sandbox/7&other=Sandbox/7&foo' );
+               assert.equal(
+                       uri.getQueryString(),
+                       'title=Sandbox/7&other=Sandbox%2F7&foo',
+                       'title parameter is escaped the wiki-way'
+               );
 
-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
-       });
+       } );
 
-       assert.equal( uri.query.n, '1', 'multiple parameters are parsed' );
-       assert.equal( uri.query.m, 'bar', 'last key overrides earlier keys' );
+       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
+               });
 
-       uri.query.n = [ 'x', 'y', 'z' ];
+               assert.equal( uri.query.n, '1', 'multiple parameters are parsed' );
+               assert.equal( uri.query.m, 'bar', 'last key overrides earlier keys' );
 
-       // Verify parts and total length instead of entire string because order
-       // of iteration can vary.
-       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' );
-} );
+               uri.query.n = [ 'x', 'y', 'z' ];
 
-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
-       });
+               // Verify parts and total length instead of entire string because order
+               // of iteration can vary.
+               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' );
+       } );
 
-       // Strict comparison so that types are also verified (n should be string '1')
-       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.
-       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;
-
-       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 );
-       assert.equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
-} );
-
-QUnit.test( 'All-dressed URI with everything', 11, function ( assert ) {
-       var uri, queryString, relativePath;
-
-       uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
-
-       assert.deepEqual(
-               {
-                       protocol: uri.protocol,
-                       user: uri.user,
-                       password: uri.password,
-                       host: uri.host,
-                       port: uri.port,
-                       path: uri.path,
-                       query: uri.query,
-                       fragment: uri.fragment
-               },
-               {
-                       protocol: 'http',
-                       user: 'auth',
-                       password: undefined,
-                       host: 'www.example.com',
-                       port: '81',
-                       path: '/dir/dir.2/index.htm',
-                       query: { q1: '0', test1: null, test2: 'value (escaped)' },
-                       fragment: 'top'
-               },
-               'basic object properties'
-       );
+       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')
+               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.
+               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;
+
+               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 );
+               assert.equal( uri.toString(), 'http://www.example.com/dir/', 'empty array value is ommitted' );
+       } );
+
+       QUnit.test( 'All-dressed URI with everything', 11, function ( assert ) {
+               var uri, queryString, relativePath;
+
+               uri = new mw.Uri( 'http://auth@www.example.com:81/dir/dir.2/index.htm?q1=0&&test1&test2=value+%28escaped%29#top' );
+
+               assert.deepEqual(
+                       {
+                               protocol: uri.protocol,
+                               user: uri.user,
+                               password: uri.password,
+                               host: uri.host,
+                               port: uri.port,
+                               path: uri.path,
+                               query: uri.query,
+                               fragment: uri.fragment
+                       },
+                       {
+                               protocol: 'http',
+                               user: 'auth',
+                               password: undefined,
+                               host: 'www.example.com',
+                               port: '81',
+                               path: '/dir/dir.2/index.htm',
+                               query: { q1: '0', test1: null, test2: 'value (escaped)' },
+                               fragment: 'top'
+                       },
+                       'basic object properties'
+               );
 
-       assert.equal( uri.getUserInfo(), 'auth', 'user info' );
+               assert.equal( uri.getUserInfo(), 'auth', 'user info' );
 
-       assert.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' );
 
-       assert.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();
-       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' );
+               queryString = uri.getQueryString();
+               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();
-       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' );
-} );
+               relativePath = uri.getRelativePath();
+               assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
+               assert.ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
+               assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' );
+       } );
 
-QUnit.test( 'Cloning', 6, function ( assert ) {
-       var original, clone;
+       QUnit.test( 'Cloning', 6, function ( assert ) {
+               var original, clone;
 
-       original = new mw.Uri( 'http://foo.example.org/index.php?one=1&two=2' );
-       clone = original.clone();
+               original = new mw.Uri( 'http://foo.example.org/index.php?one=1&two=2' );
+               clone = original.clone();
 
-       assert.deepEqual( clone, original, 'clone has equivalent properties' );
-       assert.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' );
 
-       assert.notStrictEqual( clone, original, 'clone is a different object when compared by reference' );
+               assert.notStrictEqual( clone, original, 'clone is a different object when compared by reference' );
 
-       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' );
+               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' );
 
-       clone.query.three = 3;
+               clone.query.three = 3;
 
-       assert.deepEqual(
-               original.query,
-               { 'one': '1', 'two': '2' },
-               'Properties is deep cloned (bug 37708)'
-       );
-} );
+               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'
-       });
-       assert.equal( uri.toString(), 'http://www.foo.local/this', 'Basic properties' );
-
-       uri = new mw.Uri({
-               protocol: 'http',
-               host: 'www.foo.local',
-               path: '/this',
-               query: { hi: 'there' },
-               fragment: 'blah'
-       });
-       assert.equal( uri.toString(), 'http://www.foo.local/this?hi=there#blah', 'More complex properties' );
+       QUnit.test( 'Constructing mw.Uri from plain object', 3, function ( assert ) {
+               var uri = new mw.Uri({
+                       protocol: 'http',
+                       host: 'www.foo.local',
+                       path: '/this'
+               });
+               assert.equal( uri.toString(), 'http://www.foo.local/this', 'Basic properties' );
 
-       assert.throws(
-               function () {
-                       var uri = new mw.Uri({
-                               protocol: 'http',
-                               host: 'www.foo.local'
-                       });
-               },
-               function ( e ) {
-                       return e.message === 'Bad constructor arguments';
-               },
-               'Construction failed when missing required properties'
-       );
-} );
+               uri = new mw.Uri({
+                       protocol: 'http',
+                       host: 'www.foo.local',
+                       path: '/this',
+                       query: { hi: 'there' },
+                       fragment: 'blah'
+               });
+               assert.equal( uri.toString(), 'http://www.foo.local/this?hi=there#blah', 'More complex properties' );
+
+               assert.throws(
+                       function () {
+                               return new mw.Uri({
+                                       protocol: 'http',
+                                       host: 'www.foo.local'
+                               });
+                       },
+                       function ( e ) {
+                               return e.message === 'Bad constructor arguments';
+                       },
+                       'Construction failed when missing required properties'
+               );
+       } );
 
-QUnit.test( 'Manipulate properties', 8, function ( assert ) {
-       var uriBase, uri;
+       QUnit.test( 'Manipulate properties', 8, function ( assert ) {
+               var uriBase, uri;
 
-       uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
+               uriBase = new mw.Uri( 'http://en.wiki.local/w/api.php' );
 
-       uri = uriBase.clone();
-       uri.fragment = 'frag';
-       assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php#frag', 'add a fragment' );
+               uri = uriBase.clone();
+               uri.fragment = 'frag';
+               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';
-       assert.equal( uri.toString(), 'http://fr.wiki.local:8080/w/api.php', 'change host and port' );
+               uri = uriBase.clone();
+               uri.host = 'fr.wiki.local';
+               uri.port = '8080';
+               assert.equal( uri.toString(), 'http://fr.wiki.local:8080/w/api.php', 'change host and port' );
 
-       uri = uriBase.clone();
-       uri.query.foo = 'bar';
-       assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'add query arguments' );
+               uri = uriBase.clone();
+               uri.query.foo = 'bar';
+               assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'add query arguments' );
 
-       delete uri.query.foo;
-       assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php', 'delete query arguments' );
+               delete uri.query.foo;
+               assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php', 'delete query arguments' );
 
-       uri = uriBase.clone();
-       uri.query.foo = 'bar';
-       assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'extend query arguments' );
-       uri.extend({
-               foo: 'quux',
-               pif: 'paf'
-       });
-       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' );
-} );
+               uri = uriBase.clone();
+               uri.query.foo = 'bar';
+               assert.equal( uri.toString(), 'http://en.wiki.local/w/api.php?foo=bar', 'extend query arguments' );
+               uri.extend({
+                       foo: 'quux',
+                       pif: 'paf'
+               });
+               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' );
+       } );
 
-QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) {
-       var UriRel, uri;
+       QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) {
+               var UriRel, uri;
 
-       UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
+               UriRel = mw.UriRelative( 'glork://en.wiki.local/foo.php' );
 
-       uri = new UriRel( '//en.wiki.local/w/api.php' );
-       assert.equal( uri.protocol, 'glork', 'create protocol-relative URLs with same protocol as document' );
+               uri = new UriRel( '//en.wiki.local/w/api.php' );
+               assert.equal( uri.protocol, 'glork', 'create protocol-relative URLs with same protocol as document' );
 
-       uri = new UriRel( '/foo.com' );
-       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( '/foo.com' );
+               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' );
-       assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in loose mode' );
+               uri = new UriRel( 'http:/foo.com' );
+               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 );
-       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( '/foo.com', true );
+               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 );
-       assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
-} );
+               uri = new UriRel( 'http:/foo.com', true );
+               assert.equal( uri.toString(), 'http://en.wiki.local/foo.com', 'handle absolute paths by supplying host from document in strict mode' );
+       } );
 
-QUnit.test( 'Bad calls', 3, function ( assert ) {
-       var uri;
+       QUnit.test( 'Bad calls', 3, function ( assert ) {
+               var uri;
 
-       assert.throws(
-               function () {
-                       new mw.Uri( 'glaswegian penguins' );
-               },
-               function ( e ) {
-                       return e.message === 'Bad constructor arguments';
-               },
-               'throw error on non-URI as argument to constructor'
-       );
+               assert.throws(
+                       function () {
+                               return new mw.Uri( 'glaswegian penguins' );
+                       },
+                       function ( e ) {
+                               return e.message === 'Bad constructor arguments';
+                       },
+                       'throw error on non-URI as argument to constructor'
+               );
 
-       assert.throws(
-               function () {
-                       new mw.Uri( 'foo.com/bar/baz', {
-                               strictMode: true
-                       });
-               },
-               function ( e ) {
-                       return e.message === 'Bad constructor arguments';
-               },
-               'throw error on URI without protocol or // or leading / in strict mode'
-       );
+               assert.throws(
+                       function () {
+                               return new mw.Uri( 'foo.com/bar/baz', {
+                                       strictMode: true
+                               });
+                       },
+                       function ( e ) {
+                               return e.message === 'Bad constructor arguments';
+                       },
+                       'throw error on URI without protocol or // or leading / in strict mode'
+               );
 
-       uri = new mw.Uri( 'foo.com/bar/baz', {
-               strictMode: false
+               uri = new mw.Uri( 'foo.com/bar/baz', {
+                       strictMode: false
+               });
+               assert.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' );
-});
 
-QUnit.test( 'bug 35658', 2, function ( assert ) {
-       var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
+       QUnit.test( 'bug 35658', 2, function ( assert ) {
+               var testProtocol, testServer, testPort, testPath, UriClass, uri, href;
 
-       testProtocol = 'https://';
-       testServer = 'foo.example.org';
-       testPort = '3004';
-       testPath = '/!1qy';
+               testProtocol = 'https://';
+               testServer = 'foo.example.org';
+               testPort = '3004';
+               testPath = '/!1qy';
 
-       UriClass = mw.UriRelative( testProtocol + testServer + '/some/path/index.html' );
-       uri = new UriClass( testPath );
-       href = uri.toString();
-       assert.equal( href, testProtocol + testServer + testPath, 'Root-relative URL gets host & protocol supplied' );
+               UriClass = mw.UriRelative( testProtocol + testServer + '/some/path/index.html' );
+               uri = new UriClass( testPath );
+               href = uri.toString();
+               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();
-       assert.equal( href, testProtocol + testServer + ':' + testPort + testPath, 'Root-relative URL gets host, protocol, and port supplied' );
+               UriClass = mw.UriRelative( testProtocol + testServer + ':' + testPort + '/some/path.php' );
+               uri = new UriClass( testPath );
+               href = uri.toString();
+               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;
+       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 );
+               testuri = 'http://example.org/w/index.php';
+               MyUri = mw.UriRelative( testuri );
 
-       uri = new MyUri();
-       assert.equal( uri.toString(), testuri, 'no arguments' );
+               uri = new MyUri();
+               assert.equal( uri.toString(), testuri, 'no arguments' );
 
-       uri = new MyUri( undefined );
-       assert.equal( uri.toString(), testuri, 'undefined' );
+               uri = new MyUri( undefined );
+               assert.equal( uri.toString(), testuri, 'undefined' );
 
-       uri = new MyUri( null );
-       assert.equal( uri.toString(), testuri, 'null' );
+               uri = new MyUri( null );
+               assert.equal( uri.toString(), testuri, 'null' );
 
-       uri = new MyUri( '' );
-       assert.equal( uri.toString(), testuri, 'empty string' );
-} );
+               uri = new MyUri( '' );
+               assert.equal( uri.toString(), testuri, 'empty string' );
+       } );
+}( mediaWiki, jQuery ) );
index e2c6668..b745fb4 100644 (file)
@@ -1,74 +1,76 @@
-QUnit.module( 'mediawiki.cldr', QUnit.newMwEnvironment() );
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.cldr', QUnit.newMwEnvironment() );
 
-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" ]
-       ],
-       "fa": [
-               [ 0, [ "one", "other" ], "other", "Persian plural test- 0 is other" ],
-               [ 1, [ "one", "other" ], "one", "Persian plural test- 1 is one" ],
-               [ 2, [ "one", "other" ], "other", "Persian plural test- 2 is other" ]
-       ],
-       "fr": [
-               [ 0, [ "one", "other" ], "other", "French plural test- 0 is other" ],
-               [ 1, [ "one", "other" ], "one", "French 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" ]
-       ],
-       "hu": [
-               [ 0, [ "one", "other" ], "other", "Hungarian plural test- 0 is other" ],
-               [ 1, [ "one", "other" ], "one", "Hungarian plural test- 1 is one" ],
-               [ 2, [ "one", "other" ], "other", "Hungarian plural test- 2 is other" ]
-       ],
-       "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" ],
-               [ 1.7, [ "zero", "one", "two", "few", "many", "other" ], "other", "Arabic plural test - 1.7 is other" ]
-       ]
-};
+       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' ]
+               ],
+               fa: [
+                       [ 0, [ 'one', 'other' ], 'other', 'Persian plural test- 0 is other' ],
+                       [ 1, [ 'one', 'other' ], 'one', 'Persian plural test- 1 is one' ],
+                       [ 2, [ 'one', 'other' ], 'other', 'Persian plural test- 2 is other' ]
+               ],
+               fr: [
+                       [ 0, [ 'one', 'other' ], 'other', 'French plural test- 0 is other' ],
+                       [ 1, [ 'one', 'other' ], 'one', 'French 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' ]
+               ],
+               hu: [
+                       [ 0, [ 'one', 'other' ], 'other', 'Hungarian plural test- 0 is other' ],
+                       [ 1, [ 'one', 'other' ], 'one', 'Hungarian plural test- 1 is one' ],
+                       [ 2, [ 'one', 'other' ], 'other', 'Hungarian plural test- 2 is other' ]
+               ],
+               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' ],
+                       [ 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, tests.length, function ( assert ) {
-               for ( var i = 0; i < tests.length; i++ ) {
-                       assert.equal(
-                               mw.language.convertPlural( tests[i][0], tests[i][1] ),
-                               tests[i][2],
-                               tests[i][3]
-                       );
+       function pluralTest( langCode, tests ) {
+               QUnit.test( 'Plural Test for ' + langCode, tests.length, function ( assert ) {
+                       for ( var i = 0; i < tests.length; i++ ) {
+                               assert.equal(
+                                       mw.language.convertPlural( tests[i][0], tests[i][1] ),
+                                       tests[i][2],
+                                       tests[i][3]
+                               );
+                       }
+               } );
+       }
+
+       $.each( pluralTestcases, function ( langCode, tests ) {
+               if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
+                       pluralTest( langCode, tests );
                }
        } );
-}
-
-$.each( pluralTestcases, function ( langCode, tests ) {
-       if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
-               pluralTest( langCode, tests );
-       }
-} );
+}( mediaWiki, jQuery ) );
index b8193a9..bce7bd7 100644 (file)
@@ -1,6 +1,44 @@
-QUnit.module( 'mediawiki.jqueryMsg' );
+( function ( mw, $ ) {
 
-QUnit.test( 'mw.jqueryMsg Plural', 3, function ( assert ) {
+QUnit.module( 'mediawiki.jqueryMsg', QUnit.newMwEnvironment( {
+       setup: function () {
+               this.orgMwLangauge = mw.language;
+               mw.language = $.extend( true, {}, this.orgMwLangauge );
+       },
+       teardown: function () {
+               mw.language = this.orgMwLangauge;
+       }
+}) );
+
+var mwLanguageCache = {};
+function getMwLanguage( langCode, cb ) {
+       if ( mwLanguageCache[langCode] !== undefined ) {
+               mwLanguageCache[langCode].add( cb );
+               return;
+       }
+       mwLanguageCache[langCode] = $.Callbacks( 'once memory' );
+       mwLanguageCache[langCode].add( cb );
+       $.ajax({
+               url: mw.util.wikiScript( 'load' ),
+               data: {
+                       skin: mw.config.get( 'skin' ),
+                       lang: langCode,
+                       debug: mw.config.get( 'debug' ),
+                       modules: [
+                               'mediawiki.language.data',
+                               'mediawiki.language'
+                       ].join( '|' ),
+                       only: 'scripts'
+               },
+               dataType: 'script'
+       }).done( function () {
+               mwLanguageCache[langCode].fire( mw.language );
+       }).fail( function () {
+               mwLanguageCache[langCode].fire( false );
+       });
+}
+
+QUnit.test( 'Plural', 3, function ( assert ) {
        var parser = mw.jqueryMsg.getMessageFunction();
 
        mw.messages.set( 'plural-msg', 'Found $1 {{PLURAL:$1|item|items}}' );
@@ -10,7 +48,7 @@ QUnit.test( 'mw.jqueryMsg Plural', 3, function ( assert ) {
 } );
 
 
-QUnit.test( 'mw.jqueryMsg Gender', 11, function ( assert ) {
+QUnit.test( 'Gender', 11, function ( assert ) {
        // TODO: These tests should be for mw.msg once mw.msg integrated with mw.jqueryMsg
        // TODO: English may not be the best language for these tests. Use a language like Arabic or Russian
        var user = mw.user,
@@ -84,8 +122,7 @@ QUnit.test( 'mw.jqueryMsg Gender', 11, function ( assert ) {
        );
 } );
 
-
-QUnit.test( 'mw.jqueryMsg Grammar', 2, function ( assert ) {
+QUnit.test( 'Grammar', 2, function ( assert ) {
        var parser = mw.jqueryMsg.getMessageFunction();
 
        // Assume the grammar form grammar_case_foo is not valid in any language
@@ -95,3 +132,26 @@ QUnit.test( 'mw.jqueryMsg Grammar', 2, function ( assert ) {
        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' );
 } );
+
+QUnit.test( 'Output matches PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
+       mw.messages.set( mw.libs.phpParserData.messages );
+       $.each( mw.libs.phpParserData.tests, function ( i, test ) {
+               QUnit.stop();
+               getMwLanguage( test.lang, function ( langClass ) {
+                       QUnit.start();
+                       if ( !langClass ) {
+                               assert.ok( false, 'Language "' + test.lang + '" failed to load' );
+                               return;
+                       }
+                       mw.config.set( 'wgUserLanguage', test.lang ) ;
+                       var parser = new mw.jqueryMsg.parser( { language: langClass } );
+                       assert.equal(
+                               parser.parse( test.key, test.args ).html(),
+                               test.result,
+                               test.name
+                       );
+               } );
+       } );
+});
+
+}( mediaWiki, jQuery ) );
index 2baa4f3..bc6fafe 100644 (file)
@@ -1,62 +1,70 @@
-/* Some misc JavaScript compatibility tests, just to make sure the environments we run in are consistent */
-
-QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
-
-QUnit.test( 'Variable with Unicode letter in name', 3, function ( assert ) {
-       var orig = "some token";
-       var ŝablono = orig;
-
-       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
-QUnit.test( 'Keyword workaround: "if" as variable name using Unicode escapes', function ( assert ) {
-       var orig = "another token";
-       \u0069\u0066 = orig;
-       assert.deepEqual( \u0069\u0066, orig, '\\u0069\\u0066' );
-});
-*/
-
-/*
-// Not that we need this. ;)
-// This fails on IE 6-9
-// Works on Firefox 6, Chrome 14
-QUnit.test( 'Keyword workaround: "if" as member variable name using Unicode escapes', function ( assert ) {
-       var orig = "another token";
-       var foo = {};
-       foo.\u0069\u0066 = orig;
-       assert.deepEqual( foo.\u0069\u0066, orig, 'foo.\\u0069\\u0066' );
-});
-*/
-
-QUnit.test( 'Stripping of single initial newline from textarea\'s literal contents (bug 12130)', function ( assert ) {
-       var maxn = 4;
-       QUnit.expect( maxn * 2 );
-
-       function repeat( str, n ) {
-               if ( n <= 0 ) {
-                       return '';
-               } else {
-                       var out = new Array(n);
-                       for ( var i = 0; i < n; i++ ) {
-                               out[i] = str;
+/**
+ * Some misc JavaScript compatibility tests,
+ * just to make sure the environments we run in are consistent.
+ */
+( function ( $ ) {
+       QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
+
+       QUnit.test( 'Variable with Unicode letter in name', 3, function ( assert ) {
+               var orig, ŝablono;
+
+               orig = 'some token';
+               ŝablono = orig;
+
+               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
+       QUnit.test( 'Keyword workaround: "if" as variable name using Unicode escapes', function ( assert ) {
+               var orig = "another token";
+               \u0069\u0066 = orig;
+               assert.deepEqual( \u0069\u0066, orig, '\\u0069\\u0066' );
+       });
+       */
+
+       /*
+       // Not that we need this. ;)
+       // This fails on IE 6-9
+       // Works on Firefox 6, Chrome 14
+       QUnit.test( 'Keyword workaround: "if" as member variable name using Unicode escapes', function ( assert ) {
+               var orig = "another token";
+               var foo = {};
+               foo.\u0069\u0066 = orig;
+               assert.deepEqual( foo.\u0069\u0066, orig, 'foo.\\u0069\\u0066' );
+       });
+       */
+
+       QUnit.test( 'Stripping of single initial newline from textarea\'s literal contents (bug 12130)', function ( assert ) {
+               var maxn, n,
+                       expected, $textarea;
+
+               maxn = 4;
+               QUnit.expect( maxn * 2 );
+
+               function repeat( str, n ) {
+                       var out;
+                       if ( n <= 0 ) {
+                               return '';
+                       } else {
+                               out = [];
+                               out.length = n + 1;
+                               return out.join( str );
                        }
-                       return out.join('');
                }
-       }
 
-       for ( var n = 0; n < maxn; n++ ) {
-               var expected = repeat('\n', n) + 'some text';
+               for ( n = 0; n < maxn; n++ ) {
+                       expected = repeat('\n', n) + 'some text';
 
-               var $textarea = $('<textarea>\n' + expected + '</textarea>');
-               assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + (n + 1) + ')' );
+                       $textarea = $('<textarea>\n' + expected + '</textarea>');
+                       assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (HTML contained ' + (n + 1) + ')' );
 
-               var $textarea2 = $('<textarea>').val(expected);
-               assert.equal( $textarea2.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')' );
-       }
-});
+                       $textarea = $('<textarea>').val( expected );
+                       assert.equal( $textarea.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')' );
+               }
+       });
+}( jQuery ) );
index 3fa2b09..869ebe4 100644 (file)
-QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment({
-       setup: function () {
-               this.liveLangData = mw.language.data.values;
-               mw.language.data.values = $.extend( true, {}, this.liveLangData );
-       },
-       teardown: function () {
-               // Restore
-               mw.language.data.values = this.liveLangData;
-       }
-}) );
+( function ( mw, $ ) {
 
-QUnit.test( 'mw.language getData and setData', function ( assert ) {
-       QUnit.expect( 2 );
+       QUnit.module( 'mediawiki.language', QUnit.newMwEnvironment({
+               setup: function () {
+                       this.liveLangData = mw.language.data.values;
+                       mw.language.data.values = $.extend( true, {}, this.liveLangData );
+               },
+               teardown: function () {
+                       mw.language.data.values = this.liveLangData;
+               }
+       }) );
 
-       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' );
-} );
+       QUnit.test( 'mw.language getData and setData', 2, function ( assert ) {
+               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 );
+       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
-                       );
-               }
-       });
-}
+                       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'
-               }
-       ],
+       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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ],
+               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'
-               }
-       ]
-};
+               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 );
-       }
-});
+       $.each( grammarTests, function ( langCode, test ) {
+               if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
+                       grammarTest( langCode, test );
+               }
+       });
+}( mediaWiki, jQuery ) );
index 58e56ad..dc7bd0a 100644 (file)
@@ -1,6 +1,8 @@
+( function ( mw, $ ) {
+
 QUnit.module( 'mediawiki', QUnit.newMwEnvironment() );
 
-QUnit.test( '-- Initial check', 8, function ( assert ) {
+QUnit.test( 'Initial check', 8, function ( assert ) {
        assert.ok( window.jQuery, 'jQuery defined' );
        assert.ok( window.$, '$j defined' );
        assert.ok( window.$j, '$j defined' );
@@ -137,6 +139,67 @@ QUnit.test( 'mw.msg', 11, function ( assert ) {
 
 });
 
+/**
+ * The sync style load test (for @import). This is, in a way, also an open bug for
+ * ResourceLoader ("execute js after styles are loaded"), but browsers don't offer a
+ * way to get a callback from when a stylesheet is loaded (that is, including any
+ * @import rules inside). To work around this, we'll have a little time loop to check
+ * if the styles apply.
+ * Note: This test originally used new Image() and onerror to get a callback
+ * when the url is loaded, but that is fragile since it doesn't monitor the
+ * same request as the css @import, and Safari 4 has issues with
+ * onerror/onload not being fired at all in weird cases like this.
+ */
+function assertStyleAsync( assert, $element, prop, val, fn ) {
+       var styleTestStart,
+               el = $element.get( 0 ),
+               styleTestTimeout = ( QUnit.config.testTimeout - 200 ) || 5000;
+
+       function isCssImportApplied() {
+               // Trigger reflow, repaint, redraw, whatever (cross-browser)
+               var x = $element.css( 'height' );
+               x = el.innerHTML;
+               el.className = el.className;
+               x = document.documentElement.clientHeight;
+
+               return $element.css( prop ) === val;
+       }
+
+       function styleTestLoop() {
+               var 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 ) {
+                       assert.equal( $element.css( prop ), val,
+                               'style "' + prop + ': ' + val + '" from url is applied (after ' + styleTestSince + 'ms)'
+                       );
+
+                       if ( fn ) {
+                               fn();
+                       }
+
+                       return;
+               }
+               // Otherwise, keep polling
+               setTimeout( styleTestLoop, 150 );
+       }
+
+       // Start the loop
+       styleTestStart = new Date().getTime();
+       styleTestLoop();
+}
+
+function urlStyleTest( selector, prop, val ) {
+       return QUnit.fixurl(
+               mw.config.get( 'wgScriptPath' ) +
+                       '/tests/qunit/data/styleTest.css.php?' +
+                       $.param( {
+                               selector: selector,
+                               prop: prop,
+                               val: val
+                       } )
+       );
+}
+
 QUnit.asyncTest( 'mw.loader', 2, function ( assert ) {
        var isAwesomeDone;
 
@@ -152,7 +215,7 @@ QUnit.asyncTest( 'mw.loader', 2, function ( assert ) {
 
                // /sample/awesome.js declares the "mw.loader.testCallback" function
                // which contains a call to start() and ok()
-               assert.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 () {
@@ -161,83 +224,200 @@ QUnit.asyncTest( 'mw.loader', 2, function ( assert ) {
        });
 });
 
-QUnit.asyncTest( 'mw.loader.implement', 5, function ( assert ) {
-       var isJsExecuted, $element, styleTestUrl;
-
-       styleTestUrl = QUnit.fixurl(
-               mw.config.get( 'wgScriptPath' )
-               + '/tests/qunit/data/styleTest.css.php?'
-               + $.param({
-                       selector: '.mw-test-loaderimplement',
-                       prop: 'float',
-                       val: 'right'
-               })
+QUnit.test( 'mw.loader.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
+       var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
+
+       assert.notEqual(
+               $element.css( 'float' ),
+               'right',
+               'style is clear'
        );
 
        mw.loader.implement(
-               'test.implement',
+               'test.implement.a',
                function () {
-                       var styleTestTimeout, styleTestStart, styleTestSince;
+                       assert.equal(
+                               $element.css( 'float' ),
+                               'right',
+                               'style is applied'
+                       );
+               },
+               {
+                       'all': '.mw-test-implement-a { float: right; }'
+               },
+               {}
+       );
 
-                       assert.strictEqual( isJsExecuted, undefined, 'javascript not executed multiple times' );
-                       isJsExecuted = true;
+       mw.loader.load([
+               'test.implement.a'
+       ]);
+} );
 
-                       assert.equal( mw.loader.getState( 'test.implement' ), 'ready', 'module state is "ready" while implement() is executing javascript' );
+QUnit.asyncTest( 'mw.loader.implement( styles={ "url": { <media>: [url, ..] } } )', 7, function ( assert ) {
+       var $element1 = $( '<div class="mw-test-implement-b1"></div>' ).appendTo( '#qunit-fixture' ),
+               $element2 = $( '<div class="mw-test-implement-b2"></div>' ).appendTo( '#qunit-fixture' ),
+               $element3 = $( '<div class="mw-test-implement-b3"></div>' ).appendTo( '#qunit-fixture' );
 
-                       $element = $( '<div class="mw-test-loaderimplement">Foo bar</div>' ).appendTo( '#qunit-fixture' );
+       assert.notEqual(
+               $element1.css( 'text-align' ),
+               'center',
+               'style is clear'
+       );
+       assert.notEqual(
+               $element2.css( 'float' ),
+               'left',
+               'style is clear'
+       );
+       assert.notEqual(
+               $element3.css( 'text-align' ),
+               'right',
+               'style is clear'
+       );
 
-                       assert.equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded before javascript execution' );
+       mw.loader.implement(
+               'test.implement.b',
+               function () {
+                       // Note: QUnit.start() must only be called when the entire test is
+                       // complete. So, make sure that we don't start until *both*
+                       // assertStyleAsync calls have completed.
+                       var pending = 2;
+                       assertStyleAsync( assert, $element2, 'float', 'left', function () {
+                               assert.notEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
+
+                               pending--;
+                               if ( pending === 0 ) {
+                                       QUnit.start();
+                               }
+                       } );
+                       assertStyleAsync( assert, $element3, 'float', 'right', function () {
+                               assert.notEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
 
-                       // 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
-                       // get a callback from when a stylesheet is loaded (that is, including any
-                       // @import rules inside).
-                       // To work around this, we'll have a little time loop to check if the styles
-                       // apply.
-                       // Note: This test originally used new Image() and onerror to get a callback
-                       // when the url is loaded, but that is fragile since it doesn't monitor the
-                       // same request as the css @import, and Safari 4 has issues with
-                       // onerror/onload not being fired at all in weird cases like this.
-
-                       styleTestTimeout = QUnit.config.testTimeout || 5000; // milliseconds
-
-                       function isCssImportApplied() {
-                               return $element.css( 'float' ) === 'right';
+                               pending--;
+                               if ( pending === 0 ) {
+                                       QUnit.start();
+                               }
+                       } );
+               },
+               {
+                       'url': {
+                               'print': [urlStyleTest( '.mw-test-implement-b1', 'text-align', 'center' )],
+                               'screen': [
+                                       // bug 40834: Make sure it actually works with more than 1 stylesheet reference
+                                       urlStyleTest( '.mw-test-implement-b2', 'float', 'left' ),
+                                       urlStyleTest( '.mw-test-implement-b3', 'float', 'right' )
+                               ]
                        }
+               },
+               {}
+       );
 
-                       function styleTestLoop() {
-                               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 ) {
-                                       assert.equal( $element.css( 'float' ), 'right',
-                                               'CSS stylesheet via @import was applied (after ' + styleTestSince + 'ms) (bug 34669). ("float: right")'
-                                       );
+       mw.loader.load([
+               'test.implement.b'
+       ]);
+} );
 
-                                       assert.equal( $element.css( 'text-align' ),'center',
-                                               'CSS styles after the @import are working ("text-align: center")'
-                                       );
+// Backwards compatibility
+QUnit.test( 'mw.loader.implement( styles={ <media>: text } ) (back-compat)', 2, function ( assert ) {
+       var $element = $( '<div class="mw-test-implement-c"></div>' ).appendTo( '#qunit-fixture' );
 
-                                       // Async done
-                                       QUnit.start();
+       assert.notEqual(
+               $element.css( 'float' ),
+               'right',
+               'style is clear'
+       );
 
-                                       return;
-                               }
-                               // Otherwise, keep polling
-                               setTimeout( styleTestLoop, 100 );
-                       }
+       mw.loader.implement(
+               'test.implement.c',
+               function () {
+                       assert.equal(
+                               $element.css( 'float' ),
+                               'right',
+                               'style is applied'
+                       );
+               },
+               {
+                       'all': '.mw-test-implement-c { float: right; }'
+               },
+               {}
+       );
+
+       mw.loader.load([
+               'test.implement.c'
+       ]);
+} );
+
+// Backwards compatibility
+QUnit.asyncTest( 'mw.loader.implement( styles={ <media>: [url, ..] } ) (back-compat)', 4, function ( assert ) {
+       var $element = $( '<div class="mw-test-implement-d"></div>' ).appendTo( '#qunit-fixture' ),
+               $element2 = $( '<div class="mw-test-implement-d2"></div>' ).appendTo( '#qunit-fixture' );
+
+       assert.notEqual(
+               $element.css( 'float' ),
+               'right',
+               'style is clear'
+       );
+       assert.notEqual(
+               $element2.css( 'text-align' ),
+               'center',
+               'style is clear'
+       );
+
+       mw.loader.implement(
+               'test.implement.d',
+               function () {
+                       assertStyleAsync( assert, $element, 'float', 'right', function () {
+
+                               assert.notEqual( $element2.css( 'text-align' ), 'center', 'print style is not applied (bug 40500)' );
 
-                       // Start the loop
-                       styleTestStart = new Date().getTime();
-                       styleTestLoop();
+                               QUnit.start();
+                       } );
                },
                {
-                       "all": "@import url('"
-                               + styleTestUrl
-                               + "');\n"
-                               + '.mw-test-loaderimplement { text-align: center; }'
+                       'all': [urlStyleTest( '.mw-test-implement-d', 'float', 'right' )],
+                       'print': [urlStyleTest( '.mw-test-implement-d2', 'text-align', 'center' )]
+               },
+               {}
+       );
+
+       mw.loader.load([
+               'test.implement.d'
+       ]);
+} );
+
+// @import (bug 31676)
+QUnit.asyncTest( 'mw.loader.implement( styles has @import)', 5, function ( assert ) {
+       var isJsExecuted, $element;
+
+       mw.loader.implement(
+               'test.implement.import',
+               function () {
+                       assert.strictEqual( isJsExecuted, undefined, 'javascript not executed multiple times' );
+                       isJsExecuted = true;
+
+                       assert.equal( mw.loader.getState( 'test.implement.import' ), 'ready', 'module state is "ready" while implement() is executing javascript' );
+
+                       $element = $( '<div class="mw-test-implement-import">Foo bar</div>' ).appendTo( '#qunit-fixture' );
+
+                       assert.equal( mw.msg( 'test-foobar' ), 'Hello Foobar, $1!', 'Messages are loaded before javascript execution' );
+
+                       assertStyleAsync( assert, $element, 'float', 'right', function () {
+                               assert.equal( $element.css( 'text-align' ),'center',
+                                       'CSS styles after the @import rule are working'
+                               );
+
+                               QUnit.start();
+                       } );
                },
                {
-                       "test-foobar": "Hello Foobar, $1!"
+                       'css': [
+                               '@import url(\''
+                               + urlStyleTest( '.mw-test-implement-import', 'float', 'right' )
+                               + '\');\n'
+                               + '.mw-test-implement-import { text-align: center; }'
+                       ]
+               },
+               {
+                       'test-foobar': 'Hello Foobar, $1!'
                }
        );
 
@@ -245,6 +425,19 @@ QUnit.asyncTest( 'mw.loader.implement', 5, function ( assert ) {
 
 });
 
+QUnit.asyncTest( 'mw.loader.implement( only messages )' , 2, function ( assert ) {
+       assert.assertFalse( mw.messages.exists( 'bug_29107' ), 'Verify that the test message doesn\'t exist yet' );
+
+       mw.loader.implement( 'test.implement.msgs', [], {}, { 'bug_29107': 'loaded' } );
+       mw.loader.using( 'test.implement.msgs', function() {
+               QUnit.start();
+               assert.ok( mw.messages.exists( 'bug_29107' ), 'Bug 29107: messages-only module should implement ok' );
+       }, function() {
+               QUnit.start();
+               assert.ok( false, 'Error callback fired while implementing "test.implement.msgs" module' );
+       });
+});
+
 QUnit.test( 'mw.loader erroneous indirect dependency', 3, function ( assert ) {
        mw.loader.register( [
                ['test.module1', '0'],
@@ -298,8 +491,8 @@ QUnit.test( 'mw.loader missing dependency', 13, function ( assert ) {
        mw.loader.using(
                ['test.module7'],
                function () {
-                       assert.ok( false, "Success fired despite missing dependency" );
-                       assert.ok( true , "QUnit expected() count dummy" );
+                       assert.ok( false, 'Success fired despite missing dependency' );
+                       assert.ok( true , 'QUnit expected() count dummy' );
                },
                function ( e, dependencies ) {
                        assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
@@ -309,8 +502,8 @@ QUnit.test( 'mw.loader missing dependency', 13, function ( assert ) {
        mw.loader.using(
                ['test.module9'],
                function () {
-                       assert.ok( false, "Success fired despite missing dependency" );
-                       assert.ok( true , "QUnit expected() count dummy" );
+                       assert.ok( false, 'Success fired despite missing dependency' );
+                       assert.ok( true , 'QUnit expected() count dummy' );
                },
                function ( e, dependencies ) {
                        assert.strictEqual( $.isArray( dependencies ), true, 'Expected array of dependencies' );
@@ -368,21 +561,7 @@ QUnit.asyncTest( 'mw.loader dependency handling', 5, function ( assert ) {
        );
 } );
 
-QUnit.asyncTest( 'mw.loader bug29107' , 2, function ( assert ) {
-       // Message doesn't exist already
-       assert.ok( !mw.messages.exists( 'bug29107' ) );
-
-       mw.loader.implement( 'bug29107.messages-only', [], {}, {'bug29107': 'loaded'} );
-       mw.loader.using( 'bug29107.messages-only', function() {
-               QUnit.start();
-               assert.ok( mw.messages.exists( 'bug29107' ), 'Bug 29107: messages-only module should implement ok' );
-       }, function() {
-               QUnit.start();
-               assert.ok( false, 'Error callback fired while implementing "bug29107.messages-only" module' );
-       });
-});
-
-QUnit.asyncTest( 'mw.loader.bug30825', 2, function ( assert ) {
+QUnit.asyncTest( 'mw.loader( "//protocol-relative" ) (bug 30825)', 2, function ( assert ) {
        // This bug was actually already fixed in 1.18 and later when discovered in 1.17.
        // Test is for regressions!
 
@@ -476,3 +655,5 @@ QUnit.test( 'mw.html', 13, function ( assert ) {
                'html.element DIV (attribs + content)' );
 
 });
+
+}( mediaWiki, jQuery ) );
index 16c97df..a9bbbf7 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function ( mw, $ ) {
 
 QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment() );
 
@@ -47,10 +47,9 @@ QUnit.asyncTest( 'getGroups', 3, function ( assert ) {
 
 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 ) );
+}( mediaWiki, jQuery ) );
index ababa8d..c4212df 100644 (file)
-QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment() );
-
-QUnit.test( 'rawurlencode', 1, function ( assert ) {
-       assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
-});
-
-QUnit.test( 'wikiUrlencode', 1, function ( assert ) {
-       assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
-});
-
-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' );
-       assert.equal( hrefA, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
-
-       var hrefB = mw.util.wikiGetlink( 'Foo:Sandbox ? 5+5=10 ! (test)/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();
-       assert.equal( hrefC, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
-});
-
-QUnit.test( 'wikiScript', 4, function ( assert ) {
-       mw.config.set({
-               'wgScript': '/w/i.php', // customized wgScript for bug 39103
-               'wgLoadScript': '/w/l.php', // customized wgLoadScript for bug 39103
-               'wgScriptPath': '/w',
-               'wgScriptExtension': '.php'
+( function ( mw, $ ) {
+       QUnit.module( 'mediawiki.util', QUnit.newMwEnvironment() );
+
+       QUnit.test( 'rawurlencode', 1, function ( assert ) {
+               assert.equal( mw.util.rawurlencode( 'Test:A & B/Here' ), 'Test%3AA%20%26%20B%2FHere' );
+       });
+
+       QUnit.test( 'wikiUrlencode', 1, function ( assert ) {
+               assert.equal( mw.util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
        });
 
-       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' );
-});
-
-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; }' );
-       assert.equal( typeof style, 'object', 'addCSS returned an object' );
-       assert.strictEqual( style.disabled, false, 'property "disabled" is available and set to false' );
-
-       assert.equal( $testEl.css( 'visibility' ), 'hidden', 'Added style properties are in effect' );
-
-       // Clean up
-       $( style.ownerNode ).remove();
-});
-
-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>' +
-               '<div id="toctitle">' +
-                       '<h2>Contents</h2>' +
-                       '<span class="toctoggle">&nbsp;[<a href="#" class="internal" id="togglelink">Hide</a>&nbsp;]</span>' +
-               '</div>' +
-               '<ul><li></li></ul>' +
-       '</td></tr></table>',
-               $toc = $(tocHtml).appendTo( '#qunit-fixture' ),
+       QUnit.test( 'wikiGetlink', 3, function ( assert ) {
+               // Not part of startUp module
+               mw.config.set( 'wgArticlePath', '/wiki/$1' );
+               mw.config.set( 'wgPageName', 'Foobar' );
+
+               var href = mw.util.wikiGetlink( 'Sandbox' );
+               assert.equal( href, '/wiki/Sandbox', 'Simple title; Get link for "Sandbox"' );
+
+               href = mw.util.wikiGetlink( 'Foo:Sandbox ? 5+5=10 ! (test)/subpage' );
+               assert.equal( href, '/wiki/Foo:Sandbox_%3F_5%2B5%3D10_%21_%28test%29/subpage',
+                       'Advanced title; Get link for "Foo:Sandbox ? 5+5=10 ! (test)/subpage"' );
+
+               href = mw.util.wikiGetlink();
+               assert.equal( href, '/wiki/Foobar', 'Default title; Get link for current page ("Foobar")' );
+       });
+
+       QUnit.test( 'wikiScript', 4, function ( assert ) {
+               mw.config.set({
+                       'wgScript': '/w/i.php', // customized wgScript for bug 39103
+                       'wgLoadScript': '/w/l.php', // customized wgLoadScript for bug 39103
+                       'wgScriptPath': '/w',
+                       'wgScriptExtension': '.php'
+               });
+
+               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' );
+       });
+
+       QUnit.test( 'addCSS', 3, function ( assert ) {
+               var $el, style;
+               $el = $( '<div>' ).attr( 'id', 'mw-addcsstest' ).appendTo( '#qunit-fixture' );
+
+               style = mw.util.addCSS( '#mw-addcsstest { visibility: hidden; }' );
+               assert.equal( typeof style, 'object', 'addCSS returned an object' );
+               assert.strictEqual( style.disabled, false, 'property "disabled" is available and set to false' );
+
+               assert.equal( $el.css( 'visibility' ), 'hidden', 'Added style properties are in effect' );
+
+               // Clean up
+               $( style.ownerNode ).remove();
+       });
+
+       QUnit.asyncTest( 'toggleToc', 4, function ( assert ) {
+               var tocHtml, $toggleLink;
+
+               function actionC() {
+                       QUnit.start();
+               }
+
+               function actionB() {
+                       assert.strictEqual( mw.util.toggleToc( $toggleLink, actionC ), true, 'Return boolean true if the TOC is now visible.' );
+               }
+
+               function actionA() {
+                       assert.strictEqual( mw.util.toggleToc( $toggleLink, actionB ), false, 'Return boolean false if the TOC is now hidden.' );
+               }
+
+               assert.strictEqual( mw.util.toggleToc(), null, 'Return null if there is no table of contents on the page.' );
+
+               tocHtml =
+                       '<table id="toc" class="toc"><tr><td>' +
+                               '<div id="toctitle">' +
+                                       '<h2>Contents</h2>' +
+                                       '<span class="toctoggle">&nbsp;[<a href="#" class="internal" id="togglelink">Hide</a>&nbsp;]</span>' +
+                               '</div>' +
+                               '<ul><li></li></ul>' +
+                       '</td></tr></table>';
+               $(tocHtml).appendTo( '#qunit-fixture' ),
                $toggleLink = $( '#togglelink' );
 
-       assert.strictEqual( $toggleLink.length, 1, 'Toggle link is appended to the page.' );
-
-       var actionC = function() {
-               QUnit.start();
-       };
-       var actionB = function() {
-               assert.strictEqual( mw.util.toggleToc( $toggleLink, actionC ), true, 'Return boolean true if the TOC is now visible.' );
-       };
-       var actionA = function() {
-               assert.strictEqual( mw.util.toggleToc( $toggleLink, actionB ), false, 'Return boolean false if the TOC is now hidden.' );
-       };
-
-       actionA();
-});
-
-QUnit.test( 'getParamValue', 5, function ( assert ) {
-       var     url1 = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
-
-       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';
-       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' });
-       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 :)
-       assert.strictEqual( mw.util.getParamValue( 'TEST', url4 ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
-});
-
-QUnit.test( 'tooltipAccessKey', 3, function ( assert ) {
-       assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'mw.util.tooltipAccessKeyPrefix must be a string' );
-       assert.ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
-       assert.ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' );
-});
-
-QUnit.test( '$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' );
-});
-
-
-/**
- * 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.
- */
-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, pCustom, vectorTabs );
-
-       tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
-               'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l' );
-
-       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 );
-
-
-       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' );
-
-       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' );
-
-       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.' );
-});
-
-QUnit.test( 'jsMessage', 1, function ( assert ) {
-       var a = mw.util.jsMessage( "MediaWiki is <b>Awesome</b>." );
-       assert.ok( a, 'Basic checking of return value' );
-
-       // Clean up
-       $( '#mw-js-message' ).remove();
-});
-
-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
-       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
-       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' );
-});
-
-QUnit.test( 'isIPv6Address', 40, function ( assert ) {
-       // Shortcuts
-       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 ":"' );
-       assertFalseIPv6( 'fc:100:::', 'IPv6 ending with a ":::"' );
-       assertFalseIPv6( 'fc:300', 'IPv6 with only 2 words' );
-       assertFalseIPv6( 'fc:100:300', 'IPv6 with only 3 words' );
-
-       $.each(
-       ['fc:100::',
-       'fc:100:a::',
-       '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 ){
-               assertTrueIPv6( addy, addy + ' is a valid IP' );
+               assert.strictEqual( $toggleLink.length, 1, 'Toggle link is appended to the page.' );
+
+               actionA();
        });
 
-       assertFalseIPv6( 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"' );
-       assertFalseIPv6( 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"' );
-
-       assertFalseIPv6( ':::' );
-       assertFalseIPv6( '::0:', 'IPv6 ending in a lone ":"' );
-
-       assertTrueIPv6( '::', 'IPv6 zero address' );
-       $.each(
-       ['::0',
-       '::fc',
-       '::fc:100',
-       '::fc:100:a',
-       '::fc:100:a:d',
-       '::fc:100:a:d:1',
-       '::fc:100:a:d:1:e',
-       '::fc:100:a:d:1:e:ac',
-
-       'fc:100:a:d:1:e:ac:0'], function ( i, addy ){
-               assertTrueIPv6( addy, addy + ' is a valid IP' );
+       QUnit.test( 'getParamValue', 5, function ( assert ) {
+               var     url;
+
+               url = 'http://example.org/?foo=wrong&foo=right#&foo=bad';
+               assert.equal( mw.util.getParamValue( 'foo', url ), 'right', 'Use latest one, ignore hash' );
+               assert.strictEqual( mw.util.getParamValue( 'bar', url ), null, 'Return null when not found' );
+
+               url = 'http://example.org/#&foo=bad';
+               assert.strictEqual( mw.util.getParamValue( 'foo', url ), null, 'Ignore hash if param is not in querystring but in hash (bug 27427)' );
+
+               url = 'example.org?' + $.param({ 'TEST': 'a b+c' });
+               assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c', 'Bug 30441: getParamValue must understand "+" encoding of space' );
+
+               url = 'example.org?' + $.param({ 'TEST': 'a b+c d' }); // check for sloppy code from r95332 :)
+               assert.strictEqual( mw.util.getParamValue( 'TEST', url ), 'a b+c d', 'Bug 30441: getParamValue must understand "+" encoding of space (multiple spaces)' );
+       });
+
+       QUnit.test( 'tooltipAccessKey', 3, function ( assert ) {
+               assert.equal( typeof mw.util.tooltipAccessKeyPrefix, 'string', 'mw.util.tooltipAccessKeyPrefix must be a string' );
+               assert.ok( mw.util.tooltipAccessKeyRegexp instanceof RegExp, 'mw.util.tooltipAccessKeyRegexp instance of RegExp' );
+               assert.ok( mw.util.updateTooltipAccessKeys, 'mw.util.updateTooltipAccessKeys' );
+       });
+
+       QUnit.test( '$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' );
+       });
+
+
+       /**
+        * 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.
+        */
+       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, pCustom, vectorTabs );
+
+               tbRL = mw.util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
+                       'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l' );
+
+               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 );
+
+
+               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' );
+
+               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' );
+
+               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.' );
        });
 
-       assertFalseIPv6( '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' );
-       assertFalseIPv6( '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
-
-       assertFalseIPv6( ':fc::100', 'IPv6 starting with lone ":"' );
-       assertFalseIPv6( 'fc::100:', 'IPv6 ending with lone ":"' );
-       assertFalseIPv6( 'fc:::100', 'IPv6 with ":::" in the middle' );
-
-       assertTrueIPv6( 'fc::100', 'IPv6 with "::" and 2 words' );
-       assertTrueIPv6( 'fc::100:a', 'IPv6 with "::" and 3 words' );
-       assertTrueIPv6( 'fc::100:a:d', 'IPv6 with "::" and 4 words' );
-       assertTrueIPv6( 'fc::100:a:d:1', 'IPv6 with "::" and 5 words' );
-       assertTrueIPv6( 'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' );
-       assertTrueIPv6( 'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' );
-       assertTrueIPv6( '2001::df', 'IPv6 with "::" and 2 words' );
-       assertTrueIPv6( '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' );
-       assertTrueIPv6( '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' );
-
-       assertFalseIPv6( 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' );
-       assertFalseIPv6( 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
-});
-
-QUnit.test( 'isIPv4Address', 11, function ( assert ) {
-       // Shortcuts
-       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' );
-       assertFalseIPv4( true, 'Boolean true is not an IP' );
-       assertFalseIPv4( '', 'Empty string is not an IP' );
-       assertFalseIPv4( 'abc', '"abc" is not an IP' );
-       assertFalseIPv4( ':', 'Colon is not an IP' );
-       assertFalseIPv4( '124.24.52', 'IPv4 not enough quads' );
-       assertFalseIPv4( '24.324.52.13', 'IPv4 out of range' );
-       assertFalseIPv4( '.24.52.13', 'IPv4 starts with period' );
-
-       assertTrueIPv4( '124.24.52.13', '124.24.52.134 is a valid IP' );
-       assertTrueIPv4( '1.24.52.13', '1.24.52.13 is a valid IP' );
-       assertFalseIPv4( '74.24.52.13/20', 'IPv4 ranges are not recogzized as valid IPs' );
-});
+       QUnit.test( 'jsMessage', 1, function ( assert ) {
+               var a = mw.util.jsMessage( 'MediaWiki is <b>Awesome</b>.' );
+               assert.ok( a, 'Basic checking of return value' );
+
+               // Clean up
+               $( '#mw-js-message' ).remove();
+       });
+
+       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
+               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
+               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' );
+       });
+
+       QUnit.test( 'isIPv6Address', 40, function ( assert ) {
+               // Shortcuts
+               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 ":"' );
+               assertFalseIPv6( 'fc:100:::', 'IPv6 ending with a ":::"' );
+               assertFalseIPv6( 'fc:300', 'IPv6 with only 2 words' );
+               assertFalseIPv6( 'fc:100:300', 'IPv6 with only 3 words' );
+
+               $.each(
+               ['fc:100::',
+               'fc:100:a::',
+               '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 ){
+                       assertTrueIPv6( addy, addy + ' is a valid IP' );
+               });
+
+               assertFalseIPv6( 'fc:100:a:d:1:e:ac:0::', 'IPv6 with 8 words ending with "::"' );
+               assertFalseIPv6( 'fc:100:a:d:1:e:ac:0:1::', 'IPv6 with 9 words ending with "::"' );
+
+               assertFalseIPv6( ':::' );
+               assertFalseIPv6( '::0:', 'IPv6 ending in a lone ":"' );
+
+               assertTrueIPv6( '::', 'IPv6 zero address' );
+               $.each(
+               ['::0',
+               '::fc',
+               '::fc:100',
+               '::fc:100:a',
+               '::fc:100:a:d',
+               '::fc:100:a:d:1',
+               '::fc:100:a:d:1:e',
+               '::fc:100:a:d:1:e:ac',
+
+               'fc:100:a:d:1:e:ac:0'], function ( i, addy ){
+                       assertTrueIPv6( addy, addy + ' is a valid IP' );
+               });
+
+               assertFalseIPv6( '::fc:100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' );
+               assertFalseIPv6( '::fc:100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
+
+               assertFalseIPv6( ':fc::100', 'IPv6 starting with lone ":"' );
+               assertFalseIPv6( 'fc::100:', 'IPv6 ending with lone ":"' );
+               assertFalseIPv6( 'fc:::100', 'IPv6 with ":::" in the middle' );
+
+               assertTrueIPv6( 'fc::100', 'IPv6 with "::" and 2 words' );
+               assertTrueIPv6( 'fc::100:a', 'IPv6 with "::" and 3 words' );
+               assertTrueIPv6( 'fc::100:a:d', 'IPv6 with "::" and 4 words' );
+               assertTrueIPv6( 'fc::100:a:d:1', 'IPv6 with "::" and 5 words' );
+               assertTrueIPv6( 'fc::100:a:d:1:e', 'IPv6 with "::" and 6 words' );
+               assertTrueIPv6( 'fc::100:a:d:1:e:ac', 'IPv6 with "::" and 7 words' );
+               assertTrueIPv6( '2001::df', 'IPv6 with "::" and 2 words' );
+               assertTrueIPv6( '2001:5c0:1400:a::df', 'IPv6 with "::" and 5 words' );
+               assertTrueIPv6( '2001:5c0:1400:a::df:2', 'IPv6 with "::" and 6 words' );
+
+               assertFalseIPv6( 'fc::100:a:d:1:e:ac:0', 'IPv6 with "::" and 8 words' );
+               assertFalseIPv6( 'fc::100:a:d:1:e:ac:0:1', 'IPv6 with 9 words' );
+       });
+
+       QUnit.test( 'isIPv4Address', 11, function ( assert ) {
+               // Shortcuts
+               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' );
+               assertFalseIPv4( true, 'Boolean true is not an IP' );
+               assertFalseIPv4( '', 'Empty string is not an IP' );
+               assertFalseIPv4( 'abc', '"abc" is not an IP' );
+               assertFalseIPv4( ':', 'Colon is not an IP' );
+               assertFalseIPv4( '124.24.52', 'IPv4 not enough quads' );
+               assertFalseIPv4( '24.324.52.13', 'IPv4 out of range' );
+               assertFalseIPv4( '.24.52.13', 'IPv4 starts with period' );
+
+               assertTrueIPv4( '124.24.52.13', '124.24.52.134 is a valid IP' );
+               assertTrueIPv4( '1.24.52.13', '1.24.52.13 is a valid IP' );
+               assertFalseIPv4( '74.24.52.13/20', 'IPv4 ranges are not recogzized as valid IPs' );
+       });
+}( mediaWiki, jQuery ) );
index 39e18c9..f1eb833 100644 (file)
@@ -1,4 +1,25 @@
 <?php
+/**
+ * Recording for passing/failing tests.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * 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 Testing
+ */
 
 class TestRecorder {
        var $parent;
@@ -254,7 +275,7 @@ class DbTestRecorder extends DbTestPreviewer  {
         * and all that fun stuff
         */
        function start() {
-               $this->db->begin();
+               $this->db->begin( __METHOD__ );
 
                if ( ! $this->db->tableExists( 'testrun' )
                        || ! $this->db->tableExists( 'testitem' ) )
@@ -483,7 +504,7 @@ class TestFileIterator implements Iterator {
        private function clearSection() {
                $this->sectionData = array();
                $this->section = null;
-               
+
        }
 
        /**
@@ -492,7 +513,7 @@ class TestFileIterator implements Iterator {
         * Throw an exception if it is not set, referencing current section
         * and adding the current file name and line number
         *
-        * @param $token String: expected token that should have been mentionned before closing this section 
+        * @param $token String: expected token that should have been mentionned before closing this section
         */
        private function checkSection( $token ) {
                if( is_null( $this->section ) ) {
@@ -536,7 +557,7 @@ class DelayedParserTest {
 
        /**
         * Called whenever we actually want to run the hook.
-        * Should be the case if we found the parserTest is not disabled 
+        * Should be the case if we found the parserTest is not disabled
         */
        public function unleash( &$parserTest ) {
                if( !($parserTest instanceof ParserTest || $parserTest instanceof NewParserTest
index 068ec01..f59ee0f 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -35,9 +35,10 @@ if ( defined( 'THUMB_HANDLER' ) ) {
        // Called from thumb_handler.php via 404; extract params from the URI...
        wfThumbHandle404();
 } else {
-       // Called directly, use $_REQUEST params
+       // Called directly, use $_GET params
        wfThumbHandleRequest();
 }
+
 wfLogProfilingData();
 
 //--------------------------------------------------------------------------
@@ -49,8 +50,8 @@ wfLogProfilingData();
  */
 function wfThumbHandleRequest() {
        $params = get_magic_quotes_gpc()
-               ? array_map( 'stripslashes', $_REQUEST )
-               : $_REQUEST;
+               ? array_map( 'stripslashes', $_GET )
+               : $_GET;
 
        wfStreamThumb( $params ); // stream the thumbnail
 }
@@ -61,28 +62,21 @@ function wfThumbHandleRequest() {
  * @return void
  */
 function wfThumbHandle404() {
-       # lighttpd puts the original request in REQUEST_URI, while sjs sets
-       # 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
-               $uriPath = str_replace( "%2F", "/", urlencode( $_SERVER['REDIRECT_URL'] ) );
-       } else {
-               $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;
-               }
+       global $wgArticlePath;
+
+       # Set action base paths so that WebRequest::getPathInfo()
+       # recognizes the "X" as the 'title' in ../thumb_handler.php/X urls.
+       $wgArticlePath = false; # Don't let a "/*" article path clober our action path
+
+       $matches = WebRequest::getPathInfo();
+       if ( !isset( $matches['title'] ) ) {
+               wfThumbError( 404, 'Could not determine the name of the requested thumbnail.' );
+               return;
        }
 
-       $params = wfExtractThumbParams( $uriPath ); // basic wiki URL param extracting
+       $params = wfExtractThumbParams( $matches['title'] ); // basic wiki URL param extracting
        if ( $params == null ) {
-               wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+               wfThumbError( 400, 'The specified thumbnail parameters are not recognized.' );
                return;
        }
 
@@ -97,6 +91,7 @@ function wfThumbHandle404() {
  */
 function wfStreamThumb( array $params ) {
        global $wgVaryOnXFP;
+
        wfProfileIn( __METHOD__ );
 
        $headers = array(); // HTTP headers to send
@@ -153,6 +148,13 @@ function wfStreamThumb( array $params ) {
                $img = wfLocalFile( $fileName );
        }
 
+       // Check the source file title
+       if ( !$img ) {
+               wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
+               wfProfileOut( __METHOD__ );
+               return;
+       }
+
        // Check permissions if there are read restrictions
        $varyHeader = array();
        if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
@@ -167,18 +169,11 @@ function wfStreamThumb( array $params ) {
        }
 
        // Check the source file storage path
-       if ( !$img ) {
-               wfThumbError( 404, wfMessage( 'badtitletext' )->text() );
-               wfProfileOut( __METHOD__ );
-               return;
-       }
        if ( !$img->exists() ) {
                wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
                wfProfileOut( __METHOD__ );
                return;
-       }
-       $sourcePath = $img->getPath();
-       if ( $sourcePath === false ) {
+       } elseif ( $img->getPath() === false ) {
                wfThumbError( 500, 'The source file is not locally accessible.' );
                wfProfileOut( __METHOD__ );
                return;
@@ -193,74 +188,75 @@ function wfStreamThumb( array $params ) {
                wfSuppressWarnings();
                $imsUnix = strtotime( $imsString );
                wfRestoreWarnings();
-               $sourceTsUnix = wfTimestamp( TS_UNIX, $img->getTimestamp() );
-               if ( $sourceTsUnix <= $imsUnix ) {
+               if ( wfTimestamp( TS_UNIX, $img->getTimestamp() ) <= $imsUnix ) {
                        header( 'HTTP/1.1 304 Not Modified' );
                        wfProfileOut( __METHOD__ );
                        return;
                }
        }
 
-       $thumbName = $img->thumbName( $params );
-       if ( !strlen( $thumbName ) ) { // invalid params?
-               wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+       // Get the normalized thumbnail name from the parameters...
+       try {
+               $thumbName = $img->thumbName( $params );
+               if ( !strlen( $thumbName ) ) { // invalid params?
+                       wfThumbError( 400, 'The specified thumbnail parameters are not valid.' );
+                       wfProfileOut( __METHOD__ );
+                       return;
+               }
+               $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
+       } catch ( MWException $e ) {
+               wfThumbError( 500, $e->getHTML() );
                wfProfileOut( __METHOD__ );
                return;
        }
 
-       $disposition = $img->getThumbDisposition( $thumbName );
-       $headers[] = "Content-Disposition: $disposition";
-
-       // Stream the file if it exists already...
-       try {
-               $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
-               // For 404 handled thumbnails, we only use the the base name of the URI
-               // for the thumb params and the parent directory for the source file name.
-               // Check that the zone relative path matches up so squid caches won't pick
-               // up thumbs that would not be purged on source file deletion (bug 34231).
-               if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
-                       if ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
-                               // Request for the canonical thumbnail name
-                       } elseif ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
-                               // Request for the "long" thumbnail name; redirect to canonical name
-                               $response = RequestContext::getMain()->getRequest()->response();
-                               $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
-                               $response->header( 'Location: ' . wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
-                               $response->header( 'Expires: ' .
-                                       gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
-                               if ( $wgVaryOnXFP ) {
-                                       $varyHeader[] = 'X-Forwarded-Proto';
-                               }
-                               if ( count( $varyHeader ) ) {
-                                       $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
-                               }
-                               wfProfileOut( __METHOD__ );
-                               return;
-                       } else {
-                               wfThumbError( 404, 'The given path of the specified thumbnail is incorrect.' );
-                               wfProfileOut( __METHOD__ );
-                               return;
+       // For 404 handled thumbnails, we only use the the base name of the URI
+       // for the thumb params and the parent directory for the source file name.
+       // Check that the zone relative path matches up so squid caches won't pick
+       // up thumbs that would not be purged on source file deletion (bug 34231).
+       if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
+               if ( rawurldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
+                       // Request for the canonical thumbnail name
+               } elseif ( rawurldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
+                       // Request for the "long" thumbnail name; redirect to canonical name
+                       $response = RequestContext::getMain()->getRequest()->response();
+                       $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
+                       $response->header( 'Location: ' .
+                               wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
+                       $response->header( 'Expires: ' .
+                               gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
+                       if ( $wgVaryOnXFP ) {
+                               $varyHeader[] = 'X-Forwarded-Proto';
                        }
-               }
-               $thumbPath = $img->getThumbPath( $thumbName );
-               if ( $img->getRepo()->fileExists( $thumbPath ) ) {
                        if ( count( $varyHeader ) ) {
-                               $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
+                               $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
                        }
-                       $img->getRepo()->streamFile( $thumbPath, $headers );
+                       wfProfileOut( __METHOD__ );
+                       return;
+               } else {
+                       wfThumbError( 404, "The given path of the specified thumbnail is incorrect;
+                               expected '" . $img->getThumbRel( $thumbName ) . "' but got '" .
+                               rawurldecode( $params['rel404'] ) . "'." );
                        wfProfileOut( __METHOD__ );
                        return;
                }
-       } catch ( MWException $e ) {
-               wfThumbError( 500, $e->getHTML() );
-               wfProfileOut( __METHOD__ );
-               return;
        }
 
+       // Suggest a good name for users downloading this thumbnail
+       $headers[] = "Content-Disposition: {$img->getThumbDisposition( $thumbName )}";
+
        if ( count( $varyHeader ) ) {
                $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
        }
 
+       // Stream the file if it exists already...
+       $thumbPath = $img->getThumbPath( $thumbName );
+       if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+               $img->getRepo()->streamFile( $thumbPath, $headers );
+               wfProfileOut( __METHOD__ );
+               return;
+       }
+
        // Thumbnail isn't already there, so create the new thumbnail...
        try {
                $thumb = $img->transform( $params, File::RENDER_NOW );
@@ -297,43 +293,28 @@ 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 $uriPath String Thumbnail request URI path
+ * @param $thumbRel String Thumbnail path relative to the thumb zone
  * @return Array|null associative params array or null
  */
-function wfExtractThumbParams( $uriPath ) {
+function wfExtractThumbParams( $thumbRel ) {
        $repo = RepoGroup::singleton()->getLocalRepo();
 
-       // Zone URL might be relative ("/images") or protocol-relative ("//lang.site/image")
-       $zoneUriPath = $repo->getZoneHandlerUrl( 'thumb' )
-               ? $repo->getZoneHandlerUrl( 'thumb' ) // custom URL
-               : $repo->getZoneUrl( 'thumb' ); // default to main URL
-       $bits = wfParseUrl( wfExpandUrl( $zoneUriPath, PROTO_INTERNAL ) );
-       if ( $bits && isset( $bits['path'] ) ) {
-               $zoneUriPath = $bits['path'];
-       } else {
-               return null; // not a valid thumbnail URL
-       }
-
        $hashDirReg = $subdirReg = '';
        for ( $i = 0; $i < $repo->getHashLevels(); $i++ ) {
                $subdirReg .= '[0-9a-f]';
                $hashDirReg .= "$subdirReg/";
        }
-       $zoneReg = preg_quote( $zoneUriPath ); // regex for thumb zone URI
 
        // Check if this is a thumbnail of an original in the local file repo
-       if ( preg_match( "!^$zoneReg/((archive/)?$hashDirReg([^/]*)/([^/]*))$!", $uriPath, $m ) ) {
+       if ( preg_match( "!^((archive/)?$hashDirReg([^/]*)/([^/]*))$!", $thumbRel, $m ) ) {
                list( /*all*/, $rel, $archOrTemp, $filename, $thumbname ) = $m;
        // Check if this is a thumbnail of an temp file in the local file repo
-       } elseif ( preg_match( "!^$zoneReg/(temp/)($hashDirReg([^/]*)/([^/]*))$!", $uriPath, $m ) ) {
+       } elseif ( preg_match( "!^(temp/)($hashDirReg([^/]*)/([^/]*))$!", $thumbRel, $m ) ) {
                list( /*all*/, $archOrTemp, $rel, $filename, $thumbname ) = $m;
        } else {
                return null; // not a valid looking thumbnail request
        }
 
-       $filename = urldecode( $filename );
-       $thumbname = urldecode( $thumbname );
-
        $params = array( 'f' => $filename, 'rel404' => $rel );
        if ( $archOrTemp === 'archive/' ) {
                $params['archived'] = 1;
@@ -341,17 +322,18 @@ function wfExtractThumbParams( $uriPath ) {
                $params['temp'] = 1;
        }
 
+       // Check hooks if parameters can be extracted
+       // Hooks return false if they manage to *resolve* the parameters
+       if ( !wfRunHooks( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
+               return $params; // valid thumbnail URL (via extension or config)
        // Check if the parameters can be extracted from the thumbnail name...
-       if ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
+       } elseif ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) {
                list( /* all */, $pagefull, $pagenum, $size ) = $matches;
                $params['width'] = $size;
                if ( $pagenum ) {
                        $params['page'] = $pagenum;
                }
                return $params; // valid thumbnail URL
-       // Hooks return false if they manage to *resolve* the parameters
-       } elseif ( !wfRunHooks( 'ExtractThumbParameters', array( $thumbname, &$params ) ) ) {
-               return $params; // valid thumbnail URL (via extension or config)
        }
 
        return null; // not a valid thumbnail URL
index 0c9b702..db388d2 100644 (file)
@@ -22,4 +22,4 @@
  * @ingroup Media
  */
 
-require './thumb.php'; 
+require './thumb.php';